diff mbox series

ir-keytable: re-add --device option

Message ID 20200907113659.0143dba2@coco.lan
State New
Headers show
Series ir-keytable: re-add --device option | expand

Commit Message

Mauro Carvalho Chehab Sept. 7, 2020, 9:36 a.m. UTC
While --device option doesn't work for enumerating and for RC/LIRC
specific control, it is still useful for testing purposes
for all kinds of input devices. For example, it can be used to
test mouse events:

	$ ./utils/keytable/ir-keytable -d /dev/input/event4 -t
	Testing events. Please, press CTRL-C to abort.
	1222738.567737: event type EV_REL(0x02): REL_X (0x0000) value=1
	1222738.567737: event type EV_SYN(0x00).
	1222738.573742: event type EV_REL(0x02): REL_X (0x0000) value=1
	1222738.573742: event type EV_SYN(0x00).
	1222738.581738: event type EV_REL(0x02): REL_X (0x0000) value=2
	1222738.581738: event type EV_REL(0x02): REL_Y (0x0001) value=1

So, re-add it, but only on test mode.

Partially reverts: 906719e4c573 ("keytable: remove misleading --device argument")

Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>



Thanks,
Mauro

Comments

Mauro Carvalho Chehab Sept. 7, 2020, 2:58 p.m. UTC | #1
Em Mon, 7 Sep 2020 15:43:09 +0100
Sean Young <sean@mess.org> escreveu:

> On Mon, Sep 07, 2020 at 11:36:59AM +0200, Mauro Carvalho Chehab wrote:
> > While --device option doesn't work for enumerating and for RC/LIRC
> > specific control, it is still useful for testing purposes
> > for all kinds of input devices. For example, it can be used to
> > test mouse events:
> > 
> > 	$ ./utils/keytable/ir-keytable -d /dev/input/event4 -t
> > 	Testing events. Please, press CTRL-C to abort.
> > 	1222738.567737: event type EV_REL(0x02): REL_X (0x0000) value=1
> > 	1222738.567737: event type EV_SYN(0x00).
> > 	1222738.573742: event type EV_REL(0x02): REL_X (0x0000) value=1
> > 	1222738.573742: event type EV_SYN(0x00).
> > 	1222738.581738: event type EV_REL(0x02): REL_X (0x0000) value=2
> > 	1222738.581738: event type EV_REL(0x02): REL_Y (0x0001) value=1
> > 
> > So, re-add it, but only on test mode.  
> 
> Isn't this the same functionality as evtest(1), but not as complete?
> 
> https://cgit.freedesktop.org/evtest/
> 
> evtest is packaged for Fedora, Debian, and Ubuntu.

No idea. At least on the device I'm testing (Hikey 970), evtest doesn't
produce anything when I move my mouse (checking via ssh):

	$ sudo evtest 
	No device specified, trying to scan all of /dev/input/event*
	Available devices:
	/dev/input/event0:	PixArt Dell MS116 USB Optical Mouse
	Select the device event number [0-0]: 

While ir-keytable works fine.

Thanks,
Mauro
Sean Young Sept. 7, 2020, 6:27 p.m. UTC | #2
On Mon, Sep 07, 2020 at 05:01:06PM +0200, Mauro Carvalho Chehab wrote:
> Em Mon, 7 Sep 2020 16:58:06 +0200
> Mauro Carvalho Chehab <mchehab+huawei@kernel.org> escreveu:
> 
> > Em Mon, 7 Sep 2020 15:43:09 +0100
> > Sean Young <sean@mess.org> escreveu:
> > 
> > > On Mon, Sep 07, 2020 at 11:36:59AM +0200, Mauro Carvalho Chehab wrote:  
> > > > While --device option doesn't work for enumerating and for RC/LIRC
> > > > specific control, it is still useful for testing purposes
> > > > for all kinds of input devices. For example, it can be used to
> > > > test mouse events:
> > > > 
> > > > 	$ ./utils/keytable/ir-keytable -d /dev/input/event4 -t
> > > > 	Testing events. Please, press CTRL-C to abort.
> > > > 	1222738.567737: event type EV_REL(0x02): REL_X (0x0000) value=1
> > > > 	1222738.567737: event type EV_SYN(0x00).
> > > > 	1222738.573742: event type EV_REL(0x02): REL_X (0x0000) value=1
> > > > 	1222738.573742: event type EV_SYN(0x00).
> > > > 	1222738.581738: event type EV_REL(0x02): REL_X (0x0000) value=2
> > > > 	1222738.581738: event type EV_REL(0x02): REL_Y (0x0001) value=1
> > > > 
> > > > So, re-add it, but only on test mode.    
> > > 
> > > Isn't this the same functionality as evtest(1), but not as complete?
> > > 
> > > https://cgit.freedesktop.org/evtest/
> > > 
> > > evtest is packaged for Fedora, Debian, and Ubuntu.  
> > 
> > No idea. At least on the device I'm testing (Hikey 970), evtest doesn't
> > produce anything when I move my mouse (checking via ssh):
> > 
> > 	$ sudo evtest 
> > 	No device specified, trying to scan all of /dev/input/event*
> > 	Available devices:
> > 	/dev/input/event0:	PixArt Dell MS116 USB Optical Mouse
> > 	Select the device event number [0-0]: 
> > 
> > While ir-keytable works fine.
> 
> Gah! it actually expects a "0" as input, as pressing just <enter>
> does nothing. crap!

You can specify the device on the command line:

$ sudo evtest /dev/input/event6
Input driver version is 1.0.1
Input device ID: bus 0x3 vendor 0x45e product 0x737 version 0x111
Input device name: "PixArt Microsoft USB Optical Mouse"
Supported events:
  Event type 0 (EV_SYN)
  Event type 1 (EV_KEY)
    Event code 272 (BTN_LEFT)
    Event code 273 (BTN_RIGHT)
    Event code 274 (BTN_MIDDLE)
  Event type 2 (EV_REL)
    Event code 0 (REL_X)
    Event code 1 (REL_Y)
    Event code 8 (REL_WHEEL)
    Event code 11 (REL_WHEEL_HI_RES)
  Event type 4 (EV_MSC)
    Event code 4 (MSC_SCAN)
Properties:
Testing ... (interrupt to exit)
Event: time 1599502969.368229, type 2 (EV_REL), code 1 (REL_Y), value -3

It gives more information about the device than ir-keytable, and it's
maintained by Peter Hutterer, the maintainer of libinput.

Having said that, asking for the input device when there is only one
is a bit stupid.

Thanks,

Sean
diff mbox series

Patch

diff --git a/utils/keytable/ir-keytable.1.in b/utils/keytable/ir-keytable.1.in
index 5237f0be2620..e12de34b2b68 100644
--- a/utils/keytable/ir-keytable.1.in
+++ b/utils/keytable/ir-keytable.1.in
@@ -22,6 +22,9 @@  Auto\-load keymaps, based on a configuration file. Only works with
 \fB\-c\fR, \fB\-\-clear\fR
 Clears the scancode to keycode mappings.
 .TP
+\fB\-d\fR, \fB\-\-device\fR=\fIDEV\fR
+Use specified input device. Works only on test mode.
+.TP
 \fB\-D\fR, \fB\-\-delay\fR=\fIDELAY\fR
 Sets the delay before repeating a keystroke.
 .TP
@@ -66,6 +69,8 @@  print the v4l2\-utils version
 Mandatory or optional arguments to long options are also mandatory or optional
 for any corresponding short options. Options can be combined together.
 .SS The options arguments are:
+.IP \fIDEV\fR
+the /dev/input/event* device to control
 .IP \fISYSDEV\fR
 the rc device as found at /sys/class/rc
 .IP \fIKEYMAP\fR
diff --git a/utils/keytable/keytable.c b/utils/keytable/keytable.c
index 3df5fcf203ed..021479d6c4e0 100644
--- a/utils/keytable/keytable.c
+++ b/utils/keytable/keytable.c
@@ -249,6 +249,7 @@  static const char doc[] = N_(
 	"You need to have read permissions on /dev/input for the program to work\n"
 	"\nOn the options below, the arguments are:\n"
 	"  SYSDEV    - the rc device as found at /sys/class/rc\n"
+	"  DEV       - the /dev/input/event* device to control\n"
 	"  KEYMAP    - a keymap file with protocols and scancode to keycode mappings\n"
 	"  SCANKEY   - a set of scancode1=keycode1,scancode2=keycode2.. value pairs\n"
 	"  PROTOCOL  - protocol name (nec, rc-5, rc-6, jvc, sony, sanyo, rc-5-sz, lirc,\n"
@@ -267,6 +268,7 @@  static const struct argp_option options[] = {
 	{"sysdev",	's',	N_("SYSDEV"),	0,	N_("rc device to control, defaults to rc0 if not specified"), 0},
 	{"test",	't',	0,		0,	N_("test if IR is generating events"), 0},
 	{"read",	'r',	0,		0,	N_("reads the current scancode/keycode mapping"), 0},
+	{"device",	'd',	N_("DEV"),	0,	N_("ir device to control"), 0},
 	{"write",	'w',	N_("KEYMAP"),	0,	N_("write (adds) the keymap from the specified file"), 0},
 	{"set-key",	'k',	N_("SCANKEY"),	0,	N_("Change scan/key pairs"), 0},
 	{"protocol",	'p',	N_("PROTOCOL"),	0,	N_("Protocol to enable (the other ones will be disabled). To enable more than one, use the option more than one time"), 0},
@@ -285,6 +287,7 @@  static const char args_doc[] = N_("");
 
 /* Static vars to store the parameters */
 static char *devclass = NULL;
+static char *devicename = NULL;
 static int readtable = 0;
 static int clear = 0;
 int debug = 0;
@@ -551,6 +554,9 @@  static error_t parse_opt(int k, char *arg, struct argp_state *state)
 		if (!p || *p || period < 0)
 			argp_error(state, _("Invalid period: %s"), arg);
 		break;
+	case 'd':
+		devicename = arg;
+		break;
 	case 's':
 		devclass = arg;
 		break;
@@ -2033,7 +2039,7 @@  int main(int argc, char *argv[])
 	int dev_from_class = 0, write_cnt;
 	int fd;
 	static struct sysfs_names *names;
-	struct rc_device	  rc_dev;
+	struct rc_device	  rc_dev = { };
 
 #ifdef ENABLE_NLS
 	setlocale (LC_ALL, "");
@@ -2046,6 +2052,11 @@  int main(int argc, char *argv[])
 	if (test_keymap)
 		return 0;
 
+	if (devicename &&( !test || devclass || clear || readtable || keytable || ch_proto || cfg.next || delay >= 0 || period >= 0 || bpf_protocol)) {
+		fprintf (stderr, _("device option can be used only for test events\n"));
+		return -1;
+	}
+
 	/* Just list all devices */
 	if (!clear && !readtable && !keytable && !ch_proto && !cfg.next && !test && delay < 0 && period < 0 && !bpf_protocol) {
 		if (show_sysfs_attribs(&rc_dev, devclass))
@@ -2061,19 +2072,21 @@  int main(int argc, char *argv[])
 		fprintf (stderr, _("Auto-mode can be used only with --read, --verbose and --sysdev options\n"));
 		return -1;
 	}
-
-	names = find_device(devclass);
-	if (!names)
-		return -1;
-	rc_dev.sysfs_name = names->name;
-	if (get_attribs(&rc_dev, names->name)) {
+	if (!devicename) {
+		names = find_device(devclass);
+		if (!names)
+			return -1;
+		rc_dev.sysfs_name = names->name;
+		if (get_attribs(&rc_dev, names->name)) {
+			free_names(names);
+			return -1;
+		}
+		names->name = NULL;
 		free_names(names);
-		return -1;
-	}
-	names->name = NULL;
-	free_names(names);
 
-	dev_from_class++;
+		devicename = rc_dev.input_name;
+		dev_from_class++;
+	}
 
 	if (cfg.next) {
 		struct cfgfile *cur;
@@ -2124,14 +2137,14 @@  int main(int argc, char *argv[])
 	}
 
 	if (debug)
-		fprintf(stderr, _("Opening %s\n"), rc_dev.input_name);
-	fd = open(rc_dev.input_name, O_RDONLY | O_NONBLOCK);
+		fprintf(stderr, _("Opening %s\n"), devicename);
+	fd = open(devicename, O_RDONLY | O_NONBLOCK);
 	if (fd < 0) {
-		perror(rc_dev.input_name);
+		perror(devicename);
 		return -1;
 	}
 	if (dev_from_class)
-		free(rc_dev.input_name);
+		free(devicename);
 	if (get_input_protocol_version(fd))
 		return -1;