/*
 * Copyright (c) 2018 Oticon A/S
 *
 * SPDX-License-Identifier: Apache-2.0
 */

/**
 * @file
 * @brief API to the native_posix (Real) Time Clock
 */


#ifndef _NATIVE_POSIX_RTC_H
#define _NATIVE_POSIX_RTC_H

#include "hw_models_top.h"
#include <stdbool.h>
#include <zephyr/types.h>

#ifdef __cplusplus
extern "C" {
#endif

/*
 * Types of clocks this RTC provides:
 */
/** Time since boot, cannot be offset. Microsecond resolution */
#define RTC_CLOCK_BOOT               0
/** Persistent clock, can be offset. Microsecond resolution */
#define RTC_CLOCK_REALTIME           1
/**
 * Pseudo-host real time clock (Please see documentation).
 * Nanosecond resolution
 */
#define RTC_CLOCK_PSEUDOHOSTREALTIME 2

/**
 * @brief Get the value of a clock in microseconds
 *
 * @param clock_type Which clock to measure from
 *
 * @return Number of microseconds
 */
uint64_t native_rtc_gettime_us(int clock_type);

/**
 * @brief Get the value of a clock split in in nsec and seconds
 *
 * @param clock_type Which clock to measure from
 * @param nsec Pointer to store the nanoseconds
 * @param nsec Pointer to store the seconds
 */
void native_rtc_gettime(int clock_type, uint32_t *nsec, uint64_t *sec);

/**
 * @brief Offset the real time clock by a number of microseconds.
 * Note that this only affects the RTC_CLOCK_REALTIME and
 * RTC_CLOCK_PSEUDOHOSTREALTIME clocks.
 *
 * @param delta_us Number of microseconds to offset. The value is added to all
 * offsetable clocks.
 */
void native_rtc_offset(int64_t delta_us);

/**
 * @brief Adjust the speed of the clock source by a multiplicative factor
 *
 * @param clock_correction Factor by which to correct the clock speed
 */
void native_rtc_adjust_clock(double clock_correction);

#ifdef __cplusplus
}
#endif

#endif /* _NATIVE_POSIX_RTC_H */
