From 0e61d04088f6e83448f0b49cd5ce3dd577b066d2 Mon Sep 17 00:00:00 2001 From: zhaohe Date: Wed, 20 Nov 2024 14:56:40 +0800 Subject: [PATCH] update --- usrc/service/app_core.cpp | 12 +- usrc/service/remote_controler_event_processer.cpp | 2 +- usrc/uicontroler/base/page_processer.hpp | 2 +- usrc/uicontroler/base/ui_public_state.cpp | 0 usrc/uicontroler/base/ui_public_state.hpp | 14 + usrc/uicontroler/front_end_controler.cpp | 508 --------------------- usrc/uicontroler/front_end_controler.hpp | 112 ----- usrc/uicontroler/page/PageInitializer.cpp | 8 + usrc/uicontroler/page/UIPageInit.cpp | 13 - usrc/uicontroler/page/home/home_page.cpp | 173 ------- usrc/uicontroler/page/home_page.cpp | 182 ++++++++ .../page/initializer/PageInitializer.cpp | 8 - usrc/uicontroler/page/login/login_page.cpp | 74 --- usrc/uicontroler/page/login_page.cpp | 74 +++ usrc/uicontroler/page/navi_page.cpp | 38 ++ usrc/uicontroler/pagerouter/page_bak_router.hpp | 2 +- usrc/uicontroler/ui_controler.cpp | 508 +++++++++++++++++++++ usrc/uicontroler/ui_controler.hpp | 112 +++++ 18 files changed, 945 insertions(+), 897 deletions(-) create mode 100644 usrc/uicontroler/base/ui_public_state.cpp create mode 100644 usrc/uicontroler/base/ui_public_state.hpp delete mode 100644 usrc/uicontroler/front_end_controler.cpp delete mode 100644 usrc/uicontroler/front_end_controler.hpp create mode 100644 usrc/uicontroler/page/PageInitializer.cpp delete mode 100644 usrc/uicontroler/page/UIPageInit.cpp delete mode 100644 usrc/uicontroler/page/home/home_page.cpp create mode 100644 usrc/uicontroler/page/home_page.cpp delete mode 100644 usrc/uicontroler/page/initializer/PageInitializer.cpp delete mode 100644 usrc/uicontroler/page/login/login_page.cpp create mode 100644 usrc/uicontroler/page/login_page.cpp create mode 100644 usrc/uicontroler/page/navi_page.cpp create mode 100644 usrc/uicontroler/ui_controler.cpp create mode 100644 usrc/uicontroler/ui_controler.hpp diff --git a/usrc/service/app_core.cpp b/usrc/service/app_core.cpp index 8707894..82dc5b1 100644 --- a/usrc/service/app_core.cpp +++ b/usrc/service/app_core.cpp @@ -11,7 +11,7 @@ // #include "ucomponents/zcan/zcan.hpp" // -#include "uicontroler/front_end_controler.hpp" +#include "uicontroler/ui_controler.hpp" // #include "uicontroler/page/page.hpp" // @@ -101,11 +101,11 @@ void AppCore::initialize() { DeviceSettingDao::init(); ZLOGI(TAG, "load zhdb end"); - UI::ins()->initialize(); - UI::ins()->startSchedule(); - UI::ins()->pageInit(); - // UI::ins()->chpage(pg_login); - UI::ins()->chpage(pg_home); + UIControler::ins()->initialize(); + UIControler::ins()->startSchedule(); + UIControler::ins()->pageInit(); + // UIControler::ins()->chpage(pg_login); + UIControler::ins()->chpage(pg_navi); diff --git a/usrc/service/remote_controler_event_processer.cpp b/usrc/service/remote_controler_event_processer.cpp index 7be744e..4be7491 100644 --- a/usrc/service/remote_controler_event_processer.cpp +++ b/usrc/service/remote_controler_event_processer.cpp @@ -5,7 +5,7 @@ #include "service/remote_controler.hpp" // -#include "uicontroler/front_end_controler.hpp" +#include "uicontroler/ui_controler.hpp" using namespace iflytop; #define TAG "RemoteControlerEventProcesser" diff --git a/usrc/uicontroler/base/page_processer.hpp b/usrc/uicontroler/base/page_processer.hpp index a02cd65..7b0d3dd 100644 --- a/usrc/uicontroler/base/page_processer.hpp +++ b/usrc/uicontroler/base/page_processer.hpp @@ -4,7 +4,7 @@ #include "config/config.hpp" #include "uappbase/base.hpp" #include "ui/ui.h" -#include "uicontroler/front_end_controler.hpp" +#include "uicontroler/ui_controler.hpp" #include "uicontroler/pagerouter/page_bak_router.hpp" namespace iflytop { using namespace std; diff --git a/usrc/uicontroler/base/ui_public_state.cpp b/usrc/uicontroler/base/ui_public_state.cpp new file mode 100644 index 0000000..e69de29 diff --git a/usrc/uicontroler/base/ui_public_state.hpp b/usrc/uicontroler/base/ui_public_state.hpp new file mode 100644 index 0000000..e138b22 --- /dev/null +++ b/usrc/uicontroler/base/ui_public_state.hpp @@ -0,0 +1,14 @@ +#pragma once + +#include "uappbase/base.hpp" +#include "uicontroler/ui_controler.hpp" +namespace iflytop { + +class UIPublicState { + private: + /* data */ + public: + +}; + +} // namespace iflytop \ No newline at end of file diff --git a/usrc/uicontroler/front_end_controler.cpp b/usrc/uicontroler/front_end_controler.cpp deleted file mode 100644 index 4b16da4..0000000 --- a/usrc/uicontroler/front_end_controler.cpp +++ /dev/null @@ -1,508 +0,0 @@ -#include "front_end_controler.hpp" - -#include -#include -#include -#include - -#include "tjc/tjc_constant.hpp" -using namespace iflytop; -#define TAG "UIScheduler" -#define MODULE_DEBUG 1 - -#define CMD_OVERTIME 50 - -static ZThread uart_rx_thread; -static ZThread rx_processed_thread; - -static ZQueue ackQueue; -static ZQueue eventQueue; -static ZThread usartRxThread; -static ZThread eventProcessThread; -static bool m_isWaitingForAck; -static UART_HandleTypeDef* tjcUart; - -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 UI::initialize() { // - ackQueue.initialize(5, sizeof(tjc_rx_packet_t)); - eventQueue.initialize(5, sizeof(tjc_rx_packet_t)); - usartRxThread.init("usartRxThread", 1024); - eventProcessThread.init("eventProcessThread", 1024); - - tjcUart = AppHardware::ins()->tjcUart; - m_cmdlock.init(); -} -#define UART_RX_OVERTIME 5 -void UI::startSchedule() { - usartRxThread.start([this]() { - static uint8_t rxbuf[128]; - tjcUart->USR_UartITRxing = 1; - 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]; - int32_t rxsize = 0; - if (tjcUart->USR_UartITRxOff != 0 && zos_haspassedms(tjcUart->USR_UartITLastRxTicket) > UART_RX_OVERTIME) { - vPortEnterCritical(); - if (tjcUart->USR_UartITRxOff != 0 && zos_haspassedms(tjcUart->USR_UartITLastRxTicket) > UART_RX_OVERTIME) { - memcpy(processbuf, tjcUart->USR_UartITRxBuf, tjcUart->USR_UartITRxOff); - rxsize = tjcUart->USR_UartITRxOff; - tjcUart->USR_UartITRxOff = 0; - } - vPortExitCritical(); - } - - if (rxsize != 0) { - processScreenRxPacket(processbuf, rxsize); - } - osDelay(1); - } - }); - - eventProcessThread.start([this]() { - while (1) { - static tjc_rx_packet_t packet; - bool suc = eventQueue.receive(&packet, 10); - if (suc) { - uint8_t packetType = packet.data[0]; - memset(&event_cache, 0, sizeof(event_cache)); - - if (packetType == tjc::kpt_inputfield_content_change_event1) { - processInputfieldContentChangeEvent1(packet.data, packet.datalen); - } else if (packetType == tjc::kpt_double_state_button_event) { - processUsrDoubleStateButtonEvent(packet.data, packet.datalen); - } else if (tjc::kpt_button_event == packetType) { - event_cache.eventId = packet.data[0]; - event_cache.pid = packet.data[1]; - event_cache.bid = packet.data[2]; - event_cache.d.button_event.val = packet.data[3]; - callUsrEventCb(&event_cache); - } else if (tjc::kpt_sys_event_page_id == packetType) { - event_cache.eventId = packet.data[0]; - event_cache.pid = packet.data[1]; - event_cache.bid = 0; - - if (m_nowPage == packet.data[1]) { - // page not change - } else { - m_lastPage = m_nowPage; - m_nowPage = packet.data[1]; - } -#if MODULE_DEBUG - ZLOGD(TAG, "page change from %d to %d ", m_lastPage, m_nowPage); -#endif - - callUsrEventCb(&event_cache); - - } else { - event_cache.eventId = packet.data[0]; - callUsrEventCb(&event_cache); - ZLOGI(TAG, "[eventprocess-thread]: rx_event:%s", tjc::pt2str(packetType)); - } - } - osDelay(1); - } - }); -} - -void UI::processScreenRxPacket(uint8_t* data, size_t len) { - // 判断包是否合法 -#if MODULE_DEBUG - ZLOGI(TAG, "[rx-thread] : rx :%s(%d)", zhex2str(data, len), len); -#endif - - if (!(data[len - 1] == 0xff && data[len - 2] == 0xff && data[len - 3] == 0xff)) { - ZLOGI(TAG, "rx invalid packet %s", zhex2str(data, len)); - return; - } - if (TJC_MAX_PACKET_SIZE < len) { - ZLOGI(TAG, "rx invalid packet(tool long) %s", zhex2str(data, len)); - return; - } - - uint8_t packetType = data[0]; - - static tjc_rx_packet_t packet; - packet.datalen = len; - memcpy(packet.data, data, len); - if (tjc::kpt_ack == packetType) { - if (m_isWaitingForAck) { - bool suc = ackQueue.send(&packet, 10); - if (!suc) { - ZLOGI(TAG, "ackQueue send failed"); - } - m_isWaitingForAck = false; - } - - } else { - bool suc = eventQueue.send(&packet, 10); - if (!suc) { - ZLOGI(TAG, "eventQueue send failed"); - } - } -} - -static const char* zcpystr(char* cpyto, const char* strbegin, int32_t maxlen) { - if (strbegin == NULL) return NULL; - int32_t i = 0; - for (i = 0; i < maxlen; i++) { - cpyto[i] = strbegin[i]; - if (strbegin[i] == 0) { - return &strbegin[i + 1]; - } - } - return NULL; -} -void UI::processUsrButtonEvent(uint8_t* data, size_t len) { - /** - * @brief - * 指令格式: - * printh 65 - * prints dp,1 - * prints '&id&',1 - * printh FF FF FF - * - * AB Page cidName/0 FF FF FF - * - */ - // ButtonEventContext_t buttonEventCxt; - - // event_cache - memset(&event_cache, 0, sizeof(event_cache)); - event_cache.eventId = data[0]; - event_cache.pid = data[1]; - event_cache.bid = data[2]; - - callUsrEventCb(&event_cache); -} -void UI::processUsrDoubleStateButtonEvent(uint8_t* data, size_t len) { - /** - * @brief - * 指令格式: - * printh AD - * prints dp,1 - * prints '&id&',1 - * prints '&val&',1 - * printh FF FF FF - * - * AB Page cidName/0 FF FF FF - * - */ - // ButtonEventContext_t buttonEventCxt; - - // event_cache - memset(&event_cache, 0, sizeof(event_cache)); - event_cache.eventId = data[0]; - event_cache.pid = data[1]; - event_cache.bid = data[2]; - event_cache.d.double_state_button.val = data[3]; - - callUsrEventCb(&event_cache); -} -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 UI::processInputfieldContentChangeEvent0(uint8_t* data, size_t len) { - /** - * @brief - * - * printh AB - * prints loadpageid.val,1 - * prints loadcmpid.val,1 - * prints p[loadpageid.val].b[loadcmpid.val].txt,0 - * printh 00 - * printh FF FF FF - * page loadpageid.val - * - */ - ZLOGI(TAG, "processInputfieldContentChangeEvent0"); - memset(&event_cache, 0, sizeof(event_cache)); - event_cache.eventId = data[0]; - event_cache.pid = data[1]; - event_cache.bid = data[2]; - const char* strbegin = (const char*)&data[3]; - strbegin = zcpystr(event_cache.d.inputfield_content.text, strbegin, sizeof(event_cache.d.inputfield_content.text)); - callUsrEventCb(&event_cache); -} - -void UI::processInputfieldContentChangeEvent1(uint8_t* data, size_t len) { - /** - * @brief - * - * printh AC - * prints loadpageid.val,1 - * prints loadcmpid.val,1 - * prints p[loadpageid.val].b[loadcmpid.val].txt,0 - * printh 00 - * printh FF FF FF - * page loadpageid.val - * - */ - // ZLOGI(TAG, "processInputfieldContentChangeEvent1"); - memset(&event_cache, 0, sizeof(event_cache)); - event_cache.eventId = data[0]; - event_cache.pid = data[1]; - event_cache.bid = data[2]; - const char* strbegin = (const char*)&data[3]; - strbegin = zcpystr(event_cache.d.inputfield_content.text, strbegin, sizeof(event_cache.d.inputfield_content.text)); - - ZLOGD(TAG, "on InputfieldContentChange pid:%d bid:%d content:%s", event_cache.pid, event_cache.bid, event_cache.d.inputfield_content.text); - - callUsrEventCb(&event_cache); -} - -bool UI::readTxt(uint8_t pid, uint8_t cId, char* txt, int32_t txtbuflen) { - zlock_guard lg(m_cmdlock); - - startReceiveAck(); - sendcmd("com_stop"); - sendcmd("printh AA"); - sendcmd("prints p[%d].b[%d].txt,0", pid, cId); - sendcmd("printh 00"); - sendcmd("printh FF FF FF"); - sendcmd("com_start"); - - bool suc = ackQueue.receive(&ackcache, CMD_OVERTIME); - if (!suc) { - ZLOGI(TAG, "readTxt failed"); - return false; - } - int32_t cpysize = ackcache.datalen - 3; - if (cpysize > txtbuflen) { - cpysize = txtbuflen - 1; - } - - memcpy(txt, &ackcache.data[1], cpysize); - return true; -} -bool UI::readInt(uint8_t pid, uint8_t cId, int32_t* val) { - zlock_guard lg(m_cmdlock); - - startReceiveAck(); - sendcmd("com_stop"); - sendcmd("printh AA"); - sendcmd("prints p[%d].b[%d].val,4", pid, cId); - sendcmd("printh FF FF FF"); - sendcmd("com_start"); - - bool suc = ackQueue.receive(&ackcache, CMD_OVERTIME); - if (!suc) { - ZLOGI(TAG, "readTxt failed"); - return false; - } - - uint8_t int32val[4] = {0}; - memcpy(int32val, &ackcache.data[1], 4); - *val = *(int32_t*)int32val; - return true; -} - -bool UI::echo(uint8_t tx, uint8_t* rx) { - zlock_guard lg(m_cmdlock); - - startReceiveAck(); - sendcmd("com_stop"); - sendcmd("printh AA"); - sendcmd("printh %02X", tx); - sendcmd("printh FF FF FF"); - sendcmd("com_start"); - - bool suc = ackQueue.receive(&ackcache, CMD_OVERTIME); - if (!suc) { - ZLOGI(TAG, "readTxt failed"); - return false; - } - - uint8_t int32val = 0; - memcpy(&int32val, &ackcache.data[1], 1); - *rx = int32val; - - if (tx != int32val) { - return false; - } - - return true; -} - -bool UI::setTxt(uint8_t pid, uint8_t bid, const char* txt, ...) { - zlock_guard lg(m_cmdlock); - - va_list args; - va_start(args, txt); - static char buf[128]; - vsprintf(buf, txt, args); - va_end(args); - - sendcmd("p[%d].b[%d].txt=\"%s\"", pid, bid, buf); - return true; -} - -void UI::setPicturePicNum(uint8_t pid, uint8_t bid, uint8_t fromBid) { - zlock_guard lg(m_cmdlock); - sendcmd("p[%d].b[%d].pic=p[%d].b[%d].pic", pid, bid, pid, fromBid); -} -void UI::setButtonPicNum(uint8_t pid, uint8_t bid, uint8_t fromBid) { - zlock_guard lg(m_cmdlock); - sendcmd("p[%d].b[%d].pic=p[%d].b[%d].pic", pid, bid, pid, fromBid); - sendcmd("p[%d].b[%d].pic2=p[%d].b[%d].pic2", pid, bid, pid, fromBid); -} - -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 UI::vis(uint16_t buuid, int32_t val) { - zlock_guard lg(m_cmdlock); - sendcmd("vis %d,%d", buuid & 0xff, val); - return true; -} - -void UI::setrtc(zdate_t* date) { - zlock_guard lg(m_cmdlock); - sendcmd("rtc0=%d", date->year); - sendcmd("rtc1=%d", date->month); - sendcmd("rtc2=%d", date->day); - sendcmd("rtc3=%d", date->hours); - sendcmd("rtc4=%d", date->minutes); - sendcmd("rtc5=%d", date->seconds); -} - -void UI::alert(const char* info, function onConfirm) { - zlock_guard lg(m_cmdlock); - // if (m_isInPopWin) { - // ZLOGE(TAG, "isInPopWin,alert failed"); - // return; - // } - - // m_onAlertPageConfirmKey = onConfirm; - // static char buf[128]; - // sprintf(buf, "%s", info); - - // sendcmd("p[%d].b[%d].val=%d", pg_alert, ob_alert_frompage, m_nowPage); - // sendcmd("p[%d].b[%d].txt=\"%s\"", pg_alert, ob_alert_info, buf); - // sendcmd("page alert"); -} -void UI::alertNoConfirm(const char* info) { - zlock_guard lg(m_cmdlock); - // if (m_isInPopWin) { - // ZLOGE(TAG, "isInPopWin,alertNoConfirm failed"); - // return; - // } - - // static char buf[128]; - // sprintf(buf, "%s", info); - - // sendcmd("p[%d].b[%d].val=dp", pg_alert, ob_alert_frompage); - // sendcmd("p[%d].b[%d].txt=\"%s\"", pg_alert, ob_alert_info, buf); - // sendcmd("page alert"); - // vis(ob_alert_confirmkey, 0); -} - -void UI::confirmNoCancle(const char* info, function onConfirm) { - zlock_guard lg(m_cmdlock); - // if (m_isInPopWin) { - // ZLOGE(TAG, "isInPopWin,confirmNoCancle failed"); - // return; - // } - - // m_onConfirmPageConfirmKey = onConfirm; - - // static char buf[128]; - // sprintf(buf, "%s", info); - - // sendcmd("p[%d].b[%d].val=dp", pg_confirm, ob_confirm_frompage); - // sendcmd("p[%d].b[%d].txt=\"%s\"", pg_confirm, ob_confirm_info, buf); - // sendcmd("page confirm"); - // vis(ob_confirm_canclekey, 0); -} - -void UI::confirm(const char* info, function onConfirm) { - zlock_guard lg(m_cmdlock); - // if (m_isInPopWin) { - // ZLOGE(TAG, "isInPopWin,confirm failed"); - // return; - // } - - // m_onConfirmPageConfirmKey = onConfirm; - // static char buf[128]; - // sprintf(buf, "%s", info); - - // sendcmd("p[%d].b[%d].val=dp", pg_confirm, ob_confirm_frompage); - // sendcmd("p[%d].b[%d].txt=\"%s\"", pg_confirm, ob_confirm_info, buf); - // sendcmd("page confirm"); - // vis(ob_confirm_canclekey, 1); -} - -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); - vsprintf(buf, format, args); - va_end(args); - - uint8_t len = strlen(buf); - if (len > (128 - 3)) { - ZLOGI(TAG, "sendcmd too long"); - return; - } - - buf[len] = 0xff; - buf[len + 1] = 0xff; - buf[len + 2] = 0xff; - - HAL_UART_Transmit(tjcUart, (uint8_t*)buf, len + 3, 100); - while (true) { - osDelay(1); - if (tjcUart->gState == HAL_UART_STATE_READY) { - return; - } - } -} - -void UI::startReceiveAck() { - ackQueue.clear(); - m_isWaitingForAck = true; -} - -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 UI::setTouchEnableState(uint8_t bid, uint8_t enable) { - // tsw obj,state - zlock_guard lg(m_cmdlock); - sendcmd("tsw b[%d],%d", bid, enable); -} - -void UI::setEnumComponentState(uint8_t pid, uint8_t bid, int32_t state) { - // 枚举类型使用动画组件 - sendcmd("p[%d].b[%d].tim=%d", pid, bid, state * 50); -} -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(); } - -namespace iflytop { -__weak void UIPageInit() {} -} // namespace iflytop diff --git a/usrc/uicontroler/front_end_controler.hpp b/usrc/uicontroler/front_end_controler.hpp deleted file mode 100644 index 8d220e9..0000000 --- a/usrc/uicontroler/front_end_controler.hpp +++ /dev/null @@ -1,112 +0,0 @@ -#pragma once -#include "apphardware/apphardware.hpp" -#include "config/config.hpp" -#include "uappbase/base.hpp" -// -#include "tjc/tjc.hpp" - -namespace iflytop { -using namespace std; -typedef struct { - uint8_t data[TJC_MAX_PACKET_SIZE]; - uint16_t datalen; -} tjc_rx_packet_t; - -#define UIS UI::ins() -class UI { - ZThread m_thread; - - tjc_rx_packet_t ackcache; - zmutex m_cmdlock = {"UI_LOCK"}; - - tjc::UIEvent event_cache; - - int32_t m_nowPage = 0; - int32_t m_lastPage = 0; - - public: - UI() {}; - ~UI() {}; - - static UI* ins() { - static UI instance; - return &instance; - } - - void initialize(); - void pageInit(); - int getNowPage() { return m_nowPage; } - - void startSchedule(); - - // cmd list - bool readTxt(uint8_t pid, uint8_t bid, char* txt, int32_t txtbuflen); - bool readInt(uint8_t pid, uint8_t bid, int32_t* val); - bool echo(uint8_t tx, uint8_t* rx); - - bool setTxt(uint8_t pid, uint8_t bid, const char* txt, ...); - - void setPicturePicNum(uint8_t pid, uint8_t bid, uint8_t fromBid); - void setButtonPicNum(uint8_t pid, uint8_t bid, uint8_t fromBid); - - - bool setVal(uint8_t pid, uint8_t bid, int32_t val); - bool vis(uint16_t bid, int32_t val); // 不支持跨页面隐藏 - // vis b0,0 - - - void alert(const char* info) { alert(info, nullptr); } - void alertNoConfirm(const char* info); - void alert(const char* info, function onConfirm); - void confirmNoCancle(const char* info) { confirmNoCancle(info, nullptr); } - void confirmNoCancle(const char* info, function onConfirm); - void confirm(const char* info, function onConfirm); - - void chpage(uint8_t page); - void setrtc(zdate_t* date); - - // void bakpage(); - void virtualClick(uint8_t pid, uint8_t bid, uint8_t event); - void setTouchEnableState(uint8_t bid, uint8_t enable); - - void setEnumComponentState(uint8_t pid, uint8_t bid, int32_t state); - void setPic(uint8_t pid, uint8_t bid, int32_t picNum); - - void setAph(uint8_t pid, uint8_t bid, int32_t state); // 组件透明度,最大127,设置为0则隐藏组件 - void sendcmd(const char* format, ...); - - private: - void processScreenRxPacket(uint8_t* data, size_t len); - void processUsrButtonEvent(uint8_t* data, size_t len); - void processInputfieldContentChangeEvent1(uint8_t* data, size_t len); - void processInputfieldContentChangeEvent0(uint8_t* data, size_t len); - void processUsrDoubleStateButtonEvent(uint8_t* data, size_t len); - - void startReceiveAck(); - - void callUsrEventCb(tjc::UIEvent* event); -}; - -static inline const char* zitoa(int val) { - static char buf[32]; - sprintf(buf, "%d", val); - return buf; -} -static inline const char* zfmt(const char* fmt, ...) { - static char buf[128]; - va_list args; - va_start(args, fmt); - vsnprintf(buf, sizeof(buf), fmt, args); - va_end(args); - return buf; -} - -static inline const char* refmt(const char* fmt, const char* floatval) { - static char buf[128]; - sprintf(buf, fmt, atof(floatval)); - return buf; -} - -__weak void UIPageInit(); - -} // namespace iflytop diff --git a/usrc/uicontroler/page/PageInitializer.cpp b/usrc/uicontroler/page/PageInitializer.cpp new file mode 100644 index 0000000..fc820a9 --- /dev/null +++ b/usrc/uicontroler/page/PageInitializer.cpp @@ -0,0 +1,8 @@ +#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/UIPageInit.cpp b/usrc/uicontroler/page/UIPageInit.cpp deleted file mode 100644 index 763a16c..0000000 --- a/usrc/uicontroler/page/UIPageInit.cpp +++ /dev/null @@ -1,13 +0,0 @@ -#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/home/home_page.cpp b/usrc/uicontroler/page/home/home_page.cpp deleted file mode 100644 index bf6d39d..0000000 --- a/usrc/uicontroler/page/home/home_page.cpp +++ /dev/null @@ -1,173 +0,0 @@ - -#include "db/dao/user_dao.hpp" -#include "uappbase/apphal/apphal.hpp" -#include "ui/ui.h" -#include "uicontroler/base/page_processer.hpp" -// -#include "db/dao/acid_ch_cfg_dao.hpp" -#include "db/dao/device_setting_dao.hpp" - -namespace iflytop { -using namespace std; -#define TAG "HomePage" - -class HomePage : public IPageProcesser { - private: - char userName[20] = {0}; - char passwd[20] = {0}; - - public: - HomePage() : IPageProcesser(TAG, pg_home) {} - - virtual void initialize() override { - IPageProcesser::initialize(); - syncState(); - } - - private: - virtual void OnPageLoad(OnPageLoadContext* cxt) override { - ZLOGI(TAG, "OnPageLoad"); - UI::ins()->vis(ob_home_AcidState, 0); // 隐藏酸液桶状态 - UIS->setTouchEnableState(ob_home_acidname0, 0); - UIS->setTouchEnableState(ob_home_acidname1, 0); - UIS->setTouchEnableState(ob_home_acidname2, 0); - UIS->setTouchEnableState(ob_home_acidname3, 0); - UIS->setTouchEnableState(ob_home_RunModeVal, 0); - syncState(); - } - virtual void OnBackKey(OnPageLoadContext* cxt) override {} - virtual void OnInputFieldContentChange(uint8_t bid, const char* text) override { - if (bid == ob_home_acideval0) { - AcidChCfgDao::updateAcidEachDistriVal(0, atof(text)); - } else if (bid == ob_home_acideval1) { - AcidChCfgDao::updateAcidEachDistriVal(1, atof(text)); - } else if (bid == ob_home_acideval2) { - AcidChCfgDao::updateAcidEachDistriVal(2, atof(text)); - } else if (bid == ob_home_acideval3) { - AcidChCfgDao::updateAcidEachDistriVal(3, atof(text)); - } else if (bid == ob_home_RunModeVal) { - DeviceSettingDao::updatedistrIntervalS(atof(text)); - } - } - virtual void OnButton(uint8_t bid, uint8_t val) override { - ZLOGI(TAG, "OnButton bid:%d val:%d", bid, val); - if (bid == ob_home_SelCH0) { - setPumpSelectState(0, !GStateMgr::ins()->getPumpSelectState(0)); - } else if (bid == ob_home_SelCH1) { - setPumpSelectState(1, !GStateMgr::ins()->getPumpSelectState(1)); - } else if (bid == ob_home_SelCH2) { - setPumpSelectState(2, !GStateMgr::ins()->getPumpSelectState(2)); - } else if (bid == ob_home_SelCH3) { - setPumpSelectState(3, !GStateMgr::ins()->getPumpSelectState(3)); - } - } - virtual void OnDoubleStateButton(uint8_t bid, uint8_t val) override {} - virtual void OnAppEvent(AppEvent_t* event) override { - if (event->type == kAE_RemoterConnectedEvent) { - syncBleState(); // 同步蓝牙状态 - UIS->setTxt(pageId, ob_home_sysInfo, "连接上手柄"); - } else if (event->type == kAE_RemoterDisConnectedEvent) { - syncBleState(); // 同步蓝牙状态 - UIS->setTxt(pageId, ob_home_sysInfo, "断开手柄连接"); - - } else if (event->type == kAE_RunModeChangeEvent) { - syncMode(); // 初始化设备模式 - UIS->setTxt(pageId, ob_home_sysInfo, "切换模式"); - - } else if (event->type == kAE_AcidStatChangeEvent) { - syncStat(); // 初始化统计数据 - } else if (event->type == kAppEvent_StateDisplayInfo) { - UIS->setTxt(pageId, ob_home_sysInfo, event->d.stateDisplayInfo); - } - } - - private: - void syncState() { - syncdate(); // 初始化时间 - syncPumpSelectState(); // 初始化选中状态 - syncAcidName(); // 初始化通道名字 - syncAcidEachDistriVal(); // 初始化每次加液体体积 - syncStat(); // 初始化统计数据 - syncMode(); // 初始化设备模式 - syncBleState(); // 同步蓝牙状态 - } - - private: - void syncdate() { - static zdate_t date; - AppHal::rtc_get(&date); - UI::ins()->setrtc(&date); - } - - void setPumpSelectState(uint8_t chIndex, bool state) { - GStateMgr::ins()->setPumpSelectState(chIndex, state); - if (chIndex == 0) { - UI::ins()->setPicturePicNum(pageId, ob_home_AcidCH0S, state ? ob_home_CHState1 : ob_home_CHState0); - } else if (chIndex == 1) { - UI::ins()->setPicturePicNum(pageId, ob_home_AcidCH1S, state ? ob_home_CHState1 : ob_home_CHState0); - } else if (chIndex == 2) { - UI::ins()->setPicturePicNum(pageId, ob_home_AcidCH2S, state ? ob_home_CHState1 : ob_home_CHState0); - } else if (chIndex == 3) { - UI::ins()->setPicturePicNum(pageId, ob_home_AcidCH3S, state ? ob_home_CHState1 : ob_home_CHState0); - } - } - - void syncPumpSelectState() { - UI::ins()->setPicturePicNum(pageId, ob_home_AcidCH0S, GStateMgr::ins()->getPumpSelectState(0) ? ob_home_CHState1 : ob_home_CHState0); - UI::ins()->setPicturePicNum(pageId, ob_home_AcidCH1S, GStateMgr::ins()->getPumpSelectState(1) ? ob_home_CHState1 : ob_home_CHState0); - UI::ins()->setPicturePicNum(pageId, ob_home_AcidCH2S, GStateMgr::ins()->getPumpSelectState(2) ? ob_home_CHState1 : ob_home_CHState0); - UI::ins()->setPicturePicNum(pageId, ob_home_AcidCH3S, GStateMgr::ins()->getPumpSelectState(3) ? ob_home_CHState1 : ob_home_CHState0); - } - - void syncAcidName() { - UI::ins()->setTxt(pageId, ob_home_acidname0, AcidChCfgDao::getCfg(0)->acidChooseName); - UI::ins()->setTxt(pageId, ob_home_acidname1, AcidChCfgDao::getCfg(1)->acidChooseName); - UI::ins()->setTxt(pageId, ob_home_acidname2, AcidChCfgDao::getCfg(2)->acidChooseName); - UI::ins()->setTxt(pageId, ob_home_acidname3, AcidChCfgDao::getCfg(3)->acidChooseName); - } - - void syncAcidEachDistriVal() { - UI::ins()->setTxt(pageId, ob_home_acideval0, "%.1f", AcidChCfgDao::getCfg(0)->acidEachDistriVal); - UI::ins()->setTxt(pageId, ob_home_acideval1, "%.1f", AcidChCfgDao::getCfg(1)->acidEachDistriVal); - UI::ins()->setTxt(pageId, ob_home_acideval2, "%.1f", AcidChCfgDao::getCfg(2)->acidEachDistriVal); - UI::ins()->setTxt(pageId, ob_home_acideval3, "%.1f", AcidChCfgDao::getCfg(3)->acidEachDistriVal); - } - - void syncStat() { - // StatUsedC - UI::ins()->setTxt(pageId, ob_home_StatRmidCH0, "%.1f", GStateMgr::ins()->getAcidRemain(0)); - UI::ins()->setTxt(pageId, ob_home_StatRmidCH1, "%.1f", GStateMgr::ins()->getAcidRemain(1)); - UI::ins()->setTxt(pageId, ob_home_StatRmidCH2, "%.1f", GStateMgr::ins()->getAcidRemain(2)); - UI::ins()->setTxt(pageId, ob_home_StatRmidCH3, "%.1f", GStateMgr::ins()->getAcidRemain(3)); - UI::ins()->setTxt(pageId, ob_home_StatUsedCH0, "%.1f", GStateMgr::ins()->getAcidUsed(0)); - UI::ins()->setTxt(pageId, ob_home_StatUsedCH1, "%.1f", GStateMgr::ins()->getAcidUsed(1)); - UI::ins()->setTxt(pageId, ob_home_StatUsedCH2, "%.1f", GStateMgr::ins()->getAcidUsed(2)); - UI::ins()->setTxt(pageId, ob_home_StatUsedCH3, "%.1f", GStateMgr::ins()->getAcidUsed(3)); - } - - void syncMode() { - auto nowMode = GStateMgr::ins()->getRunMode(); - if (nowMode == khand_acid_m_jog_mode) { - UI::ins()->setPicturePicNum(pageId, ob_home_RunMode, ob_home_RunMode1); - UI::ins()->setTxt(pageId, ob_home_RunModeVal, "", DeviceSettingDao::get()->distrIntervalS); - } else if (nowMode == khand_acid_m_continuous_mode) { - UI::ins()->setPicturePicNum(pageId, ob_home_RunMode, ob_home_RunMode0); - UI::ins()->setTxt(pageId, ob_home_RunModeVal, "%.1f", DeviceSettingDao::get()->distrIntervalS); - } - } - - void syncBleState() { - bool bleIsConnected = GStateMgr::ins()->getRemoterS(); - if (bleIsConnected) { - UI::ins()->setPicturePicNum(pageId, ob_home_RemoterS, ob_home_RemoterS1); - } else { - UI::ins()->setPicturePicNum(pageId, ob_home_RemoterS, ob_home_RemoterS0); - } - } -}; - -// 实例化LoginPage, 使其自动注册 -static HomePage instance; -} // namespace iflytop - -// kpt_sys_event_page_id diff --git a/usrc/uicontroler/page/home_page.cpp b/usrc/uicontroler/page/home_page.cpp new file mode 100644 index 0000000..54ff8cb --- /dev/null +++ b/usrc/uicontroler/page/home_page.cpp @@ -0,0 +1,182 @@ + +#include "db/dao/user_dao.hpp" +#include "uappbase/apphal/apphal.hpp" +#include "ui/ui.h" +#include "uicontroler/base/page_processer.hpp" +// +#include "db/dao/acid_ch_cfg_dao.hpp" +#include "db/dao/device_setting_dao.hpp" +// +#include "service/pump_ctrl_service.hpp" + +namespace iflytop { +using namespace std; +#define TAG "HomePage" + +class HomePage : public IPageProcesser { + private: + char userName[20] = {0}; + char passwd[20] = {0}; + + public: + HomePage() : IPageProcesser(TAG, pg_home) {} + + virtual void initialize() override { + IPageProcesser::initialize(); + syncState(); + } + + private: + virtual void OnPageLoad(OnPageLoadContext* cxt) override { + ZLOGI(TAG, "OnPageLoad"); + UIControler::ins()->vis(ob_home_AcidState, 0); // 隐藏酸液桶状态 + UIS->setTouchEnableState(ob_home_acidname0, 0); + UIS->setTouchEnableState(ob_home_acidname1, 0); + UIS->setTouchEnableState(ob_home_acidname2, 0); + UIS->setTouchEnableState(ob_home_acidname3, 0); + UIS->setTouchEnableState(ob_home_RunModeVal, 0); + syncState(); + } + virtual void OnBackKey(OnPageLoadContext* cxt) override {} + virtual void OnInputFieldContentChange(uint8_t bid, const char* text) override { + if (bid == ob_home_acideval0) { + AcidChCfgDao::updateAcidEachDistriVal(0, atof(text)); + } else if (bid == ob_home_acideval1) { + AcidChCfgDao::updateAcidEachDistriVal(1, atof(text)); + } else if (bid == ob_home_acideval2) { + AcidChCfgDao::updateAcidEachDistriVal(2, atof(text)); + } else if (bid == ob_home_acideval3) { + AcidChCfgDao::updateAcidEachDistriVal(3, atof(text)); + } else if (bid == ob_home_RunModeVal) { + DeviceSettingDao::updatedistrIntervalS(atof(text)); + } + } + virtual void OnButton(uint8_t bid, uint8_t val) override { + ZLOGI(TAG, "OnButton bid:%d val:%d", bid, val); + if (PumpCtrlService::ins()->isWorking()) { + UIS->alert("工作中,请稍后再操作"); + return; + } + + if (bid == ob_home_SelCH0) { + setPumpSelectState(0, !GStateMgr::ins()->getPumpSelectState(0)); + } else if (bid == ob_home_SelCH1) { + setPumpSelectState(1, !GStateMgr::ins()->getPumpSelectState(1)); + } else if (bid == ob_home_SelCH2) { + setPumpSelectState(2, !GStateMgr::ins()->getPumpSelectState(2)); + } else if (bid == ob_home_SelCH3) { + setPumpSelectState(3, !GStateMgr::ins()->getPumpSelectState(3)); + } else if (bid == ob_home_MenuButton) { + UIS->chpage(pg_navi); + } + } + virtual void OnDoubleStateButton(uint8_t bid, uint8_t val) override {} + virtual void OnAppEvent(AppEvent_t* event) override { + if (event->type == kAE_RemoterConnectedEvent) { + syncBleState(); // 同步蓝牙状态 + UIS->setTxt(pageId, ob_home_sysInfo, "连接上手柄"); + } else if (event->type == kAE_RemoterDisConnectedEvent) { + syncBleState(); // 同步蓝牙状态 + UIS->setTxt(pageId, ob_home_sysInfo, "断开手柄连接"); + + } else if (event->type == kAE_RunModeChangeEvent) { + syncMode(); // 初始化设备模式 + UIS->setTxt(pageId, ob_home_sysInfo, "切换模式"); + + } else if (event->type == kAE_AcidStatChangeEvent) { + syncStat(); // 初始化统计数据 + } else if (event->type == kAppEvent_StateDisplayInfo) { + UIS->setTxt(pageId, ob_home_sysInfo, event->d.stateDisplayInfo); + } + } + + private: + void syncState() { + syncdate(); // 初始化时间 + syncPumpSelectState(); // 初始化选中状态 + syncAcidName(); // 初始化通道名字 + syncAcidEachDistriVal(); // 初始化每次加液体体积 + syncStat(); // 初始化统计数据 + syncMode(); // 初始化设备模式 + syncBleState(); // 同步蓝牙状态 + } + + private: + void syncdate() { + static zdate_t date; + AppHal::rtc_get(&date); + UIControler::ins()->setrtc(&date); + } + + void setPumpSelectState(uint8_t chIndex, bool state) { + GStateMgr::ins()->setPumpSelectState(chIndex, state); + if (chIndex == 0) { + UIControler::ins()->setPicturePicNum(pageId, ob_home_AcidCH0S, state ? ob_home_CHState1 : ob_home_CHState0); + } else if (chIndex == 1) { + UIControler::ins()->setPicturePicNum(pageId, ob_home_AcidCH1S, state ? ob_home_CHState1 : ob_home_CHState0); + } else if (chIndex == 2) { + UIControler::ins()->setPicturePicNum(pageId, ob_home_AcidCH2S, state ? ob_home_CHState1 : ob_home_CHState0); + } else if (chIndex == 3) { + UIControler::ins()->setPicturePicNum(pageId, ob_home_AcidCH3S, state ? ob_home_CHState1 : ob_home_CHState0); + } + } + + void syncPumpSelectState() { + UIControler::ins()->setPicturePicNum(pageId, ob_home_AcidCH0S, GStateMgr::ins()->getPumpSelectState(0) ? ob_home_CHState1 : ob_home_CHState0); + UIControler::ins()->setPicturePicNum(pageId, ob_home_AcidCH1S, GStateMgr::ins()->getPumpSelectState(1) ? ob_home_CHState1 : ob_home_CHState0); + UIControler::ins()->setPicturePicNum(pageId, ob_home_AcidCH2S, GStateMgr::ins()->getPumpSelectState(2) ? ob_home_CHState1 : ob_home_CHState0); + UIControler::ins()->setPicturePicNum(pageId, ob_home_AcidCH3S, GStateMgr::ins()->getPumpSelectState(3) ? ob_home_CHState1 : ob_home_CHState0); + } + + void syncAcidName() { + UIControler::ins()->setTxt(pageId, ob_home_acidname0, AcidChCfgDao::getCfg(0)->acidChooseName); + UIControler::ins()->setTxt(pageId, ob_home_acidname1, AcidChCfgDao::getCfg(1)->acidChooseName); + UIControler::ins()->setTxt(pageId, ob_home_acidname2, AcidChCfgDao::getCfg(2)->acidChooseName); + UIControler::ins()->setTxt(pageId, ob_home_acidname3, AcidChCfgDao::getCfg(3)->acidChooseName); + } + + void syncAcidEachDistriVal() { + UIControler::ins()->setTxt(pageId, ob_home_acideval0, "%.1f", AcidChCfgDao::getCfg(0)->acidEachDistriVal); + UIControler::ins()->setTxt(pageId, ob_home_acideval1, "%.1f", AcidChCfgDao::getCfg(1)->acidEachDistriVal); + UIControler::ins()->setTxt(pageId, ob_home_acideval2, "%.1f", AcidChCfgDao::getCfg(2)->acidEachDistriVal); + UIControler::ins()->setTxt(pageId, ob_home_acideval3, "%.1f", AcidChCfgDao::getCfg(3)->acidEachDistriVal); + } + + void syncStat() { + // StatUsedC + UIControler::ins()->setTxt(pageId, ob_home_StatRmidCH0, "%.1f", GStateMgr::ins()->getAcidRemain(0)); + UIControler::ins()->setTxt(pageId, ob_home_StatRmidCH1, "%.1f", GStateMgr::ins()->getAcidRemain(1)); + UIControler::ins()->setTxt(pageId, ob_home_StatRmidCH2, "%.1f", GStateMgr::ins()->getAcidRemain(2)); + UIControler::ins()->setTxt(pageId, ob_home_StatRmidCH3, "%.1f", GStateMgr::ins()->getAcidRemain(3)); + UIControler::ins()->setTxt(pageId, ob_home_StatUsedCH0, "%.1f", GStateMgr::ins()->getAcidUsed(0)); + UIControler::ins()->setTxt(pageId, ob_home_StatUsedCH1, "%.1f", GStateMgr::ins()->getAcidUsed(1)); + UIControler::ins()->setTxt(pageId, ob_home_StatUsedCH2, "%.1f", GStateMgr::ins()->getAcidUsed(2)); + UIControler::ins()->setTxt(pageId, ob_home_StatUsedCH3, "%.1f", GStateMgr::ins()->getAcidUsed(3)); + } + + void syncMode() { + auto nowMode = GStateMgr::ins()->getRunMode(); + if (nowMode == khand_acid_m_jog_mode) { + UIControler::ins()->setPicturePicNum(pageId, ob_home_RunMode, ob_home_RunMode1); + UIControler::ins()->setTxt(pageId, ob_home_RunModeVal, "", DeviceSettingDao::get()->distrIntervalS); + } else if (nowMode == khand_acid_m_continuous_mode) { + UIControler::ins()->setPicturePicNum(pageId, ob_home_RunMode, ob_home_RunMode0); + UIControler::ins()->setTxt(pageId, ob_home_RunModeVal, "%.1f", DeviceSettingDao::get()->distrIntervalS); + } + } + + void syncBleState() { + bool bleIsConnected = GStateMgr::ins()->getRemoterS(); + if (bleIsConnected) { + UIControler::ins()->setPicturePicNum(pageId, ob_home_RemoterS, ob_home_RemoterS1); + } else { + UIControler::ins()->setPicturePicNum(pageId, ob_home_RemoterS, ob_home_RemoterS0); + } + } +}; + +// 实例化LoginPage, 使其自动注册 +static HomePage instance; +} // namespace iflytop + +// kpt_sys_event_page_id diff --git a/usrc/uicontroler/page/initializer/PageInitializer.cpp b/usrc/uicontroler/page/initializer/PageInitializer.cpp deleted file mode 100644 index fc820a9..0000000 --- a/usrc/uicontroler/page/initializer/PageInitializer.cpp +++ /dev/null @@ -1,8 +0,0 @@ -#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 deleted file mode 100644 index 679aff2..0000000 --- a/usrc/uicontroler/page/login/login_page.cpp +++ /dev/null @@ -1,74 +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 "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(); - resetPage(); - } - - 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_home); - resetPage(); - } - } - virtual void OnDoubleStateButton(uint8_t bid, uint8_t val) override {} - virtual void OnAppEvent(AppEvent_t* event) override {} - - private: - void resetPage() { - UIS->setTxt(pageId, ob_login_uName, ""); // 用户名 - UIS->setTxt(pageId, ob_login_uNameEMsg, ""); // 用户名错误信息 - UIS->setTxt(pageId, ob_login_pwd, ""); // 密码 - UIS->setTxt(pageId, ob_login_pwdEMsg, ""); // 密码错误信息 - } -}; - -// 实例化LoginPage, 使其自动注册 -static LoginPage instance; -} // namespace iflytop - -// kpt_sys_event_page_id diff --git a/usrc/uicontroler/page/login_page.cpp b/usrc/uicontroler/page/login_page.cpp new file mode 100644 index 0000000..6468591 --- /dev/null +++ b/usrc/uicontroler/page/login_page.cpp @@ -0,0 +1,74 @@ + +#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(); + resetPage(); + } + + 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); + UIControler::ins()->chpage(pg_home); + resetPage(); + } + } + virtual void OnDoubleStateButton(uint8_t bid, uint8_t val) override {} + virtual void OnAppEvent(AppEvent_t* event) override {} + + private: + void resetPage() { + UIS->setTxt(pageId, ob_login_uName, ""); // 用户名 + UIS->setTxt(pageId, ob_login_uNameEMsg, ""); // 用户名错误信息 + UIS->setTxt(pageId, ob_login_pwd, ""); // 密码 + UIS->setTxt(pageId, ob_login_pwdEMsg, ""); // 密码错误信息 + } +}; + +// 实例化LoginPage, 使其自动注册 +static LoginPage instance; +} // namespace iflytop + +// kpt_sys_event_page_id diff --git a/usrc/uicontroler/page/navi_page.cpp b/usrc/uicontroler/page/navi_page.cpp new file mode 100644 index 0000000..a999006 --- /dev/null +++ b/usrc/uicontroler/page/navi_page.cpp @@ -0,0 +1,38 @@ + +#include "db/dao/user_dao.hpp" +#include "ui/ui.h" +#include "uicontroler/base/page_processer.hpp" +namespace iflytop { +using namespace std; +#define TAG "NaviPage" + +class NaviPage : public IPageProcesser { + private: + char userName[20] = {0}; + char passwd[20] = {0}; + + public: + NaviPage() : IPageProcesser(TAG, pg_login) {} + + virtual void initialize() override { + IPageProcesser::initialize(); + syncState(); + } + + private: + virtual void OnPageLoad(OnPageLoadContext* cxt) override {} + virtual void OnBackKey(OnPageLoadContext* cxt) 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 OnAppEvent(AppEvent_t* event) override {} + + private: + void syncState() {} +}; + +// 实例化LoginPage, 使其自动注册 +static NaviPage instance; +} // namespace iflytop + +// kpt_sys_event_page_id diff --git a/usrc/uicontroler/pagerouter/page_bak_router.hpp b/usrc/uicontroler/pagerouter/page_bak_router.hpp index 620be9c..ded6d82 100644 --- a/usrc/uicontroler/pagerouter/page_bak_router.hpp +++ b/usrc/uicontroler/pagerouter/page_bak_router.hpp @@ -1,7 +1,7 @@ #pragma once #include "apphardware/apphardware.hpp" #include "uappbase/base.hpp" -#include "uicontroler/front_end_controler.hpp" +#include "uicontroler/ui_controler.hpp" #include "config/config.hpp" namespace iflytop { int getBakPage(int nowPage); diff --git a/usrc/uicontroler/ui_controler.cpp b/usrc/uicontroler/ui_controler.cpp new file mode 100644 index 0000000..e074a76 --- /dev/null +++ b/usrc/uicontroler/ui_controler.cpp @@ -0,0 +1,508 @@ +#include "ui_controler.hpp" + +#include +#include +#include +#include + +#include "tjc/tjc_constant.hpp" +using namespace iflytop; +#define TAG "UIScheduler" +#define MODULE_DEBUG 1 + +#define CMD_OVERTIME 50 + +static ZThread uart_rx_thread; +static ZThread rx_processed_thread; + +static ZQueue ackQueue; +static ZQueue eventQueue; +static ZThread usartRxThread; +static ZThread eventProcessThread; +static bool m_isWaitingForAck; +static UART_HandleTypeDef* tjcUart; + +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 UIControler::initialize() { // + ackQueue.initialize(5, sizeof(tjc_rx_packet_t)); + eventQueue.initialize(5, sizeof(tjc_rx_packet_t)); + usartRxThread.init("usartRxThread", 1024); + eventProcessThread.init("eventProcessThread", 1024); + + tjcUart = AppHardware::ins()->tjcUart; + m_cmdlock.init(); +} +#define UART_RX_OVERTIME 5 +void UIControler::startSchedule() { + usartRxThread.start([this]() { + static uint8_t rxbuf[128]; + tjcUart->USR_UartITRxing = 1; + 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]; + int32_t rxsize = 0; + if (tjcUart->USR_UartITRxOff != 0 && zos_haspassedms(tjcUart->USR_UartITLastRxTicket) > UART_RX_OVERTIME) { + vPortEnterCritical(); + if (tjcUart->USR_UartITRxOff != 0 && zos_haspassedms(tjcUart->USR_UartITLastRxTicket) > UART_RX_OVERTIME) { + memcpy(processbuf, tjcUart->USR_UartITRxBuf, tjcUart->USR_UartITRxOff); + rxsize = tjcUart->USR_UartITRxOff; + tjcUart->USR_UartITRxOff = 0; + } + vPortExitCritical(); + } + + if (rxsize != 0) { + processScreenRxPacket(processbuf, rxsize); + } + osDelay(1); + } + }); + + eventProcessThread.start([this]() { + while (1) { + static tjc_rx_packet_t packet; + bool suc = eventQueue.receive(&packet, 10); + if (suc) { + uint8_t packetType = packet.data[0]; + memset(&event_cache, 0, sizeof(event_cache)); + + if (packetType == tjc::kpt_inputfield_content_change_event1) { + processInputfieldContentChangeEvent1(packet.data, packet.datalen); + } else if (packetType == tjc::kpt_double_state_button_event) { + processUsrDoubleStateButtonEvent(packet.data, packet.datalen); + } else if (tjc::kpt_button_event == packetType) { + event_cache.eventId = packet.data[0]; + event_cache.pid = packet.data[1]; + event_cache.bid = packet.data[2]; + event_cache.d.button_event.val = packet.data[3]; + callUsrEventCb(&event_cache); + } else if (tjc::kpt_sys_event_page_id == packetType) { + event_cache.eventId = packet.data[0]; + event_cache.pid = packet.data[1]; + event_cache.bid = 0; + + if (m_nowPage == packet.data[1]) { + // page not change + } else { + m_lastPage = m_nowPage; + m_nowPage = packet.data[1]; + } +#if MODULE_DEBUG + ZLOGD(TAG, "page change from %d to %d ", m_lastPage, m_nowPage); +#endif + + callUsrEventCb(&event_cache); + + } else { + event_cache.eventId = packet.data[0]; + callUsrEventCb(&event_cache); + ZLOGI(TAG, "[eventprocess-thread]: rx_event:%s", tjc::pt2str(packetType)); + } + } + osDelay(1); + } + }); +} + +void UIControler::processScreenRxPacket(uint8_t* data, size_t len) { + // 判断包是否合法 +#if MODULE_DEBUG + ZLOGI(TAG, "[rx-thread] : rx :%s(%d)", zhex2str(data, len), len); +#endif + + if (!(data[len - 1] == 0xff && data[len - 2] == 0xff && data[len - 3] == 0xff)) { + ZLOGI(TAG, "rx invalid packet %s", zhex2str(data, len)); + return; + } + if (TJC_MAX_PACKET_SIZE < len) { + ZLOGI(TAG, "rx invalid packet(tool long) %s", zhex2str(data, len)); + return; + } + + uint8_t packetType = data[0]; + + static tjc_rx_packet_t packet; + packet.datalen = len; + memcpy(packet.data, data, len); + if (tjc::kpt_ack == packetType) { + if (m_isWaitingForAck) { + bool suc = ackQueue.send(&packet, 10); + if (!suc) { + ZLOGI(TAG, "ackQueue send failed"); + } + m_isWaitingForAck = false; + } + + } else { + bool suc = eventQueue.send(&packet, 10); + if (!suc) { + ZLOGI(TAG, "eventQueue send failed"); + } + } +} + +static const char* zcpystr(char* cpyto, const char* strbegin, int32_t maxlen) { + if (strbegin == NULL) return NULL; + int32_t i = 0; + for (i = 0; i < maxlen; i++) { + cpyto[i] = strbegin[i]; + if (strbegin[i] == 0) { + return &strbegin[i + 1]; + } + } + return NULL; +} +void UIControler::processUsrButtonEvent(uint8_t* data, size_t len) { + /** + * @brief + * 指令格式: + * printh 65 + * prints dp,1 + * prints '&id&',1 + * printh FF FF FF + * + * AB Page cidName/0 FF FF FF + * + */ + // ButtonEventContext_t buttonEventCxt; + + // event_cache + memset(&event_cache, 0, sizeof(event_cache)); + event_cache.eventId = data[0]; + event_cache.pid = data[1]; + event_cache.bid = data[2]; + + callUsrEventCb(&event_cache); +} +void UIControler::processUsrDoubleStateButtonEvent(uint8_t* data, size_t len) { + /** + * @brief + * 指令格式: + * printh AD + * prints dp,1 + * prints '&id&',1 + * prints '&val&',1 + * printh FF FF FF + * + * AB Page cidName/0 FF FF FF + * + */ + // ButtonEventContext_t buttonEventCxt; + + // event_cache + memset(&event_cache, 0, sizeof(event_cache)); + event_cache.eventId = data[0]; + event_cache.pid = data[1]; + event_cache.bid = data[2]; + event_cache.d.double_state_button.val = data[3]; + + callUsrEventCb(&event_cache); +} +void UIControler::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 UIControler::processInputfieldContentChangeEvent0(uint8_t* data, size_t len) { + /** + * @brief + * + * printh AB + * prints loadpageid.val,1 + * prints loadcmpid.val,1 + * prints p[loadpageid.val].b[loadcmpid.val].txt,0 + * printh 00 + * printh FF FF FF + * page loadpageid.val + * + */ + ZLOGI(TAG, "processInputfieldContentChangeEvent0"); + memset(&event_cache, 0, sizeof(event_cache)); + event_cache.eventId = data[0]; + event_cache.pid = data[1]; + event_cache.bid = data[2]; + const char* strbegin = (const char*)&data[3]; + strbegin = zcpystr(event_cache.d.inputfield_content.text, strbegin, sizeof(event_cache.d.inputfield_content.text)); + callUsrEventCb(&event_cache); +} + +void UIControler::processInputfieldContentChangeEvent1(uint8_t* data, size_t len) { + /** + * @brief + * + * printh AC + * prints loadpageid.val,1 + * prints loadcmpid.val,1 + * prints p[loadpageid.val].b[loadcmpid.val].txt,0 + * printh 00 + * printh FF FF FF + * page loadpageid.val + * + */ + // ZLOGI(TAG, "processInputfieldContentChangeEvent1"); + memset(&event_cache, 0, sizeof(event_cache)); + event_cache.eventId = data[0]; + event_cache.pid = data[1]; + event_cache.bid = data[2]; + const char* strbegin = (const char*)&data[3]; + strbegin = zcpystr(event_cache.d.inputfield_content.text, strbegin, sizeof(event_cache.d.inputfield_content.text)); + + ZLOGD(TAG, "on InputfieldContentChange pid:%d bid:%d content:%s", event_cache.pid, event_cache.bid, event_cache.d.inputfield_content.text); + + callUsrEventCb(&event_cache); +} + +bool UIControler::readTxt(uint8_t pid, uint8_t cId, char* txt, int32_t txtbuflen) { + zlock_guard lg(m_cmdlock); + + startReceiveAck(); + sendcmd("com_stop"); + sendcmd("printh AA"); + sendcmd("prints p[%d].b[%d].txt,0", pid, cId); + sendcmd("printh 00"); + sendcmd("printh FF FF FF"); + sendcmd("com_start"); + + bool suc = ackQueue.receive(&ackcache, CMD_OVERTIME); + if (!suc) { + ZLOGI(TAG, "readTxt failed"); + return false; + } + int32_t cpysize = ackcache.datalen - 3; + if (cpysize > txtbuflen) { + cpysize = txtbuflen - 1; + } + + memcpy(txt, &ackcache.data[1], cpysize); + return true; +} +bool UIControler::readInt(uint8_t pid, uint8_t cId, int32_t* val) { + zlock_guard lg(m_cmdlock); + + startReceiveAck(); + sendcmd("com_stop"); + sendcmd("printh AA"); + sendcmd("prints p[%d].b[%d].val,4", pid, cId); + sendcmd("printh FF FF FF"); + sendcmd("com_start"); + + bool suc = ackQueue.receive(&ackcache, CMD_OVERTIME); + if (!suc) { + ZLOGI(TAG, "readTxt failed"); + return false; + } + + uint8_t int32val[4] = {0}; + memcpy(int32val, &ackcache.data[1], 4); + *val = *(int32_t*)int32val; + return true; +} + +bool UIControler::echo(uint8_t tx, uint8_t* rx) { + zlock_guard lg(m_cmdlock); + + startReceiveAck(); + sendcmd("com_stop"); + sendcmd("printh AA"); + sendcmd("printh %02X", tx); + sendcmd("printh FF FF FF"); + sendcmd("com_start"); + + bool suc = ackQueue.receive(&ackcache, CMD_OVERTIME); + if (!suc) { + ZLOGI(TAG, "readTxt failed"); + return false; + } + + uint8_t int32val = 0; + memcpy(&int32val, &ackcache.data[1], 1); + *rx = int32val; + + if (tx != int32val) { + return false; + } + + return true; +} + +bool UIControler::setTxt(uint8_t pid, uint8_t bid, const char* txt, ...) { + zlock_guard lg(m_cmdlock); + + va_list args; + va_start(args, txt); + static char buf[128]; + vsprintf(buf, txt, args); + va_end(args); + + sendcmd("p[%d].b[%d].txt=\"%s\"", pid, bid, buf); + return true; +} + +void UIControler::setPicturePicNum(uint8_t pid, uint8_t bid, uint8_t fromBid) { + zlock_guard lg(m_cmdlock); + sendcmd("p[%d].b[%d].pic=p[%d].b[%d].pic", pid, bid, pid, fromBid); +} +void UIControler::setButtonPicNum(uint8_t pid, uint8_t bid, uint8_t fromBid) { + zlock_guard lg(m_cmdlock); + sendcmd("p[%d].b[%d].pic=p[%d].b[%d].pic", pid, bid, pid, fromBid); + sendcmd("p[%d].b[%d].pic2=p[%d].b[%d].pic2", pid, bid, pid, fromBid); +} + +bool UIControler::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 UIControler::vis(uint16_t buuid, int32_t val) { + zlock_guard lg(m_cmdlock); + sendcmd("vis %d,%d", buuid & 0xff, val); + return true; +} + +void UIControler::setrtc(zdate_t* date) { + zlock_guard lg(m_cmdlock); + sendcmd("rtc0=%d", date->year); + sendcmd("rtc1=%d", date->month); + sendcmd("rtc2=%d", date->day); + sendcmd("rtc3=%d", date->hours); + sendcmd("rtc4=%d", date->minutes); + sendcmd("rtc5=%d", date->seconds); +} + +void UIControler::alert(const char* info, function onConfirm) { + zlock_guard lg(m_cmdlock); + // if (m_isInPopWin) { + // ZLOGE(TAG, "isInPopWin,alert failed"); + // return; + // } + + // m_onAlertPageConfirmKey = onConfirm; + // static char buf[128]; + // sprintf(buf, "%s", info); + + // sendcmd("p[%d].b[%d].val=%d", pg_alert, ob_alert_frompage, m_nowPage); + // sendcmd("p[%d].b[%d].txt=\"%s\"", pg_alert, ob_alert_info, buf); + // sendcmd("page alert"); +} +void UIControler::alertNoConfirm(const char* info) { + zlock_guard lg(m_cmdlock); + // if (m_isInPopWin) { + // ZLOGE(TAG, "isInPopWin,alertNoConfirm failed"); + // return; + // } + + // static char buf[128]; + // sprintf(buf, "%s", info); + + // sendcmd("p[%d].b[%d].val=dp", pg_alert, ob_alert_frompage); + // sendcmd("p[%d].b[%d].txt=\"%s\"", pg_alert, ob_alert_info, buf); + // sendcmd("page alert"); + // vis(ob_alert_confirmkey, 0); +} + +void UIControler::confirmNoCancle(const char* info, function onConfirm) { + zlock_guard lg(m_cmdlock); + // if (m_isInPopWin) { + // ZLOGE(TAG, "isInPopWin,confirmNoCancle failed"); + // return; + // } + + // m_onConfirmPageConfirmKey = onConfirm; + + // static char buf[128]; + // sprintf(buf, "%s", info); + + // sendcmd("p[%d].b[%d].val=dp", pg_confirm, ob_confirm_frompage); + // sendcmd("p[%d].b[%d].txt=\"%s\"", pg_confirm, ob_confirm_info, buf); + // sendcmd("page confirm"); + // vis(ob_confirm_canclekey, 0); +} + +void UIControler::confirm(const char* info, function onConfirm) { + zlock_guard lg(m_cmdlock); + // if (m_isInPopWin) { + // ZLOGE(TAG, "isInPopWin,confirm failed"); + // return; + // } + + // m_onConfirmPageConfirmKey = onConfirm; + // static char buf[128]; + // sprintf(buf, "%s", info); + + // sendcmd("p[%d].b[%d].val=dp", pg_confirm, ob_confirm_frompage); + // sendcmd("p[%d].b[%d].txt=\"%s\"", pg_confirm, ob_confirm_info, buf); + // sendcmd("page confirm"); + // vis(ob_confirm_canclekey, 1); +} + +void UIControler::chpage(uint8_t page) { sendcmd("page %d", page); } +// void UIControler::bakpage() { sendcmd("page %d", m_lastPage); } +void UIControler::sendcmd(const char* format, ...) { + static char buf[128]; + va_list args; + va_start(args, format); + vsprintf(buf, format, args); + va_end(args); + + uint8_t len = strlen(buf); + if (len > (128 - 3)) { + ZLOGI(TAG, "sendcmd too long"); + return; + } + + buf[len] = 0xff; + buf[len + 1] = 0xff; + buf[len + 2] = 0xff; + + HAL_UART_Transmit(tjcUart, (uint8_t*)buf, len + 3, 100); + while (true) { + osDelay(1); + if (tjcUart->gState == HAL_UART_STATE_READY) { + return; + } + } +} + +void UIControler::startReceiveAck() { + ackQueue.clear(); + m_isWaitingForAck = true; +} + +void UIControler::virtualClick(uint8_t pid, uint8_t bid, uint8_t event) { + zlock_guard lg(m_cmdlock); + sendcmd("click b[%d],%d", bid, event); +} + +void UIControler::setTouchEnableState(uint8_t bid, uint8_t enable) { + // tsw obj,state + zlock_guard lg(m_cmdlock); + sendcmd("tsw b[%d],%d", bid, enable); +} + +void UIControler::setEnumComponentState(uint8_t pid, uint8_t bid, int32_t state) { + // 枚举类型使用动画组件 + sendcmd("p[%d].b[%d].tim=%d", pid, bid, state * 50); +} +void UIControler::setPic(uint8_t pid, uint8_t bid, int32_t picNum) { sendcmd("p[%d].b[%d].pic=%d", pid, bid, picNum); } + +void UIControler::setAph(uint8_t pid, uint8_t bid, int32_t state) { sendcmd("p[%d].b[%d].aph=%d", pid, bid, state); } + +void UIControler::pageInit() { UIPageInit(); } + +namespace iflytop { +__weak void UIPageInit() {} +} // namespace iflytop diff --git a/usrc/uicontroler/ui_controler.hpp b/usrc/uicontroler/ui_controler.hpp new file mode 100644 index 0000000..55ee63a --- /dev/null +++ b/usrc/uicontroler/ui_controler.hpp @@ -0,0 +1,112 @@ +#pragma once +#include "apphardware/apphardware.hpp" +#include "config/config.hpp" +#include "uappbase/base.hpp" +// +#include "tjc/tjc.hpp" + +namespace iflytop { +using namespace std; +typedef struct { + uint8_t data[TJC_MAX_PACKET_SIZE]; + uint16_t datalen; +} tjc_rx_packet_t; + +#define UIS UIControler::ins() +class UIControler { + ZThread m_thread; + + tjc_rx_packet_t ackcache; + zmutex m_cmdlock = {"UI_LOCK"}; + + tjc::UIEvent event_cache; + + int32_t m_nowPage = 0; + int32_t m_lastPage = 0; + + public: + UIControler() {}; + ~UIControler() {}; + + static UIControler* ins() { + static UIControler instance; + return &instance; + } + + void initialize(); + void pageInit(); + int getNowPage() { return m_nowPage; } + + void startSchedule(); + + // cmd list + bool readTxt(uint8_t pid, uint8_t bid, char* txt, int32_t txtbuflen); + bool readInt(uint8_t pid, uint8_t bid, int32_t* val); + bool echo(uint8_t tx, uint8_t* rx); + + bool setTxt(uint8_t pid, uint8_t bid, const char* txt, ...); + + void setPicturePicNum(uint8_t pid, uint8_t bid, uint8_t fromBid); + void setButtonPicNum(uint8_t pid, uint8_t bid, uint8_t fromBid); + + + bool setVal(uint8_t pid, uint8_t bid, int32_t val); + bool vis(uint16_t bid, int32_t val); // 不支持跨页面隐藏 + // vis b0,0 + + + void alert(const char* info) { alert(info, nullptr); } + void alertNoConfirm(const char* info); + void alert(const char* info, function onConfirm); + void confirmNoCancle(const char* info) { confirmNoCancle(info, nullptr); } + void confirmNoCancle(const char* info, function onConfirm); + void confirm(const char* info, function onConfirm); + + void chpage(uint8_t page); + void setrtc(zdate_t* date); + + // void bakpage(); + void virtualClick(uint8_t pid, uint8_t bid, uint8_t event); + void setTouchEnableState(uint8_t bid, uint8_t enable); + + void setEnumComponentState(uint8_t pid, uint8_t bid, int32_t state); + void setPic(uint8_t pid, uint8_t bid, int32_t picNum); + + void setAph(uint8_t pid, uint8_t bid, int32_t state); // 组件透明度,最大127,设置为0则隐藏组件 + void sendcmd(const char* format, ...); + + private: + void processScreenRxPacket(uint8_t* data, size_t len); + void processUsrButtonEvent(uint8_t* data, size_t len); + void processInputfieldContentChangeEvent1(uint8_t* data, size_t len); + void processInputfieldContentChangeEvent0(uint8_t* data, size_t len); + void processUsrDoubleStateButtonEvent(uint8_t* data, size_t len); + + void startReceiveAck(); + + void callUsrEventCb(tjc::UIEvent* event); +}; + +static inline const char* zitoa(int val) { + static char buf[32]; + sprintf(buf, "%d", val); + return buf; +} +static inline const char* zfmt(const char* fmt, ...) { + static char buf[128]; + va_list args; + va_start(args, fmt); + vsnprintf(buf, sizeof(buf), fmt, args); + va_end(args); + return buf; +} + +static inline const char* refmt(const char* fmt, const char* floatval) { + static char buf[128]; + sprintf(buf, fmt, atof(floatval)); + return buf; +} + +__weak void UIPageInit(); + +} // namespace iflytop