diff --git a/src/descriptor.c b/src/descriptor.c index 00b9f09..6980867 100644 --- a/src/descriptor.c +++ b/src/descriptor.c @@ -333,6 +333,7 @@ static const dc_descriptor_t g_descriptors[] = { /* Cressi Goa */ {"Cressi", "Cartesio", DC_FAMILY_CRESSI_GOA, 1, DC_TRANSPORT_SERIAL | DC_TRANSPORT_BLE, NULL}, {"Cressi", "Goa", DC_FAMILY_CRESSI_GOA, 2, DC_TRANSPORT_SERIAL | DC_TRANSPORT_BLE, NULL}, + {"Cressi", "Neon", DC_FAMILY_CRESSI_GOA, 9, DC_TRANSPORT_SERIAL, NULL}, /* Zeagle N2iTiON3 */ {"Zeagle", "N2iTiON3", DC_FAMILY_ZEAGLE_N2ITION3, 0, DC_TRANSPORT_SERIAL, NULL}, {"Apeks", "Quantum X", DC_FAMILY_ZEAGLE_N2ITION3, 0, DC_TRANSPORT_SERIAL, NULL}, @@ -681,6 +682,7 @@ static int dc_filter_oceanic (dc_transport_t transport, const void *userdata, vo { static const unsigned int model[] = { 0x4552, // Oceanic Pro Plus X + 0x455A, // Aqualung i750TC 0x4647, // Sherwood Sage 0x4648, // Aqualung i300C 0x4649, // Aqualung i200C diff --git a/src/divesystem_idive_parser.c b/src/divesystem_idive_parser.c index b8d103d..a6375a0 100644 --- a/src/divesystem_idive_parser.c +++ b/src/divesystem_idive_parser.c @@ -322,7 +322,7 @@ divesystem_idive_parser_get_field (dc_parser_t *abstract, dc_field_type_t type, water->density = 0.0; break; case DC_FIELD_DIVEMODE: - if (parser->divemode == 0xFFFFFFFF) + if (parser->divemode == INVALID) return DC_STATUS_UNSUPPORTED; switch (parser->divemode) { case OC: @@ -367,8 +367,8 @@ divesystem_idive_parser_samples_foreach (dc_parser_t *abstract, dc_sample_callba unsigned int ntanks = 0; divesystem_idive_gasmix_t gasmix[NGASMIXES] = {0}; divesystem_idive_tank_t tank[NTANKS] = {0}; - unsigned int o2_previous = 0xFFFFFFFF; - unsigned int he_previous = 0xFFFFFFFF; + unsigned int o2_previous = INVALID; + unsigned int he_previous = INVALID; unsigned int mode_previous = INVALID; unsigned int divemode = INVALID; unsigned int tank_previous = INVALID; diff --git a/src/mares_iconhd_parser.c b/src/mares_iconhd_parser.c index e878619..e4023bb 100644 --- a/src/mares_iconhd_parser.c +++ b/src/mares_iconhd_parser.c @@ -145,6 +145,7 @@ struct mares_iconhd_parser_t { unsigned int samplesize; unsigned int headersize; unsigned int settings; + unsigned int surftime; unsigned int interval; unsigned int samplerate; unsigned int ntanks; @@ -350,6 +351,7 @@ mares_iconhd_cache (mares_iconhd_parser_t *parser) parser->samplesize = samplesize; parser->headersize = headersize; parser->settings = settings; + parser->surftime = 3 * 60; parser->interval = interval; parser->samplerate = samplerate; parser->ntanks = ntanks; @@ -428,6 +430,22 @@ mares_genius_cache (mares_iconhd_parser_t *parser) return DC_STATUS_DATAFORMAT; } + // Get the profile type and version. + unsigned int profile_type = array_uint16_le (data + headersize); + unsigned int profile_minor = data[headersize + 2]; + unsigned int profile_major = data[headersize + 3]; + + // Get the surface timeout setting (in minutes). + // For older firmware versions the value is hardcoded to 3 minutes, but + // starting with the newer v01.02.00 firmware the value is configurable and + // stored in the settings. To detect whether the setting is available, we + // need to check the profile version instead of the header version. + unsigned int surftime = 3; + if (profile_type == 0 && + OBJVERSION(profile_major,profile_minor) >= OBJVERSION(1,0)) { + surftime = (settings >> 13) & 0x3F; + } + // Gas mixes and tanks. unsigned int ntanks = 0; unsigned int ngasmixes = 0; @@ -479,6 +497,7 @@ mares_genius_cache (mares_iconhd_parser_t *parser) parser->samplesize = samplesize; parser->headersize = headersize; parser->settings = settings; + parser->surftime = surftime * 60; parser->interval = 5; parser->samplerate = 1; parser->ntanks = ntanks; @@ -532,6 +551,7 @@ mares_iconhd_parser_create (dc_parser_t **out, dc_context_t *context, unsigned i parser->samplesize = 0; parser->headersize = 0; parser->settings = 0; + parser->surftime = 0; parser->interval = 0; parser->samplerate = 0; parser->ntanks = 0; @@ -567,6 +587,7 @@ mares_iconhd_parser_set_data (dc_parser_t *abstract, const unsigned char *data, parser->samplesize = 0; parser->headersize = 0; parser->settings = 0; + parser->surftime = 0; parser->interval = 0; parser->samplerate = 0; parser->ntanks = 0; @@ -679,7 +700,7 @@ mares_iconhd_parser_get_field (dc_parser_t *abstract, dc_field_type_t type, unsi switch (type) { case DC_FIELD_DIVETIME: if (parser->model == GENIUS || parser->model == HORIZON) { - *((unsigned int *) value) = parser->nsamples * parser->interval; + *((unsigned int *) value) = parser->nsamples * parser->interval - parser->surftime; } else if (parser->model == SMARTAPNEA) { *((unsigned int *) value) = array_uint16_le (p + 0x24); } else if (parser->mode == ICONHD_FREEDIVE) { @@ -691,7 +712,7 @@ mares_iconhd_parser_get_field (dc_parser_t *abstract, dc_field_type_t type, unsi } *((unsigned int *) value) = divetime; } else { - *((unsigned int *) value) = parser->nsamples * parser->interval; + *((unsigned int *) value) = parser->nsamples * parser->interval - parser->surftime; } break; case DC_FIELD_MAXDEPTH: diff --git a/src/oceanic_atom2.c b/src/oceanic_atom2.c index ca0b095..607b80f 100644 --- a/src/oceanic_atom2.c +++ b/src/oceanic_atom2.c @@ -907,7 +907,7 @@ oceanic_atom2_device_open (dc_device_t **out, dc_context_t *context, dc_iostream } if (dc_iostream_get_transport (device->iostream) == DC_TRANSPORT_BLE && - model != PROPLUSX && model != SAGE && model != BEACON) { + model != PROPLUSX && model != I750TC && model != SAGE && model != BEACON) { status = oceanic_atom2_ble_handshake(device); if (status != DC_STATUS_SUCCESS) { goto error_free;