From 9bae07551fb7858f450d7501c19adff42f62b244 Mon Sep 17 00:00:00 2001 From: Jef Driesen Date: Tue, 19 Apr 2016 22:35:31 +0200 Subject: [PATCH] Allow custom logbook and profile functions. By adding the logbook and profile functions to the vtable, a dive computer backend can now easily replace the default implementation with a custom one, without having to duplicate the common code. --- src/oceanic_atom2.c | 26 +++++++++++++++----------- src/oceanic_common.c | 10 ++++++---- src/oceanic_common.h | 12 ++++++++++++ src/oceanic_veo250.c | 26 +++++++++++++++----------- src/oceanic_vtpro.c | 26 +++++++++++++++----------- 5 files changed, 63 insertions(+), 37 deletions(-) diff --git a/src/oceanic_atom2.c b/src/oceanic_atom2.c index 3623b20..323b0ec 100644 --- a/src/oceanic_atom2.c +++ b/src/oceanic_atom2.c @@ -32,7 +32,7 @@ #include "ringbuffer.h" #include "checksum.h" -#define ISINSTANCE(device) dc_device_isinstance((device), &oceanic_atom2_device_vtable) +#define ISINSTANCE(device) dc_device_isinstance((device), &oceanic_atom2_device_vtable.base) #define VTX 0x4557 @@ -65,15 +65,19 @@ static dc_status_t oceanic_atom2_device_read (dc_device_t *abstract, unsigned in static dc_status_t oceanic_atom2_device_write (dc_device_t *abstract, unsigned int address, const unsigned char data[], unsigned int size); static dc_status_t oceanic_atom2_device_close (dc_device_t *abstract); -static const dc_device_vtable_t oceanic_atom2_device_vtable = { - sizeof(oceanic_atom2_device_t), - DC_FAMILY_OCEANIC_ATOM2, - oceanic_common_device_set_fingerprint, /* set_fingerprint */ - oceanic_atom2_device_read, /* read */ - oceanic_atom2_device_write, /* write */ - oceanic_common_device_dump, /* dump */ - oceanic_common_device_foreach, /* foreach */ - oceanic_atom2_device_close /* close */ +static const oceanic_common_device_vtable_t oceanic_atom2_device_vtable = { + { + sizeof(oceanic_atom2_device_t), + DC_FAMILY_OCEANIC_ATOM2, + oceanic_common_device_set_fingerprint, /* set_fingerprint */ + oceanic_atom2_device_read, /* read */ + oceanic_atom2_device_write, /* write */ + oceanic_common_device_dump, /* dump */ + oceanic_common_device_foreach, /* foreach */ + oceanic_atom2_device_close /* close */ + }, + oceanic_common_device_logbook, + oceanic_common_device_profile, }; static const oceanic_common_version_t aeris_f10_version[] = { @@ -544,7 +548,7 @@ oceanic_atom2_device_open2 (dc_device_t **out, dc_context_t *context, const char return DC_STATUS_INVALIDARGS; // Allocate memory. - device = (oceanic_atom2_device_t *) dc_device_allocate (context, &oceanic_atom2_device_vtable); + device = (oceanic_atom2_device_t *) dc_device_allocate (context, &oceanic_atom2_device_vtable.base); if (device == NULL) { ERROR (context, "Failed to allocate memory."); return DC_STATUS_NOMEMORY; diff --git a/src/oceanic_common.c b/src/oceanic_common.c index b67fca6..64e0867 100644 --- a/src/oceanic_common.c +++ b/src/oceanic_common.c @@ -29,6 +29,8 @@ #include "ringbuffer.h" #include "array.h" +#define VTABLE(abstract) ((oceanic_common_device_vtable_t *) abstract->vtable) + #define RB_LOGBOOK_DISTANCE(a,b,l) ringbuffer_distance (a, b, 0, l->rb_logbook_begin, l->rb_logbook_end) #define RB_LOGBOOK_INCR(a,b,l) ringbuffer_increment (a, b, l->rb_logbook_begin, l->rb_logbook_end) @@ -187,7 +189,7 @@ oceanic_common_device_dump (dc_device_t *abstract, dc_buffer_t *buffer) } -static dc_status_t +dc_status_t oceanic_common_device_logbook (dc_device_t *abstract, dc_event_progress_t *progress, dc_buffer_t *logbook) { oceanic_common_device_t *device = (oceanic_common_device_t *) abstract; @@ -408,7 +410,7 @@ oceanic_common_device_logbook (dc_device_t *abstract, dc_event_progress_t *progr } -static dc_status_t +dc_status_t oceanic_common_device_profile (dc_device_t *abstract, dc_event_progress_t *progress, dc_buffer_t *logbook, dc_dive_callback_t callback, void *userdata) { oceanic_common_device_t *device = (oceanic_common_device_t *) abstract; @@ -655,7 +657,7 @@ oceanic_common_device_foreach (dc_device_t *abstract, dc_dive_callback_t callbac } // Download the logbook ringbuffer. - rc = oceanic_common_device_logbook (abstract, &progress, logbook); + rc = VTABLE(abstract)->logbook (abstract, &progress, logbook); if (rc != DC_STATUS_SUCCESS) { dc_buffer_free (logbook); return rc; @@ -668,7 +670,7 @@ oceanic_common_device_foreach (dc_device_t *abstract, dc_dive_callback_t callbac } // Download the profile ringbuffer. - rc = oceanic_common_device_profile (abstract, &progress, logbook, callback, userdata); + rc = VTABLE(abstract)->profile (abstract, &progress, logbook, callback, userdata); if (rc != DC_STATUS_SUCCESS) { dc_buffer_free (logbook); return rc; diff --git a/src/oceanic_common.h b/src/oceanic_common.h index e5e53f0..7c88e54 100644 --- a/src/oceanic_common.h +++ b/src/oceanic_common.h @@ -65,6 +65,12 @@ typedef struct oceanic_common_device_t { unsigned int multipage; } oceanic_common_device_t; +typedef struct oceanic_common_device_vtable_t { + dc_device_vtable_t base; + dc_status_t (*logbook) (dc_device_t *device, dc_event_progress_t *progress, dc_buffer_t *logbook); + dc_status_t (*profile) (dc_device_t *device, dc_event_progress_t *progress, dc_buffer_t *logbook, dc_dive_callback_t callback, void *userdata); +} oceanic_common_device_vtable_t; + typedef unsigned char oceanic_common_version_t[PAGESIZE + 1]; int @@ -73,6 +79,12 @@ oceanic_common_match (const unsigned char *version, const oceanic_common_version void oceanic_common_device_init (oceanic_common_device_t *device); +dc_status_t +oceanic_common_device_logbook (dc_device_t *device, dc_event_progress_t *progress, dc_buffer_t *logbook); + +dc_status_t +oceanic_common_device_profile (dc_device_t *device, dc_event_progress_t *progress, dc_buffer_t *logbook, dc_dive_callback_t callback, void *userdata); + dc_status_t oceanic_common_device_set_fingerprint (dc_device_t *device, const unsigned char data[], unsigned int size); diff --git a/src/oceanic_veo250.c b/src/oceanic_veo250.c index 93373a7..2ffa0fd 100644 --- a/src/oceanic_veo250.c +++ b/src/oceanic_veo250.c @@ -31,7 +31,7 @@ #include "ringbuffer.h" #include "checksum.h" -#define ISINSTANCE(device) dc_device_isinstance((device), &oceanic_veo250_device_vtable) +#define ISINSTANCE(device) dc_device_isinstance((device), &oceanic_veo250_device_vtable.base) #define MAXRETRIES 2 #define MULTIPAGE 4 @@ -48,15 +48,19 @@ typedef struct oceanic_veo250_device_t { static dc_status_t oceanic_veo250_device_read (dc_device_t *abstract, unsigned int address, unsigned char data[], unsigned int size); static dc_status_t oceanic_veo250_device_close (dc_device_t *abstract); -static const dc_device_vtable_t oceanic_veo250_device_vtable = { - sizeof(oceanic_veo250_device_t), - DC_FAMILY_OCEANIC_VEO250, - oceanic_common_device_set_fingerprint, /* set_fingerprint */ - oceanic_veo250_device_read, /* read */ - NULL, /* write */ - oceanic_common_device_dump, /* dump */ - oceanic_common_device_foreach, /* foreach */ - oceanic_veo250_device_close /* close */ +static const oceanic_common_device_vtable_t oceanic_veo250_device_vtable = { + { + sizeof(oceanic_veo250_device_t), + DC_FAMILY_OCEANIC_VEO250, + oceanic_common_device_set_fingerprint, /* set_fingerprint */ + oceanic_veo250_device_read, /* read */ + NULL, /* write */ + oceanic_common_device_dump, /* dump */ + oceanic_common_device_foreach, /* foreach */ + oceanic_veo250_device_close /* close */ + }, + oceanic_common_device_logbook, + oceanic_common_device_profile, }; static const oceanic_common_version_t oceanic_vtpro_version[] = { @@ -229,7 +233,7 @@ oceanic_veo250_device_open (dc_device_t **out, dc_context_t *context, const char return DC_STATUS_INVALIDARGS; // Allocate memory. - device = (oceanic_veo250_device_t *) dc_device_allocate (context, &oceanic_veo250_device_vtable); + device = (oceanic_veo250_device_t *) dc_device_allocate (context, &oceanic_veo250_device_vtable.base); if (device == NULL) { ERROR (context, "Failed to allocate memory."); return DC_STATUS_NOMEMORY; diff --git a/src/oceanic_vtpro.c b/src/oceanic_vtpro.c index fdd993e..bf7b3fa 100644 --- a/src/oceanic_vtpro.c +++ b/src/oceanic_vtpro.c @@ -31,7 +31,7 @@ #include "ringbuffer.h" #include "checksum.h" -#define ISINSTANCE(device) dc_device_isinstance((device), &oceanic_vtpro_device_vtable) +#define ISINSTANCE(device) dc_device_isinstance((device), &oceanic_vtpro_device_vtable.base) #define MAXRETRIES 2 #define MULTIPAGE 4 @@ -48,15 +48,19 @@ typedef struct oceanic_vtpro_device_t { static dc_status_t oceanic_vtpro_device_read (dc_device_t *abstract, unsigned int address, unsigned char data[], unsigned int size); static dc_status_t oceanic_vtpro_device_close (dc_device_t *abstract); -static const dc_device_vtable_t oceanic_vtpro_device_vtable = { - sizeof(oceanic_vtpro_device_t), - DC_FAMILY_OCEANIC_VTPRO, - oceanic_common_device_set_fingerprint, /* set_fingerprint */ - oceanic_vtpro_device_read, /* read */ - NULL, /* write */ - oceanic_common_device_dump, /* dump */ - oceanic_common_device_foreach, /* foreach */ - oceanic_vtpro_device_close /* close */ +static const oceanic_common_device_vtable_t oceanic_vtpro_device_vtable = { + { + sizeof(oceanic_vtpro_device_t), + DC_FAMILY_OCEANIC_VTPRO, + oceanic_common_device_set_fingerprint, /* set_fingerprint */ + oceanic_vtpro_device_read, /* read */ + NULL, /* write */ + oceanic_common_device_dump, /* dump */ + oceanic_common_device_foreach, /* foreach */ + oceanic_vtpro_device_close /* close */ + }, + oceanic_common_device_logbook, + oceanic_common_device_profile, }; static const oceanic_common_version_t oceanic_vtpro_version[] = { @@ -260,7 +264,7 @@ oceanic_vtpro_device_open (dc_device_t **out, dc_context_t *context, const char return DC_STATUS_INVALIDARGS; // Allocate memory. - device = (oceanic_vtpro_device_t *) dc_device_allocate (context, &oceanic_vtpro_device_vtable); + device = (oceanic_vtpro_device_t *) dc_device_allocate (context, &oceanic_vtpro_device_vtable.base); if (device == NULL) { ERROR (context, "Failed to allocate memory."); return DC_STATUS_NOMEMORY;