mirror of
				https://github.com/Show-maket/IR-protocol.git
				synced 2025-10-30 18:42:35 +00:00 
			
		
		
		
	fix forever loop ?
This commit is contained in:
		| @ -46,7 +46,7 @@ void IR_DecoderRaw::isr() { | |||||||
| void IR_DecoderRaw::firstRX() { | void IR_DecoderRaw::firstRX() { | ||||||
|  |  | ||||||
|     #ifdef IRDEBUG_INFO |     #ifdef IRDEBUG_INFO | ||||||
|     Serial.print("\n>"); |     Serial.print("\nRX>"); | ||||||
|     #endif |     #endif | ||||||
|  |  | ||||||
|     errors.reset(); |     errors.reset(); | ||||||
| @ -67,8 +67,9 @@ void IR_DecoderRaw::firstRX() { | |||||||
|     memset(dataBuffer, 0x00, dataByteSizeMax); |     memset(dataBuffer, 0x00, dataByteSizeMax); | ||||||
| } | } | ||||||
|  |  | ||||||
| void IR_DecoderRaw::listenEnd() { | void IR_DecoderRaw::listenStart() { | ||||||
|     if (isRecive && ((micros() - prevRise) > IR_timeout * 2)) { |     if (isRecive && ((micros() - prevRise) > IR_timeout * 2)) { | ||||||
|  |         Serial.print("\nlis>"); | ||||||
|         isRecive = false; |         isRecive = false; | ||||||
|         firstRX(); |         firstRX(); | ||||||
|     } |     } | ||||||
| @ -77,10 +78,11 @@ void IR_DecoderRaw::listenEnd() { | |||||||
| void IR_DecoderRaw::tick() { | void IR_DecoderRaw::tick() { | ||||||
|     FrontStorage currentFront; |     FrontStorage currentFront; | ||||||
|     noInterrupts(); |     noInterrupts(); | ||||||
|     listenEnd(); |     listenStart(); | ||||||
|     if (firstUnHandledFront == nullptr) { interrupts(); return; } //Если данных нет - ничего не делаем |     if (firstUnHandledFront == nullptr) { interrupts(); return; } //Если данных нет - ничего не делаем | ||||||
|     currentFront = *((FrontStorage*)firstUnHandledFront); //найти следующий необработанный фронт/спад |     currentFront = *((FrontStorage*)firstUnHandledFront); //найти следующий необработанный фронт/спад | ||||||
|     interrupts(); |     interrupts(); | ||||||
|  |     if (currentFront.next == nullptr) { isRecive = false; return; } | ||||||
|     //////////////////////////////////////////////////////////////////////////////////////////////////////////// |     //////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||||
|  |  | ||||||
|     if (currentFront.time > prevRise && currentFront.time - prevRise > IR_timeout * 2 && !isRecive) {  // первый  |     if (currentFront.time > prevRise && currentFront.time - prevRise > IR_timeout * 2 && !isRecive) {  // первый  | ||||||
| @ -101,7 +103,7 @@ void IR_DecoderRaw::tick() { | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     if (preambFrontCounter > 0) {     // в преамбуле |     if (preambFrontCounter > 0) {     // в преамбуле | ||||||
|         uint32_t risePeriod = currentFront.time - prevRise; |         risePeriod = currentFront.time - prevRise; | ||||||
|         if (currentFront.dir && risePeriod < IR_timeout) { //  __/``` ↑ и мы в внутри пакета |         if (currentFront.dir && risePeriod < IR_timeout) { //  __/``` ↑ и мы в внутри пакета | ||||||
|  |  | ||||||
|             if (risePeriod < riseTimeMin << 1) { // fix рваной единицы |             if (risePeriod < riseTimeMin << 1) { // fix рваной единицы | ||||||
| @ -276,7 +278,10 @@ void IR_DecoderRaw::writeToBuffer(bool bit) { | |||||||
|         #endif |         #endif | ||||||
|         isBufferOverflow = true; |         isBufferOverflow = true; | ||||||
|     } |     } | ||||||
|     if (isBufferOverflow || isPreamb || isWrongPack) return; |     if (isBufferOverflow || isPreamb || isWrongPack) { | ||||||
|  |         isRecive = false; | ||||||
|  |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     // Переключение флага, data или syncBit |     // Переключение флага, data или syncBit | ||||||
|     if (bufBitPos == nextControlBit) { |     if (bufBitPos == nextControlBit) { | ||||||
| @ -327,7 +332,7 @@ void IR_DecoderRaw::writeToBuffer(bool bit) { | |||||||
|             #ifdef IRDEBUG_INFO |             #ifdef IRDEBUG_INFO | ||||||
|             Serial.print("****************"); |             Serial.print("****************"); | ||||||
|             #endif |             #endif | ||||||
|             isRecive = false; |  | ||||||
|         }; |         }; | ||||||
|  |  | ||||||
|     }//**************************************************************************************************// |     }//**************************************************************************************************// | ||||||
| @ -345,11 +350,11 @@ void IR_DecoderRaw::writeToBuffer(bool bit) { | |||||||
|         if (i_dataBuffer == ((msgBytes)*bitPerByte)) { Serial.print(" -> "); Serial.print(dataBuffer[0] & IR_MASK_MSG_INFO); Serial.print(" ->"); } |         if (i_dataBuffer == ((msgBytes)*bitPerByte)) { Serial.print(" -> "); Serial.print(dataBuffer[0] & IR_MASK_MSG_INFO); Serial.print(" ->"); } | ||||||
|         if (i_dataBuffer == ((msgBytes + addrBytes) * bitPerByte)) { Serial.print("  |"); } |         if (i_dataBuffer == ((msgBytes + addrBytes) * bitPerByte)) { Serial.print("  |"); } | ||||||
|         if (i_dataBuffer == ((msgBytes + addrBytes + addrBytes) * bitPerByte)) { Serial.print("  ->"); } |         if (i_dataBuffer == ((msgBytes + addrBytes + addrBytes) * bitPerByte)) { Serial.print("  ->"); } | ||||||
|         if (i_dataBuffer == (((dataBuffer[0] & IR_MASK_MSG_INFO)-2) * bitPerByte)) { Serial.print("  <-"); } |         if (i_dataBuffer == (((dataBuffer[0] & IR_MASK_MSG_INFO) - 2) * bitPerByte)) { Serial.print("  <-"); } | ||||||
|     } |     } | ||||||
|     #endif |     #endif | ||||||
|  |  | ||||||
|     if (!isAvailable && isData) { |     if (!isAvailable && isData && !isWrongPack) { | ||||||
|         if (i_dataBuffer == 8 * msgBytes) {// Ппервый байт |         if (i_dataBuffer == 8 * msgBytes) {// Ппервый байт | ||||||
|             packSize = dataBuffer[0] & IR_MASK_MSG_INFO; |             packSize = dataBuffer[0] & IR_MASK_MSG_INFO; | ||||||
|             Serial.print(" ["); Serial.print(packSize); Serial.print("] "); |             Serial.print(" ["); Serial.print(packSize); Serial.print("] "); | ||||||
|  | |||||||
| @ -23,7 +23,7 @@ | |||||||
|  |  | ||||||
|  |  | ||||||
| class IR_Encoder; | class IR_Encoder; | ||||||
| class IR_DecoderRaw : public IR_FOX { | class IR_DecoderRaw : virtual public IR_FOX { | ||||||
|     friend IR_Encoder; |     friend IR_Encoder; | ||||||
| public: | public: | ||||||
|     const uint8_t isrPin;   // Пин прерывания  |     const uint8_t isrPin;   // Пин прерывания  | ||||||
| @ -37,16 +37,16 @@ public: | |||||||
|  |  | ||||||
|     void isr();     // Функция прерывания |     void isr();     // Функция прерывания | ||||||
|     void tick();    // Обработка приёмника, необходима для работы |     void tick();    // Обработка приёмника, необходима для работы | ||||||
|     bool available() { if(isAvailable) {isAvailable = false; return true;} else { return false;}}; |     bool available() { if (isAvailable) { isAvailable = false; return true; } else { return false; } }; | ||||||
|     bool isOverflow() { return isBufferOverflow; }; // Буффер переполнился  |     bool isOverflow() { return isBufferOverflow; }; // Буффер переполнился  | ||||||
|     bool isReciving() { return isBufferOverflow; }; // Возвращает true, если происходит приём пакета |     bool isReciving() { return isBufferOverflow; }; // Возвращает true, если происходит приём пакета | ||||||
|  |  | ||||||
|     ////////////////////////////////////////////////////////////////////////// |     ////////////////////////////////////////////////////////////////////////// | ||||||
| protected: | protected: | ||||||
|     PackInfo packInfo; |     PackInfo packInfo; | ||||||
|  |     uint16_t id; | ||||||
| private: | private: | ||||||
|     ErrorsStruct errors; |     ErrorsStruct errors; | ||||||
|     uint16_t id; |  | ||||||
|     bool isAvailable = false; |     bool isAvailable = false; | ||||||
|     uint16_t packSize; |     uint16_t packSize; | ||||||
|     uint16_t crcValue; |     uint16_t crcValue; | ||||||
| @ -71,14 +71,15 @@ private: | |||||||
|     volatile FrontStorage* firstUnHandledFront = nullptr;   // Указатель первого необработанного фронта/спада |     volatile FrontStorage* firstUnHandledFront = nullptr;   // Указатель первого необработанного фронта/спада | ||||||
|     volatile FrontStorage subBuffer[subBufferSize];         // вспомогательный буфер для хранения необработанных фронтов/спадов |     volatile FrontStorage subBuffer[subBufferSize];         // вспомогательный буфер для хранения необработанных фронтов/спадов | ||||||
|     //////////////////////////////////////////////////////////////////////// |     //////////////////////////////////////////////////////////////////////// | ||||||
|     uint8_t dataBuffer[dataByteSizeMax]{0};                             // Буффер данных |     uint8_t dataBuffer[dataByteSizeMax] { 0 };                             // Буффер данных | ||||||
|     uint32_t prevRise, prevPrevRise, prevFall, prevPrevFall;            // Время предыдущих фронтов/спадов |     uint32_t prevRise, prevPrevRise, prevFall, prevPrevFall;            // Время предыдущих фронтов/спадов | ||||||
|  |     uint32_t risePeriod; | ||||||
|     uint16_t errorCounter = 0;                                         // Счётчик ошибок |     uint16_t errorCounter = 0;                                         // Счётчик ошибок | ||||||
|     int8_t preambFrontCounter = 0;                                     // Счётчик __/``` ↑ преамбулы |     int8_t preambFrontCounter = 0;                                     // Счётчик __/``` ↑ преамбулы | ||||||
|     int16_t bufBitPos = 0;                                             // Позиция для записи бита в буффер |     int16_t bufBitPos = 0;                                             // Позиция для записи бита в буффер | ||||||
|  |  | ||||||
| private: | private: | ||||||
|     void listenEnd();  // @brief Слушатель для работы isReciving() |     void listenStart();  // @brief Слушатель для работы isReciving() | ||||||
|  |  | ||||||
|     /// @brief Проверка CRC. Проверяет len байт со значением crc, пришедшим в пакете |     /// @brief Проверка CRC. Проверяет len байт со значением crc, пришедшим в пакете | ||||||
|     /// @param len Длина в байтах проверяемых данных |     /// @param len Длина в байтах проверяемых данных | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user