[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