/*
 *
 *    Copyright (c) 2020 Project CHIP Authors
 *    Copyright (c) 2018 Nest Labs, Inc.
 *
 *    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.
 */

/**
 *    @file
 *      This is an internal header file that defines the interface to a platform-supplied
 *      function for retrieving the current system time.
 */

#ifndef SYSTEMTIME_H
#define SYSTEMTIME_H

// Include configuration headers
#include <system/SystemConfig.h>

// Include dependent headers
#include <support/DLLUtil.h>

#include <system/SystemError.h>

namespace chip {
namespace System {

enum
{
    kTimerFactor_nano_per_micro  = 1000, /** Number of nanoseconds in a microsecond. */
    kTimerFactor_micro_per_milli = 1000, /** Number of microseconds in a millisecond. */
    kTimerFactor_milli_per_unit  = 1000, /** Number of milliseconds in a second. */

    kTimerFactor_nano_per_milli = 1000000, /** Number of nanoseconds in a millisecond. */
    kTimerFactor_micro_per_unit = 1000000  /** Number of microseconds in a second. */
};

namespace Platform {
namespace Layer {

/**
 * @brief
 *   Platform-specific function for getting monotonic system time in microseconds.
 *
 * This function is expected to return elapsed time in microseconds since an arbitrary, platform-defined
 * epoch.  Platform implementations are obligated to return a value that is ever-increasing (i.e. never
 * wraps) between reboots of the system.  Additionally, the underlying time source is required to tick
 * continuously during any system sleep modes that do not entail a restart upon wake.
 *
 * The epoch for time returned by this function is *not* required to be the same that for any of the
 * other GetClock... functions, including GetClock_MonotonicMS().
 *
 * This function is expected to be thread-safe on any platform that employs threading.
 *
 * @note
 *   This function is reserved for internal use by the CHIP System Layer.  Users of the CHIP System
 *   Layer should call System::Layer::GetClock_Monotonic().
 *
 * @returns             Elapsed time in microseconds since an arbitrary, platform-defined epoch.
 */
extern uint64_t GetClock_Monotonic(void);

/**
 * @brief
 *   Platform-specific function for getting monotonic system time in milliseconds.
 *
 * This function is expected to return elapsed time in milliseconds since an arbitrary, platform-defined
 * epoch.  Platform implementations are obligated to return a value that is ever-increasing (i.e. never
 * wraps) between reboots of the system.  Additionally, the underlying time source is required to tick
 * continuously during any system sleep modes that do not entail a restart upon wake.
 *
 * The epoch for time returned by this function is *not* required to be the same as that for any of the
 * other GetClock... functions, including GetClock_Monotonic().
 *
 * This function is expected to be thread-safe on any platform that employs threading.
 *
 * @note
 *   This function is reserved for internal use by the CHIP System Layer.  Users of the CHIP System
 *   Layer should call System::Layer::GetClock_MonotonicMS().
 *
 * @returns             Elapsed time in milliseconds since an arbitrary, platform-defined epoch.
 */
extern uint64_t GetClock_MonotonicMS(void);

/**
 * @brief
 *   Platform-specific function for getting high-resolution monotonic system time in microseconds.
 *
 * This function is expected to return elapsed time in microseconds since an arbitrary, platform-defined
 * epoch.  Values returned by GetClock_MonotonicHiRes() are required to be ever-increasing (i.e. never
 * wrap).  However, the underlying timer is *not* required to tick continuously during system
 * deep-sleep states.
 *
 * Platform are encouraged to implement GetClock_MonotonicHiRes() using a high-resolution timer
 * that is not subject to gradual clock adjustments (slewing).  On platforms without such a timer,
 * GetClock_MonotonicHiRes() can return the same value as GetClock_Monotonic().
 *
 * The epoch for time returned by this function is not required to be the same that for any of the
 * other GetClock... functions.
 *
 * This function is expected to be thread-safe on any platform that employs threading.
 *
 * @note
 *   This function is reserved for internal use by the CHIP System Layer.  Users of the CHIP System
 *   Layer should call System::Layer::GetClock_MonotonicHiRes().
 *
 * @returns             Elapsed time in microseconds since an arbitrary, platform-defined epoch.
 */
extern uint64_t GetClock_MonotonicHiRes(void);

/**
 * @brief
 *   Platform-specific function for getting the current real (civil) time in microsecond Unix time
 *   format.
 *
 * This function is expected to return the local platform's notion of current real time, expressed
 * as a Unix time value scaled to microseconds.  The underlying clock is required to tick at a
 * rate of least at whole seconds (values of 1,000,000), but may tick faster.
 *
 * On those platforms that are capable of tracking real time, GetClock_RealTime() must return the
 * error CHIP_SYSTEM_ERROR_REAL_TIME_NOT_SYNCED whenever the system is unsynchronized with real time.
 *
 * Platforms that are incapable of tracking real time should not implement the GetClock_RealTime()
 * function, thereby forcing link-time failures of features that depend on access to real time.
 * Alternatively, such platforms may supply an implementation of GetClock_RealTime() that returns
 * the error CHIP_SYSTEM_ERROR_NOT_SUPPORTED.
 *
 * This function is expected to be thread-safe on any platform that employs threading.
 *
 * @note
 *   This function is reserved for internal use by the CHIP System Layer.  Users of the CHIP System
 *   Layer should call System::Layer::GetClock_RealTime().
 *
 * @param[out] curTime                  The current time, expressed as Unix time scaled to microseconds.
 *
 * @retval #CHIP_SYSTEM_NO_ERROR       If the method succeeded.
 * @retval #CHIP_SYSTEM_ERROR_REAL_TIME_NOT_SYNCED
 *                                      If the platform is capable of tracking real time, but is
 *                                      is currently unsynchronized.
 * @retval #CHIP_SYSTEM_ERROR_NOT_SUPPORTED
 *                                      If the platform is incapable of tracking real time.
 */
extern Error GetClock_RealTime(uint64_t & curTime);

/**
 * @brief
 *   Platform-specific function for getting the current real (civil) time in millisecond Unix time
 *   format.
 *
 * This function is expected to return the local platform's notion of current real time, expressed
 * as a Unix time value scaled to milliseconds.
 *
 * See the documentation for GetClock_RealTime() for details on the expected behavior.
 *
 * @note
 *   This function is reserved for internal use by the CHIP System Layer.  Users of the CHIP System
 *   Layer should call System::Layer::GetClock_RealTimeMS().
 *
 * @param[out] curTime                  The current time, expressed as Unix time scaled to milliseconds.
 *
 * @retval #CHIP_SYSTEM_NO_ERROR       If the method succeeded.
 * @retval #CHIP_SYSTEM_ERROR_REAL_TIME_NOT_SYNCED
 *                                      If the platform is capable of tracking real time, but is
 *                                      is currently unsynchronized.
 * @retval #CHIP_SYSTEM_ERROR_NOT_SUPPORTED
 *                                      If the platform is incapable of tracking real time.
 */
extern Error GetClock_RealTimeMS(uint64_t & curTimeMS);

/**
 * @brief
 *   Platform-specific function for setting the current real (civil) time.
 *
 * CHIP calls this function to set the local platform's notion of current real time.  The new current
 * time is expressed as a Unix time value scaled to microseconds.
 *
 * Once set, underlying platform clock is expected to track real time with a granularity of at least whole
 * seconds.
 *
 * On platforms that support tracking real time, the SetClock_RealTime() function must return the error
 * CHIP_SYSTEM_ERROR_ACCESS_DENIED if the calling application does not have the privilege to set the
 * current time.
 *
 * Platforms that are incapable of tracking real time, or do not offer the ability to set real time,
 * should not implement the SetClock_RealTime() function, thereby forcing link-time failures of features
 * that depend on setting real time.  Alternatively, such platforms may supply an implementation of
 * SetClock_RealTime() that returns the error CHIP_SYSTEM_ERROR_NOT_SUPPORTED.
 *
 * This function is expected to be thread-safe on any platform that employs threading.
 *
 * @note
 *   This function is reserved for internal use by the CHIP System Layer.  Users of the CHIP System
 *   Layer should call System::Layer::GetClock_RealTimeMS().
 *
 * @param[in] newCurTime                The new current time, expressed as Unix time scaled to microseconds.
 *
 * @retval #CHIP_SYSTEM_NO_ERROR       If the method succeeded.
 * @retval #CHIP_SYSTEM_ERROR_NOT_SUPPORTED
 *                                      If the platform is incapable of tracking real time.
 * @retval #CHIP_SYSTEM_ERROR_ACCESS_DENIED
 *                                      If the calling application does not have the privilege to set the
 *                                      current time.
 */
extern Error SetClock_RealTime(uint64_t newCurTime);

} // namespace Layer
} // namespace Platform
} // namespace System
} // namespace chip

#endif // SYSTEMTIME_H
