//----------------------------------------------------------- // You69Man, 2023 // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // version 2 as published by the Free Software Foundation. //----------------------------------------------------------- /** * @file timemonitor.h * * Class declaration for TimeMonitor */ #ifndef __TIMEMONITOR_H__ #define __TIMEMONITOR_H__ #include class TimeMonitor { public: /** * A constructor for creating a TimeMonitor object */ TimeMonitor() {} /** * A constructor for initializing a TimeMonitor object * @param timeout timeout in ms * @param start (optional) if true, start TimeMonitor immediately */ explicit TimeMonitor(uint32_t timeout, bool start = false) { if (start) startTimeMonitor(timeout); else configureTimeMonitor(timeout); } /** * Start the TimeMonitor with new timeout configuration * @param timeout timout in ms */ void startTimeMonitor(uint32_t timeout) { mStartTime = millis(); mTimeout = timeout; mStarted = true; } /** * Restart the TimeMonitor with already set timeout configuration * @note a timeout has to be set before, no need to call * 'startTimeMonitor' before */ void reStartTimeMonitor(void) { mStartTime = millis(); mStarted = true; } /** * Configure the TimeMonitor to new timeout configuration * @param timeout timeout in ms * @note This doesn't restart an already running TimeMonitor. * If timer is already running and new timeout is longer that current timeout runtime of the running timer is expanded * If timer is already running and new timeout is shorter that current timeout this can immediately lead to a timeout */ void configureTimeMonitor(uint32_t timeout) { mTimeout = timeout; } /** * Stop the TimeMonitor */ void stopTimeMonitor(void) { mStarted = false; } /** * Get timeout status of the TimeMonitor * @return bool * true: TimeMonitor already timed out * false: TimeMonitor still in time or TimeMonitor was stopped */ bool isTimeout(void) const { if ((mStarted) && ((millis() - mStartTime) >= mTimeout)) return true; else return false; } /** * Get timeout configuration of the TimeMonitor * @return uint32_t timeout value in ms */ uint32_t getTimeout(void) const { return mTimeout; } /** * Get residual time of the TimeMonitor until timeout * @return uint32_t residual time until timeout in ms * @note in case of a stopped TimeMonitor residual time is always 0xFFFFFFFFUL * in case of a timed out TimeMonitor residual time is always 0UL (zero) */ uint32_t getResidualTime(void) const { uint32_t delayed = millis() - mStartTime; return(mStarted ? (delayed < mTimeout ? (mTimeout - delayed) : 0UL) : 0xFFFFFFFFUL); } /** * Get overall run time of the TimeMonitor * @return uint32_t residual time until timeout in ms * @note in case of a stopped TimeMonitor residual time is always 0xFFFFFFFFUL * in case of a timed out TimeMonitor residual time is always 0UL (zero) */ uint32_t getRunTime(void) const { return(mStarted ? millis() - mStartTime : 0UL); } private: uint32_t mStartTime = 0UL; // start time of the TimeMonitor uint32_t mTimeout = 0UL; // timeout configuration of the TimeMonitor bool mStarted = false; // start/stop state of the TimeMonitor }; #endif