High speed logging example
Dependencies: Adafruit_RTCLib BNO055 SDFileSystem mbed
main.cpp@0:2953603cfeee, 2018-01-22 (annotated)
- 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?
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 | 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 | } |