Code APP3
Dependencies: mbed EthernetInterface WebSocketClient mbed-rtos BufferedSerial
Fork of APP3_Lab by
xbee.cpp@14:cd488eba8bba, 2017-10-01 (annotated)
- Committer:
- Cheroukee
- Date:
- Sun Oct 01 18:53:18 2017 +0000
- Revision:
- 14:cd488eba8bba
- Parent:
- 12:1286b80c68f7
- Child:
- 15:c4d17caf0709
Added pan ID lecture
Who changed what in which revision?
User | Revision | Line number | New 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 | 14:cd488eba8bba | 258 | //Serial pc(USBTX, USBRX); // tx, rx |
Cheroukee | 12:1286b80c68f7 | 259 | for (int i = 0; i < packet_length + 4; i++) |
Cheroukee | 2:a9bb12eefc08 | 260 | { |
Cheroukee | 14:cd488eba8bba | 261 | //pc.printf(" 0x%x", TransmitBuffer[i]); |
Cheroukee | 2:a9bb12eefc08 | 262 | xbee.putc(TransmitBuffer[i]); |
Cheroukee | 2:a9bb12eefc08 | 263 | } |
Cheroukee | 5:9e6a09a38785 | 264 | xbee_transmit_led = !xbee_transmit_led; |
Cheroukee | 5:9e6a09a38785 | 265 | } |
Cheroukee | 5:9e6a09a38785 | 266 | |
Cheroukee | 8:5955af1ee445 | 267 | bool receive(frame_t* out_frame, int max_length) |
Cheroukee | 5:9e6a09a38785 | 268 | { |
Cheroukee | 8:5955af1ee445 | 269 | static int curr_length = 0; |
Cheroukee | 8:5955af1ee445 | 270 | |
Cheroukee | 8:5955af1ee445 | 271 | static frame_recv_state_t recv_state = wait_delimiter; |
Cheroukee | 11:ecf5776b950a | 272 | frame_t* frame = out_frame; |
Cheroukee | 8:5955af1ee445 | 273 | static char checksum = 0xFF; |
Cheroukee | 8:5955af1ee445 | 274 | |
Cheroukee | 8:5955af1ee445 | 275 | bool finished_frame = false; |
Cheroukee | 8:5955af1ee445 | 276 | |
Cheroukee | 11:ecf5776b950a | 277 | xbee_receive_led = !xbee_receive_led; |
Cheroukee | 8:5955af1ee445 | 278 | while(xbee.readable() && curr_length < max_length && !finished_frame) |
Cheroukee | 5:9e6a09a38785 | 279 | { |
Cheroukee | 11:ecf5776b950a | 280 | char current = xbee.getc(); |
Cheroukee | 8:5955af1ee445 | 281 | switch(recv_state) |
Cheroukee | 8:5955af1ee445 | 282 | { |
Cheroukee | 8:5955af1ee445 | 283 | case wait_delimiter: |
Cheroukee | 8:5955af1ee445 | 284 | { |
Cheroukee | 11:ecf5776b950a | 285 | if (current == ZIGBEE_DELIMITER) |
Cheroukee | 8:5955af1ee445 | 286 | { |
Cheroukee | 11:ecf5776b950a | 287 | curr_length = 0; |
Cheroukee | 8:5955af1ee445 | 288 | recv_state = read_length_msb; |
Cheroukee | 11:ecf5776b950a | 289 | frame->length = 0; |
Cheroukee | 8:5955af1ee445 | 290 | } |
Cheroukee | 8:5955af1ee445 | 291 | break; |
Cheroukee | 8:5955af1ee445 | 292 | } |
Cheroukee | 8:5955af1ee445 | 293 | case read_length_msb: |
Cheroukee | 8:5955af1ee445 | 294 | { |
Cheroukee | 11:ecf5776b950a | 295 | frame->length = (current << 8); |
Cheroukee | 8:5955af1ee445 | 296 | recv_state = read_length_lsb; |
Cheroukee | 8:5955af1ee445 | 297 | break; |
Cheroukee | 8:5955af1ee445 | 298 | } |
Cheroukee | 8:5955af1ee445 | 299 | case read_length_lsb: |
Cheroukee | 11:ecf5776b950a | 300 | { |
Cheroukee | 11:ecf5776b950a | 301 | frame->length |= current; |
Cheroukee | 8:5955af1ee445 | 302 | checksum = 0xFF; |
Cheroukee | 8:5955af1ee445 | 303 | recv_state = read_frame_specific; |
Cheroukee | 8:5955af1ee445 | 304 | break; |
Cheroukee | 8:5955af1ee445 | 305 | } |
Cheroukee | 8:5955af1ee445 | 306 | case read_frame_specific: |
Cheroukee | 8:5955af1ee445 | 307 | { |
Cheroukee | 11:ecf5776b950a | 308 | frame->buffer[curr_length++] = current; |
Cheroukee | 11:ecf5776b950a | 309 | checksum -= current; |
Cheroukee | 11:ecf5776b950a | 310 | if (curr_length >= frame->length) |
Cheroukee | 8:5955af1ee445 | 311 | { |
Cheroukee | 8:5955af1ee445 | 312 | recv_state = read_checksum; |
Cheroukee | 8:5955af1ee445 | 313 | } |
Cheroukee | 8:5955af1ee445 | 314 | break; |
Cheroukee | 8:5955af1ee445 | 315 | } |
Cheroukee | 8:5955af1ee445 | 316 | case read_checksum: |
Cheroukee | 8:5955af1ee445 | 317 | { |
Cheroukee | 8:5955af1ee445 | 318 | recv_state = wait_delimiter; |
Cheroukee | 11:ecf5776b950a | 319 | if (checksum == current) |
Cheroukee | 8:5955af1ee445 | 320 | { |
Cheroukee | 8:5955af1ee445 | 321 | finished_frame = true; |
Cheroukee | 8:5955af1ee445 | 322 | } |
Cheroukee | 8:5955af1ee445 | 323 | break; |
Cheroukee | 8:5955af1ee445 | 324 | } |
Cheroukee | 8:5955af1ee445 | 325 | } |
Cheroukee | 8:5955af1ee445 | 326 | } |
Cheroukee | 8:5955af1ee445 | 327 | |
Cheroukee | 8:5955af1ee445 | 328 | return finished_frame; |
Cheroukee | 5:9e6a09a38785 | 329 | } |
Cheroukee | 8:5955af1ee445 | 330 | |
Cheroukee | 8:5955af1ee445 | 331 | /** |
Cheroukee | 8:5955af1ee445 | 332 | * |
Cheroukee | 8:5955af1ee445 | 333 | * // Calculate checksum |
Cheroukee | 8:5955af1ee445 | 334 | char checksum = 0xFF; |
Cheroukee | 8:5955af1ee445 | 335 | for (int i = 3; i < FRAME_CHEKSUM_POS; i++) |
Cheroukee | 8:5955af1ee445 | 336 | { |
Cheroukee | 8:5955af1ee445 | 337 | checksum -= TransmitBuffer[i]; |
Cheroukee | 8:5955af1ee445 | 338 | } |
Cheroukee | 8:5955af1ee445 | 339 | |
Cheroukee | 8:5955af1ee445 | 340 | // Insert checksum into buffer |
Cheroukee | 8:5955af1ee445 | 341 | TransmitBuffer[FRAME_CHEKSUM_POS] = checksum;*/ |