diff --git a/components/dwin/dwin_ram_manager.cpp b/components/dwin/dwin_ram_manager.cpp index 19a8d21..7d57ca5 100644 --- a/components/dwin/dwin_ram_manager.cpp +++ b/components/dwin/dwin_ram_manager.cpp @@ -5,13 +5,34 @@ using namespace iflytop; using namespace iflytop::dwin; -void DwinRamManager::init(uint32_t startadd, uint32_t endadd) { +void DwinRamManager::init(uint32_t startadd, uint32_t eachsize, uint32_t number) { + // this->startadd = startadd; + // this->endadd = endadd; + // this->curadd = startadd; + // this->eachsize = eachsize; + // if (this->eachsize <= 0) { + // this->eachsize = 1; + // } + + ZASSERT(eachsize != 0); this->startadd = startadd; - this->endadd = endadd; + this->eachsize = eachsize; + this->endadd = startadd + eachsize * number; this->curadd = startadd; } -uint16_t DwinRamManager::alloc(uint32_t eachsize) { +uint16_t DwinRamManager::alloc(int niterm) { + int allocsize = niterm * eachsize; + if (curadd + allocsize > endadd) { + ZASSERT(false); + return 0xffff; + } + uint16_t ret = curadd; + curadd += allocsize; + return ret; +} + +uint16_t DwinRamManager::alloc() { if (curadd + eachsize > endadd) { ZASSERT(false); return 0xffff; @@ -21,5 +42,5 @@ uint16_t DwinRamManager::alloc(uint32_t eachsize) { return ret; } -uint16_t DwinRamManager::remainsize(uint32_t eachsize) { return (endadd - curadd) / eachsize; } -uint16_t DwinRamManager::totalsize(uint32_t eachsize) { return (endadd - startadd) / eachsize; } +uint16_t DwinRamManager::remainsize() { return (endadd - curadd) / eachsize; } +uint16_t DwinRamManager::totalsize() { return (endadd - startadd) / eachsize; } diff --git a/components/dwin/dwin_ram_manager.hpp b/components/dwin/dwin_ram_manager.hpp index 75f305d..f6dc30d 100644 --- a/components/dwin/dwin_ram_manager.hpp +++ b/components/dwin/dwin_ram_manager.hpp @@ -9,13 +9,16 @@ class DwinRamManager { uint32_t startadd = 0; uint32_t endadd = 0; uint32_t curadd = 0; + uint32_t eachsize = 0; public: - void init(uint32_t startadd, uint32_t endadd); - uint16_t alloc(uint32_t eachsize); - uint16_t remainsize(uint32_t eachsize); - uint16_t totalsize(uint32_t eachsize); - + DwinRamManager() {} + DwinRamManager(uint32_t startadd, uint32_t eachsize, uint32_t number) { init(startadd, eachsize, number); } + void init(uint32_t startadd, uint32_t eachsize, uint32_t number); + uint16_t alloc(); + uint16_t alloc(int niterm); + uint16_t remainsize(); + uint16_t totalsize(); }; } // namespace dwin diff --git a/components/dwin/dwin_screen.cpp b/components/dwin/dwin_screen.cpp index bf4cd3b..1f3ccb3 100644 --- a/components/dwin/dwin_screen.cpp +++ b/components/dwin/dwin_screen.cpp @@ -2,6 +2,7 @@ #include +#include namespace iflytop { namespace dwin { DwinScreen g_dwinScreen; @@ -10,14 +11,16 @@ DwinScreen g_dwinScreen; using namespace iflytop; using namespace iflytop::dwin; +using namespace std; #define TAG "dwin" DwinScreen& DwinScreen::ins() { return g_dwinScreen; } -void DwinScreen::init(UART_HandleTypeDef* huart, DwinScreenCfg dwcfg) { +void DwinScreen::init(UART_HandleTypeDef* huart, map& rammanager) { m_huart = huart; - m_dwcfg = dwcfg; + // m_dwcfg = dwcfg; + m_rammanager_map = rammanager; ZUART::cfg_t cfg; cfg.huart = m_huart; cfg.name = "DwinScreenUart"; @@ -37,31 +40,41 @@ void DwinScreen::init(UART_HandleTypeDef* huart, DwinScreenCfg dwcfg) { 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); + // m_rammanager.init(dwcfg.freeRawStartAddr, dwcfg.freeRawEndAddr); + // m_textDisplayerManager.init(dwcfg.textDisplayerStartAddr, dwcfg.textDisplayerEndAddr); + // m_varIconManager.init(dwcfg.varIconStartAddr, dwcfg.varIconEndAddr); dumpram(); } void DwinScreen::dumpram() { - ZLOGI(TAG, "ram :(%d/%d)", m_rammanager.totalsize(1) - m_rammanager.remainsize(1), m_rammanager.totalsize(1)); - ZLOGI(TAG, "textDisplayer :(%d/%d)", - m_textDisplayerManager.totalsize(m_dwcfg.textDisplayerSize) - m_textDisplayerManager.remainsize(m_dwcfg.textDisplayerSize), - m_textDisplayerManager.totalsize(m_dwcfg.textDisplayerSize)); - ZLOGI(TAG, "varIcon :(%d/%d)", m_varIconManager.totalsize(m_dwcfg.varIconSize) - m_varIconManager.remainsize(m_dwcfg.varIconSize), - m_varIconManager.totalsize(m_dwcfg.varIconSize)); + for (auto& each : m_rammanager_map) { + ZLOGI(TAG, "%-20s:(%d/%d)", each.first.c_str(), each.second->totalsize() - each.second->remainsize(), each.second->totalsize()); + } } -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_free_ram(uint16_t size) { + auto item = m_rammanager_map.find(FREE_RAM_MAP); + ZASSERT(item != m_rammanager_map.end()); + return item->second->alloc(size); +} +uint16_t DwinScreen::alloc_one_text_displayer() { + auto item = m_rammanager_map.find(TEXT_DISPLAYER_RAM_MAP); + ZASSERT(item != m_rammanager_map.end()); + return item->second->alloc(); +} uint16_t DwinScreen::alloc_one_var_icon() { - uint16_t addr = m_varIconManager.alloc(m_dwcfg.varIconSize); - return addr; + auto item = m_rammanager_map.find(VAR_ICON_RAM_MAP); + ZASSERT(item != m_rammanager_map.end()); + return item->second->alloc(); +} +uint16_t DwinScreen::alloc_from(const char* whichrammanager, uint16_t size) { + auto item = m_rammanager_map.find(whichrammanager); + if (item == m_rammanager_map.end()) { + ZLOGE(TAG, "alloc_from %s failed, not found", whichrammanager); + ZASSERT(false); + } + return item->second->alloc(size); } - -uint16_t DwinScreen::mem_free_ram_remain() { return m_rammanager.remainsize(1); } -uint16_t DwinScreen::mem_one_text_displayer_remain() { return m_textDisplayerManager.remainsize(m_dwcfg.textDisplayerSize); } -uint16_t DwinScreen::mem_one_var_icon_remain() { return m_varIconManager.remainsize(m_dwcfg.varIconSize); } void DwinScreen::clearrxcache() { CriticalContext cc; diff --git a/components/dwin/dwin_screen.hpp b/components/dwin/dwin_screen.hpp index 52afc2c..add0c76 100644 --- a/components/dwin/dwin_screen.hpp +++ b/components/dwin/dwin_screen.hpp @@ -1,6 +1,9 @@ #pragma once #include "dwin_ram_manager.hpp" // +#include +#include + #include "sdk/os/zos.hpp" namespace iflytop { @@ -39,31 +42,41 @@ class TxContext { 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 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; +// }; + +#define FREE_RAM_MAP "FreeRamRamMap" +#define TEXT_DISPLAYER_RAM_MAP "TextDisplayerRamMap" +#define VAR_ICON_RAM_MAP "VarIconRamMap" + +// typedef enum { +// kdw_freeram = 1, +// kdw_textdisplayer = 2, +// kdw_varicon = 3, +// kdw_ +// } dwin_ram_type_t; + class DwinScreen { public: private: - DwinScreenCfg m_dwcfg; + // DwinScreenCfg m_dwcfg; UART_HandleTypeDef* m_huart; ZUART m_uarthandler; @@ -76,6 +89,8 @@ class DwinScreen { DwinRamManager m_textDisplayerManager; // 文本变量组件管理器 DwinRamManager m_varIconManager; // 图形变量组件管理器 + map m_rammanager_map; + bool enablecrc = false; public: @@ -86,7 +101,7 @@ class DwinScreen { * @param baudrate */ static DwinScreen& ins(); - void init(UART_HandleTypeDef* huart, DwinScreenCfg cfg); + void init(UART_HandleTypeDef* huart, map& rammanager); public: bool set_page(uint16_t pageid); @@ -100,10 +115,7 @@ class DwinScreen { uint16_t alloc_free_ram(uint16_t size); uint16_t alloc_one_text_displayer(); uint16_t alloc_one_var_icon(); - - uint16_t mem_free_ram_remain(); - uint16_t mem_one_text_displayer_remain(); - uint16_t mem_one_var_icon_remain(); + uint16_t alloc_from(const char* whichrammanager, uint16_t size); void dumpram(); diff --git a/components/dwin/var_icon.cpp b/components/dwin/var_icon.cpp index 25134fc..a4ea72e 100644 --- a/components/dwin/var_icon.cpp +++ b/components/dwin/var_icon.cpp @@ -62,6 +62,12 @@ void VarIcon::initcfg(uint16_t valpointerAdd, uint16_t initval, uint16_t posx, u setVal(initval); } +void VarIcon::setpos(uint16_t posx, uint16_t posy) { + m_descript.m_PosX = posx; + m_descript.m_PosY = posy; + flushcfg(); +} + void VarIcon::dumpinfo() { readcfg(); printf("m_VP = %04x\n", m_descript.m_VP); diff --git a/components/dwin/var_icon.hpp b/components/dwin/var_icon.hpp index 9def632..5a8fb80 100644 --- a/components/dwin/var_icon.hpp +++ b/components/dwin/var_icon.hpp @@ -42,6 +42,8 @@ class VarIcon { bool init(DwinScreen *dwin_screen); void initcfg(uint16_t valpointerAdd, uint16_t initval, uint16_t posx, uint16_t posy, uint16_t iconlib, uint16_t iconmin, uint16_t iconmax); + void setpos(uint16_t posx, uint16_t posy); + /** * @brief *