Index: sources/main.h =================================================================== diff -u -r7a1509a80fed2dd51aa28b460acbf0227d0c96d7 -rc30ee08fbc73ee5fcd54a7bf0e996eb6a067b7a7 --- sources/main.h (.../main.h) (revision 7a1509a80fed2dd51aa28b460acbf0227d0c96d7) +++ sources/main.h (.../main.h) (revision c30ee08fbc73ee5fcd54a7bf0e996eb6a067b7a7) @@ -1,16 +1,16 @@ /*! - * - * Copyright (c) 2019-2020 Diality Inc. - All Rights Reserved. + * + * Copyright (c) 2019-2023 Diality Inc. - All Rights Reserved. * \copyright * THIS CODE MAY NOT BE COPIED OR REPRODUCED IN ANY FORM, IN PART OR IN * WHOLE, WITHOUT THE EXPLICIT PERMISSION OF THE COPYRIGHT OWNER. - * + * * \file main.h * \author (last) Behrouz NematiPour - * \date (last) 31-Mar-2021 + * \date (last) 18-Jul-2023 * \author (original) Behrouz NematiPour * \date (original) 28-Oct-2019 - * + * */ #pragma once @@ -22,7 +22,8 @@ // Application #define PRINT_THREAD_NAME_ENABLE 0 #if (PRINT_THREAD_NAME_ENABLE) - #define PRINT_THREAD_NAME qDebug() << " ----- " << QThread::currentThread()->objectName() << __func__ ; + #include + #define PRINT_THREAD_NAME qDebug() << " ----- " << QThread::currentThread()->objectName() << metaObject()->className() << __func__ ; #else #define PRINT_THREAD_NAME #endif @@ -49,20 +50,89 @@ static vCLASS _instance; \ return _instance; \ } \ + static bool _disable; \ + /* Intentionally disable made private */ \ + static void disable(); \ +public: \ + static bool isDisable() { \ + return _disable; \ + } \ private: //--------------------------------------------------------------------------------// +#include +#define SINGLETON_DISABLE(vCLASS) \ + bool vCLASS::_disable = false; \ + void vCLASS:: disable() { \ + if ( QThread::currentThread() == qApp->thread() ) { \ + LOG_DEBUG(QString(" !!! Failed Disable "#vCLASS" [%1] !!!").arg(QThread::currentThread()->objectName())); \ + return; \ + } \ + LOG_DEBUG(QString(" !!! Disabled "#vCLASS" [%1] !!!").arg(QThread::currentThread()->objectName())); \ + QEventLoopLocker _eventLoopLocker(QThread::currentThread()); \ + _disable = true; \ + } //--------------------------------------------------------------------------------// -extern int gFakeInterval; -extern QByteArray gFakeData; -extern const char*gFakeData_default; -extern bool gSendEmptyKeepAwake; -extern bool gFakeSeqAtBegin; -extern bool gDisableUnhandledReport; -extern bool gDisableTimeout; +#define SINGLETON_DISABLE_CONNECT(vSIGNAL) \ + connect(&_ApplicationController , \ + &ApplicationController::vSIGNAL , \ + this , \ + [=](bool vPass) { if ( ! vPass ) disable(); }); //--------------------------------------------------------------------------------// //--------------------------------------------------------------------------------// -#define DEBUG_PROPERTY_CHANGED(vVARIABLE, PREFIX) // qDebug() << "#" << #vVARIABLE << PREFIX##vVARIABLE; +extern int gFakeInterval ; +extern QByteArray gFakeData ; +extern const char*gFakeData_default ; +extern bool gSendEmptyKeepAwake ; +extern bool gFakeSeqAtBegin ; +extern bool gDisableUnhandledReport ; +extern bool gDisableDialinUnhandled ; +extern bool gDisableTimeout ; +extern bool gDisableAlarmNoMinimize ; +extern bool gDisableSDCFailLogStop ; +extern bool gDisableCloudSyncFailStop ; + +extern bool gDisableCheckInLog ; +extern bool gDisableAcknowLog ; + +extern bool gConsoleoutLogs ; +extern bool gConsoleoutFrameInterface ; +extern bool gConsoleoutCanInterface ; + +extern bool gEnableDryDemo ; +extern QString gActiveCANBus ; +extern bool gEnableManufacturing ; +extern bool gUseRootHome ; + + //--------------------------------------------------------------------------------// +//--------------------------------------------------------------------------------// +#define SKIPPER_DEF(X) \ + const quint8 skipperMaxTry = X; \ + static quint8 skipperCounter = 0; +#define SKIPPER_TST(WHAT) \ + if ( skipperCounter < skipperMaxTry ) WHAT +#define SKIPPER_TRY \ + skipperCounter++ +#define SKIPPER_RST \ + skipperCounter = 0 +//--------------------------------------------------------------------------------// +#define DEBUG_PROPERTY_CHANGED(vVARIABLE, PREFIX) // qDebug() << "#" << #vVARIABLE << PREFIX##vVARIABLE; +//--------------------------------------------------------------------------------// +#define FROMVARIANT(vVARIABLE, vGROUP, vKEY, vCONVERSION) \ +{ \ + bool ok = false; \ + vVARIABLE( _Settings.value(mCategory, vGROUP, vKEY).to##vCONVERSION(&ok) ); \ + if ( !ok ) LOG_DEBUG("incorrect configuration value for " #vVARIABLE); \ +} +//--------------------------------------------------------------------------------// +#define FROMVARIANT_WITHRETURN(vVARIABLE, vGROUP, vKEY, vCONVERSION, vOVERALL_OK) \ +{ \ + bool ok = false; \ + vVARIABLE( _Settings.value(mCategory, vGROUP, vKEY).to##vCONVERSION(&ok) ); \ + if ( !ok ) LOG_DEBUG("incorrect configuration value for " #vVARIABLE); \ + vOVERALL_OK = vOVERALL_OK && ok; \ +} +//--------------------------------------------------------------------------------// #define PROPERTY_SLOT( vTYPE , vVARIABLE ) \ protected : \ /*! \brief Property setter @@ -118,6 +188,10 @@ } \ } //--------------------------------------------------------------------------------// +#define PROPERTY_POST_CONNECTION( vCLASS, vVARIABLE ) \ + connect(this, &vCLASS::vVARIABLE##Changed \ + , &vCLASS::vVARIABLE##_post ); +//--------------------------------------------------------------------------------// #define PROPERTY_BASE(vTYPE , vVARIABLE , vDEFVALUE, vSIGNAL) \ /*! \brief Qt Property declaration \details The Qt Property definition by Q_PROPERTY documentation. @@ -136,6 +210,8 @@ */\ void vVARIABLE##vSIGNAL( const vTYPE & v##vVARIABLE ); \ private: \ + void vVARIABLE##_post ( const vTYPE & v##vVARIABLE ); \ + private: \ vTYPE _##vVARIABLE = vDEFVALUE; \ bool _##vVARIABLE##Changed = false; \ protected: \ @@ -147,18 +223,104 @@ return _##vVARIABLE ; \ } //--------------------------------------------------------------------------------// +#define READONLY_BASE(vTYPE , vVARIABLE , vDEFVALUE, vSIGNAL) \ + /*! \brief Qt Read-Only Property declaration + \details The Qt Property definition by Q_PROPERTY documentation. + */\ + Q_PROPERTY( vTYPE vVARIABLE \ + READ vVARIABLE \ + NOTIFY vVARIABLE##vSIGNAL) \ + Q_SIGNALS: \ + /*! \brief Property notify signal + \details The property notify signal (...Changed) + which will be emitted by property setter + - if only the value has been changed \n + - or it's the first time property is set. \n + \return current value + */\ + void vVARIABLE##vSIGNAL( const vTYPE & v##vVARIABLE ); \ + private: \ + vTYPE _##vVARIABLE = vDEFVALUE; \ + bool _##vVARIABLE##Changed = false; \ + protected: \ + /*! \brief Property getter + \details The property getter which reads the private variable + \return current value + */\ + vTYPE vVARIABLE () const { \ + return _##vVARIABLE ; \ + } +//--------------------------------------------------------------------------------// +#define IDBASED_BASE(vTYPE , vVARIABLE , vDEFVALUE , vLIST , vID) \ + /*! \brief Qt Property declaration + \details The Qt Property definition by Q_PROPERTY documentation. + */\ + Q_PROPERTY( vTYPE vVARIABLE \ + READ vVARIABLE \ + WRITE vVARIABLE \ + NOTIFY vID##Changed) \ + Q_SIGNALS: \ + /*! \brief Property notify signal + \details The property notify signal (...Changed) + which will be emitted by property setter + - if only the value has been changed \n + - or it's the first time property is set. \n + \return current value + */\ + void vVARIABLE##Changed( const vTYPE & v##vVARIABLE ); \ + private: \ + vTYPE _##vVARIABLE = vDEFVALUE; \ + bool _##vVARIABLE##Changed = false; \ + bool _##vVARIABLE##ByID = true ; \ + protected: \ + /*! \brief Property byId setter + \details The property sets the ByID value to be used in the getter + */\ + void vVARIABLE##ByID(bool vByID = true) { \ + _##vVARIABLE##ByID = vByID ; \ + } \ + /*! \brief Property getter + \details The property getter which reads the private variable + \return current value + */\ + vTYPE vVARIABLE () const { \ + if ( ! _##vVARIABLE##ByID ) return _##vVARIABLE; \ + QString value = _##vLIST [ _##vID ].vVARIABLE; \ + if ( ! value.isEmpty() ) return value; \ + return vDEFVALUE; \ + } +//--------------------------------------------------------------------------------// +#define READONLY( vTYPE , vVARIABLE , vDEFVALUE ) \ + READONLY_BASE( vTYPE , vVARIABLE , vDEFVALUE , Changed ) \ + PROPERTY_SLOT( vTYPE , vVARIABLE ) +//--------------------------------------------------------------------------------// #define PROPERTY( vTYPE , vVARIABLE , vDEFVALUE ) \ PROPERTY_BASE( vTYPE , vVARIABLE , vDEFVALUE , Changed ) \ - PROPERTY_SLOT( vTYPE , vVARIABLE) + PROPERTY_SLOT( vTYPE , vVARIABLE ) //--------------------------------------------------------------------------------// #define TRIGGER( vTYPE , vVARIABLE , vDEFVALUE ) \ PROPERTY_BASE( vTYPE , vVARIABLE , vDEFVALUE , Triggered) \ - TRIGGER_SLOT ( vTYPE , vVARIABLE) + TRIGGER_SLOT ( vTYPE , vVARIABLE ) //--------------------------------------------------------------------------------// #define STATE( vTYPE , vVARIABLE , vDEFVALUE ) \ PROPERTY_BASE( vTYPE , vVARIABLE , vDEFVALUE , Entered ) \ - STATE_SLOT ( vTYPE , vVARIABLE) + STATE_SLOT ( vTYPE , vVARIABLE ) //--------------------------------------------------------------------------------// +#define IDBASED( vTYPE , vVARIABLE , vDEFVALUE , vLIST , vID ) \ + IDBASED_BASE ( vTYPE , vVARIABLE , vDEFVALUE , vLIST , vID ) \ + PROPERTY_SLOT( vTYPE , vVARIABLE ) +//--------------------------------------------------------------------------------// +#define VALUESET( vTYPE , vVARIABLE , vDEFVALUE ) \ + PROPERTY( vTYPE , vVARIABLE , vDEFVALUE ) \ + PROPERTY( bool , vVARIABLE##Set , false ) +//--------------------------------------------------------------------------------// +#define RANGESET( vTYPE , vVARIABLE , vDEFVALUE ) \ + READONLY( vTYPE , vVARIABLE##Min , vDEFVALUE ) \ + READONLY( vTYPE , vVARIABLE##Max , vDEFVALUE ) \ + READONLY( vTYPE , vVARIABLE##Res , vDEFVALUE ) \ + READONLY( vTYPE , vVARIABLE##Def , vDEFVALUE ) + +//--------------------------------------------------------------------------------// #define CONSTANT( vTYPE , vVARIABLE , vDEFVALUE ) \ /*! \brief Qt Constant Property declaration \details The Qt Property definition by Q_PROPERTY documentation. @@ -207,7 +369,46 @@ emit vVARIABLE##Notified( _##vVARIABLE ); \ } //--------------------------------------------------------------------------------// +#define SETTINGS_BASE( vVARIABLE , vCATEGORY , vGROUP , vKEY) \ + private: \ + /*! \brief Settings identifier + \details identifies the settings by the given information + \param vCategory - The category of the setting which includes on-level folder and the file name (without .conf extension) + \param vGroup - The group setting key/value belongs to + \param vKey - The key of the setting + */\ + bool is##vVARIABLE(const QString &vCategory , \ + const QString &vGroup , \ + const QString &vKey ) { \ + return vCategory == vVARIABLE##Category() && \ + vGroup == vVARIABLE##Group () && \ + vKey == vVARIABLE##Key (); \ + } \ + /*! \brief Settings property category getter + \details returns the category of the setting + */\ + QString vVARIABLE##Category() { \ + return vCATEGORY; \ + } \ + /*! \brief Settings property group getter + \details returns the group of the setting + */\ + QString vVARIABLE##Group() { \ + return vGROUP; \ + } \ + /*! \brief Settings property key getter + \details returns the key of the setting + */\ + QString vVARIABLE##Key() { \ + return vKEY; \ + } //--------------------------------------------------------------------------------// +#define SETTINGS( vTYPE , vVARIABLE , vDEFVALUE , vCATEGORY , vGROUP , vKEY) \ + PROPERTY_BASE( vTYPE , vVARIABLE , vDEFVALUE , Changed ) \ + PROPERTY_SLOT( vTYPE , vVARIABLE ) \ + SETTINGS_BASE( vVARIABLE , vCATEGORY , vGROUP , vKEY) +//--------------------------------------------------------------------------------// +//--------------------------------------------------------------------------------// #define ACTION_VIEW_CONNECTION(vTYPE) \ connect(&_GuiController, SIGNAL(didActionReceive(const vTYPE &)), \ this, SLOT( onActionReceive(const vTYPE &))); @@ -238,6 +439,15 @@ void onActionReceive (const vTYPE &vData) { \ emit didActionReceive(vData); \ } +#define ACTION_RECEIVE_PRIVATE_SLOT_NOEMIT(vTYPE) \ +private Q_SLOTS: \ + /*! \brief The Received message slot that needs implementation + \details The bridge slot is for thread safety between classes for received message + and is used to emit its signal to pass the model data to next observer. + \param vData - The model data which has been received. + \note This method is private and the interface is signals only. (starts with 'on') + */\ + void onActionReceive (const vTYPE &vData) //--------------------------------------------------------------------------------// #define ADJUST_TRANSMT_PRIVATE_SLOT_DEFINITION(vTYPE) \ private Q_SLOTS: \ @@ -313,69 +523,36 @@ \ ADJUST_TRANSMT_PUBLIC_SLOT (vTYPE) \ ADJUST_TRANSMT_SIGNAL (vTYPE) \ - //--------------------------------------------------------------------------------// +#define SAFE_CALL( vMETHOD) \ +public Q_SLOTS : void vMETHOD() { \ + static bool init = false; \ + if ( ! init ) { \ + connect(this, SIGNAL( did##vMETHOD()), \ + this, SLOT( on##vMETHOD())); \ + init = true; \ + } \ + emit did##vMETHOD(); \ + } \ +Q_SIGNALS : void did##vMETHOD(); \ +private Q_SLOTS : void on##vMETHOD(); +//--------------------------------------------------------------------------------// +#define SAFE_CALL_EX( vMETHOD,vTYPE) \ +public Q_SLOTS : void vMETHOD(vTYPE vData) { \ + static bool init = false; \ + if ( ! init ) { \ + connect(this, SIGNAL( did##vMETHOD(vTYPE)), \ + this, SLOT( on##vMETHOD(vTYPE))); \ + init = true; \ + } \ + emit did##vMETHOD( vData); \ + } \ +Q_SIGNALS : void did##vMETHOD(vTYPE); \ +private Q_SLOTS : void on##vMETHOD(vTYPE); +//--------------------------------------------------------------------------------// #define REGISTER_METATYPE(vTYPE) \ qRegisterMetaType < vTYPE > (#vTYPE); //--------------------------------------------------------------------------------// #define REGISTER_TYPE(vTYPE) \ qmlRegisterType < vTYPE > (#vTYPE, 0, 1, #vTYPE); -#define GET_VARIABLE_NAME(VARIABLE) (#VARIABLE) -#define DEBUG_TREATMENT_PARAMETER(NAME, VARIABLE) // qDebug() << NAME << VARIABLE; -#define TREATMENT_PARAMETER(TYPE, NAME, DEFVALUE, MIN, MAX, RES) \ -private: \ - TYPE _##NAME = DEFVALUE; \ - TYPE _##NAME##Min = MIN; \ - TYPE _##NAME##Max = MAX; \ - TYPE _##NAME##Res = RES; \ - bool is##NAME##Set = false; \ -protected: \ - Q_PROPERTY(TYPE NAME \ - READ NAME \ - WRITE NAME \ - NOTIFY NAME##Changed) \ - Q_PROPERTY(TYPE NAME##Min \ - READ NAME##Min \ - WRITE NAME##Min \ - NOTIFY NAME##MinChanged) \ - Q_PROPERTY(TYPE NAME##Max \ - READ NAME##Max \ - WRITE NAME##Max \ - NOTIFY NAME##MaxChanged) \ - Q_PROPERTY(TYPE NAME##Res \ - READ NAME##Res \ - WRITE NAME##Res \ - NOTIFY NAME##ResChanged) \ - void NAME(const TYPE &v##NAME) { \ - if ( !is##NAME##Set || _##NAME != v##NAME ) { \ - _##NAME = v##NAME; \ - is##NAME##Set = true; \ - emit NAME##Changed(_##NAME); \ - doUserModifiedParameters(); \ - } \ - DEBUG_TREATMENT_PARAMETER(#NAME, _##NAME) \ - } \ - TYPE NAME##Min() const { return _##NAME##Min; } \ - void NAME##Min(const TYPE &v##NAME##Min) \ - { _##NAME##Min = v##NAME##Min; emit NAME##MinChanged(_##NAME##Min);} \ - TYPE NAME##Max() const { return _##NAME##Max; } \ - void NAME##Max(const TYPE &v##NAME##Max) \ - { _##NAME##Max = v##NAME##Max; emit NAME##MaxChanged(_##NAME##Max);} \ - TYPE NAME##Res() const { return _##NAME##Res; } \ - void NAME##Res(const TYPE &v##NAME##Res) \ - { _##NAME##Res = v##NAME##Res; emit NAME##ResChanged(_##NAME##Res);} \ - TYPE NAME() const { \ - return _##NAME; \ - } \ - void reset_##NAME() { \ - _##NAME = DEFVALUE; \ - is##NAME##Set = false; \ - emit NAME##Changed(_##NAME); \ - } \ -Q_SIGNALS: \ - void NAME##Changed(const TYPE &v##NAME); \ - void NAME##MinChanged(const TYPE &v##NAME); \ - void NAME##MaxChanged(const TYPE &v##NAME); \ - void NAME##ResChanged(const TYPE &v##NAME); \ - void NAME##_ValidationFailed(const QString &reason); - +//--------------------------------------------------------------------------------//