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:
Fri Oct 19 12:27:25 2018 +0000
Revision:
6:ed7539be9fa3
Parent:
5:0c7c692db414
Child:
7:b7257f01ced7
Works using thread. There are multiple "int main()"s so to speak. Each one controls a different tool.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
evangeli 0:ed939452cce3 1 /*
evangeli 0:ed939452cce3 2 ES200 Project 2 thread example
evangeli 0:ed939452cce3 3 D Evangelista, 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 6:ed7539be9fa3 16 DigitalIn sw3(p20); //
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
evangeli 0:ed939452cce3 20 DigitalOut heartbeat(LED4); // heartbeat LED
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
evangeli 0:ed939452cce3 25 Thread s1_thread;
m214962 6:ed7539be9fa3 26 Thread s2_thread;
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
evangeli 0:ed939452cce3 49 printf("main thread running\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
evangeli 0:ed939452cce3 53
evangeli 0:ed939452cce3 54 // main loop
evangeli 0:ed939452cce3 55 while(1){
evangeli 0:ed939452cce3 56 heartbeat = !heartbeat; // blink heartbeat once a second
evangeli 5:0c7c692db414 57 //ThisThread::sleep_for(1000);
evangeli 5:0c7c692db414 58 Thread::wait(1000);
evangeli 5:0c7c692db414 59
evangeli 0:ed939452cce3 60 // I don't have to do my motor or servo stuff here because they are
evangeli 0:ed939452cce3 61 // running in their own threads.
evangeli 0:ed939452cce3 62 } // main loop
evangeli 0:ed939452cce3 63 } // main()
evangeli 0:ed939452cce3 64
evangeli 0:ed939452cce3 65
evangeli 0:ed939452cce3 66
evangeli 0:ed939452cce3 67
evangeli 0:ed939452cce3 68 void m_callback(void){
evangeli 0:ed939452cce3 69 printf("m_thread running\n");
evangeli 0:ed939452cce3 70 while(1) {
m214962 6:ed7539be9fa3 71
m214962 6:ed7539be9fa3 72 led1.write(1); // light a light for entertaining purposes
m214962 6:ed7539be9fa3 73 m.speed(0.7); // spin motor ahead to move players together
m214962 6:ed7539be9fa3 74 wait (1.2);
m214962 6:ed7539be9fa3 75 m.speed(0.0); //stop players when they are close.
m214962 6:ed7539be9fa3 76 wait (1+rand()%5); //let them fight for a random amount of time
m214962 6:ed7539be9fa3 77 led1.write(0);
m214962 6:ed7539be9fa3 78 m.speed(-0.7); // move the players back
m214962 6:ed7539be9fa3 79 wait (1.2);
m214962 6:ed7539be9fa3 80
evangeli 5:0c7c692db414 81 //ThisThread::sleep_for(200); // this thread executes 5x a second
evangeli 5:0c7c692db414 82 Thread::wait(200);
evangeli 0:ed939452cce3 83 } // while(1)
evangeli 0:ed939452cce3 84 } // m_callback()
evangeli 0:ed939452cce3 85
evangeli 0:ed939452cce3 86
evangeli 0:ed939452cce3 87
evangeli 0:ed939452cce3 88 void s1_callback(void){
evangeli 0:ed939452cce3 89 printf("s1_thread running\n");
evangeli 0:ed939452cce3 90 while(1){
evangeli 0:ed939452cce3 91 if (sw2.read()){
m214962 6:ed7539be9fa3 92 led2.write(1); // light a light for entertaining purposes
m214962 6:ed7539be9fa3 93 s1.write(s1.read()+0.5); // move servo a step to right
evangeli 0:ed939452cce3 94 }
evangeli 0:ed939452cce3 95 else{
evangeli 0:ed939452cce3 96 led2.write(0);
m214962 6:ed7539be9fa3 97 s1.write(0); // move servo a step to left
evangeli 0:ed939452cce3 98 }
evangeli 5:0c7c692db414 99 //ThisThread::sleep_for(200); // this thread executes 5x a second
evangeli 5:0c7c692db414 100 Thread::wait(200);
evangeli 0:ed939452cce3 101 } // while(1)
evangeli 0:ed939452cce3 102 } // s1_callback()
m214962 6:ed7539be9fa3 103
m214962 6:ed7539be9fa3 104 void s2_callback(void){
m214962 6:ed7539be9fa3 105 printf("s2_thread running\n");
m214962 6:ed7539be9fa3 106 while(1){
m214962 6:ed7539be9fa3 107 if (sw3.read()){
m214962 6:ed7539be9fa3 108 led3.write(1); // light a light for debugging purposes
m214962 6:ed7539be9fa3 109 s2.write(s2.read()+0.5); // move servo a step to right
m214962 6:ed7539be9fa3 110 }
m214962 6:ed7539be9fa3 111 else{
m214962 6:ed7539be9fa3 112 led3.write(0);
m214962 6:ed7539be9fa3 113 s2.write(0); // move servo a step to left
m214962 6:ed7539be9fa3 114 }
m214962 6:ed7539be9fa3 115 //ThisThread::sleep_for(200); // this thread executes 5x a second
m214962 6:ed7539be9fa3 116 Thread::wait(200);
m214962 6:ed7539be9fa3 117 } // while(1)
m214962 6:ed7539be9fa3 118 } // s2_callback()