lirc/lirc-0.8.1-imon_pad2keys.patch

157 lines
5.5 KiB
Diff

--- lirc-0.8.2/drivers/Makefile.am
+++ lirc-0.8.2/drivers/Makefile.am
@@ -15,6 +15,7 @@
lirc_i2c \
lirc_igorplugusb \
lirc_imon \
+ lirc_imon2 \
lirc_it87 \
lirc_mceusb \
lirc_mceusb2 \
--- lirc-0.8.2/drivers/lirc_imon/Makefile.am
+++ lirc-0.8.2/drivers/lirc_imon/Makefile.am
@@ -5,9 +5,9 @@
## this is so that Automake includes the C compiling definitions, and
## includes the source files in the distribution.
EXTRA_PROGRAMS = automake_dummy
-automake_dummy_SOURCES = lirc_imon.c
+automake_dummy_SOURCES = lirc_imon2.c
## there is no *just* object file support in automake. This is close enough
-module_DATA = lirc_imon.o
+module_DATA = lirc_imon2.o
-include ../Makefile.common
\ No newline at end of file
+include ../Makefile.common
--- lirc-0.8.2/drivers/lirc_imon/lirc_imon.c
+++ lirc-0.8.2/drivers/lirc_imon/lirc_imon.c
@@ -65,9 +65,9 @@
#define MOD_AUTHOR "Venky Raju <dev@venky.ws>"
-#define MOD_DESC "Driver for Soundgraph iMON MultiMedian IR/VFD"
-#define MOD_NAME "lirc_imon"
-#define MOD_VERSION "0.3"
+#define MOD_DESC "Driver for Soundgraph iMON MultiMedian IR/VFD w/imon pad2keys patch"
+#define MOD_NAME "lirc_imon2"
+#define MOD_VERSION "0.3p2k"
#define VFD_MINOR_BASE 144 /* Same as LCD */
#define DEVFS_MODE S_IFCHR | S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH
@@ -81,6 +81,7 @@
#define SUCCESS 0
#define TRUE 1
#define FALSE 0
+#define CURSOR_LIMIT 16
/* ------------------------------------------------------------
@@ -166,6 +167,9 @@
atomic_t busy; /* write in progress */
int status; /* status of tx completion */
} tx;
+ int key_x;
+ int key_y;
+ int last_count; /* number of times pressed */
};
#define LOCK_CONTEXT down (&context ->sem)
@@ -256,6 +260,7 @@
MODULE_AUTHOR (MOD_AUTHOR);
MODULE_DESCRIPTION (MOD_DESC);
+MODULE_VERSION(MOD_VERSION); /* MBr: was missing */
MODULE_LICENSE ("GPL");
MODULE_DEVICE_TABLE (usb, imon_usb_id_table);
module_param (debug, int, 0);
@@ -682,6 +687,11 @@
context ->rx.initial_space = 1;
context ->rx.prev_bit = 0;
+ /* init pad context */
+ context ->key_x = 0;
+ context ->key_y = 0;
+ context ->last_count = 0;
+
usb_fill_int_urb (context ->rx_urb, context ->dev,
usb_rcvintpipe (context ->dev,
context ->rx_endpoint-> bEndpointAddress),
@@ -836,6 +846,76 @@
/* The signals have been decoded onboard the iMON controller */
+ /* encode mouse pad as key events */
+ /* we like pad events, not mouse button events*/
+ if((buf[0] & 0x40) &&
+ !(buf[1] & 0x01 || buf[1] >> 2 & 0x01))
+ {
+ int rel_x = (buf[1] & 0x08) | (buf[1] & 0x10) >> 2 | (buf[1] & 0x20) >> 4 | (buf[1] & 0x40) >> 6;
+ int rel_y = (buf[2] & 0x08) | (buf[2] & 0x10) >> 2 | (buf[2] & 0x20) >> 4 | (buf[2] & 0x40) >> 6;
+
+ if(buf[0] & 0x02)
+ rel_x |= ~0x10+1;
+ if(buf[0] & 0x01)
+ rel_y |= ~0x10+1;
+
+ /* keyboard direction key emulation */
+ if( context->last_count > 32 )
+ { /* Hopefully eliminate drift*/
+ context->last_count=0;
+ context->key_y=0;
+ context->key_x=0;
+ }
+ context->last_count++;
+
+ /* limit decoded events */
+ if(abs(context->key_x) > CURSOR_LIMIT || abs(context->key_y) > CURSOR_LIMIT )
+ {
+ if(abs(context->key_y ) > abs(context->key_x))
+ { /* mouse s/n */
+ if(context->key_y > 0 && rel_y > 0)
+ { /* mouse s */
+ buf[0] = 0x68;
+ buf[1] = 0x82;
+ buf[2] = 0x91;
+ }
+ else if(context->key_y < 0 && rel_y < 0)
+ { /* mouse n */
+ buf[0] = 0x69;
+ buf[1] = 0x02;
+ buf[2] = 0x81;
+ }
+ }
+ else
+ { /* mouse e/w*/
+ if(context->key_x > 0 && rel_x > 0 )
+ { /* mouse e */
+ buf[0] = 0x68;
+ buf[1] = 0x8A;
+ buf[2] = 0x81;
+ }
+ else if(context->key_x < 0 && rel_x < 0 )
+ { /* mouse w */
+ buf[0] = 0x6A;
+ buf[1] = 0x82;
+ buf[2] = 0x81;
+ }
+ }
+ }
+ else
+ {
+ context->key_x += rel_x;
+ context->key_y += rel_y;
+
+ return; /* discard those key codes */
+ }
+ }
+
+ /* a key was pressed, reset count */
+ context->key_x = 0;
+ context->key_y = 0;
+ context->last_count = 0;
+
lirc_buffer_write_1 (context ->plugin ->rbuf, buf);
wake_up (&context ->plugin ->rbuf ->wait_poll);
return;