Program Listing for File periodic_timer.hpp
↰ Return to documentation for file (src/tap/architecture/periodic_timer.hpp
)
/*
* Copyright (c) 2020-2021 Advanced Robotics at the University of Washington <robomstr@uw.edu>
*
* This file is part of Taproot.
*
* Taproot is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Taproot is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Taproot. If not, see <https://www.gnu.org/licenses/>.
*/
#ifndef TAPROOT_PERIODIC_TIMER_HPP_
#define TAPROOT_PERIODIC_TIMER_HPP_
#include "tap/architecture/timeout.hpp"
namespace tap
{
namespace arch
{
template <typename T>
class PeriodicTimer
{
public:
PeriodicTimer() : period(0) {}
explicit PeriodicTimer(uint32_t period) : period(period), timeout(period) {}
inline void restart() { timeout.restart(period); }
inline void restart(uint32_t period)
{
this->period = period;
restart();
}
inline void stop() { timeout.stop(); }
inline bool execute()
{
if (timeout.execute())
{
uint32_t now = T::TimeFunc();
do
{
timeout.expireTime += period;
} while (timeout.expireTime <= now);
timeout.isRunning = true;
timeout.isExecuted = false;
return true;
}
return false;
}
inline bool isStopped() const { return timeout.isStopped(); }
private:
uint32_t period;
T timeout;
};
using PeriodicMilliTimer = PeriodicTimer<MilliTimeout>;
using PeriodicMicroTimer = PeriodicTimer<MicroTimeout>;
} // namespace arch
} // namespace tap
#endif // TAPROOT_PERIODIC_TIMER_HPP_