1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980 |
- #include "app.h"
- #include "nexa.h"
- #include "temp2.h"
- enum { UNKNOWN, T0, T1, T2, T3, OK, DONE };
- static unsigned char temp2state = T0;
- unsigned long long temp2_x_data;
- static unsigned int temp2x_numBits;
- void temp2ResetDecoder () {
- temp2_x_data = 0;
- temp2x_numBits = 0;
- temp2state = T0;
- }
- static boolean temp2isDone() { return temp2state == DONE; }
- static void temp2done () { temp2state = DONE; }
- static void temp2gotBit (char value) {
- // X
- temp2x_numBits++;
- temp2_x_data = (temp2_x_data << 1) + (value & 0x01);
- temp2state = OK;
- }
- #define MARG 50
- static int temp2decode (unsigned int width) {
-
-
- switch (temp2state) {
- case T0: // First half of pulse : HIGH around 910
- if( temp2x_numBits == 48 ) { // end of frame
- temp2state = DONE;
- return 1;
- }
- else if ( (910-MARG) <= width && width <= (910+MARG) ) {
- temp2state = T1;
- }
- else {
- return -1; // error, reset
- }
- break;
- case T1:
- if ( (410-MARG) <= width && width <= (410+MARG)) { // 410
- temp2gotBit(1);
- } else if ( (1290-MARG) <= width && width <= (1290+MARG) ) { // 1290
- temp2gotBit(0);
- } else {
- return -1; // error, reset
- }
- temp2state = T0;
- break;
- }
- return 0;
- }
- boolean nextPulseTemp2 (unsigned int width) {
-
- if( width > 0 ) {
- if (temp2state != DONE)
- switch (temp2decode(width)) {
- case -1:
- temp2ResetDecoder();
- break;
- case 1: temp2done(); break;
- }
- }
- return temp2isDone();
- }
|