Embedded Software Assignment 3
Dependencies: MCP23017 Servo WattBob_TextLCD mbed-rtos mbed
Fork of ES_Assignment_3_Pub by
Revision 1:15edb3b6763a, committed 2016-05-27
- Comitter:
- usmb192
- Date:
- Fri May 27 17:02:52 2016 +0000
- Parent:
- 0:6b3496e7a954
- Commit message:
- some cosmetic fixes :)
Changed in this revision
main.cpp | Show annotated file Show diff for this revision Revisions of this file |
diff -r 6b3496e7a954 -r 15edb3b6763a main.cpp --- a/main.cpp Fri May 27 15:56:36 2016 +0000 +++ b/main.cpp Fri May 27 17:02:52 2016 +0000 @@ -11,6 +11,8 @@ For the Display it uses an LCD Screen For the Speedometer it uses an Servo The Emulation and Synchronisation is implemented using TimerThreads and Semaphores + for the reason of existing thread limits, conventional timers are helping to slicing + timeslots @version 1.4 @updateDate 30.03.2016 @@ -57,7 +59,7 @@ void Timer3_void(void const *args); // Timer 3 -// Task Functions + // Task Functions void task1_break_accelerate(); void task2_read_show_engine_state(); void task3_show_odometer(); @@ -70,6 +72,8 @@ void task10_calc_avg_speed(); void task11_emulate_car(); + + // Init Variables int Convert_Hz_to_Ms(double Hz); float accerlator(0); @@ -87,11 +91,12 @@ bool sw_timer11(0); bool sw_timer2(0); bool sw_timer21(0); -int sw_timer3(4); // initalize with a first run +int sw_timer3(4); // sw_timer3 initalize with a first run std::deque<float> AvgSpeedDB; // used for storing the average speed -Semaphore SemAvgSpeedDB(1); + +Semaphore SemAvgSpeedDB(1); // declare used Semaphores Semaphore SemAvgSpeed(1); Semaphore SemSpeed(1); Semaphore SemBreak_Accelerate(1); @@ -127,7 +132,7 @@ lcd->cls(); // clear display lcd->locate(0,0); // set cursor to location (0,0) - top left corner - RtosTimer Timer1(Timer1_void,osTimerPeriodic,(void *)NULL); + RtosTimer Timer1(Timer1_void,osTimerPeriodic,(void *)NULL); // create the necesarry timers to overcome a thread issue (max threads) Timer1.start(Convert_Hz_to_Ms(20.0)); RtosTimer Timer2(Timer2_void,osTimerPeriodic,(void *)NULL); @@ -156,7 +161,7 @@ if(sw_timer1) { // runs just every second time, so at 10 hz task1_break_accelerate(); sw_timer11 = !sw_timer11; - if(sw_timer11) { // runs just every second time, so at 5 hz + if(sw_timer11) { // runs just every fourth time, so at 5 hz task10_calc_avg_speed(); } } @@ -197,7 +202,7 @@ task8_read_single_side_light(); sw_timer21 = !sw_timer21; - if (!indicator_R && indicator_L) { + if (!indicator_R && indicator_L) { // switch the left / right indicator DoutLEDRight=0; DoutLEDLeft=!DoutLEDLeft; } else if(indicator_R && !indicator_L) { @@ -226,8 +231,8 @@ { task6_fill_mail_queue(); if((sw_timer3%4)==0) { // task runs at 0.05 Hz - task7_dump_mail_to_serial(); - sw_timer3=0; + task7_dump_mail_to_serial(); // dump the queue to serial + sw_timer3=0; // reset the timer } sw_timer3++; } @@ -238,9 +243,12 @@ */ void task1_break_accelerate() { + // Let the Semaphores wait SemBreak_Accelerate.wait(); - accerlator = AinAccel; - brake = AinBreak; + + accerlator = AinAccel; // save the accerlator value + brake = AinBreak; // save the brake value + // Let the Semaphores release SemBreak_Accelerate.release(); } @@ -250,9 +258,12 @@ */ void task2_read_show_engine_state() { + // Let the Semaphores wait SemEngine.wait(); - engine = DinSwitchEngine; - DoutLEDEngine = engine; + + engine = DinSwitchEngine; // read the engine state + DoutLEDEngine = engine; // write the engine state + // Let the Semaphores release SemEngine.release(); } @@ -262,8 +273,10 @@ */ void task3_show_odometer() { - SemAvgSpeed.wait(); - Odometer = avgSpeed/250.0; + // Let the Semaphores wait + SemAvgSpeed.wait(); + Odometer = avgSpeed/250.0; // Calculate the odometer + // Let the Semaphores release SemAvgSpeed.release(); } @@ -273,11 +286,13 @@ */ void task4_speed_warning() { + // Let the Semaphores wait SemAvgSpeed.wait(); - if(avgSpeed>75.0) - LEDSpeedWarning = !LEDSpeedWarning; + if(avgSpeed>75.0) // check our speed + LEDSpeedWarning = !LEDSpeedWarning; // and switch the Warning on/off else LEDSpeedWarning = 0; + // Let the Semaphores release SemAvgSpeed.release(); } @@ -287,7 +302,7 @@ */ void task5_update_odometer() { - // Let the Semaphores wait + // Let the Semaphores wait SemDistance.wait(); SemAvgSpeed.wait(); @@ -295,8 +310,7 @@ lcd->printf("s: %5.0f",avgSpeed); lcd->locate(1,0); lcd->printf("d: %5.0f",dist); - - // Let the Semaphores release + // Let the Semaphores release SemDistance.release(); SemAvgSpeed.release(); } @@ -308,19 +322,19 @@ */ void task6_fill_mail_queue() { - // Let the Semaphores wait + // Let the Semaphores wait SemMailCnT.wait(); SemBreak_Accelerate.wait(); SemSpeed.wait(); - mail_t *mail = mail_box.alloc(); - mail->speed = speed; + mail_t *mail = mail_box.alloc(); // reserve the space for our new message + mail->speed = speed; // fill with values mail->accel = accerlator; mail->brake = brake; - mail_box.put(mail); + mail_box.put(mail); // put the new message into the mail queue mailcounter++; - // Let the Semaphores release + // Let the Semaphores release SemBreak_Accelerate.release(); SemSpeed.release(); SemMailCnT.release(); @@ -331,7 +345,7 @@ */ void task7_dump_mail_to_serial() { - // Let the Semaphores wait + // Let the Semaphores wait SemMailCnT.wait(); while(mailcounter) { // as long as we got mail @@ -347,7 +361,7 @@ mailcounter--; } - // Release the Semaphores + // Release the Semaphores SemMailCnT.release(); } @@ -356,7 +370,7 @@ */ void task8_read_single_side_light() { - DoutLEDLight = DinSwitchLight; + DoutLEDLight = DinSwitchLight; // Reading the value } @@ -365,8 +379,8 @@ */ void task9_read_indicators() { - indicator_R = DinSwitchRindic; - indicator_L = DinSwitchLindic; + indicator_R = DinSwitchRindic; // Reading the value + indicator_L = DinSwitchLindic; // Reading the value } @@ -376,16 +390,16 @@ void task10_calc_avg_speed() { - // Let the Semaphores wait + // Let the Semaphores wait SemAvgSpeed.wait(); SemAvgSpeedDB.wait(); float sum(0); for(deque<float>::const_iterator i = AvgSpeedDB.begin(); i != AvgSpeedDB.end(); ++i) - sum+= *i; // calculate the average by iterating over the queue + sum+= *i; // calculate the average by iterating over the queue avgSpeed = sum/AvgSpeedDB.size(); - // Release the Semaphores + // Release the Semaphores SemAvgSpeedDB.release(); SemAvgSpeed.release(); } @@ -396,7 +410,7 @@ */ void task11_emulate_car() { - // Let the Semaphores wait + // Let the Semaphores wait SemAvgSpeed.wait(); SemAvgSpeedDB.wait(); SemDistance.wait(); @@ -404,19 +418,19 @@ SemSpeed.wait(); SemEngine.wait(); - if(accerlator<=brake || !engine) + if(accerlator<=brake || !engine) // are we braking more than accelerating? is the engine on? speed = 0; else speed = (accerlator-brake) *0.5 +speed; if(speed>250) - speed=250; //maximum speed - if(AvgSpeedDB.size()>=4) // if we already got 4 values, we have to - AvgSpeedDB.pop_front(); // make space by deleting the oldest value - AvgSpeedDB.push_back(speed); // safe a new reading + speed=250; // maximum speed + if(AvgSpeedDB.size()>=4) // if we already got 4 values, we have to + AvgSpeedDB.pop_front(); // make space by deleting the oldest value + AvgSpeedDB.push_back(speed); // safe a new reading - dist += speed * 1.0/20.0; // runs at 20 Hz so we have to take this into account + dist += speed * 1.0/20.0; // runs at 20 Hz so we have to take this into account - // Release the Semaphores + // Release the Semaphores SemDistance.release(); SemAvgSpeed.release(); SemAvgSpeedDB.release();