commit
a99f00cb89
@ -0,0 +1,84 @@
|
|||||||
|
# Kaleidoscope-LED-Stalker
|
||||||
|
|
||||||
|
The `StalkerEffect` plugin provides an interesting new typing experience: the
|
||||||
|
LEDs light up as you tap keys and play one of the selected effects: a haunting
|
||||||
|
trail of ghostly white lights, or a blazing trail of fire.
|
||||||
|
|
||||||
|
## Using the plugin
|
||||||
|
|
||||||
|
To use the plugin, one needs to include the header and select the effect.
|
||||||
|
|
||||||
|
```c++
|
||||||
|
#include <Kaleidoscope.h>
|
||||||
|
#include <Kaleidoscope-LEDControl.h>
|
||||||
|
#include <Kaleidoscope-LED-Stalker.h>
|
||||||
|
|
||||||
|
KALEIDOSCOPE_INIT_PLUGINS(LEDControl, StalkerEffect);
|
||||||
|
|
||||||
|
void setup (){
|
||||||
|
Kaleidoscope.setup();
|
||||||
|
|
||||||
|
StalkerEffect.variant = STALKER(Haunt, (CRGB(0, 128, 0)));
|
||||||
|
StalkerEffect.activate();
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
It is recommended to place the activation of the plugin (the `Kaleidoscope.use`
|
||||||
|
call) as early as possible, so the plugin can catch all relevant key presses.
|
||||||
|
The configuration can happen at any time and should use the `STALKER` macro to
|
||||||
|
do so.
|
||||||
|
|
||||||
|
## Plugin methods
|
||||||
|
|
||||||
|
The plugin provides the `StalkerEffect` object, which has the following
|
||||||
|
properties:
|
||||||
|
|
||||||
|
### `.variant`
|
||||||
|
|
||||||
|
> Set the effect to use with the plugin. See below for a list.
|
||||||
|
>
|
||||||
|
> It is recommended to use the `STALKER` macro to declare the effect itself.
|
||||||
|
|
||||||
|
### `.step_length`
|
||||||
|
|
||||||
|
> The length - in milliseconds - of each step of the animation. An animation
|
||||||
|
> lasts 256 steps.
|
||||||
|
>
|
||||||
|
> Defaults to 50.
|
||||||
|
|
||||||
|
## Plugin helpers
|
||||||
|
|
||||||
|
### `STALKER(effect, params)`
|
||||||
|
|
||||||
|
> Returns an effect, to be used to assign a value the `.variant` property of the
|
||||||
|
> `StalkerEffect` object. Any arguments given to the macro are passed on
|
||||||
|
> to the effect. If the effect takes no arguments, use an empty `params` list.
|
||||||
|
|
||||||
|
## Plugin effects
|
||||||
|
|
||||||
|
The plugin provides the following effects:
|
||||||
|
|
||||||
|
### `Haunt([color])`
|
||||||
|
|
||||||
|
> A ghostly haunt effect, that trails the key taps with a ghostly white color
|
||||||
|
> (or any other color, if specified). Use the `CRGB(r,g,b)` macro to specify the
|
||||||
|
> color, if you want something else than the ghostly white.
|
||||||
|
|
||||||
|
### `BlazingTrail()`
|
||||||
|
|
||||||
|
> A blazing trail of fire will follow our fingers!
|
||||||
|
|
||||||
|
### `Rainbow()`
|
||||||
|
|
||||||
|
> Leave a rainbow behind, where your fingers has been!
|
||||||
|
|
||||||
|
## Dependencies
|
||||||
|
|
||||||
|
* [Kaleidoscope-LEDControl](LEDControl.md)
|
||||||
|
|
||||||
|
## Further reading
|
||||||
|
|
||||||
|
Starting from the [example][plugin:example] is the recommended way of getting
|
||||||
|
started with the plugin.
|
||||||
|
|
||||||
|
[plugin:example]: ../../examples/LED-Stalker/LED-Stalker.ino
|
@ -0,0 +1,57 @@
|
|||||||
|
/* -*- mode: c++ -*-
|
||||||
|
* Kaleidoscope-LED-Stalker -- Stalk keys pressed by lighting up and fading back the LED under them
|
||||||
|
* Copyright (C) 2017, 2018 Keyboard.io, Inc
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify 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
|
||||||
|
* 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
|
||||||
|
* this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <Kaleidoscope.h>
|
||||||
|
#include <Kaleidoscope-LEDControl.h>
|
||||||
|
#include <Kaleidoscope-LED-Stalker.h>
|
||||||
|
|
||||||
|
// *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(LEDControl,
|
||||||
|
LEDOff,
|
||||||
|
StalkerEffect);
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
Kaleidoscope.setup();
|
||||||
|
|
||||||
|
StalkerEffect.variant = STALKER(BlazingTrail);
|
||||||
|
StalkerEffect.activate();
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
Kaleidoscope.loop();
|
||||||
|
}
|
@ -0,0 +1,20 @@
|
|||||||
|
/* -*- mode: c++ -*-
|
||||||
|
* Kaleidoscope-LED-Stalker -- Stalk keys pressed by lighting up and fading back the LED under them
|
||||||
|
* Copyright (C) 2017 Keyboard.io, Inc
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify 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
|
||||||
|
* 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
|
||||||
|
* this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <kaleidoscope/plugin/LED-Stalker.h>
|
@ -0,0 +1,144 @@
|
|||||||
|
/* -*- mode: c++ -*-
|
||||||
|
* Kaleidoscope-LED-Stalker -- Stalk keys pressed by lighting up and fading back the LED under them
|
||||||
|
* Copyright (C) 2017, 2018 Keyboard.io, Inc
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify 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
|
||||||
|
* 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
|
||||||
|
* this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <Kaleidoscope-LED-Stalker.h>
|
||||||
|
|
||||||
|
namespace kaleidoscope {
|
||||||
|
namespace plugin {
|
||||||
|
|
||||||
|
uint8_t StalkerEffect::map_[ROWS][COLS];
|
||||||
|
StalkerEffect::ColorComputer *StalkerEffect::variant;
|
||||||
|
uint16_t StalkerEffect::step_length = 50;
|
||||||
|
uint16_t StalkerEffect::step_start_time_;
|
||||||
|
|
||||||
|
void StalkerEffect::onActivate(void) {
|
||||||
|
memset(map_, 0, sizeof(map_));
|
||||||
|
}
|
||||||
|
|
||||||
|
EventHandlerResult StalkerEffect::onKeyswitchEvent(Key &mapped_key, byte row, byte col, uint8_t keyState) {
|
||||||
|
if (row >= ROWS || col >= COLS)
|
||||||
|
return EventHandlerResult::OK;
|
||||||
|
|
||||||
|
if (keyIsPressed(keyState)) {
|
||||||
|
map_[row][col] = 0xff;
|
||||||
|
}
|
||||||
|
|
||||||
|
return EventHandlerResult::OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
void StalkerEffect::update(void) {
|
||||||
|
if (!variant)
|
||||||
|
return;
|
||||||
|
|
||||||
|
uint16_t now = millis();
|
||||||
|
uint16_t elapsed = Kaleidoscope.millisAtCycleStart() - step_start_time_;
|
||||||
|
|
||||||
|
for (byte r = 0; r < ROWS; r++) {
|
||||||
|
for (byte c = 0; c < COLS; c++) {
|
||||||
|
uint8_t step = map_[r][c];
|
||||||
|
if (step) {
|
||||||
|
::LEDControl.setCrgbAt(r, c, variant->compute(&step));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (elapsed > step_length) {
|
||||||
|
map_[r][c] = step;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!map_[r][c])
|
||||||
|
::LEDControl.setCrgbAt(r, c, (cRGB) {
|
||||||
|
0, 0, 0
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (elapsed > step_length)
|
||||||
|
step_start_time_ = Kaleidoscope.millisAtCycleStart();
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace stalker {
|
||||||
|
|
||||||
|
cRGB Haunt::highlight_color_;
|
||||||
|
|
||||||
|
// Haunt
|
||||||
|
Haunt::Haunt(const cRGB highlight_color) {
|
||||||
|
highlight_color_ = highlight_color;
|
||||||
|
}
|
||||||
|
|
||||||
|
cRGB Haunt::compute(uint8_t *step) {
|
||||||
|
cRGB color = CRGB((uint8_t)min(*step * highlight_color_.r / 255, 255),
|
||||||
|
(uint8_t)min(*step * highlight_color_.g / 255, 255),
|
||||||
|
(uint8_t)min(*step * highlight_color_.b / 255, 255));
|
||||||
|
|
||||||
|
if (*step >= 0xf0)
|
||||||
|
*step -= 1;
|
||||||
|
else if (*step >= 0x40)
|
||||||
|
*step -= 16;
|
||||||
|
else if (*step >= 32)
|
||||||
|
*step -= 32;
|
||||||
|
else
|
||||||
|
*step = 0;
|
||||||
|
|
||||||
|
return color;
|
||||||
|
}
|
||||||
|
|
||||||
|
// BlazingTrail
|
||||||
|
BlazingTrail::BlazingTrail(void) {
|
||||||
|
}
|
||||||
|
|
||||||
|
cRGB BlazingTrail::compute(uint8_t *step) {
|
||||||
|
cRGB color;
|
||||||
|
|
||||||
|
if (*step >= 0xff - 30) {
|
||||||
|
color = hsvToRgb(0xff - *step, 255, 255);
|
||||||
|
} else {
|
||||||
|
color = hsvToRgb(30, 255, 255);
|
||||||
|
|
||||||
|
color.r = min(*step * color.r / 255, 255);
|
||||||
|
color.g = min(*step * color.g / 255, 255);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (*step >= 0xff - 30)
|
||||||
|
*step -= 1;
|
||||||
|
else if (*step >= 0x40)
|
||||||
|
*step -= 16;
|
||||||
|
else if (*step >= 32)
|
||||||
|
*step -= 32;
|
||||||
|
else
|
||||||
|
*step = 0;
|
||||||
|
|
||||||
|
return color;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Rainbow
|
||||||
|
Rainbow::Rainbow(void) {
|
||||||
|
}
|
||||||
|
|
||||||
|
cRGB Rainbow::compute(uint8_t *step) {
|
||||||
|
if (*step > 0)
|
||||||
|
*step -= 1;
|
||||||
|
else
|
||||||
|
*step = 0;
|
||||||
|
|
||||||
|
return hsvToRgb(255 - *step, 255, *step);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
kaleidoscope::plugin::StalkerEffect StalkerEffect;
|
@ -0,0 +1,80 @@
|
|||||||
|
/* -*- mode: c++ -*-
|
||||||
|
* Kaleidoscope-LED-Stalker -- Stalk keys pressed by lighting up and fading back the LED under them
|
||||||
|
* Copyright (C) 2017, 2018 Keyboard.io, Inc
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify 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
|
||||||
|
* 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
|
||||||
|
* this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <Kaleidoscope.h>
|
||||||
|
#include <Kaleidoscope-LEDControl.h>
|
||||||
|
|
||||||
|
#define STALKER(v, ...) ({static kaleidoscope::plugin::stalker::v _effect __VA_ARGS__; &_effect;})
|
||||||
|
|
||||||
|
namespace kaleidoscope {
|
||||||
|
namespace plugin {
|
||||||
|
class StalkerEffect : public LEDMode {
|
||||||
|
public:
|
||||||
|
class ColorComputer {
|
||||||
|
public:
|
||||||
|
virtual cRGB compute(uint8_t *step) = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
StalkerEffect(void) {}
|
||||||
|
|
||||||
|
static ColorComputer *variant;
|
||||||
|
static uint16_t step_length;
|
||||||
|
|
||||||
|
EventHandlerResult onKeyswitchEvent(Key &mapped_key, byte row, byte col, uint8_t keyState);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void onActivate(void) final;
|
||||||
|
void update(void) final;
|
||||||
|
|
||||||
|
private:
|
||||||
|
static uint16_t step_start_time_;
|
||||||
|
static uint8_t map_[ROWS][COLS];
|
||||||
|
};
|
||||||
|
|
||||||
|
namespace stalker {
|
||||||
|
|
||||||
|
class Haunt : public StalkerEffect::ColorComputer {
|
||||||
|
public:
|
||||||
|
explicit Haunt(const cRGB highlight_color);
|
||||||
|
Haunt(void) : Haunt(CRGB(0x40, 0x80, 0x80)) {}
|
||||||
|
|
||||||
|
cRGB compute(uint8_t *step) final;
|
||||||
|
private:
|
||||||
|
static cRGB highlight_color_;
|
||||||
|
};
|
||||||
|
|
||||||
|
class BlazingTrail : public StalkerEffect::ColorComputer {
|
||||||
|
public:
|
||||||
|
BlazingTrail(void);
|
||||||
|
|
||||||
|
cRGB compute(uint8_t *step) final;
|
||||||
|
};
|
||||||
|
|
||||||
|
class Rainbow : public StalkerEffect::ColorComputer {
|
||||||
|
public:
|
||||||
|
Rainbow(void);
|
||||||
|
|
||||||
|
cRGB compute(uint8_t *step) final;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
extern kaleidoscope::plugin::StalkerEffect StalkerEffect;
|
Loading…
Reference in new issue