NerfUS / NerfUSXbee

Dependents:   NerfUS-Coord NerfUSTarget

Fork of APP3_xbee by Team APP

Committer:
GaiSensei
Date:
Tue Feb 14 07:55:15 2017 +0000
Revision:
10:612739c6d27d
Parent:
8:b9c096965c00
Lecture fichier config et pan id

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