mirror of
https://github.com/Show-maket/IR-protocol.git
synced 2026-04-28 03:08:08 +00:00
dma fix priority and debug
This commit is contained in:
@ -2,17 +2,19 @@
|
||||
#include "IR_config.h"
|
||||
#include "RingBuffer.h"
|
||||
|
||||
// #define IRDEBUG
|
||||
class Print;
|
||||
|
||||
#define IRDEBUG
|
||||
|
||||
#ifdef IRDEBUG
|
||||
#define wrHigh PA1 // Запись HIGH инициирована // green
|
||||
#define wrLow PA0 // Запись LOW инициирована // blue
|
||||
#define writeOp PA5 // Операция записи, 1 пульс для 0 и 2 для 1 // orange
|
||||
#define wrHigh 255 // Запись HIGH инициирована // green
|
||||
#define wrLow 255 // Запись LOW инициирована // blue
|
||||
#define writeOp 255 // Операция записи, 1 пульс для 0 и 2 для 1 // orange
|
||||
// Исправленные ошибки // purle
|
||||
// 1 пульс: fix
|
||||
#define errOut PA4
|
||||
#define up PA3
|
||||
#define down PA2
|
||||
#define errOut 255
|
||||
#define up 255
|
||||
#define down 255
|
||||
#endif
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
@ -51,6 +53,14 @@ public:
|
||||
bool isSubOverflow();
|
||||
volatile inline bool isReciving() { return isRecive; }; // Возвращает true, если происходит приём пакета
|
||||
|
||||
#if defined(IR_EDGE_TRACE)
|
||||
void edgeTraceClear();
|
||||
bool edgeTraceOverflow() const { return edgeTrace_overflow; }
|
||||
uint16_t edgeTracePendingCount() const;
|
||||
/** При непустом кольце: перевод строки + @IRF1v1: + hex; в tick() сброс на Serial автоматически. См. ref/IR_EDGE_TRACE_FORMAT.md */
|
||||
uint16_t edgeTraceFlushChunk(Print &out, uint16_t maxRec = 48);
|
||||
#endif
|
||||
|
||||
/// Кадр собран по длине из заголовка, но CRC не сошёлся — один раз можно прочитать копию сырых байтов.
|
||||
bool availableReject();
|
||||
uint8_t getRejectSize() const { return rejectPackSize; }
|
||||
@ -92,6 +102,20 @@ private:
|
||||
|
||||
RingBuffer<FrontStorage, subBufferSize> subBuffer;
|
||||
|
||||
#if defined(IR_EDGE_TRACE)
|
||||
struct IrEdgeTraceRec
|
||||
{
|
||||
uint32_t t_us;
|
||||
uint8_t level;
|
||||
uint8_t flags;
|
||||
};
|
||||
void edgeTracePush(uint32_t t_us, uint8_t level, uint8_t flags);
|
||||
IrEdgeTraceRec edgeTrace_buf[IR_EDGE_TRACE_CAPACITY]{};
|
||||
volatile uint16_t edgeTrace_w = 0;
|
||||
volatile uint16_t edgeTrace_r = 0;
|
||||
volatile bool edgeTrace_overflow = false;
|
||||
#endif
|
||||
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
uint8_t dataBuffer[dataByteSizeMax]{0}; // Буффер данных
|
||||
volatile uint32_t prevRise, prevPrevRise, prevFall, prevPrevFall; // Время предыдущих фронтов/спадов
|
||||
@ -130,8 +154,8 @@ bool isReciveRaw;
|
||||
uint8_t err_syncBit; // Счётчик ошибок синхронизации
|
||||
|
||||
/// @brief Запиь бита в буффер, а так же проверка битов синхранизации и их фильтрация
|
||||
/// @param Бит данных
|
||||
void writeToBuffer(bool);
|
||||
/// @param packTraceInvertFix если true — в IRDEBUG_SERIAL_PACK бит в трассе пишется как `0`/`1` (исправление по фронтам)
|
||||
void writeToBuffer(bool bit, bool packTraceInvertFix = false);
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
|
||||
void firstRX(); /// @brief Установка и сброс начальных значений и флагов в готовность к приёму данных
|
||||
@ -147,4 +171,30 @@ bool isReciveRaw;
|
||||
inline void errPulse(uint8_t pin, uint8_t count);
|
||||
inline void infoPulse(uint8_t pin, uint8_t count);
|
||||
#endif
|
||||
|
||||
#if defined(IRDEBUG_SERIAL_PACK)
|
||||
static constexpr uint16_t kPackTraceBufCap =
|
||||
uint16_t(dataByteSizeMax) * (uint16_t(bitPerByte) + uint16_t(syncBits)) + 48u;
|
||||
|
||||
void packTraceResetFrame();
|
||||
void packTracePushBit(bool bit);
|
||||
void packTracePushChar(char c);
|
||||
/** Помечает в packTraceBitBuf бит (после BRUTEFORCE_CHECK) обёрткой `0`/`1` по финальному значению в dataBuffer. */
|
||||
void packTraceWrapDataBitInBackticks(uint16_t byteIndex, uint8_t bitInByte);
|
||||
/** IR hex: все байты dataBuffer[0 .. byteCount-1] в hex. */
|
||||
void packTraceEmitHex(uint8_t byteCount) const;
|
||||
/** IR raw: биты и синхра; тройной пробел между блоками msg/from/to/data/CRC; первый байт 3+пробел+5. endWithNewline — перевод строки после сырой строки. */
|
||||
void packTraceEmitRawBitsLine(bool endWithNewline = true) const;
|
||||
void packTraceEmitErrorFlash(const __FlashStringHelper *msg);
|
||||
void packTraceEmitEndOk(uint8_t packSize);
|
||||
void packTraceEmitEndBadCrc(uint8_t packSize);
|
||||
void packTraceOnTimeoutOrAbort(bool fromListenStart);
|
||||
void packTraceForceEndSyncPhase();
|
||||
bool packTraceSoftReject() const;
|
||||
|
||||
bool packTraceOpen = false;
|
||||
bool packTraceHadWrongSync = false;
|
||||
char packTraceBitBuf[kPackTraceBufCap]{};
|
||||
uint16_t packTraceLen = 0;
|
||||
#endif
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user