diff --git a/IR_DecoderRaw.cpp b/IR_DecoderRaw.cpp index ae69bb9..56d02f2 100644 --- a/IR_DecoderRaw.cpp +++ b/IR_DecoderRaw.cpp @@ -26,7 +26,7 @@ void IR_DecoderRaw::isr() { if (firstUnHandledFront == &subBuffer[currentSubBufferIndex]) { // Если контроллер не успел обработать новый сигнал, принудительно пропускаем его firstUnHandledFront = firstUnHandledFront->next; isSubBufferOverflow = true; - + #ifdef IRDEBUG_INFO // Serial.println(); Serial.println(" ISR BUFFER OVERFLOW "); @@ -81,11 +81,12 @@ void IR_DecoderRaw::listenStart() { void IR_DecoderRaw::tick() { FrontStorage currentFront; - noInterrupts(); + uint8_t oldSREG = SREG; + cli(); listenStart(); - if (firstUnHandledFront == nullptr) { isSubBufferOverflow = false; interrupts(); return; } //Если данных нет - ничего не делаем + if (firstUnHandledFront == nullptr) { isSubBufferOverflow = false; SREG = oldSREG; return; } //Если данных нет - ничего не делаем currentFront = *((FrontStorage*)firstUnHandledFront); //найти следующий необработанный фронт/спад - interrupts(); + SREG = oldSREG; if (currentFront.next == nullptr) { isRecive = false; return; } //////////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -272,7 +273,12 @@ void IR_DecoderRaw::tick() { digitalWrite(writeOp, isPreamb); #endif //////////////////////////////////////////////////////////////////////////////////////////////////////////// - firstUnHandledFront = firstUnHandledFront->next; //переместить флаг на следующий элемент для обработки (next or nullptr) + oldSREG = SREG; + cli(); + if (firstUnHandledFront != nullptr) { + firstUnHandledFront = firstUnHandledFront->next; //переместить флаг на следующий элемент для обработки (next or nullptr) + } + SREG = oldSREG; } void IR_DecoderRaw::writeToBuffer(bool bit) {