summaryrefslogtreecommitdiff
path: root/fts_lib/ftsTest.h
blob: a50bb3c5409ac546c34fd38a7666aed4fd08e390 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
/*
  *
  **************************************************************************
  **                        STMicroelectronics				**
  **************************************************************************
  **                        marco.cali@st.com				**
  **************************************************************************
  *                                                                        *
  *			FTS API for MP test				 **
  *                                                                        *
  **************************************************************************
  **************************************************************************
  *
  */

/*!
  * \file ftsTest.h
  * \brief Contains all the definitions and structs related to the Mass
  *Production Test
  */

#ifndef FTS_TEST_H
#define FTS_TEST_H

#include "ftsSoftware.h"
#include "ftsFrame.h"

#ifndef LIMITS_H_FILE
/* /< Name of the Production Test Limit File */
#define LIMITS_FILE			"stm_fts_production_limits.csv"
#else
#define LIMITS_FILE			"NULL"
#endif

#define WAIT_FOR_FRESH_FRAMES		200	/* /< Time in ms to wait after
						 * start to sensing before
						 * reading a frame */
#define WAIT_AFTER_SENSEOFF		50	/* /< Time in ms to wait after
						 * stop sensing and before
						 * reading a frame from
						 * memory */

#define NO_INIT				0	/* /< No Initialization required
						 *  during the MP */

#define RETRY_INIT_BOOT			3	/* /< number of retry of the
						 * init process at boot */

#define SENS_TEST_NUM_FRAMES		100 /* /< number of frames to read */
#define SENS_TEST_PERC_TARGET_PRECAL	20	/* /< +-% of target value within
						 * all the node of the frames
						 * should be contained */
#define SENS_TEST_PERC_TARGET_POSTCAL	4	/* /< +-% of target value within
						 * should be contained the
						 * avarege of the nodes and the
						 * deltas for each node */

/** @defgroup mp_test Mass Production Test
  * Mass production test API.
  * Mass Production Test (MP) should be executed at least one time in the life
  * of every device \n
  * It used to verify that tit is not present any hardware damage and
  * initialize some value of the chip in order to guarantee the working
  * performance \n
  * The MP test is made up by 3 steps:
  * - ITO test = production_test_ito() \n
  * - Initialization = production_test_initialization() \n
  * - Data Test = production_test_data(),
  * it is possible to select which items test thanks to the TestToDo struct\n
  * To execute the Data Test it is mandatory load some thresholds that
  * are stored in the Limit File.
  * @{
  */

/** @defgroup limit_file Limit File
  * @ingroup mp_test
  * Production Test Limit File is a csv which contains thresholds of the data to
  * test.
  * This file can be loaded from the file system or stored as a header file
  * according to the LIMITS_H_FILE define \n
  * For each selectable test item there can be one or more associated labels
  * which store the corresponding thresholds \n
  * @{
  */
/* LABELS PRODUCTION TEST LIMITS FILE */
/** @defgroup test_labels Test Items Labels
  * @ingroup limit_file
  * Labels present in the Limit File and associated to the test items of
  * TestToDo
  * @{
  */
#define MS_RAW_MIN_MAX			"MS_RAW_DATA_MIN_MAX"
#define MS_RAW_EACH_NODE_MIN		"MS_RAW_DATA_EACH_MIN"
#define MS_RAW_EACH_NODE_MAX		"MS_RAW_DATA_EACH_MAX"
#define MS_RAW_GAP			"MS_RAW_DATA_GAP"
#define MS_RAW_ADJH			"MS_RAW_DATA_ADJ_HORIZONTAL"
#define MS_RAW_ADJV			"MS_RAW_DATA_ADJ_VERTICAL"
#define MS_RAW_ITO_ADJH			"MS_RAW_ITO_DATA_ADJ_HORIZONTAL"
#define MS_RAW_ITO_ADJV			"MS_RAW_ITO_DATA_ADJ_VERTICAL"
#define MS_RAW_LP_MIN_MAX		"MS_RAW_LOWPOWER_DATA_MIN_MAX"
#define MS_RAW_LP_EACH_NODE_MIN		"MS_RAW_LOWPOWER_DATA_EACH_MIN"
#define MS_RAW_LP_EACH_NODE_MAX		"MS_RAW_LOWPOWER_DATA_EACH_MAX"
#define MS_RAW_LP_GAP			"MS_RAW_LOWPOWER_DATA_GAP"
#define MS_RAW_LP_ADJH			"MS_RAW_LOWPOWER_DATA_ADJ_HORIZONTAL"
#define MS_RAW_LP_ADJV			"MS_RAW_LOWPOWER_DATA_ADJ_VERTICAL"
#define MS_RAW_ADJH_GAP			"MS_RAW_DATA_ADJ_HORIZONTAL_P2P"
#define MS_RAW_ADJV_GAP			"MS_RAW_DATA_ADJ_VERTICAL_P2P"
#define MS_RAW_ADJ_PEAK			"MS_RAW_DATA_ADJ_PEAK"
#define MS_CX1_MIN_MAX			"MS_TOUCH_ACTIVE_CX1_MIN_MAX"
#define MS_CX2_MAP_MIN			"MS_TOUCH_ACTIVE_CX2_MIN"
#define MS_CX2_MAP_MAX			"MS_TOUCH_ACTIVE_CX2_MAX"
#define MS_CX2_ADJH_MAP_MAX		"MS_TOUCH_ACTIVE_CX2_ADJ_HORIZONTAL"
#define MS_CX2_ADJV_MAP_MAX		"MS_TOUCH_ACTIVE_CX2_ADJ_VERTICAL"
#define MS_TOTAL_CX_MAP_MIN		"MS_TOUCH_ACTIVE_TOTAL_CX_MIN"
#define MS_TOTAL_CX_MAP_MAX		"MS_TOUCH_ACTIVE_TOTAL_CX_MAX"
#define MS_TOTAL_CX_ADJH_MAP_MAX	"MS_TOUCH_ACTIVE_TOTAL_CX_ADJ_HORIZONTAL"
#define MS_TOTAL_CX_ADJV_MAP_MAX	"MS_TOUCH_ACTIVE_TOTAL_CX_ADJ_VERTICAL"
#define MS_CX1_LP_MIN_MAX		"MS_TOUCH_LOWPOWER_CX1_MIN_MAX"
#define MS_CX2_LP_MAP_MIN		"MS_TOUCH_LOWPOWER_CX2_MIN"
#define MS_CX2_LP_MAP_MAX		"MS_TOUCH_LOWPOWER_CX2_MAX"
#define MS_CX2_ADJH_LP_MAP_MAX		"MS_TOUCH_LOWPOWER_CX2_ADJ_HORIZONTAL"
#define MS_CX2_ADJV_LP_MAP_MAX		"MS_TOUCH_LOWPOWER_CX2_ADJ_VERTICAL"
#define MS_TOTAL_CX_LP_MAP_MIN		"MS_TOUCH_LOWPOWER_TOTAL_CX_MIN"
#define MS_TOTAL_CX_LP_MAP_MAX		"MS_TOUCH_LOWPOWER_TOTAL_CX_MAX"
#define MS_TOTAL_CX_ADJH_LP_MAP_MAX "MS_TOUCH_LOWPOWER_TOTAL_CX_ADJ_HORIZONTAL"
#define MS_TOTAL_CX_ADJV_LP_MAP_MAX "MS_TOUCH_LOWPOWER_TOTAL_CX_ADJ_VERTICAL"
#define SS_RAW_FORCE_MIN_MAX		"SS_RAW_DATA_FORCE_MIN_MAX"
#define SS_RAW_FORCE_EACH_NODE_MIN	"SS_RAW_DATA_FORCE_EACH_MIN"
#define SS_RAW_FORCE_EACH_NODE_MAX	"SS_RAW_DATA_FORCE_EACH_MAX"
#define SS_RAW_SENSE_MIN_MAX		"SS_RAW_DATA_SENSE_MIN_MAX"
#define SS_RAW_SENSE_EACH_NODE_MIN	"SS_RAW_DATA_SENSE_EACH_MIN"
#define SS_RAW_SENSE_EACH_NODE_MAX	"SS_RAW_DATA_SENSE_EACH_MAX"
#define SS_RAW_FORCE_GAP		"SS_RAW_DATA_FORCE_GAP"
#define SS_RAW_SENSE_GAP		"SS_RAW_DATA_SENSE_GAP"
#define SS_RAW_LP_FORCE_MIN_MAX		"SS_RAW_LOWPOWER_DATA_FORCE_MIN_MAX"
#define SS_RAW_LP_SENSE_MIN_MAX		"SS_RAW_LOWPOWER_DATA_SENSE_MIN_MAX"
#define SS_RAW_LP_FORCE_EACH_NODE_MIN	"SS_RAW_LOWPOWER_DATA_FORCE_EACH_MIN"
#define SS_RAW_LP_FORCE_EACH_NODE_MAX	"SS_RAW_LOWPOWER_DATA_FORCE_EACH_MAX"
#define SS_RAW_LP_SENSE_MIN_MAX		"SS_RAW_LOWPOWER_DATA_SENSE_MIN_MAX"
#define SS_RAW_LP_SENSE_EACH_NODE_MIN	"SS_RAW_LOWPOWER_DATA_SENSE_EACH_MIN"
#define SS_RAW_LP_SENSE_EACH_NODE_MAX	"SS_RAW_LOWPOWER_DATA_SENSE_EACH_MAX"
#define SS_RAW_LP_FORCE_GAP		"SS_RAW_LOWPOWER_DATA_FORCE_GAP"
#define SS_RAW_LP_SENSE_GAP		"SS_RAW_LOWPOWER_DATA_SENSE_GAP"
#define SS_IX1_FORCE_MIN_MAX		"SS_TOUCH_ACTIVE_IX1_FORCE_MIN_MAX"
#define SS_IX1_SENSE_MIN_MAX		"SS_TOUCH_ACTIVE_IX1_SENSE_MIN_MAX"
#define SS_CX1_FORCE_MIN_MAX		"SS_TOUCH_ACTIVE_CX1_FORCE_MIN_MAX"
#define SS_CX1_SENSE_MIN_MAX		"SS_TOUCH_ACTIVE_CX1_SENSE_MIN_MAX"
#define SS_IX2_FORCE_MAP_MIN		"SS_TOUCH_ACTIVE_IX2_FORCE_MIN"
#define SS_IX2_FORCE_MAP_MAX		"SS_TOUCH_ACTIVE_IX2_FORCE_MAX"
#define SS_IX2_SENSE_MAP_MIN		"SS_TOUCH_ACTIVE_IX2_SENSE_MIN"
#define SS_IX2_SENSE_MAP_MAX		"SS_TOUCH_ACTIVE_IX2_SENSE_MAX"
#define SS_IX2_FORCE_ADJV_MAP_MAX	"SS_TOUCH_ACTIVE_IX2_ADJ_VERTICAL"
#define SS_IX2_SENSE_ADJH_MAP_MAX	"SS_TOUCH_ACTIVE_IX2_ADJ_HORIZONTAL"
#define SS_CX2_FORCE_MAP_MIN		"SS_TOUCH_ACTIVE_CX2_FORCE_MIN"
#define SS_CX2_FORCE_MAP_MAX		"SS_TOUCH_ACTIVE_CX2_FORCE_MAX"
#define SS_CX2_SENSE_MAP_MIN		"SS_TOUCH_ACTIVE_CX2_SENSE_MIN"
#define SS_CX2_SENSE_MAP_MAX		"SS_TOUCH_ACTIVE_CX2_SENSE_MAX"
#define SS_CX2_FORCE_ADJV_MAP_MAX	"SS_TOUCH_ACTIVE_CX2_ADJ_VERTICAL"
#define SS_CX2_SENSE_ADJH_MAP_MAX	"SS_TOUCH_ACTIVE_CX2_ADJ_HORIZONTAL"

/* TOTAL SS */
#define SS_TOTAL_IX_FORCE_MAP_MIN	"SS_TOUCH_ACTIVE_TOTAL_IX_FORCE_MIN"
#define SS_TOTAL_IX_FORCE_MAP_MAX	"SS_TOUCH_ACTIVE_TOTAL_IX_FORCE_MAX"
#define SS_TOTAL_IX_SENSE_MAP_MIN	"SS_TOUCH_ACTIVE_TOTAL_IX_SENSE_MIN"
#define SS_TOTAL_IX_SENSE_MAP_MAX	"SS_TOUCH_ACTIVE_TOTAL_IX_SENSE_MAX"
#define SS_TOTAL_IX_FORCE_ADJV_MAP_MAX	"SS_TOUCH_ACTIVE_TOTAL_IX_ADJ_VERTICAL"
#define SS_TOTAL_IX_SENSE_ADJH_MAP_MAX \
	"SS_TOUCH_ACTIVE_TOTAL_IX_ADJ_HORIZONTAL"
#define SS_TOTAL_CX_FORCE_MAP_MIN	"SS_TOUCH_ACTIVE_TOTAL_CX_FORCE_MIN"
#define SS_TOTAL_CX_FORCE_MAP_MAX	"SS_TOUCH_ACTIVE_TOTAL_CX_FORCE_MAX"
#define SS_TOTAL_CX_SENSE_MAP_MIN	"SS_TOUCH_ACTIVE_TOTAL_CX_SENSE_MIN"
#define SS_TOTAL_CX_SENSE_MAP_MAX	"SS_TOUCH_ACTIVE_TOTAL_CX_SENSE_MAX"
#define SS_TOTAL_CX_FORCE_ADJV_MAP_MAX	"SS_TOUCH_ACTIVE_TOTAL_CX_ADJ_VERTICAL"
#define SS_TOTAL_CX_SENSE_ADJH_MAP_MAX \
	"SS_TOUCH_ACTIVE_TOTAL_CX_ADJ_HORIZONTAL"

/* Idle (LP)  version*/
#define SS_IX1_LP_FORCE_MIN_MAX		"SS_TOUCH_IDLE_IX1_FORCE_MIN_MAX"
#define SS_IX1_LP_SENSE_MIN_MAX		"SS_TOUCH_IDLE_IX1_SENSE_MIN_MAX"
#define SS_CX1_LP_FORCE_MIN_MAX		"SS_TOUCH_IDLE_CX1_FORCE_MIN_MAX"
#define SS_CX1_LP_SENSE_MIN_MAX		"SS_TOUCH_IDLE_CX1_SENSE_MIN_MAX"
#define SS_IX2_LP_FORCE_MAP_MIN		"SS_TOUCH_IDLE_IX2_FORCE_MIN"
#define SS_IX2_LP_FORCE_MAP_MAX		"SS_TOUCH_IDLE_IX2_FORCE_MAX"
#define SS_IX2_LP_SENSE_MAP_MIN		"SS_TOUCH_IDLE_IX2_SENSE_MIN"
#define SS_IX2_LP_SENSE_MAP_MAX		"SS_TOUCH_IDLE_IX2_SENSE_MAX"
#define SS_IX2_LP_FORCE_ADJV_MAP_MAX	"SS_TOUCH_IDLE_IX2_ADJ_VERTICAL"
#define SS_IX2_LP_SENSE_ADJH_MAP_MAX	"SS_TOUCH_IDLE_IX2_ADJ_HORIZONTAL"
#define SS_CX2_LP_FORCE_MAP_MIN		"SS_TOUCH_IDLE_CX2_FORCE_MIN"
#define SS_CX2_LP_FORCE_MAP_MAX		"SS_TOUCH_IDLE_CX2_FORCE_MAX"
#define SS_CX2_LP_SENSE_MAP_MIN		"SS_TOUCH_IDLE_CX2_SENSE_MIN"
#define SS_CX2_LP_SENSE_MAP_MAX		"SS_TOUCH_IDLE_CX2_SENSE_MAX"
#define SS_CX2_LP_FORCE_ADJV_MAP_MAX	"SS_TOUCH_IDLE_CX2_ADJ_VERTICAL"
#define SS_CX2_LP_SENSE_ADJH_MAP_MAX	"SS_TOUCH_IDLE_CX2_ADJ_HORIZONTAL"


/* TOTAL SS */
#define SS_TOTAL_IX_LP_FORCE_MAP_MIN	"SS_TOUCH_IDLE_TOTAL_IX_FORCE_MIN"
#define SS_TOTAL_IX_LP_FORCE_MAP_MAX	"SS_TOUCH_IDLE_TOTAL_IX_FORCE_MAX"
#define SS_TOTAL_IX_LP_SENSE_MAP_MIN	"SS_TOUCH_IDLE_TOTAL_IX_SENSE_MIN"
#define SS_TOTAL_IX_LP_SENSE_MAP_MAX	"SS_TOUCH_IDLE_TOTAL_IX_SENSE_MAX"
#define SS_TOTAL_IX_LP_FORCE_ADJV_MAP_MAX \
	"SS_TOUCH_IDLE_TOTAL_IX_ADJ_VERTICAL"
#define SS_TOTAL_IX_LP_SENSE_ADJH_MAP_MAX \
	"SS_TOUCH_IDLE_TOTAL_IX_ADJ_HORIZONTAL"
#define SS_TOTAL_CX_LP_FORCE_MAP_MIN	"SS_TOUCH_IDLE_TOTAL_CX_FORCE_MIN"
#define SS_TOTAL_CX_LP_FORCE_MAP_MAX	"SS_TOUCH_IDLE_TOTAL_CX_FORCE_MAX"
#define SS_TOTAL_CX_LP_SENSE_MAP_MIN	"SS_TOUCH_IDLE_TOTAL_CX_SENSE_MIN"
#define SS_TOTAL_CX_LP_SENSE_MAP_MAX	"SS_TOUCH_IDLE_TOTAL_CX_SENSE_MAX"
#define SS_TOTAL_CX_LP_FORCE_ADJV_MAP_MAX \
	"SS_TOUCH_IDLE_TOTAL_CX_ADJ_VERTICAL"
#define SS_TOTAL_CX_LP_SENSE_ADJH_MAP_MAX \
	"SS_TOUCH_IDLE_TOTAL_CX_ADJ_HORIZONTAL"

/* KEYS */
#define MS_KEY_RAW_MIN_MAX		"MS_KEY_RAW_DATA_MIN_MAX"
#define MS_KEY_CX1_MIN_MAX		"MS_KEY_CX1_MIN_MAX"
#define MS_KEY_CX2_MAP_MIN		"MS_KEY_CX2_MIN"
#define MS_KEY_CX2_MAP_MAX		"MS_KEY_CX2_MAX"
#define MS_KEY_TOTAL_CX_MAP_MIN		"MS_KEY_TOTAL_CX_MIN"
#define MS_KEY_TOTAL_CX_MAP_MAX		"MS_KEY_TOTAL_CX_MAX"

/* CONSTANT TOTAL IX */
#define SS_IX1_FORCE_W			"IX1_FORCE_W"
#define SS_IX2_FORCE_W			"IX2_FORCE_W"
#define SS_IX1_SENSE_W			"IX1_SENSE_W"
#define SS_IX2_SENSE_W			"IX2_SENSE_W"
/** @}*/


/**
  * Struct used to specify which test perform during the Mass Production Test.
  * For each test item selected in this structure, there should be one or
  * more labels associated in the Limit file from where load the thresholds
  */
typedef struct {
	int MutualRaw;	/* /< MS Raw min/Max test */
	int MutualRawMap;	/* /< MS Raw min/Max test for each node */
	int MutualRawGap;	/* /< MS Raw Gap(max-min) test */
	int MutualRawAdj;	/* /< MS Raw Adjacent test */
	int MutualRawAdjGap;	/* /< MS Raw Adjacent Gap (max-min) test */
	int MutualRawAdjPeak;	/* /< MS Raw Adjacent Peak
				 * max(max(adjv),max(adjh)) test
				 */
	int MutualRawLP;	/* /< MS Low Power Raw min/Max test */
	int MutualRawMapLP;	/* /< MS Low Power Raw min/Max test
				 * for each node
				 */
	int MutualRawGapLP;	/* /< MS Low Power Raw Gap(max-min) test */
	int MutualRawAdjLP;	/* /< MS Low Power Raw Adjacent test */
	int MutualRawAdjITO;	/* /< MS Raw Adjacent test during ITO test */

	int MutualCx1;	/* /< MS Cx1 min/Max test */
	int MutualCx2;	/* /< MS Cx2 min/Max (for each node) test */
	int MutualCx2Adj;	/* /< MS Vertical and Horizontal Adj Cx2 min/Max
				 *  (for each node) test */
	int MutualCxTotal;	/* /< MS Total Cx min/Max (for each node) test
				 * */
	int MutualCxTotalAdj;	/* /< MS Total vertical and Horizontal Adj Cx2
				 * min/Max (for each node) test
				 */

	int MutualCx1LP;	/* /< MS LowPower Cx1 min/Max test */
	int MutualCx2LP;	/* /< MS LowPower Cx2 min/Max (for each node)
				 * test
				 */
	int MutualCx2AdjLP;	/* /< MS LowPower Vertical and Horizontal Adj
				 * Cx2 min/Max
				 * (for each node) test
				 */
	int MutualCxTotalLP;	/* /< MS Total LowPower Cx min/Max
				 * (for each node) test */
	int MutualCxTotalAdjLP;	/* /< MS Total LowPower vertical and Horizontal
				 * Adj Cx2 min/Max (for each node) test
				 */

	int MutualKeyRaw;	/* /< MS Raw Key min/Max test */
	int MutualKeyCx1;	/* /< MS Cx1 Key min/Max test */
	int MutualKeyCx2;	/* /< MS Cx2 Key min/Max (for each node) test */
	int MutualKeyCxTotal;	/* /< MS Total Cx Key min/Max (for each node)
				 * test */

	int SelfForceRaw;	/* /< SS Force Raw min/Max test */
	int SelfForceRawGap;	/* /< SS Force Raw Gap(max-min) test */
	int SelfForceRawMap;	/* /< SS Force Raw min/Max Map test */
	int SelfForceRawLP;	/* /< SS Low Power Force Raw min/Max test */
	int SelfForceRawGapLP; /* /< SS Low Power Force Raw Gap(max-min) test */
	int SelfForceRawMapLP;	/* /< SS Low Power Force Raw min/Max Map test */

	int SelfForceIx1;	/* /< SS Force Ix1 min/Max test */
	int SelfForceIx2;	/* /< SS Force Ix2 min/Max (for each node) test
				 * */
	int SelfForceIx2Adj;	/* /< SS Vertical Adj Force Ix2 min/Max
				 * (for each node) test */
	int SelfForceIxTotal;	/* /< SS Total Force Ix min/Max (for each node)
				 * test */
	int SelfForceIxTotalAdj;	/* /< SS Total Vertical Adj Force Ix
					 * min/Max
					 * (for each node) test */
	int SelfForceCx1;	/* /< SS Force Cx1 min/Max test */
	int SelfForceCx2; /* /< SS Force Cx2 min/Max (for each node) test */
	int SelfForceCx2Adj;	/* /< SS Vertical Adj Force Cx2 min/Max (for
				 * each node) test */
	int SelfForceCxTotal;	/* /< SS Total Force Cx min/Max (for each node)
				 * test */
	int SelfForceCxTotalAdj;	/* /< SS Total Vertical Adj Force Cx
					 * min/Max (for each node) test
					 */

	int SelfForceIx1LP;	/* /< SS LP Force Ix1 min/Max test */
	int SelfForceIx2LP;	/* /< SS LP Force Ix2 min/Max (for each node)
				 *  test
				 */
	int SelfForceIx2AdjLP;	/* /< SS LP Vertical Adj Force Ix2 min/Max
					 * (for each node) test */
	int SelfForceIxTotalLP;	/* /< SS LP Total Force Ix min/Max
				 * (for each node) test
				 */
	int SelfForceIxTotalAdjLP;	/* /< SS LP Total Vertical Adj Force Ix
					 * min/Max (for each node) test
					 */
	int SelfForceCx1LP;	/* /< SS LP Force Cx1 min/Max test */
	int SelfForceCx2LP;	/* /< SS LP Force Cx2 min/Max (for each node)
				 * test
				 */
	int SelfForceCx2AdjLP;	/* /< SS LP Vertical Adj Force Cx2 min/Max (for
				 * each node) test
				 */
	int SelfForceCxTotalLP;	/* /< SS LP Total Force Cx min/Max
				 * (for each node) test
				 */
	int SelfForceCxTotalAdjLP;	/* /< SS LP Total Vertical Adj Force Cx
					 * min/Max (for each node) test
					 */

	int SelfSenseRaw;	/* /< SS Sense Raw min/Max test */
	int SelfSenseRawGap;	/* /< SS Sense Raw Gap(max-min) test */
	int SelfSenseRawMap;	/* /< SS Sense Raw min/Max test for each node */
	int SelfSenseRawLP;	/* /< SS Low Power Sense Raw min/Max test */
	int SelfSenseRawGapLP; /* /< SS Low Power Sense Raw Gap(max-min) test */
	int SelfSenseRawMapLP;	/* /< SS Low Power Sense Raw min/Max test for
				 * each node
				 */

	int SelfSenseIx1;	/* /< SS Sense Ix1 min/Max test */
	int SelfSenseIx2; /* /< SS Sense Ix2 min/Max (for each node) test */
	int SelfSenseIx2Adj;	/* /< SS Horizontal Adj Sense Ix2 min/Max
				  * (for each node) test */
	int SelfSenseIxTotal;	/* /< SS Total Horizontal Sense Ix min/Max
				  * (for each node) test */
	int SelfSenseIxTotalAdj;	/* /< SS Total Horizontal Adj Sense Ix
					 * min/Max
					 * (for each node) test */
	int SelfSenseCx1;	/* /< SS Sense Cx1 min/Max test */
	int SelfSenseCx2; /* /< SS Sense Cx2 min/Max (for each node) test */
	int SelfSenseCx2Adj;	/* /< SS Horizontal Adj Sense Cx2 min/Max
				  * (for each node) test */
	int SelfSenseCxTotal;	/* /< SS Total Sense Cx min/Max (for each node)
				 * test */
	int SelfSenseCxTotalAdj;	/* /< SS Total Horizontal Adj Sense Cx
					 * min/Max
					 * (for each node) test */
	int SelfSenseIx1LP;	/* /< SS LP Sense Ix1 min/Max test */
	int SelfSenseIx2LP; /* /< SS LP Sense Ix2 min/Max (for each node)
			     * test
			     */
	int SelfSenseIx2AdjLP;	/* /< SS LP Horizontal Adj Sense Ix2 min/Max
				 * (for each node) test
				 */
	int SelfSenseIxTotalLP;	/* /< SS LP Total Horizontal Sense Ix min/Max
				 * (for each node) test
				 */
	int SelfSenseIxTotalAdjLP; /* /< SS LP Total Horizontal Adj Sense Ix
				    * min/Max (for each node) test
				    */
	int SelfSenseCx1LP;	/* /< SS LP Sense Cx1 min/Max test */
	int SelfSenseCx2LP; /* /< SS LP Sense Cx2 min/Max (for each node)
			     * test
			     */
	int SelfSenseCx2AdjLP;	/* /< SS LP Horizontal Adj Sense Cx2 min/Max
				 * (for each node) test
				 */
	int SelfSenseCxTotalLP;	/* /< SS LP Total Sense Cx min/Max
				 * (for each node) test
				 */
	int SelfSenseCxTotalAdjLP; /* /< SS LP Total Horizontal Adj Sense Cx
				    * min/Max (for each node) test
				    */
} TestToDo;


#define MAX_LIMIT_FILE_NAME 100	/* /< max number of chars of the limit file name
				 * */

/**
  * Struct which store the data coming from a Production Limit File
  */
typedef struct {
	char *data;	/* /< pointer to an array of char which contains
			  * the content of the Production Limit File */
	int size;	/* /< size of data */
	char name[MAX_LIMIT_FILE_NAME];	/* /< identifier of the source from
					  * where the limits data were loaded
					  * (if loaded from a file it will be
					  * the file name, while if loaded
					  * from .h will be "NULL") */
} LimitFile;



int initTestToDo(void);
/**@}*/

/**@}*/


int computeAdjHoriz(i8 *data, int row, int column, u8 **result);
int computeAdjHorizTotal(short *data, int row, int column, u16 **result);
int computeAdjVert(i8 *data, int row, int column, u8 **result);
int computeAdjVertTotal(short *data, int row, int column, u16 **result);
int computeAdjHorizFromU(u8 *data, int row, int column, u8 **result);
int computeAdjHorizTotalFromU(u16 *data, int row, int column, u16 **result);
int computeAdjVertFromU(u8 *data, int row, int column, u8 **result);
int computeAdjVertTotalFromU(u16 *data, int row, int column, u16 **result);
int checkLimitsMinMax(short *data, int row, int column, int min, int max);
int checkLimitsMap(i8 *data, int row, int column, int *min, int *max);
int checkLimitsMapTotal(short *data, int row, int column, int *min, int *max);
int checkLimitsMapFromU(u8 *data, int row, int column, int *min, int *max);
int checkLimitsMapTotalFromU(u16 *data, int row, int column, int *min,
			     int *max);
int checkLimitsMapAdj(u8 *data, int row, int column, int *max);
int checkLimitsMapAdjTotal(u16 *data, int row, int column, int *max);
int checkLimitsGap(short *data, int row, int column, int threshold);
int checkLimitsGapOffsets(short *data, int row, int column, int threshold,
		int row_start, int column_start, int row_end, int column_end);

/**  @defgroup mp_api MP API
  * @ingroup mp_test
  * Functions to execute the MP test.
  * The parameters of these functions allow to customize their behavior
  * in order to satisfy different scenarios
  * @{
  */
int production_test_ito(const char *path_limits, TestToDo *todo,
			MutualSenseFrame *frame);
int production_test_initialization(u8 type);
int production_test_main(const char *pathThresholds, int stop_on_fail,
			 int saveInit, TestToDo *todo, u8 mpflag);
int production_test_ms_raw(const char *path_limits, int stop_on_fail,
			   TestToDo *todo);
int production_test_ms_raw_lp(const char *path_limits, int stop_on_fail,
			      TestToDo *todo);
int production_test_ms_cx(const char *path_limits, int stop_on_fail,
			  TestToDo *todo);
int production_test_ms_cx_lp(const char *path_limits, int stop_on_fail,
			     TestToDo *todo);
int production_test_ss_raw(const char *path_limits, int stop_on_fail,
			  TestToDo *todo);
int production_test_ss_raw_lp(const char *path_limits, int stop_on_fail,
			      TestToDo *todo);
int production_test_ss_ix_cx(const char *path_limits, int stop_on_fail,
			     TestToDo *todo);
int production_test_ss_ix_cx_lp(const char *path_limits, int stop_on_fail,
			     TestToDo *todo);
int production_test_data(const char *path_limits, int stop_on_fail,
			  TestToDo *todo);
int production_test_ms_key_cx(const char *path_limits, int stop_on_fail,
			      TestToDo *todo);
int production_test_ms_key_raw(const char *path_limits);
/** @}*/

/**
  * @addtogroup limit_file
  * @{
  */
int parseProductionTestLimits(const char *path, LimitFile *file, char *label,
			      int **data, int *row, int *column);
int readLine(char *data, char *line, int size, int *n);
int getLimitsFile(const char *path, LimitFile *file);
int freeLimitsFile(LimitFile *file);
int freeCurrentLimitsFile(void);
/**@}*/

int tp_sensitivity_test_pre_cal_ms(MutualSenseFrame *finalFrame, short target,
				   int percentage);
int tp_sensitivity_test_pre_cal_ss(SelfSenseFrame *finalFrame, short target,
				   int percentage);
int tp_sensitivity_compute_gains(MutualSenseFrame *frame, short target,
				 int saveGain);
int tp_sensitivity_test_post_cal_ms(MutualSenseFrame *finalFrame,
				    MutualSenseFrame *deltas, short target,
				    int percentage, int *mean_normal,
				    int *mean_edge);
int tp_sensitivity_set_scan_mode(u8 scan, int enableGains);
int tp_sensitivity_mode(u8 enter, int saveGain);
int tp_sensitivity_test_std_ms(int numFrames, MutualSenseFrame *std);
#endif