2024-11-26 16:26:41 +01:00
|
|
|
// Copyright 2022 Haute école d'ingénierie et d'architecture de Fribourg
|
|
|
|
//
|
|
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
// you may not use this file except in compliance with the License.
|
|
|
|
// You may obtain a copy of the License at
|
|
|
|
//
|
|
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
//
|
|
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
// See the License for the specific language governing permissions and
|
|
|
|
// limitations under the License.
|
|
|
|
|
|
|
|
/****************************************************************************
|
|
|
|
* @file bike_system.cpp
|
|
|
|
* @author Serge Ayer <serge.ayer@hefr.ch>
|
|
|
|
* @author Rémi Heredero <remi@heredero.ch>
|
|
|
|
* @author Yann Sierro <yannsierro.pro@gmail.com>
|
|
|
|
*
|
|
|
|
* @brief Bike System implementation (static scheduling)
|
|
|
|
*
|
|
|
|
* @date 2023-11-15
|
|
|
|
* @version 1.1.0
|
|
|
|
***************************************************************************/
|
|
|
|
|
|
|
|
#include "bike_system.hpp"
|
|
|
|
|
|
|
|
#include <chrono>
|
2025-01-06 00:14:43 +01:00
|
|
|
#include <cstdint>
|
2024-11-26 16:26:41 +01:00
|
|
|
|
2025-01-06 00:14:43 +01:00
|
|
|
#include "cmsis_os.h"
|
|
|
|
#include "common/constants.hpp"
|
2024-11-26 16:26:41 +01:00
|
|
|
#include "mbed_trace.h"
|
2025-01-06 00:14:43 +01:00
|
|
|
|
2024-11-26 16:26:41 +01:00
|
|
|
#if MBED_CONF_MBED_TRACE_ENABLE
|
|
|
|
#define TRACE_GROUP "BikeSystem"
|
|
|
|
#endif // MBED_CONF_MBED_TRACE_ENABLE
|
|
|
|
|
|
|
|
namespace multi_tasking {
|
|
|
|
|
2025-01-06 11:05:23 +01:00
|
|
|
static constexpr std::chrono::milliseconds kGearTaskComputationTime = 100ms;
|
2024-12-31 10:31:00 +01:00
|
|
|
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 kTemperatureTaskPeriod = 1600ms;
|
|
|
|
static constexpr std::chrono::milliseconds kTemperatureTaskDelay = 1100ms;
|
|
|
|
static constexpr std::chrono::milliseconds kTemperatureTaskComputationTime = 100ms;
|
|
|
|
static constexpr std::chrono::milliseconds kCPUTaskPeriod = 1600ms;
|
|
|
|
static constexpr std::chrono::milliseconds kCPUTaskDelay = 0ms;
|
|
|
|
|
2024-12-30 16:56:04 +01:00
|
|
|
BikeSystem::BikeSystem()
|
2025-01-04 15:51:51 +01:00
|
|
|
: _timer(),
|
|
|
|
_isrEventQueue(),
|
|
|
|
_eventQueue(),
|
|
|
|
_mailPedalDevice(),
|
|
|
|
_mailGearDevice(),
|
|
|
|
_mutexGearSize(),
|
|
|
|
_mutexGear(),
|
|
|
|
_mutexSpeed(),
|
|
|
|
_mutexDistance(),
|
|
|
|
_mutexSpeedometer(),
|
2025-01-03 17:10:42 +01:00
|
|
|
_isrEventThread(osPriorityAboveNormal, OS_STACK_SIZE, nullptr, "ISR_Event"),
|
|
|
|
_speedDistanceThread(
|
2025-01-03 20:22:23 +01:00
|
|
|
osPriorityNormal, OS_STACK_SIZE, nullptr, "Speed_distance_Task"),
|
2025-01-06 00:14:43 +01:00
|
|
|
_gearTaskThread(osPriorityAboveNormal, OS_STACK_SIZE, nullptr, "Gear_Task"),
|
2025-01-04 15:51:51 +01:00
|
|
|
_gearDevice(&_mailGearDevice, _timer),
|
|
|
|
_pedalDevice(&_mailPedalDevice, _timer),
|
|
|
|
_resetDevice(callback(this, &BikeSystem::onReset)),
|
|
|
|
_displayDevice(),
|
|
|
|
_speedometer(_timer),
|
|
|
|
_sensorDevice(),
|
|
|
|
_taskLogger(),
|
|
|
|
_cpuLogger(_timer) {}
|
2025-01-03 20:22:23 +01:00
|
|
|
|
2025-01-03 17:10:42 +01:00
|
|
|
#if defined(MBED_TEST_MODE)
|
|
|
|
const advembsof::TaskLogger& BikeSystem::getTaskLogger() { return _taskLogger; }
|
2025-01-04 16:41:02 +01:00
|
|
|
|
2025-01-06 00:14:43 +01:00
|
|
|
bike_computer::Speedometer& BikeSystem::getSpeedometer() {
|
|
|
|
// ENTER CRITICAL SECTION
|
2025-01-04 16:41:02 +01:00
|
|
|
_mutexSpeedometer.lock();
|
|
|
|
bike_computer::Speedometer& speedometer = _speedometer;
|
|
|
|
_mutexSpeedometer.unlock();
|
2025-01-06 00:14:43 +01:00
|
|
|
// END CRITICAL SECTION
|
|
|
|
|
2025-01-04 16:41:02 +01:00
|
|
|
return speedometer;
|
|
|
|
}
|
|
|
|
|
2025-01-06 00:14:43 +01:00
|
|
|
GearDevice& BikeSystem::getGearDevice() { return _gearDevice; }
|
|
|
|
|
|
|
|
void BikeSystem::setCallbackGearChage(Callback<void()> cbGearChange) {
|
|
|
|
_cbGearChange = cbGearChange;
|
|
|
|
}
|
|
|
|
|
2025-01-03 17:10:42 +01:00
|
|
|
#endif // defined(MBED_TEST_MODE)
|
|
|
|
|
|
|
|
void BikeSystem::init() {
|
|
|
|
// start the timer
|
|
|
|
_timer.start();
|
|
|
|
|
|
|
|
// initialize the lcd display
|
|
|
|
disco::ReturnCode rc = _displayDevice.init();
|
|
|
|
if (rc != disco::ReturnCode::Ok) {
|
2025-01-06 00:14:43 +01:00
|
|
|
tr_error("Ffalseailed to initialized the lcd display: %d", static_cast<int>(rc));
|
2025-01-03 17:10:42 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
// initialize the sensor device
|
|
|
|
bool present = _sensorDevice.init();
|
|
|
|
if (!present) {
|
|
|
|
tr_error("Sensor not present or initialization failed");
|
|
|
|
}
|
|
|
|
|
|
|
|
// enable/disable task logging
|
2025-01-06 00:14:43 +01:00
|
|
|
bool runTaskLogger = false;
|
|
|
|
|
|
|
|
#if defined(MBED_TEST_MODE)
|
|
|
|
runTaskLogger = true;
|
|
|
|
#endif
|
|
|
|
|
|
|
|
_taskLogger.enable(runTaskLogger);
|
2025-01-03 17:10:42 +01:00
|
|
|
}
|
2024-11-26 16:26:41 +01:00
|
|
|
|
|
|
|
void BikeSystem::start() {
|
|
|
|
init();
|
|
|
|
|
2024-12-31 10:31:00 +01:00
|
|
|
Event<void()> temperatureEvent(&_eventQueue,
|
|
|
|
callback(this, &BikeSystem::temperatureTask));
|
|
|
|
temperatureEvent.delay(kTemperatureTaskDelay);
|
|
|
|
temperatureEvent.period(kTemperatureTaskPeriod);
|
|
|
|
temperatureEvent.post();
|
|
|
|
|
2025-01-04 15:51:51 +01:00
|
|
|
Event<void()> displayEvent(&_eventQueue, callback(this, &BikeSystem::displayTask));
|
|
|
|
displayEvent.delay(kDisplayTask1Delay);
|
|
|
|
displayEvent.period(kDisplayTask1Period);
|
|
|
|
displayEvent.post();
|
2024-12-31 10:31:00 +01:00
|
|
|
|
|
|
|
osStatus status =
|
|
|
|
_isrEventThread.start(callback(this, &BikeSystem::dispatch_isr_events));
|
2024-12-31 13:47:36 +01:00
|
|
|
if (status != osOK) {
|
2025-01-06 00:14:43 +01:00
|
|
|
tr_error("Thread %s started with status %ld",
|
|
|
|
_isrEventThread.get_name(),
|
|
|
|
static_cast<int32_t>(status));
|
2024-12-31 13:47:36 +01:00
|
|
|
}
|
2024-12-31 10:31:00 +01:00
|
|
|
|
2025-01-03 17:10:42 +01:00
|
|
|
status =
|
|
|
|
_speedDistanceThread.start(callback(this, &BikeSystem::loop_speed_distance_task));
|
|
|
|
if (status != osOK) {
|
2025-01-06 00:14:43 +01:00
|
|
|
tr_error("Thread %s started with status %ld",
|
|
|
|
_isrEventThread.get_name(),
|
|
|
|
static_cast<int32_t>(status));
|
2025-01-03 17:10:42 +01:00
|
|
|
}
|
|
|
|
|
2025-01-03 20:22:23 +01:00
|
|
|
status = _gearTaskThread.start(callback(this, &BikeSystem::loop_gear_task));
|
|
|
|
if (status != osOK) {
|
2025-01-06 00:14:43 +01:00
|
|
|
tr_error("Thread %s started with status %ld",
|
|
|
|
_gearTaskThread.get_name(),
|
|
|
|
static_cast<int32_t>(status));
|
2025-01-03 20:22:23 +01:00
|
|
|
}
|
|
|
|
|
2025-01-04 15:51:51 +01:00
|
|
|
#if !defined(MBED_TEST_MODE)
|
|
|
|
Event<void()> cpuEvent(&_eventQueue, callback(this, &BikeSystem::cpuTask));
|
|
|
|
cpuEvent.delay(kCPUTaskDelay);
|
|
|
|
cpuEvent.period(kCPUTaskPeriod);
|
|
|
|
cpuEvent.post();
|
|
|
|
#endif
|
|
|
|
|
2025-01-03 20:22:23 +01:00
|
|
|
// dispatch the main queue in the main thread
|
2024-12-31 10:31:00 +01:00
|
|
|
dispatch_events();
|
2024-11-26 16:26:41 +01:00
|
|
|
}
|
|
|
|
|
2025-01-06 00:14:43 +01:00
|
|
|
void BikeSystem::stop() {
|
|
|
|
osStatus status = _isrEventThread.terminate();
|
|
|
|
status += _speedDistanceThread.terminate();
|
|
|
|
status += _gearTaskThread.terminate();
|
|
|
|
if (status != 0) {
|
|
|
|
tr_error("Stop thread error");
|
|
|
|
}
|
|
|
|
tr_info("Bike system has stopped !");
|
|
|
|
}
|
|
|
|
|
2025-01-03 17:10:42 +01:00
|
|
|
/* Callback from isr */
|
|
|
|
|
2024-11-26 16:26:41 +01:00
|
|
|
void BikeSystem::onReset() {
|
2024-12-31 10:31:00 +01:00
|
|
|
_resetTime = _timer.elapsed_time();
|
2024-12-30 16:56:04 +01:00
|
|
|
Event<void()> resetEvent(&_isrEventQueue, callback(this, &BikeSystem::resetTask));
|
|
|
|
resetEvent.post();
|
2024-11-26 16:26:41 +01:00
|
|
|
}
|
|
|
|
|
2025-01-03 17:10:42 +01:00
|
|
|
// ISR thread functions
|
2024-11-26 16:26:41 +01:00
|
|
|
|
2025-01-03 17:10:42 +01:00
|
|
|
void BikeSystem::resetTask() {
|
2025-01-06 00:14:43 +01:00
|
|
|
#if !defined(MBED_TEST_MODE)
|
2025-01-03 17:10:42 +01:00
|
|
|
auto taskStartTime = _timer.elapsed_time();
|
2024-11-26 16:26:41 +01:00
|
|
|
|
2025-01-03 17:10:42 +01:00
|
|
|
std::chrono::microseconds responseTime = _timer.elapsed_time() - _resetTime;
|
|
|
|
tr_info("Reset task: response time is %" PRIu64 " usecs", responseTime.count());
|
2025-01-04 16:41:02 +01:00
|
|
|
#endif
|
2025-01-03 20:22:23 +01:00
|
|
|
// ENTER CRITICAL SECTION
|
|
|
|
_mutexSpeedometer.lock();
|
2025-01-03 17:10:42 +01:00
|
|
|
_speedometer.reset();
|
2025-01-03 20:22:23 +01:00
|
|
|
_mutexSpeedometer.unlock();
|
|
|
|
// END CRITICAL SECTION
|
2024-11-26 16:26:41 +01:00
|
|
|
|
2025-01-06 00:14:43 +01:00
|
|
|
#if !defined(MBED_TEST_MODE)
|
2025-01-03 17:10:42 +01:00
|
|
|
_taskLogger.logPeriodAndExecutionTime(
|
|
|
|
_timer, advembsof::TaskLogger::kResetTaskIndex, taskStartTime);
|
2025-01-04 16:41:02 +01:00
|
|
|
#endif
|
2025-01-03 17:10:42 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
// Speed distance thread functions
|
|
|
|
|
|
|
|
void BikeSystem::speedDistanceTask() {
|
|
|
|
auto taskStartTime = _timer.elapsed_time();
|
|
|
|
|
2025-01-04 15:51:51 +01:00
|
|
|
pedalMail_t* currentStep = _mailPedalDevice.try_get();
|
2025-01-03 17:10:42 +01:00
|
|
|
|
|
|
|
if (currentStep != nullptr) {
|
2025-01-04 15:51:51 +01:00
|
|
|
const auto pedalRotationTime =
|
|
|
|
PedalDevice::getCurrentRotationTime(currentStep->step);
|
2025-01-03 17:10:42 +01:00
|
|
|
|
|
|
|
// ENTER CRITICAL SECTION
|
|
|
|
_mutexSpeedometer.lock();
|
|
|
|
_speedometer.setCurrentRotationTime(pedalRotationTime);
|
|
|
|
_mutexSpeedometer.unlock();
|
|
|
|
// END CRITICAL SECTION
|
2025-01-04 15:51:51 +01:00
|
|
|
|
|
|
|
std::chrono::microseconds responseTime =
|
|
|
|
_timer.elapsed_time() - currentStep->callTime;
|
2025-01-06 00:14:43 +01:00
|
|
|
tr_info("Speed distance task: response time is %" PRIu64 " usecs",
|
|
|
|
responseTime.count());
|
2025-01-04 15:51:51 +01:00
|
|
|
|
|
|
|
osStatus status = _mailPedalDevice.free(currentStep);
|
|
|
|
if (status != osOK) {
|
|
|
|
tr_error("free current step in the speed distance tasks doesn't work !");
|
|
|
|
}
|
2024-11-26 16:26:41 +01:00
|
|
|
}
|
|
|
|
|
2025-01-03 17:10:42 +01:00
|
|
|
// ENTER CRITICAL SECTION
|
|
|
|
_mutexSpeedometer.lock();
|
|
|
|
_speedometer.setGearSize(getCurrentGearSize());
|
|
|
|
_mutexSpeed.lock();
|
|
|
|
_currentSpeed = _speedometer.getCurrentSpeed();
|
|
|
|
_mutexSpeed.unlock();
|
|
|
|
_mutexDistance.lock();
|
|
|
|
_traveledDistance = _speedometer.getDistance();
|
|
|
|
_mutexDistance.unlock();
|
|
|
|
_mutexSpeedometer.unlock();
|
|
|
|
// END CRITICAL SECTION
|
|
|
|
|
2025-01-06 00:14:43 +01:00
|
|
|
ThisThread::sleep_for(std::chrono::duration_cast<std::chrono::milliseconds>(
|
|
|
|
kSpeedDistanceTaskComputationTime - (_timer.elapsed_time() - taskStartTime)));
|
|
|
|
|
2025-01-03 17:10:42 +01:00
|
|
|
_taskLogger.logPeriodAndExecutionTime(
|
|
|
|
_timer, advembsof::TaskLogger::kSpeedTaskIndex, taskStartTime);
|
2024-11-26 16:26:41 +01:00
|
|
|
}
|
|
|
|
|
2025-01-03 20:22:23 +01:00
|
|
|
/* Gear thread functions */
|
|
|
|
void BikeSystem::gearTask() {
|
|
|
|
auto taskStartTime = _timer.elapsed_time();
|
2025-01-03 17:10:42 +01:00
|
|
|
|
2025-01-04 15:51:51 +01:00
|
|
|
gearMail_t* currentGear = _mailGearDevice.try_get();
|
2024-12-31 13:47:36 +01:00
|
|
|
|
2025-01-03 20:22:23 +01:00
|
|
|
if (currentGear != nullptr) {
|
2025-01-06 00:14:43 +01:00
|
|
|
#if !defined(MBED_TEST_MODE)
|
|
|
|
std::chrono::microseconds responseTime =
|
|
|
|
_timer.elapsed_time() - currentGear->callTime;
|
|
|
|
tr_info("Gear task: response time is %" PRIu64 " usecs", responseTime.count());
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#if defined(MBED_TEST_MODE)
|
|
|
|
_cbGearChange();
|
|
|
|
#endif
|
|
|
|
|
2025-01-03 20:22:23 +01:00
|
|
|
// ENTER CRITICAL SECTION
|
|
|
|
_mutexGear.lock();
|
2025-01-04 15:51:51 +01:00
|
|
|
_currentGear = currentGear->gear;
|
2025-01-03 20:22:23 +01:00
|
|
|
_mutexGear.unlock();
|
2025-01-03 17:10:42 +01:00
|
|
|
_mutexGearSize.lock();
|
2025-01-04 15:51:51 +01:00
|
|
|
_currentGearSize = bike_computer::kMaxGearSize - currentGear->gear;
|
2025-01-03 17:10:42 +01:00
|
|
|
_mutexGearSize.unlock();
|
2025-01-03 20:22:23 +01:00
|
|
|
// END CRITICAL SECTION
|
2024-12-31 13:47:36 +01:00
|
|
|
|
2025-01-03 20:22:23 +01:00
|
|
|
osStatus status = _mailGearDevice.free(currentGear);
|
|
|
|
if (status != osOK) {
|
2025-01-04 15:51:51 +01:00
|
|
|
tr_error("free current gear in the gear tasks doesn't work !");
|
2025-01-03 20:22:23 +01:00
|
|
|
}
|
2024-12-31 13:47:36 +01:00
|
|
|
}
|
2025-01-06 00:14:43 +01:00
|
|
|
|
|
|
|
ThisThread::sleep_for(std::chrono::duration_cast<std::chrono::milliseconds>(
|
|
|
|
kGearTaskComputationTime - (_timer.elapsed_time() - taskStartTime)));
|
|
|
|
|
2024-11-26 16:26:41 +01:00
|
|
|
_taskLogger.logPeriodAndExecutionTime(
|
2025-01-06 00:14:43 +01:00
|
|
|
_timer, advembsof::TaskLogger::kGearTaskIndex, taskStartTime);
|
2024-11-26 16:26:41 +01:00
|
|
|
}
|
|
|
|
|
2025-01-03 20:22:23 +01:00
|
|
|
/* Main thread functions */
|
|
|
|
|
2024-11-26 16:26:41 +01:00
|
|
|
void BikeSystem::temperatureTask() {
|
|
|
|
auto taskStartTime = _timer.elapsed_time();
|
|
|
|
|
|
|
|
// no need to protect access to data members (single threaded)
|
|
|
|
_currentTemperature = _sensorDevice.readTemperature();
|
|
|
|
|
2024-12-30 16:56:04 +01:00
|
|
|
ThisThread::sleep_for(std::chrono::duration_cast<std::chrono::milliseconds>(
|
|
|
|
kTemperatureTaskComputationTime - (_timer.elapsed_time() - taskStartTime)));
|
2024-11-26 16:26:41 +01:00
|
|
|
|
|
|
|
_taskLogger.logPeriodAndExecutionTime(
|
|
|
|
_timer, advembsof::TaskLogger::kTemperatureTaskIndex, taskStartTime);
|
|
|
|
}
|
|
|
|
|
2025-01-04 15:51:51 +01:00
|
|
|
void BikeSystem::displayTask() {
|
2024-11-26 16:26:41 +01:00
|
|
|
auto taskStartTime = _timer.elapsed_time();
|
|
|
|
|
2025-01-03 17:10:42 +01:00
|
|
|
// ENTER CRITICAL SECTION
|
2024-12-31 13:47:36 +01:00
|
|
|
_displayDevice.displayGear(getCurrentGear());
|
2025-01-03 17:10:42 +01:00
|
|
|
_displayDevice.displaySpeed(getCurrentSpeed());
|
|
|
|
_displayDevice.displayDistance(getCurrentDistance());
|
|
|
|
// END CRITICAL SECTION
|
2024-11-26 16:26:41 +01:00
|
|
|
|
|
|
|
_displayDevice.displayTemperature(_currentTemperature);
|
|
|
|
|
2025-01-04 15:51:51 +01:00
|
|
|
// ThisThread::sleep_for(std::chrono::duration_cast<std::chrono::milliseconds>(kDisplayTask1ComputationTime
|
|
|
|
// - (_timer.elapsed_time() - taskStartTime)));
|
2024-11-26 16:26:41 +01:00
|
|
|
|
|
|
|
_taskLogger.logPeriodAndExecutionTime(
|
2025-01-04 15:51:51 +01:00
|
|
|
_timer, advembsof::TaskLogger::kDisplayTask1Index, taskStartTime);
|
2024-11-26 16:26:41 +01:00
|
|
|
}
|
|
|
|
|
2024-12-30 16:56:04 +01:00
|
|
|
void BikeSystem::cpuTask() { _cpuLogger.printStats(); }
|
|
|
|
|
2024-12-31 10:31:00 +01:00
|
|
|
void BikeSystem::dispatch_isr_events() {
|
|
|
|
tr_info("Start dispatching isr events");
|
|
|
|
_isrEventQueue.dispatch_forever();
|
|
|
|
tr_info("Stop dispatching isr events");
|
|
|
|
}
|
2024-12-30 16:56:04 +01:00
|
|
|
|
2024-12-31 10:31:00 +01:00
|
|
|
void BikeSystem::dispatch_events() {
|
|
|
|
tr_info("Start dispatching main events");
|
|
|
|
_eventQueue.dispatch_forever();
|
|
|
|
tr_info("Stop dispatching main events");
|
|
|
|
}
|
2024-11-26 16:26:41 +01:00
|
|
|
|
2025-01-03 17:10:42 +01:00
|
|
|
void BikeSystem::loop_speed_distance_task() {
|
|
|
|
tr_info("Start loop speed-distance calculation");
|
|
|
|
while (true) {
|
|
|
|
speedDistanceTask();
|
|
|
|
}
|
|
|
|
}
|
2025-01-03 20:22:23 +01:00
|
|
|
|
|
|
|
void BikeSystem::loop_gear_task() {
|
|
|
|
tr_info("Start loop gear calculation");
|
|
|
|
while (true) {
|
|
|
|
gearTask();
|
|
|
|
}
|
|
|
|
}
|
2025-01-03 17:10:42 +01:00
|
|
|
|
2024-12-31 13:47:36 +01:00
|
|
|
uint8_t BikeSystem::getCurrentGear() {
|
|
|
|
uint8_t currentGear;
|
|
|
|
|
2025-01-03 17:10:42 +01:00
|
|
|
// ENTER CRITICAL SECTION
|
|
|
|
_mutexGear.lock();
|
2024-12-31 13:47:36 +01:00
|
|
|
currentGear = _currentGear;
|
2025-01-03 17:10:42 +01:00
|
|
|
_mutexGear.unlock();
|
2024-12-31 13:47:36 +01:00
|
|
|
// END CRITICAL SECTION
|
|
|
|
|
|
|
|
return currentGear;
|
|
|
|
}
|
|
|
|
|
|
|
|
uint8_t BikeSystem::getCurrentGearSize() {
|
|
|
|
uint8_t currentGearSize;
|
|
|
|
|
2025-01-03 17:10:42 +01:00
|
|
|
// ENTER CRITICAL SECTION
|
|
|
|
_mutexGearSize.lock();
|
2024-12-31 13:47:36 +01:00
|
|
|
currentGearSize = _currentGearSize;
|
2025-01-03 17:10:42 +01:00
|
|
|
_mutexGearSize.unlock();
|
2024-12-31 13:47:36 +01:00
|
|
|
// END CRITICAL SECTION
|
|
|
|
|
|
|
|
return currentGearSize;
|
|
|
|
}
|
|
|
|
|
2025-01-04 15:51:51 +01:00
|
|
|
float BikeSystem::getCurrentSpeed() {
|
|
|
|
float currentSpeed;
|
2025-01-03 17:10:42 +01:00
|
|
|
|
|
|
|
// ENTER CRITICAL SECTION
|
|
|
|
_mutexSpeed.lock();
|
|
|
|
currentSpeed = _currentSpeed;
|
|
|
|
_mutexSpeed.unlock();
|
|
|
|
// END CRITICAL SECTION
|
|
|
|
|
|
|
|
return currentSpeed;
|
|
|
|
}
|
|
|
|
|
2025-01-04 15:51:51 +01:00
|
|
|
float BikeSystem::getCurrentDistance() {
|
|
|
|
float currentDistance;
|
2025-01-03 17:10:42 +01:00
|
|
|
|
|
|
|
// ENTER CRITICAL SECTION
|
|
|
|
_mutexDistance.lock();
|
|
|
|
currentDistance = _traveledDistance;
|
|
|
|
_mutexDistance.unlock();
|
|
|
|
// END CRITICAL SECTION
|
|
|
|
|
|
|
|
return currentDistance;
|
|
|
|
}
|
|
|
|
|
2024-12-30 16:56:04 +01:00
|
|
|
} // namespace multi_tasking
|