Code APP3

Dependencies:   mbed EthernetInterface WebSocketClient mbed-rtos BufferedSerial

Fork of APP3_Lab by Jean-Philippe Fournier

Committer:
Cheroukee
Date:
Mon Oct 02 16:54:00 2017 +0000
Revision:
21:04fae6a95131
Parent:
17:8abdbfa6019c
Child:
23:c3f25b511448
Working sensor specific formatting

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 */
Cheroukee 1:ea1b52d0a8a3 39 void xbee_init()
Cheroukee 1:ea1b52d0a8a3 40 {
Cheroukee 17:8abdbfa6019c 41 // Setup a serial interrupt function to receive data
Cheroukee 2:a9bb12eefc08 42 xbee_receive_led = 0;
Cheroukee 17:8abdbfa6019c 43 //xbee.attach(&Rx_interrupt, Serial::RxIrq);
Cheroukee 17:8abdbfa6019c 44
Cheroukee 17:8abdbfa6019c 45 xbee_reset = 0;
Cheroukee 1:ea1b52d0a8a3 46
Cheroukee 1:ea1b52d0a8a3 47 wait_ms(400);
Cheroukee 1:ea1b52d0a8a3 48
Cheroukee 1:ea1b52d0a8a3 49 xbee_reset = 1;
Cheroukee 1:ea1b52d0a8a3 50
Cheroukee 1:ea1b52d0a8a3 51 wait_ms(5000);
Cheroukee 1:ea1b52d0a8a3 52 }
Cheroukee 1:ea1b52d0a8a3 53
Cheroukee 2:a9bb12eefc08 54 void build_api_frame_header(int frame_data_size)
Cheroukee 2:a9bb12eefc08 55 {
Cheroukee 2:a9bb12eefc08 56 // Delimiter
Cheroukee 2:a9bb12eefc08 57 TransmitBuffer[FRAME_DELIMITER_POS] = ZIGBEE_DELIMITER;
Cheroukee 2:a9bb12eefc08 58 TransmitBuffer[FRAME_LEN_MSB_POS] = frame_data_size >> 8;
Cheroukee 2:a9bb12eefc08 59 TransmitBuffer[FRAME_LEN_LSB_POS] = frame_data_size & 0xFF;
Cheroukee 2:a9bb12eefc08 60 }
Cheroukee 2:a9bb12eefc08 61
Cheroukee 2:a9bb12eefc08 62 void build_api_frame_checksum(int frame_data_size)
Cheroukee 2:a9bb12eefc08 63 {
Cheroukee 1:ea1b52d0a8a3 64 // Calculate checksum
Cheroukee 2:a9bb12eefc08 65 char checksum = 0xFF;
Cheroukee 2:a9bb12eefc08 66 for (int i = 3; i < FRAME_CHEKSUM_POS; i++)
Cheroukee 1:ea1b52d0a8a3 67 {
Cheroukee 1:ea1b52d0a8a3 68 checksum -= TransmitBuffer[i];
Cheroukee 1:ea1b52d0a8a3 69 }
Cheroukee 1:ea1b52d0a8a3 70
Cheroukee 1:ea1b52d0a8a3 71 // Insert checksum into buffer
Cheroukee 2:a9bb12eefc08 72 TransmitBuffer[FRAME_CHEKSUM_POS] = checksum;
Cheroukee 2:a9bb12eefc08 73 }
Cheroukee 2:a9bb12eefc08 74
Cheroukee 2:a9bb12eefc08 75 void set_api_frame_type(frame_type_t frame_type)
Cheroukee 2:a9bb12eefc08 76 {
Cheroukee 2:a9bb12eefc08 77 TransmitBuffer[API_FRAME_TYPE_POS] = frame_type;
Cheroukee 2:a9bb12eefc08 78 }
Cheroukee 2:a9bb12eefc08 79
Cheroukee 2:a9bb12eefc08 80 void set_api_frame_id(int id)
Cheroukee 2:a9bb12eefc08 81 {
Cheroukee 2:a9bb12eefc08 82 TransmitBuffer[API_FRAME_ID_POS] = id;
Cheroukee 2:a9bb12eefc08 83 }
Cheroukee 2:a9bb12eefc08 84
Cheroukee 2:a9bb12eefc08 85 void set_at_command(int at_command)
Cheroukee 2:a9bb12eefc08 86 {
Cheroukee 2:a9bb12eefc08 87 // NOT IMPLEMENTED
Cheroukee 2:a9bb12eefc08 88 }
Cheroukee 2:a9bb12eefc08 89
Cheroukee 2:a9bb12eefc08 90 void set_64_addr(zigbee_addr_64_t address)
Cheroukee 2:a9bb12eefc08 91 {
Cheroukee 2:a9bb12eefc08 92 int i = 0;
Cheroukee 2:a9bb12eefc08 93 TransmitBuffer[TRANSMIT_REQ_ADDR64_MSB_POS + i++] = address.addr_0;
Cheroukee 2:a9bb12eefc08 94 TransmitBuffer[TRANSMIT_REQ_ADDR64_MSB_POS + i++] = address.addr_1;
Cheroukee 2:a9bb12eefc08 95 TransmitBuffer[TRANSMIT_REQ_ADDR64_MSB_POS + i++] = address.addr_2;
Cheroukee 2:a9bb12eefc08 96 TransmitBuffer[TRANSMIT_REQ_ADDR64_MSB_POS + i++] = address.addr_3;
Cheroukee 2:a9bb12eefc08 97
Cheroukee 2:a9bb12eefc08 98 TransmitBuffer[TRANSMIT_REQ_ADDR64_MSB_POS + i++] = address.addr_4;
Cheroukee 2:a9bb12eefc08 99 TransmitBuffer[TRANSMIT_REQ_ADDR64_MSB_POS + i++] = address.addr_5;
Cheroukee 2:a9bb12eefc08 100 TransmitBuffer[TRANSMIT_REQ_ADDR64_MSB_POS + i++] = address.addr_6;
Cheroukee 2:a9bb12eefc08 101 TransmitBuffer[TRANSMIT_REQ_ADDR64_MSB_POS + i++] = address.addr_7;
Cheroukee 2:a9bb12eefc08 102 }
Cheroukee 2:a9bb12eefc08 103
Cheroukee 2:a9bb12eefc08 104 void set_16_addr(zigbee_addr_16_t address)
Cheroukee 2:a9bb12eefc08 105 {
Cheroukee 2:a9bb12eefc08 106 TransmitBuffer[TRANSMIT_REQ_ADDR16_MSB_POS] = address.addr_msb;
Cheroukee 2:a9bb12eefc08 107 TransmitBuffer[TRANSMIT_REQ_ADDR16_MSB_POS + 1] = address.addr_lsb;
Cheroukee 2:a9bb12eefc08 108 }
Cheroukee 2:a9bb12eefc08 109
Cheroukee 2:a9bb12eefc08 110 void set_broadcast_radius(int position, char radius)
Cheroukee 2:a9bb12eefc08 111 {
Cheroukee 2:a9bb12eefc08 112 TransmitBuffer[position] = radius;
Cheroukee 2:a9bb12eefc08 113 }
Cheroukee 2:a9bb12eefc08 114
Cheroukee 2:a9bb12eefc08 115 void set_transmit_request_options(int position, char options)
Cheroukee 2:a9bb12eefc08 116 {
Cheroukee 2:a9bb12eefc08 117 TransmitBuffer[position] = options;
Cheroukee 2:a9bb12eefc08 118 }
Cheroukee 2:a9bb12eefc08 119
Cheroukee 12:1286b80c68f7 120 void set_transmit_data(int start_pos, char* data, int data_length)
Cheroukee 2:a9bb12eefc08 121 {
Cheroukee 2:a9bb12eefc08 122 for (int i = 0; i < data_length; i++)
Cheroukee 1:ea1b52d0a8a3 123 {
Cheroukee 12:1286b80c68f7 124 TransmitBuffer[start_pos + i] = data[i];
Cheroukee 1:ea1b52d0a8a3 125 }
Cheroukee 2:a9bb12eefc08 126 }
Cheroukee 2:a9bb12eefc08 127
Cheroukee 2:a9bb12eefc08 128 bool transmit_request_64(char* buffer, int data_length, char options, zigbee_addr_64_t destination)
Cheroukee 2:a9bb12eefc08 129 {
Cheroukee 2:a9bb12eefc08 130 build_api_frame_header(data_length + TRANSMIT_REQ_OVERHEAD_LENGTH);
Cheroukee 2:a9bb12eefc08 131
Cheroukee 2:a9bb12eefc08 132 set_api_frame_type(TransmitRequest);
Cheroukee 2:a9bb12eefc08 133 set_api_frame_id(0x01);
Cheroukee 2:a9bb12eefc08 134
Cheroukee 2:a9bb12eefc08 135 set_64_addr(destination);
Cheroukee 2:a9bb12eefc08 136 DECLARE_ADDR16_UNKNOWN_OR_BCAST
Cheroukee 2:a9bb12eefc08 137 set_16_addr(USE_ADDR16_UNKNOWN_OR_BCAST);
Cheroukee 2:a9bb12eefc08 138
Cheroukee 2:a9bb12eefc08 139 set_broadcast_radius(15, 0);
Cheroukee 2:a9bb12eefc08 140 set_transmit_request_options(15, 0);
Cheroukee 2:a9bb12eefc08 141
Cheroukee 12:1286b80c68f7 142 set_transmit_data(TRANSMIT_REQ_DATA_START, buffer, data_length);
Cheroukee 2:a9bb12eefc08 143
Cheroukee 2:a9bb12eefc08 144 build_api_frame_checksum(data_length + TRANSMIT_REQ_OVERHEAD_LENGTH);
Cheroukee 2:a9bb12eefc08 145
Cheroukee 2:a9bb12eefc08 146 transmit(data_length);
Cheroukee 1:ea1b52d0a8a3 147
Cheroukee 1:ea1b52d0a8a3 148 return false;
Cheroukee 1:ea1b52d0a8a3 149 }
Cheroukee 1:ea1b52d0a8a3 150
Cheroukee 2:a9bb12eefc08 151 bool transmit_request_16(char* buffer, int data_length, char options, zigbee_addr_16_t destination)
Cheroukee 2:a9bb12eefc08 152 {
Cheroukee 2:a9bb12eefc08 153 build_api_frame_header(data_length + TRANSMIT_REQ_OVERHEAD_LENGTH);
Cheroukee 2:a9bb12eefc08 154
Cheroukee 2:a9bb12eefc08 155 set_api_frame_type(TransmitRequest);
Cheroukee 2:a9bb12eefc08 156 set_api_frame_id(0x01);
Cheroukee 2:a9bb12eefc08 157
Cheroukee 2:a9bb12eefc08 158 DECLARE_ADDR64_BCAST
Cheroukee 2:a9bb12eefc08 159 set_64_addr(USE_ADDR64_BCAST);
Cheroukee 2:a9bb12eefc08 160 set_16_addr(destination);
Cheroukee 2:a9bb12eefc08 161
Cheroukee 2:a9bb12eefc08 162 set_broadcast_radius(15, 0);
Cheroukee 2:a9bb12eefc08 163 set_transmit_request_options(15, 0);
Cheroukee 2:a9bb12eefc08 164
Cheroukee 12:1286b80c68f7 165 set_transmit_data(TRANSMIT_REQ_DATA_START, buffer, data_length);
Cheroukee 2:a9bb12eefc08 166
Cheroukee 2:a9bb12eefc08 167 build_api_frame_checksum(data_length + TRANSMIT_REQ_OVERHEAD_LENGTH);
Cheroukee 2:a9bb12eefc08 168
Cheroukee 2:a9bb12eefc08 169 transmit(data_length);
Cheroukee 2:a9bb12eefc08 170
Cheroukee 2:a9bb12eefc08 171 return false;
Cheroukee 2:a9bb12eefc08 172 }
Cheroukee 2:a9bb12eefc08 173
Cheroukee 2:a9bb12eefc08 174 bool transmit_request(char* buffer, int data_length, char options, zigbee_addr_64_t destination64, zigbee_addr_16_t destination16)
Cheroukee 1:ea1b52d0a8a3 175 {
Cheroukee 2:a9bb12eefc08 176 build_api_frame_header(data_length + TRANSMIT_REQ_OVERHEAD_LENGTH);
Cheroukee 2:a9bb12eefc08 177
Cheroukee 2:a9bb12eefc08 178 set_api_frame_type(TransmitRequest);
Cheroukee 2:a9bb12eefc08 179 set_api_frame_id(0x01);
Cheroukee 2:a9bb12eefc08 180
Cheroukee 2:a9bb12eefc08 181 set_64_addr(destination64);
Cheroukee 2:a9bb12eefc08 182 set_16_addr(destination16);
Cheroukee 2:a9bb12eefc08 183
Cheroukee 2:a9bb12eefc08 184 set_broadcast_radius(15, 0);
Cheroukee 2:a9bb12eefc08 185 set_transmit_request_options(15, 0);
Cheroukee 2:a9bb12eefc08 186
Cheroukee 12:1286b80c68f7 187 set_transmit_data(TRANSMIT_REQ_DATA_START, buffer, data_length);
Cheroukee 2:a9bb12eefc08 188
Cheroukee 2:a9bb12eefc08 189 build_api_frame_checksum(data_length + TRANSMIT_REQ_OVERHEAD_LENGTH);
Cheroukee 2:a9bb12eefc08 190
Cheroukee 12:1286b80c68f7 191 transmit(data_length + TRANSMIT_REQ_OVERHEAD_LENGTH);
Cheroukee 2:a9bb12eefc08 192
Cheroukee 2:a9bb12eefc08 193 return false;
Cheroukee 2:a9bb12eefc08 194 }
Cheroukee 2:a9bb12eefc08 195
Cheroukee 12:1286b80c68f7 196 void remote_at_command_query(char msb, char lsb, char options)
Cheroukee 12:1286b80c68f7 197 {
Cheroukee 12:1286b80c68f7 198 char remote_command[2] = {msb, lsb};
Cheroukee 12:1286b80c68f7 199
Cheroukee 12:1286b80c68f7 200 build_api_frame_header(2 + REMOTE_AT_OVERHEAD_LENGTH);
Cheroukee 12:1286b80c68f7 201
Cheroukee 12:1286b80c68f7 202 set_api_frame_type(RemoteCommandRequest);
Cheroukee 12:1286b80c68f7 203 set_api_frame_id(0x01);
Cheroukee 12:1286b80c68f7 204
Cheroukee 12:1286b80c68f7 205 DECLARE_ADDR16_UNKNOWN_OR_BCAST
Cheroukee 12:1286b80c68f7 206 DECLARE_ADDR64_BCAST
Cheroukee 12:1286b80c68f7 207
Cheroukee 12:1286b80c68f7 208 set_64_addr(USE_ADDR64_BCAST);
Cheroukee 12:1286b80c68f7 209 set_16_addr(USE_ADDR16_UNKNOWN_OR_BCAST);
Cheroukee 12:1286b80c68f7 210
Cheroukee 12:1286b80c68f7 211 // Set as apply
Cheroukee 12:1286b80c68f7 212 set_transmit_request_options(15, options);
Cheroukee 12:1286b80c68f7 213
Cheroukee 12:1286b80c68f7 214 set_transmit_data(16, remote_command, 2);
Cheroukee 12:1286b80c68f7 215
Cheroukee 12:1286b80c68f7 216 build_api_frame_checksum(2 + REMOTE_AT_OVERHEAD_LENGTH);
Cheroukee 12:1286b80c68f7 217
Cheroukee 12:1286b80c68f7 218 transmit(2 + REMOTE_AT_OVERHEAD_LENGTH);
Cheroukee 12:1286b80c68f7 219 }
Cheroukee 12:1286b80c68f7 220
Cheroukee 12:1286b80c68f7 221 void remote_at_command_set(char msb, char lsb, char parameter, char options)
Cheroukee 12:1286b80c68f7 222 {
Cheroukee 12:1286b80c68f7 223 char remote_command[3] = {msb, lsb, parameter};
Cheroukee 12:1286b80c68f7 224
Cheroukee 12:1286b80c68f7 225 build_api_frame_header(3 + REMOTE_AT_OVERHEAD_LENGTH);
Cheroukee 12:1286b80c68f7 226
Cheroukee 12:1286b80c68f7 227 set_api_frame_type(RemoteCommandRequest);
Cheroukee 12:1286b80c68f7 228 set_api_frame_id(0x01);
Cheroukee 12:1286b80c68f7 229
Cheroukee 12:1286b80c68f7 230 DECLARE_ADDR16_UNKNOWN_OR_BCAST
Cheroukee 12:1286b80c68f7 231 DECLARE_ADDR64_BCAST
Cheroukee 12:1286b80c68f7 232
Cheroukee 12:1286b80c68f7 233 set_64_addr(USE_ADDR64_BCAST);
Cheroukee 12:1286b80c68f7 234 set_16_addr(USE_ADDR16_UNKNOWN_OR_BCAST);
Cheroukee 12:1286b80c68f7 235
Cheroukee 12:1286b80c68f7 236 // Set as apply
Cheroukee 12:1286b80c68f7 237 set_transmit_request_options(15, options);
Cheroukee 12:1286b80c68f7 238
Cheroukee 12:1286b80c68f7 239 set_transmit_data(16, remote_command, 3);
Cheroukee 12:1286b80c68f7 240
Cheroukee 12:1286b80c68f7 241 build_api_frame_checksum(3 + REMOTE_AT_OVERHEAD_LENGTH);
Cheroukee 12:1286b80c68f7 242
Cheroukee 12:1286b80c68f7 243 transmit(3 + REMOTE_AT_OVERHEAD_LENGTH);
Cheroukee 12:1286b80c68f7 244 }
Cheroukee 12:1286b80c68f7 245
Cheroukee 14:cd488eba8bba 246
Cheroukee 14:cd488eba8bba 247 void at_command_query(char msb, char lsb)
Cheroukee 14:cd488eba8bba 248 {
Cheroukee 14:cd488eba8bba 249 char command[2] = {msb, lsb};
Cheroukee 14:cd488eba8bba 250
Cheroukee 14:cd488eba8bba 251 build_api_frame_header(2 + REMOTE_AT_OVERHEAD_LENGTH);
Cheroukee 14:cd488eba8bba 252
Cheroukee 14:cd488eba8bba 253 set_api_frame_type(ATCommand);
Cheroukee 14:cd488eba8bba 254 set_api_frame_id(0x01);
Cheroukee 14:cd488eba8bba 255
Cheroukee 14:cd488eba8bba 256 set_transmit_data(7, command, 2);
Cheroukee 14:cd488eba8bba 257
Cheroukee 14:cd488eba8bba 258 build_api_frame_checksum(2 + REMOTE_AT_OVERHEAD_LENGTH);
Cheroukee 14:cd488eba8bba 259
Cheroukee 14:cd488eba8bba 260 transmit(2 + REMOTE_AT_OVERHEAD_LENGTH);
Cheroukee 14:cd488eba8bba 261 }
Cheroukee 14:cd488eba8bba 262
Cheroukee 14:cd488eba8bba 263 void at_command_set(char msb, char lsb, char* parameter, int parameter_length)
Cheroukee 14:cd488eba8bba 264 {
Cheroukee 14:cd488eba8bba 265 char command[2] = {msb, lsb};
Cheroukee 14:cd488eba8bba 266
Cheroukee 14:cd488eba8bba 267 build_api_frame_header(parameter_length + AT_COMMAND_OVERHEAD_LENGTH);
Cheroukee 14:cd488eba8bba 268
Cheroukee 14:cd488eba8bba 269 set_api_frame_type(ATCommand);
Cheroukee 14:cd488eba8bba 270 set_api_frame_id(0x01);
Cheroukee 14:cd488eba8bba 271
Cheroukee 14:cd488eba8bba 272 set_transmit_data(5, command, 2);
Cheroukee 14:cd488eba8bba 273 set_transmit_data(7, parameter, parameter_length);
Cheroukee 14:cd488eba8bba 274
Cheroukee 14:cd488eba8bba 275 build_api_frame_checksum(parameter_length + AT_COMMAND_OVERHEAD_LENGTH);
Cheroukee 14:cd488eba8bba 276
Cheroukee 14:cd488eba8bba 277 transmit(parameter_length + AT_COMMAND_OVERHEAD_LENGTH);
Cheroukee 14:cd488eba8bba 278 }
Cheroukee 14:cd488eba8bba 279
Cheroukee 2:a9bb12eefc08 280 void transmit(int packet_length)
Cheroukee 2:a9bb12eefc08 281 {
Cheroukee 12:1286b80c68f7 282 for (int i = 0; i < packet_length + 4; i++)
Cheroukee 2:a9bb12eefc08 283 {
Cheroukee 2:a9bb12eefc08 284 xbee.putc(TransmitBuffer[i]);
Cheroukee 2:a9bb12eefc08 285 }
Cheroukee 5:9e6a09a38785 286 xbee_transmit_led = !xbee_transmit_led;
Cheroukee 5:9e6a09a38785 287 }
Cheroukee 5:9e6a09a38785 288
Cheroukee 8:5955af1ee445 289 bool receive(frame_t* out_frame, int max_length)
Cheroukee 5:9e6a09a38785 290 {
Cheroukee 17:8abdbfa6019c 291
Cheroukee 17:8abdbfa6019c 292 //NVIC_DisableIRQ(UART1_IRQn);
Cheroukee 17:8abdbfa6019c 293 /*
Cheroukee 17:8abdbfa6019c 294 static int curr_length = 0;
Cheroukee 17:8abdbfa6019c 295 static frame_recv_state_t recv_state = wait_delimiter;
Cheroukee 17:8abdbfa6019c 296 static char checksum = 0xFF;
Cheroukee 17:8abdbfa6019c 297
Cheroukee 17:8abdbfa6019c 298 bool finished_frame = false;
Cheroukee 17:8abdbfa6019c 299
Cheroukee 17:8abdbfa6019c 300 while(rx_out != rx_in && !finished_frame)
Cheroukee 5:9e6a09a38785 301 {
Cheroukee 17:8abdbfa6019c 302 char current = ReceiveBuffer[rx_out];
Cheroukee 17:8abdbfa6019c 303 switch(recv_state)
Cheroukee 17:8abdbfa6019c 304 {
Cheroukee 17:8abdbfa6019c 305 case wait_delimiter:
Cheroukee 17:8abdbfa6019c 306 {
Cheroukee 17:8abdbfa6019c 307 if (current == ZIGBEE_DELIMITER)
Cheroukee 17:8abdbfa6019c 308 {
Cheroukee 17:8abdbfa6019c 309 curr_length = 0;
Cheroukee 17:8abdbfa6019c 310 recv_state = read_length_msb;
Cheroukee 17:8abdbfa6019c 311 out_frame->length = 0;
Cheroukee 17:8abdbfa6019c 312 }
Cheroukee 17:8abdbfa6019c 313 break;
Cheroukee 17:8abdbfa6019c 314 }
Cheroukee 17:8abdbfa6019c 315 case read_length_msb:
Cheroukee 17:8abdbfa6019c 316 {
Cheroukee 17:8abdbfa6019c 317 out_frame->length = (current << 8);
Cheroukee 17:8abdbfa6019c 318 recv_state = read_length_lsb;
Cheroukee 17:8abdbfa6019c 319 break;
Cheroukee 17:8abdbfa6019c 320 }
Cheroukee 17:8abdbfa6019c 321 case read_length_lsb:
Cheroukee 17:8abdbfa6019c 322 {
Cheroukee 17:8abdbfa6019c 323 out_frame->length |= current;
Cheroukee 17:8abdbfa6019c 324 //pc.printf("\n\rFrame length = %u", out_frame->length);
Cheroukee 17:8abdbfa6019c 325 checksum = 0xFF;
Cheroukee 17:8abdbfa6019c 326 recv_state = read_frame_specific;
Cheroukee 17:8abdbfa6019c 327 break;
Cheroukee 17:8abdbfa6019c 328 }
Cheroukee 17:8abdbfa6019c 329 case read_frame_specific:
Cheroukee 17:8abdbfa6019c 330 {
Cheroukee 17:8abdbfa6019c 331 //pc.printf(":: read_frame_specific x%x", current);
Cheroukee 17:8abdbfa6019c 332 out_frame->buffer[curr_length++] = current;
Cheroukee 17:8abdbfa6019c 333 checksum -= current;
Cheroukee 17:8abdbfa6019c 334 if (curr_length >= out_frame->length)
Cheroukee 17:8abdbfa6019c 335 {
Cheroukee 17:8abdbfa6019c 336 recv_state = read_checksum;
Cheroukee 17:8abdbfa6019c 337 }
Cheroukee 17:8abdbfa6019c 338 break;
Cheroukee 17:8abdbfa6019c 339 }
Cheroukee 17:8abdbfa6019c 340 case read_checksum:
Cheroukee 17:8abdbfa6019c 341 {
Cheroukee 17:8abdbfa6019c 342 // pc.printf(":: read_checksum x%x", current);
Cheroukee 17:8abdbfa6019c 343 recv_state = wait_delimiter;
Cheroukee 17:8abdbfa6019c 344 if (checksum == current)
Cheroukee 17:8abdbfa6019c 345 {
Cheroukee 17:8abdbfa6019c 346 finished_frame = true;
Cheroukee 17:8abdbfa6019c 347 }
Cheroukee 17:8abdbfa6019c 348 break;
Cheroukee 17:8abdbfa6019c 349 }
Cheroukee 17:8abdbfa6019c 350 }
Cheroukee 17:8abdbfa6019c 351 rx_out = (rx_out + 1) % BUFFER_SIZE;
Cheroukee 17:8abdbfa6019c 352 }
Cheroukee 17:8abdbfa6019c 353
Cheroukee 17:8abdbfa6019c 354 NVIC_EnableIRQ(UART1_IRQn);
Cheroukee 17:8abdbfa6019c 355
Cheroukee 17:8abdbfa6019c 356 return finished_frame; */
Cheroukee 21:04fae6a95131 357 static int curr_length = 0;
Cheroukee 21:04fae6a95131 358
Cheroukee 21:04fae6a95131 359 frame_recv_state_t recv_state = wait_delimiter;
Cheroukee 21:04fae6a95131 360 frame_t* frame = out_frame;
Cheroukee 21:04fae6a95131 361 static char checksum = 0xFF;
Cheroukee 21:04fae6a95131 362
Cheroukee 21:04fae6a95131 363 bool finished_frame = false;
Cheroukee 21:04fae6a95131 364
Cheroukee 21:04fae6a95131 365 xbee_receive_led = !xbee_receive_led;
Cheroukee 21:04fae6a95131 366 while(curr_length < max_length && !finished_frame)
Cheroukee 17:8abdbfa6019c 367 {
Cheroukee 21:04fae6a95131 368 char current = xbee.getc();
Cheroukee 21:04fae6a95131 369 switch(recv_state)
Cheroukee 8:5955af1ee445 370 {
Cheroukee 21:04fae6a95131 371 case wait_delimiter:
Cheroukee 8:5955af1ee445 372 {
Cheroukee 21:04fae6a95131 373 //pc.printf(":: delimiter x%x", current);
Cheroukee 21:04fae6a95131 374 if (current == ZIGBEE_DELIMITER)
Cheroukee 8:5955af1ee445 375 {
Cheroukee 21:04fae6a95131 376 curr_length = 0;
Cheroukee 21:04fae6a95131 377 recv_state = read_length_msb;
Cheroukee 21:04fae6a95131 378 frame->length = 0;
Cheroukee 21:04fae6a95131 379 }
Cheroukee 21:04fae6a95131 380 break;
Cheroukee 21:04fae6a95131 381 }
Cheroukee 21:04fae6a95131 382 case read_length_msb:
Cheroukee 21:04fae6a95131 383 {
Cheroukee 21:04fae6a95131 384 frame->length = (current << 8);
Cheroukee 21:04fae6a95131 385 recv_state = read_length_lsb;
Cheroukee 21:04fae6a95131 386 break;
Cheroukee 21:04fae6a95131 387 }
Cheroukee 21:04fae6a95131 388 case read_length_lsb:
Cheroukee 21:04fae6a95131 389 {
Cheroukee 21:04fae6a95131 390 frame->length |= current;
Cheroukee 21:04fae6a95131 391 //pc.printf("\n\rFrame length = %u", frame->length);
Cheroukee 21:04fae6a95131 392 checksum = 0xFF;
Cheroukee 21:04fae6a95131 393 recv_state = read_frame_specific;
Cheroukee 21:04fae6a95131 394 break;
Cheroukee 21:04fae6a95131 395 }
Cheroukee 21:04fae6a95131 396 case read_frame_specific:
Cheroukee 21:04fae6a95131 397 {
Cheroukee 21:04fae6a95131 398 //pc.printf(":: read_frame_specific x%x", current);
Cheroukee 21:04fae6a95131 399 frame->buffer[curr_length++] = current;
Cheroukee 21:04fae6a95131 400 checksum -= current;
Cheroukee 21:04fae6a95131 401 if (curr_length >= frame->length)
Cheroukee 15:c4d17caf0709 402 {
Cheroukee 21:04fae6a95131 403 recv_state = read_checksum;
Cheroukee 15:c4d17caf0709 404 }
Cheroukee 21:04fae6a95131 405 break;
Cheroukee 21:04fae6a95131 406 }
Cheroukee 21:04fae6a95131 407 case read_checksum:
Cheroukee 21:04fae6a95131 408 {
Cheroukee 21:04fae6a95131 409 // pc.printf(":: read_checksum x%x", current);
Cheroukee 21:04fae6a95131 410 recv_state = wait_delimiter;
Cheroukee 21:04fae6a95131 411 if (checksum == current)
Cheroukee 8:5955af1ee445 412 {
Cheroukee 21:04fae6a95131 413 finished_frame = true;
Cheroukee 8:5955af1ee445 414 }
Cheroukee 21:04fae6a95131 415 break;
Cheroukee 21:04fae6a95131 416 }
Cheroukee 21:04fae6a95131 417 }
Cheroukee 8:5955af1ee445 418 }
Cheroukee 21:04fae6a95131 419 return finished_frame;
Cheroukee 5:9e6a09a38785 420 }