NerfUS / NerfUSXbee

Dependents:   NerfUS-Coord NerfUSTarget

Fork of APP3_xbee by Team APP

Committer:
dupm2216
Date:
Tue Feb 14 05:02:45 2017 +0000
Revision:
9:04063c29ab43
Parent:
8:b9c096965c00
Child:
11:d3811e37d89c
Parse remote command status; ; When the status is not "OK", blink the error led for 1 second and resent the remote at command (aka blink remote led)

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dupm2216 0:8f5379c94a69 1 #include "xbee.h"
dupm2216 4:e97cfe6cc18c 2 #include <cassert>
dupm2216 0:8f5379c94a69 3
dupm2216 8:b9c096965c00 4
dupm2216 8:b9c096965c00 5
dupm2216 0:8f5379c94a69 6 DigitalOut led_1(LED1);
dupm2216 8:b9c096965c00 7 Mail<ingoing_value_t, 30> parsed_frames;
dupm2216 0:8f5379c94a69 8 RawSerial xbee(p13, p14);
GaiSensei 7:c65c4c98d237 9 Mutex mutex;
dupm2216 9:04063c29ab43 10 DigitalOut error_led(p6);
dupm2216 9:04063c29ab43 11 Thread error_led_thread;
dupm2216 9:04063c29ab43 12
dupm2216 9:04063c29ab43 13
dupm2216 0:8f5379c94a69 14 const int FRAME_SPECIFIC_DATA_BEGIN[14] = {0x10, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFE, 0x00, 0x00};
dupm2216 5:cd3c79853dc8 15 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 16 const char LED_COMMAND_POWER_ON = 0x05;
dupm2216 5:cd3c79853dc8 17 const char LED_COMMAND_POWER_OFF = 0x04;
dupm2216 0:8f5379c94a69 18 const int RECEIVE_PACKET_MESSAGE_START_INDEX = 15;
dupm2216 0:8f5379c94a69 19
dupm2216 0:8f5379c94a69 20 const char START_DELIMITER = 0x7E;
dupm2216 0:8f5379c94a69 21
GaiSensei 7:c65c4c98d237 22 bool is_character_that_needs_escape(const char character)
GaiSensei 7:c65c4c98d237 23 {
GaiSensei 7:c65c4c98d237 24 //printf("%X\r\n", character);
GaiSensei 7:c65c4c98d237 25 switch(character)
GaiSensei 7:c65c4c98d237 26 {
GaiSensei 7:c65c4c98d237 27 case 0x7E: return true;
GaiSensei 7:c65c4c98d237 28 case 0x7D: return true;
GaiSensei 7:c65c4c98d237 29 case 0x11: return true;
GaiSensei 7:c65c4c98d237 30 case 0x13: return true;
GaiSensei 7:c65c4c98d237 31 default: return false;
GaiSensei 7:c65c4c98d237 32 }
GaiSensei 7:c65c4c98d237 33 }
GaiSensei 7:c65c4c98d237 34
dupm2216 0:8f5379c94a69 35 void send_message_via_xbee(const char* message, const int length)
dupm2216 0:8f5379c94a69 36 {
GaiSensei 7:c65c4c98d237 37 //printf("send_message_via_xbee\r\n");
dupm2216 0:8f5379c94a69 38 const vector<char> transmit_request = generate_transmit_request(message, length);
dupm2216 0:8f5379c94a69 39
GaiSensei 7:c65c4c98d237 40 mutex.lock();
dupm2216 0:8f5379c94a69 41 for(int i=0; i<transmit_request.size(); i++)
dupm2216 0:8f5379c94a69 42 {
GaiSensei 7:c65c4c98d237 43 assert( i==0 || !is_character_that_needs_escape(transmit_request[i]));
dupm2216 0:8f5379c94a69 44 xbee.putc(transmit_request[i]);
dupm2216 0:8f5379c94a69 45 }
GaiSensei 7:c65c4c98d237 46 mutex.unlock();
dupm2216 0:8f5379c94a69 47 }
dupm2216 0:8f5379c94a69 48
dupm2216 0:8f5379c94a69 49 vector<char> generate_transmit_request(const char* message, const int length)
dupm2216 0:8f5379c94a69 50 {
dupm2216 0:8f5379c94a69 51 vector<char> request;
dupm2216 0:8f5379c94a69 52
dupm2216 0:8f5379c94a69 53 unsigned char checksum = 0xFF;
dupm2216 0:8f5379c94a69 54
dupm2216 0:8f5379c94a69 55 request.push_back(START_DELIMITER);
dupm2216 0:8f5379c94a69 56
dupm2216 0:8f5379c94a69 57 const uint16_t frame_length = 0x0E + length;
dupm2216 0:8f5379c94a69 58 const uint8_t frame_length_msb = frame_length >> 8;
dupm2216 0:8f5379c94a69 59 const uint8_t frame_length_lsb = (frame_length << 8) >> 8;
dupm2216 0:8f5379c94a69 60 request.push_back(frame_length_msb);
dupm2216 0:8f5379c94a69 61 request.push_back(frame_length_lsb);
dupm2216 0:8f5379c94a69 62
dupm2216 0:8f5379c94a69 63 for(int i=0; i<14; i++)
dupm2216 0:8f5379c94a69 64 {
dupm2216 0:8f5379c94a69 65 request.push_back(FRAME_SPECIFIC_DATA_BEGIN[i]);
dupm2216 0:8f5379c94a69 66 checksum -= FRAME_SPECIFIC_DATA_BEGIN[i];
dupm2216 0:8f5379c94a69 67 }
dupm2216 0:8f5379c94a69 68
dupm2216 0:8f5379c94a69 69 for(int i=0; i<length; i++)
dupm2216 0:8f5379c94a69 70 {
dupm2216 0:8f5379c94a69 71 request.push_back(message[i]);
dupm2216 0:8f5379c94a69 72 checksum -= message[i];
dupm2216 0:8f5379c94a69 73 }
dupm2216 0:8f5379c94a69 74
dupm2216 0:8f5379c94a69 75 request.push_back(checksum);
dupm2216 0:8f5379c94a69 76
dupm2216 0:8f5379c94a69 77 return request;
dupm2216 0:8f5379c94a69 78 }
dupm2216 0:8f5379c94a69 79
dupm2216 5:cd3c79853dc8 80 vector<char> generate_led_command(const bool power_on)
dupm2216 5:cd3c79853dc8 81 {
dupm2216 5:cd3c79853dc8 82 vector<char> request;
dupm2216 5:cd3c79853dc8 83
dupm2216 5:cd3c79853dc8 84 unsigned char checksum = 0xFF;
dupm2216 5:cd3c79853dc8 85
dupm2216 5:cd3c79853dc8 86 request.push_back(START_DELIMITER);
dupm2216 5:cd3c79853dc8 87
dupm2216 5:cd3c79853dc8 88 const uint16_t frame_length = 0x10;
dupm2216 5:cd3c79853dc8 89 const uint8_t frame_length_msb = frame_length >> 8;
dupm2216 5:cd3c79853dc8 90 const uint8_t frame_length_lsb = (frame_length << 8) >> 8;
dupm2216 5:cd3c79853dc8 91 request.push_back(frame_length_msb);
dupm2216 5:cd3c79853dc8 92 request.push_back(frame_length_lsb);
dupm2216 5:cd3c79853dc8 93
dupm2216 5:cd3c79853dc8 94 for(int i=0; i<15; i++)
dupm2216 5:cd3c79853dc8 95 {
dupm2216 5:cd3c79853dc8 96 request.push_back(AT_COMMAND_LED_FRAME_SPECIFIC_DATA_BEGIN[i]);
dupm2216 5:cd3c79853dc8 97 checksum -= AT_COMMAND_LED_FRAME_SPECIFIC_DATA_BEGIN[i];
dupm2216 5:cd3c79853dc8 98 }
dupm2216 5:cd3c79853dc8 99
dupm2216 5:cd3c79853dc8 100 const char led_power_state = power_on ? LED_COMMAND_POWER_ON : LED_COMMAND_POWER_OFF;
dupm2216 5:cd3c79853dc8 101 request.push_back(led_power_state);
dupm2216 5:cd3c79853dc8 102 checksum -= led_power_state;
dupm2216 5:cd3c79853dc8 103
dupm2216 5:cd3c79853dc8 104 request.push_back(checksum);
dupm2216 5:cd3c79853dc8 105
dupm2216 5:cd3c79853dc8 106 return request;
dupm2216 5:cd3c79853dc8 107 }
dupm2216 5:cd3c79853dc8 108
dupm2216 0:8f5379c94a69 109 void read_frame()
dupm2216 0:8f5379c94a69 110 {
dupm2216 0:8f5379c94a69 111 while(true)
dupm2216 0:8f5379c94a69 112 {
dupm2216 0:8f5379c94a69 113 while(xbee.getc() != 0x7E);
dupm2216 0:8f5379c94a69 114
dupm2216 0:8f5379c94a69 115 vector<char> frame;
dupm2216 0:8f5379c94a69 116
dupm2216 0:8f5379c94a69 117 frame.push_back(0x7E);
dupm2216 0:8f5379c94a69 118
dupm2216 0:8f5379c94a69 119 const uint8_t frame_size_msb = xbee.getc();
dupm2216 0:8f5379c94a69 120 const uint8_t frame_size_lsb = xbee.getc();
dupm2216 0:8f5379c94a69 121 frame.push_back(frame_size_msb);
dupm2216 0:8f5379c94a69 122 frame.push_back(frame_size_lsb);
dupm2216 0:8f5379c94a69 123 const uint16_t frame_size = (frame_size_msb << 8) + frame_size_lsb;
dupm2216 0:8f5379c94a69 124
dupm2216 0:8f5379c94a69 125 for(int i=0; i<frame_size + 1; i++)
dupm2216 0:8f5379c94a69 126 {
dupm2216 0:8f5379c94a69 127 frame.push_back(xbee.getc());
dupm2216 0:8f5379c94a69 128 }
dupm2216 4:e97cfe6cc18c 129
dupm2216 4:e97cfe6cc18c 130 handle_frame(frame);
dupm2216 0:8f5379c94a69 131 }
dupm2216 0:8f5379c94a69 132 }
dupm2216 0:8f5379c94a69 133
dupm2216 3:37ea92feece2 134 vector<char> parse_receive_packet(const vector<char>& frame)
dupm2216 0:8f5379c94a69 135 {
dupm2216 3:37ea92feece2 136 vector<char>::const_iterator first = frame.begin() + RECEIVE_PACKET_MESSAGE_START_INDEX;
dupm2216 3:37ea92feece2 137 vector<char>::const_iterator last = frame.end() - 1;
dupm2216 0:8f5379c94a69 138 vector<char> message(first, last);
dupm2216 0:8f5379c94a69 139 return message;
dupm2216 0:8f5379c94a69 140 }
dupm2216 0:8f5379c94a69 141
dupm2216 3:37ea92feece2 142 vector<char> parse_transmit_status(const vector<char>& frame)
dupm2216 3:37ea92feece2 143 {
dupm2216 3:37ea92feece2 144 vector<char> relevant_content;
dupm2216 3:37ea92feece2 145
dupm2216 3:37ea92feece2 146 const char delivery_status = frame.at(8);
dupm2216 3:37ea92feece2 147 relevant_content.push_back(delivery_status);
dupm2216 3:37ea92feece2 148
dupm2216 3:37ea92feece2 149 return relevant_content;
dupm2216 3:37ea92feece2 150 }
dupm2216 3:37ea92feece2 151
dupm2216 3:37ea92feece2 152 vector<char> parse_at_command_response(const vector<char>& frame)
dupm2216 3:37ea92feece2 153 {
dupm2216 3:37ea92feece2 154 vector<char> relevant_content;
dupm2216 3:37ea92feece2 155
dupm2216 3:37ea92feece2 156 const char command_status = frame.at(7);
dupm2216 3:37ea92feece2 157 relevant_content.push_back(command_status);
dupm2216 3:37ea92feece2 158
dupm2216 3:37ea92feece2 159 return relevant_content;
dupm2216 3:37ea92feece2 160 }
dupm2216 3:37ea92feece2 161
dupm2216 9:04063c29ab43 162 vector<char> parse_remote_command_response(const vector<char>& frame)
dupm2216 9:04063c29ab43 163 {
dupm2216 9:04063c29ab43 164 vector<char> relevant_content;
dupm2216 9:04063c29ab43 165
dupm2216 9:04063c29ab43 166 const char command_status = frame.at(17);
dupm2216 9:04063c29ab43 167 relevant_content.push_back(command_status);
dupm2216 9:04063c29ab43 168
dupm2216 9:04063c29ab43 169 return relevant_content;
dupm2216 9:04063c29ab43 170 }
dupm2216 9:04063c29ab43 171
dupm2216 9:04063c29ab43 172 void manage_error_led()
dupm2216 9:04063c29ab43 173 {
dupm2216 9:04063c29ab43 174 while(true)
dupm2216 9:04063c29ab43 175 {
dupm2216 9:04063c29ab43 176 osSignalWait(0x1, osWaitForever);
dupm2216 9:04063c29ab43 177 error_led = 1;
dupm2216 9:04063c29ab43 178 wait_ms(1000);
dupm2216 9:04063c29ab43 179 error_led = 0;
dupm2216 9:04063c29ab43 180 }
dupm2216 9:04063c29ab43 181 }
dupm2216 9:04063c29ab43 182
dupm2216 9:04063c29ab43 183 void send_blink_led_at_command(const bool toggle_current_command)
dupm2216 9:04063c29ab43 184 {
dupm2216 9:04063c29ab43 185 static bool is_current_command_turn_on = false;
dupm2216 9:04063c29ab43 186 if(toggle_current_command)
dupm2216 9:04063c29ab43 187 {
dupm2216 9:04063c29ab43 188 is_current_command_turn_on = !is_current_command_turn_on;
dupm2216 9:04063c29ab43 189 }
dupm2216 9:04063c29ab43 190
dupm2216 9:04063c29ab43 191 const vector<char> led_command = generate_led_command(is_current_command_turn_on);
dupm2216 9:04063c29ab43 192 for(int i=0; i<led_command.size(); i++)
dupm2216 9:04063c29ab43 193 {
dupm2216 9:04063c29ab43 194 xbee.putc(led_command[i]);
dupm2216 9:04063c29ab43 195 }
dupm2216 9:04063c29ab43 196 }
dupm2216 9:04063c29ab43 197
dupm2216 4:e97cfe6cc18c 198 void handle_parsed_frames_from_mailbox()
dupm2216 0:8f5379c94a69 199 {
dupm2216 0:8f5379c94a69 200 while(true)
dupm2216 0:8f5379c94a69 201 {
dupm2216 4:e97cfe6cc18c 202 osEvent event = parsed_frames.get();
dupm2216 4:e97cfe6cc18c 203 assert(event.status == osEventMail);
dupm2216 4:e97cfe6cc18c 204
dupm2216 8:b9c096965c00 205 ingoing_value_t *parsed_frame = (ingoing_value_t*)event.value.p;
dupm2216 4:e97cfe6cc18c 206
dupm2216 8:b9c096965c00 207 const char parsed_frame_type = parsed_frame->content[0];
dupm2216 8:b9c096965c00 208 switch(parsed_frame_type)
dupm2216 8:b9c096965c00 209 {
dupm2216 8:b9c096965c00 210 case FRAME_TYPE_RECEIVE_PACKET:
dupm2216 8:b9c096965c00 211 char parsed_frame_string[40];
dupm2216 8:b9c096965c00 212 parsed_frame_to_string(ingoing_value_to_vector(*parsed_frame), parsed_frame_string);
dupm2216 8:b9c096965c00 213
dupm2216 8:b9c096965c00 214 printf("Handling receive packet: %s\r\n", parsed_frame_string);
dupm2216 8:b9c096965c00 215 break;
dupm2216 9:04063c29ab43 216
dupm2216 9:04063c29ab43 217 case FRAME_TYPE_REMOTE_COMMAND_RESPONSE:
dupm2216 9:04063c29ab43 218 const bool is_status_ok = (parsed_frame->content[1] == 0);
dupm2216 9:04063c29ab43 219 if(!is_status_ok)
dupm2216 9:04063c29ab43 220 {
dupm2216 9:04063c29ab43 221 error_led_thread.signal_set(0x1);
dupm2216 9:04063c29ab43 222 send_blink_led_at_command(false);
dupm2216 9:04063c29ab43 223 }
dupm2216 9:04063c29ab43 224 break;
dupm2216 8:b9c096965c00 225
dupm2216 8:b9c096965c00 226 default:
dupm2216 9:04063c29ab43 227 printf("Unsupported. Type: %d\r\n", parsed_frame_type);
dupm2216 8:b9c096965c00 228 break;
dupm2216 8:b9c096965c00 229 }
dupm2216 8:b9c096965c00 230
dupm2216 8:b9c096965c00 231 parsed_frames.free(parsed_frame);
dupm2216 8:b9c096965c00 232 }
dupm2216 8:b9c096965c00 233 }
dupm2216 4:e97cfe6cc18c 234
dupm2216 8:b9c096965c00 235 vector<char> ingoing_value_to_vector(const ingoing_value_t& value)
dupm2216 8:b9c096965c00 236 {
dupm2216 8:b9c096965c00 237 vector<char> result;
dupm2216 8:b9c096965c00 238 for(int i=0; i<value.size; i++)
dupm2216 8:b9c096965c00 239 {
dupm2216 8:b9c096965c00 240 result.push_back(value.content[i]);
dupm2216 0:8f5379c94a69 241 }
dupm2216 8:b9c096965c00 242 return result;
dupm2216 3:37ea92feece2 243 }
dupm2216 3:37ea92feece2 244
dupm2216 4:e97cfe6cc18c 245 void handle_frame(const vector<char>& frame)
dupm2216 4:e97cfe6cc18c 246 {
dupm2216 8:b9c096965c00 247 ingoing_value_t *parsed_frame = parsed_frames.alloc();
dupm2216 8:b9c096965c00 248
dupm2216 8:b9c096965c00 249 const vector<char> parsed_frame_vector = parse_frame(frame);
dupm2216 8:b9c096965c00 250 for(int i=0; i<parsed_frame_vector.size(); i++)
dupm2216 8:b9c096965c00 251 {
dupm2216 8:b9c096965c00 252 parsed_frame->content[i] = parsed_frame_vector.at(i);
dupm2216 8:b9c096965c00 253 }
dupm2216 8:b9c096965c00 254 parsed_frame->size = parsed_frame_vector.size();
dupm2216 8:b9c096965c00 255
dupm2216 4:e97cfe6cc18c 256 parsed_frames.put(parsed_frame);
dupm2216 4:e97cfe6cc18c 257 }
dupm2216 4:e97cfe6cc18c 258
dupm2216 3:37ea92feece2 259 vector<char> parse_frame(const vector<char>& frame)
dupm2216 3:37ea92feece2 260 {
dupm2216 3:37ea92feece2 261 vector<char> parsed_frame;
dupm2216 3:37ea92feece2 262
dupm2216 3:37ea92feece2 263 const char frame_type = frame.at(3);
dupm2216 3:37ea92feece2 264 parsed_frame.push_back(frame_type);
dupm2216 3:37ea92feece2 265
dupm2216 3:37ea92feece2 266 vector<char> parsed_frame_relevant_content;
dupm2216 3:37ea92feece2 267
dupm2216 3:37ea92feece2 268 switch(frame_type)
dupm2216 3:37ea92feece2 269 {
dupm2216 3:37ea92feece2 270 case FRAME_TYPE_RECEIVE_PACKET:
dupm2216 3:37ea92feece2 271 {
dupm2216 3:37ea92feece2 272 parsed_frame_relevant_content = parse_receive_packet(frame);
dupm2216 3:37ea92feece2 273 break;
dupm2216 3:37ea92feece2 274 }
dupm2216 3:37ea92feece2 275 case FRAME_TYPE_TRANSMIT_STATUS:
dupm2216 3:37ea92feece2 276 {
dupm2216 3:37ea92feece2 277 parsed_frame_relevant_content = parse_transmit_status(frame);
dupm2216 3:37ea92feece2 278 break;
dupm2216 3:37ea92feece2 279 }
dupm2216 3:37ea92feece2 280 case FRAME_TYPE_AT_COMMAND_RESPONSE:
dupm2216 3:37ea92feece2 281 {
dupm2216 3:37ea92feece2 282 parsed_frame_relevant_content = parse_at_command_response(frame);
dupm2216 3:37ea92feece2 283 break;
dupm2216 3:37ea92feece2 284 }
dupm2216 9:04063c29ab43 285 case FRAME_TYPE_REMOTE_COMMAND_RESPONSE:
dupm2216 9:04063c29ab43 286 {
dupm2216 9:04063c29ab43 287 parsed_frame_relevant_content = parse_remote_command_response(frame);
dupm2216 9:04063c29ab43 288 break;
dupm2216 9:04063c29ab43 289 }
dupm2216 9:04063c29ab43 290 default:
dupm2216 9:04063c29ab43 291 printf("Unsupported frame:\r\n");
dupm2216 9:04063c29ab43 292 for(int i=0; i<frame.size(); i++)
dupm2216 9:04063c29ab43 293 {
dupm2216 9:04063c29ab43 294 printf("Bit #%d: %d\r\n", i, frame.at(i));
dupm2216 9:04063c29ab43 295 }
dupm2216 3:37ea92feece2 296 }
dupm2216 3:37ea92feece2 297
dupm2216 3:37ea92feece2 298 for(vector<char>::iterator it = parsed_frame_relevant_content.begin(); it < parsed_frame_relevant_content.end(); it++)
dupm2216 3:37ea92feece2 299 {
dupm2216 3:37ea92feece2 300 parsed_frame.push_back(*it);
dupm2216 3:37ea92feece2 301 }
dupm2216 3:37ea92feece2 302
dupm2216 3:37ea92feece2 303 return parsed_frame;
dupm2216 3:37ea92feece2 304 }
dupm2216 6:b70f32a80d51 305
dupm2216 6:b70f32a80d51 306 void parsed_frame_to_string(const vector<char>& parsed_frame, char* readable_string_output)
dupm2216 6:b70f32a80d51 307 {
dupm2216 6:b70f32a80d51 308 const char event_type = parsed_frame[1];
dupm2216 6:b70f32a80d51 309 switch(event_type)
dupm2216 6:b70f32a80d51 310 {
dupm2216 6:b70f32a80d51 311 case EVENT_TYPE_BUTTON:
dupm2216 6:b70f32a80d51 312 parsed_button_event_frame_to_string(parsed_frame, readable_string_output);
dupm2216 6:b70f32a80d51 313 break;
dupm2216 6:b70f32a80d51 314
dupm2216 6:b70f32a80d51 315 case EVENT_TYPE_ACCELEROMETER:
dupm2216 6:b70f32a80d51 316 parsed_accelerometer_event_frame_to_string(parsed_frame, readable_string_output);
dupm2216 6:b70f32a80d51 317 break;
dupm2216 6:b70f32a80d51 318
dupm2216 6:b70f32a80d51 319 default:
dupm2216 6:b70f32a80d51 320 strcpy(readable_string_output, "Invalid event type");
dupm2216 6:b70f32a80d51 321 break;
dupm2216 6:b70f32a80d51 322 }
dupm2216 6:b70f32a80d51 323 }
dupm2216 6:b70f32a80d51 324
dupm2216 6:b70f32a80d51 325 void parsed_button_event_frame_to_string(const vector<char>& parsed_frame, char* readable_string_output)
dupm2216 6:b70f32a80d51 326 {
dupm2216 6:b70f32a80d51 327 const char button_state = parsed_frame[2];
dupm2216 6:b70f32a80d51 328 switch(button_state)
dupm2216 6:b70f32a80d51 329 {
dupm2216 8:b9c096965c00 330 case BUTTON_RELEASED:
dupm2216 6:b70f32a80d51 331 strcpy(readable_string_output, "Button state: released");
dupm2216 6:b70f32a80d51 332 break;
dupm2216 6:b70f32a80d51 333
dupm2216 8:b9c096965c00 334 case BUTTON_PRESSED:
dupm2216 6:b70f32a80d51 335 strcpy(readable_string_output, "Button state: pressed");
dupm2216 6:b70f32a80d51 336 break;
dupm2216 6:b70f32a80d51 337
dupm2216 6:b70f32a80d51 338 default:
dupm2216 6:b70f32a80d51 339 strcpy(readable_string_output, "Button state: invalid state");
dupm2216 6:b70f32a80d51 340 break;
dupm2216 6:b70f32a80d51 341 }
dupm2216 6:b70f32a80d51 342 }
dupm2216 6:b70f32a80d51 343
dupm2216 6:b70f32a80d51 344 void parsed_accelerometer_event_frame_to_string(const vector<char>& parsed_frame, char* readable_string_output)
dupm2216 6:b70f32a80d51 345 {
dupm2216 6:b70f32a80d51 346 const uint8_t x = parsed_frame[2];
dupm2216 6:b70f32a80d51 347 const uint8_t y = parsed_frame[3];
dupm2216 6:b70f32a80d51 348 const uint8_t z = parsed_frame[4];
dupm2216 6:b70f32a80d51 349 sprintf(readable_string_output, "Accelerometer state: x=0x%X, y=0x%X, z=0x%X", x, y, z);
dupm2216 6:b70f32a80d51 350 }