NerfUS / NerfUSXbee

Dependents:   NerfUS-Coord NerfUSTarget

Fork of APP3_xbee by Team APP

Committer:
GaiSensei
Date:
Tue Feb 14 01:13:18 2017 +0000
Revision:
7:c65c4c98d237
Parent:
6:b70f32a80d51
Child:
8:b9c096965c00
On peut envoyer des messages des capteurs

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 0:8f5379c94a69 4 DigitalOut led_1(LED1);
dupm2216 4:e97cfe6cc18c 5 Mail<vector<char>, 30> parsed_frames;
dupm2216 0:8f5379c94a69 6 RawSerial xbee(p13, p14);
GaiSensei 7:c65c4c98d237 7 Mutex mutex;
dupm2216 0:8f5379c94a69 8 const int FRAME_SPECIFIC_DATA_BEGIN[14] = {0x10, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFE, 0x00, 0x00};
dupm2216 5:cd3c79853dc8 9 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 10 const char LED_COMMAND_POWER_ON = 0x05;
dupm2216 5:cd3c79853dc8 11 const char LED_COMMAND_POWER_OFF = 0x04;
dupm2216 0:8f5379c94a69 12 const int RECEIVE_PACKET_MESSAGE_START_INDEX = 15;
dupm2216 0:8f5379c94a69 13
dupm2216 0:8f5379c94a69 14 const char START_DELIMITER = 0x7E;
dupm2216 0:8f5379c94a69 15
GaiSensei 7:c65c4c98d237 16 bool is_character_that_needs_escape(const char character)
GaiSensei 7:c65c4c98d237 17 {
GaiSensei 7:c65c4c98d237 18 //printf("%X\r\n", character);
GaiSensei 7:c65c4c98d237 19 switch(character)
GaiSensei 7:c65c4c98d237 20 {
GaiSensei 7:c65c4c98d237 21 case 0x7E: return true;
GaiSensei 7:c65c4c98d237 22 case 0x7D: return true;
GaiSensei 7:c65c4c98d237 23 case 0x11: return true;
GaiSensei 7:c65c4c98d237 24 case 0x13: return true;
GaiSensei 7:c65c4c98d237 25 default: return false;
GaiSensei 7:c65c4c98d237 26 }
GaiSensei 7:c65c4c98d237 27 }
GaiSensei 7:c65c4c98d237 28
dupm2216 0:8f5379c94a69 29 void send_message_via_xbee(const char* message, const int length)
dupm2216 0:8f5379c94a69 30 {
GaiSensei 7:c65c4c98d237 31 //printf("send_message_via_xbee\r\n");
dupm2216 0:8f5379c94a69 32 const vector<char> transmit_request = generate_transmit_request(message, length);
dupm2216 0:8f5379c94a69 33
GaiSensei 7:c65c4c98d237 34 mutex.lock();
dupm2216 0:8f5379c94a69 35 for(int i=0; i<transmit_request.size(); i++)
dupm2216 0:8f5379c94a69 36 {
GaiSensei 7:c65c4c98d237 37 assert( i==0 || !is_character_that_needs_escape(transmit_request[i]));
dupm2216 0:8f5379c94a69 38 xbee.putc(transmit_request[i]);
dupm2216 0:8f5379c94a69 39 }
GaiSensei 7:c65c4c98d237 40 mutex.unlock();
dupm2216 0:8f5379c94a69 41 }
dupm2216 0:8f5379c94a69 42
dupm2216 0:8f5379c94a69 43 vector<char> generate_transmit_request(const char* message, const int length)
dupm2216 0:8f5379c94a69 44 {
dupm2216 0:8f5379c94a69 45 vector<char> request;
dupm2216 0:8f5379c94a69 46
dupm2216 0:8f5379c94a69 47 unsigned char checksum = 0xFF;
dupm2216 0:8f5379c94a69 48
dupm2216 0:8f5379c94a69 49 request.push_back(START_DELIMITER);
dupm2216 0:8f5379c94a69 50
dupm2216 0:8f5379c94a69 51 const uint16_t frame_length = 0x0E + length;
dupm2216 0:8f5379c94a69 52 const uint8_t frame_length_msb = frame_length >> 8;
dupm2216 0:8f5379c94a69 53 const uint8_t frame_length_lsb = (frame_length << 8) >> 8;
dupm2216 0:8f5379c94a69 54 request.push_back(frame_length_msb);
dupm2216 0:8f5379c94a69 55 request.push_back(frame_length_lsb);
dupm2216 0:8f5379c94a69 56
dupm2216 0:8f5379c94a69 57 for(int i=0; i<14; i++)
dupm2216 0:8f5379c94a69 58 {
dupm2216 0:8f5379c94a69 59 request.push_back(FRAME_SPECIFIC_DATA_BEGIN[i]);
dupm2216 0:8f5379c94a69 60 checksum -= FRAME_SPECIFIC_DATA_BEGIN[i];
dupm2216 0:8f5379c94a69 61 }
dupm2216 0:8f5379c94a69 62
dupm2216 0:8f5379c94a69 63 for(int i=0; i<length; i++)
dupm2216 0:8f5379c94a69 64 {
dupm2216 0:8f5379c94a69 65 request.push_back(message[i]);
dupm2216 0:8f5379c94a69 66 checksum -= message[i];
dupm2216 0:8f5379c94a69 67 }
dupm2216 0:8f5379c94a69 68
dupm2216 0:8f5379c94a69 69 request.push_back(checksum);
dupm2216 0:8f5379c94a69 70
dupm2216 0:8f5379c94a69 71 return request;
dupm2216 0:8f5379c94a69 72 }
dupm2216 0:8f5379c94a69 73
dupm2216 5:cd3c79853dc8 74 vector<char> generate_led_command(const bool power_on)
dupm2216 5:cd3c79853dc8 75 {
dupm2216 5:cd3c79853dc8 76 vector<char> request;
dupm2216 5:cd3c79853dc8 77
dupm2216 5:cd3c79853dc8 78 unsigned char checksum = 0xFF;
dupm2216 5:cd3c79853dc8 79
dupm2216 5:cd3c79853dc8 80 request.push_back(START_DELIMITER);
dupm2216 5:cd3c79853dc8 81
dupm2216 5:cd3c79853dc8 82 const uint16_t frame_length = 0x10;
dupm2216 5:cd3c79853dc8 83 const uint8_t frame_length_msb = frame_length >> 8;
dupm2216 5:cd3c79853dc8 84 const uint8_t frame_length_lsb = (frame_length << 8) >> 8;
dupm2216 5:cd3c79853dc8 85 request.push_back(frame_length_msb);
dupm2216 5:cd3c79853dc8 86 request.push_back(frame_length_lsb);
dupm2216 5:cd3c79853dc8 87
dupm2216 5:cd3c79853dc8 88 for(int i=0; i<15; i++)
dupm2216 5:cd3c79853dc8 89 {
dupm2216 5:cd3c79853dc8 90 request.push_back(AT_COMMAND_LED_FRAME_SPECIFIC_DATA_BEGIN[i]);
dupm2216 5:cd3c79853dc8 91 checksum -= AT_COMMAND_LED_FRAME_SPECIFIC_DATA_BEGIN[i];
dupm2216 5:cd3c79853dc8 92 }
dupm2216 5:cd3c79853dc8 93
dupm2216 5:cd3c79853dc8 94 const char led_power_state = power_on ? LED_COMMAND_POWER_ON : LED_COMMAND_POWER_OFF;
dupm2216 5:cd3c79853dc8 95 request.push_back(led_power_state);
dupm2216 5:cd3c79853dc8 96 checksum -= led_power_state;
dupm2216 5:cd3c79853dc8 97
dupm2216 5:cd3c79853dc8 98 request.push_back(checksum);
dupm2216 5:cd3c79853dc8 99
dupm2216 5:cd3c79853dc8 100 return request;
dupm2216 5:cd3c79853dc8 101 }
dupm2216 5:cd3c79853dc8 102
dupm2216 0:8f5379c94a69 103 void read_frame()
dupm2216 0:8f5379c94a69 104 {
dupm2216 0:8f5379c94a69 105 while(true)
dupm2216 0:8f5379c94a69 106 {
dupm2216 0:8f5379c94a69 107 while(xbee.getc() != 0x7E);
dupm2216 0:8f5379c94a69 108
dupm2216 0:8f5379c94a69 109 vector<char> frame;
dupm2216 0:8f5379c94a69 110
dupm2216 0:8f5379c94a69 111 frame.push_back(0x7E);
dupm2216 0:8f5379c94a69 112
dupm2216 0:8f5379c94a69 113 const uint8_t frame_size_msb = xbee.getc();
dupm2216 0:8f5379c94a69 114 const uint8_t frame_size_lsb = xbee.getc();
dupm2216 0:8f5379c94a69 115 frame.push_back(frame_size_msb);
dupm2216 0:8f5379c94a69 116 frame.push_back(frame_size_lsb);
dupm2216 0:8f5379c94a69 117 const uint16_t frame_size = (frame_size_msb << 8) + frame_size_lsb;
dupm2216 0:8f5379c94a69 118
dupm2216 0:8f5379c94a69 119 for(int i=0; i<frame_size + 1; i++)
dupm2216 0:8f5379c94a69 120 {
dupm2216 0:8f5379c94a69 121 frame.push_back(xbee.getc());
dupm2216 0:8f5379c94a69 122 }
dupm2216 4:e97cfe6cc18c 123
dupm2216 4:e97cfe6cc18c 124 handle_frame(frame);
dupm2216 0:8f5379c94a69 125 }
dupm2216 0:8f5379c94a69 126 }
dupm2216 0:8f5379c94a69 127
dupm2216 3:37ea92feece2 128 vector<char> parse_receive_packet(const vector<char>& frame)
dupm2216 0:8f5379c94a69 129 {
dupm2216 3:37ea92feece2 130 vector<char>::const_iterator first = frame.begin() + RECEIVE_PACKET_MESSAGE_START_INDEX;
dupm2216 3:37ea92feece2 131 vector<char>::const_iterator last = frame.end() - 1;
dupm2216 0:8f5379c94a69 132 vector<char> message(first, last);
dupm2216 0:8f5379c94a69 133 return message;
dupm2216 0:8f5379c94a69 134 }
dupm2216 0:8f5379c94a69 135
dupm2216 3:37ea92feece2 136 vector<char> parse_transmit_status(const vector<char>& frame)
dupm2216 3:37ea92feece2 137 {
dupm2216 3:37ea92feece2 138 vector<char> relevant_content;
dupm2216 3:37ea92feece2 139
dupm2216 3:37ea92feece2 140 const char delivery_status = frame.at(8);
dupm2216 3:37ea92feece2 141 relevant_content.push_back(delivery_status);
dupm2216 3:37ea92feece2 142
dupm2216 3:37ea92feece2 143 return relevant_content;
dupm2216 3:37ea92feece2 144 }
dupm2216 3:37ea92feece2 145
dupm2216 3:37ea92feece2 146 vector<char> parse_at_command_response(const vector<char>& frame)
dupm2216 3:37ea92feece2 147 {
dupm2216 3:37ea92feece2 148 vector<char> relevant_content;
dupm2216 3:37ea92feece2 149
dupm2216 3:37ea92feece2 150 const char command_status = frame.at(7);
dupm2216 3:37ea92feece2 151 relevant_content.push_back(command_status);
dupm2216 3:37ea92feece2 152
dupm2216 3:37ea92feece2 153 return relevant_content;
dupm2216 3:37ea92feece2 154 }
dupm2216 3:37ea92feece2 155
dupm2216 4:e97cfe6cc18c 156 void handle_parsed_frames_from_mailbox()
dupm2216 0:8f5379c94a69 157 {
dupm2216 0:8f5379c94a69 158 while(true)
dupm2216 0:8f5379c94a69 159 {
dupm2216 4:e97cfe6cc18c 160 osEvent event = parsed_frames.get();
dupm2216 4:e97cfe6cc18c 161 assert(event.status == osEventMail);
dupm2216 4:e97cfe6cc18c 162
dupm2216 4:e97cfe6cc18c 163 vector<char> *message = (vector<char>*)event.value.p;
dupm2216 4:e97cfe6cc18c 164
dupm2216 4:e97cfe6cc18c 165 const char parsed_frame_type = message->at(0);
dupm2216 4:e97cfe6cc18c 166 printf("Handling parsed frame. Type: %d\r\n", parsed_frame_type);
dupm2216 4:e97cfe6cc18c 167
dupm2216 4:e97cfe6cc18c 168 printf("Relevant content: ");
dupm2216 4:e97cfe6cc18c 169 for(int i=1; i<message->size(); i++)
dupm2216 0:8f5379c94a69 170 {
dupm2216 4:e97cfe6cc18c 171 printf("%d\r\n", message->at(i));
dupm2216 0:8f5379c94a69 172 }
dupm2216 4:e97cfe6cc18c 173
dupm2216 4:e97cfe6cc18c 174 parsed_frames.free(message);
dupm2216 0:8f5379c94a69 175 }
dupm2216 3:37ea92feece2 176 }
dupm2216 3:37ea92feece2 177
dupm2216 4:e97cfe6cc18c 178 void handle_frame(const vector<char>& frame)
dupm2216 4:e97cfe6cc18c 179 {
dupm2216 4:e97cfe6cc18c 180 vector<char> *parsed_frame = parsed_frames.alloc();
dupm2216 4:e97cfe6cc18c 181 *parsed_frame = parse_frame(frame);
dupm2216 4:e97cfe6cc18c 182 parsed_frames.put(parsed_frame);
dupm2216 4:e97cfe6cc18c 183 }
dupm2216 4:e97cfe6cc18c 184
dupm2216 3:37ea92feece2 185 vector<char> parse_frame(const vector<char>& frame)
dupm2216 3:37ea92feece2 186 {
dupm2216 3:37ea92feece2 187 vector<char> parsed_frame;
dupm2216 3:37ea92feece2 188
dupm2216 3:37ea92feece2 189 const char frame_type = frame.at(3);
dupm2216 3:37ea92feece2 190 parsed_frame.push_back(frame_type);
dupm2216 3:37ea92feece2 191
dupm2216 3:37ea92feece2 192 vector<char> parsed_frame_relevant_content;
dupm2216 3:37ea92feece2 193
dupm2216 3:37ea92feece2 194 switch(frame_type)
dupm2216 3:37ea92feece2 195 {
dupm2216 3:37ea92feece2 196 case FRAME_TYPE_RECEIVE_PACKET:
dupm2216 3:37ea92feece2 197 {
dupm2216 3:37ea92feece2 198 parsed_frame_relevant_content = parse_receive_packet(frame);
dupm2216 3:37ea92feece2 199 break;
dupm2216 3:37ea92feece2 200 }
dupm2216 3:37ea92feece2 201 case FRAME_TYPE_TRANSMIT_STATUS:
dupm2216 3:37ea92feece2 202 {
dupm2216 3:37ea92feece2 203 parsed_frame_relevant_content = parse_transmit_status(frame);
dupm2216 3:37ea92feece2 204 break;
dupm2216 3:37ea92feece2 205 }
dupm2216 3:37ea92feece2 206 case FRAME_TYPE_AT_COMMAND_RESPONSE:
dupm2216 3:37ea92feece2 207 {
dupm2216 3:37ea92feece2 208 parsed_frame_relevant_content = parse_at_command_response(frame);
dupm2216 3:37ea92feece2 209 break;
dupm2216 3:37ea92feece2 210 }
dupm2216 3:37ea92feece2 211 default: assert(false && "Unsupported frame type");
dupm2216 3:37ea92feece2 212 }
dupm2216 3:37ea92feece2 213
dupm2216 3:37ea92feece2 214 for(vector<char>::iterator it = parsed_frame_relevant_content.begin(); it < parsed_frame_relevant_content.end(); it++)
dupm2216 3:37ea92feece2 215 {
dupm2216 3:37ea92feece2 216 parsed_frame.push_back(*it);
dupm2216 3:37ea92feece2 217 }
dupm2216 3:37ea92feece2 218
dupm2216 3:37ea92feece2 219 return parsed_frame;
dupm2216 3:37ea92feece2 220 }
dupm2216 6:b70f32a80d51 221
dupm2216 6:b70f32a80d51 222 void parsed_frame_to_string(const vector<char>& parsed_frame, char* readable_string_output)
dupm2216 6:b70f32a80d51 223 {
dupm2216 6:b70f32a80d51 224 const char event_type = parsed_frame[1];
dupm2216 6:b70f32a80d51 225 switch(event_type)
dupm2216 6:b70f32a80d51 226 {
dupm2216 6:b70f32a80d51 227 case EVENT_TYPE_BUTTON:
dupm2216 6:b70f32a80d51 228 parsed_button_event_frame_to_string(parsed_frame, readable_string_output);
dupm2216 6:b70f32a80d51 229 break;
dupm2216 6:b70f32a80d51 230
dupm2216 6:b70f32a80d51 231 case EVENT_TYPE_ACCELEROMETER:
dupm2216 6:b70f32a80d51 232 parsed_accelerometer_event_frame_to_string(parsed_frame, readable_string_output);
dupm2216 6:b70f32a80d51 233 break;
dupm2216 6:b70f32a80d51 234
dupm2216 6:b70f32a80d51 235 default:
dupm2216 6:b70f32a80d51 236 strcpy(readable_string_output, "Invalid event type");
dupm2216 6:b70f32a80d51 237 break;
dupm2216 6:b70f32a80d51 238 }
dupm2216 6:b70f32a80d51 239 }
dupm2216 6:b70f32a80d51 240
dupm2216 6:b70f32a80d51 241 void parsed_button_event_frame_to_string(const vector<char>& parsed_frame, char* readable_string_output)
dupm2216 6:b70f32a80d51 242 {
dupm2216 6:b70f32a80d51 243 const char button_state = parsed_frame[2];
dupm2216 6:b70f32a80d51 244 switch(button_state)
dupm2216 6:b70f32a80d51 245 {
dupm2216 6:b70f32a80d51 246 case 0x00:
dupm2216 6:b70f32a80d51 247 strcpy(readable_string_output, "Button state: released");
dupm2216 6:b70f32a80d51 248 break;
dupm2216 6:b70f32a80d51 249
dupm2216 6:b70f32a80d51 250 case 0x01:
dupm2216 6:b70f32a80d51 251 strcpy(readable_string_output, "Button state: pressed");
dupm2216 6:b70f32a80d51 252 break;
dupm2216 6:b70f32a80d51 253
dupm2216 6:b70f32a80d51 254 default:
dupm2216 6:b70f32a80d51 255 strcpy(readable_string_output, "Button state: invalid state");
dupm2216 6:b70f32a80d51 256 break;
dupm2216 6:b70f32a80d51 257 }
dupm2216 6:b70f32a80d51 258 }
dupm2216 6:b70f32a80d51 259
dupm2216 6:b70f32a80d51 260 void parsed_accelerometer_event_frame_to_string(const vector<char>& parsed_frame, char* readable_string_output)
dupm2216 6:b70f32a80d51 261 {
dupm2216 6:b70f32a80d51 262 const uint8_t x = parsed_frame[2];
dupm2216 6:b70f32a80d51 263 const uint8_t y = parsed_frame[3];
dupm2216 6:b70f32a80d51 264 const uint8_t z = parsed_frame[4];
dupm2216 6:b70f32a80d51 265 sprintf(readable_string_output, "Accelerometer state: x=0x%X, y=0x%X, z=0x%X", x, y, z);
dupm2216 6:b70f32a80d51 266 }