diff --git a/doc/plugin/Colormap.md b/doc/plugin/Colormap.md new file mode 100644 index 00000000..008e679f --- /dev/null +++ b/doc/plugin/Colormap.md @@ -0,0 +1,69 @@ +# Kaleidoscope-Colormap + +The `Colormap` extension provides an easier way to set up a different - static - +color map per-layer. This means that we can set up a map of colors for each key, +on a per-layer basis, and whenever a layer becomes active, the color map for +that layer is applied. Colors are picked from a 16-color palette, provided by +the [LED-Palette-Theme][plugin:l-p-t] plugin. The color map is stored in +`EEPROM`, and can be easily changed via the [FocusSerial][plugin:focusserial] +plugin, which also provides palette editing capabilities. + + [plugin:focusserial]: FocusSerial.md + [plugin:l-p-t]: LED-Palette-Theme.md + +## Using the extension + +To use the extension, include the header, tell it the number of layers you have, +register the `Focus` hooks, and it will do the rest. + +```c++ +#include +#include +#include +#include +#include + +KALEIDOSCOPE_INIT_PLUGINS(EEPROMSettings, + LEDPaletteTheme, + ColormapEffect, + Focus); + +void setup(void) { + Kaleidoscope.setup(); + + ColormapEffect.max_layers(1); +} +``` + +## Plugin methods + +The extension provides an `ColormapEffect` singleton object, with a single method: + +### `.max_layers(max)` + +> Tells the extension to reserve space in EEPROM for up to `max` layers. Can +> only be called once, any subsequent call will be a no-op. + +## Focus commands + +### `colormap.map` + +> Without arguments, prints the color map: palette indexes for all layers. +> +> With arguments, updates the color map with new indexes. One does not need to +> give the full map, the plugin will process as many arguments as available, and +> ignore anything past the last key on the last layer (as set by the +> `.max_layers()` method). + +## Dependencies + +* [Kaleidoscope-EEPROM-Settings](EEPROM-Settings.md) +* [Kaleidoscope-FocusSerial](FocusSerial.md) +* [Kaleidoscope-LED-Palette-Theme](LED-Palette-Theme.md) + +## Further reading + +Starting from the [example][plugin:example] is the recommended way of getting +started with the plugin. + + [plugin:example]: ../../examples/Colormap/Colormap.ino diff --git a/examples/Colormap/Colormap.ino b/examples/Colormap/Colormap.ino new file mode 100644 index 00000000..f5fbad7d --- /dev/null +++ b/examples/Colormap/Colormap.ino @@ -0,0 +1,60 @@ +/* -*- mode: c++ -*- + * Kaleidoscope-EEPROM-Colormap -- Per-layer colormap effect + * Copyright (C) 2017, 2018 Keyboard.io, Inc + * + * This program is free software: you can redistribute it and/or modify it under it under + * the terms of the GNU General Public License as published by the Free Software + * Foundation, version 3. + * + * This program is distributed in the hope that it will be useful, but WITHOUT but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License along with along with + * this program. If not, see . + */ + +#include +#include +#include +#include +#include + +// *INDENT-OFF* + +const Key keymaps[][ROWS][COLS] PROGMEM = { + [0] = KEYMAP_STACKED + (Key_LEDEffectNext, Key_1, Key_2, Key_3, Key_4, Key_5, Key_LEDEffectNext, + Key_Backtick, Key_Q, Key_W, Key_E, Key_R, Key_T, Key_Tab, + Key_PageUp, Key_A, Key_S, Key_D, Key_F, Key_G, + Key_PageDown, Key_Z, Key_X, Key_C, Key_V, Key_B, Key_Escape, + + Key_LeftControl, Key_Backspace, Key_LeftGui, Key_LeftShift, + Key_NoKey, + + Key_skip, Key_6, Key_7, Key_8, Key_9, Key_0, Key_skip, + Key_Enter, Key_Y, Key_U, Key_I, Key_O, Key_P, Key_Equals, + Key_H, Key_J, Key_K, Key_L, Key_Semicolon, Key_Quote, + Key_skip, Key_N, Key_M, Key_Comma, Key_Period, Key_Slash, Key_Minus, + + Key_RightShift, Key_RightAlt, Key_Spacebar, Key_RightControl, + Key_NoKey), +}; + +// *INDENT-ON* + +KALEIDOSCOPE_INIT_PLUGINS(EEPROMSettings, + LEDPaletteTheme, + ColormapEffect, + Focus); + +void setup() { + Kaleidoscope.setup(); + ColormapEffect.max_layers(1); + ColormapEffect.activate(); +} + +void loop() { + Kaleidoscope.loop(); +} diff --git a/src/Kaleidoscope-Colormap.h b/src/Kaleidoscope-Colormap.h new file mode 100644 index 00000000..4c7fd1e4 --- /dev/null +++ b/src/Kaleidoscope-Colormap.h @@ -0,0 +1,20 @@ +/* -*- mode: c++ -*- + * Kaleidoscope-Colormap -- Per-layer colormap effect + * Copyright (C) 2016, 2017 Keyboard.io, Inc + * + * This program is free software: you can redistribute it and/or modify it under it under + * the terms of the GNU General Public License as published by the Free Software + * Foundation, version 3. + * + * This program is distributed in the hope that it will be useful, but WITHOUT but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License along with along with + * this program. If not, see . + */ + +#pragma once + +#include diff --git a/src/kaleidoscope/plugin/Colormap.cpp b/src/kaleidoscope/plugin/Colormap.cpp new file mode 100644 index 00000000..f4416190 --- /dev/null +++ b/src/kaleidoscope/plugin/Colormap.cpp @@ -0,0 +1,67 @@ +/* -*- mode: c++ -*- + * Kaleidoscope-Colormap -- Per-layer colormap effect + * Copyright (C) 2016, 2017, 2018 Keyboard.io, Inc + * + * This program is free software: you can redistribute it and/or modify it under it under + * the terms of the GNU General Public License as published by the Free Software + * Foundation, version 3. + * + * This program is distributed in the hope that it will be useful, but WITHOUT but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License along with along with + * this program. If not, see . + */ + + +#include + +#include + +#include +#include + +namespace kaleidoscope { +namespace plugin { + +uint16_t ColormapEffect::map_base_; +uint8_t ColormapEffect::max_layers_; +uint8_t ColormapEffect::last_highest_layer_; + +void ColormapEffect::max_layers(uint8_t max_) { + if (map_base_ != 0) + return; + + max_layers_ = max_; + map_base_ = ::LEDPaletteTheme.reserveThemes(max_layers_); +} + +void ColormapEffect::onActivate(void) { + last_highest_layer_ = Layer.top(); + if (last_highest_layer_ <= max_layers_) + ::LEDPaletteTheme.updateHandler(map_base_, last_highest_layer_); +} + +void ColormapEffect::update(void) { + if (Layer.top() == last_highest_layer_) + return; + + onActivate(); +} + +void ColormapEffect::refreshAt(byte row, byte col) { + if (last_highest_layer_ <= max_layers_) + ::LEDPaletteTheme.refreshAt(map_base_, last_highest_layer_, row, col); +} + +EventHandlerResult ColormapEffect::onFocusEvent(const char *command) { + return ::LEDPaletteTheme.themeFocusEvent(command, PSTR("colormap.map"), + map_base_, max_layers_); +} + +} +} + +kaleidoscope::plugin::ColormapEffect ColormapEffect; diff --git a/src/kaleidoscope/plugin/Colormap.h b/src/kaleidoscope/plugin/Colormap.h new file mode 100644 index 00000000..03ca53d0 --- /dev/null +++ b/src/kaleidoscope/plugin/Colormap.h @@ -0,0 +1,46 @@ +/* -*- mode: c++ -*- + * Kaleidoscope-Colormap -- Per-layer colormap effect + * Copyright (C) 2016, 2017, 2018 Keyboard.io, Inc + * + * This program is free software: you can redistribute it and/or modify it under it under + * the terms of the GNU General Public License as published by the Free Software + * Foundation, version 3. + * + * This program is distributed in the hope that it will be useful, but WITHOUT but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License along with along with + * this program. If not, see . + */ + +#pragma once + +#include +#include + +namespace kaleidoscope { +namespace plugin { +class ColormapEffect : public LEDMode { + public: + ColormapEffect(void) {} + + void max_layers(uint8_t max_); + + EventHandlerResult onFocusEvent(const char *command); + + protected: + void onActivate(void) final; + void update(void) final; + void refreshAt(byte row, byte col) final; + + private: + static uint8_t last_highest_layer_; + static uint8_t max_layers_; + static uint16_t map_base_; +}; +} +} + +extern kaleidoscope::plugin::ColormapEffect ColormapEffect;