diff options
Diffstat (limited to 'libdivecomputer.c')
-rw-r--r-- | libdivecomputer.c | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/libdivecomputer.c b/libdivecomputer.c index ff8d0eb93..c78d3b620 100644 --- a/libdivecomputer.c +++ b/libdivecomputer.c @@ -397,6 +397,39 @@ static uint32_t calculate_diveid(const unsigned char *fingerprint, unsigned int return csum[0]; } +static uint32_t calculate_string_hash(const char *str) +{ + return calculate_diveid(str, strlen(str)); +} + +#ifdef DC_FIELD_STRING +static void parse_string_field(struct dive *dive, dc_field_string_t *str) +{ + // Our dive ID is the string hash of the "Dive ID" string + if (!strcmp(str->desc, "Dive ID")) { + if (!dive->dc.diveid) + dive->dc.diveid = calculate_string_hash(str->value); + return; + } + + if (!strcmp(str->desc, "Serial")) { + if (!dive->dc.serial) + dive->dc.serial = strdup(str->value); + if (!dive->dc.deviceid) + dive->dc.deviceid = calculate_string_hash(str->value); + return; + } + + if (!strcmp(str->desc, "FW Version")) { + if (!dive->dc.fw_version) + dive->dc.fw_version = strdup(str->value); + return; + } + + add_extra_data(&dive->dc, str->desc, str->value); +} +#endif + /* returns true if we want libdivecomputer's dc_device_foreach() to continue, * false otherwise */ static int dive_cb(const unsigned char *data, unsigned int size, @@ -494,6 +527,20 @@ static int dive_cb(const unsigned char *data, unsigned int size, dive->dc.surface_pressure.mbar = rint(surface_pressure * 1000.0); #endif +#ifdef DC_FIELD_STRING + // The dive parsing may give us more device information + int idx; + for (idx = 0; idx < 100; idx++) { + dc_field_string_t str = { NULL }; + rc = dc_parser_get_field(parser, DC_FIELD_STRING, idx, &str); + if (rc != DC_STATUS_SUCCESS) + break; + if (!str.desc || !str.value) + break; + parse_string_field(dive, &str); + } +#endif + rc = parse_gasmixes(devdata, dive, parser, ngases, data); if (rc != DC_STATUS_SUCCESS) { dev_info(devdata, translate("gettextFromC", "Error parsing the gas mix")); |