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); /**