/*----------------------------------------------------------------------------*/
/* Copyright (c) FIRST 2008-2016. All Rights Reserved.                        */
/* Open Source Software - may be modified and shared by FRC teams. The code   */
/* must be accompanied by the FIRST BSD license file in the root directory of */
/* the project.                                                               */
/*----------------------------------------------------------------------------*/

#pragma once

#include "Base.h"
#include "HAL/cpp/priority_mutex.h"

typedef void (*TimerInterruptHandler)(void *param);

void Wait(double seconds);
double GetClock();
double GetTime();

/**
 * Timer objects measure accumulated time in seconds.
 * The timer object functions like a stopwatch. It can be started, stopped, and
 * cleared. When the
 * timer is running its value counts up in seconds. When stopped, the timer
 * holds the current
 * value. The implementation simply records the time when started and subtracts
 * the current time
 * whenever the value is requested.
 */
class Timer {
 public:
  Timer();
  virtual ~Timer() = default;

  Timer(const Timer&) = delete;
  Timer& operator=(const Timer&) = delete;

  double Get() const;
  void Reset();
  void Start();
  void Stop();
  bool HasPeriodPassed(double period);

  static double GetFPGATimestamp();
  static double GetPPCTimestamp();
  static double GetMatchTime();

  // The time, in seconds, at which the 32-bit FPGA timestamp rolls over to 0
  static const double kRolloverTime;

 private:
  double m_startTime = 0.0;
  double m_accumulatedTime = 0.0;
  bool m_running = false;
  mutable priority_mutex m_mutex;
};