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:
Jef Driesen 2012-05-27 23:32:07 +02:00
parent df9897fb3c
commit 6922838695
5 changed files with 122 additions and 1 deletions

View File

@ -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);

View File

@ -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 {

View File

@ -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.

View File

@ -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

View File

@ -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