Code APP3

Dependencies:   mbed EthernetInterface WebSocketClient mbed-rtos BufferedSerial

Fork of APP3_Lab by Jean-Philippe Fournier

Committer:
JayMcGee
Date:
Mon Oct 02 16:02:27 2017 +0000
Revision:
22:7edae38d0758
Parent:
19:75e600a40741
Child:
23:c3f25b511448
Added Array of 64bit adress received;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Cheroukee 0:f468a460723d 1 #include "mbed.h"
Cheroukee 2:a9bb12eefc08 2
Cheroukee 17:8abdbfa6019c 3 #include "rtos.h"
Cheroukee 17:8abdbfa6019c 4
Cheroukee 1:ea1b52d0a8a3 5 #include "xbee.h"
Cheroukee 5:9e6a09a38785 6 #include "parser.h"
Cheroukee 9:3631d3685cfa 7 #include "sensors.h"
Cheroukee 2:a9bb12eefc08 8
Cheroukee 17:8abdbfa6019c 9 #define IS_COORDINATOR 1
Cheroukee 16:0a5f3c449c95 10
Cheroukee 1:ea1b52d0a8a3 11 #define PAN_ID 0xC0FFEE
Cheroukee 2:a9bb12eefc08 12
Cheroukee 15:c4d17caf0709 13 #define BUFFER_SIZE 64
Cheroukee 12:1286b80c68f7 14
Cheroukee 13:5f21dd134bd2 15 char recv_buff[BUFFER_SIZE] = {0};
Cheroukee 15:c4d17caf0709 16 DigitalOut loop_led(LED4);
Cheroukee 13:5f21dd134bd2 17
Cheroukee 13:5f21dd134bd2 18 void set_remote_xbee_dio4(bool set);
Cheroukee 0:f468a460723d 19
Cheroukee 14:cd488eba8bba 20 void set_pan_id(long pan_id);
Cheroukee 14:cd488eba8bba 21
JayMcGee 22:7edae38d0758 22 zigbee_addr_64_t addr_64[255];
JayMcGee 22:7edae38d0758 23 int last_addr_64_index = 0;
JayMcGee 22:7edae38d0758 24
Cheroukee 19:75e600a40741 25 int process_frame(frame_t* frame);
Cheroukee 19:75e600a40741 26
Cheroukee 13:5f21dd134bd2 27 #if IS_COORDINATOR
Cheroukee 13:5f21dd134bd2 28 void coordinator();
Cheroukee 13:5f21dd134bd2 29 #else
Cheroukee 13:5f21dd134bd2 30 void routeur();
Cheroukee 13:5f21dd134bd2 31 #endif
Cheroukee 6:9ed8153f1328 32
Cheroukee 0:f468a460723d 33 int main() {
Cheroukee 2:a9bb12eefc08 34
Cheroukee 1:ea1b52d0a8a3 35 xbee_init();
Cheroukee 2:a9bb12eefc08 36
Cheroukee 13:5f21dd134bd2 37 #if IS_COORDINATOR
Cheroukee 13:5f21dd134bd2 38 coordinator();
Cheroukee 13:5f21dd134bd2 39 #else
Cheroukee 13:5f21dd134bd2 40 routeur();
Cheroukee 13:5f21dd134bd2 41 #endif
Cheroukee 13:5f21dd134bd2 42 }
Cheroukee 2:a9bb12eefc08 43
Cheroukee 13:5f21dd134bd2 44 void set_remote_xbee_dio4(bool set)
Cheroukee 13:5f21dd134bd2 45 {
Cheroukee 13:5f21dd134bd2 46 if (set)
Cheroukee 13:5f21dd134bd2 47 {
Cheroukee 13:5f21dd134bd2 48 remote_at_command_set(AT_COMMAND_DIO4_MSB, AT_COMMAND_DIO4_LSB,
Cheroukee 13:5f21dd134bd2 49 AT_COMMAND_DIO_OUT_LOW, 0x02);
Cheroukee 13:5f21dd134bd2 50 }
Cheroukee 13:5f21dd134bd2 51 else
Cheroukee 13:5f21dd134bd2 52 {
Cheroukee 13:5f21dd134bd2 53 remote_at_command_set(AT_COMMAND_DIO4_MSB, AT_COMMAND_DIO4_LSB,
Cheroukee 13:5f21dd134bd2 54 AT_COMMAND_DIO_OUT_HIGH, 0x02);
Cheroukee 13:5f21dd134bd2 55 }
Cheroukee 13:5f21dd134bd2 56 }
Cheroukee 9:3631d3685cfa 57
Cheroukee 2:a9bb12eefc08 58 #if IS_COORDINATOR
Cheroukee 13:5f21dd134bd2 59 void coordinator()
Cheroukee 16:0a5f3c449c95 60 {
Cheroukee 16:0a5f3c449c95 61
Cheroukee 13:5f21dd134bd2 62 coordinator_config_t config = read_coordinator_config();
Cheroukee 16:0a5f3c449c95 63
Cheroukee 14:cd488eba8bba 64 set_pan_id(config.pan_id);
Cheroukee 16:0a5f3c449c95 65
Cheroukee 12:1286b80c68f7 66 frame_t current_frame;
Cheroukee 16:0a5f3c449c95 67
Cheroukee 12:1286b80c68f7 68 bool toggle_led = false;
Cheroukee 13:5f21dd134bd2 69 while(1)
Cheroukee 13:5f21dd134bd2 70 {
Cheroukee 12:1286b80c68f7 71 bool finished_packet = receive(&current_frame, BUFFER_SIZE);
Cheroukee 13:5f21dd134bd2 72
Cheroukee 8:5955af1ee445 73 if (finished_packet)
Cheroukee 1:ea1b52d0a8a3 74 {
Cheroukee 19:75e600a40741 75
Cheroukee 19:75e600a40741 76 process_frame(&current_frame);
Cheroukee 19:75e600a40741 77
Cheroukee 16:0a5f3c449c95 78
Cheroukee 17:8abdbfa6019c 79 //remote_at_command_query('N', 'D', 0x02);
Cheroukee 6:9ed8153f1328 80 }
Cheroukee 12:1286b80c68f7 81
Cheroukee 13:5f21dd134bd2 82 set_remote_xbee_dio4(toggle_led);
Cheroukee 13:5f21dd134bd2 83 toggle_led = !toggle_led;
Cheroukee 13:5f21dd134bd2 84
Cheroukee 15:c4d17caf0709 85 loop_led = !loop_led;
Cheroukee 13:5f21dd134bd2 86 wait(1);
Cheroukee 13:5f21dd134bd2 87 }
Cheroukee 13:5f21dd134bd2 88 }
Cheroukee 12:1286b80c68f7 89 #else
Cheroukee 13:5f21dd134bd2 90 void routeur()
Cheroukee 13:5f21dd134bd2 91 {
Cheroukee 13:5f21dd134bd2 92 router_config_t config = read_router_config();
Cheroukee 14:cd488eba8bba 93 set_pan_id(config.pan_id);
Cheroukee 13:5f21dd134bd2 94 char sensor_buffer[64] = {};
Cheroukee 13:5f21dd134bd2 95 initialize_sensors();
Cheroukee 13:5f21dd134bd2 96 DECLARE_ADDR64_COORD
Cheroukee 13:5f21dd134bd2 97 DECLARE_ADDR16_UNKNOWN_OR_BCAST
Cheroukee 13:5f21dd134bd2 98
Cheroukee 13:5f21dd134bd2 99 while(1)
Cheroukee 13:5f21dd134bd2 100 {
Cheroukee 12:1286b80c68f7 101 SENSOR accel = (*p[0])();
Cheroukee 12:1286b80c68f7 102
Cheroukee 12:1286b80c68f7 103 sprintf(sensor_buffer, "%3.2f%3.2f%3.2f", accel.Accelerometre.x, accel.Accelerometre.y, accel.Accelerometre.z);
Cheroukee 12:1286b80c68f7 104
Cheroukee 12:1286b80c68f7 105 transmit_request(sensor_buffer, 15, 0, USE_ADDR64_COORD, USE_ADDR16_UNKNOWN_OR_BCAST);
Cheroukee 14:cd488eba8bba 106
Cheroukee 15:c4d17caf0709 107 loop_led = !loop_led;
Cheroukee 13:5f21dd134bd2 108 wait(config.refresh_freq);
Cheroukee 0:f468a460723d 109 }
Cheroukee 0:f468a460723d 110 }
Cheroukee 14:cd488eba8bba 111 #endif
Cheroukee 14:cd488eba8bba 112
Cheroukee 14:cd488eba8bba 113 void set_pan_id(long pan_id)
Cheroukee 14:cd488eba8bba 114 {
Cheroukee 14:cd488eba8bba 115 char pan_id_buffer[8] = {0};
Cheroukee 14:cd488eba8bba 116 for (int i = 0; i < 8; i++)
Cheroukee 14:cd488eba8bba 117 {
Cheroukee 14:cd488eba8bba 118 pan_id_buffer[i] = 0xFF & (pan_id >> 8 * (7 - i));
Cheroukee 14:cd488eba8bba 119 }
Cheroukee 14:cd488eba8bba 120 at_command_set('I', 'D', pan_id_buffer, 8);
Cheroukee 14:cd488eba8bba 121 }
Cheroukee 19:75e600a40741 122
Cheroukee 19:75e600a40741 123 int process_frame(frame_t* frame)
Cheroukee 19:75e600a40741 124 {
Cheroukee 19:75e600a40741 125 Serial pc(USBTX, USBRX); // tx, rx
Cheroukee 19:75e600a40741 126 if (frame->length <= 0)
Cheroukee 19:75e600a40741 127 {
Cheroukee 19:75e600a40741 128 return -1;
Cheroukee 19:75e600a40741 129 }
Cheroukee 19:75e600a40741 130 /*for (int i = 0; i < frame->length; i++)
Cheroukee 19:75e600a40741 131 {
Cheroukee 19:75e600a40741 132 char current = frame->buffer[i];
Cheroukee 19:75e600a40741 133 } */
Cheroukee 19:75e600a40741 134 if (frame->buffer[0] == 0x90)
Cheroukee 19:75e600a40741 135 {
Cheroukee 19:75e600a40741 136 // Manage source address
Cheroukee 19:75e600a40741 137 // Detect the source address and list it dynamically
JayMcGee 22:7edae38d0758 138 zigbee_addr_64_t temp_addr_64;
JayMcGee 22:7edae38d0758 139 bool already_exist = false;
JayMcGee 22:7edae38d0758 140 // Read 64 bit address that was in message
JayMcGee 22:7edae38d0758 141 temp_addr_64.addr_0 = frame->buffer[1];
JayMcGee 22:7edae38d0758 142 temp_addr_64.addr_1 = frame->buffer[2];
JayMcGee 22:7edae38d0758 143 temp_addr_64.addr_2 = frame->buffer[3];
JayMcGee 22:7edae38d0758 144 temp_addr_64.addr_3 = frame->buffer[4];
JayMcGee 22:7edae38d0758 145 temp_addr_64.addr_4 = frame->buffer[5];
JayMcGee 22:7edae38d0758 146 temp_addr_64.addr_5 = frame->buffer[6];
JayMcGee 22:7edae38d0758 147 temp_addr_64.addr_6 = frame->buffer[7];
JayMcGee 22:7edae38d0758 148 temp_addr_64.addr_7 = frame->buffer[8];
Cheroukee 19:75e600a40741 149
JayMcGee 22:7edae38d0758 150 // Verify if the received address is new
JayMcGee 22:7edae38d0758 151 for(int j = 0; j < last_addr_64_index; j++)
JayMcGee 22:7edae38d0758 152 {
JayMcGee 22:7edae38d0758 153 if(addr_64_equal(temp_addr_64,addr_64[j]))
JayMcGee 22:7edae38d0758 154 {
JayMcGee 22:7edae38d0758 155 already_exist = true;
JayMcGee 22:7edae38d0758 156 }
JayMcGee 22:7edae38d0758 157 }
JayMcGee 22:7edae38d0758 158
JayMcGee 22:7edae38d0758 159 // If it is New and our array isn't full of devices add it to the array
JayMcGee 22:7edae38d0758 160 if(!already_exist && last_addr_64_index < 255)
JayMcGee 22:7edae38d0758 161 {
JayMcGee 22:7edae38d0758 162 last_addr_64_index++;
JayMcGee 22:7edae38d0758 163 addr_64[last_addr_64_index] = temp_addr_64;
JayMcGee 22:7edae38d0758 164 }
JayMcGee 22:7edae38d0758 165
Cheroukee 19:75e600a40741 166 //Data starts at 12
Cheroukee 19:75e600a40741 167 for (int i = 12; i < frame->length; i++)
Cheroukee 19:75e600a40741 168 {
Cheroukee 19:75e600a40741 169 pc.putc(frame->buffer[i]);
Cheroukee 19:75e600a40741 170 }
Cheroukee 19:75e600a40741 171 }
Cheroukee 19:75e600a40741 172 return 0;
Cheroukee 19:75e600a40741 173 }