Re: [PATCH 7/7] elantech: average the two coordinates when 2 fingers

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 08/01/2010 01:04 AM, Éric Piel wrote:

[...]

> I've got some fairly new versions of everything, but at least here, this
> is already happening with the X synaptics driver: in practice there is
> not jump at all, which ever finger is reported in doubletap. In
> doubletap it moves the scrolling axes, and changing to singletap, it
> resets to the new current position. No jump, both with my old synaptics
> hardware and with the elantech.


You are right. Jumping does not generally occur in synaptics when the number of
fingers changes.

The overall solution is still not quite satisfactory, since the MT points
reported are the lower-left and upper-right corners of a rectangle, instead of
the actual touch points. As mentioned in another mail, it would make sense to
add logic to bring this device up to the type A level. If the needed logic turns
out to be equivalent to the type B level, what can you do. :-)

How about this as a stab at the MT point problem. The idea here is that
get_corner_id() returns the rectangle corner which minimizes the change in
motion direction, according to the principle of inertia. For all cases,
position[0] is reported as the ABS_X/Y point.

state = (num_finger, corner_id, motion_id, position[n])

At each touch frame update, do

1. num_finger == 1

Set
  position[0] = finger-position

2. num_finger == 2

If last frame was one finger, do
  Find corner id such that position change is minimized
    id = get_initial_corner_id(position[0], corner-position[id])

Else
  Find temporary motion id
    mid = get_motion_id(position[0], corner-position[corner_id])
  Find corner id such that motion change is minimized
    id = get_corner_id(corner_id, motion_id, mid)

Set
  corner_id = id
  motion_id = get_motion_id(position[0], corner-position[id])
  position[0] = corner-position[id],
  position[1] = corner-position[opposite[id]]

Report position[0] and position[1] as MT points

Since this is all integer logic, it should be possible to detect motion changes
as sign changes, such that get_motion_id() and get_corner_id() can be
implemented as constant arrays.

Cheers,
Henrik
--
To unsubscribe from this list: send the line "unsubscribe linux-input" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux Media Devel]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Linux Wireless Networking]     [Linux Omap]

  Powered by Linux