blob: f03a4423548b61fb0d015bf26b2f520b043e45d9 [file] [log] [blame]
#ifndef FRC971_ZEROING_HALL_EFFECT_AND_POSITION_H_
#define FRC971_ZEROING_HALL_EFFECT_AND_POSITION_H_
#include "flatbuffers/flatbuffers.h"
#include "frc971/zeroing/zeroing.h"
namespace frc971 {
namespace zeroing {
// Estimates the position with an incremental encoder and a hall effect sensor.
class HallEffectAndPositionZeroingEstimator
: public ZeroingEstimator<HallEffectAndPosition,
constants::HallEffectZeroingConstants,
HallEffectAndPositionEstimatorState> {
public:
explicit HallEffectAndPositionZeroingEstimator(
const ZeroingConstants &constants);
// Update the internal logic with the next sensor values.
void UpdateEstimate(const Position &info) override;
// Reset the internal logic so it needs to be re-zeroed.
void Reset() override;
// Manually trigger an internal error. This is used for testing the error
// logic.
void TriggerError() override;
bool error() const override { return error_; }
bool zeroed() const override { return zeroed_; }
double offset() const override { return offset_; }
bool offset_ready() const override { return zeroed_; }
// Returns information about our current state.
virtual flatbuffers::Offset<State> GetEstimatorState(
flatbuffers::FlatBufferBuilder *fbb) const override;
private:
// Sets the minimum and maximum posedge position values.
void StoreEncoderMaxAndMin(const HallEffectAndPosition &info);
// The zeroing constants used to describe the configuration of the system.
const ZeroingConstants constants_;
// The estimated state of the hall effect.
double current_ = 0.0;
// The estimated position.
double position_ = 0.0;
// The smallest and largest positions of the last set of encoder positions
// while the hall effect was low.
double min_low_position_;
double max_low_position_;
// If we've seen the hall effect high for enough times without going low, then
// we can be sure it isn't a false positive.
bool high_long_enough_;
size_t cycles_high_;
bool last_hall_ = false;
// The estimated starting position of the mechanism. We also call this the
// 'offset' in some contexts.
double offset_;
// Flag for triggering logic that takes note of the current posedge count
// after a reset. See `last_used_posedge_count_'.
bool initialized_;
// After a reset we keep track of the posedge count with this. Only after the
// posedge count changes (i.e. increments at least once or wraps around) will
// we consider the mechanism zeroed. We also use this to store the most recent
// `HallEffectAndPosition::posedge_count' value when the start position
// was calculated. It helps us calculate the start position only on posedges
// to reject corrupted intermediate data.
int32_t last_used_posedge_count_;
// Marker to track whether we're fully zeroed yet or not.
bool zeroed_;
// Marker to track whether an error has occurred. This gets reset to false
// whenever Reset() is called.
bool error_ = false;
// Stores the position "start_pos" variable the first time the program
// is zeroed.
double first_start_pos_;
};
} // namespace zeroing
} // namespace frc971
#endif // FRC971_ZEROING_HALL_EFFECT_AND_POSITION_H_