High speed logging example

Dependencies:   Adafruit_RTCLib BNO055 SDFileSystem mbed

Files at this revision

API Documentation at this revision

Comitter:
bwang
Date:
Mon Jan 22 23:32:54 2018 +0000
Child:
1:27070bac59e5
Commit message:
broken double buffered version

Changed in this revision

Adafruit_RTCLib.lib Show annotated file Show diff for this revision Revisions of this file
BNO055.lib Show annotated file Show diff for this revision Revisions of this file
SDFileSystem.lib Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Adafruit_RTCLib.lib	Mon Jan 22 23:32:54 2018 +0000
@@ -0,0 +1,1 @@
+http://os.mbed.com/users/nkhorman/code/Adafruit_RTCLib/#2c4e81ecda67
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/BNO055.lib	Mon Jan 22 23:32:54 2018 +0000
@@ -0,0 +1,1 @@
+http://os.mbed.com/users/StressedDave/code/BNO055/#1f722ffec323
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/SDFileSystem.lib	Mon Jan 22 23:32:54 2018 +0000
@@ -0,0 +1,1 @@
+http://os.mbed.com/users/mbed_official/code/SDFileSystem/#205da3832a79
--- /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;
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Mon Jan 22 23:32:54 2018 +0000
@@ -0,0 +1,1 @@
+https://os.mbed.com/users/mbed_official/code/mbed/builds/ba1f97679dad
\ No newline at end of file