From 69228386954a97a4f71d52b56355462d1d5dca53 Mon Sep 17 00:00:00 2001 From: Jef Driesen Date: Sun, 27 May 2012 23:32:07 +0200 Subject: [PATCH] Add a dc_parser_new convenience function. The devinfo and clock event data is now cached internally at the device layer. This allows the new dc_parser_new() convenience function to retrieve the event data directly from the device handle, and applications don't have to deal with the events anymore to create a parser. --- include/libdivecomputer/parser.h | 4 ++ src/device-private.h | 3 + src/device.c | 21 ++++++- src/libdivecomputer.symbols | 1 + src/parser.c | 94 ++++++++++++++++++++++++++++++++ 5 files changed, 122 insertions(+), 1 deletion(-) diff --git a/include/libdivecomputer/parser.h b/include/libdivecomputer/parser.h index 01f5ed1..18b4a96 100644 --- a/include/libdivecomputer/parser.h +++ b/include/libdivecomputer/parser.h @@ -23,6 +23,7 @@ #define DC_PARSER_H #include "common.h" +#include "device.h" #include "datetime.h" #ifdef __cplusplus @@ -126,6 +127,9 @@ typedef struct dc_parser_t dc_parser_t; typedef void (*dc_sample_callback_t) (dc_sample_type_t type, dc_sample_value_t value, void *userdata); +dc_status_t +dc_parser_new (dc_parser_t **parser, dc_device_t *device); + dc_family_t dc_parser_get_type (dc_parser_t *parser); diff --git a/src/device-private.h b/src/device-private.h index 8b3afea..75a9851 100644 --- a/src/device-private.h +++ b/src/device-private.h @@ -46,6 +46,9 @@ struct dc_device_t { // Cancellation support. dc_cancel_callback_t cancel_callback; void *cancel_userdata; + // Cached events for the parsers. + dc_event_devinfo_t devinfo; + dc_event_clock_t clock; }; struct device_backend_t { diff --git a/src/device.c b/src/device.c index 36f1595..5b0f6b6 100644 --- a/src/device.c +++ b/src/device.c @@ -21,6 +21,7 @@ #include #include +#include #include #include @@ -46,6 +47,9 @@ device_init (dc_device_t *device, const device_backend_t *backend) device->cancel_callback = NULL; device->cancel_userdata = NULL; + + memset (&device->devinfo, 0, sizeof (device->devinfo)); + memset (&device->clock, 0, sizeof (device->clock)); } dc_status_t @@ -326,8 +330,23 @@ device_event_emit (dc_device_t *device, dc_event_type_t event, const void *data) break; } + if (device == NULL) + return; + + // Cache the event data. + switch (event) { + case DC_EVENT_DEVINFO: + device->devinfo = *(dc_event_devinfo_t *) data; + break; + case DC_EVENT_CLOCK: + device->clock = *(dc_event_clock_t *) data; + break; + default: + break; + } + // Check if there is a callback function registered. - if (device == NULL || device->event_callback == NULL) + if (device->event_callback == NULL) return; // Check the event mask. diff --git a/src/libdivecomputer.symbols b/src/libdivecomputer.symbols index 75fc18c..0d5a25e 100644 --- a/src/libdivecomputer.symbols +++ b/src/libdivecomputer.symbols @@ -27,6 +27,7 @@ dc_descriptor_get_product dc_descriptor_get_type dc_descriptor_get_model +dc_parser_new dc_parser_get_type dc_parser_set_data dc_parser_get_datetime diff --git a/src/parser.c b/src/parser.c index 89007a7..27fe4d9 100644 --- a/src/parser.c +++ b/src/parser.c @@ -21,7 +21,101 @@ #include +#include +#include +#include +#include +#include +#include +#include +#include +#include + #include "parser-private.h" +#include "device-private.h" + +dc_status_t +dc_parser_new (dc_parser_t **out, dc_device_t *device) +{ + dc_status_t rc = DC_STATUS_SUCCESS; + dc_parser_t *parser = NULL; + + if (out == NULL || device == NULL) + return DC_STATUS_INVALIDARGS; + + switch (dc_device_get_type (device)) { + case DC_FAMILY_SUUNTO_SOLUTION: + rc = suunto_solution_parser_create (&parser); + break; + case DC_FAMILY_SUUNTO_EON: + rc = suunto_eon_parser_create (&parser, 0); + break; + case DC_FAMILY_SUUNTO_VYPER: + if (device->devinfo.model == 0x01) + rc = suunto_eon_parser_create (&parser, 1); + else + rc = suunto_vyper_parser_create (&parser); + break; + case DC_FAMILY_SUUNTO_VYPER2: + case DC_FAMILY_SUUNTO_D9: + rc = suunto_d9_parser_create (&parser, device->devinfo.model); + break; + case DC_FAMILY_UWATEC_ALADIN: + case DC_FAMILY_UWATEC_MEMOMOUSE: + rc = uwatec_memomouse_parser_create (&parser, device->clock.devtime, device->clock.systime); + break; + case DC_FAMILY_UWATEC_SMART: + rc = uwatec_smart_parser_create (&parser, device->devinfo.model, device->clock.devtime, device->clock.systime); + break; + case DC_FAMILY_REEFNET_SENSUS: + rc = reefnet_sensus_parser_create (&parser, device->clock.devtime, device->clock.systime); + break; + case DC_FAMILY_REEFNET_SENSUSPRO: + rc = reefnet_sensuspro_parser_create (&parser, device->clock.devtime, device->clock.systime); + break; + case DC_FAMILY_REEFNET_SENSUSULTRA: + rc = reefnet_sensusultra_parser_create (&parser, device->clock.devtime, device->clock.systime); + break; + case DC_FAMILY_OCEANIC_VTPRO: + rc = oceanic_vtpro_parser_create (&parser); + break; + case DC_FAMILY_OCEANIC_VEO250: + rc = oceanic_veo250_parser_create (&parser, device->devinfo.model); + break; + case DC_FAMILY_OCEANIC_ATOM2: + rc = oceanic_atom2_parser_create (&parser, device->devinfo.model); + break; + case DC_FAMILY_MARES_NEMO: + case DC_FAMILY_MARES_PUCK: + rc = mares_nemo_parser_create (&parser, device->devinfo.model); + break; + case DC_FAMILY_MARES_DARWIN: + rc = mares_darwin_parser_create (&parser, device->devinfo.model); + break; + case DC_FAMILY_MARES_ICONHD: + rc = mares_iconhd_parser_create (&parser, device->devinfo.model); + break; + case DC_FAMILY_HW_OSTC: + rc = hw_ostc_parser_create (&parser, 0); + break; + case DC_FAMILY_HW_FROG: + rc = hw_ostc_parser_create (&parser, 1); + break; + case DC_FAMILY_CRESSI_EDY: + case DC_FAMILY_ZEAGLE_N2ITION3: + rc = cressi_edy_parser_create (&parser, device->devinfo.model); + break; + case DC_FAMILY_ATOMICS_COBALT: + rc = atomics_cobalt_parser_create (&parser); + break; + default: + return DC_STATUS_INVALIDARGS; + } + + *out = parser; + + return rc; +} void