FastLED 3.9.15
Loading...
Searching...
No Matches
spi.cpp.hpp
Go to the documentation of this file.
1// ok no header
2#include "fl/channels/spi.h"
4#include "fl/log/log.h"
5#include "fl/log/log.h"
6#include "fl/stl/noexcept.h"
7
8namespace fl {
9
10// Out-of-line destructor: ensures unique_ptr<MultiLaneDevice> destruction
11// happens here (in fl.spi+), not in every TU that includes spi.h.
12Spi::~Spi() FL_NOEXCEPT = default;
13
14// ============================================================================
15// Spi Constructors
16// ============================================================================
17
18Spi::Spi(int clock_pin, fl::span<const int> data_pins,
19 spi_output_mode_t output_mode,
20 u32 clock_speed_hz)
21 : Spi(SpiConfig(clock_pin, data_pins, clock_speed_hz, output_mode, 0)) {
22}
23
24Spi::Spi(const SpiConfig& config)
25 : is_ok(false), error_code(SPIError::NOT_INITIALIZED) {
26
27 // Validate number of lanes
28 size_t num_lanes = config.data_pins.size();
29 if (num_lanes < 1 || num_lanes > 8) {
30 FL_WARN("fl::Spi: Invalid number of data pins (" << num_lanes << "), must be 1-8");
31 error_code = SPIError::NOT_INITIALIZED;
32 return;
33 }
34
35 // Convert SpiConfig to MultiLaneDevice::Config
37 ml_config.clock_pin = static_cast<u8>(config.clock_pin);
38 ml_config.data_pins.resize(config.data_pins.size());
39 for (size_t i = 0; i < config.data_pins.size(); i++) {
40 ml_config.data_pins[i] = static_cast<u8>(config.data_pins[i]);
41 }
42 ml_config.clock_speed_hz = config.clock_speed_hz;
43 ml_config.mode = config.spi_mode;
44
45 // Create device
47 FL_DBG("fl::Spi: Created MultiLaneDevice with " << num_lanes << " lane(s)");
48
49 // Initialize device
50 auto begin_result = device->begin();
51 if (begin_result) {
52 // begin() returned an error (optional has a value)
53 FL_WARN("fl::Spi: begin() failed");
54 error_code = SPIError::NOT_INITIALIZED;
55 device.reset();
56 return;
57 }
58
59 is_ok = true;
60}
61
63 : device(fl::move(other.device))
64 , is_ok(other.is_ok)
65 , error_code(other.error_code) {
66 other.is_ok = false;
67}
68
70 if (this != &other) {
71 device = fl::move(other.device);
72 is_ok = other.is_ok;
73 error_code = other.error_code;
74 other.is_ok = false;
75 }
76 return *this;
77}
78
79bool Spi::wait(u32 timeout_ms) {
80 if (!device) {
81 return false;
82 }
83 return device->waitComplete(timeout_ms);
84}
85
86} // namespace fl
Multi-lane SPI interface for LED output Hardware (SPI_HW): 1-8 parallel data lanes Software (SPI_BITB...
~Spi() FL_NOEXCEPT
Destructor (defined out-of-line in spi.cpp.hpp to keep MultiLaneDevice destructor out of callers' com...
Spi() FL_NOEXCEPT
Default constructor - creates device in error state.
Definition spi.h:56
bool wait(u32 timeout_ms=0xFFFFFFFF)
Wait for async write operation to complete.
Definition spi.cpp.hpp:79
Spi & operator=(Spi &&other) FL_NOEXCEPT
Move assignment.
Definition spi.cpp.hpp:69
SPIError error_code
Definition spi.h:144
fl::unique_ptr< spi::MultiLaneDevice > device
Definition spi.h:142
bool is_ok
Definition spi.h:143
fl::size size() const FL_NOEXCEPT
void resize(fl::size n) FL_NOEXCEPT
Definition vector.h:593
#define FL_WARN(X)
Definition log.h:276
#define FL_DBG
Definition log.h:388
Centralized logging categories for FastLED hardware interfaces and subsystems.
Multi-lane SPI device for 2-8 independent LED strips.
constexpr remove_reference< T >::type && move(T &&t) FL_NOEXCEPT
Definition s16x16x4.h:28
unsigned char u8
Definition stdint.h:131
spi_output_mode_t
SPI output mode for multi-lane devices.
Definition config.h:25
fl::enable_if<!fl::is_array< T >::value, unique_ptr< T > >::type make_unique(Args &&... args) FL_NOEXCEPT
Definition unique_ptr.h:261
@ NOT_INITIALIZED
Object not initialized.
Definition expected.h:52
Base definition for an LED controller.
Definition crgb.hpp:179
#define FL_NOEXCEPT
u32 clock_speed_hz
Clock frequency in Hz (0xffffffff = as fast as possible)
Definition config.h:73
int clock_pin
SCK pin number.
Definition config.h:71
fl::vector< int > data_pins
Data pins (1 = single-lane, 2-8 = multi-lane)
Definition config.h:72
u8 spi_mode
SPI mode 0-3 (CPOL/CPHA)
Definition config.h:75
Configuration for SPI device (supports 1-8 lanes)
Definition config.h:44
u32 clock_speed_hz
Clock speed in Hz (0xffffffff = as fast as possible)
u8 clock_pin
Shared clock pin (SCK)
fl::vector< u8 > data_pins
Data pins (1-8 pins)
Configuration for multi-lane SPI.