/* * Copyright (C) 2019 Max Regan * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ #pragma once #include "ReturnCode.h" #include "Time.h" #include "SystemTime.h" namespace Common { namespace Schedule { enum class ScheduleType { AT_TIME = 0, NEVER = 1, }; class NextTime final { public: NextTime() : m_type(ScheduleType::NEVER), m_time(0) {} static inline NextTime in(time_t offset) { time_t time = 0; /* If this call fails, we likely haven't initialized the timer * yet, so just treat offset as the time- hopefully the system * timer will be initialzed soon */ BSP::SystemTimer::get_time(time); time += offset; return {ScheduleType::AT_TIME, time }; } static inline NextTime never() { return { ScheduleType::NEVER, 0 }; } static inline NextTime asap() { return { ScheduleType::AT_TIME, 0 }; } static inline NextTime at(time_t time) { return { ScheduleType::AT_TIME, time }; } inline ScheduleType get_type() const { return m_type; } inline time_t get_time() const { return m_time; } inline bool operator<(const NextTime other) const { if (m_type < other.m_type) { return true; } else if (m_type == other.m_type) { switch(m_type){ case ScheduleType::AT_TIME: return m_time < other.m_time; case ScheduleType::NEVER: return false; } return false; } else { return false; } } inline bool operator==(const NextTime other) const { if (m_type != other.m_type) { return false; } else { switch(m_type){ case ScheduleType::AT_TIME: return m_time == other.m_time; case ScheduleType::NEVER: return true; } return false; } } private: NextTime(ScheduleType type, time_t time) : m_type(type), m_time(time) {} ScheduleType m_type; time_t m_time; }; class Task { public: virtual NextTime execute() = 0; }; } // namespace Schedule } // namespace Common