/******************************************************************************* * * * Gros Gin électronique * * 2023 * * * * Project: Otarcik CAN * * * * * * * *******************************************************************************/ /* Description: This is our main program */ #include "OtarcikCan.h" #include "PCANBasic.h" #include "QtEndian" COtarcikCan::COtarcikCan(QObject *parent) : QObject(parent) { mGPTimer = new QTimer; connect(mGPTimer,SIGNAL(timeout()),this,SLOT(GPTimerExpired())); mCANBusMQTTClient.mProgramPtr = this; } COtarcikCan::~COtarcikCan() { while (!mCANDevicesList.isEmpty()) { delete mCANDevicesList.takeFirst(); } mCANDevicesList.clear(); mCANBusMQTTClient.DisconnectFromBroker(); delete mGPTimer; } int COtarcikCan::Start() { mMainWindow.mCANbusSettingsPage->mProgramPtr = this; mMainWindow.mDataLoggingSettingsPage->mProgramHandle = this; // mMainWindow.mCANWatchdogSettingsPage->mProgramHandle = this; mMainWindow.show(); CGeneralMessagesLogDispatcher::instance()->BindGuiPageHandle(mMainWindow.mGeneralStatusPage); CGeneralMessagesLogDispatcher::instance()->Init(); // CGeneralMessagesLogDispatcher::instance()->Init(); // CGeneralMessagesLogDispatcher::instance()->AddLogMessage(QString("Démarrage du logiciel OtarcikCAN")); if(mSystemConfig.LoadConfig() == RET_OK) { QList *CANDeviceConfigList; CANDeviceConfigList = mSystemConfig.GetCANDevicesConfigList(); if(CANDeviceConfigList != 0) { PopulateCANDevicesList(CANDeviceConfigList); } mMainWindow.mCANbusSettingsPage->SetDevicesList(&mCANDevicesList); mMainWindow.mCANViewerPage->InitCANTable(&mCANDevicesList); mCloudLoggingParams = *mSystemConfig.GetCloudParams(); mMainWindow.mDataLoggingSettingsPage->SetCloudParams(&mCloudLoggingParams); mCANBusMQTTClient.SetMQTTParams(&mCloudLoggingParams); 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); } CGeneralMessagesLogDispatcher::instance()->AddLogMessage(QString("Démarrage du logiciel OtarcikCAN")); // mCANBusMQTTClient.ConnectToBroker(); mCANBusMQTTClient.StartMQTTClient(); mMainWindow.mCANbusSettingsPage->SetDevicesList(&mCANDevicesList); return 0; } int COtarcikCan::UpdateCANViewerDataRequest(QList *MsgList) { return mMainWindow.mCANViewerPage->UpdateCANTable(MsgList); } //The device configuration has been modified directly in the master list //Just save it and refresh display. int COtarcikCan::SaveCANDevicesConfigRequest(QList *DevicesConfigList) { if(DevicesConfigList == 0) { return RET_GENERAL_ERROR; } if(mSystemConfig.SetCANDevicesConfigList(DevicesConfigList) != RET_OK) { return RET_GENERAL_ERROR; } if(mSystemConfig.SaveConfig() == RET_OK) { //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 { return RET_GENERAL_ERROR; } return RET_OK; } int COtarcikCan::PopulateCANDevicesList(QList *CANDeviceConfigList) { if(CANDeviceConfigList == 0) { return RET_GENERAL_ERROR; } while(mCANDevicesList.size() != 0) { delete mCANDevicesList.takeFirst(); } for(int i = 0; i < CANDeviceConfigList->size(); i++) { CCANDevice *NewDevice = new CCANDevice(*CANDeviceConfigList->at(i),&mCANBusMQTTClient,mSystemConfig.mCloudLoggingParams.mMQTTTopicPrefix); NewDevice->mProgramPtr = this; NewDevice->Init(); mCANDevicesList.append(NewDevice); } return RET_OK; } int COtarcikCan::SaveCloudLoggingConfigRequest(CCloudParams *CloudParams) { if(CloudParams == 0) { return RET_GENERAL_ERROR; } mCloudLoggingParams = *CloudParams; mSystemConfig.SetCloudParams(&mCloudLoggingParams); mCANBusMQTTClient.SetMQTTParams(&mCloudLoggingParams); if(mSystemConfig.SaveConfig() == RET_OK) { //TODO: Reset the MQTT driver with new parameters. } else { return RET_GENERAL_ERROR; } 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(); } int COtarcikCan::SetCANConnectionStatusRequest(bool Connected) { return mMainWindow.mGeneralStatusPage->SetCANConnectionStatus(Connected); } int COtarcikCan::SetMQTTConnectionSatusRequest(bool Connected) { return mMainWindow.mGeneralStatusPage->SetMQTTConnectionStatus(Connected); } int COtarcikCan::UpdateCANModuleStatusRequest(QString ModuleName, QString ModuleStatus, QString Buffer) { return mMainWindow.mGeneralStatusPage->UpdateCANModuleStatus(ModuleName,ModuleStatus,Buffer); } int COtarcikCan::SaveCANWatchdogSettingsRequest(CCANWatchdogConfig *CANWatchdogConfig) { mSystemConfig.SetCANWatchdogConfig(CANWatchdogConfig); return mSystemConfig.SaveConfig(); }