X2D lib first commit

Revision:
0:9ef8edfe21bc
Child:
1:265edb6bdd52
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/X2D.cpp	Sun Nov 10 16:01:32 2019 +0000
@@ -0,0 +1,218 @@
+#include "mbed.h" 
+#include "X2D.h" 
+
+#define BUF_SIZE    1000
+#define BIT_SIZE    145
+
+int processData(void);
+
+DigitalOut Reg_Data(PC_1);
+DigitalOut RxTx(PB_0);
+DigitalOut Tx(PA_9);
+DigitalOut UART(PA_0, 1);
+
+DigitalIn CD(PC_0);
+//DigitalIn Rx(PB_7);
+DigitalIn BU(PA_4);
+DigitalIn CLR(PA_1);
+DigitalIn RSTO(PC_2);
+
+InterruptIn DataPin(PB_7, PullUp);
+
+pulse_t timeDiff;
+CircularBuffer<pulse_t, BUF_SIZE> PulseWidth;
+bool dataBits[BIT_SIZE]={0}; // 18 Nibbles +1
+
+
+long startedAt=0;
+long endedAt=0;
+
+Timer xTime; 
+
+void getPulseF(void)
+{
+        endedAt = xTime.read_us(); // set timer end for last pin
+        timeDiff.v = endedAt - startedAt;
+        timeDiff.pin = 1;
+        PulseWidth.push(timeDiff);
+        startedAt= endedAt; //  set timer start for this pin
+}
+
+void getPulseR(void)
+{
+        endedAt = xTime.read_us(); // set timer end for last pin
+        timeDiff.v = endedAt - startedAt;
+        timeDiff.pin = 0;
+        PulseWidth.push(timeDiff);
+        startedAt= endedAt; //  set timer start for this pin
+}
+
+int detectPreamble(void)
+{
+pulse_t pulse;
+int cnt = 0;
+char tmp[32]={0};
+char timing[8*1024]={0};
+char state=0;
+char s=0, l=0, bit_ptr=0;
+
+    while (!PulseWidth.empty())
+    {
+        PulseWidth.pop(pulse);
+        sprintf(tmp, "%d, %ld|", pulse.pin, pulse.v);
+        strcat(timing, tmp);
+        
+        if ((pulse.v > 700) && (pulse.v < 1000))
+                { // short off detected
+                    s++;
+                    l=0;
+                }
+        else if ((pulse.v > 1500) && (pulse.v < 1800))
+                { // long off detected
+                    l++;
+                    s=0;
+                }
+        else
+                {
+                    l=0;
+                    s=0;
+                    bit_ptr=0;
+                    state=0;
+                }
+        switch(state)
+            {
+            case 0:     // Detect preamble 
+                        if(s >= 12) // out of 12
+                            state=1;
+                        //pc.printf("%d ", s);
+                        break;
+            case 1:     // wait start bit (first long)
+                        //pc.printf("OK2");
+                        s=0;
+                        if (l==1)
+                            {
+                            state = 2;
+                            //bit_ptr++; inculde start bit in payload
+                            }
+                        l=0;
+                        break;
+            case 2: 
+                        //pc.printf(" %d", pulse.v);
+            
+                        if (s == 2)
+                            { 
+                            dataBits[bit_ptr] = 1;
+                            l=0;
+                            s=0;
+                            bit_ptr++;
+                            }
+                        if (l == 1 && s==0)
+                            {
+                            dataBits[bit_ptr] = 0;
+                            l=0;
+                            s=0;
+                            bit_ptr++;
+                            }
+                        if(bit_ptr > BIT_SIZE)
+                            {
+                            state=0;
+                            bit_ptr=0;
+                            printf("Frame too long ; dropped");
+                            }
+                            
+                        break;
+            }
+                        
+        if(pulse.v > 30000 && cnt>0)     // End of frame
+              {
+              processData();
+              //timing[0]=0;
+              state=0;
+              bit_ptr=0;
+              //PulseWidth.reset();
+//              WARN(" Waiting...");
+              }
+       
+        cnt++;
+    }
+    if (cnt>0)      // if buffer wasn't empty
+        {
+        processData();
+        //pc.printf("%s\r\n", timing);
+        }
+
+    return(0);
+}
+
+int processData(void)
+{
+int x=0;
+int i = 0;
+int j=  0;
+char nibble[18]={0}, cnt=0;
+int chksum=0, etx_ptr=16;
+
+/*    pc.printf("\r\n");
+    for (x=0;x<128;x++)
+    {
+        if(x%8==0)
+            pc.printf(" ");
+        pc.printf("%d", dataBits[x]);
+    }
+*/
+x=0;
+
+    for (i=0; i<etx_ptr; i++)
+        {
+        for (j=0;j<8;j++)
+            {
+            if ( dataBits[x])
+                {
+                nibble[i] |= 1<<j;
+                cnt++;
+                }
+            else
+                {
+                if (cnt == 5)
+                    j--;
+                cnt=0;
+                }
+            dataBits[x] =0; // clean variable
+            x++;
+            }
+        if (cnt >= 8)    // End of Frame detection
+            etx_ptr=i;
+        }
+                
+
+    for (i=0; i<etx_ptr-2; i++)   // Calculate Checksum
+        chksum += nibble[i];
+    chksum = ~chksum +1;
+        
+#ifdef __DEBUG__
+    for (i=0; i<etx_ptr; i++)
+        pc.printf("%0.2X ",nibble[i]);
+    if ( (char)(chksum>>8) != nibble[etx_ptr-2] || (char)chksum != nibble[etx_ptr-1] )
+        pc.printf("  CRC Error");
+    pc.printf("\r\n");
+#endif
+    
+    return 0;
+}
+
+
+void Init_X2D()
+{
+    DataPin.fall(&getPulseF);
+    DataPin.rise(&getPulseR);
+    UART = 1;
+    RxTx = 1;       //set pin rxtx to Rx
+    Reg_Data = 0;   //set pin reg_data 
+    Tx = 0;
+
+    xTime.start();
+    xTime.reset();
+    startedAt = xTime.read_us(); // set initial timer end
+
+    //thread.start(getData);
+}
\ No newline at end of file