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

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);
-    }
-    
-    
-
-