#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 valsize) { uint16_t descript_add = dwin_screen->alloc_one_text_displayer(); uint16_t val_add = dwin_screen->alloc_free_ram(valsize); return init(dwin_screen, descript_add, val_add); } 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() {}