pre commentaire
Dependencies: EthernetInterface WebSocketClient mbed-rtos mbed
Fork of Code_APP3_C by
xbee.cpp@11:f0ceb634d85c, 2017-02-14 (annotated)
- Committer:
- JoeyDionne
- Date:
- Tue Feb 14 17:36:39 2017 +0000
- Revision:
- 11:f0ceb634d85c
- Parent:
- 10:565271e4d52a
pre commentaire
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
ericbisson | 9:400cfcf4b06e | 1 | #include "xbee.h" |
ericbisson | 9:400cfcf4b06e | 2 | |
ericbisson | 9:400cfcf4b06e | 3 | Timeout timeOut; |
JoeyDionne | 10:565271e4d52a | 4 | AnalogOut led_error(p18); |
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 | } |