From ff6c5563c1b9e2b9317ae993ad13a0b87a51ab39 Mon Sep 17 00:00:00 2001 From: zhaohe Date: Fri, 30 Aug 2024 14:59:39 +0800 Subject: [PATCH] update --- README.md | 50 ++++------ uappbase/bean/event.hpp | 1 + uappbase/service/gstate_mgr.cpp | 67 +++++++++++-- uappbase/service/gstate_mgr.hpp | 5 + ui/hand_acid_mainboard_ui.HMI | Bin 15800145 -> 15800145 bytes usrc/service/app_core.cpp | 90 ++--------------- usrc/service/app_core.hpp | 1 - usrc/service/front_end_controler.cpp | 11 +- usrc/service/front_end_controler.hpp | 4 + usrc/service/page/Page_main.cpp | 116 ++++++++++++++-------- usrc/service/page/Page_main.hpp | 4 +- usrc/service/page/page_processer.hpp | 11 +- usrc/service/remote_controler.cpp | 16 +-- usrc/service/remote_controler_event_processer.cpp | 110 ++++++++++++++++++++ usrc/service/remote_controler_event_processer.hpp | 30 ++++++ 15 files changed, 329 insertions(+), 187 deletions(-) create mode 100644 usrc/service/remote_controler_event_processer.cpp create mode 100644 usrc/service/remote_controler_event_processer.hpp diff --git a/README.md b/README.md index ffaf707..6e245f8 100644 --- a/README.md +++ b/README.md @@ -5,40 +5,24 @@ ``` ``` -/** - * @brief - * - * - * 回流按键:短按一下, 回流 - * 快按两下, 填充管路 - * - * - * 加液按键短按,加液体 - * 加液按键长按,切换模式,点动模式,连续自动模式 - * - * 模式1 点动 - * 模式2 连续自动 - * - * - * 灯: - * 颜色,区分不同模式。 - * 闪烁,状态。 - * - * 连接,无连接 - * 唤醒,非唤醒 - * 模式, - * 状态, - * - * - */ - - - /****************************************************************************/ - 1. 按下按键,触发泵机动作 - 2. 蓝牙配对功能 - - +任务: + 1. 完成主页 + 支持触摸按键修改模式 + 对接gstate + 2. 完成unlogin + 3. 完成加酸间隔设置 + 4. 完成高级配置页面,支持泵机转速和ml的转换关系配置,蓝牙扫描并绑定 + 5. 完成用户信息页面 + 6. 完成用户管理页面 ``` +``` +UI修改项: + 1. 登录页面去掉 login按键的自动切换页面指令 + 2. 主页,调整遥控器和阀门控制板状态的位置 + 3. 去掉加载页面自动跳转功能 + 4. 主页控制模式,支持触摸 + 5. 调整5s的位置 +``` diff --git a/uappbase/bean/event.hpp b/uappbase/bean/event.hpp index a834780..6b8a44c 100644 --- a/uappbase/bean/event.hpp +++ b/uappbase/bean/event.hpp @@ -6,6 +6,7 @@ namespace iflytop { using namespace std; typedef enum { kAppEvent_RunModeChangeEvent, + kAppEvent_RemoterConnectStateChangeEvent, kAppEvent_PumpWorkStateChangeEvent, } AppEventType_t; diff --git a/uappbase/service/gstate_mgr.cpp b/uappbase/service/gstate_mgr.cpp index 2db6a71..b24a244 100644 --- a/uappbase/service/gstate_mgr.cpp +++ b/uappbase/service/gstate_mgr.cpp @@ -6,7 +6,10 @@ using namespace std; using namespace iflytop; #define GSM GStateMgr::ins() +void GStateMgr::initialize() { m_mutex.init(); } + void GStateMgr::setLogin(bool isAdmin, const char* loginUsr) { + zlock_guard l(m_mutex); m_isLogin = true; m_isAdmin = isAdmin; if (loginUsr) { @@ -14,27 +17,71 @@ void GStateMgr::setLogin(bool isAdmin, const char* loginUsr) { } } void GStateMgr::setUnLogin() { + zlock_guard l(m_mutex); + m_isLogin = false; m_isAdmin = false; memset(m_loginUsr, 0, MAX_USR_NAME_SIZE + 1); } -bool GStateMgr::isLogin() { return m_isLogin; } -bool GStateMgr::isAdmin() { return m_isAdmin; } -const char* GStateMgr::getLoginUsr() { return m_loginUsr; } +bool GStateMgr::isLogin() { + zlock_guard l(m_mutex); + return m_isLogin; +} +bool GStateMgr::isAdmin() { + zlock_guard l(m_mutex); + return m_isAdmin; +} +const char* GStateMgr::getLoginUsr() { + zlock_guard l(m_mutex); + return m_loginUsr; +} + +void GStateMgr::setAcidState(int32_t state) { + zlock_guard l(m_mutex); -void GStateMgr::setAcidState(int32_t state) { m_AcidState = state; } -void GStateMgr::setRemoterS(int32_t state) { m_RemoterS = state; } + m_AcidState = state; +} +void GStateMgr::setRemoterS(int32_t state) { + zlock_guard l(m_mutex); + m_RemoterS = state; + AppEventBus::ins()->pushEvent(createAppEvent(kAppEvent_RemoterConnectStateChangeEvent)); +} void GStateMgr::setRunMode(hand_acid_mode_t mode) { + zlock_guard l(m_mutex); if (m_RunMode != mode) { m_RunMode = mode; AppEventBus::ins()->pushEvent(createAppEvent(kAppEvent_RunModeChangeEvent)); } } +void GStateMgr::changeToNextRunMode() { + zlock_guard l(m_mutex); -int32_t GStateMgr::getAcidState() { return m_AcidState; } -int32_t GStateMgr::getRemoterS() { return m_RemoterS; } -hand_acid_mode_t GStateMgr::getRunMode() { return m_RunMode; } + if (m_RunMode == khand_acid_m_jog_mode) { + setRunMode(khand_acid_m_continuous_mode); + } else { + setRunMode(khand_acid_m_jog_mode); + } +} -void GStateMgr::setPumpSelectState(int32_t index, bool state) { pumpSelectState[index] = state; } -bool GStateMgr::getPumpSelectState(int32_t index) { return pumpSelectState[index]; } \ No newline at end of file +int32_t GStateMgr::getAcidState() { + zlock_guard l(m_mutex); + return m_AcidState; +} +int32_t GStateMgr::getRemoterS() { + zlock_guard l(m_mutex); + return m_RemoterS; +} +hand_acid_mode_t GStateMgr::getRunMode() { + zlock_guard l(m_mutex); + return m_RunMode; +} + +void GStateMgr::setPumpSelectState(int32_t index, bool state) { + zlock_guard l(m_mutex); + pumpSelectState[index] = state; +} +bool GStateMgr::getPumpSelectState(int32_t index) { + zlock_guard l(m_mutex); + return pumpSelectState[index]; +} \ No newline at end of file diff --git a/uappbase/service/gstate_mgr.hpp b/uappbase/service/gstate_mgr.hpp index 360a4ad..88513fe 100644 --- a/uappbase/service/gstate_mgr.hpp +++ b/uappbase/service/gstate_mgr.hpp @@ -22,12 +22,16 @@ class GStateMgr { bool pumpSelectState[4] = {false}; + zmutex m_mutex = {"GStateMgr"}; + public: static GStateMgr* ins() { static GStateMgr instance; return &instance; } + void initialize(); + void setLogin(bool isAdmin, const char* loginUsr); void setUnLogin(); @@ -38,6 +42,7 @@ class GStateMgr { void setAcidState(int32_t state); void setRemoterS(int32_t state); void setRunMode(hand_acid_mode_t mode); + void changeToNextRunMode(); int32_t getAcidState(); int32_t getRemoterS(); diff --git a/ui/hand_acid_mainboard_ui.HMI b/ui/hand_acid_mainboard_ui.HMI index 8e13430c8fd718987ebd309fc2b5191152fdd8d4..51d51d7d6349983f41490b6b07e9296d8518f1e6 100644 GIT binary patch delta 2076 zcmeIx{Zmv`7zglkWp{}H<)z(~9MWk35dxP%8d9u9Ofd<>G$BJk35!7P?wTe_NItb@ z84$)PD}l1aG{g`O8$}R=k;;Y^sYOyDk-S9X=$K{GcZ0eO(;v_eote+v@6375%bas= zXLYM{ClvcS+3l=kTH<7USg4%N{?YtgW!6>FtPi~ADYHHedK_BqthmL_R$afO-WBfW z)H7LTUTVf9f8XVYdo!FO4dZ5+W;L^pnHcCWZt(C?GfSN~I=D1LRVA@fceP%UYW>w~ zR6gVPv%g)ilqIMxt#p|h89r{ER7*W8M=x_2x6bb^^~_Z}x=!s?m%TTr8ZR4*wpDmp zE4(C_08XF+HE2YImvjEm|7U}<_}8;Z8`@^{wi>-9m;g?o0ySua(c8Ic@V`({YxFjz zQ6$|#vuO@R(OkNd?jj>a(>#iy`E)lepoJ7mi|8I&OmTEC#Zv+;p+s6r_t7$1PWRIa zN}^@Pf4#qA!gVSif=*n2#ST3KW38mzD#o`D_kEI8KM3C}|j6hjHT0Hv@CUW78> z@DjWXyWtgh6<&iqP!1JP39rK&uovEhw_qPs!G3rf4!}Wp2dd!^)WBhQ7i!@M)WK1a zC&YyY^`_bDQp$OCyEt8tJoW&l;C{A@WsZCB7<(}L42)g<>ygZ2tbZ(9Bb6E+rPLG| zm70z7l^ScTQd1E3cMU(b&=kS9UN@_F!$H|YEIKaSr}B6olZKah${u{8zgfo({T2-$ zRNDe1A70{P((>*hQ6tW1Y`;o8&aYADsMnRbw`q7^Eynz&w&{58p*o#3gQqVr@8Ago z!e8th7CII0Nin%ixIKbbjF=<%&o|npa)YNSs4S^T%M)B}&OB$LjZ3Ax#8cMtndgO$ z7vy6refqWl?p|opNp{}6)V!PbWSX-0h~2V6ba>bbRbt>5F=ZNGA7=L8HA8ZyFzzu` zN>*)KJ=owqXn^Zl@F^UJ6L1nbzz&~5C!B)Q@Hu<| zUGOEGfwOQ9zJjlz8@_?_&;#GXckn&*!UgDqAD|z8go`i$gD?cc@RQKCjYK8>0lKHy A-2eap delta 2189 zcmeIxZ%`C<7zgm*-W^A17YBF{4J0pMn1L(;hCvNG4F9C@uOgx3UxH-{?A=L{Nsv5s zp%f70uMiUuOOyb`+7m-TxGTdX%cvj&DJ=_x7mnf>*7pGC6yNo#7w*jG_Ivw0yU*^< z{!TS?+Mj|FPx<%(yHc;%JOyJcctFOidu(%kwr}*FDY7yA7fu#4X1>m}kTf2tEDs{N zhgxJ2=o5U#Qd#JOV(P?MlRqh_)hkhhz*|e~Za0yg$8iS1H`Vr^j+c8(@Afk4*_;Kq zP)9K)^WM5=)FhD64ju9m?7-<7R!7ML|*WgapQt z4JKw@jB8n2EmxUnzKZ%%WmWJ7xp#|+ox6YXVVcJrYVT4wp6Tu_sB$(|ISU{IIVivm zlv0(meeUp`SN9)ZUCMBQ*2SoG5kLlVP=FmMC9R8n+tB}^p;_yqO`%YlOY>+xJwjo$ zfF30+h0{WMj3Q_eEv6;3lpd#Lw49!xNQ$CpilJC~lAfZcDUP0@6%z?WC`*Q0Q;V5f9n&KY_T>sbNP$7;B%(`STddo_ted*}7TM#$mBX#?{;P z`TR0Bxbn6^vyxlPIyFC(Xm~*A;HB<5jj)2B-Dzp!0de9isV&K{NX9GN_0yaAa=FQY z*Ig1-)B7s~KA_UMa<6=yW^&f(N?l{ko#^nxJrF%4PpMqNV6UcupYAEW!L~Y@Cs~%S78(6 z!fTKR`S3byh5{gX1KtE9yak1@1-3#FybbR_F_b_lybEPe4)4J>;P5_t02QzuDq#nF z2s@z)s-XsUK`rctkKkk219h+$_CY;-0u9gzO|TyhKr #include +#include "remote_controler_event_processer.hpp" #include "service/front_end_controler.hpp" #include "service/pump_ctrl_service.hpp" #include "service/remote_controler.hpp" @@ -48,83 +49,12 @@ void AppCore::debugLightLoop() { } } } -void AppCore::processKeyEventFromRemoter(hand_acid_remoter_key_event_t keyEvent) { - /** - * @brief 如果当前设备处于工作中,则无论什么按键都是停止工作 - */ - if (PUMPCS->isWorking()) { - PUMPCS->stop(); - RCTRL->setRemoterState(GSM->getRunMode(), PUMPCS->isWorking()); - } else { - if (keyEvent == hand_acid_remoter_kevent_add_liquid) { - // - 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(); - } - } -} - -void blelogdump(uint8_t* rx, int32_t len) { - // - zble_proto_packet_t* packet = (zble_proto_packet_t*)rx; - // ZLOGI(TAG, "onEvent: index:[%d],from:%d,to:%d cmd:%d", packet->frameIndex, packet->from, packet->to, packet->cmd); - - if (packet->cmd == kzble_report_connected_event) { - zble_connected_event_t* event = (zble_connected_event_t*)packet->data; - ZLOGI(TAG, "onBleEvent -> [connected], name:%20s, peeradd:%s, rssi:%d, tx_power:%d", event->blename, zhex2str(event->peeradd, 6), event->rssi, event->tx_power); - return; - } - - if (packet->cmd == kzble_report_disconnect_event) { - ZLOGI(TAG, "onBleEvent -> disconnect"); - return; - } - if (packet->cmd == kzble_report_scan_result) { - zble_scan_result_t* event = (zble_scan_result_t*)packet->data; - ZLOGI(TAG, "onBleEvent -> [scanResult], name:%20s, peeradd:%s, rssi:%d, tx_power:%d", event->blename, zhex2str(event->peeradd, 6), event->rssi, event->tx_power); - return; - } - - if (packet->cmd == kzble_report_heart) { - zble_heart_t* event = (zble_heart_t*)packet->data; - // ZLOGI(TAG, "onBleEvent -> [heart], from:%s, resetFlag:%d, connectedFlag:%d, power:%d", zble_proto_role_2_str(packet->from), event->reset_flag, event->connected_flag, event->power); - return; - } - - if (packet->cmd == kzble_report_power_on) { - ZLOGI(TAG, "onBleEvent -> [power_on], from:%s", zble_proto_role_2_str(packet->from)); - return; - } - - if (packet->cmd == kzble_app_report_key_event) { - int32_t keyEvent = *(int32_t*)packet->data; - ZLOGI(TAG, "onBleEvent -> [keyEvent] : %s(%d)", hand_acid_remoter_key_event_2_str(keyEvent), keyEvent); - return; - } - - ZLOGI(TAG, "[process-thread] rx unkown event(%d) : %s", packet->cmd, zhex2str(rx, len)); -} void AppCore::appsetup() { /*********************************************************************************************************************** * INIT * ***********************************************************************************************************************/ + GStateMgr::ins()->initialize(); AppEventBus::ins()->initialize(); ConfigService::ins()->initialize(); ZCAN1::ins()->init(); @@ -139,25 +69,19 @@ void AppCore::appsetup() { PUMPCS->initialize(); RemoteControlerStateSyncService::ins()->initialize(); + // Page Page_login::ins()->initialize(); // Page_main::ins()->initialize(); // Page_keybAcidCh::ins()->initialize(); Page_muAcidType::ins()->initialize(); + // EventProcesser + + RemoteControlerEventProcesser::ins()->initialize(); + /*********************************************************************************************************************** * REG_EVENT_HANDLER * ***********************************************************************************************************************/ - RCTRL->regOnReport([this](uint8_t* rx, int32_t len) { - zble_proto_packet_t* packet = (zble_proto_packet_t*)rx; - // ZLOGI(TAG, "[] rx event : %s", zhex2str(rx, len)); - - blelogdump(rx, len); - if (packet->cmd == kzble_app_report_key_event) { - int32_t keyEvent = *(int32_t*)packet->data; - processKeyEventFromRemoter((hand_acid_remoter_key_event_t)keyEvent); - return; - } - }); // diff --git a/usrc/service/app_core.hpp b/usrc/service/app_core.hpp index 449f63e..2b7e6e2 100644 --- a/usrc/service/app_core.hpp +++ b/usrc/service/app_core.hpp @@ -21,7 +21,6 @@ class AppCore { void debugLightLoop(); public: - void processKeyEventFromRemoter(hand_acid_remoter_key_event_t keyEvent); }; } // namespace iflytop \ No newline at end of file diff --git a/usrc/service/front_end_controler.cpp b/usrc/service/front_end_controler.cpp index 33b12c9..650093e 100644 --- a/usrc/service/front_end_controler.cpp +++ b/usrc/service/front_end_controler.cpp @@ -7,9 +7,11 @@ #include "tjc/tjc_constant.hpp" using namespace iflytop; +#define TAG "UIScheduler" +#define MODULE_DEBUG 0 + #define CMD_OVERTIME 50 -#define DEBUG 0 static ZThread uart_rx_thread; static ZThread rx_processed_thread; @@ -20,8 +22,6 @@ static ZThread eventProcessThread; static bool m_isWaitingForAck; static UART_HandleTypeDef* tjcUart; -#define TAG "UIScheduler" - static const char* zhex2str(uint8_t* data, size_t len) { static char buf[256]; memset(buf, 0, sizeof(buf)); @@ -48,6 +48,7 @@ void FrontEndControler::startSchedule() { tjcUart->USR_UartITRxBuf = rxbuf; tjcUart->USR_UartITRxBufSize = 128; tjcUart->USR_UartITRxOff = 0; + HAL_UART_Receive_IT(tjcUart, &tjcUart->USR_UartITRxBufCache, 1); while (1) { static uint8_t processbuf[128]; @@ -97,6 +98,7 @@ void FrontEndControler::startSchedule() { event_cache.eventId = packet.data[0]; event_cache.pid = packet.data[1]; event_cache.bid = 0; + m_nowPage = packet.data[1]; callUsrEventCb(&event_cache); } else { event_cache.eventId = packet.data[0]; @@ -115,7 +117,7 @@ void FrontEndControler::startSchedule() { void FrontEndControler::processScreenRxPacket(uint8_t* data, size_t len) { // 判断包是否合法 -#if DEBUG +#if MODULE_DEBUG ZLOGI(TAG, "[rx-thread] : rx :%s(%d)", zhex2str(data, len), len); #endif @@ -394,3 +396,4 @@ void FrontEndControler::setEnumComponentState(uint8_t pid, uint8_t bid, int32_t // 枚举类型使用动画组件 sendcmd("p[%d].b[%d].tim=%d", pid, bid, state * 50); } +void FrontEndControler::setAph(uint8_t pid, uint8_t bid, int32_t state) { sendcmd("p[%d].b[%d].aph=%d", pid, bid, state); } diff --git a/usrc/service/front_end_controler.hpp b/usrc/service/front_end_controler.hpp index b936118..db8d131 100644 --- a/usrc/service/front_end_controler.hpp +++ b/usrc/service/front_end_controler.hpp @@ -28,6 +28,8 @@ class FrontEndControler { on_usr_event_cb_t m_cb[50]; int32_t m_ncb = 0; + int32_t m_nowPage = 0; + public: FrontEndControler() {}; ~FrontEndControler() {}; @@ -39,6 +41,7 @@ class FrontEndControler { void initialize(); void regOnUsrEventCb(on_usr_event_cb_t onclik); + int getNowPage() { return m_nowPage; } void startSchedule(); @@ -64,6 +67,7 @@ class FrontEndControler { void setTouchEnableState(uint8_t bid, uint8_t enable); void setEnumComponentState(uint8_t pid, uint8_t bid, int32_t state); + void setAph(uint8_t pid, uint8_t bid, int32_t state); // 组件透明度,最大127,设置为0则隐藏组件 void sendcmd(const char* format, ...); private: diff --git a/usrc/service/page/Page_main.cpp b/usrc/service/page/Page_main.cpp index 570f21f..21e8b8c 100644 --- a/usrc/service/page/Page_main.cpp +++ b/usrc/service/page/Page_main.cpp @@ -1,52 +1,63 @@ #include "Page_main.hpp" using namespace iflytop; -#define PAGE pg_main -#define OBJ(name) ob_main_##name -#define TAG "Page_main" +#define PAGE pg_main +#define TAG "Page_main" #define ADMIN_MENU_ID pg_menuAdmin2 #define USR_MENU_ID pg_menuUsr static CfgItermCache cfgcache; +/** + * @brief + * + * 1.对接遥控器状态 + * 2.对接阀门控制板的状态(直接隐藏掉) + * + */ int32_t Page_main::getPageNum() { return PAGE; } void Page_main::OnPageLoad() { - // 设置酸液种类选择组件是否使能 - if (CS->getInt(kcfg_lockAcidName) == 1) { - UIS->setTouchEnableState(ob_main_acidname0, 0); - UIS->setTouchEnableState(ob_main_acidname1, 0); - UIS->setTouchEnableState(ob_main_acidname2, 0); - UIS->setTouchEnableState(ob_main_acidname3, 0); - } else { + // 只有管理员能够修改,酸液通道名称 + if (GSM->isAdmin()) { UIS->setTouchEnableState(ob_main_acidname0, 1); UIS->setTouchEnableState(ob_main_acidname1, 1); UIS->setTouchEnableState(ob_main_acidname2, 1); UIS->setTouchEnableState(ob_main_acidname3, 1); + } else { + UIS->setTouchEnableState(ob_main_acidname0, 0); + UIS->setTouchEnableState(ob_main_acidname1, 0); + UIS->setTouchEnableState(ob_main_acidname2, 0); + UIS->setTouchEnableState(ob_main_acidname3, 0); } + // 更新酸液种类 - UIS->setVal(PAGE, OBJ(acidname0), CS->getStr(kcfg_acidChooseName0, &cfgcache)); - UIS->setVal(PAGE, OBJ(acidname1), CS->getStr(kcfg_acidChooseName1, &cfgcache)); - UIS->setVal(PAGE, OBJ(acidname2), CS->getStr(kcfg_acidChooseName2, &cfgcache)); - UIS->setVal(PAGE, OBJ(acidname3), CS->getStr(kcfg_acidChooseName3, &cfgcache)); + UIS->setVal(PAGE, ob_main_acidname0, CS->getStr(kcfg_acidChooseName0, &cfgcache)); + UIS->setVal(PAGE, ob_main_acidname1, CS->getStr(kcfg_acidChooseName1, &cfgcache)); + UIS->setVal(PAGE, ob_main_acidname2, CS->getStr(kcfg_acidChooseName2, &cfgcache)); + UIS->setVal(PAGE, ob_main_acidname3, CS->getStr(kcfg_acidChooseName3, &cfgcache)); // 更新加液体积 - UIS->setVal(PAGE, OBJ(acideval0), CS->getStr(kcfg_acideval0, &cfgcache)); - UIS->setVal(PAGE, OBJ(acideval1), CS->getStr(kcfg_acideval1, &cfgcache)); - UIS->setVal(PAGE, OBJ(acideval2), CS->getStr(kcfg_acideval2, &cfgcache)); - UIS->setVal(PAGE, OBJ(acideval3), CS->getStr(kcfg_acideval3, &cfgcache)); - // 更新状态 - UIS->setEnumComponentState(PAGE, OBJ(AcidState), GSM->getAcidState()); // 酸液桶是否在线 - UIS->setEnumComponentState(PAGE, OBJ(RemoterS), GSM->getRemoterS()); // 遥控器是否在线 - UIS->setEnumComponentState(PAGE, OBJ(RunMode), (int32_t)GSM->getRunMode()); // 运行模式 - - UIS->setVal(PAGE, OBJ(acidch0), GSM->getPumpSelectState(0)); - UIS->setVal(PAGE, OBJ(acidch1), GSM->getPumpSelectState(1)); - UIS->setVal(PAGE, OBJ(acidch2), GSM->getPumpSelectState(2)); - UIS->setVal(PAGE, OBJ(acidch3), GSM->getPumpSelectState(3)); + UIS->setVal(PAGE, ob_main_acideval0, CS->getStr(kcfg_acideval0, &cfgcache)); + UIS->setVal(PAGE, ob_main_acideval1, CS->getStr(kcfg_acideval1, &cfgcache)); + UIS->setVal(PAGE, ob_main_acideval2, CS->getStr(kcfg_acideval2, &cfgcache)); + UIS->setVal(PAGE, ob_main_acideval3, CS->getStr(kcfg_acideval3, &cfgcache)); + // 更新顶部状态栏 + UIS->setEnumComponentState(PAGE, ob_main_AcidState, GSM->getAcidState()); // 酸液锁是否在线 + UIS->setAph(PAGE, ob_main_AcidState, 0); // 暂时隐藏掉Aph + UIS->setEnumComponentState(PAGE, ob_main_RemoterS, GSM->getRemoterS()); // 遥控器是否在线 + + // 更新底部状态栏 + UIS->setEnumComponentState(PAGE, ob_main_RunMode, (int32_t)GSM->getRunMode()); // 运行模式 + + UIS->setVal(PAGE, ob_main_acidch0, GSM->getPumpSelectState(0)); + UIS->setVal(PAGE, ob_main_acidch1, GSM->getPumpSelectState(1)); + UIS->setVal(PAGE, ob_main_acidch2, GSM->getPumpSelectState(2)); + UIS->setVal(PAGE, ob_main_acidch3, GSM->getPumpSelectState(3)); // 时间位置暂时显示版本号 - UIS->setVal(PAGE, OBJ(clock), "version:%s", APP_VERSION); + UIS->setVal(PAGE, ob_main_clock, "", APP_VERSION); + // UIS->setVal(PAGE, ob_main_clock, "版本:%s", APP_VERSION); // 根据当前登录用户设置菜单页面 if (GStateMgr::ins()->isAdmin()) { @@ -56,46 +67,63 @@ void Page_main::OnPageLoad() { } } +void Page_main::OnAppEvent(AppEvent_t* event) { + if (event->type == kAppEvent_RunModeChangeEvent) { + UIS->setEnumComponentState(PAGE, ob_main_RunMode, (int32_t)GSM->getRunMode()); + } + + if (event->type == kAppEvent_RemoterConnectStateChangeEvent) { + UIS->setEnumComponentState(PAGE, ob_main_RemoterS, GSM->getRemoterS()); + } + return; +}; + void Page_main::OnInputFieldContentChange(uint8_t bid, const char* text) { // 更新酸液每次分配设定值 - if (bid == OBJ(acideval0)) { + if (bid == ob_main_acideval0) { processAcidevalUpdateEvent(bid, text, 0, kcfg_acideval0); - } else if (bid == OBJ(acideval1)) { + } else if (bid == ob_main_acideval1) { processAcidevalUpdateEvent(bid, text, 1, kcfg_acideval1); - } else if (bid == OBJ(acideval2)) { + } else if (bid == ob_main_acideval2) { processAcidevalUpdateEvent(bid, text, 2, kcfg_acideval2); - } else if (bid == OBJ(acideval3)) { + } else if (bid == ob_main_acideval3) { processAcidevalUpdateEvent(bid, text, 3, kcfg_acideval3); } - // 更新酸液种类 - else if (bid == OBJ(acidname0)) { + // 修改酸液名称 + else if (bid == ob_main_acidname0) { ZLOGI(TAG, "acidname0:%s", text); CS->setcfgAndFlush(kcfg_acidChooseName0, text); - } else if (bid == OBJ(acidname1)) { + } else if (bid == ob_main_acidname1) { ZLOGI(TAG, "acidname1:%s", text); CS->setcfgAndFlush(kcfg_acidChooseName1, text); - } else if (bid == OBJ(acidname2)) { + } else if (bid == ob_main_acidname2) { ZLOGI(TAG, "acidname2:%s", text); CS->setcfgAndFlush(kcfg_acidChooseName2, text); - } else if (bid == OBJ(acidname3)) { + } else if (bid == ob_main_acidname3) { ZLOGI(TAG, "acidname3:%s", text); CS->setcfgAndFlush(kcfg_acidChooseName3, text); } } -void Page_main::OnButton(uint8_t bid, uint8_t val) {} -void Page_main::OnDoubleStateButton(uint8_t bid, uint8_t val) { - // 更新泵选择状态 - if (bid == OBJ(acidch0)) { + +void Page_main::OnButton(uint8_t bid, uint8_t val) { + if (bid == ob_main_RunMode) { + // 切换模式 + GSM->changeToNextRunMode(); + } else if (bid == ob_main_acidch0) { + // 选中(取消选中)加酸泵0 ZLOGI(TAG, "choose acid ch%d,%d", 0, val); GSM->setPumpSelectState(0, val); - } else if (bid == OBJ(acidch1)) { + } else if (bid == ob_main_acidch1) { + // 选中(取消选中)加酸泵1 ZLOGI(TAG, "choose acid ch%d,%d", 1, val); GSM->setPumpSelectState(1, val); - } else if (bid == OBJ(acidch2)) { + } else if (bid == ob_main_acidch2) { + // 选中(取消选中)加酸泵2 ZLOGI(TAG, "choose acid ch%d,%d", 2, val); GSM->setPumpSelectState(2, val); - } else if (bid == OBJ(acidch3)) { + } else if (bid == ob_main_acidch3) { + // 选中(取消选中)加酸泵3 ZLOGI(TAG, "choose acid ch%d,%d", 3, val); GSM->setPumpSelectState(3, val); } diff --git a/usrc/service/page/Page_main.hpp b/usrc/service/page/Page_main.hpp index a80e9de..11650b6 100644 --- a/usrc/service/page/Page_main.hpp +++ b/usrc/service/page/Page_main.hpp @@ -18,9 +18,9 @@ class Page_main : public IPageProcesser { virtual int32_t getPageNum() override; virtual void OnPageLoad() override; - virtual void OnInputFieldContentChange(uint8_t bid, const char* text) override; virtual void OnButton(uint8_t bid, uint8_t val) override; - virtual void OnDoubleStateButton(uint8_t bid, uint8_t val) override; + virtual void OnInputFieldContentChange(uint8_t bid, const char* text) override; + virtual void OnAppEvent(AppEvent_t* event) override; private: void processAcidevalUpdateEvent(uint8_t bid, const char* text, int ch, config_index_t cfgid); diff --git a/usrc/service/page/page_processer.hpp b/usrc/service/page/page_processer.hpp index 9a657d1..62c3241 100644 --- a/usrc/service/page/page_processer.hpp +++ b/usrc/service/page/page_processer.hpp @@ -21,7 +21,7 @@ class IPageProcesser { // 页面加载事件 OnPageLoad(); } else if (event->eventId == tjc::kpt_double_state_button_event) { - OnDoubleStateButton(event->bid, event->d.double_state_button.val); + OnButton(event->bid, event->d.double_state_button.val); } else if (event->eventId == tjc::kpt_button_event) { OnButton(event->bid, event->d.button_event.val); } else if (event->eventId == tjc::kpt_inputfield_content_change_event) { @@ -32,6 +32,13 @@ class IPageProcesser { OnUnLoginButtonClick(event->bid); } }); + + AppEventBus::ins()->regOnEvent([this](AppEvent_t* event) { + if (UIS->getNowPage() != getPageNum()) { + return; + } + OnAppEvent(event); + }); } private: @@ -40,9 +47,9 @@ class IPageProcesser { virtual void OnPageLoad() { return; }; virtual void OnInputFieldContentChange(uint8_t bid, const char* text) { return; }; virtual void OnButton(uint8_t bid, uint8_t val) { return; }; - virtual void OnDoubleStateButton(uint8_t bid, uint8_t val) { return; }; virtual void OnLoginButtonClick(uint8_t bid, const char* userName, const char* passwd) { return; }; virtual void OnUnLoginButtonClick(uint8_t bid) { return; }; + virtual void OnAppEvent(AppEvent_t* event) { return; }; }; } // namespace iflytop diff --git a/usrc/service/remote_controler.cpp b/usrc/service/remote_controler.cpp index 0ce95c7..217bae4 100644 --- a/usrc/service/remote_controler.cpp +++ b/usrc/service/remote_controler.cpp @@ -3,11 +3,11 @@ #include "app_protocols/ble_through/ble_proto_utils.h" using namespace iflytop; -#define UART_RX_OVERTIME 200 -#define TAG "RemoteControler" +#define TAG "RemoteControler" +#define MODULE_DEBUG 0 -#define CMD_OVERTIME 500 -#define DEBUG 0 +#define UART_RX_OVERTIME 200 +#define CMD_OVERTIME 500 static ZQueue ackQueue; static ZQueue eventQueue; @@ -116,7 +116,7 @@ void RemoteControlerUpper::startSchedule() { void RemoteControlerUpper::preProcessrxpacket(RemoteControlerReportPacket_t* packet) { // 判断包是否合法 -#if DEBUG +#if MODULE_DEBUG ZLOGI(TAG, "[rx-thread] : rx :%s(%d)", zhex2str(packet->data, packet->datalen), packet->datalen); #endif @@ -143,7 +143,7 @@ void RemoteControlerUpper::preProcessrxpacket(RemoteControlerReportPacket_t* pac } void RemoteControlerUpper::processRxEventPacket(RemoteControlerReportPacket_t* packet) { -#if DEBUG +#if MODULE_DEBUG ZLOGI(TAG, "[process-thread] rx event : %s", zhex2str(packet->data, packet->datalen)); #endif // if (m_on_report) { @@ -158,7 +158,7 @@ bool RemoteControlerUpper::txcmd(uint8_t* data, uint32_t len) { zlock_guard lg(m_cmdlock); ackQueue.clear(); m_isWaitingForAck = true; -#if DEBUG +#if MODULE_DEBUG ZLOGI(TAG, "txcmd : %s(%d)", zhex2str(data, len), len); #endif @@ -170,7 +170,7 @@ bool RemoteControlerUpper::txcmd(uint8_t* data, uint32_t len) { // HAL_UART_DMAStop(m_uart); return false; } -#if DEBUG +#if MODULE_DEBUG ZLOGI(TAG, "ack : %s", zhex2str(ackcache.data, ackcache.datalen)); #endif // HAL_UART_DMAStop(m_uart); diff --git a/usrc/service/remote_controler_event_processer.cpp b/usrc/service/remote_controler_event_processer.cpp new file mode 100644 index 0000000..137ec4b --- /dev/null +++ b/usrc/service/remote_controler_event_processer.cpp @@ -0,0 +1,110 @@ +#include "remote_controler_event_processer.hpp" + +#include "pump_ctrl_service.hpp" +#include "service/remote_controler.hpp" + +using namespace iflytop; +#define TAG "RemoteControlerEventProcesser" +static const char* zhex2str(uint8_t* data, size_t len) { + static char buf[256]; + memset(buf, 0, sizeof(buf)); + for (size_t i = 0; i < len; i++) { + sprintf(buf + i * 2, "%02X", data[i]); + } + return buf; +} + +void RemoteControlerEventProcesser::initialize() { + m_thread.init(TAG); + + GSM->setRemoterS(RemoteControlerUpper::ins()->isConnected()); + + RCTRL->regOnReport([this](uint8_t* rx, int32_t len) { + zble_proto_packet_t* packet = (zble_proto_packet_t*)rx; + logevent(rx, len); + if (packet->cmd == kzble_app_report_key_event) { + int32_t keyEvent = *(int32_t*)packet->data; + processKeyEventFromRemoter((hand_acid_remoter_key_event_t)keyEvent); + return; + } + + if (packet->cmd == kzble_report_connected_event) { + GSM->setRemoterS(true); + } else if (packet->cmd == kzble_report_disconnect_event) { + GSM->setRemoterS(false); + } + }); +} + +void RemoteControlerEventProcesser::logevent(uint8_t* rx, int32_t len) { + // + zble_proto_packet_t* packet = (zble_proto_packet_t*)rx; + // ZLOGI(TAG, "onEvent: index:[%d],from:%d,to:%d cmd:%d", packet->frameIndex, packet->from, packet->to, packet->cmd); + + if (packet->cmd == kzble_report_connected_event) { + zble_connected_event_t* event = (zble_connected_event_t*)packet->data; + ZLOGI(TAG, "onBleEvent -> [connected], name:%20s, peeradd:%s, rssi:%d, tx_power:%d", event->blename, zhex2str(event->peeradd, 6), event->rssi, event->tx_power); + return; + } + + if (packet->cmd == kzble_report_disconnect_event) { + ZLOGI(TAG, "onBleEvent -> disconnect"); + return; + } + if (packet->cmd == kzble_report_scan_result) { + zble_scan_result_t* event = (zble_scan_result_t*)packet->data; + ZLOGI(TAG, "onBleEvent -> [scanResult], name:%20s, peeradd:%s, rssi:%d, tx_power:%d", event->blename, zhex2str(event->peeradd, 6), event->rssi, event->tx_power); + return; + } + + if (packet->cmd == kzble_report_heart) { + zble_heart_t* event = (zble_heart_t*)packet->data; + // ZLOGI(TAG, "onBleEvent -> [heart], from:%s, resetFlag:%d, connectedFlag:%d, power:%d", zble_proto_role_2_str(packet->from), event->reset_flag, event->connected_flag, event->power); + return; + } + + if (packet->cmd == kzble_report_power_on) { + ZLOGI(TAG, "onBleEvent -> [power_on], from:%s", zble_proto_role_2_str(packet->from)); + return; + } + + if (packet->cmd == kzble_app_report_key_event) { + int32_t keyEvent = *(int32_t*)packet->data; + ZLOGI(TAG, "onBleEvent -> [keyEvent] : %s(%d)", hand_acid_remoter_key_event_2_str(keyEvent), keyEvent); + return; + } + + ZLOGI(TAG, "[process-thread] rx unkown event(%d) : %s", packet->cmd, zhex2str(rx, len)); +} + +void RemoteControlerEventProcesser::processKeyEventFromRemoter(hand_acid_remoter_key_event_t keyEvent) { + /** + * @brief 如果当前设备处于工作中,则无论什么按键都是停止工作 + */ + if (PUMPCS->isWorking()) { + PUMPCS->stop(); + RCTRL->setRemoterState(GSM->getRunMode(), PUMPCS->isWorking()); + } else { + if (keyEvent == hand_acid_remoter_kevent_add_liquid) { + // + 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/remote_controler_event_processer.hpp b/usrc/service/remote_controler_event_processer.hpp new file mode 100644 index 0000000..1cec6ec --- /dev/null +++ b/usrc/service/remote_controler_event_processer.hpp @@ -0,0 +1,30 @@ +#pragma once + +#include "apphardware/apphardware.hpp" +#include "uappbase/base.hpp" +namespace iflytop { +using namespace std; +/** + * @brief + * + * 遥控器事件处理 + */ +class RemoteControlerEventProcesser { + private: + /* data */ + ZThread m_thread; + zmutex m_lock = {"RemoteControlerEventProcesserLock"}; + + public: + static RemoteControlerEventProcesser* ins() { + static RemoteControlerEventProcesser instance; + return &instance; + } + + void initialize(); + + public: + void logevent(uint8_t* rx, int32_t len); + void processKeyEventFromRemoter(hand_acid_remoter_key_event_t keyEvent); +}; +} // namespace iflytop