11#if defined(USE_ESP32) && ESP_IDF_VERSION_MAJOR < 5
12#include <driver/rmt.h>
16namespace remote_base {
58 int32_t
peek(uint32_t offset = 0)
const {
return this->
data_[this->
index_ + offset]; }
62 bool peek_item(uint32_t mark, uint32_t space, uint32_t offset = 0)
const {
85 return int32_t(100 - this->
tolerance_) * length / 100U;
93 return int32_t(100 + this->
tolerance_) * length / 100U;
115#if ESP_IDF_VERSION_MAJOR >= 5
120 explicit RemoteRMTChannel(rmt_channel_t channel, uint8_t mem_block_num = 1);
128#if ESP_IDF_VERSION_MAJOR >= 5
131 const uint32_t ticks_per_ten_us = 80000000u / this->
clock_divider_ / 100000u;
133 return us * ticks_per_ten_us / 10;
136#if ESP_IDF_VERSION_MAJOR >= 5
139 const uint32_t ticks_per_ten_us = 80000000u / this->
clock_divider_ / 100000u;
141 return (ticks * 10) / ticks_per_ten_us;
144#if ESP_IDF_VERSION_MAJOR >= 5
176 template<
typename Protocol>
177 void transmit(
const typename Protocol::ProtocolData &data, uint32_t send_times = 1, uint32_t send_wait = 0) {
179 Protocol().encode(call.get_data(), data);
180 call.set_send_times(send_times);
181 call.set_send_wait(send_wait);
186 void send_(uint32_t send_times, uint32_t send_wait);
258 auto res = proto.decode(src);
259 return res.has_value() && *res == this->
data_;
274 auto res = proto.decode(src);
275 if (res.has_value()) {
290 template<
typename Protocol>
291 void transmit_(
const typename Protocol::ProtocolData &data, uint32_t send_times = 1, uint32_t send_wait = 0) {
298 TEMPLATABLE_VALUE(uint32_t, send_times)
299 TEMPLATABLE_VALUE(uint32_t, send_wait)
304 this->
encode(call.get_data(),
x...);
305 call.set_send_times(this->send_times_.value_or(
x..., 1));
306 call.set_send_wait(this->send_wait_.value_or(
x..., 0));
316 auto decoded = proto.decode(src);
317 if (!decoded.has_value())
319 proto.dump(*decoded);
324#define DECLARE_REMOTE_PROTOCOL_(prefix) \
325 using prefix##BinarySensor = RemoteReceiverBinarySensor<prefix##Protocol>; \
326 using prefix##Trigger = RemoteReceiverTrigger<prefix##Protocol>; \
327 using prefix##Dumper = RemoteReceiverDumper<prefix##Protocol>;
328#define DECLARE_REMOTE_PROTOCOL(prefix) DECLARE_REMOTE_PROTOCOL_(prefix)
RemoteComponentBase(InternalGPIOPin *pin)
virtual void dump(const ProtocolData &data)=0
virtual optional< ProtocolData > decode(RemoteReceiveData src)=0
virtual void encode(RemoteTransmitData *dst, const ProtocolData &data)=0
RemoteComponentBase * remote_base_
void config_rmt(rmt_config_t &rmt)
void set_rmt_symbols(uint32_t rmt_symbols)
uint32_t to_microseconds_(uint32_t ticks)
RemoteRMTChannel(uint8_t mem_block_num=1)
void set_clock_divider(uint8_t clock_divider)
uint32_t clock_resolution_
uint32_t from_microseconds_(uint32_t us)
void set_clock_resolution(uint32_t clock_resolution)
int32_t operator[](uint32_t index) const
uint32_t get_index() const
bool expect_item(uint32_t mark, uint32_t space)
bool peek_space(uint32_t length, uint32_t offset=0) const
int32_t peek(uint32_t offset=0) const
bool peek_item(uint32_t mark, uint32_t space, uint32_t offset=0) const
bool expect_space(uint32_t length)
int32_t upper_bound_(uint32_t length) const
bool expect_mark(uint32_t length)
bool is_valid(uint32_t offset=0) const
const RawTimings & get_raw_data() const
ToleranceMode tolerance_mode_
void advance(uint32_t amount=1)
RemoteReceiveData(const RawTimings &data, uint32_t tolerance, ToleranceMode tolerance_mode)
void set_tolerance(uint32_t tolerance, ToleranceMode tolerance_mode)
bool peek_space_at_least(uint32_t length, uint32_t offset=0) const
ToleranceMode get_tolerance_mode()
int32_t lower_bound_(uint32_t length) const
bool peek_mark(uint32_t length, uint32_t offset=0) const
bool expect_pulse_with_gap(uint32_t mark, uint32_t space)
ToleranceMode tolerance_mode_
std::vector< RemoteReceiverDumperBase * > dumpers_
std::vector< RemoteReceiverListener * > listeners_
void call_listeners_dumpers_()
void register_dumper(RemoteReceiverDumperBase *dumper)
std::vector< RemoteReceiverDumperBase * > secondary_dumpers_
void set_tolerance(uint32_t tolerance, ToleranceMode tolerance_mode)
void register_listener(RemoteReceiverListener *listener)
RemoteReceiverBase(InternalGPIOPin *pin)
virtual bool matches(RemoteReceiveData src)=0
RemoteReceiverBinarySensorBase()
bool on_receive(RemoteReceiveData src) override
void dump_config() override
RemoteReceiverBinarySensor()
void set_data(typename T::ProtocolData data)
bool matches(RemoteReceiveData src) override
virtual bool is_secondary()
virtual bool dump(RemoteReceiveData src)=0
bool dump(RemoteReceiveData src) override
virtual bool on_receive(RemoteReceiveData data)=0
bool on_receive(RemoteReceiveData src) override
uint32_t get_carrier_frequency() const
void space(uint32_t length)
void set_carrier_frequency(uint32_t carrier_frequency)
void mark(uint32_t length)
void item(uint32_t mark, uint32_t space)
const RawTimings & get_data() const
void set_data(const RawTimings &data)
void reserve(uint32_t len)
uint32_t carrier_frequency_
RemoteTransmitterBase * transmitter_
void set_transmitter(RemoteTransmitterBase *transmitter)
void transmit_(const typename Protocol::ProtocolData &data, uint32_t send_times=1, uint32_t send_wait=0)
RemoteTransmittable(RemoteTransmitterBase *transmitter)
void play(Ts... x) override
virtual void encode(RemoteTransmitData *dst, Ts... x)=0
void set_send_times(uint32_t send_times)
void set_send_wait(uint32_t send_wait)
TransmitCall(RemoteTransmitterBase *parent)
RemoteTransmitterBase * parent_
RemoteTransmitData * get_data()
void send_(uint32_t send_times, uint32_t send_wait)
RemoteTransmitterBase(InternalGPIOPin *pin)
void transmit(const typename Protocol::ProtocolData &data, uint32_t send_times=1, uint32_t send_wait=0)
virtual void send_internal(uint32_t send_times, uint32_t send_wait)=0
RemoteTransmitData temp_
Use same vector for all transmits, avoids many allocations.
std::vector< int32_t > RawTimings
@ TOLERANCE_MODE_PERCENTAGE
Providing packet encoding functions for exchanging data with a remote host.