diff --git a/src/parser.c b/src/parser.c index 85247c6..39789cd 100644 --- a/src/parser.c +++ b/src/parser.c @@ -87,7 +87,7 @@ dc_parser_new_internal (dc_parser_t **out, dc_context_t *context, dc_family_t fa break; case DC_FAMILY_SUUNTO_VYPER2: case DC_FAMILY_SUUNTO_D9: - rc = suunto_d9_parser_create (&parser, context, model); + rc = suunto_d9_parser_create (&parser, context, model, serial); break; case DC_FAMILY_SUUNTO_EONSTEEL: rc = suunto_eonsteel_parser_create(&parser, context, model); diff --git a/src/suunto_d9.h b/src/suunto_d9.h index 94a782f..a522fb8 100644 --- a/src/suunto_d9.h +++ b/src/suunto_d9.h @@ -36,7 +36,7 @@ dc_status_t suunto_d9_device_open (dc_device_t **device, dc_context_t *context, dc_iostream_t *iostream, unsigned int model); dc_status_t -suunto_d9_parser_create (dc_parser_t **parser, dc_context_t *context, unsigned int model); +suunto_d9_parser_create (dc_parser_t **parser, dc_context_t *context, unsigned int model, unsigned int serial); #ifdef __cplusplus } diff --git a/src/suunto_d9_parser.c b/src/suunto_d9_parser.c index 09304d3..6566bc9 100644 --- a/src/suunto_d9_parser.c +++ b/src/suunto_d9_parser.c @@ -20,7 +20,8 @@ */ #include -#include // memcmp +#include // memcmp, strdup +#include // snprintf #include "suunto_d9.h" #include "context-private.h" @@ -72,6 +73,7 @@ typedef struct suunto_d9_parser_t suunto_d9_parser_t; struct suunto_d9_parser_t { dc_parser_t base; unsigned int model; + unsigned int serial; // Cached fields. unsigned int cached; unsigned int mode; @@ -231,7 +233,7 @@ suunto_d9_parser_cache (suunto_d9_parser_t *parser) } dc_status_t -suunto_d9_parser_create (dc_parser_t **out, dc_context_t *context, unsigned int model) +suunto_d9_parser_create (dc_parser_t **out, dc_context_t *context, unsigned int model, unsigned int serial) { suunto_d9_parser_t *parser = NULL; @@ -247,6 +249,7 @@ suunto_d9_parser_create (dc_parser_t **out, dc_context_t *context, unsigned int // Set the default values. parser->model = model; + parser->serial = serial; parser->cached = 0; parser->mode = AIR; parser->ngasmixes = 0; @@ -326,6 +329,7 @@ suunto_d9_parser_get_datetime (dc_parser_t *abstract, dc_datetime_t *datetime) return DC_STATUS_SUCCESS; } +#define BUFLEN 16 static dc_status_t suunto_d9_parser_get_field (dc_parser_t *abstract, dc_field_type_t type, unsigned int flags, void *value) @@ -341,6 +345,9 @@ suunto_d9_parser_get_field (dc_parser_t *abstract, dc_field_type_t type, unsigne return rc; dc_gasmix_t *gasmix = (dc_gasmix_t *) value; + dc_field_string_t *string = (dc_field_string_t *) value; + + char buf[BUFLEN]; if (value) { switch (type) { @@ -388,6 +395,17 @@ suunto_d9_parser_get_field (dc_parser_t *abstract, dc_field_type_t type, unsigne return DC_STATUS_DATAFORMAT; } break; + case DC_FIELD_STRING: + switch (flags) { + case 0: /* serial */ + string->desc = "Serial"; + snprintf(buf, BUFLEN, "%08u", parser->serial); + break; + default: + return DC_STATUS_UNSUPPORTED; + } + string->value = strdup(buf); + break; default: return DC_STATUS_UNSUPPORTED; }