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