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}