From 31b53897ca26c0d5c3246611e85b2ec9c2b9f641 Mon Sep 17 00:00:00 2001 From: zhaohe Date: Fri, 29 Nov 2024 09:48:48 +0800 Subject: [PATCH] update --- ui/hand_acid_mainboard_ui.HMI | Bin 19157617 -> 19157617 bytes usrc/db/dao/acid_use_record_dao.cpp | 33 ++++++++----- usrc/db/dao/device_acid_volume_dao.cpp | 12 ++--- usrc/db/dao/device_acid_volume_dao.hpp | 2 +- usrc/service/app_core.cpp | 4 +- usrc/service/statistics_sync_service.cpp | 42 +++++++++++----- usrc/uicontroler/base/page_processer.cpp | 2 +- usrc/uicontroler/page/home_page.cpp | 6 +-- usrc/uicontroler/page/login_page.cpp | 4 +- usrc/uicontroler/page/mupage/MuAcidDistMgrPage.cpp | 5 +- usrc/uicontroler/page/mupage/muAcidUseMgr_page.cpp | 54 +++++++-------------- usrc/uicontroler/page/mupage/muDateMgr_page.cpp | 2 + usrc/uicontroler/page/navi_page.cpp | 45 +++++++++++------ usrc/uicontroler/page/popwin_page.cpp | 9 ++-- usrc/uicontroler/ui_controler.cpp | 24 ++++----- usrc/uicontroler/ui_controler.hpp | 7 ++- 16 files changed, 141 insertions(+), 110 deletions(-) diff --git a/ui/hand_acid_mainboard_ui.HMI b/ui/hand_acid_mainboard_ui.HMI index a24ef7d83a1ecd97341e3d7c141156fc61c0033d..8536dea9bd4138df7cb1573caafc5f6dd8e75777 100644 GIT binary patch delta 31040 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 delta 2416 zcmeIxZB!Ih7zglshZO}D0fhyX6s--l4nkpxnhTmQXy~9O8j_1IDH$+|Z*_K4x3;5)Q9Gr-~T*&?{n|WdCuA9 zvLcUWpz+(OjnY*6N*Xwrco0I8Q_{jl#l@n!_mqW7Bn0b}?;R~9A~bpUb!>d{j8GXa zkz#l384HpejWopD{!lMp{XWM+GNJ&h2MUQp@>!>wNMf!E{lZ)Bi!%DfOQAVrBt=J+ zLP%9Qkt)-1=d6zUsAGcGJBRe?!0(iolJKaol#G^hJR8Gvh%^Cvs2$P%^+K13{$WzG ztAY4cTFLG?Sg=O~W(1S)`*(+S%O~sWaUL9}11Edy?l=w~SYwRTb-is#um>B1bW^Jw zcjXwPHO5Fm05{MMu>>}mO<~WmL^hQrvFF(|W@gE3I-9{}vRUi}Hk-|1DeOfym%YSNSsF{< zDV2rlRR0y%mD+_1g0#}^lFmcv>18RfiV+gbgZYpF3p6oeVQQ|sd|}hWBMQ`WNuKlx zt&iCv(&cyETK){x;|a-bt;bAq)zwp6^_V1AU2P^Lx3xcRrfa=swyTbt>#A$g2-)4* zpEtj)P9Ua5Z9mA(Ojo@M-ryXx8;LYiBaNkuLpMXi^{=Mmz`|L1rTt=hQh zmdH3oij*d4C%0MF2Iu|+m9*iKuXFDXPdYNn>K45S7Q+(Agr)E@ zEQ2g~1(s`W(b=h&)c8yvnxHh;rE5y3QBrTEAy|%4qE}n|6}^wVS&=%+U9?&s`36<8 zH|Dof4Jn?~mrhgZWp5fo&1!tMH(jTMlrHYAG-g@W(r(JU&T>B`dVrLzh4{-ERIQWI zQM@eQUojcvOhqiu@pVo)9zv5RDEl1?eXM4d1Gyjr0}JGVRWq|!&lkHVnywVBuUF|| zFB+un>SHr>(n9R{v4XO-WO0DjcZlurN3^;l`J)AOU>I7QYLK2vZd$)|+hde>TB%}A zv(>8M{rT>;9`|-li|*f5Zq3LGQ1=IT(GtZx%VtpO4j~G76>X9X&Ml#Onk#7IvhF{o zoycxm&{oSfD*W?}iKF=&&qnI$3^&yjp{GIW)KD*4?7TKWPiq9NVO8tlSV66w$a_W8 zz21F;cyCPvdX%gedUzc+z#Fg;R49cv;Vsw%W$-q<1Mk9n@IGvY58y-C z0$X7ll*4w|0S?#+AHgor;A7Ygdtfho0{dV;IH3YQh0ow~sDvu`0uI2Ja1ahbH5`T- z_zG&F4vxUra1_3QV{jZ!Ks}sW0>8p_xBrecordNum - 1; + int recordNum = m_table->recordNum - 1; if (recordNum < 0) { ZLOGW(TAG, "no record to update"); return; @@ -94,7 +94,7 @@ void AcidUseRecordDao::updateLastRecord(uint16_t val0, uint16_t val1, uint16_t v void AcidUseRecordDao::syncTheLastRecord() { zlock_guard l(lock); - int recordNum = m_table->recordNum - 1; + int recordNum = m_table->recordNum - 1; if (recordNum < 0) { ZLOGW(TAG, "no record to sync"); return; @@ -104,7 +104,7 @@ void AcidUseRecordDao::syncTheLastRecord() { void AcidUseRecordDao::setDirtyRecordClean() { zlock_guard l(lock); - int recordNum = m_table->recordNum - 1; + int recordNum = m_table->recordNum - 1; if (recordNum < 0) { ZLOGW(TAG, "no record to clean"); return; @@ -114,7 +114,7 @@ void AcidUseRecordDao::setDirtyRecordClean() { } void AcidUseRecordDao::removeTheLastDirtyRecordSync() { zlock_guard l(lock); - int recordNum = m_table->recordNum - 1; + int recordNum = m_table->recordNum - 1; if (recordNum < 0) { ZLOGW(TAG, "no record to remove"); return; @@ -165,18 +165,25 @@ void AcidUseRecordDao::getRecord(int pageNum, AcidUseRcordPage* page) { void AcidUseRecordDao::clearRecord() { zlock_guard l(lock); ZASSERT_INFO(module_inited, "acid use record dao not inited"); - - m_table->recordNum = 0; + // 移动当前最后一个记录到第一个 + if (m_table->recordNum > 0) { + m_table->record[0] = m_table->record[m_table->recordNum - 1]; + m_table->recordNum = 1; + } else { + m_table->recordNum = 0; + } storgeTableData(); } -bool AcidUseRecordDao::isAlmostFull() { +bool AcidUseRecordDao::isAlmostFull() { zlock_guard l(lock); - - return m_table->recordNum >= ACIDUSERCORD_ALMOST_FULL; } -bool AcidUseRecordDao::isFull() { + + return m_table->recordNum >= ACIDUSERCORD_ALMOST_FULL; +} +bool AcidUseRecordDao::isFull() { zlock_guard l(lock); - - return m_table->recordNum >= ACIDUSERCORD_RECORD_NUM; } + + return m_table->recordNum >= ACIDUSERCORD_RECORD_NUM; +} int AcidUseRecordDao::getRecordNum() { zlock_guard l(lock); diff --git a/usrc/db/dao/device_acid_volume_dao.cpp b/usrc/db/dao/device_acid_volume_dao.cpp index 4b23d7f..0bcc6b2 100644 --- a/usrc/db/dao/device_acid_volume_dao.cpp +++ b/usrc/db/dao/device_acid_volume_dao.cpp @@ -2,7 +2,7 @@ #include "uappbase/zhdb/zhdb.hpp" -#define TAG "DeviceAcidVolume" +#define TAG "DeviceAcidVolumeDao" using namespace iflytop; @@ -31,7 +31,7 @@ static zmutex lock(TABLE_NAME); * FUNCTION * ***********************************************************************************************************************/ static void storgeTableData() { ZHDB::storageData((uint8_t*)tabledata, sizeof(*tabledata)); } -void DeviceAcidVolume::init() { +void DeviceAcidVolumeDao::init() { lock.init(); // table = ZHDB::allocTable(TABLE_NAME, sizeof(*tabledata)); @@ -54,7 +54,7 @@ void DeviceAcidVolume::init() { ZLOGI(TAG, "init success"); } -void DeviceAcidVolume::updateAcidVolume(int index, float volume) { +void DeviceAcidVolumeDao::updateAcidVolume(int index, float volume) { zlock_guard l(lock); ZASSERT_INFO(module_inited, "device acid volume dao not inited"); if (index < 0 || index >= sizeof(tabledata->item[0].acidVolume) / sizeof(tabledata->item[0].acidVolume[0])) { @@ -63,19 +63,19 @@ void DeviceAcidVolume::updateAcidVolume(int index, float volume) { } tabledata->item[0].acidVolume[index] = volume; } -void DeviceAcidVolume::sync() { +void DeviceAcidVolumeDao::sync() { zlock_guard l(lock); ZASSERT_INFO(module_inited, "device acid volume dao not inited"); storgeTableData(); } -void DeviceAcidVolume::updateAcidVolumeSync(int index, float volume) { +void DeviceAcidVolumeDao::updateAcidVolumeSync(int index, float volume) { zlock_guard l(lock); updateAcidVolume(index, volume); sync(); } -float DeviceAcidVolume::getAcidVolume(int index) { +float DeviceAcidVolumeDao::getAcidVolume(int index) { zlock_guard l(lock); ZASSERT_INFO(module_inited, "device acid volume dao not inited"); if (index < 0 || index >= sizeof(tabledata->item[0].acidVolume) / sizeof(tabledata->item[0].acidVolume[0])) { diff --git a/usrc/db/dao/device_acid_volume_dao.hpp b/usrc/db/dao/device_acid_volume_dao.hpp index b66f458..952864c 100644 --- a/usrc/db/dao/device_acid_volume_dao.hpp +++ b/usrc/db/dao/device_acid_volume_dao.hpp @@ -5,7 +5,7 @@ namespace iflytop { -class DeviceAcidVolume { +class DeviceAcidVolumeDao { public: static void init(); diff --git a/usrc/service/app_core.cpp b/usrc/service/app_core.cpp index 8f60b0b..7cb5b01 100644 --- a/usrc/service/app_core.cpp +++ b/usrc/service/app_core.cpp @@ -119,7 +119,7 @@ void AppCore::initialize() { DeviceSettingDao::init(); AcidUseRecordDao::init(); AcidDistrubtRecordDao::init(); - DeviceAcidVolume::init(); + DeviceAcidVolumeDao::init(); ZLOGI(TAG, "load zhdb end"); // @@ -159,7 +159,7 @@ void AppCore::initialize() { GStateMgr::ins()->setLogin(0, "admin", kadmin); AppEventBus::ins()->pushSimpleEvent(kAE_LoginEvent); - UIControler::ins()->chpage(pg_muAcidDistMgr, true); + UIControler::ins()->chpage(pg_login, true); /*********************************************************************************************************************** * 统计内存使用情况 * diff --git a/usrc/service/statistics_sync_service.cpp b/usrc/service/statistics_sync_service.cpp index 9d39772..7a551bc 100644 --- a/usrc/service/statistics_sync_service.cpp +++ b/usrc/service/statistics_sync_service.cpp @@ -34,6 +34,7 @@ void StatisticsSyncService::initialize() { }); osTimerDef(statiUpdateTimer, syncTimer); + statiUpdateTimerId = osTimerCreate(osTimer(statiUpdateTimer), osTimerPeriodic, nullptr); osTimerStart(statiUpdateTimerId, 30 * 1000); } @@ -44,10 +45,10 @@ void StatisticsSyncService::onLogin() { * 2.清空全局用户酸液使用量 */ - GStateMgr::ins()->setAcidRemain(0, DeviceAcidVolume::getAcidVolume(0)); - GStateMgr::ins()->setAcidRemain(1, DeviceAcidVolume::getAcidVolume(1)); - GStateMgr::ins()->setAcidRemain(2, DeviceAcidVolume::getAcidVolume(2)); - GStateMgr::ins()->setAcidRemain(3, DeviceAcidVolume::getAcidVolume(3)); + GStateMgr::ins()->setAcidRemain(0, DeviceAcidVolumeDao::getAcidVolume(0)); + GStateMgr::ins()->setAcidRemain(1, DeviceAcidVolumeDao::getAcidVolume(1)); + GStateMgr::ins()->setAcidRemain(2, DeviceAcidVolumeDao::getAcidVolume(2)); + GStateMgr::ins()->setAcidRemain(3, DeviceAcidVolumeDao::getAcidVolume(3)); GStateMgr::ins()->setAcidUsed(0, 0); GStateMgr::ins()->setAcidUsed(1, 0); @@ -86,11 +87,11 @@ void StatisticsSyncService::doSyncOnUnLoginOrPowerOff() { /** * @brief 同步数据库中当前剩余酸液到全局 */ - DeviceAcidVolume::updateAcidVolume(0, GStateMgr::ins()->getAcidRemain(0)); - DeviceAcidVolume::updateAcidVolume(1, GStateMgr::ins()->getAcidRemain(1)); - DeviceAcidVolume::updateAcidVolume(2, GStateMgr::ins()->getAcidRemain(2)); - DeviceAcidVolume::updateAcidVolume(3, GStateMgr::ins()->getAcidRemain(3)); - DeviceAcidVolume::sync(); + DeviceAcidVolumeDao::updateAcidVolume(0, GStateMgr::ins()->getAcidRemain(0)); + DeviceAcidVolumeDao::updateAcidVolume(1, GStateMgr::ins()->getAcidRemain(1)); + DeviceAcidVolumeDao::updateAcidVolume(2, GStateMgr::ins()->getAcidRemain(2)); + DeviceAcidVolumeDao::updateAcidVolume(3, GStateMgr::ins()->getAcidRemain(3)); + DeviceAcidVolumeDao::sync(); // 如果酸液使用量小于0.01,则删除最后一条记录 if (used0 < 0.01 && used1 < 0.01 && used2 < 0.01 && used3 < 0.01) { @@ -121,7 +122,7 @@ void StatisticsSyncService::onAddAcidStorage(int ch, float addChVal) { * */ GStateMgr::ins()->setAcidRemain(ch, addChVal); - DeviceAcidVolume::updateAcidVolumeSync(ch, addChVal); + DeviceAcidVolumeDao::updateAcidVolumeSync(ch, addChVal); AppEventBus::ins()->pushAcidStatDisplayChangeEvent(); } void StatisticsSyncService::onUseAcid(float useVal0, float useVal1, float useVal2, float useVal3) { @@ -130,13 +131,29 @@ void StatisticsSyncService::onUseAcid(float useVal0, float useVal1, float useVal float now2 = GStateMgr::ins()->getAcidUsed(2); float now3 = GStateMgr::ins()->getAcidUsed(3); + float remain0 = GStateMgr::ins()->getAcidRemain(0); + float remain1 = GStateMgr::ins()->getAcidRemain(1); + float remain2 = GStateMgr::ins()->getAcidRemain(2); + float remain3 = GStateMgr::ins()->getAcidRemain(3); + GStateMgr::ins()->setAcidUsed(0, now0 + useVal0); GStateMgr::ins()->setAcidUsed(1, now1 + useVal1); GStateMgr::ins()->setAcidUsed(2, now2 + useVal2); GStateMgr::ins()->setAcidUsed(3, now3 + useVal3); - AcidUseRecordDao::updateLastRecord(now0 + useVal0, now1 + useVal1, now2 + useVal2, now3 + useVal3); - m_dataIsDirty = true; + GStateMgr::ins()->setAcidRemain(0, remain0 - useVal0 > 0 ? remain0 - useVal0 : 0); + GStateMgr::ins()->setAcidRemain(1, remain1 - useVal1 > 0 ? remain1 - useVal1 : 0); + GStateMgr::ins()->setAcidRemain(2, remain2 - useVal2 > 0 ? remain2 - useVal2 : 0); + GStateMgr::ins()->setAcidRemain(3, remain3 - useVal3 > 0 ? remain3 - useVal3 : 0); + + // AcidUseRecordDao::updateLastRecord(now0 + useVal0, now1 + useVal1, now2 + useVal2, now3 + useVal3); + // DeviceAcidVolumeDao::updateAcidVolume(0, GStateMgr::ins()->getAcidRemain(0)); + // DeviceAcidVolumeDao::updateAcidVolume(1, GStateMgr::ins()->getAcidRemain(1)); + // DeviceAcidVolumeDao::updateAcidVolume(2, GStateMgr::ins()->getAcidRemain(2)); + // DeviceAcidVolumeDao::updateAcidVolume(3, GStateMgr::ins()->getAcidRemain(3)); + + // m_dataIsDirty = true; + AppEventBus::ins()->pushAcidStatDisplayChangeEvent(); } @@ -144,6 +161,7 @@ static void syncTimer(const void* tid) { AppEventBus::ins()->callFnInEventBus([]() { if (m_dataIsDirty) { AcidUseRecordDao::syncTheLastRecord(); + DeviceAcidVolumeDao::sync(); m_dataIsDirty = false; } }); diff --git a/usrc/uicontroler/base/page_processer.cpp b/usrc/uicontroler/base/page_processer.cpp index 459290a..ddb1ad2 100644 --- a/usrc/uicontroler/base/page_processer.cpp +++ b/usrc/uicontroler/base/page_processer.cpp @@ -59,7 +59,7 @@ void IPageProcesser::initialize() { } // } else if (event->type == KAE_PageChangeEvent) { - if (thisPage != event->getUIEvent()->pid) { + if (thisPage != event->getPageChangeTo()) { return; } onChangePageEvent(); diff --git a/usrc/uicontroler/page/home_page.cpp b/usrc/uicontroler/page/home_page.cpp index a72454f..60817f8 100644 --- a/usrc/uicontroler/page/home_page.cpp +++ b/usrc/uicontroler/page/home_page.cpp @@ -147,9 +147,7 @@ class HomePage : public IPageProcesser { private: void syncdate() { - static zdate_t date; - AppHal::rtc_get(&date); - UIControler::ins()->setrtc(&date); + } void setPumpSelectState(uint8_t chIndex, bool state) { @@ -205,7 +203,7 @@ class HomePage : public IPageProcesser { UIControler::ins()->setTxt(thisPage, ob_home_RunModeVal, "", DeviceSettingDao::get()->distrIntervalS); } else if (nowMode == khand_acid_m_continuous_mode) { UIControler::ins()->setPicturePicNum(thisPage, ob_home_RunMode, ob_home_RunMode0); - UIControler::ins()->setTxt(thisPage, ob_home_RunModeVal, "%.2f", DeviceSettingDao::get()->distrIntervalS); + UIControler::ins()->setTxt(thisPage, ob_home_RunModeVal, " %.1f", DeviceSettingDao::get()->distrIntervalS); } } diff --git a/usrc/uicontroler/page/login_page.cpp b/usrc/uicontroler/page/login_page.cpp index 084c0d4..d5a7475 100644 --- a/usrc/uicontroler/page/login_page.cpp +++ b/usrc/uicontroler/page/login_page.cpp @@ -26,7 +26,7 @@ class LoginPage : public IPageProcesser { private: virtual void onPageLoad(OnPageLoadContext* cxt) override {} - virtual void onChangePageEvent() { + virtual void onChangePageEvent() override{ resetPage(); return; }; @@ -77,6 +77,8 @@ class LoginPage : public IPageProcesser { UIS->setTxt(thisPage, ob_login_uNameEMsg, ""); // 用户名错误信息 UIS->setTxt(thisPage, ob_login_pwd, ""); // 密码 UIS->setTxt(thisPage, ob_login_pwdEMsg, ""); // 密码错误信息 + memset(userName, 0, sizeof(userName)); + memset(passwd, 0, sizeof(passwd)); } void login(user_t* user) { diff --git a/usrc/uicontroler/page/mupage/MuAcidDistMgrPage.cpp b/usrc/uicontroler/page/mupage/MuAcidDistMgrPage.cpp index 5d0b8c7..e251713 100644 --- a/usrc/uicontroler/page/mupage/MuAcidDistMgrPage.cpp +++ b/usrc/uicontroler/page/mupage/MuAcidDistMgrPage.cpp @@ -125,7 +125,7 @@ class MuAcidDistMgrPage : public IPageProcesser { record.distribuVolume = m_volumeVal; AcidDistrubtRecordDao::addRecordSync(record); - DeviceAcidVolume::updateAcidVolumeSync(m_chId, m_volumeVal); + DeviceAcidVolumeDao::updateAcidVolumeSync(m_chId, m_volumeVal); GStateMgr::ins()->setAcidRemain(m_chId, m_volumeVal); AppEventBus::ins()->pushAcidStatStorageEvent(m_chId, m_volumeVal); resetForm(); @@ -141,7 +141,8 @@ class MuAcidDistMgrPage : public IPageProcesser { if (isOk) { UILoadingCxt loadingCxt; AcidDistrubtRecordDao::clearRecord(); - UIControler::ins()->chpage(thisPage, true); + resetForm(); + updateTableVolume(); } }); } diff --git a/usrc/uicontroler/page/mupage/muAcidUseMgr_page.cpp b/usrc/uicontroler/page/mupage/muAcidUseMgr_page.cpp index 4db6a49..9e8faea 100644 --- a/usrc/uicontroler/page/mupage/muAcidUseMgr_page.cpp +++ b/usrc/uicontroler/page/mupage/muAcidUseMgr_page.cpp @@ -66,8 +66,22 @@ class MuAcidUseMgrPage : public IPageProcesser { * @brief 返回上一页 */ virtual void onBackKey() override { UIControler::ins()->chpage(pg_navi, true); } - virtual void onChangePageEvent() override { - ZLOGI(TAG, "onChangePageEvent..............................................."); + virtual void onChangePageEvent() override { initPage(); } + + virtual void onClickRelease(uint8_t bid, uint8_t val, const char* text) override { + if (bid == ob_muAcidUseRecd_clearRecord) { + UIControler::ins()->popConfirmWin("您是否确定要清空用酸记录?", [this](bool isOk) { + if (isOk) { + UILoadingCxt loadingCxt; + AcidUseRecordDao::clearRecord(); + initPage(); + } + }); + } + } + virtual void onInputFieldContentChange(uint8_t bid, uint8_t slecId, const char* text) override {} + + void initPage() { // set title setText(cfgbid_table[0].val[0], "时间"); setText(cfgbid_table[0].val[1], "用户"); @@ -76,33 +90,12 @@ class MuAcidUseMgrPage : public IPageProcesser { setText(cfgbid_table[0].val[4], "%s(ml)", AcidChCfgDao::getCfg(2)->acidChooseName); setText(cfgbid_table[0].val[5], "%s(ml)", AcidChCfgDao::getCfg(3)->acidChooseName); -#if 0 - for (size_t i = 0; i < 20; i++) { - acid_use_record_t record; - record.id = i; - record.date.year = 2021 + i; - record.date.month = 6; - record.date.day = 1; - record.date.hours = 12; - record.date.minutes = 30; - record.date.seconds = 30; - record.usrid = 0; - - record.ch0take0p1ml = 100; - record.ch1take0p1ml = 110; - record.ch2take0p1ml = 120; - record.ch3take0p1ml = 130; - AcidUseRecordDao::addRecordSync(record); - } - AcidUseRecordDao::sync(); -#endif - // set val AcidUseRcordPage page; AcidUseRecordDao::getRecord(0, &page); for (int i = 0; i < page.recordNum; i++) { setText(cfgbid_table[i + 1].val[0], "%d/%d/%d %02d:%02d:%02d", page.record[i]->date.year, page.record[i]->date.month, page.record[i]->date.day, page.record[i]->date.hours, page.record[i]->date.minutes, page.record[i]->date.seconds); - setText(cfgbid_table[i + 1].val[1], "%s", UserDao::getUserByIdNotNull(page.record[i]->usrid)->name); + setText(cfgbid_table[i + 1].val[1], "%s(%s)", UserDao::getUserByIdNotNull(page.record[i]->usrid)->name, page.record[i]->dirty ? "*" : ""); setText(cfgbid_table[i + 1].val[2], "%.1f", page.record[i]->ch0take0p1ml / 10.0); setText(cfgbid_table[i + 1].val[3], "%.1f", page.record[i]->ch0take0p1ml / 10.0); setText(cfgbid_table[i + 1].val[4], "%.1f", page.record[i]->ch0take0p1ml / 10.0); @@ -118,19 +111,6 @@ class MuAcidUseMgrPage : public IPageProcesser { setText(cfgbid_table[i + 1].val[5], ""); } } - virtual void onClickRelease(uint8_t bid, uint8_t val, const char* text) override { - if (bid == ob_muAcidUseRecd_clearRecord) { - UIControler::ins()->popConfirmWin("您是否确定要清空用酸记录?", [](bool isOk) { - if (isOk) { - UILoadingCxt loadingCxt; - AcidUseRecordDao::clearRecord(); - UIControler::ins()->chpage(pg_muAcidUseRecd, true); - - } - }); - } - } - virtual void onInputFieldContentChange(uint8_t bid, uint8_t slecId, const char* text) override {} }; // 实例化Page, 使其自动注册 diff --git a/usrc/uicontroler/page/mupage/muDateMgr_page.cpp b/usrc/uicontroler/page/mupage/muDateMgr_page.cpp index 8237171..fbe0c82 100644 --- a/usrc/uicontroler/page/mupage/muDateMgr_page.cpp +++ b/usrc/uicontroler/page/mupage/muDateMgr_page.cpp @@ -137,6 +137,8 @@ class MuDateMgrPage : public IPageProcesser { if (bid == ob_muDateMgr_save) { ZLOGI(TAG, "set rtc %d-%d-%d %d:%d", date.year, date.month, date.day, date.hours, date.minutes); AppHal::rtc_set(&date); + UIControler::ins()->setrtc(&date); + UIControler::ins()->popInfoWin("时间设置成功", [](bool) { UIControler::ins()->chpage(pg_navi, true); }); } } }; diff --git a/usrc/uicontroler/page/navi_page.cpp b/usrc/uicontroler/page/navi_page.cpp index a9fda96..5df2439 100644 --- a/usrc/uicontroler/page/navi_page.cpp +++ b/usrc/uicontroler/page/navi_page.cpp @@ -8,8 +8,8 @@ using namespace std; #define TAG "NaviPage" typedef struct { - uint8_t bid; - uint8_t page; + int16_t bid; + int16_t page; } muInfo_t; typedef struct { @@ -45,34 +45,29 @@ static buttton_bid_info m_button_bid_info[] = { // 用户菜单配置 static muInfoTable_t usrMuInfoTable = // - {.menuTotalNum = 3, - .pageNum = 1, - .maxPageNum = 1, + { .muInfo = { {ob_navi_muInterval, pg_muInterval}, // 加酸间隔 {ob_navi_muChangePwd, pg_muChangePasswd}, // 修改密码 {ob_navi_muLoginOut, 0}, // 退出登录 - {ob_navi_powerOff, 0} // 关机 - + {ob_navi_powerOff, 0}, // 关机 + {-1, 0} // }}; // 库管菜单配置 static muInfoTable_t storeKeeperMuInfoTable = // - {.menuTotalNum = 4, - .pageNum = 1, - .maxPageNum = 1, + { .muInfo = { {ob_navi_muChangePwd, pg_muChangePasswd}, // 修改密码 {ob_navi_muAcidTakeMgr, pg_muAcidDistMgr}, // 领酸管理 {ob_navi_muAcidUseRecd, pg_muAcidUseRecd}, // 用酸记录 {ob_navi_muLoginOut, 0}, // 退出登录 - {ob_navi_powerOff, 0} // 关机 + {ob_navi_powerOff, 0}, // 关机 + {-1, 0} // }}; // 管理员菜单配置 static muInfoTable_t adminMuInfoTable = // - {.menuTotalNum = 11, - .pageNum = 1, - .maxPageNum = 2, + { .muInfo = { {ob_navi_muInterval, pg_muInterval}, // 加酸间隔 {ob_navi_muCHSetting, pg_muCHSetting}, // 通道设置 @@ -85,9 +80,23 @@ static muInfoTable_t adminMuInfoTable = // {ob_navi_muChangePwd, pg_muChangePasswd}, // 修改密码 {ob_navi_muDeviceInfo, pg_muDeviceInfo}, // 设备信息 {ob_navi_muLoginOut, 0}, // 退出登录 - {ob_navi_powerOff, 0} // 关机 + {ob_navi_powerOff, 0}, // 关机 + {-1, 0} // }}; +static void initmuInfoTableStrut(muInfoTable_t* table) { + int total = 0; + for (int i = 0; i < 32; i++) { + if (table->muInfo[i].bid == -1) { + break; + } + total++; + } + table->menuTotalNum = total; + table->pageNum = 1; + table->maxPageNum = total / 8 + (total % 8 == 0 ? 0 : 1); +} + /*********************************************************************************************************************** * VAR * ***********************************************************************************************************************/ @@ -125,6 +134,11 @@ class NaviPage : public IPageProcesser { virtual void initialize() override { IPageProcesser::initialize(); + + initmuInfoTableStrut(&usrMuInfoTable); + initmuInfoTableStrut(&storeKeeperMuInfoTable); + initmuInfoTableStrut(&adminMuInfoTable); + syncState(); } @@ -152,6 +166,7 @@ class NaviPage : public IPageProcesser { } else { UILoadingCxt cxt; StatisticsSyncService::doSyncOnUnLoginOrPowerOff(); + osDelay(2000); if (curMuTable->muInfo[muIndex].bid == ob_navi_powerOff) { UIControler::ins()->popPowerOffWin("已关机,请关闭设备电源"); } else if (curMuTable->muInfo[muIndex].bid == ob_navi_muLoginOut) { diff --git a/usrc/uicontroler/page/popwin_page.cpp b/usrc/uicontroler/page/popwin_page.cpp index 084a8da..861d733 100644 --- a/usrc/uicontroler/page/popwin_page.cpp +++ b/usrc/uicontroler/page/popwin_page.cpp @@ -64,10 +64,11 @@ class PopWinPage : public IPageProcesser { } if (!handupInfoFlag) { - if (UIControler::ins()->getNowPage() == thisPage) { - UIControler::ins()->chpage(lastPage, false); - osDelay(200); // 等待页面切换 - } + UIControler::ins()->doInUILockArea([this]() { + if (UIControler::ins()->getNowPage() == thisPage) { + UIControler::ins()->chpage(lastPage, false); + } + }); } osDelay(10); diff --git a/usrc/uicontroler/ui_controler.cpp b/usrc/uicontroler/ui_controler.cpp index 0ce15fd..e283929 100644 --- a/usrc/uicontroler/ui_controler.cpp +++ b/usrc/uicontroler/ui_controler.cpp @@ -12,7 +12,7 @@ using namespace iflytop; #define TAG "UIScheduler" -#define MODULE_DEBUG 0 +#define MODULE_DEBUG 1 #define UART_RX_OVERTIME 5 #define CMD_OVERTIME 100 @@ -167,7 +167,7 @@ bool UIControler::readTxt(uint8_t pid, uint8_t cId, char* txt, int32_t txtbuflen zlock_guard lg(m_cmdlock); startReceiveAck(); - sendcmd("com_stop"); + // sendcmd("com_stop"); sendcmd("printh AA"); sendcmd("prints p[%d].b[%d].txt,0", pid, cId); sendcmd("printh 00"); @@ -203,11 +203,11 @@ bool UIControler::_readFiledAsInt(uint8_t pid, uint8_t bid, const char* filedNam zlock_guard lg(m_cmdlock); startReceiveAck(); - sendcmd("com_stop"); + // sendcmd("com_stop"); sendcmd("printh AA"); sendcmd("prints p[%d].b[%d].%s,4", pid, bid, filedName); sendcmd("printh FF FF FF"); - sendcmd("com_start"); + // sendcmd("com_start"); bool suc = ackQueue.receive(&ackcache, CMD_OVERTIME); if (!suc) { @@ -226,7 +226,7 @@ bool UIControler::echo(uint8_t tx, uint8_t* rx) { zlock_guard lg(m_cmdlock); startReceiveAck(); - sendcmd("com_stop"); + // sendcmd("com_stop"); sendcmd("printh AA"); sendcmd("printh %02X", tx); sendcmd("printh FF FF FF"); @@ -314,6 +314,7 @@ void UIControler::popWin(UIPopWinType_t type, const char* info, functionchangePage(page); if (triggerEvent) AppEventBus::ins()->pushPageChangeEvent(page); sendcmd("page %d", page); @@ -347,14 +348,15 @@ void UIControler::sendcmd(const char* format, va_list args) { buf[len + 2] = 0xff; // vPortEnterCritical(); + // HAL_UART_Transmit_DMA(tjcUart, (uint8_t*)buf, len + 3); HAL_UART_Transmit(tjcUart, (uint8_t*)buf, len + 3, 100); // vPortExitCritical(); - while (true) { - osDelay(1); - if (tjcUart->gState == HAL_UART_STATE_READY) { - return; - } - } + // while (true) { + // osDelay(2); + // if (tjcUart->gState == HAL_UART_STATE_BUSY_RX || tjcUart->gState == HAL_UART_STATE_READY) { + // return; + // } + // } } void UIControler::startReceiveAck() { diff --git a/usrc/uicontroler/ui_controler.hpp b/usrc/uicontroler/ui_controler.hpp index 32324d6..6475ff0 100644 --- a/usrc/uicontroler/ui_controler.hpp +++ b/usrc/uicontroler/ui_controler.hpp @@ -84,7 +84,7 @@ class UIControler { void popWarningWin(const char* info) { popWin(UI_POP_WIN_TYPE_WARNING_INFO, info, nullptr); } void popFatalErrorWin(const char* info) { popWin(UI_POP_WIN_TYPE_FATAL_ERROR, info, nullptr); } void popConfirmWin(const char* info, function onConfirm) { popWin(UI_POP_WIN_TYPE_CONFIRM, info, onConfirm); } - void popInfoWin(const char* info) { popWin(UI_POP_WIN_TYPE_INFO, info, nullptr); } + void popInfoWin(const char* info, function onConfirm = nullptr) { popWin(UI_POP_WIN_TYPE_INFO, info, onConfirm); } void popPowerOffWin(const char* info) { popWin(UI_POP_WIN_TYPE_POWER_OFF_INFO, info, nullptr); } void setLoadingState(bool state) { @@ -94,6 +94,11 @@ class UIControler { } if (state) osDelay(10); } + + void doInUILockArea(function fn) { + zlock_guard lg(m_cmdlock); + fn(); + } /** * @brief */