Embed:
(wiki syntax)
Show/hide line numbers
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
Eli Hughes