in libs/infrared/receiverir.cpp [72:155]
void ReceiverIR::isr_changed(void) {
LOCK();
int bitTime = timer.read_us() - lastTick;
lastTick = timer.read_us();
switch (status) {
case PreBurst:
if (InRange(bitTime, BurstPreTime)) {
status = PostPreBurst;
necMessage = 0;
bitIndex = 0;
}
break;
case PostPreBurst:
if (InRange(bitTime, SpacePreTime))
status = BurstBit;
else if (InRange(bitTime, RepeatTime)) {
status = RepeatEnd;
}
else {
ErrorCounter++;
status = PreBurst;//error, go back!
}
break;
case RepeatEnd:
if (InRange(bitTime, RepeatEndTime)) {
}
else {
ErrorCounter++;
status = PreBurst;//error, go back!
}
break;
case BurstBit:
if (InRange(bitTime, BurstBitTime))
status = DataBit;
else {
ErrorCounter++;
status = PreBurst;//error, go back!
}
break;
case DataBit:
status = BurstBit;
if (InRange(bitTime, ZeroBitTime)) {
// we have a zero
bitIndex++;
}
else if (InRange(bitTime, OneBitTime)) {
//we have a one
necMessage |= (uint32_t)((1 << bitIndex));
bitIndex++;
}
else {
ErrorCounter++;
status = PreBurst;//error, go back!
}
if (bitIndex == 32) {
uint8_t b0 = (uint8_t)(necMessage >> 0);
uint8_t b1 = (uint8_t)~(necMessage >> 8);
uint8_t b2 = (uint8_t)(necMessage >> 16);
uint8_t b3 = (uint8_t)~(necMessage >> 24);
if ((b0 == b1) && (b2 == b3)) {
data = b2;
onReceived();
}
else {
ErrorCounter++;
}
status = PreBurst;// we are good to restart
}
break;
default:
status = PreBurst;
break;
}
UNLOCK();
}