338 lines
6.0 KiB
C++
338 lines
6.0 KiB
C++
|
|
|
|
#include "NetworkProtocol.h"
|
|
|
|
|
|
|
|
CNetworkProtocol::CNetworkProtocol()
|
|
{
|
|
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;
|
|
}
|
|
|
|
|
|
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; //PC address
|
|
OutBuffer[2] = ID_PC; //PC 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();
|
|
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);
|
|
//}
|