debug startRX and m

This commit is contained in:
DashyFox 2024-02-15 16:50:21 +03:00
parent 408fea84ac
commit b517e4e6ad
5 changed files with 88 additions and 67 deletions

View File

@ -1,6 +1,8 @@
#include "IR_Decoder.h" #include "IR_Decoder.h"
#include "IR_Encoder.h" #include "IR_Encoder.h"
// #define IRDEBUG_INFO
#define checkAddr(h, l) (\ #define checkAddr(h, l) (\
((uint16_t)((dataBuffer[h] << 8) | dataBuffer[l]) == addrSelf) || \ ((uint16_t)((dataBuffer[h] << 8) | dataBuffer[l]) == addrSelf) || \
((uint16_t)((dataBuffer[h] << 8) | dataBuffer[l]) >= IR_Broadcast)\ ((uint16_t)((dataBuffer[h] << 8) | dataBuffer[l]) >= IR_Broadcast)\
@ -31,9 +33,11 @@ void IR_Decoder::isr() {
} else { } else {
if (firstUnHandledFront == &subBuffer[currentSubBufferIndex]) { // Если контроллер не успел обработать новый сигнал, принудительно пропускаем его if (firstUnHandledFront == &subBuffer[currentSubBufferIndex]) { // Если контроллер не успел обработать новый сигнал, принудительно пропускаем его
firstUnHandledFront = firstUnHandledFront->next; firstUnHandledFront = firstUnHandledFront->next;
#ifdef IRDEBUG_INFO
// Serial.println(); // Serial.println();
// Serial.println("ERROR"); // Serial.println("ERROR");
// Serial.println(); // Serial.println();
#endif
} }
} }
@ -50,6 +54,36 @@ void IR_Decoder::isr() {
//////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////
void IR_Decoder::start_RX() {
#ifdef IRDEBUG_INFO
Serial.print("\n>");
#endif
errors.reset();
isBufferOverflow = false;
isCrcCorrect = false;
bufBitPos = 0;
isData = true;
i_dataBuffer = 0;
nextControlBit = bitPerByte;
i_syncBit = 0;
isWrongPack = false;
isPreamb = true;
riseSyncTime = bitTime /* 1100 */;
memset(dataBuffer, 0x00, dataByteSizeMax);
}
void IR_Decoder::listen() {
if (isRecive && ((micros() - prevRise) > IR_timeout)) {
isRecive = false;
start_RX();
}
}
void IR_Decoder::tick() { void IR_Decoder::tick() {
listen(); listen();
if (firstUnHandledFront == nullptr) return; //Если данных нет - ничего не делаем if (firstUnHandledFront == nullptr) return; //Если данных нет - ничего не делаем
@ -61,15 +95,12 @@ void IR_Decoder::tick() {
interrupts(); interrupts();
//////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////
if (currentFront.time - prevRise > IR_timeout) { // первый if (currentFront.time - prevRise > IR_timeout * 2 /* && !isRecive */) { // первый
errors.reset();
isRecive = true;
isPreamb = true;
riseSyncTime = bitTime /* 1100 */;
start_RX();
preambFrontCounter = preambFronts - 1U; preambFrontCounter = preambFronts - 1U;
if (!currentFront.dir) {
isRecive = true;
}
} }
if (preambFrontCounter > 0) { // в преамбуле if (preambFrontCounter > 0) { // в преамбуле
@ -240,33 +271,12 @@ void IR_Decoder::tick() {
firstUnHandledFront = firstUnHandledFront->next; //переместить флаг на следующий элемент для обработки (next or nullptr) firstUnHandledFront = firstUnHandledFront->next; //переместить флаг на следующий элемент для обработки (next or nullptr)
} }
void IR_Decoder::listen() {
if (isRecive && micros() - prevRise > IR_timeout * 2) {
isRecive = false;
}
}
void IR_Decoder::start_RX() {
// Serial.println();
// Serial.println(printBytes(dataBuffer, dataByteSizeMax-1, BIN));
// Serial.println();
resetAvaliable();
isBufferOverflow = false;
memset(dataBuffer, 0x00, dataByteSizeMax);
bufBitPos = 0;
isData = true;
i_dataBuffer = 0;
nextControlBit = bitPerByte;
i_syncBit = 0;
isWrongPack = false;
}
void IR_Decoder::writeToBuffer(bool bit) { void IR_Decoder::writeToBuffer(bool bit) {
if (i_dataBuffer >= dataByteSizeMax * 8 - 1) {// проверка переполнения if (i_dataBuffer > dataByteSizeMax * 8) {// проверка переполнения
//TODO: Буффер переполнен! //TODO: Буффер переполнен!
#ifdef IRDEBUG_INFO
Serial.println("OverBuf");
#endif
isBufferOverflow = true; isBufferOverflow = true;
} }
if (isBufferOverflow || isPreamb || isWrongPack) return; if (isBufferOverflow || isPreamb || isWrongPack) return;
@ -277,12 +287,16 @@ void IR_Decoder::writeToBuffer(bool bit) {
isData = !isData; isData = !isData;
i_syncBit = 0; // сброс счетчика битов синхронизации i_syncBit = 0; // сброс счетчика битов синхронизации
err_syncBit = 0; // сброс счетчика ошибок синхронизации err_syncBit = 0; // сброс счетчика ошибок синхронизации
// Serial.print(" "); #ifdef IRDEBUG_INFO
Serial.print(" ");
#endif
} }
if (isData) { // Запись битов в dataBuffer if (isData) { // Запись битов в dataBuffer
// Serial.print(bit); #ifdef IRDEBUG_INFO
Serial.print(bit);
#endif
if (i_dataBuffer % 8 == 7) { if (i_dataBuffer % 8 == 7) {
// Serial.print("+"); // Serial.print("+");
@ -312,8 +326,10 @@ void IR_Decoder::writeToBuffer(bool bit) {
i_syncBit++; i_syncBit++;
} }
////////////////////// Проверка наличия битов синхранизации ////////////////////// ////////////////////// Проверка наличия битов синхранизации //////////////////////
isWrongPack = err_syncBit >= syncBits; isWrongPack = (err_syncBit >= syncBits);
// if (isWrongPack) Serial.print("****************"); #ifdef IRDEBUG_INFO
if (isWrongPack) Serial.print("****************");
#endif
}//**************************************************************************************************// }//**************************************************************************************************//
// Serial.print(bit); // Serial.print(bit);
@ -324,12 +340,20 @@ void IR_Decoder::writeToBuffer(bool bit) {
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//const auto testval = bufferBitSizeMax; //const auto testval = bufferBitSizeMax;
#ifdef IRDEBUG_INFO
if (isData) {
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 + addrBytes) * bitPerByte)) { Serial.print(" ->"); }
if (i_dataBuffer == ((dataBuffer[0] & IR_MASK_MSG_INFO) * bitPerByte)) { Serial.print(" <-"); }
}
#endif
if ((i_dataBuffer >= (8 * msgBytes)) && !isCrcCorrect) { if ((i_dataBuffer >= (8 * msgBytes)) && !isCrcCorrect) {
uint16_t crcValue; uint16_t crcValue;
switch ((dataBuffer[0] >> 5) & IR_MASK_MSG_TYPE) { switch ((dataBuffer[0] >> 5) & IR_MASK_MSG_TYPE) {
case IR_MSG_ACCEPT: case IR_MSG_ACCEPT:
if (i_dataBuffer >= ((msgBytes + addrBytes + crcBytes) * bitPerByte)) { if (i_dataBuffer >= ((msgBytes + addrBytes + crcBytes) * bitPerByte)) {
const uint8_t dataSize = msgBytes + addrBytes; constexpr uint8_t dataSize = msgBytes + addrBytes;
isCrcCorrect = crcCheck(dataSize, crcValue); isCrcCorrect = crcCheck(dataSize, crcValue);
if (isCrcCorrect && checkAddr(1, 2)) { if (isCrcCorrect && checkAddr(1, 2)) {
gotAccept._set(dataBuffer, msgBytes + addrBytes + crcBytes, crcValue, errors, riseSyncTime); gotAccept._set(dataBuffer, msgBytes + addrBytes + crcBytes, crcValue, errors, riseSyncTime);
@ -340,8 +364,8 @@ void IR_Decoder::writeToBuffer(bool bit) {
case IR_MSG_REQUEST: case IR_MSG_REQUEST:
if (i_dataBuffer >= ((msgBytes + addrBytes + addrBytes + crcBytes) * bitPerByte)) { if (i_dataBuffer >= ((msgBytes + addrBytes + addrBytes + crcBytes) * bitPerByte)) {
const uint8_t dataSize = msgBytes + addrBytes + addrBytes; constexpr uint8_t dataSize = msgBytes + addrBytes + addrBytes;
isCrcCorrect = (crcCheck(dataSize, crcValue)); isCrcCorrect = crcCheck(dataSize, crcValue);
if (isCrcCorrect && checkAddr(3, 4)) { if (isCrcCorrect && checkAddr(3, 4)) {
gotRequest._isAvaliable = true; gotRequest._isAvaliable = true;
gotRequest._set(dataBuffer, msgBytes + addrBytes + addrBytes + crcBytes, crcValue, errors, riseSyncTime); gotRequest._set(dataBuffer, msgBytes + addrBytes + addrBytes + crcBytes, crcValue, errors, riseSyncTime);
@ -353,15 +377,23 @@ void IR_Decoder::writeToBuffer(bool bit) {
case IR_MSG_DATA_ACCEPT: case IR_MSG_DATA_ACCEPT:
case IR_MSG_DATA_NOACCEPT: case IR_MSG_DATA_NOACCEPT:
if (i_dataBuffer >= ((dataBuffer[0] & IR_MASK_MSG_INFO) + crcBytes) * bitPerByte) { if (i_dataBuffer >= ((dataBuffer[0] & IR_MASK_MSG_INFO) + crcBytes) * bitPerByte) {
// Serial.println("OK"); #ifdef IRDEBUG_INFO
Serial.print(" IN ");
#endif
const uint8_t dataSize = (dataBuffer[0] & IR_MASK_MSG_INFO); const uint8_t dataSize = (dataBuffer[0] & IR_MASK_MSG_INFO);
isCrcCorrect = crcCheck(dataSize, crcValue); isCrcCorrect = crcCheck(dataSize, crcValue);
if (isCrcCorrect && checkAddr(3, 4)) { if (isCrcCorrect && checkAddr(3, 4)) {
#ifdef IRDEBUG_INFO
Serial.println(" OK ");
#endif
gotData._isAvaliable = true; gotData._isAvaliable = true;
gotData._set(dataBuffer, (dataSize)+crcBytes, crcValue, errors, riseSyncTime); gotData._set(dataBuffer, (dataSize)+crcBytes, crcValue, errors, riseSyncTime);
} else { } else {
gotRawData._isAvaliable = true; gotRawData._isAvaliable = true;
gotRawData._set(dataBuffer, (dataSize)+crcBytes, crcValue, errors, riseSyncTime); gotRawData._set(dataBuffer, (dataSize)+crcBytes, crcValue, errors, riseSyncTime);
#ifdef IRDEBUG_INFO
Serial.println(" NOT OK ");
#endif
} }
} }
break; break;
@ -392,10 +424,6 @@ bool IR_Decoder::crcCheck(uint8_t len, crc_t& crc) {
return crcOK; return crcOK;
} }
void IR_Decoder::resetAvaliable() {
isCrcCorrect = false;
}
uint16_t IR_Decoder::ceil_div(uint16_t val, uint16_t divider) { uint16_t IR_Decoder::ceil_div(uint16_t val, uint16_t divider) {
int ret = val / divider; int ret = val / divider;
if ((val << 4) / divider - (ret << 4) >= 8) if ((val << 4) / divider - (ret << 4) >= 8)

View File

@ -190,10 +190,10 @@ public:
/// @brief Контейнер с информацией подстройки /// @brief Контейнер с информацией подстройки
RawTune gotTune; RawTune gotTune;
const uint8_t isrPin; // Пин прерывания
private: private:
const uint8_t isrPin; // Пин прерывания
IR_Encoder* encoder; // Указатель на парный передатчик IR_Encoder* encoder; // Указатель на парный передатчик
volatile uint16_t isPairSending = 0; // Флаг передачи парного передатчика volatile uint16_t isPairSending = 0; // Флаг передачи парного передатчика
@ -261,8 +261,6 @@ private:
/// @brief Установка и сброс начальных значений и флагов в готовность к приёму данных /// @brief Установка и сброс начальных значений и флагов в готовность к приёму данных
void start_RX(); void start_RX();
/// @brief Сброс флагов доступности данных
void resetAvaliable();
/// @brief Целочисленное деление с округлением вверх /// @brief Целочисленное деление с округлением вверх
/// @param val Значение /// @param val Значение

View File

@ -31,6 +31,7 @@ IR_Encoder::~IR_Encoder() {
}; };
void IR_Encoder::sendData(uint16_t addrTo, uint8_t* data, uint8_t len, bool needAccept = false) { void IR_Encoder::sendData(uint16_t addrTo, uint8_t* data, uint8_t len, bool needAccept = false) {
if (len > bytePerPack) { return; }
constexpr uint8_t dataStart = msgBytes + addrBytes + addrBytes; constexpr uint8_t dataStart = msgBytes + addrBytes + addrBytes;
memset(sendBuffer, 0x00, dataByteSizeMax); memset(sendBuffer, 0x00, dataByteSizeMax);
uint8_t packSize = msgBytes + addrBytes + addrBytes + len + crcBytes; uint8_t packSize = msgBytes + addrBytes + addrBytes + len + crcBytes;
@ -122,14 +123,10 @@ void IR_Encoder::rawSend(uint8_t* ptr, uint8_t len) {
return; return;
} }
sendLen = len;
setDecoder_isSending(); setDecoder_isSending();
cli(); cli();
sendLen = len;
toggleCounter = preambToggle; // Первая генерация для первого signal toggleCounter = preambToggle; // Первая генерация для первого signal
dataBitCounter = bitPerByte - 1; dataBitCounter = bitPerByte - 1;

View File

@ -6,7 +6,6 @@
class IR_Decoder; class IR_Decoder;
class IR_Encoder : IR_FOX { class IR_Encoder : IR_FOX {
friend IR_Decoder; friend IR_Decoder;
friend void isr(IR_Encoder& e);
public: public:
uint16_t id; /// @brief Адрес передатчика uint16_t id; /// @brief Адрес передатчика
@ -35,7 +34,7 @@ public:
TCCR2B |= (1 << CS20); // Предделитель 1 TCCR2B |= (1 << CS20); // Предделитель 1
TIMSK2 |= (1 << OCIE2A); // Прерывание по совпадению TIMSK2 |= (1 << OCIE2A); // Прерывание по совпадению
#if F_CPU == 16000000 #if F_CPU == 16000000
OCR2A = /* 465 */((F_CPU / (38000*2)) - 2); //38кГц OCR2A = /* 465 */((F_CPU / (38000 * 2)) - 2); //38кГц
#elif F_CPU == 8000000 #elif F_CPU == 8000000
OCR2A = ((F_CPU / (38000 * 2)) - 2); //38кГц Частота_мк / (Предделитель * Частота * 2) OCR2A = ((F_CPU / (38000 * 2)) - 2); //38кГц Частота_мк / (Предделитель * Частота * 2)
#endif #endif
@ -56,7 +55,6 @@ public:
volatile bool ir_out_virtual; volatile bool ir_out_virtual;
private: private:
void IR_Encoder::setDecoder_isSending(); void IR_Encoder::setDecoder_isSending();
void _sendData(uint16_t addrTo, uint8_t* data, uint8_t len, uint8_t msgType);
void sendByte(uint8_t byte, bool* prev, bool LOW_FIRST); void sendByte(uint8_t byte, bool* prev, bool LOW_FIRST);
void addSync(bool* prev, bool* next); void addSync(bool* prev, bool* next);
void send_HIGH(bool = 1); void send_HIGH(bool = 1);

View File

@ -39,16 +39,16 @@ msg type:
                                        // | xxx..... | = тип сообщения                                         // | xxx..... | = тип сообщения
                                        // | ...xxxxx | = длина (максимум 32 бита)                                         // | ...xxxxx | = длина (максимум 32 бита)
                                        //  ---------- */                                         //  ---------- */
#define IR_MSG_ 0U // | 000..... | = = ?? #define IR_MSG_ 0U // | 000..... | = Задний сигнал машинки
#define IR_MSG_ACCEPT 1U // | 001..... | = */ /* = подтверждение #define IR_MSG_ACCEPT 1U // | 001..... | = подтверждение
#define IR_MSG_REQUEST 2U // | 010..... | = */ /* = запрос #define IR_MSG_REQUEST 2U // | 010..... | = запрос
#define IR_MSG_ 3U // | 011..... | = */ /* = ?? #define IR_MSG_ 3U // | 011..... | = ??
#define IR_MSG_ 4U // | 100..... | = */ /* = ?? #define IR_MSG_ 4U // | 100..... | = ??
#define IR_MSG_ 5U // | 101..... | = */ /* = ?? #define IR_MSG_ 5U // | 101..... | = ??
#define IR_MSG_DATA_NOACCEPT 6U // | 110..... | = */ /* = данные, не требующие подтверждения #define IR_MSG_DATA_NOACCEPT 6U // | 110..... | = данные, не требующие подтверждения
//                                      // | \\\xxxxx | = = L длина данных ;// // | \\\xxxxx | = длина данных
#define IR_MSG_DATA_ACCEPT 7U // | 111..... | = */ /* = данные требующие подтверждения #define IR_MSG_DATA_ACCEPT 7U // | 111..... | = данные требующие подтверждения
//                                      // | \\\xxxxx | = = L длина данных ;//                                     // | \\\xxxxx | = длина данных
/*   // ---------- /*   // ----------
/```````````````````` подтверждение ```````````````````\      /``````````````````````````````````````` запрос ``````````````````````````````````\ /```````````````````` подтверждение ```````````````````\      /``````````````````````````````````````` запрос ``````````````````````````````````\
@ -72,7 +72,7 @@ msg type:
/////////////////////////////////////////////////////////////////////////////////////*/ /////////////////////////////////////////////////////////////////////////////////////*/
typedef uint16_t crc_t; typedef uint16_t crc_t;
#define bytePerPack 3 // колличество байтов в пакете #define bytePerPack 16 // колличество байтов в пакете
#ifndef freeFrec #ifndef freeFrec
#define freeFrec true #define freeFrec true
#endif #endif