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:
Tue Apr 03 22:41:46 2018 -0400
Revision:
1:45627bbdeb69
Parent:
0:ebe71c7e7854
Child:
3:df8fb1b5d868
Heavily revised and refactored code. SDCardReader class should be about pat, before reviewing syntax bugs. DataRecorder needs to be fleshed out using SDCardReader Implementation.

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