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