ADD measure time call
This commit is contained in:
@@ -62,15 +62,28 @@ static constexpr std::chrono::milliseconds kCPUTaskDelay = 0
|
||||
static constexpr std::chrono::milliseconds kCPUTaskComputationTime = 0ms;
|
||||
|
||||
BikeSystem::BikeSystem()
|
||||
: _gearDevice(&_mailGearDevice),
|
||||
_pedalDevice(&_mailPedalDevice),
|
||||
_resetDevice(callback(this, &BikeSystem::onReset)),
|
||||
_speedometer(_timer),
|
||||
_cpuLogger(_timer),
|
||||
: _timer(),
|
||||
_isrEventQueue(),
|
||||
_eventQueue(),
|
||||
_mailPedalDevice(),
|
||||
_mailGearDevice(),
|
||||
_mutexGearSize(),
|
||||
_mutexGear(),
|
||||
_mutexSpeed(),
|
||||
_mutexDistance(),
|
||||
_mutexSpeedometer(),
|
||||
_isrEventThread(osPriorityAboveNormal, OS_STACK_SIZE, nullptr, "ISR_Event"),
|
||||
_speedDistanceThread(
|
||||
osPriorityNormal, OS_STACK_SIZE, nullptr, "Speed_distance_Task"),
|
||||
_gearTaskThread(osPriorityNormal, OS_STACK_SIZE, nullptr, "Gear_Task") {}
|
||||
_gearTaskThread(osPriorityNormal, OS_STACK_SIZE, nullptr, "Gear_Task"),
|
||||
_gearDevice(&_mailGearDevice, _timer),
|
||||
_pedalDevice(&_mailPedalDevice, _timer),
|
||||
_resetDevice(callback(this, &BikeSystem::onReset)),
|
||||
_displayDevice(),
|
||||
_speedometer(_timer),
|
||||
_sensorDevice(),
|
||||
_taskLogger(),
|
||||
_cpuLogger(_timer) {}
|
||||
|
||||
#if defined(MBED_TEST_MODE)
|
||||
const advembsof::TaskLogger& BikeSystem::getTaskLogger() { return _taskLogger; }
|
||||
@@ -99,21 +112,16 @@ void BikeSystem::init() {
|
||||
void BikeSystem::start() {
|
||||
init();
|
||||
|
||||
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();
|
||||
Event<void()> displayEvent(&_eventQueue, callback(this, &BikeSystem::displayTask));
|
||||
displayEvent.delay(kDisplayTask1Delay);
|
||||
displayEvent.period(kDisplayTask1Period);
|
||||
displayEvent.post();
|
||||
|
||||
osStatus status =
|
||||
_isrEventThread.start(callback(this, &BikeSystem::dispatch_isr_events));
|
||||
@@ -132,6 +140,13 @@ void BikeSystem::start() {
|
||||
tr_error("Thread %s started with status %d", _gearTaskThread.get_name(), status);
|
||||
}
|
||||
|
||||
#if !defined(MBED_TEST_MODE)
|
||||
Event<void()> cpuEvent(&_eventQueue, callback(this, &BikeSystem::cpuTask));
|
||||
cpuEvent.delay(kCPUTaskDelay);
|
||||
cpuEvent.period(kCPUTaskPeriod);
|
||||
cpuEvent.post();
|
||||
#endif
|
||||
|
||||
// dispatch the main queue in the main thread
|
||||
dispatch_events();
|
||||
}
|
||||
@@ -167,26 +182,30 @@ void BikeSystem::resetTask() {
|
||||
void BikeSystem::speedDistanceTask() {
|
||||
auto taskStartTime = _timer.elapsed_time();
|
||||
|
||||
uint32_t* currentStep = _mailPedalDevice.try_get();
|
||||
pedalMail_t* currentStep = _mailPedalDevice.try_get();
|
||||
|
||||
if (currentStep != nullptr) {
|
||||
const auto pedalRotationTime = PedalDevice::getCurrentRotationTime(*currentStep);
|
||||
|
||||
osStatus status = _mailPedalDevice.free(currentStep);
|
||||
if (status != osOK) {
|
||||
tr_error("free current step in the speed distance tasks doesn't work !");
|
||||
}
|
||||
const auto pedalRotationTime =
|
||||
PedalDevice::getCurrentRotationTime(currentStep->step);
|
||||
|
||||
// ENTER CRITICAL SECTION
|
||||
_mutexSpeedometer.lock();
|
||||
_speedometer.setCurrentRotationTime(pedalRotationTime);
|
||||
_mutexSpeedometer.unlock();
|
||||
// END CRITICAL SECTION
|
||||
|
||||
std::chrono::microseconds responseTime =
|
||||
_timer.elapsed_time() - currentStep->callTime;
|
||||
tr_info("Reset task: response time is %" PRIu64 " usecs", responseTime.count());
|
||||
|
||||
osStatus status = _mailPedalDevice.free(currentStep);
|
||||
if (status != osOK) {
|
||||
tr_error("free current step in the speed distance tasks doesn't work !");
|
||||
}
|
||||
}
|
||||
|
||||
// ENTER CRITICAL SECTION
|
||||
_mutexSpeedometer.lock();
|
||||
tr_info("%d", getCurrentGearSize());
|
||||
_speedometer.setGearSize(getCurrentGearSize());
|
||||
_mutexSpeed.lock();
|
||||
_currentSpeed = _speedometer.getCurrentSpeed();
|
||||
@@ -205,21 +224,25 @@ void BikeSystem::speedDistanceTask() {
|
||||
void BikeSystem::gearTask() {
|
||||
auto taskStartTime = _timer.elapsed_time();
|
||||
|
||||
uint8_t* currentGear = _mailGearDevice.try_get();
|
||||
gearMail_t* currentGear = _mailGearDevice.try_get();
|
||||
|
||||
if (currentGear != nullptr) {
|
||||
// ENTER CRITICAL SECTION
|
||||
_mutexGear.lock();
|
||||
_currentGear = *currentGear;
|
||||
_currentGear = currentGear->gear;
|
||||
_mutexGear.unlock();
|
||||
_mutexGearSize.lock();
|
||||
_currentGearSize = bike_computer::kMaxGearSize - *currentGear;
|
||||
_currentGearSize = bike_computer::kMaxGearSize - currentGear->gear;
|
||||
_mutexGearSize.unlock();
|
||||
// END CRITICAL SECTION
|
||||
|
||||
std::chrono::microseconds responseTime =
|
||||
_timer.elapsed_time() - currentGear->callTime;
|
||||
tr_info("Reset task: response time is %" PRIu64 " usecs", responseTime.count());
|
||||
|
||||
osStatus status = _mailGearDevice.free(currentGear);
|
||||
if (status != osOK) {
|
||||
tr_error("free current step in the speed distance tasks doesn't work !");
|
||||
tr_error("free current gear in the gear tasks doesn't work !");
|
||||
}
|
||||
}
|
||||
_taskLogger.logPeriodAndExecutionTime(
|
||||
@@ -241,7 +264,7 @@ void BikeSystem::temperatureTask() {
|
||||
_timer, advembsof::TaskLogger::kTemperatureTaskIndex, taskStartTime);
|
||||
}
|
||||
|
||||
void BikeSystem::displayTask1() {
|
||||
void BikeSystem::displayTask() {
|
||||
auto taskStartTime = _timer.elapsed_time();
|
||||
|
||||
// ENTER CRITICAL SECTION
|
||||
@@ -250,25 +273,15 @@ void BikeSystem::displayTask1() {
|
||||
_displayDevice.displayDistance(getCurrentDistance());
|
||||
// END CRITICAL SECTION
|
||||
|
||||
ThisThread::sleep_for(std::chrono::duration_cast<std::chrono::milliseconds>(
|
||||
kDisplayTask1ComputationTime - (_timer.elapsed_time() - taskStartTime)));
|
||||
_displayDevice.displayTemperature(_currentTemperature);
|
||||
|
||||
// ThisThread::sleep_for(std::chrono::duration_cast<std::chrono::milliseconds>(kDisplayTask1ComputationTime
|
||||
// - (_timer.elapsed_time() - taskStartTime)));
|
||||
|
||||
_taskLogger.logPeriodAndExecutionTime(
|
||||
_timer, advembsof::TaskLogger::kDisplayTask1Index, taskStartTime);
|
||||
}
|
||||
|
||||
void BikeSystem::displayTask2() {
|
||||
auto taskStartTime = _timer.elapsed_time();
|
||||
|
||||
_displayDevice.displayTemperature(_currentTemperature);
|
||||
|
||||
ThisThread::sleep_for(std::chrono::duration_cast<std::chrono::milliseconds>(
|
||||
kDisplayTask2ComputationTime - (_timer.elapsed_time() - taskStartTime)));
|
||||
|
||||
_taskLogger.logPeriodAndExecutionTime(
|
||||
_timer, advembsof::TaskLogger::kDisplayTask2Index, taskStartTime);
|
||||
}
|
||||
|
||||
void BikeSystem::cpuTask() { _cpuLogger.printStats(); }
|
||||
|
||||
void BikeSystem::dispatch_isr_events() {
|
||||
@@ -321,8 +334,8 @@ uint8_t BikeSystem::getCurrentGearSize() {
|
||||
return currentGearSize;
|
||||
}
|
||||
|
||||
uint32_t BikeSystem::getCurrentSpeed() {
|
||||
uint32_t currentSpeed;
|
||||
float BikeSystem::getCurrentSpeed() {
|
||||
float currentSpeed;
|
||||
|
||||
// ENTER CRITICAL SECTION
|
||||
_mutexSpeed.lock();
|
||||
@@ -333,8 +346,8 @@ uint32_t BikeSystem::getCurrentSpeed() {
|
||||
return currentSpeed;
|
||||
}
|
||||
|
||||
uint32_t BikeSystem::getCurrentDistance() {
|
||||
uint32_t currentDistance;
|
||||
float BikeSystem::getCurrentDistance() {
|
||||
float currentDistance;
|
||||
|
||||
// ENTER CRITICAL SECTION
|
||||
_mutexDistance.lock();
|
||||
|
||||
Reference in New Issue
Block a user