From 41f50534aa22bd1a56432c188ab3aecac8afe45f Mon Sep 17 00:00:00 2001 From: Jef Driesen Date: Sun, 10 Jun 2018 16:18:39 +0200 Subject: [PATCH] Fix the length of the Suunto D6i gas change event The latest Suunto D6i firmware uses 5 bytes for the 0x06 gas change event. Reported-By: Nick Shore --- src/suunto_d9_parser.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/suunto_d9_parser.c b/src/suunto_d9_parser.c index 09304d3..10a7590 100644 --- a/src/suunto_d9_parser.c +++ b/src/suunto_d9_parser.c @@ -74,6 +74,7 @@ struct suunto_d9_parser_t { unsigned int model; // Cached fields. unsigned int cached; + unsigned int id; unsigned int mode; unsigned int ngasmixes; unsigned int oxygen[NGASMIXES]; @@ -225,6 +226,7 @@ suunto_d9_parser_cache (suunto_d9_parser_t *parser) } } parser->config = config; + parser->id = id; parser->cached = 1; return DC_STATUS_SUCCESS; @@ -248,6 +250,7 @@ suunto_d9_parser_create (dc_parser_t **out, dc_context_t *context, unsigned int // Set the default values. parser->model = model; parser->cached = 0; + parser->id = 0; parser->mode = AIR; parser->ngasmixes = 0; for (unsigned int i = 0; i < NGASMIXES; ++i) { @@ -270,6 +273,7 @@ suunto_d9_parser_set_data (dc_parser_t *abstract, const unsigned char *data, uns // Reset the cache. parser->cached = 0; + parser->id = 0; parser->mode = AIR; parser->ngasmixes = 0; for (unsigned int i = 0; i < NGASMIXES; ++i) { @@ -715,10 +719,12 @@ suunto_d9_parser_samples_foreach (dc_parser_t *abstract, dc_sample_callback_t ca offset += 2; break; case 0x06: // Gas Change - if (parser->model == DX || parser->model == VYPERNOVO) + if (parser->model == DX || parser->model == VYPERNOVO || + (parser->model == D6i && parser->id == ID_D6I_V2)) { length = 5; - else + } else { length = 4; + } if (offset + length > size) { ERROR (abstract->context, "Buffer overflow detected!"); return DC_STATUS_DATAFORMAT; @@ -726,7 +732,8 @@ suunto_d9_parser_samples_foreach (dc_parser_t *abstract, dc_sample_callback_t ca unknown = data[offset + 0]; he = data[offset + 1]; o2 = data[offset + 2]; - if (parser->model == DX || parser->model == VYPERNOVO) { + if (parser->model == DX || parser->model == VYPERNOVO || + (parser->model == D6i && parser->id == ID_D6I_V2)) { seconds = data[offset + 4]; } else { seconds = data[offset + 3];