High speed logging example
Dependencies: Adafruit_RTCLib BNO055 SDFileSystem mbed
main.cpp@4:f3d3cb939d91, 2018-01-29 (annotated)
- 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?
User | Revision | Line number | New 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 | } |