Demonstration of a very simple unix-like shell. Based on integrating both Klaus Bu\'s SDHCFileSystem and the FATFileSystem library out of Thomas Hamilton\'s SDCard program. Result: you get high capacity + a plethora of filesystem functions.

Dependencies:   mbed

Committer:
shimniok
Date:
Tue Oct 11 15:13:42 2011 +0000
Revision:
0:792bddcf799d
Initial

Who changed what in which revision?

UserRevisionLine numberNew contents of line
shimniok 0:792bddcf799d 1 #include "mbed.h"
shimniok 0:792bddcf799d 2 #include "stdint.h"
shimniok 0:792bddcf799d 3 #include "DirHandle.h"
shimniok 0:792bddcf799d 4 #include "SDHCFileSystem.h"
shimniok 0:792bddcf799d 5
shimniok 0:792bddcf799d 6 SDFileSystem sd(p5, p6, p7, p8, "SDCard"); // mosi, miso, sclk, cs
shimniok 0:792bddcf799d 7
shimniok 0:792bddcf799d 8 DigitalOut led1(LED1);
shimniok 0:792bddcf799d 9 DigitalOut led2(LED2);
shimniok 0:792bddcf799d 10 DigitalOut led3(LED3);
shimniok 0:792bddcf799d 11 DigitalOut led4(LED4);
shimniok 0:792bddcf799d 12 Serial pc(USBTX, USBRX);
shimniok 0:792bddcf799d 13
shimniok 0:792bddcf799d 14 // cd
shimniok 0:792bddcf799d 15 // cat
shimniok 0:792bddcf799d 16 // ls
shimniok 0:792bddcf799d 17
shimniok 0:792bddcf799d 18 char cwd[64];
shimniok 0:792bddcf799d 19 char arg[64];
shimniok 0:792bddcf799d 20 char buf[128];
shimniok 0:792bddcf799d 21 bool debug=false;
shimniok 0:792bddcf799d 22
shimniok 0:792bddcf799d 23 void shell(void);
shimniok 0:792bddcf799d 24 char *split(char *s, char *t, int max, char delim);
shimniok 0:792bddcf799d 25 void termInput(char *cmd);
shimniok 0:792bddcf799d 26 void resolveDirectory(char *newpath, char *path);
shimniok 0:792bddcf799d 27 void splitName(char *path, char *dirname, char *basename);
shimniok 0:792bddcf799d 28 void ls(char *path);
shimniok 0:792bddcf799d 29 void cd(char *path);
shimniok 0:792bddcf799d 30 void pwd(void);
shimniok 0:792bddcf799d 31 void touch(char *path);
shimniok 0:792bddcf799d 32 void head(char *path);
shimniok 0:792bddcf799d 33 void cat(char *path);
shimniok 0:792bddcf799d 34
shimniok 0:792bddcf799d 35 int main()
shimniok 0:792bddcf799d 36 {
shimniok 0:792bddcf799d 37 pc.baud(115200);
shimniok 0:792bddcf799d 38
shimniok 0:792bddcf799d 39 shell();
shimniok 0:792bddcf799d 40
shimniok 0:792bddcf799d 41 while (1) {
shimniok 0:792bddcf799d 42 led1 = !led1;
shimniok 0:792bddcf799d 43 wait_ms(250);
shimniok 0:792bddcf799d 44 led2 = !led2;
shimniok 0:792bddcf799d 45 wait_ms(250);
shimniok 0:792bddcf799d 46 led3 = !led3;
shimniok 0:792bddcf799d 47 wait_ms(250);
shimniok 0:792bddcf799d 48 led4 = !led4;
shimniok 0:792bddcf799d 49 wait_ms(250);
shimniok 0:792bddcf799d 50 }
shimniok 0:792bddcf799d 51 }
shimniok 0:792bddcf799d 52
shimniok 0:792bddcf799d 53 void shell() {
shimniok 0:792bddcf799d 54 FILE *fp;
shimniok 0:792bddcf799d 55 char newpath[64], *arg, cmd[64], cmdline[64];
shimniok 0:792bddcf799d 56 bool done=false;
shimniok 0:792bddcf799d 57
shimniok 0:792bddcf799d 58 //Logger.SelectCRCMode(1);
shimniok 0:792bddcf799d 59
shimniok 0:792bddcf799d 60 //pc.printf("Formatting...\n");
shimniok 0:792bddcf799d 61 //int i = Logger.format(32);
shimniok 0:792bddcf799d 62 //pc.printf("format result: %d\n", i);
shimniok 0:792bddcf799d 63
shimniok 0:792bddcf799d 64 if ((fp = fopen("/SDCard/message.txt", "w")) != NULL) {
shimniok 0:792bddcf799d 65 for (int i=0; i < 20; i++)
shimniok 0:792bddcf799d 66 fprintf(fp, "Hello, World!\n");
shimniok 0:792bddcf799d 67 fclose(fp);
shimniok 0:792bddcf799d 68 //pc.printf("created!\n");
shimniok 0:792bddcf799d 69 } else {
shimniok 0:792bddcf799d 70 pc.printf("Error creating file\n");
shimniok 0:792bddcf799d 71 }
shimniok 0:792bddcf799d 72 pc.printf("\n");
shimniok 0:792bddcf799d 73
shimniok 0:792bddcf799d 74 strcpy(cwd, "/SDCard");
shimniok 0:792bddcf799d 75
shimniok 0:792bddcf799d 76 while (!done) {
shimniok 0:792bddcf799d 77 termInput(cmdline);
shimniok 0:792bddcf799d 78 arg = split(cmd, cmdline, 64, ' ');
shimniok 0:792bddcf799d 79 resolveDirectory(newpath, arg);
shimniok 0:792bddcf799d 80
shimniok 0:792bddcf799d 81 if (debug) pc.printf("cmdline:<%s> cmd:<%s> arg:<%s> newpath:<%s>\n", cmdline, cmd, arg, newpath);
shimniok 0:792bddcf799d 82
shimniok 0:792bddcf799d 83 if (!strcmp(cmd, "ls")) {
shimniok 0:792bddcf799d 84 ls(newpath);
shimniok 0:792bddcf799d 85 } else if (!strcmp(cmd, "cd")) {
shimniok 0:792bddcf799d 86 cd(newpath);
shimniok 0:792bddcf799d 87 } else if (!strcmp(cmd, "pwd")) {
shimniok 0:792bddcf799d 88 pwd();
shimniok 0:792bddcf799d 89 } else if (!strcmp(cmd, "head")) {
shimniok 0:792bddcf799d 90 head(newpath);
shimniok 0:792bddcf799d 91 } else if (!strcmp(cmd, "cat")) {
shimniok 0:792bddcf799d 92 cat(newpath);
shimniok 0:792bddcf799d 93 } else if (!strcmp(cmd, "mkdir")) {
shimniok 0:792bddcf799d 94 mkdir(newpath, 1023);
shimniok 0:792bddcf799d 95 } else if (!strcmp(cmd, "debug")) {
shimniok 0:792bddcf799d 96 debug = !debug;
shimniok 0:792bddcf799d 97 } else if (!strcmp(cmd, "touch")) {
shimniok 0:792bddcf799d 98 touch(newpath);
shimniok 0:792bddcf799d 99 } else if (!strcmp(cmd, "rm")) {
shimniok 0:792bddcf799d 100 remove(newpath);
shimniok 0:792bddcf799d 101 } else if (!strcmp(cmd, "exit")) {
shimniok 0:792bddcf799d 102 done = true;
shimniok 0:792bddcf799d 103 } else {
shimniok 0:792bddcf799d 104 pc.printf("%s: command not found\n", cmd);
shimniok 0:792bddcf799d 105 }
shimniok 0:792bddcf799d 106 }
shimniok 0:792bddcf799d 107
shimniok 0:792bddcf799d 108 /*
shimniok 0:792bddcf799d 109 pc.printf("Printing splitName()\n");
shimniok 0:792bddcf799d 110 splitName("/SDCard/testdir", dirname, basename);
shimniok 0:792bddcf799d 111 pc.printf("%s %s\n", dirname, basename);
shimniok 0:792bddcf799d 112
shimniok 0:792bddcf799d 113 pc.printf("Printing resolveDirectory()\n");
shimniok 0:792bddcf799d 114 resolveDirectory(newpath, "test");
shimniok 0:792bddcf799d 115 pc.printf("%s\n", newpath);
shimniok 0:792bddcf799d 116 */
shimniok 0:792bddcf799d 117
shimniok 0:792bddcf799d 118 // remove("/SDCard/testdir/TEST.txt");
shimniok 0:792bddcf799d 119
shimniok 0:792bddcf799d 120 /*int test = rename("/SDCard/message.txt", "/SDCard/message2.txt");
shimniok 0:792bddcf799d 121 fp = fopen("/SDCard/message.txt", "a");
shimniok 0:792bddcf799d 122 fprintf(fp, " Result = %d", test);
shimniok 0:792bddcf799d 123 fclose(fp);*/
shimniok 0:792bddcf799d 124
shimniok 0:792bddcf799d 125 pc.printf ("exiting shell\n");
shimniok 0:792bddcf799d 126
shimniok 0:792bddcf799d 127 return;
shimniok 0:792bddcf799d 128 }
shimniok 0:792bddcf799d 129
shimniok 0:792bddcf799d 130 // copy t to s until delimiter is reached
shimniok 0:792bddcf799d 131 // return location of delimiter+1 in t
shimniok 0:792bddcf799d 132 char *split(char *s, char *t, int max, char delim)
shimniok 0:792bddcf799d 133 {
shimniok 0:792bddcf799d 134 int i = 0;
shimniok 0:792bddcf799d 135 char *v;
shimniok 0:792bddcf799d 136
shimniok 0:792bddcf799d 137 if (s == 0 || t == 0)
shimniok 0:792bddcf799d 138 return 0;
shimniok 0:792bddcf799d 139
shimniok 0:792bddcf799d 140 while (*t != 0 && *t != delim && i < max) {
shimniok 0:792bddcf799d 141 *s++ = *t++;
shimniok 0:792bddcf799d 142 i++;
shimniok 0:792bddcf799d 143 }
shimniok 0:792bddcf799d 144 *s = 0;
shimniok 0:792bddcf799d 145
shimniok 0:792bddcf799d 146 if (*t == '\0')
shimniok 0:792bddcf799d 147 v = s;
shimniok 0:792bddcf799d 148 else
shimniok 0:792bddcf799d 149 v = t+1;
shimniok 0:792bddcf799d 150
shimniok 0:792bddcf799d 151 return v;
shimniok 0:792bddcf799d 152 }
shimniok 0:792bddcf799d 153
shimniok 0:792bddcf799d 154
shimniok 0:792bddcf799d 155 /** termInput
shimniok 0:792bddcf799d 156 *
shimniok 0:792bddcf799d 157 */
shimniok 0:792bddcf799d 158 void termInput(char *cmd) {
shimniok 0:792bddcf799d 159 int i=0;
shimniok 0:792bddcf799d 160 char c;
shimniok 0:792bddcf799d 161 bool done = false;
shimniok 0:792bddcf799d 162
shimniok 0:792bddcf799d 163 memset(cmd, 0, 64);
shimniok 0:792bddcf799d 164
shimniok 0:792bddcf799d 165 pc.printf("# ", cwd);
shimniok 0:792bddcf799d 166 do {
shimniok 0:792bddcf799d 167 cmd[i] = 0;
shimniok 0:792bddcf799d 168 c = pc.getc();
shimniok 0:792bddcf799d 169 if (c == '\r') { // if return is hit, we're done, don't add \r to cmd
shimniok 0:792bddcf799d 170 done = true;
shimniok 0:792bddcf799d 171 } else if (i < 64-1) {
shimniok 0:792bddcf799d 172 if (c == 0x7f) { // backspace
shimniok 0:792bddcf799d 173 if (i > 0) { // if we're at the beginning, do nothing
shimniok 0:792bddcf799d 174 i--;
shimniok 0:792bddcf799d 175 pc.printf("\b \b");
shimniok 0:792bddcf799d 176 }
shimniok 0:792bddcf799d 177 } else {
shimniok 0:792bddcf799d 178 pc.printf("%c", c);
shimniok 0:792bddcf799d 179 cmd[i++] = c;
shimniok 0:792bddcf799d 180 }
shimniok 0:792bddcf799d 181 }
shimniok 0:792bddcf799d 182 } while (!done);
shimniok 0:792bddcf799d 183 pc.printf("\n");
shimniok 0:792bddcf799d 184 }
shimniok 0:792bddcf799d 185
shimniok 0:792bddcf799d 186 /** resolveDirectory
shimniok 0:792bddcf799d 187 * resolve the directory path provided, given the cwd
shimniok 0:792bddcf799d 188 */
shimniok 0:792bddcf799d 189 void resolveDirectory(char *newpath, char *path) {
shimniok 0:792bddcf799d 190 char basename[64], dirname[64];
shimniok 0:792bddcf799d 191
shimniok 0:792bddcf799d 192 /** absolute path */
shimniok 0:792bddcf799d 193 if (path[0] == '/') {
shimniok 0:792bddcf799d 194 strcpy(newpath, path);
shimniok 0:792bddcf799d 195 }
shimniok 0:792bddcf799d 196 /** relative path */
shimniok 0:792bddcf799d 197 else {
shimniok 0:792bddcf799d 198 strcpy(newpath, cwd);
shimniok 0:792bddcf799d 199 if (path[0] != 0) {
shimniok 0:792bddcf799d 200 if (newpath[strlen(newpath)-1] != '/')
shimniok 0:792bddcf799d 201 strcat(newpath, "/");
shimniok 0:792bddcf799d 202 strcat(newpath, path);
shimniok 0:792bddcf799d 203 }
shimniok 0:792bddcf799d 204 /** Resolve .. references */
shimniok 0:792bddcf799d 205 splitName(newpath, dirname, basename);
shimniok 0:792bddcf799d 206 if (!strcmp(basename, "..")) {
shimniok 0:792bddcf799d 207 splitName(dirname, newpath, basename);
shimniok 0:792bddcf799d 208 }
shimniok 0:792bddcf799d 209 }
shimniok 0:792bddcf799d 210 }
shimniok 0:792bddcf799d 211
shimniok 0:792bddcf799d 212 /** splitName
shimniok 0:792bddcf799d 213 * split the path into a dirname and a basename
shimniok 0:792bddcf799d 214 */
shimniok 0:792bddcf799d 215 void splitName(char *path, char *dirname, char *basename) {
shimniok 0:792bddcf799d 216 int sep;
shimniok 0:792bddcf799d 217
shimniok 0:792bddcf799d 218 sep = 0;
shimniok 0:792bddcf799d 219 if (debug) pc.printf("%d\n", strlen(path));
shimniok 0:792bddcf799d 220 for (int i=strlen(path)-1; i >= 0; i--) {
shimniok 0:792bddcf799d 221 if (debug) pc.printf("- %c\n", path[i]);
shimniok 0:792bddcf799d 222 sep = i;
shimniok 0:792bddcf799d 223 if (path[i] == '/') break;
shimniok 0:792bddcf799d 224 }
shimniok 0:792bddcf799d 225 for (int j=0; j < sep; j++) {
shimniok 0:792bddcf799d 226 if (debug) pc.printf("> %c\n", path[j]);
shimniok 0:792bddcf799d 227 dirname[j] = path[j];
shimniok 0:792bddcf799d 228 dirname[j+1] = 0;
shimniok 0:792bddcf799d 229 }
shimniok 0:792bddcf799d 230 for (int k=sep+1; k < strlen(path); k++) {
shimniok 0:792bddcf799d 231 if (debug) pc.printf("* %c\n", path[k]);
shimniok 0:792bddcf799d 232 basename[k-(sep+1)] = path[k];
shimniok 0:792bddcf799d 233 basename[k-sep] = 0;
shimniok 0:792bddcf799d 234 }
shimniok 0:792bddcf799d 235 if (debug) pc.printf("d:<%s> b:<%s>\n", dirname, basename);
shimniok 0:792bddcf799d 236 }
shimniok 0:792bddcf799d 237
shimniok 0:792bddcf799d 238 /** ls
shimniok 0:792bddcf799d 239 * lists files in the current working directory
shimniok 0:792bddcf799d 240 */
shimniok 0:792bddcf799d 241 void ls(char *path) {
shimniok 0:792bddcf799d 242 if (debug) pc.printf("%s\n", cwd);
shimniok 0:792bddcf799d 243 DIR *d;
shimniok 0:792bddcf799d 244 struct dirent *p;
shimniok 0:792bddcf799d 245
shimniok 0:792bddcf799d 246 if ((d = opendir(path)) != NULL) {
shimniok 0:792bddcf799d 247 while ((p = readdir(d)) != NULL) {
shimniok 0:792bddcf799d 248 pc.printf(" %s\n", p->d_name);
shimniok 0:792bddcf799d 249 }
shimniok 0:792bddcf799d 250 closedir(d);
shimniok 0:792bddcf799d 251 } else {
shimniok 0:792bddcf799d 252 pc.printf("%s: No such directory\n", path);
shimniok 0:792bddcf799d 253 }
shimniok 0:792bddcf799d 254 }
shimniok 0:792bddcf799d 255
shimniok 0:792bddcf799d 256 /** cd
shimniok 0:792bddcf799d 257 * changes current working directory
shimniok 0:792bddcf799d 258 */
shimniok 0:792bddcf799d 259 void cd(char *path) {
shimniok 0:792bddcf799d 260 strcpy(cwd, path);
shimniok 0:792bddcf799d 261 }
shimniok 0:792bddcf799d 262
shimniok 0:792bddcf799d 263 /** pwd
shimniok 0:792bddcf799d 264 * print current working directory
shimniok 0:792bddcf799d 265 */
shimniok 0:792bddcf799d 266 void pwd() {
shimniok 0:792bddcf799d 267 pc.printf("%s\n", cwd);
shimniok 0:792bddcf799d 268 }
shimniok 0:792bddcf799d 269
shimniok 0:792bddcf799d 270 /** touch
shimniok 0:792bddcf799d 271 * create an empty file
shimniok 0:792bddcf799d 272 */
shimniok 0:792bddcf799d 273 void touch(char *path) {
shimniok 0:792bddcf799d 274 FILE *fp;
shimniok 0:792bddcf799d 275 if ((fp = fopen(path, "w")) != NULL) {
shimniok 0:792bddcf799d 276 fclose(fp);
shimniok 0:792bddcf799d 277 } else {
shimniok 0:792bddcf799d 278 pc.printf("%s: No such file\n", path);
shimniok 0:792bddcf799d 279 }
shimniok 0:792bddcf799d 280 }
shimniok 0:792bddcf799d 281
shimniok 0:792bddcf799d 282 /** head
shimniok 0:792bddcf799d 283 * print the first 10 lines of a file
shimniok 0:792bddcf799d 284 */
shimniok 0:792bddcf799d 285 void head(char *path) {
shimniok 0:792bddcf799d 286 FILE *fp;
shimniok 0:792bddcf799d 287 char line = 0;
shimniok 0:792bddcf799d 288
shimniok 0:792bddcf799d 289 if ((fp = fopen(path, "r")) != NULL) {
shimniok 0:792bddcf799d 290 while (!feof(fp) && line++ < 10) {
shimniok 0:792bddcf799d 291 fgets(buf, 128, fp);
shimniok 0:792bddcf799d 292 pc.printf("%s", buf);
shimniok 0:792bddcf799d 293 }
shimniok 0:792bddcf799d 294 fclose(fp);
shimniok 0:792bddcf799d 295 } else {
shimniok 0:792bddcf799d 296 pc.printf("%s: No such file\n", path);
shimniok 0:792bddcf799d 297 }
shimniok 0:792bddcf799d 298 }
shimniok 0:792bddcf799d 299
shimniok 0:792bddcf799d 300 /** cat
shimniok 0:792bddcf799d 301 * display the content of a file
shimniok 0:792bddcf799d 302 */
shimniok 0:792bddcf799d 303 void cat(char *path) {
shimniok 0:792bddcf799d 304 FILE *fp;
shimniok 0:792bddcf799d 305
shimniok 0:792bddcf799d 306 if ((fp = fopen(path, "r")) != NULL) {
shimniok 0:792bddcf799d 307 while (!feof(fp)) {
shimniok 0:792bddcf799d 308 fgets(buf, 128, fp);
shimniok 0:792bddcf799d 309 pc.printf("%s", buf);
shimniok 0:792bddcf799d 310 }
shimniok 0:792bddcf799d 311 fclose(fp);
shimniok 0:792bddcf799d 312 } else {
shimniok 0:792bddcf799d 313 pc.printf("%s: No such file\n", path);
shimniok 0:792bddcf799d 314 }
shimniok 0:792bddcf799d 315 }