diff --git a/src/atomics_cobalt.c b/src/atomics_cobalt.c index 44d2d79..c4f4c08 100644 --- a/src/atomics_cobalt.c +++ b/src/atomics_cobalt.c @@ -27,6 +27,9 @@ #include // malloc, free #ifdef HAVE_LIBUSB +#ifdef _WIN32 +#define NOGDI +#endif #include #endif diff --git a/src/context.c b/src/context.c index 0163a3c..344e4ee 100644 --- a/src/context.c +++ b/src/context.c @@ -25,6 +25,7 @@ #include #ifdef _WIN32 +#define NOGDI #include #endif diff --git a/src/descriptor.c b/src/descriptor.c index ee29372..7f52515 100644 --- a/src/descriptor.c +++ b/src/descriptor.c @@ -101,6 +101,7 @@ static const dc_descriptor_t g_descriptors[] = { {"Oceanic", "Veo 250", DC_FAMILY_OCEANIC_VEO250, 0x424C}, {"Oceanic", "Veo 180", DC_FAMILY_OCEANIC_VEO250, 0x4252}, {"Aeris", "XR-2", DC_FAMILY_OCEANIC_VEO250, 0x4255}, + {"Sherwood", "Insight", DC_FAMILY_OCEANIC_VEO250, 0x425A}, /* Oceanic Atom 2.0 */ {"Oceanic", "Atom 1.0", DC_FAMILY_OCEANIC_ATOM2, 0x4250}, {"Aeris", "Epic", DC_FAMILY_OCEANIC_ATOM2, 0x4257}, @@ -114,7 +115,7 @@ static const dc_descriptor_t g_descriptors[] = { {"Aeris", "F10", DC_FAMILY_OCEANIC_ATOM2, 0x434D}, {"Oceanic", "OC1", DC_FAMILY_OCEANIC_ATOM2, 0x434E}, {"Sherwood", "Wisdom 2", DC_FAMILY_OCEANIC_ATOM2, 0x4350}, - {"Sherwood", "Insight", DC_FAMILY_OCEANIC_ATOM2, 0x4353}, + {"Sherwood", "Insight 2", DC_FAMILY_OCEANIC_ATOM2, 0x4353}, {"Tusa", "Element II (IQ-750)", DC_FAMILY_OCEANIC_ATOM2, 0x4357}, {"Oceanic", "Veo 1.0", DC_FAMILY_OCEANIC_ATOM2, 0x4358}, {"Oceanic", "Veo 2.0", DC_FAMILY_OCEANIC_ATOM2, 0x4359}, @@ -130,8 +131,10 @@ static const dc_descriptor_t g_descriptors[] = { {"Hollis", "DG03", DC_FAMILY_OCEANIC_ATOM2, 0x444D}, {"Oceanic", "OCS", DC_FAMILY_OCEANIC_ATOM2, 0x4450}, {"Oceanic", "VT 4.1", DC_FAMILY_OCEANIC_ATOM2, 0x4452}, + {"Aeris", "Epic", DC_FAMILY_OCEANIC_ATOM2, 0x4453}, {"Oceanic", "Atom 3.1", DC_FAMILY_OCEANIC_ATOM2, 0x4456}, - {"Sherwood", "Wisdom 3", DC_FAMILY_OCEANIC_ATOM2, 0x4358}, + {"Aeris", "A300 AI", DC_FAMILY_OCEANIC_ATOM2, 0x4457}, + {"Sherwood", "Wisdom 3", DC_FAMILY_OCEANIC_ATOM2, 0x4458}, /* Mares Nemo */ {"Mares", "Nemo", DC_FAMILY_MARES_NEMO, 0}, {"Mares", "Nemo Excel", DC_FAMILY_MARES_NEMO, 17}, diff --git a/src/hw_ostc_parser.c b/src/hw_ostc_parser.c index 361a7c3..b86d7b2 100644 --- a/src/hw_ostc_parser.c +++ b/src/hw_ostc_parser.c @@ -22,6 +22,7 @@ #include #include +#include "libdivecomputer/units.h" #include "context-private.h" #include "parser-private.h" @@ -291,6 +292,12 @@ hw_ostc_parser_samples_foreach (dc_parser_t *abstract, dc_sample_callback_t call // Get the sample rate. unsigned int samplerate = data[36]; + // Get the salinity factor. + unsigned int salinity = data[43]; + if (salinity < 100 || salinity > 104) + salinity = 100; + double hydrostatic = GRAVITY * salinity * 10.0; + // Get the extended sample configuration. hw_ostc_sample_info_t info[NINFO]; for (unsigned int i = 0; i < NINFO; ++i) { @@ -329,7 +336,7 @@ hw_ostc_parser_samples_foreach (dc_parser_t *abstract, dc_sample_callback_t call // Depth (mbar). unsigned int depth = array_uint16_le (data + offset); - sample.depth = depth / 100.0; + sample.depth = (depth * BAR / 1000.0) / hydrostatic; if (callback) callback (DC_SAMPLE_DEPTH, sample, userdata); offset += 2; diff --git a/src/irda.c b/src/irda.c index 476fa7e..4556256 100644 --- a/src/irda.c +++ b/src/irda.c @@ -22,6 +22,7 @@ #include // malloc, free #include // snprintf #ifdef _WIN32 + #define NOGDI #include #include #include diff --git a/src/oceanic_atom2.c b/src/oceanic_atom2.c index 3c039dd..01bd661 100644 --- a/src/oceanic_atom2.c +++ b/src/oceanic_atom2.c @@ -64,8 +64,10 @@ static const device_backend_t oceanic_atom2_device_backend = { static const unsigned char aeris_manta_version[] = "MANTA R\0\0 512K"; static const unsigned char aeris_atmosai_version[] = "ATMOSAI R\0\0 512K"; -static const unsigned char aeris_epic_version[] = "2M EPIC r\0\0 512K"; +static const unsigned char aeris_epica_version[] = "2M EPIC r\0\0 512K"; +static const unsigned char aeris_epicb_version[] = "EPIC1 R\0\0 512K"; static const unsigned char aeris_f10_version[] = "FREEWAER \0\0 512K"; +static const unsigned char aeris_a300ai_version[] = "AERISAIR \0\0 1024"; static const unsigned char oceanic_proplus2_version[] = "PROPLUS2 \0\0 512K"; static const unsigned char oceanic_atom1_version[] = "ATOM rev\0\0 256K"; static const unsigned char oceanic_atom2_version[] = "2M ATOM r\0\0 512K"; @@ -375,7 +377,8 @@ oceanic_atom2_device_open (dc_device_t **out, dc_context_t *context, const char oceanic_common_match (oceanic_atom3_version, device->version, sizeof (device->version)) || oceanic_common_match (oceanic_atom31_version, device->version, sizeof (device->version)) || oceanic_common_match (oceanic_vt4_version, device->version, sizeof (device->version)) || - oceanic_common_match (oceanic_vt41_version, device->version, sizeof (device->version))) + oceanic_common_match (oceanic_vt41_version, device->version, sizeof (device->version)) || + oceanic_common_match (aeris_a300ai_version, device->version, sizeof (device->version))) device->base.layout = &oceanic_oc1_layout; else if (oceanic_common_match (aeris_f10_version, device->version, sizeof (device->version))) device->base.layout = &aeris_f10_layout; @@ -397,7 +400,8 @@ oceanic_atom2_device_open (dc_device_t **out, dc_context_t *context, const char oceanic_common_match (tusa_element2_version, device->version, sizeof (device->version)) || oceanic_common_match (tusa_zen_version, device->version, sizeof (device->version))) device->base.layout = &oceanic_atom2b_layout; - else if (oceanic_common_match (aeris_epic_version, device->version, sizeof (device->version)) || + else if (oceanic_common_match (aeris_epica_version, device->version, sizeof (device->version)) || + oceanic_common_match (aeris_epicb_version, device->version, sizeof (device->version)) || oceanic_common_match (oceanic_atom2_version, device->version, sizeof (device->version))) device->base.layout = &oceanic_atom2c_layout; else if (oceanic_common_match (oceanic_veo1_version, device->version, sizeof (device->version))) diff --git a/src/oceanic_atom2_parser.c b/src/oceanic_atom2_parser.c index c0576ca..78dc981 100644 --- a/src/oceanic_atom2_parser.c +++ b/src/oceanic_atom2_parser.c @@ -30,7 +30,7 @@ #include "array.h" #define ATOM1 0x4250 -#define EPIC 0x4257 +#define EPICA 0x4257 #define VT3 0x4258 #define T3 0x4259 #define ATOM2 0x4342 @@ -47,9 +47,12 @@ #define VT4 0x4447 #define OC1B 0x4449 #define ATOM3 0x444C +#define DG03 0x444D #define OCS 0x4450 #define VT41 0x4452 +#define EPICB 0x4453 #define ATOM31 0x4456 +#define A300AI 0x4457 typedef struct oceanic_atom2_parser_t oceanic_atom2_parser_t; @@ -172,6 +175,7 @@ oceanic_atom2_parser_get_datetime (dc_parser_t *abstract, dc_datetime_t *datetim case VT41: case ATOM3: case ATOM31: + case A300AI: 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); @@ -182,6 +186,7 @@ oceanic_atom2_parser_get_datetime (dc_parser_t *abstract, dc_datetime_t *datetim case VEO20: case VEO30: case GEO20: + case DG03: datetime->year = ((p[3] & 0xE0) >> 1) + (p[4] & 0x0F) + 2000; datetime->month = (p[4] & 0xF0) >> 4; datetime->day = p[3] & 0x1F; @@ -480,7 +485,7 @@ oceanic_atom2_parser_samples_foreach (dc_parser_t *abstract, dc_sample_callback_ } else { // Tank pressure (2 psi) and number (one based index) tank = (data[offset + 1] & 0x03) - 1; - if (parser->model == ATOM2 || parser->model == EPIC) + if (parser->model == ATOM2 || parser->model == EPICA || parser->model == EPICB) pressure = (((data[offset + 3] << 8) + data[offset + 4]) & 0x0FFF) * 2; else pressure = (((data[offset + 4] << 8) + data[offset + 5]) & 0x0FFF) * 2; @@ -514,11 +519,14 @@ oceanic_atom2_parser_samples_foreach (dc_parser_t *abstract, dc_sample_callback_ temperature = data[offset + 3]; } else if (parser->model == OCS) { temperature = data[offset + 1]; - } else if (parser->model == VT4 || parser->model == VT41 || parser->model == ATOM3 || parser->model == ATOM31) { + } else if (parser->model == VT4 || parser->model == VT41 || parser->model == ATOM3 || parser->model == ATOM31 || parser->model == A300AI) { temperature = ((data[offset + 7] & 0xF0) >> 4) | ((data[offset + 7] & 0x0C) << 2) | ((data[offset + 5] & 0x0C) << 4); } else { unsigned int sign; - if (parser->model == ATOM2 || parser->model == EPIC || parser->model == PROPLUS21) + if (parser->model == DG03) + sign = (~data[offset + 5] & 0x04) >> 2; + else if (parser->model == ATOM2 || parser->model == PROPLUS21 || + parser->model == EPICA || parser->model == EPICB) sign = (data[offset + 0] & 0x80) >> 7; else sign = (~data[offset + 0] & 0x80) >> 7; @@ -535,7 +543,7 @@ oceanic_atom2_parser_samples_foreach (dc_parser_t *abstract, dc_sample_callback_ if (have_pressure) { if (parser->model == OC1A || parser->model == OC1B) pressure = (data[offset + 10] + (data[offset + 11] << 8)) & 0x0FFF; - else if (parser->model == ZENAIR || parser->model == VT4 || parser->model == VT41|| parser->model == ATOM3 || parser->model == ATOM31) + else if (parser->model == ZENAIR || parser->model == VT4 || parser->model == VT41|| parser->model == ATOM3 || parser->model == ATOM31 || parser->model == A300AI) pressure = (((data[offset + 0] & 0x03) << 8) + data[offset + 1]) * 5; else pressure -= data[offset + 1]; diff --git a/src/serial_win32.c b/src/serial_win32.c index 4879c2d..fa4d00a 100644 --- a/src/serial_win32.c +++ b/src/serial_win32.c @@ -20,6 +20,8 @@ */ #include + +#define NOGDI #include #include "serial.h"