📄 screen_obj_v1_00.c
字号:
#include "app_config.h"
#include "app_screen_obj.h"
so_obj_t so_obj[MAX_SCR_OBJ];
unsigned char layer[MAX_SCR_OBJ];
unsigned char last_obj_id = MAX_SCR_OBJ;
void ScrObjDraw(void) //draw active window from lowest layer to top layer
{
unsigned char obj_id;
int i;
for (i=MAX_SCR_OBJ-1; i>=0; i--)
{
obj_id = layer[i];
if (so_obj[obj_id].stat != SO_ST_OFF)
so_obj[obj_id].draw();
}
}
void ScrObjToTopLayer(unsigned char obj_id) //set this window to top and rearrange layer stack
{
unsigned char i;
unsigned char shift_flag = 0;
for (i=MAX_SCR_OBJ-1; i>0; i--)
{
if (layer[i] == obj_id)
{
shift_flag = 1;
}
if (shift_flag)
{
layer[i] = layer[i-1];
}
}
layer[0] = obj_id;
}
void ScrObjRemoveLayer(unsigned char obj_id)
{
unsigned char i;
unsigned char shift_flag = 0;
for (i=0; i<MAX_SCR_OBJ-1; i++)
{
if (layer[i] == obj_id)
{
shift_flag = 1;
}
if (shift_flag)
{
layer[i] = layer[i+1];
}
}
layer[MAX_SCR_OBJ - 1] = obj_id;
}
int ScrObjDo(so_pos_t ghpos,so_pos_t gvpos,pstatus_t p_stat) //return object id or -1 when nothing found
{
unsigned char i,obj_id;
unsigned short hmin,vmin,hmax,vmax;
so_pos_t lhpos,lvpos;
int found_obj_id = -1;
switch (p_stat)
{
case PST_DOWN : //find from top layer
for (i=0; i<MAX_SCR_OBJ; i++)
{
obj_id = layer[i];
if (so_obj[obj_id].stat != SO_ST_OFF)
{
hmin = so_obj[obj_id].horigin;
vmin = so_obj[obj_id].vorigin;
hmax = so_obj[obj_id].horigin + so_obj[obj_id].hsize;
vmax = so_obj[obj_id].vorigin + so_obj[obj_id].vsize;
if (hmax > SCREEN_HSIZE - 1)
hmax = SCREEN_HSIZE - 1;
if (vmax > SCREEN_VSIZE - 1)
vmax = SCREEN_VSIZE - 1;
if ((ghpos >= hmin) && (ghpos < hmax) && (gvpos >= vmin) && (gvpos < vmax))
{
lhpos = ghpos - hmin;
lvpos = gvpos - vmin;
if (!so_obj[obj_id].is_white(lhpos,lvpos))
{
so_obj[obj_id].do_(lhpos,lvpos,ghpos,gvpos,p_stat);
last_obj_id = obj_id;
found_obj_id = obj_id;
break;
}
}
}
}
break;
case PST_NOTFOUND :
found_obj_id = -1;
break;
default : //PST_HOLD and PST_UP -> use last top layer
if (last_obj_id != MAX_SCR_OBJ)
{
obj_id = last_obj_id;
hmin = so_obj[obj_id].horigin;
vmin = so_obj[obj_id].vorigin;
hmax = so_obj[obj_id].horigin + so_obj[obj_id].hsize;
vmax = so_obj[obj_id].vorigin + so_obj[obj_id].vsize;
if (hmax > SCREEN_HSIZE - 1)
hmax = SCREEN_HSIZE - 1;
if (vmax > SCREEN_VSIZE - 1)
vmax = SCREEN_VSIZE - 1;
lhpos = ghpos - hmin; //this can be negative value!!!
lvpos = gvpos - vmin; //this can be negative value!!!
so_obj[obj_id].do_(lhpos,lvpos,ghpos,gvpos,p_stat);
found_obj_id = last_obj_id;
}
if (p_stat == PST_UP)
{
last_obj_id = MAX_SCR_OBJ;
}
break;
}
return (found_obj_id);
}
void ScrObjInit(void (*first_screen_init_func)(void))
{
int i;
for (i=0; i<MAX_SCR_OBJ; i++)
{
layer[i] = i;
so_obj[i].stat = SO_ST_OFF;
}
//ScrObjFirstScreenInit();
first_screen_init_func();
//MP3ScreenInit();
ScrObjDraw();
}
void ScrObjTask100ms(void)
{
unsigned char i;
for (i=0; i<MAX_SCR_OBJ; i++)
{
if (so_obj[i].stat != SO_ST_OFF)
so_obj[i].task100ms();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -