diff --git a/input_dev.c b/input_dev.c index 42e631b..c99260f 100644 --- a/input_dev.c +++ b/input_dev.c @@ -240,9 +240,15 @@ static void* iio_read_thread_func(void* ptr) { // clear out flags msg->flags = 0x00000000U; - if (queue_push(ctx->queue, (void*)msg) != 0) { - fprintf(stderr, "Error pushing event.\n"); + const uint32_t input_filter_res = ctx->input_filter_fn(msg->ev, &msg->ev_size, &msg->ev_count); + if (((input_filter_res & INPUT_FILTER_FLAGS_DO_NOT_EMIT) == 0) && (msg->ev_count > 0)) { + if (queue_push(ctx->queue, (void*)msg) != 0) { + fprintf(stderr, "Error pushing iio event.\n"); + // flag the memory to be safe to reuse + msg->flags |= MESSAGE_FLAGS_HANDLE_DONE; + } + } else { // flag the memory to be safe to reuse msg->flags |= MESSAGE_FLAGS_HANDLE_DONE; } diff --git a/main.c b/main.c index acd426d..81677e6 100644 --- a/main.c +++ b/main.c @@ -4,14 +4,13 @@ #include "output_dev.h" #include "platform.h" -queue_t gamepad_ev; - +queue_t global_ev_queue; static output_dev_t out_gamepadd_dev = { .gamepad_fd = -1, .imu_fd = -1, .crtl_flags = 0x00000000U, - .queue = &gamepad_ev, + .queue = &global_ev_queue, }; static iio_filters_t in_iio_filters = { @@ -22,7 +21,7 @@ static input_dev_t in_iio_dev = { .dev_type = input_dev_type_iio, .crtl_flags = 0x00000000U, .iio_filters = &in_iio_filters, - .queue = &gamepad_ev, + .queue = &global_ev_queue, .input_filter_fn = input_filter_imu_identity, }; @@ -34,7 +33,7 @@ static input_dev_t in_asus_kb_1_dev = { .dev_type = input_dev_type_uinput, .crtl_flags = 0x00000000U, .ev_filters = &in_asus_kb_1_filters, - .queue = &gamepad_ev, + .queue = &global_ev_queue, .input_filter_fn = input_filter_asus_kb, }; @@ -46,7 +45,7 @@ static input_dev_t in_asus_kb_2_dev = { .dev_type = input_dev_type_uinput, .crtl_flags = 0x00000000U, .ev_filters = &in_asus_kb_2_filters, - .queue = &gamepad_ev, + .queue = &global_ev_queue, .input_filter_fn = input_filter_asus_kb, }; @@ -58,7 +57,7 @@ static input_dev_t in_asus_kb_3_dev = { .dev_type = input_dev_type_uinput, .crtl_flags = 0x00000000U, .ev_filters = &in_asus_kb_3_filters, - .queue = &gamepad_ev, + .queue = &global_ev_queue, .input_filter_fn = input_filter_asus_kb, }; @@ -70,7 +69,7 @@ static input_dev_t in_xbox_dev = { .dev_type = input_dev_type_uinput, .crtl_flags = 0x00000000U, .ev_filters = &in_xbox_filters, - .queue = &gamepad_ev, + .queue = &global_ev_queue, .input_filter_fn = input_filter_identity, }; @@ -94,7 +93,7 @@ void sig_handler(int signo) int main(int argc, char ** argv) { init_global_mode(); - queue_init(&gamepad_ev, 32); + queue_init(&global_ev_queue, 128); int imu_fd = create_output_dev("/dev/uinput", output_dev_imu); if (imu_fd < 0) { diff --git a/output_dev.c b/output_dev.c index 0a0d662..79d8b36 100644 --- a/output_dev.c +++ b/output_dev.c @@ -449,6 +449,8 @@ void *output_dev_thread_func(void *ptr) { fd = out_dev->imu_fd; } else if ((msg->flags & INPUT_FILTER_FLAGS_MOUSE) != 0) { fd = out_dev->mouse_fd; + } else { + fd = out_dev->gamepad_fd; } for (uint32_t i = 0; i < msg->ev_count; ++i) { @@ -464,12 +466,6 @@ void *output_dev_thread_func(void *ptr) { ev.time = now; } - /* - if ((ev.type == EV_KEY) && (ev.code == KEY_PROG1)) { // To be wired to F16 - ev.code = KEY_F12; - } - */ - #if defined(INCLUDE_OUTPUT_DEBUG) printf( "Output: Received event %s (%s): %d\n", diff --git a/output_dev.h b/output_dev.h index 55372c2..9f99a21 100644 --- a/output_dev.h +++ b/output_dev.h @@ -2,13 +2,11 @@ #include "queue.h" -/* // Emulates a "Generic" controller: #define OUTPUT_DEV_NAME "ROGueENEMY" #define OUTPUT_DEV_VENDOR_ID 0x108c #define OUTPUT_DEV_PRODUCT_ID 0x0323 #define OUTPUT_DEV_VERSION 0x0111 -*/ /* // Emulates a steam controller @@ -27,14 +25,14 @@ #define OUTPUT_DEV_BUS_TYPE BUS_BLUETOOTH */ - +/* // Emulates a DualShock controller #define OUTPUT_DEV_NAME "Sony Interactive Entertainment DualSense Wireless Controller" #define OUTPUT_DEV_VENDOR_ID 0x054c #define OUTPUT_DEV_PRODUCT_ID 0x0ce6 #define OUTPUT_DEV_VERSION 0x8111 #define OUTPUT_DEV_BUS_TYPE BUS_USB - +*/ #define PHYS_STR "00:11:22:33:44:55"