MCPcopy Create free account
hub / github.com/FastLED/FastLED / finalizeTransmission

Method finalizeTransmission

src/platforms/shared/spi_manager.cpp.hpp:222–502  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

220}
221
222void SPIBusManager::finalizeTransmission(SPIBusHandle handle) FL_NOEXCEPT {
223 if (!handle.is_valid || handle.bus_id >= mNumBuses) {
224 return;
225 }
226
227 SPIBusInfo& bus = mBuses[handle.bus_id];
228 if (!bus.is_initialized) {
229 return; // Bus not initialized
230 }
231
232 // Only needed for multi-SPI modes (Dual-SPI, Quad-SPI, Octal-SPI, Hexadeca-SPI)
233 if (bus.bus_type != SPIBusType::DUAL_SPI &&
234 bus.bus_type != SPIBusType::QUAD_SPI &&
235 bus.bus_type != SPIBusType::OCTO_SPI &&
236 bus.bus_type != SPIBusType::HEXADECA_SPI) {
237 return;
238 }
239
240 // Handle Dual-SPI (runtime detection via getAll())
241 if (bus.bus_type == SPIBusType::DUAL_SPI) {
242 if (!bus.hw_controller) {
243 return;
244 }
245
246 // Find maximum lane size
247 size_t max_size = 0;
248 for (u8 i = 0; i < bus.num_devices && i < 2; i++) {
249 if (bus.devices[i].is_enabled && i < bus.lane_buffers.size()) {
250 max_size = fl::max(max_size, bus.lane_buffers[i].size());
251 }
252 }
253
254 if (max_size == 0) {
255 return; // No data to transmit
256 }
257
258 // Acquire DMA buffer (zero-copy API) - use polymorphic interface
259 DMABuffer result = bus.hw_controller->acquireDMABuffer(max_size);
260 if (!result.ok()) {
261 FL_WARN_FMT("SPI Bus Manager: Failed to acquire DMA buffer for Dual-SPI: " << static_cast<int>(result.error()));
262 // Clear buffers and bail
263 for (auto& lane_buffer : bus.lane_buffers) {
264 lane_buffer.clear();
265 }
266 return;
267 }
268 fl::span<u8> dma_buf = result.data();
269
270 // Prepare 2-lane data for transposer
271 fl::optional<SPITransposer::LaneData> lane0, lane1;
272 if (bus.num_devices > 0 && bus.devices[0].is_enabled && 0 < bus.lane_buffers.size()) {
273 lane0 = SPITransposer::LaneData{
274 bus.lane_buffers[0],
275 fl::span<const u8>() // No padding frame yet
276 };
277 }
278 if (bus.num_devices > 1 && bus.devices[1].is_enabled && 1 < bus.lane_buffers.size()) {
279 lane1 = SPITransposer::LaneData{

Callers 2

showPixelsDefaultMethod · 0.45

Calls 10

maxFunction · 0.85
sizeMethod · 0.45
acquireDMABufferMethod · 0.45
okMethod · 0.45
errorMethod · 0.45
clearMethod · 0.45
dataMethod · 0.45
transmitMethod · 0.45
waitCompleteMethod · 0.45
getMethod · 0.45

Tested by

no test coverage detected