Example of using threads to run different actions happening at the same time.
Fork of Fa2018-es200-1121-3321-thread-example-rockem by
main.cpp@4:6ccbc7542ddc, 2018-10-14 (annotated)
- Committer:
- evangeli
- Date:
- Sun Oct 14 22:05:59 2018 +0000
- Revision:
- 4:6ccbc7542ddc
- Parent:
- 3:68bba10e81aa
- Child:
- 5:0c7c692db414
Still trying to get docstrings to work right
Who changed what in which revision?
User | Revision | Line number | New 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 | 4:6ccbc7542ddc | 24 | /** |
evangeli | 4:6ccbc7542ddc | 25 | * Callback for executing a simple motor action. When sw1 is high, |
evangeli | 4:6ccbc7542ddc | 26 | * the motor turns forward, otherwise the motor turns off. |
evangeli | 4:6ccbc7542ddc | 27 | */ |
evangeli | 0:ed939452cce3 | 28 | void m_callback(void); // This function will be run within the corresponding thread |
evangeli | 4:6ccbc7542ddc | 29 | |
evangeli | 4:6ccbc7542ddc | 30 | /** |
evangeli | 4:6ccbc7542ddc | 31 | * Simple callback for servo motion. When sw2 is high, the servo steps right, |
evangeli | 4:6ccbc7542ddc | 32 | * otherwise it steps left. If it hits the ends it stays there. |
evangeli | 4:6ccbc7542ddc | 33 | */ |
evangeli | 0:ed939452cce3 | 34 | void s1_callback(void); |
evangeli | 0:ed939452cce3 | 35 | |
evangeli | 0:ed939452cce3 | 36 | // main() runs in its own thread in the OS |
evangeli | 0:ed939452cce3 | 37 | int main() { |
evangeli | 0:ed939452cce3 | 38 | // startup things |
evangeli | 0:ed939452cce3 | 39 | printf("ES200 Project 2 thread example\n"); |
evangeli | 0:ed939452cce3 | 40 | s1.calibrate(0.0009,90.0); // calibrate servo s1 once at startup |
evangeli | 0:ed939452cce3 | 41 | m.speed(0.0); // set motor speed to zero at startup |
evangeli | 0:ed939452cce3 | 42 | |
evangeli | 0:ed939452cce3 | 43 | // start tasks |
evangeli | 0:ed939452cce3 | 44 | printf("main thread running\n"); |
evangeli | 0:ed939452cce3 | 45 | m_thread.start(callback(m_callback)); // starts the motor thread going |
evangeli | 0:ed939452cce3 | 46 | s1_thread.start(callback(s1_callback)); // starts the servo thread going |
evangeli | 0:ed939452cce3 | 47 | |
evangeli | 0:ed939452cce3 | 48 | // main loop |
evangeli | 0:ed939452cce3 | 49 | while(1){ |
evangeli | 0:ed939452cce3 | 50 | heartbeat = !heartbeat; // blink heartbeat once a second |
evangeli | 0:ed939452cce3 | 51 | ThisThread::sleep_for(1000); |
evangeli | 0:ed939452cce3 | 52 | |
evangeli | 0:ed939452cce3 | 53 | // I don't have to do my motor or servo stuff here because they are |
evangeli | 0:ed939452cce3 | 54 | // running in their own threads. |
evangeli | 0:ed939452cce3 | 55 | } // main loop |
evangeli | 0:ed939452cce3 | 56 | } // main() |
evangeli | 0:ed939452cce3 | 57 | |
evangeli | 0:ed939452cce3 | 58 | |
evangeli | 0:ed939452cce3 | 59 | |
evangeli | 0:ed939452cce3 | 60 | |
evangeli | 0:ed939452cce3 | 61 | void m_callback(void){ |
evangeli | 0:ed939452cce3 | 62 | printf("m_thread running\n"); |
evangeli | 0:ed939452cce3 | 63 | while(1) { |
evangeli | 0:ed939452cce3 | 64 | if (sw1.read()){ |
evangeli | 0:ed939452cce3 | 65 | led1.write(1); // light a light for debugging purposes |
evangeli | 0:ed939452cce3 | 66 | m.speed(0.7); // spin motor ahead |
evangeli | 0:ed939452cce3 | 67 | } |
evangeli | 0:ed939452cce3 | 68 | else { |
evangeli | 0:ed939452cce3 | 69 | led1.write(0); |
evangeli | 0:ed939452cce3 | 70 | m.speed(0.0); // stop the shaft |
evangeli | 0:ed939452cce3 | 71 | } |
evangeli | 0:ed939452cce3 | 72 | ThisThread::sleep_for(200); // this thread executes 5x a second |
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 | 0:ed939452cce3 | 89 | ThisThread::sleep_for(200); // this thread executes 5x a second |
evangeli | 0:ed939452cce3 | 90 | } // while(1) |
evangeli | 0:ed939452cce3 | 91 | } // s1_callback() |