Code APP3

Dependencies:   mbed EthernetInterface WebSocketClient mbed-rtos BufferedSerial

Fork of APP3_Lab by Jean-Philippe Fournier

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