From 810cb2b05e3487378902b6a9b275bb325db595b5 Mon Sep 17 00:00:00 2001 From: sorgelig Date: Sun, 11 Jul 2021 19:28:49 +0800 Subject: [PATCH] input: use gamepad leds to display player number. --- input.cpp | 124 ++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 121 insertions(+), 3 deletions(-) diff --git a/input.cpp b/input.cpp index adb5361..ec9c99a 100644 --- a/input.cpp +++ b/input.cpp @@ -902,6 +902,7 @@ typedef struct char devname[32]; char id[80]; char name[128]; + char sysfs[512]; } devInput; static devInput input[NUMDEV] = {}; @@ -1687,18 +1688,126 @@ static void joy_analog(int num, int axis, int offset) } } +static char* get_led_path(int dev, int add_id = 1) +{ + static char path[1024]; + if (!input[dev].sysfs[0]) return NULL; + + sprintf(path, "/sys%s", input[dev].sysfs); + char *p = strstr(path, "/input/"); + if (p) + { + *p = 0; + char *id = strrchr(path, '/'); + strcpy(p, "/leds"); + if (add_id && id) strncat(p, id, p - id); + return path; + } + + return NULL; +} + +static int set_led(char *base, const char *led, int brightness) +{ + static char path[1024]; + sprintf(path, "%s%s/brightness", base, led); + FILE* f = fopen(path, "w"); + if (f) + { + fprintf(f, "%d", brightness); + fclose(f); + return 1; + } + + return 0; +} + +static void update_num_hw(int dev, int num) +{ + char *led_path; + if (num > 6) num = 6; + + if (input[dev].quirk == QUIRK_DS4 || input[dev].quirk == QUIRK_DS4TOUCH) + { + led_path = get_led_path(dev); + if (led_path) + { + if (set_led(led_path, ":player_id", (num > 5) ? 0 : num)) + { + //duslsense + set_led(led_path, ":blue", (num == 0) ? 128 : 64); + set_led(led_path, ":green", (num == 0) ? 128 : 64); + set_led(led_path, ":red", (num == 0) ? 128 : 0); + } + else + { + //dualshock4 + static const uint8_t color_code[7][3] = + { + { 0x30, 0x30, 0x30 }, // White + { 0x00, 0x00, 0x40 }, // Blue + { 0x40, 0x00, 0x00 }, // Red + { 0x00, 0x40, 0x00 }, // Green + { 0x20, 0x00, 0x20 }, // Pink + { 0x40, 0x10, 0x00 }, // Orange + { 0x00, 0x20, 0x20 } // Teal + }; + + set_led(led_path, ":blue", color_code[num][2]); + set_led(led_path, ":green", color_code[num][1]); + set_led(led_path, ":red", color_code[num][0]); + } + } + } + else if (input[dev].quirk == QUIRK_DS3) + { + led_path = get_led_path(dev); + if (led_path) + { + set_led(led_path, "::sony1", (num == 0 || num == 1 || num == 5)); + set_led(led_path, "::sony2", (num == 0 || num == 2 || num == 6)); + set_led(led_path, "::sony3", (num == 0 || num == 3)); + set_led(led_path, "::sony4", (num == 0 || num >= 4)); + } + } + else if (input[dev].quirk == QUIRK_WIIMOTE) + { + led_path = get_led_path(dev); + if (led_path) + { + set_led(led_path, ":blue:p0", (num == 0 || num == 1 || num == 5)); + set_led(led_path, ":blue:p1", (num == 0 || num == 2 || num == 6)); + set_led(led_path, ":blue:p2", (num == 0 || num == 3)); + set_led(led_path, ":blue:p3", (num == 0 || num >= 4)); + } + } + else if (input[dev].vid == 0x057e && ((input[dev].pid & 0xFF00) == 0x2000)) + { + // nintendo switch controllers + led_path = get_led_path(dev); + if (led_path) + { + set_led(led_path, ":player1", (num == 0 || num == 1 || num == 5)); + set_led(led_path, ":player2", (num == 0 || num == 2 || num == 6)); + set_led(led_path, ":player3", (num == 0 || num == 3)); + set_led(led_path, ":player4", (num == 0 || num >= 4)); + } + } +} + void reset_players() { for (int i = 0; i < NUMDEV; i++) { input[i].num = 0; input[i].map_shown = 0; + update_num_hw(i, 0); } memset(player_pad, 0, sizeof(player_pad)); memset(player_pdsp, 0, sizeof(player_pdsp)); } -void store_player(int num, int dev) +static void store_player(int num, int dev) { devInput *player = (input[dev].quirk == QUIRK_PDSP || input[dev].quirk == QUIRK_MSSP) ? player_pdsp : player_pad; @@ -1706,9 +1815,10 @@ void store_player(int num, int dev) for (int i = 1; i < NUMPLAYERS; i++) if (!strcmp(player[i].id, input[dev].id)) player[i].id[0] = 0; if(num && num < NUMPLAYERS) memcpy(&player[num], &input[dev], sizeof(devInput)); + update_num_hw(dev, num); } -void restore_player(int dev) +static void restore_player(int dev) { // do not restore bound devices if (dev != input[dev].bind) return; @@ -1728,6 +1838,8 @@ void restore_player(int dev) break; } } + + update_num_hw(dev, input[dev].num); } void unflag_players() @@ -2711,6 +2823,7 @@ void mergedevs() char phys[64] = {}; char uniq[64] = {}; char id[64] = {}; + static char sysfs[512] = {}; while (fgets(str, sizeof(str), f)) { @@ -2726,6 +2839,7 @@ void mergedevs() { if (!strncmp("P: Phys", str, 7)) snprintf(phys, sizeof(phys), "%s", strchr(str, '=') + 1); if (!strncmp("U: Uniq", str, 7)) snprintf(uniq, sizeof(uniq), "%s", strchr(str, '=') + 1); + if (!strncmp("S: Sysfs", str, 8)) snprintf(sysfs, sizeof(sysfs), "%s", strchr(str, '=') + 1); if (!strncmp("H: ", str, 3)) { @@ -2747,7 +2861,11 @@ void mergedevs() char idsp[32]; strcpy(idsp, dev + 1); strcat(idsp, " "); - if (strstr(handlers, idsp)) strcpy(input[i].id, id); + if (strstr(handlers, idsp)) + { + strcpy(input[i].id, id); + strcpy(input[i].sysfs, sysfs); + } } } }