diff --git a/app_protocols/apperrorcode/apperrorcode.hpp b/app_protocols/apperrorcode/apperrorcode.hpp index c9fdd84..13afa93 100644 --- a/app_protocols/apperrorcode/apperrorcode.hpp +++ b/app_protocols/apperrorcode/apperrorcode.hpp @@ -62,6 +62,8 @@ typedef enum { kappe_missing_param = 10016, kappe_param_num_err = 10017, + kappe_is_busy = 10018, + } apperror_t; } diff --git a/appsrc/appbase/appbase.hpp b/appsrc/appbase/appbase.hpp index 23c98d9..0ae8237 100644 --- a/appsrc/appbase/appbase.hpp +++ b/appsrc/appbase/appbase.hpp @@ -11,4 +11,5 @@ #include "appbase/appbean/hardware_component.hpp" #include "appbase/appbean/setting_id.hpp" #include "appbase/appbean/pumpid.hpp" -#include "appbase/appbean/test_page_iterm.hpp" \ No newline at end of file +#include "appbase/appbean/test_page_iterm.hpp" +#include "appbean/device_state.hpp" diff --git a/appsrc/appbase/appbean/device_state.cpp b/appsrc/appbase/appbean/device_state.cpp new file mode 100644 index 0000000..284541e --- /dev/null +++ b/appsrc/appbase/appbean/device_state.cpp @@ -0,0 +1,3 @@ +#include "device_state.hpp" + +DeviceState_ZENUM_IMPL; \ No newline at end of file diff --git a/appsrc/appbase/appbean/device_state.hpp b/appsrc/appbase/appbean/device_state.hpp new file mode 100644 index 0000000..f01f5ff --- /dev/null +++ b/appsrc/appbase/appbean/device_state.hpp @@ -0,0 +1,13 @@ +#pragma once + +#include "iflytop/core/components/zenum_template/zenum_template.hpp" + +#define DeviceState_ZENUM_IMPL ZENUM_IMPL(DeviceState, DeviceState_LIST) +#define DeviceState_LIST(type, marco) /**/ \ + marco(type, Idle) /**/ \ + marco(type, Disinfection) /**/ \ + marco(type, AddingLiquid) /**/ \ + marco(type, DrainingLiquid) /**/ \ + marco(type, AirLeakDetectTesting) /**/ + +ZENUM_DECLAR(DeviceState, DeviceState_LIST); diff --git a/appsrc/appsetting/project_port/basic/project_constant.hpp b/appsrc/appsetting/project_port/basic/project_constant.hpp index 6f3a4dc..d15ecfb 100644 --- a/appsrc/appsetting/project_port/basic/project_constant.hpp +++ b/appsrc/appsetting/project_port/basic/project_constant.hpp @@ -19,8 +19,8 @@ #define MAX_SUPPORT_SENSOR 3 // GPM_TO_SPEED_RADIO -#define LARGE_SPACE_DM_GPM_TO_SPEED_RADIO (11.0250) -#define SMALL_SPACE_DM_GPM_TO_SPEED_RADIO (11.0250) +#define LARGE_SPACE_DM__GPM_TO_SPEED_RADIO (11.0250) +#define SMALL_SPACE_DM__GPM_TO_SPEED_RADIO (11.0250) #define PIPE_DM_GPM_TO_SPEED_RADIO (11.0250) #define DRAW_BAR_DM_GPM_TO_SPEED_RADIO (41.97) @@ -32,3 +32,8 @@ #define POSITIVE_PRESSURE_PROPORTIONAL_ID 0x01 #define NEGATIVE_PRESSURE_PROPORTIONAL_ID 0x02 + +#define LARGE_SPACE_DM__DISINFECTANT_BUCKET_CAPACITY 5000 +#define SMALL_SPACE_DM__DISINFECTANT_BUCKET_CAPACITY 2800 +#define PIPE_DM__DISINFECTANT_BUCKET_CAPACITY 2500 +#define DRAW_BAR_DM__DISINFECTANT_BUCKET_CAPACITY 0 \ 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 91e1f6f..9fbd62b 100644 --- a/appsrc/appsetting/project_port/project_port.cpp +++ b/appsrc/appsetting/project_port/project_port.cpp @@ -43,17 +43,21 @@ void ProjectPort::initProjectSetting(int projectTypeInt) { projectType = projectType2Str(projectTypeInt); if (projectTypeInt == klarge_space_disinfection_machine) { - extSensorNum = LARGE_SPACE_DM_EXT_SENSOR_NUM; - gpmToSpeedRadio = LARGE_SPACE_DM_GPM_TO_SPEED_RADIO; + extSensorNum = LARGE_SPACE_DM_EXT_SENSOR_NUM; + gpmToSpeedRadio = LARGE_SPACE_DM__GPM_TO_SPEED_RADIO; + disinfectantBucketCapacity = LARGE_SPACE_DM__DISINFECTANT_BUCKET_CAPACITY; } else if (projectTypeInt == ksmall_space_disinfection_machine) { - extSensorNum = SMALL_SPACE_DM_EXT_SENSOR_NUM; - gpmToSpeedRadio = SMALL_SPACE_DM_GPM_TO_SPEED_RADIO; + extSensorNum = SMALL_SPACE_DM_EXT_SENSOR_NUM; + gpmToSpeedRadio = SMALL_SPACE_DM__GPM_TO_SPEED_RADIO; + disinfectantBucketCapacity = SMALL_SPACE_DM__DISINFECTANT_BUCKET_CAPACITY; } else if (projectTypeInt == kpipe_disinfection_machine) { - extSensorNum = PIPE_DM_EXT_SENSOR_NUM; - gpmToSpeedRadio = PIPE_DM_GPM_TO_SPEED_RADIO; + extSensorNum = PIPE_DM_EXT_SENSOR_NUM; + gpmToSpeedRadio = PIPE_DM_GPM_TO_SPEED_RADIO; + disinfectantBucketCapacity = PIPE_DM__DISINFECTANT_BUCKET_CAPACITY; } else if (projectTypeInt == kdraw_bar_disinfection_box) { - extSensorNum = DRAW_BAR_DM_EXT_SENSOR_NUM; - gpmToSpeedRadio = DRAW_BAR_DM_GPM_TO_SPEED_RADIO; + extSensorNum = DRAW_BAR_DM_EXT_SENSOR_NUM; + gpmToSpeedRadio = DRAW_BAR_DM_GPM_TO_SPEED_RADIO; + disinfectantBucketCapacity = DRAW_BAR_DM__DISINFECTANT_BUCKET_CAPACITY; } else { ZCHECK(false, "projectTypeInt not support: " + to_string(projectTypeInt)); } diff --git a/appsrc/appsetting/project_port/project_port.hpp b/appsrc/appsetting/project_port/project_port.hpp index 3a554fe..4aa0d12 100644 --- a/appsrc/appsetting/project_port/project_port.hpp +++ b/appsrc/appsetting/project_port/project_port.hpp @@ -39,9 +39,10 @@ class ProjectPort { // // some properties // - int extSensorNum = 0; - double gpmToSpeedRadio = 0; - bool isInited = false; + int extSensorNum = 0; + double gpmToSpeedRadio = 0; + bool isInited = false; + int disinfectantBucketCapacity = 0; public: static ProjectPort &ins() { @@ -94,4 +95,5 @@ class ProjectPort { }; #define PROJECT_TYPE (GET_SERVICE(ProjectSettingMgr)->getProjType()) #define PROJECT_SETTING (GET_SERVICE(ProjectSettingMgr)) +#define PORT (ProjectPort::ins()) } // namespace iflytop diff --git a/appsrc/baseservice/devicestate/device_state_service.hpp b/appsrc/baseservice/devicestate/device_state_service.hpp index 76cdfe9..2cbba3f 100644 --- a/appsrc/baseservice/devicestate/device_state_service.hpp +++ b/appsrc/baseservice/devicestate/device_state_service.hpp @@ -34,16 +34,18 @@ using namespace core; class DeviceStateService : public enable_shared_from_this { THISCLASS(DeviceStateService); - bool loginFlag = false; + bool loginFlag = false; bool m_isLoginAdmin = false; string loginUid; + DeviceState state = DeviceState::Idle; + public: DeviceStateService() {}; void setLoginState(string uid, bool isadmin) { - loginFlag = true; - loginUid = uid; + loginFlag = true; + loginUid = uid; m_isLoginAdmin = isadmin; } @@ -55,6 +57,9 @@ class DeviceStateService : public enable_shared_from_this { string getLoginUid() { return loginUid; } bool isLoginAdmin() { return m_isLoginAdmin; } + DeviceState getDeviceState() { return state; } + void setDeviceState(DeviceState s) { state = s; } + void initialize() {}; }; } // namespace iflytop \ No newline at end of file diff --git a/appsrc/service/app/add_liquid_service.cpp b/appsrc/service/app/add_liquid_service.cpp index b0fe7c7..9779130 100644 --- a/appsrc/service/app/add_liquid_service.cpp +++ b/appsrc/service/app/add_liquid_service.cpp @@ -8,8 +8,93 @@ void AddLiquidService::initialize() { REGFNV2(AddLiquidService, getServiceConfig); } -void AddLiquidService::start(int stopatg) { m_workstate = kaddingLiquid; } -void AddLiquidService::stop() { m_workstate = kidle; } +void AddLiquidService::start(int stopatg) { + lock_guard lock(lock_); + if (m_ds->getDeviceState() != DeviceState::Idle) { + logger->warn("start add liquid fail, device state is not idle"); + THROW_APP_EXCEPTION(err::kappe_is_busy, "device state is not idle"); + } + + if (m_thread) { + m_thread->join(); + m_thread = nullptr; + m_workstate = kidle; + } + + int32_t nowvolume = m_dwus->getWeight(); + + int maxg = PORT.disinfectantBucketCapacity; + stopatg += 0; // 由于加液过程中,测量到的液体要比真实的小,所以这里要比预设值大100 + + if (stopatg > maxg) { + logger->warn("start add liquid fail, stopatg {} > maxg {}", stopatg, maxg); + stopatg = maxg; + } + + if (nowvolume > stopatg) { + logger->warn("start add liquid fail, nowvolume {} > stopatg {}", nowvolume, stopatg); + return; + } + + m_workstate = kaddingLiquid; + + m_thread.reset(new Thread("addLiquid", [this, stopatg]() { addLiquidWork(stopatg); })); + // + logger->info("start add liquid success"); +} + +void AddLiquidService::addLiquidWork(int stopatg) { + ThisThread thisThread; + /** + * @brief 开始加液 + */ + logger->info("start add liquid"); + m_dcs->AddLiquidPump_addLiquid(); + while (!thisThread.getExitFlag()) { + int32_t nowvolume = m_dwus->getWeight(); + logger->info("replenishingFluids {}g", nowvolume); + if (nowvolume > stopatg) { + break; + } + thisThread.sleepForMs(300); + } + m_dcs->AddLiquidPump_stop(); + /** + * @brief 排空管路 + */ + m_workstate = kemptyLineLiquid; + logger->info("start drain the liquid from the line"); + m_dcs->SprayPump_startInRPM(-800); // 40gpm 约等于450RPM + thisThread.sleepForMs(1000); + m_dcs->AddLiquidPump_run(-23); // @TODO:提取常数到系统配置中 +#define EMTPTY_LINE_WHEN_ADDING_DISINFECTANT_TIMES 1000 + for (size_t i = 0; i < EMTPTY_LINE_WHEN_ADDING_DISINFECTANT_TIMES; i++) { + if (thisThread.getExitFlag()) break; + thisThread.sleepForMs(100); + } + m_dcs->AddLiquidPump_stop(); + m_dcs->SprayPump_stop(); + + /** + * @brief 加液完成 + */ + logger->info("empty line liquid done"); + m_workstate = kidle; +} + +void AddLiquidService::stop() { + lock_guard lock(lock_); + if (m_workstate == kidle) { + return; + } + + m_workstate = kidle; + if (m_thread) { + m_thread->join(); + m_thread = nullptr; + } + logger->info("stoped add liquid"); +} AddLiquidService::state_t AddLiquidService::getWorkstate() { return m_workstate; } void AddLiquidService::fn_start(shared_ptr cxt) { // @@ -22,7 +107,6 @@ void AddLiquidService::fn_getState(shared_ptr cxt) { // cxt->content["workStateDisplay"] = state2chstr(getWorkstate()); cxt->content["nowLiquid"] = 1000; } - void AddLiquidService::fn_getServiceConfig(shared_ptr cxt) { json cfg; cfg["maxLiquid"] = 4950; diff --git a/appsrc/service/app/add_liquid_service.hpp b/appsrc/service/app/add_liquid_service.hpp index d2a5921..6fd0aa1 100644 --- a/appsrc/service/app/add_liquid_service.hpp +++ b/appsrc/service/app/add_liquid_service.hpp @@ -4,12 +4,17 @@ #include #include #include +#include #include #include #include #include + // #include "baseservice/baseservice.hpp" +#include "service/hardware/device_ctrl_service.hpp" +#include "service/hardware/disinfectant_weight_update_service.hpp" +// namespace iflytop { class AddLiquidService : public enable_shared_from_this { THISCLASS(AddLiquidService); @@ -52,8 +57,15 @@ class AddLiquidService : public enable_shared_from_this { shared_ptr m_ds; shared_ptr m_gConfig; + shared_ptr m_dcs; + shared_ptr m_dwus; + + unique_ptr m_thread; + state_t m_workstate = kidle; + recursive_mutex lock_; + public: void initialize(); @@ -67,6 +79,8 @@ class AddLiquidService : public enable_shared_from_this { void fn_getServiceConfig(shared_ptr cxt); private: + void addLiquidWork(int stopatg); + }; } // namespace iflytop diff --git a/appsrc/service/app/air_tightness_test.cpp b/appsrc/service/app/air_leak_detect_test.cpp similarity index 97% rename from appsrc/service/app/air_tightness_test.cpp rename to appsrc/service/app/air_leak_detect_test.cpp index 5792109..2e66f49 100644 --- a/appsrc/service/app/air_tightness_test.cpp +++ b/appsrc/service/app/air_leak_detect_test.cpp @@ -1,4 +1,4 @@ -#include "air_tightness_test.hpp" +#include "air_leak_detect_test.hpp" using namespace iflytop; void AirLeakDetectTest::initialize() { logger->info("AirLeakDetectTest initialize"); diff --git a/appsrc/service/app/air_tightness_test.hpp b/appsrc/service/app/air_leak_detect_test.hpp similarity index 100% rename from appsrc/service/app/air_tightness_test.hpp rename to appsrc/service/app/air_leak_detect_test.hpp diff --git a/appsrc/service/hardware/device_ctrl_service.cpp b/appsrc/service/hardware/device_ctrl_service.cpp index 83c0304..9d031b5 100644 --- a/appsrc/service/hardware/device_ctrl_service.cpp +++ b/appsrc/service/hardware/device_ctrl_service.cpp @@ -67,6 +67,8 @@ void DeviceIoControlService::AddLiquidPump_drainLiquid() { int pumpspeed = GET_SETTING(int, SettingId::drainage_pump_speed); CAN_MASTER->pumpRotate(GET_BOARDID(), GET_SUBID(), -pumpspeed); } +void DeviceIoControlService::AddLiquidPump_run(int rpm) { CAN_MASTER->pumpRotate(GET_BOARDID(), GET_SUBID(), rpm); } + void DeviceIoControlService::AddLiquidPump_stop() { CAN_MASTER->pumpStop(GET_BOARDID(), GET_SUBID()); } #undef COMPONENT @@ -190,9 +192,8 @@ int DeviceIoControlService::AddLiquidPumpPostPS_readPa() { // #undef COMPONENT int DeviceIoControlService::DisinfectantVolume_readVal() { - - int pa = LiquidWeightPS_readPa(); + int pa = LiquidWeightPS_readPa(); return ProjectPort::ins().pressurePa2VolumeG(pa); - - - return 0; } // g \ No newline at end of file + + return 0; +} // g \ No newline at end of file diff --git a/appsrc/service/hardware/device_ctrl_service.hpp b/appsrc/service/hardware/device_ctrl_service.hpp index 1bcfb26..ec35003 100644 --- a/appsrc/service/hardware/device_ctrl_service.hpp +++ b/appsrc/service/hardware/device_ctrl_service.hpp @@ -47,6 +47,7 @@ class DeviceIoControlService : public enable_shared_from_this