Hackaday demo: Signal generator

Dependencies:   SDFileSystem mbed

sdcard.cpp

Committer:
wd5gnr
Date:
2015-09-15
Revision:
1:c229c3ceb909
Parent:
0:8baa10bd07de

File content as of revision 1:c229c3ceb909:

#include "mbed.h"
#include "SDFileSystem.h"

#define _EXTERN_ extern
#include "main.h"
#include "sdcard.h"
#include <cctype>

// SDCard routines that get out of the way if you define SDCARD=0 in main.h

SDFileSystem sd(PTE3, PTE1, PTE2, PTE4, "sd"); // MOSI, MISO, SCK, CS

// Read a file in either .cfg format 
// (any file with a .c* extension)
// Or raw data
// Format: version (0), timebase (float), count, data
// raw data is just data in binary; set cfgflag=0 to read raw, 1 to read cfg
static int do_read(FILE *f, int cfgflag)
{
#if SDCARD==1
    if (f) {
        unsigned version, count, err=0;
        if (cfgflag) {
            if (fread(&version,1,sizeof(version),f)!=sizeof(version)) err=1;
            if (version!=0) pc.printf("Warning: File is newer version\r\n");
            if (err==0 && fread(&timebaseus,1,sizeof(timebaseus),f)!=sizeof(timebaseus)) err=1;
            if (err==0 && fread(&count,1,sizeof(count),f)!=sizeof(count)) err=1;
            if (count>sizeof(buffer)) {
                pc.printf("Error: File too large\r\n");
                return 1;
            }
            if (count<sizeof(buffer)) {
                pc.printf("Warning: File too small\r\n");
            }
        }

        if (!cfgflag) count=sizeof(buffer);
        // read data either way
        if (err==0 && fread(buffer,1,count,f)!=count) err=1;
        if (err) pc.printf("Read error\n");
        fclose(f);
    } else return 1;
#endif
    return 0;

}
// Main calls this to see if a file called autowave.cfg is present and if so, it runs
void auto_open()
{
#if SDCARD==1
    FILE *f;
    // check for auto operation
    f=fopen("/sd/autowave.cfg","r");
    if (!do_read(f,1))
        exec();
#endif
}


// worker for directory listing (call from file prompt too)
uint32_t do_list(const char *fsrc)
{
#if SDCARD==1
    DIR *d = opendir(fsrc);
    struct dirent *p;
    uint32_t counter = 0;

    while ((p = readdir(d)) != NULL) {
        counter++;
        printf("%s\r\n", p->d_name);
    }
    closedir(d);
    return counter;
#else
    return 0;
#endif
}

// Directory command
// Read SD card DIR
void dir()
{
#if SDCARD==1
    if (do_list("/sd") == 0) {
        pc.printf("No files/directories on the sd card.\r\n");
    }
#else
    pc.printf("No SDCARD Support\r\n");
#endif

}


#if SDCARD==1
// Get a file name (press ? for a dir)
int getfn(char *fn)
{
    char *fnp=fn+4;
    int c;
    int first=1;
    pc.printf("File: ");
    strcpy(fn,"/sd/");   // start here
    // skip leading cruft
    do {
        c=getachar();
        if (c==-1) {
            *fn='\0';
            return -1;
        }
    } while (isspace(c));
    do {
        if (first) first=0;
        else c=getachar();  // get characters

        if (c=='?') {   // if ? do a directory listing
            pc.printf("\r\n");
            dir();
            pc.printf("\r\n%s",fn+4);
            continue;
        }
        if (c=='\r' || c=='\n') break;  // end
        if (c=='\x1b') return 0;   // escape
        if (c==8) {                  // backspace
            if (fn!=fnp) {
                pc.putc(8);
                fnp--;
                continue;
            }
            continue;
        }
        *fnp++=c;
    } while (c!='\r');
    *fnp='\0';
    pc.printf("Filename: %s\r\n",fn);
    return 1;
}

char fn[65]; // file name buffer
#endif

// read from SD card
void sdread()
{
#if SDCARD==1
    FILE *f;
    char *cp;
    int cfgflag=0;
    if (!getfn(fn)) return;
    // determine if filename ends in .c*
    cp=strchr(fn,'.');
    if (cp!=NULL && (cp[1]=='c' || cp[1]=='C')) cfgflag=1;
    f=fopen(fn,"r");
    if (!f) {
        pc.printf("Can't open %s\r\n",fn);
        return;
    }
    do_read(f,cfgflag);
#else
    pc.printf("No SDCARD support\r\n");
#endif
}

// Write to SD card
void sdwrite()
{
#if SDCARD==1
    FILE *f;
    char *cp;
    int cfgflag=0;
    int err=0;
    if (!getfn(fn)) return;
    // determine if filename ends in .c*
    cp=strchr(fn,'.');
    if (cp!=NULL && (cp[1]=='c' || cp[1]=='C')) cfgflag=1;
    f=fopen(fn,"w"); // this seems to return 0 sometimes?
    if (!f) {
        pc.printf("Can't open %s\r\n",fn);
        return;
    }
    if (cfgflag) {  // write header for .c* files
        unsigned version=0, count=sizeof(buffer);
        if (fwrite(&version,1,sizeof(version),f)!=sizeof(version)) err=1;
        if (err==0 && fwrite(&timebaseus,1,sizeof(timebaseus),f)!=sizeof(timebaseus)) err=1;
        if (err==0 && fwrite(&count,1,sizeof(count),f)!=sizeof(count)) err=1;
    }
    // write data no matter what
    if (err==0 && fwrite(buffer,1,sizeof(buffer),f)!=sizeof(buffer)) err=1;
    if (fclose(f)) err=1;
    if (err) pc.printf("Write error\r\n");
    
#else
    pc.printf("No SDCARD support\r\n");
#endif
}