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.
Dependencies: mbed MODSERIAL FATFileSystem
StateMachine/StateMachine.hpp@54:d4990fb68404, 2018-06-08 (annotated)
- Committer:
- tnhnrl
- Date:
- Fri Jun 08 13:56:30 2018 +0000
- Revision:
- 54:d4990fb68404
- Parent:
- 52:f207567d3ea4
- Child:
- 55:f4ec445c42fe
heading not working
Who changed what in which revision?
| User | Revision | Line number | New contents of line | 
|---|---|---|---|
| tnhnrl | 16:3363b9f14913 | 1 | #ifndef STATEMACHINE_HPP | 
| tnhnrl | 16:3363b9f14913 | 2 | #define STATEMACHINE_HPP | 
| tnhnrl | 20:8987a9ae2bc7 | 3 | |
| tnhnrl | 16:3363b9f14913 | 4 | #include "mbed.h" | 
| tnhnrl | 32:f2f8ae34aadc | 5 | #include <vector> | 
| tnhnrl | 20:8987a9ae2bc7 | 6 | |
| tnhnrl | 16:3363b9f14913 | 7 | extern "C" void mbed_reset(); // utilized to reset the mbed | 
| tnhnrl | 20:8987a9ae2bc7 | 8 | |
| tnhnrl | 20:8987a9ae2bc7 | 9 | // main finite state enumerations | 
| tnhnrl | 16:3363b9f14913 | 10 | enum { | 
| tnhnrl | 17:7c16b5671d0e | 11 | SIT_IDLE, // stops both motors, exits after a keyboard input | 
| tnhnrl | 49:47ffa4feb6db | 12 | CHECK_TUNING, // runs the system to the positions specified in the files | 
| tnhnrl | 17:7c16b5671d0e | 13 | FIND_NEUTRAL, // dives to depth at zero pitch, exits when stable | 
| tnhnrl | 17:7c16b5671d0e | 14 | DIVE, // dives to depth at negative pitch, exits when crossing a defined depth | 
| tnhnrl | 17:7c16b5671d0e | 15 | RISE, // rises to surface at positive pitch, exits when near surface | 
| tnhnrl | 17:7c16b5671d0e | 16 | FLOAT_LEVEL, // bce position to float, pitch loop active at zero, exits when stable near zero pitch | 
| tnhnrl | 17:7c16b5671d0e | 17 | FLOAT_BROADCAST, // bce position to float, batt position forward to hold tail up, exits when actuators done | 
| tnhnrl | 17:7c16b5671d0e | 18 | EMERGENCY_CLIMB, // bce position to full rise, batt position to full aft, exits when at surface | 
| danstrider | 22:a10ee088403b | 19 | MULTI_DIVE, // multi-dive sequence | 
| tnhnrl | 28:16c83a2fdefa | 20 | MULTI_RISE, // multi-rise sequence | 
| tnhnrl | 32:f2f8ae34aadc | 21 | KEYBOARD, // "state" for tracking only | 
| tnhnrl | 45:16b8162188ca | 22 | TRANSMIT_LOG, | 
| tnhnrl | 45:16b8162188ca | 23 | RECEIVE_SEQUENCE | 
| tnhnrl | 20:8987a9ae2bc7 | 24 | }; | 
| tnhnrl | 20:8987a9ae2bc7 | 25 | |
| tnhnrl | 20:8987a9ae2bc7 | 26 | // find_neutral finite state machine enumerations | 
| tnhnrl | 20:8987a9ae2bc7 | 27 | enum { | 
| danstrider | 22:a10ee088403b | 28 | NEUTRAL_SINKING, // increment the bce until really start sinking | 
| danstrider | 22:a10ee088403b | 29 | NEUTRAL_SLOWLY_RISE, // once sinking, arrest the sink | 
| danstrider | 22:a10ee088403b | 30 | NEUTRAL_CHECK_PITCH, // find level again, then save the data and exit | 
| tnhnrl | 32:f2f8ae34aadc | 31 | NEUTRAL_EXIT, // sub-FSM has completed all checks | 
| tnhnrl | 17:7c16b5671d0e | 32 | }; | 
| tnhnrl | 32:f2f8ae34aadc | 33 | |
| tnhnrl | 32:f2f8ae34aadc | 34 | // test idea | 
| tnhnrl | 20:8987a9ae2bc7 | 35 | |
| tnhnrl | 17:7c16b5671d0e | 36 | //struct for saving the data | 
| tnhnrl | 17:7c16b5671d0e | 37 | struct currentSequenceStruct { | 
| tnhnrl | 17:7c16b5671d0e | 38 | int state; //for the current StateMachine, states are ID-ed with enumeration | 
| tnhnrl | 17:7c16b5671d0e | 39 | float timeout; | 
| tnhnrl | 17:7c16b5671d0e | 40 | float depth; | 
| tnhnrl | 17:7c16b5671d0e | 41 | float pitch; | 
| tnhnrl | 16:3363b9f14913 | 42 | }; | 
| tnhnrl | 20:8987a9ae2bc7 | 43 | |
| tnhnrl | 16:3363b9f14913 | 44 | class StateMachine { | 
| tnhnrl | 16:3363b9f14913 | 45 | public: | 
| tnhnrl | 16:3363b9f14913 | 46 | StateMachine(); | 
| tnhnrl | 16:3363b9f14913 | 47 | |
| tnhnrl | 34:9b66c5188051 | 48 | int runStateMachine(); | 
| tnhnrl | 16:3363b9f14913 | 49 | |
| tnhnrl | 16:3363b9f14913 | 50 | void showMenu(); | 
| tnhnrl | 16:3363b9f14913 | 51 | |
| tnhnrl | 17:7c16b5671d0e | 52 | void keyboard(); | 
| tnhnrl | 16:3363b9f14913 | 53 | |
| tnhnrl | 49:47ffa4feb6db | 54 | void keyboard_menu_MANUAL_TUNING(); | 
| tnhnrl | 52:f207567d3ea4 | 55 | void keyboard_menu_STREAM_STATUS(); | 
| tnhnrl | 52:f207567d3ea4 | 56 | void keyboard_menu_CHANNEL_READINGS(); | 
| tnhnrl | 52:f207567d3ea4 | 57 | void keyboard_menu_RUDDER_SERVO_settings(); | 
| tnhnrl | 54:d4990fb68404 | 58 | void keyboard_menu_COUNTS_STATUS(); | 
| tnhnrl | 49:47ffa4feb6db | 59 | |
| tnhnrl | 16:3363b9f14913 | 60 | void keyboard_menu_BCE_PID_settings(); | 
| tnhnrl | 16:3363b9f14913 | 61 | void keyboard_menu_BATT_PID_settings(); | 
| tnhnrl | 16:3363b9f14913 | 62 | void keyboard_menu_DEPTH_PID_settings(); | 
| tnhnrl | 16:3363b9f14913 | 63 | void keyboard_menu_PITCH_PID_settings(); | 
| tnhnrl | 16:3363b9f14913 | 64 | |
| tnhnrl | 16:3363b9f14913 | 65 | float getDepthCommand(); | 
| tnhnrl | 16:3363b9f14913 | 66 | float getPitchCommand(); | 
| tnhnrl | 32:f2f8ae34aadc | 67 | float getDepthReading(); | 
| tnhnrl | 32:f2f8ae34aadc | 68 | float getPitchReading(); | 
| tnhnrl | 32:f2f8ae34aadc | 69 | float getTimerReading(); | 
| tnhnrl | 16:3363b9f14913 | 70 | |
| tnhnrl | 32:f2f8ae34aadc | 71 | int runNeutralStateMachine(); //substate returns the state (which is used in overall FSM) | 
| tnhnrl | 17:7c16b5671d0e | 72 | |
| tnhnrl | 28:16c83a2fdefa | 73 | int getState(); | 
| tnhnrl | 17:7c16b5671d0e | 74 | void setState(int input_state); | 
| tnhnrl | 28:16c83a2fdefa | 75 | |
| tnhnrl | 17:7c16b5671d0e | 76 | void setTimeout(float input_timeout); | 
| tnhnrl | 17:7c16b5671d0e | 77 | void setDepthCommand(float input_depth_command); | 
| tnhnrl | 17:7c16b5671d0e | 78 | void setPitchCommand(float input_pitch_command); | 
| tnhnrl | 17:7c16b5671d0e | 79 | |
| tnhnrl | 17:7c16b5671d0e | 80 | void setNeutralPositions(float batt_pos_mm, float bce_pos_mm); | 
| tnhnrl | 17:7c16b5671d0e | 81 | |
| tnhnrl | 17:7c16b5671d0e | 82 | int timeoutRunning(); | 
| tnhnrl | 17:7c16b5671d0e | 83 | |
| tnhnrl | 21:38c8544db6f4 | 84 | void getDiveSequence(); //used in multi-dive sequence with public variables for now | 
| tnhnrl | 17:7c16b5671d0e | 85 | |
| tnhnrl | 32:f2f8ae34aadc | 86 | void runActiveNeutralStateMachine(); //new neutral substate returns the state (which is used in overall FSM) | 
| tnhnrl | 32:f2f8ae34aadc | 87 | |
| tnhnrl | 34:9b66c5188051 | 88 | float * getLoggerArray(); //delete soon | 
| tnhnrl | 32:f2f8ae34aadc | 89 | |
| tnhnrl | 34:9b66c5188051 | 90 | void recordData(int input_state); //record log data to file using MbedLogger class | 
| tnhnrl | 32:f2f8ae34aadc | 91 | void printDirectory(); | 
| tnhnrl | 32:f2f8ae34aadc | 92 | void recordState(int input_state); | 
| tnhnrl | 34:9b66c5188051 | 93 | void printCurrentSdLog(); //more tricky for SD card, work in progress | 
| tnhnrl | 32:f2f8ae34aadc | 94 | |
| tnhnrl | 32:f2f8ae34aadc | 95 | void createNewFile(); | 
| tnhnrl | 32:f2f8ae34aadc | 96 | |
| tnhnrl | 32:f2f8ae34aadc | 97 | void transmitData(); | 
| tnhnrl | 32:f2f8ae34aadc | 98 | |
| tnhnrl | 36:966a86937e17 | 99 | float * dataArray(); | 
| tnhnrl | 36:966a86937e17 | 100 | |
| tnhnrl | 52:f207567d3ea4 | 101 | //06/06/2018 | 
| tnhnrl | 52:f207567d3ea4 | 102 | float getFloatUserInput(); | 
| tnhnrl | 52:f207567d3ea4 | 103 | |
| tnhnrl | 16:3363b9f14913 | 104 | private: | 
| tnhnrl | 17:7c16b5671d0e | 105 | int _timeout; // generic timeout for every state, seconds | 
| tnhnrl | 28:16c83a2fdefa | 106 | float _pitchTolerance; // pitch angle tolerance for neutral finding exit criteria | 
| tnhnrl | 28:16c83a2fdefa | 107 | float _bceFloatPosition; // bce position for "float" states | 
| tnhnrl | 28:16c83a2fdefa | 108 | float _battFloatPosition; // batt position for "broadcast" state | 
| tnhnrl | 16:3363b9f14913 | 109 | |
| tnhnrl | 32:f2f8ae34aadc | 110 | float _depth_command; // user keyboard depth | 
| tnhnrl | 32:f2f8ae34aadc | 111 | float _pitch_command; // user keyboard depth | 
| tnhnrl | 32:f2f8ae34aadc | 112 | float _depth_reading; // depth reading (to get the readings at the same time) | 
| tnhnrl | 32:f2f8ae34aadc | 113 | float _pitch_reading; // pitch reading (to get the readings at the same time) | 
| tnhnrl | 32:f2f8ae34aadc | 114 | float _timer_reading; // pitch reading (to get the readings at the same time) | 
| tnhnrl | 16:3363b9f14913 | 115 | |
| tnhnrl | 16:3363b9f14913 | 116 | Timer timer; | 
| tnhnrl | 17:7c16b5671d0e | 117 | |
| danstrider | 22:a10ee088403b | 118 | int _state; // Fine State Machine (FSM) state | 
| tnhnrl | 28:16c83a2fdefa | 119 | int _previous_state; // record previous state | 
| danstrider | 22:a10ee088403b | 120 | int _sub_state; // substate on find_neutral function | 
| danstrider | 22:a10ee088403b | 121 | int _previous_sub_state; // previous substate so that what goes into the sub-state is not being changed as it is processed | 
| tnhnrl | 24:c7d9b5bf3829 | 122 | float _neutral_timer; // keep time for rise/sink/level timer incremnets | 
| tnhnrl | 17:7c16b5671d0e | 123 | |
| tnhnrl | 28:16c83a2fdefa | 124 | bool _isTimeoutRunning; | 
| tnhnrl | 17:7c16b5671d0e | 125 | |
| tnhnrl | 28:16c83a2fdefa | 126 | bool _isSubStateTimerRunning; | 
| tnhnrl | 17:7c16b5671d0e | 127 | |
| tnhnrl | 21:38c8544db6f4 | 128 | float _neutral_bce_pos_mm; | 
| tnhnrl | 21:38c8544db6f4 | 129 | float _neutral_batt_pos_mm; | 
| tnhnrl | 17:7c16b5671d0e | 130 | |
| tnhnrl | 24:c7d9b5bf3829 | 131 | int _multi_dive_counter; | 
| tnhnrl | 28:16c83a2fdefa | 132 | |
| tnhnrl | 21:38c8544db6f4 | 133 | currentSequenceStruct currentStateStruct; //type_of_struct struct_name | 
| tnhnrl | 21:38c8544db6f4 | 134 | |
| tnhnrl | 21:38c8544db6f4 | 135 | bool _neutral_sub_state_active; // controls neutral_sub_state | 
| tnhnrl | 21:38c8544db6f4 | 136 | |
| tnhnrl | 21:38c8544db6f4 | 137 | float _depth_KP; | 
| tnhnrl | 21:38c8544db6f4 | 138 | float _depth_KI; | 
| tnhnrl | 21:38c8544db6f4 | 139 | float _depth_KD; | 
| tnhnrl | 21:38c8544db6f4 | 140 | |
| tnhnrl | 21:38c8544db6f4 | 141 | float _pitch_KP; | 
| tnhnrl | 21:38c8544db6f4 | 142 | float _pitch_KI; | 
| tnhnrl | 21:38c8544db6f4 | 143 | float _pitch_KD; | 
| tnhnrl | 28:16c83a2fdefa | 144 | |
| tnhnrl | 45:16b8162188ca | 145 | int _state_array[256]; //used to print out the states | 
| tnhnrl | 28:16c83a2fdefa | 146 | int _state_array_counter; //used to iterate through state records | 
| tnhnrl | 45:16b8162188ca | 147 | int _substate_array[256]; //used to print out the sub-states | 
| tnhnrl | 28:16c83a2fdefa | 148 | int _substate_array_counter; //used to iterate through sub-state records | 
| tnhnrl | 23:434f04ef1fad | 149 | |
| tnhnrl | 24:c7d9b5bf3829 | 150 | int _substate; | 
| tnhnrl | 24:c7d9b5bf3829 | 151 | int _previous_substate; | 
| tnhnrl | 28:16c83a2fdefa | 152 | |
| tnhnrl | 28:16c83a2fdefa | 153 | float _max_recorded_depth_neutral; | 
| tnhnrl | 28:16c83a2fdefa | 154 | float _max_recorded_depth_dive; | 
| tnhnrl | 32:f2f8ae34aadc | 155 | |
| tnhnrl | 32:f2f8ae34aadc | 156 | float _neutral_sink_command_mm; //defaults for neutral finding sub-FSM | 
| tnhnrl | 32:f2f8ae34aadc | 157 | float _neutral_rise_command_mm; | 
| tnhnrl | 32:f2f8ae34aadc | 158 | float _neutral_pitch_command_mm; | 
| tnhnrl | 32:f2f8ae34aadc | 159 | |
| tnhnrl | 32:f2f8ae34aadc | 160 | float _max_recorded_auto_neutral_depth; | 
| tnhnrl | 32:f2f8ae34aadc | 161 | |
| tnhnrl | 32:f2f8ae34aadc | 162 | //float _logger_array[1048][5]; //array to hold the input, one log per dive (row/col) | 
| tnhnrl | 32:f2f8ae34aadc | 163 | bool _is_log_timer_running; | 
| tnhnrl | 32:f2f8ae34aadc | 164 | float _log_timer; | 
| tnhnrl | 32:f2f8ae34aadc | 165 | |
| tnhnrl | 32:f2f8ae34aadc | 166 | float _data_log[9]; | 
| tnhnrl | 32:f2f8ae34aadc | 167 | |
| tnhnrl | 32:f2f8ae34aadc | 168 | volatile bool _file_closed; | 
| tnhnrl | 16:3363b9f14913 | 169 | }; | 
| tnhnrl | 20:8987a9ae2bc7 | 170 | |
| tnhnrl | 16:3363b9f14913 | 171 | #endif |