Code APP3
Dependencies: mbed EthernetInterface WebSocketClient mbed-rtos BufferedSerial
Fork of APP3_Lab by
xbee.cpp@2:a9bb12eefc08, 2017-09-30 (annotated)
- Committer:
- Cheroukee
- Date:
- Sat Sep 30 18:02:41 2017 +0000
- Revision:
- 2:a9bb12eefc08
- Parent:
- 1:ea1b52d0a8a3
- Child:
- 5:9e6a09a38785
EHHH XBEER IS GOOD
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 | 2:a9bb12eefc08 | 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 | 1:ea1b52d0a8a3 | 41 | bool transmit_request(char* buffer, int length) |
Cheroukee | 1:ea1b52d0a8a3 | 42 | { |
Cheroukee | 1:ea1b52d0a8a3 | 43 | // Frame Type |
Cheroukee | 2:a9bb12eefc08 | 44 | /*TransmitBuffer[3] = 0x10; |
Cheroukee | 1:ea1b52d0a8a3 | 45 | |
Cheroukee | 1:ea1b52d0a8a3 | 46 | // Frame ID |
Cheroukee | 1:ea1b52d0a8a3 | 47 | TransmitBuffer[4] = 0x01; |
Cheroukee | 1:ea1b52d0a8a3 | 48 | |
Cheroukee | 1:ea1b52d0a8a3 | 49 | // Should set address if different from coordinator |
Cheroukee | 1:ea1b52d0a8a3 | 50 | //TransmitBuffer[5] = |
Cheroukee | 1:ea1b52d0a8a3 | 51 | |
Cheroukee | 1:ea1b52d0a8a3 | 52 | // 16-bit address, broadcast address |
Cheroukee | 1:ea1b52d0a8a3 | 53 | TransmitBuffer[13] = 0xFF; |
Cheroukee | 1:ea1b52d0a8a3 | 54 | TransmitBuffer[14] = 0xFE; |
Cheroukee | 1:ea1b52d0a8a3 | 55 | |
Cheroukee | 1:ea1b52d0a8a3 | 56 | // Max hops, 0 = max |
Cheroukee | 1:ea1b52d0a8a3 | 57 | TransmitBuffer[15] = 0x00; |
Cheroukee | 1:ea1b52d0a8a3 | 58 | |
Cheroukee | 1:ea1b52d0a8a3 | 59 | // Transmit options |
Cheroukee | 1:ea1b52d0a8a3 | 60 | TransmitBuffer[16] = 0x00; |
Cheroukee | 1:ea1b52d0a8a3 | 61 | |
Cheroukee | 1:ea1b52d0a8a3 | 62 | // Insert buffer data |
Cheroukee | 1:ea1b52d0a8a3 | 63 | for (int i = 0; i < length; i++) |
Cheroukee | 1:ea1b52d0a8a3 | 64 | { |
Cheroukee | 1:ea1b52d0a8a3 | 65 | TransmitBuffer[17 + i] = buffer[i]; |
Cheroukee | 1:ea1b52d0a8a3 | 66 | } |
Cheroukee | 2:a9bb12eefc08 | 67 | |
Cheroukee | 2:a9bb12eefc08 | 68 | for (int i = 0; i < 17 + length + 1; i++) |
Cheroukee | 2:a9bb12eefc08 | 69 | { |
Cheroukee | 2:a9bb12eefc08 | 70 | xbee_transmit_led = !xbee_transmit_led; |
Cheroukee | 2:a9bb12eefc08 | 71 | xbee.putc(TransmitBuffer[i]); |
Cheroukee | 2:a9bb12eefc08 | 72 | }*/ |
Cheroukee | 1:ea1b52d0a8a3 | 73 | |
Cheroukee | 2:a9bb12eefc08 | 74 | return false; |
Cheroukee | 2:a9bb12eefc08 | 75 | } |
Cheroukee | 2:a9bb12eefc08 | 76 | |
Cheroukee | 2:a9bb12eefc08 | 77 | |
Cheroukee | 2:a9bb12eefc08 | 78 | int receive_buffer(char* buffer, int max_length) |
Cheroukee | 2:a9bb12eefc08 | 79 | { |
Cheroukee | 2:a9bb12eefc08 | 80 | int length = 0; |
Cheroukee | 2:a9bb12eefc08 | 81 | |
Cheroukee | 2:a9bb12eefc08 | 82 | while(xbee.readable() && length < max_length) |
Cheroukee | 2:a9bb12eefc08 | 83 | { |
Cheroukee | 2:a9bb12eefc08 | 84 | xbee_receive_led = !xbee_receive_led; |
Cheroukee | 2:a9bb12eefc08 | 85 | buffer[length++] = xbee.getc(); |
Cheroukee | 2:a9bb12eefc08 | 86 | } |
Cheroukee | 2:a9bb12eefc08 | 87 | |
Cheroukee | 2:a9bb12eefc08 | 88 | for (int i = 17; i < length - 1; i++) |
Cheroukee | 2:a9bb12eefc08 | 89 | { |
Cheroukee | 2:a9bb12eefc08 | 90 | // pc.putc(ReceiveBuffer[i]); |
Cheroukee | 2:a9bb12eefc08 | 91 | } |
Cheroukee | 2:a9bb12eefc08 | 92 | return length; |
Cheroukee | 2:a9bb12eefc08 | 93 | } |
Cheroukee | 2:a9bb12eefc08 | 94 | |
Cheroukee | 2:a9bb12eefc08 | 95 | void build_api_frame_header(int frame_data_size) |
Cheroukee | 2:a9bb12eefc08 | 96 | { |
Cheroukee | 2:a9bb12eefc08 | 97 | // Delimiter |
Cheroukee | 2:a9bb12eefc08 | 98 | TransmitBuffer[FRAME_DELIMITER_POS] = ZIGBEE_DELIMITER; |
Cheroukee | 2:a9bb12eefc08 | 99 | TransmitBuffer[FRAME_LEN_MSB_POS] = frame_data_size >> 8; |
Cheroukee | 2:a9bb12eefc08 | 100 | TransmitBuffer[FRAME_LEN_LSB_POS] = frame_data_size & 0xFF; |
Cheroukee | 2:a9bb12eefc08 | 101 | } |
Cheroukee | 2:a9bb12eefc08 | 102 | |
Cheroukee | 2:a9bb12eefc08 | 103 | void build_api_frame_checksum(int frame_data_size) |
Cheroukee | 2:a9bb12eefc08 | 104 | { |
Cheroukee | 1:ea1b52d0a8a3 | 105 | // Calculate checksum |
Cheroukee | 2:a9bb12eefc08 | 106 | char checksum = 0xFF; |
Cheroukee | 2:a9bb12eefc08 | 107 | for (int i = 3; i < FRAME_CHEKSUM_POS; i++) |
Cheroukee | 1:ea1b52d0a8a3 | 108 | { |
Cheroukee | 1:ea1b52d0a8a3 | 109 | checksum -= TransmitBuffer[i]; |
Cheroukee | 1:ea1b52d0a8a3 | 110 | } |
Cheroukee | 1:ea1b52d0a8a3 | 111 | |
Cheroukee | 1:ea1b52d0a8a3 | 112 | // Insert checksum into buffer |
Cheroukee | 2:a9bb12eefc08 | 113 | TransmitBuffer[FRAME_CHEKSUM_POS] = checksum; |
Cheroukee | 2:a9bb12eefc08 | 114 | } |
Cheroukee | 2:a9bb12eefc08 | 115 | |
Cheroukee | 2:a9bb12eefc08 | 116 | void set_api_frame_type(frame_type_t frame_type) |
Cheroukee | 2:a9bb12eefc08 | 117 | { |
Cheroukee | 2:a9bb12eefc08 | 118 | TransmitBuffer[API_FRAME_TYPE_POS] = frame_type; |
Cheroukee | 2:a9bb12eefc08 | 119 | } |
Cheroukee | 2:a9bb12eefc08 | 120 | |
Cheroukee | 2:a9bb12eefc08 | 121 | void set_api_frame_id(int id) |
Cheroukee | 2:a9bb12eefc08 | 122 | { |
Cheroukee | 2:a9bb12eefc08 | 123 | TransmitBuffer[API_FRAME_ID_POS] = id; |
Cheroukee | 2:a9bb12eefc08 | 124 | } |
Cheroukee | 2:a9bb12eefc08 | 125 | |
Cheroukee | 2:a9bb12eefc08 | 126 | void set_at_command(int at_command) |
Cheroukee | 2:a9bb12eefc08 | 127 | { |
Cheroukee | 2:a9bb12eefc08 | 128 | // NOT IMPLEMENTED |
Cheroukee | 2:a9bb12eefc08 | 129 | } |
Cheroukee | 2:a9bb12eefc08 | 130 | |
Cheroukee | 2:a9bb12eefc08 | 131 | void set_64_addr(zigbee_addr_64_t address) |
Cheroukee | 2:a9bb12eefc08 | 132 | { |
Cheroukee | 2:a9bb12eefc08 | 133 | int i = 0; |
Cheroukee | 2:a9bb12eefc08 | 134 | TransmitBuffer[TRANSMIT_REQ_ADDR64_MSB_POS + i++] = address.addr_0; |
Cheroukee | 2:a9bb12eefc08 | 135 | TransmitBuffer[TRANSMIT_REQ_ADDR64_MSB_POS + i++] = address.addr_1; |
Cheroukee | 2:a9bb12eefc08 | 136 | TransmitBuffer[TRANSMIT_REQ_ADDR64_MSB_POS + i++] = address.addr_2; |
Cheroukee | 2:a9bb12eefc08 | 137 | TransmitBuffer[TRANSMIT_REQ_ADDR64_MSB_POS + i++] = address.addr_3; |
Cheroukee | 2:a9bb12eefc08 | 138 | |
Cheroukee | 2:a9bb12eefc08 | 139 | TransmitBuffer[TRANSMIT_REQ_ADDR64_MSB_POS + i++] = address.addr_4; |
Cheroukee | 2:a9bb12eefc08 | 140 | TransmitBuffer[TRANSMIT_REQ_ADDR64_MSB_POS + i++] = address.addr_5; |
Cheroukee | 2:a9bb12eefc08 | 141 | TransmitBuffer[TRANSMIT_REQ_ADDR64_MSB_POS + i++] = address.addr_6; |
Cheroukee | 2:a9bb12eefc08 | 142 | TransmitBuffer[TRANSMIT_REQ_ADDR64_MSB_POS + i++] = address.addr_7; |
Cheroukee | 2:a9bb12eefc08 | 143 | } |
Cheroukee | 2:a9bb12eefc08 | 144 | |
Cheroukee | 2:a9bb12eefc08 | 145 | void set_16_addr(zigbee_addr_16_t address) |
Cheroukee | 2:a9bb12eefc08 | 146 | { |
Cheroukee | 2:a9bb12eefc08 | 147 | TransmitBuffer[TRANSMIT_REQ_ADDR16_MSB_POS] = address.addr_msb; |
Cheroukee | 2:a9bb12eefc08 | 148 | TransmitBuffer[TRANSMIT_REQ_ADDR16_MSB_POS + 1] = address.addr_lsb; |
Cheroukee | 2:a9bb12eefc08 | 149 | } |
Cheroukee | 2:a9bb12eefc08 | 150 | |
Cheroukee | 2:a9bb12eefc08 | 151 | void set_broadcast_radius(int position, char radius) |
Cheroukee | 2:a9bb12eefc08 | 152 | { |
Cheroukee | 2:a9bb12eefc08 | 153 | TransmitBuffer[position] = radius; |
Cheroukee | 2:a9bb12eefc08 | 154 | } |
Cheroukee | 2:a9bb12eefc08 | 155 | |
Cheroukee | 2:a9bb12eefc08 | 156 | void set_transmit_request_options(int position, char options) |
Cheroukee | 2:a9bb12eefc08 | 157 | { |
Cheroukee | 2:a9bb12eefc08 | 158 | TransmitBuffer[position] = options; |
Cheroukee | 2:a9bb12eefc08 | 159 | } |
Cheroukee | 2:a9bb12eefc08 | 160 | |
Cheroukee | 2:a9bb12eefc08 | 161 | void set_transmit_request_data(char* data, int data_length) |
Cheroukee | 2:a9bb12eefc08 | 162 | { |
Cheroukee | 2:a9bb12eefc08 | 163 | for (int i = 0; i < data_length; i++) |
Cheroukee | 1:ea1b52d0a8a3 | 164 | { |
Cheroukee | 2:a9bb12eefc08 | 165 | TransmitBuffer[TRANSMIT_REQ_DATA_START + i] = data[i]; |
Cheroukee | 1:ea1b52d0a8a3 | 166 | } |
Cheroukee | 2:a9bb12eefc08 | 167 | } |
Cheroukee | 2:a9bb12eefc08 | 168 | |
Cheroukee | 2:a9bb12eefc08 | 169 | bool transmit_request_64(char* buffer, int data_length, char options, zigbee_addr_64_t destination) |
Cheroukee | 2:a9bb12eefc08 | 170 | { |
Cheroukee | 2:a9bb12eefc08 | 171 | build_api_frame_header(data_length + TRANSMIT_REQ_OVERHEAD_LENGTH); |
Cheroukee | 2:a9bb12eefc08 | 172 | |
Cheroukee | 2:a9bb12eefc08 | 173 | set_api_frame_type(TransmitRequest); |
Cheroukee | 2:a9bb12eefc08 | 174 | set_api_frame_id(0x01); |
Cheroukee | 2:a9bb12eefc08 | 175 | |
Cheroukee | 2:a9bb12eefc08 | 176 | set_64_addr(destination); |
Cheroukee | 2:a9bb12eefc08 | 177 | DECLARE_ADDR16_UNKNOWN_OR_BCAST |
Cheroukee | 2:a9bb12eefc08 | 178 | set_16_addr(USE_ADDR16_UNKNOWN_OR_BCAST); |
Cheroukee | 2:a9bb12eefc08 | 179 | |
Cheroukee | 2:a9bb12eefc08 | 180 | set_broadcast_radius(15, 0); |
Cheroukee | 2:a9bb12eefc08 | 181 | set_transmit_request_options(15, 0); |
Cheroukee | 2:a9bb12eefc08 | 182 | |
Cheroukee | 2:a9bb12eefc08 | 183 | set_transmit_request_data(buffer, data_length); |
Cheroukee | 2:a9bb12eefc08 | 184 | |
Cheroukee | 2:a9bb12eefc08 | 185 | build_api_frame_checksum(data_length + TRANSMIT_REQ_OVERHEAD_LENGTH); |
Cheroukee | 2:a9bb12eefc08 | 186 | |
Cheroukee | 2:a9bb12eefc08 | 187 | transmit(data_length); |
Cheroukee | 1:ea1b52d0a8a3 | 188 | |
Cheroukee | 1:ea1b52d0a8a3 | 189 | return false; |
Cheroukee | 1:ea1b52d0a8a3 | 190 | } |
Cheroukee | 1:ea1b52d0a8a3 | 191 | |
Cheroukee | 2:a9bb12eefc08 | 192 | bool transmit_request_16(char* buffer, int data_length, char options, zigbee_addr_16_t destination) |
Cheroukee | 2:a9bb12eefc08 | 193 | { |
Cheroukee | 2:a9bb12eefc08 | 194 | build_api_frame_header(data_length + TRANSMIT_REQ_OVERHEAD_LENGTH); |
Cheroukee | 2:a9bb12eefc08 | 195 | |
Cheroukee | 2:a9bb12eefc08 | 196 | set_api_frame_type(TransmitRequest); |
Cheroukee | 2:a9bb12eefc08 | 197 | set_api_frame_id(0x01); |
Cheroukee | 2:a9bb12eefc08 | 198 | |
Cheroukee | 2:a9bb12eefc08 | 199 | DECLARE_ADDR64_BCAST |
Cheroukee | 2:a9bb12eefc08 | 200 | set_64_addr(USE_ADDR64_BCAST); |
Cheroukee | 2:a9bb12eefc08 | 201 | set_16_addr(destination); |
Cheroukee | 2:a9bb12eefc08 | 202 | |
Cheroukee | 2:a9bb12eefc08 | 203 | set_broadcast_radius(15, 0); |
Cheroukee | 2:a9bb12eefc08 | 204 | set_transmit_request_options(15, 0); |
Cheroukee | 2:a9bb12eefc08 | 205 | |
Cheroukee | 2:a9bb12eefc08 | 206 | set_transmit_request_data(buffer, data_length); |
Cheroukee | 2:a9bb12eefc08 | 207 | |
Cheroukee | 2:a9bb12eefc08 | 208 | build_api_frame_checksum(data_length + TRANSMIT_REQ_OVERHEAD_LENGTH); |
Cheroukee | 2:a9bb12eefc08 | 209 | |
Cheroukee | 2:a9bb12eefc08 | 210 | transmit(data_length); |
Cheroukee | 2:a9bb12eefc08 | 211 | |
Cheroukee | 2:a9bb12eefc08 | 212 | return false; |
Cheroukee | 2:a9bb12eefc08 | 213 | } |
Cheroukee | 2:a9bb12eefc08 | 214 | |
Cheroukee | 2:a9bb12eefc08 | 215 | bool transmit_request(char* buffer, int data_length, char options, zigbee_addr_64_t destination64, zigbee_addr_16_t destination16) |
Cheroukee | 1:ea1b52d0a8a3 | 216 | { |
Cheroukee | 2:a9bb12eefc08 | 217 | build_api_frame_header(data_length + TRANSMIT_REQ_OVERHEAD_LENGTH); |
Cheroukee | 2:a9bb12eefc08 | 218 | |
Cheroukee | 2:a9bb12eefc08 | 219 | set_api_frame_type(TransmitRequest); |
Cheroukee | 2:a9bb12eefc08 | 220 | set_api_frame_id(0x01); |
Cheroukee | 2:a9bb12eefc08 | 221 | |
Cheroukee | 2:a9bb12eefc08 | 222 | set_64_addr(destination64); |
Cheroukee | 2:a9bb12eefc08 | 223 | set_16_addr(destination16); |
Cheroukee | 2:a9bb12eefc08 | 224 | |
Cheroukee | 2:a9bb12eefc08 | 225 | set_broadcast_radius(15, 0); |
Cheroukee | 2:a9bb12eefc08 | 226 | set_transmit_request_options(15, 0); |
Cheroukee | 2:a9bb12eefc08 | 227 | |
Cheroukee | 2:a9bb12eefc08 | 228 | set_transmit_request_data(buffer, data_length); |
Cheroukee | 2:a9bb12eefc08 | 229 | |
Cheroukee | 2:a9bb12eefc08 | 230 | build_api_frame_checksum(data_length + TRANSMIT_REQ_OVERHEAD_LENGTH); |
Cheroukee | 2:a9bb12eefc08 | 231 | |
Cheroukee | 2:a9bb12eefc08 | 232 | transmit(data_length); |
Cheroukee | 2:a9bb12eefc08 | 233 | |
Cheroukee | 2:a9bb12eefc08 | 234 | return false; |
Cheroukee | 2:a9bb12eefc08 | 235 | } |
Cheroukee | 2:a9bb12eefc08 | 236 | |
Cheroukee | 2:a9bb12eefc08 | 237 | void transmit(int packet_length) |
Cheroukee | 2:a9bb12eefc08 | 238 | { |
Cheroukee | 2:a9bb12eefc08 | 239 | for (int i = 0; i < 18 + packet_length; i++) |
Cheroukee | 2:a9bb12eefc08 | 240 | { |
Cheroukee | 2:a9bb12eefc08 | 241 | xbee_transmit_led = !xbee_transmit_led; |
Cheroukee | 2:a9bb12eefc08 | 242 | xbee.putc(TransmitBuffer[i]); |
Cheroukee | 2:a9bb12eefc08 | 243 | } |
Cheroukee | 1:ea1b52d0a8a3 | 244 | } |