xref: /OK3568_Linux_fs/kernel/drivers/input/touchscreen/gsl_point_id.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  * drivers/input/touchscreen/gsl_point_id.c
3*4882a593Smuzhiyun  *
4*4882a593Smuzhiyun  * Copyright (c) 2012 Shanghai Basewin
5*4882a593Smuzhiyun  *	Guan Yuwei<guanyuwei@basewin.com>
6*4882a593Smuzhiyun  *
7*4882a593Smuzhiyun  *  This program is free software; you can redistribute it and/or modify
8*4882a593Smuzhiyun  *  it under the terms of the GNU General Public License version 2 as
9*4882a593Smuzhiyun  *  published by the Free Software Foundation.
10*4882a593Smuzhiyun  */
11*4882a593Smuzhiyun 
12*4882a593Smuzhiyun //#include "linux/module.h"
13*4882a593Smuzhiyun //#include <wdm.h>
14*4882a593Smuzhiyun /*
15*4882a593Smuzhiyun NTSTATUS
16*4882a593Smuzhiyun DriverEntry(
17*4882a593Smuzhiyun   IN PDRIVER_OBJECT DriverObject,
18*4882a593Smuzhiyun   IN PUNICODE_STRING RegistryPath
19*4882a593Smuzhiyun );
20*4882a593Smuzhiyun 
21*4882a593Smuzhiyun #ifdef ALLOC_PRAGMA
22*4882a593Smuzhiyun #pragma alloc_text(INIT, DriverEntry)
23*4882a593Smuzhiyun #endif
24*4882a593Smuzhiyun 
25*4882a593Smuzhiyun NTSTATUS
26*4882a593Smuzhiyun DllInitialize( IN PUNICODE_STRING pus )
27*4882a593Smuzhiyun {
28*4882a593Smuzhiyun     DbgPrint("GSL_POINT_ID: DllInitialize(%S)\n", pus->Buffer );
29*4882a593Smuzhiyun     return STATUS_SUCCESS;
30*4882a593Smuzhiyun }
31*4882a593Smuzhiyun 
32*4882a593Smuzhiyun NTSTATUS
33*4882a593Smuzhiyun DllUnload( )
34*4882a593Smuzhiyun {
35*4882a593Smuzhiyun     DbgPrint("GSL_POINT_ID: DllUnload\n");
36*4882a593Smuzhiyun     return STATUS_SUCCESS;
37*4882a593Smuzhiyun }
38*4882a593Smuzhiyun */
39*4882a593Smuzhiyun //#define	GESTURE_ABLE	1
40*4882a593Smuzhiyun #define	GESTURE_LICH	1
41*4882a593Smuzhiyun 
42*4882a593Smuzhiyun #define GSL_VERSION		0x20140421
43*4882a593Smuzhiyun #ifndef NULL
44*4882a593Smuzhiyun #define	NULL  ((void*)0)
45*4882a593Smuzhiyun #endif
46*4882a593Smuzhiyun #ifndef UINT
47*4882a593Smuzhiyun #define	UINT  unsigned int
48*4882a593Smuzhiyun #endif
49*4882a593Smuzhiyun 
50*4882a593Smuzhiyun #define	POINT_MAX		10
51*4882a593Smuzhiyun #define	PP_DEEP			10
52*4882a593Smuzhiyun #define	PS_DEEP			10
53*4882a593Smuzhiyun #define PR_DEEP			10
54*4882a593Smuzhiyun #define POINT_DEEP		(PP_DEEP + PS_DEEP + PR_DEEP)
55*4882a593Smuzhiyun #define	PRESSURE_DEEP		8
56*4882a593Smuzhiyun #define	CONFIG_LENGTH		512
57*4882a593Smuzhiyun #define TRUE			1
58*4882a593Smuzhiyun #define FALSE			0
59*4882a593Smuzhiyun #define FLAG_ABLE		(0x4<<12)
60*4882a593Smuzhiyun #define FLAG_FILL		(0x2<<12)
61*4882a593Smuzhiyun #define	FLAG_KEY		(0x1<<12)
62*4882a593Smuzhiyun #define	FLAG_COOR		(0x0fff0fff)
63*4882a593Smuzhiyun #define	FLAG_COOR_EX		(0xffff0fff)
64*4882a593Smuzhiyun #define	FLAG_ID			(0xf0000000)
65*4882a593Smuzhiyun 
66*4882a593Smuzhiyun struct gsl_touch_info
67*4882a593Smuzhiyun {
68*4882a593Smuzhiyun 	int x[10];
69*4882a593Smuzhiyun 	int y[10];
70*4882a593Smuzhiyun 	int id[10];
71*4882a593Smuzhiyun 	int finger_num;
72*4882a593Smuzhiyun };
73*4882a593Smuzhiyun 
74*4882a593Smuzhiyun typedef struct
75*4882a593Smuzhiyun {
76*4882a593Smuzhiyun 	unsigned int i;
77*4882a593Smuzhiyun 	unsigned int j;
78*4882a593Smuzhiyun 	unsigned int min;//distance min
79*4882a593Smuzhiyun 	unsigned int d[POINT_MAX][POINT_MAX];//distance;
80*4882a593Smuzhiyun }gsl_DISTANCE_TYPE;
81*4882a593Smuzhiyun 
82*4882a593Smuzhiyun typedef union
83*4882a593Smuzhiyun {
84*4882a593Smuzhiyun 	struct
85*4882a593Smuzhiyun 	{
86*4882a593Smuzhiyun 		unsigned y:12;
87*4882a593Smuzhiyun 		unsigned key:1;
88*4882a593Smuzhiyun 		unsigned fill:1;
89*4882a593Smuzhiyun 		unsigned able:1;
90*4882a593Smuzhiyun 		unsigned predict:1;
91*4882a593Smuzhiyun 		unsigned x:16;
92*4882a593Smuzhiyun 	}other;
93*4882a593Smuzhiyun 	struct
94*4882a593Smuzhiyun 	{
95*4882a593Smuzhiyun 		unsigned y:13;
96*4882a593Smuzhiyun 		unsigned rev_2:3;
97*4882a593Smuzhiyun 		unsigned x:16;
98*4882a593Smuzhiyun 	}dis;
99*4882a593Smuzhiyun 	unsigned int all;
100*4882a593Smuzhiyun }gsl_POINT_TYPE;
101*4882a593Smuzhiyun 
102*4882a593Smuzhiyun typedef union
103*4882a593Smuzhiyun {
104*4882a593Smuzhiyun 	struct
105*4882a593Smuzhiyun 	{
106*4882a593Smuzhiyun 		unsigned delay:8;
107*4882a593Smuzhiyun 		unsigned report:8;
108*4882a593Smuzhiyun 		unsigned rev_1:14;
109*4882a593Smuzhiyun 		unsigned able:1;
110*4882a593Smuzhiyun 		unsigned init:1;
111*4882a593Smuzhiyun 	}other;
112*4882a593Smuzhiyun 	unsigned int all;
113*4882a593Smuzhiyun }gsl_DELAY_TYPE;
114*4882a593Smuzhiyun 
115*4882a593Smuzhiyun typedef union
116*4882a593Smuzhiyun {
117*4882a593Smuzhiyun 	struct
118*4882a593Smuzhiyun 	{
119*4882a593Smuzhiyun 		unsigned rev_0:8;
120*4882a593Smuzhiyun 		unsigned rev_1:8;
121*4882a593Smuzhiyun 
122*4882a593Smuzhiyun 		unsigned rev_2:7;
123*4882a593Smuzhiyun 		unsigned ex:1;
124*4882a593Smuzhiyun 
125*4882a593Smuzhiyun 		unsigned interpolation:4;
126*4882a593Smuzhiyun 		unsigned rev_3:1;
127*4882a593Smuzhiyun 		unsigned only:1;
128*4882a593Smuzhiyun 		unsigned mask:1;
129*4882a593Smuzhiyun 		unsigned reset:1;
130*4882a593Smuzhiyun 	}other;
131*4882a593Smuzhiyun 	unsigned int all;
132*4882a593Smuzhiyun }gsl_STATE_TYPE;
133*4882a593Smuzhiyun 
134*4882a593Smuzhiyun typedef struct
135*4882a593Smuzhiyun {
136*4882a593Smuzhiyun 	unsigned int rate;
137*4882a593Smuzhiyun 	unsigned int dis;
138*4882a593Smuzhiyun 	gsl_POINT_TYPE coor;
139*4882a593Smuzhiyun }gsl_EDGE_TYPE;
140*4882a593Smuzhiyun 
141*4882a593Smuzhiyun typedef union
142*4882a593Smuzhiyun {
143*4882a593Smuzhiyun 	struct
144*4882a593Smuzhiyun 	{
145*4882a593Smuzhiyun 		short y;
146*4882a593Smuzhiyun 		short x;
147*4882a593Smuzhiyun 	}other;
148*4882a593Smuzhiyun 	unsigned int all;
149*4882a593Smuzhiyun }gsl_DECIMAL_TYPE;
150*4882a593Smuzhiyun 
151*4882a593Smuzhiyun typedef union
152*4882a593Smuzhiyun {
153*4882a593Smuzhiyun 	struct
154*4882a593Smuzhiyun 	{
155*4882a593Smuzhiyun 		unsigned over_report_mask:1;
156*4882a593Smuzhiyun 		unsigned opposite_x:1;
157*4882a593Smuzhiyun 		unsigned opposite_y:1;
158*4882a593Smuzhiyun 		unsigned opposite_xy:1;
159*4882a593Smuzhiyun 		unsigned line:1;
160*4882a593Smuzhiyun 		unsigned line_neg:1;
161*4882a593Smuzhiyun 		unsigned line_half:1;
162*4882a593Smuzhiyun 		unsigned middle_drv:1;
163*4882a593Smuzhiyun 
164*4882a593Smuzhiyun 		unsigned key_only_one:1;
165*4882a593Smuzhiyun 		unsigned key_line:1;
166*4882a593Smuzhiyun 		unsigned refe_rt:1;
167*4882a593Smuzhiyun 		unsigned refe_var:1;
168*4882a593Smuzhiyun 		unsigned base_median:1;
169*4882a593Smuzhiyun 		unsigned key_rt:1;
170*4882a593Smuzhiyun 		unsigned refe_reset:1;
171*4882a593Smuzhiyun 		unsigned sub_cross:1;
172*4882a593Smuzhiyun 
173*4882a593Smuzhiyun 		unsigned row_neg:1;
174*4882a593Smuzhiyun 		unsigned sub_line_coe:1;
175*4882a593Smuzhiyun 		unsigned sub_row_coe:1;
176*4882a593Smuzhiyun 		unsigned c2f_able:1;
177*4882a593Smuzhiyun 		unsigned thumb:1;
178*4882a593Smuzhiyun 		unsigned graph_h:1;
179*4882a593Smuzhiyun 		unsigned init_repeat:1;
180*4882a593Smuzhiyun 		unsigned near_reset_able:1;
181*4882a593Smuzhiyun 
182*4882a593Smuzhiyun 		unsigned emb_dead:1;
183*4882a593Smuzhiyun 		unsigned emb_point_mask:1;
184*4882a593Smuzhiyun 		unsigned interpolation:1;
185*4882a593Smuzhiyun 		unsigned sum2_able:1;
186*4882a593Smuzhiyun 		unsigned reduce_pin:1;
187*4882a593Smuzhiyun 		unsigned drv_order_ex:1;
188*4882a593Smuzhiyun 		unsigned id_over:1;
189*4882a593Smuzhiyun 		unsigned rev_1:1;
190*4882a593Smuzhiyun 	}other;
191*4882a593Smuzhiyun 	unsigned int all;
192*4882a593Smuzhiyun }gsl_FLAG_TYPE;
193*4882a593Smuzhiyun 
194*4882a593Smuzhiyun static gsl_POINT_TYPE point_array[POINT_DEEP][POINT_MAX];
195*4882a593Smuzhiyun static gsl_POINT_TYPE *point_pointer[PP_DEEP];
196*4882a593Smuzhiyun static gsl_POINT_TYPE *point_stretch[PS_DEEP];
197*4882a593Smuzhiyun static gsl_POINT_TYPE *point_report[PR_DEEP];
198*4882a593Smuzhiyun static gsl_POINT_TYPE point_now[POINT_MAX];
199*4882a593Smuzhiyun static gsl_DELAY_TYPE point_delay[POINT_MAX];
200*4882a593Smuzhiyun static int filter_deep[POINT_MAX];
201*4882a593Smuzhiyun static gsl_EDGE_TYPE point_edge;
202*4882a593Smuzhiyun static gsl_DECIMAL_TYPE point_decimal[POINT_MAX];
203*4882a593Smuzhiyun 
204*4882a593Smuzhiyun static unsigned int pressure_now[POINT_MAX];
205*4882a593Smuzhiyun static unsigned int pressure_array[PRESSURE_DEEP][POINT_MAX];
206*4882a593Smuzhiyun static unsigned int pressure_report[POINT_MAX];
207*4882a593Smuzhiyun static unsigned int *pressure_pointer[PRESSURE_DEEP];
208*4882a593Smuzhiyun 
209*4882a593Smuzhiyun #define	pp		point_pointer
210*4882a593Smuzhiyun #define	ps		point_stretch
211*4882a593Smuzhiyun #define	pr		point_report
212*4882a593Smuzhiyun #define	point_predict	pp[0]
213*4882a593Smuzhiyun #define	pa		pressure_pointer
214*4882a593Smuzhiyun 
215*4882a593Smuzhiyun static	gsl_STATE_TYPE global_state;
216*4882a593Smuzhiyun static	int inte_count;
217*4882a593Smuzhiyun static	unsigned int csensor_count;
218*4882a593Smuzhiyun static	unsigned int click_count[4];
219*4882a593Smuzhiyun static	gsl_POINT_TYPE point_click[4];
220*4882a593Smuzhiyun static	unsigned int double_click;
221*4882a593Smuzhiyun static	int point_n;
222*4882a593Smuzhiyun static	int point_num;
223*4882a593Smuzhiyun static	int prev_num;
224*4882a593Smuzhiyun static	int point_near;
225*4882a593Smuzhiyun static	unsigned int point_shake;
226*4882a593Smuzhiyun static	unsigned int reset_mask_send;
227*4882a593Smuzhiyun static	unsigned int reset_mask_max;
228*4882a593Smuzhiyun static	unsigned int reset_mask_count;
229*4882a593Smuzhiyun static	gsl_FLAG_TYPE global_flag;
230*4882a593Smuzhiyun static	unsigned int id_first_coe;
231*4882a593Smuzhiyun static	unsigned int id_speed_coe;
232*4882a593Smuzhiyun static	unsigned int id_static_coe;
233*4882a593Smuzhiyun static	unsigned int average;
234*4882a593Smuzhiyun static	unsigned int soft_average;
235*4882a593Smuzhiyun static	unsigned int report_delay;
236*4882a593Smuzhiyun static	unsigned int report_ahead;
237*4882a593Smuzhiyun static	unsigned char median_dis[4];
238*4882a593Smuzhiyun static	unsigned int shake_min;
239*4882a593Smuzhiyun static	int match_y[2];
240*4882a593Smuzhiyun static	int match_x[2];
241*4882a593Smuzhiyun static	int ignore_y[2];
242*4882a593Smuzhiyun static	int ignore_x[2];
243*4882a593Smuzhiyun static	int screen_y_max;
244*4882a593Smuzhiyun static	int screen_x_max;
245*4882a593Smuzhiyun static	int point_num_max;
246*4882a593Smuzhiyun static	unsigned int drv_num;
247*4882a593Smuzhiyun static	unsigned int sen_num;
248*4882a593Smuzhiyun static	unsigned int drv_num_nokey;
249*4882a593Smuzhiyun static	unsigned int sen_num_nokey;
250*4882a593Smuzhiyun static	unsigned int coordinate_correct_able;
251*4882a593Smuzhiyun static	unsigned int coordinate_correct_coe_x[64];
252*4882a593Smuzhiyun static	unsigned int coordinate_correct_coe_y[64];
253*4882a593Smuzhiyun static	unsigned int edge_cut[4];
254*4882a593Smuzhiyun static	unsigned int stretch_array[4*4*2];
255*4882a593Smuzhiyun static	unsigned int shake_all_array[2*8];
256*4882a593Smuzhiyun static	unsigned int reset_mask_dis;
257*4882a593Smuzhiyun static	unsigned int reset_mask_type;
258*4882a593Smuzhiyun static	unsigned int key_map_able;
259*4882a593Smuzhiyun static	unsigned int key_range_array[8*3];
260*4882a593Smuzhiyun static	int  filter_able;
261*4882a593Smuzhiyun static	unsigned int filter_coe[4];
262*4882a593Smuzhiyun static	unsigned int multi_x_array[4],multi_y_array[4];
263*4882a593Smuzhiyun static	unsigned int multi_group[4][64];
264*4882a593Smuzhiyun static	int ps_coe[4][8],pr_coe[4][8];
265*4882a593Smuzhiyun static	int point_repeat[2];
266*4882a593Smuzhiyun static	int near_set[2];
267*4882a593Smuzhiyun static	int diagonal;
268*4882a593Smuzhiyun // 	unsigned int key_dead_time			;
269*4882a593Smuzhiyun // 	unsigned int point_dead_time		;
270*4882a593Smuzhiyun // 	unsigned int point_dead_time2		;
271*4882a593Smuzhiyun // 	unsigned int point_dead_distance	;
272*4882a593Smuzhiyun // 	unsigned int point_dead_distance2	;
273*4882a593Smuzhiyun // 	unsigned int pressure_able;
274*4882a593Smuzhiyun // 	unsigned int pressure_save[POINT_MAX];
275*4882a593Smuzhiyun static	unsigned int edge_first;
276*4882a593Smuzhiyun static	unsigned int edge_first_coe;
277*4882a593Smuzhiyun 
278*4882a593Smuzhiyun static	unsigned int point_corner;
279*4882a593Smuzhiyun //-------------------------------------------------
280*4882a593Smuzhiyun static	unsigned int config_static[CONFIG_LENGTH];
281*4882a593Smuzhiyun //-------------------------------------------------
282*4882a593Smuzhiyun #ifdef GESTURE_ABLE
283*4882a593Smuzhiyun 
284*4882a593Smuzhiyun #define MAXSTACK	200
285*4882a593Smuzhiyun #define GesturePtNum	15
286*4882a593Smuzhiyun typedef union
287*4882a593Smuzhiyun {
288*4882a593Smuzhiyun 
289*4882a593Smuzhiyun 	struct
290*4882a593Smuzhiyun 	{
291*4882a593Smuzhiyun 		unsigned y:16;
292*4882a593Smuzhiyun 		unsigned x:12;
293*4882a593Smuzhiyun 		unsigned id:4;
294*4882a593Smuzhiyun 	} point_data;
295*4882a593Smuzhiyun 	unsigned int data_int;
296*4882a593Smuzhiyun }POINT_TYPE_DEFINE;
297*4882a593Smuzhiyun 
298*4882a593Smuzhiyun typedef struct
299*4882a593Smuzhiyun {
300*4882a593Smuzhiyun 	int top;
301*4882a593Smuzhiyun 	POINT_TYPE_DEFINE  point_buff[MAXSTACK];
302*4882a593Smuzhiyun }TouchFinger;
303*4882a593Smuzhiyun 
304*4882a593Smuzhiyun static struct
305*4882a593Smuzhiyun {
306*4882a593Smuzhiyun 	int num[10];
307*4882a593Smuzhiyun 	int flag;
308*4882a593Smuzhiyun 	int position;
309*4882a593Smuzhiyun }vector_x_y[2];
310*4882a593Smuzhiyun static TouchFinger point_stack;
311*4882a593Smuzhiyun static int qushi_x[10];
312*4882a593Smuzhiyun static int qushi_y[10];
313*4882a593Smuzhiyun static int vector_change_x[MAXSTACK];
314*4882a593Smuzhiyun static int vector_change_y[MAXSTACK];
315*4882a593Smuzhiyun static int rate_weight[MAXSTACK];
316*4882a593Smuzhiyun static POINT_TYPE_DEFINE top,bottom,left,right;
317*4882a593Smuzhiyun static int Letter_width;
318*4882a593Smuzhiyun static int Letter_height;
319*4882a593Smuzhiyun static unsigned int max_x,min_x,max_y,min_y;
320*4882a593Smuzhiyun static char gesture_letter;
321*4882a593Smuzhiyun #endif
322*4882a593Smuzhiyun //+++++++++++++++++++++++++++++++++++++++++++++++++++++++
323*4882a593Smuzhiyun #ifdef GESTURE_LICH
324*4882a593Smuzhiyun #define	GESTURE_BUF_SIZE		256
325*4882a593Smuzhiyun #define	GESTURE_SIZE_REFE		255
326*4882a593Smuzhiyun #define	GESTURE_SIZE_NUM		32
327*4882a593Smuzhiyun #define	GESTURE_XY			0x1
328*4882a593Smuzhiyun #define	GESTURE_DEAL			0x2
329*4882a593Smuzhiyun #define	GESTURE_LRUD			0x4
330*4882a593Smuzhiyun #define	GESTURE_ALL			0x7fffffff
331*4882a593Smuzhiyun typedef union
332*4882a593Smuzhiyun {
333*4882a593Smuzhiyun 	struct
334*4882a593Smuzhiyun 	{
335*4882a593Smuzhiyun 		unsigned y:12;
336*4882a593Smuzhiyun 		unsigned rev:4;
337*4882a593Smuzhiyun 		unsigned x:16;
338*4882a593Smuzhiyun 	}other;
339*4882a593Smuzhiyun 	unsigned int all;
340*4882a593Smuzhiyun }GESTURE_POINT_TYPE;
341*4882a593Smuzhiyun typedef struct
342*4882a593Smuzhiyun {
343*4882a593Smuzhiyun 	int coe;
344*4882a593Smuzhiyun 	int out;
345*4882a593Smuzhiyun 	unsigned int coor[GESTURE_SIZE_NUM/2];
346*4882a593Smuzhiyun }GESTURE_MODEL_TYPE;
347*4882a593Smuzhiyun //GESTURE_POINT_TYPE gesture_buf[GESTURE_BUF_SIZE];//gesture_buf
348*4882a593Smuzhiyun #define	gesture_buf	 ((GESTURE_POINT_TYPE*)config_static)
349*4882a593Smuzhiyun #define	gesture_standard ((GESTURE_POINT_TYPE*)(&config_static[GESTURE_BUF_SIZE]))
350*4882a593Smuzhiyun static int  gesture_num,gesture_num_last;//gesture_num
351*4882a593Smuzhiyun static int  gesture_dis_min;
352*4882a593Smuzhiyun static int  gesture_deal;
353*4882a593Smuzhiyun static int  gesture_last;
354*4882a593Smuzhiyun static int  gesture_threshold[2];
355*4882a593Smuzhiyun static  int x_scale;
356*4882a593Smuzhiyun static  int y_scale;
357*4882a593Smuzhiyun static int double_down,double_up;
358*4882a593Smuzhiyun static const GESTURE_MODEL_TYPE * model_extern = NULL;
359*4882a593Smuzhiyun static int  model_extern_len = 0;
360*4882a593Smuzhiyun static int  GestureSqrt(int d);
361*4882a593Smuzhiyun static int  GestureDistance(GESTURE_POINT_TYPE* d1,GESTURE_POINT_TYPE* d2,int sqrt_able);
362*4882a593Smuzhiyun static int  GesturePush(GESTURE_POINT_TYPE* data);
363*4882a593Smuzhiyun static int  GestureStretch(void);
364*4882a593Smuzhiyun static int  GestureLength(void);
365*4882a593Smuzhiyun static int  GestureDeal(void);
366*4882a593Smuzhiyun static int  GestureModel(const GESTURE_MODEL_TYPE * model,int len,int threshold,int *out);
367*4882a593Smuzhiyun static int  GestureMain(unsigned int data[],unsigned int pn);
368*4882a593Smuzhiyun static void GestureStandard(void);
369*4882a593Smuzhiyun static void GestureInit(void);
370*4882a593Smuzhiyun static void ChangeXY(void);
371*4882a593Smuzhiyun static int  GestureLRUD(void);
372*4882a593Smuzhiyun static void GestureSet(unsigned int conf[]);
373*4882a593Smuzhiyun static const GESTURE_MODEL_TYPE model_default[]
374*4882a593Smuzhiyun ={
375*4882a593Smuzhiyun 	{0x10,'3',{
376*4882a593Smuzhiyun 	0x37170105,0x78580000,0xba990a03,0xedd92e14,0xb9d85347,0x7798655b,0x3657716b,0x1f156d74,
377*4882a593Smuzhiyun 	0x60406969,0xa2816f69,0xe3c28075,0xf9fbb899,0xc3e3e0d2,0x83a4f6ee,0x4262fffc,0x0021f7fd,}},
378*4882a593Smuzhiyun 	{0x10,'6',{
379*4882a593Smuzhiyun 	0xa2be0400,0x70881f10,0x4258402e,0x1d2e6c54,0x040ea084,0x0a01d6bc,0x381df9ec,0x7054fffd,
380*4882a593Smuzhiyun 	0xa88cfafe,0xdac2ddef,0xfff0b2cb,0xe2f78497,0xaac7747a,0x728e7472,0x3b56817b,0x0420968b,}},
381*4882a593Smuzhiyun 	{0x10,'7',{
382*4882a593Smuzhiyun 	0x12000001,0x37240000,0x5b490000,0x806e0000,0xa5930000,0xcab70000,0xefdc0300,0xf9fd1f0e,
383*4882a593Smuzhiyun 	0xe2ee3d30,0xc5d4564a,0xa7b76c61,0x8c9a8579,0x717e9f93,0x5863bbad,0x434cdbc9,0x3c3dffec,}},
384*4882a593Smuzhiyun 	{0x10,'8',{
385*4882a593Smuzhiyun 	0xdaff030c,0x8eb40000,0x41670c06,0x001c3116,0x431e5448,0x8f69635d,0xd1b58a6f,0xcedfd0af,
386*4882a593Smuzhiyun 	0x88acf5e6,0x3c62fffd,0x0718cdf1,0x341493aa,0x7a556d7d,0xc19e4f60,0xf9e51c3c,0xb5dc0005,}},
387*4882a593Smuzhiyun 	{0x10,'8',{
388*4882a593Smuzhiyun 	0x627d231e,0x2f49382c,0x03175a48,0x21098172,0x563c958c,0x856eb0a2,0x8f99dac4,0x5b76eee5,
389*4882a593Smuzhiyun 	0x243ffdf5,0x090ddbf4,0x2918acc2,0x4d3a8497,0x78636172,0xa38e4050,0xd0ba1f2e,0xffe7000f,}},
390*4882a593Smuzhiyun 	{0x10,'9',{
391*4882a593Smuzhiyun 	0xe8ff0715,0xb4ce0001,0x819a0500,0x4f68150c,0x1e362a1e,0x000c543c,0x270d7169,0x5b417273,
392*4882a593Smuzhiyun 	0x9076666d,0xbda74a5a,0xddcf1e36,0xc8d7321b,0xb4be634b,0xa4ac967d,0x959ccab0,0x898fffe4,}},
393*4882a593Smuzhiyun 	{0x10,'A',{
394*4882a593Smuzhiyun 	0xaeca000b,0x74900e02,0x41582d1b,0x182a5942,0x02099375,0x0600cfb1,0x2c15fcea,0x664af1fe,
395*4882a593Smuzhiyun 	0x957ec8dd,0xb5a894b0,0xc9bf5876,0xd7d31c3a,0xd4d75134,0xd3d38d6f,0xdbd4c9ab,0xffe9fce6,}},
396*4882a593Smuzhiyun 	{0x10,'A',{
397*4882a593Smuzhiyun 	0x8eab0102,0x56711307,0x2c3f3a25,0x0e1b6b51,0x0004a689,0x0e02ddc2,0x3e22fbf2,0x725be8fa,
398*4882a593Smuzhiyun 	0x9284b6d0,0xa69d7f9b,0xb3ae4562,0xb7b80b28,0xa7a6290c,0xb1aa6346,0xd0be947d,0xffe7bba7,}},
399*4882a593Smuzhiyun 	{0x10,'B',{
400*4882a593Smuzhiyun 	0x56591a00,0x474e4e35,0x343f8168,0x242cb59c,0x0f1be7ce,0x170ddbf4,0x3c25b4c4,0x6e549ca6,
401*4882a593Smuzhiyun 	0xa3889799,0xd8bd9d96,0xfcf1bea8,0xd3e9e4d4,0xa0baf6f0,0x6b85fcfa,0x3650fffd,0x001bfbff,}},
402*4882a593Smuzhiyun 	{0x10,'C',{
403*4882a593Smuzhiyun 	0xfaff2337,0xdaec0913,0xb0c50003,0x879c0500,0x5f720f09,0x3b4c271a,0x1d2b4534,0x08116a56,
404*4882a593Smuzhiyun 	0x0003937f,0x0a03bca8,0x2515ddce,0x4b38f2e8,0x7560fff9,0x9e89f7fd,0xc6b2e8f0,0xeed9d7df,}},
405*4882a593Smuzhiyun 	{0x10,'C',{
406*4882a593Smuzhiyun 	0xacbf0100,0x86990a04,0x64751b12,0x45533225,0x2b375141,0x17217160,0x080f9582,0x0103bba8,
407*4882a593Smuzhiyun 	0x0200e2cf,0x200ff9f1,0x4633fefc,0x6c59ffff,0x9380fcfd,0xb9a6f4f9,0xdccbe4ed,0xffeeceda,}},
408*4882a593Smuzhiyun 	{0x10,'C',{
409*4882a593Smuzhiyun 	0x57670a00,0x3a492116,0x222d3d2e,0x0f175e4d,0x0408816f,0x0001a693,0x0300cab8,0x0e07eddc,
410*4882a593Smuzhiyun 	0x2f1dfefb,0x5241f5fc,0x7362e2ec,0x8e80c9d6,0xa89bafbc,0xc3b594a1,0xe1d27e89,0xfff06673,}},
411*4882a593Smuzhiyun 	{0x10,'D',{
412*4882a593Smuzhiyun 	0x99b5858f,0x5f7c8883,0x28429c8f,0x010fc6ab,0x240cf4e1,0x5d41fefb,0x957af1fc,0xc1adcbe0,
413*4882a593Smuzhiyun 	0xd2cc92af,0xd3d25875,0xd7d71f3b,0xd7d71b02,0xd4d75538,0xd4d48f72,0xe1d9c9ac,0xffe6f4e6,}},
414*4882a593Smuzhiyun 	{0x10,'E',{
415*4882a593Smuzhiyun 	0x391c948f,0x73569595,0xad908a92,0xddc8677e,0xf1ee304d,0xc3dd0d1b,0x89a70002,0x536d1304,
416*4882a593Smuzhiyun 	0x233b3a25,0x08137053,0x0301aa8d,0x220edcc6,0x573af7ee,0x9174fffc,0xcaaef6ff,0xffe5dbeb,}},
417*4882a593Smuzhiyun 	{0x10,'G',{
418*4882a593Smuzhiyun 	0xaaca0000,0x698a0000,0x2a491106,0x000f4226,0x23067061,0x64437674,0xa3836874,0xdac04759,
419*4882a593Smuzhiyun 	0xfaec0b2a,0xfefb401f,0xffff8160,0xf5fdc0a1,0xc9e9eedf,0x89a9fff9,0x4869faff,0x0928e3f3,}},
420*4882a593Smuzhiyun 	{0x10,'G',{
421*4882a593Smuzhiyun 	0xeaff1421,0xb9d20308,0x88a00000,0x57700f05,0x2b3f2618,0x09174d37,0x00037f66,0x0d05af97,
422*4882a593Smuzhiyun 	0x2a1adac7,0x5940ede5,0x8b72f2f3,0xbca4e9ee,0xe4d2cbde,0xfbf09cb3,0xf5f8ceb5,0xe9f1ffe6,}},
423*4882a593Smuzhiyun 	{0x10,'H',{
424*4882a593Smuzhiyun 	0x03021300,0x06053a26,0x0b0a604d,0x0b0b8774,0x0a0bae9a,0x0506d4c1,0x0002fbe8,0x1104e0f0,
425*4882a593Smuzhiyun 	0x2e1ec3d1,0x503dadb5,0x7764a5a7,0x9e8aa1a2,0xc4b1a3a0,0xead8ada8,0xfff8d1bd,0xfffff8e4,}},
426*4882a593Smuzhiyun 	{0x10,'K',{
427*4882a593Smuzhiyun 	0x1d1a2000,0x171a6040,0x1114a080,0x060edfc0,0x1100e2ff,0x3420a8c5,0x6f4f8b95,0xaf8f8285,
428*4882a593Smuzhiyun 	0xefcf8683,0xe1fcb3a0,0xa0c1c2bb,0x6080c6c5,0x2c40c9c7,0x6c4cd8d1,0xac8ceadf,0xedccfef3,}},
429*4882a593Smuzhiyun 	{0x10,'K',{
430*4882a593Smuzhiyun 	0x22341900,0x15185436,0x0e119072,0x0c0cccae,0x0709f6ea,0x0a07b9d8,0x2918859e,0x5b406170,
431*4882a593Smuzhiyun 	0x90796658,0x627c8b7c,0x2a47a79a,0x110db8b1,0x4d2fbfbc,0x896bcac4,0xc3a6d9d1,0xffe1ede2,}},
432*4882a593Smuzhiyun 	{0x10,'L',{
433*4882a593Smuzhiyun 	0x3f4a0c00,0x35372c1c,0x2c314d3d,0x26296e5d,0x1b218e7e,0x1316af9f,0x0910cfc0,0x0004f1e0,
434*4882a593Smuzhiyun 	0x1605ffff,0x3727ffff,0x5848ffff,0x7a69fdff,0x9b8afcfd,0xbcabfcfc,0xddcdfafb,0xffeef9f9,}},
435*4882a593Smuzhiyun 	{0x10,'M',{
436*4882a593Smuzhiyun 	0x0900e0ff,0x2017a0c0,0x3a296381,0x4e442443,0x5a583010,0x6b5f6f4f,0x7471ae8f,0x7977eece,
437*4882a593Smuzhiyun 	0x8c80c5e5,0xa19886a5,0xbaad4766,0xd3c70a29,0xddda3516,0xe7e17555,0xf4f0b494,0xfffaf4d4,}},
438*4882a593Smuzhiyun 	{0x10,'N',{
439*4882a593Smuzhiyun 	0x0400e7ff,0x130bb8cf,0x281e89a1,0x38305a71,0x51452c43,0x675d1d13,0x68684e36,0x6b697f66,
440*4882a593Smuzhiyun 	0x726fb097,0x7875e0c8,0x907ee8f8,0xa79ebbd2,0xbfb38fa4,0xd1c95f77,0xe6da3148,0xfff20019,}},
441*4882a593Smuzhiyun 	{0x10,'O',{
442*4882a593Smuzhiyun 	0x2e3f311f,0x101e5c46,0x03088f76,0x0001c2a8,0x1e08e7da,0x4f35fdf4,0x8168fcff,0xb39beef5,
443*4882a593Smuzhiyun 	0xdac7cedf,0xf3e9a0b8,0xfef96d87,0xf9ff3c54,0xdaec1326,0xaac30108,0x77900100,0x465e1407,}},
444*4882a593Smuzhiyun 	{0x10,'O',{
445*4882a593Smuzhiyun 	0xd0e30213,0x9cb60000,0x68820c05,0x384f2416,0x17254c36,0x040c8066,0x0001b49a,0x1305e4ce,
446*4882a593Smuzhiyun 	0x442bfaf0,0x785efffe,0xab92f1f9,0xd3c1cfe3,0xf1e3a1b9,0xfffa6e88,0xf8ff3b54,0xd5e81024,}},
447*4882a593Smuzhiyun 	{0x10,'O',{
448*4882a593Smuzhiyun 	0x000f768a,0x0900455d,0x2b171e30,0x5a420611,0x8d740100,0xbca5170b,0xe3d23824,0xfcf2644c,
449*4882a593Smuzhiyun 	0xfaff977e,0xe3f0c4af,0xbdd2e6d7,0x8ea7faf2,0x5b74fefe,0x2e44e9f6,0x0a1bc2d6,0x02028fa9,}},
450*4882a593Smuzhiyun 	{0x10,'O',{
451*4882a593Smuzhiyun 	0x829c0900,0x4e682315,0x24384a34,0x08157c61,0x0002b598,0x0d03edd1,0x4326fffd,0x7a5feef8,
452*4882a593Smuzhiyun 	0xab93cfe0,0xd5c1a7bd,0xf4e67690,0xfbff3d5a,0xcfec1b26,0x96b31818,0x5e7a251d,0x28433b2f,}},
453*4882a593Smuzhiyun 	{0x10,'O',{
454*4882a593Smuzhiyun 	0x381e5e68,0x6e535156,0xa388504f,0xd8be5e56,0xf9ed876d,0xf9fcbaa1,0xd8ece5d2,0xa5c0f9f2,
455*4882a593Smuzhiyun 	0x708bfffd,0x3b55fbfe,0x1423d7ed,0x0006a4bf,0x09027089,0x26154157,0x50391e2e,0x7e670010,}},
456*4882a593Smuzhiyun 	{0x10,'O',{
457*4882a593Smuzhiyun 	0x8670020b,0xb8a01307,0xe3ce3423,0xf8f0664c,0xfffc9b81,0xf1faceb5,0xcee4f4e5,0x9ab4fffb,
458*4882a593Smuzhiyun 	0x657fffff,0x364ceaf8,0x1623c0d7,0x00098ea7,0x06015973,0x24122e41,0x4d380c1c,0x82670104,}},
459*4882a593Smuzhiyun 	{0x10,'S',{
460*4882a593Smuzhiyun 	0xb7cf0001,0x869e0301,0x556d0905,0x273e1f12,0x0311442c,0x2009665a,0x5138726b,0x826a7876,
461*4882a593Smuzhiyun 	0xb39b807b,0xdfcb998b,0xfff5bea7,0xdcf2ded0,0xadc6f1e8,0x7c94fbf7,0x4b63fffd,0x1932ffff,}},
462*4882a593Smuzhiyun 	{0x10,'S',{
463*4882a593Smuzhiyun 	0xcbde0200,0xa8ba1209,0x8597241a,0x6a753f2f,0x806c5751,0xa6935e5b,0xccb96662,0xf2e0746b,
464*4882a593Smuzhiyun 	0xfcff9482,0xe0f0b2a6,0xbdcfc2bb,0x97abd1c9,0x7385ddd7,0x4c60e8e3,0x273af4ee,0x0014fff9,}},
465*4882a593Smuzhiyun 	{0x10,'U',{
466*4882a593Smuzhiyun 	0x050d2209,0x0001573c,0x03008c71,0x1106bfa6,0x2f1bebda,0x604ae1f0,0x8873bccd,0xa59990a8,
467*4882a593Smuzhiyun 	0xbcb05f78,0xcdc72c46,0xd0d00911,0xc9cb3e24,0xc6c87359,0xc9c6a88d,0xd8d2ddc2,0xffe4fff6,}},
468*4882a593Smuzhiyun 	{0x10,'V',{
469*4882a593Smuzhiyun 	0x09000f00,0x1911301f,0x27205240,0x342d7563,0x413a9785,0x4f47b9a8,0x6057d9c9,0x7569f9ea,
470*4882a593Smuzhiyun 	0x9486f4ff,0xa99fd5e5,0xb8b0b4c5,0xc9c093a3,0xdbd17484,0xe9e35263,0xf5ef2f41,0xfff90b1d,}},
471*4882a593Smuzhiyun 	{0x10,'V',{
472*4882a593Smuzhiyun 	0x08001908,0x160f3b2b,0x251d5d4c,0x312b806f,0x3e37a392,0x4843c6b5,0x524de9d8,0x5b58f2fb,
473*4882a593Smuzhiyun 	0x6560cfe0,0x776dafbf,0x8a8090a0,0x9d947080,0xb4a85361,0xccc03745,0xe6d91d2a,0xfff2000e,}},
474*4882a593Smuzhiyun 	{0x10,'W',{
475*4882a593Smuzhiyun 	0x06001f00,0x110c5f3f,0x1c189f7f,0x2822debe,0x4131e3fd,0x554ba4c3,0x655c6484,0x786f2444,
476*4882a593Smuzhiyun 	0x847f2f0f,0x8a866f4f,0x928eae8f,0x9e99eece,0xbaacd0ee,0xd5c893b3,0xebe05373,0xfff61333,}},
477*4882a593Smuzhiyun 	{0x10,'W',{
478*4882a593Smuzhiyun 	0xf7ff2000,0xe4ed6040,0xd5dba181,0xbdcbe0c0,0xa0aad3f3,0x909892b3,0x848a5272,0x80811131,
479*4882a593Smuzhiyun 	0x777d3d1d,0x636d7e5e,0x535bbf9e,0x3c48fdde,0x272fc1e2,0x121a82a2,0x030a4161,0x00020021,}},
480*4882a593Smuzhiyun 	{0x10,'Y',{
481*4882a593Smuzhiyun 	0x16000b13,0x442d0303,0x4b48341b,0x61505e4b,0x91795c62,0xbca74551,0xe1d02637,0xfcf40c14,
482*4882a593Smuzhiyun 	0xe8f13922,0xdbe16951,0xd6d99a82,0xced3cbb2,0xb0c4f0e1,0x7f98fbf7,0x4e67fefd,0x1d36fdff,}},
483*4882a593Smuzhiyun 	{0x10,'Z',{
484*4882a593Smuzhiyun 	0x30160200,0x644a0403,0x997f0303,0xcdb30202,0xe7e80d00,0xc4d63622,0x9bb05c4a,0x73857f6c,
485*4882a593Smuzhiyun 	0x5061a893,0x293eccbb,0x0013f2dd,0x2d13fcfd,0x6248f6f8,0x967cf1f3,0xcbb1edef,0xffe5f1ec,}},
486*4882a593Smuzhiyun 	//--------------------------------------------------------------------------------------------
487*4882a593Smuzhiyun 	{0x10,0x1001,{
488*4882a593Smuzhiyun 	0x0003ecff,0x0502c6d9,0x0b099fb2,0x1410788c,0x221b5265,0x362b2f40,0x5341121d,0x7966020a,
489*4882a593Smuzhiyun 	0xa08d0100,0xc3b3170b,0xd9ce3a28,0xede25f4d,0xf4f28672,0xfaf6ac99,0xfffdd3c0,0xfffffae6,}},
490*4882a593Smuzhiyun 	{0x10,0x1002,{
491*4882a593Smuzhiyun 	0x1900847d,0x4c328785,0x7f658b88,0xb198898b,0xe3cb7f88,0xf8f24f68,0xecf81d35,0xbfd9010b,
492*4882a593Smuzhiyun 	0x90a61504,0x8186462d,0x7c7d7960,0x7f7bac93,0x8883dfc6,0xaf97fff4,0xdcc7eafa,0xffeec1d7,}},
493*4882a593Smuzhiyun 	{0x10,0x1003,{
494*4882a593Smuzhiyun 	0x7543141a,0xd7a82e17,0xf8f78f5c,0xc6e6e9bf,0x6497f8fa,0x1338b3db,0x03024f82,0x4a1c0620,
495*4882a593Smuzhiyun 	0xaf7c1001,0xf8da582b,0xeafebc8b,0x9acbfbe6,0x3868eeff,0x0a1892c4,0x2712305f,0x85520e11,}},
496*4882a593Smuzhiyun 	{0x10,0x1004,{
497*4882a593Smuzhiyun 	0x04003204,0x120b8e60,0x1714ebbd,0x2f27b8e6,0x43385b89,0x5b4c032d,0x6a666032,0x7770bc8e,
498*4882a593Smuzhiyun 	0x8c82b8e6,0x9b945c8a,0xaea2012d,0xbbb75d2f,0xc9c1ba8c,0xe3d5bce7,0xf1ea5f8d,0xfff50231,}},
499*4882a593Smuzhiyun 	{0x10,0x1005,{
500*4882a593Smuzhiyun 	0x1900020a,0x4d330400,0x7c65180a,0xa18f3f2b,0xb3ac7258,0xbcb8a58b,0xb0b9d7bf,0x8aa0fcec,
501*4882a593Smuzhiyun 	0x5971f2fd,0x414bc2db,0x433f8ea8,0x534a5d76,0x71613246,0x9d85101e,0xd0b60609,0xffea1409,}},
502*4882a593Smuzhiyun 	{0x10,0x1006,{
503*4882a593Smuzhiyun 	0xdeff0714,0x9abc0002,0x57790a02,0x1d373018,0x01076d4b,0x2f0f988a,0x72519c9c,0xb2948b9c,
504*4882a593Smuzhiyun 	0xa3bc576b,0x60815653,0x26417963,0x020eb191,0x2005e7d3,0x6442fbf4,0xa785fbff,0xebc9e7f3,}},
505*4882a593Smuzhiyun 	{0x10,0x1007,{
506*4882a593Smuzhiyun 	0xf6ff0600,0xe4ed140c,0xd5dd261d,0xc5cd362e,0xb3bc463e,0xa2aa574e,0x939a6860,0x83897970,
507*4882a593Smuzhiyun 	0x747c8a82,0x646c9c93,0x525baca4,0x434abdb4,0x333bcfc6,0x222addd5,0x121beee6,0x0009fff6,}},
508*4882a593Smuzhiyun 	{0x10,0x1008,{
509*4882a593Smuzhiyun 	0x09000900,0x19111b13,0x28202d24,0x39303d35,0x49424e45,0x5a515d56,0x6b626d65,0x7d747b74,
510*4882a593Smuzhiyun 	0x8e868b82,0x9d969c93,0xaca4aea5,0xbcb4bfb6,0xcac4d1c7,0xdbd2e1d9,0xece3f1e9,0xfff5fff8,}},
511*4882a593Smuzhiyun 	{0x10,0x1009,{
512*4882a593Smuzhiyun 	0x0a00faff,0x1d14edf4,0x2e25dce5,0x3e36cbd4,0x4e44bac2,0x5f57aab2,0x6f679aa2,0x7f778890,
513*4882a593Smuzhiyun 	0x8c85757e,0x9c94636b,0xaba3515a,0xbbb2414a,0xcbc33039,0xddd31f28,0xeee51119,0xfff7000a,}},
514*4882a593Smuzhiyun 	{0x10,0x100a,{
515*4882a593Smuzhiyun 	0xf4fffaff,0xe1eaeff6,0xd1d9dde6,0xc1cacdd5,0xb4bbbac3,0xa2aca8b0,0x929a99a1,0x83888791,
516*4882a593Smuzhiyun 	0x767d747d,0x666e636b,0x535c545e,0x444d424b,0x333d323a,0x242b212a,0x141c0f18,0x000a0008,}},
517*4882a593Smuzhiyun 	{0x10,0x100b,{
518*4882a593Smuzhiyun 	0x30000208,0x90600200,0xf1c11e0c,0xb5e64d3f,0x55855653,0x32245556,0x93625756,0xf1c3745e,
519*4882a593Smuzhiyun 	0xbaeaa997,0x598ab2b0,0x0f29aab1,0x7040a8a7,0xd1a0b8ae,0xd0f8ecd0,0x6f9ffcf5,0x0e3ffcff,}},
520*4882a593Smuzhiyun 	{0x10,0x100c,{
521*4882a593Smuzhiyun 	0x2600140c,0x66494226,0x827c8d66,0x6d80d8b4,0x284ffaf4,0x0a0ab9e0,0x411f8097,0x8e689182,
522*4882a593Smuzhiyun 	0xd6b47f94,0xf9f23960,0xd5f80012,0x91af270a,0x7e83734c,0x7e7dc19a,0xb490fae5,0xffdbe9fe,}},
523*4882a593Smuzhiyun 	{0x10,0x100d,{
524*4882a593Smuzhiyun 	0x768e0c00,0x465e2619,0x192f4635,0x0107745a,0x32178a85,0x674d858a,0x9b81747d,0xccb45c69,
525*4882a593Smuzhiyun 	0xf7e33b4d,0xebfd0d21,0xb6d00004,0x939e270d,0x888d5d42,0x83859378,0x7c80c9ae,0x6c75ffe4,}},
526*4882a593Smuzhiyun 	{0x10,0x100e,{
527*4882a593Smuzhiyun 	0xb3bd1000,0x9ea82d1e,0x87924a3b,0x6f7b6658,0x56628375,0x3e4a9e91,0x2934bcad,0x1720ddcd,
528*4882a593Smuzhiyun 	0x010bfced,0x2513ffff,0x4937fdff,0x6d5bf9fa,0x9280f4f7,0xb6a4f0f1,0xdac8eeef,0xffececed,}},
529*4882a593Smuzhiyun };
530*4882a593Smuzhiyun #endif
531*4882a593Smuzhiyun //+++++++++++++++++++++++++++++++++++++++++++++++++++++++
SortBubble(int t[],int size)532*4882a593Smuzhiyun static void SortBubble(int t[],int size)
533*4882a593Smuzhiyun {
534*4882a593Smuzhiyun 	int temp = 0;
535*4882a593Smuzhiyun 	int m,n;
536*4882a593Smuzhiyun 	for(m=0;m<size;m++)
537*4882a593Smuzhiyun 	{
538*4882a593Smuzhiyun 		for(n=m+1;n<size;n++)
539*4882a593Smuzhiyun 		{
540*4882a593Smuzhiyun 			temp = t[m];
541*4882a593Smuzhiyun 			if (temp>t[n])
542*4882a593Smuzhiyun 			{
543*4882a593Smuzhiyun 				t[m] = t[n];
544*4882a593Smuzhiyun 				t[n] = temp;
545*4882a593Smuzhiyun 			}
546*4882a593Smuzhiyun 		}
547*4882a593Smuzhiyun 	}
548*4882a593Smuzhiyun }
abs(int i)549*4882a593Smuzhiyun int abs(int i){
550*4882a593Smuzhiyun  	if(i<0)
551*4882a593Smuzhiyun 		return ~(--i);
552*4882a593Smuzhiyun 	return i;
553*4882a593Smuzhiyun }
Sqrt(int d)554*4882a593Smuzhiyun static int Sqrt(int d)
555*4882a593Smuzhiyun {
556*4882a593Smuzhiyun 	int ret = 0;
557*4882a593Smuzhiyun 	int i;
558*4882a593Smuzhiyun 	for(i=14;i>=0;i--)
559*4882a593Smuzhiyun 	{
560*4882a593Smuzhiyun 		if((ret + (0x1<<i))*(ret + (0x1<<i)) <= d)
561*4882a593Smuzhiyun 			ret |= (0x1<<i);
562*4882a593Smuzhiyun 	}
563*4882a593Smuzhiyun 	return ret;
564*4882a593Smuzhiyun }
565*4882a593Smuzhiyun 
PointCoor(void)566*4882a593Smuzhiyun static void PointCoor(void)
567*4882a593Smuzhiyun {
568*4882a593Smuzhiyun 	int i;
569*4882a593Smuzhiyun 	point_num &= 0xff;
570*4882a593Smuzhiyun 	for(i=0;i<point_num;i++)
571*4882a593Smuzhiyun 	{
572*4882a593Smuzhiyun 		if(global_state.other.ex)
573*4882a593Smuzhiyun 			point_now[i].all &= (FLAG_COOR_EX | FLAG_KEY | FLAG_ABLE);
574*4882a593Smuzhiyun 		else
575*4882a593Smuzhiyun 			point_now[i].all &= (FLAG_COOR | FLAG_KEY | FLAG_ABLE);
576*4882a593Smuzhiyun 	}
577*4882a593Smuzhiyun }
PointRepeat(void)578*4882a593Smuzhiyun static void PointRepeat(void)
579*4882a593Smuzhiyun {
580*4882a593Smuzhiyun 	int i,j;
581*4882a593Smuzhiyun 	int x,y;
582*4882a593Smuzhiyun 	int x_min,x_max,y_min,y_max;
583*4882a593Smuzhiyun 	int pn;
584*4882a593Smuzhiyun 	if(point_near)
585*4882a593Smuzhiyun 		point_near --;
586*4882a593Smuzhiyun 	if(prev_num > point_num)
587*4882a593Smuzhiyun 		point_near = 8;
588*4882a593Smuzhiyun 	if(point_repeat[0]==0 || point_repeat[1]==0)
589*4882a593Smuzhiyun 	{
590*4882a593Smuzhiyun 		if(point_near)
591*4882a593Smuzhiyun 			pn = 96;
592*4882a593Smuzhiyun 		else
593*4882a593Smuzhiyun 			pn = 32;
594*4882a593Smuzhiyun 	}
595*4882a593Smuzhiyun 	else
596*4882a593Smuzhiyun 	{
597*4882a593Smuzhiyun 		if(point_near)
598*4882a593Smuzhiyun 			pn = point_repeat[1];
599*4882a593Smuzhiyun 		else
600*4882a593Smuzhiyun 			pn = point_repeat[0];
601*4882a593Smuzhiyun 	}
602*4882a593Smuzhiyun 	for(i=0;i<POINT_MAX;i++)
603*4882a593Smuzhiyun 	{
604*4882a593Smuzhiyun 		if(point_now[i].all == 0)
605*4882a593Smuzhiyun 			continue;
606*4882a593Smuzhiyun 		if (point_now[i].other.key)
607*4882a593Smuzhiyun 			continue;
608*4882a593Smuzhiyun 		x_min = point_now[i].other.x - pn;
609*4882a593Smuzhiyun 		x_max = point_now[i].other.x + pn;
610*4882a593Smuzhiyun 		y_min = point_now[i].other.y - pn;
611*4882a593Smuzhiyun 		y_max = point_now[i].other.y + pn;
612*4882a593Smuzhiyun 		for(j=i+1;j<POINT_MAX;j++)
613*4882a593Smuzhiyun 		{
614*4882a593Smuzhiyun 			if(point_now[j].all == 0)
615*4882a593Smuzhiyun 				continue;
616*4882a593Smuzhiyun 			if (point_now[j].other.key)
617*4882a593Smuzhiyun 				continue;
618*4882a593Smuzhiyun 			x = point_now[j].other.x;
619*4882a593Smuzhiyun 			y = point_now[j].other.y;
620*4882a593Smuzhiyun 			if(x>x_min && x<x_max && y>y_min && y<y_max)
621*4882a593Smuzhiyun 			{
622*4882a593Smuzhiyun 				point_now[i].other.x =
623*4882a593Smuzhiyun 					(point_now[i].other.x +
624*4882a593Smuzhiyun 					 point_now[j].other.x + 1) / 2;
625*4882a593Smuzhiyun 				point_now[i].other.y =
626*4882a593Smuzhiyun 					(point_now[i].other.y +
627*4882a593Smuzhiyun 					 point_now[j].other.y + 1) / 2;
628*4882a593Smuzhiyun 				point_now[j].all = 0;
629*4882a593Smuzhiyun 				i--;
630*4882a593Smuzhiyun 				point_near = 8;
631*4882a593Smuzhiyun 				break;
632*4882a593Smuzhiyun 			}
633*4882a593Smuzhiyun 		}
634*4882a593Smuzhiyun 	}
635*4882a593Smuzhiyun }
636*4882a593Smuzhiyun 
PointPointer(void)637*4882a593Smuzhiyun static void PointPointer(void)
638*4882a593Smuzhiyun {
639*4882a593Smuzhiyun 	int i,pn;
640*4882a593Smuzhiyun 	point_n ++ ;
641*4882a593Smuzhiyun 	if(point_n >= PP_DEEP * PS_DEEP * PR_DEEP * PRESSURE_DEEP)
642*4882a593Smuzhiyun 		point_n = 0;
643*4882a593Smuzhiyun 	pn = point_n % PP_DEEP;
644*4882a593Smuzhiyun 	for(i=0;i<PP_DEEP;i++)
645*4882a593Smuzhiyun 	{
646*4882a593Smuzhiyun 		pp[i] = point_array[pn];
647*4882a593Smuzhiyun 		if(pn == 0)
648*4882a593Smuzhiyun 			pn = PP_DEEP - 1;
649*4882a593Smuzhiyun 		else
650*4882a593Smuzhiyun 			pn--;
651*4882a593Smuzhiyun 	}
652*4882a593Smuzhiyun 	pn = point_n % PS_DEEP;
653*4882a593Smuzhiyun 	for(i=0;i<PS_DEEP;i++)
654*4882a593Smuzhiyun 	{
655*4882a593Smuzhiyun 		ps[i] = point_array[pn+PP_DEEP];
656*4882a593Smuzhiyun 		if(pn == 0)
657*4882a593Smuzhiyun 			pn = PS_DEEP - 1;
658*4882a593Smuzhiyun 		else
659*4882a593Smuzhiyun 			pn--;
660*4882a593Smuzhiyun 	}
661*4882a593Smuzhiyun 	pn = point_n % PR_DEEP;
662*4882a593Smuzhiyun 	for(i=0;i<PR_DEEP;i++)
663*4882a593Smuzhiyun 	{
664*4882a593Smuzhiyun 		pr[i] = point_array[pn+PP_DEEP+PS_DEEP];
665*4882a593Smuzhiyun 		if(pn == 0)
666*4882a593Smuzhiyun 			pn = PR_DEEP - 1;
667*4882a593Smuzhiyun 		else
668*4882a593Smuzhiyun 			pn--;
669*4882a593Smuzhiyun 	}
670*4882a593Smuzhiyun 	pn = point_n % PRESSURE_DEEP;
671*4882a593Smuzhiyun 	for(i=0;i<PRESSURE_DEEP;i++)
672*4882a593Smuzhiyun 	{
673*4882a593Smuzhiyun 		pa[i] = pressure_array[pn];
674*4882a593Smuzhiyun 		if(pn == 0)
675*4882a593Smuzhiyun 			pn = PRESSURE_DEEP - 1;
676*4882a593Smuzhiyun 		else
677*4882a593Smuzhiyun 			pn--;
678*4882a593Smuzhiyun 	}
679*4882a593Smuzhiyun 	//------------------------------------------------------
680*4882a593Smuzhiyun 	pn = 0;
681*4882a593Smuzhiyun 	for(i=0;i<POINT_MAX;i++)
682*4882a593Smuzhiyun 	{
683*4882a593Smuzhiyun 		if(point_now[i].all)
684*4882a593Smuzhiyun 			point_now[pn++].all = point_now[i].all;
685*4882a593Smuzhiyun 		pp[0][i].all = 0;
686*4882a593Smuzhiyun 		ps[0][i].all = 0;
687*4882a593Smuzhiyun 		pr[0][i].all = 0;
688*4882a593Smuzhiyun 	}
689*4882a593Smuzhiyun 	point_num = pn;
690*4882a593Smuzhiyun 	for(i=pn;i<POINT_MAX;i++)
691*4882a593Smuzhiyun 		point_now[i].all = 0;
692*4882a593Smuzhiyun }
693*4882a593Smuzhiyun 
CCO(unsigned int x,unsigned int coe[],int k)694*4882a593Smuzhiyun static unsigned int CCO(unsigned int x,unsigned int coe[],int k)
695*4882a593Smuzhiyun {
696*4882a593Smuzhiyun 	if(k == 0)
697*4882a593Smuzhiyun 	{
698*4882a593Smuzhiyun 		if(x & 32)
699*4882a593Smuzhiyun 			return (x & ~31)+(31 - (coe[31-(x&31)] & 31));
700*4882a593Smuzhiyun 		else
701*4882a593Smuzhiyun 			return (x & ~31)+(coe[x&31] & 31);
702*4882a593Smuzhiyun 	}
703*4882a593Smuzhiyun 	if(k == 1)
704*4882a593Smuzhiyun 	{
705*4882a593Smuzhiyun 		if(x & 64)
706*4882a593Smuzhiyun 			return (x & ~63)+(63 - (coe[63-(x&63)] & 63));
707*4882a593Smuzhiyun 		else
708*4882a593Smuzhiyun 			return (x & ~63)+(coe[x&63] & 63);
709*4882a593Smuzhiyun 	}
710*4882a593Smuzhiyun 	if(k == 2)
711*4882a593Smuzhiyun 	{
712*4882a593Smuzhiyun 		return (x & ~63)+(coe[x&63] & 63);
713*4882a593Smuzhiyun 	}
714*4882a593Smuzhiyun 	return 0;
715*4882a593Smuzhiyun }
716*4882a593Smuzhiyun 
CoordinateCorrect(void)717*4882a593Smuzhiyun static void CoordinateCorrect(void)
718*4882a593Smuzhiyun {
719*4882a593Smuzhiyun 	typedef struct
720*4882a593Smuzhiyun 	{
721*4882a593Smuzhiyun 		unsigned int range;
722*4882a593Smuzhiyun 		unsigned int group;
723*4882a593Smuzhiyun 	}MULTI_TYPE;
724*4882a593Smuzhiyun #ifdef LINE_MULTI_SIZE
725*4882a593Smuzhiyun 	#define	LINE_SIZE	LINE_MULTI_SIZE
726*4882a593Smuzhiyun #else
727*4882a593Smuzhiyun 	#define	LINE_SIZE		4
728*4882a593Smuzhiyun #endif
729*4882a593Smuzhiyun 	int i,j;
730*4882a593Smuzhiyun 	unsigned int *px[LINE_SIZE+1],*py[LINE_SIZE+1];
731*4882a593Smuzhiyun 	MULTI_TYPE multi_x[LINE_SIZE],multi_y[LINE_SIZE];
732*4882a593Smuzhiyun 	unsigned int edge_size = 64;
733*4882a593Smuzhiyun 	int kx,ky;
734*4882a593Smuzhiyun 	if((coordinate_correct_able&0xf) == 0)
735*4882a593Smuzhiyun 		return;
736*4882a593Smuzhiyun 	kx = (coordinate_correct_able>>4)&0xf;
737*4882a593Smuzhiyun 	ky = (coordinate_correct_able>>8)&0xf;
738*4882a593Smuzhiyun 	px[0] = coordinate_correct_coe_x;
739*4882a593Smuzhiyun 	py[0] = coordinate_correct_coe_y;
740*4882a593Smuzhiyun 	for(i=0;i<LINE_SIZE;i++)
741*4882a593Smuzhiyun 	{
742*4882a593Smuzhiyun 		px[i+1] = NULL;
743*4882a593Smuzhiyun 		py[i+1] = NULL;
744*4882a593Smuzhiyun 	}
745*4882a593Smuzhiyun 	if(kx == 3 || ky == 3)
746*4882a593Smuzhiyun 	{
747*4882a593Smuzhiyun 		i=0;
748*4882a593Smuzhiyun 		if(((coordinate_correct_able>>4)&0xf) == 3)
749*4882a593Smuzhiyun 			px[1] = multi_group[i++];
750*4882a593Smuzhiyun 		if(((coordinate_correct_able>>8)&0xf) == 3)
751*4882a593Smuzhiyun 			py[1] = multi_group[i++];
752*4882a593Smuzhiyun 	}
753*4882a593Smuzhiyun 	else
754*4882a593Smuzhiyun 	{
755*4882a593Smuzhiyun 		for(i=0;i<LINE_SIZE;i++)
756*4882a593Smuzhiyun 		{
757*4882a593Smuzhiyun 			multi_x[i].range = multi_x_array[i] & 0xffff;
758*4882a593Smuzhiyun 			multi_x[i].group = multi_x_array[i] >> 16;
759*4882a593Smuzhiyun 			multi_y[i].range = multi_y_array[i] & 0xffff;
760*4882a593Smuzhiyun 			multi_y[i].group = multi_y_array[i] >> 16;
761*4882a593Smuzhiyun 		}
762*4882a593Smuzhiyun 		j=1;
763*4882a593Smuzhiyun 		for(i=0;i<LINE_SIZE;i++)
764*4882a593Smuzhiyun 			if(multi_x[i].range && multi_x[i].group<LINE_SIZE)
765*4882a593Smuzhiyun 				px[j++] = multi_group[multi_x[i].group];
766*4882a593Smuzhiyun 		j=1;
767*4882a593Smuzhiyun 		for(i=0;i<LINE_SIZE;i++)
768*4882a593Smuzhiyun 			if(multi_y[i].range && multi_y[i].group<LINE_SIZE)
769*4882a593Smuzhiyun 				py[j++] = multi_group[multi_y[i].group];
770*4882a593Smuzhiyun 	}
771*4882a593Smuzhiyun 	for(i=0;i<(int)point_num && i<POINT_MAX;i++)
772*4882a593Smuzhiyun 	{
773*4882a593Smuzhiyun 		if(point_now[i].all==0)
774*4882a593Smuzhiyun 			break;
775*4882a593Smuzhiyun 		if (point_now[i].other.key != 0)
776*4882a593Smuzhiyun 			continue;
777*4882a593Smuzhiyun 		if (point_now[i].other.x >= edge_size &&
778*4882a593Smuzhiyun 			point_now[i].other.x <= drv_num_nokey * 64 - edge_size)
779*4882a593Smuzhiyun 		{
780*4882a593Smuzhiyun 			if(kx == 3)
781*4882a593Smuzhiyun 			{
782*4882a593Smuzhiyun 				if (point_now[i].other.x & 64)
783*4882a593Smuzhiyun 					point_now[i].other.x = CCO(point_now[i].other.x, px[0], 2);
784*4882a593Smuzhiyun 				else
785*4882a593Smuzhiyun 					point_now[i].other.x = CCO(point_now[i].other.x, px[1], 2);
786*4882a593Smuzhiyun 			}
787*4882a593Smuzhiyun 			else
788*4882a593Smuzhiyun 			{
789*4882a593Smuzhiyun 				for(j=0;j<LINE_SIZE+1;j++)
790*4882a593Smuzhiyun 				{
791*4882a593Smuzhiyun 					if (!(j >= LINE_SIZE ||
792*4882a593Smuzhiyun 						px[j + 1] == NULL ||
793*4882a593Smuzhiyun 						multi_x[j].range == 0 ||
794*4882a593Smuzhiyun 						point_now[i].other.x < multi_x[j].range))
795*4882a593Smuzhiyun 						continue;
796*4882a593Smuzhiyun 					point_now[i].other.x = CCO(point_now[i].other.x, px[j], kx);
797*4882a593Smuzhiyun 					break;
798*4882a593Smuzhiyun 				}
799*4882a593Smuzhiyun 			}
800*4882a593Smuzhiyun 		}
801*4882a593Smuzhiyun 		if (point_now[i].other.y >= edge_size &&
802*4882a593Smuzhiyun 			point_now[i].other.y <= sen_num_nokey * 64 - edge_size)
803*4882a593Smuzhiyun 		{
804*4882a593Smuzhiyun 			if(ky == 3)
805*4882a593Smuzhiyun 			{
806*4882a593Smuzhiyun 				if (point_now[i].other.y & 64)
807*4882a593Smuzhiyun 					point_now[i].other.y = CCO(point_now[i].other.y, py[0], 2);
808*4882a593Smuzhiyun 				else
809*4882a593Smuzhiyun 					point_now[i].other.y = CCO(point_now[i].other.y, py[1], 2);
810*4882a593Smuzhiyun 			}
811*4882a593Smuzhiyun 			else
812*4882a593Smuzhiyun 			{
813*4882a593Smuzhiyun 				for(j=0;j<LINE_SIZE+1;j++)
814*4882a593Smuzhiyun 				{
815*4882a593Smuzhiyun 					if (!(j >= LINE_SIZE ||
816*4882a593Smuzhiyun 						py[j + 1] == NULL ||
817*4882a593Smuzhiyun 						multi_y[j].range == 0 ||
818*4882a593Smuzhiyun 						point_now[i].other.y < multi_y[j].range))
819*4882a593Smuzhiyun 						continue;
820*4882a593Smuzhiyun 					point_now[i].other.y = CCO(point_now[i].other.y, py[j], ky);
821*4882a593Smuzhiyun 					break;
822*4882a593Smuzhiyun 				}
823*4882a593Smuzhiyun 			}
824*4882a593Smuzhiyun 		}
825*4882a593Smuzhiyun 	}
826*4882a593Smuzhiyun #undef LINE_SIZE
827*4882a593Smuzhiyun }
828*4882a593Smuzhiyun 
PointPredictOne(unsigned int n)829*4882a593Smuzhiyun static void PointPredictOne(unsigned int n)
830*4882a593Smuzhiyun {
831*4882a593Smuzhiyun 	pp[0][n].all = pp[1][n].all & FLAG_COOR;
832*4882a593Smuzhiyun 	pp[0][n].other.predict = 0;
833*4882a593Smuzhiyun }
834*4882a593Smuzhiyun 
PointPredictTwo(unsigned int n)835*4882a593Smuzhiyun static void PointPredictTwo(unsigned int n)
836*4882a593Smuzhiyun {
837*4882a593Smuzhiyun 	unsigned int t;
838*4882a593Smuzhiyun 	pp[0][n].all = 0;
839*4882a593Smuzhiyun 	t = pp[1][n].other.x * 2;
840*4882a593Smuzhiyun 	if (t > pp[2][n].other.x)
841*4882a593Smuzhiyun 		t -= pp[2][n].other.x;
842*4882a593Smuzhiyun 	else
843*4882a593Smuzhiyun 		t = 0;
844*4882a593Smuzhiyun 	if(t > 0xffff)
845*4882a593Smuzhiyun 		pp[0][n].other.x = 0xffff;
846*4882a593Smuzhiyun 	else
847*4882a593Smuzhiyun 		pp[0][n].other.x = t;
848*4882a593Smuzhiyun 	t = pp[1][n].other.y * 2;
849*4882a593Smuzhiyun 	if (t > pp[2][n].other.y)
850*4882a593Smuzhiyun 		t -= pp[2][n].other.y;
851*4882a593Smuzhiyun 	else
852*4882a593Smuzhiyun 		t = 0;
853*4882a593Smuzhiyun 	if(t > 0xfff)
854*4882a593Smuzhiyun 		pp[0][n].other.y = 0xfff;
855*4882a593Smuzhiyun 	else
856*4882a593Smuzhiyun 		pp[0][n].other.y = t;
857*4882a593Smuzhiyun 	pp[0][n].other.predict = 1;
858*4882a593Smuzhiyun }
859*4882a593Smuzhiyun 
PointPredictThree(unsigned int n)860*4882a593Smuzhiyun static void PointPredictThree(unsigned int n)
861*4882a593Smuzhiyun {
862*4882a593Smuzhiyun 	unsigned int t,t2;
863*4882a593Smuzhiyun 	pp[0][n].all = 0;
864*4882a593Smuzhiyun 	t = pp[1][n].other.x * 5 + pp[3][n].other.x;
865*4882a593Smuzhiyun 	t2 = pp[2][n].other.x * 4;
866*4882a593Smuzhiyun 	if(t > t2)
867*4882a593Smuzhiyun 		t -= t2;
868*4882a593Smuzhiyun 	else
869*4882a593Smuzhiyun 		t = 0;
870*4882a593Smuzhiyun 	t /= 2;
871*4882a593Smuzhiyun 	if(t > 0xffff)
872*4882a593Smuzhiyun 		pp[0][n].other.x = 0xffff;
873*4882a593Smuzhiyun 	else
874*4882a593Smuzhiyun 		pp[0][n].other.x = t;
875*4882a593Smuzhiyun 	t = pp[1][n].other.y * 5 + pp[3][n].other.y;
876*4882a593Smuzhiyun 	t2 = pp[2][n].other.y * 4;
877*4882a593Smuzhiyun 	if(t > t2)
878*4882a593Smuzhiyun 		t -= t2;
879*4882a593Smuzhiyun 	else
880*4882a593Smuzhiyun 		t = 0;
881*4882a593Smuzhiyun 	t /= 2;
882*4882a593Smuzhiyun 	if(t > 0xfff)
883*4882a593Smuzhiyun 		pp[0][n].other.y = 0xfff;
884*4882a593Smuzhiyun 	else
885*4882a593Smuzhiyun 		pp[0][n].other.y = t;
886*4882a593Smuzhiyun 	pp[0][n].other.predict = 1;
887*4882a593Smuzhiyun }
888*4882a593Smuzhiyun 
PointPredict(void)889*4882a593Smuzhiyun static void PointPredict(void)
890*4882a593Smuzhiyun {
891*4882a593Smuzhiyun 	int i;
892*4882a593Smuzhiyun 	for(i=0;i<POINT_MAX;i++)
893*4882a593Smuzhiyun 	{
894*4882a593Smuzhiyun 		if(pp[1][i].all != 0)
895*4882a593Smuzhiyun 		{
896*4882a593Smuzhiyun 			if (global_state.other.interpolation
897*4882a593Smuzhiyun 				|| pp[2][i].all == 0
898*4882a593Smuzhiyun 				|| pp[2][i].other.fill != 0
899*4882a593Smuzhiyun 				|| pp[3][i].other.fill != 0
900*4882a593Smuzhiyun 				|| pp[1][i].other.key != 0
901*4882a593Smuzhiyun 				|| global_state.other.only)
902*4882a593Smuzhiyun 			{
903*4882a593Smuzhiyun 				PointPredictOne(i);
904*4882a593Smuzhiyun 			}
905*4882a593Smuzhiyun 			else if(pp[2][i].all != 0)
906*4882a593Smuzhiyun 			{
907*4882a593Smuzhiyun 				if(pp[3][i].all != 0)
908*4882a593Smuzhiyun 					PointPredictThree(i);
909*4882a593Smuzhiyun 				else
910*4882a593Smuzhiyun 					PointPredictTwo(i);
911*4882a593Smuzhiyun 			}
912*4882a593Smuzhiyun 			pp[0][i].all |= FLAG_FILL;
913*4882a593Smuzhiyun 			pa[0][i] = pa[1][i];
914*4882a593Smuzhiyun 		}
915*4882a593Smuzhiyun 		else
916*4882a593Smuzhiyun 			pp[0][i].all = 0x0fff0fff;
917*4882a593Smuzhiyun 		if (pp[1][i].other.key)
918*4882a593Smuzhiyun 			pp[0][i].all |= FLAG_KEY;
919*4882a593Smuzhiyun 	}
920*4882a593Smuzhiyun }
921*4882a593Smuzhiyun 
PointDistance(gsl_POINT_TYPE * p1,gsl_POINT_TYPE * p2)922*4882a593Smuzhiyun static unsigned int PointDistance(gsl_POINT_TYPE *p1,gsl_POINT_TYPE *p2)
923*4882a593Smuzhiyun {
924*4882a593Smuzhiyun 	int a,b,ret;
925*4882a593Smuzhiyun 	a = p1->dis.x;
926*4882a593Smuzhiyun 	b = p2->dis.x;
927*4882a593Smuzhiyun 	ret = (a-b)*(a-b);
928*4882a593Smuzhiyun 	a = p1->dis.y;
929*4882a593Smuzhiyun 	b = p2->dis.y;
930*4882a593Smuzhiyun 	ret += (a-b)*(a-b);
931*4882a593Smuzhiyun 	return ret;
932*4882a593Smuzhiyun }
933*4882a593Smuzhiyun 
DistanceInit(gsl_DISTANCE_TYPE * p)934*4882a593Smuzhiyun static void DistanceInit(gsl_DISTANCE_TYPE *p)
935*4882a593Smuzhiyun {
936*4882a593Smuzhiyun 	int i;
937*4882a593Smuzhiyun 	unsigned int *p_int = &(p->d[0][0]);
938*4882a593Smuzhiyun 	for(i=0;i<POINT_MAX*POINT_MAX;i++)
939*4882a593Smuzhiyun 		*p_int++ = 0x7fffffff;
940*4882a593Smuzhiyun }
941*4882a593Smuzhiyun 
DistanceMin(gsl_DISTANCE_TYPE * p)942*4882a593Smuzhiyun static int DistanceMin(gsl_DISTANCE_TYPE *p)
943*4882a593Smuzhiyun {
944*4882a593Smuzhiyun 	int i,j;
945*4882a593Smuzhiyun 	p->min = 0x7fffffff;
946*4882a593Smuzhiyun 	for(j=0;j<POINT_MAX;j++)
947*4882a593Smuzhiyun 	{
948*4882a593Smuzhiyun 		for(i=0;i<POINT_MAX;i++)
949*4882a593Smuzhiyun 		{
950*4882a593Smuzhiyun 			if(p->d[j][i] < p->min)
951*4882a593Smuzhiyun 			{
952*4882a593Smuzhiyun 				p->i = i;
953*4882a593Smuzhiyun 				p->j = j;
954*4882a593Smuzhiyun 				p->min = p->d[j][i];
955*4882a593Smuzhiyun 			}
956*4882a593Smuzhiyun 		}
957*4882a593Smuzhiyun 	}
958*4882a593Smuzhiyun 	if(p->min == 0x7fffffff)
959*4882a593Smuzhiyun 		return 0;
960*4882a593Smuzhiyun 	return 1;
961*4882a593Smuzhiyun }
962*4882a593Smuzhiyun 
DistanceIgnore(gsl_DISTANCE_TYPE * p)963*4882a593Smuzhiyun static void DistanceIgnore(gsl_DISTANCE_TYPE *p)
964*4882a593Smuzhiyun {
965*4882a593Smuzhiyun 	int i,j;
966*4882a593Smuzhiyun 	for(i=0;i<POINT_MAX;i++)
967*4882a593Smuzhiyun 		p->d[p->j][i] = 0x7fffffff;
968*4882a593Smuzhiyun 	for(j=0;j<POINT_MAX;j++)
969*4882a593Smuzhiyun 		p->d[j][p->i] = 0x7fffffff;
970*4882a593Smuzhiyun }
971*4882a593Smuzhiyun 
SpeedGet(int d)972*4882a593Smuzhiyun static int SpeedGet(int d)
973*4882a593Smuzhiyun {
974*4882a593Smuzhiyun 	int i;
975*4882a593Smuzhiyun 	for(i=8;i>0;i--)
976*4882a593Smuzhiyun 	{
977*4882a593Smuzhiyun 		if(d > 0x100<<i)
978*4882a593Smuzhiyun 			break;
979*4882a593Smuzhiyun 	}
980*4882a593Smuzhiyun 	return i;
981*4882a593Smuzhiyun }
982*4882a593Smuzhiyun 
PointId(void)983*4882a593Smuzhiyun static void PointId(void)
984*4882a593Smuzhiyun {
985*4882a593Smuzhiyun 	int i,j;
986*4882a593Smuzhiyun 	gsl_DISTANCE_TYPE distance;
987*4882a593Smuzhiyun 	unsigned int id_speed[POINT_MAX];
988*4882a593Smuzhiyun 	DistanceInit(&distance);
989*4882a593Smuzhiyun 	for(i=0;i<POINT_MAX;i++)
990*4882a593Smuzhiyun 	{
991*4882a593Smuzhiyun 		if (pp[0][i].other.predict == 0 || pp[1][i].other.fill != 0)
992*4882a593Smuzhiyun 			id_speed[i] = id_first_coe;
993*4882a593Smuzhiyun 		else
994*4882a593Smuzhiyun 			id_speed[i] = SpeedGet( PointDistance(&pp[1][i],&pp[0][i]) );
995*4882a593Smuzhiyun 	}
996*4882a593Smuzhiyun 	for(i=0;i<POINT_MAX;i++)
997*4882a593Smuzhiyun 	{
998*4882a593Smuzhiyun 		if(pp[0][i].all == FLAG_COOR)
999*4882a593Smuzhiyun 			continue;
1000*4882a593Smuzhiyun 		for(j=0;j<point_num && j<POINT_MAX;j++)
1001*4882a593Smuzhiyun 		{
1002*4882a593Smuzhiyun 			distance.d[j][i] = PointDistance(&point_now[j],&pp[0][i]);
1003*4882a593Smuzhiyun 		}
1004*4882a593Smuzhiyun 	}
1005*4882a593Smuzhiyun 	if(point_num == 0)
1006*4882a593Smuzhiyun 		return;
1007*4882a593Smuzhiyun 	if (global_state.other.only)
1008*4882a593Smuzhiyun 	{
1009*4882a593Smuzhiyun 		//do
1010*4882a593Smuzhiyun 		{
1011*4882a593Smuzhiyun 			if(DistanceMin(&distance))
1012*4882a593Smuzhiyun 			{
1013*4882a593Smuzhiyun 				if (pp[1][0].all != 0 &&
1014*4882a593Smuzhiyun 					pp[1][0].other.key !=
1015*4882a593Smuzhiyun 					point_now[distance.j].other.key)
1016*4882a593Smuzhiyun 				{
1017*4882a593Smuzhiyun 					DistanceIgnore(&distance);
1018*4882a593Smuzhiyun 					return;
1019*4882a593Smuzhiyun 					//continue;
1020*4882a593Smuzhiyun 				}
1021*4882a593Smuzhiyun 				pp[0][0].all = point_now[distance.j].all;
1022*4882a593Smuzhiyun 			}
1023*4882a593Smuzhiyun 			else
1024*4882a593Smuzhiyun 				pp[0][0].all = point_now[0].all;
1025*4882a593Smuzhiyun 			for(i=0;i<POINT_MAX;i++)
1026*4882a593Smuzhiyun 				point_now[i].all = 0;
1027*4882a593Smuzhiyun 		}
1028*4882a593Smuzhiyun 		//while(0);
1029*4882a593Smuzhiyun 		point_num = 1;
1030*4882a593Smuzhiyun 	}
1031*4882a593Smuzhiyun 	else
1032*4882a593Smuzhiyun 	{
1033*4882a593Smuzhiyun 		for (j=0;j<point_num && j<POINT_MAX;j++)
1034*4882a593Smuzhiyun 		{
1035*4882a593Smuzhiyun 			if (DistanceMin(&distance) == 0)
1036*4882a593Smuzhiyun 				break;
1037*4882a593Smuzhiyun 			if (distance.min >= (id_static_coe +
1038*4882a593Smuzhiyun 				id_speed[distance.i] * id_speed_coe) /**average/(soft_average+1)*/)
1039*4882a593Smuzhiyun 			{
1040*4882a593Smuzhiyun 				//point_now[distance.j].id = 0xf;//new id
1041*4882a593Smuzhiyun 				continue;
1042*4882a593Smuzhiyun 			}
1043*4882a593Smuzhiyun 			pp[0][distance.i].all = point_now[distance.j].all;
1044*4882a593Smuzhiyun 			pa[0][distance.i] = pressure_now[distance.j];
1045*4882a593Smuzhiyun 			point_now[distance.j].all = 0;
1046*4882a593Smuzhiyun 			DistanceIgnore(&distance);
1047*4882a593Smuzhiyun 		}
1048*4882a593Smuzhiyun 	}
1049*4882a593Smuzhiyun }
1050*4882a593Smuzhiyun 
ClearLenPP(int i)1051*4882a593Smuzhiyun static int ClearLenPP(int i)
1052*4882a593Smuzhiyun {
1053*4882a593Smuzhiyun 	int n;
1054*4882a593Smuzhiyun 	for(n=0;n<PP_DEEP;n++)
1055*4882a593Smuzhiyun 	{
1056*4882a593Smuzhiyun 		if(pp[n][i].all)
1057*4882a593Smuzhiyun 			break;
1058*4882a593Smuzhiyun 	}
1059*4882a593Smuzhiyun 	return n;
1060*4882a593Smuzhiyun }
PointNewId(void)1061*4882a593Smuzhiyun static void PointNewId(void)
1062*4882a593Smuzhiyun {
1063*4882a593Smuzhiyun 	int id,j;
1064*4882a593Smuzhiyun 	for(j=0;j<POINT_MAX;j++)
1065*4882a593Smuzhiyun 		if((pp[0][j].all & FLAG_COOR) == FLAG_COOR)
1066*4882a593Smuzhiyun 			pp[0][j].all = 0;
1067*4882a593Smuzhiyun 	for(j=0;j<POINT_MAX;j++)
1068*4882a593Smuzhiyun 	{
1069*4882a593Smuzhiyun 		if(point_now[j].all != 0)
1070*4882a593Smuzhiyun 		{
1071*4882a593Smuzhiyun 			if (point_now[j].other.able)
1072*4882a593Smuzhiyun 				continue;
1073*4882a593Smuzhiyun 			for(id=1;id<=POINT_MAX;id++)
1074*4882a593Smuzhiyun 			{
1075*4882a593Smuzhiyun 				if(ClearLenPP(id-1) > (int)(1+1))
1076*4882a593Smuzhiyun 				{
1077*4882a593Smuzhiyun 					pp[0][id-1].all = point_now[j].all;
1078*4882a593Smuzhiyun 					pa[0][id-1] = pressure_now[j];
1079*4882a593Smuzhiyun 					point_now[j].all = 0;
1080*4882a593Smuzhiyun 					break;
1081*4882a593Smuzhiyun 				}
1082*4882a593Smuzhiyun 			}
1083*4882a593Smuzhiyun 		}
1084*4882a593Smuzhiyun 	}
1085*4882a593Smuzhiyun }
1086*4882a593Smuzhiyun 
PointOrder(void)1087*4882a593Smuzhiyun static void PointOrder(void)
1088*4882a593Smuzhiyun {
1089*4882a593Smuzhiyun 	int i;
1090*4882a593Smuzhiyun 	for(i=0;i<POINT_MAX;i++)
1091*4882a593Smuzhiyun 	{
1092*4882a593Smuzhiyun 		if (pp[0][i].other.fill == 0)
1093*4882a593Smuzhiyun 			continue;
1094*4882a593Smuzhiyun 		if (pp[1][i].all == 0 || pp[1][i].other.fill != 0 || filter_able == 0 || filter_able == 1)
1095*4882a593Smuzhiyun 		{
1096*4882a593Smuzhiyun 			pp[0][i].all = 0;
1097*4882a593Smuzhiyun 			pressure_now[i] = 0;
1098*4882a593Smuzhiyun 		}
1099*4882a593Smuzhiyun 	}
1100*4882a593Smuzhiyun }
1101*4882a593Smuzhiyun 
PointCross(void)1102*4882a593Smuzhiyun static void PointCross(void)
1103*4882a593Smuzhiyun {
1104*4882a593Smuzhiyun 	unsigned int i,j;
1105*4882a593Smuzhiyun 	unsigned int t;
1106*4882a593Smuzhiyun 	for(j=0;j<POINT_MAX;j++)
1107*4882a593Smuzhiyun 	{
1108*4882a593Smuzhiyun 		for(i=j+1;i<POINT_MAX;i++)
1109*4882a593Smuzhiyun 		{
1110*4882a593Smuzhiyun 			if(pp[0][i].all == 0 || pp[0][j].all == 0
1111*4882a593Smuzhiyun 			|| pp[1][i].all == 0 || pp[1][j].all == 0)
1112*4882a593Smuzhiyun 				continue;
1113*4882a593Smuzhiyun 			if (((pp[0][j].other.x < pp[0][i].other.x && pp[1][j].other.x > pp[1][i].other.x)
1114*4882a593Smuzhiyun 				|| (pp[0][j].other.x > pp[0][i].other.x && pp[1][j].other.x < pp[1][i].other.x))
1115*4882a593Smuzhiyun 				&& ((pp[0][j].other.y < pp[0][i].other.y && pp[1][j].other.y > pp[1][i].other.y)
1116*4882a593Smuzhiyun 				|| (pp[0][j].other.y > pp[0][i].other.y && pp[1][j].other.y < pp[1][i].other.y)))
1117*4882a593Smuzhiyun 			{
1118*4882a593Smuzhiyun 				t = pp[0][i].other.x;
1119*4882a593Smuzhiyun 				pp[0][i].other.x = pp[0][j].other.x;
1120*4882a593Smuzhiyun 				pp[0][j].other.x = t;
1121*4882a593Smuzhiyun 				t = pp[0][i].other.y;
1122*4882a593Smuzhiyun 				pp[0][i].other.y = pp[0][j].other.y;
1123*4882a593Smuzhiyun 				pp[0][j].other.y = t;
1124*4882a593Smuzhiyun 			}
1125*4882a593Smuzhiyun 		}
1126*4882a593Smuzhiyun 	}
1127*4882a593Smuzhiyun }
1128*4882a593Smuzhiyun 
GetPointNum(gsl_POINT_TYPE * pt)1129*4882a593Smuzhiyun static void GetPointNum(gsl_POINT_TYPE *pt)
1130*4882a593Smuzhiyun {
1131*4882a593Smuzhiyun 	int i;
1132*4882a593Smuzhiyun 	point_num = 0;
1133*4882a593Smuzhiyun 	for(i=0;i<POINT_MAX;i++)
1134*4882a593Smuzhiyun 		if(pt[i].all != 0)
1135*4882a593Smuzhiyun 			point_num++;
1136*4882a593Smuzhiyun }
1137*4882a593Smuzhiyun 
PointDelay(void)1138*4882a593Smuzhiyun static void PointDelay(void)
1139*4882a593Smuzhiyun {
1140*4882a593Smuzhiyun 	int i,j;
1141*4882a593Smuzhiyun 	for(i=0;i<POINT_MAX;i++)
1142*4882a593Smuzhiyun 	{
1143*4882a593Smuzhiyun 		if(report_delay == 0)
1144*4882a593Smuzhiyun 		{//
1145*4882a593Smuzhiyun 			point_delay[i].all = 0;
1146*4882a593Smuzhiyun 			if(pp[0][i].all)
1147*4882a593Smuzhiyun 				point_delay[i].other.able = 1;
1148*4882a593Smuzhiyun 			continue;
1149*4882a593Smuzhiyun 		}
1150*4882a593Smuzhiyun 		if (pp[0][i].all != 0 &&
1151*4882a593Smuzhiyun 			point_delay[i].other.init == 0 &&
1152*4882a593Smuzhiyun 			point_delay[i].other.able == 0)
1153*4882a593Smuzhiyun 		{
1154*4882a593Smuzhiyun 			if(point_num == 0)
1155*4882a593Smuzhiyun 				continue;
1156*4882a593Smuzhiyun 			point_delay[i].other.delay = (report_delay >> 3 *
1157*4882a593Smuzhiyun 				((point_num>10 ? 10 : point_num) - 1)) & 0x7;
1158*4882a593Smuzhiyun 			point_delay[i].other.report = (report_ahead >> 3 *
1159*4882a593Smuzhiyun 				((point_num>10 ? 10 : point_num) - 1)) & 0x7;
1160*4882a593Smuzhiyun 			if (point_delay[i].other.report > point_delay[i].other.delay)
1161*4882a593Smuzhiyun 				point_delay[i].other.report = point_delay[i].other.delay;
1162*4882a593Smuzhiyun 			point_delay[i].other.init = 1;
1163*4882a593Smuzhiyun 		}
1164*4882a593Smuzhiyun 		if(pp[0][i].all == 0)
1165*4882a593Smuzhiyun 		{
1166*4882a593Smuzhiyun 			point_delay[i].other.init = 0;
1167*4882a593Smuzhiyun 		}
1168*4882a593Smuzhiyun 		if (point_delay[i].other.able == 0 && point_delay[i].other.init != 0)
1169*4882a593Smuzhiyun 		{
1170*4882a593Smuzhiyun 			for (j = 0; j <= (int)point_delay[i].other.delay; j++)
1171*4882a593Smuzhiyun 				if (pp[j][i].all == 0 ||
1172*4882a593Smuzhiyun 					pp[j][i].other.fill != 0 ||
1173*4882a593Smuzhiyun 					pp[j][i].other.able != 0)
1174*4882a593Smuzhiyun 					break;
1175*4882a593Smuzhiyun 			if (j <= (int)point_delay[i].other.delay)
1176*4882a593Smuzhiyun 				continue;
1177*4882a593Smuzhiyun 			point_delay[i].other.able = 1;
1178*4882a593Smuzhiyun 		}
1179*4882a593Smuzhiyun 		if (pp[point_delay[i].other.report][i].all == 0)
1180*4882a593Smuzhiyun 		{
1181*4882a593Smuzhiyun 			point_delay[i].other.able = 0;
1182*4882a593Smuzhiyun 			continue;
1183*4882a593Smuzhiyun 		}
1184*4882a593Smuzhiyun 		if (point_delay[i].other.able == 0)
1185*4882a593Smuzhiyun 			continue;
1186*4882a593Smuzhiyun 		if (point_delay[i].other.report)
1187*4882a593Smuzhiyun 		{
1188*4882a593Smuzhiyun 			if (PointDistance(&pp[point_delay[i].other.report][i],
1189*4882a593Smuzhiyun 				&pp[point_delay[i].other.report - 1][i]) < 3 * 3)
1190*4882a593Smuzhiyun 				point_delay[i].other.report--;
1191*4882a593Smuzhiyun 		}
1192*4882a593Smuzhiyun 	}
1193*4882a593Smuzhiyun }
1194*4882a593Smuzhiyun 
FilterOne(int i,int * ps_c,int * pr_c,int denominator)1195*4882a593Smuzhiyun static void FilterOne(int i,int *ps_c,int *pr_c,int denominator)
1196*4882a593Smuzhiyun {
1197*4882a593Smuzhiyun 	int j;
1198*4882a593Smuzhiyun 	int x=0,y=0;
1199*4882a593Smuzhiyun 	pr[0][i].all = ps[0][i].all;
1200*4882a593Smuzhiyun 	if(pr[0][i].all == 0)
1201*4882a593Smuzhiyun 		return;
1202*4882a593Smuzhiyun 	if(denominator <= 0)
1203*4882a593Smuzhiyun 		return;
1204*4882a593Smuzhiyun 	for(j=0;j<8;j++)
1205*4882a593Smuzhiyun 	{
1206*4882a593Smuzhiyun 		x += (int)pr[j][i].other.x * (int)pr_c[j] +
1207*4882a593Smuzhiyun 			(int)ps[j][i].other.x * (int)ps_c[j];
1208*4882a593Smuzhiyun 		y += (int)pr[j][i].other.y * (int)pr_c[j] +
1209*4882a593Smuzhiyun 			(int)ps[j][i].other.y * (int)ps_c[j];
1210*4882a593Smuzhiyun 	}
1211*4882a593Smuzhiyun 	x = (x + denominator/2) / denominator;
1212*4882a593Smuzhiyun 	y = (y + denominator/2) / denominator;
1213*4882a593Smuzhiyun 	if(x < 0)
1214*4882a593Smuzhiyun 		x = 0;
1215*4882a593Smuzhiyun 	if(x > 0xffff)
1216*4882a593Smuzhiyun 		x = 0xffff;
1217*4882a593Smuzhiyun 	if(y < 0)
1218*4882a593Smuzhiyun 		y = 0;
1219*4882a593Smuzhiyun 	if(y > 0xfff)
1220*4882a593Smuzhiyun 		y = 0xfff;
1221*4882a593Smuzhiyun 	pr[0][i].other.x = x;
1222*4882a593Smuzhiyun 	pr[0][i].other.y = y;
1223*4882a593Smuzhiyun }
1224*4882a593Smuzhiyun 
FilterSpeed(int i)1225*4882a593Smuzhiyun static unsigned int FilterSpeed(int i)
1226*4882a593Smuzhiyun {
1227*4882a593Smuzhiyun 	return (Sqrt(PointDistance(&ps[0][i], &ps[1][i])) +
1228*4882a593Smuzhiyun 		Sqrt(PointDistance(&ps[1][i], &ps[2][i])))/2;
1229*4882a593Smuzhiyun }
1230*4882a593Smuzhiyun 
MedianSpeedOver(int id,int deep)1231*4882a593Smuzhiyun static int MedianSpeedOver(int id,int deep)
1232*4882a593Smuzhiyun {
1233*4882a593Smuzhiyun 	int i;
1234*4882a593Smuzhiyun 	unsigned int dis;
1235*4882a593Smuzhiyun 	int speed_over = 0;
1236*4882a593Smuzhiyun 	deep = deep/2 - 1;
1237*4882a593Smuzhiyun 	if(deep < 0 || deep > 3)
1238*4882a593Smuzhiyun 		return TRUE;
1239*4882a593Smuzhiyun 	dis = median_dis[deep] * median_dis[deep];
1240*4882a593Smuzhiyun 	for(i=0;i<=deep && i<POINT_DEEP;i++)
1241*4882a593Smuzhiyun 	{
1242*4882a593Smuzhiyun 		if(PointDistance(&ps[i][id],&ps[i+1][id]) > dis)
1243*4882a593Smuzhiyun 			speed_over ++;
1244*4882a593Smuzhiyun 	}
1245*4882a593Smuzhiyun 	if(speed_over >= 2)
1246*4882a593Smuzhiyun 		return TRUE;
1247*4882a593Smuzhiyun 	return FALSE;
1248*4882a593Smuzhiyun }
1249*4882a593Smuzhiyun 
PointMedian(void)1250*4882a593Smuzhiyun static void PointMedian(void)
1251*4882a593Smuzhiyun {
1252*4882a593Smuzhiyun 	int i,j;
1253*4882a593Smuzhiyun 	int deep;
1254*4882a593Smuzhiyun 	int buf_x[PS_DEEP],buf_y[PS_DEEP];
1255*4882a593Smuzhiyun 	for(i=0;i<POINT_MAX;i++)
1256*4882a593Smuzhiyun 	{
1257*4882a593Smuzhiyun 		if(filter_deep[i] < 3)
1258*4882a593Smuzhiyun 			deep = 3;
1259*4882a593Smuzhiyun 		else
1260*4882a593Smuzhiyun 			deep = filter_deep[i] + 2;
1261*4882a593Smuzhiyun 		if(deep >= PS_DEEP)
1262*4882a593Smuzhiyun 			deep = PS_DEEP-1;
1263*4882a593Smuzhiyun 		deep |= 1;
1264*4882a593Smuzhiyun 		for(;deep>=3;deep-=2)
1265*4882a593Smuzhiyun 		{
1266*4882a593Smuzhiyun 			if(MedianSpeedOver(i,deep))
1267*4882a593Smuzhiyun 				continue;
1268*4882a593Smuzhiyun 			for(j=0;j<deep;j++)
1269*4882a593Smuzhiyun 			{
1270*4882a593Smuzhiyun 				buf_x[j] = ps[j][i].other.x;
1271*4882a593Smuzhiyun 				buf_y[j] = ps[j][i].other.y;
1272*4882a593Smuzhiyun 			}
1273*4882a593Smuzhiyun 			SortBubble(buf_x,deep);
1274*4882a593Smuzhiyun 			SortBubble(buf_y,deep);
1275*4882a593Smuzhiyun 			pr[0][i].other.x = buf_x[deep / 2];
1276*4882a593Smuzhiyun 			pr[0][i].other.y = buf_y[deep / 2];
1277*4882a593Smuzhiyun 		}
1278*4882a593Smuzhiyun 		filter_deep[i] = deep;
1279*4882a593Smuzhiyun 	}
1280*4882a593Smuzhiyun }
PointFilter(void)1281*4882a593Smuzhiyun static void PointFilter(void)
1282*4882a593Smuzhiyun {
1283*4882a593Smuzhiyun 	int i,j;
1284*4882a593Smuzhiyun 	int speed_now;
1285*4882a593Smuzhiyun 	int filter_speed[6];
1286*4882a593Smuzhiyun 	int ps_c[8];
1287*4882a593Smuzhiyun 	int pr_c[8];
1288*4882a593Smuzhiyun 	for(i=0;i<POINT_MAX;i++)
1289*4882a593Smuzhiyun 	{
1290*4882a593Smuzhiyun 		pr[0][i].all = ps[0][i].all;
1291*4882a593Smuzhiyun 	}
1292*4882a593Smuzhiyun 	for(i=0;i<POINT_MAX;i++)
1293*4882a593Smuzhiyun 	{
1294*4882a593Smuzhiyun 		if(pr[0][i].all!=0 && pr[1][i].all == 0)
1295*4882a593Smuzhiyun 		{
1296*4882a593Smuzhiyun 			for(j=1;j<PR_DEEP;j++)
1297*4882a593Smuzhiyun 				pr[j][i].all = ps[0][i].all;
1298*4882a593Smuzhiyun 			for(j=1;j<PS_DEEP;j++)
1299*4882a593Smuzhiyun 				ps[j][i].all = ps[0][i].all;
1300*4882a593Smuzhiyun 		}
1301*4882a593Smuzhiyun 	}
1302*4882a593Smuzhiyun 	if(filter_able >=0 && filter_able <= 1)
1303*4882a593Smuzhiyun 		return;
1304*4882a593Smuzhiyun 	if(filter_able > 1)
1305*4882a593Smuzhiyun 	{
1306*4882a593Smuzhiyun 		for(i=0;i<8;i++)
1307*4882a593Smuzhiyun 		{
1308*4882a593Smuzhiyun 			ps_c[i] = (filter_coe[i/4] >> ((i%4)*8)) & 0xff;
1309*4882a593Smuzhiyun 			pr_c[i] = (filter_coe[i/4+2] >> ((i%4)*8)) & 0xff;
1310*4882a593Smuzhiyun 			if(ps_c[i] >= 0x80)
1311*4882a593Smuzhiyun 				ps_c[i] |= 0xffffff00;
1312*4882a593Smuzhiyun 			if(pr_c[i] >= 0x80)
1313*4882a593Smuzhiyun 				pr_c[i] |= 0xffffff00;
1314*4882a593Smuzhiyun 		}
1315*4882a593Smuzhiyun 		for(i=0;i<POINT_MAX;i++)
1316*4882a593Smuzhiyun 		{
1317*4882a593Smuzhiyun 			FilterOne(i,ps_c,pr_c,filter_able);
1318*4882a593Smuzhiyun 		}
1319*4882a593Smuzhiyun 	}
1320*4882a593Smuzhiyun 	else if(filter_able == -1)
1321*4882a593Smuzhiyun 	{
1322*4882a593Smuzhiyun 		PointMedian();
1323*4882a593Smuzhiyun 	}
1324*4882a593Smuzhiyun 	else if(filter_able < 0)
1325*4882a593Smuzhiyun 	{
1326*4882a593Smuzhiyun 		for(i=0;i<4;i++)
1327*4882a593Smuzhiyun 			filter_speed[i+1] = median_dis[i];
1328*4882a593Smuzhiyun 		filter_speed[0] = median_dis[0] * 2 - median_dis[1];
1329*4882a593Smuzhiyun 		filter_speed[5] = median_dis[3] /2;
1330*4882a593Smuzhiyun 		for(i=0;i<POINT_MAX;i++)
1331*4882a593Smuzhiyun 		{
1332*4882a593Smuzhiyun  			if(pr[0][i].all == 0)
1333*4882a593Smuzhiyun 			{
1334*4882a593Smuzhiyun 				filter_deep[i] = 0;
1335*4882a593Smuzhiyun 				continue;
1336*4882a593Smuzhiyun 			}
1337*4882a593Smuzhiyun 			speed_now = FilterSpeed(i);
1338*4882a593Smuzhiyun 			if (filter_deep[i] > 0 &&
1339*4882a593Smuzhiyun 				speed_now > filter_speed[filter_deep[i]+1 - 2])
1340*4882a593Smuzhiyun 				filter_deep[i] --;
1341*4882a593Smuzhiyun 			else if(filter_deep[i] < 3 &&
1342*4882a593Smuzhiyun 				speed_now < filter_speed[filter_deep[i]+1 + 2])
1343*4882a593Smuzhiyun 				filter_deep[i] ++;
1344*4882a593Smuzhiyun 
1345*4882a593Smuzhiyun 			FilterOne(i,ps_coe[filter_deep[i]],
1346*4882a593Smuzhiyun 				pr_coe[filter_deep[i]],0-filter_able);
1347*4882a593Smuzhiyun 		}
1348*4882a593Smuzhiyun 	}
1349*4882a593Smuzhiyun }
KeyMap(int * drv,int * sen)1350*4882a593Smuzhiyun static unsigned int KeyMap(int *drv,int *sen)
1351*4882a593Smuzhiyun {
1352*4882a593Smuzhiyun 	typedef struct
1353*4882a593Smuzhiyun 	{
1354*4882a593Smuzhiyun 		unsigned int up_down,left_right;
1355*4882a593Smuzhiyun 		unsigned int coor;
1356*4882a593Smuzhiyun 	}KEY_TYPE_RANGE;
1357*4882a593Smuzhiyun 	KEY_TYPE_RANGE *key_range = (KEY_TYPE_RANGE * )key_range_array;
1358*4882a593Smuzhiyun 	int i;
1359*4882a593Smuzhiyun 	for(i=0;i<8;i++)
1360*4882a593Smuzhiyun 	{
1361*4882a593Smuzhiyun 		if ((unsigned int)*drv >= (key_range[i].up_down >> 16)
1362*4882a593Smuzhiyun 		&& (unsigned int)*drv <= (key_range[i].up_down & 0xffff)
1363*4882a593Smuzhiyun 		&& (unsigned int)*sen >= (key_range[i].left_right >> 16)
1364*4882a593Smuzhiyun 		&& (unsigned int)*sen <= (key_range[i].left_right & 0xffff))
1365*4882a593Smuzhiyun 		{
1366*4882a593Smuzhiyun 			*sen = key_range[i].coor >> 16;
1367*4882a593Smuzhiyun 			*drv = key_range[i].coor & 0xffff;
1368*4882a593Smuzhiyun 			return key_range[i].coor;
1369*4882a593Smuzhiyun 		}
1370*4882a593Smuzhiyun 	}
1371*4882a593Smuzhiyun 	return 0;
1372*4882a593Smuzhiyun }
1373*4882a593Smuzhiyun 
ScreenResolution(gsl_POINT_TYPE * p)1374*4882a593Smuzhiyun static unsigned int ScreenResolution(gsl_POINT_TYPE *p)
1375*4882a593Smuzhiyun {
1376*4882a593Smuzhiyun 	int x,y;
1377*4882a593Smuzhiyun 	x = p->other.x;
1378*4882a593Smuzhiyun 	y = p->other.y;
1379*4882a593Smuzhiyun 	if (p->other.key == FALSE)
1380*4882a593Smuzhiyun 	{
1381*4882a593Smuzhiyun 		y = ((y - match_y[1]) * match_y[0] + 2048)/4096;
1382*4882a593Smuzhiyun 		x = ((x - match_x[1]) * match_x[0] + 2048)/4096 ;
1383*4882a593Smuzhiyun 	}
1384*4882a593Smuzhiyun 	y = y * (int)screen_y_max / ((int)sen_num_nokey * 64);
1385*4882a593Smuzhiyun 	x = x * (int)screen_x_max / ((int)drv_num_nokey * 64);
1386*4882a593Smuzhiyun 	if (p->other.key == FALSE)
1387*4882a593Smuzhiyun 	{
1388*4882a593Smuzhiyun 		if((ignore_y[0]!=0 || ignore_y[1]!=0))
1389*4882a593Smuzhiyun 		{
1390*4882a593Smuzhiyun 			if(y < ignore_y[0])
1391*4882a593Smuzhiyun 				return 0;
1392*4882a593Smuzhiyun 			if(ignore_y[1] <= screen_y_max/2 && y > screen_y_max - ignore_y[1])
1393*4882a593Smuzhiyun 				return 0;
1394*4882a593Smuzhiyun 			if(ignore_y[1] >= screen_y_max/2 && y > ignore_y[1])
1395*4882a593Smuzhiyun 				return 0;
1396*4882a593Smuzhiyun 		}
1397*4882a593Smuzhiyun 		if(ignore_x[0]!=0 || ignore_x[1]!=0)
1398*4882a593Smuzhiyun 		{
1399*4882a593Smuzhiyun 			if(x < ignore_x[0])
1400*4882a593Smuzhiyun 				return 0;
1401*4882a593Smuzhiyun 			if(ignore_x[1] <= screen_y_max/2 && x > screen_x_max - ignore_x[1])
1402*4882a593Smuzhiyun 				return 0;
1403*4882a593Smuzhiyun 			if(ignore_x[1] >= screen_y_max/2 && x > ignore_x[1])
1404*4882a593Smuzhiyun 				return 0;
1405*4882a593Smuzhiyun 		}
1406*4882a593Smuzhiyun 		if(y <= (int)edge_cut[2])
1407*4882a593Smuzhiyun 			y = (int)edge_cut[2] + 1;
1408*4882a593Smuzhiyun 		if(y >= screen_y_max - (int)edge_cut[3])
1409*4882a593Smuzhiyun 			y = screen_y_max - (int)edge_cut[3] - 1;
1410*4882a593Smuzhiyun 		if(x <= (int)edge_cut[0])
1411*4882a593Smuzhiyun 			x = (int)edge_cut[0] + 1;
1412*4882a593Smuzhiyun 		if(x >= screen_x_max - (int)edge_cut[1])
1413*4882a593Smuzhiyun 			x = screen_x_max - (int)edge_cut[1] - 1;
1414*4882a593Smuzhiyun 		if (global_flag.other.opposite_x)
1415*4882a593Smuzhiyun 			y = screen_y_max - y;
1416*4882a593Smuzhiyun 		if (global_flag.other.opposite_y)
1417*4882a593Smuzhiyun 			x = screen_x_max - x;
1418*4882a593Smuzhiyun 		if (global_flag.other.opposite_xy)
1419*4882a593Smuzhiyun 		{
1420*4882a593Smuzhiyun 			y ^= x;
1421*4882a593Smuzhiyun 			x ^= y;
1422*4882a593Smuzhiyun 			y ^= x;
1423*4882a593Smuzhiyun 		}
1424*4882a593Smuzhiyun 	}
1425*4882a593Smuzhiyun 	else
1426*4882a593Smuzhiyun 	{
1427*4882a593Smuzhiyun 		if(y < 0)
1428*4882a593Smuzhiyun 			y = 0;
1429*4882a593Smuzhiyun 		if(x < 0)
1430*4882a593Smuzhiyun 			x = 0;
1431*4882a593Smuzhiyun 		if((key_map_able & 0x1) != FALSE && KeyMap(&x,&y) == 0)
1432*4882a593Smuzhiyun 			return 0;
1433*4882a593Smuzhiyun 	}
1434*4882a593Smuzhiyun 	return ((y<<16) & 0x0fff0000) + (x & 0x0000ffff);
1435*4882a593Smuzhiyun }
1436*4882a593Smuzhiyun 
PointReport(struct gsl_touch_info * cinfo)1437*4882a593Smuzhiyun static void PointReport(struct gsl_touch_info *cinfo)
1438*4882a593Smuzhiyun {
1439*4882a593Smuzhiyun 	int i;
1440*4882a593Smuzhiyun 	unsigned int data[POINT_MAX];
1441*4882a593Smuzhiyun 	int num = 0;
1442*4882a593Smuzhiyun 	if (point_num > point_num_max && global_flag.other.over_report_mask != 0)
1443*4882a593Smuzhiyun 	{
1444*4882a593Smuzhiyun 		point_num = 0;
1445*4882a593Smuzhiyun 		cinfo->finger_num = 0;
1446*4882a593Smuzhiyun 		return;
1447*4882a593Smuzhiyun 	}
1448*4882a593Smuzhiyun 	for(i=0;i<POINT_MAX;i++)
1449*4882a593Smuzhiyun 		data[i] = 0;
1450*4882a593Smuzhiyun 	num = 0;
1451*4882a593Smuzhiyun 	if (global_flag.other.id_over)
1452*4882a593Smuzhiyun 	{
1453*4882a593Smuzhiyun 		for(i=0;i<POINT_MAX && num<point_num_max;i++)
1454*4882a593Smuzhiyun 		{
1455*4882a593Smuzhiyun 			if (point_delay[i].other.able == 0)
1456*4882a593Smuzhiyun 				continue;
1457*4882a593Smuzhiyun 			if (point_delay[i].other.report >= PR_DEEP - 1)
1458*4882a593Smuzhiyun 				continue;
1459*4882a593Smuzhiyun 			if (pr[point_delay[i].other.report + 1][i].other.able == 0)
1460*4882a593Smuzhiyun 				continue;
1461*4882a593Smuzhiyun 			if (pr[point_delay[i].other.report][i].all)
1462*4882a593Smuzhiyun 			{
1463*4882a593Smuzhiyun 				pr[point_delay[i].other.report][i].other.able = 1;
1464*4882a593Smuzhiyun 				data[i] = ScreenResolution(&pr[point_delay[i].other.report][i]);
1465*4882a593Smuzhiyun 				if(data[i])
1466*4882a593Smuzhiyun 				{
1467*4882a593Smuzhiyun 					data[i] |= (i+1)<<28;
1468*4882a593Smuzhiyun 					num++;
1469*4882a593Smuzhiyun 				}
1470*4882a593Smuzhiyun 			}
1471*4882a593Smuzhiyun 		}
1472*4882a593Smuzhiyun 		for(i=0;i<POINT_MAX && num<point_num_max;i++)
1473*4882a593Smuzhiyun 		{
1474*4882a593Smuzhiyun 			if (point_delay[i].other.able == 0)
1475*4882a593Smuzhiyun 				continue;
1476*4882a593Smuzhiyun 			if (point_delay[i].other.report >= PR_DEEP)
1477*4882a593Smuzhiyun 				continue;
1478*4882a593Smuzhiyun 			if (pr[point_delay[i].other.report][i].all == 0)
1479*4882a593Smuzhiyun 				continue;
1480*4882a593Smuzhiyun 			if (pr[point_delay[i].other.report][i].other.able == 0)
1481*4882a593Smuzhiyun 			{
1482*4882a593Smuzhiyun 				pr[point_delay[i].other.report][i].other.able = 1;
1483*4882a593Smuzhiyun 				data[i] = ScreenResolution(&pr[point_delay[i].other.report][i]);
1484*4882a593Smuzhiyun 				if(data[i])
1485*4882a593Smuzhiyun 				{
1486*4882a593Smuzhiyun 					data[i] |= (i+1)<<28;
1487*4882a593Smuzhiyun 					num++;
1488*4882a593Smuzhiyun 				}
1489*4882a593Smuzhiyun 			}
1490*4882a593Smuzhiyun 		}
1491*4882a593Smuzhiyun 	}
1492*4882a593Smuzhiyun 	else
1493*4882a593Smuzhiyun 	{
1494*4882a593Smuzhiyun 		num=0;
1495*4882a593Smuzhiyun 		for(i=0;i<point_num_max;i++)
1496*4882a593Smuzhiyun 		{
1497*4882a593Smuzhiyun 			if (point_delay[i].other.able == 0)
1498*4882a593Smuzhiyun 				continue;
1499*4882a593Smuzhiyun 			if (point_delay[i].other.report >= PR_DEEP)
1500*4882a593Smuzhiyun 				continue;
1501*4882a593Smuzhiyun 			data[num] = ScreenResolution(&pr[point_delay[i].other.report][i]);
1502*4882a593Smuzhiyun 			if(data[num])
1503*4882a593Smuzhiyun 				data[num++] |= (i+1)<<28;
1504*4882a593Smuzhiyun 		}
1505*4882a593Smuzhiyun 	}
1506*4882a593Smuzhiyun 	num = 0;
1507*4882a593Smuzhiyun 	for(i=0;i<POINT_MAX;i++)
1508*4882a593Smuzhiyun 	{
1509*4882a593Smuzhiyun 		if(data[i] == 0)
1510*4882a593Smuzhiyun 			continue;
1511*4882a593Smuzhiyun 		point_now[num].all = data[i];
1512*4882a593Smuzhiyun 		cinfo->x[num] = (data[i] >> 16) & 0xfff;
1513*4882a593Smuzhiyun 		cinfo->y[num] = data[i] & 0xfff;
1514*4882a593Smuzhiyun 		cinfo->id[num] = data[i] >> 28;
1515*4882a593Smuzhiyun 		pressure_now[num] = pressure_report[i];
1516*4882a593Smuzhiyun 		num++;
1517*4882a593Smuzhiyun 	}
1518*4882a593Smuzhiyun 	point_num = num;
1519*4882a593Smuzhiyun 	cinfo->finger_num = num;
1520*4882a593Smuzhiyun }
1521*4882a593Smuzhiyun 
1522*4882a593Smuzhiyun 
1523*4882a593Smuzhiyun 
PointEdge(void)1524*4882a593Smuzhiyun static void PointEdge(void)
1525*4882a593Smuzhiyun {
1526*4882a593Smuzhiyun 	typedef struct
1527*4882a593Smuzhiyun 	{
1528*4882a593Smuzhiyun 		int range;
1529*4882a593Smuzhiyun 		int coe;
1530*4882a593Smuzhiyun 	}STRETCH_TYPE;
1531*4882a593Smuzhiyun 	typedef struct
1532*4882a593Smuzhiyun 	{
1533*4882a593Smuzhiyun 		STRETCH_TYPE up[4];
1534*4882a593Smuzhiyun 		STRETCH_TYPE down[4];
1535*4882a593Smuzhiyun 		STRETCH_TYPE left[4];
1536*4882a593Smuzhiyun 		STRETCH_TYPE right[4];
1537*4882a593Smuzhiyun 	}STRETCH_TYPE_ALL;
1538*4882a593Smuzhiyun 	STRETCH_TYPE_ALL *stretch;
1539*4882a593Smuzhiyun 	int i,id;
1540*4882a593Smuzhiyun 	int data[2];
1541*4882a593Smuzhiyun 	int x,y;
1542*4882a593Smuzhiyun 	int sac[4*4*2];
1543*4882a593Smuzhiyun 	if(screen_x_max == 0 || screen_y_max == 0)
1544*4882a593Smuzhiyun 		return;
1545*4882a593Smuzhiyun 	id = 0;
1546*4882a593Smuzhiyun 	for(i=0;i<4*4*2;i++)
1547*4882a593Smuzhiyun 	{
1548*4882a593Smuzhiyun 		sac[i] = stretch_array[i];
1549*4882a593Smuzhiyun 		if(sac[i])
1550*4882a593Smuzhiyun 			id++;
1551*4882a593Smuzhiyun 	}
1552*4882a593Smuzhiyun 	if(id == 0)
1553*4882a593Smuzhiyun 		return;
1554*4882a593Smuzhiyun 	stretch = (STRETCH_TYPE_ALL *)sac;
1555*4882a593Smuzhiyun 	for(i=0;i<4;i++)
1556*4882a593Smuzhiyun 	{
1557*4882a593Smuzhiyun 		if(stretch->right[i].range > screen_y_max * 64 / 128
1558*4882a593Smuzhiyun 		|| stretch->down [i].range > screen_x_max * 64 / 128)
1559*4882a593Smuzhiyun 		{
1560*4882a593Smuzhiyun 			for(i=0;i<4;i++)
1561*4882a593Smuzhiyun 			{
1562*4882a593Smuzhiyun 				if(stretch->up[i].range)
1563*4882a593Smuzhiyun 					stretch->up[i].range =
1564*4882a593Smuzhiyun 						stretch->up[i].range *
1565*4882a593Smuzhiyun 						drv_num_nokey * 64 / screen_x_max;
1566*4882a593Smuzhiyun 				if(stretch->down[i].range)
1567*4882a593Smuzhiyun 					stretch->down[i].range =
1568*4882a593Smuzhiyun 						(screen_x_max -
1569*4882a593Smuzhiyun 						stretch->down[i].range) *
1570*4882a593Smuzhiyun 						drv_num_nokey * 64 / screen_x_max;
1571*4882a593Smuzhiyun 				if(stretch->left[i].range)
1572*4882a593Smuzhiyun 					stretch->left[i].range =
1573*4882a593Smuzhiyun 						stretch->left[i].range *
1574*4882a593Smuzhiyun 						sen_num_nokey * 64 / screen_y_max;
1575*4882a593Smuzhiyun 				if(stretch->right[i].range)
1576*4882a593Smuzhiyun 					stretch->right[i].range =
1577*4882a593Smuzhiyun 						(screen_y_max -
1578*4882a593Smuzhiyun 						stretch->right[i].range) *
1579*4882a593Smuzhiyun 						sen_num_nokey * 64 / screen_y_max;
1580*4882a593Smuzhiyun 			}
1581*4882a593Smuzhiyun 			break;
1582*4882a593Smuzhiyun 		}
1583*4882a593Smuzhiyun 	}
1584*4882a593Smuzhiyun 	for(id=0;id<POINT_MAX;id++)
1585*4882a593Smuzhiyun 	{
1586*4882a593Smuzhiyun 		if (point_now[id].all == 0 || point_now[id].other.key != 0)
1587*4882a593Smuzhiyun 			continue;
1588*4882a593Smuzhiyun 		x = point_now[id].other.x;
1589*4882a593Smuzhiyun 		y = point_now[id].other.y;
1590*4882a593Smuzhiyun 
1591*4882a593Smuzhiyun 		data[0] = 0;
1592*4882a593Smuzhiyun 		data[1] = y;
1593*4882a593Smuzhiyun 		for(i=0;i<4;i++)
1594*4882a593Smuzhiyun 		{
1595*4882a593Smuzhiyun 			if(stretch->left[i].range == 0)
1596*4882a593Smuzhiyun 				break;
1597*4882a593Smuzhiyun 			if(data[1] < stretch->left[i].range)
1598*4882a593Smuzhiyun 			{
1599*4882a593Smuzhiyun 				data[0] += (stretch->left[i].range - data[1]) *
1600*4882a593Smuzhiyun 					stretch->left[i].coe/128;
1601*4882a593Smuzhiyun 				data[1] = stretch->left[i].range;
1602*4882a593Smuzhiyun 			}
1603*4882a593Smuzhiyun 		}
1604*4882a593Smuzhiyun 		y = data[1] - data[0];
1605*4882a593Smuzhiyun 		if(y <= 0)
1606*4882a593Smuzhiyun 			y = 1;
1607*4882a593Smuzhiyun 		if(y >= (int)sen_num_nokey*64)
1608*4882a593Smuzhiyun 			y = sen_num_nokey*64 - 1;
1609*4882a593Smuzhiyun 
1610*4882a593Smuzhiyun 		data[0] = 0;
1611*4882a593Smuzhiyun 		data[1] = sen_num_nokey * 64 - y;
1612*4882a593Smuzhiyun 		for(i=0;i<4;i++)
1613*4882a593Smuzhiyun 		{
1614*4882a593Smuzhiyun 			if(stretch->right[i].range == 0)
1615*4882a593Smuzhiyun 				break;
1616*4882a593Smuzhiyun 			if(data[1] < stretch->right[i].range)
1617*4882a593Smuzhiyun 			{
1618*4882a593Smuzhiyun 				data[0] += (stretch->right[i].range - data[1]) *
1619*4882a593Smuzhiyun 					stretch->right[i].coe/128;
1620*4882a593Smuzhiyun 				data[1] = stretch->right[i].range;
1621*4882a593Smuzhiyun 			}
1622*4882a593Smuzhiyun 		}
1623*4882a593Smuzhiyun 		y = sen_num_nokey * 64 - (data[1] - data[0]);
1624*4882a593Smuzhiyun 		if(y <= 0)
1625*4882a593Smuzhiyun 			y = 1;
1626*4882a593Smuzhiyun 		if(y >= (int)sen_num_nokey*64)
1627*4882a593Smuzhiyun 			y = sen_num_nokey*64 - 1;
1628*4882a593Smuzhiyun 
1629*4882a593Smuzhiyun 		data[0] = 0;
1630*4882a593Smuzhiyun 		data[1] = x;
1631*4882a593Smuzhiyun 		for(i=0;i<4;i++)
1632*4882a593Smuzhiyun 		{
1633*4882a593Smuzhiyun 			if(stretch->up[i].range == 0)
1634*4882a593Smuzhiyun 				break;
1635*4882a593Smuzhiyun 			if(data[1] < stretch->up[i].range)
1636*4882a593Smuzhiyun 			{
1637*4882a593Smuzhiyun 				data[0] += (stretch->up[i].range - data[1]) *
1638*4882a593Smuzhiyun 					stretch->up[i].coe/128;
1639*4882a593Smuzhiyun 				data[1] = stretch->up[i].range;
1640*4882a593Smuzhiyun 			}
1641*4882a593Smuzhiyun 		}
1642*4882a593Smuzhiyun 		x = data[1] - data[0];
1643*4882a593Smuzhiyun 		if(x <= 0)
1644*4882a593Smuzhiyun 			x = 1;
1645*4882a593Smuzhiyun 		if(x >= (int)drv_num_nokey*64)
1646*4882a593Smuzhiyun 			x = drv_num_nokey*64 - 1;
1647*4882a593Smuzhiyun 
1648*4882a593Smuzhiyun 		data[0] = 0;
1649*4882a593Smuzhiyun 		data[1] = drv_num_nokey * 64 - x;
1650*4882a593Smuzhiyun 		for(i=0;i<4;i++)
1651*4882a593Smuzhiyun 		{
1652*4882a593Smuzhiyun 			if(stretch->down[i].range == 0)
1653*4882a593Smuzhiyun 				break;
1654*4882a593Smuzhiyun 			if(data[1] < stretch->down[i].range)
1655*4882a593Smuzhiyun 			{
1656*4882a593Smuzhiyun 				data[0] += (stretch->down[i].range - data[1]) *
1657*4882a593Smuzhiyun 					stretch->down[i].coe/128;
1658*4882a593Smuzhiyun 				data[1] = stretch->down[i].range;
1659*4882a593Smuzhiyun 			}
1660*4882a593Smuzhiyun 		}
1661*4882a593Smuzhiyun 		x = drv_num_nokey * 64 - (data[1] - data[0]);
1662*4882a593Smuzhiyun 		if(x <= 0)
1663*4882a593Smuzhiyun 			x = 1;
1664*4882a593Smuzhiyun 		if(x >= (int)drv_num_nokey*64)
1665*4882a593Smuzhiyun 			x = drv_num_nokey*64 - 1;
1666*4882a593Smuzhiyun 
1667*4882a593Smuzhiyun 		point_now[id].other.x = x;
1668*4882a593Smuzhiyun 		point_now[id].other.y = y;
1669*4882a593Smuzhiyun 	}
1670*4882a593Smuzhiyun }
1671*4882a593Smuzhiyun 
PointStretch(void)1672*4882a593Smuzhiyun static void PointStretch(void)
1673*4882a593Smuzhiyun {
1674*4882a593Smuzhiyun 	static int save_dr[POINT_MAX],save_dn[POINT_MAX];
1675*4882a593Smuzhiyun 	typedef struct
1676*4882a593Smuzhiyun 	{
1677*4882a593Smuzhiyun 		int dis;
1678*4882a593Smuzhiyun 		int coe;
1679*4882a593Smuzhiyun 	}SHAKE_TYPE;
1680*4882a593Smuzhiyun 	SHAKE_TYPE * shake_all = (SHAKE_TYPE *) shake_all_array;
1681*4882a593Smuzhiyun 	int i,j;
1682*4882a593Smuzhiyun 	int dn;
1683*4882a593Smuzhiyun 	int dr;
1684*4882a593Smuzhiyun 	int dc[9],ds[9];
1685*4882a593Smuzhiyun 	int len = 8;
1686*4882a593Smuzhiyun 	unsigned int temp;
1687*4882a593Smuzhiyun 	for(i=0;i<POINT_MAX;i++)
1688*4882a593Smuzhiyun 	{
1689*4882a593Smuzhiyun 		ps[0][i].all = pp[0][i].all;
1690*4882a593Smuzhiyun 	}
1691*4882a593Smuzhiyun 	for(i=0;i<POINT_MAX;i++)
1692*4882a593Smuzhiyun 	{
1693*4882a593Smuzhiyun 		if (pp[0][i].all == 0 || pp[0][i].other.key)
1694*4882a593Smuzhiyun 		{
1695*4882a593Smuzhiyun 			point_shake &= ~(0x1<<i);
1696*4882a593Smuzhiyun 			if(i == 0)
1697*4882a593Smuzhiyun 				point_edge.rate = 0;
1698*4882a593Smuzhiyun 			continue;
1699*4882a593Smuzhiyun 		}
1700*4882a593Smuzhiyun 		if(i == 0)
1701*4882a593Smuzhiyun 		{
1702*4882a593Smuzhiyun 			if(edge_first!=0 && ps[1][i].all == 0)
1703*4882a593Smuzhiyun 			{
1704*4882a593Smuzhiyun 				point_edge.coor.all = ps[0][i].all;
1705*4882a593Smuzhiyun 				if (point_edge.coor.other.x < (unsigned int)((edge_first >> 24) & 0xff))
1706*4882a593Smuzhiyun 					point_edge.coor.other.x = ((edge_first >> 24) & 0xff);
1707*4882a593Smuzhiyun 				if (point_edge.coor.other.x > drv_num_nokey * 64 - ((edge_first >> 16) & 0xff))
1708*4882a593Smuzhiyun 					point_edge.coor.other.x = drv_num_nokey * 64 - ((edge_first >> 16) & 0xff);
1709*4882a593Smuzhiyun 				if (point_edge.coor.other.y < (unsigned int)((edge_first >> 8) & 0xff))
1710*4882a593Smuzhiyun 					point_edge.coor.other.y = ((edge_first >> 8) & 0xff);
1711*4882a593Smuzhiyun 				if (point_edge.coor.other.y > sen_num_nokey * 64 - ((edge_first >> 0) & 0xff))
1712*4882a593Smuzhiyun 					point_edge.coor.other.y = sen_num_nokey * 64 - ((edge_first >> 0) & 0xff);
1713*4882a593Smuzhiyun 				if(point_edge.coor.all != ps[0][i].all)
1714*4882a593Smuzhiyun 				{
1715*4882a593Smuzhiyun 					point_edge.dis = PointDistance(&ps[0][i],&point_edge.coor);
1716*4882a593Smuzhiyun 					if(point_edge.dis)
1717*4882a593Smuzhiyun 						point_edge.rate = 0x1000;
1718*4882a593Smuzhiyun 				}
1719*4882a593Smuzhiyun 			}
1720*4882a593Smuzhiyun 			if(point_edge.rate!=0 && point_edge.dis!=0)
1721*4882a593Smuzhiyun 			{
1722*4882a593Smuzhiyun 				temp = PointDistance(&ps[0][i],&point_edge.coor);
1723*4882a593Smuzhiyun 				if(temp >= point_edge.dis * edge_first_coe / 0x80)
1724*4882a593Smuzhiyun 				{
1725*4882a593Smuzhiyun 					point_edge.rate = 0;
1726*4882a593Smuzhiyun 				}
1727*4882a593Smuzhiyun 				else if(temp > point_edge.dis)
1728*4882a593Smuzhiyun 				{
1729*4882a593Smuzhiyun 					temp = (point_edge.dis * edge_first_coe / 0x80 - temp) *
1730*4882a593Smuzhiyun 						0x1000 / point_edge.dis;
1731*4882a593Smuzhiyun 					if(temp < point_edge.rate)
1732*4882a593Smuzhiyun 						point_edge.rate = temp;
1733*4882a593Smuzhiyun 				}
1734*4882a593Smuzhiyun 				ps[0][i].other.x = point_edge.coor.other.x +
1735*4882a593Smuzhiyun 					(ps[0][i].other.x - point_edge.coor.other.x) *
1736*4882a593Smuzhiyun 					(0x1000 - point_edge.rate) / 0x1000;
1737*4882a593Smuzhiyun 				ps[0][i].other.y = point_edge.coor.other.y +
1738*4882a593Smuzhiyun 					(ps[0][i].other.y - point_edge.coor.other.y) *
1739*4882a593Smuzhiyun 					(0x1000 - point_edge.rate) / 0x1000;
1740*4882a593Smuzhiyun 			}
1741*4882a593Smuzhiyun 		}
1742*4882a593Smuzhiyun 		if(ps[1][i].all == 0)
1743*4882a593Smuzhiyun 		{
1744*4882a593Smuzhiyun 			continue;
1745*4882a593Smuzhiyun 		}
1746*4882a593Smuzhiyun 		else if((point_shake & (0x1<<i)) == 0)
1747*4882a593Smuzhiyun 		{
1748*4882a593Smuzhiyun 			if(PointDistance(&ps[0][i],&ps[1][i]) < (unsigned int)shake_min)
1749*4882a593Smuzhiyun 			{
1750*4882a593Smuzhiyun 				ps[0][i].all = ps[1][i].all;
1751*4882a593Smuzhiyun 				continue;
1752*4882a593Smuzhiyun 			}
1753*4882a593Smuzhiyun 			else
1754*4882a593Smuzhiyun 				point_shake |= (0x1<<i);
1755*4882a593Smuzhiyun 		}
1756*4882a593Smuzhiyun 	}
1757*4882a593Smuzhiyun 	for(i=0;i<len;i++)
1758*4882a593Smuzhiyun 	{
1759*4882a593Smuzhiyun 		if(shake_all[i].dis == 0)
1760*4882a593Smuzhiyun 		{
1761*4882a593Smuzhiyun 			len=i;
1762*4882a593Smuzhiyun 			break;
1763*4882a593Smuzhiyun 		}
1764*4882a593Smuzhiyun 	}
1765*4882a593Smuzhiyun 	if(len == 1)
1766*4882a593Smuzhiyun 	{
1767*4882a593Smuzhiyun 		ds[0] = shake_all[0].dis;
1768*4882a593Smuzhiyun 		dc[0] = (shake_all[0].coe*100+64)/128;
1769*4882a593Smuzhiyun 		for(i=0;i<POINT_MAX;i++)
1770*4882a593Smuzhiyun 		{
1771*4882a593Smuzhiyun 			if(ps[1][i].all == 0)
1772*4882a593Smuzhiyun 			{
1773*4882a593Smuzhiyun 				for(j=1;j<PS_DEEP;j++)
1774*4882a593Smuzhiyun 					ps[j][i].all = ps[0][i].all;
1775*4882a593Smuzhiyun 				continue;
1776*4882a593Smuzhiyun 			}
1777*4882a593Smuzhiyun 			if((point_shake & (0x1<<i)) == 0)
1778*4882a593Smuzhiyun 				continue;
1779*4882a593Smuzhiyun 			dn = PointDistance(&pp[0][i],&ps[1][i]);
1780*4882a593Smuzhiyun 			dn = Sqrt(dn);
1781*4882a593Smuzhiyun 			dr = dn>ds[0] ? dn-ds[0] : 0;
1782*4882a593Smuzhiyun 			temp = ps[0][i].all;
1783*4882a593Smuzhiyun 			if(dn == 0 || dr == 0)
1784*4882a593Smuzhiyun 			{
1785*4882a593Smuzhiyun 				ps[0][i].other.x = ps[1][i].other.x;
1786*4882a593Smuzhiyun 				ps[0][i].other.y = ps[1][i].other.y;
1787*4882a593Smuzhiyun 			}
1788*4882a593Smuzhiyun 			else
1789*4882a593Smuzhiyun 			{
1790*4882a593Smuzhiyun 				ps[0][i].other.x = (int)ps[1][i].other.x +
1791*4882a593Smuzhiyun 					((int)pp[0][i].other.x -
1792*4882a593Smuzhiyun 					(int)ps[1][i].other.x) * dr / dn;
1793*4882a593Smuzhiyun 				ps[0][i].other.y = (int)ps[1][i].other.y +
1794*4882a593Smuzhiyun 					((int)pp[0][i].other.y -
1795*4882a593Smuzhiyun 					(int)ps[1][i].other.y) * dr / dn;
1796*4882a593Smuzhiyun 			}
1797*4882a593Smuzhiyun 			if(dc[0] > 0)
1798*4882a593Smuzhiyun 			{
1799*4882a593Smuzhiyun 				if(ps[0][i].all == ps[1][i].all && temp != ps[0][i].all)
1800*4882a593Smuzhiyun 				{
1801*4882a593Smuzhiyun 					ps[0][i].all = temp;
1802*4882a593Smuzhiyun 					point_decimal[i].other.x +=
1803*4882a593Smuzhiyun 						(short)ps[0][i].other.x -
1804*4882a593Smuzhiyun 						(short)ps[1][i].other.x;
1805*4882a593Smuzhiyun 					point_decimal[i].other.y +=
1806*4882a593Smuzhiyun 						(short)ps[0][i].other.y -
1807*4882a593Smuzhiyun 						(short)ps[1][i].other.y;
1808*4882a593Smuzhiyun 					ps[0][i].other.x = ps[1][i].other.x;
1809*4882a593Smuzhiyun 					ps[0][i].other.y = ps[1][i].other.y;
1810*4882a593Smuzhiyun 					if (point_decimal[i].other.x >  dc[0] && ps[1][i].other.x < 0xffff)
1811*4882a593Smuzhiyun 					{
1812*4882a593Smuzhiyun 						ps[0][i].other.x += 1;
1813*4882a593Smuzhiyun 						point_decimal[i].other.x = 0;
1814*4882a593Smuzhiyun 					}
1815*4882a593Smuzhiyun 					if (point_decimal[i].other.x  < -dc[0] && ps[1][i].other.x > 0)
1816*4882a593Smuzhiyun 					{
1817*4882a593Smuzhiyun 						ps[0][i].other.x -= 1;
1818*4882a593Smuzhiyun 						point_decimal[i].other.x = 0;
1819*4882a593Smuzhiyun 					}
1820*4882a593Smuzhiyun 					if (point_decimal[i].other.y >  dc[0] && ps[1][i].other.y < 0xffff)
1821*4882a593Smuzhiyun 					{
1822*4882a593Smuzhiyun 						ps[0][i].other.y += 1;
1823*4882a593Smuzhiyun 						point_decimal[i].other.y = 0;
1824*4882a593Smuzhiyun 					}
1825*4882a593Smuzhiyun 					if (point_decimal[i].other.y  < -dc[0] && ps[1][i].other.y > 0)
1826*4882a593Smuzhiyun 					{
1827*4882a593Smuzhiyun 						ps[0][i].other.y -= 1;
1828*4882a593Smuzhiyun 						point_decimal[i].other.y = 0;
1829*4882a593Smuzhiyun 					}
1830*4882a593Smuzhiyun 				}
1831*4882a593Smuzhiyun 				else
1832*4882a593Smuzhiyun 				{
1833*4882a593Smuzhiyun 					point_decimal[i].other.x = 0;
1834*4882a593Smuzhiyun 					point_decimal[i].other.y = 0;
1835*4882a593Smuzhiyun 				}
1836*4882a593Smuzhiyun 			}
1837*4882a593Smuzhiyun 		}
1838*4882a593Smuzhiyun 
1839*4882a593Smuzhiyun 	}
1840*4882a593Smuzhiyun 	else if(len >= 2)
1841*4882a593Smuzhiyun 	{
1842*4882a593Smuzhiyun 		for(i=0;i<8 && i<len;i++)
1843*4882a593Smuzhiyun 		{
1844*4882a593Smuzhiyun 			ds[i+1] = shake_all[i].dis;
1845*4882a593Smuzhiyun 			dc[i+1] = shake_all[i].coe;//;ds[i+1] * shake_all[i].coe;
1846*4882a593Smuzhiyun 		}
1847*4882a593Smuzhiyun 		if(shake_all[0].coe >= 128 || shake_all[0].coe <= shake_all[1].coe)
1848*4882a593Smuzhiyun 		{
1849*4882a593Smuzhiyun 			ds[0] = ds[1];
1850*4882a593Smuzhiyun 			dc[0] = dc[1];
1851*4882a593Smuzhiyun 		}
1852*4882a593Smuzhiyun 		else
1853*4882a593Smuzhiyun 		{
1854*4882a593Smuzhiyun 			ds[0] = ds[1] + (128 - shake_all[0].coe) *
1855*4882a593Smuzhiyun 				(ds[1]-ds[2])/(shake_all[0].coe - shake_all[1].coe);
1856*4882a593Smuzhiyun 			dc[0] = 128;
1857*4882a593Smuzhiyun 		}
1858*4882a593Smuzhiyun 		for(i=0;i<POINT_MAX;i++)
1859*4882a593Smuzhiyun 		{
1860*4882a593Smuzhiyun 			if(ps[1][i].all == 0)
1861*4882a593Smuzhiyun 			{
1862*4882a593Smuzhiyun 				for(j=1;j<PS_DEEP;j++)
1863*4882a593Smuzhiyun 					ps[j][i].all = ps[0][i].all;
1864*4882a593Smuzhiyun 				save_dr[i] = 128;
1865*4882a593Smuzhiyun 				save_dn[i] = 0;
1866*4882a593Smuzhiyun 				continue;
1867*4882a593Smuzhiyun 			}
1868*4882a593Smuzhiyun 			if((point_shake & (0x1<<i)) == 0)
1869*4882a593Smuzhiyun 				continue;
1870*4882a593Smuzhiyun 			dn = PointDistance(&pp[0][i],&ps[1][i]);
1871*4882a593Smuzhiyun 			dn = Sqrt(dn);
1872*4882a593Smuzhiyun 			if(dn >= ds[0])
1873*4882a593Smuzhiyun 			{
1874*4882a593Smuzhiyun 				continue;
1875*4882a593Smuzhiyun 			}
1876*4882a593Smuzhiyun 			if(dn < save_dn[i])
1877*4882a593Smuzhiyun 			{
1878*4882a593Smuzhiyun 				dr = save_dr[i];
1879*4882a593Smuzhiyun 				save_dn[i] = dn;
1880*4882a593Smuzhiyun 				ps[0][i].other.x = (int)ps[1][i].other.x +
1881*4882a593Smuzhiyun 					(((int)pp[0][i].other.x -
1882*4882a593Smuzhiyun 					(int)ps[1][i].other.x) * dr) / 128;
1883*4882a593Smuzhiyun 				ps[0][i].other.y = (int)ps[1][i].other.y +
1884*4882a593Smuzhiyun 					(((int)pp[0][i].other.y -
1885*4882a593Smuzhiyun 					(int)ps[1][i].other.y) * dr) / 128;
1886*4882a593Smuzhiyun 				continue;
1887*4882a593Smuzhiyun 			}
1888*4882a593Smuzhiyun 			for(j=0;j<=len;j++)
1889*4882a593Smuzhiyun 			{
1890*4882a593Smuzhiyun 				if(j == len || dn == 0)
1891*4882a593Smuzhiyun 				{
1892*4882a593Smuzhiyun 					ps[0][i].other.x = ps[1][i].other.x;
1893*4882a593Smuzhiyun 					ps[0][i].other.y = ps[1][i].other.y;
1894*4882a593Smuzhiyun 					break;
1895*4882a593Smuzhiyun 				}
1896*4882a593Smuzhiyun 				else if(ds[j] > dn && dn >=ds[j+1])
1897*4882a593Smuzhiyun 				{
1898*4882a593Smuzhiyun 					dr = dc[j+1] + ((dn - ds[j+1]) * (dc[j] - dc[j+1])) / (ds[j] - ds[j+1]);
1899*4882a593Smuzhiyun 					save_dr[i] = dr;
1900*4882a593Smuzhiyun 					save_dn[i] = dn;
1901*4882a593Smuzhiyun //					ps[0][i].x = (int)ps[1][i].x + ((int)pp[0][i].x - (int)ps[1][i].x) * dr / dn / 128;
1902*4882a593Smuzhiyun //					ps[0][i].y = (int)ps[1][i].y + ((int)pp[0][i].y - (int)ps[1][i].y) * dr / dn / 128;
1903*4882a593Smuzhiyun 					ps[0][i].other.x = (int)ps[1][i].other.x +
1904*4882a593Smuzhiyun 						(((int)pp[0][i].other.x -
1905*4882a593Smuzhiyun 						(int)ps[1][i].other.x) * dr + 64) / 128;
1906*4882a593Smuzhiyun 					ps[0][i].other.y = (int)ps[1][i].other.y +
1907*4882a593Smuzhiyun 						(((int)pp[0][i].other.y -
1908*4882a593Smuzhiyun 						(int)ps[1][i].other.y) * dr + 64) / 128;
1909*4882a593Smuzhiyun 					break;
1910*4882a593Smuzhiyun 				}
1911*4882a593Smuzhiyun 			}
1912*4882a593Smuzhiyun 		}
1913*4882a593Smuzhiyun 	}
1914*4882a593Smuzhiyun 	else
1915*4882a593Smuzhiyun 	{
1916*4882a593Smuzhiyun 		return;
1917*4882a593Smuzhiyun 	}
1918*4882a593Smuzhiyun }
1919*4882a593Smuzhiyun 
ResetMask(void)1920*4882a593Smuzhiyun static void ResetMask(void)
1921*4882a593Smuzhiyun {
1922*4882a593Smuzhiyun 	if (reset_mask_send)
1923*4882a593Smuzhiyun 	{
1924*4882a593Smuzhiyun 		reset_mask_send = 0;
1925*4882a593Smuzhiyun 	}
1926*4882a593Smuzhiyun 	if (global_state.other.mask)
1927*4882a593Smuzhiyun 		return;
1928*4882a593Smuzhiyun 	if (reset_mask_dis ==0 || reset_mask_type == 0)
1929*4882a593Smuzhiyun 		return;
1930*4882a593Smuzhiyun 	if (reset_mask_max == 0xfffffff1)
1931*4882a593Smuzhiyun 	{
1932*4882a593Smuzhiyun 		if (point_num == 0)
1933*4882a593Smuzhiyun 			reset_mask_max = 0xf0000000 + 1;
1934*4882a593Smuzhiyun 		return;
1935*4882a593Smuzhiyun 	}
1936*4882a593Smuzhiyun 	if (reset_mask_max >  0xf0000000)
1937*4882a593Smuzhiyun 	{
1938*4882a593Smuzhiyun 		reset_mask_max --;
1939*4882a593Smuzhiyun 		if (reset_mask_max == 0xf0000000)
1940*4882a593Smuzhiyun 		{
1941*4882a593Smuzhiyun 			reset_mask_send = reset_mask_type;
1942*4882a593Smuzhiyun 			global_state.other.mask = 1;
1943*4882a593Smuzhiyun 		}
1944*4882a593Smuzhiyun 		return;
1945*4882a593Smuzhiyun 	}
1946*4882a593Smuzhiyun 	if (point_num > 1 || pp[0][0].all == 0)
1947*4882a593Smuzhiyun 	{
1948*4882a593Smuzhiyun 		reset_mask_count = 0;
1949*4882a593Smuzhiyun 		reset_mask_max = 0;
1950*4882a593Smuzhiyun 		reset_mask_count = 0;
1951*4882a593Smuzhiyun 		return;
1952*4882a593Smuzhiyun 	}
1953*4882a593Smuzhiyun 	reset_mask_count ++;
1954*4882a593Smuzhiyun 	if (reset_mask_max == 0)
1955*4882a593Smuzhiyun 		reset_mask_max = pp[0][0].all;
1956*4882a593Smuzhiyun 	else
1957*4882a593Smuzhiyun 		if (PointDistance((gsl_POINT_TYPE*)(&reset_mask_max),pp[0]) >
1958*4882a593Smuzhiyun 			(((unsigned int)reset_mask_dis) & 0xffffff) &&
1959*4882a593Smuzhiyun 			reset_mask_count > (((unsigned int)reset_mask_dis) >> 24))
1960*4882a593Smuzhiyun 			reset_mask_max = 0xfffffff1;
1961*4882a593Smuzhiyun }
1962*4882a593Smuzhiyun 
ConfigCoorMulti(int data[])1963*4882a593Smuzhiyun static int ConfigCoorMulti(int data[])
1964*4882a593Smuzhiyun {
1965*4882a593Smuzhiyun 	int i,j;
1966*4882a593Smuzhiyun 	int n = 0;
1967*4882a593Smuzhiyun 	for(i=0;i<4;i++)
1968*4882a593Smuzhiyun 	{
1969*4882a593Smuzhiyun 		if(data[247+i]!=0)
1970*4882a593Smuzhiyun 		{
1971*4882a593Smuzhiyun 			if((data[247+i]&63)==0 && (data[247+i]>>16)<4)
1972*4882a593Smuzhiyun 				n++;
1973*4882a593Smuzhiyun 			else
1974*4882a593Smuzhiyun 				return FALSE;
1975*4882a593Smuzhiyun 		}
1976*4882a593Smuzhiyun 		if(data[251+i]!=0)
1977*4882a593Smuzhiyun 		{
1978*4882a593Smuzhiyun 			if((data[251+i]&63)==0 && (data[251+i]>>16)<4)
1979*4882a593Smuzhiyun 				n++;
1980*4882a593Smuzhiyun 			else
1981*4882a593Smuzhiyun 				return FALSE;
1982*4882a593Smuzhiyun 		}
1983*4882a593Smuzhiyun 	}
1984*4882a593Smuzhiyun 	if(n == 0 || n > 4)
1985*4882a593Smuzhiyun 		return FALSE;
1986*4882a593Smuzhiyun 	for(j=0;j<n;j++)
1987*4882a593Smuzhiyun 	{
1988*4882a593Smuzhiyun 		for(i=0;i<64;i++)
1989*4882a593Smuzhiyun 		{
1990*4882a593Smuzhiyun 			if(data[256+j*64+i] >= 64)
1991*4882a593Smuzhiyun 				return FALSE;
1992*4882a593Smuzhiyun 			if(i)
1993*4882a593Smuzhiyun 			{
1994*4882a593Smuzhiyun 				if(data[256+j*64+i] < data[256+j*64+i-1])
1995*4882a593Smuzhiyun 					return FALSE;
1996*4882a593Smuzhiyun 			}
1997*4882a593Smuzhiyun 		}
1998*4882a593Smuzhiyun 	}
1999*4882a593Smuzhiyun 	return TRUE;
2000*4882a593Smuzhiyun }
2001*4882a593Smuzhiyun 
ConfigFilter(unsigned int data[])2002*4882a593Smuzhiyun static int ConfigFilter(unsigned int data[])
2003*4882a593Smuzhiyun {
2004*4882a593Smuzhiyun 	int i;
2005*4882a593Smuzhiyun 	unsigned int ps_c[8];
2006*4882a593Smuzhiyun 	unsigned int pr_c[8];
2007*4882a593Smuzhiyun 	unsigned int sum = 0;
2008*4882a593Smuzhiyun 	//if(data[242]>1 && (data[255]>=0 && data[255]<=256))
2009*4882a593Smuzhiyun 	if (data[242]>1 && (data[255] <= 256))
2010*4882a593Smuzhiyun 	{
2011*4882a593Smuzhiyun 		for(i=0;i<8;i++)
2012*4882a593Smuzhiyun 		{
2013*4882a593Smuzhiyun 			ps_c[i] = (data[243+i/4] >> ((i%4)*8)) & 0xff;
2014*4882a593Smuzhiyun 			pr_c[i] = (data[243+i/4+2] >> ((i%4)*8)) & 0xff;
2015*4882a593Smuzhiyun 			if(ps_c[i] >= 0x80)
2016*4882a593Smuzhiyun 				ps_c[i] |= 0xffffff00;
2017*4882a593Smuzhiyun 			if(pr_c[i] >= 0x80)
2018*4882a593Smuzhiyun 				pr_c[i] |= 0xffffff00;
2019*4882a593Smuzhiyun 			sum += ps_c[i];
2020*4882a593Smuzhiyun 			sum += pr_c[i];
2021*4882a593Smuzhiyun 		}
2022*4882a593Smuzhiyun 		if(sum == data[242] || sum + data[242] == 0)
2023*4882a593Smuzhiyun 			return TRUE;
2024*4882a593Smuzhiyun 	}
2025*4882a593Smuzhiyun 	return FALSE;
2026*4882a593Smuzhiyun }
2027*4882a593Smuzhiyun 
ConfigKeyMap(int data[])2028*4882a593Smuzhiyun static int ConfigKeyMap(int data[])
2029*4882a593Smuzhiyun {
2030*4882a593Smuzhiyun 	int i;
2031*4882a593Smuzhiyun 	if(data[217] != 1)
2032*4882a593Smuzhiyun 		return FALSE;
2033*4882a593Smuzhiyun 	for(i=0;i<8;i++)
2034*4882a593Smuzhiyun 	{
2035*4882a593Smuzhiyun 		if(data[218+2] == 0)
2036*4882a593Smuzhiyun 			return FALSE;
2037*4882a593Smuzhiyun 		if((data[218+i*3+0]>>16) > (data[218+i*3+0]&0xffff))
2038*4882a593Smuzhiyun 			return FALSE;
2039*4882a593Smuzhiyun 		if((data[218+i*3+1]>>16) > (data[218+i*3+1]&0xffff))
2040*4882a593Smuzhiyun 			return FALSE;
2041*4882a593Smuzhiyun 	}
2042*4882a593Smuzhiyun 	return TRUE;
2043*4882a593Smuzhiyun }
2044*4882a593Smuzhiyun 
DiagonalDistance(gsl_POINT_TYPE * p,int type)2045*4882a593Smuzhiyun static int DiagonalDistance(gsl_POINT_TYPE *p,int type)
2046*4882a593Smuzhiyun {
2047*4882a593Smuzhiyun 	int divisor,square;
2048*4882a593Smuzhiyun 	divisor = ((int)sen_num_nokey * (int)sen_num_nokey +
2049*4882a593Smuzhiyun 		(int)drv_num_nokey * (int)drv_num_nokey)/16;
2050*4882a593Smuzhiyun 	if(divisor == 0)
2051*4882a593Smuzhiyun 		divisor = 1;
2052*4882a593Smuzhiyun 	if(type == 0)
2053*4882a593Smuzhiyun 		square = ((int)sen_num_nokey*(int)(p->other.x) -
2054*4882a593Smuzhiyun 			(int)drv_num_nokey*(int)(p->other.y)) / 4;
2055*4882a593Smuzhiyun 	else
2056*4882a593Smuzhiyun 		square = ((int)sen_num_nokey*(int)(p->other.x) +
2057*4882a593Smuzhiyun 			(int)drv_num_nokey*(int)(p->other.y) -
2058*4882a593Smuzhiyun 			(int)sen_num_nokey*(int)drv_num_nokey * 64) / 4;
2059*4882a593Smuzhiyun 	return square * square / divisor;
2060*4882a593Smuzhiyun }
2061*4882a593Smuzhiyun 
DiagonalCompress(gsl_POINT_TYPE * p,int type,int dis,int dis_max)2062*4882a593Smuzhiyun static void DiagonalCompress(gsl_POINT_TYPE *p,int type,int dis,int dis_max)
2063*4882a593Smuzhiyun {
2064*4882a593Smuzhiyun 	int x,y;
2065*4882a593Smuzhiyun 	int tx,ty;
2066*4882a593Smuzhiyun 	int cp_ceof;
2067*4882a593Smuzhiyun 	if(dis_max == 0)
2068*4882a593Smuzhiyun 		return;
2069*4882a593Smuzhiyun 	if(dis > dis_max)
2070*4882a593Smuzhiyun 		cp_ceof = (dis - dis_max)*128/(3*dis_max) + 128;
2071*4882a593Smuzhiyun 	else
2072*4882a593Smuzhiyun 		cp_ceof = 128;
2073*4882a593Smuzhiyun 	if(cp_ceof > 256)
2074*4882a593Smuzhiyun 		cp_ceof = 256;
2075*4882a593Smuzhiyun 	x = p->other.x;
2076*4882a593Smuzhiyun 	y = p->other.y;
2077*4882a593Smuzhiyun 	if(type)
2078*4882a593Smuzhiyun 		y = (int)sen_num_nokey*64 - y;
2079*4882a593Smuzhiyun 	x *= (int)sen_num_nokey;
2080*4882a593Smuzhiyun 	y *= (int)drv_num_nokey;
2081*4882a593Smuzhiyun 	tx = x;
2082*4882a593Smuzhiyun 	ty = y;
2083*4882a593Smuzhiyun 	x = ((tx+ty)+(tx-ty)*cp_ceof/256)/2;
2084*4882a593Smuzhiyun 	y = ((tx+ty)+(ty-tx)*cp_ceof/256)/2;
2085*4882a593Smuzhiyun 	x /= (int)sen_num_nokey;
2086*4882a593Smuzhiyun 	y /= (int)drv_num_nokey;
2087*4882a593Smuzhiyun 	if(type)
2088*4882a593Smuzhiyun 		y = sen_num_nokey*64 - y;
2089*4882a593Smuzhiyun 	if(x < 1)
2090*4882a593Smuzhiyun 		x = 1;
2091*4882a593Smuzhiyun 	if(y < 1)
2092*4882a593Smuzhiyun 		y = 1;
2093*4882a593Smuzhiyun 	if(x >= (int)drv_num_nokey*64)
2094*4882a593Smuzhiyun 		x = drv_num_nokey*64 - 1;
2095*4882a593Smuzhiyun 	if(y >= (int)sen_num_nokey*64)
2096*4882a593Smuzhiyun 		y = (int)sen_num_nokey*64 - 1;
2097*4882a593Smuzhiyun 	p->other.x = x;
2098*4882a593Smuzhiyun 	p->other.y = y;
2099*4882a593Smuzhiyun }
2100*4882a593Smuzhiyun 
PointDiagonal(void)2101*4882a593Smuzhiyun static void PointDiagonal(void)
2102*4882a593Smuzhiyun {
2103*4882a593Smuzhiyun 	int i;
2104*4882a593Smuzhiyun 	int diagonal_size;
2105*4882a593Smuzhiyun 	int dis;
2106*4882a593Smuzhiyun 	unsigned int diagonal_start;
2107*4882a593Smuzhiyun 	if(diagonal == 0)
2108*4882a593Smuzhiyun 		return;
2109*4882a593Smuzhiyun 	diagonal_size = diagonal * diagonal;
2110*4882a593Smuzhiyun 	diagonal_start = diagonal * 3/2;
2111*4882a593Smuzhiyun 	for(i=0;i<POINT_MAX;i++)
2112*4882a593Smuzhiyun 	{
2113*4882a593Smuzhiyun 		if (ps[0][i].all == 0 || ps[0][i].other.key != 0)
2114*4882a593Smuzhiyun 		{
2115*4882a593Smuzhiyun 			point_corner &= ~(0x3<<i*2);
2116*4882a593Smuzhiyun 			continue;
2117*4882a593Smuzhiyun 		}
2118*4882a593Smuzhiyun 		else if((point_corner & (0x3<<i*2)) == 0)
2119*4882a593Smuzhiyun 		{
2120*4882a593Smuzhiyun 			if ((ps[0][i].other.x <= diagonal_start &&
2121*4882a593Smuzhiyun 				ps[0][i].other.y <= diagonal_start) ||
2122*4882a593Smuzhiyun 				(ps[0][i].other.x >= drv_num_nokey * 64 - diagonal_start &&
2123*4882a593Smuzhiyun 				 ps[0][i].other.y >= sen_num_nokey * 64 - diagonal_start))
2124*4882a593Smuzhiyun 				point_corner |= 0x2<<i*2;
2125*4882a593Smuzhiyun 			else if ((ps[0][i].other.x <= diagonal_start &&
2126*4882a593Smuzhiyun 				ps[0][i].other.y >= sen_num_nokey * 64 - diagonal_start) ||
2127*4882a593Smuzhiyun 				(ps[0][i].other.x >= drv_num_nokey * 64 - diagonal_start &&
2128*4882a593Smuzhiyun 				ps[0][i].other.y <= diagonal_start))
2129*4882a593Smuzhiyun 				point_corner |= 0x3<<i*2;
2130*4882a593Smuzhiyun 			else
2131*4882a593Smuzhiyun 				point_corner |= 0x1<<i*2;
2132*4882a593Smuzhiyun 		}
2133*4882a593Smuzhiyun 		if(point_corner & (0x2<<i*2))
2134*4882a593Smuzhiyun 		{
2135*4882a593Smuzhiyun 			dis = DiagonalDistance(&(ps[0][i]),point_corner & (0x1<<i*2));
2136*4882a593Smuzhiyun 			if(dis <= diagonal_size*4)
2137*4882a593Smuzhiyun 			{
2138*4882a593Smuzhiyun 				DiagonalCompress(&(ps[0][i]),point_corner & (0x1<<i*2),dis,diagonal_size);
2139*4882a593Smuzhiyun 			}
2140*4882a593Smuzhiyun 			else if(dis > diagonal_size*4)
2141*4882a593Smuzhiyun 			{
2142*4882a593Smuzhiyun 				point_corner &= ~(0x3<<i*2);
2143*4882a593Smuzhiyun 				point_corner |= 0x1<<i*2;
2144*4882a593Smuzhiyun 			}
2145*4882a593Smuzhiyun 		}
2146*4882a593Smuzhiyun 	}
2147*4882a593Smuzhiyun }
2148*4882a593Smuzhiyun 
PressureSave(void)2149*4882a593Smuzhiyun static void PressureSave(void)
2150*4882a593Smuzhiyun {
2151*4882a593Smuzhiyun 	int i;
2152*4882a593Smuzhiyun 	if((point_num & 0x1000)==0)
2153*4882a593Smuzhiyun 	{
2154*4882a593Smuzhiyun 		return;
2155*4882a593Smuzhiyun 	}
2156*4882a593Smuzhiyun 	for(i=0;i<POINT_MAX;i++)
2157*4882a593Smuzhiyun 	{
2158*4882a593Smuzhiyun 		pressure_now[i] = point_now[i].all >> 28;
2159*4882a593Smuzhiyun 		point_now[i].all &= ~(0xf<<28);
2160*4882a593Smuzhiyun 	}
2161*4882a593Smuzhiyun }
2162*4882a593Smuzhiyun 
PointPressure(void)2163*4882a593Smuzhiyun static void PointPressure(void)
2164*4882a593Smuzhiyun {
2165*4882a593Smuzhiyun 	int i,j;
2166*4882a593Smuzhiyun 	for(i=0;i<POINT_MAX;i++)
2167*4882a593Smuzhiyun 	{
2168*4882a593Smuzhiyun 		if(pa[0][i]!=0 && pa[1][i]==0)
2169*4882a593Smuzhiyun 		{
2170*4882a593Smuzhiyun 			pressure_report[i] = pa[0][i]*5;
2171*4882a593Smuzhiyun 			for(j=1;j<PRESSURE_DEEP;j++)
2172*4882a593Smuzhiyun 				pa[j][i] = pa[0][i];
2173*4882a593Smuzhiyun 			continue;
2174*4882a593Smuzhiyun 		}
2175*4882a593Smuzhiyun 		j = (pressure_report[i]+1)/2 + pa[0][i] +
2176*4882a593Smuzhiyun 			pa[1][i] + (pa[2][i]+1)/2 - pressure_report[i];
2177*4882a593Smuzhiyun 		if(j >= 2)
2178*4882a593Smuzhiyun 			j -= 2;
2179*4882a593Smuzhiyun 		else if(j <= -2)
2180*4882a593Smuzhiyun 			j += 2;
2181*4882a593Smuzhiyun 		else
2182*4882a593Smuzhiyun 			j = 0;
2183*4882a593Smuzhiyun 		pressure_report[i] = pressure_report[i]+j;
2184*4882a593Smuzhiyun 	}
2185*4882a593Smuzhiyun }
2186*4882a593Smuzhiyun 
gsl_ReportPressure(unsigned int * p)2187*4882a593Smuzhiyun void gsl_ReportPressure(unsigned int *p)
2188*4882a593Smuzhiyun {
2189*4882a593Smuzhiyun 	int i;
2190*4882a593Smuzhiyun 	for(i=0;i<POINT_MAX;i++)
2191*4882a593Smuzhiyun 	{
2192*4882a593Smuzhiyun 		if(i < point_num)
2193*4882a593Smuzhiyun 		{
2194*4882a593Smuzhiyun 			if(pressure_now[i] == 0)
2195*4882a593Smuzhiyun 				p[i] = 0;
2196*4882a593Smuzhiyun 			else if(pressure_now[i] <= 7)
2197*4882a593Smuzhiyun 				p[i] = 1;
2198*4882a593Smuzhiyun 			else if(pressure_now[i] > 63+7)
2199*4882a593Smuzhiyun 				p[i] = 63;
2200*4882a593Smuzhiyun 			else
2201*4882a593Smuzhiyun 				p[i] = pressure_now[i] - 7;
2202*4882a593Smuzhiyun 		}
2203*4882a593Smuzhiyun 		else
2204*4882a593Smuzhiyun 			p[i] = 0;
2205*4882a593Smuzhiyun 	}
2206*4882a593Smuzhiyun }
2207*4882a593Smuzhiyun //EXPORT_SYMBOL(gsl_ReportPressure);
2208*4882a593Smuzhiyun 
gsl_TouchNear(void)2209*4882a593Smuzhiyun int  gsl_TouchNear(void)
2210*4882a593Smuzhiyun {
2211*4882a593Smuzhiyun 		return 0;
2212*4882a593Smuzhiyun }
2213*4882a593Smuzhiyun //EXPORT_SYMBOL(gsl_TouchNear);
2214*4882a593Smuzhiyun 
DoubleClick(void)2215*4882a593Smuzhiyun static void DoubleClick(void)
2216*4882a593Smuzhiyun {
2217*4882a593Smuzhiyun 	int i;
2218*4882a593Smuzhiyun 	unsigned int width[3];
2219*4882a593Smuzhiyun 	double_click = 0;
2220*4882a593Smuzhiyun //	printk("sileadinc DoubleClick c = %08x , %08x\n",csensor_count,pp[0][0].all);
2221*4882a593Smuzhiyun 	if (point_num >= 2 || (point_num == 1 && pp[0][0].all == 0) || pp[0][0].other.key)
2222*4882a593Smuzhiyun 	{
2223*4882a593Smuzhiyun //		printk("sileadinc DoubleClick return\n");
2224*4882a593Smuzhiyun 		for(i=0;i<sizeof(click_count)/sizeof(click_count[0]);i++)
2225*4882a593Smuzhiyun 			click_count[i] = 0;
2226*4882a593Smuzhiyun 		return;
2227*4882a593Smuzhiyun 	}
2228*4882a593Smuzhiyun 	if(point_num!=0 && prev_num==0)
2229*4882a593Smuzhiyun 	{
2230*4882a593Smuzhiyun 		for(i=sizeof(click_count)/sizeof(click_count[0])-1;i>0;i--)
2231*4882a593Smuzhiyun 			click_count[i] = click_count[i-1];
2232*4882a593Smuzhiyun 		click_count[0] = csensor_count;
2233*4882a593Smuzhiyun 		for(i=sizeof(point_click)/sizeof(point_click[0])-1;i>1;i--)
2234*4882a593Smuzhiyun 			point_click[i].all = point_click[i-2].all;
2235*4882a593Smuzhiyun 		point_click[0].all = pp[0][0].all;
2236*4882a593Smuzhiyun 		point_click[1].all = pp[0][0].all;
2237*4882a593Smuzhiyun 	}
2238*4882a593Smuzhiyun 	if(point_num!=0 && prev_num!=0)
2239*4882a593Smuzhiyun 	{
2240*4882a593Smuzhiyun 		if(PointDistance(&point_click[1],&pp[0][0]) > PointDistance(&point_click[1],&point_click[0]))
2241*4882a593Smuzhiyun 			point_click[0].all = pp[0][0].all;
2242*4882a593Smuzhiyun 	}
2243*4882a593Smuzhiyun 	if(point_num==0 && prev_num!=0)
2244*4882a593Smuzhiyun 	{
2245*4882a593Smuzhiyun //		printk("sileadinc DoubleClick point_click %08x  %08x %08x %08x\n",point_click[0],point_click[1],point_click[2],point_click[3]);
2246*4882a593Smuzhiyun 		for(i=sizeof(click_count)/sizeof(click_count[0])-1;i>0;i--)
2247*4882a593Smuzhiyun 			click_count[i] = click_count[i-1];
2248*4882a593Smuzhiyun 		click_count[0] = csensor_count;
2249*4882a593Smuzhiyun 		for(i=0;i<sizeof(click_count)/sizeof(click_count[0])-1;i++)
2250*4882a593Smuzhiyun 			width[i] = (click_count[i] - click_count[i+1]) & 0xffff;
2251*4882a593Smuzhiyun 		if(!(width[0]>=double_down*average && width[2]>=double_down*average && width[1]<=double_up*average))
2252*4882a593Smuzhiyun 		{
2253*4882a593Smuzhiyun //			printk("sileadinc DoubleClick width %08x %08x %08x\n",width[0],width[1],width[2]);
2254*4882a593Smuzhiyun 			return;
2255*4882a593Smuzhiyun 		}
2256*4882a593Smuzhiyun 		if(PointDistance(&point_click[0],&point_click[1]) > 64*64
2257*4882a593Smuzhiyun 		|| PointDistance(&point_click[2],&point_click[3]) > 64*64
2258*4882a593Smuzhiyun 		|| PointDistance(&point_click[1],&point_click[3]) > 128*128)
2259*4882a593Smuzhiyun 		{
2260*4882a593Smuzhiyun //			printk("sileadinc DoubleClick distance %08x %08x %08x\n",
2261*4882a593Smuzhiyun //			PointDistance(&point_click[0],&point_click[1]),
2262*4882a593Smuzhiyun //			PointDistance(&point_click[2],&point_click[3]),
2263*4882a593Smuzhiyun //			PointDistance(&point_click[1],&point_click[3]));
2264*4882a593Smuzhiyun 			return;
2265*4882a593Smuzhiyun 		}
2266*4882a593Smuzhiyun 		for(i=0;i<sizeof(click_count)/sizeof(click_count[0]);i++)
2267*4882a593Smuzhiyun 			click_count[i] = 0;//?point_click
2268*4882a593Smuzhiyun 		double_click = '*';
2269*4882a593Smuzhiyun //		printk("sileadinc DoubleClick succeed double_click=%c\n",double_click);
2270*4882a593Smuzhiyun 	}
2271*4882a593Smuzhiyun }
2272*4882a593Smuzhiyun 
gsl_id_reg_init(int flag)2273*4882a593Smuzhiyun static void gsl_id_reg_init(int flag)
2274*4882a593Smuzhiyun {
2275*4882a593Smuzhiyun 	int i,j;
2276*4882a593Smuzhiyun 	for(j=0;j<POINT_DEEP;j++)
2277*4882a593Smuzhiyun 		for(i=0;i<POINT_MAX;i++)
2278*4882a593Smuzhiyun 			point_array[j][i].all = 0;
2279*4882a593Smuzhiyun 	for(j=0;j<PRESSURE_DEEP;j++)
2280*4882a593Smuzhiyun 		for(i=0;i<POINT_MAX;i++)
2281*4882a593Smuzhiyun 			pressure_array[j][i] = 0;
2282*4882a593Smuzhiyun 	for(i=0;i<POINT_MAX;i++)
2283*4882a593Smuzhiyun 	{
2284*4882a593Smuzhiyun 		point_delay[i].all = 0;
2285*4882a593Smuzhiyun 		filter_deep[i] = 0;
2286*4882a593Smuzhiyun 		point_decimal[i].all = 0;
2287*4882a593Smuzhiyun 	}
2288*4882a593Smuzhiyun 	point_edge.rate = 0;
2289*4882a593Smuzhiyun 	point_n = 0;
2290*4882a593Smuzhiyun 	if(flag)
2291*4882a593Smuzhiyun 		point_num = 0;
2292*4882a593Smuzhiyun 	prev_num = 0;
2293*4882a593Smuzhiyun 	point_shake = 0;
2294*4882a593Smuzhiyun 	reset_mask_send = 0;
2295*4882a593Smuzhiyun 	reset_mask_max = 0;
2296*4882a593Smuzhiyun 	reset_mask_count = 0;
2297*4882a593Smuzhiyun 	point_near = 0;
2298*4882a593Smuzhiyun 	point_corner = 0;
2299*4882a593Smuzhiyun 	global_state.all = 0;
2300*4882a593Smuzhiyun 	double_click = 0;
2301*4882a593Smuzhiyun 	inte_count = 0;
2302*4882a593Smuzhiyun 	csensor_count = 0;
2303*4882a593Smuzhiyun #ifdef GESTURE_LICH
2304*4882a593Smuzhiyun 	GestureInit();
2305*4882a593Smuzhiyun #endif
2306*4882a593Smuzhiyun }
2307*4882a593Smuzhiyun 
DataCheck(void)2308*4882a593Smuzhiyun static int DataCheck(void)
2309*4882a593Smuzhiyun {
2310*4882a593Smuzhiyun 	if(drv_num==0 || drv_num_nokey==0 || sen_num==0 || sen_num_nokey==0)
2311*4882a593Smuzhiyun 		return 0;
2312*4882a593Smuzhiyun 	if(screen_x_max==0 || screen_y_max==0)
2313*4882a593Smuzhiyun 		return 0;
2314*4882a593Smuzhiyun 	return 1;
2315*4882a593Smuzhiyun }
2316*4882a593Smuzhiyun 
gsl_DataInit(unsigned int * conf_in)2317*4882a593Smuzhiyun void gsl_DataInit(unsigned int * conf_in)
2318*4882a593Smuzhiyun {
2319*4882a593Smuzhiyun 	int i, j;
2320*4882a593Smuzhiyun 	unsigned int *conf;
2321*4882a593Smuzhiyun 	int len;
2322*4882a593Smuzhiyun 	gsl_id_reg_init(1);
2323*4882a593Smuzhiyun 	conf = config_static;
2324*4882a593Smuzhiyun 	coordinate_correct_able = 0;
2325*4882a593Smuzhiyun 	for(i=0;i<32;i++)
2326*4882a593Smuzhiyun 	{
2327*4882a593Smuzhiyun 		coordinate_correct_coe_x[i] = i;
2328*4882a593Smuzhiyun 		coordinate_correct_coe_y[i] = i;
2329*4882a593Smuzhiyun 	}
2330*4882a593Smuzhiyun 	id_first_coe = 8;
2331*4882a593Smuzhiyun 	id_speed_coe = 128*128;
2332*4882a593Smuzhiyun 	id_static_coe = 64*64;
2333*4882a593Smuzhiyun 	average = 3+1;
2334*4882a593Smuzhiyun 	soft_average = 3;
2335*4882a593Smuzhiyun 	report_delay=0;
2336*4882a593Smuzhiyun 	report_ahead = 0x9249249;
2337*4882a593Smuzhiyun 	for(i=0;i<4;i++)
2338*4882a593Smuzhiyun 		median_dis[i]=0;
2339*4882a593Smuzhiyun 	shake_min = 0*0;
2340*4882a593Smuzhiyun 	for(i=0;i<2;i++)
2341*4882a593Smuzhiyun 	{
2342*4882a593Smuzhiyun 		match_y[i]=0;
2343*4882a593Smuzhiyun 		match_x[i]=0;
2344*4882a593Smuzhiyun 		ignore_y[i]=0;
2345*4882a593Smuzhiyun 		ignore_x[i]=0;
2346*4882a593Smuzhiyun 	}
2347*4882a593Smuzhiyun 	match_y[0]=4096;
2348*4882a593Smuzhiyun 	match_x[0]=4096;
2349*4882a593Smuzhiyun 	screen_y_max = 480;
2350*4882a593Smuzhiyun 	screen_x_max = 800;
2351*4882a593Smuzhiyun 	point_num_max=10;
2352*4882a593Smuzhiyun 	drv_num = 16;
2353*4882a593Smuzhiyun 	sen_num = 10;
2354*4882a593Smuzhiyun 	drv_num_nokey = 16;
2355*4882a593Smuzhiyun 	sen_num_nokey = 10;
2356*4882a593Smuzhiyun 	for(i=0;i<4;i++)
2357*4882a593Smuzhiyun 		edge_cut[i] = 0;
2358*4882a593Smuzhiyun 	for(i=0;i<32;i++)
2359*4882a593Smuzhiyun 		stretch_array[i] = 0;
2360*4882a593Smuzhiyun 	for(i=0;i<16;i++)
2361*4882a593Smuzhiyun 		shake_all_array[i] = 0;
2362*4882a593Smuzhiyun 	reset_mask_dis = 0;
2363*4882a593Smuzhiyun 	reset_mask_type=0;
2364*4882a593Smuzhiyun 	diagonal = 0;
2365*4882a593Smuzhiyun 	key_map_able = 0;
2366*4882a593Smuzhiyun 	for(i=0;i<8*3;i++)
2367*4882a593Smuzhiyun 		key_range_array[i] = 0;
2368*4882a593Smuzhiyun 	filter_able = 0;
2369*4882a593Smuzhiyun 	filter_coe[0] = ( 0<<6*4)+( 0<<6*3)+( 0<<6*2)+(40<<6*1)+(24<<6*0);
2370*4882a593Smuzhiyun 	filter_coe[1] = ( 0<<6*4)+( 0<<6*3)+(16<<6*2)+(24<<6*1)+(24<<6*0);
2371*4882a593Smuzhiyun 	filter_coe[2] = ( 0<<6*4)+(16<<6*3)+(24<<6*2)+(16<<6*1)+( 8<<6*0);
2372*4882a593Smuzhiyun 	filter_coe[3] = ( 6<<6*4)+(16<<6*3)+(24<<6*2)+(12<<6*1)+( 6<<6*0);
2373*4882a593Smuzhiyun 	for(i=0;i<4;i++)
2374*4882a593Smuzhiyun 	{
2375*4882a593Smuzhiyun 		multi_x_array[i]=0;
2376*4882a593Smuzhiyun 		multi_y_array[i]=0;
2377*4882a593Smuzhiyun 	}
2378*4882a593Smuzhiyun 	point_repeat[0] = 32;
2379*4882a593Smuzhiyun 	point_repeat[1] = 96;
2380*4882a593Smuzhiyun 	edge_first = 0;
2381*4882a593Smuzhiyun 	edge_first_coe = 0x80;
2382*4882a593Smuzhiyun 	//----------------------------------------------
2383*4882a593Smuzhiyun 	if(conf_in == NULL)
2384*4882a593Smuzhiyun 	{
2385*4882a593Smuzhiyun 		return;
2386*4882a593Smuzhiyun 	}
2387*4882a593Smuzhiyun 	if(conf_in[0] <= 0xfff)
2388*4882a593Smuzhiyun 	{
2389*4882a593Smuzhiyun 		if(ConfigCoorMulti((int*)conf_in))
2390*4882a593Smuzhiyun 			len = 512;
2391*4882a593Smuzhiyun 		else if(ConfigFilter(conf_in))
2392*4882a593Smuzhiyun 			len = 256;
2393*4882a593Smuzhiyun 		else if (ConfigKeyMap((int*)conf_in))
2394*4882a593Smuzhiyun 			len = 241;
2395*4882a593Smuzhiyun 		else
2396*4882a593Smuzhiyun 			len = 215;
2397*4882a593Smuzhiyun 	}
2398*4882a593Smuzhiyun 	else if(conf_in[1] <= CONFIG_LENGTH)
2399*4882a593Smuzhiyun 		len = conf_in[1];
2400*4882a593Smuzhiyun 	else
2401*4882a593Smuzhiyun 		len = CONFIG_LENGTH;
2402*4882a593Smuzhiyun 	for(i=0;i<len;i++)
2403*4882a593Smuzhiyun 		conf[i] = conf_in[i];
2404*4882a593Smuzhiyun 	for(;i<CONFIG_LENGTH;i++)
2405*4882a593Smuzhiyun 		conf[i] = 0;
2406*4882a593Smuzhiyun 	if(conf_in[0] <= 0xfff)
2407*4882a593Smuzhiyun 	{
2408*4882a593Smuzhiyun 		coordinate_correct_able = conf[0];
2409*4882a593Smuzhiyun 		drv_num = conf[1];
2410*4882a593Smuzhiyun 		sen_num = conf[2];
2411*4882a593Smuzhiyun 		drv_num_nokey = conf[3];
2412*4882a593Smuzhiyun 		sen_num_nokey = conf[4];
2413*4882a593Smuzhiyun 		id_first_coe = conf[5];
2414*4882a593Smuzhiyun 		id_speed_coe = conf[6];
2415*4882a593Smuzhiyun 		id_static_coe = conf[7];
2416*4882a593Smuzhiyun 		average = conf[8];
2417*4882a593Smuzhiyun 		soft_average = conf[9];
2418*4882a593Smuzhiyun 
2419*4882a593Smuzhiyun 		report_delay = conf[13];
2420*4882a593Smuzhiyun 		shake_min = conf[14];
2421*4882a593Smuzhiyun 		screen_y_max = conf[15];
2422*4882a593Smuzhiyun 		screen_x_max = conf[16];
2423*4882a593Smuzhiyun 		point_num_max = conf[17];
2424*4882a593Smuzhiyun 		global_flag.all = conf[18];
2425*4882a593Smuzhiyun 		for(i=0;i<4;i++)
2426*4882a593Smuzhiyun 			median_dis[i] = (unsigned char)conf[19+i];
2427*4882a593Smuzhiyun 		for(i=0;i<2;i++)
2428*4882a593Smuzhiyun 		{
2429*4882a593Smuzhiyun 			match_y[i] = conf[23+i];
2430*4882a593Smuzhiyun 			match_x[i] = conf[25+i];
2431*4882a593Smuzhiyun 			ignore_y[i] = conf[27+i];
2432*4882a593Smuzhiyun 			ignore_x[i] = conf[29+i];
2433*4882a593Smuzhiyun 		}
2434*4882a593Smuzhiyun 		for(i=0;i<64;i++)
2435*4882a593Smuzhiyun 		{
2436*4882a593Smuzhiyun 			coordinate_correct_coe_x[i] = conf[31+i];
2437*4882a593Smuzhiyun 			coordinate_correct_coe_y[i] = conf[95+i];
2438*4882a593Smuzhiyun 		}
2439*4882a593Smuzhiyun 		for(i=0;i<4;i++)
2440*4882a593Smuzhiyun 			edge_cut[i] = conf[159+i];
2441*4882a593Smuzhiyun 		for(i=0;i<32;i++)
2442*4882a593Smuzhiyun 			stretch_array[i] = conf[163+i];
2443*4882a593Smuzhiyun 		for(i=0;i<16;i++)
2444*4882a593Smuzhiyun 			shake_all_array[i] = conf[195+i];
2445*4882a593Smuzhiyun 		reset_mask_dis = conf[213];
2446*4882a593Smuzhiyun 		reset_mask_type = conf[214];
2447*4882a593Smuzhiyun 		key_map_able = conf[217];
2448*4882a593Smuzhiyun 		for(i=0;i<8*3;i++)
2449*4882a593Smuzhiyun 			key_range_array[i] = conf[218+i];
2450*4882a593Smuzhiyun 		filter_able = conf[242];
2451*4882a593Smuzhiyun 		for(i=0;i<4;i++)
2452*4882a593Smuzhiyun 			filter_coe[i] = conf[243+i];
2453*4882a593Smuzhiyun 		for(i=0;i<4;i++)
2454*4882a593Smuzhiyun 			multi_x_array[i] = conf[247+i];
2455*4882a593Smuzhiyun 		for(i=0;i<4;i++)
2456*4882a593Smuzhiyun 			multi_y_array[i] = conf[251+i];
2457*4882a593Smuzhiyun 		diagonal = conf[255];
2458*4882a593Smuzhiyun 		for(i=0;i<4;i++)
2459*4882a593Smuzhiyun 		  for(j=0;j<64;j++)
2460*4882a593Smuzhiyun 			  multi_group[i][j] = conf[256+64*i+j];
2461*4882a593Smuzhiyun 		for(i=0;i<4;i++)
2462*4882a593Smuzhiyun 		{
2463*4882a593Smuzhiyun 		  for(j=0;j<8;j++)
2464*4882a593Smuzhiyun 		  {
2465*4882a593Smuzhiyun 			  ps_coe[i][j] = conf[256 + 64*3 + 8*i+j];
2466*4882a593Smuzhiyun 			  pr_coe[i][j] = conf[256 + 64*3 + 8*i+j + 32];
2467*4882a593Smuzhiyun 			}
2468*4882a593Smuzhiyun 		}
2469*4882a593Smuzhiyun 		//-----------------------
2470*4882a593Smuzhiyun 		near_set[0] = 0;
2471*4882a593Smuzhiyun 		near_set[1] = 0;
2472*4882a593Smuzhiyun 	}
2473*4882a593Smuzhiyun 	else
2474*4882a593Smuzhiyun 	{
2475*4882a593Smuzhiyun 		global_flag.all = conf[0x10];
2476*4882a593Smuzhiyun 		point_num_max = conf[0x11];
2477*4882a593Smuzhiyun 		drv_num = conf[0x12]&0xffff;
2478*4882a593Smuzhiyun 		sen_num = conf[0x12]>>16;
2479*4882a593Smuzhiyun 		drv_num_nokey = conf[0x13]&0xffff;
2480*4882a593Smuzhiyun 		sen_num_nokey = conf[0x13]>>16;
2481*4882a593Smuzhiyun 		screen_x_max = conf[0x14]&0xffff;
2482*4882a593Smuzhiyun 		screen_y_max = conf[0x14]>>16;
2483*4882a593Smuzhiyun 		average = conf[0x15];
2484*4882a593Smuzhiyun 		reset_mask_dis = conf[0x16];
2485*4882a593Smuzhiyun 		reset_mask_type = conf[0x17];
2486*4882a593Smuzhiyun 		point_repeat[0] = conf[0x18]>>16;
2487*4882a593Smuzhiyun 		point_repeat[1] = conf[0x18]&0xffff;
2488*4882a593Smuzhiyun 		//conf[0x19~0x1f]
2489*4882a593Smuzhiyun 		near_set[0] = conf[0x19]>>16;
2490*4882a593Smuzhiyun 		near_set[1] = conf[0x19]&0xffff;
2491*4882a593Smuzhiyun 		diagonal = conf[0x1a];
2492*4882a593Smuzhiyun 		//-------------------------
2493*4882a593Smuzhiyun 
2494*4882a593Smuzhiyun 		id_first_coe = conf[0x20];
2495*4882a593Smuzhiyun 		id_speed_coe = conf[0x21];
2496*4882a593Smuzhiyun 		id_static_coe = conf[0x22];
2497*4882a593Smuzhiyun 		match_y[0] = conf[0x23]>>16;
2498*4882a593Smuzhiyun 		match_y[1] = conf[0x23]&0xffff;
2499*4882a593Smuzhiyun 		match_x[0] = conf[0x24]>>16;
2500*4882a593Smuzhiyun 		match_x[1] = conf[0x24]&0xffff;
2501*4882a593Smuzhiyun 		ignore_y[0] = conf[0x25]>>16;
2502*4882a593Smuzhiyun 		ignore_y[1] = conf[0x25]&0xffff;
2503*4882a593Smuzhiyun 		ignore_x[0] = conf[0x26]>>16;
2504*4882a593Smuzhiyun 		ignore_x[1] = conf[0x26]&0xffff;
2505*4882a593Smuzhiyun 		edge_cut[0] = (conf[0x27]>>24) & 0xff;
2506*4882a593Smuzhiyun 		edge_cut[1] = (conf[0x27]>>16) & 0xff;
2507*4882a593Smuzhiyun 		edge_cut[2] = (conf[0x27]>> 8) & 0xff;
2508*4882a593Smuzhiyun 		edge_cut[3] = (conf[0x27]>> 0) & 0xff;
2509*4882a593Smuzhiyun 		report_delay = conf[0x28];
2510*4882a593Smuzhiyun 		shake_min = conf[0x29];
2511*4882a593Smuzhiyun 		for(i=0;i<16;i++)
2512*4882a593Smuzhiyun 		{
2513*4882a593Smuzhiyun 			stretch_array[i*2+0] = conf[0x2a+i] & 0xffff;
2514*4882a593Smuzhiyun 			stretch_array[i*2+1] = conf[0x2a+i] >> 16;
2515*4882a593Smuzhiyun 		}
2516*4882a593Smuzhiyun 		for(i=0;i<8;i++)
2517*4882a593Smuzhiyun 		{
2518*4882a593Smuzhiyun 			shake_all_array[i*2+0] = conf[0x3a+i] & 0xffff;
2519*4882a593Smuzhiyun 			shake_all_array[i*2+1] = conf[0x3a+i] >> 16;
2520*4882a593Smuzhiyun 		}
2521*4882a593Smuzhiyun 		report_ahead			= conf[0x42];
2522*4882a593Smuzhiyun // 		key_dead_time			= conf[0x43];
2523*4882a593Smuzhiyun // 		point_dead_time			= conf[0x44];
2524*4882a593Smuzhiyun // 		point_dead_time2		= conf[0x45];
2525*4882a593Smuzhiyun // 		point_dead_distance		= conf[0x46];
2526*4882a593Smuzhiyun // 		point_dead_distance2	= conf[0x47];
2527*4882a593Smuzhiyun 		edge_first				= conf[0x48];
2528*4882a593Smuzhiyun 		edge_first_coe			= conf[0x49];
2529*4882a593Smuzhiyun 		//goto_test
2530*4882a593Smuzhiyun 
2531*4882a593Smuzhiyun 		key_map_able = conf[0x60];
2532*4882a593Smuzhiyun 		for(i=0;i<8*3;i++)
2533*4882a593Smuzhiyun 			key_range_array[i] = conf[0x61+i];
2534*4882a593Smuzhiyun 
2535*4882a593Smuzhiyun 		coordinate_correct_able = conf[0x100];
2536*4882a593Smuzhiyun 		for(i=0;i<4;i++)
2537*4882a593Smuzhiyun 		{
2538*4882a593Smuzhiyun 			multi_x_array[i] = conf[0x101+i];
2539*4882a593Smuzhiyun 			multi_y_array[i] = conf[0x105+i];
2540*4882a593Smuzhiyun 		}
2541*4882a593Smuzhiyun 		for(i=0;i<64;i++)
2542*4882a593Smuzhiyun 		{
2543*4882a593Smuzhiyun 			coordinate_correct_coe_x[i] = (conf[0x109+i/4]>>(i%4*8)) & 0xff;
2544*4882a593Smuzhiyun 			coordinate_correct_coe_y[i] = (conf[0x109+64/4+i/4]>>(i%4*8)) & 0xff;
2545*4882a593Smuzhiyun 		}
2546*4882a593Smuzhiyun 		for(i=0;i<4;i++)
2547*4882a593Smuzhiyun 		{
2548*4882a593Smuzhiyun 		  for(j=0;j<64;j++)
2549*4882a593Smuzhiyun 			  multi_group[i][j] = (conf[0x109+64/4*2+(64*i+j)/4]>>((64*i+j)%4*8)) & 0xff;
2550*4882a593Smuzhiyun 		}
2551*4882a593Smuzhiyun 
2552*4882a593Smuzhiyun 		filter_able = conf[0x180];
2553*4882a593Smuzhiyun 		for(i=0;i<4;i++)
2554*4882a593Smuzhiyun 			filter_coe[i] = conf[0x181+i];
2555*4882a593Smuzhiyun 		for(i=0;i<4;i++)
2556*4882a593Smuzhiyun 			median_dis[i] = (unsigned char)conf[0x185+i];
2557*4882a593Smuzhiyun 		for(i=0;i<4;i++)
2558*4882a593Smuzhiyun 		{
2559*4882a593Smuzhiyun 		    for(j=0;j<8;j++)
2560*4882a593Smuzhiyun 		    {
2561*4882a593Smuzhiyun 			    ps_coe[i][j] = conf[0x189 + 8*i+j];
2562*4882a593Smuzhiyun 			    pr_coe[i][j] = conf[0x189 + 8*i+j + 32];
2563*4882a593Smuzhiyun 		    }
2564*4882a593Smuzhiyun 		}
2565*4882a593Smuzhiyun #ifdef GESTURE_LICH
2566*4882a593Smuzhiyun 		GestureSet(&conf[0x189 + 64]);
2567*4882a593Smuzhiyun #endif
2568*4882a593Smuzhiyun 	}
2569*4882a593Smuzhiyun 	//---------------------------------------------
2570*4882a593Smuzhiyun 	if(average == 0)
2571*4882a593Smuzhiyun 		average = 4;
2572*4882a593Smuzhiyun 	for(i=0;i<8;i++)
2573*4882a593Smuzhiyun 	{
2574*4882a593Smuzhiyun 		if(shake_all_array[i*2] & 0x8000)
2575*4882a593Smuzhiyun 			shake_all_array[i*2] = shake_all_array[i*2] & ~0x8000;
2576*4882a593Smuzhiyun 		else
2577*4882a593Smuzhiyun 			shake_all_array[i*2] = Sqrt(shake_all_array[i*2]);
2578*4882a593Smuzhiyun 	}
2579*4882a593Smuzhiyun 	for(i=0;i<2;i++)
2580*4882a593Smuzhiyun 	{
2581*4882a593Smuzhiyun 		if(match_x[i] & 0x8000)
2582*4882a593Smuzhiyun 			match_x[i] |= 0xffff0000;
2583*4882a593Smuzhiyun 		if(match_y[i] & 0x8000)
2584*4882a593Smuzhiyun 			match_y[i] |= 0xffff0000;
2585*4882a593Smuzhiyun 		if(ignore_x[i] & 0x8000)
2586*4882a593Smuzhiyun 			ignore_x[i] |= 0xffff0000;
2587*4882a593Smuzhiyun 		if(ignore_y[i] & 0x8000)
2588*4882a593Smuzhiyun 			ignore_y[i] |= 0xffff0000;
2589*4882a593Smuzhiyun 	}
2590*4882a593Smuzhiyun 	for(i=0;i<CONFIG_LENGTH;i++)
2591*4882a593Smuzhiyun 		config_static[i] = 0;
2592*4882a593Smuzhiyun }
2593*4882a593Smuzhiyun //EXPORT_SYMBOL(gsl_DataInit);
2594*4882a593Smuzhiyun 
gsl_version_id(void)2595*4882a593Smuzhiyun unsigned int gsl_version_id(void)
2596*4882a593Smuzhiyun {
2597*4882a593Smuzhiyun 	return GSL_VERSION;
2598*4882a593Smuzhiyun }
2599*4882a593Smuzhiyun //EXPORT_SYMBOL(gsl_version_id);
2600*4882a593Smuzhiyun 
gsl_mask_tiaoping(void)2601*4882a593Smuzhiyun unsigned int gsl_mask_tiaoping(void)
2602*4882a593Smuzhiyun {
2603*4882a593Smuzhiyun 	return reset_mask_send;
2604*4882a593Smuzhiyun }
2605*4882a593Smuzhiyun //EXPORT_SYMBOL(gsl_mask_tiaoping);
2606*4882a593Smuzhiyun 
2607*4882a593Smuzhiyun 
GetFlag(void)2608*4882a593Smuzhiyun static void GetFlag(void)
2609*4882a593Smuzhiyun {
2610*4882a593Smuzhiyun 	int i = 0;
2611*4882a593Smuzhiyun 	int num_save;
2612*4882a593Smuzhiyun 	if(((point_num & 0x100)!=0) ||
2613*4882a593Smuzhiyun 		((point_num & 0x200) != 0 &&
2614*4882a593Smuzhiyun 		global_state.other.reset == 1))
2615*4882a593Smuzhiyun 	{
2616*4882a593Smuzhiyun 		gsl_id_reg_init(0);
2617*4882a593Smuzhiyun 	}
2618*4882a593Smuzhiyun 	if((point_num & 0x300) == 0)
2619*4882a593Smuzhiyun 	{
2620*4882a593Smuzhiyun 		global_state.other.reset = 1;
2621*4882a593Smuzhiyun 	}
2622*4882a593Smuzhiyun 	if(point_num & 0x400)
2623*4882a593Smuzhiyun 		global_state.other.only = 1;
2624*4882a593Smuzhiyun 	else
2625*4882a593Smuzhiyun 		global_state.other.only = 0;
2626*4882a593Smuzhiyun 	if(point_num & 0x2000)
2627*4882a593Smuzhiyun 		global_state.other.interpolation = 0xf;
2628*4882a593Smuzhiyun 	else if (global_state.other.interpolation)
2629*4882a593Smuzhiyun 		global_state.other.interpolation--;
2630*4882a593Smuzhiyun 	if(point_num & 0x4000)
2631*4882a593Smuzhiyun 		global_state.other.ex = 1;
2632*4882a593Smuzhiyun 	else
2633*4882a593Smuzhiyun 		global_state.other.ex = 0;
2634*4882a593Smuzhiyun 	inte_count ++;
2635*4882a593Smuzhiyun 	csensor_count = ((unsigned int)point_num)>>16;
2636*4882a593Smuzhiyun 	num_save = point_num & 0xff;
2637*4882a593Smuzhiyun 	if(num_save > POINT_MAX)
2638*4882a593Smuzhiyun 		num_save = POINT_MAX;
2639*4882a593Smuzhiyun 	for(i=0;i<POINT_MAX;i++)
2640*4882a593Smuzhiyun 	{
2641*4882a593Smuzhiyun 		if(i >= num_save)
2642*4882a593Smuzhiyun 			point_now[i].all = 0;
2643*4882a593Smuzhiyun 	}
2644*4882a593Smuzhiyun 	point_num = (point_num & (~0xff)) + num_save;
2645*4882a593Smuzhiyun }
2646*4882a593Smuzhiyun 
gsl_alg_id_main(struct gsl_touch_info * cinfo)2647*4882a593Smuzhiyun void gsl_alg_id_main(struct gsl_touch_info *cinfo)
2648*4882a593Smuzhiyun {
2649*4882a593Smuzhiyun 	int i;
2650*4882a593Smuzhiyun 	point_num = cinfo->finger_num;
2651*4882a593Smuzhiyun 	for(i=0;i<POINT_MAX;i++)
2652*4882a593Smuzhiyun 	{
2653*4882a593Smuzhiyun 		point_now[i].all = (cinfo->id[i]<<28) |
2654*4882a593Smuzhiyun 			(cinfo->x[i]<<16) | cinfo->y[i];
2655*4882a593Smuzhiyun 	}
2656*4882a593Smuzhiyun 
2657*4882a593Smuzhiyun 	GetFlag();
2658*4882a593Smuzhiyun 	if(DataCheck() == 0)
2659*4882a593Smuzhiyun 	{
2660*4882a593Smuzhiyun 		point_num = 0;
2661*4882a593Smuzhiyun 		cinfo->finger_num = 0;
2662*4882a593Smuzhiyun 		return;
2663*4882a593Smuzhiyun 	}
2664*4882a593Smuzhiyun 	PressureSave();
2665*4882a593Smuzhiyun 	PointCoor();
2666*4882a593Smuzhiyun 	CoordinateCorrect();
2667*4882a593Smuzhiyun 	PointEdge();
2668*4882a593Smuzhiyun 	PointRepeat();
2669*4882a593Smuzhiyun 	GetPointNum(point_now);
2670*4882a593Smuzhiyun 	PointPointer();
2671*4882a593Smuzhiyun 	PointPredict();
2672*4882a593Smuzhiyun 	PointId();
2673*4882a593Smuzhiyun 	PointNewId();
2674*4882a593Smuzhiyun 	PointOrder();
2675*4882a593Smuzhiyun 	PointCross();
2676*4882a593Smuzhiyun 	GetPointNum(pp[0]);
2677*4882a593Smuzhiyun 	DoubleClick();
2678*4882a593Smuzhiyun 	prev_num = point_num;
2679*4882a593Smuzhiyun 	ResetMask();
2680*4882a593Smuzhiyun 	PointStretch();
2681*4882a593Smuzhiyun 	PointDiagonal();
2682*4882a593Smuzhiyun  	PointFilter();
2683*4882a593Smuzhiyun 	GetPointNum(pr[0]);
2684*4882a593Smuzhiyun #ifdef GESTURE_LICH
2685*4882a593Smuzhiyun 	GestureMain(&(pr[0][0].all),point_num);
2686*4882a593Smuzhiyun #endif
2687*4882a593Smuzhiyun 	PointDelay();
2688*4882a593Smuzhiyun 	PointPressure();
2689*4882a593Smuzhiyun 	PointReport(cinfo);
2690*4882a593Smuzhiyun }
2691*4882a593Smuzhiyun //EXPORT_SYMBOL(gsl_alg_id_main);
2692*4882a593Smuzhiyun 
2693*4882a593Smuzhiyun 
2694*4882a593Smuzhiyun //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2695*4882a593Smuzhiyun #ifdef GESTURE_LICH
2696*4882a593Smuzhiyun 
gsl_obtain_gesture(void)2697*4882a593Smuzhiyun int gsl_obtain_gesture(void)
2698*4882a593Smuzhiyun {
2699*4882a593Smuzhiyun 	return GestureDeal();
2700*4882a593Smuzhiyun }
2701*4882a593Smuzhiyun //EXPORT_SYMBOL(gsl_obtain_gesture);
2702*4882a593Smuzhiyun 
GestureMain(unsigned int data_coor[],unsigned int num)2703*4882a593Smuzhiyun static int GestureMain(unsigned int data_coor[],unsigned int num)
2704*4882a593Smuzhiyun {
2705*4882a593Smuzhiyun 	gesture_deal = FALSE;
2706*4882a593Smuzhiyun 	if(gesture_dis_min == 0)
2707*4882a593Smuzhiyun 		return FALSE;
2708*4882a593Smuzhiyun 	if(num == 0)
2709*4882a593Smuzhiyun 	{
2710*4882a593Smuzhiyun 		if(gesture_num == 0)
2711*4882a593Smuzhiyun 			return FALSE;
2712*4882a593Smuzhiyun 		if(gesture_num <= 8)
2713*4882a593Smuzhiyun 		{
2714*4882a593Smuzhiyun 			GestureInit();
2715*4882a593Smuzhiyun 			return FALSE;
2716*4882a593Smuzhiyun 		}
2717*4882a593Smuzhiyun 		gesture_deal = GESTURE_ALL;
2718*4882a593Smuzhiyun 		return TRUE;
2719*4882a593Smuzhiyun 	}
2720*4882a593Smuzhiyun 	else if(gesture_num < 0)
2721*4882a593Smuzhiyun 	{
2722*4882a593Smuzhiyun 		return FALSE;
2723*4882a593Smuzhiyun 	}
2724*4882a593Smuzhiyun 	else if(num == 1 && data_coor[0] != 0)
2725*4882a593Smuzhiyun 	{
2726*4882a593Smuzhiyun 		GesturePush((GESTURE_POINT_TYPE*) data_coor);
2727*4882a593Smuzhiyun 		return FALSE;
2728*4882a593Smuzhiyun 	}
2729*4882a593Smuzhiyun 	else// if(num > 1)
2730*4882a593Smuzhiyun 	{
2731*4882a593Smuzhiyun 		gesture_num = -1;
2732*4882a593Smuzhiyun 		return FALSE;
2733*4882a593Smuzhiyun 	}
2734*4882a593Smuzhiyun //	return TRUE;
2735*4882a593Smuzhiyun }
2736*4882a593Smuzhiyun 
GestureSqrt(int d)2737*4882a593Smuzhiyun static int GestureSqrt(int d)
2738*4882a593Smuzhiyun {
2739*4882a593Smuzhiyun 	int ret = 0;
2740*4882a593Smuzhiyun 	int i;
2741*4882a593Smuzhiyun 	for(i=14;i>=0;i--)
2742*4882a593Smuzhiyun 	{
2743*4882a593Smuzhiyun 		if((ret + (0x1<<i))*(ret + (0x1<<i)) <= d)
2744*4882a593Smuzhiyun 			ret |= (0x1<<i);
2745*4882a593Smuzhiyun 	}
2746*4882a593Smuzhiyun 	return ret;
2747*4882a593Smuzhiyun }
2748*4882a593Smuzhiyun 
GestureDistance(GESTURE_POINT_TYPE * d1,GESTURE_POINT_TYPE * d2,int sqrt_able)2749*4882a593Smuzhiyun static int GestureDistance(GESTURE_POINT_TYPE* d1,GESTURE_POINT_TYPE* d2,int sqrt_able)
2750*4882a593Smuzhiyun {
2751*4882a593Smuzhiyun 	if(sqrt_able)
2752*4882a593Smuzhiyun 		return GestureSqrt((d1->other.x - d2->other.x) *
2753*4882a593Smuzhiyun 			(d1->other.x - d2->other.x) +
2754*4882a593Smuzhiyun 			(d1->other.y - d2->other.y) *
2755*4882a593Smuzhiyun 			(d1->other.y - d2->other.y));
2756*4882a593Smuzhiyun 	else
2757*4882a593Smuzhiyun 		return (d1->other.x - d2->other.x) *
2758*4882a593Smuzhiyun 			(d1->other.x - d2->other.x) +
2759*4882a593Smuzhiyun 			(d1->other.y - d2->other.y) *
2760*4882a593Smuzhiyun 			(d1->other.y - d2->other.y);
2761*4882a593Smuzhiyun }
2762*4882a593Smuzhiyun 
GesturePush(GESTURE_POINT_TYPE * data)2763*4882a593Smuzhiyun static int GesturePush(GESTURE_POINT_TYPE* data)
2764*4882a593Smuzhiyun {
2765*4882a593Smuzhiyun 	if(gesture_num >= GESTURE_BUF_SIZE)
2766*4882a593Smuzhiyun 		return FALSE;
2767*4882a593Smuzhiyun 	if(gesture_num == 0)
2768*4882a593Smuzhiyun 	{
2769*4882a593Smuzhiyun 		gesture_buf[gesture_num ++].all = data->all & 0xffff0fff;
2770*4882a593Smuzhiyun 		return TRUE;
2771*4882a593Smuzhiyun 	}
2772*4882a593Smuzhiyun 	if(GestureDistance(data,&gesture_buf[gesture_num-1],TRUE) <= gesture_dis_min)
2773*4882a593Smuzhiyun 		return FALSE;
2774*4882a593Smuzhiyun 	gesture_buf[gesture_num ++].all = data->all & 0xffff0fff;
2775*4882a593Smuzhiyun 		return TRUE;
2776*4882a593Smuzhiyun }
2777*4882a593Smuzhiyun 
GestureInit(void)2778*4882a593Smuzhiyun static void GestureInit(void)
2779*4882a593Smuzhiyun {
2780*4882a593Smuzhiyun 	gesture_num_last = gesture_num;
2781*4882a593Smuzhiyun 	gesture_num = 0;
2782*4882a593Smuzhiyun 	gesture_deal = FALSE;
2783*4882a593Smuzhiyun 	if(gesture_dis_min < 0 || gesture_dis_min > 64)
2784*4882a593Smuzhiyun 		gesture_dis_min = 2;
2785*4882a593Smuzhiyun }
2786*4882a593Smuzhiyun 
GestureStretch(void)2787*4882a593Smuzhiyun static int GestureStretch(void)
2788*4882a593Smuzhiyun {
2789*4882a593Smuzhiyun 	unsigned int x_max=0,x_min=0xffff,y_max=0,y_min=0xffff;
2790*4882a593Smuzhiyun 	int i;
2791*4882a593Smuzhiyun // 	if(gesture_num <= GESTURE_SIZE_NUM/2)
2792*4882a593Smuzhiyun // 		return FALSE;
2793*4882a593Smuzhiyun 	if(gesture_num >= GESTURE_BUF_SIZE)
2794*4882a593Smuzhiyun 		return FALSE;
2795*4882a593Smuzhiyun 	for(i=0;i<gesture_num;i++)
2796*4882a593Smuzhiyun 	{
2797*4882a593Smuzhiyun 		if(gesture_buf[i].other.x > x_max)
2798*4882a593Smuzhiyun 			x_max = gesture_buf[i].other.x;
2799*4882a593Smuzhiyun 		if (gesture_buf[i].other.x < x_min)
2800*4882a593Smuzhiyun 			x_min = gesture_buf[i].other.x;
2801*4882a593Smuzhiyun 		if (gesture_buf[i].other.y > y_max)
2802*4882a593Smuzhiyun 			y_max = gesture_buf[i].other.y;
2803*4882a593Smuzhiyun 		if (gesture_buf[i].other.y < y_min)
2804*4882a593Smuzhiyun 			y_min = gesture_buf[i].other.y;
2805*4882a593Smuzhiyun 	}
2806*4882a593Smuzhiyun 	if(x_max < x_min+64*2 || y_max < y_min+64*3)
2807*4882a593Smuzhiyun 		return FALSE;
2808*4882a593Smuzhiyun 	for(i=0;i<gesture_num;i++)
2809*4882a593Smuzhiyun 	{
2810*4882a593Smuzhiyun 		gesture_buf[i].other.x = (gesture_buf[i].other.x - x_min) *
2811*4882a593Smuzhiyun 			GESTURE_SIZE_REFE / (x_max - x_min);
2812*4882a593Smuzhiyun 		gesture_buf[i].other.y = (gesture_buf[i].other.y - y_min) *
2813*4882a593Smuzhiyun 			GESTURE_SIZE_REFE / (y_max - y_min);
2814*4882a593Smuzhiyun 	}
2815*4882a593Smuzhiyun 	return TRUE;
2816*4882a593Smuzhiyun }
2817*4882a593Smuzhiyun 
GestureLength(void)2818*4882a593Smuzhiyun static int GestureLength(void)
2819*4882a593Smuzhiyun {
2820*4882a593Smuzhiyun 	int i;
2821*4882a593Smuzhiyun 	int len = 0;
2822*4882a593Smuzhiyun 	for(i=1;i<gesture_num;i++)
2823*4882a593Smuzhiyun 	{
2824*4882a593Smuzhiyun 		len += GestureDistance(&gesture_buf[i],&gesture_buf[i-1],TRUE);
2825*4882a593Smuzhiyun 	}
2826*4882a593Smuzhiyun 	return len;
2827*4882a593Smuzhiyun }
2828*4882a593Smuzhiyun 
GestureStandard(void)2829*4882a593Smuzhiyun static void GestureStandard(void)
2830*4882a593Smuzhiyun {
2831*4882a593Smuzhiyun 	int i,n,t;
2832*4882a593Smuzhiyun 	int len_now = 0;
2833*4882a593Smuzhiyun 	int len_his = 0;
2834*4882a593Smuzhiyun 	int len_total = GestureLength();
2835*4882a593Smuzhiyun 	gesture_standard[0].all = gesture_buf[0].all&0x0fffffff;
2836*4882a593Smuzhiyun 	gesture_standard[GESTURE_SIZE_NUM - 1].all =
2837*4882a593Smuzhiyun 		gesture_buf[gesture_num -1].all&0x0fffffff;
2838*4882a593Smuzhiyun 	for(i=1,n=0;i<GESTURE_SIZE_NUM-1;i++)
2839*4882a593Smuzhiyun 	{
2840*4882a593Smuzhiyun 		while(++n<gesture_num)
2841*4882a593Smuzhiyun 		{
2842*4882a593Smuzhiyun 			len_now = GestureDistance(&gesture_buf[n],&gesture_buf[n-1],TRUE);
2843*4882a593Smuzhiyun 			len_his += len_now;
2844*4882a593Smuzhiyun 			if(len_his*(GESTURE_SIZE_NUM-1) >= len_total*i)
2845*4882a593Smuzhiyun 				break;
2846*4882a593Smuzhiyun 		}
2847*4882a593Smuzhiyun 		if(n >= gesture_num || len_now == 0)
2848*4882a593Smuzhiyun 			break;
2849*4882a593Smuzhiyun 		gesture_standard[i].all = 0;
2850*4882a593Smuzhiyun 		t = (int)gesture_buf[n - 1].other.x
2851*4882a593Smuzhiyun 			+ ((int)gesture_buf[n].other.x - (int)gesture_buf[n - 1].other.x)
2852*4882a593Smuzhiyun 			* ((int)len_total*i/(GESTURE_SIZE_NUM-1) - (int)len_his + (int)len_now)
2853*4882a593Smuzhiyun 			/ (int)len_now
2854*4882a593Smuzhiyun 			;
2855*4882a593Smuzhiyun 		if(t < 0)
2856*4882a593Smuzhiyun 			t = 0;
2857*4882a593Smuzhiyun 		gesture_standard[i].other.x = t;
2858*4882a593Smuzhiyun 		t = (int)gesture_buf[n - 1].other.y
2859*4882a593Smuzhiyun 			+ ((int)gesture_buf[n].other.y - (int)gesture_buf[n - 1].other.y)
2860*4882a593Smuzhiyun 			* ((int)len_total*i/(GESTURE_SIZE_NUM-1) - (int)len_his + (int)len_now)
2861*4882a593Smuzhiyun 			/ (int)len_now
2862*4882a593Smuzhiyun 			;
2863*4882a593Smuzhiyun 		if(t < 0)
2864*4882a593Smuzhiyun 			t = 0;
2865*4882a593Smuzhiyun 		gesture_standard[i].other.y = t;
2866*4882a593Smuzhiyun 		n--;
2867*4882a593Smuzhiyun 		len_his -= len_now;
2868*4882a593Smuzhiyun 	}
2869*4882a593Smuzhiyun }
2870*4882a593Smuzhiyun 
GestureModel(const GESTURE_MODEL_TYPE * model,int len,int threshold,int * out)2871*4882a593Smuzhiyun static int GestureModel(const GESTURE_MODEL_TYPE * model,int len,int threshold,int *out)
2872*4882a593Smuzhiyun {
2873*4882a593Smuzhiyun 	int offset[] = {-2,-1,0,1,2};
2874*4882a593Smuzhiyun 	int ret_offset;
2875*4882a593Smuzhiyun 	int i,j,k,n;
2876*4882a593Smuzhiyun 	int min,min_n;
2877*4882a593Smuzhiyun 	GESTURE_POINT_TYPE model_coor;
2878*4882a593Smuzhiyun 	if(model == NULL || threshold <= 0)
2879*4882a593Smuzhiyun 	{
2880*4882a593Smuzhiyun 		*out = 0x7fffffff;
2881*4882a593Smuzhiyun 		return 0x7fffffff;
2882*4882a593Smuzhiyun 	}
2883*4882a593Smuzhiyun 	min=0x7fffffff;
2884*4882a593Smuzhiyun 	min_n = 0;
2885*4882a593Smuzhiyun 	for(j=0;j<len;j++)
2886*4882a593Smuzhiyun 	{
2887*4882a593Smuzhiyun 		for(k=0;k<sizeof(offset)/sizeof(offset[0]);k++)
2888*4882a593Smuzhiyun 		{
2889*4882a593Smuzhiyun 			n = 0;
2890*4882a593Smuzhiyun 			ret_offset = 0;
2891*4882a593Smuzhiyun 			for(i=0;i<GESTURE_SIZE_NUM;i++)
2892*4882a593Smuzhiyun 			{
2893*4882a593Smuzhiyun 				if(i+offset[k] < 0 || i+offset[k] >= GESTURE_SIZE_NUM)
2894*4882a593Smuzhiyun 					continue;
2895*4882a593Smuzhiyun 				if((i&1)==0)
2896*4882a593Smuzhiyun 					model_coor.all = model[j].coor[i/2] & 0x00ff00ff;
2897*4882a593Smuzhiyun 				else
2898*4882a593Smuzhiyun 					model_coor.all = (model[j].coor[i/2]>>8) & 0x00ff00ff;
2899*4882a593Smuzhiyun 				ret_offset += GestureDistance(&gesture_standard[i+offset[k]],&model_coor,FALSE);
2900*4882a593Smuzhiyun 				n ++;
2901*4882a593Smuzhiyun 			}
2902*4882a593Smuzhiyun 			if(n == 0)
2903*4882a593Smuzhiyun 				continue;
2904*4882a593Smuzhiyun 			ret_offset = ret_offset / n * model[j].coe / 0x10;//coe <0x3fff
2905*4882a593Smuzhiyun 			if(ret_offset < min)
2906*4882a593Smuzhiyun 			{
2907*4882a593Smuzhiyun 				min_n = j;
2908*4882a593Smuzhiyun 				min = ret_offset;
2909*4882a593Smuzhiyun 			}
2910*4882a593Smuzhiyun 		}
2911*4882a593Smuzhiyun 	}
2912*4882a593Smuzhiyun 	if(min < threshold)
2913*4882a593Smuzhiyun 		*out = model[min_n].out;
2914*4882a593Smuzhiyun 	else
2915*4882a593Smuzhiyun 		*out = 0x7fffffff;
2916*4882a593Smuzhiyun 	return min;
2917*4882a593Smuzhiyun }
2918*4882a593Smuzhiyun 
ChangeXY(void)2919*4882a593Smuzhiyun static void ChangeXY(void)
2920*4882a593Smuzhiyun {
2921*4882a593Smuzhiyun 	int i;
2922*4882a593Smuzhiyun 	for(i=0;i<gesture_num && i<GESTURE_BUF_SIZE;i++)
2923*4882a593Smuzhiyun 		gesture_buf[i].all = ((gesture_buf[i].all & 0xfff) << 16) +
2924*4882a593Smuzhiyun 		((gesture_buf[i].all>>16) & 0xffff);
2925*4882a593Smuzhiyun }
2926*4882a593Smuzhiyun 
GestureSet(unsigned int conf[])2927*4882a593Smuzhiyun static void GestureSet(unsigned int conf[])
2928*4882a593Smuzhiyun {
2929*4882a593Smuzhiyun 	if(conf == NULL)
2930*4882a593Smuzhiyun 		return;
2931*4882a593Smuzhiyun 	//if(conf[0] >= 0 && conf[0] <= 64)
2932*4882a593Smuzhiyun 	if (conf[0] <= 64)
2933*4882a593Smuzhiyun 		gesture_dis_min = conf[0];
2934*4882a593Smuzhiyun 	else
2935*4882a593Smuzhiyun 		gesture_dis_min = 0;
2936*4882a593Smuzhiyun 	if(conf[1] != 0)
2937*4882a593Smuzhiyun 		gesture_threshold[0] = conf[1];
2938*4882a593Smuzhiyun 	else
2939*4882a593Smuzhiyun 		gesture_threshold[0] = 0xfff;
2940*4882a593Smuzhiyun 	gesture_threshold[1] = conf[2];
2941*4882a593Smuzhiyun 	x_scale = (conf[3]==0) ? 4 : conf[3];
2942*4882a593Smuzhiyun 	y_scale = (conf[4]==0) ? 4 : conf[4];
2943*4882a593Smuzhiyun 	if(conf[5] == 0)
2944*4882a593Smuzhiyun 	{
2945*4882a593Smuzhiyun 		double_down = 2;
2946*4882a593Smuzhiyun 		double_up = 30;
2947*4882a593Smuzhiyun 	}
2948*4882a593Smuzhiyun 	else
2949*4882a593Smuzhiyun 	{
2950*4882a593Smuzhiyun 		double_down = conf[5] & 0xffff;
2951*4882a593Smuzhiyun 		double_up = conf[5] >> 16;
2952*4882a593Smuzhiyun 	}
2953*4882a593Smuzhiyun }
2954*4882a593Smuzhiyun 
GestureDeal(void)2955*4882a593Smuzhiyun static int GestureDeal(void)
2956*4882a593Smuzhiyun {
2957*4882a593Smuzhiyun 	int i;
2958*4882a593Smuzhiyun 	int gesture_out[2];
2959*4882a593Smuzhiyun 	int gesture_val[2];
2960*4882a593Smuzhiyun 
2961*4882a593Smuzhiyun 	//while(1)
2962*4882a593Smuzhiyun 	for (;;)
2963*4882a593Smuzhiyun 	{
2964*4882a593Smuzhiyun 		gesture_last = double_click;
2965*4882a593Smuzhiyun 		if(gesture_last)
2966*4882a593Smuzhiyun 			break;
2967*4882a593Smuzhiyun 		if(gesture_deal & GESTURE_XY)
2968*4882a593Smuzhiyun 		{
2969*4882a593Smuzhiyun 			gesture_deal &= ~GESTURE_XY;
2970*4882a593Smuzhiyun 			ChangeXY();
2971*4882a593Smuzhiyun 		}
2972*4882a593Smuzhiyun 		if((gesture_deal & GESTURE_DEAL) == 0)
2973*4882a593Smuzhiyun 			return FALSE;
2974*4882a593Smuzhiyun 		gesture_deal &= ~GESTURE_DEAL;
2975*4882a593Smuzhiyun 		gesture_last = GestureLRUD();
2976*4882a593Smuzhiyun 		if(gesture_last)
2977*4882a593Smuzhiyun 			break;
2978*4882a593Smuzhiyun 		if(GestureStretch() == FALSE)
2979*4882a593Smuzhiyun 			break;
2980*4882a593Smuzhiyun 		GestureStandard();
2981*4882a593Smuzhiyun 		gesture_val[0] =  GestureModel(model_default,
2982*4882a593Smuzhiyun 			sizeof(model_default)/sizeof(model_default[0]),
2983*4882a593Smuzhiyun 			gesture_threshold[0],&gesture_out[0]);
2984*4882a593Smuzhiyun 		gesture_val[1] =  GestureModel(model_extern,
2985*4882a593Smuzhiyun 			model_extern_len,gesture_threshold[1],&gesture_out[1]);
2986*4882a593Smuzhiyun 		gesture_last = 0x7fffffff;
2987*4882a593Smuzhiyun 		for(i=0;i<2;i++)
2988*4882a593Smuzhiyun 		{
2989*4882a593Smuzhiyun 			if(gesture_val[i] <= gesture_last)
2990*4882a593Smuzhiyun 			{
2991*4882a593Smuzhiyun //				gesture_value = gesture_val[i];
2992*4882a593Smuzhiyun 				gesture_last  = gesture_out[i];
2993*4882a593Smuzhiyun 			}
2994*4882a593Smuzhiyun 		}
2995*4882a593Smuzhiyun 		break;
2996*4882a593Smuzhiyun 	}
2997*4882a593Smuzhiyun 	GestureInit();
2998*4882a593Smuzhiyun 	return gesture_last;
2999*4882a593Smuzhiyun }
3000*4882a593Smuzhiyun 
gsl_GestureExtern(const GESTURE_MODEL_TYPE * model,int len)3001*4882a593Smuzhiyun void gsl_GestureExtern(const GESTURE_MODEL_TYPE *model,int len)
3002*4882a593Smuzhiyun {
3003*4882a593Smuzhiyun 	model_extern = model;
3004*4882a593Smuzhiyun 	model_extern_len = len;
3005*4882a593Smuzhiyun }
3006*4882a593Smuzhiyun //EXPORT_SYMBOL(gsl_GestureExtern);
3007*4882a593Smuzhiyun 
GestureLRUD(void)3008*4882a593Smuzhiyun static int GestureLRUD(void)
3009*4882a593Smuzhiyun {
3010*4882a593Smuzhiyun 	int x1=0,y1=0,x2=0,y2=0,i=0;
3011*4882a593Smuzhiyun 	int flag3=0;
3012*4882a593Smuzhiyun 	int middle_x;
3013*4882a593Smuzhiyun 	int middle_y;
3014*4882a593Smuzhiyun 	int min_scale=5;
3015*4882a593Smuzhiyun //	printk("flag3,gesture_deal=%x\n",gesture_deal);
3016*4882a593Smuzhiyun 	if(gesture_deal & GESTURE_XY)
3017*4882a593Smuzhiyun 	{
3018*4882a593Smuzhiyun 		gesture_deal &= ~GESTURE_XY;
3019*4882a593Smuzhiyun 		ChangeXY();
3020*4882a593Smuzhiyun //		printk("flag3,ChangeXY_GestureLRUD,gesture_deal=%x\n",gesture_deal);
3021*4882a593Smuzhiyun 	}
3022*4882a593Smuzhiyun 	if((gesture_deal & GESTURE_LRUD) == 0)
3023*4882a593Smuzhiyun 		return FALSE;
3024*4882a593Smuzhiyun 	gesture_deal &= ~GESTURE_LRUD;
3025*4882a593Smuzhiyun //	int screen_x_max=0,screen_y_max=0;
3026*4882a593Smuzhiyun 	x1 = gesture_buf[0].other.x;//480
3027*4882a593Smuzhiyun 	y1 = gesture_buf[0].other.y;//800
3028*4882a593Smuzhiyun 	x2 = gesture_buf[gesture_num - 1].other.x;
3029*4882a593Smuzhiyun 	y2 = gesture_buf[gesture_num - 1].other.y;
3030*4882a593Smuzhiyun // 	if(!x1&&!y1&&!x2&&!y2)
3031*4882a593Smuzhiyun // 		return '6';
3032*4882a593Smuzhiyun 	middle_x =( x1 + x2)/2;
3033*4882a593Smuzhiyun 	middle_y = (y1 + y2)/2;
3034*4882a593Smuzhiyun 	for(i=1;i<gesture_num;i++)
3035*4882a593Smuzhiyun 	{
3036*4882a593Smuzhiyun 		if (abs(gesture_buf[i].other.x - middle_x)<(int)sen_num_nokey * 64 / x_scale)//screen_y_max/8)//30
3037*4882a593Smuzhiyun 			flag3|=0x1;
3038*4882a593Smuzhiyun 		else
3039*4882a593Smuzhiyun 			flag3|=0x2;
3040*4882a593Smuzhiyun 		if (abs(gesture_buf[i].other.y - middle_y)<(int)drv_num_nokey * 64 / y_scale)//screen_x_max/8)//25
3041*4882a593Smuzhiyun 			flag3|=(0x1<<4);
3042*4882a593Smuzhiyun 		else
3043*4882a593Smuzhiyun 			flag3|=(0x2<<4);
3044*4882a593Smuzhiyun 		if ((int)gesture_buf[i].other.x - (int)gesture_buf[i - 1].other.x>min_scale)
3045*4882a593Smuzhiyun 			flag3|=(0x1<<8);
3046*4882a593Smuzhiyun 		else if ((int)gesture_buf[i].other.x - (int)gesture_buf[i - 1].other.x<-min_scale)
3047*4882a593Smuzhiyun 			flag3|=(0x2<<8);
3048*4882a593Smuzhiyun 		if ((int)gesture_buf[i].other.y - (int)gesture_buf[i - 1].other.y>min_scale)
3049*4882a593Smuzhiyun 			flag3|=(0x1<<12);
3050*4882a593Smuzhiyun 		else if ((int)gesture_buf[i].other.y - (int)gesture_buf[i - 1].other.y<-min_scale)
3051*4882a593Smuzhiyun 			flag3|=(0x2<<12);
3052*4882a593Smuzhiyun 	}
3053*4882a593Smuzhiyun //	printk("flag3_____flag3=%x,x_scale=%d,y_scale=%d\n",flag3,x_scale,y_scale);
3054*4882a593Smuzhiyun //	if(flag3&&!point_num)
3055*4882a593Smuzhiyun // 	{
3056*4882a593Smuzhiyun // 		printk("flag3,x1=%d,y1=%d,x2=%d,y2=%d,screen_x_max=%d,screen_y_max=%d\n",x1,y1,x2,y2,screen_x_max,screen_y_max);
3057*4882a593Smuzhiyun // 		printk("flag3====== %x,x1-x2=%d,x2-x1=%d,y1-y2=%d,y2-y1=%d\n",flag3,x1-x2,x2-x1,y1-y2,y2-y1);
3058*4882a593Smuzhiyun // 	}
3059*4882a593Smuzhiyun //	if(!point_num)
3060*4882a593Smuzhiyun //	if(1)
3061*4882a593Smuzhiyun 	{
3062*4882a593Smuzhiyun 		if((flag3==0x2031||flag3==0x2131||flag3==0x2231||flag3==0x2331))//&&(y2-y1>screen_x_max/3))
3063*4882a593Smuzhiyun 			return 0xa1fc;//up(a1,fc)
3064*4882a593Smuzhiyun 		else if((flag3==0x1031||flag3==0x1131||flag3==0x1231||flag3==0x1331))//&&(y1-y2>screen_x_max/3))
3065*4882a593Smuzhiyun 			return 0xa1fd;//down
3066*4882a593Smuzhiyun 		else if((flag3==0x213||flag3==0x1213||flag3==0x2213||flag3==0x2213))//&&(x2-x1>screen_y_max/3))
3067*4882a593Smuzhiyun 			return 0xa1fb;//left
3068*4882a593Smuzhiyun 		else if((flag3==0x113||flag3==0x1113||flag3==0x2113||flag3==0x3113))//&&(x1-x2>screen_y_max/3))
3069*4882a593Smuzhiyun 			return 0xa1fa;//right
3070*4882a593Smuzhiyun //		if(abs(x2-x1)<64*4&&abs(y2-y1)<64*6)
3071*4882a593Smuzhiyun //			return (int)'5';
3072*4882a593Smuzhiyun 	}
3073*4882a593Smuzhiyun 	return FALSE;
3074*4882a593Smuzhiyun }
3075*4882a593Smuzhiyun 
gsl_GestureBuffer(unsigned int ** buf)3076*4882a593Smuzhiyun unsigned int gsl_GestureBuffer(unsigned int **buf)
3077*4882a593Smuzhiyun {
3078*4882a593Smuzhiyun 	int i;
3079*4882a593Smuzhiyun 	if(gesture_num_last >= GESTURE_BUF_SIZE)
3080*4882a593Smuzhiyun 		gesture_num_last = GESTURE_BUF_SIZE - 1;
3081*4882a593Smuzhiyun 	for(i=0;i<gesture_num_last;i++)
3082*4882a593Smuzhiyun 	{
3083*4882a593Smuzhiyun 		gesture_buf[i].all = ScreenResolution((gsl_POINT_TYPE*)(&gesture_buf[i].all));
3084*4882a593Smuzhiyun 	}
3085*4882a593Smuzhiyun 	*buf = &(gesture_buf[0].all);
3086*4882a593Smuzhiyun 	return gesture_num_last;
3087*4882a593Smuzhiyun }
3088*4882a593Smuzhiyun //EXPORT_SYMBOL(gsl_GestureBuffer);
3089*4882a593Smuzhiyun #endif
3090*4882a593Smuzhiyun /*
3091*4882a593Smuzhiyun // The DLL must have an entry point, but it is never called.
3092*4882a593Smuzhiyun //
3093*4882a593Smuzhiyun NTSTATUS
3094*4882a593Smuzhiyun DriverEntry(
3095*4882a593Smuzhiyun   IN PDRIVER_OBJECT DriverObject,
3096*4882a593Smuzhiyun   IN PUNICODE_STRING RegistryPath
3097*4882a593Smuzhiyun )
3098*4882a593Smuzhiyun {
3099*4882a593Smuzhiyun     return STATUS_SUCCESS;
3100*4882a593Smuzhiyun }*/
3101