Fa2018-es200-1121-project2-herndon-toss
/
herndon-threaded
Threaded version of Herndon cover toss
main.cpp@6:f76e93f043e2, 2018-11-05 (annotated)
- Committer:
- nhersom
- Date:
- Mon Nov 05 12:53:56 2018 +0000
- Revision:
- 6:f76e93f043e2
- Parent:
- 5:226dfa7d6308
Final code
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
evangeli | 0:047ab874a574 | 1 | /* |
evangeli | 0:047ab874a574 | 2 | ES200 1121 Project 2 Herndon Cover Toss - threaded version |
evangeli | 0:047ab874a574 | 3 | Get threaded! |
evangeli | 4:5ba96337741c | 4 | MIDN 3/c Roach, Duffey, Marasco, Zaharakis, Hersom |
evangeli | 0:047ab874a574 | 5 | */ |
evangeli | 0:047ab874a574 | 6 | |
evangeli | 4:5ba96337741c | 7 | #include "mbed.h" // note this code uses mbed OS 5 |
evangeli | 0:047ab874a574 | 8 | #include "rtos.h" |
evangeli | 0:047ab874a574 | 9 | #include "stdio.h" |
evangeli | 0:047ab874a574 | 10 | #include "Motor.h" |
evangeli | 0:047ab874a574 | 11 | #include "Servo.h" |
evangeli | 0:047ab874a574 | 12 | |
evangeli | 0:047ab874a574 | 13 | |
evangeli | 0:047ab874a574 | 14 | // Connections to hardware defined here |
evangeli | 0:047ab874a574 | 15 | Serial pc(USBTX,USBRX); // connection to laptop for debugging |
evangeli | 4:5ba96337741c | 16 | Motor launch_motor(p26, p30, p29); //launches the cover |
m215676 | 3:65416d9052dd | 17 | Servo herndon_servo(p23); //servo to move monument on turn table |
evangeli | 4:5ba96337741c | 18 | Servo traverse_servo(p22); //servo to adjust horizontal angle of arm |
m215676 | 3:65416d9052dd | 19 | DigitalIn herndon_sw1(p17); //moves herndon monument on turn table continuously while switch is on |
evangeli | 4:5ba96337741c | 20 | AnalogIn traverse_pot(p16); //turn dial to adjust servo for horizontal angle of arm SWITCH 2 |
evangeli | 4:5ba96337741c | 21 | DigitalIn launch_sw3(p18); //releases the cover when switch 3 is turned on |
evangeli | 4:5ba96337741c | 22 | DigitalIn recycle_sw4(p19); //retracts arm back to starting position to try again |
evangeli | 0:047ab874a574 | 23 | //DigitalIn sw1 (p16) ; not sure why this is here - maybe broken pin |
evangeli | 0:047ab874a574 | 24 | |
evangeli | 4:5ba96337741c | 25 | // You guys are supposed to include at least a few EXTERNAL leds. |
nhersom | 6:f76e93f043e2 | 26 | DigitalOut heartbeat_led(p5); // indicates heartbeat |
nhersom | 6:f76e93f043e2 | 27 | DigitalOut aiming_led(p6); // indicates aiming state |
nhersom | 6:f76e93f043e2 | 28 | DigitalOut firing_led(p7); // indicates firing |
nhersom | 6:f76e93f043e2 | 29 | DigitalOut recycle_led(p8); // indicates recycling |
evangeli | 0:047ab874a574 | 30 | |
m215676 | 5:226dfa7d6308 | 31 | |
evangeli | 0:047ab874a574 | 32 | |
evangeli | 0:047ab874a574 | 33 | // Herndon wiggling thread stuff |
evangeli | 0:047ab874a574 | 34 | Thread herndon_thread; // thread to run Herndon in |
evangeli | 0:047ab874a574 | 35 | void herndon_callback(void); // function for driving Herndon |
evangeli | 0:047ab874a574 | 36 | |
evangeli | 4:5ba96337741c | 37 | // Heartbeat indication thread |
evangeli | 4:5ba96337741c | 38 | Thread heartbeat_thread; // thread for heartbeat indication |
evangeli | 4:5ba96337741c | 39 | void heartbeat_callback(void); // function for heartbeat indication |
evangeli | 4:5ba96337741c | 40 | |
evangeli | 4:5ba96337741c | 41 | |
evangeli | 0:047ab874a574 | 42 | |
evangeli | 0:047ab874a574 | 43 | |
evangeli | 0:047ab874a574 | 44 | /* |
evangeli | 4:5ba96337741c | 45 | Thread herndon_thread runs a proces to make Herndon Monument move continuously, |
evangeli | 4:5ba96337741c | 46 | as controlled by DigitalIn herndon_sw1. |
evangeli | 4:5ba96337741c | 47 | |
evangeli | 4:5ba96337741c | 48 | Thread heartbeat_thread just blinks a light to know code is alive and running. |
evangeli | 0:047ab874a574 | 49 | |
evangeli | 4:5ba96337741c | 50 | The main() thread contains a loop that contains a state machine implementing the |
evangeli | 4:5ba96337741c | 51 | following states: |
evangeli | 4:5ba96337741c | 52 | 1. aiming state: use Servo traverse_servo to turn the cover launch mechanism to |
evangeli | 4:5ba96337741c | 53 | match position of AnalogIn traverse_pot |
evangeli | 4:5ba96337741c | 54 | |
evangeli | 4:5ba96337741c | 55 | 2. firing state, entered when launch_sw3 is high: use launch_motor to launch cover |
evangeli | 4:5ba96337741c | 56 | 3. recovery state, entered when recycle_sw4 is high: return back to battery |
evangeli | 4:5ba96337741c | 57 | Then goes back to aiming state. |
evangeli | 0:047ab874a574 | 58 | */ |
evangeli | 0:047ab874a574 | 59 | int main(void) |
evangeli | 0:047ab874a574 | 60 | { |
evangeli | 0:047ab874a574 | 61 | // setup stuff |
evangeli | 0:047ab874a574 | 62 | pc.printf("ES200 1121 Project 2 Group 3\r\n"); |
evangeli | 0:047ab874a574 | 63 | pc.printf("Herndon Cover Toss Game\r\n"); |
evangeli | 0:047ab874a574 | 64 | pc.printf("main() thread running\r\n"); |
evangeli | 0:047ab874a574 | 65 | herndon_servo.calibrate(0.0009, 90.0); // HiTec HS422 servo ES200/202 numbers |
evangeli | 4:5ba96337741c | 66 | traverse_servo.calibrate(0.0009, 90.0); // HiTec HS422 servo ES200/202 numbers |
evangeli | 4:5ba96337741c | 67 | launch_motor.speed(0.0); |
evangeli | 0:047ab874a574 | 68 | |
evangeli | 0:047ab874a574 | 69 | // start the Herndon thread |
evangeli | 0:047ab874a574 | 70 | herndon_thread.start(callback(herndon_callback)); |
evangeli | 4:5ba96337741c | 71 | |
evangeli | 4:5ba96337741c | 72 | |
evangeli | 4:5ba96337741c | 73 | // start the heartbeat thread |
evangeli | 4:5ba96337741c | 74 | heartbeat_thread.start(callback(heartbeat_callback)); |
evangeli | 4:5ba96337741c | 75 | |
evangeli | 0:047ab874a574 | 76 | |
evangeli | 4:5ba96337741c | 77 | // main loop for user interaction goes here |
evangeli | 4:5ba96337741c | 78 | while(1){ |
evangeli | 4:5ba96337741c | 79 | |
evangeli | 4:5ba96337741c | 80 | // aiming state |
evangeli | 4:5ba96337741c | 81 | pc.printf("main() entering aiming mode, turn dial to aim cover\r\n"); |
evangeli | 4:5ba96337741c | 82 | aiming_led.write(1); |
evangeli | 4:5ba96337741c | 83 | while(!launch_sw3.read()){ |
nhersom | 6:f76e93f043e2 | 84 | printf("traverse_pot.read()"); |
evangeli | 4:5ba96337741c | 85 | pc.printf("main() aiming, dial at %f, servo at %f\r\n",traverse_pot.read(),traverse_servo.read()); |
evangeli | 4:5ba96337741c | 86 | traverse_servo.write(traverse_pot.read()); |
nhersom | 6:f76e93f043e2 | 87 | |
evangeli | 4:5ba96337741c | 88 | ThisThread::sleep_for(200); |
evangeli | 4:5ba96337741c | 89 | } |
evangeli | 4:5ba96337741c | 90 | aiming_led.write(0); |
evangeli | 4:5ba96337741c | 91 | |
evangeli | 4:5ba96337741c | 92 | // firing state |
evangeli | 4:5ba96337741c | 93 | firing_led.write(1); |
evangeli | 4:5ba96337741c | 94 | pc.printf("main() thread entering cover launch sequence\r\n"); |
evangeli | 4:5ba96337741c | 95 | pc.printf("main() thread motor launch cover\r\n"); |
nhersom | 6:f76e93f043e2 | 96 | launch_motor.speed(-1.0); |
evangeli | 4:5ba96337741c | 97 | ThisThread::sleep_for(400); |
evangeli | 4:5ba96337741c | 98 | pc.printf("main() thread motor off\r\n"); |
evangeli | 4:5ba96337741c | 99 | launch_motor.speed(0.0); |
evangeli | 4:5ba96337741c | 100 | pc.printf("main() thread awaiting order to recycle\r\n"); |
evangeli | 4:5ba96337741c | 101 | firing_led.write(0); |
evangeli | 4:5ba96337741c | 102 | while(!recycle_sw4.read()){ |
m215676 | 5:226dfa7d6308 | 103 | |
evangeli | 4:5ba96337741c | 104 | ThisThread::sleep_for(200); |
evangeli | 4:5ba96337741c | 105 | } // wait for user to |
evangeli | 4:5ba96337741c | 106 | |
evangeli | 4:5ba96337741c | 107 | // recovery state |
evangeli | 4:5ba96337741c | 108 | recycle_led.write(1); |
evangeli | 4:5ba96337741c | 109 | pc.printf("main() thread recycling catapult back to battery\r\n"); |
evangeli | 4:5ba96337741c | 110 | pc.printf("main() thread motor reversing back to battery \r\n"); |
nhersom | 6:f76e93f043e2 | 111 | launch_motor.speed(0.25); |
evangeli | 4:5ba96337741c | 112 | ThisThread::sleep_for(600); |
evangeli | 4:5ba96337741c | 113 | pc.printf("main() thread motor off\r\n"); |
evangeli | 4:5ba96337741c | 114 | launch_motor.speed(0.0); |
evangeli | 4:5ba96337741c | 115 | ThisThread::sleep_for(1000); |
evangeli | 4:5ba96337741c | 116 | pc.printf("main() thread back in battery\r\n"); |
evangeli | 4:5ba96337741c | 117 | recycle_led.write(0); |
evangeli | 4:5ba96337741c | 118 | }// while(1) |
nhersom | 6:f76e93f043e2 | 119 | |
m215676 | 5:226dfa7d6308 | 120 | |
evangeli | 4:5ba96337741c | 121 | } // main() |
evangeli | 0:047ab874a574 | 122 | |
evangeli | 0:047ab874a574 | 123 | |
evangeli | 0:047ab874a574 | 124 | |
evangeli | 4:5ba96337741c | 125 | |
evangeli | 4:5ba96337741c | 126 | |
evangeli | 4:5ba96337741c | 127 | |
evangeli | 4:5ba96337741c | 128 | |
evangeli | 0:047ab874a574 | 129 | |
evangeli | 0:047ab874a574 | 130 | |
evangeli | 0:047ab874a574 | 131 | |
evangeli | 0:047ab874a574 | 132 | /** Callback for running Herndon wiggling thread as its own self-contained thing |
evangeli | 0:047ab874a574 | 133 | */ |
evangeli | 0:047ab874a574 | 134 | void herndon_callback(void) |
evangeli | 0:047ab874a574 | 135 | { |
evangeli | 4:5ba96337741c | 136 | // declare local variables |
evangeli | 0:047ab874a574 | 137 | float x=0.0; // current position of Herndon |
evangeli | 0:047ab874a574 | 138 | float xinc=0.1; // increment to move Herndon each time step |
evangeli | 0:047ab874a574 | 139 | |
evangeli | 4:5ba96337741c | 140 | // herndon_callback thread startup |
evangeli | 4:5ba96337741c | 141 | printf("herndon_thread running\r\n"); |
evangeli | 4:5ba96337741c | 142 | |
evangeli | 4:5ba96337741c | 143 | // herndon_thread loop here |
evangeli | 0:047ab874a574 | 144 | while(1) { |
evangeli | 0:047ab874a574 | 145 | if (herndon_sw1.read()) { |
evangeli | 4:5ba96337741c | 146 | x = x + xinc; // move |
evangeli | 0:047ab874a574 | 147 | if (x > 1.0) { |
evangeli | 0:047ab874a574 | 148 | x = 1.0; |
evangeli | 4:5ba96337741c | 149 | xinc = -0.1; // switch to moving left |
evangeli | 4:5ba96337741c | 150 | pc.printf("herndon_thread hit right end, now moving left\r\n"); |
nhersom | 6:f76e93f043e2 | 151 | |
evangeli | 0:047ab874a574 | 152 | } // hit the right end |
nhersom | 6:f76e93f043e2 | 153 | |
evangeli | 0:047ab874a574 | 154 | else if (x < 0.0) { |
evangeli | 0:047ab874a574 | 155 | x = 0.0; |
evangeli | 4:5ba96337741c | 156 | xinc = 0.1; // switch to moving right |
evangeli | 4:5ba96337741c | 157 | pc.printf("herndon_thread hit left end, now moving right\r\n"); |
evangeli | 0:047ab874a574 | 158 | } // hit the left end |
evangeli | 4:5ba96337741c | 159 | |
evangeli | 0:047ab874a574 | 160 | herndon_servo.write(x); |
evangeli | 4:5ba96337741c | 161 | pc.printf("herndon_thread herndon_servo at %f\r\n",x); |
evangeli | 0:047ab874a574 | 162 | } // s1 is on |
evangeli | 0:047ab874a574 | 163 | |
evangeli | 0:047ab874a574 | 164 | else { |
evangeli | 0:047ab874a574 | 165 | herndon_servo.write(0.0); |
evangeli | 4:5ba96337741c | 166 | pc.printf("herndon_thread herndon_servo at %f\r\n",x); |
evangeli | 4:5ba96337741c | 167 | |
evangeli | 4:5ba96337741c | 168 | |
evangeli | 0:047ab874a574 | 169 | } // s1 if off |
evangeli | 0:047ab874a574 | 170 | |
evangeli | 0:047ab874a574 | 171 | ThisThread::sleep_for(200); // change this number if too fast or too slow |
evangeli | 0:047ab874a574 | 172 | } // while(1) |
evangeli | 0:047ab874a574 | 173 | |
evangeli | 4:5ba96337741c | 174 | }// herndon_callback() |
evangeli | 4:5ba96337741c | 175 | |
evangeli | 4:5ba96337741c | 176 | |
evangeli | 4:5ba96337741c | 177 | /** Callback for heartbeat indication to indicate program is alive |
evangeli | 4:5ba96337741c | 178 | */ |
evangeli | 4:5ba96337741c | 179 | void heartbeat_callback(void) |
evangeli | 4:5ba96337741c | 180 | { |
evangeli | 4:5ba96337741c | 181 | // heartbeat_thread startup |
evangeli | 4:5ba96337741c | 182 | pc.printf("heartbeat_thread running\r\n"); |
evangeli | 4:5ba96337741c | 183 | |
evangeli | 4:5ba96337741c | 184 | // heartbeat_thread loop here |
evangeli | 4:5ba96337741c | 185 | while(1) { |
evangeli | 4:5ba96337741c | 186 | heartbeat_led = !heartbeat_led; |
evangeli | 4:5ba96337741c | 187 | ThisThread::sleep_for(500); |
evangeli | 4:5ba96337741c | 188 | } // while(1) |
evangeli | 4:5ba96337741c | 189 | } // heartbeat_callback() |