diff --git a/stm32components b/stm32components index 3c9d276..f45df89 160000 --- a/stm32components +++ b/stm32components @@ -1 +1 @@ -Subproject commit 3c9d276aab2de07bf1dfdcf5bd31c531efa311d9 +Subproject commit f45df89965564db5c5ad518c7a704571726b8a6e diff --git a/usrc/project_configs.h b/usrc/project_configs.h index 2b064b1..03fb47e 100644 --- a/usrc/project_configs.h +++ b/usrc/project_configs.h @@ -20,4 +20,7 @@ #define HARDWARE_VERSION 1 // 硬件版本 #define PROJECT "hand_acid_main_board" // 工程名称 #define APP_VERSION "101" -#define BLENAME "AciDisp" \ No newline at end of file +#define BLENAME "AciDisp" + +#define MAX_RPM 800 +#define PUMP_TEST_RPM 500 \ No newline at end of file diff --git a/usrc/service/page/submenu/Page_muPumpTest.cpp b/usrc/service/page/submenu/Page_muPumpTest.cpp index c11f2b6..68a6a35 100644 --- a/usrc/service/page/submenu/Page_muPumpTest.cpp +++ b/usrc/service/page/submenu/Page_muPumpTest.cpp @@ -1,18 +1,101 @@ #include "Page_muPumpTest.hpp" +#include "service/pump_ctrl_service.hpp" using namespace iflytop; #define PAGE pg_muPumpTest #define TAG "Page_muPumpTest" + +static void Page_muPumpTest_onTimer(const void* tid) { + Page_muPumpTest* thisClass = (Page_muPumpTest*)pvTimerGetTimerID((TimerHandle_t)tid); + thisClass->onTimer(); +} + +void Page_muPumpTest::initialize() { // + IPageProcesser::initialize(); + + osTimerDef(statiUpdateTimer, Page_muPumpTest_onTimer); + statiUpdateTimerId = osTimerCreate(osTimer(statiUpdateTimer), osTimerPeriodic, this); +} + bool Page_muPumpTest::isBelongThisPage(int page) { return page == PAGE; } -void Page_muPumpTest::OnPageLoad(OnPageLoadContext*cxt) {} +void Page_muPumpTest::OnPageLoad(OnPageLoadContext* cxt) { + // motorTrunsBegin + if (!cxt->isFromPopWin) { + updateStatiInfo(0, 0); + m_pumpId = 1; + } + UIS->setVal(ob_muPumpTest_pumpId, m_pumpId + 1); +} + void Page_muPumpTest::OnInputFieldContentChange(uint8_t bid, const char* text) { // ZLOGI(TAG, "bid:%d %s", bid, text); + // ob_muPumpTest_frompage + if (bid == ob_muPumpTest_pumpId) { + pumpChangeSelectId(atoi(text)); + } } void Page_muPumpTest::OnButton(uint8_t bid, uint8_t val) { ZLOGI(TAG, "bid:%d", bid); if (bid == ob_muPumpTest_bak) { + pumpStop(); UIS->chpage(pg_muSettings); + } else if (bid == ob_muPumpTest_clearStati) { + ZLOGI(TAG, "clearStati"); + clearStatisInfo(); + } else if (bid == ob_muPumpTest_forward) { + ZLOGI(TAG, "forward"); + pumpStart(1); + } else if (bid == ob_muPumpTest_bakward) { + ZLOGI(TAG, "bakward"); + pumpStart(-1); + } else if (bid == ob_muPumpTest_stop) { + ZLOGI(TAG, "stop"); + pumpStop(); } -} \ No newline at end of file +} +/*********************************************************************************************************************** + * LOGIC * + ***********************************************************************************************************************/ +void Page_muPumpTest::pumpStop() { + PUMPCS->stopRotate(); + osTimerStop(statiUpdateTimerId); + updateStatiInfo(); +} +void Page_muPumpTest::pumpStart(int32_t direction) { + PUMPCS->rotate(m_pumpId, direction); + osTimerStop(statiUpdateTimerId); + osTimerStart(statiUpdateTimerId, 300); +} +void Page_muPumpTest::pumpChangeSelectId(int id) { + if (id < 0 || id > 3) { + ZLOGW(TAG, "pumpId out of range"); + return; + } + if ((id) != m_pumpId) { + ZLOGI(TAG, "pumpId change to %d", id); + m_pumpId = id; + PUMPCS->stopRotate(); + clearStatisInfo(); + } +} +void Page_muPumpTest::updateStatiInfo(float statiTruns, float statiVolum) { + m_statiTruns = statiTruns; + m_statiVolum = statiVolum; + UIS->setVal(ob_muPumpTest_statiTrun, zfmt("%.2f", m_statiTruns)); + UIS->setVal(ob_muPumpTest_statiVolum, zfmt("%.2f", m_statiVolum)); +} +void Page_muPumpTest::clearStatisInfo() { + updateStatiInfo(0, 0); + m_motorTrunsBegin = PUMPCS->getMotorNowPosR(m_pumpId); +} + +void Page_muPumpTest::updateStatiInfo() { + double nowPos = PUMPCS->getMotorNowPosR(m_pumpId); + double truns = (nowPos - m_motorTrunsBegin); + float motorX_mLPR = getMotorMLPR(m_pumpId); + double volum = truns * motorX_mLPR; + updateStatiInfo(truns, volum); +} +void Page_muPumpTest::onTimer() { updateStatiInfo(); } diff --git a/usrc/service/page/submenu/Page_muPumpTest.hpp b/usrc/service/page/submenu/Page_muPumpTest.hpp index 27a7ae2..654a500 100644 --- a/usrc/service/page/submenu/Page_muPumpTest.hpp +++ b/usrc/service/page/submenu/Page_muPumpTest.hpp @@ -8,19 +8,39 @@ class Page_muPumpTest : public IPageProcesser { private: /* data */ + double m_motorTrunsBegin = 0; + int m_pumpId = 1; + float m_statiTruns = 0; + float m_statiVolum = 0; + + osTimerId statiUpdateTimerId; // + public: static Page_muPumpTest* ins() { static Page_muPumpTest instance; return &instance; } + virtual void initialize(); + private: virtual bool isBelongThisPage(int page) override; - virtual void OnPageLoad(OnPageLoadContext*cxt) override; + virtual void OnPageLoad(OnPageLoadContext* cxt) override; virtual void OnInputFieldContentChange(uint8_t bid, const char* text) override; virtual void OnButton(uint8_t bid, uint8_t val) override; + private: + void updateStatiInfo(float statiTruns, float statiVolum); + void clearStatisInfo(); + void updateStatiInfo(); + + void pumpStop(); + void pumpStart(int32_t direction); + void pumpChangeSelectId(int id); + + public: + void onTimer(); }; } // namespace iflytop diff --git a/usrc/service/page/submenu/Page_muSettings.cpp b/usrc/service/page/submenu/Page_muSettings.cpp index a04735d..8efed49 100644 --- a/usrc/service/page/submenu/Page_muSettings.cpp +++ b/usrc/service/page/submenu/Page_muSettings.cpp @@ -56,7 +56,7 @@ void Page_muSettings::OnAppEvent(AppEvent_t* event) { if (event->type == kAppEvent_BleConnectEvent) { ZLOGI(TAG, "ble connect success"); UIS->setVal(PAGE, ob_muSettings_bleCliName, "绑定成功"); - CS->setcfg(kcfg_bleClientName, event->d.bleName); + CS->setcfgAndFlush(kcfg_bleClientName, event->d.bleName); m_scaning = false; } } diff --git a/usrc/service/pump_ctrl_service.cpp b/usrc/service/pump_ctrl_service.cpp index 26c0134..7c9d9cf 100644 --- a/usrc/service/pump_ctrl_service.cpp +++ b/usrc/service/pump_ctrl_service.cpp @@ -81,8 +81,6 @@ void PumpCtrlService::stop() { ZLOGI(TAG, "stop finish"); } - - /*********************************************************************************************************************** * EXT * ***********************************************************************************************************************/ @@ -92,22 +90,22 @@ void PumpCtrlService::reflux() { 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); + 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(); @@ -130,7 +128,7 @@ void PumpCtrlService::acidPrefilling() { 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)); + cur_motor->moveBy((int32_t)pipeLenML * 1000, getMxRunRPM(i)); } while (!m_thread.getExitFlag()) { @@ -143,7 +141,7 @@ void PumpCtrlService::acidPrefilling() { // 短回流 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)); + cur_motor->moveBy(-(int32_t)(APPEND_ML) * 1000, getMxRunRPM(i)); } while (!isAllReachTarget()) { @@ -198,15 +196,15 @@ void PumpCtrlService::doMoveOnce() { 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)); + 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)); + cur_motor->moveBy((int32_t)(distribut_ml + APPEND_ML) * 1000, getMxRunRPM(i)); } } @@ -216,13 +214,13 @@ void PumpCtrlService::doMoveOnce() { // 回流 for (size_t i = 0; i < PUMP_NUM; i++) { - bool pumpselect = GSM->getPumpSelectState(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)); + cur_motor->moveBy(-(int32_t)(APPEND_ML) * 1000, getMxRunRPM(i)); } } @@ -251,3 +249,36 @@ void PumpCtrlService::stopAll() { } return; } + +void PumpCtrlService::rotate(int32_t mid, int32_t direction) { + if (mid > 3) { + ZLOGE(TAG, "mid:%d is invalid", mid); + return; + } + + if (isWorking()) { + ZLOGE(TAG, "rotate fail, PumpCtrlService isWorking"); + return; + } + + ValveStateSyncService::ins()->setValveState(1); + TMC51X0* cur_motor = m_motors[mid]; + cur_motor->rotate(PUMP_TEST_RPM); +} +void PumpCtrlService::stopRotate() { + if (isWorking()) { + ZLOGE(TAG, "rotate fail, PumpCtrlService isWorking"); + return; + } + while (!isAllReachTarget()) { + osDelay(10); + } + ValveStateSyncService::ins()->setValveState(0); +} +double PumpCtrlService::getMotorNowPosR(int32_t mid) { + if (mid > 3) { + ZLOGE(TAG, "mid:%d is invalid", mid); + return 0; + } + return m_motors[mid]->getXactualRAW() / 51200.0; +} diff --git a/usrc/service/pump_ctrl_service.hpp b/usrc/service/pump_ctrl_service.hpp index c0781f4..b233141 100644 --- a/usrc/service/pump_ctrl_service.hpp +++ b/usrc/service/pump_ctrl_service.hpp @@ -34,6 +34,11 @@ class PumpCtrlService { void acidPrefilling(); void stop(); + public: + void rotate(int32_t mid, int32_t direction); + void stopRotate(); + double getMotorNowPosR(int32_t mid); + private: bool isAllReachTarget(); void stopAll();