Code APP3
Dependencies: mbed EthernetInterface WebSocketClient mbed-rtos BufferedSerial
Fork of APP3_Lab by
xbee.cpp@23:c3f25b511448, 2017-10-02 (annotated)
- 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?
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 | 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 | } |