From 9fb8b37f89197c09a1644208cb4b3d2377ec7168 Mon Sep 17 00:00:00 2001 From: zhaohe Date: Sun, 18 Aug 2024 13:34:34 +0800 Subject: [PATCH] =?UTF-8?q?=E9=87=8D=E5=91=BD=E5=90=8Ddevice=5Fio=5Fctrl?= =?UTF-8?q?=5Fservice=20=E5=90=8D=E7=A7=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 11 +- appsrc/service/app/add_liquid_service.hpp | 2 +- .../disinfection_ctrl_service.cpp | 2 +- .../disinfection_ctrl_service.hpp | 2 +- .../service/app/disinfection_ctrl_service_ext.hpp | 2 +- appsrc/service/app/drain_liquid_service.hpp | 2 +- appsrc/service/hardware/device_ctrl_service.cpp | 394 --------------------- appsrc/service/hardware/device_ctrl_service.hpp | 118 ------ appsrc/service/hardware/device_io_ctrl_service.cpp | 394 +++++++++++++++++++++ appsrc/service/hardware/device_io_ctrl_service.hpp | 118 ++++++ .../disinfectant_weight_update_service.hpp | 2 +- .../service/hardware/warning_light_controler.hpp | 2 +- appsrc/service/main_control_service.cpp | 2 +- appsrc/service/test_page_mgr_service.hpp | 2 +- 14 files changed, 529 insertions(+), 524 deletions(-) delete mode 100644 appsrc/service/hardware/device_ctrl_service.cpp delete mode 100644 appsrc/service/hardware/device_ctrl_service.hpp create mode 100644 appsrc/service/hardware/device_io_ctrl_service.cpp create mode 100644 appsrc/service/hardware/device_io_ctrl_service.hpp diff --git a/README.md b/README.md index eb64544..095d336 100644 --- a/README.md +++ b/README.md @@ -66,15 +66,20 @@ TODO: 3. 填充硬件测试页面。OK 4. 指令重发代码功能。OK 5. 硬件测试 OK +6. 所有后台程序添加异常检查,当异常发生过,则设置全局标志位(硬件异常)。此时后台程序相应的线程将不再继续工作。(直到设备重启) OK -6. 所有后台程序添加异常检查,当异常发生过,则设置全局标志位(硬件异常)。此时后台程序相应的线程将不再继续工作。(直到设备重启) -7. 所有后台程序(有前端启动的),则是检查全局标志位,如果触发错误,则报错。 +--------------------------------------------------------------------- +10.添加异常上报前端程序,添加异常状态读取程序 +9. 对接消毒服务 +11.针对关键接口添加异常标志位检测程序。(消毒,加液,排液体,气密性测试) 8. 添加消毒日志打印程序 8. 消毒测试 - +9. 添加气密封性测试逻辑代码。 9. 处理硬件异常上报 8. 添加一个程序根据全局异常标志位,对设备进行相应的检查,如果检查通过则清空标志位。同时如果发生异常,则发送板子复位指令,对板子进行复位。 + +... 5. 单片机支持自动过滤掉重发的指令。 diff --git a/appsrc/service/app/add_liquid_service.hpp b/appsrc/service/app/add_liquid_service.hpp index c766cca..bc3103c 100644 --- a/appsrc/service/app/add_liquid_service.hpp +++ b/appsrc/service/app/add_liquid_service.hpp @@ -12,7 +12,7 @@ // #include "baseservice/baseservice.hpp" -#include "service/hardware/device_ctrl_service.hpp" +#include "service/hardware/device_io_ctrl_service.hpp" #include "service/hardware/disinfectant_weight_update_service.hpp" // namespace iflytop { diff --git a/appsrc/service/app/disinfection_ctrl/disinfection_ctrl_service.cpp b/appsrc/service/app/disinfection_ctrl/disinfection_ctrl_service.cpp index a8f103f..1063ed9 100644 --- a/appsrc/service/app/disinfection_ctrl/disinfection_ctrl_service.cpp +++ b/appsrc/service/app/disinfection_ctrl/disinfection_ctrl_service.cpp @@ -180,7 +180,7 @@ void DisinfectionCtrlService::traceState() { * StateMachine * *******************************************************************************/ void DisinfectionCtrlService::exceptionProcesser(const appexception& e) { - logger->error("exceptionProcesser:{}", e); + logger->error("exceptionProcesser:{}", e.what()); sm.changeState(DisinfectionState::appexception); DS->setAppExceptionFlag(e); } diff --git a/appsrc/service/app/disinfection_ctrl/disinfection_ctrl_service.hpp b/appsrc/service/app/disinfection_ctrl/disinfection_ctrl_service.hpp index 906336e..d429eec 100644 --- a/appsrc/service/app/disinfection_ctrl/disinfection_ctrl_service.hpp +++ b/appsrc/service/app/disinfection_ctrl/disinfection_ctrl_service.hpp @@ -13,7 +13,7 @@ #include "baseservice/baseservice.hpp" #include "disinfection_state_machine.hpp" #include "service/hardware/base/h2o2_sensor_data_mgr.hpp" -#include "service/hardware/device_ctrl_service.hpp" +#include "service/hardware/device_io_ctrl_service.hpp" #include "service/hardware/disinfectant_weight_update_service.hpp" // namespace iflytop { diff --git a/appsrc/service/app/disinfection_ctrl_service_ext.hpp b/appsrc/service/app/disinfection_ctrl_service_ext.hpp index 8fd9193..6a32a1b 100644 --- a/appsrc/service/app/disinfection_ctrl_service_ext.hpp +++ b/appsrc/service/app/disinfection_ctrl_service_ext.hpp @@ -14,7 +14,7 @@ #include "baseservice/baseservice.hpp" #include "disinfection_ctrl/disinfection_state_machine.hpp" #include "service/hardware/base/h2o2_sensor_data_mgr.hpp" -#include "service/hardware/device_ctrl_service.hpp" +#include "service/hardware/device_io_ctrl_service.hpp" #include "service/hardware/disinfectant_weight_update_service.hpp" // namespace iflytop { diff --git a/appsrc/service/app/drain_liquid_service.hpp b/appsrc/service/app/drain_liquid_service.hpp index 3784a84..d0967dd 100644 --- a/appsrc/service/app/drain_liquid_service.hpp +++ b/appsrc/service/app/drain_liquid_service.hpp @@ -10,7 +10,7 @@ #include // #include "baseservice/baseservice.hpp" -#include "service/hardware/device_ctrl_service.hpp" +#include "service/hardware/device_io_ctrl_service.hpp" #include "service/hardware/disinfectant_weight_update_service.hpp" // namespace iflytop { diff --git a/appsrc/service/hardware/device_ctrl_service.cpp b/appsrc/service/hardware/device_ctrl_service.cpp deleted file mode 100644 index 30ab6c4..0000000 --- a/appsrc/service/hardware/device_ctrl_service.cpp +++ /dev/null @@ -1,394 +0,0 @@ -#include "device_ctrl_service.hpp" -using namespace iflytop; -using namespace std; -using namespace core; - -/** - * @brief - * - * - * - * writeCmd - * - * onReport - * processReport - * - * - */ - -static bool isInDevice() { -#if (defined BUILD_ON_PC) // x86平台 - return false; -#else - return true; -#endif -} - -// klarge_space_disinfection_machine = 1, // 大空间消毒机 -// ksmall_space_disinfection_machine = 2, // 小空间消毒机 -// kpipe_disinfection_machine = 3, // 管道式消毒机 -// kdraw_bar_disinfection_box = 4, // 手持拉杆箱消毒机 -// kh2o2_ext_sensor = 5, // 外部H2O2传感器 - -#define CAN_MASTER TransmitDisinfectionCanMaster::ins() -#define GET_BOARDID() (ProjectPort::ins().getId(COMPONENT).boardId) -#define GET_SUBID() (ProjectPort::ins().getId(COMPONENT).subId) - -void DeviceIoControlService::initialize() { - GET_TO_SERVICE(m_config); - if (!isInDevice()) { - logger->warn("run in pc, skip initialize device io control service"); - return; - } else { - } - - TransmitDisinfectionCanMaster::ins()->initialize(m_config->get_canIF().c_str(), m_config->get_canBitrate(), false); - TransmitDisinfectionCanMaster::ins()->getCanProtocolCom()->regOnRawData( // - [this](packet_type_t type, uint8_t from, uint8_t to, uint8_t *hex, uint32_t hexlen) { - if (type == kreport) { - processReportMsg(from, hex, hexlen); - } - }); - REGFNV2(DeviceIoControlService, test); -} -void DeviceIoControlService::processReportMsg(uint8_t from, uint8_t *hex, uint32_t hexlen) { // - zcanbus_packet_t *packet = (zcanbus_packet_t *)hex; - if (packet->function_id == kreport_h2o2_sensor_data) { - report_h2o2_data_t *h2o2data = (report_h2o2_data_t *)packet->params; - int sensorId = 0; - - if (from < 100) - sensorId = 0; - else - sensorId = from - 100; - m_h2o2SensorDataMgr->updateH2o2SensorData(sensorId, h2o2data); - } -} - -// 加液泵控制 -#define COMPONENT HardwareComponent::AddLiquidPump -void DeviceIoControlService::AddLiquidPump_addLiquid() { - int pumpspeed = GET_SETTING(int, SettingId::drainage_pump_speed); - logger->info("AddLiquidPump_addLiquid, pumpspeed={}", pumpspeed); - - if (isInDevice()) CAN_MASTER->pumpRotate(GET_BOARDID(), GET_SUBID(), pumpspeed); -} -void DeviceIoControlService::AddLiquidPump_drainLiquid() { - int pumpspeed = GET_SETTING(int, SettingId::drainage_pump_speed); - logger->info("AddLiquidPump_drainLiquid, pumpspeed={}", -pumpspeed); - - if (isInDevice()) CAN_MASTER->pumpRotate(GET_BOARDID(), GET_SUBID(), -pumpspeed); -} -void DeviceIoControlService::AddLiquidPump_run(int rpm) { - logger->info("AddLiquidPump_run, rpm={}", rpm); - if (isInDevice()) CAN_MASTER->pumpRotate(GET_BOARDID(), GET_SUBID(), rpm); -} - -void DeviceIoControlService::AddLiquidPump_stop() { - logger->info("AddLiquidPump_stop"); - if (isInDevice()) CAN_MASTER->pumpStop(GET_BOARDID(), GET_SUBID()); -} -#undef COMPONENT - -// 喷雾泵控制 -#define COMPONENT HardwareComponent::SprayPump -void DeviceIoControlService::SprayPump_start(int32_t gpm) { - int pumpspeed_rpm = ProjectPort::ins().gpm2speed(gpm); - logger->info("SprayPump_start, gpm={}, rpm={}", gpm, pumpspeed_rpm); - if (isInDevice()) CAN_MASTER->pumpRotate(GET_BOARDID(), GET_SUBID(), pumpspeed_rpm); -} -void DeviceIoControlService::SprayPump_stop() { - logger->info("SprayPump_stop"); - if (isInDevice()) CAN_MASTER->pumpStop(GET_BOARDID(), GET_SUBID()); -} -void DeviceIoControlService::SprayPump_startInRPM(int32_t rpm) { - logger->info("SprayPump_startInRPM, rpm={}", rpm); - if (isInDevice()) CAN_MASTER->pumpRotate(GET_BOARDID(), GET_SUBID(), rpm); -} -#undef COMPONENT - -// 鼓风机控制 -#define COMPONENT HardwareComponent::Blower -void DeviceIoControlService::Blower_ctrl(int power) { - logger->info("Blower_ctrl, power={}", power); - if (isInDevice()) CAN_MASTER->blowerCtrl(GET_BOARDID(), power); - usleep(1000 * 1000); -} -void DeviceIoControlService::Blower_close() { - logger->info("Blower_close"); - if (isInDevice()) CAN_MASTER->blowerCtrl(GET_BOARDID(), 0); -} -float DeviceIoControlService::Blower_readEI() { - logger->info("Blower_readEI"); - if (isInDevice()) return CAN_MASTER->blowerReadEI(GET_BOARDID()) / 1000.0; - return 0; -} -#undef COMPONENT - -// 空压机控制 -#define COMPONENT HardwareComponent::AirCompressor -void DeviceIoControlService::AC_ctrl(int power) { - logger->info("AC_ctrl, power={}", power); - if (isInDevice()) CAN_MASTER->airCompressorCtrl(GET_BOARDID(), power); - usleep(1000 * 1000); -} -void DeviceIoControlService::AC_close() { - logger->info("AC_close"); - if (isInDevice()) CAN_MASTER->airCompressorCtrl(GET_BOARDID(), 0); -} -float DeviceIoControlService::AC_readEI() { - logger->info("AC_readEI"); - if (isInDevice()) return CAN_MASTER->airCompressorReadEI(GET_BOARDID()) / 1000.0; - return 0; -} -#undef COMPONENT - -// 加热器控制 -#define COMPONENT HardwareComponent::Heater -void DeviceIoControlService::Heater_ctrl(int power) { - logger->info("Heater_ctrl, power={}", power); - if (isInDevice()) CAN_MASTER->heaterCtrl(GET_BOARDID(), power); - usleep(1000 * 1000); -} -void DeviceIoControlService::Heater_close() { - logger->info("Heater_close"); - if (isInDevice()) CAN_MASTER->heaterCtrl(GET_BOARDID(), 0); -} -float DeviceIoControlService::Heater_readEI() { - logger->info("Heater_readEI"); - if (isInDevice()) return CAN_MASTER->heaterReadEI(GET_BOARDID()) / 1000.0; - return 0; -} -float DeviceIoControlService::Heater_readTemperature() { - logger->info("Heater_readTemperature"); - if (isInDevice()) return CAN_MASTER->heaterReadTemperature(GET_BOARDID()) / 10.0; - return 0; -} -#undef COMPONENT - -// 三色指示灯控制 -#define COMPONENT HardwareComponent::WarningLight -void DeviceIoControlService::WarningLight_setState(int r, int g, int b, int warning) { // - logger->info("WarningLight_setState, r={}, g={}, b={}, warning={}", r, g, b, warning); - if (isInDevice()) CAN_MASTER->warningLightSetState(GET_BOARDID(), r, g, b, warning); -} -#undef COMPONENT - -// 其他 -// 比例阀控制 -// 气密性测试通道选择 -// 气密性测试空压机控制 - -#define COMPONENT HardwareComponent::PositivePressureProportional -void DeviceIoControlService::PosiPressureProp_setValve(int valveValue) { // - valveValue = valveValue / 100.0 * 255; - logger->info("PosiPressureProp_setValve, valveValue={}", valveValue); - if (isInDevice()) CAN_MASTER->proportionalSetValve(GET_BOARDID(), GET_SUBID(), valveValue); -} -int DeviceIoControlService::PosiPressureProp_readPos() { - if (isInDevice()) { - int pos = CAN_MASTER->proportionalReadPos(GET_BOARDID(), GET_SUBID()); - pos = pos / 255.0 * 100; - return pos; - } - return 0; -} -bool DeviceIoControlService::PosiPressureProp_isBusy() { - if (isInDevice()) return CAN_MASTER->proportionalIsBusy(GET_BOARDID(), GET_SUBID()); - return false; -} -#undef COMPONENT - -#define COMPONENT HardwareComponent::NegativePressureProportional -void DeviceIoControlService::NegaPressureProp_setValve(int valveValue) { - valveValue = valveValue / 100.0 * 255; - logger->info("NegaPressureProp_setValve, valveValue={}", valveValue); - if (isInDevice()) CAN_MASTER->proportionalSetValve(GET_BOARDID(), GET_SUBID(), valveValue); -} -int DeviceIoControlService::NegaPressureProp_readPos() { - if (isInDevice()) { - int pos = CAN_MASTER->proportionalReadPos(GET_BOARDID(), GET_SUBID()); - pos = pos / 255.0 * 100; - return pos; - } - return 0; -} -bool DeviceIoControlService::NegaPressureProp_isBusy() { - if (isInDevice()) return CAN_MASTER->proportionalIsBusy(GET_BOARDID(), GET_SUBID()); - return false; -} -#undef COMPONENT - -#define COMPONENT HardwareComponent::AirLeakDetectTestModeCtrl - -void DeviceIoControlService::AirLeakDetectTestModeCtrl_setMode(int mode) { - logger->info("AirLeakDetectTestModeCtrl_setMode, mode={}", mode); - if (isInDevice()) CAN_MASTER->airLeakDetectTestSetMode(GET_BOARDID(), mode); -} -int DeviceIoControlService::AirLeakDetectTestModeCtrl_getMode() { - if (isInDevice()) return CAN_MASTER->airLeakDetectTestGetMode(GET_BOARDID()); - return 0; -} - -#undef COMPONENT - -// ExtChSelector -#define COMPONENT HardwareComponent::ExtChSelector -void DeviceIoControlService::ExtChSelector_selectCh(int ch) { - logger->info("ExtChSelector_selectCh, ch={}", ch); - if (isInDevice()) CAN_MASTER->extChSelectorSetCh(GET_BOARDID(), ch); -} - -bool DeviceIoControlService::ExtChSelector_isOnline() { - if (isInDevice()) { - try { - CAN_MASTER->extChSelectorGetCh(GET_BOARDID()); - return true; - } catch (const std::exception &e) { - return false; - } - } - return false; -} -void DeviceIoControlService::ExtChSelector_trySelectCh(int ch) { - logger->info("ExtChSelector_trySelectCh, ch={}", ch); - if (isInDevice()) { - try { - ExtChSelector_selectCh(GET_BOARDID()); - } catch (const std::exception &e) { - } - } -} - -#undef COMPONENT - -// 水浸传感器 - -// 蒸发仓水浸 -#define COMPONENT HardwareComponent::EvaporationBinWS -bool DeviceIoControlService::WaterSensor_readEvaporationBin() { - if (isInDevice()) return CAN_MASTER->evaporationTankWSReadState(GET_BOARDID()); - return false; -} -#undef COMPONENT - -#define COMPONENT HardwareComponent::DeviceBottomWS -bool DeviceIoControlService::WaterSensor_readDeviceBottom() { - if (isInDevice()) return CAN_MASTER->bottomWSReadState(GET_BOARDID()); - return false; -} // 设备底部水浸 -#undef COMPONENT - -#define COMPONENT HardwareComponent::ACPostPS -int DeviceIoControlService::ACPostPS_readPa() { // - if (isInDevice()) { - int32_t val = CAN_MASTER->psBusReadData(GET_BOARDID(), GET_SUBID()); - return ProjectPort::ins().ACPostPS_To_Pa(val); - } - return 0; -} -#undef COMPONENT - -#define COMPONENT HardwareComponent::AirLeakDetectPS -int DeviceIoControlService::AirLeakDetectPS_readPa() { // - if (isInDevice()) { - int32_t val = CAN_MASTER->psBusReadData(GET_BOARDID(), GET_SUBID()); - return ProjectPort::ins().AirLeakDetectPS_To_Pa(val); - } - return 0; -} -#undef COMPONENT - -#define COMPONENT HardwareComponent::LiquidWeightPS -int DeviceIoControlService::LiquidWeightPS_readPa() { // - if (isInDevice()) { - int32_t val = CAN_MASTER->psBusReadData(GET_BOARDID(), GET_SUBID()); - return ProjectPort::ins().LiquidWeightPS_To_Pa(val); - } - return 0; -} -#undef COMPONENT - -#define COMPONENT HardwareComponent::SprayPumpPostPS -int DeviceIoControlService::SprayPumpPostPS_readPa() { // - if (isInDevice()) { - int32_t val = CAN_MASTER->psBusReadData(GET_BOARDID(), GET_SUBID()); - return ProjectPort::ins().SprayPumpPostPS_To_Pa(val); - } - return 0; -} -#undef COMPONENT - -#define COMPONENT HardwareComponent::AddLiquidPumpPostPS -int DeviceIoControlService::AddLiquidPumpPostPS_readPa() { // - if (isInDevice()) { - int32_t val = CAN_MASTER->psBusReadData(GET_BOARDID(), GET_SUBID()); - return ProjectPort::ins().AddLiquidPumpPostPS_To_Pa(val); - } - return 0; -} -#undef COMPONENT - -// int DeviceIoControlService::DisinfectantVolume_readVal() { -// if (isInDevice()) { -// int pa = LiquidWeightPS_readPa(); -// return ProjectPort::ins().pressurePa2VolumeG(pa); -// } -// return 0; -// } // g - -#define PROCESS_CMD(fnName, ...) \ - if (testFnName == #fnName) { \ - fnName(__VA_ARGS__); \ - return; \ - } - -#define PROCESS_CMD_WITH_RET(fnName, ...) \ - if (testFnName == #fnName) { \ - auto ret = fnName(__VA_ARGS__); \ - cxt->content = ret; \ - return; \ - } - -void DeviceIoControlService::fn_test(shared_ptr cxt) { - // - string testFnName = cxt->params["testFnName"]; - json param = cxt->params["testFnParams"]; - - PROCESS_CMD(AddLiquidPump_addLiquid); - PROCESS_CMD(AddLiquidPump_run, param[0]); - PROCESS_CMD(AddLiquidPump_drainLiquid); - PROCESS_CMD(AddLiquidPump_stop); - PROCESS_CMD(SprayPump_start, param[0]); - PROCESS_CMD(SprayPump_startInRPM, param[0]); - PROCESS_CMD(SprayPump_stop); - PROCESS_CMD(Blower_ctrl, param[0]); - PROCESS_CMD(Blower_close); - PROCESS_CMD_WITH_RET(Blower_readEI); - PROCESS_CMD(AC_ctrl, param[0]); - PROCESS_CMD(AC_close); - PROCESS_CMD_WITH_RET(AC_readEI); - PROCESS_CMD(Heater_ctrl, param[0]); - PROCESS_CMD(Heater_close); - PROCESS_CMD_WITH_RET(Heater_readEI); - PROCESS_CMD_WITH_RET(Heater_readTemperature); - PROCESS_CMD(WarningLight_setState, param[0], param[1], param[2], param[3]); - PROCESS_CMD(PosiPressureProp_setValve, param[0]); - PROCESS_CMD_WITH_RET(PosiPressureProp_readPos); - PROCESS_CMD_WITH_RET(PosiPressureProp_isBusy); - PROCESS_CMD(NegaPressureProp_setValve, param[0]); - PROCESS_CMD_WITH_RET(NegaPressureProp_readPos); - PROCESS_CMD_WITH_RET(NegaPressureProp_isBusy); - PROCESS_CMD(AirLeakDetectTestModeCtrl_setMode, param[0]); - PROCESS_CMD_WITH_RET(AirLeakDetectTestModeCtrl_getMode); - PROCESS_CMD(ExtChSelector_selectCh, param[0]); - PROCESS_CMD(ExtChSelector_trySelectCh, param[0]); - PROCESS_CMD_WITH_RET(ExtChSelector_isOnline); - PROCESS_CMD_WITH_RET(WaterSensor_readEvaporationBin); - PROCESS_CMD_WITH_RET(WaterSensor_readDeviceBottom); - PROCESS_CMD_WITH_RET(ACPostPS_readPa); - PROCESS_CMD_WITH_RET(AirLeakDetectPS_readPa); - PROCESS_CMD_WITH_RET(LiquidWeightPS_readPa); - PROCESS_CMD_WITH_RET(SprayPumpPostPS_readPa); - PROCESS_CMD_WITH_RET(AddLiquidPumpPostPS_readPa); -} diff --git a/appsrc/service/hardware/device_ctrl_service.hpp b/appsrc/service/hardware/device_ctrl_service.hpp deleted file mode 100644 index 3536931..0000000 --- a/appsrc/service/hardware/device_ctrl_service.hpp +++ /dev/null @@ -1,118 +0,0 @@ -#pragma once -#include -#include -#include -#include -#include -#include -#include -#include -#include -// -#include "baseservice/baseservice.hpp" -// -#include "base/can_packet_dumper.hpp" -#include "base/h2o2_sensor_data_mgr.hpp" - -/** - * @brief - * - * service: DeviceIoControlService - * - * 监听事件: - * 依赖状态: - * 依赖服务: - * 作用: - * - */ - -namespace iflytop { -using namespace std; -using namespace core; - -class DeviceIoControlService : public enable_shared_from_this { - THISCLASS(DeviceIoControlService); - - private: - shared_ptr m_config; - unique_ptr m_workQueue; - - shared_ptr m_h2o2SensorDataMgr = make_shared(); - - public: - void initialize(); - - private: - void processReportMsg(uint8_t from, uint8_t *hex, uint32_t hexlen); - - public: - // 加液泵控制 - void AddLiquidPump_addLiquid(); - void AddLiquidPump_run(int rpm); - void AddLiquidPump_drainLiquid(); - void AddLiquidPump_stop(); - - // 喷雾泵控制 - void SprayPump_start(int32_t gpmin); - void SprayPump_startInRPM(int32_t rpm); - void SprayPump_stop(); - - // 鼓风机控制 - void Blower_ctrl(int power); - void Blower_close(); - float Blower_readEI(); - - // 空压机控制 - void AC_ctrl(int power); - void AC_close(); - float AC_readEI(); - - // 加热器控制 - void Heater_ctrl(int power); - void Heater_close(); - float Heater_readEI(); - float Heater_readTemperature(); - - // 三色指示灯控制 - void WarningLight_setState(int r, int g, int b, int warning); - - // 正压比例阀控制 - void PosiPressureProp_setValve(int valveValue); - int PosiPressureProp_readPos(); - bool PosiPressureProp_isBusy(); - - // 负压比例阀控制 - void NegaPressureProp_setValve(int valveValue); - int NegaPressureProp_readPos(); - bool NegaPressureProp_isBusy(); - - // 气密性测试通道控制 - void AirLeakDetectTestModeCtrl_setMode(int mode); // 1:气密封性测试模式, 2:正常模式 - int AirLeakDetectTestModeCtrl_getMode(); - - // 外部通道选择器控制 - void ExtChSelector_selectCh(int ch); - void ExtChSelector_trySelectCh(int ch); - bool ExtChSelector_isOnline(); - - // 消毒液体积传感器 - // int DisinfectantVolume_readVal(); // g - // 蒸发仓水浸 - bool WaterSensor_readEvaporationBin(); - // 设备底部水浸 - bool WaterSensor_readDeviceBottom(); - /******************************************************************************* - * 辅助方法 * - *******************************************************************************/ - int ACPostPS_readPa(); // pa - int AirLeakDetectPS_readPa(); // pa - int LiquidWeightPS_readPa(); // pa - int SprayPumpPostPS_readPa(); // pa - int AddLiquidPumpPostPS_readPa(); // pa - - shared_ptr getH2O2SensorMgr() { return m_h2o2SensorDataMgr; } - - private: - void fn_test(shared_ptr cxt) ; -}; -} // namespace iflytop \ No newline at end of file diff --git a/appsrc/service/hardware/device_io_ctrl_service.cpp b/appsrc/service/hardware/device_io_ctrl_service.cpp new file mode 100644 index 0000000..e902bce --- /dev/null +++ b/appsrc/service/hardware/device_io_ctrl_service.cpp @@ -0,0 +1,394 @@ +#include "device_io_ctrl_service.hpp" +using namespace iflytop; +using namespace std; +using namespace core; + +/** + * @brief + * + * + * + * writeCmd + * + * onReport + * processReport + * + * + */ + +static bool isInDevice() { +#if (defined BUILD_ON_PC) // x86平台 + return false; +#else + return true; +#endif +} + +// klarge_space_disinfection_machine = 1, // 大空间消毒机 +// ksmall_space_disinfection_machine = 2, // 小空间消毒机 +// kpipe_disinfection_machine = 3, // 管道式消毒机 +// kdraw_bar_disinfection_box = 4, // 手持拉杆箱消毒机 +// kh2o2_ext_sensor = 5, // 外部H2O2传感器 + +#define CAN_MASTER TransmitDisinfectionCanMaster::ins() +#define GET_BOARDID() (ProjectPort::ins().getId(COMPONENT).boardId) +#define GET_SUBID() (ProjectPort::ins().getId(COMPONENT).subId) + +void DeviceIoControlService::initialize() { + GET_TO_SERVICE(m_config); + if (!isInDevice()) { + logger->warn("run in pc, skip initialize device io control service"); + return; + } else { + } + + TransmitDisinfectionCanMaster::ins()->initialize(m_config->get_canIF().c_str(), m_config->get_canBitrate(), false); + TransmitDisinfectionCanMaster::ins()->getCanProtocolCom()->regOnRawData( // + [this](packet_type_t type, uint8_t from, uint8_t to, uint8_t *hex, uint32_t hexlen) { + if (type == kreport) { + processReportMsg(from, hex, hexlen); + } + }); + REGFNV2(DeviceIoControlService, test); +} +void DeviceIoControlService::processReportMsg(uint8_t from, uint8_t *hex, uint32_t hexlen) { // + zcanbus_packet_t *packet = (zcanbus_packet_t *)hex; + if (packet->function_id == kreport_h2o2_sensor_data) { + report_h2o2_data_t *h2o2data = (report_h2o2_data_t *)packet->params; + int sensorId = 0; + + if (from < 100) + sensorId = 0; + else + sensorId = from - 100; + m_h2o2SensorDataMgr->updateH2o2SensorData(sensorId, h2o2data); + } +} + +// 加液泵控制 +#define COMPONENT HardwareComponent::AddLiquidPump +void DeviceIoControlService::AddLiquidPump_addLiquid() { + int pumpspeed = GET_SETTING(int, SettingId::drainage_pump_speed); + logger->info("AddLiquidPump_addLiquid, pumpspeed={}", pumpspeed); + + if (isInDevice()) CAN_MASTER->pumpRotate(GET_BOARDID(), GET_SUBID(), pumpspeed); +} +void DeviceIoControlService::AddLiquidPump_drainLiquid() { + int pumpspeed = GET_SETTING(int, SettingId::drainage_pump_speed); + logger->info("AddLiquidPump_drainLiquid, pumpspeed={}", -pumpspeed); + + if (isInDevice()) CAN_MASTER->pumpRotate(GET_BOARDID(), GET_SUBID(), -pumpspeed); +} +void DeviceIoControlService::AddLiquidPump_run(int rpm) { + logger->info("AddLiquidPump_run, rpm={}", rpm); + if (isInDevice()) CAN_MASTER->pumpRotate(GET_BOARDID(), GET_SUBID(), rpm); +} + +void DeviceIoControlService::AddLiquidPump_stop() { + logger->info("AddLiquidPump_stop"); + if (isInDevice()) CAN_MASTER->pumpStop(GET_BOARDID(), GET_SUBID()); +} +#undef COMPONENT + +// 喷雾泵控制 +#define COMPONENT HardwareComponent::SprayPump +void DeviceIoControlService::SprayPump_start(int32_t gpm) { + int pumpspeed_rpm = ProjectPort::ins().gpm2speed(gpm); + logger->info("SprayPump_start, gpm={}, rpm={}", gpm, pumpspeed_rpm); + if (isInDevice()) CAN_MASTER->pumpRotate(GET_BOARDID(), GET_SUBID(), pumpspeed_rpm); +} +void DeviceIoControlService::SprayPump_stop() { + logger->info("SprayPump_stop"); + if (isInDevice()) CAN_MASTER->pumpStop(GET_BOARDID(), GET_SUBID()); +} +void DeviceIoControlService::SprayPump_startInRPM(int32_t rpm) { + logger->info("SprayPump_startInRPM, rpm={}", rpm); + if (isInDevice()) CAN_MASTER->pumpRotate(GET_BOARDID(), GET_SUBID(), rpm); +} +#undef COMPONENT + +// 鼓风机控制 +#define COMPONENT HardwareComponent::Blower +void DeviceIoControlService::Blower_ctrl(int power) { + logger->info("Blower_ctrl, power={}", power); + if (isInDevice()) CAN_MASTER->blowerCtrl(GET_BOARDID(), power); + usleep(1000 * 1000); +} +void DeviceIoControlService::Blower_close() { + logger->info("Blower_close"); + if (isInDevice()) CAN_MASTER->blowerCtrl(GET_BOARDID(), 0); +} +float DeviceIoControlService::Blower_readEI() { + logger->info("Blower_readEI"); + if (isInDevice()) return CAN_MASTER->blowerReadEI(GET_BOARDID()) / 1000.0; + return 0; +} +#undef COMPONENT + +// 空压机控制 +#define COMPONENT HardwareComponent::AirCompressor +void DeviceIoControlService::AC_ctrl(int power) { + logger->info("AC_ctrl, power={}", power); + if (isInDevice()) CAN_MASTER->airCompressorCtrl(GET_BOARDID(), power); + usleep(1000 * 1000); +} +void DeviceIoControlService::AC_close() { + logger->info("AC_close"); + if (isInDevice()) CAN_MASTER->airCompressorCtrl(GET_BOARDID(), 0); +} +float DeviceIoControlService::AC_readEI() { + logger->info("AC_readEI"); + if (isInDevice()) return CAN_MASTER->airCompressorReadEI(GET_BOARDID()) / 1000.0; + return 0; +} +#undef COMPONENT + +// 加热器控制 +#define COMPONENT HardwareComponent::Heater +void DeviceIoControlService::Heater_ctrl(int power) { + logger->info("Heater_ctrl, power={}", power); + if (isInDevice()) CAN_MASTER->heaterCtrl(GET_BOARDID(), power); + usleep(1000 * 1000); +} +void DeviceIoControlService::Heater_close() { + logger->info("Heater_close"); + if (isInDevice()) CAN_MASTER->heaterCtrl(GET_BOARDID(), 0); +} +float DeviceIoControlService::Heater_readEI() { + logger->info("Heater_readEI"); + if (isInDevice()) return CAN_MASTER->heaterReadEI(GET_BOARDID()) / 1000.0; + return 0; +} +float DeviceIoControlService::Heater_readTemperature() { + logger->info("Heater_readTemperature"); + if (isInDevice()) return CAN_MASTER->heaterReadTemperature(GET_BOARDID()) / 10.0; + return 0; +} +#undef COMPONENT + +// 三色指示灯控制 +#define COMPONENT HardwareComponent::WarningLight +void DeviceIoControlService::WarningLight_setState(int r, int g, int b, int warning) { // + logger->info("WarningLight_setState, r={}, g={}, b={}, warning={}", r, g, b, warning); + if (isInDevice()) CAN_MASTER->warningLightSetState(GET_BOARDID(), r, g, b, warning); +} +#undef COMPONENT + +// 其他 +// 比例阀控制 +// 气密性测试通道选择 +// 气密性测试空压机控制 + +#define COMPONENT HardwareComponent::PositivePressureProportional +void DeviceIoControlService::PosiPressureProp_setValve(int valveValue) { // + valveValue = valveValue / 100.0 * 255; + logger->info("PosiPressureProp_setValve, valveValue={}", valveValue); + if (isInDevice()) CAN_MASTER->proportionalSetValve(GET_BOARDID(), GET_SUBID(), valveValue); +} +int DeviceIoControlService::PosiPressureProp_readPos() { + if (isInDevice()) { + int pos = CAN_MASTER->proportionalReadPos(GET_BOARDID(), GET_SUBID()); + pos = pos / 255.0 * 100; + return pos; + } + return 0; +} +bool DeviceIoControlService::PosiPressureProp_isBusy() { + if (isInDevice()) return CAN_MASTER->proportionalIsBusy(GET_BOARDID(), GET_SUBID()); + return false; +} +#undef COMPONENT + +#define COMPONENT HardwareComponent::NegativePressureProportional +void DeviceIoControlService::NegaPressureProp_setValve(int valveValue) { + valveValue = valveValue / 100.0 * 255; + logger->info("NegaPressureProp_setValve, valveValue={}", valveValue); + if (isInDevice()) CAN_MASTER->proportionalSetValve(GET_BOARDID(), GET_SUBID(), valveValue); +} +int DeviceIoControlService::NegaPressureProp_readPos() { + if (isInDevice()) { + int pos = CAN_MASTER->proportionalReadPos(GET_BOARDID(), GET_SUBID()); + pos = pos / 255.0 * 100; + return pos; + } + return 0; +} +bool DeviceIoControlService::NegaPressureProp_isBusy() { + if (isInDevice()) return CAN_MASTER->proportionalIsBusy(GET_BOARDID(), GET_SUBID()); + return false; +} +#undef COMPONENT + +#define COMPONENT HardwareComponent::AirLeakDetectTestModeCtrl + +void DeviceIoControlService::AirLeakDetectTestModeCtrl_setMode(int mode) { + logger->info("AirLeakDetectTestModeCtrl_setMode, mode={}", mode); + if (isInDevice()) CAN_MASTER->airLeakDetectTestSetMode(GET_BOARDID(), mode); +} +int DeviceIoControlService::AirLeakDetectTestModeCtrl_getMode() { + if (isInDevice()) return CAN_MASTER->airLeakDetectTestGetMode(GET_BOARDID()); + return 0; +} + +#undef COMPONENT + +// ExtChSelector +#define COMPONENT HardwareComponent::ExtChSelector +void DeviceIoControlService::ExtChSelector_selectCh(int ch) { + logger->info("ExtChSelector_selectCh, ch={}", ch); + if (isInDevice()) CAN_MASTER->extChSelectorSetCh(GET_BOARDID(), ch); +} + +bool DeviceIoControlService::ExtChSelector_isOnline() { + if (isInDevice()) { + try { + CAN_MASTER->extChSelectorGetCh(GET_BOARDID()); + return true; + } catch (const std::exception &e) { + return false; + } + } + return false; +} +void DeviceIoControlService::ExtChSelector_trySelectCh(int ch) { + logger->info("ExtChSelector_trySelectCh, ch={}", ch); + if (isInDevice()) { + try { + ExtChSelector_selectCh(GET_BOARDID()); + } catch (const std::exception &e) { + } + } +} + +#undef COMPONENT + +// 水浸传感器 + +// 蒸发仓水浸 +#define COMPONENT HardwareComponent::EvaporationBinWS +bool DeviceIoControlService::WaterSensor_readEvaporationBin() { + if (isInDevice()) return CAN_MASTER->evaporationTankWSReadState(GET_BOARDID()); + return false; +} +#undef COMPONENT + +#define COMPONENT HardwareComponent::DeviceBottomWS +bool DeviceIoControlService::WaterSensor_readDeviceBottom() { + if (isInDevice()) return CAN_MASTER->bottomWSReadState(GET_BOARDID()); + return false; +} // 设备底部水浸 +#undef COMPONENT + +#define COMPONENT HardwareComponent::ACPostPS +int DeviceIoControlService::ACPostPS_readPa() { // + if (isInDevice()) { + int32_t val = CAN_MASTER->psBusReadData(GET_BOARDID(), GET_SUBID()); + return ProjectPort::ins().ACPostPS_To_Pa(val); + } + return 0; +} +#undef COMPONENT + +#define COMPONENT HardwareComponent::AirLeakDetectPS +int DeviceIoControlService::AirLeakDetectPS_readPa() { // + if (isInDevice()) { + int32_t val = CAN_MASTER->psBusReadData(GET_BOARDID(), GET_SUBID()); + return ProjectPort::ins().AirLeakDetectPS_To_Pa(val); + } + return 0; +} +#undef COMPONENT + +#define COMPONENT HardwareComponent::LiquidWeightPS +int DeviceIoControlService::LiquidWeightPS_readPa() { // + if (isInDevice()) { + int32_t val = CAN_MASTER->psBusReadData(GET_BOARDID(), GET_SUBID()); + return ProjectPort::ins().LiquidWeightPS_To_Pa(val); + } + return 0; +} +#undef COMPONENT + +#define COMPONENT HardwareComponent::SprayPumpPostPS +int DeviceIoControlService::SprayPumpPostPS_readPa() { // + if (isInDevice()) { + int32_t val = CAN_MASTER->psBusReadData(GET_BOARDID(), GET_SUBID()); + return ProjectPort::ins().SprayPumpPostPS_To_Pa(val); + } + return 0; +} +#undef COMPONENT + +#define COMPONENT HardwareComponent::AddLiquidPumpPostPS +int DeviceIoControlService::AddLiquidPumpPostPS_readPa() { // + if (isInDevice()) { + int32_t val = CAN_MASTER->psBusReadData(GET_BOARDID(), GET_SUBID()); + return ProjectPort::ins().AddLiquidPumpPostPS_To_Pa(val); + } + return 0; +} +#undef COMPONENT + +// int DeviceIoControlService::DisinfectantVolume_readVal() { +// if (isInDevice()) { +// int pa = LiquidWeightPS_readPa(); +// return ProjectPort::ins().pressurePa2VolumeG(pa); +// } +// return 0; +// } // g + +#define PROCESS_CMD(fnName, ...) \ + if (testFnName == #fnName) { \ + fnName(__VA_ARGS__); \ + return; \ + } + +#define PROCESS_CMD_WITH_RET(fnName, ...) \ + if (testFnName == #fnName) { \ + auto ret = fnName(__VA_ARGS__); \ + cxt->content = ret; \ + return; \ + } + +void DeviceIoControlService::fn_test(shared_ptr cxt) { + // + string testFnName = cxt->params["testFnName"]; + json param = cxt->params["testFnParams"]; + + PROCESS_CMD(AddLiquidPump_addLiquid); + PROCESS_CMD(AddLiquidPump_run, param[0]); + PROCESS_CMD(AddLiquidPump_drainLiquid); + PROCESS_CMD(AddLiquidPump_stop); + PROCESS_CMD(SprayPump_start, param[0]); + PROCESS_CMD(SprayPump_startInRPM, param[0]); + PROCESS_CMD(SprayPump_stop); + PROCESS_CMD(Blower_ctrl, param[0]); + PROCESS_CMD(Blower_close); + PROCESS_CMD_WITH_RET(Blower_readEI); + PROCESS_CMD(AC_ctrl, param[0]); + PROCESS_CMD(AC_close); + PROCESS_CMD_WITH_RET(AC_readEI); + PROCESS_CMD(Heater_ctrl, param[0]); + PROCESS_CMD(Heater_close); + PROCESS_CMD_WITH_RET(Heater_readEI); + PROCESS_CMD_WITH_RET(Heater_readTemperature); + PROCESS_CMD(WarningLight_setState, param[0], param[1], param[2], param[3]); + PROCESS_CMD(PosiPressureProp_setValve, param[0]); + PROCESS_CMD_WITH_RET(PosiPressureProp_readPos); + PROCESS_CMD_WITH_RET(PosiPressureProp_isBusy); + PROCESS_CMD(NegaPressureProp_setValve, param[0]); + PROCESS_CMD_WITH_RET(NegaPressureProp_readPos); + PROCESS_CMD_WITH_RET(NegaPressureProp_isBusy); + PROCESS_CMD(AirLeakDetectTestModeCtrl_setMode, param[0]); + PROCESS_CMD_WITH_RET(AirLeakDetectTestModeCtrl_getMode); + PROCESS_CMD(ExtChSelector_selectCh, param[0]); + PROCESS_CMD(ExtChSelector_trySelectCh, param[0]); + PROCESS_CMD_WITH_RET(ExtChSelector_isOnline); + PROCESS_CMD_WITH_RET(WaterSensor_readEvaporationBin); + PROCESS_CMD_WITH_RET(WaterSensor_readDeviceBottom); + PROCESS_CMD_WITH_RET(ACPostPS_readPa); + PROCESS_CMD_WITH_RET(AirLeakDetectPS_readPa); + PROCESS_CMD_WITH_RET(LiquidWeightPS_readPa); + PROCESS_CMD_WITH_RET(SprayPumpPostPS_readPa); + PROCESS_CMD_WITH_RET(AddLiquidPumpPostPS_readPa); +} diff --git a/appsrc/service/hardware/device_io_ctrl_service.hpp b/appsrc/service/hardware/device_io_ctrl_service.hpp new file mode 100644 index 0000000..3536931 --- /dev/null +++ b/appsrc/service/hardware/device_io_ctrl_service.hpp @@ -0,0 +1,118 @@ +#pragma once +#include +#include +#include +#include +#include +#include +#include +#include +#include +// +#include "baseservice/baseservice.hpp" +// +#include "base/can_packet_dumper.hpp" +#include "base/h2o2_sensor_data_mgr.hpp" + +/** + * @brief + * + * service: DeviceIoControlService + * + * 监听事件: + * 依赖状态: + * 依赖服务: + * 作用: + * + */ + +namespace iflytop { +using namespace std; +using namespace core; + +class DeviceIoControlService : public enable_shared_from_this { + THISCLASS(DeviceIoControlService); + + private: + shared_ptr m_config; + unique_ptr m_workQueue; + + shared_ptr m_h2o2SensorDataMgr = make_shared(); + + public: + void initialize(); + + private: + void processReportMsg(uint8_t from, uint8_t *hex, uint32_t hexlen); + + public: + // 加液泵控制 + void AddLiquidPump_addLiquid(); + void AddLiquidPump_run(int rpm); + void AddLiquidPump_drainLiquid(); + void AddLiquidPump_stop(); + + // 喷雾泵控制 + void SprayPump_start(int32_t gpmin); + void SprayPump_startInRPM(int32_t rpm); + void SprayPump_stop(); + + // 鼓风机控制 + void Blower_ctrl(int power); + void Blower_close(); + float Blower_readEI(); + + // 空压机控制 + void AC_ctrl(int power); + void AC_close(); + float AC_readEI(); + + // 加热器控制 + void Heater_ctrl(int power); + void Heater_close(); + float Heater_readEI(); + float Heater_readTemperature(); + + // 三色指示灯控制 + void WarningLight_setState(int r, int g, int b, int warning); + + // 正压比例阀控制 + void PosiPressureProp_setValve(int valveValue); + int PosiPressureProp_readPos(); + bool PosiPressureProp_isBusy(); + + // 负压比例阀控制 + void NegaPressureProp_setValve(int valveValue); + int NegaPressureProp_readPos(); + bool NegaPressureProp_isBusy(); + + // 气密性测试通道控制 + void AirLeakDetectTestModeCtrl_setMode(int mode); // 1:气密封性测试模式, 2:正常模式 + int AirLeakDetectTestModeCtrl_getMode(); + + // 外部通道选择器控制 + void ExtChSelector_selectCh(int ch); + void ExtChSelector_trySelectCh(int ch); + bool ExtChSelector_isOnline(); + + // 消毒液体积传感器 + // int DisinfectantVolume_readVal(); // g + // 蒸发仓水浸 + bool WaterSensor_readEvaporationBin(); + // 设备底部水浸 + bool WaterSensor_readDeviceBottom(); + /******************************************************************************* + * 辅助方法 * + *******************************************************************************/ + int ACPostPS_readPa(); // pa + int AirLeakDetectPS_readPa(); // pa + int LiquidWeightPS_readPa(); // pa + int SprayPumpPostPS_readPa(); // pa + int AddLiquidPumpPostPS_readPa(); // pa + + shared_ptr getH2O2SensorMgr() { return m_h2o2SensorDataMgr; } + + private: + void fn_test(shared_ptr cxt) ; +}; +} // namespace iflytop \ No newline at end of file diff --git a/appsrc/service/hardware/disinfectant_weight_update_service.hpp b/appsrc/service/hardware/disinfectant_weight_update_service.hpp index 681a26d..098800e 100644 --- a/appsrc/service/hardware/disinfectant_weight_update_service.hpp +++ b/appsrc/service/hardware/disinfectant_weight_update_service.hpp @@ -10,7 +10,7 @@ #include // #include "baseservice/baseservice.hpp" -#include "device_ctrl_service.hpp" +#include "device_io_ctrl_service.hpp" // #include "base/can_packet_dumper.hpp" #include "base/h2o2_sensor_data_mgr.hpp" diff --git a/appsrc/service/hardware/warning_light_controler.hpp b/appsrc/service/hardware/warning_light_controler.hpp index 7771df9..3cc13bc 100644 --- a/appsrc/service/hardware/warning_light_controler.hpp +++ b/appsrc/service/hardware/warning_light_controler.hpp @@ -10,7 +10,7 @@ #include // #include "baseservice/baseservice.hpp" -#include "device_ctrl_service.hpp" +#include "device_io_ctrl_service.hpp" // #include "base/can_packet_dumper.hpp" #include "base/h2o2_sensor_data_mgr.hpp" diff --git a/appsrc/service/main_control_service.cpp b/appsrc/service/main_control_service.cpp index 5655f91..154dcbf 100644 --- a/appsrc/service/main_control_service.cpp +++ b/appsrc/service/main_control_service.cpp @@ -16,7 +16,7 @@ #include "service/app/drain_liquid_service.hpp" #include "service/app/pipeline_pressure_control.hpp" // -#include "hardware/device_ctrl_service.hpp" +#include "hardware/device_io_ctrl_service.hpp" #include "hardware/disinfectant_weight_update_service.hpp" #include "hardware/warning_light_controler.hpp" diff --git a/appsrc/service/test_page_mgr_service.hpp b/appsrc/service/test_page_mgr_service.hpp index f398e0a..6d744ac 100644 --- a/appsrc/service/test_page_mgr_service.hpp +++ b/appsrc/service/test_page_mgr_service.hpp @@ -12,7 +12,7 @@ #include "appbase/appbean/test_page_iterm.hpp" #include "baseservice/baseservice.hpp" #include "testpage/test_page_processer.hpp" -#include "service/hardware/device_ctrl_service.hpp" +#include "service/hardware/device_io_ctrl_service.hpp" namespace iflytop { using namespace testpage;