High speed logging example

Dependencies:   Adafruit_RTCLib BNO055 SDFileSystem mbed

Committer:
bwang
Date:
Mon Jan 29 09:43:43 2018 +0000
Revision:
4:f3d3cb939d91
Parent:
3:3bd4a5429b4e
first published 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 2:aaa32a8342ab 7 /*SD card*/
bwang 0:2953603cfeee 8 #define DI D11
bwang 0:2953603cfeee 9 #define DO D12
bwang 0:2953603cfeee 10 #define SCK D13
bwang 0:2953603cfeee 11 #define CS D10
bwang 0:2953603cfeee 12
bwang 2:aaa32a8342ab 13 /*RTC*/
bwang 0:2953603cfeee 14 #define I2C1_SDA PB_9
bwang 0:2953603cfeee 15 #define I2C1_SCL PB_8
bwang 0:2953603cfeee 16
bwang 3:3bd4a5429b4e 17 RtcDs1307 *rtc;
bwang 3:3bd4a5429b4e 18
bwang 2:aaa32a8342ab 19 char fname[255];
bwang 2:aaa32a8342ab 20 char current_time[64];
bwang 2:aaa32a8342ab 21
bwang 2:aaa32a8342ab 22 /*IMU*/
bwang 0:2953603cfeee 23 #define I2C2_SDA D5
bwang 0:2953603cfeee 24 #define I2C2_SCL D7
bwang 0:2953603cfeee 25
bwang 2:aaa32a8342ab 26 /*Serial buffer*/
bwang 0:2953603cfeee 27 #define PAGE_SIZE 4096
bwang 0:2953603cfeee 28 #define HEADER_SIZE 10
bwang 1:27070bac59e5 29 #define CHUNK_SIZE (PAGE_SIZE-HEADER_SIZE)
bwang 1:27070bac59e5 30 #define BUF_SIZE (16*PAGE_SIZE)
bwang 0:2953603cfeee 31
bwang 1:27070bac59e5 32 int start = 0, end = 0;
bwang 1:27070bac59e5 33 unsigned char buf[BUF_SIZE];
bwang 0:2953603cfeee 34 unsigned char hdr[HEADER_SIZE] = {0xff, 0xff,'M','A','N','B','L','O','R','T'};
bwang 0:2953603cfeee 35
bwang 2:aaa32a8342ab 36 /*UART*/
bwang 2:aaa32a8342ab 37 #define BAUD_RATE 921600
bwang 2:aaa32a8342ab 38 Serial serial4(D8, D2);
bwang 2:aaa32a8342ab 39
bwang 2:aaa32a8342ab 40 /*Test pins*/
bwang 2:aaa32a8342ab 41 DigitalOut test(PC_8);
bwang 2:aaa32a8342ab 42 DigitalOut test2(PC_6);
bwang 2:aaa32a8342ab 43 int flag=0, flag2=0;
bwang 2:aaa32a8342ab 44
bwang 2:aaa32a8342ab 45 void printDT(char *pre, DateTime &dt) {
bwang 0:2953603cfeee 46 printf("%s %u/%u/%02u %2u:%02u:%02u\r\n"
bwang 0:2953603cfeee 47 ,pre
bwang 0:2953603cfeee 48 ,dt.month(),dt.day(),dt.year()
bwang 0:2953603cfeee 49 ,dt.hour(),dt.minute(),dt.second()
bwang 0:2953603cfeee 50 );
bwang 0:2953603cfeee 51 }
bwang 0:2953603cfeee 52
bwang 2:aaa32a8342ab 53 bool rtcUpdate(RtcDs1307 &rtc, int32_t bias) {
bwang 2:aaa32a8342ab 54 bool bUpdated = false;
bwang 0:2953603cfeee 55 int64_t compiledTime = DateTime(__DATE__,__TIME__).unixtime();
bwang 0:2953603cfeee 56
bwang 2:aaa32a8342ab 57 time_t localt = DateTime(compiledTime + bias).unixtime();
bwang 0:2953603cfeee 58
bwang 2:aaa32a8342ab 59 if(*((time_t *)&rtc[0]) != localt) {
bwang 0:2953603cfeee 60 rtc.adjust(localt);
bwang 0:2953603cfeee 61 *((time_t *)&rtc[0]) = localt;
bwang 0:2953603cfeee 62 bUpdated = rtc.commit();
bwang 0:2953603cfeee 63 }
bwang 0:2953603cfeee 64
bwang 0:2953603cfeee 65 return bUpdated;
bwang 0:2953603cfeee 66 }
bwang 0:2953603cfeee 67
bwang 0:2953603cfeee 68 void rx_callback() {
bwang 0:2953603cfeee 69 while(serial4.readable()) {
bwang 1:27070bac59e5 70 buf[end] = serial4.getc();
bwang 1:27070bac59e5 71 end++;
bwang 1:27070bac59e5 72 if (end == BUF_SIZE) end = 0;
bwang 0:2953603cfeee 73 }
bwang 0:2953603cfeee 74 }
bwang 0:2953603cfeee 75
bwang 0:2953603cfeee 76 int main() {
bwang 2:aaa32a8342ab 77 /*init SD card, wait for card insertion*/
bwang 0:2953603cfeee 78 SDFileSystem sd(DI, DO, SCK, CS, "sd");
bwang 0:2953603cfeee 79 while (sd.disk_status()) {
bwang 0:2953603cfeee 80 sd.disk_initialize();
bwang 0:2953603cfeee 81 wait(0.5);
bwang 0:2953603cfeee 82 }
bwang 0:2953603cfeee 83
bwang 0:2953603cfeee 84 /*init RTC, get time and date for filename*/
bwang 0:2953603cfeee 85 I2C i2c1(I2C1_SDA, I2C1_SCL);
bwang 0:2953603cfeee 86 i2c1.frequency(100000);
bwang 3:3bd4a5429b4e 87 rtc = new RtcDs1307(i2c1);
bwang 0:2953603cfeee 88
bwang 3:3bd4a5429b4e 89 rtcUpdate(*rtc, -(5*60*60));
bwang 3:3bd4a5429b4e 90 DateTime dt = rtc->now();
bwang 0:2953603cfeee 91 printDT("It is now", dt);
bwang 0:2953603cfeee 92
bwang 0:2953603cfeee 93 strcpy(fname, "/sd/log_");
bwang 0:2953603cfeee 94 sprintf(current_time, "%u.%u.%02u_%02u.%02u.%02u"
bwang 0:2953603cfeee 95 ,dt.month(),dt.day(),dt.year()
bwang 0:2953603cfeee 96 ,dt.hour(),dt.minute(),dt.second()
bwang 0:2953603cfeee 97 );
bwang 0:2953603cfeee 98 strcat(fname, current_time);
bwang 0:2953603cfeee 99 strcat(fname, ".dat");
bwang 0:2953603cfeee 100 printf("Logging to %s\n", fname);
bwang 0:2953603cfeee 101
bwang 0:2953603cfeee 102 FILE *fp = fopen(fname, "wb");
bwang 0:2953603cfeee 103
bwang 0:2953603cfeee 104 /*init IMU*/
bwang 0:2953603cfeee 105 BNO055 imu(I2C2_SDA, I2C2_SCL);
bwang 0:2953603cfeee 106 imu.reset();
bwang 0:2953603cfeee 107 if (!imu.check()) {
bwang 0:2953603cfeee 108 printf("%s\n", "IMU not ready");
bwang 0:2953603cfeee 109 } else {
bwang 0:2953603cfeee 110 printf("BNO055 found\r\n\r\n");
bwang 0:2953603cfeee 111 printf("Chip ID: %03d\r\n",imu.ID.id);
bwang 0:2953603cfeee 112 printf("Accelerometer ID: %03d\r\n",imu.ID.accel);
bwang 0:2953603cfeee 113 printf("Gyroscope ID: %03d\r\n",imu.ID.gyro);
bwang 0:2953603cfeee 114 printf("Magnetometer ID: %03d\r\n\r\n",imu.ID.mag);
bwang 0:2953603cfeee 115 printf("Firmware version v%d.%0d\r\n",imu.ID.sw[0],imu.ID.sw[1]);
bwang 0:2953603cfeee 116 printf("Bootloader version v%d\r\n\r\n",imu.ID.bootload);
bwang 0:2953603cfeee 117 }
bwang 1:27070bac59e5 118
bwang 0:2953603cfeee 119 imu.setmode(OPERATION_MODE_NDOF);
bwang 0:2953603cfeee 120 imu.set_accel_units(MPERSPERS);
bwang 2:aaa32a8342ab 121
bwang 2:aaa32a8342ab 122 /*init serial*/
bwang 0:2953603cfeee 123 serial4.baud(BAUD_RATE);
bwang 0:2953603cfeee 124 serial4.attach(rx_callback);
bwang 0:2953603cfeee 125
bwang 0:2953603cfeee 126 for (;;) {
bwang 1:27070bac59e5 127 int length = end - start;
bwang 1:27070bac59e5 128 if (length < 0) length += BUF_SIZE;
bwang 1:27070bac59e5 129 if (length >= CHUNK_SIZE) {
bwang 1:27070bac59e5 130 fwrite(hdr, 1, HEADER_SIZE, fp);
bwang 1:27070bac59e5 131 if (start+CHUNK_SIZE-1 < BUF_SIZE) {
bwang 1:27070bac59e5 132 fwrite(buf+start, 1, CHUNK_SIZE, fp);
bwang 1:27070bac59e5 133 } else {
bwang 1:27070bac59e5 134 fwrite(buf+start, 1, BUF_SIZE-start+1, fp);
bwang 1:27070bac59e5 135 fwrite(buf, 1, CHUNK_SIZE-(BUF_SIZE-start+1), fp);
bwang 0:2953603cfeee 136 }
bwang 0:2953603cfeee 137 fflush(fp);
bwang 1:27070bac59e5 138 start += CHUNK_SIZE;
bwang 2:aaa32a8342ab 139 if (start >= BUF_SIZE) start -= BUF_SIZE;
bwang 0:2953603cfeee 140 }
bwang 0:2953603cfeee 141 }
bwang 0:2953603cfeee 142 }