2023-02-13 17:21:24 -06:00
|
|
|
package swervelib.parser.json;
|
2023-02-13 14:37:05 -06:00
|
|
|
|
|
|
|
|
import edu.wpi.first.math.util.Units;
|
2023-02-13 17:21:24 -06:00
|
|
|
import swervelib.encoders.CANCoderSwerve;
|
|
|
|
|
import swervelib.encoders.SwerveAbsoluteEncoder;
|
|
|
|
|
import swervelib.motors.SwerveMotor;
|
|
|
|
|
import swervelib.motors.TalonFXSwerve;
|
|
|
|
|
import swervelib.motors.TalonSRXSwerve;
|
|
|
|
|
import swervelib.parser.PIDFConfig;
|
|
|
|
|
import swervelib.parser.SwerveModuleConfiguration;
|
|
|
|
|
import swervelib.parser.SwerveModulePhysicalCharacteristics;
|
|
|
|
|
import swervelib.parser.json.modules.BoolMotorJson;
|
|
|
|
|
import swervelib.parser.json.modules.LocationJson;
|
2023-02-13 14:37:05 -06:00
|
|
|
|
|
|
|
|
/**
|
2023-02-13 17:21:24 -06:00
|
|
|
* {@link swervelib.SwerveModule} JSON parsed class. Used to access the JSON data.
|
2023-02-13 14:37:05 -06:00
|
|
|
*/
|
|
|
|
|
public class ModuleJson
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Drive motor device configuration.
|
|
|
|
|
*/
|
|
|
|
|
public DeviceJson drive;
|
|
|
|
|
/**
|
|
|
|
|
* Angle motor device configuration.
|
|
|
|
|
*/
|
|
|
|
|
public DeviceJson angle;
|
|
|
|
|
/**
|
|
|
|
|
* Absolute encoder device configuration.
|
|
|
|
|
*/
|
|
|
|
|
public DeviceJson encoder;
|
|
|
|
|
/**
|
|
|
|
|
* Defines which motors are inverted.
|
|
|
|
|
*/
|
|
|
|
|
public BoolMotorJson inverted;
|
|
|
|
|
/**
|
|
|
|
|
* Absolute encoder offset from 0 in degrees.
|
|
|
|
|
*/
|
|
|
|
|
public double absoluteEncoderOffset;
|
|
|
|
|
/**
|
|
|
|
|
* Absolute encoder inversion state.
|
|
|
|
|
*/
|
|
|
|
|
public boolean absoluteEncoderInverted = false;
|
|
|
|
|
/**
|
|
|
|
|
* The location of the swerve module from the center of the robot in inches.
|
|
|
|
|
*/
|
|
|
|
|
public LocationJson location;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Create the swerve module configuration based off of parsed data.
|
|
|
|
|
*
|
|
|
|
|
* @param anglePIDF The PIDF values for the angle motor.
|
|
|
|
|
* @param velocityPIDF The velocity PIDF values for the drive motor.
|
|
|
|
|
* @param maxSpeed The maximum speed of the robot in meters per second.
|
|
|
|
|
* @param physicalCharacteristics Physical characteristics of the swerve module.
|
|
|
|
|
* @return {@link SwerveModuleConfiguration} based on the provided data and parsed data.
|
|
|
|
|
*/
|
|
|
|
|
public SwerveModuleConfiguration createModuleConfiguration(PIDFConfig anglePIDF, PIDFConfig velocityPIDF,
|
|
|
|
|
double maxSpeed,
|
|
|
|
|
SwerveModulePhysicalCharacteristics physicalCharacteristics)
|
|
|
|
|
{
|
|
|
|
|
SwerveMotor angleMotor = angle.createMotor(false);
|
|
|
|
|
SwerveAbsoluteEncoder absEncoder = encoder.createEncoder();
|
|
|
|
|
|
|
|
|
|
// If the absolute encoder is attached.
|
|
|
|
|
if (absEncoder == null)
|
|
|
|
|
{
|
|
|
|
|
absEncoder = angle.createIntegratedEncoder(angleMotor);
|
|
|
|
|
angleMotor.setAbsoluteEncoder(absEncoder);
|
2023-02-13 17:21:24 -06:00
|
|
|
} else if ((angleMotor instanceof TalonFXSwerve || angleMotor instanceof TalonSRXSwerve) &&
|
|
|
|
|
absEncoder instanceof CANCoderSwerve)
|
|
|
|
|
{
|
|
|
|
|
angleMotor.setAbsoluteEncoder(absEncoder);
|
2023-02-13 14:37:05 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return new SwerveModuleConfiguration(drive.createMotor(true), angleMotor, absEncoder,
|
|
|
|
|
absoluteEncoderOffset, Units.inchesToMeters(location.x),
|
|
|
|
|
Units.inchesToMeters(location.y), anglePIDF, velocityPIDF, maxSpeed,
|
|
|
|
|
physicalCharacteristics, absoluteEncoderInverted, inverted.drive,
|
|
|
|
|
inverted.angle);
|
|
|
|
|
}
|
|
|
|
|
}
|