Code APP3
Dependencies: mbed EthernetInterface WebSocketClient mbed-rtos BufferedSerial
Fork of APP3_Lab by
Diff: xbee.cpp
- Revision:
- 2:a9bb12eefc08
- Parent:
- 1:ea1b52d0a8a3
- Child:
- 5:9e6a09a38785
--- a/xbee.cpp Wed Sep 27 19:58:38 2017 +0000 +++ b/xbee.cpp Sat Sep 30 18:02:41 2017 +0000 @@ -5,10 +5,8 @@ #include "xbee.h" - -#define ZIGBEE_DELIMITER 0x7E - -DigitalOut xbee_led(LED1); +DigitalOut xbee_transmit_led(LED1); +DigitalOut xbee_receive_led(LED2); DigitalOut xbee_reset(p8); Serial xbee(p13, p14); // tx, rx @@ -18,7 +16,7 @@ void xbee_init() { - xbee_reset = 0; + xbee_receive_led = 0; wait_ms(400); @@ -26,7 +24,7 @@ wait_ms(5000); - xbee_led = 1; + xbee_receive_led = 1; } @@ -42,18 +40,8 @@ bool transmit_request(char* buffer, int length) { - // Delimiter - TransmitBuffer[0] = ZIGBEE_DELIMITER; - - char checksum = 0xFF; - - // Frame Length - int frame_length = length + 14; - TransmitBuffer[1] = frame_length >> 8; - TransmitBuffer[2] = frame_length & 0xFF; - // Frame Type - TransmitBuffer[3] = 0x10; + /*TransmitBuffer[3] = 0x10; // Frame ID TransmitBuffer[4] = 0x01; @@ -76,26 +64,181 @@ { TransmitBuffer[17 + i] = buffer[i]; } + + for (int i = 0; i < 17 + length + 1; i++) + { + xbee_transmit_led = !xbee_transmit_led; + xbee.putc(TransmitBuffer[i]); + }*/ + return false; +} + + +int receive_buffer(char* buffer, int max_length) +{ + int length = 0; + + while(xbee.readable() && length < max_length) + { + xbee_receive_led = !xbee_receive_led; + buffer[length++] = xbee.getc(); + } + + for (int i = 17; i < length - 1; i++) + { + // pc.putc(ReceiveBuffer[i]); + } + return length; +} + +void build_api_frame_header(int frame_data_size) +{ + // Delimiter + TransmitBuffer[FRAME_DELIMITER_POS] = ZIGBEE_DELIMITER; + TransmitBuffer[FRAME_LEN_MSB_POS] = frame_data_size >> 8; + TransmitBuffer[FRAME_LEN_LSB_POS] = frame_data_size & 0xFF; +} + +void build_api_frame_checksum(int frame_data_size) +{ // Calculate checksum - for (int i = 3; i < 17 + length; i++) + char checksum = 0xFF; + for (int i = 3; i < FRAME_CHEKSUM_POS; i++) { checksum -= TransmitBuffer[i]; } // Insert checksum into buffer - TransmitBuffer[17 + length] = checksum; - - for (int i = 0; i < 17 + length + 1; i++) + TransmitBuffer[FRAME_CHEKSUM_POS] = checksum; +} + +void set_api_frame_type(frame_type_t frame_type) +{ + TransmitBuffer[API_FRAME_TYPE_POS] = frame_type; +} + +void set_api_frame_id(int id) +{ + TransmitBuffer[API_FRAME_ID_POS] = id; +} + +void set_at_command(int at_command) +{ +// NOT IMPLEMENTED +} + +void set_64_addr(zigbee_addr_64_t address) +{ + int i = 0; + TransmitBuffer[TRANSMIT_REQ_ADDR64_MSB_POS + i++] = address.addr_0; + TransmitBuffer[TRANSMIT_REQ_ADDR64_MSB_POS + i++] = address.addr_1; + TransmitBuffer[TRANSMIT_REQ_ADDR64_MSB_POS + i++] = address.addr_2; + TransmitBuffer[TRANSMIT_REQ_ADDR64_MSB_POS + i++] = address.addr_3; + + TransmitBuffer[TRANSMIT_REQ_ADDR64_MSB_POS + i++] = address.addr_4; + TransmitBuffer[TRANSMIT_REQ_ADDR64_MSB_POS + i++] = address.addr_5; + TransmitBuffer[TRANSMIT_REQ_ADDR64_MSB_POS + i++] = address.addr_6; + TransmitBuffer[TRANSMIT_REQ_ADDR64_MSB_POS + i++] = address.addr_7; +} + +void set_16_addr(zigbee_addr_16_t address) +{ + TransmitBuffer[TRANSMIT_REQ_ADDR16_MSB_POS] = address.addr_msb; + TransmitBuffer[TRANSMIT_REQ_ADDR16_MSB_POS + 1] = address.addr_lsb; +} + +void set_broadcast_radius(int position, char radius) +{ + TransmitBuffer[position] = radius; +} + +void set_transmit_request_options(int position, char options) +{ + TransmitBuffer[position] = options; +} + +void set_transmit_request_data(char* data, int data_length) +{ + for (int i = 0; i < data_length; i++) { - xbee.putc(TransmitBuffer[i]); + TransmitBuffer[TRANSMIT_REQ_DATA_START + i] = data[i]; } +} + +bool transmit_request_64(char* buffer, int data_length, char options, zigbee_addr_64_t destination) +{ + build_api_frame_header(data_length + TRANSMIT_REQ_OVERHEAD_LENGTH); + + set_api_frame_type(TransmitRequest); + set_api_frame_id(0x01); + + set_64_addr(destination); + DECLARE_ADDR16_UNKNOWN_OR_BCAST + set_16_addr(USE_ADDR16_UNKNOWN_OR_BCAST); + + set_broadcast_radius(15, 0); + set_transmit_request_options(15, 0); + + set_transmit_request_data(buffer, data_length); + + build_api_frame_checksum(data_length + TRANSMIT_REQ_OVERHEAD_LENGTH); + + transmit(data_length); - xbee_led = !xbee_led; return false; } -int receive_buffer(char* buffer, int max_length) +bool transmit_request_16(char* buffer, int data_length, char options, zigbee_addr_16_t destination) +{ + build_api_frame_header(data_length + TRANSMIT_REQ_OVERHEAD_LENGTH); + + set_api_frame_type(TransmitRequest); + set_api_frame_id(0x01); + + DECLARE_ADDR64_BCAST + set_64_addr(USE_ADDR64_BCAST); + set_16_addr(destination); + + set_broadcast_radius(15, 0); + set_transmit_request_options(15, 0); + + set_transmit_request_data(buffer, data_length); + + build_api_frame_checksum(data_length + TRANSMIT_REQ_OVERHEAD_LENGTH); + + transmit(data_length); + + return false; +} + +bool transmit_request(char* buffer, int data_length, char options, zigbee_addr_64_t destination64, zigbee_addr_16_t destination16) { - return 0; + build_api_frame_header(data_length + TRANSMIT_REQ_OVERHEAD_LENGTH); + + set_api_frame_type(TransmitRequest); + set_api_frame_id(0x01); + + set_64_addr(destination64); + set_16_addr(destination16); + + set_broadcast_radius(15, 0); + set_transmit_request_options(15, 0); + + set_transmit_request_data(buffer, data_length); + + build_api_frame_checksum(data_length + TRANSMIT_REQ_OVERHEAD_LENGTH); + + transmit(data_length); + + return false; +} + +void transmit(int packet_length) +{ + for (int i = 0; i < 18 + packet_length; i++) + { + xbee_transmit_led = !xbee_transmit_led; + xbee.putc(TransmitBuffer[i]); + } } \ No newline at end of file