ChaloupeLora/ChaloupeLora.X/Source/MasterCtrlInterface.c
2022-04-27 16:08:20 -04:00

282 lines
8.2 KiB
C

#include "define.h"
#include "MasterCtrlInterface.h"
#ifdef USE_WINC1500
#else
#include "TCPIP_Stack/TCPIP.h"
#endif
#include "NetworkProtocol.h"
#include "ProtocolDefs.h"
#include "timer.h"
#include <stdio.h>
#include "ValveCtrl.h"
#include "FlowMeter.h"
#ifdef USE_WINC1500
#else
TCP_SOCKET MySocket;
static BYTE MasterIP[] = "192.168.0.100";
DWORD MasterPort = 2182;
#endif
int mConnectionState = MASTER_STATE_DISCONNECTED;
int InitMasterCtrlIF()
{
ProtocolInit();
TimerStart(MASTER_CONNECTION_TIMER,MASTER_RECONNECTION_TIMEOUT);
return 1;
}
int ConnectToMasterCtrl()
{
#ifdef USE_WINC1500
#else
MySocket = TCPOpen((DWORD) (PTR_BASE) & MasterIP[0], TCP_OPEN_RAM_HOST, MasterPort, TCP_PURPOSE_GENERIC_TCP_CLIENT);
// Abort operation if no TCP socket of type TCP_PURPOSE_GENERIC_TCP_CLIENT is available
// If this ever happens, you need to go add one to TCPIPConfig.h
if (MySocket == INVALID_SOCKET)
{
printf("Could not open socket to MasterCtrl\n");
return 0;
}
printf("MasterCtrl Socket opened\n");
#endif
return 1;
}
void TickMasterCtrlInterface()
{
#ifdef USE_WINC1500
#else
WORD Pending = TCPIsGetReady(MySocket);
if (Pending != 0)
{
// printf("Rx %d bytes\n",Pending);
int i = 0;
for(i = 0; i < Pending; i++)
{
BYTE Byte;
if(TCPGet(MySocket,&Byte) == TRUE)
{
ProtocolAnalyzeNewData(Byte);
}
}
}
#ifdef CONNECT_DEVICE_TO_NETWORK
if(mConnectionState == MASTER_STATE_DISCONNECTED)
{
if(IsTimerExpired(MASTER_CONNECTION_TIMER))
{
TimerStart(MASTER_CONNECTION_TIMER,MASTER_RESPONSE_TIMEOUT);
mConnectionState = MASTER_STATE_CONNECTING;
ConnectToMasterCtrl();
}
}
else if(mConnectionState == MASTER_STATE_CONNECTING)
{
// if(IsTimerExpired(MASTER_CONNECTION_TIMER) == true) //
// {
// TCPClose(MySocket);
// TimerStart(MASTER_CONNECTION_TIMER,MASTER_RESPONSE_TIMEOUT);
// ConnectToMasterCtrl();
// }
}
else if(mConnectionState == MASTER_STATE_CONNECTED)
{
// if(IsTimerExpired(MASTER_CONNECTION_TIMER))
{
if(TCPIsConnected(MySocket) == FALSE)
{
//we got disconnected...
mConnectionState = MASTER_STATE_DISCONNECTED;
TCPClose(MySocket);
printf("Connection with MasterCtrl lost..\n");
}
TimerStart(MASTER_CONNECTION_TIMER,MASTER_RECONNECTION_TIMEOUT);
}
}
#endif
#endif
}
void NewMasterMessageReceived(char* Message)
{
// char Sender = Message[FRAME_SENDER_DEVICE_ID_INDEX];
char Target = Message[FRAME_DEST_DEVICE_ID_INDEX];
unsigned char Command = Message[FRAME_COMMAND_INDEX];
char *Data = &Message[FRAME_DATA_INDEX];
// printf("MasterMsgReceived %d \n",Command);
if(Target == ID_ETHERNET_VIRTUAL)
{
switch(Command)
{
case ETH_NETWK_DEVICE_INFO_REQUEST:
{
char Data[2];
Data[0] = ID_SPRINKLER_DEVICE;
Data[1] = MY_DEVICE_ADDRESS; //Address
SendFrame(ID_MASTER,MASTER_ADDRESS,ID_ETHERNET_VIRTUAL, ETH_NETWK_DEVICE_INFO_RESPONSE, Data,2,0);
printf("Rx Device info request\n");
// int FrameSize = -1;
// unsigned char *FramePtr = ProtocolGetFrame(ID_MASTER,MASTER_ADDRESS,ID_ETHERNET_VIRTUAL, ETH_NETWK_DEVICE_INFO_RESPONSE, Data,2,0, &FrameSize);
//
// if(FrameSize > 0)
// {
// TCPPutArray(MySocket,FramePtr,FrameSize);
// }
break;
}
case ETH_NETWK_CONNECTION_REFUSED:
{
printf("Connection to server refused\n");
break;
}
case ETH_NETWK_SET_DEVICE_INFO_ACK:
{
//Connected!
mConnectionState = MASTER_STATE_CONNECTED;
TimerStart(MASTER_CONNECTION_TIMER,MASTER_RECONNECTION_TIMEOUT);
printf("Connected to server\n");
break;
}
case ETH_NETWK_DEVICE_INFO_RESPONSE:
default:
{
//error...
break;
}
}
}
else if(Target == ID_SPRINKLER_DEVICE)
{
switch(Command)
{
case SPRINKLER_DEVICE_ACK:
{
break;
}
case SPRINKLER_DEVICE_STATUS_REQUEST:
{
unsigned char data[6];
data[0] = (unsigned char)GetValveState();
GetCurrentFlowBytes(&data[1]);
data[3] = 0;
data[4] = 0;
data[5] = 0;
SendFrame(ID_MASTER,MASTER_ADDRESS,ID_SPRINKLER_DEVICE, SPRINKLER_DEVICE_STATUS_RESPONSE, data,6,0);
// printf("Status sent\n");
break;
}
case SPRINKLER_DEVICE_SET_SPRINKLER_STATE_REQUEST:
{
unsigned char *MsgData;
char data;
MsgData = ProtocolMsgDataPtr();
if(*MsgData == 1)
{
SetValve(VALVE_ON);
data = 1;
}
else if(*MsgData == 1)
{
SetValve(VALVE_OFF);
data = 1;
}
else
{
data = 0;
}
SendFrame(ID_MASTER,MASTER_ADDRESS,ID_SPRINKLER_DEVICE, SPRINKLER_DEVICE_SET_SPRINKLER_STATE_ACK,&data,1,0);
break;
}
case SPRINKLER_DEVICE_GET_SPRINKLER_STATE_REQUEST:
{
unsigned char data;
data = (unsigned char)GetValveState();
SendFrame(ID_MASTER,MASTER_ADDRESS,ID_SPRINKLER_DEVICE, SPRINKLER_DEVICE_GET_SPRINKLER_STATE_RESPONSE,&data,1,0);
break;
}
case SPRINKLER_DEVICE_GET_WATER_FLOW_REQUEST:
{
unsigned char data[2];
GetCurrentFlowBytes(data);
SendFrame(ID_MASTER,MASTER_ADDRESS,ID_SPRINKLER_DEVICE, SPRINKLER_DEVICE_GET_WATER_FLOW_RESPONSE,data,2,0);
break;
}
case SPRINKLER_DEVICE_GET_MOISTURE_REQUEST:
{
break;
}
case SPRINKLER_DEVICE_SET_PROGRAM_REQUEST:
{
break;
}
case SPRINKLER_DEVICE_GET_PROGRAM_REQUEST:
{
break;
}
case SPRINKLER_DEVICE_SET_PARAMETERS_REQUEST:
{
break;
}
case SPRINKLER_DEVICE_GET_PARAMETERS_REQUEST:
{
break;
}
case SPRINKLER_DEVICE_STATUS_RESPONSE:
case SPRINKLER_DEVICE_SET_SPRINKLER_STATE_ACK:
case SPRINKLER_DEVICE_GET_SPRINKLER_STATE_RESPONSE:
case SPRINKLER_DEVICE_GET_WATER_FLOW_RESPONSE:
case SPRINKLER_DEVICE_GET_MOISTURE_RESPONSE:
case SPRINKLER_DEVICE_SET_PROGRAM_ACK:
case SPRINKLER_DEVICE_GET_PROGRAM_RESPONSE:
case SPRINKLER_DEVICE_SET_PARAMETERS_ACK:
case SPRINKLER_DEVICE_GET_PARAMETERS_RESPONSE:
default:
{
//error
break;
}
}
}
else
{
//Ignore..???
}
}
bool SendFrame(unsigned char DestDevice,unsigned char DestAddress, unsigned char SenderDevice, unsigned char Cmd, unsigned char *Data,unsigned int Size,unsigned char Flags)
{
int FrameSize = -1;
unsigned char *FramePtr = ProtocolGetFrame(DestDevice,DestAddress,SenderDevice, Cmd, Data,Size,Flags,&FrameSize);
if(FrameSize > 0)
{
#ifdef USE_WINC1500
#else
TCPPutArray(MySocket,FramePtr,FrameSize);
#endif
}
else
{
return false;
}
return true;
}