From 8135678d4ac1936035ae82db1caefa6ad3acd355 Mon Sep 17 00:00:00 2001 From: zhaohe Date: Sun, 6 Aug 2023 19:30:00 +0800 Subject: [PATCH] update --- components/dwin/dwin.hpp | 4 ++ components/dwin/dwin_screen.cpp | 1 + components/dwin/dwin_screen.hpp | 3 +- components/dwin/text_displayer.cpp | 70 ++++++++++++++++++++++++ components/dwin/text_displayer.hpp | 109 +++++++++++++++++++++++++++++++++++++ components/dwin/var_icon.cpp | 56 +++++++++++++++++++ components/dwin/var_icon.hpp | 58 ++++++++++++++++++++ 7 files changed, 300 insertions(+), 1 deletion(-) create mode 100644 components/dwin/dwin.hpp create mode 100644 components/dwin/text_displayer.cpp create mode 100644 components/dwin/text_displayer.hpp create mode 100644 components/dwin/var_icon.cpp create mode 100644 components/dwin/var_icon.hpp diff --git a/components/dwin/dwin.hpp b/components/dwin/dwin.hpp new file mode 100644 index 0000000..93c3327 --- /dev/null +++ b/components/dwin/dwin.hpp @@ -0,0 +1,4 @@ +#pragma once +#include "dwin_screen.hpp" +#include "text_displayer.hpp" +#include "var_icon.hpp" \ No newline at end of file diff --git a/components/dwin/dwin_screen.cpp b/components/dwin/dwin_screen.cpp index c081e80..3fc6d6b 100644 --- a/components/dwin/dwin_screen.cpp +++ b/components/dwin/dwin_screen.cpp @@ -2,6 +2,7 @@ #include using namespace iflytop; +using namespace iflytop::dwin; #define TAG "dwin" diff --git a/components/dwin/dwin_screen.hpp b/components/dwin/dwin_screen.hpp index 300bbbf..0367a47 100644 --- a/components/dwin/dwin_screen.hpp +++ b/components/dwin/dwin_screen.hpp @@ -1,6 +1,7 @@ #pragma once #include "sdk\hal\zhal.hpp" namespace iflytop { +namespace dwin { using namespace std; /** @@ -92,5 +93,5 @@ 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/text_displayer.cpp b/components/dwin/text_displayer.cpp new file mode 100644 index 0000000..eae4c99 --- /dev/null +++ b/components/dwin/text_displayer.cpp @@ -0,0 +1,70 @@ +#include "text_displayer.hpp" + +#include +using namespace iflytop::dwin; +using namespace iflytop; +using namespace std; +#define DO(x) \ + if (!x) { \ + printf("do %s fail\n", #x); \ + return false; \ + } +static uint8_t txcache[256]; + +bool TextDisplayer::init(DwinScreen *dwin_screen, uint16_t descript_add, uint16_t val_add) { + // + m_dwin_screen = dwin_screen; + m_descript_add = descript_add; + printf("TextDisplayer init %04x\n", m_descript_add); + readcfg(); + if (val_add != 0) { + m_descript.VP = val_add; + flushcfg(); + } + return true; +} + +bool TextDisplayer::flushcfg() { return m_dwin_screen->write_varspace16_muti(m_descript_add, (uint16_t *)&m_descript, sizeof(m_descript) / 2, 100); } +bool TextDisplayer::readcfg() { return m_dwin_screen->read_varspace16_muti(m_descript_add, (uint16_t *)&m_descript, sizeof(m_descript) / 2, 100); } +void TextDisplayer::setFont(uint16_t EncodeMode, uint8_t font0id, uint8_t font1id, uint16_t frontxsize, uint16_t frontysize) { + m_descript.EncodeMode = EncodeMode; + m_descript.Font0ID = font0id; + m_descript.Font1ID = font1id; + m_descript.FontYDots = frontysize; + m_descript.FontXDots = frontxsize; + m_descript.TextLength = 256; +} +void TextDisplayer::setPos(uint16_t x, uint16_t y, uint16_t width, uint16_t hight) { + uint16_t startx = x; + uint16_t endx = x + width; + uint16_t starty = y; + uint16_t endy = y + hight; + + m_descript.PosX = x; + m_descript.PosY = y; + m_descript.Xs = x; + m_descript.Ys = y; + m_descript.Xe = endx; + m_descript.Ye = endy; +} +bool TextDisplayer::setTextLengthDirect(uint16_t len) { + DO(m_dwin_screen->write_varspace16(m_descript_add + 8, len, 100)); + return true; +} + +bool TextDisplayer::setVal(const char *val) { + memset(txcache, 0, sizeof(txcache)); + memcpy(txcache, val, strlen(val)); + DO(m_dwin_screen->write_varspace(m_descript.VP, txcache, strlen(val) + 2, 100)); + +#if 0 + uint16_t zero = 0; + setTextLengthDirect(0); + m_dwin_screen->write_varspace(m_descript.VP, (uint8_t *)val, strlen(val), 100); + setTextLengthDirect((uint16_t)strlen(val)); + m_descript.TextLength = (uint16_t)strlen(val); +#endif + return true; +} +void TextDisplayer::setColor(uint16_t color) { m_descript.Color = color; } +void TextDisplayer::dumpinfo() {} \ No newline at end of file diff --git a/components/dwin/text_displayer.hpp b/components/dwin/text_displayer.hpp new file mode 100644 index 0000000..1b7ecbf --- /dev/null +++ b/components/dwin/text_displayer.hpp @@ -0,0 +1,109 @@ +#pragma once + +#include "sdk\components\dwin\dwin_screen.hpp" +namespace iflytop { +namespace dwin { + +using namespace std; +/** + * @brief + * + * 0x00 *VP + * + */ + +/** + * + * 0x00: *VP 2 文本指针。 + * 0x01: (X,Y) 4 起始显示位置,显示字符串左上角坐标。 + * 0x03: Color 2 显示文本颜色。 + * 0x04: (xs,Ys)(xe,Ye) 8 文本框。 + * 0x08: Text_Length 2 显示字节数量,当遇到0xFFFF、0x0000或者显示到文本框尾将不再显示。 + * 0x09: Font0_ID(H) 1 编码方式为0x01-0x04时的ASII字符使用的字库位置。 + * 0x09: Font1_ID(L) 1 编码方式为0x00、0x05,以及0x01-0x04时的非ASCII字符使用的字库位置。 + * 0x0A: Font_x_Dots(H) 1 字体x方向点阵数(0x01-0x04模式,ASCII字符的x方向点阵数按照x/2计算)。 + * 0x0A: Font_Y_Dots(L) 1 字体Y方向点阵数。 + * 0x0B: Encode_Mode(H) 1 .7定义了文本显示的字符间距是否自动调整; + * .7=0 字符间距自动调整; + * .7=1字符间距不自动调整,字符宽度固定为设定的点阵数。 + * .6-.0定义了文本编码方式:0=8bit编码1=GB2312内码2=GBK 3=BIG5 4=SJIS 5=UNICODE + * 0x0B: HOR_Dis(L 1 字符水平间隔。 + * 0x0C: VER_Dis(H) 1 字符垂直间隔。 + * 0x0C: 未定义(L) 1 写0x00 + * + */ +#pragma pack(1) +typedef struct { + uint16_t VP; + uint16_t PosX; + uint16_t PosY; + uint16_t Color; + uint16_t Xs; + uint16_t Ys; + uint16_t Xe; + uint16_t Ye; + uint16_t TextLength; + + uint8_t Font1ID; + uint8_t Font0ID; + + uint8_t FontYDots; + uint8_t FontXDots; + + uint8_t LHORDis; + uint8_t EncodeMode; // [7:7] 0字符间距自动调整,1字符间距不自动调整 [6:0] 0=8bit编码1=GB2312内码2=GBK 3=BIG5 4=SJIS 5=UNICODE + + uint8_t mark; + uint8_t LVERDis; +} TextDisplayerDescript_t; +#pragma pack() + +typedef enum { + kcolor_red = 0xF800, + kcolor_black = 0x0000, + kcolor_white = 0xFFFF, + kcolor_grey = 0xc618, +} dwincolor_t; + +class TextDisplayer { + DwinScreen *m_dwin_screen = nullptr; + + uint16_t m_descript_add = 0; + TextDisplayerDescript_t m_descript; + + public: + bool init(DwinScreen *dwin_screen, uint16_t descript_add, uint16_t val_add); + /** + * @brief Set the Font object + * + * @param EncodeMode [7:7] 0字符间距自动调整,1字符间距不自动调整 [6:0] 0=8bit编码1=GB2312内码2=GBK 3=BIG5 4=SJIS 5=UNICODE + * @param font0id + * @param font1id + */ + void setFont(uint16_t EncodeMode, uint8_t font0id, uint8_t font1id, uint16_t frontxsize, uint16_t frontysize); + /** + * @brief Set the Pos object + * + * @param x + * @param y + * @param width 文本框宽度 + * @param hight 文本框高度 + */ + void setPos(uint16_t x, uint16_t y, uint16_t width, uint16_t hight); + /** + * @brief 设置文本 + * + * @param + */ + bool setVal(const char *val); + void setColor(uint16_t color); + + bool setTextLengthDirect(uint16_t len); + + public: + bool flushcfg(); + bool readcfg(); + void dumpinfo(); +}; +} // namespace dwin +} // namespace iflytop \ No newline at end of file diff --git a/components/dwin/var_icon.cpp b/components/dwin/var_icon.cpp new file mode 100644 index 0000000..059fe39 --- /dev/null +++ b/components/dwin/var_icon.cpp @@ -0,0 +1,56 @@ +#include "var_icon.hpp" +using namespace iflytop; +using namespace dwin; +#define DO(x) \ + if (!x) { \ + printf("do %s fail\n", #x); \ + return false; \ + } +static uint32_t s_VarIconNum = 0; + +bool VarIcon::flushcfg() { return m_dwin_screen->write_varspace16_muti(m_descript_add, (uint16_t *)&m_descript, sizeof(m_descript) / 2, 100); } +bool VarIcon::readcfg() { return m_dwin_screen->read_varspace16_muti(m_descript_add, (uint16_t *)&m_descript, sizeof(m_descript) / 2, 100); } + +bool VarIcon::init(DwinScreen *dwin_screen, uint16_t descript_add) { + // + m_dwin_screen = dwin_screen; + m_descript_add = descript_add; + s_VarIconNum++; + printf("VarIcon(%d) init %04x\n", s_VarIconNum, m_descript_add); + readcfg(); + return true; +} +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; + m_descript.m_PosY = posy; + m_descript.m_VMin = 0; + m_descript.m_VMax = iconmax - iconmin; + m_descript.m_IconMin = iconmin; + m_descript.m_IconMax = iconmax; + m_descript.m_IconLib = iconlib; + m_descript.m_Mode = 1; + m_descript.m_LayerMode = 0; + m_descript.m_ICONGamma = 0; + m_descript.m_PICGamma = 0; + m_descript.m_FilterSet = 0x3F; + flushcfg(); + setVal(initval); +} + +void VarIcon::dumpinfo() { + readcfg(); + printf("m_VP = %04x\n", m_descript.m_VP); + printf("m_PosX = %d\n", m_descript.m_PosX); + printf("m_PosY = %d\n", m_descript.m_PosY); + printf("m_VMin = %d\n", m_descript.m_VMin); + printf("m_VMax = %d\n", m_descript.m_VMax); + printf("m_IconMin = %d\n", m_descript.m_IconMin); + printf("m_IconMax = %d\n", m_descript.m_IconMax); + printf("m_IconLib = %d\n", m_descript.m_IconLib); + printf("m_Mode = %d\n", m_descript.m_Mode); + printf("m_LayerMode = %d\n", m_descript.m_LayerMode); + printf("m_ICONGamma = %d\n", m_descript.m_ICONGamma); + printf("m_PICGamma = %d\n", m_descript.m_PICGamma); + printf("m_FilterSet = %04x\n", m_descript.m_FilterSet); +} diff --git a/components/dwin/var_icon.hpp b/components/dwin/var_icon.hpp new file mode 100644 index 0000000..1559147 --- /dev/null +++ b/components/dwin/var_icon.hpp @@ -0,0 +1,58 @@ +#pragma once + +#include "sdk\components\dwin\dwin_screen.hpp" + +namespace iflytop { +namespace dwin { +using namespace std; + +#pragma pack(1) +typedef struct { + uint16_t m_VP = 0; + uint16_t m_PosX = 0; + uint16_t m_PosY = 0; + uint16_t m_VMin = 0; + uint16_t m_VMax = 0; + uint16_t m_IconMin = 0; + uint16_t m_IconMax = 0; + + uint8_t m_Mode = 0; + uint8_t m_IconLib = 0; + + uint8_t m_ICONGamma = 0; + uint8_t m_LayerMode = 0; + + uint8_t m_FilterSet = 0; + uint8_t m_PICGamma = 0; +} VarIconDescript_t; +#pragma pack() + +class VarIcon { + DwinScreen *m_dwin_screen = nullptr; + + uint16_t m_descript_add = 0; + VarIconDescript_t m_descript; + + 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); + + 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; + } + + VarIconDescript_t &getDescript() { return m_descript; } + + void dumpinfo(); + + public: +}; +} // namespace dwin +} // namespace iflytop \ No newline at end of file