ltunify: allow friendly name as device index

This commit is contained in:
Peter Wu
2013-04-24 16:59:00 +02:00
parent 957ce488fc
commit fefd502517

View File

@@ -35,6 +35,8 @@
# define PACKAGE_VERSION "dev" # define PACKAGE_VERSION "dev"
#endif #endif
#define ARRAY_SIZE(a) (sizeof (a) / sizeof *(a))
// Set DEBUG envvar to enable printing extra verbose details // Set DEBUG envvar to enable printing extra verbose details
static bool debug_enabled; static bool debug_enabled;
@@ -234,6 +236,31 @@ const char *device_type_str(u8 type) {
return "(reserved)"; return "(reserved)";
} }
// returns device type index or -1 if the string is invalid
int device_type_from_str(const char *str) {
unsigned i;
// skip "Unknown" type
for (i = 1; i < ARRAY_SIZE(device_type); i++) {
if (device_type[i] && !strcasecmp(device_type[i], str)) {
return i;
}
}
return -1;
}
static void print_device_types(void) {
unsigned i;
// skip "Unknown" type
for (i = 1; i < ARRAY_SIZE(device_type); i++) {
if (device_type[i]) {
fprintf(stderr, " %s", device_type[i]);
}
}
putchar('\n');
}
static void dump_msg(struct hidpp_message *msg, size_t payload_size, const char *tag) { static void dump_msg(struct hidpp_message *msg, size_t payload_size, const char *tag) {
size_t i; size_t i;
@@ -859,8 +886,10 @@ static void print_usage(const char *program_name) {
" info idx - Show more detailled information for a device\n" " info idx - Show more detailled information for a device\n"
" receiver-info - Show information about the receiver\n" " receiver-info - Show information about the receiver\n"
"In the above lines, \"idx\" refers to the device number shown in the\n" "In the above lines, \"idx\" refers to the device number shown in the\n"
" first column of the list command (between 1 and 6).\n" " first column of the list command (between 1 and 6). Alternatively, you\n"
" can use the following names (case-insensitive):\n"
, program_name, PACKAGE_VERSION); , program_name, PACKAGE_VERSION);
print_device_types();
} }
// Return number of commands and command arguments, -1 on error. If the program // Return number of commands and command arguments, -1 on error. If the program
@@ -914,14 +943,21 @@ static int validate_args(int argc, char **argv, char ***args, char **hidraw_path
} }
} }
} else if (!strcmp(cmd, "unpair") || !strcmp(cmd, "info")) { } else if (!strcmp(cmd, "unpair") || !strcmp(cmd, "info")) {
u8 device_index; unsigned long device_index;
char *end;
if (args_count < 1) { if (args_count < 1) {
fprintf(stderr, "%s requires a device index\n", cmd); fprintf(stderr, "%s requires a device index\n", cmd);
return -1; return -1;
} }
device_index = (u8) strtoul((*args)[1], NULL, 0); device_index = strtoul((*args)[1], &end, 0);
if (device_index < 1 || device_index > DEVICES_MAX) { if (end != '\0') {
fprintf(stderr, "Device index must be between 1 and 6.\n"); if (device_type_from_str((*args)[1]) == -1) {
fprintf(stderr, "Invalid device type. Valid types are:\n");
print_device_types();
return -1;
}
} else if (device_index < 1 || device_index > DEVICES_MAX) {
fprintf(stderr, "Device index must be a number between 1 and 6.\n");
return -1; return -1;
} }
} else { } else {
@@ -982,6 +1018,36 @@ int open_hidraw(void) {
return fd; return fd;
} }
// returns device index starting at 1 or 0 on failure
static u8 find_device_index_for_type(int fd, const char *str, bool *fetched_devices) {
char *end;
u8 device_index;
device_index = strtoul(str, &end, 0);
if (*end == '\0') {
return device_index;
}
if (get_all_devices(fd)) {
u8 i;
int device_type_n;
device_type_n = device_type_from_str(str);
if (fetched_devices) {
*fetched_devices = true;
}
for (i = 0; i < DEVICES_MAX; i++) {
if (devices[i].device_type == device_type_n) {
return i + 1;
}
}
} else {
fprintf(stderr, "Unable to request a list of paired devices");
}
return 0;
}
int main(int argc, char **argv) { int main(int argc, char **argv) {
int fd; int fd;
struct msg_enable_notifs notifs; struct msg_enable_notifs notifs;
@@ -1042,12 +1108,17 @@ int main(int argc, char **argv) {
} }
perform_pair(fd, timeout); perform_pair(fd, timeout);
} else if (!strcmp(cmd, "unpair")) { } else if (!strcmp(cmd, "unpair")) {
bool fetched_devices = false;
u8 device_index; u8 device_index;
device_index = (u8) strtoul(args[1], NULL, 0); device_index = find_device_index_for_type(fd, args[1], &fetched_devices);
if (!get_all_devices(fd)) { if (!fetched_devices && !get_all_devices(fd)) {
fprintf(stderr, "Unable to request a list of paired devices\n"); fprintf(stderr, "Unable to request a list of paired devices\n");
} }
if (device_index) {
perform_unpair(fd, device_index); perform_unpair(fd, device_index);
} else {
fprintf(stderr, "Device %s not found\n", args[1]);
}
} else if (!strcmp(cmd, "list")) { } else if (!strcmp(cmd, "list")) {
u8 device_count; u8 device_count;
if (get_connected_devices(fd, &device_count)) { if (get_connected_devices(fd, &device_count)) {
@@ -1065,9 +1136,13 @@ int main(int argc, char **argv) {
} else if (!strcmp(cmd, "info")) { } else if (!strcmp(cmd, "info")) {
u8 device_index; u8 device_index;
device_index = (u8) strtoul(args[1], NULL, 0); device_index = find_device_index_for_type(fd, args[1], NULL);
if (device_index) {
gather_device_info(fd, device_index); gather_device_info(fd, device_index);
print_detailed_device(device_index); print_detailed_device(device_index);
} else {
fprintf(stderr, "Device %s not found\n", args[1]);
}
} else if (!strcmp(cmd, "receiver-info")) { } else if (!strcmp(cmd, "receiver-info")) {
get_and_print_recv_fw(fd); get_and_print_recv_fw(fd);
} else { } else {