void ReceiverIR::isr_changed()

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();
}