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:
Mon Oct 22 15:23:45 2018 +0000
Revision:
7:b7257f01ced7
Parent:
6:ed7539be9fa3
Child:
8:990a1c27a5da
Finished most comments. Time can still be adjusted. Servo range can be changed, I just wasn't able to figure out how.

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 6:ed7539be9fa3 14 DigitalIn sw1(p18); // switch for activating motor
m214962 6:ed7539be9fa3 15 DigitalIn sw2(p16); // switch for activating servo
m214962 7:b7257f01ced7 16 DigitalIn sw3(p20); // switch for activating servo2
evangeli 0:ed939452cce3 17 DigitalOut led1(LED1); // status LED for sw1
evangeli 0:ed939452cce3 18 DigitalOut led2(LED2); // status LED for sw2
m214962 6:ed7539be9fa3 19 DigitalOut led3(LED3); // status LED for sw3
m214962 7:b7257f01ced7 20 DigitalOut heartbeat(LED4); // heartbeat LED adds visual effects
evangeli 0:ed939452cce3 21 Motor m(p26,p30,p29);
evangeli 0:ed939452cce3 22 Servo s1(p21);
m214962 6:ed7539be9fa3 23 Servo s2(p22);
evangeli 0:ed939452cce3 24 Thread m_thread; // NEW IN mbed OS 5, threads are used to (sorta) do multiple things at once
m214962 7:b7257f01ced7 25 Thread s1_thread; //creates thread for servo
m214962 7:b7257f01ced7 26 Thread s2_thread; // creates thread for servo2
evangeli 0:ed939452cce3 27
evangeli 5:0c7c692db414 28 /** Callback for executing a simple motor action. When sw1 is high,
evangeli 5:0c7c692db414 29 * the motor turns forward, otherwise the motor turns off.
evangeli 4:6ccbc7542ddc 30 */
evangeli 0:ed939452cce3 31 void m_callback(void); // This function will be run within the corresponding thread
evangeli 4:6ccbc7542ddc 32
evangeli 5:0c7c692db414 33 /** Simple callback for servo motion. When sw2 is high, the servo steps right,
evangeli 5:0c7c692db414 34 * otherwise it steps left. If it hits the ends it stays there.
evangeli 4:6ccbc7542ddc 35 */
evangeli 0:ed939452cce3 36 void s1_callback(void);
evangeli 0:ed939452cce3 37
m214962 6:ed7539be9fa3 38 void s2_callback(void);
m214962 6:ed7539be9fa3 39
evangeli 0:ed939452cce3 40 // main() runs in its own thread in the OS
evangeli 0:ed939452cce3 41 int main() {
evangeli 0:ed939452cce3 42 // startup things
m214962 6:ed7539be9fa3 43 printf("ES200 Project 2 Rockem Sockem\n");
evangeli 0:ed939452cce3 44 s1.calibrate(0.0009,90.0); // calibrate servo s1 once at startup
m214962 6:ed7539be9fa3 45 s2.calibrate(0.0009,90.0); //calibrate servo s2 once at startup
evangeli 0:ed939452cce3 46 m.speed(0.0); // set motor speed to zero at startup
evangeli 0:ed939452cce3 47
evangeli 0:ed939452cce3 48 // start tasks
m214962 7:b7257f01ced7 49 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 50 m_thread.start(callback(m_callback)); // starts the motor thread going
evangeli 0:ed939452cce3 51 s1_thread.start(callback(s1_callback)); // starts the servo thread going
m214962 6:ed7539be9fa3 52 s2_thread.start(callback(s2_callback)); //starts the servo2 thread going
m214962 7:b7257f01ced7 53 printf("\"ding ding ding\" Fight!\n");
evangeli 0:ed939452cce3 54
evangeli 0:ed939452cce3 55 // main loop
evangeli 0:ed939452cce3 56 while(1){
evangeli 0:ed939452cce3 57 heartbeat = !heartbeat; // blink heartbeat once a second
evangeli 5:0c7c692db414 58 //ThisThread::sleep_for(1000);
evangeli 5:0c7c692db414 59 Thread::wait(1000);
evangeli 5:0c7c692db414 60
evangeli 0:ed939452cce3 61 // I don't have to do my motor or servo stuff here because they are
evangeli 0:ed939452cce3 62 // running in their own threads.
evangeli 0:ed939452cce3 63 } // main loop
evangeli 0:ed939452cce3 64 } // main()
evangeli 0:ed939452cce3 65
evangeli 0:ed939452cce3 66
evangeli 0:ed939452cce3 67
evangeli 0:ed939452cce3 68
evangeli 0:ed939452cce3 69 void m_callback(void){
m214962 7:b7257f01ced7 70 printf("THE fighters are moving back and forth like dancers!!\n");
evangeli 0:ed939452cce3 71 while(1) {
m214962 6:ed7539be9fa3 72
m214962 6:ed7539be9fa3 73 led1.write(1); // light a light for entertaining purposes
m214962 7:b7257f01ced7 74 m.speed(0.5); // spin motor ahead to move players together
m214962 7:b7257f01ced7 75 wait (0.7); //time of motor movement
m214962 6:ed7539be9fa3 76 m.speed(0.0); //stop players when they are close.
m214962 6:ed7539be9fa3 77 wait (1+rand()%5); //let them fight for a random amount of time
m214962 6:ed7539be9fa3 78 led1.write(0);
m214962 7:b7257f01ced7 79 m.speed(-0.5); // move the players back
m214962 7:b7257f01ced7 80 wait (0.7); //time of opposite motor movement
m214962 6:ed7539be9fa3 81
m214962 7:b7257f01ced7 82 //ThisThread::sleep_for(200); // this thread executes 20x a second
m214962 7:b7257f01ced7 83 // Thread::wait(50); //possibly change to small or erase
evangeli 0:ed939452cce3 84 } // while(1)
evangeli 0:ed939452cce3 85 } // m_callback()
evangeli 0:ed939452cce3 86
evangeli 0:ed939452cce3 87
evangeli 0:ed939452cce3 88
evangeli 0:ed939452cce3 89 void s1_callback(void){
m214962 7:b7257f01ced7 90 printf("Slappy threw a punch!\n");
evangeli 0:ed939452cce3 91 while(1){
evangeli 0:ed939452cce3 92 if (sw2.read()){
m214962 6:ed7539be9fa3 93 led2.write(1); // light a light for entertaining purposes
m214962 6:ed7539be9fa3 94 s1.write(s1.read()+0.5); // move servo a step to right
evangeli 0:ed939452cce3 95 }
evangeli 0:ed939452cce3 96 else{
evangeli 0:ed939452cce3 97 led2.write(0);
m214962 7:b7257f01ced7 98 s1.write(sw1.read()-0.5); // move servo a step to left
evangeli 0:ed939452cce3 99 }
m214962 7:b7257f01ced7 100 //ThisThread::sleep_for(200); // this thread executes 20x a second
m214962 7:b7257f01ced7 101 // Thread::wait(50); //possibly change
evangeli 0:ed939452cce3 102 } // while(1)
evangeli 0:ed939452cce3 103 } // s1_callback()
m214962 6:ed7539be9fa3 104
m214962 6:ed7539be9fa3 105 void s2_callback(void){
m214962 7:b7257f01ced7 106 printf("Hitme is fighting back!\n");
m214962 6:ed7539be9fa3 107 while(1){
m214962 6:ed7539be9fa3 108 if (sw3.read()){
m214962 7:b7257f01ced7 109 led3.write(1); // light a light for entertaining purposes
m214962 6:ed7539be9fa3 110 s2.write(s2.read()+0.5); // move servo a step to right
m214962 6:ed7539be9fa3 111 }
m214962 6:ed7539be9fa3 112 else{
m214962 6:ed7539be9fa3 113 led3.write(0);
m214962 7:b7257f01ced7 114 s2.write(s2.read()-0.5); // move servo a step to left
m214962 6:ed7539be9fa3 115 }
m214962 7:b7257f01ced7 116 //ThisThread::sleep_for(200); // this thread executes 20x a second
m214962 7:b7257f01ced7 117 // Thread::wait(50); //possibly change
m214962 6:ed7539be9fa3 118 } // while(1)
m214962 6:ed7539be9fa3 119 } // s2_callback()