Eli Hughes / Mbed 2 deprecated COMPACT_FLASH

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