From ef2402eff58b6754d02dd7748d9d02450720cf97 Mon Sep 17 00:00:00 2001 From: Jef Driesen Date: Sat, 22 Jul 2017 21:45:12 +0200 Subject: [PATCH] Integrate the new I/O interface in the public api Currently the dive computer backends are responsible for opening (and closing) the underlying I/O stream internally. The consequence is that each backend is hardwired to a specific transport type (e.g. serial, irda or usbhid). In order to remove this dependency and support more than one transport type in the same backend, the opening (and closing) of the I/O stream is moved to the application. The dc_device_open() function is modified to accept a pointer to the I/O stream, instead of a string with the device node (which only makes sense for serial communication). The dive computer backends only depend on the common I/O interface. --- examples/dctool_download.c | 3 +- examples/dctool_dump.c | 3 +- examples/dctool_fwupdate.c | 3 +- examples/dctool_read.c | 3 +- examples/dctool_timesync.c | 3 +- examples/dctool_write.c | 3 +- include/libdivecomputer/device.h | 3 +- src/citizen_aqualand.c | 38 ++----------- src/citizen_aqualand.h | 3 +- src/cochran_commander.c | 39 +++----------- src/cochran_commander.h | 3 +- src/cressi_edy.c | 30 +++-------- src/cressi_edy.h | 3 +- src/cressi_leonardo.c | 43 +++------------ src/cressi_leonardo.h | 3 +- src/device.c | 68 ++++++++++++------------ src/diverite_nitekq.c | 26 ++------- src/diverite_nitekq.h | 3 +- src/divesystem_idive.c | 38 ++----------- src/divesystem_idive.h | 3 +- src/hw_frog.c | 26 ++------- src/hw_frog.h | 3 +- src/hw_ostc.c | 38 ++----------- src/hw_ostc.h | 3 +- src/hw_ostc3.c | 24 ++------- src/hw_ostc3.h | 3 +- src/mares_common.c | 4 +- src/mares_common.h | 5 +- src/mares_darwin.c | 40 +++----------- src/mares_darwin.h | 3 +- src/mares_iconhd.c | 44 +++------------ src/mares_iconhd.h | 3 +- src/mares_nemo.c | 42 +++------------ src/mares_nemo.h | 3 +- src/mares_puck.c | 44 +++------------ src/mares_puck.h | 3 +- src/oceanic_atom2.c | 26 ++------- src/oceanic_atom2.h | 3 +- src/oceanic_veo250.c | 32 +++-------- src/oceanic_veo250.h | 3 +- src/oceanic_vtpro.c | 34 ++++-------- src/oceanic_vtpro.h | 3 +- src/reefnet_sensus.c | 24 ++------- src/reefnet_sensus.h | 3 +- src/reefnet_sensuspro.c | 38 ++----------- src/reefnet_sensuspro.h | 3 +- src/reefnet_sensusultra.c | 38 ++----------- src/reefnet_sensusultra.h | 3 +- src/shearwater_common.c | 25 ++------- src/shearwater_common.h | 8 ++- src/shearwater_petrel.c | 12 ++--- src/shearwater_petrel.h | 3 +- src/shearwater_predator.c | 18 ++----- src/shearwater_predator.h | 3 +- src/suunto_d9.c | 42 +++------------ src/suunto_d9.h | 3 +- src/suunto_eon.c | 40 +++----------- src/suunto_eon.h | 3 +- src/suunto_eonsteel.c | 35 ++---------- src/suunto_eonsteel.h | 3 +- src/suunto_solution.c | 40 +++----------- src/suunto_solution.h | 3 +- src/suunto_vyper.c | 40 +++----------- src/suunto_vyper.h | 3 +- src/suunto_vyper2.c | 34 +++--------- src/suunto_vyper2.h | 3 +- src/uwatec_aladin.c | 42 +++------------ src/uwatec_aladin.h | 3 +- src/uwatec_g2.c | 44 ++------------- src/uwatec_g2.h | 3 +- src/uwatec_memomouse.c | 42 +++------------ src/uwatec_memomouse.h | 3 +- src/uwatec_meridian.c | 40 +++----------- src/uwatec_meridian.h | 3 +- src/uwatec_smart.c | 91 ++------------------------------ src/uwatec_smart.h | 3 +- src/zeagle_n2ition3.c | 38 ++----------- src/zeagle_n2ition3.h | 3 +- 78 files changed, 320 insertions(+), 1132 deletions(-) diff --git a/examples/dctool_download.c b/examples/dctool_download.c index 2c8f43d..56f36b1 100644 --- a/examples/dctool_download.c +++ b/examples/dctool_download.c @@ -155,6 +155,7 @@ static dc_status_t download (dc_context_t *context, dc_descriptor_t *descriptor, const char *devname, const char *cachedir, dc_buffer_t *fingerprint, dctool_output_t *output) { dc_status_t rc = DC_STATUS_SUCCESS; + dc_iostream_t *iostream = NULL; dc_device_t *device = NULL; dc_buffer_t *ofingerprint = NULL; @@ -163,7 +164,7 @@ download (dc_context_t *context, dc_descriptor_t *descriptor, const char *devnam dc_descriptor_get_vendor (descriptor), dc_descriptor_get_product (descriptor), devname ? devname : "null"); - rc = dc_device_open (&device, context, descriptor, devname); + rc = dc_device_open (&device, context, descriptor, iostream); if (rc != DC_STATUS_SUCCESS) { ERROR ("Error opening the device."); goto cleanup; diff --git a/examples/dctool_dump.c b/examples/dctool_dump.c index ce59899..26450f4 100644 --- a/examples/dctool_dump.c +++ b/examples/dctool_dump.c @@ -43,6 +43,7 @@ static dc_status_t dump (dc_context_t *context, dc_descriptor_t *descriptor, const char *devname, dc_buffer_t *fingerprint, dc_buffer_t *buffer) { dc_status_t rc = DC_STATUS_SUCCESS; + dc_iostream_t *iostream = NULL; dc_device_t *device = NULL; // Open the device. @@ -50,7 +51,7 @@ dump (dc_context_t *context, dc_descriptor_t *descriptor, const char *devname, d dc_descriptor_get_vendor (descriptor), dc_descriptor_get_product (descriptor), devname ? devname : "null"); - rc = dc_device_open (&device, context, descriptor, devname); + rc = dc_device_open (&device, context, descriptor, iostream); if (rc != DC_STATUS_SUCCESS) { ERROR ("Error opening the device."); goto cleanup; diff --git a/examples/dctool_fwupdate.c b/examples/dctool_fwupdate.c index 13b4fe3..022724e 100644 --- a/examples/dctool_fwupdate.c +++ b/examples/dctool_fwupdate.c @@ -44,6 +44,7 @@ static dc_status_t fwupdate (dc_context_t *context, dc_descriptor_t *descriptor, const char *devname, const char *hexfile) { dc_status_t rc = DC_STATUS_SUCCESS; + dc_iostream_t *iostream = NULL; dc_device_t *device = NULL; // Open the device. @@ -51,7 +52,7 @@ fwupdate (dc_context_t *context, dc_descriptor_t *descriptor, const char *devnam dc_descriptor_get_vendor (descriptor), dc_descriptor_get_product (descriptor), devname ? devname : "null"); - rc = dc_device_open (&device, context, descriptor, devname); + rc = dc_device_open (&device, context, descriptor, iostream); if (rc != DC_STATUS_SUCCESS) { ERROR ("Error opening the device."); goto cleanup; diff --git a/examples/dctool_read.c b/examples/dctool_read.c index 85bd9de..4e71660 100644 --- a/examples/dctool_read.c +++ b/examples/dctool_read.c @@ -42,6 +42,7 @@ static dc_status_t doread (dc_context_t *context, dc_descriptor_t *descriptor, const char *devname, unsigned int address, dc_buffer_t *buffer) { dc_status_t rc = DC_STATUS_SUCCESS; + dc_iostream_t *iostream = NULL; dc_device_t *device = NULL; // Open the device. @@ -49,7 +50,7 @@ doread (dc_context_t *context, dc_descriptor_t *descriptor, const char *devname, dc_descriptor_get_vendor (descriptor), dc_descriptor_get_product (descriptor), devname ? devname : "null"); - rc = dc_device_open (&device, context, descriptor, devname); + rc = dc_device_open (&device, context, descriptor, iostream); if (rc != DC_STATUS_SUCCESS) { ERROR ("Error opening the device."); goto cleanup; diff --git a/examples/dctool_timesync.c b/examples/dctool_timesync.c index 3a59af5..6ef42ff 100644 --- a/examples/dctool_timesync.c +++ b/examples/dctool_timesync.c @@ -42,6 +42,7 @@ static dc_status_t do_timesync (dc_context_t *context, dc_descriptor_t *descriptor, const char *devname, const dc_datetime_t *datetime) { dc_status_t rc = DC_STATUS_SUCCESS; + dc_iostream_t *iostream = NULL; dc_device_t *device = NULL; // Open the device. @@ -49,7 +50,7 @@ do_timesync (dc_context_t *context, dc_descriptor_t *descriptor, const char *dev dc_descriptor_get_vendor (descriptor), dc_descriptor_get_product (descriptor), devname ? devname : "null"); - rc = dc_device_open (&device, context, descriptor, devname); + rc = dc_device_open (&device, context, descriptor, iostream); if (rc != DC_STATUS_SUCCESS) { ERROR ("Error opening the device."); goto cleanup; diff --git a/examples/dctool_write.c b/examples/dctool_write.c index 4bf193b..7b6e050 100644 --- a/examples/dctool_write.c +++ b/examples/dctool_write.c @@ -42,6 +42,7 @@ static dc_status_t dowrite (dc_context_t *context, dc_descriptor_t *descriptor, const char *devname, unsigned int address, dc_buffer_t *buffer) { dc_status_t rc = DC_STATUS_SUCCESS; + dc_iostream_t *iostream = NULL; dc_device_t *device = NULL; // Open the device. @@ -49,7 +50,7 @@ dowrite (dc_context_t *context, dc_descriptor_t *descriptor, const char *devname dc_descriptor_get_vendor (descriptor), dc_descriptor_get_product (descriptor), devname ? devname : "null"); - rc = dc_device_open (&device, context, descriptor, devname); + rc = dc_device_open (&device, context, descriptor, iostream); if (rc != DC_STATUS_SUCCESS) { ERROR ("Error opening the device."); goto cleanup; diff --git a/include/libdivecomputer/device.h b/include/libdivecomputer/device.h index f6d415c..8810a65 100644 --- a/include/libdivecomputer/device.h +++ b/include/libdivecomputer/device.h @@ -25,6 +25,7 @@ #include "common.h" #include "context.h" #include "descriptor.h" +#include "iostream.h" #include "buffer.h" #include "datetime.h" @@ -70,7 +71,7 @@ typedef void (*dc_event_callback_t) (dc_device_t *device, dc_event_type_t event, typedef int (*dc_dive_callback_t) (const unsigned char *data, unsigned int size, const unsigned char *fingerprint, unsigned int fsize, void *userdata); dc_status_t -dc_device_open (dc_device_t **out, dc_context_t *context, dc_descriptor_t *descriptor, const char *name); +dc_device_open (dc_device_t **out, dc_context_t *context, dc_descriptor_t *descriptor, dc_iostream_t *iostream); dc_family_t dc_device_get_type (dc_device_t *device); diff --git a/src/citizen_aqualand.c b/src/citizen_aqualand.c index 99e60e6..63760ac 100644 --- a/src/citizen_aqualand.c +++ b/src/citizen_aqualand.c @@ -25,7 +25,6 @@ #include "citizen_aqualand.h" #include "context-private.h" #include "device-private.h" -#include "serial.h" #include "checksum.h" #include "ringbuffer.h" #include "array.h" @@ -41,7 +40,6 @@ typedef struct citizen_aqualand_device_t { static dc_status_t citizen_aqualand_device_set_fingerprint (dc_device_t *abstract, const unsigned char data[], unsigned int size); static dc_status_t citizen_aqualand_device_dump (dc_device_t *abstract, dc_buffer_t *buffer); static dc_status_t citizen_aqualand_device_foreach (dc_device_t *abstract, dc_dive_callback_t callback, void *userdata); -static dc_status_t citizen_aqualand_device_close (dc_device_t *abstract); static const dc_device_vtable_t citizen_aqualand_device_vtable = { sizeof(citizen_aqualand_device_t), @@ -52,12 +50,12 @@ static const dc_device_vtable_t citizen_aqualand_device_vtable = { citizen_aqualand_device_dump, /* dump */ citizen_aqualand_device_foreach, /* foreach */ NULL, /* timesync */ - citizen_aqualand_device_close /* close */ + NULL /* close */ }; dc_status_t -citizen_aqualand_device_open (dc_device_t **out, dc_context_t *context, const char *name) +citizen_aqualand_device_open (dc_device_t **out, dc_context_t *context, dc_iostream_t *iostream) { dc_status_t status = DC_STATUS_SUCCESS; citizen_aqualand_device_t *device = NULL; @@ -73,28 +71,21 @@ citizen_aqualand_device_open (dc_device_t **out, dc_context_t *context, const ch } // Set the default values. - device->iostream = NULL; + device->iostream = iostream; memset (device->fingerprint, 0, sizeof (device->fingerprint)); - // Open the device. - status = dc_serial_open (&device->iostream, context, name); - if (status != DC_STATUS_SUCCESS) { - ERROR (context, "Failed to open the serial port."); - goto error_free; - } - // Set the serial communication protocol (4800 8N1). status = dc_iostream_configure (device->iostream, 4800, 8, DC_PARITY_NONE, DC_STOPBITS_ONE, DC_FLOWCONTROL_NONE); if (status != DC_STATUS_SUCCESS) { ERROR (context, "Failed to set the terminal attributes."); - goto error_close; + goto error_free; } // Set the timeout for receiving data (1000ms). status = dc_iostream_set_timeout (device->iostream, 1000); if (status != DC_STATUS_SUCCESS) { ERROR (context, "Failed to set the timeout."); - goto error_close; + goto error_free; } // Make sure everything is in a sane state. @@ -105,31 +96,12 @@ citizen_aqualand_device_open (dc_device_t **out, dc_context_t *context, const ch return DC_STATUS_SUCCESS; -error_close: - dc_iostream_close (device->iostream); error_free: dc_device_deallocate ((dc_device_t *) device); return status; } -static dc_status_t -citizen_aqualand_device_close (dc_device_t *abstract) -{ - dc_status_t status = DC_STATUS_SUCCESS; - citizen_aqualand_device_t *device = (citizen_aqualand_device_t*) abstract; - dc_status_t rc = DC_STATUS_SUCCESS; - - // Close the device. - rc = dc_iostream_close (device->iostream); - if (rc != DC_STATUS_SUCCESS) { - dc_status_set_error(&status, rc); - } - - return status; -} - - static dc_status_t citizen_aqualand_device_set_fingerprint (dc_device_t *abstract, const unsigned char data[], unsigned int size) { diff --git a/src/citizen_aqualand.h b/src/citizen_aqualand.h index 6391660..ac47cb6 100644 --- a/src/citizen_aqualand.h +++ b/src/citizen_aqualand.h @@ -23,6 +23,7 @@ #define CITIZEN_AQUALAND_H #include +#include #include #include @@ -31,7 +32,7 @@ extern "C" { #endif /* __cplusplus */ dc_status_t -citizen_aqualand_device_open (dc_device_t **device, dc_context_t *context, const char *name); +citizen_aqualand_device_open (dc_device_t **device, dc_context_t *context, dc_iostream_t *iostream); dc_status_t citizen_aqualand_parser_create (dc_parser_t **parser, dc_context_t *context); diff --git a/src/cochran_commander.c b/src/cochran_commander.c index bbf92c7..63a00ba 100644 --- a/src/cochran_commander.c +++ b/src/cochran_commander.c @@ -26,7 +26,6 @@ #include "cochran_commander.h" #include "context-private.h" #include "device-private.h" -#include "serial.h" #include "array.h" #include "ringbuffer.h" #include "rbstream.h" @@ -104,7 +103,6 @@ static dc_status_t cochran_commander_device_set_fingerprint (dc_device_t *device static dc_status_t cochran_commander_device_read (dc_device_t *device, unsigned int address, unsigned char data[], unsigned int size); static dc_status_t cochran_commander_device_dump (dc_device_t *device, dc_buffer_t *data); static dc_status_t cochran_commander_device_foreach (dc_device_t *device, dc_dive_callback_t callback, void *userdata); -static dc_status_t cochran_commander_device_close (dc_device_t *device); static const dc_device_vtable_t cochran_commander_device_vtable = { sizeof (cochran_commander_device_t), @@ -115,7 +113,7 @@ static const dc_device_vtable_t cochran_commander_device_vtable = { cochran_commander_device_dump, /* dump */ cochran_commander_device_foreach, /* foreach */ NULL, /* timesync */ - cochran_commander_device_close /* close */ + NULL /* close */ }; // Cochran Commander TM, pre-dates pre-21000 s/n @@ -716,7 +714,7 @@ cochran_commander_find_fingerprint(cochran_commander_device_t *device, cochran_d dc_status_t -cochran_commander_device_open (dc_device_t **out, dc_context_t *context, const char *name) +cochran_commander_device_open (dc_device_t **out, dc_context_t *context, dc_iostream_t *iostream) { dc_status_t status = DC_STATUS_SUCCESS; cochran_commander_device_t *device = NULL; @@ -732,26 +730,19 @@ cochran_commander_device_open (dc_device_t **out, dc_context_t *context, const c } // Set the default values. - device->iostream = NULL; + device->iostream = iostream; cochran_commander_device_set_fingerprint((dc_device_t *) device, NULL, 0); - // Open the device. - status = dc_serial_open (&device->iostream, device->base.context, name); - if (status != DC_STATUS_SUCCESS) { - ERROR (device->base.context, "Failed to open the serial port."); - goto error_free; - } - status = cochran_commander_serial_setup(device); if (status != DC_STATUS_SUCCESS) { - goto error_close; + goto error_free; } // Read ID from the device status = cochran_commander_read_id (device, device->id, sizeof(device->id)); if (status != DC_STATUS_SUCCESS) { ERROR (context, "Device not responding."); - goto error_close; + goto error_free; } unsigned int model = cochran_commander_get_model(device); @@ -777,36 +768,18 @@ cochran_commander_device_open (dc_device_t **out, dc_context_t *context, const c default: ERROR (context, "Unknown model"); status = DC_STATUS_UNSUPPORTED; - goto error_close; + goto error_free; } *out = (dc_device_t *) device; return DC_STATUS_SUCCESS; -error_close: - dc_iostream_close (device->iostream); error_free: dc_device_deallocate ((dc_device_t *) device); return status; } -static dc_status_t -cochran_commander_device_close (dc_device_t *abstract) -{ - dc_status_t status = DC_STATUS_SUCCESS; - cochran_commander_device_t *device = (cochran_commander_device_t *) abstract; - dc_status_t rc = DC_STATUS_SUCCESS; - - // Close the device. - rc = dc_iostream_close (device->iostream); - if (rc != DC_STATUS_SUCCESS) { - dc_status_set_error(&status, rc); - } - - return status; -} - static dc_status_t cochran_commander_device_set_fingerprint (dc_device_t *abstract, const unsigned char data[], unsigned int size) { diff --git a/src/cochran_commander.h b/src/cochran_commander.h index e475b5f..84a521e 100644 --- a/src/cochran_commander.h +++ b/src/cochran_commander.h @@ -23,6 +23,7 @@ #define COCHRAN_COMMANDER_H #include +#include #include #include @@ -31,7 +32,7 @@ extern "C" { #endif /* __cplusplus */ dc_status_t -cochran_commander_device_open (dc_device_t **device, dc_context_t *context, const char *name); +cochran_commander_device_open (dc_device_t **device, dc_context_t *context, dc_iostream_t *iostream); dc_status_t cochran_commander_parser_create (dc_parser_t **parser, dc_context_t *context, unsigned int model); diff --git a/src/cressi_edy.c b/src/cressi_edy.c index 327b4aa..89c4b48 100644 --- a/src/cressi_edy.c +++ b/src/cressi_edy.c @@ -26,7 +26,6 @@ #include "cressi_edy.h" #include "context-private.h" #include "device-private.h" -#include "serial.h" #include "checksum.h" #include "array.h" #include "ringbuffer.h" @@ -218,7 +217,7 @@ cressi_edy_quit (cressi_edy_device_t *device) dc_status_t -cressi_edy_device_open (dc_device_t **out, dc_context_t *context, const char *name) +cressi_edy_device_open (dc_device_t **out, dc_context_t *context, dc_iostream_t *iostream) { dc_status_t status = DC_STATUS_SUCCESS; cressi_edy_device_t *device = NULL; @@ -234,44 +233,37 @@ cressi_edy_device_open (dc_device_t **out, dc_context_t *context, const char *na } // Set the default values. - device->iostream = NULL; + device->iostream = iostream; device->layout = NULL; device->model = 0; memset (device->fingerprint, 0, sizeof (device->fingerprint)); - // Open the device. - status = dc_serial_open (&device->iostream, context, name); - if (status != DC_STATUS_SUCCESS) { - ERROR (context, "Failed to open the serial port."); - goto error_free; - } - // Set the serial communication protocol (1200 8N1). status = dc_iostream_configure (device->iostream, 1200, 8, DC_PARITY_NONE, DC_STOPBITS_ONE, DC_FLOWCONTROL_NONE); if (status != DC_STATUS_SUCCESS) { ERROR (context, "Failed to set the terminal attributes."); - goto error_close; + goto error_free; } // Set the timeout for receiving data (1000 ms). status = dc_iostream_set_timeout (device->iostream, 1000); if (status != DC_STATUS_SUCCESS) { ERROR (context, "Failed to set the timeout."); - goto error_close; + goto error_free; } // Set the DTR line. status = dc_iostream_set_dtr (device->iostream, 1); if (status != DC_STATUS_SUCCESS) { ERROR (context, "Failed to set the DTR line."); - goto error_close; + goto error_free; } // Clear the RTS line. status = dc_iostream_set_rts (device->iostream, 0); if (status != DC_STATUS_SUCCESS) { ERROR (context, "Failed to clear the RTS line."); - goto error_close; + goto error_free; } // Make sure everything is in a sane state. @@ -293,7 +285,7 @@ cressi_edy_device_open (dc_device_t **out, dc_context_t *context, const char *na status = dc_iostream_configure (device->iostream, 4800, 8, DC_PARITY_NONE, DC_STOPBITS_ONE, DC_FLOWCONTROL_NONE); if (status != DC_STATUS_SUCCESS) { ERROR (context, "Failed to set the terminal attributes."); - goto error_close; + goto error_free; } // Make sure everything is in a sane state. @@ -304,8 +296,6 @@ cressi_edy_device_open (dc_device_t **out, dc_context_t *context, const char *na return DC_STATUS_SUCCESS; -error_close: - dc_iostream_close (device->iostream); error_free: dc_device_deallocate ((dc_device_t *) device); return status; @@ -325,12 +315,6 @@ cressi_edy_device_close (dc_device_t *abstract) dc_status_set_error(&status, rc); } - // Close the device. - rc = dc_iostream_close (device->iostream); - if (rc != DC_STATUS_SUCCESS) { - dc_status_set_error(&status, rc); - } - return status; } diff --git a/src/cressi_edy.h b/src/cressi_edy.h index d89f02f..7aa5a34 100644 --- a/src/cressi_edy.h +++ b/src/cressi_edy.h @@ -23,6 +23,7 @@ #define CRESSI_EDY_H #include +#include #include #include @@ -31,7 +32,7 @@ extern "C" { #endif /* __cplusplus */ dc_status_t -cressi_edy_device_open (dc_device_t **device, dc_context_t *context, const char *name); +cressi_edy_device_open (dc_device_t **device, dc_context_t *context, dc_iostream_t *iostream); dc_status_t cressi_edy_parser_create (dc_parser_t **parser, dc_context_t *context, unsigned int model); diff --git a/src/cressi_leonardo.c b/src/cressi_leonardo.c index e9d142b..5359f66 100644 --- a/src/cressi_leonardo.c +++ b/src/cressi_leonardo.c @@ -26,7 +26,6 @@ #include "cressi_leonardo.h" #include "context-private.h" #include "device-private.h" -#include "serial.h" #include "checksum.h" #include "array.h" #include "ringbuffer.h" @@ -57,7 +56,6 @@ static dc_status_t cressi_leonardo_device_set_fingerprint (dc_device_t *abstract static dc_status_t cressi_leonardo_device_read (dc_device_t *abstract, unsigned int address, unsigned char data[], unsigned int size); static dc_status_t cressi_leonardo_device_dump (dc_device_t *abstract, dc_buffer_t *buffer); static dc_status_t cressi_leonardo_device_foreach (dc_device_t *abstract, dc_dive_callback_t callback, void *userdata); -static dc_status_t cressi_leonardo_device_close (dc_device_t *abstract); static const dc_device_vtable_t cressi_leonardo_device_vtable = { sizeof(cressi_leonardo_device_t), @@ -68,7 +66,7 @@ static const dc_device_vtable_t cressi_leonardo_device_vtable = { cressi_leonardo_device_dump, /* dump */ cressi_leonardo_device_foreach, /* foreach */ NULL, /* timesync */ - cressi_leonardo_device_close /* close */ + NULL /* close */ }; static dc_status_t @@ -164,7 +162,7 @@ cressi_leonardo_transfer (cressi_leonardo_device_t *device, const unsigned char } dc_status_t -cressi_leonardo_device_open (dc_device_t **out, dc_context_t *context, const char *name) +cressi_leonardo_device_open (dc_device_t **out, dc_context_t *context, dc_iostream_t *iostream) { dc_status_t status = DC_STATUS_SUCCESS; cressi_leonardo_device_t *device = NULL; @@ -180,42 +178,35 @@ cressi_leonardo_device_open (dc_device_t **out, dc_context_t *context, const cha } // Set the default values. - device->iostream = NULL; + device->iostream = iostream; memset (device->fingerprint, 0, sizeof (device->fingerprint)); - // Open the device. - status = dc_serial_open (&device->iostream, context, name); - if (status != DC_STATUS_SUCCESS) { - ERROR (context, "Failed to open the serial port."); - goto error_free; - } - // Set the serial communication protocol (115200 8N1). status = dc_iostream_configure (device->iostream, 115200, 8, DC_PARITY_NONE, DC_STOPBITS_ONE, DC_FLOWCONTROL_NONE); if (status != DC_STATUS_SUCCESS) { ERROR (context, "Failed to set the terminal attributes."); - goto error_close; + goto error_free; } // Set the timeout for receiving data (1000 ms). status = dc_iostream_set_timeout (device->iostream, 1000); if (status != DC_STATUS_SUCCESS) { ERROR (context, "Failed to set the timeout."); - goto error_close; + goto error_free; } // Set the RTS line. status = dc_iostream_set_rts (device->iostream, 1); if (status != DC_STATUS_SUCCESS) { ERROR (context, "Failed to set the RTS line."); - goto error_close; + goto error_free; } // Set the DTR line. status = dc_iostream_set_dtr (device->iostream, 1); if (status != DC_STATUS_SUCCESS) { ERROR (context, "Failed to set the DTR line."); - goto error_close; + goto error_free; } dc_iostream_sleep (device->iostream, 200); @@ -224,7 +215,7 @@ cressi_leonardo_device_open (dc_device_t **out, dc_context_t *context, const cha status = dc_iostream_set_dtr (device->iostream, 0); if (status != DC_STATUS_SUCCESS) { ERROR (context, "Failed to clear the DTR line."); - goto error_close; + goto error_free; } dc_iostream_sleep (device->iostream, 100); @@ -234,29 +225,11 @@ cressi_leonardo_device_open (dc_device_t **out, dc_context_t *context, const cha return DC_STATUS_SUCCESS; -error_close: - dc_iostream_close (device->iostream); error_free: dc_device_deallocate ((dc_device_t *) device); return status; } -static dc_status_t -cressi_leonardo_device_close (dc_device_t *abstract) -{ - dc_status_t status = DC_STATUS_SUCCESS; - cressi_leonardo_device_t *device = (cressi_leonardo_device_t *) abstract; - dc_status_t rc = DC_STATUS_SUCCESS; - - // Close the device. - rc = dc_iostream_close (device->iostream); - if (rc != DC_STATUS_SUCCESS) { - dc_status_set_error(&status, rc); - } - - return status; -} - static dc_status_t cressi_leonardo_device_set_fingerprint (dc_device_t *abstract, const unsigned char data[], unsigned int size) { diff --git a/src/cressi_leonardo.h b/src/cressi_leonardo.h index c17b41b..982bb01 100644 --- a/src/cressi_leonardo.h +++ b/src/cressi_leonardo.h @@ -23,6 +23,7 @@ #define CRESSI_LEONARDO_H #include +#include #include #include @@ -31,7 +32,7 @@ extern "C" { #endif /* __cplusplus */ dc_status_t -cressi_leonardo_device_open (dc_device_t **device, dc_context_t *context, const char *name); +cressi_leonardo_device_open (dc_device_t **device, dc_context_t *context, dc_iostream_t *iostream); dc_status_t cressi_leonardo_parser_create (dc_parser_t **parser, dc_context_t *context, unsigned int model); diff --git a/src/device.c b/src/device.c index 7c3da19..885fd10 100644 --- a/src/device.c +++ b/src/device.c @@ -100,7 +100,7 @@ dc_device_deallocate (dc_device_t *device) } dc_status_t -dc_device_open (dc_device_t **out, dc_context_t *context, dc_descriptor_t *descriptor, const char *name) +dc_device_open (dc_device_t **out, dc_context_t *context, dc_descriptor_t *descriptor, dc_iostream_t *iostream) { dc_status_t rc = DC_STATUS_SUCCESS; dc_device_t *device = NULL; @@ -110,106 +110,106 @@ dc_device_open (dc_device_t **out, dc_context_t *context, dc_descriptor_t *descr switch (dc_descriptor_get_type (descriptor)) { case DC_FAMILY_SUUNTO_SOLUTION: - rc = suunto_solution_device_open (&device, context, name); + rc = suunto_solution_device_open (&device, context, iostream); break; case DC_FAMILY_SUUNTO_EON: - rc = suunto_eon_device_open (&device, context, name); + rc = suunto_eon_device_open (&device, context, iostream); break; case DC_FAMILY_SUUNTO_VYPER: - rc = suunto_vyper_device_open (&device, context, name); + rc = suunto_vyper_device_open (&device, context, iostream); break; case DC_FAMILY_SUUNTO_VYPER2: - rc = suunto_vyper2_device_open (&device, context, name); + rc = suunto_vyper2_device_open (&device, context, iostream); break; case DC_FAMILY_SUUNTO_D9: - rc = suunto_d9_device_open (&device, context, name, dc_descriptor_get_model (descriptor)); + rc = suunto_d9_device_open (&device, context, iostream, dc_descriptor_get_model (descriptor)); break; case DC_FAMILY_SUUNTO_EONSTEEL: - rc = suunto_eonsteel_device_open (&device, context, dc_descriptor_get_model (descriptor)); + rc = suunto_eonsteel_device_open (&device, context, iostream, dc_descriptor_get_model (descriptor)); break; case DC_FAMILY_UWATEC_ALADIN: - rc = uwatec_aladin_device_open (&device, context, name); + rc = uwatec_aladin_device_open (&device, context, iostream); break; case DC_FAMILY_UWATEC_MEMOMOUSE: - rc = uwatec_memomouse_device_open (&device, context, name); + rc = uwatec_memomouse_device_open (&device, context, iostream); break; case DC_FAMILY_UWATEC_SMART: - rc = uwatec_smart_device_open (&device, context); + rc = uwatec_smart_device_open (&device, context, iostream); break; case DC_FAMILY_UWATEC_MERIDIAN: - rc = uwatec_meridian_device_open (&device, context, name); + rc = uwatec_meridian_device_open (&device, context, iostream); break; case DC_FAMILY_UWATEC_G2: - rc = uwatec_g2_device_open (&device, context, dc_descriptor_get_model (descriptor)); + rc = uwatec_g2_device_open (&device, context, iostream, dc_descriptor_get_model (descriptor)); break; case DC_FAMILY_REEFNET_SENSUS: - rc = reefnet_sensus_device_open (&device, context, name); + rc = reefnet_sensus_device_open (&device, context, iostream); break; case DC_FAMILY_REEFNET_SENSUSPRO: - rc = reefnet_sensuspro_device_open (&device, context, name); + rc = reefnet_sensuspro_device_open (&device, context, iostream); break; case DC_FAMILY_REEFNET_SENSUSULTRA: - rc = reefnet_sensusultra_device_open (&device, context, name); + rc = reefnet_sensusultra_device_open (&device, context, iostream); break; case DC_FAMILY_OCEANIC_VTPRO: - rc = oceanic_vtpro_device_open (&device, context, name, dc_descriptor_get_model (descriptor)); + rc = oceanic_vtpro_device_open (&device, context, iostream, dc_descriptor_get_model (descriptor)); break; case DC_FAMILY_OCEANIC_VEO250: - rc = oceanic_veo250_device_open (&device, context, name); + rc = oceanic_veo250_device_open (&device, context, iostream); break; case DC_FAMILY_OCEANIC_ATOM2: - rc = oceanic_atom2_device_open (&device, context, name, dc_descriptor_get_model (descriptor)); + rc = oceanic_atom2_device_open (&device, context, iostream, dc_descriptor_get_model (descriptor)); break; case DC_FAMILY_MARES_NEMO: - rc = mares_nemo_device_open (&device, context, name); + rc = mares_nemo_device_open (&device, context, iostream); break; case DC_FAMILY_MARES_PUCK: - rc = mares_puck_device_open (&device, context, name); + rc = mares_puck_device_open (&device, context, iostream); break; case DC_FAMILY_MARES_DARWIN: - rc = mares_darwin_device_open (&device, context, name, dc_descriptor_get_model (descriptor)); + rc = mares_darwin_device_open (&device, context, iostream, dc_descriptor_get_model (descriptor)); break; case DC_FAMILY_MARES_ICONHD: - rc = mares_iconhd_device_open (&device, context, name); + rc = mares_iconhd_device_open (&device, context, iostream); break; case DC_FAMILY_HW_OSTC: - rc = hw_ostc_device_open (&device, context, name); + rc = hw_ostc_device_open (&device, context, iostream); break; case DC_FAMILY_HW_FROG: - rc = hw_frog_device_open (&device, context, name); + rc = hw_frog_device_open (&device, context, iostream); break; case DC_FAMILY_HW_OSTC3: - rc = hw_ostc3_device_open (&device, context, name); + rc = hw_ostc3_device_open (&device, context, iostream); break; case DC_FAMILY_CRESSI_EDY: - rc = cressi_edy_device_open (&device, context, name); + rc = cressi_edy_device_open (&device, context, iostream); break; case DC_FAMILY_CRESSI_LEONARDO: - rc = cressi_leonardo_device_open (&device, context, name); + rc = cressi_leonardo_device_open (&device, context, iostream); break; case DC_FAMILY_ZEAGLE_N2ITION3: - rc = zeagle_n2ition3_device_open (&device, context, name); + rc = zeagle_n2ition3_device_open (&device, context, iostream); break; case DC_FAMILY_ATOMICS_COBALT: rc = atomics_cobalt_device_open (&device, context); break; case DC_FAMILY_SHEARWATER_PREDATOR: - rc = shearwater_predator_device_open (&device, context, name); + rc = shearwater_predator_device_open (&device, context, iostream); break; case DC_FAMILY_SHEARWATER_PETREL: - rc = shearwater_petrel_device_open (&device, context, name); + rc = shearwater_petrel_device_open (&device, context, iostream); break; case DC_FAMILY_DIVERITE_NITEKQ: - rc = diverite_nitekq_device_open (&device, context, name); + rc = diverite_nitekq_device_open (&device, context, iostream); break; case DC_FAMILY_CITIZEN_AQUALAND: - rc = citizen_aqualand_device_open (&device, context, name); + rc = citizen_aqualand_device_open (&device, context, iostream); break; case DC_FAMILY_DIVESYSTEM_IDIVE: - rc = divesystem_idive_device_open (&device, context, name, dc_descriptor_get_model (descriptor)); + rc = divesystem_idive_device_open (&device, context, iostream, dc_descriptor_get_model (descriptor)); break; case DC_FAMILY_COCHRAN_COMMANDER: - rc = cochran_commander_device_open (&device, context, name); + rc = cochran_commander_device_open (&device, context, iostream); break; default: return DC_STATUS_INVALIDARGS; diff --git a/src/diverite_nitekq.c b/src/diverite_nitekq.c index 6fc38b5..676fb90 100644 --- a/src/diverite_nitekq.c +++ b/src/diverite_nitekq.c @@ -27,7 +27,6 @@ #include "context-private.h" #include "device-private.h" #include "checksum.h" -#include "serial.h" #include "array.h" #define ISINSTANCE(device) dc_device_isinstance((device), &diverite_nitekq_device_vtable) @@ -148,7 +147,7 @@ diverite_nitekq_handshake (diverite_nitekq_device_t *device) dc_status_t -diverite_nitekq_device_open (dc_device_t **out, dc_context_t *context, const char *name) +diverite_nitekq_device_open (dc_device_t **out, dc_context_t *context, dc_iostream_t *iostream) { dc_status_t status = DC_STATUS_SUCCESS; diverite_nitekq_device_t *device = NULL; @@ -164,28 +163,21 @@ diverite_nitekq_device_open (dc_device_t **out, dc_context_t *context, const cha } // Set the default values. - device->iostream = NULL; + device->iostream = iostream; memset (device->fingerprint, 0, sizeof (device->fingerprint)); - // Open the device. - status = dc_serial_open (&device->iostream, context, name); - if (status != DC_STATUS_SUCCESS) { - ERROR (context, "Failed to open the serial port."); - goto error_free; - } - // Set the serial communication protocol (9600 8N1). status = dc_iostream_configure (device->iostream, 9600, 8, DC_PARITY_NONE, DC_STOPBITS_ONE, DC_FLOWCONTROL_NONE); if (status != DC_STATUS_SUCCESS) { ERROR (context, "Failed to set the terminal attributes."); - goto error_close; + goto error_free; } // Set the timeout for receiving data (1000ms). status = dc_iostream_set_timeout (device->iostream, 1000); if (status != DC_STATUS_SUCCESS) { ERROR (context, "Failed to set the timeout."); - goto error_close; + goto error_free; } // Make sure everything is in a sane state. @@ -196,15 +188,13 @@ diverite_nitekq_device_open (dc_device_t **out, dc_context_t *context, const cha status = diverite_nitekq_handshake (device); if (status != DC_STATUS_SUCCESS) { ERROR (context, "Failed to handshake."); - goto error_close; + goto error_free; } *out = (dc_device_t*) device; return DC_STATUS_SUCCESS; -error_close: - dc_iostream_close (device->iostream); error_free: dc_device_deallocate ((dc_device_t *) device); return status; @@ -224,12 +214,6 @@ diverite_nitekq_device_close (dc_device_t *abstract) dc_status_set_error(&status, rc); } - // Close the device. - rc = dc_iostream_close (device->iostream); - if (rc != DC_STATUS_SUCCESS) { - dc_status_set_error(&status, rc); - } - return status; } diff --git a/src/diverite_nitekq.h b/src/diverite_nitekq.h index c8987e2..e016cab 100644 --- a/src/diverite_nitekq.h +++ b/src/diverite_nitekq.h @@ -23,6 +23,7 @@ #define DIVERITE_NITEKQ_H #include +#include #include #include @@ -31,7 +32,7 @@ extern "C" { #endif /* __cplusplus */ dc_status_t -diverite_nitekq_device_open (dc_device_t **device, dc_context_t *context, const char *name); +diverite_nitekq_device_open (dc_device_t **device, dc_context_t *context, dc_iostream_t *iostream); dc_status_t diverite_nitekq_parser_create (dc_parser_t **parser, dc_context_t *context); diff --git a/src/divesystem_idive.c b/src/divesystem_idive.c index f2976b1..790e71a 100644 --- a/src/divesystem_idive.c +++ b/src/divesystem_idive.c @@ -25,7 +25,6 @@ #include "divesystem_idive.h" #include "context-private.h" #include "device-private.h" -#include "serial.h" #include "checksum.h" #include "array.h" @@ -76,7 +75,6 @@ typedef struct divesystem_idive_device_t { static dc_status_t divesystem_idive_device_set_fingerprint (dc_device_t *abstract, const unsigned char data[], unsigned int size); static dc_status_t divesystem_idive_device_foreach (dc_device_t *abstract, dc_dive_callback_t callback, void *userdata); -static dc_status_t divesystem_idive_device_close (dc_device_t *abstract); static const dc_device_vtable_t divesystem_idive_device_vtable = { sizeof(divesystem_idive_device_t), @@ -87,7 +85,7 @@ static const dc_device_vtable_t divesystem_idive_device_vtable = { NULL, /* dump */ divesystem_idive_device_foreach, /* foreach */ NULL, /* timesync */ - divesystem_idive_device_close /* close */ + NULL /* close */ }; static const divesystem_idive_commands_t idive = { @@ -115,7 +113,7 @@ static const divesystem_idive_commands_t ix3m_apos4 = { }; dc_status_t -divesystem_idive_device_open (dc_device_t **out, dc_context_t *context, const char *name, unsigned int model) +divesystem_idive_device_open (dc_device_t **out, dc_context_t *context, dc_iostream_t *iostream, unsigned int model) { dc_status_t status = DC_STATUS_SUCCESS; divesystem_idive_device_t *device = NULL; @@ -131,29 +129,22 @@ divesystem_idive_device_open (dc_device_t **out, dc_context_t *context, const ch } // Set the default values. - device->iostream = NULL; + device->iostream = iostream; memset (device->fingerprint, 0, sizeof (device->fingerprint)); device->model = model; - // Open the device. - status = dc_serial_open (&device->iostream, context, name); - if (status != DC_STATUS_SUCCESS) { - ERROR (context, "Failed to open the serial port."); - goto error_free; - } - // Set the serial communication protocol (115200 8N1). status = dc_iostream_configure (device->iostream, 115200, 8, DC_PARITY_NONE, DC_STOPBITS_ONE, DC_FLOWCONTROL_NONE); if (status != DC_STATUS_SUCCESS) { ERROR (context, "Failed to set the terminal attributes."); - goto error_close; + goto error_free; } // Set the timeout for receiving data (1000ms). status = dc_iostream_set_timeout (device->iostream, 1000); if (status != DC_STATUS_SUCCESS) { ERROR (context, "Failed to set the timeout."); - goto error_close; + goto error_free; } // Make sure everything is in a sane state. @@ -164,31 +155,12 @@ divesystem_idive_device_open (dc_device_t **out, dc_context_t *context, const ch return DC_STATUS_SUCCESS; -error_close: - dc_iostream_close (device->iostream); error_free: dc_device_deallocate ((dc_device_t *) device); return status; } -static dc_status_t -divesystem_idive_device_close (dc_device_t *abstract) -{ - dc_status_t status = DC_STATUS_SUCCESS; - divesystem_idive_device_t *device = (divesystem_idive_device_t*) abstract; - dc_status_t rc = DC_STATUS_SUCCESS; - - // Close the device. - rc = dc_iostream_close (device->iostream); - if (rc != DC_STATUS_SUCCESS) { - dc_status_set_error(&status, rc); - } - - return status; -} - - static dc_status_t divesystem_idive_device_set_fingerprint (dc_device_t *abstract, const unsigned char data[], unsigned int size) { diff --git a/src/divesystem_idive.h b/src/divesystem_idive.h index 20ed729..8c79866 100644 --- a/src/divesystem_idive.h +++ b/src/divesystem_idive.h @@ -23,6 +23,7 @@ #define DIVESYSTEM_IDIVE_H #include +#include #include #include @@ -31,7 +32,7 @@ extern "C" { #endif /* __cplusplus */ dc_status_t -divesystem_idive_device_open (dc_device_t **device, dc_context_t *context, const char *name, unsigned int model); +divesystem_idive_device_open (dc_device_t **device, dc_context_t *context, dc_iostream_t *iostream, unsigned int model); dc_status_t divesystem_idive_parser_create (dc_parser_t **parser, dc_context_t *context, unsigned int model); diff --git a/src/hw_frog.c b/src/hw_frog.c index 7953b18..74fc170 100644 --- a/src/hw_frog.c +++ b/src/hw_frog.c @@ -25,7 +25,6 @@ #include "hw_frog.h" #include "context-private.h" #include "device-private.h" -#include "serial.h" #include "checksum.h" #include "ringbuffer.h" #include "array.h" @@ -199,7 +198,7 @@ hw_frog_transfer (hw_frog_device_t *device, dc_status_t -hw_frog_device_open (dc_device_t **out, dc_context_t *context, const char *name) +hw_frog_device_open (dc_device_t **out, dc_context_t *context, dc_iostream_t *iostream) { dc_status_t status = DC_STATUS_SUCCESS; hw_frog_device_t *device = NULL; @@ -215,28 +214,21 @@ hw_frog_device_open (dc_device_t **out, dc_context_t *context, const char *name) } // Set the default values. - device->iostream = NULL; + device->iostream = iostream; memset (device->fingerprint, 0, sizeof (device->fingerprint)); - // Open the device. - status = dc_serial_open (&device->iostream, context, name); - if (status != DC_STATUS_SUCCESS) { - ERROR (context, "Failed to open the serial port."); - goto error_free; - } - // Set the serial communication protocol (115200 8N1). status = dc_iostream_configure (device->iostream, 115200, 8, DC_PARITY_NONE, DC_STOPBITS_ONE, DC_FLOWCONTROL_NONE); if (status != DC_STATUS_SUCCESS) { ERROR (context, "Failed to set the terminal attributes."); - goto error_close; + goto error_free; } // Set the timeout for receiving data (3000ms). status = dc_iostream_set_timeout (device->iostream, 3000); if (status != DC_STATUS_SUCCESS) { ERROR (context, "Failed to set the timeout."); - goto error_close; + goto error_free; } // Make sure everything is in a sane state. @@ -247,15 +239,13 @@ hw_frog_device_open (dc_device_t **out, dc_context_t *context, const char *name) status = hw_frog_transfer (device, NULL, INIT, NULL, 0, NULL, 0); if (status != DC_STATUS_SUCCESS) { ERROR (context, "Failed to send the command."); - goto error_close; + goto error_free; } *out = (dc_device_t *) device; return DC_STATUS_SUCCESS; -error_close: - dc_iostream_close (device->iostream); error_free: dc_device_deallocate ((dc_device_t *) device); return status; @@ -276,12 +266,6 @@ hw_frog_device_close (dc_device_t *abstract) dc_status_set_error(&status, rc); } - // Close the device. - rc = dc_iostream_close (device->iostream); - if (rc != DC_STATUS_SUCCESS) { - dc_status_set_error(&status, rc); - } - return status; } diff --git a/src/hw_frog.h b/src/hw_frog.h index 260e80d..74cf5af 100644 --- a/src/hw_frog.h +++ b/src/hw_frog.h @@ -23,6 +23,7 @@ #define HW_FROG_H #include +#include #include #include #include @@ -32,7 +33,7 @@ extern "C" { #endif /* __cplusplus */ dc_status_t -hw_frog_device_open (dc_device_t **device, dc_context_t *context, const char *name); +hw_frog_device_open (dc_device_t **device, dc_context_t *context, dc_iostream_t *iostream); #ifdef __cplusplus } diff --git a/src/hw_ostc.c b/src/hw_ostc.c index c47af16..cb64818 100644 --- a/src/hw_ostc.c +++ b/src/hw_ostc.c @@ -25,7 +25,6 @@ #include "hw_ostc.h" #include "context-private.h" #include "device-private.h" -#include "serial.h" #include "checksum.h" #include "array.h" #include "ihex.h" @@ -71,7 +70,6 @@ static dc_status_t hw_ostc_device_set_fingerprint (dc_device_t *abstract, const static dc_status_t hw_ostc_device_dump (dc_device_t *abstract, dc_buffer_t *buffer); static dc_status_t hw_ostc_device_foreach (dc_device_t *abstract, dc_dive_callback_t callback, void *userdata); static dc_status_t hw_ostc_device_timesync (dc_device_t *abstract, const dc_datetime_t *datetime); -static dc_status_t hw_ostc_device_close (dc_device_t *abstract); static const dc_device_vtable_t hw_ostc_device_vtable = { sizeof(hw_ostc_device_t), @@ -82,7 +80,7 @@ static const dc_device_vtable_t hw_ostc_device_vtable = { hw_ostc_device_dump, /* dump */ hw_ostc_device_foreach, /* foreach */ hw_ostc_device_timesync, /* timesync */ - hw_ostc_device_close /* close */ + NULL /* close */ }; static dc_status_t @@ -123,7 +121,7 @@ hw_ostc_send (hw_ostc_device_t *device, unsigned char cmd, unsigned int echo) dc_status_t -hw_ostc_device_open (dc_device_t **out, dc_context_t *context, const char *name) +hw_ostc_device_open (dc_device_t **out, dc_context_t *context, dc_iostream_t *iostream) { dc_status_t status = DC_STATUS_SUCCESS; hw_ostc_device_t *device = NULL; @@ -139,28 +137,21 @@ hw_ostc_device_open (dc_device_t **out, dc_context_t *context, const char *name) } // Set the default values. - device->iostream = NULL; + device->iostream = iostream; memset (device->fingerprint, 0, sizeof (device->fingerprint)); - // Open the device. - status = dc_serial_open (&device->iostream, context, name); - if (status != DC_STATUS_SUCCESS) { - ERROR (context, "Failed to open the serial port."); - goto error_free; - } - // Set the serial communication protocol (115200 8N1). status = dc_iostream_configure (device->iostream, 115200, 8, DC_PARITY_NONE, DC_STOPBITS_ONE, DC_FLOWCONTROL_NONE); if (status != DC_STATUS_SUCCESS) { ERROR (context, "Failed to set the terminal attributes."); - goto error_close; + goto error_free; } // Set the timeout for receiving data. status = dc_iostream_set_timeout (device->iostream, 4000); if (status != DC_STATUS_SUCCESS) { ERROR (context, "Failed to set the timeout."); - goto error_close; + goto error_free; } // Make sure everything is in a sane state. @@ -171,31 +162,12 @@ hw_ostc_device_open (dc_device_t **out, dc_context_t *context, const char *name) return DC_STATUS_SUCCESS; -error_close: - dc_iostream_close (device->iostream); error_free: dc_device_deallocate ((dc_device_t *) device); return status; } -static dc_status_t -hw_ostc_device_close (dc_device_t *abstract) -{ - dc_status_t status = DC_STATUS_SUCCESS; - hw_ostc_device_t *device = (hw_ostc_device_t*) abstract; - dc_status_t rc = DC_STATUS_SUCCESS; - - // Close the device. - rc = dc_iostream_close (device->iostream); - if (rc != DC_STATUS_SUCCESS) { - dc_status_set_error(&status, rc); - } - - return status; -} - - static dc_status_t hw_ostc_device_set_fingerprint (dc_device_t *abstract, const unsigned char data[], unsigned int size) { diff --git a/src/hw_ostc.h b/src/hw_ostc.h index 3f54a7b..a0ce743 100644 --- a/src/hw_ostc.h +++ b/src/hw_ostc.h @@ -23,6 +23,7 @@ #define HW_OSTC_H #include +#include #include #include #include @@ -32,7 +33,7 @@ extern "C" { #endif /* __cplusplus */ dc_status_t -hw_ostc_device_open (dc_device_t **device, dc_context_t *context, const char *name); +hw_ostc_device_open (dc_device_t **device, dc_context_t *context, dc_iostream_t *iostream); dc_status_t hw_ostc_parser_create (dc_parser_t **parser, dc_context_t *context, unsigned int hwos); diff --git a/src/hw_ostc3.c b/src/hw_ostc3.c index 9a6c731..dec0a44 100644 --- a/src/hw_ostc3.c +++ b/src/hw_ostc3.c @@ -27,7 +27,6 @@ #include "hw_ostc3.h" #include "context-private.h" #include "device-private.h" -#include "serial.h" #include "array.h" #include "aes.h" #include "platform.h" @@ -316,7 +315,7 @@ hw_ostc3_transfer (hw_ostc3_device_t *device, dc_status_t -hw_ostc3_device_open (dc_device_t **out, dc_context_t *context, const char *name) +hw_ostc3_device_open (dc_device_t **out, dc_context_t *context, dc_iostream_t *iostream) { dc_status_t status = DC_STATUS_SUCCESS; hw_ostc3_device_t *device = NULL; @@ -332,31 +331,24 @@ hw_ostc3_device_open (dc_device_t **out, dc_context_t *context, const char *name } // Set the default values. - device->iostream = NULL; + device->iostream = iostream; device->hardware = INVALID; device->feature = 0; device->model = 0; memset (device->fingerprint, 0, sizeof (device->fingerprint)); - // Open the device. - status = dc_serial_open (&device->iostream, context, name); - if (status != DC_STATUS_SUCCESS) { - ERROR (context, "Failed to open the serial port."); - goto error_free; - } - // Set the serial communication protocol (115200 8N1). status = dc_iostream_configure (device->iostream, 115200, 8, DC_PARITY_NONE, DC_STOPBITS_ONE, DC_FLOWCONTROL_NONE); if (status != DC_STATUS_SUCCESS) { ERROR (context, "Failed to set the terminal attributes."); - goto error_close; + goto error_free; } // Set the timeout for receiving data (3000ms). status = dc_iostream_set_timeout (device->iostream, 3000); if (status != DC_STATUS_SUCCESS) { ERROR (context, "Failed to set the timeout."); - goto error_close; + goto error_free; } // Make sure everything is in a sane state. @@ -369,8 +361,6 @@ hw_ostc3_device_open (dc_device_t **out, dc_context_t *context, const char *name return DC_STATUS_SUCCESS; -error_close: - dc_iostream_close (device->iostream); error_free: dc_device_deallocate ((dc_device_t *) device); return status; @@ -531,12 +521,6 @@ hw_ostc3_device_close (dc_device_t *abstract) } } - // Close the device. - rc = dc_iostream_close (device->iostream); - if (rc != DC_STATUS_SUCCESS) { - dc_status_set_error(&status, rc); - } - return status; } diff --git a/src/hw_ostc3.h b/src/hw_ostc3.h index eec35b7..92cf277 100644 --- a/src/hw_ostc3.h +++ b/src/hw_ostc3.h @@ -23,6 +23,7 @@ #define HW_OSTC3_H #include +#include #include #include #include @@ -32,7 +33,7 @@ extern "C" { #endif /* __cplusplus */ dc_status_t -hw_ostc3_device_open (dc_device_t **device, dc_context_t *context, const char *name); +hw_ostc3_device_open (dc_device_t **device, dc_context_t *context, dc_iostream_t *iostream); dc_status_t hw_ostc3_parser_create (dc_parser_t **out, dc_context_t *context, unsigned int model); diff --git a/src/mares_common.c b/src/mares_common.c index f476d8d..a890701 100644 --- a/src/mares_common.c +++ b/src/mares_common.c @@ -47,12 +47,12 @@ #define GAUGE 3 void -mares_common_device_init (mares_common_device_t *device) +mares_common_device_init (mares_common_device_t *device, dc_iostream_t *iostream) { assert (device != NULL); // Set the default values. - device->iostream = NULL; + device->iostream = iostream; device->echo = 0; device->delay = 0; } diff --git a/src/mares_common.h b/src/mares_common.h index 8cb58ca..000ea28 100644 --- a/src/mares_common.h +++ b/src/mares_common.h @@ -22,8 +22,9 @@ #ifndef MARES_COMMON_H #define MARES_COMMON_H +#include + #include "device-private.h" -#include "serial.h" #ifdef __cplusplus extern "C" { @@ -47,7 +48,7 @@ typedef struct mares_common_device_t { } mares_common_device_t; void -mares_common_device_init (mares_common_device_t *device); +mares_common_device_init (mares_common_device_t *device, dc_iostream_t *iostream); dc_status_t mares_common_device_read (dc_device_t *abstract, unsigned int address, unsigned char data[], unsigned int size); diff --git a/src/mares_darwin.c b/src/mares_darwin.c index 0d5152d..92172f2 100644 --- a/src/mares_darwin.c +++ b/src/mares_darwin.c @@ -60,7 +60,6 @@ typedef struct mares_darwin_device_t { static dc_status_t mares_darwin_device_set_fingerprint (dc_device_t *abstract, const unsigned char data[], unsigned int size); static dc_status_t mares_darwin_device_dump (dc_device_t *abstract, dc_buffer_t *buffer); static dc_status_t mares_darwin_device_foreach (dc_device_t *abstract, dc_dive_callback_t callback, void *userdata); -static dc_status_t mares_darwin_device_close (dc_device_t *abstract); static const dc_device_vtable_t mares_darwin_device_vtable = { sizeof(mares_darwin_device_t), @@ -71,7 +70,7 @@ static const dc_device_vtable_t mares_darwin_device_vtable = { mares_darwin_device_dump, /* dump */ mares_darwin_device_foreach, /* foreach */ NULL, /* timesync */ - mares_darwin_device_close /* close */ + NULL /* close */ }; static const mares_darwin_layout_t mares_darwin_layout = { @@ -98,7 +97,7 @@ static dc_status_t mares_darwin_extract_dives (dc_device_t *device, const unsigned char data[], unsigned int size, dc_dive_callback_t callback, void *userdata); dc_status_t -mares_darwin_device_open (dc_device_t **out, dc_context_t *context, const char *name, unsigned int model) +mares_darwin_device_open (dc_device_t **out, dc_context_t *context, dc_iostream_t *iostream, unsigned int model) { dc_status_t status = DC_STATUS_SUCCESS; mares_darwin_device_t *device = NULL; @@ -114,7 +113,7 @@ mares_darwin_device_open (dc_device_t **out, dc_context_t *context, const char * } // Initialize the base class. - mares_common_device_init (&device->base); + mares_common_device_init (&device->base, iostream); // Set the default values. memset (device->fingerprint, 0, sizeof (device->fingerprint)); @@ -124,39 +123,32 @@ mares_darwin_device_open (dc_device_t **out, dc_context_t *context, const char * else device->layout = &mares_darwin_layout; - // Open the device. - status = dc_serial_open (&device->base.iostream, context, name); - if (status != DC_STATUS_SUCCESS) { - ERROR (context, "Failed to open the serial port."); - goto error_free; - } - // Set the serial communication protocol (9600 8N1). status = dc_iostream_configure (device->base.iostream, 9600, 8, DC_PARITY_NONE, DC_STOPBITS_ONE, DC_FLOWCONTROL_NONE); if (status != DC_STATUS_SUCCESS) { ERROR (context, "Failed to set the terminal attributes."); - goto error_close; + goto error_free; } // Set the timeout for receiving data (1000 ms). status = dc_iostream_set_timeout (device->base.iostream, 1000); if (status != DC_STATUS_SUCCESS) { ERROR (context, "Failed to set the timeout."); - goto error_close; + goto error_free; } // Set the DTR line. status = dc_iostream_set_dtr (device->base.iostream, 1); if (status != DC_STATUS_SUCCESS) { ERROR (context, "Failed to set the DTR line."); - goto error_close; + goto error_free; } // Set the RTS line. status = dc_iostream_set_rts (device->base.iostream, 1); if (status != DC_STATUS_SUCCESS) { ERROR (context, "Failed to set the RTS line."); - goto error_close; + goto error_free; } // Make sure everything is in a sane state. @@ -171,29 +163,11 @@ mares_darwin_device_open (dc_device_t **out, dc_context_t *context, const char * return DC_STATUS_SUCCESS; -error_close: - dc_iostream_close (device->base.iostream); error_free: dc_device_deallocate ((dc_device_t *) device); return status; } -static dc_status_t -mares_darwin_device_close (dc_device_t *abstract) -{ - dc_status_t status = DC_STATUS_SUCCESS; - mares_darwin_device_t *device = (mares_darwin_device_t *) abstract; - dc_status_t rc = DC_STATUS_SUCCESS; - - // Close the device. - rc = dc_iostream_close (device->base.iostream); - if (rc != DC_STATUS_SUCCESS) { - dc_status_set_error(&status, rc); - } - - return status; -} - static dc_status_t mares_darwin_device_set_fingerprint (dc_device_t *abstract, const unsigned char data[], unsigned int size) diff --git a/src/mares_darwin.h b/src/mares_darwin.h index e7767ec..a902014 100644 --- a/src/mares_darwin.h +++ b/src/mares_darwin.h @@ -23,6 +23,7 @@ #define MARES_DARWIN_H #include +#include #include #include @@ -31,7 +32,7 @@ extern "C" { #endif /* __cplusplus */ dc_status_t -mares_darwin_device_open (dc_device_t **device, dc_context_t *context, const char *name, unsigned int model); +mares_darwin_device_open (dc_device_t **device, dc_context_t *context, dc_iostream_t *iostream, unsigned int model); dc_status_t mares_darwin_parser_create (dc_parser_t **parser, dc_context_t *context, unsigned int model); diff --git a/src/mares_iconhd.c b/src/mares_iconhd.c index c9352e2..450245e 100644 --- a/src/mares_iconhd.c +++ b/src/mares_iconhd.c @@ -26,7 +26,6 @@ #include "mares_iconhd.h" #include "context-private.h" #include "device-private.h" -#include "serial.h" #include "array.h" #include "rbstream.h" @@ -78,7 +77,6 @@ static dc_status_t mares_iconhd_device_set_fingerprint (dc_device_t *abstract, c static dc_status_t mares_iconhd_device_read (dc_device_t *abstract, unsigned int address, unsigned char data[], unsigned int size); static dc_status_t mares_iconhd_device_dump (dc_device_t *abstract, dc_buffer_t *buffer); static dc_status_t mares_iconhd_device_foreach (dc_device_t *abstract, dc_dive_callback_t callback, void *userdata); -static dc_status_t mares_iconhd_device_close (dc_device_t *abstract); static const dc_device_vtable_t mares_iconhd_device_vtable = { sizeof(mares_iconhd_device_t), @@ -89,7 +87,7 @@ static const dc_device_vtable_t mares_iconhd_device_vtable = { mares_iconhd_device_dump, /* dump */ mares_iconhd_device_foreach, /* foreach */ NULL, /* timesync */ - mares_iconhd_device_close /* close */ + NULL /* close */ }; static const mares_iconhd_layout_t mares_iconhd_layout = { @@ -214,7 +212,7 @@ mares_iconhd_transfer (mares_iconhd_device_t *device, dc_status_t -mares_iconhd_device_open (dc_device_t **out, dc_context_t *context, const char *name) +mares_iconhd_device_open (dc_device_t **out, dc_context_t *context, dc_iostream_t *iostream) { dc_status_t status = DC_STATUS_SUCCESS; mares_iconhd_device_t *device = NULL; @@ -230,46 +228,39 @@ mares_iconhd_device_open (dc_device_t **out, dc_context_t *context, const char * } // Set the default values. - device->iostream = NULL; + device->iostream = iostream; device->layout = NULL; memset (device->fingerprint, 0, sizeof (device->fingerprint)); memset (device->version, 0, sizeof (device->version)); device->model = 0; device->packetsize = 0; - // Open the device. - status = dc_serial_open (&device->iostream, context, name); - if (status != DC_STATUS_SUCCESS) { - ERROR (context, "Failed to open the serial port."); - goto error_free; - } - // Set the serial communication protocol (115200 8E1). status = dc_iostream_configure (device->iostream, 115200, 8, DC_PARITY_EVEN, DC_STOPBITS_ONE, DC_FLOWCONTROL_NONE); if (status != DC_STATUS_SUCCESS) { ERROR (context, "Failed to set the terminal attributes."); - goto error_close; + goto error_free; } // Set the timeout for receiving data (1000 ms). status = dc_iostream_set_timeout (device->iostream, 1000); if (status != DC_STATUS_SUCCESS) { ERROR (context, "Failed to set the timeout."); - goto error_close; + goto error_free; } // Clear the DTR line. status = dc_iostream_set_dtr (device->iostream, 0); if (status != DC_STATUS_SUCCESS) { ERROR (context, "Failed to clear the DTR line."); - goto error_close; + goto error_free; } // Clear the RTS line. status = dc_iostream_set_rts (device->iostream, 0); if (status != DC_STATUS_SUCCESS) { ERROR (context, "Failed to clear the RTS line."); - goto error_close; + goto error_free; } // Make sure everything is in a sane state. @@ -280,7 +271,7 @@ mares_iconhd_device_open (dc_device_t **out, dc_context_t *context, const char * status = mares_iconhd_transfer (device, command, sizeof (command), device->version, sizeof (device->version)); if (status != DC_STATUS_SUCCESS) { - goto error_close; + goto error_free; } // Autodetect the model using the version packet. @@ -320,31 +311,12 @@ mares_iconhd_device_open (dc_device_t **out, dc_context_t *context, const char * return DC_STATUS_SUCCESS; -error_close: - dc_iostream_close (device->iostream); error_free: dc_device_deallocate ((dc_device_t *) device); return status; } -static dc_status_t -mares_iconhd_device_close (dc_device_t *abstract) -{ - dc_status_t status = DC_STATUS_SUCCESS; - mares_iconhd_device_t *device = (mares_iconhd_device_t*) abstract; - dc_status_t rc = DC_STATUS_SUCCESS; - - // Close the device. - rc = dc_iostream_close (device->iostream); - if (rc != DC_STATUS_SUCCESS) { - dc_status_set_error(&status, rc); - } - - return status; -} - - static dc_status_t mares_iconhd_device_set_fingerprint (dc_device_t *abstract, const unsigned char data[], unsigned int size) { diff --git a/src/mares_iconhd.h b/src/mares_iconhd.h index b762843..55a50d0 100644 --- a/src/mares_iconhd.h +++ b/src/mares_iconhd.h @@ -23,6 +23,7 @@ #define MARES_ICONHD_H #include +#include #include #include @@ -31,7 +32,7 @@ extern "C" { #endif /* __cplusplus */ dc_status_t -mares_iconhd_device_open (dc_device_t **device, dc_context_t *context, const char *name); +mares_iconhd_device_open (dc_device_t **device, dc_context_t *context, dc_iostream_t *iostream); dc_status_t mares_iconhd_parser_create (dc_parser_t **parser, dc_context_t *context, unsigned int model); diff --git a/src/mares_nemo.c b/src/mares_nemo.c index a83b459..7529704 100644 --- a/src/mares_nemo.c +++ b/src/mares_nemo.c @@ -26,7 +26,6 @@ #include "mares_common.h" #include "context-private.h" #include "device-private.h" -#include "serial.h" #include "checksum.h" #include "array.h" @@ -52,7 +51,6 @@ typedef struct mares_nemo_device_t { static dc_status_t mares_nemo_device_set_fingerprint (dc_device_t *abstract, const unsigned char data[], unsigned int size); static dc_status_t mares_nemo_device_dump (dc_device_t *abstract, dc_buffer_t *buffer); static dc_status_t mares_nemo_device_foreach (dc_device_t *abstract, dc_dive_callback_t callback, void *userdata); -static dc_status_t mares_nemo_device_close (dc_device_t *abstract); static const dc_device_vtable_t mares_nemo_device_vtable = { sizeof(mares_nemo_device_t), @@ -63,7 +61,7 @@ static const dc_device_vtable_t mares_nemo_device_vtable = { mares_nemo_device_dump, /* dump */ mares_nemo_device_foreach, /* foreach */ NULL, /* timesync */ - mares_nemo_device_close /* close */ + NULL /* close */ }; static const mares_common_layout_t mares_nemo_layout = { @@ -84,7 +82,7 @@ static const mares_common_layout_t mares_nemo_apneist_layout = { dc_status_t -mares_nemo_device_open (dc_device_t **out, dc_context_t *context, const char *name) +mares_nemo_device_open (dc_device_t **out, dc_context_t *context, dc_iostream_t *iostream) { dc_status_t status = DC_STATUS_SUCCESS; mares_nemo_device_t *device = NULL; @@ -100,42 +98,35 @@ mares_nemo_device_open (dc_device_t **out, dc_context_t *context, const char *na } // Set the default values. - device->iostream = NULL; + device->iostream = iostream; memset (device->fingerprint, 0, sizeof (device->fingerprint)); - // Open the device. - status = dc_serial_open (&device->iostream, context, name); - if (status != DC_STATUS_SUCCESS) { - ERROR (context, "Failed to open the serial port."); - goto error_free; - } - // Set the serial communication protocol (9600 8N1). status = dc_iostream_configure (device->iostream, 9600, 8, DC_PARITY_NONE, DC_STOPBITS_ONE, DC_FLOWCONTROL_NONE); if (status != DC_STATUS_SUCCESS) { ERROR (context, "Failed to set the terminal attributes."); - goto error_close; + goto error_free; } // Set the timeout for receiving data (1000 ms). status = dc_iostream_set_timeout (device->iostream, 1000); if (status != DC_STATUS_SUCCESS) { ERROR (context, "Failed to set the timeout."); - goto error_close; + goto error_free; } // Set the DTR line. status = dc_iostream_set_dtr (device->iostream, 1); if (status != DC_STATUS_SUCCESS) { ERROR (context, "Failed to set the DTR line."); - goto error_close; + goto error_free; } // Set the RTS line. status = dc_iostream_set_rts (device->iostream, 1); if (status != DC_STATUS_SUCCESS) { ERROR (context, "Failed to set the RTS line."); - goto error_close; + goto error_free; } // Make sure everything is in a sane state. @@ -145,31 +136,12 @@ mares_nemo_device_open (dc_device_t **out, dc_context_t *context, const char *na return DC_STATUS_SUCCESS; -error_close: - dc_iostream_close (device->iostream); error_free: dc_device_deallocate ((dc_device_t *) device); return status; } -static dc_status_t -mares_nemo_device_close (dc_device_t *abstract) -{ - dc_status_t status = DC_STATUS_SUCCESS; - mares_nemo_device_t *device = (mares_nemo_device_t*) abstract; - dc_status_t rc = DC_STATUS_SUCCESS; - - // Close the device. - rc = dc_iostream_close (device->iostream); - if (rc != DC_STATUS_SUCCESS) { - dc_status_set_error(&status, rc); - } - - return status; -} - - static dc_status_t mares_nemo_device_set_fingerprint (dc_device_t *abstract, const unsigned char data[], unsigned int size) { diff --git a/src/mares_nemo.h b/src/mares_nemo.h index e25489b..c7a162b 100644 --- a/src/mares_nemo.h +++ b/src/mares_nemo.h @@ -23,6 +23,7 @@ #define MARES_NEMO_H #include +#include #include #include @@ -31,7 +32,7 @@ extern "C" { #endif /* __cplusplus */ dc_status_t -mares_nemo_device_open (dc_device_t **device, dc_context_t *context, const char *name); +mares_nemo_device_open (dc_device_t **device, dc_context_t *context, dc_iostream_t *iostream); dc_status_t mares_nemo_parser_create (dc_parser_t **parser, dc_context_t *context, unsigned int model); diff --git a/src/mares_puck.c b/src/mares_puck.c index 6d921f0..614d886 100644 --- a/src/mares_puck.c +++ b/src/mares_puck.c @@ -27,7 +27,6 @@ #include "mares_common.h" #include "context-private.h" #include "device-private.h" -#include "serial.h" #include "checksum.h" #include "array.h" @@ -47,7 +46,6 @@ typedef struct mares_puck_device_t { static dc_status_t mares_puck_device_set_fingerprint (dc_device_t *abstract, const unsigned char data[], unsigned int size); static dc_status_t mares_puck_device_dump (dc_device_t *abstract, dc_buffer_t *buffer); static dc_status_t mares_puck_device_foreach (dc_device_t *abstract, dc_dive_callback_t callback, void *userdata); -static dc_status_t mares_puck_device_close (dc_device_t *abstract); static const dc_device_vtable_t mares_puck_device_vtable = { sizeof(mares_puck_device_t), @@ -58,7 +56,7 @@ static const dc_device_vtable_t mares_puck_device_vtable = { mares_puck_device_dump, /* dump */ mares_puck_device_foreach, /* foreach */ NULL, /* timesync */ - mares_puck_device_close /* close */ + NULL /* close */ }; static const mares_common_layout_t mares_puck_layout = { @@ -87,7 +85,7 @@ static const mares_common_layout_t mares_nemowide_layout = { dc_status_t -mares_puck_device_open (dc_device_t **out, dc_context_t *context, const char *name) +mares_puck_device_open (dc_device_t **out, dc_context_t *context, dc_iostream_t *iostream) { dc_status_t status = DC_STATUS_SUCCESS; mares_puck_device_t *device = NULL; @@ -103,45 +101,38 @@ mares_puck_device_open (dc_device_t **out, dc_context_t *context, const char *na } // Initialize the base class. - mares_common_device_init (&device->base); + mares_common_device_init (&device->base, iostream); // Set the default values. device->layout = NULL; memset (device->fingerprint, 0, sizeof (device->fingerprint)); - // Open the device. - status = dc_serial_open (&device->base.iostream, context, name); - if (status != DC_STATUS_SUCCESS) { - ERROR (context, "Failed to open the serial port."); - goto error_free; - } - // Set the serial communication protocol (38400 8N1). status = dc_iostream_configure (device->base.iostream, 38400, 8, DC_PARITY_NONE, DC_STOPBITS_ONE, DC_FLOWCONTROL_NONE); if (status != DC_STATUS_SUCCESS) { ERROR (context, "Failed to set the terminal attributes."); - goto error_close; + goto error_free; } // Set the timeout for receiving data (1000 ms). status = dc_iostream_set_timeout (device->base.iostream, 1000); if (status != DC_STATUS_SUCCESS) { ERROR (context, "Failed to set the timeout."); - goto error_close; + goto error_free; } // Clear the DTR line. status = dc_iostream_set_dtr (device->base.iostream, 0); if (status != DC_STATUS_SUCCESS) { ERROR (context, "Failed to clear the DTR line."); - goto error_close; + goto error_free; } // Clear the RTS line. status = dc_iostream_set_rts (device->base.iostream, 0); if (status != DC_STATUS_SUCCESS) { ERROR (context, "Failed to clear the RTS line."); - goto error_close; + goto error_free; } // Make sure everything is in a sane state. @@ -151,7 +142,7 @@ mares_puck_device_open (dc_device_t **out, dc_context_t *context, const char *na unsigned char header[PACKETSIZE] = {0}; status = mares_common_device_read ((dc_device_t *) device, 0, header, sizeof (header)); if (status != DC_STATUS_SUCCESS) { - goto error_close; + goto error_free; } // Override the base class values. @@ -175,31 +166,12 @@ mares_puck_device_open (dc_device_t **out, dc_context_t *context, const char *na return DC_STATUS_SUCCESS; -error_close: - dc_iostream_close (device->base.iostream); error_free: dc_device_deallocate ((dc_device_t *) device); return status; } -static dc_status_t -mares_puck_device_close (dc_device_t *abstract) -{ - dc_status_t status = DC_STATUS_SUCCESS; - mares_puck_device_t *device = (mares_puck_device_t*) abstract; - dc_status_t rc = DC_STATUS_SUCCESS; - - // Close the device. - rc = dc_iostream_close (device->base.iostream); - if (rc != DC_STATUS_SUCCESS) { - dc_status_set_error(&status, rc); - } - - return status; -} - - static dc_status_t mares_puck_device_set_fingerprint (dc_device_t *abstract, const unsigned char data[], unsigned int size) { diff --git a/src/mares_puck.h b/src/mares_puck.h index 01447d1..421fc28 100644 --- a/src/mares_puck.h +++ b/src/mares_puck.h @@ -23,6 +23,7 @@ #define MARES_PUCK_H #include +#include #include #include @@ -31,7 +32,7 @@ extern "C" { #endif /* __cplusplus */ dc_status_t -mares_puck_device_open (dc_device_t **device, dc_context_t *context, const char *name); +mares_puck_device_open (dc_device_t **device, dc_context_t *context, dc_iostream_t *iostream); #ifdef __cplusplus } diff --git a/src/oceanic_atom2.c b/src/oceanic_atom2.c index 77b946a..f7a9b7a 100644 --- a/src/oceanic_atom2.c +++ b/src/oceanic_atom2.c @@ -26,7 +26,6 @@ #include "oceanic_common.h" #include "context-private.h" #include "device-private.h" -#include "serial.h" #include "array.h" #include "ringbuffer.h" #include "checksum.h" @@ -574,7 +573,7 @@ oceanic_atom2_quit (oceanic_atom2_device_t *device) dc_status_t -oceanic_atom2_device_open (dc_device_t **out, dc_context_t *context, const char *name, unsigned int model) +oceanic_atom2_device_open (dc_device_t **out, dc_context_t *context, dc_iostream_t *iostream, unsigned int model) { dc_status_t status = DC_STATUS_SUCCESS; oceanic_atom2_device_t *device = NULL; @@ -593,19 +592,12 @@ oceanic_atom2_device_open (dc_device_t **out, dc_context_t *context, const char oceanic_common_device_init (&device->base); // Set the default values. - device->iostream = NULL; + device->iostream = iostream; device->delay = 0; device->bigpage = 1; // no big pages device->cached = INVALID; memset(device->cache, 0, sizeof(device->cache)); - // Open the device. - status = dc_serial_open (&device->iostream, context, name); - if (status != DC_STATUS_SUCCESS) { - ERROR (context, "Failed to open the serial port."); - goto error_free; - } - // Get the correct baudrate. unsigned int baudrate = 38400; if (model == VTX || model == I750TC) { @@ -616,14 +608,14 @@ oceanic_atom2_device_open (dc_device_t **out, dc_context_t *context, const char status = dc_iostream_configure (device->iostream, baudrate, 8, DC_PARITY_NONE, DC_STOPBITS_ONE, DC_FLOWCONTROL_NONE); if (status != DC_STATUS_SUCCESS) { ERROR (context, "Failed to set the terminal attributes."); - goto error_close; + goto error_free; } // Set the timeout for receiving data (1000 ms). status = dc_iostream_set_timeout (device->iostream, 1000); if (status != DC_STATUS_SUCCESS) { ERROR (context, "Failed to set the timeout."); - goto error_close; + goto error_free; } // Give the interface 100 ms to settle and draw power up. @@ -649,7 +641,7 @@ oceanic_atom2_device_open (dc_device_t **out, dc_context_t *context, const char // by connecting the device), or already in download mode. status = oceanic_atom2_device_version ((dc_device_t *) device, device->base.version, sizeof (device->base.version)); if (status != DC_STATUS_SUCCESS) { - goto error_close; + goto error_free; } // Override the base class values. @@ -719,8 +711,6 @@ oceanic_atom2_device_open (dc_device_t **out, dc_context_t *context, const char return DC_STATUS_SUCCESS; -error_close: - dc_iostream_close (device->iostream); error_free: dc_device_deallocate ((dc_device_t *) device); return status; @@ -740,12 +730,6 @@ oceanic_atom2_device_close (dc_device_t *abstract) dc_status_set_error(&status, rc); } - // Close the device. - rc = dc_iostream_close (device->iostream); - if (rc != DC_STATUS_SUCCESS) { - dc_status_set_error(&status, rc); - } - return status; } diff --git a/src/oceanic_atom2.h b/src/oceanic_atom2.h index cee2306..25da953 100644 --- a/src/oceanic_atom2.h +++ b/src/oceanic_atom2.h @@ -23,6 +23,7 @@ #define OCEANIC_ATOM2_H #include +#include #include #include @@ -33,7 +34,7 @@ extern "C" { #endif /* __cplusplus */ dc_status_t -oceanic_atom2_device_open (dc_device_t **device, dc_context_t *context, const char *name, unsigned int model); +oceanic_atom2_device_open (dc_device_t **device, dc_context_t *context, dc_iostream_t *iostream, unsigned int model); dc_status_t oceanic_atom2_parser_create (dc_parser_t **parser, dc_context_t *context, unsigned int model); diff --git a/src/oceanic_veo250.c b/src/oceanic_veo250.c index ffb1c05..42cb676 100644 --- a/src/oceanic_veo250.c +++ b/src/oceanic_veo250.c @@ -26,7 +26,6 @@ #include "oceanic_common.h" #include "context-private.h" #include "device-private.h" -#include "serial.h" #include "ringbuffer.h" #include "checksum.h" @@ -226,7 +225,7 @@ oceanic_veo250_quit (oceanic_veo250_device_t *device) dc_status_t -oceanic_veo250_device_open (dc_device_t **out, dc_context_t *context, const char *name) +oceanic_veo250_device_open (dc_device_t **out, dc_context_t *context, dc_iostream_t *iostream) { dc_status_t status = DC_STATUS_SUCCESS; oceanic_veo250_device_t *device = NULL; @@ -248,42 +247,35 @@ oceanic_veo250_device_open (dc_device_t **out, dc_context_t *context, const char device->base.multipage = MULTIPAGE; // Set the default values. - device->iostream = NULL; + device->iostream = iostream; device->last = 0; - // Open the device. - status = dc_serial_open (&device->iostream, context, name); - if (status != DC_STATUS_SUCCESS) { - ERROR (context, "Failed to open the serial port."); - goto error_free; - } - // Set the serial communication protocol (9600 8N1). status = dc_iostream_configure (device->iostream, 9600, 8, DC_PARITY_NONE, DC_STOPBITS_ONE, DC_FLOWCONTROL_NONE); if (status != DC_STATUS_SUCCESS) { ERROR (context, "Failed to set the terminal attributes."); - goto error_close; + goto error_free; } // Set the timeout for receiving data (3000 ms). status = dc_iostream_set_timeout (device->iostream, 3000); if (status != DC_STATUS_SUCCESS) { ERROR (context, "Failed to set the timeout."); - goto error_close; + goto error_free; } // Set the DTR line. status = dc_iostream_set_dtr (device->iostream, 1); if (status != DC_STATUS_SUCCESS) { ERROR (context, "Failed to set the DTR line."); - goto error_close; + goto error_free; } // Set the RTS line. status = dc_iostream_set_rts (device->iostream, 1); if (status != DC_STATUS_SUCCESS) { ERROR (context, "Failed to set the RTS line."); - goto error_close; + goto error_free; } // Give the interface 100 ms to settle and draw power up. @@ -295,7 +287,7 @@ oceanic_veo250_device_open (dc_device_t **out, dc_context_t *context, const char // Initialize the data cable (PPS mode). status = oceanic_veo250_init (device); if (status != DC_STATUS_SUCCESS) { - goto error_close; + goto error_free; } // Delay the sending of the version command. @@ -306,7 +298,7 @@ oceanic_veo250_device_open (dc_device_t **out, dc_context_t *context, const char // the user), or already in download mode. status = oceanic_veo250_device_version ((dc_device_t *) device, device->base.version, sizeof (device->base.version)); if (status != DC_STATUS_SUCCESS) { - goto error_close; + goto error_free; } // Override the base class values. @@ -321,8 +313,6 @@ oceanic_veo250_device_open (dc_device_t **out, dc_context_t *context, const char return DC_STATUS_SUCCESS; -error_close: - dc_iostream_close (device->iostream); error_free: dc_device_deallocate ((dc_device_t *) device); return status; @@ -342,12 +332,6 @@ oceanic_veo250_device_close (dc_device_t *abstract) dc_status_set_error(&status, rc); } - // Close the device. - rc = dc_iostream_close (device->iostream); - if (rc != DC_STATUS_SUCCESS) { - dc_status_set_error(&status, rc); - } - return status; } diff --git a/src/oceanic_veo250.h b/src/oceanic_veo250.h index aefd20e..fc79375 100644 --- a/src/oceanic_veo250.h +++ b/src/oceanic_veo250.h @@ -23,6 +23,7 @@ #define OCEANIC_VEO250_H #include +#include #include #include @@ -33,7 +34,7 @@ extern "C" { #endif /* __cplusplus */ dc_status_t -oceanic_veo250_device_open (dc_device_t **device, dc_context_t *context, const char *name); +oceanic_veo250_device_open (dc_device_t **device, dc_context_t *context, dc_iostream_t *iostream); dc_status_t oceanic_veo250_parser_create (dc_parser_t **parser, dc_context_t *context, unsigned int model); diff --git a/src/oceanic_vtpro.c b/src/oceanic_vtpro.c index 8635b73..2c9298b 100644 --- a/src/oceanic_vtpro.c +++ b/src/oceanic_vtpro.c @@ -27,7 +27,6 @@ #include "oceanic_common.h" #include "context-private.h" #include "device-private.h" -#include "serial.h" #include "ringbuffer.h" #include "checksum.h" #include "array.h" @@ -389,7 +388,7 @@ oceanic_vtpro_device_logbook (dc_device_t *abstract, dc_event_progress_t *progre } dc_status_t -oceanic_vtpro_device_open (dc_device_t **out, dc_context_t *context, const char *name, unsigned int model) +oceanic_vtpro_device_open (dc_device_t **out, dc_context_t *context, dc_iostream_t *iostream, unsigned int model) { dc_status_t status = DC_STATUS_SUCCESS; oceanic_vtpro_device_t *device = NULL; @@ -411,7 +410,7 @@ oceanic_vtpro_device_open (dc_device_t **out, dc_context_t *context, const char device->base.multipage = MULTIPAGE; // Set the default values. - device->iostream = NULL; + device->iostream = iostream; device->model = model; if (model == AERIS500AI) { device->protocol = INTR; @@ -419,39 +418,32 @@ oceanic_vtpro_device_open (dc_device_t **out, dc_context_t *context, const char device->protocol = MOD; } - // Open the device. - status = dc_serial_open (&device->iostream, context, name); - if (status != DC_STATUS_SUCCESS) { - ERROR (context, "Failed to open the serial port."); - goto error_free; - } - // Set the serial communication protocol (9600 8N1). status = dc_iostream_configure (device->iostream, 9600, 8, DC_PARITY_NONE, DC_STOPBITS_ONE, DC_FLOWCONTROL_NONE); if (status != DC_STATUS_SUCCESS) { ERROR (context, "Failed to set the terminal attributes."); - goto error_close; + goto error_free; } // Set the timeout for receiving data (3000 ms). status = dc_iostream_set_timeout (device->iostream, 3000); if (status != DC_STATUS_SUCCESS) { ERROR (context, "Failed to set the timeout."); - goto error_close; + goto error_free; } // Set the DTR line. status = dc_iostream_set_dtr (device->iostream, 1); if (status != DC_STATUS_SUCCESS) { ERROR (context, "Failed to set the DTR line."); - goto error_close; + goto error_free; } // Set the RTS line. status = dc_iostream_set_rts (device->iostream, 1); if (status != DC_STATUS_SUCCESS) { ERROR (context, "Failed to set the RTS line."); - goto error_close; + goto error_free; } // Give the interface 100 ms to settle and draw power up. @@ -463,7 +455,7 @@ oceanic_vtpro_device_open (dc_device_t **out, dc_context_t *context, const char // Initialize the data cable (MOD mode). status = oceanic_vtpro_init (device); if (status != DC_STATUS_SUCCESS) { - goto error_close; + goto error_free; } // Switch the device from surface mode into download mode. Before sending @@ -471,7 +463,7 @@ oceanic_vtpro_device_open (dc_device_t **out, dc_context_t *context, const char // the user), or already in download mode. status = oceanic_vtpro_device_version ((dc_device_t *) device, device->base.version, sizeof (device->base.version)); if (status != DC_STATUS_SUCCESS) { - goto error_close; + goto error_free; } // Calibrate the device. Although calibration is optional, it's highly @@ -479,7 +471,7 @@ oceanic_vtpro_device_open (dc_device_t **out, dc_context_t *context, const char // when processing the command itself is quite slow. status = oceanic_vtpro_calibrate (device); if (status != DC_STATUS_SUCCESS) { - goto error_close; + goto error_free; } // Override the base class values. @@ -498,8 +490,6 @@ oceanic_vtpro_device_open (dc_device_t **out, dc_context_t *context, const char return DC_STATUS_SUCCESS; -error_close: - dc_iostream_close (device->iostream); error_free: dc_device_deallocate ((dc_device_t *) device); return status; @@ -519,12 +509,6 @@ oceanic_vtpro_device_close (dc_device_t *abstract) dc_status_set_error(&status, rc); } - // Close the device. - rc = dc_iostream_close (device->iostream); - if (rc != DC_STATUS_SUCCESS) { - dc_status_set_error(&status, rc); - } - return status; } diff --git a/src/oceanic_vtpro.h b/src/oceanic_vtpro.h index 9689818..6a3c2cd 100644 --- a/src/oceanic_vtpro.h +++ b/src/oceanic_vtpro.h @@ -23,6 +23,7 @@ #define OCEANIC_VTPRO_H #include +#include #include #include @@ -33,7 +34,7 @@ extern "C" { #endif /* __cplusplus */ dc_status_t -oceanic_vtpro_device_open (dc_device_t **device, dc_context_t *context, const char *name, unsigned int model); +oceanic_vtpro_device_open (dc_device_t **device, dc_context_t *context, dc_iostream_t *iostream, unsigned int model); dc_status_t oceanic_vtpro_parser_create (dc_parser_t **parser, dc_context_t *context, unsigned int model); diff --git a/src/reefnet_sensus.c b/src/reefnet_sensus.c index b8d0820..675a4cb 100644 --- a/src/reefnet_sensus.c +++ b/src/reefnet_sensus.c @@ -25,7 +25,6 @@ #include "reefnet_sensus.h" #include "context-private.h" #include "device-private.h" -#include "serial.h" #include "checksum.h" #include "array.h" @@ -86,7 +85,7 @@ reefnet_sensus_cancel (reefnet_sensus_device_t *device) dc_status_t -reefnet_sensus_device_open (dc_device_t **out, dc_context_t *context, const char *name) +reefnet_sensus_device_open (dc_device_t **out, dc_context_t *context, dc_iostream_t *iostream) { dc_status_t status = DC_STATUS_SUCCESS; reefnet_sensus_device_t *device = NULL; @@ -102,32 +101,25 @@ reefnet_sensus_device_open (dc_device_t **out, dc_context_t *context, const char } // Set the default values. - device->iostream = NULL; + device->iostream = iostream; device->waiting = 0; device->timestamp = 0; device->systime = (dc_ticks_t) -1; device->devtime = 0; memset (device->handshake, 0, sizeof (device->handshake)); - // Open the device. - status = dc_serial_open (&device->iostream, context, name); - if (status != DC_STATUS_SUCCESS) { - ERROR (context, "Failed to open the serial port."); - goto error_free; - } - // Set the serial communication protocol (19200 8N1). status = dc_iostream_configure (device->iostream, 19200, 8, DC_PARITY_NONE, DC_STOPBITS_ONE, DC_FLOWCONTROL_NONE); if (status != DC_STATUS_SUCCESS) { ERROR (context, "Failed to set the terminal attributes."); - goto error_close; + goto error_free; } // Set the timeout for receiving data (3000 ms). status = dc_iostream_set_timeout (device->iostream, 3000); if (status != DC_STATUS_SUCCESS) { ERROR (context, "Failed to set the timeout."); - goto error_close; + goto error_free; } // Make sure everything is in a sane state. @@ -137,8 +129,6 @@ reefnet_sensus_device_open (dc_device_t **out, dc_context_t *context, const char return DC_STATUS_SUCCESS; -error_close: - dc_iostream_close (device->iostream); error_free: dc_device_deallocate ((dc_device_t *) device); return status; @@ -161,12 +151,6 @@ reefnet_sensus_device_close (dc_device_t *abstract) } } - // Close the device. - rc = dc_iostream_close (device->iostream); - if (rc != DC_STATUS_SUCCESS) { - dc_status_set_error(&status, rc); - } - return status; } diff --git a/src/reefnet_sensus.h b/src/reefnet_sensus.h index 2ca6d43..a021b86 100644 --- a/src/reefnet_sensus.h +++ b/src/reefnet_sensus.h @@ -23,6 +23,7 @@ #define REEFNET_SENSUS_H #include +#include #include #include #include @@ -32,7 +33,7 @@ extern "C" { #endif /* __cplusplus */ dc_status_t -reefnet_sensus_device_open (dc_device_t **device, dc_context_t *context, const char *name); +reefnet_sensus_device_open (dc_device_t **device, dc_context_t *context, dc_iostream_t *iostream); dc_status_t reefnet_sensus_parser_create (dc_parser_t **parser, dc_context_t *context, unsigned int devtime, dc_ticks_t systime); diff --git a/src/reefnet_sensuspro.c b/src/reefnet_sensuspro.c index 0001f1c..b33fe9a 100644 --- a/src/reefnet_sensuspro.c +++ b/src/reefnet_sensuspro.c @@ -25,7 +25,6 @@ #include "reefnet_sensuspro.h" #include "context-private.h" #include "device-private.h" -#include "serial.h" #include "checksum.h" #include "array.h" @@ -46,7 +45,6 @@ typedef struct reefnet_sensuspro_device_t { static dc_status_t reefnet_sensuspro_device_set_fingerprint (dc_device_t *abstract, const unsigned char data[], unsigned int size); static dc_status_t reefnet_sensuspro_device_dump (dc_device_t *abstract, dc_buffer_t *buffer); static dc_status_t reefnet_sensuspro_device_foreach (dc_device_t *abstract, dc_dive_callback_t callback, void *userdata); -static dc_status_t reefnet_sensuspro_device_close (dc_device_t *abstract); static const dc_device_vtable_t reefnet_sensuspro_device_vtable = { sizeof(reefnet_sensuspro_device_t), @@ -57,14 +55,14 @@ static const dc_device_vtable_t reefnet_sensuspro_device_vtable = { reefnet_sensuspro_device_dump, /* dump */ reefnet_sensuspro_device_foreach, /* foreach */ NULL, /* timesync */ - reefnet_sensuspro_device_close /* close */ + NULL /* close */ }; static dc_status_t reefnet_sensuspro_extract_dives (dc_device_t *device, const unsigned char data[], unsigned int size, dc_dive_callback_t callback, void *userdata); dc_status_t -reefnet_sensuspro_device_open (dc_device_t **out, dc_context_t *context, const char *name) +reefnet_sensuspro_device_open (dc_device_t **out, dc_context_t *context, dc_iostream_t *iostream) { dc_status_t status = DC_STATUS_SUCCESS; reefnet_sensuspro_device_t *device = NULL; @@ -80,31 +78,24 @@ reefnet_sensuspro_device_open (dc_device_t **out, dc_context_t *context, const c } // Set the default values. - device->iostream = NULL; + device->iostream = iostream; device->timestamp = 0; device->systime = (dc_ticks_t) -1; device->devtime = 0; memset (device->handshake, 0, sizeof (device->handshake)); - // Open the device. - status = dc_serial_open (&device->iostream, context, name); - if (status != DC_STATUS_SUCCESS) { - ERROR (context, "Failed to open the serial port."); - goto error_free; - } - // Set the serial communication protocol (19200 8N1). status = dc_iostream_configure (device->iostream, 19200, 8, DC_PARITY_NONE, DC_STOPBITS_ONE, DC_FLOWCONTROL_NONE); if (status != DC_STATUS_SUCCESS) { ERROR (context, "Failed to set the terminal attributes."); - goto error_close; + goto error_free; } // Set the timeout for receiving data (3000ms). status = dc_iostream_set_timeout (device->iostream, 3000); if (status != DC_STATUS_SUCCESS) { ERROR (context, "Failed to set the timeout."); - goto error_close; + goto error_free; } // Make sure everything is in a sane state. @@ -114,31 +105,12 @@ reefnet_sensuspro_device_open (dc_device_t **out, dc_context_t *context, const c return DC_STATUS_SUCCESS; -error_close: - dc_iostream_close (device->iostream); error_free: dc_device_deallocate ((dc_device_t *) device); return status; } -static dc_status_t -reefnet_sensuspro_device_close (dc_device_t *abstract) -{ - dc_status_t status = DC_STATUS_SUCCESS; - reefnet_sensuspro_device_t *device = (reefnet_sensuspro_device_t*) abstract; - dc_status_t rc = DC_STATUS_SUCCESS; - - // Close the device. - rc = dc_iostream_close (device->iostream); - if (rc != DC_STATUS_SUCCESS) { - dc_status_set_error(&status, rc); - } - - return status; -} - - dc_status_t reefnet_sensuspro_device_get_handshake (dc_device_t *abstract, unsigned char data[], unsigned int size) { diff --git a/src/reefnet_sensuspro.h b/src/reefnet_sensuspro.h index 000959a..9932515 100644 --- a/src/reefnet_sensuspro.h +++ b/src/reefnet_sensuspro.h @@ -23,6 +23,7 @@ #define REEFNET_SENSUSPRO_H #include +#include #include #include #include @@ -32,7 +33,7 @@ extern "C" { #endif /* __cplusplus */ dc_status_t -reefnet_sensuspro_device_open (dc_device_t **device, dc_context_t *context, const char *name); +reefnet_sensuspro_device_open (dc_device_t **device, dc_context_t *context, dc_iostream_t *iostream); dc_status_t reefnet_sensuspro_parser_create (dc_parser_t **parser, dc_context_t *context, unsigned int devtime, dc_ticks_t systime); diff --git a/src/reefnet_sensusultra.c b/src/reefnet_sensusultra.c index 9ac95a2..22ffe81 100644 --- a/src/reefnet_sensusultra.c +++ b/src/reefnet_sensusultra.c @@ -26,7 +26,6 @@ #include "reefnet_sensusultra.h" #include "context-private.h" #include "device-private.h" -#include "serial.h" #include "checksum.h" #include "array.h" @@ -55,7 +54,6 @@ typedef struct reefnet_sensusultra_device_t { static dc_status_t reefnet_sensusultra_device_set_fingerprint (dc_device_t *abstract, const unsigned char data[], unsigned int size); static dc_status_t reefnet_sensusultra_device_dump (dc_device_t *abstract, dc_buffer_t *buffer); static dc_status_t reefnet_sensusultra_device_foreach (dc_device_t *abstract, dc_dive_callback_t callback, void *userdata); -static dc_status_t reefnet_sensusultra_device_close (dc_device_t *abstract); static const dc_device_vtable_t reefnet_sensusultra_device_vtable = { sizeof(reefnet_sensusultra_device_t), @@ -66,12 +64,12 @@ static const dc_device_vtable_t reefnet_sensusultra_device_vtable = { reefnet_sensusultra_device_dump, /* dump */ reefnet_sensusultra_device_foreach, /* foreach */ NULL, /* timesync */ - reefnet_sensusultra_device_close /* close */ + NULL /* close */ }; dc_status_t -reefnet_sensusultra_device_open (dc_device_t **out, dc_context_t *context, const char *name) +reefnet_sensusultra_device_open (dc_device_t **out, dc_context_t *context, dc_iostream_t *iostream) { dc_status_t status = DC_STATUS_SUCCESS; reefnet_sensusultra_device_t *device = NULL; @@ -87,31 +85,24 @@ reefnet_sensusultra_device_open (dc_device_t **out, dc_context_t *context, const } // Set the default values. - device->iostream = NULL; + device->iostream = iostream; device->timestamp = 0; device->systime = (dc_ticks_t) -1; device->devtime = 0; memset (device->handshake, 0, sizeof (device->handshake)); - // Open the device. - status = dc_serial_open (&device->iostream, context, name); - if (status != DC_STATUS_SUCCESS) { - ERROR (context, "Failed to open the serial port."); - goto error_free; - } - // Set the serial communication protocol (115200 8N1). status = dc_iostream_configure (device->iostream, 115200, 8, DC_PARITY_NONE, DC_STOPBITS_ONE, DC_FLOWCONTROL_NONE); if (status != DC_STATUS_SUCCESS) { ERROR (context, "Failed to set the terminal attributes."); - goto error_close; + goto error_free; } // Set the timeout for receiving data (3000ms). status = dc_iostream_set_timeout (device->iostream, 3000); if (status != DC_STATUS_SUCCESS) { ERROR (context, "Failed to set the timeout."); - goto error_close; + goto error_free; } // Make sure everything is in a sane state. @@ -121,31 +112,12 @@ reefnet_sensusultra_device_open (dc_device_t **out, dc_context_t *context, const return DC_STATUS_SUCCESS; -error_close: - dc_iostream_close (device->iostream); error_free: dc_device_deallocate ((dc_device_t *) device); return status; } -static dc_status_t -reefnet_sensusultra_device_close (dc_device_t *abstract) -{ - dc_status_t status = DC_STATUS_SUCCESS; - reefnet_sensusultra_device_t *device = (reefnet_sensusultra_device_t*) abstract; - dc_status_t rc = DC_STATUS_SUCCESS; - - // Close the device. - rc = dc_iostream_close (device->iostream); - if (rc != DC_STATUS_SUCCESS) { - dc_status_set_error(&status, rc); - } - - return status; -} - - dc_status_t reefnet_sensusultra_device_get_handshake (dc_device_t *abstract, unsigned char data[], unsigned int size) { diff --git a/src/reefnet_sensusultra.h b/src/reefnet_sensusultra.h index 84fcaea..af73c8a 100644 --- a/src/reefnet_sensusultra.h +++ b/src/reefnet_sensusultra.h @@ -23,6 +23,7 @@ #define REEFNET_SENSUSULTRA_H #include +#include #include #include #include @@ -32,7 +33,7 @@ extern "C" { #endif /* __cplusplus */ dc_status_t -reefnet_sensusultra_device_open (dc_device_t **device, dc_context_t *context, const char *name); +reefnet_sensusultra_device_open (dc_device_t **device, dc_context_t *context, dc_iostream_t *iostream); dc_status_t reefnet_sensusultra_parser_create (dc_parser_t **parser, dc_context_t *context, unsigned int devtime, dc_ticks_t systime); diff --git a/src/shearwater_common.c b/src/shearwater_common.c index a6b454d..130ff62 100644 --- a/src/shearwater_common.c +++ b/src/shearwater_common.c @@ -36,29 +36,24 @@ #define ESC_ESC 0xDD dc_status_t -shearwater_common_open (shearwater_common_device_t *device, dc_context_t *context, const char *name) +shearwater_common_setup (shearwater_common_device_t *device, dc_context_t *context, dc_iostream_t *iostream) { dc_status_t status = DC_STATUS_SUCCESS; - // Open the device. - status = dc_serial_open (&device->iostream, context, name); - if (status != DC_STATUS_SUCCESS) { - ERROR (context, "Failed to open the serial port."); - return status; - } + device->iostream = iostream; // Set the serial communication protocol (115200 8N1). status = dc_iostream_configure (device->iostream, 115200, 8, DC_PARITY_NONE, DC_STOPBITS_ONE, DC_FLOWCONTROL_NONE); if (status != DC_STATUS_SUCCESS) { ERROR (context, "Failed to set the terminal attributes."); - goto error_close; + return status; } // Set the timeout for receiving data (3000ms). status = dc_iostream_set_timeout (device->iostream, 3000); if (status != DC_STATUS_SUCCESS) { ERROR (context, "Failed to set the timeout."); - goto error_close; + return status; } // Make sure everything is in a sane state. @@ -66,18 +61,6 @@ shearwater_common_open (shearwater_common_device_t *device, dc_context_t *contex dc_iostream_purge (device->iostream, DC_DIRECTION_ALL); return DC_STATUS_SUCCESS; - -error_close: - dc_iostream_close (device->iostream); - return status; -} - - -dc_status_t -shearwater_common_close (shearwater_common_device_t *device) -{ - // Close the device. - return dc_iostream_close (device->iostream); } diff --git a/src/shearwater_common.h b/src/shearwater_common.h index 3075f99..767372f 100644 --- a/src/shearwater_common.h +++ b/src/shearwater_common.h @@ -22,8 +22,9 @@ #ifndef SHEARWATER_COMMON_H #define SHEARWATER_COMMON_H +#include + #include "device-private.h" -#include "serial.h" #ifdef __cplusplus extern "C" { @@ -49,10 +50,7 @@ typedef struct shearwater_common_device_t { } shearwater_common_device_t; dc_status_t -shearwater_common_open (shearwater_common_device_t *device, dc_context_t *context, const char *name); - -dc_status_t -shearwater_common_close (shearwater_common_device_t *device); +shearwater_common_setup (shearwater_common_device_t *device, dc_context_t *context, dc_iostream_t *iostream); dc_status_t shearwater_common_transfer (shearwater_common_device_t *device, const unsigned char input[], unsigned int isize, unsigned char output[], unsigned int osize, unsigned int *actual); diff --git a/src/shearwater_petrel.c b/src/shearwater_petrel.c index 2f040dc..2e87a3f 100644 --- a/src/shearwater_petrel.c +++ b/src/shearwater_petrel.c @@ -77,7 +77,7 @@ str2num (unsigned char data[], unsigned int size, unsigned int offset) dc_status_t -shearwater_petrel_device_open (dc_device_t **out, dc_context_t *context, const char *name) +shearwater_petrel_device_open (dc_device_t **out, dc_context_t *context, dc_iostream_t *iostream) { dc_status_t status = DC_STATUS_SUCCESS; shearwater_petrel_device_t *device = NULL; @@ -95,8 +95,8 @@ shearwater_petrel_device_open (dc_device_t **out, dc_context_t *context, const c // Set the default values. memset (device->fingerprint, 0, sizeof (device->fingerprint)); - // Open the device. - status = shearwater_common_open (&device->base, context, name); + // Setup the device. + status = shearwater_common_setup (&device->base, context, iostream); if (status != DC_STATUS_SUCCESS) { goto error_free; } @@ -125,12 +125,6 @@ shearwater_petrel_device_close (dc_device_t *abstract) dc_status_set_error(&status, rc); } - // Close the device. - rc = shearwater_common_close (device); - if (rc != DC_STATUS_SUCCESS) { - dc_status_set_error(&status, rc); - } - return status; } diff --git a/src/shearwater_petrel.h b/src/shearwater_petrel.h index c23bb74..0a4e756 100644 --- a/src/shearwater_petrel.h +++ b/src/shearwater_petrel.h @@ -23,6 +23,7 @@ #define SHEARWATER_PETREL_H #include +#include #include #include @@ -31,7 +32,7 @@ extern "C" { #endif /* __cplusplus */ dc_status_t -shearwater_petrel_device_open (dc_device_t **device, dc_context_t *context, const char *name); +shearwater_petrel_device_open (dc_device_t **device, dc_context_t *context, dc_iostream_t *iostream); dc_status_t shearwater_petrel_parser_create (dc_parser_t **parser, dc_context_t *context, unsigned int model); diff --git a/src/shearwater_predator.c b/src/shearwater_predator.c index 6326785..e861c37 100644 --- a/src/shearwater_predator.c +++ b/src/shearwater_predator.c @@ -44,7 +44,6 @@ typedef struct shearwater_predator_device_t { static dc_status_t shearwater_predator_device_set_fingerprint (dc_device_t *abstract, const unsigned char data[], unsigned int size); static dc_status_t shearwater_predator_device_dump (dc_device_t *abstract, dc_buffer_t *buffer); static dc_status_t shearwater_predator_device_foreach (dc_device_t *abstract, dc_dive_callback_t callback, void *userdata); -static dc_status_t shearwater_predator_device_close (dc_device_t *abstract); static const dc_device_vtable_t shearwater_predator_device_vtable = { sizeof(shearwater_predator_device_t), @@ -55,14 +54,14 @@ static const dc_device_vtable_t shearwater_predator_device_vtable = { shearwater_predator_device_dump, /* dump */ shearwater_predator_device_foreach, /* foreach */ NULL, /* timesync */ - shearwater_predator_device_close /* close */ + NULL /* close */ }; static dc_status_t shearwater_predator_extract_dives (dc_device_t *device, const unsigned char data[], unsigned int size, dc_dive_callback_t callback, void *userdata); dc_status_t -shearwater_predator_device_open (dc_device_t **out, dc_context_t *context, const char *name) +shearwater_predator_device_open (dc_device_t **out, dc_context_t *context, dc_iostream_t *iostream) { dc_status_t status = DC_STATUS_SUCCESS; shearwater_predator_device_t *device = NULL; @@ -80,8 +79,8 @@ shearwater_predator_device_open (dc_device_t **out, dc_context_t *context, const // Set the default values. memset (device->fingerprint, 0, sizeof (device->fingerprint)); - // Open the device. - status = shearwater_common_open (&device->base, context, name); + // Setup the device. + status = shearwater_common_setup (&device->base, context, iostream); if (status != DC_STATUS_SUCCESS) { goto error_free; } @@ -96,15 +95,6 @@ error_free: } -static dc_status_t -shearwater_predator_device_close (dc_device_t *abstract) -{ - shearwater_common_device_t *device = (shearwater_common_device_t *) abstract; - - return shearwater_common_close (device); -} - - static dc_status_t shearwater_predator_device_set_fingerprint (dc_device_t *abstract, const unsigned char data[], unsigned int size) { diff --git a/src/shearwater_predator.h b/src/shearwater_predator.h index 4665f80..5d1fccb 100644 --- a/src/shearwater_predator.h +++ b/src/shearwater_predator.h @@ -23,6 +23,7 @@ #define SHEARWATER_PREDATOR_H #include +#include #include #include @@ -31,7 +32,7 @@ extern "C" { #endif /* __cplusplus */ dc_status_t -shearwater_predator_device_open (dc_device_t **device, dc_context_t *context, const char *name); +shearwater_predator_device_open (dc_device_t **device, dc_context_t *context, dc_iostream_t *iostream); dc_status_t shearwater_predator_parser_create (dc_parser_t **parser, dc_context_t *context, unsigned int model); diff --git a/src/suunto_d9.c b/src/suunto_d9.c index 8c2834c..ab6eee1 100644 --- a/src/suunto_d9.c +++ b/src/suunto_d9.c @@ -26,7 +26,6 @@ #include "suunto_d9.h" #include "suunto_common2.h" #include "context-private.h" -#include "serial.h" #include "checksum.h" #include "array.h" @@ -48,7 +47,6 @@ typedef struct suunto_d9_device_t { } suunto_d9_device_t; static dc_status_t suunto_d9_device_packet (dc_device_t *abstract, const unsigned char command[], unsigned int csize, unsigned char answer[], unsigned int asize, unsigned int size); -static dc_status_t suunto_d9_device_close (dc_device_t *abstract); static const suunto_common2_device_vtable_t suunto_d9_device_vtable = { { @@ -60,7 +58,7 @@ static const suunto_common2_device_vtable_t suunto_d9_device_vtable = { suunto_common2_device_dump, /* dump */ suunto_common2_device_foreach, /* foreach */ NULL, /* timesync */ - suunto_d9_device_close /* close */ + NULL /* close */ }, suunto_d9_device_packet }; @@ -128,7 +126,7 @@ suunto_d9_device_autodetect (suunto_d9_device_t *device, unsigned int model) dc_status_t -suunto_d9_device_open (dc_device_t **out, dc_context_t *context, const char *name, unsigned int model) +suunto_d9_device_open (dc_device_t **out, dc_context_t *context, dc_iostream_t *iostream, unsigned int model) { dc_status_t status = DC_STATUS_SUCCESS; suunto_d9_device_t *device = NULL; @@ -147,34 +145,27 @@ suunto_d9_device_open (dc_device_t **out, dc_context_t *context, const char *nam suunto_common2_device_init (&device->base); // Set the default values. - device->iostream = NULL; - - // Open the device. - status = dc_serial_open (&device->iostream, context, name); - if (status != DC_STATUS_SUCCESS) { - ERROR (context, "Failed to open the serial port."); - goto error_free; - } + device->iostream = iostream; // Set the serial communication protocol (9600 8N1). status = dc_iostream_configure (device->iostream, 9600, 8, DC_PARITY_NONE, DC_STOPBITS_ONE, DC_FLOWCONTROL_NONE); if (status != DC_STATUS_SUCCESS) { ERROR (context, "Failed to set the terminal attributes."); - goto error_close; + goto error_free; } // Set the timeout for receiving data (3000 ms). status = dc_iostream_set_timeout (device->iostream, 3000); if (status != DC_STATUS_SUCCESS) { ERROR (context, "Failed to set the timeout."); - goto error_close; + goto error_free; } // Set the DTR line (power supply for the interface). status = dc_iostream_set_dtr (device->iostream, 1); if (status != DC_STATUS_SUCCESS) { ERROR (context, "Failed to set the DTR line."); - goto error_close; + goto error_free; } // Give the interface 100 ms to settle and draw power up. @@ -187,7 +178,7 @@ suunto_d9_device_open (dc_device_t **out, dc_context_t *context, const char *nam status = suunto_d9_device_autodetect (device, model); if (status != DC_STATUS_SUCCESS) { ERROR (context, "Failed to identify the protocol variant."); - goto error_close; + goto error_free; } // Override the base class values. @@ -205,31 +196,12 @@ suunto_d9_device_open (dc_device_t **out, dc_context_t *context, const char *nam return DC_STATUS_SUCCESS; -error_close: - dc_iostream_close (device->iostream); error_free: dc_device_deallocate ((dc_device_t *) device); return status; } -static dc_status_t -suunto_d9_device_close (dc_device_t *abstract) -{ - dc_status_t status = DC_STATUS_SUCCESS; - suunto_d9_device_t *device = (suunto_d9_device_t*) abstract; - dc_status_t rc = DC_STATUS_SUCCESS; - - // Close the device. - rc = dc_iostream_close (device->iostream); - if (rc != DC_STATUS_SUCCESS) { - dc_status_set_error(&status, rc); - } - - return status; -} - - static dc_status_t suunto_d9_device_packet (dc_device_t *abstract, const unsigned char command[], unsigned int csize, unsigned char answer[], unsigned int asize, unsigned int size) { diff --git a/src/suunto_d9.h b/src/suunto_d9.h index 91fe8b2..94a782f 100644 --- a/src/suunto_d9.h +++ b/src/suunto_d9.h @@ -23,6 +23,7 @@ #define SUUNTO_D9_H #include +#include #include #include #include @@ -32,7 +33,7 @@ extern "C" { #endif /* __cplusplus */ dc_status_t -suunto_d9_device_open (dc_device_t **device, dc_context_t *context, const char *name, unsigned int model); +suunto_d9_device_open (dc_device_t **device, dc_context_t *context, dc_iostream_t *iostream, unsigned int model); dc_status_t suunto_d9_parser_create (dc_parser_t **parser, dc_context_t *context, unsigned int model); diff --git a/src/suunto_eon.c b/src/suunto_eon.c index 8b9138c..84fc367 100644 --- a/src/suunto_eon.c +++ b/src/suunto_eon.c @@ -26,7 +26,6 @@ #include "suunto_common.h" #include "context-private.h" #include "device-private.h" -#include "serial.h" #include "checksum.h" #include "array.h" @@ -41,7 +40,6 @@ typedef struct suunto_eon_device_t { static dc_status_t suunto_eon_device_dump (dc_device_t *abstract, dc_buffer_t *buffer); static dc_status_t suunto_eon_device_foreach (dc_device_t *abstract, dc_dive_callback_t callback, void *userdata); -static dc_status_t suunto_eon_device_close (dc_device_t *abstract); static const dc_device_vtable_t suunto_eon_device_vtable = { sizeof(suunto_eon_device_t), @@ -52,7 +50,7 @@ static const dc_device_vtable_t suunto_eon_device_vtable = { suunto_eon_device_dump, /* dump */ suunto_eon_device_foreach, /* foreach */ NULL, /* timesync */ - suunto_eon_device_close /* close */ + NULL /* close */ }; static const suunto_common_layout_t suunto_eon_layout = { @@ -65,7 +63,7 @@ static const suunto_common_layout_t suunto_eon_layout = { dc_status_t -suunto_eon_device_open (dc_device_t **out, dc_context_t *context, const char *name) +suunto_eon_device_open (dc_device_t **out, dc_context_t *context, dc_iostream_t *iostream) { dc_status_t status = DC_STATUS_SUCCESS; suunto_eon_device_t *device = NULL; @@ -84,65 +82,39 @@ suunto_eon_device_open (dc_device_t **out, dc_context_t *context, const char *na suunto_common_device_init (&device->base); // Set the default values. - device->iostream = NULL; - - // Open the device. - status = dc_serial_open (&device->iostream, context, name); - if (status != DC_STATUS_SUCCESS) { - ERROR (context, "Failed to open the serial port."); - goto error_free; - } + device->iostream = iostream; // Set the serial communication protocol (1200 8N2). status = dc_iostream_configure (device->iostream, 1200, 8, DC_PARITY_NONE, DC_STOPBITS_TWO, DC_FLOWCONTROL_NONE); if (status != DC_STATUS_SUCCESS) { ERROR (context, "Failed to set the terminal attributes."); - goto error_close; + goto error_free; } // Set the timeout for receiving data (1000ms). status = dc_iostream_set_timeout (device->iostream, 1000); if (status != DC_STATUS_SUCCESS) { ERROR (context, "Failed to set the timeout."); - goto error_close; + goto error_free; } // Clear the RTS line. status = dc_iostream_set_rts (device->iostream, 0); if (status != DC_STATUS_SUCCESS) { ERROR (context, "Failed to set the DTR/RTS line."); - goto error_close; + goto error_free; } *out = (dc_device_t*) device; return DC_STATUS_SUCCESS; -error_close: - dc_iostream_close (device->iostream); error_free: dc_device_deallocate ((dc_device_t *) device); return status; } -static dc_status_t -suunto_eon_device_close (dc_device_t *abstract) -{ - dc_status_t status = DC_STATUS_SUCCESS; - suunto_eon_device_t *device = (suunto_eon_device_t*) abstract; - dc_status_t rc = DC_STATUS_SUCCESS; - - // Close the device. - rc = dc_iostream_close (device->iostream); - if (rc != DC_STATUS_SUCCESS) { - dc_status_set_error(&status, rc); - } - - return status; -} - - static dc_status_t suunto_eon_device_dump (dc_device_t *abstract, dc_buffer_t *buffer) { diff --git a/src/suunto_eon.h b/src/suunto_eon.h index 2adce91..5e99a69 100644 --- a/src/suunto_eon.h +++ b/src/suunto_eon.h @@ -23,6 +23,7 @@ #define SUUNTO_EON_H #include +#include #include #include #include @@ -32,7 +33,7 @@ extern "C" { #endif /* __cplusplus */ dc_status_t -suunto_eon_device_open (dc_device_t **device, dc_context_t *context, const char *name); +suunto_eon_device_open (dc_device_t **device, dc_context_t *context, dc_iostream_t *iostream); dc_status_t suunto_eon_parser_create (dc_parser_t **parser, dc_context_t *context, int spyder); diff --git a/src/suunto_eonsteel.c b/src/suunto_eonsteel.c index 5f4ad02..6c430b4 100644 --- a/src/suunto_eonsteel.c +++ b/src/suunto_eonsteel.c @@ -27,7 +27,6 @@ #include "context-private.h" #include "device-private.h" #include "array.h" -#include "usbhid.h" #include "platform.h" #define EONSTEEL 0 @@ -81,7 +80,6 @@ struct directory_entry { static dc_status_t suunto_eonsteel_device_set_fingerprint (dc_device_t *abstract, const unsigned char data[], unsigned int size); static dc_status_t suunto_eonsteel_device_foreach(dc_device_t *abstract, dc_dive_callback_t callback, void *userdata); static dc_status_t suunto_eonsteel_device_timesync(dc_device_t *abstract, const dc_datetime_t *datetime); -static dc_status_t suunto_eonsteel_device_close(dc_device_t *abstract); static const dc_device_vtable_t suunto_eonsteel_device_vtable = { sizeof(suunto_eonsteel_device_t), @@ -92,7 +90,7 @@ static const dc_device_vtable_t suunto_eonsteel_device_vtable = { NULL, /* dump */ suunto_eonsteel_device_foreach, /* foreach */ suunto_eonsteel_device_timesync, /* timesync */ - suunto_eonsteel_device_close /* close */ + NULL /* close */ }; static const char dive_directory[] = "0:/dives"; @@ -534,7 +532,7 @@ get_file_list(suunto_eonsteel_device_t *eon, struct directory_entry **res) } dc_status_t -suunto_eonsteel_device_open(dc_device_t **out, dc_context_t *context, unsigned int model) +suunto_eonsteel_device_open(dc_device_t **out, dc_context_t *context, dc_iostream_t *iostream, unsigned int model) { dc_status_t status = DC_STATUS_SUCCESS; suunto_eonsteel_device_t *eon = NULL; @@ -547,28 +545,17 @@ suunto_eonsteel_device_open(dc_device_t **out, dc_context_t *context, unsigned i return DC_STATUS_NOMEMORY; // Set up the magic handshake fields + eon->iostream = iostream; eon->model = model; eon->magic = INIT_MAGIC; eon->seq = INIT_SEQ; memset (eon->version, 0, sizeof (eon->version)); memset (eon->fingerprint, 0, sizeof (eon->fingerprint)); - unsigned int vid = 0x1493, pid = 0; - if (model == EONCORE) { - pid = 0x0033; - } else { - pid = 0x0030; - } - status = dc_usbhid_open(&eon->iostream, context, vid, pid); - if (status != DC_STATUS_SUCCESS) { - ERROR(context, "unable to open device"); - goto error_free; - } - status = dc_iostream_set_timeout(eon->iostream, 5000); if (status != DC_STATUS_SUCCESS) { ERROR (context, "Failed to set the timeout."); - goto error_close; + goto error_free; } const unsigned char init[] = {0x02, 0x00, 0x2a, 0x00}; @@ -576,15 +563,13 @@ suunto_eonsteel_device_open(dc_device_t **out, dc_context_t *context, unsigned i init, sizeof(init), eon->version, sizeof(eon->version), NULL); if (status != DC_STATUS_SUCCESS) { ERROR(context, "unable to initialize device"); - goto error_close; + goto error_free; } *out = (dc_device_t *) eon; return DC_STATUS_SUCCESS; -error_close: - dc_iostream_close(eon->iostream); error_free: free(eon); return status; @@ -777,13 +762,3 @@ static dc_status_t suunto_eonsteel_device_timesync(dc_device_t *abstract, const return DC_STATUS_SUCCESS; } - -static dc_status_t -suunto_eonsteel_device_close(dc_device_t *abstract) -{ - suunto_eonsteel_device_t *eon = (suunto_eonsteel_device_t *) abstract; - - dc_iostream_close(eon->iostream); - - return DC_STATUS_SUCCESS; -} diff --git a/src/suunto_eonsteel.h b/src/suunto_eonsteel.h index 2927dce..2800107 100644 --- a/src/suunto_eonsteel.h +++ b/src/suunto_eonsteel.h @@ -23,6 +23,7 @@ #define SUUNTO_EONSTEEL_H #include +#include #include #include @@ -31,7 +32,7 @@ extern "C" { #endif /* __cplusplus */ dc_status_t -suunto_eonsteel_device_open(dc_device_t **device, dc_context_t *context, unsigned int model); +suunto_eonsteel_device_open(dc_device_t **device, dc_context_t *context, dc_iostream_t *iostream, unsigned int model); dc_status_t suunto_eonsteel_parser_create(dc_parser_t **parser, dc_context_t *context, unsigned int model); diff --git a/src/suunto_solution.c b/src/suunto_solution.c index 9480252..a09c6d5 100644 --- a/src/suunto_solution.c +++ b/src/suunto_solution.c @@ -27,7 +27,6 @@ #include "context-private.h" #include "device-private.h" #include "ringbuffer.h" -#include "serial.h" #include "array.h" #define ISINSTANCE(device) dc_device_isinstance((device), &suunto_solution_device_vtable) @@ -44,7 +43,6 @@ typedef struct suunto_solution_device_t { static dc_status_t suunto_solution_device_dump (dc_device_t *abstract, dc_buffer_t *buffer); static dc_status_t suunto_solution_device_foreach (dc_device_t *abstract, dc_dive_callback_t callback, void *userdata); -static dc_status_t suunto_solution_device_close (dc_device_t *abstract); static const dc_device_vtable_t suunto_solution_device_vtable = { sizeof(suunto_solution_device_t), @@ -55,14 +53,14 @@ static const dc_device_vtable_t suunto_solution_device_vtable = { suunto_solution_device_dump, /* dump */ suunto_solution_device_foreach, /* foreach */ NULL, /* timesync */ - suunto_solution_device_close /* close */ + NULL /* close */ }; static dc_status_t suunto_solution_extract_dives (dc_device_t *device, const unsigned char data[], unsigned int size, dc_dive_callback_t callback, void *userdata); dc_status_t -suunto_solution_device_open (dc_device_t **out, dc_context_t *context, const char *name) +suunto_solution_device_open (dc_device_t **out, dc_context_t *context, dc_iostream_t *iostream) { dc_status_t status = DC_STATUS_SUCCESS; suunto_solution_device_t *device = NULL; @@ -78,65 +76,39 @@ suunto_solution_device_open (dc_device_t **out, dc_context_t *context, const cha } // Set the default values. - device->iostream = NULL; - - // Open the device. - status = dc_serial_open (&device->iostream, context, name); - if (status != DC_STATUS_SUCCESS) { - ERROR (context, "Failed to open the serial port."); - goto error_free; - } + device->iostream = iostream; // Set the serial communication protocol (1200 8N2). status = dc_iostream_configure (device->iostream, 1200, 8, DC_PARITY_NONE, DC_STOPBITS_TWO, DC_FLOWCONTROL_NONE); if (status != DC_STATUS_SUCCESS) { ERROR (context, "Failed to set the terminal attributes."); - goto error_close; + goto error_free; } // Set the timeout for receiving data (1000ms). status = dc_iostream_set_timeout (device->iostream, 1000); if (status != DC_STATUS_SUCCESS) { ERROR (context, "Failed to set the timeout."); - goto error_close; + goto error_free; } // Clear the RTS line. status = dc_iostream_set_rts (device->iostream, 0); if (status != DC_STATUS_SUCCESS) { ERROR (context, "Failed to set the DTR/RTS line."); - goto error_close; + goto error_free; } *out = (dc_device_t*) device; return DC_STATUS_SUCCESS; -error_close: - dc_iostream_close (device->iostream); error_free: dc_device_deallocate ((dc_device_t *) device); return status; } -static dc_status_t -suunto_solution_device_close (dc_device_t *abstract) -{ - dc_status_t status = DC_STATUS_SUCCESS; - suunto_solution_device_t *device = (suunto_solution_device_t*) abstract; - dc_status_t rc = DC_STATUS_SUCCESS; - - // Close the device. - rc = dc_iostream_close (device->iostream); - if (rc != DC_STATUS_SUCCESS) { - dc_status_set_error(&status, rc); - } - - return status; -} - - static dc_status_t suunto_solution_device_dump (dc_device_t *abstract, dc_buffer_t *buffer) { diff --git a/src/suunto_solution.h b/src/suunto_solution.h index e322583..9d9e632 100644 --- a/src/suunto_solution.h +++ b/src/suunto_solution.h @@ -23,6 +23,7 @@ #define SUUNTO_SOLUTION_H #include +#include #include #include @@ -31,7 +32,7 @@ extern "C" { #endif /* __cplusplus */ dc_status_t -suunto_solution_device_open (dc_device_t **device, dc_context_t *context, const char *name); +suunto_solution_device_open (dc_device_t **device, dc_context_t *context, dc_iostream_t *iostream); dc_status_t suunto_solution_parser_create (dc_parser_t **parser, dc_context_t *context); diff --git a/src/suunto_vyper.c b/src/suunto_vyper.c index 276e633..fe3b405 100644 --- a/src/suunto_vyper.c +++ b/src/suunto_vyper.c @@ -27,7 +27,6 @@ #include "suunto_common.h" #include "context-private.h" #include "device-private.h" -#include "serial.h" #include "checksum.h" #include "array.h" @@ -53,7 +52,6 @@ static dc_status_t suunto_vyper_device_read (dc_device_t *abstract, unsigned int static dc_status_t suunto_vyper_device_write (dc_device_t *abstract, unsigned int address, const unsigned char data[], unsigned int size); static dc_status_t suunto_vyper_device_dump (dc_device_t *abstract, dc_buffer_t *buffer); static dc_status_t suunto_vyper_device_foreach (dc_device_t *abstract, dc_dive_callback_t callback, void *userdata); -static dc_status_t suunto_vyper_device_close (dc_device_t *abstract); static const dc_device_vtable_t suunto_vyper_device_vtable = { sizeof(suunto_vyper_device_t), @@ -64,7 +62,7 @@ static const dc_device_vtable_t suunto_vyper_device_vtable = { suunto_vyper_device_dump, /* dump */ suunto_vyper_device_foreach, /* foreach */ NULL, /* timesync */ - suunto_vyper_device_close /* close */ + NULL /* close */ }; static const suunto_common_layout_t suunto_vyper_layout = { @@ -85,7 +83,7 @@ static const suunto_common_layout_t suunto_spyder_layout = { dc_status_t -suunto_vyper_device_open (dc_device_t **out, dc_context_t *context, const char *name) +suunto_vyper_device_open (dc_device_t **out, dc_context_t *context, dc_iostream_t *iostream) { dc_status_t status = DC_STATUS_SUCCESS; suunto_vyper_device_t *device = NULL; @@ -104,34 +102,27 @@ suunto_vyper_device_open (dc_device_t **out, dc_context_t *context, const char * suunto_common_device_init (&device->base); // Set the default values. - device->iostream = NULL; - - // Open the device. - status = dc_serial_open (&device->iostream, context, name); - if (status != DC_STATUS_SUCCESS) { - ERROR (context, "Failed to open the serial port."); - goto error_free; - } + device->iostream = iostream; // Set the serial communication protocol (2400 8O1). status = dc_iostream_configure (device->iostream, 2400, 8, DC_PARITY_ODD, DC_STOPBITS_ONE, DC_FLOWCONTROL_NONE); if (status != DC_STATUS_SUCCESS) { ERROR (context, "Failed to set the terminal attributes."); - goto error_close; + goto error_free; } // Set the timeout for receiving data (1000 ms). status = dc_iostream_set_timeout (device->iostream, 1000); if (status != DC_STATUS_SUCCESS) { ERROR (context, "Failed to set the timeout."); - goto error_close; + goto error_free; } // Set the DTR line (power supply for the interface). status = dc_iostream_set_dtr (device->iostream, 1); if (status != DC_STATUS_SUCCESS) { ERROR (context, "Failed to set the DTR line."); - goto error_close; + goto error_free; } // Give the interface 100 ms to settle and draw power up. @@ -144,31 +135,12 @@ suunto_vyper_device_open (dc_device_t **out, dc_context_t *context, const char * return DC_STATUS_SUCCESS; -error_close: - dc_iostream_close (device->iostream); error_free: dc_device_deallocate ((dc_device_t *) device); return status; } -static dc_status_t -suunto_vyper_device_close (dc_device_t *abstract) -{ - dc_status_t status = DC_STATUS_SUCCESS; - suunto_vyper_device_t *device = (suunto_vyper_device_t*) abstract; - dc_status_t rc = DC_STATUS_SUCCESS; - - // Close the device. - rc = dc_iostream_close (device->iostream); - if (rc != DC_STATUS_SUCCESS) { - dc_status_set_error(&status, rc); - } - - return status; -} - - static dc_status_t suunto_vyper_send (suunto_vyper_device_t *device, const unsigned char command[], unsigned int csize) { diff --git a/src/suunto_vyper.h b/src/suunto_vyper.h index 95f1a4a..858520f 100644 --- a/src/suunto_vyper.h +++ b/src/suunto_vyper.h @@ -23,6 +23,7 @@ #define SUUNTO_VYPER_H #include +#include #include #include @@ -31,7 +32,7 @@ extern "C" { #endif /* __cplusplus */ dc_status_t -suunto_vyper_device_open (dc_device_t **device, dc_context_t *context, const char *name); +suunto_vyper_device_open (dc_device_t **device, dc_context_t *context, dc_iostream_t *iostream); dc_status_t suunto_vyper_parser_create (dc_parser_t **parser, dc_context_t *context); diff --git a/src/suunto_vyper2.c b/src/suunto_vyper2.c index 596b06e..02f38ed 100644 --- a/src/suunto_vyper2.c +++ b/src/suunto_vyper2.c @@ -25,7 +25,6 @@ #include "suunto_vyper2.h" #include "suunto_common2.h" #include "context-private.h" -#include "serial.h" #include "checksum.h" #include "array.h" #include "timer.h" @@ -76,7 +75,7 @@ static const suunto_common2_layout_t suunto_helo2_layout = { dc_status_t -suunto_vyper2_device_open (dc_device_t **out, dc_context_t *context, const char *name) +suunto_vyper2_device_open (dc_device_t **out, dc_context_t *context, dc_iostream_t *iostream) { dc_status_t status = DC_STATUS_SUCCESS; suunto_vyper2_device_t *device = NULL; @@ -95,7 +94,7 @@ suunto_vyper2_device_open (dc_device_t **out, dc_context_t *context, const char suunto_common2_device_init (&device->base); // Set the default values. - device->iostream = NULL; + device->iostream = iostream; // Create a high resolution timer. status = dc_timer_new (&device->timer); @@ -104,32 +103,25 @@ suunto_vyper2_device_open (dc_device_t **out, dc_context_t *context, const char goto error_free; } - // Open the device. - status = dc_serial_open (&device->iostream, context, name); - if (status != DC_STATUS_SUCCESS) { - ERROR (context, "Failed to open the serial port."); - goto error_timer_free; - } - // Set the serial communication protocol (9600 8N1). status = dc_iostream_configure (device->iostream, 9600, 8, DC_PARITY_NONE, DC_STOPBITS_ONE, DC_FLOWCONTROL_NONE); if (status != DC_STATUS_SUCCESS) { ERROR (context, "Failed to set the terminal attributes."); - goto error_close; + goto error_timer_free; } // Set the timeout for receiving data (3000 ms). status = dc_iostream_set_timeout (device->iostream, 3000); if (status != DC_STATUS_SUCCESS) { ERROR (context, "Failed to set the timeout."); - goto error_close; + goto error_timer_free; } // Set the DTR line (power supply for the interface). status = dc_iostream_set_dtr (device->iostream, 1); if (status != DC_STATUS_SUCCESS) { ERROR (context, "Failed to set the DTR line."); - goto error_close; + goto error_timer_free; } // Give the interface 100 ms to settle and draw power up. @@ -139,14 +131,14 @@ suunto_vyper2_device_open (dc_device_t **out, dc_context_t *context, const char status = dc_iostream_purge (device->iostream, DC_DIRECTION_ALL); if (status != DC_STATUS_SUCCESS) { ERROR (context, "Failed to reset IO state."); - goto error_close; + goto error_timer_free; } // Read the version info. status = suunto_common2_device_version ((dc_device_t *) device, device->base.version, sizeof (device->base.version)); if (status != DC_STATUS_SUCCESS) { ERROR (context, "Failed to read the version info."); - goto error_close; + goto error_timer_free; } // Override the base class values. @@ -160,8 +152,6 @@ suunto_vyper2_device_open (dc_device_t **out, dc_context_t *context, const char return DC_STATUS_SUCCESS; -error_close: - dc_iostream_close (device->iostream); error_timer_free: dc_timer_free (device->timer); error_free: @@ -173,19 +163,11 @@ error_free: static dc_status_t suunto_vyper2_device_close (dc_device_t *abstract) { - dc_status_t status = DC_STATUS_SUCCESS; suunto_vyper2_device_t *device = (suunto_vyper2_device_t*) abstract; - dc_status_t rc = DC_STATUS_SUCCESS; dc_timer_free (device->timer); - // Close the device. - rc = dc_iostream_close (device->iostream); - if (rc != DC_STATUS_SUCCESS) { - dc_status_set_error(&status, rc); - } - - return status; + return DC_STATUS_SUCCESS; } diff --git a/src/suunto_vyper2.h b/src/suunto_vyper2.h index b6486d9..0fc7fc8 100644 --- a/src/suunto_vyper2.h +++ b/src/suunto_vyper2.h @@ -27,11 +27,12 @@ extern "C" { #endif /* __cplusplus */ #include +#include #include #include dc_status_t -suunto_vyper2_device_open (dc_device_t **device, dc_context_t *context, const char *name); +suunto_vyper2_device_open (dc_device_t **device, dc_context_t *context, dc_iostream_t *iostream); #ifdef __cplusplus } diff --git a/src/uwatec_aladin.c b/src/uwatec_aladin.c index 0f1a49a..3ebd094 100644 --- a/src/uwatec_aladin.c +++ b/src/uwatec_aladin.c @@ -25,7 +25,6 @@ #include "uwatec_aladin.h" #include "context-private.h" #include "device-private.h" -#include "serial.h" #include "ringbuffer.h" #include "checksum.h" #include "array.h" @@ -52,7 +51,6 @@ typedef struct uwatec_aladin_device_t { static dc_status_t uwatec_aladin_device_set_fingerprint (dc_device_t *abstract, const unsigned char data[], unsigned int size); static dc_status_t uwatec_aladin_device_dump (dc_device_t *abstract, dc_buffer_t *buffer); static dc_status_t uwatec_aladin_device_foreach (dc_device_t *abstract, dc_dive_callback_t callback, void *userdata); -static dc_status_t uwatec_aladin_device_close (dc_device_t *abstract); static const dc_device_vtable_t uwatec_aladin_device_vtable = { sizeof(uwatec_aladin_device_t), @@ -63,14 +61,14 @@ static const dc_device_vtable_t uwatec_aladin_device_vtable = { uwatec_aladin_device_dump, /* dump */ uwatec_aladin_device_foreach, /* foreach */ NULL, /* timesync */ - uwatec_aladin_device_close /* close */ + NULL /* close */ }; static dc_status_t uwatec_aladin_extract_dives (dc_device_t *device, const unsigned char data[], unsigned int size, dc_dive_callback_t callback, void *userdata); dc_status_t -uwatec_aladin_device_open (dc_device_t **out, dc_context_t *context, const char *name) +uwatec_aladin_device_open (dc_device_t **out, dc_context_t *context, dc_iostream_t *iostream) { dc_status_t status = DC_STATUS_SUCCESS; uwatec_aladin_device_t *device = NULL; @@ -86,75 +84,49 @@ uwatec_aladin_device_open (dc_device_t **out, dc_context_t *context, const char } // Set the default values. - device->iostream = NULL; + device->iostream = iostream; device->timestamp = 0; device->systime = (dc_ticks_t) -1; device->devtime = 0; - // Open the device. - status = dc_serial_open (&device->iostream, context, name); - if (status != DC_STATUS_SUCCESS) { - ERROR (context, "Failed to open the serial port."); - goto error_free; - } - // Set the serial communication protocol (19200 8N1). status = dc_iostream_configure (device->iostream, 19200, 8, DC_PARITY_NONE, DC_STOPBITS_ONE, DC_FLOWCONTROL_NONE); if (status != DC_STATUS_SUCCESS) { ERROR (context, "Failed to set the terminal attributes."); - goto error_close; + goto error_free; } // Set the timeout for receiving data (INFINITE). status = dc_iostream_set_timeout (device->iostream, -1); if (status != DC_STATUS_SUCCESS) { ERROR (context, "Failed to set the timeout."); - goto error_close; + goto error_free; } // Set the DTR line. status = dc_iostream_set_dtr (device->iostream, 1); if (status != DC_STATUS_SUCCESS) { ERROR (context, "Failed to set the DTR line."); - goto error_close; + goto error_free; } // Clear the RTS line. status = dc_iostream_set_rts (device->iostream, 0); if (status != DC_STATUS_SUCCESS) { ERROR (context, "Failed to clear the RTS line."); - goto error_close; + goto error_free; } *out = (dc_device_t*) device; return DC_STATUS_SUCCESS; -error_close: - dc_iostream_close (device->iostream); error_free: dc_device_deallocate ((dc_device_t *) device); return status; } -static dc_status_t -uwatec_aladin_device_close (dc_device_t *abstract) -{ - dc_status_t status = DC_STATUS_SUCCESS; - uwatec_aladin_device_t *device = (uwatec_aladin_device_t*) abstract; - dc_status_t rc = DC_STATUS_SUCCESS; - - // Close the device. - rc = dc_iostream_close (device->iostream); - if (rc != DC_STATUS_SUCCESS) { - dc_status_set_error(&status, rc); - } - - return status; -} - - static dc_status_t uwatec_aladin_device_set_fingerprint (dc_device_t *abstract, const unsigned char data[], unsigned int size) { diff --git a/src/uwatec_aladin.h b/src/uwatec_aladin.h index 41484f6..7579871 100644 --- a/src/uwatec_aladin.h +++ b/src/uwatec_aladin.h @@ -27,10 +27,11 @@ extern "C" { #endif /* __cplusplus */ #include +#include #include dc_status_t -uwatec_aladin_device_open (dc_device_t **device, dc_context_t *context, const char *name); +uwatec_aladin_device_open (dc_device_t **device, dc_context_t *context, dc_iostream_t *iostream); #ifdef __cplusplus } diff --git a/src/uwatec_g2.c b/src/uwatec_g2.c index fc24b71..ea2d324 100644 --- a/src/uwatec_g2.c +++ b/src/uwatec_g2.c @@ -26,7 +26,6 @@ #include "uwatec_g2.h" #include "context-private.h" #include "device-private.h" -#include "usbhid.h" #include "array.h" #include "platform.h" @@ -48,7 +47,6 @@ typedef struct uwatec_g2_device_t { static dc_status_t uwatec_g2_device_set_fingerprint (dc_device_t *device, const unsigned char data[], unsigned int size); static dc_status_t uwatec_g2_device_dump (dc_device_t *abstract, dc_buffer_t *buffer); static dc_status_t uwatec_g2_device_foreach (dc_device_t *abstract, dc_dive_callback_t callback, void *userdata); -static dc_status_t uwatec_g2_device_close (dc_device_t *abstract); static const dc_device_vtable_t uwatec_g2_device_vtable = { sizeof(uwatec_g2_device_t), @@ -59,7 +57,7 @@ static const dc_device_vtable_t uwatec_g2_device_vtable = { uwatec_g2_device_dump, /* dump */ uwatec_g2_device_foreach, /* foreach */ NULL, /* timesync */ - uwatec_g2_device_close /* close */ + NULL /* close */ }; static dc_status_t @@ -180,7 +178,7 @@ uwatec_g2_handshake (uwatec_g2_device_t *device) dc_status_t -uwatec_g2_device_open (dc_device_t **out, dc_context_t *context, unsigned int model) +uwatec_g2_device_open (dc_device_t **out, dc_context_t *context, dc_iostream_t *iostream, unsigned int model) { dc_status_t status = DC_STATUS_SUCCESS; uwatec_g2_device_t *device = NULL; @@ -196,62 +194,28 @@ uwatec_g2_device_open (dc_device_t **out, dc_context_t *context, unsigned int mo } // Set the default values. - device->iostream = NULL; + device->iostream = iostream; device->timestamp = 0; device->systime = (dc_ticks_t) -1; device->devtime = 0; - // Open the irda socket. - unsigned int vid = 0, pid = 0; - if (model == ALADINSQUARE) { - vid = 0xc251; - pid = 0x2006; - } else { - vid = 0x2e6c; - pid = 0x3201; - } - status = dc_usbhid_open (&device->iostream, context, vid, pid); - if (status != DC_STATUS_SUCCESS) { - ERROR (context, "Failed to open USB device"); - goto error_free; - } - // Perform the handshaking. status = uwatec_g2_handshake (device); if (status != DC_STATUS_SUCCESS) { ERROR (context, "Failed to handshake with the device."); - goto error_close; + goto error_free; } *out = (dc_device_t*) device; return DC_STATUS_SUCCESS; -error_close: - dc_iostream_close (device->iostream); error_free: dc_device_deallocate ((dc_device_t *) device); return status; } -static dc_status_t -uwatec_g2_device_close (dc_device_t *abstract) -{ - dc_status_t status = DC_STATUS_SUCCESS; - uwatec_g2_device_t *device = (uwatec_g2_device_t*) abstract; - dc_status_t rc = DC_STATUS_SUCCESS; - - // Close the device. - rc = dc_iostream_close (device->iostream); - if (status != DC_STATUS_SUCCESS) { - dc_status_set_error(&status, rc); - } - - return status; -} - - static dc_status_t uwatec_g2_device_set_fingerprint (dc_device_t *abstract, const unsigned char data[], unsigned int size) { diff --git a/src/uwatec_g2.h b/src/uwatec_g2.h index 801e15d..72a4390 100644 --- a/src/uwatec_g2.h +++ b/src/uwatec_g2.h @@ -23,6 +23,7 @@ #define UWATEC_G2_H #include +#include #include #include @@ -31,7 +32,7 @@ extern "C" { #endif /* __cplusplus */ dc_status_t -uwatec_g2_device_open (dc_device_t **device, dc_context_t *context, unsigned int model); +uwatec_g2_device_open (dc_device_t **device, dc_context_t *context, dc_iostream_t *iostream, unsigned int model); #ifdef __cplusplus } diff --git a/src/uwatec_memomouse.c b/src/uwatec_memomouse.c index ca3a747..c77b598 100644 --- a/src/uwatec_memomouse.c +++ b/src/uwatec_memomouse.c @@ -26,7 +26,6 @@ #include "uwatec_memomouse.h" #include "context-private.h" #include "device-private.h" -#include "serial.h" #include "checksum.h" #include "array.h" @@ -48,7 +47,6 @@ typedef struct uwatec_memomouse_device_t { static dc_status_t uwatec_memomouse_device_set_fingerprint (dc_device_t *device, const unsigned char data[], unsigned int size); static dc_status_t uwatec_memomouse_device_dump (dc_device_t *abstract, dc_buffer_t *buffer); static dc_status_t uwatec_memomouse_device_foreach (dc_device_t *abstract, dc_dive_callback_t callback, void *userdata); -static dc_status_t uwatec_memomouse_device_close (dc_device_t *abstract); static const dc_device_vtable_t uwatec_memomouse_device_vtable = { sizeof(uwatec_memomouse_device_t), @@ -59,14 +57,14 @@ static const dc_device_vtable_t uwatec_memomouse_device_vtable = { uwatec_memomouse_device_dump, /* dump */ uwatec_memomouse_device_foreach, /* foreach */ NULL, /* timesync */ - uwatec_memomouse_device_close /* close */ + NULL /* close */ }; static dc_status_t uwatec_memomouse_extract_dives (dc_device_t *device, const unsigned char data[], unsigned int size, dc_dive_callback_t callback, void *userdata); dc_status_t -uwatec_memomouse_device_open (dc_device_t **out, dc_context_t *context, const char *name) +uwatec_memomouse_device_open (dc_device_t **out, dc_context_t *context, dc_iostream_t *iostream) { dc_status_t status = DC_STATUS_SUCCESS; uwatec_memomouse_device_t *device = NULL; @@ -82,44 +80,37 @@ uwatec_memomouse_device_open (dc_device_t **out, dc_context_t *context, const ch } // Set the default values. - device->iostream = NULL; + device->iostream = iostream; device->timestamp = 0; device->systime = (dc_ticks_t) -1; device->devtime = 0; - // Open the device. - status = dc_serial_open (&device->iostream, context, name); - if (status != DC_STATUS_SUCCESS) { - ERROR (context, "Failed to open the serial port."); - goto error_free; - } - // Set the serial communication protocol (9600 8N1). status = dc_iostream_configure (device->iostream, 9600, 8, DC_PARITY_NONE, DC_STOPBITS_ONE, DC_FLOWCONTROL_NONE); if (status != DC_STATUS_SUCCESS) { ERROR (context, "Failed to set the terminal attributes."); - goto error_close; + goto error_free; } // Set the timeout for receiving data (1000 ms). status = dc_iostream_set_timeout (device->iostream, 1000); if (status != DC_STATUS_SUCCESS) { ERROR (context, "Failed to set the timeout."); - goto error_close; + goto error_free; } // Clear the DTR line. status = dc_iostream_set_dtr (device->iostream, 0); if (status != DC_STATUS_SUCCESS) { ERROR (context, "Failed to clear the DTR line."); - goto error_close; + goto error_free; } // Clear the RTS line. status = dc_iostream_set_rts (device->iostream, 0); if (status != DC_STATUS_SUCCESS) { ERROR (context, "Failed to clear the RTS line."); - goto error_close; + goto error_free; } // Make sure everything is in a sane state. @@ -129,31 +120,12 @@ uwatec_memomouse_device_open (dc_device_t **out, dc_context_t *context, const ch return DC_STATUS_SUCCESS; -error_close: - dc_iostream_close (device->iostream); error_free: dc_device_deallocate ((dc_device_t *) device); return status; } -static dc_status_t -uwatec_memomouse_device_close (dc_device_t *abstract) -{ - dc_status_t status = DC_STATUS_SUCCESS; - uwatec_memomouse_device_t *device = (uwatec_memomouse_device_t*) abstract; - dc_status_t rc = DC_STATUS_SUCCESS; - - // Close the device. - rc = dc_iostream_close (device->iostream); - if (rc != DC_STATUS_SUCCESS) { - dc_status_set_error(&status, rc); - } - - return status; -} - - static dc_status_t uwatec_memomouse_device_set_fingerprint (dc_device_t *abstract, const unsigned char data[], unsigned int size) { diff --git a/src/uwatec_memomouse.h b/src/uwatec_memomouse.h index 8d37dc6..49ecf9e 100644 --- a/src/uwatec_memomouse.h +++ b/src/uwatec_memomouse.h @@ -23,6 +23,7 @@ #define UWATEC_MEMOMOUSE_H #include +#include #include #include @@ -31,7 +32,7 @@ extern "C" { #endif /* __cplusplus */ dc_status_t -uwatec_memomouse_device_open (dc_device_t **device, dc_context_t *context, const char *name); +uwatec_memomouse_device_open (dc_device_t **device, dc_context_t *context, dc_iostream_t *iostream); dc_status_t uwatec_memomouse_parser_create (dc_parser_t **parser, dc_context_t *context, unsigned int devtime, dc_ticks_t systime); diff --git a/src/uwatec_meridian.c b/src/uwatec_meridian.c index 17f1b62..378facb 100644 --- a/src/uwatec_meridian.c +++ b/src/uwatec_meridian.c @@ -27,7 +27,6 @@ #include "context-private.h" #include "device-private.h" #include "checksum.h" -#include "serial.h" #include "array.h" #define ISINSTANCE(device) dc_device_isinstance((device), &uwatec_meridian_device_vtable) @@ -46,7 +45,6 @@ typedef struct uwatec_meridian_device_t { static dc_status_t uwatec_meridian_device_set_fingerprint (dc_device_t *device, const unsigned char data[], unsigned int size); static dc_status_t uwatec_meridian_device_dump (dc_device_t *abstract, dc_buffer_t *buffer); static dc_status_t uwatec_meridian_device_foreach (dc_device_t *abstract, dc_dive_callback_t callback, void *userdata); -static dc_status_t uwatec_meridian_device_close (dc_device_t *abstract); static const dc_device_vtable_t uwatec_meridian_device_vtable = { sizeof(uwatec_meridian_device_t), @@ -57,7 +55,7 @@ static const dc_device_vtable_t uwatec_meridian_device_vtable = { uwatec_meridian_device_dump, /* dump */ uwatec_meridian_device_foreach, /* foreach */ NULL, /* timesync */ - uwatec_meridian_device_close /* close */ + NULL /* close */ }; static dc_status_t @@ -183,7 +181,7 @@ uwatec_meridian_handshake (uwatec_meridian_device_t *device) dc_status_t -uwatec_meridian_device_open (dc_device_t **out, dc_context_t *context, const char *name) +uwatec_meridian_device_open (dc_device_t **out, dc_context_t *context, dc_iostream_t *iostream) { dc_status_t status = DC_STATUS_SUCCESS; uwatec_meridian_device_t *device = NULL; @@ -199,30 +197,23 @@ uwatec_meridian_device_open (dc_device_t **out, dc_context_t *context, const cha } // Set the default values. - device->iostream = NULL; + device->iostream = iostream; device->timestamp = 0; device->systime = (dc_ticks_t) -1; device->devtime = 0; - // Open the device. - status = dc_serial_open (&device->iostream, context, name); - if (status != DC_STATUS_SUCCESS) { - ERROR (context, "Failed to open the serial port."); - goto error_free; - } - // Set the serial communication protocol (57600 8N1). status = dc_iostream_configure (device->iostream, 57600, 8, DC_PARITY_NONE, DC_STOPBITS_ONE, DC_FLOWCONTROL_NONE); if (status != DC_STATUS_SUCCESS) { ERROR (context, "Failed to set the terminal attributes."); - goto error_close; + goto error_free; } // Set the timeout for receiving data (3000ms). status = dc_iostream_set_timeout (device->iostream, 3000); if (status != DC_STATUS_SUCCESS) { ERROR (context, "Failed to set the timeout."); - goto error_close; + goto error_free; } // Make sure everything is in a sane state. @@ -232,38 +223,19 @@ uwatec_meridian_device_open (dc_device_t **out, dc_context_t *context, const cha status = uwatec_meridian_handshake (device); if (status != DC_STATUS_SUCCESS) { ERROR (context, "Failed to handshake with the device."); - goto error_close; + goto error_free; } *out = (dc_device_t*) device; return DC_STATUS_SUCCESS; -error_close: - dc_iostream_close (device->iostream); error_free: dc_device_deallocate ((dc_device_t *) device); return status; } -static dc_status_t -uwatec_meridian_device_close (dc_device_t *abstract) -{ - dc_status_t status = DC_STATUS_SUCCESS; - uwatec_meridian_device_t *device = (uwatec_meridian_device_t*) abstract; - dc_status_t rc = DC_STATUS_SUCCESS; - - // Close the device. - rc = dc_iostream_close (device->iostream); - if (rc != DC_STATUS_SUCCESS) { - dc_status_set_error(&status, rc); - } - - return status; -} - - static dc_status_t uwatec_meridian_device_set_fingerprint (dc_device_t *abstract, const unsigned char data[], unsigned int size) { diff --git a/src/uwatec_meridian.h b/src/uwatec_meridian.h index 9c6918c..4ac80d3 100644 --- a/src/uwatec_meridian.h +++ b/src/uwatec_meridian.h @@ -23,6 +23,7 @@ #define UWATEC_MERIDIAN_H #include +#include #include #include @@ -31,7 +32,7 @@ extern "C" { #endif /* __cplusplus */ dc_status_t -uwatec_meridian_device_open (dc_device_t **device, dc_context_t *context, const char *name); +uwatec_meridian_device_open (dc_device_t **device, dc_context_t *context, dc_iostream_t *iostream); #ifdef __cplusplus } diff --git a/src/uwatec_smart.c b/src/uwatec_smart.c index a3be17d..9bf0f99 100644 --- a/src/uwatec_smart.c +++ b/src/uwatec_smart.c @@ -25,9 +25,7 @@ #include "uwatec_smart.h" #include "context-private.h" #include "device-private.h" -#include "irda.h" #include "array.h" -#include "platform.h" #define ISINSTANCE(device) dc_device_isinstance((device), &uwatec_smart_device_vtable) @@ -44,7 +42,6 @@ typedef struct uwatec_smart_device_t { static dc_status_t uwatec_smart_device_set_fingerprint (dc_device_t *device, const unsigned char data[], unsigned int size); static dc_status_t uwatec_smart_device_dump (dc_device_t *abstract, dc_buffer_t *buffer); static dc_status_t uwatec_smart_device_foreach (dc_device_t *abstract, dc_dive_callback_t callback, void *userdata); -static dc_status_t uwatec_smart_device_close (dc_device_t *abstract); static const dc_device_vtable_t uwatec_smart_device_vtable = { sizeof(uwatec_smart_device_t), @@ -55,38 +52,12 @@ static const dc_device_vtable_t uwatec_smart_device_vtable = { uwatec_smart_device_dump, /* dump */ uwatec_smart_device_foreach, /* foreach */ NULL, /* timesync */ - uwatec_smart_device_close /* close */ + NULL /* close */ }; static dc_status_t uwatec_smart_extract_dives (dc_device_t *device, const unsigned char data[], unsigned int size, dc_dive_callback_t callback, void *userdata); -static int -uwatec_smart_filter (const char *name) -{ - static const char *names[] = { - "Aladin Smart Com", - "Aladin Smart Pro", - "Aladin Smart Tec", - "Aladin Smart Z", - "Uwatec Aladin", - "UWATEC Galileo", - "UWATEC Galileo Sol", - }; - - if (name == NULL) - return 0; - - for (size_t i = 0; i < C_ARRAY_SIZE(names); ++i) { - if (strcasecmp(name, names[i]) == 0) { - return 1; - } - } - - return 0; -} - - static dc_status_t uwatec_smart_transfer (uwatec_smart_device_t *device, const unsigned char command[], unsigned int csize, unsigned char answer[], unsigned int asize) { @@ -147,12 +118,10 @@ uwatec_smart_handshake (uwatec_smart_device_t *device) dc_status_t -uwatec_smart_device_open (dc_device_t **out, dc_context_t *context) +uwatec_smart_device_open (dc_device_t **out, dc_context_t *context, dc_iostream_t *iostream) { dc_status_t status = DC_STATUS_SUCCESS; uwatec_smart_device_t *device = NULL; - dc_iterator_t *iterator = NULL; - dc_irda_device_t *dev = NULL; if (out == NULL) return DC_STATUS_INVALIDARGS; @@ -165,80 +134,28 @@ uwatec_smart_device_open (dc_device_t **out, dc_context_t *context) } // Set the default values. - device->iostream = NULL; + device->iostream = iostream; device->timestamp = 0; device->systime = (dc_ticks_t) -1; device->devtime = 0; - // Create the irda device iterator. - status = dc_irda_iterator_new (&iterator, context, NULL); - if (status != DC_STATUS_SUCCESS) { - ERROR (context, "Failed to create the irda iterator."); - goto error_free; - } - - // Enumerate the irda devices. - while (1) { - dc_irda_device_t *current = NULL; - status = dc_iterator_next (iterator, ¤t); - if (status != DC_STATUS_SUCCESS) { - if (status == DC_STATUS_DONE) { - ERROR (context, "No dive computer found."); - status = DC_STATUS_NODEVICE; - } else { - ERROR (context, "Failed to enumerate the irda devices."); - } - goto error_iterator_free; - } - - if (uwatec_smart_filter (dc_irda_device_get_name (current))) { - dev = current; - break; - } - - dc_irda_device_free (current); - } - - // Open the irda socket. - status = dc_irda_open (&device->iostream, context, dc_irda_device_get_address (dev), 1); - if (status != DC_STATUS_SUCCESS) { - ERROR (context, "Failed to open the irda socket."); - goto error_device_free; - } - // Perform the handshaking. status = uwatec_smart_handshake (device); if (status != DC_STATUS_SUCCESS) { ERROR (context, "Failed to handshake with the device."); - goto error_close; + goto error_free; } *out = (dc_device_t*) device; return DC_STATUS_SUCCESS; -error_close: - dc_iostream_close (device->iostream); -error_device_free: - dc_irda_device_free (dev); -error_iterator_free: - dc_iterator_free (iterator); error_free: dc_device_deallocate ((dc_device_t *) device); return status; } -static dc_status_t -uwatec_smart_device_close (dc_device_t *abstract) -{ - uwatec_smart_device_t *device = (uwatec_smart_device_t*) abstract; - - // Close the device and pass up the return code. - return dc_iostream_close (device->iostream); -} - - static dc_status_t uwatec_smart_device_set_fingerprint (dc_device_t *abstract, const unsigned char data[], unsigned int size) { diff --git a/src/uwatec_smart.h b/src/uwatec_smart.h index 5304c73..2f7f2b9 100644 --- a/src/uwatec_smart.h +++ b/src/uwatec_smart.h @@ -23,6 +23,7 @@ #define UWATEC_SMART_H #include +#include #include #include @@ -31,7 +32,7 @@ extern "C" { #endif /* __cplusplus */ dc_status_t -uwatec_smart_device_open (dc_device_t **device, dc_context_t *context); +uwatec_smart_device_open (dc_device_t **device, dc_context_t *context, dc_iostream_t *iostream); dc_status_t uwatec_smart_parser_create (dc_parser_t **parser, dc_context_t *context, unsigned int model, unsigned int devtime, dc_ticks_t systime); diff --git a/src/zeagle_n2ition3.c b/src/zeagle_n2ition3.c index 58f81ba..5d0c3bd 100644 --- a/src/zeagle_n2ition3.c +++ b/src/zeagle_n2ition3.c @@ -26,7 +26,6 @@ #include "zeagle_n2ition3.h" #include "context-private.h" #include "device-private.h" -#include "serial.h" #include "checksum.h" #include "array.h" #include "ringbuffer.h" @@ -54,7 +53,6 @@ static dc_status_t zeagle_n2ition3_device_set_fingerprint (dc_device_t *abstract static dc_status_t zeagle_n2ition3_device_read (dc_device_t *abstract, unsigned int address, unsigned char data[], unsigned int size); static dc_status_t zeagle_n2ition3_device_dump (dc_device_t *abstract, dc_buffer_t *buffer); static dc_status_t zeagle_n2ition3_device_foreach (dc_device_t *abstract, dc_dive_callback_t callback, void *userdata); -static dc_status_t zeagle_n2ition3_device_close (dc_device_t *abstract); static const dc_device_vtable_t zeagle_n2ition3_device_vtable = { sizeof(zeagle_n2ition3_device_t), @@ -65,7 +63,7 @@ static const dc_device_vtable_t zeagle_n2ition3_device_vtable = { zeagle_n2ition3_device_dump, /* dump */ zeagle_n2ition3_device_foreach, /* foreach */ NULL, /* timesync */ - zeagle_n2ition3_device_close /* close */ + NULL /* close */ }; @@ -133,7 +131,7 @@ zeagle_n2ition3_init (zeagle_n2ition3_device_t *device) } dc_status_t -zeagle_n2ition3_device_open (dc_device_t **out, dc_context_t *context, const char *name) +zeagle_n2ition3_device_open (dc_device_t **out, dc_context_t *context, dc_iostream_t *iostream) { dc_status_t status = DC_STATUS_SUCCESS; zeagle_n2ition3_device_t *device = NULL; @@ -149,28 +147,21 @@ zeagle_n2ition3_device_open (dc_device_t **out, dc_context_t *context, const cha } // Set the default values. - device->iostream = NULL; + device->iostream = iostream; memset (device->fingerprint, 0, sizeof (device->fingerprint)); - // Open the device. - status = dc_serial_open (&device->iostream, context, name); - if (status != DC_STATUS_SUCCESS) { - ERROR (context, "Failed to open the serial port."); - goto error_free; - } - // Set the serial communication protocol (4800 8N1). status = dc_iostream_configure (device->iostream, 4800, 8, DC_PARITY_NONE, DC_STOPBITS_ONE, DC_FLOWCONTROL_NONE); if (status != DC_STATUS_SUCCESS) { ERROR (context, "Failed to set the terminal attributes."); - goto error_close; + goto error_free; } // Set the timeout for receiving data (1000 ms). status = dc_iostream_set_timeout (device->iostream, 1000); if (status != DC_STATUS_SUCCESS) { ERROR (context, "Failed to set the timeout."); - goto error_close; + goto error_free; } // Make sure everything is in a sane state. @@ -183,31 +174,12 @@ zeagle_n2ition3_device_open (dc_device_t **out, dc_context_t *context, const cha return DC_STATUS_SUCCESS; -error_close: - dc_iostream_close (device->iostream); error_free: dc_device_deallocate ((dc_device_t *) device); return status; } -static dc_status_t -zeagle_n2ition3_device_close (dc_device_t *abstract) -{ - dc_status_t status = DC_STATUS_SUCCESS; - zeagle_n2ition3_device_t *device = (zeagle_n2ition3_device_t*) abstract; - dc_status_t rc = DC_STATUS_SUCCESS; - - // Close the device. - rc = dc_iostream_close (device->iostream); - if (rc != DC_STATUS_SUCCESS) { - dc_status_set_error(&status, rc); - } - - return status; -} - - static dc_status_t zeagle_n2ition3_device_set_fingerprint (dc_device_t *abstract, const unsigned char data[], unsigned int size) { diff --git a/src/zeagle_n2ition3.h b/src/zeagle_n2ition3.h index d10daa7..2a0d683 100644 --- a/src/zeagle_n2ition3.h +++ b/src/zeagle_n2ition3.h @@ -23,6 +23,7 @@ #define ZEAGLE_N2ITION3_H #include +#include #include #ifdef __cplusplus @@ -30,7 +31,7 @@ extern "C" { #endif /* __cplusplus */ dc_status_t -zeagle_n2ition3_device_open (dc_device_t **device, dc_context_t *context, const char *name); +zeagle_n2ition3_device_open (dc_device_t **device, dc_context_t *context, dc_iostream_t *iostream); #ifdef __cplusplus }