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 Jul 11 07:06:04 2018 -0400
Revision:
13:91350588d530
Parent:
12:c09a50d9469a
added /fs/ to be able to actually read and write to text file denoting log number

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 12:c09a50d9469a 65 void SDCardReader::write_uint16_t(uint16_t in_data, bool endline, FILE* fileToUse){
DVLevine 1:45627bbdeb69 66 FILE *f = fileToUse;
DVLevine 1:45627bbdeb69 67 printf("%s\n", (!f ? "Fail :(" : "OK"));
DVLevine 12:c09a50d9469a 68
DVLevine 12:c09a50d9469a 69 int16_t data = (int16_t)in_data;
DVLevine 1:45627bbdeb69 70
DVLevine 5:0a4ff027086c 71 //printf("\rWriting 16 bit value: % " PRIu16 " ", data);
DVLevine 5:0a4ff027086c 72 printf("\rWriting 16 bit value %i ", static_cast<int>(data));
DVLevine 1:45627bbdeb69 73 fflush(stdout);
DVLevine 1:45627bbdeb69 74
DVLevine 4:fe6d2823b7cb 75 int err = 0;
DVLevine 1:45627bbdeb69 76 //write and check for error
DVLevine 1:45627bbdeb69 77 if (endline){
DVLevine 5:0a4ff027086c 78 err = fprintf(f,"%i\n",static_cast<int>(data));
DVLevine 5:0a4ff027086c 79 //err = fprintf(f,"%" PRIu16 "\n",data);
DVLevine 1:45627bbdeb69 80 }else{
DVLevine 5:0a4ff027086c 81 err = fprintf(f,"%i " ,static_cast<int>(data));
DVLevine 1:45627bbdeb69 82 }
DVLevine 1:45627bbdeb69 83
DVLevine 1:45627bbdeb69 84 if (err < 0) {
DVLevine 1:45627bbdeb69 85 printf("Fail :(\n");
DVLevine 1:45627bbdeb69 86 error("error: %s (%d)\n", strerror(errno), -errno);
DVLevine 1:45627bbdeb69 87 }
DVLevine 1:45627bbdeb69 88 }
DVLevine 1:45627bbdeb69 89
DVLevine 1:45627bbdeb69 90
DVLevine 1:45627bbdeb69 91 void SDCardReader::write_uint32_t(uint32_t data, bool endline, FILE* fileToUse){
DVLevine 1:45627bbdeb69 92 FILE *f = fileToUse;
DVLevine 1:45627bbdeb69 93 printf("%s\n", (!f ? "Fail :(" : "OK"));
DVLevine 4:fe6d2823b7cb 94
DVLevine 5:0a4ff027086c 95 //printf("\rWriting 32 bit value: %" PRIu32 " ", data);
DVLevine 5:0a4ff027086c 96 printf("\rWriting 32 bit value %i ", static_cast<int>(data));
DVLevine 1:45627bbdeb69 97 fflush(stdout);
DVLevine 1:45627bbdeb69 98
DVLevine 4:fe6d2823b7cb 99 int err = 0;
DVLevine 1:45627bbdeb69 100 //write and check for error
DVLevine 1:45627bbdeb69 101 if (endline){
DVLevine 5:0a4ff027086c 102 //err = fprintf(f,"%" PRIu32 "\n",data);
DVLevine 5:0a4ff027086c 103 err = fprintf(f,"%i\n",static_cast<int>(data));
DVLevine 1:45627bbdeb69 104 }else{
DVLevine 5:0a4ff027086c 105 err = fprintf(f,"%i ",static_cast<int>(data));
DVLevine 1:45627bbdeb69 106 }
DVLevine 1:45627bbdeb69 107
DVLevine 1:45627bbdeb69 108 if (err < 0) {
DVLevine 1:45627bbdeb69 109 printf("Fail :(\n");
DVLevine 1:45627bbdeb69 110 error("error: %s (%d)\n", strerror(errno), -errno);
DVLevine 1:45627bbdeb69 111 }
DVLevine 1:45627bbdeb69 112 }
DVLevine 1:45627bbdeb69 113
DVLevine 1:45627bbdeb69 114
DVLevine 1:45627bbdeb69 115 void SDCardReader::closeFile(FILE* fileToClose){
DVLevine 1:45627bbdeb69 116 // Close the file which also flushes any cached writes
DVLevine 1:45627bbdeb69 117 printf("Closing file...");
DVLevine 1:45627bbdeb69 118 fflush(stdout);
DVLevine 4:fe6d2823b7cb 119
DVLevine 4:fe6d2823b7cb 120 int err = 0;
DVLevine 1:45627bbdeb69 121 err = fclose(fileToClose);
DVLevine 1:45627bbdeb69 122 printf("%s\n", (err < 0 ? "Fail :(" : "OK"));
DVLevine 1:45627bbdeb69 123 if (err < 0) {
DVLevine 1:45627bbdeb69 124 error("error: %s (%d)\n", strerror(errno), -errno);
DVLevine 1:45627bbdeb69 125 }
DVLevine 1:45627bbdeb69 126 }
DVLevine 1:45627bbdeb69 127
DVLevine 5:0a4ff027086c 128 int SDCardReader::fullWriteProcedure(string filename,vector<int> indexArr, vector<uint32_t> timeArr, vector<vector <uint16_t> > allData){
DVLevine 1:45627bbdeb69 129 mountFileSystem();
DVLevine 1:45627bbdeb69 130 FILE* theFile = openFile(filename);
DVLevine 1:45627bbdeb69 131
DVLevine 5:0a4ff027086c 132 printf("The size of indexArr is %i \n",indexArr.size());
DVLevine 5:0a4ff027086c 133
DVLevine 5:0a4ff027086c 134 for (unsigned int i = 0; i< indexArr.size(); i++){
DVLevine 1:45627bbdeb69 135 writeDataPoint(theFile,indexArr[i],timeArr[i], allData[i]);
DVLevine 1:45627bbdeb69 136 }
DVLevine 1:45627bbdeb69 137
DVLevine 1:45627bbdeb69 138 closeFile(theFile);
DVLevine 1:45627bbdeb69 139 unmountFileSystem();
DVLevine 1:45627bbdeb69 140
DVLevine 1:45627bbdeb69 141 return 1;
DVLevine 0:ebe71c7e7854 142 }
DVLevine 0:ebe71c7e7854 143
DVLevine 0:ebe71c7e7854 144 //use circular buffers instead of strings
DVLevine 1:45627bbdeb69 145 //write as 1st column, index. 2nd column timestamp. 3rd column data1. 4th data2. etc.
DVLevine 1:45627bbdeb69 146 //pass in array of circular buffers
DVLevine 5:0a4ff027086c 147 int SDCardReader::writeDataPoint(FILE* theFile, int index, uint32_t timestamp, vector<uint16_t> data){
DVLevine 1:45627bbdeb69 148 // FILE* theFile = openFile(filename);
DVLevine 1:45627bbdeb69 149
DVLevine 1:45627bbdeb69 150 //write index
DVLevine 1:45627bbdeb69 151 write_uint16_t(index, false, theFile);
DVLevine 1:45627bbdeb69 152 //write timestamp
DVLevine 1:45627bbdeb69 153 write_uint32_t(timestamp, false, theFile);
DVLevine 1:45627bbdeb69 154
DVLevine 1:45627bbdeb69 155 //write data
DVLevine 5:0a4ff027086c 156 for (unsigned int i = 0; i < data.size()-1; i++) {
DVLevine 1:45627bbdeb69 157 write_uint16_t(data[i], false, theFile);
DVLevine 1:45627bbdeb69 158 }
DVLevine 6:a36eda5701df 159 write_uint16_t(data[data.size()-1], true, theFile);
DVLevine 5:0a4ff027086c 160 return 0;
DVLevine 0:ebe71c7e7854 161 }
DVLevine 0:ebe71c7e7854 162
DVLevine 0:ebe71c7e7854 163 int SDCardReader::eraseData(){
DVLevine 0:ebe71c7e7854 164 printf("Initializing the block device... ");
DVLevine 0:ebe71c7e7854 165 fflush(stdout);
DVLevine 4:fe6d2823b7cb 166 int err = this->init();
DVLevine 0:ebe71c7e7854 167 printf("%s\n", (err ? "Fail :(" : "OK"));
DVLevine 0:ebe71c7e7854 168 if (err) {
DVLevine 0:ebe71c7e7854 169 error("error: %s (%d)\n", strerror(-err), err);
DVLevine 0:ebe71c7e7854 170 }
DVLevine 0:ebe71c7e7854 171
DVLevine 0:ebe71c7e7854 172 printf("Erasing the block device... ");
DVLevine 0:ebe71c7e7854 173 fflush(stdout);
DVLevine 4:fe6d2823b7cb 174 err = this->erase(0, this->size());
DVLevine 0:ebe71c7e7854 175 printf("%s\n", (err ? "Fail :(" : "OK"));
DVLevine 0:ebe71c7e7854 176 if (err) {
DVLevine 0:ebe71c7e7854 177 error("error: %s (%d)\n", strerror(-err), err);
DVLevine 0:ebe71c7e7854 178 }
DVLevine 0:ebe71c7e7854 179
DVLevine 0:ebe71c7e7854 180 printf("Deinitializing the block device... ");
DVLevine 0:ebe71c7e7854 181 fflush(stdout);
DVLevine 4:fe6d2823b7cb 182 err = this->deinit();
DVLevine 0:ebe71c7e7854 183 printf("%s\n", (err ? "Fail :(" : "OK"));
DVLevine 0:ebe71c7e7854 184 if (err) {
DVLevine 0:ebe71c7e7854 185 error("error: %s (%d)\n", strerror(-err), err);
DVLevine 0:ebe71c7e7854 186 }
DVLevine 4:fe6d2823b7cb 187
DVLevine 4:fe6d2823b7cb 188 return err;
DVLevine 12:c09a50d9469a 189 }
DVLevine 12:c09a50d9469a 190
DVLevine 12:c09a50d9469a 191 //Methods for reading sdcard files. Mostly to read off trial numbers
DVLevine 12:c09a50d9469a 192 int SDCardReader::readAndIncrement(string filename){
DVLevine 12:c09a50d9469a 193 mountFileSystem();
DVLevine 12:c09a50d9469a 194
DVLevine 12:c09a50d9469a 195 FILE* theFile = openFile(filename);
DVLevine 12:c09a50d9469a 196 // Get current stream position
DVLevine 12:c09a50d9469a 197 long pos = ftell(theFile);
DVLevine 12:c09a50d9469a 198 // Parse out the number
DVLevine 12:c09a50d9469a 199 int32_t number;
DVLevine 12:c09a50d9469a 200 int32_t presentNumber;
DVLevine 12:c09a50d9469a 201
DVLevine 12:c09a50d9469a 202 fscanf(theFile, "%d", &number);
DVLevine 12:c09a50d9469a 203 presentNumber = number;
DVLevine 12:c09a50d9469a 204 number += 1;
DVLevine 12:c09a50d9469a 205 //read lone value as int, return it
DVLevine 12:c09a50d9469a 206 // Seek to beginning of number
DVLevine 12:c09a50d9469a 207 fseek(theFile, pos, SEEK_SET);
DVLevine 12:c09a50d9469a 208 // Store number
DVLevine 12:c09a50d9469a 209 fprintf(theFile, "%d\n", number);
DVLevine 12:c09a50d9469a 210 // Flush between write and read on same file
DVLevine 12:c09a50d9469a 211 fflush(theFile);
DVLevine 12:c09a50d9469a 212
DVLevine 12:c09a50d9469a 213 closeFile(theFile);
DVLevine 12:c09a50d9469a 214 unmountFileSystem();
DVLevine 12:c09a50d9469a 215 return (int)presentNumber;
DVLevine 12:c09a50d9469a 216 }
DVLevine 4:fe6d2823b7cb 217