diff --git a/MasterCtrl.pro b/MasterCtrl.pro index e293f9f..4715243 100644 --- a/MasterCtrl.pro +++ b/MasterCtrl.pro @@ -3,11 +3,19 @@ QT += Network HEADERS += \ Sources/MasterCtrl.h \ - Sources/GlobalDefine.h + Sources/GlobalDefine.h \ + Sources/485NetworkCommIF.h \ + Sources/EthernetNetworkCommIF.h \ + Sources/232NetworkCommIF.h \ + Sources/NetworkProtocol.h SOURCES += \ Sources/main.cpp \ - Sources/MasterCtrl.cpp + Sources/MasterCtrl.cpp \ + Sources/485NetworkCommIF.cpp \ + Sources/232NetworkCommIF.cpp \ + Sources/EthernetNetworkCommIF.cpp \ + Sources/NetworkProtocol.cpp INCLUDEPATH += $$PWD/ \ $$PWD/Sources/ diff --git a/Sources/232NetworkCommIF.cpp b/Sources/232NetworkCommIF.cpp new file mode 100644 index 0000000..3947705 --- /dev/null +++ b/Sources/232NetworkCommIF.cpp @@ -0,0 +1,5 @@ +#include "232NetworkCommIF.h" + +C232NetworkCommIF::C232NetworkCommIF() +{ +} diff --git a/Sources/232NetworkCommIF.h b/Sources/232NetworkCommIF.h new file mode 100644 index 0000000..43e2ab3 --- /dev/null +++ b/Sources/232NetworkCommIF.h @@ -0,0 +1,10 @@ +#ifndef _232NETWORKCOMMIF_H +#define _232NETWORKCOMMIF_H + +class C232NetworkCommIF +{ +public: + C232NetworkCommIF(); +}; + +#endif // _232NETWORKCOMMIF_H diff --git a/Sources/485NetworkCommIF.cpp b/Sources/485NetworkCommIF.cpp new file mode 100644 index 0000000..da1db72 --- /dev/null +++ b/Sources/485NetworkCommIF.cpp @@ -0,0 +1,5 @@ +#include "485NetworkCommIF.h" + +C485NetworkCommIF::C485NetworkCommIF() +{ +} diff --git a/Sources/485NetworkCommIF.h b/Sources/485NetworkCommIF.h new file mode 100644 index 0000000..7beb510 --- /dev/null +++ b/Sources/485NetworkCommIF.h @@ -0,0 +1,10 @@ +#ifndef _485NETWORKCOMMIF_H +#define _485NETWORKCOMMIF_H + +class C485NetworkCommIF +{ +public: + C485NetworkCommIF(); +}; + +#endif // _485NETWORKCOMMIF_H diff --git a/Sources/EthernetNetworkCommIF.cpp b/Sources/EthernetNetworkCommIF.cpp new file mode 100644 index 0000000..0493ad4 --- /dev/null +++ b/Sources/EthernetNetworkCommIF.cpp @@ -0,0 +1,5 @@ +#include "EthernetNetworkCommIF.h" + +CEthernetNetworkCommIF::CEthernetNetworkCommIF() +{ +} diff --git a/Sources/EthernetNetworkCommIF.h b/Sources/EthernetNetworkCommIF.h new file mode 100644 index 0000000..36f12ef --- /dev/null +++ b/Sources/EthernetNetworkCommIF.h @@ -0,0 +1,10 @@ +#ifndef ETHERNETNETWORKCOMMIF_H +#define ETHERNETNETWORKCOMMIF_H + +class CEthernetNetworkCommIF +{ +public: + CEthernetNetworkCommIF(); +}; + +#endif // ETHERNETNETWORKCOMMIF_H diff --git a/Sources/NetworkProtocol.cpp b/Sources/NetworkProtocol.cpp new file mode 100644 index 0000000..8e8a21f --- /dev/null +++ b/Sources/NetworkProtocol.cpp @@ -0,0 +1,337 @@ + + +#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); +//} diff --git a/Sources/NetworkProtocol.h b/Sources/NetworkProtocol.h new file mode 100644 index 0000000..abfd9d5 --- /dev/null +++ b/Sources/NetworkProtocol.h @@ -0,0 +1,54 @@ +#ifndef NETWORKPROTOCOL_H +#define NETWORKPROTOCOL_H + +#include "GlobalDefine.h" +#include "ProtocolDefs.h" + +class CNetworkProtocol +{ +public: + CNetworkProtocol(); + ~CNetworkProtocol(); + +private: + void ResetRxStateMachine(); + unsigned char CalcCRC(char *Buffer, int Size); + int TxData(unsigned char MessageID,unsigned char Flags,unsigned char *Data,int Size, unsigned char Address,unsigned char ID); + void RxStateMachine(unsigned char Data); + + //State Machine states + enum States + { + Initialization, + RxHeader, + RxID, + RxAdd, + RxMyID, + RxMyAddress, + RxFlags, + RxCMD, + RxSize1, + RxSize2, + RxData, + RxCRC + }; + + + char *RxBuff; + char mRxData[MAX_MESSAGE_SIZE+10]; + + int RxState; + int RxSize; + char SenderID; + char SenderAddress; + int RxCmd; + int DataCnt; + int BufPtr; + unsigned char CRC; + unsigned char Flags; + + unsigned char State; + +}; + +#endif // NETWORKPROTOCOL_H diff --git a/Sources/ProtocolDefs.h b/Sources/ProtocolDefs.h new file mode 100644 index 0000000..57ed335 --- /dev/null +++ b/Sources/ProtocolDefs.h @@ -0,0 +1,119 @@ +/********************************************************************** +Project: Automatic cat feeder +Date: march 19 2006 +Author: Jean-François Martel +Target: PIC 18F252 +Compiler: Microchip mcc18 +Filename: Protocol.h + +File description: Communication protocol implementation. + + +jean-francois.martel@polymtl.ca +**********************************************************************/ + +//Protocol buffer specific definitions + +#define MAX_MESSAGE_SIZE 90 + +#define FRAME_HEADER 0x8A +#define DATA_START 0x09 +#define ACK 0xA3; +#define NAK 0x90; +#define BROADCAST_VALUE 0xFF + +enum eFrameIndex +{ + FRAME_HEADER_INDEX, + FRAME_SENDER_ID_INDEX, + FRAME_SENDER_ADDRESS_INDEX, + FRAME_DEST_ID_INDEX, + FRAME_DEST_ADDRESS_INDEX, + FRAME_FLAGS_INDEX, + FRAME_COMMAND_INDEX, + FRAME_SIZE1_INDEX, + FRAME_SIZE2_INDEX, + FRAME_DATA_INDEX +}; + +enum DEVICES_IDS +{ + ID_MASTER, //Master Controller + ID_CONSOLE, //LCD Console + ID_PC, //PC + ID_AV_MUX, //Audio Video Multiplexer + ID_IR_REMOTE, //Infra red transmitter + ID_NB_DEVICE_ID +}; + +// Commands definitions + +enum MASTER_CMD +{ + RX_MASTER_GET_STATUS, + TX_MASTER_STATUS, + TX_MASTER_ACK, + RX_MASTER_SET_NET_INFO, + RX_MASTER_GET_NET_INFO, + TX_MASTER_NET_INFO, + RX_MASTER_SEND_DEVICE_CMD, + TX_MASTER_SEND_DEVICE_CMD_ACK, + RX_MASTER_SET_WEATHER_INFO, + TX_MASTER_SET_WEATHER_INFO_ACK, + RX_MASTER_SET_MAIL_MSG, + TX_MASTER_SET_MAIL_MSG_ACK, + RX_MASTER_NEW_OUTLOOK_EMAILS, + TX_MASTER_NEW_OUTLOOK_EMAILS_ACK, + RX_MASTER_TODAYS_EVENTS, + TX_MASTER_TODAYS_EVENTS_ACK +}; + + +//CONSOLE +enum CONSOLE_CMD +{ + RX_CONSOLE_GET_STATUS, + TX_CONSOLE_STATUS, + TX_CONSOLE_ACK, + RX_START_CALIBRATION, + RX_GET_CONSOLE_EVENT_MSG, + TX_CONSOLE_EVENT_MSG, + RX_CONSOLE_SHOW_CALLER_ID, + RX_SET_TIME, + RX_SET_WEATHER, + RX_SEND_NEW_MAIL_MSG, + RX_SEND_NEW_MAIL_MSG_ACK, + RX_NEW_OUTLOOK_EMAILS, + TX_NEW_OUTLOOK_EMAILS_ACK, + RX_TODAYS_EVENTS, + TX_TODAYS_EVENTS_ACK, + LAST_CONSOLE_CMD +}; + + + +enum IR_REMOTE_CMDS +{ + TX_IR_REMOTE_ACK = 1, + RX_GET_STATUS, + TX_REMOTE_STATUS, + RX_TRANSMIT_CMD, + RX_LEARN_IR_CMD, + TX_LEARN_IR_CMD_FINISHED, + RX_GET_IR_DATA, + TX_SEND_IR_DATA, + RX_SET_IR_CMD, + RX_SET_IR_DATA, + RX_GET_IR_CMD, + TX_SEND_IR_CMD, + MAX_IR_REMOTE_CMD +}; + + + + + + + + +