app3

Dependencies:   EthernetInterface WebSocketClient mbed-rtos mbed

Fork of Code_APP1 by Louis Beaulieu

Committer:
ericbisson
Date:
Tue Feb 14 04:08:58 2017 +0000
Revision:
9:400cfcf4b06e
app3

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ericbisson 9:400cfcf4b06e 1 #include "xbee.h"
ericbisson 9:400cfcf4b06e 2
ericbisson 9:400cfcf4b06e 3 Timeout timeOut;
ericbisson 9:400cfcf4b06e 4 PwmOut led_error(LED2);
ericbisson 9:400cfcf4b06e 5 void LED_TurnOff()
ericbisson 9:400cfcf4b06e 6 {
ericbisson 9:400cfcf4b06e 7 led_error = 0;
ericbisson 9:400cfcf4b06e 8 }
ericbisson 9:400cfcf4b06e 9
ericbisson 9:400cfcf4b06e 10 //--------------------------------------------------------------//
ericbisson 9:400cfcf4b06e 11 // Fonction d'envoie de données pour ZigBee (Transmit request)
ericbisson 9:400cfcf4b06e 12 // Testé et fonctionnel
ericbisson 9:400cfcf4b06e 13 //--------------------------------------------------------------//
ericbisson 9:400cfcf4b06e 14 void send(Serial* COM, CArray* message)
ericbisson 9:400cfcf4b06e 15 {
ericbisson 9:400cfcf4b06e 16 short opt_size = 0;
ericbisson 9:400cfcf4b06e 17 COM->putc(0x7E); // Start delimiter
ericbisson 9:400cfcf4b06e 18 COM->putc(0x00); // length MSB is always 0
ericbisson 9:400cfcf4b06e 19
ericbisson 9:400cfcf4b06e 20 if (message->_FrameType == 0x08) // Les commandes AT ne reçoivent pas d'addresses
ericbisson 9:400cfcf4b06e 21 {
ericbisson 9:400cfcf4b06e 22 COM->putc(6);
ericbisson 9:400cfcf4b06e 23 }
ericbisson 9:400cfcf4b06e 24 else
ericbisson 9:400cfcf4b06e 25 {
ericbisson 9:400cfcf4b06e 26 COM->putc(message->size + 12 + message->opt_size);
ericbisson 9:400cfcf4b06e 27 }
ericbisson 9:400cfcf4b06e 28
ericbisson 9:400cfcf4b06e 29 COM->putc(message->_FrameType);
ericbisson 9:400cfcf4b06e 30 COM->putc(0x01); // Frame ID
ericbisson 9:400cfcf4b06e 31
ericbisson 9:400cfcf4b06e 32 if (message->_FrameType != 0x08) // Les commandes AT ne reçoivent pas d'addresses
ericbisson 9:400cfcf4b06e 33 {
ericbisson 9:400cfcf4b06e 34 COM->putc(message->_64bit.bit[0]);
ericbisson 9:400cfcf4b06e 35 COM->putc(message->_64bit.bit[1]);
ericbisson 9:400cfcf4b06e 36 COM->putc(message->_64bit.bit[2]);
ericbisson 9:400cfcf4b06e 37 COM->putc(message->_64bit.bit[3]);
ericbisson 9:400cfcf4b06e 38 COM->putc(message->_64bit.bit[4]);
ericbisson 9:400cfcf4b06e 39 COM->putc(message->_64bit.bit[5]);
ericbisson 9:400cfcf4b06e 40 COM->putc(message->_64bit.bit[6]);
ericbisson 9:400cfcf4b06e 41 COM->putc(message->_64bit.bit[7]);
ericbisson 9:400cfcf4b06e 42 COM->putc(message->_16bit.bit[0]);
ericbisson 9:400cfcf4b06e 43 COM->putc(message->_16bit.bit[1]);
ericbisson 9:400cfcf4b06e 44
ericbisson 9:400cfcf4b06e 45 for (int i = 0; i < message->opt_size; i++)
ericbisson 9:400cfcf4b06e 46 {
ericbisson 9:400cfcf4b06e 47 opt_size += message->options[i];
ericbisson 9:400cfcf4b06e 48 COM->putc(message->options[i]);
ericbisson 9:400cfcf4b06e 49 }
ericbisson 9:400cfcf4b06e 50 }
ericbisson 9:400cfcf4b06e 51
ericbisson 9:400cfcf4b06e 52 for (int j = 0; j < message->size; j++)
ericbisson 9:400cfcf4b06e 53 {
ericbisson 9:400cfcf4b06e 54 COM->putc(message->_ptr[j]);
ericbisson 9:400cfcf4b06e 55 }
ericbisson 9:400cfcf4b06e 56 COM->putc(calculate_checksum(message,
ericbisson 9:400cfcf4b06e 57 message->_FrameType +
ericbisson 9:400cfcf4b06e 58 0x01 +
ericbisson 9:400cfcf4b06e 59 opt_size +
ericbisson 9:400cfcf4b06e 60 message->_16bit.bit[0] +
ericbisson 9:400cfcf4b06e 61 message->_16bit.bit[1] +
ericbisson 9:400cfcf4b06e 62 message->_64bit.bit[0] +
ericbisson 9:400cfcf4b06e 63 message->_64bit.bit[1] +
ericbisson 9:400cfcf4b06e 64 message->_64bit.bit[2] +
ericbisson 9:400cfcf4b06e 65 message->_64bit.bit[3] +
ericbisson 9:400cfcf4b06e 66 message->_64bit.bit[4] +
ericbisson 9:400cfcf4b06e 67 message->_64bit.bit[5] +
ericbisson 9:400cfcf4b06e 68 message->_64bit.bit[6] +
ericbisson 9:400cfcf4b06e 69 message->_64bit.bit[7]
ericbisson 9:400cfcf4b06e 70 ));
ericbisson 9:400cfcf4b06e 71 }
ericbisson 9:400cfcf4b06e 72 //--------------------------------------------------------------//
ericbisson 9:400cfcf4b06e 73
ericbisson 9:400cfcf4b06e 74 //--------------------------------------------------------------//
ericbisson 9:400cfcf4b06e 75 // Fonction pour la réception de données (Packet Receive)
ericbisson 9:400cfcf4b06e 76 // Testé et fonctionnel
ericbisson 9:400cfcf4b06e 77 //--------------------------------------------------------------//
ericbisson 9:400cfcf4b06e 78 void read(Serial* COM, CArray* returnValue)
ericbisson 9:400cfcf4b06e 79 {
ericbisson 9:400cfcf4b06e 80 char BYTE_ID = 0;
ericbisson 9:400cfcf4b06e 81 char opts = 0;
ericbisson 9:400cfcf4b06e 82 bool bIsTrame = false;
ericbisson 9:400cfcf4b06e 83 while (true)
ericbisson 9:400cfcf4b06e 84 if (COM->readable())
ericbisson 9:400cfcf4b06e 85 {
ericbisson 9:400cfcf4b06e 86 char value = COM->getc();
ericbisson 9:400cfcf4b06e 87
ericbisson 9:400cfcf4b06e 88 if (bIsTrame)
ericbisson 9:400cfcf4b06e 89 {
ericbisson 9:400cfcf4b06e 90 switch (BYTE_ID)
ericbisson 9:400cfcf4b06e 91 {
ericbisson 9:400cfcf4b06e 92 case 1:
ericbisson 9:400cfcf4b06e 93 break;
ericbisson 9:400cfcf4b06e 94 case 2: // on ignore le 1, car c'est toujours 0x00
ericbisson 9:400cfcf4b06e 95 returnValue->size = value - 12;
ericbisson 9:400cfcf4b06e 96 break;
ericbisson 9:400cfcf4b06e 97 case 3:
ericbisson 9:400cfcf4b06e 98 if (value != 0x90)
ericbisson 9:400cfcf4b06e 99 return;
ericbisson 9:400cfcf4b06e 100 returnValue->_FrameType = value;
ericbisson 9:400cfcf4b06e 101 break;
ericbisson 9:400cfcf4b06e 102 case 4:
ericbisson 9:400cfcf4b06e 103 case 5:
ericbisson 9:400cfcf4b06e 104 case 6:
ericbisson 9:400cfcf4b06e 105 case 7:
ericbisson 9:400cfcf4b06e 106 case 8:
ericbisson 9:400cfcf4b06e 107 case 9:
ericbisson 9:400cfcf4b06e 108 case 10:
ericbisson 9:400cfcf4b06e 109 case 11:
ericbisson 9:400cfcf4b06e 110 returnValue->_64bit.bit[BYTE_ID - 4] = value;
ericbisson 9:400cfcf4b06e 111 break;
ericbisson 9:400cfcf4b06e 112 case 12:
ericbisson 9:400cfcf4b06e 113 case 13: // <-- Addresse 16 bit de l'envoyeur ici
ericbisson 9:400cfcf4b06e 114 returnValue->_16bit.bit[BYTE_ID - 12] = value;
ericbisson 9:400cfcf4b06e 115 break;
ericbisson 9:400cfcf4b06e 116 case 14: // je gère pas les options pour là
ericbisson 9:400cfcf4b06e 117 opts = value;
ericbisson 9:400cfcf4b06e 118 break;
ericbisson 9:400cfcf4b06e 119 default:
ericbisson 9:400cfcf4b06e 120 if (BYTE_ID < 15 + returnValue->size)
ericbisson 9:400cfcf4b06e 121 {
ericbisson 9:400cfcf4b06e 122 if (returnValue->_ptr == NULL)
ericbisson 9:400cfcf4b06e 123 returnValue->_ptr = new char[returnValue->size];
ericbisson 9:400cfcf4b06e 124
ericbisson 9:400cfcf4b06e 125 returnValue->_ptr[BYTE_ID - 15] = value;
ericbisson 9:400cfcf4b06e 126 break;
ericbisson 9:400cfcf4b06e 127 }
ericbisson 9:400cfcf4b06e 128 // Finalement, le checksum. On vérifie que c'est bon
ericbisson 9:400cfcf4b06e 129 if (value != calculate_checksum(returnValue,
ericbisson 9:400cfcf4b06e 130 0x90 +
ericbisson 9:400cfcf4b06e 131 opts +
ericbisson 9:400cfcf4b06e 132 returnValue->_16bit.bit[0] +
ericbisson 9:400cfcf4b06e 133 returnValue->_16bit.bit[1] +
ericbisson 9:400cfcf4b06e 134 returnValue->_64bit.bit[0] +
ericbisson 9:400cfcf4b06e 135 returnValue->_64bit.bit[1] +
ericbisson 9:400cfcf4b06e 136 returnValue->_64bit.bit[2] +
ericbisson 9:400cfcf4b06e 137 returnValue->_64bit.bit[3] +
ericbisson 9:400cfcf4b06e 138 returnValue->_64bit.bit[4] +
ericbisson 9:400cfcf4b06e 139 returnValue->_64bit.bit[5] +
ericbisson 9:400cfcf4b06e 140 returnValue->_64bit.bit[6] +
ericbisson 9:400cfcf4b06e 141 returnValue->_64bit.bit[7]
ericbisson 9:400cfcf4b06e 142 ))
ericbisson 9:400cfcf4b06e 143 {
ericbisson 9:400cfcf4b06e 144 // Gestion d'erreur ici?
ericbisson 9:400cfcf4b06e 145 led_error = 1;
ericbisson 9:400cfcf4b06e 146 timeOut.attach(LED_TurnOff, 1);
ericbisson 9:400cfcf4b06e 147 }
ericbisson 9:400cfcf4b06e 148 return;
ericbisson 9:400cfcf4b06e 149 }
ericbisson 9:400cfcf4b06e 150 }
ericbisson 9:400cfcf4b06e 151 else if (value == 0x7E)
ericbisson 9:400cfcf4b06e 152 bIsTrame = true;
ericbisson 9:400cfcf4b06e 153 else
ericbisson 9:400cfcf4b06e 154 return;
ericbisson 9:400cfcf4b06e 155
ericbisson 9:400cfcf4b06e 156 //wait_ms(3); // petit sleep pour recevoir un nouveau byte
ericbisson 9:400cfcf4b06e 157 BYTE_ID++;
ericbisson 9:400cfcf4b06e 158 }
ericbisson 9:400cfcf4b06e 159 }
ericbisson 9:400cfcf4b06e 160 //--------------------------------------------------------------//
ericbisson 9:400cfcf4b06e 161
ericbisson 9:400cfcf4b06e 162 //--------------------------------------------------------------//
ericbisson 9:400cfcf4b06e 163 // Fonction de checksum pour le protocole ZigBee
ericbisson 9:400cfcf4b06e 164 // Testé et fonctionnel
ericbisson 9:400cfcf4b06e 165 //--------------------------------------------------------------//
ericbisson 9:400cfcf4b06e 166 char calculate_checksum(CArray* message, short header_size)
ericbisson 9:400cfcf4b06e 167 {
ericbisson 9:400cfcf4b06e 168 short sum = header_size;
ericbisson 9:400cfcf4b06e 169 if (message != NULL)
ericbisson 9:400cfcf4b06e 170 {
ericbisson 9:400cfcf4b06e 171 for (int i = 0; i < message->size; i++)
ericbisson 9:400cfcf4b06e 172 {
ericbisson 9:400cfcf4b06e 173 sum += message->_ptr[i];
ericbisson 9:400cfcf4b06e 174 }
ericbisson 9:400cfcf4b06e 175 }
ericbisson 9:400cfcf4b06e 176 return 0xFF - (sum & 0x00FF);
ericbisson 9:400cfcf4b06e 177 }
ericbisson 9:400cfcf4b06e 178 //--------------------------------------------------------------//
ericbisson 9:400cfcf4b06e 179
ericbisson 9:400cfcf4b06e 180 void setPAN(Serial* COM, short pan_id)
ericbisson 9:400cfcf4b06e 181 {
ericbisson 9:400cfcf4b06e 182 CArray DATA_TO_SEND;
ericbisson 9:400cfcf4b06e 183 for (int j = 0; j < 8; j++) // Je force tout à 0 pour les addresses
ericbisson 9:400cfcf4b06e 184 DATA_TO_SEND._64bit.bit[j] = 0;
ericbisson 9:400cfcf4b06e 185 DATA_TO_SEND._16bit.bit[0] = 0;
ericbisson 9:400cfcf4b06e 186 DATA_TO_SEND._16bit.bit[1] = 0;
ericbisson 9:400cfcf4b06e 187 DATA_TO_SEND.opt_size = 0;
ericbisson 9:400cfcf4b06e 188
ericbisson 9:400cfcf4b06e 189 DATA_TO_SEND._FrameType = 0x08; // AT Command
ericbisson 9:400cfcf4b06e 190 DATA_TO_SEND.size = 4;
ericbisson 9:400cfcf4b06e 191 DATA_TO_SEND._ptr = new char[4];
ericbisson 9:400cfcf4b06e 192 DATA_TO_SEND._ptr[0] = 'I';
ericbisson 9:400cfcf4b06e 193 DATA_TO_SEND._ptr[1] = 'D';
ericbisson 9:400cfcf4b06e 194 DATA_TO_SEND._ptr[2] = pan_id >> 8;
ericbisson 9:400cfcf4b06e 195 DATA_TO_SEND._ptr[3] = pan_id & 0x00FF;
ericbisson 9:400cfcf4b06e 196
ericbisson 9:400cfcf4b06e 197 send(COM, &DATA_TO_SEND);
ericbisson 9:400cfcf4b06e 198
ericbisson 9:400cfcf4b06e 199 delete DATA_TO_SEND._ptr;
ericbisson 9:400cfcf4b06e 200 }