|
@@ -2,50 +2,51 @@
|
|
|
#include "nexa.h"
|
|
|
#include "oregon.h"
|
|
|
|
|
|
-// Constructor must run resetDecoder()
|
|
|
+// Constructor must run resetOV3Decoder()
|
|
|
|
|
|
-unsigned char total_bits, bits, flip, state, pos, data[25];
|
|
|
+static int decode(int width);
|
|
|
+static void done ();
|
|
|
+static boolean isDone();
|
|
|
+
|
|
|
+
|
|
|
+static unsigned char total_bits, bits, flip, state, pos, data[25];
|
|
|
|
|
|
enum { UNKNOWN, T0, T1, T2, T3, OK, DONE };
|
|
|
|
|
|
|
|
|
- boolean nextPulse (unsigned short width) {
|
|
|
+ boolean nextPulseoregonV3(unsigned int width) {
|
|
|
if (state != DONE)
|
|
|
|
|
|
switch (decode(width)) {
|
|
|
- case -1: resetDecoder(); break;
|
|
|
+ case -1: resetOV3Decoder(); break;
|
|
|
case 1: done(); break;
|
|
|
}
|
|
|
return isDone();
|
|
|
}
|
|
|
|
|
|
- boolean isDone() {
|
|
|
+ static boolean isDone() {
|
|
|
return state == DONE;
|
|
|
}
|
|
|
|
|
|
- const unsigned char* getData (unsigned char& count) {
|
|
|
- count = pos;
|
|
|
+ const unsigned char* getOV3Data (unsigned char *count) {
|
|
|
+ *count = pos;
|
|
|
return data;
|
|
|
}
|
|
|
|
|
|
- void resetDecoder () {
|
|
|
+ void resetOV3Decoder () {
|
|
|
total_bits = bits = pos = flip = 0;
|
|
|
state = UNKNOWN;
|
|
|
}
|
|
|
|
|
|
- // add one bit to the packet data buffer
|
|
|
-
|
|
|
- virtual void gotBit (unsigned char value) {
|
|
|
+
|
|
|
+ // V3-Version of the gitBit-function
|
|
|
+ void gotBit (char value) {
|
|
|
+ data[pos] = (data[pos] >> 1) | (value ? 0x80 : 00);
|
|
|
total_bits++;
|
|
|
- byte *ptr = data + pos;
|
|
|
- *ptr = (*ptr >> 1) | (value << 7);
|
|
|
-
|
|
|
- if (++bits >= 8) {
|
|
|
- bits = 0;
|
|
|
- if (++pos >= sizeof data) {
|
|
|
- resetDecoder();
|
|
|
- return;
|
|
|
- }
|
|
|
+ pos = total_bits >> 3;
|
|
|
+ if (pos >= sizeof data) {
|
|
|
+ resetOV3Decoder();
|
|
|
+ return;
|
|
|
}
|
|
|
state = OK;
|
|
|
}
|
|
@@ -55,41 +56,8 @@ enum { UNKNOWN, T0, T1, T2, T3, OK, DONE };
|
|
|
flip ^= value; // manchester code, long pulse flips the bit
|
|
|
gotBit(flip);
|
|
|
}
|
|
|
-
|
|
|
- // move bits to the front so that all the bits are aligned to the end
|
|
|
- void alignTail (byte max =0) {
|
|
|
- // align bits
|
|
|
- if (bits != 0) {
|
|
|
- data[pos] >>= 8 - bits;
|
|
|
- for (byte i = 0; i < pos; ++i)
|
|
|
- data[i] = (data[i] >> bits) | (data[i+1] << (8 - bits));
|
|
|
- bits = 0;
|
|
|
- }
|
|
|
- // optionally shift bytes down if there are too many of 'em
|
|
|
- if (max > 0 && pos > max) {
|
|
|
- byte n = pos - max;
|
|
|
- pos = max;
|
|
|
- for (byte i = 0; i < pos; ++i)
|
|
|
- data[i] = data[i+n];
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- void reverseBits () {
|
|
|
- for (byte i = 0; i < pos; ++i) {
|
|
|
- byte b = data[i];
|
|
|
- for (byte j = 0; j < 8; ++j) {
|
|
|
- data[i] = (data[i] << 1) | (b & 1);
|
|
|
- b >>= 1;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- void reverseNibbles () {
|
|
|
- for (byte i = 0; i < pos; ++i)
|
|
|
- data[i] = (data[i] << 4) | (data[i] >> 4);
|
|
|
- }
|
|
|
-
|
|
|
- void done () {
|
|
|
+
|
|
|
+ static void done () {
|
|
|
while (bits)
|
|
|
gotBit(0); // padding
|
|
|
state = DONE;
|
|
@@ -97,21 +65,11 @@ enum { UNKNOWN, T0, T1, T2, T3, OK, DONE };
|
|
|
|
|
|
|
|
|
|
|
|
- // add one bit to the packet data buffer
|
|
|
- void gotBit (char value) {
|
|
|
- data[pos] = (data[pos] >> 1) | (value ? 0x80 : 00);
|
|
|
- total_bits++;
|
|
|
- pos = total_bits >> 3;
|
|
|
- if (pos >= sizeof data) {
|
|
|
- resetDecoder();
|
|
|
- return;
|
|
|
- }
|
|
|
- state = OK;
|
|
|
- }
|
|
|
+
|
|
|
|
|
|
- virtual char decode (word width) {
|
|
|
+ static int decode (int width) {
|
|
|
if (200 <= width && width < 1200) {
|
|
|
- byte w = width >= 700;
|
|
|
+ char w = width >= 700;
|
|
|
switch (state) {
|
|
|
case UNKNOWN:
|
|
|
if (w == 0)
|
|
@@ -141,4 +99,41 @@ enum { UNKNOWN, T0, T1, T2, T3, OK, DONE };
|
|
|
return total_bits == 80 ? 1: 0;
|
|
|
}
|
|
|
|
|
|
+/*
|
|
|
+ // move bits to the front so that all the bits are aligned to the end
|
|
|
+ static void alignTail(char max) {
|
|
|
+ // align bits
|
|
|
+ if (bits != 0) {
|
|
|
+ data[pos] >>= 8 - bits;
|
|
|
+ for (char i = 0; i < pos; ++i)
|
|
|
+ data[i] = (data[i] >> bits) | (data[i+1] << (8 - bits));
|
|
|
+ bits = 0;
|
|
|
+ }
|
|
|
+ // optionally shift bytes down if there are too many of 'em
|
|
|
+ if (max > 0 && pos > max) {
|
|
|
+ char n = pos - max;
|
|
|
+ pos = max;
|
|
|
+ for (char i = 0; i < pos; ++i)
|
|
|
+ data[i] = data[i+n];
|
|
|
+ }
|
|
|
+ }
|
|
|
+*/
|
|
|
|
|
|
+/*
|
|
|
+ static void reverseBits () {
|
|
|
+ for (char i = 0; i < pos; ++i) {
|
|
|
+ char b = data[i];
|
|
|
+ for (char j = 0; j < 8; ++j) {
|
|
|
+ data[i] = (data[i] << 1) | (b & 1);
|
|
|
+ b >>= 1;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+*/
|
|
|
+
|
|
|
+/*
|
|
|
+ static void reverseNibbles () {
|
|
|
+ for (char i = 0; i < pos; ++i)
|
|
|
+ data[i] = (data[i] << 4) | (data[i] >> 4);
|
|
|
+ }
|
|
|
+*/
|