Index: sources/main.h =================================================================== diff -u -r526875e8db8cf0c97f5cd8aa90564e41d42f5fde -rc30ee08fbc73ee5fcd54a7bf0e996eb6a067b7a7 --- sources/main.h (.../main.h) (revision 526875e8db8cf0c97f5cd8aa90564e41d42f5fde) +++ sources/main.h (.../main.h) (revision c30ee08fbc73ee5fcd54a7bf0e996eb6a067b7a7) @@ -1,13 +1,13 @@ /*! * - * Copyright (c) 2019-2022 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) 14-Jan-2022 + * \date (last) 18-Jul-2023 * \author (original) Behrouz NematiPour * \date (original) 28-Oct-2019 * @@ -28,8 +28,6 @@ #define PRINT_THREAD_NAME #endif -#undef DEBUG_BCUFF_MIMIC - // TODO : A singleton parent class needs to be created // to taking care of the Threading, init, quit, and so @@ -52,18 +50,60 @@ 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; \ + } //--------------------------------------------------------------------------------// +#define SINGLETON_DISABLE_CONNECT(vSIGNAL) \ + connect(&_ApplicationController , \ + &ApplicationController::vSIGNAL , \ + this , \ + [=](bool vPass) { if ( ! vPass ) disable(); }); +//--------------------------------------------------------------------------------// +//--------------------------------------------------------------------------------// extern int gFakeInterval ; extern QByteArray gFakeData ; extern const char*gFakeData_default ; extern bool gSendEmptyKeepAwake ; extern bool gFakeSeqAtBegin ; extern bool gDisableUnhandledReport ; -extern bool gEnableDialinUnhandled ; +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) \ @@ -76,9 +116,23 @@ #define SKIPPER_RST \ skipperCounter = 0 //--------------------------------------------------------------------------------// +#define DEBUG_PROPERTY_CHANGED(vVARIABLE, PREFIX) // qDebug() << "#" << #vVARIABLE << PREFIX##vVARIABLE; //--------------------------------------------------------------------------------// -#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 @@ -134,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. @@ -152,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: \ @@ -191,22 +251,76 @@ 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) + 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. @@ -255,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 &))); @@ -286,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: \ @@ -393,62 +555,4 @@ //--------------------------------------------------------------------------------// #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); - +//--------------------------------------------------------------------------------//