#ifndef FRC971_CONSTANTS_H_
#define FRC971_CONSTANTS_H_

#include <cstddef>

namespace frc971 {
namespace constants {

struct HallEffectZeroingConstants {
  // The absolute position of the lower edge of the hall effect sensor.
  double lower_hall_position;
  // The absolute position of the upper edge of the hall effect sensor.
  double upper_hall_position;
  // The difference in scaled units between two hall effect edges.  This is the
  // number of units/cycle.
  double index_difference;
  // Number of cycles we need to see the hall effect high.
  size_t hall_trigger_zeroing_length;
  // Direction the system must be moving in order to zero. True is positive,
  // False is negative direction.
  bool zeroing_move_direction;
};

struct PotAndIndexPulseZeroingConstants {
  // The number of samples in the moving average filter.
  size_t average_filter_size;
  // The difference in scaled units between two index pulses.
  double index_difference;
  // The absolute position in scaled units of one of the index pulses.
  double measured_index_position;
  // Value between 0 and .5 which determines a fraction of the index_diff
  // you want to use.
  double allowable_encoder_error;
};

struct EncoderPlusIndexZeroingConstants {
  // The amount of index pulses in the joint's range of motion.
  int index_pulse_count;
  // The difference in scaled units between two index pulses.
  double index_difference;
  // The absolute position in scaled units of one of the index pulses.
  double measured_index_position;
  // The index pulse that is known, going from lowest in the range of motion to
  // highest (Starting at 0).
  int known_index_pulse;
  // Value between 0 and 0.5 which determines a fraction of the index_diff
  // you want to use. If an index pulse deviates by more than this amount from
  // where we expect to see one then we flag an error.
  double allowable_encoder_error;
};

struct PotAndAbsoluteEncoderZeroingConstants {
  // The number of samples in the moving average filter.
  size_t average_filter_size;
  // The distance that the absolute encoder needs to complete a full rotation.
  double one_revolution_distance;
  // Measured absolute position of the encoder when at zero.
  double measured_absolute_position;

  // Treshold for deciding if we are moving. moving_buffer_size samples need to
  // be within this distance of each other before we use the middle one to zero.
  double zeroing_threshold;
  // Buffer size for deciding if we are moving.
  size_t moving_buffer_size;

  // Value between 0 and 1 indicating what fraction of one_revolution_distance
  // it is acceptable for the offset to move.
  double allowable_encoder_error;
};

struct AbsoluteEncoderZeroingConstants {
  // The number of samples in the moving average filter.
  size_t average_filter_size;
  // The distance that the absolute encoder needs to complete a full rotation.
  double one_revolution_distance;
  // Measured absolute position of the encoder when at zero.
  double measured_absolute_position;
  // Position of the middle of the range of motion in output coordinates.
  double middle_position;

  // Threshold for deciding if we are moving. moving_buffer_size samples need to
  // be within this distance of each other before we use the middle one to zero.
  double zeroing_threshold;
  // Buffer size for deciding if we are moving.
  size_t moving_buffer_size;

  // Value between 0 and 1 indicating what fraction of one_revolution_distance
  // it is acceptable for the offset to move.
  double allowable_encoder_error;
};

// Defines a range of motion for a subsystem.
// These are all absolute positions in scaled units.
struct Range {
  double lower_hard;
  double upper_hard;
  double lower;
  double upper;

  constexpr double middle() const { return (lower_hard + upper_hard) / 2.0; }

  constexpr double range() const { return upper_hard - lower_hard; }
};

}  // namespace constants
}  // namespace frc971

#endif  // FRC971_CONSTANTS_H_
