Masterctrl/Sources/NetworkProtocol.cpp
Jean-François Martel a955ae9ea8 Dev...
2015-08-14 07:50:51 -04:00

373 lines
7.3 KiB
C++

#include "NetworkProtocol.h"
#include "QByteArray"
CNetworkProtocol::CNetworkProtocol(CAbstractNetworkCommIF *Parent)
{
mParentHandle = Parent;
ResetRxStateMachine();
}
CNetworkProtocol::~CNetworkProtocol()
{
}
//void CNetworkProtocol::BindUpperLayer(CMasterCtrl *UpperLayerPtr)
//{
// mMasterCtrlHandle = UpperLayerPtr;
//}
unsigned char CNetworkProtocol::CalcCRC(char *Buffer, int Size)
{
unsigned char CRC = 0x00;
for( int i = 0; i < Size; i++)
{
CRC ^= Buffer[i];
}
return CRC;
}
QByteArray CNetworkProtocol::GetTxPacket(unsigned char MessageID, unsigned char Flags, unsigned char *Data, int Size, unsigned char Address, unsigned char ID)
{
int toto;
char temp;
char OutBuffer[MAX_MESSAGE_SIZE+10];
int FrameSize = Size + 9; //Add header data...
OutBuffer[0] = (char)FRAME_HEADER; //header
OutBuffer[1] = 1; //MasterCtrl address
OutBuffer[2] = ID_MASTER; //MasterCtrl ID
OutBuffer[3] = (char)ID; //destination ID
OutBuffer[4] = (char)Address; //Destination Address
OutBuffer[5] = (char)Flags;
OutBuffer[6] = (char)MessageID; //Cmd
toto = FrameSize & 0xFF00;
temp = FrameSize >> 8;
OutBuffer[7] = ((FrameSize - 9) & 0xFF00) >> 8;
OutBuffer[8] = (FrameSize - 9) & 0x00FF;
for(int i = 0; i < Size; i++)
{
temp = Data[i];
OutBuffer[i+9] = temp;
}
OutBuffer[FrameSize] = CalcCRC(OutBuffer,FrameSize);
// CSerialComm::instance()->WriteData(&OutBuffer[0],FrameSize+1);
return QByteArray(OutBuffer,FrameSize);
}
//int CNetworkProtocol::TxData(unsigned char MessageID,unsigned char Flags,unsigned char *Data,int Size, unsigned char Address,unsigned char ID)
//{
// int toto;
// char temp;
// char OutBuffer[MAX_MESSAGE_SIZE+10];
// int FrameSize = Size + 9; //Add header data...
// OutBuffer[0] = (char)FRAME_HEADER; //header
// OutBuffer[1] = 1; //MasterCtrl address
// OutBuffer[2] = ID_MASTER; //MasterCtrl ID
// OutBuffer[3] = (char)ID; //destination ID
// OutBuffer[4] = (char)Address; //Destination Address
// OutBuffer[5] = (char)Flags;
// OutBuffer[6] = (char)MessageID; //Cmd
// toto = FrameSize & 0xFF00;
// temp = FrameSize >> 8;
// OutBuffer[7] = ((FrameSize - 9) & 0xFF00) >> 8;
// OutBuffer[8] = (FrameSize - 9) & 0x00FF;
// for(int i = 0; i < Size; i++)
// {
// temp = Data[i];
// OutBuffer[i+9] = temp;
// }
// OutBuffer[FrameSize] = CalcCRC(OutBuffer,FrameSize);
//// CSerialComm::instance()->WriteData(&OutBuffer[0],FrameSize+1);
// return 0;
//}
//void CNetworkProtocol::ReadPort(void)
//{
// int Size = 0;
// RxBuff = CSerialComm::instance()->ReceiveData(Size);
// if(Size)
// {
// if(Size > 50)
// {
// int toto = 5;
// }
//// TRACE("Received %d bytes\n",Size);
// AnalyseNewData(RxBuff,Size);
// }
//}
//void CNetworkProtocol::AnalyseNewData(char *Data, int size)
//{
// if(size != 0)
// {
// for(int i(0); i < size; i++)
// {
// StateMachine((unsigned char)Data[i]);
// }
// }
//}
void CNetworkProtocol::RxStateMachine(unsigned char Data)
{
switch(RxState)
{
case RxHeader: //Wait for data header...
{
if((unsigned char)Data == FRAME_HEADER)
{
mRxData[BufPtr++] = Data;
RxState = RxAdd;
CRC ^= Data;
}
else
{
ResetRxStateMachine();
}
break;
}
case RxAdd: //Sender Address.
{
SenderAddress = Data;
mRxData[BufPtr++] = Data;
RxState = RxID;
CRC ^= Data;
break;
}
case RxID: //Sender ID
{
mRxData[BufPtr++] = Data;
RxState = RxMyID;
SenderID = Data;
CRC ^= Data;
break;
}
case RxMyID:
{
if(Data != ID_PC && Data != 0xFF) //Message is not for a console and it's not a broadcast
{
ResetRxStateMachine();
break;
}
mRxData[BufPtr++] = Data;
RxState = RxMyAddress;
CRC ^= Data;
break;
}
case RxMyAddress:
{
if(Data != 1 && Data != 0xFF) //Message is not for us and it's not a broadcast
{
ResetRxStateMachine();
break;
}
mRxData[BufPtr++] = Data;
RxState = RxFlags;
CRC ^= Data;
break;
}
case RxFlags:
{
Flags = Data;
mRxData[BufPtr++] = Data;
RxState = RxCMD;
CRC ^= Data;
break;
}
case RxCMD:
{
RxCmd = Data;
mRxData[BufPtr++] = Data;
RxState = RxSize1;
CRC ^= Data;
break;
}
case RxSize1: //Data size MSB
{
RxSize = 0;
RxSize = (unsigned int)Data;
RxSize <<= 8;
mRxData[BufPtr++] = Data;
RxState = RxSize2;
CRC ^= Data;
break;
}
case RxSize2: //Data size LSB
{
RxSize |= (unsigned int)Data;
mRxData[BufPtr++] = Data;
if(RxSize == 0)
RxState = RxCRC;
else
RxState = RxData;
CRC ^= Data;
break;
}
case RxData:
{
mRxData[BufPtr++] = Data;
CRC ^= Data;
DataCnt++;
if(DataCnt == RxSize)
RxState = RxCRC;
break;
}
case RxCRC:
{
if(Data != CRC) //Data corruption
{
ResetRxStateMachine();
break;
}
//Data is OK... execute
// ExecuteCommand();
mParentHandle->NewFrameReceived(QByteArray(mRxData,RxSize+10));
ResetRxStateMachine();
break;
}
default:
{
ResetRxStateMachine();
break;
}
}
}
void CNetworkProtocol::ResetRxStateMachine(void)
{
RxState = RxHeader;
RxSize = 0;
SenderID = 0;
SenderAddress = 0;
RxCmd = 0;
memset(mRxData,0,sizeof(mRxData));
DataCnt = 0;
BufPtr = 0;
CRC = 0;
Flags = 0;
}
//void CNetworkProtocol::ExecuteCommand()
//{
// switch(RxCmd)
// {
// case TX_MASTER_STATUS:
// {
// mMasterCtrlHandle->MasterCtrlStatusReceived(&mRxData[DATA_START]);
// break;
// }
// case TX_MASTER_ACK:
// {
// break;
// }
// case TX_MASTER_NET_INFO:
// {
// break;
// }
// case TX_MASTER_SEND_DEVICE_CMD_ACK:
// {
// switch(mRxData[FRAME_DATA_INDEX]) //Device ID responding to request
// {
// case ID_MASTER: //Master Controller
// {
// break;
// }
// case ID_CONSOLE: //LCD Console
// {
// break;
// }
// case ID_AV_MUX: //Audio Video Multiplexer
// {
// break;
// }
// case ID_IR_REMOTE: //Infra red transmitter
// {
// switch(mRxData[FRAME_DATA_INDEX+2]) //Command to which the device responded
// {
// case TX_LEARN_IR_CMD_FINISHED:
// {
// mMasterCtrlHandle->DeviceAnswerReceived(mRxData[FRAME_DATA_INDEX+3],mRxData[FRAME_DATA_INDEX+4],mRxData[FRAME_DATA_INDEX+5],mRxData[FRAME_DATA_INDEX+6]);
// break;
// }
// case TX_SEND_IR_DATA:
// {
// break;
// }
// case TX_SEND_IR_CMD:
// {
// mMasterCtrlHandle->GetIRRemoteCodeReceived(mRxData[FRAME_DATA_INDEX+3],mRxData[FRAME_DATA_INDEX+4]);
// break;
// }
// }
// break;
// }
// }
// break;
// }
// }
//}
//void CNetworkProtocol::SendDeviceCommand(char DeviceID, char DeviceAddress, char DeviceCmd, char *CommandData, char DataSize)
//{
// unsigned char TempBuf[MAX_MESSAGE_SIZE+5];
// TempBuf[0] = DeviceID;
// TempBuf[1] = DeviceAddress;
// TempBuf[2] = DeviceCmd;
// TempBuf[3] = DataSize;
// memcpy(&TempBuf[4],CommandData,DataSize);
// TxData(RX_MASTER_SEND_DEVICE_CMD,0,TempBuf,DataSize+4,MASTER_CTRL_ADDRESS,ID_MASTER);
//}
//void CNetworkProtocol::RequestMasterCtrlStatus(void)
//{
// TxData(RX_MASTER_GET_STATUS,0,0,0,1,ID_MASTER);
//}
//void CNetworkProtocol::SendMasterCtrlCmd(char MessageID, char *Data, char DataSize)
//{
// TxData(MessageID,0,(unsigned char*)Data,(int)DataSize,1,ID_MASTER);
//}