11#if defined(USE_LIBRETINY_VARIANT_RTL8720C) || defined(REMOTE_TRANSMITTER_BK_PWM)
15static const char *
const TAG =
"remote_transmitter";
18static constexpr uint32_t STALL_MARGIN_MS = 1000;
22static constexpr uint32_t MAX_ONE_SHOT_US = 50000;
27static RemoteTransmitterComponent *
volatile s_active_transmitter =
nullptr;
28static uint32_t s_expected_end_ms = 0;
33 auto *transmitter = s_active_transmitter;
34 if (transmitter !=
nullptr)
41 const uint32_t chunk = std::max(
uint32_t(1), std::min(duration_us, MAX_ONE_SHOT_US));
49 const int32_t item = this->
isr_data_[index];
91 s_active_transmitter =
nullptr;
101 s_active_transmitter =
nullptr;
104 ESP_LOGE(TAG,
"Envelope timer stalled; transmission aborted");
122 auto *active = s_active_transmitter;
123 if (active ==
nullptr)
125 if ((int32_t) (
millis() - s_expected_end_ms) > 0) {
126 active->abort_stalled_chain_();
145 uint64_t frame_us = 0;
147 frame_us +=
uint32_t(item > 0 ? item : -item);
148 const uint64_t total_us = frame_us * send_times + uint64_t(send_wait) * (send_times - 1);
149 s_expected_end_ms =
millis() +
uint32_t(total_us / 1000) + STALL_MARGIN_MS;
151 s_active_transmitter =
this;
158 ESP_LOGW(TAG,
"Cannot send: PWM not initialized");
164 if (send_times == 0) {
171 ESP_LOGD(TAG,
"Sending remote code");
176 ESP_LOGW(TAG,
"Empty data");
194 if ((int32_t) (
millis() - s_expected_end_ms) > 0) {
212 if ((int32_t) (
millis() - s_expected_end_ms) <= 0)
void feed_wdt()
Feed the task watchdog.
void status_set_warning()
void enable_loop()
Enable this component's loop.
void disable_loop()
Disable this component's loop.
void status_clear_warning()
void trigger(const Ts &...x) ESPHOME_ALWAYS_INLINE
Inform the parent automation that the event has triggered.
uint32_t get_carrier_frequency() const
const RawTimings & get_data() const
RemoteTransmitData temp_
Use same vector for all transmits, avoids many allocations.
void advance_envelope_isr()
void send_internal(uint32_t send_times, uint32_t send_wait) override
bool envelope_ready_() const
void arm_envelope_timer_(uint32_t duration_us)
void write_envelope_level_(bool mark)
static void advance_active_isr()
void arm_chain_(uint32_t send_times, uint32_t send_wait)
Trigger complete_trigger_
void abort_stalled_chain_()
void stop_envelope_timer_()
void deliver_completion_()
volatile bool transmitting_
volatile uint32_t isr_wait_remaining_
void start_isr_item_(size_t index)
Trigger transmit_trigger_
volatile size_t isr_index_
std::vector< int32_t > isr_data_
void prepare_carrier_(uint32_t carrier_frequency)
volatile uint32_t isr_repeats_left_
void arm_one_shot_(uint32_t duration_us)
volatile bool isr_in_gap_
void HOT delay(uint32_t ms)
uint32_t IRAM_ATTR HOT millis()
Application App
Global storage of Application pointer - only one Application can exist.