Hackaday demo: Signal generator
Dependencies: SDFileSystem mbed
sdcard.cpp@1:c229c3ceb909, 2015-09-15 (annotated)
- 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?
User | Revision | Line number | New 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 |