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
Diff: sdCardReader.cpp
- Revision:
- 1:45627bbdeb69
- Parent:
- 0:ebe71c7e7854
- Child:
- 3:df8fb1b5d868
--- a/sdCardReader.cpp Tue Apr 03 21:50:25 2018 +0000 +++ b/sdCardReader.cpp Tue Apr 03 22:41:46 2018 -0400 @@ -1,91 +1,143 @@ #include "sdCardReader.h" -//SDCardReader::SDCardReader(){ - //this = new SDBlockDevice(MBED_CONF_SD_SPI_MOSI, MBED_CONF_SD_SPI_MISO, MBED_CONF_SD_SPI_CLK, MBED_CONF_SD_SPI_CS); -//} + +//private essential methods +// Try to mount the filesystem +void SDCardReader::mountFileSystem(){ + printf("Mounting the filesystem... "); + fflush(stdout); + int err = m_fs.mount(&this); + printf("%s\n", (err ? "Fail :(" : "OK")); + if (err) { + // Reformat if we can't mount the filesystem + // this should only happen on the first boot + printf("No filesystem found, formatting... "); + fflush(stdout); + err = m_fs.reformat(&this); + printf("%s\n", (err ? "Fail :(" : "OK")); + if (err) { + error("error: %s (%d)\n", strerror(-err), err); + } + } +} + +void SDCardReader::unmountFileSystem(){ + printf("Unmounting... "); + fflush(stdout); + err = m_fs.unmount(); + printf("%s\n", (err < 0 ? "Fail :(" : "OK")); + if (err < 0) { + error("error: %s (%d)\n", strerror(-err), err); + } +} -int SDCardReader::writeBlock(uint8_t* blockToWrite, int dataLength){ - //printf("%i\n",dataLength); - if ( 0 != this->init()) { - printf("Init failed \n"); - return -1; - } - - printf("lul"); - // set the frequency - if ( 0 != this->frequency(5000000)) { - printf("Error setting frequency \n"); +FILE* SDCardReader::openFile(string filename){ + printf("Opening \"/fs/%s\"... ",filename); + fflush(stdout); + FILE *f = fopen("/fs/"+filename, "r+"); + printf("%s\n", (!f ? "Fail :(" : "OK")); + if (!f) { + // Create the file if it doesn't exist + printf("No file found, creating a new file... "); + fflush(stdout); + f = fopen("/fs/"+filename, "w+"); + printf("%s\n", (!f ? "Fail :(" : "OK")); + if (!f) { + error("error: %s (%d)\n", strerror(errno), -errno); } - printf("huh"); - - // uint8_t lala[512] = "NOOMBA"; - // blockToWrite = lala; - dataLength = 4096; - - //blockToWrite = uint8 lala[512] - printf("%i\n",this->program(blockToWrite, 0, dataLength)); - if (0 == this->program(blockToWrite, 0, dataLength)){ - printf("Block Written!"); - //read back contents of block - if ( 0 == this->read(blockToWrite, 0, dataLength)) { - // print the contents of the block - printf("%s", blockToWrite); - } - } - printf("what?"); - // call the SDBlockDevice instance de-initialisation method. - this->deinit(); - - return 0; + } + return f; +} + +void SDCardReader::write_uint16_t(uint16_t data, bool endline, FILE* fileToUse){ + FILE *f = fileToUse; + printf("%s\n", (!f ? "Fail :(" : "OK")); + + printf("\rWriting datapoint %d", data); + fflush(stdout); + + //write and check for error + if (endline){ + err = fprintf(f, "%d\n",); + }else{ + err = fprintf(f, "%d",); + } + + if (err < 0) { + printf("Fail :(\n"); + error("error: %s (%d)\n", strerror(errno), -errno); + } +} + + +void SDCardReader::write_uint32_t(uint32_t data, bool endline, FILE* fileToUse){ + FILE *f = fileToUse; + printf("%s\n", (!f ? "Fail :(" : "OK")); + + printf("\rWriting datapoint %d", data); + fflush(stdout); + + //write and check for error + if (endline){ + err = fprintf(f, "%d\n",); + }else{ + err = fprintf(f, "%d ",); + } + + if (err < 0) { + printf("Fail :(\n"); + error("error: %s (%d)\n", strerror(errno), -errno); + } +} + + +void SDCardReader::closeFile(FILE* fileToClose){ + // Close the file which also flushes any cached writes + printf("Closing file..."); + fflush(stdout); + err = fclose(fileToClose); + printf("%s\n", (err < 0 ? "Fail :(" : "OK")); + if (err < 0) { + error("error: %s (%d)\n", strerror(errno), -errno); + } +} + + +int SDCardReader::fullWriteProcedure(string filename,int* indexArr, uint32_t* timeArr, uint16_t** allData){ + mountFileSystem(); + FILE* theFile = openFile(filename); + + for (int i = 0; i < indexArr.size; i++){ + writeDataPoint(theFile,indexArr[i],timeArr[i], allData[i]); + } + + closeFile(theFile); + unmountFileSystem(); + + return 1; } //use circular buffers instead of strings -int SDCardReader::writeData(string title, string dataToWrite){ - /* uint8_t m_title[512];// = reinterpret_cast<const uint8_t*>(&title[0]); - uint8_t m_data[1024];// = reinterpret_cast<const uint8_t*>(&dataToWrite[0]); - - m_title = reinterpret_cast<const uint8_t*>(&title[0]); - m_data = reinterpret_cast<const uint8_t*>(&dataToWrite[0]);*/ - - vector<uint8_t> myTitleVector(title.begin(), title.end()); - uint8_t *m_title = &myTitleVector[0]; - - vector<uint8_t> myDataVector(dataToWrite.begin(), dataToWrite.end()); - uint8_t *m_data = &myDataVector[0]; - - if ( 0 != this->init()) { - printf("Init failed \n"); - return -1; - } - // set the frequency - if ( 0 != this->frequency(5000000)) { - printf("Error setting frequency \n"); - } - - printf("writing"); - - - //Writing title - // Write some the data block to the device - if ( 0 == this->program(m_title, 0, 512)) { - // read the data block from the device - if ( 0 == this->read(m_title, 0, 512)) { - // print the contents of the block - printf("%s", m_title); - } - } - - //Writing data - if ( 0 == this->program(m_data, 0, 1024)) { - // read the data block from the device - if ( 0 == this->read(m_data, 0, 1024)) { - // print the contents of the block - printf("%s", m_data); - } - } - - // call the SDBlockDevice instance de-initialisation method. +//write as 1st column, index. 2nd column timestamp. 3rd column data1. 4th data2. etc. +//pass in array of circular buffers +int SDCardReader::writeDataPoint(FILE* theFile, int index, uint32_t timestamp, uint16_t* data){ + // FILE* theFile = openFile(filename); + + //write index + write_uint16_t(index, false, theFile); + //write timestamp + write_uint32_t(timestamp, false, theFile); + + //write data + for (int i = 0; i < data.size-1; i++) { + write_uint16_t(data[i], false, theFile); + } + write_uint16_t(data[data.size], false, theFile); + + closeFile(theFile); + + // call the SDBlockDevice instance de-initialisation method. this->deinit(); return 0; @@ -115,86 +167,37 @@ if (err) { error("error: %s (%d)\n", strerror(-err), err); } -} +} + + +/** Extras */ +/*int SDCardReader::writeBlock(uint8_t* blockToWrite, int dataLength){ -// Try to mount the filesystem -void SDCardReader::mountFileSystem(){ - printf("Mounting the filesystem... "); - fflush(stdout); - int err = fs.mount(&this); - printf("%s\n", (err ? "Fail :(" : "OK")); - if (err) { - // Reformat if we can't mount the filesystem - // this should only happen on the first boot - printf("No filesystem found, formatting... "); - fflush(stdout); - err = fs.reformat(&this); - printf("%s\n", (err ? "Fail :(" : "OK")); - if (err) { - error("error: %s (%d)\n", strerror(-err), err); + if ( 0 != this->init()) { + printf("Init failed \n"); + return -1; + } + + // set the frequency + if ( 0 != this->frequency(5000000)) { + printf("Error setting frequency \n"); + } + + dataLength = 4096; + + printf("%i\n",this->program(blockToWrite, 0, dataLength)); + if (0 == this->program(blockToWrite, 0, dataLength)){ + printf("Block Written!"); + //read back contents of block + if ( 0 == this->read(blockToWrite, 0, dataLength)) { + // print the contents of the block + printf("%s", blockToWrite); } } + // call the SDBlockDevice instance de-initialisation method. + this->deinit(); + + return 0; } -// Open file -FILE * SDCardReader::writeFile(string filename, dataRecorder* myDataRecorder); - printf("Opening \"/fs/%s\"... ",filename); - fflush(stdout); - FILE *f = fopen("/fs/"+filename, "r+"); - printf("%s\n", (!f ? "Fail :(" : "OK")); - if (!f) { - // Create the file if it doesn't exist - printf("No file found, creating a new file... "); - fflush(stdout); - f = fopen("/fs/"+filename, "w+"); - printf("%s\n", (!f ? "Fail :(" : "OK")); - if (!f) { - error("error: %s (%d)\n", strerror(errno), -errno); - } - for (int i = 0; i < 10; i++) { - printf("\rWriting numbers (%d/%d)... ", i, 10); - fflush(stdout); - err = fprintf(f, " %d\n", i); - if (err < 0) { - printf("Fail :(\n"); - error("error: %s (%d)\n", strerror(errno), -errno); - } - } - printf("\rWriting numbers (%d/%d)... OK\n", 10, 10); - - printf("Seeking file... "); - fflush(stdout); - err = fseek(f, 0, SEEK_SET); - printf("%s\n", (err < 0 ? "Fail :(" : "OK")); - if (err < 0) { - error("error: %s (%d)\n", strerror(errno), -errno); - } - } - - // Go through and increment the numbers - for (int i = 0; i < 10; i++) { - printf("\rIncrementing numbers (%d/%d)... ", i, 10); - fflush(stdout); - - // Get current stream position - long pos = ftell(f); - - // Parse out the number and increment - int32_t number; - fscanf(f, "%d", &number); - number += 1; - - // Seek to beginning of number - fseek(f, pos, SEEK_SET); - - // Store number - fprintf(f, " %d\n", number); - - // Flush between write and read on same file - fflush(f); - } - - - -