Eric Monjalon / Oregon_Decode

Dependents:   Oregon_Decoder_V2_V3

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");