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.
This commit is contained in:
parent
df9897fb3c
commit
6922838695
@ -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);
|
||||
|
||||
|
||||
@ -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 {
|
||||
|
||||
21
src/device.c
21
src/device.c
@ -21,6 +21,7 @@
|
||||
|
||||
#include <assert.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include <libdivecomputer/suunto.h>
|
||||
#include <libdivecomputer/reefnet.h>
|
||||
@ -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.
|
||||
|
||||
@ -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
|
||||
|
||||
94
src/parser.c
94
src/parser.c
@ -21,7 +21,101 @@
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
#include <libdivecomputer/suunto.h>
|
||||
#include <libdivecomputer/reefnet.h>
|
||||
#include <libdivecomputer/uwatec.h>
|
||||
#include <libdivecomputer/oceanic.h>
|
||||
#include <libdivecomputer/mares.h>
|
||||
#include <libdivecomputer/hw.h>
|
||||
#include <libdivecomputer/cressi.h>
|
||||
#include <libdivecomputer/zeagle.h>
|
||||
#include <libdivecomputer/atomics.h>
|
||||
|
||||
#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
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user