@brief Encode quad-lane LED data using wave8 + 4-lane transposition For ESP32-S3 quad-SPI mode (4 parallel data lines). Each set of 4 LED bytes expands to 32 bytes (4 Wave8Byte structures transposed). @param lanes Array of 4 lane spans (must all have same size) @param output Output buffer for transposed wave8 data @param lut Wave8 expansion lookup table @return Number of bytes written to output
| 125 | /// @param lut Wave8 expansion lookup table |
| 126 | /// @return Number of bytes written to output (lanes[0].size() * 32) |
| 127 | inline size_t wave8EncodeQuadLane( |
| 128 | fl::span<const u8> lanes[4], |
| 129 | fl::span<u8> output, |
| 130 | const Wave8BitExpansionLut& lut) FL_NOEXCEPT { |
| 131 | |
| 132 | const size_t lane_size = lanes[0].size(); |
| 133 | for (int i = 1; i < 4; i++) { |
| 134 | if (lanes[i].size() != lane_size) { |
| 135 | FL_WARN("wave8EncodeQuadLane: Lane size mismatch (lane0=" |
| 136 | << lane_size << " bytes, lane" << i << "=" << lanes[i].size() << " bytes)"); |
| 137 | return 0; |
| 138 | } |
| 139 | } |
| 140 | |
| 141 | const size_t required_size = lane_size * 32; |
| 142 | if (output.size() < required_size) { |
| 143 | FL_WARN("wave8EncodeQuadLane: Output buffer too small (need " |
| 144 | << required_size << " bytes, have " << output.size() << " bytes)"); |
| 145 | return 0; |
| 146 | } |
| 147 | |
| 148 | size_t output_idx = 0; |
| 149 | for (size_t i = 0; i < lane_size; i++) { |
| 150 | Wave8Byte wave8_lanes[4]; |
| 151 | for (int lane = 0; lane < 4; lane++) { |
| 152 | detail::wave8_convert_byte_to_wave8byte(lanes[lane][i], lut, &wave8_lanes[lane]); |
| 153 | } |
| 154 | |
| 155 | u8 transposed[4 * sizeof(Wave8Byte)]; |
| 156 | detail::wave8_transpose_4(wave8_lanes, transposed); |
| 157 | |
| 158 | fl::memcpy(output.data() + output_idx, transposed, sizeof(transposed)); |
| 159 | output_idx += sizeof(transposed); |
| 160 | } |
| 161 | |
| 162 | return output_idx; |
| 163 | } |
| 164 | |
| 165 | /// @brief Calculate required output buffer size for wave8 encoding |
| 166 | /// |
no test coverage detected