写一个简单的桌面,汇总之前的项目
先叠几层甲:
该项目中很多功能和函数的实现方法肯定有更简单更优化的,本文章里的方法属于比较笨的那种,仅供新手初学者以及博主自己参考,文章中提供的代码及源文件难免会有疏忽、bug,仅供参考、学习、交流;除了正常的讨论问题、建议外,还请各位大佬键盘之下给我留点面子qaq
关于屏幕的显示和触控、图片的显示,可以参考之前的文章:关于GEC6818屏幕的驱动方法(显示屏、触摸屏) 本文章默认已经成功驱动屏幕。
2048源码:小项目:2048
播放器源码:小项目:音视频播放器
粤嵌实验箱为开发板系统自带的自启动的程序,这里作为桌面的附属应用(这下夺舍力)
桌面并没有添加应用的功能,写着玩的(
源码和图片素材会放到文章末尾,仅供参考。
思路其实很简单,将桌面绘制成图片,点击图标的地方启动对应的程序,退出后回到桌面
之前我写的2048和播放器,都设置了点击屏幕左上角退出,因此直接等待线程结束后回到桌面即可;如果没有的话,则需要在桌面里加入点击左上角(或者你自己设置的关闭按钮)杀掉应用进程线程
绘制界面:
桌面
当然,我是不打算也没能力写添加应用的功能的(
工程文件结构:
desktop_img(用于存放图片素材)、main.c(主函数)、lcd.c(屏幕控制相关函数)、ts.c(触摸屏相关函数)、func.c(桌面相关函数)、chardata.c(用于存放各图片文件的路径等字符串,以及位置坐标等)
build.sh里面是编译命令,也可以写Makefile,不过我觉得小工程用不上所以就没写,看自己习惯就好了~
路径、坐标参考:
//图片路径
char *desktop_img="desktop_img/desktop.bmp";
char *reboot_img="desktop_img/reboot.bmp";
char *warn_img="desktop_img/warn_wind.bmp";
//触控坐标
int t_2048_x=67*1.28;
int t_2048_y=58*1.28;
int t_mplay_x=224*1.28;
int t_mplay_y=58*1.28;
int t_gecapp_x=381*1.28;
int t_gecapp_y=58*1.28;
int t_addapp_x=538*1.28;
int t_addapp_y=58*1.28;
int t_reboot_x=0*1.28;
int t_reboot_y=440*1.28;
int t_yes_x=332*1.28;
int t_yes_y=283*1.28;
//弹窗左上角坐标
int warn_wind_x=200;
int warn_wind_y=140;
应用使用新开的线程运行,因此写成线程任务函数的形式
线程任务函数:
void *run_gec_app()
{
chdir("/IOT");//改变程序工作路径
system("./iot");//运行程序
chdir("/chino");//将工作目录更改回去
pthread_exit(NULL);//应用退出后结束线程
return 0;
}
void *run_2048_app()
{
chdir("/chino/2048");
system("./2048");
chdir("/chino");
pthread_exit(NULL);
return 0;
}
void *run_mplay_app()
{
chdir("/chino/mplay");
system("./mplay");
chdir("/chino");
pthread_exit(NULL);
return 0;
}
触摸控制函数:
void ts_ctrl()
{
int x,y,z;//触摸坐标状态
int st_warn=0;//有弹窗出现吗?
int st_isrun=0;//正在运行应用吗?
pthread_t tid;//定义线程id变量
while(1)
{
int z=get_touchscreen_index(&x,&y);
if(st_isrun==0 && st_warn==0 && x>t_2048_x && x<=t_2048_x+90*1.28 && y>t_2048_y && y<=t_2048_y+90*1.28)
{
st_isrun=1;//运行应用时桌面不再接受触摸操作,归应用管
pthread_create(&tid,NULL,run_2048_app,NULL); //创建新线程运行应用
pthread_join(tid,NULL);//等待线程结束
load_img(desktop_img,0,0);//线程结束后显示桌面
st_isrun=0;
}
if(st_isrun==0 && st_warn==0 && x>t_mplay_x && x<=t_mplay_x+90*1.28 && y>t_mplay_y && y<=t_mplay_y+90*1.28)
{
st_isrun=1;
pthread_create(&tid,NULL,run_mplay_app,NULL);
pthread_join(tid,NULL);
load_img(desktop_img,0,0);
st_isrun=0;
}
if(st_isrun==0 && st_warn==0 && x>t_gecapp_x && x<=t_gecapp_x+90*1.28 && y>t_gecapp_y && y<=t_gecapp_y+90*1.28)
{
st_isrun=1;
pthread_create(&tid,NULL,run_gec_app,NULL);
pthread_join(tid,NULL);
load_img(desktop_img,0,0);
st_isrun=0;
}
if(st_isrun==0 && st_warn==0 && x>t_addapp_x && x<=t_addapp_x+90*1.28 && y>t_addapp_y && y<=t_addapp_y+90*1.28)
{
load_img(warn_img,warn_wind_x,warn_wind_y);//显示弹窗
st_warn=1;//弹窗出现时只能点确定
}
if(st_isrun==0 && st_warn==1 && x>t_yes_x && x<=t_yes_x+136*1.28 && y>t_yes_y && y<=t_yes_y+33*1.28)
{
load_img(desktop_img,0,0);//点击确定后回到桌面
st_warn=0;//弹窗消失了
}
if(st_isrun==0 && st_warn==0 && x>t_reboot_x && x<=t_reboot_x+150*1.28 && y>t_reboot_y && y<=t_reboot_y+40*1.28)
{//点击重启
load_img(reboot_img,warn_wind_x,warn_wind_y);//显示重启中
system("reboot");
}
}
}
主函数:
int main()
{
int fd=lcd_init();
lcd_clear(0x00ffffff);
load_img(desktop_img,0,0);
ts_ctrl();
return 0;
}
编译运行看看效果:
进入桌面
进入应用
点击添加应用
点击重启
正在重启
这里提一句,开发板默认开机启动粤嵌实验箱程序,如下图所示:
因此为了能够让我们的桌面夺舍代替这个实验箱,奴役他让他成为附属让桌面开机自启,我们需要修改下/etc/profile:
设置开机自启:
将cd /IOT、./iot注释掉,换成我们的桌面,保存重启就好啦~
那么这个简易桌面到这里就完成了,下面放出源码:
- 感谢你赐予我前进的力量