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 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?

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 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