#ifndef FRC_REVLIB_SRC_MAIN_NATIVE_INCLUDE_REV_SIM_SPARKABSOLUTEENCODERSIM_H_
#define FRC_REVLIB_SRC_MAIN_NATIVE_INCLUDE_REV_SIM_SPARKABSOLUTEENCODERSIM_H_
#include <string>
#include <frc/simulation/SimDeviceSim.h>
#include <hal/SimDevice.h>
#include "rev/SparkBase.h"
#include "rev/SparkFlex.h"
#include "rev/SparkMax.h"
namespace rev::spark {
class SparkAbsoluteEncoderSim {
public:
explicit SparkAbsoluteEncoderSim(SparkMax* motor);
explicit SparkAbsoluteEncoderSim(SparkFlex* motor);
void SetPosition(double position);
double GetPosition() const;
void SetVelocity(double velocity);
double GetVelocity() const;
void SetInverted(bool inverted);
bool GetInverted() const;
void SetZeroOffset(double zeroOffset);
double GetZeroOffset() const;
double GetPositionConversionFactor() const;
double GetVelocityConversionFactor() const;
void iterate(double velocity, double dt);
private:
void SetupSimDevice();
hal::SimDouble m_position;
hal::SimDouble m_velocity;
hal::SimBoolean m_isInverted;
hal::SimDouble m_zeroOffset;
hal::SimDouble m_positionConversionFactor;
hal::SimDouble m_velocityConversionFactor;
SparkBase* m_spark;
std::string simDeviceName;
};
}
#endif