]> git.tdb.fi Git - ext/subsurface.git/commitdiff
Libdivecomputer: start actually importing the dive data
authorLinus Torvalds <torvalds@linux-foundation.org>
Mon, 12 Sep 2011 20:25:05 +0000 (13:25 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Mon, 12 Sep 2011 20:25:05 +0000 (13:25 -0700)
So this actually reports the dive data that libdivecomputer generates.
It doesn't import special events etc, but neither do we for the xml
importer.

It is also slow as heck, since it doesn't try to do the "hey, I already
have this dive" logic and always imports everything, but the basics are
definitely there.

Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
dive.h
divelist.h
libdivecomputer.c
main.c
parse-xml.c

diff --git a/dive.h b/dive.h
index ee57cf820e1eb49b51dffbd6acce6c8ca204ad17..cc6e85da2c50b627f0ae1d68b6f41eb5a5e14382 100644 (file)
--- a/dive.h
+++ b/dive.h
@@ -193,12 +193,15 @@ static inline unsigned int dive_size(int samples)
        return sizeof(struct dive) + samples*sizeof(struct sample);
 }
 
+extern time_t utc_mktime(struct tm *tm);
+
 extern struct dive *alloc_dive(void);
 extern void record_dive(struct dive *dive);
 
 extern struct sample *prepare_sample(struct dive **divep);
 extern void finish_sample(struct dive *dive, struct sample *sample);
 
+extern void report_dives(void);
 extern struct dive *fixup_dive(struct dive *dive);
 extern struct dive *try_to_merge(struct dive *a, struct dive *b);
 
index 797a8964101c936ef43b3d131659574531902627..c046a879a7641f45af269d94cc4e7e2f135244ef 100644 (file)
@@ -10,6 +10,7 @@ struct DiveList {
        GtkTreeViewColumn *date, *depth, *duration;
 };
 
+extern struct DiveList dive_list;
 extern struct DiveList dive_list_create(void);
 extern void dive_list_update_dives(struct DiveList);
 extern void update_dive_list_units(struct DiveList *);
index 7bea8e3a0ac6ce4b178e39b6358a82bb21ae1bb7..da9b35bd3c04dd7ff321dd6ac568884f9e81046a 100644 (file)
@@ -2,6 +2,7 @@
 #include <gtk/gtk.h>
 
 #include "dive.h"
+#include "divelist.h"
 #include "display.h"
 
 /* libdivecomputer */
@@ -116,7 +117,7 @@ static parser_status_t create_parser(device_data_t *devdata, parser_t **parser)
        }
 }
 
-static int parse_gasmixes(parser_t *parser, int ngases)
+static int parse_gasmixes(struct dive *dive, parser_t *parser, int ngases)
 {
        int i;
 
@@ -128,20 +129,17 @@ static int parse_gasmixes(parser_t *parser, int ngases)
                if (rc != PARSER_STATUS_SUCCESS && rc != PARSER_STATUS_UNSUPPORTED)
                        return rc;
 
-               printf("<gasmix>\n"
-                       "   <he>%.1f</he>\n"
-                       "   <o2>%.1f</o2>\n"
-                       "   <n2>%.1f</n2>\n"
-                       "</gasmix>\n",
-                       gasmix.helium * 100.0,
-                       gasmix.oxygen * 100.0,
-                       gasmix.nitrogen * 100.0);
+               if (i >= MAX_CYLINDERS)
+                       continue;
+
+               dive->cylinder[i].gasmix.o2.permille = gasmix.oxygen * 1000 + 0.5;
+               dive->cylinder[i].gasmix.he.permille = gasmix.helium * 1000 + 0.5;
        }
        return PARSER_STATUS_SUCCESS;
 }
 
 void
-sample_cb (parser_sample_type_t type, parser_sample_value_t value, void *userdata)
+sample_cb(parser_sample_type_t type, parser_sample_value_t value, void *userdata)
 {
        int i;
        static const char *events[] = {
@@ -150,20 +148,31 @@ sample_cb (parser_sample_type_t type, parser_sample_value_t value, void *userdat
                "safety stop (voluntary)", "safety stop (mandatory)", "deepstop",
                "ceiling (safety stop)", "unknown", "divetime", "maxdepth",
                "OLF", "PO2", "airtime", "rgbm", "heading", "tissue level warning"};
+       struct dive **divep = userdata;
+       struct dive *dive = *divep;
+       struct sample *sample;
+
+       /*
+        * We fill in the "previous" sample - except for SAMPLE_TYPE_TIME,
+        * which creates a new one.
+        */
+       sample = dive->samples ? dive->sample+dive->samples-1 : NULL;
 
        switch (type) {
        case SAMPLE_TYPE_TIME:
-               printf("<sample>\n");
-               printf("   <time>%02u:%02u</time>\n", value.time / 60, value.time % 60);
+               sample = prepare_sample(divep);
+               sample->time.seconds = value.time;
+               finish_sample(*divep, sample);
                break;
        case SAMPLE_TYPE_DEPTH:
-               printf("   <depth>%.2f</depth>\n", value.depth);
+               sample->depth.mm = value.depth * 1000 + 0.5;
                break;
        case SAMPLE_TYPE_PRESSURE:
-               printf("   <pressure tank=\"%u\">%.2f</pressure>\n", value.pressure.tank, value.pressure.value);
+               sample->cylinderindex = value.pressure.tank;
+               sample->cylinderpressure.mbar = value.pressure.value * 1000 + 0.5;
                break;
        case SAMPLE_TYPE_TEMPERATURE:
-               printf("   <temperature>%.2f</temperature>\n", value.temperature);
+               sample->temperature.mkelvin = (value.temperature + 273.15) * 1000 + 0.5;
                break;
        case SAMPLE_TYPE_EVENT:
                printf("   <event type=\"%u\" time=\"%u\" flags=\"%u\" value=\"%u\">%s</event>\n",
@@ -190,11 +199,11 @@ sample_cb (parser_sample_type_t type, parser_sample_value_t value, void *userdat
 }
 
 
-static int parse_samples(parser_t *parser)
+static int parse_samples(struct dive **divep, parser_t *parser)
 {
        // Parse the sample data.
        printf("Parsing the sample data.\n");
-       return parser_samples_foreach(parser, sample_cb, NULL);
+       return parser_samples_foreach(parser, sample_cb, divep);
 }
 
 static int dive_cb(const unsigned char *data, unsigned int size,
@@ -205,6 +214,8 @@ static int dive_cb(const unsigned char *data, unsigned int size,
        parser_t *parser = NULL;
        device_data_t *devdata = userdata;
        dc_datetime_t dt = {0};
+       struct tm tm;
+       struct dive *dive;
 
        /* Christ, this is hacky */
        run_gtk_mainloop();
@@ -222,6 +233,7 @@ static int dive_cb(const unsigned char *data, unsigned int size,
                return rc;
        }
 
+       dive = alloc_dive();
        rc = parser_get_datetime(parser, &dt);
        if (rc != PARSER_STATUS_SUCCESS && rc != PARSER_STATUS_UNSUPPORTED) {
                error("Error parsing the datetime.");
@@ -229,9 +241,13 @@ static int dive_cb(const unsigned char *data, unsigned int size,
                return rc;
        }
 
-       printf("<datetime>%04i-%02i-%02i %02i:%02i:%02i</datetime>\n",
-               dt.year, dt.month, dt.day,
-               dt.hour, dt.minute, dt.second);
+       tm.tm_year = dt.year;
+       tm.tm_mon = dt.month-1;
+       tm.tm_mday = dt.day;
+       tm.tm_hour = dt.hour;
+       tm.tm_min = dt.minute;
+       tm.tm_sec = dt.second;
+       dive->when = utc_mktime(&tm);
 
        // Parse the divetime.
        printf("Parsing the divetime.\n");
@@ -242,9 +258,7 @@ static int dive_cb(const unsigned char *data, unsigned int size,
                parser_destroy(parser);
                return rc;
        }
-
-       printf("<divetime>%02u:%02u</divetime>\n",
-               divetime / 60, divetime % 60);
+       dive->duration.seconds = divetime;
 
        // Parse the maxdepth.
        printf("Parsing the maxdepth.\n");
@@ -255,8 +269,7 @@ static int dive_cb(const unsigned char *data, unsigned int size,
                parser_destroy(parser);
                return rc;
        }
-
-       printf("<maxdepth>%.2f</maxdepth>\n", maxdepth);
+       dive->maxdepth.mm = maxdepth * 1000 + 0.5;
 
        // Parse the gas mixes.
        printf("Parsing the gas mixes.\n");
@@ -268,7 +281,7 @@ static int dive_cb(const unsigned char *data, unsigned int size,
                return rc;
        }
 
-       rc = parse_gasmixes(parser, ngases);
+       rc = parse_gasmixes(dive, parser, ngases);
        if (rc != PARSER_STATUS_SUCCESS) {
                error("Error parsing the gas mix.");
                parser_destroy(parser);
@@ -276,12 +289,13 @@ static int dive_cb(const unsigned char *data, unsigned int size,
        }
 
        // Initialize the sample data.
-       rc = parse_samples(parser);
+       rc = parse_samples(&dive, parser);
        if (rc != PARSER_STATUS_SUCCESS) {
                error("Error parsing the samples.");
                parser_destroy(parser);
                return rc;
        }
+       record_dive(dive);
 
        parser_destroy(parser);
        return 1;
@@ -565,4 +579,7 @@ void import_dialog(GtkWidget *w, gpointer data)
                break;
        }
        gtk_widget_destroy(dialog);
+
+       report_dives();
+       dive_list_update_dives(dive_list);
 }
diff --git a/main.c b/main.c
index 23570828e0e0490f3caac92de8142f8af9dddeee..5157c54e3e595ee0d792b9bc150830354c3f0d81 100644 (file)
--- a/main.c
+++ b/main.c
@@ -37,7 +37,7 @@ static int sortfn(const void *_a, const void *_b)
  * This doesn't really report anything at all. We just sort the
  * dives, the GUI does the reporting
  */
-static void report_dives(void)
+void report_dives(void)
 {
        int i;
 
index 4d6912e723ecc06041ac114cbcd4411c46d659b3..24acb1c1cc9f7f003e490de5c732b503d6b20866 100644 (file)
@@ -104,7 +104,7 @@ static enum import_source {
        UDDF,
 } import_source;
 
-static time_t utc_mktime(struct tm *tm)
+time_t utc_mktime(struct tm *tm)
 {
        static const int mdays[] = {
            0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334