High speed logging example

Dependencies:   Adafruit_RTCLib BNO055 SDFileSystem mbed

Revision:
1:27070bac59e5
Parent:
0:2953603cfeee
Child:
2:aaa32a8342ab
--- a/main.cpp	Mon Jan 22 23:32:54 2018 +0000
+++ b/main.cpp	Tue Jan 23 06:21:12 2018 +0000
@@ -17,9 +17,10 @@
 
 #define PAGE_SIZE 4096
 #define HEADER_SIZE 10
+#define CHUNK_SIZE (PAGE_SIZE-HEADER_SIZE)
 #define PACKET_SIZE 8
 #define BAUD_RATE 921600
-#define BUF_SIZE (3*PAGE_SIZE)
+#define BUF_SIZE (16*PAGE_SIZE)
 
 Serial serial4(D8, D2);
 DigitalOut test(PC_8);
@@ -29,9 +30,8 @@
 char fname[255];
 char current_time[64];
 
-int index = 0;
-unsigned char *front, *back, *tmp;
-unsigned char buf1[BUF_SIZE], buf2[BUF_SIZE];
+int start = 0, end = 0;
+unsigned char buf[BUF_SIZE];
 unsigned char hdr[HEADER_SIZE] = {0xff, 0xff,'M','A','N','B','L','O','R','T'};
 
 void printDT(char *pre, DateTime &dt)
@@ -70,18 +70,13 @@
 
 void rx_callback() {
     while(serial4.readable()) {
-        if (index < BUF_SIZE) {
-            front[index] = serial4.getc();
-            index++;
-        } else {
-            front[0] = serial4.getc();
-            index = 1;
-        }
+        buf[end] = serial4.getc();
+        end++;
+        if (end == BUF_SIZE) end = 0;
     }
 }
 
 int main() {
-    front = buf1, back = buf2;
     test = 0;
     
     SDFileSystem sd(DI, DO, SCK, CS, "sd");
@@ -124,6 +119,7 @@
         printf("Firmware version v%d.%0d\r\n",imu.ID.sw[0],imu.ID.sw[1]);
         printf("Bootloader version v%d\r\n\r\n",imu.ID.bootload);
     }
+    
     imu.setmode(OPERATION_MODE_NDOF);
     imu.set_accel_units(MPERSPERS);
         
@@ -131,21 +127,18 @@
     serial4.attach(rx_callback);
      
     for (;;) {
-        if (index >= PAGE_SIZE-HEADER_SIZE) {
-            if (index > PAGE_SIZE-HEADER_SIZE) {
-                printf("%d\n", index);
+        int length = end - start;
+        if (length < 0) length += BUF_SIZE;
+        if (length >= CHUNK_SIZE) {
+            fwrite(hdr, 1, HEADER_SIZE, fp);
+            if (start+CHUNK_SIZE-1 < BUF_SIZE) {
+                fwrite(buf+start, 1, CHUNK_SIZE, fp);
+            } else {
+                fwrite(buf+start, 1, BUF_SIZE-start+1, fp);
+                fwrite(buf, 1, CHUNK_SIZE-(BUF_SIZE-start+1), fp);
             }
-            test2 = flag2;
-            flag2 = !flag2;
-            tmp = front;
-            front = back;
-            back = tmp;
-            index = 0;
-            test = 1;
-            fwrite(hdr, 1, HEADER_SIZE, fp);
-            fwrite(back, 1, PAGE_SIZE-HEADER_SIZE, fp);
             fflush(fp);
-            test = 0;
+            start += CHUNK_SIZE;
         }
     }
 }