High speed logging example
Dependencies: Adafruit_RTCLib BNO055 SDFileSystem mbed
main.cpp
- Committer:
- bwang
- Date:
- 2018-01-29
- Revision:
- 4:f3d3cb939d91
- Parent:
- 3:3bd4a5429b4e
File content as of revision 4:f3d3cb939d91:
#include "mbed.h" #include "SDFileSystem.h" #include "BNO055.h" #include "DS1307.h" #include "string.h" /*SD card*/ #define DI D11 #define DO D12 #define SCK D13 #define CS D10 /*RTC*/ #define I2C1_SDA PB_9 #define I2C1_SCL PB_8 RtcDs1307 *rtc; char fname[255]; char current_time[64]; /*IMU*/ #define I2C2_SDA D5 #define I2C2_SCL D7 /*Serial buffer*/ #define PAGE_SIZE 4096 #define HEADER_SIZE 10 #define CHUNK_SIZE (PAGE_SIZE-HEADER_SIZE) #define BUF_SIZE (16*PAGE_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'}; /*UART*/ #define BAUD_RATE 921600 Serial serial4(D8, D2); /*Test pins*/ DigitalOut test(PC_8); DigitalOut test2(PC_6); int flag=0, flag2=0; 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) { bool bUpdated = false; int64_t compiledTime = DateTime(__DATE__,__TIME__).unixtime(); time_t localt = DateTime(compiledTime + bias).unixtime(); if(*((time_t *)&rtc[0]) != localt) { rtc.adjust(localt); *((time_t *)&rtc[0]) = localt; bUpdated = rtc.commit(); } return bUpdated; } void rx_callback() { while(serial4.readable()) { buf[end] = serial4.getc(); end++; if (end == BUF_SIZE) end = 0; } } int main() { /*init SD card, wait for card insertion*/ 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); rtc = new RtcDs1307(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); /*init serial*/ serial4.baud(BAUD_RATE); serial4.attach(rx_callback); for (;;) { 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); } fflush(fp); start += CHUNK_SIZE; if (start >= BUF_SIZE) start -= BUF_SIZE; } } }