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

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?

UserRevisionLine numberNew 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 }