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:
0:ebe71c7e7854
Child:
1:45627bbdeb69
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sdCardReader.cpp	Tue Apr 03 21:50:25 2018 +0000
@@ -0,0 +1,200 @@
+#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);   
+//}
+
+
+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");
+    }
+    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;
+}
+
+//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.
+    this->deinit();
+    
+    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);
+    }
+}
+
+// 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);
+        }
+    }
+}
+
+// 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);
+    }
+    
+    
+
+