Tommie Verouden / Mbed 2 deprecated StateMachine

Dependencies:   biquadFilter FastPWM MODSERIAL QEI mbed

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