Implemented progress notifications for the Suunto D9 and Vyper2.

This commit is contained in:
Jef Driesen 2008-08-19 10:17:13 +00:00
parent ddf43fb828
commit dd847c5cf6
2 changed files with 48 additions and 8 deletions

View File

@ -263,7 +263,7 @@ suunto_d9_device_reset_maxdepth (device_t *abstract)
static device_status_t
suunto_d9_device_read (device_t *abstract, unsigned int address, unsigned char data[], unsigned int size)
suunto_d9_read (device_t *abstract, unsigned int address, unsigned char data[], unsigned int size, device_progress_state_t *progress)
{
suunto_d9_device_t *device = (suunto_d9_device_t*) abstract;
@ -300,6 +300,8 @@ suunto_d9_device_read (device_t *abstract, unsigned int address, unsigned char d
message("\"\n");
#endif
progress_event (progress, DEVICE_EVENT_PROGRESS, len);
nbytes += len;
address += len;
data += len;
@ -309,6 +311,13 @@ suunto_d9_device_read (device_t *abstract, unsigned int address, unsigned char d
}
static device_status_t
suunto_d9_device_read (device_t *abstract, unsigned int address, unsigned char data[], unsigned int size)
{
return suunto_d9_read (abstract, address, data, size, NULL);
}
static device_status_t
suunto_d9_device_write (device_t *abstract, unsigned int address, const unsigned char data[], unsigned int size)
{
@ -364,7 +373,11 @@ suunto_d9_device_dump (device_t *abstract, unsigned char data[], unsigned int si
if (size < SUUNTO_D9_MEMORY_SIZE)
return DEVICE_STATUS_ERROR;
int rc = suunto_d9_device_read (abstract, 0x00, data, SUUNTO_D9_MEMORY_SIZE);
// Enable progress notifications.
device_progress_state_t progress;
progress_init (&progress, abstract, SUUNTO_D9_MEMORY_SIZE);
int rc = suunto_d9_read (abstract, 0x00, data, SUUNTO_D9_MEMORY_SIZE, &progress);
if (rc != DEVICE_STATUS_SUCCESS)
return rc;
@ -378,9 +391,13 @@ suunto_d9_device_foreach (device_t *abstract, dive_callback_t callback, void *us
if (! device_is_suunto_d9 (abstract))
return DEVICE_STATUS_TYPE_MISMATCH;
// Enable progress notifications.
device_progress_state_t progress;
progress_init (&progress, abstract, RB_PROFILE_END - RB_PROFILE_BEGIN + 8);
// Read the header bytes.
unsigned char header[8] = {0};
int rc = suunto_d9_device_read (abstract, 0x0190, header, sizeof (header));
int rc = suunto_d9_read (abstract, 0x0190, header, sizeof (header), NULL);
if (rc != DEVICE_STATUS_SUCCESS) {
WARNING ("Cannot read memory header.");
return rc;
@ -401,6 +418,9 @@ suunto_d9_device_foreach (device_t *abstract, dive_callback_t callback, void *us
unsigned int remaining = RB_PROFILE_DISTANCE (begin, end);
progress_set_maximum (&progress, remaining + 8);
progress_event (&progress, DEVICE_EVENT_PROGRESS, 8);
// To reduce the number of read operations, we always try to read
// packages with the largest possible size. As a consequence, the
// last package of a dive can contain data from more than one dive.
@ -444,7 +464,7 @@ suunto_d9_device_foreach (device_t *abstract, dive_callback_t callback, void *us
// Read the package.
unsigned char *p = data + remaining - nbytes;
rc = suunto_d9_device_read (abstract, address - len, p - len, len);
rc = suunto_d9_read (abstract, address - len, p - len, len, &progress);
if (rc != DEVICE_STATUS_SUCCESS) {
WARNING ("Cannot read memory.");
return rc;

View File

@ -250,7 +250,7 @@ suunto_vyper2_device_reset_maxdepth (device_t *abstract)
static device_status_t
suunto_vyper2_device_read (device_t *abstract, unsigned int address, unsigned char data[], unsigned int size)
suunto_vyper2_read (device_t *abstract, unsigned int address, unsigned char data[], unsigned int size, device_progress_state_t *progress)
{
suunto_vyper2_device_t *device = (suunto_vyper2_device_t*) abstract;
@ -287,6 +287,8 @@ suunto_vyper2_device_read (device_t *abstract, unsigned int address, unsigned ch
message("\"\n");
#endif
progress_event (progress, DEVICE_EVENT_PROGRESS, len);
nbytes += len;
address += len;
data += len;
@ -296,6 +298,13 @@ suunto_vyper2_device_read (device_t *abstract, unsigned int address, unsigned ch
}
static device_status_t
suunto_vyper2_device_read (device_t *abstract, unsigned int address, unsigned char data[], unsigned int size)
{
return suunto_vyper2_read (abstract, address, data, size, NULL);
}
static device_status_t
suunto_vyper2_device_write (device_t *abstract, unsigned int address, const unsigned char data[], unsigned int size)
{
@ -351,7 +360,11 @@ suunto_vyper2_device_dump (device_t *abstract, unsigned char data[], unsigned in
if (size < SUUNTO_VYPER2_MEMORY_SIZE)
return DEVICE_STATUS_ERROR;
int rc = suunto_vyper2_device_read (abstract, 0x00, data, SUUNTO_VYPER2_MEMORY_SIZE);
// Enable progress notifications.
device_progress_state_t progress;
progress_init (&progress, abstract, SUUNTO_VYPER2_MEMORY_SIZE);
int rc = suunto_vyper2_read (abstract, 0x00, data, SUUNTO_VYPER2_MEMORY_SIZE, &progress);
if (rc != DEVICE_STATUS_SUCCESS)
return rc;
@ -365,9 +378,13 @@ suunto_vyper2_device_foreach (device_t *abstract, dive_callback_t callback, void
if (! device_is_suunto_vyper2 (abstract))
return DEVICE_STATUS_TYPE_MISMATCH;
// Enable progress notifications.
device_progress_state_t progress;
progress_init (&progress, abstract, RB_PROFILE_END - RB_PROFILE_BEGIN + 8);
// Read the header bytes.
unsigned char header[8] = {0};
int rc = suunto_vyper2_device_read (abstract, 0x0190, header, sizeof (header));
int rc = suunto_vyper2_read (abstract, 0x0190, header, sizeof (header), NULL);
if (rc != DEVICE_STATUS_SUCCESS) {
WARNING ("Cannot read memory header.");
return rc;
@ -388,6 +405,9 @@ suunto_vyper2_device_foreach (device_t *abstract, dive_callback_t callback, void
unsigned int remaining = RB_PROFILE_DISTANCE (begin, end);
progress_set_maximum (&progress, remaining + 8);
progress_event (&progress, DEVICE_EVENT_PROGRESS, 8);
// To reduce the number of read operations, we always try to read
// packages with the largest possible size. As a consequence, the
// last package of a dive can contain data from more than one dive.
@ -431,7 +451,7 @@ suunto_vyper2_device_foreach (device_t *abstract, dive_callback_t callback, void
// Read the package.
unsigned char *p = data + remaining - nbytes;
rc = suunto_vyper2_device_read (abstract, address - len, p - len, len);
rc = suunto_vyper2_read (abstract, address - len, p - len, len, &progress);
if (rc != DEVICE_STATUS_SUCCESS) {
WARNING ("Cannot read memory.");
return rc;