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
- Committer:
- DVLevine
- Date:
- 2018-07-11
- Revision:
- 13:91350588d530
- Parent:
- 12:c09a50d9469a
File content as of revision 13:91350588d530:
#include "sdCardReader.h"
//helpers
int getSize(int* p){
printf("reg p %i \n",sizeof(p));
printf("star p %i \n",sizeof(*p));
return (sizeof(p)/sizeof(*p));
}
int getSize(uint16_t* p){
return (sizeof(p)/sizeof(*p));
}
//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);
int err = m_fs->unmount();
printf("%s\n", (err < 0 ? "Fail :(" : "OK"));
if (err < 0) {
error("error: %s (%d)\n", strerror(-err), err);
}
}
FILE* SDCardReader::openFile(string filename){
printf("Opening \"/fs/%s\"... ",filename.c_str());
fflush(stdout);
FILE *f = fopen(filename.c_str(), "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(filename.c_str(), "w+");
printf("%s\n", (!f ? "Fail :(" : "OK"));
if (!f) {
error("error: %s (%d)\n", strerror(errno), -errno);
}
}
return f;
}
void SDCardReader::write_uint16_t(uint16_t in_data, bool endline, FILE* fileToUse){
FILE *f = fileToUse;
printf("%s\n", (!f ? "Fail :(" : "OK"));
int16_t data = (int16_t)in_data;
//printf("\rWriting 16 bit value: % " PRIu16 " ", data);
printf("\rWriting 16 bit value %i ", static_cast<int>(data));
fflush(stdout);
int err = 0;
//write and check for error
if (endline){
err = fprintf(f,"%i\n",static_cast<int>(data));
//err = fprintf(f,"%" PRIu16 "\n",data);
}else{
err = fprintf(f,"%i " ,static_cast<int>(data));
}
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 32 bit value: %" PRIu32 " ", data);
printf("\rWriting 32 bit value %i ", static_cast<int>(data));
fflush(stdout);
int err = 0;
//write and check for error
if (endline){
//err = fprintf(f,"%" PRIu32 "\n",data);
err = fprintf(f,"%i\n",static_cast<int>(data));
}else{
err = fprintf(f,"%i ",static_cast<int>(data));
}
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);
int err = 0;
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,vector<int> indexArr, vector<uint32_t> timeArr, vector<vector <uint16_t> > allData){
mountFileSystem();
FILE* theFile = openFile(filename);
printf("The size of indexArr is %i \n",indexArr.size());
for (unsigned 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
//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, vector<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 (unsigned int i = 0; i < data.size()-1; i++) {
write_uint16_t(data[i], false, theFile);
}
write_uint16_t(data[data.size()-1], true, theFile);
return 0;
}
int SDCardReader::eraseData(){
printf("Initializing the block device... ");
fflush(stdout);
int err = this->init();
printf("%s\n", (err ? "Fail :(" : "OK"));
if (err) {
error("error: %s (%d)\n", strerror(-err), err);
}
printf("Erasing the block device... ");
fflush(stdout);
err = this->erase(0, this->size());
printf("%s\n", (err ? "Fail :(" : "OK"));
if (err) {
error("error: %s (%d)\n", strerror(-err), err);
}
printf("Deinitializing the block device... ");
fflush(stdout);
err = this->deinit();
printf("%s\n", (err ? "Fail :(" : "OK"));
if (err) {
error("error: %s (%d)\n", strerror(-err), err);
}
return err;
}
//Methods for reading sdcard files. Mostly to read off trial numbers
int SDCardReader::readAndIncrement(string filename){
mountFileSystem();
FILE* theFile = openFile(filename);
// Get current stream position
long pos = ftell(theFile);
// Parse out the number
int32_t number;
int32_t presentNumber;
fscanf(theFile, "%d", &number);
presentNumber = number;
number += 1;
//read lone value as int, return it
// Seek to beginning of number
fseek(theFile, pos, SEEK_SET);
// Store number
fprintf(theFile, "%d\n", number);
// Flush between write and read on same file
fflush(theFile);
closeFile(theFile);
unmountFileSystem();
return (int)presentNumber;
}
