Skip to content
Snippets Groups Projects
rgbw-strip-12bit.cpp 1.42 KiB
Newer Older
Andreas Horn's avatar
Andreas Horn committed
#include <rgbw-strip-12bit.h>

RgbwStrip12bit::RgbwStrip12bit(uint16_t num, uint8_t clk, uint8_t data, uint8_t latch) {
	this->num = num;
	this->clk = clk;
	this->dat = data;
	this->lat = latch;

	pwmBuffer = (uint16_t*) malloc(2 * 24 * num);
	memset(pwmBuffer, 0, 2 * 24 * num);
}

void RgbwStrip12bit::write(void) {
	digitalWrite(lat, LOW);
	// 24 channels per TLC5974
	for (int16_t c = 24 * num - 1; c >= 0; c--) {
		// 12 bits per channel, send MSB first
		for (int8_t b = 11; b >= 0; b--) {
			digitalWrite(clk, LOW);

			if (pwmBuffer[c] & (1 << b))
				digitalWrite(dat, HIGH);
			else
				digitalWrite(dat, LOW);

			digitalWrite(clk, HIGH);
		}
	}
	digitalWrite(clk, LOW);

	digitalWrite(lat, HIGH);
	digitalWrite(lat, LOW);
}

void RgbwStrip12bit::setPWM(uint16_t channel, uint16_t pwm) {
	if (pwm > 4095)
		pwm = 4095;
	if (channel > 24 * num)
		return;
	pwmBuffer[channel] = pwm;
}

void RgbwStrip12bit::setLED(uint16_t ledNum, uint16_t r, uint16_t g, uint16_t b, uint16_t w) {
	if (ledNum % 6 == 2 || ledNum % 6 == 3) {
		setPWM(ledNum * 4, r);
		setPWM(ledNum * 4 + 1, g);
		setPWM(ledNum * 4 + 2, b);
		setPWM(ledNum * 4 + 3, w);
	} else {
		setPWM(ledNum * 4, w);
		setPWM(ledNum * 4 + 1, b);
		setPWM(ledNum * 4 + 2, g);
		setPWM(ledNum * 4 + 3, r);
	}
}

boolean RgbwStrip12bit::begin() {
	if (!pwmBuffer)
		return false;

	pinMode(clk, OUTPUT);
	pinMode(dat, OUTPUT);
	pinMode(lat, OUTPUT);
	digitalWrite(lat, LOW);

	return true;
}