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
sdCardReader.cpp@1:45627bbdeb69, 2018-04-03 (annotated)
- 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?
User | Revision | Line number | New 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 |