Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
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 }
Generated on Sat Jul 16 2022 22:22:09 by
1.7.2