39 brightness(0), pixels(NULL), endTime(0), begun(
false)
52 pin(-1), brightness(0), pixels(NULL), endTime(0), begun(
false),
53 numLEDs(0), numBytes(0), rOffset(1), gOffset(0), bOffset(2), wOffset(1)
61 if(pixels) free(pixels);
62 if(pin >= 0) pinMode(pin, INPUT);
68 digitalWrite(pin, LOW);
74 if(pixels) free(pixels);
77 numBytes = n * ((wOffset == rOffset) ? 3 : 4);
78 if((pixels = (uint8_t *)malloc(numBytes))) {
79 memset(pixels, 0, numBytes);
82 numLEDs = numBytes = 0;
87 boolean oldThreeBytesPerPixel = (wOffset == rOffset);
89 wOffset = (t >> 6) & 0b11;
90 rOffset = (t >> 4) & 0b11;
91 gOffset = (t >> 2) & 0b11;
100 boolean newThreeBytesPerPixel = (wOffset == rOffset);
101 if(newThreeBytesPerPixel != oldThreeBytesPerPixel)
updateLength(numLEDs);
107 extern "C" void ICACHE_RAM_ATTR espShow(
108 uint8_t pin, uint8_t *pixels, uint32_t numBytes, uint8_t type);
165 #if (F_CPU >= 7400000UL) && (F_CPU <= 9500000UL)
167 #ifdef NEO_KHZ400 // 800 KHz check needed only if 400 KHz support enabled
171 volatile uint8_t n1, n2 = 0;
187 #ifdef PORTD // PORTD isn't present on ATtiny85, etc.
191 hi = PORTD | pinMask;
192 lo = PORTD & ~pinMask;
194 if(b & 0x80) n1 = hi;
205 "out %[port] , %[hi]" "\n\t"
206 "mov %[n2] , %[lo]" "\n\t"
207 "out %[port] , %[n1]" "\n\t"
209 "sbrc %[byte] , 6" "\n\t"
210 "mov %[n2] , %[hi]" "\n\t"
211 "out %[port] , %[lo]" "\n\t"
214 "out %[port] , %[hi]" "\n\t"
215 "mov %[n1] , %[lo]" "\n\t"
216 "out %[port] , %[n2]" "\n\t"
218 "sbrc %[byte] , 5" "\n\t"
219 "mov %[n1] , %[hi]" "\n\t"
220 "out %[port] , %[lo]" "\n\t"
223 "out %[port] , %[hi]" "\n\t"
224 "mov %[n2] , %[lo]" "\n\t"
225 "out %[port] , %[n1]" "\n\t"
227 "sbrc %[byte] , 4" "\n\t"
228 "mov %[n2] , %[hi]" "\n\t"
229 "out %[port] , %[lo]" "\n\t"
232 "out %[port] , %[hi]" "\n\t"
233 "mov %[n1] , %[lo]" "\n\t"
234 "out %[port] , %[n2]" "\n\t"
236 "sbrc %[byte] , 3" "\n\t"
237 "mov %[n1] , %[hi]" "\n\t"
238 "out %[port] , %[lo]" "\n\t"
241 "out %[port] , %[hi]" "\n\t"
242 "mov %[n2] , %[lo]" "\n\t"
243 "out %[port] , %[n1]" "\n\t"
245 "sbrc %[byte] , 2" "\n\t"
246 "mov %[n2] , %[hi]" "\n\t"
247 "out %[port] , %[lo]" "\n\t"
250 "out %[port] , %[hi]" "\n\t"
251 "mov %[n1] , %[lo]" "\n\t"
252 "out %[port] , %[n2]" "\n\t"
254 "sbrc %[byte] , 1" "\n\t"
255 "mov %[n1] , %[hi]" "\n\t"
256 "out %[port] , %[lo]" "\n\t"
259 "out %[port] , %[hi]" "\n\t"
260 "mov %[n2] , %[lo]" "\n\t"
261 "out %[port] , %[n1]" "\n\t"
263 "sbrc %[byte] , 0" "\n\t"
264 "mov %[n2] , %[hi]" "\n\t"
265 "out %[port] , %[lo]" "\n\t"
266 "sbiw %[count], 1" "\n\t"
268 "out %[port] , %[hi]" "\n\t"
269 "mov %[n1] , %[lo]" "\n\t"
270 "out %[port] , %[n2]" "\n\t"
271 "ld %[byte] , %a[ptr]+" "\n\t"
272 "sbrc %[byte] , 7" "\n\t"
273 "mov %[n1] , %[hi]" "\n\t"
274 "out %[port] , %[lo]" "\n\t"
280 : [port]
"I" (_SFR_IO_ADDR(PORTD)),
285 }
else if(port == &PORTB) {
290 hi = PORTB | pinMask;
291 lo = PORTB & ~pinMask;
293 if(b & 0x80) n1 = hi;
297 "out %[port] , %[hi]" "\n\t"
298 "mov %[n2] , %[lo]" "\n\t"
299 "out %[port] , %[n1]" "\n\t"
301 "sbrc %[byte] , 6" "\n\t"
302 "mov %[n2] , %[hi]" "\n\t"
303 "out %[port] , %[lo]" "\n\t"
305 "out %[port] , %[hi]" "\n\t"
306 "mov %[n1] , %[lo]" "\n\t"
307 "out %[port] , %[n2]" "\n\t"
309 "sbrc %[byte] , 5" "\n\t"
310 "mov %[n1] , %[hi]" "\n\t"
311 "out %[port] , %[lo]" "\n\t"
313 "out %[port] , %[hi]" "\n\t"
314 "mov %[n2] , %[lo]" "\n\t"
315 "out %[port] , %[n1]" "\n\t"
317 "sbrc %[byte] , 4" "\n\t"
318 "mov %[n2] , %[hi]" "\n\t"
319 "out %[port] , %[lo]" "\n\t"
321 "out %[port] , %[hi]" "\n\t"
322 "mov %[n1] , %[lo]" "\n\t"
323 "out %[port] , %[n2]" "\n\t"
325 "sbrc %[byte] , 3" "\n\t"
326 "mov %[n1] , %[hi]" "\n\t"
327 "out %[port] , %[lo]" "\n\t"
329 "out %[port] , %[hi]" "\n\t"
330 "mov %[n2] , %[lo]" "\n\t"
331 "out %[port] , %[n1]" "\n\t"
333 "sbrc %[byte] , 2" "\n\t"
334 "mov %[n2] , %[hi]" "\n\t"
335 "out %[port] , %[lo]" "\n\t"
337 "out %[port] , %[hi]" "\n\t"
338 "mov %[n1] , %[lo]" "\n\t"
339 "out %[port] , %[n2]" "\n\t"
341 "sbrc %[byte] , 1" "\n\t"
342 "mov %[n1] , %[hi]" "\n\t"
343 "out %[port] , %[lo]" "\n\t"
345 "out %[port] , %[hi]" "\n\t"
346 "mov %[n2] , %[lo]" "\n\t"
347 "out %[port] , %[n1]" "\n\t"
349 "sbrc %[byte] , 0" "\n\t"
350 "mov %[n2] , %[hi]" "\n\t"
351 "out %[port] , %[lo]" "\n\t"
352 "sbiw %[count], 1" "\n\t"
353 "out %[port] , %[hi]" "\n\t"
354 "mov %[n1] , %[lo]" "\n\t"
355 "out %[port] , %[n2]" "\n\t"
356 "ld %[byte] , %a[ptr]+" "\n\t"
357 "sbrc %[byte] , 7" "\n\t"
358 "mov %[n1] , %[hi]" "\n\t"
359 "out %[port] , %[lo]" "\n\t"
361 : [byte]
"+r" (b), [n1]
"+r" (n1), [n2]
"+r" (n2), [count]
"+w" (i)
362 : [port]
"I" (_SFR_IO_ADDR(PORTB)), [ptr]
"e" (ptr), [hi]
"r" (hi),
382 volatile uint8_t next, bit;
384 hi = *port | pinMask;
385 lo = *port & ~pinMask;
391 "st %a[port], %[hi]" "\n\t"
392 "sbrc %[byte] , 7" "\n\t"
393 "mov %[next], %[hi]" "\n\t"
394 "st %a[port], %[next]" "\n\t"
395 "mov %[next] , %[lo]" "\n\t"
397 "breq nextbyte20" "\n\t"
399 "st %a[port], %[lo]" "\n\t"
405 "st %a[port], %[lo]" "\n\t"
407 "ldi %[bit] , 8" "\n\t"
408 "ld %[byte] , %a[ptr]+" "\n\t"
409 "sbiw %[count], 1" "\n\t"
411 : [port]
"+e" (port),
423 #elif (F_CPU >= 11100000UL) && (F_CPU <= 14300000UL)
425 #ifdef NEO_KHZ400 // 800 KHz check needed only if 400 KHz support enabled
436 volatile uint8_t next;
442 hi = PORTD | pinMask;
443 lo = PORTD & ~pinMask;
445 if(b & 0x80) next = hi;
451 "out %[port], %[hi]" "\n\t"
452 "rcall bitTimeD" "\n\t"
453 "out %[port], %[hi]" "\n\t"
454 "rcall bitTimeD" "\n\t"
455 "out %[port], %[hi]" "\n\t"
456 "rcall bitTimeD" "\n\t"
457 "out %[port], %[hi]" "\n\t"
458 "rcall bitTimeD" "\n\t"
459 "out %[port], %[hi]" "\n\t"
460 "rcall bitTimeD" "\n\t"
461 "out %[port], %[hi]" "\n\t"
462 "rcall bitTimeD" "\n\t"
463 "out %[port], %[hi]" "\n\t"
464 "rcall bitTimeD" "\n\t"
466 "out %[port] , %[hi]" "\n\t"
468 "ld %[byte] , %a[ptr]+" "\n\t"
469 "out %[port] , %[next]" "\n\t"
470 "mov %[next] , %[lo]" "\n\t"
471 "sbrc %[byte] , 7" "\n\t"
472 "mov %[next] , %[hi]" "\n\t"
474 "out %[port] , %[lo]" "\n\t"
475 "sbiw %[count], 1" "\n\t"
479 "out %[port], %[next]" "\n\t"
480 "mov %[next], %[lo]" "\n\t"
482 "sbrc %[byte], 7" "\n\t"
483 "mov %[next], %[hi]" "\n\t"
485 "out %[port], %[lo]" "\n\t"
491 : [port]
"I" (_SFR_IO_ADDR(PORTD)),
496 }
else if(port == &PORTB) {
500 hi = PORTB | pinMask;
501 lo = PORTB & ~pinMask;
503 if(b & 0x80) next = hi;
508 "out %[port], %[hi]" "\n\t"
509 "rcall bitTimeB" "\n\t"
510 "out %[port], %[hi]" "\n\t"
511 "rcall bitTimeB" "\n\t"
512 "out %[port], %[hi]" "\n\t"
513 "rcall bitTimeB" "\n\t"
514 "out %[port], %[hi]" "\n\t"
515 "rcall bitTimeB" "\n\t"
516 "out %[port], %[hi]" "\n\t"
517 "rcall bitTimeB" "\n\t"
518 "out %[port], %[hi]" "\n\t"
519 "rcall bitTimeB" "\n\t"
520 "out %[port], %[hi]" "\n\t"
521 "rcall bitTimeB" "\n\t"
522 "out %[port] , %[hi]" "\n\t"
524 "ld %[byte] , %a[ptr]+" "\n\t"
525 "out %[port] , %[next]" "\n\t"
526 "mov %[next] , %[lo]" "\n\t"
527 "sbrc %[byte] , 7" "\n\t"
528 "mov %[next] , %[hi]" "\n\t"
530 "out %[port] , %[lo]" "\n\t"
531 "sbiw %[count], 1" "\n\t"
535 "out %[port], %[next]" "\n\t"
536 "mov %[next], %[lo]" "\n\t"
538 "sbrc %[byte], 7" "\n\t"
539 "mov %[next], %[hi]" "\n\t"
541 "out %[port], %[lo]" "\n\t"
544 : [byte]
"+r" (b), [next]
"+r" (next), [count]
"+w" (i)
545 : [port]
"I" (_SFR_IO_ADDR(PORTB)), [ptr]
"e" (ptr), [hi]
"r" (hi),
558 volatile uint8_t next, bit;
560 hi = *port | pinMask;
561 lo = *port & ~pinMask;
567 "st %a[port], %[hi]" "\n\t"
568 "sbrc %[byte] , 7" "\n\t"
569 "mov %[next], %[hi]" "\n\t"
571 "st %a[port], %[next]" "\n\t"
576 "st %a[port], %[lo]" "\n\t"
579 "breq nextbyte30" "\n\t"
587 "ldi %[bit] , 8" "\n\t"
588 "ld %[byte] , %a[ptr]+" "\n\t"
589 "sbiw %[count], 1" "\n\t"
591 : [port]
"+e" (port),
603 #elif (F_CPU >= 15400000UL) && (F_CPU <= 19000000L)
605 #ifdef NEO_KHZ400 // 800 KHz check needed only if 400 KHz support enabled
615 volatile uint8_t next, bit;
617 hi = *port | pinMask;
618 lo = *port & ~pinMask;
624 "st %a[port], %[hi]" "\n\t"
625 "sbrc %[byte], 7" "\n\t"
626 "mov %[next], %[hi]" "\n\t"
628 "st %a[port], %[next]" "\n\t"
629 "mov %[next] , %[lo]" "\n\t"
630 "breq nextbyte20" "\n\t"
634 "st %a[port], %[lo]" "\n\t"
639 "ldi %[bit] , 8" "\n\t"
640 "ld %[byte] , %a[ptr]+" "\n\t"
641 "st %a[port], %[lo]" "\n\t"
643 "sbiw %[count], 1" "\n\t"
645 : [port]
"+e" (port),
662 volatile uint8_t next, bit;
664 hi = *port | pinMask;
665 lo = *port & ~pinMask;
671 "st %a[port], %[hi]" "\n\t"
672 "sbrc %[byte] , 7" "\n\t"
673 "mov %[next] , %[hi]" "\n\t"
676 "st %a[port], %[next]" "\n\t"
682 "st %a[port], %[lo]" "\n\t"
684 "mov %[next] , %[lo]" "\n\t"
686 "breq nextbyte40" "\n\t"
696 "ldi %[bit] , 8" "\n\t"
697 "ld %[byte] , %a[ptr]+" "\n\t"
699 "st %a[port], %[lo]" "\n\t"
701 "sbiw %[count], 1" "\n\t"
703 : [port]
"+e" (port),
715 #error "CPU SPEED NOT SUPPORTED"
716 #endif // end F_CPU ifdefs on __AVR__
721 #elif defined(__arm__)
725 #if defined(__MK20DX128__) || defined(__MK20DX256__) // Teensy 3.0 & 3.1
726 #define CYCLES_800_T0H (F_CPU / 4000000)
727 #define CYCLES_800_T1H (F_CPU / 1250000)
728 #define CYCLES_800 (F_CPU / 800000)
729 #define CYCLES_400_T0H (F_CPU / 2000000)
730 #define CYCLES_400_T1H (F_CPU / 833333)
731 #define CYCLES_400 (F_CPU / 400000)
734 *end = p + numBytes, pix, mask;
735 volatile uint8_t *
set = portSetRegister(pin),
736 *clr = portClearRegister(pin);
739 ARM_DEMCR |= ARM_DEMCR_TRCENA;
740 ARM_DWT_CTRL |= ARM_DWT_CTRL_CYCCNTENA;
742 #ifdef NEO_KHZ400 // 800 KHz check needed only if 400 KHz support enabled
745 cyc = ARM_DWT_CYCCNT + CYCLES_800;
748 for(mask = 0x80; mask; mask >>= 1) {
749 while(ARM_DWT_CYCCNT - cyc < CYCLES_800);
750 cyc = ARM_DWT_CYCCNT;
753 while(ARM_DWT_CYCCNT - cyc < CYCLES_800_T1H);
755 while(ARM_DWT_CYCCNT - cyc < CYCLES_800_T0H);
760 while(ARM_DWT_CYCCNT - cyc < CYCLES_800);
763 cyc = ARM_DWT_CYCCNT + CYCLES_400;
766 for(mask = 0x80; mask; mask >>= 1) {
767 while(ARM_DWT_CYCCNT - cyc < CYCLES_400);
768 cyc = ARM_DWT_CYCCNT;
771 while(ARM_DWT_CYCCNT - cyc < CYCLES_400_T1H);
773 while(ARM_DWT_CYCCNT - cyc < CYCLES_400_T0H);
778 while(ARM_DWT_CYCCNT - cyc < CYCLES_400);
782 #elif defined(__MKL26Z64__) // Teensy-LC
784 #if F_CPU == 48000000
787 bitmask = digitalPinToBitMask(pin);
788 volatile uint8_t *reg = portSetRegister(pin);
789 uint32_t num = numBytes;
792 "ldrb %[pix], [%[p], #0]" "\n\t"
793 "lsl %[pix], #24" "\n\t"
794 "movs %[count], #7" "\n\t"
796 "lsl %[pix], #1" "\n\t"
797 "bcs L%=_loop_one" "\n\t"
799 "strb %[bitmask], [%[reg], #0]" "\n\t"
800 "movs %[dly], #4" "\n\t"
801 "L%=_loop_delay_T0H:" "\n\t"
802 "sub %[dly], #1" "\n\t"
803 "bne L%=_loop_delay_T0H" "\n\t"
804 "strb %[bitmask], [%[reg], #4]" "\n\t"
805 "movs %[dly], #13" "\n\t"
806 "L%=_loop_delay_T0L:" "\n\t"
807 "sub %[dly], #1" "\n\t"
808 "bne L%=_loop_delay_T0L" "\n\t"
811 "strb %[bitmask], [%[reg], #0]" "\n\t"
812 "movs %[dly], #13" "\n\t"
813 "L%=_loop_delay_T1H:" "\n\t"
814 "sub %[dly], #1" "\n\t"
815 "bne L%=_loop_delay_T1H" "\n\t"
816 "strb %[bitmask], [%[reg], #4]" "\n\t"
817 "movs %[dly], #4" "\n\t"
818 "L%=_loop_delay_T1L:" "\n\t"
819 "sub %[dly], #1" "\n\t"
820 "bne L%=_loop_delay_T1L" "\n\t"
823 "sub %[count], #1" "\n\t"
824 "bne L%=_loop" "\n\t"
825 "lsl %[pix], #1" "\n\t"
826 "bcs L%=_last_one" "\n\t"
828 "strb %[bitmask], [%[reg], #0]" "\n\t"
829 "movs %[dly], #4" "\n\t"
830 "L%=_last_delay_T0H:" "\n\t"
831 "sub %[dly], #1" "\n\t"
832 "bne L%=_last_delay_T0H" "\n\t"
833 "strb %[bitmask], [%[reg], #4]" "\n\t"
834 "movs %[dly], #10" "\n\t"
835 "L%=_last_delay_T0L:" "\n\t"
836 "sub %[dly], #1" "\n\t"
837 "bne L%=_last_delay_T0L" "\n\t"
838 "b L%=_repeat" "\n\t"
840 "strb %[bitmask], [%[reg], #0]" "\n\t"
841 "movs %[dly], #13" "\n\t"
842 "L%=_last_delay_T1H:" "\n\t"
843 "sub %[dly], #1" "\n\t"
844 "bne L%=_last_delay_T1H" "\n\t"
845 "strb %[bitmask], [%[reg], #4]" "\n\t"
846 "movs %[dly], #1" "\n\t"
847 "L%=_last_delay_T1L:" "\n\t"
848 "sub %[dly], #1" "\n\t"
849 "bne L%=_last_delay_T1L" "\n\t"
852 "add %[p], #1" "\n\t"
853 "sub %[num], #1" "\n\t"
854 "bne L%=_begin" "\n\t"
858 [count]
"=&r" (count),
861 : [bitmask]
"r" (bitmask),
865 #error "Sorry, only 48 MHz is supported, please set Tools > CPU Speed to 48 MHz"
866 #endif // F_CPU == 48000000
868 #elif defined(__SAMD21G18A__) // Arduino Zero
873 uint8_t *ptr, *end, p, bitMask, portNum;
876 portNum = g_APinDescription[pin].ulPort;
877 pinMask = 1ul << g_APinDescription[pin].ulPin;
879 end = ptr + numBytes;
883 volatile uint32_t *
set = &(PORT->Group[portNum].OUTSET.reg),
884 *clr = &(PORT->Group[portNum].OUTCLR.reg);
886 #ifdef NEO_KHZ400 // 800 KHz check needed only if 400 KHz support enabled
891 asm(
"nop; nop; nop; nop; nop; nop; nop; nop;");
893 asm(
"nop; nop; nop; nop; nop; nop; nop; nop;"
894 "nop; nop; nop; nop; nop; nop; nop; nop;"
895 "nop; nop; nop; nop;");
899 asm(
"nop; nop; nop; nop; nop; nop; nop; nop;"
900 "nop; nop; nop; nop; nop; nop; nop; nop;"
901 "nop; nop; nop; nop;");
904 asm(
"nop; nop; nop; nop; nop; nop; nop; nop; nop;");
906 if(ptr >= end)
break;
915 asm(
"nop; nop; nop; nop; nop; nop; nop; nop; nop; nop; nop;");
917 asm(
"nop; nop; nop; nop; nop; nop; nop; nop;"
918 "nop; nop; nop; nop; nop; nop; nop; nop;"
919 "nop; nop; nop; nop; nop; nop; nop; nop;"
924 asm(
"nop; nop; nop; nop; nop; nop; nop; nop;"
925 "nop; nop; nop; nop; nop; nop; nop; nop;"
926 "nop; nop; nop; nop; nop; nop; nop; nop;"
929 asm(
"nop; nop; nop; nop; nop; nop; nop; nop;"
930 "nop; nop; nop; nop; nop; nop; nop; nop;"
931 "nop; nop; nop; nop; nop; nop; nop; nop;"
932 "nop; nop; nop; nop; nop; nop; nop; nop;");
934 asm(
"nop; nop; nop; nop; nop; nop; nop;");
936 if(ptr >= end)
break;
945 #else // Other ARM architecture -- Presumed Arduino Due
947 #define SCALE VARIANT_MCK / 2UL / 1000000UL
948 #define INST (2UL * F_CPU / VARIANT_MCK)
949 #define TIME_800_0 ((int)(0.40 * SCALE + 0.5) - (5 * INST))
950 #define TIME_800_1 ((int)(0.80 * SCALE + 0.5) - (5 * INST))
951 #define PERIOD_800 ((int)(1.25 * SCALE + 0.5) - (5 * INST))
952 #define TIME_400_0 ((int)(0.50 * SCALE + 0.5) - (5 * INST))
953 #define TIME_400_1 ((int)(1.20 * SCALE + 0.5) - (5 * INST))
954 #define PERIOD_400 ((int)(2.50 * SCALE + 0.5) - (5 * INST))
956 int pinMask, time0, time1, period, t;
958 volatile WoReg *portSet, *portClear, *timeValue, *timeReset;
959 uint8_t *p, *end, pix, mask;
961 pmc_set_writeprotect(
false);
962 pmc_enable_periph_clk((uint32_t)TC3_IRQn);
964 TC_CMR_WAVE | TC_CMR_WAVSEL_UP | TC_CMR_TCCLKS_TIMER_CLOCK1);
967 pinMask = g_APinDescription[pin].ulPin;
968 port = g_APinDescription[pin].pPort;
969 portSet = &(port->PIO_SODR);
970 portClear = &(port->PIO_CODR);
971 timeValue = &(TC1->TC_CHANNEL[0].TC_CV);
972 timeReset = &(TC1->TC_CHANNEL[0].TC_CCR);
978 #ifdef NEO_KHZ400 // 800 KHz check needed only if 400 KHz support enabled
992 for(t = time0;; t = time0) {
993 if(pix & mask) t = time1;
994 while(*timeValue < period);
996 *timeReset = TC_CCR_CLKEN | TC_CCR_SWTRG;
997 while(*timeValue < t);
998 *portClear = pinMask;
1005 while(*timeValue < period);
1013 #elif defined(ESP8266)
1018 espShow(pin, pixels, numBytes, is800KHz);
1032 if(begun && (pin >= 0)) pinMode(pin, INPUT);
1037 digitalWrite(p, LOW);
1040 port = portOutputRegister(digitalPinToPort(p));
1041 pinMask = digitalPinToBitMask(p);
1048 uint16_t n, uint8_t r, uint8_t g, uint8_t b) {
1052 r = (r * brightness) >> 8;
1053 g = (g * brightness) >> 8;
1054 b = (b * brightness) >> 8;
1057 if(wOffset == rOffset) {
1073 r = (uint8_t)(c >> 16),
1074 g = (uint8_t)(c >> 8),
1077 r = (r * brightness) >> 8;
1078 g = (g * brightness) >> 8;
1079 b = (b * brightness) >> 8;
1081 if(wOffset == rOffset) {
1085 uint8_t w = (uint8_t)(c >> 24);
1086 p[wOffset] = brightness ? ((w * brightness) >> 8) : w;
1097 return ((uint32_t)r << 16) | ((uint32_t)g << 8) | b;
1103 return ((uint32_t)w << 24) | ((uint32_t)r << 16) | ((uint32_t)g << 8) | b;
1108 if(n >= numLEDs)
return 0;
1112 if(wOffset == rOffset) {
1120 return (((uint32_t)(p[rOffset] << 8) / brightness) << 16) |
1121 (((uint32_t)(p[gOffset] << 8) / brightness) << 8) |
1122 ( (uint32_t)(p[bOffset] << 8) / brightness );
1125 return ((uint32_t)p[rOffset] << 16) |
1126 ((uint32_t)p[gOffset] << 8) |
1127 (uint32_t)p[bOffset];
1132 return (((uint32_t)(p[wOffset] << 8) / brightness) << 24) |
1133 (((uint32_t)(p[rOffset] << 8) / brightness) << 16) |
1134 (((uint32_t)(p[gOffset] << 8) / brightness) << 8) |
1135 ( (uint32_t)(p[bOffset] << 8) / brightness );
1137 return ((uint32_t)p[wOffset] << 24) |
1138 ((uint32_t)p[rOffset] << 16) |
1139 ((uint32_t)p[gOffset] << 8) |
1140 (uint32_t)p[bOffset];
1175 uint8_t newBrightness = b + 1;
1176 if(newBrightness != brightness) {
1180 oldBrightness = brightness - 1;
1182 if(oldBrightness == 0) scale = 0;
1183 else if(b == 255) scale = 65535 / oldBrightness;
1184 else scale = (((uint16_t)newBrightness << 8) - 1) / oldBrightness;
1185 for(uint16_t i=0; i<numBytes; i++) {
1187 *ptr++ = (c * scale) >> 8;
1189 brightness = newBrightness;
1195 return brightness - 1;
1199 memset(pixels, 0, numBytes);