Responded to a code review. --- src/cochran_commander.c | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-)
diff --git a/src/cochran_commander.c b/src/cochran_commander.c index f7d2e91..068fd04 100644 --- a/src/cochran_commander.c +++ b/src/cochran_commander.c @@ -429,12 +429,24 @@ cochran_commander_read_id (cochran_commander_device_t *device, unsigned char id[
static dc_status_t -cochran_commander_read_config (cochran_commander_device_t *device, dc_event_progress_t *progress, unsigned char data[]) +cochran_commander_read_config (cochran_commander_device_t *device, dc_event_progress_t *progress, unsigned char data[], int data_size) { dc_device_t *abstract = (dc_device_t *) device; dc_status_t rc = DC_STATUS_SUCCESS;
- unsigned int pages = 2; + unsigned int pages = 0; + + switch (data_size) { + case 512: + pages = 1; + break; + case 1024: + pages = 2; + break; + default: + return DC_STATUS_INVALIDARGS; + break; + }
if (device->layout->model == COCHRAN_MODEL_COMMANDER_TM) pages = 1; @@ -816,7 +828,7 @@ cochran_commander_device_dump (dc_device_t *abstract, dc_buffer_t *buffer) vendor.size = sizeof (device->id); device_event_emit (abstract, DC_EVENT_VENDOR, &vendor);
- rc = cochran_commander_read_config (device, &progress, config); + rc = cochran_commander_read_config (device, &progress, config, config_size); if (rc != DC_STATUS_SUCCESS) return rc;
@@ -867,7 +879,7 @@ cochran_commander_device_foreach (dc_device_t *abstract, dc_dive_callback_t call
// Read config dc_status_t rc = DC_STATUS_SUCCESS; - rc = cochran_commander_read_config(device, &progress, data.config); + rc = cochran_commander_read_config(device, &progress, data.config, max_config); if (rc != DC_STATUS_SUCCESS) return rc;
Responded to code review request. --- src/descriptor.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/src/descriptor.c b/src/descriptor.c index 5093700..794387a 100644 --- a/src/descriptor.c +++ b/src/descriptor.c @@ -292,12 +292,12 @@ static const dc_descriptor_t g_descriptors[] = { {"DiveSystem", "iX3M Deep", DC_FAMILY_DIVESYSTEM_IDIVE, 0x23}, {"DiveSystem", "iX3M Tec", DC_FAMILY_DIVESYSTEM_IDIVE, 0x24}, {"DiveSystem", "iX3M Reb", DC_FAMILY_DIVESYSTEM_IDIVE, 0x25}, - {"Cochran", "Commander I", DC_FAMILY_COCHRAN_COMMANDER, 0}, - {"Cochran", "Commander II", DC_FAMILY_COCHRAN_COMMANDER, 1}, - {"Cochran", "EMC-14", DC_FAMILY_COCHRAN_COMMANDER, 2}, - {"Cochran", "EMC-16", DC_FAMILY_COCHRAN_COMMANDER, 3}, - {"Cochran", "EMC-20H", DC_FAMILY_COCHRAN_COMMANDER, 4}, - {"Cochran", "Commander TM", DC_FAMILY_COCHRAN_COMMANDER, 5}, + {"Cochran", "Commander TM", DC_FAMILY_COCHRAN_COMMANDER, 0}, + {"Cochran", "Commander I", DC_FAMILY_COCHRAN_COMMANDER, 1}, + {"Cochran", "Commander II", DC_FAMILY_COCHRAN_COMMANDER, 2}, + {"Cochran", "EMC-14", DC_FAMILY_COCHRAN_COMMANDER, 3}, + {"Cochran", "EMC-16", DC_FAMILY_COCHRAN_COMMANDER, 4}, + {"Cochran", "EMC-20H", DC_FAMILY_COCHRAN_COMMANDER, 5}, };
typedef struct dc_descriptor_iterator_t {
Reading using the low-speed read command returns 32K bytes when asked for 0. This is handy to use, but we should handle a request for 0 by returning without a read. --- src/cochran_commander.c | 10 ++++++++++ 1 file changed, 10 insertions(+)
diff --git a/src/cochran_commander.c b/src/cochran_commander.c index 068fd04..9670aea 100644 --- a/src/cochran_commander.c +++ b/src/cochran_commander.c @@ -500,6 +500,16 @@ cochran_commander_read (cochran_commander_device_t *device, dc_event_progress_t case 24: // Commander uses 24 byte addressing if (device->layout->baudrate == 9600) { + // This read command will return 32K bytes if asked to + // read 0 bytes. So we can allow a size of up to + // 0x10000 but if the user asks for 0 bytes we + // should just return success otherwise we'll end + // end up running past the buffer. + if (size > 0x10000) + return DC_STATUS_INVALIDARGS; + if (size == 0) + return DC_STATUS_SUCCESS; + // Older commander, use low-speed read command command[0] = 0x05; command[1] = (address ) & 0xff;