Add files for protocol implementation

This commit is contained in:
Jean-François Martel 2015-08-07 07:56:07 -04:00
parent 236f999eca
commit 039d58178c
10 changed files with 565 additions and 2 deletions

View File

@ -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/

View File

@ -0,0 +1,5 @@
#include "232NetworkCommIF.h"
C232NetworkCommIF::C232NetworkCommIF()
{
}

View File

@ -0,0 +1,10 @@
#ifndef _232NETWORKCOMMIF_H
#define _232NETWORKCOMMIF_H
class C232NetworkCommIF
{
public:
C232NetworkCommIF();
};
#endif // _232NETWORKCOMMIF_H

View File

@ -0,0 +1,5 @@
#include "485NetworkCommIF.h"
C485NetworkCommIF::C485NetworkCommIF()
{
}

View File

@ -0,0 +1,10 @@
#ifndef _485NETWORKCOMMIF_H
#define _485NETWORKCOMMIF_H
class C485NetworkCommIF
{
public:
C485NetworkCommIF();
};
#endif // _485NETWORKCOMMIF_H

View File

@ -0,0 +1,5 @@
#include "EthernetNetworkCommIF.h"
CEthernetNetworkCommIF::CEthernetNetworkCommIF()
{
}

View File

@ -0,0 +1,10 @@
#ifndef ETHERNETNETWORKCOMMIF_H
#define ETHERNETNETWORKCOMMIF_H
class CEthernetNetworkCommIF
{
public:
CEthernetNetworkCommIF();
};
#endif // ETHERNETNETWORKCOMMIF_H

337
Sources/NetworkProtocol.cpp Normal file
View File

@ -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);
//}

54
Sources/NetworkProtocol.h Normal file
View File

@ -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

119
Sources/ProtocolDefs.h Normal file
View File

@ -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
};