GIU\ZF
Dependencies: MCP23017 WattBob_TextLCD mbed-rtos mbed
Fork of rtos_basic by
tasks/task_group1.cpp@17:a29ce6fc667c, 2018-03-28 (annotated)
- Committer:
- ihexx
- Date:
- Wed Mar 28 00:26:55 2018 +0000
- Revision:
- 17:a29ce6fc667c
- Parent:
- 16:0ada6cbd41e2
- Child:
- 19:2044bb5d7f29
Fixed deadlock bug on debug framework
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
ihexx | 13:ab52f46c98ab | 1 | #include "core.h" |
ihexx | 15:524de2b2ef8e | 2 | namespace display{ |
ihexx | 15:524de2b2ef8e | 3 | //Display on MBED text display • odometer value • average speed |
ihexx | 15:524de2b2ef8e | 4 | const float freq = 2.0f; //hz |
ihexx | 15:524de2b2ef8e | 5 | |
ihexx | 15:524de2b2ef8e | 6 | //I/O |
ihexx | 15:524de2b2ef8e | 7 | MCP23017 *port; |
ihexx | 15:524de2b2ef8e | 8 | WattBob_TextLCD *lcd; |
ihexx | 15:524de2b2ef8e | 9 | |
ihexx | 15:524de2b2ef8e | 10 | void init(){ |
ihexx | 15:524de2b2ef8e | 11 | port = new MCP23017(p9, p10, 0x40); |
ihexx | 15:524de2b2ef8e | 12 | lcd = new WattBob_TextLCD(port); |
ihexx | 15:524de2b2ef8e | 13 | port->write_bit(1,BL_BIT); // LCD backlight on. |
ihexx | 15:524de2b2ef8e | 14 | lcd->cls(); |
ihexx | 15:524de2b2ef8e | 15 | } |
ihexx | 15:524de2b2ef8e | 16 | static inline void hotLoop(){ |
ihexx | 15:524de2b2ef8e | 17 | lcd->cls(); |
ihexx | 15:524de2b2ef8e | 18 | |
ihexx | 15:524de2b2ef8e | 19 | runTimeParams::liveAccess.lock(); |
ihexx | 15:524de2b2ef8e | 20 | float odometer = runTimeParams::odometer; |
ihexx | 15:524de2b2ef8e | 21 | float avgSpeed = runTimeParams::avgSpeed; |
ihexx | 15:524de2b2ef8e | 22 | runTimeParams::liveAccess.unlock(); |
ihexx | 15:524de2b2ef8e | 23 | |
ihexx | 15:524de2b2ef8e | 24 | lcd->locate(0,0); //located col, row. |
ihexx | 15:524de2b2ef8e | 25 | lcd->printf("Odo=%.2f",odometer); |
ihexx | 15:524de2b2ef8e | 26 | |
ihexx | 15:524de2b2ef8e | 27 | lcd->locate(1,0); //located col, row. |
ihexx | 15:524de2b2ef8e | 28 | lcd->printf("Speed=%.2f",avgSpeed); |
ihexx | 15:524de2b2ef8e | 29 | } |
ihexx | 15:524de2b2ef8e | 30 | } |
ihexx | 17:a29ce6fc667c | 31 | namespace brakeIndicator{ |
ihexx | 17:a29ce6fc667c | 32 | //Show use of the brake on a LED on the RedBox Unit |
ihexx | 17:a29ce6fc667c | 33 | const float freq = 2.0f; //hz |
ihexx | 17:a29ce6fc667c | 34 | PwmOut led2(PORT_REDBOX_LED1); |
ihexx | 17:a29ce6fc667c | 35 | static inline void init(){ |
ihexx | 17:a29ce6fc667c | 36 | led2.period_ms(50); |
ihexx | 17:a29ce6fc667c | 37 | } |
ihexx | 17:a29ce6fc667c | 38 | static inline void hotLoop(){ |
ihexx | 17:a29ce6fc667c | 39 | runTimeParams::liveAccess.lock(); |
ihexx | 17:a29ce6fc667c | 40 | led2.write(runTimeParams::brakeForce); |
ihexx | 17:a29ce6fc667c | 41 | runTimeParams::liveAccess.unlock(); |
ihexx | 17:a29ce6fc667c | 42 | |
ihexx | 17:a29ce6fc667c | 43 | } |
ihexx | 17:a29ce6fc667c | 44 | } |
ihexx | 17:a29ce6fc667c | 45 | namespace speedIndicator{ |
ihexx | 17:a29ce6fc667c | 46 | //Monitor speed and if it goes over 88 mph switch on a LED on |
ihexx | 17:a29ce6fc667c | 47 | //the RedBox unit |
ihexx | 17:a29ce6fc667c | 48 | static const float freq = 1; //hz |
ihexx | 17:a29ce6fc667c | 49 | DigitalOut led(PORT_REDBOX_LED1); |
ihexx | 17:a29ce6fc667c | 50 | static inline void init(){ |
ihexx | 17:a29ce6fc667c | 51 | led = 0; |
ihexx | 17:a29ce6fc667c | 52 | } |
ihexx | 17:a29ce6fc667c | 53 | static inline void hotLoop(){ |
ihexx | 17:a29ce6fc667c | 54 | runTimeParams::liveAccess.lock(); |
ihexx | 17:a29ce6fc667c | 55 | led = (runTimeParams::avgSpeed>88); |
ihexx | 17:a29ce6fc667c | 56 | runTimeParams::liveAccess.unlock(); |
ihexx | 17:a29ce6fc667c | 57 | |
ihexx | 17:a29ce6fc667c | 58 | } |
ihexx | 17:a29ce6fc667c | 59 | } |
ihexx | 17:a29ce6fc667c | 60 | namespace sideLights{ |
ihexx | 17:a29ce6fc667c | 61 | //Read a single side light switch and set side lights accordingly |
ihexx | 17:a29ce6fc667c | 62 | static const float freq = 1; //hz |
ihexx | 17:a29ce6fc667c | 63 | DigitalIn lightSwitch(PORT_BRAKE); |
ihexx | 17:a29ce6fc667c | 64 | DigitalOut led(PORT_SIDE_LIGHTS); |
ihexx | 17:a29ce6fc667c | 65 | static inline void hotLoop(){ |
ihexx | 17:a29ce6fc667c | 66 | led = lightSwitch; |
ihexx | 17:a29ce6fc667c | 67 | } |
ihexx | 17:a29ce6fc667c | 68 | |
ihexx | 17:a29ce6fc667c | 69 | } |
ihexx | 17:a29ce6fc667c | 70 | namespace turnSignal{ |
ihexx | 17:a29ce6fc667c | 71 | //Read the two turn indicator switches and flash appropriate |
ihexx | 17:a29ce6fc667c | 72 | //indicator LEDs at a rate of 1Hz. If both switches are switched on |
ihexx | 17:a29ce6fc667c | 73 | //then flash both indicator LEDs at a rate of 2Hz (hazard mode). |
ihexx | 17:a29ce6fc667c | 74 | static const float freq = 0.5; //hz |
ihexx | 17:a29ce6fc667c | 75 | |
ihexx | 17:a29ce6fc667c | 76 | //I/O |
ihexx | 17:a29ce6fc667c | 77 | DigitalIn lSwitch(PORT_TURN_SIGNAL_SWITCH_LEFT); |
ihexx | 17:a29ce6fc667c | 78 | DigitalIn rSwitch(PORT_TURN_SIGNAL_SWITCH_RIGHT); |
ihexx | 17:a29ce6fc667c | 79 | |
ihexx | 17:a29ce6fc667c | 80 | PwmOut lLed(PORT_TURN_SIGNAL_LED_LEFT); |
ihexx | 17:a29ce6fc667c | 81 | PwmOut rLed(PORT_TURN_SIGNAL_LED_RIGHT); |
ihexx | 17:a29ce6fc667c | 82 | |
ihexx | 17:a29ce6fc667c | 83 | static inline void hotLoop(){ |
ihexx | 17:a29ce6fc667c | 84 | int a = lSwitch.read(); |
ihexx | 17:a29ce6fc667c | 85 | int b = rSwitch.read(); |
ihexx | 17:a29ce6fc667c | 86 | if(a&&b){ |
ihexx | 17:a29ce6fc667c | 87 | lLed.period(2.0f); |
ihexx | 17:a29ce6fc667c | 88 | rLed.period(2.0f); |
ihexx | 17:a29ce6fc667c | 89 | } |
ihexx | 17:a29ce6fc667c | 90 | else{ |
ihexx | 17:a29ce6fc667c | 91 | lLed.period(1.0f); |
ihexx | 17:a29ce6fc667c | 92 | rLed.period(1.0f); |
ihexx | 17:a29ce6fc667c | 93 | } |
ihexx | 17:a29ce6fc667c | 94 | a ? lLed.write(0.5f) : lLed.write(0.0f); |
ihexx | 17:a29ce6fc667c | 95 | b ? rLed.write(0.5f) : rLed.write(0.0f); |
ihexx | 17:a29ce6fc667c | 96 | } |
ihexx | 17:a29ce6fc667c | 97 | |
ihexx | 17:a29ce6fc667c | 98 | } |
ihexx | 17:a29ce6fc667c | 99 | |
ihexx | 17:a29ce6fc667c | 100 | |
ihexx | 17:a29ce6fc667c | 101 | |
ihexx | 17:a29ce6fc667c | 102 | |
ihexx | 13:ab52f46c98ab | 103 | |
ihexx | 13:ab52f46c98ab | 104 | namespace task_group_1{ |
ihexx | 13:ab52f46c98ab | 105 | Thread thread; |
ihexx | 13:ab52f46c98ab | 106 | const float freq = 2.0f; //hz |
ihexx | 13:ab52f46c98ab | 107 | |
ihexx | 13:ab52f46c98ab | 108 | |
ihexx | 13:ab52f46c98ab | 109 | void runTask(){ |
ihexx | 13:ab52f46c98ab | 110 | Timer executionTimer,sleepTimer; |
ihexx | 13:ab52f46c98ab | 111 | executionTimer.reset(); |
ihexx | 13:ab52f46c98ab | 112 | sleepTimer.reset(); |
ihexx | 17:a29ce6fc667c | 113 | |
ihexx | 13:ab52f46c98ab | 114 | display::init(); |
ihexx | 17:a29ce6fc667c | 115 | brakeIndicator::init(); |
ihexx | 17:a29ce6fc667c | 116 | speedIndicator::init(); |
ihexx | 13:ab52f46c98ab | 117 | |
ihexx | 13:ab52f46c98ab | 118 | const int const_delay = int((1000.0f/freq)+0.5f); |
ihexx | 13:ab52f46c98ab | 119 | int dynamic_delay = const_delay; |
ihexx | 14:8a6c20435523 | 120 | int tick = 0; |
ihexx | 17:a29ce6fc667c | 121 | int max_exec_time = 0; |
ihexx | 17:a29ce6fc667c | 122 | |
ihexx | 13:ab52f46c98ab | 123 | while(true){ |
ihexx | 13:ab52f46c98ab | 124 | sleepTimer.stop(); |
ihexx | 13:ab52f46c98ab | 125 | executionTimer.start(); |
ihexx | 13:ab52f46c98ab | 126 | int sleepTime = sleepTimer.read_ms(); |
ihexx | 13:ab52f46c98ab | 127 | const int drift = ((sleepTime - dynamic_delay) > 0)? |
ihexx | 13:ab52f46c98ab | 128 | (sleepTime - dynamic_delay) : 0; |
ihexx | 13:ab52f46c98ab | 129 | |
ihexx | 13:ab52f46c98ab | 130 | |
ihexx | 13:ab52f46c98ab | 131 | // Run all tasks |
ihexx | 16:0ada6cbd41e2 | 132 | |
ihexx | 17:a29ce6fc667c | 133 | brakeIndicator::hotLoop(); |
ihexx | 16:0ada6cbd41e2 | 134 | |
ihexx | 17:a29ce6fc667c | 135 | static const int tick_interval_sIndicator = int((freq/speedIndicator::freq)+0.5f); |
ihexx | 17:a29ce6fc667c | 136 | if (!(tick%tick_interval_sIndicator)){ |
ihexx | 17:a29ce6fc667c | 137 | speedIndicator::hotLoop(); |
ihexx | 17:a29ce6fc667c | 138 | sideLights::hotLoop(); |
ihexx | 17:a29ce6fc667c | 139 | } |
ihexx | 17:a29ce6fc667c | 140 | static const int tick_interval_tSignal = int((freq/turnSignal::freq)+0.5f); |
ihexx | 17:a29ce6fc667c | 141 | if (!(tick%tick_interval_tSignal)){ |
ihexx | 17:a29ce6fc667c | 142 | turnSignal::hotLoop(); |
ihexx | 17:a29ce6fc667c | 143 | } |
ihexx | 13:ab52f46c98ab | 144 | |
ihexx | 17:a29ce6fc667c | 145 | display::hotLoop(); |
ihexx | 13:ab52f46c98ab | 146 | |
ihexx | 14:8a6c20435523 | 147 | tick++; |
ihexx | 13:ab52f46c98ab | 148 | executionTimer.stop(); |
ihexx | 13:ab52f46c98ab | 149 | int exec_time = executionTimer.read_ms(); |
ihexx | 17:a29ce6fc667c | 150 | if (exec_time > max_exec_time) max_exec_time=exec_time; |
ihexx | 13:ab52f46c98ab | 151 | |
ihexx | 13:ab52f46c98ab | 152 | #if DEBUG_MODE |
ihexx | 15:524de2b2ef8e | 153 | static const int tick_interval_debug_log = int((freq/dequeueMail::freq)+0.5f); |
ihexx | 15:524de2b2ef8e | 154 | if (!(tick%tick_interval_debug_log)){ |
ihexx | 17:a29ce6fc667c | 155 | runTimeParams::debugAccess.lock(); |
ihexx | 17:a29ce6fc667c | 156 | *runTimeParams::debugLog += "task_group_1," + to_string(max_exec_time) + "," |
ihexx | 14:8a6c20435523 | 157 | + to_string(sleepTime) + "," |
ihexx | 14:8a6c20435523 | 158 | + to_string(drift) + "\n\r"; |
ihexx | 17:a29ce6fc667c | 159 | runTimeParams::debugAccess.unlock(); |
ihexx | 14:8a6c20435523 | 160 | } |
ihexx | 17:a29ce6fc667c | 161 | #else |
ihexx | 17:a29ce6fc667c | 162 | static const int tick_interval_debug_log = 1; |
ihexx | 13:ab52f46c98ab | 163 | #endif |
ihexx | 13:ab52f46c98ab | 164 | |
ihexx | 17:a29ce6fc667c | 165 | static const int tick_LCM = |
ihexx | 17:a29ce6fc667c | 166 | tick_interval_debug_log* |
ihexx | 17:a29ce6fc667c | 167 | tick_interval_sIndicator* |
ihexx | 17:a29ce6fc667c | 168 | tick_interval_tSignal; |
ihexx | 17:a29ce6fc667c | 169 | |
ihexx | 17:a29ce6fc667c | 170 | if (tick==tick_LCM) tick=0; |
ihexx | 17:a29ce6fc667c | 171 | |
ihexx | 13:ab52f46c98ab | 172 | executionTimer.reset(); |
ihexx | 13:ab52f46c98ab | 173 | sleepTimer.reset(); |
ihexx | 13:ab52f46c98ab | 174 | sleepTimer.start(); |
ihexx | 13:ab52f46c98ab | 175 | dynamic_delay = const_delay - (exec_time + drift); |
ihexx | 13:ab52f46c98ab | 176 | Thread::wait(dynamic_delay); |
ihexx | 13:ab52f46c98ab | 177 | } |
ihexx | 13:ab52f46c98ab | 178 | } |
ihexx | 13:ab52f46c98ab | 179 | } |