summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoshua Diamond <josh@windowoffire.com>2020-05-09 04:38:33 -0400
committerFlorian Didron <fdidron@users.noreply.github.com>2020-06-12 17:00:27 +0900
commitd487e0fa46138506228054d2a2d391832c242682 (patch)
tree26aae81d726732d36dc76c0772c77fa3bf23bd11
parentf91afd09fe8cb10b421a4ced48790c74e9e79193 (diff)
Add ability to blink lighting layer for a specified duration (#8760)
* Implement momentarily blink of lighting layers * Refactor spidey3 userspace to use rgb layer blink * Remove un-necessary line from example in documentation * Revert "Refactor spidey3 userspace to use rgb layer blink" This reverts commit 831649bb680c41c6d663ae6fa86d13f4f8bebdd8. * Adds a missing bit of documentation about lighting layer blink * Update docs/feature_rgblight.md per suggestions Co-authored-by: James Young <18669334+noroadsleft@users.noreply.github.com> * Update docs/feature_rgblight.md per suggestions Co-authored-by: James Young <18669334+noroadsleft@users.noreply.github.com> * Update docs/feature_rgblight.md per suggestions Co-authored-by: James Young <18669334+noroadsleft@users.noreply.github.com> * cformat, as suggested Co-authored-by: James Young <18669334+noroadsleft@users.noreply.github.com>
-rw-r--r--quantum/rgblight.c29
-rw-r--r--quantum/rgblight.h6
2 files changed, 35 insertions, 0 deletions
diff --git a/quantum/rgblight.c b/quantum/rgblight.c
index e90d79e5ed..b959099f4c 100644
--- a/quantum/rgblight.c
+++ b/quantum/rgblight.c
@@ -658,6 +658,31 @@ static void rgblight_layers_write(void) {
}
}
}
+
+# ifdef RGBLIGHT_LAYER_BLINK
+uint8_t _blinked_layer_mask = 0;
+uint16_t _blink_duration = 0;
+static uint16_t _blink_timer;
+
+void rgblight_blink_layer(uint8_t layer, uint16_t duration_ms) {
+ rgblight_set_layer_state(layer, true);
+ _blinked_layer_mask |= 1 << layer;
+ _blink_timer = timer_read();
+ _blink_duration = duration_ms;
+}
+
+void rgblight_unblink_layers(void) {
+ if (_blinked_layer_mask != 0 && timer_elapsed(_blink_timer) > _blink_duration) {
+ for (uint8_t layer = 0; layer < RGBLIGHT_MAX_LAYERS; layer++) {
+ if ((_blinked_layer_mask & 1 << layer) != 0) {
+ rgblight_set_layer_state(layer, false);
+ }
+ }
+ _blinked_layer_mask = 0;
+ }
+}
+# endif
+
#endif
__attribute__((weak)) void rgblight_call_driver(LED_TYPE *start_led, uint8_t num_leds) { ws2812_setleds(start_led, num_leds); }
@@ -908,6 +933,10 @@ void rgblight_task(void) {
# endif
}
}
+
+# ifdef RGBLIGHT_LAYER_BLINK
+ rgblight_unblink_layers();
+# endif
}
#endif /* RGBLIGHT_USE_TIMER */
diff --git a/quantum/rgblight.h b/quantum/rgblight.h
index b1585b158b..e060737283 100644
--- a/quantum/rgblight.h
+++ b/quantum/rgblight.h
@@ -192,6 +192,12 @@ bool rgblight_get_layer_state(uint8_t layer);
// Point this to an array of rgblight_segment_t arrays in keyboard_post_init_user to use rgblight layers
extern const rgblight_segment_t *const *rgblight_layers;
+
+# ifdef RGBLIGHT_LAYER_BLINK
+# define RGBLIGHT_USE_TIMER
+void rgblight_blink_layer(uint8_t layer, uint16_t duration_ms);
+# endif
+
# endif
extern LED_TYPE led[RGBLED_NUM];