diff --git a/include/libdivecomputer/device.h b/include/libdivecomputer/device.h index 3e7ebf1..01d17dc 100644 --- a/include/libdivecomputer/device.h +++ b/include/libdivecomputer/device.h @@ -23,6 +23,7 @@ #define DC_DEVICE_H #include "common.h" +#include "descriptor.h" #include "buffer.h" #include "datetime.h" @@ -61,6 +62,9 @@ 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_descriptor_t *descriptor, const char *name); + dc_family_t dc_device_get_type (dc_device_t *device); diff --git a/src/device.c b/src/device.c index d0b169d..36f1595 100644 --- a/src/device.c +++ b/src/device.c @@ -22,6 +22,16 @@ #include #include +#include +#include +#include +#include +#include +#include +#include +#include +#include + #include "device-private.h" @@ -38,6 +48,93 @@ device_init (dc_device_t *device, const device_backend_t *backend) device->cancel_userdata = NULL; } +dc_status_t +dc_device_open (dc_device_t **out, dc_descriptor_t *descriptor, const char *name) +{ + dc_status_t rc = DC_STATUS_SUCCESS; + dc_device_t *device = NULL; + + if (out == NULL || descriptor == NULL) + return DC_STATUS_INVALIDARGS; + + switch (dc_descriptor_get_type (descriptor)) { + case DC_FAMILY_SUUNTO_SOLUTION: + rc = suunto_solution_device_open (&device, name); + break; + case DC_FAMILY_SUUNTO_EON: + rc = suunto_eon_device_open (&device, name); + break; + case DC_FAMILY_SUUNTO_VYPER: + rc = suunto_vyper_device_open (&device, name); + break; + case DC_FAMILY_SUUNTO_VYPER2: + rc = suunto_vyper2_device_open (&device, name); + break; + case DC_FAMILY_SUUNTO_D9: + rc = suunto_d9_device_open (&device, name); + break; + case DC_FAMILY_UWATEC_ALADIN: + rc = uwatec_aladin_device_open (&device, name); + break; + case DC_FAMILY_UWATEC_MEMOMOUSE: + rc = uwatec_memomouse_device_open (&device, name); + break; + case DC_FAMILY_UWATEC_SMART: + rc = uwatec_smart_device_open (&device); + break; + case DC_FAMILY_REEFNET_SENSUS: + rc = reefnet_sensus_device_open (&device, name); + break; + case DC_FAMILY_REEFNET_SENSUSPRO: + rc = reefnet_sensuspro_device_open (&device, name); + break; + case DC_FAMILY_REEFNET_SENSUSULTRA: + rc = reefnet_sensusultra_device_open (&device, name); + break; + case DC_FAMILY_OCEANIC_VTPRO: + rc = oceanic_vtpro_device_open (&device, name); + break; + case DC_FAMILY_OCEANIC_VEO250: + rc = oceanic_veo250_device_open (&device, name); + break; + case DC_FAMILY_OCEANIC_ATOM2: + rc = oceanic_atom2_device_open (&device, name); + break; + case DC_FAMILY_MARES_NEMO: + rc = mares_nemo_device_open (&device, name); + break; + case DC_FAMILY_MARES_PUCK: + rc = mares_puck_device_open (&device, name); + break; + case DC_FAMILY_MARES_DARWIN: + rc = mares_darwin_device_open (&device, name, dc_descriptor_get_model (descriptor)); + break; + case DC_FAMILY_MARES_ICONHD: + rc = mares_iconhd_device_open (&device, name); + break; + case DC_FAMILY_HW_OSTC: + rc = hw_ostc_device_open (&device, name); + break; + case DC_FAMILY_HW_FROG: + rc = hw_frog_device_open (&device, name); + break; + case DC_FAMILY_CRESSI_EDY: + rc = cressi_edy_device_open (&device, name); + break; + case DC_FAMILY_ZEAGLE_N2ITION3: + rc = zeagle_n2ition3_device_open (&device, name); + break; + case DC_FAMILY_ATOMICS_COBALT: + rc = atomics_cobalt_device_open (&device); + break; + default: + return DC_STATUS_INVALIDARGS; + } + + *out = device; + + return rc; +} dc_family_t dc_device_get_type (dc_device_t *device) diff --git a/src/libdivecomputer.symbols b/src/libdivecomputer.symbols index f96e585..75fc18c 100644 --- a/src/libdivecomputer.symbols +++ b/src/libdivecomputer.symbols @@ -57,6 +57,7 @@ cressi_edy_parser_create atomics_cobalt_parser_create atomics_cobalt_parser_set_calibration +dc_device_open dc_device_close dc_device_dump dc_device_foreach