From c4b3298af6bdac70340526ecfac41dbf454a0c25 Mon Sep 17 00:00:00 2001 From: BananasAmIRite Date: Mon, 31 Oct 2022 19:44:55 +0000 Subject: [PATCH 1/4] added a default autonomous command as placeholder --- .../main/java/frc/robot/RobotContainer.java | 5 ++- .../java/frc/robot/commands/AutoCommand.java | 43 +++++++++++++++++++ 2 files changed, 46 insertions(+), 2 deletions(-) create mode 100644 drivetrain-testing-Imported/src/main/java/frc/robot/commands/AutoCommand.java diff --git a/drivetrain-testing-Imported/src/main/java/frc/robot/RobotContainer.java b/drivetrain-testing-Imported/src/main/java/frc/robot/RobotContainer.java index 65664f9..3cf0725 100644 --- a/drivetrain-testing-Imported/src/main/java/frc/robot/RobotContainer.java +++ b/drivetrain-testing-Imported/src/main/java/frc/robot/RobotContainer.java @@ -8,8 +8,7 @@ import edu.wpi.first.wpilibj.XboxController; import edu.wpi.first.wpilibj2.command.Command; import edu.wpi.first.wpilibj2.command.RunCommand; -import frc.robot.commands.ExampleCommand; -import frc.robot.subsystems.ExampleSubsystem; +import frc.robot.commands.AutoCommand; import frc.robot.subsystems.drivetrain.DrivetrainSubsystem; @@ -26,6 +25,8 @@ public class RobotContainer { private final XboxController m_driverController = new XboxController(Constants.DRIVER_CONTROLLER); + private Command m_autoCommand = new AutoCommand(m_drivetrainSubsystem); + /** The container for the robot. Contains subsystems, OI devices, and commands. */ public RobotContainer() { // Configure the button bindings diff --git a/drivetrain-testing-Imported/src/main/java/frc/robot/commands/AutoCommand.java b/drivetrain-testing-Imported/src/main/java/frc/robot/commands/AutoCommand.java new file mode 100644 index 0000000..d55decd --- /dev/null +++ b/drivetrain-testing-Imported/src/main/java/frc/robot/commands/AutoCommand.java @@ -0,0 +1,43 @@ +// 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 frc.robot.commands; + +import frc.robot.subsystems.drivetrain.DrivetrainSubsystem; +import edu.wpi.first.wpilibj2.command.CommandBase; + +/** An example command that uses an example subsystem. */ +public class AutoCommand extends CommandBase { + @SuppressWarnings({"PMD.UnusedPrivateField", "PMD.SingularField"}) + private final DrivetrainSubsystem drivetrain; + + /** + * Creates a new AutoCommand. + * + * @param subsystem The subsystem used by this command. + */ + public AutoCommand(DrivetrainSubsystem drivetrain) { + this.drivetrain = drivetrain; + // Use addRequirements() here to declare subsystem dependencies. + addRequirements(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; + } +} From 40cf6c8d5c0f91b7fcb90a91a51623e2c714f697 Mon Sep 17 00:00:00 2001 From: BananasAmIRite Date: Mon, 31 Oct 2022 19:52:06 +0000 Subject: [PATCH 2/4] refactor: renamed DrivetrainSubsystem to Drivetrain --- .../src/main/java/frc/robot/RobotContainer.java | 12 ++++++------ .../main/java/frc/robot/commands/AutoCommand.java | 9 ++++----- .../{DrivetrainSubsystem.java => Drivetrain.java} | 4 ++-- 3 files changed, 12 insertions(+), 13 deletions(-) rename drivetrain-testing-Imported/src/main/java/frc/robot/subsystems/drivetrain/{DrivetrainSubsystem.java => Drivetrain.java} (95%) diff --git a/drivetrain-testing-Imported/src/main/java/frc/robot/RobotContainer.java b/drivetrain-testing-Imported/src/main/java/frc/robot/RobotContainer.java index 3cf0725..511545c 100644 --- a/drivetrain-testing-Imported/src/main/java/frc/robot/RobotContainer.java +++ b/drivetrain-testing-Imported/src/main/java/frc/robot/RobotContainer.java @@ -9,7 +9,7 @@ import edu.wpi.first.wpilibj2.command.Command; import edu.wpi.first.wpilibj2.command.RunCommand; import frc.robot.commands.AutoCommand; -import frc.robot.subsystems.drivetrain.DrivetrainSubsystem; +import frc.robot.subsystems.drivetrain.Drivetrain; /** @@ -21,20 +21,20 @@ public class RobotContainer { // The robot's subsystems and commands are defined here... - private final DrivetrainSubsystem m_drivetrainSubsystem = new DrivetrainSubsystem(); + private final Drivetrain m_drivetrain = new Drivetrain(); private final XboxController m_driverController = new XboxController(Constants.DRIVER_CONTROLLER); - private Command m_autoCommand = new AutoCommand(m_drivetrainSubsystem); + private Command m_autoCommand = new AutoCommand(m_drivetrain); /** The container for the robot. Contains subsystems, OI devices, and commands. */ public RobotContainer() { // Configure the button bindings configureButtonBindings(); - m_drivetrainSubsystem.setDefaultCommand(new RunCommand(() -> { - m_drivetrainSubsystem.drive(m_driverController.getRightY(), m_driverController.getRightX()); - }, m_drivetrainSubsystem)); + m_drivetrain.setDefaultCommand(new RunCommand(() -> { + m_drivetrain.drive(m_driverController.getRightY(), m_driverController.getRightX()); + }, m_drivetrain)); } /** diff --git a/drivetrain-testing-Imported/src/main/java/frc/robot/commands/AutoCommand.java b/drivetrain-testing-Imported/src/main/java/frc/robot/commands/AutoCommand.java index d55decd..15a001a 100644 --- a/drivetrain-testing-Imported/src/main/java/frc/robot/commands/AutoCommand.java +++ b/drivetrain-testing-Imported/src/main/java/frc/robot/commands/AutoCommand.java @@ -4,20 +4,19 @@ package frc.robot.commands; -import frc.robot.subsystems.drivetrain.DrivetrainSubsystem; +import frc.robot.subsystems.drivetrain.Drivetrain; import edu.wpi.first.wpilibj2.command.CommandBase; -/** An example command that uses an example subsystem. */ public class AutoCommand extends CommandBase { @SuppressWarnings({"PMD.UnusedPrivateField", "PMD.SingularField"}) - private final DrivetrainSubsystem drivetrain; + private final Drivetrain drivetrain; /** * Creates a new AutoCommand. * - * @param subsystem The subsystem used by this command. + * @param drivetrain The drivetrain used by this command. */ - public AutoCommand(DrivetrainSubsystem drivetrain) { + public AutoCommand(Drivetrain drivetrain) { this.drivetrain = drivetrain; // Use addRequirements() here to declare subsystem dependencies. addRequirements(drivetrain); diff --git a/drivetrain-testing-Imported/src/main/java/frc/robot/subsystems/drivetrain/DrivetrainSubsystem.java b/drivetrain-testing-Imported/src/main/java/frc/robot/subsystems/drivetrain/Drivetrain.java similarity index 95% rename from drivetrain-testing-Imported/src/main/java/frc/robot/subsystems/drivetrain/DrivetrainSubsystem.java rename to drivetrain-testing-Imported/src/main/java/frc/robot/subsystems/drivetrain/Drivetrain.java index 944e694..a73e3f8 100644 --- a/drivetrain-testing-Imported/src/main/java/frc/robot/subsystems/drivetrain/DrivetrainSubsystem.java +++ b/drivetrain-testing-Imported/src/main/java/frc/robot/subsystems/drivetrain/Drivetrain.java @@ -19,7 +19,7 @@ -public class DrivetrainSubsystem extends SubsystemBase { +public class Drivetrain extends SubsystemBase { private CANSparkMax frontLeft = new CANSparkMax(Constants.FRONT_LEFT_MOTOR, MotorType.kBrushless); private CANSparkMax frontRight = new CANSparkMax(Constants.FRONT_RIGHT_MOTOR, MotorType.kBrushless); @@ -33,7 +33,7 @@ public class DrivetrainSubsystem extends SubsystemBase { private final DifferentialDrive diffDrive = new DifferentialDrive(left, right); - public DrivetrainSubsystem() { + public Drivetrain() { left.setInverted(false); right.setInverted(true); From 720c6fa0eb8561b495615a64a53c0f25acd4a056 Mon Sep 17 00:00:00 2001 From: BananasAmIRite Date: Mon, 31 Oct 2022 20:02:41 +0000 Subject: [PATCH 3/4] cleaned up unused imports --- .../src/main/java/frc/robot/Constants.java | 5 ----- .../src/main/java/frc/robot/RobotContainer.java | 1 - .../frc/robot/subsystems/drivetrain/Drivetrain.java | 11 ----------- 3 files changed, 17 deletions(-) diff --git a/drivetrain-testing-Imported/src/main/java/frc/robot/Constants.java b/drivetrain-testing-Imported/src/main/java/frc/robot/Constants.java index be6cceb..46ca94d 100644 --- a/drivetrain-testing-Imported/src/main/java/frc/robot/Constants.java +++ b/drivetrain-testing-Imported/src/main/java/frc/robot/Constants.java @@ -4,8 +4,6 @@ package frc.robot; -import edu.wpi.first.wpilibj.SpeedController; - /** * The Constants class provides a convenient place for teams to hold robot-wide numerical or boolean * constants. This class should not be used for any other purpose. All constants should be declared @@ -15,9 +13,6 @@ * constants are needed, to reduce verbosity. */ public final class Constants { - - // public static SpeedController K_TRACK_WIDTH; - public static final int FRONT_LEFT_MOTOR = 0; public static final int MIDDLE_LEFT_MOTOR = 1; public static final int BACK_LEFT_MOTOR = 2; diff --git a/drivetrain-testing-Imported/src/main/java/frc/robot/RobotContainer.java b/drivetrain-testing-Imported/src/main/java/frc/robot/RobotContainer.java index 511545c..5d125fc 100644 --- a/drivetrain-testing-Imported/src/main/java/frc/robot/RobotContainer.java +++ b/drivetrain-testing-Imported/src/main/java/frc/robot/RobotContainer.java @@ -4,7 +4,6 @@ package frc.robot; -import edu.wpi.first.wpilibj.GenericHID; import edu.wpi.first.wpilibj.XboxController; import edu.wpi.first.wpilibj2.command.Command; import edu.wpi.first.wpilibj2.command.RunCommand; diff --git a/drivetrain-testing-Imported/src/main/java/frc/robot/subsystems/drivetrain/Drivetrain.java b/drivetrain-testing-Imported/src/main/java/frc/robot/subsystems/drivetrain/Drivetrain.java index a73e3f8..c7b21d5 100644 --- a/drivetrain-testing-Imported/src/main/java/frc/robot/subsystems/drivetrain/Drivetrain.java +++ b/drivetrain-testing-Imported/src/main/java/frc/robot/subsystems/drivetrain/Drivetrain.java @@ -1,24 +1,13 @@ package frc.robot.subsystems.drivetrain; import edu.wpi.first.wpilibj.drive.DifferentialDrive; -// import edu.wpi.first.wpilibj.motorcontrol.MotorControllerGroup; import edu.wpi.first.wpilibj.motorcontrol.MotorControllerGroup; import edu.wpi.first.wpilibj2.command.SubsystemBase; import frc.robot.Constants; -// doesnt work for some unknown reason -// import edu.wpi.first.wpilibj.motorcontrol.MotorControllerGroup; - import com.revrobotics.CANSparkMax; import com.revrobotics.CANSparkMax.IdleMode; import com.revrobotics.CANSparkMaxLowLevel.MotorType; -import edu.wpi.first.wpilibj.AnalogGyro; -import edu.wpi.first.wpilibj.Encoder; -import edu.wpi.first.wpilibj.SpeedController; -import edu.wpi.first.wpilibj.SpeedControllerGroup; - - - public class Drivetrain extends SubsystemBase { private CANSparkMax frontLeft = new CANSparkMax(Constants.FRONT_LEFT_MOTOR, MotorType.kBrushless); From 54141a9f75f366e3a21a59b0ca167c75d65f52ec Mon Sep 17 00:00:00 2001 From: BananasAmIRite Date: Mon, 31 Oct 2022 20:12:04 +0000 Subject: [PATCH 4/4] deleted initial code in favor for imported code --- drivetrain-testing-Imported/.gitignore | 162 --------- .../.vscode/launch.json | 21 -- .../.vscode/settings.json | 29 -- .../.wpilib/wpilib_preferences.json | 6 - drivetrain-testing-Imported/WPILib-License.md | 24 -- drivetrain-testing-Imported/build.gradle | 88 ----- .../gradle/wrapper/gradle-wrapper.jar | Bin 59536 -> 0 bytes .../gradle/wrapper/gradle-wrapper.properties | 5 - drivetrain-testing-Imported/gradlew | 234 ------------- drivetrain-testing-Imported/gradlew.bat | 89 ----- drivetrain-testing-Imported/settings.gradle | 27 -- .../src/main/deploy/example.txt | 3 - .../src/main/java/frc/robot/Constants.java | 29 -- .../src/main/java/frc/robot/Main.java | 25 -- .../src/main/java/frc/robot/Robot.java | 95 ------ .../main/java/frc/robot/RobotContainer.java | 56 --- .../frc/robot/commands/ExampleCommand.java | 43 --- .../robot/subsystems/ExampleSubsystem.java | 22 -- .../vendordeps/REVLib.json | 73 ---- .../vendordeps/WPILibNewCommands.json | 37 -- drivetrain-testing/.gitignore | 323 +++++++++--------- .../.idea/.gitignore | 0 .../.idea/compiler.xml | 0 .../.idea/gradle.xml | 0 .../.idea/jarRepositories.xml | 0 .../.idea/libraries/konstant.xml | 0 .../.idea/misc.xml | 0 .../.idea/vcs.xml | 0 drivetrain-testing/.vscode/launch.json | 42 +-- drivetrain-testing/.vscode/settings.json | 46 ++- .../.wpilib/wpilib_preferences.json | 2 +- drivetrain-testing/WPILib-License.md | 48 +-- drivetrain-testing/build.gradle | 167 ++++----- .../gradle/wrapper/gradle-wrapper.jar | Bin 58702 -> 59536 bytes .../gradle/wrapper/gradle-wrapper.properties | 11 +- drivetrain-testing/gradlew | 257 ++++++++------ drivetrain-testing/gradlew.bat | 189 +++++----- drivetrain-testing/settings.gradle | 54 +-- .../simgui-ds.json | 0 .../simgui.json | 0 .../src/main/java/frc/robot/Constants.java | 18 +- .../main/java/frc/robot/RobotContainer.java | 18 +- .../java/frc/robot/commands/AutoCommand.java | 0 .../subsystems/drivetrain/Drivetrain.java | 0 .../drivetrain/DrivetrainSubsystem.java | 57 ---- .../vendordeps/WPILibNewCommands.json | 74 ++-- 46 files changed, 659 insertions(+), 1715 deletions(-) delete mode 100644 drivetrain-testing-Imported/.gitignore delete mode 100644 drivetrain-testing-Imported/.vscode/launch.json delete mode 100644 drivetrain-testing-Imported/.vscode/settings.json delete mode 100644 drivetrain-testing-Imported/.wpilib/wpilib_preferences.json delete mode 100644 drivetrain-testing-Imported/WPILib-License.md delete mode 100644 drivetrain-testing-Imported/build.gradle delete mode 100644 drivetrain-testing-Imported/gradle/wrapper/gradle-wrapper.jar delete mode 100644 drivetrain-testing-Imported/gradle/wrapper/gradle-wrapper.properties delete mode 100644 drivetrain-testing-Imported/gradlew delete mode 100644 drivetrain-testing-Imported/gradlew.bat delete mode 100644 drivetrain-testing-Imported/settings.gradle delete mode 100644 drivetrain-testing-Imported/src/main/deploy/example.txt delete mode 100644 drivetrain-testing-Imported/src/main/java/frc/robot/Constants.java delete mode 100644 drivetrain-testing-Imported/src/main/java/frc/robot/Main.java delete mode 100644 drivetrain-testing-Imported/src/main/java/frc/robot/Robot.java delete mode 100644 drivetrain-testing-Imported/src/main/java/frc/robot/RobotContainer.java delete mode 100644 drivetrain-testing-Imported/src/main/java/frc/robot/commands/ExampleCommand.java delete mode 100644 drivetrain-testing-Imported/src/main/java/frc/robot/subsystems/ExampleSubsystem.java delete mode 100644 drivetrain-testing-Imported/vendordeps/REVLib.json delete mode 100644 drivetrain-testing-Imported/vendordeps/WPILibNewCommands.json rename {drivetrain-testing-Imported => drivetrain-testing}/.idea/.gitignore (100%) rename {drivetrain-testing-Imported => drivetrain-testing}/.idea/compiler.xml (100%) rename {drivetrain-testing-Imported => drivetrain-testing}/.idea/gradle.xml (100%) rename {drivetrain-testing-Imported => drivetrain-testing}/.idea/jarRepositories.xml (100%) rename {drivetrain-testing-Imported => drivetrain-testing}/.idea/libraries/konstant.xml (100%) rename {drivetrain-testing-Imported => drivetrain-testing}/.idea/misc.xml (100%) rename {drivetrain-testing-Imported => drivetrain-testing}/.idea/vcs.xml (100%) mode change 100755 => 100644 drivetrain-testing/gradlew rename {drivetrain-testing-Imported => drivetrain-testing}/simgui-ds.json (100%) rename {drivetrain-testing-Imported => drivetrain-testing}/simgui.json (100%) rename {drivetrain-testing-Imported => drivetrain-testing}/src/main/java/frc/robot/commands/AutoCommand.java (100%) rename {drivetrain-testing-Imported => drivetrain-testing}/src/main/java/frc/robot/subsystems/drivetrain/Drivetrain.java (100%) delete mode 100644 drivetrain-testing/src/main/java/frc/robot/subsystems/drivetrain/DrivetrainSubsystem.java diff --git a/drivetrain-testing-Imported/.gitignore b/drivetrain-testing-Imported/.gitignore deleted file mode 100644 index 9535c83..0000000 --- a/drivetrain-testing-Imported/.gitignore +++ /dev/null @@ -1,162 +0,0 @@ -# This gitignore has been specially created by the WPILib team. -# If you remove items from this file, intellisense might break. - -### C++ ### -# Prerequisites -*.d - -# Compiled Object files -*.slo -*.lo -*.o -*.obj - -# Precompiled Headers -*.gch -*.pch - -# Compiled Dynamic libraries -*.so -*.dylib -*.dll - -# Fortran module files -*.mod -*.smod - -# Compiled Static libraries -*.lai -*.la -*.a -*.lib - -# Executables -*.exe -*.out -*.app - -### Java ### -# Compiled class file -*.class - -# Log file -*.log - -# BlueJ files -*.ctxt - -# Mobile Tools for Java (J2ME) -.mtj.tmp/ - -# Package Files # -*.jar -*.war -*.nar -*.ear -*.zip -*.tar.gz -*.rar - -# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml -hs_err_pid* - -### Linux ### -*~ - -# temporary files which can be created if a process still has a handle open of a deleted file -.fuse_hidden* - -# KDE directory preferences -.directory - -# Linux trash folder which might appear on any partition or disk -.Trash-* - -# .nfs files are created when an open file is removed but is still being accessed -.nfs* - -### macOS ### -# General -.DS_Store -.AppleDouble -.LSOverride - -# Icon must end with two \r -Icon - -# Thumbnails -._* - -# Files that might appear in the root of a volume -.DocumentRevisions-V100 -.fseventsd -.Spotlight-V100 -.TemporaryItems -.Trashes -.VolumeIcon.icns -.com.apple.timemachine.donotpresent - -# Directories potentially created on remote AFP share -.AppleDB -.AppleDesktop -Network Trash Folder -Temporary Items -.apdisk - -### VisualStudioCode ### -.vscode/* -!.vscode/settings.json -!.vscode/tasks.json -!.vscode/launch.json -!.vscode/extensions.json - -### Windows ### -# Windows thumbnail cache files -Thumbs.db -ehthumbs.db -ehthumbs_vista.db - -# Dump file -*.stackdump - -# Folder config file -[Dd]esktop.ini - -# Recycle Bin used on file shares -$RECYCLE.BIN/ - -# Windows Installer files -*.cab -*.msi -*.msix -*.msm -*.msp - -# Windows shortcuts -*.lnk - -### Gradle ### -.gradle -/build/ - -# Ignore Gradle GUI config -gradle-app.setting - -# Avoid ignoring Gradle wrapper jar file (.jar files are usually ignored) -!gradle-wrapper.jar - -# Cache of project -.gradletasknamecache - -# # Work around https://youtrack.jetbrains.com/issue/IDEA-116898 -# gradle/wrapper/gradle-wrapper.properties - -# # VS Code Specific Java Settings -# DO NOT REMOVE .classpath and .project -.classpath -.project -.settings/ -bin/ - -# Simulation GUI and other tools window save file -*-window.json diff --git a/drivetrain-testing-Imported/.vscode/launch.json b/drivetrain-testing-Imported/.vscode/launch.json deleted file mode 100644 index c9c9713..0000000 --- a/drivetrain-testing-Imported/.vscode/launch.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - // Use IntelliSense to learn about possible attributes. - // Hover to view descriptions of existing attributes. - // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 - "version": "0.2.0", - "configurations": [ - - { - "type": "wpilib", - "name": "WPILib Desktop Debug", - "request": "launch", - "desktop": true, - }, - { - "type": "wpilib", - "name": "WPILib roboRIO Debug", - "request": "launch", - "desktop": false, - } - ] -} diff --git a/drivetrain-testing-Imported/.vscode/settings.json b/drivetrain-testing-Imported/.vscode/settings.json deleted file mode 100644 index 4ed293b..0000000 --- a/drivetrain-testing-Imported/.vscode/settings.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "java.configuration.updateBuildConfiguration": "automatic", - "java.server.launchMode": "Standard", - "files.exclude": { - "**/.git": true, - "**/.svn": true, - "**/.hg": true, - "**/CVS": true, - "**/.DS_Store": true, - "bin/": true, - "**/.classpath": true, - "**/.project": true, - "**/.settings": true, - "**/.factorypath": true, - "**/*~": true - }, - "java.test.config": [ - { - "name": "WPIlibUnitTests", - "workingDirectory": "${workspaceFolder}/build/jni/release", - "vmargs": [ "-Djava.library.path=${workspaceFolder}/build/jni/release" ], - "env": { - "LD_LIBRARY_PATH": "${workspaceFolder}/build/jni/release" , - "DYLD_LIBRARY_PATH": "${workspaceFolder}/build/jni/release" - } - }, - ], - "java.test.defaultConfig": "WPIlibUnitTests" -} diff --git a/drivetrain-testing-Imported/.wpilib/wpilib_preferences.json b/drivetrain-testing-Imported/.wpilib/wpilib_preferences.json deleted file mode 100644 index 707f879..0000000 --- a/drivetrain-testing-Imported/.wpilib/wpilib_preferences.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "enableCppIntellisense": false, - "currentLanguage": "java", - "projectYear": "2022", - "teamNumber": 321 -} \ No newline at end of file diff --git a/drivetrain-testing-Imported/WPILib-License.md b/drivetrain-testing-Imported/WPILib-License.md deleted file mode 100644 index 3d5a824..0000000 --- a/drivetrain-testing-Imported/WPILib-License.md +++ /dev/null @@ -1,24 +0,0 @@ -Copyright (c) 2009-2021 FIRST and other WPILib contributors -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of FIRST, WPILib, nor the names of other WPILib - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY FIRST AND OTHER WPILIB CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY NONINFRINGEMENT AND FITNESS FOR A PARTICULAR -PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL FIRST OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/drivetrain-testing-Imported/build.gradle b/drivetrain-testing-Imported/build.gradle deleted file mode 100644 index c361b42..0000000 --- a/drivetrain-testing-Imported/build.gradle +++ /dev/null @@ -1,88 +0,0 @@ -plugins { - id "java" - id "edu.wpi.first.GradleRIO" version "2022.2.1" -} - -sourceCompatibility = JavaVersion.VERSION_11 -targetCompatibility = JavaVersion.VERSION_11 - -def ROBOT_MAIN_CLASS = "frc.robot.Main" - -// Define my targets (RoboRIO) and artifacts (deployable files) -// This is added by GradleRIO's backing project DeployUtils. -deploy { - targets { - roborio(getTargetTypeClass('RoboRIO')) { - // Team number is loaded either from the .wpilib/wpilib_preferences.json - // or from command line. If not found an exception will be thrown. - // You can use getTeamOrDefault(team) instead of getTeamNumber if you - // want to store a team number in this file. - team = project.frc.getTeamNumber() - debug = project.frc.getDebugOrDefault(false) - - artifacts { - // First part is artifact name, 2nd is artifact type - // getTargetTypeClass is a shortcut to get the class type using a string - - frcJava(getArtifactTypeClass('FRCJavaArtifact')) { - } - - // Static files artifact - frcStaticFileDeploy(getArtifactTypeClass('FileTreeArtifact')) { - files = project.fileTree('src/main/deploy') - directory = '/home/lvuser/deploy' - } - } - } - } -} - -def deployArtifact = deploy.targets.roborio.artifacts.frcJava - -// Set to true to use debug for JNI. -wpi.java.debugJni = false - -// Set this to true to enable desktop support. -def includeDesktopSupport = false - -// Defining my dependencies. In this case, WPILib (+ friends), and vendor libraries. -// Also defines JUnit 4. -dependencies { - implementation wpi.java.deps.wpilib() - implementation wpi.java.vendor.java() - - - roborioDebug wpi.java.deps.wpilibJniDebug(wpi.platforms.roborio) - roborioDebug wpi.java.vendor.jniDebug(wpi.platforms.roborio) - - roborioRelease wpi.java.deps.wpilibJniRelease(wpi.platforms.roborio) - roborioRelease wpi.java.vendor.jniRelease(wpi.platforms.roborio) - - nativeDebug wpi.java.deps.wpilibJniDebug(wpi.platforms.desktop) - nativeDebug wpi.java.vendor.jniDebug(wpi.platforms.desktop) - simulationDebug wpi.sim.enableDebug() - - nativeRelease wpi.java.deps.wpilibJniRelease(wpi.platforms.desktop) - nativeRelease wpi.java.vendor.jniRelease(wpi.platforms.desktop) - simulationRelease wpi.sim.enableRelease() - - testImplementation 'junit:junit:4.12' -} - -// Simulation configuration (e.g. environment variables). -wpi.sim.addGui().defaultEnabled = true -wpi.sim.addDriverstation() - -// Setting up my Jar File. In this case, adding all libraries into the main jar ('fat jar') -// in order to make them all available at runtime. Also adding the manifest so WPILib -// knows where to look for our Robot Class. -jar { - from { configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) } } - manifest edu.wpi.first.gradlerio.GradleRIOPlugin.javaManifest(ROBOT_MAIN_CLASS) - duplicatesStrategy = DuplicatesStrategy.INCLUDE -} - -// Configure jar and deploy tasks -deployArtifact.jarTask = jar -wpi.java.configureExecutableTasks(jar) -wpi.java.configureTestTasks(test) diff --git a/drivetrain-testing-Imported/gradle/wrapper/gradle-wrapper.jar b/drivetrain-testing-Imported/gradle/wrapper/gradle-wrapper.jar deleted file mode 100644 index 7454180f2ae8848c63b8b4dea2cb829da983f2fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 59536 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 QuEJmfE|#`Dqx|px0L@K;Y5)KL diff --git a/drivetrain-testing-Imported/gradle/wrapper/gradle-wrapper.properties b/drivetrain-testing-Imported/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index f959987..0000000 --- a/drivetrain-testing-Imported/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,5 +0,0 @@ -distributionBase=GRADLE_USER_HOME -distributionPath=permwrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.3-bin.zip -zipStoreBase=GRADLE_USER_HOME -zipStorePath=permwrapper/dists diff --git a/drivetrain-testing-Imported/gradlew b/drivetrain-testing-Imported/gradlew deleted file mode 100644 index c53aefa..0000000 --- a/drivetrain-testing-Imported/gradlew +++ /dev/null @@ -1,234 +0,0 @@ -#!/bin/sh - -# -# Copyright © 2015-2021 the original authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -############################################################################## -# -# Gradle start up script for POSIX generated by Gradle. -# -# Important for running: -# -# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is -# noncompliant, but you have some other compliant shell such as ksh or -# bash, then to run this script, type that shell name before the whole -# command line, like: -# -# ksh Gradle -# -# Busybox and similar reduced shells will NOT work, because this script -# requires all of these POSIX shell features: -# * functions; -# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», -# «${var#prefix}», «${var%suffix}», and «$( cmd )»; -# * compound commands having a testable exit status, especially «case»; -# * various built-in commands including «command», «set», and «ulimit». -# -# Important for patching: -# -# (2) This script targets any POSIX shell, so it avoids extensions provided -# by Bash, Ksh, etc; in particular arrays are avoided. -# -# The "traditional" practice of packing multiple parameters into a -# space-separated string is a well documented source of bugs and security -# problems, so this is (mostly) avoided, by progressively accumulating -# options in "$@", and eventually passing that to Java. -# -# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, -# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; -# see the in-line comments for details. -# -# There are tweaks for specific operating systems such as AIX, CygWin, -# Darwin, MinGW, and NonStop. -# -# (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt -# within the Gradle project. -# -# You can find Gradle at https://github.com/gradle/gradle/. -# -############################################################################## - -# Attempt to set APP_HOME - -# Resolve links: $0 may be a link -app_path=$0 - -# Need this for daisy-chained symlinks. -while - APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path - [ -h "$app_path" ] -do - ls=$( ls -ld "$app_path" ) - link=${ls#*' -> '} - case $link in #( - /*) app_path=$link ;; #( - *) app_path=$APP_HOME$link ;; - esac -done - -APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit - -APP_NAME="Gradle" -APP_BASE_NAME=${0##*/} - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' - -# Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD=maximum - -warn () { - echo "$*" -} >&2 - -die () { - echo - echo "$*" - echo - exit 1 -} >&2 - -# OS specific support (must be 'true' or 'false'). -cygwin=false -msys=false -darwin=false -nonstop=false -case "$( uname )" in #( - CYGWIN* ) cygwin=true ;; #( - Darwin* ) darwin=true ;; #( - MSYS* | MINGW* ) msys=true ;; #( - NONSTOP* ) nonstop=true ;; -esac - -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar - - -# Determine the Java command to use to start the JVM. -if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD=$JAVA_HOME/jre/sh/java - else - JAVACMD=$JAVA_HOME/bin/java - fi - if [ ! -x "$JAVACMD" ] ; then - die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." - fi -else - JAVACMD=java - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." -fi - -# Increase the maximum file descriptors if we can. -if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then - case $MAX_FD in #( - max*) - MAX_FD=$( ulimit -H -n ) || - warn "Could not query maximum file descriptor limit" - esac - case $MAX_FD in #( - '' | soft) :;; #( - *) - ulimit -n "$MAX_FD" || - warn "Could not set maximum file descriptor limit to $MAX_FD" - esac -fi - -# Collect all arguments for the java command, stacking in reverse order: -# * args from the command line -# * the main class name -# * -classpath -# * -D...appname settings -# * --module-path (only if needed) -# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. - -# For Cygwin or MSYS, switch paths to Windows format before running java -if "$cygwin" || "$msys" ; then - APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) - CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) - - JAVACMD=$( cygpath --unix "$JAVACMD" ) - - # Now convert the arguments - kludge to limit ourselves to /bin/sh - for arg do - if - case $arg in #( - -*) false ;; # don't mess with options #( - /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath - [ -e "$t" ] ;; #( - *) false ;; - esac - then - arg=$( cygpath --path --ignore --mixed "$arg" ) - fi - # Roll the args list around exactly as many times as the number of - # args, so each arg winds up back in the position where it started, but - # possibly modified. - # - # NB: a `for` loop captures its iteration list before it begins, so - # changing the positional parameters here affects neither the number of - # iterations, nor the values presented in `arg`. - shift # remove old arg - set -- "$@" "$arg" # push replacement arg - done -fi - -# Collect all arguments for the java command; -# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of -# shell script including quotes and variable substitutions, so put them in -# double quotes to make sure that they get re-expanded; and -# * put everything else in single quotes, so that it's not re-expanded. - -set -- \ - "-Dorg.gradle.appname=$APP_BASE_NAME" \ - -classpath "$CLASSPATH" \ - org.gradle.wrapper.GradleWrapperMain \ - "$@" - -# Use "xargs" to parse quoted args. -# -# With -n1 it outputs one arg per line, with the quotes and backslashes removed. -# -# In Bash we could simply go: -# -# readarray ARGS < <( xargs -n1 <<<"$var" ) && -# set -- "${ARGS[@]}" "$@" -# -# but POSIX shell has neither arrays nor command substitution, so instead we -# post-process each arg (as a line of input to sed) to backslash-escape any -# character that might be a shell metacharacter, then use eval to reverse -# that process (while maintaining the separation between arguments), and wrap -# the whole thing up as a single "set" statement. -# -# This will of course break if any of these variables contains a newline or -# an unmatched quote. -# - -eval "set -- $( - printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | - xargs -n1 | - sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | - tr '\n' ' ' - )" '"$@"' - -exec "$JAVACMD" "$@" diff --git a/drivetrain-testing-Imported/gradlew.bat b/drivetrain-testing-Imported/gradlew.bat deleted file mode 100644 index 107acd3..0000000 --- a/drivetrain-testing-Imported/gradlew.bat +++ /dev/null @@ -1,89 +0,0 @@ -@rem -@rem Copyright 2015 the original author or authors. -@rem -@rem Licensed under the Apache License, Version 2.0 (the "License"); -@rem you may not use this file except in compliance with the License. -@rem You may obtain a copy of the License at -@rem -@rem https://www.apache.org/licenses/LICENSE-2.0 -@rem -@rem Unless required by applicable law or agreed to in writing, software -@rem distributed under the License is distributed on an "AS IS" BASIS, -@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@rem See the License for the specific language governing permissions and -@rem limitations under the License. -@rem - -@if "%DEBUG%" == "" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Resolve any "." and ".." in APP_HOME to make it shorter. -for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto execute - -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto execute - -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* - -:end -@rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega diff --git a/drivetrain-testing-Imported/settings.gradle b/drivetrain-testing-Imported/settings.gradle deleted file mode 100644 index c363694..0000000 --- a/drivetrain-testing-Imported/settings.gradle +++ /dev/null @@ -1,27 +0,0 @@ -import org.gradle.internal.os.OperatingSystem - -pluginManagement { - repositories { - mavenLocal() - gradlePluginPortal() - String frcYear = '2022' - File frcHome - if (OperatingSystem.current().isWindows()) { - String publicFolder = System.getenv('PUBLIC') - if (publicFolder == null) { - publicFolder = "C:\\Users\\Public" - } - def homeRoot = new File(publicFolder, "wpilib") - frcHome = new File(homeRoot, frcYear) - } else { - def userFolder = System.getProperty("user.home") - def homeRoot = new File(userFolder, "wpilib") - frcHome = new File(homeRoot, frcYear) - } - def frcHomeMaven = new File(frcHome, 'maven') - maven { - name 'frcHome' - url frcHomeMaven - } - } -} diff --git a/drivetrain-testing-Imported/src/main/deploy/example.txt b/drivetrain-testing-Imported/src/main/deploy/example.txt deleted file mode 100644 index bb82515..0000000 --- a/drivetrain-testing-Imported/src/main/deploy/example.txt +++ /dev/null @@ -1,3 +0,0 @@ -Files placed in this directory will be deployed to the RoboRIO into the -'deploy' directory in the home folder. Use the 'Filesystem.getDeployDirectory' wpilib function -to get a proper path relative to the deploy directory. \ No newline at end of file diff --git a/drivetrain-testing-Imported/src/main/java/frc/robot/Constants.java b/drivetrain-testing-Imported/src/main/java/frc/robot/Constants.java deleted file mode 100644 index 46ca94d..0000000 --- a/drivetrain-testing-Imported/src/main/java/frc/robot/Constants.java +++ /dev/null @@ -1,29 +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 frc.robot; - -/** - * The Constants class provides a convenient place for teams to hold robot-wide numerical or boolean - * constants. This class should not be used for any other purpose. All constants should be declared - * globally (i.e. public static). Do not put anything functional in this class. - * - *

It is advised to statically import this class (or one of its inner classes) wherever the - * constants are needed, to reduce verbosity. - */ -public final class Constants { - public static final int FRONT_LEFT_MOTOR = 0; - public static final int MIDDLE_LEFT_MOTOR = 1; - public static final int BACK_LEFT_MOTOR = 2; - public static final int FRONT_RIGHT_MOTOR = 3; - public static final int MIDDLE_RIGHT_MOTOR = 4; - public static final int BACK_RIGHT_MOTOR = 5; - - public static final int DRIVER_CONTROLLER = 0; - - public static final double TURN_RATE = 0.5; -} - - - diff --git a/drivetrain-testing-Imported/src/main/java/frc/robot/Main.java b/drivetrain-testing-Imported/src/main/java/frc/robot/Main.java deleted file mode 100644 index 8776e5d..0000000 --- a/drivetrain-testing-Imported/src/main/java/frc/robot/Main.java +++ /dev/null @@ -1,25 +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 frc.robot; - -import edu.wpi.first.wpilibj.RobotBase; - -/** - * Do NOT add any static variables to this class, or any initialization at all. Unless you know what - * you are doing, do not modify this file except to change the parameter class to the startRobot - * call. - */ -public final class Main { - private Main() {} - - /** - * Main initialization function. Do not perform any initialization here. - * - *

If you change your main robot class, change the parameter type. - */ - public static void main(String... args) { - RobotBase.startRobot(Robot::new); - } -} diff --git a/drivetrain-testing-Imported/src/main/java/frc/robot/Robot.java b/drivetrain-testing-Imported/src/main/java/frc/robot/Robot.java deleted file mode 100644 index b31bfdc..0000000 --- a/drivetrain-testing-Imported/src/main/java/frc/robot/Robot.java +++ /dev/null @@ -1,95 +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 frc.robot; - -import edu.wpi.first.wpilibj.TimedRobot; -import edu.wpi.first.wpilibj2.command.Command; -import edu.wpi.first.wpilibj2.command.CommandScheduler; - -/** - * The VM is configured to automatically run this class, and to call the functions corresponding to - * each mode, as described in the TimedRobot documentation. If you change the name of this class or - * the package after creating this project, you must also update the build.gradle file in the - * project. - */ -public class Robot extends TimedRobot { - private Command m_autonomousCommand; - - private RobotContainer m_robotContainer; - - /** - * This function is run when the robot is first started up and should be used for any - * initialization code. - */ - @Override - public void robotInit() { - // Instantiate our RobotContainer. This will perform all our button bindings, and put our - // autonomous chooser on the dashboard. - m_robotContainer = new RobotContainer(); - } - - /** - * This function is called every robot packet, no matter the mode. Use this for items like - * diagnostics that you want ran during disabled, autonomous, teleoperated and test. - * - *

This runs after the mode specific periodic functions, but before LiveWindow and - * SmartDashboard integrated updating. - */ - @Override - public void robotPeriodic() { - // Runs the Scheduler. This is responsible for polling buttons, adding newly-scheduled - // commands, running already-scheduled commands, removing finished or interrupted commands, - // and running subsystem periodic() methods. This must be called from the robot's periodic - // block in order for anything in the Command-based framework to work. - CommandScheduler.getInstance().run(); - } - - /** This function is called once each time the robot enters Disabled mode. */ - @Override - public void disabledInit() {} - - @Override - public void disabledPeriodic() {} - - /** This autonomous runs the autonomous command selected by your {@link RobotContainer} class. */ - @Override - public void autonomousInit() { - m_autonomousCommand = m_robotContainer.getAutonomousCommand(); - - // schedule the autonomous command (example) - if (m_autonomousCommand != null) { - m_autonomousCommand.schedule(); - } - } - - /** This function is called periodically during autonomous. */ - @Override - public void autonomousPeriodic() {} - - @Override - public void teleopInit() { - // This makes sure that the autonomous stops running when - // teleop starts running. If you want the autonomous to - // continue until interrupted by another command, remove - // this line or comment it out. - if (m_autonomousCommand != null) { - m_autonomousCommand.cancel(); - } - } - - /** This function is called periodically during operator control. */ - @Override - public void teleopPeriodic() {} - - @Override - public void testInit() { - // Cancels all running commands at the start of test mode. - CommandScheduler.getInstance().cancelAll(); - } - - /** This function is called periodically during test mode. */ - @Override - public void testPeriodic() {} -} diff --git a/drivetrain-testing-Imported/src/main/java/frc/robot/RobotContainer.java b/drivetrain-testing-Imported/src/main/java/frc/robot/RobotContainer.java deleted file mode 100644 index 5d125fc..0000000 --- a/drivetrain-testing-Imported/src/main/java/frc/robot/RobotContainer.java +++ /dev/null @@ -1,56 +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 frc.robot; - -import edu.wpi.first.wpilibj.XboxController; -import edu.wpi.first.wpilibj2.command.Command; -import edu.wpi.first.wpilibj2.command.RunCommand; -import frc.robot.commands.AutoCommand; -import frc.robot.subsystems.drivetrain.Drivetrain; - - -/** - * This class is where the bulk of the robot should be declared. Since Command-based is a - * "declarative" paradigm, very little robot logic should actually be handled in the {@link Robot} - * periodic methods (other than the scheduler calls). Instead, the structure of the robot (including - * subsystems, commands, and button mappings) should be declared here. - */ -public class RobotContainer { - // The robot's subsystems and commands are defined here... - - private final Drivetrain m_drivetrain = new Drivetrain(); - - private final XboxController m_driverController = new XboxController(Constants.DRIVER_CONTROLLER); - - private Command m_autoCommand = new AutoCommand(m_drivetrain); - - /** The container for the robot. Contains subsystems, OI devices, and commands. */ - public RobotContainer() { - // Configure the button bindings - configureButtonBindings(); - - m_drivetrain.setDefaultCommand(new RunCommand(() -> { - m_drivetrain.drive(m_driverController.getRightY(), m_driverController.getRightX()); - }, m_drivetrain)); - } - - /** - * Use this method to define your button->command mappings. Buttons can be created by - * instantiating a {@link GenericHID} or one of its subclasses ({@link - * edu.wpi.first.wpilibj.Joystick} or {@link XboxController}), and then passing it to a {@link - * edu.wpi.first.wpilibj2.command.button.JoystickButton}. - */ - private void configureButtonBindings() {} - - /** - * Use this to pass the autonomous command to the main {@link Robot} class. - * - * @return the command to run in autonomous - */ - public Command getAutonomousCommand() { - // An ExampleCommand will run in autonomous - return m_autoCommand; - } -} diff --git a/drivetrain-testing-Imported/src/main/java/frc/robot/commands/ExampleCommand.java b/drivetrain-testing-Imported/src/main/java/frc/robot/commands/ExampleCommand.java deleted file mode 100644 index abd6a0e..0000000 --- a/drivetrain-testing-Imported/src/main/java/frc/robot/commands/ExampleCommand.java +++ /dev/null @@ -1,43 +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 frc.robot.commands; - -import frc.robot.subsystems.ExampleSubsystem; -import edu.wpi.first.wpilibj2.command.CommandBase; - -/** An example command that uses an example subsystem. */ -public class ExampleCommand extends CommandBase { - @SuppressWarnings({"PMD.UnusedPrivateField", "PMD.SingularField"}) - private final ExampleSubsystem m_subsystem; - - /** - * Creates a new ExampleCommand. - * - * @param subsystem The subsystem used by this command. - */ - public ExampleCommand(ExampleSubsystem subsystem) { - m_subsystem = subsystem; - // Use addRequirements() here to declare subsystem dependencies. - addRequirements(subsystem); - } - - // 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/drivetrain-testing-Imported/src/main/java/frc/robot/subsystems/ExampleSubsystem.java b/drivetrain-testing-Imported/src/main/java/frc/robot/subsystems/ExampleSubsystem.java deleted file mode 100644 index f5e9470..0000000 --- a/drivetrain-testing-Imported/src/main/java/frc/robot/subsystems/ExampleSubsystem.java +++ /dev/null @@ -1,22 +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 frc.robot.subsystems; - -import edu.wpi.first.wpilibj2.command.SubsystemBase; - -public class ExampleSubsystem extends SubsystemBase { - /** Creates a new ExampleSubsystem. */ - public ExampleSubsystem() {} - - @Override - public void periodic() { - // This method will be called once per scheduler run - } - - @Override - public void simulationPeriodic() { - // This method will be called once per scheduler run during simulation - } -} diff --git a/drivetrain-testing-Imported/vendordeps/REVLib.json b/drivetrain-testing-Imported/vendordeps/REVLib.json deleted file mode 100644 index 997e2a4..0000000 --- a/drivetrain-testing-Imported/vendordeps/REVLib.json +++ /dev/null @@ -1,73 +0,0 @@ -{ - "fileName": "REVLib.json", - "name": "REVLib", - "version": "2022.1.1", - "uuid": "3f48eb8c-50fe-43a6-9cb7-44c86353c4cb", - "mavenUrls": [ - "https://maven.revrobotics.com/" - ], - "jsonUrl": "https://software-metadata.revrobotics.com/REVLib.json", - "javaDependencies": [ - { - "groupId": "com.revrobotics.frc", - "artifactId": "REVLib-java", - "version": "2022.1.1" - } - ], - "jniDependencies": [ - { - "groupId": "com.revrobotics.frc", - "artifactId": "REVLib-driver", - "version": "2022.1.1", - "skipInvalidPlatforms": true, - "isJar": false, - "validPlatforms": [ - "windowsx86-64", - "windowsx86", - "linuxaarch64bionic", - "linuxx86-64", - "linuxathena", - "linuxraspbian", - "osxx86-64" - ] - } - ], - "cppDependencies": [ - { - "groupId": "com.revrobotics.frc", - "artifactId": "REVLib-cpp", - "version": "2022.1.1", - "libName": "REVLib", - "headerClassifier": "headers", - "sharedLibrary": false, - "skipInvalidPlatforms": true, - "binaryPlatforms": [ - "windowsx86-64", - "windowsx86", - "linuxaarch64bionic", - "linuxx86-64", - "linuxathena", - "linuxraspbian", - "osxx86-64" - ] - }, - { - "groupId": "com.revrobotics.frc", - "artifactId": "REVLib-driver", - "version": "2022.1.1", - "libName": "REVLibDriver", - "headerClassifier": "headers", - "sharedLibrary": false, - "skipInvalidPlatforms": true, - "binaryPlatforms": [ - "windowsx86-64", - "windowsx86", - "linuxaarch64bionic", - "linuxx86-64", - "linuxathena", - "linuxraspbian", - "osxx86-64" - ] - } - ] -} \ No newline at end of file diff --git a/drivetrain-testing-Imported/vendordeps/WPILibNewCommands.json b/drivetrain-testing-Imported/vendordeps/WPILibNewCommands.json deleted file mode 100644 index d7bd9b0..0000000 --- a/drivetrain-testing-Imported/vendordeps/WPILibNewCommands.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "fileName": "WPILibNewCommands.json", - "name": "WPILib-New-Commands", - "version": "2020.0.0", - "uuid": "111e20f7-815e-48f8-9dd6-e675ce75b266", - "mavenUrls": [], - "jsonUrl": "", - "javaDependencies": [ - { - "groupId": "edu.wpi.first.wpilibNewCommands", - "artifactId": "wpilibNewCommands-java", - "version": "wpilib" - } - ], - "jniDependencies": [], - "cppDependencies": [ - { - "groupId": "edu.wpi.first.wpilibNewCommands", - "artifactId": "wpilibNewCommands-cpp", - "version": "wpilib", - "libName": "wpilibNewCommands", - "headerClassifier": "headers", - "sourcesClassifier": "sources", - "sharedLibrary": true, - "skipInvalidPlatforms": true, - "binaryPlatforms": [ - "linuxathena", - "linuxraspbian", - "linuxaarch64bionic", - "windowsx86-64", - "windowsx86", - "linuxx86-64", - "osxx86-64" - ] - } - ] -} diff --git a/drivetrain-testing/.gitignore b/drivetrain-testing/.gitignore index 3322773..9535c83 100644 --- a/drivetrain-testing/.gitignore +++ b/drivetrain-testing/.gitignore @@ -1,161 +1,162 @@ -# Created by https://www.gitignore.io/api/c++,java,linux,macos,gradle,windows,visualstudiocode - -### C++ ### -# Prerequisites -*.d - -# Compiled Object files -*.slo -*.lo -*.o -*.obj - -# Precompiled Headers -*.gch -*.pch - -# Compiled Dynamic libraries -*.so -*.dylib -*.dll - -# Fortran module files -*.mod -*.smod - -# Compiled Static libraries -*.lai -*.la -*.a -*.lib - -# Executables -*.exe -*.out -*.app - -### Java ### -# Compiled class file -*.class - -# Log file -*.log - -# BlueJ files -*.ctxt - -# Mobile Tools for Java (J2ME) -.mtj.tmp/ - -# Package Files # -*.jar -*.war -*.nar -*.ear -*.zip -*.tar.gz -*.rar - -# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml -hs_err_pid* - -### Linux ### -*~ - -# temporary files which can be created if a process still has a handle open of a deleted file -.fuse_hidden* - -# KDE directory preferences -.directory - -# Linux trash folder which might appear on any partition or disk -.Trash-* - -# .nfs files are created when an open file is removed but is still being accessed -.nfs* - -### macOS ### -# General -.DS_Store -.AppleDouble -.LSOverride - -# Icon must end with two \r -Icon - -# Thumbnails -._* - -# Files that might appear in the root of a volume -.DocumentRevisions-V100 -.fseventsd -.Spotlight-V100 -.TemporaryItems -.Trashes -.VolumeIcon.icns -.com.apple.timemachine.donotpresent - -# Directories potentially created on remote AFP share -.AppleDB -.AppleDesktop -Network Trash Folder -Temporary Items -.apdisk - -### VisualStudioCode ### -.vscode/* -!.vscode/settings.json -!.vscode/tasks.json -!.vscode/launch.json -!.vscode/extensions.json - -### Windows ### -# Windows thumbnail cache files -Thumbs.db -ehthumbs.db -ehthumbs_vista.db - -# Dump file -*.stackdump - -# Folder config file -[Dd]esktop.ini - -# Recycle Bin used on file shares -$RECYCLE.BIN/ - -# Windows Installer files -*.cab -*.msi -*.msix -*.msm -*.msp - -# Windows shortcuts -*.lnk - -### Gradle ### -.gradle -/build/ - -# Ignore Gradle GUI config -gradle-app.setting - -# Avoid ignoring Gradle wrapper jar file (.jar files are usually ignored) -!gradle-wrapper.jar - -# Cache of project -.gradletasknamecache - -# # Work around https://youtrack.jetbrains.com/issue/IDEA-116898 -# gradle/wrapper/gradle-wrapper.properties - -# # VS Code Specific Java Settings -.classpath -.project -.settings/ -bin/ -imgui.ini - - -# End of https://www.gitignore.io/api/c++,java,linux,macos,gradle,windows,visualstudiocode +# This gitignore has been specially created by the WPILib team. +# If you remove items from this file, intellisense might break. + +### C++ ### +# Prerequisites +*.d + +# Compiled Object files +*.slo +*.lo +*.o +*.obj + +# Precompiled Headers +*.gch +*.pch + +# Compiled Dynamic libraries +*.so +*.dylib +*.dll + +# Fortran module files +*.mod +*.smod + +# Compiled Static libraries +*.lai +*.la +*.a +*.lib + +# Executables +*.exe +*.out +*.app + +### Java ### +# Compiled class file +*.class + +# Log file +*.log + +# BlueJ files +*.ctxt + +# Mobile Tools for Java (J2ME) +.mtj.tmp/ + +# Package Files # +*.jar +*.war +*.nar +*.ear +*.zip +*.tar.gz +*.rar + +# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml +hs_err_pid* + +### Linux ### +*~ + +# temporary files which can be created if a process still has a handle open of a deleted file +.fuse_hidden* + +# KDE directory preferences +.directory + +# Linux trash folder which might appear on any partition or disk +.Trash-* + +# .nfs files are created when an open file is removed but is still being accessed +.nfs* + +### macOS ### +# General +.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + +### VisualStudioCode ### +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json + +### Windows ### +# Windows thumbnail cache files +Thumbs.db +ehthumbs.db +ehthumbs_vista.db + +# Dump file +*.stackdump + +# Folder config file +[Dd]esktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# Windows Installer files +*.cab +*.msi +*.msix +*.msm +*.msp + +# Windows shortcuts +*.lnk + +### Gradle ### +.gradle +/build/ + +# Ignore Gradle GUI config +gradle-app.setting + +# Avoid ignoring Gradle wrapper jar file (.jar files are usually ignored) +!gradle-wrapper.jar + +# Cache of project +.gradletasknamecache + +# # Work around https://youtrack.jetbrains.com/issue/IDEA-116898 +# gradle/wrapper/gradle-wrapper.properties + +# # VS Code Specific Java Settings +# DO NOT REMOVE .classpath and .project +.classpath +.project +.settings/ +bin/ + +# Simulation GUI and other tools window save file +*-window.json diff --git a/drivetrain-testing-Imported/.idea/.gitignore b/drivetrain-testing/.idea/.gitignore similarity index 100% rename from drivetrain-testing-Imported/.idea/.gitignore rename to drivetrain-testing/.idea/.gitignore diff --git a/drivetrain-testing-Imported/.idea/compiler.xml b/drivetrain-testing/.idea/compiler.xml similarity index 100% rename from drivetrain-testing-Imported/.idea/compiler.xml rename to drivetrain-testing/.idea/compiler.xml diff --git a/drivetrain-testing-Imported/.idea/gradle.xml b/drivetrain-testing/.idea/gradle.xml similarity index 100% rename from drivetrain-testing-Imported/.idea/gradle.xml rename to drivetrain-testing/.idea/gradle.xml diff --git a/drivetrain-testing-Imported/.idea/jarRepositories.xml b/drivetrain-testing/.idea/jarRepositories.xml similarity index 100% rename from drivetrain-testing-Imported/.idea/jarRepositories.xml rename to drivetrain-testing/.idea/jarRepositories.xml diff --git a/drivetrain-testing-Imported/.idea/libraries/konstant.xml b/drivetrain-testing/.idea/libraries/konstant.xml similarity index 100% rename from drivetrain-testing-Imported/.idea/libraries/konstant.xml rename to drivetrain-testing/.idea/libraries/konstant.xml diff --git a/drivetrain-testing-Imported/.idea/misc.xml b/drivetrain-testing/.idea/misc.xml similarity index 100% rename from drivetrain-testing-Imported/.idea/misc.xml rename to drivetrain-testing/.idea/misc.xml diff --git a/drivetrain-testing-Imported/.idea/vcs.xml b/drivetrain-testing/.idea/vcs.xml similarity index 100% rename from drivetrain-testing-Imported/.idea/vcs.xml rename to drivetrain-testing/.idea/vcs.xml diff --git a/drivetrain-testing/.vscode/launch.json b/drivetrain-testing/.vscode/launch.json index 5b804e8..c9c9713 100644 --- a/drivetrain-testing/.vscode/launch.json +++ b/drivetrain-testing/.vscode/launch.json @@ -1,21 +1,21 @@ -{ - // Use IntelliSense to learn about possible attributes. - // Hover to view descriptions of existing attributes. - // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 - "version": "0.2.0", - "configurations": [ - - { - "type": "wpilib", - "name": "WPILib Desktop Debug", - "request": "launch", - "desktop": true, - }, - { - "type": "wpilib", - "name": "WPILib roboRIO Debug", - "request": "launch", - "desktop": false, - } - ] -} +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + + { + "type": "wpilib", + "name": "WPILib Desktop Debug", + "request": "launch", + "desktop": true, + }, + { + "type": "wpilib", + "name": "WPILib roboRIO Debug", + "request": "launch", + "desktop": false, + } + ] +} diff --git a/drivetrain-testing/.vscode/settings.json b/drivetrain-testing/.vscode/settings.json index 0a91062..4ed293b 100644 --- a/drivetrain-testing/.vscode/settings.json +++ b/drivetrain-testing/.vscode/settings.json @@ -1,17 +1,29 @@ -{ - "java.configuration.updateBuildConfiguration": "automatic", - "java.server.launchMode": "Standard", - "files.exclude": { - "**/.git": true, - "**/.svn": true, - "**/.hg": true, - "**/CVS": true, - "**/.DS_Store": true, - "bin/": true, - "**/.classpath": true, - "**/.project": true, - "**/.settings": true, - "**/.factorypath": true, - "**/*~": true - } -} +{ + "java.configuration.updateBuildConfiguration": "automatic", + "java.server.launchMode": "Standard", + "files.exclude": { + "**/.git": true, + "**/.svn": true, + "**/.hg": true, + "**/CVS": true, + "**/.DS_Store": true, + "bin/": true, + "**/.classpath": true, + "**/.project": true, + "**/.settings": true, + "**/.factorypath": true, + "**/*~": true + }, + "java.test.config": [ + { + "name": "WPIlibUnitTests", + "workingDirectory": "${workspaceFolder}/build/jni/release", + "vmargs": [ "-Djava.library.path=${workspaceFolder}/build/jni/release" ], + "env": { + "LD_LIBRARY_PATH": "${workspaceFolder}/build/jni/release" , + "DYLD_LIBRARY_PATH": "${workspaceFolder}/build/jni/release" + } + }, + ], + "java.test.defaultConfig": "WPIlibUnitTests" +} diff --git a/drivetrain-testing/.wpilib/wpilib_preferences.json b/drivetrain-testing/.wpilib/wpilib_preferences.json index 3684a02..707f879 100644 --- a/drivetrain-testing/.wpilib/wpilib_preferences.json +++ b/drivetrain-testing/.wpilib/wpilib_preferences.json @@ -1,6 +1,6 @@ { "enableCppIntellisense": false, "currentLanguage": "java", - "projectYear": "2021", + "projectYear": "2022", "teamNumber": 321 } \ No newline at end of file diff --git a/drivetrain-testing/WPILib-License.md b/drivetrain-testing/WPILib-License.md index ba35a02..3d5a824 100644 --- a/drivetrain-testing/WPILib-License.md +++ b/drivetrain-testing/WPILib-License.md @@ -1,24 +1,24 @@ -Copyright (c) 2009-2021 FIRST and other WPILib contributors -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of FIRST, WPILib, nor the names of other WPILib - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY FIRST AND OTHER WPILIB CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY NONINFRINGEMENT AND FITNESS FOR A PARTICULAR -PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL FIRST OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +Copyright (c) 2009-2021 FIRST and other WPILib contributors +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of FIRST, WPILib, nor the names of other WPILib + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY FIRST AND OTHER WPILIB CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY NONINFRINGEMENT AND FITNESS FOR A PARTICULAR +PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL FIRST OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/drivetrain-testing/build.gradle b/drivetrain-testing/build.gradle index 22abee0..c361b42 100644 --- a/drivetrain-testing/build.gradle +++ b/drivetrain-testing/build.gradle @@ -1,79 +1,88 @@ -plugins { - id "java" - id "edu.wpi.first.GradleRIO" version "2021.3.1" -} - -sourceCompatibility = JavaVersion.VERSION_11 -targetCompatibility = JavaVersion.VERSION_11 - -def ROBOT_MAIN_CLASS = "frc.robot.Main" - -// Define my targets (RoboRIO) and artifacts (deployable files) -// This is added by GradleRIO's backing project EmbeddedTools. -deploy { - targets { - roboRIO("roborio") { - // Team number is loaded either from the .wpilib/wpilib_preferences.json - // or from command line. If not found an exception will be thrown. - // You can use getTeamOrDefault(team) instead of getTeamNumber if you - // want to store a team number in this file. - team = frc.getTeamNumber() - } - } - artifacts { - frcJavaArtifact('frcJava') { - targets << "roborio" - // Debug can be overridden by command line, for use with VSCode - debug = frc.getDebugOrDefault(false) - } - // Built in artifact to deploy arbitrary files to the roboRIO. - fileTreeArtifact('frcStaticFileDeploy') { - // The directory below is the local directory to deploy - files = fileTree(dir: 'src/main/deploy') - // Deploy to RoboRIO target, into /home/lvuser/deploy - targets << "roborio" - directory = '/home/lvuser/deploy' - } - } -} - -// Set this to true to enable desktop support. -def includeDesktopSupport = false - -// Defining my dependencies. In this case, WPILib (+ friends), and vendor libraries. -// Also defines JUnit 4. -dependencies { - implementation wpi.deps.wpilib() - nativeZip wpi.deps.wpilibJni(wpi.platforms.roborio) - nativeDesktopZip wpi.deps.wpilibJni(wpi.platforms.desktop) - - - implementation wpi.deps.vendor.java() - nativeZip wpi.deps.vendor.jni(wpi.platforms.roborio) - nativeDesktopZip wpi.deps.vendor.jni(wpi.platforms.desktop) - - testImplementation 'junit:junit:4.12' - - // Enable simulation gui support. Must check the box in vscode to enable support - // upon debugging - simulation wpi.deps.sim.gui(wpi.platforms.desktop, false) - simulation wpi.deps.sim.driverstation(wpi.platforms.desktop, false) - - // Websocket extensions require additional configuration. - // simulation wpi.deps.sim.ws_server(wpi.platforms.desktop, false) - // simulation wpi.deps.sim.ws_client(wpi.platforms.desktop, false) -} - -// Simulation configuration (e.g. environment variables). -sim { - // Sets the websocket client remote host. - // envVar "HALSIMWS_HOST", "10.0.0.2" -} - -// Setting up my Jar File. In this case, adding all libraries into the main jar ('fat jar') -// in order to make them all available at runtime. Also adding the manifest so WPILib -// knows where to look for our Robot Class. -jar { - from { configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) } } - manifest edu.wpi.first.gradlerio.GradleRIOPlugin.javaManifest(ROBOT_MAIN_CLASS) -} +plugins { + id "java" + id "edu.wpi.first.GradleRIO" version "2022.2.1" +} + +sourceCompatibility = JavaVersion.VERSION_11 +targetCompatibility = JavaVersion.VERSION_11 + +def ROBOT_MAIN_CLASS = "frc.robot.Main" + +// Define my targets (RoboRIO) and artifacts (deployable files) +// This is added by GradleRIO's backing project DeployUtils. +deploy { + targets { + roborio(getTargetTypeClass('RoboRIO')) { + // Team number is loaded either from the .wpilib/wpilib_preferences.json + // or from command line. If not found an exception will be thrown. + // You can use getTeamOrDefault(team) instead of getTeamNumber if you + // want to store a team number in this file. + team = project.frc.getTeamNumber() + debug = project.frc.getDebugOrDefault(false) + + artifacts { + // First part is artifact name, 2nd is artifact type + // getTargetTypeClass is a shortcut to get the class type using a string + + frcJava(getArtifactTypeClass('FRCJavaArtifact')) { + } + + // Static files artifact + frcStaticFileDeploy(getArtifactTypeClass('FileTreeArtifact')) { + files = project.fileTree('src/main/deploy') + directory = '/home/lvuser/deploy' + } + } + } + } +} + +def deployArtifact = deploy.targets.roborio.artifacts.frcJava + +// Set to true to use debug for JNI. +wpi.java.debugJni = false + +// Set this to true to enable desktop support. +def includeDesktopSupport = false + +// Defining my dependencies. In this case, WPILib (+ friends), and vendor libraries. +// Also defines JUnit 4. +dependencies { + implementation wpi.java.deps.wpilib() + implementation wpi.java.vendor.java() + + + roborioDebug wpi.java.deps.wpilibJniDebug(wpi.platforms.roborio) + roborioDebug wpi.java.vendor.jniDebug(wpi.platforms.roborio) + + roborioRelease wpi.java.deps.wpilibJniRelease(wpi.platforms.roborio) + roborioRelease wpi.java.vendor.jniRelease(wpi.platforms.roborio) + + nativeDebug wpi.java.deps.wpilibJniDebug(wpi.platforms.desktop) + nativeDebug wpi.java.vendor.jniDebug(wpi.platforms.desktop) + simulationDebug wpi.sim.enableDebug() + + nativeRelease wpi.java.deps.wpilibJniRelease(wpi.platforms.desktop) + nativeRelease wpi.java.vendor.jniRelease(wpi.platforms.desktop) + simulationRelease wpi.sim.enableRelease() + + testImplementation 'junit:junit:4.12' +} + +// Simulation configuration (e.g. environment variables). +wpi.sim.addGui().defaultEnabled = true +wpi.sim.addDriverstation() + +// Setting up my Jar File. In this case, adding all libraries into the main jar ('fat jar') +// in order to make them all available at runtime. Also adding the manifest so WPILib +// knows where to look for our Robot Class. +jar { + from { configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) } } + manifest edu.wpi.first.gradlerio.GradleRIOPlugin.javaManifest(ROBOT_MAIN_CLASS) + duplicatesStrategy = DuplicatesStrategy.INCLUDE +} + +// Configure jar and deploy tasks +deployArtifact.jarTask = jar +wpi.java.configureExecutableTasks(jar) +wpi.java.configureTestTasks(test) diff --git a/drivetrain-testing/gradle/wrapper/gradle-wrapper.jar b/drivetrain-testing/gradle/wrapper/gradle-wrapper.jar index cc4fdc293d0e50b0ad9b65c16e7ddd1db2f6025b..7454180f2ae8848c63b8b4dea2cb829da983f2fa 100644 GIT binary patch delta 22213 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 delta 21233 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 \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >/dev/null -APP_HOME="`pwd -P`" -cd "$SAVED" >/dev/null + +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit APP_NAME="Gradle" -APP_BASE_NAME=`basename "$0"` +APP_BASE_NAME=${0##*/} # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' # Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD="maximum" +MAX_FD=maximum warn () { echo "$*" -} +} >&2 die () { echo echo "$*" echo exit 1 -} +} >&2 # OS specific support (must be 'true' or 'false'). cygwin=false msys=false darwin=false nonstop=false -case "`uname`" in - CYGWIN* ) - cygwin=true - ;; - Darwin* ) - darwin=true - ;; - MINGW* ) - msys=true - ;; - NONSTOP* ) - nonstop=true - ;; +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; esac CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + # Determine the Java command to use to start the JVM. if [ -n "$JAVA_HOME" ] ; then if [ -x "$JAVA_HOME/jre/sh/java" ] ; then # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" + JAVACMD=$JAVA_HOME/jre/sh/java else - JAVACMD="$JAVA_HOME/bin/java" + JAVACMD=$JAVA_HOME/bin/java fi if [ ! -x "$JAVACMD" ] ; then die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME @@ -97,7 +132,7 @@ Please set the JAVA_HOME variable in your environment to match the location of your Java installation." fi else - JAVACMD="java" + JAVACMD=java which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the @@ -105,79 +140,95 @@ location of your Java installation." fi # Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then - MAX_FD_LIMIT=`ulimit -H -n` - if [ $? -eq 0 ] ; then - if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then - MAX_FD="$MAX_FD_LIMIT" - fi - ulimit -n $MAX_FD - if [ $? -ne 0 ] ; then - warn "Could not set maximum file descriptor limit: $MAX_FD" - fi - else - warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" - fi +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac fi -# For Darwin, add options to specify how the application appears in the dock -if $darwin; then - GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" -fi +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. # For Cygwin or MSYS, switch paths to Windows format before running java -if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then - APP_HOME=`cygpath --path --mixed "$APP_HOME"` - CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` - JAVACMD=`cygpath --unix "$JAVACMD"` - - # We build the pattern for arguments to be converted via cygpath - ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` - SEP="" - for dir in $ROOTDIRSRAW ; do - ROOTDIRS="$ROOTDIRS$SEP$dir" - SEP="|" - done - OURCYGPATTERN="(^($ROOTDIRS))" - # Add a user-defined pattern to the cygpath arguments - if [ "$GRADLE_CYGPATTERN" != "" ] ; then - OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" - fi +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + # Now convert the arguments - kludge to limit ourselves to /bin/sh - i=0 - for arg in "$@" ; do - CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` - CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option - - if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition - eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` - else - eval `echo args$i`="\"$arg\"" + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) fi - i=`expr $i + 1` + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg done - case $i in - 0) set -- ;; - 1) set -- "$args0" ;; - 2) set -- "$args0" "$args1" ;; - 3) set -- "$args0" "$args1" "$args2" ;; - 4) set -- "$args0" "$args1" "$args2" "$args3" ;; - 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; - esac fi -# Escape application args -save () { - for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done - echo " " -} -APP_ARGS=`save "$@"` +# Collect all arguments for the java command; +# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of +# shell script including quotes and variable substitutions, so put them in +# double quotes to make sure that they get re-expanded; and +# * put everything else in single quotes, so that it's not re-expanded. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# -# Collect all arguments for the java command, following the shell quoting and substitution rules -eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' exec "$JAVACMD" "$@" diff --git a/drivetrain-testing/gradlew.bat b/drivetrain-testing/gradlew.bat index 24467a1..107acd3 100644 --- a/drivetrain-testing/gradlew.bat +++ b/drivetrain-testing/gradlew.bat @@ -1,100 +1,89 @@ -@rem -@rem Copyright 2015 the original author or authors. -@rem -@rem Licensed under the Apache License, Version 2.0 (the "License"); -@rem you may not use this file except in compliance with the License. -@rem You may obtain a copy of the License at -@rem -@rem https://www.apache.org/licenses/LICENSE-2.0 -@rem -@rem Unless required by applicable law or agreed to in writing, software -@rem distributed under the License is distributed on an "AS IS" BASIS, -@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@rem See the License for the specific language governing permissions and -@rem limitations under the License. -@rem - -@if "%DEBUG%" == "" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto init - -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto init - -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:init -@rem Get command-line arguments, handling Windows variants - -if not "%OS%" == "Windows_NT" goto win9xME_args - -:win9xME_args -@rem Slurp the command line arguments. -set CMD_LINE_ARGS= -set _SKIP=2 - -:win9xME_args_slurp -if "x%~1" == "x" goto execute - -set CMD_LINE_ARGS=%* - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% - -:end -@rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/drivetrain-testing/settings.gradle b/drivetrain-testing/settings.gradle index 4ee6ec2..c363694 100644 --- a/drivetrain-testing/settings.gradle +++ b/drivetrain-testing/settings.gradle @@ -1,27 +1,27 @@ -import org.gradle.internal.os.OperatingSystem - -pluginManagement { - repositories { - mavenLocal() - gradlePluginPortal() - String frcYear = '2021' - File frcHome - if (OperatingSystem.current().isWindows()) { - String publicFolder = System.getenv('PUBLIC') - if (publicFolder == null) { - publicFolder = "C:\\Users\\Public" - } - def homeRoot = new File(publicFolder, "wpilib") - frcHome = new File(homeRoot, frcYear) - } else { - def userFolder = System.getProperty("user.home") - def homeRoot = new File(userFolder, "wpilib") - frcHome = new File(homeRoot, frcYear) - } - def frcHomeMaven = new File(frcHome, 'maven') - maven { - name 'frcHome' - url frcHomeMaven - } - } -} +import org.gradle.internal.os.OperatingSystem + +pluginManagement { + repositories { + mavenLocal() + gradlePluginPortal() + String frcYear = '2022' + File frcHome + if (OperatingSystem.current().isWindows()) { + String publicFolder = System.getenv('PUBLIC') + if (publicFolder == null) { + publicFolder = "C:\\Users\\Public" + } + def homeRoot = new File(publicFolder, "wpilib") + frcHome = new File(homeRoot, frcYear) + } else { + def userFolder = System.getProperty("user.home") + def homeRoot = new File(userFolder, "wpilib") + frcHome = new File(homeRoot, frcYear) + } + def frcHomeMaven = new File(frcHome, 'maven') + maven { + name 'frcHome' + url frcHomeMaven + } + } +} diff --git a/drivetrain-testing-Imported/simgui-ds.json b/drivetrain-testing/simgui-ds.json similarity index 100% rename from drivetrain-testing-Imported/simgui-ds.json rename to drivetrain-testing/simgui-ds.json diff --git a/drivetrain-testing-Imported/simgui.json b/drivetrain-testing/simgui.json similarity index 100% rename from drivetrain-testing-Imported/simgui.json rename to drivetrain-testing/simgui.json diff --git a/drivetrain-testing/src/main/java/frc/robot/Constants.java b/drivetrain-testing/src/main/java/frc/robot/Constants.java index 84c1178..46ca94d 100644 --- a/drivetrain-testing/src/main/java/frc/robot/Constants.java +++ b/drivetrain-testing/src/main/java/frc/robot/Constants.java @@ -4,8 +4,6 @@ package frc.robot; -import edu.wpi.first.wpilibj.SpeedController; - /** * The Constants class provides a convenient place for teams to hold robot-wide numerical or boolean * constants. This class should not be used for any other purpose. All constants should be declared @@ -15,15 +13,17 @@ * constants are needed, to reduce verbosity. */ public final class Constants { - - public static SpeedController K_TRACK_WIDTH; - public static final int FRONT_LEFT_MOTOR = 0; public static final int MIDDLE_LEFT_MOTOR = 1; - public static final int BACK_LEFT_MOTOR = 3; - public static final int FRONT_RIGHT_MOTOR = 4; - public static final int MIDDLE_RIGHT_MOTOR = 5; - public static final int BACK_RIGHT_MOTOR = 6; + public static final int BACK_LEFT_MOTOR = 2; + public static final int FRONT_RIGHT_MOTOR = 3; + public static final int MIDDLE_RIGHT_MOTOR = 4; + public static final int BACK_RIGHT_MOTOR = 5; + public static final int DRIVER_CONTROLLER = 0; + + public static final double TURN_RATE = 0.5; } + + diff --git a/drivetrain-testing/src/main/java/frc/robot/RobotContainer.java b/drivetrain-testing/src/main/java/frc/robot/RobotContainer.java index f18779d..5d125fc 100644 --- a/drivetrain-testing/src/main/java/frc/robot/RobotContainer.java +++ b/drivetrain-testing/src/main/java/frc/robot/RobotContainer.java @@ -4,11 +4,12 @@ package frc.robot; -import edu.wpi.first.wpilibj.GenericHID; import edu.wpi.first.wpilibj.XboxController; -import frc.robot.commands.ExampleCommand; -import frc.robot.subsystems.ExampleSubsystem; import edu.wpi.first.wpilibj2.command.Command; +import edu.wpi.first.wpilibj2.command.RunCommand; +import frc.robot.commands.AutoCommand; +import frc.robot.subsystems.drivetrain.Drivetrain; + /** * This class is where the bulk of the robot should be declared. Since Command-based is a @@ -18,14 +19,21 @@ */ public class RobotContainer { // The robot's subsystems and commands are defined here... - private final ExampleSubsystem m_exampleSubsystem = new ExampleSubsystem(); - private final ExampleCommand m_autoCommand = new ExampleCommand(m_exampleSubsystem); + private final Drivetrain m_drivetrain = new Drivetrain(); + + private final XboxController m_driverController = new XboxController(Constants.DRIVER_CONTROLLER); + + private Command m_autoCommand = new AutoCommand(m_drivetrain); /** The container for the robot. Contains subsystems, OI devices, and commands. */ public RobotContainer() { // Configure the button bindings configureButtonBindings(); + + m_drivetrain.setDefaultCommand(new RunCommand(() -> { + m_drivetrain.drive(m_driverController.getRightY(), m_driverController.getRightX()); + }, m_drivetrain)); } /** diff --git a/drivetrain-testing-Imported/src/main/java/frc/robot/commands/AutoCommand.java b/drivetrain-testing/src/main/java/frc/robot/commands/AutoCommand.java similarity index 100% rename from drivetrain-testing-Imported/src/main/java/frc/robot/commands/AutoCommand.java rename to drivetrain-testing/src/main/java/frc/robot/commands/AutoCommand.java diff --git a/drivetrain-testing-Imported/src/main/java/frc/robot/subsystems/drivetrain/Drivetrain.java b/drivetrain-testing/src/main/java/frc/robot/subsystems/drivetrain/Drivetrain.java similarity index 100% rename from drivetrain-testing-Imported/src/main/java/frc/robot/subsystems/drivetrain/Drivetrain.java rename to drivetrain-testing/src/main/java/frc/robot/subsystems/drivetrain/Drivetrain.java diff --git a/drivetrain-testing/src/main/java/frc/robot/subsystems/drivetrain/DrivetrainSubsystem.java b/drivetrain-testing/src/main/java/frc/robot/subsystems/drivetrain/DrivetrainSubsystem.java deleted file mode 100644 index c3b299a..0000000 --- a/drivetrain-testing/src/main/java/frc/robot/subsystems/drivetrain/DrivetrainSubsystem.java +++ /dev/null @@ -1,57 +0,0 @@ -package frc.robot.subsystems.drivetrain; - -import edu.wpi.first.wpilibj.drive.DifferentialDrive; -// import edu.wpi.first.wpilibj.motorcontrol.MotorControllerGroup; - - -import edu.wpi.first.wpilibj2.command.SubsystemBase; -import frc.robot.Constants; -// doesnt work for some unknown reason -// import edu.wpi.first.wpilibj.motorcontrol.MotorControllerGroup; - -import com.revrobotics.CANSparkMax; -import com.revrobotics.CANSparkMax.IdleMode; -import com.revrobotics.CANSparkMaxLowLevel.MotorType; - -import edu.wpi.first.wpilibj.AnalogGyro; -import edu.wpi.first.wpilibj.Encoder; -import edu.wpi.first.wpilibj.SpeedController; -import edu.wpi.first.wpilibj.SpeedControllerGroup; - - - -public class DrivetrainSubsystem extends SubsystemBase { - - private CANSparkMax frontLeft = new CANSparkMax(Constants.FRONT_LEFT_MOTOR, MotorType.kBrushless); - private CANSparkMax frontRight = new CANSparkMax(Constants.FRONT_RIGHT_MOTOR, MotorType.kBrushless); - private CANSparkMax middleLeft = new CANSparkMax(Constants.MIDDLE_LEFT_MOTOR, MotorType.kBrushless); - private CANSparkMax middleRight = new CANSparkMax(Constants.MIDDLE_RIGHT_MOTOR, MotorType.kBrushless); - private CANSparkMax backLeft = new CANSparkMax(Constants.BACK_LEFT_MOTOR, MotorType.kBrushless); - private CANSparkMax backRight = new CANSparkMax(Constants.BACK_RIGHT_MOTOR, MotorType.kBrushless); - - private SpeedControllerGroup left = new SpeedControllerGroup(frontLeft, middleLeft, backLeft); - private SpeedControllerGroup right = new SpeedControllerGroup(frontRight, middleRight, backRight); - - -private final DifferentialDrive diffDrive = new DifferentialDrive(left, right); - - public DrivetrainSubsystem() { - this.left.setInverted(false); - this.right.setInverted(true); - - frontLeft.setIdleMode(IdleMode.kBrake); - frontRight.setIdleMode(IdleMode.kBrake); - middleLeft.setIdleMode(IdleMode.kBrake); - middleRight.setIdleMode(IdleMode.kBrake); - backLeft.setIdleMode(IdleMode.kBrake); - backRight.setIdleMode(IdleMode.kBrake); - - - } - - - public void drive(double xSpeed, double ySpeed) { - diffDrive.tankDrive(xSpeed, ySpeed); - } - -} diff --git a/drivetrain-testing/vendordeps/WPILibNewCommands.json b/drivetrain-testing/vendordeps/WPILibNewCommands.json index 9a22dbd..d7bd9b0 100644 --- a/drivetrain-testing/vendordeps/WPILibNewCommands.json +++ b/drivetrain-testing/vendordeps/WPILibNewCommands.json @@ -1,37 +1,37 @@ -{ - "fileName": "WPILibNewCommands.json", - "name": "WPILib-New-Commands", - "version": "2020.0.0", - "uuid": "111e20f7-815e-48f8-9dd6-e675ce75b266", - "mavenUrls": [], - "jsonUrl": "", - "javaDependencies": [ - { - "groupId": "edu.wpi.first.wpilibNewCommands", - "artifactId": "wpilibNewCommands-java", - "version": "wpilib" - } - ], - "jniDependencies": [], - "cppDependencies": [ - { - "groupId": "edu.wpi.first.wpilibNewCommands", - "artifactId": "wpilibNewCommands-cpp", - "version": "wpilib", - "libName": "wpilibNewCommands", - "headerClassifier": "headers", - "sourcesClassifier": "sources", - "sharedLibrary": true, - "skipInvalidPlatforms": true, - "binaryPlatforms": [ - "linuxathena", - "linuxraspbian", - "linuxaarch64bionic", - "windowsx86-64", - "windowsx86", - "linuxx86-64", - "osxx86-64" - ] - } - ] -} +{ + "fileName": "WPILibNewCommands.json", + "name": "WPILib-New-Commands", + "version": "2020.0.0", + "uuid": "111e20f7-815e-48f8-9dd6-e675ce75b266", + "mavenUrls": [], + "jsonUrl": "", + "javaDependencies": [ + { + "groupId": "edu.wpi.first.wpilibNewCommands", + "artifactId": "wpilibNewCommands-java", + "version": "wpilib" + } + ], + "jniDependencies": [], + "cppDependencies": [ + { + "groupId": "edu.wpi.first.wpilibNewCommands", + "artifactId": "wpilibNewCommands-cpp", + "version": "wpilib", + "libName": "wpilibNewCommands", + "headerClassifier": "headers", + "sourcesClassifier": "sources", + "sharedLibrary": true, + "skipInvalidPlatforms": true, + "binaryPlatforms": [ + "linuxathena", + "linuxraspbian", + "linuxaarch64bionic", + "windowsx86-64", + "windowsx86", + "linuxx86-64", + "osxx86-64" + ] + } + ] +}