Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of Fa2018-es200-1121-3321-thread-example-rockem by
main.cpp@5:0c7c692db414, 2018-10-15 (annotated)
- Committer:
- evangeli
- Date:
- Mon Oct 15 11:34:44 2018 +0000
- Revision:
- 5:0c7c692db414
- Parent:
- 4:6ccbc7542ddc
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?
| 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 | 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() |
