From 2c8e4dbe5f597141cc9e3aeef19cceff58213853 Mon Sep 17 00:00:00 2001 From: Clay Smith Date: Sun, 19 Feb 2023 16:40:14 -0600 Subject: DONE --- handle_devices.c | 304 ++++++++++++++----------------------------------------- 1 file changed, 77 insertions(+), 227 deletions(-) (limited to 'handle_devices.c') diff --git a/handle_devices.c b/handle_devices.c index dd154aa..0b646cb 100644 --- a/handle_devices.c +++ b/handle_devices.c @@ -1,295 +1,145 @@ -#include #include +#include #include -#include "global_defs.h" #include +#include +#include +#include +#include #include +#include -void open_wii(int* controller_event_fptrs, uint64_t* connected_controllers, int choice) { - //Determine if WII REMOTE is connected via bluetooth - int wii[NUM_EVENTS_WII] = { 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 | \ - cut -d ' ' -f1 | \ - paste - -s", \ - "r"); - fscanf(wii_pipe, "%2d %2d %2d %2d", &wii[GYRO], &wii[IR], &wii[BUTTONS], &wii[NUNCHUK]); - 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][26]; - snprintf(wii_events[GYRO], 25, "/dev/input/event%d", wii[GYRO]); - controller_event_fptrs[WII_GYRO] = open(wii_events[GYRO], O_RDONLY); - snprintf(wii_events[IR], 25, "/dev/input/event%d", wii[IR]); - controller_event_fptrs[WII_IR] = open(wii_events[IR], O_RDONLY); - snprintf(wii_events[BUTTONS], 25, "/dev/input/event%d", wii[BUTTONS]); - controller_event_fptrs[WII_BUTTONS] = open(wii_events[BUTTONS], O_RDONLY); - //tell user and program that this device is available for use - *connected_controllers |= NINTENDO_GYRO_IR_AND_BUTTONS; - if (choice) { - fprintf(stderr, "%4d: NINTENDO WII GYRO\n", NINTENDO_GYRO_BIT); - fprintf(stderr, "%4d: NINTENDO WII IR \n", NINTENDO_IR_BIT); - fprintf(stderr, "%4d: NINTENDO WII BUTTONS\n", NINTENDO_BUTTONS_BIT); - fprintf(stderr, "%4d: NINTENDO WII GYRO AND IR\n", NINTENDO_GYRO_AND_IR); - fprintf(stderr, "%4d: NINTENDO WII GYRO AND BUTTONS\n", NINTENDO_GYRO_AND_BUTTONS); - fprintf(stderr, "%4d: NINTENDO WII IR AND BUTTONS\n", NINTENDO_IR_AND_BUTTONS); - fprintf(stderr, "%4d: NINTENDO WII GYRO AND IR AND BUTTONS\n", NINTENDO_GYRO_IR_AND_BUTTONS); - } - //NUNCHUK CONNECTED? - if (wii[NUNCHUK] != 0) { - *connected_controllers |= NINTENDO_ALL_BITS; - snprintf(wii_events[NUNCHUK], 25, "/dev/input/event%d", wii[NUNCHUK]); - controller_event_fptrs[WII_NUNCHUK] = open(wii_events[NUNCHUK], O_RDONLY); - if (choice) { - fprintf(stderr, "%4d: NINTENDO WII NUNCHUK\n", NINTENDO_NUNCHUK_BIT); - fprintf(stderr, "%4d: NINTENDO WII GYRO AND NUNCHUK\n", NINTENDO_GYRO_AND_NUNCHUK); - fprintf(stderr, "%4d: NINTENDO WII IR AND NUNCHUK\n", NINTENDO_IR_AND_NUNCHUK); - fprintf(stderr, "%4d: NINTENDO WII BUTTONS AND NUNCHUK\n", NINTENDO_BUTTONS_AND_NUNCHUK); - fprintf(stderr, "%4d: NINTENDO WII GYRO AND IR AND NUNCHUK\n", NINTENDO_GYRO_IR_AND_NUNCHUK); - fprintf(stderr, "%4d: NINTENDO WII GYRO AND BUTTONS AND NUNCHUK\n", NINTENDO_GYRO_BUTTONS_AND_NUNCHUK); - fprintf(stderr, "%4d: NINTENDO WII IR AND BUTTONS AND NUNCHUK\n", NINTENDO_IR_BUTTONS_AND_NUNCHUK); - fprintf(stderr, "%4d: ALL NINTENDO BT\n", NINTENDO_ALL_BITS); - } - } - } -} - -void open_ps4_bt(int* controller_event_fptrs, uint64_t* connected_controllers, int choice) { - 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_PS4][26]; - snprintf(ps4_events[TOUCHPAD], 25, "/dev/input/event%d", ps4[TOUCHPAD]); - controller_event_fptrs[PS4_BT_TOUCH] = open(ps4_events[TOUCHPAD], O_RDONLY); - snprintf(ps4_events[GYRO], 25, "/dev/input/event%d", ps4[GYRO]); - controller_event_fptrs[PS4_BT_GYRO] = open(ps4_events[GYRO], O_RDONLY); - snprintf(ps4_events[BUTTONS], 25, "/dev/input/event%d", ps4[BUTTONS]); - controller_event_fptrs[PS4_BT_BUTTONS] = open(ps4_events[BUTTONS], O_RDONLY); - *connected_controllers |= PS4_BT_ALL_BITS; - if (choice) { - fprintf(stderr, "%4d: PS4 BT TOUCH \n", PS4_BT_TOUCH_BIT); - fprintf(stderr, "%4d: PS4 BT GYRO\n", PS4_BT_GYRO_BIT); - fprintf(stderr, "%4d: PS4 BT BUTTONS\n", PS4_BT_BUTTONS_BIT); - fprintf(stderr, "%4d: PS4 BT TOUCH AND GYRO \n", PS4_BT_TOUCH_AND_GYRO); - fprintf(stderr, "%4d: PS4 BT TOUCH AND BUTTONS\n", PS4_BT_TOUCH_AND_BUTTONS); - fprintf(stderr, "%4d: PS4 BT GYRO AND BUTTONS\n", PS4_BT_GYRO_AND_BUTTONS); - fprintf(stderr, "%4d: ALL PS4 BT\n", PS4_BT_ALL_BITS); - } - } -} - -void open_ps4_wired(int* controller_event_fptrs, uint64_t* connected_controllers, int choice) { - int ps4[NUM_EVENTS_PS4] = { 0 }; - FILE* ps4_wired_pipe = popen("cat /proc/bus/input/devices | grep -A 5 \"^I: Bus=0003 Vendor=054c Product=09cc\" | grep \"event\" | cut -d 't' -f2 | paste - -s", "r"); - fscanf(ps4_wired_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_PS4][26]; - snprintf(ps4_events[TOUCHPAD], 25, "/dev/input/event%d", ps4[TOUCHPAD]); - controller_event_fptrs[PS4_WIRED_TOUCH] = open(ps4_events[TOUCHPAD], O_RDONLY); - snprintf(ps4_events[GYRO], 25, "/dev/input/event%d", ps4[GYRO]); - controller_event_fptrs[PS4_WIRED_GYRO] = open(ps4_events[GYRO], O_RDONLY); - snprintf(ps4_events[BUTTONS], 25, "/dev/input/event%d", ps4[BUTTONS]); - controller_event_fptrs[PS4_WIRED_BUTTONS] = open(ps4_events[BUTTONS], O_RDONLY); - *connected_controllers |= PS4_WIRED_ALL_BITS; - if (choice) { - fprintf(stderr, "%4d: PS4 WIRED TOUCH \n", PS4_WIRED_TOUCH_BIT); - fprintf(stderr, "%4d: PS4 WIRED GYRO\n", PS4_WIRED_GYRO_BIT); - fprintf(stderr, "%4d: PS4 WIRED BUTTONS\n", PS4_WIRED_BUTTONS_BIT); - fprintf(stderr, "%4d: PS4 WIRED TOUCH AND GYRO \n", PS4_WIRED_TOUCH_AND_GYRO); - fprintf(stderr, "%4d: PS4 WIRED TOUCH AND BUTTONS\n", PS4_WIRED_TOUCH_AND_BUTTONS); - fprintf(stderr, "%4d: PS4 WIRED GYRO AND BUTTONS\n", PS4_WIRED_GYRO_AND_BUTTONS); - fprintf(stderr, "%4d: ALL PS4 WIRED\n", PS4_WIRED_ALL_BITS); - } - } -} - -void open_steam(int* controller_event_fptrs, uint64_t* connected_controllers, int choice) { - int steam_event_number = 0; - FILE* steam_pipe = popen("cat /proc/bus/input/devices | grep -A 5 \"^I: Bus=0003 Vendor=28de Product=1102\" | tail -n 6 | grep \"event\" | cut -d \"t\" -f2", "r"); - fscanf(steam_pipe, "%2d", &steam_event_number); - if ( steam_event_number != 0) { - char steam_event_string[26]; - snprintf(steam_event_string, 25, "/dev/input/event%d", steam_event_number); - controller_event_fptrs[VALVE_STEAM] = open(steam_event_string, O_RDONLY); - *connected_controllers |= STEAM_BIT; - if (choice) { - fprintf(stderr, "%4d: STEAM \n", STEAM_BIT); - } - } -} - -void open_xbox_360(int* controller_event_fptrs, uint64_t* connected_controllers, int choice) { - int xbox_360_event_number = 0; - FILE* xbox_360_pipe = popen("cat /proc/bus/input/devices | grep -A 5 \"^I: Bus=0003 Vendor=045e Product=02a1\" | tail -n1 | cut -d \"t\" -f2", "r"); - fscanf(xbox_360_pipe, "%2d", &xbox_360_event_number); - if ( xbox_360_event_number != 0) { - char xbox_360_event_string[26]; - snprintf(xbox_360_event_string, 25, "/dev/input/event%d", xbox_360_event_number); - controller_event_fptrs[XBOX_360] = open(xbox_360_event_string, O_RDONLY); - *connected_controllers |= XBOX_360_BIT; - if (choice) { - fprintf(stderr, "%4d: XBOX 360 \n", XBOX_360_BIT); - } - } -} +#define BUFSIZE 45 +#define PATH_SIZE 26 - -void close_unneeded_files(int num_exceptions, int controller_event_fptrs[], ...) { - int* events_to_skip = (int *) malloc(sizeof(int) * num_exceptions); - va_list list_of_args; - va_start(list_of_args, controller_event_fptrs); - //get arguments - for (int i = 0; i < num_exceptions; ++i) { - events_to_skip[i] = va_arg(list_of_args, int); +void show_device_options(void) +{ + FILE* pipe = popen("cat /proc/bus/input/devices | \ + grep \"^N:\\|^H:\\|^$\" | \ + cut -d '=' -f2-", + "r"); + int character = 0; + character = getc(pipe); + while (character != EOF) { + printf("%c", character); + character = getc(pipe); } - //close all but the provided arguments - for (int i = 0; i < NUM_EVENTS; ++i) { - for (int j = 0; j < num_exceptions; ++j) { - if (i == events_to_skip[j]) { - goto SKIP_CLOSE; - } - } - close(controller_event_fptrs[i]); -SKIP_CLOSE: - } } -void print_one_event(int controller_event_fptrs[], int index, int event_number) { - struct input_event event1; +void print_one_event(unsigned long long event_num) +{ + struct input_event event; int event_size = sizeof(struct input_event); - size_t start_sec; - int initial_read = read(controller_event_fptrs[index], &event1, event_size); + unsigned long start_sec; + char path_to_event[PATH_SIZE]; + snprintf(path_to_event, PATH_SIZE - 1, "/dev/input/event%lld", event_num); + int fptr = open(path_to_event, O_RDWR); + int initial_read = read(fptr, &event, event_size); if (initial_read == -1) { fprintf(stderr, "PROBLEM READING FILE!\n"); exit(-1); } char buffer[BUFSIZE+1] = {0}; - start_sec = event1.time.tv_sec; - while (read(controller_event_fptrs[index], &event1, event_size) != -1) { - if (event1.type == 0) continue; -/* - printf("%d %lu.%06lu %d %3d %11d\n", - event_number, - (unsigned long) event1.time.tv_sec - start_sec, - (unsigned long) event1.time.tv_usec, - event1.type, - event1.code, - event1.value); -*/ -///* - snprintf(buffer, BUFSIZE, "%d %lu.%06lu %d %3d %11d\n", - event_number, - (unsigned long) event1.time.tv_sec - start_sec, - (unsigned long) event1.time.tv_usec, - event1.type, - event1.code, - event1.value); - write(STDOUT_FILENO, buffer, sizeof(buffer)); -//*/ + start_sec = event.time.tv_sec; + int string_size = 0; + while (read(fptr, &event, event_size) != -1) { + if (event.type == 0) continue; + string_size = snprintf(buffer, BUFSIZE, "%lld %lu.%06lu %d %3d %11d\n", + event_num, + (unsigned long) event.time.tv_sec - start_sec, + (unsigned long) event.time.tv_usec, + event.type, + event.code, + event.value); + write(STDOUT_FILENO, buffer, string_size); } fprintf(stderr, "DISCONNECTED\n"); } -void print_multiple_events(int num_exceptions, int controller_event_fptrs[], ...) { - pid_t pids[num_exceptions]; - //set all pids to -1 at start - for (int i = 0; i < num_exceptions; ++i) { pids[i] = -1; } - //get all the variadic pairs sent in and store them in an array of the appropriate size - struct event_pairs pairs[num_exceptions]; - va_list list_of_args; - va_start(list_of_args, controller_event_fptrs); - for (int i = 0; i < num_exceptions; ++i) { - pairs[i] = va_arg(list_of_args, struct event_pairs); - } + +void print_multiple_events(int num_events, unsigned long long event_nums[]) +{ //prepare to start printing inputs - struct input_event event[num_exceptions]; + struct input_event event[num_events]; int event_size = sizeof(struct input_event); - int read_time = read(controller_event_fptrs[pairs[0].event_fptr_index], &event[0], event_size); //set a start_sec variable to be used across processes for consistent time - if (read_time == -1) { - fprintf(stderr, "PROBLEM READING FILE FOR TIME!\n"); + //open events and get file pointers + char path_to_event[PATH_SIZE]; + int event_fptrs[num_events]; + for (int i = 0; i < num_events; ++i) { + snprintf(path_to_event, PATH_SIZE - 1, "/dev/input/event%lld", event_nums[i]); + event_fptrs[i] = open(path_to_event, O_RDWR); + if (event_fptrs[i] == -1) { + fprintf(stderr, "PROBLEM OPENING FILE: %s\n", path_to_event); + } + } + //make sure there was no error + int initial_read = read(event_fptrs[0], &event[0], event_size); + if (initial_read == -1) { + fprintf(stderr, "PROBLEM READING FILE!\n"); exit(-1); } + //shared memory for all processes to get usec unsigned long start_sec = event[0].time.tv_sec; - //create shared memory to hold the value of the microseconds to be shared among all of the forked processes unsigned long* shared_usec = mmap(NULL, 4096, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0); //create the amount of processes appropriate to the number of events to print - for (int i = 0; i < num_exceptions - 1; ++i) { + pid_t pids[num_events]; + for (int i = 0; i < num_events; ++i) { + pids[i] = -1; + } + for (int i = 0; i < num_events - 1; ++i) { pids[i] = fork(); if (pids[i] == 0) break; } //mark the parent bool isParent = true; - for (int i = 0; i < num_exceptions; ++i) { + for (int i = 0; i < num_events; ++i) { if (pids[i] == 0) isParent &= false; } //find and run code just for the parent process (first event (a.k.a. index 0)) if (isParent) { char buffer[BUFSIZE+1]; - int initial_read = read(controller_event_fptrs[pairs[0].event_fptr_index], &event[0], event_size); + int initial_read = read(event_fptrs[0], &event[0], event_size); if (initial_read == -1) { fprintf(stderr, "PROBLEM READING FILE!\n"); exit(-1); } - while (read(controller_event_fptrs[pairs[0].event_fptr_index], &event[0], event_size) != -1) { + int string_size = 0; + while (read(event_fptrs[0], &event[0], event_size) != -1) { *shared_usec = event[0].time.tv_usec; if (event[0].type == 0) continue; -///* - printf("%d %lu.%-6lu %d %3d %11d\n", - pairs[0].event_user_num, - event[0].time.tv_sec - start_sec, - *shared_usec, - event[0].type, - event[0].code, - event[0].value); -//*/ -/* - snprintf(buffer, BUFSIZE, "%d %lu.%-6lu %d %3d %11d\n", - pairs[0].event_user_num, + string_size = snprintf(buffer, BUFSIZE, "%lld %lu.%-6lu %d %3d %11d\n", + event_nums[0], event[0].time.tv_sec - start_sec, event[0].time.tv_usec, event[0].type, event[0].code, event[0].value); - write(STDOUT_FILENO, buffer, sizeof(buffer)); -*/ + write(STDOUT_FILENO, buffer, string_size); } fprintf(stderr, "DISCONNECTED\n"); } //find the child process(es) and run the correct code for each (event #2 onwards) (a.k.a. index 1+)) - for (int i = 0; i < num_exceptions; ++i) { + for (int i = 0; i < num_events; ++i) { if (pids[i] == 0) { //put the rest of the code in here? char buffer[BUFSIZE+1]; - int initial_read = read(controller_event_fptrs[pairs[i+1].event_fptr_index], &event[i+1], event_size); + int initial_read = read(event_fptrs[i+1], &event[i+1], event_size); if (initial_read == -1) { fprintf(stderr, "PROBLEM READING FILE!\n"); exit(-1); } - while (read(controller_event_fptrs[pairs[i+1].event_fptr_index], &event[i+1], event_size) != -1) { + int string_size = 0; + while (read(event_fptrs[i+1], &event[i+1], event_size) != -1) { if (event[i+1].type == 0) continue; -///* - printf("%d %zu.%-6zu %d %3d %11d\n", - pairs[i+1].event_user_num, - event[i+1].time.tv_sec - start_sec, - *shared_usec, - //event[i+1].time.tv_usec, - event[i+1].type, - event[i+1].code, - event[i+1].value); -//*/ -/* - snprintf(buffer, BUFSIZE, "%d %zu.%-6zu %d %3d %11d\n", - pairs[i+1].event_user_num, + string_size = snprintf(buffer, BUFSIZE, "%lld %zu.%-6zu %d %3d %11d\n", + event_nums[i+1], event[i+1].time.tv_sec - start_sec, event[i+1].time.tv_usec, event[i+1].type, event[i+1].code, event[i+1].value); - write(STDOUT_FILENO, buffer, sizeof(buffer)); -*/ + write(STDOUT_FILENO, buffer, string_size); } fprintf(stderr, "DISCONNECTED\n"); } -- cgit v1.2.1