Eli Hughes / Mbed 2 deprecated COMPACT_FLASH_2

Dependencies:   mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers Terminal.c Source File

Terminal.c

00001 #include "Terminal.h"
00002 #include "DataTypes.h"
00003 #include "mbed.h"
00004 #include "MODSERIAL.h"
00005 #include "diskio.h"
00006 #include "USBHost.h"
00007 
00008 //*****************************************************************
00009 //Terminal Configuration
00010 //*****************************************************************
00011 
00012 #define MAX_TERMINAL_LINE_CHARS 64
00013 #define MAX_TERMINAL_CMD_CHARS  32
00014 #define TERMINAL_QUEUE_SIZE     512
00015 #define NUM_TERMINAL_CMDS       3
00016 
00017 
00018 MODSERIAL pc(USBTX, USBRX,TERMINAL_QUEUE_SIZE,TERMINAL_QUEUE_SIZE); // tx, rx
00019 
00020 Timer DataSpeedTimer;
00021 
00022 typedef void (*TerminalCallback)(char *);
00023 
00024 //These are the terminal command names that map to the callbacks
00025 char *TerminalCommands[NUM_TERMINAL_CMDS] = {"help","reboot","dprobe"};
00026 
00027 void TerminalCmd_Help(char *arg);
00028 void TerminalCmd_Reboot(char *arg);
00029 void TerminalCmd_dprobe(char *arg);
00030 
00031 
00032 //Probes a disk
00033 BOOL dprobe(BYTE Disk);
00034 void SpeedTest(BYTE Disk,DWORD SECTORS_TO_READ_WRITE);
00035 
00036 
00037 
00038 //Populate this array with the callback functions
00039 TerminalCallback TerminalCallbacks[NUM_TERMINAL_CMDS] ={
00040                                                             TerminalCmd_Help,
00041                                                             TerminalCmd_Reboot,
00042                                                             TerminalCmd_dprobe
00043                                                         };
00044 
00045 //*****************************************************************
00046 //Plumbing.....
00047 //*****************************************************************
00048 
00049 
00050 BYTE TerminalInQueueStore[TERMINAL_QUEUE_SIZE];
00051 BYTE TerminalOutQueueStore[TERMINAL_QUEUE_SIZE];
00052 CHAR TerminalLineBuf[MAX_TERMINAL_LINE_CHARS];
00053 BYTE TerminalPos;
00054 CHAR TerminalCmdBuf[MAX_TERMINAL_CMD_CHARS+1];
00055 CHAR TerminalArgs[MAX_TERMINAL_LINE_CHARS-MAX_TERMINAL_CMD_CHARS];
00056 BYTE NextCharIn;
00057 BOOL CmdFound;
00058  
00059 void TerminalBootMsg()
00060 {
00061 
00062 TERMINAL_PRINTF("\r\n\r\n"); 
00063 TERMINAL_PRINTF("***********************************\r\n"); 
00064 TERMINAL_PRINTF("                       /|\r\n"); 
00065 TERMINAL_PRINTF("     ____       __   -- |\r\n");     
00066 TERMINAL_PRINTF("    (___ \\      \\ \\    _|_\r\n");    
00067 TERMINAL_PRINTF("      __) )______\\ \\      \r\n");      
00068 TERMINAL_PRINTF("     / __/(  __  )> \\     \r\n");     
00069 TERMINAL_PRINTF("    | |___ | || |/ ^ \\    \r\n");    
00070 TERMINAL_PRINTF("    |_____)|_||_/_/ \\_\\   \r\n"); 
00071 TERMINAL_PRINTF("                           \r\n");
00072 TERMINAL_PRINTF("Active Pickguard            \r\n");
00073 TERMINAL_PRINTF("Copyright (C) <2011>  Eli Hughes\r\n");
00074 TERMINAL_PRINTF("Wavenumber LLC\r\n"); 
00075 TERMINAL_PRINTF("***********************************\r\n\r\n>"); 
00076 
00077 }
00078 
00079 void InitTerminal()
00080 {
00081     TerminalBootMsg();
00082 }
00083 
00084 void TerminalCmd_Help(char *arg)
00085 {
00086     BYTE i;
00087 
00088       TERMINAL_PRINTF("\r\n\r\bCommandList:\r\n");
00089       TERMINAL_PRINTF("----------------------\r\n");
00090 
00091     for(i=0;i<NUM_TERMINAL_CMDS;i++)
00092     {
00093          TERMINAL_PRINTF("%s\r\n",TerminalCommands[i]);    
00094     }
00095 
00096 }
00097 
00098 void TerminalCmd_Reboot(char *arg)
00099 {
00100       TerminalBootMsg();
00101 }
00102 
00103 void TerminalCmd_dprobe(char *arg)
00104 {
00105     if(strcmp(arg,"CF") == 0)
00106     {
00107             if(dprobe(COMPACT_FLASH)==TRUE)
00108                 SpeedTest(COMPACT_FLASH,4096);
00109     }
00110     else if (strcmp(arg,"USB") == 0)
00111     {
00112             if(dprobe(USB)==TRUE)
00113                 SpeedTest(USB,256);
00114     }
00115     else if (strcmp(arg,"RAM") == 0)
00116     {
00117 
00118             if(dprobe(RAM)==TRUE)
00119                 SpeedTest(RAM,8192);
00120     }
00121     else
00122     {
00123         TERMINAL_PRINTF("\r\nUsage:  dprobe DISK\r\n\r\nDISK can be CF, USB or RAM\r\n");
00124     }
00125 }
00126 
00127 
00128 void ProcessTerminal()
00129 {
00130      BYTE i,j;
00131      BOOL ArgsFound;
00132         
00133     if(TERMINAL_READABLE)
00134     {
00135        NextCharIn = TERMINAL_GETC;
00136        
00137         switch(NextCharIn)
00138         {
00139             case '\r':
00140              
00141              TerminalLineBuf[TerminalPos++] = 0x0;
00142              TERMINAL_PUTC(NextCharIn);
00143            
00144              if(TerminalPos > 1)
00145              {
00146                  //find the command
00147                  i=0;
00148                  while(TerminalLineBuf[i]>0x20 &&  TerminalLineBuf[i]<0x7f)
00149                  {
00150                       TerminalCmdBuf[i] = TerminalLineBuf[i];
00151                       i++;
00152     
00153                     if(i==MAX_TERMINAL_CMD_CHARS)
00154                         {
00155                          break;
00156                         }
00157                  }
00158                     
00159                 TerminalCmdBuf[i] = 0;
00160                 TerminalCmdBuf[i+1] = 0;
00161                 
00162                 
00163                 ArgsFound = TRUE;
00164                 memset(TerminalArgs,0x00,sizeof(TerminalArgs));
00165                 //scan for num terminator or next non whitespace
00166                 while(TerminalLineBuf[i]<=0x20 && (i<MAX_TERMINAL_LINE_CHARS))
00167                 {
00168                     if(TerminalLineBuf[i] == 0x00)
00169                     {
00170                     
00171                         //if we find a NULL terminator before a non whitespace character they flag for no arguments
00172                         ArgsFound = FALSE;
00173                         break;
00174                     }   
00175                     i++; 
00176                 }
00177                 
00178                 if(ArgsFound == TRUE)
00179                 {
00180                     strcpy(TerminalArgs,&TerminalLineBuf[i]);
00181                     
00182                     //trim trailing whitespace
00183                     i = sizeof(TerminalArgs)-1;
00184                     
00185                     while((TerminalArgs[i]<0x21) && (i>0))
00186                     {
00187                         TerminalArgs[i]= 0x00;
00188                         i--;
00189                     }       
00190                 }
00191                 
00192                 CmdFound = FALSE;
00193                 for(j=0;j<NUM_TERMINAL_CMDS;j++)
00194                 {           
00195                     if(strcmp(TerminalCmdBuf,TerminalCommands[j]) == 0)
00196                     {
00197                         TERMINAL_PRINTF("\r\n");
00198                         if(TerminalCallbacks[j] != NULL)
00199                             TerminalCallbacks[j](TerminalArgs);
00200                     
00201                         CmdFound = TRUE;
00202                         break;
00203                     }             
00204                 }        
00205                 if(CmdFound == FALSE)
00206                 {
00207                   TERMINAL_PRINTF("\r\n%s command not recognized.\r\n",TerminalCmdBuf);
00208                 }
00209               }    
00210              TERMINAL_PRINTF("\r\n>");
00211              TerminalPos = 0;
00212             
00213             break;
00214             
00215             case '\b':
00216                 if(TerminalPos > 0)
00217                 {
00218                     TerminalPos--;    
00219                     TERMINAL_PUTC(NextCharIn);
00220                 }
00221             break;
00222             
00223             default:
00224                 
00225                 if(TerminalPos == 0 && NextCharIn == 0x020)
00226                 {
00227                      //Do nothing if space bar is pressed at beginning of line    
00228                 }
00229                    else if(NextCharIn >= 0x20 && NextCharIn<0x7F)
00230                 {
00231                     
00232                     if(TerminalPos < MAX_TERMINAL_LINE_CHARS-1)
00233                     {
00234                          TerminalLineBuf[TerminalPos++] = NextCharIn;
00235                         TERMINAL_PUTC(NextCharIn);
00236                     }
00237                 }
00238             
00239             break;
00240         
00241         }
00242     }
00243  
00244 }
00245 
00246 
00247 
00248 BYTE DataBuf[512];
00249 BYTE DataBufCheck[512];
00250 
00251 void SpeedTest(BYTE Disk, DWORD SECTORS_TO_READ_WRITE)
00252 {
00253 
00254         float DataWriteSpeed = 0;
00255         float DataReadSpeed = 0;
00256         float DataReadWriteSpeed = 0;
00257         int i,j,k;   
00258         
00259           
00260         TERMINAL_PRINTF("\r\nData write test started...\r\n",DataReadSpeed);
00261         DataSpeedTimer.reset();
00262         DataSpeedTimer.start();    
00263         
00264         for(i=0;i<SECTORS_TO_READ_WRITE;i++)
00265         {
00266            USBLoop();
00267             if(disk_write (Disk,&DataBuf[0],i,1) == RES_ERROR)
00268                {
00269                    TERMINAL_PRINTF("Error writing test block %d, stopping.\r\n", i);
00270                    return; 
00271                }
00272         }    
00273         DataSpeedTimer.stop();
00274         
00275         DataWriteSpeed = (((SECTORS_TO_READ_WRITE * 512.0)/1024.0))/(DataSpeedTimer.read());
00276         
00277         TERMINAL_PRINTF("Data write speed %.1f kb/s\r\n\r\n",DataWriteSpeed);
00278         TERMINAL_PRINTF("Data read test started...\r\n",DataReadSpeed);
00279         
00280         DataSpeedTimer.reset();
00281         DataSpeedTimer.start();    
00282         for(i=0;i<SECTORS_TO_READ_WRITE;i++)
00283         {
00284            USBLoop();
00285             if(disk_read ( Disk,&DataBuf[0],i,1) == RES_ERROR)
00286                {
00287                
00288                    TERMINAL_PRINTF("Error reading test block %d, stopping.\r\n", i);
00289                    return;
00290                }
00291         }
00292         DataSpeedTimer.stop();
00293         
00294         DataReadSpeed = (((SECTORS_TO_READ_WRITE * 512.0)/1024.0))/(DataSpeedTimer.read());
00295         TERMINAL_PRINTF("Data read speed %.1f kb/s\r\r\n\n",DataReadSpeed);
00296         TERMINAL_PRINTF("Data read/write test started...\r\n",DataReadSpeed);
00297         
00298         DataSpeedTimer.reset();
00299         DataSpeedTimer.start();    
00300         
00301         for(j=0;j<SECTORS_TO_READ_WRITE;j++)
00302         {
00303            
00304            USBLoop();
00305            for(i=0;i<512;i++)
00306            {
00307                DataBuf[i] = rand();
00308                DataBufCheck[i] = 0;
00309            }
00310           
00311               if(disk_write (Disk,&DataBuf[0],j,1) == RES_ERROR)
00312                {
00313                    TERMINAL_PRINTF("Error writing test block %d, stopping.\r\n", i);
00314                    return;
00315                }
00316            
00317             if(disk_read (Disk,&DataBufCheck[0],j,1) == RES_ERROR)
00318                {
00319                    TERMINAL_PRINTF("Error reading test block %d, stopping.\r\n", i);
00320                    return;
00321                }
00322         
00323                
00324            for(i=0;i<512;i++)
00325            {
00326                if(DataBuf[i]!=DataBufCheck[i])
00327                {
00328                      TERMINAL_PRINTF("Readback failure on test block %d byte %d\r\n",j,i);
00329         
00330                        for(k=0;k<512;k++)
00331                        {
00332                            TERMINAL_PRINTF("k:%d     Wrote: %d  Read: %d\r\n",k,DataBuf[k],DataBufCheck[k]);
00333                             break;
00334                        }
00335                      return;
00336                }
00337            }
00338 }
00339 DataSpeedTimer.stop();
00340 
00341 DataReadWriteSpeed = (((SECTORS_TO_READ_WRITE * 512.0)/1024.0))/(DataSpeedTimer.read());
00342 TERMINAL_PRINTF("Data read/write speed %.1f kb/s\r\n",DataReadWriteSpeed);
00343 }
00344 
00345 BOOL dprobe(BYTE Disk)
00346 {
00347     DWORD NumSectors;
00348     CHAR ModelName[41] = {0};
00349     CHAR SerialNumber[21] = {0};
00350     CHAR FirmwareVerion[9] = {0};
00351     BOOL RetVal; 
00352         
00353     if(disk_status(Disk)&STA_NODISK)
00354     {
00355           TERMINAL_PRINTF("\r\nDisk not attached");
00356           RetVal = FALSE;
00357     }
00358     else
00359     {
00360               TERMINAL_PRINTF("\r\n\r\nDisk Detected\r\n\r\n\n");
00361               if(disk_initialize(Disk)&STA_NOINIT)
00362               {
00363                 TERMINAL_PRINTF("Disk Failed Initialization\r\n");
00364                 RetVal = FALSE;
00365               }
00366               else
00367               {
00368                   TERMINAL_PRINTF("Disk Initialization Success!\r\n");
00369                   
00370                   
00371                   TERMINAL_PRINTF("Probing attached Disk\r\n");
00372                   TERMINAL_PRINTF("-----------------------\r\n");
00373                   
00374                   disk_ioctl (Disk,       
00375                               GET_SECTOR_COUNT,     
00376                               &NumSectors       
00377                               ); 
00378                   disk_ioctl (Disk,       
00379                               ATA_GET_MODEL,       
00380                               ModelName       
00381                               ); 
00382                   disk_ioctl (Disk,    
00383                               ATA_GET_REV,      
00384                               FirmwareVerion      
00385                               ); 
00386                   disk_ioctl (Disk,     
00387                              ATA_GET_SN,      
00388                               SerialNumber       
00389                               ); 
00390                 
00391                 
00392                  TERMINAL_PRINTF("Model Name: %s\r\n", ModelName);
00393                  TERMINAL_PRINTF("Firmware Version: %s\r\n",FirmwareVerion);
00394                  TERMINAL_PRINTF("Serial Number: %s\r\n",SerialNumber);
00395                  TERMINAL_PRINTF("Number of Sectors: %d\r\n",NumSectors);  
00396                  RetVal = TRUE;
00397                }
00398     }
00399  
00400     return RetVal;
00401 }