xref: /OK3568_Linux_fs/external/rk_pcba_test/pcba_minui/touch_test.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun #include <pthread.h>
2*4882a593Smuzhiyun 
3*4882a593Smuzhiyun typedef enum {
4*4882a593Smuzhiyun 	TOUCH_START = 0,
5*4882a593Smuzhiyun 	TOUCH_DRAG = 1,
6*4882a593Smuzhiyun 	TOUCH_RELEASE = 2,
7*4882a593Smuzhiyun 	TOUCH_HOLD = 3,
8*4882a593Smuzhiyun 	TOUCH_REPEAT = 4
9*4882a593Smuzhiyun } TOUCH_STATE;
10*4882a593Smuzhiyun 
11*4882a593Smuzhiyun #undef MAX
12*4882a593Smuzhiyun #define MAX(a,b)	((a) > (b) ? (a) : (b))
13*4882a593Smuzhiyun #undef MIN
14*4882a593Smuzhiyun #define MIN(a,b)	((a) < (b) ? (a) : (b))
15*4882a593Smuzhiyun #undef ABS
16*4882a593Smuzhiyun #define ABS(a)		((a) >= 0 ? (a) : (-(a)))
17*4882a593Smuzhiyun 
18*4882a593Smuzhiyun static pthread_mutex_t gUpdateMutex = PTHREAD_MUTEX_INITIALIZER;
19*4882a593Smuzhiyun 
draw_dot(int x,int y)20*4882a593Smuzhiyun int draw_dot(int x, int y)
21*4882a593Smuzhiyun {
22*4882a593Smuzhiyun 	if(x < 0 || y < 0){
23*4882a593Smuzhiyun //		LOGE("%s invalid dot! (%d,%d), \n", x, y);
24*4882a593Smuzhiyun 		return -1;
25*4882a593Smuzhiyun 	}
26*4882a593Smuzhiyun 
27*4882a593Smuzhiyun //	LOGE("draw (%d,%d)\n", x, y);
28*4882a593Smuzhiyun 	pthread_mutex_lock(&gUpdateMutex);
29*4882a593Smuzhiyun //	drawline(0,0,255,255,x,y,2,2);
30*4882a593Smuzhiyun 	gr_color(0, 0, 255, 255);
31*4882a593Smuzhiyun 	gr_fill(x, y, 2, 2);
32*4882a593Smuzhiyun 	//gr_flip();
33*4882a593Smuzhiyun 	pthread_mutex_unlock(&gUpdateMutex);
34*4882a593Smuzhiyun 
35*4882a593Smuzhiyun 	//FillColor(0, 0, 255, 255,x, y, 1, 1);
36*4882a593Smuzhiyun 
37*4882a593Smuzhiyun 
38*4882a593Smuzhiyun 	return 0;
39*4882a593Smuzhiyun }
40*4882a593Smuzhiyun 
draw_line(int x1,int y1,int x2,int y2)41*4882a593Smuzhiyun int draw_line(int x1, int y1, int x2, int y2)
42*4882a593Smuzhiyun {
43*4882a593Smuzhiyun 	int x, y;
44*4882a593Smuzhiyun 
45*4882a593Smuzhiyun //	printf("line: (%d,%d)-(%d,%d)\n", x1, y1, x2, y2);
46*4882a593Smuzhiyun 
47*4882a593Smuzhiyun 	if(x1 == x2){
48*4882a593Smuzhiyun 		x = x1;
49*4882a593Smuzhiyun 		for(y = MIN(y1, y2); y <= MAX(y1, y2); y++)
50*4882a593Smuzhiyun 			draw_dot(x, y);
51*4882a593Smuzhiyun 	}else if(y1 == y2){
52*4882a593Smuzhiyun 		y = y1;
53*4882a593Smuzhiyun 		for(x = MIN(x1, x2); x <= MAX(x1, x2); x++)
54*4882a593Smuzhiyun 			draw_dot(x, y);
55*4882a593Smuzhiyun 	}else if(ABS(x1-x2) > ABS(y1-y2)){
56*4882a593Smuzhiyun 		for(x = MIN(x1, x2); x <= MAX(x1, x2); x++){
57*4882a593Smuzhiyun 			y = ((y2 - y1) * (x - x1)) / (x2 - x1) + y1;
58*4882a593Smuzhiyun 			draw_dot(x, y);
59*4882a593Smuzhiyun 		}
60*4882a593Smuzhiyun 	}else{
61*4882a593Smuzhiyun 		for(y = MIN(y1, y2); y <= MAX(y1, y2); y++){
62*4882a593Smuzhiyun                         x = ((x2 - x1) * (y - y1)) / (y2 - y1) + x1;
63*4882a593Smuzhiyun                         draw_dot(x, y);
64*4882a593Smuzhiyun                 }
65*4882a593Smuzhiyun 	}
66*4882a593Smuzhiyun 
67*4882a593Smuzhiyun 	return 0;
68*4882a593Smuzhiyun }
69*4882a593Smuzhiyun 
70*4882a593Smuzhiyun int last_x = 0, last_y = 0;
71*4882a593Smuzhiyun #ifdef SOFIA3GR_PCBA
72*4882a593Smuzhiyun extern int sync_screen_for_prompt(void);
73*4882a593Smuzhiyun #endif
74*4882a593Smuzhiyun 
NotifyTouch(int action,int x,int y)75*4882a593Smuzhiyun int NotifyTouch(int action, int x, int y)
76*4882a593Smuzhiyun {
77*4882a593Smuzhiyun 	switch(action){
78*4882a593Smuzhiyun 	case TOUCH_START:
79*4882a593Smuzhiyun 		draw_dot(x, y);
80*4882a593Smuzhiyun 		last_x = x;
81*4882a593Smuzhiyun 		last_y = y;
82*4882a593Smuzhiyun 
83*4882a593Smuzhiyun 		break;
84*4882a593Smuzhiyun 	case TOUCH_DRAG:
85*4882a593Smuzhiyun 		draw_line(last_x, last_y, x, y);
86*4882a593Smuzhiyun 		last_x = x;
87*4882a593Smuzhiyun 		last_y = y;
88*4882a593Smuzhiyun 		pthread_mutex_lock(&gUpdateMutex);
89*4882a593Smuzhiyun 		gr_flip();
90*4882a593Smuzhiyun 		pthread_mutex_unlock(&gUpdateMutex);
91*4882a593Smuzhiyun 
92*4882a593Smuzhiyun 		break;
93*4882a593Smuzhiyun 	case TOUCH_RELEASE:
94*4882a593Smuzhiyun 		pthread_mutex_lock(&gUpdateMutex);
95*4882a593Smuzhiyun                 gr_flip();
96*4882a593Smuzhiyun         pthread_mutex_unlock(&gUpdateMutex);
97*4882a593Smuzhiyun 		#ifdef SOFIA3GR_PCBA
98*4882a593Smuzhiyun 				sync_screen_for_prompt();
99*4882a593Smuzhiyun 		#endif
100*4882a593Smuzhiyun 		break;
101*4882a593Smuzhiyun 	case TOUCH_HOLD:
102*4882a593Smuzhiyun 		break;
103*4882a593Smuzhiyun 	case TOUCH_REPEAT:
104*4882a593Smuzhiyun 		break;
105*4882a593Smuzhiyun 	default:
106*4882a593Smuzhiyun 		break;
107*4882a593Smuzhiyun 	}
108*4882a593Smuzhiyun 
109*4882a593Smuzhiyun 	return 0;
110*4882a593Smuzhiyun }
111