From 4567aed6d1033c34ea6c9906b9268d8e9ac32cd6 Mon Sep 17 00:00:00 2001 From: Siegfried Siegert Date: Mon, 12 May 2025 13:26:48 +0200 Subject: [PATCH 01/20] Introduce DCMachineEvent ... ... this is an DC-Plugin internal data-structure which can be transformed to an ATBMachineEvent and sent to ISMAS. DCMachineEvent is in fact a couple ot DeviceController::State and a QString eventID. Thi eventID is necessary to send a state-reset to ISMAS. ISMAS needs same enventID for set- and reset Events. --- src/ATBAPP/DeviceControllerDiag.cpp | 41 ++++++++++++++++------------- src/ATBAPP/DeviceControllerDiag.h | 32 +++++++++++++++++++--- 2 files changed, 51 insertions(+), 22 deletions(-) diff --git a/src/ATBAPP/DeviceControllerDiag.cpp b/src/ATBAPP/DeviceControllerDiag.cpp index a326fb0..7778813 100644 --- a/src/ATBAPP/DeviceControllerDiag.cpp +++ b/src/ATBAPP/DeviceControllerDiag.cpp @@ -95,7 +95,7 @@ bool DeviceControllerDiag::isOperatingState() return !this->_isErrorState; } -QSet DeviceControllerDiag::getCurrentMachineState() +QSet DeviceControllerDiag::getCurrentMachineState() { return this->machineEventSet; } @@ -421,33 +421,30 @@ void DeviceControllerDiag::sub_componentAssessment() // compare machineEventSets // New events: present in current but not previous - QSet newEvents = this->machineEventSet - this->previousMachineEventSet; + QSet newEvents = this->machineEventSet - this->previousMachineEventSet; // Reset events: present in previous but not current - QSet resetEvents = this->previousMachineEventSet - this->machineEventSet; + QSet resetEvents = this->previousMachineEventSet - this->machineEventSet; // Triggering Actions // Iterate through the results - for (const DeviceController::State& event : newEvents) { + for (const DCMachineEvent& event : newEvents) { private_sendDiagEvent(event, DeviceController::Action::SET); // New event detected } - // Proposal: send reset - /* - for (const DeviceController::State& event : resetEvents) { + // send reset + for (const DCMachineEvent& event : resetEvents) { private_sendDiagEvent(event, DeviceController::Action::RESET); // Event no longer present } - */ // DEBUG // print all current states QStringList DeviceControllerStateStringList; - for (const DeviceController::State& event : this->machineEventSet) { - DeviceControllerStateStringList.append(QMetaEnum::fromType().valueToKey(event)); + for (const DCMachineEvent& event : this->machineEventSet) { + DeviceControllerStateStringList.append(QMetaEnum::fromType().valueToKey(event.state)); } qCritical() << "diagReq result: " << DeviceControllerStateStringList; - // finish diag this->diagRequestTimeoutTimer->stop(); @@ -482,18 +479,26 @@ void DeviceControllerDiag::private_setDiagEvent(DeviceController::State result) return; } - machineEventSet.insert(result); + DCMachineEvent newState = DCMachineEvent(result, QUuid::createUuid().toString(QUuid::WithoutBraces).mid(0, 8)); + + machineEventSet.insert(newState); } -void DeviceControllerDiag::private_sendDiagEvent(DeviceController::State result, DeviceController::Action action) -{ - QString eventId = QUuid::createUuid().toString(QUuid::WithoutBraces).mid(0, 8); - QString eventName = QMetaEnum::fromType().valueToKey(result);; +/** + * @brief DeviceControllerDiag::private_sendDiagEvent + * @param result WXXX | EXXX | O000 + * @param action SET|RESET + */ +void DeviceControllerDiag::private_sendDiagEvent(DCMachineEvent result, DeviceController::Action action) +{ + QString eventId = result.eventId; + + QString eventName = QMetaEnum::fromType().valueToKey(result.state); EVENT_CLASS eventClass = EVENT_CLASS::STATE; QString parameter; - switch (result) { + switch (result.state) { case DeviceController::State::INITIAL_STATE: break; @@ -637,7 +642,7 @@ void DeviceControllerDiag::private_sendDiagEvent(DeviceController::State result, break; } - this->lastState = result; + this->lastState = result.state; /** * Variant: send 'parameter' as JSON: diff --git a/src/ATBAPP/DeviceControllerDiag.h b/src/ATBAPP/DeviceControllerDiag.h index 7341e4a..327cf68 100644 --- a/src/ATBAPP/DeviceControllerDiag.h +++ b/src/ATBAPP/DeviceControllerDiag.h @@ -73,6 +73,30 @@ namespace DeviceController { } +// ----------------------------- DCMachineEvent ----------------------------------------- + +class DCMachineEvent { +public: + DCMachineEvent() = default; + DCMachineEvent(DeviceController::State state, const QString& id) : state(state), eventId(id) {} + + DeviceController::State state; + QString eventId; + + // Equality operator (required for QSet) + bool operator==(const DCMachineEvent& other) const { + return (state == other.state); + } +}; + +// Hash function (required for QSet) +inline uint qHash(const DCMachineEvent& key, uint seed = 0) { + return qHash(static_cast(key.state), seed); +} + + +// ------------------------ DeviceControllerDiag -------------------------------------- + class DeviceControllerDiag : public QObject { Q_OBJECT @@ -90,7 +114,7 @@ public: */ bool isErrorState(); bool isOperatingState(); - QSet getCurrentMachineState(); + QSet getCurrentMachineState(); void setTimeout(int timeout); @@ -132,8 +156,8 @@ private: int lastVoltage; DeviceController::State lastState; - QSet machineEventSet; - QSet previousMachineEventSet; + QSet machineEventSet; + QSet previousMachineEventSet; bool _isErrorState; PersistentData* pData; @@ -145,7 +169,7 @@ private slots: void private_startDiag(); // diag entry method void private_setDiagEvent(DeviceController::State result); - void private_sendDiagEvent(DeviceController::State result, DeviceController::Action action); + void private_sendDiagEvent(DCMachineEvent result, DeviceController::Action action); void sys_superviseSystem(); From f8757b352d4bf844aa6ad465711f6859336256ca Mon Sep 17 00:00:00 2001 From: Siegfried Siegert Date: Mon, 12 May 2025 16:10:40 +0200 Subject: [PATCH 02/20] Diag: clear machineEventSet on the begin of DCDiag ... ... not on end. This is to keep current machineEventSet during normal IDLE process. --- src/ATBAPP/DeviceControllerDiag.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/ATBAPP/DeviceControllerDiag.cpp b/src/ATBAPP/DeviceControllerDiag.cpp index 7778813..7de2550 100644 --- a/src/ATBAPP/DeviceControllerDiag.cpp +++ b/src/ATBAPP/DeviceControllerDiag.cpp @@ -61,6 +61,7 @@ void DeviceControllerDiag::diagRequest() qCritical() << "DeviceControllerDiag::diagRequest() is already running"; return; } + this->machineEventSet.clear(); this->isRequestRunning = true; this->diagRequestTimeoutTimer->start(); @@ -452,12 +453,12 @@ void DeviceControllerDiag::sub_componentAssessment() this->flagInterruptDiag = false; this->previousMachineEventSet = machineEventSet; - this->machineEventSet.clear(); if (this->isDiagBackgroundTask) { this->isDiagBackgroundTask = false; this->dbus->finishedBackgroundTask("E255"); } + } From 12be31ee4901ee81b633914996e4d14bf084b0be Mon Sep 17 00:00:00 2001 From: Siegfried Siegert Date: Mon, 12 May 2025 16:17:23 +0200 Subject: [PATCH 03/20] Diag: getCurrentMachineState: return previousState ... ... if diag is running. This method is currently not used, but maybe in future it could be usefull to read current state. --- src/ATBAPP/DeviceControllerDiag.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/ATBAPP/DeviceControllerDiag.cpp b/src/ATBAPP/DeviceControllerDiag.cpp index 7de2550..ee56198 100644 --- a/src/ATBAPP/DeviceControllerDiag.cpp +++ b/src/ATBAPP/DeviceControllerDiag.cpp @@ -98,6 +98,9 @@ bool DeviceControllerDiag::isOperatingState() QSet DeviceControllerDiag::getCurrentMachineState() { + // ensure that currentMachineEventSet is delivered here + if (this->isRequestRunning) return this->previousMachineEventSet; + return this->machineEventSet; } From 923bff11178399a07318546417dd0b2b8c72a9e2 Mon Sep 17 00:00:00 2001 From: Siegfried Siegert Date: Mon, 12 May 2025 16:19:47 +0200 Subject: [PATCH 04/20] Diag: Operate O000 is not part of machineEventSet - O000 is not a direct result from DC - O000 is constructed in DCDiag, if no Error EXXXX and no Warning WXXXX ocurred -> O000 must not be part of machineEventSet (e.g. O000 can not be reset) --- src/ATBAPP/DeviceControllerDiag.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/ATBAPP/DeviceControllerDiag.cpp b/src/ATBAPP/DeviceControllerDiag.cpp index ee56198..fdcde55 100644 --- a/src/ATBAPP/DeviceControllerDiag.cpp +++ b/src/ATBAPP/DeviceControllerDiag.cpp @@ -419,7 +419,10 @@ void DeviceControllerDiag::sub_componentAssessment() } if (flag_sendOperate) { - this->private_setDiagEvent(DeviceController::State::O000); + // O000 must not be part of event set + DCMachineEvent O000DCMachineEvent = DCMachineEvent(DeviceController::State::O000, + QUuid::createUuid().toString(QUuid::WithoutBraces).mid(0, 8)); + this->private_sendDiagEvent(O000DCMachineEvent, DeviceController::Action::SET); } From 6bd02f18313d6720e99a02d7d87113db983bf965 Mon Sep 17 00:00:00 2001 From: Siegfried Siegert Date: Tue, 13 May 2025 12:25:18 +0200 Subject: [PATCH 05/20] Diag: care about EventSet.clear() (-> TEST / TODO) --- src/ATBAPP/ATBDeviceControllerPlugin.cpp | 2 -- src/ATBAPP/DeviceControllerDiag.cpp | 1 - 2 files changed, 3 deletions(-) diff --git a/src/ATBAPP/ATBDeviceControllerPlugin.cpp b/src/ATBAPP/ATBDeviceControllerPlugin.cpp index a391783..2f7bce7 100644 --- a/src/ATBAPP/ATBDeviceControllerPlugin.cpp +++ b/src/ATBAPP/ATBDeviceControllerPlugin.cpp @@ -663,8 +663,6 @@ void ATBDeviceControllerPlugin::onCBinAndAllDoorsClosed() { qCritical() << "ATBDeviceControllerPlugin::onCBinAndAllDoorsClosed()"; - this->diag->diagReInit(); - QTimer::singleShot(2000, this, SIGNAL(requestModeIDLE())); this->dbus->finishedBackgroundTask("DOOR_OPEN"); diff --git a/src/ATBAPP/DeviceControllerDiag.cpp b/src/ATBAPP/DeviceControllerDiag.cpp index fdcde55..3fa46e2 100644 --- a/src/ATBAPP/DeviceControllerDiag.cpp +++ b/src/ATBAPP/DeviceControllerDiag.cpp @@ -614,7 +614,6 @@ void DeviceControllerDiag::private_sendDiagEvent(DCMachineEvent result, DeviceCo parameter = "no valid data from DeviceController"; break; case DeviceController::State::O000: // everything is fine - this->machineEventSet.clear(); this->_isErrorState = false; eventClass = EVENT_CLASS::OPERATE; parameter = ""; From 1e5020132fecb75948b4e67151c8faef2597ff2f Mon Sep 17 00:00:00 2001 From: Siegfried Siegert Date: Tue, 13 May 2025 12:26:01 +0200 Subject: [PATCH 06/20] Diag: DEBUG EventSets --- src/ATBAPP/DeviceControllerDiag.cpp | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/ATBAPP/DeviceControllerDiag.cpp b/src/ATBAPP/DeviceControllerDiag.cpp index 3fa46e2..4607433 100644 --- a/src/ATBAPP/DeviceControllerDiag.cpp +++ b/src/ATBAPP/DeviceControllerDiag.cpp @@ -433,8 +433,15 @@ void DeviceControllerDiag::sub_componentAssessment() // Reset events: present in previous but not current QSet resetEvents = this->previousMachineEventSet - this->machineEventSet; + // DEBUG EventSets: + qCritical() << "sub_componentAssessment():"; + qCritical() << " newEvents: " << newEvents.size(); + qCritical() << " resetEvents: " << resetEvents.size(); + + // Triggering Actions // Iterate through the results + for (const DCMachineEvent& event : newEvents) { private_sendDiagEvent(event, DeviceController::Action::SET); // New event detected } @@ -488,6 +495,9 @@ void DeviceControllerDiag::private_setDiagEvent(DeviceController::State result) DCMachineEvent newState = DCMachineEvent(result, QUuid::createUuid().toString(QUuid::WithoutBraces).mid(0, 8)); + // DEBUG + qCritical() << "----> setDiagEvent: " << newState.state << " with id: " << newState.eventId; + machineEventSet.insert(newState); } From c23364874e5194d197c020ec47b980fe44a24851 Mon Sep 17 00:00:00 2001 From: Siegfried Siegert Date: Wed, 11 Jun 2025 11:31:38 +0200 Subject: [PATCH 07/20] Diag: machineEventSet: - do not overwrite previous events, only insert new events (unite) - remove all events not in machineEventSet --- src/ATBAPP/DeviceControllerDiag.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/ATBAPP/DeviceControllerDiag.cpp b/src/ATBAPP/DeviceControllerDiag.cpp index 4607433..e098b02 100644 --- a/src/ATBAPP/DeviceControllerDiag.cpp +++ b/src/ATBAPP/DeviceControllerDiag.cpp @@ -465,7 +465,8 @@ void DeviceControllerDiag::sub_componentAssessment() this->isRequestRunning = false; this->flagInterruptDiag = false; - this->previousMachineEventSet = machineEventSet; + this->previousMachineEventSet.unite(machineEventSet); // add new elements from machineEventSet + this->previousMachineEventSet.intersect(machineEventSet); // remove elements not in machineEventSet if (this->isDiagBackgroundTask) { this->isDiagBackgroundTask = false; From ccc1c6033f4bb70ff369473731d8dc6f939c24a8 Mon Sep 17 00:00:00 2001 From: Siegfried Siegert Date: Wed, 11 Jun 2025 14:13:09 +0200 Subject: [PATCH 08/20] Diag: Send operate O000 as last event (after set/reset events) --- src/ATBAPP/DeviceControllerDiag.cpp | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src/ATBAPP/DeviceControllerDiag.cpp b/src/ATBAPP/DeviceControllerDiag.cpp index e098b02..834dd63 100644 --- a/src/ATBAPP/DeviceControllerDiag.cpp +++ b/src/ATBAPP/DeviceControllerDiag.cpp @@ -418,13 +418,6 @@ void DeviceControllerDiag::sub_componentAssessment() this->private_setDiagEvent(DeviceController::State::W004); } - if (flag_sendOperate) { - // O000 must not be part of event set - DCMachineEvent O000DCMachineEvent = DCMachineEvent(DeviceController::State::O000, - QUuid::createUuid().toString(QUuid::WithoutBraces).mid(0, 8)); - this->private_sendDiagEvent(O000DCMachineEvent, DeviceController::Action::SET); - } - // compare machineEventSets // New events: present in current but not previous @@ -459,6 +452,15 @@ void DeviceControllerDiag::sub_componentAssessment() } qCritical() << "diagReq result: " << DeviceControllerStateStringList; + // send Operate if there is no error + if (flag_sendOperate) { + // O000 must not be part of event set + DCMachineEvent O000DCMachineEvent = DCMachineEvent(DeviceController::State::O000, + QUuid::createUuid().toString(QUuid::WithoutBraces).mid(0, 8)); + this->private_sendDiagEvent(O000DCMachineEvent, DeviceController::Action::SET); + } + + // finish diag this->diagRequestTimeoutTimer->stop(); From ccc2b8120d278efba774a58620ef4317a7c2cc30 Mon Sep 17 00:00:00 2001 From: Siegfried Siegert Date: Thu, 12 Jun 2025 08:32:44 +0200 Subject: [PATCH 09/20] Diag: new constructor for DCMachineEvent --- src/ATBAPP/DeviceControllerDiag.cpp | 14 ++++++++++++++ src/ATBAPP/DeviceControllerDiag.h | 2 +- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/ATBAPP/DeviceControllerDiag.cpp b/src/ATBAPP/DeviceControllerDiag.cpp index 834dd63..e0acf86 100644 --- a/src/ATBAPP/DeviceControllerDiag.cpp +++ b/src/ATBAPP/DeviceControllerDiag.cpp @@ -698,3 +698,17 @@ void DeviceControllerDiag::restartCArun() this->private_setDiagEvent(DeviceController::State::W255); QProcess::startDetached("/bin/systemctl", {"restart", "carun"}); } + + + + +/**************************************************************************************************** + * + * DCMachineEvent + */ +DCMachineEvent::DCMachineEvent(DeviceController::State state) : state(state) +{ + this->eventId = QUuid::createUuid().toString(QUuid::WithoutBraces).mid(0, 8); +} + + diff --git a/src/ATBAPP/DeviceControllerDiag.h b/src/ATBAPP/DeviceControllerDiag.h index 327cf68..41fb91f 100644 --- a/src/ATBAPP/DeviceControllerDiag.h +++ b/src/ATBAPP/DeviceControllerDiag.h @@ -78,7 +78,7 @@ namespace DeviceController { class DCMachineEvent { public: DCMachineEvent() = default; - DCMachineEvent(DeviceController::State state, const QString& id) : state(state), eventId(id) {} + DCMachineEvent(DeviceController::State state); DeviceController::State state; QString eventId; From 18a35acf20f8dc6bfba599ba65543e4e0c311c8d Mon Sep 17 00:00:00 2001 From: Siegfried Siegert Date: Thu, 12 Jun 2025 08:35:00 +0200 Subject: [PATCH 10/20] Diag: add single exit method for ReqDiag --- src/ATBAPP/DeviceControllerDiag.cpp | 15 ++++++++++++++- src/ATBAPP/DeviceControllerDiag.h | 2 ++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/ATBAPP/DeviceControllerDiag.cpp b/src/ATBAPP/DeviceControllerDiag.cpp index e0acf86..d4bb08e 100644 --- a/src/ATBAPP/DeviceControllerDiag.cpp +++ b/src/ATBAPP/DeviceControllerDiag.cpp @@ -130,6 +130,7 @@ void DeviceControllerDiag::private_startDiag() * - diag is called again in ModeOOO wokeup() */ } + this->private_finishDiag(); return; } @@ -174,6 +175,7 @@ void DeviceControllerDiag::sys_superviseSystem() if (this->E255counter > 5) { this->restartCArun(); } else { this->E255counter++; } QTimer::singleShot(400, this, &DeviceControllerDiag::diagRequest); + this->private_finishDiag(); return; } @@ -188,6 +190,7 @@ void DeviceControllerDiag::sys_superviseSystem() if (this->E255counter > 5) { this->restartCArun(); } else { this->E255counter++; } QTimer::singleShot(400, this, &DeviceControllerDiag::diagRequest); + this->private_finishDiag(); return; } @@ -462,7 +465,17 @@ void DeviceControllerDiag::sub_componentAssessment() // finish diag + this->private_finishDiag(); +} +/** + * @brief DeviceControllerDiag::private_finishDiag + * + * Single point to finish a diag process: + * - + */ +void DeviceControllerDiag::private_finishDiag() +{ this->diagRequestTimeoutTimer->stop(); this->isRequestRunning = false; this->flagInterruptDiag = false; @@ -474,10 +487,10 @@ void DeviceControllerDiag::sub_componentAssessment() this->isDiagBackgroundTask = false; this->dbus->finishedBackgroundTask("E255"); } - } + /** * @brief DeviceControllerDiag::private_setDiagEvent * @param result - result value from 'sub_componentAssessment()', diff --git a/src/ATBAPP/DeviceControllerDiag.h b/src/ATBAPP/DeviceControllerDiag.h index 41fb91f..0b4ddf7 100644 --- a/src/ATBAPP/DeviceControllerDiag.h +++ b/src/ATBAPP/DeviceControllerDiag.h @@ -171,6 +171,8 @@ private slots: void private_setDiagEvent(DeviceController::State result); void private_sendDiagEvent(DCMachineEvent result, DeviceController::Action action); + void private_finishDiag(); + void sys_superviseSystem(); }; From f75f2c57df5cc3a00366375b557d137fdb262e94 Mon Sep 17 00:00:00 2001 From: Siegfried Siegert Date: Thu, 12 Jun 2025 08:35:58 +0200 Subject: [PATCH 11/20] Diag: E255 / W255 / M0254 -> set, send and finish diag This states are rather meta infos about dc condition. Therefore the where created and sent outside of superviseSystem()-method. This commit should ensure that: - this states are sent to ISMAS - this states are inserted in machineEventSet in order to enable a reset in next diagRun --- src/ATBAPP/DeviceControllerDiag.cpp | 35 +++++++++++++++++------------ 1 file changed, 21 insertions(+), 14 deletions(-) diff --git a/src/ATBAPP/DeviceControllerDiag.cpp b/src/ATBAPP/DeviceControllerDiag.cpp index d4bb08e..d09b831 100644 --- a/src/ATBAPP/DeviceControllerDiag.cpp +++ b/src/ATBAPP/DeviceControllerDiag.cpp @@ -111,9 +111,9 @@ void DeviceControllerDiag::private_startDiag() // check for DiagRequestTimeoutTimerTimeout: if (this->flagInterruptDiag) { qCritical() << "DeviceControllerDiag::private_startDiag() interrupted!"; - this->private_setDiagEvent(DeviceController::State::E255); - this->isRequestRunning = false; - this->flagInterruptDiag = false; + DCMachineEvent E255Event = DCMachineEvent(DeviceController::State::E255); + machineEventSet.insert(E255Event); + private_sendDiagEvent(E255Event, DeviceController::Action::SET); if (this->E255counter > 5) { this->restartCArun(); // try it again, until success: @@ -169,9 +169,10 @@ void DeviceControllerDiag::sys_superviseSystem() // check for DiagRequestTimeoutTimerTimeout: if (this->flagInterruptDiag) { qCritical() << "DeviceControllerDiag::sys_superviseSystem() interrupted!"; - this->private_setDiagEvent(DeviceController::State::E255); - this->flagInterruptDiag = false; - this->isRequestRunning = false; + // send + DCMachineEvent E255Event = DCMachineEvent(DeviceController::State::E255); + machineEventSet.insert(E255Event); + private_sendDiagEvent(E255Event, DeviceController::Action::SET); if (this->E255counter > 5) { this->restartCArun(); } else { this->E255counter++; } QTimer::singleShot(400, this, &DeviceControllerDiag::diagRequest); @@ -184,9 +185,11 @@ void DeviceControllerDiag::sys_superviseSystem() // es gibt keinerlei gültige Daten vom DC qCritical() << "DeviceControllerDiag::sys_superviseSystem() no valid data!"; hw->dc_autoRequest(true); - this->private_setDiagEvent(DeviceController::State::M0254); - this->diagRequestTimeoutTimer->stop(); - this->isRequestRunning = false; + + DCMachineEvent E255Event = DCMachineEvent(DeviceController::State::M0254); + machineEventSet.insert(E255Event); + private_sendDiagEvent(E255Event, DeviceController::Action::SET); + if (this->E255counter > 5) { this->restartCArun(); } else { this->E255counter++; } QTimer::singleShot(400, this, &DeviceControllerDiag::diagRequest); @@ -457,9 +460,8 @@ void DeviceControllerDiag::sub_componentAssessment() // send Operate if there is no error if (flag_sendOperate) { - // O000 must not be part of event set - DCMachineEvent O000DCMachineEvent = DCMachineEvent(DeviceController::State::O000, - QUuid::createUuid().toString(QUuid::WithoutBraces).mid(0, 8)); + // O000 must not be part of machineEventSet + DCMachineEvent O000DCMachineEvent = DCMachineEvent(DeviceController::State::O000); this->private_sendDiagEvent(O000DCMachineEvent, DeviceController::Action::SET); } @@ -509,7 +511,7 @@ void DeviceControllerDiag::private_setDiagEvent(DeviceController::State result) return; } - DCMachineEvent newState = DCMachineEvent(result, QUuid::createUuid().toString(QUuid::WithoutBraces).mid(0, 8)); + DCMachineEvent newState = DCMachineEvent(result); // DEBUG qCritical() << "----> setDiagEvent: " << newState.state << " with id: " << newState.eventId; @@ -708,7 +710,12 @@ void DeviceControllerDiag::private_sendDiagEvent(DCMachineEvent result, DeviceCo void DeviceControllerDiag::restartCArun() { this->E255counter = 0; - this->private_setDiagEvent(DeviceController::State::W255); + + + DCMachineEvent W255Event = DCMachineEvent(DeviceController::State::W255); + machineEventSet.insert(W255Event); + private_sendDiagEvent(W255Event, DeviceController::Action::SET); + QProcess::startDetached("/bin/systemctl", {"restart", "carun"}); } From b34716ef937b1a2c9d56313430fe545f4f8e283e Mon Sep 17 00:00:00 2001 From: Siegfried Siegert Date: Thu, 12 Jun 2025 08:40:59 +0200 Subject: [PATCH 12/20] Minor: order debug output --- src/ATBAPP/DeviceControllerDiag.cpp | 28 ++++++++++++---------------- 1 file changed, 12 insertions(+), 16 deletions(-) diff --git a/src/ATBAPP/DeviceControllerDiag.cpp b/src/ATBAPP/DeviceControllerDiag.cpp index d09b831..d57522c 100644 --- a/src/ATBAPP/DeviceControllerDiag.cpp +++ b/src/ATBAPP/DeviceControllerDiag.cpp @@ -436,28 +436,24 @@ void DeviceControllerDiag::sub_componentAssessment() qCritical() << "sub_componentAssessment():"; qCritical() << " newEvents: " << newEvents.size(); qCritical() << " resetEvents: " << resetEvents.size(); - - - // Triggering Actions - // Iterate through the results - - for (const DCMachineEvent& event : newEvents) { - private_sendDiagEvent(event, DeviceController::Action::SET); // New event detected - } - - // send reset - for (const DCMachineEvent& event : resetEvents) { - private_sendDiagEvent(event, DeviceController::Action::RESET); // Event no longer present - } - - // DEBUG - // print all current states QStringList DeviceControllerStateStringList; for (const DCMachineEvent& event : this->machineEventSet) { DeviceControllerStateStringList.append(QMetaEnum::fromType().valueToKey(event.state)); } qCritical() << "diagReq result: " << DeviceControllerStateStringList; + // Triggering Actions + // Iterate through the results + // send SET: + for (const DCMachineEvent& event : newEvents) { + private_sendDiagEvent(event, DeviceController::Action::SET); // New event detected + } + + // send RESET: + for (const DCMachineEvent& event : resetEvents) { + private_sendDiagEvent(event, DeviceController::Action::RESET); // Event no longer present + } + // send Operate if there is no error if (flag_sendOperate) { // O000 must not be part of machineEventSet From 8d03926de481b49bd92d9b6547c16bb5ee88e4f0 Mon Sep 17 00:00:00 2001 From: Siegfried Siegert Date: Thu, 12 Jun 2025 10:24:25 +0200 Subject: [PATCH 13/20] Diag: do no clear machineEventSet on diagRequest --- src/ATBAPP/DeviceControllerDiag.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ATBAPP/DeviceControllerDiag.cpp b/src/ATBAPP/DeviceControllerDiag.cpp index d57522c..11ab664 100644 --- a/src/ATBAPP/DeviceControllerDiag.cpp +++ b/src/ATBAPP/DeviceControllerDiag.cpp @@ -45,6 +45,7 @@ void DeviceControllerDiag::init(hwinf *hw, DBusControllerInterface *dbus, QObjec void DeviceControllerDiag::diagReInit() { this->machineEventSet.clear(); + this->previousMachineEventSet.clear(); this->_isErrorState = false; } @@ -61,7 +62,6 @@ void DeviceControllerDiag::diagRequest() qCritical() << "DeviceControllerDiag::diagRequest() is already running"; return; } - this->machineEventSet.clear(); this->isRequestRunning = true; this->diagRequestTimeoutTimer->start(); From 3bef73ce4bfa608a7deab967ddce67e8959d083a Mon Sep 17 00:00:00 2001 From: Siegfried Siegert Date: Thu, 12 Jun 2025 10:37:26 +0200 Subject: [PATCH 14/20] Diag: remove E255 / W255 on valid data --- src/ATBAPP/DeviceControllerDiag.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/ATBAPP/DeviceControllerDiag.cpp b/src/ATBAPP/DeviceControllerDiag.cpp index 11ab664..be93ab3 100644 --- a/src/ATBAPP/DeviceControllerDiag.cpp +++ b/src/ATBAPP/DeviceControllerDiag.cpp @@ -139,6 +139,8 @@ void DeviceControllerDiag::private_startDiag() if (result) { qCritical() << "DeviceControllerDiag::private_startDiag() DCdata is valid"; + this->machineEventSet.remove(DCMachineEvent(DeviceController::State::E255)); + this->machineEventSet.remove(DCMachineEvent(DeviceController::State::W255)); QTimer::singleShot(200, this, &DeviceControllerDiag::sys_superviseSystem); } else { From 91d8eb03b3ec876d8bbc7886a5a1978b3f98d88d Mon Sep 17 00:00:00 2001 From: Siegfried Siegert Date: Thu, 12 Jun 2025 10:50:29 +0200 Subject: [PATCH 15/20] Diag: clear machineEventSet on diagRequest --- src/ATBAPP/DeviceControllerDiag.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/ATBAPP/DeviceControllerDiag.cpp b/src/ATBAPP/DeviceControllerDiag.cpp index be93ab3..94ce4c9 100644 --- a/src/ATBAPP/DeviceControllerDiag.cpp +++ b/src/ATBAPP/DeviceControllerDiag.cpp @@ -62,6 +62,7 @@ void DeviceControllerDiag::diagRequest() qCritical() << "DeviceControllerDiag::diagRequest() is already running"; return; } + this->machineEventSet.clear(); this->isRequestRunning = true; this->diagRequestTimeoutTimer->start(); From cc6dfee0e29eea2d861d4cb59fe87c3f68306201 Mon Sep 17 00:00:00 2001 From: Siegfried Siegert Date: Thu, 12 Jun 2025 16:33:32 +0200 Subject: [PATCH 16/20] Diag: set E255 only once --- src/ATBAPP/DeviceControllerDiag.cpp | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/ATBAPP/DeviceControllerDiag.cpp b/src/ATBAPP/DeviceControllerDiag.cpp index 94ce4c9..bc47ec4 100644 --- a/src/ATBAPP/DeviceControllerDiag.cpp +++ b/src/ATBAPP/DeviceControllerDiag.cpp @@ -113,8 +113,10 @@ void DeviceControllerDiag::private_startDiag() if (this->flagInterruptDiag) { qCritical() << "DeviceControllerDiag::private_startDiag() interrupted!"; DCMachineEvent E255Event = DCMachineEvent(DeviceController::State::E255); - machineEventSet.insert(E255Event); - private_sendDiagEvent(E255Event, DeviceController::Action::SET); + if (!this->previousMachineEventSet.contains(E255Event)) { + machineEventSet.insert(E255Event); + private_sendDiagEvent(E255Event, DeviceController::Action::SET); + } if (this->E255counter > 5) { this->restartCArun(); // try it again, until success: @@ -174,8 +176,10 @@ void DeviceControllerDiag::sys_superviseSystem() qCritical() << "DeviceControllerDiag::sys_superviseSystem() interrupted!"; // send DCMachineEvent E255Event = DCMachineEvent(DeviceController::State::E255); - machineEventSet.insert(E255Event); - private_sendDiagEvent(E255Event, DeviceController::Action::SET); + if (!this->previousMachineEventSet.contains(E255Event)) { + machineEventSet.insert(E255Event); + private_sendDiagEvent(E255Event, DeviceController::Action::SET); + } if (this->E255counter > 5) { this->restartCArun(); } else { this->E255counter++; } QTimer::singleShot(400, this, &DeviceControllerDiag::diagRequest); From fe3696ce9c376da5c75ccc098654467746fb06a6 Mon Sep 17 00:00:00 2001 From: Siegfried Siegert Date: Tue, 24 Jun 2025 14:18:35 +0200 Subject: [PATCH 17/20] Diag: E255 - handle E255 in previousMachineEventSet (because machineEventSet will be cleared regularely) - do not call finishDiag() on E255 because this will interscect previous- with current machineEventSet and thus remove all Errors/ Warnings because machineEventSet was cleared and includes only E255! --- src/ATBAPP/DeviceControllerDiag.cpp | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/src/ATBAPP/DeviceControllerDiag.cpp b/src/ATBAPP/DeviceControllerDiag.cpp index bc47ec4..1af4ff3 100644 --- a/src/ATBAPP/DeviceControllerDiag.cpp +++ b/src/ATBAPP/DeviceControllerDiag.cpp @@ -114,7 +114,7 @@ void DeviceControllerDiag::private_startDiag() qCritical() << "DeviceControllerDiag::private_startDiag() interrupted!"; DCMachineEvent E255Event = DCMachineEvent(DeviceController::State::E255); if (!this->previousMachineEventSet.contains(E255Event)) { - machineEventSet.insert(E255Event); + previousMachineEventSet.insert(E255Event); private_sendDiagEvent(E255Event, DeviceController::Action::SET); } if (this->E255counter > 5) { @@ -133,7 +133,9 @@ void DeviceControllerDiag::private_startDiag() * - diag is called again in ModeOOO wokeup() */ } - this->private_finishDiag(); + this->diagRequestTimeoutTimer->stop(); + this->isRequestRunning = false; + this->flagInterruptDiag = false; return; } @@ -177,13 +179,15 @@ void DeviceControllerDiag::sys_superviseSystem() // send DCMachineEvent E255Event = DCMachineEvent(DeviceController::State::E255); if (!this->previousMachineEventSet.contains(E255Event)) { - machineEventSet.insert(E255Event); + previousMachineEventSet.insert(E255Event); private_sendDiagEvent(E255Event, DeviceController::Action::SET); } if (this->E255counter > 5) { this->restartCArun(); } else { this->E255counter++; } QTimer::singleShot(400, this, &DeviceControllerDiag::diagRequest); - this->private_finishDiag(); + this->diagRequestTimeoutTimer->stop(); + this->isRequestRunning = false; + this->flagInterruptDiag = false; return; } @@ -194,13 +198,15 @@ void DeviceControllerDiag::sys_superviseSystem() hw->dc_autoRequest(true); DCMachineEvent E255Event = DCMachineEvent(DeviceController::State::M0254); - machineEventSet.insert(E255Event); + previousMachineEventSet.insert(E255Event); private_sendDiagEvent(E255Event, DeviceController::Action::SET); if (this->E255counter > 5) { this->restartCArun(); } else { this->E255counter++; } QTimer::singleShot(400, this, &DeviceControllerDiag::diagRequest); - this->private_finishDiag(); + this->diagRequestTimeoutTimer->stop(); + this->isRequestRunning = false; + this->flagInterruptDiag = false; return; } From 40acd0e0c4007817f55200ff5bfdf376173b5b63 Mon Sep 17 00:00:00 2001 From: Siegfried Siegert Date: Thu, 12 Jun 2025 16:33:32 +0200 Subject: [PATCH 18/20] Diag: set E255 only once --- src/ATBAPP/DeviceControllerDiag.cpp | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/ATBAPP/DeviceControllerDiag.cpp b/src/ATBAPP/DeviceControllerDiag.cpp index be93ab3..50c951f 100644 --- a/src/ATBAPP/DeviceControllerDiag.cpp +++ b/src/ATBAPP/DeviceControllerDiag.cpp @@ -112,8 +112,10 @@ void DeviceControllerDiag::private_startDiag() if (this->flagInterruptDiag) { qCritical() << "DeviceControllerDiag::private_startDiag() interrupted!"; DCMachineEvent E255Event = DCMachineEvent(DeviceController::State::E255); - machineEventSet.insert(E255Event); - private_sendDiagEvent(E255Event, DeviceController::Action::SET); + if (!this->previousMachineEventSet.contains(E255Event)) { + machineEventSet.insert(E255Event); + private_sendDiagEvent(E255Event, DeviceController::Action::SET); + } if (this->E255counter > 5) { this->restartCArun(); // try it again, until success: @@ -173,8 +175,10 @@ void DeviceControllerDiag::sys_superviseSystem() qCritical() << "DeviceControllerDiag::sys_superviseSystem() interrupted!"; // send DCMachineEvent E255Event = DCMachineEvent(DeviceController::State::E255); - machineEventSet.insert(E255Event); - private_sendDiagEvent(E255Event, DeviceController::Action::SET); + if (!this->previousMachineEventSet.contains(E255Event)) { + machineEventSet.insert(E255Event); + private_sendDiagEvent(E255Event, DeviceController::Action::SET); + } if (this->E255counter > 5) { this->restartCArun(); } else { this->E255counter++; } QTimer::singleShot(400, this, &DeviceControllerDiag::diagRequest); From 1165c4b92f3f6af49dc294fb8376a41509569770 Mon Sep 17 00:00:00 2001 From: Siegfried Siegert Date: Tue, 24 Jun 2025 15:03:21 +0200 Subject: [PATCH 19/20] Diag: set W255 only once --- src/ATBAPP/DeviceControllerDiag.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/ATBAPP/DeviceControllerDiag.cpp b/src/ATBAPP/DeviceControllerDiag.cpp index 50c951f..f276126 100644 --- a/src/ATBAPP/DeviceControllerDiag.cpp +++ b/src/ATBAPP/DeviceControllerDiag.cpp @@ -715,8 +715,10 @@ void DeviceControllerDiag::restartCArun() DCMachineEvent W255Event = DCMachineEvent(DeviceController::State::W255); - machineEventSet.insert(W255Event); - private_sendDiagEvent(W255Event, DeviceController::Action::SET); + if (!this->previousMachineEventSet.contains(W255Event)) { + machineEventSet.insert(W255Event); + private_sendDiagEvent(W255Event, DeviceController::Action::SET); + } QProcess::startDetached("/bin/systemctl", {"restart", "carun"}); } From e1470d13f15aede168e1ddca9e67a51be6ce58c3 Mon Sep 17 00:00:00 2001 From: Siegfried Siegert Date: Tue, 24 Jun 2025 15:18:45 +0200 Subject: [PATCH 20/20] Diag: clear machine machineEventSet on valid data This is allowed only here: dc-data is valid (i.e. check for E255 was sucessfull). This method sub_componentAssessment() will check all criteria of dc-module conditions. --- src/ATBAPP/DeviceControllerDiag.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/ATBAPP/DeviceControllerDiag.cpp b/src/ATBAPP/DeviceControllerDiag.cpp index f276126..80256ea 100644 --- a/src/ATBAPP/DeviceControllerDiag.cpp +++ b/src/ATBAPP/DeviceControllerDiag.cpp @@ -231,6 +231,8 @@ void DeviceControllerDiag::sys_superviseSystem() void DeviceControllerDiag::sub_componentAssessment() { + this->machineEventSet.clear(); + bool flag_sendOperate = true; struct T_moduleCondition modCond = {};