GIU\ZF
Dependencies: MCP23017 WattBob_TextLCD mbed-rtos mbed
Fork of rtos_basic by
tasks/task_group2.cpp@16:0ada6cbd41e2, 2018-03-27 (annotated)
- Committer:
- ihexx
- Date:
- Tue Mar 27 22:03:07 2018 +0000
- Revision:
- 16:0ada6cbd41e2
- Parent:
- 15:524de2b2ef8e
- Child:
- 17:a29ce6fc667c
completed task merging of carSim, getControls, and engine switch;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
ihexx | 15:524de2b2ef8e | 1 | #include "core.h" |
ihexx | 15:524de2b2ef8e | 2 | namespace getControls{ |
ihexx | 15:524de2b2ef8e | 3 | //I/O |
ihexx | 15:524de2b2ef8e | 4 | AnalogIn brake(PORT_BRAKE); |
ihexx | 15:524de2b2ef8e | 5 | AnalogIn accel(PORT_ACCEL); |
ihexx | 15:524de2b2ef8e | 6 | |
ihexx | 15:524de2b2ef8e | 7 | const float freq = 10.0f; |
ihexx | 15:524de2b2ef8e | 8 | |
ihexx | 15:524de2b2ef8e | 9 | static inline void hotLoop(){ |
ihexx | 15:524de2b2ef8e | 10 | runTimeParams::liveAccess.lock(); |
ihexx | 15:524de2b2ef8e | 11 | runTimeParams::brakeForce = brake.read(); |
ihexx | 15:524de2b2ef8e | 12 | runTimeParams::accelForce = brake.read(); |
ihexx | 15:524de2b2ef8e | 13 | runTimeParams::liveAccess.unlock(); |
ihexx | 15:524de2b2ef8e | 14 | } |
ihexx | 15:524de2b2ef8e | 15 | } |
ihexx | 16:0ada6cbd41e2 | 16 | namespace getIgnition{ |
ihexx | 16:0ada6cbd41e2 | 17 | //Read engine on/off switch and show current state on a LED |
ihexx | 16:0ada6cbd41e2 | 18 | static const float freq = 2; //hz |
ihexx | 16:0ada6cbd41e2 | 19 | |
ihexx | 16:0ada6cbd41e2 | 20 | //I/O |
ihexx | 16:0ada6cbd41e2 | 21 | DigitalIn ignition(PORT_IGNITION); |
ihexx | 16:0ada6cbd41e2 | 22 | DigitalOut led1(IGNITION_LED); |
ihexx | 16:0ada6cbd41e2 | 23 | |
ihexx | 16:0ada6cbd41e2 | 24 | static inline void hotLoop(){ |
ihexx | 16:0ada6cbd41e2 | 25 | led1 = ignition.read(); |
ihexx | 16:0ada6cbd41e2 | 26 | } |
ihexx | 16:0ada6cbd41e2 | 27 | } |
ihexx | 15:524de2b2ef8e | 28 | |
ihexx | 15:524de2b2ef8e | 29 | namespace carSimulator{ |
ihexx | 15:524de2b2ef8e | 30 | Thread thread; |
ihexx | 15:524de2b2ef8e | 31 | const float freq = 20.0f; |
ihexx | 15:524de2b2ef8e | 32 | |
ihexx | 15:524de2b2ef8e | 33 | static inline void hotLoop(){ |
ihexx | 16:0ada6cbd41e2 | 34 | |
ihexx | 15:524de2b2ef8e | 35 | runTimeParams::liveAccess.lock(); |
ihexx | 15:524de2b2ef8e | 36 | //a = (v2-v1)/t |
ihexx | 15:524de2b2ef8e | 37 | //v2 = at+v1 |
ihexx | 16:0ada6cbd41e2 | 38 | const float friction = 0.1f; |
ihexx | 16:0ada6cbd41e2 | 39 | const float accel = (getIgnition::ignition.read())? (runTimeParams::accelForce - |
ihexx | 16:0ada6cbd41e2 | 40 | (runTimeParams::brakeForce+friction)) |
ihexx | 16:0ada6cbd41e2 | 41 | : |
ihexx | 16:0ada6cbd41e2 | 42 | -(runTimeParams::brakeForce+friction); |
ihexx | 16:0ada6cbd41e2 | 43 | |
ihexx | 16:0ada6cbd41e2 | 44 | float tmpSpeed = accel * + |
ihexx | 15:524de2b2ef8e | 45 | runTimeParams::newSpeed; |
ihexx | 15:524de2b2ef8e | 46 | runTimeParams::newSpeed = (tmpSpeed>0)?tmpSpeed:0; |
ihexx | 15:524de2b2ef8e | 47 | runTimeParams::liveAccess.unlock(); |
ihexx | 15:524de2b2ef8e | 48 | } |
ihexx | 15:524de2b2ef8e | 49 | } |
ihexx | 16:0ada6cbd41e2 | 50 | namespace filterSpeed{ |
ihexx | 16:0ada6cbd41e2 | 51 | static const float freq = 5; //hz |
ihexx | 16:0ada6cbd41e2 | 52 | |
ihexx | 16:0ada6cbd41e2 | 53 | //I/O |
ihexx | 16:0ada6cbd41e2 | 54 | float speed[3] = {0}; |
ihexx | 16:0ada6cbd41e2 | 55 | |
ihexx | 16:0ada6cbd41e2 | 56 | void runTask(){ |
ihexx | 16:0ada6cbd41e2 | 57 | //Filter speed with averaging filter |
ihexx | 16:0ada6cbd41e2 | 58 | //• average of last ‘n’ readings (e.g. n =3) |
ihexx | 16:0ada6cbd41e2 | 59 | //(raw speed value will be computed by the “car simulator” |
ihexx | 16:0ada6cbd41e2 | 60 | //process) |
ihexx | 16:0ada6cbd41e2 | 61 | while(1){ |
ihexx | 16:0ada6cbd41e2 | 62 | wait(1/freq); |
ihexx | 16:0ada6cbd41e2 | 63 | float avgSpeed = (speed[0] + speed[1] +speed[2])/3; |
ihexx | 16:0ada6cbd41e2 | 64 | runTimeParams::liveAccess.lock(); |
ihexx | 16:0ada6cbd41e2 | 65 | runTimeParams::avgSpeed = avgSpeed; |
ihexx | 16:0ada6cbd41e2 | 66 | runTimeParams::liveAccess.unlock(); |
ihexx | 16:0ada6cbd41e2 | 67 | |
ihexx | 16:0ada6cbd41e2 | 68 | } |
ihexx | 16:0ada6cbd41e2 | 69 | } |
ihexx | 16:0ada6cbd41e2 | 70 | } |
ihexx | 15:524de2b2ef8e | 71 | |
ihexx | 15:524de2b2ef8e | 72 | namespace task_group_2{ |
ihexx | 15:524de2b2ef8e | 73 | Thread thread; |
ihexx | 15:524de2b2ef8e | 74 | const float freq = 20.0f; //hz |
ihexx | 16:0ada6cbd41e2 | 75 | DigitalOut led2(LED2); |
ihexx | 15:524de2b2ef8e | 76 | |
ihexx | 15:524de2b2ef8e | 77 | void runTask(){ |
ihexx | 15:524de2b2ef8e | 78 | Timer executionTimer,sleepTimer; |
ihexx | 15:524de2b2ef8e | 79 | executionTimer.reset(); |
ihexx | 15:524de2b2ef8e | 80 | sleepTimer.reset(); |
ihexx | 15:524de2b2ef8e | 81 | |
ihexx | 15:524de2b2ef8e | 82 | const int const_delay = int((1000.0f/freq)+0.5f); |
ihexx | 15:524de2b2ef8e | 83 | int dynamic_delay = const_delay; |
ihexx | 15:524de2b2ef8e | 84 | int tick = 0; |
ihexx | 16:0ada6cbd41e2 | 85 | |
ihexx | 15:524de2b2ef8e | 86 | while(true){ |
ihexx | 16:0ada6cbd41e2 | 87 | |
ihexx | 16:0ada6cbd41e2 | 88 | |
ihexx | 16:0ada6cbd41e2 | 89 | sleepTimer.stop(); |
ihexx | 16:0ada6cbd41e2 | 90 | executionTimer.start(); |
ihexx | 16:0ada6cbd41e2 | 91 | |
ihexx | 16:0ada6cbd41e2 | 92 | |
ihexx | 16:0ada6cbd41e2 | 93 | int sleepTime = sleepTimer.read_ms(); |
ihexx | 16:0ada6cbd41e2 | 94 | const int drift = ((sleepTime - dynamic_delay) > 0)? |
ihexx | 16:0ada6cbd41e2 | 95 | (sleepTime - dynamic_delay) : 0; |
ihexx | 15:524de2b2ef8e | 96 | |
ihexx | 16:0ada6cbd41e2 | 97 | |
ihexx | 16:0ada6cbd41e2 | 98 | // Run all tasks-------------- |
ihexx | 16:0ada6cbd41e2 | 99 | carSimulator::hotLoop(); |
ihexx | 16:0ada6cbd41e2 | 100 | |
ihexx | 16:0ada6cbd41e2 | 101 | static const int tick_interval_controls = int((freq/getControls::freq)+0.5f); |
ihexx | 16:0ada6cbd41e2 | 102 | if (!(tick%tick_interval_controls)) getControls::hotLoop(); |
ihexx | 16:0ada6cbd41e2 | 103 | |
ihexx | 16:0ada6cbd41e2 | 104 | static const int tick_interval_ignitionLED = int((freq/getIgnition::freq)+0.5f); |
ihexx | 16:0ada6cbd41e2 | 105 | if (!(tick%tick_interval_ignitionLED )) getIgnition::hotLoop(); |
ihexx | 15:524de2b2ef8e | 106 | // Completed tasks |
ihexx | 15:524de2b2ef8e | 107 | |
ihexx | 16:0ada6cbd41e2 | 108 | tick++; |
ihexx | 16:0ada6cbd41e2 | 109 | executionTimer.stop(); |
ihexx | 16:0ada6cbd41e2 | 110 | int exec_time = executionTimer.read_ms(); |
ihexx | 15:524de2b2ef8e | 111 | |
ihexx | 15:524de2b2ef8e | 112 | #if DEBUG_MODE |
ihexx | 16:0ada6cbd41e2 | 113 | const int debug_log_interval = int(freq/dequeueMail::freq); |
ihexx | 16:0ada6cbd41e2 | 114 | if (!(tick%debug_log_interval)){ |
ihexx | 16:0ada6cbd41e2 | 115 | runTimeParams::liveAccess.lock(); |
ihexx | 16:0ada6cbd41e2 | 116 | runTimeParams::debugLog += "task_group_2," + to_string(exec_time) + "," |
ihexx | 16:0ada6cbd41e2 | 117 | + to_string(sleepTime) + "," |
ihexx | 16:0ada6cbd41e2 | 118 | + to_string(drift) + "\n\r"; |
ihexx | 16:0ada6cbd41e2 | 119 | |
ihexx | 16:0ada6cbd41e2 | 120 | runTimeParams::liveAccess.unlock(); |
ihexx | 16:0ada6cbd41e2 | 121 | } |
ihexx | 16:0ada6cbd41e2 | 122 | static const int tick_LCM = (debug_log_interval*tick_interval_ignitionLED*tick_interval_controls); |
ihexx | 16:0ada6cbd41e2 | 123 | if (tick==tick_LCM) tick=0; |
ihexx | 15:524de2b2ef8e | 124 | #endif |
ihexx | 15:524de2b2ef8e | 125 | |
ihexx | 16:0ada6cbd41e2 | 126 | executionTimer.reset(); |
ihexx | 16:0ada6cbd41e2 | 127 | sleepTimer.reset(); |
ihexx | 16:0ada6cbd41e2 | 128 | sleepTimer.start(); |
ihexx | 16:0ada6cbd41e2 | 129 | |
ihexx | 16:0ada6cbd41e2 | 130 | dynamic_delay = const_delay -drift; |
ihexx | 15:524de2b2ef8e | 131 | Thread::wait(dynamic_delay); |
ihexx | 15:524de2b2ef8e | 132 | } |
ihexx | 15:524de2b2ef8e | 133 | } |
ihexx | 15:524de2b2ef8e | 134 | } |