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 }