Add files for protocol implementation
This commit is contained in:
parent
236f999eca
commit
039d58178c
@ -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/
|
||||
|
||||
5
Sources/232NetworkCommIF.cpp
Normal file
5
Sources/232NetworkCommIF.cpp
Normal file
@ -0,0 +1,5 @@
|
||||
#include "232NetworkCommIF.h"
|
||||
|
||||
C232NetworkCommIF::C232NetworkCommIF()
|
||||
{
|
||||
}
|
||||
10
Sources/232NetworkCommIF.h
Normal file
10
Sources/232NetworkCommIF.h
Normal file
@ -0,0 +1,10 @@
|
||||
#ifndef _232NETWORKCOMMIF_H
|
||||
#define _232NETWORKCOMMIF_H
|
||||
|
||||
class C232NetworkCommIF
|
||||
{
|
||||
public:
|
||||
C232NetworkCommIF();
|
||||
};
|
||||
|
||||
#endif // _232NETWORKCOMMIF_H
|
||||
5
Sources/485NetworkCommIF.cpp
Normal file
5
Sources/485NetworkCommIF.cpp
Normal file
@ -0,0 +1,5 @@
|
||||
#include "485NetworkCommIF.h"
|
||||
|
||||
C485NetworkCommIF::C485NetworkCommIF()
|
||||
{
|
||||
}
|
||||
10
Sources/485NetworkCommIF.h
Normal file
10
Sources/485NetworkCommIF.h
Normal file
@ -0,0 +1,10 @@
|
||||
#ifndef _485NETWORKCOMMIF_H
|
||||
#define _485NETWORKCOMMIF_H
|
||||
|
||||
class C485NetworkCommIF
|
||||
{
|
||||
public:
|
||||
C485NetworkCommIF();
|
||||
};
|
||||
|
||||
#endif // _485NETWORKCOMMIF_H
|
||||
5
Sources/EthernetNetworkCommIF.cpp
Normal file
5
Sources/EthernetNetworkCommIF.cpp
Normal file
@ -0,0 +1,5 @@
|
||||
#include "EthernetNetworkCommIF.h"
|
||||
|
||||
CEthernetNetworkCommIF::CEthernetNetworkCommIF()
|
||||
{
|
||||
}
|
||||
10
Sources/EthernetNetworkCommIF.h
Normal file
10
Sources/EthernetNetworkCommIF.h
Normal file
@ -0,0 +1,10 @@
|
||||
#ifndef ETHERNETNETWORKCOMMIF_H
|
||||
#define ETHERNETNETWORKCOMMIF_H
|
||||
|
||||
class CEthernetNetworkCommIF
|
||||
{
|
||||
public:
|
||||
CEthernetNetworkCommIF();
|
||||
};
|
||||
|
||||
#endif // ETHERNETNETWORKCOMMIF_H
|
||||
337
Sources/NetworkProtocol.cpp
Normal file
337
Sources/NetworkProtocol.cpp
Normal 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
54
Sources/NetworkProtocol.h
Normal 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
119
Sources/ProtocolDefs.h
Normal 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
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user