Skip to content

Commit

Permalink
HID: ntrig: TipSwitch for single touch mode touch.
Browse files Browse the repository at this point in the history
Include TipSwitch in the touch detection decision for some single touch
firmwares.  Confidence and InRange are high for all finger events
including those used to indicate the finger is no longer in contact with
the sensor.

Signed-off-by: Rafi Rubin <rafi@seas.upenn.edu>
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
  • Loading branch information
Rafi Rubin authored and Jiri Kosina committed May 3, 2010
1 parent 5a38f2c commit 250d377
Showing 1 changed file with 21 additions and 8 deletions.
29 changes: 21 additions & 8 deletions drivers/hid/hid-ntrig.c
Original file line number Diff line number Diff line change
Expand Up @@ -31,10 +31,12 @@ struct ntrig_data {
/* Incoming raw values for a single contact */
__u16 x, y, w, h;
__u16 id;
__u8 confidence;

bool tipswitch;
bool confidence;
bool first_contact_touch;

bool reading_mt;
__u8 first_contact_confidence;

__u8 mt_footer[4];
__u8 mt_foot_count;
Expand Down Expand Up @@ -141,9 +143,10 @@ static int ntrig_event (struct hid_device *hid, struct hid_field *field,
case 0xff000001:
/* Tag indicating the start of a multitouch group */
nd->reading_mt = 1;
nd->first_contact_confidence = 0;
nd->first_contact_touch = 0;
break;
case HID_DG_TIPSWITCH:
nd->tipswitch = value;
/* Prevent emission of touch until validated */
return 1;
case HID_DG_CONFIDENCE:
Expand Down Expand Up @@ -171,10 +174,14 @@ static int ntrig_event (struct hid_device *hid, struct hid_field *field,
* to emit a normal (X, Y) position
*/
if (!nd->reading_mt) {
input_report_key(input, BTN_TOOL_DOUBLETAP,
(nd->confidence != 0));
/*
* TipSwitch indicates the presence of a
* finger in single touch mode.
*/
input_report_key(input, BTN_TOUCH,
(nd->confidence != 0));
nd->tipswitch);
input_report_key(input, BTN_TOOL_DOUBLETAP,
nd->tipswitch);
input_event(input, EV_ABS, ABS_X, nd->x);
input_event(input, EV_ABS, ABS_Y, nd->y);
}
Expand Down Expand Up @@ -213,7 +220,13 @@ static int ntrig_event (struct hid_device *hid, struct hid_field *field,

/* emit a normal (X, Y) for the first point only */
if (nd->id == 0) {
nd->first_contact_confidence = nd->confidence;
/*
* TipSwitch is superfluous in multitouch
* mode. The footer events tell us
* if there is a finger on the screen or
* not.
*/
nd->first_contact_touch = nd->confidence;
input_event(input, EV_ABS, ABS_X, nd->x);
input_event(input, EV_ABS, ABS_Y, nd->y);
}
Expand Down Expand Up @@ -243,7 +256,7 @@ static int ntrig_event (struct hid_device *hid, struct hid_field *field,

nd->reading_mt = 0;

if (nd->first_contact_confidence) {
if (nd->first_contact_touch) {
switch (value) {
case 0: /* for single touch devices */
case 1:
Expand Down

0 comments on commit 250d377

Please sign in to comment.