Code APP3

Dependencies:   mbed EthernetInterface WebSocketClient mbed-rtos BufferedSerial

Fork of APP3_Lab by Jean-Philippe Fournier

Committer:
Cheroukee
Date:
Mon Oct 02 18:46:45 2017 +0000
Revision:
25:7b808fb9e025
Parent:
24:29ec42daa82e
Child:
26:cbf539141bfe
Working Ethernet communication with websockets

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 25:7b808fb9e025 5 #include "EthernetInterface.h"
Cheroukee 25:7b808fb9e025 6 #include "Websocket.h"
Cheroukee 25:7b808fb9e025 7
Cheroukee 1:ea1b52d0a8a3 8 #include "xbee.h"
Cheroukee 5:9e6a09a38785 9 #include "parser.h"
Cheroukee 9:3631d3685cfa 10 #include "sensors.h"
Cheroukee 2:a9bb12eefc08 11
Cheroukee 17:8abdbfa6019c 12 #define IS_COORDINATOR 1
Cheroukee 16:0a5f3c449c95 13
Cheroukee 1:ea1b52d0a8a3 14 #define PAN_ID 0xC0FFEE
Cheroukee 2:a9bb12eefc08 15
Cheroukee 15:c4d17caf0709 16 #define BUFFER_SIZE 64
Cheroukee 12:1286b80c68f7 17
Cheroukee 13:5f21dd134bd2 18 char recv_buff[BUFFER_SIZE] = {0};
Cheroukee 15:c4d17caf0709 19 DigitalOut loop_led(LED4);
Cheroukee 13:5f21dd134bd2 20
Cheroukee 25:7b808fb9e025 21 Ticker flipper;
Cheroukee 25:7b808fb9e025 22 Ticker error_ticker;
Cheroukee 25:7b808fb9e025 23 void display_error();
Cheroukee 25:7b808fb9e025 24 DigitalOut error_led(LED3);
Cheroukee 25:7b808fb9e025 25
Cheroukee 25:7b808fb9e025 26 void set_remote_xbee_dio4(bool set, zigbee_addr_64_t addr);
Cheroukee 0:f468a460723d 27
Cheroukee 14:cd488eba8bba 28 void set_pan_id(long pan_id);
Cheroukee 14:cd488eba8bba 29
JayMcGee 22:7edae38d0758 30 zigbee_addr_64_t addr_64[255];
Cheroukee 25:7b808fb9e025 31 volatile int last_addr_64_index = 0;
JayMcGee 22:7edae38d0758 32
Cheroukee 19:75e600a40741 33 int process_frame(frame_t* frame);
Cheroukee 19:75e600a40741 34
Cheroukee 25:7b808fb9e025 35 void send_del_to_all();
Cheroukee 25:7b808fb9e025 36 void get_all_sensors();
Cheroukee 25:7b808fb9e025 37
Cheroukee 13:5f21dd134bd2 38 #if IS_COORDINATOR
Cheroukee 13:5f21dd134bd2 39 void coordinator();
Cheroukee 13:5f21dd134bd2 40 #else
Cheroukee 13:5f21dd134bd2 41 void routeur();
Cheroukee 13:5f21dd134bd2 42 #endif
Cheroukee 6:9ed8153f1328 43
Cheroukee 0:f468a460723d 44 int main() {
Cheroukee 2:a9bb12eefc08 45
Cheroukee 1:ea1b52d0a8a3 46 xbee_init();
Cheroukee 2:a9bb12eefc08 47
Cheroukee 13:5f21dd134bd2 48 #if IS_COORDINATOR
Cheroukee 13:5f21dd134bd2 49 coordinator();
Cheroukee 13:5f21dd134bd2 50 #else
Cheroukee 13:5f21dd134bd2 51 routeur();
Cheroukee 13:5f21dd134bd2 52 #endif
Cheroukee 13:5f21dd134bd2 53 }
Cheroukee 2:a9bb12eefc08 54
Cheroukee 2:a9bb12eefc08 55 #if IS_COORDINATOR
Cheroukee 13:5f21dd134bd2 56 void coordinator()
Cheroukee 16:0a5f3c449c95 57 {
Cheroukee 13:5f21dd134bd2 58 coordinator_config_t config = read_coordinator_config();
Cheroukee 16:0a5f3c449c95 59
Cheroukee 25:7b808fb9e025 60 EthernetInterface eth;
Cheroukee 25:7b808fb9e025 61 eth.init("192.168.3.3", "255.255.255.0", "192.168.3.2"); //Use DHCP
Cheroukee 25:7b808fb9e025 62 eth.connect();
Cheroukee 25:7b808fb9e025 63
Cheroukee 25:7b808fb9e025 64 Websocket ws(config.server_url);
Cheroukee 25:7b808fb9e025 65 ws.connect();
Cheroukee 25:7b808fb9e025 66
Cheroukee 14:cd488eba8bba 67 set_pan_id(config.pan_id);
Cheroukee 16:0a5f3c449c95 68
Cheroukee 12:1286b80c68f7 69 frame_t current_frame;
Cheroukee 25:7b808fb9e025 70
Cheroukee 25:7b808fb9e025 71 flipper.attach(&send_del_to_all, 1.0);
Cheroukee 13:5f21dd134bd2 72 while(1)
Cheroukee 13:5f21dd134bd2 73 {
Cheroukee 25:7b808fb9e025 74 ws.send("Allo");
Cheroukee 12:1286b80c68f7 75 bool finished_packet = receive(&current_frame, BUFFER_SIZE);
Cheroukee 13:5f21dd134bd2 76
Cheroukee 8:5955af1ee445 77 if (finished_packet)
Cheroukee 24:29ec42daa82e 78 {
Cheroukee 24:29ec42daa82e 79 process_frame(&current_frame);
Cheroukee 6:9ed8153f1328 80 }
Cheroukee 25:7b808fb9e025 81 wait_ms(1);
Cheroukee 13:5f21dd134bd2 82 }
Cheroukee 13:5f21dd134bd2 83 }
Cheroukee 12:1286b80c68f7 84 #else
Cheroukee 13:5f21dd134bd2 85 void routeur()
Cheroukee 13:5f21dd134bd2 86 {
Cheroukee 13:5f21dd134bd2 87 router_config_t config = read_router_config();
Cheroukee 25:7b808fb9e025 88
Cheroukee 14:cd488eba8bba 89 set_pan_id(config.pan_id);
Cheroukee 25:7b808fb9e025 90
Cheroukee 13:5f21dd134bd2 91 initialize_sensors();
Cheroukee 13:5f21dd134bd2 92
Cheroukee 25:7b808fb9e025 93 flipper.attach(&get_all_sensors, config.refresh_freq);
Cheroukee 25:7b808fb9e025 94
Cheroukee 25:7b808fb9e025 95 frame_t current_frame;
Cheroukee 13:5f21dd134bd2 96 while(1)
Cheroukee 25:7b808fb9e025 97 {
Cheroukee 25:7b808fb9e025 98 bool finished_packet = receive(&current_frame, BUFFER_SIZE);
Cheroukee 25:7b808fb9e025 99
Cheroukee 25:7b808fb9e025 100 if (finished_packet)
Cheroukee 25:7b808fb9e025 101 {
Cheroukee 25:7b808fb9e025 102 process_frame(&current_frame);
Cheroukee 25:7b808fb9e025 103 }
Cheroukee 25:7b808fb9e025 104 wait_ms(1);
Cheroukee 0:f468a460723d 105 }
Cheroukee 0:f468a460723d 106 }
Cheroukee 14:cd488eba8bba 107 #endif
Cheroukee 14:cd488eba8bba 108
Cheroukee 14:cd488eba8bba 109 void set_pan_id(long pan_id)
Cheroukee 14:cd488eba8bba 110 {
Cheroukee 14:cd488eba8bba 111 char pan_id_buffer[8] = {0};
Cheroukee 14:cd488eba8bba 112 for (int i = 0; i < 8; i++)
Cheroukee 14:cd488eba8bba 113 {
Cheroukee 14:cd488eba8bba 114 pan_id_buffer[i] = 0xFF & (pan_id >> 8 * (7 - i));
Cheroukee 14:cd488eba8bba 115 }
Cheroukee 14:cd488eba8bba 116 at_command_set('I', 'D', pan_id_buffer, 8);
Cheroukee 14:cd488eba8bba 117 }
Cheroukee 19:75e600a40741 118
Cheroukee 19:75e600a40741 119 int process_frame(frame_t* frame)
Cheroukee 19:75e600a40741 120 {
Cheroukee 19:75e600a40741 121 Serial pc(USBTX, USBRX); // tx, rx
Cheroukee 19:75e600a40741 122 if (frame->length <= 0)
Cheroukee 19:75e600a40741 123 {
Cheroukee 19:75e600a40741 124 return -1;
Cheroukee 19:75e600a40741 125 }
Cheroukee 19:75e600a40741 126 /*for (int i = 0; i < frame->length; i++)
Cheroukee 19:75e600a40741 127 {
Cheroukee 19:75e600a40741 128 char current = frame->buffer[i];
Cheroukee 19:75e600a40741 129 } */
Cheroukee 25:7b808fb9e025 130 if (frame->buffer[0] == 0x8B)
Cheroukee 25:7b808fb9e025 131 {
Cheroukee 25:7b808fb9e025 132 if(frame->buffer[5] != 0x00)
Cheroukee 25:7b808fb9e025 133 {
Cheroukee 25:7b808fb9e025 134 error_led = 1;
Cheroukee 25:7b808fb9e025 135 error_ticker.attach(&display_error, 1.0);
Cheroukee 25:7b808fb9e025 136 }
Cheroukee 25:7b808fb9e025 137 }
Cheroukee 25:7b808fb9e025 138 else if (frame->buffer[0] == 0x90)
Cheroukee 19:75e600a40741 139 {
Cheroukee 19:75e600a40741 140 // Manage source address
Cheroukee 19:75e600a40741 141 // Detect the source address and list it dynamically
JayMcGee 22:7edae38d0758 142 zigbee_addr_64_t temp_addr_64;
JayMcGee 22:7edae38d0758 143 bool already_exist = false;
JayMcGee 22:7edae38d0758 144 // Read 64 bit address that was in message
JayMcGee 22:7edae38d0758 145 temp_addr_64.addr_0 = frame->buffer[1];
JayMcGee 22:7edae38d0758 146 temp_addr_64.addr_1 = frame->buffer[2];
JayMcGee 22:7edae38d0758 147 temp_addr_64.addr_2 = frame->buffer[3];
JayMcGee 22:7edae38d0758 148 temp_addr_64.addr_3 = frame->buffer[4];
JayMcGee 22:7edae38d0758 149 temp_addr_64.addr_4 = frame->buffer[5];
JayMcGee 22:7edae38d0758 150 temp_addr_64.addr_5 = frame->buffer[6];
JayMcGee 22:7edae38d0758 151 temp_addr_64.addr_6 = frame->buffer[7];
JayMcGee 22:7edae38d0758 152 temp_addr_64.addr_7 = frame->buffer[8];
Cheroukee 19:75e600a40741 153
JayMcGee 22:7edae38d0758 154 // Verify if the received address is new
JayMcGee 22:7edae38d0758 155 for(int j = 0; j < last_addr_64_index; j++)
JayMcGee 22:7edae38d0758 156 {
JayMcGee 22:7edae38d0758 157 if(addr_64_equal(temp_addr_64,addr_64[j]))
JayMcGee 22:7edae38d0758 158 {
JayMcGee 22:7edae38d0758 159 already_exist = true;
JayMcGee 22:7edae38d0758 160 }
JayMcGee 22:7edae38d0758 161 }
JayMcGee 22:7edae38d0758 162
JayMcGee 22:7edae38d0758 163 // If it is New and our array isn't full of devices add it to the array
JayMcGee 22:7edae38d0758 164 if(!already_exist && last_addr_64_index < 255)
JayMcGee 22:7edae38d0758 165 {
JayMcGee 22:7edae38d0758 166 last_addr_64_index++;
JayMcGee 22:7edae38d0758 167 addr_64[last_addr_64_index] = temp_addr_64;
JayMcGee 22:7edae38d0758 168 }
JayMcGee 22:7edae38d0758 169
Cheroukee 19:75e600a40741 170 //Data starts at 12
Cheroukee 19:75e600a40741 171 for (int i = 12; i < frame->length; i++)
Cheroukee 19:75e600a40741 172 {
Cheroukee 19:75e600a40741 173 pc.putc(frame->buffer[i]);
Cheroukee 19:75e600a40741 174 }
Cheroukee 19:75e600a40741 175 }
Cheroukee 19:75e600a40741 176 return 0;
Cheroukee 25:7b808fb9e025 177 }
Cheroukee 25:7b808fb9e025 178
Cheroukee 25:7b808fb9e025 179 void send_del_to_all()
Cheroukee 25:7b808fb9e025 180 {
Cheroukee 25:7b808fb9e025 181 loop_led = !loop_led;
Cheroukee 25:7b808fb9e025 182 static bool flip = false;
Cheroukee 25:7b808fb9e025 183 flip = !flip;
Cheroukee 25:7b808fb9e025 184 for (int i = 0; i < last_addr_64_index; i++)
Cheroukee 25:7b808fb9e025 185 {
Cheroukee 25:7b808fb9e025 186 set_remote_xbee_dio4(flip, addr_64[i]);
Cheroukee 25:7b808fb9e025 187 }
Cheroukee 25:7b808fb9e025 188 }
Cheroukee 25:7b808fb9e025 189
Cheroukee 25:7b808fb9e025 190 void set_remote_xbee_dio4(bool set, zigbee_addr_64_t addr)
Cheroukee 25:7b808fb9e025 191 {
Cheroukee 25:7b808fb9e025 192 if (set)
Cheroukee 25:7b808fb9e025 193 {
Cheroukee 25:7b808fb9e025 194 remote_at_command_set(AT_COMMAND_DIO4_MSB, AT_COMMAND_DIO4_LSB,
Cheroukee 25:7b808fb9e025 195 AT_COMMAND_DIO_OUT_LOW, 0x02, addr);
Cheroukee 25:7b808fb9e025 196 }
Cheroukee 25:7b808fb9e025 197 else
Cheroukee 25:7b808fb9e025 198 {
Cheroukee 25:7b808fb9e025 199 remote_at_command_set(AT_COMMAND_DIO4_MSB, AT_COMMAND_DIO4_LSB,
Cheroukee 25:7b808fb9e025 200 AT_COMMAND_DIO_OUT_HIGH, 0x02, addr);
Cheroukee 25:7b808fb9e025 201 }
Cheroukee 25:7b808fb9e025 202 }
Cheroukee 25:7b808fb9e025 203
Cheroukee 25:7b808fb9e025 204 void get_all_sensors()
Cheroukee 25:7b808fb9e025 205 {
Cheroukee 25:7b808fb9e025 206 loop_led = !loop_led;
Cheroukee 25:7b808fb9e025 207 char sensor_buffer[64] = {};
Cheroukee 25:7b808fb9e025 208 DECLARE_ADDR64_COORD
Cheroukee 25:7b808fb9e025 209 DECLARE_ADDR16_UNKNOWN_OR_BCAST
Cheroukee 25:7b808fb9e025 210 for (int i = 0; i < 2; i++)
Cheroukee 25:7b808fb9e025 211 {
Cheroukee 25:7b808fb9e025 212 sensor_t sensor = (*p[i])();
Cheroukee 25:7b808fb9e025 213
Cheroukee 25:7b808fb9e025 214 if (sensor.sensor_type == 1)
Cheroukee 25:7b808fb9e025 215 {
Cheroukee 25:7b808fb9e025 216 sprintf(sensor_buffer, "button::%u\n\r", sensor.sensor_result.Bouton.etat != 0 ? 1 : 0);
Cheroukee 25:7b808fb9e025 217 transmit_request(sensor_buffer, 8 + 1 + 2, 0, USE_ADDR64_COORD, USE_ADDR16_UNKNOWN_OR_BCAST);
Cheroukee 25:7b808fb9e025 218 }
Cheroukee 25:7b808fb9e025 219 else if (sensor.sensor_type == 2)
Cheroukee 25:7b808fb9e025 220 {
Cheroukee 25:7b808fb9e025 221 sprintf(sensor_buffer, "accel::%3.2f%3.2f%3.2f\n\r", sensor.sensor_result.Accelerometre.x,
Cheroukee 25:7b808fb9e025 222 sensor.sensor_result.Accelerometre.y, sensor.sensor_result.Accelerometre.z);
Cheroukee 25:7b808fb9e025 223 transmit_request(sensor_buffer, 7 + 15 + 2, 0, USE_ADDR64_COORD, USE_ADDR16_UNKNOWN_OR_BCAST);
Cheroukee 25:7b808fb9e025 224 }
Cheroukee 25:7b808fb9e025 225 }
Cheroukee 25:7b808fb9e025 226 }
Cheroukee 25:7b808fb9e025 227
Cheroukee 25:7b808fb9e025 228 void display_error()
Cheroukee 25:7b808fb9e025 229 {
Cheroukee 25:7b808fb9e025 230 error_led = 0;
Cheroukee 25:7b808fb9e025 231 error_ticker.detach();
Cheroukee 25:7b808fb9e025 232 }