Code APP3

Dependencies:   mbed EthernetInterface WebSocketClient mbed-rtos BufferedSerial

Fork of APP3_Lab by Jean-Philippe Fournier

Committer:
Cheroukee
Date:
Sun Oct 01 20:01:37 2017 +0000
Revision:
15:c4d17caf0709
Parent:
14:cd488eba8bba
Child:
17:8abdbfa6019c
Working reception + new analusis of packets;

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