Package frc.robot.subsystems.swervedrive.swerve

## Class SwerveMotor

- java.lang.Object
- - frc.robot.subsystems.swervedrive.swerve.SwerveMotor

- Direct Known Subclasses:
    `CTRESwerveMotor`, `REVSwerveMotor`

      public abstract class SwerveMotor
      extends java.lang.Object

- - ### Nested Class Summary

    Nested Classes
    Modifier and Type | Class | Description
    --- | --- | ---
    `static class` | `SwerveMotor.ModuleMotorType` | Motor type for the swerve drive module

  - ### Field Summary

    Fields
    Modifier and Type | Field | Description
    --- | --- | ---
    `double` | `kD` | PIDF Values.
    `double` | `kF` | PIDF Values.
    `double` | `kI` | PIDF Values.
    `double` | `kIZ` | PIDF Values.
    `double` | `kP` | PIDF Values.
    `SwerveMotor.ModuleMotorType` | `m_motorType` | Module motor type.
    `double` | `target` | Target value for PID.

  - ### Constructor Summary

    Constructors
    Constructor | Description
    --- | ---
    `SwerveMotor()` |

  - ### Method Summary

    All Methods Static Methods Instance Methods Abstract Methods Concrete Methods
    Modifier and Type | Method | Description
    --- | --- | ---
    `static <MotorType extends edu.wpi.first.wpilibj.motorcontrol.MotorController> SwerveMotor` | `fromMotor​(MotorType motor, SwerveEncoder<?> absoluteEncoder, SwerveMotor.ModuleMotorType type, double gearRatio, double wheelDiameter, double freeSpeedRPM, double powerLimit)` | Constructor for Swerve Motor, expecting CANSparkMax or TalonFX.
    `abstract double` | `get()` | Get the current value of the encoder corresponding to the PID.
    `abstract double` | `getAmps()` | Get the current output.
    `abstract double` | `getPosition()` | Get the current value of the encoder.
    `abstract void` | `optimizeCANFrames()` | Optimize the CAN status frames to reduce utilization.
    `abstract boolean` | `reachable()` | Check that the link is good on the swerve module and CAN bus is able to retrieve data.
    `abstract boolean` | `remoteIntegratedEncoder()` | Check if the absolute encoder is used inplace of the integrated encoder.
    `abstract void` | `saveConfig()` | Save configuration data to the motor controller so it is persistent on reboot.
    `abstract void` | `set​(double speed)` | Set the speed of the drive motor from -1 to 1.
    `abstract void` | `setConversionFactor​(double conversionFactor)` | Configures the conversion factor based upon which motor.
    `abstract void` | `setCurrentLimit​(int currentLimit)` | Set the current limit for the swerve drive motor, remember this may cause jumping if used in conjunction with voltage compensation.
    `abstract void` | `setEncoder​(double value)` | Set the encoder value.
    `abstract void` | `setInverted​(boolean inverted)` | Invert the motor.
    `abstract void` | `setPIDF​(double P, double I, double D, double F, double integralZone)` | Set the PIDF coefficients for the closed loop PID onboard the SparkMax.
    `abstract void` | `setPIDOutputRange​(double min, double max)` | Configure the maximum power (-1 to 1) the PID can output.
    `abstract void` | `setTarget​(double target, double feedforward)` | Set the target for the PID loop.
    `abstract void` | `setVoltage​(double voltage)` | Set the voltage of the motor.
    `abstract void` | `setVoltageCompensation​(double nominalVoltage)` | Set the voltage compensation for the swerve module motor.
    `abstract void` | `stop()` | Stop the motor by sending 0 volts to it.

    - ### Methods inherited from class java.lang.Object

      `clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

- - ### Field Detail

    - #### m_motorType

          public SwerveMotor.ModuleMotorType m_motorType

      Module motor type.

    - #### kP

          public double kP

      PIDF Values.

    - #### kI

          public double kI

      PIDF Values.

    - #### kD

          public double kD

      PIDF Values.

    - #### kF

          public double kF

      PIDF Values.

    - #### kIZ

          public double kIZ

      PIDF Values.

    - #### target

          public double target

      Target value for PID.

  - ### Constructor Detail

    - #### SwerveMotor

          public SwerveMotor()

  - ### Method Detail

    - #### fromMotor

          public static <MotorType extends edu.wpi.first.wpilibj.motorcontrol.MotorController> SwerveMotor fromMotor​(MotorType motor,
                                                                                                                     SwerveEncoder<?> absoluteEncoder,
                                                                                                                     SwerveMotor.ModuleMotorType type,
                                                                                                                     double gearRatio,
                                                                                                                     double wheelDiameter,
                                                                                                                     double freeSpeedRPM,
                                                                                                                     double powerLimit)

      Constructor for Swerve Motor, expecting CANSparkMax or TalonFX. Clears sticky faults and restores factory defaults.
      Type Parameters:
        `MotorType` - Motor type to use.
      Parameters:
        `motor` - Motor controller.
        `absoluteEncoder` - The absolute encoder used for the module, if the motor is a turning motor and the encoder is compatible it will set the encoder as the remote integrated encoder and does not need periodic synchronization.
        `type` - Swerve module motor type.
        `gearRatio` - Gear ratio.
        `wheelDiameter` - Wheel diameter in meters.
        `freeSpeedRPM` - Free speed RPM of the motor.
        `powerLimit` - Power limit for the motor.

    - #### setPIDOutputRange

          public abstract void setPIDOutputRange​(double min,
                                                 double max)

      Configure the maximum power (-1 to 1) the PID can output. This helps manage voltage pull for the drive base.
      Parameters:
        `min` - Minimum output.
        `max` - Maximum output.

    - #### setPIDF

          public abstract void setPIDF​(double P,
                                       double I,
                                       double D,
                                       double F,
                                       double integralZone)

      Set the PIDF coefficients for the closed loop PID onboard the SparkMax.
      Parameters:
        `P` - Proportional gain for closed loop. This is multiplied by closed loop error in sensor units. Default is 1.0
        `I` - Integral gain for closed loop. This is multiplied by closed loop error in sensor units every PID Loop.
        `D` - Derivative gain for closed loop. This is multiplied by derivative error (sensor units per PID loop). Default is 0.1
        `F` - Feed Fwd gain for Closed loop.
        `integralZone` - Integral Zone can be used to auto clear the integral accumulator if the sensor pos is too far from the target. This prevents unstable oscillation if the kI is too large. Value is in sensor units.

    - #### setConversionFactor

          public abstract void setConversionFactor​(double conversionFactor)

      Configures the conversion factor based upon which motor.
      Parameters:
        `conversionFactor` - Conversion from RPM to MPS for drive motor, and rotations to degrees for the turning motor.

    - #### setTarget

          public abstract void setTarget​(double target,
                                         double feedforward)

      Set the target for the PID loop.
      Parameters:
        `target` - The PID target to aim for.
        `feedforward` - The feedforward for this target.

    - #### stop

          public abstract void stop()

      Stop the motor by sending 0 volts to it.

    - #### set

          public abstract void set​(double speed)

      Set the speed of the drive motor from -1 to 1.
      Parameters:
        `speed` - Speed from -1 to 1.

    - #### setVoltage

          public abstract void setVoltage​(double voltage)

      Set the voltage of the motor.
      Parameters:
        `voltage` - Voltage to output.

    - #### get

          public abstract double get()

      Get the current value of the encoder corresponding to the PID.
      Returns:
        Current value of the encoder either in velocity or position..

    - #### getAmps

          public abstract double getAmps()

      Get the current output.
      Returns:
        Output amps.

    - #### getPosition

          public abstract double getPosition()

      Get the current value of the encoder.
      Returns:
        Current value of the encoder.

    - #### setVoltageCompensation

          public abstract void setVoltageCompensation​(double nominalVoltage)

      Set the voltage compensation for the swerve module motor.
      Parameters:
        `nominalVoltage` - Nominal voltage for operation to output to.

    - #### setCurrentLimit

          public abstract void setCurrentLimit​(int currentLimit)

      Set the current limit for the swerve drive motor, remember this may cause jumping if used in conjunction with voltage compensation. This is useful to protect the motor from current spikes.
      Parameters:
        `currentLimit` - Current limit in AMPS at free speed.

    - #### setEncoder

          public abstract void setEncoder​(double value)

      Set the encoder value.
      Parameters:
        `value` - Value to set the encoder to.

    - #### reachable

          public abstract boolean reachable()

      Check that the link is good on the swerve module and CAN bus is able to retrieve data.
      Returns:
        true on all devices are accessible over CAN.

    - #### remoteIntegratedEncoder

          public abstract boolean remoteIntegratedEncoder()

      Check if the absolute encoder is used inplace of the integrated encoder.
      Returns:
        true, if the absolute encoder is being used as the integrated controller.

    - #### optimizeCANFrames

          public abstract void optimizeCANFrames()

      Optimize the CAN status frames to reduce utilization.

    - #### saveConfig

          public abstract void saveConfig()

      Save configuration data to the motor controller so it is persistent on reboot.

    - #### setInverted

          public abstract void setInverted​(boolean inverted)

      Invert the motor.
      Parameters:
        `inverted` - Set the motor as inverted.