mirror of
https://github.com/Lekensteyn/ltunify.git
synced 2025-12-10 10:25:34 +00:00
ltunify: allow friendly name as device index
This commit is contained in:
97
ltunify.c
97
ltunify.c
@@ -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");
|
||||||
}
|
}
|
||||||
perform_unpair(fd, device_index);
|
if (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);
|
||||||
gather_device_info(fd, device_index);
|
if (device_index) {
|
||||||
print_detailed_device(device_index);
|
gather_device_info(fd, 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 {
|
||||||
|
|||||||
Reference in New Issue
Block a user