/* ------------------------------------------- Copyright (C) 2024-2025, Amlal El Mahrouss, licensed under the Apache 2.0 license. ------------------------------------------- */ #pragma once #include #include namespace Kernel { class SoftwareTimer; class TimerInterface; inline constexpr Int16 kTimeUnit = 1000; class TimerInterface { public: /// @brief Default constructor explicit TimerInterface() = default; virtual ~TimerInterface() = default; public: NE_COPY_DEFAULT(TimerInterface) public: virtual BOOL Wait() noexcept; }; class SoftwareTimer final : public TimerInterface { public: explicit SoftwareTimer(Int64 seconds); ~SoftwareTimer() override; public: NE_COPY_DEFAULT(SoftwareTimer) public: BOOL Wait() noexcept override; private: UIntPtr* fDigitalTimer{nullptr}; Int64 fWaitFor{0}; }; class HardwareTimer final : public TimerInterface { public: explicit HardwareTimer(UInt64 seconds); ~HardwareTimer() override; public: NE_COPY_DEFAULT(HardwareTimer) public: BOOL Wait() noexcept override; private: volatile UInt8* fDigitalTimer{nullptr}; Int64 fWaitFor{0}; }; inline UInt64 rtl_microseconds(UInt64 time) { if (time < 1) return 0; // TODO: nanoseconds maybe? return time / kTimeUnit; } inline UInt64 rtl_milliseconds(UInt64 time) { if (time < 1) return 0; return time; } } // namespace Kernel