SDFileSystem, slightly modified for the ExoController

Dependencies:   SDFileSystem

Dependents:   Data-Management-Honka

Fork of SDFileSystem_HelloWorld by Bradley Perry

SDFile.cpp

Committer:
mzling
Date:
2015-03-11
Revision:
8:964f832265b8
Parent:
7:51c9391e6c4c
Child:
9:5bad923e18ce

File content as of revision 8:964f832265b8:

#include "mbed.h"
#include "SDFileSystem.h"
#include "SDFile.h"
#include "errno.h"
#include "initDatabed.h"


SDFile::SDFile(string path, string filename, bool readOnly)
{
    //Creates the necessary directory
    //printf("Creating SDFile object\r\n");
    char *a = new char[path.size()+1];
    a[path.size()] = 0;
    memcpy(a,path.c_str(),path.size());
    //Calculates the full filename, then creates the file
    std::string fullname = path + filename;

    char *b = new char[fullname.size()+1];
    b[fullname.size()] = 0;
    memcpy(b,fullname.c_str(),fullname.size());
    if (readOnly) {
        //printf("Opening readonly file\r\n");
        //_fp = fopen((const char*)b, "r");
    } else {
        //printf("Opening writable file\r\n");
        _fp = fopen((const char*)b, "w+");
    }
    //printf("fp is %d\r\n", _fp);       
}

/**
* This function reads bytes from the SDFile object.
* @author Michael Ling
* @param length    The number of bytes to read
* @param array    The int array the bytes are copied to
* @date 2/2/2015
*/
int* SDFile::read(int length, int *array)
{
   
    //shift to the end of the file and go back accounting for the commas, spaces, \n, and \r (6 places per data)
    fseek(_fp, -6*length, SEEK_END);
    //cycle through the length of the vector and read the values.
    for(int i = 0; i < length; i++) {
        fscanf(_fp, "%x, ", &array[i]);
    }
   
    return array;
}

int* SDFile::read_from_start(int length, int *array) {
    fseek(_fp, 0, SEEK_SET);
    for(int i = 0; i < length; i++) {
        fscanf(_fp, "%x, ", &array[i]);
    }
   
    return array;
}

/** 
* This function writes from an array to the file pointed to by fp
* @param length    length of data to write
* @param array    array to draw written data from
* @author Michael Ling
* @date 2/2/2015
*/
void SDFile::write(int length, int *array)
{
    //printf("Seeking START...\r\n");
    fseek(_fp, 0, SEEK_SET);
//    printf("Writing %d\r\n", array[0]);
    //printf("Starting to write\r\n");
    for(int i = 0; i < length-1; i++) {
        /* This line fails when run on testFile, reason unknown...*/
        //printf("%d\r\n", fprintf(_fp, "%04x, ", array[i]));
        fprintf(_fp, "%04x, ", array[i]);
    }
    //printf("%d\r\n", fprintf(_fp, "%04x\r\n", array[length-1]));
    fprintf(_fp, "%04x\r\n", array[length-1]);
}

void SDFile::append(int length, int *array) {
    fseek(_fp, 0, SEEK_END);
    for(int i = 0; i < length-1; i++) {
        
        fprintf(_fp, "%04x, ", array[i]);
    }
    fprintf(_fp, "%04x\r\n", array[length-1]);
}
/*
void SDFile::changeAccess(string path, string filename) {
    fclose(_fp);
    char *a = new char[path.size()+1];
    a[path.size()] = 0;
    memcpy(a,path.c_str(),path.size());
    //Calculates the full filename, then creates the file
    std::string fullname = path + filename;

    char *b = new char[fullname.size()+1];
    
    b[fullname.size()] = 0;
    memcpy(b,fullname.c_str(),fullname.size());
    printf("Using name %s\r\n", b);
    _fp = fopen((const char *)b, "r+");
    printf("new FP is %d\r\n", _fp);
}*/

void SDFile::open_for_read(string path, string filename) {
     //Creates the necessary directory
    //printf("Trying to open for read\r\n");
    char *a = new char[path.size()+1];
    a[path.size()] = 0;
    memcpy(a,path.c_str(),path.size());
    //Calculates the full filename, then creates the file
    std::string fullname = path + filename;

    char *b = new char[fullname.size()+1];
    b[fullname.size()] = 0;
    memcpy(b,fullname.c_str(),fullname.size());
    _fp = fopen((const char*)b, "r");

    //printf("fp is %d\r\n", _fp);  
}

void SDFile::open_for_write(string path, string filename) {
    
    //Creates the necessary directory
    
    char *a = new char[path.size()+1];
    a[path.size()] = 0;
    memcpy(a,path.c_str(),path.size());
    //Calculates the full filename, then creates the file
    std::string fullname = path + filename;

    char *b = new char[fullname.size()+1];
    b[fullname.size()] = 0;
    memcpy(b,fullname.c_str(),fullname.size());
            _fp = fopen((const char*)b, "w+");

    //printf("fp is %d\r\n", _fp); 
}

void SDFile::close() {
    fclose(_fp);
}