Library for XBee API targeted toward functions with specific use in conjunction with the Pololu 3pi Robot. Work in Progress
XBee_Robot.cpp
- Committer:
- sleighton
- Date:
- 2016-01-05
- Revision:
- 3:cf539cfd3d59
- Parent:
- 2:5040ec01dba1
- Child:
- 4:af08c7749f9d
File content as of revision 3:cf539cfd3d59:
#include "XBee_Robot.h" #include <vector> #include <algorithm> #include <list> XBee_Robot::XBee_Robot(PinName _txIn, PinName _rxIn): dataLink(_txIn,_rxIn) { _tx = _txIn; //redundant _rx = _rxIn; } void XBee_Robot::setRxInterrupt() { dataLink.attach(this,&XBee_Robot::Rx_interrupt, Serial::RxIrq); } void XBee_Robot::Rx_interrupt() { std::vector<uint8_t> Rx_buffer; while(dataLink.readable()){ Rx_buffer.push_back(dataLink.getc());//add each incoming byte to buffer wait(0.0011); //wait for long enough so the next digit is recognised in the same stream } //Check valid packet delimeter and checksum if((Rx_buffer[0] == 0x7E) && (Rx_buffer[Rx_buffer.size()] == calculateChecksum(Rx_buffer))) RxPacketControl(Rx_buffer); //call packet control function } void XBee_Robot::transmitRequest(uint8_t *BitAddress64, uint8_t *BitAddress16, uint8_t broadcastRadius, uint8_t options, uint8_t *data,size_t dataLength) { //calculate checksum uint16_t length = 0x0E + dataLength; //calculate length of packet (14 + data length) uint8_t lengthu = length >>8; //upper 8 bits uint8_t lengthl = length & 0xFF; //lower 8 bits std::vector<uint8_t> transmitRequestPacket; //create new vector packet //populate packet transmitRequestPacket.push_back(0x7E); //start delimeter transmitRequestPacket.push_back(lengthu); //upper byte of length transmitRequestPacket.push_back(lengthl); //lower byte of length transmitRequestPacket.push_back(0x10); //API ID (transmit request) transmitRequestPacket.push_back(0x01); //channel ID transmitRequestPacket.insert(transmitRequestPacket.end(), BitAddress64, BitAddress64+8); //64 bit destination address transmitRequestPacket.insert(transmitRequestPacket.end(), BitAddress16, BitAddress16+2); //16 bit network address transmitRequestPacket.push_back(broadcastRadius); //broadcast radius (0 = max hops) transmitRequestPacket.push_back(options); //additional options for packet transmitRequestPacket.insert(transmitRequestPacket.end(), data, data+dataLength); //data uint8_t checksum = calculateChecksum(transmitRequestPacket); transmitRequestPacket.push_back(checksum); //calculate and add checksum for (int i = 0; i < transmitRequestPacket.size(); i++){ dataLink.printf("%c",transmitRequestPacket[i]); //send packet printf("%c",transmitRequestPacket[i]); } } uint8_t XBee_Robot::calculateChecksum(std::vector<uint8_t> & packet) { uint8_t checksum = 0xFF; //start with FF as last byte of sum is subtracted from FF for (int i = 3; i < packet.size(); i++) checksum -= packet[i]; return checksum; } void XBee_Robot::RxPacketControl(std::vector<uint8_t> & packet) { uint8_t command = packet[3]; //take API address switch (command) { //index for different commands case 0x90:{ //Receive packet command std::vector<uint8_t> source_addr64; //create new vector to store source address source_addr64.insert(source_addr64.end(), packet.begin() + 4, packet.begin() + 12); //insert source address part of packet into new vector checkSourceAddr(source_addr64); std::vector<uint8_t> data; //create new vector to store data data.insert(data.end(), packet.begin() + 15, packet.end() -1); //insert data part of packet into new vector for(int i = 0; i<data.size();i++){ printf("Data: %d\n",(int)data[i]); //display data from packet } break; } default: printf("Received API address not recognised: %c",command); } } void XBee_Robot::checkSourceAddr(std::vector<uint8_t> & addr) { if (std::find(addr_list.begin(), addr_list.end(), addr) != addr_list.end()) printf("Recognised address\n"); else{ addr_list.push_back(addr); printf("New address added\n"); } }