Implement progress events for the device_dump() function.

A helper function is added to simplify implementing the devic_dump()
function on top of the device_read() function, and enable progress
events automatically.
This commit is contained in:
Jef Driesen 2009-11-12 08:04:34 +00:00
parent e2c6bdf880
commit a87398b7c6
8 changed files with 52 additions and 46 deletions

View File

@ -69,6 +69,9 @@ device_init (device_t *device, const device_backend_t *backend);
void
device_event_emit (device_t *device, device_event_t event, const void *data);
device_status_t
device_dump_read (device_t *device, unsigned char data[], unsigned int size, unsigned int blocksize);
#ifdef __cplusplus
}
#endif /* __cplusplus */

View File

@ -125,6 +125,43 @@ device_dump (device_t *device, dc_buffer_t *buffer)
}
device_status_t
device_dump_read (device_t *device, unsigned char data[], unsigned int size, unsigned int blocksize)
{
if (device == NULL)
return DEVICE_STATUS_UNSUPPORTED;
if (device->backend->read == NULL)
return DEVICE_STATUS_UNSUPPORTED;
// Enable progress notifications.
device_progress_t progress = DEVICE_PROGRESS_INITIALIZER;
progress.maximum = size;
device_event_emit (device, DEVICE_EVENT_PROGRESS, &progress);
unsigned int nbytes = 0;
while (nbytes < size) {
// Calculate the packet size.
unsigned int len = size - nbytes;
if (len > blocksize)
len = blocksize;
// Read the packet.
device_status_t rc = device->backend->read (device, nbytes, data + nbytes, len);
if (rc != DEVICE_STATUS_SUCCESS)
return rc;
// Update and emit a progress event.
progress.current += len;
device_event_emit (device, DEVICE_EVENT_PROGRESS, &progress);
nbytes += len;
}
return DEVICE_STATUS_SUCCESS;
}
device_status_t
device_foreach (device_t *device, dive_callback_t callback, void *userdata)
{

View File

@ -351,12 +351,8 @@ mares_puck_device_dump (device_t *abstract, dc_buffer_t *buffer)
return DEVICE_STATUS_MEMORY;
}
device_status_t rc = mares_puck_device_read (abstract, 0x00,
dc_buffer_get_data (buffer), dc_buffer_get_size (buffer));
if (rc != DEVICE_STATUS_SUCCESS)
return rc;
return DEVICE_STATUS_SUCCESS;
return device_dump_read (abstract, dc_buffer_get_data (buffer),
dc_buffer_get_size (buffer), MARES_PUCK_PACKET_SIZE);
}

View File

@ -481,12 +481,8 @@ oceanic_atom2_device_dump (device_t *abstract, dc_buffer_t *buffer)
return DEVICE_STATUS_MEMORY;
}
device_status_t rc = oceanic_atom2_device_read (abstract, 0x00,
dc_buffer_get_data (buffer), dc_buffer_get_size (buffer));
if (rc != DEVICE_STATUS_SUCCESS)
return rc;
return DEVICE_STATUS_SUCCESS;
return device_dump_read (abstract, dc_buffer_get_data (buffer),
dc_buffer_get_size (buffer), OCEANIC_ATOM2_PACKET_SIZE);
}

View File

@ -457,12 +457,8 @@ oceanic_veo250_device_dump (device_t *abstract, dc_buffer_t *buffer)
return DEVICE_STATUS_MEMORY;
}
device_status_t rc = oceanic_veo250_device_read (abstract, 0x00,
dc_buffer_get_data (buffer), dc_buffer_get_size (buffer));
if (rc != DEVICE_STATUS_SUCCESS)
return rc;
return DEVICE_STATUS_SUCCESS;
return device_dump_read (abstract, dc_buffer_get_data (buffer),
dc_buffer_get_size (buffer), OCEANIC_VEO250_PACKET_SIZE);
}

View File

@ -533,12 +533,8 @@ oceanic_vtpro_device_dump (device_t *abstract, dc_buffer_t *buffer)
return DEVICE_STATUS_MEMORY;
}
device_status_t rc = oceanic_vtpro_device_read (abstract, 0x00,
dc_buffer_get_data (buffer), dc_buffer_get_size (buffer));
if (rc != DEVICE_STATUS_SUCCESS)
return rc;
return DEVICE_STATUS_SUCCESS;
return device_dump_read (abstract, dc_buffer_get_data (buffer),
dc_buffer_get_size (buffer), OCEANIC_VTPRO_PACKET_SIZE);
}

View File

@ -230,17 +230,8 @@ suunto_common2_device_dump (device_t *abstract, dc_buffer_t *buffer)
return DEVICE_STATUS_MEMORY;
}
// Enable progress notifications.
device_progress_t progress = DEVICE_PROGRESS_INITIALIZER;
progress.maximum = SZ_MEMORY;
device_event_emit (abstract, DEVICE_EVENT_PROGRESS, &progress);
device_status_t rc = suunto_common2_read (abstract, 0x00,
dc_buffer_get_data (buffer), dc_buffer_get_size (buffer), &progress);
if (rc != DEVICE_STATUS_SUCCESS)
return rc;
return DEVICE_STATUS_SUCCESS;
return device_dump_read (abstract, dc_buffer_get_data (buffer),
dc_buffer_get_size (buffer), SZ_PACKET);
}

View File

@ -542,17 +542,8 @@ suunto_vyper_device_dump (device_t *abstract, dc_buffer_t *buffer)
return DEVICE_STATUS_MEMORY;
}
// Enable progress notifications.
device_progress_t progress = DEVICE_PROGRESS_INITIALIZER;
progress.maximum = SUUNTO_VYPER_MEMORY_SIZE;
device_event_emit (abstract, DEVICE_EVENT_PROGRESS, &progress);
device_status_t rc = suunto_vyper_read (abstract, 0x00,
dc_buffer_get_data (buffer), dc_buffer_get_size (buffer), &progress);
if (rc != DEVICE_STATUS_SUCCESS)
return rc;
return DEVICE_STATUS_SUCCESS;
return device_dump_read (abstract, dc_buffer_get_data (buffer),
dc_buffer_get_size (buffer), SUUNTO_VYPER_PACKET_SIZE);
}