📄 jiemian.c
字号:
/***********************************************************该程序为界面控制程序,并设置为开机自动运行,类似于mp4开机画面,点击屏幕相应区域,转入相应的功能处理模块。在该程序中调度执行播放器程序,mp3播放程序,图片浏览程序。相应功能程序关闭后,重新载入开机画面,并重新等待下一次触摸操作。************************************************************/#include <pthread.h>#include <stdio.h>#include <stdlib.h>#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>#include "s3c2410_ts.h"#include <sys/wait.h>#include <SDL/SDL.h>#include <avcodec.h>#include <avformat.h>#include <stdio.h>#include <unistd.h>#include <sys/ipc.h>#include <sys/shm.h>#include <sys/types.h>void *thread1(void *);//触摸屏信号处理函数声明;int fileno0=5;//文件描述符初值;int STATE_MODE=50;//初始全局状态值;SDL_Surface *screen=SDL_SetVideoMode(320, 240, 16, SDL_SWSURFACE);//screen为屏幕显示的基础框架;int i=0; //状态位,用于判断SDL是否退出,从而决定是否重新初始化SDL;int num=2; //计数器,若程序主界面退出区域的点 //击次数为num,则整个程序退出;/***************************************************************************界面程序主函数。其中创建触摸屏信号控制子线程,并根据触摸屏信号,转入相应功能模块进程执行,执行完毕返回主界面进程;***************************************************************************/int main(){ pthread_t t_b; int oldtype; void ShowBMP(char *file,SDL_Surface *screen,int x, int y); //图片显示函数声明; pthread_create(&t_b,NULL,thread1,(void *)NULL); //创建触摸屏信号处理线程t_b; while(1) { if(i==1) screen=SDL_SetVideoMode(320, 240, 16, SDL_SWSURFACE);//screen初始化; if(num==0) //计数器,用于判断主界面程序是不是要退出; break; while(1) { if(STATE_MODE == 50) { ShowBMP("/qinbo/test.bmp",screen,0, 0);} //显示开机界面图片;/*********************************************************************************点击触摸屏相应区域并对全局状态变量赋值以后,根据全局变量,调度相应的功能进程模块,共有三个功能:视频播放,音频播放,图片浏览*********************************************************************************/ if(STATE_MODE == 10) { SDL_Quit();//SDL退出; i=0; //SDL退出,标志位置0; pthread_cancel(t_b);//取消触摸屏信号处理线程 SDL_Delay(300);//延时操作,保证相应操作能够完成; if(vfork()==0){execvp("/usr/./qinbo1",NULL);}//子进程,调用视频播放程序 else { //父进程 wait(NULL);//等待视频播放进程结束 i=1; STATE_MODE=50;//将全局状态变量恢复初值,及显示开机图片这一操作对应的状态 pthread_create(&t_b,NULL,thread1,(void *)NULL);//重建触摸屏信号处理线程 printf("back into the main process!\n"); }break; } if (STATE_MODE == 20) { SDL_Quit();//SDL退出; i=0; //SDL退出,标志位置0; pthread_cancel(t_b);//取消触摸屏信号处理线程 SDL_Delay(300);//延时操作,保证相应操作能够完成; if(vfork()==0){execvp("/usr/./mp3",NULL);}//子进程,调用mp3播放程序 else { //父进程 wait(NULL);//等待mp3播放进程结束 i=1; STATE_MODE=50;//将全局状态变量恢复初值,及显示开机图片这一操作对应的状态 pthread_create(&t_b,NULL,thread1,(void *)NULL);//重建触摸屏信号处理线程 printf("back into the main process!\n"); }break; } if (STATE_MODE == 30) { SDL_Quit(); //SDL退出; i=0; //SDL退出,标志位置0; pthread_cancel(t_b);//取消触摸屏信号处理线程 SDL_Delay(300);//延时操作,保证相应操作能够完成; if(vfork()==0){execvp("/usr/./pic",NULL);}//子进程,调用执行图片浏览程序 else { //父进程 wait(NULL);//等待图片浏览进程结束 i=1; STATE_MODE=50; //将全局状态变量恢复初值,及显示开机图片这一操作对应的状态 pthread_create(&t_b,NULL,thread1,(void *)NULL);//重建触摸屏信号处理线程 printf("back into the main process!\n"); }break; } if (STATE_MODE == 40) //此状态标志为界面程序退出状态 {printf("again4!\n"); STATE_MODE=50; //将全局状态变量恢复初值,及显示开机图片这一操作对应的状态 num--; //当值为0时,整个界面程序退出 break; } } } printf("all over!\n"); close(fileno0); SDL_Quit(); exit(0); //整个程序结束,退出!}/****************************************************************触摸平操作实时响应线程,对触摸屏信号进行区域判断,并对全局状态变量STATE_MODE赋值*****************************************************************/void *thread1(void *junk){ int fangdou_flag =1; //触摸屏防抖标志位,只对连续有效点的第一个点响应; fileno0 = open("/dev/ts",O_RDONLY);//打开触摸屏;
if (fileno0 == -1) {
printf("open device error!\n");//打印错误信息;
return NULL;
}
TS_EVENT ev0;//触摸屏相应数据结构;
memset(&ev0, 0, sizeof(struct s3c2410_ts_event));
while(1) {
if(read(fileno0, &ev0, sizeof(struct s3c2410_ts_event)))//读取触摸屏信号; { double i_tmp=2.984,j_tmp=3.708; ev0.x=(unsigned int)((986-ev0.x)/i_tmp); //触摸屏校准; ev0.y=(unsigned int)((948-ev0.y)/j_tmp); if ((ev0.pressure)&&(fangdou_flag==1)) //触摸屏防抖标志位为1时相应; { printf("x= %d, y= %d, flag=0x%04x\n", ev0.x, ev0.y, ev0.pressure); if ((ev0.y>=80)&&(ev0.y<=160)) { if ((ev0.x>=20)&&(ev0.x<=100))STATE_MODE=10; //触摸屏视频播放区域; else if(ev0.x>120&&ev0.x<=200) STATE_MODE = 20; //触摸屏mp3播放区域; else if((ev0.x>220)&&(ev0.x<=300)) STATE_MODE = 30; //触摸屏图片浏览区域; } else if((ev0.y>=0)&&(ev0.y<=20)&&(ev0.x>0)&&(ev0.x<=20)) STATE_MODE = 40;//触摸屏界面程序退出区域; fangdou_flag = 0; //连续有效点中除第一个点的其余点无效; } if(ev0.pressure == 0)//新的连续有效点产生; fangdou_flag = 1;//触摸屏防抖标志位置1; } }
return 0;}/********************************************************************************SDL显示BMP图片函数。无延时。screen为屏幕显示的基础框架。(x,y)为图片显示坐标原点。********************************************************************************/void ShowBMP(char *file,SDL_Surface *screen,int x, int y){ if ( SDL_Init(SDL_INIT_VIDEO) < 0 ) { //SDL初始化; fprintf(stderr, "can not initialize SDL: %s\n", SDL_GetError());//打印错误信息; exit(1); }if ( screen==NULL ) { fprintf(stderr, "无法设置3200x240的视频模式:%s\n", SDL_GetError()); exit(1); } SDL_Surface *image; SDL_Rect dest; image = SDL_LoadBMP(file);// 将BMP文件加载到一个surface if ( image == NULL ) { fprintf(stderr, "无法加载 %s: %s\n", file, SDL_GetError());//打印错误信息; return; } dest.x = x; //Blit到屏幕surface;onto the screen surface; dest.y = y; // 这时不能锁住surface; dest.w = image->w; dest.h = image->h; SDL_BlitSurface(image, NULL, screen, &dest); SDL_UpdateRects(screen, 1, &dest); SDL_FreeSurface(image); //释放图片;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -