Hackaday demo: Signal generator

Dependencies:   SDFileSystem mbed

Committer:
wd5gnr
Date:
Tue Sep 15 15:21:34 2015 +0000
Revision:
1:c229c3ceb909
Parent:
0:8baa10bd07de
Making sure all changes are ready for publication.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
wd5gnr 0:8baa10bd07de 1 #include "mbed.h"
wd5gnr 0:8baa10bd07de 2 #include "SDFileSystem.h"
wd5gnr 0:8baa10bd07de 3
wd5gnr 0:8baa10bd07de 4 #define _EXTERN_ extern
wd5gnr 0:8baa10bd07de 5 #include "main.h"
wd5gnr 0:8baa10bd07de 6 #include "sdcard.h"
wd5gnr 0:8baa10bd07de 7 #include <cctype>
wd5gnr 0:8baa10bd07de 8
wd5gnr 0:8baa10bd07de 9 // SDCard routines that get out of the way if you define SDCARD=0 in main.h
wd5gnr 0:8baa10bd07de 10
wd5gnr 0:8baa10bd07de 11 SDFileSystem sd(PTE3, PTE1, PTE2, PTE4, "sd"); // MOSI, MISO, SCK, CS
wd5gnr 0:8baa10bd07de 12
wd5gnr 0:8baa10bd07de 13 // Read a file in either .cfg format
wd5gnr 0:8baa10bd07de 14 // (any file with a .c* extension)
wd5gnr 0:8baa10bd07de 15 // Or raw data
wd5gnr 0:8baa10bd07de 16 // Format: version (0), timebase (float), count, data
wd5gnr 0:8baa10bd07de 17 // raw data is just data in binary; set cfgflag=0 to read raw, 1 to read cfg
wd5gnr 0:8baa10bd07de 18 static int do_read(FILE *f, int cfgflag)
wd5gnr 0:8baa10bd07de 19 {
wd5gnr 0:8baa10bd07de 20 #if SDCARD==1
wd5gnr 0:8baa10bd07de 21 if (f) {
wd5gnr 0:8baa10bd07de 22 unsigned version, count, err=0;
wd5gnr 0:8baa10bd07de 23 if (cfgflag) {
wd5gnr 0:8baa10bd07de 24 if (fread(&version,1,sizeof(version),f)!=sizeof(version)) err=1;
wd5gnr 0:8baa10bd07de 25 if (version!=0) pc.printf("Warning: File is newer version\r\n");
wd5gnr 0:8baa10bd07de 26 if (err==0 && fread(&timebaseus,1,sizeof(timebaseus),f)!=sizeof(timebaseus)) err=1;
wd5gnr 0:8baa10bd07de 27 if (err==0 && fread(&count,1,sizeof(count),f)!=sizeof(count)) err=1;
wd5gnr 0:8baa10bd07de 28 if (count>sizeof(buffer)) {
wd5gnr 0:8baa10bd07de 29 pc.printf("Error: File too large\r\n");
wd5gnr 0:8baa10bd07de 30 return 1;
wd5gnr 0:8baa10bd07de 31 }
wd5gnr 0:8baa10bd07de 32 if (count<sizeof(buffer)) {
wd5gnr 0:8baa10bd07de 33 pc.printf("Warning: File too small\r\n");
wd5gnr 0:8baa10bd07de 34 }
wd5gnr 0:8baa10bd07de 35 }
wd5gnr 0:8baa10bd07de 36
wd5gnr 0:8baa10bd07de 37 if (!cfgflag) count=sizeof(buffer);
wd5gnr 0:8baa10bd07de 38 // read data either way
wd5gnr 0:8baa10bd07de 39 if (err==0 && fread(buffer,1,count,f)!=count) err=1;
wd5gnr 0:8baa10bd07de 40 if (err) pc.printf("Read error\n");
wd5gnr 0:8baa10bd07de 41 fclose(f);
wd5gnr 0:8baa10bd07de 42 } else return 1;
wd5gnr 0:8baa10bd07de 43 #endif
wd5gnr 0:8baa10bd07de 44 return 0;
wd5gnr 0:8baa10bd07de 45
wd5gnr 0:8baa10bd07de 46 }
wd5gnr 0:8baa10bd07de 47 // Main calls this to see if a file called autowave.cfg is present and if so, it runs
wd5gnr 0:8baa10bd07de 48 void auto_open()
wd5gnr 0:8baa10bd07de 49 {
wd5gnr 0:8baa10bd07de 50 #if SDCARD==1
wd5gnr 0:8baa10bd07de 51 FILE *f;
wd5gnr 0:8baa10bd07de 52 // check for auto operation
wd5gnr 0:8baa10bd07de 53 f=fopen("/sd/autowave.cfg","r");
wd5gnr 0:8baa10bd07de 54 if (!do_read(f,1))
wd5gnr 0:8baa10bd07de 55 exec();
wd5gnr 0:8baa10bd07de 56 #endif
wd5gnr 0:8baa10bd07de 57 }
wd5gnr 0:8baa10bd07de 58
wd5gnr 0:8baa10bd07de 59
wd5gnr 0:8baa10bd07de 60 // worker for directory listing (call from file prompt too)
wd5gnr 0:8baa10bd07de 61 uint32_t do_list(const char *fsrc)
wd5gnr 0:8baa10bd07de 62 {
wd5gnr 0:8baa10bd07de 63 #if SDCARD==1
wd5gnr 0:8baa10bd07de 64 DIR *d = opendir(fsrc);
wd5gnr 0:8baa10bd07de 65 struct dirent *p;
wd5gnr 0:8baa10bd07de 66 uint32_t counter = 0;
wd5gnr 0:8baa10bd07de 67
wd5gnr 0:8baa10bd07de 68 while ((p = readdir(d)) != NULL) {
wd5gnr 0:8baa10bd07de 69 counter++;
wd5gnr 0:8baa10bd07de 70 printf("%s\r\n", p->d_name);
wd5gnr 0:8baa10bd07de 71 }
wd5gnr 0:8baa10bd07de 72 closedir(d);
wd5gnr 0:8baa10bd07de 73 return counter;
wd5gnr 0:8baa10bd07de 74 #else
wd5gnr 0:8baa10bd07de 75 return 0;
wd5gnr 0:8baa10bd07de 76 #endif
wd5gnr 0:8baa10bd07de 77 }
wd5gnr 0:8baa10bd07de 78
wd5gnr 0:8baa10bd07de 79 // Directory command
wd5gnr 0:8baa10bd07de 80 // Read SD card DIR
wd5gnr 0:8baa10bd07de 81 void dir()
wd5gnr 0:8baa10bd07de 82 {
wd5gnr 0:8baa10bd07de 83 #if SDCARD==1
wd5gnr 0:8baa10bd07de 84 if (do_list("/sd") == 0) {
wd5gnr 0:8baa10bd07de 85 pc.printf("No files/directories on the sd card.\r\n");
wd5gnr 0:8baa10bd07de 86 }
wd5gnr 0:8baa10bd07de 87 #else
wd5gnr 0:8baa10bd07de 88 pc.printf("No SDCARD Support\r\n");
wd5gnr 0:8baa10bd07de 89 #endif
wd5gnr 0:8baa10bd07de 90
wd5gnr 0:8baa10bd07de 91 }
wd5gnr 0:8baa10bd07de 92
wd5gnr 0:8baa10bd07de 93
wd5gnr 0:8baa10bd07de 94 #if SDCARD==1
wd5gnr 0:8baa10bd07de 95 // Get a file name (press ? for a dir)
wd5gnr 0:8baa10bd07de 96 int getfn(char *fn)
wd5gnr 0:8baa10bd07de 97 {
wd5gnr 0:8baa10bd07de 98 char *fnp=fn+4;
wd5gnr 0:8baa10bd07de 99 int c;
wd5gnr 0:8baa10bd07de 100 int first=1;
wd5gnr 0:8baa10bd07de 101 pc.printf("File: ");
wd5gnr 0:8baa10bd07de 102 strcpy(fn,"/sd/"); // start here
wd5gnr 0:8baa10bd07de 103 // skip leading cruft
wd5gnr 0:8baa10bd07de 104 do {
wd5gnr 0:8baa10bd07de 105 c=getachar();
wd5gnr 0:8baa10bd07de 106 if (c==-1) {
wd5gnr 0:8baa10bd07de 107 *fn='\0';
wd5gnr 0:8baa10bd07de 108 return -1;
wd5gnr 0:8baa10bd07de 109 }
wd5gnr 0:8baa10bd07de 110 } while (isspace(c));
wd5gnr 0:8baa10bd07de 111 do {
wd5gnr 0:8baa10bd07de 112 if (first) first=0;
wd5gnr 0:8baa10bd07de 113 else c=getachar(); // get characters
wd5gnr 0:8baa10bd07de 114
wd5gnr 0:8baa10bd07de 115 if (c=='?') { // if ? do a directory listing
wd5gnr 0:8baa10bd07de 116 pc.printf("\r\n");
wd5gnr 0:8baa10bd07de 117 dir();
wd5gnr 0:8baa10bd07de 118 pc.printf("\r\n%s",fn+4);
wd5gnr 0:8baa10bd07de 119 continue;
wd5gnr 0:8baa10bd07de 120 }
wd5gnr 0:8baa10bd07de 121 if (c=='\r' || c=='\n') break; // end
wd5gnr 0:8baa10bd07de 122 if (c=='\x1b') return 0; // escape
wd5gnr 0:8baa10bd07de 123 if (c==8) { // backspace
wd5gnr 0:8baa10bd07de 124 if (fn!=fnp) {
wd5gnr 0:8baa10bd07de 125 pc.putc(8);
wd5gnr 0:8baa10bd07de 126 fnp--;
wd5gnr 0:8baa10bd07de 127 continue;
wd5gnr 0:8baa10bd07de 128 }
wd5gnr 0:8baa10bd07de 129 continue;
wd5gnr 0:8baa10bd07de 130 }
wd5gnr 0:8baa10bd07de 131 *fnp++=c;
wd5gnr 0:8baa10bd07de 132 } while (c!='\r');
wd5gnr 0:8baa10bd07de 133 *fnp='\0';
wd5gnr 0:8baa10bd07de 134 pc.printf("Filename: %s\r\n",fn);
wd5gnr 0:8baa10bd07de 135 return 1;
wd5gnr 0:8baa10bd07de 136 }
wd5gnr 0:8baa10bd07de 137
wd5gnr 0:8baa10bd07de 138 char fn[65]; // file name buffer
wd5gnr 0:8baa10bd07de 139 #endif
wd5gnr 0:8baa10bd07de 140
wd5gnr 0:8baa10bd07de 141 // read from SD card
wd5gnr 0:8baa10bd07de 142 void sdread()
wd5gnr 0:8baa10bd07de 143 {
wd5gnr 0:8baa10bd07de 144 #if SDCARD==1
wd5gnr 0:8baa10bd07de 145 FILE *f;
wd5gnr 0:8baa10bd07de 146 char *cp;
wd5gnr 0:8baa10bd07de 147 int cfgflag=0;
wd5gnr 0:8baa10bd07de 148 if (!getfn(fn)) return;
wd5gnr 0:8baa10bd07de 149 // determine if filename ends in .c*
wd5gnr 0:8baa10bd07de 150 cp=strchr(fn,'.');
wd5gnr 0:8baa10bd07de 151 if (cp!=NULL && (cp[1]=='c' || cp[1]=='C')) cfgflag=1;
wd5gnr 0:8baa10bd07de 152 f=fopen(fn,"r");
wd5gnr 0:8baa10bd07de 153 if (!f) {
wd5gnr 0:8baa10bd07de 154 pc.printf("Can't open %s\r\n",fn);
wd5gnr 0:8baa10bd07de 155 return;
wd5gnr 0:8baa10bd07de 156 }
wd5gnr 0:8baa10bd07de 157 do_read(f,cfgflag);
wd5gnr 0:8baa10bd07de 158 #else
wd5gnr 0:8baa10bd07de 159 pc.printf("No SDCARD support\r\n");
wd5gnr 0:8baa10bd07de 160 #endif
wd5gnr 0:8baa10bd07de 161 }
wd5gnr 0:8baa10bd07de 162
wd5gnr 0:8baa10bd07de 163 // Write to SD card
wd5gnr 0:8baa10bd07de 164 void sdwrite()
wd5gnr 0:8baa10bd07de 165 {
wd5gnr 0:8baa10bd07de 166 #if SDCARD==1
wd5gnr 0:8baa10bd07de 167 FILE *f;
wd5gnr 0:8baa10bd07de 168 char *cp;
wd5gnr 0:8baa10bd07de 169 int cfgflag=0;
wd5gnr 0:8baa10bd07de 170 int err=0;
wd5gnr 0:8baa10bd07de 171 if (!getfn(fn)) return;
wd5gnr 0:8baa10bd07de 172 // determine if filename ends in .c*
wd5gnr 0:8baa10bd07de 173 cp=strchr(fn,'.');
wd5gnr 0:8baa10bd07de 174 if (cp!=NULL && (cp[1]=='c' || cp[1]=='C')) cfgflag=1;
wd5gnr 0:8baa10bd07de 175 f=fopen(fn,"w"); // this seems to return 0 sometimes?
wd5gnr 0:8baa10bd07de 176 if (!f) {
wd5gnr 0:8baa10bd07de 177 pc.printf("Can't open %s\r\n",fn);
wd5gnr 0:8baa10bd07de 178 return;
wd5gnr 0:8baa10bd07de 179 }
wd5gnr 0:8baa10bd07de 180 if (cfgflag) { // write header for .c* files
wd5gnr 0:8baa10bd07de 181 unsigned version=0, count=sizeof(buffer);
wd5gnr 0:8baa10bd07de 182 if (fwrite(&version,1,sizeof(version),f)!=sizeof(version)) err=1;
wd5gnr 0:8baa10bd07de 183 if (err==0 && fwrite(&timebaseus,1,sizeof(timebaseus),f)!=sizeof(timebaseus)) err=1;
wd5gnr 0:8baa10bd07de 184 if (err==0 && fwrite(&count,1,sizeof(count),f)!=sizeof(count)) err=1;
wd5gnr 0:8baa10bd07de 185 }
wd5gnr 0:8baa10bd07de 186 // write data no matter what
wd5gnr 0:8baa10bd07de 187 if (err==0 && fwrite(buffer,1,sizeof(buffer),f)!=sizeof(buffer)) err=1;
wd5gnr 0:8baa10bd07de 188 if (fclose(f)) err=1;
wd5gnr 0:8baa10bd07de 189 if (err) pc.printf("Write error\r\n");
wd5gnr 0:8baa10bd07de 190
wd5gnr 0:8baa10bd07de 191 #else
wd5gnr 0:8baa10bd07de 192 pc.printf("No SDCARD support\r\n");
wd5gnr 0:8baa10bd07de 193 #endif
wd5gnr 0:8baa10bd07de 194 }
wd5gnr 0:8baa10bd07de 195