High speed logging example

Dependencies:   Adafruit_RTCLib BNO055 SDFileSystem mbed

Revision:
0:2953603cfeee
Child:
1:27070bac59e5
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Mon Jan 22 23:32:54 2018 +0000
@@ -0,0 +1,151 @@
+#include "mbed.h"
+#include "SDFileSystem.h"
+#include "BNO055.h"
+#include "DS1307.h"
+#include "string.h"
+
+#define DI D11
+#define DO D12
+#define SCK D13
+#define CS D10
+
+#define I2C1_SDA PB_9
+#define I2C1_SCL PB_8
+
+#define I2C2_SDA D5
+#define I2C2_SCL D7
+
+#define PAGE_SIZE 4096
+#define HEADER_SIZE 10
+#define PACKET_SIZE 8
+#define BAUD_RATE 921600
+#define BUF_SIZE (3*PAGE_SIZE)
+
+Serial serial4(D8, D2);
+DigitalOut test(PC_8);
+DigitalOut test2(PC_6);
+int flag=0, flag2=0;
+
+char fname[255];
+char current_time[64];
+
+int index = 0;
+unsigned char *front, *back, *tmp;
+unsigned char buf1[BUF_SIZE], buf2[BUF_SIZE];
+unsigned char hdr[HEADER_SIZE] = {0xff, 0xff,'M','A','N','B','L','O','R','T'};
+
+void printDT(char *pre, DateTime &dt)
+{
+    printf("%s %u/%u/%02u %2u:%02u:%02u\r\n"
+        ,pre
+        ,dt.month(),dt.day(),dt.year()
+        ,dt.hour(),dt.minute(),dt.second()
+        );
+}
+
+bool rtcUpdate(RtcDs1307 &rtc, int32_t bias) // this must be signed
+{   bool bUpdated = false;
+ 
+    // Use the compiled date/time as a basis for setting the clock.
+    // We assign it to a signed integer so that negative biases work correctly
+    int64_t compiledTime = DateTime(__DATE__,__TIME__).unixtime();
+ 
+    // This assumes that the program is run VERY soon after the initial compile.
+    time_t localt = DateTime(compiledTime + bias).unixtime(); // offset by bias
+    
+    // If the stored static time stamp does not equal the compiled time stamp,
+    // then we need to update the RTC clock and the stored time stamp
+    if(*((time_t *)&rtc[0]) != localt)
+    {
+        // Update the RTC time as local time, not GMT/UTC
+        rtc.adjust(localt);
+        // Store the new compiled time statically in the object ram image
+        *((time_t *)&rtc[0]) = localt;
+        // Push the object ram image to the RTC ram image
+        bUpdated = rtc.commit();
+    }
+    
+    return bUpdated;
+}
+
+void rx_callback() {
+    while(serial4.readable()) {
+        if (index < BUF_SIZE) {
+            front[index] = serial4.getc();
+            index++;
+        } else {
+            front[0] = serial4.getc();
+            index = 1;
+        }
+    }
+}
+
+int main() {
+    front = buf1, back = buf2;
+    test = 0;
+    
+    SDFileSystem sd(DI, DO, SCK, CS, "sd");
+    while (sd.disk_status()) {
+        sd.disk_initialize();
+        wait(0.5);
+    }
+    
+    /*init RTC, get time and date for filename*/
+    I2C i2c1(I2C1_SDA, I2C1_SCL);
+    i2c1.frequency(100000);
+    RtcDs1307 rtc(i2c1);
+    
+    rtcUpdate(rtc, -(5*60*60));
+    DateTime dt = rtc.now();
+    printDT("It is now", dt);
+    
+    strcpy(fname, "/sd/log_");
+    sprintf(current_time, "%u.%u.%02u_%02u.%02u.%02u"
+        ,dt.month(),dt.day(),dt.year()
+        ,dt.hour(),dt.minute(),dt.second()
+    );    
+    strcat(fname, current_time);
+    strcat(fname, ".dat");
+    printf("Logging to %s\n", fname);
+    
+    FILE *fp = fopen(fname, "wb");
+    
+    /*init IMU*/
+    BNO055 imu(I2C2_SDA, I2C2_SCL);
+    imu.reset();
+    if (!imu.check()) {
+        printf("%s\n", "IMU not ready");  
+    } else {
+        printf("BNO055 found\r\n\r\n");
+        printf("Chip          ID: %03d\r\n",imu.ID.id);
+        printf("Accelerometer ID: %03d\r\n",imu.ID.accel);
+        printf("Gyroscope     ID: %03d\r\n",imu.ID.gyro);
+        printf("Magnetometer  ID: %03d\r\n\r\n",imu.ID.mag);
+        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);
+        
+    serial4.baud(BAUD_RATE);
+    serial4.attach(rx_callback);
+     
+    for (;;) {
+        if (index >= PAGE_SIZE-HEADER_SIZE) {
+            if (index > PAGE_SIZE-HEADER_SIZE) {
+                printf("%d\n", index);
+            }
+            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;
+        }
+    }
+}