| summaryrefslogtreecommitdiff |
diff options
| author | Nathanael Sensfelder <SpamShield0@MultiAgentSystems.org> | 2021-05-03 18:37:45 +0200 |
|---|---|---|
| committer | Nathanael Sensfelder <SpamShield0@MultiAgentSystems.org> | 2021-05-03 18:37:45 +0200 |
| commit | b3d9e2e69163ff17a0023d08daa5ab0f3e1551a0 (patch) | |
| tree | 1217fd58b035e7f19faed61fee8d800fa53c1a93 | |
| parent | f8b8bca54f7efc5f1c442d87e57848b3e2e52613 (diff) | |
Potential missed events fix.
| -rw-r--r-- | include/relabsd/device/physical_device.h | 3 | ||||
| -rw-r--r-- | src/device/physical/physical_device.c | 36 | ||||
| -rw-r--r-- | src/server/conversion_main_loop.c | 35 |
3 files changed, 45 insertions, 29 deletions
diff --git a/include/relabsd/device/physical_device.h b/include/relabsd/device/physical_device.h index 9bee391..c6dc81f 100644 --- a/include/relabsd/device/physical_device.h +++ b/include/relabsd/device/physical_device.h @@ -23,7 +23,8 @@ void relabsd_physical_device_close /* * Returns -1 on (warning) error, - * 0 on successful read. + * 0 if there is nothing to read, + * 1 if something was read (and there may be more to read). * * The 'input_*' parameters do not need to be initialized, as the function will * do that for you (on success). diff --git a/src/device/physical/physical_device.c b/src/device/physical/physical_device.c index cf74b3c..797c734 100644 --- a/src/device/physical/physical_device.c +++ b/src/device/physical/physical_device.c @@ -148,14 +148,13 @@ int relabsd_physical_device_read * through them in order. * TODO: add an option to allow users to drop events when late. */ - device->is_late ? + (device->is_late == 1) ? LIBEVDEV_READ_FLAG_SYNC : LIBEVDEV_READ_FLAG_NORMAL ) /* "The fd is not in O_NONBLOCK and a read may block." */ | LIBEVDEV_READ_FLAG_BLOCKING - ) - , + ), &event ); @@ -166,7 +165,7 @@ int relabsd_physical_device_read RELABSD_DEBUG ( RELABSD_DEBUG_REAL_EVENTS, - "Valid event received: {type = %s; code = %s; value = %d}.", + "SUCCESS Valid event received: {type = %s; code = %s; value = %d}.", libevdev_event_type_get_name(event.type), libevdev_event_code_get_name(event.type, event.code), event.value @@ -176,7 +175,9 @@ int relabsd_physical_device_read *input_code = event.code; *input_value = event.value; - return 0; + device->is_late = 0; + + return 1; /* Code indicating that we are late. */ case LIBEVDEV_READ_STATUS_SYNC: @@ -187,21 +188,26 @@ int relabsd_physical_device_read * so we don't actually have any input event in hand. */ - /* FIXME: Really make sure this cannot recurse a second time. */ - return - relabsd_physical_device_read - ( - device, - input_type, - input_code, - input_value - ); + *input_type = event.type; + *input_code = event.code; + *input_value = event.value; + + RELABSD_DEBUG + ( + RELABSD_DEBUG_REAL_EVENTS, + "SYNC Valid event received: {type = %s; code = %s; value = %d}.", + libevdev_event_type_get_name(event.type), + libevdev_event_code_get_name(event.type, event.code), + event.value + ); + + return 1; /* No event to read. */ case -EAGAIN: device->is_late = 0; - return -1; + return 0; default: RELABSD_FATAL diff --git a/src/server/conversion_main_loop.c b/src/server/conversion_main_loop.c index 5a0dc7d..174ff26 100644 --- a/src/server/conversion_main_loop.c +++ b/src/server/conversion_main_loop.c @@ -17,27 +17,33 @@ /******************************************************************************/ /**** LOCAL FUNCTIONS *********************************************************/ /******************************************************************************/ -static void convert_input + +/* + * Returned values: + * -1 -> error. + * 0 -> No more events available. + * 1 -> Maybe more events available. + */ +static int convert_input ( struct relabsd_server server [const restrict static 1] ) { unsigned int input_type, input_code; - int value; + int value, return_code; - if - ( + return_code = relabsd_physical_device_read ( &(server->physical_device), &input_type, &input_code, &value - ) - < 0 - ) + ); + + if (return_code <= 0) { - return; + return 0; } if (input_type == EV_REL) @@ -52,7 +58,7 @@ static void convert_input if (axis_name == RELABSD_UNKNOWN) { - return; + return return_code; } axis = relabsd_parameters_get_axis(axis_name, &(server->parameters)); @@ -83,7 +89,7 @@ static void convert_input { case -1: /* Doesn't want the event to be transmitted. */ - return; + return return_code; case 1: (void) relabsd_virtual_device_write_evdev_event @@ -99,7 +105,7 @@ static void convert_input 0, &(server->virtual_device) ); - return; + return return_code; case 0: (void) relabsd_virtual_device_write_evdev_event @@ -109,7 +115,7 @@ static void convert_input input_code, value ); - return; + return return_code; } } else @@ -123,6 +129,8 @@ static void convert_input value ); } + + return return_code; } static void reset_axes @@ -266,7 +274,8 @@ int relabsd_server_conversion_loop ) { pthread_mutex_lock(&(server->mutex)); - convert_input(server); + /* convert all events in the libevdev buffer. */ + while (convert_input(server) > 0); pthread_mutex_unlock(&(server->mutex)); } |


