From 017ca188a4cc17af4e1cca573f21307036fc25ec Mon Sep 17 00:00:00 2001 From: zhaohe Date: Tue, 19 Nov 2024 23:16:32 +0800 Subject: [PATCH] update --- uappbase/bean/event.hpp | 14 +++- uappbase/service/app_event_bus.cpp | 13 +++- uappbase/service/app_event_bus.hpp | 4 +- ui/hand_acid_mainboard_ui.HMI | Bin 19270797 -> 19270797 bytes ui/ui.h | 20 ++--- usrc/service/app_core.cpp | 9 +-- usrc/uicontroler/base/page_processer.cpp | 53 ++++++++++++++ usrc/uicontroler/base/page_processer.hpp | 30 ++------ usrc/uicontroler/front_end_controler.cpp | 81 ++++++++++----------- usrc/uicontroler/front_end_controler.hpp | 32 +++----- usrc/uicontroler/page/UIPageInit.cpp | 13 ++++ .../page/initializer/PageInitializer.cpp | 2 - usrc/uicontroler/page/login/login_page.cpp | 71 ++++++++++++++++++ usrc/uicontroler/page/login/page_login.cpp | 75 ------------------- usrc/uicontroler/page/page.hpp | 8 -- usrc/uicontroler/tjc/tjc_constant.hpp | 2 +- 16 files changed, 226 insertions(+), 201 deletions(-) create mode 100644 usrc/uicontroler/base/page_processer.cpp create mode 100644 usrc/uicontroler/page/UIPageInit.cpp create mode 100644 usrc/uicontroler/page/login/login_page.cpp delete mode 100644 usrc/uicontroler/page/login/page_login.cpp delete mode 100644 usrc/uicontroler/page/page.hpp diff --git a/uappbase/bean/event.hpp b/uappbase/bean/event.hpp index 195a9bc..a1f65dd 100644 --- a/uappbase/bean/event.hpp +++ b/uappbase/bean/event.hpp @@ -5,7 +5,7 @@ #include -#include "config_index_enum.hpp" +#include "uicontroler\tjc\tjc_constant.hpp" namespace iflytop { using namespace std; typedef enum { @@ -14,6 +14,11 @@ typedef enum { kAppEvent_StateDisplayInfo, kAppEvent_BleConnectEvent, kAppEvent_AcidChCfgChangeEvent, + + // UI_EVENT + KAE_UIEvent, + kAE_LoginEvent, + } AppEventType_t; /** @@ -27,9 +32,10 @@ typedef enum { typedef struct { AppEventType_t type; union event { - uint32_t placeholder; - char bleName[20]; - char stateDisplayInfo[30]; + uint32_t placeholder; + char bleName[20]; + char stateDisplayInfo[30]; + tjc::UIEvent uiEvent; } d; } AppEvent_t; diff --git a/uappbase/service/app_event_bus.cpp b/uappbase/service/app_event_bus.cpp index 88bf5ea..e254063 100644 --- a/uappbase/service/app_event_bus.cpp +++ b/uappbase/service/app_event_bus.cpp @@ -6,8 +6,9 @@ using namespace std; static QueueHandle_t xQueue; #define TAG "AppEventBus" void AppEventBus::initialize() { + lock.init(); thread.init("AppEventBus", 1024); - xQueue = xQueueCreate(10, sizeof(AppEvent_t)); + xQueue = xQueueCreate(20, sizeof(AppEvent_t)); thread.start([this]() { AppEvent_t event; @@ -31,4 +32,12 @@ void AppEventBus::pushEvent(const AppEvent_t& event) { if (xQueueSend(xQueue, &event, 100) != pdPASS) { ZLOGE(TAG, "xQueueSend failed"); } -} \ No newline at end of file +} + +void AppEventBus::pushSimpleEvent(AppEventType_t type) { + zlock_guard lck(lock); + + static AppEvent_t event; + event.type = type; + pushEvent(event); +} diff --git a/uappbase/service/app_event_bus.hpp b/uappbase/service/app_event_bus.hpp index 3791556..e620422 100644 --- a/uappbase/service/app_event_bus.hpp +++ b/uappbase/service/app_event_bus.hpp @@ -1,7 +1,7 @@ #pragma once +#include "../appdep.hpp" #include "uappbase/appcfg/appcfg.hpp" #include "uappbase/bean/bean.hpp" -#include "../appdep.hpp" // namespace iflytop { @@ -13,6 +13,7 @@ class AppEventBus { private: onAppEventCB_t m_cbs[50]; int32_t cbNum = 0; + zmutex lock = {"AppEventBus-Lock"}; public: static AppEventBus* ins() { @@ -24,6 +25,7 @@ class AppEventBus { void regOnEvent(onAppEventCB_t onEvent); void pushEvent(const AppEvent_t& event); + void pushSimpleEvent(AppEventType_t type); }; } // namespace iflytop diff --git a/ui/hand_acid_mainboard_ui.HMI b/ui/hand_acid_mainboard_ui.HMI index 524333d20c8d749264a3f6979b9ee7065102826e..2d967da9347627c1e1b02093fba690f0a705735f 100644 GIT binary patch delta 26614 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 diff --git a/ui/ui.h b/ui/ui.h index 8cc2d51..44f9742 100644 --- a/ui/ui.h +++ b/ui/ui.h @@ -13,13 +13,12 @@ #define pg_muDeviceInfo 11 #define pg_muAudit 12 #define pg_muPumpTest 13 -#define pg_alert 14 -#define pg_confirm 15 -#define pg_keybAcidCh 16 -#define pg_keybdB 17 -#define pg_keybdAP 18 -#define pg_keybdA 19 -#define pg_keyPasswd 20 +#define pg_confirm 14 +#define pg_keybAcidCh 15 +#define pg_keybdB 16 +#define pg_keybdAP 17 +#define pg_keybdA 18 +#define pg_keyPasswd 19 //gvar.objs #define ob_gvar_gvar 0 //pStart.objs @@ -251,13 +250,6 @@ #define ob_muPumpTest_stop 12 #define ob_muPumpTest_pumpId 13 #define ob_muPumpTest_pumpIdTil 14 -//alert.objs -#define ob_alert_alert 0 -#define ob_alert_t0 1 -#define ob_alert_confirmkey 2 -#define ob_alert_info 3 -#define ob_alert_frompage 4 -#define ob_alert_t1 5 //confirm.objs #define ob_confirm_confirm 0 #define ob_confirm_t0 1 diff --git a/usrc/service/app_core.cpp b/usrc/service/app_core.cpp index ca20095..0a77535 100644 --- a/usrc/service/app_core.cpp +++ b/usrc/service/app_core.cpp @@ -12,7 +12,6 @@ #include "ucomponents/zcan/zcan.hpp" // #include "uicontroler/front_end_controler.hpp" -#include "uicontroler/page/page.hpp" // #include "uicontroler/page/page.hpp" // @@ -102,10 +101,10 @@ void AppCore::initialize() { DeviceSettingDao::init(); ZLOGI(TAG, "load zhdb end"); - FrontEndControler::ins()->initialize(); - FrontEndControler::ins()->startSchedule(); - PageInit(); - FrontEndControler::ins()->chpage(pg_login); + UI::ins()->initialize(); + UI::ins()->startSchedule(); + UI::ins()->pageInit(); + UI::ins()->chpage(pg_login); while (true) osDelay(30); } diff --git a/usrc/uicontroler/base/page_processer.cpp b/usrc/uicontroler/base/page_processer.cpp new file mode 100644 index 0000000..bb3b2c8 --- /dev/null +++ b/usrc/uicontroler/base/page_processer.cpp @@ -0,0 +1,53 @@ +#include "page_processer.hpp" + +using namespace iflytop; +#define TAG "PageMgr" + +IPageProcesser* m_pages[50]; +int m_pageNum; + +static void regPage(IPageProcesser* page) { + if (m_pageNum > 50) { + return; + } + m_pages[m_pageNum++] = page; +} + +IPageProcesser::IPageProcesser(const char* name, uint32_t pageId) { + regPage(this); + this->pageId = pageId; + this->pageName = name; +} + +void IPageProcesser::initialize() { + + AppEventBus::ins()->regOnEvent([this](AppEvent_t* event) { + if (event->type == KAE_UIEvent) { + if (pageId != event->d.uiEvent.pid) { + return; + } + + if (event->d.uiEvent.eventId == tjc::kpt_sys_event_page_id) { + OnPageLoadContext cxt = {0}; + OnPageLoad(&cxt); + } else if (event->d.uiEvent.eventId == tjc::kpt_double_state_button_event) { + OnDoubleStateButton(event->d.uiEvent.bid, event->d.uiEvent.d.double_state_button.val); + } else if (event->d.uiEvent.eventId == tjc::kpt_button_event) { + OnButton(event->d.uiEvent.bid, event->d.uiEvent.d.button_event.val); + } else if (event->d.uiEvent.eventId == tjc::kpt_inputfield_content_change_event1) { + OnInputFieldContentChange(event->d.uiEvent.bid, event->d.uiEvent.d.inputfield_content.text); + } + } else { + OnAppEvent(event); + } + }); +} + +namespace iflytop { +void UIPageInit() { + for (size_t i = 0; i < m_pageNum; i++) { + ZLOGI(TAG, "initialize page %s %d", m_pages[i]->pageName, m_pages[i]->pageId); + m_pages[i]->initialize(); + } +} +} // namespace iflytop diff --git a/usrc/uicontroler/base/page_processer.hpp b/usrc/uicontroler/base/page_processer.hpp index ac0309e..a02cd65 100644 --- a/usrc/uicontroler/base/page_processer.hpp +++ b/usrc/uicontroler/base/page_processer.hpp @@ -15,33 +15,13 @@ class OnPageLoadContext { }; class IPageProcesser { - private: - /* data */ - protected: - uint32_t pageId = 0; - public: - IPageProcesser(uint32_t pageId) { this->pageId = pageId; } + uint32_t pageId = 0; + const char* pageName = "Not Set"; - virtual void initialize() { - UIS->regOnUsrEventCb([this](tjc::tjc_usr_event_t* event) { - if (pageId != event->pid) { - return; - } - if (event->eventId == tjc::kpt_sys_event_page_id) { - OnPageLoadContext cxt = {0}; - OnPageLoad(&cxt); - } else if (event->eventId == tjc::kpt_double_state_button_event) { - OnDoubleStateButton(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_event1) { - OnInputFieldContentChange(event->bid, event->d.inputfield_content.text); - } - }); - - AppEventBus::ins()->regOnEvent([this](AppEvent_t* event) { OnAppEvent(event); }); - } + public: + IPageProcesser(const char* name, uint32_t pageId); + virtual void initialize(); private: virtual void OnPageLoad(OnPageLoadContext* cxt) { return; }; diff --git a/usrc/uicontroler/front_end_controler.cpp b/usrc/uicontroler/front_end_controler.cpp index d2678b5..2bed284 100644 --- a/usrc/uicontroler/front_end_controler.cpp +++ b/usrc/uicontroler/front_end_controler.cpp @@ -31,7 +31,7 @@ static const char* zhex2str(uint8_t* data, size_t len) { return buf; } -void FrontEndControler::initialize() { // +void UI::initialize() { // ackQueue.initialize(5, sizeof(tjc_rx_packet_t)); eventQueue.initialize(5, sizeof(tjc_rx_packet_t)); usartRxThread.init("usartRxThread", 1024); @@ -41,7 +41,7 @@ void FrontEndControler::initialize() { // m_cmdlock.init(); } #define UART_RX_OVERTIME 5 -void FrontEndControler::startSchedule() { +void UI::startSchedule() { usartRxThread.start([this]() { static uint8_t rxbuf[128]; tjcUart->USR_UartITRxing = 1; @@ -116,7 +116,7 @@ void FrontEndControler::startSchedule() { }); } -void FrontEndControler::processScreenRxPacket(uint8_t* data, size_t len) { +void UI::processScreenRxPacket(uint8_t* data, size_t len) { // 判断包是否合法 #if MODULE_DEBUG ZLOGI(TAG, "[rx-thread] : rx :%s(%d)", zhex2str(data, len), len); @@ -153,11 +153,6 @@ void FrontEndControler::processScreenRxPacket(uint8_t* data, size_t len) { } } -void FrontEndControler::regOnUsrEventCb(on_usr_event_cb_t cb) { - m_cb[m_ncb] = cb; - m_ncb++; -} - static const char* zcpystr(char* cpyto, const char* strbegin, int32_t maxlen) { if (strbegin == NULL) return NULL; int32_t i = 0; @@ -169,7 +164,7 @@ static const char* zcpystr(char* cpyto, const char* strbegin, int32_t maxlen) { } return NULL; } -void FrontEndControler::processUsrButtonEvent(uint8_t* data, size_t len) { +void UI::processUsrButtonEvent(uint8_t* data, size_t len) { /** * @brief * 指令格式: @@ -189,18 +184,9 @@ void FrontEndControler::processUsrButtonEvent(uint8_t* data, size_t len) { event_cache.pid = data[1]; event_cache.bid = data[2]; - if (event_cache.pid == pg_confirm && event_cache.bid == ob_confirm_confirm) { - if (m_onConfirmPageConfirmKey) m_onConfirmPageConfirmKey(true); - m_onConfirmPageConfirmKey = nullptr; - } else if (event_cache.pid == pg_confirm && event_cache.bid == ob_confirm_canclekey) { - if (m_onAlertPageConfirmKey) m_onAlertPageConfirmKey(false); - m_onAlertPageConfirmKey = nullptr; - } else if (event_cache.pid == pg_alert && event_cache.bid == ob_alert_confirmkey) { - } - callUsrEventCb(&event_cache); } -void FrontEndControler::processUsrDoubleStateButtonEvent(uint8_t* data, size_t len) { +void UI::processUsrDoubleStateButtonEvent(uint8_t* data, size_t len) { /** * @brief * 指令格式: @@ -224,13 +210,14 @@ void FrontEndControler::processUsrDoubleStateButtonEvent(uint8_t* data, size_t l callUsrEventCb(&event_cache); } -void FrontEndControler::callUsrEventCb(tjc::tjc_usr_event_t* event) { - for (int32_t i = 0; i < m_ncb; i++) { - m_cb[i](event); - } +void UI::callUsrEventCb(tjc::UIEvent* event) { + static AppEvent_t appEvent; + appEvent.type = KAE_UIEvent; + memcpy(&appEvent.d.uiEvent, event, sizeof(tjc::UIEvent)); + AppEventBus::ins()->pushEvent(appEvent); } -void FrontEndControler::processInputfieldContentChangeEvent0(uint8_t* data, size_t len) { +void UI::processInputfieldContentChangeEvent0(uint8_t* data, size_t len) { /** * @brief * @@ -253,7 +240,7 @@ void FrontEndControler::processInputfieldContentChangeEvent0(uint8_t* data, size callUsrEventCb(&event_cache); } -void FrontEndControler::processInputfieldContentChangeEvent1(uint8_t* data, size_t len) { +void UI::processInputfieldContentChangeEvent1(uint8_t* data, size_t len) { /** * @brief * @@ -279,7 +266,7 @@ void FrontEndControler::processInputfieldContentChangeEvent1(uint8_t* data, size callUsrEventCb(&event_cache); } -bool FrontEndControler::readTxt(uint8_t pid, uint8_t cId, char* txt, int32_t txtbuflen) { +bool UI::readTxt(uint8_t pid, uint8_t cId, char* txt, int32_t txtbuflen) { zlock_guard lg(m_cmdlock); startReceiveAck(); @@ -303,7 +290,7 @@ bool FrontEndControler::readTxt(uint8_t pid, uint8_t cId, char* txt, int32_t txt memcpy(txt, &ackcache.data[1], cpysize); return true; } -bool FrontEndControler::readInt(uint8_t pid, uint8_t cId, int32_t* val) { +bool UI::readInt(uint8_t pid, uint8_t cId, int32_t* val) { zlock_guard lg(m_cmdlock); startReceiveAck(); @@ -325,7 +312,7 @@ bool FrontEndControler::readInt(uint8_t pid, uint8_t cId, int32_t* val) { return true; } -bool FrontEndControler::echo(uint8_t tx, uint8_t* rx) { +bool UI::echo(uint8_t tx, uint8_t* rx) { zlock_guard lg(m_cmdlock); startReceiveAck(); @@ -352,7 +339,7 @@ bool FrontEndControler::echo(uint8_t tx, uint8_t* rx) { return true; } -bool FrontEndControler::setTxt(uint8_t pid, uint8_t bid, const char* txt, ...) { +bool UI::setTxt(uint8_t pid, uint8_t bid, const char* txt, ...) { zlock_guard lg(m_cmdlock); va_list args; @@ -364,18 +351,18 @@ bool FrontEndControler::setTxt(uint8_t pid, uint8_t bid, const char* txt, ...) { sendcmd("p[%d].b[%d].txt=\"%s\"", pid, bid, buf); return true; } -bool FrontEndControler::setVal(uint8_t pid, uint8_t cid, int32_t val) { +bool UI::setVal(uint8_t pid, uint8_t cid, int32_t val) { zlock_guard lg(m_cmdlock); sendcmd("p[%d].b[%d].val=%d", pid, cid, val); return true; } -bool FrontEndControler::vis(uint16_t buuid, int32_t val) { +bool UI::vis(uint16_t buuid, int32_t val) { zlock_guard lg(m_cmdlock); sendcmd("vis %d,%d", buuid & 0xff, val); return true; } -void FrontEndControler::alert(const char* info, function onConfirm) { +void UI::alert(const char* info, function onConfirm) { zlock_guard lg(m_cmdlock); // if (m_isInPopWin) { // ZLOGE(TAG, "isInPopWin,alert failed"); @@ -390,7 +377,7 @@ void FrontEndControler::alert(const char* info, function onConfirm) // sendcmd("p[%d].b[%d].txt=\"%s\"", pg_alert, ob_alert_info, buf); // sendcmd("page alert"); } -void FrontEndControler::alertNoConfirm(const char* info) { +void UI::alertNoConfirm(const char* info) { zlock_guard lg(m_cmdlock); // if (m_isInPopWin) { // ZLOGE(TAG, "isInPopWin,alertNoConfirm failed"); @@ -406,7 +393,7 @@ void FrontEndControler::alertNoConfirm(const char* info) { // vis(ob_alert_confirmkey, 0); } -void FrontEndControler::confirmNoCancle(const char* info, function onConfirm) { +void UI::confirmNoCancle(const char* info, function onConfirm) { zlock_guard lg(m_cmdlock); // if (m_isInPopWin) { // ZLOGE(TAG, "isInPopWin,confirmNoCancle failed"); @@ -424,7 +411,7 @@ void FrontEndControler::confirmNoCancle(const char* info, function o // vis(ob_confirm_canclekey, 0); } -void FrontEndControler::confirm(const char* info, function onConfirm) { +void UI::confirm(const char* info, function onConfirm) { zlock_guard lg(m_cmdlock); // if (m_isInPopWin) { // ZLOGE(TAG, "isInPopWin,confirm failed"); @@ -441,9 +428,9 @@ void FrontEndControler::confirm(const char* info, function onConfirm // vis(ob_confirm_canclekey, 1); } -void FrontEndControler::chpage(uint8_t page) { sendcmd("page %d", page); } -// void FrontEndControler::bakpage() { sendcmd("page %d", m_lastPage); } -void FrontEndControler::sendcmd(const char* format, ...) { +void UI::chpage(uint8_t page) { sendcmd("page %d", page); } +// void UI::bakpage() { sendcmd("page %d", m_lastPage); } +void UI::sendcmd(const char* format, ...) { static char buf[128]; va_list args; va_start(args, format); @@ -469,26 +456,32 @@ void FrontEndControler::sendcmd(const char* format, ...) { } } -void FrontEndControler::startReceiveAck() { +void UI::startReceiveAck() { ackQueue.clear(); m_isWaitingForAck = true; } -void FrontEndControler::virtualClick(uint8_t pid, uint8_t bid, uint8_t event) { +void UI::virtualClick(uint8_t pid, uint8_t bid, uint8_t event) { zlock_guard lg(m_cmdlock); sendcmd("click b[%d],%d", bid, event); } -void FrontEndControler::setTouchEnableState(uint8_t bid, uint8_t enable) { +void UI::setTouchEnableState(uint8_t bid, uint8_t enable) { // tsw obj,state zlock_guard lg(m_cmdlock); sendcmd("tsw b[%d],%d", bid, enable); } -void FrontEndControler::setEnumComponentState(uint8_t pid, uint8_t bid, int32_t state) { +void UI::setEnumComponentState(uint8_t pid, uint8_t bid, int32_t state) { // 枚举类型使用动画组件 sendcmd("p[%d].b[%d].tim=%d", pid, bid, state * 50); } -void FrontEndControler::setPic(uint8_t pid, uint8_t bid, int32_t picNum) { sendcmd("p[%d].b[%d].pic=%d", pid, bid, picNum); } +void UI::setPic(uint8_t pid, uint8_t bid, int32_t picNum) { sendcmd("p[%d].b[%d].pic=%d", pid, bid, picNum); } + +void UI::setAph(uint8_t pid, uint8_t bid, int32_t state) { sendcmd("p[%d].b[%d].aph=%d", pid, bid, state); } + +void UI::pageInit() { UIPageInit(); } -void FrontEndControler::setAph(uint8_t pid, uint8_t bid, int32_t state) { sendcmd("p[%d].b[%d].aph=%d", pid, bid, state); } +namespace iflytop { +__weak void UIPageInit() {} +} // namespace iflytop diff --git a/usrc/uicontroler/front_end_controler.hpp b/usrc/uicontroler/front_end_controler.hpp index e627dfe..1e0ba09 100644 --- a/usrc/uicontroler/front_end_controler.hpp +++ b/usrc/uicontroler/front_end_controler.hpp @@ -12,42 +12,32 @@ typedef struct { uint16_t datalen; } tjc_rx_packet_t; -typedef std::function on_usr_event_cb_t; -#define UIS FrontEndControler::ins() -class FrontEndControler { +#define UIS UI::ins() +class UI { ZThread m_thread; tjc_rx_packet_t ackcache; - zmutex m_cmdlock = {"FrontEndControler_LOCK"}; + zmutex m_cmdlock = {"UI_LOCK"}; + tjc::UIEvent event_cache; - tjc::tjc_usr_event_t event_cache; - - // on_usr_event_cb_t cb; - - on_usr_event_cb_t m_cb[50]; - int32_t m_ncb = 0; - int32_t m_nowPage = 0; int32_t m_lastPage = 0; - function m_onConfirmPageConfirmKey; - function m_onAlertPageConfirmKey; - public: - FrontEndControler() {}; - ~FrontEndControler() {}; + UI() {}; + ~UI() {}; - static FrontEndControler* ins() { - static FrontEndControler instance; + static UI* ins() { + static UI instance; return &instance; } void initialize(); - void regOnUsrEventCb(on_usr_event_cb_t onclik); + void pageInit(); int getNowPage() { return m_nowPage; } void startSchedule(); @@ -96,7 +86,7 @@ class FrontEndControler { void startReceiveAck(); - void callUsrEventCb(tjc::tjc_usr_event_t* event); + void callUsrEventCb(tjc::UIEvent* event); }; static inline const char* zitoa(int val) { @@ -119,4 +109,6 @@ static inline const char* refmt(const char* fmt, const char* floatval) { return buf; } +__weak void UIPageInit(); + } // namespace iflytop diff --git a/usrc/uicontroler/page/UIPageInit.cpp b/usrc/uicontroler/page/UIPageInit.cpp new file mode 100644 index 0000000..763a16c --- /dev/null +++ b/usrc/uicontroler/page/UIPageInit.cpp @@ -0,0 +1,13 @@ +#include "uappbase/base.hpp" +#define TAG "UIPageInit" + +namespace iflytop { + +extern void PageLoginInit(); + +// void UIPageInit() { +// ZLOGI(TAG, "UIPageInit"); +// PageLoginInit(); +// } + +} // namespace iflytop \ No newline at end of file diff --git a/usrc/uicontroler/page/initializer/PageInitializer.cpp b/usrc/uicontroler/page/initializer/PageInitializer.cpp index 4ec57da..fc820a9 100644 --- a/usrc/uicontroler/page/initializer/PageInitializer.cpp +++ b/usrc/uicontroler/page/initializer/PageInitializer.cpp @@ -1,10 +1,8 @@ -#pragma once #include "uicontroler/base/page_processer.hpp" namespace iflytop { using namespace std; - } // namespace iflytop // kpt_sys_event_page_id \ No newline at end of file diff --git a/usrc/uicontroler/page/login/login_page.cpp b/usrc/uicontroler/page/login/login_page.cpp new file mode 100644 index 0000000..08a67f0 --- /dev/null +++ b/usrc/uicontroler/page/login/login_page.cpp @@ -0,0 +1,71 @@ + +#include "db/dao/user_dao.hpp" +#include "ui/ui.h" +#include "uicontroler/base/page_processer.hpp" +namespace iflytop { +using namespace std; +#define TAG "LoginPage" + +class LoginPage : public IPageProcesser { + private: + char userName[20] = {0}; + char passwd[20] = {0}; + + public: + LoginPage() : IPageProcesser(TAG, pg_login) {} + + virtual void initialize() override { + IPageProcesser::initialize(); + + UIS->setTxt(pageId, ob_login_uName, ""); // 用户名 + UIS->setTxt(pageId, ob_login_uNameEMsg, ""); // 用户名错误信息 + UIS->setTxt(pageId, ob_login_pwd, ""); // 密码 + UIS->setTxt(pageId, ob_login_pwdEMsg, ""); // 密码错误信息 + } + + private: + virtual void OnPageLoad(OnPageLoadContext* cxt) override {} + virtual void OnBackKey(OnPageLoadContext* cxt) override {} + virtual void OnInputFieldContentChange(uint8_t bid, const char* text) override { + if (bid == ob_login_uName) { + UIS->setTxt(pageId, ob_login_uName, text); // + strcpy(userName, text); // + UIS->setTxt(pageId, ob_login_pwdEMsg, ""); // + UIS->setTxt(pageId, ob_login_uNameEMsg, ""); // + } else if (bid == ob_login_pwd) { + UIS->setTxt(pageId, ob_login_pwd, text); // + strcpy(passwd, text); // + UIS->setTxt(pageId, ob_login_pwdEMsg, ""); // + UIS->setTxt(pageId, ob_login_pwdEMsg, ""); // + } + } + virtual void OnButton(uint8_t bid, uint8_t val) override { + if (bid == ob_login_blogin) { + user_t* user = UserDao::getUserByName(userName); + if (user == nullptr) { + UIS->setTxt(pageId, ob_login_uNameEMsg, "用户名不存在"); + return; + } + + if (strcmp(user->passwd, passwd) != 0) { + UIS->setTxt(pageId, ob_login_pwdEMsg, "密码错误"); + return; + } + + ZLOGI(TAG, "login %s success", userName); + + AppEventBus::ins()->pushSimpleEvent(kAE_LoginEvent); + UI::ins()->chpage(pg_main); + } + } + virtual void OnDoubleStateButton(uint8_t bid, uint8_t val) override {} + virtual void OnAppEvent(AppEvent_t* event) override {} + + private: +}; + +// 实例化LoginPage, 使其自动注册 +static LoginPage instance; +} // namespace iflytop + +// kpt_sys_event_page_id diff --git a/usrc/uicontroler/page/login/page_login.cpp b/usrc/uicontroler/page/login/page_login.cpp deleted file mode 100644 index c1e3515..0000000 --- a/usrc/uicontroler/page/login/page_login.cpp +++ /dev/null @@ -1,75 +0,0 @@ - -#include "db/dao/user_dao.hpp" -#include "ui/ui.h" -#include "uicontroler/base/page_processer.hpp" -namespace iflytop { -using namespace std; -#define TAG "PageLogin" - -class PageLogin : public IPageProcesser { - private: - /* data */ - - PageLogin() : IPageProcesser(pg_login) {} - - char userName[20] = {0}; - char passwd[20] = {0}; - - public: - static PageLogin* ins() { - static PageLogin instance; - return &instance; - } - - virtual void initialize() override { - IPageProcesser::initialize(); - - UIS->setTxt(pageId, ob_login_uName, ""); // 用户名 - UIS->setTxt(pageId, ob_login_uNameEMsg, ""); // 用户名错误信息 - UIS->setTxt(pageId, ob_login_pwd, ""); // 密码 - UIS->setTxt(pageId, ob_login_pwdEMsg, ""); // 密码错误信息 - } - - private: - virtual void OnPageLoad(OnPageLoadContext* cxt) override {} - virtual void OnBackKey(OnPageLoadContext* cxt) override {} - virtual void OnInputFieldContentChange(uint8_t bid, const char* text) override { - if (bid == ob_login_uName) { - UIS->setTxt(pageId, ob_login_uName, text); // - strcpy(userName, text); // - UIS->setTxt(pageId, ob_login_pwdEMsg, ""); // - UIS->setTxt(pageId, ob_login_uNameEMsg, ""); // - } else if (bid == ob_login_pwd) { - UIS->setTxt(pageId, ob_login_pwd, text); // - strcpy(passwd, text); // - UIS->setTxt(pageId, ob_login_pwdEMsg, ""); // - UIS->setTxt(pageId, ob_login_pwdEMsg, ""); // - } - } - virtual void OnButton(uint8_t bid, uint8_t val) override { - if (bid == ob_login_blogin) { - user_t* user = UserDao::getUserByName(userName); - if (user == nullptr) { - UIS->setTxt(pageId, ob_login_uNameEMsg, "用户名不存在"); - return; - } - - if (strcmp(user->passwd, passwd) != 0) { - UIS->setTxt(pageId, ob_login_pwdEMsg, "密码错误"); - return; - } - - ZLOGI(TAG, "login %s success", userName); - } - } - virtual void OnDoubleStateButton(uint8_t bid, uint8_t val) override {} - virtual void OnAppEvent(AppEvent_t* event) override {} - - private: -}; - -void PageLoginInit() { PageLogin::ins()->initialize(); } - -} // namespace iflytop - -// kpt_sys_event_page_id diff --git a/usrc/uicontroler/page/page.hpp b/usrc/uicontroler/page/page.hpp deleted file mode 100644 index 654615e..0000000 --- a/usrc/uicontroler/page/page.hpp +++ /dev/null @@ -1,8 +0,0 @@ -#pragma once - -namespace iflytop { -void PageLoginInit(); - -static inline void PageInit() { PageLoginInit(); } - -} // namespace iflytop \ No newline at end of file diff --git a/usrc/uicontroler/tjc/tjc_constant.hpp b/usrc/uicontroler/tjc/tjc_constant.hpp index 6309006..b3272c9 100644 --- a/usrc/uicontroler/tjc/tjc_constant.hpp +++ b/usrc/uicontroler/tjc/tjc_constant.hpp @@ -107,7 +107,7 @@ typedef struct { } button_event; } d; -} tjc_usr_event_t; +} UIEvent; typedef enum { k_button_release_event = 1,