NerfUS / NerfUSXbee

Dependents:   NerfUS-Coord NerfUSTarget

Fork of APP3_xbee by Team APP

Committer:
dupm2216
Date:
Sat Feb 11 20:47:45 2017 +0000
Revision:
0:8f5379c94a69
Child:
3:37ea92feece2
Moved xbee to library

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dupm2216 0:8f5379c94a69 1 #include "xbee.h"
dupm2216 0:8f5379c94a69 2
dupm2216 0:8f5379c94a69 3 DigitalOut led_1(LED1);
dupm2216 0:8f5379c94a69 4 Mail<vector<char>, 30> received_messages;
dupm2216 0:8f5379c94a69 5 RawSerial xbee(p13, p14);
dupm2216 0:8f5379c94a69 6 const int FRAME_SPECIFIC_DATA_BEGIN[14] = {0x10, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFE, 0x00, 0x00};
dupm2216 0:8f5379c94a69 7 const int RECEIVE_PACKET_MESSAGE_START_INDEX = 15;
dupm2216 0:8f5379c94a69 8
dupm2216 0:8f5379c94a69 9 const char START_DELIMITER = 0x7E;
dupm2216 0:8f5379c94a69 10
dupm2216 0:8f5379c94a69 11 void send_message_via_xbee(const char* message, const int length)
dupm2216 0:8f5379c94a69 12 {
dupm2216 0:8f5379c94a69 13 const vector<char> transmit_request = generate_transmit_request(message, length);
dupm2216 0:8f5379c94a69 14
dupm2216 0:8f5379c94a69 15 for(int i=0; i<transmit_request.size(); i++)
dupm2216 0:8f5379c94a69 16 {
dupm2216 0:8f5379c94a69 17 xbee.putc(transmit_request[i]);
dupm2216 0:8f5379c94a69 18 }
dupm2216 0:8f5379c94a69 19 }
dupm2216 0:8f5379c94a69 20
dupm2216 0:8f5379c94a69 21 vector<char> generate_transmit_request(const char* message, const int length)
dupm2216 0:8f5379c94a69 22 {
dupm2216 0:8f5379c94a69 23 vector<char> request;
dupm2216 0:8f5379c94a69 24
dupm2216 0:8f5379c94a69 25 unsigned char checksum = 0xFF;
dupm2216 0:8f5379c94a69 26
dupm2216 0:8f5379c94a69 27 request.push_back(START_DELIMITER);
dupm2216 0:8f5379c94a69 28
dupm2216 0:8f5379c94a69 29 const uint16_t frame_length = 0x0E + length;
dupm2216 0:8f5379c94a69 30 const uint8_t frame_length_msb = frame_length >> 8;
dupm2216 0:8f5379c94a69 31 const uint8_t frame_length_lsb = (frame_length << 8) >> 8;
dupm2216 0:8f5379c94a69 32 request.push_back(frame_length_msb);
dupm2216 0:8f5379c94a69 33 request.push_back(frame_length_lsb);
dupm2216 0:8f5379c94a69 34
dupm2216 0:8f5379c94a69 35 for(int i=0; i<14; i++)
dupm2216 0:8f5379c94a69 36 {
dupm2216 0:8f5379c94a69 37 request.push_back(FRAME_SPECIFIC_DATA_BEGIN[i]);
dupm2216 0:8f5379c94a69 38 checksum -= FRAME_SPECIFIC_DATA_BEGIN[i];
dupm2216 0:8f5379c94a69 39 }
dupm2216 0:8f5379c94a69 40
dupm2216 0:8f5379c94a69 41 for(int i=0; i<length; i++)
dupm2216 0:8f5379c94a69 42 {
dupm2216 0:8f5379c94a69 43 request.push_back(message[i]);
dupm2216 0:8f5379c94a69 44 checksum -= message[i];
dupm2216 0:8f5379c94a69 45 }
dupm2216 0:8f5379c94a69 46
dupm2216 0:8f5379c94a69 47 request.push_back(checksum);
dupm2216 0:8f5379c94a69 48
dupm2216 0:8f5379c94a69 49 return request;
dupm2216 0:8f5379c94a69 50 }
dupm2216 0:8f5379c94a69 51
dupm2216 0:8f5379c94a69 52 void read_frame()
dupm2216 0:8f5379c94a69 53 {
dupm2216 0:8f5379c94a69 54 while(true)
dupm2216 0:8f5379c94a69 55 {
dupm2216 0:8f5379c94a69 56 while(xbee.getc() != 0x7E);
dupm2216 0:8f5379c94a69 57
dupm2216 0:8f5379c94a69 58 vector<char> frame;
dupm2216 0:8f5379c94a69 59
dupm2216 0:8f5379c94a69 60 frame.push_back(0x7E);
dupm2216 0:8f5379c94a69 61
dupm2216 0:8f5379c94a69 62 const uint8_t frame_size_msb = xbee.getc();
dupm2216 0:8f5379c94a69 63 const uint8_t frame_size_lsb = xbee.getc();
dupm2216 0:8f5379c94a69 64 frame.push_back(frame_size_msb);
dupm2216 0:8f5379c94a69 65 frame.push_back(frame_size_lsb);
dupm2216 0:8f5379c94a69 66 const uint16_t frame_size = (frame_size_msb << 8) + frame_size_lsb;
dupm2216 0:8f5379c94a69 67
dupm2216 0:8f5379c94a69 68 for(int i=0; i<frame_size + 1; i++)
dupm2216 0:8f5379c94a69 69 {
dupm2216 0:8f5379c94a69 70 frame.push_back(xbee.getc());
dupm2216 0:8f5379c94a69 71 }
dupm2216 0:8f5379c94a69 72
dupm2216 0:8f5379c94a69 73 vector<char> *parsed_frame = received_messages.alloc();
dupm2216 0:8f5379c94a69 74 *parsed_frame = parse_receive_packet(frame);
dupm2216 0:8f5379c94a69 75
dupm2216 0:8f5379c94a69 76 received_messages.put(parsed_frame);
dupm2216 0:8f5379c94a69 77 }
dupm2216 0:8f5379c94a69 78 }
dupm2216 0:8f5379c94a69 79
dupm2216 0:8f5379c94a69 80 vector<char> parse_receive_packet(vector<char> transmitted_request)
dupm2216 0:8f5379c94a69 81 {
dupm2216 0:8f5379c94a69 82 vector<char>::const_iterator first = transmitted_request.begin() + RECEIVE_PACKET_MESSAGE_START_INDEX;
dupm2216 0:8f5379c94a69 83 vector<char>::const_iterator last = transmitted_request.end() - 1;
dupm2216 0:8f5379c94a69 84 vector<char> message(first, last);
dupm2216 0:8f5379c94a69 85 return message;
dupm2216 0:8f5379c94a69 86 }
dupm2216 0:8f5379c94a69 87
dupm2216 0:8f5379c94a69 88 void handle_message()
dupm2216 0:8f5379c94a69 89 {
dupm2216 0:8f5379c94a69 90 while(true)
dupm2216 0:8f5379c94a69 91 {
dupm2216 0:8f5379c94a69 92 osEvent event = received_messages.get();
dupm2216 0:8f5379c94a69 93 if (event.status == osEventMail)
dupm2216 0:8f5379c94a69 94 {
dupm2216 0:8f5379c94a69 95 vector<char> *message = (vector<char>*)event.value.p;
dupm2216 0:8f5379c94a69 96
dupm2216 0:8f5379c94a69 97 printf("Received message: ");
dupm2216 0:8f5379c94a69 98 for(int i=0; i<message->size(); i++)
dupm2216 0:8f5379c94a69 99 {
dupm2216 0:8f5379c94a69 100 printf("%c", message->at(i));
dupm2216 0:8f5379c94a69 101 }
dupm2216 0:8f5379c94a69 102 printf("\r\n");
dupm2216 0:8f5379c94a69 103 received_messages.free(message);
dupm2216 0:8f5379c94a69 104 }
dupm2216 0:8f5379c94a69 105 }
dupm2216 0:8f5379c94a69 106 }