Thread example of multiple things happening at once. Requires mbed OS 5 and up-to-date mbed firmware.

Dependencies:   Motor Servo

Fork of Fa2018-es200-1121-3321-thread-example-peanut by Fa2018-es200-3321-proj2-GoodTeam#2

Committer:
evangeli
Date:
Sun Oct 14 22:00:35 2018 +0000
Revision:
3:68bba10e81aa
Parent:
2:2710cfd7bc6a
Child:
4:6ccbc7542ddc
trying to get docstrings to work right

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