OutilZT/sources/TCPProtocol.cpp
2017-07-20 11:11:06 -04:00

331 lines
8.6 KiB
C++

#include "TCPProtocol.h"
#include <QByteArray>
#include <QDataStream>
#include <QDebug>
CTCPProtocol::CTCPProtocol()
{
ResetRxStateMachine();
}
unsigned int CTCPProtocol::AnalyzeNewData(QByteArray data)
{
QDataStream stream(data);
stream.device()->seek(0);
switch(mProtocolRxState)
{
case TCP_PROTOCOL_GET_HEADER_STATE:
{
quint32 header;
qint32 msg;
stream >> header;
if(header != TCP_PROTOCOL_HEADER)
{
return RET_ERROR;
}
stream >> msg;
stream >> mCurTransactionDataSize;
mCurTransactionMsg = (eTCPMessage)msg;
if(mCurTransactionDataSize != 0)
{
mCurTransactionData = stream.device()->readAll();
if(mCurTransactionData.size() < mCurTransactionDataSize)
{
mProtocolRxState = TCP_PROTOCOL_GET_DATA_STATE;
// qDebug() << "Datasize is: " << mCurTransactionDataSize << ". Going in GET_DATA_STATE";
}
else if(mCurTransactionData.size() > mCurTransactionDataSize)
{
//error
// qDebug("Rx data [%d] > Transaction data [%d]. Aborting transaction",mCurTransactionData.size(),(int)mCurTransactionDataSize);
ResetRxStateMachine();
}
else
{
DecodeTCPMessage();
ResetRxStateMachine();
}
}
else
{
DecodeTCPMessage();
ResetRxStateMachine();
}
break;
}
case TCP_PROTOCOL_GET_MSG_STATE:
{
break;
}
case TCP_PROTOCOL_GET_DATASIZE_STATE:
{
break;
}
case TCP_PROTOCOL_GET_DATA_STATE:
{
mCurTransactionData.append(data);
if(mCurTransactionData.size() == mCurTransactionDataSize)
{
//All data received
// qDebug() << "Data Rx complete... New data size = " << mCurTransactionData.size();
DecodeTCPMessage();
ResetRxStateMachine();
}
else if(mCurTransactionData.size() > mCurTransactionDataSize)
{
//error
qDebug("Rx data > Transaction data. Aborting transaction");
ResetRxStateMachine();
}
else
{
// qDebug() << "Chunk received. New data size = " << mCurTransactionData.size();
}
break;
}
}
return RET_OK;
}
QByteArray CTCPProtocol::GetHeartbeatReqPacket()
{
return BuildSimpleRequestPacket((qint32)TCP_MSG_HEARTBEAT_REQUEST);
}
QByteArray CTCPProtocol::GetStationNameReqPacket()
{
return BuildSimpleRequestPacket((qint32)TCP_MSG_STATION_NAME_REQUEST);
}
QByteArray CTCPProtocol::GetZTStatusReqPacket()
{
return BuildSimpleRequestPacket((qint32)TCP_MSG_ZT_STATUS_REQUEST);
}
QByteArray CTCPProtocol::GetZTLogDownloadReqPacket()
{
return BuildSimpleRequestPacket((qint32)TCP_MSG_ZTLOG_DOWNLOAD_REQUEST);
}
QByteArray CTCPProtocol::BuildSimpleRequestPacket(qint32 RequestID)
{
QByteArray packet;
packet.clear();
QDataStream stream(&packet,QIODevice::WriteOnly);
stream.device()->seek(0);
stream << TCP_PROTOCOL_HEADER << RequestID << (qint64)0;
return packet;
}
QByteArray CTCPProtocol::GetTrainLogsDownloadReqPacket()
{
return BuildSimpleRequestPacket((qint32)TCP_MSG_TRAINLOGS_DOWNLOAD_REQUEST);
}
QByteArray CTCPProtocol::GetTrainLogsFileDataAckPacket(qint32 Acknowledge)
{
QByteArray packet;
packet.clear();
QDataStream stream(&packet,QIODevice::WriteOnly);
stream.device()->seek(0);
qint64 size = 4;
stream << TCP_PROTOCOL_HEADER << (qint32)TCP_MSG_TRAINLOG_FILE_DATA_ACK << size << Acknowledge;
return packet;
}
QByteArray CTCPProtocol::GetDeleteZTLogReqPacket()
{
return BuildSimpleRequestPacket((qint32)TCP_MSG_DELETE_ZTLOG_REQUEST);
}
QByteArray CTCPProtocol::GetSetZTFunctionsPacket(QByteArray &Data)
{
QByteArray packet;
packet.clear();
QDataStream stream(&packet,QIODevice::WriteOnly);
stream.device()->seek(0);
qint64 size = Data.size();
stream << TCP_PROTOCOL_HEADER << (qint32)TCP_MSG_SET_ZT_FUNCTIONS << size;
packet.append(Data);
return packet;
}
void CTCPProtocol::TCPTxRequest(const QByteArray &request)
{
qDebug("No reimplementation of TXRequest in TCPProtocol.c. Request not sent...");
}
void CTCPProtocol::ResetRxStateMachine()
{
mCurTransactionData.clear();
mCurTransactionDataSize = 0;
mCurTransactionMsg = TCP_MSG_UNKNOWN;
mProtocolRxState = TCP_PROTOCOL_GET_HEADER_STATE;
}
int CTCPProtocol::DecodeTCPMessage()
{
switch(mCurTransactionMsg)
{
case TCP_MSG_HEARTBEAT_RESPONSE:
{
TCPRxHeartbeat();
break;
}
case TCP_MSG_STATION_NAME_RESPONSE:
{
TCPRxStationName(QString(mCurTransactionData));
break;
}
case TCP_MSG_ZT_STATUS_RESPONSE:
{
TCPRxZTStatus(mCurTransactionData);
break;
}
case TCP_MSG_ZTLOG_DOWNLOAD_RESPONSE:
{
TCPRxZTLog(QString(mCurTransactionData));
break;
}
case TCP_MSG_TRAINSLOGS_DOWNLOAD_ACK:
{
qint32 NbFiles = 0;
QDataStream strm(mCurTransactionData);
strm.device()->seek(0);
strm >> NbFiles;
TCPRxTrainLogsDownladAck(NbFiles);
break;
}
case TCP_MSG_TRAINLOG_FILE_DATA:
{
TCPRxTrainLogFileData(mCurTransactionData);
break;
}
case TCP_MSG_TRAINLOGS_DOWNLOAD_FINISHED:
{
TCPRxTrainLogsDownloadFinished();
break;
}
case TCP_MSG_DELETE_ZTLOG_ACK:
{
qint32 ack;
QDataStream strm(mCurTransactionData);
strm.device()->seek(0);
strm >> ack;
TCPRxDeleteZTLogAck((bool)ack);
break;
}
case TCP_MSG_SET_ZT_FUNCTIONS_ACK:
{
qint32 ack;
QDataStream strm(mCurTransactionData);
strm.device()->seek(0);
strm >> ack;
TCPRxSetZTFunctionsAck(ack);
break;
}
case TCP_MSG_SET_ZT_FUNCTIONS:
case TCP_MSG_DELETE_ZTLOG_REQUEST:
case TCP_MSG_HEARTBEAT_REQUEST:
case TCP_MSG_STATION_NAME_REQUEST:
case TCP_MSG_ZT_STATUS_REQUEST:
case TCP_MSG_ZTLOG_DOWNLOAD_REQUEST:
case TCP_MSG_TRAINLOGS_DOWNLOAD_REQUEST:
case TCP_MSG_TRAINLOG_FILE_DATA_ACK:
case TCP_MSG_UNKNOWN:
{
qDebug() << "Received invalid msg:" << mCurTransactionMsg;
break;
}
}
return RET_OK;
}
QDataStream &operator>>(QDataStream &in, CTCPZTStatus &dest)
{
in >> dest.mZT1Status
>> dest.mZT2Status
>> dest.mNbPass
>> dest.mNbTrigs
>> dest.mZTStartDateTime
>> dest.mActualDateTime
>> dest.mPGTreshold
>> dest.mModeMaintenanceON
>> dest.mCalibModeON
>> dest.mFNTKActive
>> dest.mFNAnalysisActive
>> dest.mPGTKActive
>> dest.mPGAnalysisActive
>> dest.mPP1TKActive
>> dest.mPP1AnalysisActive
>> dest.mPP2TKActive
>> dest.mPP2AnalysisActive
>> dest.mZT1TKActive
>> dest.mZT1AnalysisActive
>> dest.mZT2TKActive
>> dest.mZT2AnalysisActive
>> dest.mUSBKeyConnected;
return in;
}
QDataStream &operator>>(QDataStream &in, CTCPZTFunctionsStatus &dest)
{
in >> dest.mFNTKActive
>> dest.mFNAnalysisActive
>> dest.mPGTKActive
>> dest.mPGAnalysisActive
>> dest.mPP1TKActive
>> dest.mPP1AnalysisActive
>> dest.mPP2TKActive
>> dest.mPP2AnalysisActive
>> dest.mZT1TKActive
>> dest.mZT1AnalysisActive
>> dest.mZT2TKActive
>> dest.mZT2AnalysisActive;
return in;
}
QDataStream &operator<<(QDataStream &out, const CTCPZTFunctionsStatus &source)
{
out << source.mFNTKActive
<< source.mFNAnalysisActive
<< source.mPGTKActive
<< source.mPGAnalysisActive
<< source.mPP1TKActive
<< source.mPP1AnalysisActive
<< source.mPP2TKActive
<< source.mPP2AnalysisActive
<< source.mZT1TKActive
<< source.mZT1AnalysisActive
<< source.mZT2TKActive
<< source.mZT2AnalysisActive;
return out;
}