

  py::enum_<rev::CANDigitalInput::LimitSwitch>(m, "LimitSwitch")
    .value("kForward", rev::CANDigitalInput::LimitSwitch::kForward)
    .value("kReverse", rev::CANDigitalInput::LimitSwitch::kReverse)
;

  py::enum_<rev::CANDigitalInput::LimitSwitchPolarity>(m, "LimitSwitchPolarity")
    .value("kNormallyOpen", rev::CANDigitalInput::LimitSwitchPolarity::kNormallyOpen)
    .value("kNormallyClosed", rev::CANDigitalInput::LimitSwitchPolarity::kNormallyClosed)
;

  py::enum_<rev::CANError>(m, "CANError")
    .value("kOK", rev::CANError::kOK)
    .value("kError", rev::CANError::kError)
    .value("kTimeout", rev::CANError::kTimeout)
;

  py::enum_<rev::CANSparkMaxLowLevel::MotorType>(m, "MotorType")
    .value("kBrushed", rev::CANSparkMaxLowLevel::MotorType::kBrushed)
    .value("kBrushless", rev::CANSparkMaxLowLevel::MotorType::kBrushless)
;

  py::enum_<rev::CANSparkMaxLowLevel::ParameterStatus>(m, "ParameterStatus")
    .value("kOK", rev::CANSparkMaxLowLevel::ParameterStatus::kOK)
    .value("kInvalidID", rev::CANSparkMaxLowLevel::ParameterStatus::kInvalidID)
    .value("kMismatchType", rev::CANSparkMaxLowLevel::ParameterStatus::kMismatchType)
    .value("kAccessMode", rev::CANSparkMaxLowLevel::ParameterStatus::kAccessMode)
    .value("kInvalid", rev::CANSparkMaxLowLevel::ParameterStatus::kInvalid)
    .value("kNotImplementedDeprecated", rev::CANSparkMaxLowLevel::ParameterStatus::kNotImplementedDeprecated)
;

  py::enum_<rev::CANSparkMaxLowLevel::ConfigParameter>(m, "ConfigParameter")
    .value("kCanID", rev::CANSparkMaxLowLevel::ConfigParameter::kCanID)
    .value("kInputMode", rev::CANSparkMaxLowLevel::ConfigParameter::kInputMode)
    .value("kMotorType", rev::CANSparkMaxLowLevel::ConfigParameter::kMotorType)
    .value("kCommAdvance", rev::CANSparkMaxLowLevel::ConfigParameter::kCommAdvance)
    .value("kSensorType", rev::CANSparkMaxLowLevel::ConfigParameter::kSensorType)
    .value("kCtrlType", rev::CANSparkMaxLowLevel::ConfigParameter::kCtrlType)
    .value("kIdleMode", rev::CANSparkMaxLowLevel::ConfigParameter::kIdleMode)
    .value("kInputDeadband", rev::CANSparkMaxLowLevel::ConfigParameter::kInputDeadband)
    .value("kFirmwareVer", rev::CANSparkMaxLowLevel::ConfigParameter::kFirmwareVer)
    .value("kHallOffset", rev::CANSparkMaxLowLevel::ConfigParameter::kHallOffset)
    .value("kPolePairs", rev::CANSparkMaxLowLevel::ConfigParameter::kPolePairs)
    .value("kCurrentChop", rev::CANSparkMaxLowLevel::ConfigParameter::kCurrentChop)
    .value("kCurrentChopCycles", rev::CANSparkMaxLowLevel::ConfigParameter::kCurrentChopCycles)
    .value("kP_0", rev::CANSparkMaxLowLevel::ConfigParameter::kP_0)
    .value("kI_0", rev::CANSparkMaxLowLevel::ConfigParameter::kI_0)
    .value("kD_0", rev::CANSparkMaxLowLevel::ConfigParameter::kD_0)
    .value("kF_0", rev::CANSparkMaxLowLevel::ConfigParameter::kF_0)
    .value("kIZone_0", rev::CANSparkMaxLowLevel::ConfigParameter::kIZone_0)
    .value("kDFilter_0", rev::CANSparkMaxLowLevel::ConfigParameter::kDFilter_0)
    .value("kOutputMin_0", rev::CANSparkMaxLowLevel::ConfigParameter::kOutputMin_0)
    .value("kOutputMax_0", rev::CANSparkMaxLowLevel::ConfigParameter::kOutputMax_0)
    .value("kP_1", rev::CANSparkMaxLowLevel::ConfigParameter::kP_1)
    .value("kI_1", rev::CANSparkMaxLowLevel::ConfigParameter::kI_1)
    .value("kD_1", rev::CANSparkMaxLowLevel::ConfigParameter::kD_1)
    .value("kF_1", rev::CANSparkMaxLowLevel::ConfigParameter::kF_1)
    .value("kIZone_1", rev::CANSparkMaxLowLevel::ConfigParameter::kIZone_1)
    .value("kDFilter_1", rev::CANSparkMaxLowLevel::ConfigParameter::kDFilter_1)
    .value("kOutputMin_1", rev::CANSparkMaxLowLevel::ConfigParameter::kOutputMin_1)
    .value("kOutputMax_1", rev::CANSparkMaxLowLevel::ConfigParameter::kOutputMax_1)
    .value("kP_2", rev::CANSparkMaxLowLevel::ConfigParameter::kP_2)
    .value("kI_2", rev::CANSparkMaxLowLevel::ConfigParameter::kI_2)
    .value("kD_2", rev::CANSparkMaxLowLevel::ConfigParameter::kD_2)
    .value("kF_2", rev::CANSparkMaxLowLevel::ConfigParameter::kF_2)
    .value("kIZone_2", rev::CANSparkMaxLowLevel::ConfigParameter::kIZone_2)
    .value("kDFilter_2", rev::CANSparkMaxLowLevel::ConfigParameter::kDFilter_2)
    .value("kOutputMin_2", rev::CANSparkMaxLowLevel::ConfigParameter::kOutputMin_2)
    .value("kOutputMax_2", rev::CANSparkMaxLowLevel::ConfigParameter::kOutputMax_2)
    .value("kP_3", rev::CANSparkMaxLowLevel::ConfigParameter::kP_3)
    .value("kI_3", rev::CANSparkMaxLowLevel::ConfigParameter::kI_3)
    .value("kD_3", rev::CANSparkMaxLowLevel::ConfigParameter::kD_3)
    .value("kF_3", rev::CANSparkMaxLowLevel::ConfigParameter::kF_3)
    .value("kIZone_3", rev::CANSparkMaxLowLevel::ConfigParameter::kIZone_3)
    .value("kDFilter_3", rev::CANSparkMaxLowLevel::ConfigParameter::kDFilter_3)
    .value("kOutputMin_3", rev::CANSparkMaxLowLevel::ConfigParameter::kOutputMin_3)
    .value("kOutputMax_3", rev::CANSparkMaxLowLevel::ConfigParameter::kOutputMax_3)
    .value("kReserved", rev::CANSparkMaxLowLevel::ConfigParameter::kReserved)
    .value("kOutputRatio", rev::CANSparkMaxLowLevel::ConfigParameter::kOutputRatio)
    .value("kSerialNumberLow", rev::CANSparkMaxLowLevel::ConfigParameter::kSerialNumberLow)
    .value("kSerialNumberMid", rev::CANSparkMaxLowLevel::ConfigParameter::kSerialNumberMid)
    .value("kSerialNumberHigh", rev::CANSparkMaxLowLevel::ConfigParameter::kSerialNumberHigh)
    .value("kLimitSwitchFwdPolarity", rev::CANSparkMaxLowLevel::ConfigParameter::kLimitSwitchFwdPolarity)
    .value("kLimitSwitchRevPolarity", rev::CANSparkMaxLowLevel::ConfigParameter::kLimitSwitchRevPolarity)
    .value("kHardLimitFwdEn", rev::CANSparkMaxLowLevel::ConfigParameter::kHardLimitFwdEn)
    .value("kHardLimitRevEn", rev::CANSparkMaxLowLevel::ConfigParameter::kHardLimitRevEn)
    .value("kSoftLimitFwdEn", rev::CANSparkMaxLowLevel::ConfigParameter::kSoftLimitFwdEn)
    .value("kSoftLimitRevEn", rev::CANSparkMaxLowLevel::ConfigParameter::kSoftLimitRevEn)
    .value("kRampRate", rev::CANSparkMaxLowLevel::ConfigParameter::kRampRate)
    .value("kFollowerID", rev::CANSparkMaxLowLevel::ConfigParameter::kFollowerID)
    .value("kFollowerConfig", rev::CANSparkMaxLowLevel::ConfigParameter::kFollowerConfig)
    .value("kSmartCurrentStallLimit", rev::CANSparkMaxLowLevel::ConfigParameter::kSmartCurrentStallLimit)
    .value("kSmartCurrentFreeLimit", rev::CANSparkMaxLowLevel::ConfigParameter::kSmartCurrentFreeLimit)
    .value("kSmartCurrentConfig", rev::CANSparkMaxLowLevel::ConfigParameter::kSmartCurrentConfig)
    .value("kSmartCurrentReserved", rev::CANSparkMaxLowLevel::ConfigParameter::kSmartCurrentReserved)
    .value("kMotorKv", rev::CANSparkMaxLowLevel::ConfigParameter::kMotorKv)
    .value("kMotorR", rev::CANSparkMaxLowLevel::ConfigParameter::kMotorR)
    .value("kMotorL", rev::CANSparkMaxLowLevel::ConfigParameter::kMotorL)
    .value("kMotorRsvd1", rev::CANSparkMaxLowLevel::ConfigParameter::kMotorRsvd1)
    .value("kMotorRsvd2", rev::CANSparkMaxLowLevel::ConfigParameter::kMotorRsvd2)
    .value("kMotorRsvd3", rev::CANSparkMaxLowLevel::ConfigParameter::kMotorRsvd3)
    .value("kEncoderCountsPerRev", rev::CANSparkMaxLowLevel::ConfigParameter::kEncoderCountsPerRev)
    .value("kEncoderAverageDepth", rev::CANSparkMaxLowLevel::ConfigParameter::kEncoderAverageDepth)
    .value("kEncoderSampleDelta", rev::CANSparkMaxLowLevel::ConfigParameter::kEncoderSampleDelta)
;

  py::enum_<rev::CANSparkMaxLowLevel::ParameterType>(m, "ParameterType")
    .value("kInt32", rev::CANSparkMaxLowLevel::ParameterType::kInt32)
    .value("kUint32", rev::CANSparkMaxLowLevel::ParameterType::kUint32)
    .value("kFloat32", rev::CANSparkMaxLowLevel::ParameterType::kFloat32)
    .value("kBool", rev::CANSparkMaxLowLevel::ParameterType::kBool)
;

  py::enum_<rev::CANSparkMaxLowLevel::PeriodicFrame>(m, "PeriodicFrame")
    .value("kStatus0", rev::CANSparkMaxLowLevel::PeriodicFrame::kStatus0)
    .value("kStatus1", rev::CANSparkMaxLowLevel::PeriodicFrame::kStatus1)
    .value("kStatus2", rev::CANSparkMaxLowLevel::PeriodicFrame::kStatus2)
;

  py::enum_<rev::CANSparkMax::SensorType>(m, "SensorType")
    .value("kNoSensor", rev::CANSparkMax::SensorType::kNoSensor)
    .value("kHallSensor", rev::CANSparkMax::SensorType::kHallSensor)
    .value("kEncoder", rev::CANSparkMax::SensorType::kEncoder)
    .value("kSensorless", rev::CANSparkMax::SensorType::kSensorless)
;

  py::enum_<rev::CANSparkMax::IdleMode>(m, "IdleMode")
    .value("kCoast", rev::CANSparkMax::IdleMode::kCoast)
    .value("kBrake", rev::CANSparkMax::IdleMode::kBrake)
;

  py::enum_<rev::CANSparkMax::InputMode>(m, "InputMode")
    .value("kPWM", rev::CANSparkMax::InputMode::kPWM)
    .value("kCAN", rev::CANSparkMax::InputMode::kCAN)
;

  py::enum_<rev::CANSparkMax::FaultID>(m, "FaultID")
    .value("kBrownout", rev::CANSparkMax::FaultID::kBrownout)
    .value("kOvercurrent", rev::CANSparkMax::FaultID::kOvercurrent)
    .value("kOvervoltage", rev::CANSparkMax::FaultID::kOvervoltage)
    .value("kMotorFault", rev::CANSparkMax::FaultID::kMotorFault)
    .value("kSensorFault", rev::CANSparkMax::FaultID::kSensorFault)
    .value("kStall", rev::CANSparkMax::FaultID::kStall)
    .value("kEEPROMCRC", rev::CANSparkMax::FaultID::kEEPROMCRC)
    .value("kCANTX", rev::CANSparkMax::FaultID::kCANTX)
    .value("kCANRX", rev::CANSparkMax::FaultID::kCANRX)
    .value("kHasReset", rev::CANSparkMax::FaultID::kHasReset)
    .value("kDRVFault", rev::CANSparkMax::FaultID::kDRVFault)
    .value("kOtherFault", rev::CANSparkMax::FaultID::kOtherFault)
    .value("kSoftLimitFwd", rev::CANSparkMax::FaultID::kSoftLimitFwd)
    .value("kSoftLimitRev", rev::CANSparkMax::FaultID::kSoftLimitRev)
    .value("kHardLimitFwd", rev::CANSparkMax::FaultID::kHardLimitFwd)
    .value("kHardLimitRev", rev::CANSparkMax::FaultID::kHardLimitRev)
;

  py::enum_<rev::ControlType>(m, "ControlType")
    .value("kDutyCycle", rev::ControlType::kDutyCycle)
    .value("kVelocity", rev::ControlType::kVelocity)
    .value("kVoltage", rev::ControlType::kVoltage)
    .value("kPosition", rev::ControlType::kPosition)
;

