From 6c97d33c7c3439a6727de93ed11aa42bacf5bd3c Mon Sep 17 00:00:00 2001 From: DashyFox Date: Fri, 4 Sep 2026 15:51:59 +0300 Subject: [PATCH] =?UTF-8?q?feat(rx):=20rxDeclaredPackSize/rxMaxPackSize=20?= =?UTF-8?q?+=20packAirtimeMs=20=E2=80=94=20=D0=B1=D1=8E=D0=B4=D0=B6=D0=B5?= =?UTF-8?q?=D1=82=20=D1=83=D0=B4=D0=B5=D1=80=D0=B6=D0=B0=D0=BD=D0=B8=D1=8F?= =?UTF-8?q?=20=D0=BF=D0=BE=20=D1=80=D0=B0=D0=B7=D0=BC=D0=B5=D1=80=D1=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Для гейта заднего у машинки (Даша 04.09): держать задний по СОСТОЯНИЮ приёма, но не дольше airtime кадра — а если объявленный в 1-м байте размер МЕНЬШЕ протокольного максимума, то ровно до его конца (усиление надёжности). rxDeclaredPackSize() = packSize из 1-го байта, если валиден (не битый) и идёт приём, иначе 0 (потребитель берёт rxMaxPackSize() — до CRC значение недоверенное). packAirtimeMs() — публичная обёртка над calculateSendTime (чистая функция протокольных констант, годна и для RX). Co-Authored-By: Claude Fable 5 Claude-Session: https://claude.ai/code/session_01J3Ca6J2JJ1NrptqQjKs8BK --- IR_DecoderRaw.h | 8 ++++++++ IR_Encoder.h | 4 ++++ 2 files changed, 12 insertions(+) diff --git a/IR_DecoderRaw.h b/IR_DecoderRaw.h index 7408c8d..19b7955 100644 --- a/IR_DecoderRaw.h +++ b/IR_DecoderRaw.h @@ -60,6 +60,14 @@ public: return isRecive || (preambleState == PreambleState::Candidate && preambleGoodPeriods >= 1U); } + // Объявленная длина ПРИНИМАЕМОГО кадра (байт) из ПЕРВОГО байта, если он уже принят и валиден; + // иначе 0 (ещё не знаем / битый). До CRC это НЕДОВЕРЕННОЕ значение — потребитель, получив 0 + // или чрезмерное, обязан брать rxMaxPackSize() (безопасно держать задний до конца макс.кадра). + inline uint16_t rxDeclaredPackSize() const { + return (isRecive && packSize && !isWrongPack) ? packSize : 0; + } + // Протокольный МАКСИМУМ длины кадра (байт) — верхняя граница бюджета удержания заднего. + static constexpr uint16_t rxMaxPackSize() { return (uint16_t)dataByteSizeMax; } uint32_t pulseFilterDroppedByFilteredOverflow() const { return 0; } uint32_t pulseFilterDroppedByHoldOverflow() const { return pulseFilterDropHoldOverflow; } uint32_t pulseFilterDroppedGlitchPairs() const { return pulseFilterDropGlitchPairs; } diff --git a/IR_Encoder.h b/IR_Encoder.h index bb21d4b..af097cf 100644 --- a/IR_Encoder.h +++ b/IR_Encoder.h @@ -62,6 +62,10 @@ public: /// @param decPair Если задан, конструктор регистрирует этот один приёмник как blind-decoder /// (аналог setBlindDecoders() для одного RX). IR_Encoder(uint8_t pin, uint16_t addr = 0, IR_DecoderRaw *decPair = nullptr, bool autoHandle = true); + /// Публичная оценка airtime кадра (мс) по его полной длине в байтах (packSize). Чистая функция + /// протокольных констант — подходит и для приёма (напр. бюджет удержания заднего по объявленному + /// в 1-м байте размеру принимаемого ответа). БЕЗ +30% компенсации занижения sync — добавляет потребитель. + uint32_t packAirtimeMs(uint8_t packSize) const { return calculateSendTime(packSize); } static void isr(); static void begin(HardwareTimer* timer, uint8_t channel, IRQn_Type IRQn, uint8_t priority, void(*isrCallback)() = nullptr); /**