这篇文章把之前写的《freetype实现电子书》代码修改一下,改为用触摸屏输入来进行上下翻页和退出。代码中把触摸屏分为上中下3个区域,分别对应输入的上一页,退出,和下一页。
使用触摸屏的前提是按上一篇《tslib移植和测试》移植好tslib,因为要用到tslib库。系统对触摸屏事件的检测频率非常高,轻轻按一下触摸屏,就会被检测到几次触摸事件。即对我们人来说,我们只按了一次触摸屏,但机器在极短的时间里ts_read()了好几次触摸屏,也处理了好几次。为了解决这个情况,代码中对每次触摸事件的时间进行读取,与上一次的时间进行比较,超过一定的值(这里是500ms)再进行翻页或退出操作,否则认为是人的同一次触摸操作,不进行处理。
使用触摸屏的前提是按上一篇《tslib移植和测试》移植好tslib,因为要用到tslib库。系统对触摸屏事件的检测频率非常高,轻轻按一下触摸屏,就会被检测到几次触摸事件。即对我们人来说,我们只按了一次触摸屏,但机器在极短的时间里ts_read()了好几次触摸屏,也处理了好几次。为了解决这个情况,代码中对每次触摸事件的时间进行读取,与上一次的时间进行比较,超过一定的值(这里是500ms)再进行翻页或退出操作,否则认为是人的同一次触摸操作,不进行处理。
只需要修改main.c文件即可。
其他代码参考《freetype实现电子书》:https://blog.csdn.net/qq_22863733/article/details/80238111
main.c:
#include "function.h" #include <stdio.h> #include <stdlib.h> #include <signal.h> #include <sys/fcntl.h> #include <sys/ioctl.h> #include <sys/mman.h> #include <sys/time.h> #include <tslib.h> struct tsdev *ts; char *tsdevice=NULL; struct ts_sample samp; int ret; struct timeval tPreTime{ .tv_sec=0; .tv_usec=0; }; int ts_init(void); int read_ts(void); int isOutOf500ms(struct timeval *ptPreTime, struct timeval *ptNowTime); int main(int argc,char** argv) { lcd_init(); ts_init(); memset(fbmem, 0, screen_size); if ( argc != 3 ) { fprintf ( stderr, "usage: %s FontFile TextFileName\n", argv[0] ); exit( 1 ); } FontFile =argv[1]; freetype_init(); TextFileName = argv[2]; OpenTextFile(TextFileName); g_ptPageListFirstCur=&g_tPageListFirstHeader; g_ptPages = &g_tPageListFirstHeader; if( !show_one_page(g_ptPageListFirstCur)) { return 0; //文件结束 } while(!read_ts()) { } close_freetype(); close(fd_fb); return 0; } int ts_init() { if( (tsdevice = getenv("TSLIB_TSDEVICE")) != NULL ) { ts = ts_open(tsdevice,0); } else { ts = ts_open("/dev/event0", 0); } if (!ts) { perror("ts_open"); exit(1); } if (ts_config(ts)) { perror("ts_config"); exit(1); } } int read_ts(void) { ret = ts_read(ts, &samp, 1); if (ret < 0) { perror("ts_read"); exit(1); } if (ret != 1){ return 0; } if(isOutOf500ms(&tPreTime, &samp.tv)) { tPreTime = samp.tv; printf("%ld.%06ld: %6d %6d %6d\n", samp.tv.tv_sec, samp.tv.tv_usec, samp.x, samp.y, samp.pressure); if (samp.y >= var.yres*2/3)//next page { memset(fbmem, 0, screen_size); //show_one_page(g_tPageListFirstHeader); if(!show_one_page((g_ptPageListFirstCur->pt_NextPageFirst))) { return 0; //文件结束 } g_ptPageListFirstCur=g_ptPageListFirstCur->pt_NextPageFirst; } else if (samp.y<=var.yres/3)// pre page { if(g_ptPageListFirstCur->pt_PrePageFirst == NULL) { printf("this is first page!\n"); } else { memset(fbmem, 0, screen_size); show_one_page((g_ptPageListFirstCur->pt_PrePageFirst)); g_ptPageListFirstCur=g_ptPageListFirstCur->pt_PrePageFirst; //ShowPrePage(); } } else { return 1; } } return 0; } int isOutOf500ms(struct timeval *ptPreTime, struct timeval *ptNowTime) { int iPreMs; int iNowMs; iPreMs = ptPreTime->tv_sec * 1000 + ptPreTime->tv_usec / 1000; iNowMs = ptNowTime->tv_sec * 1000 + ptNowTime->tv_usec / 1000; return (iNowMs > iPreMs + 500); }