From d46640b1458399f90540da9ee18328ef06ba7169 Mon Sep 17 00:00:00 2001 From: DashyFox Date: Wed, 24 Apr 2024 10:34:57 +0300 Subject: [PATCH] refactor --- IR_Decoder.cpp | 4 +- IR_Decoder.h | 2 +- IR_DecoderRaw.cpp | 10 ++- IR_DecoderRaw.h | 6 +- IR_config.cpp | 6 ++ IR_config.h | 167 ++++++++++++++++++++++++---------------------- 6 files changed, 105 insertions(+), 90 deletions(-) diff --git a/IR_Decoder.cpp b/IR_Decoder.cpp index eb829a4..4f23b1f 100644 --- a/IR_Decoder.cpp +++ b/IR_Decoder.cpp @@ -6,8 +6,8 @@ std::list& IR_Decoder::get_dec_list() // определение ф return dec_list; // возвращается ссылка на переменную } -IR_Decoder::IR_Decoder(const uint8_t isrPin, uint16_t addr, IR_Encoder *encPair) - : IR_DecoderRaw(isrPin, addr, encPair) +IR_Decoder::IR_Decoder(const uint8_t pin, uint16_t addr, IR_Encoder *encPair) + : IR_DecoderRaw(pin, addr, encPair) { get_dec_list().push_back(this); }; diff --git a/IR_Decoder.h b/IR_Decoder.h index 49004d6..ba6b696 100644 --- a/IR_Decoder.h +++ b/IR_Decoder.h @@ -24,7 +24,7 @@ public: PacketTypes::Request gotRequest; PacketTypes::BasePack gotRaw; - IR_Decoder(const uint8_t isrPin, uint16_t addr, IR_Encoder *encPair = nullptr); + IR_Decoder(const uint8_t pin, uint16_t addr, IR_Encoder *encPair = nullptr); ~IR_Decoder(); static void tick(); diff --git a/IR_DecoderRaw.cpp b/IR_DecoderRaw.cpp index 96d6b29..997b54a 100644 --- a/IR_DecoderRaw.cpp +++ b/IR_DecoderRaw.cpp @@ -1,8 +1,9 @@ #include "IR_DecoderRaw.h" #include "IR_Encoder.h" -IR_DecoderRaw::IR_DecoderRaw(const uint8_t isrPin, uint16_t addr, IR_Encoder *encPair) : isrPin(isrPin), encoder(encPair) +IR_DecoderRaw::IR_DecoderRaw(const uint8_t pin, uint16_t addr, IR_Encoder *encPair) : encoder(encPair) { + setPin(pin); id = addr; prevRise = prevFall = prevPrevFall = prevPrevRise = 0; if (encPair != nullptr) @@ -46,6 +47,11 @@ volatile uint32_t time_; void IR_DecoderRaw::isr() { + + if(isPairSending){ + return; + } + noInterrupts(); // time_ = HAL_GetTick() * 1000 + ((SysTick->LOAD + 1 - SysTick->VAL) * 1000) / SysTick->LOAD + 1; time_ = micros(); @@ -68,7 +74,7 @@ void IR_DecoderRaw::isr() oldTime = time_; FrontStorage edge; - edge.dir = digitalRead(isrPin); + edge.dir = port->IDR & mask; edge.time = time_; subBuffer.push(edge); diff --git a/IR_DecoderRaw.h b/IR_DecoderRaw.h index ce1d5e3..7f3c696 100644 --- a/IR_DecoderRaw.h +++ b/IR_DecoderRaw.h @@ -35,14 +35,12 @@ protected: bool availableRaw(); public: - const uint8_t isrPin; // Пин прерывания - ////////////////////////////////////////////////////////////////////////// /// @brief Конструктор - /// @param isrPin Номер вывода прерывания/данных от приёмника (2 или 3 для atmega 328p) + /// @param pin Номер вывода прерывания/данных от приёмника (2 или 3 для atmega 328p) /// @param addr Адрес приёмника /// @param encPair Указатель на передатчик, работающий в паре - IR_DecoderRaw(const uint8_t isrPin, uint16_t addr, IR_Encoder *encPair = nullptr); + IR_DecoderRaw(const uint8_t pin, uint16_t addr, IR_Encoder *encPair = nullptr); void isr(); // Функция прерывания void tick(); // Обработка приёмника, необходима для работы diff --git a/IR_config.cpp b/IR_config.cpp index 518261d..9ddae25 100644 --- a/IR_config.cpp +++ b/IR_config.cpp @@ -1,5 +1,11 @@ #include "IR_config.h" +void IR_FOX::setPin(uint8_t pin){ + this->pin = pin; + port = digitalPinToPort(pin); + mask = digitalPinToBitMask(pin); +} + void IR_FOX::checkAddressRuleApply(uint16_t address, uint16_t id, bool &flag) { flag = false; diff --git a/IR_config.h b/IR_config.h index 62882fc..df654dd 100644 --- a/IR_config.h +++ b/IR_config.h @@ -6,8 +6,9 @@ Для работы в паре положить декодер в энкодер -*/// Адресация с 1 до 65 499 -#define IR_Broadcast 65000 // 65 500 ~ 65 535 - широковещательные пакеты (всем), возможно разделить на 35 типов +*/ +// Адресация с 1 до 65 499 +#define IR_Broadcast 65000 // 65 500 ~ 65 535 - широковещательные пакеты (всем), возможно разделить на 35 типов /* Адрес 0 запрещен и зарезервирован под NULL, либо тесты IR_MSG_ACCEPT с адреса 0 воспринимается всеми устройствами @@ -40,59 +41,59 @@ msg type:                                         // | xxx..... | = тип сообщения                                         // | ...xxxxx | = длина (максимум 31 бита)                                         //  ---------- */ -#define IR_MSG_BACK 0U // | 000...... | = Задний сигнал машинки -#define IR_MSG_ACCEPT 1U // | 001..... | = подтверждение -#define IR_MSG_REQUEST 2U // | 010..... | = запрос -#define IR_MSG_ 3U // | 011..... | = ?? -#define IR_MSG_BACK_TO 4U // | 100..... | = Задний сигнал машинки c адресацией -#define IR_MSG_ 5U // | 101..... | = ?? -#define IR_MSG_DATA_NOACCEPT 6U // | 110..... | = данные, не требующие подтверждения -#define IR_MSG_DATA_ACCEPT 7U // | 111..... | = данные требующие подтверждения -;/*   // ---------- - -/``````````````````````````````` подтверждение `````````````````````````````\      /``````````````````````````````````````` запрос ``````````````````````````````````\ -                                                                                                                       -{``````````} [````````````````````````] [``````````````````] [``````````````]      {``````````} [````````````````````````] [````````````````````````] [``````````````] -{ msg type } [ addr_from uint16_t ] [=== customByte ===] [ CRC Bytes ]      { msg type } [ addr_from uint16_t ] [ addr_to uint16_t ] [ CRC Bytes ] -{..........} [........................] [..................] [..............]      {..........} [........................] [........................] [..............] -                                                                                                                                                             -{ 001..... } [addr_from_H][addr_from_L] [=== customByte ===] [ crc1 ][ crc2 ]      { 010..... } [addr_from_H][addr_from_L] [addr_from_H][addr_from_L] [ crc1 ][ crc2 ] -|     0            1           2                  3              4       5          |     0            1           2              3           4           5       6     -\________________________________________________________________/       |          \_____________________________________________________________________/       |     -|                                                                        |          |                                                                             |     -\________________________________________________________________________/          \_____________________________________________________________________________/     - -customByte - контрольная сумма принятых данных по poly1 - - - -/`````````````````````` Задний сигнал машинки без адресации ``````````````````````\         -                                                                                            -{``````````} [````````````````````````] [````````````````````````] [``````````````]         -{ msg type } [ addr_from uint16_t ] [====== data bytes ======] [ CRC Bytes ]         -{..........} [........................] [........................] [..............]         -                                                                                            -{ 0000xxxx } [addr_from_H][addr_from_L] [data_H][data_n..][data_L] [ crc1 ][ crc2 ]         -|     0           1            2            3                         |       |             -\_____________________________________________________________________/       |             -|                                                                             |             -\_____________________________________________________________________________/             - - - -/```````````````````````````````````` Задний сигнал машинки с адресацией ````````````````````````````````````\  -                                                                                     -{``````````} [````````````````````````] [````````````````````````] [````````````````````````] [``````````````]  -{ msg type } [ addr_from uint16_t ] [ addr_to uint16_t ] [====== data bytes ======] [ CRC Bytes ]  -{..........} [........................] [........................] [........................] [..............]  -                                                                                                                -{ 0001xxxx } [addr_from_H][addr_from_L] [addr_from_H][addr_from_L] [data_H][data_n..][data_L] [ crc1 ][ crc2 ]  -|     0           1            2              3           4            5                         |       |      -\________________________________________________________________________________________________/       |      -|                                                                                                        |      -\________________________________________________________________________________________________________/      - -*/ +#define IR_MSG_BACK 0U // | 000...... | = Задний сигнал машинки +#define IR_MSG_ACCEPT 1U // | 001..... | = подтверждение +#define IR_MSG_REQUEST 2U // | 010..... | = запрос +#define IR_MSG_ 3U // | 011..... | = ?? +#define IR_MSG_BACK_TO 4U // | 100..... | = Задний сигнал машинки c адресацией +#define IR_MSG_ 5U // | 101..... | = ?? +#define IR_MSG_DATA_NOACCEPT 6U // | 110..... | = данные, не требующие подтверждения +#define IR_MSG_DATA_ACCEPT 7U // | 111..... | = данные требующие подтверждения +; /*   // ---------- + + /``````````````````````````````` подтверждение `````````````````````````````\      /``````````````````````````````````````` запрос ``````````````````````````````````\ +                                                                                                                        + {``````````} [````````````````````````] [``````````````````] [``````````````]      {``````````} [````````````````````````] [````````````````````````] [``````````````] + { msg type } [ addr_from uint16_t ] [=== customByte ===] [ CRC Bytes ]      { msg type } [ addr_from uint16_t ] [ addr_to uint16_t ] [ CRC Bytes ] + {..........} [........................] [..................] [..............]      {..........} [........................] [........................] [..............] +                                                                                                                                                              + { 001..... } [addr_from_H][addr_from_L] [=== customByte ===] [ crc1 ][ crc2 ]      { 010..... } [addr_from_H][addr_from_L] [addr_from_H][addr_from_L] [ crc1 ][ crc2 ] + |     0            1           2                  3              4       5          |     0            1           2              3           4           5       6     + \________________________________________________________________/       |          \_____________________________________________________________________/       |     + |                                                                        |          |                                                                             |     + \________________________________________________________________________/          \_____________________________________________________________________________/     + + customByte - контрольная сумма принятых данных по poly1 + + + + /`````````````````````` Задний сигнал машинки без адресации ``````````````````````\         +                                                                                             + {``````````} [````````````````````````] [````````````````````````] [``````````````]         + { msg type } [ addr_from uint16_t ] [====== data bytes ======] [ CRC Bytes ]         + {..........} [........................] [........................] [..............]         +                                                                                             + { 0000xxxx } [addr_from_H][addr_from_L] [data_H][data_n..][data_L] [ crc1 ][ crc2 ]         + |     0           1            2            3                         |       |             + \_____________________________________________________________________/       |             + |                                                                             |             + \_____________________________________________________________________________/             + + + + /```````````````````````````````````` Задний сигнал машинки с адресацией ````````````````````````````````````\  +                                                                                      + {``````````} [````````````````````````] [````````````````````````] [````````````````````````] [``````````````]  + { msg type } [ addr_from uint16_t ] [ addr_to uint16_t ] [====== data bytes ======] [ CRC Bytes ]  + {..........} [........................] [........................] [........................] [..............]  +                                                                                                                 + { 0001xxxx } [addr_from_H][addr_from_L] [addr_from_H][addr_from_L] [data_H][data_n..][data_L] [ crc1 ][ crc2 ]  + |     0           1            2              3           4            5                         |       |      + \________________________________________________________________________________________________/       |      + |                                                                                                        |      + \________________________________________________________________________________________________________/      + + */ #define IR_MASK_MSG_TYPE 0b00000111 #define IR_MASK_MSG_INFO 0b00011111 @@ -101,14 +102,14 @@ customByte - контрольная сумма принятых данных п /////////////////////////////////////////////////////////////////////////////////////*/ typedef uint16_t crc_t; -#define BRUTEFORCE_CHECK // Перепроверяет пакет на 1 битные ошибки //TODO: зависает -#define bytePerPack 16 // колличество байтов в пакете +// #define BRUTEFORCE_CHECK // Перепроверяет пакет на 1 битные ошибки //TODO: зависает +#define bytePerPack 16 // колличество байтов в пакете #ifndef freeFrec #define freeFrec false #endif #ifndef subBufferSize -#define subBufferSize 5 //Буфер для складирования фронтов, пока их не обработают (передатчик) +#define subBufferSize 50 // Буфер для складирования фронтов, пока их не обработают (передатчик) #endif #define preambPulse 3 @@ -117,36 +118,35 @@ typedef uint16_t crc_t; ///////////////////////////////////////////////////////////////////////////////////// -#define bitPerByte 8U // Колличество бит в байте +#define bitPerByte 8U // Колличество бит в байте #define addrBytes 2 #define msgBytes 1 #define crcBytes 2 #define poly1 0x31 #define poly2 0x8C -#define syncBits 3U // количество битов синхронизации +#define syncBits 3U // количество битов синхронизации #define dataByteSizeMax (msgBytes + addrBytes + addrBytes + bytePerPack + crcBytes) -#define preambFronts (preambPulse*2) // количество фронтов преамбулы (Приём) +#define preambFronts (preambPulse * 2) // количество фронтов преамбулы (Приём) #define preambToggle ((bitPauseTakts * 2 + bitActiveTakts) * 2 - 1) // колличество переключений преамбулы (Передача) -#define carrierFrec 38000U // частота несущей (Приём/Передача) -#define carrierPeriod (1000000U/carrierFrec) // период несущей в us (Приём) +#define carrierFrec 38000U // частота несущей (Приём/Передача) +#define carrierPeriod (1000000U / carrierFrec) // период несущей в us (Приём) // В процессе работы значения будут отклонятся в соответствии с предыдущим битом -#define bitActiveTakts 25U // длительность высокого уровня в тактах -#define bitPauseTakts 12U // длительность низкого уровня в тактах +#define bitActiveTakts 25U // длительность высокого уровня в тактах +#define bitPauseTakts 12U // длительность низкого уровня в тактах -#define bitTakts (bitActiveTakts+bitPauseTakts) // Общая длительность бита в тактах -#define bitTime (bitTakts*carrierPeriod) // Общая длительность бита +#define bitTakts (bitActiveTakts + bitPauseTakts) // Общая длительность бита в тактах +#define bitTime (bitTakts * carrierPeriod) // Общая длительность бита #define tolerance 300U - - -class IR_FOX { +class IR_FOX +{ public: - - struct PackOffsets { + struct PackOffsets + { uint8_t msgOffset; uint8_t addrFromOffset; uint8_t addrToOffset; @@ -154,36 +154,41 @@ public: uint8_t crcOffset; }; - struct ErrorsStruct { + struct ErrorsStruct + { uint8_t lowSignal = 0; uint8_t highSignal = 0; uint8_t other = 0; - void reset() { + void reset() + { lowSignal = 0; highSignal = 0; other = 0; } uint16_t all() { return lowSignal + highSignal + other; } - }; - struct PackInfo { - uint8_t* buffer = nullptr; + struct PackInfo + { + uint8_t *buffer = nullptr; uint8_t packSize = 0; uint16_t crc = 0; ErrorsStruct err; uint16_t rTime = 0; }; - inline uint16_t getId() { return id; } inline void setId(uint16_t id) { this->id = id; } - static void checkAddressRuleApply(uint16_t address, uint16_t id, bool& flag); + static void checkAddressRuleApply(uint16_t address, uint16_t id, bool &flag); + void setPin(uint8_t pin); + inline uint8_t getPin(){return pin;}; protected: uint16_t id; + uint8_t pin; + GPIO_TypeDef *port; + uint16_t mask; ErrorsStruct errors; - uint8_t crc8(uint8_t* data, uint8_t start, uint8_t end, uint8_t poly); - + uint8_t crc8(uint8_t *data, uint8_t start, uint8_t end, uint8_t poly); };