X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=libdivecomputer.c;h=14f794e8cc8440b55137c557c8ac805cf2763fa7;hb=2d1a316d848441a7d1137cb51b1ee0b8222aaa74;hp=806ea651f108497f748e4b56f6d6252fdc821817;hpb=3a77eb85101a5fb1dc186b88a3a02d2ae27690c7;p=ext%2Fsubsurface.git diff --git a/libdivecomputer.c b/libdivecomputer.c index 806ea65..14f794e 100644 --- a/libdivecomputer.c +++ b/libdivecomputer.c @@ -1,5 +1,7 @@ #include #include +#include +#include #include "dive.h" #include "divelist.h" @@ -8,6 +10,14 @@ #include "libdivecomputer.h" +/* Christ. Libdivecomputer has the worst configuration system ever. */ +#ifdef HW_FROG_H + #define NOT_FROG , 0 + #define LIBDIVECOMPUTER_SUPPORTS_FROG +#else + #define NOT_FROG +#endif + static void error(const char *fmt, ...) { va_list args; @@ -65,15 +75,23 @@ 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); + return hw_ostc_parser_create(parser NOT_FROG); + +#ifdef LIBDIVECOMPUTER_SUPPORTS_FROG + case DEVICE_TYPE_HW_FROG: + return hw_ostc_parser_create(parser, 1); +#endif case DEVICE_TYPE_CRESSI_EDY: case DEVICE_TYPE_ZEAGLE_N2ITION3: @@ -107,7 +125,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 +191,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; @@ -216,6 +234,23 @@ static int parse_samples(struct dive **divep, parser_t *parser) return parser_samples_foreach(parser, sample_cb, divep); } +/* + * Check if this dive already existed before the import + */ +static int find_dive(struct dive *dive, device_data_t *devdata) +{ + int i; + + for (i = 0; i < dive_table.preexisting; i++) { + struct dive *old = dive_table.dives[i]; + + if (dive->when != old->when) + continue; + return 1; + } + return 0; +} + static int dive_cb(const unsigned char *data, unsigned int size, const unsigned char *fingerprint, unsigned int fsize, void *userdata) @@ -302,9 +337,14 @@ static int dive_cb(const unsigned char *data, unsigned int size, parser_destroy(parser); return rc; } - record_dive(dive); parser_destroy(parser); + + /* If we already saw this dive, abort. */ + if (find_dive(dive, devdata)) + return 0; + + record_dive(dive); return 1; } @@ -361,6 +401,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); @@ -389,10 +432,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: @@ -411,8 +454,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; @@ -474,9 +517,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); @@ -512,13 +552,16 @@ 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 }, +#ifdef LIBDIVECOMPUTER_SUPPORTS_FROG + { "OSTC Frog", DEVICE_TYPE_HW_FROG }, +#endif { "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 } };