Thread example of multiple things happening at once. Requires mbed OS 5 and up-to-date mbed firmware.
Fork of Fa2018-es200-1121-3321-thread-example-peanut by
main.cpp@3:68bba10e81aa, 2018-10-14 (annotated)
- 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?
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 | 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() |