summaryrefslogtreecommitdiffstats
path: root/usr.bin/usbhidaction
diff options
context:
space:
mode:
authormav <mav@FreeBSD.org>2011-09-28 14:52:25 +0000
committermav <mav@FreeBSD.org>2011-09-28 14:52:25 +0000
commit3a1a19715027c5c03af47ff8d3ce06461e3b4d65 (patch)
treeed5b81a92c39c4c34a4ab0631b21d7f1764a740f /usr.bin/usbhidaction
parent3383aff65a84084093f4575d6098fac891dcbab9 (diff)
downloadFreeBSD-src-3a1a19715027c5c03af47ff8d3ce06461e3b4d65.zip
FreeBSD-src-3a1a19715027c5c03af47ff8d3ce06461e3b4d65.tar.gz
MFprojects/hid:
Import the rest of HID improvements from the branch: - improve report descriptor parser in libusbhid to handle several kinds of reports same time; - add to the libusbhid API two functions wrapping respective kernel IOCTLs for reading and writing reports; - tune uhid IOCTL interface to allow reading and writing arbitrary report, when multiple supported by the device; - teach usbhidctl to set output and feature reports; - make usbhidaction support all the same item names as bhidctl. Sponsored by: iXsystems, inc.
Diffstat (limited to 'usr.bin/usbhidaction')
-rw-r--r--usr.bin/usbhidaction/usbhidaction.13
-rw-r--r--usr.bin/usbhidaction/usbhidaction.c43
2 files changed, 28 insertions, 18 deletions
diff --git a/usr.bin/usbhidaction/usbhidaction.1 b/usr.bin/usbhidaction/usbhidaction.1
index 148c6d8..633272e 100644
--- a/usr.bin/usbhidaction/usbhidaction.1
+++ b/usr.bin/usbhidaction/usbhidaction.1
@@ -99,8 +99,7 @@ a debounce value, and an action.
There must be whitespace between the parts.
.Pp
The item names are similar to those used by
-.Xr usbhidctl 1 ,
-but each part must be prefixed by its page name.
+.Xr usbhidctl 1 .
.Pp
The value is simply a numeric value.
When the item reports this value,
diff --git a/usr.bin/usbhidaction/usbhidaction.c b/usr.bin/usbhidaction/usbhidaction.c
index c71a8fe..fd66b64 100644
--- a/usr.bin/usbhidaction/usbhidaction.c
+++ b/usr.bin/usbhidaction/usbhidaction.c
@@ -280,12 +280,11 @@ parse_conf(const char *conf, report_desc_t repd, int reportid, int ignore)
char *p;
int line;
char buf[SIZE], name[SIZE], value[SIZE], debounce[SIZE], action[SIZE];
- char usbuf[SIZE], coll[SIZE];
+ char usbuf[SIZE], coll[SIZE], *tmp;
struct command *cmd, *cmds;
struct hid_data *d;
struct hid_item h;
- int u, lo, hi, range;
-
+ int inst, cinst, u, lo, hi, range, t;
f = fopen(conf, "r");
if (f == NULL)
@@ -317,6 +316,12 @@ parse_conf(const char *conf, report_desc_t repd, int reportid, int ignore)
", syntax error: %s", conf, line, buf);
}
}
+ tmp = strchr(name, '#');
+ if (tmp != NULL) {
+ *tmp = 0;
+ inst = atoi(tmp + 1);
+ } else
+ inst = 0;
cmd = malloc(sizeof *cmd);
if (cmd == NULL)
@@ -361,6 +366,7 @@ parse_conf(const char *conf, report_desc_t repd, int reportid, int ignore)
}
coll[0] = 0;
+ cinst = 0;
for (d = hid_start_parse(repd, 1 << hid_input, reportid);
hid_get_item(d, &h); ) {
if (verbose > 2)
@@ -380,24 +386,29 @@ parse_conf(const char *conf, report_desc_t repd, int reportid, int ignore)
range = 0;
}
for (u = lo; u <= hi; u++) {
- snprintf(usbuf, sizeof usbuf, "%s:%s",
- hid_usage_page(HID_PAGE(u)),
- hid_usage_in_page(u));
- if (verbose > 2)
- printf("usage %s\n", usbuf);
- if (!strcasecmp(usbuf, name))
- goto foundhid;
if (coll[0]) {
snprintf(usbuf, sizeof usbuf,
"%s.%s:%s", coll+1,
- hid_usage_page(HID_PAGE(u)),
+ hid_usage_page(HID_PAGE(u)),
+ hid_usage_in_page(u));
+ } else {
+ snprintf(usbuf, sizeof usbuf,
+ "%s:%s",
+ hid_usage_page(HID_PAGE(u)),
hid_usage_in_page(u));
- if (verbose > 2)
- printf("usage %s\n",
- usbuf);
- if (!strcasecmp(usbuf, name))
- goto foundhid;
}
+ if (verbose > 2)
+ printf("usage %s\n", usbuf);
+ t = strlen(usbuf) - strlen(name);
+ if (t > 0) {
+ if (strcmp(usbuf + t, name))
+ continue;
+ if (usbuf[t - 1] != '.')
+ continue;
+ } else if (strcmp(usbuf, name))
+ continue;
+ if (inst == cinst++)
+ goto foundhid;
}
break;
case hid_collection:
OpenPOWER on IntegriCloud