Alexandre Lemay / Mbed 2 deprecated APP3_Coordonator

Dependencies:   mbed

Committer:
ThierryLeonard
Date:
Tue Oct 03 04:48:02 2017 +0000
Revision:
2:ddaf240af296
Parent:
1:fe18dd0ba172
Child:
3:eda76f539da3
Wtf man

Who changed what in which revision?

UserRevisionLine numberNew contents of line
evrast 0:53817a293b39 1 #include "mbed.h"
evrast 0:53817a293b39 2
evrast 0:53817a293b39 3 DigitalOut myled(LED1);
evrast 0:53817a293b39 4
evrast 1:fe18dd0ba172 5 Ticker flipper;
evrast 0:53817a293b39 6 Serial pc(USBTX, USBRX);
evrast 0:53817a293b39 7
evrast 0:53817a293b39 8 Serial xBee(p13, p14);
evrast 0:53817a293b39 9 DigitalOut reset(p8);
evrast 0:53817a293b39 10
evrast 1:fe18dd0ba172 11 const uint8_t START_DELEMITER = 0x7E;
evrast 1:fe18dd0ba172 12 const uint8_t FRAME_TYPE_AT_REQUEST = 0x17;
evrast 1:fe18dd0ba172 13 const uint8_t FRAME_ID = 0x01;
evrast 1:fe18dd0ba172 14 const uint8_t ZERO = 0x00;
evrast 1:fe18dd0ba172 15 const uint8_t APPLY_CHANGES = 0x02;
evrast 1:fe18dd0ba172 16 const uint8_t FF_CONST = 0xFF;
ThierryLeonard 2:ddaf240af296 17 const char OPEN_LED[2] = {'D','5'};
evrast 1:fe18dd0ba172 18
evrast 1:fe18dd0ba172 19
evrast 1:fe18dd0ba172 20 bool atCommand = false;
evrast 1:fe18dd0ba172 21
evrast 1:fe18dd0ba172 22 const int TRANSMIT_REQUEST_DATA = 12;
ThierryLeonard 2:ddaf240af296 23 uint8_t addresse_64_bit[8] = {0xcd, 0x2b, 0x0, 0x13, 0xa2, 0x0, 0x40, 0x33};
evrast 1:fe18dd0ba172 24 uint8_t addresse_16_bit[2] = {0xFF,0xFE};
evrast 1:fe18dd0ba172 25
evrast 0:53817a293b39 26 uint8_t pan_id[14]={0x7E, 0x00, 0x0A, 0x08, 0x01, 0x49, 0x44, 0x46, 0x46, 0x39, 0x39, 0x31, 0x31, 0x09};
evrast 0:53817a293b39 27
ThierryLeonard 2:ddaf240af296 28 uint8_t nd_Command[8] = { 0x7E, 0x00, 0x04, 0x08, 0x01, 0x4E, 0x44, 0x64 };
ThierryLeonard 2:ddaf240af296 29
ThierryLeonard 2:ddaf240af296 30 void afficherErreurLed()
ThierryLeonard 2:ddaf240af296 31 {
ThierryLeonard 2:ddaf240af296 32
ThierryLeonard 2:ddaf240af296 33 uint8_t d5_command[9] = { 0x7E, 0x00, 0x05, 0x08, 0x01, 'D', '5', 5, 0};
ThierryLeonard 2:ddaf240af296 34
ThierryLeonard 2:ddaf240af296 35 static bool nextState = true;
ThierryLeonard 2:ddaf240af296 36
ThierryLeonard 2:ddaf240af296 37 //check sum
ThierryLeonard 2:ddaf240af296 38
ThierryLeonard 2:ddaf240af296 39 uint8_t checkSum = 0;
ThierryLeonard 2:ddaf240af296 40 for(int i = 3; i<9;i++)
ThierryLeonard 2:ddaf240af296 41 {
ThierryLeonard 2:ddaf240af296 42 checkSum += d5_command[i];
ThierryLeonard 2:ddaf240af296 43 }
ThierryLeonard 2:ddaf240af296 44
ThierryLeonard 2:ddaf240af296 45 if(nextState)
ThierryLeonard 2:ddaf240af296 46 {
ThierryLeonard 2:ddaf240af296 47 d5_command[7] = 5;
ThierryLeonard 2:ddaf240af296 48 }
ThierryLeonard 2:ddaf240af296 49 else
ThierryLeonard 2:ddaf240af296 50 {
ThierryLeonard 2:ddaf240af296 51 d5_command[7] = 4;
ThierryLeonard 2:ddaf240af296 52 }
ThierryLeonard 2:ddaf240af296 53
ThierryLeonard 2:ddaf240af296 54 checkSum = FF_CONST - checkSum;
ThierryLeonard 2:ddaf240af296 55 d5_command[8] = checkSum;
ThierryLeonard 2:ddaf240af296 56 for(int i = 0 ; i < 9; i++)
ThierryLeonard 2:ddaf240af296 57 {
ThierryLeonard 2:ddaf240af296 58 xBee.putc(d5_command[i]);
ThierryLeonard 2:ddaf240af296 59 }
ThierryLeonard 2:ddaf240af296 60
evrast 1:fe18dd0ba172 61 }
evrast 1:fe18dd0ba172 62
ThierryLeonard 2:ddaf240af296 63 void sendNDCommand()
ThierryLeonard 2:ddaf240af296 64 {
ThierryLeonard 2:ddaf240af296 65 for ( int i = 0 ; i < 8; i++ )
ThierryLeonard 2:ddaf240af296 66 {
ThierryLeonard 2:ddaf240af296 67 xBee.putc(nd_Command[i]);
ThierryLeonard 2:ddaf240af296 68 }
ThierryLeonard 2:ddaf240af296 69 }
ThierryLeonard 2:ddaf240af296 70
ThierryLeonard 2:ddaf240af296 71 void sendRemoteAtCommand(){
ThierryLeonard 2:ddaf240af296 72 atCommand = true;
ThierryLeonard 2:ddaf240af296 73 }
ThierryLeonard 2:ddaf240af296 74
ThierryLeonard 2:ddaf240af296 75 void sendRemoteLedCommandPaquet(){
ThierryLeonard 2:ddaf240af296 76 static bool nextState = true;
evrast 1:fe18dd0ba172 77 uint8_t length = 0xF;
evrast 1:fe18dd0ba172 78 uint8_t paquet[25];
evrast 1:fe18dd0ba172 79 uint8_t checkSum= 0x0;
evrast 1:fe18dd0ba172 80 uint8_t LSBLength;
evrast 1:fe18dd0ba172 81 uint8_t MSBLength;
ThierryLeonard 2:ddaf240af296 82
ThierryLeonard 2:ddaf240af296 83 char type[2] = { 'D','5'};
evrast 1:fe18dd0ba172 84
evrast 1:fe18dd0ba172 85 LSBLength = length&0xff;
evrast 1:fe18dd0ba172 86 MSBLength = (length &0xff00) >> 8;
evrast 1:fe18dd0ba172 87
evrast 1:fe18dd0ba172 88 paquet[0] = START_DELEMITER; //start
evrast 1:fe18dd0ba172 89 paquet[1] = MSBLength; //length MSB
evrast 1:fe18dd0ba172 90 paquet[2] = LSBLength; //length LSB
evrast 1:fe18dd0ba172 91 paquet[3] = FRAME_TYPE_AT_REQUEST; //frame type
evrast 1:fe18dd0ba172 92 paquet[4] = FRAME_ID; //frame id
evrast 1:fe18dd0ba172 93 for(int i = 5; i < 13;i++) //64 bit addresse
evrast 1:fe18dd0ba172 94 {
evrast 1:fe18dd0ba172 95 paquet[i] = addresse_64_bit[i-5];
evrast 1:fe18dd0ba172 96 }
evrast 1:fe18dd0ba172 97
evrast 1:fe18dd0ba172 98 for(int i = 13; i < 15;i++) //16bit address
evrast 1:fe18dd0ba172 99 {
evrast 1:fe18dd0ba172 100 paquet[i] = addresse_16_bit[i-13];
evrast 1:fe18dd0ba172 101 }
evrast 1:fe18dd0ba172 102
evrast 1:fe18dd0ba172 103 paquet[15] = APPLY_CHANGES; //BroadCast Radius
evrast 1:fe18dd0ba172 104 paquet[16] = type[0];
evrast 1:fe18dd0ba172 105 paquet[17] = type[1];
ThierryLeonard 2:ddaf240af296 106
ThierryLeonard 2:ddaf240af296 107 if(nextState)
ThierryLeonard 2:ddaf240af296 108 {
ThierryLeonard 2:ddaf240af296 109 paquet[18] = 0x05;
ThierryLeonard 2:ddaf240af296 110 }
ThierryLeonard 2:ddaf240af296 111 else
ThierryLeonard 2:ddaf240af296 112 {
ThierryLeonard 2:ddaf240af296 113 paquet[18] = 0x04;
ThierryLeonard 2:ddaf240af296 114 }
evrast 1:fe18dd0ba172 115
evrast 1:fe18dd0ba172 116 //check sum
evrast 1:fe18dd0ba172 117
evrast 1:fe18dd0ba172 118 for(int i = 3; i<length+3;i++)
evrast 1:fe18dd0ba172 119 {
evrast 1:fe18dd0ba172 120 checkSum += paquet[i];
evrast 1:fe18dd0ba172 121 }
evrast 1:fe18dd0ba172 122
evrast 1:fe18dd0ba172 123 checkSum = FF_CONST - checkSum;
evrast 1:fe18dd0ba172 124
evrast 1:fe18dd0ba172 125 paquet[length+3] = checkSum;
evrast 1:fe18dd0ba172 126
evrast 1:fe18dd0ba172 127 for(int i =0;i<length + 4;i++)
evrast 1:fe18dd0ba172 128 {
evrast 1:fe18dd0ba172 129 xBee.putc(paquet[i]);
evrast 1:fe18dd0ba172 130
evrast 1:fe18dd0ba172 131 }
evrast 1:fe18dd0ba172 132
evrast 1:fe18dd0ba172 133 }
evrast 1:fe18dd0ba172 134
ThierryLeonard 2:ddaf240af296 135 bool checkForError(int length,uint8_t type, uint8_t* data)
ThierryLeonard 2:ddaf240af296 136 {
ThierryLeonard 2:ddaf240af296 137 data[0] = type;
ThierryLeonard 2:ddaf240af296 138 uint8_t origCheckSum;
ThierryLeonard 2:ddaf240af296 139 uint8_t checkSum = type;
ThierryLeonard 2:ddaf240af296 140 for (int i =1; i < length; i++)
ThierryLeonard 2:ddaf240af296 141 {
ThierryLeonard 2:ddaf240af296 142 data[i] = xBee.getc();
ThierryLeonard 2:ddaf240af296 143 checkSum += data[i];
ThierryLeonard 2:ddaf240af296 144 }
ThierryLeonard 2:ddaf240af296 145 checkSum = 0xFF - checkSum;
ThierryLeonard 2:ddaf240af296 146 origCheckSum = xBee.getc();
ThierryLeonard 2:ddaf240af296 147
ThierryLeonard 2:ddaf240af296 148 return checkSum != origCheckSum;
ThierryLeonard 2:ddaf240af296 149 }
ThierryLeonard 2:ddaf240af296 150
ThierryLeonard 2:ddaf240af296 151 void receiveAtCommandResponse(int length, uint8_t* data)
ThierryLeonard 2:ddaf240af296 152 {
ThierryLeonard 2:ddaf240af296 153 // 1 Command id
ThierryLeonard 2:ddaf240af296 154
ThierryLeonard 2:ddaf240af296 155 uint8_t id = data[1];
ThierryLeonard 2:ddaf240af296 156
ThierryLeonard 2:ddaf240af296 157 // La command est identifie par les deux prochains bits
ThierryLeonard 2:ddaf240af296 158 uint16_t command = data[2] << 8;
ThierryLeonard 2:ddaf240af296 159 command += data[3];
ThierryLeonard 2:ddaf240af296 160
ThierryLeonard 2:ddaf240af296 161 pc.printf("\n Command %x\n",command);
ThierryLeonard 2:ddaf240af296 162
ThierryLeonard 2:ddaf240af296 163 uint8_t status = data[4];
ThierryLeonard 2:ddaf240af296 164
ThierryLeonard 2:ddaf240af296 165 // Data == 5-length
ThierryLeonard 2:ddaf240af296 166 if(status != 0)
ThierryLeonard 2:ddaf240af296 167 {
ThierryLeonard 2:ddaf240af296 168 pc.printf("erreur");
ThierryLeonard 2:ddaf240af296 169 afficherErreurLed();
ThierryLeonard 2:ddaf240af296 170 return;
ThierryLeonard 2:ddaf240af296 171 }
ThierryLeonard 2:ddaf240af296 172 switch(command)
ThierryLeonard 2:ddaf240af296 173 {
ThierryLeonard 2:ddaf240af296 174
ThierryLeonard 2:ddaf240af296 175 case 0x4e44: // Node Discovery AT Command
ThierryLeonard 2:ddaf240af296 176 {
ThierryLeonard 2:ddaf240af296 177 uint64_t serialNumber = 0;
ThierryLeonard 2:ddaf240af296 178 for(int i = 5; i < 13; i++)
ThierryLeonard 2:ddaf240af296 179 {
ThierryLeonard 2:ddaf240af296 180 serialNumber += data[i] << (8 * (13-i -1) );
ThierryLeonard 2:ddaf240af296 181 addresse_64_bit[i-5] = data[i];
ThierryLeonard 2:ddaf240af296 182 pc.printf("\nSerial number %i %x\n",i,data[i]);
ThierryLeonard 2:ddaf240af296 183 }
ThierryLeonard 2:ddaf240af296 184
ThierryLeonard 2:ddaf240af296 185 return;
ThierryLeonard 2:ddaf240af296 186 }
ThierryLeonard 2:ddaf240af296 187 break;
ThierryLeonard 2:ddaf240af296 188 }
ThierryLeonard 2:ddaf240af296 189
ThierryLeonard 2:ddaf240af296 190 }
ThierryLeonard 2:ddaf240af296 191
evrast 1:fe18dd0ba172 192 void receiveTransmitRequest(int length,uint8_t type){
ThierryLeonard 2:ddaf240af296 193 uint8_t data[512];
evrast 1:fe18dd0ba172 194 data[0] = type;
evrast 1:fe18dd0ba172 195 uint8_t origCheckSum;
evrast 1:fe18dd0ba172 196 uint8_t checkSum = type;
evrast 1:fe18dd0ba172 197 for (int i =1; i < length; i++)
evrast 1:fe18dd0ba172 198 {
evrast 1:fe18dd0ba172 199 data[i] = xBee.getc();
evrast 1:fe18dd0ba172 200 checkSum += data[i];
evrast 1:fe18dd0ba172 201 }
evrast 1:fe18dd0ba172 202
evrast 1:fe18dd0ba172 203 checkSum = 0xFF - checkSum;
evrast 1:fe18dd0ba172 204 origCheckSum = xBee.getc();
evrast 1:fe18dd0ba172 205
evrast 1:fe18dd0ba172 206 if(origCheckSum == checkSum){
evrast 1:fe18dd0ba172 207 for(int i = TRANSMIT_REQUEST_DATA; i <length;i++)
evrast 1:fe18dd0ba172 208 {
ThierryLeonard 2:ddaf240af296 209 pc.printf("%c", data[i]);
evrast 1:fe18dd0ba172 210 }
ThierryLeonard 2:ddaf240af296 211 pc.printf("\n");
evrast 1:fe18dd0ba172 212 }
evrast 1:fe18dd0ba172 213 else{
evrast 1:fe18dd0ba172 214
evrast 1:fe18dd0ba172 215 }
evrast 1:fe18dd0ba172 216
evrast 1:fe18dd0ba172 217 }
evrast 1:fe18dd0ba172 218
evrast 1:fe18dd0ba172 219
evrast 1:fe18dd0ba172 220 void receiveNewPaquet()
evrast 1:fe18dd0ba172 221 {
evrast 1:fe18dd0ba172 222 int length;
evrast 1:fe18dd0ba172 223
evrast 1:fe18dd0ba172 224 if(xBee.getc() == START_DELEMITER)
evrast 1:fe18dd0ba172 225 {
ThierryLeonard 2:ddaf240af296 226 // MSB
evrast 1:fe18dd0ba172 227 length = (((xBee.getc()) << 8));
ThierryLeonard 2:ddaf240af296 228 // LSB
evrast 1:fe18dd0ba172 229 length +=(xBee.getc());
evrast 1:fe18dd0ba172 230 uint8_t frame_type = xBee.getc();
evrast 1:fe18dd0ba172 231
ThierryLeonard 2:ddaf240af296 232 uint8_t data[512];
ThierryLeonard 2:ddaf240af296 233 data[0] = frame_type;
ThierryLeonard 2:ddaf240af296 234
evrast 1:fe18dd0ba172 235 switch (frame_type){
ThierryLeonard 2:ddaf240af296 236 case 0x90:
evrast 1:fe18dd0ba172 237 receiveTransmitRequest(length, frame_type);
ThierryLeonard 2:ddaf240af296 238 // AT command Response frame
ThierryLeonard 2:ddaf240af296 239 break;
ThierryLeonard 2:ddaf240af296 240 case 0x88:
ThierryLeonard 2:ddaf240af296 241 pc.printf("\nat response : length %i, frame time %i\n",length,frame_type);
ThierryLeonard 2:ddaf240af296 242 bool error = checkForError(length, frame_type,data);
ThierryLeonard 2:ddaf240af296 243 if(true)
ThierryLeonard 2:ddaf240af296 244 {
ThierryLeonard 2:ddaf240af296 245 receiveAtCommandResponse(length, data);
ThierryLeonard 2:ddaf240af296 246 }
ThierryLeonard 2:ddaf240af296 247 else
ThierryLeonard 2:ddaf240af296 248 {
ThierryLeonard 2:ddaf240af296 249 pc.printf("Transmit or checksum error");
ThierryLeonard 2:ddaf240af296 250 }
ThierryLeonard 2:ddaf240af296 251 break;
evrast 1:fe18dd0ba172 252 }
evrast 1:fe18dd0ba172 253
evrast 1:fe18dd0ba172 254
evrast 1:fe18dd0ba172 255
evrast 1:fe18dd0ba172 256
evrast 1:fe18dd0ba172 257 }
evrast 1:fe18dd0ba172 258 }
evrast 1:fe18dd0ba172 259
evrast 1:fe18dd0ba172 260
evrast 1:fe18dd0ba172 261
evrast 0:53817a293b39 262 int main() {
ThierryLeonard 2:ddaf240af296 263 flipper.attach (&sendRemoteAtCommand,1);
evrast 0:53817a293b39 264 reset =0;
evrast 0:53817a293b39 265 wait_ms(500);
evrast 0:53817a293b39 266 reset=1;
evrast 0:53817a293b39 267 wait(1);
evrast 0:53817a293b39 268 xBee.printf("+++");
evrast 0:53817a293b39 269 wait(1);
ThierryLeonard 2:ddaf240af296 270 sendNDCommand();
evrast 0:53817a293b39 271 //
evrast 0:53817a293b39 272 // for(int i =0;i <14;i++){
evrast 0:53817a293b39 273 // xBee.putc(pan_id[i]);
evrast 0:53817a293b39 274 // }
evrast 0:53817a293b39 275
evrast 0:53817a293b39 276 while(1) {
evrast 0:53817a293b39 277 if(xBee.readable()){
evrast 1:fe18dd0ba172 278 receiveNewPaquet();
evrast 1:fe18dd0ba172 279 }
evrast 1:fe18dd0ba172 280 if (atCommand){
evrast 1:fe18dd0ba172 281 atCommand = false;
ThierryLeonard 2:ddaf240af296 282 sendRemoteLedCommandPaquet();
ThierryLeonard 2:ddaf240af296 283 }
evrast 0:53817a293b39 284 }
evrast 0:53817a293b39 285 }
evrast 0:53817a293b39 286