From b05d6fdd7366d2941f712ef38762541b89abd2ab Mon Sep 17 00:00:00 2001 From: zhaohe Date: Sun, 18 Aug 2024 22:32:11 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=BC=82=E5=B8=B8=E6=A3=80?= =?UTF-8?q?=E6=B5=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- appsrc/appbase/appbean/disinfection_state.hpp | 3 +- .../appevent/app_disinfection_snapshot_event.hpp | 11 ++-- .../disinfection_ctrl_service.cpp | 26 +++++++- .../disinfection_ctrl_service.hpp | 4 +- appsrc/service/app_core.cpp | 73 +++++++++++++++++++--- appsrc/service/app_core.hpp | 32 ++++++++-- 6 files changed, 125 insertions(+), 24 deletions(-) diff --git a/appsrc/appbase/appbean/disinfection_state.hpp b/appsrc/appbase/appbean/disinfection_state.hpp index cdebcbc..cc2bf67 100644 --- a/appsrc/appbase/appbean/disinfection_state.hpp +++ b/appsrc/appbase/appbean/disinfection_state.hpp @@ -12,6 +12,7 @@ marco(type, dehumidificationBeforeDisinfection) /**/ \ marco(type, dehumidificationAfterDisinfection) /**/ \ marco(type, emptyLiquidFromTheLine) /**/ \ - marco(type, finished) /**/ + marco(type, finished) /**/ \ + marco(type, error) /**/ ZENUM_DECLAR(DisinfectionState, DisinfectionState_LIST); diff --git a/appsrc/appbase/appevent/app_disinfection_snapshot_event.hpp b/appsrc/appbase/appevent/app_disinfection_snapshot_event.hpp index 0af314b..2b62744 100644 --- a/appsrc/appbase/appevent/app_disinfection_snapshot_event.hpp +++ b/appsrc/appbase/appevent/app_disinfection_snapshot_event.hpp @@ -13,12 +13,13 @@ class DisinfectionStateSnapshot { shared_ptr h2o2Snapshot; - float dval; - float nlog; - float tlog; + float dval = 0; + float nlog = 0; + float tlog = 0; - int remainDisinfectant; - int remainTime; + int remainDisinfectant = 0; + int remainTime = 0; + int ecode = 0; }; class AppDisinfectionSnapshotEvent : public IAppEvent { diff --git a/appsrc/service/app/disinfection_ctrl/disinfection_ctrl_service.cpp b/appsrc/service/app/disinfection_ctrl/disinfection_ctrl_service.cpp index 79aa427..2629034 100644 --- a/appsrc/service/app/disinfection_ctrl/disinfection_ctrl_service.cpp +++ b/appsrc/service/app/disinfection_ctrl/disinfection_ctrl_service.cpp @@ -186,7 +186,7 @@ void DisinfectionCtrlService::checkBeforeStart() { THROW_APP_EXCEPTION(err::kappe_sensor_is_pre_hearting, ""); } - if (m_thread&&!m_thread->isWaitingForJoin()) { + if (m_thread && !m_thread->isWaitingForJoin()) { THROW_APP_EXCEPTION(err::kappe_disinfection_state_is_wrong, ""); } @@ -264,7 +264,7 @@ void DisinfectionCtrlService::logState() { snapshot->remainTime = s_remaintime; snapshot->remainDisinfectant = dwus->getWeight(); snapshot->h2o2Snapshot = s_h2o2Snapshot; - + snapshot->ecode = s_error; AppEventBus::ins()->push(make_shared(snapshot)); } void DisinfectionCtrlService::traceState() { @@ -391,6 +391,7 @@ void DisinfectionCtrlService::processStateInit(DisinfectionEvent* event) { s_start_steady_tp = zsteady_clock().now(); s_afterDisinfectantVolume_g = 0; s_beforeDisinfectantVolume_g = dwus->getWeight(); + s_error = 0; AppEventBus::ins()->push(make_shared(s_sessionId)); GET_SERVICE(WarningLightControler)->setworkFlag(true); @@ -530,6 +531,19 @@ void DisinfectionCtrlService::processStateDisinfection(DisinfectionEvent* event) */ changeToNextState(); } + + if (dics->WaterSensor_readDeviceBottom()) { + logger->error("kappe_the_bottom_of_the_device_has_water"); + s_error = err::kappe_the_bottom_of_the_device_has_water; + sm.changeState(DisinfectionState::error); + } + + if (dics->WaterSensor_readEvaporationBin()) { + logger->error("kappe_the_evaporation_bin_has_water"); + s_error = err::kappe_the_evaporation_bin_has_water; + sm.changeState(DisinfectionState::error); + } + // AppEventBus if (PORT.isHasDisinfectantBucket()) { if (dwus->getWeight() < 10) { @@ -647,3 +661,11 @@ void DisinfectionCtrlService::processStateFinished(DisinfectionEvent* event) { } } } +void DisinfectionCtrlService::processStateError(DisinfectionEvent* event) { + if (event->event == kevent_enter_state) { + tryLogState(true); + logger->error("error state {}", s_error); + AppEventBus::ins()->push(make_shared(s_error)); + sm.changeState(DisinfectionState::finished); + } +} diff --git a/appsrc/service/app/disinfection_ctrl/disinfection_ctrl_service.hpp b/appsrc/service/app/disinfection_ctrl/disinfection_ctrl_service.hpp index 87bba55..bef0d67 100644 --- a/appsrc/service/app/disinfection_ctrl/disinfection_ctrl_service.hpp +++ b/appsrc/service/app/disinfection_ctrl/disinfection_ctrl_service.hpp @@ -48,7 +48,7 @@ class DisinfectionCtrlService : public enable_shared_from_thisenQueue([this]() { // sleep(5); logger->warn("AppCore::onException:{},force stop device", DS->getAppExceptionMessage()); GET_SERVICE(DeviceIoControlService)->forceStopDeviceWithoutExc(); }); + + insertPrompt(Prompt::createWarning(ecode2str(ecode))); + onDeviceStateChange(); + }); + // shared_ptr + AppEventBus::ins()->onEvent.connect([this](shared_ptr event) { + auto appWarningPromoptEvent = dynamic_pointer_cast(event); + if (appWarningPromoptEvent) { + insertPrompt(Prompt::createWarning(ecode2str(appWarningPromoptEvent->getEcode()))); + onDeviceStateChange(); + return; + } + auto appPromoptEvent = dynamic_pointer_cast(event); + if (appPromoptEvent) { + insertPrompt(Prompt::createInfo(appPromoptEvent->getMessage())); + onDeviceStateChange(); + return; + } }); }; void AppCore::getState(shared_ptr cxt) { - // - auto& content = cxt->content; + lock_guard lock(warningPromptListMutex); + auto& content = cxt->content; content["state"] = DS->getDeviceState(); @@ -117,10 +135,47 @@ void AppCore::getState(shared_ptr cxt) { content["estate"]["ecode"] = DS->getAppExceptionCode(); content["estate"]["state"] = DS->getAppExceptionFlag(); content["estate"]["emessage"] = DS->getAppExceptionMessage(); + + content["promptNum"] = warningPromptList.size(); } -void AppCore::loop() { - /** - * @brief - */ +void AppCore::promptConfirm(shared_ptr cxt) { + lock_guard lock(warningPromptListMutex); + string promptId = cxt->params["promptId"]; + + for (auto it = warningPromptList.begin(); it != warningPromptList.end(); it++) { + if ((*it)->promptId == promptId) { + warningPromptList.erase(it); + break; + } + } + GET_SERVICE(WarningLightControler)->setwarningFlag(false); +} + +void AppCore::promptGetAll(shared_ptr cxt) { + lock_guard lock(warningPromptListMutex); + auto content = cxt->content; + content["prompts"] = json::array(); + for (auto& p : warningPromptList) { + content["warningPromptList"].push_back(*p); + } +} + +void AppCore::promptGetNext(shared_ptr cxt) { + lock_guard lock(warningPromptListMutex); + auto content = cxt->content; + if (warningPromptList.size() > 0) { + content["warningPrompt"] = *warningPromptList.front(); + } +} + +void AppCore::loop() {} +void AppCore::onDeviceStateChange() { + json content; + SEND_CLASS_REPORT("AppCore", "onDeviceStateChange", content); +} +void AppCore::insertPrompt(shared_ptr prompt) { + lock_guard lock(warningPromptListMutex); + warningPromptList.push_back(prompt); + if (prompt->isWarning) GET_SERVICE(WarningLightControler)->setwarningFlag(true); } diff --git a/appsrc/service/app_core.hpp b/appsrc/service/app_core.hpp index 31e9b2f..6ffb3d7 100644 --- a/appsrc/service/app_core.hpp +++ b/appsrc/service/app_core.hpp @@ -33,18 +33,30 @@ namespace iflytop { using namespace std; using namespace core; -class WarningPrompt { +class Prompt { public: - string promptId; - string message; - bool confirmedByUser; + string promptId = UUID().toString(); + bool isWarning = false; + string message = ""; + string extMessage = ""; + bool confirmedByUser = false; + + Prompt(bool isWarning, string message) : isWarning(isWarning), message(message) {} + + NLOHMANN_DEFINE_TYPE_INTRUSIVE(Prompt, promptId, message, extMessage, confirmedByUser, isWarning); + + static shared_ptr createWarning(string message) { return make_shared(true, message); } + static shared_ptr createInfo(string message) { return make_shared(false, message); } }; class AppCore : public enable_shared_from_this { THISCLASS(AppCore); - unique_ptr wq; - list> warningPromptList; + unique_ptr wq; + list> warningPromptList; + recursive_mutex warningPromptListMutex; + + steady_clock::time_point lastUsrConfirmTime; public: AppCore() {}; @@ -53,8 +65,16 @@ class AppCore : public enable_shared_from_this { private: void getState(shared_ptr cxt); + void promptConfirm(shared_ptr cxt); + void promptGetAll(shared_ptr cxt); + void promptGetNext(shared_ptr cxt); + // void warningPro(); void dosystem(string order, bool dump); void loop(); + + private: + void onDeviceStateChange(); + void insertPrompt(shared_ptr prompt); }; } // namespace iflytop \ No newline at end of file