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);