优化LCD显示

This commit is contained in:
gb 2024-02-19 10:51:17 +08:00
parent 2a64a5073e
commit 9ba7447d07
5 changed files with 127 additions and 18 deletions

View File

@ -506,6 +506,12 @@ static unsigned char ascii_table_5x8[95][5] = {
Lcd::Lcd() : spi_sck(51), spi_sda(72), spi_cs(154), spi_reset(150), spi_rs(156),COM_BOOT0(153) Lcd::Lcd() : spi_sck(51), spi_sda(72), spi_cs(154), spi_reset(150), spi_rs(156),COM_BOOT0(153)
{ {
for(auto& v: line_field_)
{
v.x = 0;
v.w = LCD_WIDTH;
}
printf("Lcd()\n"); printf("Lcd()\n");
write_dev(IOEXPORTPATH,51); write_dev(IOEXPORTPATH,51);
write_dev(IOEXPORTPATH,72); write_dev(IOEXPORTPATH,72);
@ -837,6 +843,31 @@ void Lcd::clear(int x, int y, int w, int h)
write_end(); write_end();
} }
} }
void Lcd::clear_pages(int* page_inds, int count)
{
static int ind[LCD_HEIGHT / LCD_LINE_PER_PAGE] = {0};
if(ind[1] == 0)
{
for(int i = 0; i < _countof(ind); ++i)
ind[i] = i;
}
if(page_inds == nullptr || count == 0)
{
page_inds = ind;
count = _countof(ind);
}
for(int i = 0; i < count; ++i)
{
go_to(page_inds[i], line_field_[page_inds[i]].x);
write_before();
set_data_type(true);
for(int c = 0; c < line_field_[page_inds[i]].w; ++c)
write_char(0);
write_end();
}
}
void Lcd::write_line(uint8_t** data, uint8_t cnt, int x, int y, uint8_t mask) void Lcd::write_line(uint8_t** data, uint8_t cnt, int x, int y, uint8_t mask)
{ {
uint8_t *ptr[16] = {0}, uint8_t *ptr[16] = {0},
@ -848,7 +879,12 @@ void Lcd::write_line(uint8_t** data, uint8_t cnt, int x, int y, uint8_t mask)
for(int r = 0; r < data[0][1] / LCD_LINE_PER_PAGE; ++r) for(int r = 0; r < data[0][1] / LCD_LINE_PER_PAGE; ++r)
{ {
go_to(y / LCD_LINE_PER_PAGE + r, x); int page = y / LCD_LINE_PER_PAGE + r, w = 0;
if(line_field_[page].x > x)
line_field_[page].x = x;
go_to(page, x);
write_before(); write_before();
set_data_type(true); set_data_type(true);
@ -856,11 +892,61 @@ void Lcd::write_line(uint8_t** data, uint8_t cnt, int x, int y, uint8_t mask)
{ {
for(int c = 0; c < data[ind][0]; ++c) for(int c = 0; c < data[ind][0]; ++c)
{ {
w++;
write_char(*ptr[ind]++, mask); write_char(*ptr[ind]++, mask);
} }
write_char(0, mask); write_char(0, mask);
w++;
} }
write_end(); write_end();
if(line_field_[page].x + line_field_[page].w < x + w)
line_field_[page].w = x + w - line_field_[page].x;
}
}
void Lcd::write_whole_line(uint8_t** data, uint8_t cnt, int x, int y, uint8_t mask)
{
uint8_t *ptr[16] = {0},
blank[Lcd::LCD_WIDTH] = {0},
over = 0;
for(int i = 0; i < cnt && i < _countof(ptr); ++i)
ptr[i] = data[i] + 2;
for(int r = 0; r < data[0][1] / LCD_LINE_PER_PAGE; ++r)
{
int page = y / LCD_LINE_PER_PAGE + r, w = 0,
start = x <= line_field_[page].x ? x : line_field_[page].x,
end = line_field_[page].x + line_field_[page].w,
blank = x - start;
line_field_[page].x = x;
go_to(page, start);
write_before();
set_data_type(true);
// clear previous bits ...
for(int space = 0; space < blank; ++space)
write_char(0);
for(int ind = 0; ind < cnt; ++ind)
{
for(int c = 0; c < data[ind][0]; ++c)
{
w++;
write_char(*ptr[ind]++, mask);
}
write_char(0, mask);
w++;
}
// clear rear bits ...
end -= x + w;
for(int space = 0; space < end; ++space)
write_char(0);
line_field_[page].w = x + w - line_field_[page].x;
write_end();
} }
} }

View File

@ -69,7 +69,9 @@ public:
void go_to(uint8_t page, uint8_t col); void go_to(uint8_t page, uint8_t col);
void write(uint8_t val, bool data, uint8_t mask = 0); void write(uint8_t val, bool data, uint8_t mask = 0);
void write_line(uint8_t** data, uint8_t cnt, int x = 0, int y = 0, uint8_t mask = 0); void write_line(uint8_t** data, uint8_t cnt, int x = 0, int y = 0, uint8_t mask = 0);
void write_whole_line(uint8_t** data, uint8_t cnt, int x = 0, int y = 0, uint8_t mask = 0);
void clear(int x = 0, int y = 0, int w = -1, int h = -1); void clear(int x = 0, int y = 0, int w = -1, int h = -1);
void clear_pages(int* page_inds = nullptr, int count = 0);
private: private:
void set_data_type(bool data); void set_data_type(bool data);
@ -77,6 +79,13 @@ private:
void write_char(uint8_t val, uint8_t mask = 0); void write_char(uint8_t val, uint8_t mask = 0);
void write_end(void); void write_end(void);
private:
typedef struct _page_range
{
int x;
int w;
}PAGERANGE;
PAGERANGE line_field_[LCD_HEIGHT / LCD_LINE_PER_PAGE];
}; };

View File

@ -403,7 +403,7 @@ static uint8_t qiaoting[] = {128, 32
} }
}; };
#define TEST_PLATFORM_EVENT // #define TEST_PLATFORM_EVENT
#ifdef TEST_PLATFORM_EVENT #ifdef TEST_PLATFORM_EVENT
platform_event to__("to"); platform_event to__("to");
#endif #endif
@ -488,11 +488,13 @@ ui_mgr::ui_mgr() : disp_data_("lcd-msg")
paper_total_ = 0; paper_total_ = 0;
memset(&dd, 0, sizeof(dd)); memset(&dd, 0, sizeof(dd));
dd.cnt = dd.mask = -1; dd.cnt = dd.mask = -1;
dd.method = DISP_METHOD_CLEAR;
disp_data_.save(dd, true); disp_data_.save(dd, true);
dd.mask = 0; dd.mask = 0;
dd.cnt = custom_font::get_string_font(pack->data[0] == devui::SCAN_NORMAL ? WORDS_STATUS_SCANNING_NORMAL : WORDS_STATUS_SCANNING_COUNT, dd.ptr); dd.cnt = custom_font::get_string_font(pack->data[0] == devui::SCAN_NORMAL ? WORDS_STATUS_SCANNING_NORMAL : WORDS_STATUS_SCANNING_COUNT, dd.ptr);
hold_pos_.x = dd.ptr[0][0] * 1; hold_pos_.x = dd.ptr[0][0] * 1;
hold_pos_.y = dd.ptr[0][1]; hold_pos_.y = dd.ptr[0][1];
dd.method = DISP_METHOD_WHOLE_LINE;
disp_data_.save(dd, true); disp_data_.save(dd, true);
} }
} }
@ -513,6 +515,7 @@ ui_mgr::ui_mgr() : disp_data_("lcd-msg")
sprintf(num, "%03d", paper_cnt_); sprintf(num, "%03d", paper_cnt_);
dd.x = hold_pos_.x; dd.x = hold_pos_.x;
dd.y = hold_pos_.y; dd.y = hold_pos_.y;
dd.method = DISP_METHOD_PART_LINE;
dd.cnt = custom_font::get_string_font(num, dd.ptr); dd.cnt = custom_font::get_string_font(num, dd.ptr);
cnt = disp_data_.save(dd, true); cnt = disp_data_.save(dd, true);
@ -692,10 +695,12 @@ void ui_mgr::init(void)
memset(&dd, 0, sizeof(dd)); memset(&dd, 0, sizeof(dd));
dd.cnt = dd.mask = -1; dd.cnt = dd.mask = -1;
dd.method = DISP_METHOD_CLEAR;
disp_data_.save(dd, true); disp_data_.save(dd, true);
dd.mask = 0; dd.mask = 0;
dd.cnt = custom_font::get_string_font(WORDS_MENU_COUNT_MODE, dd.ptr); dd.cnt = custom_font::get_string_font(WORDS_MENU_COUNT_MODE, dd.ptr);
dd.method = DISP_METHOD_WHOLE_LINE;
disp_data_.save(dd, true); disp_data_.save(dd, true);
dd.y = dd.ptr[0][1]; dd.y = dd.ptr[0][1];
@ -705,6 +710,7 @@ void ui_mgr::init(void)
hold_pos_.x += dd.ptr[i][0] + 1; hold_pos_.x += dd.ptr[i][0] + 1;
hold_pos_.y = dd.y; hold_pos_.y = dd.y;
hold_pos_.x += 2; hold_pos_.x += 2;
dd.method = DISP_METHOD_PART_LINE;
disp_data_.save(dd, true); disp_data_.save(dd, true);
devui::send_message(devui::UI_CMD_COUNT_PAPER); devui::send_message(devui::UI_CMD_COUNT_PAPER);
@ -736,11 +742,12 @@ void ui_mgr::init(void)
DISPDATA dd; DISPDATA dd;
memset(&dd, 0, sizeof(dd)); memset(&dd, 0, sizeof(dd));
dd.cnt = dd.mask = -1; // dd.cnt = dd.mask = -1;
disp_data_.save(dd, true); // disp_data_.save(dd, true);
dd.mask = 0; dd.mask = 0;
dd.cnt = custom_font::get_string_font(WORDS_MENU_HISTORY_COUNT, dd.ptr); dd.cnt = custom_font::get_string_font(WORDS_MENU_HISTORY_COUNT, dd.ptr);
dd.method = DISP_METHOD_WHOLE_LINE;
disp_data_.save(dd, true); disp_data_.save(dd, true);
dd.y = dd.ptr[0][1]; dd.y = dd.ptr[0][1];
@ -760,11 +767,12 @@ void ui_mgr::init(void)
char cnt[40] = {0}; char cnt[40] = {0};
memset(&dd, 0, sizeof(dd)); memset(&dd, 0, sizeof(dd));
dd.cnt = dd.mask = -1; // dd.cnt = dd.mask = -1;
disp_data_.save(dd, true); // disp_data_.save(dd, true);
dd.mask = 0; dd.mask = 0;
dd.cnt = custom_font::get_string_font(WORDS_MENU_ROLLER_COUNT, dd.ptr); dd.cnt = custom_font::get_string_font(WORDS_MENU_ROLLER_COUNT, dd.ptr);
dd.method = DISP_METHOD_WHOLE_LINE;
disp_data_.save(dd, true); disp_data_.save(dd, true);
dd.y = dd.ptr[0][1]; dd.y = dd.ptr[0][1];
@ -851,6 +859,7 @@ void ui_mgr::init(void)
dd.y = 0; dd.y = 0;
dd.cnt = 1; dd.cnt = 1;
dd.ptr[0] = welcome::get_current_pic(); dd.ptr[0] = welcome::get_current_pic();
dd.method = DISP_METHOD_WHOLE_LINE;
disp_data_.save(dd, true); disp_data_.save(dd, true);
return false; return false;
@ -902,15 +911,11 @@ void ui_mgr::refresh_lcd(bool cur_at_top)
DISPDATA dd; DISPDATA dd;
memset(&dd, 0, sizeof(dd)); memset(&dd, 0, sizeof(dd));
if(i == 0)
{
dd.cnt = dd.mask = -1;
disp_data_.save(dd, true);
}
dd.mask = i == sel ? 0x0ff : 0; dd.mask = i == sel ? 0x0ff : 0;
dd.x = disp[i].find(WORDS_MENU_SELECTED) == 0 ? 0 : font_size_.cx; dd.x = disp[i].find(WORDS_MENU_SELECTED) == 0 ? 0 : font_size_.cx;
dd.y = rows; dd.y = rows;
dd.cnt = custom_font::get_string_font(disp[i].c_str(), dd.ptr); dd.cnt = custom_font::get_string_font(disp[i].c_str(), dd.ptr);
dd.method = DISP_METHOD_WHOLE_LINE;
cur = disp_data_.save(dd, true); cur = disp_data_.save(dd, true);
rows += font_size_.cy; rows += font_size_.cy;
} }
@ -963,10 +968,12 @@ void ui_mgr::thread_display(void)
{ {
if(disp_data_.take(dd, true, SEC_2_MS(wait))) if(disp_data_.take(dd, true, SEC_2_MS(wait)))
{ {
if(dd.ptr[0]) if(dd.method == DISP_METHOD_PART_LINE)
lcd_->write_line(dd.ptr, dd.cnt, dd.x, dd.y, dd.mask); lcd_->write_line(dd.ptr, dd.cnt, dd.x, dd.y, dd.mask);
else else if(dd.method == DISP_METHOD_CLEAR)
lcd_->clear(dd.x, dd.y, dd.cnt, dd.mask); lcd_->clear(dd.x, dd.y, dd.cnt, dd.mask);
else if(dd.method == DISP_METHOD_WHOLE_LINE)
lcd_->write_whole_line(dd.ptr, dd.cnt, dd.x, dd.y, dd.mask);
wait = 6; wait = 6;
} }
else if(ready_enable_) else if(ready_enable_)
@ -981,9 +988,9 @@ void ui_mgr::display_ready(void)
set_ready_status_enabled(false); set_ready_status_enabled(false);
menu_mode_ = false; menu_mode_ = false;
lcd_->clear(); // lcd_->clear();
lcd_->write_line(ready_.ptr, ready_.cnt, ready_.x, ready_.y, ready_.mask); lcd_->write_whole_line(ready_.ptr, ready_.cnt, ready_.x, ready_.y, ready_.mask);
} }
void ui_mgr::set_ready_status_enabled(bool enable) void ui_mgr::set_ready_status_enabled(bool enable)
{ {

View File

@ -282,10 +282,17 @@ class ui_mgr : public refer
void move_to(bool next); void move_to(bool next);
void enter(void); void enter(void);
enum dispaly_method
{
DISP_METHOD_CLEAR = 0,
DISP_METHOD_PART_LINE,
DISP_METHOD_WHOLE_LINE,
};
typedef struct _disp_data typedef struct _disp_data
{ {
uint8_t x; uint8_t x;
uint8_t y; uint8_t y : 6;
uint8_t method : 2;
uint8_t cnt; // clear width when ptr[0] == nullptr uint8_t cnt; // clear width when ptr[0] == nullptr
uint8_t mask; // clear height when ptr[0] == nullptr uint8_t mask; // clear height when ptr[0] == nullptr
uint8_t *ptr[16]; uint8_t *ptr[16];

View File

@ -60,8 +60,8 @@ add_packagedirs("sdk")
add_defines("BUILD_AS_DEVICE") add_defines("BUILD_AS_DEVICE")
add_defines("VER_MAIN=2") add_defines("VER_MAIN=2")
add_defines("VER_FAMILY=200") add_defines("VER_FAMILY=200")
add_defines("VER_DATE=20240218") add_defines("VER_DATE=20240219")
add_defines("VER_BUILD=20") add_defines("VER_BUILD=2")
target("conf") target("conf")
set_kind("phony") set_kind("phony")