using System;

using Unosquare.RaspberryIO.Abstractions;

namespace Unosquare.WiringPi {
  /// <summary>
  /// Provides access to timing and threading properties and methods.
  /// </summary>
  public class Timing : ITiming {
    /// <inheritdoc />
    /// <summary>
    /// This returns a number representing the number of milliseconds since your program
    /// initialized the GPIO controller.
    /// It returns an unsigned 32-bit number which wraps after 49 days.
    /// </summary>
    public UInt32 Milliseconds => Native.WiringPi.Millis();

    /// <inheritdoc />
    /// <summary>
    /// This returns a number representing the number of microseconds since your
    /// program initialized the GPIO controller
    /// It returns an unsigned 32-bit number which wraps after approximately 71 minutes.
    /// </summary>
    public UInt32 Microseconds => Native.WiringPi.Micros();

    /// <inheritdoc cref="ITiming.SleepMilliseconds(UInt32)" />
    public static void Sleep(UInt32 millis) => Native.WiringPi.Delay(millis);

    /// <inheritdoc />
    public void SleepMilliseconds(UInt32 millis) => Sleep(millis);

    /// <inheritdoc />
    public void SleepMicroseconds(UInt32 micros) => Native.WiringPi.DelayMicroseconds(micros);
  }
}