Files
YAGSL/swervelib/parser/json/DeviceJson.java

198 lines
6.7 KiB
Java
Raw Normal View History

2023-02-13 17:21:24 -06:00
package swervelib.parser.json;
2023-02-13 14:37:05 -06:00
2024-02-12 18:59:40 -06:00
import static swervelib.telemetry.SwerveDriveTelemetry.canIdWarning;
import static swervelib.telemetry.SwerveDriveTelemetry.i2cLockupWarning;
import static swervelib.telemetry.SwerveDriveTelemetry.serialCommsIssueWarning;
2024-01-15 14:37:13 -06:00
import com.revrobotics.SparkRelativeEncoder.Type;
import edu.wpi.first.wpilibj.DriverStation;
import edu.wpi.first.wpilibj.I2C;
import edu.wpi.first.wpilibj.SPI;
2023-02-22 23:10:57 -06:00
import edu.wpi.first.wpilibj.SerialPort.Port;
import swervelib.encoders.AnalogAbsoluteEncoderSwerve;
2023-02-13 17:21:24 -06:00
import swervelib.encoders.CANCoderSwerve;
2024-09-03 14:46:24 -05:00
import swervelib.encoders.CanAndMagSwerve;
import swervelib.encoders.PWMDutyCycleEncoderSwerve;
import swervelib.encoders.SparkMaxAnalogEncoderSwerve;
2023-02-13 17:21:24 -06:00
import swervelib.encoders.SparkMaxEncoderSwerve;
import swervelib.encoders.SwerveAbsoluteEncoder;
import swervelib.imu.ADIS16448Swerve;
import swervelib.imu.ADIS16470Swerve;
import swervelib.imu.ADXRS450Swerve;
import swervelib.imu.AnalogGyroSwerve;
2023-02-13 17:21:24 -06:00
import swervelib.imu.NavXSwerve;
import swervelib.imu.Pigeon2Swerve;
import swervelib.imu.PigeonSwerve;
import swervelib.imu.SwerveIMU;
2024-01-15 14:37:13 -06:00
import swervelib.motors.SparkFlexSwerve;
import swervelib.motors.SparkMaxBrushedMotorSwerve;
2023-02-13 17:21:24 -06:00
import swervelib.motors.SparkMaxSwerve;
import swervelib.motors.SwerveMotor;
import swervelib.motors.TalonFXSwerve;
import swervelib.motors.TalonSRXSwerve;
2023-02-13 14:37:05 -06:00
/**
* Device JSON parsed class. Used to access the JSON data.
*/
public class DeviceJson
{
/**
* The device type, e.g. pigeon/pigeon2/sparkmax/talonfx/navx
*/
2024-02-12 18:59:40 -06:00
public String type;
2023-02-13 14:37:05 -06:00
/**
* The CAN ID or pin ID of the device.
*/
2024-02-12 18:59:40 -06:00
public int id;
2023-02-13 14:37:05 -06:00
/**
* The CAN bus name which the device resides on if using CAN.
*/
2024-02-12 18:59:40 -06:00
public String canbus = "";
2023-02-13 14:37:05 -06:00
/**
* Create a {@link SwerveAbsoluteEncoder} from the current configuration.
*
* @param motor {@link SwerveMotor} of which attached encoders will be created from, only used when the type is
* "attached" or "canandencoder".
2023-02-13 14:37:05 -06:00
* @return {@link SwerveAbsoluteEncoder} given.
*/
public SwerveAbsoluteEncoder createEncoder(SwerveMotor motor)
2023-02-13 14:37:05 -06:00
{
if (id > 40)
{
2024-01-17 09:17:39 -06:00
canIdWarning.set(true);
}
2023-02-13 14:37:05 -06:00
switch (type)
{
case "none":
return null;
2023-02-13 14:37:05 -06:00
case "integrated":
case "attached":
2024-09-03 14:46:24 -05:00
case "canandmag":
case "canandcoder":
2023-08-09 15:05:33 -05:00
return new SparkMaxEncoderSwerve(motor, 360);
2024-08-24 17:48:05 -05:00
case "sparkmax_analog":
return new SparkMaxAnalogEncoderSwerve(motor, 3.3);
2023-08-09 15:05:33 -05:00
case "canandcoder_can":
2024-09-03 14:46:24 -05:00
case "canandmag_can":
return new CanAndMagSwerve(id);
case "ctre_mag":
case "rev_hex":
2023-11-29 16:48:33 -06:00
case "throughbore":
case "am_mag":
case "dutycycle":
return new PWMDutyCycleEncoderSwerve(id);
case "thrifty":
2024-01-18 10:43:29 -06:00
case "ma3":
case "analog":
return new AnalogAbsoluteEncoderSwerve(id);
2023-02-13 14:37:05 -06:00
case "cancoder":
return new CANCoderSwerve(id, canbus != null ? canbus : "");
default:
throw new RuntimeException(type + " is not a recognized absolute encoder type.");
}
}
/**
* Create a {@link SwerveIMU} from the given configuration.
*
* @return {@link SwerveIMU} given.
*/
public SwerveIMU createIMU()
{
if (id > 40)
{
2024-01-17 09:17:39 -06:00
canIdWarning.set(true);
}
2023-02-13 14:37:05 -06:00
switch (type)
{
case "adis16448":
return new ADIS16448Swerve();
case "adis16470":
return new ADIS16470Swerve();
case "adxrs450":
return new ADXRS450Swerve();
case "analog":
return new AnalogGyroSwerve(id);
2023-11-29 16:48:33 -06:00
case "navx":
case "navx_spi":
return new NavXSwerve(SPI.Port.kMXP);
case "navx_i2c":
DriverStation.reportWarning(
"WARNING: There exists an I2C lockup issue on the roboRIO that could occur, more information here: " +
"\nhttps://docs.wpilib.org/en/stable/docs/yearly-overview/known-issues" +
".html#onboard-i2c-causing-system-lockups",
false);
2024-01-17 09:17:39 -06:00
i2cLockupWarning.set(true);
return new NavXSwerve(I2C.Port.kMXP);
2023-02-22 23:10:57 -06:00
case "navx_usb":
2024-01-22 17:27:37 -06:00
DriverStation.reportWarning("WARNING: There is issues when using USB camera's and the NavX like this!\n" +
"https://pdocs.kauailabs.com/navx-mxp/guidance/selecting-an-interface/", false);
serialCommsIssueWarning.set(true);
2023-02-22 23:10:57 -06:00
return new NavXSwerve(Port.kUSB);
2024-01-22 15:11:18 -06:00
case "navx_mxp_serial":
2024-01-22 17:27:37 -06:00
serialCommsIssueWarning.set(true);
2023-02-22 23:10:57 -06:00
return new NavXSwerve(Port.kMXP);
2023-02-13 14:37:05 -06:00
case "pigeon":
return new PigeonSwerve(id);
case "pigeon2":
return new Pigeon2Swerve(id, canbus != null ? canbus : "");
default:
throw new RuntimeException(type + " is not a recognized imu/gyroscope type.");
2023-02-13 14:37:05 -06:00
}
}
/**
* Create a {@link SwerveMotor} from the given configuration.
*
* @param isDriveMotor If the motor being generated is a drive motor.
* @return {@link SwerveMotor} given.
*/
public SwerveMotor createMotor(boolean isDriveMotor)
{
if (id > 40)
{
2024-01-17 09:17:39 -06:00
canIdWarning.set(true);
}
2023-02-13 17:21:24 -06:00
switch (type)
2023-02-13 14:37:05 -06:00
{
case "sparkmax_brushed":
switch (canbus)
{
case "greyhill_63r256":
return new SparkMaxBrushedMotorSwerve(id, isDriveMotor, Type.kQuadrature, 1024, false);
case "srx_mag_encoder":
return new SparkMaxBrushedMotorSwerve(id, isDriveMotor, Type.kQuadrature, 4096, false);
case "throughbore":
return new SparkMaxBrushedMotorSwerve(id, isDriveMotor, Type.kQuadrature, 8192, false);
case "throughbore_dataport":
return new SparkMaxBrushedMotorSwerve(id, isDriveMotor, Type.kNoSensor, 8192, true);
case "greyhill_63r256_dataport":
return new SparkMaxBrushedMotorSwerve(id, isDriveMotor, Type.kQuadrature, 1024, true);
case "srx_mag_encoder_dataport":
return new SparkMaxBrushedMotorSwerve(id, isDriveMotor, Type.kQuadrature, 4096, true);
default:
if (isDriveMotor)
{
throw new RuntimeException("Spark MAX " + id + " MUST have a encoder attached to the motor controller.");
}
// We are creating a motor for an angle motor which will use the absolute encoder attached to the data port.
return new SparkMaxBrushedMotorSwerve(id, isDriveMotor, Type.kNoSensor, 0, false);
}
case "neo":
2023-02-13 17:21:24 -06:00
case "sparkmax":
return new SparkMaxSwerve(id, isDriveMotor);
2024-01-15 14:37:13 -06:00
case "sparkflex":
return new SparkFlexSwerve(id, isDriveMotor);
2023-02-13 17:21:24 -06:00
case "falcon":
case "talonfx":
return new TalonFXSwerve(id, canbus != null ? canbus : "", isDriveMotor);
case "talonsrx":
return new TalonSRXSwerve(id, isDriveMotor);
default:
throw new RuntimeException(type + " is not a recognized motor type.");
2023-02-13 14:37:05 -06:00
}
}
}