From e0a5b83b19826fcc5a1cef794b05680ea0cf1d02 Mon Sep 17 00:00:00 2001 From: Matthew Lum <144396869+Rand0mAsianKid@users.noreply.github.com> Date: Sat, 28 Sep 2024 05:31:58 +0000 Subject: [PATCH 1/2] Coded outline for MA drivetrain and possible solution to gradle? --- build.gradle | 30 ++++++-- src/main/deploy/BuildInfo.properties | 12 ++++ .../java/org/carlmontrobotics/Constants.java | 24 ++++--- .../org/carlmontrobotics/RobotContainer.java | 72 +++++++------------ .../carlmontrobotics/commands/Autonomous.java | 36 ++++++++++ .../commands/TeleopDrive.java | 35 +++++++++ .../subsystems/Drivetrain.java | 42 +++++++++++ 7 files changed, 189 insertions(+), 62 deletions(-) create mode 100644 src/main/deploy/BuildInfo.properties create mode 100644 src/main/java/org/carlmontrobotics/commands/Autonomous.java create mode 100644 src/main/java/org/carlmontrobotics/commands/TeleopDrive.java create mode 100644 src/main/java/org/carlmontrobotics/subsystems/Drivetrain.java diff --git a/build.gradle b/build.gradle index 8d3b4ea..aad9d37 100644 --- a/build.gradle +++ b/build.gradle @@ -1,6 +1,7 @@ plugins { id "java" - id "edu.wpi.first.GradleRIO" version "2024.1.1" + id "edu.wpi.first.GradleRIO" version "2024.3.2" + id "com.peterabeles.gversion" version "1.10" } java { @@ -47,6 +48,17 @@ wpi.java.debugJni = false // Set this to true to enable desktop support. def includeDesktopSupport = true +allprojects { + repositories { + maven { url 'https://jitpack.io' }//for lib199 + } +} + +// Don't cache changing modules +configurations.all { + resolutionStrategy.cacheChangingModulesFor 0, 'seconds' +} + // Defining my dependencies. In this case, WPILib (+ friends), and vendor libraries. // Also defines JUnit 5. dependencies { @@ -68,11 +80,7 @@ dependencies { simulationRelease wpi.sim.enableRelease() testImplementation 'org.junit.jupiter:junit-jupiter:5.10.1' - implementation('org.carlmontrobotics:lib199') { - version { - branch = '2024' - } - } + implementation "com.github.deepbluerobotics:lib199:400693b52180c82a1f26c08025bc12f144b930f9" } test { @@ -103,3 +111,13 @@ wpi.java.configureTestTasks(test) tasks.withType(JavaCompile) { options.compilerArgs.add '-XDstringConcat=inline' } + +project.compileJava.dependsOn(createVersionFile) +gversion { + language = "Properties" + srcDir = "src/main/deploy/" + className = "BuildInfo.properties" + dateFormat = "yyyy-MM-dd HH:mm:ss z" + timeZone = "America/Los_Angeles" + indent = " " +} \ No newline at end of file diff --git a/src/main/deploy/BuildInfo.properties b/src/main/deploy/BuildInfo.properties new file mode 100644 index 0000000..708fa4f --- /dev/null +++ b/src/main/deploy/BuildInfo.properties @@ -0,0 +1,12 @@ +#Created by build system. Do not modify +#"2024-09-27 22:30:23 PDT" +version="unspecified" +revision=8 +name="EmptyProject2024" +timestamp=1727501423380 +group="" +sha="c3834ceb369a3d64b342b5461e6ef5f069fd76cf" +git_date="2024-03-27 19:48:52 PDT" +git_branch="M-A-Drivetrain-Skeleton" +build_date="2024-09-27 22:30:23 PDT" +dirty=1 diff --git a/src/main/java/org/carlmontrobotics/Constants.java b/src/main/java/org/carlmontrobotics/Constants.java index 6d6986d..240020e 100644 --- a/src/main/java/org/carlmontrobotics/Constants.java +++ b/src/main/java/org/carlmontrobotics/Constants.java @@ -1,15 +1,19 @@ package org.carlmontrobotics; public final class Constants { - // public static final class Drivetrain { - // public static final double MAX_SPEED_MPS = 2; - // } - public static final class OI { - public static final class Driver { - public static final int port = 0; - } - public static final class Manipulator { - public static final int port = 1; - } + + public final class Drivetrain{ + public static final int RIGHT_PORT = 0; + public static final int LEFT_PORT = 1; + } + + + //controllers + public static final class Driver { + public static final int DRIVER_CONTROLLER_PORT = 2; + } + public static final class Manipulator { + public static final int MANIPULATOR_CONTROLLER_PORT = 3; } + } diff --git a/src/main/java/org/carlmontrobotics/RobotContainer.java b/src/main/java/org/carlmontrobotics/RobotContainer.java index 836869c..34523ad 100644 --- a/src/main/java/org/carlmontrobotics/RobotContainer.java +++ b/src/main/java/org/carlmontrobotics/RobotContainer.java @@ -7,10 +7,14 @@ //199 files // import org.carlmontrobotics.subsystems.*; // import org.carlmontrobotics.commands.*; -import static org.carlmontrobotics.Constants.OI; + +import org.carlmontrobotics.Constants.*; +import org.carlmontrobotics.commands.Autonomous; //controllers import edu.wpi.first.wpilibj.GenericHID; +import edu.wpi.first.wpilibj.Joystick; +import edu.wpi.first.wpilibj.XboxController; import edu.wpi.first.wpilibj.XboxController.Axis; //commands @@ -24,69 +28,45 @@ import edu.wpi.first.wpilibj2.command.button.JoystickButton; import edu.wpi.first.wpilibj2.command.button.POVButton; import edu.wpi.first.wpilibj2.command.button.Trigger; +import org.carlmontrobotics.subsystems.Drivetrain; + public class RobotContainer { //1. using GenericHID allows us to use different kinds of controllers //2. Use absolute paths from constants to reduce confusion - public final GenericHID driverController = new GenericHID(OI.Driver.port); - public final GenericHID manipulatorController = new GenericHID(OI.Manipulator.port); + private final XboxController driverController = new XboxController(Constants.Driver.DRIVER_CONTROLLER_PORT); + private final XboxController manipulatorController = new XboxController(Constants.Manipulator.MANIPULATOR_CONTROLLER_PORT); + private final Drivetrain drivetrain = new Drivetrain(driverController); public RobotContainer() { - setDefaultCommands(); setBindingsDriver(); setBindingsManipulator(); } private void setDefaultCommands() { - // drivetrain.setDefaultCommand(new TeleopDrive( - // drivetrain, - // () -> ProcessedAxisValue(driverController, Axis.kLeftY)), - // () -> ProcessedAxisValue(driverController, Axis.kLeftX)), - // () -> ProcessedAxisValue(driverController, Axis.kRightX)), - // () -> driverController.getRawButton(OI.Driver.slowDriveButton) - // )); + } - private void setBindingsDriver() {} - private void setBindingsManipulator() {} + private void setBindingsDriver() { - public Command getAutonomousCommand() { - return Commands.print("No autonomous command configured"); + } + private void setBindingsManipulator() { + } - /** - * Flips an axis' Y coordinates upside down, but only if the select axis is a joystick axis - * - * @param hid The controller/plane joystick the axis is on - * @param axis The processed axis - * @return The processed value. - */ - private double getStickValue(GenericHID hid, Axis axis) { - return hid.getRawAxis(axis.value) * (axis == Axis.kLeftY || axis == Axis.kRightY ? -1 : 1); + + + public double rightJoystickValue() { + return driverController.getRightX(); } - /** - * Processes an input from the joystick into a value between -1 and 1, sinusoidally instead of linearly - * - * @param value The value to be processed. - * @return The processed value. - */ - private double inputProcessing(double value) { - double processedInput; - // processedInput = - // (((1-Math.cos(value*Math.PI))/2)*((1-Math.cos(value*Math.PI))/2))*(value/Math.abs(value)); - processedInput = Math.copySign(((1 - Math.cos(value * Math.PI)) / 2) * ((1 - Math.cos(value * Math.PI)) / 2), - value); - return processedInput; + public double leftJoystickValue() { + return driverController.getLeftY(); } - /** - * Combines both getStickValue and inputProcessing into a single function for processing joystick outputs - * - * @param hid The controller/plane joystick the axis is on - * @param axis The processed axis - * @return The processed value. - */ - private double ProcessedAxisValue(GenericHID hid, Axis axis){ - return inputProcessing(getStickValue(hid, axis)); + + + + public Command getAutonomousCommand() { + return new Autonomous(drivetrain); } } diff --git a/src/main/java/org/carlmontrobotics/commands/Autonomous.java b/src/main/java/org/carlmontrobotics/commands/Autonomous.java new file mode 100644 index 0000000..2ead7a1 --- /dev/null +++ b/src/main/java/org/carlmontrobotics/commands/Autonomous.java @@ -0,0 +1,36 @@ +// Copyright (c) FIRST and other WPILib contributors. +// Open Source Software; you can modify and/or share it under the terms of +// the WPILib BSD license file in the root directory of this project. + +package org.carlmontrobotics.commands; + +import edu.wpi.first.wpilibj2.command.Command; +import org.carlmontrobotics.subsystems.Drivetrain; + +public class Autonomous extends Command { + /** Creates a new Autonomous. */ + private final Drivetrain dt; + + public Autonomous(Drivetrain drivetrain) { + addRequirements(dt = drivetrain); + // Use addRequirements() here to declare subsystem dependencies. + } + + // Called when the command is initially scheduled. + @Override + public void initialize() {} + + // Called every time the scheduler runs while the command is scheduled. + @Override + public void execute() {} + + // Called once the command ends or is interrupted. + @Override + public void end(boolean interrupted) {} + + // Returns true when the command should end. + @Override + public boolean isFinished() { + return false; + } +} diff --git a/src/main/java/org/carlmontrobotics/commands/TeleopDrive.java b/src/main/java/org/carlmontrobotics/commands/TeleopDrive.java new file mode 100644 index 0000000..9ec295a --- /dev/null +++ b/src/main/java/org/carlmontrobotics/commands/TeleopDrive.java @@ -0,0 +1,35 @@ +// Copyright (c) FIRST and other WPILib contributors. +// Open Source Software; you can modify and/or share it under the terms of +// the WPILib BSD license file in the root directory of this project. + +package org.carlmontrobotics.commands; + +import edu.wpi.first.wpilibj2.command.Command; +import org.carlmontrobotics.subsystems.Drivetrain; + +public class TeleopDrive extends Command { + /** Creates a new TeleopDrive. */ + private final Drivetrain dt; + + public TeleopDrive(Drivetrain drivetrain) { + addRequirements(dt = drivetrain); + } + + // Called when the command is initially scheduled. + @Override + public void initialize() {} + + // Called every time the scheduler runs while the command is scheduled. + @Override + public void execute() {} + + // Called once the command ends or is interrupted. + @Override + public void end(boolean interrupted) {} + + // Returns true when the command should end. + @Override + public boolean isFinished() { + return false; + } +} diff --git a/src/main/java/org/carlmontrobotics/subsystems/Drivetrain.java b/src/main/java/org/carlmontrobotics/subsystems/Drivetrain.java new file mode 100644 index 0000000..d2253d2 --- /dev/null +++ b/src/main/java/org/carlmontrobotics/subsystems/Drivetrain.java @@ -0,0 +1,42 @@ +// Copyright (c) FIRST and other WPILib contributors. +// Open Source Software; you can modify and/or share it under the terms of +// the WPILib BSD license file in the root directory of this project. + +package org.carlmontrobotics.subsystems; + +import org.carlmontrobotics.lib199.MotorConfig; +import org.carlmontrobotics.lib199.MotorControllerFactory; + +import org.carlmontrobotics.Constants.*; + +import com.revrobotics.CANSparkMax; +import org.carlmontrobotics.subsystems.*; +import static org.carlmontrobotics.Constants.Drivetrain.*; +import static org.carlmontrobotics.RobotContainer.*; + +import edu.wpi.first.wpilibj.GenericHID; +import edu.wpi.first.wpilibj.Joystick; +import edu.wpi.first.wpilibj.XboxController; +import edu.wpi.first.wpilibj.motorcontrol.MotorController; +import edu.wpi.first.wpilibj2.command.SubsystemBase; +import org.carlmontrobotics.RobotContainer.*; + +public class Drivetrain extends SubsystemBase { + /** Creates a new Drivetrain. */ + //private final CANSparkMax left = MotorControllerFactory.createSparkMax(Constants.Driver.leftDriveSparkMax, TemperatureLimit.NEO); + //private final CANSparkMax right = MotorControllerFactory.createSparkMax(Constants.MotorPorts.rightDriveSparkMax, TemperatureLimit.NEO); + private final CANSparkMax right = MotorControllerFactory.createSparkMax(LEFT_PORT, MotorConfig.NEO); + private final CANSparkMax left = MotorControllerFactory.createSparkMax(RIGHT_PORT, MotorConfig.NEO);//TODO: fix import or gradle issue pls + private final XboxController controller; + + public Drivetrain(XboxController driverController) { + this.controller = driverController; + } + + public void drive(double rightJoystickValue, double leftJoystickValue) {} + + public void autoDrive() {} + + @Override + public void periodic() {} +} From 07b5ef2d28d1dc60b9124e28143efac8488adab8 Mon Sep 17 00:00:00 2001 From: Matthew Lum <144396869+Rand0mAsianKid@users.noreply.github.com> Date: Sun, 29 Sep 2024 02:21:11 +0000 Subject: [PATCH 2/2] coded rest of drivetrain(crap on it Alex pls) --- src/main/deploy/BuildInfo.properties | 14 +++---- .../java/org/carlmontrobotics/Constants.java | 18 ++++----- .../org/carlmontrobotics/RobotContainer.java | 6 +-- .../carlmontrobotics/commands/Autonomous.java | 14 +++++-- .../commands/TeleopDrive.java | 35 ------------------ .../subsystems/Drivetrain.java | 37 ++++++++++++++++--- 6 files changed, 61 insertions(+), 63 deletions(-) delete mode 100644 src/main/java/org/carlmontrobotics/commands/TeleopDrive.java diff --git a/src/main/deploy/BuildInfo.properties b/src/main/deploy/BuildInfo.properties index 708fa4f..ac700ab 100644 --- a/src/main/deploy/BuildInfo.properties +++ b/src/main/deploy/BuildInfo.properties @@ -1,12 +1,12 @@ #Created by build system. Do not modify -#"2024-09-27 22:30:23 PDT" +#"2024-09-28 18:42:00 PDT" version="unspecified" -revision=8 +revision=9 name="EmptyProject2024" -timestamp=1727501423380 +timestamp=1727574120858 group="" -sha="c3834ceb369a3d64b342b5461e6ef5f069fd76cf" -git_date="2024-03-27 19:48:52 PDT" -git_branch="M-A-Drivetrain-Skeleton" -build_date="2024-09-27 22:30:23 PDT" +sha="e0a5b83b19826fcc5a1cef794b05680ea0cf1d02" +git_date="2024-09-27 22:31:58 PDT" +git_branch="Matthew-Backup-M-A-Drivetrain" +build_date="2024-09-28 18:42:00 PDT" dirty=1 diff --git a/src/main/java/org/carlmontrobotics/Constants.java b/src/main/java/org/carlmontrobotics/Constants.java index 240020e..c87d0ce 100644 --- a/src/main/java/org/carlmontrobotics/Constants.java +++ b/src/main/java/org/carlmontrobotics/Constants.java @@ -2,18 +2,16 @@ public final class Constants { - public final class Drivetrain{ - public static final int RIGHT_PORT = 0; - public static final int LEFT_PORT = 1; + public final class Drivetrainc{ + public static final double halfDriveSpeedMultiplier = 0.5; + public static final double GOAL_FEET = 6.5; + public static final int WHEEL_RADIUS = 2; + public static final int RIGHTDT_PORT = 0; + public static final int LEFTDT_PORT = 1; } - - //controllers - public static final class Driver { - public static final int DRIVER_CONTROLLER_PORT = 2; - } - public static final class Manipulator { + public final class IO{ public static final int MANIPULATOR_CONTROLLER_PORT = 3; + public static final int DRIVER_CONTROLLER_PORT = 2; } - } diff --git a/src/main/java/org/carlmontrobotics/RobotContainer.java b/src/main/java/org/carlmontrobotics/RobotContainer.java index 34523ad..87c3861 100644 --- a/src/main/java/org/carlmontrobotics/RobotContainer.java +++ b/src/main/java/org/carlmontrobotics/RobotContainer.java @@ -35,8 +35,8 @@ public class RobotContainer { //1. using GenericHID allows us to use different kinds of controllers //2. Use absolute paths from constants to reduce confusion - private final XboxController driverController = new XboxController(Constants.Driver.DRIVER_CONTROLLER_PORT); - private final XboxController manipulatorController = new XboxController(Constants.Manipulator.MANIPULATOR_CONTROLLER_PORT); + private final XboxController driverController = new XboxController(Constants.IO.DRIVER_CONTROLLER_PORT); + private final XboxController manipulatorController = new XboxController(Constants.IO.MANIPULATOR_CONTROLLER_PORT); private final Drivetrain drivetrain = new Drivetrain(driverController); public RobotContainer() { @@ -58,7 +58,7 @@ private void setBindingsManipulator() { public double rightJoystickValue() { - return driverController.getRightX(); + return driverController.getRightY(); } public double leftJoystickValue() { return driverController.getLeftY(); diff --git a/src/main/java/org/carlmontrobotics/commands/Autonomous.java b/src/main/java/org/carlmontrobotics/commands/Autonomous.java index 2ead7a1..f1e5344 100644 --- a/src/main/java/org/carlmontrobotics/commands/Autonomous.java +++ b/src/main/java/org/carlmontrobotics/commands/Autonomous.java @@ -5,6 +5,8 @@ package org.carlmontrobotics.commands; import edu.wpi.first.wpilibj2.command.Command; + +import org.carlmontrobotics.Constants; import org.carlmontrobotics.subsystems.Drivetrain; public class Autonomous extends Command { @@ -18,7 +20,10 @@ public Autonomous(Drivetrain drivetrain) { // Called when the command is initially scheduled. @Override - public void initialize() {} + public void initialize() { + dt.setAuto(true); + dt.autoDrive(); + } // Called every time the scheduler runs while the command is scheduled. @Override @@ -26,11 +31,14 @@ public void execute() {} // Called once the command ends or is interrupted. @Override - public void end(boolean interrupted) {} + public void end(boolean interrupted) { + dt.setAuto(false); + } // Returns true when the command should end. @Override public boolean isFinished() { - return false; + return dt.rightPosition() * (Constants.Drivetrainc.WHEEL_RADIUS*2) >= (Constants.Drivetrainc.GOAL_FEET)/12; + //TODO: for MA, change wheel radius and goal pos if needed } } diff --git a/src/main/java/org/carlmontrobotics/commands/TeleopDrive.java b/src/main/java/org/carlmontrobotics/commands/TeleopDrive.java deleted file mode 100644 index 9ec295a..0000000 --- a/src/main/java/org/carlmontrobotics/commands/TeleopDrive.java +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright (c) FIRST and other WPILib contributors. -// Open Source Software; you can modify and/or share it under the terms of -// the WPILib BSD license file in the root directory of this project. - -package org.carlmontrobotics.commands; - -import edu.wpi.first.wpilibj2.command.Command; -import org.carlmontrobotics.subsystems.Drivetrain; - -public class TeleopDrive extends Command { - /** Creates a new TeleopDrive. */ - private final Drivetrain dt; - - public TeleopDrive(Drivetrain drivetrain) { - addRequirements(dt = drivetrain); - } - - // Called when the command is initially scheduled. - @Override - public void initialize() {} - - // Called every time the scheduler runs while the command is scheduled. - @Override - public void execute() {} - - // Called once the command ends or is interrupted. - @Override - public void end(boolean interrupted) {} - - // Returns true when the command should end. - @Override - public boolean isFinished() { - return false; - } -} diff --git a/src/main/java/org/carlmontrobotics/subsystems/Drivetrain.java b/src/main/java/org/carlmontrobotics/subsystems/Drivetrain.java index d2253d2..48817ff 100644 --- a/src/main/java/org/carlmontrobotics/subsystems/Drivetrain.java +++ b/src/main/java/org/carlmontrobotics/subsystems/Drivetrain.java @@ -10,10 +10,14 @@ import org.carlmontrobotics.Constants.*; import com.revrobotics.CANSparkMax; +import com.revrobotics.RelativeEncoder; + import org.carlmontrobotics.subsystems.*; -import static org.carlmontrobotics.Constants.Drivetrain.*; +import static org.carlmontrobotics.Constants.Drivetrainc.*; import static org.carlmontrobotics.RobotContainer.*; +import org.carlmontrobotics.Constants; + import edu.wpi.first.wpilibj.GenericHID; import edu.wpi.first.wpilibj.Joystick; import edu.wpi.first.wpilibj.XboxController; @@ -25,17 +29,40 @@ public class Drivetrain extends SubsystemBase { /** Creates a new Drivetrain. */ //private final CANSparkMax left = MotorControllerFactory.createSparkMax(Constants.Driver.leftDriveSparkMax, TemperatureLimit.NEO); //private final CANSparkMax right = MotorControllerFactory.createSparkMax(Constants.MotorPorts.rightDriveSparkMax, TemperatureLimit.NEO); - private final CANSparkMax right = MotorControllerFactory.createSparkMax(LEFT_PORT, MotorConfig.NEO); - private final CANSparkMax left = MotorControllerFactory.createSparkMax(RIGHT_PORT, MotorConfig.NEO);//TODO: fix import or gradle issue pls + private boolean isAuto = false; + + private final CANSparkMax right = MotorControllerFactory.createSparkMax(LEFTDT_PORT, MotorConfig.NEO); + private final CANSparkMax left = MotorControllerFactory.createSparkMax(RIGHTDT_PORT, MotorConfig.NEO); + private RelativeEncoder rightEncoder = right.getEncoder(); private final XboxController controller; public Drivetrain(XboxController driverController) { this.controller = driverController; } + public void drive(double rightJoystickValue, double leftJoystickValue) { + //TODO: If needed, set inversions for motors + left.set(leftJoystickValue); + right.set(rightJoystickValue); + } + public void slowmode() { + double rightSlow = controller.getRightY() * Constants.Drivetrainc.halfDriveSpeedMultiplier; + double leftSlow = controller.getLeftY() * Constants.Drivetrainc.halfDriveSpeedMultiplier; + left.set(leftSlow); + right.set(rightSlow); + } - public void drive(double rightJoystickValue, double leftJoystickValue) {} - public void autoDrive() {} + public double rightPosition() { + return rightEncoder.getPosition(); + } + public void setAuto(boolean isAutonomous) { + isAuto = isAutonomous; + } + public void autoDrive() { + left.set(0.3); + right.set(0.3); + } + @Override public void periodic() {}