GIU\ZF

Dependencies:   MCP23017 WattBob_TextLCD mbed-rtos mbed

Fork of rtos_basic by mbed official

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?

UserRevisionLine numberNew 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 }