| /* |
| * |
| * Copyright (c) 2020 Project CHIP Authors |
| * |
| * 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. |
| */ |
| |
| /** |
| * @brief defines a generic time source interface that uses a real clock |
| * at runtime but can be substituted by a test one for unit tests. |
| */ |
| |
| #pragma once |
| |
| #include <stdlib.h> |
| #include <system/SystemClock.h> |
| |
| namespace chip { |
| namespace Time { |
| |
| enum class Source |
| { |
| kSystem, // System time source |
| kTest, // Test time source |
| }; |
| |
| /** |
| * Defines a generic time source within a system. System time and test times |
| * are available. |
| */ |
| template <Source kSource> |
| class TimeSource |
| { |
| public: |
| /** |
| * Returns a monotonically increasing time in milliseconds since an arbitrary, platform-defined |
| * epoch. |
| * |
| * Maintains requirements for the System::Platform::Layer clock implementation: |
| * |
| * - Return a value that is ever-increasing (i.e. never * wraps) between reboots of the system. |
| * - The underlying time source is required to tick continuously during any system sleep modes |
| * such that the values do not entail a restart upon wake. |
| * - This function is expected to be thread-safe on any platform that employs threading. |
| */ |
| System::Clock::Timestamp GetMonotonicTimestamp(); |
| }; |
| |
| /** |
| * A system time source, based on the system platform layer. |
| */ |
| template <> |
| class TimeSource<Source::kSystem> |
| { |
| public: |
| System::Clock::Timestamp GetMonotonicTimestamp() { return System::SystemClock().GetMonotonicTimestamp(); } |
| }; |
| |
| /** |
| * A test time source. Allows setting the current time. |
| */ |
| template <> |
| class TimeSource<Source::kTest> |
| { |
| public: |
| System::Clock::Timestamp GetMonotonicTimestamp() { return mCurrentTime; } |
| |
| void SetMonotonicTimestamp(System::Clock::Timestamp value) |
| { |
| if (value < mCurrentTime) |
| { |
| abort(); |
| } |
| mCurrentTime = value; |
| } |
| |
| private: |
| System::Clock::Timestamp mCurrentTime = System::Clock::kZero; |
| }; |
| |
| } // namespace Time |
| } // namespace chip |