diff --git a/static_scheduling/pedal_device.cpp b/static_scheduling/pedal_device.cpp new file mode 100644 index 0000000..9379136 --- /dev/null +++ b/static_scheduling/pedal_device.cpp @@ -0,0 +1,72 @@ +/**************************************************************************** +* @file pedal_device.cpp +* @author Rémi Heredero +* @author Yann Sierro +* +* @brief Pedal Device implementation (static scheduling) +* @date 2024-11-09 +* @version 0.1.0 +****************************************************************************/ + +#include "pedal_device.hpp" + +// from disco_h747i/wrappers +#include + +#include "joystick.hpp" +#include "mbed_trace.h" + +#if MBED_CONF_MBED_TRACE_ENABLE +#define TRACE_GROUP "PedalDevice" +#endif // MBED_CONF_MBED_TRACE_ENABLE + +namespace static_scheduling { + + static constexpr std::chrono::microseconds kTaskRunTime = 200000us; + + PedalDevice::PedalDevice(Timer& timer) : _timer(timer) {} + + + std::chrono::milliseconds PedalDevice::getCurrentRotationTime() { + // TODO + std::chrono::microseconds initialTime = _timer.elapsed_time(); + std::chrono::microseconds elapsedTime = std::chrono::microseconds::zero(); + // we bound the change to one increment/decrement per call + bool hasChanged = false; + while (elapsedTime < kTaskRunTime) { + if (!hasChanged) { + disco::Joystick::State joystickState = disco::Joystick::getInstance().getState(); + + switch (joystickState) { + case disco::Joystick::State::LeftPressed: + if (_pedalRotationTime < bike_computer::kMaxPedalRotationTime) { + decreaseRotationSpeed(); + hasChanged = true; + } + break; + + case disco::Joystick::State::DownPressed: + if (_pedalRotationTime > bike_computer::kMinPedalRotationTime) { + decreaseRotationSpeed(); + hasChanged = true; + } + break; + + default: + break; + } + } + elapsedTime = _timer.elapsed_time() - initialTime; + } + return _pedalRotationTime; + } + + void PedalDevice::increaseRotationSpeed() { + _pedalRotationTime -= bike_computer::kDeltaPedalRotationTime; + } + + void PedalDevice::decreaseRotationSpeed() { + _pedalRotationTime += bike_computer::kDeltaPedalRotationTime; + } + +} diff --git a/static_scheduling/pedal_device.hpp b/static_scheduling/pedal_device.hpp new file mode 100644 index 0000000..3f5c489 --- /dev/null +++ b/static_scheduling/pedal_device.hpp @@ -0,0 +1,54 @@ +// 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 pedal_device.hpp + * @author Serge Ayer + * + * @brief Pedal System header file (static scheduling) + * + * @date 2023-08-20 + * @version 1.0.0 + ***************************************************************************/ + +#pragma once + +#include "constants.hpp" +#include "mbed.h" + +namespace static_scheduling { + +class PedalDevice { + public: + explicit PedalDevice(Timer& timer); // NOLINT(runtime/references) + + // make the class non copyable + PedalDevice(PedalDevice&) = delete; + PedalDevice& operator=(PedalDevice&) = delete; + + // method called for updating the bike system + std::chrono::milliseconds getCurrentRotationTime(); + + private: + // private methods + void increaseRotationSpeed(); + void decreaseRotationSpeed(); + + // data members + std::chrono::milliseconds _pedalRotationTime = + bike_computer::kInitialPedalRotationTime; + Timer& _timer; +}; + +} // namespace static_scheduling \ No newline at end of file