A set of data recording functions to locally store data in a circular buffer, with functions for offloading to an SD Card when convenient. dataRecorderr.h shows accessible functions to the main program - all direct SD operations are abstracted away by the library. When using this library, #include dataRecorder.h

Dependencies:   sd-driver_compatible_with_MAX32630FTHR

Fork of CircularBufferSDCardLib by Daniel Levine

Committer:
DVLevine
Date:
Thu Apr 05 01:22:57 2018 -0400
Revision:
4:fe6d2823b7cb
Parent:
3:df8fb1b5d868
Child:
5:0a4ff027086c
Finished fixing bug pieces but no print statement.....

Who changed what in which revision?

UserRevisionLine numberNew contents of line
DVLevine 0:ebe71c7e7854 1 #include "sdCardReader.h"
DVLevine 0:ebe71c7e7854 2
DVLevine 1:45627bbdeb69 3
DVLevine 4:fe6d2823b7cb 4 //helpers
DVLevine 4:fe6d2823b7cb 5 int getSize(int* p){
DVLevine 4:fe6d2823b7cb 6 return (sizeof(p)/sizeof(*p));
DVLevine 4:fe6d2823b7cb 7 }
DVLevine 4:fe6d2823b7cb 8
DVLevine 4:fe6d2823b7cb 9 int getSize(uint16_t* p){
DVLevine 4:fe6d2823b7cb 10 return (sizeof(p)/sizeof(*p));
DVLevine 4:fe6d2823b7cb 11 }
DVLevine 4:fe6d2823b7cb 12
DVLevine 1:45627bbdeb69 13 //private essential methods
DVLevine 1:45627bbdeb69 14 // Try to mount the filesystem
DVLevine 1:45627bbdeb69 15 void SDCardReader::mountFileSystem(){
DVLevine 1:45627bbdeb69 16 printf("Mounting the filesystem... ");
DVLevine 1:45627bbdeb69 17 fflush(stdout);
DVLevine 4:fe6d2823b7cb 18 int err = m_fs->mount(this);
DVLevine 1:45627bbdeb69 19 printf("%s\n", (err ? "Fail :(" : "OK"));
DVLevine 1:45627bbdeb69 20 if (err) {
DVLevine 1:45627bbdeb69 21 // Reformat if we can't mount the filesystem
DVLevine 1:45627bbdeb69 22 // this should only happen on the first boot
DVLevine 1:45627bbdeb69 23 printf("No filesystem found, formatting... ");
DVLevine 1:45627bbdeb69 24 fflush(stdout);
DVLevine 4:fe6d2823b7cb 25 err = m_fs->reformat(this);
DVLevine 1:45627bbdeb69 26 printf("%s\n", (err ? "Fail :(" : "OK"));
DVLevine 1:45627bbdeb69 27 if (err) {
DVLevine 1:45627bbdeb69 28 error("error: %s (%d)\n", strerror(-err), err);
DVLevine 1:45627bbdeb69 29 }
DVLevine 1:45627bbdeb69 30 }
DVLevine 1:45627bbdeb69 31 }
DVLevine 1:45627bbdeb69 32
DVLevine 1:45627bbdeb69 33 void SDCardReader::unmountFileSystem(){
DVLevine 1:45627bbdeb69 34 printf("Unmounting... ");
DVLevine 1:45627bbdeb69 35 fflush(stdout);
DVLevine 4:fe6d2823b7cb 36 int err = m_fs->unmount();
DVLevine 1:45627bbdeb69 37 printf("%s\n", (err < 0 ? "Fail :(" : "OK"));
DVLevine 1:45627bbdeb69 38 if (err < 0) {
DVLevine 1:45627bbdeb69 39 error("error: %s (%d)\n", strerror(-err), err);
DVLevine 1:45627bbdeb69 40 }
DVLevine 1:45627bbdeb69 41 }
DVLevine 0:ebe71c7e7854 42
DVLevine 0:ebe71c7e7854 43
DVLevine 1:45627bbdeb69 44 FILE* SDCardReader::openFile(string filename){
DVLevine 4:fe6d2823b7cb 45 printf("Opening \"/fs/%s\"... ",filename.c_str());
DVLevine 1:45627bbdeb69 46 fflush(stdout);
DVLevine 4:fe6d2823b7cb 47 FILE *f = fopen(filename.c_str(), "r+");
DVLevine 1:45627bbdeb69 48 printf("%s\n", (!f ? "Fail :(" : "OK"));
DVLevine 1:45627bbdeb69 49 if (!f) {
DVLevine 1:45627bbdeb69 50 // Create the file if it doesn't exist
DVLevine 1:45627bbdeb69 51 printf("No file found, creating a new file... ");
DVLevine 1:45627bbdeb69 52 fflush(stdout);
DVLevine 4:fe6d2823b7cb 53 f = fopen(filename.c_str(), "w+");
DVLevine 1:45627bbdeb69 54 printf("%s\n", (!f ? "Fail :(" : "OK"));
DVLevine 1:45627bbdeb69 55 if (!f) {
DVLevine 1:45627bbdeb69 56 error("error: %s (%d)\n", strerror(errno), -errno);
DVLevine 0:ebe71c7e7854 57 }
DVLevine 1:45627bbdeb69 58 }
DVLevine 1:45627bbdeb69 59 return f;
DVLevine 1:45627bbdeb69 60 }
DVLevine 1:45627bbdeb69 61
DVLevine 1:45627bbdeb69 62 void SDCardReader::write_uint16_t(uint16_t data, bool endline, FILE* fileToUse){
DVLevine 1:45627bbdeb69 63 FILE *f = fileToUse;
DVLevine 1:45627bbdeb69 64 printf("%s\n", (!f ? "Fail :(" : "OK"));
DVLevine 1:45627bbdeb69 65
DVLevine 4:fe6d2823b7cb 66 printf("\rWriting 16 bit value: %" PRIu16, data);
DVLevine 1:45627bbdeb69 67 fflush(stdout);
DVLevine 1:45627bbdeb69 68
DVLevine 4:fe6d2823b7cb 69 int err = 0;
DVLevine 1:45627bbdeb69 70 //write and check for error
DVLevine 1:45627bbdeb69 71 if (endline){
DVLevine 4:fe6d2823b7cb 72 err = fprintf(f,"%" PRIu16 "\n",data);
DVLevine 1:45627bbdeb69 73 }else{
DVLevine 4:fe6d2823b7cb 74 err = fprintf(f,"%" PRIu16,data);
DVLevine 1:45627bbdeb69 75 }
DVLevine 1:45627bbdeb69 76
DVLevine 1:45627bbdeb69 77 if (err < 0) {
DVLevine 1:45627bbdeb69 78 printf("Fail :(\n");
DVLevine 1:45627bbdeb69 79 error("error: %s (%d)\n", strerror(errno), -errno);
DVLevine 1:45627bbdeb69 80 }
DVLevine 1:45627bbdeb69 81 }
DVLevine 1:45627bbdeb69 82
DVLevine 1:45627bbdeb69 83
DVLevine 1:45627bbdeb69 84 void SDCardReader::write_uint32_t(uint32_t data, bool endline, FILE* fileToUse){
DVLevine 1:45627bbdeb69 85 FILE *f = fileToUse;
DVLevine 1:45627bbdeb69 86 printf("%s\n", (!f ? "Fail :(" : "OK"));
DVLevine 4:fe6d2823b7cb 87
DVLevine 4:fe6d2823b7cb 88 printf("\rWriting 32 bit value: %" PRIu32, data);
DVLevine 4:fe6d2823b7cb 89 //printf("\rWriting datapoint %d", data);
DVLevine 1:45627bbdeb69 90 fflush(stdout);
DVLevine 1:45627bbdeb69 91
DVLevine 4:fe6d2823b7cb 92 int err = 0;
DVLevine 1:45627bbdeb69 93 //write and check for error
DVLevine 1:45627bbdeb69 94 if (endline){
DVLevine 4:fe6d2823b7cb 95 err = fprintf(f,"%" PRIu32 "\n",data);
DVLevine 1:45627bbdeb69 96 }else{
DVLevine 4:fe6d2823b7cb 97 err = fprintf(f,"%" PRIu32,data);
DVLevine 1:45627bbdeb69 98 }
DVLevine 1:45627bbdeb69 99
DVLevine 1:45627bbdeb69 100 if (err < 0) {
DVLevine 1:45627bbdeb69 101 printf("Fail :(\n");
DVLevine 1:45627bbdeb69 102 error("error: %s (%d)\n", strerror(errno), -errno);
DVLevine 1:45627bbdeb69 103 }
DVLevine 1:45627bbdeb69 104 }
DVLevine 1:45627bbdeb69 105
DVLevine 1:45627bbdeb69 106
DVLevine 1:45627bbdeb69 107 void SDCardReader::closeFile(FILE* fileToClose){
DVLevine 1:45627bbdeb69 108 // Close the file which also flushes any cached writes
DVLevine 1:45627bbdeb69 109 printf("Closing file...");
DVLevine 1:45627bbdeb69 110 fflush(stdout);
DVLevine 4:fe6d2823b7cb 111
DVLevine 4:fe6d2823b7cb 112 int err = 0;
DVLevine 1:45627bbdeb69 113 err = fclose(fileToClose);
DVLevine 1:45627bbdeb69 114 printf("%s\n", (err < 0 ? "Fail :(" : "OK"));
DVLevine 1:45627bbdeb69 115 if (err < 0) {
DVLevine 1:45627bbdeb69 116 error("error: %s (%d)\n", strerror(errno), -errno);
DVLevine 1:45627bbdeb69 117 }
DVLevine 1:45627bbdeb69 118 }
DVLevine 1:45627bbdeb69 119
DVLevine 1:45627bbdeb69 120 int SDCardReader::fullWriteProcedure(string filename,int* indexArr, uint32_t* timeArr, uint16_t** allData){
DVLevine 1:45627bbdeb69 121 mountFileSystem();
DVLevine 1:45627bbdeb69 122 FILE* theFile = openFile(filename);
DVLevine 1:45627bbdeb69 123
DVLevine 4:fe6d2823b7cb 124 for (int i = 0; i<getSize(indexArr); i++){
DVLevine 1:45627bbdeb69 125 writeDataPoint(theFile,indexArr[i],timeArr[i], allData[i]);
DVLevine 1:45627bbdeb69 126 }
DVLevine 1:45627bbdeb69 127
DVLevine 1:45627bbdeb69 128 closeFile(theFile);
DVLevine 1:45627bbdeb69 129 unmountFileSystem();
DVLevine 1:45627bbdeb69 130
DVLevine 1:45627bbdeb69 131 return 1;
DVLevine 0:ebe71c7e7854 132 }
DVLevine 0:ebe71c7e7854 133
DVLevine 0:ebe71c7e7854 134 //use circular buffers instead of strings
DVLevine 1:45627bbdeb69 135 //write as 1st column, index. 2nd column timestamp. 3rd column data1. 4th data2. etc.
DVLevine 1:45627bbdeb69 136 //pass in array of circular buffers
DVLevine 1:45627bbdeb69 137 int SDCardReader::writeDataPoint(FILE* theFile, int index, uint32_t timestamp, uint16_t* data){
DVLevine 1:45627bbdeb69 138 // FILE* theFile = openFile(filename);
DVLevine 1:45627bbdeb69 139
DVLevine 1:45627bbdeb69 140 //write index
DVLevine 1:45627bbdeb69 141 write_uint16_t(index, false, theFile);
DVLevine 1:45627bbdeb69 142 //write timestamp
DVLevine 1:45627bbdeb69 143 write_uint32_t(timestamp, false, theFile);
DVLevine 1:45627bbdeb69 144
DVLevine 1:45627bbdeb69 145 //write data
DVLevine 4:fe6d2823b7cb 146 for (int i = 0; i < getSize(data)-1; i++) {
DVLevine 1:45627bbdeb69 147 write_uint16_t(data[i], false, theFile);
DVLevine 1:45627bbdeb69 148 }
DVLevine 4:fe6d2823b7cb 149 write_uint16_t(data[getSize(data)], false, theFile);
DVLevine 1:45627bbdeb69 150
DVLevine 1:45627bbdeb69 151 closeFile(theFile);
DVLevine 1:45627bbdeb69 152
DVLevine 1:45627bbdeb69 153 // call the SDBlockDevice instance de-initialisation method.
DVLevine 0:ebe71c7e7854 154 this->deinit();
DVLevine 0:ebe71c7e7854 155
DVLevine 0:ebe71c7e7854 156 return 0;
DVLevine 0:ebe71c7e7854 157 }
DVLevine 0:ebe71c7e7854 158
DVLevine 0:ebe71c7e7854 159 int SDCardReader::eraseData(){
DVLevine 0:ebe71c7e7854 160 printf("Initializing the block device... ");
DVLevine 0:ebe71c7e7854 161 fflush(stdout);
DVLevine 4:fe6d2823b7cb 162 int err = this->init();
DVLevine 0:ebe71c7e7854 163 printf("%s\n", (err ? "Fail :(" : "OK"));
DVLevine 0:ebe71c7e7854 164 if (err) {
DVLevine 0:ebe71c7e7854 165 error("error: %s (%d)\n", strerror(-err), err);
DVLevine 0:ebe71c7e7854 166 }
DVLevine 0:ebe71c7e7854 167
DVLevine 0:ebe71c7e7854 168 printf("Erasing the block device... ");
DVLevine 0:ebe71c7e7854 169 fflush(stdout);
DVLevine 4:fe6d2823b7cb 170 err = this->erase(0, this->size());
DVLevine 0:ebe71c7e7854 171 printf("%s\n", (err ? "Fail :(" : "OK"));
DVLevine 0:ebe71c7e7854 172 if (err) {
DVLevine 0:ebe71c7e7854 173 error("error: %s (%d)\n", strerror(-err), err);
DVLevine 0:ebe71c7e7854 174 }
DVLevine 0:ebe71c7e7854 175
DVLevine 0:ebe71c7e7854 176 printf("Deinitializing the block device... ");
DVLevine 0:ebe71c7e7854 177 fflush(stdout);
DVLevine 4:fe6d2823b7cb 178 err = this->deinit();
DVLevine 0:ebe71c7e7854 179 printf("%s\n", (err ? "Fail :(" : "OK"));
DVLevine 0:ebe71c7e7854 180 if (err) {
DVLevine 0:ebe71c7e7854 181 error("error: %s (%d)\n", strerror(-err), err);
DVLevine 0:ebe71c7e7854 182 }
DVLevine 4:fe6d2823b7cb 183
DVLevine 4:fe6d2823b7cb 184 return err;
DVLevine 1:45627bbdeb69 185 }
DVLevine 4:fe6d2823b7cb 186