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:
evangeli
Date:
Mon Oct 15 11:34:44 2018 +0000
Revision:
5:0c7c692db414
Parent:
4:6ccbc7542ddc
Child:
6:ed7539be9fa3
Tested. Went back to (deprecated) Thread::wait() but it and ThisThread::sleep_for() both seem to run really slow???

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
evangeli 0:ed939452cce3 14 DigitalIn sw1(p19); // switch for activating motor
evangeli 0:ed939452cce3 15 DigitalIn sw2(p18); // switch for activating servo
evangeli 0:ed939452cce3 16 DigitalOut led1(LED1); // status LED for sw1
evangeli 0:ed939452cce3 17 DigitalOut led2(LED2); // status LED for sw2
evangeli 0:ed939452cce3 18 DigitalOut heartbeat(LED4); // heartbeat LED
evangeli 0:ed939452cce3 19 Motor m(p26,p30,p29);
evangeli 0:ed939452cce3 20 Servo s1(p21);
evangeli 0:ed939452cce3 21 Thread m_thread; // NEW IN mbed OS 5, threads are used to (sorta) do multiple things at once
evangeli 0:ed939452cce3 22 Thread s1_thread;
evangeli 0:ed939452cce3 23
evangeli 5:0c7c692db414 24 /** Callback for executing a simple motor action. When sw1 is high,
evangeli 5:0c7c692db414 25 * the motor turns forward, otherwise the motor turns off.
evangeli 4:6ccbc7542ddc 26 */
evangeli 0:ed939452cce3 27 void m_callback(void); // This function will be run within the corresponding thread
evangeli 4:6ccbc7542ddc 28
evangeli 5:0c7c692db414 29 /** Simple callback for servo motion. When sw2 is high, the servo steps right,
evangeli 5:0c7c692db414 30 * otherwise it steps left. If it hits the ends it stays there.
evangeli 4:6ccbc7542ddc 31 */
evangeli 0:ed939452cce3 32 void s1_callback(void);
evangeli 0:ed939452cce3 33
evangeli 0:ed939452cce3 34 // main() runs in its own thread in the OS
evangeli 0:ed939452cce3 35 int main() {
evangeli 0:ed939452cce3 36 // startup things
evangeli 0:ed939452cce3 37 printf("ES200 Project 2 thread example\n");
evangeli 0:ed939452cce3 38 s1.calibrate(0.0009,90.0); // calibrate servo s1 once at startup
evangeli 0:ed939452cce3 39 m.speed(0.0); // set motor speed to zero at startup
evangeli 0:ed939452cce3 40
evangeli 0:ed939452cce3 41 // start tasks
evangeli 0:ed939452cce3 42 printf("main thread running\n");
evangeli 0:ed939452cce3 43 m_thread.start(callback(m_callback)); // starts the motor thread going
evangeli 0:ed939452cce3 44 s1_thread.start(callback(s1_callback)); // starts the servo thread going
evangeli 0:ed939452cce3 45
evangeli 0:ed939452cce3 46 // main loop
evangeli 0:ed939452cce3 47 while(1){
evangeli 0:ed939452cce3 48 heartbeat = !heartbeat; // blink heartbeat once a second
evangeli 5:0c7c692db414 49 //ThisThread::sleep_for(1000);
evangeli 5:0c7c692db414 50 Thread::wait(1000);
evangeli 5:0c7c692db414 51
evangeli 0:ed939452cce3 52 // I don't have to do my motor or servo stuff here because they are
evangeli 0:ed939452cce3 53 // running in their own threads.
evangeli 0:ed939452cce3 54 } // main loop
evangeli 0:ed939452cce3 55 } // main()
evangeli 0:ed939452cce3 56
evangeli 0:ed939452cce3 57
evangeli 0:ed939452cce3 58
evangeli 0:ed939452cce3 59
evangeli 0:ed939452cce3 60 void m_callback(void){
evangeli 0:ed939452cce3 61 printf("m_thread running\n");
evangeli 0:ed939452cce3 62 while(1) {
evangeli 0:ed939452cce3 63 if (sw1.read()){
evangeli 0:ed939452cce3 64 led1.write(1); // light a light for debugging purposes
evangeli 0:ed939452cce3 65 m.speed(0.7); // spin motor ahead
evangeli 0:ed939452cce3 66 }
evangeli 0:ed939452cce3 67 else {
evangeli 0:ed939452cce3 68 led1.write(0);
evangeli 0:ed939452cce3 69 m.speed(0.0); // stop the shaft
evangeli 0:ed939452cce3 70 }
evangeli 5:0c7c692db414 71 //ThisThread::sleep_for(200); // this thread executes 5x a second
evangeli 5:0c7c692db414 72 Thread::wait(200);
evangeli 0:ed939452cce3 73 } // while(1)
evangeli 0:ed939452cce3 74 } // m_callback()
evangeli 0:ed939452cce3 75
evangeli 0:ed939452cce3 76
evangeli 0:ed939452cce3 77
evangeli 0:ed939452cce3 78 void s1_callback(void){
evangeli 0:ed939452cce3 79 printf("s1_thread running\n");
evangeli 0:ed939452cce3 80 while(1){
evangeli 0:ed939452cce3 81 if (sw2.read()){
evangeli 0:ed939452cce3 82 led2.write(1); // light a light for debugging purposes
evangeli 0:ed939452cce3 83 s1.write(s1.read()+0.1); // move servo a step to right
evangeli 0:ed939452cce3 84 }
evangeli 0:ed939452cce3 85 else{
evangeli 0:ed939452cce3 86 led2.write(0);
evangeli 0:ed939452cce3 87 s1.write(s1.read()-0.1); // move servo a step to left
evangeli 0:ed939452cce3 88 }
evangeli 5:0c7c692db414 89 //ThisThread::sleep_for(200); // this thread executes 5x a second
evangeli 5:0c7c692db414 90 Thread::wait(200);
evangeli 0:ed939452cce3 91 } // while(1)
evangeli 0:ed939452cce3 92 } // s1_callback()