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:
Tue Apr 03 21:50:25 2018 +0000
Revision:
0:ebe71c7e7854
Child:
1:45627bbdeb69
SD Card Reading library testbed;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
DVLevine 0:ebe71c7e7854 1 #include "sdCardReader.h"
DVLevine 0:ebe71c7e7854 2
DVLevine 0:ebe71c7e7854 3 //SDCardReader::SDCardReader(){
DVLevine 0:ebe71c7e7854 4 //this = new SDBlockDevice(MBED_CONF_SD_SPI_MOSI, MBED_CONF_SD_SPI_MISO, MBED_CONF_SD_SPI_CLK, MBED_CONF_SD_SPI_CS);
DVLevine 0:ebe71c7e7854 5 //}
DVLevine 0:ebe71c7e7854 6
DVLevine 0:ebe71c7e7854 7
DVLevine 0:ebe71c7e7854 8 int SDCardReader::writeBlock(uint8_t* blockToWrite, int dataLength){
DVLevine 0:ebe71c7e7854 9 //printf("%i\n",dataLength);
DVLevine 0:ebe71c7e7854 10 if ( 0 != this->init()) {
DVLevine 0:ebe71c7e7854 11 printf("Init failed \n");
DVLevine 0:ebe71c7e7854 12 return -1;
DVLevine 0:ebe71c7e7854 13 }
DVLevine 0:ebe71c7e7854 14
DVLevine 0:ebe71c7e7854 15 printf("lul");
DVLevine 0:ebe71c7e7854 16 // set the frequency
DVLevine 0:ebe71c7e7854 17 if ( 0 != this->frequency(5000000)) {
DVLevine 0:ebe71c7e7854 18 printf("Error setting frequency \n");
DVLevine 0:ebe71c7e7854 19 }
DVLevine 0:ebe71c7e7854 20 printf("huh");
DVLevine 0:ebe71c7e7854 21
DVLevine 0:ebe71c7e7854 22 // uint8_t lala[512] = "NOOMBA";
DVLevine 0:ebe71c7e7854 23 // blockToWrite = lala;
DVLevine 0:ebe71c7e7854 24 dataLength = 4096;
DVLevine 0:ebe71c7e7854 25
DVLevine 0:ebe71c7e7854 26 //blockToWrite = uint8 lala[512]
DVLevine 0:ebe71c7e7854 27 printf("%i\n",this->program(blockToWrite, 0, dataLength));
DVLevine 0:ebe71c7e7854 28 if (0 == this->program(blockToWrite, 0, dataLength)){
DVLevine 0:ebe71c7e7854 29 printf("Block Written!");
DVLevine 0:ebe71c7e7854 30 //read back contents of block
DVLevine 0:ebe71c7e7854 31 if ( 0 == this->read(blockToWrite, 0, dataLength)) {
DVLevine 0:ebe71c7e7854 32 // print the contents of the block
DVLevine 0:ebe71c7e7854 33 printf("%s", blockToWrite);
DVLevine 0:ebe71c7e7854 34 }
DVLevine 0:ebe71c7e7854 35 }
DVLevine 0:ebe71c7e7854 36 printf("what?");
DVLevine 0:ebe71c7e7854 37 // call the SDBlockDevice instance de-initialisation method.
DVLevine 0:ebe71c7e7854 38 this->deinit();
DVLevine 0:ebe71c7e7854 39
DVLevine 0:ebe71c7e7854 40 return 0;
DVLevine 0:ebe71c7e7854 41 }
DVLevine 0:ebe71c7e7854 42
DVLevine 0:ebe71c7e7854 43 //use circular buffers instead of strings
DVLevine 0:ebe71c7e7854 44 int SDCardReader::writeData(string title, string dataToWrite){
DVLevine 0:ebe71c7e7854 45 /* uint8_t m_title[512];// = reinterpret_cast<const uint8_t*>(&title[0]);
DVLevine 0:ebe71c7e7854 46 uint8_t m_data[1024];// = reinterpret_cast<const uint8_t*>(&dataToWrite[0]);
DVLevine 0:ebe71c7e7854 47
DVLevine 0:ebe71c7e7854 48 m_title = reinterpret_cast<const uint8_t*>(&title[0]);
DVLevine 0:ebe71c7e7854 49 m_data = reinterpret_cast<const uint8_t*>(&dataToWrite[0]);*/
DVLevine 0:ebe71c7e7854 50
DVLevine 0:ebe71c7e7854 51 vector<uint8_t> myTitleVector(title.begin(), title.end());
DVLevine 0:ebe71c7e7854 52 uint8_t *m_title = &myTitleVector[0];
DVLevine 0:ebe71c7e7854 53
DVLevine 0:ebe71c7e7854 54 vector<uint8_t> myDataVector(dataToWrite.begin(), dataToWrite.end());
DVLevine 0:ebe71c7e7854 55 uint8_t *m_data = &myDataVector[0];
DVLevine 0:ebe71c7e7854 56
DVLevine 0:ebe71c7e7854 57 if ( 0 != this->init()) {
DVLevine 0:ebe71c7e7854 58 printf("Init failed \n");
DVLevine 0:ebe71c7e7854 59 return -1;
DVLevine 0:ebe71c7e7854 60 }
DVLevine 0:ebe71c7e7854 61 // set the frequency
DVLevine 0:ebe71c7e7854 62 if ( 0 != this->frequency(5000000)) {
DVLevine 0:ebe71c7e7854 63 printf("Error setting frequency \n");
DVLevine 0:ebe71c7e7854 64 }
DVLevine 0:ebe71c7e7854 65
DVLevine 0:ebe71c7e7854 66 printf("writing");
DVLevine 0:ebe71c7e7854 67
DVLevine 0:ebe71c7e7854 68
DVLevine 0:ebe71c7e7854 69 //Writing title
DVLevine 0:ebe71c7e7854 70 // Write some the data block to the device
DVLevine 0:ebe71c7e7854 71 if ( 0 == this->program(m_title, 0, 512)) {
DVLevine 0:ebe71c7e7854 72 // read the data block from the device
DVLevine 0:ebe71c7e7854 73 if ( 0 == this->read(m_title, 0, 512)) {
DVLevine 0:ebe71c7e7854 74 // print the contents of the block
DVLevine 0:ebe71c7e7854 75 printf("%s", m_title);
DVLevine 0:ebe71c7e7854 76 }
DVLevine 0:ebe71c7e7854 77 }
DVLevine 0:ebe71c7e7854 78
DVLevine 0:ebe71c7e7854 79 //Writing data
DVLevine 0:ebe71c7e7854 80 if ( 0 == this->program(m_data, 0, 1024)) {
DVLevine 0:ebe71c7e7854 81 // read the data block from the device
DVLevine 0:ebe71c7e7854 82 if ( 0 == this->read(m_data, 0, 1024)) {
DVLevine 0:ebe71c7e7854 83 // print the contents of the block
DVLevine 0:ebe71c7e7854 84 printf("%s", m_data);
DVLevine 0:ebe71c7e7854 85 }
DVLevine 0:ebe71c7e7854 86 }
DVLevine 0:ebe71c7e7854 87
DVLevine 0:ebe71c7e7854 88 // call the SDBlockDevice instance de-initialisation method.
DVLevine 0:ebe71c7e7854 89 this->deinit();
DVLevine 0:ebe71c7e7854 90
DVLevine 0:ebe71c7e7854 91 return 0;
DVLevine 0:ebe71c7e7854 92 }
DVLevine 0:ebe71c7e7854 93
DVLevine 0:ebe71c7e7854 94 int SDCardReader::eraseData(){
DVLevine 0:ebe71c7e7854 95 printf("Initializing the block device... ");
DVLevine 0:ebe71c7e7854 96 fflush(stdout);
DVLevine 0:ebe71c7e7854 97 int err = this.init();
DVLevine 0:ebe71c7e7854 98 printf("%s\n", (err ? "Fail :(" : "OK"));
DVLevine 0:ebe71c7e7854 99 if (err) {
DVLevine 0:ebe71c7e7854 100 error("error: %s (%d)\n", strerror(-err), err);
DVLevine 0:ebe71c7e7854 101 }
DVLevine 0:ebe71c7e7854 102
DVLevine 0:ebe71c7e7854 103 printf("Erasing the block device... ");
DVLevine 0:ebe71c7e7854 104 fflush(stdout);
DVLevine 0:ebe71c7e7854 105 err = this.erase(0, this.size());
DVLevine 0:ebe71c7e7854 106 printf("%s\n", (err ? "Fail :(" : "OK"));
DVLevine 0:ebe71c7e7854 107 if (err) {
DVLevine 0:ebe71c7e7854 108 error("error: %s (%d)\n", strerror(-err), err);
DVLevine 0:ebe71c7e7854 109 }
DVLevine 0:ebe71c7e7854 110
DVLevine 0:ebe71c7e7854 111 printf("Deinitializing the block device... ");
DVLevine 0:ebe71c7e7854 112 fflush(stdout);
DVLevine 0:ebe71c7e7854 113 err = this.deinit();
DVLevine 0:ebe71c7e7854 114 printf("%s\n", (err ? "Fail :(" : "OK"));
DVLevine 0:ebe71c7e7854 115 if (err) {
DVLevine 0:ebe71c7e7854 116 error("error: %s (%d)\n", strerror(-err), err);
DVLevine 0:ebe71c7e7854 117 }
DVLevine 0:ebe71c7e7854 118 }
DVLevine 0:ebe71c7e7854 119
DVLevine 0:ebe71c7e7854 120 // Try to mount the filesystem
DVLevine 0:ebe71c7e7854 121 void SDCardReader::mountFileSystem(){
DVLevine 0:ebe71c7e7854 122 printf("Mounting the filesystem... ");
DVLevine 0:ebe71c7e7854 123 fflush(stdout);
DVLevine 0:ebe71c7e7854 124 int err = fs.mount(&this);
DVLevine 0:ebe71c7e7854 125 printf("%s\n", (err ? "Fail :(" : "OK"));
DVLevine 0:ebe71c7e7854 126 if (err) {
DVLevine 0:ebe71c7e7854 127 // Reformat if we can't mount the filesystem
DVLevine 0:ebe71c7e7854 128 // this should only happen on the first boot
DVLevine 0:ebe71c7e7854 129 printf("No filesystem found, formatting... ");
DVLevine 0:ebe71c7e7854 130 fflush(stdout);
DVLevine 0:ebe71c7e7854 131 err = fs.reformat(&this);
DVLevine 0:ebe71c7e7854 132 printf("%s\n", (err ? "Fail :(" : "OK"));
DVLevine 0:ebe71c7e7854 133 if (err) {
DVLevine 0:ebe71c7e7854 134 error("error: %s (%d)\n", strerror(-err), err);
DVLevine 0:ebe71c7e7854 135 }
DVLevine 0:ebe71c7e7854 136 }
DVLevine 0:ebe71c7e7854 137 }
DVLevine 0:ebe71c7e7854 138
DVLevine 0:ebe71c7e7854 139 // Open file
DVLevine 0:ebe71c7e7854 140 FILE * SDCardReader::writeFile(string filename, dataRecorder* myDataRecorder);
DVLevine 0:ebe71c7e7854 141 printf("Opening \"/fs/%s\"... ",filename);
DVLevine 0:ebe71c7e7854 142 fflush(stdout);
DVLevine 0:ebe71c7e7854 143 FILE *f = fopen("/fs/"+filename, "r+");
DVLevine 0:ebe71c7e7854 144 printf("%s\n", (!f ? "Fail :(" : "OK"));
DVLevine 0:ebe71c7e7854 145 if (!f) {
DVLevine 0:ebe71c7e7854 146 // Create the file if it doesn't exist
DVLevine 0:ebe71c7e7854 147 printf("No file found, creating a new file... ");
DVLevine 0:ebe71c7e7854 148 fflush(stdout);
DVLevine 0:ebe71c7e7854 149 f = fopen("/fs/"+filename, "w+");
DVLevine 0:ebe71c7e7854 150 printf("%s\n", (!f ? "Fail :(" : "OK"));
DVLevine 0:ebe71c7e7854 151 if (!f) {
DVLevine 0:ebe71c7e7854 152 error("error: %s (%d)\n", strerror(errno), -errno);
DVLevine 0:ebe71c7e7854 153 }
DVLevine 0:ebe71c7e7854 154
DVLevine 0:ebe71c7e7854 155 for (int i = 0; i < 10; i++) {
DVLevine 0:ebe71c7e7854 156 printf("\rWriting numbers (%d/%d)... ", i, 10);
DVLevine 0:ebe71c7e7854 157 fflush(stdout);
DVLevine 0:ebe71c7e7854 158 err = fprintf(f, " %d\n", i);
DVLevine 0:ebe71c7e7854 159 if (err < 0) {
DVLevine 0:ebe71c7e7854 160 printf("Fail :(\n");
DVLevine 0:ebe71c7e7854 161 error("error: %s (%d)\n", strerror(errno), -errno);
DVLevine 0:ebe71c7e7854 162 }
DVLevine 0:ebe71c7e7854 163 }
DVLevine 0:ebe71c7e7854 164 printf("\rWriting numbers (%d/%d)... OK\n", 10, 10);
DVLevine 0:ebe71c7e7854 165
DVLevine 0:ebe71c7e7854 166 printf("Seeking file... ");
DVLevine 0:ebe71c7e7854 167 fflush(stdout);
DVLevine 0:ebe71c7e7854 168 err = fseek(f, 0, SEEK_SET);
DVLevine 0:ebe71c7e7854 169 printf("%s\n", (err < 0 ? "Fail :(" : "OK"));
DVLevine 0:ebe71c7e7854 170 if (err < 0) {
DVLevine 0:ebe71c7e7854 171 error("error: %s (%d)\n", strerror(errno), -errno);
DVLevine 0:ebe71c7e7854 172 }
DVLevine 0:ebe71c7e7854 173 }
DVLevine 0:ebe71c7e7854 174
DVLevine 0:ebe71c7e7854 175 // Go through and increment the numbers
DVLevine 0:ebe71c7e7854 176 for (int i = 0; i < 10; i++) {
DVLevine 0:ebe71c7e7854 177 printf("\rIncrementing numbers (%d/%d)... ", i, 10);
DVLevine 0:ebe71c7e7854 178 fflush(stdout);
DVLevine 0:ebe71c7e7854 179
DVLevine 0:ebe71c7e7854 180 // Get current stream position
DVLevine 0:ebe71c7e7854 181 long pos = ftell(f);
DVLevine 0:ebe71c7e7854 182
DVLevine 0:ebe71c7e7854 183 // Parse out the number and increment
DVLevine 0:ebe71c7e7854 184 int32_t number;
DVLevine 0:ebe71c7e7854 185 fscanf(f, "%d", &number);
DVLevine 0:ebe71c7e7854 186 number += 1;
DVLevine 0:ebe71c7e7854 187
DVLevine 0:ebe71c7e7854 188 // Seek to beginning of number
DVLevine 0:ebe71c7e7854 189 fseek(f, pos, SEEK_SET);
DVLevine 0:ebe71c7e7854 190
DVLevine 0:ebe71c7e7854 191 // Store number
DVLevine 0:ebe71c7e7854 192 fprintf(f, " %d\n", number);
DVLevine 0:ebe71c7e7854 193
DVLevine 0:ebe71c7e7854 194 // Flush between write and read on same file
DVLevine 0:ebe71c7e7854 195 fflush(f);
DVLevine 0:ebe71c7e7854 196 }
DVLevine 0:ebe71c7e7854 197
DVLevine 0:ebe71c7e7854 198
DVLevine 0:ebe71c7e7854 199
DVLevine 0:ebe71c7e7854 200