Dependencies:   biquadFilter FastPWM HIDScope MODSERIAL mbed

Fork of StateMachine by Tommie Verouden

Committer:
tverouden
Date:
Wed Oct 31 15:33:02 2018 +0000
Revision:
4:5ce2c8864908
Parent:
3:9c63fc5f157e
Child:
5:04b26b2f536a
Transition logic implemented until operating mode

Who changed what in which revision?

UserRevisionLine numberNew contents of line
tverouden 0:c0c35b95765f 1 // ≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡ PREPARATION ≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡
tverouden 0:c0c35b95765f 2 // Libraries
tverouden 0:c0c35b95765f 3 #include "mbed.h"
tverouden 2:d70795e4e0bf 4 #include "BiQuad.h"
tverouden 0:c0c35b95765f 5 #include "FastPWM.h"
tverouden 0:c0c35b95765f 6 #include "HIDScope.h"
tverouden 0:c0c35b95765f 7 #include "MODSERIAL.h"
tverouden 0:c0c35b95765f 8
tverouden 0:c0c35b95765f 9 // Inputs & outputs
tverouden 0:c0c35b95765f 10 DigitalOut redled(LED_RED,1); // red LED K64F
tverouden 0:c0c35b95765f 11 DigitalOut greenled(LED_GREEN,1); // green LED K64F
tverouden 0:c0c35b95765f 12 DigitalOut blueled(LED_BLUE,1); // blue LED K64F
tverouden 4:5ce2c8864908 13 InterruptIn buttonBio1(D0); // button 1 BioRobotics shield
tverouden 4:5ce2c8864908 14 InterruptIn buttonBio2(D1); // button 2 BioRobotics shield
tverouden 0:c0c35b95765f 15 InterruptIn buttonK64F(SW3); // button on K64F
tverouden 0:c0c35b95765f 16 InterruptIn emergencybutton(SW2); // emergency button on K64F
tverouden 0:c0c35b95765f 17
tverouden 4:5ce2c8864908 18 MODSERIAL pc(USBTX, USBRX); // communication with pc
tverouden 4:5ce2c8864908 19
tverouden 0:c0c35b95765f 20 // Define & initialise state machine
tverouden 0:c0c35b95765f 21 enum states { waiting, calibratingMotors, calibratingEMGx, calibratingEMGy,
tverouden 2:d70795e4e0bf 22 homing, operating, flipping, failure, demo
tverouden 2:d70795e4e0bf 23 };
tverouden 0:c0c35b95765f 24 states currentState = waiting; // start in waiting mode
tverouden 2:d70795e4e0bf 25 bool changeState = true; // initialise the first state
tverouden 2:d70795e4e0bf 26
tverouden 3:9c63fc5f157e 27
tverouden 3:9c63fc5f157e 28
tverouden 4:5ce2c8864908 29 // ≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡ FUNCTIONS ≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡
tverouden 4:5ce2c8864908 30 // ============================= MOTOR FUNCTIONS =============================
tverouden 4:5ce2c8864908 31
tverouden 4:5ce2c8864908 32
tverouden 4:5ce2c8864908 33 // ============================= EMG FUNCTIONS ===============================
tverouden 4:5ce2c8864908 34
tverouden 4:5ce2c8864908 35
tverouden 2:d70795e4e0bf 36 // ≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡ STATE MACHINE ≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡
tverouden 4:5ce2c8864908 37 void stateMachine(void) // Moet niet elke staat naar de failure mode kunnen komen met het emergency knopoje?
tverouden 3:9c63fc5f157e 38 {
tverouden 3:9c63fc5f157e 39 switch (currentState) { // determine which state Odin is in
tverouden 3:9c63fc5f157e 40
tverouden 4:5ce2c8864908 41 // ============================== WAITING MODE ===============================
tverouden 3:9c63fc5f157e 42 case waiting:
tverouden 4:5ce2c8864908 43 // ------------------------ initialisation --------------------------
tverouden 4:5ce2c8864908 44 if (changeState) { // when entering the state
tverouden 4:5ce2c8864908 45 pc.printf("[MODE] waiting...\r\n");
tverouden 4:5ce2c8864908 46 // print current state
tverouden 4:5ce2c8864908 47 changeState = false; // stay in this state
tverouden 4:5ce2c8864908 48
tverouden 4:5ce2c8864908 49 // Actions when entering state
tverouden 4:5ce2c8864908 50 /* */
tverouden 4:5ce2c8864908 51
tverouden 4:5ce2c8864908 52 }
tverouden 4:5ce2c8864908 53 // ----------------------------- action ------------------------------
tverouden 4:5ce2c8864908 54 // Actions for each loop iteration
tverouden 4:5ce2c8864908 55 /* */
tverouden 4:5ce2c8864908 56
tverouden 4:5ce2c8864908 57 // --------------------------- transition ----------------------------
tverouden 4:5ce2c8864908 58 // Transition condition #1: with a button press, enter motor
tverouden 4:5ce2c8864908 59 // calibration mode
tverouden 4:5ce2c8864908 60 if (emergencybutton == true) { // Waarom drukken we op de noodknop om te beginnen? Lijkt me raar
tverouden 4:5ce2c8864908 61 // Actions when leaving state
tverouden 4:5ce2c8864908 62 /* */
tverouden 4:5ce2c8864908 63
tverouden 4:5ce2c8864908 64 currentState = calibratingMotors; // change to state
tverouden 4:5ce2c8864908 65 changeState = true; // next loop, switch states
tverouden 4:5ce2c8864908 66 }
tverouden 4:5ce2c8864908 67 break; // end case
tverouden 4:5ce2c8864908 68
tverouden 4:5ce2c8864908 69 // ========================= MOTOR CALIBRATION MODE ==========================
tverouden 4:5ce2c8864908 70 case calibratingMotors:
tverouden 4:5ce2c8864908 71 // ------------------------- initialisation --------------------------
tverouden 4:5ce2c8864908 72 if (changeState) { // when entering the state
tverouden 4:5ce2c8864908 73 pc.printf("[MODE] calibrating motors...r\n");
tverouden 4:5ce2c8864908 74 // print current state
tverouden 4:5ce2c8864908 75 changeState = false; // stay in this state
tverouden 4:5ce2c8864908 76
tverouden 4:5ce2c8864908 77 // Actions when entering state
tverouden 4:5ce2c8864908 78 /* */
tverouden 4:5ce2c8864908 79
tverouden 4:5ce2c8864908 80 }
tverouden 4:5ce2c8864908 81 // ----------------------------- action ------------------------------
tverouden 4:5ce2c8864908 82 // Actions for each loop iteration
tverouden 4:5ce2c8864908 83 /* */
tverouden 4:5ce2c8864908 84
tverouden 4:5ce2c8864908 85 // --------------------------- transition ----------------------------
tverouden 4:5ce2c8864908 86 // Transition condition #1: after 3 sec in state && all motor // Als vóór het einde van de 3 seconden alle motoren al snelheid 0 hebben, zitten ze zo dus door te draaien terwijl dat niet kan
tverouden 4:5ce2c8864908 87 // velocities zero, start calibrating EMG-x // dat lijkt me niet de bedoeling
tverouden 4:5ce2c8864908 88 if (1) {
tverouden 4:5ce2c8864908 89 // Actions when leaving state
tverouden 4:5ce2c8864908 90 /* */
tverouden 4:5ce2c8864908 91
tverouden 4:5ce2c8864908 92 currentState = calibratingMotors; // change to state
tverouden 4:5ce2c8864908 93 changeState = true; // next loop, switch states
tverouden 4:5ce2c8864908 94 }
tverouden 4:5ce2c8864908 95
tverouden 4:5ce2c8864908 96
tverouden 4:5ce2c8864908 97 break; // end case
tverouden 4:5ce2c8864908 98
tverouden 4:5ce2c8864908 99 // ================== EMG 1 (X-DIRECTION) CALIBRATION MODE ===================
tverouden 4:5ce2c8864908 100 case calibratingEMGx:
tverouden 4:5ce2c8864908 101 // ------------------------- initialisation --------------------------
tverouden 3:9c63fc5f157e 102 if (changeState) { // when entering the state
tverouden 4:5ce2c8864908 103 pc.printf("[MODE] calibrating EMG 1 (x-direction)...\r\n");
tverouden 4:5ce2c8864908 104 // print current state
tverouden 4:5ce2c8864908 105 changeState = false; // stay in this state
tverouden 4:5ce2c8864908 106
tverouden 4:5ce2c8864908 107 // Actions when entering state
tverouden 4:5ce2c8864908 108 /* */
tverouden 4:5ce2c8864908 109
tverouden 4:5ce2c8864908 110 }
tverouden 4:5ce2c8864908 111 // ----------------------------- action ------------------------------
tverouden 4:5ce2c8864908 112 // Actions for each loop iteration
tverouden 4:5ce2c8864908 113 /* */
tverouden 4:5ce2c8864908 114
tverouden 4:5ce2c8864908 115 // --------------------------- transition ----------------------------
tverouden 4:5ce2c8864908 116 // Transition condition #1: after 5 sec in state && relaxation
tverouden 4:5ce2c8864908 117 if (1) {
tverouden 4:5ce2c8864908 118 // Actions when leaving state
tverouden 4:5ce2c8864908 119 /* */
tverouden 4:5ce2c8864908 120
tverouden 4:5ce2c8864908 121 currentState = calibratingEMGy; // change to state
tverouden 4:5ce2c8864908 122 changeState = true; // next loop, switch states
tverouden 4:5ce2c8864908 123 }
tverouden 4:5ce2c8864908 124 break; // end case
tverouden 4:5ce2c8864908 125
tverouden 4:5ce2c8864908 126 // ================== EMG 2 (Y-DIRECTION) CALIBRATION MODE ===================
tverouden 4:5ce2c8864908 127 case calibratingEMGy:
tverouden 4:5ce2c8864908 128 // ------------------------- initialisation --------------------------
tverouden 4:5ce2c8864908 129 if (changeState) { // when entering the state
tverouden 4:5ce2c8864908 130 pc.printf("[MODE] calibrating EMG 2 (y-direction)...\r\n");
tverouden 4:5ce2c8864908 131 // print current state
tverouden 4:5ce2c8864908 132 changeState = false; // stay in this state
tverouden 4:5ce2c8864908 133
tverouden 4:5ce2c8864908 134 // Actions when entering state
tverouden 4:5ce2c8864908 135 /* */
tverouden 4:5ce2c8864908 136
tverouden 4:5ce2c8864908 137 }
tverouden 4:5ce2c8864908 138 // ----------------------------- action ------------------------------
tverouden 4:5ce2c8864908 139 // Actions for each loop iteration
tverouden 4:5ce2c8864908 140 /* */
tverouden 4:5ce2c8864908 141
tverouden 4:5ce2c8864908 142 // --------------------------- transition ----------------------------
tverouden 4:5ce2c8864908 143 // Transition condition #1: after 5 sec in state && relaxation
tverouden 4:5ce2c8864908 144 if (1) {
tverouden 4:5ce2c8864908 145 // Actions when leaving state
tverouden 4:5ce2c8864908 146 /* */
tverouden 4:5ce2c8864908 147
tverouden 4:5ce2c8864908 148 currentState = homing; // change to state
tverouden 4:5ce2c8864908 149 changeState = true; // next loop, switch states
tverouden 4:5ce2c8864908 150
tverouden 4:5ce2c8864908 151 // ============================== HOMING MODE ================================
tverouden 4:5ce2c8864908 152 case homing:
tverouden 4:5ce2c8864908 153 // ------------------------- initialisation --------------------------
tverouden 4:5ce2c8864908 154 if (changeState) { // when entering the state
tverouden 4:5ce2c8864908 155 pc.printf("[MODE] homing...\r\n");
tverouden 4:5ce2c8864908 156 // print current state
tverouden 4:5ce2c8864908 157 changeState = false; // stay in this state
tverouden 4:5ce2c8864908 158
tverouden 4:5ce2c8864908 159
tverouden 4:5ce2c8864908 160 // Actions when entering state
tverouden 4:5ce2c8864908 161 /* */
tverouden 4:5ce2c8864908 162
tverouden 4:5ce2c8864908 163 }
tverouden 4:5ce2c8864908 164 // ----------------------------- action ------------------------------
tverouden 4:5ce2c8864908 165 // Actions for each loop iteration
tverouden 4:5ce2c8864908 166 /* */
tverouden 4:5ce2c8864908 167
tverouden 4:5ce2c8864908 168 // --------------------------- transition ----------------------------
tverouden 4:5ce2c8864908 169 // Transition condition #1: with button press, enter demo mode
tverouden 4:5ce2c8864908 170 if (buttonBio1 == true) { // Het is niet nodig om hier ook nog "&& currentState == homing" toe te voegen, want hij bereikt dit stuk code alleen in homing mode
tverouden 4:5ce2c8864908 171 // Actions when leaving state
tverouden 4:5ce2c8864908 172 /* */
tverouden 4:5ce2c8864908 173
tverouden 4:5ce2c8864908 174 currentState = demoing; // change to state
tverouden 4:5ce2c8864908 175 changeState = true; // next loop, switch states
tverouden 4:5ce2c8864908 176 }
tverouden 4:5ce2c8864908 177 // Transition condition #2: with button press, enter operation mode
tverouden 4:5ce2c8864908 178 if (buttonBio2 == true) {
tverouden 4:5ce2c8864908 179 // Actions when leaving state
tverouden 4:5ce2c8864908 180 /* */
tverouden 4:5ce2c8864908 181
tverouden 4:5ce2c8864908 182 currentState = operating; // change to state
tverouden 4:5ce2c8864908 183 changeState = true; // next loop, switch states
tverouden 4:5ce2c8864908 184 }
tverouden 4:5ce2c8864908 185 break; // end case
tverouden 4:5ce2c8864908 186
tverouden 4:5ce2c8864908 187 // ============================= OPERATING MODE ==============================
tverouden 4:5ce2c8864908 188 case operating:
tverouden 4:5ce2c8864908 189 // ------------------------- initialisation --------------------------
tverouden 4:5ce2c8864908 190 if (changeState) { // when entering the state
tverouden 4:5ce2c8864908 191 pc.printf("[MODE] operating...\r\n");
tverouden 4:5ce2c8864908 192 // print current state
tverouden 3:9c63fc5f157e 193 changeState = false; // stay in this state
tverouden 3:9c63fc5f157e 194
tverouden 3:9c63fc5f157e 195 // Actions when entering state
tverouden 3:9c63fc5f157e 196
tverouden 4:5ce2c8864908 197 /* */
tverouden 3:9c63fc5f157e 198
tverouden 3:9c63fc5f157e 199 }
tverouden 4:5ce2c8864908 200 // ----------------------------- action ------------------------------
tverouden 3:9c63fc5f157e 201 // Actions for each loop iteration
tverouden 4:5ce2c8864908 202 /* */
tverouden 4:5ce2c8864908 203
tverouden 4:5ce2c8864908 204 // --------------------------- transition ----------------------------
tverouden 4:5ce2c8864908 205 // Transition condition #1: with button press, back to homing mode
tverouden 4:5ce2c8864908 206 if (buttonBio2 == true) {
tverouden 3:9c63fc5f157e 207 // Actions when leaving state
tverouden 4:5ce2c8864908 208 currentState = homing; // change to state
tverouden 4:5ce2c8864908 209 changeState = true; // next loop, switch states
tverouden 4:5ce2c8864908 210 }
tverouden 4:5ce2c8864908 211 // Transition condition #2: after 3 sec relaxation, start flipping
tverouden 4:5ce2c8864908 212 if (1) {
tverouden 4:5ce2c8864908 213 // Actions when leaving state
tverouden 4:5ce2c8864908 214 currentState = homing; // change to state
tverouden 3:9c63fc5f157e 215 changeState = true; // next loop, switch states
tverouden 3:9c63fc5f157e 216 }
tverouden 3:9c63fc5f157e 217 break; // end case
tverouden 4:5ce2c8864908 218
tverouden 4:5ce2c8864908 219 // ============================== FLIPPING MODE ================================
tverouden 4:5ce2c8864908 220 case flipping:
tverouden 4:5ce2c8864908 221 // ------------------------------ initialisation -------------------------------
tverouden 3:9c63fc5f157e 222 if (changeState) { // when entering the state
tverouden 4:5ce2c8864908 223 pc.printf("[MODE] flipping...\r\n"); // print current state
tverouden 3:9c63fc5f157e 224 changeState = false; // stay in this state
tverouden 3:9c63fc5f157e 225
tverouden 3:9c63fc5f157e 226 // Actions when entering state
tverouden 3:9c63fc5f157e 227
tverouden 4:5ce2c8864908 228 /* */
tverouden 4:5ce2c8864908 229
tverouden 4:5ce2c8864908 230 }
tverouden 4:5ce2c8864908 231 // ---------------------------------- action -----------------------------------
tverouden 4:5ce2c8864908 232 // Actions for each loop iteration
tverouden 4:5ce2c8864908 233 /* */
tverouden 4:5ce2c8864908 234
tverouden 4:5ce2c8864908 235 // -------------------------------- transition ---------------------------------
tverouden 4:5ce2c8864908 236 // Transition condition #1
tverouden 4:5ce2c8864908 237 if (1) {
tverouden 4:5ce2c8864908 238 // Actions when leaving state
tverouden 4:5ce2c8864908 239 currentState = flipping; // change to state
tverouden 4:5ce2c8864908 240 changeState = true; // next loop, switch states
tverouden 4:5ce2c8864908 241 }
tverouden 4:5ce2c8864908 242 break; // end case
tverouden 4:5ce2c8864908 243
tverouden 4:5ce2c8864908 244 // =============================== DEMOING MODE ================================
tverouden 4:5ce2c8864908 245 case demoing:
tverouden 4:5ce2c8864908 246 // ------------------------------ initialisation -------------------------------
tverouden 4:5ce2c8864908 247 if (changeState) { // when entering the state
tverouden 4:5ce2c8864908 248 pc.printf("[MODE] demoing...\r\n"); // print current state
tverouden 4:5ce2c8864908 249 changeState = false; // stay in this state
tverouden 4:5ce2c8864908 250
tverouden 4:5ce2c8864908 251 // Actions when entering state
tverouden 4:5ce2c8864908 252
tverouden 4:5ce2c8864908 253 /* */
tverouden 3:9c63fc5f157e 254
tverouden 3:9c63fc5f157e 255 }
tverouden 4:5ce2c8864908 256 // ---------------------------------- action -----------------------------------
tverouden 3:9c63fc5f157e 257 // Actions for each loop iteration
tverouden 4:5ce2c8864908 258 /* */
tverouden 4:5ce2c8864908 259
tverouden 4:5ce2c8864908 260 // -------------------------------- transition ---------------------------------
tverouden 3:9c63fc5f157e 261 // Transition condition #1
tverouden 4:5ce2c8864908 262 if (1) {
tverouden 3:9c63fc5f157e 263 // Actions when leaving state
tverouden 4:5ce2c8864908 264 currentState = flipping; // change to state
tverouden 3:9c63fc5f157e 265 changeState = true; // next loop, switch states
tverouden 3:9c63fc5f157e 266 }
tverouden 3:9c63fc5f157e 267 break; // end case
tverouden 4:5ce2c8864908 268
tverouden 4:5ce2c8864908 269 // =============================== FAILING MODE ================================
tverouden 4:5ce2c8864908 270 case failing:
tverouden 4:5ce2c8864908 271 // ------------------------------ initialisation -------------------------------
tverouden 4:5ce2c8864908 272 if (changeState) { // when entering the state
tverouden 4:5ce2c8864908 273 pc.printf("[ERROR] entering failure mode\r\n"); // print current state
tverouden 4:5ce2c8864908 274 changeState = false; // stay in this state
tverouden 4:5ce2c8864908 275
tverouden 4:5ce2c8864908 276 // Actions when entering state
tverouden 4:5ce2c8864908 277
tverouden 4:5ce2c8864908 278 /* */
tverouden 4:5ce2c8864908 279
tverouden 4:5ce2c8864908 280 }
tverouden 4:5ce2c8864908 281 // ---------------------------------- action -----------------------------------
tverouden 4:5ce2c8864908 282 // Actions for each loop iteration
tverouden 4:5ce2c8864908 283 /* */
tverouden 4:5ce2c8864908 284
tverouden 4:5ce2c8864908 285 // -------------------------------- transition ---------------------------------
tverouden 4:5ce2c8864908 286 // Transition condition #1
tverouden 4:5ce2c8864908 287 if (1) {
tverouden 4:5ce2c8864908 288 // Actions when leaving state
tverouden 4:5ce2c8864908 289 currentState = failing; // change to state
tverouden 4:5ce2c8864908 290 changeState = true; // next loop, switch states
tverouden 4:5ce2c8864908 291 }
tverouden 4:5ce2c8864908 292 break; // end case
tverouden 4:5ce2c8864908 293
tverouden 4:5ce2c8864908 294 // ============================== DEFAULT MODE =================================
tverouden 3:9c63fc5f157e 295 default:
tverouden 4:5ce2c8864908 296 // ---------------------------- enter failing mode -----------------------------
tverouden 4:5ce2c8864908 297 currentState = failing; // change to state
tverouden 4:5ce2c8864908 298 changeState = true; // next loop, switch states
tverouden 4:5ce2c8864908 299 // print current state
tverouden 4:5ce2c8864908 300 pc.printf("[ERROR] unknown or unimplemented state reached\r\n");
tverouden 3:9c63fc5f157e 301
tverouden 4:5ce2c8864908 302 } // end switch
tverouden 4:5ce2c8864908 303 } // end stateMachine
tverouden 3:9c63fc5f157e 304
tverouden 3:9c63fc5f157e 305
tverouden 2:d70795e4e0bf 306
tverouden 2:d70795e4e0bf 307 // ≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡ MAIN LOOP ≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡
tverouden 2:d70795e4e0bf 308
tverouden 3:9c63fc5f157e 309 int main()
tverouden 3:9c63fc5f157e 310 {
tverouden 4:5ce2c8864908 311 MODSERIAL pc(USBTX, USBRX); // communication with pc
tverouden 4:5ce2c8864908 312
tverouden 2:d70795e4e0bf 313 // ==================================== LOOP ===================================
tverouden 2:d70795e4e0bf 314 while (true) { // loop forever
tverouden 2:d70795e4e0bf 315
tverouden 2:d70795e4e0bf 316 }
tverouden 2:d70795e4e0bf 317 }