Browse Source

fix some bug

storage-in-realtime
zhaohe 12 months ago
parent
commit
dcd8450b6d
  1. 64
      app_protocols/appexception/appexception.hpp
  2. 2
      app_protocols/transmit_disfection_protocol
  3. 19
      appdep/iflytop/core/spdlogfactory/logger_factory.cpp
  4. 20
      appsrc/appbase/appevent/app_warning_promopt_event.hpp
  5. 2
      appsrc/appcomponents/canchannel/com/zscanprotocol_com.cpp
  6. 3
      appsrc/appsetting/project_port/basic/project_constant.hpp
  7. 3
      appsrc/appsetting/project_port/basic/zappversion.hpp
  8. 12
      appsrc/appsetting/project_port/project_port.cpp
  9. 9
      appsrc/baseservice/app_event_bus.hpp
  10. 4
      appsrc/baseservice/db/formula_db_dao.cpp
  11. 17
      appsrc/baseservice/devicestate/device_state_service.hpp
  12. 14
      appsrc/baseservice/front_msg_processer/front_msg_processer.cpp
  13. 6
      appsrc/service/app/add_liquid_service.cpp
  14. 3
      appsrc/service/app/air_leak_detect_test.cpp
  15. 16
      appsrc/service/app/disinfection_ctrl/disinfection_ctrl_service.cpp
  16. 43
      appsrc/service/app/disinfection_ctrl_service_ext.cpp
  17. 2
      appsrc/service/app/disinfection_ctrl_service_ext.hpp
  18. 6
      appsrc/service/app/drain_liquid_service.cpp
  19. 68
      appsrc/service/app_core.cpp
  20. 5
      appsrc/service/app_core.hpp
  21. 1
      appsrc/service/audit_mgr_service.cpp
  22. 30
      appsrc/service/hardware/device_io_ctrl_service.cpp
  23. 23
      appsrc/service/hardware/disinfectant_weight_update_service.cpp
  24. 5
      appsrc/service/hardware/disinfectant_weight_update_service.hpp
  25. 13
      appsrc/service/hardware/warning_light_controler.cpp
  26. 2
      appsrc/service/hardware/warning_light_controler.hpp
  27. 18
      appsrc/service/testpage/test_page_processer.cpp
  28. 3
      appsrc/service/testpage/test_page_processer.hpp

64
app_protocols/appexception/appexception.hpp

@ -3,6 +3,7 @@
//
#pragma once
#include <execinfo.h>
#include <stdarg.h>
#include <exception>
@ -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

2
app_protocols/transmit_disfection_protocol

@ -1 +1 @@
Subproject commit aee8641e56d8b337ba7f151e7fc8b216fdc94862
Subproject commit 6fb781e6b5fe8f4f44c7046b30cbee47512f5bd9

19
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<string> sinkNames;
};
/****************************************************************************************************/
static map<string, sink_ptr> s_sinks = {};
static map<string, shared_ptr<logger>> s_loggers = {};
static map<string, sink_ptr> s_sinks = {};
static map<string, shared_ptr<logger>> s_loggers = {};
static set<shared_ptr<LoggerAndSinks>> s_loggerAndSinks = {};
static void insertLogger(shared_ptr<logger> 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<type>(j, #value_name, default_value)
#define GET(T, value_name) T value_name = j.at(#value_name).get<T>();
#define GET(T, value_name) T value_name = j.at(#value_name).get<T>();
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<LoggerAndSinks> 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<sinks::rotating_file_sink_mt>(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();

20
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

2
appsrc/appcomponents/canchannel/com/zscanprotocol_com.cpp

@ -202,7 +202,7 @@ shared_ptr<Receipt> 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);

3
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"

3
appsrc/appsetting/project_port/basic/zappversion.hpp

@ -0,0 +1,3 @@
#pragma once
#define VERSION "1.0.2"
#define PROJECT_NAME "TRANSMIT_DM"

12
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; }

9
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<AppEventBus> {
@ -25,7 +24,7 @@ class AppEventBus : public enable_shared_from_this<AppEventBus> {
unique_ptr<Thread> m_eventBusThread;
list<shared_ptr<IAppEvent>> m_eventQueue;
mutex m_eventQueueMutex;
mutex m_eventQueueMutex;
public:
nod::signal<void(shared_ptr<IAppEvent>)> onEvent;
@ -40,10 +39,12 @@ class AppEventBus : public enable_shared_from_this<AppEventBus> {
return &instance;
}
void push(shared_ptr<IAppEvent> event) ;
void push(shared_ptr<IAppEvent> event);
void pushWarningPromptEvent(int ecode) { push(make_shared<AppWarningPromoptEvent>(ecode)); }
void pushWarningPromptEvent(appexception e) { push(make_shared<AppWarningPromoptEvent>(e)); }
private:
void initialize() ;
void initialize();
};
} // namespace iflytop

4
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);
}

17
appsrc/baseservice/devicestate/device_state_service.hpp

@ -75,24 +75,7 @@ class DeviceStateService : public enable_shared_from_this<DeviceStateService> {
/*******************************************************************************
* 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() {};
};

14
appsrc/baseservice/front_msg_processer/front_msg_processer.cpp

@ -99,17 +99,19 @@ void FrontMsgProcesser::processMsg(shared_ptr<MsgProcessContext> 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"]));
}
}

6
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<AppWarningPromoptEvent>(e));
}
logger->info("empty line liquid done");

3
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<AppWarningPromoptEvent>(e.ecode()));
AppEventBus::ins()->push(make_shared<AppWarningPromoptEvent>(e));
}
GET_SERVICE(PipelinePressureControl)->syncPressureValueState();

16
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<AppWarningPromoptEvent>(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");

43
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<MsgProcessContext> cxt, string loglevel) {
@ -57,22 +60,6 @@ void DisinfectionCtrlServiceExt::start(shared_ptr<MsgProcessContext> 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<MsgProcessContext> cxt, string formulaid) { //
json formula = dcs->startWithFormula(formulaid);
@ -130,3 +117,27 @@ void DisinfectionCtrlServiceExt::getServiceConfig(shared_ptr<MsgProcessContext>
rely["curveNum"] = PORT.getExtH2O2SensorNum() + 1;
rely["curveUpdatePeriodMs"] = 10000;
}
void DisinfectionCtrlServiceExt::startStateReport(shared_ptr<MsgProcessContext> 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<MsgProcessContext> cxt) {
if (stateUpdateThread) {
stateUpdateThread->join();
stateUpdateThread = nullptr;
}
}

2
appsrc/service/app/disinfection_ctrl_service_ext.hpp

@ -49,6 +49,8 @@ class DisinfectionCtrlServiceExt : public enable_shared_from_this<DisinfectionCt
*******************************************************************************/
void getState(shared_ptr<MsgProcessContext> cxt);
void getServiceConfig(shared_ptr<MsgProcessContext> cxt);
void startStateReport(shared_ptr<MsgProcessContext> cxt);
void stopStateReport(shared_ptr<MsgProcessContext> cxt);
json getState(DisinfectionState& state);

6
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<AppWarningPromoptEvent>(e));
}
m_workstate = kidle;
DS->setDeviceState(DeviceState::Idle);

68
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<IAppEvent>
AppEventBus::ins()->onEvent.connect([this](shared_ptr<IAppEvent> event) {
auto appWarningPromoptEvent = dynamic_pointer_cast<AppWarningPromoptEvent>(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<MsgProcessContext> 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<MsgProcessContext> 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<MsgProcessContext> 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();

5
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<Prompt> createWarning(string message) { return make_shared<Prompt>(true, message); }
static shared_ptr<Prompt> createWarning(string message, string extmessage) { return make_shared<Prompt>(true, message, extmessage); }
static shared_ptr<Prompt> createInfo(string message) { return make_shared<Prompt>(false, message); }
};

1
appsrc/service/audit_mgr_service.cpp

@ -85,7 +85,6 @@ void AuditMgrService::exportData(shared_ptr<MsgProcessContext> cxt) {
}
void AuditMgrService::getRecords(shared_ptr<MsgProcessContext> cxt, int page, int page_size) {
json& params = cxt->params;
// cxt->rely = m_db->getUserBehaviorRecordDescJson(jsonGet<int>(params["page"]), jsonGet<int>(params["page_size"]));
cxt->rely = m_db->getUserBehaviorRecordDescJson(page, page_size);
}

30
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;
}

23
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<mutex> 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<mutex> 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<mutex> lock(m_mutex);
m_e = e;
m_errorFlag = true;
AppEventBus::ins()->pushWarningPromptEvent(e);
}
}
usleep(1000 * 1000);
}

5
appsrc/service/hardware/disinfectant_weight_update_service.hpp

@ -41,6 +41,11 @@ class DisinfectantWeightUpdateService : public enable_shared_from_this<Disinfect
MovingAverageFilter filter = {5};
float weightCache = 0;
bool m_errorFlag = false;
appexception m_e;
mutex m_mutex;
public:
void initialize();
float getWeight();

13
appsrc/service/hardware/warning_light_controler.cpp

@ -28,20 +28,22 @@ void WarningLightControler::initialize() {
m_thread.reset(new Thread("LightCtrlServiceThread", [this]() {
while (true) {
if (DS->getAppExceptionFlag()) {
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() {

2
appsrc/service/hardware/warning_light_controler.hpp

@ -52,6 +52,8 @@ class WarningLightControler : public enable_shared_from_this<WarningLightControl
lightState_t m_nowState = kstate_uninit;
bool m_beepState = false;
bool m_errorFlag = false;
public:
void initialize();

18
appsrc/service/testpage/test_page_processer.cpp

@ -35,7 +35,6 @@ void TestPageItemMgr::insertButtons(string groupName, vector<string> params, vec
insert(item);
}
void TestPageItemMgr::insertStates(string groupname, vector<string> states, readState_t readStates) {
shared_ptr<States> item = make_shared<States>();
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<TestPageItem> item) { m_itemList.push_back(item); }
void TestPageItemMgr::processOnButton(string groupName, string buttonName, json params) {
for (auto& it : m_itemList) {
shared_ptr<TestPageItem> 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<string>());
}
@ -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);
}

3
appsrc/service/testpage/test_page_processer.hpp

@ -25,6 +25,7 @@ class TestPageItemMgr {
list<shared_ptr<TestPageItem>> m_itemList;
unique_ptr<Thread> m_thread;
bool m_errorFlag=false;
public:
nod::signal<void(json state)> onState;
@ -48,7 +49,7 @@ class TestPageItemMgr {
private:
void insert(shared_ptr<TestPageItem> item);
string getDisplayVal(string name,string defaultVal);
string getDisplayVal(string name, string defaultVal);
Parameter getParamType(string name);
};

Loading…
Cancel
Save