|
|
@ -26,149 +26,149 @@ namespace KaleidoscopePlugins {
|
|
|
|
uint16_t LEDPaletteTheme::paletteBase;
|
|
|
|
uint16_t LEDPaletteTheme::paletteBase;
|
|
|
|
uint8_t LEDPaletteTheme::transparentIndex = 15;
|
|
|
|
uint8_t LEDPaletteTheme::transparentIndex = 15;
|
|
|
|
|
|
|
|
|
|
|
|
LEDPaletteTheme::LEDPaletteTheme (void) {
|
|
|
|
LEDPaletteTheme::LEDPaletteTheme(void) {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
void
|
|
|
|
LEDPaletteTheme::begin (void) {
|
|
|
|
LEDPaletteTheme::begin(void) {
|
|
|
|
USE_PLUGINS (&::EEPROMSettings);
|
|
|
|
USE_PLUGINS(&::EEPROMSettings);
|
|
|
|
|
|
|
|
|
|
|
|
if (!paletteBase)
|
|
|
|
if (!paletteBase)
|
|
|
|
paletteBase = ::EEPROMSettings.requestSlice (16 * sizeof (cRGB));
|
|
|
|
paletteBase = ::EEPROMSettings.requestSlice(16 * sizeof(cRGB));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
uint16_t
|
|
|
|
uint16_t
|
|
|
|
LEDPaletteTheme::reserveThemes (uint8_t maxThemes) {
|
|
|
|
LEDPaletteTheme::reserveThemes(uint8_t maxThemes) {
|
|
|
|
return ::EEPROMSettings.requestSlice (maxThemes * ROWS * COLS / 2);
|
|
|
|
return ::EEPROMSettings.requestSlice(maxThemes * ROWS * COLS / 2);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
void
|
|
|
|
LEDPaletteTheme::update (uint16_t themeBase, uint8_t theme) {
|
|
|
|
LEDPaletteTheme::update(uint16_t themeBase, uint8_t theme) {
|
|
|
|
uint16_t mapBase = themeBase + (theme * ROWS * COLS / 2);
|
|
|
|
uint16_t mapBase = themeBase + (theme * ROWS * COLS / 2);
|
|
|
|
for (uint16_t loc = 0; loc < ROWS * COLS; loc++) {
|
|
|
|
for (uint16_t loc = 0; loc < ROWS * COLS; loc++) {
|
|
|
|
cRGB color;
|
|
|
|
cRGB color;
|
|
|
|
|
|
|
|
|
|
|
|
if (!lookupColor (mapBase, loc, &color))
|
|
|
|
if (!lookupColor(mapBase, loc, &color))
|
|
|
|
continue;
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
|
|
LEDControl.led_set_crgb_at (loc, color);
|
|
|
|
LEDControl.led_set_crgb_at(loc, color);
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const uint8_t
|
|
|
|
const uint8_t
|
|
|
|
LEDPaletteTheme::lookupColorIndex (uint16_t mapBase, uint16_t loc) {
|
|
|
|
LEDPaletteTheme::lookupColorIndex(uint16_t mapBase, uint16_t loc) {
|
|
|
|
uint8_t colorIndex;
|
|
|
|
uint8_t colorIndex;
|
|
|
|
|
|
|
|
|
|
|
|
colorIndex = EEPROM.read (mapBase + loc / 2);
|
|
|
|
colorIndex = EEPROM.read(mapBase + loc / 2);
|
|
|
|
if (loc % 2)
|
|
|
|
if (loc % 2)
|
|
|
|
colorIndex &= ~0xf0;
|
|
|
|
colorIndex &= ~0xf0;
|
|
|
|
else
|
|
|
|
else
|
|
|
|
colorIndex >>= 4;
|
|
|
|
colorIndex >>= 4;
|
|
|
|
|
|
|
|
|
|
|
|
return colorIndex;
|
|
|
|
return colorIndex;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const bool
|
|
|
|
const bool
|
|
|
|
LEDPaletteTheme::lookupColor (uint16_t mapBase, uint16_t loc, cRGB *color) {
|
|
|
|
LEDPaletteTheme::lookupColor(uint16_t mapBase, uint16_t loc, cRGB *color) {
|
|
|
|
uint8_t colorIndex = lookupColorIndex (mapBase, loc);
|
|
|
|
uint8_t colorIndex = lookupColorIndex(mapBase, loc);
|
|
|
|
|
|
|
|
|
|
|
|
if (colorIndex == transparentIndex)
|
|
|
|
if (colorIndex == transparentIndex)
|
|
|
|
return false;
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
|
|
EEPROM.get (paletteBase + colorIndex * sizeof (cRGB), *color);
|
|
|
|
EEPROM.get(paletteBase + colorIndex * sizeof(cRGB), *color);
|
|
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const cRGB
|
|
|
|
const cRGB
|
|
|
|
LEDPaletteTheme::lookupColor (uint8_t index) {
|
|
|
|
LEDPaletteTheme::lookupColor(uint8_t index) {
|
|
|
|
cRGB color;
|
|
|
|
cRGB color;
|
|
|
|
|
|
|
|
|
|
|
|
EEPROM.get (paletteBase + index * sizeof (cRGB), color);
|
|
|
|
EEPROM.get(paletteBase + index * sizeof(cRGB), color);
|
|
|
|
return color;
|
|
|
|
return color;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
void
|
|
|
|
LEDPaletteTheme::updateColor (uint16_t mapBase, uint16_t loc, uint8_t index) {
|
|
|
|
LEDPaletteTheme::updateColor(uint16_t mapBase, uint16_t loc, uint8_t index) {
|
|
|
|
uint8_t indexes;
|
|
|
|
uint8_t indexes;
|
|
|
|
|
|
|
|
|
|
|
|
indexes = EEPROM.read (mapBase + loc / 2);
|
|
|
|
indexes = EEPROM.read(mapBase + loc / 2);
|
|
|
|
if (loc % 2) {
|
|
|
|
if (loc % 2) {
|
|
|
|
uint8_t other = indexes >> 4;
|
|
|
|
uint8_t other = indexes >> 4;
|
|
|
|
indexes = (other << 4) + index;
|
|
|
|
indexes = (other << 4) + index;
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
uint8_t other = indexes & ~0xf0;
|
|
|
|
uint8_t other = indexes & ~0xf0;
|
|
|
|
indexes = (index << 4) + other;
|
|
|
|
indexes = (index << 4) + other;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
EEPROM.update (mapBase + loc / 2, indexes);
|
|
|
|
EEPROM.update(mapBase + loc / 2, indexes);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool
|
|
|
|
bool
|
|
|
|
LEDPaletteTheme::paletteFocusHook (const char *command) {
|
|
|
|
LEDPaletteTheme::paletteFocusHook(const char *command) {
|
|
|
|
if (strcmp_P (command, PSTR ("palette")) != 0)
|
|
|
|
if (strcmp_P(command, PSTR("palette")) != 0)
|
|
|
|
return false;
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
|
|
if (Serial.peek () == '\n') {
|
|
|
|
if (Serial.peek() == '\n') {
|
|
|
|
for (uint8_t i = 0; i < 16; i++) {
|
|
|
|
for (uint8_t i = 0; i < 16; i++) {
|
|
|
|
cRGB color;
|
|
|
|
cRGB color;
|
|
|
|
|
|
|
|
|
|
|
|
EEPROM.get (paletteBase + i * sizeof (color), color);
|
|
|
|
EEPROM.get(paletteBase + i * sizeof(color), color);
|
|
|
|
::Focus.printColor (color.r, color.g, color.b);
|
|
|
|
::Focus.printColor(color.r, color.g, color.b);
|
|
|
|
::Focus.printSpace ();
|
|
|
|
::Focus.printSpace();
|
|
|
|
}
|
|
|
|
|
|
|
|
Serial.println ();
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
Serial.println();
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
uint8_t i = 0;
|
|
|
|
uint8_t i = 0;
|
|
|
|
while (i < 16 && Serial.peek() != '\n') {
|
|
|
|
while (i < 16 && Serial.peek() != '\n') {
|
|
|
|
cRGB color;
|
|
|
|
cRGB color;
|
|
|
|
|
|
|
|
|
|
|
|
color.r = Serial.parseInt ();
|
|
|
|
color.r = Serial.parseInt();
|
|
|
|
color.g = Serial.parseInt ();
|
|
|
|
color.g = Serial.parseInt();
|
|
|
|
color.b = Serial.parseInt ();
|
|
|
|
color.b = Serial.parseInt();
|
|
|
|
|
|
|
|
|
|
|
|
EEPROM.put (paletteBase + i * sizeof (color), color);
|
|
|
|
EEPROM.put(paletteBase + i * sizeof(color), color);
|
|
|
|
i++;
|
|
|
|
i++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool
|
|
|
|
bool
|
|
|
|
LEDPaletteTheme::themeFocusHandler (const char *command, const char *expectedCommand,
|
|
|
|
LEDPaletteTheme::themeFocusHandler(const char *command, const char *expectedCommand,
|
|
|
|
uint16_t themeBase, uint8_t maxThemes) {
|
|
|
|
uint16_t themeBase, uint8_t maxThemes) {
|
|
|
|
if (strcmp_P (command, expectedCommand) != 0)
|
|
|
|
if (strcmp_P(command, expectedCommand) != 0)
|
|
|
|
return false;
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
|
|
uint16_t maxIndex = (maxThemes * ROWS * COLS) / 2;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (Serial.peek () == '\n') {
|
|
|
|
|
|
|
|
for (uint16_t loc = 0; loc < maxIndex; loc++) {
|
|
|
|
|
|
|
|
uint8_t indexes = EEPROM.read (themeBase + loc);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
::Focus.printNumber (indexes >> 4);
|
|
|
|
|
|
|
|
::Focus.printSpace ();
|
|
|
|
|
|
|
|
::Focus.printNumber (indexes & ~0xf0);
|
|
|
|
|
|
|
|
::Focus.printSpace ();
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
Serial.println ();
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
uint16_t loc = 0;
|
|
|
|
uint16_t maxIndex = (maxThemes * ROWS * COLS) / 2;
|
|
|
|
|
|
|
|
|
|
|
|
while ((Serial.peek () != '\n') && (loc < maxIndex)) {
|
|
|
|
if (Serial.peek() == '\n') {
|
|
|
|
uint8_t idx1 = Serial.parseInt ();
|
|
|
|
for (uint16_t loc = 0; loc < maxIndex; loc++) {
|
|
|
|
uint8_t idx2 = Serial.parseInt ();
|
|
|
|
uint8_t indexes = EEPROM.read(themeBase + loc);
|
|
|
|
uint8_t indexes = (idx1 << 4) + idx2;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
EEPROM.update (themeBase + loc, indexes);
|
|
|
|
::Focus.printNumber(indexes >> 4);
|
|
|
|
loc++;
|
|
|
|
::Focus.printSpace();
|
|
|
|
|
|
|
|
::Focus.printNumber(indexes & ~0xf0);
|
|
|
|
|
|
|
|
::Focus.printSpace();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
Serial.println();
|
|
|
|
return true;
|
|
|
|
return true;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
uint16_t loc = 0;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
while ((Serial.peek() != '\n') && (loc < maxIndex)) {
|
|
|
|
|
|
|
|
uint8_t idx1 = Serial.parseInt();
|
|
|
|
|
|
|
|
uint8_t idx2 = Serial.parseInt();
|
|
|
|
|
|
|
|
uint8_t indexes = (idx1 << 4) + idx2;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
EEPROM.update(themeBase + loc, indexes);
|
|
|
|
|
|
|
|
loc++;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
};
|
|
|
|
};
|
|
|
|