X2D lib first commit

Committer:
sev2000
Date:
Sun Nov 10 16:01:32 2019 +0000
Revision:
0:9ef8edfe21bc
Child:
1:265edb6bdd52
Create Library

Who changed what in which revision?

UserRevisionLine numberNew contents of line
sev2000 0:9ef8edfe21bc 1 #include "mbed.h"
sev2000 0:9ef8edfe21bc 2 #include "X2D.h"
sev2000 0:9ef8edfe21bc 3
sev2000 0:9ef8edfe21bc 4 #define BUF_SIZE 1000
sev2000 0:9ef8edfe21bc 5 #define BIT_SIZE 145
sev2000 0:9ef8edfe21bc 6
sev2000 0:9ef8edfe21bc 7 int processData(void);
sev2000 0:9ef8edfe21bc 8
sev2000 0:9ef8edfe21bc 9 DigitalOut Reg_Data(PC_1);
sev2000 0:9ef8edfe21bc 10 DigitalOut RxTx(PB_0);
sev2000 0:9ef8edfe21bc 11 DigitalOut Tx(PA_9);
sev2000 0:9ef8edfe21bc 12 DigitalOut UART(PA_0, 1);
sev2000 0:9ef8edfe21bc 13
sev2000 0:9ef8edfe21bc 14 DigitalIn CD(PC_0);
sev2000 0:9ef8edfe21bc 15 //DigitalIn Rx(PB_7);
sev2000 0:9ef8edfe21bc 16 DigitalIn BU(PA_4);
sev2000 0:9ef8edfe21bc 17 DigitalIn CLR(PA_1);
sev2000 0:9ef8edfe21bc 18 DigitalIn RSTO(PC_2);
sev2000 0:9ef8edfe21bc 19
sev2000 0:9ef8edfe21bc 20 InterruptIn DataPin(PB_7, PullUp);
sev2000 0:9ef8edfe21bc 21
sev2000 0:9ef8edfe21bc 22 pulse_t timeDiff;
sev2000 0:9ef8edfe21bc 23 CircularBuffer<pulse_t, BUF_SIZE> PulseWidth;
sev2000 0:9ef8edfe21bc 24 bool dataBits[BIT_SIZE]={0}; // 18 Nibbles +1
sev2000 0:9ef8edfe21bc 25
sev2000 0:9ef8edfe21bc 26
sev2000 0:9ef8edfe21bc 27 long startedAt=0;
sev2000 0:9ef8edfe21bc 28 long endedAt=0;
sev2000 0:9ef8edfe21bc 29
sev2000 0:9ef8edfe21bc 30 Timer xTime;
sev2000 0:9ef8edfe21bc 31
sev2000 0:9ef8edfe21bc 32 void getPulseF(void)
sev2000 0:9ef8edfe21bc 33 {
sev2000 0:9ef8edfe21bc 34 endedAt = xTime.read_us(); // set timer end for last pin
sev2000 0:9ef8edfe21bc 35 timeDiff.v = endedAt - startedAt;
sev2000 0:9ef8edfe21bc 36 timeDiff.pin = 1;
sev2000 0:9ef8edfe21bc 37 PulseWidth.push(timeDiff);
sev2000 0:9ef8edfe21bc 38 startedAt= endedAt; // set timer start for this pin
sev2000 0:9ef8edfe21bc 39 }
sev2000 0:9ef8edfe21bc 40
sev2000 0:9ef8edfe21bc 41 void getPulseR(void)
sev2000 0:9ef8edfe21bc 42 {
sev2000 0:9ef8edfe21bc 43 endedAt = xTime.read_us(); // set timer end for last pin
sev2000 0:9ef8edfe21bc 44 timeDiff.v = endedAt - startedAt;
sev2000 0:9ef8edfe21bc 45 timeDiff.pin = 0;
sev2000 0:9ef8edfe21bc 46 PulseWidth.push(timeDiff);
sev2000 0:9ef8edfe21bc 47 startedAt= endedAt; // set timer start for this pin
sev2000 0:9ef8edfe21bc 48 }
sev2000 0:9ef8edfe21bc 49
sev2000 0:9ef8edfe21bc 50 int detectPreamble(void)
sev2000 0:9ef8edfe21bc 51 {
sev2000 0:9ef8edfe21bc 52 pulse_t pulse;
sev2000 0:9ef8edfe21bc 53 int cnt = 0;
sev2000 0:9ef8edfe21bc 54 char tmp[32]={0};
sev2000 0:9ef8edfe21bc 55 char timing[8*1024]={0};
sev2000 0:9ef8edfe21bc 56 char state=0;
sev2000 0:9ef8edfe21bc 57 char s=0, l=0, bit_ptr=0;
sev2000 0:9ef8edfe21bc 58
sev2000 0:9ef8edfe21bc 59 while (!PulseWidth.empty())
sev2000 0:9ef8edfe21bc 60 {
sev2000 0:9ef8edfe21bc 61 PulseWidth.pop(pulse);
sev2000 0:9ef8edfe21bc 62 sprintf(tmp, "%d, %ld|", pulse.pin, pulse.v);
sev2000 0:9ef8edfe21bc 63 strcat(timing, tmp);
sev2000 0:9ef8edfe21bc 64
sev2000 0:9ef8edfe21bc 65 if ((pulse.v > 700) && (pulse.v < 1000))
sev2000 0:9ef8edfe21bc 66 { // short off detected
sev2000 0:9ef8edfe21bc 67 s++;
sev2000 0:9ef8edfe21bc 68 l=0;
sev2000 0:9ef8edfe21bc 69 }
sev2000 0:9ef8edfe21bc 70 else if ((pulse.v > 1500) && (pulse.v < 1800))
sev2000 0:9ef8edfe21bc 71 { // long off detected
sev2000 0:9ef8edfe21bc 72 l++;
sev2000 0:9ef8edfe21bc 73 s=0;
sev2000 0:9ef8edfe21bc 74 }
sev2000 0:9ef8edfe21bc 75 else
sev2000 0:9ef8edfe21bc 76 {
sev2000 0:9ef8edfe21bc 77 l=0;
sev2000 0:9ef8edfe21bc 78 s=0;
sev2000 0:9ef8edfe21bc 79 bit_ptr=0;
sev2000 0:9ef8edfe21bc 80 state=0;
sev2000 0:9ef8edfe21bc 81 }
sev2000 0:9ef8edfe21bc 82 switch(state)
sev2000 0:9ef8edfe21bc 83 {
sev2000 0:9ef8edfe21bc 84 case 0: // Detect preamble
sev2000 0:9ef8edfe21bc 85 if(s >= 12) // out of 12
sev2000 0:9ef8edfe21bc 86 state=1;
sev2000 0:9ef8edfe21bc 87 //pc.printf("%d ", s);
sev2000 0:9ef8edfe21bc 88 break;
sev2000 0:9ef8edfe21bc 89 case 1: // wait start bit (first long)
sev2000 0:9ef8edfe21bc 90 //pc.printf("OK2");
sev2000 0:9ef8edfe21bc 91 s=0;
sev2000 0:9ef8edfe21bc 92 if (l==1)
sev2000 0:9ef8edfe21bc 93 {
sev2000 0:9ef8edfe21bc 94 state = 2;
sev2000 0:9ef8edfe21bc 95 //bit_ptr++; inculde start bit in payload
sev2000 0:9ef8edfe21bc 96 }
sev2000 0:9ef8edfe21bc 97 l=0;
sev2000 0:9ef8edfe21bc 98 break;
sev2000 0:9ef8edfe21bc 99 case 2:
sev2000 0:9ef8edfe21bc 100 //pc.printf(" %d", pulse.v);
sev2000 0:9ef8edfe21bc 101
sev2000 0:9ef8edfe21bc 102 if (s == 2)
sev2000 0:9ef8edfe21bc 103 {
sev2000 0:9ef8edfe21bc 104 dataBits[bit_ptr] = 1;
sev2000 0:9ef8edfe21bc 105 l=0;
sev2000 0:9ef8edfe21bc 106 s=0;
sev2000 0:9ef8edfe21bc 107 bit_ptr++;
sev2000 0:9ef8edfe21bc 108 }
sev2000 0:9ef8edfe21bc 109 if (l == 1 && s==0)
sev2000 0:9ef8edfe21bc 110 {
sev2000 0:9ef8edfe21bc 111 dataBits[bit_ptr] = 0;
sev2000 0:9ef8edfe21bc 112 l=0;
sev2000 0:9ef8edfe21bc 113 s=0;
sev2000 0:9ef8edfe21bc 114 bit_ptr++;
sev2000 0:9ef8edfe21bc 115 }
sev2000 0:9ef8edfe21bc 116 if(bit_ptr > BIT_SIZE)
sev2000 0:9ef8edfe21bc 117 {
sev2000 0:9ef8edfe21bc 118 state=0;
sev2000 0:9ef8edfe21bc 119 bit_ptr=0;
sev2000 0:9ef8edfe21bc 120 printf("Frame too long ; dropped");
sev2000 0:9ef8edfe21bc 121 }
sev2000 0:9ef8edfe21bc 122
sev2000 0:9ef8edfe21bc 123 break;
sev2000 0:9ef8edfe21bc 124 }
sev2000 0:9ef8edfe21bc 125
sev2000 0:9ef8edfe21bc 126 if(pulse.v > 30000 && cnt>0) // End of frame
sev2000 0:9ef8edfe21bc 127 {
sev2000 0:9ef8edfe21bc 128 processData();
sev2000 0:9ef8edfe21bc 129 //timing[0]=0;
sev2000 0:9ef8edfe21bc 130 state=0;
sev2000 0:9ef8edfe21bc 131 bit_ptr=0;
sev2000 0:9ef8edfe21bc 132 //PulseWidth.reset();
sev2000 0:9ef8edfe21bc 133 // WARN(" Waiting...");
sev2000 0:9ef8edfe21bc 134 }
sev2000 0:9ef8edfe21bc 135
sev2000 0:9ef8edfe21bc 136 cnt++;
sev2000 0:9ef8edfe21bc 137 }
sev2000 0:9ef8edfe21bc 138 if (cnt>0) // if buffer wasn't empty
sev2000 0:9ef8edfe21bc 139 {
sev2000 0:9ef8edfe21bc 140 processData();
sev2000 0:9ef8edfe21bc 141 //pc.printf("%s\r\n", timing);
sev2000 0:9ef8edfe21bc 142 }
sev2000 0:9ef8edfe21bc 143
sev2000 0:9ef8edfe21bc 144 return(0);
sev2000 0:9ef8edfe21bc 145 }
sev2000 0:9ef8edfe21bc 146
sev2000 0:9ef8edfe21bc 147 int processData(void)
sev2000 0:9ef8edfe21bc 148 {
sev2000 0:9ef8edfe21bc 149 int x=0;
sev2000 0:9ef8edfe21bc 150 int i = 0;
sev2000 0:9ef8edfe21bc 151 int j= 0;
sev2000 0:9ef8edfe21bc 152 char nibble[18]={0}, cnt=0;
sev2000 0:9ef8edfe21bc 153 int chksum=0, etx_ptr=16;
sev2000 0:9ef8edfe21bc 154
sev2000 0:9ef8edfe21bc 155 /* pc.printf("\r\n");
sev2000 0:9ef8edfe21bc 156 for (x=0;x<128;x++)
sev2000 0:9ef8edfe21bc 157 {
sev2000 0:9ef8edfe21bc 158 if(x%8==0)
sev2000 0:9ef8edfe21bc 159 pc.printf(" ");
sev2000 0:9ef8edfe21bc 160 pc.printf("%d", dataBits[x]);
sev2000 0:9ef8edfe21bc 161 }
sev2000 0:9ef8edfe21bc 162 */
sev2000 0:9ef8edfe21bc 163 x=0;
sev2000 0:9ef8edfe21bc 164
sev2000 0:9ef8edfe21bc 165 for (i=0; i<etx_ptr; i++)
sev2000 0:9ef8edfe21bc 166 {
sev2000 0:9ef8edfe21bc 167 for (j=0;j<8;j++)
sev2000 0:9ef8edfe21bc 168 {
sev2000 0:9ef8edfe21bc 169 if ( dataBits[x])
sev2000 0:9ef8edfe21bc 170 {
sev2000 0:9ef8edfe21bc 171 nibble[i] |= 1<<j;
sev2000 0:9ef8edfe21bc 172 cnt++;
sev2000 0:9ef8edfe21bc 173 }
sev2000 0:9ef8edfe21bc 174 else
sev2000 0:9ef8edfe21bc 175 {
sev2000 0:9ef8edfe21bc 176 if (cnt == 5)
sev2000 0:9ef8edfe21bc 177 j--;
sev2000 0:9ef8edfe21bc 178 cnt=0;
sev2000 0:9ef8edfe21bc 179 }
sev2000 0:9ef8edfe21bc 180 dataBits[x] =0; // clean variable
sev2000 0:9ef8edfe21bc 181 x++;
sev2000 0:9ef8edfe21bc 182 }
sev2000 0:9ef8edfe21bc 183 if (cnt >= 8) // End of Frame detection
sev2000 0:9ef8edfe21bc 184 etx_ptr=i;
sev2000 0:9ef8edfe21bc 185 }
sev2000 0:9ef8edfe21bc 186
sev2000 0:9ef8edfe21bc 187
sev2000 0:9ef8edfe21bc 188 for (i=0; i<etx_ptr-2; i++) // Calculate Checksum
sev2000 0:9ef8edfe21bc 189 chksum += nibble[i];
sev2000 0:9ef8edfe21bc 190 chksum = ~chksum +1;
sev2000 0:9ef8edfe21bc 191
sev2000 0:9ef8edfe21bc 192 #ifdef __DEBUG__
sev2000 0:9ef8edfe21bc 193 for (i=0; i<etx_ptr; i++)
sev2000 0:9ef8edfe21bc 194 pc.printf("%0.2X ",nibble[i]);
sev2000 0:9ef8edfe21bc 195 if ( (char)(chksum>>8) != nibble[etx_ptr-2] || (char)chksum != nibble[etx_ptr-1] )
sev2000 0:9ef8edfe21bc 196 pc.printf(" CRC Error");
sev2000 0:9ef8edfe21bc 197 pc.printf("\r\n");
sev2000 0:9ef8edfe21bc 198 #endif
sev2000 0:9ef8edfe21bc 199
sev2000 0:9ef8edfe21bc 200 return 0;
sev2000 0:9ef8edfe21bc 201 }
sev2000 0:9ef8edfe21bc 202
sev2000 0:9ef8edfe21bc 203
sev2000 0:9ef8edfe21bc 204 void Init_X2D()
sev2000 0:9ef8edfe21bc 205 {
sev2000 0:9ef8edfe21bc 206 DataPin.fall(&getPulseF);
sev2000 0:9ef8edfe21bc 207 DataPin.rise(&getPulseR);
sev2000 0:9ef8edfe21bc 208 UART = 1;
sev2000 0:9ef8edfe21bc 209 RxTx = 1; //set pin rxtx to Rx
sev2000 0:9ef8edfe21bc 210 Reg_Data = 0; //set pin reg_data
sev2000 0:9ef8edfe21bc 211 Tx = 0;
sev2000 0:9ef8edfe21bc 212
sev2000 0:9ef8edfe21bc 213 xTime.start();
sev2000 0:9ef8edfe21bc 214 xTime.reset();
sev2000 0:9ef8edfe21bc 215 startedAt = xTime.read_us(); // set initial timer end
sev2000 0:9ef8edfe21bc 216
sev2000 0:9ef8edfe21bc 217 //thread.start(getData);
sev2000 0:9ef8edfe21bc 218 }