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 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 }
Generated on Sat Jul 16 2022 16:37:46 by
1.7.2