Example of using threads to run different actions happening at the same time.

Dependencies:   Motor Servo

Fork of Fa2018-es200-1121-3321-thread-example by Fa2018-es200-1121-project2-herndon-toss

Committer:
m214962
Date:
Tue Oct 23 13:29:33 2018 +0000
Revision:
8:990a1c27a5da
Parent:
7:b7257f01ced7
Final Project2 code. Works with 2 separate switches. Other switches change leds.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
evangeli 0:ed939452cce3 1 /*
m214962 7:b7257f01ced7 2 ES200 Project 2 thread use
m214962 7:b7257f01ced7 3 Rock em Sock em 2018
evangeli 2:2710cfd7bc6a 4 Note that this uses mbed OS 5 vice OS 2.
evangeli 0:ed939452cce3 5 */
evangeli 0:ed939452cce3 6
evangeli 0:ed939452cce3 7 #include "mbed.h"
evangeli 0:ed939452cce3 8 #include "rtos.h"
evangeli 0:ed939452cce3 9 #include "stdio.h"
evangeli 0:ed939452cce3 10 #include "Motor.h"
evangeli 0:ed939452cce3 11 #include "Servo.h"
evangeli 0:ed939452cce3 12
evangeli 0:ed939452cce3 13 // Declare some stuff
m214962 8:990a1c27a5da 14 DigitalIn sw1(p17); // switch for activating led5
m214962 6:ed7539be9fa3 15 DigitalIn sw2(p16); // switch for activating servo
m214962 7:b7257f01ced7 16 DigitalIn sw3(p20); // switch for activating servo2
m214962 8:990a1c27a5da 17 DigitalIn sw4(p19); // switch for led4
m214962 8:990a1c27a5da 18 DigitalOut led1(p5); // status LED for motor
m214962 8:990a1c27a5da 19 DigitalOut led2(p6); // status LED for sw2
m214962 8:990a1c27a5da 20 DigitalOut led3(p7); // status LED for sw3
m214962 8:990a1c27a5da 21 DigitalOut led4(p8); // status LED for sw4
m214962 8:990a1c27a5da 22 DigitalOut led5(p11); //status LED for sw1
m214962 7:b7257f01ced7 23 DigitalOut heartbeat(LED4); // heartbeat LED adds visual effects
evangeli 0:ed939452cce3 24 Motor m(p26,p30,p29);
evangeli 0:ed939452cce3 25 Servo s1(p21);
m214962 6:ed7539be9fa3 26 Servo s2(p22);
evangeli 0:ed939452cce3 27 Thread m_thread; // NEW IN mbed OS 5, threads are used to (sorta) do multiple things at once
m214962 7:b7257f01ced7 28 Thread s1_thread; //creates thread for servo
m214962 7:b7257f01ced7 29 Thread s2_thread; // creates thread for servo2
evangeli 0:ed939452cce3 30
evangeli 5:0c7c692db414 31 /** Callback for executing a simple motor action. When sw1 is high,
evangeli 5:0c7c692db414 32 * the motor turns forward, otherwise the motor turns off.
evangeli 4:6ccbc7542ddc 33 */
evangeli 0:ed939452cce3 34 void m_callback(void); // This function will be run within the corresponding thread
evangeli 4:6ccbc7542ddc 35
evangeli 5:0c7c692db414 36 /** Simple callback for servo motion. When sw2 is high, the servo steps right,
evangeli 5:0c7c692db414 37 * otherwise it steps left. If it hits the ends it stays there.
evangeli 4:6ccbc7542ddc 38 */
evangeli 0:ed939452cce3 39 void s1_callback(void);
evangeli 0:ed939452cce3 40
m214962 6:ed7539be9fa3 41 void s2_callback(void);
m214962 6:ed7539be9fa3 42
evangeli 0:ed939452cce3 43 // main() runs in its own thread in the OS
evangeli 0:ed939452cce3 44 int main() {
evangeli 0:ed939452cce3 45 // startup things
m214962 6:ed7539be9fa3 46 printf("ES200 Project 2 Rockem Sockem\n");
evangeli 0:ed939452cce3 47 s1.calibrate(0.0009,90.0); // calibrate servo s1 once at startup
m214962 6:ed7539be9fa3 48 s2.calibrate(0.0009,90.0); //calibrate servo s2 once at startup
evangeli 0:ed939452cce3 49 m.speed(0.0); // set motor speed to zero at startup
evangeli 0:ed939452cce3 50
evangeli 0:ed939452cce3 51 // start tasks
m214962 7:b7257f01ced7 52 printf("In the left corner: MIDN Slappy weighing 0.02 lbs.\n In the right corner: MIDN Hitme weighing 0.021 lbs.\n");
evangeli 0:ed939452cce3 53 m_thread.start(callback(m_callback)); // starts the motor thread going
evangeli 0:ed939452cce3 54 s1_thread.start(callback(s1_callback)); // starts the servo thread going
m214962 6:ed7539be9fa3 55 s2_thread.start(callback(s2_callback)); //starts the servo2 thread going
m214962 7:b7257f01ced7 56 printf("\"ding ding ding\" Fight!\n");
evangeli 0:ed939452cce3 57
evangeli 0:ed939452cce3 58 // main loop
evangeli 0:ed939452cce3 59 while(1){
evangeli 0:ed939452cce3 60 heartbeat = !heartbeat; // blink heartbeat once a second
evangeli 5:0c7c692db414 61 //ThisThread::sleep_for(1000);
m214962 8:990a1c27a5da 62 Thread::wait(500+rand()%1000);
evangeli 5:0c7c692db414 63
m214962 8:990a1c27a5da 64 // motor or servo stuff not needed here because they are
evangeli 0:ed939452cce3 65 // running in their own threads.
evangeli 0:ed939452cce3 66 } // main loop
evangeli 0:ed939452cce3 67 } // main()
evangeli 0:ed939452cce3 68
evangeli 0:ed939452cce3 69
evangeli 0:ed939452cce3 70
evangeli 0:ed939452cce3 71
evangeli 0:ed939452cce3 72 void m_callback(void){
m214962 7:b7257f01ced7 73 printf("THE fighters are moving back and forth like dancers!!\n");
evangeli 0:ed939452cce3 74 while(1) {
m214962 6:ed7539be9fa3 75
m214962 6:ed7539be9fa3 76 led1.write(1); // light a light for entertaining purposes
m214962 8:990a1c27a5da 77 m.speed(-0.45); // spin motor ahead to move players together
m214962 8:990a1c27a5da 78 wait (0.65); //time of motor movement
m214962 6:ed7539be9fa3 79 m.speed(0.0); //stop players when they are close.
m214962 8:990a1c27a5da 80 wait (3+rand()%5); //let them fight for a random amount of time
m214962 6:ed7539be9fa3 81 led1.write(0);
m214962 8:990a1c27a5da 82 m.speed(0.45); // move the players back
m214962 8:990a1c27a5da 83 wait (1.5); //time of opposite motor movement
m214962 8:990a1c27a5da 84
m214962 8:990a1c27a5da 85 if (sw4.read()) {
m214962 8:990a1c27a5da 86 led4.write(1);
m214962 8:990a1c27a5da 87 }
m214962 8:990a1c27a5da 88 if (sw1.read()) {
m214962 8:990a1c27a5da 89 led5.write(1);
m214962 8:990a1c27a5da 90 }
m214962 6:ed7539be9fa3 91
m214962 8:990a1c27a5da 92 //ThisThread::sleep_for(200); // this thread executes 100x a second
m214962 8:990a1c27a5da 93 Thread::wait(50); //possibly change to small or erase
evangeli 0:ed939452cce3 94 } // while(1)
evangeli 0:ed939452cce3 95 } // m_callback()
evangeli 0:ed939452cce3 96
evangeli 0:ed939452cce3 97
evangeli 0:ed939452cce3 98
evangeli 0:ed939452cce3 99 void s1_callback(void){
m214962 7:b7257f01ced7 100 printf("Slappy threw a punch!\n");
evangeli 0:ed939452cce3 101 while(1){
evangeli 0:ed939452cce3 102 if (sw2.read()){
m214962 6:ed7539be9fa3 103 led2.write(1); // light a light for entertaining purposes
m214962 6:ed7539be9fa3 104 s1.write(s1.read()+0.5); // move servo a step to right
evangeli 0:ed939452cce3 105 }
evangeli 0:ed939452cce3 106 else{
evangeli 0:ed939452cce3 107 led2.write(0);
m214962 8:990a1c27a5da 108 s1.write(0.0); // move servo a step to left
evangeli 0:ed939452cce3 109 }
m214962 8:990a1c27a5da 110 //ThisThread::sleep_for(200); // this thread executes 100x a second
m214962 8:990a1c27a5da 111 Thread::wait(50); //Not used so that switches move players immediately - - - may have to use so that switches can move independently
evangeli 0:ed939452cce3 112 } // while(1)
evangeli 0:ed939452cce3 113 } // s1_callback()
m214962 6:ed7539be9fa3 114
m214962 6:ed7539be9fa3 115 void s2_callback(void){
m214962 7:b7257f01ced7 116 printf("Hitme is fighting back!\n");
m214962 6:ed7539be9fa3 117 while(1){
m214962 6:ed7539be9fa3 118 if (sw3.read()){
m214962 7:b7257f01ced7 119 led3.write(1); // light a light for entertaining purposes
m214962 6:ed7539be9fa3 120 s2.write(s2.read()+0.5); // move servo a step to right
m214962 6:ed7539be9fa3 121 }
m214962 6:ed7539be9fa3 122 else{
m214962 6:ed7539be9fa3 123 led3.write(0);
m214962 8:990a1c27a5da 124 s2.write(0.0); // move servo a step to left
m214962 6:ed7539be9fa3 125 }
m214962 8:990a1c27a5da 126 //ThisThread::sleep_for(200); // this thread executes 100x a second
m214962 8:990a1c27a5da 127 Thread::wait(50); //possibly change
m214962 6:ed7539be9fa3 128 } // while(1)
m214962 6:ed7539be9fa3 129 } // s2_callback()