This commit is contained in:
2020-09-13 13:47:47 -04:00
parent d3d6e095d7
commit 02e968c724
24 changed files with 4096 additions and 118 deletions
+53
View File
@@ -0,0 +1,53 @@
#include "ChaletData.h"
#include <QDataStream>
CChaletMainStatus::CChaletMainStatus()
{
mInverterRelayStatus = UNKNOWN_STATE;
mWiFiModuleStatus = UNKNOWN_STATE;
mBatteryCurrent = 0;
mBatteryVoltage = 0;
mIsOnline = false;
mHarakiriDone = false;
}
//int CChaletMainStatus::FromByteArray(QByteArray Data)
//{
//// QDataStream Strm(Data);
//// Strm.device()->seek(0);
//// mInverterRelayStatus >> Data;
//// mWiFiModuleStatus = Data[1];
//// ChaletStatus[0] = GetChaletPowerRelayState(); //Inverter relay status
//// ChaletStatus[1] = GetWiFiSate(); //Wifi Module state
//// ChaletStatus[2] = 3; //Battery Voltage 1
//// ChaletStatus[3] = 4; //Battery voltage 2
//// ChaletStatus[4] = 5; //Battery current 1
//// ChaletStatus[5] = 6; //Batgtery current 2
//// ChaletStatus[6] = 7; //Battery SOC
//// ChaletStatus[7] = 8; //Snatch
//// ChaletStatus[8] = 9;
//// ChaletStatus[9] = 10;
// return RET_OK;
//}
QByteArray CChaletMainStatus::ToByteArray()
{
QByteArray Data;
Data.clear();
QDataStream Strm(&Data,QIODevice::WriteOnly);
Strm << mInverterRelayStatus;
Strm << mWiFiModuleStatus;
Strm << mBatteryVoltage;
Strm << mBatteryCurrent;
Strm << mBatterySOC;
return Data;
}
+34
View File
@@ -0,0 +1,34 @@
#ifndef CHALETDATA_H
#define CHALETDATA_H
#include <QString>
#include "GlobalDefine.h"
#include <QDateTime>
#include <QByteArray>
class CChaletMainStatus
{
public:
QByteArray ToByteArray();
// int FromByteArray(QByteArray Data);
CChaletMainStatus();
quint8 mInverterRelayStatus;
quint8 mWiFiModuleStatus;
float mBatteryVoltage;
float mBatteryCurrent;
float mBatterySOC;
bool mHarakiriDone;
bool mIsOnline;
QDateTime mLastLoraStatus;
};
#endif // CHALETDATA_H
+95
View File
@@ -0,0 +1,95 @@
#include "ChaletInterface.h"
CChaletInterface::CChaletInterface(int Address, CAbstractNetworkCommIF *NetworkInterface, CChaletLoraDevice *DevicePtr):
CNetworkDevice(ID_CHALET_INTERFACE,Address,NetworkInterface)
{
mChaletLoraDevice = DevicePtr;
}
int CChaletInterface::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 CHALET_INTERFACE_ACK:
{
break;
}
case CHALET_INTERFACE_GENERAL_STATUS_REQUEST:
{
QByteArray data = mChaletLoraDevice->GetChaletMainStatus().ToByteArray();
mNetworkInterfacePtr->SendNetworkMessage(ID_CHALET_INTERFACE,mDeviceAddress,CHALET_INTERFACE_GENERAL_STATUS_RESPONSE,data.size(),data);
break;
}
case CHALET_INTERFACE_AC_POWER_STATE_STATUS_REQUEST:
{
break;
}
case CHALET_INTERFACE_AC_POWER_SET_STATE_REQUEST:
{
qDebug("AC power state set request received from interface");
if(Data[0] == (char)1)
{
mChaletLoraDevice->SendInverterPowerRelayState(true);
}
else if(Data[0] == (char)0)
{
mChaletLoraDevice->SendInverterPowerRelayState(false);
}
break;
}
case CHALET_INTERFACE_BATTERY_VOLTAGE_REQUEST:
{
break;
}
case CHALET_INTERFACE_WIFI_SET_STATE_REQUEST:
{
qDebug("WiFi state set request received from interface");
if(Data[0] == (char)1)
{
mChaletLoraDevice->SendWiFiModuleSetState(true);
}
else if(Data[0] == (char)0)
{
mChaletLoraDevice->SendWiFiModuleSetState(false);
}
break;
}
case CHALET_INTERFACE_DO_HARAKIRI_REQUEST:
{
mChaletLoraDevice->SendDOHarakiri();
break;
}
case CHALET_INTERFACE_REBOOT_CPU_REQUEST:
{
mChaletLoraDevice->SendRebootCmd();
break;
}
case CHALET_INTERFACE_GENERAL_STATUS_RESPONSE:
case CHALET_INTERFACE_AC_POWER_STATE_STATUS_RESPONSE:
case CHALET_INTERFACE_AC_POWER_SET_STATE_RESPONSE:
case CHALET_INTERFACE_BATTERY_VOLTAGE_RESPONSE:
case CHALET_INTERFACE_WIFI_SET_STATE_RESPONSE:
{
break;
}
}
return RET_OK;
}
+21
View File
@@ -0,0 +1,21 @@
#ifndef CCHALETINTERFACE_H
#define CCHALETINTERFACE_H
#include "NetworkDevice.h"
#include "ChaletLoraDevice.h"
class CChaletInterface: public QObject, public CNetworkDevice
{
Q_OBJECT
public:
CChaletInterface(int Address, CAbstractNetworkCommIF *NetworkInterface, CChaletLoraDevice *DevicePtr);
virtual int NewDeviceFrameReceived(int DeviceID, int DeviceAddress, int MessageID, int DataSize, QByteArray Data);
private:
CChaletLoraDevice *mChaletLoraDevice;
};
#endif // CCHALETINTERFACE_H
+260 -56
View File
@@ -1,84 +1,288 @@
#include "ChaletLoraDevice.h"
#include <QSerialPortInfo>
#include <QObject>
#include "GlobalDefine.h"
CChaletLoraDevice::CChaletLoraDevice()
CChaletLoraDevice::CChaletLoraDevice(int Address, CAbstractNetworkCommIF *NetworkInterface):
CNetworkDevice(ID_CHALET_DEVICE,Address,NetworkInterface)
{
mMyLoraAddress = 5;
mMyLoraChannel = 4;
NetworkInterface->mDevicePtr = this;
mDeviceAddress = Address;
mDeviceID = ID_CHALET_DEVICE;
QByteArray Test;
Test.resize(4);
Test[0] = 0xDE;
Test[1] = 0xAD;
Test[2] = 0xBE;
Test[3] = 0xEF;
GetLoraFrame(4,4,Test);
mLoraStatusRefreshTimer = new QTimer;
mLoraStatusRefreshTimer->setInterval(1000);
mLoraStatusRefreshTimer->setSingleShot(false);
connect(mLoraStatusRefreshTimer,SIGNAL(timeout()),this,SLOT(LoraStatusRefreshTimerExpired()));
mLoraStatusRefreshTimer->start();
mChaletStatusTimer = new QTimer();
mChaletStatusTimer->setInterval(1000);
mChaletStatusTimer->setSingleShot(true);
connect(mChaletStatusTimer,SIGNAL(timeout()),this,SLOT(CommTimerExpired()));
}
CChaletLoraDevice::~CChaletLoraDevice()
{
mLoraStatusRefreshTimer->stop();
delete mLoraStatusRefreshTimer;
delete mChaletStatusTimer;
}
int CChaletLoraDevice::Init()
int CChaletLoraDevice::Start()
{
QList<QSerialPortInfo> PortsList = QSerialPortInfo::availablePorts();
ScheduleChaletStatusRequest();
mChaletStatusTimer->start(1000);
return RET_OK;
}
for(int i = 0; i < PortsList.size(); i++)
int CChaletLoraDevice::NewDeviceFrameReceived(int DeviceID, int DeviceAddress, int MessageID, int DataSize, QByteArray Data)
{
switch(MessageID)
{
qDebug("Port found: %s - %s",qPrintable(PortsList.at(i).portName()),qPrintable(PortsList.at(i).description()));
case CHALET_ACK:
{
CmdResponseReceived(CHALET_ACK);
break;
}
case CHALET_GENERAL_STATUS_RESPONSE:
{
float temp;
qDebug("Chalet Status RX");
char VoltageArray[4];
mChaletMainStatus.mInverterRelayStatus = Data[0];
mChaletMainStatus.mWiFiModuleStatus = Data[1];
VoltageArray[0] = Data[2];
VoltageArray[1] = Data[3];
VoltageArray[2] = Data[4];
VoltageArray[3] = Data[5];
memcpy(&temp,VoltageArray,4);
mChaletMainStatus.mBatteryVoltage = temp;
CmdResponseReceived(CHALET_GENERAL_STATUS_REQUEST);
qDebug("voltage: %f",mChaletMainStatus.mBatteryVoltage);
break;
}
case CHALET_AC_POWER_STATE_STATUS_RESPONSE:
{
mChaletMainStatus.mInverterRelayStatus = Data[0];
CmdResponseReceived(CHALET_AC_POWER_SET_STATE_RESPONSE);
break;
}
case CHALET_AC_POWER_SET_STATE_RESPONSE:
{
qDebug("Lora set Inverter Power response : 0x%d",(int)Data[0]);
mChaletMainStatus.mInverterRelayStatus = Data[0];
CmdResponseReceived(CHALET_AC_POWER_SET_STATE_REQUEST);
break;
}
case CHALET_BATTERY_VOLTAGE_RESPONSE:
{
CmdResponseReceived(CHALET_BATTERY_VOLTAGE_REQUEST);
break;
}
case CHALET_BATTERY_CURRENT_RESPONSE:
{
CmdResponseReceived(CHALET_BATTERY_CURRENT_REQUEST);
break;
}
case CHALET_WIFI_STATUS_RESPONSE:
{
mChaletMainStatus.mWiFiModuleStatus = Data[0];
CmdResponseReceived(CHALET_WIFI_STATUS_REQUEST);
break;
}
case CHALET_WIFI_SET_STATE_RESPONSE:
{
qDebug("Lora set WiFi response : 0x%d",(int)Data[0]);
mChaletMainStatus.mWiFiModuleStatus = Data[0];
CmdResponseReceived(CHALET_WIFI_SET_STATE_REQUEST);
break;
}
case CHALET_DO_HARAKIRI_CONFIRMATION:
{
if(Data[0] == (char)1)
{
qDebug("ChaletDuino has commited suicide (HARAKIRI)");
mChaletMainStatus.mHarakiriDone = true;
}
else
{
qDebug("HARAKIRI magic word invalid.");
}
CmdResponseReceived(CHALET_DO_HARAKIRI_REQUEST);
break;
}
case CHALET_REBOOT_CPU_RESPONSE:
{
if(Data[0] == (char)1)
{
qDebug("ChaletDuino is rebooting");
}
else
{
qDebug("Reboot magic word invalid");
}
CmdResponseReceived(CHALET_DO_HARAKIRI_REQUEST);
break;
}
default:
{
return RET_ERROR;
break;
}
}
return RET_OK;
}
mLoraModuleSerialPort.setPortName("COM3");
mLoraModuleSerialPort.setBaudRate(QSerialPort::Baud9600);
mLoraModuleSerialPort.setDataBits(QSerialPort::Data8);
mLoraModuleSerialPort.setParity(QSerialPort::NoParity);
mLoraModuleSerialPort.setFlowControl(QSerialPort::NoFlowControl);
if(mLoraModuleSerialPort.open(QIODevice::ReadWrite) == false)
void CChaletLoraDevice::CommTimerExpired()
{
if(mPendingNetworkMsgList.isEmpty())
{
qDebug("Could not open Chalet Lora serial port");
return RET_ERROR;
qDebug("Empty command list in comm timer ");
ScheduleChaletStatusRequest();
mChaletStatusTimer->start(1000);
return;
}
if(mPendingNetworkMsgList.first().PendingResponse == true)
{
//The current command is still waiting for a response. Check how many times we tried to send it
qDebug("Cmd 0x%x timetout... retrying",mPendingNetworkMsgList.first().mMessageID);
if(mPendingNetworkMsgList.first().ResendCounter >= 5)
{
//TODO: manage this. Module offline?
}
else
{
mPendingNetworkMsgList[0].ResendCounter++;
}
}
QByteArray Test;
Test.resize(5);
Test[0] = 0xDE;
Test[1] = 0xAD;
Test[2] = 0xBE;
Test[3] = 0xEF;
Test[4] = '\r';
qDebug("Sending chalet request 0x%x",mPendingNetworkMsgList.at(0).mMessageID);
GetLoraFrame(4,4,Test);
mPendingNetworkMsgList[0].PendingResponse = true;
SendChaletCommand(mPendingNetworkMsgList.at(0).mMessageID,mPendingNetworkMsgList.at(0).mData.size(),mPendingNetworkMsgList.at(0).mData);
mLoraModuleSerialPort.write(GetLoraFrame(4,4,Test));
//Harakiri and Reboot commands should not stay in the queue...
if(mPendingNetworkMsgList.at(0).mMessageID == CHALET_DO_HARAKIRI_REQUEST ||
mPendingNetworkMsgList.at(0).mMessageID == CHALET_REBOOT_CPU_REQUEST)
{
mPendingNetworkMsgList.clear();
ScheduleChaletStatusRequest();
}
mChaletStatusTimer->start(5000); //we should get an answer within 5 seconds.
// SendChaletCommand(CHALET_GENERAL_STATUS_REQUEST,0,QByteArray());
}
int CChaletLoraDevice::SendWiFiModuleSetState(bool State)
{
QByteArray Data;
Data.resize(1);
if(State)
{
Data[0] = 1;
}
else
{
Data[0] = 0;
}
ScheduleChaletCommand(CHALET_WIFI_SET_STATE_REQUEST,1,Data);
return RET_OK;
}
int CChaletLoraDevice::SendInverterPowerRelayState(bool State)
{
QByteArray Data;
Data.resize(1);
if(State)
{
Data[0] = 1;
}
else
{
Data[0] = 0;
}
ScheduleChaletCommand(CHALET_AC_POWER_SET_STATE_REQUEST,Data);
// SendChaletCommand(CHALET_AC_POWER_SET_STATE_REQUEST,1,Data);
return RET_OK;
}
int CChaletLoraDevice::SendDOHarakiri()
{
QByteArray Data; //Magic word...
Data.clear();
Data.append(0xBA);
Data.append(0xAD);
Data.append(0xBE);
Data.append(0xEF);
ScheduleChaletCommand(CHALET_DO_HARAKIRI_REQUEST,Data);
}
int CChaletLoraDevice::SendRebootCmd()
{
QByteArray Data; //Magic word...
Data.clear();
Data.append(0xBA);
Data.append(0xAD);
Data.append(0xCA);
Data.append(0xFE);
ScheduleChaletCommand(CHALET_REBOOT_CPU_REQUEST,Data);
}
int CChaletLoraDevice::SendChaletCommand(int CmdID, int DataSize, QByteArray Data)
{
mNetworkInterfacePtr->SendNetworkMessage(ID_CHALET_DEVICE,mDeviceAddress,CmdID,DataSize,Data);
return RET_OK;
}
int CChaletLoraDevice::CmdResponseReceived(int CmdID)
{
Q_UNUSED(CmdID)
qDebug("Chalet response received from cmd: 0x%x",CmdID);
if(mPendingNetworkMsgList.size() == 0)
{
qDebug("Cmd ack received but list is empty!!!");
}
else
{
CChaletNetworkMessage Msg = mPendingNetworkMsgList.takeFirst();
if(Msg.mMessageID != CmdID)
{
qDebug("Inconsistency between active cmd and ack received [received 0x%x] != [cur 0x%x]!!!", Msg.mMessageID,CmdID);
}
}
if(mPendingNetworkMsgList.size() == 0) //If no message is left pending... schedule status request
{
ScheduleChaletStatusRequest();
mChaletStatusTimer->start(1000);//Next status request will be sent in 1000ms
}
else
{
mChaletStatusTimer->start(500); //wait a little and send the next cmd.
}
return RET_OK;
}
void CChaletLoraDevice::LoraStatusRefreshTimerExpired()
int CChaletLoraDevice::ScheduleChaletStatusRequest()
{
QByteArray Test;
Test.resize(4);
Test[0] = 0xBA;
Test[1] = 0xAD;
Test[2] = 0xCA;
Test[3] = 0xFE;
// Test[4] = '\r';
GetLoraFrame(4,4,Test);
mLoraModuleSerialPort.write(GetLoraFrame(4,4,Test));
return;
ScheduleChaletCommand(CHALET_GENERAL_STATUS_REQUEST,0,QByteArray());
}
int CChaletLoraDevice::ScheduleChaletCommand(int CmdID, int DataSize, QByteArray Data)
{
Q_UNUSED(DataSize)
CChaletNetworkMessage Command(CmdID,Data);
mPendingNetworkMsgList.append(Command);
return RET_OK;
}
int CChaletLoraDevice::ScheduleChaletCommand(int CmdID, QByteArray Data)
{
CChaletNetworkMessage Command(CmdID,Data);
mPendingNetworkMsgList.append(Command);
return RET_OK;
}
+33 -10
View File
@@ -1,27 +1,50 @@
#ifndef CCHALETLORADEVICE_H
#define CCHALETLORADEVICE_H
#include "GlobalDefine.h"
#include "LoraDevice.h"
#include <QByteArray>
#include <QObject>
#include <QSerialPort>
#include "LoraNetworkCommIF.h"
#include "NetworkDevice.h"
#include <QTimer>
#include "ChaletData.h"
#include "ChaletNetworkMessage.h"
#include <QList>
#define LORA_MAGIC_WORD 0xBAADCAFE
class CChaletLoraDevice : public QObject, public CLoraDevice
class CChaletLoraDevice : public QObject, public CNetworkDevice
{
Q_OBJECT
public:
CChaletLoraDevice();
CChaletLoraDevice(int Address,CAbstractNetworkCommIF *NetworkInterface);
~CChaletLoraDevice();
int Init();
QTimer *mLoraStatusRefreshTimer;
virtual int NewDeviceFrameReceived(int DeviceID, int DeviceAddress, int MessageID, int DataSize, QByteArray Data);
private:
QSerialPort mLoraModuleSerialPort;
QTimer *mChaletStatusTimer;
int Start();
CChaletMainStatus GetChaletMainStatus() {return mChaletMainStatus;}
CChaletMainStatus mChaletMainStatus;
QList<CChaletNetworkMessage> mPendingNetworkMsgList;
int SendWiFiModuleSetState(bool State);
int SendInverterPowerRelayState(bool State);
int SendDOHarakiri();
int SendRebootCmd();
int SendChaletCommand(int CmdID,int DataSize, QByteArray Data);
int CmdResponseReceived(int CmdID);
int ScheduleChaletStatusRequest();
int ScheduleChaletCommand(int CmdID, int DataSize, QByteArray Data);
int ScheduleChaletCommand(int CmdID,QByteArray Data);
public slots:
void LoraStatusRefreshTimerExpired();
void CommTimerExpired();
};
#endif // CCHALETLORADEVICE_H
+10
View File
@@ -0,0 +1,10 @@
#include "ChaletNetworkMessage.h"
CChaletNetworkMessage::CChaletNetworkMessage(int MessageID, QByteArray Data)
{
mMessageID = MessageID;
mData = Data;
PendingResponse = false;
ResendCounter = 0;
}
+16
View File
@@ -0,0 +1,16 @@
#ifndef HALETNETWORKMESSAGE_H
#define HALETNETWORKMESSAGE_H
#include <QByteArray>
class CChaletNetworkMessage
{
public:
CChaletNetworkMessage(int MessageID, QByteArray Data);
int mMessageID;
QByteArray mData;
bool PendingResponse;
int ResendCounter;
};
#endif // HALETNETWORKMESSAGE_H
-25
View File
@@ -1,25 +0,0 @@
#include "LoraDevice.h"
CLoraDevice::CLoraDevice()
{
}
QByteArray CLoraDevice::GetLoraFrame(unsigned short DestAddress, unsigned char DestChannel, QByteArray Payload)
{
QByteArray OutputFrame;
OutputFrame.clear();
//E32 modules frame is [Address_MSB][Address_LSB][Channel][Payload]
char AddressByte = (char)((DestAddress >> 8) & 0x00FF);
OutputFrame.append(AddressByte);
AddressByte = (char)(DestAddress & 0x00FF);
OutputFrame.append(AddressByte);
OutputFrame.append(DestChannel);
OutputFrame.append(Payload);
return OutputFrame;
}
-16
View File
@@ -1,16 +0,0 @@
#ifndef CLORADEVICE_H
#define CLORADEVICE_H
#include <QByteArray>
class CLoraDevice
{
public:
CLoraDevice();
unsigned short mMyLoraAddress;
unsigned char mMyLoraChannel;
QByteArray GetLoraFrame(unsigned short DestAddress,unsigned char DestChannel,QByteArray Payload);
};
#endif // CLORADEVICE_H
+14
View File
@@ -180,6 +180,20 @@ void CEthernetNetworkServer::DeviceSocketDataAvail()
}
break;
}
case ID_CHALET_INTERFACE:
{
if(mDevicesMgrHandle->CreateNewChaletInterface(DeviceAddress,(CAbstractNetworkCommIF*)NetworkIF) == RET_OK)
{
Result = RES_CREATION_SUCCESS;
qDebug("Created new Chalet Interface");
}
else
{
Result = RES_CREATION_FAILED;
qDebug("Could not create Chalet Interface in ethernet server");
}
break;
}
default:
{
Result = RES_CREATION_UNKNOWN_DEVICE;
+4
View File
@@ -8,4 +8,8 @@
#define ETHERNET_NETWORK_STATUS_TIMEOUT 5000
#define ON_STATE 1
#define OFF_STATE 0
#define UNKNOWN_STATE -1
#endif // GLOBALDEFINE_H
+113
View File
@@ -0,0 +1,113 @@
#include "LoraNetworkCommIF.h"
#include "GlobalDefine.h"
CLoraNetworkCommIF::CLoraNetworkCommIF()
{
connect(&mLoraDeviceSerialPort,SIGNAL(readyRead()),this,SLOT(LoraDeviceNewDataReady()));
mLoraMagicResponse.clear();
mLoraMagicResponse.append(0xDE);
mLoraMagicResponse.append(0xAD);
mLoraMagicResponse.append(0xBE);
mLoraMagicResponse.append(0xEF);
}
QByteArray CLoraNetworkCommIF::GetLoraFrame(unsigned short DestAddress, unsigned char DestChannel, QByteArray Payload)
{
QByteArray OutputFrame;
OutputFrame.clear();
//E32 modules frame is [Address_MSB][Address_LSB][Channel][Payload]
char AddressByte = (char)((DestAddress >> 8) & 0x00FF);
OutputFrame.append(AddressByte);
AddressByte = (char)(DestAddress & 0x00FF);
OutputFrame.append(AddressByte);
OutputFrame.append(DestChannel);
OutputFrame.append(Payload);
return OutputFrame;
}
int CLoraNetworkCommIF::SetLoraSerialPortSettings(QString PortName, qint32 BaudRate)
{
mLoraSerialPortName = PortName;
mLoraSerialPortBaudRate = BaudRate;
if(mLoraDeviceSerialPort.isOpen())
{
mLoraDeviceSerialPort.close();
}
mLoraDeviceSerialPort.setPortName(mLoraSerialPortName);
if(mLoraDeviceSerialPort.setBaudRate(BaudRate) == false)
{
qDebug("Invalid Lora Device serial port baud rate...");
}
//The other serial port parameters (parity, stop bits, data bits) are all set to mentally sane default values so no need to set them.
if(mLoraDeviceSerialPort.open(QIODevice::ReadWrite) == false)
{
qDebug("Could not open Lora device port");
return RET_ERROR;
}
qDebug("Lora serial port opened");
return RET_OK;
}
int CLoraNetworkCommIF::SendLoraFrame(unsigned short DestAddress, unsigned char DestChannel, QByteArray Payload)
{
mLoraDeviceSerialPort.write(GetLoraFrame(DestAddress,DestChannel,Payload));
mLoraDeviceSerialPort.waitForBytesWritten(500);
return RET_OK;
}
void CLoraNetworkCommIF::LoraDeviceNewDataReady()
{
QByteArray NewData = mLoraDeviceSerialPort.readAll();
// QString Printf = "New Lora Data: ";
AnalyzeRxBuffer(NewData);
// for(int i = 0; i < NewData.size(); i++)
// {
// int snatch = NewData.at(i) & 0xFF;
//// mRxLoraTestMsgBuf <<= 8;
//// mRxLoraTestMsgBuf |= snatch;
//// if(mRxLoraTestMsgBuf == (qint32)LORA_MAGIC_WORD)
//// {
//// SendLoraFrame(6,4,mLoraMagicResponse);
//// qDebug("Magic word received, sending magic response!");
//// }
// QString bleh;
// bleh = QString().asprintf("0x%X - ",snatch);
// Printf.append(bleh);
// }
// qDebug("%s",qPrintable(Printf));
}
int CLoraNetworkCommIF::NewFrameReceived(int DeviceID, int DeviceAddress, int MessageID, int DataSize, QByteArray Data)
{
mDevicePtr->NewDeviceFrameReceived(DeviceID,DeviceAddress,MessageID,DataSize,Data);
return RET_OK;
}
int CLoraNetworkCommIF::SendNetworkMessage(int DeviceID, int DeviceAddress, int MessageID, int DataSize, QByteArray Data)
{
QByteArray Packet = GetTxPacket(MessageID,0,Data.data(),DataSize,DeviceAddress,DeviceID);
SendLoraFrame(6,4,Packet);
// SendLoraFrame(4,4,Packet);
return RET_OK;
}
+45
View File
@@ -0,0 +1,45 @@
#ifndef CLORANETWORKCOMMIF_H
#define CLORANETWORKCOMMIF_H
#include <QByteArray>
#include <QObject>
#include <QSerialPort>
#include "NetworkProtocol.h"
#include "AbstractNetworkInterface.h"
#include "NetworkDevice.h"
#define LORA_MAGIC_WORD 0xBAADCAFE
class CLoraNetworkCommIF : public QObject, public CNetworkProtocol, public CAbstractNetworkCommIF
{
Q_OBJECT
public:
CLoraNetworkCommIF();
QString mLoraSerialPortName;
qint32 mLoraSerialPortBaudRate;
unsigned short mMyLoraAddress;
unsigned char mMyLoraChannel;
QSerialPort mLoraDeviceSerialPort;
int SendLoraFrame(unsigned short DestAddress,unsigned char DestChannel,QByteArray Payload);
int SetLoraSerialPortSettings(QString PortName, qint32 BaudRate);
//NetworkProtocol implementation
int NewFrameReceived(int DeviceID, int DeviceAddress, int MessageID, int DataSize, QByteArray Data);
//NetworkCommIF implementation
virtual int SendNetworkMessage(int DeviceID, int DeviceAddress, int MessageID, int DataSize, QByteArray Data);
private:
QByteArray GetLoraFrame(unsigned short DestAddress,unsigned char DestChannel,QByteArray Payload);
qint32 mRxLoraTestMsgBuf;
QByteArray mLoraMagicResponse;
public slots:
void LoraDeviceNewDataReady();
};
#endif // CLORADEVICE_H
+12 -3
View File
@@ -15,7 +15,12 @@ CMasterCtrl::CMasterCtrl()
mSystemTrayManager->mProgramHandle = this;
mSettingsWindow = new CSettingsWindow();
mSettingsWindow->mProgramHandle = this;
mChaletLora = new CChaletLoraDevice;
mChaletLoraNetworkCommInterface = new CLoraNetworkCommIF();
mChaletLoraNetworkCommInterface->mMyLoraAddress = 5;
mChaletLoraNetworkCommInterface->mMyLoraChannel = 4;
mChaletLoraDevice = new CChaletLoraDevice(1,mChaletLoraNetworkCommInterface);
// mChaletLoraInterface = new CChaletLoraInterface(mRooftopTowerLoraDevice);
mEthernetNetworkServer = new CEthernetNetworkServer;
@@ -36,7 +41,8 @@ CMasterCtrl::~CMasterCtrl()
delete mEthernetNetworkServer;
delete mContactsRepository;
delete mSprinklerManager;
delete mChaletLora;
delete mChaletLoraNetworkCommInterface;
delete mChaletLoraDevice;
// delete mMasterCtrlSettings;
}
@@ -55,6 +61,7 @@ void CMasterCtrl::Start()
// FrameBuffer.seek(0);
mContactsRepository->LoadContacts();
mNetworkDevicesManager->mVoipMSInterfaceHandle = mVoipMsSMSClient;
@@ -62,6 +69,7 @@ void CMasterCtrl::Start()
mNetworkDevicesManager->mProgramHandle = this;
mNetworkDevicesManager->mSprinklerMgrHandle = mSprinklerManager;
mNetworkDevicesManager->mAvReceiverDevice = mAVReceiverDevice;
mNetworkDevicesManager->mChaletLoraDevice = mChaletLoraDevice;
mEthernetNetworkServer->mDevicesMgrHandle = mNetworkDevicesManager;
@@ -84,8 +92,9 @@ void CMasterCtrl::Start()
mAVReceiverDevice->Start();
mChaletLoraNetworkCommInterface->SetLoraSerialPortSettings("COM3",QSerialPort::Baud9600);
mChaletLoraDevice->Start();
mChaletLora->Init();
+7 -1
View File
@@ -13,6 +13,9 @@
#include "ContactRepository.h"
#include "SprinklerMgr.h"
#include "ChaletLoraDevice.h"
//#include "ChaletLoraInterface.h"
#include "LoraNetworkCommIF.h"
//#include "AppIconWidget.h"
class CMasterCtrl : public QObject
@@ -34,7 +37,10 @@ public:
CEthernetNetworkServer *mEthernetNetworkServer;
CContactRepository *mContactsRepository;
CSprinklerMgr *mSprinklerManager;
CChaletLoraDevice *mChaletLora;
CChaletLoraDevice *mChaletLoraDevice;
// CChaletLoraInterface *mChaletLoraInterface;
CLoraNetworkCommIF *mChaletLoraNetworkCommInterface;
// CAppIconWidget mAppWidget;
+12
View File
@@ -13,6 +13,7 @@ CNetworkDevicesMgr::CNetworkDevicesMgr()
mProgramHandle = 0;
mSprinklerMgrHandle = 0;
mAvReceiverDevice = 0;
mChaletLoraDevice = 0;
}
CNetworkDevicesMgr::~CNetworkDevicesMgr()
@@ -92,6 +93,17 @@ int CNetworkDevicesMgr::CreateNewAvReceiverInterface(int Address, CAbstractNetwo
return RET_OK;
}
int CNetworkDevicesMgr::CreateNewChaletInterface(int Address, CAbstractNetworkCommIF *NetworkIF)
{
if(mChaletLoraDevice == 0)
{
return RET_ERROR;
}
CChaletInterface *ChaletInterface = new CChaletInterface(Address, NetworkIF,mChaletLoraDevice);
mNetworkDevicesList.append((CNetworkDevice*)ChaletInterface);
return RET_OK;
}
void CNetworkDevicesMgr::EthernetNetworkDeviceDisconnected(CNetworkDevice *Device)
{
qDebug("Device disconnected. ID: %d, Address: %d",Device->GetDeviceID(),Device->GetDeviceAddress());
+5
View File
@@ -7,6 +7,8 @@
#include "SprinklerInterface.h"
#include "AbstractNetworkInterface.h"
#include "AvReceiverInterface.h"
#include "ChaletInterface.h"
#include "QList"
#include <QObject>
@@ -15,6 +17,7 @@ class CMasterCtrl;
class CContactRepository;
class CSprinklerMgr;
class CAVReceiverDevice;
class CChaletLoraDevice;
class CNetworkDevicesMgr: public QObject
{
@@ -30,12 +33,14 @@ public:
int CreateNewSprinklerDevice(int Address, CAbstractNetworkCommIF *NetworkIF);
int CreateNewSprinklerInterface(int Address, CAbstractNetworkCommIF *NetworkIF);
int CreateNewAvReceiverInterface(int Address, CAbstractNetworkCommIF *NetworkIF);
int CreateNewChaletInterface(int Address, CAbstractNetworkCommIF *NetworkIF);
int FindDeviceByPtr(CNetworkDevice *Device);
CNetworkDevice *GetDevice(int DeviceID, int Address);
QList<CNetworkDevice*> GetDevices(int DeviceID);
CAVReceiverDevice *mAvReceiverDevice;
CChaletLoraDevice *mChaletLoraDevice;
CVoipMsSMSClient *mVoipMSInterfaceHandle;
CContactRepository *mContactRepositoryHandle;
CMasterCtrl *mProgramHandle;
+1 -1
View File
@@ -351,7 +351,7 @@ void CNetworkProtocol::PrepareForNewPacket()
int CNetworkProtocol::AnalyzeRxBuffer(QByteArray Buffer)
{
int ret = PROTOCOL_RET_ERROR_EMPTY_BUFFER;
qDebug("Rx %d bytes",Buffer.size());
// qDebug("Rx %d bytes",Buffer.size());
for(int i = 0; i < Buffer.size(); i++)
{
ret = RxStateMachine(Buffer.at(i));
+49
View File
@@ -58,6 +58,8 @@ enum DEVICES_IDS
ID_SPRINKLER_INTERFACE,
ID_DEADBOLT_INTERFACE,
ID_AVRECEIVER_INTERFACE,
ID_CHALET_INTERFACE,
ID_CHALET_DEVICE,
ID_NB_DEVICE_ID
};
@@ -246,4 +248,51 @@ enum AV_RECEIVER_INTERFACE_CMDS
MAX_AV_RECEIVER_INTERFACE_CMD
};
enum CHALET_INTERFACE_CMDS
{
CHALET_INTERFACE_ACK = 1,
CHALET_INTERFACE_GENERAL_STATUS_REQUEST,
CHALET_INTERFACE_GENERAL_STATUS_RESPONSE,
CHALET_INTERFACE_AC_POWER_STATE_STATUS_REQUEST,
CHALET_INTERFACE_AC_POWER_STATE_STATUS_RESPONSE,
CHALET_INTERFACE_AC_POWER_SET_STATE_REQUEST,
CHALET_INTERFACE_AC_POWER_SET_STATE_RESPONSE,
CHALET_INTERFACE_BATTERY_VOLTAGE_REQUEST,
CHALET_INTERFACE_BATTERY_VOLTAGE_RESPONSE,
CHALET_INTERFACE_WIFI_SET_STATE_REQUEST,
CHALET_INTERFACE_WIFI_SET_STATE_RESPONSE,
CHALET_INTERFACE_DO_HARAKIRI_REQUEST,
CHALET_INTERFACE_DO_HARAKIRI_RESPONSE,
CHALET_INTERFACE_REBOOT_CPU_REQUEST,
CHALET_INTERFACE_REBOOT_CPU_RESPONSE,
MAX_CHALET_INTERFACE_CMD
};
enum CHALET_CMDS
{
CHALET_ACK = 1,
CHALET_GENERAL_STATUS_REQUEST, //2
CHALET_GENERAL_STATUS_RESPONSE, //3
CHALET_AC_POWER_STATE_STATUS_REQUEST,
CHALET_AC_POWER_STATE_STATUS_RESPONSE,
CHALET_AC_POWER_SET_STATE_REQUEST,
CHALET_AC_POWER_SET_STATE_RESPONSE,
CHALET_BATTERY_VOLTAGE_REQUEST,
CHALET_BATTERY_VOLTAGE_RESPONSE, //9
CHALET_BATTERY_CURRENT_REQUEST,
CHALET_BATTERY_CURRENT_RESPONSE,
CHALET_WIFI_STATUS_REQUEST,
CHALET_WIFI_STATUS_RESPONSE, //D
CHALET_WIFI_SET_STATE_REQUEST,
CHALET_WIFI_SET_STATE_RESPONSE, //F
CHALET_DO_HARAKIRI_REQUEST,
CHALET_DO_HARAKIRI_CONFIRMATION,
CHALET_REBOOT_CPU_REQUEST, //12
CHALET_REBOOT_CPU_RESPONSE,
MAX_CHALET_CMD
};
#endif
+2 -2
View File
@@ -420,10 +420,10 @@ unsigned int CVoipMsSMSClient::SMSReceived(QJsonArray *SMSArray)
if(EarlierDate < mVOIPMsSettings.mStartDate )
{
//Clipping span.
qDebug("Clipping span...");
// qDebug("Clipping span...");
EarlierDate = mVOIPMsSettings.mStartDate;
qDebug("Requesting data for last block of span");
// qDebug("Requesting data for last block of span");
mSMSDownloadState = VOIPMS_SMS_DOWNLOAD_LAST_BLOCK_MSGS_STATE;
}
// qDebug("Continue receiving from %s to %s ...",mCurStartDate.toString("yyyy-MM-dd").toUtf8().data(),EarlierDate.toString("yyyy-MM-dd").toUtf8().data());