A UNIX emulation shell to access the underlying SDCard FileSystem through a terminal interface

Dependents:   Waldo_Embed_V2

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");
}
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;
+//}
+
+