Alexandre Lemay / Mbed 2 deprecated APP3_Coordonator

Dependencies:   mbed

Committer:
ThierryLeonard
Date:
Tue Oct 03 08:58:02 2017 +0000
Revision:
3:eda76f539da3
Parent:
2:ddaf240af296
Child:
4:0b0dfd5ebf44
Done ?

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 3:eda76f539da3 17 const char OPEN_LED[2] = {'D','1'};
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 3:eda76f539da3 23 uint8_t addresse_64_bit[8];
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
evrast 1:fe18dd0ba172 30
ThierryLeonard 2:ddaf240af296 31 void sendNDCommand()
ThierryLeonard 2:ddaf240af296 32 {
ThierryLeonard 2:ddaf240af296 33 for ( int i = 0 ; i < 8; i++ )
ThierryLeonard 2:ddaf240af296 34 {
ThierryLeonard 2:ddaf240af296 35 xBee.putc(nd_Command[i]);
ThierryLeonard 2:ddaf240af296 36 }
ThierryLeonard 2:ddaf240af296 37 }
ThierryLeonard 2:ddaf240af296 38
ThierryLeonard 2:ddaf240af296 39 void sendRemoteAtCommand(){
ThierryLeonard 2:ddaf240af296 40 atCommand = true;
ThierryLeonard 2:ddaf240af296 41 }
ThierryLeonard 2:ddaf240af296 42
ThierryLeonard 2:ddaf240af296 43 void sendRemoteLedCommandPaquet(){
ThierryLeonard 3:eda76f539da3 44
ThierryLeonard 2:ddaf240af296 45 static bool nextState = true;
ThierryLeonard 3:eda76f539da3 46 // pc.printf("bool %i",nextState);
ThierryLeonard 3:eda76f539da3 47 uint8_t length = 0x10;
evrast 1:fe18dd0ba172 48 uint8_t paquet[25];
evrast 1:fe18dd0ba172 49 uint8_t checkSum= 0x0;
evrast 1:fe18dd0ba172 50 uint8_t LSBLength;
evrast 1:fe18dd0ba172 51 uint8_t MSBLength;
ThierryLeonard 2:ddaf240af296 52
ThierryLeonard 3:eda76f539da3 53 char type[2] = { 'D','1'};
evrast 1:fe18dd0ba172 54
evrast 1:fe18dd0ba172 55 LSBLength = length&0xff;
ThierryLeonard 3:eda76f539da3 56 MSBLength = 0;
evrast 1:fe18dd0ba172 57
evrast 1:fe18dd0ba172 58 paquet[0] = START_DELEMITER; //start
evrast 1:fe18dd0ba172 59 paquet[1] = MSBLength; //length MSB
evrast 1:fe18dd0ba172 60 paquet[2] = LSBLength; //length LSB
evrast 1:fe18dd0ba172 61 paquet[3] = FRAME_TYPE_AT_REQUEST; //frame type
evrast 1:fe18dd0ba172 62 paquet[4] = FRAME_ID; //frame id
evrast 1:fe18dd0ba172 63 for(int i = 5; i < 13;i++) //64 bit addresse
evrast 1:fe18dd0ba172 64 {
evrast 1:fe18dd0ba172 65 paquet[i] = addresse_64_bit[i-5];
evrast 1:fe18dd0ba172 66 }
ThierryLeonard 3:eda76f539da3 67 paquet[13] = 0xFF;
ThierryLeonard 3:eda76f539da3 68 paquet[14] = 0xFE;
evrast 1:fe18dd0ba172 69
evrast 1:fe18dd0ba172 70 paquet[15] = APPLY_CHANGES; //BroadCast Radius
evrast 1:fe18dd0ba172 71 paquet[16] = type[0];
evrast 1:fe18dd0ba172 72 paquet[17] = type[1];
ThierryLeonard 2:ddaf240af296 73
ThierryLeonard 2:ddaf240af296 74 if(nextState)
ThierryLeonard 2:ddaf240af296 75 {
ThierryLeonard 2:ddaf240af296 76 paquet[18] = 0x05;
ThierryLeonard 2:ddaf240af296 77 }
ThierryLeonard 2:ddaf240af296 78 else
ThierryLeonard 2:ddaf240af296 79 {
ThierryLeonard 2:ddaf240af296 80 paquet[18] = 0x04;
ThierryLeonard 2:ddaf240af296 81 }
ThierryLeonard 3:eda76f539da3 82 nextState = !nextState;
evrast 1:fe18dd0ba172 83 //check sum
evrast 1:fe18dd0ba172 84
evrast 1:fe18dd0ba172 85 for(int i = 3; i<length+3;i++)
evrast 1:fe18dd0ba172 86 {
evrast 1:fe18dd0ba172 87 checkSum += paquet[i];
evrast 1:fe18dd0ba172 88 }
evrast 1:fe18dd0ba172 89
evrast 1:fe18dd0ba172 90 checkSum = FF_CONST - checkSum;
evrast 1:fe18dd0ba172 91
evrast 1:fe18dd0ba172 92 paquet[length+3] = checkSum;
evrast 1:fe18dd0ba172 93
ThierryLeonard 3:eda76f539da3 94 pc.printf("\n packet");
evrast 1:fe18dd0ba172 95 for(int i =0;i<length + 4;i++)
evrast 1:fe18dd0ba172 96 {
evrast 1:fe18dd0ba172 97 xBee.putc(paquet[i]);
ThierryLeonard 3:eda76f539da3 98 pc.printf("%x ",paquet[i]);
ThierryLeonard 3:eda76f539da3 99 }
evrast 1:fe18dd0ba172 100
ThierryLeonard 2:ddaf240af296 101 }
ThierryLeonard 2:ddaf240af296 102
ThierryLeonard 2:ddaf240af296 103 void receiveAtCommandResponse(int length, uint8_t* data)
ThierryLeonard 2:ddaf240af296 104 {
ThierryLeonard 2:ddaf240af296 105 // 1 Command id
ThierryLeonard 2:ddaf240af296 106
ThierryLeonard 2:ddaf240af296 107 uint8_t id = data[1];
ThierryLeonard 2:ddaf240af296 108
ThierryLeonard 2:ddaf240af296 109 // La command est identifie par les deux prochains bits
ThierryLeonard 2:ddaf240af296 110 uint16_t command = data[2] << 8;
ThierryLeonard 2:ddaf240af296 111 command += data[3];
ThierryLeonard 2:ddaf240af296 112
ThierryLeonard 2:ddaf240af296 113 pc.printf("\n Command %x\n",command);
ThierryLeonard 2:ddaf240af296 114
ThierryLeonard 2:ddaf240af296 115 uint8_t status = data[4];
ThierryLeonard 2:ddaf240af296 116
ThierryLeonard 2:ddaf240af296 117 // Data == 5-length
ThierryLeonard 2:ddaf240af296 118 if(status != 0)
ThierryLeonard 2:ddaf240af296 119 {
ThierryLeonard 2:ddaf240af296 120 pc.printf("erreur");
ThierryLeonard 2:ddaf240af296 121 return;
ThierryLeonard 2:ddaf240af296 122 }
ThierryLeonard 2:ddaf240af296 123 switch(command)
ThierryLeonard 2:ddaf240af296 124 {
ThierryLeonard 2:ddaf240af296 125
ThierryLeonard 2:ddaf240af296 126 case 0x4e44: // Node Discovery AT Command
ThierryLeonard 2:ddaf240af296 127 {
ThierryLeonard 2:ddaf240af296 128 uint64_t serialNumber = 0;
ThierryLeonard 3:eda76f539da3 129 addresse_16_bit[0] = data[5];
ThierryLeonard 3:eda76f539da3 130 addresse_16_bit[1] = data[6];
ThierryLeonard 3:eda76f539da3 131 pc.printf("\nSerial number : ");
ThierryLeonard 3:eda76f539da3 132 for(int i = 7; i < 15; i++)
ThierryLeonard 2:ddaf240af296 133 {
ThierryLeonard 2:ddaf240af296 134 serialNumber += data[i] << (8 * (13-i -1) );
ThierryLeonard 3:eda76f539da3 135 addresse_64_bit[i-7] = data[i];
ThierryLeonard 3:eda76f539da3 136 pc.printf("%x ",data[i]);
ThierryLeonard 2:ddaf240af296 137 }
ThierryLeonard 3:eda76f539da3 138 pc.printf("\n");
ThierryLeonard 2:ddaf240af296 139
ThierryLeonard 2:ddaf240af296 140 return;
ThierryLeonard 2:ddaf240af296 141 }
ThierryLeonard 2:ddaf240af296 142 break;
ThierryLeonard 2:ddaf240af296 143 }
ThierryLeonard 2:ddaf240af296 144
ThierryLeonard 2:ddaf240af296 145 }
ThierryLeonard 2:ddaf240af296 146
ThierryLeonard 3:eda76f539da3 147 void receiveTransmitRequest(uint8_t* data,int length){
ThierryLeonard 3:eda76f539da3 148
ThierryLeonard 3:eda76f539da3 149 for(int i = TRANSMIT_REQUEST_DATA; i <length;i++)
evrast 1:fe18dd0ba172 150 {
ThierryLeonard 3:eda76f539da3 151 // pc.printf("%c", data[i]);
evrast 1:fe18dd0ba172 152 }
evrast 1:fe18dd0ba172 153 }
evrast 1:fe18dd0ba172 154
ThierryLeonard 3:eda76f539da3 155 void stopLed()
ThierryLeonard 3:eda76f539da3 156 {
ThierryLeonard 3:eda76f539da3 157 myled = 0;
ThierryLeonard 3:eda76f539da3 158 }
ThierryLeonard 3:eda76f539da3 159
ThierryLeonard 3:eda76f539da3 160 void triggerErrorLed()
ThierryLeonard 3:eda76f539da3 161 {
ThierryLeonard 3:eda76f539da3 162 myled = 1;
ThierryLeonard 3:eda76f539da3 163
ThierryLeonard 3:eda76f539da3 164 static Timeout t;
ThierryLeonard 3:eda76f539da3 165 t.detach();
ThierryLeonard 3:eda76f539da3 166 t.attach(stopLed,1.0);
ThierryLeonard 3:eda76f539da3 167 }
evrast 1:fe18dd0ba172 168
evrast 1:fe18dd0ba172 169 void receiveNewPaquet()
evrast 1:fe18dd0ba172 170 {
evrast 1:fe18dd0ba172 171 int length;
ThierryLeonard 3:eda76f539da3 172 uint8_t temp = xBee.getc();
ThierryLeonard 3:eda76f539da3 173 if(temp == START_DELEMITER)
evrast 1:fe18dd0ba172 174 {
ThierryLeonard 2:ddaf240af296 175 // MSB
evrast 1:fe18dd0ba172 176 length = (((xBee.getc()) << 8));
ThierryLeonard 2:ddaf240af296 177 // LSB
evrast 1:fe18dd0ba172 178 length +=(xBee.getc());
evrast 1:fe18dd0ba172 179 uint8_t frame_type = xBee.getc();
evrast 1:fe18dd0ba172 180
ThierryLeonard 2:ddaf240af296 181 uint8_t data[512];
ThierryLeonard 2:ddaf240af296 182 data[0] = frame_type;
ThierryLeonard 2:ddaf240af296 183
ThierryLeonard 3:eda76f539da3 184 uint8_t checkSum = 0xFF - frame_type;
ThierryLeonard 3:eda76f539da3 185
ThierryLeonard 3:eda76f539da3 186 for(int i = 1; i < length; i++)
ThierryLeonard 3:eda76f539da3 187 {
ThierryLeonard 3:eda76f539da3 188 uint8_t temp = xBee.getc();
ThierryLeonard 3:eda76f539da3 189 if(temp == 0x7E){
ThierryLeonard 3:eda76f539da3 190 pc.printf("\n Erreur 7e \n");
ThierryLeonard 3:eda76f539da3 191
ThierryLeonard 3:eda76f539da3 192 triggerErrorLed();
ThierryLeonard 3:eda76f539da3 193 return;
ThierryLeonard 3:eda76f539da3 194 }
ThierryLeonard 3:eda76f539da3 195 data[i] = temp;
ThierryLeonard 3:eda76f539da3 196 checkSum-=temp;
ThierryLeonard 3:eda76f539da3 197 }
ThierryLeonard 3:eda76f539da3 198 // Mauvais CheckSum
ThierryLeonard 3:eda76f539da3 199 if(checkSum != xBee.getc())
ThierryLeonard 3:eda76f539da3 200 {
ThierryLeonard 3:eda76f539da3 201 pc.printf("\nMauvais checksum\n");
ThierryLeonard 3:eda76f539da3 202 triggerErrorLed();
ThierryLeonard 3:eda76f539da3 203 }
evrast 1:fe18dd0ba172 204 switch (frame_type){
ThierryLeonard 2:ddaf240af296 205 case 0x90:
ThierryLeonard 3:eda76f539da3 206 //pc.printf("ReceiveTransmit");
ThierryLeonard 3:eda76f539da3 207 receiveTransmitRequest(data,length);
ThierryLeonard 2:ddaf240af296 208 // AT command Response frame
ThierryLeonard 2:ddaf240af296 209 break;
ThierryLeonard 2:ddaf240af296 210 case 0x88:
ThierryLeonard 3:eda76f539da3 211
ThierryLeonard 2:ddaf240af296 212 pc.printf("\nat response : length %i, frame time %i\n",length,frame_type);
ThierryLeonard 3:eda76f539da3 213
ThierryLeonard 3:eda76f539da3 214 receiveAtCommandResponse(length, data);
ThierryLeonard 3:eda76f539da3 215
ThierryLeonard 2:ddaf240af296 216 break;
ThierryLeonard 3:eda76f539da3 217 }
evrast 1:fe18dd0ba172 218 }
evrast 1:fe18dd0ba172 219 }
evrast 1:fe18dd0ba172 220
evrast 1:fe18dd0ba172 221
evrast 1:fe18dd0ba172 222
evrast 0:53817a293b39 223 int main() {
ThierryLeonard 2:ddaf240af296 224 flipper.attach (&sendRemoteAtCommand,1);
evrast 0:53817a293b39 225 reset =0;
evrast 0:53817a293b39 226 wait_ms(500);
evrast 0:53817a293b39 227 reset=1;
evrast 0:53817a293b39 228 wait(1);
evrast 0:53817a293b39 229 xBee.printf("+++");
ThierryLeonard 3:eda76f539da3 230
evrast 0:53817a293b39 231 wait(1);
evrast 0:53817a293b39 232 //
evrast 0:53817a293b39 233 // for(int i =0;i <14;i++){
evrast 0:53817a293b39 234 // xBee.putc(pan_id[i]);
evrast 0:53817a293b39 235 // }
ThierryLeonard 3:eda76f539da3 236 sendNDCommand();
evrast 0:53817a293b39 237 while(1) {
ThierryLeonard 3:eda76f539da3 238
evrast 0:53817a293b39 239 if(xBee.readable()){
evrast 1:fe18dd0ba172 240 receiveNewPaquet();
evrast 1:fe18dd0ba172 241 }
evrast 1:fe18dd0ba172 242 if (atCommand){
evrast 1:fe18dd0ba172 243 atCommand = false;
ThierryLeonard 2:ddaf240af296 244 sendRemoteLedCommandPaquet();
ThierryLeonard 3:eda76f539da3 245 }
evrast 0:53817a293b39 246 }
evrast 0:53817a293b39 247 }
evrast 0:53817a293b39 248