On Sun, Oct 31, 2010 at 2:23 PM, <ch...@cnpbagwell.com> wrote: > From: Chris Bagwell <ch...@cnpbagwell.com> > > 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 <ch...@cnpbagwell.com> > --- > 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? > +#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? 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 > Linuxwacom-devel@lists.sourceforge.net > 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 Linuxwacom-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/linuxwacom-devel