High speed logging example

Dependencies:   Adafruit_RTCLib BNO055 SDFileSystem mbed

Committer:
bwang
Date:
Mon Jan 22 23:32:54 2018 +0000
Revision:
0:2953603cfeee
Child:
1:27070bac59e5
broken double buffered version

Who changed what in which revision?

UserRevisionLine numberNew contents of line
bwang 0:2953603cfeee 1 #include "mbed.h"
bwang 0:2953603cfeee 2 #include "SDFileSystem.h"
bwang 0:2953603cfeee 3 #include "BNO055.h"
bwang 0:2953603cfeee 4 #include "DS1307.h"
bwang 0:2953603cfeee 5 #include "string.h"
bwang 0:2953603cfeee 6
bwang 0:2953603cfeee 7 #define DI D11
bwang 0:2953603cfeee 8 #define DO D12
bwang 0:2953603cfeee 9 #define SCK D13
bwang 0:2953603cfeee 10 #define CS D10
bwang 0:2953603cfeee 11
bwang 0:2953603cfeee 12 #define I2C1_SDA PB_9
bwang 0:2953603cfeee 13 #define I2C1_SCL PB_8
bwang 0:2953603cfeee 14
bwang 0:2953603cfeee 15 #define I2C2_SDA D5
bwang 0:2953603cfeee 16 #define I2C2_SCL D7
bwang 0:2953603cfeee 17
bwang 0:2953603cfeee 18 #define PAGE_SIZE 4096
bwang 0:2953603cfeee 19 #define HEADER_SIZE 10
bwang 0:2953603cfeee 20 #define PACKET_SIZE 8
bwang 0:2953603cfeee 21 #define BAUD_RATE 921600
bwang 0:2953603cfeee 22 #define BUF_SIZE (3*PAGE_SIZE)
bwang 0:2953603cfeee 23
bwang 0:2953603cfeee 24 Serial serial4(D8, D2);
bwang 0:2953603cfeee 25 DigitalOut test(PC_8);
bwang 0:2953603cfeee 26 DigitalOut test2(PC_6);
bwang 0:2953603cfeee 27 int flag=0, flag2=0;
bwang 0:2953603cfeee 28
bwang 0:2953603cfeee 29 char fname[255];
bwang 0:2953603cfeee 30 char current_time[64];
bwang 0:2953603cfeee 31
bwang 0:2953603cfeee 32 int index = 0;
bwang 0:2953603cfeee 33 unsigned char *front, *back, *tmp;
bwang 0:2953603cfeee 34 unsigned char buf1[BUF_SIZE], buf2[BUF_SIZE];
bwang 0:2953603cfeee 35 unsigned char hdr[HEADER_SIZE] = {0xff, 0xff,'M','A','N','B','L','O','R','T'};
bwang 0:2953603cfeee 36
bwang 0:2953603cfeee 37 void printDT(char *pre, DateTime &dt)
bwang 0:2953603cfeee 38 {
bwang 0:2953603cfeee 39 printf("%s %u/%u/%02u %2u:%02u:%02u\r\n"
bwang 0:2953603cfeee 40 ,pre
bwang 0:2953603cfeee 41 ,dt.month(),dt.day(),dt.year()
bwang 0:2953603cfeee 42 ,dt.hour(),dt.minute(),dt.second()
bwang 0:2953603cfeee 43 );
bwang 0:2953603cfeee 44 }
bwang 0:2953603cfeee 45
bwang 0:2953603cfeee 46 bool rtcUpdate(RtcDs1307 &rtc, int32_t bias) // this must be signed
bwang 0:2953603cfeee 47 { bool bUpdated = false;
bwang 0:2953603cfeee 48
bwang 0:2953603cfeee 49 // Use the compiled date/time as a basis for setting the clock.
bwang 0:2953603cfeee 50 // We assign it to a signed integer so that negative biases work correctly
bwang 0:2953603cfeee 51 int64_t compiledTime = DateTime(__DATE__,__TIME__).unixtime();
bwang 0:2953603cfeee 52
bwang 0:2953603cfeee 53 // This assumes that the program is run VERY soon after the initial compile.
bwang 0:2953603cfeee 54 time_t localt = DateTime(compiledTime + bias).unixtime(); // offset by bias
bwang 0:2953603cfeee 55
bwang 0:2953603cfeee 56 // If the stored static time stamp does not equal the compiled time stamp,
bwang 0:2953603cfeee 57 // then we need to update the RTC clock and the stored time stamp
bwang 0:2953603cfeee 58 if(*((time_t *)&rtc[0]) != localt)
bwang 0:2953603cfeee 59 {
bwang 0:2953603cfeee 60 // Update the RTC time as local time, not GMT/UTC
bwang 0:2953603cfeee 61 rtc.adjust(localt);
bwang 0:2953603cfeee 62 // Store the new compiled time statically in the object ram image
bwang 0:2953603cfeee 63 *((time_t *)&rtc[0]) = localt;
bwang 0:2953603cfeee 64 // Push the object ram image to the RTC ram image
bwang 0:2953603cfeee 65 bUpdated = rtc.commit();
bwang 0:2953603cfeee 66 }
bwang 0:2953603cfeee 67
bwang 0:2953603cfeee 68 return bUpdated;
bwang 0:2953603cfeee 69 }
bwang 0:2953603cfeee 70
bwang 0:2953603cfeee 71 void rx_callback() {
bwang 0:2953603cfeee 72 while(serial4.readable()) {
bwang 0:2953603cfeee 73 if (index < BUF_SIZE) {
bwang 0:2953603cfeee 74 front[index] = serial4.getc();
bwang 0:2953603cfeee 75 index++;
bwang 0:2953603cfeee 76 } else {
bwang 0:2953603cfeee 77 front[0] = serial4.getc();
bwang 0:2953603cfeee 78 index = 1;
bwang 0:2953603cfeee 79 }
bwang 0:2953603cfeee 80 }
bwang 0:2953603cfeee 81 }
bwang 0:2953603cfeee 82
bwang 0:2953603cfeee 83 int main() {
bwang 0:2953603cfeee 84 front = buf1, back = buf2;
bwang 0:2953603cfeee 85 test = 0;
bwang 0:2953603cfeee 86
bwang 0:2953603cfeee 87 SDFileSystem sd(DI, DO, SCK, CS, "sd");
bwang 0:2953603cfeee 88 while (sd.disk_status()) {
bwang 0:2953603cfeee 89 sd.disk_initialize();
bwang 0:2953603cfeee 90 wait(0.5);
bwang 0:2953603cfeee 91 }
bwang 0:2953603cfeee 92
bwang 0:2953603cfeee 93 /*init RTC, get time and date for filename*/
bwang 0:2953603cfeee 94 I2C i2c1(I2C1_SDA, I2C1_SCL);
bwang 0:2953603cfeee 95 i2c1.frequency(100000);
bwang 0:2953603cfeee 96 RtcDs1307 rtc(i2c1);
bwang 0:2953603cfeee 97
bwang 0:2953603cfeee 98 rtcUpdate(rtc, -(5*60*60));
bwang 0:2953603cfeee 99 DateTime dt = rtc.now();
bwang 0:2953603cfeee 100 printDT("It is now", dt);
bwang 0:2953603cfeee 101
bwang 0:2953603cfeee 102 strcpy(fname, "/sd/log_");
bwang 0:2953603cfeee 103 sprintf(current_time, "%u.%u.%02u_%02u.%02u.%02u"
bwang 0:2953603cfeee 104 ,dt.month(),dt.day(),dt.year()
bwang 0:2953603cfeee 105 ,dt.hour(),dt.minute(),dt.second()
bwang 0:2953603cfeee 106 );
bwang 0:2953603cfeee 107 strcat(fname, current_time);
bwang 0:2953603cfeee 108 strcat(fname, ".dat");
bwang 0:2953603cfeee 109 printf("Logging to %s\n", fname);
bwang 0:2953603cfeee 110
bwang 0:2953603cfeee 111 FILE *fp = fopen(fname, "wb");
bwang 0:2953603cfeee 112
bwang 0:2953603cfeee 113 /*init IMU*/
bwang 0:2953603cfeee 114 BNO055 imu(I2C2_SDA, I2C2_SCL);
bwang 0:2953603cfeee 115 imu.reset();
bwang 0:2953603cfeee 116 if (!imu.check()) {
bwang 0:2953603cfeee 117 printf("%s\n", "IMU not ready");
bwang 0:2953603cfeee 118 } else {
bwang 0:2953603cfeee 119 printf("BNO055 found\r\n\r\n");
bwang 0:2953603cfeee 120 printf("Chip ID: %03d\r\n",imu.ID.id);
bwang 0:2953603cfeee 121 printf("Accelerometer ID: %03d\r\n",imu.ID.accel);
bwang 0:2953603cfeee 122 printf("Gyroscope ID: %03d\r\n",imu.ID.gyro);
bwang 0:2953603cfeee 123 printf("Magnetometer ID: %03d\r\n\r\n",imu.ID.mag);
bwang 0:2953603cfeee 124 printf("Firmware version v%d.%0d\r\n",imu.ID.sw[0],imu.ID.sw[1]);
bwang 0:2953603cfeee 125 printf("Bootloader version v%d\r\n\r\n",imu.ID.bootload);
bwang 0:2953603cfeee 126 }
bwang 0:2953603cfeee 127 imu.setmode(OPERATION_MODE_NDOF);
bwang 0:2953603cfeee 128 imu.set_accel_units(MPERSPERS);
bwang 0:2953603cfeee 129
bwang 0:2953603cfeee 130 serial4.baud(BAUD_RATE);
bwang 0:2953603cfeee 131 serial4.attach(rx_callback);
bwang 0:2953603cfeee 132
bwang 0:2953603cfeee 133 for (;;) {
bwang 0:2953603cfeee 134 if (index >= PAGE_SIZE-HEADER_SIZE) {
bwang 0:2953603cfeee 135 if (index > PAGE_SIZE-HEADER_SIZE) {
bwang 0:2953603cfeee 136 printf("%d\n", index);
bwang 0:2953603cfeee 137 }
bwang 0:2953603cfeee 138 test2 = flag2;
bwang 0:2953603cfeee 139 flag2 = !flag2;
bwang 0:2953603cfeee 140 tmp = front;
bwang 0:2953603cfeee 141 front = back;
bwang 0:2953603cfeee 142 back = tmp;
bwang 0:2953603cfeee 143 index = 0;
bwang 0:2953603cfeee 144 test = 1;
bwang 0:2953603cfeee 145 fwrite(hdr, 1, HEADER_SIZE, fp);
bwang 0:2953603cfeee 146 fwrite(back, 1, PAGE_SIZE-HEADER_SIZE, fp);
bwang 0:2953603cfeee 147 fflush(fp);
bwang 0:2953603cfeee 148 test = 0;
bwang 0:2953603cfeee 149 }
bwang 0:2953603cfeee 150 }
bwang 0:2953603cfeee 151 }