| 178 | // ---------------------------------------------------------------------------- |
| 179 | |
| 180 | bool SPITransposer::transpose8(const fl::optional<LaneData> lanes[8], |
| 181 | fl::span<u8> output, |
| 182 | const char** error) { |
| 183 | // Validate output buffer size (must be divisible by 8) |
| 184 | if (output.size() % 8 != 0) { |
| 185 | if (error) { |
| 186 | *error = "Output buffer size must be divisible by 8"; |
| 187 | } |
| 188 | return false; |
| 189 | } |
| 190 | |
| 191 | // Calculate max lane size from output buffer |
| 192 | const size_t max_size = output.size() / 8; |
| 193 | |
| 194 | // Handle empty case |
| 195 | if (max_size == 0) { |
| 196 | if (error) { |
| 197 | *error = nullptr; // No error, just empty |
| 198 | } |
| 199 | return true; |
| 200 | } |
| 201 | |
| 202 | // Determine default padding byte from first available lane |
| 203 | u8 default_padding = 0x00; |
| 204 | for (size_t i = 0; i < 8; i++) { |
| 205 | if (lanes[i].has_value() && !lanes[i]->padding_frame.empty()) { |
| 206 | default_padding = lanes[i]->padding_frame[0]; |
| 207 | break; |
| 208 | } |
| 209 | } |
| 210 | |
| 211 | // Gather all bytes from each lane into temporary buffers |
| 212 | fl::vector<u8> lane_buffers[8]; |
| 213 | const u8* lane_ptrs[8]; |
| 214 | |
| 215 | for (size_t lane = 0; lane < 8; lane++) { |
| 216 | lane_buffers[lane].resize(max_size); |
| 217 | lane_ptrs[lane] = lane_buffers[lane].data(); |
| 218 | |
| 219 | for (size_t byte_idx = 0; byte_idx < max_size; byte_idx++) { |
| 220 | lane_buffers[lane][byte_idx] = lanes[lane].has_value() ? |
| 221 | getLaneByte(*lanes[lane], byte_idx, max_size) : default_padding; |
| 222 | } |
| 223 | } |
| 224 | |
| 225 | // Perform transposition using ISR-safe primitive |
| 226 | transpose_8lane_inline(lane_ptrs, output.data(), max_size); |
| 227 | |
| 228 | if (error) { |
| 229 | *error = nullptr; // Success, no error |
| 230 | } |
| 231 | return true; |
| 232 | } |
| 233 | |
| 234 | // interleave_byte_8way removed - now uses transpose_8lane_inline() primitive |
| 235 | |