Example of using threads to run different actions happening at the same time.
Fork of Fa2018-es200-1121-3321-thread-example by
main.cpp@7:b7257f01ced7, 2018-10-22 (annotated)
- Committer:
- m214962
- Date:
- Mon Oct 22 15:23:45 2018 +0000
- Revision:
- 7:b7257f01ced7
- Parent:
- 6:ed7539be9fa3
- Child:
- 8:990a1c27a5da
Finished most comments. Time can still be adjusted. Servo range can be changed, I just wasn't able to figure out how.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
evangeli | 0:ed939452cce3 | 1 | /* |
m214962 | 7:b7257f01ced7 | 2 | ES200 Project 2 thread use |
m214962 | 7:b7257f01ced7 | 3 | Rock em Sock em 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 |
m214962 | 6:ed7539be9fa3 | 14 | DigitalIn sw1(p18); // switch for activating motor |
m214962 | 6:ed7539be9fa3 | 15 | DigitalIn sw2(p16); // switch for activating servo |
m214962 | 7:b7257f01ced7 | 16 | DigitalIn sw3(p20); // switch for activating servo2 |
evangeli | 0:ed939452cce3 | 17 | DigitalOut led1(LED1); // status LED for sw1 |
evangeli | 0:ed939452cce3 | 18 | DigitalOut led2(LED2); // status LED for sw2 |
m214962 | 6:ed7539be9fa3 | 19 | DigitalOut led3(LED3); // status LED for sw3 |
m214962 | 7:b7257f01ced7 | 20 | DigitalOut heartbeat(LED4); // heartbeat LED adds visual effects |
evangeli | 0:ed939452cce3 | 21 | Motor m(p26,p30,p29); |
evangeli | 0:ed939452cce3 | 22 | Servo s1(p21); |
m214962 | 6:ed7539be9fa3 | 23 | Servo s2(p22); |
evangeli | 0:ed939452cce3 | 24 | Thread m_thread; // NEW IN mbed OS 5, threads are used to (sorta) do multiple things at once |
m214962 | 7:b7257f01ced7 | 25 | Thread s1_thread; //creates thread for servo |
m214962 | 7:b7257f01ced7 | 26 | Thread s2_thread; // creates thread for servo2 |
evangeli | 0:ed939452cce3 | 27 | |
evangeli | 5:0c7c692db414 | 28 | /** Callback for executing a simple motor action. When sw1 is high, |
evangeli | 5:0c7c692db414 | 29 | * the motor turns forward, otherwise the motor turns off. |
evangeli | 4:6ccbc7542ddc | 30 | */ |
evangeli | 0:ed939452cce3 | 31 | void m_callback(void); // This function will be run within the corresponding thread |
evangeli | 4:6ccbc7542ddc | 32 | |
evangeli | 5:0c7c692db414 | 33 | /** Simple callback for servo motion. When sw2 is high, the servo steps right, |
evangeli | 5:0c7c692db414 | 34 | * otherwise it steps left. If it hits the ends it stays there. |
evangeli | 4:6ccbc7542ddc | 35 | */ |
evangeli | 0:ed939452cce3 | 36 | void s1_callback(void); |
evangeli | 0:ed939452cce3 | 37 | |
m214962 | 6:ed7539be9fa3 | 38 | void s2_callback(void); |
m214962 | 6:ed7539be9fa3 | 39 | |
evangeli | 0:ed939452cce3 | 40 | // main() runs in its own thread in the OS |
evangeli | 0:ed939452cce3 | 41 | int main() { |
evangeli | 0:ed939452cce3 | 42 | // startup things |
m214962 | 6:ed7539be9fa3 | 43 | printf("ES200 Project 2 Rockem Sockem\n"); |
evangeli | 0:ed939452cce3 | 44 | s1.calibrate(0.0009,90.0); // calibrate servo s1 once at startup |
m214962 | 6:ed7539be9fa3 | 45 | s2.calibrate(0.0009,90.0); //calibrate servo s2 once at startup |
evangeli | 0:ed939452cce3 | 46 | m.speed(0.0); // set motor speed to zero at startup |
evangeli | 0:ed939452cce3 | 47 | |
evangeli | 0:ed939452cce3 | 48 | // start tasks |
m214962 | 7:b7257f01ced7 | 49 | printf("In the left corner: MIDN Slappy weighing 0.02 lbs.\n In the right corner: MIDN Hitme weighing 0.021 lbs.\n"); |
evangeli | 0:ed939452cce3 | 50 | m_thread.start(callback(m_callback)); // starts the motor thread going |
evangeli | 0:ed939452cce3 | 51 | s1_thread.start(callback(s1_callback)); // starts the servo thread going |
m214962 | 6:ed7539be9fa3 | 52 | s2_thread.start(callback(s2_callback)); //starts the servo2 thread going |
m214962 | 7:b7257f01ced7 | 53 | printf("\"ding ding ding\" Fight!\n"); |
evangeli | 0:ed939452cce3 | 54 | |
evangeli | 0:ed939452cce3 | 55 | // main loop |
evangeli | 0:ed939452cce3 | 56 | while(1){ |
evangeli | 0:ed939452cce3 | 57 | heartbeat = !heartbeat; // blink heartbeat once a second |
evangeli | 5:0c7c692db414 | 58 | //ThisThread::sleep_for(1000); |
evangeli | 5:0c7c692db414 | 59 | Thread::wait(1000); |
evangeli | 5:0c7c692db414 | 60 | |
evangeli | 0:ed939452cce3 | 61 | // I don't have to do my motor or servo stuff here because they are |
evangeli | 0:ed939452cce3 | 62 | // running in their own threads. |
evangeli | 0:ed939452cce3 | 63 | } // main loop |
evangeli | 0:ed939452cce3 | 64 | } // main() |
evangeli | 0:ed939452cce3 | 65 | |
evangeli | 0:ed939452cce3 | 66 | |
evangeli | 0:ed939452cce3 | 67 | |
evangeli | 0:ed939452cce3 | 68 | |
evangeli | 0:ed939452cce3 | 69 | void m_callback(void){ |
m214962 | 7:b7257f01ced7 | 70 | printf("THE fighters are moving back and forth like dancers!!\n"); |
evangeli | 0:ed939452cce3 | 71 | while(1) { |
m214962 | 6:ed7539be9fa3 | 72 | |
m214962 | 6:ed7539be9fa3 | 73 | led1.write(1); // light a light for entertaining purposes |
m214962 | 7:b7257f01ced7 | 74 | m.speed(0.5); // spin motor ahead to move players together |
m214962 | 7:b7257f01ced7 | 75 | wait (0.7); //time of motor movement |
m214962 | 6:ed7539be9fa3 | 76 | m.speed(0.0); //stop players when they are close. |
m214962 | 6:ed7539be9fa3 | 77 | wait (1+rand()%5); //let them fight for a random amount of time |
m214962 | 6:ed7539be9fa3 | 78 | led1.write(0); |
m214962 | 7:b7257f01ced7 | 79 | m.speed(-0.5); // move the players back |
m214962 | 7:b7257f01ced7 | 80 | wait (0.7); //time of opposite motor movement |
m214962 | 6:ed7539be9fa3 | 81 | |
m214962 | 7:b7257f01ced7 | 82 | //ThisThread::sleep_for(200); // this thread executes 20x a second |
m214962 | 7:b7257f01ced7 | 83 | // Thread::wait(50); //possibly change to small or erase |
evangeli | 0:ed939452cce3 | 84 | } // while(1) |
evangeli | 0:ed939452cce3 | 85 | } // m_callback() |
evangeli | 0:ed939452cce3 | 86 | |
evangeli | 0:ed939452cce3 | 87 | |
evangeli | 0:ed939452cce3 | 88 | |
evangeli | 0:ed939452cce3 | 89 | void s1_callback(void){ |
m214962 | 7:b7257f01ced7 | 90 | printf("Slappy threw a punch!\n"); |
evangeli | 0:ed939452cce3 | 91 | while(1){ |
evangeli | 0:ed939452cce3 | 92 | if (sw2.read()){ |
m214962 | 6:ed7539be9fa3 | 93 | led2.write(1); // light a light for entertaining purposes |
m214962 | 6:ed7539be9fa3 | 94 | s1.write(s1.read()+0.5); // move servo a step to right |
evangeli | 0:ed939452cce3 | 95 | } |
evangeli | 0:ed939452cce3 | 96 | else{ |
evangeli | 0:ed939452cce3 | 97 | led2.write(0); |
m214962 | 7:b7257f01ced7 | 98 | s1.write(sw1.read()-0.5); // move servo a step to left |
evangeli | 0:ed939452cce3 | 99 | } |
m214962 | 7:b7257f01ced7 | 100 | //ThisThread::sleep_for(200); // this thread executes 20x a second |
m214962 | 7:b7257f01ced7 | 101 | // Thread::wait(50); //possibly change |
evangeli | 0:ed939452cce3 | 102 | } // while(1) |
evangeli | 0:ed939452cce3 | 103 | } // s1_callback() |
m214962 | 6:ed7539be9fa3 | 104 | |
m214962 | 6:ed7539be9fa3 | 105 | void s2_callback(void){ |
m214962 | 7:b7257f01ced7 | 106 | printf("Hitme is fighting back!\n"); |
m214962 | 6:ed7539be9fa3 | 107 | while(1){ |
m214962 | 6:ed7539be9fa3 | 108 | if (sw3.read()){ |
m214962 | 7:b7257f01ced7 | 109 | led3.write(1); // light a light for entertaining purposes |
m214962 | 6:ed7539be9fa3 | 110 | s2.write(s2.read()+0.5); // move servo a step to right |
m214962 | 6:ed7539be9fa3 | 111 | } |
m214962 | 6:ed7539be9fa3 | 112 | else{ |
m214962 | 6:ed7539be9fa3 | 113 | led3.write(0); |
m214962 | 7:b7257f01ced7 | 114 | s2.write(s2.read()-0.5); // move servo a step to left |
m214962 | 6:ed7539be9fa3 | 115 | } |
m214962 | 7:b7257f01ced7 | 116 | //ThisThread::sleep_for(200); // this thread executes 20x a second |
m214962 | 7:b7257f01ced7 | 117 | // Thread::wait(50); //possibly change |
m214962 | 6:ed7539be9fa3 | 118 | } // while(1) |
m214962 | 6:ed7539be9fa3 | 119 | } // s2_callback() |