From 4616e2ed212f990ac89a8f8fb42b9eeca4cdbf3e Mon Sep 17 00:00:00 2001 From: Jef Driesen Date: Thu, 16 Jun 2022 22:28:55 +0200 Subject: [PATCH 1/8] Add support for a new Aqualung i200C variant There is a new variant of the i200C with a different model number (0x4749) and double the amount of memory (128K). --- src/descriptor.c | 2 ++ src/oceanic_atom2.c | 1 + src/oceanic_atom2_parser.c | 15 +++++++++------ 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/src/descriptor.c b/src/descriptor.c index 0416157..b0a3db6 100644 --- a/src/descriptor.c +++ b/src/descriptor.c @@ -269,6 +269,7 @@ static const dc_descriptor_t g_descriptors[] = { {"Sherwood", "Amphos 2.0", DC_FAMILY_OCEANIC_ATOM2, 0x4657, DC_TRANSPORT_SERIAL, NULL}, {"Sherwood", "Beacon", DC_FAMILY_OCEANIC_ATOM2, 0x4742, DC_TRANSPORT_SERIAL | DC_TRANSPORT_BLE, dc_filter_oceanic}, {"Aqualung", "i470TC", DC_FAMILY_OCEANIC_ATOM2, 0x4743, DC_TRANSPORT_SERIAL | DC_TRANSPORT_BLE, dc_filter_oceanic}, + {"Aqualung", "i200C", DC_FAMILY_OCEANIC_ATOM2, 0x4749, DC_TRANSPORT_SERIAL | DC_TRANSPORT_BLE, dc_filter_oceanic}, /* Mares Nemo */ {"Mares", "Nemo", DC_FAMILY_MARES_NEMO, 0, DC_TRANSPORT_SERIAL, NULL}, {"Mares", "Nemo Steel", DC_FAMILY_MARES_NEMO, 0, DC_TRANSPORT_SERIAL, NULL}, @@ -690,6 +691,7 @@ static int dc_filter_oceanic (dc_transport_t transport, const void *userdata, vo 0x4656, // Oceanic Pro Plus 4 0x4742, // Sherwood Beacon 0x4743, // Aqualung i470TC + 0x4749, // Aqualung i200C }; if (transport == DC_TRANSPORT_BLE) { diff --git a/src/oceanic_atom2.c b/src/oceanic_atom2.c index 30d86ff..5ad286d 100644 --- a/src/oceanic_atom2.c +++ b/src/oceanic_atom2.c @@ -477,6 +477,7 @@ static const oceanic_common_version_t versions[] = { {"AQUA550C \0\0 1024", 0, &oceanic_oc1_layout}, {"WISDOM04 \0\0 1024", 0, &oceanic_oc1_layout}, {"AQUA470C \0\0 1024", 0, &oceanic_oc1_layout}, + {"AQUA200C \0\0 1024", 0, &oceanic_oc1_layout}, {"OCEANOCI \0\0 1024", 0, &oceanic_oci_layout}, diff --git a/src/oceanic_atom2_parser.c b/src/oceanic_atom2_parser.c index 9037d6f..ec20356 100644 --- a/src/oceanic_atom2_parser.c +++ b/src/oceanic_atom2_parser.c @@ -100,6 +100,7 @@ #define AMPHOS2 0x4657 #define BEACON 0x4742 #define I470TC 0x4743 +#define I200CV2 0x4749 #define NORMAL 0 #define GAUGE 1 @@ -196,7 +197,8 @@ oceanic_atom2_parser_create (dc_parser_t **out, dc_context_t *context, unsigned parser->headersize = 5 * PAGESIZE; } else if (model == PROPLUSX) { parser->headersize = 3 * PAGESIZE; - } else if (model == I550C || model == WISDOM4) { + } else if (model == I550C || model == WISDOM4 || + model == I200CV2) { parser->headersize = 5 * PAGESIZE / 2; } @@ -277,6 +279,7 @@ oceanic_atom2_parser_get_datetime (dc_parser_t *abstract, dc_datetime_t *datetim case XPAIR: case WISDOM4: case I470TC: + case I200CV2: datetime->year = ((p[5] & 0xE0) >> 5) + ((p[7] & 0xE0) >> 2) + 2000; datetime->month = (p[3] & 0x0F); datetime->day = ((p[0] & 0x80) >> 3) + ((p[3] & 0xF0) >> 4); @@ -749,8 +752,8 @@ oceanic_atom2_parser_samples_foreach (dc_parser_t *abstract, dc_sample_callback_ parser->model == MANTA || parser->model == I300 || parser->model == I200 || parser->model == I100 || parser->model == I300C || parser->model == TALIS || - parser->model == I200C || parser->model == GEO40 || - parser->model == VEO40) { + parser->model == I200C || parser->model == I200CV2 || + parser->model == GEO40 || parser->model == VEO40) { have_pressure = 0; } @@ -911,7 +914,7 @@ oceanic_atom2_parser_samples_foreach (dc_parser_t *abstract, dc_sample_callback_ parser->model == I200 || parser->model == I100 || parser->model == I300C || parser->model == I200C || parser->model == GEO40 || parser->model == VEO40 || - parser->model == I470TC) { + parser->model == I470TC || parser->model == I200CV2) { temperature = data[offset + 3]; } else if (parser->model == OCS || parser->model == TX1) { temperature = data[offset + 1]; @@ -990,7 +993,7 @@ oceanic_atom2_parser_samples_foreach (dc_parser_t *abstract, dc_sample_callback_ parser->model == I200 || parser->model == I100 || parser->model == I300C || parser->model == I200C || parser->model == GEO40 || parser->model == VEO40 || - parser->model == I470TC) + parser->model == I470TC || parser->model == I200CV2) depth = (data[offset + 4] + (data[offset + 5] << 8)) & 0x0FFF; else if (parser->model == ATOM1) depth = data[offset + 3] * 16; @@ -1046,7 +1049,7 @@ oceanic_atom2_parser_samples_foreach (dc_parser_t *abstract, dc_sample_callback_ parser->model == I100 || parser->model == I300C || parser->model == I450T || parser->model == I200C || parser->model == GEO40 || parser->model == VEO40 || - parser->model == I470TC) { + parser->model == I470TC || parser->model == I200CV2) { decostop = (data[offset + 7] & 0xF0) >> 4; decotime = array_uint16_le(data + offset + 6) & 0x0FFF; have_deco = 1; From e6f091909bb98cdb6dfcadc065ab10e2ae6e5855 Mon Sep 17 00:00:00 2001 From: Jef Driesen Date: Mon, 20 Jun 2022 13:06:20 +0200 Subject: [PATCH 2/8] Remove unused time parameters Since the clock synchronization has been removed (see commit a1962558412b8c89a79656992c8e7f4d001065c2 for the details), those parameters serve no purpose anymore. --- src/parser.c | 2 +- src/uwatec_smart.h | 2 +- src/uwatec_smart_parser.c | 6 +----- 3 files changed, 3 insertions(+), 7 deletions(-) diff --git a/src/parser.c b/src/parser.c index 22833e2..0750eb1 100644 --- a/src/parser.c +++ b/src/parser.c @@ -103,7 +103,7 @@ dc_parser_new_internal (dc_parser_t **out, dc_context_t *context, dc_family_t fa rc = uwatec_memomouse_parser_create (&parser, context, devtime, systime); break; case DC_FAMILY_UWATEC_SMART: - rc = uwatec_smart_parser_create (&parser, context, model, devtime, systime); + rc = uwatec_smart_parser_create (&parser, context, model); break; case DC_FAMILY_REEFNET_SENSUS: rc = reefnet_sensus_parser_create (&parser, context, devtime, systime); diff --git a/src/uwatec_smart.h b/src/uwatec_smart.h index 2f7f2b9..49013c5 100644 --- a/src/uwatec_smart.h +++ b/src/uwatec_smart.h @@ -35,7 +35,7 @@ dc_status_t uwatec_smart_device_open (dc_device_t **device, dc_context_t *context, dc_iostream_t *iostream); dc_status_t -uwatec_smart_parser_create (dc_parser_t **parser, dc_context_t *context, unsigned int model, unsigned int devtime, dc_ticks_t systime); +uwatec_smart_parser_create (dc_parser_t **parser, dc_context_t *context, unsigned int model); #ifdef __cplusplus } diff --git a/src/uwatec_smart_parser.c b/src/uwatec_smart_parser.c index bb324e3..74e6317 100644 --- a/src/uwatec_smart_parser.c +++ b/src/uwatec_smart_parser.c @@ -139,8 +139,6 @@ typedef struct uwatec_smart_parser_t uwatec_smart_parser_t; struct uwatec_smart_parser_t { dc_parser_t base; unsigned int model; - unsigned int devtime; - dc_ticks_t systime; const uwatec_smart_sample_info_t *samples; const uwatec_smart_header_info_t *header; unsigned int headersize; @@ -570,7 +568,7 @@ uwatec_smart_parser_cache (uwatec_smart_parser_t *parser) dc_status_t -uwatec_smart_parser_create (dc_parser_t **out, dc_context_t *context, unsigned int model, unsigned int devtime, dc_ticks_t systime) +uwatec_smart_parser_create (dc_parser_t **out, dc_context_t *context, unsigned int model) { dc_status_t status = DC_STATUS_SUCCESS; uwatec_smart_parser_t *parser = NULL; @@ -587,8 +585,6 @@ uwatec_smart_parser_create (dc_parser_t **out, dc_context_t *context, unsigned i // Set the default values. parser->model = model; - parser->devtime = devtime; - parser->systime = systime; parser->trimix = 0; for (unsigned int i = 0; i < NEVENTS; ++i) { parser->events[i] = NULL; From be5bb9e690fb5288164caa532493c100b441929d Mon Sep 17 00:00:00 2001 From: Jef Driesen Date: Tue, 21 Jun 2022 21:07:42 +0200 Subject: [PATCH 3/8] Fix the clock synchronization For dives with a timestamp that is larger than the current device time (e.g. in the future), the clock synchronization produces incorrect values. In that case, the time difference suddenly becomes negative, which corresponds to a large positive value as an unsigned integer. Under normal circumstances, this scenario can't happen. But sometimes actions such as battery replacements or firmware upgrades can cause the internal clock to reset. The Reefnet devices shouldn't need this fix, because their internal clock can't be changed, but it doesn't hurt either. --- src/reefnet_sensus_parser.c | 7 ++++++- src/reefnet_sensuspro_parser.c | 7 ++++++- src/reefnet_sensusultra_parser.c | 7 ++++++- src/uwatec_memomouse_parser.c | 7 ++++++- 4 files changed, 24 insertions(+), 4 deletions(-) diff --git a/src/reefnet_sensus_parser.c b/src/reefnet_sensus_parser.c index 50fd69e..35fb952 100644 --- a/src/reefnet_sensus_parser.c +++ b/src/reefnet_sensus_parser.c @@ -133,7 +133,12 @@ reefnet_sensus_parser_get_datetime (dc_parser_t *abstract, dc_datetime_t *dateti unsigned int timestamp = array_uint32_le (abstract->data + 2); - dc_ticks_t ticks = parser->systime - (parser->devtime - timestamp); + dc_ticks_t ticks = parser->systime; + if (timestamp < parser->devtime) { + ticks -= parser->devtime - timestamp; + } else { + ticks += timestamp - parser->devtime; + } if (!dc_datetime_localtime (datetime, ticks)) return DC_STATUS_DATAFORMAT; diff --git a/src/reefnet_sensuspro_parser.c b/src/reefnet_sensuspro_parser.c index 7e68a72..c303ee9 100644 --- a/src/reefnet_sensuspro_parser.c +++ b/src/reefnet_sensuspro_parser.c @@ -132,7 +132,12 @@ reefnet_sensuspro_parser_get_datetime (dc_parser_t *abstract, dc_datetime_t *dat unsigned int timestamp = array_uint32_le (abstract->data + 6); - dc_ticks_t ticks = parser->systime - (parser->devtime - timestamp); + dc_ticks_t ticks = parser->systime; + if (timestamp < parser->devtime) { + ticks -= parser->devtime - timestamp; + } else { + ticks += timestamp - parser->devtime; + } if (!dc_datetime_localtime (datetime, ticks)) return DC_STATUS_DATAFORMAT; diff --git a/src/reefnet_sensusultra_parser.c b/src/reefnet_sensusultra_parser.c index 8aaacca..bad5450 100644 --- a/src/reefnet_sensusultra_parser.c +++ b/src/reefnet_sensusultra_parser.c @@ -132,7 +132,12 @@ reefnet_sensusultra_parser_get_datetime (dc_parser_t *abstract, dc_datetime_t *d unsigned int timestamp = array_uint32_le (abstract->data + 4); - dc_ticks_t ticks = parser->systime - (parser->devtime - timestamp); + dc_ticks_t ticks = parser->systime; + if (timestamp < parser->devtime) { + ticks -= parser->devtime - timestamp; + } else { + ticks += timestamp - parser->devtime; + } if (!dc_datetime_localtime (datetime, ticks)) return DC_STATUS_DATAFORMAT; diff --git a/src/uwatec_memomouse_parser.c b/src/uwatec_memomouse_parser.c index f36dc6c..386e984 100644 --- a/src/uwatec_memomouse_parser.c +++ b/src/uwatec_memomouse_parser.c @@ -96,7 +96,12 @@ uwatec_memomouse_parser_get_datetime (dc_parser_t *abstract, dc_datetime_t *date unsigned int timestamp = array_uint32_le (abstract->data + 11); - dc_ticks_t ticks = parser->systime - (parser->devtime - timestamp) / 2; + dc_ticks_t ticks = parser->systime; + if (timestamp < parser->devtime) { + ticks -= (parser->devtime - timestamp) / 2; + } else { + ticks += (timestamp - parser->devtime) / 2; + } if (!dc_datetime_localtime (datetime, ticks)) return DC_STATUS_DATAFORMAT; From 8451286c1740737c2f0d65b0c5dc4fb9393069bd Mon Sep 17 00:00:00 2001 From: Dirk Hohndel Date: Tue, 14 Jun 2022 13:40:17 -0700 Subject: [PATCH 4/8] Update the Shearwater hardware IDs Update and fix the hardware IDs based on the latest information from Shearwater. Signed-off-by: Dirk Hohndel --- src/shearwater_common.h | 1 + src/shearwater_petrel.c | 27 ++++++++++++++++++++++----- 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/src/shearwater_common.h b/src/shearwater_common.h index ab795d5..a728538 100644 --- a/src/shearwater_common.h +++ b/src/shearwater_common.h @@ -37,6 +37,7 @@ extern "C" { #define PREDATOR 2 #define PETREL 3 +#define PETREL2 PETREL #define NERD 4 #define PERDIX 5 #define PERDIXAI 6 diff --git a/src/shearwater_petrel.c b/src/shearwater_petrel.c index ecf3320..2fd48d8 100644 --- a/src/shearwater_petrel.c +++ b/src/shearwater_petrel.c @@ -212,15 +212,30 @@ shearwater_petrel_device_foreach (dc_device_t *abstract, dc_dive_callback_t call unsigned int hardware = array_uint_be (dc_buffer_get_data (buffer), dc_buffer_get_size (buffer)); unsigned int model = 0; switch (hardware) { - case 0x0808: // Petrel 2 - case 0x0909: // Petrel 1 - case 0x0B0B: // Petrel 1 (newer hardware) + case 0x0101: + case 0x0202: + model = PREDATOR; + break; + case 0x0404: + case 0x0909: model = PETREL; break; - case 0x0A0A: // Nerd 1 + case 0x0505: + case 0x0808: + case 0x0838: + case 0x08A5: + case 0x0B0B: + case 0x7828: + case 0x7B2C: + case 0x8838: + model = PETREL2; + break; + case 0x0606: + case 0x0A0A: model = NERD; break; - case 0x0E0D: // Nerd 2 + case 0x0E0D: + case 0x7E2D: model = NERD2; break; case 0x0707: @@ -231,6 +246,8 @@ shearwater_petrel_device_foreach (dc_device_t *abstract, dc_dive_callback_t call model = PERDIXAI; break; case 0x0F0F: + case 0x1F0A: + case 0x1F0F: model = TERIC; break; case 0x1512: From 26c43d6d8bf74612e0b68ffafd495b226ed265d0 Mon Sep 17 00:00:00 2001 From: Dirk Hohndel Date: Tue, 14 Jun 2022 13:40:17 -0700 Subject: [PATCH 5/8] Add Shearwater Perdix 2 and Petrel 3 Signed-off-by: Dirk Hohndel --- src/descriptor.c | 4 ++++ src/shearwater_common.h | 2 ++ src/shearwater_petrel.c | 6 ++++++ 3 files changed, 12 insertions(+) diff --git a/src/descriptor.c b/src/descriptor.c index b0a3db6..4ea801a 100644 --- a/src/descriptor.c +++ b/src/descriptor.c @@ -352,6 +352,8 @@ static const dc_descriptor_t g_descriptors[] = { {"Shearwater", "Nerd 2", DC_FAMILY_SHEARWATER_PETREL, 7, DC_TRANSPORT_BLE, dc_filter_shearwater}, {"Shearwater", "Teric", DC_FAMILY_SHEARWATER_PETREL, 8, DC_TRANSPORT_BLE, dc_filter_shearwater}, {"Shearwater", "Peregrine", DC_FAMILY_SHEARWATER_PETREL, 9, DC_TRANSPORT_BLE, dc_filter_shearwater}, + {"Shearwater", "Petrel 3", DC_FAMILY_SHEARWATER_PETREL, 10, DC_TRANSPORT_BLE, dc_filter_shearwater}, + {"Shearwater", "Perdix 2", DC_FAMILY_SHEARWATER_PETREL, 11, DC_TRANSPORT_BLE, dc_filter_shearwater}, /* Dive Rite NiTek Q */ {"Dive Rite", "NiTek Q", DC_FAMILY_DIVERITE_NITEKQ, 0, DC_TRANSPORT_SERIAL, NULL}, /* Citizen Hyper Aqualand */ @@ -616,9 +618,11 @@ static int dc_filter_shearwater (dc_transport_t transport, const void *userdata, static const char * const bluetooth[] = { "Predator", "Petrel", + "Petrel 3", "NERD", "NERD 2", "Perdix", + "Perdix 2", "Teric", "Peregrine", }; diff --git a/src/shearwater_common.h b/src/shearwater_common.h index a728538..b1f8c3b 100644 --- a/src/shearwater_common.h +++ b/src/shearwater_common.h @@ -44,6 +44,8 @@ extern "C" { #define NERD2 7 #define TERIC 8 #define PEREGRINE 9 +#define PETREL3 10 +#define PERDIX2 11 #define NSTEPS 10000 #define STEP(i,n) ((NSTEPS * (i) + (n) / 2) / (n)) diff --git a/src/shearwater_petrel.c b/src/shearwater_petrel.c index 2fd48d8..08fa140 100644 --- a/src/shearwater_petrel.c +++ b/src/shearwater_petrel.c @@ -230,6 +230,9 @@ shearwater_petrel_device_foreach (dc_device_t *abstract, dc_dive_callback_t call case 0x8838: model = PETREL2; break; + case 0xB407: + model = PETREL3; + break; case 0x0606: case 0x0A0A: model = NERD; @@ -245,6 +248,9 @@ shearwater_petrel_device_foreach (dc_device_t *abstract, dc_dive_callback_t call case 0x7C2D: model = PERDIXAI; break; + case 0xC407: + model = PERDIX2; + break; case 0x0F0F: case 0x1F0A: case 0x1F0F: From 80f22dce0b5c0899c8c7f6fb3309c43b46148744 Mon Sep 17 00:00:00 2001 From: Jef Driesen Date: Thu, 30 Jun 2022 23:56:07 +0200 Subject: [PATCH 6/8] Replace switch statements with an array lookup No functional change, just some more compact code. --- src/oceanic_atom2_parser.c | 43 +++++++++----------------------------- 1 file changed, 10 insertions(+), 33 deletions(-) diff --git a/src/oceanic_atom2_parser.c b/src/oceanic_atom2_parser.c index ec20356..a8febee 100644 --- a/src/oceanic_atom2_parser.c +++ b/src/oceanic_atom2_parser.c @@ -676,44 +676,21 @@ oceanic_atom2_parser_samples_foreach (dc_parser_t *abstract, dc_sample_callback_ unsigned int interval = 1; unsigned int samplerate = 1; if (parser->mode != FREEDIVE) { - unsigned int idx = 0x17; + unsigned int offset = 0x17; if (parser->model == A300CS || parser->model == VTX || parser->model == I450T || parser->model == I750TC || parser->model == PROPLUSX || parser->model == I770R || parser->model == SAGE || parser->model == BEACON) - idx = 0x1f; - switch (data[idx] & 0x03) { - case 0: - interval = 2; - break; - case 1: - interval = 15; - break; - case 2: - interval = 30; - break; - case 3: - interval = 60; - break; - } + offset = 0x1f; + const unsigned int intervals[] = {2, 15, 30, 60}; + unsigned int idx = data[offset] & 0x03; + interval = intervals[idx]; } else if (parser->model == F11A || parser->model == F11B) { - unsigned int idx = 0x29; - switch (data[idx] & 0x03) { - case 0: - interval = 1; - samplerate = 4; - break; - case 1: - interval = 1; - samplerate = 2; - break; - case 2: - interval = 1; - break; - case 3: - interval = 2; - break; - } + const unsigned int intervals[] = {1, 1, 1, 2}; + const unsigned int samplerates[] = {4, 2, 1, 1}; + unsigned int idx = data[0x29] & 0x03; + interval = intervals[idx]; + samplerate = samplerates[idx]; if (samplerate > 1) { // Some models supports multiple samples per second. // Since our smallest unit of time is one second, we can't From 972beb52be509b62d93511b356e014f432b17eb7 Mon Sep 17 00:00:00 2001 From: Jef Driesen Date: Wed, 13 Jul 2022 23:24:58 +0200 Subject: [PATCH 7/8] Add support for the Sherwood Amphos Air 2.0 The Amphos Air 2.0 appears to be identical to the previous Amphos Air, except for the new model number and version string. --- src/descriptor.c | 1 + src/oceanic_atom2.c | 1 + src/oceanic_atom2_parser.c | 6 ++++-- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/descriptor.c b/src/descriptor.c index 4ea801a..8f28981 100644 --- a/src/descriptor.c +++ b/src/descriptor.c @@ -267,6 +267,7 @@ static const dc_descriptor_t g_descriptors[] = { {"Sherwood", "Wisdom 4", DC_FAMILY_OCEANIC_ATOM2, 0x4655, DC_TRANSPORT_SERIAL | DC_TRANSPORT_BLE, dc_filter_oceanic}, {"Oceanic", "Pro Plus 4", DC_FAMILY_OCEANIC_ATOM2, 0x4656, DC_TRANSPORT_SERIAL | DC_TRANSPORT_BLE, dc_filter_oceanic}, {"Sherwood", "Amphos 2.0", DC_FAMILY_OCEANIC_ATOM2, 0x4657, DC_TRANSPORT_SERIAL, NULL}, + {"Sherwood", "Amphos Air 2.0", DC_FAMILY_OCEANIC_ATOM2, 0x4658, DC_TRANSPORT_SERIAL, NULL}, {"Sherwood", "Beacon", DC_FAMILY_OCEANIC_ATOM2, 0x4742, DC_TRANSPORT_SERIAL | DC_TRANSPORT_BLE, dc_filter_oceanic}, {"Aqualung", "i470TC", DC_FAMILY_OCEANIC_ATOM2, 0x4743, DC_TRANSPORT_SERIAL | DC_TRANSPORT_BLE, dc_filter_oceanic}, {"Aqualung", "i200C", DC_FAMILY_OCEANIC_ATOM2, 0x4749, DC_TRANSPORT_SERIAL | DC_TRANSPORT_BLE, dc_filter_oceanic}, diff --git a/src/oceanic_atom2.c b/src/oceanic_atom2.c index 5ad286d..88efbc3 100644 --- a/src/oceanic_atom2.c +++ b/src/oceanic_atom2.c @@ -460,6 +460,7 @@ static const oceanic_common_version_t versions[] = { {"VOYAGE2G \0\0 512K", 0, &tusa_zenair_layout}, {"TUSTALIS \0\0 512K", 0, &tusa_zenair_layout}, {"AMPHOS20 \0\0 512K", 0, &tusa_zenair_layout}, + {"AMPAIR20 \0\0 512K", 0, &tusa_zenair_layout}, {"REACPRO2 \0\0 512K", 0, &oceanic_reactpro_layout}, diff --git a/src/oceanic_atom2_parser.c b/src/oceanic_atom2_parser.c index a8febee..bd89f9c 100644 --- a/src/oceanic_atom2_parser.c +++ b/src/oceanic_atom2_parser.c @@ -98,6 +98,7 @@ #define WISDOM4 0x4655 #define PROPLUS4 0x4656 #define AMPHOS2 0x4657 +#define AMPHOSAIR2 0x4658 #define BEACON 0x4742 #define I470TC 0x4743 #define I200CV2 0x4749 @@ -317,6 +318,7 @@ oceanic_atom2_parser_get_datetime (dc_parser_t *abstract, dc_datetime_t *datetim case VOYAGER2G: case TALIS: case AMPHOS2: + case AMPHOSAIR2: datetime->year = (p[3] & 0x1F) + 2000; datetime->month = (p[7] & 0xF0) >> 4; datetime->day = ((p[3] & 0x80) >> 3) + ((p[5] & 0xF0) >> 4); @@ -913,7 +915,7 @@ oceanic_atom2_parser_samples_foreach (dc_parser_t *abstract, dc_sample_callback_ sign = (~data[offset + 5] & 0x04) >> 2; else if (parser->model == VOYAGER2G || parser->model == AMPHOS || parser->model == AMPHOSAIR || parser->model == ZENAIR || - parser->model == AMPHOS2) + parser->model == AMPHOS2 || parser->model == AMPHOSAIR2) sign = (data[offset + 5] & 0x04) >> 2; else if (parser->model == ATOM2 || parser->model == PROPLUS21 || parser->model == EPICA || parser->model == EPICB || @@ -944,7 +946,7 @@ oceanic_atom2_parser_samples_foreach (dc_parser_t *abstract, dc_sample_callback_ parser->model == AMPHOSAIR || parser->model == I550 || parser->model == VISION || parser->model == XPAIR || parser->model == I550C || parser->model == PROPLUS4 || - parser->model == WISDOM4) + parser->model == WISDOM4 || parser->model == AMPHOSAIR2) pressure = (((data[offset + 0] & 0x03) << 8) + data[offset + 1]) * 5; else if (parser->model == TX1 || parser->model == A300CS || parser->model == VTX || parser->model == I750TC || From 391d4db419b9f7309616b07c66c24d86a1bf4bc9 Mon Sep 17 00:00:00 2001 From: Jef Driesen Date: Fri, 15 Jul 2022 21:28:33 +0200 Subject: [PATCH 8/8] Add support for the Ratio iX3M 2 models The protocol and data structures have not changed, so just adding the new names and model numbers. --- src/descriptor.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/descriptor.c b/src/descriptor.c index 8f28981..9e1e7eb 100644 --- a/src/descriptor.c +++ b/src/descriptor.c @@ -408,6 +408,11 @@ static const dc_descriptor_t g_descriptors[] = { {"Ratio", "iX3M 2021 Pro Deep", DC_FAMILY_DIVESYSTEM_IDIVE, 0x73, DC_TRANSPORT_SERIAL, NULL}, {"Ratio", "iX3M 2021 Pro Tech+", DC_FAMILY_DIVESYSTEM_IDIVE, 0x74, DC_TRANSPORT_SERIAL, NULL}, {"Ratio", "iX3M 2021 Pro Reb", DC_FAMILY_DIVESYSTEM_IDIVE, 0x75, DC_TRANSPORT_SERIAL, NULL}, + {"Ratio", "iX3M 2 Gauge", DC_FAMILY_DIVESYSTEM_IDIVE, 0x100, DC_TRANSPORT_SERIAL | DC_TRANSPORT_BLE, dc_filter_divesystem}, + {"Ratio", "iX3M 2 Easy", DC_FAMILY_DIVESYSTEM_IDIVE, 0x101, DC_TRANSPORT_SERIAL | DC_TRANSPORT_BLE, dc_filter_divesystem}, + {"Ratio", "iX3M 2 Pro", DC_FAMILY_DIVESYSTEM_IDIVE, 0x102, DC_TRANSPORT_SERIAL | DC_TRANSPORT_BLE, dc_filter_divesystem}, + {"Ratio", "iX3M 2 Deep", DC_FAMILY_DIVESYSTEM_IDIVE, 0x103, DC_TRANSPORT_SERIAL | DC_TRANSPORT_BLE, dc_filter_divesystem}, + {"Ratio", "iX3M 2 Tech+", DC_FAMILY_DIVESYSTEM_IDIVE, 0x104, DC_TRANSPORT_SERIAL | DC_TRANSPORT_BLE, dc_filter_divesystem}, {"Seac", "Jack", DC_FAMILY_DIVESYSTEM_IDIVE, 0x1000, DC_TRANSPORT_SERIAL, NULL}, {"Seac", "Guru", DC_FAMILY_DIVESYSTEM_IDIVE, 0x1002, DC_TRANSPORT_SERIAL, NULL}, /* Cochran Commander */