ADD reset button with its own dispatch queue
This commit is contained in:
		| @@ -35,6 +35,28 @@ | ||||
|  | ||||
| namespace multi_tasking { | ||||
|  | ||||
| static constexpr std::chrono::milliseconds kGearTaskPeriod          = 800ms; | ||||
| static constexpr std::chrono::milliseconds kGearTaskDelay           = 0ms; | ||||
| static constexpr std::chrono::milliseconds kGearTaskComputationTime = 100ms; | ||||
| static constexpr std::chrono::milliseconds kSpeedDistanceTaskPeriod = 400ms; | ||||
| static constexpr std::chrono::milliseconds kSpeedDistanceTaskDelay  = 0ms;  // 0 or 100ms | ||||
| static constexpr std::chrono::milliseconds kSpeedDistanceTaskComputationTime = 200ms; | ||||
| static constexpr std::chrono::milliseconds kDisplayTask1Period               = 1600ms; | ||||
| static constexpr std::chrono::milliseconds kDisplayTask1Delay                = 300ms; | ||||
| static constexpr std::chrono::milliseconds kDisplayTask1ComputationTime      = 200ms; | ||||
| static constexpr std::chrono::milliseconds kResetTaskPeriod                  = 800ms; | ||||
| static constexpr std::chrono::milliseconds kResetTaskDelay                   = 700ms; | ||||
| static constexpr std::chrono::milliseconds kResetTaskComputationTime         = 100ms; | ||||
| static constexpr std::chrono::milliseconds kTemperatureTaskPeriod            = 1600ms; | ||||
| static constexpr std::chrono::milliseconds kTemperatureTaskDelay             = 1100ms; | ||||
| static constexpr std::chrono::milliseconds kTemperatureTaskComputationTime   = 100ms; | ||||
| static constexpr std::chrono::milliseconds kDisplayTask2Period               = 1600ms; | ||||
| static constexpr std::chrono::milliseconds kDisplayTask2Delay                = 1200ms; | ||||
| static constexpr std::chrono::milliseconds kDisplayTask2ComputationTime      = 100ms; | ||||
| static constexpr std::chrono::milliseconds kCPUTaskPeriod                    = 1600ms; | ||||
| static constexpr std::chrono::milliseconds kCPUTaskDelay                     = 0ms; | ||||
| static constexpr std::chrono::milliseconds kCPUTaskComputationTime           = 0ms; | ||||
|  | ||||
| BikeSystem::BikeSystem() | ||||
|     : _gearDevice(), | ||||
|       _pedalDevice(), | ||||
| @@ -43,17 +65,46 @@ BikeSystem::BikeSystem() | ||||
|       _cpuLogger(_timer) {} | ||||
|  | ||||
| void BikeSystem::start() { | ||||
|     // new thread dedicated for ISRs with its event queue | ||||
|  | ||||
|     tr_info("Starting Super-Loop with event handling"); | ||||
|  | ||||
|     init(); | ||||
|  | ||||
|     _isrEventThread.start(callback(this, &BikeSystem::dispatch_isr_events)); | ||||
|     _mainEventThread.start(callback(this, &BikeSystem::dispatch_events)); | ||||
|     Event<void()> gearEvent(&_eventQueue, callback(this, &BikeSystem::gearTask)); | ||||
|     gearEvent.delay(kGearTaskDelay); | ||||
|     gearEvent.period(kGearTaskPeriod); | ||||
|     gearEvent.post(); | ||||
|  | ||||
|     Event<void()> speedDistanceEvent(&_eventQueue, | ||||
|                                      callback(this, &BikeSystem::speedDistanceTask)); | ||||
|     speedDistanceEvent.delay(kSpeedDistanceTaskDelay); | ||||
|     speedDistanceEvent.period(kSpeedDistanceTaskPeriod); | ||||
|     speedDistanceEvent.post(); | ||||
|  | ||||
|     Event<void()> display1Event(&_eventQueue, callback(this, &BikeSystem::displayTask1)); | ||||
|     display1Event.delay(kDisplayTask1Delay); | ||||
|     display1Event.period(kDisplayTask1Period); | ||||
|     display1Event.post(); | ||||
|  | ||||
|     Event<void()> temperatureEvent(&_eventQueue, | ||||
|                                    callback(this, &BikeSystem::temperatureTask)); | ||||
|     temperatureEvent.delay(kTemperatureTaskDelay); | ||||
|     temperatureEvent.period(kTemperatureTaskPeriod); | ||||
|     temperatureEvent.post(); | ||||
|  | ||||
|     Event<void()> display2Event(&_eventQueue, callback(this, &BikeSystem::displayTask2)); | ||||
|     display2Event.delay(kDisplayTask2Delay); | ||||
|     display2Event.period(kDisplayTask2Period); | ||||
|     display2Event.post(); | ||||
|  | ||||
|     osStatus status = | ||||
|         _isrEventThread.start(callback(this, &BikeSystem::dispatch_isr_events)); | ||||
|     tr_info("Thread %s started with status %d", _isrEventThread.get_name(), status); | ||||
|  | ||||
|     dispatch_events(); | ||||
| } | ||||
|  | ||||
| void BikeSystem::onReset() { | ||||
|     _resetTime = _timer.elapsed_time(); | ||||
|     Event<void()> resetEvent(&_isrEventQueue, callback(this, &BikeSystem::resetTask)); | ||||
|     resetEvent.post(); | ||||
| } | ||||
| @@ -79,7 +130,7 @@ void BikeSystem::init() { | ||||
|     } | ||||
|  | ||||
|     // enable/disable task logging | ||||
|     _taskLogger.enable(true); | ||||
|     _taskLogger.enable(false); | ||||
| } | ||||
|  | ||||
| void BikeSystem::gearTask() { | ||||
| @@ -128,6 +179,7 @@ void BikeSystem::temperatureTask() { | ||||
| void BikeSystem::resetTask() { | ||||
|     auto taskStartTime = _timer.elapsed_time(); | ||||
|  | ||||
|     std::chrono::microseconds responseTime = _timer.elapsed_time() - _resetTime; | ||||
|     tr_info("Reset task: response time is %" PRIu64 " usecs", responseTime.count()); | ||||
|     _speedometer.reset(); | ||||
|  | ||||
| @@ -163,8 +215,16 @@ void BikeSystem::displayTask2() { | ||||
|  | ||||
| void BikeSystem::cpuTask() { _cpuLogger.printStats(); } | ||||
|  | ||||
| void BikeSystem::dispatch_isr_events() { _isrEventQueue.dispatch_forever(); } | ||||
| void BikeSystem::dispatch_isr_events() { | ||||
|     tr_info("Start dispatching isr events"); | ||||
|     _isrEventQueue.dispatch_forever(); | ||||
|     tr_info("Stop dispatching isr events"); | ||||
| } | ||||
|  | ||||
| void BikeSystem::dispatch_events() { _eventQueue.dispatch_forever(); } | ||||
| void BikeSystem::dispatch_events() { | ||||
|     tr_info("Start dispatching main events"); | ||||
|     _eventQueue.dispatch_forever(); | ||||
|     tr_info("Stop dispatching main events"); | ||||
| } | ||||
|  | ||||
| }  // namespace multi_tasking | ||||
|   | ||||
		Reference in New Issue
	
	Block a user