From d05b3513e83273d672cb5be8a2117c0b697142fc Mon Sep 17 00:00:00 2001 From: Rodrigo Alfonso Date: Tue, 11 Feb 2025 00:41:42 -0300 Subject: [PATCH] Making receiveNEC more reliable --- lib/LinkIR.hpp | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/lib/LinkIR.hpp b/lib/LinkIR.hpp index 10ee2c3..cd748c3 100644 --- a/lib/LinkIR.hpp +++ b/lib/LinkIR.hpp @@ -167,28 +167,37 @@ class LinkIR { if (!isEnabled) return false; - u16 pulses[NEC_TOTAL_PULSES]; - if (!receive(pulses, NEC_TOTAL_PULSES, startTimeout)) + u32 bufferSize = NEC_TOTAL_PULSES * 3; + u16 pulses[bufferSize]; + if (!receive(pulses, bufferSize, startTimeout)) return false; - if (!isWithinNECTolerance(pulses[0], NEC_LEADER_MARK)) + u32 cursor = 0; + while (cursor < bufferSize && + !isWithinNECTolerance(pulses[cursor], NEC_LEADER_MARK)) + cursor++; + + if (cursor + NEC_TOTAL_PULSES >= bufferSize) return false; - if (!isWithinNECTolerance(pulses[1], NEC_LEADER_SPACE)) + + if (!isWithinNECTolerance(pulses[cursor + 0], NEC_LEADER_MARK)) + return false; + if (!isWithinNECTolerance(pulses[cursor + 1], NEC_LEADER_SPACE)) return false; u32 data = 0; for (u32 bit = 0; bit < 32; bit++) { u32 markIndex = 2 + bit * 2; u32 spaceIndex = markIndex + 1; - if (!isWithinNECTolerance(pulses[markIndex], NEC_PULSE)) + if (!isWithinNECTolerance(pulses[cursor + markIndex], NEC_PULSE)) return false; - u16 space = pulses[spaceIndex]; + u16 space = pulses[cursor + spaceIndex]; if (isWithinNECTolerance(space, NEC_SPACE_1)) data |= 1 << bit; else if (!isWithinNECTolerance(space, NEC_SPACE_0)) return false; } - if (!isWithinNECTolerance(pulses[66], NEC_PULSE)) + if (!isWithinNECTolerance(pulses[cursor + 66], NEC_PULSE)) return false; u8 addr = data & 0xFF;