From 649a64176c404ae5b1054740294b8f663c6e145c Mon Sep 17 00:00:00 2001 From: zhaohe Date: Sat, 26 Aug 2023 19:42:08 +0800 Subject: [PATCH] update --- components/dwin/dwin_ram_manager.cpp | 21 ++++++++++ components/dwin/dwin_ram_manager.hpp | 19 +++++++++ components/dwin/dwin_screen.cpp | 22 +++++++++- components/dwin/dwin_screen.hpp | 78 +++++++++++++++++++++++++----------- components/dwin/var_icon.cpp | 31 ++++++++++++++ components/dwin/var_icon.hpp | 30 ++++++++++---- 6 files changed, 169 insertions(+), 32 deletions(-) create mode 100644 components/dwin/dwin_ram_manager.cpp create mode 100644 components/dwin/dwin_ram_manager.hpp diff --git a/components/dwin/dwin_ram_manager.cpp b/components/dwin/dwin_ram_manager.cpp new file mode 100644 index 0000000..d3ad23c --- /dev/null +++ b/components/dwin/dwin_ram_manager.cpp @@ -0,0 +1,21 @@ +#include "dwin_ram_manager.hpp" + +#include + +using namespace iflytop; +using namespace iflytop::dwin; + +void DwinRamManager::init(uint32_t startadd, uint32_t endadd) { + this->startadd = startadd; + this->endadd = endadd; + this->curadd = startadd; +} + +uint16_t DwinRamManager::alloc(uint32_t eachsize) { + if (curadd + eachsize > endadd) { + return 0xffff; + } + uint16_t ret = curadd; + curadd += eachsize; + return ret; +} diff --git a/components/dwin/dwin_ram_manager.hpp b/components/dwin/dwin_ram_manager.hpp new file mode 100644 index 0000000..35e02f3 --- /dev/null +++ b/components/dwin/dwin_ram_manager.hpp @@ -0,0 +1,19 @@ +#pragma once +#include "sdk/os/zos.hpp" + +namespace iflytop { +namespace dwin { +using namespace std; + +class DwinRamManager { + uint32_t startadd = 0; + uint32_t endadd = 0; + uint32_t curadd = 0; + + public: + void init(uint32_t startadd, uint32_t endadd); + uint16_t alloc(uint32_t eachsize); +}; + +} // namespace dwin +} // namespace iflytop \ No newline at end of file diff --git a/components/dwin/dwin_screen.cpp b/components/dwin/dwin_screen.cpp index 74d5efc..3e1f40b 100644 --- a/components/dwin/dwin_screen.cpp +++ b/components/dwin/dwin_screen.cpp @@ -1,13 +1,23 @@ #include "dwin_screen.hpp" #include + +namespace iflytop { +namespace dwin { +DwinScreen g_dwinScreen; +} +} // namespace iflytop + using namespace iflytop; using namespace iflytop::dwin; #define TAG "dwin" -void DwinScreen::init(UART_HandleTypeDef* huart, int __) { +DwinScreen& DwinScreen::ins() { return g_dwinScreen; } + +void DwinScreen::init(UART_HandleTypeDef* huart, DwinScreenCfg dwcfg) { m_huart = huart; + m_dwcfg = dwcfg; ZUART::cfg_t cfg; cfg.huart = m_huart; cfg.name = "DwinScreenUart"; @@ -26,8 +36,18 @@ void DwinScreen::init(UART_HandleTypeDef* huart, int __) { txcontext.receiptlen = len; txcontext.receipt_ready_flag = true; }); + + m_rammanager.init(dwcfg.freeRawStartAddr, dwcfg.freeRawEndAddr); + m_textDisplayerManager.init(dwcfg.textDisplayerStartAddr, dwcfg.textDisplayerEndAddr); + m_varIconManager.init(dwcfg.varIconStartAddr, dwcfg.varIconEndAddr); } +uint16_t DwinScreen::alloc_free_ram(uint16_t size) { return m_rammanager.alloc(size); } +uint16_t DwinScreen::alloc_one_text_displayer() { return m_textDisplayerManager.alloc(m_dwcfg.textDisplayerSize); } +uint16_t DwinScreen::alloc_one_var_icon() { + uint16_t addr = m_varIconManager.alloc(m_dwcfg.varIconSize); + return addr; +} void DwinScreen::clearrxcache() { CriticalContext cc; txcontext.receipt_ready_flag = false; diff --git a/components/dwin/dwin_screen.hpp b/components/dwin/dwin_screen.hpp index d0a983c..72a76b7 100644 --- a/components/dwin/dwin_screen.hpp +++ b/components/dwin/dwin_screen.hpp @@ -1,4 +1,6 @@ #pragma once +#include "dwin_ram_manager.hpp" +// #include "sdk/os/zos.hpp" namespace iflytop { @@ -18,30 +20,50 @@ using namespace std; #define TX_CACHE_SIZE 256 #define RX_CACHE_SIZE 256 -class DwinScreen { +class Date { public: - class Date { - public: - uint16_t year; - uint16_t month; - uint16_t day; - uint16_t hour; - uint16_t minute; - uint16_t second; - uint16_t weekdaynum; - }; + uint16_t year; + uint16_t month; + uint16_t day; + uint16_t hour; + uint16_t minute; + uint16_t second; + uint16_t weekdaynum; +}; - private: - class TxContext { - public: - uint8_t txcache[TX_CACHE_SIZE]; - uint8_t txlen; - uint8_t receiptcache[RX_CACHE_SIZE]; - uint8_t receiptlen; - bool receipt_ready_flag = false; - }; +class TxContext { + public: + uint8_t txcache[TX_CACHE_SIZE]; + uint8_t txlen; + uint8_t receiptcache[RX_CACHE_SIZE]; + uint8_t receiptlen; + bool receipt_ready_flag = false; +}; + +class DwinScreenCfg { + public: + uint16_t freeRawStartAddr = 0; + uint16_t freeRawEndAddr = 0; + + uint16_t textDisplayerStartAddr = 0; + uint16_t textDisplayerEndAddr = 0; + uint16_t textDisplayerSize = 0; + + uint16_t varIconStartAddr = 0; + uint16_t varIconEndAddr = 0; + uint16_t varIconSize = 0; +}; +class Pos { + public: + uint16_t x; + uint16_t y; +}; + +class DwinScreen { + public: private: + DwinScreenCfg m_dwcfg; UART_HandleTypeDef* m_huart; ZUART m_uarthandler; @@ -50,16 +72,21 @@ class DwinScreen { uint8_t m_tx_pre_processcache[TX_CACHE_SIZE]; uint8_t m_rd_pre_processcache[RX_CACHE_SIZE]; + DwinRamManager m_rammanager; // 空闲ram管理器 + DwinRamManager m_textDisplayerManager; // 文本变量组件管理器 + DwinRamManager m_varIconManager; // 图形变量组件管理器 + bool enablecrc = false; public: /** * @brief * - * @param huart - * @param baudrate + * @param huart + * @param baudrate */ - void init(UART_HandleTypeDef* huart, int __ = 0); + static DwinScreen& ins(); + void init(UART_HandleTypeDef* huart, DwinScreenCfg cfg); public: bool set_page(uint16_t pageid); @@ -70,6 +97,10 @@ class DwinScreen { bool ping(); + uint16_t alloc_free_ram(uint16_t size); + uint16_t alloc_one_text_displayer(); + uint16_t alloc_one_var_icon(); + public: bool write_reg16(uint16_t regaddr, uint16_t data, int overtime); bool read_reg16(uint16_t regaddr, uint16_t& data, int overtime); @@ -94,5 +125,6 @@ class DwinScreen { void sendcmd(uint8_t* cmd, size_t len); bool sendcmdblock(int overtime); }; + } // namespace dwin } // namespace iflytop \ No newline at end of file diff --git a/components/dwin/var_icon.cpp b/components/dwin/var_icon.cpp index 059fe39..e6cf366 100644 --- a/components/dwin/var_icon.cpp +++ b/components/dwin/var_icon.cpp @@ -20,6 +20,16 @@ bool VarIcon::init(DwinScreen *dwin_screen, uint16_t descript_add) { readcfg(); return true; } +void VarIcon::initcfg(uint16_t valpointerAdd, uint16_t posx, uint16_t posy, const char *iconpath, uint16_t initval) { + int iconlib = 0; + int iconmin = 0; + int iconmax = 0; + + sscanf(iconpath, "%d/%d:%d", &iconlib, &iconmin, &iconmax); + initcfg(valpointerAdd, initval, posx, posy, iconlib, iconmin, iconmax); +} + + void VarIcon::initcfg(uint16_t valpointerAdd, uint16_t initval, uint16_t posx, uint16_t posy, uint16_t iconlib, uint16_t iconmin, uint16_t iconmax) { m_descript.m_VP = valpointerAdd; m_descript.m_PosX = posx; @@ -34,6 +44,7 @@ void VarIcon::initcfg(uint16_t valpointerAdd, uint16_t initval, uint16_t posx, u m_descript.m_ICONGamma = 0; m_descript.m_PICGamma = 0; m_descript.m_FilterSet = 0x3F; + flushcfg(); setVal(initval); } @@ -54,3 +65,23 @@ void VarIcon::dumpinfo() { printf("m_PICGamma = %d\n", m_descript.m_PICGamma); printf("m_FilterSet = %04x\n", m_descript.m_FilterSet); } + +bool VarIcon::setVal(uint16_t val) { + m_val = val; + return _setVal(val); +} +uint16_t VarIcon::getVal() { + uint16_t val = 0xffff; + m_dwin_screen->read_varspace16(m_descript.m_VP, val, 100); + return val; +} + +void VarIcon::hide() { _setVal(VARICON_VAL_HIDE); }; +void VarIcon::show() { _setVal(m_val); } + +VarIconDescript_t &VarIcon::getDescript() { return m_descript; } + +bool VarIcon::_setVal(uint16_t val) { + m_val = val; + return m_dwin_screen->write_varspace16(m_descript.m_VP, val, 100); +} \ No newline at end of file diff --git a/components/dwin/var_icon.hpp b/components/dwin/var_icon.hpp index 1559147..2c6efc6 100644 --- a/components/dwin/var_icon.hpp +++ b/components/dwin/var_icon.hpp @@ -27,32 +27,46 @@ typedef struct { } VarIconDescript_t; #pragma pack() +#define VARICON_VAL_HIDE 0xffff + class VarIcon { DwinScreen *m_dwin_screen = nullptr; uint16_t m_descript_add = 0; VarIconDescript_t m_descript; + uint16_t m_val = 0xffff; + public: bool init(DwinScreen *dwin_screen, uint16_t descript_add); void initcfg(uint16_t valpointerAdd, uint16_t initval, uint16_t posx, uint16_t posy, uint16_t iconlib, uint16_t iconmin, uint16_t iconmax); + /** + * @brief + * + * @param valpointerAdd 变量指针地址 + * @param posx 图形的左上角x坐标 + * @param posy 图形的左上角y坐标 + * @param iconpath 图形的路径 47/1:1 iconlib/iconmin:iconmax + */ + void initcfg(uint16_t valpointerAdd, uint16_t posx, uint16_t posy, const char *iconpath, uint16_t initval); + public: bool flushcfg(); bool readcfg(); - bool setVal(uint16_t val) { return m_dwin_screen->write_varspace16(m_descript.m_VP, val, 100); } - uint16_t getVal() { - uint16_t val = 0xffff; - m_dwin_screen->read_varspace16(m_descript.m_VP, val, 100); - return val; - } + bool setVal(uint16_t val); + uint16_t getVal(); - VarIconDescript_t &getDescript() { return m_descript; } + void hide(); + void show(); + + VarIconDescript_t &getDescript(); void dumpinfo(); - public: + private: + bool _setVal(uint16_t val); }; } // namespace dwin } // namespace iflytop \ No newline at end of file