Corrections et développement. V1.01

This commit is contained in:
jfmartel 2023-06-17 12:58:06 -04:00
parent 428cec7c29
commit abc91f1932
37 changed files with 850 additions and 13378 deletions

Binary file not shown.

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -54,7 +54,8 @@ SOURCES += Sources/main.cpp \
Sources/CloudLogging/MQTTClientWrapper.cpp \ Sources/CloudLogging/MQTTClientWrapper.cpp \
Sources/Gui/CCANWatchdogSettingsPage.cpp \ Sources/Gui/CCANWatchdogSettingsPage.cpp \
Sources/CANBus/CANWatchdogConfig.cpp \ Sources/CANBus/CANWatchdogConfig.cpp \
Sources/CANBus/CANWatchdog.cpp Sources/CANBus/CANWatchdog.cpp \
Sources/GeneralSystemParams.cpp
HEADERS += Sources/MainWindow.h \ HEADERS += Sources/MainWindow.h \
Sources/PCANInterface.h \ Sources/PCANInterface.h \
@ -80,7 +81,8 @@ HEADERS += Sources/MainWindow.h \
Sources/CloudLogging/MQTTClientWrapper.h \ Sources/CloudLogging/MQTTClientWrapper.h \
Sources/Gui/CCANWatchdogSettingsPage.h \ Sources/Gui/CCANWatchdogSettingsPage.h \
Sources/CANBus/CANWatchdogConfig.h \ Sources/CANBus/CANWatchdogConfig.h \
Sources/CANBus/CANWatchdog.h Sources/CANBus/CANWatchdog.h \
Sources/GeneralSystemParams.h
FORMS += Sources/Gui/MainWindow.ui \ FORMS += Sources/Gui/MainWindow.ui \
Sources/Gui/GeneralStatusPage.ui \ Sources/Gui/GeneralStatusPage.ui \

View File

@ -49,14 +49,14 @@ int CCANAnalyzer::Init(quint8 CANDeviceChannel, TPCANBaudrate CANDeviceBaudrate,
if(mCANDriverIF->GetDeviceHandle(mCANDeviceChannel,mCANDeviceHandle) != RET_OK) if(mCANDriverIF->GetDeviceHandle(mCANDeviceChannel,mCANDeviceHandle) != RET_OK)
{ {
QString Log = QString("Impossible de trouver le module CAN sur le channel %1").arg(mCANDeviceChannel); QString Log = QString("Impossible de trouver le module CAN sur le channel %1").arg(mCANDeviceChannel);
CGeneralMessagesLogDispatcher::instance()->AddLogMessage(Log,true,CGeneralMessagesLogDispatcher::GEN_MSG_TXT_ERROR_STATUS); CGeneralMessagesLogDispatcher::instance()->AddLogMessage(Log,true,1,CGeneralMessagesLogDispatcher::GEN_MSG_TXT_ERROR_STATUS);
mIsCANInitialized = false; mIsCANInitialized = false;
return RET_GENERAL_ERROR; return RET_GENERAL_ERROR;
} }
if(mCANDriverIF->Init(mCANDeviceHandle,CANDeviceBaudrate) != RET_OK) if(mCANDriverIF->Init(mCANDeviceHandle,CANDeviceBaudrate) != RET_OK)
{ {
CGeneralMessagesLogDispatcher::instance()->AddLogMessage("Impossible d'initialiser le matériel CAN",true,CGeneralMessagesLogDispatcher::GEN_MSG_TXT_ERROR_STATUS); CGeneralMessagesLogDispatcher::instance()->AddLogMessage("Impossible d'initialiser le matériel CAN",true,1,CGeneralMessagesLogDispatcher::GEN_MSG_TXT_ERROR_STATUS);
mIsCANInitialized = false; mIsCANInitialized = false;
return RET_GENERAL_ERROR; return RET_GENERAL_ERROR;
} }

View File

@ -19,7 +19,7 @@ CCANDevice::CCANDevice(QObject *parent)
// mDevicePollPeriod = 0; // mDevicePollPeriod = 0;
} }
CCANDevice::CCANDevice(CCANDeviceConfig &SysConfig, CMQTTClientWrapper *MQTTClient) CCANDevice::CCANDevice(CCANDeviceConfig &SysConfig, CMQTTClientWrapper *MQTTClient, QString DeviceTopicPrefix)
{ {
mMessageList.clear(); mMessageList.clear();
mMessagesListLoaded = false; mMessagesListLoaded = false;
@ -28,6 +28,7 @@ CCANDevice::CCANDevice(CCANDeviceConfig &SysConfig, CMQTTClientWrapper *MQTTClie
mDeviceConfigInfo = SysConfig; mDeviceConfigInfo = SysConfig;
mCANMQTTClient = MQTTClient; mCANMQTTClient = MQTTClient;
mDeviceTopicPrefix = DeviceTopicPrefix;
// mCANDeviceID = SysConfig.mCANDeviceID; // mCANDeviceID = SysConfig.mCANDeviceID;
// mCANDeviceBaudrate = SysConfig.mCANDeviceBaudrate; // mCANDeviceBaudrate = SysConfig.mCANDeviceBaudrate;
@ -60,7 +61,7 @@ int CCANDevice::Init()
if(mCANDatabase.BuildMessageList(&mMessageList,mDeviceConfigInfo.mDeviceName) == RET_OK) if(mCANDatabase.BuildMessageList(&mMessageList,mDeviceConfigInfo.mDeviceName) == RET_OK)
{ {
mMessagesListLoaded = true; mMessagesListLoaded = true;
mProgramPtr->InitCANViewer(&mMessageList,mDeviceConfigInfo.mDeviceName); mProgramPtr->InitCANViewer(&mMessageList,this);
} }
else else
{ {
@ -70,18 +71,22 @@ int CCANDevice::Init()
if(mCANAnalyzer.Init(mDeviceConfigInfo.mCANDeviceID,mDeviceConfigInfo.mCANDeviceBaudrate,&mMessageList,mDeviceConfigInfo.mDevicePollPeriod) != RET_OK) if(mCANAnalyzer.Init(mDeviceConfigInfo.mCANDeviceID,mDeviceConfigInfo.mCANDeviceBaudrate,&mMessageList,mDeviceConfigInfo.mDevicePollPeriod) != RET_OK)
{ {
CGeneralMessagesLogDispatcher::instance()->AddLogMessage(QString("Le dispositif [%1] n'a pas pu s'initialiser").arg(mDeviceConfigInfo.mDeviceName),true,CGeneralMessagesLogDispatcher::GEN_MSG_TXT_ERROR_STATUS); CGeneralMessagesLogDispatcher::instance()->AddLogMessage(QString("Le dispositif [%1] n'a pas pu s'initialiser").arg(mDeviceConfigInfo.mDeviceName),true,1,CGeneralMessagesLogDispatcher::GEN_MSG_TXT_ERROR_STATUS);
mProgramPtr->SetCANConnectionStatusRequest(false); mProgramPtr->SetCANConnectionStatusRequest(false);
mProgramPtr->UpdateCANModuleStatusRequest(mDeviceConfigInfo.mDeviceName,"Déconnecté","NOUPDATE"); mProgramPtr->UpdateCANModuleStatusRequest(mDeviceConfigInfo.mDeviceName,"Déconnecté","NOUPDATE");
return RET_GENERAL_ERROR; return RET_GENERAL_ERROR;
} }
#ifdef USE_TOPIC_PREFIX
mCANDataLogger.SetMQTTTopicDevice(QString("%2CANBus/%1/").arg(mDeviceConfigInfo.mDeviceName).arg(mDeviceTopicPrefix));
#else
mCANDataLogger.SetMQTTTopicDevice(QString("CANBus/%1/").arg(mDeviceConfigInfo.mDeviceName)); mCANDataLogger.SetMQTTTopicDevice(QString("CANBus/%1/").arg(mDeviceConfigInfo.mDeviceName));
#endif
mCANDataLogger.SetMQTTClient(mCANMQTTClient); mCANDataLogger.SetMQTTClient(mCANMQTTClient);
mProgramPtr->SetCANConnectionStatusRequest(true); mProgramPtr->SetCANConnectionStatusRequest(true);
mProgramPtr->UpdateCANModuleStatusRequest(mDeviceConfigInfo.mDeviceName,"Connecté","NOUPDATE"); mProgramPtr->UpdateCANModuleStatusRequest(mDeviceConfigInfo.mDeviceName,"Connecté","NOUPDATE");
CGeneralMessagesLogDispatcher::instance()->AddLogMessage(QString("Dispositif [%1] initialisé avec succès!").arg(mDeviceConfigInfo.mDeviceName),true,CGeneralMessagesLogDispatcher::GEN_MSG_TXT_SUCCESS_STATUS); CGeneralMessagesLogDispatcher::instance()->AddLogMessage(QString("Dispositif [%1] initialisé avec succès!").arg(mDeviceConfigInfo.mDeviceName),1,true,CGeneralMessagesLogDispatcher::GEN_MSG_TXT_SUCCESS_STATUS);
return RET_OK; return RET_OK;
} }

View File

@ -22,11 +22,12 @@ class CCANDevice : public QObject
Q_OBJECT Q_OBJECT
public: public:
explicit CCANDevice(QObject *parent = 0); explicit CCANDevice(QObject *parent = 0);
CCANDevice(CCANDeviceConfig &SysConfig, CMQTTClientWrapper* MQTTClient = 0); CCANDevice(CCANDeviceConfig &SysConfig, CMQTTClientWrapper* MQTTClient = 0, QString DeviceTopicPrefix="");
~CCANDevice(); ~CCANDevice();
int Init(QString DatabaseFileName, TPCANHandle CANDeviceID, TPCANBaudrate CANDeviceBaudRate, QString DevDescription, QString DeviceName, unsigned int DevicePollPeriod); int Init(QString DatabaseFileName, TPCANHandle CANDeviceID, TPCANBaudrate CANDeviceBaudRate, QString DevDescription, QString DeviceName, unsigned int DevicePollPeriod);
int Init(); int Init();
QList<CCANMessage*> *GetCANMessagesList(){return &mMessageList;}
public: public:
CCANDeviceConfig mDeviceConfigInfo; CCANDeviceConfig mDeviceConfigInfo;
@ -37,6 +38,7 @@ public:
CCANDatabase mCANDatabase; //The device's database loaded from dbc file CCANDatabase mCANDatabase; //The device's database loaded from dbc file
CCANDataLogger mCANDataLogger; CCANDataLogger mCANDataLogger;
CMQTTClientWrapper *mCANMQTTClient; CMQTTClientWrapper *mCANMQTTClient;
QString mDeviceTopicPrefix;
QList<CCANMessage*> mMessageList; QList<CCANMessage*> mMessageList;
QList<CMQTTMessage> *GetMQTTMessagesList(); QList<CMQTTMessage> *GetMQTTMessagesList();

View File

@ -29,14 +29,14 @@ int CCANWatchdog::Init(quint8 CANDeviceID, WORD CANDeviceBaudrate, unsigned int
if(mCANDriverIF->GetDeviceHandle(mCANDeviceID,mCANDeviceHandle) != RET_OK) if(mCANDriverIF->GetDeviceHandle(mCANDeviceID,mCANDeviceHandle) != RET_OK)
{ {
QString Log = QString("Impossible de trouver le module CAN Watchdog sur le channel %1").arg(mCANDeviceID); QString Log = QString("Impossible de trouver le module CAN Watchdog sur le channel %1").arg(mCANDeviceID);
CGeneralMessagesLogDispatcher::instance()->AddLogMessage(Log,true,CGeneralMessagesLogDispatcher::GEN_MSG_TXT_ERROR_STATUS); CGeneralMessagesLogDispatcher::instance()->AddLogMessage(Log,true,1,CGeneralMessagesLogDispatcher::GEN_MSG_TXT_ERROR_STATUS);
mIsCANInitialized = false; mIsCANInitialized = false;
return RET_GENERAL_ERROR; return RET_GENERAL_ERROR;
} }
if(mCANDriverIF->Init(mCANDeviceHandle,mCANDeviceBaudrate) != RET_OK) if(mCANDriverIF->Init(mCANDeviceHandle,mCANDeviceBaudrate) != RET_OK)
{ {
CGeneralMessagesLogDispatcher::instance()->AddLogMessage("Impossible d'initialiser la puck CAN du Watchdog",true,CGeneralMessagesLogDispatcher::GEN_MSG_TXT_ERROR_STATUS); CGeneralMessagesLogDispatcher::instance()->AddLogMessage("Impossible d'initialiser la puck CAN du Watchdog",true,1,CGeneralMessagesLogDispatcher::GEN_MSG_TXT_ERROR_STATUS);
mIsCANInitialized = false; mIsCANInitialized = false;
return RET_GENERAL_ERROR; return RET_GENERAL_ERROR;
} }

View File

@ -33,7 +33,7 @@ int CCANDatabase::LoadDatabaseFile(QString Filename)
status = kvaDbOpen(&mDatabaseDriverHandle); status = kvaDbOpen(&mDatabaseDriverHandle);
if (status != kvaDbOK) if (status != kvaDbOK)
{ {
CGeneralMessagesLogDispatcher::instance()->AddLogMessage(QString("Impossible d'initialiser la base de données (création du handle impossble"),true,CGeneralMessagesLogDispatcher::GEN_MSG_TXT_ERROR_STATUS); CGeneralMessagesLogDispatcher::instance()->AddLogMessage(QString("Impossible d'initialiser la base de données (création du handle impossble"),true,1,CGeneralMessagesLogDispatcher::GEN_MSG_TXT_ERROR_STATUS);
qDebug("Could not create a database handle: %d\n", status); qDebug("Could not create a database handle: %d\n", status);
return RET_GENERAL_ERROR; return RET_GENERAL_ERROR;
} }
@ -44,7 +44,7 @@ int CCANDatabase::LoadDatabaseFile(QString Filename)
status = kvaDbReadFile(mDatabaseDriverHandle, Filename.toLocal8Bit().data()); status = kvaDbReadFile(mDatabaseDriverHandle, Filename.toLocal8Bit().data());
if (status != kvaDbOK) if (status != kvaDbOK)
{ {
CGeneralMessagesLogDispatcher::instance()->AddLogMessage(QString("Erreur de base de données: impossible de charger le fichier %1").arg(Filename),true,CGeneralMessagesLogDispatcher::GEN_MSG_TXT_ERROR_STATUS); CGeneralMessagesLogDispatcher::instance()->AddLogMessage(QString("Erreur de base de données: impossible de charger le fichier %1").arg(Filename),true,1,CGeneralMessagesLogDispatcher::GEN_MSG_TXT_ERROR_STATUS);
qDebug("Could not load '%s': %d\n", Filename.toLocal8Bit().data(), status); qDebug("Could not load '%s': %d\n", Filename.toLocal8Bit().data(), status);
return RET_GENERAL_ERROR; return RET_GENERAL_ERROR;
} }
@ -52,11 +52,11 @@ int CCANDatabase::LoadDatabaseFile(QString Filename)
status = kvaDbGetFlags(mDatabaseDriverHandle, &flags); status = kvaDbGetFlags(mDatabaseDriverHandle, &flags);
if (status != kvaDbOK) if (status != kvaDbOK)
{ {
CGeneralMessagesLogDispatcher::instance()->AddLogMessage(QString("Erreur de base de données: impossible de charger les flags"),true,CGeneralMessagesLogDispatcher::GEN_MSG_TXT_ERROR_STATUS); CGeneralMessagesLogDispatcher::instance()->AddLogMessage(QString("Erreur de base de données: impossible de charger les flags"),true,1,CGeneralMessagesLogDispatcher::GEN_MSG_TXT_ERROR_STATUS);
qDebug("kvaDbGetFlags failed: %d\n", status); qDebug("kvaDbGetFlags failed: %d\n", status);
return RET_GENERAL_ERROR; return RET_GENERAL_ERROR;
} }
CGeneralMessagesLogDispatcher::instance()->AddLogMessage(QString("Base de données chargée avec succès. Flags: 0x%1").arg(flags),true,CGeneralMessagesLogDispatcher::GEN_MSG_TXT_SUCCESS_STATUS); CGeneralMessagesLogDispatcher::instance()->AddLogMessage(QString("Base de données chargée avec succès. Flags: 0x%1").arg(flags),true,1,CGeneralMessagesLogDispatcher::GEN_MSG_TXT_SUCCESS_STATUS);
qDebug(" Database: flags=0x%x\n", flags); qDebug(" Database: flags=0x%x\n", flags);
mDatabaseFileLoaded = true; mDatabaseFileLoaded = true;
@ -85,7 +85,7 @@ int CCANDatabase::BuildMessageList(QList<CCANMessage *> *MsgListPtr, QString Own
status = kvaDbGetFirstMsg (mDatabaseDriverHandle, &mh); status = kvaDbGetFirstMsg (mDatabaseDriverHandle, &mh);
if (status != kvaDbOK) if (status != kvaDbOK)
{ {
CGeneralMessagesLogDispatcher::instance()->AddLogMessage(QString("Erreur de base de données: impossible de charger le premier message"),true,CGeneralMessagesLogDispatcher::GEN_MSG_TXT_ERROR_STATUS); CGeneralMessagesLogDispatcher::instance()->AddLogMessage(QString("Erreur de base de données: impossible de charger le premier message"),true,1,CGeneralMessagesLogDispatcher::GEN_MSG_TXT_ERROR_STATUS);
qDebug ("kvaDbGetFirstMsg failed: %d\n", status); qDebug ("kvaDbGetFirstMsg failed: %d\n", status);
return RET_GENERAL_ERROR; return RET_GENERAL_ERROR;
} }

View File

@ -13,7 +13,8 @@ QDataStream &operator>>(QDataStream &in, CCloudParams &dest)
>> dest.mMQTTBrokerPort >> dest.mMQTTBrokerPort
>> dest.mMQTTBrokerUserName >> dest.mMQTTBrokerUserName
>> dest.mMQTTTopicPrefix >> dest.mMQTTTopicPrefix
>> dest.mMQTTTransmitTimeout; >> dest.mMQTTTransmitTimeout
>> dest.mMQTTClientID;
return in; return in;
} }
@ -24,7 +25,8 @@ QDataStream &operator<<(QDataStream &out, const CCloudParams &source)
<< source.mMQTTBrokerPort << source.mMQTTBrokerPort
<< source.mMQTTBrokerUserName << source.mMQTTBrokerUserName
<< source.mMQTTTopicPrefix << source.mMQTTTopicPrefix
<< source.mMQTTTransmitTimeout; << source.mMQTTTransmitTimeout
<< source.mMQTTClientID;
return out; return out;
} }
@ -41,6 +43,7 @@ CCloudParams& CCloudParams::operator=(const CCloudParams &source)
this->mMQTTBrokerUserName = source.mMQTTBrokerUserName; this->mMQTTBrokerUserName = source.mMQTTBrokerUserName;
this->mMQTTTopicPrefix = source.mMQTTTopicPrefix; this->mMQTTTopicPrefix = source.mMQTTTopicPrefix;
this->mMQTTTransmitTimeout = source.mMQTTTransmitTimeout; this->mMQTTTransmitTimeout = source.mMQTTTransmitTimeout;
this->mMQTTClientID = source.mMQTTClientID;
return *this; return *this;
} }

View File

@ -13,6 +13,7 @@ public:
QString mMQTTTopicPrefix; QString mMQTTTopicPrefix;
quint32 mMQTTBrokerPort; quint32 mMQTTBrokerPort;
quint32 mMQTTTransmitTimeout; quint32 mMQTTTransmitTimeout;
QString mMQTTClientID;
CCloudParams &operator=(const CCloudParams &source); CCloudParams &operator=(const CCloudParams &source);
}; };

View File

@ -23,7 +23,7 @@ CMQTTClientWrapper::~CMQTTClientWrapper()
int CMQTTClientWrapper::SetMQTTParams(CCloudParams *Params) int CMQTTClientWrapper::SetMQTTParams(CCloudParams *Params)
{ {
mMQTTParams = *Params; mMQTTParams = *Params;
mMQTTClientID = "Otarcik_Station_Ville_Emard"; // mMQTTClientID = "Otarcik_Station_Ville_Emard";
return RET_OK; return RET_OK;
} }
@ -32,7 +32,7 @@ int CMQTTClientWrapper::ConnectToBroker()
{ {
//Setup the client before connecting. //Setup the client before connecting.
mMQTTClient.setAutoKeepAlive(true); mMQTTClient.setAutoKeepAlive(true);
mMQTTClient.setClientId(mMQTTClientID); mMQTTClient.setClientId(mMQTTParams.mMQTTClientID);
mMQTTClient.setHostname(mMQTTParams.mMQTTBrokerHostName); mMQTTClient.setHostname(mMQTTParams.mMQTTBrokerHostName);
mMQTTClient.setPort(mMQTTParams.mMQTTBrokerPort); mMQTTClient.setPort(mMQTTParams.mMQTTBrokerPort);
mMQTTClient.setPassword(mMQTTParams.mMQTTBrokerPassword); mMQTTClient.setPassword(mMQTTParams.mMQTTBrokerPassword);
@ -143,7 +143,7 @@ void CMQTTClientWrapper::MQTTSendTimerExpired()
qint32 res = mMQTTClient.publish(MessagesList->at(i).mMessageTopic,MessagesList->at(i).mMessagePayload.toLocal8Bit(),0,true); qint32 res = mMQTTClient.publish(MessagesList->at(i).mMessageTopic,MessagesList->at(i).mMessagePayload.toLocal8Bit(),0,true);
qDebug("%s : %s",qPrintable(MessagesList->at(i).mMessageTopic), qPrintable(MessagesList->at(i).mMessagePayload)); qDebug("%s : %s",qPrintable(MessagesList->at(i).mMessageTopic), qPrintable(MessagesList->at(i).mMessagePayload));
QString LogMsg = QString("Envoi d'un message MQTT. Topic: %1 Payload: %2").arg(MessagesList->at(i).mMessageTopic).arg(MessagesList->at(i).mMessagePayload); QString LogMsg = QString("Envoi d'un message MQTT. Topic: %1 Payload: %2").arg(MessagesList->at(i).mMessageTopic).arg(MessagesList->at(i).mMessagePayload);
CGeneralMessagesLogDispatcher::instance()->AddLogMessage(LogMsg,false); CGeneralMessagesLogDispatcher::instance()->AddLogMessage(LogMsg,true,3);
} }
qDebug("Sent %d MQTT messages",MessagesList->size()); qDebug("Sent %d MQTT messages",MessagesList->size());

View File

@ -27,7 +27,7 @@ public:
int SetCANDevicesList(QList<CCANDevice*> *List); int SetCANDevicesList(QList<CCANDevice*> *List);
COtarcikCan *mProgramPtr; COtarcikCan *mProgramPtr;
QString mMQTTClientID; // QString mMQTTClientID;
QTimer *mMQTTRefreshTimer; QTimer *mMQTTRefreshTimer;
QTimer *mMQTTReconnectTimer; QTimer *mMQTTReconnectTimer;

View File

@ -59,10 +59,14 @@ int CGeneralMessagesLogDispatcher::Init()
mSystemLogFile->write(QString("Démarrage du logiciel Otarcik CAN le %1 à %2\n").arg(QDateTime::currentDateTime().date().toString("yyyy-MM-dd")).arg(QDateTime::currentDateTime().time().toString("hh:mm:ss")).toUtf8()); mSystemLogFile->write(QString("Démarrage du logiciel Otarcik CAN le %1 à %2\n").arg(QDateTime::currentDateTime().date().toString("yyyy-MM-dd")).arg(QDateTime::currentDateTime().time().toString("hh:mm:ss")).toUtf8());
mSystemLogFile->write(QString("********************************************************************\n").toUtf8()); mSystemLogFile->write(QString("********************************************************************\n").toUtf8());
} }
mLogFileVerbosity = 3;
mGuiLogVerbosity = 3;
return RET_OK; return RET_OK;
} }
int CGeneralMessagesLogDispatcher::AddLogMessage(QString LogLine, bool AddToGUILogPanel, eGenMsgTextErrorStatus TxtErrStatus) int CGeneralMessagesLogDispatcher::AddLogMessage(QString LogLine, bool AddToGUILogPanel, int MsgVerbosity, eGenMsgTextErrorStatus TxtErrStatus)
{ {
//TODO: Add text to log file... //TODO: Add text to log file...
@ -86,31 +90,37 @@ int CGeneralMessagesLogDispatcher::AddLogMessage(QString LogLine, bool AddToGUIL
} }
mSystemLogFile->write(LogLine.toUtf8()); if(MsgVerbosity <= mLogFileVerbosity)
if(AddToGUILogPanel == true)
{ {
if(TxtErrStatus == GEN_MSG_TXT_ERROR_STATUS) mSystemLogFile->write(LogLine.toUtf8());
{ }
LogLine.prepend("%E");
}
else if(TxtErrStatus == GEN_MSG_TXT_WARNING_STATUS)
{
LogLine.prepend("%W");
}
else if(TxtErrStatus == GEN_MSG_TXT_SUCCESS_STATUS)
{
LogLine.prepend("%S");
}
if(mGeneralStatusPageHandle != 0) if(MsgVerbosity <= mGuiLogVerbosity)
{
if(AddToGUILogPanel == true)
{ {
mGeneralStatusPageHandle->AddGeneralMsgBoxLineEntry(LogLine); if(TxtErrStatus == GEN_MSG_TXT_ERROR_STATUS)
} {
else LogLine.prepend("%E");
{ }
qDebug("Someone forgot to assing their pointers in CGeneralMessagesLogDispatch::AddLogMessage!! This needs to be fixed"); else if(TxtErrStatus == GEN_MSG_TXT_WARNING_STATUS)
return RET_GENERAL_ERROR; {
LogLine.prepend("%W");
}
else if(TxtErrStatus == GEN_MSG_TXT_SUCCESS_STATUS)
{
LogLine.prepend("%S");
}
if(mGeneralStatusPageHandle != 0)
{
mGeneralStatusPageHandle->AddGeneralMsgBoxLineEntry(LogLine);
}
else
{
qDebug("Someone forgot to assing their pointers in CGeneralMessagesLogDispatch::AddLogMessage!! This needs to be fixed");
return RET_GENERAL_ERROR;
}
} }
} }
@ -135,3 +145,10 @@ int CGeneralMessagesLogDispatcher::BindGuiPageHandle(CGeneralStatusPage *Handle)
return RET_OK; return RET_OK;
} }
int CGeneralMessagesLogDispatcher::SetLogVerbosities(int LogFileVerbosity, int GuiLogVerbosity)
{
mGuiLogVerbosity = GuiLogVerbosity;
mLogFileVerbosity = LogFileVerbosity;
return RET_OK;
}

View File

@ -30,14 +30,17 @@ public:
CGeneralMessagesLogDispatcher(); CGeneralMessagesLogDispatcher();
~CGeneralMessagesLogDispatcher(); ~CGeneralMessagesLogDispatcher();
int AddLogMessage(QString LogLine, bool AddToGUILogPanel = true, eGenMsgTextErrorStatus TxtErrStatus = GEN_MSG_TXT_NO_ERROR_STATUS); int AddLogMessage(QString LogLine, bool AddToGUILogPanel = true, int MsgVerbosity = 1, eGenMsgTextErrorStatus TxtErrStatus = GEN_MSG_TXT_NO_ERROR_STATUS);
CGeneralStatusPage *mGeneralStatusPageHandle; CGeneralStatusPage *mGeneralStatusPageHandle;
int BindGuiPageHandle(CGeneralStatusPage *Handle); int BindGuiPageHandle(CGeneralStatusPage *Handle);
int Init(); int Init();
int SetLogVerbosities(int LogFileVerbosity, int GuiLogVerbosity);
private: private:
QStringList mGeneralMsgGUILog; QStringList mGeneralMsgGUILog;
QFile *mSystemLogFile; QFile *mSystemLogFile;
int mLogFileVerbosity;
int mGuiLogVerbosity;
}; };

View File

@ -0,0 +1,36 @@
#include "GeneralSystemParams.h"
CGeneralSystemParams::CGeneralSystemParams()
{
mLocalLogVerbosity = 1;
mLogFileVerbosity = 0;
}
QDataStream &operator>>(QDataStream &in, CGeneralSystemParams &dest)
{
in >> dest.mLocalLogVerbosity
>> dest.mLogFileVerbosity;
return in;
}
QDataStream &operator<<(QDataStream &out, const CGeneralSystemParams &source)
{
out << source.mLocalLogVerbosity
<< source.mLogFileVerbosity;
return out;
}
CGeneralSystemParams& CGeneralSystemParams::operator=(const CGeneralSystemParams &source)
{
if(&source == this)
{
return *this;
}
this->mLocalLogVerbosity = source.mLocalLogVerbosity;
this->mLogFileVerbosity = source.mLogFileVerbosity;
return *this;
}

View File

@ -0,0 +1,21 @@
#ifndef GENERALSYSTEMPARAMS_H
#define GENERALSYSTEMPARAMS_H
#include <QDataStream>
class CGeneralSystemParams
{
public:
CGeneralSystemParams();
int mLocalLogVerbosity;
int mLogFileVerbosity;
CGeneralSystemParams &operator=(const CGeneralSystemParams &source);
};
QDataStream &operator<<(QDataStream &out, const CGeneralSystemParams &source);
QDataStream &operator>>(QDataStream &in, CGeneralSystemParams &dest);
#endif // GENERALSYSTEMPARAMS_H

View File

@ -1,6 +1,9 @@
#include "CANViewerPage.h" #include "CANViewerPage.h"
#include "ui_CANViewerPage.h" #include "ui_CANViewerPage.h"
#include "defines.h" #include "defines.h"
#include "CANDevice.h"
#include "MQTTMessage.h"
#include <QClipboard>
CCANViewerPage::CCANViewerPage(QWidget *parent) : CCANViewerPage::CCANViewerPage(QWidget *parent) :
QWidget(parent), QWidget(parent),
@ -21,10 +24,8 @@ CCANViewerPage::CCANViewerPage(QWidget *parent) :
ui->mCANSignalTableWidget->setColumnCount(4); ui->mCANSignalTableWidget->setColumnCount(4);
ui->mCANSignalTableWidget->setHorizontalHeaderLabels(QStringList() << "Nom du signal" << "Val. physique" << "Val. brute" << "Unités"); ui->mCANSignalTableWidget->setHorizontalHeaderLabels(QStringList() << "Nom du signal" << "Val. physique" << "Val. brute" << "Unités");
connect(ui->mCANDataTableWidget,&QTableWidget::itemSelectionChanged,this,&CCANViewerPage::MessageSelectionChanged); connect(ui->mCANDataTableWidget,&QTableWidget::itemSelectionChanged,this,&CCANViewerPage::MessageSelectionChanged);
connect(ui->mCopyJSonToClipboardBtn,&QPushButton::pressed,this,&CCANViewerPage::CopyJSONToClipboardButtonPressed);
} }
CCANViewerPage::~CCANViewerPage() CCANViewerPage::~CCANViewerPage()
@ -32,60 +33,54 @@ CCANViewerPage::~CCANViewerPage()
delete ui; delete ui;
} }
int CCANViewerPage::InitCANTable(QList<CCANMessage *> *MsgList, QString DeviceName) int CCANViewerPage::InitCANTable(QList<CCANDevice *> *CANDevicesList)
{ {
if(MsgList == 0) //if(MsgList == 0)
if(CANDevicesList == 0)
{ {
return RET_GENERAL_ERROR; return RET_GENERAL_ERROR;
} }
mMsgList.append(MsgList); ResetPage();
int row = ui->mCANDataTableWidget->rowCount(); mCANDevicesList = CANDevicesList;
ui->mCANDataTableWidget->setRowCount(MsgList->size() + row);
for(int Msg = 0; Msg < MsgList->size(); Msg++) for(int Dev = 0; Dev < mCANDevicesList->size(); Dev++)
{ {
QTableWidgetItem *NewItem; QList<CCANMessage *> *MsgList = mCANDevicesList->at(Dev)->GetCANMessagesList();
NewItem = new QTableWidgetItem(DeviceName); int row = ui->mCANDataTableWidget->rowCount();
ui->mCANDataTableWidget->setItem(row,0,NewItem); ui->mCANDataTableWidget->setRowCount(MsgList->size() + row);
for(int Msg = 0; Msg < MsgList->size(); Msg++)
{
QTableWidgetItem *NewItem;
//Set Msg name NewItem = new QTableWidgetItem(mCANDevicesList->at(Dev)->mDeviceConfigInfo.mDeviceName);
NewItem = new QTableWidgetItem(QString("%1").arg(MsgList->at(Msg)->mCANMsgName)); ui->mCANDataTableWidget->setItem(row,0,NewItem);
ui->mCANDataTableWidget->setItem(row,1,NewItem);
//Set message ID value //Set Msg name
NewItem = new QTableWidgetItem(QString("0x%1").arg(MsgList->at(Msg)->mCANMsgID,0,16)); NewItem = new QTableWidgetItem(QString("%1").arg(MsgList->at(Msg)->mCANMsgName));
ui->mCANDataTableWidget->setItem(row,2,NewItem); ui->mCANDataTableWidget->setItem(row,1,NewItem);
NewItem->setData(Qt::UserRole,MsgList->at(Msg)->mCANMsgID); //Set message ID as reference to easily find the row when updating...
//Set message type value //Set message ID value
NewItem = new QTableWidgetItem(QString("0x%1").arg(MsgList->at(Msg)->mCANMsgType,0,16)); NewItem = new QTableWidgetItem(QString("0x%1").arg(MsgList->at(Msg)->mCANMsgID,0,16));
ui->mCANDataTableWidget->setItem(row,3,NewItem); ui->mCANDataTableWidget->setItem(row,2,NewItem);
NewItem->setData(Qt::UserRole,MsgList->at(Msg)->mCANMsgID); //Set message ID as reference to easily find the row when updating...
//Set message length value //Set message type value
NewItem = new QTableWidgetItem(QString(" ")); NewItem = new QTableWidgetItem(QString("0x%1").arg(MsgList->at(Msg)->mCANMsgType,0,16));
ui->mCANDataTableWidget->setItem(row,4,NewItem); ui->mCANDataTableWidget->setItem(row,3,NewItem);
NewItem = new QTableWidgetItem(QString(" ")); //Set message length value
ui->mCANDataTableWidget->setItem(row,5,NewItem); NewItem = new QTableWidgetItem(QString(" "));
ui->mCANDataTableWidget->setItem(row,4,NewItem);
row++; NewItem = new QTableWidgetItem(QString(" "));
ui->mCANDataTableWidget->setItem(row,5,NewItem);
row++;
}
// //Set data value
// QString Data;
// for(unsigned int i = 0; i < MsgList->at(Msg)->mCANMsgLength; i++)
// {
// unsigned char DataByte = MsgList->at(Msg)->mCANMsgData.at(i);
// Data.append(QString("%1 ").arg(DataByte,2,16,QLatin1Char('0')));
// }
// NewItem = new QTableWidgetItem(Data);
// ui->mCANDataTableWidget->setItem(Msg,5,NewItem);
} }
// ui->mCANSignalTableWidget->setCurrentItem(ui->mCANDataTableWidget->item(0,0));
// MessageSelectionChanged();
return RET_OK; return RET_OK;
} }
@ -124,75 +119,94 @@ int CCANViewerPage::UpdateCANTable(QList<CCANMessage *> *MsgList)
void CCANViewerPage::MessageSelectionChanged() void CCANViewerPage::MessageSelectionChanged()
{ {
// if(mMsgList == 0) if(mCANDevicesList->isEmpty())
// {
// return;
// }
if(mMsgList.isEmpty())
{ {
return; return;
} }
ui->mCANSignalTableWidget->clearContents(); ui->mCANSignalTableWidget->clearContents();
//Find message based on current table selection //Find message based on current table selection
int row = ui->mCANDataTableWidget->currentRow(); int row = ui->mCANDataTableWidget->currentRow();
if(row == -1) if(row == -1)
return; return;
for(int MsgList = 0; MsgList < mMsgList.size(); MsgList++)
for(int Dev = 0; Dev < mCANDevicesList->size(); Dev++)
{ {
for (int msg = 0; msg < mMsgList.at(MsgList)->size(); msg++) QString DeviceName = ui->mCANDataTableWidget->item(row,0)->text();
if(mCANDevicesList->at(Dev)->mDeviceConfigInfo.mDeviceName == DeviceName) //Find the device corresponding to the selected line
{ {
unsigned int ID = ui->mCANDataTableWidget->item(row,2)->data(Qt::UserRole).toUInt(); QList<CCANMessage *> *MsgList = mCANDevicesList->at(Dev)->GetCANMessagesList();
QString Device = ui->mCANDataTableWidget->item(row,0)->text(); for (int msg = 0; msg < MsgList->size(); msg++)
if(Device == mMsgList.at(MsgList)->at(msg)->mOwnerDeviceName &&
ID == mMsgList.at(MsgList)->at(msg)->mCANMsgID)
{ {
CCANMessage *Msg = mMsgList.at(MsgList)->at(msg); unsigned int ID = ui->mCANDataTableWidget->item(row,2)->data(Qt::UserRole).toUInt();
ui->mCANSignalTableWidget->clearContents();
ui->mCANSignalTableWidget->setRowCount(Msg->mSignalsList.size());
for(int signal = 0; signal < Msg->mSignalsList.size(); signal++) if(ID == MsgList->at(msg)->mCANMsgID) //Find the message in the list corresponding to the selected line
{ {
//Signal name CCANMessage *Msg = MsgList->at(msg);
QTableWidgetItem *NewItem = new QTableWidgetItem(Msg->mSignalsList.at(signal).mSignalName); ui->mCANSignalTableWidget->clearContents();
ui->mCANSignalTableWidget->setItem(signal,0,NewItem); ui->mCANSignalTableWidget->setRowCount(Msg->mSignalsList.size());
//Phys value for(int signal = 0; signal < Msg->mSignalsList.size(); signal++)
{
//Signal name
QTableWidgetItem *NewItem = new QTableWidgetItem(Msg->mSignalsList.at(signal).mSignalName);
ui->mCANSignalTableWidget->setItem(signal,0,NewItem);
//JFM 2023-06-13 changé pour forcer toujours à float //Phys value
NewItem = new QTableWidgetItem(QString("%1").arg(Msg->mSignalsList.at(signal).mPhysicalValue,0,'f',1)); #ifdef FORCE_FLOAT_REPRESENTATION
//JFM 2023-06-13 changé pour forcer toujours à float
NewItem = new QTableWidgetItem(QString("%1").arg(Msg->mSignalsList.at(signal).mPhysicalValue,0,'f',1));
#else
if(Msg->mSignalsList.at(signal).mValueType == CCANSignal::CAN_SIGNAL_TYPE_UNSIGNED_INT)
{
NewItem = new QTableWidgetItem(QString("%1").arg((quint64)Msg->mSignalsList.at(signal).mPhysicalValue));
}
else if(Msg->mSignalsList.at(signal).mValueType == CCANSignal::CAN_SIGNAL_TYPE_SIGNED_INT)
{
/* NewItem = new QTableWidgetItem(QString("%1").arg((qint64)Msg->mSignalsList.at(signal).mPhysicalValue));
if(Msg->mSignalsList.at(signal).mValueType == CCANSignal::CAN_SIGNAL_TYPE_UNSIGNED_INT) }
{ else if(Msg->mSignalsList.at(signal).mValueType == CCANSignal::CAN_SIGNAL_TYPE_32_BIT_FLOAT ||
NewItem = new QTableWidgetItem(QString("%1").arg((quint64)Msg->mSignalsList.at(signal).mPhysicalValue)); Msg->mSignalsList.at(signal).mValueType == CCANSignal::CAN_SIGNAL_TYPE_64_BIT_DOUBLE)
} {
else if(Msg->mSignalsList.at(signal).mValueType == CCANSignal::CAN_SIGNAL_TYPE_SIGNED_INT) NewItem = new QTableWidgetItem(QString("%1").arg(Msg->mSignalsList.at(signal).mPhysicalValue,0,'f',1));
{ }
#endif
ui->mCANSignalTableWidget->setItem(signal,1,NewItem);
NewItem = new QTableWidgetItem(QString("%1").arg((qint64)Msg->mSignalsList.at(signal).mPhysicalValue)); //Raw value
} NewItem = new QTableWidgetItem(QString("0x%1").arg(Msg->mSignalsList.at(signal).mRawValue,0,16));
else if(Msg->mSignalsList.at(signal).mValueType == CCANSignal::CAN_SIGNAL_TYPE_32_BIT_FLOAT || ui->mCANSignalTableWidget->setItem(signal,2,NewItem);
Msg->mSignalsList.at(signal).mValueType == CCANSignal::CAN_SIGNAL_TYPE_64_BIT_DOUBLE)
{
NewItem = new QTableWidgetItem(QString("%1").arg(Msg->mSignalsList.at(signal).mPhysicalValue,0,'f',1));
}*/
ui->mCANSignalTableWidget->setItem(signal,1,NewItem);
//Raw value //Units
NewItem = new QTableWidgetItem(QString("0x%1").arg(Msg->mSignalsList.at(signal).mRawValue,0,16)); NewItem = new QTableWidgetItem(Msg->mSignalsList.at(signal).mSignalUnit);
ui->mCANSignalTableWidget->setItem(signal,2,NewItem); ui->mCANSignalTableWidget->setItem(signal,3,NewItem);
//Units }
NewItem = new QTableWidgetItem(Msg->mSignalsList.at(signal).mSignalUnit);
ui->mCANSignalTableWidget->setItem(signal,3,NewItem);
ui->mJSonSignalViewTxtEdit->clear();
CMQTTMessage MQTTMsg = mCANDevicesList->at(Dev)->mCANDataLogger.GetMQTTMessage(Msg,true);
QString MQTTMsgDisplay = QString("Topic: %1\n\nPayload:\n%2").arg(MQTTMsg.mMessageTopic).arg(MQTTMsg.mMessagePayload);
ui->mJSonSignalViewTxtEdit->insertPlainText(MQTTMsgDisplay);
} }
} }
} }
} }
}
int CCANViewerPage::ResetPage()
{
ui->mCANDataTableWidget->clearContents();
ui->mCANDataTableWidget->setRowCount(0);
ui->mCANSignalTableWidget->clearContents();
ui->mCANSignalTableWidget->setRowCount(0);
return RET_OK;
} }
int CCANViewerPage::UpdateSignalsTable() int CCANViewerPage::UpdateSignalsTable()
@ -245,3 +259,10 @@ int CCANViewerPage::UpdateSignalsTable()
return RET_OK; return RET_OK;
} }
void CCANViewerPage::CopyJSONToClipboardButtonPressed()
{
// QApplication::clipboard()->setText(ui->mJSonSignalViewTxtEdit->);
ui->mJSonSignalViewTxtEdit->selectAll();
ui->mJSonSignalViewTxtEdit->copy();
}

View File

@ -5,10 +5,20 @@
#include "CANMessage.h" #include "CANMessage.h"
#include <QList> #include <QList>
class CCANDevice;
namespace Ui { namespace Ui {
class CCANViewerPage; class CCANViewerPage;
} }
class CCANViewerInfoStructure
{
public:
QList<CCANMessage *> *mMsgList;
CCANDevice *mCANDevice;
};
class CCANViewerPage : public QWidget class CCANViewerPage : public QWidget
{ {
Q_OBJECT Q_OBJECT
@ -19,17 +29,21 @@ public:
int UpdateCANTable(QList<CCANMessage*> *MsgList); int UpdateCANTable(QList<CCANMessage*> *MsgList);
int InitCANTable(QList<CCANMessage*> *MsgList, QString DeviceName); int InitCANTable(QList<CCANDevice*> *CANDevicesList);
int UpdateSignalsTable(); int UpdateSignalsTable();
int ResetPage();
QList<CCANViewerInfoStructure> mCANDataStructureList;
QList<QList<CCANMessage *>*> mMsgList; QList<CCANDevice*> *mCANDevicesList;
public slots: public slots:
void MessageSelectionChanged(); void MessageSelectionChanged();
void CopyJSONToClipboardButtonPressed();
private: private:
Ui::CCANViewerPage *ui; Ui::CCANViewerPage *ui;
}; };
#endif // CANVIEWERPAGE_H #endif // CANVIEWERPAGE_H

View File

@ -18,11 +18,15 @@ CLoggingSettingsPage::CLoggingSettingsPage(QWidget *parent) :
ui->mCloudMQTTTopicPrefixEdit->setEnabled(false); ui->mCloudMQTTTopicPrefixEdit->setEnabled(false);
ui->mCloudMQTTUserNameEdit->setEnabled(false); ui->mCloudMQTTUserNameEdit->setEnabled(false);
ui->mCloudMQTTRefreshRateSpinBx->setEnabled(false); ui->mCloudMQTTRefreshRateSpinBx->setEnabled(false);
ui->mCloudMQTTClientID->setEnabled(false);
connect(ui->mCancelBtn,&QPushButton::clicked,this,&CLoggingSettingsPage::CancelBtnPressed); connect(ui->mCancelBtn,&QPushButton::clicked,this,&CLoggingSettingsPage::CancelBtnPressed);
connect(ui->mChangeParamsBtn,&QPushButton::clicked,this,&CLoggingSettingsPage::ModifyParamsBtnPressed); connect(ui->mChangeParamsBtn,&QPushButton::clicked,this,&CLoggingSettingsPage::ModifyParamsBtnPressed);
connect(ui->mLogZoneVerbositySpinBx,QOverload<int>::of(&QSpinBox::valueChanged),this,&CLoggingSettingsPage::VerbosityParamsChanged);
connect(ui->mLogFileVerbositySpinBx,QOverload<int>::of(&QSpinBox::valueChanged),this,&CLoggingSettingsPage::VerbosityParamsChanged);
} }
CLoggingSettingsPage::~CLoggingSettingsPage() CLoggingSettingsPage::~CLoggingSettingsPage()
@ -39,7 +43,21 @@ int CLoggingSettingsPage::SetCloudParams(const CCloudParams *CloudParams)
mCloudParams = *CloudParams; mCloudParams = *CloudParams;
UpdateConfigPage(); UpdateCloudConfig();
return RET_OK;
}
int CLoggingSettingsPage::SetGeneralSettingsParams(const CGeneralSystemParams *GeneralParams)
{
if(GeneralParams == 0)
{
return RET_GENERAL_ERROR;
}
mGeneralSystemParams = *GeneralParams;
UpdateGeneralParams();
return RET_OK; return RET_OK;
} }
@ -55,6 +73,7 @@ void CLoggingSettingsPage::ModifyParamsBtnPressed()
ui->mCloudMQTTTopicPrefixEdit->setEnabled(true); ui->mCloudMQTTTopicPrefixEdit->setEnabled(true);
ui->mCloudMQTTUserNameEdit->setEnabled(true); ui->mCloudMQTTUserNameEdit->setEnabled(true);
ui->mCloudMQTTRefreshRateSpinBx->setEnabled(true); ui->mCloudMQTTRefreshRateSpinBx->setEnabled(true);
ui->mCloudMQTTClientID->setEnabled(true);
ui->mChangeParamsBtn->setText("Appliquer"); ui->mChangeParamsBtn->setText("Appliquer");
} }
else else
@ -68,14 +87,21 @@ void CLoggingSettingsPage::ModifyParamsBtnPressed()
ui->mCloudMQTTTopicPrefixEdit->setEnabled(false); ui->mCloudMQTTTopicPrefixEdit->setEnabled(false);
ui->mCloudMQTTUserNameEdit->setEnabled(false); ui->mCloudMQTTUserNameEdit->setEnabled(false);
ui->mCloudMQTTRefreshRateSpinBx->setEnabled(false); ui->mCloudMQTTRefreshRateSpinBx->setEnabled(false);
ui->mCloudMQTTClientID->setEnabled(false);
mCloudParams.mMQTTBrokerHostName = ui->mCloudMQTTHostNameEdit->text(); mCloudParams.mMQTTBrokerHostName = ui->mCloudMQTTHostNameEdit->text();
mCloudParams.mMQTTBrokerPassword = ui->mCloudMQTTPasswordEdit->text(); mCloudParams.mMQTTBrokerPassword = ui->mCloudMQTTPasswordEdit->text();
mCloudParams.mMQTTBrokerPort = (quint32)ui->mCloudMQTTPortSpinBx->value(); mCloudParams.mMQTTBrokerPort = (quint32)ui->mCloudMQTTPortSpinBx->value();
mCloudParams.mMQTTTopicPrefix = ui->mCloudMQTTTopicPrefixEdit->text(); mCloudParams.mMQTTTopicPrefix = ui->mCloudMQTTTopicPrefixEdit->text();
if(mCloudParams.mMQTTTopicPrefix.endsWith("/") == false)
{
mCloudParams.mMQTTTopicPrefix.append("/");
ui->mCloudMQTTTopicPrefixEdit->setText(mCloudParams.mMQTTTopicPrefix);
}
mCloudParams.mMQTTBrokerUserName = ui->mCloudMQTTUserNameEdit->text(); mCloudParams.mMQTTBrokerUserName = ui->mCloudMQTTUserNameEdit->text();
mCloudParams.mMQTTTransmitTimeout = (quint32)ui->mCloudMQTTRefreshRateSpinBx->value(); mCloudParams.mMQTTTransmitTimeout = (quint32)ui->mCloudMQTTRefreshRateSpinBx->value();
mCloudParams.mMQTTClientID = ui->mCloudMQTTClientID->text();
mProgramHandle->SaveCloudLoggingConfigRequest(&mCloudParams); mProgramHandle->SaveCloudLoggingConfigRequest(&mCloudParams);
@ -92,11 +118,12 @@ void CLoggingSettingsPage::CancelBtnPressed()
ui->mCloudMQTTTopicPrefixEdit->setEnabled(false); ui->mCloudMQTTTopicPrefixEdit->setEnabled(false);
ui->mCloudMQTTUserNameEdit->setEnabled(false); ui->mCloudMQTTUserNameEdit->setEnabled(false);
ui->mCloudMQTTRefreshRateSpinBx->setEnabled(false); ui->mCloudMQTTRefreshRateSpinBx->setEnabled(false);
ui->mCloudMQTTClientID->setEnabled(false);
UpdateConfigPage(); UpdateCloudConfig();
} }
int CLoggingSettingsPage::UpdateConfigPage() int CLoggingSettingsPage::UpdateCloudConfig()
{ {
ui->mCloudMQTTHostNameEdit->setText(mCloudParams.mMQTTBrokerHostName); ui->mCloudMQTTHostNameEdit->setText(mCloudParams.mMQTTBrokerHostName);
ui->mCloudMQTTPasswordEdit->setText(mCloudParams.mMQTTBrokerPassword); ui->mCloudMQTTPasswordEdit->setText(mCloudParams.mMQTTBrokerPassword);
@ -104,6 +131,34 @@ int CLoggingSettingsPage::UpdateConfigPage()
ui->mCloudMQTTTopicPrefixEdit->setText(mCloudParams.mMQTTTopicPrefix); ui->mCloudMQTTTopicPrefixEdit->setText(mCloudParams.mMQTTTopicPrefix);
ui->mCloudMQTTUserNameEdit->setText(mCloudParams.mMQTTBrokerUserName); ui->mCloudMQTTUserNameEdit->setText(mCloudParams.mMQTTBrokerUserName);
ui->mCloudMQTTRefreshRateSpinBx->setValue(mCloudParams.mMQTTTransmitTimeout); ui->mCloudMQTTRefreshRateSpinBx->setValue(mCloudParams.mMQTTTransmitTimeout);
ui->mCloudMQTTClientID->setText(mCloudParams.mMQTTClientID);
return RET_OK; return RET_OK;
} }
int CLoggingSettingsPage::UpdateGeneralParams()
{
disconnect(ui->mLogZoneVerbositySpinBx,QOverload<int>::of(&QSpinBox::valueChanged),this,&CLoggingSettingsPage::VerbosityParamsChanged);
disconnect(ui->mLogFileVerbositySpinBx,QOverload<int>::of(&QSpinBox::valueChanged),this,&CLoggingSettingsPage::VerbosityParamsChanged);
ui->mLogFileVerbositySpinBx->setValue(mGeneralSystemParams.mLogFileVerbosity);
ui->mLogZoneVerbositySpinBx->setValue(mGeneralSystemParams.mLocalLogVerbosity);
connect(ui->mLogZoneVerbositySpinBx,QOverload<int>::of(&QSpinBox::valueChanged),this,&CLoggingSettingsPage::VerbosityParamsChanged);
connect(ui->mLogFileVerbositySpinBx,QOverload<int>::of(&QSpinBox::valueChanged),this,&CLoggingSettingsPage::VerbosityParamsChanged);
return RET_OK;
}
void CLoggingSettingsPage::VerbosityParamsChanged(int value)
{
Q_UNUSED(value)
mGeneralSystemParams.mLocalLogVerbosity = ui->mLogZoneVerbositySpinBx->value();
mGeneralSystemParams.mLogFileVerbosity = ui->mLogFileVerbositySpinBx->value();
mProgramHandle->SaveGeneralParametersSettingsRequest(&mGeneralSystemParams);
qDebug("LogZone: %i, LogFile %i",mGeneralSystemParams.mLocalLogVerbosity,mGeneralSystemParams.mLogFileVerbosity);
}

View File

@ -3,6 +3,7 @@
#include <QWidget> #include <QWidget>
#include "CloudParams.h" #include "CloudParams.h"
#include "GeneralSystemParams.h"
class COtarcikCan; class COtarcikCan;
@ -20,24 +21,28 @@ public:
~CLoggingSettingsPage(); ~CLoggingSettingsPage();
int SetCloudParams(const CCloudParams *CloudParams); int SetCloudParams(const CCloudParams *CloudParams);
int SetGeneralSettingsParams(const CGeneralSystemParams *GeneralParams);
COtarcikCan *mProgramHandle; COtarcikCan *mProgramHandle;
private: private:
int UpdateConfigPage(); int UpdateCloudConfig();
int UpdateGeneralParams();
Ui::CLoggingSettingsPage *ui; Ui::CLoggingSettingsPage *ui;
bool EditMode; bool EditMode;
CCloudParams mCloudParams; CCloudParams mCloudParams;
CGeneralSystemParams mGeneralSystemParams;
public slots: public slots:
void ModifyParamsBtnPressed(); void ModifyParamsBtnPressed();
void CancelBtnPressed(); void CancelBtnPressed();
void VerbosityParamsChanged(int value);
}; };

View File

@ -204,7 +204,7 @@
</rect> </rect>
</property> </property>
</widget> </widget>
<widget class="QLabel" name="mCloudMQTTClientID"> <widget class="QLabel" name="mCloudMQTTClientIDLbl">
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>10</x> <x>10</x>
@ -225,7 +225,7 @@
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property> </property>
</widget> </widget>
<widget class="QLineEdit" name="mCloudMQTTTopicPrefixEdit_2"> <widget class="QLineEdit" name="mCloudMQTTClientID">
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>90</x> <x>90</x>
@ -279,8 +279,8 @@
<widget class="QLabel" name="mGeneralLogParamsLbl"> <widget class="QLabel" name="mGeneralLogParamsLbl">
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>740</x> <x>590</x>
<y>40</y> <y>30</y>
<width>181</width> <width>181</width>
<height>31</height> <height>31</height>
</rect> </rect>
@ -294,19 +294,6 @@
<string>Paramètres généraux</string> <string>Paramètres généraux</string>
</property> </property>
</widget> </widget>
<widget class="QCheckBox" name="mSaveLocalLogFileChkBx">
<property name="geometry">
<rect>
<x>740</x>
<y>80</y>
<width>261</width>
<height>20</height>
</rect>
</property>
<property name="text">
<string>Sauvegarder fichier log local</string>
</property>
</widget>
<widget class="QPushButton" name="mChangeParamsBtn"> <widget class="QPushButton" name="mChangeParamsBtn">
<property name="geometry"> <property name="geometry">
<rect> <rect>
@ -333,6 +320,111 @@
<string>Annuler</string> <string>Annuler</string>
</property> </property>
</widget> </widget>
<widget class="QGroupBox" name="groupBox_2">
<property name="geometry">
<rect>
<x>590</x>
<y>90</y>
<width>351</width>
<height>121</height>
</rect>
</property>
<property name="title">
<string>Logging (3 = très détaillé)</string>
</property>
<widget class="QSpinBox" name="mLogFileVerbositySpinBx">
<property name="geometry">
<rect>
<x>170</x>
<y>30</y>
<width>51</width>
<height>22</height>
</rect>
</property>
<property name="minimum">
<number>0</number>
</property>
<property name="maximum">
<number>3</number>
</property>
</widget>
<widget class="QSpinBox" name="mLogZoneVerbositySpinBx">
<property name="geometry">
<rect>
<x>220</x>
<y>70</y>
<width>43</width>
<height>22</height>
</rect>
</property>
<property name="minimum">
<number>1</number>
</property>
<property name="maximum">
<number>3</number>
</property>
<property name="singleStep">
<number>1</number>
</property>
<property name="value">
<number>1</number>
</property>
</widget>
<widget class="QLabel" name="label">
<property name="geometry">
<rect>
<x>10</x>
<y>30</y>
<width>161</width>
<height>21</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>11</pointsize>
</font>
</property>
<property name="text">
<string>Verbosité du fichier log</string>
</property>
</widget>
<widget class="QLabel" name="label_2">
<property name="geometry">
<rect>
<x>10</x>
<y>70</y>
<width>211</width>
<height>21</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>11</pointsize>
</font>
</property>
<property name="text">
<string>Verbosité de la page de statut</string>
</property>
</widget>
<widget class="QLabel" name="label_3">
<property name="geometry">
<rect>
<x>230</x>
<y>30</y>
<width>81</width>
<height>20</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>10</pointsize>
</font>
</property>
<property name="text">
<string>0 = désactivé</string>
</property>
</widget>
</widget>
</widget> </widget>
<resources/> <resources/>
<connections/> <connections/>

View File

@ -22,6 +22,7 @@ CMainWindow::CMainWindow(QWidget *parent) :
ui(new Ui::CMainWindow) ui(new Ui::CMainWindow)
{ {
ui->setupUi(this); ui->setupUi(this);
QMainWindow::statusBar()->showMessage("V1.00");
mGeneralStatusPage = new CGeneralStatusPage(this); mGeneralStatusPage = new CGeneralStatusPage(this);
mMainWindowWidget = new QTabWidget(this); mMainWindowWidget = new QTabWidget(this);

View File

@ -54,8 +54,9 @@ int COtarcikCan::Start()
CGeneralMessagesLogDispatcher::instance()->BindGuiPageHandle(mMainWindow.mGeneralStatusPage); CGeneralMessagesLogDispatcher::instance()->BindGuiPageHandle(mMainWindow.mGeneralStatusPage);
CGeneralMessagesLogDispatcher::instance()->Init(); CGeneralMessagesLogDispatcher::instance()->Init();
// CGeneralMessagesLogDispatcher::instance()->Init();
CGeneralMessagesLogDispatcher::instance()->AddLogMessage(QString("Démarrage du logiciel OtarcikCAN")); // CGeneralMessagesLogDispatcher::instance()->AddLogMessage(QString("Démarrage du logiciel OtarcikCAN"));
if(mSystemConfig.LoadConfig() == RET_OK) if(mSystemConfig.LoadConfig() == RET_OK)
{ {
@ -66,50 +67,41 @@ int COtarcikCan::Start()
PopulateCANDevicesList(CANDeviceConfigList); PopulateCANDevicesList(CANDeviceConfigList);
} }
mMainWindow.mCANbusSettingsPage->SetDevicesList(&mCANDevicesList); mMainWindow.mCANbusSettingsPage->SetDevicesList(&mCANDevicesList);
mMainWindow.mCANViewerPage->InitCANTable(&mCANDevicesList);
mCloudLoggingParams = *mSystemConfig.GetCloudParams(); mCloudLoggingParams = *mSystemConfig.GetCloudParams();
mMainWindow.mDataLoggingSettingsPage->SetCloudParams(&mCloudLoggingParams); mMainWindow.mDataLoggingSettingsPage->SetCloudParams(&mCloudLoggingParams);
mCANBusMQTTClient.SetMQTTParams(&mCloudLoggingParams); mCANBusMQTTClient.SetMQTTParams(&mCloudLoggingParams);
mCANBusMQTTClient.ConnectToBroker();
mCANBusMQTTClient.SetCANDevicesList(&mCANDevicesList); mCANBusMQTTClient.SetCANDevicesList(&mCANDevicesList);
mGeneralSystemParams = *mSystemConfig.GetGeneralSystemSettings();
mMainWindow.mDataLoggingSettingsPage->SetGeneralSettingsParams(&mGeneralSystemParams);
CGeneralMessagesLogDispatcher::instance()->SetLogVerbosities(mGeneralSystemParams.mLogFileVerbosity,mGeneralSystemParams.mLocalLogVerbosity);
mMainWindow.mCANWatchdogSettingsPage->SetCANWatchdogConfig(mSystemConfig.GetCANWatchdogConfig()); mMainWindow.mCANWatchdogSettingsPage->SetCANWatchdogConfig(mSystemConfig.GetCANWatchdogConfig());
mGPTimer->setSingleShot(false); // mGPTimer->setSingleShot(false);
mGPTimer->start(5000); // mGPTimer->start(5000);
} }
// CCANDevice *NewCANDevice = new CCANDevice();
// mCANDevicesList.append(NewCANDevice);
// NewCANDevice->mProgramPtr = this;
// NewCANDevice->Init("IVT-S_all-variations_12082020.dbc",PCAN_USBBUS1,PCAN_BAUD_500K,"Puck CAN USB branchée sur le module Parker qui contrôle la patente", "Module Parker",1000);
// SaveSystemConfigRequest();
CGeneralMessagesLogDispatcher::instance()->AddLogMessage(QString("Démarrage du logiciel OtarcikCAN"));
mCANBusMQTTClient.ConnectToBroker();
mMainWindow.mCANbusSettingsPage->SetDevicesList(&mCANDevicesList); mMainWindow.mCANbusSettingsPage->SetDevicesList(&mCANDevicesList);
// NewCANDevice = new CCANDevice();
// mCANDevicesList.append(NewCANDevice);
// NewCANDevice->mProgramPtr = this;
// NewCANDevice->Init("mazda_3_2019.dbc",PCAN_USBBUS3,PCAN_BAUD_800K,"Puck CAN USB branchée sur une autre patente", "Module Cossin",200);
return 0; return 0;
} }
int COtarcikCan::UpdateCANViewerDataRequest(QList<CCANMessage *> *MsgList, QString DeviceName) int COtarcikCan::UpdateCANViewerDataRequest(QList<CCANMessage *> *MsgList)
{ {
return mMainWindow.mCANViewerPage->UpdateCANTable(MsgList); return mMainWindow.mCANViewerPage->UpdateCANTable(MsgList);
}
int COtarcikCan::InitCANViewer(QList<CCANMessage *> *MsgList, QString DeviceName)
{
return mMainWindow.mCANViewerPage->InitCANTable(MsgList, DeviceName);
} }
@ -132,8 +124,11 @@ int COtarcikCan::SaveCANDevicesConfigRequest(QList<CCANDeviceConfig *> *DevicesC
{ {
//Config saving is successful. To apply changes we need to reload the devices. //Config saving is successful. To apply changes we need to reload the devices.
//The easiest way is to delete everything and reload. //The easiest way is to delete everything and reload.
mMainWindow.mGeneralStatusPage->ClearCANModuleStatusTable();
PopulateCANDevicesList(DevicesConfigList); PopulateCANDevicesList(DevicesConfigList);
mMainWindow.mCANbusSettingsPage->SetDevicesList(&mCANDevicesList); mMainWindow.mCANbusSettingsPage->SetDevicesList(&mCANDevicesList);
mMainWindow.mCANViewerPage->InitCANTable(&mCANDevicesList);
} }
else else
{ {
@ -158,12 +153,14 @@ int COtarcikCan::PopulateCANDevicesList(QList<CCANDeviceConfig *> *CANDeviceConf
for(int i = 0; i < CANDeviceConfigList->size(); i++) for(int i = 0; i < CANDeviceConfigList->size(); i++)
{ {
CCANDevice *NewDevice = new CCANDevice(*CANDeviceConfigList->at(i),&mCANBusMQTTClient); CCANDevice *NewDevice = new CCANDevice(*CANDeviceConfigList->at(i),&mCANBusMQTTClient,mSystemConfig.mCloudLoggingParams.mMQTTTopicPrefix);
NewDevice->mProgramPtr = this; NewDevice->mProgramPtr = this;
NewDevice->Init(); NewDevice->Init();
mCANDevicesList.append(NewDevice); mCANDevicesList.append(NewDevice);
} }
return RET_OK; return RET_OK;
} }
@ -192,6 +189,23 @@ int COtarcikCan::SaveCloudLoggingConfigRequest(CCloudParams *CloudParams)
return RET_OK; return RET_OK;
} }
int COtarcikCan::SaveGeneralParametersSettingsRequest(CGeneralSystemParams *GeneralParams)
{
mGeneralSystemParams = *GeneralParams;
mSystemConfig.SetGeneralSystemParams(&mGeneralSystemParams);
if(mSystemConfig.SaveConfig() == RET_OK)
{
}
else
{
return RET_GENERAL_ERROR;
}
CGeneralMessagesLogDispatcher::instance()->SetLogVerbosities(mGeneralSystemParams.mLogFileVerbosity,mGeneralSystemParams.mLocalLogVerbosity);
return RET_OK;
}
void COtarcikCan::GPTimerExpired() void COtarcikCan::GPTimerExpired()
{ {
// mCANBusMQTTClient.SendMQTTTestMessage(); // mCANBusMQTTClient.SendMQTTTestMessage();

View File

@ -25,12 +25,13 @@ public:
int Start(); int Start();
int InitCANViewer(QList<CCANMessage *> *MsgList, QString DeviceName); int InitCANViewer(QList<CCANMessage *> *MsgList, CCANDevice *Device);
int UpdateCANViewerDataRequest(QList<CCANMessage *> *MsgList, QString DeviceName); int UpdateCANViewerDataRequest(QList<CCANMessage *> *MsgList, QString DeviceName);
int SaveCANDevicesConfigRequest(QList<CCANDeviceConfig*> *DevicesConfigList); int SaveCANDevicesConfigRequest(QList<CCANDeviceConfig*> *DevicesConfigList);
int SaveCloudLoggingConfigRequest(CCloudParams *CloudParams); int SaveCloudLoggingConfigRequest(CCloudParams *CloudParams);
int SaveGeneralParametersSettingsRequest(CGeneralSystemParams *GeneralParams);
int SetCANConnectionStatusRequest(bool Connected); int SetCANConnectionStatusRequest(bool Connected);
int SetMQTTConnectionSatusRequest(bool Connected); int SetMQTTConnectionSatusRequest(bool Connected);
@ -41,6 +42,7 @@ public:
private: private:
QList<CCANDevice*> mCANDevicesList; QList<CCANDevice*> mCANDevicesList;
CCloudParams mCloudLoggingParams; CCloudParams mCloudLoggingParams;
CGeneralSystemParams mGeneralSystemParams;
int PopulateCANDevicesList(QList<CCANDeviceConfig*> *DevicesConfigsList); int PopulateCANDevicesList(QList<CCANDeviceConfig*> *DevicesConfigsList);

View File

@ -60,7 +60,7 @@ int CPCANInterface::Init(TPCANHandle CANDeviceHandle, TPCANBaudrate CANBaudRate)
char strMsg[256]; char strMsg[256];
CAN_GetErrorText(Result, 0, strMsg); CAN_GetErrorText(Result, 0, strMsg);
qDebug("%s",strMsg); qDebug("%s",strMsg);
CGeneralMessagesLogDispatcher::instance()->AddLogMessage(QString("Impossible d'initialiser un module USB PCAN. Erreur:%1").arg(strMsg),true,CGeneralMessagesLogDispatcher::GEN_MSG_TXT_ERROR_STATUS); CGeneralMessagesLogDispatcher::instance()->AddLogMessage(QString("Impossible d'initialiser un module USB PCAN. Erreur:%1").arg(strMsg),true,1,CGeneralMessagesLogDispatcher::GEN_MSG_TXT_ERROR_STATUS);
CANInterfaceOpened = false; CANInterfaceOpened = false;
return RET_GENERAL_ERROR; return RET_GENERAL_ERROR;
} }
@ -81,7 +81,7 @@ int CPCANInterface::DeInit()
{ {
char strMsg[256]; char strMsg[256];
CAN_GetErrorText(Result, 0, strMsg); CAN_GetErrorText(Result, 0, strMsg);
CGeneralMessagesLogDispatcher::instance()->AddLogMessage(QString("Impossible de déinitialiser un module USB PCAN.. Error:%1").arg(strMsg),true,CGeneralMessagesLogDispatcher::GEN_MSG_TXT_ERROR_STATUS); CGeneralMessagesLogDispatcher::instance()->AddLogMessage(QString("Impossible de déinitialiser un module USB PCAN.. Error:%1").arg(strMsg),true,1,CGeneralMessagesLogDispatcher::GEN_MSG_TXT_ERROR_STATUS);
} }
else else
{ {

View File

@ -1,8 +1,7 @@
#include "SystemConfig.h" #include "SystemConfig.h"
#include "GeneralMessagesLogDispatcher.h" #include "GeneralMessagesLogDispatcher.h"
CSystemConfig::CSystemConfig() : CSystemConfig::CSystemConfig()
mSaveLocalLogFile(false)
{ {
} }
@ -31,13 +30,13 @@ int CSystemConfig::LoadConfig()
if(ConfigFile->open(QIODevice::ReadOnly | QIODevice::Unbuffered) == false) if(ConfigFile->open(QIODevice::ReadOnly | QIODevice::Unbuffered) == false)
{ {
qDebug("CSystemConfig: Failed to open config file in config loading"); qDebug("CSystemConfig: Failed to open config file in config loading");
CGeneralMessagesLogDispatcher::instance()->AddLogMessage(QString("Échec de sauvegarde de la config système. Impossible d'ouvrir le fichier /Config/Station.cfg"),true,CGeneralMessagesLogDispatcher::GEN_MSG_TXT_ERROR_STATUS); CGeneralMessagesLogDispatcher::instance()->AddLogMessage(QString("Échec de sauvegarde de la config système. Impossible d'ouvrir le fichier /Config/Station.cfg"),true,1,CGeneralMessagesLogDispatcher::GEN_MSG_TXT_ERROR_STATUS);
return RET_GENERAL_ERROR; return RET_GENERAL_ERROR;
} }
} }
else else
{ {
CGeneralMessagesLogDispatcher::instance()->AddLogMessage(QString("Échec de sauvegarde de la config système. Pointeur vers QFile invalide !!!"),true,CGeneralMessagesLogDispatcher::GEN_MSG_TXT_ERROR_STATUS); CGeneralMessagesLogDispatcher::instance()->AddLogMessage(QString("Échec de sauvegarde de la config système. Pointeur vers QFile invalide !!!"),true,1,CGeneralMessagesLogDispatcher::GEN_MSG_TXT_ERROR_STATUS);
qDebug("CSystemConfig: Invalid QFile pointer in config loading..."); qDebug("CSystemConfig: Invalid QFile pointer in config loading...");
return RET_GENERAL_ERROR; return RET_GENERAL_ERROR;
} }
@ -71,17 +70,18 @@ int CSystemConfig::LoadConfig()
*InputStream >> mCloudLoggingParams; *InputStream >> mCloudLoggingParams;
//Load general program settings //Load general program settings
*InputStream >> mSaveLocalLogFile; *InputStream >> mGeneralSystemParams;
//Load CAN Watchdog parameters //Load CAN Watchdog parameters
*InputStream >> mCANWatchdogParams; *InputStream >> mCANWatchdogParams;
ConfigFile->close(); ConfigFile->close();
delete ConfigFile; delete ConfigFile;
delete InputStream; delete InputStream;
CGeneralMessagesLogDispatcher::instance()->AddLogMessage(QString("Configuration système chargée avec succès!"),true,CGeneralMessagesLogDispatcher::GEN_MSG_TXT_SUCCESS_STATUS); CGeneralMessagesLogDispatcher::instance()->AddLogMessage(QString("Configuration système chargée avec succès!"),true,1,CGeneralMessagesLogDispatcher::GEN_MSG_TXT_SUCCESS_STATUS);
return RET_OK; return RET_OK;
} }
@ -94,13 +94,13 @@ int CSystemConfig::SaveConfig()
{ {
if(ConfigFile->open(QIODevice::WriteOnly | QIODevice::Unbuffered) == false) if(ConfigFile->open(QIODevice::WriteOnly | QIODevice::Unbuffered) == false)
{ {
CGeneralMessagesLogDispatcher::instance()->AddLogMessage(QString("Échec de sauvegarde de la config système. Impossible d'ouvrir le fichier /Config/Station.cfg"),true,CGeneralMessagesLogDispatcher::GEN_MSG_TXT_ERROR_STATUS); CGeneralMessagesLogDispatcher::instance()->AddLogMessage(QString("Échec de sauvegarde de la config système. Impossible d'ouvrir le fichier /Config/Station.cfg"),true,1,CGeneralMessagesLogDispatcher::GEN_MSG_TXT_ERROR_STATUS);
return RET_GENERAL_ERROR; return RET_GENERAL_ERROR;
} }
} }
else else
{ {
CGeneralMessagesLogDispatcher::instance()->AddLogMessage(QString("Échec de sauvegarde de la config système. Pointeur vers QFile invalide !!!"),true,CGeneralMessagesLogDispatcher::GEN_MSG_TXT_ERROR_STATUS); CGeneralMessagesLogDispatcher::instance()->AddLogMessage(QString("Échec de sauvegarde de la config système. Pointeur vers QFile invalide !!!"),true,1,CGeneralMessagesLogDispatcher::GEN_MSG_TXT_ERROR_STATUS);
return RET_GENERAL_ERROR; return RET_GENERAL_ERROR;
} }
@ -125,7 +125,7 @@ int CSystemConfig::SaveConfig()
*OutputStream << mCloudLoggingParams; *OutputStream << mCloudLoggingParams;
//Save the general system parameters //Save the general system parameters
*OutputStream << mSaveLocalLogFile; *OutputStream << mGeneralSystemParams;
//Save the CAN Watchdog params //Save the CAN Watchdog params
*OutputStream << mCANWatchdogParams; *OutputStream << mCANWatchdogParams;
@ -136,7 +136,7 @@ int CSystemConfig::SaveConfig()
delete ConfigFile; delete ConfigFile;
delete OutputStream; delete OutputStream;
CGeneralMessagesLogDispatcher::instance()->AddLogMessage(QString("Configuration système sauvegardée avec succès."),true,CGeneralMessagesLogDispatcher::GEN_MSG_TXT_SUCCESS_STATUS); CGeneralMessagesLogDispatcher::instance()->AddLogMessage(QString("Configuration système sauvegardée avec succès."),true,3,CGeneralMessagesLogDispatcher::GEN_MSG_TXT_SUCCESS_STATUS);
return RET_OK; return RET_OK;
} }
@ -177,6 +177,12 @@ CCANWatchdogConfig *CSystemConfig::GetCANWatchdogConfig()
return &mCANWatchdogParams; return &mCANWatchdogParams;
} }
CGeneralSystemParams *CSystemConfig::GetGeneralSystemSettings()
{
return &mGeneralSystemParams;
}
int CSystemConfig::SetCANWatchdogConfig(CCANWatchdogConfig *Config) int CSystemConfig::SetCANWatchdogConfig(CCANWatchdogConfig *Config)
{ {
if(Config == 0) if(Config == 0)
@ -193,3 +199,12 @@ int CSystemConfig::SetCloudParams(CCloudParams *CloudParams)
mCloudLoggingParams = *CloudParams; mCloudLoggingParams = *CloudParams;
return RET_OK; return RET_OK;
} }
int CSystemConfig::SetGeneralSystemParams(CGeneralSystemParams *GeneralParams)
{
if(GeneralParams == 0)
return RET_GENERAL_ERROR;
mGeneralSystemParams = *GeneralParams;
return RET_OK;
}

View File

@ -8,6 +8,7 @@
#include "CANDeviceConfig.h" #include "CANDeviceConfig.h"
#include "CloudParams.h" #include "CloudParams.h"
#include "CANWatchdogConfig.h" #include "CANWatchdogConfig.h"
#include "GeneralSystemParams.h"
#define OTARCIK_CURRENT_CONFIG_FILE_VERSION 0x01 #define OTARCIK_CURRENT_CONFIG_FILE_VERSION 0x01
#define OTARCIK_CONFIG_FILE_MAGIC_NBR 0xDEADBEEF #define OTARCIK_CONFIG_FILE_MAGIC_NBR 0xDEADBEEF
@ -28,6 +29,8 @@ public:
CCloudParams *GetCloudParams(); CCloudParams *GetCloudParams();
int SetCloudParams(CCloudParams *CloudParams); int SetCloudParams(CCloudParams *CloudParams);
CGeneralSystemParams *GetGeneralSystemSettings();
int SetGeneralSystemParams(CGeneralSystemParams *GeneralParams);
@ -39,13 +42,15 @@ public:
CCloudParams mCloudLoggingParams; CCloudParams mCloudLoggingParams;
//Misc general system settings //Misc general system settings
bool mSaveLocalLogFile; CGeneralSystemParams mGeneralSystemParams;
//CAN Module watchdog settings //CAN Module watchdog settings
CCANWatchdogConfig mCANWatchdogParams; CCANWatchdogConfig mCANWatchdogParams;
CCANWatchdogConfig *GetCANWatchdogConfig(); CCANWatchdogConfig *GetCANWatchdogConfig();
int SetCANWatchdogConfig(CCANWatchdogConfig *Config); int SetCANWatchdogConfig(CCANWatchdogConfig *Config);
}; };

View File

@ -5,6 +5,9 @@
#define GENERAL_MESSAGES_MAX_LOG_LINES 5000 //The number of lines of general status log we keep in the general status window (avoids fucking up because you know.... RAM) #define GENERAL_MESSAGES_MAX_LOG_LINES 5000 //The number of lines of general status log we keep in the general status window (avoids fucking up because you know.... RAM)
#define MQTT_CLIENT_RECONNECT_TIMEOUT 5000 //Time in ms between reconnect attemps to MQTT broker when connection is lost #define MQTT_CLIENT_RECONNECT_TIMEOUT 5000 //Time in ms between reconnect attemps to MQTT broker when connection is lost
//#define USE_TOPIC_PREFIX
enum eOtarcikGeneralReturns enum eOtarcikGeneralReturns
{ {
RET_OK = 0, RET_OK = 0,

Binary file not shown.

View File

@ -21,6 +21,7 @@ debug/MQTTClientWrapper.o
debug/CCANWatchdogSettingsPage.o debug/CCANWatchdogSettingsPage.o
debug/CANWatchdogConfig.o debug/CANWatchdogConfig.o
debug/CANWatchdog.o debug/CANWatchdog.o
debug/GeneralSystemParams.o
debug/moc_MainWindow.o debug/moc_MainWindow.o
debug/moc_PCANInterface.o debug/moc_PCANInterface.o
debug/moc_OtarcikCan.o debug/moc_OtarcikCan.o

View File

@ -21,6 +21,7 @@ release/MQTTClientWrapper.o
release/CCANWatchdogSettingsPage.o release/CCANWatchdogSettingsPage.o
release/CANWatchdogConfig.o release/CANWatchdogConfig.o
release/CANWatchdog.o release/CANWatchdog.o
release/GeneralSystemParams.o
release/moc_MainWindow.o release/moc_MainWindow.o
release/moc_PCANInterface.o release/moc_PCANInterface.o
release/moc_OtarcikCan.o release/moc_OtarcikCan.o

Binary file not shown.

View File

@ -11,7 +11,6 @@
#include <QtCore/QVariant> #include <QtCore/QVariant>
#include <QtWidgets/QApplication> #include <QtWidgets/QApplication>
#include <QtWidgets/QCheckBox>
#include <QtWidgets/QGroupBox> #include <QtWidgets/QGroupBox>
#include <QtWidgets/QLabel> #include <QtWidgets/QLabel>
#include <QtWidgets/QLineEdit> #include <QtWidgets/QLineEdit>
@ -36,14 +35,19 @@ public:
QLineEdit *mCloudMQTTPasswordEdit; QLineEdit *mCloudMQTTPasswordEdit;
QLabel *mCloudMQTTTopicPrefixLbl; QLabel *mCloudMQTTTopicPrefixLbl;
QLineEdit *mCloudMQTTTopicPrefixEdit; QLineEdit *mCloudMQTTTopicPrefixEdit;
QLabel *mCloudMQTTClientID; QLabel *mCloudMQTTClientIDLbl;
QLineEdit *mCloudMQTTTopicPrefixEdit_2; QLineEdit *mCloudMQTTClientID;
QLabel *mCloudMQTTRefreshRateLbl; QLabel *mCloudMQTTRefreshRateLbl;
QSpinBox *mCloudMQTTRefreshRateSpinBx; QSpinBox *mCloudMQTTRefreshRateSpinBx;
QLabel *mGeneralLogParamsLbl; QLabel *mGeneralLogParamsLbl;
QCheckBox *mSaveLocalLogFileChkBx;
QPushButton *mChangeParamsBtn; QPushButton *mChangeParamsBtn;
QPushButton *mCancelBtn; QPushButton *mCancelBtn;
QGroupBox *groupBox_2;
QSpinBox *mLogFileVerbositySpinBx;
QSpinBox *mLogZoneVerbositySpinBx;
QLabel *label;
QLabel *label_2;
QLabel *label_3;
void setupUi(QWidget *CLoggingSettingsPage) void setupUi(QWidget *CLoggingSettingsPage)
{ {
@ -103,14 +107,14 @@ public:
mCloudMQTTTopicPrefixEdit = new QLineEdit(groupBox); mCloudMQTTTopicPrefixEdit = new QLineEdit(groupBox);
mCloudMQTTTopicPrefixEdit->setObjectName(QString::fromUtf8("mCloudMQTTTopicPrefixEdit")); mCloudMQTTTopicPrefixEdit->setObjectName(QString::fromUtf8("mCloudMQTTTopicPrefixEdit"));
mCloudMQTTTopicPrefixEdit->setGeometry(QRect(90, 160, 321, 20)); mCloudMQTTTopicPrefixEdit->setGeometry(QRect(90, 160, 321, 20));
mCloudMQTTClientID = new QLabel(groupBox); mCloudMQTTClientIDLbl = new QLabel(groupBox);
mCloudMQTTClientIDLbl->setObjectName(QString::fromUtf8("mCloudMQTTClientIDLbl"));
mCloudMQTTClientIDLbl->setGeometry(QRect(10, 190, 71, 20));
mCloudMQTTClientIDLbl->setFont(font1);
mCloudMQTTClientIDLbl->setAlignment(Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter);
mCloudMQTTClientID = new QLineEdit(groupBox);
mCloudMQTTClientID->setObjectName(QString::fromUtf8("mCloudMQTTClientID")); mCloudMQTTClientID->setObjectName(QString::fromUtf8("mCloudMQTTClientID"));
mCloudMQTTClientID->setGeometry(QRect(10, 190, 71, 20)); mCloudMQTTClientID->setGeometry(QRect(90, 190, 321, 20));
mCloudMQTTClientID->setFont(font1);
mCloudMQTTClientID->setAlignment(Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter);
mCloudMQTTTopicPrefixEdit_2 = new QLineEdit(groupBox);
mCloudMQTTTopicPrefixEdit_2->setObjectName(QString::fromUtf8("mCloudMQTTTopicPrefixEdit_2"));
mCloudMQTTTopicPrefixEdit_2->setGeometry(QRect(90, 190, 321, 20));
mCloudMQTTRefreshRateLbl = new QLabel(groupBox); mCloudMQTTRefreshRateLbl = new QLabel(groupBox);
mCloudMQTTRefreshRateLbl->setObjectName(QString::fromUtf8("mCloudMQTTRefreshRateLbl")); mCloudMQTTRefreshRateLbl->setObjectName(QString::fromUtf8("mCloudMQTTRefreshRateLbl"));
mCloudMQTTRefreshRateLbl->setGeometry(QRect(10, 220, 181, 20)); mCloudMQTTRefreshRateLbl->setGeometry(QRect(10, 220, 181, 20));
@ -124,17 +128,43 @@ public:
mCloudMQTTRefreshRateSpinBx->setSingleStep(1); mCloudMQTTRefreshRateSpinBx->setSingleStep(1);
mGeneralLogParamsLbl = new QLabel(CLoggingSettingsPage); mGeneralLogParamsLbl = new QLabel(CLoggingSettingsPage);
mGeneralLogParamsLbl->setObjectName(QString::fromUtf8("mGeneralLogParamsLbl")); mGeneralLogParamsLbl->setObjectName(QString::fromUtf8("mGeneralLogParamsLbl"));
mGeneralLogParamsLbl->setGeometry(QRect(740, 40, 181, 31)); mGeneralLogParamsLbl->setGeometry(QRect(590, 30, 181, 31));
mGeneralLogParamsLbl->setFont(font); mGeneralLogParamsLbl->setFont(font);
mSaveLocalLogFileChkBx = new QCheckBox(CLoggingSettingsPage);
mSaveLocalLogFileChkBx->setObjectName(QString::fromUtf8("mSaveLocalLogFileChkBx"));
mSaveLocalLogFileChkBx->setGeometry(QRect(740, 80, 261, 20));
mChangeParamsBtn = new QPushButton(CLoggingSettingsPage); mChangeParamsBtn = new QPushButton(CLoggingSettingsPage);
mChangeParamsBtn->setObjectName(QString::fromUtf8("mChangeParamsBtn")); mChangeParamsBtn->setObjectName(QString::fromUtf8("mChangeParamsBtn"));
mChangeParamsBtn->setGeometry(QRect(370, 340, 80, 22)); mChangeParamsBtn->setGeometry(QRect(370, 340, 80, 22));
mCancelBtn = new QPushButton(CLoggingSettingsPage); mCancelBtn = new QPushButton(CLoggingSettingsPage);
mCancelBtn->setObjectName(QString::fromUtf8("mCancelBtn")); mCancelBtn->setObjectName(QString::fromUtf8("mCancelBtn"));
mCancelBtn->setGeometry(QRect(260, 340, 80, 22)); mCancelBtn->setGeometry(QRect(260, 340, 80, 22));
groupBox_2 = new QGroupBox(CLoggingSettingsPage);
groupBox_2->setObjectName(QString::fromUtf8("groupBox_2"));
groupBox_2->setGeometry(QRect(590, 90, 351, 121));
mLogFileVerbositySpinBx = new QSpinBox(groupBox_2);
mLogFileVerbositySpinBx->setObjectName(QString::fromUtf8("mLogFileVerbositySpinBx"));
mLogFileVerbositySpinBx->setGeometry(QRect(170, 30, 51, 22));
mLogFileVerbositySpinBx->setMinimum(0);
mLogFileVerbositySpinBx->setMaximum(3);
mLogZoneVerbositySpinBx = new QSpinBox(groupBox_2);
mLogZoneVerbositySpinBx->setObjectName(QString::fromUtf8("mLogZoneVerbositySpinBx"));
mLogZoneVerbositySpinBx->setGeometry(QRect(220, 70, 43, 22));
mLogZoneVerbositySpinBx->setMinimum(1);
mLogZoneVerbositySpinBx->setMaximum(3);
mLogZoneVerbositySpinBx->setSingleStep(1);
mLogZoneVerbositySpinBx->setValue(1);
label = new QLabel(groupBox_2);
label->setObjectName(QString::fromUtf8("label"));
label->setGeometry(QRect(10, 30, 161, 21));
QFont font2;
font2.setPointSize(11);
label->setFont(font2);
label_2 = new QLabel(groupBox_2);
label_2->setObjectName(QString::fromUtf8("label_2"));
label_2->setGeometry(QRect(10, 70, 211, 21));
label_2->setFont(font2);
label_3 = new QLabel(groupBox_2);
label_3->setObjectName(QString::fromUtf8("label_3"));
label_3->setGeometry(QRect(230, 30, 81, 20));
label_3->setFont(font1);
retranslateUi(CLoggingSettingsPage); retranslateUi(CLoggingSettingsPage);
@ -151,12 +181,15 @@ public:
mCloudMQTTUsernameLbl->setText(QCoreApplication::translate("CLoggingSettingsPage", "Username", nullptr)); mCloudMQTTUsernameLbl->setText(QCoreApplication::translate("CLoggingSettingsPage", "Username", nullptr));
mCloudMQTTPasswordLbl->setText(QCoreApplication::translate("CLoggingSettingsPage", "Password", nullptr)); mCloudMQTTPasswordLbl->setText(QCoreApplication::translate("CLoggingSettingsPage", "Password", nullptr));
mCloudMQTTTopicPrefixLbl->setText(QCoreApplication::translate("CLoggingSettingsPage", "Topic Prefix", nullptr)); mCloudMQTTTopicPrefixLbl->setText(QCoreApplication::translate("CLoggingSettingsPage", "Topic Prefix", nullptr));
mCloudMQTTClientID->setText(QCoreApplication::translate("CLoggingSettingsPage", "Client ID", nullptr)); mCloudMQTTClientIDLbl->setText(QCoreApplication::translate("CLoggingSettingsPage", "Client ID", nullptr));
mCloudMQTTRefreshRateLbl->setText(QCoreApplication::translate("CLoggingSettingsPage", "Taux de rafraichissement (ms):", nullptr)); mCloudMQTTRefreshRateLbl->setText(QCoreApplication::translate("CLoggingSettingsPage", "Taux de rafraichissement (ms):", nullptr));
mGeneralLogParamsLbl->setText(QCoreApplication::translate("CLoggingSettingsPage", "Param\303\250tres g\303\251n\303\251raux", nullptr)); mGeneralLogParamsLbl->setText(QCoreApplication::translate("CLoggingSettingsPage", "Param\303\250tres g\303\251n\303\251raux", nullptr));
mSaveLocalLogFileChkBx->setText(QCoreApplication::translate("CLoggingSettingsPage", "Sauvegarder fichier log local", nullptr));
mChangeParamsBtn->setText(QCoreApplication::translate("CLoggingSettingsPage", "Modifier", nullptr)); mChangeParamsBtn->setText(QCoreApplication::translate("CLoggingSettingsPage", "Modifier", nullptr));
mCancelBtn->setText(QCoreApplication::translate("CLoggingSettingsPage", "Annuler", nullptr)); mCancelBtn->setText(QCoreApplication::translate("CLoggingSettingsPage", "Annuler", nullptr));
groupBox_2->setTitle(QCoreApplication::translate("CLoggingSettingsPage", "Logging (3 = tr\303\250s d\303\251taill\303\251)", nullptr));
label->setText(QCoreApplication::translate("CLoggingSettingsPage", "Verbosit\303\251 du fichier log", nullptr));
label_2->setText(QCoreApplication::translate("CLoggingSettingsPage", "Verbosit\303\251 de la page de statut", nullptr));
label_3->setText(QCoreApplication::translate("CLoggingSettingsPage", "0 = d\303\251sactiv\303\251", nullptr));
} // retranslateUi } // retranslateUi
}; };

View File

@ -5,4 +5,7 @@ Router Ubiquiti: user:yultek pwd:Evinrude30
Windows PC Axiomtek: user yultek pwd:Otarcik! Windows PC Axiomtek: user yultek pwd:Otarcik!
Pet name: otarcik Pet name: otarcik
City born: Chambly City born: Chambly
childhood nickname : otarcik childhood nickname : otarcik
EMQX
Login: YULTekDev pwd: PaceST25!
Login: JFMDev pwd:PaceST25!

View File

@ -5,7 +5,7 @@ x Ajouter la taille du quue du module CAN dans l'onglet statut
- Ajouter timeout de comm avec la puck CAN - Ajouter timeout de comm avec la puck CAN
- Corriger le bug de sélection du data quand il y a plus qu'une puck - Corriger le bug de sélection du data quand il y a plus qu'une puck
x Implémenter une liste de messages MQTT non envoyés pour ne pas perdre de messages provenant du CAN x Implémenter une liste de messages MQTT non envoyés pour ne pas perdre de messages provenant du CAN
- Ajouter la gestion du Client ID MQTT x Ajouter la gestion du Client ID MQTT
- Implémenter le watchdog CAN - Implémenter le watchdog CAN
- Valider pourquoi le MQTT ne se connecte pas au reboot - Valider pourquoi le MQTT ne se connecte pas au reboot
x Valider pourquoi le MQTT ne se reconnecte pas après une déconnexion x Valider pourquoi le MQTT ne se reconnecte pas après une déconnexion
@ -14,3 +14,4 @@ x Valider pourquoi le MQTT ne se reconnecte pas après une déconnexion
- Ajouter un affichage des payloads JSON - Ajouter un affichage des payloads JSON
- Contrôler le niveau de log - Contrôler le niveau de log
- Assurer de ne pas avoir à redémarrer le soft quand on change un paramètre CAN (CAN data repopulate) - Assurer de ne pas avoir à redémarrer le soft quand on change un paramètre CAN (CAN data repopulate)
- Implémenter le CAN Watchdog