From aa0b478229194b19c8944d4b53800ab59228222b Mon Sep 17 00:00:00 2001 From: DashyFox Date: Tue, 25 Feb 2025 15:17:09 +0300 Subject: [PATCH 1/3] faster for each --- IR_Encoder.cpp | 82 +++++++++++++++++++++++++++++++++++++------------- IR_Encoder.h | 5 +-- 2 files changed, 64 insertions(+), 23 deletions(-) diff --git a/IR_Encoder.cpp b/IR_Encoder.cpp index 75565d2..50c9e57 100644 --- a/IR_Encoder.cpp +++ b/IR_Encoder.cpp @@ -5,11 +5,8 @@ #define ISR_Out 10 #define TestOut 13 -std::list &IR_Encoder::get_enc_list() // определение функции -{ - static std::list dec_list; // статическая локальная переменная - return dec_list; // возвращается ссылка на переменную -} +IR_Encoder *IR_Encoder::head = nullptr; +IR_Encoder *IR_Encoder::last = nullptr; IR_Encoder::IR_Encoder(uint8_t pin, uint16_t addr, IR_DecoderRaw *decPair, bool autoHandle) { @@ -32,7 +29,15 @@ IR_Encoder::IR_Encoder(uint8_t pin, uint16_t addr, IR_DecoderRaw *decPair, bool if (autoHandle) { - get_enc_list().push_back(this); + if (IR_Encoder::head == nullptr) + { + IR_Encoder::head = this; + } + if (last != nullptr) + { + last->next = this; + } + last = this; } }; @@ -54,23 +59,60 @@ void IR_Encoder::begin(HardwareTimer timer, uint8_t channel, IRQn_Type IRQn){ void IR_Encoder::enable() { - auto &enc_list = get_enc_list(); - if (std::find(enc_list.begin(), enc_list.end(), this) == enc_list.end()) + bool exist = false; + IR_Encoder *current = IR_Encoder::head; + while (current != nullptr) { - enc_list.push_back(this); + exist = (current == this); + if (exist) break; + current = current->next; + } + if (!exist) + { + if (IR_Encoder::head == nullptr) + { + IR_Encoder::head = this; + last = this; + } + else + { + last->next = this; + last = this; + } + this->next = nullptr; // Указываем, что следующий за этим элементом — nullptr } pinMode(pin, OUTPUT); - } void IR_Encoder::disable() { - auto &enc_list = get_enc_list(); - auto it = std::find(enc_list.begin(), enc_list.end(), this); - if (it != enc_list.end()) + IR_Encoder *current = IR_Encoder::head; + IR_Encoder *prev = nullptr; + + while (current != nullptr) { - enc_list.erase(it); + if (current == this) break; + prev = current; + current = current->next; } + + if (current != nullptr) // Элемент найден в списке + { + if (prev != nullptr) + { + prev->next = current->next; // Убираем текущий элемент из списка + } + else + { + IR_Encoder::head = current->next; // Удаляемый элемент был первым + } + + if (current == last) + { + last = prev; // Если удаляется последний элемент, обновляем last + } + } + pinMode(pin, INPUT); } @@ -84,10 +126,7 @@ void IR_Encoder::setBlindDecoders(IR_DecoderRaw *decoders[], uint8_t count) blindDecoders = decoders; } -IR_Encoder::~IR_Encoder() -{ - get_enc_list().remove(this); -}; +IR_Encoder::~IR_Encoder(){}; void IR_Encoder::sendData(uint16_t addrTo, uint8_t dataByte, bool needAccept) { @@ -287,10 +326,11 @@ void IR_Encoder::rawSend(uint8_t *ptr, uint8_t len) void IR_Encoder::isr() { - // Serial.println(get_enc_list().size()); - for (const auto &element : get_enc_list()) + IR_Encoder *current = IR_Encoder::head; + while (current != nullptr) { - element->_isr(); + current->_isr(); + current = current->next; } } diff --git a/IR_Encoder.h b/IR_Encoder.h index 0540fae..4676827 100644 --- a/IR_Encoder.h +++ b/IR_Encoder.h @@ -7,7 +7,9 @@ class IR_DecoderRaw; class IR_Encoder : public IR_FOX { friend IR_DecoderRaw; - + static IR_Encoder *head; + static IR_Encoder *last; + IR_Encoder *next; public: static HardwareTimer IR_Timer; private: @@ -45,7 +47,6 @@ public: volatile bool ir_out_virtual; private: - static std::list& get_enc_list(); void _sendBack(bool isAdressed, uint16_t addrTo, uint8_t *data, uint8_t len); void _isr(); From 6ba8fdffe43c88b92bed7940d743b91ff8a42b84 Mon Sep 17 00:00:00 2001 From: DashyFox Date: Tue, 25 Feb 2025 18:05:10 +0300 Subject: [PATCH 2/3] auto begin --- IR_Encoder.cpp | 22 ++++++++++------------ IR_Encoder.h | 6 +++--- 2 files changed, 13 insertions(+), 15 deletions(-) diff --git a/IR_Encoder.cpp b/IR_Encoder.cpp index 50c9e57..bd56b2d 100644 --- a/IR_Encoder.cpp +++ b/IR_Encoder.cpp @@ -40,20 +40,18 @@ IR_Encoder::IR_Encoder(uint8_t pin, uint16_t addr, IR_DecoderRaw *decPair, bool last = this; } }; + +HardwareTimer* IR_Encoder::IR_Timer = nullptr; -HardwareTimer IR_Encoder::IR_Timer; +inline HardwareTimer* IR_Encoder::get_IR_Timer(){return IR_Encoder::IR_Timer;} -inline HardwareTimer* IR_Encoder::get_IR_Timer(){return &IR_Encoder::IR_Timer;} -// void Encoder_ISR(){ -// IR_Encoder::isr(); -// } -void IR_Encoder::begin(HardwareTimer timer, uint8_t channel, IRQn_Type IRQn){ - //TODO: check std::bind isr func - // IR_Timer = timer; - // IR_Timer.setOverflow(carrierFrec * 2, HERTZ_FORMAT); - // IR_Timer.attachInterrupt(channel, Encoder_ISR); - // NVIC_SetPriority(IRQn, 0); - // IR_Timer.resume(); +void IR_Encoder::begin(HardwareTimer* timer, uint8_t channel, IRQn_Type IRQn, uint8_t priority){ + IR_Timer = timer; + if(IR_Timer == nullptr) return; + IR_Timer->setOverflow(carrierFrec * 2, HERTZ_FORMAT); + IR_Timer->attachInterrupt(channel, IR_Encoder::isr); + NVIC_SetPriority(IRQn, priority); + IR_Timer->resume(); } diff --git a/IR_Encoder.h b/IR_Encoder.h index 4676827..21bac76 100644 --- a/IR_Encoder.h +++ b/IR_Encoder.h @@ -11,7 +11,7 @@ class IR_Encoder : public IR_FOX static IR_Encoder *last; IR_Encoder *next; public: - static HardwareTimer IR_Timer; + static HardwareTimer* IR_Timer; private: // uint16_t id; /// @brief Адрес передатчика public: @@ -21,7 +21,7 @@ public: /// @param decPair Приёмник, для которого отключается приём в момент передачи передатчиком IR_Encoder(uint8_t pin, uint16_t addr = 0, IR_DecoderRaw *decPair = nullptr, bool autoHandle = true); static void isr(); - static void begin(HardwareTimer IR_Timer, uint8_t channel, IRQn_Type IRQn); + static void begin(HardwareTimer* IR_Timer, uint8_t channel, IRQn_Type IRQn, uint8_t priority); static HardwareTimer* get_IR_Timer(); void enable(); @@ -46,9 +46,9 @@ public: ~IR_Encoder(); volatile bool ir_out_virtual; + void _isr(); private: void _sendBack(bool isAdressed, uint16_t addrTo, uint8_t *data, uint8_t len); - void _isr(); void setDecoder_isSending(); void sendByte(uint8_t byte, bool *prev, bool LOW_FIRST); From 2d839d3ff8a8c825fba66bc6946887216cacb284 Mon Sep 17 00:00:00 2001 From: DashyFox Date: Thu, 6 Mar 2025 17:05:37 +0300 Subject: [PATCH 3/3] HardwareTimer auto set support --- IR_Encoder.cpp | 4 ++-- IR_Encoder.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/IR_Encoder.cpp b/IR_Encoder.cpp index bd56b2d..d2a9582 100644 --- a/IR_Encoder.cpp +++ b/IR_Encoder.cpp @@ -45,11 +45,11 @@ HardwareTimer* IR_Encoder::IR_Timer = nullptr; inline HardwareTimer* IR_Encoder::get_IR_Timer(){return IR_Encoder::IR_Timer;} -void IR_Encoder::begin(HardwareTimer* timer, uint8_t channel, IRQn_Type IRQn, uint8_t priority){ +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->setOverflow(carrierFrec * 2, HERTZ_FORMAT); - IR_Timer->attachInterrupt(channel, IR_Encoder::isr); + IR_Timer->attachInterrupt(channel, (isrCallback == nullptr ? IR_Encoder::isr : isrCallback)); NVIC_SetPriority(IRQn, priority); IR_Timer->resume(); } diff --git a/IR_Encoder.h b/IR_Encoder.h index 21bac76..e28914a 100644 --- a/IR_Encoder.h +++ b/IR_Encoder.h @@ -21,7 +21,7 @@ public: /// @param decPair Приёмник, для которого отключается приём в момент передачи передатчиком IR_Encoder(uint8_t pin, uint16_t addr = 0, IR_DecoderRaw *decPair = nullptr, bool autoHandle = true); static void isr(); - static void begin(HardwareTimer* IR_Timer, uint8_t channel, IRQn_Type IRQn, uint8_t priority); + static void begin(HardwareTimer* timer, uint8_t channel, IRQn_Type IRQn, uint8_t priority, void(*isrCallback)() = nullptr); static HardwareTimer* get_IR_Timer(); void enable();