NerfUS / NerfUSXbee

Dependents:   NerfUS-Coord NerfUSTarget

Fork of APP3_xbee by Team APP

Committer:
GaiSensei
Date:
Wed Mar 29 17:00:14 2017 +0000
Revision:
15:ab3e0d32e578
Parent:
14:cc65f603e659
Transmitter done, receiver coded but not tested

Who changed what in which revision?

UserRevisionLine numberNew contents of line
GaiSensei 13:b5d0f491d465 1 /////////////////////////////////////////////////////////////
GaiSensei 13:b5d0f491d465 2 // APP 3 //
GaiSensei 13:b5d0f491d465 3 // //
GaiSensei 13:b5d0f491d465 4 // Université de Sherbrooke //
GaiSensei 13:b5d0f491d465 5 // Génie informatique //
GaiSensei 13:b5d0f491d465 6 // Session 5, Hiver 2017 //
GaiSensei 13:b5d0f491d465 7 // //
GaiSensei 13:b5d0f491d465 8 // Date: 14 février 2017 //
GaiSensei 13:b5d0f491d465 9 // //
GaiSensei 13:b5d0f491d465 10 // Auteurs: Maxime Dupuis, dupm2216 //
GaiSensei 13:b5d0f491d465 11 // Bruno Allaire-Lemay, allb2701 //
GaiSensei 13:b5d0f491d465 12 /////////////////////////////////////////////////////////////
GaiSensei 13:b5d0f491d465 13
dupm2216 0:8f5379c94a69 14 #include "xbee.h"
dupm2216 4:e97cfe6cc18c 15 #include <cassert>
dupm2216 0:8f5379c94a69 16
dupm2216 8:b9c096965c00 17
dupm2216 8:b9c096965c00 18
dupm2216 0:8f5379c94a69 19 DigitalOut led_1(LED1);
dupm2216 8:b9c096965c00 20 Mail<ingoing_value_t, 30> parsed_frames;
dupm2216 0:8f5379c94a69 21 RawSerial xbee(p13, p14);
GaiSensei 7:c65c4c98d237 22 Mutex mutex;
dupm2216 9:04063c29ab43 23 DigitalOut error_led(p6);
dupm2216 9:04063c29ab43 24 Thread error_led_thread;
dupm2216 9:04063c29ab43 25
dupm2216 9:04063c29ab43 26
dupm2216 0:8f5379c94a69 27 const int FRAME_SPECIFIC_DATA_BEGIN[14] = {0x10, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFE, 0x00, 0x00};
dupm2216 5:cd3c79853dc8 28 const int AT_COMMAND_LED_FRAME_SPECIFIC_DATA_BEGIN[15] = {0x17, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFE, 0x02, 0x50, 0x32};
dupm2216 5:cd3c79853dc8 29 const char LED_COMMAND_POWER_ON = 0x05;
dupm2216 5:cd3c79853dc8 30 const char LED_COMMAND_POWER_OFF = 0x04;
dupm2216 0:8f5379c94a69 31 const int RECEIVE_PACKET_MESSAGE_START_INDEX = 15;
dupm2216 0:8f5379c94a69 32
dupm2216 0:8f5379c94a69 33 const char START_DELIMITER = 0x7E;
dupm2216 0:8f5379c94a69 34
GaiSensei 7:c65c4c98d237 35 bool is_character_that_needs_escape(const char character)
GaiSensei 7:c65c4c98d237 36 {
GaiSensei 7:c65c4c98d237 37 //printf("%X\r\n", character);
GaiSensei 7:c65c4c98d237 38 switch(character)
GaiSensei 7:c65c4c98d237 39 {
GaiSensei 7:c65c4c98d237 40 case 0x7E: return true;
GaiSensei 7:c65c4c98d237 41 case 0x7D: return true;
GaiSensei 7:c65c4c98d237 42 case 0x11: return true;
GaiSensei 7:c65c4c98d237 43 case 0x13: return true;
GaiSensei 7:c65c4c98d237 44 default: return false;
GaiSensei 7:c65c4c98d237 45 }
GaiSensei 7:c65c4c98d237 46 }
GaiSensei 7:c65c4c98d237 47
dupm2216 0:8f5379c94a69 48 void send_message_via_xbee(const char* message, const int length)
dupm2216 0:8f5379c94a69 49 {
GaiSensei 7:c65c4c98d237 50 //printf("send_message_via_xbee\r\n");
dupm2216 0:8f5379c94a69 51 const vector<char> transmit_request = generate_transmit_request(message, length);
dupm2216 0:8f5379c94a69 52
GaiSensei 7:c65c4c98d237 53 mutex.lock();
dupm2216 0:8f5379c94a69 54 for(int i=0; i<transmit_request.size(); i++)
dupm2216 0:8f5379c94a69 55 {
GaiSensei 7:c65c4c98d237 56 assert( i==0 || !is_character_that_needs_escape(transmit_request[i]));
dupm2216 0:8f5379c94a69 57 xbee.putc(transmit_request[i]);
dupm2216 0:8f5379c94a69 58 }
GaiSensei 7:c65c4c98d237 59 mutex.unlock();
dupm2216 0:8f5379c94a69 60 }
dupm2216 0:8f5379c94a69 61
dupm2216 0:8f5379c94a69 62 vector<char> generate_transmit_request(const char* message, const int length)
dupm2216 0:8f5379c94a69 63 {
dupm2216 0:8f5379c94a69 64 vector<char> request;
dupm2216 0:8f5379c94a69 65
dupm2216 0:8f5379c94a69 66 unsigned char checksum = 0xFF;
dupm2216 0:8f5379c94a69 67
dupm2216 0:8f5379c94a69 68 request.push_back(START_DELIMITER);
dupm2216 0:8f5379c94a69 69
dupm2216 0:8f5379c94a69 70 const uint16_t frame_length = 0x0E + length;
dupm2216 0:8f5379c94a69 71 const uint8_t frame_length_msb = frame_length >> 8;
dupm2216 0:8f5379c94a69 72 const uint8_t frame_length_lsb = (frame_length << 8) >> 8;
dupm2216 0:8f5379c94a69 73 request.push_back(frame_length_msb);
dupm2216 0:8f5379c94a69 74 request.push_back(frame_length_lsb);
dupm2216 0:8f5379c94a69 75
dupm2216 0:8f5379c94a69 76 for(int i=0; i<14; i++)
dupm2216 0:8f5379c94a69 77 {
dupm2216 0:8f5379c94a69 78 request.push_back(FRAME_SPECIFIC_DATA_BEGIN[i]);
dupm2216 0:8f5379c94a69 79 checksum -= FRAME_SPECIFIC_DATA_BEGIN[i];
dupm2216 0:8f5379c94a69 80 }
dupm2216 0:8f5379c94a69 81
dupm2216 0:8f5379c94a69 82 for(int i=0; i<length; i++)
dupm2216 0:8f5379c94a69 83 {
dupm2216 0:8f5379c94a69 84 request.push_back(message[i]);
dupm2216 0:8f5379c94a69 85 checksum -= message[i];
dupm2216 0:8f5379c94a69 86 }
dupm2216 0:8f5379c94a69 87
dupm2216 0:8f5379c94a69 88 request.push_back(checksum);
dupm2216 0:8f5379c94a69 89
dupm2216 0:8f5379c94a69 90 return request;
dupm2216 0:8f5379c94a69 91 }
dupm2216 0:8f5379c94a69 92
dupm2216 5:cd3c79853dc8 93 vector<char> generate_led_command(const bool power_on)
dupm2216 5:cd3c79853dc8 94 {
dupm2216 5:cd3c79853dc8 95 vector<char> request;
dupm2216 5:cd3c79853dc8 96
dupm2216 5:cd3c79853dc8 97 unsigned char checksum = 0xFF;
dupm2216 5:cd3c79853dc8 98
dupm2216 5:cd3c79853dc8 99 request.push_back(START_DELIMITER);
dupm2216 5:cd3c79853dc8 100
dupm2216 5:cd3c79853dc8 101 const uint16_t frame_length = 0x10;
dupm2216 5:cd3c79853dc8 102 const uint8_t frame_length_msb = frame_length >> 8;
dupm2216 5:cd3c79853dc8 103 const uint8_t frame_length_lsb = (frame_length << 8) >> 8;
dupm2216 5:cd3c79853dc8 104 request.push_back(frame_length_msb);
dupm2216 5:cd3c79853dc8 105 request.push_back(frame_length_lsb);
dupm2216 5:cd3c79853dc8 106
dupm2216 5:cd3c79853dc8 107 for(int i=0; i<15; i++)
dupm2216 5:cd3c79853dc8 108 {
dupm2216 5:cd3c79853dc8 109 request.push_back(AT_COMMAND_LED_FRAME_SPECIFIC_DATA_BEGIN[i]);
dupm2216 5:cd3c79853dc8 110 checksum -= AT_COMMAND_LED_FRAME_SPECIFIC_DATA_BEGIN[i];
dupm2216 5:cd3c79853dc8 111 }
dupm2216 5:cd3c79853dc8 112
dupm2216 5:cd3c79853dc8 113 const char led_power_state = power_on ? LED_COMMAND_POWER_ON : LED_COMMAND_POWER_OFF;
dupm2216 5:cd3c79853dc8 114 request.push_back(led_power_state);
dupm2216 5:cd3c79853dc8 115 checksum -= led_power_state;
dupm2216 5:cd3c79853dc8 116
dupm2216 5:cd3c79853dc8 117 request.push_back(checksum);
dupm2216 5:cd3c79853dc8 118
dupm2216 5:cd3c79853dc8 119 return request;
dupm2216 5:cd3c79853dc8 120 }
dupm2216 5:cd3c79853dc8 121
dupm2216 0:8f5379c94a69 122 void read_frame()
dupm2216 0:8f5379c94a69 123 {
dupm2216 0:8f5379c94a69 124 while(true)
dupm2216 0:8f5379c94a69 125 {
dupm2216 0:8f5379c94a69 126 while(xbee.getc() != 0x7E);
dupm2216 0:8f5379c94a69 127
dupm2216 0:8f5379c94a69 128 vector<char> frame;
dupm2216 0:8f5379c94a69 129
dupm2216 0:8f5379c94a69 130 frame.push_back(0x7E);
dupm2216 0:8f5379c94a69 131
dupm2216 0:8f5379c94a69 132 const uint8_t frame_size_msb = xbee.getc();
dupm2216 0:8f5379c94a69 133 const uint8_t frame_size_lsb = xbee.getc();
dupm2216 0:8f5379c94a69 134 frame.push_back(frame_size_msb);
dupm2216 0:8f5379c94a69 135 frame.push_back(frame_size_lsb);
dupm2216 0:8f5379c94a69 136 const uint16_t frame_size = (frame_size_msb << 8) + frame_size_lsb;
dupm2216 0:8f5379c94a69 137
dupm2216 0:8f5379c94a69 138 for(int i=0; i<frame_size + 1; i++)
dupm2216 0:8f5379c94a69 139 {
dupm2216 0:8f5379c94a69 140 frame.push_back(xbee.getc());
dupm2216 0:8f5379c94a69 141 }
dupm2216 4:e97cfe6cc18c 142
dupm2216 4:e97cfe6cc18c 143 handle_frame(frame);
dupm2216 0:8f5379c94a69 144 }
dupm2216 0:8f5379c94a69 145 }
dupm2216 0:8f5379c94a69 146
dupm2216 3:37ea92feece2 147 vector<char> parse_receive_packet(const vector<char>& frame)
dupm2216 0:8f5379c94a69 148 {
dupm2216 3:37ea92feece2 149 vector<char>::const_iterator first = frame.begin() + RECEIVE_PACKET_MESSAGE_START_INDEX;
dupm2216 3:37ea92feece2 150 vector<char>::const_iterator last = frame.end() - 1;
dupm2216 0:8f5379c94a69 151 vector<char> message(first, last);
dupm2216 0:8f5379c94a69 152 return message;
dupm2216 0:8f5379c94a69 153 }
dupm2216 0:8f5379c94a69 154
dupm2216 3:37ea92feece2 155 vector<char> parse_transmit_status(const vector<char>& frame)
dupm2216 3:37ea92feece2 156 {
dupm2216 3:37ea92feece2 157 vector<char> relevant_content;
dupm2216 3:37ea92feece2 158
dupm2216 3:37ea92feece2 159 const char delivery_status = frame.at(8);
dupm2216 3:37ea92feece2 160 relevant_content.push_back(delivery_status);
dupm2216 3:37ea92feece2 161
dupm2216 3:37ea92feece2 162 return relevant_content;
dupm2216 3:37ea92feece2 163 }
dupm2216 3:37ea92feece2 164
dupm2216 3:37ea92feece2 165 vector<char> parse_at_command_response(const vector<char>& frame)
dupm2216 3:37ea92feece2 166 {
dupm2216 3:37ea92feece2 167 vector<char> relevant_content;
dupm2216 3:37ea92feece2 168
dupm2216 3:37ea92feece2 169 const char command_status = frame.at(7);
dupm2216 3:37ea92feece2 170 relevant_content.push_back(command_status);
dupm2216 3:37ea92feece2 171
dupm2216 3:37ea92feece2 172 return relevant_content;
dupm2216 3:37ea92feece2 173 }
dupm2216 3:37ea92feece2 174
dupm2216 9:04063c29ab43 175 vector<char> parse_remote_command_response(const vector<char>& frame)
dupm2216 9:04063c29ab43 176 {
dupm2216 9:04063c29ab43 177 vector<char> relevant_content;
dupm2216 9:04063c29ab43 178
dupm2216 9:04063c29ab43 179 const char command_status = frame.at(17);
dupm2216 9:04063c29ab43 180 relevant_content.push_back(command_status);
dupm2216 9:04063c29ab43 181
dupm2216 9:04063c29ab43 182 return relevant_content;
dupm2216 9:04063c29ab43 183 }
dupm2216 9:04063c29ab43 184
dupm2216 9:04063c29ab43 185 void manage_error_led()
dupm2216 9:04063c29ab43 186 {
dupm2216 9:04063c29ab43 187 while(true)
dupm2216 9:04063c29ab43 188 {
dupm2216 9:04063c29ab43 189 osSignalWait(0x1, osWaitForever);
dupm2216 9:04063c29ab43 190 error_led = 1;
dupm2216 9:04063c29ab43 191 wait_ms(1000);
dupm2216 9:04063c29ab43 192 error_led = 0;
dupm2216 9:04063c29ab43 193 }
dupm2216 9:04063c29ab43 194 }
dupm2216 9:04063c29ab43 195
dupm2216 9:04063c29ab43 196 void send_blink_led_at_command(const bool toggle_current_command)
dupm2216 9:04063c29ab43 197 {
dupm2216 9:04063c29ab43 198 static bool is_current_command_turn_on = false;
dupm2216 9:04063c29ab43 199 if(toggle_current_command)
dupm2216 9:04063c29ab43 200 {
dupm2216 9:04063c29ab43 201 is_current_command_turn_on = !is_current_command_turn_on;
dupm2216 9:04063c29ab43 202 }
dupm2216 9:04063c29ab43 203
dupm2216 9:04063c29ab43 204 const vector<char> led_command = generate_led_command(is_current_command_turn_on);
dupm2216 9:04063c29ab43 205 for(int i=0; i<led_command.size(); i++)
dupm2216 9:04063c29ab43 206 {
dupm2216 9:04063c29ab43 207 xbee.putc(led_command[i]);
dupm2216 9:04063c29ab43 208 }
dupm2216 9:04063c29ab43 209 }
dupm2216 9:04063c29ab43 210
dupm2216 4:e97cfe6cc18c 211 void handle_parsed_frames_from_mailbox()
dupm2216 0:8f5379c94a69 212 {
dupm2216 0:8f5379c94a69 213 while(true)
dupm2216 0:8f5379c94a69 214 {
dupm2216 4:e97cfe6cc18c 215 osEvent event = parsed_frames.get();
dupm2216 4:e97cfe6cc18c 216 assert(event.status == osEventMail);
dupm2216 4:e97cfe6cc18c 217
dupm2216 8:b9c096965c00 218 ingoing_value_t *parsed_frame = (ingoing_value_t*)event.value.p;
dupm2216 4:e97cfe6cc18c 219
dupm2216 8:b9c096965c00 220 const char parsed_frame_type = parsed_frame->content[0];
dupm2216 8:b9c096965c00 221 switch(parsed_frame_type)
dupm2216 8:b9c096965c00 222 {
dupm2216 8:b9c096965c00 223 case FRAME_TYPE_RECEIVE_PACKET:
GaiSensei 15:ab3e0d32e578 224 parse_nerfus_message(ingoing_value_to_vector(*parsed_frame));
dupm2216 8:b9c096965c00 225 break;
dupm2216 9:04063c29ab43 226
dupm2216 9:04063c29ab43 227 case FRAME_TYPE_REMOTE_COMMAND_RESPONSE:
dupm2216 9:04063c29ab43 228 const bool is_status_ok = (parsed_frame->content[1] == 0);
dupm2216 9:04063c29ab43 229 if(!is_status_ok)
dupm2216 9:04063c29ab43 230 {
dupm2216 9:04063c29ab43 231 error_led_thread.signal_set(0x1);
dupm2216 9:04063c29ab43 232 send_blink_led_at_command(false);
dupm2216 9:04063c29ab43 233 }
dupm2216 9:04063c29ab43 234 break;
dupm2216 8:b9c096965c00 235
dupm2216 8:b9c096965c00 236 default:
dupm2216 9:04063c29ab43 237 printf("Unsupported. Type: %d\r\n", parsed_frame_type);
dupm2216 8:b9c096965c00 238 break;
dupm2216 8:b9c096965c00 239 }
dupm2216 8:b9c096965c00 240
dupm2216 8:b9c096965c00 241 parsed_frames.free(parsed_frame);
dupm2216 8:b9c096965c00 242 }
dupm2216 8:b9c096965c00 243 }
dupm2216 4:e97cfe6cc18c 244
dupm2216 8:b9c096965c00 245 vector<char> ingoing_value_to_vector(const ingoing_value_t& value)
dupm2216 8:b9c096965c00 246 {
dupm2216 8:b9c096965c00 247 vector<char> result;
dupm2216 8:b9c096965c00 248 for(int i=0; i<value.size; i++)
dupm2216 8:b9c096965c00 249 {
dupm2216 8:b9c096965c00 250 result.push_back(value.content[i]);
dupm2216 0:8f5379c94a69 251 }
dupm2216 8:b9c096965c00 252 return result;
dupm2216 3:37ea92feece2 253 }
dupm2216 3:37ea92feece2 254
dupm2216 4:e97cfe6cc18c 255 void handle_frame(const vector<char>& frame)
dupm2216 4:e97cfe6cc18c 256 {
dupm2216 8:b9c096965c00 257 ingoing_value_t *parsed_frame = parsed_frames.alloc();
dupm2216 8:b9c096965c00 258
dupm2216 8:b9c096965c00 259 const vector<char> parsed_frame_vector = parse_frame(frame);
dupm2216 8:b9c096965c00 260 for(int i=0; i<parsed_frame_vector.size(); i++)
dupm2216 8:b9c096965c00 261 {
dupm2216 8:b9c096965c00 262 parsed_frame->content[i] = parsed_frame_vector.at(i);
dupm2216 8:b9c096965c00 263 }
dupm2216 8:b9c096965c00 264 parsed_frame->size = parsed_frame_vector.size();
dupm2216 8:b9c096965c00 265
dupm2216 4:e97cfe6cc18c 266 parsed_frames.put(parsed_frame);
dupm2216 4:e97cfe6cc18c 267 }
dupm2216 4:e97cfe6cc18c 268
dupm2216 3:37ea92feece2 269 vector<char> parse_frame(const vector<char>& frame)
dupm2216 3:37ea92feece2 270 {
dupm2216 3:37ea92feece2 271 vector<char> parsed_frame;
dupm2216 3:37ea92feece2 272
dupm2216 3:37ea92feece2 273 const char frame_type = frame.at(3);
dupm2216 3:37ea92feece2 274 parsed_frame.push_back(frame_type);
dupm2216 3:37ea92feece2 275
dupm2216 3:37ea92feece2 276 vector<char> parsed_frame_relevant_content;
dupm2216 3:37ea92feece2 277
dupm2216 3:37ea92feece2 278 switch(frame_type)
dupm2216 3:37ea92feece2 279 {
dupm2216 3:37ea92feece2 280 case FRAME_TYPE_RECEIVE_PACKET:
dupm2216 3:37ea92feece2 281 {
dupm2216 3:37ea92feece2 282 parsed_frame_relevant_content = parse_receive_packet(frame);
dupm2216 3:37ea92feece2 283 break;
dupm2216 3:37ea92feece2 284 }
dupm2216 3:37ea92feece2 285 case FRAME_TYPE_TRANSMIT_STATUS:
dupm2216 3:37ea92feece2 286 {
dupm2216 3:37ea92feece2 287 parsed_frame_relevant_content = parse_transmit_status(frame);
dupm2216 3:37ea92feece2 288 break;
dupm2216 3:37ea92feece2 289 }
dupm2216 3:37ea92feece2 290 case FRAME_TYPE_AT_COMMAND_RESPONSE:
dupm2216 3:37ea92feece2 291 {
dupm2216 3:37ea92feece2 292 parsed_frame_relevant_content = parse_at_command_response(frame);
dupm2216 3:37ea92feece2 293 break;
dupm2216 3:37ea92feece2 294 }
dupm2216 9:04063c29ab43 295 case FRAME_TYPE_REMOTE_COMMAND_RESPONSE:
dupm2216 9:04063c29ab43 296 {
dupm2216 9:04063c29ab43 297 parsed_frame_relevant_content = parse_remote_command_response(frame);
dupm2216 9:04063c29ab43 298 break;
dupm2216 9:04063c29ab43 299 }
dupm2216 9:04063c29ab43 300 default:
dupm2216 9:04063c29ab43 301 printf("Unsupported frame:\r\n");
dupm2216 9:04063c29ab43 302 for(int i=0; i<frame.size(); i++)
dupm2216 9:04063c29ab43 303 {
dupm2216 9:04063c29ab43 304 printf("Bit #%d: %d\r\n", i, frame.at(i));
dupm2216 9:04063c29ab43 305 }
dupm2216 3:37ea92feece2 306 }
dupm2216 3:37ea92feece2 307
dupm2216 3:37ea92feece2 308 for(vector<char>::iterator it = parsed_frame_relevant_content.begin(); it < parsed_frame_relevant_content.end(); it++)
dupm2216 3:37ea92feece2 309 {
dupm2216 3:37ea92feece2 310 parsed_frame.push_back(*it);
dupm2216 3:37ea92feece2 311 }
dupm2216 3:37ea92feece2 312
dupm2216 3:37ea92feece2 313 return parsed_frame;
dupm2216 3:37ea92feece2 314 }
dupm2216 6:b70f32a80d51 315
GaiSensei 15:ab3e0d32e578 316 void parse_nerfus_message(const vector<char>& parsed_frame)
dupm2216 6:b70f32a80d51 317 {
GaiSensei 15:ab3e0d32e578 318 vector<uint8_t> message;
GaiSensei 15:ab3e0d32e578 319 message.push_back(0x97);
GaiSensei 15:ab3e0d32e578 320
dupm2216 6:b70f32a80d51 321 const char event_type = parsed_frame[1];
dupm2216 6:b70f32a80d51 322 switch(event_type)
dupm2216 6:b70f32a80d51 323 {
GaiSensei 15:ab3e0d32e578 324 case EVENT_TYPE_COORDINATOR_TO_ROUTER
GaiSensei 15:ab3e0d32e578 325 parse_coordinator_command(message);
dupm2216 6:b70f32a80d51 326 break;
dupm2216 6:b70f32a80d51 327
GaiSensei 15:ab3e0d32e578 328 case EVENT_TYPE_ROUTOR_TO_COORDINATOR:
GaiSensei 15:ab3e0d32e578 329 parse_routor_message(message);
dupm2216 6:b70f32a80d51 330 break;
dupm2216 6:b70f32a80d51 331 }
dupm2216 6:b70f32a80d51 332 }
dupm2216 6:b70f32a80d51 333
GaiSensei 15:ab3e0d32e578 334 void parse_coordinator_command(vector<uint8_t> coordinator_command)
GaiSensei 15:ab3e0d32e578 335 {
GaiSensei 15:ab3e0d32e578 336 coordinator_command.push_back(parsed_frame[2]);
GaiSensei 15:ab3e0d32e578 337 coordinator_command.push_back(parsed_frame[3]);
GaiSensei 15:ab3e0d32e578 338 coordinator_command.push_back(parsed_frame[4]);
GaiSensei 15:ab3e0d32e578 339 coordinator_command.push_back(parsed_frame[5]);
GaiSensei 15:ab3e0d32e578 340
GaiSensei 15:ab3e0d32e578 341 //Appeler fonction Max
GaiSensei 15:ab3e0d32e578 342 }
GaiSensei 15:ab3e0d32e578 343
GaiSensei 15:ab3e0d32e578 344 void parse_routor_message(vector<uint8_t> routor_message)
GaiSensei 15:ab3e0d32e578 345 {
GaiSensei 15:ab3e0d32e578 346 coordinator_command.push_back(parsed_frame[2]);
GaiSensei 15:ab3e0d32e578 347 coordinator_command.push_back(parsed_frame[3]);
GaiSensei 15:ab3e0d32e578 348 coordinator_command.push_back(parsed_frame[4]);
GaiSensei 15:ab3e0d32e578 349 coordinator_command.push_back(parsed_frame[5]);
GaiSensei 15:ab3e0d32e578 350
GaiSensei 15:ab3e0d32e578 351 //Appeler fonction Ismaël
GaiSensei 15:ab3e0d32e578 352 }
GaiSensei 15:ab3e0d32e578 353
dupm2216 6:b70f32a80d51 354 void parsed_button_event_frame_to_string(const vector<char>& parsed_frame, char* readable_string_output)
dupm2216 6:b70f32a80d51 355 {
dupm2216 6:b70f32a80d51 356 const char button_state = parsed_frame[2];
dupm2216 6:b70f32a80d51 357 switch(button_state)
dupm2216 6:b70f32a80d51 358 {
dupm2216 8:b9c096965c00 359 case BUTTON_RELEASED:
dupm2216 6:b70f32a80d51 360 strcpy(readable_string_output, "Button state: released");
dupm2216 6:b70f32a80d51 361 break;
dupm2216 6:b70f32a80d51 362
dupm2216 8:b9c096965c00 363 case BUTTON_PRESSED:
dupm2216 6:b70f32a80d51 364 strcpy(readable_string_output, "Button state: pressed");
dupm2216 6:b70f32a80d51 365 break;
dupm2216 6:b70f32a80d51 366
dupm2216 6:b70f32a80d51 367 default:
dupm2216 6:b70f32a80d51 368 strcpy(readable_string_output, "Button state: invalid state");
dupm2216 6:b70f32a80d51 369 break;
dupm2216 6:b70f32a80d51 370 }
dupm2216 6:b70f32a80d51 371 }
dupm2216 6:b70f32a80d51 372
dupm2216 6:b70f32a80d51 373 void parsed_accelerometer_event_frame_to_string(const vector<char>& parsed_frame, char* readable_string_output)
dupm2216 6:b70f32a80d51 374 {
dupm2216 6:b70f32a80d51 375 const uint8_t x = parsed_frame[2];
dupm2216 6:b70f32a80d51 376 const uint8_t y = parsed_frame[3];
dupm2216 6:b70f32a80d51 377 const uint8_t z = parsed_frame[4];
dupm2216 6:b70f32a80d51 378 sprintf(readable_string_output, "Accelerometer state: x=0x%X, y=0x%X, z=0x%X", x, y, z);
GaiSensei 11:d3811e37d89c 379 }
GaiSensei 11:d3811e37d89c 380
GaiSensei 11:d3811e37d89c 381 vector<string> read_file(string path)
GaiSensei 11:d3811e37d89c 382 {
GaiSensei 11:d3811e37d89c 383 LocalFileSystem local("local");
GaiSensei 11:d3811e37d89c 384 vector<string> result;
GaiSensei 11:d3811e37d89c 385 char buffer[128] = "";
GaiSensei 11:d3811e37d89c 386 FILE *fp = fopen(path.c_str(), "r");
GaiSensei 11:d3811e37d89c 387 bool ret = (fgets(buffer, 64, fp)) ;
GaiSensei 11:d3811e37d89c 388
GaiSensei 11:d3811e37d89c 389 string value(buffer);
GaiSensei 11:d3811e37d89c 390 string first_value = "";
GaiSensei 11:d3811e37d89c 391 string second_value = "";
GaiSensei 11:d3811e37d89c 392 bool which_value = true;
GaiSensei 11:d3811e37d89c 393
GaiSensei 11:d3811e37d89c 394 for(int i=0; i<value.size(); i++)
GaiSensei 11:d3811e37d89c 395 {
GaiSensei 11:d3811e37d89c 396 if(buffer[i] == ';')
GaiSensei 11:d3811e37d89c 397 {
GaiSensei 11:d3811e37d89c 398 which_value = false;
GaiSensei 11:d3811e37d89c 399 }
GaiSensei 11:d3811e37d89c 400 else
GaiSensei 11:d3811e37d89c 401 {
GaiSensei 11:d3811e37d89c 402 if(which_value)
GaiSensei 11:d3811e37d89c 403 {
GaiSensei 11:d3811e37d89c 404 first_value += buffer[i];
GaiSensei 11:d3811e37d89c 405 }
GaiSensei 11:d3811e37d89c 406 else
GaiSensei 11:d3811e37d89c 407 {
GaiSensei 11:d3811e37d89c 408 second_value += buffer[i];
GaiSensei 11:d3811e37d89c 409 }
GaiSensei 11:d3811e37d89c 410 }
GaiSensei 11:d3811e37d89c 411 }
GaiSensei 11:d3811e37d89c 412 result.push_back(first_value);
GaiSensei 11:d3811e37d89c 413 result.push_back(second_value);
GaiSensei 11:d3811e37d89c 414 return result;
GaiSensei 11:d3811e37d89c 415 }
GaiSensei 11:d3811e37d89c 416
GaiSensei 11:d3811e37d89c 417 char hexa_char_to_dec(char hexa_char)
GaiSensei 11:d3811e37d89c 418 {
GaiSensei 11:d3811e37d89c 419 if('0' <= hexa_char && hexa_char <= '9')
GaiSensei 11:d3811e37d89c 420 {
GaiSensei 11:d3811e37d89c 421 return hexa_char - 48;
GaiSensei 11:d3811e37d89c 422 }
GaiSensei 11:d3811e37d89c 423 if('A' <= hexa_char && hexa_char <= 'F')
GaiSensei 11:d3811e37d89c 424 {
GaiSensei 11:d3811e37d89c 425 return hexa_char - 55;
GaiSensei 11:d3811e37d89c 426 }
GaiSensei 11:d3811e37d89c 427 if('a' <= hexa_char && hexa_char <= 'f')
GaiSensei 11:d3811e37d89c 428 {
GaiSensei 11:d3811e37d89c 429 return hexa_char - 87;
GaiSensei 11:d3811e37d89c 430 }
GaiSensei 11:d3811e37d89c 431 assert(false && "Wtf");
GaiSensei 11:d3811e37d89c 432 return hexa_char;
GaiSensei 11:d3811e37d89c 433 }
GaiSensei 11:d3811e37d89c 434
GaiSensei 11:d3811e37d89c 435 vector<char> string_to_data(string pan_id)
GaiSensei 11:d3811e37d89c 436 {
GaiSensei 11:d3811e37d89c 437 vector<char> result;
GaiSensei 11:d3811e37d89c 438
GaiSensei 11:d3811e37d89c 439 for(int i=0; i < pan_id.size(); i += 2)
GaiSensei 11:d3811e37d89c 440 {
GaiSensei 11:d3811e37d89c 441 const char dec_val = ( hexa_char_to_dec(pan_id[i]) ) * 16 + hexa_char_to_dec(pan_id[i]);
GaiSensei 11:d3811e37d89c 442 result.push_back(dec_val);
GaiSensei 11:d3811e37d89c 443 }
GaiSensei 11:d3811e37d89c 444
GaiSensei 11:d3811e37d89c 445 return result;
GaiSensei 11:d3811e37d89c 446 }
GaiSensei 11:d3811e37d89c 447
GaiSensei 11:d3811e37d89c 448 void set_pan_id(string pan_id)
GaiSensei 11:d3811e37d89c 449 {
GaiSensei 11:d3811e37d89c 450 const int pan_id_beginning[7] = {0x7E, 0x00, 0x06, 0x08, 0x01, 0x49, 0x44};
GaiSensei 11:d3811e37d89c 451 unsigned char checksum = 0xFF;
GaiSensei 11:d3811e37d89c 452
GaiSensei 11:d3811e37d89c 453 xbee.putc(pan_id_beginning[0]);
GaiSensei 11:d3811e37d89c 454 xbee.putc(pan_id_beginning[1]);
GaiSensei 11:d3811e37d89c 455 xbee.putc(pan_id_beginning[2]);
GaiSensei 11:d3811e37d89c 456
GaiSensei 11:d3811e37d89c 457 for(int i=3; i<7; i++)
GaiSensei 11:d3811e37d89c 458 {
GaiSensei 11:d3811e37d89c 459 checksum -= pan_id_beginning[i];
GaiSensei 11:d3811e37d89c 460 xbee.putc(pan_id_beginning[i]);
GaiSensei 11:d3811e37d89c 461 }
GaiSensei 11:d3811e37d89c 462
GaiSensei 11:d3811e37d89c 463 vector<char> pan_id_char = string_to_data(pan_id);
GaiSensei 11:d3811e37d89c 464 for(int i=0; i<pan_id_char.size(); i++)
GaiSensei 11:d3811e37d89c 465 {
GaiSensei 11:d3811e37d89c 466 checksum -= pan_id_char.at(i);
GaiSensei 11:d3811e37d89c 467 xbee.putc(pan_id_char.at(i));
GaiSensei 11:d3811e37d89c 468 }
GaiSensei 11:d3811e37d89c 469
GaiSensei 11:d3811e37d89c 470 xbee.putc(checksum);
dupm2216 6:b70f32a80d51 471 }