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/Gui/CCANWatchdogSettingsPage.cpp \
Sources/CANBus/CANWatchdogConfig.cpp \
Sources/CANBus/CANWatchdog.cpp
Sources/CANBus/CANWatchdog.cpp \
Sources/GeneralSystemParams.cpp
HEADERS += Sources/MainWindow.h \
Sources/PCANInterface.h \
@ -80,7 +81,8 @@ HEADERS += Sources/MainWindow.h \
Sources/CloudLogging/MQTTClientWrapper.h \
Sources/Gui/CCANWatchdogSettingsPage.h \
Sources/CANBus/CANWatchdogConfig.h \
Sources/CANBus/CANWatchdog.h
Sources/CANBus/CANWatchdog.h \
Sources/GeneralSystemParams.h
FORMS += Sources/Gui/MainWindow.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)
{
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;
return RET_GENERAL_ERROR;
}
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;
return RET_GENERAL_ERROR;
}

View File

@ -19,7 +19,7 @@ CCANDevice::CCANDevice(QObject *parent)
// mDevicePollPeriod = 0;
}
CCANDevice::CCANDevice(CCANDeviceConfig &SysConfig, CMQTTClientWrapper *MQTTClient)
CCANDevice::CCANDevice(CCANDeviceConfig &SysConfig, CMQTTClientWrapper *MQTTClient, QString DeviceTopicPrefix)
{
mMessageList.clear();
mMessagesListLoaded = false;
@ -28,6 +28,7 @@ CCANDevice::CCANDevice(CCANDeviceConfig &SysConfig, CMQTTClientWrapper *MQTTClie
mDeviceConfigInfo = SysConfig;
mCANMQTTClient = MQTTClient;
mDeviceTopicPrefix = DeviceTopicPrefix;
// mCANDeviceID = SysConfig.mCANDeviceID;
// mCANDeviceBaudrate = SysConfig.mCANDeviceBaudrate;
@ -60,7 +61,7 @@ int CCANDevice::Init()
if(mCANDatabase.BuildMessageList(&mMessageList,mDeviceConfigInfo.mDeviceName) == RET_OK)
{
mMessagesListLoaded = true;
mProgramPtr->InitCANViewer(&mMessageList,mDeviceConfigInfo.mDeviceName);
mProgramPtr->InitCANViewer(&mMessageList,this);
}
else
{
@ -70,18 +71,22 @@ int CCANDevice::Init()
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->UpdateCANModuleStatusRequest(mDeviceConfigInfo.mDeviceName,"Déconnecté","NOUPDATE");
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));
#endif
mCANDataLogger.SetMQTTClient(mCANMQTTClient);
mProgramPtr->SetCANConnectionStatusRequest(true);
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;
}

View File

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

View File

@ -33,7 +33,7 @@ int CCANDatabase::LoadDatabaseFile(QString Filename)
status = kvaDbOpen(&mDatabaseDriverHandle);
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);
return RET_GENERAL_ERROR;
}
@ -44,7 +44,7 @@ int CCANDatabase::LoadDatabaseFile(QString Filename)
status = kvaDbReadFile(mDatabaseDriverHandle, Filename.toLocal8Bit().data());
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);
return RET_GENERAL_ERROR;
}
@ -52,11 +52,11 @@ int CCANDatabase::LoadDatabaseFile(QString Filename)
status = kvaDbGetFlags(mDatabaseDriverHandle, &flags);
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);
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);
mDatabaseFileLoaded = true;
@ -85,7 +85,7 @@ int CCANDatabase::BuildMessageList(QList<CCANMessage *> *MsgListPtr, QString Own
status = kvaDbGetFirstMsg (mDatabaseDriverHandle, &mh);
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);
return RET_GENERAL_ERROR;
}

View File

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

View File

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

View File

@ -23,7 +23,7 @@ CMQTTClientWrapper::~CMQTTClientWrapper()
int CMQTTClientWrapper::SetMQTTParams(CCloudParams *Params)
{
mMQTTParams = *Params;
mMQTTClientID = "Otarcik_Station_Ville_Emard";
// mMQTTClientID = "Otarcik_Station_Ville_Emard";
return RET_OK;
}
@ -32,7 +32,7 @@ int CMQTTClientWrapper::ConnectToBroker()
{
//Setup the client before connecting.
mMQTTClient.setAutoKeepAlive(true);
mMQTTClient.setClientId(mMQTTClientID);
mMQTTClient.setClientId(mMQTTParams.mMQTTClientID);
mMQTTClient.setHostname(mMQTTParams.mMQTTBrokerHostName);
mMQTTClient.setPort(mMQTTParams.mMQTTBrokerPort);
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);
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);
CGeneralMessagesLogDispatcher::instance()->AddLogMessage(LogMsg,false);
CGeneralMessagesLogDispatcher::instance()->AddLogMessage(LogMsg,true,3);
}
qDebug("Sent %d MQTT messages",MessagesList->size());

View File

@ -27,7 +27,7 @@ public:
int SetCANDevicesList(QList<CCANDevice*> *List);
COtarcikCan *mProgramPtr;
QString mMQTTClientID;
// QString mMQTTClientID;
QTimer *mMQTTRefreshTimer;
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("********************************************************************\n").toUtf8());
}
mLogFileVerbosity = 3;
mGuiLogVerbosity = 3;
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...
@ -86,31 +90,37 @@ int CGeneralMessagesLogDispatcher::AddLogMessage(QString LogLine, bool AddToGUIL
}
mSystemLogFile->write(LogLine.toUtf8());
if(AddToGUILogPanel == true)
if(MsgVerbosity <= mLogFileVerbosity)
{
if(TxtErrStatus == GEN_MSG_TXT_ERROR_STATUS)
{
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");
}
mSystemLogFile->write(LogLine.toUtf8());
}
if(mGeneralStatusPageHandle != 0)
if(MsgVerbosity <= mGuiLogVerbosity)
{
if(AddToGUILogPanel == true)
{
mGeneralStatusPageHandle->AddGeneralMsgBoxLineEntry(LogLine);
}
else
{
qDebug("Someone forgot to assing their pointers in CGeneralMessagesLogDispatch::AddLogMessage!! This needs to be fixed");
return RET_GENERAL_ERROR;
if(TxtErrStatus == GEN_MSG_TXT_ERROR_STATUS)
{
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)
{
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;
}
int CGeneralMessagesLogDispatcher::SetLogVerbosities(int LogFileVerbosity, int GuiLogVerbosity)
{
mGuiLogVerbosity = GuiLogVerbosity;
mLogFileVerbosity = LogFileVerbosity;
return RET_OK;
}

View File

@ -30,14 +30,17 @@ public:
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;
int BindGuiPageHandle(CGeneralStatusPage *Handle);
int Init();
int SetLogVerbosities(int LogFileVerbosity, int GuiLogVerbosity);
private:
QStringList mGeneralMsgGUILog;
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 "ui_CANViewerPage.h"
#include "defines.h"
#include "CANDevice.h"
#include "MQTTMessage.h"
#include <QClipboard>
CCANViewerPage::CCANViewerPage(QWidget *parent) :
QWidget(parent),
@ -21,10 +24,8 @@ CCANViewerPage::CCANViewerPage(QWidget *parent) :
ui->mCANSignalTableWidget->setColumnCount(4);
ui->mCANSignalTableWidget->setHorizontalHeaderLabels(QStringList() << "Nom du signal" << "Val. physique" << "Val. brute" << "Unités");
connect(ui->mCANDataTableWidget,&QTableWidget::itemSelectionChanged,this,&CCANViewerPage::MessageSelectionChanged);
connect(ui->mCopyJSonToClipboardBtn,&QPushButton::pressed,this,&CCANViewerPage::CopyJSONToClipboardButtonPressed);
}
CCANViewerPage::~CCANViewerPage()
@ -32,60 +33,54 @@ CCANViewerPage::~CCANViewerPage()
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;
}
mMsgList.append(MsgList);
ResetPage();
int row = ui->mCANDataTableWidget->rowCount();
ui->mCANDataTableWidget->setRowCount(MsgList->size() + row);
for(int Msg = 0; Msg < MsgList->size(); Msg++)
mCANDevicesList = CANDevicesList;
for(int Dev = 0; Dev < mCANDevicesList->size(); Dev++)
{
QTableWidgetItem *NewItem;
QList<CCANMessage *> *MsgList = mCANDevicesList->at(Dev)->GetCANMessagesList();
NewItem = new QTableWidgetItem(DeviceName);
ui->mCANDataTableWidget->setItem(row,0,NewItem);
int row = ui->mCANDataTableWidget->rowCount();
ui->mCANDataTableWidget->setRowCount(MsgList->size() + row);
for(int Msg = 0; Msg < MsgList->size(); Msg++)
{
QTableWidgetItem *NewItem;
//Set Msg name
NewItem = new QTableWidgetItem(QString("%1").arg(MsgList->at(Msg)->mCANMsgName));
ui->mCANDataTableWidget->setItem(row,1,NewItem);
NewItem = new QTableWidgetItem(mCANDevicesList->at(Dev)->mDeviceConfigInfo.mDeviceName);
ui->mCANDataTableWidget->setItem(row,0,NewItem);
//Set message ID value
NewItem = new QTableWidgetItem(QString("0x%1").arg(MsgList->at(Msg)->mCANMsgID,0,16));
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 Msg name
NewItem = new QTableWidgetItem(QString("%1").arg(MsgList->at(Msg)->mCANMsgName));
ui->mCANDataTableWidget->setItem(row,1,NewItem);
//Set message type value
NewItem = new QTableWidgetItem(QString("0x%1").arg(MsgList->at(Msg)->mCANMsgType,0,16));
ui->mCANDataTableWidget->setItem(row,3,NewItem);
//Set message ID value
NewItem = new QTableWidgetItem(QString("0x%1").arg(MsgList->at(Msg)->mCANMsgID,0,16));
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
NewItem = new QTableWidgetItem(QString(" "));
ui->mCANDataTableWidget->setItem(row,4,NewItem);
//Set message type value
NewItem = new QTableWidgetItem(QString("0x%1").arg(MsgList->at(Msg)->mCANMsgType,0,16));
ui->mCANDataTableWidget->setItem(row,3,NewItem);
NewItem = new QTableWidgetItem(QString(" "));
ui->mCANDataTableWidget->setItem(row,5,NewItem);
//Set message length value
NewItem = new QTableWidgetItem(QString(" "));
ui->mCANDataTableWidget->setItem(row,4,NewItem);
row++;
NewItem = new QTableWidgetItem(QString(" "));
ui->mCANDataTableWidget->setItem(row,5,NewItem);
// //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);
row++;
}
}
// ui->mCANSignalTableWidget->setCurrentItem(ui->mCANDataTableWidget->item(0,0));
// MessageSelectionChanged();
return RET_OK;
}
@ -124,75 +119,94 @@ int CCANViewerPage::UpdateCANTable(QList<CCANMessage *> *MsgList)
void CCANViewerPage::MessageSelectionChanged()
{
// if(mMsgList == 0)
// {
// return;
// }
if(mMsgList.isEmpty())
if(mCANDevicesList->isEmpty())
{
return;
}
ui->mCANSignalTableWidget->clearContents();
//Find message based on current table selection
int row = ui->mCANDataTableWidget->currentRow();
if(row == -1)
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();
QString Device = ui->mCANDataTableWidget->item(row,0)->text();
if(Device == mMsgList.at(MsgList)->at(msg)->mOwnerDeviceName &&
ID == mMsgList.at(MsgList)->at(msg)->mCANMsgID)
QList<CCANMessage *> *MsgList = mCANDevicesList->at(Dev)->GetCANMessagesList();
for (int msg = 0; msg < MsgList->size(); msg++)
{
CCANMessage *Msg = mMsgList.at(MsgList)->at(msg);
ui->mCANSignalTableWidget->clearContents();
ui->mCANSignalTableWidget->setRowCount(Msg->mSignalsList.size());
unsigned int ID = ui->mCANDataTableWidget->item(row,2)->data(Qt::UserRole).toUInt();
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
QTableWidgetItem *NewItem = new QTableWidgetItem(Msg->mSignalsList.at(signal).mSignalName);
ui->mCANSignalTableWidget->setItem(signal,0,NewItem);
CCANMessage *Msg = MsgList->at(msg);
ui->mCANSignalTableWidget->clearContents();
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
NewItem = new QTableWidgetItem(QString("%1").arg(Msg->mSignalsList.at(signal).mPhysicalValue,0,'f',1));
//Phys value
#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)
{
/*
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));
}
else if(Msg->mSignalsList.at(signal).mValueType == CCANSignal::CAN_SIGNAL_TYPE_32_BIT_FLOAT ||
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));
}
#endif
ui->mCANSignalTableWidget->setItem(signal,1,NewItem);
NewItem = new QTableWidgetItem(QString("%1").arg((qint64)Msg->mSignalsList.at(signal).mPhysicalValue));
}
else if(Msg->mSignalsList.at(signal).mValueType == CCANSignal::CAN_SIGNAL_TYPE_32_BIT_FLOAT ||
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
NewItem = new QTableWidgetItem(QString("0x%1").arg(Msg->mSignalsList.at(signal).mRawValue,0,16));
ui->mCANSignalTableWidget->setItem(signal,2,NewItem);
//Raw value
NewItem = new QTableWidgetItem(QString("0x%1").arg(Msg->mSignalsList.at(signal).mRawValue,0,16));
ui->mCANSignalTableWidget->setItem(signal,2,NewItem);
//Units
NewItem = new QTableWidgetItem(Msg->mSignalsList.at(signal).mSignalUnit);
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()
@ -245,3 +259,10 @@ int CCANViewerPage::UpdateSignalsTable()
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 <QList>
class CCANDevice;
namespace Ui {
class CCANViewerPage;
}
class CCANViewerInfoStructure
{
public:
QList<CCANMessage *> *mMsgList;
CCANDevice *mCANDevice;
};
class CCANViewerPage : public QWidget
{
Q_OBJECT
@ -19,17 +29,21 @@ public:
int UpdateCANTable(QList<CCANMessage*> *MsgList);
int InitCANTable(QList<CCANMessage*> *MsgList, QString DeviceName);
int InitCANTable(QList<CCANDevice*> *CANDevicesList);
int UpdateSignalsTable();
int ResetPage();
QList<QList<CCANMessage *>*> mMsgList;
QList<CCANViewerInfoStructure> mCANDataStructureList;
QList<CCANDevice*> *mCANDevicesList;
public slots:
void MessageSelectionChanged();
void CopyJSONToClipboardButtonPressed();
private:
Ui::CCANViewerPage *ui;
};
#endif // CANVIEWERPAGE_H

View File

@ -18,11 +18,15 @@ CLoggingSettingsPage::CLoggingSettingsPage(QWidget *parent) :
ui->mCloudMQTTTopicPrefixEdit->setEnabled(false);
ui->mCloudMQTTUserNameEdit->setEnabled(false);
ui->mCloudMQTTRefreshRateSpinBx->setEnabled(false);
ui->mCloudMQTTClientID->setEnabled(false);
connect(ui->mCancelBtn,&QPushButton::clicked,this,&CLoggingSettingsPage::CancelBtnPressed);
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()
@ -39,7 +43,21 @@ int CLoggingSettingsPage::SetCloudParams(const CCloudParams *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;
}
@ -55,6 +73,7 @@ void CLoggingSettingsPage::ModifyParamsBtnPressed()
ui->mCloudMQTTTopicPrefixEdit->setEnabled(true);
ui->mCloudMQTTUserNameEdit->setEnabled(true);
ui->mCloudMQTTRefreshRateSpinBx->setEnabled(true);
ui->mCloudMQTTClientID->setEnabled(true);
ui->mChangeParamsBtn->setText("Appliquer");
}
else
@ -68,14 +87,21 @@ void CLoggingSettingsPage::ModifyParamsBtnPressed()
ui->mCloudMQTTTopicPrefixEdit->setEnabled(false);
ui->mCloudMQTTUserNameEdit->setEnabled(false);
ui->mCloudMQTTRefreshRateSpinBx->setEnabled(false);
ui->mCloudMQTTClientID->setEnabled(false);
mCloudParams.mMQTTBrokerHostName = ui->mCloudMQTTHostNameEdit->text();
mCloudParams.mMQTTBrokerPassword = ui->mCloudMQTTPasswordEdit->text();
mCloudParams.mMQTTBrokerPort = (quint32)ui->mCloudMQTTPortSpinBx->value();
mCloudParams.mMQTTTopicPrefix = ui->mCloudMQTTTopicPrefixEdit->text();
if(mCloudParams.mMQTTTopicPrefix.endsWith("/") == false)
{
mCloudParams.mMQTTTopicPrefix.append("/");
ui->mCloudMQTTTopicPrefixEdit->setText(mCloudParams.mMQTTTopicPrefix);
}
mCloudParams.mMQTTBrokerUserName = ui->mCloudMQTTUserNameEdit->text();
mCloudParams.mMQTTTransmitTimeout = (quint32)ui->mCloudMQTTRefreshRateSpinBx->value();
mCloudParams.mMQTTClientID = ui->mCloudMQTTClientID->text();
mProgramHandle->SaveCloudLoggingConfigRequest(&mCloudParams);
@ -92,11 +118,12 @@ void CLoggingSettingsPage::CancelBtnPressed()
ui->mCloudMQTTTopicPrefixEdit->setEnabled(false);
ui->mCloudMQTTUserNameEdit->setEnabled(false);
ui->mCloudMQTTRefreshRateSpinBx->setEnabled(false);
ui->mCloudMQTTClientID->setEnabled(false);
UpdateConfigPage();
UpdateCloudConfig();
}
int CLoggingSettingsPage::UpdateConfigPage()
int CLoggingSettingsPage::UpdateCloudConfig()
{
ui->mCloudMQTTHostNameEdit->setText(mCloudParams.mMQTTBrokerHostName);
ui->mCloudMQTTPasswordEdit->setText(mCloudParams.mMQTTBrokerPassword);
@ -104,6 +131,34 @@ int CLoggingSettingsPage::UpdateConfigPage()
ui->mCloudMQTTTopicPrefixEdit->setText(mCloudParams.mMQTTTopicPrefix);
ui->mCloudMQTTUserNameEdit->setText(mCloudParams.mMQTTBrokerUserName);
ui->mCloudMQTTRefreshRateSpinBx->setValue(mCloudParams.mMQTTTransmitTimeout);
ui->mCloudMQTTClientID->setText(mCloudParams.mMQTTClientID);
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 "CloudParams.h"
#include "GeneralSystemParams.h"
class COtarcikCan;
@ -20,24 +21,28 @@ public:
~CLoggingSettingsPage();
int SetCloudParams(const CCloudParams *CloudParams);
int SetGeneralSettingsParams(const CGeneralSystemParams *GeneralParams);
COtarcikCan *mProgramHandle;
private:
int UpdateConfigPage();
int UpdateCloudConfig();
int UpdateGeneralParams();
Ui::CLoggingSettingsPage *ui;
bool EditMode;
CCloudParams mCloudParams;
CGeneralSystemParams mGeneralSystemParams;
public slots:
void ModifyParamsBtnPressed();
void CancelBtnPressed();
void VerbosityParamsChanged(int value);
};

View File

@ -204,7 +204,7 @@
</rect>
</property>
</widget>
<widget class="QLabel" name="mCloudMQTTClientID">
<widget class="QLabel" name="mCloudMQTTClientIDLbl">
<property name="geometry">
<rect>
<x>10</x>
@ -225,7 +225,7 @@
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
<widget class="QLineEdit" name="mCloudMQTTTopicPrefixEdit_2">
<widget class="QLineEdit" name="mCloudMQTTClientID">
<property name="geometry">
<rect>
<x>90</x>
@ -279,8 +279,8 @@
<widget class="QLabel" name="mGeneralLogParamsLbl">
<property name="geometry">
<rect>
<x>740</x>
<y>40</y>
<x>590</x>
<y>30</y>
<width>181</width>
<height>31</height>
</rect>
@ -294,19 +294,6 @@
<string>Paramètres généraux</string>
</property>
</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">
<property name="geometry">
<rect>
@ -333,6 +320,111 @@
<string>Annuler</string>
</property>
</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>
<resources/>
<connections/>

View File

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

View File

@ -54,8 +54,9 @@ int COtarcikCan::Start()
CGeneralMessagesLogDispatcher::instance()->BindGuiPageHandle(mMainWindow.mGeneralStatusPage);
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)
{
@ -66,50 +67,41 @@ int COtarcikCan::Start()
PopulateCANDevicesList(CANDeviceConfigList);
}
mMainWindow.mCANbusSettingsPage->SetDevicesList(&mCANDevicesList);
mMainWindow.mCANViewerPage->InitCANTable(&mCANDevicesList);
mCloudLoggingParams = *mSystemConfig.GetCloudParams();
mMainWindow.mDataLoggingSettingsPage->SetCloudParams(&mCloudLoggingParams);
mCANBusMQTTClient.SetMQTTParams(&mCloudLoggingParams);
mCANBusMQTTClient.ConnectToBroker();
mCANBusMQTTClient.SetCANDevicesList(&mCANDevicesList);
mGeneralSystemParams = *mSystemConfig.GetGeneralSystemSettings();
mMainWindow.mDataLoggingSettingsPage->SetGeneralSettingsParams(&mGeneralSystemParams);
CGeneralMessagesLogDispatcher::instance()->SetLogVerbosities(mGeneralSystemParams.mLogFileVerbosity,mGeneralSystemParams.mLocalLogVerbosity);
mMainWindow.mCANWatchdogSettingsPage->SetCANWatchdogConfig(mSystemConfig.GetCANWatchdogConfig());
mGPTimer->setSingleShot(false);
mGPTimer->start(5000);
// mGPTimer->setSingleShot(false);
// 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);
// 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;
}
int COtarcikCan::UpdateCANViewerDataRequest(QList<CCANMessage *> *MsgList, QString DeviceName)
int COtarcikCan::UpdateCANViewerDataRequest(QList<CCANMessage *> *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.
//The easiest way is to delete everything and reload.
mMainWindow.mGeneralStatusPage->ClearCANModuleStatusTable();
PopulateCANDevicesList(DevicesConfigList);
mMainWindow.mCANbusSettingsPage->SetDevicesList(&mCANDevicesList);
mMainWindow.mCANViewerPage->InitCANTable(&mCANDevicesList);
}
else
{
@ -158,12 +153,14 @@ int COtarcikCan::PopulateCANDevicesList(QList<CCANDeviceConfig *> *CANDeviceConf
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->Init();
mCANDevicesList.append(NewDevice);
}
return RET_OK;
}
@ -192,6 +189,23 @@ int COtarcikCan::SaveCloudLoggingConfigRequest(CCloudParams *CloudParams)
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()
{
// mCANBusMQTTClient.SendMQTTTestMessage();

View File

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

View File

@ -60,7 +60,7 @@ int CPCANInterface::Init(TPCANHandle CANDeviceHandle, TPCANBaudrate CANBaudRate)
char strMsg[256];
CAN_GetErrorText(Result, 0, 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;
return RET_GENERAL_ERROR;
}
@ -81,7 +81,7 @@ int CPCANInterface::DeInit()
{
char strMsg[256];
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
{

View File

@ -1,8 +1,7 @@
#include "SystemConfig.h"
#include "GeneralMessagesLogDispatcher.h"
CSystemConfig::CSystemConfig() :
mSaveLocalLogFile(false)
CSystemConfig::CSystemConfig()
{
}
@ -31,13 +30,13 @@ int CSystemConfig::LoadConfig()
if(ConfigFile->open(QIODevice::ReadOnly | QIODevice::Unbuffered) == false)
{
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;
}
}
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...");
return RET_GENERAL_ERROR;
}
@ -71,17 +70,18 @@ int CSystemConfig::LoadConfig()
*InputStream >> mCloudLoggingParams;
//Load general program settings
*InputStream >> mSaveLocalLogFile;
*InputStream >> mGeneralSystemParams;
//Load CAN Watchdog parameters
*InputStream >> mCANWatchdogParams;
ConfigFile->close();
delete ConfigFile;
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;
}
@ -94,13 +94,13 @@ int CSystemConfig::SaveConfig()
{
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;
}
}
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;
}
@ -125,7 +125,7 @@ int CSystemConfig::SaveConfig()
*OutputStream << mCloudLoggingParams;
//Save the general system parameters
*OutputStream << mSaveLocalLogFile;
*OutputStream << mGeneralSystemParams;
//Save the CAN Watchdog params
*OutputStream << mCANWatchdogParams;
@ -136,7 +136,7 @@ int CSystemConfig::SaveConfig()
delete ConfigFile;
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;
}
@ -177,6 +177,12 @@ CCANWatchdogConfig *CSystemConfig::GetCANWatchdogConfig()
return &mCANWatchdogParams;
}
CGeneralSystemParams *CSystemConfig::GetGeneralSystemSettings()
{
return &mGeneralSystemParams;
}
int CSystemConfig::SetCANWatchdogConfig(CCANWatchdogConfig *Config)
{
if(Config == 0)
@ -193,3 +199,12 @@ int CSystemConfig::SetCloudParams(CCloudParams *CloudParams)
mCloudLoggingParams = *CloudParams;
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 "CloudParams.h"
#include "CANWatchdogConfig.h"
#include "GeneralSystemParams.h"
#define OTARCIK_CURRENT_CONFIG_FILE_VERSION 0x01
#define OTARCIK_CONFIG_FILE_MAGIC_NBR 0xDEADBEEF
@ -28,6 +29,8 @@ public:
CCloudParams *GetCloudParams();
int SetCloudParams(CCloudParams *CloudParams);
CGeneralSystemParams *GetGeneralSystemSettings();
int SetGeneralSystemParams(CGeneralSystemParams *GeneralParams);
@ -39,13 +42,15 @@ public:
CCloudParams mCloudLoggingParams;
//Misc general system settings
bool mSaveLocalLogFile;
CGeneralSystemParams mGeneralSystemParams;
//CAN Module watchdog settings
CCANWatchdogConfig mCANWatchdogParams;
CCANWatchdogConfig *GetCANWatchdogConfig();
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 MQTT_CLIENT_RECONNECT_TIMEOUT 5000 //Time in ms between reconnect attemps to MQTT broker when connection is lost
//#define USE_TOPIC_PREFIX
enum eOtarcikGeneralReturns
{
RET_OK = 0,

Binary file not shown.

View File

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

View File

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

Binary file not shown.

View File

@ -11,7 +11,6 @@
#include <QtCore/QVariant>
#include <QtWidgets/QApplication>
#include <QtWidgets/QCheckBox>
#include <QtWidgets/QGroupBox>
#include <QtWidgets/QLabel>
#include <QtWidgets/QLineEdit>
@ -36,14 +35,19 @@ public:
QLineEdit *mCloudMQTTPasswordEdit;
QLabel *mCloudMQTTTopicPrefixLbl;
QLineEdit *mCloudMQTTTopicPrefixEdit;
QLabel *mCloudMQTTClientID;
QLineEdit *mCloudMQTTTopicPrefixEdit_2;
QLabel *mCloudMQTTClientIDLbl;
QLineEdit *mCloudMQTTClientID;
QLabel *mCloudMQTTRefreshRateLbl;
QSpinBox *mCloudMQTTRefreshRateSpinBx;
QLabel *mGeneralLogParamsLbl;
QCheckBox *mSaveLocalLogFileChkBx;
QPushButton *mChangeParamsBtn;
QPushButton *mCancelBtn;
QGroupBox *groupBox_2;
QSpinBox *mLogFileVerbositySpinBx;
QSpinBox *mLogZoneVerbositySpinBx;
QLabel *label;
QLabel *label_2;
QLabel *label_3;
void setupUi(QWidget *CLoggingSettingsPage)
{
@ -103,14 +107,14 @@ public:
mCloudMQTTTopicPrefixEdit = new QLineEdit(groupBox);
mCloudMQTTTopicPrefixEdit->setObjectName(QString::fromUtf8("mCloudMQTTTopicPrefixEdit"));
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->setGeometry(QRect(10, 190, 71, 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));
mCloudMQTTClientID->setGeometry(QRect(90, 190, 321, 20));
mCloudMQTTRefreshRateLbl = new QLabel(groupBox);
mCloudMQTTRefreshRateLbl->setObjectName(QString::fromUtf8("mCloudMQTTRefreshRateLbl"));
mCloudMQTTRefreshRateLbl->setGeometry(QRect(10, 220, 181, 20));
@ -124,17 +128,43 @@ public:
mCloudMQTTRefreshRateSpinBx->setSingleStep(1);
mGeneralLogParamsLbl = new QLabel(CLoggingSettingsPage);
mGeneralLogParamsLbl->setObjectName(QString::fromUtf8("mGeneralLogParamsLbl"));
mGeneralLogParamsLbl->setGeometry(QRect(740, 40, 181, 31));
mGeneralLogParamsLbl->setGeometry(QRect(590, 30, 181, 31));
mGeneralLogParamsLbl->setFont(font);
mSaveLocalLogFileChkBx = new QCheckBox(CLoggingSettingsPage);
mSaveLocalLogFileChkBx->setObjectName(QString::fromUtf8("mSaveLocalLogFileChkBx"));
mSaveLocalLogFileChkBx->setGeometry(QRect(740, 80, 261, 20));
mChangeParamsBtn = new QPushButton(CLoggingSettingsPage);
mChangeParamsBtn->setObjectName(QString::fromUtf8("mChangeParamsBtn"));
mChangeParamsBtn->setGeometry(QRect(370, 340, 80, 22));
mCancelBtn = new QPushButton(CLoggingSettingsPage);
mCancelBtn->setObjectName(QString::fromUtf8("mCancelBtn"));
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);
@ -151,12 +181,15 @@ public:
mCloudMQTTUsernameLbl->setText(QCoreApplication::translate("CLoggingSettingsPage", "Username", nullptr));
mCloudMQTTPasswordLbl->setText(QCoreApplication::translate("CLoggingSettingsPage", "Password", 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));
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));
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
};

View File

@ -5,4 +5,7 @@ Router Ubiquiti: user:yultek pwd:Evinrude30
Windows PC Axiomtek: user yultek pwd:Otarcik!
Pet name: otarcik
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
- 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
- Ajouter la gestion du Client ID MQTT
x Ajouter la gestion du Client ID MQTT
- Implémenter le watchdog CAN
- Valider pourquoi le MQTT ne se connecte pas au reboot
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
- 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)
- Implémenter le CAN Watchdog