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:21:25 2018 -0400
Revision:
6:a36eda5701df
Parent:
5:0a4ff027086c
Child:
12:c09a50d9469a
V1 Completed!!!!!!!!!

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 6:a36eda5701df 157 write_uint16_t(data[data.size()-1], 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