diff --git a/.settings/language.settings.xml b/.settings/language.settings.xml index bd97006..adb54ce 100644 --- a/.settings/language.settings.xml +++ b/.settings/language.settings.xml @@ -5,7 +5,7 @@ - + @@ -16,7 +16,7 @@ - + diff --git a/README.md b/README.md index b063c72..c202f41 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,13 @@ ``` +V101: +1. 重构加酸逻辑 +2. 预充管路,改成先回流再预冲 +3. 修改提示 "泵机" 为 "通道" +4. 修改预充管路,只充满选中管路 - +V102: + 1.设备在工作时,禁止离开首页 + 2.设备在工作时,禁止切换模式 ``` @@ -10,7 +17,6 @@ TODO: 1. 输入超过10次错误密码后,弹出提示框,请等待24小时,24小时后,页面将自动切换到恢复出厂设置页面。 2. 添加恢复出厂设置按键,且恢复出厂设置按键按下后,需要根用户二次确认。 - 3. 转换比设置错误可能到只泵机不转 ``` diff --git a/stm32components b/stm32components index f45df89..d8826b5 160000 --- a/stm32components +++ b/stm32components @@ -1 +1 @@ -Subproject commit f45df89965564db5c5ad518c7a704571726b8a6e +Subproject commit d8826b58d64f4f69f5d867d110e5a8705b8bcdef diff --git a/uappbase/appcfg/appcfg.hpp b/uappbase/appcfg/appcfg.hpp index 833fb2c..1b732b2 100644 --- a/uappbase/appcfg/appcfg.hpp +++ b/uappbase/appcfg/appcfg.hpp @@ -65,4 +65,10 @@ #define ACID_DEFAULT_NAME14 "一氯乙酸" #define ACID_DEFAULT_NAME15 "氢氟酸" -#define PUMPDEFVEL "500" // 100r/min \ No newline at end of file +#define PUMPDEFVEL "400" // 100r/min + +// 通道每次小回流的液体长度 +#define CH0APPENDML 0.2 +#define CH1APPENDML 0.2 +#define CH2APPENDML 0.1 +#define CH3APPENDML 0.1 diff --git a/uappbase/bean/config_index_enum.hpp b/uappbase/bean/config_index_enum.hpp index 1447fba..37cf1d3 100644 --- a/uappbase/bean/config_index_enum.hpp +++ b/uappbase/bean/config_index_enum.hpp @@ -82,7 +82,10 @@ typedef enum { /*********************************************************************************************************************** * 回流参数配置 * ***********************************************************************************************************************/ - kcfg_pipeLengthML, // 酸液管路长度 + kcfg_pipeLengthML0, // 酸液管路长度 + kcfg_pipeLengthML1, // 酸液管路长度 + kcfg_pipeLengthML2, // 酸液管路长度 + kcfg_pipeLengthML3, // 酸液管路长度 kcfg_m0irun, // 电机0 irun kcfg_m1irun, // 电机1 irun diff --git a/uappbase/bean/event.hpp b/uappbase/bean/event.hpp index b068511..15674af 100644 --- a/uappbase/bean/event.hpp +++ b/uappbase/bean/event.hpp @@ -1,5 +1,7 @@ #pragma once #include +#include +#include #include @@ -9,7 +11,7 @@ using namespace std; typedef enum { kAppEvent_RunModeChangeEvent, kAppEvent_RemoterConnectStateChangeEvent, - kAppEvent_PumpWorkStateChangeEvent, + kAppEvent_StateDisplayInfo, kAppEvent_ConfigChangeEvent, kAppEvent_BleConnectEvent, } AppEventType_t; @@ -28,6 +30,7 @@ typedef struct { uint32_t placeholder; config_index_t configIndex; char bleName[20]; + char stateDisplayInfo[30]; } d; } AppEvent_t; @@ -45,4 +48,10 @@ static inline AppEvent_t createConfigChangeEvent(config_index_t index) { return event; } +static inline AppEvent_t createStateDisplayInfoEvent(const char* info) { + AppEvent_t event; + event.type = kAppEvent_StateDisplayInfo; + strncpy(event.d.stateDisplayInfo, info, sizeof(event.d.stateDisplayInfo)); + return event; +} } // namespace iflytop \ No newline at end of file diff --git a/uappbase/service/config_index.cpp b/uappbase/service/config_index.cpp index ef0dd13..cc98fe8 100644 --- a/uappbase/service/config_index.cpp +++ b/uappbase/service/config_index.cpp @@ -78,9 +78,9 @@ static cfg_iterm_info_t cfg_iterm_infos[] = { /*********************************************************************************************************************** * 其他配置 * ***********************************************************************************************************************/ - CFG_ITERM(kcfg_lockAcidName, kcfgt_bool, "false"), // - CFG_ITERM(kcfg_echDitrUpLi, kcfgt_int32, "99"), // 每次分配上限设定值 each distri up-limit - CFG_ITERM(kcfg_distrInterval, kcfgt_float, "1.5"), // 每次分配间隔时间 + CFG_ITERM(kcfg_lockAcidName, kcfgt_bool, "false"), // + CFG_ITERM(kcfg_echDitrUpLi, kcfgt_int32, "99"), // 每次分配上限设定值 each distri up-limit + CFG_ITERM(kcfg_distrInterval, kcfgt_float, "1.5"), // 每次分配间隔时间 // CFG_ITERM(kcfg_pumpDefVel, kcfgt_int32, PUMPDEFVEL), // CFG_ITERM(kcfg_pumpDefVel0, kcfgt_int32, PUMPDEFVEL), // @@ -98,8 +98,10 @@ static cfg_iterm_info_t cfg_iterm_infos[] = { /*********************************************************************************************************************** * 回流参数配置 * ***********************************************************************************************************************/ - - CFG_ITERM(kcfg_pipeLengthML, kcfgt_float, "100"), // + CFG_ITERM(kcfg_pipeLengthML0, kcfgt_float, "14"), // + CFG_ITERM(kcfg_pipeLengthML1, kcfgt_float, "14"), // + CFG_ITERM(kcfg_pipeLengthML2, kcfgt_float, "7"), // + CFG_ITERM(kcfg_pipeLengthML3, kcfgt_float, "7"), // }; const char *cfgName(int32_t index) { diff --git a/uappbase/service/config_index.hpp b/uappbase/service/config_index.hpp index e96e7d6..01ff1df 100644 --- a/uappbase/service/config_index.hpp +++ b/uappbase/service/config_index.hpp @@ -21,7 +21,7 @@ typedef struct { const char *initval; } cfg_iterm_info_t; -#define CFG_MAX_INDEX 58 +#define CFG_MAX_INDEX 61 const char *cfgName(int32_t index); cfg_iterm_type_t cfgType(int32_t index); diff --git a/uappbase/service/config_service.cpp b/uappbase/service/config_service.cpp index 78d2c3c..02c74b0 100644 --- a/uappbase/service/config_service.cpp +++ b/uappbase/service/config_service.cpp @@ -3,7 +3,7 @@ #include "uappbase\service\app_event_bus.hpp" // -#define CFG_HEADER 0x12345671 +#define CFG_HEADER 0x12345670 /** * @brief CFG内存使用 * @@ -98,7 +98,7 @@ void ConfigService::setcfgAndFlush(config_index_t index, int32_t val) { void ConfigService::setcfgAndFlush(config_index_t index, float val) { zlock_guard lg(mutex); char buf[CONTENT_MAX_LEN]; - snprintf(buf, CONTENT_MAX_LEN, "%.2f", val); + snprintf(buf, CONTENT_MAX_LEN, "%.3f", val); _setcfgAndFlush(index, buf); } diff --git a/uappbase/service/config_service_utils.cpp b/uappbase/service/config_service_utils.cpp index a72d031..9358ef5 100644 --- a/uappbase/service/config_service_utils.cpp +++ b/uappbase/service/config_service_utils.cpp @@ -1,6 +1,56 @@ #include "config_service_utils.hpp" namespace iflytop { +float getPumpAppendMl(int chid) { + switch (chid) { + case 0: + return CH0APPENDML; // + case 1: + return CH1APPENDML; + case 2: + return CH2APPENDML; + case 3: + return CH3APPENDML; + default: + ZASSERT(0); + return 0; + } +} + +float getCfgPipeLengthML(int chid) { + switch (chid) { + case 0: + return getCfgFloat(kcfg_pipeLengthML0); + case 1: + return getCfgFloat(kcfg_pipeLengthML1); + case 2: + return getCfgFloat(kcfg_pipeLengthML2); + case 3: + return getCfgFloat(kcfg_pipeLengthML3); + default: + ZASSERT(0); + return 0; + } +} +void setCfgPipeLengthML(int chid, float ml) { + switch (chid) { + case 0: + CS->setcfgAndFlush(kcfg_pipeLengthML0, ml); + break; + case 1: + CS->setcfgAndFlush(kcfg_pipeLengthML1, ml); + break; + case 2: + CS->setcfgAndFlush(kcfg_pipeLengthML2, ml); + break; + case 3: + CS->setcfgAndFlush(kcfg_pipeLengthML3, ml); + break; + default: + ZASSERT(0); + } +} + int getMxRunRPM(int32_t mid) { // float rpm = 0; if (mid == 0) { diff --git a/uappbase/service/config_service_utils.hpp b/uappbase/service/config_service_utils.hpp index 2af256f..e9f69b4 100644 --- a/uappbase/service/config_service_utils.hpp +++ b/uappbase/service/config_service_utils.hpp @@ -13,4 +13,9 @@ int32_t getMxIRun(int motorid); const char* getPasswd(const char* usrname, CfgItermCache* cache); const void setPasswd(const char* usrname, const char* passwd); +float getCfgPipeLengthML(int chid); +void setCfgPipeLengthML(int chid, float ml); + +float getPumpAppendMl(int chid); + } // namespace iflytop diff --git a/usrc/apphardware/apphardware.cpp b/usrc/apphardware/apphardware.cpp index efdc31a..31ad22e 100644 --- a/usrc/apphardware/apphardware.cpp +++ b/usrc/apphardware/apphardware.cpp @@ -41,10 +41,10 @@ void AppHardware::initialize() { TMC51X0Cfg tmc5130cfg3 = {&MOTOR_SPI_INS, MOTO3_CSN_IO, MOTO3_DRV_ENN_IO}; TMC51X0Cfg tmc5130cfg4 = {&MOTOR_SPI_INS, MOTO4_CSN_IO, MOTO4_DRV_ENN_IO}; - MOTO1.initialize(tmc5130cfg1); - MOTO2.initialize(tmc5130cfg2); - MOTO3.initialize(tmc5130cfg3); - MOTO4.initialize(tmc5130cfg4); + MOTO1.initialize(0,tmc5130cfg1); + MOTO2.initialize(1,tmc5130cfg2); + MOTO3.initialize(2,tmc5130cfg3); + MOTO4.initialize(3,tmc5130cfg4); ZLOGI(TAG, "motor1 initialize TMC51X0:%x", MOTO1.readICVersion()); ZLOGI(TAG, "motor2 initialize TMC51X0:%x", MOTO2.readICVersion()); diff --git a/usrc/service/front_end_controler.hpp b/usrc/service/front_end_controler.hpp index c542e8f..c66372c 100644 --- a/usrc/service/front_end_controler.hpp +++ b/usrc/service/front_end_controler.hpp @@ -61,7 +61,6 @@ class FrontEndControler { bool setTxt(uint8_t pid, uint8_t bid, const char* txt, ...); bool setTxt(uint8_t bid, const char* txt) { return setTxt(m_nowPage, bid, txt); } - bool setVal(uint8_t pid, uint8_t bid, int32_t val); bool setVal(uint8_t bid, int32_t val) { return setVal(m_nowPage, bid, val); } @@ -114,4 +113,10 @@ static inline const char* zfmt(const char* fmt, ...) { return buf; } +static inline const char* refmt(const char* fmt, const char* floatval) { + static char buf[128]; + sprintf(buf, fmt, atof(floatval)); + return buf; +} + } // namespace iflytop diff --git a/usrc/service/page/Page_main.cpp b/usrc/service/page/Page_main.cpp index 8bc02b3..47d6a19 100644 --- a/usrc/service/page/Page_main.cpp +++ b/usrc/service/page/Page_main.cpp @@ -41,7 +41,7 @@ void Page_main::updateRunModeState() { bool Page_main::isBelongThisPage(int page) { return page == PAGE; } -void Page_main::OnPageLoad(OnPageLoadContext*cxt) { +void Page_main::OnPageLoad(OnPageLoadContext* cxt) { // 只有管理员能够修改,酸液通道名称 if (GSM->isAdmin()) { UIS->setTouchEnableState(ob_main_acidname0, 1); @@ -87,15 +87,65 @@ void Page_main::OnPageLoad(OnPageLoadContext*cxt) { void Page_main::OnAppEvent(AppEvent_t* event) { if (event->type == kAppEvent_RunModeChangeEvent) { updateRunModeState(); + UIS->setTxt(PAGE, ob_main_sysInfo, "切换模式"); } if (event->type == kAppEvent_RemoterConnectStateChangeEvent) { UIS->setEnumComponentState(PAGE, ob_main_RemoterS, GSM->getRemoterS()); + if (GSM->getRemoterS()) { + UIS->setTxt(PAGE, ob_main_sysInfo, "连接上手柄"); + } else { + UIS->setTxt(PAGE, ob_main_sysInfo, "断开手柄连接"); + } + } + + if (event->type == kAppEvent_StateDisplayInfo) { + UIS->setTxt(PAGE, ob_main_sysInfo, event->d.stateDisplayInfo); } + return; }; void Page_main::OnInputFieldContentChange(uint8_t bid, const char* text) { + /*********************************************************************************************************************** + * 事件过滤 * + ***********************************************************************************************************************/ + if (PumpCtrlService::ins()->isWorking()) { + UIS->alert("工作中,请稍后再操作"); + return; + } + + // 运行间隔设定值 + if (bid == ob_main_RunModeVal) { + float distrIntervalSecond = atof(text); + if (distrIntervalSecond <= 0) { + UIS->alert("酸液间隔时间不能小于0"); + return; + } + if (distrIntervalSecond > 30) { + UIS->alert("酸液间隔时间不能大于30"); + return; + } + } + + // 加酸设定值过滤 + if (bid == ob_main_acideval0 || // + bid == ob_main_acideval1 || // + bid == ob_main_acideval2 || // + bid == ob_main_acideval3) { + float add_ml = atof(text); + if (add_ml < 0.009) { + UIS->alert("设定值不能小于0"); + return; + } else if (add_ml > CS->getInt(kcfg_echDitrUpLi)) { + UIS->alert(fmt("设定值不能大于%d", CS->getInt(kcfg_echDitrUpLi))); + return; + } + } + + /*********************************************************************************************************************** + * 业务逻辑 * + ***********************************************************************************************************************/ // 更新酸液每次分配设定值 if (bid == ob_main_acideval0) { processAcidevalUpdateEvent(bid, text, 0, kcfg_acideval0); @@ -129,21 +179,31 @@ void Page_main::OnInputFieldContentChange(uint8_t bid, const char* text) { // 设置加酸间隔 if (bid == ob_main_RunModeVal) { float distrIntervalSecond = atof(text); - if (distrIntervalSecond <= 0) { - UIS->alert("酸液间隔时间不能小于0"); - return; - } - - if (distrIntervalSecond > 30) { - UIS->alert("酸液间隔时间不能大于30"); - return; - } UIS->setTxt(PAGE, bid, zfmt("%.1f", distrIntervalSecond)); CS->setcfgAndFlush(kcfg_distrInterval, zfmt("%.1f", distrIntervalSecond)); } } void Page_main::OnButton(uint8_t bid, uint8_t val) { + /*********************************************************************************************************************** + * 事件过滤 * + ***********************************************************************************************************************/ + if (bid == ob_main_RunMode || // + bid == ob_main_acidch0 || // + bid == ob_main_acidch1 || // + bid == ob_main_acidch2 || // + bid == ob_main_acidch3 || // + bid == ob_main_MenuButton // + ) { + if (PumpCtrlService::ins()->isWorking()) { + UIS->alert("工作中,请稍后再操作"); + return; + } + } + + /*********************************************************************************************************************** + * 业务逻辑 * + ***********************************************************************************************************************/ if (bid == ob_main_RunMode) { // 切换模式 GSM->changeToNextRunMode(); @@ -169,17 +229,7 @@ void Page_main::OnButton(uint8_t bid, uint8_t val) { } void Page_main::processAcidevalUpdateEvent(uint8_t bid, const char* text, int ch, config_index_t cfgid) { - float add_ml = atof(text); - if (add_ml < 0) { - UIS->alert("设定值不能小于0"); - return; - } else if (add_ml > CS->getInt(kcfg_echDitrUpLi)) { - UIS->alert(fmt("设定值不能大于%d", CS->getInt(kcfg_echDitrUpLi))); - return; - } - char reformattext[20]; - sprintf(reformattext, "%.1f", add_ml); - ZLOGI(TAG, "set acid ch%d:%s", ch, reformattext); - UIS->setTxt(PAGE, bid, reformattext); - CS->setcfgAndFlush(cfgid, reformattext); // + ZLOGI(TAG, "set acid ch%d:%s", ch, text); + UIS->setTxt(PAGE, bid, refmt("%.1f", text)); + CS->setcfgAndFlush(cfgid, refmt("%.1f", text)); } diff --git a/usrc/service/page/submenu/Page_muSettings.cpp b/usrc/service/page/submenu/Page_muSettings.cpp index 969590f..69a0670 100644 --- a/usrc/service/page/submenu/Page_muSettings.cpp +++ b/usrc/service/page/submenu/Page_muSettings.cpp @@ -69,7 +69,10 @@ void Page_muSettings::updatePage() { UIS->setTxt(PAGE, ob_muSettings_pumpCoef1, zfmt("%.4f", getMotorMLPR(1))); UIS->setTxt(PAGE, ob_muSettings_pumpCoef2, zfmt("%.4f", getMotorMLPR(2))); UIS->setTxt(PAGE, ob_muSettings_pumpCoef3, zfmt("%.4f", getMotorMLPR(3))); - UIS->setTxt(PAGE, ob_muSettings_pipeLen0, getCfgStr(kcfg_pipeLengthML)); + UIS->setTxt(PAGE, ob_muSettings_pipeLen0, zfmt("%.2f", getCfgPipeLengthML(0))); + UIS->setTxt(PAGE, ob_muSettings_pipeLen1, zfmt("%.2f", getCfgPipeLengthML(1))); + UIS->setTxt(PAGE, ob_muSettings_pipeLen2, zfmt("%.2f", getCfgPipeLengthML(2))); + UIS->setTxt(PAGE, ob_muSettings_pipeLen3, zfmt("%.2f", getCfgPipeLengthML(3))); // TODO:改成4个输入框 UIS->setTxt(PAGE, ob_muSettings_addAcidVel0, zitoa(getMxRunRPM(0))); UIS->setTxt(PAGE, ob_muSettings_addAcidVel1, zitoa(getMxRunRPM(1))); @@ -138,9 +141,32 @@ void Page_muSettings::OnInputFieldContentChange(uint8_t bid, const char* text) { * pipeLen * ***********************************************************************************************************************/ + if (bid == ob_muSettings_pipeLen0 || bid == ob_muSettings_pipeLen1 || bid == ob_muSettings_pipeLen2 || bid == ob_muSettings_pipeLen3) { + float len = atof(text); + if (len < 0.1) { + UIS->alert("管道长度不能小于0.1"); + return; + } + } + if (bid == ob_muSettings_pipeLen0) { - CS->setcfg(kcfg_pipeLengthML, text); - UIS->setTxt(bid, getCfgStr(kcfg_pipeLengthML)); + setCfgPipeLengthML(0, atof(text)); + UIS->setTxt(bid, zfmt("%.2f", getCfgPipeLengthML(0))); + } + + if (bid == ob_muSettings_pipeLen1) { + setCfgPipeLengthML(1, atof(text)); + UIS->setTxt(bid, zfmt("%.2f", getCfgPipeLengthML(1))); + } + + if (bid == ob_muSettings_pipeLen2) { + setCfgPipeLengthML(2, atof(text)); + UIS->setTxt(bid, zfmt("%.2f", getCfgPipeLengthML(2))); + } + + if (bid == ob_muSettings_pipeLen3) { + setCfgPipeLengthML(3, atof(text)); + UIS->setTxt(bid, zfmt("%.2f", getCfgPipeLengthML(3))); } /*********************************************************************************************************************** diff --git a/usrc/service/pump_ctrl_service.cpp b/usrc/service/pump_ctrl_service.cpp index 990d948..6185628 100644 --- a/usrc/service/pump_ctrl_service.cpp +++ b/usrc/service/pump_ctrl_service.cpp @@ -10,9 +10,9 @@ static TMC51X0* m_motors[4]; #define PUMP_NUM 4 static CfgItermCache cfgcache; -#define APPEND_ML 10 - +// #define APPEND_ML 2 +#define PUSH_DIS_INFO(info) AppEventBus::ins()->pushEvent(createStateDisplayInfoEvent(info)) void PumpCtrlService::initialize() { m_motors[0] = AppHardware::ins()->getPump(0); @@ -35,6 +35,16 @@ void PumpCtrlService::initialize() { }); } +#define WAIT_FOR_MOTOR_STOP() \ + waitForMotorStop(); \ + if (m_thread.getExitFlag()) { \ + break; \ + } + +void PumpCtrlService::tryUpdateMotorSetting() { + if (m_pumpCfgUpdateFlag) updateMotorSetting(); +} + void PumpCtrlService::updateMotorSetting() { for (size_t i = 0; i < PUMP_NUM; i++) { m_motors[i]->enable(false); @@ -70,8 +80,10 @@ void PumpCtrlService::updateMotorSetting() { void PumpCtrlService::stop() { ZLOGI(TAG, "stop"); + stopAll(); m_thread.stop(); stopAll(); + ZLOGI(TAG, "stop finish"); } @@ -80,102 +92,81 @@ void PumpCtrlService::stop() { ***********************************************************************************************************************/ void PumpCtrlService::reflux() { ZLOGI(TAG, "reflux"); - if (m_pumpCfgUpdateFlag) updateMotorSetting(); + tryUpdateMotorSetting(); - m_thread.start( - [this]() { - ValveStateSyncService::ins()->setValveState(1); - int32_t pipeLenML = getCfgInt(kcfg_pipeLengthML); - - for (size_t i = 0; i < PUMP_NUM; i++) { - TMC51X0* cur_motor = m_motors[i]; - cur_motor->stop(); - cur_motor->setXACTUAL(0); - ZLOGI(TAG, "pump %d move %f ml", i, -pipeLenML); - cur_motor->moveBy((int32_t)-pipeLenML * 1000, getMxRunRPM(i)); - } - - while (!m_thread.getExitFlag()) { - if (isAllReachTarget()) { - break; - } - osDelay(10); - } - - stopAll(); - ZLOGI(TAG, "reflux end"); - }, - []() { ValveStateSyncService::ins()->setValveState(0); }); + PUSH_DIS_INFO("开始回流"); + + m_thread.start([this]() { + unlockAll(); + do { + doMotorsRefluxAllOnce(); + WAIT_FOR_MOTOR_STOP(); + } while (false); + stopAll(); + lock(); + ZLOGI(TAG, "reflux end"); + PUSH_DIS_INFO("回流结束"); + }); } void PumpCtrlService::acidPrefilling() { ZLOGI(TAG, "acidPrefilling"); - if (m_pumpCfgUpdateFlag) updateMotorSetting(); - - m_thread.start( - [this]() { - ValveStateSyncService::ins()->setValveState(1); - - int32_t pipeLenML = getCfgInt(kcfg_pipeLengthML); - - for (size_t i = 0; i < PUMP_NUM; i++) { - TMC51X0* cur_motor = m_motors[i]; - cur_motor->stop(); - cur_motor->setXACTUAL(0); - ZLOGI(TAG, "pump %d move %f ml", i, pipeLenML); - cur_motor->moveBy((int32_t)pipeLenML * 1000, getMxRunRPM(i)); - } - - while (!m_thread.getExitFlag()) { - if (isAllReachTarget()) { - break; - } - osDelay(10); - } - - // 短回流 - for (size_t i = 0; i < PUMP_NUM; i++) { - TMC51X0* cur_motor = m_motors[i]; - cur_motor->moveBy(-(int32_t)(APPEND_ML) * 1000, getMxRunRPM(i)); - } - - while (!isAllReachTarget()) { - osDelay(10); - } - - stopAll(); - ZLOGI(TAG, "acidPrefilling end"); - }, - []() { ValveStateSyncService::ins()->setValveState(0); }); + tryUpdateMotorSetting(); + PUSH_DIS_INFO("开始预充管路"); + m_thread.start([this]() { + unlockAll(); + do { + doMotorsRefluxAllOnce(); // 回流 + WAIT_FOR_MOTOR_STOP(); + doMotorsAcidPrefillingOnce(); // 预填充 + WAIT_FOR_MOTOR_STOP(); + doMotorsLittleRefluxOnce(); // 小回流 + WAIT_FOR_MOTOR_STOP(); + } while (false); + stopAll(); + lock(); + ZLOGI(TAG, "reflux end"); + PUSH_DIS_INFO("结束预充管路"); + }); } void PumpCtrlService::autoMoveMutiTimes() { // doMoveOnce(); ZLOGI(TAG, "autoMoveMutiTimes"); - if (m_pumpCfgUpdateFlag) updateMotorSetting(); - + tryUpdateMotorSetting(); + PUSH_DIS_INFO("开始自动加液"); m_thread.start([this]() { - float delayTime = getCfgFloat(kcfg_distrInterval); - ZLOGI(TAG, "delayTime %d", delayTime); - while (!m_thread.getExitFlag()) { - doMoveOnce(); - for (size_t i = 0; i < delayTime * 1000; i++) { - osDelay(1); - if (m_thread.getExitFlag()) { - break; - } - delayTime = getCfgFloat(kcfg_distrInterval); - } + unlock(); + doMotorsMoveByOnce(); + WAIT_FOR_MOTOR_STOP(); + doMotorsLittleRefluxOnce(); + WAIT_FOR_MOTOR_STOP(); + lock(); + sleep(getCfgFloat(kcfg_distrInterval) * 1000); } - stopAll(); + lock(); + PUSH_DIS_INFO("停止加液"); }); } void PumpCtrlService::moveOnce() { + // doMoveOnce(); ZLOGI(TAG, "moveOnce"); - if (m_pumpCfgUpdateFlag) updateMotorSetting(); + tryUpdateMotorSetting(); + PUSH_DIS_INFO("加一次液"); + m_thread.start([this]() { + unlock(); + do { + doMotorsMoveByOnce(); + WAIT_FOR_MOTOR_STOP(); + doMotorsLittleRefluxOnce(); + WAIT_FOR_MOTOR_STOP(); + } while (false); - m_thread.start([this]() { doMoveOnce(); }); + stopAll(); + lock(); + PUSH_DIS_INFO("停止加液"); + }); } bool PumpCtrlService::isWorking() { return m_thread.isworking(); } @@ -183,52 +174,6 @@ bool PumpCtrlService::isWorking() { return m_thread.isworking(); } /*********************************************************************************************************************** * BASIC * ***********************************************************************************************************************/ - -void PumpCtrlService::doMoveOnce() { - // - ZLOGI(TAG, "do moveOnce ..."); - ValveStateSyncService::ins()->setValveState(1); - - for (size_t i = 0; i < PUMP_NUM; i++) { - bool pumpselect = GSM->getPumpSelectState(i); - float distribut_ml = getCfgFloat(config_index_t(kcfg_acideval0 + i)); - - TMC51X0* cur_motor = m_motors[i]; - cur_motor->stop(); - cur_motor->setXACTUAL(0); - if (pumpselect) { - ZLOGI(TAG, "pump %d move %f ml", i, distribut_ml); - cur_motor->moveBy((int32_t)(distribut_ml + APPEND_ML) * 1000, getMxRunRPM(i)); - } - } - - while (!isAllReachTarget() && !m_thread.getExitFlag()) { - // ZLOGI(TAG, "wait for motor move to target"); - osDelay(10); - } - ZLOGI(TAG, "do moveOnce finish"); - - // 回流 - for (size_t i = 0; i < PUMP_NUM; i++) { - bool pumpselect = GSM->getPumpSelectState(i); - - TMC51X0* cur_motor = m_motors[i]; - cur_motor->stop(); - cur_motor->setXACTUAL(0); - if (pumpselect) { - cur_motor->moveBy(-(int32_t)(APPEND_ML) * 1000, getMxRunRPM(i)); - } - } - - while (!isAllReachTarget() && !m_thread.getExitFlag()) { - osDelay(10); - } - - ZLOGI(TAG, "do moveOnce finish"); - stopAll(); - ValveStateSyncService::ins()->setValveState(0); -} - bool PumpCtrlService::isAllReachTarget() { for (size_t i = 0; i < PUMP_NUM; i++) { TMC5130RampStat state = m_motors[i]->getRampStat(); @@ -284,3 +229,106 @@ double PumpCtrlService::getMotorNowPosR(int32_t mid) { } return m_motors[mid]->getXactualRAW() / 51200.0; } + +void PumpCtrlService::doMotorsMoveByOnce() { + int32_t step0 = int32_t((getCfgFloat(kcfg_acideval0) + getPumpAppendMl(0)) * 1000); + int32_t step1 = int32_t((getCfgFloat(kcfg_acideval1) + getPumpAppendMl(1)) * 1000); + int32_t step2 = int32_t((getCfgFloat(kcfg_acideval2) + getPumpAppendMl(2)) * 1000); + int32_t step3 = int32_t((getCfgFloat(kcfg_acideval3) + getPumpAppendMl(3)) * 1000); + + step0 = GSM->getPumpSelectState(0) ? step0 : 0; + step1 = GSM->getPumpSelectState(1) ? step1 : 0; + step2 = GSM->getPumpSelectState(2) ? step2 : 0; + step3 = GSM->getPumpSelectState(3) ? step3 : 0; + + ZLOGI(TAG, "doMotorsMoveByOnce, moveBy %d %d %d %d", step0, step1, step2, step3); + moveBy(step0, step1, step2, step3); +} +void PumpCtrlService::doMotorsRefluxAllOnce() { + int32_t step0 = int32_t(-(getCfgPipeLengthML(0) * 1.2) * 1000); // *1.2是为了保证液体完全回流 + int32_t step1 = int32_t(-(getCfgPipeLengthML(1) * 1.2) * 1000); // *1.2是为了保证液体完全回流 + int32_t step2 = int32_t(-(getCfgPipeLengthML(2) * 1.2) * 1000); // *1.2是为了保证液体完全回流 + int32_t step3 = int32_t(-(getCfgPipeLengthML(3) * 1.2) * 1000); // *1.2是为了保证液体完全回流 + + // step0 = GSM->getPumpSelectState(0) ? step0 : 0; + // step1 = GSM->getPumpSelectState(1) ? step1 : 0; + // step2 = GSM->getPumpSelectState(2) ? step2 : 0; + // step3 = GSM->getPumpSelectState(3) ? step3 : 0; + + ZLOGI(TAG, "doMotorsRefluxOnce, moveBy %d %d %d %d", step0, step1, step2, step3); + moveBy(step0, step1, step2, step3); +} + +void PumpCtrlService::doMotorsAcidPrefillingOnce() { + int32_t step0 = int32_t((getCfgPipeLengthML(0)) * 1000); + int32_t step1 = int32_t((getCfgPipeLengthML(1)) * 1000); + int32_t step2 = int32_t((getCfgPipeLengthML(2)) * 1000); + int32_t step3 = int32_t((getCfgPipeLengthML(3)) * 1000); + + step0 = GSM->getPumpSelectState(0) ? step0 : 0; + step1 = GSM->getPumpSelectState(1) ? step1 : 0; + step2 = GSM->getPumpSelectState(2) ? step2 : 0; + step3 = GSM->getPumpSelectState(3) ? step3 : 0; + + ZLOGI(TAG, "doMotorsAcidPrefillingOnce, moveBy %d %d %d %d", step0, step1, step2, step3); + moveBy(step0, step1, step2, step3); +} + +void PumpCtrlService::doMotorsLittleRefluxOnce() { + int32_t step0 = int32_t(-(getPumpAppendMl(0)) * 1000); // + int32_t step1 = int32_t(-(getPumpAppendMl(1)) * 1000); // + int32_t step2 = int32_t(-(getPumpAppendMl(2)) * 1000); // + int32_t step3 = int32_t(-(getPumpAppendMl(3)) * 1000); // + + step0 = GSM->getPumpSelectState(0) ? step0 : 0; + step1 = GSM->getPumpSelectState(1) ? step1 : 0; + step2 = GSM->getPumpSelectState(2) ? step2 : 0; + step3 = GSM->getPumpSelectState(3) ? step3 : 0; + + ZLOGI(TAG, "doMotorsLittleRefluxOnce, moveBy %d %d %d %d", step0, step1, step2, step3); + moveBy(step0, step1, step2, step3); +} + +void PumpCtrlService::lock() { + ZLOGI(TAG, "lockAll"); + ValveStateSyncService::ins()->setValveState(0); +} +void PumpCtrlService::unlock() { + bool select0 = GSM->getPumpSelectState(0); + bool select1 = GSM->getPumpSelectState(1); + bool select2 = GSM->getPumpSelectState(2); + bool select3 = GSM->getPumpSelectState(3); + ZLOGI(TAG, "unlock %d %d %d %d", select0, select1, select2, select3); + ValveStateSyncService::ins()->setValveState(select0, select1, select2, select3); + return; +} + +void PumpCtrlService::unlockAll() { + ZLOGI(TAG, "unlockAll"); + ValveStateSyncService::ins()->setValveState(1); +} + +void PumpCtrlService::moveBy(int32_t steps0, int32_t steps1, int32_t steps2, int32_t steps3) { + m_motors[0]->moveBy(steps0, getMxRunRPM(0)); + m_motors[1]->moveBy(steps1, getMxRunRPM(1)); + m_motors[2]->moveBy(steps2, getMxRunRPM(2)); + m_motors[3]->moveBy(steps3, getMxRunRPM(3)); +} + +void PumpCtrlService::waitForMotorStop() { + while (!m_thread.getExitFlag()) { + if (isAllReachTarget()) break; + osDelay(5); + } + return; +} + +void PumpCtrlService::sleep(int32_t ms) { + for (size_t i = 0; i < ms;) { + if (m_thread.getExitFlag()) { + break; + } + osDelay(10); + i += 10; + } +} diff --git a/usrc/service/pump_ctrl_service.hpp b/usrc/service/pump_ctrl_service.hpp index b233141..d857903 100644 --- a/usrc/service/pump_ctrl_service.hpp +++ b/usrc/service/pump_ctrl_service.hpp @@ -23,6 +23,7 @@ class PumpCtrlService { void initialize(); void updateMotorSetting(); + void tryUpdateMotorSetting(); public: bool isWorking(); @@ -35,14 +36,24 @@ class PumpCtrlService { void stop(); public: - void rotate(int32_t mid, int32_t direction); - void stopRotate(); + void rotate(int32_t mid, int32_t direction); + void stopRotate(); double getMotorNowPosR(int32_t mid); private: - bool isAllReachTarget(); + void doMotorsMoveByOnce(); + void doMotorsRefluxAllOnce(); + void doMotorsLittleRefluxOnce(); + void doMotorsAcidPrefillingOnce(); + + void lock(); + void unlock(); + void unlockAll(); + void moveBy(int32_t steps0, int32_t steps1, int32_t steps2, int32_t steps3); void stopAll(); - void doMoveOnce(); + bool isAllReachTarget(); + void waitForMotorStop(); + void sleep(int32_t ms); }; } // namespace iflytop diff --git a/usrc/service/remote_controler_event_processer.cpp b/usrc/service/remote_controler_event_processer.cpp index 405ba83..ff6ff34 100644 --- a/usrc/service/remote_controler_event_processer.cpp +++ b/usrc/service/remote_controler_event_processer.cpp @@ -41,6 +41,7 @@ void RemoteControlerEventProcesser::initialize() { AppEventBus::ins()->pushEvent(appevent); } else if (packet->cmd == kzble_report_disconnect_event) { GSM->setRemoterS(false); + PUMPCS->stop(); } // ZLOGI(TAG, "TRACE process ble report end"); }); @@ -92,6 +93,12 @@ void RemoteControlerEventProcesser::processKeyEventFromRemoter(hand_acid_remoter * @brief 如果当前设备处于工作中,则无论什么按键都是停止工作 */ + if (PUMPCS->isWorking()) { + PUMPCS->stop(); + RCTRL->setRemoterState(GSM->getRunMode(), PUMPCS->isWorking()); + return; + } + if (UIS->getNowPage() == pg_muPumpTest) { ZLOGW(TAG, "now page is in pump test, remote key event process by pumpTestPage"); return; @@ -102,39 +109,34 @@ void RemoteControlerEventProcesser::processKeyEventFromRemoter(hand_acid_remoter } if (UIS->getNowPage() != pg_main) { - UIS->alert("请先切换到首页,在控制泵机"); + UIS->alert("请先切换到首页,在控制设备"); return; } - if (PUMPCS->isWorking()) { - PUMPCS->stop(); - RCTRL->setRemoterState(GSM->getRunMode(), PUMPCS->isWorking()); - } else { - if (keyEvent == hand_acid_remoter_kevent_add_liquid) { - // - if (!GSM->isHasPumpSelect()) { - UIS->alert("请至少选中一个泵机"); - return; - } - - if (GSM->getRunMode() == khand_acid_m_jog_mode) { - PUMPCS->moveOnce(); - } else if (GSM->getRunMode() == khand_acid_m_continuous_mode) { - PUMPCS->autoMoveMutiTimes(); - } - } else if (keyEvent == hand_acid_remoter_kevent_change_next_mode) { - // 修改工作模式 - if (GSM->getRunMode() == khand_acid_m_jog_mode) { - GSM->setRunMode(khand_acid_m_continuous_mode); - } else if (GSM->getRunMode() == khand_acid_m_continuous_mode) { - GSM->setRunMode(khand_acid_m_jog_mode); - } - } else if (keyEvent == hand_acid_remoter_kevent_reflux) { - // 回流 - PUMPCS->reflux(); - } else if (keyEvent == hand_acid_remoter_kevent_preFilling) { - // 管路填充 - PUMPCS->acidPrefilling(); + if (keyEvent == hand_acid_remoter_kevent_add_liquid) { + // + if (!GSM->isHasPumpSelect()) { + UIS->alert("请至少选中一个通道"); + return; + } + + if (GSM->getRunMode() == khand_acid_m_jog_mode) { + PUMPCS->moveOnce(); + } else if (GSM->getRunMode() == khand_acid_m_continuous_mode) { + PUMPCS->autoMoveMutiTimes(); + } + } else if (keyEvent == hand_acid_remoter_kevent_change_next_mode) { + // 修改工作模式 + if (GSM->getRunMode() == khand_acid_m_jog_mode) { + GSM->setRunMode(khand_acid_m_continuous_mode); + } else if (GSM->getRunMode() == khand_acid_m_continuous_mode) { + GSM->setRunMode(khand_acid_m_jog_mode); } + } else if (keyEvent == hand_acid_remoter_kevent_reflux) { + // 回流 + PUMPCS->reflux(); + } else if (keyEvent == hand_acid_remoter_kevent_preFilling) { + // 管路填充 + PUMPCS->acidPrefilling(); } } diff --git a/usrc/service/valve_state_ctrl_service.cpp b/usrc/service/valve_state_ctrl_service.cpp index 3503b54..efcbbde 100644 --- a/usrc/service/valve_state_ctrl_service.cpp +++ b/usrc/service/valve_state_ctrl_service.cpp @@ -63,6 +63,22 @@ void ValveStateSyncService::setValveState(int valveIndex, bool state) { } } +void ValveStateSyncService::setValveState(bool state0, bool state1, bool state2, bool state3) { + { + zlock_guard l(lock); + output0state = (output0state & ~(1 << 0)) | (state0 << 0); + output0state = (output0state & ~(1 << 1)) | (state1 << 1); + output0state = (output0state & ~(1 << 2)) | (state2 << 2); + output0state = (output0state & ~(1 << 3)) | (state3 << 3); + forceupdate = true; + } + + m_thread.wake(); + while (!forceupdate) { + osDelay(2); + } +} + #define SETBIT(byte, off, valve) (byte = (byte & ~(1 << off)) | (valve << off)) void ValveStateSyncService::setRGBState(bool r, bool g, bool b) { diff --git a/usrc/service/valve_state_ctrl_service.hpp b/usrc/service/valve_state_ctrl_service.hpp index d8206e2..0e38878 100644 --- a/usrc/service/valve_state_ctrl_service.hpp +++ b/usrc/service/valve_state_ctrl_service.hpp @@ -30,6 +30,7 @@ class ValveStateSyncService { void setValveState(int valveIndex, bool state); void setValveState(bool state); + void setValveState(bool state0, bool state1, bool state2, bool state3); void setRGBState(bool r, bool g, bool b); void setWarningState(bool warning);