diff options
Diffstat (limited to 'core')
-rw-r--r-- | core/device.c | 28 | ||||
-rw-r--r-- | core/device.h | 1 | ||||
-rw-r--r-- | core/load-git.c | 2 | ||||
-rw-r--r-- | core/parse-xml.c | 6 |
4 files changed, 35 insertions, 2 deletions
diff --git a/core/device.c b/core/device.c index 6c4452f78..afd52b8ef 100644 --- a/core/device.c +++ b/core/device.c @@ -182,3 +182,31 @@ struct divecomputer *fake_dc(struct divecomputer *dc, bool alloc) /* Even that didn't work? Give up, there's something wrong */ return &fakedc; } + +static void match_id(void *_dc, const char *model, uint32_t deviceid, + const char *nickname, const char *serial, const char *firmware) +{ + struct divecomputer *dc = _dc; + + if (dc->deviceid != deviceid) + return; + if (strcmp(dc->model, model)) + return; + + if (serial && !dc->serial) + dc->serial = strdup(serial); + if (firmware && !dc->fw_version) + dc->fw_version = strdup(firmware); +} + +/* + * When setting the device ID, we also fill in the + * serial number and firmware version data + */ +void set_dc_deviceid(struct divecomputer *dc, unsigned int deviceid) +{ + if (deviceid) { + dc->deviceid = deviceid; + call_for_each_dc(dc, match_id, false); + } +} diff --git a/core/device.h b/core/device.h index 8a00b96d3..264ea8db5 100644 --- a/core/device.h +++ b/core/device.h @@ -7,6 +7,7 @@ extern "C" { #endif extern struct divecomputer *fake_dc(struct divecomputer *dc, bool alloc); +extern void set_dc_deviceid(struct divecomputer *dc, unsigned int deviceid); extern void create_device_node(const char *model, uint32_t deviceid, const char *serial, const char *firmware, const char *nickname); extern void call_for_each_dc(void *f, void (*callback)(void *, const char *, uint32_t, const char *, const char *, const char *), bool select_only); diff --git a/core/load-git.c b/core/load-git.c index 0fe2c6353..670658d1b 100644 --- a/core/load-git.c +++ b/core/load-git.c @@ -643,7 +643,7 @@ static void parse_dc_date(char *line, struct membuffer *str, void *_dc) { (void) str; struct divecomputer *dc = _dc; update_date(&dc->when, line); } static void parse_dc_deviceid(char *line, struct membuffer *str, void *_dc) -{ (void) str; struct divecomputer *dc = _dc; dc->deviceid = get_hex(line); } +{ (void) str; struct divecomputer *dc = _dc; set_dc_deviceid(dc, get_hex(line)); } static void parse_dc_diveid(char *line, struct membuffer *str, void *_dc) { (void) str; struct divecomputer *dc = _dc; dc->diveid = get_hex(line); } diff --git a/core/parse-xml.c b/core/parse-xml.c index 3b5a2d794..052cb124c 100644 --- a/core/parse-xml.c +++ b/core/parse-xml.c @@ -892,6 +892,8 @@ static int match_dc_data_fields(struct divecomputer *dc, const char *name, char /* We're in the top-level dive xml. Try to convert whatever value to a dive value */ static void try_to_fill_dc(struct divecomputer *dc, const char *name, char *buf) { + unsigned int deviceid; + start_match("divecomputer", name, buf); if (MATCH("date", divedate, &dc->when)) @@ -900,8 +902,10 @@ static void try_to_fill_dc(struct divecomputer *dc, const char *name, char *buf) return; if (MATCH("model", utf8_string, &dc->model)) return; - if (MATCH("deviceid", hex_value, &dc->deviceid)) + if (MATCH("deviceid", hex_value, &deviceid)) { + set_dc_deviceid(dc, deviceid); return; + } if (MATCH("diveid", hex_value, &dc->diveid)) return; if (MATCH("dctype", get_dc_type, &dc->divemode)) |