From 09ba7dd756d728449ccb90cfd0486e6c5f2b4c29 Mon Sep 17 00:00:00 2001 From: Gergely Nagy Date: Fri, 2 Jun 2017 12:40:36 +0200 Subject: [PATCH] Port over to LED-Palette-Theme Fixes #6. Signed-off-by: Gergely Nagy --- README.md | 19 +--- examples/FingerPainter/FingerPainter.ino | 3 - src/Kaleidoscope/FingerPainter.cpp | 123 ++++++----------------- src/Kaleidoscope/FingerPainter.h | 65 ------------ 4 files changed, 37 insertions(+), 173 deletions(-) diff --git a/README.md b/README.md index c5e2e372..b456ad22 100644 --- a/README.md +++ b/README.md @@ -5,9 +5,9 @@ [travis:image]: https://travis-ci.org/keyboardio/Kaleidoscope-FingerPainter.svg?branch=master [travis:status]: https://travis-ci.org/keyboardio/Kaleidoscope-FingerPainter - [st:stable]: https://img.shields.io/badge/stable-✔-black.png?style=flat&colorA=44cc11&colorB=494e52 - [st:broken]: https://img.shields.io/badge/broken-X-black.png?style=flat&colorA=e05d44&colorB=494e52 - [st:experimental]: https://img.shields.io/badge/experimental----black.png?style=flat&colorA=dfb317&colorB=494e52 + [st:stable]: https://img.shields.io/badge/stable-✔-black.svg?style=flat&colorA=44cc11&colorB=494e52 + [st:broken]: https://img.shields.io/badge/broken-X-black.svg?style=flat&colorA=e05d44&colorB=494e52 + [st:experimental]: https://img.shields.io/badge/experimental----black.svg?style=flat&colorA=dfb317&colorB=494e52 TODO @@ -38,6 +38,7 @@ The plugin provides the `FingerPainter` object, which has the following methods: ## Dependencies * [Kaleidoscope-EEPROM-Settings](https://github.com/keyboardio/Kaleidoscope-EEPROM-Settings) +* [Kaleidoscope-LED-Palette-Theme](https://github.com/keyboardio/Kaleidoscope-LED-Palette-Theme) * [Kaleidoscope-LEDControl](https://github.com/keyboardio/Kaleidoscope-LEDControl) ## Further reading @@ -46,15 +47,3 @@ Starting from the [example][plugin:example] is the recommended way of getting started with the plugin. [plugin:example]: https://github.com/keyboardio/Kaleidoscope-FingerPainter/blob/master/examples/FingerPainter/FingerPainter.ino - -## Notice - -While the code is under the GPL-3, the `FINGERPAINTER_PALETTE_PASTEL` palette -was created by [Conache][conache], and is under a [CC-BY-SA][license:cc-by-sa] -license; the `FINGERPAINTER_PALETTE_SOLARIZED` palette was created -by [Ethan Schoonover][solarized], and is under the [MIT][license:mit] license. - - [solarized]: http://ethanschoonover.com/solarized - [conache]: http://www.colourlovers.com/lover/Conache/loveNote - [license:cc-by-sa]: http://creativecommons.org/licenses/by-sa/3.0/ - [license:mit]: https://github.com/altercation/solarized/blob/master/LICENSE diff --git a/examples/FingerPainter/FingerPainter.ino b/examples/FingerPainter/FingerPainter.ino index 53f43506..7b02ccb8 100644 --- a/examples/FingerPainter/FingerPainter.ino +++ b/examples/FingerPainter/FingerPainter.ino @@ -60,9 +60,6 @@ void setup () { USE_PLUGINS (&LEDOff, &EEPROMSettings, &FingerPainter, &Macros); - FingerPainter.configure (); - FingerPainter.defaultPalette = FINGERPAINTER_PALETTE_EGA; - EEPROMSettings.seal (); FingerPainter.activate (); diff --git a/src/Kaleidoscope/FingerPainter.cpp b/src/Kaleidoscope/FingerPainter.cpp index 37f4c540..fbee3982 100644 --- a/src/Kaleidoscope/FingerPainter.cpp +++ b/src/Kaleidoscope/FingerPainter.cpp @@ -17,52 +17,33 @@ */ #include -#include + +#include #include +#include +#include namespace KaleidoscopePlugins { -uint16_t FingerPainter::paletteBase; + uint16_t FingerPainter::colorBase; bool FingerPainter::editMode; -const cRGB *FingerPainter::defaultPalette; FingerPainter::FingerPainter (void) { } void FingerPainter::begin (void) { + USE_PLUGINS (&::LEDPaletteTheme); + LEDMode::begin (); event_handler_hook_use (eventHandlerHook); -} -void -FingerPainter::configure (void) { - paletteBase = ::EEPROMSettings.requestSlice (16 * sizeof (cRGB)); - colorBase = ::EEPROMSettings.requestSlice (ROWS * COLS); -} - -cRGB -FingerPainter::lookupColor (uint8_t row, uint8_t column) { - uint16_t location = row * COLS + column; - uint8_t colorIndex = EEPROM.read (colorBase + location); - - if (colorIndex == 0xff) - colorIndex = 0; - - cRGB color; - EEPROM.get (paletteBase + colorIndex * sizeof (cRGB), color); - - return color; + colorBase = ::LEDPaletteTheme.reserveThemes (1); } void FingerPainter::update (void) { - for (uint8_t r = 0; r < ROWS; r++) { - for (uint8_t c = 0; c < COLS; c++) { - cRGB color = lookupColor (r, c); - LEDControl.led_set_crgb_at (r, c, color); - } - } + ::LEDPaletteTheme.update (colorBase, 0); } void @@ -75,26 +56,30 @@ FingerPainter::eventHandlerHook (Key mappedKey, byte row, byte col, uint8_t keyS if (!editMode) return mappedKey; - if (row >= ROWS || col >= COLS) + if (!key_toggled_on (keyState)) return Key_NoKey; - if (!key_toggled_on (keyState)) + if (row >= ROWS || col >= COLS) return Key_NoKey; - cRGB oldColor, newColor; - - uint16_t location = row * COLS + col; - uint8_t colorIndex = EEPROM.read (colorBase + location); - if (colorIndex == 255) - colorIndex = 0; - EEPROM.get (paletteBase + colorIndex * sizeof (cRGB), oldColor); - colorIndex++; - if (colorIndex > 15) - colorIndex = 0; - EEPROM.get (paletteBase + colorIndex * sizeof (cRGB), newColor); - if (memcmp (&oldColor, &newColor, sizeof (cRGB)) == 0) - colorIndex = 0; - EEPROM.update (colorBase + location, colorIndex); + uint8_t colorIndex = ::LEDPaletteTheme.lookupColorIndex (colorBase, KeyboardHardware.get_led_index (row, col)); + + // Find the next color in the palette that is different. + // But do not loop forever! + bool turnAround = false; + cRGB oldColor = ::LEDPaletteTheme.lookupColor (colorIndex), newColor = oldColor; + while (memcmp (&oldColor, &newColor, sizeof (cRGB)) == 0) { + colorIndex++; + if (colorIndex > 15) { + colorIndex = 0; + if (turnAround) + break; + turnAround = true; + } + newColor = ::LEDPaletteTheme.lookupColor (colorIndex); + } + + ::LEDPaletteTheme.updateColor (colorBase, KeyboardHardware.get_led_index (row, col), colorIndex); return Key_NoKey; } @@ -102,7 +87,6 @@ FingerPainter::eventHandlerHook (Key mappedKey, byte row, byte col, uint8_t keyS bool FingerPainter::focusHook (const char *command) { enum { - PALETTE, TOGGLE, CLEAR, } subCommand; @@ -110,63 +94,22 @@ FingerPainter::focusHook (const char *command) { if (strncmp_P (command, PSTR ("fingerpainter."), 14) != 0) return false; - if (strcmp_P (command + 14, PSTR ("palette")) == 0) - subCommand = PALETTE; - else if (strcmp_P (command + 14, PSTR ("toggle")) == 0) + if (strcmp_P (command + 14, PSTR ("toggle")) == 0) subCommand = TOGGLE; else if (strcmp_P (command + 14, PSTR ("clear")) == 0) subCommand = CLEAR; else return false; - if (subCommand == TOGGLE) { - ::FingerPainter.activate (); - toggleEdit (); - return true; - } - if (subCommand == CLEAR) { - for (uint16_t i = 0; i < ROWS * COLS; i++) { + for (uint16_t i = 0; i < ROWS * COLS / 2; i++) { EEPROM.update (colorBase + i, 0); } return true; } - if (Serial.peek () == '\n') { - for (uint8_t i = 0; i < 16; i++) { - cRGB color; - - EEPROM.get (paletteBase + i * sizeof (color), color); - ::Focus.printColor (color.r, color.g, color.b); - ::Focus.printSpace (); - } - - Serial.println (); - return true; - } - - if (Serial.peek() == 'd') { - Serial.read (); - if (!defaultPalette) - return true; - - for (uint8_t i = 0; i < 16; i++) { - EEPROM.put (paletteBase + i * sizeof (cRGB), defaultPalette[i]); - } - return true; - } - - uint8_t i = 0; - while (i < 16 && Serial.peek() != '\n') { - cRGB color; - - color.r = Serial.parseInt (); - color.g = Serial.parseInt (); - color.b = Serial.parseInt (); - - EEPROM.put (paletteBase + i * sizeof (color), color); - i++; - } + ::FingerPainter.activate (); + toggleEdit (); return true; } diff --git a/src/Kaleidoscope/FingerPainter.h b/src/Kaleidoscope/FingerPainter.h index 15ea8287..1c830d0d 100644 --- a/src/Kaleidoscope/FingerPainter.h +++ b/src/Kaleidoscope/FingerPainter.h @@ -19,7 +19,6 @@ #pragma once #include -#include namespace KaleidoscopePlugins { class FingerPainter : public LEDMode { @@ -29,83 +28,19 @@ class FingerPainter : public LEDMode { virtual void begin (void) final; virtual void update (void) final; - static void configure (void); static void toggleEdit (void); static bool focusHook (const char *command); - static const cRGB *defaultPalette; - private: - static uint16_t paletteBase; static uint16_t colorBase; static bool editMode; static Key eventHandlerHook (Key mappedKey, byte row, byte col, uint8_t keyState); - static cRGB lookupColor (uint8_t row, uint8_t column); }; }; extern KaleidoscopePlugins::FingerPainter FingerPainter; #define FOCUS_HOOK_FINGERPAINTER FOCUS_HOOK(FingerPainter.focusHook, \ - "fingerpainter.palette\n" \ "fingerpainter.toggle\n" \ "fingerpainter.clear") - -#define FINGERPAINTER_PALETTE_EGA (const cRGB[]) { \ - CRGB (0x00, 0x00, 0x00), \ - CRGB (0x00, 0x00, 0xaa), \ - CRGB (0x00, 0xaa, 0x00), \ - CRGB (0x00, 0xaa, 0xaa), \ - CRGB (0xaa, 0x00, 0x00), \ - CRGB (0xaa, 0x00, 0xaa), \ - CRGB (0xaa, 0x55, 0x00), \ - CRGB (0xaa, 0xaa, 0xaa), \ - \ - CRGB (0x55, 0x55, 0x55), \ - CRGB (0x55, 0x55, 0xff), \ - CRGB (0x55, 0xff, 0x55), \ - CRGB (0x55, 0xff, 0xff), \ - CRGB (0xff, 0x55, 0x55), \ - CRGB (0xff, 0x55, 0xff), \ - CRGB (0xff, 0xff, 0x55), \ - CRGB (0xff, 0xff, 0xff) \ - } - -#define FINGERPAINTER_PALETTE_PASTEL (const cRGB[]) { \ - CRGB (0, 0, 0), \ - CRGB (230, 119, 107), \ - CRGB (229, 154, 67), \ - CRGB (242, 228, 110), \ - CRGB (155, 243, 150), \ - CRGB (150, 221, 243), \ - CRGB (255, 255, 255), \ - CRGB (0, 0, 0), \ - CRGB (0, 0, 0), \ - CRGB (0, 0, 0), \ - CRGB (0, 0, 0), \ - CRGB (0, 0, 0), \ - CRGB (0, 0, 0), \ - CRGB (0, 0, 0), \ - CRGB (0, 0, 0), \ - CRGB (0, 0, 0), \ - } - -#define FINGERPAINTER_PALETTE_SOLARIZED (const cRGB[]) { \ - CRGB (0, 0, 0), \ - CRGB (181, 137, 0), \ - CRGB (203, 75, 22), \ - CRGB (220, 50, 47), \ - CRGB (211, 54, 130), \ - CRGB (108, 113, 196), \ - CRGB (38, 139, 210), \ - CRGB (42, 161, 152), \ - CRGB (133, 153, 0), \ - CRGB (238, 232, 213), \ - CRGB (0, 0, 0), \ - CRGB (0, 0, 0), \ - CRGB (0, 0, 0), \ - CRGB (0, 0, 0), \ - CRGB (0, 0, 0), \ - CRGB (0, 0, 0), \ - }