From 9072e07ce68fa60027909131a251b33d74727fde Mon Sep 17 00:00:00 2001 From: Ben Isaacs <75862+ben-xo@users.noreply.github.com> Date: Sun, 1 Aug 2021 12:35:42 +0100 Subject: Tweak clockless trinket to handle negative advanceBy values (that is, showing pixels in reverse). --- src/platforms/avr/clockless_trinket.h | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/platforms/avr/clockless_trinket.h b/src/platforms/avr/clockless_trinket.h index 2cfbef0d..833a2b43 100644 --- a/src/platforms/avr/clockless_trinket.h +++ b/src/platforms/avr/clockless_trinket.h @@ -241,13 +241,13 @@ protected: #define PRESCALEB4(D) asm __volatile__("brcc L_%=\n\tldi %[scale_base], 0xFF\n\tL_%=:\n\tneg %[" #D "]\n\tCLC" ASM_VARS); // Clamp for prescale, increment data, since we won't ever wrap 65k, this also effectively clears carry for us -#define PSBIDATA4(D) asm __volatile__("brcc L_%=\n\tldi %[scale_base], 0xFF\n\tL_%=:\n\tadd %A[data], %[ADV]\n\tadc %B[data], __zero_reg__\n\t" ASM_VARS); +#define PSBIDATA4(D) asm __volatile__("brcc L_%=\n\tldi %[scale_base], 0xFF\n\tL_%=:\n\tadd %A[data], %A[ADV]\n\tadc %B[data], %B[ADV]\n\t" ASM_VARS); #else #define PRESCALE4(D) _dc<4>(loopvar); #define PRESCALEA2(D) _dc<2>(loopvar); #define PRESCALEB4(D) _dc<4>(loopvar); -#define PSBIDATA4(D) asm __volatile__( "add %A[data], %[ADV]\n\tadc %B[data], __zero_reg__\n\trjmp .+0\n\t" ASM_VARS ); +#define PSBIDATA4(D) asm __volatile__( "add %A[data], %A[ADV]\n\tadc %B[data], %B[ADV]\n\trjmp .+0\n\t" ASM_VARS ); #endif // 2 cycles - perform one step of the scaling (if a given bit is set in scale, add scale-base to the scratch space) @@ -299,8 +299,8 @@ protected: #define DONE asm __volatile__("2:" ASM_VARS ); // 2 cycles - increment the data pointer -#define IDATA2 asm __volatile__("add %A[data], %[ADV]\n\tadc %B[data], __zero_reg__\n\t" ASM_VARS ); -#define IDATACLC3 asm __volatile__("add %A[data], %[ADV]\n\tadc %B[data], __zero_reg__\n\t" _CLC1 ASM_VARS ); +#define IDATA2 asm __volatile__("add %A[data], %A[ADV]\n\tadc %B[data], %B[ADV]\n\t" ASM_VARS ); +#define IDATACLC3 asm __volatile__("add %A[data], %A[ADV]\n\tadc %B[data], %B[ADV]\n\t" _CLC1 ASM_VARS ); // 1 cycle mov #define _MOV1(B1, B2) "mov %[" #B1 "], %[" #B2 "]\n\t" @@ -368,7 +368,9 @@ protected: pixels.preStepFirstByteDithering(); // pull the dithering/adjustment values out of the pixels object for direct asm access - uint8_t advanceBy = pixels.advanceBy(); + + // even though advanceBy is only an int8, we cast it to int16 for sign extension in case it's negative. + int16_t advanceBy = pixels.advanceBy(); uint16_t count = pixels.mLen; uint8_t s0 = pixels.mScale.raw[RO(0)]; -- cgit v1.2.3 From a57d1f3c3899b2eced6fc3940d03e1c7f5d6966b Mon Sep 17 00:00:00 2001 From: Ben Isaacs <75862+ben-xo@users.noreply.github.com> Date: Sun, 1 Aug 2021 12:36:35 +0100 Subject: Tweak Controller::showLeds() to infer reversal from negative strip length Example usage: ``` Show forward: FastLED[0].setLeds(&leds[0], STRIP_LENGTH); FastLED.show(); Show in reverse: FastLED[0].setLeds(&leds[STRIP_LENGTH-1], -STRIP_LENGTH); FastLED.show(); ``` --- src/controller.h | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/controller.h b/src/controller.h index fe32d70d..1616eb91 100644 --- a/src/controller.h +++ b/src/controller.h @@ -404,7 +404,11 @@ protected: ///@param nLeds the number of leds being written out ///@param scale the rgb scaling to apply to each led before writing it out virtual void show(const struct CRGB *data, int nLeds, CRGB scale) { - PixelController pixels(data, nLeds, scale, getDither()); + PixelController pixels(data, nLeds < 0 ? -nLeds : nLeds, scale, getDither()); + if(nLeds < 0) { + // nLeds < 0 implies that we want to show them in reverse + pixels.mAdvance = -3; + } showPixels(pixels); } -- cgit v1.2.3 From d8096fdfe2457ffd570689d05fc602fb8711e4d8 Mon Sep 17 00:00:00 2001 From: Ben Isaacs <75862+ben-xo@users.noreply.github.com> Date: Sun, 1 Aug 2021 12:42:30 +0100 Subject: Don't assume mAdvance is always 3. --- src/controller.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/controller.h b/src/controller.h index 1616eb91..7b7a7cf9 100644 --- a/src/controller.h +++ b/src/controller.h @@ -407,7 +407,7 @@ protected: PixelController pixels(data, nLeds < 0 ? -nLeds : nLeds, scale, getDither()); if(nLeds < 0) { // nLeds < 0 implies that we want to show them in reverse - pixels.mAdvance = -3; + pixels.mAdvance = -pixels.mAdvance; } showPixels(pixels); } -- cgit v1.2.3