//----------------------------------------------------------------------------- void IoHandler::handlePacket() { QByteArray *pPacket; if (comPort->getThread()->getPacket(&pPacket) > 0) { unsigned short cmdID; // Command ID //LENGTH(1)-CMD(2)-DATA(....)-FCS(1) cmdID = MAKE_WORD_LE(pPacket,1); switch (cmdID) { case SYS_PING_RESPONSE: unsigned short profileID; profileID= MAKE_WORD_LE(pPacket,3); pNodeDb->setProfileID(profileID); pingAnswered = true; emit pingReceived(); break; case ZB_RECEIVE_DATA_INDICATION: handleData(pPacket); break; default: emit unknownMessage(); } if (pLog) pLog->enterPacket(pPacket); } else { emit emptyPacket(); } }
void AmptekSDD123Server::processLocalStoredPacket(const AmptekSDD123Packet &responsePacket) { bool foundTimedOutPacket = false; bool rerequestRequired = false; if(timedOutPackets_.count() > 0){ for(int x = 0; x < timedOutPackets_.count(); x++){ AMDSRunTimeSupport::debugMessage(AMDSRunTimeSupport::InformationMsg, this, AMPTEK_SERVER_INFO_PACKET_QUEUE_BUSY, QString("Timed Out Packet: %1 %2").arg(timedOutPackets_.at(x).command()).arg(QString(QByteArray::fromHex(timedOutPackets_.at(x).dataString().toAscii())))); } AmptekSDD123Packet headPacket(-1, QString("NONE")); while(!foundTimedOutPacket && timedOutPackets_.count() > 0){ headPacket = timedOutPackets_.dequeue(); if(responsePacket.commandId() == AmptekCommandManagerSGM::ResponseCommTestEchoPacket && headPacket.commandId() == AmptekCommandManagerSGM::RequestCommTestEchoPacket && responsePacket.dataString() == headPacket.dataString()) { foundTimedOutPacket = true; } else if(responsePacket.commandId() != AmptekCommandManagerSGM::ResponseCommTestEchoPacket && headPacket.possibleResponses().contains(responsePacket.commandHex())){ foundTimedOutPacket = true; AmptekSDD123Packet emptyPacket(-1, QString("NONE")); currentRequestPacket_ = emptyPacket; } else { if(headPacket.command() == currentRequestPacket_.command() && responsePacket.dataString() == currentSyncPacket_.dataString()) rerequestRequired = true; droppedPackets_.appendPacket(QDateTime::currentDateTimeUtc(), headPacket); emit dropPacketDetected(); } } } AmptekSDD123Packet localRequestPacket(currentRequestPacket_.packetID(), currentRequestPacket_); if (!foundTimedOutPacket) { if (currentRequestPacket_.possibleResponses().contains(responsePacket.commandHex())) { AmptekSDD123Packet emptyPacket(-1, QString("NONE")); currentRequestPacket_ = emptyPacket; } else if (currentSyncPacket_.dataString() == responsePacket.dataString()) { AmptekSDD123Packet emptyPacket(-1, QString("NONE")); currentSyncPacket_ = emptyPacket; } else { unrequestedPackets_.appendPacket(QDateTime::currentDateTimeUtc(), responsePacket); emit unrequestedPacketDetected(); } } socketLocallyBusy_ = false; if(rerequestRequired){ if(localRequestPacket.currentRetries() < localRequestPacket.maxRetries()){ localRequestPacket.incrementRetries(packetIDCounter_); sendRequestDatagram(localRequestPacket); packetIDCounter_++; } else { emit fatalTimeout(); } } if(localRequestPacket.isForwarded()){ hasReplyReady_ = true; emit replyDatagram(responsePacket.packetID(), responsePacket.datagram()); } }