Dependencies:   mbed

Revision:
0:76427232f435
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Terminal.c	Thu Feb 16 00:41:26 2012 +0000
@@ -0,0 +1,401 @@
+#include "Terminal.h"
+#include "DataTypes.h"
+#include "mbed.h"
+#include "MODSERIAL.h"
+#include "diskio.h"
+#include "USBHost.h"
+
+//*****************************************************************
+//Terminal Configuration
+//*****************************************************************
+
+#define MAX_TERMINAL_LINE_CHARS 64
+#define MAX_TERMINAL_CMD_CHARS  32
+#define TERMINAL_QUEUE_SIZE     512
+#define NUM_TERMINAL_CMDS       3
+
+
+MODSERIAL pc(USBTX, USBRX,TERMINAL_QUEUE_SIZE,TERMINAL_QUEUE_SIZE); // tx, rx
+
+Timer DataSpeedTimer;
+
+typedef void (*TerminalCallback)(char *);
+
+//These are the terminal command names that map to the callbacks
+char *TerminalCommands[NUM_TERMINAL_CMDS] = {"help","reboot","dprobe"};
+
+void TerminalCmd_Help(char *arg);
+void TerminalCmd_Reboot(char *arg);
+void TerminalCmd_dprobe(char *arg);
+
+
+//Probes a disk
+BOOL dprobe(BYTE Disk);
+void SpeedTest(BYTE Disk,DWORD SECTORS_TO_READ_WRITE);
+
+
+
+//Populate this array with the callback functions
+TerminalCallback TerminalCallbacks[NUM_TERMINAL_CMDS] ={
+                                                            TerminalCmd_Help,
+                                                            TerminalCmd_Reboot,
+                                                            TerminalCmd_dprobe
+                                                        };
+
+//*****************************************************************
+//Plumbing.....
+//*****************************************************************
+
+
+BYTE TerminalInQueueStore[TERMINAL_QUEUE_SIZE];
+BYTE TerminalOutQueueStore[TERMINAL_QUEUE_SIZE];
+CHAR TerminalLineBuf[MAX_TERMINAL_LINE_CHARS];
+BYTE TerminalPos;
+CHAR TerminalCmdBuf[MAX_TERMINAL_CMD_CHARS+1];
+CHAR TerminalArgs[MAX_TERMINAL_LINE_CHARS-MAX_TERMINAL_CMD_CHARS];
+BYTE NextCharIn;
+BOOL CmdFound;
+ 
+void TerminalBootMsg()
+{
+
+TERMINAL_PRINTF("\r\n\r\n"); 
+TERMINAL_PRINTF("***********************************\r\n"); 
+TERMINAL_PRINTF("                       /|\r\n"); 
+TERMINAL_PRINTF("     ____       __   -- |\r\n");     
+TERMINAL_PRINTF("    (___ \\      \\ \\    _|_\r\n");    
+TERMINAL_PRINTF("      __) )______\\ \\      \r\n");      
+TERMINAL_PRINTF("     / __/(  __  )> \\     \r\n");     
+TERMINAL_PRINTF("    | |___ | || |/ ^ \\    \r\n");    
+TERMINAL_PRINTF("    |_____)|_||_/_/ \\_\\   \r\n"); 
+TERMINAL_PRINTF("                           \r\n");
+TERMINAL_PRINTF("Active Pickguard            \r\n");
+TERMINAL_PRINTF("Copyright (C) <2011>  Eli Hughes\r\n");
+TERMINAL_PRINTF("Wavenumber LLC\r\n"); 
+TERMINAL_PRINTF("***********************************\r\n\r\n>"); 
+
+}
+
+void InitTerminal()
+{
+    TerminalBootMsg();
+}
+
+void TerminalCmd_Help(char *arg)
+{
+    BYTE i;
+
+      TERMINAL_PRINTF("\r\n\r\bCommandList:\r\n");
+      TERMINAL_PRINTF("----------------------\r\n");
+
+    for(i=0;i<NUM_TERMINAL_CMDS;i++)
+    {
+         TERMINAL_PRINTF("%s\r\n",TerminalCommands[i]);    
+    }
+
+}
+
+void TerminalCmd_Reboot(char *arg)
+{
+      TerminalBootMsg();
+}
+
+void TerminalCmd_dprobe(char *arg)
+{
+    if(strcmp(arg,"CF") == 0)
+    {
+            if(dprobe(COMPACT_FLASH)==TRUE)
+                SpeedTest(COMPACT_FLASH,4096);
+    }
+    else if (strcmp(arg,"USB") == 0)
+    {
+            if(dprobe(USB)==TRUE)
+                SpeedTest(USB,256);
+    }
+    else if (strcmp(arg,"RAM") == 0)
+    {
+
+            if(dprobe(RAM)==TRUE)
+                SpeedTest(RAM,8192);
+    }
+    else
+    {
+        TERMINAL_PRINTF("\r\nUsage:  dprobe DISK\r\n\r\nDISK can be CF, USB or RAM\r\n");
+    }
+}
+
+
+void ProcessTerminal()
+{
+     BYTE i,j;
+     BOOL ArgsFound;
+        
+    if(TERMINAL_READABLE)
+    {
+       NextCharIn = TERMINAL_GETC;
+       
+        switch(NextCharIn)
+        {
+            case '\r':
+             
+             TerminalLineBuf[TerminalPos++] = 0x0;
+             TERMINAL_PUTC(NextCharIn);
+           
+             if(TerminalPos > 1)
+             {
+                 //find the command
+                 i=0;
+                 while(TerminalLineBuf[i]>0x20 &&  TerminalLineBuf[i]<0x7f)
+                 {
+                      TerminalCmdBuf[i] = TerminalLineBuf[i];
+                      i++;
+    
+                    if(i==MAX_TERMINAL_CMD_CHARS)
+                        {
+                         break;
+                        }
+                 }
+                    
+                TerminalCmdBuf[i] = 0;
+                TerminalCmdBuf[i+1] = 0;
+                
+                
+                ArgsFound = TRUE;
+                memset(TerminalArgs,0x00,sizeof(TerminalArgs));
+                //scan for num terminator or next non whitespace
+                while(TerminalLineBuf[i]<=0x20 && (i<MAX_TERMINAL_LINE_CHARS))
+                {
+                    if(TerminalLineBuf[i] == 0x00)
+                    {
+                    
+                        //if we find a NULL terminator before a non whitespace character they flag for no arguments
+                        ArgsFound = FALSE;
+                        break;
+                    }   
+                    i++; 
+                }
+                
+                if(ArgsFound == TRUE)
+                {
+                    strcpy(TerminalArgs,&TerminalLineBuf[i]);
+                    
+                    //trim trailing whitespace
+                    i = sizeof(TerminalArgs)-1;
+                    
+                    while((TerminalArgs[i]<0x21) && (i>0))
+                    {
+                        TerminalArgs[i]= 0x00;
+                        i--;
+                    }       
+                }
+                
+                CmdFound = FALSE;
+                for(j=0;j<NUM_TERMINAL_CMDS;j++)
+                {           
+                    if(strcmp(TerminalCmdBuf,TerminalCommands[j]) == 0)
+                    {
+                        TERMINAL_PRINTF("\r\n");
+                        if(TerminalCallbacks[j] != NULL)
+                            TerminalCallbacks[j](TerminalArgs);
+                    
+                        CmdFound = TRUE;
+                        break;
+                    }             
+                }        
+                if(CmdFound == FALSE)
+                {
+                  TERMINAL_PRINTF("\r\n%s command not recognized.\r\n",TerminalCmdBuf);
+                }
+              }    
+             TERMINAL_PRINTF("\r\n>");
+             TerminalPos = 0;
+            
+            break;
+            
+            case '\b':
+                if(TerminalPos > 0)
+                {
+                    TerminalPos--;    
+                    TERMINAL_PUTC(NextCharIn);
+                }
+            break;
+            
+            default:
+                
+                if(TerminalPos == 0 && NextCharIn == 0x020)
+                {
+                     //Do nothing if space bar is pressed at beginning of line    
+                }
+                   else if(NextCharIn >= 0x20 && NextCharIn<0x7F)
+                {
+                    
+                    if(TerminalPos < MAX_TERMINAL_LINE_CHARS-1)
+                    {
+                         TerminalLineBuf[TerminalPos++] = NextCharIn;
+                        TERMINAL_PUTC(NextCharIn);
+                    }
+                }
+            
+            break;
+        
+        }
+    }
+ 
+}
+
+
+
+BYTE DataBuf[512];
+BYTE DataBufCheck[512];
+
+void SpeedTest(BYTE Disk, DWORD SECTORS_TO_READ_WRITE)
+{
+
+        float DataWriteSpeed = 0;
+        float DataReadSpeed = 0;
+        float DataReadWriteSpeed = 0;
+        int i,j,k;   
+        
+          
+        TERMINAL_PRINTF("\r\nData write test started...\r\n",DataReadSpeed);
+        DataSpeedTimer.reset();
+        DataSpeedTimer.start();    
+        
+        for(i=0;i<SECTORS_TO_READ_WRITE;i++)
+        {
+           USBLoop();
+            if(disk_write (Disk,&DataBuf[0],i,1) == RES_ERROR)
+               {
+                   TERMINAL_PRINTF("Error writing test block %d, stopping.\r\n", i);
+                   return; 
+               }
+        }    
+        DataSpeedTimer.stop();
+        
+        DataWriteSpeed = (((SECTORS_TO_READ_WRITE * 512.0)/1024.0))/(DataSpeedTimer.read());
+        
+        TERMINAL_PRINTF("Data write speed %.1f kb/s\r\n\r\n",DataWriteSpeed);
+        TERMINAL_PRINTF("Data read test started...\r\n",DataReadSpeed);
+        
+        DataSpeedTimer.reset();
+        DataSpeedTimer.start();    
+        for(i=0;i<SECTORS_TO_READ_WRITE;i++)
+        {
+           USBLoop();
+            if(disk_read ( Disk,&DataBuf[0],i,1) == RES_ERROR)
+               {
+               
+                   TERMINAL_PRINTF("Error reading test block %d, stopping.\r\n", i);
+                   return;
+               }
+        }
+        DataSpeedTimer.stop();
+        
+        DataReadSpeed = (((SECTORS_TO_READ_WRITE * 512.0)/1024.0))/(DataSpeedTimer.read());
+        TERMINAL_PRINTF("Data read speed %.1f kb/s\r\r\n\n",DataReadSpeed);
+        TERMINAL_PRINTF("Data read/write test started...\r\n",DataReadSpeed);
+        
+        DataSpeedTimer.reset();
+        DataSpeedTimer.start();    
+        
+        for(j=0;j<SECTORS_TO_READ_WRITE;j++)
+        {
+           
+           USBLoop();
+           for(i=0;i<512;i++)
+           {
+               DataBuf[i] = rand();
+               DataBufCheck[i] = 0;
+           }
+          
+              if(disk_write (Disk,&DataBuf[0],j,1) == RES_ERROR)
+               {
+                   TERMINAL_PRINTF("Error writing test block %d, stopping.\r\n", i);
+                   return;
+               }
+           
+            if(disk_read (Disk,&DataBufCheck[0],j,1) == RES_ERROR)
+               {
+                   TERMINAL_PRINTF("Error reading test block %d, stopping.\r\n", i);
+                   return;
+               }
+        
+               
+           for(i=0;i<512;i++)
+           {
+               if(DataBuf[i]!=DataBufCheck[i])
+               {
+                     TERMINAL_PRINTF("Readback failure on test block %d byte %d\r\n",j,i);
+        
+                       for(k=0;k<512;k++)
+                       {
+                           TERMINAL_PRINTF("k:%d     Wrote: %d  Read: %d\r\n",k,DataBuf[k],DataBufCheck[k]);
+                            break;
+                       }
+                     return;
+               }
+           }
+}
+DataSpeedTimer.stop();
+
+DataReadWriteSpeed = (((SECTORS_TO_READ_WRITE * 512.0)/1024.0))/(DataSpeedTimer.read());
+TERMINAL_PRINTF("Data read/write speed %.1f kb/s\r\n",DataReadWriteSpeed);
+}
+
+BOOL dprobe(BYTE Disk)
+{
+    DWORD NumSectors;
+    CHAR ModelName[41] = {0};
+    CHAR SerialNumber[21] = {0};
+    CHAR FirmwareVerion[9] = {0};
+    BOOL RetVal; 
+        
+    if(disk_status(Disk)&STA_NODISK)
+    {
+          TERMINAL_PRINTF("\r\nDisk not attached");
+          RetVal = FALSE;
+    }
+    else
+    {
+              TERMINAL_PRINTF("\r\n\r\nDisk Detected\r\n\r\n\n");
+              if(disk_initialize(Disk)&STA_NOINIT)
+              {
+                TERMINAL_PRINTF("Disk Failed Initialization\r\n");
+                RetVal = FALSE;
+              }
+              else
+              {
+                  TERMINAL_PRINTF("Disk Initialization Success!\r\n");
+                  
+                  
+                  TERMINAL_PRINTF("Probing attached Disk\r\n");
+                  TERMINAL_PRINTF("-----------------------\r\n");
+                  
+                  disk_ioctl (Disk,       
+                              GET_SECTOR_COUNT,     
+                              &NumSectors       
+                              ); 
+                  disk_ioctl (Disk,       
+                              ATA_GET_MODEL,       
+                              ModelName       
+                              ); 
+                  disk_ioctl (Disk,    
+                              ATA_GET_REV,      
+                              FirmwareVerion      
+                              ); 
+                  disk_ioctl (Disk,     
+                             ATA_GET_SN,      
+                              SerialNumber       
+                              ); 
+                
+                
+                 TERMINAL_PRINTF("Model Name: %s\r\n", ModelName);
+                 TERMINAL_PRINTF("Firmware Version: %s\r\n",FirmwareVerion);
+                 TERMINAL_PRINTF("Serial Number: %s\r\n",SerialNumber);
+                 TERMINAL_PRINTF("Number of Sectors: %d\r\n",NumSectors);  
+                 RetVal = TRUE;
+               }
+    }
+ 
+    return RetVal;
+}
\ No newline at end of file