Always read at least 8 bytes, because reading fewer bytes is unreliable.

This commit is contained in:
Jef Driesen 2008-09-27 06:09:14 +00:00
parent 276f45acd2
commit ffe99a8724
2 changed files with 42 additions and 14 deletions

View File

@ -19,6 +19,8 @@
message ("%s:%d: %s\n", __FILE__, __LINE__, expr); \
}
#define MINIMUM 8
#define RB_PROFILE_BEGIN 0x019A
#define RB_PROFILE_END SUUNTO_D9_MEMORY_SIZE - 2
#define RB_PROFILE_DISTANCE(a,b) ringbuffer_distance (a, b, RB_PROFILE_BEGIN, RB_PROFILE_END)
@ -431,7 +433,7 @@ suunto_d9_device_foreach (device_t *abstract, dive_callback_t callback, void *us
// Memory buffer to store all the dives.
unsigned char data[RB_PROFILE_END - RB_PROFILE_BEGIN] = {0};
unsigned char data[MINIMUM + RB_PROFILE_END - RB_PROFILE_BEGIN] = {0};
// Calculate the total amount of bytes.
@ -481,14 +483,26 @@ suunto_d9_device_foreach (device_t *abstract, dive_callback_t callback, void *us
message ("Pointers: address=%04x, len=%u\n", address - len, len);
// Always read at least the minimum amount of bytes, because
// reading fewer bytes is unreliable. The memory buffer is
// large enough to prevent buffer overflows, and the extra
// bytes are automatically ignored (due to reading backwards).
unsigned int extra = 0;
if (len < MINIMUM)
extra = MINIMUM - len;
message ("Pointers: extra=%u\n", extra);
// Read the package.
unsigned char *p = data + remaining - nbytes;
rc = suunto_d9_read (abstract, address - len, p - len, len, &progress);
unsigned char *p = data + MINIMUM + remaining - nbytes;
rc = suunto_d9_read (abstract, address - (len + extra), p - (len + extra), len + extra, NULL);
if (rc != DEVICE_STATUS_SUCCESS) {
WARNING ("Cannot read memory.");
return rc;
}
progress_event (&progress, DEVICE_EVENT_PROGRESS, len);
// Next package.
nbytes += len;
address -= len;
@ -506,8 +520,8 @@ suunto_d9_device_foreach (device_t *abstract, dive_callback_t callback, void *us
remaining -= size;
available = nbytes - size;
unsigned int oprevious = data[remaining + 0] + (data[remaining + 1] << 8);
unsigned int onext = data[remaining + 2] + (data[remaining + 3] << 8);
unsigned int oprevious = data[MINIMUM + remaining + 0] + (data[MINIMUM + remaining + 1] << 8);
unsigned int onext = data[MINIMUM + remaining + 2] + (data[MINIMUM + remaining + 3] << 8);
message ("Pointers: previous=%04x, next=%04x\n", oprevious, onext);
assert (current == onext);
@ -519,12 +533,12 @@ suunto_d9_device_foreach (device_t *abstract, dive_callback_t callback, void *us
#ifndef NDEBUG
message ("D9Profile()=\"");
for (unsigned int i = 0; i < size - 4; ++i) {
message ("%02x", data[remaining + 4 + i]);
message ("%02x", data[MINIMUM + remaining + 4 + i]);
}
message ("\"\n");
#endif
if (callback && !callback (data + remaining + 4, size - 4, userdata))
if (callback && !callback (data + MINIMUM + remaining + 4, size - 4, userdata))
return DEVICE_STATUS_SUCCESS;
}
assert (remaining == 0);

View File

@ -19,6 +19,8 @@
message ("%s:%d: %s\n", __FILE__, __LINE__, expr); \
}
#define MINIMUM 8
#define RB_PROFILE_BEGIN 0x019A
#define RB_PROFILE_END SUUNTO_VYPER2_MEMORY_SIZE - 2
#define RB_PROFILE_DISTANCE(a,b) ringbuffer_distance (a, b, RB_PROFILE_BEGIN, RB_PROFILE_END)
@ -418,7 +420,7 @@ suunto_vyper2_device_foreach (device_t *abstract, dive_callback_t callback, void
// Memory buffer to store all the dives.
unsigned char data[RB_PROFILE_END - RB_PROFILE_BEGIN] = {0};
unsigned char data[MINIMUM + RB_PROFILE_END - RB_PROFILE_BEGIN] = {0};
// Calculate the total amount of bytes.
@ -468,14 +470,26 @@ suunto_vyper2_device_foreach (device_t *abstract, dive_callback_t callback, void
message ("Pointers: address=%04x, len=%u\n", address - len, len);
// Always read at least the minimum amount of bytes, because
// reading fewer bytes is unreliable. The memory buffer is
// large enough to prevent buffer overflows, and the extra
// bytes are automatically ignored (due to reading backwards).
unsigned int extra = 0;
if (len < MINIMUM)
extra = MINIMUM - len;
message ("Pointers: extra=%u\n", extra);
// Read the package.
unsigned char *p = data + remaining - nbytes;
rc = suunto_vyper2_read (abstract, address - len, p - len, len, &progress);
unsigned char *p = data + MINIMUM + remaining - nbytes;
rc = suunto_vyper2_read (abstract, address - (len + extra), p - (len + extra), len + extra, NULL);
if (rc != DEVICE_STATUS_SUCCESS) {
WARNING ("Cannot read memory.");
return rc;
}
progress_event (&progress, DEVICE_EVENT_PROGRESS, len);
// Next package.
nbytes += len;
address -= len;
@ -493,8 +507,8 @@ suunto_vyper2_device_foreach (device_t *abstract, dive_callback_t callback, void
remaining -= size;
available = nbytes - size;
unsigned int oprevious = data[remaining + 0] + (data[remaining + 1] << 8);
unsigned int onext = data[remaining + 2] + (data[remaining + 3] << 8);
unsigned int oprevious = data[MINIMUM + remaining + 0] + (data[MINIMUM + remaining + 1] << 8);
unsigned int onext = data[MINIMUM + remaining + 2] + (data[MINIMUM + remaining + 3] << 8);
message ("Pointers: previous=%04x, next=%04x\n", oprevious, onext);
assert (current == onext);
@ -506,12 +520,12 @@ suunto_vyper2_device_foreach (device_t *abstract, dive_callback_t callback, void
#ifndef NDEBUG
message ("Vyper2Profile()=\"");
for (unsigned int i = 0; i < size - 4; ++i) {
message ("%02x", data[remaining + 4 + i]);
message ("%02x", data[MINIMUM + remaining + 4 + i]);
}
message ("\"\n");
#endif
if (callback && !callback (data + remaining + 4, size - 4, userdata))
if (callback && !callback (data + MINIMUM + remaining + 4, size - 4, userdata))
return DEVICE_STATUS_SUCCESS;
}
assert (remaining == 0);