Librairie xbee.
Dependents: NerfUS-Coord NerfUSTarget
Fork of APP3_xbee by
mbed_source/xbee.cpp@26:bb44aeb9665e, 2017-04-05 (annotated)
- Committer:
- GaiSensei
- Date:
- Wed Apr 05 22:21:28 2017 +0000
- Revision:
- 26:bb44aeb9665e
- Parent:
- 24:00c42ba87ef7
- Child:
- 28:d3671aeb50df
Transmitter works
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 | DigitalOut led_1(LED1); |
GaiSensei | 16:f4df01448b59 | 18 | Mail<ingoing_value_t, 30> parsed_frames; |
GaiSensei | 16:f4df01448b59 | 19 | RawSerial xbee(p13, p14); |
GaiSensei | 16:f4df01448b59 | 20 | Mutex mutex; |
GaiSensei | 16:f4df01448b59 | 21 | DigitalOut error_led(p6); |
GaiSensei | 16:f4df01448b59 | 22 | Thread error_led_thread; |
GaiSensei | 16:f4df01448b59 | 23 | |
GaiSensei | 23:2b67589150d9 | 24 | const int FRAME_SPECIFIC_DATA_BEGIN_BEFORE_ADDRESS[2] = {0x10, 0x01}; |
GaiSensei | 23:2b67589150d9 | 25 | const int FRAME_SPECIFIC_DATA_BEGIN_AFTER_ADDRESS[4] = {0xFF, 0xFE, 0x00, 0x00}; |
GaiSensei | 16:f4df01448b59 | 26 | 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 | 27 | const char LED_COMMAND_POWER_ON = 0x05; |
GaiSensei | 16:f4df01448b59 | 28 | const char LED_COMMAND_POWER_OFF = 0x04; |
GaiSensei | 16:f4df01448b59 | 29 | const int RECEIVE_PACKET_MESSAGE_START_INDEX = 15; |
GaiSensei | 23:2b67589150d9 | 30 | const int RECEIVE_PACKET_SOURCE_ADDRESS_START_INDEX = 4; |
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 | 23:2b67589150d9 | 47 | void send_message_via_xbee(const char* message, const int length, int address[8]) |
GaiSensei | 16:f4df01448b59 | 48 | { |
GaiSensei | 23:2b67589150d9 | 49 | const vector<char> transmit_request = generate_transmit_request(message, length, address); |
GaiSensei | 16:f4df01448b59 | 50 | |
GaiSensei | 16:f4df01448b59 | 51 | mutex.lock(); |
GaiSensei | 16:f4df01448b59 | 52 | for(int i=0; i<transmit_request.size(); i++) |
GaiSensei | 16:f4df01448b59 | 53 | { |
GaiSensei | 16:f4df01448b59 | 54 | xbee.putc(transmit_request[i]); |
GaiSensei | 16:f4df01448b59 | 55 | } |
GaiSensei | 16:f4df01448b59 | 56 | mutex.unlock(); |
GaiSensei | 16:f4df01448b59 | 57 | } |
GaiSensei | 16:f4df01448b59 | 58 | |
GaiSensei | 23:2b67589150d9 | 59 | vector<char> generate_transmit_request(const char* message, const int length, int address[8]) |
GaiSensei | 16:f4df01448b59 | 60 | { |
GaiSensei | 16:f4df01448b59 | 61 | vector<char> request; |
GaiSensei | 16:f4df01448b59 | 62 | |
GaiSensei | 16:f4df01448b59 | 63 | unsigned char checksum = 0xFF; |
GaiSensei | 16:f4df01448b59 | 64 | |
GaiSensei | 16:f4df01448b59 | 65 | request.push_back(START_DELIMITER); |
GaiSensei | 16:f4df01448b59 | 66 | |
GaiSensei | 16:f4df01448b59 | 67 | const uint16_t frame_length = 0x0E + length; |
GaiSensei | 16:f4df01448b59 | 68 | const uint8_t frame_length_msb = frame_length >> 8; |
GaiSensei | 16:f4df01448b59 | 69 | const uint8_t frame_length_lsb = (frame_length << 8) >> 8; |
GaiSensei | 16:f4df01448b59 | 70 | request.push_back(frame_length_msb); |
GaiSensei | 16:f4df01448b59 | 71 | request.push_back(frame_length_lsb); |
GaiSensei | 16:f4df01448b59 | 72 | |
GaiSensei | 23:2b67589150d9 | 73 | for(int i=0; i<2; i++) |
GaiSensei | 23:2b67589150d9 | 74 | { |
GaiSensei | 23:2b67589150d9 | 75 | request.push_back(FRAME_SPECIFIC_DATA_BEGIN_BEFORE_ADDRESS[i]); |
GaiSensei | 23:2b67589150d9 | 76 | checksum -= FRAME_SPECIFIC_DATA_BEGIN_BEFORE_ADDRESS[i]; |
GaiSensei | 23:2b67589150d9 | 77 | } |
GaiSensei | 23:2b67589150d9 | 78 | |
GaiSensei | 23:2b67589150d9 | 79 | for(int i=0; i<8; i++) |
GaiSensei | 16:f4df01448b59 | 80 | { |
GaiSensei | 23:2b67589150d9 | 81 | request.push_back(address[i]); |
GaiSensei | 23:2b67589150d9 | 82 | checksum -= address[i]; |
GaiSensei | 23:2b67589150d9 | 83 | } |
GaiSensei | 23:2b67589150d9 | 84 | |
GaiSensei | 23:2b67589150d9 | 85 | for(int i=0; i<4; i++) |
GaiSensei | 23:2b67589150d9 | 86 | { |
GaiSensei | 23:2b67589150d9 | 87 | request.push_back(FRAME_SPECIFIC_DATA_BEGIN_AFTER_ADDRESS[i]); |
GaiSensei | 23:2b67589150d9 | 88 | checksum -= FRAME_SPECIFIC_DATA_BEGIN_AFTER_ADDRESS[i]; |
GaiSensei | 16:f4df01448b59 | 89 | } |
GaiSensei | 16:f4df01448b59 | 90 | |
GaiSensei | 16:f4df01448b59 | 91 | for(int i=0; i<length; i++) |
GaiSensei | 16:f4df01448b59 | 92 | { |
GaiSensei | 16:f4df01448b59 | 93 | request.push_back(message[i]); |
GaiSensei | 16:f4df01448b59 | 94 | checksum -= message[i]; |
GaiSensei | 16:f4df01448b59 | 95 | } |
GaiSensei | 16:f4df01448b59 | 96 | |
GaiSensei | 16:f4df01448b59 | 97 | request.push_back(checksum); |
GaiSensei | 16:f4df01448b59 | 98 | |
GaiSensei | 16:f4df01448b59 | 99 | return request; |
GaiSensei | 16:f4df01448b59 | 100 | } |
GaiSensei | 16:f4df01448b59 | 101 | |
GaiSensei | 16:f4df01448b59 | 102 | vector<char> generate_led_command(const bool power_on) |
GaiSensei | 16:f4df01448b59 | 103 | { |
GaiSensei | 16:f4df01448b59 | 104 | vector<char> request; |
GaiSensei | 16:f4df01448b59 | 105 | |
GaiSensei | 16:f4df01448b59 | 106 | unsigned char checksum = 0xFF; |
GaiSensei | 16:f4df01448b59 | 107 | |
GaiSensei | 16:f4df01448b59 | 108 | request.push_back(START_DELIMITER); |
GaiSensei | 16:f4df01448b59 | 109 | |
GaiSensei | 16:f4df01448b59 | 110 | const uint16_t frame_length = 0x10; |
GaiSensei | 16:f4df01448b59 | 111 | const uint8_t frame_length_msb = frame_length >> 8; |
GaiSensei | 16:f4df01448b59 | 112 | const uint8_t frame_length_lsb = (frame_length << 8) >> 8; |
GaiSensei | 16:f4df01448b59 | 113 | request.push_back(frame_length_msb); |
GaiSensei | 16:f4df01448b59 | 114 | request.push_back(frame_length_lsb); |
GaiSensei | 16:f4df01448b59 | 115 | |
GaiSensei | 16:f4df01448b59 | 116 | for(int i=0; i<15; i++) |
GaiSensei | 16:f4df01448b59 | 117 | { |
GaiSensei | 16:f4df01448b59 | 118 | request.push_back(AT_COMMAND_LED_FRAME_SPECIFIC_DATA_BEGIN[i]); |
GaiSensei | 16:f4df01448b59 | 119 | checksum -= AT_COMMAND_LED_FRAME_SPECIFIC_DATA_BEGIN[i]; |
GaiSensei | 16:f4df01448b59 | 120 | } |
GaiSensei | 16:f4df01448b59 | 121 | |
GaiSensei | 16:f4df01448b59 | 122 | const char led_power_state = power_on ? LED_COMMAND_POWER_ON : LED_COMMAND_POWER_OFF; |
GaiSensei | 16:f4df01448b59 | 123 | request.push_back(led_power_state); |
GaiSensei | 16:f4df01448b59 | 124 | checksum -= led_power_state; |
GaiSensei | 16:f4df01448b59 | 125 | |
GaiSensei | 16:f4df01448b59 | 126 | request.push_back(checksum); |
GaiSensei | 16:f4df01448b59 | 127 | |
GaiSensei | 16:f4df01448b59 | 128 | return request; |
GaiSensei | 16:f4df01448b59 | 129 | } |
GaiSensei | 16:f4df01448b59 | 130 | |
GaiSensei | 24:00c42ba87ef7 | 131 | void read_frame(void const *args) |
GaiSensei | 16:f4df01448b59 | 132 | { |
GaiSensei | 16:f4df01448b59 | 133 | while(true) |
GaiSensei | 16:f4df01448b59 | 134 | { |
GaiSensei | 16:f4df01448b59 | 135 | while(xbee.getc() != 0x7E); |
GaiSensei | 16:f4df01448b59 | 136 | |
GaiSensei | 16:f4df01448b59 | 137 | vector<char> frame; |
GaiSensei | 16:f4df01448b59 | 138 | |
GaiSensei | 16:f4df01448b59 | 139 | frame.push_back(0x7E); |
GaiSensei | 16:f4df01448b59 | 140 | |
GaiSensei | 16:f4df01448b59 | 141 | const uint8_t frame_size_msb = xbee.getc(); |
GaiSensei | 16:f4df01448b59 | 142 | const uint8_t frame_size_lsb = xbee.getc(); |
GaiSensei | 16:f4df01448b59 | 143 | frame.push_back(frame_size_msb); |
GaiSensei | 16:f4df01448b59 | 144 | frame.push_back(frame_size_lsb); |
GaiSensei | 16:f4df01448b59 | 145 | const uint16_t frame_size = (frame_size_msb << 8) + frame_size_lsb; |
GaiSensei | 16:f4df01448b59 | 146 | |
GaiSensei | 16:f4df01448b59 | 147 | for(int i=0; i<frame_size + 1; i++) |
GaiSensei | 16:f4df01448b59 | 148 | { |
GaiSensei | 16:f4df01448b59 | 149 | frame.push_back(xbee.getc()); |
GaiSensei | 16:f4df01448b59 | 150 | } |
GaiSensei | 16:f4df01448b59 | 151 | |
GaiSensei | 16:f4df01448b59 | 152 | handle_frame(frame); |
GaiSensei | 16:f4df01448b59 | 153 | } |
GaiSensei | 16:f4df01448b59 | 154 | } |
GaiSensei | 16:f4df01448b59 | 155 | |
GaiSensei | 16:f4df01448b59 | 156 | vector<char> parse_receive_packet(const vector<char>& frame) |
GaiSensei | 23:2b67589150d9 | 157 | { |
GaiSensei | 23:2b67589150d9 | 158 | vector<char> message; |
GaiSensei | 23:2b67589150d9 | 159 | for(int i=0; i<8; i++) |
GaiSensei | 23:2b67589150d9 | 160 | { |
GaiSensei | 23:2b67589150d9 | 161 | message.push_back(frame.at(RECEIVE_PACKET_SOURCE_ADDRESS_START_INDEX + i)); |
GaiSensei | 23:2b67589150d9 | 162 | } |
GaiSensei | 23:2b67589150d9 | 163 | for(int i=0; i< frame.size() - RECEIVE_PACKET_MESSAGE_START_INDEX; i++) |
GaiSensei | 23:2b67589150d9 | 164 | { |
GaiSensei | 23:2b67589150d9 | 165 | message.push_back(frame.at(RECEIVE_PACKET_MESSAGE_START_INDEX + i)); |
GaiSensei | 23:2b67589150d9 | 166 | } |
GaiSensei | 16:f4df01448b59 | 167 | return message; |
GaiSensei | 16:f4df01448b59 | 168 | } |
GaiSensei | 16:f4df01448b59 | 169 | |
GaiSensei | 16:f4df01448b59 | 170 | vector<char> parse_transmit_status(const vector<char>& frame) |
GaiSensei | 16:f4df01448b59 | 171 | { |
GaiSensei | 16:f4df01448b59 | 172 | vector<char> relevant_content; |
GaiSensei | 16:f4df01448b59 | 173 | |
GaiSensei | 16:f4df01448b59 | 174 | const char delivery_status = frame.at(8); |
GaiSensei | 16:f4df01448b59 | 175 | relevant_content.push_back(delivery_status); |
GaiSensei | 16:f4df01448b59 | 176 | |
GaiSensei | 16:f4df01448b59 | 177 | return relevant_content; |
GaiSensei | 16:f4df01448b59 | 178 | } |
GaiSensei | 16:f4df01448b59 | 179 | |
GaiSensei | 16:f4df01448b59 | 180 | vector<char> parse_at_command_response(const vector<char>& frame) |
GaiSensei | 16:f4df01448b59 | 181 | { |
GaiSensei | 16:f4df01448b59 | 182 | vector<char> relevant_content; |
GaiSensei | 16:f4df01448b59 | 183 | |
GaiSensei | 16:f4df01448b59 | 184 | const char command_status = frame.at(7); |
GaiSensei | 16:f4df01448b59 | 185 | relevant_content.push_back(command_status); |
GaiSensei | 16:f4df01448b59 | 186 | |
GaiSensei | 16:f4df01448b59 | 187 | return relevant_content; |
GaiSensei | 16:f4df01448b59 | 188 | } |
GaiSensei | 16:f4df01448b59 | 189 | |
GaiSensei | 16:f4df01448b59 | 190 | vector<char> parse_remote_command_response(const vector<char>& frame) |
GaiSensei | 16:f4df01448b59 | 191 | { |
GaiSensei | 16:f4df01448b59 | 192 | vector<char> relevant_content; |
GaiSensei | 16:f4df01448b59 | 193 | |
GaiSensei | 16:f4df01448b59 | 194 | const char command_status = frame.at(17); |
GaiSensei | 16:f4df01448b59 | 195 | relevant_content.push_back(command_status); |
GaiSensei | 16:f4df01448b59 | 196 | |
GaiSensei | 16:f4df01448b59 | 197 | return relevant_content; |
GaiSensei | 16:f4df01448b59 | 198 | } |
GaiSensei | 16:f4df01448b59 | 199 | |
GaiSensei | 16:f4df01448b59 | 200 | void manage_error_led() |
GaiSensei | 16:f4df01448b59 | 201 | { |
GaiSensei | 16:f4df01448b59 | 202 | while(true) |
GaiSensei | 16:f4df01448b59 | 203 | { |
GaiSensei | 16:f4df01448b59 | 204 | osSignalWait(0x1, osWaitForever); |
GaiSensei | 16:f4df01448b59 | 205 | error_led = 1; |
GaiSensei | 16:f4df01448b59 | 206 | wait_ms(1000); |
GaiSensei | 16:f4df01448b59 | 207 | error_led = 0; |
GaiSensei | 16:f4df01448b59 | 208 | } |
GaiSensei | 16:f4df01448b59 | 209 | } |
GaiSensei | 16:f4df01448b59 | 210 | |
GaiSensei | 16:f4df01448b59 | 211 | void send_blink_led_at_command(const bool toggle_current_command) |
GaiSensei | 16:f4df01448b59 | 212 | { |
GaiSensei | 16:f4df01448b59 | 213 | static bool is_current_command_turn_on = false; |
GaiSensei | 16:f4df01448b59 | 214 | if(toggle_current_command) |
GaiSensei | 16:f4df01448b59 | 215 | { |
GaiSensei | 16:f4df01448b59 | 216 | is_current_command_turn_on = !is_current_command_turn_on; |
GaiSensei | 16:f4df01448b59 | 217 | } |
GaiSensei | 16:f4df01448b59 | 218 | |
GaiSensei | 16:f4df01448b59 | 219 | const vector<char> led_command = generate_led_command(is_current_command_turn_on); |
GaiSensei | 16:f4df01448b59 | 220 | for(int i=0; i<led_command.size(); i++) |
GaiSensei | 16:f4df01448b59 | 221 | { |
GaiSensei | 16:f4df01448b59 | 222 | xbee.putc(led_command[i]); |
GaiSensei | 16:f4df01448b59 | 223 | } |
GaiSensei | 16:f4df01448b59 | 224 | } |
GaiSensei | 16:f4df01448b59 | 225 | |
GaiSensei | 24:00c42ba87ef7 | 226 | void handle_parsed_frames_from_mailbox(void const *args) |
GaiSensei | 16:f4df01448b59 | 227 | { |
GaiSensei | 16:f4df01448b59 | 228 | while(true) |
GaiSensei | 16:f4df01448b59 | 229 | { |
GaiSensei | 16:f4df01448b59 | 230 | osEvent event = parsed_frames.get(); |
GaiSensei | 16:f4df01448b59 | 231 | assert(event.status == osEventMail); |
GaiSensei | 16:f4df01448b59 | 232 | |
GaiSensei | 16:f4df01448b59 | 233 | ingoing_value_t *parsed_frame = (ingoing_value_t*)event.value.p; |
GaiSensei | 24:00c42ba87ef7 | 234 | parse_nerfus_message(ingoing_value_to_vector(*parsed_frame), (void(*)(vector<uint8_t>, int*))args); |
GaiSensei | 16:f4df01448b59 | 235 | parsed_frames.free(parsed_frame); |
GaiSensei | 16:f4df01448b59 | 236 | } |
GaiSensei | 16:f4df01448b59 | 237 | } |
GaiSensei | 16:f4df01448b59 | 238 | |
GaiSensei | 16:f4df01448b59 | 239 | vector<char> ingoing_value_to_vector(const ingoing_value_t& value) |
GaiSensei | 16:f4df01448b59 | 240 | { |
GaiSensei | 16:f4df01448b59 | 241 | vector<char> result; |
GaiSensei | 16:f4df01448b59 | 242 | for(int i=0; i<value.size; i++) |
GaiSensei | 16:f4df01448b59 | 243 | { |
GaiSensei | 16:f4df01448b59 | 244 | result.push_back(value.content[i]); |
GaiSensei | 16:f4df01448b59 | 245 | } |
GaiSensei | 16:f4df01448b59 | 246 | return result; |
GaiSensei | 16:f4df01448b59 | 247 | } |
GaiSensei | 16:f4df01448b59 | 248 | |
GaiSensei | 16:f4df01448b59 | 249 | void handle_frame(const vector<char>& frame) |
GaiSensei | 16:f4df01448b59 | 250 | { |
GaiSensei | 16:f4df01448b59 | 251 | ingoing_value_t *parsed_frame = parsed_frames.alloc(); |
GaiSensei | 16:f4df01448b59 | 252 | |
GaiSensei | 16:f4df01448b59 | 253 | const vector<char> parsed_frame_vector = parse_frame(frame); |
GaiSensei | 16:f4df01448b59 | 254 | for(int i=0; i<parsed_frame_vector.size(); i++) |
GaiSensei | 16:f4df01448b59 | 255 | { |
GaiSensei | 16:f4df01448b59 | 256 | parsed_frame->content[i] = parsed_frame_vector.at(i); |
GaiSensei | 16:f4df01448b59 | 257 | } |
GaiSensei | 16:f4df01448b59 | 258 | parsed_frame->size = parsed_frame_vector.size(); |
GaiSensei | 16:f4df01448b59 | 259 | |
GaiSensei | 16:f4df01448b59 | 260 | parsed_frames.put(parsed_frame); |
GaiSensei | 16:f4df01448b59 | 261 | } |
GaiSensei | 16:f4df01448b59 | 262 | |
GaiSensei | 16:f4df01448b59 | 263 | vector<char> parse_frame(const vector<char>& frame) |
GaiSensei | 16:f4df01448b59 | 264 | { |
GaiSensei | 16:f4df01448b59 | 265 | vector<char> parsed_frame; |
GaiSensei | 16:f4df01448b59 | 266 | |
GaiSensei | 16:f4df01448b59 | 267 | const char frame_type = frame.at(3); |
GaiSensei | 16:f4df01448b59 | 268 | parsed_frame.push_back(frame_type); |
GaiSensei | 16:f4df01448b59 | 269 | |
GaiSensei | 16:f4df01448b59 | 270 | vector<char> parsed_frame_relevant_content; |
GaiSensei | 16:f4df01448b59 | 271 | |
GaiSensei | 16:f4df01448b59 | 272 | switch(frame_type) |
GaiSensei | 16:f4df01448b59 | 273 | { |
GaiSensei | 16:f4df01448b59 | 274 | case FRAME_TYPE_RECEIVE_PACKET: |
GaiSensei | 16:f4df01448b59 | 275 | { |
GaiSensei | 16:f4df01448b59 | 276 | parsed_frame_relevant_content = parse_receive_packet(frame); |
GaiSensei | 16:f4df01448b59 | 277 | break; |
GaiSensei | 16:f4df01448b59 | 278 | } |
GaiSensei | 16:f4df01448b59 | 279 | case FRAME_TYPE_TRANSMIT_STATUS: |
GaiSensei | 16:f4df01448b59 | 280 | { |
GaiSensei | 16:f4df01448b59 | 281 | parsed_frame_relevant_content = parse_transmit_status(frame); |
GaiSensei | 16:f4df01448b59 | 282 | break; |
GaiSensei | 16:f4df01448b59 | 283 | } |
GaiSensei | 16:f4df01448b59 | 284 | case FRAME_TYPE_AT_COMMAND_RESPONSE: |
GaiSensei | 16:f4df01448b59 | 285 | { |
GaiSensei | 16:f4df01448b59 | 286 | parsed_frame_relevant_content = parse_at_command_response(frame); |
GaiSensei | 16:f4df01448b59 | 287 | break; |
GaiSensei | 16:f4df01448b59 | 288 | } |
GaiSensei | 16:f4df01448b59 | 289 | case FRAME_TYPE_REMOTE_COMMAND_RESPONSE: |
GaiSensei | 16:f4df01448b59 | 290 | { |
GaiSensei | 16:f4df01448b59 | 291 | parsed_frame_relevant_content = parse_remote_command_response(frame); |
GaiSensei | 16:f4df01448b59 | 292 | break; |
GaiSensei | 16:f4df01448b59 | 293 | } |
GaiSensei | 16:f4df01448b59 | 294 | default: |
GaiSensei | 16:f4df01448b59 | 295 | printf("Unsupported frame:\r\n"); |
GaiSensei | 16:f4df01448b59 | 296 | for(int i=0; i<frame.size(); i++) |
GaiSensei | 16:f4df01448b59 | 297 | { |
GaiSensei | 16:f4df01448b59 | 298 | printf("Bit #%d: %d\r\n", i, frame.at(i)); |
GaiSensei | 16:f4df01448b59 | 299 | } |
GaiSensei | 16:f4df01448b59 | 300 | } |
GaiSensei | 16:f4df01448b59 | 301 | |
GaiSensei | 16:f4df01448b59 | 302 | for(vector<char>::iterator it = parsed_frame_relevant_content.begin(); it < parsed_frame_relevant_content.end(); it++) |
GaiSensei | 16:f4df01448b59 | 303 | { |
GaiSensei | 16:f4df01448b59 | 304 | parsed_frame.push_back(*it); |
GaiSensei | 16:f4df01448b59 | 305 | } |
GaiSensei | 16:f4df01448b59 | 306 | |
GaiSensei | 16:f4df01448b59 | 307 | return parsed_frame; |
GaiSensei | 16:f4df01448b59 | 308 | } |
GaiSensei | 16:f4df01448b59 | 309 | |
GaiSensei | 23:2b67589150d9 | 310 | void parse_nerfus_message(const vector<char>& parsed_frame, void (*callback)(vector<uint8_t>, int*)) |
GaiSensei | 19:9f25d8abec9e | 311 | { |
GaiSensei | 23:2b67589150d9 | 312 | int address[8]; |
GaiSensei | 23:2b67589150d9 | 313 | for(int i=1; i<9; i++) |
GaiSensei | 16:f4df01448b59 | 314 | { |
GaiSensei | 24:00c42ba87ef7 | 315 | address[i-1] = parsed_frame[i]; |
GaiSensei | 16:f4df01448b59 | 316 | } |
GaiSensei | 23:2b67589150d9 | 317 | vector<uint8_t> message; |
GaiSensei | 23:2b67589150d9 | 318 | for(int i=9; i<13; i++) |
GaiSensei | 23:2b67589150d9 | 319 | { |
GaiSensei | 23:2b67589150d9 | 320 | message.push_back(parsed_frame[i]); |
GaiSensei | 23:2b67589150d9 | 321 | } |
GaiSensei | 23:2b67589150d9 | 322 | callback(message, address); |
GaiSensei | 16:f4df01448b59 | 323 | } |
GaiSensei | 16:f4df01448b59 | 324 | |
GaiSensei | 16:f4df01448b59 | 325 | void parsed_button_event_frame_to_string(const vector<char>& parsed_frame, char* readable_string_output) |
GaiSensei | 16:f4df01448b59 | 326 | { |
GaiSensei | 16:f4df01448b59 | 327 | const char button_state = parsed_frame[2]; |
GaiSensei | 16:f4df01448b59 | 328 | switch(button_state) |
GaiSensei | 16:f4df01448b59 | 329 | { |
GaiSensei | 16:f4df01448b59 | 330 | case BUTTON_RELEASED: |
GaiSensei | 16:f4df01448b59 | 331 | strcpy(readable_string_output, "Button state: released"); |
GaiSensei | 16:f4df01448b59 | 332 | break; |
GaiSensei | 16:f4df01448b59 | 333 | |
GaiSensei | 16:f4df01448b59 | 334 | case BUTTON_PRESSED: |
GaiSensei | 16:f4df01448b59 | 335 | strcpy(readable_string_output, "Button state: pressed"); |
GaiSensei | 16:f4df01448b59 | 336 | break; |
GaiSensei | 16:f4df01448b59 | 337 | |
GaiSensei | 16:f4df01448b59 | 338 | default: |
GaiSensei | 16:f4df01448b59 | 339 | strcpy(readable_string_output, "Button state: invalid state"); |
GaiSensei | 16:f4df01448b59 | 340 | break; |
GaiSensei | 16:f4df01448b59 | 341 | } |
GaiSensei | 16:f4df01448b59 | 342 | } |
GaiSensei | 16:f4df01448b59 | 343 | |
GaiSensei | 16:f4df01448b59 | 344 | void parsed_accelerometer_event_frame_to_string(const vector<char>& parsed_frame, char* readable_string_output) |
GaiSensei | 16:f4df01448b59 | 345 | { |
GaiSensei | 16:f4df01448b59 | 346 | const uint8_t x = parsed_frame[2]; |
GaiSensei | 16:f4df01448b59 | 347 | const uint8_t y = parsed_frame[3]; |
GaiSensei | 16:f4df01448b59 | 348 | const uint8_t z = parsed_frame[4]; |
GaiSensei | 16:f4df01448b59 | 349 | sprintf(readable_string_output, "Accelerometer state: x=0x%X, y=0x%X, z=0x%X", x, y, z); |
GaiSensei | 16:f4df01448b59 | 350 | } |
GaiSensei | 16:f4df01448b59 | 351 | |
GaiSensei | 16:f4df01448b59 | 352 | vector<string> read_file(string path) |
GaiSensei | 16:f4df01448b59 | 353 | { |
GaiSensei | 16:f4df01448b59 | 354 | LocalFileSystem local("local"); |
GaiSensei | 16:f4df01448b59 | 355 | vector<string> result; |
GaiSensei | 16:f4df01448b59 | 356 | char buffer[128] = ""; |
GaiSensei | 16:f4df01448b59 | 357 | FILE *fp = fopen(path.c_str(), "r"); |
GaiSensei | 16:f4df01448b59 | 358 | bool ret = (fgets(buffer, 64, fp)) ; |
GaiSensei | 16:f4df01448b59 | 359 | |
GaiSensei | 16:f4df01448b59 | 360 | string value(buffer); |
GaiSensei | 16:f4df01448b59 | 361 | string first_value = ""; |
GaiSensei | 16:f4df01448b59 | 362 | string second_value = ""; |
GaiSensei | 16:f4df01448b59 | 363 | bool which_value = true; |
GaiSensei | 16:f4df01448b59 | 364 | |
GaiSensei | 16:f4df01448b59 | 365 | for(int i=0; i<value.size(); i++) |
GaiSensei | 16:f4df01448b59 | 366 | { |
GaiSensei | 16:f4df01448b59 | 367 | if(buffer[i] == ';') |
GaiSensei | 16:f4df01448b59 | 368 | { |
GaiSensei | 16:f4df01448b59 | 369 | which_value = false; |
GaiSensei | 16:f4df01448b59 | 370 | } |
GaiSensei | 16:f4df01448b59 | 371 | else |
GaiSensei | 16:f4df01448b59 | 372 | { |
GaiSensei | 16:f4df01448b59 | 373 | if(which_value) |
GaiSensei | 16:f4df01448b59 | 374 | { |
GaiSensei | 16:f4df01448b59 | 375 | first_value += buffer[i]; |
GaiSensei | 16:f4df01448b59 | 376 | } |
GaiSensei | 16:f4df01448b59 | 377 | else |
GaiSensei | 16:f4df01448b59 | 378 | { |
GaiSensei | 16:f4df01448b59 | 379 | second_value += buffer[i]; |
GaiSensei | 16:f4df01448b59 | 380 | } |
GaiSensei | 16:f4df01448b59 | 381 | } |
GaiSensei | 16:f4df01448b59 | 382 | } |
GaiSensei | 16:f4df01448b59 | 383 | result.push_back(first_value); |
GaiSensei | 16:f4df01448b59 | 384 | result.push_back(second_value); |
GaiSensei | 16:f4df01448b59 | 385 | return result; |
GaiSensei | 16:f4df01448b59 | 386 | } |
GaiSensei | 16:f4df01448b59 | 387 | |
GaiSensei | 16:f4df01448b59 | 388 | char hexa_char_to_dec(char hexa_char) |
GaiSensei | 16:f4df01448b59 | 389 | { |
GaiSensei | 16:f4df01448b59 | 390 | if('0' <= hexa_char && hexa_char <= '9') |
GaiSensei | 16:f4df01448b59 | 391 | { |
GaiSensei | 16:f4df01448b59 | 392 | return hexa_char - 48; |
GaiSensei | 16:f4df01448b59 | 393 | } |
GaiSensei | 16:f4df01448b59 | 394 | if('A' <= hexa_char && hexa_char <= 'F') |
GaiSensei | 16:f4df01448b59 | 395 | { |
GaiSensei | 16:f4df01448b59 | 396 | return hexa_char - 55; |
GaiSensei | 16:f4df01448b59 | 397 | } |
GaiSensei | 16:f4df01448b59 | 398 | if('a' <= hexa_char && hexa_char <= 'f') |
GaiSensei | 16:f4df01448b59 | 399 | { |
GaiSensei | 16:f4df01448b59 | 400 | return hexa_char - 87; |
GaiSensei | 16:f4df01448b59 | 401 | } |
GaiSensei | 16:f4df01448b59 | 402 | assert(false && "Wtf"); |
GaiSensei | 16:f4df01448b59 | 403 | return hexa_char; |
GaiSensei | 16:f4df01448b59 | 404 | } |
GaiSensei | 16:f4df01448b59 | 405 | |
GaiSensei | 16:f4df01448b59 | 406 | vector<char> string_to_data(string pan_id) |
GaiSensei | 16:f4df01448b59 | 407 | { |
GaiSensei | 16:f4df01448b59 | 408 | vector<char> result; |
GaiSensei | 16:f4df01448b59 | 409 | |
GaiSensei | 16:f4df01448b59 | 410 | for(int i=0; i < pan_id.size(); i += 2) |
GaiSensei | 16:f4df01448b59 | 411 | { |
GaiSensei | 16:f4df01448b59 | 412 | const char dec_val = ( hexa_char_to_dec(pan_id[i]) ) * 16 + hexa_char_to_dec(pan_id[i]); |
GaiSensei | 16:f4df01448b59 | 413 | result.push_back(dec_val); |
GaiSensei | 16:f4df01448b59 | 414 | } |
GaiSensei | 16:f4df01448b59 | 415 | |
GaiSensei | 16:f4df01448b59 | 416 | return result; |
GaiSensei | 16:f4df01448b59 | 417 | } |
GaiSensei | 16:f4df01448b59 | 418 | |
GaiSensei | 16:f4df01448b59 | 419 | void set_pan_id(string pan_id) |
GaiSensei | 16:f4df01448b59 | 420 | { |
GaiSensei | 16:f4df01448b59 | 421 | const int pan_id_beginning[7] = {0x7E, 0x00, 0x06, 0x08, 0x01, 0x49, 0x44}; |
GaiSensei | 16:f4df01448b59 | 422 | unsigned char checksum = 0xFF; |
GaiSensei | 16:f4df01448b59 | 423 | |
GaiSensei | 16:f4df01448b59 | 424 | xbee.putc(pan_id_beginning[0]); |
GaiSensei | 16:f4df01448b59 | 425 | xbee.putc(pan_id_beginning[1]); |
GaiSensei | 16:f4df01448b59 | 426 | xbee.putc(pan_id_beginning[2]); |
GaiSensei | 16:f4df01448b59 | 427 | |
GaiSensei | 16:f4df01448b59 | 428 | for(int i=3; i<7; i++) |
GaiSensei | 16:f4df01448b59 | 429 | { |
GaiSensei | 16:f4df01448b59 | 430 | checksum -= pan_id_beginning[i]; |
GaiSensei | 16:f4df01448b59 | 431 | xbee.putc(pan_id_beginning[i]); |
GaiSensei | 16:f4df01448b59 | 432 | } |
GaiSensei | 16:f4df01448b59 | 433 | |
GaiSensei | 16:f4df01448b59 | 434 | vector<char> pan_id_char = string_to_data(pan_id); |
GaiSensei | 16:f4df01448b59 | 435 | for(int i=0; i<pan_id_char.size(); i++) |
GaiSensei | 16:f4df01448b59 | 436 | { |
GaiSensei | 16:f4df01448b59 | 437 | checksum -= pan_id_char.at(i); |
GaiSensei | 16:f4df01448b59 | 438 | xbee.putc(pan_id_char.at(i)); |
GaiSensei | 16:f4df01448b59 | 439 | } |
GaiSensei | 16:f4df01448b59 | 440 | |
GaiSensei | 16:f4df01448b59 | 441 | xbee.putc(checksum); |
GaiSensei | 16:f4df01448b59 | 442 | } |