426 {
427
428
429
430
431 Wave8Byte lane_waves[8];
432
433
434 for (int symbol_idx = 0; symbol_idx < 8; symbol_idx++) {
435 u8 lane_bytes[8] = {0, 0, 0, 0, 0, 0, 0, 0};
436
437
438
439
440 for (int byte_idx = 0; byte_idx < 8; byte_idx++) {
441 u8 input_byte = transposed[symbol_idx * 8 + byte_idx];
442
443
444
445 int pulse_bit = 7 - byte_idx;
446
447
448
449 for (int lane = 0; lane < 8; lane++) {
450
451 u8 pulse = (input_byte >> lane) & 1;
452
453
454 lane_bytes[lane] |= (pulse << pulse_bit);
455 }
456 }
457
458
459 for (int lane = 0; lane < 8; lane++) {
460 lane_waves[lane].symbols[symbol_idx].data = lane_bytes[lane];
461 }
462 }
463
464
465 for (int lane = 0; lane < 8; lane++) {
466 fl::isr::memcopy(output + lane *
sizeof(Wave8Byte), &lane_waves[lane],
sizeof(Wave8Byte));
467 }
468}
FL_OPTIMIZE_FUNCTION FL_IRAM FASTLED_FORCE_INLINE void memcopy(void *FL_RESTRICT_PARAM dst, const void *FL_RESTRICT_PARAM src, size_t num_bytes)
ISR-optimized memcpy with alignment detection and switch dispatch.