mirror of
https://github.com/Show-maket/IR-protocol.git
synced 2026-04-28 03:08:08 +00:00
4.3 KiB
4.3 KiB
IR RX Brief Log
Краткий лог включается через:
#define IR_RX_BRIEF_LOG 1
#define IR_RX_BRIEF_LOG_REJECT_ONLY 1 // только отклонённые/ошибочные события
Лог печатается короткими строками вида:
IRRX t=1234567 rsn=CRC len=25 err=3
IRRX t=1234000 rsn=MUTE_BEGIN
IRRX t=1234988 rsn=MUTE_END cnt=42
Где:
t— uptime МК вmicros()rsn— краткий код причины- остальные поля зависят от причины
Коды rsn
| Код | Смысл | Типичные поля |
|---|---|---|
MUTE_BEGIN |
Началось окно mute: RX временно игнорирует вход, пока активен связанный TX | - |
MUTE_END |
Окно mute завершилось; cnt показывает число заблокированных фронтов за всё окно |
cnt |
QRAW |
Потеря фронтов из-за переполнения сырой очереди subBuffer |
cnt |
QFLT |
Потеря фронтов из-за переполнения очереди после входного фильтра | total |
HOLD |
Переполнен holdback фильтра до выпуска фронтов | total |
GLITCH |
Фронт/пара фронтов отброшены как глитч | total |
TIME |
Плохой тайминг фронтов/битов, кадр не может нормально разбираться | rp, hp |
PREAMB |
Кандидат преамбулы не залочился или был перезапущен | good, per |
SYNC |
Ошибка sync-бита привела к reject кадра | err |
BUF |
Переполнен битовый буфер кадра | bits |
TIMEOUT |
Кадр оборвался по таймауту до завершения; после записи в лог вызываются isReciveRaw=false и firstRX() (полный сброс декодера) |
bits, exp |
CRC |
Кадр дошёл до конца по длине, но CRC не сошёлся | len, err |
OK |
Кадр успешно распознан | len, err |
Поля
cnt— число событий/фронтов, накопленных за окно или пакетную группуtotal— накопленный счётчик отбраковок данного типаrp—risePeriodhp—highTimegood— число подряд подходящих периодов преамбулы перед срывомper— период преамбулы/кандидатаerr— суммарные ошибкиlowSignal + highSignal + otherлибо счётчик sync-ошибокbits— сколько data-бит успело накопитьсяexp— ожидаемая длина кадра из первого байта, если уже известнаlen— полная длина кадра в байтах
Когда смотреть подробный debug
listenStart/checkTimeout— в конце обработки фронта (END:) и во ветке «нет фронта» вtick(); не в начале доpop, иначе после таймаутаlastEdgeTimeрасходится с метками ISR из очереди → ложныеTIMEOUT(bits=0).- Пока в
subBufferили в hold фильтра есть необработанные фронты, таймаут поmicros() - lastEdgeTimeне оценивается (rxTimeoutPipelineBusy): иначе при хвосте очереди «тихая пауза» считается слишком длинной и снова ложныйTIMEOUT. - Если нужен полный поток битов и sync: включать
IRDEBUG_SERIAL_PACK - Если нужно понять, какие именно фронты пришли в ISR: включать
IR_EDGE_TRACE IR_RX_BRIEF_LOGнужен как короткий always-on-ish индикатор сути проблемы, без длинного дампаIR_RX_BRIEF_LOG_REJECT_ONLY=1скрываетOKиPREAMB, оставляя только отклонения/ошибки