On Mon, Nov 1, 2010 at 1:58 PM, Ping Cheng <[email protected]> wrote:
> On Sun, Oct 31, 2010 at 2:23 PM, <[email protected]> wrote:
>> From: Chris Bagwell <[email protected]>
>>
>> For Bamboo's/Tablet PC, channel 0 == 1st finger and channel 1 == 2nd finger.
>>
>> In older Bamboo kernel driver, serial #1 == 1st finger and serial #2 ==
>> 2nd finger. Mapping to channel was serial # - 1 and events had to
>> come in isolated by separate BTN_TOOL_DOUBLETAP/TRIPLETAP messages.
>>
>> With newer MT kernel driver, MT slot 0 == 1st finger and MT slot 1 ==
>> 2nd finger. Take advantage of this straight mapping to channel.
>> Code will map ST-style events to channel 0 and then MT packets will
>> write to either channel 0 or 1 or both.
>>
>> For MT case of 1st finger, we will updated X/Y/PRESSURE values 2 times
>> but left it this way for simplicity (we only dispatch 1 time correctly).
>>
>> Signed-off-by: Chris Bagwell <[email protected]>
>> ---
>> src/wcmUSB.c | 75
>> ++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
>> 1 files changed, 73 insertions(+), 2 deletions(-)
>>
>> diff --git a/src/wcmUSB.c b/src/wcmUSB.c
>> index 186d660..5f65e73 100644
>> --- a/src/wcmUSB.c
>> +++ b/src/wcmUSB.c
>> @@ -36,6 +36,7 @@
>> typedef struct {
>> int wcmLastToolSerial;
>> int wcmBTNChannel;
>> + int wcmMTChannel;
>> int wcmEventCnt;
>> struct input_event wcmEvents[MAX_USB_EVENTS];
>> } wcmUSBData;
>> @@ -831,6 +832,59 @@ static int usbParseAbsEvent(WacomCommonPtr common,
>> return change;
>> }
>>
>> +/* FIXME: I'm compiling against 2.6.35 header files in /usr/include/linux */
>> +#define ABS_MT_SLOT 0x2f
>> +
>> +static int usbParseAbsMTEvent(WacomCommonPtr common, struct input_event
>> *event)
>> +{
>> +#ifndef ABS_MT_SLOT
>> + /* requires Linux 2.6.36 or newer */
>> + return 0;
>
> Will we always fall to else since ABS_MT_SLOT is defined above?
Yep. I'll fix it once I settle on a preferred way of checking for it.
I kinda wanted to point out by above code that most people will have
2.3.35 kernel installed with their distribution at best and if they
just download and install a 2.3.36+ kernel that it still won't work
unless they do some CPPFLAGS=-I/path/to/new/kernel/headers.
>
>> +#else
>> + int change = 1;
>> + wcmUSBData* private = common->private;
>> + WacomDeviceState *ds, *dslast;
>> +
>> + ds = &common->wcmChannel[private->wcmMTChannel].work;
>> + dslast = &common->wcmChannel[private->wcmMTChannel].valid.state;
>> +
>> +
>> + switch(event->code)
>> + {
>> + case ABS_MT_SLOT:
>> + if (event->value >= 0 && event->value < MAX_FINGERS)
>
> MAX_FINGERS is hardcoded to 2. With the new MT_SLOT protocol,
> shouldn't we retrieve it from the kernel instead?
Good idea... but a little hard because MAX_CHANNELS is hard coded to 3
and some structure sizes are based on these hard coded values.
I can at least get the ball rolling and query the kernel and if its
more then 2 slots then print some sort of error message to log file.
Hows that sound for now?
>
> Thank you Chris.
>
> Ping
>
>> + {
>> + private->wcmMTChannel = event->value;
>> + ds->device_type = TOUCH_ID;
>> + ds->device_id = TOUCH_DEVICE_ID;
>> + ds->serial_num = event->value+1;
>> + }
>> + break;
>> +
>> + case ABS_MT_TRACKING_ID:
>> + ds->proximity = (event->value != -1);
>> +
>> + /* time stamp of proximity change for gestures */
>> + ds->sample = (int)GetTimeInMillis();
>> + break;
>> +
>> + case ABS_MT_POSITION_X:
>> + ds->x = event->value;
>> + break;
>> +
>> + case ABS_MT_POSITION_Y:
>> + ds->y = event->value;
>> + break;
>> +
>> + case ABS_MT_PRESSURE:
>> + ds->capacity = event->value;
>> + default:
>> + change = 0;
>> + }
>> + return change;
>> +#endif
>> +}
>> +
>> static struct
>> {
>> unsigned long device_type;
>> @@ -1072,7 +1126,7 @@ static void usbDispatchEvents(InputInfoPtr pInfo)
>> WacomDevicePtr priv = (WacomDevicePtr)pInfo->private;
>> WacomCommonPtr common = priv->common;
>> int channel;
>> - int channel_change = 0, btn_channel_change = 0;
>> + int channel_change = 0, btn_channel_change = 0, mt1_channel_change =
>> 0;
>> WacomChannelPtr pChannel;
>> WacomDeviceState dslast;
>> wcmUSBData* private = common->private;
>> @@ -1160,7 +1214,15 @@ static void usbDispatchEvents(InputInfoPtr pInfo)
>> /* absolute events */
>> if (event->type == EV_ABS)
>> {
>> - channel_change |= usbParseAbsEvent(common, event,
>> ds);
>> + if (usbParseAbsEvent(common, event, ds))
>> + channel_change |= 1;
>> + else if (usbParseAbsMTEvent(common, event))
>> + {
>> + if (private->wcmMTChannel == 0)
>> + channel_change |= 1;
>> + else if (private->wcmMTChannel == 1)
>> + mt1_channel_change |= 1;
>> + }
>> }
>> else if (event->type == EV_REL)
>> {
>> @@ -1225,6 +1287,15 @@ static void usbDispatchEvents(InputInfoPtr pInfo)
>> btn_channel_change))
>> wcmEvent(common, channel, ds);
>>
>> + /* dispatch for second finger. first finger is handled above. */
>> + if (mt1_channel_change)
>> + {
>> + WacomDeviceState *mt1_ds;
>> +
>> + mt1_ds = &common->wcmChannel[private->wcmMTChannel].work;
>> + wcmEvent(common, 1, mt1_ds);
>> + }
>> +
>> /* dispatch pad events on generic tablets */
>> if (common->wcmProtocolLevel == WCM_PROTOCOL_GENERIC &&
>> btn_channel_change)
>> --
>> 1.7.3.1
>>
>>
>> ------------------------------------------------------------------------------
>> Nokia and AT&T present the 2010 Calling All Innovators-North America contest
>> Create new apps & games for the Nokia N8 for consumers in U.S. and Canada
>> $10 million total in prizes - $4M cash, 500 devices, nearly $6M in marketing
>> Develop with Nokia Qt SDK, Web Runtime, or Java and Publish to Ovi Store
>> http://p.sf.net/sfu/nokia-dev2dev
>> _______________________________________________
>> Linuxwacom-devel mailing list
>> [email protected]
>> https://lists.sourceforge.net/lists/listinfo/linuxwacom-devel
>>
>
------------------------------------------------------------------------------
Nokia and AT&T present the 2010 Calling All Innovators-North America contest
Create new apps & games for the Nokia N8 for consumers in U.S. and Canada
$10 million total in prizes - $4M cash, 500 devices, nearly $6M in marketing
Develop with Nokia Qt SDK, Web Runtime, or Java and Publish to Ovi Store
http://p.sf.net/sfu/nokia-dev2dev
_______________________________________________
Linuxwacom-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/linuxwacom-devel