State machine with EMG functions and parameters

Dependencies:   biquadFilter FastPWM HIDScope MODSERIAL mbed

Fork of StateMachine by Tommie Verouden

Committer:
tverouden
Date:
Wed Oct 31 21:24:48 2018 +0000
Revision:
10:584b7d2c2d63
Parent:
9:8a162a3505ed
Child:
11:2d1dfebae948
Made a basis for LED state indication

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