Moved memory address calculation outside the read functions. --- src/cochran_common.c | 62 ++++++++++++++++++++++++++++------------------------ 1 file changed, 33 insertions(+), 29 deletions(-)
diff --git a/src/cochran_common.c b/src/cochran_common.c index 22630c6..4fcd751 100644 --- a/src/cochran_common.c +++ b/src/cochran_common.c @@ -490,15 +490,6 @@ cochran_read_logbook (dc_device_t *abstract) cochran_data_t *d = &(device->data); dc_status_t rc;
- // Determine size of dive list to read. Round up to nearest 16K - if (d->dive_count_endian == COCHRAN_LE_TYPE) - d->dive_count = array_uint16_le (d->config[0] + d->dive_count_ptr); - else - d->dive_count = array_uint16_be (d->config[0] + d->dive_count_ptr); - - d->logbook_size = ((d->dive_count * d->log_size) & 0xFFFFC000) - + 0x4000; - if (d->logbook) free(d->logbook);
@@ -554,15 +545,16 @@ cochran_find_fingerprint(dc_device_t *abstract)
static void -cochran_read_parms(dc_device_t *abstract, int *low_offset, int *high_offset) +cochran_get_sample_parms(dc_device_t *abstract) { cochran_device_t *device = (cochran_device_t *) abstract; cochran_data_t *d = (cochran_data_t *) &(device->data); unsigned int pre_dive_offset, end_dive_offset; + unsigned int low_offset, high_offset;
// Find lowest and highest offsets into sample data - *low_offset = 0xFFFFFFFF; - *high_offset = 0; + low_offset = 0xFFFFFFFF; + high_offset = 0;
int i; for (i = d->fp_dive_num + 1; i < d->dive_count; i++) { @@ -575,26 +567,26 @@ cochran_read_parms(dc_device_t *abstract, int *low_offset, int *high_offset) if (pre_dive_offset > end_dive_offset) break; - if (pre_dive_offset < *low_offset) - *low_offset = pre_dive_offset; - if (end_dive_offset > *high_offset && end_dive_offset != 0xFFFFFFFF ) - *high_offset = end_dive_offset; + if (pre_dive_offset < low_offset) + low_offset = pre_dive_offset; + if (end_dive_offset > high_offset && end_dive_offset != 0xFFFFFFFF ) + high_offset = end_dive_offset; }
if (pre_dive_offset > end_dive_offset) { // Since I can't tell how much memory it has, I'll round. // I'll round to 128K, dives longer than 12 hrs aren't likely // and memory in sizes not rounded to 128K might be odd. - *high_offset = ((pre_dive_offset - 1) & 0xE0000) + 0x20000; - d->sample_memory_end_address = *high_offset; - *low_offset = d->sample_memory_start_address; - d->sample_data_offset = *low_offset; - d->sample_size = *high_offset - *low_offset; - } else if (*low_offset < 0xFFFFFFFF && *high_offset > 0) { + high_offset = ((pre_dive_offset - 1) & 0xE0000) + 0x20000; + d->sample_memory_end_address = high_offset; + low_offset = d->sample_memory_start_address; + d->sample_data_offset = low_offset; + d->sample_size = high_offset - low_offset; + } else if (low_offset < 0xFFFFFFFF && high_offset > 0) { // Round offset and size to 16K boundary - d->sample_data_offset = *low_offset & 0xFFFFC000; - *high_offset = ((*high_offset - 1) & 0xFFFFC000) + 0x4000; - d->sample_size = *high_offset - d->sample_data_offset; + d->sample_data_offset = low_offset & 0xFFFFC000; + high_offset = ((high_offset - 1) & 0xFFFFC000) + 0x4000; + d->sample_size = high_offset - d->sample_data_offset; } else { d->sample_data_offset = 0; d->sample_size = 0; @@ -607,13 +599,9 @@ cochran_read_samples(dc_device_t *abstract) { cochran_device_t *device = (cochran_device_t *) abstract; cochran_data_t *d = (cochran_data_t *) &(device->data); - int low_offset, high_offset; dc_status_t rc;
- cochran_find_fingerprint(abstract); - cochran_read_parms(abstract, &low_offset, &high_offset); - if (d->sample_size > 0) { if (d->sample) free(d->sample); @@ -661,6 +649,9 @@ cochran_read_samples(dc_device_t *abstract) static dc_status_t cochran_common_device_read_all (dc_device_t *abstract) { + cochran_device_t *device = (cochran_device_t *) abstract; + cochran_data_t *d = (cochran_data_t *) &(device->data); + dc_status_t rc;
// Read config @@ -672,10 +663,23 @@ cochran_common_device_read_all (dc_device_t *abstract) if (rc != DC_STATUS_SUCCESS) return rc;
+ // Determine size of dive list to read. Round up to nearest 16K + if (d->dive_count_endian == COCHRAN_LE_TYPE) + d->dive_count = array_uint16_le (d->config[0] + d->dive_count_ptr); + else + d->dive_count = array_uint16_be (d->config[0] + d->dive_count_ptr); + + d->logbook_size = ((d->dive_count * d->log_size) & 0xFFFFC000) + + 0x4000; + rc = cochran_read_logbook(abstract); if (rc != DC_STATUS_SUCCESS) return rc;
+ // Determine sample memory to read + cochran_find_fingerprint(abstract); + cochran_get_sample_parms(abstract); + rc = cochran_read_samples(abstract); if (rc != DC_STATUS_SUCCESS) return rc;