From 2548e88a53e9a4cebab8ca77eb696ae1e85aadb9 Mon Sep 17 00:00:00 2001 From: Clay Smith Date: Thu, 26 Jan 2023 17:30:38 -0600 Subject: almost everything works but PS4 and Wii Nunchuck? --- global_defs.h | 13 ++++-- main.c | 144 +++++++++++++++++++++++++++++++--------------------------- 2 files changed, 85 insertions(+), 72 deletions(-) diff --git a/global_defs.h b/global_defs.h index 17269c9..248da05 100644 --- a/global_defs.h +++ b/global_defs.h @@ -7,8 +7,9 @@ #include //magic numbers -#define NUM_EVENTS 12 //steam + xbox + ps4 * 6 + wii * 3 + mouse -#define NUM_EVENTS_WII_PS4 3 +#define NUM_EVENTS 14 //steam + xbox + ps4 * 6 + wii * 4 + mouse +#define NUM_EVENTS_PS4 3 +#define NUM_EVENTS_WII 4 #define PS4_BT_TOUCH_BIT 32 #define PS4_BT_GYRO_BIT 64 @@ -23,10 +24,11 @@ #define NINTENDO_GYRO_BIT 256 #define NINTENDO_IR_BIT 512 #define NINTENDO_BUTTONS_BIT 1024 -#define NINTENDO_ALL_BITS 1792 // 1024 + 512 + 256 +#define NINTENDO_NUNCHUCK_BIT 2048 +#define NINTENDO_ALL_BITS 3840 // 2048 + 1024 + 512 + 256 enum { - IR = 0, TOUCHPAD = 0, GYRO = 1, BUTTONS = 2 + IR = 0, TOUCHPAD = 0, GYRO = 1, BUTTONS = 2, NUNCHUCK = 3 }; enum { @@ -34,6 +36,7 @@ enum { XBOX_360 = 1, PS4_WIRED_GYRO = 2, PS4_WIRED_BUTTONS = 3, PS4_WIRED_TOUCH = 4, PS4_BT_GYRO = 5, PS4_BT_BUTTONS = 6, PS4_BT_TOUCH = 7, - WII_GYRO = 8, WII_IR = 9, WII_BUTTONS = 10, MOUSE = 11 + WII_GYRO = 8, WII_IR = 9, WII_BUTTONS = 10, WII_NUNCHUCK = 11, + MOUSE = 12 }; diff --git a/main.c b/main.c index 9f9b7dd..01aecf3 100644 --- a/main.c +++ b/main.c @@ -9,32 +9,37 @@ int main(void) uint64_t connected_controllers = 0; //Determine if WII REMOTE is connected via bluetooth - int wii[NUM_EVENTS_WII_PS4] = { 0 }; + int wii[4] = { 0 }; FILE* wii_pipe = popen("cat /proc/bus/input/devices | grep -A 5 \"^I: Bus=0005 Vendor=057e Product=0306\" | grep \"event\" | cut -d 't' -f2 | paste - -s", "r"); - fscanf(wii_pipe, "%2d %2d %2d", &wii[GYRO], &wii[IR], &wii[BUTTONS]); + fscanf(wii_pipe, "%2d %2d %2d %2d", &wii[GYRO], &wii[IR], &wii[BUTTONS], &wii[NUNCHUCK]); if ( wii[GYRO] != 0 && wii[IR] != 0 && wii[BUTTONS] != 0) { //wii is connected, create strings of event PATHS, open event files - char wii_events[NUM_EVENTS_WII_PS4][26]; + char wii_events[NUM_EVENTS_WII][26]; snprintf(wii_events[GYRO], 25, "/dev/input/event%d", wii[GYRO]); snprintf(wii_events[IR], 25, "/dev/input/event%d", wii[IR]); snprintf(wii_events[BUTTONS], 25, "/dev/input/event%d", wii[BUTTONS]); controller_event_fptrs[WII_GYRO] = open(wii_events[GYRO], O_RDONLY); controller_event_fptrs[WII_IR] = open(wii_events[IR], O_RDONLY); controller_event_fptrs[WII_BUTTONS] = open(wii_events[BUTTONS], O_RDONLY); + if (wii[NUNCHUCK] != 0) { //NUNCHUCK ATTACHED + snprintf(wii_events[NUNCHUCK], 25, "/dev/input/event%d", wii[NUNCHUCK]); + controller_event_fptrs[WII_NUNCHUCK] = open(wii_events[NUNCHUCK], O_RDONLY); + } //tell user and program that this device is available for use connected_controllers |= NINTENDO_ALL_BITS; printf("%4d: NINTENDO WII GYRO\n", NINTENDO_GYRO_BIT); printf("%4d: NINTENDO WII IR \n", NINTENDO_IR_BIT); printf("%4d: NINTENDO WII BUTTONS\n", NINTENDO_BUTTONS_BIT); + printf("%4d: NINTENDO WII NUNCHUCK\n", NINTENDO_NUNCHUCK_BIT); printf("%4d: ALL NINTENDO BT\n", NINTENDO_ALL_BITS); } //PS4 Bluetooth - int ps4[NUM_EVENTS_WII_PS4] = { 0 }; + int ps4[NUM_EVENTS_PS4] = { 0 }; FILE* ps4_bt_pipe = popen("cat /proc/bus/input/devices | grep -A 5 \"^I: Bus=0005 Vendor=054c Product=09cc\" | grep \"event\" | cut -d 't' -f2 | paste - -s", "r"); fscanf(ps4_bt_pipe, "%2d %2d %2d", &ps4[TOUCHPAD], &ps4[GYRO], &ps4[BUTTONS]); if ( ps4[TOUCHPAD] != 0 && ps4[GYRO] != 0 && ps4[BUTTONS] != 0) { - char ps4_events[NUM_EVENTS_WII_PS4][26]; + char ps4_events[NUM_EVENTS_PS4][26]; snprintf(ps4_events[TOUCHPAD], 25, "/dev/input/event%d", ps4[TOUCHPAD]); snprintf(ps4_events[GYRO], 25, "/dev/input/event%d", ps4[GYRO]); snprintf(ps4_events[BUTTONS], 25, "/dev/input/event%d", ps4[BUTTONS]); @@ -83,7 +88,6 @@ DUMB_USER: printf("\n\nPress the number corresponding to the device above that you would like to use and then press ENTER.\n"); short choice; - int chosen_fd[3] = {-1}; scanf("%d", &choice); struct input_event event1; @@ -93,31 +97,40 @@ DUMB_USER: switch (choice) { case 1: //valve steam controller //easy { - chosen_fd[0] = controller_event_fptrs[VALVE_STEAM]; - for (int i = 0; i < NUM_EVENTS; ++i) { - if (i == VALVE_STEAM) continue; - close(controller_event_fptrs[i]); + printf("You chose: VALVE_STEAM\n"); + for (int i = 0; i < NUM_EVENTS - 1; ++i) { + if (i != VALVE_STEAM) { + close(controller_event_fptrs[i]); + } } - read(chosen_fd[0], &event1, ievt_size); + int ird = read(controller_event_fptrs[VALVE_STEAM], &event1, ievt_size); start_sec = event1.time.tv_sec; - while (1) { - read(chosen_fd[0], &event1, ievt_size); - if (event1.type == 0) continue; - printf("%zu.%-6zu %d %3d %6d\n", event1.time.tv_sec - start_sec, event1.time.tv_usec, event1.type, event1.code, event1.value); + if (ird == -1) fprintf(stderr, "PROBLEM READING FILE\n"); + while (ird != -1) { + int ird = read(controller_event_fptrs[VALVE_STEAM], &event1, ievt_size); + if (ird == -1) { + fprintf(stderr, "PROBLEM READING FILE\n"); + } + printf("%zu.%-6zu %d %3d %6d\n", + event1.time.tv_sec - start_sec, + event1.time.tv_usec, + event1.type, + event1.code, + event1.value); } break; } case 2: //xbox 360 controller //easy { - chosen_fd[0] = controller_event_fptrs[XBOX_360]; - for (int i = 0; i < NUM_EVENTS; ++i) { + printf("You chose: XBOX_360\n"); + for (int i = 0; i < NUM_EVENTS - 1; ++i) { if (i == XBOX_360) continue; close(controller_event_fptrs[i]); } - read(chosen_fd[0], &event1, ievt_size); + read(controller_event_fptrs[XBOX_360], &event1, ievt_size); start_sec = event1.time.tv_sec; while (1) { - read(chosen_fd[0], &event1, ievt_size); + read(controller_event_fptrs[XBOX_360], &event1, ievt_size); if (event1.type == 0) continue; printf("%zu.%-6zu %d %3d %6d\n", event1.time.tv_sec - start_sec, event1.time.tv_usec, event1.type, event1.code, event1.value); } @@ -125,15 +138,14 @@ DUMB_USER: } case PS4_WIRED_TOUCH_BIT: //easy { - chosen_fd[0] = controller_event_fptrs[PS4_WIRED_TOUCH]; - for (int i = 0; i < NUM_EVENTS; ++i) { + for (int i = 0; i < NUM_EVENTS - 1; ++i) { if (i == PS4_WIRED_TOUCH) continue; close(controller_event_fptrs[i]); } - read(chosen_fd[0], &event1, ievt_size); + read(controller_event_fptrs[PS4_WIRED_TOUCH], &event1, ievt_size); start_sec = event1.time.tv_sec; while (1) { - read(chosen_fd[0], &event1, ievt_size); + read(controller_event_fptrs[PS4_WIRED_TOUCH], &event1, ievt_size); if (event1.type == 0) continue; printf("%zu.%-6zu %d %3d %6d\n", event1.time.tv_sec - start_sec, event1.time.tv_usec, event1.type, event1.code, event1.value); } @@ -141,15 +153,14 @@ DUMB_USER: } case PS4_WIRED_GYRO_BIT: //easy { - chosen_fd[0] = controller_event_fptrs[PS4_WIRED_GYRO]; - for (int i = 0; i < NUM_EVENTS; ++i) { + for (int i = 0; i < NUM_EVENTS - 1; ++i) { if (i == PS4_WIRED_GYRO) continue; close(controller_event_fptrs[i]); } - read(chosen_fd[0], &event1, ievt_size); + read(controller_event_fptrs[PS4_WIRED_GYRO], &event1, ievt_size); start_sec = event1.time.tv_sec; while (1) { - read(chosen_fd[0], &event1, ievt_size); + read(controller_event_fptrs[PS4_WIRED_GYRO], &event1, ievt_size); if (event1.type == 0) continue; printf("%zu.%-6zu %d %3d %6d\n", event1.time.tv_sec - start_sec, event1.time.tv_usec, event1.type, event1.code, event1.value); } @@ -157,15 +168,14 @@ DUMB_USER: } case PS4_WIRED_BUTTONS_BIT: //easy { - chosen_fd[0] = controller_event_fptrs[PS4_WIRED_BUTTONS]; - for (int i = 0; i < NUM_EVENTS; ++i) { + for (int i = 0; i < NUM_EVENTS - 1; ++i) { if (i == PS4_WIRED_BUTTONS) continue; close(controller_event_fptrs[i]); } - read(chosen_fd[0], &event1, ievt_size); + read(controller_event_fptrs[PS4_WIRED_BUTTONS], &event1, ievt_size); start_sec = event1.time.tv_sec; while (1) { - read(chosen_fd[0], &event1, ievt_size); + read(controller_event_fptrs[PS4_WIRED_BUTTONS], &event1, ievt_size); if (event1.type == 0) continue; printf("%zu.%-6zu %d %3d %6d\n", event1.time.tv_sec - start_sec, event1.time.tv_usec, event1.type, event1.code, event1.value); } @@ -174,10 +184,7 @@ DUMB_USER: case PS4_WIRED_ALL_BITS: //HARD { struct input_event event2, event3; - chosen_fd[0] = controller_event_fptrs[PS4_WIRED_TOUCH]; - chosen_fd[1] = controller_event_fptrs[PS4_WIRED_GYRO]; - chosen_fd[2] = controller_event_fptrs[PS4_WIRED_BUTTONS]; - for (int i = 0; i < NUM_EVENTS; ++i) { + for (int i = 0; i < NUM_EVENTS - 1; ++i) { if (i == PS4_WIRED_TOUCH || i == PS4_WIRED_GYRO || i == PS4_WIRED_BUTTONS) continue; close(controller_event_fptrs[i]); } @@ -185,15 +192,14 @@ DUMB_USER: } case PS4_BT_TOUCH_BIT: //easy { - chosen_fd[0] = controller_event_fptrs[PS4_BT_TOUCH]; - for (int i = 0; i < NUM_EVENTS; ++i) { + for (int i = 0; i < NUM_EVENTS - 1; ++i) { if (i == PS4_BT_TOUCH) continue; close(controller_event_fptrs[i]); } - read(chosen_fd[0], &event1, ievt_size); + read(controller_event_fptrs[PS4_BT_TOUCH], &event1, ievt_size); start_sec = event1.time.tv_sec; while (1) { - read(chosen_fd[0], &event1, ievt_size); + read(controller_event_fptrs[PS4_BT_TOUCH], &event1, ievt_size); if (event1.type == 0) continue; printf("%zu.%-6zu %d %3d %6d\n", event1.time.tv_sec - start_sec, event1.time.tv_usec, event1.type, event1.code, event1.value); } @@ -201,15 +207,14 @@ DUMB_USER: } case PS4_BT_GYRO_BIT: //easy { - chosen_fd[0] = controller_event_fptrs[PS4_BT_GYRO]; - for (int i = 0; i < NUM_EVENTS; ++i) { + for (int i = 0; i < NUM_EVENTS - 1; ++i) { if (i == PS4_BT_GYRO) continue; close(controller_event_fptrs[i]); } - read(chosen_fd[0], &event1, ievt_size); + read(controller_event_fptrs[PS4_BT_GYRO], &event1, ievt_size); start_sec = event1.time.tv_sec; while (1) { - read(chosen_fd[0], &event1, ievt_size); + read(controller_event_fptrs[PS4_BT_GYRO], &event1, ievt_size); if (event1.type == 0) continue; printf("%zu.%-6zu %d %3d %6d\n", event1.time.tv_sec - start_sec, event1.time.tv_usec, event1.type, event1.code, event1.value); } @@ -217,15 +222,14 @@ DUMB_USER: } case PS4_BT_BUTTONS_BIT: //easy { - chosen_fd[0] = controller_event_fptrs[PS4_BT_BUTTONS]; - for (int i = 0; i < NUM_EVENTS; ++i) { + for (int i = 0; i < NUM_EVENTS - 1; ++i) { if (i == PS4_BT_BUTTONS) continue; close(controller_event_fptrs[i]); } - read(chosen_fd[0], &event1, ievt_size); + read(controller_event_fptrs[PS4_BT_BUTTONS], &event1, ievt_size); start_sec = event1.time.tv_sec; while (1) { - read(chosen_fd[0], &event1, ievt_size); + read(controller_event_fptrs[PS4_BT_BUTTONS], &event1, ievt_size); if (event1.type == 0) continue; printf("%zu.%-6zu %d %3d %6d\n", event1.time.tv_sec - start_sec, event1.time.tv_usec, event1.type, event1.code, event1.value); } @@ -234,10 +238,7 @@ DUMB_USER: case PS4_BT_ALL_BITS: //HARD { struct input_event event2, event3; - chosen_fd[0] = controller_event_fptrs[PS4_BT_TOUCH]; - chosen_fd[1] = controller_event_fptrs[PS4_BT_GYRO]; - chosen_fd[2] = controller_event_fptrs[PS4_BT_BUTTONS]; - for (int i = 0; i < NUM_EVENTS; ++i) { + for (int i = 0; i < NUM_EVENTS - 1; ++i) { if (i == PS4_BT_TOUCH || i == PS4_BT_GYRO || i == PS4_BT_BUTTONS) continue; close(controller_event_fptrs[i]); } @@ -245,15 +246,14 @@ DUMB_USER: } case NINTENDO_GYRO_BIT: //easy { - chosen_fd[0] = controller_event_fptrs[WII_GYRO]; - for (int i = 0; i < NUM_EVENTS; ++i) { + for (int i = 0; i < NUM_EVENTS - 1; ++i) { if (i == WII_GYRO) continue; close(controller_event_fptrs[i]); } - read(chosen_fd[0], &event1, ievt_size); + read(controller_event_fptrs[WII_GYRO], &event1, ievt_size); start_sec = event1.time.tv_sec; while (1) { - read(chosen_fd[0], &event1, ievt_size); + read(controller_event_fptrs[WII_GYRO], &event1, ievt_size); if (event1.type == 0) continue; printf("%zu.%-6zu %d %3d %6d\n", event1.time.tv_sec - start_sec, event1.time.tv_usec, event1.type, event1.code, event1.value); } @@ -261,15 +261,14 @@ DUMB_USER: } case NINTENDO_IR_BIT: //easy { - chosen_fd[0] = controller_event_fptrs[WII_IR]; - for (int i = 0; i < NUM_EVENTS; ++i) { + for (int i = 0; i < NUM_EVENTS - 1; ++i) { if (i == WII_IR) continue; close(controller_event_fptrs[i]); } - read(chosen_fd[0], &event1, ievt_size); + read(controller_event_fptrs[WII_IR], &event1, ievt_size); start_sec = event1.time.tv_sec; while (1) { - read(chosen_fd[0], &event1, ievt_size); + read(controller_event_fptrs[WII_IR], &event1, ievt_size); if (event1.type == 0) continue; printf("%zu.%-6zu %d %3d %6d\n", event1.time.tv_sec - start_sec, event1.time.tv_usec, event1.type, event1.code, event1.value); } @@ -277,15 +276,29 @@ DUMB_USER: } case NINTENDO_BUTTONS_BIT: //easy { - chosen_fd[0] = controller_event_fptrs[WII_BUTTONS]; - for (int i = 0; i < NUM_EVENTS; ++i) { + for (int i = 0; i < NUM_EVENTS - 1; ++i) { if (i == WII_BUTTONS) continue; close(controller_event_fptrs[i]); } - read(chosen_fd[0], &event1, ievt_size); + read(controller_event_fptrs[WII_BUTTONS], &event1, ievt_size); + start_sec = event1.time.tv_sec; + while (1) { + read(controller_event_fptrs[WII_BUTTONS], &event1, ievt_size); + if (event1.type == 0) continue; + printf("%zu.%-6zu %d %3d %6d\n", event1.time.tv_sec - start_sec, event1.time.tv_usec, event1.type, event1.code, event1.value); + } + break; + } + case NINTENDO_NUNCHUCK_BIT: //easy + { + for (int i = 0; i < NUM_EVENTS - 1; ++i) { + if (i == WII_NUNCHUCK) continue; + close(controller_event_fptrs[i]); + } + read(controller_event_fptrs[WII_NUNCHUCK], &event1, ievt_size); start_sec = event1.time.tv_sec; while (1) { - read(chosen_fd[0], &event1, ievt_size); + read(controller_event_fptrs[WII_NUNCHUCK], &event1, ievt_size); if (event1.type == 0) continue; printf("%zu.%-6zu %d %3d %6d\n", event1.time.tv_sec - start_sec, event1.time.tv_usec, event1.type, event1.code, event1.value); } @@ -294,10 +307,7 @@ DUMB_USER: case NINTENDO_ALL_BITS: //HARD { struct input_event event2, event3; - chosen_fd[0] = controller_event_fptrs[WII_GYRO]; - chosen_fd[1] = controller_event_fptrs[WII_IR]; - chosen_fd[2] = controller_event_fptrs[WII_BUTTONS]; - for (int i = 0; i < NUM_EVENTS; ++i) { + for (int i = 0; i < NUM_EVENTS - 1; ++i) { if (i == WII_GYRO || i == WII_IR || i == WII_BUTTONS) continue; close(controller_event_fptrs[i]); } -- cgit v1.2.1