001/************************ PROJECT ZIXI ************************/ 002/* Copyright (c) 2026 StuyPulse Robotics. All rights reserved.*/ 003/* This work is licensed under the terms of the MIT license. */ 004/**************************************************************/ 005package com.stuypulse.robot.subsystems.swerve; 006 007import static org.wpilib.units.Units.Amps; 008import static org.wpilib.units.Units.Radians; 009import static org.wpilib.units.Units.RotationsPerSecond; 010import static org.wpilib.units.Units.Volts; 011 012import org.wpilib.math.geometry.Rotation2d; 013import org.wpilib.units.measure.Angle; 014import org.wpilib.units.measure.AngularVelocity; 015import org.wpilib.units.measure.Current; 016import org.wpilib.units.measure.Voltage; 017 018import com.ctre.phoenix6.swerve.SwerveModuleConstants; 019 020import org.littletonrobotics.junction.AutoLog; 021 022public interface ModuleIO { 023 @AutoLog 024 public static class ModuleIOInputs { 025 public boolean driveConnected = false; 026 public Angle drivePosition = Radians.zero(); 027 public AngularVelocity driveVelocity = RotationsPerSecond.zero(); 028 public Voltage driveAppliedVolts = Volts.zero(); 029 public Current driveCurrentAmps = Amps.zero(); 030 031 public boolean turnConnected = false; 032 public boolean turnEncoderConnected = false; 033 public Rotation2d turnAbsolutePosition = Rotation2d.ZERO; 034 public Rotation2d turnPosition = Rotation2d.ZERO; 035 public double turnVelocityRadPerSec = 0.0; 036 public double turnAppliedVolts = 0.0; 037 public double turnCurrentAmps = 0.0; 038 039 public double[] odometryTimestamps = new double[] {}; 040 public Angle[] odometryDrivePositions = new Angle[] {}; 041 public Rotation2d[] odometryTurnPositions = new Rotation2d[] {}; 042 } 043 044 /** Updates the set of loggable inputs. */ 045 public default void updateInputs(ModuleIOInputs inputs) {} 046 047 enum DriveOutputMode { 048 VELOCITY, 049 OPEN_LOOP 050 } 051 052 enum TurnOutputMode { 053 POSITION, 054 OPEN_LOOP 055 } 056 057 class ModuleIOOutputs { 058 DriveOutputMode driveOutputMode = DriveOutputMode.VELOCITY; 059 060 /** 061 * Either amps or volts, depending on {@link 062 * SwerveModuleConstants#DriveMotorClosedLoopOutput} 063 */ 064 double driveTargetOpenLoop = 0.0; 065 066 AngularVelocity driveTargetVelocity = RotationsPerSecond.zero(); 067 068 TurnOutputMode turnOutputMode = TurnOutputMode.POSITION; 069 070 /** 071 * Either amps or volts, depending on {@link 072 * SwerveModuleConstants#DriveMotorClosedLoopOutput} 073 */ 074 double turnTargetOpenLoop = 0.0; 075 076 Angle turnTargetPosition = Radians.zero(); 077 } 078 079 public default void applyOutputs(ModuleIOOutputs outputs) {} 080}