BF1 for 4-lane Wave8.
Output: 8 symbols × 4 bytes = 32 bytes. Each byte packs 2 pulses × 4 lanes — high nibble = earlier pulse, low nibble = later pulse; within each nibble, lanes 0..3 in bits 0..3.
372 {
375 const u8 D_byte =
W0 ^
W1;
376 for (int p = 0; p < 8; ++p) {
377 const int shift = 7 - p;
378 d_mask[p] = ((D_byte >> shift) & 1) ? 0xFFu : 0x00u;
379 m0_mask[p] = ((
W0 >> shift) & 1) ? 0xFFu : 0x00u;
380 }
381
382
383
389 cols[0] =
static_cast<u8>(aLo);
390 cols[1] =
static_cast<u8>(aLo >> 8);
391 cols[2] =
static_cast<u8>(aLo >> 16);
392 cols[3] =
static_cast<u8>(aLo >> 24);
393 cols[4] =
static_cast<u8>(bLo);
394 cols[5] =
static_cast<u8>(bLo >> 8);
395 cols[6] =
static_cast<u8>(bLo >> 16);
396 cols[7] =
static_cast<u8>(bLo >> 24);
397 for (int s = 0; s < 8; ++s) {
398 const u8 col = cols[s];
399 for (int k = 0; k < 4; ++k) {
400 const int p_hi = 2 * k;
401 const int p_lo = 2 * k + 1;
402 const u8 hi =
static_cast<u8>((m0_mask[p_hi] & 0xF0u) ^ ((col << 4) & d_mask[p_hi]));
403 const u8 lo =
static_cast<u8>((m0_mask[p_lo] & 0x0Fu) ^ (col & d_mask[p_lo]));
404 output[s * 4 + k] =
static_cast<u8>(hi | lo);
405 }
406 }
407}
FASTLED_FORCE_INLINE u32 spreadA(u8 v)
Pulses 7,6,5,4 of v (byte j = bit (7-j)). Depends only on the high nibble.
FASTLED_FORCE_INLINE u32 spreadB(u8 v)
Pulses 3,2,1,0 of v (byte j = bit (3-j)). Depends only on the low nibble.