A UNIX emulation shell to access the underlying SDCard FileSystem through a terminal interface
Information
Dependencies not included with library:
Information
SDShell does not change the com baudrate. Access is made using the baud as initialized by the Serial object when passed into the SDShell object
Example
#include "mbed.h" #include "SDFileSystem.h" #include "SDShell.h" Serial com(USBTX, USBRX); SDFileSystem sd(p11, p12, p13, p14, "sd"); SDShell emulate; int main() { emulate.init(); emulate.shell(com, sd, "/sd"); }
Diff: SDShell.h
- Revision:
- 1:514f321aa528
- Parent:
- 0:618e98bf18ce
- Child:
- 2:b3107e463974
--- a/SDShell.h Fri Apr 26 06:31:03 2013 +0000 +++ b/SDShell.h Sat Apr 27 16:08:39 2013 +0000 @@ -13,26 +13,40 @@ SDFileSystem *_storage; CommHandler _cmds; - char _cwd[32]; - char _path_to_file[64]; + #define SHELL_BUF_SIZE 64 + #define SHELL_BUF_MASK (SHELL_BUF_SIZE-1) + char _cwd[SHELL_BUF_SIZE]; +// char _arg[SHELL_BUF_SIZE]; + char _buf[128]; + char _new_path[SHELL_BUF_SIZE]; + char _cmd[SHELL_BUF_SIZE]; + char _cmd_line[SHELL_BUF_SIZE]; + char _path_to_file[SHELL_BUF_SIZE]; + char *_arg; + uint32_t _debug; - #define SHELL_RXBUF_SIZE 64 - #define SHELL_RXBUF_MASK (SHELL_RXBUF_SIZE-1) - struct - { - volatile uint32_t loc; - char data[SHELL_RXBUF_SIZE]; - }_rxbuf; + void shellInput(void); + char *split(char *dest, char *src, int max, char delim); + void resolveDirectory(char *newpath, char *path); + void splitName(char *path, char *dirname, char *basename); + uint32_t match(char *arg1, char *arg2); + + void ls(char *path, Serial *pc) ; + void cd(char *path); + void pwd(Serial *pc); + void head(char *path, Serial *pc); + void cat(char *path, Serial *pc); + void touch(char *path, Serial *pc); - char *ls(char *); - char *cd(char *); - char *pwd(char *); - char *head(char *); - char *cat(char *); - char *mkdir(char *); - char *touch(char *); - char *remove(char *); - char *resolvePath(char *string); +// char *ls(char *); +// char *cd(char *); +// char *pwd(char *); +// char *head(char *); +// char *cat(char *); +// char *mkdir(char *); +// char *touch(char *); +// char *remove(char *); +// char *resolvePath(char *string); public: SDShell(); @@ -45,3 +59,111 @@ #endif +//void SDShell::shell(Serial &com, SDFileSystem &storage, char *cwd) +//{ +// // should check on the device here +// _com = &com; +// strcpy(_cwd, cwd); +// +// _com->printf("%s \n", _cwd); // print out the directory that we're in +// while(1) +// { +// char c = _com->getc(); +// if (c == '\r') // look for something to do +// { +// _cmds.serviceMessage(_rxbuf.data); +// _com->printf("\nECHO: %s \n", _rxbuf.data); +// +// memset(_rxbuf.data, 0, _rxbuf.loc-1); +// _rxbuf.loc = 0; +// } +// else if (c == 0x7f) // backspace +// { +// if (_rxbuf.loc > 0) +// { +// _rxbuf.loc--; +// _com->printf("\b \b"); +// } +// } +// else +// { +// _com->putc(c); +// _rxbuf.data[_rxbuf.loc++] = c; +// _rxbuf.loc &= SHELL_RXBUF_MASK; +// } +// } +// return; +//} +// +//// not working - need to pick back up here +//char *SDShell::ls(char *string) +//{ +// //ls: lists files in the current working directory +// _com->printf(" %s\n", _cwd); +// +// DIR *d = opendir(_cwd); // <- problem here?? +// _com->printf(" %s\n", _cwd); +// if(d != NULL) +// { +// struct dirent *p; +// _com->printf(" %s\n", _cwd); +// do +// { +// p = readdir(d); // doesn't take parameter?? where does this go? +// _com->printf(" file: %s\n", p->d_name); +// } +// while(p != NULL); +// +// closedir(d); +// } +// else +// { +// _com->printf("%s: No such directory\n", _cwd); +// } +// +// return string; +//} +// +//char *SDShell::cd(char *string){ return string;} +//char *SDShell::pwd(char *string){ return string;} +//char *SDShell::head(char *string){ return string;} +// +//char *SDShell::cat(char *string) +//{ +// // display the content of a file eg: cat readme.txt +// resolvePath((string+4)); +// +// FILE *fp = fopen(_path_to_file, "r"); +// if(NULL != fp) +// { +// char *buf = new char [1024]; +// while (!feof(fp)) +// { +// fgets(buf, sizeof(buf), fp); +// _com->printf("%s", buf); +// } +// fclose(fp); +// delete [] buf; +// } +// else +// { +// _com->printf("\n%s: No such file\n", _path_to_file); +// } +// +// return string; +// } +// +//char *SDShell::mkdir(char *string){ return string;} +//char *SDShell::touch(char *string){ return string;} +//char *SDShell::remove(char *string){ return string;} +// +//char *SDShell::resolvePath(char *string) +//{ +// strcpy(_path_to_file, _cwd); +// strcat(_path_to_file, "/"); +// strcat(_path_to_file, string); +// +// return _path_to_file; +//} + +