KT24-1110_65E-HA-651B/apps/common/ui/lcd_simple/ui.c

316 lines
8.4 KiB
C
Raw Normal View History

2024-11-10 10:44:17 +00:00
#include "app_config.h"
#include "includes.h"
#include "system/includes.h"
#include "fs/fs.h"
#include "ui/ui_simple/ui_res.h"
#include "ui/lcd_simple/ui.h"
#include "key_event_deal.h"
#if (TCFG_UI_ENABLE&&(CONFIG_UI_STYLE == STYLE_UI_SIMPLE))
s8 MenuItemSelectOnNum; //当前屏幕活动page序号:0--(MENUITEMSUMPERSCR-1)
s8 CurrentScreenNum; //当前所处屏幕数,从0序号开始
u8 NeedScreenSumViaItem; //菜单项目总数将占用屏幕的屏数
u8 LaseScreenRemainMenuItem; //最后一屏只需显示的菜单项目数
#define LCDPAGE 8
#define LCDCOLUMN 128
#define SCR_WIDTH LCDCOLUMN
#define SCR_HEIGHT (LCDPAGE*8)
extern u8 LCDBuff[8][128];
extern u8 LanguageMode ; //语言模式ID号
//滑动块//
u8 SetSlider(u8 start_x, u8 start_y, u8 length)
{
start_x = start_x;
length = length;
// u8 x;
// if( (start_x>SCR_WIDTH-length+2) || (start_y>LCDPAGE) || (length>SLIDERLENGTH))
// return false;
//
// LCDBuff[start_y][start_x]=0x3C;
// for(x=start_x+1; x<start_x+1+length+1; x++)
// {
// LCDBuff[start_y][x] = 0x24;
// }
// LCDBuff[start_y][start_x+length+1]=0x3C;
// return true;
if (ResShowPic(SLIDER, 0, start_y * 8)) {
return true;
} else {
return false;
}
}
u8 SetSlideBlock(u8 Start_x, u8 Start_y)
{
u8 SlideBlockPixelBuf[4] = {0x7E, 0xFF, 0xFF, 0x7E};
u8 x;
if ((Start_x > SCR_WIDTH - 4) || (Start_y > LCDPAGE)) {
return false;
}
for (x = Start_x; x < Start_x + 4; x++) {
LCDBuff[Start_y][x] = SlideBlockPixelBuf[x - Start_x];
}
return true;
}
u8 SetSlideBlock1(u8 Start_x, u8 Start_y)
{
if (ResShowPic(SLIDER_P, Start_x, Start_y * 8)) {
return true;
} else {
return false;
}
}
u8 draw_slider(s8 currentpos, u8 slider_y_pos, u8 sliderlength)
{
if ((currentpos > sliderlength) || (slider_y_pos > LCDPAGE) || (sliderlength > SLIDERLENGTH)) { //判断滑动条是否超出屏幕范围
return false;
}
if (currentpos <= 0) { //界限判断
currentpos = 0;
} else if (currentpos > SLIDERLENGTH) {
currentpos = SLIDERLENGTH;
}
//ClearLcdBuf_Page(slider_y_pos,1);
clear_lcd_area(slider_y_pos, slider_y_pos + 1);
SetSlider((SCR_WIDTH - sliderlength) / 2, slider_y_pos, sliderlength);
SetSlideBlock1((SCR_WIDTH - sliderlength) / 2 + currentpos, slider_y_pos);
draw_lcd(slider_y_pos, slider_y_pos + 1);
return true;
}
u8 UI_Slider(FUN gslider)
{
int msg[16] = {0};
struct sys_event *event = NULL;
u8 currentpos;
u8 autoruntime = SLIDER_NOMOVE_TIMEEXIT;
clear_lcd();
currentpos = gslider(UI_SLIDER_CURR_VALUE);
draw_slider(currentpos, 5, SLIDERLENGTH);
draw_lcd(0, LCDPAGE);
while (1) {
int ret = os_taskq_pend(NULL, msg, ARRAY_SIZE(msg)); //500ms_reflash
if (ret != OS_TASKQ) {
continue;
}
if (msg[0] != 0) {
continue;
}
switch (msg[1]) { //action
case KEY_OK:
return 0x00;
case KEY_UP: //HOLD
autoruntime = SLIDER_NOMOVE_TIMEEXIT;
clear_lcd_area(1, 4);
currentpos = gslider(UI_SLIDER_DEC);
draw_slider(currentpos, 5, SLIDERLENGTH);
draw_lcd(0, 8);
break;
case KEY_DOWN: //HOLD
autoruntime = SLIDER_NOMOVE_TIMEEXIT;
clear_lcd_area(1, 4);
currentpos = gslider(UI_SLIDER_INC);
draw_slider(currentpos, 5, SLIDERLENGTH);
draw_lcd(0, 8);
break;
case MSG_HALF_SECOND:
autoruntime-- ;
if (autoruntime == 0) {
return currentpos ;
//return 0xff;
}
break;
default:
break;
}
}
}
//进度条//
u8 UI_Progress(u8 currentpos, u8 progress_y_pos, u8 progresslength)
{
u8 i;
if ((currentpos > progresslength) || (progress_y_pos > LCDPAGE) || (progresslength > 100)) {
return false;
}
memset(&LCDBuff[0][0], 0x00, sizeof(LCDBuff));
//while(1)
{
SetProgress((SCR_WIDTH - progresslength) / 2, progress_y_pos, progresslength);
for (i = 1; i < currentpos + 1; i++) {
LCDBuff[progress_y_pos][(SCR_WIDTH - progresslength) / 2 + i] = 0xFF;
}
draw_lcd(0, LCDPAGE);
}
return true;
}
u8 SetProgress(u8 start_x, u8 start_y, u8 length)
{
u8 x;
if ((start_x > SCR_WIDTH - length + 2) || (start_y > LCDPAGE) || (length > 100)) {
return false;
}
LCDBuff[start_y][start_x] = 0x7E;
for (x = start_x + 1; x < start_x + 1 + length + 1; x++) {
LCDBuff[start_y][x] = 0x81;
}
LCDBuff[start_y][start_x + length + 1] = 0x7E;
return true;
}
void Scrol_String(u16 StringID)
{
res_infor_t stringinfor;
u8 yy;
u32 sdimageaddr = 0;
static u32 ScrolOffset = 0;
//putchar(0x30+StringID);
//u16 StringID = menulist.ItemString[menulist.ActiveItemNum-1];
void *file = ResGetFp();
if (!file) {
return;
}
// if(!IsScrolString) return;
fseek(file, sizeof(res_head_t) + 2 * sizeof(res_entry_t) + BMPID_SUM * sizeof(res_infor_t) + ((StringID - 1)*LANGUAGEID_SUM + LanguageMode - 1)*sizeof(res_infor_t), SEEK_SET);
fread(file, (u8 *)&stringinfor, sizeof(res_infor_t));
stringinfor.dwOffset = ntohl(stringinfor.dwOffset); //res文件保存为大端模式,PC为小端模式,故加此三句,单片机下应该不加此三句
stringinfor.wWidth = ntoh(stringinfor.wWidth);
sdimageaddr = stringinfor.dwOffset;
if (stringinfor.wWidth > SCR_WIDTH - MENUICONWIDTH - SCROLLBARWIDTH) { //字符串图片宽度 > 屏幕所能显示最大宽度(减去菜单Icon占用的宽度)
//需要进行滚屏处理
for (yy = 0; yy < MENUITEMHEIGHT / 8 ; yy++) {
fseek(file, sdimageaddr + ScrolOffset, SEEK_SET);
fread(file, &LCDBuff[MenuItemSelectOnNum * 2 + yy][MENUICONWIDTH], (SCR_WIDTH - MENUICONWIDTH - SCROLLBARWIDTH));
sdimageaddr += stringinfor.wWidth;
}
ScrolOffset += 1;
if (ScrolOffset + (SCR_WIDTH - MENUICONWIDTH - SCROLLBARWIDTH) >= stringinfor.wWidth) {
ScrolOffset = 0;
}
//TRACE("sdimageaddr: %d , ScrolOffset: %d \n", sdimageaddr, ScrolOffset );
UI_MenuSelectOn(MenuItemSelectOnNum);
draw_lcd(0, LCDPAGE);
}
// else
// IsScrolString = false;
}
u8 SetScrollBar(u8 Start_x)
{
u8 x, y;
u8 ScrollBarPixelBuf[8][6] = { 0xFC, 0x02, 0x01, 0x01, 0x02, 0xFC,
0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF,
0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF,
0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF,
0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF,
0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF,
0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF,
0x3F, 0x40, 0x80, 0x80, 0x40, 0x3F
};
if (Start_x > SCR_WIDTH - 6) { //6为滚动条的象ç´ 宽度
return false;
}
for (x = Start_x; x < Start_x + 6; x++) {
for (y = 0; y < 8; y++) {
LCDBuff[y][x] = ScrollBarPixelBuf[y][x - Start_x];
}
}
return true;
}
u8 TurnPixelReverse_Page(u8 startpage, u8 pagelen)
{
u8 hnum, l;
if ((startpage > 8) || (pagelen > 8)) {
return false;
}
for (hnum = startpage; hnum < startpage + pagelen; hnum = hnum + 1) {
for (l = 0; l < SCR_WIDTH; l++) {
LCDBuff[hnum][l] = ~LCDBuff[hnum][l];
}
}
return true;
}
u8 TurnPixelReverse_Rect(u8 left, u8 top, u8 right, u8 bottom)
{
//left、right取值范围0--(SCR_WIDTH-1) ; top、bottom取值范围0--(SCR_HEIGHT/8-1)
u8 hnum, l;
if ((left > SCR_WIDTH) || (top > SCR_HEIGHT) || (left >= right) || (top >= bottom)) {
return false;
}
for (hnum = top; hnum < bottom + 1; hnum = hnum + 1) {
for (l = left; l < right + 1; l++) {
LCDBuff[hnum][l] = ~LCDBuff[hnum][l];
}
}
return true;
}
u8 ClearLcdBuf_Page(u8 startpage, u8 pagelen)
{
u8 hnum, l;
if ((startpage > 8) || (pagelen > 8)) {
return false;
}
for (hnum = startpage; hnum < startpage + pagelen; hnum = hnum + 1) {
for (l = 0; l < SCR_WIDTH; l++) {
LCDBuff[hnum][l] = 0x00;
}
}
return true;
}
#endif