Code APP3

Dependencies:   mbed EthernetInterface WebSocketClient mbed-rtos BufferedSerial

Fork of APP3_Lab by Jean-Philippe Fournier

Committer:
JayMcGee
Date:
Mon Oct 02 21:54:52 2017 +0000
Revision:
29:56b6c15904e6
Parent:
27:3baf4701a047
Merge

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Cheroukee 1:ea1b52d0a8a3 1
Cheroukee 1:ea1b52d0a8a3 2 /***
Cheroukee 1:ea1b52d0a8a3 3 * xbee.cpp - en-tete de lib xbee - fouj1807 - mcgj2701
Cheroukee 1:ea1b52d0a8a3 4 */
Cheroukee 1:ea1b52d0a8a3 5
Cheroukee 1:ea1b52d0a8a3 6 #include "xbee.h"
Cheroukee 1:ea1b52d0a8a3 7
Cheroukee 2:a9bb12eefc08 8 DigitalOut xbee_transmit_led(LED1);
Cheroukee 2:a9bb12eefc08 9 DigitalOut xbee_receive_led(LED2);
Cheroukee 1:ea1b52d0a8a3 10 DigitalOut xbee_reset(p8);
Cheroukee 1:ea1b52d0a8a3 11
Cheroukee 17:8abdbfa6019c 12 BufferedSerial xbee(p13, p14); // tx, rx
Cheroukee 17:8abdbfa6019c 13 Serial pc_usb(USBTX, USBRX);
Cheroukee 17:8abdbfa6019c 14 void Rx_interrupt();
Cheroukee 17:8abdbfa6019c 15
Cheroukee 17:8abdbfa6019c 16 #define BUFFER_SIZE 2048
Cheroukee 17:8abdbfa6019c 17
Cheroukee 17:8abdbfa6019c 18 char TransmitBuffer[BUFFER_SIZE] = {0};
Cheroukee 17:8abdbfa6019c 19 char ReceiveBuffer[BUFFER_SIZE] = {0};
Cheroukee 1:ea1b52d0a8a3 20
Cheroukee 17:8abdbfa6019c 21 volatile int rx_in = 0;
Cheroukee 17:8abdbfa6019c 22 volatile int rx_out = 0;
Cheroukee 17:8abdbfa6019c 23 /*
Cheroukee 17:8abdbfa6019c 24 void Rx_interrupt()
Cheroukee 17:8abdbfa6019c 25 {
Cheroukee 17:8abdbfa6019c 26 // Loop just in case more than one character is in UART's receive FIFO buffer
Cheroukee 17:8abdbfa6019c 27 // Stop if buffer full
Cheroukee 17:8abdbfa6019c 28 while ((xbee.readable()) && (((rx_in + 1) % BUFFER_SIZE) != rx_out)) {
Cheroukee 17:8abdbfa6019c 29
Cheroukee 17:8abdbfa6019c 30 xbee_receive_led= !xbee_receive_led;
Cheroukee 17:8abdbfa6019c 31 ReceiveBuffer[rx_in] = xbee.getc();
Cheroukee 17:8abdbfa6019c 32 // Uncomment to Echo to USB serial to watch data flow
Cheroukee 17:8abdbfa6019c 33 pc_usb.putc(ReceiveBuffer[rx_in]);
Cheroukee 17:8abdbfa6019c 34 rx_in = (rx_in + 1) % BUFFER_SIZE;
Cheroukee 17:8abdbfa6019c 35 }
Cheroukee 17:8abdbfa6019c 36 return;
Cheroukee 17:8abdbfa6019c 37 }
Cheroukee 17:8abdbfa6019c 38 */
JayMcGee 22:7edae38d0758 39
JayMcGee 22:7edae38d0758 40 bool addr_64_equal(zigbee_addr_64_t addr1, zigbee_addr_64_t addr2)
JayMcGee 22:7edae38d0758 41 {
JayMcGee 22:7edae38d0758 42 if( addr1.addr_0 == addr2.addr_0 &&
JayMcGee 22:7edae38d0758 43 addr1.addr_1 == addr2.addr_1 &&
JayMcGee 22:7edae38d0758 44 addr1.addr_2 == addr2.addr_2 &&
JayMcGee 22:7edae38d0758 45 addr1.addr_3 == addr2.addr_3 &&
JayMcGee 22:7edae38d0758 46 addr1.addr_4 == addr2.addr_4 &&
JayMcGee 22:7edae38d0758 47 addr1.addr_5 == addr2.addr_5 &&
JayMcGee 22:7edae38d0758 48 addr1.addr_6 == addr2.addr_6 &&
JayMcGee 22:7edae38d0758 49 addr1.addr_7 == addr2.addr_7)
JayMcGee 22:7edae38d0758 50 {
JayMcGee 22:7edae38d0758 51 return true;
JayMcGee 22:7edae38d0758 52 }
JayMcGee 22:7edae38d0758 53 return false;
JayMcGee 22:7edae38d0758 54 }
JayMcGee 22:7edae38d0758 55
Cheroukee 1:ea1b52d0a8a3 56 void xbee_init()
Cheroukee 1:ea1b52d0a8a3 57 {
Cheroukee 17:8abdbfa6019c 58 // Setup a serial interrupt function to receive data
Cheroukee 2:a9bb12eefc08 59 xbee_receive_led = 0;
Cheroukee 17:8abdbfa6019c 60 //xbee.attach(&Rx_interrupt, Serial::RxIrq);
Cheroukee 17:8abdbfa6019c 61
Cheroukee 17:8abdbfa6019c 62 xbee_reset = 0;
Cheroukee 1:ea1b52d0a8a3 63
Cheroukee 1:ea1b52d0a8a3 64 wait_ms(400);
Cheroukee 1:ea1b52d0a8a3 65
Cheroukee 1:ea1b52d0a8a3 66 xbee_reset = 1;
Cheroukee 1:ea1b52d0a8a3 67
Cheroukee 1:ea1b52d0a8a3 68 wait_ms(5000);
Cheroukee 1:ea1b52d0a8a3 69 }
Cheroukee 1:ea1b52d0a8a3 70
Cheroukee 2:a9bb12eefc08 71 void build_api_frame_header(int frame_data_size)
Cheroukee 2:a9bb12eefc08 72 {
Cheroukee 2:a9bb12eefc08 73 // Delimiter
Cheroukee 2:a9bb12eefc08 74 TransmitBuffer[FRAME_DELIMITER_POS] = ZIGBEE_DELIMITER;
Cheroukee 2:a9bb12eefc08 75 TransmitBuffer[FRAME_LEN_MSB_POS] = frame_data_size >> 8;
Cheroukee 2:a9bb12eefc08 76 TransmitBuffer[FRAME_LEN_LSB_POS] = frame_data_size & 0xFF;
Cheroukee 2:a9bb12eefc08 77 }
Cheroukee 2:a9bb12eefc08 78
Cheroukee 2:a9bb12eefc08 79 void build_api_frame_checksum(int frame_data_size)
Cheroukee 2:a9bb12eefc08 80 {
Cheroukee 1:ea1b52d0a8a3 81 // Calculate checksum
Cheroukee 2:a9bb12eefc08 82 char checksum = 0xFF;
Cheroukee 2:a9bb12eefc08 83 for (int i = 3; i < FRAME_CHEKSUM_POS; i++)
Cheroukee 1:ea1b52d0a8a3 84 {
Cheroukee 1:ea1b52d0a8a3 85 checksum -= TransmitBuffer[i];
Cheroukee 1:ea1b52d0a8a3 86 }
Cheroukee 1:ea1b52d0a8a3 87
Cheroukee 1:ea1b52d0a8a3 88 // Insert checksum into buffer
Cheroukee 2:a9bb12eefc08 89 TransmitBuffer[FRAME_CHEKSUM_POS] = checksum;
Cheroukee 2:a9bb12eefc08 90 }
Cheroukee 2:a9bb12eefc08 91
Cheroukee 2:a9bb12eefc08 92 void set_api_frame_type(frame_type_t frame_type)
Cheroukee 2:a9bb12eefc08 93 {
Cheroukee 2:a9bb12eefc08 94 TransmitBuffer[API_FRAME_TYPE_POS] = frame_type;
Cheroukee 2:a9bb12eefc08 95 }
Cheroukee 2:a9bb12eefc08 96
Cheroukee 2:a9bb12eefc08 97 void set_api_frame_id(int id)
Cheroukee 2:a9bb12eefc08 98 {
Cheroukee 2:a9bb12eefc08 99 TransmitBuffer[API_FRAME_ID_POS] = id;
Cheroukee 2:a9bb12eefc08 100 }
Cheroukee 2:a9bb12eefc08 101
Cheroukee 2:a9bb12eefc08 102 void set_at_command(int at_command)
Cheroukee 2:a9bb12eefc08 103 {
Cheroukee 2:a9bb12eefc08 104 // NOT IMPLEMENTED
Cheroukee 2:a9bb12eefc08 105 }
Cheroukee 2:a9bb12eefc08 106
Cheroukee 2:a9bb12eefc08 107 void set_64_addr(zigbee_addr_64_t address)
Cheroukee 2:a9bb12eefc08 108 {
Cheroukee 2:a9bb12eefc08 109 int i = 0;
Cheroukee 2:a9bb12eefc08 110 TransmitBuffer[TRANSMIT_REQ_ADDR64_MSB_POS + i++] = address.addr_0;
Cheroukee 2:a9bb12eefc08 111 TransmitBuffer[TRANSMIT_REQ_ADDR64_MSB_POS + i++] = address.addr_1;
Cheroukee 2:a9bb12eefc08 112 TransmitBuffer[TRANSMIT_REQ_ADDR64_MSB_POS + i++] = address.addr_2;
Cheroukee 2:a9bb12eefc08 113 TransmitBuffer[TRANSMIT_REQ_ADDR64_MSB_POS + i++] = address.addr_3;
Cheroukee 2:a9bb12eefc08 114
Cheroukee 2:a9bb12eefc08 115 TransmitBuffer[TRANSMIT_REQ_ADDR64_MSB_POS + i++] = address.addr_4;
Cheroukee 2:a9bb12eefc08 116 TransmitBuffer[TRANSMIT_REQ_ADDR64_MSB_POS + i++] = address.addr_5;
Cheroukee 2:a9bb12eefc08 117 TransmitBuffer[TRANSMIT_REQ_ADDR64_MSB_POS + i++] = address.addr_6;
Cheroukee 2:a9bb12eefc08 118 TransmitBuffer[TRANSMIT_REQ_ADDR64_MSB_POS + i++] = address.addr_7;
Cheroukee 2:a9bb12eefc08 119 }
Cheroukee 2:a9bb12eefc08 120
Cheroukee 2:a9bb12eefc08 121 void set_16_addr(zigbee_addr_16_t address)
Cheroukee 2:a9bb12eefc08 122 {
Cheroukee 2:a9bb12eefc08 123 TransmitBuffer[TRANSMIT_REQ_ADDR16_MSB_POS] = address.addr_msb;
Cheroukee 2:a9bb12eefc08 124 TransmitBuffer[TRANSMIT_REQ_ADDR16_MSB_POS + 1] = address.addr_lsb;
Cheroukee 2:a9bb12eefc08 125 }
Cheroukee 2:a9bb12eefc08 126
Cheroukee 2:a9bb12eefc08 127 void set_broadcast_radius(int position, char radius)
Cheroukee 2:a9bb12eefc08 128 {
Cheroukee 2:a9bb12eefc08 129 TransmitBuffer[position] = radius;
Cheroukee 2:a9bb12eefc08 130 }
Cheroukee 2:a9bb12eefc08 131
Cheroukee 2:a9bb12eefc08 132 void set_transmit_request_options(int position, char options)
Cheroukee 2:a9bb12eefc08 133 {
Cheroukee 2:a9bb12eefc08 134 TransmitBuffer[position] = options;
Cheroukee 2:a9bb12eefc08 135 }
Cheroukee 2:a9bb12eefc08 136
Cheroukee 12:1286b80c68f7 137 void set_transmit_data(int start_pos, char* data, int data_length)
Cheroukee 2:a9bb12eefc08 138 {
Cheroukee 2:a9bb12eefc08 139 for (int i = 0; i < data_length; i++)
Cheroukee 1:ea1b52d0a8a3 140 {
Cheroukee 12:1286b80c68f7 141 TransmitBuffer[start_pos + i] = data[i];
Cheroukee 1:ea1b52d0a8a3 142 }
Cheroukee 2:a9bb12eefc08 143 }
Cheroukee 2:a9bb12eefc08 144
Cheroukee 2:a9bb12eefc08 145 bool transmit_request_64(char* buffer, int data_length, char options, zigbee_addr_64_t destination)
Cheroukee 2:a9bb12eefc08 146 {
Cheroukee 2:a9bb12eefc08 147 build_api_frame_header(data_length + TRANSMIT_REQ_OVERHEAD_LENGTH);
Cheroukee 2:a9bb12eefc08 148
Cheroukee 2:a9bb12eefc08 149 set_api_frame_type(TransmitRequest);
Cheroukee 2:a9bb12eefc08 150 set_api_frame_id(0x01);
Cheroukee 2:a9bb12eefc08 151
Cheroukee 2:a9bb12eefc08 152 set_64_addr(destination);
Cheroukee 2:a9bb12eefc08 153 DECLARE_ADDR16_UNKNOWN_OR_BCAST
Cheroukee 2:a9bb12eefc08 154 set_16_addr(USE_ADDR16_UNKNOWN_OR_BCAST);
Cheroukee 2:a9bb12eefc08 155
Cheroukee 2:a9bb12eefc08 156 set_broadcast_radius(15, 0);
Cheroukee 2:a9bb12eefc08 157 set_transmit_request_options(15, 0);
Cheroukee 2:a9bb12eefc08 158
Cheroukee 12:1286b80c68f7 159 set_transmit_data(TRANSMIT_REQ_DATA_START, buffer, data_length);
Cheroukee 2:a9bb12eefc08 160
Cheroukee 2:a9bb12eefc08 161 build_api_frame_checksum(data_length + TRANSMIT_REQ_OVERHEAD_LENGTH);
Cheroukee 2:a9bb12eefc08 162
Cheroukee 2:a9bb12eefc08 163 transmit(data_length);
Cheroukee 1:ea1b52d0a8a3 164
Cheroukee 1:ea1b52d0a8a3 165 return false;
Cheroukee 1:ea1b52d0a8a3 166 }
Cheroukee 1:ea1b52d0a8a3 167
Cheroukee 2:a9bb12eefc08 168 bool transmit_request_16(char* buffer, int data_length, char options, zigbee_addr_16_t destination)
Cheroukee 2:a9bb12eefc08 169 {
Cheroukee 2:a9bb12eefc08 170 build_api_frame_header(data_length + TRANSMIT_REQ_OVERHEAD_LENGTH);
Cheroukee 2:a9bb12eefc08 171
Cheroukee 2:a9bb12eefc08 172 set_api_frame_type(TransmitRequest);
Cheroukee 2:a9bb12eefc08 173 set_api_frame_id(0x01);
Cheroukee 2:a9bb12eefc08 174
Cheroukee 2:a9bb12eefc08 175 DECLARE_ADDR64_BCAST
Cheroukee 2:a9bb12eefc08 176 set_64_addr(USE_ADDR64_BCAST);
Cheroukee 2:a9bb12eefc08 177 set_16_addr(destination);
Cheroukee 2:a9bb12eefc08 178
Cheroukee 2:a9bb12eefc08 179 set_broadcast_radius(15, 0);
Cheroukee 2:a9bb12eefc08 180 set_transmit_request_options(15, 0);
Cheroukee 2:a9bb12eefc08 181
Cheroukee 12:1286b80c68f7 182 set_transmit_data(TRANSMIT_REQ_DATA_START, buffer, data_length);
Cheroukee 2:a9bb12eefc08 183
Cheroukee 2:a9bb12eefc08 184 build_api_frame_checksum(data_length + TRANSMIT_REQ_OVERHEAD_LENGTH);
Cheroukee 2:a9bb12eefc08 185
Cheroukee 2:a9bb12eefc08 186 transmit(data_length);
Cheroukee 2:a9bb12eefc08 187
Cheroukee 2:a9bb12eefc08 188 return false;
Cheroukee 2:a9bb12eefc08 189 }
Cheroukee 2:a9bb12eefc08 190
Cheroukee 2:a9bb12eefc08 191 bool transmit_request(char* buffer, int data_length, char options, zigbee_addr_64_t destination64, zigbee_addr_16_t destination16)
Cheroukee 1:ea1b52d0a8a3 192 {
Cheroukee 2:a9bb12eefc08 193 build_api_frame_header(data_length + TRANSMIT_REQ_OVERHEAD_LENGTH);
Cheroukee 2:a9bb12eefc08 194
Cheroukee 2:a9bb12eefc08 195 set_api_frame_type(TransmitRequest);
Cheroukee 2:a9bb12eefc08 196 set_api_frame_id(0x01);
Cheroukee 2:a9bb12eefc08 197
Cheroukee 2:a9bb12eefc08 198 set_64_addr(destination64);
Cheroukee 2:a9bb12eefc08 199 set_16_addr(destination16);
Cheroukee 2:a9bb12eefc08 200
Cheroukee 2:a9bb12eefc08 201 set_broadcast_radius(15, 0);
Cheroukee 2:a9bb12eefc08 202 set_transmit_request_options(15, 0);
Cheroukee 2:a9bb12eefc08 203
Cheroukee 12:1286b80c68f7 204 set_transmit_data(TRANSMIT_REQ_DATA_START, buffer, data_length);
Cheroukee 2:a9bb12eefc08 205
Cheroukee 2:a9bb12eefc08 206 build_api_frame_checksum(data_length + TRANSMIT_REQ_OVERHEAD_LENGTH);
Cheroukee 2:a9bb12eefc08 207
Cheroukee 12:1286b80c68f7 208 transmit(data_length + TRANSMIT_REQ_OVERHEAD_LENGTH);
Cheroukee 2:a9bb12eefc08 209
Cheroukee 2:a9bb12eefc08 210 return false;
Cheroukee 2:a9bb12eefc08 211 }
Cheroukee 2:a9bb12eefc08 212
Cheroukee 25:7b808fb9e025 213 void remote_at_command_query(char msb, char lsb, char options, zigbee_addr_64_t destination)
Cheroukee 12:1286b80c68f7 214 {
Cheroukee 12:1286b80c68f7 215 char remote_command[2] = {msb, lsb};
Cheroukee 12:1286b80c68f7 216
Cheroukee 12:1286b80c68f7 217 build_api_frame_header(2 + REMOTE_AT_OVERHEAD_LENGTH);
Cheroukee 12:1286b80c68f7 218
Cheroukee 12:1286b80c68f7 219 set_api_frame_type(RemoteCommandRequest);
Cheroukee 12:1286b80c68f7 220 set_api_frame_id(0x01);
Cheroukee 12:1286b80c68f7 221
Cheroukee 12:1286b80c68f7 222 DECLARE_ADDR16_UNKNOWN_OR_BCAST
Cheroukee 12:1286b80c68f7 223
Cheroukee 25:7b808fb9e025 224 set_64_addr(destination);
Cheroukee 12:1286b80c68f7 225 set_16_addr(USE_ADDR16_UNKNOWN_OR_BCAST);
Cheroukee 12:1286b80c68f7 226
Cheroukee 12:1286b80c68f7 227 // Set as apply
Cheroukee 12:1286b80c68f7 228 set_transmit_request_options(15, options);
Cheroukee 12:1286b80c68f7 229
Cheroukee 12:1286b80c68f7 230 set_transmit_data(16, remote_command, 2);
Cheroukee 12:1286b80c68f7 231
Cheroukee 12:1286b80c68f7 232 build_api_frame_checksum(2 + REMOTE_AT_OVERHEAD_LENGTH);
Cheroukee 12:1286b80c68f7 233
Cheroukee 12:1286b80c68f7 234 transmit(2 + REMOTE_AT_OVERHEAD_LENGTH);
Cheroukee 12:1286b80c68f7 235 }
Cheroukee 12:1286b80c68f7 236
Cheroukee 25:7b808fb9e025 237 void remote_at_command_set(char msb, char lsb, char parameter, char options, zigbee_addr_64_t destination)
Cheroukee 12:1286b80c68f7 238 {
Cheroukee 12:1286b80c68f7 239 char remote_command[3] = {msb, lsb, parameter};
Cheroukee 12:1286b80c68f7 240
Cheroukee 12:1286b80c68f7 241 build_api_frame_header(3 + REMOTE_AT_OVERHEAD_LENGTH);
Cheroukee 12:1286b80c68f7 242
Cheroukee 12:1286b80c68f7 243 set_api_frame_type(RemoteCommandRequest);
Cheroukee 12:1286b80c68f7 244 set_api_frame_id(0x01);
Cheroukee 12:1286b80c68f7 245
Cheroukee 12:1286b80c68f7 246 DECLARE_ADDR16_UNKNOWN_OR_BCAST
Cheroukee 12:1286b80c68f7 247
Cheroukee 25:7b808fb9e025 248 set_64_addr(destination);
Cheroukee 12:1286b80c68f7 249 set_16_addr(USE_ADDR16_UNKNOWN_OR_BCAST);
Cheroukee 12:1286b80c68f7 250
Cheroukee 12:1286b80c68f7 251 // Set as apply
Cheroukee 12:1286b80c68f7 252 set_transmit_request_options(15, options);
Cheroukee 12:1286b80c68f7 253
Cheroukee 12:1286b80c68f7 254 set_transmit_data(16, remote_command, 3);
Cheroukee 12:1286b80c68f7 255
Cheroukee 12:1286b80c68f7 256 build_api_frame_checksum(3 + REMOTE_AT_OVERHEAD_LENGTH);
Cheroukee 12:1286b80c68f7 257
Cheroukee 12:1286b80c68f7 258 transmit(3 + REMOTE_AT_OVERHEAD_LENGTH);
Cheroukee 12:1286b80c68f7 259 }
Cheroukee 12:1286b80c68f7 260
Cheroukee 14:cd488eba8bba 261
Cheroukee 14:cd488eba8bba 262 void at_command_query(char msb, char lsb)
Cheroukee 14:cd488eba8bba 263 {
Cheroukee 14:cd488eba8bba 264 char command[2] = {msb, lsb};
Cheroukee 14:cd488eba8bba 265
Cheroukee 14:cd488eba8bba 266 build_api_frame_header(2 + REMOTE_AT_OVERHEAD_LENGTH);
Cheroukee 14:cd488eba8bba 267
Cheroukee 14:cd488eba8bba 268 set_api_frame_type(ATCommand);
Cheroukee 14:cd488eba8bba 269 set_api_frame_id(0x01);
Cheroukee 14:cd488eba8bba 270
Cheroukee 14:cd488eba8bba 271 set_transmit_data(7, command, 2);
Cheroukee 14:cd488eba8bba 272
Cheroukee 14:cd488eba8bba 273 build_api_frame_checksum(2 + REMOTE_AT_OVERHEAD_LENGTH);
Cheroukee 14:cd488eba8bba 274
Cheroukee 14:cd488eba8bba 275 transmit(2 + REMOTE_AT_OVERHEAD_LENGTH);
Cheroukee 14:cd488eba8bba 276 }
Cheroukee 14:cd488eba8bba 277
Cheroukee 14:cd488eba8bba 278 void at_command_set(char msb, char lsb, char* parameter, int parameter_length)
Cheroukee 14:cd488eba8bba 279 {
Cheroukee 14:cd488eba8bba 280 char command[2] = {msb, lsb};
Cheroukee 14:cd488eba8bba 281
Cheroukee 14:cd488eba8bba 282 build_api_frame_header(parameter_length + AT_COMMAND_OVERHEAD_LENGTH);
Cheroukee 14:cd488eba8bba 283
Cheroukee 14:cd488eba8bba 284 set_api_frame_type(ATCommand);
Cheroukee 14:cd488eba8bba 285 set_api_frame_id(0x01);
Cheroukee 14:cd488eba8bba 286
Cheroukee 14:cd488eba8bba 287 set_transmit_data(5, command, 2);
Cheroukee 14:cd488eba8bba 288 set_transmit_data(7, parameter, parameter_length);
Cheroukee 14:cd488eba8bba 289
Cheroukee 14:cd488eba8bba 290 build_api_frame_checksum(parameter_length + AT_COMMAND_OVERHEAD_LENGTH);
Cheroukee 14:cd488eba8bba 291
Cheroukee 14:cd488eba8bba 292 transmit(parameter_length + AT_COMMAND_OVERHEAD_LENGTH);
Cheroukee 14:cd488eba8bba 293 }
Cheroukee 14:cd488eba8bba 294
Cheroukee 2:a9bb12eefc08 295 void transmit(int packet_length)
Cheroukee 2:a9bb12eefc08 296 {
Cheroukee 12:1286b80c68f7 297 for (int i = 0; i < packet_length + 4; i++)
Cheroukee 2:a9bb12eefc08 298 {
Cheroukee 2:a9bb12eefc08 299 xbee.putc(TransmitBuffer[i]);
Cheroukee 2:a9bb12eefc08 300 }
Cheroukee 5:9e6a09a38785 301 xbee_transmit_led = !xbee_transmit_led;
Cheroukee 5:9e6a09a38785 302 }
Cheroukee 5:9e6a09a38785 303
Cheroukee 27:3baf4701a047 304 bool receive(frame_t* out_frame)
Cheroukee 5:9e6a09a38785 305 {
Cheroukee 24:29ec42daa82e 306 static int curr_length = 0;
Cheroukee 24:29ec42daa82e 307
Cheroukee 24:29ec42daa82e 308 static frame_recv_state_t recv_state = wait_delimiter;
Cheroukee 17:8abdbfa6019c 309 static char checksum = 0xFF;
Cheroukee 17:8abdbfa6019c 310
Cheroukee 17:8abdbfa6019c 311 bool finished_frame = false;
Cheroukee 17:8abdbfa6019c 312
Cheroukee 24:29ec42daa82e 313 xbee_receive_led = !xbee_receive_led;
Cheroukee 27:3baf4701a047 314 while(xbee.readable() && curr_length < MAX_FRAME_SIZE && !finished_frame)
Cheroukee 5:9e6a09a38785 315 {
Cheroukee 24:29ec42daa82e 316 char current = xbee.getc();
Cheroukee 17:8abdbfa6019c 317 switch(recv_state)
Cheroukee 17:8abdbfa6019c 318 {
Cheroukee 17:8abdbfa6019c 319 case wait_delimiter:
Cheroukee 17:8abdbfa6019c 320 {
Cheroukee 17:8abdbfa6019c 321 if (current == ZIGBEE_DELIMITER)
Cheroukee 17:8abdbfa6019c 322 {
Cheroukee 17:8abdbfa6019c 323 curr_length = 0;
Cheroukee 17:8abdbfa6019c 324 recv_state = read_length_msb;
Cheroukee 17:8abdbfa6019c 325 out_frame->length = 0;
Cheroukee 17:8abdbfa6019c 326 }
Cheroukee 17:8abdbfa6019c 327 break;
Cheroukee 17:8abdbfa6019c 328 }
Cheroukee 17:8abdbfa6019c 329 case read_length_msb:
Cheroukee 17:8abdbfa6019c 330 {
Cheroukee 17:8abdbfa6019c 331 out_frame->length = (current << 8);
Cheroukee 17:8abdbfa6019c 332 recv_state = read_length_lsb;
Cheroukee 17:8abdbfa6019c 333 break;
Cheroukee 17:8abdbfa6019c 334 }
Cheroukee 17:8abdbfa6019c 335 case read_length_lsb:
Cheroukee 17:8abdbfa6019c 336 {
Cheroukee 24:29ec42daa82e 337 out_frame->length |= current;
Cheroukee 17:8abdbfa6019c 338 checksum = 0xFF;
Cheroukee 17:8abdbfa6019c 339 recv_state = read_frame_specific;
Cheroukee 17:8abdbfa6019c 340 break;
Cheroukee 17:8abdbfa6019c 341 }
Cheroukee 17:8abdbfa6019c 342 case read_frame_specific:
Cheroukee 24:29ec42daa82e 343 {
Cheroukee 17:8abdbfa6019c 344 out_frame->buffer[curr_length++] = current;
Cheroukee 17:8abdbfa6019c 345 checksum -= current;
Cheroukee 17:8abdbfa6019c 346 if (curr_length >= out_frame->length)
Cheroukee 17:8abdbfa6019c 347 {
Cheroukee 17:8abdbfa6019c 348 recv_state = read_checksum;
Cheroukee 17:8abdbfa6019c 349 }
Cheroukee 17:8abdbfa6019c 350 break;
Cheroukee 17:8abdbfa6019c 351 }
Cheroukee 17:8abdbfa6019c 352 case read_checksum:
Cheroukee 17:8abdbfa6019c 353 {
Cheroukee 17:8abdbfa6019c 354 // pc.printf(":: read_checksum x%x", current);
Cheroukee 17:8abdbfa6019c 355 recv_state = wait_delimiter;
Cheroukee 17:8abdbfa6019c 356 if (checksum == current)
Cheroukee 17:8abdbfa6019c 357 {
Cheroukee 17:8abdbfa6019c 358 finished_frame = true;
Cheroukee 17:8abdbfa6019c 359 }
Cheroukee 17:8abdbfa6019c 360 break;
Cheroukee 17:8abdbfa6019c 361 }
Cheroukee 21:04fae6a95131 362 }
Cheroukee 8:5955af1ee445 363 }
Cheroukee 21:04fae6a95131 364 return finished_frame;
Cheroukee 5:9e6a09a38785 365 }