Example of using threads to run different actions happening at the same time.
Fork of Fa2018-es200-1121-3321-thread-example by
main.cpp@8:990a1c27a5da, 2018-10-23 (annotated)
- Committer:
- m214962
- Date:
- Tue Oct 23 13:29:33 2018 +0000
- Revision:
- 8:990a1c27a5da
- Parent:
- 7:b7257f01ced7
Final Project2 code. Works with 2 separate switches. Other switches change leds.
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 | 8:990a1c27a5da | 14 | DigitalIn sw1(p17); // switch for activating led5 |
m214962 | 6:ed7539be9fa3 | 15 | DigitalIn sw2(p16); // switch for activating servo |
m214962 | 7:b7257f01ced7 | 16 | DigitalIn sw3(p20); // switch for activating servo2 |
m214962 | 8:990a1c27a5da | 17 | DigitalIn sw4(p19); // switch for led4 |
m214962 | 8:990a1c27a5da | 18 | DigitalOut led1(p5); // status LED for motor |
m214962 | 8:990a1c27a5da | 19 | DigitalOut led2(p6); // status LED for sw2 |
m214962 | 8:990a1c27a5da | 20 | DigitalOut led3(p7); // status LED for sw3 |
m214962 | 8:990a1c27a5da | 21 | DigitalOut led4(p8); // status LED for sw4 |
m214962 | 8:990a1c27a5da | 22 | DigitalOut led5(p11); //status LED for sw1 |
m214962 | 7:b7257f01ced7 | 23 | DigitalOut heartbeat(LED4); // heartbeat LED adds visual effects |
evangeli | 0:ed939452cce3 | 24 | Motor m(p26,p30,p29); |
evangeli | 0:ed939452cce3 | 25 | Servo s1(p21); |
m214962 | 6:ed7539be9fa3 | 26 | Servo s2(p22); |
evangeli | 0:ed939452cce3 | 27 | Thread m_thread; // NEW IN mbed OS 5, threads are used to (sorta) do multiple things at once |
m214962 | 7:b7257f01ced7 | 28 | Thread s1_thread; //creates thread for servo |
m214962 | 7:b7257f01ced7 | 29 | Thread s2_thread; // creates thread for servo2 |
evangeli | 0:ed939452cce3 | 30 | |
evangeli | 5:0c7c692db414 | 31 | /** Callback for executing a simple motor action. When sw1 is high, |
evangeli | 5:0c7c692db414 | 32 | * the motor turns forward, otherwise the motor turns off. |
evangeli | 4:6ccbc7542ddc | 33 | */ |
evangeli | 0:ed939452cce3 | 34 | void m_callback(void); // This function will be run within the corresponding thread |
evangeli | 4:6ccbc7542ddc | 35 | |
evangeli | 5:0c7c692db414 | 36 | /** Simple callback for servo motion. When sw2 is high, the servo steps right, |
evangeli | 5:0c7c692db414 | 37 | * otherwise it steps left. If it hits the ends it stays there. |
evangeli | 4:6ccbc7542ddc | 38 | */ |
evangeli | 0:ed939452cce3 | 39 | void s1_callback(void); |
evangeli | 0:ed939452cce3 | 40 | |
m214962 | 6:ed7539be9fa3 | 41 | void s2_callback(void); |
m214962 | 6:ed7539be9fa3 | 42 | |
evangeli | 0:ed939452cce3 | 43 | // main() runs in its own thread in the OS |
evangeli | 0:ed939452cce3 | 44 | int main() { |
evangeli | 0:ed939452cce3 | 45 | // startup things |
m214962 | 6:ed7539be9fa3 | 46 | printf("ES200 Project 2 Rockem Sockem\n"); |
evangeli | 0:ed939452cce3 | 47 | s1.calibrate(0.0009,90.0); // calibrate servo s1 once at startup |
m214962 | 6:ed7539be9fa3 | 48 | s2.calibrate(0.0009,90.0); //calibrate servo s2 once at startup |
evangeli | 0:ed939452cce3 | 49 | m.speed(0.0); // set motor speed to zero at startup |
evangeli | 0:ed939452cce3 | 50 | |
evangeli | 0:ed939452cce3 | 51 | // start tasks |
m214962 | 7:b7257f01ced7 | 52 | 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 | 53 | m_thread.start(callback(m_callback)); // starts the motor thread going |
evangeli | 0:ed939452cce3 | 54 | s1_thread.start(callback(s1_callback)); // starts the servo thread going |
m214962 | 6:ed7539be9fa3 | 55 | s2_thread.start(callback(s2_callback)); //starts the servo2 thread going |
m214962 | 7:b7257f01ced7 | 56 | printf("\"ding ding ding\" Fight!\n"); |
evangeli | 0:ed939452cce3 | 57 | |
evangeli | 0:ed939452cce3 | 58 | // main loop |
evangeli | 0:ed939452cce3 | 59 | while(1){ |
evangeli | 0:ed939452cce3 | 60 | heartbeat = !heartbeat; // blink heartbeat once a second |
evangeli | 5:0c7c692db414 | 61 | //ThisThread::sleep_for(1000); |
m214962 | 8:990a1c27a5da | 62 | Thread::wait(500+rand()%1000); |
evangeli | 5:0c7c692db414 | 63 | |
m214962 | 8:990a1c27a5da | 64 | // motor or servo stuff not needed here because they are |
evangeli | 0:ed939452cce3 | 65 | // running in their own threads. |
evangeli | 0:ed939452cce3 | 66 | } // main loop |
evangeli | 0:ed939452cce3 | 67 | } // main() |
evangeli | 0:ed939452cce3 | 68 | |
evangeli | 0:ed939452cce3 | 69 | |
evangeli | 0:ed939452cce3 | 70 | |
evangeli | 0:ed939452cce3 | 71 | |
evangeli | 0:ed939452cce3 | 72 | void m_callback(void){ |
m214962 | 7:b7257f01ced7 | 73 | printf("THE fighters are moving back and forth like dancers!!\n"); |
evangeli | 0:ed939452cce3 | 74 | while(1) { |
m214962 | 6:ed7539be9fa3 | 75 | |
m214962 | 6:ed7539be9fa3 | 76 | led1.write(1); // light a light for entertaining purposes |
m214962 | 8:990a1c27a5da | 77 | m.speed(-0.45); // spin motor ahead to move players together |
m214962 | 8:990a1c27a5da | 78 | wait (0.65); //time of motor movement |
m214962 | 6:ed7539be9fa3 | 79 | m.speed(0.0); //stop players when they are close. |
m214962 | 8:990a1c27a5da | 80 | wait (3+rand()%5); //let them fight for a random amount of time |
m214962 | 6:ed7539be9fa3 | 81 | led1.write(0); |
m214962 | 8:990a1c27a5da | 82 | m.speed(0.45); // move the players back |
m214962 | 8:990a1c27a5da | 83 | wait (1.5); //time of opposite motor movement |
m214962 | 8:990a1c27a5da | 84 | |
m214962 | 8:990a1c27a5da | 85 | if (sw4.read()) { |
m214962 | 8:990a1c27a5da | 86 | led4.write(1); |
m214962 | 8:990a1c27a5da | 87 | } |
m214962 | 8:990a1c27a5da | 88 | if (sw1.read()) { |
m214962 | 8:990a1c27a5da | 89 | led5.write(1); |
m214962 | 8:990a1c27a5da | 90 | } |
m214962 | 6:ed7539be9fa3 | 91 | |
m214962 | 8:990a1c27a5da | 92 | //ThisThread::sleep_for(200); // this thread executes 100x a second |
m214962 | 8:990a1c27a5da | 93 | Thread::wait(50); //possibly change to small or erase |
evangeli | 0:ed939452cce3 | 94 | } // while(1) |
evangeli | 0:ed939452cce3 | 95 | } // m_callback() |
evangeli | 0:ed939452cce3 | 96 | |
evangeli | 0:ed939452cce3 | 97 | |
evangeli | 0:ed939452cce3 | 98 | |
evangeli | 0:ed939452cce3 | 99 | void s1_callback(void){ |
m214962 | 7:b7257f01ced7 | 100 | printf("Slappy threw a punch!\n"); |
evangeli | 0:ed939452cce3 | 101 | while(1){ |
evangeli | 0:ed939452cce3 | 102 | if (sw2.read()){ |
m214962 | 6:ed7539be9fa3 | 103 | led2.write(1); // light a light for entertaining purposes |
m214962 | 6:ed7539be9fa3 | 104 | s1.write(s1.read()+0.5); // move servo a step to right |
evangeli | 0:ed939452cce3 | 105 | } |
evangeli | 0:ed939452cce3 | 106 | else{ |
evangeli | 0:ed939452cce3 | 107 | led2.write(0); |
m214962 | 8:990a1c27a5da | 108 | s1.write(0.0); // move servo a step to left |
evangeli | 0:ed939452cce3 | 109 | } |
m214962 | 8:990a1c27a5da | 110 | //ThisThread::sleep_for(200); // this thread executes 100x a second |
m214962 | 8:990a1c27a5da | 111 | Thread::wait(50); //Not used so that switches move players immediately - - - may have to use so that switches can move independently |
evangeli | 0:ed939452cce3 | 112 | } // while(1) |
evangeli | 0:ed939452cce3 | 113 | } // s1_callback() |
m214962 | 6:ed7539be9fa3 | 114 | |
m214962 | 6:ed7539be9fa3 | 115 | void s2_callback(void){ |
m214962 | 7:b7257f01ced7 | 116 | printf("Hitme is fighting back!\n"); |
m214962 | 6:ed7539be9fa3 | 117 | while(1){ |
m214962 | 6:ed7539be9fa3 | 118 | if (sw3.read()){ |
m214962 | 7:b7257f01ced7 | 119 | led3.write(1); // light a light for entertaining purposes |
m214962 | 6:ed7539be9fa3 | 120 | s2.write(s2.read()+0.5); // move servo a step to right |
m214962 | 6:ed7539be9fa3 | 121 | } |
m214962 | 6:ed7539be9fa3 | 122 | else{ |
m214962 | 6:ed7539be9fa3 | 123 | led3.write(0); |
m214962 | 8:990a1c27a5da | 124 | s2.write(0.0); // move servo a step to left |
m214962 | 6:ed7539be9fa3 | 125 | } |
m214962 | 8:990a1c27a5da | 126 | //ThisThread::sleep_for(200); // this thread executes 100x a second |
m214962 | 8:990a1c27a5da | 127 | Thread::wait(50); //possibly change |
m214962 | 6:ed7539be9fa3 | 128 | } // while(1) |
m214962 | 6:ed7539be9fa3 | 129 | } // s2_callback() |