Code APP3

Dependencies:   mbed EthernetInterface WebSocketClient mbed-rtos BufferedSerial

Fork of APP3_Lab by Jean-Philippe Fournier

Committer:
JayMcGee
Date:
Mon Oct 02 16:59:26 2017 +0000
Revision:
23:c3f25b511448
Parent:
22:7edae38d0758
Parent:
21:04fae6a95131
Child:
24:29ec42daa82e
Merge array and wever;

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 12:1286b80c68f7 213 void remote_at_command_query(char msb, char lsb, char options)
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 DECLARE_ADDR64_BCAST
Cheroukee 12:1286b80c68f7 224
Cheroukee 12:1286b80c68f7 225 set_64_addr(USE_ADDR64_BCAST);
Cheroukee 12:1286b80c68f7 226 set_16_addr(USE_ADDR16_UNKNOWN_OR_BCAST);
Cheroukee 12:1286b80c68f7 227
Cheroukee 12:1286b80c68f7 228 // Set as apply
Cheroukee 12:1286b80c68f7 229 set_transmit_request_options(15, options);
Cheroukee 12:1286b80c68f7 230
Cheroukee 12:1286b80c68f7 231 set_transmit_data(16, remote_command, 2);
Cheroukee 12:1286b80c68f7 232
Cheroukee 12:1286b80c68f7 233 build_api_frame_checksum(2 + REMOTE_AT_OVERHEAD_LENGTH);
Cheroukee 12:1286b80c68f7 234
Cheroukee 12:1286b80c68f7 235 transmit(2 + REMOTE_AT_OVERHEAD_LENGTH);
Cheroukee 12:1286b80c68f7 236 }
Cheroukee 12:1286b80c68f7 237
Cheroukee 12:1286b80c68f7 238 void remote_at_command_set(char msb, char lsb, char parameter, char options)
Cheroukee 12:1286b80c68f7 239 {
Cheroukee 12:1286b80c68f7 240 char remote_command[3] = {msb, lsb, parameter};
Cheroukee 12:1286b80c68f7 241
Cheroukee 12:1286b80c68f7 242 build_api_frame_header(3 + REMOTE_AT_OVERHEAD_LENGTH);
Cheroukee 12:1286b80c68f7 243
Cheroukee 12:1286b80c68f7 244 set_api_frame_type(RemoteCommandRequest);
Cheroukee 12:1286b80c68f7 245 set_api_frame_id(0x01);
Cheroukee 12:1286b80c68f7 246
Cheroukee 12:1286b80c68f7 247 DECLARE_ADDR16_UNKNOWN_OR_BCAST
Cheroukee 12:1286b80c68f7 248 DECLARE_ADDR64_BCAST
Cheroukee 12:1286b80c68f7 249
Cheroukee 12:1286b80c68f7 250 set_64_addr(USE_ADDR64_BCAST);
Cheroukee 12:1286b80c68f7 251 set_16_addr(USE_ADDR16_UNKNOWN_OR_BCAST);
Cheroukee 12:1286b80c68f7 252
Cheroukee 12:1286b80c68f7 253 // Set as apply
Cheroukee 12:1286b80c68f7 254 set_transmit_request_options(15, options);
Cheroukee 12:1286b80c68f7 255
Cheroukee 12:1286b80c68f7 256 set_transmit_data(16, remote_command, 3);
Cheroukee 12:1286b80c68f7 257
Cheroukee 12:1286b80c68f7 258 build_api_frame_checksum(3 + REMOTE_AT_OVERHEAD_LENGTH);
Cheroukee 12:1286b80c68f7 259
Cheroukee 12:1286b80c68f7 260 transmit(3 + REMOTE_AT_OVERHEAD_LENGTH);
Cheroukee 12:1286b80c68f7 261 }
Cheroukee 12:1286b80c68f7 262
Cheroukee 14:cd488eba8bba 263
Cheroukee 14:cd488eba8bba 264 void at_command_query(char msb, char lsb)
Cheroukee 14:cd488eba8bba 265 {
Cheroukee 14:cd488eba8bba 266 char command[2] = {msb, lsb};
Cheroukee 14:cd488eba8bba 267
Cheroukee 14:cd488eba8bba 268 build_api_frame_header(2 + REMOTE_AT_OVERHEAD_LENGTH);
Cheroukee 14:cd488eba8bba 269
Cheroukee 14:cd488eba8bba 270 set_api_frame_type(ATCommand);
Cheroukee 14:cd488eba8bba 271 set_api_frame_id(0x01);
Cheroukee 14:cd488eba8bba 272
Cheroukee 14:cd488eba8bba 273 set_transmit_data(7, command, 2);
Cheroukee 14:cd488eba8bba 274
Cheroukee 14:cd488eba8bba 275 build_api_frame_checksum(2 + REMOTE_AT_OVERHEAD_LENGTH);
Cheroukee 14:cd488eba8bba 276
Cheroukee 14:cd488eba8bba 277 transmit(2 + REMOTE_AT_OVERHEAD_LENGTH);
Cheroukee 14:cd488eba8bba 278 }
Cheroukee 14:cd488eba8bba 279
Cheroukee 14:cd488eba8bba 280 void at_command_set(char msb, char lsb, char* parameter, int parameter_length)
Cheroukee 14:cd488eba8bba 281 {
Cheroukee 14:cd488eba8bba 282 char command[2] = {msb, lsb};
Cheroukee 14:cd488eba8bba 283
Cheroukee 14:cd488eba8bba 284 build_api_frame_header(parameter_length + AT_COMMAND_OVERHEAD_LENGTH);
Cheroukee 14:cd488eba8bba 285
Cheroukee 14:cd488eba8bba 286 set_api_frame_type(ATCommand);
Cheroukee 14:cd488eba8bba 287 set_api_frame_id(0x01);
Cheroukee 14:cd488eba8bba 288
Cheroukee 14:cd488eba8bba 289 set_transmit_data(5, command, 2);
Cheroukee 14:cd488eba8bba 290 set_transmit_data(7, parameter, parameter_length);
Cheroukee 14:cd488eba8bba 291
Cheroukee 14:cd488eba8bba 292 build_api_frame_checksum(parameter_length + AT_COMMAND_OVERHEAD_LENGTH);
Cheroukee 14:cd488eba8bba 293
Cheroukee 14:cd488eba8bba 294 transmit(parameter_length + AT_COMMAND_OVERHEAD_LENGTH);
Cheroukee 14:cd488eba8bba 295 }
Cheroukee 14:cd488eba8bba 296
Cheroukee 2:a9bb12eefc08 297 void transmit(int packet_length)
Cheroukee 2:a9bb12eefc08 298 {
Cheroukee 12:1286b80c68f7 299 for (int i = 0; i < packet_length + 4; i++)
Cheroukee 2:a9bb12eefc08 300 {
Cheroukee 2:a9bb12eefc08 301 xbee.putc(TransmitBuffer[i]);
Cheroukee 2:a9bb12eefc08 302 }
Cheroukee 5:9e6a09a38785 303 xbee_transmit_led = !xbee_transmit_led;
Cheroukee 5:9e6a09a38785 304 }
Cheroukee 5:9e6a09a38785 305
Cheroukee 8:5955af1ee445 306 bool receive(frame_t* out_frame, int max_length)
Cheroukee 5:9e6a09a38785 307 {
Cheroukee 17:8abdbfa6019c 308
Cheroukee 17:8abdbfa6019c 309 //NVIC_DisableIRQ(UART1_IRQn);
Cheroukee 17:8abdbfa6019c 310 /*
Cheroukee 17:8abdbfa6019c 311 static int curr_length = 0;
Cheroukee 17:8abdbfa6019c 312 static frame_recv_state_t recv_state = wait_delimiter;
Cheroukee 17:8abdbfa6019c 313 static char checksum = 0xFF;
Cheroukee 17:8abdbfa6019c 314
Cheroukee 17:8abdbfa6019c 315 bool finished_frame = false;
Cheroukee 17:8abdbfa6019c 316
Cheroukee 17:8abdbfa6019c 317 while(rx_out != rx_in && !finished_frame)
Cheroukee 5:9e6a09a38785 318 {
Cheroukee 17:8abdbfa6019c 319 char current = ReceiveBuffer[rx_out];
Cheroukee 17:8abdbfa6019c 320 switch(recv_state)
Cheroukee 17:8abdbfa6019c 321 {
Cheroukee 17:8abdbfa6019c 322 case wait_delimiter:
Cheroukee 17:8abdbfa6019c 323 {
Cheroukee 17:8abdbfa6019c 324 if (current == ZIGBEE_DELIMITER)
Cheroukee 17:8abdbfa6019c 325 {
Cheroukee 17:8abdbfa6019c 326 curr_length = 0;
Cheroukee 17:8abdbfa6019c 327 recv_state = read_length_msb;
Cheroukee 17:8abdbfa6019c 328 out_frame->length = 0;
Cheroukee 17:8abdbfa6019c 329 }
Cheroukee 17:8abdbfa6019c 330 break;
Cheroukee 17:8abdbfa6019c 331 }
Cheroukee 17:8abdbfa6019c 332 case read_length_msb:
Cheroukee 17:8abdbfa6019c 333 {
Cheroukee 17:8abdbfa6019c 334 out_frame->length = (current << 8);
Cheroukee 17:8abdbfa6019c 335 recv_state = read_length_lsb;
Cheroukee 17:8abdbfa6019c 336 break;
Cheroukee 17:8abdbfa6019c 337 }
Cheroukee 17:8abdbfa6019c 338 case read_length_lsb:
Cheroukee 17:8abdbfa6019c 339 {
Cheroukee 17:8abdbfa6019c 340 out_frame->length |= current;
Cheroukee 17:8abdbfa6019c 341 //pc.printf("\n\rFrame length = %u", out_frame->length);
Cheroukee 17:8abdbfa6019c 342 checksum = 0xFF;
Cheroukee 17:8abdbfa6019c 343 recv_state = read_frame_specific;
Cheroukee 17:8abdbfa6019c 344 break;
Cheroukee 17:8abdbfa6019c 345 }
Cheroukee 17:8abdbfa6019c 346 case read_frame_specific:
Cheroukee 17:8abdbfa6019c 347 {
Cheroukee 17:8abdbfa6019c 348 //pc.printf(":: read_frame_specific x%x", current);
Cheroukee 17:8abdbfa6019c 349 out_frame->buffer[curr_length++] = current;
Cheroukee 17:8abdbfa6019c 350 checksum -= current;
Cheroukee 17:8abdbfa6019c 351 if (curr_length >= out_frame->length)
Cheroukee 17:8abdbfa6019c 352 {
Cheroukee 17:8abdbfa6019c 353 recv_state = read_checksum;
Cheroukee 17:8abdbfa6019c 354 }
Cheroukee 17:8abdbfa6019c 355 break;
Cheroukee 17:8abdbfa6019c 356 }
Cheroukee 17:8abdbfa6019c 357 case read_checksum:
Cheroukee 17:8abdbfa6019c 358 {
Cheroukee 17:8abdbfa6019c 359 // pc.printf(":: read_checksum x%x", current);
Cheroukee 17:8abdbfa6019c 360 recv_state = wait_delimiter;
Cheroukee 17:8abdbfa6019c 361 if (checksum == current)
Cheroukee 17:8abdbfa6019c 362 {
Cheroukee 17:8abdbfa6019c 363 finished_frame = true;
Cheroukee 17:8abdbfa6019c 364 }
Cheroukee 17:8abdbfa6019c 365 break;
Cheroukee 17:8abdbfa6019c 366 }
Cheroukee 17:8abdbfa6019c 367 }
Cheroukee 17:8abdbfa6019c 368 rx_out = (rx_out + 1) % BUFFER_SIZE;
Cheroukee 17:8abdbfa6019c 369 }
Cheroukee 17:8abdbfa6019c 370
Cheroukee 17:8abdbfa6019c 371 NVIC_EnableIRQ(UART1_IRQn);
Cheroukee 17:8abdbfa6019c 372
Cheroukee 17:8abdbfa6019c 373 return finished_frame; */
Cheroukee 21:04fae6a95131 374 static int curr_length = 0;
Cheroukee 21:04fae6a95131 375
Cheroukee 21:04fae6a95131 376 frame_recv_state_t recv_state = wait_delimiter;
Cheroukee 21:04fae6a95131 377 frame_t* frame = out_frame;
Cheroukee 21:04fae6a95131 378 static char checksum = 0xFF;
Cheroukee 21:04fae6a95131 379
Cheroukee 21:04fae6a95131 380 bool finished_frame = false;
Cheroukee 21:04fae6a95131 381
Cheroukee 21:04fae6a95131 382 xbee_receive_led = !xbee_receive_led;
Cheroukee 21:04fae6a95131 383 while(curr_length < max_length && !finished_frame)
Cheroukee 17:8abdbfa6019c 384 {
Cheroukee 21:04fae6a95131 385 char current = xbee.getc();
Cheroukee 21:04fae6a95131 386 switch(recv_state)
Cheroukee 8:5955af1ee445 387 {
Cheroukee 21:04fae6a95131 388 case wait_delimiter:
Cheroukee 8:5955af1ee445 389 {
Cheroukee 21:04fae6a95131 390 //pc.printf(":: delimiter x%x", current);
Cheroukee 21:04fae6a95131 391 if (current == ZIGBEE_DELIMITER)
Cheroukee 8:5955af1ee445 392 {
Cheroukee 21:04fae6a95131 393 curr_length = 0;
Cheroukee 21:04fae6a95131 394 recv_state = read_length_msb;
Cheroukee 21:04fae6a95131 395 frame->length = 0;
Cheroukee 21:04fae6a95131 396 }
Cheroukee 21:04fae6a95131 397 break;
Cheroukee 21:04fae6a95131 398 }
Cheroukee 21:04fae6a95131 399 case read_length_msb:
Cheroukee 21:04fae6a95131 400 {
Cheroukee 21:04fae6a95131 401 frame->length = (current << 8);
Cheroukee 21:04fae6a95131 402 recv_state = read_length_lsb;
Cheroukee 21:04fae6a95131 403 break;
Cheroukee 21:04fae6a95131 404 }
Cheroukee 21:04fae6a95131 405 case read_length_lsb:
Cheroukee 21:04fae6a95131 406 {
Cheroukee 21:04fae6a95131 407 frame->length |= current;
Cheroukee 21:04fae6a95131 408 //pc.printf("\n\rFrame length = %u", frame->length);
Cheroukee 21:04fae6a95131 409 checksum = 0xFF;
Cheroukee 21:04fae6a95131 410 recv_state = read_frame_specific;
Cheroukee 21:04fae6a95131 411 break;
Cheroukee 21:04fae6a95131 412 }
Cheroukee 21:04fae6a95131 413 case read_frame_specific:
Cheroukee 21:04fae6a95131 414 {
Cheroukee 21:04fae6a95131 415 //pc.printf(":: read_frame_specific x%x", current);
Cheroukee 21:04fae6a95131 416 frame->buffer[curr_length++] = current;
Cheroukee 21:04fae6a95131 417 checksum -= current;
Cheroukee 21:04fae6a95131 418 if (curr_length >= frame->length)
Cheroukee 15:c4d17caf0709 419 {
Cheroukee 21:04fae6a95131 420 recv_state = read_checksum;
Cheroukee 15:c4d17caf0709 421 }
Cheroukee 21:04fae6a95131 422 break;
Cheroukee 21:04fae6a95131 423 }
Cheroukee 21:04fae6a95131 424 case read_checksum:
Cheroukee 21:04fae6a95131 425 {
Cheroukee 21:04fae6a95131 426 // pc.printf(":: read_checksum x%x", current);
Cheroukee 21:04fae6a95131 427 recv_state = wait_delimiter;
Cheroukee 21:04fae6a95131 428 if (checksum == current)
Cheroukee 8:5955af1ee445 429 {
Cheroukee 21:04fae6a95131 430 finished_frame = true;
Cheroukee 8:5955af1ee445 431 }
Cheroukee 21:04fae6a95131 432 break;
Cheroukee 21:04fae6a95131 433 }
Cheroukee 21:04fae6a95131 434 }
Cheroukee 8:5955af1ee445 435 }
Cheroukee 21:04fae6a95131 436 return finished_frame;
Cheroukee 5:9e6a09a38785 437 }