ESPHome 2026.5.0b1
Loading...
Searching...
No Matches
radio_frequency.h
Go to the documentation of this file.
1#pragma once
2
3// WARNING: This component is EXPERIMENTAL. The API may change at any time
4// without following the normal breaking changes policy. Use at your own risk.
5// Once the API is considered stable, this warning will be removed.
6
11
12#include <vector>
13
15
18 CAPABILITY_TRANSMITTER = 1 << 0, // Can transmit signals
19 CAPABILITY_RECEIVER = 1 << 1, // Can receive signals
20};
21
24 RADIO_FREQUENCY_MODULATION_OOK = 0, // On-Off Keying / Amplitude Shift Keying
25 // Future: RADIO_FREQUENCY_MODULATION_FSK, RADIO_FREQUENCY_MODULATION_GFSK, etc.
26};
27
29class RadioFrequency;
30
33 public:
34 explicit RadioFrequencyCall(RadioFrequency *parent) : parent_(parent) {}
35
38
41
42 // ===== Raw Timings Methods =====
43 // All set_raw_timings_* methods store pointers/references to external data.
44 // The referenced data must remain valid until perform() completes.
45 // Safe pattern: call.set_raw_timings_xxx(data); call.perform(); // synchronous
46 // Unsafe pattern: call.set_raw_timings_xxx(data); defer([call]() { call.perform(); }); // data may be gone!
47
51 RadioFrequencyCall &set_raw_timings(const std::vector<int32_t> &timings);
52
57 RadioFrequencyCall &set_raw_timings_base64url(const std::string &base64url);
58
62 RadioFrequencyCall &set_raw_timings_packed(const uint8_t *data, uint16_t length, uint16_t count);
63
66
68 void perform();
69
71 const optional<uint32_t> &get_frequency() const { return this->frequency_hz_; }
75 const std::vector<int32_t> &get_raw_timings() const { return *this->raw_timings_; }
77 bool has_raw_timings() const {
78 return this->raw_timings_ != nullptr || this->packed_data_ != nullptr || this->base64url_ptr_ != nullptr;
79 }
81 bool is_packed() const { return this->packed_data_ != nullptr; }
83 bool is_base64url() const { return this->base64url_ptr_ != nullptr; }
85 const std::string &get_base64url_data() const { return *this->base64url_ptr_; }
87 const uint8_t *get_packed_data() const { return this->packed_data_; }
88 uint16_t get_packed_length() const { return this->packed_length_; }
89 uint16_t get_packed_count() const { return this->packed_count_; }
91 uint32_t get_repeat_count() const { return this->repeat_count_; }
92
93 protected:
94 optional<uint32_t> frequency_hz_{};
97 // Pointer to vector-based timings (caller-owned, must outlive perform())
98 const std::vector<int32_t> *raw_timings_{nullptr};
99 // Pointer to base64url-encoded string (caller-owned, must outlive perform())
100 const std::string *base64url_ptr_{nullptr};
101 // Pointer to packed protobuf buffer (caller-owned, must outlive perform())
102 const uint8_t *packed_data_{nullptr};
103 uint16_t packed_length_{0};
104 uint16_t packed_count_{0};
106};
107
110 public:
111 bool get_supports_transmitter() const { return this->supports_transmitter_; }
112 void set_supports_transmitter(bool supports) { this->supports_transmitter_ = supports; }
113
114 bool get_supports_receiver() const { return this->supports_receiver_; }
115 void set_supports_receiver(bool supports) { this->supports_receiver_ = supports; }
116
122
125
128 this->frequency_min_hz_ = freq;
129 this->frequency_max_hz_ = freq;
130 }
131
136 this->supported_modulations_ |= (1u << static_cast<uint8_t>(mod));
137 }
138
139 protected:
140 uint32_t frequency_min_hz_{0}; // Minimum tunable frequency in Hz (0 = unspecified)
141 uint32_t frequency_max_hz_{0}; // Maximum tunable frequency in Hz (0 = unspecified)
142 uint32_t supported_modulations_{0}; // Bitmask of supported RadioFrequencyModulation values
145};
146
149 public:
150 RadioFrequency() = default;
151
152 void dump_config() override;
153 float get_setup_priority() const override { return setup_priority::AFTER_CONNECTION; }
154
157 const RadioFrequencyTraits &get_traits() const { return this->traits_; }
158
161
164
166 bool on_receive(remote_base::RemoteReceiveData data) override;
167
169 template<typename F> void add_on_receive_callback(F &&callback) {
170 this->receive_callback_.add(std::forward<F>(callback));
171 }
172
178 template<typename F> void add_on_control_callback(F &&callback) {
179 this->control_callback_.add(std::forward<F>(callback));
180 }
181
182 protected:
183 friend class RadioFrequencyCall;
184
187 virtual void control(const RadioFrequencyCall &call) = 0;
188
189 // Traits describing capabilities
191
192 // Callback manager for receive events (lazy: saves memory when no callbacks registered)
194 // Callback manager for on_control trigger (lazy: same memory savings)
196};
197
198} // namespace esphome::radio_frequency
RadioFrequencyCall - Builder pattern for transmitting radio frequency signals.
uint32_t get_repeat_count() const
Get the repeat count.
bool has_raw_timings() const
Check if raw timings have been set (any format)
RadioFrequencyCall & set_raw_timings_base64url(const std::string &base64url)
Set the raw timings from base64url-encoded little-endian int32 data.
RadioFrequencyCall & set_frequency(uint32_t frequency_hz)
Set the carrier frequency in Hz (e.g. 433920000 for 433.92 MHz)
const std::vector< int32_t > * raw_timings_
void perform()
Perform the transmission.
bool is_base64url() const
Check if using base64url data format.
RadioFrequencyCall & set_raw_timings_packed(const uint8_t *data, uint16_t length, uint16_t count)
Set the raw timings from packed protobuf sint32 data (zigzag + varint encoded)
RadioFrequencyCall & set_modulation(RadioFrequencyModulation modulation)
Set the modulation type (defaults to OOK)
RadioFrequencyCall & set_repeat_count(uint32_t count)
Set the number of times to repeat transmission (1 = transmit once, 2 = transmit twice,...
RadioFrequencyCall & set_raw_timings(const std::vector< int32_t > &timings)
Set the raw timings from a vector (positive = mark, negative = space)
const std::string & get_base64url_data() const
Get the base64url data string.
RadioFrequencyModulation get_modulation() const
Get the modulation type.
const uint8_t * get_packed_data() const
Get packed data (only valid if set via set_raw_timings_packed)
const optional< uint32_t > & get_frequency() const
Get the frequency in Hz.
bool is_packed() const
Check if using packed data format.
const std::vector< int32_t > & get_raw_timings() const
Get the raw timings (only valid if set via set_raw_timings)
RadioFrequency - Base class for radio frequency implementations.
RadioFrequencyCall make_call()
Create a call object for transmitting.
uint32_t get_capability_flags() const
Get capability flags for this radio frequency instance.
LazyCallbackManager< void(const RadioFrequencyCall &)> control_callback_
LazyCallbackManager< void(remote_base::RemoteReceiveData)> receive_callback_
bool on_receive(remote_base::RemoteReceiveData data) override
Called when RF data is received (from RemoteReceiverListener)
void add_on_receive_callback(F &&callback)
Add a callback to invoke when RF data is received.
const RadioFrequencyTraits & get_traits() const
virtual void control(const RadioFrequencyCall &call)=0
Perform the actual transmission (called by RadioFrequencyCall::perform()) Platforms must override thi...
void add_on_control_callback(F &&callback)
Add a callback to invoke when a transmit call is made on this entity.
RadioFrequencyTraits & get_traits()
Get the traits for this radio frequency implementation.
RadioFrequencyTraits - Describes the capabilities of a radio frequency implementation.
uint32_t get_frequency_min_hz() const
Hardware-supported tunable frequency range in Hz.
uint32_t get_supported_modulations() const
Bitmask of supported RadioFrequencyModulation values (bit N = modulation value N supported).
void set_fixed_frequency_hz(uint32_t freq)
Convenience setter for fixed-frequency hardware (sets min == max).
void add_supported_modulation(RadioFrequencyModulation mod)
RadioFrequencyModulation
Modulation types supported by radio frequency implementations.
RadioFrequencyCapability
Capability flags for individual radio frequency instances.
constexpr float AFTER_CONNECTION
For components that should be initialized after a data connection (API/MQTT) is connected.
Definition component.h:55
static void uint32_t
uint16_t length
Definition tt21100.cpp:0