Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
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 }
Generated on Tue Jul 12 2022 14:26:51 by
1.7.2