base_time.hh 2.8 KB
Newer Older
garciay's avatar
garciay committed
/*!
 * \file      base_time.hh
 * \brief     Header file for the control port base_time functionality.
 * \author    ETSI STF525
 * \copyright ETSI Copyright Notification
 *            No part may be reproduced except as authorized by written permission.
 *            The copyright and the foregoing restriction extend to reproduction in all media.
 *            All rights reserved.
 * \version   0.1
 */
#pragma once

#include <chrono>

/**
 * \class base_time
 * \brief This class provides time tools such as getting current time
 */
class base_time {
Yann Garcia's avatar
Yann Garcia committed
  const unsigned long long its_base_time_ms = 1072915200000L; //! Base time 01/01/2004 12:00am in millseconds
  unsigned long long leap_delay;
  
garciay's avatar
garciay committed
  static base_time* _instance;
private:
  base_time(): leap_delay{0} { }; //! Can not be created manually
garciay's avatar
garciay committed
public:
  static inline base_time& get_instance();

  virtual ~base_time() { if (_instance != nullptr) delete _instance; };
  
public:
Yann Garcia's avatar
Yann Garcia committed
  inline const unsigned long long get_current_time_ms() const;
  inline const unsigned long long get_its_base_time_ms() const;
  inline const unsigned long long get_its_current_time_ms() const;
  inline const unsigned long long get_its_current_time_us() const;
  inline const unsigned long long get_its_current_time_mod_ms() const;
  inline void set_leap_delay_us(const unsigned long long p_leap_delay);
  inline const unsigned long long get_leap_delay_us() const;
garciay's avatar
garciay committed
}; // End of class base_time

// static functions
base_time& base_time::get_instance() {
  return (_instance != nullptr) ? *_instance : *(_instance = new base_time());
}

Yann Garcia's avatar
Yann Garcia committed
const unsigned long long base_time::get_current_time_ms() const {
  return (leap_delay / 1000) + std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch()).count();
Yann Garcia's avatar
Yann Garcia committed
const unsigned long long base_time::get_its_base_time_ms() const {
  return base_time::its_base_time_ms;
Yann Garcia's avatar
Yann Garcia committed
const unsigned long long base_time::get_its_current_time_ms() const {
  return (leap_delay / 1000) + std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch()).count() - base_time::its_base_time_ms;
Yann Garcia's avatar
Yann Garcia committed

const unsigned long long base_time::get_its_current_time_us() const {
  return leap_delay + std::chrono::duration_cast<std::chrono::microseconds>(std::chrono::system_clock::now().time_since_epoch()).count() - base_time::its_base_time_ms * 1000;
Yann Garcia's avatar
Yann Garcia committed
}

const unsigned long long base_time::get_its_current_time_mod_ms() const {
  return ((leap_delay / 1000) + std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch()).count() - base_time::its_base_time_ms) % 65536;
}

void base_time::set_leap_delay_us(const unsigned long long p_leap_delay) {
  leap_delay = p_leap_delay;
Yann Garcia's avatar
Yann Garcia committed
}

inline const unsigned long long base_time::get_leap_delay_us() const {
  return leap_delay;
}