Code APP3
Dependencies: mbed EthernetInterface WebSocketClient mbed-rtos BufferedSerial
Fork of APP3_Lab by
main.cpp@25:7b808fb9e025, 2017-10-02 (annotated)
- 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?
User | Revision | Line number | New 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(¤t_frame, BUFFER_SIZE); |
Cheroukee | 13:5f21dd134bd2 | 76 | |
Cheroukee | 8:5955af1ee445 | 77 | if (finished_packet) |
Cheroukee | 24:29ec42daa82e | 78 | { |
Cheroukee | 24:29ec42daa82e | 79 | process_frame(¤t_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(¤t_frame, BUFFER_SIZE); |
Cheroukee | 25:7b808fb9e025 | 99 | |
Cheroukee | 25:7b808fb9e025 | 100 | if (finished_packet) |
Cheroukee | 25:7b808fb9e025 | 101 | { |
Cheroukee | 25:7b808fb9e025 | 102 | process_frame(¤t_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 | } |