diff --git a/app_protocols/appexception/appexception.hpp b/app_protocols/appexception/appexception.hpp index 0d946bd..d7e1522 100644 --- a/app_protocols/appexception/appexception.hpp +++ b/app_protocols/appexception/appexception.hpp @@ -3,6 +3,7 @@ // #pragma once +#include #include #include @@ -25,39 +26,62 @@ using namespace std; class appexception : public std::exception { public: - string description; + int32_t ecode; + string fromClass; + string fromFn; string traceinfo; - string whatstr; - int32_t m_ecode; + string description; + + // + string whatstr; + static std::string printStackTrace() { + std::string ret = ""; + void *callstack[128]; + int frames = backtrace(callstack, sizeof(callstack) / sizeof(callstack[0])); + char **strs = backtrace_symbols(callstack, frames); + + if (strs == NULL) { + return ret; + } + // 从1开始,是不输出最后一层printStackTrace函数的调用信息 + for (int i = 1; i < frames; ++i) { + ret.append(std::string(strs[i])); + ret.append("\n"); + } + + free(strs); + return ret; + } + + appexception() {} appexception(ThisClass &thisclass, string func, int32_t ecode, const string &description) { this->description = description; - this->m_ecode = ecode; - this->whatstr = fmt::format("[FROM {}:{}],exception:{} {}", thisclass.className, func, ecode2str(ecode), description); - // thisclass.logger->error(whatstr); - } + this->ecode = ecode; + this->fromClass = thisclass.className; + this->fromFn = func; + this->traceinfo = printStackTrace(); - appexception(ThisClass &thisclass, string func, int32_t ecode, const char *fmt, ...) { - va_list args; - va_start(args, fmt); - char buffer[1024]; - vsnprintf(buffer, sizeof(buffer), fmt, args); + string info; + info += fmt::format("ecode:{}\n", ecode); + info += fmt::format("fromClass:{}\n", fromClass); + info += fmt::format("fromFn:{}\n", fromFn); + info += fmt::format("description:{}\n", description); + info += fmt::format("traceInfo:{}\n", traceinfo); + whatstr = info; - this->description = buffer; - this->m_ecode = ecode; - this->whatstr = fmt::format("[FROM {}:{}],exception:{} {}", thisclass.className, func, ecode2str(ecode), buffer); // thisclass.logger->error(whatstr); } virtual ~appexception() {} - int ecode() const { return m_ecode; } + int getEcode() const { return ecode; } const char *what() const _GLIBCXX_USE_NOEXCEPT { return whatstr.c_str(); } }; -#define APPCHECK(expr, ecode, fmt, ...) \ - if (!(expr)) { \ - THROW_APP_EXCEPTION(ecode, fmt, ##__VA_ARGS__); \ +#define APPCHECK(expr, ecode, info) \ + if (!(expr)) { \ + THROW_APP_EXCEPTION(ecode, info); \ } -#define THROW_APP_EXCEPTION(ecode, fmt, ...) throw appexception(thisClass, __FUNCTION__, ecode, fmt, ##__VA_ARGS__); +#define THROW_APP_EXCEPTION(ecode, info) throw appexception(thisClass, __FUNCTION__, ecode, info); } // namespace iflytop \ No newline at end of file diff --git a/app_protocols/transmit_disfection_protocol b/app_protocols/transmit_disfection_protocol index aee8641..6fb781e 160000 --- a/app_protocols/transmit_disfection_protocol +++ b/app_protocols/transmit_disfection_protocol @@ -1 +1 @@ -Subproject commit aee8641e56d8b337ba7f151e7fc8b216fdc94862 +Subproject commit 6fb781e6b5fe8f4f44c7046b30cbee47512f5bd9 diff --git a/appdep/iflytop/core/spdlogfactory/logger_factory.cpp b/appdep/iflytop/core/spdlogfactory/logger_factory.cpp index 34b416e..24a3818 100644 --- a/appdep/iflytop/core/spdlogfactory/logger_factory.cpp +++ b/appdep/iflytop/core/spdlogfactory/logger_factory.cpp @@ -246,13 +246,13 @@ static bool mkdirIfNotExist(const string& path) { class LoggerAndSinks { public: - string loggerName; + string loggerName; set sinkNames; }; /****************************************************************************************************/ -static map s_sinks = {}; -static map> s_loggers = {}; +static map s_sinks = {}; +static map> s_loggers = {}; static set> s_loggerAndSinks = {}; static void insertLogger(shared_ptr var_logger) { @@ -288,8 +288,7 @@ static level::level_enum to_level(int value) { case SPDLOG_LEVEL_CRITICAL: return level::critical; default: - spdlog::critical("level is out of range {} level must in [{},{}]", value, SPDLOG_LEVEL_TRACE, - SPDLOG_LEVEL_CRITICAL); + spdlog::critical("level is out of range {} level must in [{},{}]", value, SPDLOG_LEVEL_TRACE, SPDLOG_LEVEL_CRITICAL); exit(-1); break; } @@ -298,7 +297,7 @@ static level::level_enum to_level(int value) { // #define GET(type,value,error_msg,...) #define TRY_GET(type, value_name, default_value) type value_name = tryGet(j, #value_name, default_value) -#define GET(T, value_name) T value_name = j.at(#value_name).get(); +#define GET(T, value_name) T value_name = j.at(#value_name).get(); static void logger_common_config(logger_t var_logger, json j) { TRY_GET(int, level, 2); @@ -309,7 +308,7 @@ static void logger_common_config(logger_t var_logger, json j) { if (!sinks.empty()) { shared_ptr las(new LoggerAndSinks()); las->loggerName = var_logger->name(); - las->sinkNames = sinks; + las->sinkNames = sinks; s_loggerAndSinks.insert(las); } } @@ -340,7 +339,7 @@ LOGGER_ENABLE_END(daily_logger_mt) LOGGER_ENABLE_BEGIN(rotating_logger_mt) { GET(string, filename); mkdirIfNotExist(filename); - TRY_GET(int, max_file_size, 1024*1024); + TRY_GET(int, max_file_size, 10 * 1024 * 1024); TRY_GET(int, max_files, 3); TRY_GET(bool, rotate_on_open, true); var_logger = spdlog::rotating_logger_mt(name, filename, max_file_size, max_files, rotate_on_open); @@ -397,7 +396,7 @@ SINK_DEFINE_END(daily_file_sink_mt) SINK_DEFINE_BEGIN(rotating_file_sink_mt) { GET(string, filename); mkdirIfNotExist(filename); - TRY_GET(int, max_file_size, 1024*1024); + TRY_GET(int, max_file_size, 10 * 1024 * 1024); TRY_GET(int, max_files, 3); TRY_GET(bool, rotate_on_open, true); sink = make_shared(filename, max_file_size, max_files, rotate_on_open); @@ -502,7 +501,7 @@ void core::SpdLoggerFactory::parseSphLogConfig(string path) { s_loggers.clear(); s_loggerAndSinks.clear(); - fstream infile(path, ios::binary | ios::in); + fstream infile(path, ios::binary | ios::in); stringstream sstream; sstream << infile.rdbuf(); infile.close(); diff --git a/appsrc/appbase/appevent/app_warning_promopt_event.hpp b/appsrc/appbase/appevent/app_warning_promopt_event.hpp index 70ea6b0..fcbd5a5 100644 --- a/appsrc/appbase/appevent/app_warning_promopt_event.hpp +++ b/appsrc/appbase/appevent/app_warning_promopt_event.hpp @@ -1,14 +1,30 @@ #pragma once +#include "app_protocols/appexception/appexception.hpp" #include "iapp_event.hpp" namespace iflytop { class AppWarningPromoptEvent : public IAppEvent { private: - int ecode; + int32_t ecode; + string fromClass; + string fromFn; + string traceinfo; + string description; public: AppWarningPromoptEvent(int ecode) : ecode(ecode) {} + AppWarningPromoptEvent(const appexception& e) { + ecode = e.ecode; + fromClass = e.fromClass; + fromFn = e.fromFn; + traceinfo = e.traceinfo; + description = e.description; + } virtual ~AppWarningPromoptEvent() {} - int getEcode() { return ecode; } + int getEcode() { return ecode; } + const string &getFromClass() { return fromClass; } + const string &getFromFn() { return fromFn; } + const string &getTraceinfo() { return traceinfo; } + const string &getDescription() { return description; } }; } // namespace iflytop \ No newline at end of file diff --git a/appsrc/appcomponents/canchannel/com/zscanprotocol_com.cpp b/appsrc/appcomponents/canchannel/com/zscanprotocol_com.cpp index 6e66ca5..8ef715d 100644 --- a/appsrc/appcomponents/canchannel/com/zscanprotocol_com.cpp +++ b/appsrc/appcomponents/canchannel/com/zscanprotocol_com.cpp @@ -202,7 +202,7 @@ shared_ptr ZSCanProtocolCom::callcmd(int32_t to, int32_t cmdid, uint8_t try { receipt = base_callcmd(to, cmdid, param, paramLen, overtime); } catch (const appexception &e) { - if (e.ecode() == err::kerr_overtime) { + if (e.ecode == err::kerr_overtime) { // sl if (i != 0) logger->warn("callcmd cmdid[{}] to [{}] overtime, retry {}", cmdid, to, i); usleep(100 * 1000); diff --git a/appsrc/appsetting/project_port/basic/project_constant.hpp b/appsrc/appsetting/project_port/basic/project_constant.hpp index 964d55d..3e1a98a 100644 --- a/appsrc/appsetting/project_port/basic/project_constant.hpp +++ b/appsrc/appsetting/project_port/basic/project_constant.hpp @@ -1,6 +1,5 @@ #pragma once -#define VERSION "1.0.1" -#define PROJECT_NAME "TRANSMIT_DM" +#include "zappversion.hpp" #define PROJECT_LARGE_SPACE_DM "LargeSpaceDM" #define PROJECT_SMALL_SPACE_DM "SmallSpaceDM" diff --git a/appsrc/appsetting/project_port/basic/zappversion.hpp b/appsrc/appsetting/project_port/basic/zappversion.hpp new file mode 100644 index 0000000..61434cb --- /dev/null +++ b/appsrc/appsetting/project_port/basic/zappversion.hpp @@ -0,0 +1,3 @@ +#pragma once +#define VERSION "1.0.2" +#define PROJECT_NAME "TRANSMIT_DM" \ No newline at end of file diff --git a/appsrc/appsetting/project_port/project_port.cpp b/appsrc/appsetting/project_port/project_port.cpp index f20efa2..8ce6825 100644 --- a/appsrc/appsetting/project_port/project_port.cpp +++ b/appsrc/appsetting/project_port/project_port.cpp @@ -114,28 +114,28 @@ float ProjectPort::ACPostPS_To_Pa(int rawval) { if (isLageSpaceDM() || isSmallSpaceDM() || isPipeDM()) { return rawval / 10.0 * 1000; } else { - THROW_APP_EXCEPTION(err::kappe_code_error, "project [%s(%d)] not support: ", to_string(projectTypeInt).c_str(), projectTypeInt); + THROW_APP_EXCEPTION(err::kappe_code_error, fmt::format( "project [{}({})] not support: ", to_string(projectTypeInt).c_str(), projectTypeInt)); } } float ProjectPort::LiquidWeightPS_To_Pa(int rawval) { if (isLageSpaceDM() || isSmallSpaceDM() || isPipeDM()) { return rawval; } else { - THROW_APP_EXCEPTION(err::kappe_code_error, "project [%s(%d)] not support: ", to_string(projectTypeInt).c_str(), projectTypeInt); + THROW_APP_EXCEPTION(err::kappe_code_error, fmt::format( "project [{}({})] not support: ", to_string(projectTypeInt).c_str(), projectTypeInt)); } } float ProjectPort::SprayPumpPostPS_To_Pa(int rawval) { if (isLageSpaceDM() || isSmallSpaceDM() || isPipeDM()) { return rawval / 10.0 * 1000; } else { - THROW_APP_EXCEPTION(err::kappe_code_error, "project [%s(%d)] not support: ", to_string(projectTypeInt).c_str(), projectTypeInt); + THROW_APP_EXCEPTION(err::kappe_code_error, fmt::format( "project [{}({})] not support: ", to_string(projectTypeInt).c_str(), projectTypeInt)); } } float ProjectPort::AddLiquidPumpPostPS_To_Pa(int rawval) { if (isLageSpaceDM() || isSmallSpaceDM() || isPipeDM()) { return rawval / 10.0 * 1000; } else { - THROW_APP_EXCEPTION(err::kappe_code_error, "project [%s(%d)] not support: ", to_string(projectTypeInt).c_str(), projectTypeInt); + THROW_APP_EXCEPTION(err::kappe_code_error, fmt::format( "project [{}({})] not support: ", to_string(projectTypeInt).c_str(), projectTypeInt)); } } @@ -152,7 +152,7 @@ double ProjectPort::getGpm2SpeedRadio() { } else if (isDrawBarDM()) { gpmToSpeedRadio = DRAW_BAR_DM_GPM_TO_SPEED_RADIO; } else { - THROW_APP_EXCEPTION(err::kappe_code_error, "project [%s(%d)] not support: ", to_string(projectTypeInt).c_str(), projectTypeInt); + THROW_APP_EXCEPTION(err::kappe_code_error, fmt::format( "project [{}({})] not support: ", to_string(projectTypeInt).c_str(), projectTypeInt)); } return gpmToSpeedRadio; } @@ -179,7 +179,7 @@ float ProjectPort::pressurePa2VolumeG(int pa) { if (isDrawBarDM()) { return VolumeConvertor(VolumeConvertor::drawBarBoxParam).pressurePa2VolumeG(pa); } - THROW_APP_EXCEPTION(err::kappe_code_error, "project [%s(%d)] not support: ", to_string(projectTypeInt).c_str(), projectTypeInt); + THROW_APP_EXCEPTION(err::kappe_code_error, fmt::format( "project [{}({})] not support: ", to_string(projectTypeInt).c_str(), projectTypeInt)); return 0; } int32_t ProjectPort::getMainH2O2SensorId() { return getId(HardwareComponent::MainH2O2Sensor).boardId; } diff --git a/appsrc/baseservice/app_event_bus.hpp b/appsrc/baseservice/app_event_bus.hpp index f8b7d28..4dfe06d 100644 --- a/appsrc/baseservice/app_event_bus.hpp +++ b/appsrc/baseservice/app_event_bus.hpp @@ -15,7 +15,6 @@ #include "appbase/appevent/app_events.hpp" #include "appsetting/appsetting.hpp" - // namespace iflytop { class AppEventBus : public enable_shared_from_this { @@ -25,7 +24,7 @@ class AppEventBus : public enable_shared_from_this { unique_ptr m_eventBusThread; list> m_eventQueue; - mutex m_eventQueueMutex; + mutex m_eventQueueMutex; public: nod::signal)> onEvent; @@ -40,10 +39,12 @@ class AppEventBus : public enable_shared_from_this { return &instance; } - void push(shared_ptr event) ; + void push(shared_ptr event); + void pushWarningPromptEvent(int ecode) { push(make_shared(ecode)); } + void pushWarningPromptEvent(appexception e) { push(make_shared(e)); } private: - void initialize() ; + void initialize(); }; } // namespace iflytop diff --git a/appsrc/baseservice/db/formula_db_dao.cpp b/appsrc/baseservice/db/formula_db_dao.cpp index d335bc0..83d267d 100644 --- a/appsrc/baseservice/db/formula_db_dao.cpp +++ b/appsrc/baseservice/db/formula_db_dao.cpp @@ -48,7 +48,7 @@ string FormulaDBDao::getFormulaWithExcep(string formulaid, string key) { if (formula.find(key) != formula.end()) { return formula[key]; } - THROW_APP_EXCEPTION(err::kappe_code_error, "fomula key [%s] not found", key); + THROW_APP_EXCEPTION(err::kappe_code_error, fmt::format("fomula key [{}] not found", key)); } void FormulaDBDao::deleteFormula(string formulaid) { keyvaldb.del(formulaid); } @@ -70,7 +70,7 @@ json FormulaDBDao::newFormula() { json FormulaDBDao::getFormulaWithExcep(string formulaid) { string val = keyvaldb.get(formulaid); if (val.empty()) { - THROW_APP_EXCEPTION(err::kappe_code_error, "fomula [%s] not found", formulaid); + THROW_APP_EXCEPTION(err::kappe_code_error, fmt::format("fomula [{}] not found", formulaid)); } return json::parse(val); } diff --git a/appsrc/baseservice/devicestate/device_state_service.hpp b/appsrc/baseservice/devicestate/device_state_service.hpp index f89f3f1..1ad8fad 100644 --- a/appsrc/baseservice/devicestate/device_state_service.hpp +++ b/appsrc/baseservice/devicestate/device_state_service.hpp @@ -75,24 +75,7 @@ class DeviceStateService : public enable_shared_from_this { /******************************************************************************* * exception * *******************************************************************************/ - void clearAppExceptionFlag() { m_appexception = false; } - void setAppExceptionFlag(const appexception &e) { - m_appexception = true; - m_emessage = e.what(); - m_ecode = e.ecode(); - onException(e.ecode(), e.what()); - } - - void setAppExceptionFlag(int32_t ecode, const string &emessage) { - m_appexception = true; - m_emessage = emessage; - m_ecode = ecode; - onException(ecode, emessage); - } - bool getAppExceptionFlag() { return m_appexception; } - int getAppExceptionCode() { return m_ecode; } - string getAppExceptionMessage() { return m_emessage; } void initialize() {}; }; diff --git a/appsrc/baseservice/front_msg_processer/front_msg_processer.cpp b/appsrc/baseservice/front_msg_processer/front_msg_processer.cpp index 141c54b..9d61515 100644 --- a/appsrc/baseservice/front_msg_processer/front_msg_processer.cpp +++ b/appsrc/baseservice/front_msg_processer/front_msg_processer.cpp @@ -99,17 +99,19 @@ void FrontMsgProcesser::processMsg(shared_ptr cxt) { } } catch (const appexception& e) { - cxt->receipt["ackcode"] = e.ecode(); - cxt->receipt["message"] = fmt::format("[{}]", ecode2str(cxt->receipt["ackcode"])); - cxt->receipt["extMessage"] = fmt::format("{}", e.description); + cxt->receipt["ackcode"] = e.ecode; + cxt->receipt["message"] = fmt::format("[{}]", ecode2str(cxt->receipt["ackcode"])); + cxt->receipt["traceinfo"] = fmt::format("{}", e.traceinfo); + cxt->receipt["description"] = fmt::format("{}", e.description); + cxt->receipt["fromClass"] = fmt::format("{}", e.fromClass); + cxt->receipt["fromFn"] = fmt::format("{}", e.fromFn); } cxt->receipt["fromClass"] = m_msgProcesserMap[key]->className; cxt->receipt["fromFn"] = m_msgProcesserMap[key]->fnName; } else { logger->error("unknown command: {}", key); - cxt->receipt["ackcode"] = err::kappe_cmd_not_support; - cxt->receipt["message"] = fmt::format("[{}]", ecode2str(cxt->receipt["ackcode"])); - cxt->receipt["extMessage"] = fmt::format("not find cmd: {}", ecode2str(cxt->receipt["ackcode"]), key); + cxt->receipt["ackcode"] = err::kappe_cmd_not_support; + cxt->receipt["message"] = fmt::format("[{}]", ecode2str(cxt->receipt["ackcode"])); } } diff --git a/appsrc/service/app/add_liquid_service.cpp b/appsrc/service/app/add_liquid_service.cpp index 3faed61..1d58f25 100644 --- a/appsrc/service/app/add_liquid_service.cpp +++ b/appsrc/service/app/add_liquid_service.cpp @@ -30,9 +30,6 @@ void AddLiquidService::start(int stopatg) { THROW_APP_EXCEPTION(getDeviceBusyReason(nowstate), ""); } - if (DS->getAppExceptionFlag()) { - THROW_APP_EXCEPTION(err::kappe_exception_flag_is_setted, ""); - } if (zsteady_clock().gets() < SENSOR_PREHEART_TIME_S) { THROW_APP_EXCEPTION(err::kappe_sensor_is_pre_hearting, ""); @@ -73,8 +70,7 @@ void AddLiquidService::start(int stopatg) { try { addLiquidWork(stopatg, errorflag); } catch (const appexception& e) { - logger->error("addLiquidWork exception: {}", e.what()); - DS->setAppExceptionFlag(e); + AppEventBus::ins()->push(make_shared(e)); } logger->info("empty line liquid done"); diff --git a/appsrc/service/app/air_leak_detect_test.cpp b/appsrc/service/app/air_leak_detect_test.cpp index 8b35370..ed9b9de 100644 --- a/appsrc/service/app/air_leak_detect_test.cpp +++ b/appsrc/service/app/air_leak_detect_test.cpp @@ -30,8 +30,7 @@ void AirLeakDetectTest::start() { try { airLeakDetectTestThread(); } catch (const appexception& e) { - logger->error("AirLeakDetectTest error: {}", e.what()); - AppEventBus::ins()->push(make_shared(e.ecode())); + AppEventBus::ins()->push(make_shared(e)); } GET_SERVICE(PipelinePressureControl)->syncPressureValueState(); diff --git a/appsrc/service/app/disinfection_ctrl/disinfection_ctrl_service.cpp b/appsrc/service/app/disinfection_ctrl/disinfection_ctrl_service.cpp index ddc47f2..d3779d6 100644 --- a/appsrc/service/app/disinfection_ctrl/disinfection_ctrl_service.cpp +++ b/appsrc/service/app/disinfection_ctrl/disinfection_ctrl_service.cpp @@ -32,7 +32,7 @@ string DisinfectionCtrlService::getSetting(SettingId sid) { string str = GET_SERVICE(SettingDBDao)->getSettingValAsString(sid); if (str.empty()) { - THROW_APP_EXCEPTION(err::kappe_setting_id_outof_range, "%s", string(sid).c_str()); + THROW_APP_EXCEPTION(err::kappe_setting_id_outof_range, fmt::format("setting id:{} not found", sid)); } return str; } @@ -180,10 +180,6 @@ json DisinfectionCtrlService::startWithFormula(string formulaid) { } void DisinfectionCtrlService::checkBeforeStart() { - if (DS->getAppExceptionFlag()) { - THROW_APP_EXCEPTION(err::kappe_exception_flag_is_setted, ""); - } - if (DS->getDeviceState() != DeviceState::Idle) { THROW_APP_EXCEPTION(err::kappe_state_is_busy, ""); } @@ -217,10 +213,8 @@ void DisinfectionCtrlService::startWorkThread() { try { sm.process(); } catch (const appexception& e) { - DS->setAppExceptionFlag(e); - break; - } - if (sm.getState() == DisinfectionState::finished) { + AppEventBus::ins()->push(make_shared(e)); + sm.resetState(); break; } @@ -228,6 +222,10 @@ void DisinfectionCtrlService::startWorkThread() { stopbyusrflag = true; sm.changeState(DisinfectionState::finished); } + + if (sm.getState() == DisinfectionState::finished) { + break; + } } logger->info("DisinfectionStateMachineThread end"); diff --git a/appsrc/service/app/disinfection_ctrl_service_ext.cpp b/appsrc/service/app/disinfection_ctrl_service_ext.cpp index 9f35f0d..e829d99 100644 --- a/appsrc/service/app/disinfection_ctrl_service_ext.cpp +++ b/appsrc/service/app/disinfection_ctrl_service_ext.cpp @@ -49,6 +49,9 @@ void DisinfectionCtrlServiceExt::initialize() { REG_EXTFN_VOID(getRealtimeConfig, void()); REG_EXTFN(setRealtimeConfig, void(string, string), key, val); REG_EXTFN_VOID(getServiceConfig, void()); + REG_EXTFN_VOID(startStateReport, void()); + REG_EXTFN_VOID(stopStateReport, void()); + } void DisinfectionCtrlServiceExt::start(shared_ptr cxt, string loglevel) { @@ -57,22 +60,6 @@ void DisinfectionCtrlServiceExt::start(shared_ptr cxt, string dcs->start(level); ADD_USER_BEHAVIOR(ds->getLoginUid(), kbehavior_do_disinfection, fmt::format("开始消毒,level:{}", level)); // m_state = DisinfectionState::preheat; - if (stateUpdateThread) { - stateUpdateThread->join(); - stateUpdateThread = nullptr; - } - - stateUpdateThread.reset(new Thread("stateUpdateThread", [this]() { - while (!ThisThread().getExitFlag()) { - DisinfectionState state; - json report = getState(state); - SEND_CLASS_REPORT(thisClass.className, "stateUpdate", report); - if ((state) == (DisinfectionState::finished) || (state) == (DisinfectionState::idle)) { - break; - } - ThisThread().sleepForMs(1000); - } - })); } void DisinfectionCtrlServiceExt::startWithFormula(shared_ptr cxt, string formulaid) { // json formula = dcs->startWithFormula(formulaid); @@ -130,3 +117,27 @@ void DisinfectionCtrlServiceExt::getServiceConfig(shared_ptr rely["curveNum"] = PORT.getExtH2O2SensorNum() + 1; rely["curveUpdatePeriodMs"] = 10000; } +void DisinfectionCtrlServiceExt::startStateReport(shared_ptr cxt) { + if (stateUpdateThread) { + stateUpdateThread->join(); + stateUpdateThread = nullptr; + } + + stateUpdateThread.reset(new Thread("stateUpdateThread", [this]() { + while (!ThisThread().getExitFlag()) { + DisinfectionState state; + json report = getState(state); + SEND_CLASS_REPORT(thisClass.className, "stateUpdate", report); + if ((state) == (DisinfectionState::finished) || (state) == (DisinfectionState::idle)) { + break; + } + ThisThread().sleepForMs(900); + } + })); +} +void DisinfectionCtrlServiceExt::stopStateReport(shared_ptr cxt) { + if (stateUpdateThread) { + stateUpdateThread->join(); + stateUpdateThread = nullptr; + } +} \ No newline at end of file diff --git a/appsrc/service/app/disinfection_ctrl_service_ext.hpp b/appsrc/service/app/disinfection_ctrl_service_ext.hpp index add5557..ca10720 100644 --- a/appsrc/service/app/disinfection_ctrl_service_ext.hpp +++ b/appsrc/service/app/disinfection_ctrl_service_ext.hpp @@ -49,6 +49,8 @@ class DisinfectionCtrlServiceExt : public enable_shared_from_this cxt); void getServiceConfig(shared_ptr cxt); + void startStateReport(shared_ptr cxt); + void stopStateReport(shared_ptr cxt); json getState(DisinfectionState& state); diff --git a/appsrc/service/app/drain_liquid_service.cpp b/appsrc/service/app/drain_liquid_service.cpp index deadc94..b606cec 100644 --- a/appsrc/service/app/drain_liquid_service.cpp +++ b/appsrc/service/app/drain_liquid_service.cpp @@ -25,9 +25,6 @@ void DrainLiquidService::start() { THROW_APP_EXCEPTION(getDeviceBusyReason(nowstate), ""); } - if (DS->getAppExceptionFlag()) { - THROW_APP_EXCEPTION(err::kappe_exception_flag_is_setted, ""); - } if (DS->getDeviceState() != DeviceState::Idle) { THROW_APP_EXCEPTION(err::kappe_state_is_busy, ""); @@ -56,8 +53,7 @@ void DrainLiquidService::start() { try { workThread(); } catch (const appexception& e) { - logger->error("catch exception: {}", e.what()); - DS->setAppExceptionFlag(e); + AppEventBus::ins()->push(make_shared(e)); } m_workstate = kidle; DS->setDeviceState(DeviceState::Idle); diff --git a/appsrc/service/app_core.cpp b/appsrc/service/app_core.cpp index 172b4e6..65bc7fd 100644 --- a/appsrc/service/app_core.cpp +++ b/appsrc/service/app_core.cpp @@ -167,33 +167,18 @@ void AppCore::initialize() { *******************************************************************************/ wq.reset(new WorkQueue("AppCoreWorkQueue")); - DS->onException.connect([this](int32_t ecode, string emessage) { - static int32_t _ecode = 0; - static string _emessage; - static tp_steady lasttime; - - if (_ecode == ecode && _emessage == emessage && tu_steady().elapsedTimeS(lasttime) < 5) { - return; - } - - _ecode = ecode; - _emessage = emessage; - lasttime = steady_clock::now(); - - wq->enQueue([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()))); + string extmessage = ""; + + extmessage += fmt::format("fromClass:{}\n", appWarningPromoptEvent->getFromClass()); + extmessage += fmt::format("fromFn:{}\n", appWarningPromoptEvent->getFromFn()); + extmessage += fmt::format("description:{}\n", appWarningPromoptEvent->getDescription()); + extmessage += fmt::format("traceinfo:{}\n", appWarningPromoptEvent->getTraceinfo()); + + insertPrompt(Prompt::createWarning(ecode2str(appWarningPromoptEvent->getEcode()), extmessage)); onDeviceStateChange(); return; } @@ -214,7 +199,6 @@ void AppCore::initialize() { REG_EXTFN(startGenFakeH2O2Data, void(void), data); REG_EXTFN_VOID(stopGenFakeH2O2Data, void(void)); REG_EXTFN_VOID(getGenFakeH2O2DataDemoJson, void(void)); - }; int AppCore::demofn(int a, int b) { return 0; } @@ -273,12 +257,12 @@ void AppCore::startGenFakeH2O2Data(shared_ptr cxt, json data) fake_h2o2_data_cache_t cache; for (size_t i = 0; i < 3; i++) { - cache.h2o2[i] = data[i]["h2o2"]; - cache.rh[i] = data[i]["rh"]; - cache.temp[i] = data[i]["temp"]; - cache.rs[i] = data[i]["rs"]; - cache.random[i] = data[i]["random"]; - cache.enable[i] = data[i]["enable"]; + cache.h2o2[i] = data[i]["h2o2"]; + cache.rh[i] = data[i]["rh"]; + cache.temp[i] = data[i]["temp"]; + cache.rs[i] = data[i]["rs"]; + cache.random[i] = data[i]["random"]; + cache.enable[i] = data[i]["enable"]; } m_genFakeH2O2DataThread.reset(new Thread("genFakeH2O2DataThread", [this, cache]() { @@ -287,10 +271,10 @@ void AppCore::startGenFakeH2O2Data(shared_ptr cxt, json data) for (size_t i = 0; i < 3; i++) { if (cache.enable[i]) { - float h2o2 = cache.random[i] ? (rand() % 100) : cache.h2o2[i]; - float rh = cache.random[i] ? (rand() % 100) : cache.rh[i]; - float temp = cache.random[i] ? (rand() % 100) : cache.temp[i]; - float rs = cache.random[i] ? (rand() % 100) : cache.rs[i]; + float h2o2 = cache.random[i] ? (rand() % 100) : cache.h2o2[i]; + float rh = cache.random[i] ? (rand() % 100) : cache.rh[i]; + float temp = cache.random[i] ? (rand() % 100) : cache.temp[i]; + float rs = cache.random[i] ? (rand() % 100) : cache.rs[i]; logger->debug("genFakeH2O2DataThread: h2o2={}, rh={}, temp={}, rs={}", h2o2, rh, temp, rs); m_dics->getH2O2SensorMgr()->updateH2o2SensorData(i, h2o2, rh, temp, rs); @@ -351,12 +335,12 @@ void AppCore::getGenFakeH2O2DataDemoJson(shared_ptr cxt) { ret["params"]["data"] = json::array(); for (size_t i = 0; i < 3; i++) { json item; - item["h2o2"] = 0; - item["rh"] = 0; - item["temp"] = 0; - item["rs"] = 0; - item["random"] = true; - item["enable"] = true; + item["h2o2"] = 0; + item["rh"] = 0; + item["temp"] = 0; + item["rs"] = 0; + item["random"] = true; + item["enable"] = true; ret["params"]["data"].push_back(item); } cxt->rely = ret; @@ -378,10 +362,6 @@ json AppCore::getState() { ret["loginInfo"]["loginUid"] = DS->getLoginUid(); ret["loginInfo"]["isLoginAdmin"] = DS->isLoginAdmin(); - ret["estate"]["ecode"] = DS->getAppExceptionCode(); - ret["estate"]["state"] = DS->getAppExceptionFlag(); - ret["estate"]["emessage"] = DS->getAppExceptionMessage(); - ret["testMode"]["isInTestMode"] = DS->isTestMode(); ret["prompts"] = json::array(); diff --git a/appsrc/service/app_core.hpp b/appsrc/service/app_core.hpp index 6b34c08..2bdceff 100644 --- a/appsrc/service/app_core.hpp +++ b/appsrc/service/app_core.hpp @@ -42,11 +42,14 @@ class Prompt { string extMessage = ""; bool confirmedByUser = false; + public: Prompt(bool isWarning, string message) : isWarning(isWarning), message(message) {} + Prompt(bool isWarning, string message, string extMessage) : isWarning(isWarning), message(message), extMessage(extMessage) {} + public: NLOHMANN_DEFINE_TYPE_INTRUSIVE(Prompt, promptId, message, extMessage, confirmedByUser, isWarning); - static shared_ptr createWarning(string message) { return make_shared(true, message); } + static shared_ptr createWarning(string message, string extmessage) { return make_shared(true, message, extmessage); } static shared_ptr createInfo(string message) { return make_shared(false, message); } }; diff --git a/appsrc/service/audit_mgr_service.cpp b/appsrc/service/audit_mgr_service.cpp index 86218b6..6c0a592 100644 --- a/appsrc/service/audit_mgr_service.cpp +++ b/appsrc/service/audit_mgr_service.cpp @@ -85,7 +85,6 @@ void AuditMgrService::exportData(shared_ptr cxt) { } void AuditMgrService::getRecords(shared_ptr cxt, int page, int page_size) { - json& params = cxt->params; // cxt->rely = m_db->getUserBehaviorRecordDescJson(jsonGet(params["page"]), jsonGet(params["page_size"])); cxt->rely = m_db->getUserBehaviorRecordDescJson(page, page_size); } diff --git a/appsrc/service/hardware/device_io_ctrl_service.cpp b/appsrc/service/hardware/device_io_ctrl_service.cpp index ecfaf5e..8f38e0d 100644 --- a/appsrc/service/hardware/device_io_ctrl_service.cpp +++ b/appsrc/service/hardware/device_io_ctrl_service.cpp @@ -108,7 +108,7 @@ void DeviceIoControlService::initialize() { } } catch (const appexception &e) { logger->error("initialize hardware error:{}", e.what()); - DS->setAppExceptionFlag(e); + AppEventBus::ins()->pushWarningPromptEvent(e); } } @@ -137,39 +137,43 @@ int DeviceIoControlService::forceStopDeviceWithoutExc() { int DeviceIoControlService::processReportMsg(uint8_t from, uint8_t *hex, uint32_t hexlen) { // if (DS->isTestMode()) return 0; zcanbus_packet_t *packet = (zcanbus_packet_t *)hex; + if (packet->function_id == kreport_h2o2_sensor_data) { - /******************************************************************************* - * H2O2 上报 * - *******************************************************************************/ report_h2o2_data_t *h2o2data = (report_h2o2_data_t *)packet->params; int sensorId = 0; - if (from < 100) + if (from < 100) { sensorId = 0; - else + } else { sensorId = from - 100; + } m_h2o2SensorDataMgr->updateH2o2SensorData(sensorId, h2o2data); } else if (packet->function_id == kreport_heatpacket_pong) { report_heatpacket_data_t *ack = (report_heatpacket_data_t *)packet->params; - logger->info(" [Heat ][FROM:%03d] HeatIndex:%x ToardType:%s flag:%x", from, ack->heartIndex, BoardTypeId2Str(ack->boardType), ack->flag); + logger->info(" REPORT [Heat ][FROM:{}] HeatIndex:{:x} ToardType:{} flag:{:x}", from, ack->heartIndex, BoardTypeId2Str(ack->boardType), ack->flag); } else if (packet->function_id == kreport_exception_error) { report_exeception_data_t *ack = (report_exeception_data_t *)packet->params; - logger->error("[Exception][FROM:%03d] subid:%x ecode:%s", from, ack->subid, ecode2str(ack->ecode)); - DS->setAppExceptionFlag(ack->ecode, ecode2str(ack->ecode)); - // TODO:添加异常读取指令 + logger->error(" REPORT [Exception][FROM:{}] subid:{:x} ecode:{}", from, ack->subid, ecode2str(ack->ecode)); + AppEventBus::ins()->pushWarningPromptEvent(ack->ecode); } else if (packet->function_id == kreport_pressure_data) { report_pressure_data_t *ack = (report_pressure_data_t *)packet->params; string info; - info.append(fmt::format("[Pressure][FROM:{}]({})", from, ack->sensorDataNum)); + info.append(fmt::format("REPORT [Pressure][FROM:{}]({})", from, ack->sensorDataNum)); for (int i = 0; i < ack->sensorDataNum; i++) { info.append(fmt::format("{}:{}, ", ack->data[i].subid, ack->data[i].pressureVal)); } logger->info(info); } else if (packet->function_id == kreport_evaporation_bin_water_sensor) { report_water_sensor_state_t *ack = (report_water_sensor_state_t *)packet->params; - logger->info(" [蒸发仓内水浸][FROM:%03d] (%d)", from, ack->state); + logger->info(" REPORT [蒸发仓内水浸][FROM:{}] ({})", from, ack->state); } else if (packet->function_id == kreport_device_bottom_water_sensor) { report_water_sensor_state_t *ack = (report_water_sensor_state_t *)packet->params; - logger->info(" [设备底部水浸][FROM:%03d] (%d)", from, ack->state); + logger->info(" REPORT [设备底部水浸][FROM:{}] ({})", from, ack->state); + } + + else if (packet->function_id == kreport_device_reset) { + logger->info(" REPORT [DeviceReset][FROM:{}]", from); + } else { + logger->info(" REPORT [Unknow][FROM:{}] function_id:{:x}", from, packet->function_id); } return 0; } diff --git a/appsrc/service/hardware/disinfectant_weight_update_service.cpp b/appsrc/service/hardware/disinfectant_weight_update_service.cpp index 321e161..ec7a202 100644 --- a/appsrc/service/hardware/disinfectant_weight_update_service.cpp +++ b/appsrc/service/hardware/disinfectant_weight_update_service.cpp @@ -20,8 +20,11 @@ float DisinfectantWeightUpdateService::getWeight() { // } if (PORT.isLageSpaceDM() || PORT.isSmallSpaceDM() || PORT.isPipeDM()) { - if (DS->getAppExceptionFlag()) { - THROW_APP_EXCEPTION(DS->getAppExceptionCode(), DS->getAppExceptionMessage()); + { + lock_guard lock(m_mutex); + if (m_errorFlag) { + throw m_e; + } } return weightCache; } else { @@ -30,8 +33,12 @@ float DisinfectantWeightUpdateService::getWeight() { // } void DisinfectantWeightUpdateService::updateWeightThread() { while (true) { - if (DS->getAppExceptionFlag()) { - sleep(1); + if (m_errorFlag) { + sleep(10); + { + lock_guard lock(m_mutex); + m_errorFlag = false; + } continue; } @@ -48,8 +55,12 @@ void DisinfectantWeightUpdateService::updateWeightThread() { weightCache = weight_g; logger->debug("updateWeightThread: pa={}, weight_g={}", pa, weight_g); } catch (const appexception& e) { - logger->error("updateWeightThread error: {}", e.what()); - DS->setAppExceptionFlag(e); + { + lock_guard lock(m_mutex); + m_e = e; + m_errorFlag = true; + AppEventBus::ins()->pushWarningPromptEvent(e); + } } usleep(1000 * 1000); } diff --git a/appsrc/service/hardware/disinfectant_weight_update_service.hpp b/appsrc/service/hardware/disinfectant_weight_update_service.hpp index 3b529b6..c5db986 100644 --- a/appsrc/service/hardware/disinfectant_weight_update_service.hpp +++ b/appsrc/service/hardware/disinfectant_weight_update_service.hpp @@ -41,6 +41,11 @@ class DisinfectantWeightUpdateService : public enable_shared_from_thisgetAppExceptionFlag()) { - ThisThread().sleepForMs(1000); + if (m_errorFlag) { + logger->warn("WarningLightControler error, sleep 10s"); + ThisThread().sleepForMs(10 * 1000); m_workFlag = false; m_warningFlag = false; m_nowState = kstate_uninit; m_beepState = false; + m_errorFlag = false; continue; } try { workThread(); } catch (const appexception& e) { - logger->error("WarningLightControler workThread error: {}", e.what()); - DS->setAppExceptionFlag(e); + AppEventBus::ins()->pushWarningPromptEvent(e); + m_errorFlag = true; } } })); @@ -85,9 +87,6 @@ void WarningLightControler::changeLightState(lightState_t state) { } } - // bool isLageSpaceDM() - // bool isSmallSpaceDM() - // bool isPipeDM() } WarningLightControler::lightState_t WarningLightControler::inferTheCurrentLightingState() { diff --git a/appsrc/service/hardware/warning_light_controler.hpp b/appsrc/service/hardware/warning_light_controler.hpp index 3cc13bc..d943727 100644 --- a/appsrc/service/hardware/warning_light_controler.hpp +++ b/appsrc/service/hardware/warning_light_controler.hpp @@ -52,6 +52,8 @@ class WarningLightControler : public enable_shared_from_this params, vec insert(item); } - void TestPageItemMgr::insertStates(string groupname, vector states, readState_t readStates) { shared_ptr item = make_shared(); item->name = groupname; @@ -61,7 +60,7 @@ string TestPageItemMgr::getDisplayVal(string name, string defaultVal) { Parameter TestPageItemMgr::getParamType(string name) { auto it = m_paramTypes.find(name); if (it == m_paramTypes.end()) { - THROW_APP_EXCEPTION(err::kappe_missing_param, "missing parameter %s", name.c_str()); + THROW_APP_EXCEPTION(err::kappe_missing_param, fmt::format("missing param type: {}", name)); } return it->second; } @@ -69,7 +68,6 @@ Parameter TestPageItemMgr::getParamType(string name) { void TestPageItemMgr::insert(shared_ptr item) { m_itemList.push_back(item); } void TestPageItemMgr::processOnButton(string groupName, string buttonName, json params) { - for (auto& it : m_itemList) { shared_ptr item = it; if (item->name != groupName) continue; @@ -95,7 +93,7 @@ void TestPageItemMgr::processOnButton(string groupName, string buttonName, json for (auto& p : buttons->params) { auto it = params.find(p.name); if (it == params.end()) { - THROW_APP_EXCEPTION(err::kappe_missing_param, "missing parameter %s", p.name.c_str()); + THROW_APP_EXCEPTION(err::kappe_missing_param, fmt::format("missing parameter {}", p.name)); } paramstable.push_back(it->get()); } @@ -118,17 +116,25 @@ void TestPageItemMgr::startReportState(int interval) { return; } + m_errorFlag = false; m_thread.reset(new Thread("TestPageItemMgr", [this, interval]() { logger->info("TestPageItemMgr thread start"); ThisThread thisThread; while (!thisThread.getExitFlag()) { + if (m_errorFlag) { + logger->info("TestPageItemMgr thread error, sleep 10s"); + thisThread.sleepForMs(10 * 1000); + m_errorFlag = false; + if(thisThread.getExitFlag()) break; + } + try { json state = readState(); onState(state); } catch (const appexception& e) { logger->error("TestPageItemMgr thread exception: %s", e.what()); - DS->setAppExceptionFlag(e); - break; + AppEventBus::ins()->pushWarningPromptEvent(e); + m_errorFlag = true; } thisThread.sleepForMs(interval); } diff --git a/appsrc/service/testpage/test_page_processer.hpp b/appsrc/service/testpage/test_page_processer.hpp index fe23641..71f9639 100644 --- a/appsrc/service/testpage/test_page_processer.hpp +++ b/appsrc/service/testpage/test_page_processer.hpp @@ -25,6 +25,7 @@ class TestPageItemMgr { list> m_itemList; unique_ptr m_thread; + bool m_errorFlag=false; public: nod::signal onState; @@ -48,7 +49,7 @@ class TestPageItemMgr { private: void insert(shared_ptr item); - string getDisplayVal(string name,string defaultVal); + string getDisplayVal(string name, string defaultVal); Parameter getParamType(string name); };