ADD mail box for gear device

This commit is contained in:
fastium 2025-01-03 20:22:23 +01:00
parent 62fd302d84
commit 4fb09c690c
4 changed files with 99 additions and 76 deletions

View File

@ -62,15 +62,16 @@ static constexpr std::chrono::milliseconds kCPUTaskDelay = 0
static constexpr std::chrono::milliseconds kCPUTaskComputationTime = 0ms; static constexpr std::chrono::milliseconds kCPUTaskComputationTime = 0ms;
BikeSystem::BikeSystem() BikeSystem::BikeSystem()
: _gearDevice(callback(this, &BikeSystem::onGearUp), : _gearDevice(&_mailGearDevice),
callback(this, &BikeSystem::onGearDown)),
_pedalDevice(&_mailPedalDevice), _pedalDevice(&_mailPedalDevice),
_resetDevice(callback(this, &BikeSystem::onReset)), _resetDevice(callback(this, &BikeSystem::onReset)),
_speedometer(_timer), _speedometer(_timer),
_cpuLogger(_timer), _cpuLogger(_timer),
_isrEventThread(osPriorityAboveNormal, OS_STACK_SIZE, nullptr, "ISR_Event"), _isrEventThread(osPriorityAboveNormal, OS_STACK_SIZE, nullptr, "ISR_Event"),
_speedDistanceThread( _speedDistanceThread(
osPriorityNormal, OS_STACK_SIZE, nullptr, "Speed_distance_Task") {} osPriorityNormal, OS_STACK_SIZE, nullptr, "Speed_distance_Task"),
_gearTaskThread(osPriorityNormal, OS_STACK_SIZE, nullptr, "Gear_Task") {}
#if defined(MBED_TEST_MODE) #if defined(MBED_TEST_MODE)
const advembsof::TaskLogger& BikeSystem::getTaskLogger() { return _taskLogger; } const advembsof::TaskLogger& BikeSystem::getTaskLogger() { return _taskLogger; }
#endif // defined(MBED_TEST_MODE) #endif // defined(MBED_TEST_MODE)
@ -96,16 +97,8 @@ void BikeSystem::init() {
} }
void BikeSystem::start() { void BikeSystem::start() {
tr_info("Starting Super-Loop with event handling");
init(); init();
Event<void()> speedDistanceEvent(&_eventQueue,
callback(this, &BikeSystem::speedDistanceTask));
speedDistanceEvent.delay(kSpeedDistanceTaskDelay);
speedDistanceEvent.period(kSpeedDistanceTaskPeriod);
speedDistanceEvent.post();
Event<void()> display1Event(&_eventQueue, callback(this, &BikeSystem::displayTask1)); Event<void()> display1Event(&_eventQueue, callback(this, &BikeSystem::displayTask1));
display1Event.delay(kDisplayTask1Delay); display1Event.delay(kDisplayTask1Delay);
display1Event.period(kDisplayTask1Period); display1Event.period(kDisplayTask1Period);
@ -134,7 +127,12 @@ void BikeSystem::start() {
tr_error("Thread %s started with status %d", _isrEventThread.get_name(), status); tr_error("Thread %s started with status %d", _isrEventThread.get_name(), status);
} }
// dispathc the main queue in the main thread status = _gearTaskThread.start(callback(this, &BikeSystem::loop_gear_task));
if (status != osOK) {
tr_error("Thread %s started with status %d", _gearTaskThread.get_name(), status);
}
// dispatch the main queue in the main thread
dispatch_events(); dispatch_events();
} }
@ -146,19 +144,6 @@ void BikeSystem::onReset() {
resetEvent.post(); resetEvent.post();
} }
void BikeSystem::onGearUp() {
_onGearUpTime = _timer.elapsed_time();
Event<void()> gearUpEvent(&_isrEventQueue, callback(this, &BikeSystem::gearUpTask));
gearUpEvent.post();
}
void BikeSystem::onGearDown() {
_onGearDownTime = _timer.elapsed_time();
Event<void()> gearDownEvent(&_isrEventQueue,
callback(this, &BikeSystem::gearDownTask));
gearDownEvent.post();
}
// ISR thread functions // ISR thread functions
void BikeSystem::resetTask() { void BikeSystem::resetTask() {
@ -166,7 +151,12 @@ void BikeSystem::resetTask() {
std::chrono::microseconds responseTime = _timer.elapsed_time() - _resetTime; std::chrono::microseconds responseTime = _timer.elapsed_time() - _resetTime;
tr_info("Reset task: response time is %" PRIu64 " usecs", responseTime.count()); tr_info("Reset task: response time is %" PRIu64 " usecs", responseTime.count());
// ENTER CRITICAL SECTION
_mutexSpeedometer.lock();
_speedometer.reset(); _speedometer.reset();
_mutexSpeedometer.unlock();
// END CRITICAL SECTION
_taskLogger.logPeriodAndExecutionTime( _taskLogger.logPeriodAndExecutionTime(
_timer, advembsof::TaskLogger::kResetTaskIndex, taskStartTime); _timer, advembsof::TaskLogger::kResetTaskIndex, taskStartTime);
@ -196,6 +186,7 @@ void BikeSystem::speedDistanceTask() {
// ENTER CRITICAL SECTION // ENTER CRITICAL SECTION
_mutexSpeedometer.lock(); _mutexSpeedometer.lock();
tr_info("%d", getCurrentGearSize());
_speedometer.setGearSize(getCurrentGearSize()); _speedometer.setGearSize(getCurrentGearSize());
_mutexSpeed.lock(); _mutexSpeed.lock();
_currentSpeed = _speedometer.getCurrentSpeed(); _currentSpeed = _speedometer.getCurrentSpeed();
@ -210,47 +201,33 @@ void BikeSystem::speedDistanceTask() {
_timer, advembsof::TaskLogger::kSpeedTaskIndex, taskStartTime); _timer, advembsof::TaskLogger::kSpeedTaskIndex, taskStartTime);
} }
/* Gear thread functions */
void BikeSystem::gearTask() {
auto taskStartTime = _timer.elapsed_time();
uint8_t* currentGear = _mailGearDevice.try_get();
if (currentGear != nullptr) {
// ENTER CRITICAL SECTION
_mutexGear.lock();
_currentGear = *currentGear;
_mutexGear.unlock();
_mutexGearSize.lock();
_currentGearSize = bike_computer::kMaxGearSize - *currentGear;
_mutexGearSize.unlock();
// END CRITICAL SECTION
osStatus status = _mailGearDevice.free(currentGear);
if (status != osOK) {
tr_error("free current step in the speed distance tasks doesn't work !");
}
}
_taskLogger.logPeriodAndExecutionTime(
_timer, advembsof::TaskLogger::kSpeedTaskIndex, taskStartTime);
}
/* Main thread functions */ /* Main thread functions */
void BikeSystem::gearUpTask() {
auto taskStartTime = _timer.elapsed_time();
std::chrono::microseconds responseTime = _timer.elapsed_time() - _onGearUpTime;
tr_info("Gear up task: response time is %" PRIu64 " usecs", responseTime.count());
// ENTER CRITICAL SECTION
_mutexGear.lock();
if (_currentGear < bike_computer::kMaxGear) {
_currentGear++;
_mutexGearSize.lock();
_currentGearSize = bike_computer::kMaxGearSize - _currentGear;
_mutexGearSize.unlock();
}
_mutexGear.unlock();
// END CRITICAL SECTION
_taskLogger.logPeriodAndExecutionTime(
_timer, advembsof::TaskLogger::kGearTaskIndex, taskStartTime);
}
void BikeSystem::gearDownTask() {
auto taskStartTime = _timer.elapsed_time();
std::chrono::microseconds responseTime = _timer.elapsed_time() - _onGearDownTime;
tr_info("Gear down task: response time is %" PRIu64 " usecs", responseTime.count());
// ENTER CRITICAL SECTION
_mutexGear.lock();
if (_currentGear > bike_computer::kMinGear) {
_currentGear--;
_mutexGearSize.lock();
_currentGearSize = bike_computer::kMaxGearSize - _currentGear;
_mutexGearSize.unlock();
}
_mutexGear.unlock();
// END CRITICAL SECTION
_taskLogger.logPeriodAndExecutionTime(
_timer, advembsof::TaskLogger::kGearTaskIndex, taskStartTime);
}
void BikeSystem::temperatureTask() { void BikeSystem::temperatureTask() {
auto taskStartTime = _timer.elapsed_time(); auto taskStartTime = _timer.elapsed_time();
@ -313,6 +290,13 @@ void BikeSystem::loop_speed_distance_task() {
} }
} }
void BikeSystem::loop_gear_task() {
tr_info("Start loop gear calculation");
while (true) {
gearTask();
}
}
uint8_t BikeSystem::getCurrentGear() { uint8_t BikeSystem::getCurrentGear() {
uint8_t currentGear; uint8_t currentGear;

View File

@ -63,6 +63,7 @@ class BikeSystem {
private: private:
// private methods // private methods
void init(); void init();
// Main Thread // Main Thread
void temperatureTask(); void temperatureTask();
void displayTask1(); void displayTask1();
@ -71,24 +72,26 @@ class BikeSystem {
// ISR Thread // ISR Thread
void onReset(); void onReset();
void onGearUp();
void onGearDown();
void gearUpTask();
void gearDownTask();
void speedDistanceTask();
void resetTask(); void resetTask();
//
// gear Thread
void gearTask();
// Speed / Distance Thread
void speedDistanceTask();
// GETTER - SETTER
uint8_t getCurrentGear(); uint8_t getCurrentGear();
uint8_t getCurrentGearSize(); uint8_t getCurrentGearSize();
uint32_t getCurrentSpeed(); uint32_t getCurrentSpeed();
uint32_t getCurrentDistance(); uint32_t getCurrentDistance();
void setCurrentGear(uint8_t gear); void setCurrentGear(uint8_t gear);
// Thread functions
void dispatch_isr_events(); void dispatch_isr_events();
void dispatch_events(); void dispatch_events();
void loop_speed_distance_task(); void loop_speed_distance_task();
void loop_gear_task();
// timer instance used for loggint task time and used by ResetDevice // timer instance used for loggint task time and used by ResetDevice
std::chrono::microseconds _resetTime = std::chrono::microseconds::zero(); std::chrono::microseconds _resetTime = std::chrono::microseconds::zero();
@ -137,6 +140,7 @@ class BikeSystem {
// Mail // Mail
Mail<uint32_t, 16> _mailPedalDevice; Mail<uint32_t, 16> _mailPedalDevice;
Mail<uint8_t, 16> _mailGearDevice;
// mutex for shared resource // mutex for shared resource
Mutex _mutexGearSize; Mutex _mutexGearSize;
@ -148,6 +152,7 @@ class BikeSystem {
// Tread for isr events // Tread for isr events
Thread _isrEventThread; Thread _isrEventThread;
Thread _speedDistanceThread; Thread _speedDistanceThread;
Thread _gearTaskThread;
}; };
} // namespace multi_tasking } // namespace multi_tasking

View File

@ -30,6 +30,7 @@
#include <chrono> #include <chrono>
#include "joystick.hpp" #include "joystick.hpp"
#include "mbed_atomic.h"
#include "mbed_trace.h" #include "mbed_trace.h"
#if MBED_CONF_MBED_TRACE_ENABLE #if MBED_CONF_MBED_TRACE_ENABLE
@ -38,9 +39,33 @@
namespace multi_tasking { namespace multi_tasking {
GearDevice::GearDevice(Callback<void()> cbOnUp, Callback<void()> cbOnDown) { GearDevice::GearDevice(Mail<uint8_t, 16>* mailBox) {
disco::Joystick::getInstance().setUpCallback(callback(cbOnUp)); disco::Joystick::getInstance().setUpCallback(callback(this, &GearDevice::onUp));
disco::Joystick::getInstance().setDownCallback(callback(cbOnDown)); disco::Joystick::getInstance().setDownCallback(callback(this, &GearDevice::onDown));
_mailBox = mailBox;
}
void GearDevice::onUp() {
if (_currentGear < bike_computer::kMaxGear) {
core_util_atomic_incr_u8(&_currentGear, 1);
sendMail(core_util_atomic_load_u8(&_currentGear));
}
}
void GearDevice::onDown() {
if (_currentGear > bike_computer::kMinGear) {
core_util_atomic_decr_u8(&_currentGear, 1);
sendMail(core_util_atomic_load_u8(&_currentGear));
}
}
void GearDevice::sendMail(uint32_t data) {
uint8_t* currentGear = _mailBox->try_alloc();
if (currentGear != nullptr) {
*currentGear = data;
_mailBox->put(currentGear);
}
} }
} // namespace multi_tasking } // namespace multi_tasking

View File

@ -26,20 +26,29 @@
#pragma once #pragma once
#include "common/constants.hpp"
#include "mbed.h" #include "mbed.h"
namespace multi_tasking { namespace multi_tasking {
class GearDevice { class GearDevice {
public: public:
GearDevice(Callback<void()> cbOnUp, explicit GearDevice(Mail<uint8_t, 16>* mailBox); // NOLINT(runtime/references)
Callback<void()> cbOnDown); // NOLINT(runtime/references)
// make the class non copyable // make the class non copyable
GearDevice(GearDevice&) = delete; GearDevice(GearDevice&) = delete;
GearDevice& operator=(GearDevice&) = delete; GearDevice& operator=(GearDevice&) = delete;
// method called for updating the bike system // method called for updating the bike system
void onUp();
void onDown();
void sendMail(uint32_t data);
private:
// data members
volatile uint8_t _currentGear = bike_computer::kMinGear;
Mail<uint8_t, 16>* _mailBox;
}; };
} // namespace multi_tasking } // namespace multi_tasking