From 8a0d7f8dbaf3b27a14be3b7e1b48c4b92f4fd9e7 Mon Sep 17 00:00:00 2001 From: DashyFox Date: Fri, 6 Feb 2026 16:06:23 +0300 Subject: [PATCH] carrierPauseIfIdle/carrierResume --- IR_Encoder.cpp | 26 +++++++++++++++++++++++++- IR_Encoder.h | 5 +++++ 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/IR_Encoder.cpp b/IR_Encoder.cpp index 9393188..357dc60 100644 --- a/IR_Encoder.cpp +++ b/IR_Encoder.cpp @@ -7,6 +7,7 @@ IR_Encoder *IR_Encoder::head = nullptr; IR_Encoder *IR_Encoder::last = nullptr; +volatile bool IR_Encoder::carrierStopPending = false; IR_Encoder::IR_Encoder(uint8_t pin, uint16_t addr, IR_DecoderRaw *decPair, bool autoHandle) { @@ -47,13 +48,34 @@ HardwareTimer* IR_Encoder::IR_Timer = nullptr; inline HardwareTimer* IR_Encoder::get_IR_Timer(){return IR_Encoder::IR_Timer;} +void IR_Encoder::carrierResume() { + if (IR_Timer != nullptr) + IR_Timer->resume(); +} + +void IR_Encoder::carrierPauseIfIdle() { + for (IR_Encoder *p = head; p != nullptr; p = p->next) + if (p->isSending) + return; + if (IR_Timer != nullptr) + IR_Timer->pause(); +} + +void IR_Encoder::tick() { + if (!carrierStopPending) + return; + carrierStopPending = false; + carrierPauseIfIdle(); +} + void IR_Encoder::begin(HardwareTimer* timer, uint8_t channel, IRQn_Type IRQn, uint8_t priority, void(*isrCallback)()){ IR_Timer = timer; if(IR_Timer == nullptr) return; + IR_Timer->pause(); IR_Timer->setOverflow(carrierFrec * 2, HERTZ_FORMAT); IR_Timer->attachInterrupt(channel, (isrCallback == nullptr ? IR_Encoder::isr : isrCallback)); NVIC_SetPriority(IRQn, priority); - IR_Timer->resume(); + IR_Timer->pause(); } @@ -338,6 +360,7 @@ void IR_Encoder::rawSend(uint8_t *ptr, uint8_t len) { return; } + IR_Encoder::carrierResume(); // Serial.println("START"); setDecoder_isSending(); @@ -397,6 +420,7 @@ void IR_Encoder::_isr() isSending = false; // Serial.println("STOP"); setDecoder_isSending(); + carrierStopPending = true; // Serial.println(); return; break; diff --git a/IR_Encoder.h b/IR_Encoder.h index 39b0334..a2ca8ac 100644 --- a/IR_Encoder.h +++ b/IR_Encoder.h @@ -32,6 +32,8 @@ public: static void isr(); static void begin(HardwareTimer* timer, uint8_t channel, IRQn_Type IRQn, uint8_t priority, void(*isrCallback)() = nullptr); static HardwareTimer* get_IR_Timer(); + /** Call from main loop/tick: if ISR requested carrier stop, pause timer here (not in ISR). */ + static void tick(); void enable(); void disable(); @@ -69,6 +71,9 @@ public: void _isr(); private: + static volatile bool carrierStopPending; + static void carrierResume(); + static void carrierPauseIfIdle(); IR_SendResult _sendBack(bool isAdressed, uint16_t addrTo, uint8_t *data, uint8_t len); void setDecoder_isSending();