GIU\ZF

Dependencies:   MCP23017 WattBob_TextLCD mbed-rtos mbed

Fork of rtos_basic by mbed official

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?

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