Threaded version of ES200 1121 Team Dolphin Club sub code.

Dependencies:   Motor Servo

Committer:
evangeli
Date:
Mon Oct 22 15:24:51 2018 +0000
Revision:
2:c7591cd567c8
Parent:
0:cf9c71a62530
DE added torpedo, planes, and lights callback

Who changed what in which revision?

UserRevisionLine numberNew contents of line
evangeli 0:cf9c71a62530 1 /*
evangeli 0:cf9c71a62530 2 ES200 1121 Project 2 Dolphin Club
evangeli 0:cf9c71a62530 3 Run silent run deep.
evangeli 0:cf9c71a62530 4 MIDN 3/c Enger, Ewing, Hicks, Jordan
evangeli 0:cf9c71a62530 5 */
evangeli 0:cf9c71a62530 6
evangeli 0:cf9c71a62530 7 #include "mbed.h" // DE transitioned this to mbed OS 5 to do multitasking and threads
evangeli 0:cf9c71a62530 8 #include "rtos.h"
evangeli 0:cf9c71a62530 9
evangeli 0:cf9c71a62530 10 #include "stdio.h"
evangeli 0:cf9c71a62530 11 #include "Motor.h"
evangeli 0:cf9c71a62530 12 #include "Servo.h"
evangeli 0:cf9c71a62530 13
evangeli 0:cf9c71a62530 14 // Global hardware objects
evangeli 0:cf9c71a62530 15 Serial pc(USBTX,USBRX); // for talking back to computer
evangeli 0:cf9c71a62530 16
evangeli 0:cf9c71a62530 17 // inputs
evangeli 0:cf9c71a62530 18 DigitalIn prop_sw(p16); //switch to turn on the prop
evangeli 0:cf9c71a62530 19 DigitalIn torpedo_sw(p17); //switch to fire the torpedo
evangeli 0:cf9c71a62530 20 DigitalIn planes_sw(p18); //switch to tilt the fairwater planes
evangeli 0:cf9c71a62530 21 DigitalIn lights_sw(p19); //switch to turn on the running lights
evangeli 0:cf9c71a62530 22
evangeli 0:cf9c71a62530 23 // outputs
evangeli 0:cf9c71a62530 24 DigitalOut green(p6); // external green LED
evangeli 0:cf9c71a62530 25 DigitalOut red(p7); // external red LED
evangeli 0:cf9c71a62530 26 Motor prop_motor(p26,p30,p29); //motor variable
evangeli 0:cf9c71a62530 27 Servo torpedo_servo(p21); //torpedo servo
evangeli 0:cf9c71a62530 28 Servo planes_servo(p22); //planes servo
evangeli 0:cf9c71a62530 29
evangeli 0:cf9c71a62530 30 // other indicators
evangeli 2:c7591cd567c8 31 DigitalOut heartbeat(LED1);
evangeli 0:cf9c71a62530 32 DigitalOut prop_led(LED2);
evangeli 0:cf9c71a62530 33 DigitalOut torpedo_led(LED3);
evangeli 0:cf9c71a62530 34 DigitalOut planes_led(LED4);
evangeli 0:cf9c71a62530 35
evangeli 0:cf9c71a62530 36 // threads
evangeli 0:cf9c71a62530 37 Thread prop_thread;
evangeli 0:cf9c71a62530 38 Thread torpedo_thread;
evangeli 0:cf9c71a62530 39 Thread planes_thread;
evangeli 0:cf9c71a62530 40 Thread lights_thread;
evangeli 0:cf9c71a62530 41
evangeli 0:cf9c71a62530 42 // callback function prototypes
evangeli 0:cf9c71a62530 43 void prop_callback(void);
evangeli 0:cf9c71a62530 44 void torpedo_callback(void);
evangeli 0:cf9c71a62530 45 void planes_callback(void);
evangeli 0:cf9c71a62530 46 void lights_callback(void);
evangeli 0:cf9c71a62530 47
evangeli 0:cf9c71a62530 48
evangeli 0:cf9c71a62530 49
evangeli 0:cf9c71a62530 50
evangeli 0:cf9c71a62530 51
evangeli 0:cf9c71a62530 52
evangeli 2:c7591cd567c8 53 int main(void)
evangeli 2:c7591cd567c8 54 {
evangeli 2:c7591cd567c8 55 // setup
evangeli 2:c7591cd567c8 56 pc.printf("ES200 1121 Project 2 Team 2 Dolphin Club\r\n");
evangeli 2:c7591cd567c8 57 pc.printf("Submarines go deeper.\r\n");
evangeli 2:c7591cd567c8 58 pc.printf("main() thread running\r\n");
evangeli 0:cf9c71a62530 59
evangeli 2:c7591cd567c8 60 // start the other processes running too
evangeli 2:c7591cd567c8 61 prop_thread.start(callback(prop_callback));
evangeli 2:c7591cd567c8 62 torpedo_thread.start(callback(torpedo_callback));
evangeli 2:c7591cd567c8 63 planes_thread.start(callback(planes_callback));
evangeli 2:c7591cd567c8 64 lights_thread.start(callback(lights_callback));
evangeli 2:c7591cd567c8 65
evangeli 2:c7591cd567c8 66 pc.printf("main() entering heartbeat indication loop\r\n");
evangeli 2:c7591cd567c8 67 while(1) {
evangeli 2:c7591cd567c8 68 // blink heartbeat to show program is alive and running
evangeli 2:c7591cd567c8 69 heartbeat = !heartbeat;
evangeli 2:c7591cd567c8 70 ThisThread::sleep_for(500);
evangeli 0:cf9c71a62530 71 }
evangeli 2:c7591cd567c8 72 } // main()
evangeli 0:cf9c71a62530 73
evangeli 0:cf9c71a62530 74
evangeli 0:cf9c71a62530 75
evangeli 0:cf9c71a62530 76
evangeli 0:cf9c71a62530 77
evangeli 2:c7591cd567c8 78 /** Callback for running main propulsion thread
evangeli 2:c7591cd567c8 79 */
evangeli 0:cf9c71a62530 80 void prop_callback(void)
evangeli 0:cf9c71a62530 81 {
evangeli 2:c7591cd567c8 82 // setup
evangeli 0:cf9c71a62530 83 pc.printf("prop_thread standing by ready to answer bells on main engine\r\n");
evangeli 0:cf9c71a62530 84
evangeli 2:c7591cd567c8 85 // propulsion loop
evangeli 0:cf9c71a62530 86 while(1) {
evangeli 2:c7591cd567c8 87 pc.printf("prop_thread all stop\r\n");
evangeli 2:c7591cd567c8 88 prop_led.write(0);
evangeli 2:c7591cd567c8 89 prop_motor.speed(0.0);
evangeli 2:c7591cd567c8 90 while (!prop_sw.read()) {
evangeli 2:c7591cd567c8 91 ThisThread::sleep_for(200);
evangeli 2:c7591cd567c8 92 } // all stop
evangeli 2:c7591cd567c8 93
evangeli 2:c7591cd567c8 94 pc.printf("prop_thread all ahead flank\r\n");
evangeli 2:c7591cd567c8 95 prop_led.write(1);
evangeli 2:c7591cd567c8 96 prop_motor.speed(1.0);
evangeli 2:c7591cd567c8 97 while (prop_sw.read()) {
evangeli 2:c7591cd567c8 98 ThisThread::sleep_for(200);
evangeli 2:c7591cd567c8 99 } // all ahead flankn
evangeli 0:cf9c71a62530 100 } // while(1)
evangeli 0:cf9c71a62530 101 } // prop_callback()
evangeli 2:c7591cd567c8 102
evangeli 2:c7591cd567c8 103
evangeli 0:cf9c71a62530 104
evangeli 0:cf9c71a62530 105
evangeli 2:c7591cd567c8 106 /** Callback for running torpedo thread
evangeli 2:c7591cd567c8 107 */
evangeli 2:c7591cd567c8 108 void torpedo_callback(void)
evangeli 2:c7591cd567c8 109 {
evangeli 2:c7591cd567c8 110 // setup
evangeli 2:c7591cd567c8 111 pc.printf("torpedo_thread running\r\n");
evangeli 2:c7591cd567c8 112
evangeli 2:c7591cd567c8 113 // torpedo loop
evangeli 2:c7591cd567c8 114 while(1) {
evangeli 2:c7591cd567c8 115 pc.printf("torpedo_thread idle\r\n");
evangeli 2:c7591cd567c8 116 torpedo_led.write(0);
evangeli 2:c7591cd567c8 117 torpedo_servo.write(0.01);
evangeli 2:c7591cd567c8 118 while (!torpedo_sw.read()){
evangeli 2:c7591cd567c8 119 ThisThread::sleep_for(200);
evangeli 2:c7591cd567c8 120 } // torpedo awaiting shoot
evangeli 2:c7591cd567c8 121
evangeli 2:c7591cd567c8 122 torpedo_led.write(1);
evangeli 2:c7591cd567c8 123 pc.printf("torpedo_thread shoot tube 1, bearing 000\r\n");
evangeli 2:c7591cd567c8 124 ThisThread::sleep_for(1500);
evangeli 2:c7591cd567c8 125 torpedo_servo.write(0.5);
evangeli 2:c7591cd567c8 126 ThisThread::sleep_for(1000);
evangeli 2:c7591cd567c8 127 pc.printf("torpedo_thread reload\r\n");
evangeli 2:c7591cd567c8 128 torpedo_servo.write(0.0);
evangeli 2:c7591cd567c8 129 while (torpedo_sw.read()){
evangeli 2:c7591cd567c8 130 ThisThread::sleep_for(200);
evangeli 2:c7591cd567c8 131 } // torpedo awaiting return to idle
evangeli 2:c7591cd567c8 132 pc.printf("torpedo_thread returning to idle state\r\n");
evangeli 2:c7591cd567c8 133 } // while(1)
evangeli 2:c7591cd567c8 134 } // torpedo_callback()
evangeli 2:c7591cd567c8 135
evangeli 0:cf9c71a62530 136
evangeli 2:c7591cd567c8 137
evangeli 2:c7591cd567c8 138
evangeli 2:c7591cd567c8 139 /** Callback for running fairwater planes
evangeli 2:c7591cd567c8 140 */
evangeli 2:c7591cd567c8 141 void planes_callback(void)
evangeli 0:cf9c71a62530 142 {
evangeli 2:c7591cd567c8 143 // setup
evangeli 2:c7591cd567c8 144 pc.printf("planes_thread running\r\n");
evangeli 2:c7591cd567c8 145
evangeli 2:c7591cd567c8 146 // planes loop
evangeli 2:c7591cd567c8 147 while(1) {
evangeli 2:c7591cd567c8 148 pc.printf("planes_thread idle\r\n");
evangeli 2:c7591cd567c8 149 planes_led.write(0);
evangeli 2:c7591cd567c8 150 planes_servo.write(0.2);
evangeli 2:c7591cd567c8 151 while (!planes_sw.read()) {
evangeli 2:c7591cd567c8 152 ThisThread::sleep_for(200);
evangeli 2:c7591cd567c8 153 } // planes idle wait
evangeli 2:c7591cd567c8 154
evangeli 2:c7591cd567c8 155 planes_led.write(1);
evangeli 2:c7591cd567c8 156 pc.printf("plane_thread cycle the fairwater planes\r\n");
evangeli 2:c7591cd567c8 157 while (planes_sw.read()) {
evangeli 2:c7591cd567c8 158 planes_servo.write(0.2);
evangeli 2:c7591cd567c8 159 ThisThread::sleep_for(1000);
evangeli 2:c7591cd567c8 160 planes_servo.write(0.7);
evangeli 2:c7591cd567c8 161 ThisThread::sleep_for(1000);
evangeli 2:c7591cd567c8 162 } // planes cycling state
evangeli 2:c7591cd567c8 163 pc.printf("planes_thread secure cycling\r\n");
evangeli 2:c7591cd567c8 164 } // while(1)
evangeli 2:c7591cd567c8 165 } // planes_callback()
evangeli 2:c7591cd567c8 166
evangeli 2:c7591cd567c8 167
evangeli 2:c7591cd567c8 168
evangeli 2:c7591cd567c8 169
evangeli 2:c7591cd567c8 170 /** Callback for navigational running lights
evangeli 2:c7591cd567c8 171 */
evangeli 2:c7591cd567c8 172 void lights_callback(void)
evangeli 2:c7591cd567c8 173 {
evangeli 2:c7591cd567c8 174 // setup
evangeli 2:c7591cd567c8 175 pc.printf("lights_thread running\r\n");
evangeli 2:c7591cd567c8 176
evangeli 2:c7591cd567c8 177 // lights loop
evangeli 2:c7591cd567c8 178 while(1) {
evangeli 2:c7591cd567c8 179 pc.printf("ligths_thread running lights de-energized\r\n");
evangeli 2:c7591cd567c8 180 green.write(0);
evangeli 2:c7591cd567c8 181 red.write(0);
evangeli 2:c7591cd567c8 182 while (!lights_sw.read()) {
evangeli 2:c7591cd567c8 183 ThisThread::sleep_for(200);
evangeli 2:c7591cd567c8 184 } // lights idle wait
evangeli 2:c7591cd567c8 185
evangeli 2:c7591cd567c8 186 pc.printf("lights_thread running lights energized\r\n");
evangeli 2:c7591cd567c8 187 green.write(1);
evangeli 2:c7591cd567c8 188 red.write(1);
evangeli 2:c7591cd567c8 189 while (lights_sw.read()) {
evangeli 2:c7591cd567c8 190 ThisThread::sleep_for(200);
evangeli 2:c7591cd567c8 191 } // lights wait to turn off
evangeli 2:c7591cd567c8 192 } // while(1)
evangeli 2:c7591cd567c8 193 } // lights_callback()