Code APP3

Dependencies:   mbed EthernetInterface WebSocketClient mbed-rtos BufferedSerial

Fork of APP3_Lab by Jean-Philippe Fournier

Committer:
Cheroukee
Date:
Mon Oct 02 17:35:34 2017 +0000
Revision:
24:29ec42daa82e
Parent:
23:c3f25b511448
Child:
25:7b808fb9e025
Functional receive

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 24:29ec42daa82e 74 {
Cheroukee 24:29ec42daa82e 75 process_frame(&current_frame);
Cheroukee 6:9ed8153f1328 76 }
Cheroukee 12:1286b80c68f7 77
Cheroukee 21:04fae6a95131 78 //set_remote_xbee_dio4(toggle_led);
Cheroukee 13:5f21dd134bd2 79 toggle_led = !toggle_led;
Cheroukee 13:5f21dd134bd2 80
Cheroukee 15:c4d17caf0709 81 loop_led = !loop_led;
Cheroukee 24:29ec42daa82e 82 wait_ms(100);
Cheroukee 13:5f21dd134bd2 83 }
Cheroukee 13:5f21dd134bd2 84 }
Cheroukee 12:1286b80c68f7 85 #else
Cheroukee 13:5f21dd134bd2 86 void routeur()
Cheroukee 13:5f21dd134bd2 87 {
Cheroukee 13:5f21dd134bd2 88 router_config_t config = read_router_config();
Cheroukee 14:cd488eba8bba 89 set_pan_id(config.pan_id);
Cheroukee 13:5f21dd134bd2 90 char sensor_buffer[64] = {};
Cheroukee 13:5f21dd134bd2 91 initialize_sensors();
Cheroukee 13:5f21dd134bd2 92 DECLARE_ADDR64_COORD
Cheroukee 13:5f21dd134bd2 93 DECLARE_ADDR16_UNKNOWN_OR_BCAST
Cheroukee 13:5f21dd134bd2 94
Cheroukee 21:04fae6a95131 95 DigitalOut led_3(LED3);
Cheroukee 21:04fae6a95131 96 led_3 = 1;
Cheroukee 13:5f21dd134bd2 97 while(1)
Cheroukee 13:5f21dd134bd2 98 {
Cheroukee 21:04fae6a95131 99 for (int i = 0; i < 2; i++)
Cheroukee 21:04fae6a95131 100 {
Cheroukee 21:04fae6a95131 101 sensor_t sensor = (*p[i])();
Cheroukee 21:04fae6a95131 102
Cheroukee 21:04fae6a95131 103 if (sensor.sensor_type == 1)
Cheroukee 21:04fae6a95131 104 {
Cheroukee 21:04fae6a95131 105 sprintf(sensor_buffer, "button::%u\n\r", sensor.sensor_result.Bouton.etat != 0 ? 1 : 0);
Cheroukee 21:04fae6a95131 106 transmit_request(sensor_buffer, 8 + 1 + 2, 0, USE_ADDR64_COORD, USE_ADDR16_UNKNOWN_OR_BCAST);
Cheroukee 21:04fae6a95131 107 led_3 = !led_3;
Cheroukee 21:04fae6a95131 108 }
Cheroukee 21:04fae6a95131 109 else if (sensor.sensor_type == 2)
Cheroukee 21:04fae6a95131 110 {
Cheroukee 21:04fae6a95131 111 sprintf(sensor_buffer, "accel::%3.2f%3.2f%3.2f\n\r", sensor.sensor_result.Accelerometre.x,
Cheroukee 21:04fae6a95131 112 sensor.sensor_result.Accelerometre.y, sensor.sensor_result.Accelerometre.z);
Cheroukee 21:04fae6a95131 113 transmit_request(sensor_buffer, 7 + 15 + 2, 0, USE_ADDR64_COORD, USE_ADDR16_UNKNOWN_OR_BCAST);
Cheroukee 21:04fae6a95131 114 }
Cheroukee 21:04fae6a95131 115 }
Cheroukee 15:c4d17caf0709 116 loop_led = !loop_led;
Cheroukee 13:5f21dd134bd2 117 wait(config.refresh_freq);
Cheroukee 0:f468a460723d 118 }
Cheroukee 0:f468a460723d 119 }
Cheroukee 14:cd488eba8bba 120 #endif
Cheroukee 14:cd488eba8bba 121
Cheroukee 14:cd488eba8bba 122 void set_pan_id(long pan_id)
Cheroukee 14:cd488eba8bba 123 {
Cheroukee 14:cd488eba8bba 124 char pan_id_buffer[8] = {0};
Cheroukee 14:cd488eba8bba 125 for (int i = 0; i < 8; i++)
Cheroukee 14:cd488eba8bba 126 {
Cheroukee 14:cd488eba8bba 127 pan_id_buffer[i] = 0xFF & (pan_id >> 8 * (7 - i));
Cheroukee 14:cd488eba8bba 128 }
Cheroukee 14:cd488eba8bba 129 at_command_set('I', 'D', pan_id_buffer, 8);
Cheroukee 14:cd488eba8bba 130 }
Cheroukee 19:75e600a40741 131
Cheroukee 19:75e600a40741 132 int process_frame(frame_t* frame)
Cheroukee 19:75e600a40741 133 {
Cheroukee 19:75e600a40741 134 Serial pc(USBTX, USBRX); // tx, rx
Cheroukee 19:75e600a40741 135 if (frame->length <= 0)
Cheroukee 19:75e600a40741 136 {
Cheroukee 19:75e600a40741 137 return -1;
Cheroukee 19:75e600a40741 138 }
Cheroukee 19:75e600a40741 139 /*for (int i = 0; i < frame->length; i++)
Cheroukee 19:75e600a40741 140 {
Cheroukee 19:75e600a40741 141 char current = frame->buffer[i];
Cheroukee 19:75e600a40741 142 } */
Cheroukee 19:75e600a40741 143 if (frame->buffer[0] == 0x90)
Cheroukee 19:75e600a40741 144 {
Cheroukee 19:75e600a40741 145 // Manage source address
Cheroukee 19:75e600a40741 146 // Detect the source address and list it dynamically
JayMcGee 22:7edae38d0758 147 zigbee_addr_64_t temp_addr_64;
JayMcGee 22:7edae38d0758 148 bool already_exist = false;
JayMcGee 22:7edae38d0758 149 // Read 64 bit address that was in message
JayMcGee 22:7edae38d0758 150 temp_addr_64.addr_0 = frame->buffer[1];
JayMcGee 22:7edae38d0758 151 temp_addr_64.addr_1 = frame->buffer[2];
JayMcGee 22:7edae38d0758 152 temp_addr_64.addr_2 = frame->buffer[3];
JayMcGee 22:7edae38d0758 153 temp_addr_64.addr_3 = frame->buffer[4];
JayMcGee 22:7edae38d0758 154 temp_addr_64.addr_4 = frame->buffer[5];
JayMcGee 22:7edae38d0758 155 temp_addr_64.addr_5 = frame->buffer[6];
JayMcGee 22:7edae38d0758 156 temp_addr_64.addr_6 = frame->buffer[7];
JayMcGee 22:7edae38d0758 157 temp_addr_64.addr_7 = frame->buffer[8];
Cheroukee 19:75e600a40741 158
JayMcGee 22:7edae38d0758 159 // Verify if the received address is new
JayMcGee 22:7edae38d0758 160 for(int j = 0; j < last_addr_64_index; j++)
JayMcGee 22:7edae38d0758 161 {
JayMcGee 22:7edae38d0758 162 if(addr_64_equal(temp_addr_64,addr_64[j]))
JayMcGee 22:7edae38d0758 163 {
JayMcGee 22:7edae38d0758 164 already_exist = true;
JayMcGee 22:7edae38d0758 165 }
JayMcGee 22:7edae38d0758 166 }
JayMcGee 22:7edae38d0758 167
JayMcGee 22:7edae38d0758 168 // If it is New and our array isn't full of devices add it to the array
JayMcGee 22:7edae38d0758 169 if(!already_exist && last_addr_64_index < 255)
JayMcGee 22:7edae38d0758 170 {
JayMcGee 22:7edae38d0758 171 last_addr_64_index++;
JayMcGee 22:7edae38d0758 172 addr_64[last_addr_64_index] = temp_addr_64;
JayMcGee 22:7edae38d0758 173 }
JayMcGee 22:7edae38d0758 174
Cheroukee 19:75e600a40741 175 //Data starts at 12
Cheroukee 19:75e600a40741 176 for (int i = 12; i < frame->length; i++)
Cheroukee 19:75e600a40741 177 {
Cheroukee 19:75e600a40741 178 pc.putc(frame->buffer[i]);
Cheroukee 19:75e600a40741 179 }
Cheroukee 19:75e600a40741 180 }
Cheroukee 19:75e600a40741 181 return 0;
Cheroukee 19:75e600a40741 182 }