#ifndef FRC971_WPILIB_GYRO_INTERFACE_H_
#define FRC971_WPILIB_GYRO_INTERFACE_H_

#include <memory>

#include "frc971/wpilib/ahal/SPI.h"
#undef ERROR

namespace frc971 {
namespace wpilib {

class GyroInterface {
 public:
  GyroInterface();

  // Runs the recommended gyro startup procedure including checking all of the
  // self-test bits.
  // Returns true if it succeeds.
  bool InitializeGyro();

  // Reads one of the gyro's "registers" and returns the value.
  // Retries until it succeeds.
  uint16_t DoRead(uint8_t address);

  // Returns all of the non-data bits in the "header" except the parity from
  // value.
  uint8_t ExtractStatus(uint32_t value) { return (value >> 26) & ~4; }
  // Returns all of the error bits in the "footer" from value.
  uint8_t ExtractErrors(uint32_t value) { return (value >> 1) & 0x7F; }

  // Returns the anglular rate contained in value in radians/sec.
  double ExtractAngle(uint32_t value);

  // Performs a transaction with the gyro.
  // to_write is the value to write. This function handles setting the checksum
  // bit.
  // result is where to stick the result. This function verifies the parity bit.
  // Returns true for success.
  bool DoTransaction(uint32_t to_write, uint32_t *result);

  // Returns the part ID from the gyro.
  // Retries until it succeeds.
  uint32_t ReadPartID();

  // Gets a reading from the gyro.
  // Returns a value to be passed to the Extract* methods or 0 for error.
  uint32_t GetReading();

 private:
  ::std::unique_ptr<frc::SPI> gyro_;
};

}  // namespace wpilib
}  // namespace frc971

#endif  // FRC971_WPILIB_GYRO_INTERFACE_H_
