465 {
466
467
468
469
470 Wave8Byte lane_waves[16];
471
472
473 for (int symbol_idx = 0; symbol_idx < 8; symbol_idx++) {
474 u8 lane_bytes[16] = {0};
475
476
477 for (int pulse_idx = 0; pulse_idx < 8; pulse_idx++) {
478 int pulse_bit = 7 - pulse_idx;
479
480
481 int input_offset = symbol_idx * 16 + pulse_idx * 2;
482 u16 input_word = (u16)transposed[input_offset] |
483 ((u16)transposed[input_offset + 1] << 8);
484
485
486
487 for (int lane = 0; lane < 16; lane++) {
488
489 u8 pulse = (input_word >> lane) & 1;
490
491
492 lane_bytes[lane] |= (pulse << pulse_bit);
493 }
494 }
495
496
497 for (int lane = 0; lane < 16; lane++) {
498 lane_waves[lane].symbols[symbol_idx].data = lane_bytes[lane];
499 }
500 }
501
502
503 for (int lane = 0; lane < 16; lane++) {
504 fl::isr::memcpy(output + lane *
sizeof(Wave8Byte), &lane_waves[lane],
sizeof(Wave8Byte));
505 }
506}
FL_OPTIMIZE_FUNCTION FL_IRAM FASTLED_FORCE_INLINE void memcpy(void *FL_RESTRICT_PARAM dst, const void *FL_RESTRICT_PARAM src, size_t num_bytes)
ISR-optimized memcpy with alignment detection and switch dispatch.