X2D lib first commit

Committer:
sev2000
Date:
Sat Dec 14 08:31:18 2019 +0000
Revision:
15:2f74266340ac
Parent:
14:b368fb51df96
Child:
17:2a9e02dccd88
Stable version without Setup page

Who changed what in which revision?

UserRevisionLine numberNew contents of line
sev2000 0:9ef8edfe21bc 1 #include "mbed.h"
sev2000 10:65fd918fc224 2 #include "rtos.h"
sev2000 0:9ef8edfe21bc 3 #include "X2D.h"
sev2000 0:9ef8edfe21bc 4
sev2000 10:65fd918fc224 5 #define BUF_SIZE 1000
sev2000 7:eaa973daaf58 6 #define BIT_SIZE 160 //16Bytes + 0xFF + 0x00 + 3 bits + (n * 0 bit inserted by the X2D protocole to cut 0xFF
sev2000 0:9ef8edfe21bc 7
sev2000 13:345e4251cf25 8 int processData(int size);
sev2000 0:9ef8edfe21bc 9
sev2000 15:2f74266340ac 10 DigitalOut Reg_Data(PC_1); // Jaune
sev2000 15:2f74266340ac 11 DigitalOut RxTx(PC_0); // Bleu
sev2000 15:2f74266340ac 12 DigitalOut Tx(PA_9); // Noir
sev2000 15:2f74266340ac 13 DigitalOut UART(PA_0, 1); // Rouge
sev2000 0:9ef8edfe21bc 14
sev2000 15:2f74266340ac 15 //DigitalIn CD(PC_0); // Bleu
sev2000 15:2f74266340ac 16 //DigitalIn Rx(PB_7); // Vert
sev2000 15:2f74266340ac 17 //DigitalIn BU(PA_4); // Blanc
sev2000 15:2f74266340ac 18 DigitalIn CLR(PA_1); // Orange
sev2000 15:2f74266340ac 19 DigitalIn RSTO(PC_2); // Gris
sev2000 0:9ef8edfe21bc 20
sev2000 4:844c00dd0366 21 InterruptIn Rx(PB_7, PullUp);
sev2000 0:9ef8edfe21bc 22
sev2000 15:2f74266340ac 23 PlatformMutex sendbit_mutex;
sev2000 15:2f74266340ac 24
sev2000 0:9ef8edfe21bc 25 pulse_t timeDiff;
sev2000 0:9ef8edfe21bc 26 CircularBuffer<pulse_t, BUF_SIZE> PulseWidth;
sev2000 13:345e4251cf25 27 CircularBuffer<msg_t, 10> MessageTx;
sev2000 13:345e4251cf25 28 CircularBuffer<msg_t, 10> MessageRx;
sev2000 13:345e4251cf25 29
sev2000 7:eaa973daaf58 30 bool dataBits[BIT_SIZE]={0};
sev2000 0:9ef8edfe21bc 31
sev2000 0:9ef8edfe21bc 32
sev2000 0:9ef8edfe21bc 33 long startedAt=0;
sev2000 0:9ef8edfe21bc 34 long endedAt=0;
sev2000 0:9ef8edfe21bc 35
sev2000 0:9ef8edfe21bc 36 Timer xTime;
sev2000 0:9ef8edfe21bc 37
sev2000 15:2f74266340ac 38 Thread thread(osPriorityAboveNormal);
sev2000 10:65fd918fc224 39
sev2000 0:9ef8edfe21bc 40 void getPulseF(void)
sev2000 0:9ef8edfe21bc 41 {
sev2000 0:9ef8edfe21bc 42 endedAt = xTime.read_us(); // set timer end for last pin
sev2000 0:9ef8edfe21bc 43 timeDiff.v = endedAt - startedAt;
sev2000 0:9ef8edfe21bc 44 timeDiff.pin = 1;
sev2000 0:9ef8edfe21bc 45 PulseWidth.push(timeDiff);
sev2000 0:9ef8edfe21bc 46 startedAt= endedAt; // set timer start for this pin
sev2000 0:9ef8edfe21bc 47 }
sev2000 0:9ef8edfe21bc 48
sev2000 0:9ef8edfe21bc 49 void getPulseR(void)
sev2000 0:9ef8edfe21bc 50 {
sev2000 0:9ef8edfe21bc 51 endedAt = xTime.read_us(); // set timer end for last pin
sev2000 0:9ef8edfe21bc 52 timeDiff.v = endedAt - startedAt;
sev2000 0:9ef8edfe21bc 53 timeDiff.pin = 0;
sev2000 0:9ef8edfe21bc 54 PulseWidth.push(timeDiff);
sev2000 0:9ef8edfe21bc 55 startedAt= endedAt; // set timer start for this pin
sev2000 0:9ef8edfe21bc 56 }
sev2000 0:9ef8edfe21bc 57
sev2000 4:844c00dd0366 58 void wait_posedge(void)
sev2000 4:844c00dd0366 59 {
sev2000 4:844c00dd0366 60 if(CLR != 0)
sev2000 4:844c00dd0366 61 {
sev2000 4:844c00dd0366 62 while(CLR != 0) ;
sev2000 4:844c00dd0366 63 }
sev2000 4:844c00dd0366 64 else ;
sev2000 4:844c00dd0366 65 while(CLR == 0) ;
sev2000 4:844c00dd0366 66 }
sev2000 4:844c00dd0366 67
sev2000 4:844c00dd0366 68 void wait_negedge(void)
sev2000 4:844c00dd0366 69 {
sev2000 4:844c00dd0366 70 if(CLR == 0)
sev2000 4:844c00dd0366 71 {
sev2000 4:844c00dd0366 72 while(CLR == 0) ;
sev2000 4:844c00dd0366 73 }
sev2000 4:844c00dd0366 74 else ;
sev2000 4:844c00dd0366 75 while(CLR != 0) ;
sev2000 4:844c00dd0366 76 }
sev2000 4:844c00dd0366 77
sev2000 4:844c00dd0366 78 unsigned long read_ctrl_reg(void)
sev2000 4:844c00dd0366 79 {
sev2000 4:844c00dd0366 80 unsigned long return_value = 0;
sev2000 4:844c00dd0366 81 unsigned long curr_bit = 0 ;
sev2000 4:844c00dd0366 82 int i ;
sev2000 4:844c00dd0366 83
sev2000 4:844c00dd0366 84 RxTx = 1;
sev2000 4:844c00dd0366 85 //Reg_Data = 0;
sev2000 4:844c00dd0366 86 wait_posedge();
sev2000 4:844c00dd0366 87 //wait_ms(10);
sev2000 4:844c00dd0366 88 Reg_Data = 1;
sev2000 4:844c00dd0366 89 RxTx = 1;
sev2000 4:844c00dd0366 90
sev2000 4:844c00dd0366 91 for(i=0;i<=23;i++)
sev2000 4:844c00dd0366 92 {
sev2000 4:844c00dd0366 93 //DBG("i= %d", i);
sev2000 4:844c00dd0366 94 wait_posedge();
sev2000 4:844c00dd0366 95 curr_bit = Rx ;
sev2000 4:844c00dd0366 96 return_value |= ((curr_bit) << (23-i)) ;
sev2000 4:844c00dd0366 97 }
sev2000 4:844c00dd0366 98 //wait_negedge();
sev2000 4:844c00dd0366 99
sev2000 4:844c00dd0366 100 Reg_Data = 0; //clr pin reg_data
sev2000 4:844c00dd0366 101
sev2000 4:844c00dd0366 102 wait(1) ;
sev2000 4:844c00dd0366 103 return return_value ;
sev2000 4:844c00dd0366 104 }
sev2000 4:844c00dd0366 105
sev2000 4:844c00dd0366 106 void write_ctrl_reg(unsigned long write_data)
sev2000 4:844c00dd0366 107 {
sev2000 4:844c00dd0366 108 int i ;
sev2000 4:844c00dd0366 109
sev2000 5:dcbebd42186a 110 Reg_Data = 1; //set pin reg_data to Register mode
sev2000 5:dcbebd42186a 111 RxTx = 0; //set pin rxtx to Tx mode
sev2000 6:e373216c80bf 112 wait_posedge(); //find posedge for Tcr
sev2000 4:844c00dd0366 113
sev2000 4:844c00dd0366 114 for(i=0;i<=23;i++) //low code effciency may result in wrong writing
sev2000 4:844c00dd0366 115 {
sev2000 4:844c00dd0366 116 if(((write_data >> (23-i)) & 0x1) == 0)
sev2000 4:844c00dd0366 117 {
sev2000 4:844c00dd0366 118 Tx = 0;
sev2000 4:844c00dd0366 119 }
sev2000 4:844c00dd0366 120 else
sev2000 4:844c00dd0366 121 {
sev2000 4:844c00dd0366 122 Tx = 1;
sev2000 4:844c00dd0366 123 }
sev2000 4:844c00dd0366 124 wait_posedge();
sev2000 4:844c00dd0366 125 }
sev2000 5:dcbebd42186a 126 RxTx = 1; //set pin rxtx to Rx
sev2000 4:844c00dd0366 127 Reg_Data = 0; //set pin reg_data
sev2000 4:844c00dd0366 128 Tx = 0;
sev2000 4:844c00dd0366 129 wait(0.1);
sev2000 4:844c00dd0366 130 }
sev2000 4:844c00dd0366 131
sev2000 1:265edb6bdd52 132 void SendBit(bool value)
sev2000 1:265edb6bdd52 133 {
sev2000 5:dcbebd42186a 134 // DBG("%d ", value);
sev2000 1:265edb6bdd52 135 Tx = !Tx;
sev2000 1:265edb6bdd52 136 if(value)
sev2000 1:265edb6bdd52 137 {
sev2000 1:265edb6bdd52 138 wait_us(800);
sev2000 1:265edb6bdd52 139 Tx = !Tx;
sev2000 1:265edb6bdd52 140 wait_us(800);
sev2000 1:265edb6bdd52 141 }
sev2000 1:265edb6bdd52 142 else
sev2000 1:265edb6bdd52 143 {
sev2000 1:265edb6bdd52 144 wait_us(1600);
sev2000 1:265edb6bdd52 145 }
sev2000 1:265edb6bdd52 146 }
sev2000 1:265edb6bdd52 147
sev2000 1:265edb6bdd52 148 void SendByte(char value)
sev2000 1:265edb6bdd52 149 {
sev2000 1:265edb6bdd52 150 int i=0;
sev2000 1:265edb6bdd52 151 bool bit;
sev2000 1:265edb6bdd52 152 static char cnt=0;
sev2000 1:265edb6bdd52 153
sev2000 15:2f74266340ac 154 //pc.printf("%0.2X ", value);
sev2000 1:265edb6bdd52 155 for(i=0; i<8; i++)
sev2000 1:265edb6bdd52 156 {
sev2000 1:265edb6bdd52 157 bit = (bool)(0x01 & (value>>i)); // LSB first
sev2000 1:265edb6bdd52 158 SendBit(bit);
sev2000 1:265edb6bdd52 159 if(bit)
sev2000 1:265edb6bdd52 160 cnt++;
sev2000 1:265edb6bdd52 161 else
sev2000 1:265edb6bdd52 162 cnt=0;
sev2000 1:265edb6bdd52 163 if(cnt == 5)
sev2000 7:eaa973daaf58 164 {
sev2000 1:265edb6bdd52 165 SendBit(0);
sev2000 7:eaa973daaf58 166 cnt=0;
sev2000 7:eaa973daaf58 167 }
sev2000 1:265edb6bdd52 168 }
sev2000 1:265edb6bdd52 169 }
sev2000 1:265edb6bdd52 170
sev2000 1:265edb6bdd52 171 void SendPreamble(void)
sev2000 1:265edb6bdd52 172 {
sev2000 1:265edb6bdd52 173 int i;
sev2000 1:265edb6bdd52 174
sev2000 7:eaa973daaf58 175 //pc.printf("\r\n");
sev2000 1:265edb6bdd52 176 Tx=1;
sev2000 1:265edb6bdd52 177 for(i=0; i<17; i++)
sev2000 1:265edb6bdd52 178 SendBit(0);
sev2000 1:265edb6bdd52 179 for(i=0; i<6; i++)
sev2000 1:265edb6bdd52 180 SendBit(1);
sev2000 1:265edb6bdd52 181 SendBit(0);
sev2000 1:265edb6bdd52 182
sev2000 1:265edb6bdd52 183 }
sev2000 1:265edb6bdd52 184
sev2000 1:265edb6bdd52 185 void SendPostamble(void)
sev2000 1:265edb6bdd52 186 {
sev2000 1:265edb6bdd52 187 int i;
sev2000 1:265edb6bdd52 188
sev2000 1:265edb6bdd52 189 for(i=0; i<8; i++) // Send 0xFF
sev2000 1:265edb6bdd52 190 SendBit(1);
sev2000 1:265edb6bdd52 191 for(i=0; i<8; i++)
sev2000 1:265edb6bdd52 192 SendBit(0);
sev2000 1:265edb6bdd52 193
sev2000 1:265edb6bdd52 194 }
sev2000 1:265edb6bdd52 195
sev2000 1:265edb6bdd52 196 void SendFrame(char *data, int length)
sev2000 1:265edb6bdd52 197 {
sev2000 1:265edb6bdd52 198
sev2000 1:265edb6bdd52 199 int i, chksum=0;
sev2000 1:265edb6bdd52 200
sev2000 1:265edb6bdd52 201 RxTx = 0; //set pin rxtx to Tx
sev2000 7:eaa973daaf58 202 Tx=0;
sev2000 7:eaa973daaf58 203 // wait_us(500);
sev2000 7:eaa973daaf58 204 //wait_ms(1);
sev2000 1:265edb6bdd52 205
sev2000 1:265edb6bdd52 206 SendPreamble();
sev2000 1:265edb6bdd52 207
sev2000 1:265edb6bdd52 208 for(i=0; i<length; i++)
sev2000 1:265edb6bdd52 209 {
sev2000 1:265edb6bdd52 210 SendByte(data[i]);
sev2000 1:265edb6bdd52 211 chksum += data[i];
sev2000 1:265edb6bdd52 212 }
sev2000 1:265edb6bdd52 213 chksum = ~chksum +1;
sev2000 1:265edb6bdd52 214
sev2000 1:265edb6bdd52 215 SendByte((char)(chksum>>8));
sev2000 1:265edb6bdd52 216 SendByte((char)chksum);
sev2000 1:265edb6bdd52 217 SendPostamble();
sev2000 1:265edb6bdd52 218
sev2000 7:eaa973daaf58 219 // Tx=1;
sev2000 7:eaa973daaf58 220
sev2000 1:265edb6bdd52 221 RxTx = 1; //set pin rxtx to Rx
sev2000 15:2f74266340ac 222 //pc.printf("\r\n");
sev2000 1:265edb6bdd52 223 }
sev2000 1:265edb6bdd52 224
sev2000 12:ce8ae07fd23b 225 void SendCmd(int zone, h_mode prog)
sev2000 1:265edb6bdd52 226 {
sev2000 13:345e4251cf25 227 //char tab[8]={0xF1,0xE6,0x01,0x10,0x01,0x00,0x03,0x64}; // Zone1 Sun
sev2000 13:345e4251cf25 228 msg_t msg;
sev2000 1:265edb6bdd52 229 char maison[2]={0xF1,0xE6};
sev2000 15:2f74266340ac 230 char source = 0x02;
sev2000 1:265edb6bdd52 231 char dest = 0;
sev2000 15:2f74266340ac 232 char trans = 0x02;
sev2000 7:eaa973daaf58 233 // control 1 char
sev2000 7:eaa973daaf58 234 // information 0-8 char
sev2000 7:eaa973daaf58 235
sev2000 1:265edb6bdd52 236 int i;
sev2000 1:265edb6bdd52 237
sev2000 1:265edb6bdd52 238 dest = 0x10 + zone-1;
sev2000 13:345e4251cf25 239 msg.data[0] = maison[0];
sev2000 13:345e4251cf25 240 msg.data[1] = maison[1];
sev2000 13:345e4251cf25 241 msg.data[2] = source;
sev2000 13:345e4251cf25 242 msg.data[3] = dest;
sev2000 13:345e4251cf25 243 msg.data[4] = trans;
sev2000 13:345e4251cf25 244 msg.data[6] = (char)prog;
sev2000 14:b368fb51df96 245 msg.data[7] = 0x64;
sev2000 1:265edb6bdd52 246
sev2000 1:265edb6bdd52 247 for(i=0; i<3; i++)
sev2000 1:265edb6bdd52 248 {
sev2000 13:345e4251cf25 249 msg.data[5]=i; //message count
sev2000 13:345e4251cf25 250 msg.lenght = 8;
sev2000 13:345e4251cf25 251 MessageTx.push(msg);
sev2000 13:345e4251cf25 252 //wait_ms(30);
sev2000 1:265edb6bdd52 253 }
sev2000 1:265edb6bdd52 254 }
sev2000 1:265edb6bdd52 255
sev2000 7:eaa973daaf58 256 void SendCmda(char *tab, int lenght)
sev2000 7:eaa973daaf58 257 {
sev2000 13:345e4251cf25 258 msg_t msg;
sev2000 7:eaa973daaf58 259 int i;
sev2000 7:eaa973daaf58 260
sev2000 7:eaa973daaf58 261 /* dest = 0x10 + zone-1;
sev2000 7:eaa973daaf58 262 tab[3] = dest;
sev2000 7:eaa973daaf58 263 tab[6] = prog;
sev2000 7:eaa973daaf58 264 */
sev2000 13:345e4251cf25 265 memcpy(msg.data, tab, lenght);
sev2000 7:eaa973daaf58 266 for(i=0; i<3; i++)
sev2000 7:eaa973daaf58 267 {
sev2000 13:345e4251cf25 268 msg.data[5] = tab[5] + i; //message count
sev2000 13:345e4251cf25 269 MessageTx.push(msg);
sev2000 13:345e4251cf25 270 //wait_ms(30);
sev2000 7:eaa973daaf58 271 }
sev2000 7:eaa973daaf58 272 }
sev2000 7:eaa973daaf58 273
sev2000 13:345e4251cf25 274 void TASK_SndRcv(void)
sev2000 0:9ef8edfe21bc 275 {
sev2000 0:9ef8edfe21bc 276 pulse_t pulse;
sev2000 13:345e4251cf25 277 int cnt_1 = 0, rcv_cnt=0;
sev2000 0:9ef8edfe21bc 278 char tmp[32]={0};
sev2000 0:9ef8edfe21bc 279 char state=0;
sev2000 0:9ef8edfe21bc 280 char s=0, l=0, bit_ptr=0;
sev2000 13:345e4251cf25 281 msg_t msg;
sev2000 0:9ef8edfe21bc 282
sev2000 10:65fd918fc224 283 while(true)
sev2000 0:9ef8edfe21bc 284 {
sev2000 13:345e4251cf25 285 rcv_cnt=0;
sev2000 13:345e4251cf25 286 while(!PulseWidth.empty() && rcv_cnt < 200)
sev2000 10:65fd918fc224 287 {
sev2000 0:9ef8edfe21bc 288 PulseWidth.pop(pulse);
sev2000 0:9ef8edfe21bc 289 sprintf(tmp, "%d, %ld|", pulse.pin, pulse.v);
sev2000 7:eaa973daaf58 290
sev2000 7:eaa973daaf58 291 //pc.printf("%s ", tmp);
sev2000 0:9ef8edfe21bc 292
sev2000 0:9ef8edfe21bc 293 if ((pulse.v > 700) && (pulse.v < 1000))
sev2000 0:9ef8edfe21bc 294 { // short off detected
sev2000 0:9ef8edfe21bc 295 s++;
sev2000 0:9ef8edfe21bc 296 l=0;
sev2000 0:9ef8edfe21bc 297 }
sev2000 0:9ef8edfe21bc 298 else if ((pulse.v > 1500) && (pulse.v < 1800))
sev2000 0:9ef8edfe21bc 299 { // long off detected
sev2000 0:9ef8edfe21bc 300 l++;
sev2000 0:9ef8edfe21bc 301 s=0;
sev2000 0:9ef8edfe21bc 302 }
sev2000 0:9ef8edfe21bc 303 else
sev2000 0:9ef8edfe21bc 304 {
sev2000 0:9ef8edfe21bc 305 l=0;
sev2000 0:9ef8edfe21bc 306 s=0;
sev2000 0:9ef8edfe21bc 307 state=0;
sev2000 0:9ef8edfe21bc 308 }
sev2000 0:9ef8edfe21bc 309 switch(state)
sev2000 0:9ef8edfe21bc 310 {
sev2000 0:9ef8edfe21bc 311 case 0: // Detect preamble
sev2000 0:9ef8edfe21bc 312 if(s >= 12) // out of 12
sev2000 0:9ef8edfe21bc 313 state=1;
sev2000 0:9ef8edfe21bc 314 //pc.printf("%d ", s);
sev2000 0:9ef8edfe21bc 315 break;
sev2000 0:9ef8edfe21bc 316 case 1: // wait start bit (first long)
sev2000 0:9ef8edfe21bc 317 //pc.printf("OK2");
sev2000 0:9ef8edfe21bc 318 s=0;
sev2000 0:9ef8edfe21bc 319 if (l==1)
sev2000 0:9ef8edfe21bc 320 {
sev2000 0:9ef8edfe21bc 321 state = 2;
sev2000 10:65fd918fc224 322 cnt_1=0;
sev2000 10:65fd918fc224 323 bit_ptr=0;
sev2000 0:9ef8edfe21bc 324 //bit_ptr++; inculde start bit in payload
sev2000 0:9ef8edfe21bc 325 }
sev2000 0:9ef8edfe21bc 326 l=0;
sev2000 0:9ef8edfe21bc 327 break;
sev2000 0:9ef8edfe21bc 328 case 2:
sev2000 0:9ef8edfe21bc 329 //pc.printf(" %d", pulse.v);
sev2000 0:9ef8edfe21bc 330
sev2000 0:9ef8edfe21bc 331 if (s == 2)
sev2000 0:9ef8edfe21bc 332 {
sev2000 0:9ef8edfe21bc 333 dataBits[bit_ptr] = 1;
sev2000 0:9ef8edfe21bc 334 l=0;
sev2000 0:9ef8edfe21bc 335 s=0;
sev2000 0:9ef8edfe21bc 336 bit_ptr++;
sev2000 10:65fd918fc224 337 cnt_1++; // Count bit for ETX detection
sev2000 0:9ef8edfe21bc 338 }
sev2000 0:9ef8edfe21bc 339 if (l == 1 && s==0)
sev2000 0:9ef8edfe21bc 340 {
sev2000 0:9ef8edfe21bc 341 dataBits[bit_ptr] = 0;
sev2000 0:9ef8edfe21bc 342 l=0;
sev2000 0:9ef8edfe21bc 343 s=0;
sev2000 10:65fd918fc224 344
sev2000 13:345e4251cf25 345 if(cnt_1 != 5) // skip the 0 after 5 bits = 1
sev2000 10:65fd918fc224 346 bit_ptr++;
sev2000 10:65fd918fc224 347 cnt_1=0;
sev2000 10:65fd918fc224 348
sev2000 0:9ef8edfe21bc 349 }
sev2000 0:9ef8edfe21bc 350 if(bit_ptr > BIT_SIZE)
sev2000 0:9ef8edfe21bc 351 {
sev2000 0:9ef8edfe21bc 352 state=0;
sev2000 7:eaa973daaf58 353 pc.printf("Frame too long : dropped\r\n");
sev2000 0:9ef8edfe21bc 354 }
sev2000 10:65fd918fc224 355 if(cnt_1 == 8)
sev2000 10:65fd918fc224 356 {
sev2000 13:345e4251cf25 357 processData(bit_ptr-1);
sev2000 10:65fd918fc224 358 state=0;
sev2000 10:65fd918fc224 359 //PulseWidth.reset();
sev2000 10:65fd918fc224 360 }
sev2000 0:9ef8edfe21bc 361 break;
sev2000 10:65fd918fc224 362
sev2000 0:9ef8edfe21bc 363 }
sev2000 13:345e4251cf25 364 rcv_cnt++;
sev2000 10:65fd918fc224 365 }
sev2000 13:345e4251cf25 366
sev2000 13:345e4251cf25 367 // Send Frame
sev2000 13:345e4251cf25 368 if (!MessageTx.empty() && rcv_cnt == 0 && RxTx==1) // If message to emmit and didn't received message nor sending in progress
sev2000 13:345e4251cf25 369 {
sev2000 13:345e4251cf25 370 MessageTx.pop(msg);
sev2000 15:2f74266340ac 371 // sendbit_mutex.lock();
sev2000 13:345e4251cf25 372 SendFrame(msg.data, msg.lenght);
sev2000 15:2f74266340ac 373 // sendbit_mutex.unlock();
sev2000 15:2f74266340ac 374
sev2000 13:345e4251cf25 375 }
sev2000 13:345e4251cf25 376
sev2000 13:345e4251cf25 377 Thread::wait(30); // evey 30 mS we can send a message
sev2000 0:9ef8edfe21bc 378 }
sev2000 0:9ef8edfe21bc 379 }
sev2000 0:9ef8edfe21bc 380
sev2000 10:65fd918fc224 381
sev2000 13:345e4251cf25 382 int processData( int size)
sev2000 0:9ef8edfe21bc 383 {
sev2000 0:9ef8edfe21bc 384 int x=0;
sev2000 0:9ef8edfe21bc 385 int i = 0;
sev2000 0:9ef8edfe21bc 386 int j= 0;
sev2000 13:345e4251cf25 387 char nibble[18]={0};
sev2000 10:65fd918fc224 388 int chksum=0, ETX_pos=0;
sev2000 13:345e4251cf25 389 msg_t message;
sev2000 0:9ef8edfe21bc 390
sev2000 10:65fd918fc224 391 ETX_pos= size/8;
sev2000 7:eaa973daaf58 392 for (i=0; i<ETX_pos; i++)
sev2000 0:9ef8edfe21bc 393 {
sev2000 0:9ef8edfe21bc 394 for (j=0;j<8;j++)
sev2000 0:9ef8edfe21bc 395 {
sev2000 0:9ef8edfe21bc 396 if ( dataBits[x])
sev2000 0:9ef8edfe21bc 397 nibble[i] |= 1<<j;
sev2000 0:9ef8edfe21bc 398 dataBits[x] =0; // clean variable
sev2000 0:9ef8edfe21bc 399 x++;
sev2000 0:9ef8edfe21bc 400 }
sev2000 0:9ef8edfe21bc 401 }
sev2000 0:9ef8edfe21bc 402
sev2000 7:eaa973daaf58 403 for (i=0; i<ETX_pos-2; i++) // Calculate Checksum
sev2000 13:345e4251cf25 404 {
sev2000 13:345e4251cf25 405 message.data[i] = nibble[i];
sev2000 13:345e4251cf25 406 message.lenght = ETX_pos-2;
sev2000 0:9ef8edfe21bc 407 chksum += nibble[i];
sev2000 13:345e4251cf25 408 }
sev2000 0:9ef8edfe21bc 409 chksum = ~chksum +1;
sev2000 0:9ef8edfe21bc 410
sev2000 0:9ef8edfe21bc 411 #ifdef __DEBUG__
sev2000 7:eaa973daaf58 412 for (i=0; i<ETX_pos; i++)
sev2000 0:9ef8edfe21bc 413 pc.printf("%0.2X ",nibble[i]);
sev2000 0:9ef8edfe21bc 414 pc.printf("\r\n");
sev2000 0:9ef8edfe21bc 415 #endif
sev2000 13:345e4251cf25 416 if ( (char)(chksum>>8) != nibble[ETX_pos-2] || (char)chksum != nibble[ETX_pos-1] )
sev2000 13:345e4251cf25 417 pc.printf("CRC Error\r\n");
sev2000 13:345e4251cf25 418 else
sev2000 13:345e4251cf25 419 MessageRx.push(message);
sev2000 7:eaa973daaf58 420
sev2000 0:9ef8edfe21bc 421 return 0;
sev2000 0:9ef8edfe21bc 422 }
sev2000 0:9ef8edfe21bc 423
sev2000 0:9ef8edfe21bc 424
sev2000 13:345e4251cf25 425 void Init_X2D(void)
sev2000 0:9ef8edfe21bc 426 {
sev2000 6:e373216c80bf 427 unsigned long Ctrl_Reg = 0;
sev2000 5:dcbebd42186a 428
sev2000 4:844c00dd0366 429 Rx.fall(&getPulseF);
sev2000 4:844c00dd0366 430 Rx.rise(&getPulseR);
sev2000 0:9ef8edfe21bc 431 UART = 1;
sev2000 5:dcbebd42186a 432
sev2000 5:dcbebd42186a 433 write_ctrl_reg(0x01E22F); // 1200 baud, deviation =1, Asynchrone
sev2000 5:dcbebd42186a 434 Ctrl_Reg = read_ctrl_reg();
sev2000 5:dcbebd42186a 435 DBG("Ctrl_reg = %X", Ctrl_Reg);
sev2000 5:dcbebd42186a 436
sev2000 0:9ef8edfe21bc 437 RxTx = 1; //set pin rxtx to Rx
sev2000 0:9ef8edfe21bc 438 Reg_Data = 0; //set pin reg_data
sev2000 0:9ef8edfe21bc 439 Tx = 0;
sev2000 0:9ef8edfe21bc 440
sev2000 0:9ef8edfe21bc 441 xTime.start();
sev2000 0:9ef8edfe21bc 442 xTime.reset();
sev2000 0:9ef8edfe21bc 443 startedAt = xTime.read_us(); // set initial timer end
sev2000 0:9ef8edfe21bc 444
sev2000 13:345e4251cf25 445 thread.start(callback(TASK_SndRcv));
sev2000 0:9ef8edfe21bc 446 }