339 {
340
341
342
343
344 Wave8Byte lane_waves[2];
345
346
347 for (int symbol_idx = 0; symbol_idx < 8; symbol_idx++) {
348
349 u16 interleaved = ((u16)transposed[symbol_idx * 2] << 8) |
350 transposed[symbol_idx * 2 + 1];
351
352
355
356
357
358 for (int bit = 0; bit < 8; bit++) {
359
360 if (interleaved & (1 << (bit * 2 + 1))) {
361 lane0_bits |= (1 << bit);
362 }
363
364 if (interleaved & (1 << (bit * 2))) {
365 lane1_bits |= (1 << bit);
366 }
367 }
368
369 lane_waves[0].symbols[symbol_idx].data = lane0_bits;
370 lane_waves[1].symbols[symbol_idx].data = lane1_bits;
371 }
372
373
375 fl::isr::memcopy(output +
sizeof(Wave8Byte), &lane_waves[1],
sizeof(Wave8Byte));
376}
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.