CHENGQI YANG / SmartLabXBeeAPI
Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers XBeeAPI.cpp Source File

XBeeAPI.cpp

00001 #include "XBeeAPI.h"
00002 
00003 XBeeAPI::XBeeAPI(PinName tx, PinName rx, int BaudRate, SmartLab_XBeeAPI::APIMode mode)
00004     : serialPort(tx,rx)
00005 {
00006     isChecksum = true;
00007     searchPosition = -1;
00008     isNeedEscaped = false;
00009     Mode = mode;
00010     serialPort.baud(BaudRate);
00011 }
00012 
00013 void XBeeAPI::DataReceived()
00014 {
00015     Read();
00016     MessageProcess();
00017 }
00018 
00019 void XBeeAPI::Read()
00020 {
00021     while (serialPort.readable()) {
00022         uint8_t b = serialPort.getc();
00023         if (Mode == SmartLab_XBeeAPI::API_NORMAL)
00024             receiveBuffer.push_back(b);
00025         else {
00026             if (isNeedEscaped) {
00027                 isNeedEscaped = false;
00028                 receiveBuffer.push_back(b^0x20);
00029             } else if (b == 0x7D)
00030                 isNeedEscaped = true;
00031             else  receiveBuffer.push_back(b);
00032         }
00033     }
00034 }
00035 
00036 int XBeeAPI::IndexOf()
00037 {
00038     for (uint8_t i = 0; i< receiveBuffer.size(); i++)
00039         if (receiveBuffer[i] == 0x7E)
00040             return i;
00041     receiveBuffer.clear();
00042     return -1;
00043 }
00044 
00045 void XBeeAPI::MessageProcess()
00046 {
00047     if (searchPosition == -1)
00048         searchPosition = IndexOf();
00049     if (searchPosition != -1) {
00050         if (receiveBuffer.size() >= searchPosition + 6) {
00051             int length = receiveBuffer[searchPosition + 1] * 256 + receiveBuffer[searchPosition + 2] + 4;
00052             if (receiveBuffer.size() >= searchPosition + length) {
00053                 PacketProcess(length);
00054                 receiveBuffer.clear();
00055             }
00056         }
00057     }
00058 }
00059 
00060 void XBeeAPI::PacketProcess(int &Length)
00061 {
00062     if (isChecksum) {
00063         uint8_t temp = 0x00;
00064         for (int i = searchPosition + 3; i < searchPosition + Length; i++)
00065             temp += receiveBuffer[i];
00066         if (temp != 0xFF)
00067             return;
00068     }
00069     switch (receiveBuffer[searchPosition + 3]) {
00070         case SmartLab_XBeeAPI::Rx64_Receive_Packet:
00071             Listener->onXBeeRx64Received(XBeeRx64Response(&receiveBuffer[searchPosition], Length));
00072             break;
00073         case SmartLab_XBeeAPI::Rx16_Receive_Packet:
00074             Listener->onXBeeRx16Received(XBeeRx16Response(&receiveBuffer[searchPosition], Length));
00075             break;
00076         case SmartLab_XBeeAPI::Rx64_IO_Data_Sample_Rx_Indicator:
00077             Listener->onXBeeIODataSampleRx64Received(XBeeIODataSampleRx64Response(&receiveBuffer[searchPosition], Length));
00078             break;
00079         case SmartLab_XBeeAPI::Rx16_IO_Data_Sample_Rx_Indicator:
00080             Listener->onXBeeIODataSampleRx16Received(XBeeIODataSampleRx16Response(&receiveBuffer[searchPosition], Length));
00081             break;
00082         case SmartLab_XBeeAPI::XBee_Transmit_Status:
00083             Listener->onXBeeTxStatusReceived(XBeeTxStatusResponse(&receiveBuffer[searchPosition], Length));
00084             break;
00085         case SmartLab_XBeeAPI::AT_Command_Response:
00086             Listener->onATCommandReceived(ATCommandResponse(&receiveBuffer[searchPosition], Length));
00087             break;
00088         case SmartLab_XBeeAPI::Modem_Status:
00089             Listener->onModemStatusReceived(ModemStatusResponse(&receiveBuffer[searchPosition], Length));
00090             break;
00091         case SmartLab_XBeeAPI::ZigBee_Transmit_Status:
00092             Listener->onZigBeeTxStatusReceived(ZigBeeTxStatusResponse(&receiveBuffer[searchPosition], Length));
00093             break;
00094         case SmartLab_XBeeAPI::ZigBee_Receive_Packet:
00095             Listener->onZigBeeRxReceived(ZigBeeRxResponse(&receiveBuffer[searchPosition], Length));
00096             break;
00097         case SmartLab_XBeeAPI::ZigBee_Explicit_Rx_Indicator:
00098             Listener->onZigBeeExplicitRxReceived(ZigBeeExplicitRxResponse(&receiveBuffer[searchPosition], Length));
00099             break;
00100         case SmartLab_XBeeAPI::ZigBee_IO_Data_Sample_Rx_Indicator:
00101             Listener->onZigBeeIOSampleRxReceived(ZigBeeIOSampleRxResponse(&receiveBuffer[searchPosition], Length));
00102             break;
00103         case SmartLab_XBeeAPI::XBee_Sensor_Read_Indicato:
00104             Listener->onXBeeSensorReadReceived(XBeeSensorReadResponse(&receiveBuffer[searchPosition], Length));
00105             break;
00106         case SmartLab_XBeeAPI::Node_Identification_Indicator:
00107             Listener->onNodeIdentificationReceived(NodeIdentificationResponse(&receiveBuffer[searchPosition], Length));
00108             break;
00109         case SmartLab_XBeeAPI::Remote_Command_Response:
00110             Listener->onRemoteATCommandReceived(RemoteATCommandResponse(&receiveBuffer[searchPosition], Length));
00111             break;
00112         case SmartLab_XBeeAPI::Over_the_Air_Firmware_Update_Status:
00113             break;
00114         case SmartLab_XBeeAPI::Route_Record_Indicator:
00115             break;
00116         case SmartLab_XBeeAPI::Many_to_One_Route_Request_Indicator:
00117             break;
00118         default:
00119             break;
00120     }
00121 }
00122 
00123 void XBeeAPI::SetVerifyChecksum(bool status)
00124 {
00125     isChecksum = status;
00126 }
00127 
00128 void XBeeAPI::Send(const RequestBase &request)
00129 {
00130     int i = 1;
00131     const uint8_t* data = request.GetFrameData();
00132     serialPort.putc(0x7E);
00133     switch (Mode) {
00134         case SmartLab_XBeeAPI::API_NORMAL:
00135             for (; i < request.GetFrameDataLength(); i++)
00136                 serialPort.putc(data[i]);
00137             break;
00138         case SmartLab_XBeeAPI::API_ESCAPED:
00139             for (; i < request.GetFrameDataLength(); i++)
00140                 switch (data[i]) {
00141                     case 0x7E:
00142                     case 0x7D:
00143                     case 0x11:
00144                     case 0x13:
00145                         serialPort.putc(0x7D);
00146                         serialPort.putc(data[i] ^ 0x20);
00147                         break;
00148                     default:
00149                         serialPort.putc(data[i]);
00150                         break;
00151                 }
00152             break;
00153     }
00154 }
00155 
00156 void XBeeAPI::Start(PacketListener* packetListener)
00157 {
00158     Listener = packetListener;
00159     serialPort.attach(this, &XBeeAPI::DataReceived, Serial::RxIrq);
00160 }