[Pkg-running-devel] [openambit] 23/131: Made PMEM20 read chunksize configurable depending on device type
Christian Perrier
bubulle at moszumanska.debian.org
Thu Jul 17 20:19:08 UTC 2014
This is an automated email from the git hooks/post-receive script.
bubulle pushed a commit to branch master
in repository openambit.
commit 5aeb1c672dc1eb36c7dfe609eb016f6c38041d3b
Author: Emil Ljungdahl <emil at kratern.se>
Date: Sat Jan 4 16:39:34 2014 +0100
Made PMEM20 read chunksize configurable depending on device type
---
src/libambit/libambit.c | 26 +++++++++++++-------------
src/libambit/libambit_int.h | 3 ++-
src/libambit/pmem20.c | 22 ++++++++++++----------
3 files changed, 27 insertions(+), 24 deletions(-)
diff --git a/src/libambit/libambit.c b/src/libambit/libambit.c
index 9132235..742e3fc 100644
--- a/src/libambit/libambit.c
+++ b/src/libambit/libambit.c
@@ -38,6 +38,7 @@ struct ambit_supported_device_s {
uint8_t min_sw_version[4];
char *name;
bool supported;
+ uint16_t pmem20_chunksize;
};
/*
@@ -50,17 +51,17 @@ static int lock_log(ambit_object_t *object, bool lock);
* Static variables
*/
static ambit_supported_device_t supported_devices[] = {
- { SUUNTO_USB_VENDOR_ID, 0x001a, "Colibri", {0x01,0x01,0x02,0x00}, "Suunto Ambit2 S", false },
- { SUUNTO_USB_VENDOR_ID, 0x0019, "Duck", {0x01,0x01,0x02,0x00}, "Suunto Ambit2", true },
- { SUUNTO_USB_VENDOR_ID, 0x001a, "Colibri", {0x00,0x02,0x03,0x00}, "Suunto Ambit2 S", false },
- { SUUNTO_USB_VENDOR_ID, 0x0019, "Duck", {0x00,0x02,0x03,0x00}, "Suunto Ambit2", false },
- { SUUNTO_USB_VENDOR_ID, 0x001a, "Colibri", {0x00,0x02,0x02,0x00}, "Suunto Ambit2 S (up to 0.2.2)", false },
- { SUUNTO_USB_VENDOR_ID, 0x0019, "Duck", {0x00,0x02,0x02,0x00}, "Suunto Ambit2 (up to 0.2.2)", false },
- { SUUNTO_USB_VENDOR_ID, 0x0010, "Bluebird", {0x02,0x01,0x00,0x00}, "Suunto Ambit", false },
- { SUUNTO_USB_VENDOR_ID, 0x0010, "Bluebird", {0x01,0x09,0x00,0x00}, "Suunto Ambit", false }, /* First with PMEM 2.0!? */
- { SUUNTO_USB_VENDOR_ID, 0x0010, "Bluebird", {0x01,0x06,0x00,0x00}, "Suunto Ambit", false },
- { SUUNTO_USB_VENDOR_ID, 0x0010, "Bluebird", {0x01,0x01,0x00,0x00}, "Suunto Ambit", false },
- { SUUNTO_USB_VENDOR_ID, 0x0010, "Bluebird", {0x00,0x00,0x00,0x00}, "Suunto Ambit", false },
+ { SUUNTO_USB_VENDOR_ID, 0x001a, "Colibri", {0x01,0x01,0x02,0x00}, "Suunto Ambit2 S", false, 0x0400 },
+ { SUUNTO_USB_VENDOR_ID, 0x0019, "Duck", {0x01,0x01,0x02,0x00}, "Suunto Ambit2", true, 0x0400 },
+ { SUUNTO_USB_VENDOR_ID, 0x001a, "Colibri", {0x00,0x02,0x03,0x00}, "Suunto Ambit2 S", false, 0x0400 },
+ { SUUNTO_USB_VENDOR_ID, 0x0019, "Duck", {0x00,0x02,0x03,0x00}, "Suunto Ambit2", false, 0x0400 },
+ { SUUNTO_USB_VENDOR_ID, 0x001a, "Colibri", {0x00,0x02,0x02,0x00}, "Suunto Ambit2 S (up to 0.2.2)", false, 0x0200 },
+ { SUUNTO_USB_VENDOR_ID, 0x0019, "Duck", {0x00,0x02,0x02,0x00}, "Suunto Ambit2 (up to 0.2.2)", false, 0x0200 },
+ { SUUNTO_USB_VENDOR_ID, 0x0010, "Bluebird", {0x02,0x01,0x00,0x00}, "Suunto Ambit", false, 0x0200 },
+ { SUUNTO_USB_VENDOR_ID, 0x0010, "Bluebird", {0x01,0x09,0x00,0x00}, "Suunto Ambit", false, 0x0200 }, /* First with PMEM 2.0!? */
+ { SUUNTO_USB_VENDOR_ID, 0x0010, "Bluebird", {0x01,0x06,0x00,0x00}, "Suunto Ambit", false, 0 },
+ { SUUNTO_USB_VENDOR_ID, 0x0010, "Bluebird", {0x01,0x01,0x00,0x00}, "Suunto Ambit", false, 0 },
+ { SUUNTO_USB_VENDOR_ID, 0x0010, "Bluebird", {0x00,0x00,0x00,0x00}, "Suunto Ambit", false, 0 },
{ 0x0000, 0x0000, NULL, {0x00,0x00,0x00,0x00}, NULL, false }
};
@@ -332,8 +333,7 @@ int libambit_log_read(ambit_object_t *object, ambit_log_skip_cb skip_cb, ambit_l
}
if (read_pmem) {
- if (libambit_pmem20_init(object) != 0) {
- printf("%s:%d\n", __FILE__, __LINE__);
+ if (libambit_pmem20_init(object, object->device->pmem20_chunksize) != 0) {
lock_log(object, false);
return -1;
}
diff --git a/src/libambit/libambit_int.h b/src/libambit/libambit_int.h
index 16a2c4c..6e74c70 100644
--- a/src/libambit/libambit_int.h
+++ b/src/libambit/libambit_int.h
@@ -38,6 +38,7 @@ typedef struct ambit_object_s {
struct {
bool initialized;
+ uint16_t chunk_size;
uint32_t first_entry;
uint32_t last_entry;
uint32_t entries;
@@ -77,7 +78,7 @@ uint16_t crc16_ccitt_false_init(unsigned char *buf, size_t buflen, uint16_t crc)
int libambit_personal_settings_parse(uint8_t *data, size_t datalen, ambit_personal_settings_t *settings);
// pmem20.c
-int libambit_pmem20_init(ambit_object_t *object);
+int libambit_pmem20_init(ambit_object_t *object, uint16_t chunk_size);
int libambit_pmem20_deinit(ambit_object_t *object);
int libambit_pmem20_next_header(ambit_object_t *object, ambit_log_header_t *log_header);
ambit_log_entry_t *libambit_pmem20_read_entry(ambit_object_t *object);
diff --git a/src/libambit/pmem20.c b/src/libambit/pmem20.c
index 6bf50a5..375d7ca 100644
--- a/src/libambit/pmem20.c
+++ b/src/libambit/pmem20.c
@@ -31,7 +31,6 @@
*/
#define PMEM20_LOG_START 0x000f4240
#define PMEM20_LOG_SIZE 0x0029f630 /* 2 750 000 */
-#define PMEM20_LOG_READ_CHUNKS 0x00000400 /* 1024 */
#define PMEM20_LOG_HEADER_MIN_LEN 512 /* Header actually longer, but not interesting*/
typedef struct __attribute__((__packed__)) periodic_sample_spec_s {
@@ -59,7 +58,7 @@ static void to_timeval(ambit_date_time_t *ambit_time, struct timeval *timeval);
/*
* Public functions
*/
-int libambit_pmem20_init(ambit_object_t *object)
+int libambit_pmem20_init(ambit_object_t *object, uint16_t chunk_size)
{
int ret = -1;
size_t offset;
@@ -71,8 +70,9 @@ int libambit_pmem20_init(ambit_object_t *object)
memset(&object->pmem20, 0, sizeof(object->pmem20));
object->pmem20.buffer = malloc(PMEM20_LOG_SIZE);
if (object->pmem20.buffer != NULL) {
+ object->pmem20.chunk_size = chunk_size;
// Read initial log header
- ret = read_log_chunk(object, PMEM20_LOG_START, PMEM20_LOG_READ_CHUNKS, object->pmem20.buffer);
+ ret = read_log_chunk(object, PMEM20_LOG_START, object->pmem20.chunk_size, object->pmem20.buffer);
if (ret == 0) {
object->pmem20.prev_read = PMEM20_LOG_START;
@@ -194,7 +194,7 @@ ambit_log_entry_t *libambit_pmem20_read_entry(ambit_object_t *object)
while (sample_count < log_entry->samples_count) {
if (PMEM20_LOG_START + buffer_offset + 2 >= object->pmem20.last_addr ||
PMEM20_LOG_START + buffer_offset + 2 + read16(object->pmem20.buffer, buffer_offset) >= object->pmem20.last_addr) {
- read_upto(object, PMEM20_LOG_START + buffer_offset, PMEM20_LOG_READ_CHUNKS);
+ read_upto(object, PMEM20_LOG_START + buffer_offset, object->pmem20.chunk_size);
}
if (parse_sample(object->pmem20.buffer, &buffer_offset, &periodic_sample_spec, log_entry, &sample_count) == 1) {
@@ -337,8 +337,10 @@ int libambit_pmem20_parse_header(uint8_t *data, size_t datalen, ambit_log_header
log_header->distance_before_calib = read32inc(data, &offset);
- memcpy(log_header->unknown6, data+offset, 24);
- offset += 24;
+ if (datalen >= offset + 24) {
+ memcpy(log_header->unknown6, data+offset, 24);
+ offset += 24;
+ }
return 0;
}
@@ -640,17 +642,17 @@ static int parse_sample(uint8_t *buf, size_t *offset, uint8_t **spec, ambit_log_
static int read_upto(ambit_object_t *object, uint32_t address, uint32_t length)
{
- uint32_t start_address = address - ((address - PMEM20_LOG_START) % PMEM20_LOG_READ_CHUNKS);
+ uint32_t start_address = address - ((address - PMEM20_LOG_START) % object->pmem20.chunk_size);
while (start_address < address + length) {
if (object->pmem20.prev_read != start_address) {
- if (read_log_chunk(object, start_address, PMEM20_LOG_READ_CHUNKS, object->pmem20.buffer + (start_address - PMEM20_LOG_START)) != 0) {
+ if (read_log_chunk(object, start_address, object->pmem20.chunk_size, object->pmem20.buffer + (start_address - PMEM20_LOG_START)) != 0) {
return -1;
}
object->pmem20.prev_read = start_address;
- object->pmem20.last_addr = start_address + PMEM20_LOG_READ_CHUNKS - 1;
+ object->pmem20.last_addr = start_address + object->pmem20.chunk_size - 1;
}
- start_address += PMEM20_LOG_READ_CHUNKS;
+ start_address += object->pmem20.chunk_size;
}
return 0;
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-running/openambit.git
More information about the Pkg-running-devel
mailing list