]> git.tdb.fi Git - ext/subsurface.git/blobdiff - libdivecomputer.c
Added support for Mares Darwin, M1, M2, ... from latest libdivecomputer.
[ext/subsurface.git] / libdivecomputer.c
index a10243dd4d594801f6574e0c9284c8f44dc2458c..bf912f00875fa79fe8a2d204a285e0cc33356a95 100644 (file)
@@ -1,5 +1,7 @@
 #include <stdio.h>
 #include <pthread.h>
+#include <unistd.h>
+#include <inttypes.h>
 
 #include "dive.h"
 #include "divelist.h"
@@ -65,12 +67,15 @@ static parser_status_t create_parser(device_data_t *devdata, parser_t **parser)
        case DEVICE_TYPE_OCEANIC_ATOM2:
                return oceanic_atom2_parser_create(parser, devdata->devinfo.model);
 
+       case DEVICE_TYPE_MARES_DARWIN:
+               return mares_darwin_parser_create(parser, devdata->devinfo.model);
+
        case DEVICE_TYPE_MARES_NEMO:
        case DEVICE_TYPE_MARES_PUCK:
                return mares_nemo_parser_create(parser, devdata->devinfo.model);
 
        case DEVICE_TYPE_MARES_ICONHD:
-               return mares_iconhd_parser_create(parser);
+               return mares_iconhd_parser_create(parser, devdata->devinfo.model);
 
        case DEVICE_TYPE_HW_OSTC:
                return hw_ostc_parser_create(parser);
@@ -107,7 +112,7 @@ static int parse_gasmixes(struct dive *dive, parser_t *parser, int ngases)
                he = gasmix.helium * 1000 + 0.5;
 
                /* Ignore bogus data - libdivecomputer does some crazy stuff */
-               if (o2 < 210 || o2 >= 1000)
+               if (o2 <= AIR_PERMILLE || o2 >= 1000)
                        o2 = 0;
                if (he < 0 || he >= 800 || o2+he >= 1000)
                        he = 0;
@@ -173,7 +178,7 @@ sample_cb(parser_sample_type_t type, parser_sample_value_t value, void *userdata
        case SAMPLE_TYPE_TIME:
                sample = prepare_sample(divep);
                sample->time.seconds = value.time;
-               finish_sample(*divep, sample);
+               finish_sample(*divep);
                break;
        case SAMPLE_TYPE_DEPTH:
                sample->depth.mm = value.depth * 1000 + 0.5;
@@ -223,7 +228,7 @@ static int find_dive(struct dive *dive, device_data_t *devdata)
 {
        int i;
 
-       for (i = 0; i < devdata->preexisting; i++) {
+       for (i = 0; i < dive_table.preexisting; i++) {
                struct dive *old = dive_table.dives[i];
 
                if (dive->when != old->when)
@@ -333,7 +338,6 @@ static int dive_cb(const unsigned char *data, unsigned int size,
 
 static device_status_t import_device_data(device_t *device, device_data_t *devicedata)
 {
-       devicedata->preexisting = dive_table.nr;
        return device_foreach(device, dive_cb, devicedata);
 }
 
@@ -384,6 +388,9 @@ static device_status_t device_open(const char *devname,
        case DEVICE_TYPE_OCEANIC_ATOM2:
                return oceanic_atom2_device_open(device, devname);
 
+       case DEVICE_TYPE_MARES_DARWIN:
+               return mares_darwin_device_open(device, devname, 0); /// last parameter is model type (taken from example), 0 seems to be standard, 1 is DARWIN_AIR => Darwin Air wont work if this is fixed here?
+
        case DEVICE_TYPE_MARES_NEMO:
                return mares_nemo_device_open(device, devname);
 
@@ -412,10 +419,10 @@ static device_status_t device_open(const char *devname,
 
 static void event_cb(device_t *device, device_event_t event, const void *data, void *userdata)
 {
-       const device_progress_t *progress = (device_progress_t *) data;
-       const device_devinfo_t *devinfo = (device_devinfo_t *) data;
-       const device_clock_t *clock = (device_clock_t *) data;
-       device_data_t *devdata = (device_data_t *) userdata;
+       const device_progress_t *progress = data;
+       const device_devinfo_t *devinfo = data;
+       const device_clock_t *clock = data;
+       device_data_t *devdata = userdata;
 
        switch (event) {
        case DEVICE_EVENT_WAITING:
@@ -434,8 +441,8 @@ static void event_cb(device_t *device, device_event_t event, const void *data, v
                break;
        case DEVICE_EVENT_CLOCK:
                devdata->clock = *clock;
-               printf("Event: systime=%lld, devtime=%u\n",
-                       clock->systime, clock->devtime);
+               printf("Event: systime=%"PRId64", devtime=%u\n",
+                       (uint64_t)clock->systime, clock->devtime);
                break;
        default:
                break;
@@ -497,9 +504,6 @@ void do_import(device_data_t *data)
        pthread_t pthread;
        void *retval;
 
-       if (data->type == DEVICE_TYPE_UEMIS)
-               return uemis_import();
-
        /* I'm sure there is some better interface for waiting on a thread in a UI main loop */
        import_thread_done = 0;
        pthread_create(&pthread, NULL, pthread_wrapper, data);
@@ -535,13 +539,13 @@ struct device_list device_list[] = {
        { "Oceanic VT Pro",     DEVICE_TYPE_OCEANIC_VTPRO },
        { "Oceanic Veo250",     DEVICE_TYPE_OCEANIC_VEO250 },
        { "Oceanic Atom 2",     DEVICE_TYPE_OCEANIC_ATOM2 },
-       { "Mares Nemo",         DEVICE_TYPE_MARES_NEMO },
-       { "Mares Puck",         DEVICE_TYPE_MARES_PUCK },
+       { "Mares Darwin, M1, M2, Airlab",       DEVICE_TYPE_MARES_DARWIN },
+       { "Mares Nemo, Excel, Apneist", DEVICE_TYPE_MARES_NEMO },
+       { "Mares Puck, Nemo Air, Nemo Wide",    DEVICE_TYPE_MARES_PUCK },
        { "Mares Icon HD",      DEVICE_TYPE_MARES_ICONHD },
        { "OSTC",               DEVICE_TYPE_HW_OSTC },
        { "Cressi Edy",         DEVICE_TYPE_CRESSI_EDY },
        { "Zeagle N2iTiON 3",   DEVICE_TYPE_ZEAGLE_N2ITION3 },
        { "Atomics Cobalt",     DEVICE_TYPE_ATOMICS_COBALT },
-       { "Uemis Zurich SDA",   DEVICE_TYPE_UEMIS },
        { NULL }
 };