tslib应用(电子书支持ts输入)

        这篇文章把之前写的《freetype实现电子书》代码修改一下,改为用触摸屏输入来进行上下翻页和退出。代码中把触摸屏分为上中下3个区域,分别对应输入的上一页,退出,和下一页。
        使用触摸屏的前提是按上一篇《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);
}

猜你喜欢

转载自blog.csdn.net/qq_22863733/article/details/80298417