Tommie Verouden / Mbed 2 deprecated StateMachine

Dependencies:   biquadFilter FastPWM MODSERIAL QEI mbed

Committer:
tverouden
Date:
Wed Oct 31 17:15:52 2018 +0000
Revision:
7:ef5966469621
Parent:
6:f32352bc5078
Child:
8:8cef1050ebd9
Comments besproken met Eva, deels ge?mplementeerd, nieuw plan bedacht

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 6:f32352bc5078 10 DigitalOut ledRed(LED_RED,1); // red LED K64F
tverouden 6:f32352bc5078 11 DigitalOut ledGreen(LED_GREEN,1); // green LED K64F
tverouden 6:f32352bc5078 12 DigitalOut ledBlue(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 7:ef5966469621 21 enum states { waiting, calibratingMotors, calibratingEMG,
tverouden 7:ef5966469621 22 homing, operating, reading, failing, demoing
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 6:f32352bc5078 30 // ============================ GENERAL FUNCTIONS =============================
tverouden 6:f32352bc5078 31 void stopProgram(void)
tverouden 6:f32352bc5078 32 {
tverouden 6:f32352bc5078 33 // Error message
tverouden 6:f32352bc5078 34 pc.printf("[ERROR] emergency button pressed\r\n");
tverouden 6:f32352bc5078 35 currentState = failing; // change to state
tverouden 6:f32352bc5078 36 changeState = true; // next loop, switch states
tverouden 6:f32352bc5078 37 }
tverouden 6:f32352bc5078 38 // ============================ MOTOR FUNCTIONS ==============================
tverouden 4:5ce2c8864908 39
tverouden 4:5ce2c8864908 40
tverouden 4:5ce2c8864908 41 // ============================= EMG FUNCTIONS ===============================
tverouden 4:5ce2c8864908 42
tverouden 4:5ce2c8864908 43
tverouden 2:d70795e4e0bf 44 // ≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡ STATE MACHINE ≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡
tverouden 7:ef5966469621 45 void stateMachine(void)
tverouden 3:9c63fc5f157e 46 {
tverouden 5:04b26b2f536a 47 switch (currentState) { // determine which state Odin is in // Van een aantal if statements moeten de conditions nog bepaald worden, niet vergeten
tverouden 3:9c63fc5f157e 48
tverouden 4:5ce2c8864908 49 // ============================== WAITING MODE ===============================
tverouden 3:9c63fc5f157e 50 case waiting:
tverouden 4:5ce2c8864908 51 // ------------------------ initialisation --------------------------
tverouden 4:5ce2c8864908 52 if (changeState) { // when entering the state
tverouden 4:5ce2c8864908 53 pc.printf("[MODE] waiting...\r\n");
tverouden 5:04b26b2f536a 54 // print current state
tverouden 4:5ce2c8864908 55 changeState = false; // stay in this state
tverouden 4:5ce2c8864908 56
tverouden 4:5ce2c8864908 57 // Actions when entering state
tverouden 4:5ce2c8864908 58 /* */
tverouden 4:5ce2c8864908 59
tverouden 4:5ce2c8864908 60 }
tverouden 4:5ce2c8864908 61 // ----------------------------- action ------------------------------
tverouden 4:5ce2c8864908 62 // Actions for each loop iteration
tverouden 4:5ce2c8864908 63 /* */
tverouden 4:5ce2c8864908 64
tverouden 4:5ce2c8864908 65 // --------------------------- transition ----------------------------
tverouden 4:5ce2c8864908 66 // Transition condition #1: with a button press, enter motor
tverouden 4:5ce2c8864908 67 // calibration mode
tverouden 4:5ce2c8864908 68 if (emergencybutton == true) { // Waarom drukken we op de noodknop om te beginnen? Lijkt me raar
tverouden 6:f32352bc5078 69 // Actions when leaving state // Is hier niet de resetknop voor bedoeld?
tverouden 4:5ce2c8864908 70 /* */
tverouden 5:04b26b2f536a 71
tverouden 4:5ce2c8864908 72 currentState = calibratingMotors; // change to state
tverouden 4:5ce2c8864908 73 changeState = true; // next loop, switch states
tverouden 4:5ce2c8864908 74 }
tverouden 4:5ce2c8864908 75 break; // end case
tverouden 4:5ce2c8864908 76
tverouden 4:5ce2c8864908 77 // ========================= MOTOR CALIBRATION MODE ==========================
tverouden 4:5ce2c8864908 78 case calibratingMotors:
tverouden 4:5ce2c8864908 79 // ------------------------- initialisation --------------------------
tverouden 4:5ce2c8864908 80 if (changeState) { // when entering the state
tverouden 4:5ce2c8864908 81 pc.printf("[MODE] calibrating motors...r\n");
tverouden 5:04b26b2f536a 82 // print current state
tverouden 4:5ce2c8864908 83 changeState = false; // stay in this state
tverouden 4:5ce2c8864908 84
tverouden 4:5ce2c8864908 85 // Actions when entering state
tverouden 4:5ce2c8864908 86 /* */
tverouden 4:5ce2c8864908 87
tverouden 4:5ce2c8864908 88 }
tverouden 4:5ce2c8864908 89 // ----------------------------- action ------------------------------
tverouden 5:04b26b2f536a 90 // Actions for each loop iteration
tverouden 5:04b26b2f536a 91 /* */
tverouden 4:5ce2c8864908 92
tverouden 4:5ce2c8864908 93 // --------------------------- transition ----------------------------
tverouden 4:5ce2c8864908 94 // 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 95 // velocities zero, start calibrating EMG-x // dat lijkt me niet de bedoeling
tverouden 7:ef5966469621 96 if (1) { // CONDITION
tverouden 5:04b26b2f536a 97 // Actions when leaving state
tverouden 4:5ce2c8864908 98 /* */
tverouden 5:04b26b2f536a 99
tverouden 7:ef5966469621 100 currentState = calibratingEMGx; // change to state
tverouden 4:5ce2c8864908 101 changeState = true; // next loop, switch states
tverouden 4:5ce2c8864908 102 }
tverouden 4:5ce2c8864908 103 break; // end case
tverouden 4:5ce2c8864908 104
tverouden 7:ef5966469621 105 // =========================== EMG CALIBRATION MODE ===========================
tverouden 7:ef5966469621 106 case calibratingEMG:
tverouden 4:5ce2c8864908 107 // ------------------------- initialisation --------------------------
tverouden 3:9c63fc5f157e 108 if (changeState) { // when entering the state
tverouden 4:5ce2c8864908 109 pc.printf("[MODE] calibrating EMG 1 (x-direction)...\r\n");
tverouden 5:04b26b2f536a 110 // print current state
tverouden 4:5ce2c8864908 111 changeState = false; // stay in this state
tverouden 4:5ce2c8864908 112
tverouden 4:5ce2c8864908 113 // Actions when entering state
tverouden 4:5ce2c8864908 114 /* */
tverouden 4:5ce2c8864908 115
tverouden 4:5ce2c8864908 116 }
tverouden 4:5ce2c8864908 117 // ----------------------------- action ------------------------------
tverouden 5:04b26b2f536a 118 // Actions for each loop iteration
tverouden 5:04b26b2f536a 119 /* */
tverouden 4:5ce2c8864908 120
tverouden 4:5ce2c8864908 121 // --------------------------- transition ----------------------------
tverouden 7:ef5966469621 122 // Transition condition #1: after 20 sec in state
tverouden 7:ef5966469621 123 if (1) { // CONDITION
tverouden 4:5ce2c8864908 124 // Actions when leaving state
tverouden 4:5ce2c8864908 125 /* */
tverouden 5:04b26b2f536a 126
tverouden 4:5ce2c8864908 127 currentState = homing; // change to state
tverouden 4:5ce2c8864908 128 changeState = true; // next loop, switch states
tverouden 5:04b26b2f536a 129 }
tverouden 5:04b26b2f536a 130 break; // end case
tverouden 4:5ce2c8864908 131
tverouden 4:5ce2c8864908 132 // ============================== HOMING MODE ================================
tverouden 4:5ce2c8864908 133 case homing:
tverouden 7:ef5966469621 134 // ------------------------- initialisation -------------------------- // Evt. ook checken op snelheid als mensen zo dom zijn om tijdens homing op random knopjes te drukken
tverouden 4:5ce2c8864908 135 if (changeState) { // when entering the state
tverouden 4:5ce2c8864908 136 pc.printf("[MODE] homing...\r\n");
tverouden 5:04b26b2f536a 137 // print current state
tverouden 4:5ce2c8864908 138 changeState = false; // stay in this state
tverouden 4:5ce2c8864908 139
tverouden 4:5ce2c8864908 140
tverouden 4:5ce2c8864908 141 // Actions when entering state
tverouden 4:5ce2c8864908 142 /* */
tverouden 4:5ce2c8864908 143
tverouden 4:5ce2c8864908 144 }
tverouden 4:5ce2c8864908 145 // ----------------------------- action ------------------------------
tverouden 5:04b26b2f536a 146 // Actions for each loop iteration
tverouden 5:04b26b2f536a 147 /* */
tverouden 4:5ce2c8864908 148
tverouden 7:ef5966469621 149 // --------------------------- transition ---------------------------- // Volgorde veranderen voor logica?
tverouden 4:5ce2c8864908 150 // Transition condition #1: with button press, enter demo mode
tverouden 4:5ce2c8864908 151 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 152 // Actions when leaving state
tverouden 4:5ce2c8864908 153 /* */
tverouden 5:04b26b2f536a 154
tverouden 4:5ce2c8864908 155 currentState = demoing; // change to state
tverouden 4:5ce2c8864908 156 changeState = true; // next loop, switch states
tverouden 4:5ce2c8864908 157 }
tverouden 4:5ce2c8864908 158 // Transition condition #2: with button press, enter operation mode
tverouden 4:5ce2c8864908 159 if (buttonBio2 == true) {
tverouden 4:5ce2c8864908 160 // Actions when leaving state
tverouden 4:5ce2c8864908 161 /* */
tverouden 5:04b26b2f536a 162
tverouden 4:5ce2c8864908 163 currentState = operating; // change to state
tverouden 4:5ce2c8864908 164 changeState = true; // next loop, switch states
tverouden 5:04b26b2f536a 165 }
tverouden 4:5ce2c8864908 166 break; // end case
tverouden 4:5ce2c8864908 167
tverouden 4:5ce2c8864908 168 // ============================= OPERATING MODE ==============================
tverouden 4:5ce2c8864908 169 case operating:
tverouden 4:5ce2c8864908 170 // ------------------------- initialisation --------------------------
tverouden 4:5ce2c8864908 171 if (changeState) { // when entering the state
tverouden 4:5ce2c8864908 172 pc.printf("[MODE] operating...\r\n");
tverouden 5:04b26b2f536a 173 // print current state
tverouden 5:04b26b2f536a 174 changeState = false; // stay in this state
tverouden 5:04b26b2f536a 175
tverouden 5:04b26b2f536a 176 // Actions when entering state
tverouden 5:04b26b2f536a 177 /* */
tverouden 5:04b26b2f536a 178
tverouden 5:04b26b2f536a 179 }
tverouden 5:04b26b2f536a 180 // ----------------------------- action ------------------------------
tverouden 5:04b26b2f536a 181 // Actions for each loop iteration
tverouden 5:04b26b2f536a 182 /* */
tverouden 5:04b26b2f536a 183
tverouden 5:04b26b2f536a 184 // --------------------------- transition ----------------------------
tverouden 7:ef5966469621 185 // Transition condition #1: with button press, back to homing mode // Is het nodig om vanuit operating mode naar homing mode terug te kunnen gaan? -> ja, voor als je een demo wilt starten
tverouden 5:04b26b2f536a 186 if (buttonBio2 == true) {
tverouden 5:04b26b2f536a 187 // Actions when leaving state
tverouden 5:04b26b2f536a 188 /* */
tverouden 5:04b26b2f536a 189
tverouden 5:04b26b2f536a 190 currentState = homing; // change to state
tverouden 5:04b26b2f536a 191 changeState = true; // next loop, switch states
tverouden 5:04b26b2f536a 192 }
tverouden 7:ef5966469621 193 // Transition condition #2: motor angle error < certain value,
tverouden 7:ef5966469621 194 // start reading
tverouden 7:ef5966469621 195 if (1) { // CONDITION
tverouden 5:04b26b2f536a 196 // Actions when leaving state
tverouden 5:04b26b2f536a 197 /* */
tverouden 5:04b26b2f536a 198
tverouden 5:04b26b2f536a 199 currentState = homing; // change to state
tverouden 5:04b26b2f536a 200 changeState = true; // next loop, switch states
tverouden 5:04b26b2f536a 201 }
tverouden 5:04b26b2f536a 202 break; // end case
tverouden 5:04b26b2f536a 203
tverouden 7:ef5966469621 204 // ============================== READING MODE =============================== // Beweegt deze modus zowel heen als weer en zo ja, hoe bepaalt hij wat moet gebeuren?
tverouden 7:ef5966469621 205 case reading:
tverouden 5:04b26b2f536a 206 // ------------------------- initialisation --------------------------
tverouden 5:04b26b2f536a 207 if (changeState) { // when entering the state
tverouden 7:ef5966469621 208 pc.printf("[MODE] reading...\r\n");
tverouden 5:04b26b2f536a 209 // print current state
tverouden 5:04b26b2f536a 210 changeState = false; // stay in this state
tverouden 5:04b26b2f536a 211
tverouden 5:04b26b2f536a 212 // Actions when entering state
tverouden 5:04b26b2f536a 213 /* */
tverouden 5:04b26b2f536a 214
tverouden 5:04b26b2f536a 215 }
tverouden 5:04b26b2f536a 216 // ----------------------------- action ------------------------------
tverouden 5:04b26b2f536a 217 // Actions for each loop iteration
tverouden 5:04b26b2f536a 218 /* */
tverouden 5:04b26b2f536a 219
tverouden 5:04b26b2f536a 220 // --------------------------- transition ----------------------------
tverouden 7:ef5966469621 221 // Transition condition #1: with button press, back to homing mode // Hier automatisch terug naar operating mode!
tverouden 5:04b26b2f536a 222 if (1) { // En hij gaat nu terug naar homing mode, maar dan moet je dus elke keer weer kiezen voor demo of operation mode?
tverouden 7:ef5966469621 223 // Actions when leaving state // CONDITION
tverouden 5:04b26b2f536a 224 /* */
tverouden 5:04b26b2f536a 225
tverouden 5:04b26b2f536a 226 currentState = homing; // change to state
tverouden 5:04b26b2f536a 227 changeState = true; // next loop, switch states
tverouden 5:04b26b2f536a 228 }
tverouden 5:04b26b2f536a 229 break; // end case
tverouden 5:04b26b2f536a 230
tverouden 5:04b26b2f536a 231 // ============================== DEMOING MODE ===============================
tverouden 5:04b26b2f536a 232 case demoing:
tverouden 5:04b26b2f536a 233 // ------------------------- initialisation --------------------------
tverouden 5:04b26b2f536a 234 if (changeState) { // when entering the state
tverouden 5:04b26b2f536a 235 pc.printf("[MODE] demoing...\r\n");
tverouden 5:04b26b2f536a 236 // print current state
tverouden 5:04b26b2f536a 237 changeState = false; // stay in this state
tverouden 5:04b26b2f536a 238
tverouden 5:04b26b2f536a 239 // Actions when entering state
tverouden 5:04b26b2f536a 240 /* */
tverouden 5:04b26b2f536a 241
tverouden 5:04b26b2f536a 242 }
tverouden 5:04b26b2f536a 243 // ----------------------------- action ------------------------------
tverouden 5:04b26b2f536a 244 // Actions for each loop iteration
tverouden 5:04b26b2f536a 245 /* */
tverouden 5:04b26b2f536a 246
tverouden 5:04b26b2f536a 247 // --------------------------- transition ----------------------------
tverouden 5:04b26b2f536a 248 // Transition condition #1: with button press, back to homing mode
tverouden 5:04b26b2f536a 249 if (1) {
tverouden 5:04b26b2f536a 250 // Actions when leaving state
tverouden 5:04b26b2f536a 251 /* */
tverouden 5:04b26b2f536a 252
tverouden 5:04b26b2f536a 253 currentState = homing; // change to state
tverouden 5:04b26b2f536a 254 changeState = true; // next loop, switch states
tverouden 5:04b26b2f536a 255 }
tverouden 7:ef5966469621 256 // Transition condition #2: after 3 sec relaxation, start reading // In 3 seconden zijn de bladzijden uit zichzelf alweer helemaal teruggegaan. Misschien dit gewoon doen na het voorgedefinieerde pad
tverouden 5:04b26b2f536a 257 if (1) {
tverouden 5:04b26b2f536a 258 // Actions when leaving state
tverouden 5:04b26b2f536a 259 /* */
tverouden 5:04b26b2f536a 260
tverouden 7:ef5966469621 261 currentState = reading; // change to state
tverouden 5:04b26b2f536a 262 changeState = true; // next loop, switch states
tverouden 5:04b26b2f536a 263 }
tverouden 5:04b26b2f536a 264 break; // end case
tverouden 5:04b26b2f536a 265
tverouden 5:04b26b2f536a 266 // =============================== FAILING MODE ================================
tverouden 5:04b26b2f536a 267 case failing:
tverouden 5:04b26b2f536a 268 // ------------------------- initialisation --------------------------
tverouden 5:04b26b2f536a 269 if (changeState) { // when entering the state
tverouden 5:04b26b2f536a 270 pc.printf("[ERROR] entering failure mode\r\n");
tverouden 7:ef5966469621 271 // print current state
tverouden 3:9c63fc5f157e 272 changeState = false; // stay in this state
tverouden 3:9c63fc5f157e 273
tverouden 3:9c63fc5f157e 274 // Actions when entering state
tverouden 7:ef5966469621 275 ledGreen = 1; // red LED on // Blijft dit aan?
tverouden 6:f32352bc5078 276 ledBlue = 1;
tverouden 6:f32352bc5078 277 ledRed = 0;
tverouden 4:5ce2c8864908 278
tverouden 6:f32352bc5078 279 // pin3 = 0; // all motor forces to zero // Pins nog niet gedefiniëerd
tverouden 6:f32352bc5078 280 // pin5 = 0;
tverouden 6:f32352bc5078 281 // pin6 = 0;
tverouden 6:f32352bc5078 282 exit (0); // abort mission
tverouden 4:5ce2c8864908 283 }
tverouden 4:5ce2c8864908 284 break; // end case
tverouden 4:5ce2c8864908 285
tverouden 4:5ce2c8864908 286 // ============================== DEFAULT MODE =================================
tverouden 3:9c63fc5f157e 287 default:
tverouden 4:5ce2c8864908 288 // ---------------------------- enter failing mode -----------------------------
tverouden 4:5ce2c8864908 289 currentState = failing; // change to state
tverouden 4:5ce2c8864908 290 changeState = true; // next loop, switch states
tverouden 4:5ce2c8864908 291 // print current state
tverouden 4:5ce2c8864908 292 pc.printf("[ERROR] unknown or unimplemented state reached\r\n");
tverouden 3:9c63fc5f157e 293
tverouden 4:5ce2c8864908 294 } // end switch
tverouden 4:5ce2c8864908 295 } // end stateMachine
tverouden 3:9c63fc5f157e 296
tverouden 3:9c63fc5f157e 297
tverouden 2:d70795e4e0bf 298
tverouden 2:d70795e4e0bf 299 // ≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡ MAIN LOOP ≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡
tverouden 2:d70795e4e0bf 300
tverouden 3:9c63fc5f157e 301 int main()
tverouden 3:9c63fc5f157e 302 {
tverouden 6:f32352bc5078 303 // ================================ EMERGENCY ================================ // Dit hoeft dus niet in de while loop?
tverouden 7:ef5966469621 304 //If the emergency button is pressed, stop program via failing state
tverouden 7:ef5966469621 305 emergencybutton.rise(stopProgram); // Automatische triggers voor failure mode?
tverouden 6:f32352bc5078 306
tverouden 2:d70795e4e0bf 307 // ==================================== LOOP ===================================
tverouden 2:d70795e4e0bf 308 while (true) { // loop forever
tverouden 2:d70795e4e0bf 309
tverouden 2:d70795e4e0bf 310 }
tverouden 2:d70795e4e0bf 311 }