X2D lib first commit

Committer:
sev2000
Date:
Sun Nov 10 16:12:44 2019 +0000
Revision:
1:265edb6bdd52
Parent:
0:9ef8edfe21bc
Child:
4:844c00dd0366
adding  SendFrame

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 1:265edb6bdd52 50 void SendBit(bool value)
sev2000 1:265edb6bdd52 51 {
sev2000 1:265edb6bdd52 52 // pc.printf("%d ", value);
sev2000 1:265edb6bdd52 53 Tx = !Tx;
sev2000 1:265edb6bdd52 54 if(value)
sev2000 1:265edb6bdd52 55 {
sev2000 1:265edb6bdd52 56 wait_us(800);
sev2000 1:265edb6bdd52 57 // pc.printf("%d, 800|", (int)Tx );
sev2000 1:265edb6bdd52 58 Tx = !Tx;
sev2000 1:265edb6bdd52 59 wait_us(800);
sev2000 1:265edb6bdd52 60 // pc.printf("%d, 800|", (int)Tx);
sev2000 1:265edb6bdd52 61 }
sev2000 1:265edb6bdd52 62 else
sev2000 1:265edb6bdd52 63 {
sev2000 1:265edb6bdd52 64 wait_us(1600);
sev2000 1:265edb6bdd52 65 // pc.printf("%d, 1600|", (int)Tx);
sev2000 1:265edb6bdd52 66 }
sev2000 1:265edb6bdd52 67 }
sev2000 1:265edb6bdd52 68
sev2000 1:265edb6bdd52 69 void SendByte(char value)
sev2000 1:265edb6bdd52 70 {
sev2000 1:265edb6bdd52 71 int i=0;
sev2000 1:265edb6bdd52 72 bool bit;
sev2000 1:265edb6bdd52 73 static char cnt=0;
sev2000 1:265edb6bdd52 74
sev2000 1:265edb6bdd52 75 pc.printf("%0.2X ", value);
sev2000 1:265edb6bdd52 76 for(i=0; i<8; i++)
sev2000 1:265edb6bdd52 77 {
sev2000 1:265edb6bdd52 78 bit = (bool)(0x01 & (value>>i)); // LSB first
sev2000 1:265edb6bdd52 79 SendBit(bit);
sev2000 1:265edb6bdd52 80 if(bit)
sev2000 1:265edb6bdd52 81 cnt++;
sev2000 1:265edb6bdd52 82 else
sev2000 1:265edb6bdd52 83 cnt=0;
sev2000 1:265edb6bdd52 84 if(cnt == 5)
sev2000 1:265edb6bdd52 85 SendBit(0);
sev2000 1:265edb6bdd52 86 }
sev2000 1:265edb6bdd52 87 }
sev2000 1:265edb6bdd52 88
sev2000 1:265edb6bdd52 89 void SendPreamble(void)
sev2000 1:265edb6bdd52 90 {
sev2000 1:265edb6bdd52 91 int i;
sev2000 1:265edb6bdd52 92
sev2000 1:265edb6bdd52 93 pc.printf("\r\n");
sev2000 1:265edb6bdd52 94 Tx=1;
sev2000 1:265edb6bdd52 95 for(i=0; i<17; i++)
sev2000 1:265edb6bdd52 96 SendBit(0);
sev2000 1:265edb6bdd52 97 for(i=0; i<6; i++)
sev2000 1:265edb6bdd52 98 SendBit(1);
sev2000 1:265edb6bdd52 99 SendBit(0);
sev2000 1:265edb6bdd52 100
sev2000 1:265edb6bdd52 101 }
sev2000 1:265edb6bdd52 102
sev2000 1:265edb6bdd52 103 void SendPostamble(void)
sev2000 1:265edb6bdd52 104 {
sev2000 1:265edb6bdd52 105 int i;
sev2000 1:265edb6bdd52 106
sev2000 1:265edb6bdd52 107 for(i=0; i<8; i++) // Send 0xFF
sev2000 1:265edb6bdd52 108 SendBit(1);
sev2000 1:265edb6bdd52 109 for(i=0; i<8; i++)
sev2000 1:265edb6bdd52 110 SendBit(0);
sev2000 1:265edb6bdd52 111
sev2000 1:265edb6bdd52 112 }
sev2000 1:265edb6bdd52 113
sev2000 1:265edb6bdd52 114 void SendFrame(char *data, int length)
sev2000 1:265edb6bdd52 115 {
sev2000 1:265edb6bdd52 116
sev2000 1:265edb6bdd52 117 int i, chksum=0;
sev2000 1:265edb6bdd52 118
sev2000 1:265edb6bdd52 119 RxTx = 0; //set pin rxtx to Tx
sev2000 1:265edb6bdd52 120 wait_ms(1);
sev2000 1:265edb6bdd52 121
sev2000 1:265edb6bdd52 122 SendPreamble();
sev2000 1:265edb6bdd52 123
sev2000 1:265edb6bdd52 124 for(i=0; i<length; i++)
sev2000 1:265edb6bdd52 125 {
sev2000 1:265edb6bdd52 126 SendByte(data[i]);
sev2000 1:265edb6bdd52 127 chksum += data[i];
sev2000 1:265edb6bdd52 128 }
sev2000 1:265edb6bdd52 129 chksum = ~chksum +1;
sev2000 1:265edb6bdd52 130
sev2000 1:265edb6bdd52 131 SendByte((char)(chksum>>8));
sev2000 1:265edb6bdd52 132 SendByte((char)chksum);
sev2000 1:265edb6bdd52 133 SendPostamble();
sev2000 1:265edb6bdd52 134
sev2000 1:265edb6bdd52 135 RxTx = 1; //set pin rxtx to Rx
sev2000 1:265edb6bdd52 136 }
sev2000 1:265edb6bdd52 137
sev2000 1:265edb6bdd52 138 void SendCmd(prog prog, int zone)
sev2000 1:265edb6bdd52 139 {
sev2000 1:265edb6bdd52 140 char tab[8]={0xF1,0xE6,0x01,0x10,0x01,0x00,0x03,0x64}; // Zone1 Sun
sev2000 1:265edb6bdd52 141 char maison[2]={0xF1,0xE6};
sev2000 1:265edb6bdd52 142 char source = 0x01;
sev2000 1:265edb6bdd52 143 char dest = 0;
sev2000 1:265edb6bdd52 144 char trans = 0x01;
sev2000 1:265edb6bdd52 145 int i;
sev2000 1:265edb6bdd52 146
sev2000 1:265edb6bdd52 147 dest = 0x10 + zone-1;
sev2000 1:265edb6bdd52 148 tab[3] = dest;
sev2000 1:265edb6bdd52 149 tab[6] = prog;
sev2000 1:265edb6bdd52 150
sev2000 1:265edb6bdd52 151 RxTx = 0; //set pin rxtx to Tx
sev2000 1:265edb6bdd52 152 wait_ms(1);
sev2000 1:265edb6bdd52 153
sev2000 1:265edb6bdd52 154 for(i=0; i<3; i++)
sev2000 1:265edb6bdd52 155 {
sev2000 1:265edb6bdd52 156 tab[5]=i; //message count
sev2000 1:265edb6bdd52 157 SendFrame(tab, 8);
sev2000 1:265edb6bdd52 158 wait_ms(30);
sev2000 1:265edb6bdd52 159 }
sev2000 1:265edb6bdd52 160
sev2000 1:265edb6bdd52 161 RxTx = 1; //set pin rxtx to Rx
sev2000 1:265edb6bdd52 162 }
sev2000 1:265edb6bdd52 163
sev2000 0:9ef8edfe21bc 164 int detectPreamble(void)
sev2000 0:9ef8edfe21bc 165 {
sev2000 0:9ef8edfe21bc 166 pulse_t pulse;
sev2000 0:9ef8edfe21bc 167 int cnt = 0;
sev2000 0:9ef8edfe21bc 168 char tmp[32]={0};
sev2000 0:9ef8edfe21bc 169 char timing[8*1024]={0};
sev2000 0:9ef8edfe21bc 170 char state=0;
sev2000 0:9ef8edfe21bc 171 char s=0, l=0, bit_ptr=0;
sev2000 0:9ef8edfe21bc 172
sev2000 0:9ef8edfe21bc 173 while (!PulseWidth.empty())
sev2000 0:9ef8edfe21bc 174 {
sev2000 0:9ef8edfe21bc 175 PulseWidth.pop(pulse);
sev2000 0:9ef8edfe21bc 176 sprintf(tmp, "%d, %ld|", pulse.pin, pulse.v);
sev2000 0:9ef8edfe21bc 177 strcat(timing, tmp);
sev2000 0:9ef8edfe21bc 178
sev2000 0:9ef8edfe21bc 179 if ((pulse.v > 700) && (pulse.v < 1000))
sev2000 0:9ef8edfe21bc 180 { // short off detected
sev2000 0:9ef8edfe21bc 181 s++;
sev2000 0:9ef8edfe21bc 182 l=0;
sev2000 0:9ef8edfe21bc 183 }
sev2000 0:9ef8edfe21bc 184 else if ((pulse.v > 1500) && (pulse.v < 1800))
sev2000 0:9ef8edfe21bc 185 { // long off detected
sev2000 0:9ef8edfe21bc 186 l++;
sev2000 0:9ef8edfe21bc 187 s=0;
sev2000 0:9ef8edfe21bc 188 }
sev2000 0:9ef8edfe21bc 189 else
sev2000 0:9ef8edfe21bc 190 {
sev2000 0:9ef8edfe21bc 191 l=0;
sev2000 0:9ef8edfe21bc 192 s=0;
sev2000 0:9ef8edfe21bc 193 bit_ptr=0;
sev2000 0:9ef8edfe21bc 194 state=0;
sev2000 0:9ef8edfe21bc 195 }
sev2000 0:9ef8edfe21bc 196 switch(state)
sev2000 0:9ef8edfe21bc 197 {
sev2000 0:9ef8edfe21bc 198 case 0: // Detect preamble
sev2000 0:9ef8edfe21bc 199 if(s >= 12) // out of 12
sev2000 0:9ef8edfe21bc 200 state=1;
sev2000 0:9ef8edfe21bc 201 //pc.printf("%d ", s);
sev2000 0:9ef8edfe21bc 202 break;
sev2000 0:9ef8edfe21bc 203 case 1: // wait start bit (first long)
sev2000 0:9ef8edfe21bc 204 //pc.printf("OK2");
sev2000 0:9ef8edfe21bc 205 s=0;
sev2000 0:9ef8edfe21bc 206 if (l==1)
sev2000 0:9ef8edfe21bc 207 {
sev2000 0:9ef8edfe21bc 208 state = 2;
sev2000 0:9ef8edfe21bc 209 //bit_ptr++; inculde start bit in payload
sev2000 0:9ef8edfe21bc 210 }
sev2000 0:9ef8edfe21bc 211 l=0;
sev2000 0:9ef8edfe21bc 212 break;
sev2000 0:9ef8edfe21bc 213 case 2:
sev2000 0:9ef8edfe21bc 214 //pc.printf(" %d", pulse.v);
sev2000 0:9ef8edfe21bc 215
sev2000 0:9ef8edfe21bc 216 if (s == 2)
sev2000 0:9ef8edfe21bc 217 {
sev2000 0:9ef8edfe21bc 218 dataBits[bit_ptr] = 1;
sev2000 0:9ef8edfe21bc 219 l=0;
sev2000 0:9ef8edfe21bc 220 s=0;
sev2000 0:9ef8edfe21bc 221 bit_ptr++;
sev2000 0:9ef8edfe21bc 222 }
sev2000 0:9ef8edfe21bc 223 if (l == 1 && s==0)
sev2000 0:9ef8edfe21bc 224 {
sev2000 0:9ef8edfe21bc 225 dataBits[bit_ptr] = 0;
sev2000 0:9ef8edfe21bc 226 l=0;
sev2000 0:9ef8edfe21bc 227 s=0;
sev2000 0:9ef8edfe21bc 228 bit_ptr++;
sev2000 0:9ef8edfe21bc 229 }
sev2000 0:9ef8edfe21bc 230 if(bit_ptr > BIT_SIZE)
sev2000 0:9ef8edfe21bc 231 {
sev2000 0:9ef8edfe21bc 232 state=0;
sev2000 0:9ef8edfe21bc 233 bit_ptr=0;
sev2000 0:9ef8edfe21bc 234 printf("Frame too long ; dropped");
sev2000 0:9ef8edfe21bc 235 }
sev2000 0:9ef8edfe21bc 236
sev2000 0:9ef8edfe21bc 237 break;
sev2000 0:9ef8edfe21bc 238 }
sev2000 0:9ef8edfe21bc 239
sev2000 0:9ef8edfe21bc 240 if(pulse.v > 30000 && cnt>0) // End of frame
sev2000 0:9ef8edfe21bc 241 {
sev2000 0:9ef8edfe21bc 242 processData();
sev2000 0:9ef8edfe21bc 243 //timing[0]=0;
sev2000 0:9ef8edfe21bc 244 state=0;
sev2000 0:9ef8edfe21bc 245 bit_ptr=0;
sev2000 0:9ef8edfe21bc 246 //PulseWidth.reset();
sev2000 0:9ef8edfe21bc 247 // WARN(" Waiting...");
sev2000 0:9ef8edfe21bc 248 }
sev2000 0:9ef8edfe21bc 249
sev2000 0:9ef8edfe21bc 250 cnt++;
sev2000 0:9ef8edfe21bc 251 }
sev2000 0:9ef8edfe21bc 252 if (cnt>0) // if buffer wasn't empty
sev2000 0:9ef8edfe21bc 253 {
sev2000 0:9ef8edfe21bc 254 processData();
sev2000 0:9ef8edfe21bc 255 //pc.printf("%s\r\n", timing);
sev2000 0:9ef8edfe21bc 256 }
sev2000 0:9ef8edfe21bc 257
sev2000 0:9ef8edfe21bc 258 return(0);
sev2000 0:9ef8edfe21bc 259 }
sev2000 0:9ef8edfe21bc 260
sev2000 0:9ef8edfe21bc 261 int processData(void)
sev2000 0:9ef8edfe21bc 262 {
sev2000 0:9ef8edfe21bc 263 int x=0;
sev2000 0:9ef8edfe21bc 264 int i = 0;
sev2000 0:9ef8edfe21bc 265 int j= 0;
sev2000 0:9ef8edfe21bc 266 char nibble[18]={0}, cnt=0;
sev2000 0:9ef8edfe21bc 267 int chksum=0, etx_ptr=16;
sev2000 0:9ef8edfe21bc 268
sev2000 0:9ef8edfe21bc 269 /* pc.printf("\r\n");
sev2000 0:9ef8edfe21bc 270 for (x=0;x<128;x++)
sev2000 0:9ef8edfe21bc 271 {
sev2000 0:9ef8edfe21bc 272 if(x%8==0)
sev2000 0:9ef8edfe21bc 273 pc.printf(" ");
sev2000 0:9ef8edfe21bc 274 pc.printf("%d", dataBits[x]);
sev2000 0:9ef8edfe21bc 275 }
sev2000 0:9ef8edfe21bc 276 */
sev2000 0:9ef8edfe21bc 277 x=0;
sev2000 0:9ef8edfe21bc 278
sev2000 0:9ef8edfe21bc 279 for (i=0; i<etx_ptr; i++)
sev2000 0:9ef8edfe21bc 280 {
sev2000 0:9ef8edfe21bc 281 for (j=0;j<8;j++)
sev2000 0:9ef8edfe21bc 282 {
sev2000 0:9ef8edfe21bc 283 if ( dataBits[x])
sev2000 0:9ef8edfe21bc 284 {
sev2000 0:9ef8edfe21bc 285 nibble[i] |= 1<<j;
sev2000 0:9ef8edfe21bc 286 cnt++;
sev2000 0:9ef8edfe21bc 287 }
sev2000 0:9ef8edfe21bc 288 else
sev2000 0:9ef8edfe21bc 289 {
sev2000 0:9ef8edfe21bc 290 if (cnt == 5)
sev2000 0:9ef8edfe21bc 291 j--;
sev2000 0:9ef8edfe21bc 292 cnt=0;
sev2000 0:9ef8edfe21bc 293 }
sev2000 0:9ef8edfe21bc 294 dataBits[x] =0; // clean variable
sev2000 0:9ef8edfe21bc 295 x++;
sev2000 0:9ef8edfe21bc 296 }
sev2000 0:9ef8edfe21bc 297 if (cnt >= 8) // End of Frame detection
sev2000 0:9ef8edfe21bc 298 etx_ptr=i;
sev2000 0:9ef8edfe21bc 299 }
sev2000 0:9ef8edfe21bc 300
sev2000 0:9ef8edfe21bc 301
sev2000 0:9ef8edfe21bc 302 for (i=0; i<etx_ptr-2; i++) // Calculate Checksum
sev2000 0:9ef8edfe21bc 303 chksum += nibble[i];
sev2000 0:9ef8edfe21bc 304 chksum = ~chksum +1;
sev2000 0:9ef8edfe21bc 305
sev2000 0:9ef8edfe21bc 306 #ifdef __DEBUG__
sev2000 0:9ef8edfe21bc 307 for (i=0; i<etx_ptr; i++)
sev2000 0:9ef8edfe21bc 308 pc.printf("%0.2X ",nibble[i]);
sev2000 0:9ef8edfe21bc 309 if ( (char)(chksum>>8) != nibble[etx_ptr-2] || (char)chksum != nibble[etx_ptr-1] )
sev2000 0:9ef8edfe21bc 310 pc.printf(" CRC Error");
sev2000 0:9ef8edfe21bc 311 pc.printf("\r\n");
sev2000 0:9ef8edfe21bc 312 #endif
sev2000 0:9ef8edfe21bc 313
sev2000 0:9ef8edfe21bc 314 return 0;
sev2000 0:9ef8edfe21bc 315 }
sev2000 0:9ef8edfe21bc 316
sev2000 0:9ef8edfe21bc 317
sev2000 0:9ef8edfe21bc 318 void Init_X2D()
sev2000 0:9ef8edfe21bc 319 {
sev2000 0:9ef8edfe21bc 320 DataPin.fall(&getPulseF);
sev2000 0:9ef8edfe21bc 321 DataPin.rise(&getPulseR);
sev2000 0:9ef8edfe21bc 322 UART = 1;
sev2000 0:9ef8edfe21bc 323 RxTx = 1; //set pin rxtx to Rx
sev2000 0:9ef8edfe21bc 324 Reg_Data = 0; //set pin reg_data
sev2000 0:9ef8edfe21bc 325 Tx = 0;
sev2000 0:9ef8edfe21bc 326
sev2000 0:9ef8edfe21bc 327 xTime.start();
sev2000 0:9ef8edfe21bc 328 xTime.reset();
sev2000 0:9ef8edfe21bc 329 startedAt = xTime.read_us(); // set initial timer end
sev2000 0:9ef8edfe21bc 330
sev2000 0:9ef8edfe21bc 331 //thread.start(getData);
sev2000 0:9ef8edfe21bc 332 }