Library for XBee API targeted toward functions with specific use in conjunction with the Pololu 3pi Robot. Work in Progress
Diff: XBee_Robot.cpp
- Revision:
- 11:6b699617fc7f
- Parent:
- 10:cb1d91c06093
- Child:
- 12:a7ec1238373e
--- a/XBee_Robot.cpp Sun Jan 31 20:01:54 2016 +0000 +++ b/XBee_Robot.cpp Tue Feb 02 11:02:48 2016 +0000 @@ -9,10 +9,20 @@ nodeNum = indexIn; } -std::vector<uint8_t> NetworkNode::getAddr(){ //returns address of node +NetworkNode::NetworkNode(std::vector<uint8_t> & addrIn, std::vector<uint8_t> & addr64In, int indexIn){ + addr = addrIn; + nodeNum = indexIn; + addr64 = addr64In; +} + +std::vector<uint8_t> NetworkNode::getAddr(){ //returns 16 bit address of node return addr; } +std::vector<uint8_t> NetworkNode::getAddr64(){ //returns 64 bit address of node + return addr64; +} + int NetworkNode::getIndex(){ //returns index of node return nodeNum; } @@ -94,7 +104,6 @@ for (int i = 0; i < transmitRequestPacket.size(); i++){ dataLink.printf("%c",transmitRequestPacket[i]); //send packet - printf("%c",transmitRequestPacket[i]); } } @@ -137,9 +146,11 @@ switch (command) { //index for different commands case 0x90:{ //Receive packet command - std::vector<uint8_t> source_addr16; //create new vector to store source address - source_addr16.insert(source_addr16.end(), packet.begin() + 13, packet.begin() + 15); //insert source address part of packet into new vector - checkSourceAddr(source_addr16); + std::vector<uint8_t> source_addr16; //create new vector to 16 bit store source address + std::vector<uint8_t> source_addr64; //create new vector to 64 bit store source address + source_addr16.insert(source_addr16.end(), packet.begin() + 12, packet.begin() + 14); //insert source address part of packet into new vector + source_addr64.insert(source_addr64.end(), packet.begin() + 4, packet.begin() + 12); //insert source address part of packet into new vector + checkSourceAddr(source_addr16,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 @@ -160,11 +171,37 @@ } break; } + case 0x8B: { //Tx status packet command + if(packet[8] == 0 )//if delivery status is 00 (success) + printf("Packet successfully transmitted to 16 bit destination address: %c%c",packet[5],packet[6]); + else + printf("Packet delivery failed (status %c)",packet[8]); + break; + } default: printf("Received API address not recognised: %c",command); } } +void XBee_Robot::checkSourceAddr(std::vector<uint8_t> & addr, std::vector<uint8_t> & addr64) +{ + bool exists = false; + for (int i = 0; i<node_list.size();i++){ //search each entry in node_list for matching address + currentIndex = i; //update currentIndex + if(node_list[i].getAddr() == addr){ + exists = true; + printf("Recognised node %d\n",node_list[i].getIndex()); //print node number + } + } + if (exists == false){ //add new address to list if no match found + currentIndex++; //increment current index for new entry + NetworkNode newNode(addr,addr64,node_list.size());//create new node + node_list.push_back(newNode); //add new node to list + printf("New address added: Node %d\n",(int)node_list.size()-1); + } + +} + void XBee_Robot::checkSourceAddr(std::vector<uint8_t> & addr) { bool exists = false; @@ -177,7 +214,7 @@ } if (exists == false){ //add new address to list if no match found currentIndex++; //increment current index for new entry - NetworkNode newNode(addr,node_list.size());//create new node + NetworkNode newNode(addr,node_list.size()); //create new node node_list.push_back(newNode); //add new node to list printf("New address added: Node %d\n",(int)node_list.size()-1); }