Oregegon scientific decoder V2.1 and V3
Dependents: Oregon_Decoder_V2_V3
Oregon decoding Library.
It manages protocoles V2.1 and V3.
To be used with RTOS OS2 or MBED V5
OregonBit.cpp@13:87e9b1cd65c2, 2020-07-18 (annotated)
- Committer:
- sev2000
- Date:
- Sat Jul 18 07:58:04 2020 +0000
- Revision:
- 13:87e9b1cd65c2
- Parent:
- 12:6d3638a225dd
- Child:
- 14:a9984c6f6257
Added Bit_ptr init in case 2
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
sev2000 | 12:6d3638a225dd | 1 | #include "mbed.h" |
sev2000 | 0:4875d3d646de | 2 | #include "Regul.h" |
sev2000 | 9:ac5060331882 | 3 | |
sev2000 | 12:6d3638a225dd | 4 | //#define Level 3 |
sev2000 | 11:4cfdb2d79394 | 5 | |
sev2000 | 0:4875d3d646de | 6 | int processData(measure_t*, int version); |
sev2000 | 12:6d3638a225dd | 7 | int processDataTFA(measure_t*); |
sev2000 | 12:6d3638a225dd | 8 | |
sev2000 | 0:4875d3d646de | 9 | |
sev2000 | 0:4875d3d646de | 10 | typedef struct { |
sev2000 | 0:4875d3d646de | 11 | int v; |
sev2000 | 0:4875d3d646de | 12 | bool pin; |
sev2000 | 0:4875d3d646de | 13 | }pulse_t; |
sev2000 | 0:4875d3d646de | 14 | |
sev2000 | 11:4cfdb2d79394 | 15 | int onShortLo = 200; |
sev2000 | 7:47fb36f30355 | 16 | int onShortHi = 700; |
sev2000 | 7:47fb36f30355 | 17 | int offShortLo = 200; |
sev2000 | 7:47fb36f30355 | 18 | int offShortHi = 700; |
sev2000 | 7:47fb36f30355 | 19 | int onLongLo = 700; |
sev2000 | 7:47fb36f30355 | 20 | int onLongHi = 1200; |
sev2000 | 7:47fb36f30355 | 21 | int offLongLo = 700; |
sev2000 | 7:47fb36f30355 | 22 | int offLongHi = 1200; |
sev2000 | 11:4cfdb2d79394 | 23 | /* |
sev2000 | 8:48315bba3adc | 24 | int onShortLo = 201; |
sev2000 | 0:4875d3d646de | 25 | int onShortHi = 615; |
sev2000 | 0:4875d3d646de | 26 | int offShortLo = 400; |
sev2000 | 0:4875d3d646de | 27 | int offShortHi = 850; |
sev2000 | 0:4875d3d646de | 28 | int onLongLo = 615; |
sev2000 | 0:4875d3d646de | 29 | int onLongHi = 1100; |
sev2000 | 0:4875d3d646de | 30 | int offLongLo = 850; |
sev2000 | 0:4875d3d646de | 31 | int offLongHi = 1400; |
sev2000 | 11:4cfdb2d79394 | 32 | */ |
sev2000 | 9:ac5060331882 | 33 | static long startedAt; |
sev2000 | 9:ac5060331882 | 34 | static long endedAt; |
sev2000 | 0:4875d3d646de | 35 | |
sev2000 | 11:4cfdb2d79394 | 36 | static bool dataBits[145]={0}; // 18 Nibbles +1 |
sev2000 | 0:4875d3d646de | 37 | |
sev2000 | 11:4cfdb2d79394 | 38 | //Thread O_thread(osPriorityBelowNormal); |
sev2000 | 11:4cfdb2d79394 | 39 | Thread O_thread(osPriorityNormal); |
sev2000 | 9:ac5060331882 | 40 | static Timer xTime; |
sev2000 | 0:4875d3d646de | 41 | |
sev2000 | 5:23cbd3014844 | 42 | InterruptIn dataPin(PB_8); |
sev2000 | 1:37ddcdfee022 | 43 | DigitalOut StbyPin(PB_9, 1); |
sev2000 | 0:4875d3d646de | 44 | |
sev2000 | 9:ac5060331882 | 45 | static CircularBuffer<pulse_t, BUF_SIZE> PulseWidth; |
sev2000 | 0:4875d3d646de | 46 | |
sev2000 | 0:4875d3d646de | 47 | measure_t Sensor[NB_CHAN] ={0}; |
sev2000 | 9:ac5060331882 | 48 | static pulse_t timeDiff; |
sev2000 | 0:4875d3d646de | 49 | |
sev2000 | 9:ac5060331882 | 50 | static void getPulseF(void) |
sev2000 | 0:4875d3d646de | 51 | { |
sev2000 | 9:ac5060331882 | 52 | endedAt = xTime.read_us(); // set timer end for last pin |
sev2000 | 9:ac5060331882 | 53 | timeDiff.v = endedAt - startedAt; |
sev2000 | 9:ac5060331882 | 54 | timeDiff.pin = 1; |
sev2000 | 9:ac5060331882 | 55 | PulseWidth.push(timeDiff); |
sev2000 | 9:ac5060331882 | 56 | startedAt= endedAt; // set timer start for this pin |
sev2000 | 0:4875d3d646de | 57 | } |
sev2000 | 0:4875d3d646de | 58 | |
sev2000 | 9:ac5060331882 | 59 | static void getPulseR(void) |
sev2000 | 0:4875d3d646de | 60 | { |
sev2000 | 9:ac5060331882 | 61 | endedAt = xTime.read_us(); // set timer end for last pin |
sev2000 | 9:ac5060331882 | 62 | timeDiff.v = endedAt - startedAt; |
sev2000 | 9:ac5060331882 | 63 | timeDiff.pin = 0; |
sev2000 | 9:ac5060331882 | 64 | PulseWidth.push(timeDiff); |
sev2000 | 9:ac5060331882 | 65 | startedAt= endedAt; // set timer start for this pin |
sev2000 | 0:4875d3d646de | 66 | } |
sev2000 | 0:4875d3d646de | 67 | |
sev2000 | 0:4875d3d646de | 68 | |
sev2000 | 0:4875d3d646de | 69 | |
sev2000 | 0:4875d3d646de | 70 | void getData() |
sev2000 | 0:4875d3d646de | 71 | { |
sev2000 | 0:4875d3d646de | 72 | pulse_t pulse; |
sev2000 | 0:4875d3d646de | 73 | // get next 128 data bits, we determined bit 0 in SYNC |
sev2000 | 0:4875d3d646de | 74 | int i= 0; |
sev2000 | 0:4875d3d646de | 75 | int l= 0; // long pulse; |
sev2000 | 0:4875d3d646de | 76 | int s= 0; // short pulse |
sev2000 | 0:4875d3d646de | 77 | int bit_ptr= 1; //first bit[0] was derived in Preamble; |
sev2000 | 0:4875d3d646de | 78 | char state=0; |
sev2000 | 0:4875d3d646de | 79 | |
sev2000 | 0:4875d3d646de | 80 | while(true) |
sev2000 | 0:4875d3d646de | 81 | { |
sev2000 | 0:4875d3d646de | 82 | i=0; |
sev2000 | 9:ac5060331882 | 83 | if(PulseWidth.empty()) //If no pulse received since 100 ms, we are no more in the frame |
sev2000 | 7:47fb36f30355 | 84 | state=0; |
sev2000 | 9:ac5060331882 | 85 | while(!PulseWidth.empty() && i<200) |
sev2000 | 0:4875d3d646de | 86 | { |
sev2000 | 9:ac5060331882 | 87 | PulseWidth.pop(pulse); |
sev2000 | 12:6d3638a225dd | 88 | i++; |
sev2000 | 0:4875d3d646de | 89 | //pc.printf("%d,", pulse.v); |
sev2000 | 12:6d3638a225dd | 90 | if ((pulse.v > onShortLo) && (pulse.v < offLongHi)) |
sev2000 | 0:4875d3d646de | 91 | { |
sev2000 | 12:6d3638a225dd | 92 | if (pulse.pin == 0) //Pin was OFF |
sev2000 | 12:6d3638a225dd | 93 | { |
sev2000 | 12:6d3638a225dd | 94 | if ((pulse.v > offShortLo) && (pulse.v < offShortHi)) |
sev2000 | 12:6d3638a225dd | 95 | { // short off detected |
sev2000 | 12:6d3638a225dd | 96 | s++; |
sev2000 | 12:6d3638a225dd | 97 | l=0; |
sev2000 | 12:6d3638a225dd | 98 | } |
sev2000 | 12:6d3638a225dd | 99 | else if (pulse.v > offLongLo) // If we are here (pulse.v < offLongHi) |
sev2000 | 12:6d3638a225dd | 100 | { // long off detected |
sev2000 | 12:6d3638a225dd | 101 | l++; |
sev2000 | 12:6d3638a225dd | 102 | s=0; |
sev2000 | 12:6d3638a225dd | 103 | } |
sev2000 | 12:6d3638a225dd | 104 | else |
sev2000 | 12:6d3638a225dd | 105 | { |
sev2000 | 12:6d3638a225dd | 106 | l=0; |
sev2000 | 12:6d3638a225dd | 107 | s=0; |
sev2000 | 12:6d3638a225dd | 108 | } |
sev2000 | 12:6d3638a225dd | 109 | } |
sev2000 | 12:6d3638a225dd | 110 | else // Pin was ON |
sev2000 | 12:6d3638a225dd | 111 | { |
sev2000 | 12:6d3638a225dd | 112 | if (pulse.v < onShortHi) // half-time, If we are here (pulse.v > onShortLo) |
sev2000 | 12:6d3638a225dd | 113 | { // short on detetcted |
sev2000 | 0:4875d3d646de | 114 | s++; |
sev2000 | 0:4875d3d646de | 115 | l=0; |
sev2000 | 12:6d3638a225dd | 116 | } |
sev2000 | 12:6d3638a225dd | 117 | else if ((pulse.v > onLongLo) && (pulse.v < onLongHi)) // full-time |
sev2000 | 12:6d3638a225dd | 118 | { // long on detected |
sev2000 | 0:4875d3d646de | 119 | l++; |
sev2000 | 0:4875d3d646de | 120 | s=0; |
sev2000 | 12:6d3638a225dd | 121 | } |
sev2000 | 12:6d3638a225dd | 122 | else |
sev2000 | 12:6d3638a225dd | 123 | { |
sev2000 | 12:6d3638a225dd | 124 | l=0; |
sev2000 | 12:6d3638a225dd | 125 | s=0; |
sev2000 | 12:6d3638a225dd | 126 | } |
sev2000 | 0:4875d3d646de | 127 | } |
sev2000 | 0:4875d3d646de | 128 | } |
sev2000 | 12:6d3638a225dd | 129 | else // Not Oregon Pulse |
sev2000 | 0:4875d3d646de | 130 | { |
sev2000 | 12:6d3638a225dd | 131 | l=0; |
sev2000 | 12:6d3638a225dd | 132 | s=0; |
sev2000 | 12:6d3638a225dd | 133 | state=0; |
sev2000 | 12:6d3638a225dd | 134 | continue; |
sev2000 | 0:4875d3d646de | 135 | } |
sev2000 | 0:4875d3d646de | 136 | |
sev2000 | 0:4875d3d646de | 137 | switch(state) |
sev2000 | 0:4875d3d646de | 138 | { |
sev2000 | 0:4875d3d646de | 139 | case 0: // Detect preamble |
sev2000 | 0:4875d3d646de | 140 | if(l >= 24) // out of 32 |
sev2000 | 0:4875d3d646de | 141 | state=1; |
sev2000 | 12:6d3638a225dd | 142 | if(s == 18) // out of 22 |
sev2000 | 12:6d3638a225dd | 143 | state=11; |
sev2000 | 0:4875d3d646de | 144 | if(s >= 40) // out of 48 |
sev2000 | 12:6d3638a225dd | 145 | state=12; |
sev2000 | 0:4875d3d646de | 146 | //pc.printf("%d ", l); |
sev2000 | 0:4875d3d646de | 147 | break; |
sev2000 | 0:4875d3d646de | 148 | case 1: // wait start bit (first short in V2.1) |
sev2000 | 12:6d3638a225dd | 149 | //printf("OK2"); |
sev2000 | 0:4875d3d646de | 150 | l=0; |
sev2000 | 0:4875d3d646de | 151 | if (s==1) |
sev2000 | 12:6d3638a225dd | 152 | { |
sev2000 | 0:4875d3d646de | 153 | state = 2; |
sev2000 | 12:6d3638a225dd | 154 | bit_ptr=1; |
sev2000 | 12:6d3638a225dd | 155 | } |
sev2000 | 0:4875d3d646de | 156 | break; |
sev2000 | 12:6d3638a225dd | 157 | case 11: // wait start bit (2 longs in WS-07) |
sev2000 | 12:6d3638a225dd | 158 | //printf("OK4"); |
sev2000 | 12:6d3638a225dd | 159 | |
sev2000 | 12:6d3638a225dd | 160 | if(s>22) |
sev2000 | 12:6d3638a225dd | 161 | state=0; |
sev2000 | 12:6d3638a225dd | 162 | |
sev2000 | 12:6d3638a225dd | 163 | if(l==2) |
sev2000 | 12:6d3638a225dd | 164 | { |
sev2000 | 12:6d3638a225dd | 165 | state = 22; |
sev2000 | 12:6d3638a225dd | 166 | dataBits[1]=1; // l => opposite of previous (0) |
sev2000 | 12:6d3638a225dd | 167 | bit_ptr=2; |
sev2000 | 12:6d3638a225dd | 168 | l=0; |
sev2000 | 12:6d3638a225dd | 169 | s=0; |
sev2000 | 12:6d3638a225dd | 170 | } |
sev2000 | 12:6d3638a225dd | 171 | break; |
sev2000 | 12:6d3638a225dd | 172 | case 12: // wait start bit (first long in V3) |
sev2000 | 12:6d3638a225dd | 173 | //printf("OK3"); |
sev2000 | 0:4875d3d646de | 174 | s=0; |
sev2000 | 0:4875d3d646de | 175 | if (l==1) |
sev2000 | 0:4875d3d646de | 176 | { |
sev2000 | 0:4875d3d646de | 177 | state = 21; |
sev2000 | 11:4cfdb2d79394 | 178 | dataBits[1]=0; // l => opposite of previous (1) |
sev2000 | 0:4875d3d646de | 179 | bit_ptr=2; |
sev2000 | 0:4875d3d646de | 180 | l=0; |
sev2000 | 0:4875d3d646de | 181 | } |
sev2000 | 0:4875d3d646de | 182 | break; |
sev2000 | 0:4875d3d646de | 183 | case 2: |
sev2000 | 0:4875d3d646de | 184 | //pc.printf(" %d", pulse.v); |
sev2000 | 0:4875d3d646de | 185 | if(s==0 && l==0) |
sev2000 | 0:4875d3d646de | 186 | { |
sev2000 | 9:ac5060331882 | 187 | ERR(" %s : %d\t", (pulse.pin ? "on" : "off"), pulse.v); |
sev2000 | 0:4875d3d646de | 188 | if (0 == bit_ptr%2) |
sev2000 | 0:4875d3d646de | 189 | l=1; // V2.1 2nd bit is !(bit n-1) |
sev2000 | 0:4875d3d646de | 190 | else |
sev2000 | 0:4875d3d646de | 191 | if (pulse.v > 736) |
sev2000 | 0:4875d3d646de | 192 | l=1; |
sev2000 | 0:4875d3d646de | 193 | else |
sev2000 | 0:4875d3d646de | 194 | s=1; |
sev2000 | 0:4875d3d646de | 195 | } |
sev2000 | 0:4875d3d646de | 196 | if (0 == bit_ptr%2 && !l) |
sev2000 | 0:4875d3d646de | 197 | { |
sev2000 | 13:87e9b1cd65c2 | 198 | ERR("%d V2.1 : 2nd pulse should be long : %d", bit_ptr, pulse.v); |
sev2000 | 0:4875d3d646de | 199 | s=0; |
sev2000 | 0:4875d3d646de | 200 | l=1; |
sev2000 | 0:4875d3d646de | 201 | } |
sev2000 | 0:4875d3d646de | 202 | |
sev2000 | 0:4875d3d646de | 203 | if (s == 2) |
sev2000 | 0:4875d3d646de | 204 | { // 2 short pulses this bit equals previous bit (we know 1st bit from sync) |
sev2000 | 11:4cfdb2d79394 | 205 | dataBits[bit_ptr] = dataBits[bit_ptr-1]; |
sev2000 | 11:4cfdb2d79394 | 206 | /* if(dataBits[bit_ptr] != !pulse.pin) |
sev2000 | 0:4875d3d646de | 207 | pc.printf("Error : V2.1 : pin level don't match"); */ |
sev2000 | 0:4875d3d646de | 208 | bit_ptr++; |
sev2000 | 0:4875d3d646de | 209 | s=0; |
sev2000 | 0:4875d3d646de | 210 | l=0; |
sev2000 | 0:4875d3d646de | 211 | } |
sev2000 | 0:4875d3d646de | 212 | if (l == 1 && s==0) |
sev2000 | 0:4875d3d646de | 213 | { // 1 long pulse this bit is inverse of previous bit (we know 1st bit from sync) |
sev2000 | 11:4cfdb2d79394 | 214 | dataBits[bit_ptr] = !dataBits[bit_ptr-1]; |
sev2000 | 0:4875d3d646de | 215 | l=0; |
sev2000 | 0:4875d3d646de | 216 | s=0; |
sev2000 | 0:4875d3d646de | 217 | bit_ptr++; |
sev2000 | 0:4875d3d646de | 218 | } |
sev2000 | 0:4875d3d646de | 219 | if(bit_ptr>144) |
sev2000 | 0:4875d3d646de | 220 | { |
sev2000 | 0:4875d3d646de | 221 | processData(Sensor,2); |
sev2000 | 0:4875d3d646de | 222 | state=0; |
sev2000 | 0:4875d3d646de | 223 | bit_ptr=1; |
sev2000 | 9:ac5060331882 | 224 | WARN(" Waiting..."); |
sev2000 | 0:4875d3d646de | 225 | } |
sev2000 | 0:4875d3d646de | 226 | break; |
sev2000 | 0:4875d3d646de | 227 | case 21: |
sev2000 | 0:4875d3d646de | 228 | //pc.printf(" %d", pulse.v); |
sev2000 | 0:4875d3d646de | 229 | if(s==0 && l==0) |
sev2000 | 0:4875d3d646de | 230 | { |
sev2000 | 9:ac5060331882 | 231 | ERR(" %s : %d\t", (pulse.pin ? "on" : "off"), pulse.v); |
sev2000 | 0:4875d3d646de | 232 | |
sev2000 | 0:4875d3d646de | 233 | if (pulse.v > 736) |
sev2000 | 0:4875d3d646de | 234 | l=1; |
sev2000 | 0:4875d3d646de | 235 | else |
sev2000 | 0:4875d3d646de | 236 | s=1; |
sev2000 | 0:4875d3d646de | 237 | } |
sev2000 | 0:4875d3d646de | 238 | |
sev2000 | 0:4875d3d646de | 239 | if(s==1 && l==1) |
sev2000 | 9:ac5060331882 | 240 | ERR(" %s : %d\t", (pulse.pin ? "on" : "off"), pulse.v); |
sev2000 | 0:4875d3d646de | 241 | |
sev2000 | 0:4875d3d646de | 242 | if (s == 2) |
sev2000 | 0:4875d3d646de | 243 | { // 2 short pulses this bit equals previous bit (we know 1st bit from sync) |
sev2000 | 11:4cfdb2d79394 | 244 | dataBits[bit_ptr] = dataBits[bit_ptr-1]; |
sev2000 | 11:4cfdb2d79394 | 245 | //pc.printf(",[%d]%d",bit_ptr, dataBits[bit_ptr]); |
sev2000 | 0:4875d3d646de | 246 | bit_ptr++; |
sev2000 | 0:4875d3d646de | 247 | s=0; |
sev2000 | 0:4875d3d646de | 248 | l=0; |
sev2000 | 0:4875d3d646de | 249 | } |
sev2000 | 0:4875d3d646de | 250 | if (l == 1) |
sev2000 | 0:4875d3d646de | 251 | { // 1 long pulse this bit is inverse of previous bit (we know 1st bit from sync) |
sev2000 | 11:4cfdb2d79394 | 252 | dataBits[bit_ptr] = !dataBits[bit_ptr-1]; |
sev2000 | 0:4875d3d646de | 253 | l=0; |
sev2000 | 0:4875d3d646de | 254 | s=0; |
sev2000 | 11:4cfdb2d79394 | 255 | //pc.printf(",[%d]%d",bit_ptr, dataBits[bit_ptr]); |
sev2000 | 0:4875d3d646de | 256 | bit_ptr++; |
sev2000 | 0:4875d3d646de | 257 | } |
sev2000 | 0:4875d3d646de | 258 | if(bit_ptr>72) |
sev2000 | 0:4875d3d646de | 259 | { |
sev2000 | 0:4875d3d646de | 260 | processData(Sensor,3); |
sev2000 | 0:4875d3d646de | 261 | state=0; |
sev2000 | 0:4875d3d646de | 262 | bit_ptr=1; |
sev2000 | 9:ac5060331882 | 263 | WARN(" Waiting..."); |
sev2000 | 0:4875d3d646de | 264 | } |
sev2000 | 0:4875d3d646de | 265 | break; |
sev2000 | 12:6d3638a225dd | 266 | case 22: |
sev2000 | 12:6d3638a225dd | 267 | //pc.printf(" %d", pulse.v); |
sev2000 | 12:6d3638a225dd | 268 | if(s==0 && l==0) |
sev2000 | 12:6d3638a225dd | 269 | { |
sev2000 | 12:6d3638a225dd | 270 | ERR(" %s : %d\t", (pulse.pin ? "on" : "off"), pulse.v); |
sev2000 | 12:6d3638a225dd | 271 | |
sev2000 | 12:6d3638a225dd | 272 | if (pulse.v > 736) |
sev2000 | 12:6d3638a225dd | 273 | l=1; |
sev2000 | 12:6d3638a225dd | 274 | else |
sev2000 | 12:6d3638a225dd | 275 | s=1; |
sev2000 | 12:6d3638a225dd | 276 | } |
sev2000 | 12:6d3638a225dd | 277 | |
sev2000 | 12:6d3638a225dd | 278 | if(s==1 && l==1) |
sev2000 | 12:6d3638a225dd | 279 | ERR(" %s : %d\t", (pulse.pin ? "on" : "off"), pulse.v); |
sev2000 | 12:6d3638a225dd | 280 | |
sev2000 | 12:6d3638a225dd | 281 | if (s == 2) |
sev2000 | 12:6d3638a225dd | 282 | { // 2 short pulses this bit equals previous bit (we know 1st bit from sync) |
sev2000 | 12:6d3638a225dd | 283 | dataBits[bit_ptr] = dataBits[bit_ptr-1]; |
sev2000 | 12:6d3638a225dd | 284 | //pc.printf(",[%d]%d",bit_ptr, dataBits[bit_ptr]); |
sev2000 | 12:6d3638a225dd | 285 | bit_ptr++; |
sev2000 | 12:6d3638a225dd | 286 | s=0; |
sev2000 | 12:6d3638a225dd | 287 | l=0; |
sev2000 | 12:6d3638a225dd | 288 | } |
sev2000 | 12:6d3638a225dd | 289 | if (l == 1) |
sev2000 | 12:6d3638a225dd | 290 | { // 1 long pulse this bit is inverse of previous bit (we know 1st bit from sync) |
sev2000 | 12:6d3638a225dd | 291 | dataBits[bit_ptr] = !dataBits[bit_ptr-1]; |
sev2000 | 12:6d3638a225dd | 292 | l=0; |
sev2000 | 12:6d3638a225dd | 293 | s=0; |
sev2000 | 12:6d3638a225dd | 294 | //pc.printf(",[%d]%d",bit_ptr, dataBits[bit_ptr]); |
sev2000 | 12:6d3638a225dd | 295 | bit_ptr++; |
sev2000 | 12:6d3638a225dd | 296 | } |
sev2000 | 12:6d3638a225dd | 297 | if(bit_ptr>50) |
sev2000 | 12:6d3638a225dd | 298 | { |
sev2000 | 12:6d3638a225dd | 299 | processDataTFA(Sensor); |
sev2000 | 12:6d3638a225dd | 300 | state=0; |
sev2000 | 12:6d3638a225dd | 301 | bit_ptr=1; |
sev2000 | 12:6d3638a225dd | 302 | WARN(" Waiting..."); |
sev2000 | 12:6d3638a225dd | 303 | } |
sev2000 | 12:6d3638a225dd | 304 | break; |
sev2000 | 0:4875d3d646de | 305 | } |
sev2000 | 0:4875d3d646de | 306 | } |
sev2000 | 12:6d3638a225dd | 307 | ThisThread::sleep_for(100); |
sev2000 | 0:4875d3d646de | 308 | } |
sev2000 | 0:4875d3d646de | 309 | // return 0; |
sev2000 | 0:4875d3d646de | 310 | } |
sev2000 | 0:4875d3d646de | 311 | |
sev2000 | 0:4875d3d646de | 312 | int processData(measure_t *data, int version) |
sev2000 | 0:4875d3d646de | 313 | { |
sev2000 | 0:4875d3d646de | 314 | int x; |
sev2000 | 0:4875d3d646de | 315 | int i = 0; |
sev2000 | 0:4875d3d646de | 316 | int j= 0; |
sev2000 | 0:4875d3d646de | 317 | char nibble[18]={0}, chksum=0; |
sev2000 | 0:4875d3d646de | 318 | int tmp; |
sev2000 | 0:4875d3d646de | 319 | char channel; |
sev2000 | 0:4875d3d646de | 320 | |
sev2000 | 0:4875d3d646de | 321 | x= (version==2) ? 2 : 1; |
sev2000 | 0:4875d3d646de | 322 | for (i=0;i<18;i++) |
sev2000 | 0:4875d3d646de | 323 | { |
sev2000 | 0:4875d3d646de | 324 | for (j=0;j<4;j++) |
sev2000 | 0:4875d3d646de | 325 | { |
sev2000 | 11:4cfdb2d79394 | 326 | if ( dataBits[x]) |
sev2000 | 0:4875d3d646de | 327 | nibble[i] |= 1<<j; |
sev2000 | 0:4875d3d646de | 328 | x+= (version==2) ? 2 : 1; |
sev2000 | 0:4875d3d646de | 329 | } |
sev2000 | 0:4875d3d646de | 330 | } |
sev2000 | 0:4875d3d646de | 331 | |
sev2000 | 0:4875d3d646de | 332 | for (x=1;x<73;x++) |
sev2000 | 0:4875d3d646de | 333 | { |
sev2000 | 11:4cfdb2d79394 | 334 | // pc.printf("%d", dataBits[x]); |
sev2000 | 11:4cfdb2d79394 | 335 | dataBits[x]=0; |
sev2000 | 0:4875d3d646de | 336 | } |
sev2000 | 0:4875d3d646de | 337 | |
sev2000 | 12:6d3638a225dd | 338 | #if __DEBUG__ |
sev2000 | 0:4875d3d646de | 339 | for (i=0;i<18;i++) |
sev2000 | 12:6d3638a225dd | 340 | printf("%X ",nibble[i]); |
sev2000 | 12:6d3638a225dd | 341 | printf("\r\n"); |
sev2000 | 0:4875d3d646de | 342 | #endif |
sev2000 | 0:4875d3d646de | 343 | |
sev2000 | 0:4875d3d646de | 344 | //Decoding for THGR122NX(1D20) and THGR810(F8B4) |
sev2000 | 0:4875d3d646de | 345 | if( 0x0A == nibble[0]) |
sev2000 | 0:4875d3d646de | 346 | { |
sev2000 | 0:4875d3d646de | 347 | //Compute Checksum |
sev2000 | 0:4875d3d646de | 348 | for (i=1;i<16;i++) |
sev2000 | 0:4875d3d646de | 349 | chksum += nibble[i]; //no overflow if computed on 15 Nibbles |
sev2000 | 0:4875d3d646de | 350 | |
sev2000 | 0:4875d3d646de | 351 | if (chksum == (nibble[17]<<4 | nibble[16])) |
sev2000 | 0:4875d3d646de | 352 | { |
sev2000 | 0:4875d3d646de | 353 | channel = nibble[5]; |
sev2000 | 0:4875d3d646de | 354 | data[channel].deviceID = channel; |
sev2000 | 9:ac5060331882 | 355 | DBG("Channel: %d", channel); |
sev2000 | 0:4875d3d646de | 356 | |
sev2000 | 0:4875d3d646de | 357 | tmp= (nibble[8] & 0x4) ? 10 : 90; |
sev2000 | 9:ac5060331882 | 358 | DBG("Batterie: %d", tmp); |
sev2000 | 0:4875d3d646de | 359 | |
sev2000 | 0:4875d3d646de | 360 | int sign = (nibble[12]>0x0) ? -1 : 1; |
sev2000 | 0:4875d3d646de | 361 | float temp = nibble[11]*10 + nibble[10] + (float)(nibble[9] / 10.0); |
sev2000 | 0:4875d3d646de | 362 | temp= sign * temp; |
sev2000 | 0:4875d3d646de | 363 | data[channel].temp1= temp; |
sev2000 | 9:ac5060331882 | 364 | DBG("Temperature: %0.1f", temp); |
sev2000 | 0:4875d3d646de | 365 | |
sev2000 | 0:4875d3d646de | 366 | tmp= nibble[14] * 10 + nibble[13]; |
sev2000 | 0:4875d3d646de | 367 | data[channel].hum1= (float)tmp; |
sev2000 | 9:ac5060331882 | 368 | DBG("Humidity: %d", tmp); |
sev2000 | 0:4875d3d646de | 369 | |
sev2000 | 0:4875d3d646de | 370 | data[channel].timestamp=time(NULL); |
sev2000 | 0:4875d3d646de | 371 | } |
sev2000 | 0:4875d3d646de | 372 | else |
sev2000 | 9:ac5060331882 | 373 | ERR("Checksum error %X", chksum); |
sev2000 | 0:4875d3d646de | 374 | } |
sev2000 | 0:4875d3d646de | 375 | else |
sev2000 | 9:ac5060331882 | 376 | ERR("Sync error"); |
sev2000 | 0:4875d3d646de | 377 | return 0; |
sev2000 | 0:4875d3d646de | 378 | } |
sev2000 | 12:6d3638a225dd | 379 | |
sev2000 | 12:6d3638a225dd | 380 | uint8_t Checksum(int length, uint8_t *buff) |
sev2000 | 12:6d3638a225dd | 381 | { |
sev2000 | 12:6d3638a225dd | 382 | uint8_t mask = 0x7C; |
sev2000 | 12:6d3638a225dd | 383 | uint8_t checksum = 0x64; |
sev2000 | 12:6d3638a225dd | 384 | uint8_t data; |
sev2000 | 12:6d3638a225dd | 385 | int byteCnt; |
sev2000 | 12:6d3638a225dd | 386 | |
sev2000 | 12:6d3638a225dd | 387 | for ( byteCnt = 0; byteCnt < length; byteCnt++) |
sev2000 | 12:6d3638a225dd | 388 | { |
sev2000 | 12:6d3638a225dd | 389 | int bitCnt; |
sev2000 | 12:6d3638a225dd | 390 | data = buff[byteCnt*2]<<4 | buff[byteCnt*2+1]; |
sev2000 | 12:6d3638a225dd | 391 | |
sev2000 | 12:6d3638a225dd | 392 | for ( bitCnt = 7; bitCnt >= 0 ; bitCnt-- ) |
sev2000 | 12:6d3638a225dd | 393 | { |
sev2000 | 12:6d3638a225dd | 394 | uint8_t bit; |
sev2000 | 12:6d3638a225dd | 395 | |
sev2000 | 12:6d3638a225dd | 396 | // Rotate mask right |
sev2000 | 12:6d3638a225dd | 397 | bit = mask & 1; |
sev2000 | 12:6d3638a225dd | 398 | mask = (mask >> 1 ) | (mask << 7); |
sev2000 | 12:6d3638a225dd | 399 | if ( bit ) |
sev2000 | 12:6d3638a225dd | 400 | { |
sev2000 | 12:6d3638a225dd | 401 | mask ^= 0x18; |
sev2000 | 12:6d3638a225dd | 402 | } |
sev2000 | 12:6d3638a225dd | 403 | |
sev2000 | 12:6d3638a225dd | 404 | // XOR mask into checksum if data bit is 1 |
sev2000 | 12:6d3638a225dd | 405 | if ( data & 0x80 ) |
sev2000 | 12:6d3638a225dd | 406 | { |
sev2000 | 12:6d3638a225dd | 407 | checksum ^= mask; |
sev2000 | 12:6d3638a225dd | 408 | } |
sev2000 | 12:6d3638a225dd | 409 | data <<= 1; |
sev2000 | 12:6d3638a225dd | 410 | } |
sev2000 | 12:6d3638a225dd | 411 | } |
sev2000 | 12:6d3638a225dd | 412 | |
sev2000 | 12:6d3638a225dd | 413 | return checksum; |
sev2000 | 12:6d3638a225dd | 414 | } |
sev2000 | 12:6d3638a225dd | 415 | |
sev2000 | 12:6d3638a225dd | 416 | int processDataTFA(measure_t *data) |
sev2000 | 12:6d3638a225dd | 417 | { |
sev2000 | 12:6d3638a225dd | 418 | int x; |
sev2000 | 12:6d3638a225dd | 419 | int i = 0; |
sev2000 | 12:6d3638a225dd | 420 | int j= 0; |
sev2000 | 12:6d3638a225dd | 421 | char nibble[12]={0}, chksum=0; |
sev2000 | 12:6d3638a225dd | 422 | int tmp; |
sev2000 | 12:6d3638a225dd | 423 | char channel; |
sev2000 | 12:6d3638a225dd | 424 | |
sev2000 | 12:6d3638a225dd | 425 | x= 2; |
sev2000 | 12:6d3638a225dd | 426 | for (i=0;i<12;i++) |
sev2000 | 12:6d3638a225dd | 427 | { |
sev2000 | 12:6d3638a225dd | 428 | for (j=0;j<4;j++) |
sev2000 | 12:6d3638a225dd | 429 | { |
sev2000 | 12:6d3638a225dd | 430 | if ( dataBits[x]) |
sev2000 | 12:6d3638a225dd | 431 | nibble[i] |= 1<< (3-j); |
sev2000 | 12:6d3638a225dd | 432 | x++; |
sev2000 | 12:6d3638a225dd | 433 | } |
sev2000 | 12:6d3638a225dd | 434 | } |
sev2000 | 12:6d3638a225dd | 435 | |
sev2000 | 12:6d3638a225dd | 436 | for (x=1;x<50;x++) |
sev2000 | 12:6d3638a225dd | 437 | { |
sev2000 | 12:6d3638a225dd | 438 | //printf("%d", dataBits[x]); |
sev2000 | 12:6d3638a225dd | 439 | dataBits[x]=0; |
sev2000 | 12:6d3638a225dd | 440 | } |
sev2000 | 12:6d3638a225dd | 441 | |
sev2000 | 12:6d3638a225dd | 442 | #if __DEBUG__ |
sev2000 | 12:6d3638a225dd | 443 | for (i=0;i<12;i++) |
sev2000 | 12:6d3638a225dd | 444 | printf("%X ",nibble[i]); |
sev2000 | 12:6d3638a225dd | 445 | printf("\r\n"); |
sev2000 | 12:6d3638a225dd | 446 | #endif |
sev2000 | 12:6d3638a225dd | 447 | |
sev2000 | 12:6d3638a225dd | 448 | //Decoding for WS-07, sensor_id==0x46 |
sev2000 | 12:6d3638a225dd | 449 | if( 0x04 == nibble[0]) |
sev2000 | 12:6d3638a225dd | 450 | { |
sev2000 | 12:6d3638a225dd | 451 | //45 4F 04 4B 0B 52 0 |
sev2000 | 12:6d3638a225dd | 452 | //01000101 01001111 00000100 01001011 00001011 01010010 0000 |
sev2000 | 12:6d3638a225dd | 453 | //SSSSSSSS NRRRRRRR bCCCTTTT TTTTTTTT HHHHHHHH CCCCCCCC ???? |
sev2000 | 12:6d3638a225dd | 454 | |
sev2000 | 12:6d3638a225dd | 455 | chksum = Checksum(5, (uint8_t*)nibble); |
sev2000 | 12:6d3638a225dd | 456 | if (chksum == (nibble[10]<<4 | nibble[11])) |
sev2000 | 12:6d3638a225dd | 457 | { |
sev2000 | 12:6d3638a225dd | 458 | channel = nibble[4]+1; |
sev2000 | 12:6d3638a225dd | 459 | data[channel].deviceID = channel; |
sev2000 | 12:6d3638a225dd | 460 | DBG("Channel: %d", channel); |
sev2000 | 12:6d3638a225dd | 461 | |
sev2000 | 12:6d3638a225dd | 462 | // tmp= (nibble[8] & 0x4) ? 10 : 90; |
sev2000 | 12:6d3638a225dd | 463 | // DBG("Batterie: %d", tmp); |
sev2000 | 12:6d3638a225dd | 464 | |
sev2000 | 12:6d3638a225dd | 465 | float temp = ((nibble[5]<<8 | nibble[6]<<4 | nibble[7])-720) * 0.0556; |
sev2000 | 12:6d3638a225dd | 466 | data[channel].temp1= temp; |
sev2000 | 12:6d3638a225dd | 467 | DBG("Temperature: %0.1f", temp); |
sev2000 | 12:6d3638a225dd | 468 | |
sev2000 | 12:6d3638a225dd | 469 | tmp= nibble[8] <<4 | nibble[9]; |
sev2000 | 12:6d3638a225dd | 470 | data[channel].hum1= (float)tmp; |
sev2000 | 12:6d3638a225dd | 471 | DBG("Humidity: %d", tmp); |
sev2000 | 12:6d3638a225dd | 472 | |
sev2000 | 12:6d3638a225dd | 473 | data[channel].timestamp=time(NULL); |
sev2000 | 12:6d3638a225dd | 474 | } |
sev2000 | 12:6d3638a225dd | 475 | |
sev2000 | 12:6d3638a225dd | 476 | else |
sev2000 | 12:6d3638a225dd | 477 | ERR("Checksum error %X", chksum); |
sev2000 | 12:6d3638a225dd | 478 | } |
sev2000 | 12:6d3638a225dd | 479 | else |
sev2000 | 12:6d3638a225dd | 480 | ERR("Sync error"); |
sev2000 | 12:6d3638a225dd | 481 | |
sev2000 | 12:6d3638a225dd | 482 | return 0; |
sev2000 | 12:6d3638a225dd | 483 | } |
sev2000 | 12:6d3638a225dd | 484 | |
sev2000 | 1:37ddcdfee022 | 485 | void RF_Active() |
sev2000 | 1:37ddcdfee022 | 486 | { |
sev2000 | 9:ac5060331882 | 487 | DBG("RF Active"); |
sev2000 | 9:ac5060331882 | 488 | xTime.reset(); |
sev2000 | 9:ac5060331882 | 489 | startedAt= 0; |
sev2000 | 1:37ddcdfee022 | 490 | dataPin.enable_irq(); |
sev2000 | 1:37ddcdfee022 | 491 | StbyPin = 1; |
sev2000 | 1:37ddcdfee022 | 492 | } |
sev2000 | 1:37ddcdfee022 | 493 | |
sev2000 | 1:37ddcdfee022 | 494 | void RF_StdBy() |
sev2000 | 1:37ddcdfee022 | 495 | { |
sev2000 | 9:ac5060331882 | 496 | DBG("RF Standby"); |
sev2000 | 1:37ddcdfee022 | 497 | StbyPin = 0; |
sev2000 | 1:37ddcdfee022 | 498 | dataPin.disable_irq(); |
sev2000 | 9:ac5060331882 | 499 | PulseWidth.reset(); //clear Circular Buffer |
sev2000 | 1:37ddcdfee022 | 500 | } |
sev2000 | 1:37ddcdfee022 | 501 | |
sev2000 | 0:4875d3d646de | 502 | |
sev2000 | 0:4875d3d646de | 503 | void Init_Oregon() |
sev2000 | 0:4875d3d646de | 504 | { |
sev2000 | 9:ac5060331882 | 505 | dataPin.fall(&getPulseF); |
sev2000 | 9:ac5060331882 | 506 | dataPin.rise(&getPulseR); |
sev2000 | 1:37ddcdfee022 | 507 | RF_Active(); |
sev2000 | 0:4875d3d646de | 508 | |
sev2000 | 9:ac5060331882 | 509 | xTime.start(); |
sev2000 | 9:ac5060331882 | 510 | xTime.reset(); |
sev2000 | 11:4cfdb2d79394 | 511 | dataBits[0] = 1; |
sev2000 | 1:37ddcdfee022 | 512 | O_thread.start(getData); |
sev2000 | 0:4875d3d646de | 513 | } |