Merge branch 'master' of git://github.com/libdivecomputer/libdivecomputer into Subsurface-DS9

Merge upstream libdivecomputer updates by Jef Driesen.

Minor fixups, and add ID for Cressi Neon.

* git://github.com/libdivecomputer/libdivecomputer:
  Add support for the Cressi Neon
  Use symbolic constant for invalid value
  Remove duplicate macro definition
  Add BLE support for the Aqualung i750TC
  Exclude the surface time from the dive time
This commit is contained in:
Linus Torvalds 2021-08-20 18:28:23 -07:00
commit b6df353752
4 changed files with 29 additions and 6 deletions

View File

@ -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

View File

@ -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;

View File

@ -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:

View File

@ -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;