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
Diff: StateMachine/StateMachine.hpp
- Revision:
- 73:f6f378311c8d
- Child:
- 74:d281aaef9766
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/StateMachine/StateMachine.hpp Mon Jul 30 16:48:48 2018 +0000 @@ -0,0 +1,189 @@ +#ifndef STATEMACHINE_HPP +#define STATEMACHINE_HPP + +#include "mbed.h" +#include <vector> + +extern "C" void mbed_reset(); // utilized to reset the mbed + +// main finite state enumerations +enum { + SIT_IDLE, // stops both motors, exits after a keyboard input + CHECK_TUNING, // runs the system to the positions specified in the files + FIND_NEUTRAL, // dives to depth at zero pitch, exits when stable + DIVE, // dives to depth at negative pitch, exits when crossing a defined depth + RISE, // rises to surface at positive pitch, exits when near surface + POSITION_DIVE, // NEW POSITION ONLY COMMANDS (inner loop) + POSITION_RISE, // NEW POSITION ONLY COMMANDS (inner loop) + FLOAT_LEVEL, // bce position to float, pitch loop active at zero, exits when stable near zero pitch + FLOAT_BROADCAST, // bce position to float, batt position forward to hold tail up, exits when actuators done + EMERGENCY_CLIMB, // bce position to full rise, batt position to full aft, exits when at surface + MULTI_DIVE, // multi-dive sequence + MULTI_RISE, // multi-rise sequence + KEYBOARD, // "state" for tracking only + TX_MBED_LOG, + RECEIVE_SEQUENCE +}; + +// find_neutral finite state machine enumerations +enum { + NEUTRAL_SINKING, // increment the bce until really start sinking + NEUTRAL_SLOWLY_RISE, // once sinking, arrest the sink + NEUTRAL_CHECK_PITCH, // find level again, then save the data and exit + NEUTRAL_EXIT, // sub-FSM has completed all checks +}; + +// test idea + +//struct for saving the data +struct currentSequenceStruct { + int state; //for the current StateMachine, states are ID-ed with enumeration + float timeout; + float depth; + float pitch; +}; + +class StateMachine { +public: + StateMachine(); + + int runStateMachine(); + + void printSimpleMenu(); // simple menu + void printDebugMenu(); // debug menu + + void keyboard(); + + void keyboard_menu_MANUAL_TUNING(); + void keyboard_menu_STREAM_STATUS(); + void keyboard_menu_CHANNEL_READINGS(); + void keyboard_menu_POSITION_READINGS(); + void keyboard_menu_RUDDER_SERVO_settings(); + void keyboard_menu_HEADING_PID_settings(); + void keyboard_menu_COUNTS_STATUS(); //remove? + + void keyboard_menu_BCE_PID_settings(); + void keyboard_menu_BATT_PID_settings(); + void keyboard_menu_DEPTH_PID_settings(); + void keyboard_menu_PITCH_PID_settings(); + + float getDepthCommand(); + float getPitchCommand(); + float getDepthReading(); + float getPitchReading(); + float getTimerReading(); + + int runNeutralStateMachine(); //substate returns the state (which is used in overall FSM) + + int getState(); + void setState(int input_state); + + void setTimeout(float input_timeout); + void setDepthCommand(float input_depth_command); + void setPitchCommand(float input_pitch_command); + + void setNeutralPositions(float batt_pos_mm, float bce_pos_mm); + + void getDiveSequence(); //used in multi-dive sequence with public variables for now + + void runActiveNeutralStateMachine(); //new neutral substate returns the state (which is used in overall FSM) + + float * getLoggerArray(); //delete soon + + void printDirectory(); + void printCurrentSdLog(); //more tricky for SD card, work in progress + + void createNewFile(); + + void transmitData(); + + float * dataArray(); + + void checkMotorPositions(); //checks motor positions as a safe-guard against broken string pot or bad channel readings + +//GUI UPDATE FUNCTIONS + float getTimerValue(); + +private: + bool _debug_menu_on; // default is false to show simple menu, debug allows more tuning and has a lot of keyboard commands + + int _timeout; // generic timeout for every state, seconds + float _pitchTolerance; // pitch angle tolerance for neutral finding exit criteria + float _bceFloatPosition; // bce position for "float" states + float _battFloatPosition; // batt position for "broadcast" state + + float _depth_command; // user keyboard depth + float _pitch_command; // user keyboard pitch + float _heading_command; // user keyboard heading + + float _depth_reading; // depth reading (to get the readings at the same time) + float _pitch_reading; // pitch reading (to get the readings at the same time) + float _timer_reading; // pitch reading (to get the readings at the same time) + + Timer _fsm_timer; //timing variable used in class + + volatile int _state; // current state of Finite State Machine (FSM) + int _previous_state; // record previous state + int _sub_state; // substate on find_neutral function + int _previous_sub_state; // previous substate so that what goes into the sub-state is not being changed as it is processed + float _neutral_timer; // keep time for rise/sink/level timer incremnets + + bool _isTimeoutRunning; + + bool _isSubStateTimerRunning; + + float _neutral_bce_pos_mm; + float _neutral_batt_pos_mm; + + int _multi_dive_counter; + + currentSequenceStruct currentStateStruct; //type_of_struct struct_name + + float _depth_KP; + float _depth_KI; + float _depth_KD; + + float _pitch_KP; + float _pitch_KI; + float _pitch_KD; + + int _state_array[256]; //used to print out the states + int _state_array_counter; //used to iterate through state records + int _substate_array[256]; //used to print out the sub-states + int _substate_array_counter; //used to iterate through sub-state records + + int _substate; + int _previous_substate; + + float _max_recorded_depth_neutral; + float _max_recorded_depth_dive; + + float _neutral_sink_command_mm; //defaults for neutral finding sub-FSM + float _neutral_rise_command_mm; + float _neutral_pitch_command_mm; + + float _max_recorded_auto_neutral_depth; + + bool _is_log_timer_running; + float _log_timer; + + float _BCE_dive_offset; // NEW COMMANDS FOR POSITION CONTROLLER + float _BMM_dive_offset; + + float getFloatUserInput(); + + //new + float _batt_filter_freq; + float _bce_filter_freq; + float _pitch_filter_freq; + float _depth_filter_freq; + float _heading_filter_freq; + + float _batt_deadband; + float _bce_deadband; + float _pitch_deadband; + float _depth_deadband; + float _heading_deadband; +}; + +#endif \ No newline at end of file