Merge branch 'master' into Subsurface-branch

This commit is contained in:
Dirk Hohndel 2015-12-07 09:48:39 -08:00
commit 8bb373e514
14 changed files with 61 additions and 56 deletions

View File

@ -444,7 +444,7 @@ cressi_edy_device_foreach (dc_device_t *abstract, dc_dive_callback_t callback, v
last < layout->rb_logbook_begin || last >= layout->rb_logbook_end) {
if (last == 0xFF)
return DC_STATUS_SUCCESS;
ERROR (abstract->context, "Invalid ringbuffer pointer detected.");
ERROR (abstract->context, "Invalid ringbuffer pointer detected (0x%02x 0x%02x).", first, last);
return DC_STATUS_DATAFORMAT;
}
@ -454,7 +454,7 @@ cressi_edy_device_foreach (dc_device_t *abstract, dc_dive_callback_t callback, v
// Get the profile pointer.
unsigned int eop = array_uint_le (logbook + layout->config + 2, layout->rb_logbook_size) * SZ_PAGE + layout->rb_profile_begin;
if (eop < layout->rb_profile_begin || eop >= layout->rb_profile_end) {
ERROR (abstract->context, "Invalid ringbuffer pointer detected.");
ERROR (abstract->context, "Invalid ringbuffer pointer detected (0x%04x).", eop);
return DC_STATUS_DATAFORMAT;
}
@ -469,7 +469,7 @@ cressi_edy_device_foreach (dc_device_t *abstract, dc_dive_callback_t callback, v
// Get the pointer to the profile data.
unsigned int current = array_uint_le (logbook + idx * layout->rb_logbook_size, layout->rb_logbook_size) * SZ_PAGE + layout->rb_profile_begin;
if (current < layout->rb_profile_begin || current >= layout->rb_profile_end) {
ERROR (abstract->context, "Invalid ringbuffer pointer detected.");
ERROR (abstract->context, "Invalid ringbuffer pointer detected (0x%04x).", current);
return DC_STATUS_DATAFORMAT;
}
@ -532,7 +532,7 @@ cressi_edy_device_foreach (dc_device_t *abstract, dc_dive_callback_t callback, v
// Get the pointer to the profile data.
unsigned int current = array_uint_le (logbook + idx * layout->rb_logbook_size, layout->rb_logbook_size) * SZ_PAGE + layout->rb_profile_begin;
if (current < layout->rb_profile_begin || current >= layout->rb_profile_end) {
ERROR (abstract->context, "Invalid ringbuffer pointer detected.");
ERROR (abstract->context, "Invalid ringbuffer pointer detected (0x%04x).", current);
free(buffer);
return DC_STATUS_DATAFORMAT;
}

View File

@ -343,7 +343,7 @@ cressi_leonardo_extract_dives (dc_device_t *abstract, const unsigned char data[]
if (header < RB_PROFILE_BEGIN || header + 2 > RB_PROFILE_END ||
footer < RB_PROFILE_BEGIN || footer + 2 > RB_PROFILE_END)
{
ERROR (context, "Invalid ringbuffer pointer detected.");
ERROR (context, "Invalid ringbuffer pointer detected (0x%04x 0x%04x).", header, footer);
free (buffer);
return DC_STATUS_DATAFORMAT;
}
@ -352,7 +352,7 @@ cressi_leonardo_extract_dives (dc_device_t *abstract, const unsigned char data[]
unsigned int header2 = array_uint16_le (data + footer);
unsigned int footer2 = array_uint16_le (data + header);
if (header2 != header || footer2 != footer) {
ERROR (context, "Invalid ringbuffer pointer detected.");
ERROR (context, "Invalid ringbuffer pointer detected (0x%04x 0x%04x).", header2, footer2);
free (buffer);
return DC_STATUS_DATAFORMAT;
}

View File

@ -381,7 +381,7 @@ diverite_nitekq_extract_dives (dc_device_t *abstract, const unsigned char data[]
// Get the end of profile pointer.
unsigned int eop = array_uint16_be(data + EOP);
if (eop < RB_PROFILE_BEGIN || eop >= RB_PROFILE_END) {
ERROR (context, "Invalid ringbuffer pointer detected.");
ERROR (context, "Invalid ringbuffer pointer detected (0x%04x).", eop);
free (buffer);
return DC_STATUS_DATAFORMAT;
}
@ -402,7 +402,7 @@ diverite_nitekq_extract_dives (dc_device_t *abstract, const unsigned char data[]
// Get the address of the profile data.
unsigned int address = array_uint16_be(data + ADDRESS + i * 2);
if (address < RB_PROFILE_BEGIN || address >= RB_PROFILE_END) {
ERROR (context, "Invalid ringbuffer pointer detected.");
ERROR (context, "Invalid ringbuffer pointer detected (0x%04x).", address);
free (buffer);
return DC_STATUS_DATAFORMAT;
}

View File

@ -409,7 +409,7 @@ hw_frog_device_foreach (dc_device_t *abstract, dc_dive_callback_t callback, void
end < RB_PROFILE_BEGIN ||
end >= RB_PROFILE_END)
{
ERROR (abstract->context, "Invalid ringbuffer pointer detected.");
ERROR (abstract->context, "Invalid ringbuffer pointer detected (0x%06x 0x%06x).", begin, end);
free (header);
return DC_STATUS_DATAFORMAT;
}

View File

@ -275,11 +275,15 @@ hw_ostc_parser_cache (hw_ostc_parser_t *parser)
gasmix[i].helium = data[19 + 2 * i + 1];
}
}
if (initial < 1 || initial > ngasmixes) {
ERROR(abstract->context, "Invalid initial gas mix.");
return DC_STATUS_DATAFORMAT;
if (initial != 0xFF) {
if (initial < 1 || initial > ngasmixes) {
ERROR(abstract->context, "Invalid initial gas mix.");
return DC_STATUS_DATAFORMAT;
}
initial--; /* Convert to a zero based index. */
} else {
WARNING(abstract->context, "No initial gas mix available.");
}
initial--; /* Convert to a zero based index. */
// Cache the data for later use.
parser->version = version;
@ -703,7 +707,7 @@ hw_ostc_parser_samples_foreach (dc_parser_t *abstract, dc_sample_callback_t call
if (callback) callback (DC_SAMPLE_TIME, sample, userdata);
// Initial gas mix.
if (time == samplerate) {
if (time == samplerate && parser->initial != 0xFF) {
unsigned int idx = parser->initial;
unsigned int o2 = parser->gasmix[idx].oxygen;
unsigned int he = parser->gasmix[idx].helium;

View File

@ -224,7 +224,7 @@ mares_common_extract_dives (dc_context_t *context, const mares_common_layout_t *
// Get the end of the profile ring buffer.
unsigned int eop = array_uint16_le (data + 0x6B);
if (eop < layout->rb_profile_begin || eop >= layout->rb_profile_end) {
ERROR (context, "Ringbuffer pointer out of range.");
ERROR (context, "Ringbuffer pointer out of range (0x%04x).", eop);
return DC_STATUS_DATAFORMAT;
}
@ -311,7 +311,7 @@ mares_common_extract_dives (dc_context_t *context, const mares_common_layout_t *
// something is wrong and an error is returned.
unsigned int length = array_uint16_le (buffer + offset);
if (length != nbytes) {
ERROR (context, "Calculated and stored size are not equal.");
ERROR (context, "Calculated and stored size are not equal (%u %u).", length, nbytes);
free (buffer);
return DC_STATUS_DATAFORMAT;
}
@ -339,7 +339,7 @@ mares_common_extract_dives (dc_context_t *context, const mares_common_layout_t *
// equals the number of freedives in the profile data. If
// both values are different, the profile data is incomplete.
if (count != nsamples) {
ERROR (context, "Unexpected number of freedive sessions.");
ERROR (context, "Unexpected number of freedive sessions (%u %u).", count, nsamples);
free (buffer);
return DC_STATUS_DATAFORMAT;
}

View File

@ -267,14 +267,14 @@ mares_darwin_extract_dives (dc_device_t *abstract, const unsigned char data[], u
// Get the profile pointer.
unsigned int eop = array_uint16_be (data + 0x8A);
if (eop < layout->rb_profile_begin || eop >= layout->rb_profile_end) {
ERROR (abstract->context, "Invalid ringbuffer pointer detected.");
ERROR (abstract->context, "Invalid ringbuffer pointer detected (0x%04x).", eop);
return DC_STATUS_DATAFORMAT;
}
// Get the logbook index.
unsigned int last = data[0x8C];
if (last >= layout->rb_logbook_count) {
ERROR (abstract->context, "Invalid ringbuffer pointer detected.");
ERROR (abstract->context, "Invalid ringbuffer pointer detected (0x%02x).", last);
return DC_STATUS_DATAFORMAT;
}

View File

@ -478,7 +478,7 @@ mares_iconhd_extract_dives (dc_device_t *abstract, const unsigned char data[], u
break;
}
if (eop < layout->rb_profile_begin || eop >= layout->rb_profile_end) {
ERROR (context, "Ringbuffer pointer out of range.");
ERROR (context, "Ringbuffer pointer out of range (0x%08x).", eop);
return DC_STATUS_DATAFORMAT;
}

View File

@ -222,9 +222,9 @@ static const oceanic_common_layout_t oceanic_atom1_layout = {
0x0000, /* cf_devinfo */
0x0040, /* cf_pointers */
0x0240, /* rb_logbook_begin */
0x0A40, /* rb_logbook_end */
0x0440, /* rb_logbook_end */
8, /* rb_logbook_entry_size */
0x0A40, /* rb_profile_begin */
0x0440, /* rb_profile_begin */
0x8000, /* rb_profile_end */
0, /* pt_mode_global */
0 /* pt_mode_logbook */

View File

@ -261,7 +261,7 @@ oceanic_common_device_foreach (dc_device_t *abstract, dc_dive_callback_t callbac
rb_logbook_last < layout->rb_logbook_begin ||
rb_logbook_last >= layout->rb_logbook_end)
{
ERROR (abstract->context, "Invalid logbook pointer detected.");
ERROR (abstract->context, "Invalid logbook pointer detected (0x%04x 0x%04x).", rb_logbook_first, rb_logbook_last);
return DC_STATUS_DATAFORMAT;
}
@ -436,7 +436,7 @@ oceanic_common_device_foreach (dc_device_t *abstract, dc_dive_callback_t callbac
rb_entry_last < layout->rb_profile_begin ||
rb_entry_last >= layout->rb_profile_end)
{
ERROR (abstract->context, "Invalid ringbuffer pointer detected.");
ERROR (abstract->context, "Invalid ringbuffer pointer detected (0x%06x 0x%06x).", rb_entry_first, rb_entry_last);
status = DC_STATUS_DATAFORMAT;
begin = current + layout->rb_logbook_entry_size;
abort = 1;

View File

@ -36,7 +36,7 @@
#define ESC_END 0xDC
#define ESC_ESC 0xDD
#define EXITCODE(n) ((n) < 0 ? (n) : 0)
#define EXITCODE(n) ((n) < 0 ? DC_STATUS_IO : DC_STATUS_TIMEOUT)
dc_status_t
shearwater_common_open (shearwater_common_device_t *device, dc_context_t *context, const char *name)
@ -173,7 +173,7 @@ shearwater_common_decompress_xor (unsigned char *data, unsigned int size)
}
static int
static dc_status_t
shearwater_common_slip_write (shearwater_common_device_t *device, const unsigned char data[], unsigned int size)
{
int n = 0;
@ -238,12 +238,12 @@ shearwater_common_slip_write (shearwater_common_device_t *device, const unsigned
return EXITCODE(n);
}
return size;
return DC_STATUS_SUCCESS;
}
static int
shearwater_common_slip_read (shearwater_common_device_t *device, unsigned char data[], unsigned int size)
static dc_status_t
shearwater_common_slip_read (shearwater_common_device_t *device, unsigned char data[], unsigned int size, unsigned int *actual)
{
unsigned int received = 0;
@ -269,7 +269,7 @@ shearwater_common_slip_read (shearwater_common_device_t *device, unsigned char d
// packets generated by the duplicate END characters which
// are sent to try to detect line noise.
if (received)
return received;
goto done;
else
break;
case ESC:
@ -299,16 +299,25 @@ shearwater_common_slip_read (shearwater_common_device_t *device, unsigned char d
}
}
return received;
done:
if (received > size)
return DC_STATUS_PROTOCOL;
if (actual)
*actual = received;
return DC_STATUS_SUCCESS;
}
dc_status_t
shearwater_common_transfer (shearwater_common_device_t *device, const unsigned char input[], unsigned int isize, unsigned char output[], unsigned int osize, unsigned int *actual)
{
dc_status_t status = DC_STATUS_SUCCESS;
dc_device_t *abstract = (dc_device_t *) device;
unsigned char packet[SZ_PACKET + 4];
int n = 0;
unsigned int n = 0;
if (isize > SZ_PACKET || osize > SZ_PACKET)
return DC_STATUS_INVALIDARGS;
@ -324,13 +333,10 @@ shearwater_common_transfer (shearwater_common_device_t *device, const unsigned c
memcpy (packet + 4, input, isize);
// Send the request packet.
n = shearwater_common_slip_write (device, packet, isize + 4);
if (n != isize + 4) {
status = shearwater_common_slip_write (device, packet, isize + 4);
if (status != DC_STATUS_SUCCESS) {
ERROR (abstract->context, "Failed to send the request packet.");
if (n < 0)
return DC_STATUS_IO;
else
return DC_STATUS_TIMEOUT;
return status;
}
// Return early if no response packet is requested.
@ -341,15 +347,10 @@ shearwater_common_transfer (shearwater_common_device_t *device, const unsigned c
}
// Receive the response packet.
n = shearwater_common_slip_read (device, packet, sizeof (packet));
if (n <= 0 || n > sizeof (packet)) {
status = shearwater_common_slip_read (device, packet, sizeof (packet), &n);
if (status != DC_STATUS_SUCCESS) {
ERROR (abstract->context, "Failed to receive the response packet.");
if (n < 0)
return DC_STATUS_IO;
else if (n > sizeof (packet))
return DC_STATUS_PROTOCOL;
else
return DC_STATUS_TIMEOUT;
return status;
}
// Validate the packet header.

View File

@ -293,7 +293,7 @@ suunto_common2_device_foreach (dc_device_t *abstract, dc_dive_callback_t callbac
begin < layout->rb_profile_begin ||
begin >= layout->rb_profile_end)
{
ERROR (abstract->context, "Invalid ringbuffer pointer detected.");
ERROR (abstract->context, "Invalid ringbuffer pointer detected (0x%04x 0x%04x 0x%04x %u).", begin, last, end, count);
return DC_STATUS_DATAFORMAT;
}
@ -335,7 +335,7 @@ suunto_common2_device_foreach (dc_device_t *abstract, dc_dive_callback_t callbac
unsigned int size = RB_PROFILE_DISTANCE (layout, current, previous, 1);
if (size < 4 || size > remaining) {
ERROR (abstract->context, "Unexpected profile size.");
ERROR (abstract->context, "Unexpected profile size (%u %u).", size, remaining);
free (data);
return DC_STATUS_DATAFORMAT;
}
@ -400,12 +400,12 @@ suunto_common2_device_foreach (dc_device_t *abstract, dc_dive_callback_t callbac
next < layout->rb_profile_begin ||
next >= layout->rb_profile_end)
{
ERROR (abstract->context, "Invalid ringbuffer pointer detected.");
ERROR (abstract->context, "Invalid ringbuffer pointer detected (0x%04x 0x%04x).", prev, next);
free (data);
return DC_STATUS_DATAFORMAT;
}
if (next != previous && next != current) {
ERROR (abstract->context, "Profiles are not continuous.");
ERROR (abstract->context, "Profiles are not continuous (0x%04x 0x%04x 0x%04x).", current, next, previous);
free (data);
return DC_STATUS_DATAFORMAT;
}
@ -422,7 +422,7 @@ suunto_common2_device_foreach (dc_device_t *abstract, dc_dive_callback_t callbac
return DC_STATUS_SUCCESS;
}
} else {
ERROR (abstract->context, "Skipping incomplete dive.");
ERROR (abstract->context, "Skipping incomplete dive (0x%04x 0x%04x 0x%04x).", current, next, previous);
status = DC_STATUS_DATAFORMAT;
}

View File

@ -721,7 +721,7 @@ uwatec_smart_parser_get_field (dc_parser_t *abstract, dc_field_type_t type, unsi
*((unsigned int *) value) = array_uint16_le (data + table->divetime) * 60;
break;
case DC_FIELD_MAXDEPTH:
*((double *) value) = array_uint16_le (data + table->maxdepth) / 100.0 * salinity;
*((double *) value) = array_uint16_le (data + table->maxdepth) / 100.0 / salinity;
break;
case DC_FIELD_GASMIX_COUNT:
*((unsigned int *) value) = parser->ngasmixes;
@ -1164,7 +1164,7 @@ uwatec_smart_parser_samples_foreach (dc_parser_t *abstract, dc_sample_callback_t
}
if (have_depth) {
sample.depth = (depth - depth_calibration) * salinity;
sample.depth = (depth - depth_calibration) / salinity;
if (callback) callback (DC_SAMPLE_DEPTH, sample, userdata);
}

View File

@ -302,7 +302,7 @@ zeagle_n2ition3_device_foreach (dc_device_t *abstract, dc_dive_callback_t callba
last < RB_LOGBOOK_BEGIN || last >= RB_LOGBOOK_END) {
if (last == 0xFF)
return DC_STATUS_SUCCESS;
ERROR (abstract->context, "Invalid ringbuffer pointer detected.");
ERROR (abstract->context, "Invalid ringbuffer pointer detected (0x%02x 0x%02x).", first, last);
return DC_STATUS_DATAFORMAT;
}
@ -312,7 +312,7 @@ zeagle_n2ition3_device_foreach (dc_device_t *abstract, dc_dive_callback_t callba
// Get the profile pointer.
unsigned int eop = array_uint16_le (config + 0x7E);
if (eop < RB_PROFILE_BEGIN || eop >= RB_PROFILE_END) {
ERROR (abstract->context, "Invalid ringbuffer pointer detected.");
ERROR (abstract->context, "Invalid ringbuffer pointer detected (0x%04x).", eop);
return DC_STATUS_DATAFORMAT;
}
@ -327,7 +327,7 @@ zeagle_n2ition3_device_foreach (dc_device_t *abstract, dc_dive_callback_t callba
// Get the pointer to the profile data.
unsigned int current = array_uint16_le (config + 2 * idx);
if (current < RB_PROFILE_BEGIN || current >= RB_PROFILE_END) {
ERROR (abstract->context, "Invalid ringbuffer pointer detected.");
ERROR (abstract->context, "Invalid ringbuffer pointer detected (0x%04x).", current);
return DC_STATUS_DATAFORMAT;
}