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:
commit
b6df353752
@ -333,6 +333,7 @@ static const dc_descriptor_t g_descriptors[] = {
|
|||||||
/* Cressi Goa */
|
/* Cressi Goa */
|
||||||
{"Cressi", "Cartesio", DC_FAMILY_CRESSI_GOA, 1, DC_TRANSPORT_SERIAL | DC_TRANSPORT_BLE, NULL},
|
{"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", "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 */
|
||||||
{"Zeagle", "N2iTiON3", DC_FAMILY_ZEAGLE_N2ITION3, 0, DC_TRANSPORT_SERIAL, NULL},
|
{"Zeagle", "N2iTiON3", DC_FAMILY_ZEAGLE_N2ITION3, 0, DC_TRANSPORT_SERIAL, NULL},
|
||||||
{"Apeks", "Quantum X", 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[] = {
|
static const unsigned int model[] = {
|
||||||
0x4552, // Oceanic Pro Plus X
|
0x4552, // Oceanic Pro Plus X
|
||||||
|
0x455A, // Aqualung i750TC
|
||||||
0x4647, // Sherwood Sage
|
0x4647, // Sherwood Sage
|
||||||
0x4648, // Aqualung i300C
|
0x4648, // Aqualung i300C
|
||||||
0x4649, // Aqualung i200C
|
0x4649, // Aqualung i200C
|
||||||
|
|||||||
@ -322,7 +322,7 @@ divesystem_idive_parser_get_field (dc_parser_t *abstract, dc_field_type_t type,
|
|||||||
water->density = 0.0;
|
water->density = 0.0;
|
||||||
break;
|
break;
|
||||||
case DC_FIELD_DIVEMODE:
|
case DC_FIELD_DIVEMODE:
|
||||||
if (parser->divemode == 0xFFFFFFFF)
|
if (parser->divemode == INVALID)
|
||||||
return DC_STATUS_UNSUPPORTED;
|
return DC_STATUS_UNSUPPORTED;
|
||||||
switch (parser->divemode) {
|
switch (parser->divemode) {
|
||||||
case OC:
|
case OC:
|
||||||
@ -367,8 +367,8 @@ divesystem_idive_parser_samples_foreach (dc_parser_t *abstract, dc_sample_callba
|
|||||||
unsigned int ntanks = 0;
|
unsigned int ntanks = 0;
|
||||||
divesystem_idive_gasmix_t gasmix[NGASMIXES] = {0};
|
divesystem_idive_gasmix_t gasmix[NGASMIXES] = {0};
|
||||||
divesystem_idive_tank_t tank[NTANKS] = {0};
|
divesystem_idive_tank_t tank[NTANKS] = {0};
|
||||||
unsigned int o2_previous = 0xFFFFFFFF;
|
unsigned int o2_previous = INVALID;
|
||||||
unsigned int he_previous = 0xFFFFFFFF;
|
unsigned int he_previous = INVALID;
|
||||||
unsigned int mode_previous = INVALID;
|
unsigned int mode_previous = INVALID;
|
||||||
unsigned int divemode = INVALID;
|
unsigned int divemode = INVALID;
|
||||||
unsigned int tank_previous = INVALID;
|
unsigned int tank_previous = INVALID;
|
||||||
|
|||||||
@ -145,6 +145,7 @@ struct mares_iconhd_parser_t {
|
|||||||
unsigned int samplesize;
|
unsigned int samplesize;
|
||||||
unsigned int headersize;
|
unsigned int headersize;
|
||||||
unsigned int settings;
|
unsigned int settings;
|
||||||
|
unsigned int surftime;
|
||||||
unsigned int interval;
|
unsigned int interval;
|
||||||
unsigned int samplerate;
|
unsigned int samplerate;
|
||||||
unsigned int ntanks;
|
unsigned int ntanks;
|
||||||
@ -350,6 +351,7 @@ mares_iconhd_cache (mares_iconhd_parser_t *parser)
|
|||||||
parser->samplesize = samplesize;
|
parser->samplesize = samplesize;
|
||||||
parser->headersize = headersize;
|
parser->headersize = headersize;
|
||||||
parser->settings = settings;
|
parser->settings = settings;
|
||||||
|
parser->surftime = 3 * 60;
|
||||||
parser->interval = interval;
|
parser->interval = interval;
|
||||||
parser->samplerate = samplerate;
|
parser->samplerate = samplerate;
|
||||||
parser->ntanks = ntanks;
|
parser->ntanks = ntanks;
|
||||||
@ -428,6 +430,22 @@ mares_genius_cache (mares_iconhd_parser_t *parser)
|
|||||||
return DC_STATUS_DATAFORMAT;
|
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.
|
// Gas mixes and tanks.
|
||||||
unsigned int ntanks = 0;
|
unsigned int ntanks = 0;
|
||||||
unsigned int ngasmixes = 0;
|
unsigned int ngasmixes = 0;
|
||||||
@ -479,6 +497,7 @@ mares_genius_cache (mares_iconhd_parser_t *parser)
|
|||||||
parser->samplesize = samplesize;
|
parser->samplesize = samplesize;
|
||||||
parser->headersize = headersize;
|
parser->headersize = headersize;
|
||||||
parser->settings = settings;
|
parser->settings = settings;
|
||||||
|
parser->surftime = surftime * 60;
|
||||||
parser->interval = 5;
|
parser->interval = 5;
|
||||||
parser->samplerate = 1;
|
parser->samplerate = 1;
|
||||||
parser->ntanks = ntanks;
|
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->samplesize = 0;
|
||||||
parser->headersize = 0;
|
parser->headersize = 0;
|
||||||
parser->settings = 0;
|
parser->settings = 0;
|
||||||
|
parser->surftime = 0;
|
||||||
parser->interval = 0;
|
parser->interval = 0;
|
||||||
parser->samplerate = 0;
|
parser->samplerate = 0;
|
||||||
parser->ntanks = 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->samplesize = 0;
|
||||||
parser->headersize = 0;
|
parser->headersize = 0;
|
||||||
parser->settings = 0;
|
parser->settings = 0;
|
||||||
|
parser->surftime = 0;
|
||||||
parser->interval = 0;
|
parser->interval = 0;
|
||||||
parser->samplerate = 0;
|
parser->samplerate = 0;
|
||||||
parser->ntanks = 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) {
|
switch (type) {
|
||||||
case DC_FIELD_DIVETIME:
|
case DC_FIELD_DIVETIME:
|
||||||
if (parser->model == GENIUS || parser->model == HORIZON) {
|
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) {
|
} else if (parser->model == SMARTAPNEA) {
|
||||||
*((unsigned int *) value) = array_uint16_le (p + 0x24);
|
*((unsigned int *) value) = array_uint16_le (p + 0x24);
|
||||||
} else if (parser->mode == ICONHD_FREEDIVE) {
|
} 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;
|
*((unsigned int *) value) = divetime;
|
||||||
} else {
|
} else {
|
||||||
*((unsigned int *) value) = parser->nsamples * parser->interval;
|
*((unsigned int *) value) = parser->nsamples * parser->interval - parser->surftime;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case DC_FIELD_MAXDEPTH:
|
case DC_FIELD_MAXDEPTH:
|
||||||
|
|||||||
@ -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 &&
|
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);
|
status = oceanic_atom2_ble_handshake(device);
|
||||||
if (status != DC_STATUS_SUCCESS) {
|
if (status != DC_STATUS_SUCCESS) {
|
||||||
goto error_free;
|
goto error_free;
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user