#include "NetworkProtocol.h" #include "QByteArray" 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; } 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)); 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); //}