Masterctrl/Sources/Sprinkler/SprinklerDevice.cpp
2021-05-26 04:15:57 -04:00

148 lines
4.3 KiB
C++

#include "SprinklerDevice.h"
#include "ProtocolDefs.h"
#include <QDebug>
#include "SprinklerMgr.h"
CSprinklerDevice::CSprinklerDevice(int Address, CAbstractNetworkCommIF *NetworkInterface, CSprinklerMgr *SprinklerMgr):
CNetworkDevice(ID_SPRINKLER_DEVICE,Address,NetworkInterface)
{
mSprinklerState = SPRINKLER_UNKNOWN_STATE;
mSprinklerMgr = SprinklerMgr;
mSprinklerStatusTimer = new QTimer();
mSprinklerStatusTimer->setInterval(5000);
mSprinklerStatusTimer->setSingleShot(true);
connect(mSprinklerStatusTimer,SIGNAL(timeout()),this,SLOT(StatusTimerExpired()));
mSprinklerStatusTimer->start();
}
CSprinklerDevice::~CSprinklerDevice()
{
}
SprinklerState CSprinklerDevice::GetSprinklerState()
{
return mSprinklerState;
}
int CSprinklerDevice::NewDeviceFrameReceived(int DeviceID, int DeviceAddress, int MessageID, int DataSize, QByteArray Data)
{
Q_UNUSED(DeviceID)
Q_UNUSED(DeviceAddress)
Q_UNUSED(DataSize)
Q_UNUSED(Data)
switch(MessageID)
{
case SPRINKLER_DEVICE_STATUS_RESPONSE:
{
if(Data.at(0) != (unsigned char)mSprinklerState)
{
if(Data.at(0) == SPRINKLER_ON_STATE || Data.at(0) == SPRINKLER_OFF_STATE)
{
mSprinklerState = (SprinklerState)Data.at(0);
//TODO: emit sprinkler change event.
}
else
{
mSprinklerState = SPRINKLER_UNKNOWN_STATE;
qDebug("Rx Invalid sprinkler state [%d] from device [%d]",Data.at(0),DeviceAddress);
}
}
mFlowMeter = Data.at(1);
mFlowMeter <<= 8;
mFlowMeter |= (unsigned short)Data.at(2);
qDebug("Sprinkler status RX. Valve:%d, flow:%d",Data.at(0),mFlowMeter);
mSprinklerStatusTimer->start();
break;
}
case SPRINKLER_DEVICE_ACK:
{
break;
}
case SPRINKLER_DEVICE_SET_SPRINKLER_STATE_ACK:
{
mNetworkInterfacePtr->SendNetworkMessage(ID_SPRINKLER_DEVICE,1,SPRINKLER_DEVICE_GET_SPRINKLER_STATE_REQUEST,0,0);
break;
}
case SPRINKLER_DEVICE_GET_SPRINKLER_STATE_RESPONSE:
{
if(Data.at(0) != (unsigned char)mSprinklerState)
{
if(Data.at(0) == SPRINKLER_ON_STATE || Data.at(0) == SPRINKLER_OFF_STATE)
{
mSprinklerState = (SprinklerState)Data.at(0);
//TODO: emit sprinkler change event.
}
else
{
mSprinklerState = SPRINKLER_UNKNOWN_STATE;
qDebug("Rx Invalid sprinkler state [%d] from device [%d]",Data.at(0),DeviceAddress);
}
}
qDebug("Valve state RX. Valve:%d",Data.at(0));
break;
}
case SPRINKLER_DEVICE_GET_WATER_FLOW_RESPONSE:
{
mFlowMeter = Data.at(0);
mFlowMeter <<= 8;
mFlowMeter |= (unsigned short)Data.at(1);
qDebug("Flow value RX. flow:%d",mFlowMeter);
break;
}
case SPRINKLER_DEVICE_GET_MOISTURE_RESPONSE:
{
break;
}
case SPRINKLER_DEVICE_SET_PROGRAM_ACK:
{
break;
}
case SPRINKLER_DEVICE_GET_PROGRAM_RESPONSE:
{
break;
}
case SPRINKLER_DEVICE_SET_PARAMETERS_ACK:
{
break;
}
case SPRINKLER_DEVICE_GET_PARAMETERS_RESPONSE:
{
break;
}
case SPRINKLER_DEVICE_SET_SPRINKLER_STATE_REQUEST:
case SPRINKLER_DEVICE_GET_SPRINKLER_STATE_REQUEST:
case SPRINKLER_DEVICE_GET_WATER_FLOW_REQUEST:
case SPRINKLER_DEVICE_GET_MOISTURE_REQUEST:
case SPRINKLER_DEVICE_SET_PROGRAM_REQUEST:
case SPRINKLER_DEVICE_GET_PROGRAM_REQUEST:
case SPRINKLER_DEVICE_SET_PARAMETERS_REQUEST:
case SPRINKLER_DEVICE_GET_PARAMETERS_REQUEST:
case SPRINKLER_DEVICE_STATUS_REQUEST:
default:
{
qDebug("Received invalid msg from Sprinkler Device");
break;
}
}
return 0;
}
void CSprinklerDevice::StatusTimerExpired()
{
mNetworkInterfacePtr->SendNetworkMessage(ID_SPRINKLER_DEVICE,1,SPRINKLER_DEVICE_STATUS_REQUEST,0,0);
}