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:
Wed Apr 04 17:15:36 2018 -0400
Revision:
3:df8fb1b5d868
Parent:
1:45627bbdeb69
Child:
4:fe6d2823b7cb
Corrected a lot of small errors. Stil some more left.

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 3:df8fb1b5d868 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 3:df8fb1b5d868 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 3:df8fb1b5d868 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