Attached is a patch that makes linuxwacom-0.7.7-6 work with MultiTouch input.

The main problem with supporting MultiTouch on the new X60 Tablets is that the MultiTouch input is only 5 bytes long, as opposed to the 9 bytes of most ISDV4 messages.

To make this work, I had to hack up wcmISDV4.c to allow 5 or 9 byte messages, depending on the message header (first byte), and of course add support for the new messages.

Furthermore, it doesn't calibrate the new input automatically - I calibrated it manually /in code/. This works for me, and will even probably work on other X60 Tablets, but won't work in the future.

A few issues:
* The driver is desperate to drag instead of just click. I don't know how to change that sensitivity. * I believe this could cause problem with more "pure" ISDV4 tablets, but can't test that.

Please don't import this patch yet - it's just a proof of concept :)

- Gregor Richards

diff -ru linuxwacom-0.7.7-6/src/xdrv/wcmISDV4.c linuxwacom-0.7.7-6-multitouch/src/xdrv/wcmISDV4.c
--- linuxwacom-0.7.7-6/src/xdrv/wcmISDV4.c	2007-02-20 17:21:02.000000000 -0800
+++ linuxwacom-0.7.7-6-multitouch/src/xdrv/wcmISDV4.c	2007-03-24 01:01:48.000000000 -0700
@@ -107,7 +107,9 @@
   
 	/* set parameters */
 	common->wcmProtocolLevel = 4;
-	common->wcmPktLength = 9;       /* length of a packet */
+	common->wcmPktLength = 5;       /* length of a packet */
+					/* most packets are 9 bytes long,
+					 * some are only 5 */
 	common->wcmResolX = 2540; 	/* tablet X resolution in points/inch */
 	common->wcmResolY = 2540; 	/* tablet Y resolution in points/inch */
 	common->wcmTPCButton = 1;	/* Tablet PC buttons on by default */
@@ -209,9 +211,27 @@
 {
 	WacomDeviceState* last = &common->wcmChannel[0].valid.state;
 	WacomDeviceState* ds;
-	int n, cur_type;
+	int n, cur_type, ismt;
+	ismt = 0;
 
-	if ((n = xf86WcmSerialValidate(common,data)) > 0)
+	/* determine the type of message */
+	if (data[0] & 0x10)
+	{
+		ismt = 1;
+	}
+	else
+	{
+		common->wcmPktLength = 9;
+		if (common->buffer + common->bufpos - data < 9)
+		{
+			/* we can't handle this yet */
+			return 0;
+		}
+	}
+
+	n = xf86WcmSerialValidate(common,data);
+	common->wcmPktLength = 5;
+	if (n > 0)
 	{
 		return n;
 	}
@@ -225,6 +245,21 @@
 	ds = &common->wcmChannel[0].work;
 	RESET_RELATIVE(*ds);
 
+	if (ismt)
+	{
+		/* MultiTouch input is comparably simple */
+		ds->proximity = (data[0] & 0x20);
+		ds->x = (((((int)data[1]) << 7) | ((int)data[2])) - 18) * common->wcmMaxX / 926;
+		ds->y = (((((int)data[3]) << 7) | ((int)data[4])) - 51) * common->wcmMaxY / 934;
+		ds->pressure = (data[0] & 0x01) * common->wcmMaxZ;
+		ds->buttons = 1;
+		ds->device_id = STYLUS_DEVICE_ID;
+		DBG(8, ErrorF("isdv4Parse MultiTouch %x p=%d\n", data[0], ds->pressure));
+		xf86WcmEvent(common,0,ds);
+		return 5;
+	}
+
+
 	ds->proximity = (data[0] & 0x20);
 
 	/* x and y in "normal" orientetion (wide length is X) */
-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys-and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
Linuxwacom-discuss mailing list
Linuxwacom-discuss@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linuxwacom-discuss

Reply via email to