From d5b7f7dc06827cab8dd57d6d373a08d6be111c79 Mon Sep 17 00:00:00 2001 From: Linus Torvalds Date: Mon, 12 Sep 2011 11:05:32 -0700 Subject: [PATCH] Libdivecomputer integration, part n+1 This actually gets me far enough that it prints out all the dives on my dive computer. It doesn't actually turn them into real dives yet, though - only a series of ugly 'printf's so far. And it hangs after printing the last dive. So I'm doing something wrong. Signed-off-by: Linus Torvalds --- libdivecomputer.c | 133 +++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 132 insertions(+), 1 deletion(-) diff --git a/libdivecomputer.c b/libdivecomputer.c index c08b117..ab75a89 100644 --- a/libdivecomputer.c +++ b/libdivecomputer.c @@ -103,6 +103,87 @@ static parser_status_t create_parser(device_data_t *devdata, parser_t **parser) } } +static int parse_gasmixes(parser_t *parser, int ngases) +{ + int i; + + for (i = 0; i < ngases; i++) { + int rc; + gasmix_t gasmix = {0}; + + rc = parser_get_field(parser, FIELD_TYPE_GASMIX, i, &gasmix); + if (rc != PARSER_STATUS_SUCCESS && rc != PARSER_STATUS_UNSUPPORTED) + return rc; + + printf("\n" + " %.1f\n" + " %.1f\n" + " %.1f\n" + "\n", + gasmix.helium * 100.0, + gasmix.oxygen * 100.0, + gasmix.nitrogen * 100.0); + } + return PARSER_STATUS_SUCCESS; +} + +void +sample_cb (parser_sample_type_t type, parser_sample_value_t value, void *userdata) +{ + int i; + static const char *events[] = { + "none", "deco", "rbt", "ascent", "ceiling", "workload", "transmitter", + "violation", "bookmark", "surface", "safety stop", "gaschange", + "safety stop (voluntary)", "safety stop (mandatory)", "deepstop", + "ceiling (safety stop)", "unknown", "divetime", "maxdepth", + "OLF", "PO2", "airtime", "rgbm", "heading", "tissue level warning"}; + + switch (type) { + case SAMPLE_TYPE_TIME: + printf("\n"); + printf(" \n", value.time / 60, value.time % 60); + break; + case SAMPLE_TYPE_DEPTH: + printf(" %.2f\n", value.depth); + break; + case SAMPLE_TYPE_PRESSURE: + printf(" %.2f\n", value.pressure.tank, value.pressure.value); + break; + case SAMPLE_TYPE_TEMPERATURE: + printf(" %.2f\n", value.temperature); + break; + case SAMPLE_TYPE_EVENT: + printf(" %s\n", + value.event.type, value.event.time, value.event.flags, value.event.value, events[value.event.type]); + break; + case SAMPLE_TYPE_RBT: + printf(" %u\n", value.rbt); + break; + case SAMPLE_TYPE_HEARTBEAT: + printf(" %u\n", value.heartbeat); + break; + case SAMPLE_TYPE_BEARING: + printf(" %u\n", value.bearing); + break; + case SAMPLE_TYPE_VENDOR: + printf(" ", value.vendor.type, value.vendor.size); + for (i = 0; i < value.vendor.size; ++i) + printf("%02X", ((unsigned char *) value.vendor.data)[i]); + printf("\n"); + break; + default: + break; + } +} + + +static int parse_samples(parser_t *parser) +{ + // Parse the sample data. + printf("Parsing the sample data.\n"); + return parser_samples_foreach(parser, sample_cb, NULL); +} + static int dive_cb(const unsigned char *data, unsigned int size, const unsigned char *fingerprint, unsigned int fsize, void *userdata) @@ -136,8 +217,58 @@ static int dive_cb(const unsigned char *data, unsigned int size, dt.year, dt.month, dt.day, dt.hour, dt.minute, dt.second); + // Parse the divetime. + printf("Parsing the divetime.\n"); + unsigned int divetime = 0; + rc = parser_get_field (parser, FIELD_TYPE_DIVETIME, 0, &divetime); + if (rc != PARSER_STATUS_SUCCESS && rc != PARSER_STATUS_UNSUPPORTED) { + error("Error parsing the divetime."); + parser_destroy(parser); + return rc; + } + + printf("%02u:%02u\n", + divetime / 60, divetime % 60); + + // Parse the maxdepth. + printf("Parsing the maxdepth.\n"); + double maxdepth = 0.0; + rc = parser_get_field(parser, FIELD_TYPE_MAXDEPTH, 0, &maxdepth); + if (rc != PARSER_STATUS_SUCCESS && rc != PARSER_STATUS_UNSUPPORTED) { + error("Error parsing the maxdepth."); + parser_destroy(parser); + return rc; + } + + printf("%.2f\n", maxdepth); + + // Parse the gas mixes. + printf("Parsing the gas mixes.\n"); + unsigned int ngases = 0; + rc = parser_get_field(parser, FIELD_TYPE_GASMIX_COUNT, 0, &ngases); + if (rc != PARSER_STATUS_SUCCESS && rc != PARSER_STATUS_UNSUPPORTED) { + error("Error parsing the gas mix count."); + parser_destroy(parser); + return rc; + } + + rc = parse_gasmixes(parser, ngases); + if (rc != PARSER_STATUS_SUCCESS) { + error("Error parsing the gas mix."); + parser_destroy(parser); + return rc; + } + + // Initialize the sample data. + rc = parse_samples(parser); + if (rc != PARSER_STATUS_SUCCESS) { + error("Error parsing the samples."); + parser_destroy(parser); + return rc; + } + parser_destroy(parser); - return PARSER_STATUS_SUCCESS; + return 1; } -- 2.45.2