Code APP3
Dependencies: mbed EthernetInterface WebSocketClient mbed-rtos BufferedSerial
Fork of APP3_Lab by
xbee.cpp@11:ecf5776b950a, 2017-09-30 (annotated)
- Committer:
- Cheroukee
- Date:
- Sat Sep 30 21:09:13 2017 +0000
- Revision:
- 11:ecf5776b950a
- Parent:
- 8:5955af1ee445
- Child:
- 12:1286b80c68f7
Added working receive function
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 | 1:ea1b52d0a8a3 | 30 | |
Cheroukee | 1:ea1b52d0a8a3 | 31 | bool set_pan_id(long pan_id) |
Cheroukee | 1:ea1b52d0a8a3 | 32 | { |
Cheroukee | 1:ea1b52d0a8a3 | 33 | return false; |
Cheroukee | 1:ea1b52d0a8a3 | 34 | } |
Cheroukee | 1:ea1b52d0a8a3 | 35 | |
Cheroukee | 1:ea1b52d0a8a3 | 36 | long get_pan_id() |
Cheroukee | 1:ea1b52d0a8a3 | 37 | { |
Cheroukee | 1:ea1b52d0a8a3 | 38 | return 0L; |
Cheroukee | 1:ea1b52d0a8a3 | 39 | } |
Cheroukee | 1:ea1b52d0a8a3 | 40 | |
Cheroukee | 2:a9bb12eefc08 | 41 | |
Cheroukee | 2:a9bb12eefc08 | 42 | void build_api_frame_header(int frame_data_size) |
Cheroukee | 2:a9bb12eefc08 | 43 | { |
Cheroukee | 2:a9bb12eefc08 | 44 | // Delimiter |
Cheroukee | 2:a9bb12eefc08 | 45 | TransmitBuffer[FRAME_DELIMITER_POS] = ZIGBEE_DELIMITER; |
Cheroukee | 2:a9bb12eefc08 | 46 | TransmitBuffer[FRAME_LEN_MSB_POS] = frame_data_size >> 8; |
Cheroukee | 2:a9bb12eefc08 | 47 | TransmitBuffer[FRAME_LEN_LSB_POS] = frame_data_size & 0xFF; |
Cheroukee | 2:a9bb12eefc08 | 48 | } |
Cheroukee | 2:a9bb12eefc08 | 49 | |
Cheroukee | 2:a9bb12eefc08 | 50 | void build_api_frame_checksum(int frame_data_size) |
Cheroukee | 2:a9bb12eefc08 | 51 | { |
Cheroukee | 1:ea1b52d0a8a3 | 52 | // Calculate checksum |
Cheroukee | 2:a9bb12eefc08 | 53 | char checksum = 0xFF; |
Cheroukee | 2:a9bb12eefc08 | 54 | for (int i = 3; i < FRAME_CHEKSUM_POS; i++) |
Cheroukee | 1:ea1b52d0a8a3 | 55 | { |
Cheroukee | 1:ea1b52d0a8a3 | 56 | checksum -= TransmitBuffer[i]; |
Cheroukee | 1:ea1b52d0a8a3 | 57 | } |
Cheroukee | 1:ea1b52d0a8a3 | 58 | |
Cheroukee | 1:ea1b52d0a8a3 | 59 | // Insert checksum into buffer |
Cheroukee | 2:a9bb12eefc08 | 60 | TransmitBuffer[FRAME_CHEKSUM_POS] = checksum; |
Cheroukee | 2:a9bb12eefc08 | 61 | } |
Cheroukee | 2:a9bb12eefc08 | 62 | |
Cheroukee | 2:a9bb12eefc08 | 63 | void set_api_frame_type(frame_type_t frame_type) |
Cheroukee | 2:a9bb12eefc08 | 64 | { |
Cheroukee | 2:a9bb12eefc08 | 65 | TransmitBuffer[API_FRAME_TYPE_POS] = frame_type; |
Cheroukee | 2:a9bb12eefc08 | 66 | } |
Cheroukee | 2:a9bb12eefc08 | 67 | |
Cheroukee | 2:a9bb12eefc08 | 68 | void set_api_frame_id(int id) |
Cheroukee | 2:a9bb12eefc08 | 69 | { |
Cheroukee | 2:a9bb12eefc08 | 70 | TransmitBuffer[API_FRAME_ID_POS] = id; |
Cheroukee | 2:a9bb12eefc08 | 71 | } |
Cheroukee | 2:a9bb12eefc08 | 72 | |
Cheroukee | 2:a9bb12eefc08 | 73 | void set_at_command(int at_command) |
Cheroukee | 2:a9bb12eefc08 | 74 | { |
Cheroukee | 2:a9bb12eefc08 | 75 | // NOT IMPLEMENTED |
Cheroukee | 2:a9bb12eefc08 | 76 | } |
Cheroukee | 2:a9bb12eefc08 | 77 | |
Cheroukee | 2:a9bb12eefc08 | 78 | void set_64_addr(zigbee_addr_64_t address) |
Cheroukee | 2:a9bb12eefc08 | 79 | { |
Cheroukee | 2:a9bb12eefc08 | 80 | int i = 0; |
Cheroukee | 2:a9bb12eefc08 | 81 | TransmitBuffer[TRANSMIT_REQ_ADDR64_MSB_POS + i++] = address.addr_0; |
Cheroukee | 2:a9bb12eefc08 | 82 | TransmitBuffer[TRANSMIT_REQ_ADDR64_MSB_POS + i++] = address.addr_1; |
Cheroukee | 2:a9bb12eefc08 | 83 | TransmitBuffer[TRANSMIT_REQ_ADDR64_MSB_POS + i++] = address.addr_2; |
Cheroukee | 2:a9bb12eefc08 | 84 | TransmitBuffer[TRANSMIT_REQ_ADDR64_MSB_POS + i++] = address.addr_3; |
Cheroukee | 2:a9bb12eefc08 | 85 | |
Cheroukee | 2:a9bb12eefc08 | 86 | TransmitBuffer[TRANSMIT_REQ_ADDR64_MSB_POS + i++] = address.addr_4; |
Cheroukee | 2:a9bb12eefc08 | 87 | TransmitBuffer[TRANSMIT_REQ_ADDR64_MSB_POS + i++] = address.addr_5; |
Cheroukee | 2:a9bb12eefc08 | 88 | TransmitBuffer[TRANSMIT_REQ_ADDR64_MSB_POS + i++] = address.addr_6; |
Cheroukee | 2:a9bb12eefc08 | 89 | TransmitBuffer[TRANSMIT_REQ_ADDR64_MSB_POS + i++] = address.addr_7; |
Cheroukee | 2:a9bb12eefc08 | 90 | } |
Cheroukee | 2:a9bb12eefc08 | 91 | |
Cheroukee | 2:a9bb12eefc08 | 92 | void set_16_addr(zigbee_addr_16_t address) |
Cheroukee | 2:a9bb12eefc08 | 93 | { |
Cheroukee | 2:a9bb12eefc08 | 94 | TransmitBuffer[TRANSMIT_REQ_ADDR16_MSB_POS] = address.addr_msb; |
Cheroukee | 2:a9bb12eefc08 | 95 | TransmitBuffer[TRANSMIT_REQ_ADDR16_MSB_POS + 1] = address.addr_lsb; |
Cheroukee | 2:a9bb12eefc08 | 96 | } |
Cheroukee | 2:a9bb12eefc08 | 97 | |
Cheroukee | 2:a9bb12eefc08 | 98 | void set_broadcast_radius(int position, char radius) |
Cheroukee | 2:a9bb12eefc08 | 99 | { |
Cheroukee | 2:a9bb12eefc08 | 100 | TransmitBuffer[position] = radius; |
Cheroukee | 2:a9bb12eefc08 | 101 | } |
Cheroukee | 2:a9bb12eefc08 | 102 | |
Cheroukee | 2:a9bb12eefc08 | 103 | void set_transmit_request_options(int position, char options) |
Cheroukee | 2:a9bb12eefc08 | 104 | { |
Cheroukee | 2:a9bb12eefc08 | 105 | TransmitBuffer[position] = options; |
Cheroukee | 2:a9bb12eefc08 | 106 | } |
Cheroukee | 2:a9bb12eefc08 | 107 | |
Cheroukee | 2:a9bb12eefc08 | 108 | void set_transmit_request_data(char* data, int data_length) |
Cheroukee | 2:a9bb12eefc08 | 109 | { |
Cheroukee | 2:a9bb12eefc08 | 110 | for (int i = 0; i < data_length; i++) |
Cheroukee | 1:ea1b52d0a8a3 | 111 | { |
Cheroukee | 2:a9bb12eefc08 | 112 | TransmitBuffer[TRANSMIT_REQ_DATA_START + i] = data[i]; |
Cheroukee | 1:ea1b52d0a8a3 | 113 | } |
Cheroukee | 2:a9bb12eefc08 | 114 | } |
Cheroukee | 2:a9bb12eefc08 | 115 | |
Cheroukee | 2:a9bb12eefc08 | 116 | bool transmit_request_64(char* buffer, int data_length, char options, zigbee_addr_64_t destination) |
Cheroukee | 2:a9bb12eefc08 | 117 | { |
Cheroukee | 2:a9bb12eefc08 | 118 | build_api_frame_header(data_length + TRANSMIT_REQ_OVERHEAD_LENGTH); |
Cheroukee | 2:a9bb12eefc08 | 119 | |
Cheroukee | 2:a9bb12eefc08 | 120 | set_api_frame_type(TransmitRequest); |
Cheroukee | 2:a9bb12eefc08 | 121 | set_api_frame_id(0x01); |
Cheroukee | 2:a9bb12eefc08 | 122 | |
Cheroukee | 2:a9bb12eefc08 | 123 | set_64_addr(destination); |
Cheroukee | 2:a9bb12eefc08 | 124 | DECLARE_ADDR16_UNKNOWN_OR_BCAST |
Cheroukee | 2:a9bb12eefc08 | 125 | set_16_addr(USE_ADDR16_UNKNOWN_OR_BCAST); |
Cheroukee | 2:a9bb12eefc08 | 126 | |
Cheroukee | 2:a9bb12eefc08 | 127 | set_broadcast_radius(15, 0); |
Cheroukee | 2:a9bb12eefc08 | 128 | set_transmit_request_options(15, 0); |
Cheroukee | 2:a9bb12eefc08 | 129 | |
Cheroukee | 2:a9bb12eefc08 | 130 | set_transmit_request_data(buffer, data_length); |
Cheroukee | 2:a9bb12eefc08 | 131 | |
Cheroukee | 2:a9bb12eefc08 | 132 | build_api_frame_checksum(data_length + TRANSMIT_REQ_OVERHEAD_LENGTH); |
Cheroukee | 2:a9bb12eefc08 | 133 | |
Cheroukee | 2:a9bb12eefc08 | 134 | transmit(data_length); |
Cheroukee | 1:ea1b52d0a8a3 | 135 | |
Cheroukee | 1:ea1b52d0a8a3 | 136 | return false; |
Cheroukee | 1:ea1b52d0a8a3 | 137 | } |
Cheroukee | 1:ea1b52d0a8a3 | 138 | |
Cheroukee | 2:a9bb12eefc08 | 139 | bool transmit_request_16(char* buffer, int data_length, char options, zigbee_addr_16_t destination) |
Cheroukee | 2:a9bb12eefc08 | 140 | { |
Cheroukee | 2:a9bb12eefc08 | 141 | build_api_frame_header(data_length + TRANSMIT_REQ_OVERHEAD_LENGTH); |
Cheroukee | 2:a9bb12eefc08 | 142 | |
Cheroukee | 2:a9bb12eefc08 | 143 | set_api_frame_type(TransmitRequest); |
Cheroukee | 2:a9bb12eefc08 | 144 | set_api_frame_id(0x01); |
Cheroukee | 2:a9bb12eefc08 | 145 | |
Cheroukee | 2:a9bb12eefc08 | 146 | DECLARE_ADDR64_BCAST |
Cheroukee | 2:a9bb12eefc08 | 147 | set_64_addr(USE_ADDR64_BCAST); |
Cheroukee | 2:a9bb12eefc08 | 148 | set_16_addr(destination); |
Cheroukee | 2:a9bb12eefc08 | 149 | |
Cheroukee | 2:a9bb12eefc08 | 150 | set_broadcast_radius(15, 0); |
Cheroukee | 2:a9bb12eefc08 | 151 | set_transmit_request_options(15, 0); |
Cheroukee | 2:a9bb12eefc08 | 152 | |
Cheroukee | 2:a9bb12eefc08 | 153 | set_transmit_request_data(buffer, data_length); |
Cheroukee | 2:a9bb12eefc08 | 154 | |
Cheroukee | 2:a9bb12eefc08 | 155 | build_api_frame_checksum(data_length + TRANSMIT_REQ_OVERHEAD_LENGTH); |
Cheroukee | 2:a9bb12eefc08 | 156 | |
Cheroukee | 2:a9bb12eefc08 | 157 | transmit(data_length); |
Cheroukee | 2:a9bb12eefc08 | 158 | |
Cheroukee | 2:a9bb12eefc08 | 159 | return false; |
Cheroukee | 2:a9bb12eefc08 | 160 | } |
Cheroukee | 2:a9bb12eefc08 | 161 | |
Cheroukee | 2:a9bb12eefc08 | 162 | bool transmit_request(char* buffer, int data_length, char options, zigbee_addr_64_t destination64, zigbee_addr_16_t destination16) |
Cheroukee | 1:ea1b52d0a8a3 | 163 | { |
Cheroukee | 2:a9bb12eefc08 | 164 | build_api_frame_header(data_length + TRANSMIT_REQ_OVERHEAD_LENGTH); |
Cheroukee | 2:a9bb12eefc08 | 165 | |
Cheroukee | 2:a9bb12eefc08 | 166 | set_api_frame_type(TransmitRequest); |
Cheroukee | 2:a9bb12eefc08 | 167 | set_api_frame_id(0x01); |
Cheroukee | 2:a9bb12eefc08 | 168 | |
Cheroukee | 2:a9bb12eefc08 | 169 | set_64_addr(destination64); |
Cheroukee | 2:a9bb12eefc08 | 170 | set_16_addr(destination16); |
Cheroukee | 2:a9bb12eefc08 | 171 | |
Cheroukee | 2:a9bb12eefc08 | 172 | set_broadcast_radius(15, 0); |
Cheroukee | 2:a9bb12eefc08 | 173 | set_transmit_request_options(15, 0); |
Cheroukee | 2:a9bb12eefc08 | 174 | |
Cheroukee | 2:a9bb12eefc08 | 175 | set_transmit_request_data(buffer, data_length); |
Cheroukee | 2:a9bb12eefc08 | 176 | |
Cheroukee | 2:a9bb12eefc08 | 177 | build_api_frame_checksum(data_length + TRANSMIT_REQ_OVERHEAD_LENGTH); |
Cheroukee | 2:a9bb12eefc08 | 178 | |
Cheroukee | 2:a9bb12eefc08 | 179 | transmit(data_length); |
Cheroukee | 2:a9bb12eefc08 | 180 | |
Cheroukee | 2:a9bb12eefc08 | 181 | return false; |
Cheroukee | 2:a9bb12eefc08 | 182 | } |
Cheroukee | 2:a9bb12eefc08 | 183 | |
Cheroukee | 2:a9bb12eefc08 | 184 | void transmit(int packet_length) |
Cheroukee | 2:a9bb12eefc08 | 185 | { |
Cheroukee | 2:a9bb12eefc08 | 186 | for (int i = 0; i < 18 + packet_length; i++) |
Cheroukee | 2:a9bb12eefc08 | 187 | { |
Cheroukee | 2:a9bb12eefc08 | 188 | xbee.putc(TransmitBuffer[i]); |
Cheroukee | 2:a9bb12eefc08 | 189 | } |
Cheroukee | 5:9e6a09a38785 | 190 | xbee_transmit_led = !xbee_transmit_led; |
Cheroukee | 5:9e6a09a38785 | 191 | } |
Cheroukee | 5:9e6a09a38785 | 192 | |
Cheroukee | 8:5955af1ee445 | 193 | bool receive(frame_t* out_frame, int max_length) |
Cheroukee | 5:9e6a09a38785 | 194 | { |
Cheroukee | 8:5955af1ee445 | 195 | static int curr_length = 0; |
Cheroukee | 8:5955af1ee445 | 196 | |
Cheroukee | 8:5955af1ee445 | 197 | static frame_recv_state_t recv_state = wait_delimiter; |
Cheroukee | 11:ecf5776b950a | 198 | frame_t* frame = out_frame; |
Cheroukee | 8:5955af1ee445 | 199 | static char checksum = 0xFF; |
Cheroukee | 8:5955af1ee445 | 200 | |
Cheroukee | 8:5955af1ee445 | 201 | bool finished_frame = false; |
Cheroukee | 8:5955af1ee445 | 202 | |
Cheroukee | 11:ecf5776b950a | 203 | xbee_receive_led = !xbee_receive_led; |
Cheroukee | 8:5955af1ee445 | 204 | while(xbee.readable() && curr_length < max_length && !finished_frame) |
Cheroukee | 5:9e6a09a38785 | 205 | { |
Cheroukee | 11:ecf5776b950a | 206 | char current = xbee.getc(); |
Cheroukee | 8:5955af1ee445 | 207 | switch(recv_state) |
Cheroukee | 8:5955af1ee445 | 208 | { |
Cheroukee | 8:5955af1ee445 | 209 | case wait_delimiter: |
Cheroukee | 8:5955af1ee445 | 210 | { |
Cheroukee | 11:ecf5776b950a | 211 | if (current == ZIGBEE_DELIMITER) |
Cheroukee | 8:5955af1ee445 | 212 | { |
Cheroukee | 11:ecf5776b950a | 213 | curr_length = 0; |
Cheroukee | 8:5955af1ee445 | 214 | recv_state = read_length_msb; |
Cheroukee | 11:ecf5776b950a | 215 | frame->length = 0; |
Cheroukee | 8:5955af1ee445 | 216 | } |
Cheroukee | 8:5955af1ee445 | 217 | break; |
Cheroukee | 8:5955af1ee445 | 218 | } |
Cheroukee | 8:5955af1ee445 | 219 | case read_length_msb: |
Cheroukee | 8:5955af1ee445 | 220 | { |
Cheroukee | 11:ecf5776b950a | 221 | frame->length = (current << 8); |
Cheroukee | 8:5955af1ee445 | 222 | recv_state = read_length_lsb; |
Cheroukee | 8:5955af1ee445 | 223 | break; |
Cheroukee | 8:5955af1ee445 | 224 | } |
Cheroukee | 8:5955af1ee445 | 225 | case read_length_lsb: |
Cheroukee | 11:ecf5776b950a | 226 | { |
Cheroukee | 11:ecf5776b950a | 227 | frame->length |= current; |
Cheroukee | 8:5955af1ee445 | 228 | checksum = 0xFF; |
Cheroukee | 8:5955af1ee445 | 229 | recv_state = read_frame_specific; |
Cheroukee | 8:5955af1ee445 | 230 | break; |
Cheroukee | 8:5955af1ee445 | 231 | } |
Cheroukee | 8:5955af1ee445 | 232 | case read_frame_specific: |
Cheroukee | 8:5955af1ee445 | 233 | { |
Cheroukee | 11:ecf5776b950a | 234 | frame->buffer[curr_length++] = current; |
Cheroukee | 11:ecf5776b950a | 235 | checksum -= current; |
Cheroukee | 11:ecf5776b950a | 236 | if (curr_length >= frame->length) |
Cheroukee | 8:5955af1ee445 | 237 | { |
Cheroukee | 8:5955af1ee445 | 238 | recv_state = read_checksum; |
Cheroukee | 8:5955af1ee445 | 239 | } |
Cheroukee | 8:5955af1ee445 | 240 | break; |
Cheroukee | 8:5955af1ee445 | 241 | } |
Cheroukee | 8:5955af1ee445 | 242 | case read_checksum: |
Cheroukee | 8:5955af1ee445 | 243 | { |
Cheroukee | 8:5955af1ee445 | 244 | recv_state = wait_delimiter; |
Cheroukee | 11:ecf5776b950a | 245 | if (checksum == current) |
Cheroukee | 8:5955af1ee445 | 246 | { |
Cheroukee | 8:5955af1ee445 | 247 | finished_frame = true; |
Cheroukee | 8:5955af1ee445 | 248 | } |
Cheroukee | 8:5955af1ee445 | 249 | break; |
Cheroukee | 8:5955af1ee445 | 250 | } |
Cheroukee | 8:5955af1ee445 | 251 | } |
Cheroukee | 8:5955af1ee445 | 252 | } |
Cheroukee | 8:5955af1ee445 | 253 | |
Cheroukee | 8:5955af1ee445 | 254 | return finished_frame; |
Cheroukee | 5:9e6a09a38785 | 255 | } |
Cheroukee | 8:5955af1ee445 | 256 | |
Cheroukee | 8:5955af1ee445 | 257 | |
Cheroukee | 8:5955af1ee445 | 258 | /** |
Cheroukee | 8:5955af1ee445 | 259 | * |
Cheroukee | 8:5955af1ee445 | 260 | * // Calculate checksum |
Cheroukee | 8:5955af1ee445 | 261 | char checksum = 0xFF; |
Cheroukee | 8:5955af1ee445 | 262 | for (int i = 3; i < FRAME_CHEKSUM_POS; i++) |
Cheroukee | 8:5955af1ee445 | 263 | { |
Cheroukee | 8:5955af1ee445 | 264 | checksum -= TransmitBuffer[i]; |
Cheroukee | 8:5955af1ee445 | 265 | } |
Cheroukee | 8:5955af1ee445 | 266 | |
Cheroukee | 8:5955af1ee445 | 267 | // Insert checksum into buffer |
Cheroukee | 8:5955af1ee445 | 268 | TransmitBuffer[FRAME_CHEKSUM_POS] = checksum;*/ |