From c205299c026ebe668b7f9cac3c3aefcdbbbaebce Mon Sep 17 00:00:00 2001 From: Jef Driesen Date: Fri, 19 Apr 2019 20:52:12 +0200 Subject: [PATCH] Re-implement the set_latency function as an ioctl The set_latency function is the perfect example of a feature that should be implemented as an ioctl: it's only implemented by a single driver, and the functionality is also highly platform specific. --- include/libdivecomputer/custom.h | 1 - include/libdivecomputer/iostream.h | 16 ---------------- include/libdivecomputer/serial.h | 11 +++++++++++ src/bluetooth.c | 1 - src/custom.c | 13 ------------- src/iostream-private.h | 2 -- src/iostream.c | 11 ----------- src/irda.c | 1 - src/libdivecomputer.symbols | 1 - src/serial_posix.c | 9 ++++++--- src/serial_win32.c | 15 ++++++--------- src/usbhid.c | 1 - 12 files changed, 23 insertions(+), 59 deletions(-) diff --git a/include/libdivecomputer/custom.h b/include/libdivecomputer/custom.h index abaf0e7..dd50e21 100644 --- a/include/libdivecomputer/custom.h +++ b/include/libdivecomputer/custom.h @@ -32,7 +32,6 @@ extern "C" { typedef struct dc_custom_cbs_t { dc_status_t (*set_timeout) (void *userdata, int timeout); - dc_status_t (*set_latency) (void *userdata, unsigned int value); dc_status_t (*set_break) (void *userdata, unsigned int value); dc_status_t (*set_dtr) (void *userdata, unsigned int value); dc_status_t (*set_rts) (void *userdata, unsigned int value); diff --git a/include/libdivecomputer/iostream.h b/include/libdivecomputer/iostream.h index 8715496..b09cba1 100644 --- a/include/libdivecomputer/iostream.h +++ b/include/libdivecomputer/iostream.h @@ -123,22 +123,6 @@ dc_iostream_get_transport (dc_iostream_t *iostream); dc_status_t dc_iostream_set_timeout (dc_iostream_t *iostream, int timeout); -/** - * Set the receive latency. - * - * The effect of this setting is highly platform and driver specific. On - * Windows it does nothing at all, on Linux it controls the low latency - * flag (e.g. only zero vs non-zero latency), and on Mac OS X it sets - * the receive latency as requested. - * - * @param[in] iostream A valid I/O stream. - * @param[in] value The latency in milliseconds. - * @returns #DC_STATUS_SUCCESS on success, or another #dc_status_t code - * on failure. - */ -dc_status_t -dc_iostream_set_latency (dc_iostream_t *iostream, unsigned int value); - /** * Set the state of the break condition. * diff --git a/include/libdivecomputer/serial.h b/include/libdivecomputer/serial.h index f1596b3..917ba7c 100644 --- a/include/libdivecomputer/serial.h +++ b/include/libdivecomputer/serial.h @@ -27,6 +27,7 @@ #include "iostream.h" #include "iterator.h" #include "descriptor.h" +#include "ioctl.h" #ifdef __cplusplus extern "C" { @@ -77,6 +78,16 @@ dc_serial_iterator_new (dc_iterator_t **iterator, dc_context_t *context, dc_desc dc_status_t dc_serial_open (dc_iostream_t **iostream, dc_context_t *context, const char *name); +/** + * Set the receive latency in milliseconds. + * + * The effect of this setting is highly platform and driver specific. On + * Windows it does nothing at all, on Linux it controls the low latency + * flag (e.g. only zero vs non-zero latency), and on Mac OS X it sets + * the receive latency as requested. + */ +#define DC_IOCTL_SERIAL_SET_LATENCY DC_IOCTL_IOW('s', 0, sizeof(unsigned int)) + #ifdef __cplusplus } #endif /* __cplusplus */ diff --git a/src/bluetooth.c b/src/bluetooth.c index 23e2006..282a31a 100644 --- a/src/bluetooth.c +++ b/src/bluetooth.c @@ -99,7 +99,6 @@ static const dc_iterator_vtable_t dc_bluetooth_iterator_vtable = { static const dc_iostream_vtable_t dc_bluetooth_vtable = { sizeof(dc_socket_t), dc_socket_set_timeout, /* set_timeout */ - NULL, /* set_latency */ NULL, /* set_break */ NULL, /* set_dtr */ NULL, /* set_rts */ diff --git a/src/custom.c b/src/custom.c index 4a4ead4..688a8b3 100644 --- a/src/custom.c +++ b/src/custom.c @@ -28,7 +28,6 @@ #include "context-private.h" static dc_status_t dc_custom_set_timeout (dc_iostream_t *abstract, int timeout); -static dc_status_t dc_custom_set_latency (dc_iostream_t *abstract, unsigned int value); static dc_status_t dc_custom_set_break (dc_iostream_t *abstract, unsigned int value); static dc_status_t dc_custom_set_dtr (dc_iostream_t *abstract, unsigned int value); static dc_status_t dc_custom_set_rts (dc_iostream_t *abstract, unsigned int value); @@ -55,7 +54,6 @@ typedef struct dc_custom_t { static const dc_iostream_vtable_t dc_custom_vtable = { sizeof(dc_custom_t), dc_custom_set_timeout, /* set_timeout */ - dc_custom_set_latency, /* set_latency */ dc_custom_set_break, /* set_break */ dc_custom_set_dtr, /* set_dtr */ dc_custom_set_rts, /* set_rts */ @@ -108,17 +106,6 @@ dc_custom_set_timeout (dc_iostream_t *abstract, int timeout) return custom->callbacks.set_timeout (custom->userdata, timeout); } -static dc_status_t -dc_custom_set_latency (dc_iostream_t *abstract, unsigned int value) -{ - dc_custom_t *custom = (dc_custom_t *) abstract; - - if (custom->callbacks.set_latency == NULL) - return DC_STATUS_SUCCESS; - - return custom->callbacks.set_latency (custom->userdata, value); -} - static dc_status_t dc_custom_set_break (dc_iostream_t *abstract, unsigned int value) { diff --git a/src/iostream-private.h b/src/iostream-private.h index cdf1b16..ee9f267 100644 --- a/src/iostream-private.h +++ b/src/iostream-private.h @@ -43,8 +43,6 @@ struct dc_iostream_vtable_t { dc_status_t (*set_timeout) (dc_iostream_t *iostream, int timeout); - dc_status_t (*set_latency) (dc_iostream_t *iostream, unsigned int value); - dc_status_t (*set_break) (dc_iostream_t *iostream, unsigned int value); dc_status_t (*set_dtr) (dc_iostream_t *iostream, unsigned int value); diff --git a/src/iostream.c b/src/iostream.c index fbfeec9..51713d1 100644 --- a/src/iostream.c +++ b/src/iostream.c @@ -87,17 +87,6 @@ dc_iostream_set_timeout (dc_iostream_t *iostream, int timeout) return iostream->vtable->set_timeout (iostream, timeout); } -dc_status_t -dc_iostream_set_latency (dc_iostream_t *iostream, unsigned int value) -{ - if (iostream == NULL || iostream->vtable->set_latency == NULL) - return DC_STATUS_SUCCESS; - - INFO (iostream->context, "Latency: value=%i", value); - - return iostream->vtable->set_latency (iostream, value); -} - dc_status_t dc_iostream_set_break (dc_iostream_t *iostream, unsigned int value) { diff --git a/src/irda.c b/src/irda.c index 66e1409..214e39f 100644 --- a/src/irda.c +++ b/src/irda.c @@ -91,7 +91,6 @@ static const dc_iterator_vtable_t dc_irda_iterator_vtable = { static const dc_iostream_vtable_t dc_irda_vtable = { sizeof(dc_socket_t), dc_socket_set_timeout, /* set_timeout */ - NULL, /* set_latency */ NULL, /* set_break */ NULL, /* set_dtr */ NULL, /* set_rts */ diff --git a/src/libdivecomputer.symbols b/src/libdivecomputer.symbols index 613e360..b17d60b 100644 --- a/src/libdivecomputer.symbols +++ b/src/libdivecomputer.symbols @@ -36,7 +36,6 @@ dc_descriptor_get_transports dc_iostream_get_transport dc_iostream_set_timeout -dc_iostream_set_latency dc_iostream_set_break dc_iostream_set_dtr dc_iostream_set_rts diff --git a/src/serial_posix.c b/src/serial_posix.c index 4b478aa..897b428 100644 --- a/src/serial_posix.c +++ b/src/serial_posix.c @@ -67,7 +67,6 @@ static dc_status_t dc_serial_iterator_next (dc_iterator_t *iterator, void *item) static dc_status_t dc_serial_iterator_free (dc_iterator_t *iterator); static dc_status_t dc_serial_set_timeout (dc_iostream_t *iostream, int timeout); -static dc_status_t dc_serial_set_latency (dc_iostream_t *iostream, unsigned int value); static dc_status_t dc_serial_set_break (dc_iostream_t *iostream, unsigned int value); static dc_status_t dc_serial_set_dtr (dc_iostream_t *iostream, unsigned int value); static dc_status_t dc_serial_set_rts (dc_iostream_t *iostream, unsigned int value); @@ -118,7 +117,6 @@ static const dc_iterator_vtable_t dc_serial_iterator_vtable = { static const dc_iostream_vtable_t dc_serial_vtable = { sizeof(dc_serial_t), dc_serial_set_timeout, /* set_timeout */ - dc_serial_set_latency, /* set_latency */ dc_serial_set_break, /* set_break */ dc_serial_set_dtr, /* set_dtr */ dc_serial_set_rts, /* set_rts */ @@ -854,7 +852,12 @@ out: static dc_status_t dc_serial_ioctl (dc_iostream_t *abstract, unsigned int request, void *data, size_t size) { - return DC_STATUS_UNSUPPORTED; + switch (request) { + case DC_IOCTL_SERIAL_SET_LATENCY: + return dc_serial_set_latency (abstract, *(unsigned int *) data); + default: + return DC_STATUS_UNSUPPORTED; + } } static dc_status_t diff --git a/src/serial_win32.c b/src/serial_win32.c index d21247a..3cb10ff 100644 --- a/src/serial_win32.c +++ b/src/serial_win32.c @@ -36,7 +36,6 @@ static dc_status_t dc_serial_iterator_next (dc_iterator_t *iterator, void *item) static dc_status_t dc_serial_iterator_free (dc_iterator_t *iterator); static dc_status_t dc_serial_set_timeout (dc_iostream_t *iostream, int timeout); -static dc_status_t dc_serial_set_latency (dc_iostream_t *iostream, unsigned int value); static dc_status_t dc_serial_set_break (dc_iostream_t *iostream, unsigned int value); static dc_status_t dc_serial_set_dtr (dc_iostream_t *iostream, unsigned int value); static dc_status_t dc_serial_set_rts (dc_iostream_t *iostream, unsigned int value); @@ -93,7 +92,6 @@ static const dc_iterator_vtable_t dc_serial_iterator_vtable = { static const dc_iostream_vtable_t dc_serial_vtable = { sizeof(dc_serial_t), dc_serial_set_timeout, /* set_timeout */ - dc_serial_set_latency, /* set_latency */ dc_serial_set_break, /* set_break */ dc_serial_set_dtr, /* set_dtr */ dc_serial_set_rts, /* set_rts */ @@ -546,12 +544,6 @@ dc_serial_set_timeout (dc_iostream_t *abstract, int timeout) return DC_STATUS_SUCCESS; } -static dc_status_t -dc_serial_set_latency (dc_iostream_t *abstract, unsigned int value) -{ - return DC_STATUS_SUCCESS; -} - static dc_status_t dc_serial_poll (dc_iostream_t *abstract, int timeout) { @@ -687,7 +679,12 @@ out: static dc_status_t dc_serial_ioctl (dc_iostream_t *abstract, unsigned int request, void *data, size_t size) { - return DC_STATUS_UNSUPPORTED; + switch (request) { + case DC_IOCTL_SERIAL_SET_LATENCY: + return DC_STATUS_SUCCESS; + default: + return DC_STATUS_UNSUPPORTED; + } } static dc_status_t diff --git a/src/usbhid.c b/src/usbhid.c index f56d115..e26d42b 100644 --- a/src/usbhid.c +++ b/src/usbhid.c @@ -139,7 +139,6 @@ static const dc_iterator_vtable_t dc_usbhid_iterator_vtable = { static const dc_iostream_vtable_t dc_usbhid_vtable = { sizeof(dc_usbhid_t), dc_usbhid_set_timeout, /* set_timeout */ - NULL, /* set_latency */ NULL, /* set_break */ NULL, /* set_dtr */ NULL, /* set_rts */