Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: Oregon_Decoder_V2_V3
Diff: OregonBit.cpp
- Revision:
- 12:6d3638a225dd
- Parent:
- 11:4cfdb2d79394
- Child:
- 13:87e9b1cd65c2
diff -r 4cfdb2d79394 -r 6d3638a225dd OregonBit.cpp
--- a/OregonBit.cpp Sun Apr 26 06:37:46 2020 +0000
+++ b/OregonBit.cpp Tue Jul 14 15:15:25 2020 +0000
@@ -1,9 +1,11 @@
-#include "rtos.h"
+#include "mbed.h"
#include "Regul.h"
-#define Level 1
+//#define Level 3
int processData(measure_t*, int version);
+int processDataTFA(measure_t*);
+
typedef struct {
int v;
@@ -83,42 +85,53 @@
while(!PulseWidth.empty() && i<200)
{
PulseWidth.pop(pulse);
+ i++;
//pc.printf("%d,", pulse.v);
- if (pulse.pin == 0) //Pin was OFF
+ if ((pulse.v > onShortLo) && (pulse.v < offLongHi))
{
- if ((pulse.v > offShortLo) && (pulse.v < offShortHi))
- { // short off detected
+ if (pulse.pin == 0) //Pin was OFF
+ {
+ if ((pulse.v > offShortLo) && (pulse.v < offShortHi))
+ { // short off detected
+ s++;
+ l=0;
+ }
+ else if (pulse.v > offLongLo) // If we are here (pulse.v < offLongHi)
+ { // long off detected
+ l++;
+ s=0;
+ }
+ else
+ {
+ l=0;
+ s=0;
+ }
+ }
+ else // Pin was ON
+ {
+ if (pulse.v < onShortHi) // half-time, If we are here (pulse.v > onShortLo)
+ { // short on detetcted
s++;
l=0;
- }
- else if ((pulse.v > offLongLo) && (pulse.v < offLongHi))
- { // long off detected
+ }
+ else if ((pulse.v > onLongLo) && (pulse.v < onLongHi)) // full-time
+ { // long on detected
l++;
s=0;
- }
- else
- {
- l=0;
- s=0;
+ }
+ else
+ {
+ l=0;
+ s=0;
+ }
}
}
- else // Pin was ON
+ else // Not Oregon Pulse
{
- if ((pulse.v > onShortLo) && (pulse.v < onShortHi)) // half-time
- { // short on detetcted
- s++;
- l=0;
- }
- else if ((pulse.v > onLongLo) && (pulse.v < onLongHi)) // full-time
- { // long on detected
- l++;
- s=0;
- }
- else
- {
- l=0;
- s=0;
- }
+ l=0;
+ s=0;
+ state=0;
+ continue;
}
switch(state)
@@ -126,18 +139,38 @@
case 0: // Detect preamble
if(l >= 24) // out of 32
state=1;
+ if(s == 18) // out of 22
+ state=11;
if(s >= 40) // out of 48
- state=11;
+ state=12;
//pc.printf("%d ", l);
break;
case 1: // wait start bit (first short in V2.1)
- //pc.printf("OK2");
+ //printf("OK2");
l=0;
if (s==1)
+ {
state = 2;
+ bit_ptr=1;
+ }
break;
- case 11: // wait start bit (first long in V3)
- //pc.printf("OK3");
+ case 11: // wait start bit (2 longs in WS-07)
+ //printf("OK4");
+
+ if(s>22)
+ state=0;
+
+ if(l==2)
+ {
+ state = 22;
+ dataBits[1]=1; // l => opposite of previous (0)
+ bit_ptr=2;
+ l=0;
+ s=0;
+ }
+ break;
+ case 12: // wait start bit (first long in V3)
+ //printf("OK3");
s=0;
if (l==1)
{
@@ -230,10 +263,48 @@
WARN(" Waiting...");
}
break;
+ case 22:
+ //pc.printf(" %d", pulse.v);
+ if(s==0 && l==0)
+ {
+ ERR(" %s : %d\t", (pulse.pin ? "on" : "off"), pulse.v);
+
+ if (pulse.v > 736)
+ l=1;
+ else
+ s=1;
+ }
+
+ if(s==1 && l==1)
+ ERR(" %s : %d\t", (pulse.pin ? "on" : "off"), pulse.v);
+
+ if (s == 2)
+ { // 2 short pulses this bit equals previous bit (we know 1st bit from sync)
+ dataBits[bit_ptr] = dataBits[bit_ptr-1];
+ //pc.printf(",[%d]%d",bit_ptr, dataBits[bit_ptr]);
+ bit_ptr++;
+ s=0;
+ l=0;
+ }
+ if (l == 1)
+ { // 1 long pulse this bit is inverse of previous bit (we know 1st bit from sync)
+ dataBits[bit_ptr] = !dataBits[bit_ptr-1];
+ l=0;
+ s=0;
+ //pc.printf(",[%d]%d",bit_ptr, dataBits[bit_ptr]);
+ bit_ptr++;
+ }
+ if(bit_ptr>50)
+ {
+ processDataTFA(Sensor);
+ state=0;
+ bit_ptr=1;
+ WARN(" Waiting...");
+ }
+ break;
}
- i++;
}
- Thread::wait(100);
+ ThisThread::sleep_for(100);
}
// return 0;
}
@@ -264,10 +335,10 @@
dataBits[x]=0;
}
-#ifdef __DEBUG__
+#if __DEBUG__
for (i=0;i<18;i++)
- pc.printf("%X ",nibble[i]);
- pc.printf("\r\n");
+ printf("%X ",nibble[i]);
+ printf("\r\n");
#endif
//Decoding for THGR122NX(1D20) and THGR810(F8B4)
@@ -305,6 +376,112 @@
ERR("Sync error");
return 0;
}
+
+uint8_t Checksum(int length, uint8_t *buff)
+{
+uint8_t mask = 0x7C;
+uint8_t checksum = 0x64;
+uint8_t data;
+int byteCnt;
+
+for ( byteCnt = 0; byteCnt < length; byteCnt++)
+ {
+ int bitCnt;
+ data = buff[byteCnt*2]<<4 | buff[byteCnt*2+1];
+
+ for ( bitCnt = 7; bitCnt >= 0 ; bitCnt-- )
+ {
+ uint8_t bit;
+
+ // Rotate mask right
+ bit = mask & 1;
+ mask = (mask >> 1 ) | (mask << 7);
+ if ( bit )
+ {
+ mask ^= 0x18;
+ }
+
+ // XOR mask into checksum if data bit is 1
+ if ( data & 0x80 )
+ {
+ checksum ^= mask;
+ }
+ data <<= 1;
+ }
+ }
+
+return checksum;
+}
+
+int processDataTFA(measure_t *data)
+{
+int x;
+int i = 0;
+int j= 0;
+char nibble[12]={0}, chksum=0;
+int tmp;
+char channel;
+
+ x= 2;
+ for (i=0;i<12;i++)
+ {
+ for (j=0;j<4;j++)
+ {
+ if ( dataBits[x])
+ nibble[i] |= 1<< (3-j);
+ x++;
+ }
+ }
+
+ for (x=1;x<50;x++)
+ {
+ //printf("%d", dataBits[x]);
+ dataBits[x]=0;
+ }
+
+#if __DEBUG__
+ for (i=0;i<12;i++)
+ printf("%X ",nibble[i]);
+ printf("\r\n");
+#endif
+
+//Decoding for WS-07, sensor_id==0x46
+ if( 0x04 == nibble[0])
+ {
+ //45 4F 04 4B 0B 52 0
+ //01000101 01001111 00000100 01001011 00001011 01010010 0000
+ //SSSSSSSS NRRRRRRR bCCCTTTT TTTTTTTT HHHHHHHH CCCCCCCC ????
+
+ chksum = Checksum(5, (uint8_t*)nibble);
+ if (chksum == (nibble[10]<<4 | nibble[11]))
+ {
+ channel = nibble[4]+1;
+ data[channel].deviceID = channel;
+ DBG("Channel: %d", channel);
+
+// tmp= (nibble[8] & 0x4) ? 10 : 90;
+// DBG("Batterie: %d", tmp);
+
+ float temp = ((nibble[5]<<8 | nibble[6]<<4 | nibble[7])-720) * 0.0556;
+ data[channel].temp1= temp;
+ DBG("Temperature: %0.1f", temp);
+
+ tmp= nibble[8] <<4 | nibble[9];
+ data[channel].hum1= (float)tmp;
+ DBG("Humidity: %d", tmp);
+
+ data[channel].timestamp=time(NULL);
+ }
+
+ else
+ ERR("Checksum error %X", chksum);
+ }
+ else
+ ERR("Sync error");
+
+return 0;
+}
+
void RF_Active()
{
DBG("RF Active");