//-----------------------------------------------------------------------------
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());
	}
}