Fa2018-es200-1121-project2-herndon-toss
/
herndon-threaded
Threaded version of Herndon cover toss
main.cpp@5:226dfa7d6308, 2018-10-23 (annotated)
- Committer:
- m215676
- Date:
- Tue Oct 23 01:00:41 2018 +0000
- Revision:
- 5:226dfa7d6308
- Parent:
- 4:5ba96337741c
- Child:
- 6:f76e93f043e2
added LEDs
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. |
evangeli | 4:5ba96337741c | 26 | DigitalOut heartbeat_led(LED1); // indicates heartbeat |
evangeli | 4:5ba96337741c | 27 | DigitalOut aiming_led(LED2); // indicates aiming state |
evangeli | 4:5ba96337741c | 28 | DigitalOut firing_led(LED3); // indicates firing |
evangeli | 4:5ba96337741c | 29 | DigitalOut recycle_led(LED4); // indicates recycling |
evangeli | 0:047ab874a574 | 30 | |
m215676 | 5:226dfa7d6308 | 31 | DigitalOut LEDs[5]={p25, p26, p27, p28, p29}; // possible LEDs that can be lit |
m215676 | 5:226dfa7d6308 | 32 | |
evangeli | 0:047ab874a574 | 33 | |
evangeli | 0:047ab874a574 | 34 | // Herndon wiggling thread stuff |
evangeli | 0:047ab874a574 | 35 | Thread herndon_thread; // thread to run Herndon in |
evangeli | 0:047ab874a574 | 36 | void herndon_callback(void); // function for driving Herndon |
evangeli | 0:047ab874a574 | 37 | |
evangeli | 4:5ba96337741c | 38 | // Heartbeat indication thread |
evangeli | 4:5ba96337741c | 39 | Thread heartbeat_thread; // thread for heartbeat indication |
evangeli | 4:5ba96337741c | 40 | void heartbeat_callback(void); // function for heartbeat indication |
evangeli | 4:5ba96337741c | 41 | |
evangeli | 4:5ba96337741c | 42 | |
evangeli | 0:047ab874a574 | 43 | |
evangeli | 0:047ab874a574 | 44 | |
evangeli | 0:047ab874a574 | 45 | /* |
evangeli | 4:5ba96337741c | 46 | Thread herndon_thread runs a proces to make Herndon Monument move continuously, |
evangeli | 4:5ba96337741c | 47 | as controlled by DigitalIn herndon_sw1. |
evangeli | 4:5ba96337741c | 48 | |
evangeli | 4:5ba96337741c | 49 | Thread heartbeat_thread just blinks a light to know code is alive and running. |
evangeli | 0:047ab874a574 | 50 | |
evangeli | 4:5ba96337741c | 51 | The main() thread contains a loop that contains a state machine implementing the |
evangeli | 4:5ba96337741c | 52 | following states: |
evangeli | 4:5ba96337741c | 53 | 1. aiming state: use Servo traverse_servo to turn the cover launch mechanism to |
evangeli | 4:5ba96337741c | 54 | match position of AnalogIn traverse_pot |
evangeli | 4:5ba96337741c | 55 | |
evangeli | 4:5ba96337741c | 56 | 2. firing state, entered when launch_sw3 is high: use launch_motor to launch cover |
evangeli | 4:5ba96337741c | 57 | 3. recovery state, entered when recycle_sw4 is high: return back to battery |
evangeli | 4:5ba96337741c | 58 | Then goes back to aiming state. |
evangeli | 0:047ab874a574 | 59 | */ |
evangeli | 0:047ab874a574 | 60 | int main(void) |
evangeli | 0:047ab874a574 | 61 | { |
evangeli | 0:047ab874a574 | 62 | // setup stuff |
evangeli | 0:047ab874a574 | 63 | pc.printf("ES200 1121 Project 2 Group 3\r\n"); |
evangeli | 0:047ab874a574 | 64 | pc.printf("Herndon Cover Toss Game\r\n"); |
evangeli | 0:047ab874a574 | 65 | pc.printf("main() thread running\r\n"); |
evangeli | 0:047ab874a574 | 66 | herndon_servo.calibrate(0.0009, 90.0); // HiTec HS422 servo ES200/202 numbers |
evangeli | 4:5ba96337741c | 67 | traverse_servo.calibrate(0.0009, 90.0); // HiTec HS422 servo ES200/202 numbers |
evangeli | 4:5ba96337741c | 68 | launch_motor.speed(0.0); |
evangeli | 0:047ab874a574 | 69 | |
evangeli | 0:047ab874a574 | 70 | // start the Herndon thread |
evangeli | 0:047ab874a574 | 71 | herndon_thread.start(callback(herndon_callback)); |
evangeli | 4:5ba96337741c | 72 | |
evangeli | 4:5ba96337741c | 73 | |
evangeli | 4:5ba96337741c | 74 | // start the heartbeat thread |
evangeli | 4:5ba96337741c | 75 | heartbeat_thread.start(callback(heartbeat_callback)); |
evangeli | 4:5ba96337741c | 76 | |
evangeli | 0:047ab874a574 | 77 | |
evangeli | 4:5ba96337741c | 78 | // main loop for user interaction goes here |
evangeli | 4:5ba96337741c | 79 | while(1){ |
evangeli | 4:5ba96337741c | 80 | |
evangeli | 4:5ba96337741c | 81 | // aiming state |
evangeli | 4:5ba96337741c | 82 | pc.printf("main() entering aiming mode, turn dial to aim cover\r\n"); |
evangeli | 4:5ba96337741c | 83 | aiming_led.write(1); |
evangeli | 4:5ba96337741c | 84 | while(!launch_sw3.read()){ |
m215676 | 5:226dfa7d6308 | 85 | LEDs[0] = 1; |
evangeli | 4:5ba96337741c | 86 | pc.printf("main() aiming, dial at %f, servo at %f\r\n",traverse_pot.read(),traverse_servo.read()); |
evangeli | 4:5ba96337741c | 87 | traverse_servo.write(traverse_pot.read()); |
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); |
m215676 | 5:226dfa7d6308 | 94 | LEDs[1] = 1; |
evangeli | 4:5ba96337741c | 95 | pc.printf("main() thread entering cover launch sequence\r\n"); |
evangeli | 4:5ba96337741c | 96 | pc.printf("main() thread motor launch cover\r\n"); |
evangeli | 4:5ba96337741c | 97 | launch_motor.speed(1.0); |
evangeli | 4:5ba96337741c | 98 | ThisThread::sleep_for(400); |
evangeli | 4:5ba96337741c | 99 | pc.printf("main() thread motor off\r\n"); |
evangeli | 4:5ba96337741c | 100 | launch_motor.speed(0.0); |
evangeli | 4:5ba96337741c | 101 | pc.printf("main() thread awaiting order to recycle\r\n"); |
evangeli | 4:5ba96337741c | 102 | firing_led.write(0); |
evangeli | 4:5ba96337741c | 103 | while(!recycle_sw4.read()){ |
m215676 | 5:226dfa7d6308 | 104 | |
evangeli | 4:5ba96337741c | 105 | ThisThread::sleep_for(200); |
evangeli | 4:5ba96337741c | 106 | } // wait for user to |
evangeli | 4:5ba96337741c | 107 | |
evangeli | 4:5ba96337741c | 108 | // recovery state |
evangeli | 4:5ba96337741c | 109 | recycle_led.write(1); |
m215676 | 5:226dfa7d6308 | 110 | LEDs[3] = 1; |
evangeli | 4:5ba96337741c | 111 | pc.printf("main() thread recycling catapult back to battery\r\n"); |
evangeli | 4:5ba96337741c | 112 | pc.printf("main() thread motor reversing back to battery \r\n"); |
evangeli | 4:5ba96337741c | 113 | launch_motor.speed(-0.25); |
evangeli | 4:5ba96337741c | 114 | ThisThread::sleep_for(600); |
evangeli | 4:5ba96337741c | 115 | pc.printf("main() thread motor off\r\n"); |
evangeli | 4:5ba96337741c | 116 | launch_motor.speed(0.0); |
evangeli | 4:5ba96337741c | 117 | ThisThread::sleep_for(1000); |
evangeli | 4:5ba96337741c | 118 | pc.printf("main() thread back in battery\r\n"); |
evangeli | 4:5ba96337741c | 119 | recycle_led.write(0); |
evangeli | 4:5ba96337741c | 120 | |
evangeli | 4:5ba96337741c | 121 | }// while(1) |
m215676 | 5:226dfa7d6308 | 122 | LEDs[0] = 0; |
m215676 | 5:226dfa7d6308 | 123 | LEDs[1] = 0; |
m215676 | 5:226dfa7d6308 | 124 | LEDs[2] = 0; |
m215676 | 5:226dfa7d6308 | 125 | LEDs[3] = 0; |
m215676 | 5:226dfa7d6308 | 126 | LEDs[4] = 0; |
m215676 | 5:226dfa7d6308 | 127 | |
evangeli | 4:5ba96337741c | 128 | } // main() |
evangeli | 0:047ab874a574 | 129 | |
evangeli | 0:047ab874a574 | 130 | |
evangeli | 0:047ab874a574 | 131 | |
evangeli | 4:5ba96337741c | 132 | |
evangeli | 4:5ba96337741c | 133 | |
evangeli | 4:5ba96337741c | 134 | |
evangeli | 4:5ba96337741c | 135 | |
evangeli | 0:047ab874a574 | 136 | |
evangeli | 0:047ab874a574 | 137 | |
evangeli | 0:047ab874a574 | 138 | |
evangeli | 0:047ab874a574 | 139 | /** Callback for running Herndon wiggling thread as its own self-contained thing |
evangeli | 0:047ab874a574 | 140 | */ |
evangeli | 0:047ab874a574 | 141 | void herndon_callback(void) |
evangeli | 0:047ab874a574 | 142 | { |
evangeli | 4:5ba96337741c | 143 | // declare local variables |
evangeli | 0:047ab874a574 | 144 | float x=0.0; // current position of Herndon |
evangeli | 0:047ab874a574 | 145 | float xinc=0.1; // increment to move Herndon each time step |
evangeli | 0:047ab874a574 | 146 | |
evangeli | 4:5ba96337741c | 147 | // herndon_callback thread startup |
evangeli | 4:5ba96337741c | 148 | printf("herndon_thread running\r\n"); |
evangeli | 4:5ba96337741c | 149 | |
evangeli | 4:5ba96337741c | 150 | // herndon_thread loop here |
evangeli | 0:047ab874a574 | 151 | while(1) { |
evangeli | 0:047ab874a574 | 152 | if (herndon_sw1.read()) { |
evangeli | 4:5ba96337741c | 153 | x = x + xinc; // move |
evangeli | 0:047ab874a574 | 154 | if (x > 1.0) { |
evangeli | 0:047ab874a574 | 155 | x = 1.0; |
evangeli | 4:5ba96337741c | 156 | xinc = -0.1; // switch to moving left |
evangeli | 4:5ba96337741c | 157 | pc.printf("herndon_thread hit right end, now moving left\r\n"); |
evangeli | 0:047ab874a574 | 158 | } // hit the right end |
m215676 | 5:226dfa7d6308 | 159 | LEDs[4] = 1; |
evangeli | 0:047ab874a574 | 160 | else if (x < 0.0) { |
evangeli | 0:047ab874a574 | 161 | x = 0.0; |
evangeli | 4:5ba96337741c | 162 | xinc = 0.1; // switch to moving right |
evangeli | 4:5ba96337741c | 163 | pc.printf("herndon_thread hit left end, now moving right\r\n"); |
evangeli | 0:047ab874a574 | 164 | } // hit the left end |
evangeli | 4:5ba96337741c | 165 | |
evangeli | 0:047ab874a574 | 166 | herndon_servo.write(x); |
evangeli | 4:5ba96337741c | 167 | pc.printf("herndon_thread herndon_servo at %f\r\n",x); |
evangeli | 0:047ab874a574 | 168 | } // s1 is on |
evangeli | 0:047ab874a574 | 169 | |
evangeli | 0:047ab874a574 | 170 | else { |
evangeli | 0:047ab874a574 | 171 | herndon_servo.write(0.0); |
evangeli | 4:5ba96337741c | 172 | pc.printf("herndon_thread herndon_servo at %f\r\n",x); |
evangeli | 4:5ba96337741c | 173 | |
evangeli | 4:5ba96337741c | 174 | |
evangeli | 0:047ab874a574 | 175 | } // s1 if off |
evangeli | 0:047ab874a574 | 176 | |
evangeli | 0:047ab874a574 | 177 | ThisThread::sleep_for(200); // change this number if too fast or too slow |
evangeli | 0:047ab874a574 | 178 | } // while(1) |
evangeli | 0:047ab874a574 | 179 | |
evangeli | 4:5ba96337741c | 180 | }// herndon_callback() |
evangeli | 4:5ba96337741c | 181 | |
evangeli | 4:5ba96337741c | 182 | |
evangeli | 4:5ba96337741c | 183 | /** Callback for heartbeat indication to indicate program is alive |
evangeli | 4:5ba96337741c | 184 | */ |
evangeli | 4:5ba96337741c | 185 | void heartbeat_callback(void) |
evangeli | 4:5ba96337741c | 186 | { |
evangeli | 4:5ba96337741c | 187 | // heartbeat_thread startup |
evangeli | 4:5ba96337741c | 188 | pc.printf("heartbeat_thread running\r\n"); |
evangeli | 4:5ba96337741c | 189 | |
evangeli | 4:5ba96337741c | 190 | // heartbeat_thread loop here |
evangeli | 4:5ba96337741c | 191 | while(1) { |
m215676 | 5:226dfa7d6308 | 192 | LEDs[2] = 1; |
evangeli | 4:5ba96337741c | 193 | heartbeat_led = !heartbeat_led; |
evangeli | 4:5ba96337741c | 194 | ThisThread::sleep_for(500); |
evangeli | 4:5ba96337741c | 195 | } // while(1) |
evangeli | 4:5ba96337741c | 196 | } // heartbeat_callback() |