Diff: Terminal.c
- Revision:
- 0:76427232f435
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Terminal.c Thu Feb 16 00:41:26 2012 +0000
@@ -0,0 +1,401 @@
+#include "Terminal.h"
+#include "DataTypes.h"
+#include "mbed.h"
+#include "MODSERIAL.h"
+#include "diskio.h"
+#include "USBHost.h"
+
+//*****************************************************************
+//Terminal Configuration
+//*****************************************************************
+
+#define MAX_TERMINAL_LINE_CHARS 64
+#define MAX_TERMINAL_CMD_CHARS 32
+#define TERMINAL_QUEUE_SIZE 512
+#define NUM_TERMINAL_CMDS 3
+
+
+MODSERIAL pc(USBTX, USBRX,TERMINAL_QUEUE_SIZE,TERMINAL_QUEUE_SIZE); // tx, rx
+
+Timer DataSpeedTimer;
+
+typedef void (*TerminalCallback)(char *);
+
+//These are the terminal command names that map to the callbacks
+char *TerminalCommands[NUM_TERMINAL_CMDS] = {"help","reboot","dprobe"};
+
+void TerminalCmd_Help(char *arg);
+void TerminalCmd_Reboot(char *arg);
+void TerminalCmd_dprobe(char *arg);
+
+
+//Probes a disk
+BOOL dprobe(BYTE Disk);
+void SpeedTest(BYTE Disk,DWORD SECTORS_TO_READ_WRITE);
+
+
+
+//Populate this array with the callback functions
+TerminalCallback TerminalCallbacks[NUM_TERMINAL_CMDS] ={
+ TerminalCmd_Help,
+ TerminalCmd_Reboot,
+ TerminalCmd_dprobe
+ };
+
+//*****************************************************************
+//Plumbing.....
+//*****************************************************************
+
+
+BYTE TerminalInQueueStore[TERMINAL_QUEUE_SIZE];
+BYTE TerminalOutQueueStore[TERMINAL_QUEUE_SIZE];
+CHAR TerminalLineBuf[MAX_TERMINAL_LINE_CHARS];
+BYTE TerminalPos;
+CHAR TerminalCmdBuf[MAX_TERMINAL_CMD_CHARS+1];
+CHAR TerminalArgs[MAX_TERMINAL_LINE_CHARS-MAX_TERMINAL_CMD_CHARS];
+BYTE NextCharIn;
+BOOL CmdFound;
+
+void TerminalBootMsg()
+{
+
+TERMINAL_PRINTF("\r\n\r\n");
+TERMINAL_PRINTF("***********************************\r\n");
+TERMINAL_PRINTF(" /|\r\n");
+TERMINAL_PRINTF(" ____ __ -- |\r\n");
+TERMINAL_PRINTF(" (___ \\ \\ \\ _|_\r\n");
+TERMINAL_PRINTF(" __) )______\\ \\ \r\n");
+TERMINAL_PRINTF(" / __/( __ )> \\ \r\n");
+TERMINAL_PRINTF(" | |___ | || |/ ^ \\ \r\n");
+TERMINAL_PRINTF(" |_____)|_||_/_/ \\_\\ \r\n");
+TERMINAL_PRINTF(" \r\n");
+TERMINAL_PRINTF("Active Pickguard \r\n");
+TERMINAL_PRINTF("Copyright (C) <2011> Eli Hughes\r\n");
+TERMINAL_PRINTF("Wavenumber LLC\r\n");
+TERMINAL_PRINTF("***********************************\r\n\r\n>");
+
+}
+
+void InitTerminal()
+{
+ TerminalBootMsg();
+}
+
+void TerminalCmd_Help(char *arg)
+{
+ BYTE i;
+
+ TERMINAL_PRINTF("\r\n\r\bCommandList:\r\n");
+ TERMINAL_PRINTF("----------------------\r\n");
+
+ for(i=0;i<NUM_TERMINAL_CMDS;i++)
+ {
+ TERMINAL_PRINTF("%s\r\n",TerminalCommands[i]);
+ }
+
+}
+
+void TerminalCmd_Reboot(char *arg)
+{
+ TerminalBootMsg();
+}
+
+void TerminalCmd_dprobe(char *arg)
+{
+ if(strcmp(arg,"CF") == 0)
+ {
+ if(dprobe(COMPACT_FLASH)==TRUE)
+ SpeedTest(COMPACT_FLASH,4096);
+ }
+ else if (strcmp(arg,"USB") == 0)
+ {
+ if(dprobe(USB)==TRUE)
+ SpeedTest(USB,256);
+ }
+ else if (strcmp(arg,"RAM") == 0)
+ {
+
+ if(dprobe(RAM)==TRUE)
+ SpeedTest(RAM,8192);
+ }
+ else
+ {
+ TERMINAL_PRINTF("\r\nUsage: dprobe DISK\r\n\r\nDISK can be CF, USB or RAM\r\n");
+ }
+}
+
+
+void ProcessTerminal()
+{
+ BYTE i,j;
+ BOOL ArgsFound;
+
+ if(TERMINAL_READABLE)
+ {
+ NextCharIn = TERMINAL_GETC;
+
+ switch(NextCharIn)
+ {
+ case '\r':
+
+ TerminalLineBuf[TerminalPos++] = 0x0;
+ TERMINAL_PUTC(NextCharIn);
+
+ if(TerminalPos > 1)
+ {
+ //find the command
+ i=0;
+ while(TerminalLineBuf[i]>0x20 && TerminalLineBuf[i]<0x7f)
+ {
+ TerminalCmdBuf[i] = TerminalLineBuf[i];
+ i++;
+
+ if(i==MAX_TERMINAL_CMD_CHARS)
+ {
+ break;
+ }
+ }
+
+ TerminalCmdBuf[i] = 0;
+ TerminalCmdBuf[i+1] = 0;
+
+
+ ArgsFound = TRUE;
+ memset(TerminalArgs,0x00,sizeof(TerminalArgs));
+ //scan for num terminator or next non whitespace
+ while(TerminalLineBuf[i]<=0x20 && (i<MAX_TERMINAL_LINE_CHARS))
+ {
+ if(TerminalLineBuf[i] == 0x00)
+ {
+
+ //if we find a NULL terminator before a non whitespace character they flag for no arguments
+ ArgsFound = FALSE;
+ break;
+ }
+ i++;
+ }
+
+ if(ArgsFound == TRUE)
+ {
+ strcpy(TerminalArgs,&TerminalLineBuf[i]);
+
+ //trim trailing whitespace
+ i = sizeof(TerminalArgs)-1;
+
+ while((TerminalArgs[i]<0x21) && (i>0))
+ {
+ TerminalArgs[i]= 0x00;
+ i--;
+ }
+ }
+
+ CmdFound = FALSE;
+ for(j=0;j<NUM_TERMINAL_CMDS;j++)
+ {
+ if(strcmp(TerminalCmdBuf,TerminalCommands[j]) == 0)
+ {
+ TERMINAL_PRINTF("\r\n");
+ if(TerminalCallbacks[j] != NULL)
+ TerminalCallbacks[j](TerminalArgs);
+
+ CmdFound = TRUE;
+ break;
+ }
+ }
+ if(CmdFound == FALSE)
+ {
+ TERMINAL_PRINTF("\r\n%s command not recognized.\r\n",TerminalCmdBuf);
+ }
+ }
+ TERMINAL_PRINTF("\r\n>");
+ TerminalPos = 0;
+
+ break;
+
+ case '\b':
+ if(TerminalPos > 0)
+ {
+ TerminalPos--;
+ TERMINAL_PUTC(NextCharIn);
+ }
+ break;
+
+ default:
+
+ if(TerminalPos == 0 && NextCharIn == 0x020)
+ {
+ //Do nothing if space bar is pressed at beginning of line
+ }
+ else if(NextCharIn >= 0x20 && NextCharIn<0x7F)
+ {
+
+ if(TerminalPos < MAX_TERMINAL_LINE_CHARS-1)
+ {
+ TerminalLineBuf[TerminalPos++] = NextCharIn;
+ TERMINAL_PUTC(NextCharIn);
+ }
+ }
+
+ break;
+
+ }
+ }
+
+}
+
+
+
+BYTE DataBuf[512];
+BYTE DataBufCheck[512];
+
+void SpeedTest(BYTE Disk, DWORD SECTORS_TO_READ_WRITE)
+{
+
+ float DataWriteSpeed = 0;
+ float DataReadSpeed = 0;
+ float DataReadWriteSpeed = 0;
+ int i,j,k;
+
+
+ TERMINAL_PRINTF("\r\nData write test started...\r\n",DataReadSpeed);
+ DataSpeedTimer.reset();
+ DataSpeedTimer.start();
+
+ for(i=0;i<SECTORS_TO_READ_WRITE;i++)
+ {
+ USBLoop();
+ if(disk_write (Disk,&DataBuf[0],i,1) == RES_ERROR)
+ {
+ TERMINAL_PRINTF("Error writing test block %d, stopping.\r\n", i);
+ return;
+ }
+ }
+ DataSpeedTimer.stop();
+
+ DataWriteSpeed = (((SECTORS_TO_READ_WRITE * 512.0)/1024.0))/(DataSpeedTimer.read());
+
+ TERMINAL_PRINTF("Data write speed %.1f kb/s\r\n\r\n",DataWriteSpeed);
+ TERMINAL_PRINTF("Data read test started...\r\n",DataReadSpeed);
+
+ DataSpeedTimer.reset();
+ DataSpeedTimer.start();
+ for(i=0;i<SECTORS_TO_READ_WRITE;i++)
+ {
+ USBLoop();
+ if(disk_read ( Disk,&DataBuf[0],i,1) == RES_ERROR)
+ {
+
+ TERMINAL_PRINTF("Error reading test block %d, stopping.\r\n", i);
+ return;
+ }
+ }
+ DataSpeedTimer.stop();
+
+ DataReadSpeed = (((SECTORS_TO_READ_WRITE * 512.0)/1024.0))/(DataSpeedTimer.read());
+ TERMINAL_PRINTF("Data read speed %.1f kb/s\r\r\n\n",DataReadSpeed);
+ TERMINAL_PRINTF("Data read/write test started...\r\n",DataReadSpeed);
+
+ DataSpeedTimer.reset();
+ DataSpeedTimer.start();
+
+ for(j=0;j<SECTORS_TO_READ_WRITE;j++)
+ {
+
+ USBLoop();
+ for(i=0;i<512;i++)
+ {
+ DataBuf[i] = rand();
+ DataBufCheck[i] = 0;
+ }
+
+ if(disk_write (Disk,&DataBuf[0],j,1) == RES_ERROR)
+ {
+ TERMINAL_PRINTF("Error writing test block %d, stopping.\r\n", i);
+ return;
+ }
+
+ if(disk_read (Disk,&DataBufCheck[0],j,1) == RES_ERROR)
+ {
+ TERMINAL_PRINTF("Error reading test block %d, stopping.\r\n", i);
+ return;
+ }
+
+
+ for(i=0;i<512;i++)
+ {
+ if(DataBuf[i]!=DataBufCheck[i])
+ {
+ TERMINAL_PRINTF("Readback failure on test block %d byte %d\r\n",j,i);
+
+ for(k=0;k<512;k++)
+ {
+ TERMINAL_PRINTF("k:%d Wrote: %d Read: %d\r\n",k,DataBuf[k],DataBufCheck[k]);
+ break;
+ }
+ return;
+ }
+ }
+}
+DataSpeedTimer.stop();
+
+DataReadWriteSpeed = (((SECTORS_TO_READ_WRITE * 512.0)/1024.0))/(DataSpeedTimer.read());
+TERMINAL_PRINTF("Data read/write speed %.1f kb/s\r\n",DataReadWriteSpeed);
+}
+
+BOOL dprobe(BYTE Disk)
+{
+ DWORD NumSectors;
+ CHAR ModelName[41] = {0};
+ CHAR SerialNumber[21] = {0};
+ CHAR FirmwareVerion[9] = {0};
+ BOOL RetVal;
+
+ if(disk_status(Disk)&STA_NODISK)
+ {
+ TERMINAL_PRINTF("\r\nDisk not attached");
+ RetVal = FALSE;
+ }
+ else
+ {
+ TERMINAL_PRINTF("\r\n\r\nDisk Detected\r\n\r\n\n");
+ if(disk_initialize(Disk)&STA_NOINIT)
+ {
+ TERMINAL_PRINTF("Disk Failed Initialization\r\n");
+ RetVal = FALSE;
+ }
+ else
+ {
+ TERMINAL_PRINTF("Disk Initialization Success!\r\n");
+
+
+ TERMINAL_PRINTF("Probing attached Disk\r\n");
+ TERMINAL_PRINTF("-----------------------\r\n");
+
+ disk_ioctl (Disk,
+ GET_SECTOR_COUNT,
+ &NumSectors
+ );
+ disk_ioctl (Disk,
+ ATA_GET_MODEL,
+ ModelName
+ );
+ disk_ioctl (Disk,
+ ATA_GET_REV,
+ FirmwareVerion
+ );
+ disk_ioctl (Disk,
+ ATA_GET_SN,
+ SerialNumber
+ );
+
+
+ TERMINAL_PRINTF("Model Name: %s\r\n", ModelName);
+ TERMINAL_PRINTF("Firmware Version: %s\r\n",FirmwareVerion);
+ TERMINAL_PRINTF("Serial Number: %s\r\n",SerialNumber);
+ TERMINAL_PRINTF("Number of Sectors: %d\r\n",NumSectors);
+ RetVal = TRUE;
+ }
+ }
+
+ return RetVal;
+}
\ No newline at end of file