FastLED 3.10.8
Loading...
Searching...
No Matches
channel.cpp.hpp
Go to the documentation of this file.
2
3#include "fl/log/log.h"
4#include "fl/stl/atomic.h"
5#include "fl/stl/string.h"
6
7namespace fl {
8
9namespace {
10
12 RxConfig out;
13 out.buffer_size = config.edge_capacity;
14 out.hz = config.hz;
15 out.signal_range_min_ns = config.signal_range_min_ns;
16 out.signal_range_max_ns = config.signal_range_max_ns;
17 out.skip_signals = config.skip_signals;
18 out.start_low = config.start_low;
19 out.io_loop_back = config.io_loop_back;
20 out.use_dma = config.use_dma;
21 out.stream_timing = config.stream_timing;
22 return out;
23}
24
48
49} // namespace
50
52 static fl::atomic<i32> gNextRxChannelId(0);
53 return gNextRxChannelId.fetch_add(1);
54}
55
57 if (!config_name.empty()) {
58 return config_name;
59 }
60 // Mirrors Channel::makeName's release-build gate (#2942/#2943).
61 // mName is consumed only by FL_WARN/FL_ERROR sites that collapse to
62 // do-while-0 when FASTLED_LOG_VERBOSITY=0 (NDEBUG default per #2890),
63 // so the string + fl::to_string<i64> + heap concat run for nothing
64 // in release. See #2954.
65#if FASTLED_LOG_RUNTIME_ENABLED
66 return "RxChannel_" + fl::to_string(static_cast<i64>(id));
67#else
68 (void)id;
69 return {};
70#endif
71}
72
74 return fl::make_shared<RxChannel>(config, createBackendDevice(config));
75}
76
83
85
87 return mDevice ? mDevice->getPin() : mConfig.pin;
88}
89
91 return mConfig.backend;
92}
93
95 if (!mConfig.affinity.empty()) {
96 return mConfig.affinity;
97 }
98 return mDevice ? fl::string(mDevice->name()) : fl::string();
99}
100
102 bool recreate_device = !mDevice ||
103 config.pin != mConfig.pin ||
104 config.backend != mConfig.backend;
105 if (recreate_device) {
106 mDevice = createBackendDevice(config);
107 }
108 if (!config.name.empty()) {
109 mName = config.name;
110 }
111 mConfig = config;
112 return mDevice ? mDevice->begin(toRxConfig(mConfig)) : false;
113}
114
116 return mDevice ? mDevice->lastBeginError() : "rx_device_unavailable";
117}
118
120 if (!config.name.empty()) {
121 mName = config.name;
122 }
123 mConfig = config;
124}
125
127 return mDevice ? mDevice->finished() : true;
128}
129
131 return mDevice ? mDevice->wait(timeout_ms) : RxWaitResult::TIMEOUT;
132}
133
141
143 return mDevice ? mDevice->getRawEdgeTimes(out, offset) : 0;
144}
145
147 return mDevice ? mDevice->injectEdges(edges) : false;
148}
149
150} // namespace fl
T fetch_add(T value) FL_NO_EXCEPT
Definition atomic.h:159
fl::shared_ptr< RxDevice > mDevice
Definition channel.h:65
bool injectEdges(fl::span< const EdgeTime > edges) FL_NO_EXCEPT
size_t getRawEdgeTimes(fl::span< EdgeTime > out, size_t offset=0) FL_NO_EXCEPT
const i32 mId
Definition channel.h:62
const char * lastBeginError() const FL_NO_EXCEPT
fl::result< u32, DecodeError > decode(const ChipsetTiming4Phase &timing, fl::span< u8 > out) FL_NO_EXCEPT
bool finished() const FL_NO_EXCEPT
static i32 nextId() FL_NO_EXCEPT
RxBackend backend() const FL_NO_EXCEPT
The capture backend this channel was created with.
RxChannelConfig mConfig
Definition channel.h:64
fl::string getEngineName() const FL_NO_EXCEPT
virtual ~RxChannel() FL_NO_EXCEPT
static fl::string makeName(i32 id, const fl::string &config_name) FL_NO_EXCEPT
static RxChannelPtr create(const RxChannelConfig &config) FL_NO_EXCEPT
int getPin() const FL_NO_EXCEPT
void setConfig(const RxChannelConfig &config) FL_NO_EXCEPT
const RxChannelConfig & config() const FL_NO_EXCEPT
Definition channel.h:46
fl::string mName
Definition channel.h:63
RxWaitResult wait(u32 timeout_ms) FL_NO_EXCEPT
RxChannel(const RxChannelConfig &config, fl::shared_ptr< RxDevice > device) FL_NO_EXCEPT
bool begin(const RxChannelConfig &config) FL_NO_EXCEPT
static fl::shared_ptr< RxDevice > create(int pin) FL_NO_EXCEPT
Template factory method to create RX device by type.
static expected failure(E err, const char *msg=nullptr) FL_NO_EXCEPT
Create error result.
Definition expected.h:115
fl::UISlider offset("Offset", 0.0f, 0.0f, 1.0f, 0.01f)
Centralized logging categories for FastLED hardware interfaces and subsystems.
constexpr remove_reference< T >::type && move(T &&t) FL_NO_EXCEPT
Definition move.h:30
shared_ptr< T > make_shared(Args &&... args) FL_NO_EXCEPT
Definition shared_ptr.h:423
static fl::shared_ptr< RxDevice > createBackendDevice(const RxChannelConfig &config) FL_NO_EXCEPT
static RxConfig toRxConfig(const RxChannelConfig &config) FL_NO_EXCEPT
u8 u8 fract8 blur_amount FL_NO_EXCEPT
Definition blur.h:186
AtomicFake< T > atomic
Definition atomic.h:26
RxBackend
Definition types.h:8
@ I2S_RX
Classic-ESP32 I2S 1-bit oversampling backend — DMA sampling at 16 MHz, capture length limited by RAM ...
Definition types.h:17
@ LPC_SCT_CAPTURE
LPC8xx SCT input-capture + DMA edge backend (LPC845 et al). Capture path is a skeleton until follow-u...
Definition types.h:15
@ FLEXPWM
Teensy 4.x-only FlexPWM capture backend.
Definition types.h:13
@ PIO
RP2040/RP2350 PIO receive backend.
Definition types.h:9
@ FLEXIO
Teensy 4.x-only FlexIO capture backend (FLEXIO1 — FLEXIO2 is owned by the WS2812 TX driver)....
Definition types.h:14
@ PLATFORM_DEFAULT
Use the recommended backend for the active platform (RMT on ESP32; FlexPWM on Teensy 4....
Definition types.h:10
@ RMT
ESP32-only RMT capture backend.
Definition types.h:11
@ ISR
Platform-neutral interrupt-driven edge capture backend when available.
Definition types.h:12
@ PARLIO_RX
PARLIO 1-bit oversampling backend (ESP32-C6 et al) — DMA sampling at 16 MHz with no per-edge interrup...
Definition types.h:16
expected< T, E > result
Alias for expected (Rust-style naming)
Definition result.h:31
string to_string(T value) FL_NO_EXCEPT
Definition string.h:459
RxWaitResult
Result codes for RX wait() operations.
Definition rx.h:152
@ TIMEOUT
Operation timed out.
Definition rx.h:154
@ INVALID_ARGUMENT
Invalid input arguments.
Definition rx.h:72
Base definition for an LED controller.
Definition crgb.hpp:179
4-phase RX timing thresholds for chipset detection
Definition rx.h:88
fl::i64 i64
Definition stdint.h:221
u32 skip_signals
Number of signals to skip before capturing (default: 0)
Definition rx.h:231
fl::optional< ChipsetTiming4Phase > stream_timing
Definition rx.h:256
u32 signal_range_min_ns
Minimum pulse width (glitch filter, default: 100ns)
Definition rx.h:229
size_t buffer_size
Buffer size in symbols/edges (default: 512)
Definition rx.h:225
bool start_low
Pin idle state: true=LOW (WS2812B), false=HIGH (inverted)
Definition rx.h:232
bool use_dma
Use DMA streaming for RX (RMT only, default: false)
Definition rx.h:250
u32 signal_range_max_ns
Maximum pulse width (idle threshold, default: 100μs)
Definition rx.h:230
fl::optional< u32 > hz
Optional clock frequency (RMT only, default: 40MHz)
Definition rx.h:226
bool io_loop_back
Enable internal RMT loopback (RMT only, default: false)
Definition rx.h:240
Configuration for RX device initialization.
Definition rx.h:223