package swervelib.encoders;

/**
 * Swerve abstraction class to define a standard interface with absolute encoders for swerve modules..
 */
public abstract class SwerveAbsoluteEncoder
{

  /**
   * The maximum amount of times the swerve encoder will attempt to configure itself if failures occur.
   */
  public final int     maximumRetries = 5;
  /**
   * Last angle reading was faulty.
   */
  public       boolean readingError   = false;

  /**
   * Reset the encoder to factory defaults.
   */
  public abstract void factoryDefault();

  /**
   * Clear sticky faults on the encoder.
   */
  public abstract void clearStickyFaults();

  /**
   * Configure the absolute encoder to read from [0, 360) per second.
   *
   * @param inverted Whether the encoder is inverted.
   */
  public abstract void configure(boolean inverted);

  /**
   * Get the absolute position of the encoder.
   *
   * @return Absolute position in degrees from [0, 360).
   */
  public abstract double getAbsolutePosition();

  /**
   * Get the instantiated absolute encoder Object.
   *
   * @return Absolute encoder object.
   */
  public abstract Object getAbsoluteEncoder();

  /**
   * Sets the Absolute Encoder offset at the Encoder Level.
   *
   * @param offset the offset the Absolute Encoder uses as the zero point.
   * @return if setting Absolute Encoder Offset was successful or not.
   */
  public abstract boolean setAbsoluteEncoderOffset(double offset);

  /**
   * Get the velocity in degrees/sec.
   *
   * @return velocity in degrees/sec.
   */
  public abstract double getVelocity();
}
