Robert Ceschini / Mbed 2 deprecated PSU-POWERLOGGER

Dependencies:   mbed

Fork of PSU-POWERLOGGER by Eli Hughes

Revision:
1:871a329fd172
Parent:
0:d0c18e423b13
Child:
3:d55665050fcb
--- a/CODE/System.cpp	Tue Sep 18 18:35:23 2012 +0000
+++ b/CODE/System.cpp	Fri Sep 21 18:06:47 2012 +0000
@@ -12,7 +12,9 @@
 WORD ButtonCheckTick;
 WORD DisplayShutOffTick;
 
+
 BYTE SystemState;
+BYTE WeAreInNormalMode;
 CHAR DTBuf[32];
 CHAR DataLineBuf[256];
 
@@ -27,22 +29,28 @@
 #define DISPLAY_BUFFER_STATS       0x04
 #define DISPLAY_FIRMWARE_VERSION   0x05
 #define DISPLAY_ID                 0x06
+#define DISPLAY_SERIAL_STATUS      0x07
+
 #define DISPLAY_OFF                0xFF
 
-#define NUM_DISPLAYS               7
+#define NUM_DISPLAYS               8
 #define DISPLAY_SHUTOFF_TIME    10000
 
 BYTE DisplayMode;
 BYTE LastBackLightColor = 0;
-
+BYTE LastSerialBrightness = 7;
+BOOL SerialFileIsOpen = FALSE;
+char SerialLineBuffer[256];
+UINT SerialLineBufferPtr;
+UINT LinesWritten =0;
 //*****************************************************************
 //Action Button Related stuff
 //*****************************************************************
 #define WAITING_FOR_PRESS   0x00
 #define WAITING_FOR_RELEASE 0x01
 
-BYTE PreviousButtonState;   
-BYTE CurrentButtonState;   
+BYTE PreviousButtonState;
+BYTE CurrentButtonState;
 WORD ButtonHoldTime;
 BYTE ButtonCheckState;
 void ActionButtonHandler(WORD ButtonPressTime);
@@ -89,14 +97,14 @@
 void InitRobotPowerMeasurementSystem()
 {
     InitDataBlocks(&MyDataBlock);
-     
+
     ActiveDataBlock = 0;
     DataBlocksWritten = 0;
     DataPointIndex = 0;
-    
+
     SystemTick.attach_us(&SystemTickIrq,10000);
     CurrentTime_InSec = time(NULL);
-  
+
     DataLogError = FALSE;
 }
 
@@ -104,108 +112,154 @@
 void InitDataBlocks(DataBlock * DB)
 {
     int i;
-  
-    for(i=0;i<DATA_BLOCK_SIZE;i++)
-    {
+
+    for(i=0; i<DATA_BLOCK_SIZE; i++) {
         DB->Voltage[i] = 0;
         DB->Current[i] = 0;
     }
-    
-     DB->WriteOutPtr = 0;
-     DB->ReadInPtr = 0;
+
+    DB->WriteOutPtr = 0;
+    DB->ReadInPtr = 0;
 }
 
 
 void EnterSystemState(BYTE NextState)
 {
-    switch(NextState)
-    {
+    switch(NextState) {
         default:
         case SYSTEM_STATE_INIT:
             DisplayMode = DISPLAY_MEASUREMENTS;
             SystemState = NextState;
-        break;
-        
+            break;
+
         case SYSTEM_STATE_LOGGING:
-              DisplayMode = DISPLAY_CARD_STATUS;
-              
-              if(InitDataLog() == FALSE)
-              {
+            DisplayMode = DISPLAY_CARD_STATUS;
+
+            if(InitDataLog() == FALSE) {
                 SystemState = NextState;
-              
-              }
-              else
-              {
+
+            } else {
                 SystemState = SYSTEM_STATE_IDLE;
-              }
-              
-        break;
-        
+            }
+
+            break;
+            
+        case SYSTEM_STATE_SERIAL_LOGGING:
+            if(InitSerialDataLog() == FALSE){
+                PrintfLogEnqueue(&PCBackDoorTx,"%cS",SERIALSPEED);
+                SystemState = NextState;
+            }
+            else{
+                SystemState=SYSTEM_STATE_IDLE;
+            }
+            break;
+
         case SYSTEM_STATE_IDLE:
             DisplayMode = DISPLAY_CARD_STATUS;
-            if(SystemState == SYSTEM_STATE_LOGGING)
-            {
-                f_close(&CurrentLogFileHandle);
-                f_mount(0,NULL);
-                PrintfEnqueue(&PCBackDoorTx,"Logging terminated on file %s\r\n>",CurrentLogFileName);
+            switch (SystemState){
+                 case SYSTEM_STATE_SERIAL_LOGGING:
+                    DisplayMode=DISPLAY_SERIAL_STATUS; //Need to stay here for serial logging
+                    //NO BREAK ON PURPOSE
+
+                 case SYSTEM_STATE_LOGGING:
+                    f_close(&CurrentLogFileHandle);
+                    f_mount(0,NULL);
+                    PrintfEnqueue(&PCBackDoorTx,"Logging terminated on file %s\r\n>",CurrentLogFileName);
+                    break;
             }
-            
             SystemState = NextState;
-        break;
+            break;
     }
 }
 
 BOOL InitDataLog()
 {
     UINT BytesWritten;
-    
+
     PrintfEnqueue(&PCBackDoorTx,"\r\n\r\bInitializing Data log....\r\n");
     CreateLogFileName();
     PrintfEnqueue(&PCBackDoorTx,"Filename: %s\r\n",CurrentLogFileName);
     PrintfEnqueue(&PCBackDoorTx,"Attempting File Open....\r\n");
- 
-    
+
+
     f_mount(0,&MyFileSystem);
-    if(f_open(&CurrentLogFileHandle,&CurrentLogFileName[0],FA_WRITE | FA_OPEN_ALWAYS) != FR_OK)
-      {
-                DataLogError = TRUE;
-                PrintfEnqueue(&PCBackDoorTx,"Could not open file!\r\n>");
-                ErrorMsg = "Write Error!";
-                return TRUE;
-      }
-   
-     
-     DataLogError = FALSE;
-     PrintfEnqueue(&PCBackDoorTx,"Writing Headers....\r\n");
-     time(&CurrentTime_InSec);
-     strftime(DTBuf,128, "%Y.%m.%d", localtime(&CurrentTime_InSec));
-     f_printf(&CurrentLogFileHandle, "Date      %s\r\n",DTBuf);
-     strftime(DTBuf,128, "%H:%M:%S", localtime(&CurrentTime_InSec));
-     f_printf(&CurrentLogFileHandle, "Time      %s\r\n\n",DTBuf);
-     sprintf(DTBuf, "Sample Rate   %.1f Hz\r\n\r\n",SAMPLE_RATE);
-     f_write(&CurrentLogFileHandle,DTBuf,strlen(DTBuf),&BytesWritten);
-     PrintfEnqueue(&PCBackDoorTx,"Headers Written.... Starting log\r\n");
-    
-    
-    PrintfEnqueue(&PCBackDoorTx,"\r\n>"); 
+    if(f_open(&CurrentLogFileHandle,&CurrentLogFileName[0],FA_WRITE | FA_OPEN_ALWAYS) != FR_OK) {
+        DataLogError = TRUE;
+        PrintfEnqueue(&PCBackDoorTx,"Could not open file!\r\n>");
+        ErrorMsg = "Write Error!";
+        return TRUE;
+    }
 
 
-          
+    DataLogError = FALSE;
+    PrintfEnqueue(&PCBackDoorTx,"Writing Headers....\r\n");
+    time(&CurrentTime_InSec);
+    strftime(DTBuf,128, "%Y.%m.%d", localtime(&CurrentTime_InSec));
+    f_printf(&CurrentLogFileHandle, "Date      %s\r\n",DTBuf);
+    strftime(DTBuf,128, "%H:%M:%S", localtime(&CurrentTime_InSec));
+    f_printf(&CurrentLogFileHandle, "Time      %s\r\n\n",DTBuf);
+    sprintf(DTBuf, "Sample Rate   %.1f Hz\r\n\r\n",SAMPLE_RATE);
+    f_write(&CurrentLogFileHandle,DTBuf,strlen(DTBuf),&BytesWritten);
+    PrintfEnqueue(&PCBackDoorTx,"Headers Written.... Starting log\r\n");
+
+
+    PrintfEnqueue(&PCBackDoorTx,"\r\n>");
+
+
+
     BinaryDataCachePtr = 0;
     WritesSinceLastFlush = 0;
-     
+
     DataBlocksWritten = 0;
     DataPointIndex = 0;
 
     return FALSE;
 }
 
+BOOL InitSerialDataLog()
+{
+    PrintfEnqueue(&PCBackDoorTx,"\r\n\r\bInitializing Data log....\r\n");
+    CreateLogFileName();
+    PrintfEnqueue(&PCBackDoorTx,"Filename: %s\r\n",CurrentLogFileName);
+    PrintfEnqueue(&PCBackDoorTx,"Attempting File Open....\r\n");
+
+
+    f_mount(0,&MyFileSystem);
+    if(f_open(&CurrentLogFileHandle,&CurrentLogFileName[0],FA_WRITE | FA_OPEN_ALWAYS) != FR_OK) {
+        DataLogError = TRUE;
+        PrintfEnqueue(&PCBackDoorTx,"Could not open file!\r\n>");
+        ErrorMsg = "Write Error!";
+        f_mount(0,0);
+        return TRUE;
+    }
+
+
+    DataLogError = FALSE;
+    PrintfEnqueue(&PCBackDoorTx,"Writing Headers....\r\n");
+    time(&CurrentTime_InSec);
+    f_printf(&CurrentLogFileHandle,"Rate,V1,C1,V2,C2,V3,C3,V4,C4,V5,C5,V6,C6,B1V,B1C,B2V,B2C,");
+    strftime(DTBuf,128, "%Y.%m.%d", localtime(&CurrentTime_InSec));
+   
+    f_printf(&CurrentLogFileHandle, "Date      ,%s,",DTBuf);
+    strftime(DTBuf,128, "%H:%M:%S", localtime(&CurrentTime_InSec));
+    f_printf(&CurrentLogFileHandle, "Time      ,%s\r\n\n",DTBuf);
+    
+//    sprintf(DTBuf, "Sample Rate   %.1f Hz\r\n\r\n",SAMPLE_RATE);
+//    f_write(&CurrentLogFileHandle,DTBuf,strlen(DTBuf),&BytesWritten);
+    f_sync(&CurrentLogFileHandle);
+    PrintfEnqueue(&PCBackDoorTx,"Headers Written.... Starting log\r\n");
+
+
+    PrintfEnqueue(&PCBackDoorTx,"\r\n>");
+    SerialLineBufferPtr=0;
+    return FALSE;
+}
 
 void CreateLogFileName()
 {
-     time(&CurrentTime_InSec);
-     strftime(CurrentLogFileName,256, "F%Y.%m.%d.%H.%M.%S.csv", localtime(&CurrentTime_InSec));
-}     
+    time(&CurrentTime_InSec);
+    strftime(CurrentLogFileName,256, "F%Y.%m.%d.%H.%M.%S.csv", localtime(&CurrentTime_InSec));
+}
 
 
 
@@ -213,14 +267,14 @@
 {
     if(UpdateHostTerminalTick<0xFFFF)
         UpdateHostTerminalTick++;
-        
+
     if(DisplayUpdateTick<0xFFFF)
         DisplayUpdateTick++;
-        
+
     if(ButtonCheckTick<0xFFFF)
-         ButtonCheckTick++;
-         
-     if(DisplayShutOffTick<0xFFFF)
+        ButtonCheckTick++;
+
+    if(DisplayShutOffTick<0xFFFF)
         DisplayShutOffTick++;
 }
 
@@ -234,117 +288,146 @@
 }
 void CheckButton()
 {
-    if(ButtonCheckTick>0)
-    {
+    if(ButtonCheckTick>0) {
         ButtonCheckTick = 0;
-        
+
         PreviousButtonState = CurrentButtonState;
-        CurrentButtonState = ActionButton.read();    
-    
-        switch(ButtonCheckState)
-        {
+        CurrentButtonState = ActionButton.read();
+
+        switch(ButtonCheckState) {
             default:
             case WAITING_FOR_PRESS:
-            
-            if(CurrentButtonState == TRUE && PreviousButtonState == FALSE)
-            {
-                ButtonCheckState = WAITING_FOR_RELEASE; 
-            }
-            
-            ButtonHoldTime = 0;
-            
-            break;
-                        
+
+                if(CurrentButtonState == TRUE && PreviousButtonState == FALSE) {
+                    ButtonCheckState = WAITING_FOR_RELEASE;
+                }
+
+                ButtonHoldTime = 0;
+
+                break;
+
             case WAITING_FOR_RELEASE:
-            
-            if(CurrentButtonState == TRUE && PreviousButtonState == TRUE)
-            {
-                ButtonHoldTime++;
-            }
-            else if(CurrentButtonState == FALSE && PreviousButtonState == TRUE)
-            {
-                ActionButtonHandler(ButtonHoldTime);
-                ButtonCheckState = WAITING_FOR_PRESS;    
-            }
-            else
-            {
-               ButtonCheckState = WAITING_FOR_PRESS;    
-            }
-            break;
+
+                if(CurrentButtonState == TRUE && PreviousButtonState == TRUE) {
+                    ButtonHoldTime++;
+                } else if(CurrentButtonState == FALSE && PreviousButtonState == TRUE) {
+                    ActionButtonHandler(ButtonHoldTime);
+                    ButtonCheckState = WAITING_FOR_PRESS;
+                } else {
+                    ButtonCheckState = WAITING_FOR_PRESS;
+                }
+                break;
         }
     }
 }
-
+char SpeedString[20];
+void TranslateToText(){
+    switch(SERIALSPEED){
+        case '0':
+            sprintf(&SpeedString[0],"20 mS");
+            break;
+        case '1':
+            sprintf(&SpeedString[0],"30 mS");
+            break;
+        case '2':
+            sprintf(&SpeedString[0],"40 mS");
+            break;
+        case '3':
+            sprintf(&SpeedString[0],"50 mS");
+            break;
+        case '4':
+            sprintf(&SpeedString[0],"100 mS");
+            break;
+        case '5':
+            sprintf(&SpeedString[0],"1 S");
+            break;
+        case '6':
+            sprintf(&SpeedString[0],"2 S");
+            break;
+        case '7':
+            sprintf(&SpeedString[0],"5 S");
+            break;
+        case '8':
+            sprintf(&SpeedString[0],"10 S");
+            break;
+        case '9':
+            sprintf(&SpeedString[0],"30 S");
+            break;
+        default:
+            sprintf(&SpeedString[0],"ERROR");
+            break;
+    }
+}
 
 void ActionButtonHandler(WORD ButtonPressTime)
 {
     DisplayShutOffTick = 0;
 
-    if(ButtonPressTime<50)
-    {
-       if(DisplayMode == DISPLAY_OFF)
-       {
-         PowerUpSmartSwitch();
-         SmartSwitch_Reset();
-         SmartSwitchClear();
-         DisplayMode = DISPLAY_MEASUREMENTS;
-       }
-       else
-       {
-       
-            if(DataLogError == TRUE)
-            {
+    if(ButtonPressTime<50) {
+        if(DisplayMode == DISPLAY_OFF) {
+            PowerUpSmartSwitch();
+            SmartSwitch_Reset();
+            SmartSwitchClear();
+            DisplayMode = DISPLAY_MEASUREMENTS;
+        } else {
+
+            if(DataLogError == TRUE) {
                 DataLogError = FALSE;
-            }
-            else
-            {
+            } else {
                 DisplayMode++;
-               
-                if(DisplayMode >= NUM_DISPLAYS)
-                {
+
+                if(DisplayMode >= NUM_DISPLAYS) {
                     DisplayMode = 0;
                 }
             }
         }
     }
-    
-    else if(ButtonPressTime>100 && ButtonPressTime<500)
-    {
-        switch(SystemState)
-        {
+
+    else if(ButtonPressTime>100 && ButtonPressTime<500) { //Long action button
+        switch(SystemState) {
             default:
             case SYSTEM_STATE_IDLE:
-               switch(DisplayMode)
-               {
-                   default:
-                 
-                    break;
-               
+                switch(DisplayMode) {
+                    default:
+
+                        break;
+
                     case DISPLAY_MEASUREMENTS:
                         AdjustIOffset();
+                        break;
+
+
+                    case DISPLAY_FIRMWARE_VERSION:
+                        LoadConfiguration();
+                        break;
+
+
+                    case DISPLAY_CARD_STATUS:
+                        //  if(SDCardDetect == 1)
+                    {
+                        EnterSystemState(SYSTEM_STATE_LOGGING);
+                    }
                     break;
                     
-                    
-                    case DISPLAY_FIRMWARE_VERSION:
-                        LoadConfiguration();
-                    break;
-                    
-                    
-                    case DISPLAY_CARD_STATUS:
-                       //  if(SDCardDetect == 1)
-                            {
-                                EnterSystemState(SYSTEM_STATE_LOGGING);
-                            }
-                    break;
-               }
-            break;
-            
-         
-            case SYSTEM_STATE_LOGGING:
-              EnterSystemState(SYSTEM_STATE_IDLE);
-             // unmount the file system
-              f_mount(0,NULL);
-            break;
+                    case DISPLAY_SERIAL_STATUS:
+                        EnterSystemState(SYSTEM_STATE_SERIAL_LOGGING);
+                        break;
+                }
+                break;
+
+            case SYSTEM_STATE_SERIAL_LOGGING:
+                PrintfLogEnqueue(&PCBackDoorTx,"QQQ\r\n");  //Shutdown
+                EnterSystemState(SYSTEM_STATE_IDLE);
+                DisplayMode=DISPLAY_SERIAL_STATUS; //Need to stay here
+                f_mount(0,NULL);
+                break;
+                
+           case SYSTEM_STATE_LOGGING:
+                EnterSystemState(SYSTEM_STATE_IDLE);
+                // unmount the file system
+                f_mount(0,NULL);
+                break;
+
         }
     }
 }
@@ -354,31 +437,29 @@
     DWORD SamplesToTake;
     DWORD i;
     float RunningSum = 0;
-    
+
     PrintfEnqueue(&PCBackDoorTx,"Zeroing ACS576.....\r\n");
-    
+
     ADCDataRdy=0;
-    
+
     SamplesToTake = (DWORD)(SAMPLE_RATE)*2;
-    
-    for(i=0;i<SamplesToTake;i++)
-    {
+
+    for(i=0; i<SamplesToTake; i++) {
         SmartSwitch_SetBackLightColor2((BYTE)((float)i/(float)SamplesToTake * 64));
-        
-        while(ADCDataRdy == FALSE)
-        {
-        
+
+        while(ADCDataRdy == FALSE) {
+
         }
         ADCDataRdy = FALSE;
         RunningSum += RobotBusCurrentHR;
     }
-    
+
     ACS576_IOFFSET_TRIM += RunningSum / SamplesToTake;
 
     SmartSwitch_SetBackLightColor(3,3,3);
-    
+
     PrintfEnqueue(&PCBackDoorTx,"Exporting new configuration file.....\r\n>");
-    
+
     ExportConfigurationSettings();
 }
 
@@ -387,8 +468,7 @@
 
 BOOL CheckforConfig(CHAR *LineIn)
 {
-    if(!strcmp(LineIn,"config"))
-    {
+    if(!strcmp(LineIn,"config")) {
         LoadConfiguration();
     }
     return TRUE;
@@ -397,12 +477,11 @@
 
 BOOL CheckForTimeInit(CHAR * LineIn)
 {
-    if(!strcmp(LineIn,"tinit"))
-    {
+    if(!strcmp(LineIn,"tinit")) {
         set_time(1256729737);
-       PrintfEnqueue(&PCBackDoorTx,"\r\nTime Reset\r\n");
+        PrintfEnqueue(&PCBackDoorTx,"\r\nTime Reset\r\n");
     }
-    
+
     return TRUE;
 
 }
@@ -412,37 +491,30 @@
     int Hour,Minute,Second=0;
     int Items;
     BOOL Error = FALSE;
-     time_t TimeStampTemp;
-    
-    
+    time_t TimeStampTemp;
+
+
     Items = sscanf(LineIn, "time=%d : %d  : %d", &Hour, &Minute, &Second);
-    if(Items == 3)
-    {
+    if(Items == 3) {
         PrintfEnqueue(&PCBackDoorTx,"\r\n");
-        if(Hour>23)
-        {
+        if(Hour>23) {
             PrintfEnqueue(&PCBackDoorTx,"Hour entry must be between 0 and 24\r\n");
             Error = TRUE;
         }
-        if(Minute>60)
-        {
+        if(Minute>60) {
             PrintfEnqueue(&PCBackDoorTx,"Minute entry must be between 0 and 60\r\n");
             Error = TRUE;
         }
-        if(Second>60)
-        {
+        if(Second>60) {
             PrintfEnqueue(&PCBackDoorTx,"Second entry must be between 0 and 60\r\n");
             Error = TRUE;
         }
-        
-        if(Error == TRUE)
-        {
-         PrintfEnqueue(&PCBackDoorTx,"Error in time format.  Time not changed.\r\n");
-        }
-        else
-        {
+
+        if(Error == TRUE) {
+            PrintfEnqueue(&PCBackDoorTx,"Error in time format.  Time not changed.\r\n");
+        } else {
             TimeStampTemp = time(NULL);
-            //convert to tm struct 
+            //convert to tm struct
             CurrentTime = localtime(&TimeStampTemp);
             //dump in our new valus
             CurrentTime->tm_sec = Second;
@@ -452,9 +524,9 @@
             set_time(mktime(CurrentTime));
             PrintfEnqueue(&PCBackDoorTx,"Time set to %d:%d:%d\r\n",Hour,Minute,Second);
         }
-     
-      }
-   return FALSE;
+
+    }
+    return FALSE;
 }
 
 BOOL CheckForDate(CHAR *LineIn)
@@ -463,33 +535,26 @@
     int Items;
     BOOL Error = FALSE;
     time_t TimeStampTemp;
-    
+
     Items = sscanf(LineIn, "date=%d / %d  / %d", &Month, &Day, &Year);
-    if(Items == 3)
-    {
+    if(Items == 3) {
         PrintfEnqueue(&PCBackDoorTx,"\r\n");
-        if(Month>12 || Month < 1)
-        {
+        if(Month>12 || Month < 1) {
             PrintfEnqueue(&PCBackDoorTx,"Month entry must be between 1 and 12\r\n");
             Error = TRUE;
         }
-        if(Day>31 || Day<1)
-        {
+        if(Day>31 || Day<1) {
             PrintfEnqueue(&PCBackDoorTx,"Day entry must be between 1 and 31\r\n");
             Error = TRUE;
         }
-        if(Year<1900)
-        {
+        if(Year<1900) {
             PrintfEnqueue(&PCBackDoorTx,"Year entry must be greater than 1900\r\n");
             Error = TRUE;
         }
-        
-        if(Error == TRUE)
-        {
-         PrintfEnqueue(&PCBackDoorTx,"Error in time format.  Date not changed.\r\n");
-        }
-        else
-        {
+
+        if(Error == TRUE) {
+            PrintfEnqueue(&PCBackDoorTx,"Error in time format.  Date not changed.\r\n");
+        } else {
             //Get the current time in seconds since unix epoch
             TimeStampTemp = time(NULL);
             //convert to tm struct fom
@@ -502,9 +567,9 @@
             set_time(mktime(CurrentTime));
             PrintfEnqueue(&PCBackDoorTx,"Date set to %d/%d/%d\r\n",Month,Day,Year);
         }
-     
-      }
-   return FALSE;
+
+    }
+    return FALSE;
 }
 
 
@@ -512,161 +577,168 @@
 void UpdateDisplay()
 {
 
-    if(DisplayShutOffTick > DISPLAY_SHUTOFF_TIME)
-    {
+    if(DisplayShutOffTick > DISPLAY_SHUTOFF_TIME) {
         DisplayMode = DISPLAY_OFF;
         SmartSwitchClear();
-       PowerDownSmartSwitch();
-    }
-    else
-    {
-        if(DisplayUpdateTick > 25)
-        {
+        PowerDownSmartSwitch();
+    } else {
+        if(DisplayUpdateTick > 25) {
             GFX_FullDisplayBufferClear(&BackBuffer);
             DisplayUpdateTick = 0;
-                switch(DisplayMode)
-                {
-                    default:
-                    case DISPLAY_MEASUREMENTS:
-                      SmartSwitch_SetBackLightColor(3,3,3);
-                       GFX_DrawString(&BackBuffer,"Robot Bus",0,0,&Font5x7);
-                       GFX_DrawHline(&BackBuffer,0,PHYSICAL_DISPLAY_XRES-1,10);
-                       GFX_DrawHline(&BackBuffer,0,PHYSICAL_DISPLAY_XRES-1,11);
-                       GFX_DrawHline(&BackBuffer,0,PHYSICAL_DISPLAY_XRES-1,12);
-                        
-                       GFX_printf(&BackBuffer,0,16,&Font5x7,"V: %.2fv",RobotBusVoltageHR);
-                       GFX_printf(&BackBuffer,0,24,&Font5x7,"I: %.2fa",RobotBusCurrentHR);
+            SmartSwitch_SetBrightnss(0);
+            switch(DisplayMode) {
+                default:
+                case DISPLAY_MEASUREMENTS:
+                    SmartSwitch_SetBackLightColor(3,3,3);
+                    GFX_DrawString(&BackBuffer,"Robot Bus",0,0,&Font5x7);
+                    GFX_DrawHline(&BackBuffer,0,PHYSICAL_DISPLAY_XRES-1,10);
+                    GFX_DrawHline(&BackBuffer,0,PHYSICAL_DISPLAY_XRES-1,11);
+                    GFX_DrawHline(&BackBuffer,0,PHYSICAL_DISPLAY_XRES-1,12);
+
+                    GFX_printf(&BackBuffer,0,16,&Font5x7,"V: %.2fv",RobotBusVoltageHR);
+                    GFX_printf(&BackBuffer,0,24,&Font5x7,"I: %.2fa",RobotBusCurrentHR);
                     break;
-                    
-                   
-                    case DISPLAY_BATTERY:
-                       SmartSwitch_SetBackLightColor(3,3,0);
-                       GFX_DrawString(&BackBuffer,"Battery",0,0,&Font5x7);
-                       GFX_DrawHline(&BackBuffer,0,PHYSICAL_DISPLAY_XRES-1,10);
-                       GFX_DrawHline(&BackBuffer,0,PHYSICAL_DISPLAY_XRES-1,11);
-                       GFX_DrawHline(&BackBuffer,0,PHYSICAL_DISPLAY_XRES-1,12);
-                        
-                       GFX_printf(&BackBuffer,0,16,&Font5x7,"V: %.1fv",BatteryVoltage);
-                      
+
+                case DISPLAY_SERIAL_STATUS:
+ 
+                    SmartSwitch_SetBrightnss(LastSerialBrightness);
+                    SmartSwitch_SetBackLightColor(2,0,2);
+                    GFX_DrawString(&BackBuffer,"Serial Log",0,0,&Font5x7);
+                    GFX_DrawHline(&BackBuffer,0,PHYSICAL_DISPLAY_XRES-1,10);
+                    GFX_DrawHline(&BackBuffer,0,PHYSICAL_DISPLAY_XRES-1,11);
+                    GFX_DrawHline(&BackBuffer,0,PHYSICAL_DISPLAY_XRES-1,12);
+                    GFX_printf(&BackBuffer,0,16,&Font5x7,"Rate %s",&SpeedString[0]);
+                    TranslateToText();
+                    if(SystemState != SYSTEM_STATE_SERIAL_LOGGING){
+                        GFX_printf(&BackBuffer,0,24,&Font5x7,"Not Logging");
+                        LastSerialBrightness=7;
+                    }
+                    else{   //we are logging
+                        GFX_printf(&BackBuffer,0,24,&Font5x7,"Logging");  
+                        if(LastSerialBrightness == 7)LastSerialBrightness=3;
+                        else LastSerialBrightness=7;                 
+                    }                        
+                    break;
+
+                case DISPLAY_BATTERY:
+                    SmartSwitch_SetBackLightColor(3,3,0);
+                    GFX_DrawString(&BackBuffer,"Battery",0,0,&Font5x7);
+                    GFX_DrawHline(&BackBuffer,0,PHYSICAL_DISPLAY_XRES-1,10);
+                    GFX_DrawHline(&BackBuffer,0,PHYSICAL_DISPLAY_XRES-1,11);
+                    GFX_DrawHline(&BackBuffer,0,PHYSICAL_DISPLAY_XRES-1,12);
+
+                    GFX_printf(&BackBuffer,0,16,&Font5x7,"V: %.1fv",BatteryVoltage);
+
                     break;
-                    
-                     case DISPLAY_DATE_TIME:
-                       SmartSwitch_SetBackLightColor(1,3,0);
-                       GFX_DrawString(&BackBuffer,"Date/Time",0,0,&Font5x7);
-                       GFX_DrawHline(&BackBuffer,0,PHYSICAL_DISPLAY_XRES-1,10);
-                       GFX_DrawHline(&BackBuffer,0,PHYSICAL_DISPLAY_XRES-1,11);
-                       GFX_DrawHline(&BackBuffer,0,PHYSICAL_DISPLAY_XRES-1,12);
-                        
-                       time(&CurrentTime_InSec);
-                       strftime(DTBuf, 32, "%m.%d.%Y", localtime(&CurrentTime_InSec));
-                       GFX_printf(&BackBuffer,0,16,&Font5x7,"%s",DTBuf);
-                      
-                       strftime(DTBuf, 32, "%H:%M:%S", localtime(&CurrentTime_InSec));
-                       GFX_printf(&BackBuffer,0,24,&Font5x7,"%s",DTBuf);
+
+                case DISPLAY_DATE_TIME:
+                    SmartSwitch_SetBackLightColor(1,3,0);
+                    GFX_DrawString(&BackBuffer,"Date/Time",0,0,&Font5x7);
+                    GFX_DrawHline(&BackBuffer,0,PHYSICAL_DISPLAY_XRES-1,10);
+                    GFX_DrawHline(&BackBuffer,0,PHYSICAL_DISPLAY_XRES-1,11);
+                    GFX_DrawHline(&BackBuffer,0,PHYSICAL_DISPLAY_XRES-1,12);
+
+                    time(&CurrentTime_InSec);
+                    strftime(DTBuf, 32, "%m.%d.%Y", localtime(&CurrentTime_InSec));
+                    GFX_printf(&BackBuffer,0,16,&Font5x7,"%s",DTBuf);
+
+                    strftime(DTBuf, 32, "%H:%M:%S", localtime(&CurrentTime_InSec));
+                    GFX_printf(&BackBuffer,0,24,&Font5x7,"%s",DTBuf);
                     break;
-                    
-                     case DISPLAY_BUFFER_STATS:
-                     SmartSwitch_SetBackLightColor(3,3,3);
-                     GFX_DrawString(&BackBuffer,"Buf Status",0,0,&Font5x7);
-                     GFX_DrawHline(&BackBuffer,0,PHYSICAL_DISPLAY_XRES-1,10);
-                     GFX_DrawHline(&BackBuffer,0,PHYSICAL_DISPLAY_XRES-1,11);
-                     GFX_DrawHline(&BackBuffer,0,PHYSICAL_DISPLAY_XRES-1,12);
-                     GFX_printf(&BackBuffer,0,16,&Font3x5,"R/W Diff:");
-                     GFX_printf(&BackBuffer,0,24,&Font3x5,"%04d/%d",ReadWriteDifferential,DATA_BLOCK_SIZE);
+
+                case DISPLAY_BUFFER_STATS:
+                    SmartSwitch_SetBackLightColor(3,3,3);
+                    GFX_DrawString(&BackBuffer,"Buf Status",0,0,&Font5x7);
+                    GFX_DrawHline(&BackBuffer,0,PHYSICAL_DISPLAY_XRES-1,10);
+                    GFX_DrawHline(&BackBuffer,0,PHYSICAL_DISPLAY_XRES-1,11);
+                    GFX_DrawHline(&BackBuffer,0,PHYSICAL_DISPLAY_XRES-1,12);
+                    GFX_printf(&BackBuffer,0,16,&Font3x5,"R/W Diff:");
+                    GFX_printf(&BackBuffer,0,24,&Font3x5,"%04d/%d",ReadWriteDifferential,DATA_BLOCK_SIZE);
                     break;
-                    
-                    case DISPLAY_FIRMWARE_VERSION:
-                     SmartSwitch_SetBackLightColor(3,3,3);
-                     GFX_DrawString(&BackBuffer,"Firmware Version",0,0,&Font3x5);
-                     GFX_DrawHline(&BackBuffer,0,PHYSICAL_DISPLAY_XRES-1,10);
-                     GFX_DrawHline(&BackBuffer,0,PHYSICAL_DISPLAY_XRES-1,11);
-                     GFX_DrawHline(&BackBuffer,0,PHYSICAL_DISPLAY_XRES-1,12);
-                     GFX_printf(&BackBuffer,19,20,&Font5x7,"%d.%d",FIRMWARE_VERSION_MAJOR,FIRMWARE_VERSION_MINOR);
+
+                case DISPLAY_FIRMWARE_VERSION:
+                    SmartSwitch_SetBackLightColor(3,3,3);
+                    GFX_DrawString(&BackBuffer,"Firmware Version",0,0,&Font3x5);
+                    GFX_DrawHline(&BackBuffer,0,PHYSICAL_DISPLAY_XRES-1,10);
+                    GFX_DrawHline(&BackBuffer,0,PHYSICAL_DISPLAY_XRES-1,11);
+                    GFX_DrawHline(&BackBuffer,0,PHYSICAL_DISPLAY_XRES-1,12);
+                    GFX_printf(&BackBuffer,19,20,&Font5x7,"%d.%d",FIRMWARE_VERSION_MAJOR,FIRMWARE_VERSION_MINOR);
                     break;
-                    
-                    case DISPLAY_ID:
-                     SmartSwitch_SetBackLightColor(3,3,3);
-                     GFX_DrawString(&BackBuffer,"ID",0,0,&Font3x5);
-                     GFX_DrawHline(&BackBuffer,0,PHYSICAL_DISPLAY_XRES-1,10);
-                     GFX_DrawHline(&BackBuffer,0,PHYSICAL_DISPLAY_XRES-1,11);
-                     GFX_DrawHline(&BackBuffer,0,PHYSICAL_DISPLAY_XRES-1,12);
-                     GFX_printf(&BackBuffer,0,20,&Font5x7,"%s",ID);
+
+                case DISPLAY_ID:
+                    SmartSwitch_SetBackLightColor(3,3,3);
+                    GFX_DrawString(&BackBuffer,"ID",0,0,&Font3x5);
+                    GFX_DrawHline(&BackBuffer,0,PHYSICAL_DISPLAY_XRES-1,10);
+                    GFX_DrawHline(&BackBuffer,0,PHYSICAL_DISPLAY_XRES-1,11);
+                    GFX_DrawHline(&BackBuffer,0,PHYSICAL_DISPLAY_XRES-1,12);
+                    GFX_printf(&BackBuffer,0,20,&Font5x7,"%s",ID);
                     break;
-                    
-                    case DISPLAY_CARD_STATUS:
-                                         
-                      if(1)
-                      {
-                        
-                          switch(SystemState)
-                          {
+
+                case DISPLAY_CARD_STATUS:
+
+                    if(1) {
+
+                        switch(SystemState) {
                             default:
                             case SYSTEM_STATE_IDLE:
-                                switch(LastBackLightColor)
-                                 {
+                                switch(LastBackLightColor) {
                                     default:
                                     case SMART_SWITCH_BACKLIGHT_GREEN:
-                                         LastBackLightColor = SMART_SWITCH_BACKLIGHT_YELLOW;  
-                                         SmartSwitch_SetBackLightColor2(LastBackLightColor);
-                                    break;
-                                    
+                                        LastBackLightColor = SMART_SWITCH_BACKLIGHT_YELLOW;
+                                        SmartSwitch_SetBackLightColor2(LastBackLightColor);
+                                        break;
+
                                     case SMART_SWITCH_BACKLIGHT_YELLOW:
                                         LastBackLightColor = SMART_SWITCH_BACKLIGHT_GREEN;
                                         SmartSwitch_SetBackLightColor2(LastBackLightColor);
-                                    break;
-                                  }
-                               
-                               
-                              if(DataLogError == TRUE)
-                              {
-                                   GFX_DrawString(&BackBuffer,"Error!",0,0,&Font5x7); 
-                                   GFX_DrawString(&BackBuffer,ErrorMsg,0,16,&Font3x5);
-                              }  
-                              else
-                              { 
-                                  GFX_DrawString(&BackBuffer,"SD Detected",0,16,&Font5x7);
-                                  GFX_DrawString(&BackBuffer,"Idle....",0,0,&Font5x7);
-                                  GFX_DrawString(&BackBuffer,"Not Logging",0,24,&Font5x7);    
-                              }
-                            break;
-                         
-                         
+                                        break;
+                                }
+
+
+                                if(DataLogError == TRUE) {
+                                    GFX_DrawString(&BackBuffer,"Error!",0,0,&Font5x7);
+                                    GFX_DrawString(&BackBuffer,ErrorMsg,0,16,&Font3x5);
+                                } else {
+                                    GFX_DrawString(&BackBuffer,"SD Detected",0,16,&Font5x7);
+                                    GFX_DrawString(&BackBuffer,"Idle....",0,0,&Font5x7);
+                                    GFX_DrawString(&BackBuffer,"Not Logging",0,24,&Font5x7);
+                                }
+                                break;
+
+
                             case SYSTEM_STATE_LOGGING:
                                 SmartSwitch_SetBackLightColor2(SMART_SWITCH_BACKLIGHT_GREEN);
-                               
+
                                 GFX_DrawString(&BackBuffer,"Logging Data....",0,0,&Font5x7);
                                 GFX_DrawString(&BackBuffer,&CurrentLogFileName[4],0,16,&Font5x7);
                                 GFX_printf(&BackBuffer,0,26,&Font3x5,"Block: %d",DataBlocksWritten);
-                                
-                            break;
-                         }
-                      }
-                      else
-                      {
-                          GFX_DrawString(&BackBuffer,"No SD Card!",0,0,&Font5x7);
-                          
-                            switch(LastBackLightColor)
-                            {
-                                default:
-                                case SMART_SWITCH_BACKLIGHT_RED:
-                                     LastBackLightColor = SMART_SWITCH_BACKLIGHT_YELLOW;  
-                                     SmartSwitch_SetBackLightColor2(LastBackLightColor);
+
+                                break;
+                        }
+                    } else {
+                        GFX_DrawString(&BackBuffer,"No SD Card!",0,0,&Font5x7);
+
+                        switch(LastBackLightColor) {
+                            default:
+                            case SMART_SWITCH_BACKLIGHT_RED:
+                                LastBackLightColor = SMART_SWITCH_BACKLIGHT_YELLOW;
+                                SmartSwitch_SetBackLightColor2(LastBackLightColor);
                                 break;
-                                
-                                case SMART_SWITCH_BACKLIGHT_YELLOW:
-                                    LastBackLightColor = SMART_SWITCH_BACKLIGHT_RED;
-                                    SmartSwitch_SetBackLightColor2(LastBackLightColor);
+
+                            case SMART_SWITCH_BACKLIGHT_YELLOW:
+                                LastBackLightColor = SMART_SWITCH_BACKLIGHT_RED;
+                                SmartSwitch_SetBackLightColor2(LastBackLightColor);
                                 break;
-                              }
-                      } 
-                    
-                       GFX_DrawHline(&BackBuffer,0,PHYSICAL_DISPLAY_XRES-1,10);
-                       GFX_DrawHline(&BackBuffer,0,PHYSICAL_DISPLAY_XRES-1,11);
-                       GFX_DrawHline(&BackBuffer,0,PHYSICAL_DISPLAY_XRES-1,12);
-                    
+                        }
+                    }
+
+                    GFX_DrawHline(&BackBuffer,0,PHYSICAL_DISPLAY_XRES-1,10);
+                    GFX_DrawHline(&BackBuffer,0,PHYSICAL_DISPLAY_XRES-1,11);
+                    GFX_DrawHline(&BackBuffer,0,PHYSICAL_DISPLAY_XRES-1,12);
+
                     break;
-                }
-             GFX_DumpRenderContextToPhysicalScreen(&BackBuffer);
+            }
+            GFX_DumpRenderContextToPhysicalScreen(&BackBuffer);
         }
     }
 }
@@ -675,19 +747,18 @@
 void CheckSDCardStatus()
 {
     //Make sure that the SD card stays in while logging
-    switch(SystemState)
-    {
+    switch(SystemState) {
         case SYSTEM_STATE_LOGGING:
             //if(SDCardDetect == 0)
-            {
-                //Gracefully shut the logging system down.....
-              //  EnterSystemState(SYSTEM_STATE_IDLE);
-            }
+        {
+            //Gracefully shut the logging system down.....
+            //  EnterSystemState(SYSTEM_STATE_IDLE);
+        }
         break;
-        
+
         default:
-        break;
-    } 
+            break;
+    }
 }
 
 
@@ -696,58 +767,46 @@
     WORD i;
     int ElementsToWrite;
     UINT BytesWritten;
-    
-    if(RobotBusVoltageHR < 9)
-    {
-       // EnterSystemState(SYSTEM_STATE_IDLE);
+
+    if(RobotBusVoltageHR < 9) {
+        // EnterSystemState(SYSTEM_STATE_IDLE);
         return;
     }
-    
-    if(DataLogError == TRUE)
-    {
+
+    if(DataLogError == TRUE) {
         //EnterSystemState(SYSTEM_STATE_IDLE);
-    }
-    else
-    {
-        if(MyDataBlock.ReadInPtr < MyDataBlock.WriteOutPtr)
-        {
-           ElementsToWrite =  MyDataBlock.ReadInPtr + (DATA_BLOCK_SIZE - MyDataBlock.WriteOutPtr);
-        }
-        else
-        {
+    } else {
+        if(MyDataBlock.ReadInPtr < MyDataBlock.WriteOutPtr) {
+            ElementsToWrite =  MyDataBlock.ReadInPtr + (DATA_BLOCK_SIZE - MyDataBlock.WriteOutPtr);
+        } else {
             ElementsToWrite = MyDataBlock.ReadInPtr - MyDataBlock.WriteOutPtr;
         }
-        
-        if(ElementsToWrite > WRITE_BLOCK_THRESH)
-        {
-                for(i=0;i<ElementsToWrite;i++)
-                {
-                    BinaryDataCachePtr += sprintf((char *)&BinaryDataCache[BinaryDataCachePtr],"%d,%.2f,%.2f\r\n",DataPointIndex,MyDataBlock.Voltage[MyDataBlock.WriteOutPtr],MyDataBlock.Current[MyDataBlock.WriteOutPtr]);
-                    if(BinaryDataCachePtr>=BINARY_WRITE_CACHE_THRESHOLD)
-                    {
-                        EXT_LED0 = 1;  
-                        f_write(&CurrentLogFileHandle,BinaryDataCache,BinaryDataCachePtr,&BytesWritten);
-                        
-                        BinaryDataCachePtr = 0;
-                      
-                        EXT_LED0=0;
-                    }
-                    DataPointIndex++;
-                    MyDataBlock.WriteOutPtr++;
-                    if(MyDataBlock.WriteOutPtr == DATA_BLOCK_SIZE)
-                    {
-                        MyDataBlock.WriteOutPtr = 0;
-                    }
+
+        if(ElementsToWrite > WRITE_BLOCK_THRESH) {
+            for(i=0; i<ElementsToWrite; i++) {
+                BinaryDataCachePtr += sprintf((char *)&BinaryDataCache[BinaryDataCachePtr],"%d,%.2f,%.2f\r\n",DataPointIndex,MyDataBlock.Voltage[MyDataBlock.WriteOutPtr],MyDataBlock.Current[MyDataBlock.WriteOutPtr]);
+                if(BinaryDataCachePtr>=BINARY_WRITE_CACHE_THRESHOLD) {
+                    EXT_LED0 = 1;
+                    f_write(&CurrentLogFileHandle,BinaryDataCache,BinaryDataCachePtr,&BytesWritten);
+
+                    BinaryDataCachePtr = 0;
+
+                    EXT_LED0=0;
                 }
-                if(WritesSinceLastFlush > NUM_WRITES_BEFORE_FLUSH)
-                 {
-                            f_close(&CurrentLogFileHandle);
-                            WritesSinceLastFlush = 0;
-                            f_open(&CurrentLogFileHandle,&CurrentLogFileName[0],FA_WRITE | FA_OPEN_ALWAYS);
-                            f_lseek(&CurrentLogFileHandle, CurrentLogFileHandle.fsize);
-                 }
-               DataBlocksWritten++;
-      }
+                DataPointIndex++;
+                MyDataBlock.WriteOutPtr++;
+                if(MyDataBlock.WriteOutPtr == DATA_BLOCK_SIZE) {
+                    MyDataBlock.WriteOutPtr = 0;
+                }
+            }
+            if(WritesSinceLastFlush > NUM_WRITES_BEFORE_FLUSH) {
+                f_close(&CurrentLogFileHandle);
+                WritesSinceLastFlush = 0;
+                f_open(&CurrentLogFileHandle,&CurrentLogFileName[0],FA_WRITE | FA_OPEN_ALWAYS);
+                f_lseek(&CurrentLogFileHandle, CurrentLogFileHandle.fsize);
+            }
+            DataBlocksWritten++;
+        }
     }
 }
 
@@ -755,14 +814,14 @@
 
 void DisplayBootMsg()
 {
-   PrintfEnqueue(&PCBackDoorTx,"\r\n\r\n");
-   PrintfEnqueue(&PCBackDoorTx,".______     _______. __    __            ___      .______       __   \r\n");
-   PrintfEnqueue(&PCBackDoorTx,"|   _  \\   /       ||  |  |  |          /   \\     |   _  \\     |  |  \r\n");
-   PrintfEnqueue(&PCBackDoorTx,"|  |_)  | |   (----`|  |  |  |  ______ /  ^  \\    |  |_)  |    |  |  \r\n");   
-   PrintfEnqueue(&PCBackDoorTx,"|   ___/   \\   \\    |  |  |  | |______/  /_\\  \\   |      /     |  |  \r\n");
-   PrintfEnqueue(&PCBackDoorTx,"|  |   .----)   |   |  `--'  |       /  _____  \\  |  |\\  \\----.|  `----.\r\n");
-   PrintfEnqueue(&PCBackDoorTx,"| _|   |_______/     \\______/       /__/     \\__\\ | _| `._____||_______|\r\n");
-   PrintfEnqueue(&PCBackDoorTx,"---------------------------------------------------------------------------\r\n");
-   PrintfEnqueue(&PCBackDoorTx,"Robot Power Logger Control Terminal\r\n\r\n>");
+    PrintfEnqueue(&PCBackDoorTx,"\r\n\r\n");
+    PrintfEnqueue(&PCBackDoorTx,".______     _______. __    __            ___      .______       __   \r\n");
+    PrintfEnqueue(&PCBackDoorTx,"|   _  \\   /       ||  |  |  |          /   \\     |   _  \\     |  |  \r\n");
+    PrintfEnqueue(&PCBackDoorTx,"|  |_)  | |   (----`|  |  |  |  ______ /  ^  \\    |  |_)  |    |  |  \r\n");
+    PrintfEnqueue(&PCBackDoorTx,"|   ___/   \\   \\    |  |  |  | |______/  /_\\  \\   |      /     |  |  \r\n");
+    PrintfEnqueue(&PCBackDoorTx,"|  |   .----)   |   |  `--'  |       /  _____  \\  |  |\\  \\----.|  `----.\r\n");
+    PrintfEnqueue(&PCBackDoorTx,"| _|   |_______/     \\______/       /__/     \\__\\ | _| `._____||_______|\r\n");
+    PrintfEnqueue(&PCBackDoorTx,"---------------------------------------------------------------------------\r\n");
+    PrintfEnqueue(&PCBackDoorTx,"Robot Power Logger Control Terminal\r\n\r\n>");
 }