Chase: Allow setting the distance too

Fixes #546.

Signed-off-by: Gergely Nagy <algernon@keyboard.io>
pull/550/head
Gergely Nagy 6 years ago
parent 88abeacd53
commit 82349df38e
No known key found for this signature in database
GPG Key ID: AC1E90BAC433F68F

@ -29,16 +29,16 @@ void LEDChaseEffect::update(void) {
} }
last_update_ = now; last_update_ = now;
// The red LED is at `pos`; the blue one follows behind. `chase_sign` is either +1 or // The red LED is at `pos_`; the blue one follows behind. `direction_` is
// -1; `chase_pixels` is the gap between them. // either +1 or -1; `distance_` is the gap between them.
int8_t pos2 = pos - (chase_sign * chase_pixels); int8_t pos2 = pos_ - (direction_ * distance_);
// First, we turn off the LEDs that were turned on in the previous update. `pos` is // First, we turn off the LEDs that were turned on in the previous update.
// always in the valid range (0 <= pos < LED_COUNT), but after it changes direction, for // `pos_` is always in the valid range (0 <= pos_ < LED_COUNT), but after it
// the first few updates, `pos2` will be out of bounds. Since it's an unsigned integer, // changes direction, for the first few updates, `pos2` will be out of bounds.
// even when it would have a value below zero, it underflows and so one test is good for // Since it's an unsigned integer, even when it would have a value below zero,
// both ends of the range. // it underflows and so one test is good for both ends of the range.
::LEDControl.setCrgbAt(pos, CRGB(0, 0, 0)); ::LEDControl.setCrgbAt(pos_, CRGB(0, 0, 0));
if (pos2 < LED_COUNT) if (pos2 < LED_COUNT)
::LEDControl.setCrgbAt(pos2, CRGB(0, 0, 0)); ::LEDControl.setCrgbAt(pos2, CRGB(0, 0, 0));
@ -48,18 +48,18 @@ void LEDChaseEffect::update(void) {
// it back in bounds. When this happens, the blue light "jumps" behind the red one, and // it back in bounds. When this happens, the blue light "jumps" behind the red one, and
// will be out of bounds. The simplest way to do this is to assign it a value that is // will be out of bounds. The simplest way to do this is to assign it a value that is
// known to be invalid (LED_COUNT). // known to be invalid (LED_COUNT).
pos += chase_sign; pos_ += direction_;
if (pos < LED_COUNT && pos > 0) { if (pos_ < LED_COUNT && pos_ > 0) {
pos2 += chase_sign; pos2 += direction_;
} else { } else {
chase_sign = -chase_sign; direction_ = -direction_;
pos += chase_sign; pos_ += direction_;
pos2 = LED_COUNT; pos2 = LED_COUNT;
} }
// Last, we turn on the LEDs at their new positions. As before, the blue light (pos2) is // Last, we turn on the LEDs at their new positions. As before, the blue light (pos2) is
// only set if it's in the valid LED range. // only set if it's in the valid LED range.
::LEDControl.setCrgbAt(pos, CRGB(255, 0, 0)); ::LEDControl.setCrgbAt(pos_, CRGB(255, 0, 0));
if (pos2 < LED_COUNT) if (pos2 < LED_COUNT)
::LEDControl.setCrgbAt(pos2, CRGB(0, 0, 255)); ::LEDControl.setCrgbAt(pos2, CRGB(0, 0, 255));
} }

@ -30,14 +30,20 @@ class LEDChaseEffect : public LEDMode {
void update_delay(uint16_t delay) { void update_delay(uint16_t delay) {
update_delay_ = delay; update_delay_ = delay;
} }
uint8_t distance() {
return distance_;
}
void distance(uint8_t value) {
distance_ = value;
}
protected: protected:
void update(void) final; void update(void) final;
private: private:
int8_t pos = 0; int8_t pos_ = 0;
int8_t chase_sign = 1; //negative values when it's going backwar int8_t direction_ = 1;
uint8_t chase_pixels = 5; uint8_t distance_ = 5;
uint16_t update_delay_ = 150; uint16_t update_delay_ = 150;
uint16_t last_update_ = 0; uint16_t last_update_ = 0;
}; };

Loading…
Cancel
Save