Suunto Vyper protocol: add serial as string

I verified that the unsigned integer in the devinfo header actually matches the
serial number printed on the device - so let's add this as extra data string
and make it user visible (and also allow Suunto Vyper style devices to be
reliably distinguished in Subsurface).

Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
This commit is contained in:
Dirk Hohndel 2021-08-20 07:41:19 -07:00
parent 643b4271f6
commit f2cc4ab7ef
3 changed files with 21 additions and 3 deletions

View File

@ -92,7 +92,7 @@ dc_parser_new_internal (dc_parser_t **out, dc_context_t *context, dc_family_t fa
if (model == 0x01)
rc = suunto_eon_parser_create (&parser, context, 1);
else
rc = suunto_vyper_parser_create (&parser, context);
rc = suunto_vyper_parser_create (&parser, context, serial);
break;
case DC_FAMILY_SUUNTO_VYPER2:
case DC_FAMILY_SUUNTO_D9:

View File

@ -35,7 +35,7 @@ dc_status_t
suunto_vyper_device_open (dc_device_t **device, dc_context_t *context, dc_iostream_t *iostream);
dc_status_t
suunto_vyper_parser_create (dc_parser_t **parser, dc_context_t *context);
suunto_vyper_parser_create (dc_parser_t **parser, dc_context_t *context, unsigned int serial);
#ifdef __cplusplus
}

View File

@ -20,6 +20,8 @@
*/
#include <stdlib.h>
#include <stdio.h> /* for snprintf */
#include <string.h> /* for strdup */
#include <libdivecomputer/units.h>
@ -41,6 +43,7 @@ struct suunto_vyper_parser_t {
unsigned int maxdepth;
unsigned int marker;
unsigned int ngasmixes;
unsigned int serial;
unsigned int oxygen[NGASMIXES];
};
@ -159,7 +162,7 @@ suunto_vyper_parser_cache (suunto_vyper_parser_t *parser)
dc_status_t
suunto_vyper_parser_create (dc_parser_t **out, dc_context_t *context)
suunto_vyper_parser_create (dc_parser_t **out, dc_context_t *context, unsigned int serial)
{
suunto_vyper_parser_t *parser = NULL;
@ -179,6 +182,7 @@ suunto_vyper_parser_create (dc_parser_t **out, dc_context_t *context)
parser->maxdepth = 0;
parser->marker = 0;
parser->ngasmixes = 0;
parser->serial = serial;
for (unsigned int i = 0; i < NGASMIXES; ++i) {
parser->oxygen[i] = 0;
}
@ -229,6 +233,7 @@ suunto_vyper_parser_get_datetime (dc_parser_t *abstract, dc_datetime_t *datetime
return DC_STATUS_SUCCESS;
}
#define BUFLEN 16
static dc_status_t
suunto_vyper_parser_get_field (dc_parser_t *abstract, dc_field_type_t type, unsigned int flags, void *value)
@ -238,6 +243,8 @@ suunto_vyper_parser_get_field (dc_parser_t *abstract, dc_field_type_t type, unsi
dc_gasmix_t *gas = (dc_gasmix_t *) value;
dc_tank_t *tank = (dc_tank_t *) value;
dc_field_string_t *string = (dc_field_string_t *) value;
char buf[BUFLEN];
// Cache the data.
dc_status_t rc = suunto_vyper_parser_cache (parser);
@ -297,6 +304,17 @@ suunto_vyper_parser_get_field (dc_parser_t *abstract, dc_field_type_t type, unsi
*((dc_divemode_t *) value) = DC_DIVEMODE_OC;
}
break;
case DC_FIELD_STRING:
switch(flags) {
case 0: /* serial */
string->desc = "Serial";
snprintf(buf, BUFLEN, "%u", parser->serial);
break;
default:
return DC_STATUS_UNSUPPORTED;
}
string->value = strdup(buf);
break;
default:
return DC_STATUS_UNSUPPORTED;
}