most functionality to splashdwon, find neutral and start mission. short timeouts still in code for testing, will adjust to go directly to sit_idle after splashdown

Dependencies:   mbed MODSERIAL FATFileSystem

Revision:
20:8987a9ae2bc7
Parent:
19:aaa0f4f29d50
Child:
21:38c8544db6f4
--- a/StateMachine/StateMachine.cpp	Wed Nov 22 00:08:03 2017 +0000
+++ b/StateMachine/StateMachine.cpp	Wed Nov 22 14:32:06 2017 +0000
@@ -1,24 +1,27 @@
 #include "StateMachine.hpp"
 #include "StaticDefs.hpp"
-
+ 
 StateMachine::StateMachine() {
-    _timeout = 20;             // generic timeout for every state, seconds
+    _timeout = 20;            // generic timeout for every state, seconds
+    
     depthTolerance = 0.25;    // depth tolerance for neutral finding exit critera
     pitchTolerance = 1.0;     // pitch angle tolerance for neutral finding exit criteria
+ 
     bceFloatPosition = 300;   // bce position for "float" states
     battFloatPosition = 50;   // batt position for "broadcast" state
-    
+ 
     depthCommand = 3.5;       // user keyboard depth
     pitchCommand = -20.0;     // user keyboard depth
     
-    _neutral_sink_timer = 10;
-    _neutral_rise_timer = 5;
+    _neutral_sink_timer = 0;
+    _neutral_rise_timer = 0;
     
-    previousPosition_mm = 220;      //centered, overwritten by the state machine (LOAD THIS FROM CONFIG?)
-    _state = SIT_IDLE;               // select starting state here
-    
+    previousPosition_mm = 220; // Troy: centered, overwritten by the state machine (LOAD THIS FROM CONFIG?)
+                               // Dan: no, think - where do you Want the bce to start from?  Full extend limt probably.
+ 
+    _state = SIT_IDLE;              // select starting state here
     isTimeoutRunning = false;       // default timer to not running
-    isSubStateTimeoutRunning = false;
+    isSubStateTimerRunning = false; // default timer to not running
     
     _neutral_buoyancy_bce_pos_mm = 0;
     _neutral_buoyancy_batt_pos_mm = 0;
@@ -27,11 +30,10 @@
     _next_state = -1;    //next state is used to prevent states from changing as the FSM executes
     _state_counter = 0;
 }
-
+ 
 //Finite State Machine (FSM)
 void StateMachine::runStateMachine() { 
-    //use the _next_state when the state machine is run again (so that it cannot change states while the FSM executes)
-
+ 
     static bool runFirstNeutral = false;
             
     //use the _next_state when the state machine is run again (so that it cannot change states while the FSM executes)   
@@ -46,18 +48,19 @@
             showMenu();
             pc().printf("\r\n\nstate: SIT_IDLE\r\n");
             isTimeoutRunning = true; 
-
+ 
             // what is active?
             bce().pause();
             batt().pause();
             
             //reset sub FSM
-            isSubStateTimeoutRunning = false;
+            isSubStateTimerRunning = false;
         }
+        
         // how exit?
-        // separate keyboard function will change the states
+        keyboard(); // keyboard function will change the state if needed
         break;
-    
+ 
     case EMERGENCY_CLIMB :
         // start local state timer and init any other one-shot actions
         if (!isTimeoutRunning) {
@@ -69,11 +72,12 @@
             // what needs to be started?
             bce().unpause();
             batt().unpause();
-
-            // what is active?
+ 
+            // what are the commands?
             bce().setPosition_mm(bce().getTravelLimit());
             batt().setPosition_mm(0.0);
         }
+        
         // how exit?
         if (timer > _timeout) {
             pc().printf("EC: timed out\r\n");
@@ -88,41 +92,39 @@
             isTimeoutRunning = false;
         }
         break;
-
+ 
     case FIND_NEUTRAL :
-        /* start local state timer and init any other one-shot actions */
+        // start local state timer and init any other one-shot actions
         if (!isTimeoutRunning) {
             pc().printf("\r\n\nstate: FIND_NEUTRAL\r\n");
             timer.reset(); // timer goes back to zero
             timer.start(); // background timer starts running
-            isTimeoutRunning = true; 
+            isTimeoutRunning = true;
             
             // what needs to be started?
             bce().unpause();
             batt().unpause();
             
             //first iteration sends SINKING sub-state
-            runFirstNeutral = true;            
+            runFirstNeutral = true;
         }
-        
-        /* how exit? (exit with the timer, if timer still running continue processing sub FSM) */
+ 
+        // how exit? (exit with the timer, if timer still running continue processing sub FSM)
         if (timer > _timeout) {
             pc().printf("FN: timed out [time: %0.1f sec]\r\n", timer.read());
             _next_state = EMERGENCY_CLIMB;         //new behavior (if this times out it emergency surfaces)
             timer.reset();
             isTimeoutRunning = false;
         }
-        
+ 
         // what is active? (call neutral finding sub-function every iteration)
         if (runFirstNeutral) {
             //pc().printf("First iteration of find neutral\n\r"); // debug (confirmed working)
             _sub_state = findNeutralSubState(NEUTRAL_SINKING);
-            _previous_sub_state = _sub_state;       //save previous sub-state
+            _previous_sub_state = _sub_state; //save previous sub-state
             runFirstNeutral = false;
         }
-        
-        //second and further iterations this is running
-        else {
+        else { //second and further iterations, this is running
             _sub_state = findNeutralSubState(_previous_sub_state);
             _previous_sub_state = _sub_state;       //save previous sub-state
             
@@ -145,13 +147,14 @@
             // what needs to be started?
             bce().unpause();
             batt().unpause();
-
+ 
             // what are the commands?
             depthLoop().setCommand(depthCommand);
             pitchLoop().setCommand(pitchCommand);
             pc().printf("DIVE: depth cmd: %3.1f\r\n",depthLoop().getCommand());
             pc().printf("DIVE: pitch cmd: %3.1f\r\n",pitchLoop().getCommand());
         }
+ 
         // how exit?
         if (timer > _timeout) {
             pc().printf("DIVE: timed out\n\n\r");
@@ -165,6 +168,7 @@
             timer.reset();
             isTimeoutRunning = false;
         }
+ 
         // what is active?
         pc().printf("DIVE: bce pos: %3.1f mm, batt pos: %3.1f mm (depthLoop POS: %3.1f ft) [%0.2f sec]\r", bce().getPosition_mm(), batt().getPosition_mm(), depthLoop().getPosition(), timer.read());
         bce().setPosition_mm(depthLoop().getOutput());
@@ -189,6 +193,7 @@
             pc().printf("RISE: depth cmd: 0.0\r\n");
             pc().printf("RISE: pitch cmd: %3.1f\r\n",pitchLoop().getCommand());
         }
+ 
         // how exit?
         if (timer > _timeout) {
             pc().printf("RISE: timed out\r\n");
@@ -202,8 +207,9 @@
             timer.reset();
             isTimeoutRunning = false;
         }
+ 
+        // what is active?
         pc().printf("RISE: bce pos: %3.1f mm, batt pos: %3.1f mm (depthLoop POS: %3.1f ft) [%0.1f sec]\r", bce().getPosition_mm(), batt().getPosition_mm(), depthLoop().getPosition(), timer.read());
-        // what is active?
         bce().setPosition_mm(depthLoop().getOutput());  //constantly checking the Outer Loop output to move the motors
         batt().setPosition_mm(pitchLoop().getOutput()); 
         break;  
@@ -220,10 +226,11 @@
             bce().unpause();
             batt().unpause();
  
-            // what are the commands
+            // what are the commands?
             bce().setPosition_mm(bceFloatPosition);
             pitchLoop().setCommand(0.0);
         }
+        
         // how exit?
         if (timer > _timeout) {
             pc().printf("FL: timed out\r\n");
@@ -237,6 +244,7 @@
             timer.reset();
             isTimeoutRunning = false;
         }
+        
         // what is active?
         pc().printf("FL: pitchLoop output: %3.1f, batt pos: %3.1f, piston pos: %3.1f [%0.1f sec]\r", pitchLoop().getOutput(), batt().getPosition_mm(), bce().getPosition_mm(), timer.read());
         batt().setPosition_mm(pitchLoop().getOutput());
@@ -253,11 +261,12 @@
             // what needs to be started?
             bce().unpause();
             batt().unpause();
-
+ 
             // what are the commands?
             bce().setPosition_mm(bceFloatPosition);
             batt().setPosition_mm(battFloatPosition);
         }
+        
         // how exit?
         if (timer > _timeout) {
             pc().printf("FB: timed out\r\n");
@@ -265,13 +274,15 @@
             timer.reset();
             isTimeoutRunning = false;
         }
-        if ( (fabs(bce().getPosition_mm() - bce().getSetPosition_mm()) < bce().getDeadband()) and
-             (fabs(batt().getPosition_mm() - batt().getSetPosition_mm()) < batt().getDeadband()) ) {
+        else if ( (fabs(bce().getPosition_mm() - bce().getSetPosition_mm()) < bce().getDeadband()) and
+                  (fabs(batt().getPosition_mm() - batt().getSetPosition_mm()) < batt().getDeadband()) ) {
             pc().printf("FB: position: %3.1f mm, set pos: %3.1f mm, deadband: %3.1f mm\r\n",bce().getPosition_mm(), bce().getSetPosition_mm(), bce().getDeadband());
             _next_state = SIT_IDLE;
             timer.reset();
             isTimeoutRunning = false;
         }
+        
+        // what is active?
         pc().printf("FB: bce pos: %3.1f mm, batt pos: %3.1f mm (depthLoop POS: %3.1f ft) [%0.1f sec]\r", bce().getPosition_mm(), batt().getPosition_mm(), depthLoop().getPosition(), timer.read());
         break;
         
@@ -286,7 +297,7 @@
             // what needs to be started?
             bce().unpause();
             batt().unpause();
-
+ 
             //NEW: retrieve depth and pitch commands from config file struct
             // concept is to load this each time the multi-dive restarts
             
@@ -303,6 +314,7 @@
             pc().printf("MULTI-DIVE: depth cmd: %3.1f\r\n",depthLoop().getCommand());
             pc().printf("MULTI-DIVE: pitch cmd: %3.1f\r\n",pitchLoop().getCommand());
         }
+        
         // how exit?
         if (timer > _timeout) {
             pc().printf("MULTI-DIVE: timed out\n\n\r");
@@ -316,6 +328,7 @@
             timer.reset();
             isTimeoutRunning = false;
         }
+        
         // what is active?
         pc().printf("MULTI-DIVE: bce pos: %3.1f mm, batt pos: %3.1f mm (depthLoop POS: %3.1f ft) [%0.1f sec]\r", bce().getPosition_mm(), batt().getPosition_mm(), depthLoop().getPosition(), timer.read());
         bce().setPosition_mm(depthLoop().getOutput());
@@ -347,6 +360,7 @@
             pc().printf("MULTI-RISE: depth cmd: 0.0\r\n");
             pc().printf("MULTI-RISE: pitch cmd: %3.1f\r\n",pitchLoop().getCommand());
         }
+        
         // how exit?
         if (timer > _timeout) {
             pc().printf("MULTI-RISE: timed out\r\n");
@@ -357,9 +371,7 @@
             //reset multi-dive sequence to start
             _state_counter = 0;
         }
-        
-        //depth is less than 0.5 (zero is surface level)
-        else if (depthLoop().getPosition() < 0.5) {
+        else if (depthLoop().getPosition() < 0.5) { // depth is less than 0.5 (zero is surface level)
             pc().printf("MULTI-RISE: depth: %3.1f, cmd: %3.1f\r\n", depthLoop().getPosition(), depthLoop().getCommand());
             
             //going to next state            
@@ -383,8 +395,9 @@
             
             //have to stop this with the _state_counter variable!
         }
+        
+        // what is active?
         pc().printf("MULTI-RISE: bce pos: %3.1f mm, batt pos: %3.1f mm (depthLoop POS: %3.1f ft) [%0.1f sec]\r", bce().getPosition_mm(), batt().getPosition_mm(), depthLoop().getPosition(), timer.read());
-        // what is active?
         bce().setPosition_mm(depthLoop().getOutput());  //constantly checking the Outer Loop output to move the motors
         batt().setPosition_mm(pitchLoop().getOutput()); 
         break; 
@@ -394,7 +407,7 @@
         _next_state = SIT_IDLE;
     } 
 }
-
+ 
 // output the keyboard menu for user's reference
 void StateMachine::showMenu() {
     pc().printf("\r\r\n\nKEYBOARD MENU:\r\r\n");
@@ -419,162 +432,147 @@
     pc().printf(" C See sensor readings\r\n");
     pc().printf(" ? to reset mbed\r\n");
 }
-
+ 
 //Find Neutral sub finite state machine
 // Note: the sub-fsm only moves the pistons once at the start of each timer loop
 //  (timer completes, move piston, timer completes, move piston, etc)
 int StateMachine::findNeutralSubState(int input_substate) {  
-    float pitch_angle = pitchLoop().getPosition();    
-    float pitch_rate = pitchLoop().getVelocity();
-     
-    float abs_pitch_angle = fabs(pitch_angle);
-    float abs_pitch_rate = fabs(pitch_rate);
-    
+ 
     //output substate is the input substate unless it is changed in the sub FSM
     static int output_substate = NEUTRAL_SINKING;   //to start
-    //int output_substate = input_substate;    
     
     switch (input_substate) {
-        case NEUTRAL_SINKING:            
+        case NEUTRAL_SINKING :
             //start the 10 second timer
-            if (!isSubStateTimeoutRunning) { 
+            if (!isSubStateTimerRunning) {
                 pc().printf(" input_substate: %d\n\r", input_substate);   //debug              
-                _neutral_sink_timer = timer.read()+ 10; //record the time when this block is first entered and add 10 seconds
-                pc().printf("\r\n\n(8) START NEUTRAL_SINKING (_neutral_sink_timer will go off at %0.1f sec)  %3.1f\r\n", _neutral_sink_timer,timer.read());
+                _neutral_sink_timer = timer.read() + 10; //record the time when this block is first entered and add 10 seconds
                 
-                // what is active?
+                pc().printf("\r\n\n START NEUTRAL_SINKING (_neutral_sink_timer will go off at %0.1f sec)  %3.1f\r\n", _neutral_sink_timer, timer.read());
+                
+                // what are the commands?
                 //move piston at start of sequence (retract 10 mm)
                 pc().printf("Neutral Sinking: Retracting piston 10 mm\n\r");
                 previousPosition_mm -= 10;
                 bce().setPosition_mm(previousPosition_mm);  //no depth command
                 
-                isSubStateTimeoutRunning = true;    //disable this block after one iteration
+                isSubStateTimerRunning = true;    //disable this block after one iteration
             }
-                        
-            //once the 10 second timer is complete move the piston with code above             
-            if (timer.read() >= _neutral_sink_timer) {
-                pc().printf("\r\n\n(8) NEUTRAL_SINKING TIMER COMPLETE! %3.1f\r\n", timer.read());
-                pc().printf("\r\n\n(8) (BATT POS: %0.1f) retract 10 mm (time: %3.1f)\r\n", previousPosition_mm, timer.read());
-                
-                //when you finish executing the motor controls, reset the neutral sinking timer in the next state
-                isSubStateTimeoutRunning = false;
+ 
+            // how exit?
+            //once reached the travel limit, no need to keep trying, so exit
+            if (bce().getPosition_mm() <= 0) {
+                output_substate = NEUTRAL_EXIT;
             }
-            
-            
-
-            //depth >= depth command, go to the next substate the next iteration
-            if (depthLoop().getPosition() > depthCommand) {
-                pc().printf("Next substate: NEUTRAL_SLOWLY_RISE\n\r");
-                output_substate = NEUTRAL_SLOWLY_RISE;
+            //once deeper than the commanded setpoint...
+            else if (depthLoop().getPosition() > depthCommand) {
+                output_substate = NEUTRAL_SLOWLY_RISE; // next state
+                isSubStateTimerRunning = false; //reset the sub state timer
+            }
+ 
+            // what is active?
+            //once the 10 second timer is complete, reset the timeout so the state one-shot entry will move the setpoint
+            if (timer.read() >= _neutral_sink_timer) {
+                pc().printf("\r\n\n NEUTRAL_SINKING TIMER COMPLETE! %3.1f\r\n", timer.read());
+                pc().printf("\r\n\n (BATT POS: %0.1f) retract 10 mm (time: %3.1f)\r\n", previousPosition_mm, timer.read());
                 
-                //when you finish executing the motor controls, reset the neutral sinking timer in the next state
-                isSubStateTimeoutRunning = false;
-            }
-            
-            //before the sub-fsm runs again, make sure the piston is in a safe position (retracted)
-            //NEW: need to double-check this behavior
-            if (bce().getPosition_mm() <= 0) {
-                output_substate = NEUTRAL_EXIT;     
-                //the "case" NEUTRAL_EXIT is used to tell the greater FSM that this sub-FSM has completed
+                isSubStateTimerRunning = false; //reset the sub state timer
             }
             break;
             
         case NEUTRAL_SLOWLY_RISE:
-            if (!isSubStateTimeoutRunning) {                
+            if (!isSubStateTimerRunning) {                
                 pc().printf("\r\n\n(9) START NEUTRAL_SLOWLY_RISE (will go off at %0.1f sec)\r\n", timer.read());
-                _neutral_sink_timer = timer.read()+ 5; //record the time when this block is first entered and add 10 seconds
+                _neutral_rise_timer = timer.read()+ 5; //record the time when this block is first entered and add 5 seconds
                 
-                isSubStateTimeoutRunning = true;    //disable this block after one iteration
+                isSubStateTimerRunning = true;    //disable this block after one iteration
                 
-                // what is active?
-                //move piston at start of sequence (retract 10 mm)
+                // what are the commands?
+                //move piston at start of sequence (extend)
                 pc().printf("Neutral Slowly Rise: Extending piston 1 mm\n\r");
                 previousPosition_mm += 1;
                 bce().setPosition_mm(previousPosition_mm);  //no depth command
             }
             
-            //once 5 second timer complete move the piston with code above  
-            if (timer.read() >= _neutral_sink_timer) {
-                pc().printf("\r\n\n(9)NEUTRAL_SLOWLY_RISE TIMER COMPLETE! (time: %3.1f)\r\n", timer.read());
-                pc().printf("\r\n\n(9) (BATT POS: %0.1f) extend 1 mm %3.1f\r\n", previousPosition_mm, timer.read());
-                
-                //when you finish executing the motor controls, reset the neutral sinking timer in the next state
-                isSubStateTimeoutRunning = false;
+            // how exit?
+            //once at full travel limit and haven't yet risen, time to give up and exit
+            if (bce().getPosition_mm() >= bce().getTravelLimit()) {
+                output_substate = NEUTRAL_EXIT;     
             }
-            
             //depth rate or sink rate < 0 ft/s, go to the next substate the next iteration
-            if (depthLoop().getVelocity() < 0) { //less than zero ft/s
+            else if (depthLoop().getVelocity() < 0) { //less than zero ft/s
                 pc().printf("\r\n\n(9) NEUTRAL_SLOWLY_RISE: Sink Rate below 0 ft/s [time: %0.1f]\r\n", timer.read());
-                
-                pc().printf("Next substate: NEUTRAL_CHECK_PITCH\n\r");
                 output_substate = NEUTRAL_CHECK_PITCH;
             }
             
-            //before the sub-fsm runs again, make sure the piston is in a safe position (extended)
-            //NEW: need to double-check this behavior
-            //need to set a max travel position ? or just hardcode? or use bceFloatPosition?
-            if (bce().getPosition_mm() >= 320) {
-                output_substate = NEUTRAL_EXIT;     
-                //the "case" NEUTRAL_EXIT is used to tell the greater FSM that this sub-FSM has completed
+            // what is active?
+            //once 5 second timer complete, reset the timeout so the state one-shot entry will move the setpoint
+            if (timer.read() >= _neutral_sink_timer) {
+                pc().printf("\r\n\n(9)NEUTRAL_SLOWLY_RISE TIMER COMPLETE! (time: %3.1f)\r\n", timer.read());
+                pc().printf("\r\n\n (BATT POS: %0.1f) extend 1 mm %3.1f\r\n", previousPosition_mm, timer.read());
+   
+                isSubStateTimerRunning = false; // reset the sub state timer
             }
             break;   
                 
-        case NEUTRAL_CHECK_PITCH:
-            //no timeout in this sub FSM state (find_neutral timer still running)        
-            
-            //what is active?
+        case NEUTRAL_CHECK_PITCH :
+            pc().printf("NEUTRAL_CHECK_PITCH (time: %3.1f) [%0.1f deg, %0.1f deg/s] \r", timer.read(), pitchLoop().getPosition(), pitchLoop().getVelocity()); //debug  
+            //no timeout in this sub FSM state (find_neutral timer still running)
+ 
+            //what are commands?
             //the BCE piston is maintaining its position 
             //the battery is maintaining the pitch at zero degrees
             
-            //check sink rate < 0.5 ft/s, go to the next substate the next iteration (pitch velocity)
-            //check pitch angle is less than 1.0 degree
-            
-            pc().printf("(10) NEUTRAL_CHECK_PITCH (time: %3.1f) [%0.1f deg, %0.1f deg/s] \r", timer.read(), pitch_angle, pitch_rate); //debug  
-            output_substate = NEUTRAL_CHECK_PITCH;
-            
-            //benchtop tests confirm it needs to be around 2 degrees
-            if ((abs_pitch_rate < 0.5) && (abs_pitch_angle < 2.0)) { //less than zero ft/s and 1 degree
-                //SAVE POSITIONS
-                _neutral_buoyancy_bce_pos_mm = bce().getPosition_mm();
-                _neutral_buoyancy_batt_pos_mm = batt().getPosition_mm();
+            // how exit?
+            //pitch angle and pitch rate within small tolerance
+            //benchtop tests confirm angle needs to be around 2 degrees
+            if ((fabs(pitchLoop().getPosition()) < 0.5) and (fabs(pitchLoop().getVelocity()) < 2.0)) {
+                pc().printf("Saving Positions: BCE: %0.1f mm, BATT: %0.1f\n\r",bce().getPosition_mm(),batt().getPosition_mm());
+ 
+                //save positions locally
+                depthLoop().setOutputOffset(bce().getPosition_mm());
+                pitchLoop().setOutputOffset(batt().getPosition_mm());
                 
                 //save to neutral.cfg
-                ConfigFileIO().saveNeutralPositions(_neutral_buoyancy_bce_pos_mm,_neutral_buoyancy_batt_pos_mm); //BCE, BATT
+                // Troy: save into the depth.txt and pitch.txt files, not a separate file.
+                ConfigFileIO().saveNeutralPositions(bce().getPosition_mm(),batt().getPosition_mm()); //BCE, BATT
                 
-                pc().printf("Saving Positions: BCE: %0.1f mm, BATT: %0.1f\n\r",_neutral_buoyancy_bce_pos_mm,_neutral_buoyancy_batt_pos_mm);
-                pc().printf("Next substate: NEUTRAL_EXIT\n\r");
                 output_substate = NEUTRAL_EXIT;     //the "case" NEUTRAL_EXIT is used to tell the greater FSM that this sub-FSM has completed
             }
             break;
-  
-        default:
-            pc().printf("DEFAULT: check_pitch (state 10)\n\r"); //debug
-            output_substate = NEUTRAL_CHECK_PITCH;  //a default within the sub-state machine
+ 
+        case NEUTRAL_EXIT :
+            //NEUTRAL_EXIT state is used to tell the greater FSM that this sub-FSM has completed
+            pc().printf("substate: NEUTRAL_EXIT\n\r");
+            break;
+ 
+        default :
+            pc().printf("how did we get to substate default?\n\r"); //debug
+            output_substate = NEUTRAL_EXIT;  //a default within the sub-state machine
             break;    
     }
+    
     return output_substate;
 }
-
-// keyboard currently handles a key at a time
-// returns -1 if not a state command
-// returns a positive number to command a new state
+ 
+// keyboard runs independently of the state machine, handling one key at a time
+//keyboard updates the desired _keyboard_state that is used in the state machine
+//and only allows input when the state is "idle"
 void StateMachine::keyboard() {
     char userInput;
-    
+ 
     // check keyboard and make settings changes as requested
     // states can be changed only at the start of a sequence (when the system is in SIT_IDLE)
     if (pc().readable() && (_state == SIT_IDLE)) {
         // get the key
         userInput = pc().getc();    
         
-        isTimeoutRunning = false;   //keyboard resets timer each time it's used
+        // keyboard resets timer each time it's used
+        isTimeoutRunning = false;
         
         pc().printf("KEYBOARD isTimeoutRunning: %d\n\r", isTimeoutRunning);
         
-        //_keyboard_state = SIT_IDLE; //new
-
         // check command against desired control buttons
-        // change state
         if (userInput == 'D' or userInput == 'd') {
             _keyboard_state = DIVE;
         }
@@ -639,7 +637,7 @@
             wait(0.5);
             mbed_reset();
         }
-
+ 
         // change settings        
         else if (userInput == 'Q' or userInput == 'q') {
             pitchCommand -= 0.5;         //decrement the pitch setpoint
@@ -661,6 +659,7 @@
             depthLoop().setCommand(depthCommand);
             pc().printf(">>> new depth setpoint: %0.3f ft (rise)\r\n", depthLoop().getCommand());
         }
+ 
         else if (userInput == '-') {
             _timeout -= 10.0;               //decrement the timeout
             pc().printf(">>> timeout decreased: %d\r\n", _timeout);
@@ -670,8 +669,6 @@
             pc().printf(">>> timeout increased: %d\r\n", _timeout);
         }
         
-        // add keyboard commands to move the neutral zero offsets, both bce and batt
-        
         // go to sub-menus for the PID gains (this is blocking)
         else if (userInput == '1') {
             keyboard_menu_BCE_PID_settings();
@@ -704,19 +701,8 @@
         _next_state = _keyboard_state;   //set state at the end of this function
     }
 }
-
-//11/19/2017
-//you want to modify the keyboard to return the values that will be used in the state machine
-//BUT the state machine does not call they keyboard
-//the keyboard runs independently and only allows input when the state is "idle"
-//therefore keyboard should run maybe 1/10th of a second when pc readable
-//and it will change a class variable that says what the current state is
-
-//make it void
-
-
-
-
+ 
+ 
 void StateMachine::keyboard_menu_BCE_PID_settings() {    
     char PID_key;
     float gain_step_size = 0.01;    // modify this to change gain step size
@@ -783,7 +769,7 @@
         }
     }
 }
-
+ 
 void StateMachine::keyboard_menu_BATT_PID_settings() {    
     char PID_key;
     float gain_step_size = 0.01;    // modify this to change gain step size
@@ -796,7 +782,7 @@
     pc().printf("\n\r(Adjust PID settings with the following keys: -= and [] and ;'");
     pc().printf("\n\r(Hit shift + X to exit w/o saving.  Hit shift + S to save.\n\r");
     pc().printf("batt   P: %3.2f, I: %3.2f, D %3.2f, zero %3i, limit %3.0f mm, slope %3.3f  \r\n", batt().getControllerP(), batt().getControllerI(), batt().getControllerD(), batt().getZeroCounts(), batt().getTravelLimit(), batt().getPotSlope());
-
+ 
     // handle the key presses
     while(1) {
         // get the user's keystroke from either of the two inputs
@@ -850,7 +836,7 @@
         }
     }
 }
-
+ 
 void StateMachine::keyboard_menu_DEPTH_PID_settings() {    
     char PID_key;
     float gain_step_size = 0.01;    // modify this to change gain step size
@@ -930,7 +916,7 @@
     pc().printf("\n\r(Adjust PID settings with the following keys: -= and [] and ;'");
     pc().printf("\n\r(Hit shift + X to exit w/o saving.  Hit shift + S to save.\n\r");
     pc().printf("pitch  P: %3.2f, I: %3.2f, D %3.2f, offset: %3.1f mm \r\n", pitchLoop().getControllerP(), pitchLoop().getControllerI(), pitchLoop().getControllerD(), pitchLoop().getOutputOffset());
-
+ 
     // handle the key presses
     while(1) {
         // get the user's keystroke from either of the two inputs
@@ -983,48 +969,48 @@
         }
     }
 }
-
+ 
 float StateMachine::getDepthCommand() {
     return depthCommand;
 }
-
+ 
 float StateMachine::getPitchCommand() {
     return pitchCommand;
 }
-
+ 
 void StateMachine::setState(int input_state) {
     //pc().printf("input_state: %d\n\r", input_state); //debug
     //_state = input_state;     //changing wrong variable
     _next_state = input_state;
 }
-
+ 
 int StateMachine::getState() {
     return _state;  //return the current state of the system
 }
-
+ 
 void StateMachine::setTimeout(float input_timeout) {
     _timeout = input_timeout;
 }
-
+ 
 void StateMachine::setDepthCommand(float input_depth_command) {
     depthCommand = input_depth_command;
 }
-
+ 
 void StateMachine::setPitchCommand(float input_pitch_command) {
     pitchCommand = input_pitch_command;
 }
-
+ 
 void StateMachine::setNeutralPositions(float batt_pos_mm, float bce_pos_mm) {
     _neutral_buoyancy_batt_pos_mm = batt_pos_mm;
     _neutral_buoyancy_bce_pos_mm = bce_pos_mm;
     
     pc().printf("Neutral Buoyancy Positions: batt: %0.1f, bce: %0.1f\n\r",_neutral_buoyancy_batt_pos_mm,_neutral_buoyancy_bce_pos_mm);
 }
-
+ 
 int StateMachine::timeoutRunning() {
     return isTimeoutRunning;
 }
-
+ 
 //process one state at a time
 void StateMachine::getDiveSequence() {
     //iterate through this sequence using the FSM