From d0f3f1bd629580339738f52c7a2ccf80e3d2bd81 Mon Sep 17 00:00:00 2001 From: Jay McNeely Date: Mon, 18 Nov 2024 13:22:23 -0600 Subject: [PATCH 01/39] Reworked repository for new season. --- .github/ISSUE_TEMPLATE/bug_report.md | 38 -- .github/linters/actionlint.yml | 5 - .github/workflows/superlinter.yml | 29 - .github/workflows/wpilib-build.yml | 36 -- .gitignore | 351 ++++++------ .../wpilib_preferences.json | 2 +- .../.gradle/7.5.1/checksums/checksums.lock | Bin 17 -> 0 bytes .../.gradle/7.5.1/checksums/md5-checksums.bin | Bin 35247 -> 0 bytes .../7.5.1/checksums/sha1-checksums.bin | Bin 77513 -> 0 bytes .../dependencies-accessors.lock | Bin 17 -> 0 bytes .../dependencies-accessors/gc.properties | 0 .../executionHistory/executionHistory.bin | Bin 178787 -> 0 bytes .../executionHistory/executionHistory.lock | Bin 17 -> 0 bytes .../.gradle/7.5.1/fileChanges/last-build.bin | Bin 1 -> 0 bytes .../.gradle/7.5.1/fileHashes/fileHashes.bin | Bin 70215 -> 0 bytes .../.gradle/7.5.1/fileHashes/fileHashes.lock | Bin 17 -> 0 bytes .../7.5.1/fileHashes/resourceHashesCache.bin | Bin 34545 -> 0 bytes .../main-bot/.gradle/7.5.1/gc.properties | 0 .../buildOutputCleanup.lock | Bin 17 -> 0 bytes .../buildOutputCleanup/cache.properties | 2 - .../buildOutputCleanup/outputFiles.bin | Bin 24131 -> 0 bytes 2022-2023/main-bot/.gradle/file-system.probe | Bin 8 -> 0 bytes .../main-bot/.gradle/vcs-1/gc.properties | 0 2022-2023/main-bot/WPILib-License.md | 24 - 2022-2023/main-bot/bin/main/frc/.clang-format | 6 - .../main-bot/bin/main/frc/CommonData.class | Bin 918 -> 0 bytes .../main/frc/components/Arm$Position.class | Bin 1589 -> 0 bytes .../bin/main/frc/components/Arm.class | Bin 1525 -> 0 bytes .../bin/main/frc/components/Claw$State.class | Bin 1075 -> 0 bytes .../bin/main/frc/components/Claw.class | Bin 1749 -> 0 bytes .../bin/main/frc/components/IComponent.class | Bin 139 -> 0 bytes .../bin/main/frc/components/README.md | 8 - .../bin/main/frc/components/SwerveDrive.class | Bin 4203 -> 0 bytes .../bin/main/frc/components/SwerveWheel.class | Bin 2750 -> 0 bytes .../frc/components/autonomous/ArmState1.class | Bin 1315 -> 0 bytes .../frc/components/autonomous/ArmState2.class | Bin 1196 -> 0 bytes .../frc/components/autonomous/ArmState3.class | Bin 1315 -> 0 bytes .../components/autonomous/Autonomous.class | Bin 939 -> 0 bytes .../components/autonomous/DriveState1.class | Bin 1751 -> 0 bytes .../components/autonomous/DriveState2.class | Bin 2921 -> 0 bytes .../components/autonomous/DriveState3.class | Bin 2330 -> 0 bytes .../components/autonomous/DriveState4.class | Bin 2513 -> 0 bytes .../components/autonomous/DriveState5.class | Bin 1607 -> 0 bytes .../components/autonomous/DriveState6.class | Bin 780 -> 0 bytes .../main/frc/controllers/LogitechF310.class | Bin 3047 -> 0 bytes .../main/frc/controllers/Xbox360$dPad.class | Bin 1472 -> 0 bytes .../bin/main/frc/controllers/Xbox360.class | Bin 3220 -> 0 bytes .../main/frc/controllers/XboxOne$dPad.class | Bin 1472 -> 0 bytes .../bin/main/frc/controllers/XboxOne.class | Bin 3209 -> 0 bytes .../main-bot/bin/main/frc/robot/Main.class | Bin 1044 -> 0 bytes .../main-bot/bin/main/frc/robot/Robot.class | Bin 5593 -> 0 bytes .../main-bot/bin/main/frc/robot/Utility.class | Bin 1149 -> 0 bytes .../bin/main/frc/settings/ArmSettings.class | Bin 337 -> 0 bytes .../bin/main/frc/settings/ClawSettings.class | Bin 368 -> 0 bytes .../frc/settings/LimitedMotorSettings.class | Bin 355 -> 0 bytes .../bin/main/frc/settings/Settings.class | Bin 491 -> 0 bytes .../frc/settings/SwerveDriveSettings.class | Bin 421 -> 0 bytes .../SwerveWheelSettings$Location.class | Bin 1199 -> 0 bytes .../frc/settings/SwerveWheelSettings.class | Bin 604 -> 0 bytes .../bin/main/frc/settings/WristSettings.class | Bin 403 -> 0 bytes .../bin/main/frc/state_machine/State.class | Bin 497 -> 0 bytes .../main/frc/state_machine/StateMachine.class | Bin 1127 -> 0 bytes 2022-2023/main-bot/build.gradle | 105 ---- .../gradle/wrapper/gradle-wrapper.jar | Bin 60756 -> 0 bytes .../gradle/wrapper/gradle-wrapper.properties | 5 - 2022-2023/main-bot/gradlew | 240 --------- 2022-2023/main-bot/gradlew.bat | 91 ---- 2022-2023/main-bot/settings.gradle | 27 - .../src/main/deploy/robot_settings.json | 51 -- .../main-bot/src/main/java/frc/.clang-format | 6 - .../src/main/java/frc/CommonData.java | 116 ---- .../src/main/java/frc/components/Arm.java | 53 -- .../src/main/java/frc/components/Claw.java | 66 --- .../main/java/frc/components/IComponent.java | 19 - .../src/main/java/frc/components/README.md | 8 - .../main/java/frc/components/SwerveDrive.java | 84 --- .../main/java/frc/components/SwerveWheel.java | 70 --- .../frc/components/autonomous/ArmState1.java | 43 -- .../frc/components/autonomous/ArmState2.java | 34 -- .../frc/components/autonomous/ArmState3.java | 41 -- .../frc/components/autonomous/Autonomous.java | 28 - .../components/autonomous/DriveState1.java | 44 -- .../components/autonomous/DriveState2.java | 68 --- .../components/autonomous/DriveState3.java | 53 -- .../components/autonomous/DriveState4.java | 68 --- .../components/autonomous/DriveState5.java | 36 -- .../components/autonomous/DriveState6.java | 21 - .../java/frc/controllers/LogitechF310.java | 150 ------ .../main/java/frc/controllers/Xbox360.java | 146 ----- .../main/java/frc/controllers/XboxOne.java | 147 ------ .../src/main/java/frc/robot/Robot.java | 200 ------- .../src/main/java/frc/robot/Utility.java | 36 -- .../main/java/frc/settings/ArmSettings.java | 6 - .../main/java/frc/settings/ClawSettings.java | 9 - .../frc/settings/LimitedMotorSettings.java | 8 - .../src/main/java/frc/settings/Settings.java | 11 - .../frc/settings/SwerveDriveSettings.java | 9 - .../frc/settings/SwerveWheelSettings.java | 20 - .../main/java/frc/settings/WristSettings.java | 11 - .../main/java/frc/state_machine/State.java | 17 - .../java/frc/state_machine/StateMachine.java | 31 -- 2022-2023/main-bot/vendordeps/NavX.json | 39 -- .../main-bot/vendordeps/PhoenixProAnd5.json | 458 ---------------- .../vendordeps/WPILibNewCommands.json | 37 -- 2023-2024/main-bot/.gitignore | 172 ------ .../main-bot/.wpilib/wpilib_preferences.json | 6 - .../gradle/wrapper/gradle-wrapper.jar | Bin 63721 -> 0 bytes 2023-2024/main-bot/networktables.json | 1 - 2023-2024/main-bot/simgui-ds.json | 92 ---- 2023-2024/main-bot/simgui.json | 7 - .../main-bot/src/main/deploy/example.txt | 3 - .../src/main/deploy/robot_settings.json | 42 -- .../src/main/java/frc/CommonData.java | 164 ------ .../main/java/frc/components/IComponent.java | 18 - .../main/java/frc/components/SwerveDrive.java | 132 ----- .../main/java/frc/components/SwerveWheel.java | 76 --- .../frc/components/autonomous/Autonomous.java | 58 -- .../components/autonomous/DriveState1.java | 60 --- .../components/autonomous/package-info.java | 4 - .../java/frc/components/package-info.java | 7 - .../java/frc/controllers/LogitechF310.java | 463 ---------------- .../src/main/java/frc/controllers/PS4.java | 498 ------------------ .../src/main/java/frc/controllers/Xbox.java | 425 --------------- .../java/frc/controllers/package-info.java | 7 - .../src/main/java/frc/package-info.java | 7 - .../src/main/java/frc/robot/Main.java | 30 -- .../src/main/java/frc/robot/Robot.java | 176 ------- .../src/main/java/frc/robot/Utility.java | 88 ---- .../src/main/java/frc/robot/package-info.java | 7 - .../src/main/java/frc/settings/Settings.java | 77 --- .../frc/settings/SwerveDriveSettings.java | 116 ---- .../frc/settings/SwerveWheelSettings.java | 187 ------- .../main/java/frc/settings/package-info.java | 8 - .../main/java/frc/state_machine/State.java | 37 -- .../java/frc/state_machine/StateMachine.java | 52 -- .../java/frc/state_machine/package-info.java | 7 - 2023-2024/main-bot/vendordeps/NavX.json | 40 -- .../vendordeps/WPILibNewCommands.json | 38 -- Example_Project/.gitignore | 172 ------ .../.wpilib/wpilib_preferences.json | 6 - Example_Project/WPILib-License.md | 26 - Example_Project/build.gradle | 101 ---- .../gradle/wrapper/gradle-wrapper.jar | Bin 60756 -> 0 bytes .../gradle/wrapper/gradle-wrapper.properties | 5 - Example_Project/gradlew | 240 --------- Example_Project/gradlew.bat | 91 ---- Example_Project/settings.gradle | 27 - Example_Project/src/main/deploy/README.md | 14 - .../src/main/deploy/robot_settings.json | 19 - .../src/main/java/frc/CommonData.java | 27 - .../main/java/frc/components/IComponent.java | 14 - .../main/java/frc/components/Pneumatics.java | 53 -- .../components/ShuffleBoardController.java | 20 - .../java/frc/controllers/LogitechAttack3.java | 90 ---- .../java/frc/controllers/LogitechF310.java | 184 ------- .../src/main/java/frc/controllers/README.md | 202 ------- .../main/java/frc/controllers/Xbox360.java | 171 ------ .../src/main/java/frc/robot/Main.java | 25 - .../src/main/java/frc/robot/Robot.java | 127 ----- .../src/main/java/frc/robot/Utility.java | 66 --- .../main/java/frc/settings/NavXSettings.java | 5 - .../java/frc/settings/PneumaticsSettings.java | 13 - .../src/main/java/frc/settings/Settings.java | 14 - .../frc/settings/ShuffleBoardSettings.java | 6 - .../main/java/frc/state_machine/State.java | 19 - .../java/frc/state_machine/StateMachine.java | 45 -- Example_Project/vendordeps/NavX.json | 39 -- .../vendordeps/PhoenixProAnd5.json | 458 ---------------- Example_Project/vendordeps/README.md | 36 -- Example_Project/vendordeps/photonlib.json | 41 -- .../Beginner_Level/Course_Intro.txt | 58 -- .../Beginner_Level/Java/B1DataTypes.java | 36 -- .../Beginner_Level/Java/B2Operators.java | 46 -- .../Java/B3IfElseStatement.java | 37 -- .../Beginner_Level/Java/B4CheckIn.java | 14 - .../Beginner_Level/Java/B5Functions.java | 51 -- .../Beginner_Level/Java/B6Scope.java | 42 -- .../B71ClassesAndObjects.java | 66 --- .../B72BlueprintForHouse.java | 6 - .../B73RevisedBlueprintForHouse.java | 15 - .../B74AnotherRevisedBlueprint.java | 17 - .../Beginner_Level/Java/B8FinalCheckIn.java | 21 - .../Beginner_Level/Python/B1DataTypes.py | 41 -- .../Beginner_Level/Python/B2Operators.py | 39 -- .../Python/B3IfElseStatement.py | 28 - .../Beginner_Level/Python/B4CheckIn.py | 10 - .../Beginner_Level/Python/B5Functions.py | 42 -- .../Beginner_Level/Python/B6Scope.py | 39 -- .../Python/B7ClassesAndObjects.py | 73 --- .../Beginner_Level/Python/B8FinalCheckIn.py | 19 - .../Intermediate_Level/Intermediate_Intro.txt | 13 - .../Java/I0JavaCheatsheet.java | 106 ---- .../Java/I1ConvertingDatatypes.java | 36 -- .../Intermediate_Level/Java/I2Arrays.java | 37 -- .../Intermediate_Level/Java/I3Loops.java | 38 -- .../Intermediate_Level/Java/I4CheckIn.java | 18 - .../Intermediate_Level/Java/I5Enums.java | 27 - .../Python/I1ConvertingDatatypes.py | 27 - .../Intermediate_Level/Python/I2Lists.py | 35 -- .../Robot_Level/Robot_Intro.txt | 1 - .../WPILib-License.md => WPILib-License.md | 18 +- .../main-bot/build.gradle => build.gradle | 10 +- gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 43583 bytes .../wrapper/gradle-wrapper.properties | 2 +- 2023-2024/main-bot/gradlew => gradlew | 7 +- 2023-2024/main-bot/gradlew.bat => gradlew.bat | 22 +- .../settings.gradle => settings.gradle | 2 +- .../src => src}/main/deploy/example.txt | 0 .../src => src}/main/java/frc/robot/Main.java | 0 src/main/java/frc/robot/Robot.java | 62 +++ .../PathplannerLib-2025.0.0-beta-4.json | 38 ++ .../Phoenix5-5.34.0-beta-2.json | 28 +- .../Phoenix6-25.0.0-beta-2.json | 91 ++-- .../REVLib-2025.0.0-beta-2.json | 15 +- vendordeps/Studica-2025.1.1-beta-3.json | 71 +++ .../WPILibNewCommands.json | 1 + 216 files changed, 469 insertions(+), 9610 deletions(-) delete mode 100644 .github/ISSUE_TEMPLATE/bug_report.md delete mode 100644 .github/linters/actionlint.yml delete mode 100644 .github/workflows/superlinter.yml delete mode 100644 .github/workflows/wpilib-build.yml rename {2022-2023/main-bot/.wpilib => .wpilib}/wpilib_preferences.json (75%) mode change 100755 => 100644 delete mode 100755 2022-2023/main-bot/.gradle/7.5.1/checksums/checksums.lock delete mode 100755 2022-2023/main-bot/.gradle/7.5.1/checksums/md5-checksums.bin delete mode 100755 2022-2023/main-bot/.gradle/7.5.1/checksums/sha1-checksums.bin delete mode 100755 2022-2023/main-bot/.gradle/7.5.1/dependencies-accessors/dependencies-accessors.lock delete mode 100755 2022-2023/main-bot/.gradle/7.5.1/dependencies-accessors/gc.properties delete mode 100755 2022-2023/main-bot/.gradle/7.5.1/executionHistory/executionHistory.bin delete mode 100755 2022-2023/main-bot/.gradle/7.5.1/executionHistory/executionHistory.lock delete mode 100755 2022-2023/main-bot/.gradle/7.5.1/fileChanges/last-build.bin delete mode 100755 2022-2023/main-bot/.gradle/7.5.1/fileHashes/fileHashes.bin delete mode 100755 2022-2023/main-bot/.gradle/7.5.1/fileHashes/fileHashes.lock delete mode 100755 2022-2023/main-bot/.gradle/7.5.1/fileHashes/resourceHashesCache.bin delete mode 100755 2022-2023/main-bot/.gradle/7.5.1/gc.properties delete mode 100755 2022-2023/main-bot/.gradle/buildOutputCleanup/buildOutputCleanup.lock delete mode 100755 2022-2023/main-bot/.gradle/buildOutputCleanup/cache.properties delete mode 100755 2022-2023/main-bot/.gradle/buildOutputCleanup/outputFiles.bin delete mode 100755 2022-2023/main-bot/.gradle/file-system.probe delete mode 100755 2022-2023/main-bot/.gradle/vcs-1/gc.properties delete mode 100755 2022-2023/main-bot/WPILib-License.md delete mode 100755 2022-2023/main-bot/bin/main/frc/.clang-format delete mode 100644 2022-2023/main-bot/bin/main/frc/CommonData.class delete mode 100644 2022-2023/main-bot/bin/main/frc/components/Arm$Position.class delete mode 100644 2022-2023/main-bot/bin/main/frc/components/Arm.class delete mode 100644 2022-2023/main-bot/bin/main/frc/components/Claw$State.class delete mode 100644 2022-2023/main-bot/bin/main/frc/components/Claw.class delete mode 100644 2022-2023/main-bot/bin/main/frc/components/IComponent.class delete mode 100755 2022-2023/main-bot/bin/main/frc/components/README.md delete mode 100644 2022-2023/main-bot/bin/main/frc/components/SwerveDrive.class delete mode 100644 2022-2023/main-bot/bin/main/frc/components/SwerveWheel.class delete mode 100644 2022-2023/main-bot/bin/main/frc/components/autonomous/ArmState1.class delete mode 100644 2022-2023/main-bot/bin/main/frc/components/autonomous/ArmState2.class delete mode 100644 2022-2023/main-bot/bin/main/frc/components/autonomous/ArmState3.class delete mode 100644 2022-2023/main-bot/bin/main/frc/components/autonomous/Autonomous.class delete mode 100644 2022-2023/main-bot/bin/main/frc/components/autonomous/DriveState1.class delete mode 100644 2022-2023/main-bot/bin/main/frc/components/autonomous/DriveState2.class delete mode 100644 2022-2023/main-bot/bin/main/frc/components/autonomous/DriveState3.class delete mode 100644 2022-2023/main-bot/bin/main/frc/components/autonomous/DriveState4.class delete mode 100644 2022-2023/main-bot/bin/main/frc/components/autonomous/DriveState5.class delete mode 100644 2022-2023/main-bot/bin/main/frc/components/autonomous/DriveState6.class delete mode 100644 2022-2023/main-bot/bin/main/frc/controllers/LogitechF310.class delete mode 100644 2022-2023/main-bot/bin/main/frc/controllers/Xbox360$dPad.class delete mode 100644 2022-2023/main-bot/bin/main/frc/controllers/Xbox360.class delete mode 100644 2022-2023/main-bot/bin/main/frc/controllers/XboxOne$dPad.class delete mode 100644 2022-2023/main-bot/bin/main/frc/controllers/XboxOne.class delete mode 100644 2022-2023/main-bot/bin/main/frc/robot/Main.class delete mode 100644 2022-2023/main-bot/bin/main/frc/robot/Robot.class delete mode 100644 2022-2023/main-bot/bin/main/frc/robot/Utility.class delete mode 100644 2022-2023/main-bot/bin/main/frc/settings/ArmSettings.class delete mode 100644 2022-2023/main-bot/bin/main/frc/settings/ClawSettings.class delete mode 100644 2022-2023/main-bot/bin/main/frc/settings/LimitedMotorSettings.class delete mode 100644 2022-2023/main-bot/bin/main/frc/settings/Settings.class delete mode 100644 2022-2023/main-bot/bin/main/frc/settings/SwerveDriveSettings.class delete mode 100644 2022-2023/main-bot/bin/main/frc/settings/SwerveWheelSettings$Location.class delete mode 100644 2022-2023/main-bot/bin/main/frc/settings/SwerveWheelSettings.class delete mode 100644 2022-2023/main-bot/bin/main/frc/settings/WristSettings.class delete mode 100644 2022-2023/main-bot/bin/main/frc/state_machine/State.class delete mode 100644 2022-2023/main-bot/bin/main/frc/state_machine/StateMachine.class delete mode 100755 2022-2023/main-bot/build.gradle delete mode 100755 2022-2023/main-bot/gradle/wrapper/gradle-wrapper.jar delete mode 100755 2022-2023/main-bot/gradle/wrapper/gradle-wrapper.properties delete mode 100755 2022-2023/main-bot/gradlew delete mode 100755 2022-2023/main-bot/gradlew.bat delete mode 100755 2022-2023/main-bot/settings.gradle delete mode 100755 2022-2023/main-bot/src/main/deploy/robot_settings.json delete mode 100755 2022-2023/main-bot/src/main/java/frc/.clang-format delete mode 100755 2022-2023/main-bot/src/main/java/frc/CommonData.java delete mode 100755 2022-2023/main-bot/src/main/java/frc/components/Arm.java delete mode 100755 2022-2023/main-bot/src/main/java/frc/components/Claw.java delete mode 100755 2022-2023/main-bot/src/main/java/frc/components/IComponent.java delete mode 100755 2022-2023/main-bot/src/main/java/frc/components/README.md delete mode 100755 2022-2023/main-bot/src/main/java/frc/components/SwerveDrive.java delete mode 100755 2022-2023/main-bot/src/main/java/frc/components/SwerveWheel.java delete mode 100755 2022-2023/main-bot/src/main/java/frc/components/autonomous/ArmState1.java delete mode 100755 2022-2023/main-bot/src/main/java/frc/components/autonomous/ArmState2.java delete mode 100755 2022-2023/main-bot/src/main/java/frc/components/autonomous/ArmState3.java delete mode 100755 2022-2023/main-bot/src/main/java/frc/components/autonomous/Autonomous.java delete mode 100755 2022-2023/main-bot/src/main/java/frc/components/autonomous/DriveState1.java delete mode 100755 2022-2023/main-bot/src/main/java/frc/components/autonomous/DriveState2.java delete mode 100755 2022-2023/main-bot/src/main/java/frc/components/autonomous/DriveState3.java delete mode 100755 2022-2023/main-bot/src/main/java/frc/components/autonomous/DriveState4.java delete mode 100755 2022-2023/main-bot/src/main/java/frc/components/autonomous/DriveState5.java delete mode 100755 2022-2023/main-bot/src/main/java/frc/components/autonomous/DriveState6.java delete mode 100755 2022-2023/main-bot/src/main/java/frc/controllers/LogitechF310.java delete mode 100755 2022-2023/main-bot/src/main/java/frc/controllers/Xbox360.java delete mode 100644 2022-2023/main-bot/src/main/java/frc/controllers/XboxOne.java delete mode 100755 2022-2023/main-bot/src/main/java/frc/robot/Robot.java delete mode 100755 2022-2023/main-bot/src/main/java/frc/robot/Utility.java delete mode 100755 2022-2023/main-bot/src/main/java/frc/settings/ArmSettings.java delete mode 100755 2022-2023/main-bot/src/main/java/frc/settings/ClawSettings.java delete mode 100755 2022-2023/main-bot/src/main/java/frc/settings/LimitedMotorSettings.java delete mode 100755 2022-2023/main-bot/src/main/java/frc/settings/Settings.java delete mode 100755 2022-2023/main-bot/src/main/java/frc/settings/SwerveDriveSettings.java delete mode 100755 2022-2023/main-bot/src/main/java/frc/settings/SwerveWheelSettings.java delete mode 100755 2022-2023/main-bot/src/main/java/frc/settings/WristSettings.java delete mode 100755 2022-2023/main-bot/src/main/java/frc/state_machine/State.java delete mode 100755 2022-2023/main-bot/src/main/java/frc/state_machine/StateMachine.java delete mode 100755 2022-2023/main-bot/vendordeps/NavX.json delete mode 100755 2022-2023/main-bot/vendordeps/PhoenixProAnd5.json delete mode 100755 2022-2023/main-bot/vendordeps/WPILibNewCommands.json delete mode 100644 2023-2024/main-bot/.gitignore delete mode 100644 2023-2024/main-bot/.wpilib/wpilib_preferences.json delete mode 100644 2023-2024/main-bot/gradle/wrapper/gradle-wrapper.jar delete mode 100644 2023-2024/main-bot/networktables.json delete mode 100644 2023-2024/main-bot/simgui-ds.json delete mode 100644 2023-2024/main-bot/simgui.json delete mode 100644 2023-2024/main-bot/src/main/deploy/example.txt delete mode 100755 2023-2024/main-bot/src/main/deploy/robot_settings.json delete mode 100644 2023-2024/main-bot/src/main/java/frc/CommonData.java delete mode 100755 2023-2024/main-bot/src/main/java/frc/components/IComponent.java delete mode 100755 2023-2024/main-bot/src/main/java/frc/components/SwerveDrive.java delete mode 100755 2023-2024/main-bot/src/main/java/frc/components/SwerveWheel.java delete mode 100755 2023-2024/main-bot/src/main/java/frc/components/autonomous/Autonomous.java delete mode 100644 2023-2024/main-bot/src/main/java/frc/components/autonomous/DriveState1.java delete mode 100644 2023-2024/main-bot/src/main/java/frc/components/autonomous/package-info.java delete mode 100644 2023-2024/main-bot/src/main/java/frc/components/package-info.java delete mode 100755 2023-2024/main-bot/src/main/java/frc/controllers/LogitechF310.java delete mode 100644 2023-2024/main-bot/src/main/java/frc/controllers/PS4.java delete mode 100644 2023-2024/main-bot/src/main/java/frc/controllers/Xbox.java delete mode 100644 2023-2024/main-bot/src/main/java/frc/controllers/package-info.java delete mode 100644 2023-2024/main-bot/src/main/java/frc/package-info.java delete mode 100644 2023-2024/main-bot/src/main/java/frc/robot/Main.java delete mode 100644 2023-2024/main-bot/src/main/java/frc/robot/Robot.java delete mode 100755 2023-2024/main-bot/src/main/java/frc/robot/Utility.java delete mode 100644 2023-2024/main-bot/src/main/java/frc/robot/package-info.java delete mode 100755 2023-2024/main-bot/src/main/java/frc/settings/Settings.java delete mode 100755 2023-2024/main-bot/src/main/java/frc/settings/SwerveDriveSettings.java delete mode 100755 2023-2024/main-bot/src/main/java/frc/settings/SwerveWheelSettings.java delete mode 100644 2023-2024/main-bot/src/main/java/frc/settings/package-info.java delete mode 100755 2023-2024/main-bot/src/main/java/frc/state_machine/State.java delete mode 100755 2023-2024/main-bot/src/main/java/frc/state_machine/StateMachine.java delete mode 100644 2023-2024/main-bot/src/main/java/frc/state_machine/package-info.java delete mode 100644 2023-2024/main-bot/vendordeps/NavX.json delete mode 100644 2023-2024/main-bot/vendordeps/WPILibNewCommands.json delete mode 100644 Example_Project/.gitignore delete mode 100644 Example_Project/.wpilib/wpilib_preferences.json delete mode 100644 Example_Project/WPILib-License.md delete mode 100644 Example_Project/build.gradle delete mode 100644 Example_Project/gradle/wrapper/gradle-wrapper.jar delete mode 100644 Example_Project/gradle/wrapper/gradle-wrapper.properties delete mode 100755 Example_Project/gradlew delete mode 100644 Example_Project/gradlew.bat delete mode 100644 Example_Project/settings.gradle delete mode 100644 Example_Project/src/main/deploy/README.md delete mode 100755 Example_Project/src/main/deploy/robot_settings.json delete mode 100644 Example_Project/src/main/java/frc/CommonData.java delete mode 100644 Example_Project/src/main/java/frc/components/IComponent.java delete mode 100644 Example_Project/src/main/java/frc/components/Pneumatics.java delete mode 100644 Example_Project/src/main/java/frc/components/ShuffleBoardController.java delete mode 100755 Example_Project/src/main/java/frc/controllers/LogitechAttack3.java delete mode 100755 Example_Project/src/main/java/frc/controllers/LogitechF310.java delete mode 100644 Example_Project/src/main/java/frc/controllers/README.md delete mode 100755 Example_Project/src/main/java/frc/controllers/Xbox360.java delete mode 100644 Example_Project/src/main/java/frc/robot/Main.java delete mode 100644 Example_Project/src/main/java/frc/robot/Robot.java delete mode 100755 Example_Project/src/main/java/frc/robot/Utility.java delete mode 100644 Example_Project/src/main/java/frc/settings/NavXSettings.java delete mode 100644 Example_Project/src/main/java/frc/settings/PneumaticsSettings.java delete mode 100644 Example_Project/src/main/java/frc/settings/Settings.java delete mode 100644 Example_Project/src/main/java/frc/settings/ShuffleBoardSettings.java delete mode 100755 Example_Project/src/main/java/frc/state_machine/State.java delete mode 100755 Example_Project/src/main/java/frc/state_machine/StateMachine.java delete mode 100644 Example_Project/vendordeps/NavX.json delete mode 100644 Example_Project/vendordeps/PhoenixProAnd5.json delete mode 100644 Example_Project/vendordeps/README.md delete mode 100644 Example_Project/vendordeps/photonlib.json delete mode 100644 Learning_Materials/Beginner_Level/Course_Intro.txt delete mode 100644 Learning_Materials/Beginner_Level/Java/B1DataTypes.java delete mode 100644 Learning_Materials/Beginner_Level/Java/B2Operators.java delete mode 100644 Learning_Materials/Beginner_Level/Java/B3IfElseStatement.java delete mode 100644 Learning_Materials/Beginner_Level/Java/B4CheckIn.java delete mode 100644 Learning_Materials/Beginner_Level/Java/B5Functions.java delete mode 100644 Learning_Materials/Beginner_Level/Java/B6Scope.java delete mode 100644 Learning_Materials/Beginner_Level/Java/B7ClassesAndObjects/B71ClassesAndObjects.java delete mode 100644 Learning_Materials/Beginner_Level/Java/B7ClassesAndObjects/B72BlueprintForHouse.java delete mode 100644 Learning_Materials/Beginner_Level/Java/B7ClassesAndObjects/B73RevisedBlueprintForHouse.java delete mode 100644 Learning_Materials/Beginner_Level/Java/B7ClassesAndObjects/B74AnotherRevisedBlueprint.java delete mode 100644 Learning_Materials/Beginner_Level/Java/B8FinalCheckIn.java delete mode 100644 Learning_Materials/Beginner_Level/Python/B1DataTypes.py delete mode 100644 Learning_Materials/Beginner_Level/Python/B2Operators.py delete mode 100644 Learning_Materials/Beginner_Level/Python/B3IfElseStatement.py delete mode 100644 Learning_Materials/Beginner_Level/Python/B4CheckIn.py delete mode 100644 Learning_Materials/Beginner_Level/Python/B5Functions.py delete mode 100644 Learning_Materials/Beginner_Level/Python/B6Scope.py delete mode 100644 Learning_Materials/Beginner_Level/Python/B7ClassesAndObjects.py delete mode 100644 Learning_Materials/Beginner_Level/Python/B8FinalCheckIn.py delete mode 100644 Learning_Materials/Intermediate_Level/Intermediate_Intro.txt delete mode 100644 Learning_Materials/Intermediate_Level/Java/I0JavaCheatsheet.java delete mode 100644 Learning_Materials/Intermediate_Level/Java/I1ConvertingDatatypes.java delete mode 100644 Learning_Materials/Intermediate_Level/Java/I2Arrays.java delete mode 100644 Learning_Materials/Intermediate_Level/Java/I3Loops.java delete mode 100644 Learning_Materials/Intermediate_Level/Java/I4CheckIn.java delete mode 100644 Learning_Materials/Intermediate_Level/Java/I5Enums.java delete mode 100644 Learning_Materials/Intermediate_Level/Python/I1ConvertingDatatypes.py delete mode 100644 Learning_Materials/Intermediate_Level/Python/I2Lists.py delete mode 100644 Learning_Materials/Robot_Level/Robot_Intro.txt rename 2023-2024/main-bot/WPILib-License.md => WPILib-License.md (59%) rename 2023-2024/main-bot/build.gradle => build.gradle (88%) create mode 100644 gradle/wrapper/gradle-wrapper.jar rename {2023-2024/main-bot/gradle => gradle}/wrapper/gradle-wrapper.properties (91%) rename 2023-2024/main-bot/gradlew => gradlew (96%) rename 2023-2024/main-bot/gradlew.bat => gradlew.bat (88%) rename 2023-2024/main-bot/settings.gradle => settings.gradle (93%) rename {2022-2023/main-bot/src => src}/main/deploy/example.txt (100%) mode change 100755 => 100644 rename {2022-2023/main-bot/src => src}/main/java/frc/robot/Main.java (100%) mode change 100755 => 100644 create mode 100644 src/main/java/frc/robot/Robot.java create mode 100644 vendordeps/PathplannerLib-2025.0.0-beta-4.json rename 2023-2024/main-bot/vendordeps/Phoenix5.json => vendordeps/Phoenix5-5.34.0-beta-2.json (88%) rename 2023-2024/main-bot/vendordeps/Phoenix6.json => vendordeps/Phoenix6-25.0.0-beta-2.json (85%) rename Example_Project/vendordeps/REVLib.json => vendordeps/REVLib-2025.0.0-beta-2.json (87%) create mode 100644 vendordeps/Studica-2025.1.1-beta-3.json rename {Example_Project/vendordeps => vendordeps}/WPILibNewCommands.json (97%) diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md deleted file mode 100644 index 28a230a..0000000 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ /dev/null @@ -1,38 +0,0 @@ ---- -name: Bug report -about: Create a bug report for something -title: "[Bug]: Describe the bug here" -labels: bug -assignees: '' - ---- - -**Describe the bug** -Describe what the issue is and any steps you may have tried to fix it (Like making sure you are using the right version, etc.) - -Please make sure to include the application that is failing or not working correctly like if it's a problem in Driver Station or if it's an issue with the code itself not doing what you would expect or not building (If using Java / C++. This would also be included in the Versions sections) - -**Steps To Reproduce** -Steps to reproduce the behavior: -1. Go to '...' -2. Click on '...' -3. Scroll down to '...' -4. See error - -**Expected Behavior** -What should have happened? - -**Screenshots or Videos** -If applicable, add screenshots and / or videos to help explain your problem - -**Versions (if applicable):** -> If using Python, please list off what version of robotpy you are using along with the version of Python - -- OS: [e.g. Arch Linux] -- Version [e.g. 6.4.12] -- Architecture [e.g x86_64] -- Java, C++ or Python Version [e.g. Python 3.11, Java 20.0.2] -- WPILib Version [e.g. 2023.4.3] - -**Additional context** -Add any other context about the problem down here. diff --git a/.github/linters/actionlint.yml b/.github/linters/actionlint.yml deleted file mode 100644 index fab3ac3..0000000 --- a/.github/linters/actionlint.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -self-hosted-runner: - labels: - - Primary - - Backup \ No newline at end of file diff --git a/.github/workflows/superlinter.yml b/.github/workflows/superlinter.yml deleted file mode 100644 index a20e4e9..0000000 --- a/.github/workflows/superlinter.yml +++ /dev/null @@ -1,29 +0,0 @@ ---- -name: Super-Linter - -on: push - -jobs: - super-lint: - name: Super-Linter - runs-on: - - self-hosted - - Primary - steps: - - name: Checkout code - uses: actions/checkout@v4 - - - name: Run Super-Linter - uses: github/super-linter@v5 - env: - # Testing multiple folders and files - # Files to ignore: - # - gradlew - # - .gradle - # - WPILib-License.md - # Folders to ignore: - # - 2022-2023 - # - vendordeps - FILTER_REGEX_EXCLUDE: ".*2022-2023/.*|.*vendordeps/.*|.*gradlew|.*.gradle|.*WPILib-License.md.*" - DEFAULT_BRANCH: main - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/wpilib-build.yml b/.github/workflows/wpilib-build.yml deleted file mode 100644 index c866985..0000000 --- a/.github/workflows/wpilib-build.yml +++ /dev/null @@ -1,36 +0,0 @@ ---- -name: Build - -on: push - -jobs: - Build-Latest: - runs-on: - - self-hosted - - Primary - steps: - # Check out the code so the action can use it - - name: Checkout code - uses: actions/checkout@v4 - - - name: Build 2023-2024 - # Set the working directory so gradlew and WPILib are in the right folder - working-directory: ./2023-2024/main-bot - # Run gradlew to build the robot code with java home being what it is set to during manual runtime - # This machine should have Java 17 installed which is what WPILib is using for building with 2024 - run: ./gradlew build - Build-2022-2023: - runs-on: - - self-hosted - - Primary - steps: - # Check out the code so the action can use it - - name: Checkout code - uses: actions/checkout@v4 - - - name: Build 2022-2023 - working-directory: ./2022-2023/main-bot - run: ./gradlew build - - -# I have no idea if this will work but this is just to test to see if it's possible and to get used to using actions diff --git a/.gitignore b/.gitignore index 4835bef..ceb43c0 100644 --- a/.gitignore +++ b/.gitignore @@ -1,156 +1,195 @@ -# .gitignore -# Ingore File For Git - -# -----=====[ IDEs ]=====----- # - -# VSCode -.vscode/ - -# Sublime Text -.sublime-workspace -.sublime-project - -# PyCharm -.idea/ -*.iml -*.ipr -*.iws - -# -----=====[ Python ]=====----- # - -# Byte-compiled / optimized / DLL files -__pycache__/ -*.py[cod] -*$py.class - -# C extensions -*.so - -# Distribution / packaging -.Python -build/ -develop-eggs/ -dist/ -downloads/ -eggs/ -.eggs/ -lib/ -lib64/ -parts/ -sdist/ -var/ -wheels/ -pip-wheel-metadata/ -share/python-wheels/ -*.egg-info/ -.installed.cfg -*.egg -MANIFEST - -# PyInstaller -# Usually these files are written by a python script from a template -# before PyInstaller builds the exe, so as to inject date/other infos into it. -*.manifest -*.spec - -# Installer logs -pip-log.txt -pip-delete-this-directory.txt - -# Unit test / coverage reports -htmlcov/ -.tox/ -.nox/ -.coverage -.coverage.* -.cache -nosetests.xml -coverage.xml -*.cover -*.py,cover -.hypothesis/ -.pytest_cache/ - -# Translations -*.mo -*.pot - -# Django stuff: -*.log -local_settings.py -db.sqlite3 -db.sqlite3-journal - -# Flask stuff: -instance/ -.webassets-cache - -# Scrapy stuff: -.scrapy - -# Sphinx documentation -docs/_build/ - -# PyBuilder -target/ - -# Jupyter Notebook -.ipynb_checkpoints - -# IPython -profile_default/ -ipython_config.py - -# pyenv -.python-version - -# pipenv -# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. -# However, in case of collaboration, if having platform-specific dependencies or dependencies -# having no cross-platform support, pipenv may install dependencies that don't work, or not -# install all needed dependencies. -#Pipfile.lock - -# PEP 582; used by e.g. github.com/David-OConnor/pyflow -__pypackages__/ - -# Celery stuff -celerybeat-schedule -celerybeat.pid - -# SageMath parsed files -*.sage.py - -# Environments -.env -.venv -env/ -venv/ -ENV/ -env.bak/ -venv.bak/ - -# Spyder project settings -.spyderproject -.spyproject - -# Rope project settings -.ropeproject - -# mkdocs documentation -/site - -# mypy -.mypy_cache/ -.dmypy.json -dmypy.json - -# Pyre type checker -.pyre/ - -# -----=====[ Misc ]=====----- # - -# MacOS Finder Cache -# >:( -*.DS_Store - +# 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 + +# # VSCode Specific Java Settings +# DO NOT REMOVE .classpath and .project +.classpath +.project +.settings/ +bin/ + +# IntelliJ +*.iml +*.ipr +*.iws +.idea/ +out/ + +# Fleet +.fleet + +# Simulation GUI and other tools window save file +networktables.json +simgui.json +*-window.json + +# Simulation data log directory +logs/ + +# Folder that has CTRE Phoenix Sim device config storage +ctre_sim/ + +# clangd +/.cache +compile_commands.json + +# VSCode settings +.vscode/ + +# MacOS specific files +.DS_Store + +# Windows specific files +Thumbs.db +Desktop.ini +System Volume Information/ \ No newline at end of file diff --git a/2022-2023/main-bot/.wpilib/wpilib_preferences.json b/.wpilib/wpilib_preferences.json old mode 100755 new mode 100644 similarity index 75% rename from 2022-2023/main-bot/.wpilib/wpilib_preferences.json rename to .wpilib/wpilib_preferences.json index 4062463..f28fe25 --- a/2022-2023/main-bot/.wpilib/wpilib_preferences.json +++ b/.wpilib/wpilib_preferences.json @@ -1,6 +1,6 @@ { "enableCppIntellisense": false, "currentLanguage": "java", - "projectYear": "2023", + "projectYear": "2025beta", "teamNumber": 5098 } \ No newline at end of file diff --git a/2022-2023/main-bot/.gradle/7.5.1/checksums/checksums.lock b/2022-2023/main-bot/.gradle/7.5.1/checksums/checksums.lock deleted file mode 100755 index 5a04837df2d0b14ec6efcbbc695e4d1019bb6288..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17 VcmZRsSIN6^bXo6A1~6bt1OPVr1myq# diff --git a/2022-2023/main-bot/.gradle/7.5.1/checksums/md5-checksums.bin b/2022-2023/main-bot/.gradle/7.5.1/checksums/md5-checksums.bin deleted file mode 100755 index c8ee3ba224ee25e5ba1f072a12a14e02b07ec53a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35247 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 diff --git a/2022-2023/main-bot/.gradle/7.5.1/checksums/sha1-checksums.bin b/2022-2023/main-bot/.gradle/7.5.1/checksums/sha1-checksums.bin deleted file mode 100755 index 2d75895c4fb3bef19f9409189f814825d0627f19..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 77513 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 wc&uF`7=?WNm8>i_@% diff --git a/2022-2023/main-bot/.gradle/7.5.1/dependencies-accessors/dependencies-accessors.lock b/2022-2023/main-bot/.gradle/7.5.1/dependencies-accessors/dependencies-accessors.lock deleted file mode 100755 index 4e31113a415abeeafe4fc7cf00412199b2f1cff9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17 TcmZRM_&Hf+4QKEh1}FdkGByMN diff --git a/2022-2023/main-bot/.gradle/7.5.1/dependencies-accessors/gc.properties b/2022-2023/main-bot/.gradle/7.5.1/dependencies-accessors/gc.properties deleted file mode 100755 index e69de29..0000000 diff --git a/2022-2023/main-bot/.gradle/7.5.1/executionHistory/executionHistory.bin b/2022-2023/main-bot/.gradle/7.5.1/executionHistory/executionHistory.bin deleted file mode 100755 index b53bfdce313ecfc5e0cccc6b042577acb2337de8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 178787 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 O>{wM9q$NC9cI>}7BmIT| diff --git a/2022-2023/main-bot/.gradle/7.5.1/fileHashes/fileHashes.lock b/2022-2023/main-bot/.gradle/7.5.1/fileHashes/fileHashes.lock deleted file mode 100755 index a69daf062cca93fc881f2ab4e8d93ddf2883e3a3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17 UcmZR!lY3{{RO=?e00v@d03|pBTmS$7 diff --git a/2022-2023/main-bot/.gradle/7.5.1/fileHashes/resourceHashesCache.bin b/2022-2023/main-bot/.gradle/7.5.1/fileHashes/resourceHashesCache.bin deleted file mode 100755 index 7df2b9817eeec5b19f6fb6c2cd69be618d302035..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34545 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 z zM851hE(sgz+`{@Es_V!YWh)XVHpH=rSr>Vr*7Rq@}a!PZlc$4!Q6-NkRlTHE34M~#QlK2Y2x?^gmkL6{~ zH(AJ5PU`D6R2SneysS2Cx$=Xx9BHIs7DRIPQgvy%I*#M*X`~~K1EQ_s=`x$A7Q|CY znM}TKkVb!tNkEMN?>=Tx&B+I@r6|>St_MMUOPf$)#F*FvDwW1TWQ=^#@Hc7Q8=ND3(?zX;*?H^b)f8&RLx`DFx_1}HA@0r5B z;;}0;UFYMDQcGby=wEj{xHx4*9edWQaS!FB)w|uLot#C75iR-h-U*#R6=Y8-96jjE z#?Oed5e`l@Bp#vcl{s^@PUi`PrCMMA-j{j*G!GfWB2hSI=7A7K>P(-vkhBpu(s(>0 zS9Ic%xL@C{j;i8>ILary1P%++E7m`;M|XeQUhvEmLdLKU3Jw^&?R>w}6@&PNiG&H# zAb%k)|NU@6qk^(IehK5;Z=`Y1ymPd#zxwRX1`h_;+yEZZI2#oIsnwoUVbEmL$<@0N zWfyxB;%Ic&O5nuZ(9zq@QNDMOF>q(8*H1Y(Ug4saS-Hz2B8@b798Tv~=6{UaD({-~ zGyaNFOU36hB(GaLa#YY5FJ~ww`XOU9KDfSNYc%yldJmg>CQKA1e^66a?eO8sTzz29 zFIbWhic&c$reU!Wu)N>X%9xO1I&xM=2mMTZmRRL*?NQ}%$J(G|! z5S>4>Qu7lff2c zkO*;o801epwKk3Hhi;8D8J)^R|I^5KnqNu`%#g+hmg^Z?BOLEbUSURMb~m8h2>9P* zF{Q>C_1@ZiYj!?Z6eXX&e8Y&*EPRnM@G=uWDH6%_juyyrM?!!scc3CK`ErswRVegCG1kfiH=zenRs24 zo0{IzjM?i+>4dU&ydQKg(xTj;{gNx@5yPb(yGfW|cJ^f#%CmT2&PNK*NPIl;xjdkb zZ4TvGzUKRP4?RdP&gUUsRX=h^*O Ts0eXgVNo|BY(u~QnT7uc>KTSB diff --git a/2022-2023/main-bot/.gradle/7.5.1/gc.properties b/2022-2023/main-bot/.gradle/7.5.1/gc.properties deleted file mode 100755 index e69de29..0000000 diff --git a/2022-2023/main-bot/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/2022-2023/main-bot/.gradle/buildOutputCleanup/buildOutputCleanup.lock deleted file mode 100755 index f4c0a0821f4a9f981c266d0df7ba08bad5e072a0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17 VcmZRcvAKaqV~(XR0~qjZ0stur1H%9S diff --git a/2022-2023/main-bot/.gradle/buildOutputCleanup/cache.properties b/2022-2023/main-bot/.gradle/buildOutputCleanup/cache.properties deleted file mode 100755 index 7fdc208..0000000 --- a/2022-2023/main-bot/.gradle/buildOutputCleanup/cache.properties +++ /dev/null @@ -1,2 +0,0 @@ -#Thu Jan 26 17:19:17 CST 2023 -gradle.version=7.5.1 diff --git a/2022-2023/main-bot/.gradle/buildOutputCleanup/outputFiles.bin b/2022-2023/main-bot/.gradle/buildOutputCleanup/outputFiles.bin deleted file mode 100755 index eae504c0365fdf92460e0c0a670dea8fce07db38..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24131 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 SKkDxrt9O+ZfTcXcbmOEtA81Z zCi?ClWt=@$`=UuRpPiZ8`EFcK#(7PmY=g`s}IKk;V9 zRj+vxUx>sqRFjO4I+k0(u-c_Qe}+lfKBEHqT^iO6|G4uZt`d=2VY_ zVF*PQ>ydZi7aayy(M6uFju(M#tKoO429w(s`$|j3G#Lp{&zo z#|+cYrIPjq!{pBH8AIhzry|58Zq=}c8v$-JY>zwnUggDbsErlr$xzV0ky;&nPQ=h1 zX0XZdwA+_?L_Z!CR%X(EiKy#2`6`VPu9UV>EF!6L%axVXk2J&v?mD?GhLxT6Sgm7? zRJ{ZDu7$Q#;%zaAh3WFx^`+6))Y3C_@?7Kr9x<%_cRvC&8J7N$W|%4$2%DgO(tg%a#T2ILR7HT9l2y;pa~8ES zKIb{_x#074&qdFM=aT2L=Zfbw&sAKfx(pL;j>L8HTJ$PLoZq{|&2QNF(1*JVhxSN#rWm~6+~ ztjHEj7{v&GI#E@9X z)ftk@ev4~JDT6qsDwH&+2py*}!=Mz0LD_}cQB$laaJ=0@b!8=2A0_WI zI#N(HsLJ43C{jQvk9>V!D8f9iLltICDgC(pxj>cD&)I=cg!zIFO_)cO!7tyG1gez2 z+!IooU(-pDIjszSFW(oaQu<9B2t`C+(TT7kw1SRtoMbpzb3DG@>+JAg%ieLRy_uTd zwB5QLIN~kAG!l466j@@J`nTE+DtlMQ7<7?+MaK!~)VFBQp=q4z20Y}E6`#=f0akfF zBjuj$_BeT;UC13jpfqk^O+}4iBG%^pFyb8@>)4pXbZf5)7b?hdc0D`l1qA0~nM7FeSXN7vRj+y;4q;?Ic4CyfdvVf61u1uc*Q_oLW>f5 zT{ZBAflCs)tUaOpi9TknMzW7{RwLDiX*HBS7OjTb$7SmQu6{>EMo^^xIVuiBTP3QK zMD{$9y+T?I20o?2-j<%in@)aM%57?ph{~83W*=e6%soWe%%&b<`6zFO$_J*XK`&62 zEM=aSxz5VwW>Ar>qa3(KUl$F};5un3y4zJ$hhMrxZ(*D2<7(qZ!hG5&it^SHGmr7! z#c#=SP=!MNVi1RHM`>Tbi#$C-PP`XyWj3U`}>#Q0NlhE2F3(tzKVUv zSG_$I$w(*8YTPrB6PSABJ@%Z?i*}r?&Lin-19^ej|9IDH!$^UX$*$^$T^VmEtzv&#_91NUqw1rq2qgz)AB+Utv^^6FlE?LUuU8Dw}U9qw*@Yg8;qDp zt%GPMt*)8L%ayi3uBN)u#5hh_FmYO7yj*D;m=>t~Z}0+Mz>5ZKfpgEpvTz1x1x_F7 zuwGWdC_rd+SI3lMn8f`Lg+e9^+o9BPf)tGnz{vQWSz_5&=7<6-fD8$RSOHaN<-a| zx+z1NvFtWwl&E-HC4ml9l=4aCF5;R2N8l6_L?iF1$n~^m;dNX;H2BqMhZ_)S#0?8? z@ZZ5;(_ftEriHiIY; zq=pCPwBMmE-{0$cnyy6PfrT<(iP=>B*q7@8k86@nevz-8wzM8aGOmSQlE}osX99D~ z`q6#6JnH(yrcCsPE&f36W0YWn=kgymNOSH5= zqmnLCmmnAu71(r3C0wNqU&JjqaB(dyuSmTUa8_Q4zAap*vKDa`_eo-A+W!{1M4BM~ uiRuA98UdMUk4x11jWnq>aLSU7;~|BN;bVM4U!L=)^lYxo;&ak-tp5YOt7gss diff --git a/2022-2023/main-bot/bin/main/frc/components/Claw$State.class b/2022-2023/main-bot/bin/main/frc/components/Claw$State.class deleted file mode 100644 index b9b889a2cdf2e31c7c9d4c3368f1f1960484cd5b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1075 zcmaJOiH^nv!OBT8JJic?jbHDTZ&-V)eZ}3vV97E>NH7bTP7&`GZPxOkV+x^O}JsL1Xj@v_SGvt~#0;>$laout}e!wul+uGkNblx`icQuCm zr3~?&eG;Q7*4SL-DsP`<+kZL-HZgq6m6n5ZDK*ADH@IRX#bv@Co z5vR*)u{3Ll1Rmg#f`<&r5V^7E^MQ)TC@{oz*VV^{GaNIN!y~kNN8IqMjnGv8Tr?Iv zYCxfV$WRHxrjwUuysQ|dsNxAq46njiQrq*Yp@vt*uE`7CNz#Poj9i1iGsSbo#hPr2 z9J*^}-`4$+Oa6^eDS@laAhk_J)rM_zH(}K2 z?Xk3z5mEzmlFC3bD>SBvOlJb~l&6x_AzOT#Kft=F1?dcnr$`0H9XT+TBR?r5O_0*M z@&wD;DOSD_Vh$PlF9zMRSU?V0@??XEh|*F{du&mT;G~q-@@L3hgQJvyDM$_O3i5(1 z5xs}iDf~4JBH-x>R=OXg@w2>xhCAGe^HuQxCkdzRRV34BXW;1OUHoG~y8#sRO z_;Y%WpK4m$9`*F2AN*13olPo73?5C+?#weY&pdbTy*t1C{?khUS7B<12#nqL%$(^q znyw?Az|R$I<4{9XAh~B87&+T;9^}?)d(sRv^b1TJTV5=@N)<>nc74~Dj%(EgW=gW& z${jYX+8{HQTu4>6ikpSy-Oc$srNtEYPaVNYDLAQ0U<6Vi zvQrf3pR*h*xG6B1E-5U&3egGfERq0GjN=T>X*es8?OkyFSlZ?{O{wEe zObWy{7OU&a0+&vpu~%wdL7vv}mclgTHl;&i)?F_s*44~;9jS1}v|azNnFK~KqX@bn za3x**Kjn(WOf?RHj1CP00;furBg?HuO?sOKMJ6#N*EH;^;aMu~4n~8AmM?HRlN&&i;$SbV93Hr!Nvja79NP?^E)0W{0$Yh^rbt5*Stnp+Ot2vtR^ zAa2rAT}yQ;90SquTRwq2ZfKbMr|FMOspBSY323fYw;aO`Jw^cYC}_BIqV9kH22xeS zZc+CIEb{dGORjflcr?&S()Y?H*b#i9V;THJ`pBR_E`5TQJ@b{4^H|YQ>Y&(=2h#H? z;SiZJ_g9T(sGgF0O_7~Y?0l+Y0~IQ9piV$dC&_;=S-XtJne&;Bs!~DQFVKdP&dlR; z9ouRww!cQxYS-uV&fAGjofEZ@W20C*Qs%wiHbTx2xf*#eh1u6|RT%dvpK zWhA?WzU3Ohxoa=*UK<}g!}Zzk)moLI#ubQhKIgMfk#6JmGb}yAP$#&{Kq2T05sdR# zz;#Sxj`0odaEq7ze27FHi#57PR@slCZ(5Hh2h?}eh4Nj<0dTpE^7gNYKHhqP^_RaS zR!V`!sYxv?1 pj6twfuX|WgFD8A-1rdCOUACj_&C}&y-=3gl1Prz{jz`(g{|Tv_sh|J= diff --git a/2022-2023/main-bot/bin/main/frc/components/IComponent.class b/2022-2023/main-bot/bin/main/frc/components/IComponent.class deleted file mode 100644 index ef13c9fb1ffaadf8efa09c7d74f42cdb47451bca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 139 zcmX^0Z`VEs1_pBmPId++Mh3~WqGbK#{M>^4ywtpsVtr3%7@M7eg^@uZE3qt5KPNFS zUEe<`D>b=8;_fE*<0d2EZ?m1_l zbN1PLe|vxD%)9@)`Zj=j@D~jw0=M=!=|tM@>$fdwd2S*#B%MLo;FyC_L#e>x5-kM9?J_XDy(g@J;O6?E4(-U@7Pm+U-mbF=&&)=($nKgk1Ac?s>4|+^RB?^qsbZP z2Uh#@H3IYVvd3$2+RWZ8H!tY1ogu@?v^aG}Iww$SWF4g>Nv{(*W56);Mz@==jKN0} zN^NaZTZ&3zIn$DTv?|TT+mkXgkQnMW6FsKmdI`$2iKzv}Q9F2j8#+a5W*@QE3jH1R2lDxLf}I>79pbHHi4BlF+7TO*q~v( zz?$h6)AqdCeLRtB-M_xoc03&$aR<-KH6LjeSUbbNnX7AJSc|wasY+m7<$J9TOx~=c z4CNZO-YCm_yrQ@h)f(=i5i0sOi;#}Hu}vV-m<;e1xP7ju`f9I7HHIzNp)9}WMkq{Q zuWY{)J9X>|&T0$JQo`Lj?(>Cp1p}1uejR%Q;q{dQbvhPfi3aBW-P3V+Uzww!Q6N6Y z#$IXnNzWNhv^$37=KY$f&L|g~bnM3gmP)Vm0*hO1ChnHX_zbXo1LoF4lu?Kb-3I9@O`3_H8*4une>#dTd_==hfrTo=NL78d)nIsrj)xFor8{=F z?X{X-Ivc~oFf<(F(kb3+X0hw&Mw-<~reM)jHpCmkd)Jdj`KPM0SH~@gsDn%$$Cc8k zue8n1=hb{($5KR=a<1CRHsA%3xZctFob?;r-e$r?EFW+OLr>=y)1m6e#oTpw^o0 z%s^hIc!{Y17&8fSX3x`NxzJxDpc!p(q^RUg@s^eLeo@K7Ootvd6 z9k*3FDVesdO!)pco_6`?$*<9VEBUazxsnmlj=>r69`{A*KG9r?4;o=i({Za zLr7JFYkv-CKrP_2!M+eTw$RXpZw_3@r=y+3ss25%~ zejwDuH61_j$;UM_K`kih+d6)zr1K{uKj4rfVkvvTNy|o4fwDM&&!^I@ihC%kvu)4y z9HXCElC?9m@Td5>hMx(npJFG|8nkmV5s*|sXN^YMvmKI>jb8}7P)tRI)q%n$!^-5P zyFO{#xq<$g*^E^rnYOWgxL?k({Akho;Hg?u%%cSr^+rCQGCf(dD2$&(@Gij-jO2dH zl1_b|93x!~zvT;edR-Mgh{*ry0j1#&d{E4a#9Y2<_!Hk_H($zR3j%@Lh;@kn^AO=p ztntfa;>}Tl7{_|icmbt+6!Hu8-0)joGk(kK$Zz=q^IP7_Y?a;>sNnZjj{e0pC2UVu zUB=3)g=1J#bq#AfM{)aQRE}X&mG&04bcU|+v*{8Nm$5z7Sy~v~>yPFYMm7E@To~<9 zqcPM{TYV>W?CT6wT|#ZBdK?c>gX)(C{duZCFX)F=KkWA}j zGsd~s%W$}gXd_2Fx{snCJ+c+C73rDts%MPTxNv#7f5P zpCibO;^G;^s>U%kg2SV@T*jYyO{2IoAH0t;Ryq-TC>WJ4q2BML1 ze}MVfgd;eBW0aUk!bLML`WBob+UMAwXD+MU4zRmWz-}8WK_MZyFX>|^xVxU%DHL6v zudtg(O>2DYG(G`V`a2>%c9n>1{x4!;{(qq96R1JhN2LJDk_m2Ai1OSJ-r=_dKf;gM es%-fs|9^#FbF`H5b@&Z_x3>bn#~<-$RQw+in|odW diff --git a/2022-2023/main-bot/bin/main/frc/components/SwerveWheel.class b/2022-2023/main-bot/bin/main/frc/components/SwerveWheel.class deleted file mode 100644 index 4544e2cfa34a6cb1c0fcb2ca60721446a55d59fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2750 zcmb7GNpllt5Pf504H9Exz}R3`vlz(^3_Ca`V8x0P1sfA&3}mS=mOjgaM>Aq(WR`4@ z^^(dd*Hq<_dqQELlB!hYn!l0%k;?0lyrQzmLG!KM{kr>o-TM3A-~R+~4&Ui$(agDR^$^dyZMKTyxTLJa_cwkcMQ@x93$|R99}nD=I2E__C5fxq;^g z=1Atsh+Lv@qU;r`j=JgvVpbKa=Dmt-&e(nsnq@1THA~7XtI&U7PWqM`I96zT?#Uu0 z+ly+3`e-`imK>!)%WBx@c!lVSXpJo`re_j`eka1U$9*}yr|)Ds;S&i zdP+k~JV;^#It_GSyM_&^^puWn4e3`7UIII@OGl4}{mrl%*o{4eDOt+VQ7xB57xszm z{RETBrKb|maKJz-;-dGEfx{x9N7>0`<@AUF9dR9L4ZSacT$>zGGGO2}QIe=hVXy5~U$dG!K&@S5#nV9eYf1F+wWe*PzLT` zj`3PfeY1+ZLYR5#LfJqLq>Pz*xeBi;$}2X8qJ}L&)Mi$YnX z`h;Gq{3|k2qEks6fXzUlagIh-#%N?sjz*Shj&VwMU<E-nv7 z%RVksa>|=W7jUef)8h*`DdVXHoZ<0VIX=(d&~sc|K;}0pZovq@2iP%y9>lN<+t|+z zU=L1U9|o}>8LlRA5Lw>ns)4~<80Ctv@HXBdRE?Z|w+{Iyx*(2b2Kt|(_ZcpCV#0fY z_g>(}SSLQp(f-HJP~h&|U`(z&!OV`>GdP_0J%Pt_Kjm?~46i3r*hgqb(2X<>VF1T* z6vHqhSp5V}gG;b7sA8UQy3vn&jBX1h_TWBeG44LV_Bzz7QM7@*br>AZbmHOMGMM&N zINGC}o@8cDQQzsvwn1IgP`9n&Q+!s}ZgP~fR?+?|C$(5hg6039#Iq*cx+MI0L*c%) l!b1&(zrdpgmNRRGFEtQu!Q%+um-vcfl4`zYga3AT=YQ7C%BKJT diff --git a/2022-2023/main-bot/bin/main/frc/components/autonomous/ArmState1.class b/2022-2023/main-bot/bin/main/frc/components/autonomous/ArmState1.class deleted file mode 100644 index 468c9a2915a34ade89d4e09c75f85c137feb8229..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1315 zcma)5T~kw66kUge8;BPQh*kW6fFd7NZ?P0?K@250lm^F{Fg*0dIV7ja)!ciSlM|^= z?a!#4{sbRdoM}6KaD3Gt&>!NXGj_VpO$^}hU>;7+I(zT6_g;J7*Z=+V0>C1+GUyVx z{DUb6WgYG5SjDyx$fnh?j&!pTteU7~rB!noqy^48$A-fXB3Z75u?iBaz-cQ@RoPNa zH|rH;R^w`235bF~-cS`-#7ofBWyxE!$wDO|)Gz ziuZcO%m0*jHU{=97t*mX#e47jdS4mu&a0>H_p3lQ@l0L?yyY+s?TSEZdS*u;y{0QF zixftDoWZ98pA^~8y=Jtl%(mQhi1t4uF) zn8;w9eLs|sWl)!KH7Gr4SQYuWj4LclH?6>#Vqy+;aNmTnEm@;vwA6#E)R@D_C3@%P zavYR0s*=StW;2+f^@KPdpWzy7*mG3%nC#On`c`(!=jxIZ!(){{hPDR*yFQkNud2f0 zOq1bM?)zSRfiE+d=Ny~@YdVT_T##1!Sb!%mTv3gXl^t6J7j(=As5 zxbFz=Cm#3!4<5lov=1M{X>xNrd7fp4fd7L3-Lrq;+#gBG^E_PvUSYN6eV^VmrAx=4m^c}roFUKxmYm`|lx;CF;wDE<$+QVco( diff --git a/2022-2023/main-bot/bin/main/frc/components/autonomous/ArmState2.class b/2022-2023/main-bot/bin/main/frc/components/autonomous/ArmState2.class deleted file mode 100644 index e6354b705e4f3e767ff2131aef26cbc94849edb6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1196 zcma)4>rN9v7(LS#wp*4Kxd`Q=MLQfP@&Ebav+Z=A7?*XTG1mzx@C(hUXe$0t4%Q#jJQv&2yz22BuXH zJ=b%*dSFibPC2wfIjSKc(5Ws4>ipKRDx0<|%_u9-5ZaFP1^P;It#0nrY;)cAgHY|N z_Ue|oq|!x!#tGZC!>0oA{P40sV%A%eDa6raKtobPvp~;37*a6Mq(h*^Km!^DG9`+5 zS$9^Yzhtder9f-Rt60@#%eU3}IG6}G?Lc6t^dFs4rRKTwZYX^noycnFV!bWvy=7J{ zcf%}y3_|G`=td9Q@amyJM=46%p849h-LM?`(sGJP^a-@l!CYigZZt=Cr7zb~xQc!a zIc6`w8MuZ4YN#oys!R6#5&cp1kl~Hu@UpUE$iQ_Z=|11Yr;bMI{$Phm4AY0d3NtF# zDA%u(klwE-_-z9tFa=VZRxn?+YJs|v$j=S0=(vk}8b$@u%CT9`aXfd<3M~Wo@qpqg zUS0JfAQl@Ze{q)h(=m>shQ|Wgb2iUbt)0Qh1OpRzLc!awYLZHN&OgZM&7#sUX<$m- z*DGX*2n3q>t!%%rYR7MzDtmRmA{T7+`stH_9Z}W_7>lkeebNSj3^Xjz^9#gLQN)gZ z&Q_eg2>v->Toc@LG`Z?L%`mHSErmm*3g2P8IYjy^GM^cX;S$$$gijKuBSTy(W5y8% zZD{9-FM5VAc9h%0<<{N^HFg*C;EXkVOHuo;G+0^=E zAN(V<(?7wN;!NA=L&w+p=>OA>-`>Ok9UjcXX1_h>eCM3+ocs2_zy1cWgzXG^1g0LF zN>I_!fsR#dn}KXu9qUN9n!%ch%2rx6pFvt+%sDn4eiX?{J&aY5SOrF{G&N<*b=_)I zm062x4J9Co0t4$hW=L%JWTU0LH}9_h%+wGVYKLqz_Vts*-+S}C;7qg)H#3{g213tU|mO%j*HStAB*q=a#hs~S=otIa6w=B_}V!PcN~re@2tx{ZaZst zmdQ#u%N-vp&e9%c@|?vQ)-$-v8ji%=mbUJrhz-^$_c@|;p*U0YR-Yzo!=>s{Zy2M^ z2f_{*ps37f-#hyU&i$68yui~H;Lgu@`fUe{<06s3rEc&N z3v_<{hnN_-@;j!F2(mN*BdmY)7)gJZGgWQsz8y*b&(+4)8GJwfU6 vM3cD14{8BdlPdDbpcXr=K@=rvA;`@E&FMUD)_zgS46Sm1YrJt(~g>5>X_ diff --git a/2022-2023/main-bot/bin/main/frc/components/autonomous/Autonomous.class b/2022-2023/main-bot/bin/main/frc/components/autonomous/Autonomous.class deleted file mode 100644 index 73b5883cd4235203560efe0a25e2b451bb51885f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 939 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 diff --git a/2022-2023/main-bot/bin/main/frc/components/autonomous/DriveState3.class b/2022-2023/main-bot/bin/main/frc/components/autonomous/DriveState3.class deleted file mode 100644 index 4ebecb7f69b98363d8a97e923c3ffb5d0565b0c9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2330 zcmbtVZF3V<6n<`-W|MU3O9*d5ODct?L5WZVrHF-u3L0Ld6$C`wCb!MDo4s-Orlr1q za~%GF`a!??g)f2>2WRvnGyVX7j^lGT6;fKA&X}3(-FweD&pGEg=bruJugAXuIF2tZ zbO`L94Jw6-syCD`eH|8@rdGbHt7cdz1@5Ap(vFs67GeTBjB051x9d)&=K8V_Nd>yJ zGvi5td|6hTg{6jDn013t7ksIgRIm_9!@|YZZrbRM3v_C?Dp1(8$yr|q%e3pzi^ii{ zmw~{*bLRBzxij;HX(Og`JkmSDmy@pV>Qi)^8@(zJE2^qYp%eW!wxB14t=MKEBk;;* zGdS;)3cn(4Y{w3P)ST2MIqNh%EpRk9`dnQ9&cr`B;|c5%NO}z1bLVQ>gtXhn9t;R1 z2p-WUa4J`xcNU$3=lFA^KXCoI@y$CMPeNd?jV{C!uu^yt!xr`lU8m7&WFrkjCp&M(_|*PN#UHKX)pS66EBiD6C<{*3%R8&{1y8Og6G&oc#l--eCu zG<9y+xQP!qJ?hSaEGoa^=xeU7@y*;H&9ZIJl}e-QyV}Bs0=w5X=9=rB!Y%Zh2lJXi z4~GH~174h4sM?U2WzaPzJnK1)(Bv7*l}2wQP$Tivu1E5QOr-NRQs|CPB%+LXu!W_p zEL?CJtId^~Qq7 zURE?G$ht_2j^|CW#m0N%_&9+(Of)L~iLA()DsyEgo%eki6g?*lWoY43eoxi`ZIpzC z&jkkmTb144${0heN+-+H75(E;p*Sm|m181WS;J^$*Kv)RI--ZqUhX8V1=oZ5N9fD{ zf^>T43SM}K!F>K_45qUy7mPm^N=e;0&3#_5=qQE~PwvjOzeh=6}Vl>yL2z zA+8yf6?|lt-W627GvScpuzV)r`lG5yYn+e!5E zeGelXAftORh%CP^Lpa6{(`oF(Iqs%#fEQ$hm--;8v{KA>kz_5C^RLMG*BEPK;O;7o mb>dp+8XV2+?x8cE+YXvGxF$%)BL7Q-0No0Fg3s^;cKr<)l1qjF diff --git a/2022-2023/main-bot/bin/main/frc/components/autonomous/DriveState4.class b/2022-2023/main-bot/bin/main/frc/components/autonomous/DriveState4.class deleted file mode 100644 index c6a2f0d05e53e4d23f8c839bf6b1b80a62a3d6cd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2513 zcmbtVTWl0%6#oA1bY^!t-CikMD9|dEZ7D25xonHH&;_j)L|YmJ1*hBD?a^nV!|FK@nIikCr5V zIB%w>?1Gi>r2^HSIgzsjx<{UpR3n)X*q@^Q-Is-K@bTptzL!-dDg*rA| z;0+6D%Rn<03FukNOIaDSobv>F<6R4O_a;t%7>flWIXiFV?Cg{$U1~M31WN_N1oxvM zuq{4v#GEk`IkS*uR9(A}?O(XD{s;t?8K{ODhNhz(cWLMlh%fZk2JXhnz#%`*0z?1H zp&(h(t9uM+2!|1oOqYR(WL68bq|LnLnnkB%9rjF@kth|-v?WiiF`y$XP&dL7+f&X@ zSniD|HI6uGGdFI!wydEWn~FDOmjqUgEU1!ML7G#bf0i3TFE(k|C{RBq_9sf7l{eTQ zTUb<1nQ31Xq{emN3)(7Jcx%_ zpt8=Lvfsr@Jk^y_zxk6>f=>hw;}H#e1)?&*Lry;L6jG*V8h8|=0yUFX$>ycU$}U|I zDRt0S1JuE`fYR{T9U%_vNQVy^cpOg<`IhzVL0iY;2j}!dpwQnn&z_F`IBeian9>vf z0^??`%vr>sq|||50vB{x$ZE(4G{{T1&V=J7_IY;B_D&d>k`d5Kb~f+WOrC`!2BwkY zlu75ze36-mr&2N|gDY>s72#?)O3!as&TiA2GEkCOA#6|4I`CUS z=qTbT15e`_ImkF})^nwau9TEKXW*2d63R{%SZ&-?7H1LvC3>BSYl0R+W z6?t4K9d%i()fuN;U}cB{oUn3IR(Z$e>m*+;2c{l0+i)S{usr99C?UKl%VRvX$-q2! zXv=a1YFX&%>D^}0Z#@lXh&Sq#-L$pKmh-=U&L?B7j0`&1&msD*@XzVw--7eNUpWf= zmCepo;Yp5czH7r{A7sZoAT0!0JTFKJJ87TMsA}XL8l-c)d}nkPyXwwffTny5CA5`W z@n(#0b2yq*qDeKH3`al3o~7qeL&4bDU>&E%w>;Yu`WpLZaiC9c)kEuNaVV*@>eZ5H z#zZ=)w(6R{8;&Vdo~~e0E_KsiWt^zx$#=_0WJGW)wm|B6;4DZ}WSQb-!dWLjE zEbP&(%;&cDi_|UHWucU zLKhkIke}5g*4IQuWV7fVL~ diff --git a/2022-2023/main-bot/bin/main/frc/components/autonomous/DriveState5.class b/2022-2023/main-bot/bin/main/frc/components/autonomous/DriveState5.class deleted file mode 100644 index b62e3b272cbba59a0be7861432f7ad4ef40e6ac4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1607 zcmbtU(Q?~F6g_J@mZd0Z>bMTHDRn|i9RpRN4K28Y(zu0EHv|#_6lOXbd7Uhkw4T)} zAz#81d_iAGX<&GOcV79Q4tM2H0+R>NAdj`Wd+(lm_TIDm$FpC518@yrJ18(*=<6^D zRXk9MNK6{=%&0`gDocZomOEn2a3dBSlo)1gXlm_;F%P$8B7)q@FlP8>Bp6y<(aVC} zfeiXmrzS{**;V>c?oET0p|x&f+YAM>!w`(T;&x*69xW>x*`thHYre-&z9AE7mT0=U zu)$DTRz2aNh!Z}>;d?lVX$Mt?%cByzo6ruEQ240f6oa=VOh@#278!=C&4rQa{*BYF zV1~hsWGo`NwQVe=7k!+@8HNgh=ha|XYIeWjJ3NSZvPD(ZGTCa6o~-SH;jE7_lq+yN zG%)XAj-ff~u6?|W^Fu;;of($@7olOZEUQ<1IH*+MT4TY7YmHYK>LHJX<^z?AhlXpa zL^|N1uu-r3@K9km(IttkWbvlZhgGU}Rmh_auBFw`;bh5d%aq|_cO)f~f*h3)KcQV* z#aj**8K#cZelIm5_UU|FCsC=4+J0)-8mWR+>WiW72p&^k-yv6iMjH7sXe>5_g%v#y zH?ZX3U54o#_}?piyoZ~_Vqn3dgg}lfHHo=QJinEuf@Ox}c%o@rt;LDdK!-RFbD{&;ID)1kN{ z?F}(?_!YV>YL0xo%oQY|TGIllNso@p}fP70QCmvCqZd`OopM-#>l=*vD>&C4sGXd77j)JF`X^S0u7@*4WIJ zMRJ(yb2WC-sl5<^z@{%Py#F?n>8UmpiXWD4@T%a-7IT8pC>{P{QAZlY7O@Xx$ zi(i%5MCEVfWTphVBb&P=wY40Z0Q6xMpatd`VEvy)jH@XH<|P5#-*JS8*b4DT zVAb#8z-E~>htkP59%GyBCX)P=OBBZf@z|Dms$Ocp)y}0ad*TJ-J_zM^0|9UR4BC)h z!c*{E-u;f&XI_>N)B3cxS7_UH0nZhBR5O3P&uU*6eZg9H;~O?F05MZcphesTB$`9+ vEQZ`&09heqbs?l*jpfI9N*$Hr;42<9J~2|yQOoFZ=-wqlb1q|0Rqp%&36hod diff --git a/2022-2023/main-bot/bin/main/frc/controllers/LogitechF310.class b/2022-2023/main-bot/bin/main/frc/controllers/LogitechF310.class deleted file mode 100644 index 2be01dd1eda4522185b3db7d8d8768352ce239f7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3047 zcmb7GU2hvz5Iq}zyPMQbL-}yONJEpDw(b|C(9kxn2~BaDG;U23XklY-oK0Li*z2SS zBr1wjkU#>72dH@9jh9LYscsQSyzm77g8zXKXT0lcC*4+}mAo@^?>%#7=G?3N_3y90 z0~o_b2t68hE!7ICLbYPos^zj-tEaNnl4YBP<;mkmkA&dY5L+?Uja1pFlu|Q`D`vsg z5M7-rrW>|htxRaprZn`Pt5)i^QL*zzxncT6iK|(GY$K)X0eglShG?~R;_M}RkjvaQWvTp)NQM}4H8*rUN`EY^c({`^k<-6f-}RWUC%ZY-L$ z%f@2a)X<-;7L0PLBG9h)ivzNK54il6a?-uVg$#nie;Y` zx>KY1D111o<1mhq)5vH(!uFof5kOF^mvuxO>!gltj`gaJUdI~OvE8vw>xetnSsgnZ zE3M-x$I9r~=~$CGo_4JBI-YT?3p$>4tgMdb5DeiWD|~X_qnO65uucifIUNb?($Hhc z5K5*^@v@c$+4Yu=tDpvShUbh8N8C>B3(n@W^Pz6!sK|*Q5vLkw|zuKf{bLYtO<*X zjw;qPNN9E@?=aw14i(K(%`{0VBAZ(kQNChlsv8y8lsv2;S8db^=A$3X|**ztzZzg}k^nBtWW}3M4 zGhusL{L+Zg-pf=G{*Q8W+t^yUg}p4a5BoWY5$-uew#Qih7+1$JfC)By68kX6p?7M_ zsoHYLwQARJ8CTqbjx(opBa*z2Oa2GQ-%~W4HVw6)bZ3(brD4GvAm9No;tBA!H$cz> z;GieKJKg{x4}c?{0N1<$!X5x8JOQpNfD>*Lqte8fR}Ck-5TdG!@8Ugo3}ck0jG;Fv z5WWX69>5gEI*M>cG2R8zt3XPR0pT#cK+bxCEI$T>?eqf4c!F4u0bxtMK+b!DtSFF8 z(xkGCt^LS$0Yp?kR=oi@l}7+(JpsyUuD95Jx$T4QP;QJT;@YVn5b)ni+-?2F4z)a= z+#2U`8RW|fUa$yJV#xD)&hwF3;N`u>H|jdCr_svlJUoLg?Fiqx_gj}!9-c6K|DazB zgs6#{V)Kd1W~jr)O`nJ@IHcmZWa^&E}sJ(KJEO8IPSL@{q4<$@yMn<2L(HCU&B^iB1MqiWBH~))KgEQ>G`hNX*?v%9yq_rKqNcJ~0>!Lo)ffx-2lUa0$C82GMh2aUq3RsYlE z)cDBSb8AgQT%c#u`d}4Y%iAc-d(AC@uI9GDh00-xMS=L5|Is7k+Uub}B5*d|lhvBr z(JI;8ZhuN~VC2+!-FC-4-?Ig}=c_AABemJe%Df>k^ya8-^-|q+JSUtMh-Gs%YGBS^ zvvnlW5a^RQgR=t3QWVmct?Zx92m{C4D3)`z6vYlmB#_jhF`Sps7<7h<5;{YQ;j%=E zAt!uL*t4)notn>H#PPLv^M_bIl!ob$p=560?{WxZRmP z=URP-CyD+L^WW|d2($N8>>EyhMZbb`aRq}4E+iBT zDHu*FxTIi2Q*cGWHC;hgK|a%t8&z~8(+(U{G@fZkPGnL)Y3EoA{e~HDVbCxWEesiE zvV}{AskLy$F!dI)hM6JPC>ipNks;@V@fDL_sQWJ5rvG_*O27)elo|%`64&qww_uV$ zUZaXPcuT)cyu&BFz?913OnTnYEGB5;Jaa8SI`|ED_6sK|08x@uYYlgKsPvHU;eM1p zMHj{CeJxCyi?RHkS>mHD#m;?4@%m@_(r&X|P5f^mMGZcRYUC+~_e%GQ{CCX#f;c!Y ajs;co37#rj#xu^Oe1SzQkzlIIzxWq8OfFae diff --git a/2022-2023/main-bot/bin/main/frc/controllers/Xbox360.class b/2022-2023/main-bot/bin/main/frc/controllers/Xbox360.class deleted file mode 100644 index 2ba9c9d64799e0e5af49273ba54e161bda7cb868..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3220 zcmb7`-*XdH6vw~Yq)C(BrY(Y4ehCWF79k+Ngz~GUK!YiTw$!$QvPm|{wjmpmO@H_c zoY7HdbVlEN@ZATU5g9Cw&iLqq|AjC96V5n(&u*F)xr^g=PR{Pxdq4M_bI(27-~ayk zR{+QHK@=?pHs`C^WY#IWRi{+4s|hjO16_0Gf|)FtYJiE@8qmFLTFcr zLKz74_Dw~RFtFq4tT;N*C3D(hFt9-(*oGZZY&VctOU9__78Rby76xEu zYLTw;OT(+`8VjtSSy&X1avh8rCP%S~H(cS6!P?Zr-f2YMCy&~G5l_v7Z` z;F35i3FBJ>FDvxOLXXX!p*u3#E)<)%#|<12=7>RWnORxpu)+}>HK6=uhU%{Cl>LQf z{lP=NqH8jhgjT9Ft)j=Nqtru;iD}{;!>h6)gx3tq_jAoJ-%oixS+xrVtIACim^j|F zL}_F%DU6FHoO2e-VwhC8?iosqQ4FsuOp75}uQX@PD!d`Kn9OQg zZz{Yg);6)OPQRsKiZN2JteUb4IWdLHPMM_@ud?7v)(BmSp#VFIqJe$-<8#R>TU9$d zk{aGU?#-H9u2>3l;1;TRZx?*Kf&BreS&Q&C;mxqhMS>T5(3-yppAdm2L?I>MncS&w`HFY^6v zj%Y##LiU~Z$(uZ~@&`7YWqAca!g@%L7IGi} z64gVtYaz)1NShwAOA9%OLyepqX7G}en52Z!yz6?40XV7!oNNM)G?EyXBzEayII)fpZ)R~IfS?QFw3cux zfS`+FP)j%+K!|Dba6wBr6F`V-2q`V$Y_p~xD@Rt7cktIA&(U>&wQ@YC2XH5z09?}o z1~Jq)5Pwq3fw(7oxq|cG^1dzygd*29%6^JPnWfB7KBm}|hm@O?KPb1^Kois^^#Ju9 z>LT^^2e@?Kmr?4glnKfdWrlKt@)jj?pJV-wcYsY)IMe)&-rzUm7C(SF@{6dT#IH>S z3vjWFCA`bOyX)e+*Qhk1)pFb*PF=_OjGWK4oTWfcLKD{)D=G>iD5ADSsrZE2iXeg_r8pC*#;2K30)`0*lcp%&O3Mov z9T{Kyp&WOwQTj%tGwl5~yL)?k|NHst>j8iXENSQv7+4Exg_`e$f$zF@P%pe%@joqj z_Q>jUYgI#BpnJpGwhFH0trup!#->0=V@qJLd{kmlAinB<^vJmOS}2eRob?Z6wZ>Mo zN;bAypHdtcIdxvQ+;PwMY=O?%%JSk!b-KJfYX}Uz`QNsBspdMK6HW@mvbicXFypV< zIudCJ^h%t@8G&Re3hB+34^L-=f#aG zvR|{@sueiQ%9%zCy>zw-JU+< zTJ?IdZO^~;4*O?elIGHe-w0~z)-h0{V2lts1A6j&5y|O3QiA zvjf$OUDr?+IQ@?Yz|yC;BcNC8did0@hg0KpyD@rn>8U;z6+o8sq%28ESyGX*Bp_u; zJIa!5lqJO|OJV^s{VWx#7$+$nM-SCMLG+85|Gs{MFndnM_Hb$!eG1OT6$~gCOeh#q za3QH+Siy*<;F5wXx`M2Ne5MsQs_0s#6*#8odZraQo=JVDonuY(8D_kR0mDo*F=Uv@ zCWZ}DYvPh&>P=(~GefRXGUOX0L(Xwy7dO99_Z_%R|MT>efGWL|m*~eUT!D#OcufL% zg9_f#?;SSq9-pv`J1UDa>3K)97^jKz%(eXJz#b+J3nwW6QIb?^4R?8{^pNl2ew2QP zE{fB8o49E%#PSDbiI27zJG+nK)z9>$)n==j_}fB?8hjMh$WsjOmF^Mwea!rT_;+3$ ZbE@VOJXLlc&p4Cv1s1SKf~hF~!f&dKGOGXp diff --git a/2022-2023/main-bot/bin/main/frc/controllers/XboxOne.class b/2022-2023/main-bot/bin/main/frc/controllers/XboxOne.class deleted file mode 100644 index ccbb110967a737345b7052a6d0d69b49a4f9c99e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3209 zcmb7`-*XdH6vw~Yq)n6Fq%DG2epwWxt(J&@2nD327J_LDZK-VqWs_{1ZNqLzHndd` zUewVUozW*BeD^_TLd=d+yo%@z1Zn z12~2|F*F(2K3~bF^RDAn+)~M^RMRs#cV*nMVu%{(STt{%>5}Ozq{nlMR^Btvy6CP} zJv+Z-pgU_7YU$;&ou0QVRZpHuc5X3!q3$tYpyj0P*xqRa(Vk52G}T$RU?mVin?elA zK%}R4I);>iJx^yPkVJ=!X^q3c7KLWC7--Mhjx|=hp0g@bX0BxMP1enurD?Nb%kR1| z>J{y(fv#*wtXybQX4rs{VSEM4EDV`WLDoFnJDk8S?1^Ewfz(DaMoq7%@H}=f05eB) z^G&l<p81)ciVs`k%@G2|>;Wfev*155+V4d=Ms$wrJSQYM-z+~YKOA9R*O(wd# zr#EbC_7&(cAaM*SoCVYCj~Zt!v2-$VjNp6>=M3x$*;^l=kii9Ra;?lld-_yD%qonE ze>2x!^u#i*a8WGLg1hX9VM1ZjHAkH%84U%!(~8qZ-zC6|RW2Rjlj7 z-&1&Bj4ieDy2(_?i7D#14ofRhVV#$(^ITFK78YWdH}JCl)SR;%t77NRXNLDp_@ky) z%a%eBHur7G--W<#pg-ggYZ3lNEGd+5ol#Y}p+4Qfp`QPR8J1oU4+6@%%Mwpn;f5@) zZAq$Tox8PUdDU~Ahlg@?$_>oo?kUs)_aWCSuDjQfptB{jTD7V%e8>{~uS60U%p$3jLhviMZOp2Aqn0$FD)#c&M%Y>n3fmL!+xg6v z#e1B;MiE65b!Xp0B>H|sa(3rKwEv9GpJ;5tGrXsKK!T2K=zzjj+MW#tVH=<1>Lm6# zBH7TeqmCZq2${P5z%SUD`sQ22Qr{tZ;76JwKDdRBGIRsj-T=0v+h6+&^k_y?@=S!z zFJfPveT)bhob2m+fX>Jo_OGE=$ib2W@;0BW0>?U;LFcP$SWa`m>#lQ3+WGm zwCW*ywUC2I*K=~1!Anl!k`hMq>JN|QWB(>VypfM1dO))V(5nR;)dN~IfPO9Dbv=N& zd?JKHTEHE@%m-8a4e$IkKAeKYl#NHUT!u@w6Vmop=H;p#{8&GxY=U7quLS zyRw&S82p~kH8~&@xh_%qDHdgpGE4cCVpASau2TM_Txa`CQJd5Q)HkS$)R*t$t$TsI zO+7}rM46(zLz$yorChs5-=O0iWD5nqpfjBF3O{|5EUZ+i97y-DzfLG5iF7 zj!zmM`~k+_WIWr}vC(yCCnkuP;RP7zE1|eG>5_uB}28T0}-}` zQK>uubM{EZl%RP&t49$Bl$~L@_Nh6|-m*qTJ+I!bQpMLxsA7>S=t(MQy;dI^CRT;K zn?!+CI^wNlI1H6Eo{Jk;aj;C5vXk)7L&dww#5Vm4mEY$d)1LQ5EK9hFRR%YL_~ZHO>zDJ#8l9_tKCf0sLRgI)y>T+~r?utWDYJ)qIb z$_3PD8RYkmg4`Z6l-@;=G>uTiv5Xx&W!Szj?aOB7;5ozE)u!|~#skJP&~?(K0vY<~ zU6AaM#ECQFb35Nq_&QR%L{l|T#yru|*ns#olD=Sp@UinA@zkz(h6?ZF1nUH||9 diff --git a/2022-2023/main-bot/bin/main/frc/robot/Robot.class b/2022-2023/main-bot/bin/main/frc/robot/Robot.class deleted file mode 100644 index 165911bf2db707f126435794ea8b170078f54e65..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5593 zcmb7I33MD~9shl~CYyXs+azr%Jt(ELXDCO(`o$#x1tv3bub)AGg!lOF>r(#?E$o=aQuh6()NcMC_#N*zvgK zq{G{M5OvUTyEEomk*@Vi77=y&A*juHaN?Jl8P`tQ2|Gj6W)EQ}Qg+fxy6JEZ7+#ab z6RL=vNI6zIZ957xn@9IweHMolm1e}vn6B-}tX{=2Hf6zLOVo+&u$-p!nq<Z&)k`*4qG8}_r4a_=hI;@Yyt@JLkPiV}>9GcW=xeZn- zZtrS{Ib>}+yA;ON%x&Io?l8kKJ1i7+WtfY325M#&}ow=*tv$~wA*2DvoLG86Q7BR*k( zMOPL0yJ^$9oe?YL#_XiVDQIRIxwh{Gh3dfZ`MxQ`sc1242@4>Gu@jKvGF7| z8O^;+&aut0q;+a0(QY|g%=S0~QQ2%q%=lK*iOKuWWl6$IN`>Q^KSmC-KuRT1QeOU4 z`_331O@#t$XTGEIJVEj?tuBj%72)YohC<;3i0EK-iEu~*~k-fYXH zIRDspN`vtmWcjG^tTQl4p&~c+g};G)3bRIdDu2%ge-8sDL>IE~kO zTfrG3_vvc@kCp==YHS2cbq zG`hofdQ2zkk%_R^G=4246%@8P*4Z^At>lS!WM2eIR=xea{JcIWBtT9 z&E?kW?$US@f1uaWNw#%+U9^+IH)E%%?&8;Q6CF3MTt3PY}MefI> zyX;InYB_6?opE|CftO2Gzdp%RK=A&q@ejeP9-?o}M;C;DY5ZFd%B*<1-IL|=uEu+Z z8rN2``spjOyg$(RP)NrQ@m`nDK`E^YBzh&XcAb_AsUlTksA4Ach}>kM&uZcR?9F>+ zD7NHK_ZBY2t%x<`%EYP_gb zDr!jv31*d6)gpIt_r_Q>8n-;ro18{|93)%f<}TSl6KbMXlY)F)BV?1cI#S5SbZ>C% zOfuTSY|Er12u}%knpV>VT-@DgCnPp%hE_)h9NGls7_DXrN>z8BERK2cg%HfvYK{;D z3B5Lx;5r;qbJaXUaYyxrTb^&Ena>h>ORM>c3u|$=e6WntMRJ&&mHSm#tA&CeipUfd z1|oj3R!c;DHpO%DPta5*QpK%J9UUTR zg;poa*fk<_8JB;qjR9fMCm0>qO1pj!(Q?c|D$=n;Chj@Nhgaqv=wD&O`}dI6uy4q#f_AdWia zQOq1bP3409SXhAO+Ijo2loNRQ0P3E^@;F|pdLE(55`Ha9crMi{Ch^SLeYmgf zq@sf>3s2sI@so?DE^cOoA6B@uKuw)?&xh{_XFrgYR312oYMacPbLjYpCuO3SFEfXv zR5542fp1a^30akdtOCUn7{!>8+ZY~uvx=-GbBWnFy1$S4*58kTqCPyDGpK?X;CDhf zx|r6nJj2Fi4SPJxZ>b0(eklzb7{I|CpE6I)1al;r$D=gM%LzZqMN*B`}i`|wsT-sXLJ z0DrB0=;ISUKG63`7gU|B8 z6Fl${0hk9LywV3x@xW69Fb_WXC?9;(ZcOM^GXpRW0`_6Y?uPDFHGOKq9#r{Pi*_T_ ztB&VYE}<^Q3`XjFR`KWf^>6_@#f9t+7x6y`F2N>NfQie{jmzQU3SwPJ=vDl8HEzZ= zxPzYzcjG!%#P!Uk8*l(O;vm=gX9;}~x8POWir4r#@Fs4C>lFj%D613nI)9%K|UG=J>W$Fq-^*i@&cFO0*Tz zmj-tas1pnOR9!CnW_#`Xeip|b+WP=&;z9PahuG^LCiA_R$)cG}OLFx-C&)~-GAsVD znK_V0n9WSJDoeOzs4R+y*Op%skFl^1KV2I)u7h#$w8rtaFbfUda{~}Yt@F;lm7>2(}yGg diff --git a/2022-2023/main-bot/bin/main/frc/robot/Utility.class b/2022-2023/main-bot/bin/main/frc/robot/Utility.class deleted file mode 100644 index f9d72fb09354fcac2ff98ec41033f80c006a95eb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1149 zcmZWp+int36kUh8!E`9Jr4*~ZSSgA`^EvFU;SnZD63Re7HD{wjj;;}${sph#YH+UeR6p9-H>WaVV zBp@(gL4z)ks<vDEc|66=e_jRdmD85lcN$ogJ4aGDm*VVrvX9%~xyC%b<6nJkX^ zj@?`|aRHMCCdeLQpLScALgt?Yj}nqir`xsbPM=*?ct#O})&sltX3cI#6&qc*-t^r~ z7Ft*>uIkI$FY|5YrE8*ql7XVY;4#XY9W*Rl#Wm_~`#S)Rywt!B1 z=+L%pug7jHO_vIlrp-XJ+akUHaI;Q_AtS@kM9}Cs-G=W`i@EOiIyL8!D<@?|7h+Bd z!9`A0;l<(9J5`3EFE?Tqe zAe6;hGKfi}Pf$%^nxz6WTq>|GHyg5TLhN<%jFC2KX4HHNau6vyN`(H)P1OViPx7r7Z7Mk+^V1ZdN-1`gb2D^9w diff --git a/2022-2023/main-bot/bin/main/frc/settings/ArmSettings.class b/2022-2023/main-bot/bin/main/frc/settings/ArmSettings.class deleted file mode 100644 index 42ce2c9c1768f47493111bea1f62e11c9aa2985c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 337 zcmZ`!Jxjzu5PfsWB^sj_&qnO*)WR(-6hRc>AZl@P{U*2G?Xj1I%|?Hhm0;ly@JET0 z7{tbA-Ul;}H=kec9{|p<7h^!!e{!X$mG`<@)Z)smr#+7m60((imcqztAs&jADm`IT zFKuJy%H3IS-QC$n;eqsO5Hc>Lb*p- z7)2Q8wv=Wjoo;n+hJLAQ!a@FD$#X(7wT&y)t!`7YKM$O?-Ejym!T$~zhlrRF;vT6j l!#ZJCFcRbNh3tExN_|(ap1d{kQn#?J_>PD zGIU|N=W&m$bN&7E`32w-hY>o2qvuklmGWNOMU_sBc$>8%LP!`c#j8k-u#5B|Un=Pd zeYaMY(~qw7(}F-#_M~yumN#BoRj-8Cvbu9cZB!HNU2CiT4Iwx^n-ju`D^!dC{RF#+ z34=^qbziS?RX&N_D8e{%Qkc0Yb)#D|^e?(19B2PFzaqplSC>-V>gJiz_E{IrMK}T1 z;BN>RyXY|^L@n;LNKGyF_jsE!5@YxL1Ias+4)%HWHfDeU^W-mpAx5mY{3dnq3%y}c AKL7v# diff --git a/2022-2023/main-bot/bin/main/frc/settings/LimitedMotorSettings.class b/2022-2023/main-bot/bin/main/frc/settings/LimitedMotorSettings.class deleted file mode 100644 index 9246187513f294f9b55d750e64e7d71ce9707df3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 355 zcmah_u};G<6ug(D34}lkWnrwk00SNwKrA4nN&$veU6`EIEv}MSa$Nq435kIZ;G+=F zp(7HD@7?MAboai#KRy9m;y6J-7%gonTIHN>R;|c&t({st7-#HsD<+5tgSC8>qLR%@ zJQZtIIzm!=*W`{s6GB}1uPq^XW+lGXjdnML@bqj>h;Ge7r3kT~VHYW(pX)|FZt6nW znJg+rILb{atGTq=^Q{=U7tJfj`M)8r2TiW{*LU8hX4os#+?|V&vW)`zyOELxJ2g~{s7QdPeK3y diff --git a/2022-2023/main-bot/bin/main/frc/settings/Settings.class b/2022-2023/main-bot/bin/main/frc/settings/Settings.class deleted file mode 100644 index 6fda24310349c733d45b85a18a6a60a802442a9d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 491 zcmY*VO;5r=6r4wCQ7D2aexCHC9_-PB#>7BONQfRV+_!bbC8bTaE%>)QnRxIA_@j)k zD^2ZXXWqPdZ)f-W=kp7|6%HGy5&ADW@DiD(Dw-wUWK9~V6S{M;6kaHznfK_=WsnkD z$x7;_9BQ?cgwt_#xa<{st_f}sid9h)j;k|+e@!;GgkF^1qpJ6=?3ulBlAbyrjSm?RfLWd{DDv}S`!k79<_#wZkH;w}lPK8!^ zy%y`~t4av_)jUN|4%3{(nGWQ=%2%|D#%2D2I00YJKW;PHaF`Jq*f6+>rok3mgY7j^ n9*=!pRy{^yv@bre{m!I@9X=f+TG(ao{u$869#<&!du-$>VVt5r?0(OlR9y_u|Kn8|z+ z-X}9kD*4+}d1 zd~^i5k;>_A{+f_}lu1Sc{isM~HkMj7vk~oTs>*+M`csT|^5bHzQyQrz?Qlc+i>5b@ z!AtR<*^F&C%miG6p201H9EuL#2kZ(N1!MdC1KaORTIllWEJO=E=E2f{UG#Yp*ju>v Fe*rp4Va)&l diff --git a/2022-2023/main-bot/bin/main/frc/settings/SwerveWheelSettings$Location.class b/2022-2023/main-bot/bin/main/frc/settings/SwerveWheelSettings$Location.class deleted file mode 100644 index 3fba39bed7e628d85919bf4fa773700df9ca597f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1199 zcmb7DO;giQ6g`i$O&bE#DqjT^wQ3u%6&-caia1OiJC?GD)akfN<0}M1;v^|f|CPc5 zMn}fAKg#jG5NH-U(k}Ymz3-lL&%HhU_50f?fM<9tV~nBH^UR9RgTQij{EGgWdk6g8 zF6Xu$vf zOecTPlXQrj-box{T0g?hLk z!+0~nL-(uqy1HIh_1E{uCxByYIhYaH?rPsP6h%_?jN5u8J)(y`QP7Gt2T6g_z#DmP z;HjQ_+a8b~2{;`sM^wKO5OslcG}OwHEGa+ikhXCq2z@V-p%OT3O!L`m#K|WDa~g)g)z>?I2R+21tq>W&!;YJA$kHrL*I4(>Qu#6RE2~@^eRje}R_-u{W#(5Q+%#)V?09~<+-T(jq diff --git a/2022-2023/main-bot/bin/main/frc/settings/WristSettings.class b/2022-2023/main-bot/bin/main/frc/settings/WristSettings.class deleted file mode 100644 index 068c37aa9ef2ef8f4fd1cf9214ea15478abab899..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 403 zcmZ`#yH3ME5S+Cg8yts(@RAS>9Z=ws0z|_@iev~5ios9~1zGlaGgBe{^eB3Mt{?Ow=2 z>Pv!sbUY?FSM2v;qZc4Rhtnfji2LOt5$Z8ca>2<_na24zRW9|N|q&5W>PT)W@Dds)H& diff --git a/2022-2023/main-bot/bin/main/frc/state_machine/State.class b/2022-2023/main-bot/bin/main/frc/state_machine/State.class deleted file mode 100644 index dfee2a5e7d72cbb893dde827819150c9e54c154c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 497 zcmah`yH3ME5S(?4O^hKSfDk1eFX55`M1!ERpa^n7gU-%DE^=(?d`9^w8Y(0TK7fxx z>^Ug15Qt`WXK&|bPWSQo_730#TRt4Z_Jhu%$_OLxry?7xLPkT&e7J=EL_CQo7sX?A zlTKu22;P}0lsPAK_VyEkdr^*LfDXDLmf#V3F<)_APgALHMVd>(ATBeJCqgUBzlW|F ztBSA_|6zYh@XO+|FjBK8cQeK2zN!+Dt5M^A$EfRq5Dd#&XYxu}x1dRXY=gVI;1zx= zI2ze_j6So7E7|G6E0$llaS$-tW3XU_F`O@OU1dgCTZj)E&aU{z hb@sJ!kGR@oj{9t}l{IWBow+6d+JKcd^G371`339bNHPEb diff --git a/2022-2023/main-bot/bin/main/frc/state_machine/StateMachine.class b/2022-2023/main-bot/bin/main/frc/state_machine/StateMachine.class deleted file mode 100644 index e734538f942351abd395e0c2ed8b4dfb621dccb3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1127 zcmZ`%YflqF6g{&oU0McOC=U@tKrQVe)VE@>-~$tqq9&Lc`=yy~m$KMy$#zTRr{KRZ z5eS+X{i2C~$;5c?b|a{1n$FIBoqNx@^W)dY&j9XXRfi@pwdI=GmZvT{*Sv^U988dIAHDve|ZB%klhdf$>5YpqxN&qwIHR5mdp)YI}A) zTd-RmMWdT`%~4+4wFKt>2`_g=%~NG$*>-F%FAz#+iUQ%s&8ihc2yux%NF9R$$`= zR@G{t%VfG+dM;D!!z8A3Tp&G9=j0J3E@GN^5stt}x}(aO1>`a%fgWE}%5vKdBVCrb zf|P)6x7HfF-oCF(iHW8qdJy3pLt-9RDN?g&izDgv%>URr76rz-tTToMT$8vSG%BjP zU1i@*iCd7=yy>htp5=10JCdFmHH)}bqq#?`S-_ISEK+>SNi1_ggbLo;G)zA!X1>`_ zyMf%X&1Ty*t*16GWYCv0PbcZfMoJ;IH^eVgWC&o_*B0{0FO@7(Sig3@`|5SX|@VlhdHL8LH5TT3F3VXPDB i7eu*4q!lKxg{d>5)B;f+P;CU-PpnT8ojh3@R(=D{e(A{o diff --git a/2022-2023/main-bot/build.gradle b/2022-2023/main-bot/build.gradle deleted file mode 100755 index e1a67b8..0000000 --- a/2022-2023/main-bot/build.gradle +++ /dev/null @@ -1,105 +0,0 @@ -plugins { - id "java" - id "edu.wpi.first.GradleRIO" version "2023.4.3" -} - -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 - -repositories { - mavenCentral() -} - -// Defining my dependencies. In this case, WPILib (+ friends), and vendor libraries. -// Also defines JUnit 5. -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 'org.junit.jupiter:junit-jupiter-api:5.8.2' - testImplementation 'org.junit.jupiter:junit-jupiter-params:5.8.2' - testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.2' - - implementation 'com.fasterxml.jackson.core:jackson-databind:2.14.2' -} - -test { - useJUnitPlatform() - systemProperty 'junit.jupiter.extensions.autodetection.enabled', 'true' -} - -// 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) - -// Configure string concat to always inline compile -tasks.withType(JavaCompile) { - options.compilerArgs.add '-XDstringConcat=inline' -} diff --git a/2022-2023/main-bot/gradle/wrapper/gradle-wrapper.jar b/2022-2023/main-bot/gradle/wrapper/gradle-wrapper.jar deleted file mode 100755 index 249e5832f090a2944b7473328c07c9755baa3196..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 60756 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 '} - 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 \ - "$@" - -# Stop when "xargs" is not available. -if ! command -v xargs >/dev/null 2>&1 -then - die "xargs is not available" -fi - -# 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/2022-2023/main-bot/gradlew.bat b/2022-2023/main-bot/gradlew.bat deleted file mode 100755 index 53a6b23..0000000 --- a/2022-2023/main-bot/gradlew.bat +++ /dev/null @@ -1,91 +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% equ 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% equ 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! -set EXIT_CODE=%ERRORLEVEL% -if %EXIT_CODE% equ 0 set EXIT_CODE=1 -if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% -exit /b %EXIT_CODE% - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega diff --git a/2022-2023/main-bot/settings.gradle b/2022-2023/main-bot/settings.gradle deleted file mode 100755 index ae1af1c..0000000 --- a/2022-2023/main-bot/settings.gradle +++ /dev/null @@ -1,27 +0,0 @@ -import org.gradle.internal.os.OperatingSystem - -pluginManagement { - repositories { - mavenLocal() - gradlePluginPortal() - String frcYear = '2023' - 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/2022-2023/main-bot/src/main/deploy/robot_settings.json b/2022-2023/main-bot/src/main/deploy/robot_settings.json deleted file mode 100755 index 022b1d5..0000000 --- a/2022-2023/main-bot/src/main/deploy/robot_settings.json +++ /dev/null @@ -1,51 +0,0 @@ -{ - "controllerID": 0, - "auxControllerID": 1, - "swerveDrive": { - "FLSwerve": { - "driveID": 1, - "turnID": 2, - "encoderID": 10, - "location": "front", - "defensiveAngle": 315, - "posY": -0.238125, - "posX": 0.365125 - }, - "FRSwerve": { - "driveID": 7, - "turnID": 8, - "encoderID": 12, - "location": "front", - "defensiveAngle": 45, - "posY": 0.238125, - "posX": 0.365125 - }, - "BLSwerve": { - "driveID": 3, - "turnID": 4, - "encoderID": 11, - "location": "back", - "defensiveAngle": 45, - "posY": -0.238125, - "posX": -0.365125 - }, - "BRSwerve": { - "driveID": 5, - "turnID": 6, - "encoderID": 9, - "location": "back", - "defensiveAngle": 315, - "posY": 0.238125, - "posX": -0.365125 - } - }, - "clawSettings": { - "pneumaticsModuleId": 1, - "openingPortId": 7, - "closingPortId": 8 - }, - "armSettings": { - "shoulderMotorID": 13, - "elbowMotorID": 14 - } -} \ No newline at end of file diff --git a/2022-2023/main-bot/src/main/java/frc/.clang-format b/2022-2023/main-bot/src/main/java/frc/.clang-format deleted file mode 100755 index bdb418e..0000000 --- a/2022-2023/main-bot/src/main/java/frc/.clang-format +++ /dev/null @@ -1,6 +0,0 @@ -Language: Java -BasedOnStyle: Microsoft - -AlignConsecutiveAssignments: Consecutive -AlignConsecutiveDeclarations: Consecutive -ColumnLimit: 0 \ No newline at end of file diff --git a/2022-2023/main-bot/src/main/java/frc/CommonData.java b/2022-2023/main-bot/src/main/java/frc/CommonData.java deleted file mode 100755 index 572ccce..0000000 --- a/2022-2023/main-bot/src/main/java/frc/CommonData.java +++ /dev/null @@ -1,116 +0,0 @@ -package frc; - -import frc.components.Claw; - -/* -* 'public': This class can be accessed outside of this folder. -* 'class': This can contain variables and functionality. -* 'CommonData': The name of this class. It is treated as a TYPE. -*/ -public class CommonData { - /* - * 'public': This variable can be accessed outside this class. - * 'static': This variable is the same across the entire class; - * it is not unique to individual intances, or - * objects, of this class. - * 'Claw.State': The type of data this variable is. - * 'ClawState': The name of this variable. - */ - - // Contructor to prevent instantiation of a utility class - private CommonData() { - throw new UnsupportedOperationException( - "This is a utility class and cannot be instantiated"); - } - - public static Claw.State clawState; - /* - * This keeps track of the state of claw - * Either open or closed - */ - - public static double desiredTurn; - /* - * This is the desired turn value - * It is used in the drive class - */ - - public static double forwardSpeed; - /* - * This is the desired forward speed - * It's used to keep track of the speed - * and set the speed in the drive class - */ - - public static double sideSpeed; - /* - * Side speed of the robot - * This is used when the robot is strafing - */ - - public static boolean balance; - /* - * Set to true when the robot is balancing in autonomous - */ - - public static boolean battenDownTheHatches; - /* - * This is set to true whenever the robot is in defense mode - * All wheels are set to an 'x' pattern so the robot can't be pushed - */ - - public static boolean calibrate; - /* - * Set to true when the robot is calibrating - * Set to false otherwise - */ - - public static double shoulderPower; - /* - * This is the current power of the shoulder motor - */ - public static double elbowPower; - /* - * This is the current power of the elbow motor - */ - - public static double shoulderAngle; - /* - * The current angle of the shoulder motor - * This is in degrees - */ - public static double elbowAngle; - /* - * The current angle of the elbow motor - * This is in degrees - */ - - public static double desiredShoulderAngle; - /* - * The desired angle of the shoulder motor - * This is in degrees - */ - public static double desiredElbowAngle; - /* - * The desired angle of the elbow motor - * This is in degrees - */ - - public static double robotPitch; - /* - * Current pitch of the robot - * Gathered from the NavX - */ - public static double robotRoll; - /* - * Current roll of the robot - * Gathered from the NavX - */ - - // Autonomous Varaibles - public static int counter; - /* - * This is a counter that is used in the autonomous class - * It is used to keep track of the current state of the state machine - */ -} diff --git a/2022-2023/main-bot/src/main/java/frc/components/Arm.java b/2022-2023/main-bot/src/main/java/frc/components/Arm.java deleted file mode 100755 index c3ee00b..0000000 --- a/2022-2023/main-bot/src/main/java/frc/components/Arm.java +++ /dev/null @@ -1,53 +0,0 @@ -package frc.components; - -import com.ctre.phoenix.motorcontrol.ControlMode; -import com.ctre.phoenix.motorcontrol.can.TalonFX; -import frc.CommonData; -import frc.robot.Utility; -import frc.settings.ArmSettings; - -public class Arm implements IComponent { - - public enum Position { - /* - * This is the positions or 'presets' of the arms - */ - - kTopShelf(-85465, 99934), - kMiddleShelfOrHumanPlayer(-30156, 152244), - kGroundPickup(10411, 26723), - kHome(-32405, 941), - kHumanPlayerStation(-55821, 45126); - - Position(double presetShoulderPos, double presetElbowPos) { - shoulderPos = presetShoulderPos; - elbowPos = presetElbowPos; - } - - public double shoulderPos; - public double elbowPos; - } - - public Arm(ArmSettings settings) { - shoulderMotor = new TalonFX(settings.shoulderMotorID); - elbowMotor = new TalonFX(settings.elbowMotorID); - } - - TalonFX shoulderMotor; - TalonFX elbowMotor; - - public void moveToPOS() { - CommonData.shoulderAngle = shoulderMotor.getSelectedSensorPosition(); - CommonData.elbowAngle = elbowMotor.getSelectedSensorPosition(); - - var actualShoulderTarget = Utility.clamp(CommonData.desiredShoulderAngle, -91250, 52915); - var actualElbowTarget = Utility.clamp(CommonData.desiredElbowAngle, -645, 189514); - - shoulderMotor.set(ControlMode.Position, actualShoulderTarget); - elbowMotor.set(ControlMode.Position, actualElbowTarget); - } - - public void update() { - moveToPOS(); - } -} diff --git a/2022-2023/main-bot/src/main/java/frc/components/Claw.java b/2022-2023/main-bot/src/main/java/frc/components/Claw.java deleted file mode 100755 index faa3266..0000000 --- a/2022-2023/main-bot/src/main/java/frc/components/Claw.java +++ /dev/null @@ -1,66 +0,0 @@ -package frc.components; - -import edu.wpi.first.wpilibj.DoubleSolenoid; -import edu.wpi.first.wpilibj.DoubleSolenoid.Value; -import edu.wpi.first.wpilibj.PneumaticsModuleType; -import frc.CommonData; -import frc.settings.ClawSettings; - -/* - * 'public': This class can be accessed outside of this folder. - * 'class': This can contain variables and functionality. - * 'Claw': The name of this particular class. This is treated as a TYPE. - * 'implements': This class implements an interface, or more than one. This class must implement the methods described - * in the interface. - * 'IComponent': The name of the interface this class implements. This can be more than one, separated by commas. - */ -public class Claw implements IComponent { - - /* - * 'public': This enum can be accessed outside this class. - * 'enum': A conventiently-named list of constants, in lieu of saying '1', '2', '3'... by giving each value a - * meaningful name. An enum is actually capable of more than this, but this is its most used form. - * 'State': The name of this particular enum. This is treated as a TYPE. - */ - public enum State { - kOpen, - kClosed, - } - - /* - * 'private': This variable cannot be accessed outside this class, nor by any potential child classes. - * 'DoubleSolenoid': the TYPE of data this variable is. - * 'm_solenoid': A custom name for this variable. Uses the convention that member variables begin with 'm_'. - */ - private DoubleSolenoid m_solenoid; - - /* - * 'public': This constructor can be accessed outside this class. - * 'Claw': The same name as the class. A "method-looking" declaration that uses the same name as the class is a - * constructor. Constructors do NOT specify a return type, not even 'void'. - * '(...)': This constructor accepts 3 arguments. - * '(int _, int _, int _)': Each argument is an 'int'. Generally, arguments need not all be the same type. - * '(_ pneumaticsModuleId, _ openingPortId, _ closingPortId)': Each argument's name. These are variables. - */ - public Claw(ClawSettings settings) { - m_solenoid = new DoubleSolenoid(settings.pneumaticsModuleId, PneumaticsModuleType.REVPH, settings.openingPortId, settings.closingPortId); - } - - /* - * 'public': This method can be called by code outside this class. - * 'void': This method does not return anything. - * 'update': The name of this method. - * '()': This method accepts 0 arguments. - */ - public void update() { - // This method will be called periodically. - // This assumes that 'CommonData.ClawState' updates elsewhere before this is called. - switch (CommonData.clawState) { - case kOpen: - m_solenoid.set(Value.kForward); // piston pushes forward -> claw opens - break; - case kClosed: - m_solenoid.set(Value.kReverse); // piston pulls back -> claw closes - } - } -} diff --git a/2022-2023/main-bot/src/main/java/frc/components/IComponent.java b/2022-2023/main-bot/src/main/java/frc/components/IComponent.java deleted file mode 100755 index b04a23c..0000000 --- a/2022-2023/main-bot/src/main/java/frc/components/IComponent.java +++ /dev/null @@ -1,19 +0,0 @@ -package frc.components; - -/* - * 'public': This class can be accessed outside of this folder. - * 'interface': This can contain method declarations without their definitions. Any class that implements this - * interface MUST implement all methods this interface describes. Otherwise, the compiler reports an - * error. - * 'IComponent': The name of this particular interface. - */ -public interface IComponent { - /* - * 'public': This method can be accessed outside this class. - * 'void': This method does not return anything. - * 'update': This method is called "update". - * '()': This method accepts no arguments. - * ';' This method contains no body; it is not defined (only declared); it is not implemented. - */ - public void update(); -} diff --git a/2022-2023/main-bot/src/main/java/frc/components/README.md b/2022-2023/main-bot/src/main/java/frc/components/README.md deleted file mode 100755 index 6e1e7ce..0000000 --- a/2022-2023/main-bot/src/main/java/frc/components/README.md +++ /dev/null @@ -1,8 +0,0 @@ -# Structure of components - -Each component should implement an `update` function, as specified in -`IComponent`. What each component does in its `update` depends on that -component. For instance, a controller component may fetch all the data -it needs and fill out relevant sections of a common `data` object. A -drive component may fetch the values from the common `data` object and -drive accordingly. \ No newline at end of file diff --git a/2022-2023/main-bot/src/main/java/frc/components/SwerveDrive.java b/2022-2023/main-bot/src/main/java/frc/components/SwerveDrive.java deleted file mode 100755 index 5cbd129..0000000 --- a/2022-2023/main-bot/src/main/java/frc/components/SwerveDrive.java +++ /dev/null @@ -1,84 +0,0 @@ -package frc.components; - -import com.kauailabs.navx.frc.AHRS; -import edu.wpi.first.math.geometry.Rotation2d; -import edu.wpi.first.math.kinematics.ChassisSpeeds; -import edu.wpi.first.math.kinematics.SwerveDriveKinematics; -import edu.wpi.first.wpilibj.SPI; -import frc.CommonData; -import frc.robot.Utility; -import frc.settings.SwerveDriveSettings; - -public class SwerveDrive implements IComponent { - final static double maximumSpeed = (6380 * 0.3191858136) / 60 / 3; - final static double maximumRotation = (maximumSpeed * 2 * Math.PI) / 2.7389195456 / 2; - - double yawOffset = 0; - - public SwerveDrive(SwerveDriveSettings settings) { - swerveWheels = new SwerveWheel[] { - new SwerveWheel(settings.FLSwerve), - new SwerveWheel(settings.FRSwerve), - new SwerveWheel(settings.BLSwerve), - new SwerveWheel(settings.BRSwerve)}; - - kinematics = new SwerveDriveKinematics(swerveWheels[0].getSwervePos(), swerveWheels[1].getSwervePos(), swerveWheels[2].getSwervePos(), swerveWheels[3].getSwervePos()); - } - - SwerveWheel[] swerveWheels; - - double leftOrRight; - double forwardOrBack; - - AHRS ahrs = new AHRS(SPI.Port.kMXP); - - SwerveDriveKinematics kinematics; - - public void balance() { - final double maximumTiltAngle = 12.81974281; - - forwardOrBack = Math.abs(CommonData.robotPitch) > 10 ? CommonData.robotPitch / maximumTiltAngle : 0; - leftOrRight = Math.abs(CommonData.robotRoll) > 10 ? CommonData.robotRoll / maximumTiltAngle : 0; - - Utility.printLn("" + forwardOrBack); - final var desiredTranslationSpeedX = forwardOrBack * -maximumSpeed; // This code uses '+x' as toward opposing alliance wall - final var desiredTranslationSpeedY = 0; // This code uses '+y' as toward driver's right - final var desiredRotationSpeed = -leftOrRight * maximumRotation; - var moduleStates = kinematics.toSwerveModuleStates(ChassisSpeeds.fromFieldRelativeSpeeds(desiredTranslationSpeedX, desiredTranslationSpeedY, desiredRotationSpeed, Rotation2d.fromDegrees(ahrs.getYaw() - yawOffset))); - - for (int i = 0; i < 4; i++) { - moduleStates[i].speedMetersPerSecond *= 0.1; - swerveWheels[i].set(moduleStates[i]); - } - } - - public void update() { - CommonData.robotPitch = ahrs.getPitch(); - CommonData.robotRoll = ahrs.getRoll(); - - // Calabrate The NavX - if (CommonData.calibrate == true) { - CommonData.calibrate = false; - yawOffset = ahrs.getYaw(); - } - - if (CommonData.battenDownTheHatches) { - for (int i = 0; i < 4; i++) { - swerveWheels[i].defense(); - } - } - else if (CommonData.balance) { - balance(); - } - else { - final var desiredTranslationSpeedX = CommonData.forwardSpeed * maximumSpeed; // This code uses '+x' as toward opposing alliance wall - final var desiredTranslationSpeedY = -CommonData.sideSpeed * maximumSpeed; // This code uses '+y' as toward driver's right - final var desiredRotationSpeed = -CommonData.desiredTurn * maximumRotation; - var moduleStates = kinematics.toSwerveModuleStates(ChassisSpeeds.fromFieldRelativeSpeeds(desiredTranslationSpeedX, desiredTranslationSpeedY, desiredRotationSpeed, Rotation2d.fromDegrees(ahrs.getYaw()))); - - for (int i = 0; i < 4; i++) { - swerveWheels[i].set(moduleStates[i]); - } - } - } -} \ No newline at end of file diff --git a/2022-2023/main-bot/src/main/java/frc/components/SwerveWheel.java b/2022-2023/main-bot/src/main/java/frc/components/SwerveWheel.java deleted file mode 100755 index 25f4d31..0000000 --- a/2022-2023/main-bot/src/main/java/frc/components/SwerveWheel.java +++ /dev/null @@ -1,70 +0,0 @@ -package frc.components; - -import com.ctre.phoenix.motorcontrol.ControlMode; -import com.ctre.phoenix.motorcontrol.can.TalonFX; -import com.ctre.phoenix.sensors.CANCoder; -import edu.wpi.first.math.geometry.Rotation2d; -import edu.wpi.first.math.geometry.Translation2d; -import edu.wpi.first.math.kinematics.SwerveModuleState; -import frc.settings.SwerveWheelSettings; -import frc.settings.SwerveWheelSettings.Location; - -public class SwerveWheel { - TalonFX turnMotor; - TalonFX driveMotor; - CANCoder encoder; - - // 0.238125 Meters - // 0.365125 Meters - - Translation2d modulePos; - - double defensiveAngle; - - Location location; - - public SwerveWheel(SwerveWheelSettings settings) { - turnMotor = new TalonFX(settings.turnID); - driveMotor = new TalonFX(settings.driveID); - encoder = new CANCoder(settings.encoderID); - - location = settings.location; - defensiveAngle = settings.defensiveAngle; - - modulePos = new Translation2d(settings.posX, settings.posY); - } - - public void set(SwerveModuleState swerveModuleState) { - swerveModuleState = SwerveModuleState.optimize(swerveModuleState, Rotation2d.fromDegrees(turnMotor.getSelectedSensorPosition() / 11.3777778)); - double maximumSpeed = (6380 * 0.3191858136) / 60 / 3; - - final double desiredTurnPos = swerveModuleState.angle.getDegrees() * 11.3777778; // conversion from degrees to native encoder value - - turnMotor.set(ControlMode.Position, desiredTurnPos); - - driveMotor.set(ControlMode.PercentOutput, swerveModuleState.speedMetersPerSecond / maximumSpeed); - // Using Velocity Can Be Used For Better Control But Percent Output Is Better Used For Practice - } - - public void defense() { - turnMotor.set(ControlMode.Position, defensiveAngle * 11.77777777); - driveMotor.set(ControlMode.PercentOutput, 0); - } - - public TalonFX getTurnMotor() { - return turnMotor; - } - - public TalonFX getDriveMotor() { - return driveMotor; - } - - public Translation2d getSwervePos() { - return modulePos; - } - - // public void battenDownTheHatches() - // { - // set(defensiveAngle, 0, 0); - // } -} \ No newline at end of file diff --git a/2022-2023/main-bot/src/main/java/frc/components/autonomous/ArmState1.java b/2022-2023/main-bot/src/main/java/frc/components/autonomous/ArmState1.java deleted file mode 100755 index 97c82f9..0000000 --- a/2022-2023/main-bot/src/main/java/frc/components/autonomous/ArmState1.java +++ /dev/null @@ -1,43 +0,0 @@ -package frc.components.autonomous; - -import frc.CommonData; -// import frc.robot.Utility; -import frc.state_machine.State; - -public class ArmState1 extends State { - - private static final double targetShoulderAngle = -75563; - private static final double targetElbowAngle = 109928; - - private static final double shoulderThreshold = 500; - private static final double elbowThreshold = 500; - - private static final double shoulderPower = 0.2; - private static final double elbowPower = 0.2; - - @Override - public void onEnter() { - System.out.println("Arm State 1 entered"); - } - - @Override - public void onExit() { - System.out.println("Arm State 1 exited"); - } - - @Override - public boolean run() { - CommonData.desiredShoulderAngle = targetShoulderAngle; - CommonData.desiredElbowAngle = targetElbowAngle; - - final double shoulderError = targetShoulderAngle - CommonData.shoulderAngle; - final double elbowError = targetElbowAngle - CommonData.elbowAngle; - - if (Math.abs(elbowError) < 400 && Math.abs(shoulderError) < 400) { - return true; - } - else { - return false; - } - } -} diff --git a/2022-2023/main-bot/src/main/java/frc/components/autonomous/ArmState2.java b/2022-2023/main-bot/src/main/java/frc/components/autonomous/ArmState2.java deleted file mode 100755 index aa7a65b..0000000 --- a/2022-2023/main-bot/src/main/java/frc/components/autonomous/ArmState2.java +++ /dev/null @@ -1,34 +0,0 @@ -package frc.components.autonomous; - -import edu.wpi.first.wpilibj.Timer; -import frc.CommonData; -import frc.components.Claw; -import frc.state_machine.State; - -public class ArmState2 extends State { - Timer timer = new Timer(); - - @Override - public void onEnter() { - System.out.println("Arm State 2 entered"); - timer.start(); - } - - @Override - public void onExit() { - System.out.println("Arm State 2 exited"); - } - - @Override - public boolean run() { - if (timer.hasElapsed(1)) { - CommonData.counter++; - return true; - } - else if (timer.hasElapsed(0.5)) { - CommonData.clawState = Claw.State.kOpen; - } - - return false; - } -} diff --git a/2022-2023/main-bot/src/main/java/frc/components/autonomous/ArmState3.java b/2022-2023/main-bot/src/main/java/frc/components/autonomous/ArmState3.java deleted file mode 100755 index acafd99..0000000 --- a/2022-2023/main-bot/src/main/java/frc/components/autonomous/ArmState3.java +++ /dev/null @@ -1,41 +0,0 @@ -package frc.components.autonomous; - -import frc.CommonData; -import frc.state_machine.State; - -public class ArmState3 extends State { - private static final double targetShoulderAngle = -18610; // Placeholder - private static final double targetElbowAngle = -645; // Placeholder - - private static final double shoulderThreshold = 500; - private static final double elbowThreshold = 500; - - private static final double shoulderPower = 0.2; - private static final double elbowPower = 0.2; - - @Override - public void onEnter() { - System.out.println("Arm State 3 entered"); - } - - @Override - public void onExit() { - System.out.println("Arm State 3 exited"); - } - - @Override - public boolean run() { - CommonData.desiredShoulderAngle = targetShoulderAngle; - CommonData.desiredElbowAngle = targetElbowAngle; - - final double shoulderError = targetShoulderAngle - CommonData.shoulderAngle; - final double elbowError = targetElbowAngle - CommonData.elbowAngle; - - if (Math.abs(elbowError) < 400 && Math.abs(shoulderError) < 400) { - return true; - } - else { - return false; - } - } -} diff --git a/2022-2023/main-bot/src/main/java/frc/components/autonomous/Autonomous.java b/2022-2023/main-bot/src/main/java/frc/components/autonomous/Autonomous.java deleted file mode 100755 index 7321b91..0000000 --- a/2022-2023/main-bot/src/main/java/frc/components/autonomous/Autonomous.java +++ /dev/null @@ -1,28 +0,0 @@ -package frc.components.autonomous; - -import frc.components.IComponent; -import frc.state_machine.StateMachine; - -public class Autonomous implements IComponent { - StateMachine m_stateMachine = new StateMachine(); - - public Autonomous() { - // m_driveStateMachine.addState(new DriveState1()); - // m_driveStateMachine.addState(new DriveState2()); - - // VV Balancing code -- UNCOMMENT TO TEST THIS CODE AT AN OFFICIAL COMPETITION - COMMENT AGAIN IF IT DOES NOT WORK - // m_driveStateMachine.addState(new DriveState5()); - // ^^ Balancing code - - m_stateMachine.addState(new ArmState1()); // Move arm to drop box - m_stateMachine.addState(new ArmState2()); // Drop box - m_stateMachine.addState(new ArmState3()); // Move arm to reset - m_stateMachine.addState(new DriveState3()); // Move to balance or taxi - m_stateMachine.addState(new DriveState6()); // Balance - } - - @Override - public void update() { - m_stateMachine.run(); - } -} diff --git a/2022-2023/main-bot/src/main/java/frc/components/autonomous/DriveState1.java b/2022-2023/main-bot/src/main/java/frc/components/autonomous/DriveState1.java deleted file mode 100755 index 5fb12ff..0000000 --- a/2022-2023/main-bot/src/main/java/frc/components/autonomous/DriveState1.java +++ /dev/null @@ -1,44 +0,0 @@ -package frc.components.autonomous; - -import edu.wpi.first.networktables.NetworkTable; -import edu.wpi.first.networktables.NetworkTableEntry; -import edu.wpi.first.networktables.NetworkTableInstance; -import edu.wpi.first.wpilibj.Timer; -import frc.CommonData; -import frc.state_machine.State; - -public class DriveState1 extends State { - NetworkTable table = NetworkTableInstance.getDefault().getTable("limelight"); - NetworkTableEntry tv = table.getEntry("tv"); - - Timer timer; - - @Override - public void onEnter() { - System.out.println("Drive State 1 entered"); - } - @Override - public void onExit() { - System.out.println("Drive State 1 exited"); - } - - @Override - public boolean run() { - CommonData.forwardSpeed = -0.1; - - boolean targetFound = tv.getDouble(0) == 1; - if (targetFound) { - if (timer == null) { - timer = new Timer(); - timer.start(); - } - else if (timer.hasElapsed(0.1)) { - return true; - } - } - else { - timer = null; - } - return false; - } -} diff --git a/2022-2023/main-bot/src/main/java/frc/components/autonomous/DriveState2.java b/2022-2023/main-bot/src/main/java/frc/components/autonomous/DriveState2.java deleted file mode 100755 index c0f918a..0000000 --- a/2022-2023/main-bot/src/main/java/frc/components/autonomous/DriveState2.java +++ /dev/null @@ -1,68 +0,0 @@ -package frc.components.autonomous; - -import edu.wpi.first.networktables.NetworkTable; -import edu.wpi.first.networktables.NetworkTableEntry; -import edu.wpi.first.networktables.NetworkTableInstance; -import frc.CommonData; -import frc.robot.Utility; -import frc.state_machine.State; - -public class DriveState2 extends State { - - NetworkTable table = NetworkTableInstance.getDefault().getTable("limelight"); - NetworkTableEntry tv = table.getEntry("tv"); - NetworkTableEntry array = table.getEntry("camerapose_targetspace"); - - @Override - public void onEnter() { - System.out.println("Drive State 2 entered"); - } - @Override - public void onExit() { - System.out.println("Drive State 2 exited"); - } - - @Override - public boolean run() { - boolean found = tv.getDouble(0) == 1; - - double tx = 0; - double tz = 0; - double ry = 0; - // CommonData.desiredHeading = 0; - // CommonData.desiredPower = 0; - CommonData.desiredTurn = 0; - if (found) { - Double[] targetInfo = array.getDoubleArray(new Double[0]); - - tx = targetInfo[0]; // tx - tz = targetInfo[2] + .5; // tz - ry = targetInfo[4]; // ry - - tx = Utility.sigmoid(tx * 2) * 2 - 1; - tz = Utility.clamp(tz, -1.0, 1.0); - ry = Utility.sigmoid(ry / 10) * 2 - 1; - Utility.printLn("TX: " + tx + " TZ: " + tz + " RY: " + ry); - - if ((Math.abs(tz) < 0.1) && (Math.abs(tx) < 0.15) && (Math.abs(ry) < 0.6)) { - CommonData.counter++; - return true; - } - else { - // Drive Until Center And Lined Up With The April Tag - double theta = Math.atan2(tx, tz); - double degrees = Math.toDegrees(theta) + 180; - double power = Math.sqrt(Math.pow(tx, 2) + Math.pow(tz, 2)); - - if (tx == 0 && tz == 0) { - degrees = 0; - } - - // CommonData.desiredHeading = degrees; - // CommonData.desiredPower = power; - CommonData.desiredTurn = ry; - } - } - return false; - } -} diff --git a/2022-2023/main-bot/src/main/java/frc/components/autonomous/DriveState3.java b/2022-2023/main-bot/src/main/java/frc/components/autonomous/DriveState3.java deleted file mode 100755 index dc4cf1f..0000000 --- a/2022-2023/main-bot/src/main/java/frc/components/autonomous/DriveState3.java +++ /dev/null @@ -1,53 +0,0 @@ -package frc.components.autonomous; - -import edu.wpi.first.networktables.NetworkTable; -import edu.wpi.first.networktables.NetworkTableEntry; -import edu.wpi.first.networktables.NetworkTableInstance; -import edu.wpi.first.wpilibj.Timer; -import frc.CommonData; -import frc.state_machine.State; - -public class DriveState3 extends State { - NetworkTable table = NetworkTableInstance.getDefault().getTable("limelight"); - NetworkTableEntry tid = table.getEntry("tid"); - NetworkTableEntry tv = table.getEntry("tv"); - Timer timer; - Timer timer2; - - @Override - public void onEnter() { - System.out.println("Drive State 3 entered"); - } - @Override - public void onExit() { - System.out.println("Drive State 3 exited"); - } - - @Override - public boolean run() { - CommonData.forwardSpeed = -0.35; - CommonData.desiredTurn = 0; - - if (CommonData.robotPitch > 10 || CommonData.robotRoll > 10) { - if (timer2 == null) { - System.out.println("Pitch: " + CommonData.robotPitch + " Roll: " + CommonData.robotRoll); - timer2 = new Timer(); - timer2.start(); - } - if (timer2.hasElapsed(1)) { - System.out.println("Tilted!"); - return true; - } - } - - if (timer == null) { - timer = new Timer(); - timer.start(); - } - else if (timer.hasElapsed(3)) { - return true; - } - - return false; - } -} diff --git a/2022-2023/main-bot/src/main/java/frc/components/autonomous/DriveState4.java b/2022-2023/main-bot/src/main/java/frc/components/autonomous/DriveState4.java deleted file mode 100755 index 50b4ee2..0000000 --- a/2022-2023/main-bot/src/main/java/frc/components/autonomous/DriveState4.java +++ /dev/null @@ -1,68 +0,0 @@ -package frc.components.autonomous; - -import edu.wpi.first.networktables.NetworkTable; -import edu.wpi.first.networktables.NetworkTableEntry; -import edu.wpi.first.networktables.NetworkTableInstance; -import frc.CommonData; -import frc.robot.Utility; -import frc.state_machine.State; - -public class DriveState4 extends State { - NetworkTable table = NetworkTableInstance.getDefault().getTable("limelight"); - NetworkTableEntry tv = table.getEntry("tv"); - NetworkTableEntry tid = table.getEntry("tid"); - NetworkTableEntry array = table.getEntry("camerapose_targetspace"); - - @Override - public void onEnter() { - System.out.println("Drive State 4 entered"); - } - @Override - public void onExit() { - System.out.println("Drive State 4 exited"); - } - - @Override - public boolean run() { - boolean found = tv.getDouble(0) == 1; - double id = tid.getDouble(-1); - - double tx = 0; - double tz = 0; - double ry = 0; - // CommonData.desiredHeading = 0; - // CommonData.desiredPower = 0; - CommonData.desiredTurn = 0; - if (found && (id == 2) || (id == 7)) { - Double[] targetInfo = array.getDoubleArray(new Double[0]); - - tx = targetInfo[0]; // tx - tz = targetInfo[2] + .5; // tz - ry = targetInfo[4]; // ry - - tx = Utility.sigmoid(tx * 2) * 2 - 1; - tz = Utility.clamp(tz, -1.0, 1.0); - ry = Utility.sigmoid(ry / 10) * 2 - 1; - - if ((Math.abs(tz) < 0.1) && (Math.abs(tx) < 0.15) && (Math.abs(ry) < 0.6)) { - return true; - } - else { - // Drive Until Center And Lined Up With The April Tag - double theta = Math.atan2(tx, tz); - double degrees = Math.toDegrees(theta) + 180; - double power = Math.sqrt(Math.pow(tx, 2) + Math.pow(tz, 2)); - - if (tx == 0 && tz == 0) - { - degrees = 0; - } - - // CommonData.desiredHeading = degrees; - // CommonData.desiredPower = power; - CommonData.desiredTurn = ry; - } - } - return false; - } -} diff --git a/2022-2023/main-bot/src/main/java/frc/components/autonomous/DriveState5.java b/2022-2023/main-bot/src/main/java/frc/components/autonomous/DriveState5.java deleted file mode 100755 index 920d3d4..0000000 --- a/2022-2023/main-bot/src/main/java/frc/components/autonomous/DriveState5.java +++ /dev/null @@ -1,36 +0,0 @@ -package frc.components.autonomous; - -import edu.wpi.first.networktables.NetworkTable; -import edu.wpi.first.networktables.NetworkTableEntry; -import edu.wpi.first.networktables.NetworkTableInstance; -import frc.CommonData; -import frc.robot.Utility; -import frc.state_machine.State; - -public class DriveState5 extends State { - NetworkTable table = NetworkTableInstance.getDefault().getTable("limelight"); - NetworkTableEntry tv = table.getEntry("tv"); - NetworkTableEntry tid = table.getEntry("tid"); - NetworkTableEntry array = table.getEntry("camerapose_targetspace"); - - @Override - public void onEnter() { - System.out.println("Drive State 5 entered"); - } - @Override - public void onExit() { - System.out.println("Drive State 5 exited"); - } - - @Override - public boolean run() { - if (CommonData.robotPitch > 2 || CommonData.robotRoll > 2) { - return true; - } - else { - CommonData.forwardSpeed = -0.3; - CommonData.desiredTurn = 0; - return false; - } - } -} \ No newline at end of file diff --git a/2022-2023/main-bot/src/main/java/frc/components/autonomous/DriveState6.java b/2022-2023/main-bot/src/main/java/frc/components/autonomous/DriveState6.java deleted file mode 100755 index 02e5d48..0000000 --- a/2022-2023/main-bot/src/main/java/frc/components/autonomous/DriveState6.java +++ /dev/null @@ -1,21 +0,0 @@ -package frc.components.autonomous; - -import frc.CommonData; -import frc.state_machine.State; - -public class DriveState6 extends State { - @Override - public void onEnter() { - System.out.println("Drive State 6 entered"); - } - @Override - public void onExit() { - System.out.println("Drive State 6 exited"); - } - - @Override - public boolean run() { - CommonData.balance = true; - return false; - } -} diff --git a/2022-2023/main-bot/src/main/java/frc/controllers/LogitechF310.java b/2022-2023/main-bot/src/main/java/frc/controllers/LogitechF310.java deleted file mode 100755 index 78c4848..0000000 --- a/2022-2023/main-bot/src/main/java/frc/controllers/LogitechF310.java +++ /dev/null @@ -1,150 +0,0 @@ -package frc.controllers; - -import edu.wpi.first.wpilibj.Joystick; -import java.lang.Math; - -public class LogitechF310 { - // Imported From Code/2022/stingr/main-bot - - private final int kIdButtonA = 1; - private final int kIdButtonB = 2; - private final int kIdButtonX = 3; - private final int kIdButtonY = 4; - private final int kIdButtonBumperLeft = 5; - private final int kIdButtonBumperRight = 6; - private final int kIdAxisleftX = 0; - private final int kIdAxisleftY = 1; - private final int kIdAxisrightX = 4; - private final int kIdAxisrightY = 5; - private final int kIdlefttrigger = 2; - private final int kIdrighttrigger = 3; - private final int kIdDpad = 0; - - // ... - - private Joystick controller; - - public double deadBand(double value) { - return Math.abs(value) < 0.2 ? 0 : value; - } - - public LogitechF310(int id) { - controller = new Joystick(id); - } - - public boolean getA() { - return controller.getRawButton(kIdButtonA); - } - - public boolean getB() { - return controller.getRawButton(kIdButtonB); - } - - public boolean getX() { - return controller.getRawButton(kIdButtonX); - } - - public boolean getY() { - return controller.getRawButton(kIdButtonY); - } - - public boolean getLeftBumper() { - return controller.getRawButton(kIdButtonBumperLeft); - } - - public boolean getRightBumper() { - return controller.getRawButton(kIdButtonBumperRight); - } - - public double getLeftStickX() { - return deadBand(controller.getRawAxis(kIdAxisleftX)); - } - - public double getLeftStickY() { - return deadBand(controller.getRawAxis(kIdAxisleftY)); - } - - public double getRightStickX() { - return deadBand(controller.getRawAxis(kIdAxisrightX)); - } - - public double getRightStickY() { - return deadBand(controller.getRawAxis(kIdAxisrightY)); - } - - public double getLeftTrigger() { - return controller.getRawAxis(kIdlefttrigger); - } - - public double getRightTrigger() { - return controller.getRawAxis(kIdrighttrigger); - } - - public boolean getDUp() { - int degrees = controller.getPOV(kIdDpad); - if (degrees == 315) { - return true; - } - - if (degrees == 0) { - return true; - } - - if (degrees == 45) { - return true; - } - - return false; - } - - public boolean getDRight() { - int degrees = controller.getPOV(kIdDpad); - if (degrees == 45) { - return true; - } - - if (degrees == 90) { - return true; - } - - if (degrees == 135) { - return true; - } - - return false; - } - - public boolean getDDown() { - int degrees = controller.getPOV(kIdDpad); - if (degrees == 135) { - return true; - } - - if (degrees == 180) { - return true; - } - - if (degrees == 225) { - return true; - } - - return false; - } - - public boolean getDLeft() { - int degrees = controller.getPOV(kIdDpad); - if (degrees == 225) { - return true; - } - - if (degrees == 270) { - return true; - } - - if (degrees == 315) { - return true; - } - - return false; - } -} diff --git a/2022-2023/main-bot/src/main/java/frc/controllers/Xbox360.java b/2022-2023/main-bot/src/main/java/frc/controllers/Xbox360.java deleted file mode 100755 index 69d026d..0000000 --- a/2022-2023/main-bot/src/main/java/frc/controllers/Xbox360.java +++ /dev/null @@ -1,146 +0,0 @@ -package frc.controllers; - -import edu.wpi.first.wpilibj.GenericHID.RumbleType; -import edu.wpi.first.wpilibj.Joystick; -import java.lang.Math; - -public class Xbox360 -{ - - public Xbox360(int ID) { - joystick = new Joystick(ID); - } - - Joystick joystick; - - public double deadBand(double value) { - return Math.abs(value) < 0.175 ? 0 : value; - } - - public double getLeftStickX() { - return deadBand(joystick.getRawAxis(0)); - } - - public double getLeftStickY() { - return deadBand(joystick.getRawAxis(1)); - } - - public double getRightStickX() { - return deadBand(joystick.getRawAxis(4)); - } - - public double getRightStickY() { - return deadBand(joystick.getRawAxis(5)); - } - - public boolean getA() { - return joystick.getRawButton(1); - } - - public boolean getB() { - return joystick.getRawButton(2); - } - - public boolean getX() { - return joystick.getRawButton(3); - } - - public boolean getY() { - return joystick.getRawButton(4); - } - - public boolean getLB() { - return joystick.getRawButton(5); - } - - public boolean getRB() { - return joystick.getRawButton(6); - } - - public boolean getBack() { - return joystick.getRawButton(7); - } - - public boolean getStart() { - return joystick.getRawButton(8); - } - - public boolean getLeftStick() { - return joystick.getRawButton(9); - } - - public boolean getRightStick() { - return joystick.getRawButton(10); - } - - public double getLeftTrigger() { - return joystick.getRawAxis(2); - } - - public double getRightTrigger() { - return joystick.getRawAxis(3); - } - - public enum dPad { - up, - down, - left, - right, - upright, - upleft, - downright, - downleft, - none - } - - public dPad getPad() { - switch (joystick.getPOV()) - { - case 0: - return dPad.up; - - case 360: - return dPad.up; - - case 90: - return dPad.right; - - case 180: - return dPad.down; - - case 270: - return dPad.left; - - case 45: - return dPad.upright; - - case 135: - return dPad.downright; - - case 225: - return dPad.downleft; - - case 315: - return dPad.upleft; - - default: - return dPad.none; - } - } - - public void rumbleHigh() { - joystick.setRumble(RumbleType.kRightRumble, 1); - } - - public void rumbleLow() { - joystick.setRumble(RumbleType.kLeftRumble, 1); - } - - public void letsGetReadyToRumble() { - joystick.setRumble(RumbleType.kBothRumble, 1); - } - - public void rumbleOff() { - joystick.setRumble(RumbleType.kBothRumble, 0); - } -} diff --git a/2022-2023/main-bot/src/main/java/frc/controllers/XboxOne.java b/2022-2023/main-bot/src/main/java/frc/controllers/XboxOne.java deleted file mode 100644 index 029b779..0000000 --- a/2022-2023/main-bot/src/main/java/frc/controllers/XboxOne.java +++ /dev/null @@ -1,147 +0,0 @@ -package frc.controllers; - -import edu.wpi.first.wpilibj.GenericHID.RumbleType; -import edu.wpi.first.wpilibj.Joystick; -import java.lang.Math; - -public class XboxOne -{ - - public XboxOne(int ID) { - joystick = new Joystick(ID); - } - - Joystick joystick; - - public double deadBand(double value) { - return Math.abs(value) < 0 ? 0 : value; // Set deadband to 0 as this controller doesn't have drift - } - - public double getLeftStickX() { - return deadBand(joystick.getRawAxis(0)); - } - - public double getLeftStickY() { - return deadBand(joystick.getRawAxis(1)); - } - - public double getRightStickX() { - return deadBand(joystick.getRawAxis(4)); - } - - public double getRightStickY() { - return deadBand(joystick.getRawAxis(5)); - } - - public boolean getA() { - return joystick.getRawButton(1); - } - - public boolean getB() { - return joystick.getRawButton(2); - } - - public boolean getX() { - return joystick.getRawButton(3); - } - - public boolean getY() { - return joystick.getRawButton(4); - } - - public boolean getLB() { - return joystick.getRawButton(5); - } - - public boolean getRB() { - return joystick.getRawButton(6); - } - - public boolean getBack() { - return joystick.getRawButton(7); - } - - public boolean getStart() { - return joystick.getRawButton(8); - } - - public boolean getLeftStick() - { - return joystick.getRawButton(9); - } - - public boolean getRightStick() { - return joystick.getRawButton(10); - } - - public double getLeftTrigger() { - return joystick.getRawAxis(2); - } - - public double getRightTrigger() { - return joystick.getRawAxis(3); - } - - public enum dPad { - up, - down, - left, - right, - upright, - upleft, - downright, - downleft, - none - } - - public dPad getPad() { - switch (joystick.getPOV()) - { - case 0: - return dPad.up; - - case 360: - return dPad.up; - - case 90: - return dPad.right; - - case 180: - return dPad.down; - - case 270: - return dPad.left; - - case 45: - return dPad.upright; - - case 135: - return dPad.downright; - - case 225: - return dPad.downleft; - - case 315: - return dPad.upleft; - - default: - return dPad.none; - } - } - - public void rumbleHigh() { - joystick.setRumble(RumbleType.kRightRumble, 1); - } - - public void rumbleLow() { - joystick.setRumble(RumbleType.kLeftRumble, 1); - } - - public void letsGetReadyToRumble() { - joystick.setRumble(RumbleType.kBothRumble, 1); - } - - public void rumbleOff() { - joystick.setRumble(RumbleType.kBothRumble, 0); - } -} diff --git a/2022-2023/main-bot/src/main/java/frc/robot/Robot.java b/2022-2023/main-bot/src/main/java/frc/robot/Robot.java deleted file mode 100755 index 2d5b738..0000000 --- a/2022-2023/main-bot/src/main/java/frc/robot/Robot.java +++ /dev/null @@ -1,200 +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 com.fasterxml.jackson.databind.ObjectMapper; -import edu.wpi.first.wpilibj.Compressor; -import edu.wpi.first.wpilibj.Filesystem; -import edu.wpi.first.wpilibj.PneumaticsModuleType; -import edu.wpi.first.wpilibj.TimedRobot; -import frc.CommonData; -import frc.components.Arm; -import frc.components.Claw; -import frc.components.IComponent; -import frc.components.SwerveDrive; -import frc.components.autonomous.Autonomous; -import frc.controllers.LogitechF310; -import frc.controllers.Xbox360; -import frc.settings.Settings; -import java.io.IOException; - -/** - * 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 { - /* - * Constants should go here. For example: - * - * final int kMainControllerId = 0; - * final int kAuxControllerId = 1; - * - * final int kDriveMotorTopLeftId = 1; - * final int kDriveMotorTopRightId = 2; - * ... - * - * Each constant should start with 'k'. This is a convention. - * Each Id should be given its own constant. - * Each constant should clearly say what it is for. - */ - - public static Settings settings; - static { - ObjectMapper mapper = new ObjectMapper(); - try { - var filepath = Filesystem.getDeployDirectory().toPath().resolve("robot_settings.json"); - settings = mapper.readValue(filepath.toFile(), Settings.class); - } - catch (IOException ex) { - System.out.println(ex.toString()); - } - } - - final int kPneumaticsModuleId = 0; - - final int kClawOpeningPortId = 0; - final int kClawClosingPortId = 1; - - Xbox360 xbox360 = new Xbox360(settings.controllerID); - LogitechF310 logitechF310 = new LogitechF310(settings.auxControllerID); - - Autonomous autonomous; - - Compressor compressor = new Compressor(settings.clawSettings.pneumaticsModuleId, PneumaticsModuleType.REVPH); - - // IComponent[] sensorComponents; - IComponent[] actuatorComponents = new IComponent[] { - new Claw(settings.clawSettings), - new Arm(settings.armSettings), - new SwerveDrive(settings.swerveDrive) - - }; - - boolean driverIsAnna = false; - - /** - * This function is run when the robot is first started up and should be used for any - * initialization code. - */ - @Override - public void robotInit() - { - // compressor.disable(); - } - - @Override - public void robotPeriodic() { - // for(var sensor : sensorComponents) - //{ - // sensor.update(); - // } - - for (var actuator : actuatorComponents) { - actuator.update(); - } - } - - @Override - public void autonomousInit() { - autonomous = new Autonomous(); - CommonData.calibrate = true; - } - - @Override - public void autonomousPeriodic() { - autonomous.update(); - } - - @Override - public void teleopInit() { - } - - // 18.75 -> 0.47625 - // 28.75 -> 0.73025 - - // 0.238125 Meters - // 0.365125 Meters - - @Override - public void teleopPeriodic() - { - CommonData.balance = xbox360.getB(); - CommonData.battenDownTheHatches = xbox360.getX(); - CommonData.sideSpeed = xbox360.getLeftStickX(); - CommonData.forwardSpeed = xbox360.getLeftStickY(); - CommonData.desiredTurn = Utility.snapToEdge(-xbox360.getRightStickX(), -1, 1, 0.9); - - CommonData.desiredShoulderAngle = CommonData.shoulderAngle + (logitechF310.getLeftStickY() * 35000); // 10000 - CommonData.desiredElbowAngle = CommonData.elbowAngle + (logitechF310.getRightStickY() * 10000); // 10000 - - if (logitechF310.getDUp()) { - CommonData.desiredShoulderAngle = Arm.Position.kTopShelf.shoulderPos; - CommonData.desiredElbowAngle = Arm.Position.kTopShelf.elbowPos; - } - else if (logitechF310.getDDown()) { - CommonData.desiredShoulderAngle = Arm.Position.kMiddleShelfOrHumanPlayer.shoulderPos; - CommonData.desiredElbowAngle = Arm.Position.kMiddleShelfOrHumanPlayer.elbowPos; - } - else if (logitechF310.getA()) { - CommonData.desiredShoulderAngle = Arm.Position.kGroundPickup.shoulderPos; - CommonData.desiredElbowAngle = Arm.Position.kGroundPickup.elbowPos; - } - else if (logitechF310.getB()) { - CommonData.desiredShoulderAngle = Arm.Position.kHome.shoulderPos; - CommonData.desiredElbowAngle = Arm.Position.kHome.elbowPos; - } - else if (logitechF310.getY()) - { - CommonData.desiredShoulderAngle = Arm.Position.kHumanPlayerStation.shoulderPos; - CommonData.desiredElbowAngle = Arm.Position.kHumanPlayerStation.elbowPos; - } - - if (logitechF310.getLeftBumper()) { - CommonData.clawState = Claw.State.kOpen; - } - else if (logitechF310.getRightBumper()) { - CommonData.clawState = Claw.State.kClosed; - } - } - - @Override - public void disabledInit() { - CommonData.clawState = Claw.State.kClosed; - CommonData.sideSpeed = 0; - CommonData.desiredTurn = 0; - CommonData.forwardSpeed = 0; - CommonData.balance = false; - - autonomous = null; - xbox360.rumbleOff(); - - CommonData.counter = 0; - - // "Zero" out the rest of the variables (as they are added) to safe, sensible default values - } - - @Override - public void disabledPeriodic() { - } - - @Override - public void testInit() { - CommonData.calibrate = true; - } - - @Override - public void testPeriodic() { - } - - @Override - public void simulationInit() { - } - - @Override - public void simulationPeriodic() { - } -} diff --git a/2022-2023/main-bot/src/main/java/frc/robot/Utility.java b/2022-2023/main-bot/src/main/java/frc/robot/Utility.java deleted file mode 100755 index 7bfabf5..0000000 --- a/2022-2023/main-bot/src/main/java/frc/robot/Utility.java +++ /dev/null @@ -1,36 +0,0 @@ -package frc.robot; - -import java.lang.Math; - -public class Utility { - static int printCounter = 0; - - public static void printLn(String messageString) { - if (printCounter == 50) { - System.out.println(messageString); - printCounter = 0; - } - else { - printCounter++; - } - } - - public static double sigmoid(double x) { - return 1 / (1 + Math.pow(Math.E, -x)); - } - - public static double clamp(double value, double min, double max) { - return value < min ? min : value > max ? max - : value; - } - - public static double snapToEdge(double value, double min, double max, double threshold) { - if (value < -threshold) { - return min; - } - if (value > threshold) { - return max; - } - return value; - } -} \ No newline at end of file diff --git a/2022-2023/main-bot/src/main/java/frc/settings/ArmSettings.java b/2022-2023/main-bot/src/main/java/frc/settings/ArmSettings.java deleted file mode 100755 index bba8fdb..0000000 --- a/2022-2023/main-bot/src/main/java/frc/settings/ArmSettings.java +++ /dev/null @@ -1,6 +0,0 @@ -package frc.settings; - -public class ArmSettings { - public int shoulderMotorID; - public int elbowMotorID; -} \ No newline at end of file diff --git a/2022-2023/main-bot/src/main/java/frc/settings/ClawSettings.java b/2022-2023/main-bot/src/main/java/frc/settings/ClawSettings.java deleted file mode 100755 index 5ea966d..0000000 --- a/2022-2023/main-bot/src/main/java/frc/settings/ClawSettings.java +++ /dev/null @@ -1,9 +0,0 @@ -package frc.settings; - -public class ClawSettings { - - public int openingPortId; - public int closingPortId; - public int pneumaticsModuleId; - -} diff --git a/2022-2023/main-bot/src/main/java/frc/settings/LimitedMotorSettings.java b/2022-2023/main-bot/src/main/java/frc/settings/LimitedMotorSettings.java deleted file mode 100755 index fe28273..0000000 --- a/2022-2023/main-bot/src/main/java/frc/settings/LimitedMotorSettings.java +++ /dev/null @@ -1,8 +0,0 @@ -package frc.settings; - -public class LimitedMotorSettings { - - public int motorID; - - public double[] limits; -} diff --git a/2022-2023/main-bot/src/main/java/frc/settings/Settings.java b/2022-2023/main-bot/src/main/java/frc/settings/Settings.java deleted file mode 100755 index c5f3e73..0000000 --- a/2022-2023/main-bot/src/main/java/frc/settings/Settings.java +++ /dev/null @@ -1,11 +0,0 @@ -package frc.settings; - -public class Settings { - - public SwerveDriveSettings swerveDrive; - public ClawSettings clawSettings; - public ArmSettings armSettings; - - public int controllerID; - public int auxControllerID; -} diff --git a/2022-2023/main-bot/src/main/java/frc/settings/SwerveDriveSettings.java b/2022-2023/main-bot/src/main/java/frc/settings/SwerveDriveSettings.java deleted file mode 100755 index 298a4de..0000000 --- a/2022-2023/main-bot/src/main/java/frc/settings/SwerveDriveSettings.java +++ /dev/null @@ -1,9 +0,0 @@ -package frc.settings; - -public class SwerveDriveSettings { - - public SwerveWheelSettings FLSwerve; - public SwerveWheelSettings FRSwerve; - public SwerveWheelSettings BLSwerve; - public SwerveWheelSettings BRSwerve; -} diff --git a/2022-2023/main-bot/src/main/java/frc/settings/SwerveWheelSettings.java b/2022-2023/main-bot/src/main/java/frc/settings/SwerveWheelSettings.java deleted file mode 100755 index 3cc9110..0000000 --- a/2022-2023/main-bot/src/main/java/frc/settings/SwerveWheelSettings.java +++ /dev/null @@ -1,20 +0,0 @@ -package frc.settings; - -public class SwerveWheelSettings { - - public int driveID; - public int turnID; - public int encoderID; - - public enum Location { - front, - back - } - - public Location location; - - public double defensiveAngle; - - public double posX; - public double posY; -} \ No newline at end of file diff --git a/2022-2023/main-bot/src/main/java/frc/settings/WristSettings.java b/2022-2023/main-bot/src/main/java/frc/settings/WristSettings.java deleted file mode 100755 index 3d99e4d..0000000 --- a/2022-2023/main-bot/src/main/java/frc/settings/WristSettings.java +++ /dev/null @@ -1,11 +0,0 @@ -package frc.settings; - -public class WristSettings { - - public int wristMotorId; - public double wristMotorPower; - public double wristEncoderOffset; - - public int[] wristLimits; - -} diff --git a/2022-2023/main-bot/src/main/java/frc/state_machine/State.java b/2022-2023/main-bot/src/main/java/frc/state_machine/State.java deleted file mode 100755 index f0764f3..0000000 --- a/2022-2023/main-bot/src/main/java/frc/state_machine/State.java +++ /dev/null @@ -1,17 +0,0 @@ -package frc.state_machine; - -public abstract class State { - - public void onEnter() { - } - - public void onExit() { - } - - public boolean isValid() { - return true; - } - - // Returns 'true' when state is finished - public abstract boolean run(); -} diff --git a/2022-2023/main-bot/src/main/java/frc/state_machine/StateMachine.java b/2022-2023/main-bot/src/main/java/frc/state_machine/StateMachine.java deleted file mode 100755 index 83f8364..0000000 --- a/2022-2023/main-bot/src/main/java/frc/state_machine/StateMachine.java +++ /dev/null @@ -1,31 +0,0 @@ -package frc.state_machine; - -import java.util.ArrayList; -import java.util.List; - -public class StateMachine { - - State m_currentState; - List m_states = new ArrayList(); - - public void addState(State state) { - m_states.add(state); - } - - public void run() { - if (!m_states.isEmpty()) { - if (m_currentState == null && m_states.get(0).isValid()) { - m_currentState = m_states.get(0); - m_currentState.onEnter(); - m_states.remove(0); - } - } - - if (m_currentState != null) { - if (m_currentState.run()) { - m_currentState.onExit(); - m_currentState = null; - } - } - } -} diff --git a/2022-2023/main-bot/vendordeps/NavX.json b/2022-2023/main-bot/vendordeps/NavX.json deleted file mode 100755 index 29ec93a..0000000 --- a/2022-2023/main-bot/vendordeps/NavX.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "fileName": "NavX.json", - "name": "KauaiLabs_navX_FRC", - "version": "2023.0.3", - "uuid": "cb311d09-36e9-4143-a032-55bb2b94443b", - "mavenUrls": [ - "https://dev.studica.com/maven/release/2023/" - ], - "jsonUrl": "https://dev.studica.com/releases/2023/NavX.json", - "javaDependencies": [ - { - "groupId": "com.kauailabs.navx.frc", - "artifactId": "navx-frc-java", - "version": "2023.0.3" - } - ], - "jniDependencies": [], - "cppDependencies": [ - { - "groupId": "com.kauailabs.navx.frc", - "artifactId": "navx-frc-cpp", - "version": "2023.0.3", - "headerClassifier": "headers", - "sourcesClassifier": "sources", - "sharedLibrary": false, - "libName": "navx_frc", - "skipInvalidPlatforms": true, - "binaryPlatforms": [ - "linuxathena", - "linuxraspbian", - "linuxarm32", - "linuxarm64", - "linux86-64", - "osxuniversal", - "windowsx86-64" - ] - } - ] -} \ No newline at end of file diff --git a/2022-2023/main-bot/vendordeps/PhoenixProAnd5.json b/2022-2023/main-bot/vendordeps/PhoenixProAnd5.json deleted file mode 100755 index 3975753..0000000 --- a/2022-2023/main-bot/vendordeps/PhoenixProAnd5.json +++ /dev/null @@ -1,458 +0,0 @@ -{ - "fileName": "PhoenixProAnd5.json", - "name": "CTRE-Phoenix (Pro And v5)", - "version": "23.0.5", - "frcYear": 2023, - "uuid": "3fcf3402-e646-4fa6-971e-18afe8173b1a", - "mavenUrls": [ - "https://maven.ctr-electronics.com/release/" - ], - "jsonUrl": "https://maven.ctr-electronics.com/release/com/ctre/phoenixpro/PhoenixProAnd5-frc2023-latest.json", - "javaDependencies": [ - { - "groupId": "com.ctre.phoenix", - "artifactId": "api-java", - "version": "5.30.4" - }, - { - "groupId": "com.ctre.phoenix", - "artifactId": "wpiapi-java", - "version": "5.30.4" - }, - { - "groupId": "com.ctre.phoenixpro", - "artifactId": "wpiapi-java", - "version": "23.0.5" - } - ], - "jniDependencies": [ - { - "groupId": "com.ctre.phoenix", - "artifactId": "cci", - "version": "5.30.4", - "isJar": false, - "skipInvalidPlatforms": true, - "validPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxathena" - ], - "simMode": "hwsim" - }, - { - "groupId": "com.ctre.phoenix.sim", - "artifactId": "cci-sim", - "version": "5.30.4", - "isJar": false, - "skipInvalidPlatforms": true, - "validPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "osxuniversal" - ], - "simMode": "swsim" - }, - { - "groupId": "com.ctre.phoenixpro", - "artifactId": "tools", - "version": "23.0.5", - "isJar": false, - "skipInvalidPlatforms": true, - "validPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxathena" - ], - "simMode": "hwsim" - }, - { - "groupId": "com.ctre.phoenixpro.sim", - "artifactId": "tools-sim", - "version": "23.0.5", - "isJar": false, - "skipInvalidPlatforms": true, - "validPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "osxuniversal" - ], - "simMode": "swsim" - }, - { - "groupId": "com.ctre.phoenixpro.sim", - "artifactId": "simTalonSRX", - "version": "23.0.5", - "isJar": false, - "skipInvalidPlatforms": true, - "validPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "osxuniversal" - ], - "simMode": "swsim" - }, - { - "groupId": "com.ctre.phoenixpro.sim", - "artifactId": "simTalonFX", - "version": "23.0.5", - "isJar": false, - "skipInvalidPlatforms": true, - "validPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "osxuniversal" - ], - "simMode": "swsim" - }, - { - "groupId": "com.ctre.phoenixpro.sim", - "artifactId": "simVictorSPX", - "version": "23.0.5", - "isJar": false, - "skipInvalidPlatforms": true, - "validPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "osxuniversal" - ], - "simMode": "swsim" - }, - { - "groupId": "com.ctre.phoenixpro.sim", - "artifactId": "simPigeonIMU", - "version": "23.0.5", - "isJar": false, - "skipInvalidPlatforms": true, - "validPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "osxuniversal" - ], - "simMode": "swsim" - }, - { - "groupId": "com.ctre.phoenixpro.sim", - "artifactId": "simCANCoder", - "version": "23.0.5", - "isJar": false, - "skipInvalidPlatforms": true, - "validPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "osxuniversal" - ], - "simMode": "swsim" - }, - { - "groupId": "com.ctre.phoenixpro.sim", - "artifactId": "simProTalonFX", - "version": "23.0.5", - "isJar": false, - "skipInvalidPlatforms": true, - "validPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "osxuniversal" - ], - "simMode": "swsim" - }, - { - "groupId": "com.ctre.phoenixpro.sim", - "artifactId": "simProCANcoder", - "version": "23.0.5", - "isJar": false, - "skipInvalidPlatforms": true, - "validPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "osxuniversal" - ], - "simMode": "swsim" - }, - { - "groupId": "com.ctre.phoenixpro.sim", - "artifactId": "simProPigeon2", - "version": "23.0.5", - "isJar": false, - "skipInvalidPlatforms": true, - "validPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "osxuniversal" - ], - "simMode": "swsim" - } - ], - "cppDependencies": [ - { - "groupId": "com.ctre.phoenix", - "artifactId": "wpiapi-cpp", - "version": "5.30.4", - "libName": "CTRE_Phoenix_WPI", - "headerClassifier": "headers", - "sharedLibrary": true, - "skipInvalidPlatforms": true, - "binaryPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxathena" - ], - "simMode": "hwsim" - }, - { - "groupId": "com.ctre.phoenix", - "artifactId": "api-cpp", - "version": "5.30.4", - "libName": "CTRE_Phoenix", - "headerClassifier": "headers", - "sharedLibrary": true, - "skipInvalidPlatforms": true, - "binaryPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxathena" - ], - "simMode": "hwsim" - }, - { - "groupId": "com.ctre.phoenix", - "artifactId": "cci", - "version": "5.30.4", - "libName": "CTRE_PhoenixCCI", - "headerClassifier": "headers", - "sharedLibrary": true, - "skipInvalidPlatforms": true, - "binaryPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxathena" - ], - "simMode": "hwsim" - }, - { - "groupId": "com.ctre.phoenixpro", - "artifactId": "tools", - "version": "23.0.5", - "libName": "CTRE_PhoenixTools", - "headerClassifier": "headers", - "sharedLibrary": true, - "skipInvalidPlatforms": true, - "binaryPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxathena" - ], - "simMode": "hwsim" - }, - { - "groupId": "com.ctre.phoenix.sim", - "artifactId": "wpiapi-cpp-sim", - "version": "5.30.4", - "libName": "CTRE_Phoenix_WPISim", - "headerClassifier": "headers", - "sharedLibrary": true, - "skipInvalidPlatforms": true, - "binaryPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "osxuniversal" - ], - "simMode": "swsim" - }, - { - "groupId": "com.ctre.phoenix.sim", - "artifactId": "api-cpp-sim", - "version": "5.30.4", - "libName": "CTRE_PhoenixSim", - "headerClassifier": "headers", - "sharedLibrary": true, - "skipInvalidPlatforms": true, - "binaryPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "osxuniversal" - ], - "simMode": "swsim" - }, - { - "groupId": "com.ctre.phoenix.sim", - "artifactId": "cci-sim", - "version": "5.30.4", - "libName": "CTRE_PhoenixCCISim", - "headerClassifier": "headers", - "sharedLibrary": true, - "skipInvalidPlatforms": true, - "binaryPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "osxuniversal" - ], - "simMode": "swsim" - }, - { - "groupId": "com.ctre.phoenixpro.sim", - "artifactId": "tools-sim", - "version": "23.0.5", - "libName": "CTRE_PhoenixTools_Sim", - "headerClassifier": "headers", - "sharedLibrary": true, - "skipInvalidPlatforms": true, - "binaryPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "osxuniversal" - ], - "simMode": "swsim" - }, - { - "groupId": "com.ctre.phoenixpro.sim", - "artifactId": "simTalonSRX", - "version": "23.0.5", - "libName": "CTRE_SimTalonSRX", - "headerClassifier": "headers", - "sharedLibrary": true, - "skipInvalidPlatforms": true, - "binaryPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "osxuniversal" - ], - "simMode": "swsim" - }, - { - "groupId": "com.ctre.phoenixpro.sim", - "artifactId": "simTalonFX", - "version": "23.0.5", - "libName": "CTRE_SimTalonFX", - "headerClassifier": "headers", - "sharedLibrary": true, - "skipInvalidPlatforms": true, - "binaryPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "osxuniversal" - ], - "simMode": "swsim" - }, - { - "groupId": "com.ctre.phoenixpro.sim", - "artifactId": "simVictorSPX", - "version": "23.0.5", - "libName": "CTRE_SimVictorSPX", - "headerClassifier": "headers", - "sharedLibrary": true, - "skipInvalidPlatforms": true, - "binaryPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "osxuniversal" - ], - "simMode": "swsim" - }, - { - "groupId": "com.ctre.phoenixpro.sim", - "artifactId": "simPigeonIMU", - "version": "23.0.5", - "libName": "CTRE_SimPigeonIMU", - "headerClassifier": "headers", - "sharedLibrary": true, - "skipInvalidPlatforms": true, - "binaryPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "osxuniversal" - ], - "simMode": "swsim" - }, - { - "groupId": "com.ctre.phoenixpro.sim", - "artifactId": "simCANCoder", - "version": "23.0.5", - "libName": "CTRE_SimCANCoder", - "headerClassifier": "headers", - "sharedLibrary": true, - "skipInvalidPlatforms": true, - "binaryPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "osxuniversal" - ], - "simMode": "swsim" - }, - { - "groupId": "com.ctre.phoenixpro.sim", - "artifactId": "simProTalonFX", - "version": "23.0.5", - "libName": "CTRE_SimProTalonFX", - "headerClassifier": "headers", - "sharedLibrary": true, - "skipInvalidPlatforms": true, - "binaryPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "osxuniversal" - ], - "simMode": "swsim" - }, - { - "groupId": "com.ctre.phoenixpro.sim", - "artifactId": "simProCANcoder", - "version": "23.0.5", - "libName": "CTRE_SimProCANcoder", - "headerClassifier": "headers", - "sharedLibrary": true, - "skipInvalidPlatforms": true, - "binaryPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "osxuniversal" - ], - "simMode": "swsim" - }, - { - "groupId": "com.ctre.phoenixpro.sim", - "artifactId": "simProPigeon2", - "version": "23.0.5", - "libName": "CTRE_SimProPigeon2", - "headerClassifier": "headers", - "sharedLibrary": true, - "skipInvalidPlatforms": true, - "binaryPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "osxuniversal" - ], - "simMode": "swsim" - }, - { - "groupId": "com.ctre.phoenixpro", - "artifactId": "wpiapi-cpp", - "version": "23.0.5", - "libName": "CTRE_PhoenixPro_WPI", - "headerClassifier": "headers", - "sharedLibrary": true, - "skipInvalidPlatforms": true, - "binaryPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxathena" - ], - "simMode": "hwsim" - }, - { - "groupId": "com.ctre.phoenixpro.sim", - "artifactId": "wpiapi-cpp-sim", - "version": "23.0.5", - "libName": "CTRE_PhoenixPro_WPISim", - "headerClassifier": "headers", - "sharedLibrary": true, - "skipInvalidPlatforms": true, - "binaryPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "osxuniversal" - ], - "simMode": "swsim" - } - ] -} \ No newline at end of file diff --git a/2022-2023/main-bot/vendordeps/WPILibNewCommands.json b/2022-2023/main-bot/vendordeps/WPILibNewCommands.json deleted file mode 100755 index da4bc52..0000000 --- a/2022-2023/main-bot/vendordeps/WPILibNewCommands.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "fileName": "WPILibNewCommands.json", - "name": "WPILib-New-Commands", - "version": "1.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", - "linuxarm32", - "linuxarm64", - "windowsx86-64", - "windowsx86", - "linuxx86-64", - "osxuniversal" - ] - } - ] -} diff --git a/2023-2024/main-bot/.gitignore b/2023-2024/main-bot/.gitignore deleted file mode 100644 index 3325f5c..0000000 --- a/2023-2024/main-bot/.gitignore +++ /dev/null @@ -1,172 +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/ - -# IntelliJ -*.iml -*.ipr -*.iws -.idea/ -out/ - -# Fleet -.fleet - -# Simulation GUI and other tools window save file -*-window.json diff --git a/2023-2024/main-bot/.wpilib/wpilib_preferences.json b/2023-2024/main-bot/.wpilib/wpilib_preferences.json deleted file mode 100644 index c9d5bc0..0000000 --- a/2023-2024/main-bot/.wpilib/wpilib_preferences.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "enableCppIntellisense": false, - "currentLanguage": "java", - "projectYear": "2024beta", - "teamNumber": 5098 -} \ No newline at end of file diff --git a/2023-2024/main-bot/gradle/wrapper/gradle-wrapper.jar b/2023-2024/main-bot/gradle/wrapper/gradle-wrapper.jar deleted file mode 100644 index 7f93135c49b765f8051ef9d0a6055ff8e46073d8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 63721 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鯊%1Et zwk~hMkhq;MOw^Q5`7oC{CUUyTw9x>^%*FHx^qJw(LB+E0WBX@{Ghw;)6aA-KyYg8p z7XDveQOpEr;B4je@2~usI5BlFadedX^ma{b{ypd|RNYqo#~d*mj&y`^iojR}s%~vF z(H!u`yx68D1Tj(3(m;Q+Ma}s2n#;O~bcB1`lYk%Irx60&-nWIUBr2x&@}@76+*zJ5 ze&4?q8?m%L9c6h=J$WBzbiTf1Z-0Eb5$IZs>lvm$>1n_Mezp*qw_pr8<8$6f)5f<@ zyV#tzMCs51nTv_5ca`x`yfE5YA^*%O_H?;tWYdM_kHPubA%vy47i=9>Bq) zRQ&0UwLQHeswmB1yP)+BiR;S+Vc-5TX84KUA;8VY9}yEj0eESSO`7HQ4lO z4(CyA8y1G7_C;6kd4U3K-aNOK!sHE}KL_-^EDl(vB42P$2Km7$WGqNy=%fqB+ zSLdrlcbEH=T@W8V4(TgoXZ*G1_aq$K^@ek=TVhoKRjw;HyI&coln|uRr5mMOy2GXP zwr*F^Y|!Sjr2YQXX(Fp^*`Wk905K%$bd03R4(igl0&7IIm*#f`A!DCarW9$h$z`kYk9MjjqN&5-DsH@8xh63!fTNPxWsFQhNv z#|3RjnP$Thdb#Ys7M+v|>AHm0BVTw)EH}>x@_f4zca&3tXJhTZ8pO}aN?(dHo)44Z z_5j+YP=jMlFqwvf3lq!57-SAuRV2_gJ*wsR_!Y4Z(trO}0wmB9%f#jNDHPdQGHFR; zZXzS-$`;7DQ5vF~oSgP3bNV$6Z(rwo6W(U07b1n3UHqml>{=6&-4PALATsH@Bh^W? z)ob%oAPaiw{?9HfMzpGb)@Kys^J$CN{uf*HX?)z=g`J(uK1YO^8~s1(ZIbG%Et(|q z$D@_QqltVZu9Py4R0Ld8!U|#`5~^M=b>fnHthzKBRr=i+w@0Vr^l|W;=zFT#PJ?*a zbC}G#It}rQP^Ait^W&aa6B;+0gNvz4cWUMzpv(1gvfw-X4xJ2Sv;mt;zb2Tsn|kSS zo*U9N?I{=-;a-OybL4r;PolCfiaL=y@o9{%`>+&FI#D^uy#>)R@b^1ue&AKKwuI*` zx%+6r48EIX6nF4o;>)zhV_8(IEX})NGU6Vs(yslrx{5fII}o3SMHW7wGtK9oIO4OM&@@ECtXSICLcPXoS|{;=_yj>hh*%hP27yZwOmj4&Lh z*Nd@OMkd!aKReoqNOkp5cW*lC)&C$P?+H3*%8)6HcpBg&IhGP^77XPZpc%WKYLX$T zsSQ$|ntaVVOoRat$6lvZO(G-QM5s#N4j*|N_;8cc2v_k4n6zx9c1L4JL*83F-C1Cn zaJhd;>rHXB%%ZN=3_o3&Qd2YOxrK~&?1=UuN9QhL$~OY-Qyg&})#ez*8NpQW_*a&kD&ANjedxT0Ar z<6r{eaVz3`d~+N~vkMaV8{F?RBVemN(jD@S8qO~L{rUw#=2a$V(7rLE+kGUZ<%pdr z?$DP|Vg#gZ9S}w((O2NbxzQ^zTot=89!0^~hE{|c9q1hVzv0?YC5s42Yx($;hAp*E zyoGuRyphQY{Q2ee0Xx`1&lv(l-SeC$NEyS~8iil3_aNlnqF_G|;zt#F%1;J)jnPT& z@iU0S;wHJ2$f!juqEzPZeZkjcQ+Pa@eERSLKsWf=`{R@yv7AuRh&ALRTAy z8=g&nxsSJCe!QLchJ=}6|LshnXIK)SNd zRkJNiqHwKK{SO;N5m5wdL&qK`v|d?5<4!(FAsDxR>Ky#0#t$8XCMptvNo?|SY?d8b z`*8dVBlXTUanlh6n)!EHf2&PDG8sXNAt6~u-_1EjPI1|<=33T8 zEnA00E!`4Ave0d&VVh0e>)Dc}=FfAFxpsC1u9ATfQ`-Cu;mhc8Z>2;uyXtqpLb7(P zd2F9<3cXS} znMg?{&8_YFTGRQZEPU-XPq55%51}RJpw@LO_|)CFAt62-_!u_Uq$csc+7|3+TV_!h z+2a7Yh^5AA{q^m|=KSJL+w-EWDBc&I_I1vOr^}P8i?cKMhGy$CP0XKrQzCheG$}G# zuglf8*PAFO8%xop7KSwI8||liTaQ9NCAFarr~psQt)g*pC@9bORZ>m`_GA`_K@~&% zijH0z;T$fd;-Liw8%EKZas>BH8nYTqsK7F;>>@YsE=Rqo?_8}UO-S#|6~CAW0Oz1} z3F(1=+#wrBJh4H)9jTQ_$~@#9|Bc1Pd3rAIA_&vOpvvbgDJOM(yNPhJJq2%PCcMaI zrbe~toYzvkZYQ{ea(Wiyu#4WB#RRN%bMe=SOk!CbJZv^m?Flo5p{W8|0i3`hI3Np# zvCZqY%o258CI=SGb+A3yJe~JH^i{uU`#U#fvSC~rWTq+K`E%J@ zasU07&pB6A4w3b?d?q}2=0rA#SA7D`X+zg@&zm^iA*HVi z009#PUH<%lk4z~p^l0S{lCJk1Uxi=F4e_DwlfHA`X`rv(|JqWKAA5nH+u4Da+E_p+ zVmH@lg^n4ixs~*@gm_dgQ&eDmE1mnw5wBz9Yg?QdZwF|an67Xd*x!He)Gc8&2!urh z4_uXzbYz-aX)X1>&iUjGp;P1u8&7TID0bTH-jCL&Xk8b&;;6p2op_=y^m@Nq*0{#o!!A;wNAFG@0%Z9rHo zcJs?Th>Ny6+hI`+1XoU*ED$Yf@9f91m9Y=#N(HJP^Y@ZEYR6I?oM{>&Wq4|v0IB(p zqX#Z<_3X(&{H+{3Tr|sFy}~=bv+l=P;|sBz$wk-n^R`G3p0(p>p=5ahpaD7>r|>pm zv;V`_IR@tvZreIuv2EM7ZQHhO+qUgw#kOs%*ekY^n|=1#x9&c;Ro&I~{rG-#_3ZB1 z?|9}IFdbP}^DneP*T-JaoYHt~r@EfvnPE5EKUwIxjPbsr$% zfWW83pgWST7*B(o=kmo)74$8UU)v0{@4DI+ci&%=#90}!CZz|rnH+Mz=HN~97G3~@ z;v5(9_2%eca(9iu@J@aqaMS6*$TMw!S>H(b z4(*B!|H|8&EuB%mITr~O?vVEf%(Gr)6E=>H~1VR z&1YOXluJSG1!?TnT)_*YmJ*o_Q@om~(GdrhI{$Fsx_zrkupc#y{DK1WOUR>tk>ZE) ziOLoBkhZZ?0Uf}cm>GsA>Rd6V8@JF)J*EQlQ<=JD@m<)hyElXR0`pTku*3MU`HJn| zIf7$)RlK^pW-$87U;431;Ye4Ie+l~_B3*bH1>*yKzn23cH0u(i5pXV! z4K?{3oF7ZavmmtTq((wtml)m6i)8X6ot_mrE-QJCW}Yn!(3~aUHYG=^fA<^~`e3yc z-NWTb{gR;DOUcK#zPbN^D*e=2eR^_!(!RKkiwMW@@yYtEoOp4XjOGgzi`;=8 zi3`Ccw1%L*y(FDj=C7Ro-V?q)-%p?Ob2ZElu`eZ99n14-ZkEV#y5C+{Pq87Gu3&>g zFy~Wk7^6v*)4pF3@F@rE__k3ikx(hzN3@e*^0=KNA6|jC^B5nf(XaoQaZN?Xi}Rn3 z$8&m*KmWvPaUQ(V<#J+S&zO|8P-#!f%7G+n_%sXp9=J%Z4&9OkWXeuZN}ssgQ#Tcj z8p6ErJQJWZ+fXLCco=RN8D{W%+*kko*2-LEb))xcHwNl~Xmir>kmAxW?eW50Osw3# zki8Fl$#fvw*7rqd?%E?}ZX4`c5-R&w!Y0#EBbelVXSng+kUfeUiqofPehl}$ormli zg%r)}?%=?_pHb9`Cq9Z|B`L8b>(!+8HSX?`5+5mm81AFXfnAt1*R3F z%b2RPIacKAddx%JfQ8l{3U|vK@W7KB$CdLqn@wP^?azRks@x8z59#$Q*7q!KilY-P zHUbs(IFYRGG1{~@RF;Lqyho$~7^hNC`NL3kn^Td%A7dRgr_&`2k=t+}D-o9&C!y^? z6MsQ=tc3g0xkK(O%DzR9nbNB(r@L;1zQrs8mzx&4dz}?3KNYozOW5;=w18U6$G4U2 z#2^qRLT*Mo4bV1Oeo1PKQ2WQS2Y-hv&S|C7`xh6=Pj7MNLC5K-zokZ67S)C;(F0Dd zloDK2_o1$Fmza>EMj3X9je7e%Q`$39Dk~GoOj89-6q9|_WJlSl!!+*{R=tGp z8u|MuSwm^t7K^nUe+^0G3dkGZr3@(X+TL5eah)K^Tn zXEtHmR9UIaEYgD5Nhh(s*fcG_lh-mfy5iUF3xxpRZ0q3nZ=1qAtUa?(LnT9I&~uxX z`pV?+=|-Gl(kz?w!zIieXT}o}7@`QO>;u$Z!QB${a08_bW0_o@&9cjJUXzVyNGCm8 zm=W+$H!;_Kzp6WQqxUI;JlPY&`V}9C$8HZ^m?NvI*JT@~BM=()T()Ii#+*$y@lTZBkmMMda>7s#O(1YZR+zTG@&}!EXFG{ zEWPSDI5bFi;NT>Yj*FjH((=oe%t%xYmE~AGaOc4#9K_XsVpl<4SP@E!TgC0qpe1oi zNpxU2b0(lEMcoibQ-G^cxO?ySVW26HoBNa;n0}CWL*{k)oBu1>F18X061$SP{Gu67 z-v-Fa=Fl^u3lnGY^o5v)Bux}bNZ~ z5pL+7F_Esoun8^5>z8NFoIdb$sNS&xT8_|`GTe8zSXQzs4r^g0kZjg(b0bJvz`g<70u9Z3fQILX1Lj@;@+##bP|FAOl)U^9U>0rx zGi)M1(Hce)LAvQO-pW!MN$;#ZMX?VE(22lTlJrk#pB0FJNqVwC+*%${Gt#r_tH9I_ z;+#)#8cWAl?d@R+O+}@1A^hAR1s3UcW{G+>;X4utD2d9X(jF555}!TVN-hByV6t+A zdFR^aE@GNNgSxxixS2p=on4(+*+f<8xrwAObC)D5)4!z7)}mTpb7&ofF3u&9&wPS< zB62WHLGMhmrmOAgmJ+|c>qEWTD#jd~lHNgT0?t-p{T=~#EMcB| z=AoDKOL+qXCfk~F)-Rv**V}}gWFl>liXOl7Uec_8v)(S#av99PX1sQIVZ9eNLkhq$ zt|qu0b?GW_uo}TbU8!jYn8iJeIP)r@;!Ze_7mj{AUV$GEz6bDSDO=D!&C9!M@*S2! zfGyA|EPlXGMjkH6x7OMF?gKL7{GvGfED=Jte^p=91FpCu)#{whAMw`vSLa`K#atdN zThnL+7!ZNmP{rc=Z>%$meH;Qi1=m1E3Lq2D_O1-X5C;!I0L>zur@tPAC9*7Jeh)`;eec}1`nkRP(%iv-`N zZ@ip-g|7l6Hz%j%gcAM}6-nrC8oA$BkOTz^?dakvX?`^=ZkYh%vUE z9+&)K1UTK=ahYiaNn&G5nHUY5niLGus@p5E2@RwZufRvF{@$hW{;{3QhjvEHMvduO z#Wf-@oYU4ht?#uP{N3utVzV49mEc9>*TV_W2TVC`6+oI)zAjy$KJrr=*q##&kobiQ z1vNbya&OVjK`2pdRrM?LuK6BgrLN7H_3m z!qpNKg~87XgCwb#I=Q&0rI*l$wM!qTkXrx1ko5q-f;=R2fImRMwt5Qs{P*p^z@9ex z`2#v(qE&F%MXlHpdO#QEZyZftn4f05ab^f2vjxuFaat2}jke{j?5GrF=WYBR?gS(^ z9SBiNi}anzBDBRc+QqizTTQuJrzm^bNA~A{j%ugXP7McZqJ}65l10({wk++$=e8O{ zxWjG!Qp#5OmI#XRQQM?n6?1ztl6^D40hDJr?4$Wc&O_{*OfMfxe)V0=e{|N?J#fgE>j9jAajze$iN!*yeF%jJU#G1c@@rm zolGW!j?W6Q8pP=lkctNFdfgUMg92wlM4E$aks1??M$~WQfzzzXtS)wKrr2sJeCN4X zY(X^H_c^PzfcO8Bq(Q*p4c_v@F$Y8cHLrH$`pJ2}=#*8%JYdqsqnGqEdBQMpl!Ot04tUGSXTQdsX&GDtjbWD=prcCT9(+ z&UM%lW%Q3yrl1yiYs;LxzIy>2G}EPY6|sBhL&X&RAQrSAV4Tlh2nITR?{6xO9ujGu zr*)^E`>o!c=gT*_@6S&>0POxcXYNQd&HMw6<|#{eSute2C3{&h?Ah|cw56-AP^f8l zT^kvZY$YiH8j)sk7_=;gx)vx-PW`hbSBXJGCTkpt;ap(}G2GY=2bbjABU5)ty%G#x zAi07{Bjhv}>OD#5zh#$0w;-vvC@^}F! z#X$@)zIs1L^E;2xDAwEjaXhTBw2<{&JkF*`;c3<1U@A4MaLPe{M5DGGkL}#{cHL%* zYMG+-Fm0#qzPL#V)TvQVI|?_M>=zVJr9>(6ib*#z8q@mYKXDP`k&A4A};xMK0h=yrMp~JW{L?mE~ph&1Y1a#4%SO)@{ zK2juwynUOC)U*hVlJU17%llUxAJFuKZh3K0gU`aP)pc~bE~mM!i1mi!~LTf>1Wp< zuG+ahp^gH8g8-M$u{HUWh0m^9Rg@cQ{&DAO{PTMudV6c?ka7+AO& z746QylZ&Oj`1aqfu?l&zGtJnpEQOt;OAFq19MXTcI~`ZcoZmyMrIKDFRIDi`FH)w; z8+*8tdevMDv*VtQi|e}CnB_JWs>fhLOH-+Os2Lh!&)Oh2utl{*AwR)QVLS49iTp{6 z;|172Jl!Ml17unF+pd+Ff@jIE-{Oxv)5|pOm@CkHW?{l}b@1>Pe!l}VccX#xp@xgJ zyE<&ep$=*vT=}7vtvif0B?9xw_3Gej7mN*dOHdQPtW5kA5_zGD zpA4tV2*0E^OUimSsV#?Tg#oiQ>%4D@1F5@AHwT8Kgen$bSMHD3sXCkq8^(uo7CWk`mT zuslYq`6Yz;L%wJh$3l1%SZv#QnG3=NZ=BK4yzk#HAPbqXa92;3K5?0kn4TQ`%E%X} z&>Lbt!!QclYKd6+J7Nl@xv!uD%)*bY-;p`y^ZCC<%LEHUi$l5biu!sT3TGGSTPA21 zT8@B&a0lJHVn1I$I3I1I{W9fJAYc+8 zVj8>HvD}&O`TqU2AAb={?eT;0hyL(R{|h23=4fDSZKC32;wWxsVj`P z3J3{M$PwdH!ro*Cn!D&=jnFR>BNGR<<|I8CI@+@658Dy(lhqbhXfPTVecY@L8%`3Q z1Fux2w?2C3th60jI~%OC9BtpNF$QPqcG+Pz96qZJ71_`0o0w_q7|h&O>`6U+^BA&5 zXd5Zp1Xkw~>M%RixTm&OqpNl8Q+ue=92Op_>T~_9UON?ZM2c0aGm=^A4ejrXj3dV9 zhh_bCt-b9`uOX#cFLj!vhZ#lS8Tc47OH>*)y#{O9?AT~KR9LntM|#l#Dlm^8{nZdk zjMl#>ZM%#^nK2TPzLcKxqx24P7R1FPlBy7LSBrRvx>fE$9AJ;7{PQm~^LBX^k#6Zq zw*Z(zJC|`!6_)EFR}8|n8&&Rbj8y028~P~sFXBFRt+tmqH-S3<%N;C&WGH!f3{7cm zy_fCAb9@HqaXa1Y5vFbxWf%#zg6SI$C+Uz5=CTO}e|2fjWkZ;Dx|84Ow~bkI=LW+U zuq;KSv9VMboRvs9)}2PAO|b(JCEC_A0wq{uEj|3x@}*=bOd zwr{TgeCGG>HT<@Zeq8y}vTpwDg#UBvD)BEs@1KP$^3$sh&_joQPn{hjBXmLPJ{tC) z*HS`*2+VtJO{|e$mM^|qv1R*8i(m1`%)}g=SU#T#0KlTM2RSvYUc1fP+va|4;5}Bfz98UvDCpq7}+SMV&;nX zQw~N6qOX{P55{#LQkrZk(e5YGzr|(B;Q;ju;2a`q+S9bsEH@i1{_Y0;hWYn1-79jl z5c&bytD*k)GqrVcHn6t-7kinadiD>B{Tl`ZY@`g|b~pvHh5!gKP4({rp?D0aFd_cN zhHRo4dd5^S6ViN(>(28qZT6E>??aRhc($kP`>@<+lIKS5HdhjVU;>f7<4))E*5|g{ z&d1}D|vpuV^eRj5j|xx9nwaCxXFG?Qbjn~_WSy=N}P0W>MP zG-F%70lX5Xr$a)2i6?i|iMyM|;Jtf*hO?=Jxj12oz&>P=1#h~lf%#fc73M2_(SUM- zf&qnjS80|_Y0lDgl&I?*eMumUklLe_=Td!9G@eR*tcPOgIShJipp3{A10u(4eT~DY zHezEj8V+7m!knn7)W!-5QI3=IvC^as5+TW1@Ern@yX| z7Nn~xVx&fGSr+L%4iohtS3w^{-H1A_5=r&x8}R!YZvp<2T^YFvj8G_vm}5q;^UOJf ztl=X3iL;;^^a#`t{Ae-%5Oq{?M#s6Npj+L(n-*LMI-yMR{)qki!~{5z{&`-iL}lgW zxo+tnvICK=lImjV$Z|O_cYj_PlEYCzu-XBz&XC-JVxUh9;6*z4fuBG+H{voCC;`~GYV|hj%j_&I zDZCj>Q_0RCwFauYoVMiUSB+*Mx`tg)bWmM^SwMA+?lBg12QUF_x2b)b?qb88K-YUd z0dO}3k#QirBV<5%jL$#wlf!60dizu;tsp(7XLdI=eQs?P`tOZYMjVq&jE)qK*6B^$ zBe>VvH5TO>s>izhwJJ$<`a8fakTL!yM^Zfr2hV9`f}}VVUXK39p@G|xYRz{fTI+Yq z20d=)iwjuG9RB$%$^&8#(c0_j0t_C~^|n+c`Apu|x7~;#cS-s=X1|C*YxX3ailhg_|0`g!E&GZJEr?bh#Tpb8siR=JxWKc{#w7g zWznLwi;zLFmM1g8V5-P#RsM@iX>TK$xsWuujcsVR^7TQ@!+vCD<>Bk9tdCo7Mzgq5 zv8d>dK9x8C@Qoh01u@3h0X_`SZluTb@5o;{4{{eF!-4405x8X7hewZWpz z2qEi4UTiXTvsa(0X7kQH{3VMF>W|6;6iTrrYD2fMggFA&-CBEfSqPlQDxqsa>{e2M z(R5PJ7uOooFc|9GU0ELA%m4&4Ja#cQpNw8i8ACAoK6?-px+oBl_yKmenZut#Xumjz zk8p^OV2KY&?5MUwGrBOo?ki`Sxo#?-Q4gw*Sh0k`@ zFTaYK2;}%Zk-68`#5DXU$2#=%YL#S&MTN8bF+!J2VT6x^XBci6O)Q#JfW{YMz) zOBM>t2rSj)n#0a3cjvu}r|k3od6W(SN}V-cL?bi*Iz-8uOcCcsX0L>ZXjLqk zZu2uHq5B|Kt>e+=pPKu=1P@1r9WLgYFq_TNV1p9pu0erHGd!+bBp!qGi+~4A(RsYN@CyXNrC&hxGmW)u5m35OmWwX`I+0yByglO`}HC4nGE^_HUs^&A(uaM zKPj^=qI{&ayOq#z=p&pnx@@k&I1JI>cttJcu@Ihljt?6p^6{|ds`0MoQwp+I{3l6` zB<9S((RpLG^>=Kic`1LnhpW2=Gu!x`m~=y;A`Qk!-w`IN;S8S930#vBVMv2vCKi}u z6<-VPrU0AnE&vzwV(CFC0gnZYcpa-l5T0ZS$P6(?9AM;`Aj~XDvt;Jua=jIgF=Fm? zdp=M$>`phx%+Gu};;-&7T|B1AcC#L4@mW5SV_^1BRbo6;2PWe$r+npRV`yc;T1mo& z+~_?7rA+(Um&o@Tddl zL_hxvWk~a)yY}%j`Y+200D%9$bWHy&;(yj{jpi?Rtz{J66ANw)UyPOm;t6FzY3$hx zcn)Ir79nhFvNa7^a{SHN7XH*|Vlsx`CddPnA&Qvh8aNhEA;mPVv;Ah=k<*u!Zq^7 z<=xs*iQTQOMMcg|(NA_auh@x`3#_LFt=)}%SQppP{E>mu_LgquAWvh<>L7tf9+~rO znwUDS52u)OtY<~!d$;m9+87aO+&`#2ICl@Y>&F{jI=H(K+@3M1$rr=*H^dye#~TyD z!){#Pyfn+|ugUu}G;a~!&&0aqQ59U@UT3|_JuBlYUpT$2+11;}JBJ`{+lQN9T@QFY z5+`t;6(TS0F?OlBTE!@7D`8#URDNqx2t6`GZ{ZgXeS@v%-eJzZOHz18aS|svxII$a zZeFjrJ*$IwX$f-Rzr_G>xbu@euGl)B7pC&S+CmDJBg$BoV~jxSO#>y z33`bupN#LDoW0feZe0%q8un0rYN|eRAnwDHQ6e_)xBTbtoZtTA=Fvk){q}9Os~6mQ zKB80VI_&6iSq`LnK7*kfHZoeX6?WE}8yjuDn=2#JG$+;-TOA1%^=DnXx%w{b=w}tS zQbU3XxtOI8E(!%`64r2`zog;5<0b4i)xBmGP^jiDZ2%HNSxIf3@wKs~uk4%3Mxz;~ zts_S~E4>W+YwI<-*-$U8*^HKDEa8oLbmqGg?3vewnaNg%Mm)W=)lcC_J+1ov^u*N3 zXJ?!BrH-+wGYziJq2Y#vyry6Z>NPgkEk+Ke`^DvNRdb>Q2Nlr#v%O@<5hbflI6EKE z9dWc0-ORk^T}jP!nkJ1imyjdVX@GrjOs%cpgA8-c&FH&$(4od#x6Y&=LiJZPINVyW z0snY$8JW@>tc2}DlrD3StQmA0Twck~@>8dSix9CyQOALcREdxoM$Sw*l!}bXKq9&r zysMWR@%OY24@e`?+#xV2bk{T^C_xSo8v2ZI=lBI*l{RciPwuE>L5@uhz@{!l)rtVlWC>)6(G)1~n=Q|S!{E9~6*fdpa*n z!()-8EpTdj=zr_Lswi;#{TxbtH$8*G=UM`I+icz7sr_SdnHXrv=?iEOF1UL+*6O;% zPw>t^kbW9X@oEXx<97%lBm-9?O_7L!DeD)Me#rwE54t~UBu9VZ zl_I1tBB~>jm@bw0Aljz8! zXBB6ATG6iByKIxs!qr%pz%wgqbg(l{65DP4#v(vqhhL{0b#0C8mq`bnqZ1OwFV z7mlZZJFMACm>h9v^2J9+^_zc1=JjL#qM5ZHaThH&n zXPTsR8(+)cj&>Un{6v*z?@VTLr{TmZ@-fY%*o2G}*G}#!bmqpoo*Ay@U!JI^Q@7gj;Kg-HIrLj4}#ec4~D2~X6vo;ghep-@&yOivYP zC19L0D`jjKy1Yi-SGPAn94(768Tcf$urAf{)1)9W58P`6MA{YG%O?|07!g9(b`8PXG1B1Sh0?HQmeJtP0M$O$hI z{5G`&9XzYhh|y@qsF1GnHN|~^ru~HVf#)lOTSrv=S@DyR$UKQk zjdEPFDz{uHM&UM;=mG!xKvp;xAGHOBo~>_=WFTmh$chpC7c`~7?36h)7$fF~Ii}8q zF|YXxH-Z?d+Q+27Rs3X9S&K3N+)OBxMHn1u(vlrUC6ckBY@@jl+mgr#KQUKo#VeFm zFwNYgv0<%~Wn}KeLeD9e1$S>jhOq&(e*I@L<=I5b(?G(zpqI*WBqf|Zge0&aoDUsC zngMRA_Kt0>La+Erl=Uv_J^p(z=!?XHpenzn$%EA`JIq#yYF?JLDMYiPfM(&Csr#f{ zdd+LJL1by?xz|D8+(fgzRs~(N1k9DSyK@LJygwaYX8dZl0W!I&c^K?7)z{2is;OkE zd$VK-(uH#AUaZrp=1z;O*n=b?QJkxu`Xsw&7yrX0?(CX=I-C#T;yi8a<{E~?vr3W> zQrpPqOW2M+AnZ&p{hqmHZU-;Q(7?- zP8L|Q0RM~sB0w1w53f&Kd*y}ofx@c z5Y6B8qGel+uT1JMot$nT1!Tim6{>oZzJXdyA+4euOLME?5Fd_85Uk%#E*ln%y{u8Q z$|?|R@Hpb~yTVK-Yr_S#%NUy7EBfYGAg>b({J|5b+j-PBpPy$Ns`PaJin4JdRfOaS zE|<HjH%NuJgsd2wOlv>~y=np%=2)$M9LS|>P)zJ+Fei5vYo_N~B0XCn+GM76 z)Xz3tg*FRVFgIl9zpESgdpWAavvVViGlU8|UFY{{gVJskg*I!ZjWyk~OW-Td4(mZ6 zB&SQreAAMqwp}rjy`HsG({l2&q5Y52<@AULVAu~rWI$UbFuZs>Sc*x+XI<+ez%$U)|a^unjpiW0l0 zj1!K0(b6$8LOjzRqQ~K&dfbMIE=TF}XFAi)$+h}5SD3lo z%%Qd>p9se=VtQG{kQ;N`sI)G^u|DN#7{aoEd zkksYP%_X$Rq08);-s6o>CGJ<}v`qs%eYf+J%DQ^2k68C%nvikRsN?$ap--f+vCS`K z#&~)f7!N^;sdUXu54gl3L=LN>FB^tuK=y2e#|hWiWUls__n@L|>xH{%8lIJTd5`w? zSwZbnS;W~DawT4OwSJVdAylbY+u5S+ZH{4hAi2&}Iv~W(UvHg(1GTZRPz`@{SOqzy z(8g&Dz=$PfRV=6FgxN~zo+G8OoPI&d-thcGVR*_^(R8COTM@bq?fDwY{}WhsQS1AK zF6R1t8!RdFmfocpJ6?9Yv~;WYi~XPgs(|>{5})j!AR!voO7y9&cMPo#80A(`za@t>cx<0;qxM@S*m(jYP)dMXr*?q0E`oL;12}VAep179uEr8c<=D zr5?A*C{eJ`z9Ee;E$8)MECqatHkbHH z&Y+ho0B$31MIB-xm&;xyaFCtg<{m~M-QDbY)fQ>Q*Xibb~8ytxZQ?QMf9!%cV zU0_X1@b4d+Pg#R!`OJ~DOrQz3@cpiGy~XSKjZQQ|^4J1puvwKeScrH8o{bscBsowomu z^f12kTvje`yEI3eEXDHJ6L+O{Jv$HVj%IKb|J{IvD*l6IG8WUgDJ*UGz z3!C%>?=dlfSJ>4U88)V+`U-!9r^@AxJBx8R;)J4Fn@`~k>8>v0M9xp90OJElWP&R5 zM#v*vtT}*Gm1^)Bv!s72T3PB0yVIjJW)H7a)ilkAvoaH?)jjb`MP>2z{%Y?}83 zUIwBKn`-MSg)=?R)1Q0z3b>dHE^)D8LFs}6ASG1|daDly_^lOSy&zIIhm*HXm1?VS=_iacG);_I9c zUQH1>i#*?oPIwBMJkzi_*>HoUe}_4o>2(SHWzqQ=;TyhAHS;Enr7!#8;sdlty&(>d zl%5cjri8`2X^Ds`jnw7>A`X|bl=U8n+3LKLy(1dAu8`g@9=5iw$R0qk)w8Vh_Dt^U zIglK}sn^)W7aB(Q>HvrX=rxB z+*L)3DiqpQ_%~|m=44LcD4-bxO3OO*LPjsh%p(k?&jvLp0py57oMH|*IMa(<|{m1(0S|x)?R-mqJ=I;_YUZA>J z62v*eSK;5w!h8J+6Z2~oyGdZ68waWfy09?4fU&m7%u~zi?YPHPgK6LDwphgaYu%0j zurtw)AYOpYKgHBrkX189mlJ`q)w-f|6>IER{5Lk97%P~a-JyCRFjejW@L>n4vt6#hq;!|m;hNE||LK3nw1{bJOy+eBJjK=QqNjI;Q6;Rp5 z&035pZDUZ#%Oa;&_7x0T<7!RW`#YBOj}F380Bq?MjjEhrvlCATPdkCTTl+2efTX$k zH&0zR1n^`C3ef~^sXzJK-)52(T}uTG%OF8yDhT76L~|^+hZ2hiSM*QA9*D5odI1>& z9kV9jC~twA5MwyOx(lsGD_ggYmztXPD`2=_V|ks_FOx!_J8!zM zTzh^cc+=VNZ&(OdN=y4Juw)@8-85lwf_#VMN!Ed(eQiRiLB2^2e`4dp286h@v@`O%_b)Y~A; zv}r6U?zs&@uD_+(_4bwoy7*uozNvp?bXFoB8?l8yG0qsm1JYzIvB_OH4_2G*IIOwT zVl%HX1562vLVcxM_RG*~w_`FbIc!(T=3>r528#%mwwMK}uEhJ()3MEby zQQjzqjWkwfI~;Fuj(Lj=Ug0y`>~C7`w&wzjK(rPw+Hpd~EvQ-ufQOiB4OMpyUKJhw zqEt~jle9d7S~LI~$6Z->J~QJ{Vdn3!c}g9}*KG^Kzr^(7VI5Gk(mHLL{itj_hG?&K4Ws0+T4gLfi3eu$N=`s36geNC?c zm!~}vG6lx9Uf^5M;bWntF<-{p^bruy~f?sk9 zcETAPQZLoJ8JzMMg<-=ju4keY@SY%Wo?u9Gx=j&dfa6LIAB|IrbORLV1-H==Z1zCM zeZcOYpm5>U2fU7V*h;%n`8 zN95QhfD994={1*<2vKLCNF)feKOGk`R#K~G=;rfq}|)s20&MCa65 zUM?xF5!&e0lF%|U!#rD@I{~OsS_?=;s_MQ_b_s=PuWdC)q|UQ&ea)DMRh5>fpQjXe z%9#*x=7{iRCtBKT#H>#v%>77|{4_slZ)XCY{s3j_r{tdpvb#|r|sbS^dU1x70$eJMU!h{Y7Kd{dl}9&vxQl6Jt1a` zHQZrWyY0?!vqf@u-fxU_@+}u(%Wm>0I#KP48tiAPYY!TdW(o|KtVI|EUB9V`CBBNaBLVih7+yMVF|GSoIQD0Jfb{ z!OXq;(>Z?O`1gap(L~bUcp>Lc@Jl-})^=6P%<~~9ywY=$iu8pJ0m*hOPzr~q`23eX zgbs;VOxxENe0UMVeN*>uCn9Gk!4siN-e>x)pIKAbQz!G)TcqIJ0`JBBaX>1-4_XO_-HCS^vr2vjv#7KltDZdyQ{tlWh4$Gm zB>|O1cBDC)yG(sbnc*@w6e%e}r*|IhpXckx&;sQCwGdKH+3oSG-2)Bf#x`@<4ETAr z0My%7RFh6ZLiZ_;X6Mu1YmXx7C$lSZ^}1h;j`EZd6@%JNUe=btBE z%s=Xmo1Ps?8G`}9+6>iaB8bgjUdXT?=trMu|4yLX^m0Dg{m7rpKNJey|EwHI+nN1e zL^>qN%5Fg)dGs4DO~uwIdXImN)QJ*Jhpj7$fq_^`{3fwpztL@WBB}OwQ#Epo-mqMO zsM$UgpFiG&d#)lzEQ{3Q;)&zTw;SzGOah-Dpm{!q7<8*)Ti_;xvV2TYXa}=faXZy? z3y?~GY@kl)>G&EvEijk9y1S`*=zBJSB1iet>0;x1Ai)*`^{pj0JMs)KAM=@UyOGtO z3y0BouW$N&TnwU6!%zS%nIrnANvZF&vB1~P5_d`x-giHuG zPJ;>XkVoghm#kZXRf>qxxEix;2;D1CC~NrbO6NBX!`&_$iXwP~P*c($EVV|669kDO zKoTLZNF4Cskh!Jz5ga9uZ`3o%7Pv`d^;a=cXI|>y;zC3rYPFLQkF*nv(r>SQvD*## z(Vo%^9g`%XwS0t#94zPq;mYGLKu4LU3;txF26?V~A0xZbU4Lmy`)>SoQX^m7fd^*E z+%{R4eN!rIk~K)M&UEzxp9dbY;_I^c} zOc{wlIrN_P(PPqi51k_$>Lt|X6A^|CGYgKAmoI#Li?;Wq%q~q*L7ehZkUrMxW67Jl zhsb~+U?33QS>eqyN{(odAkbopo=Q$Az?L+NZW>j;#~@wCDX?=L5SI|OxI~7!Pli;e zELMFcZtJY3!|=Gr2L4>z8yQ-{To>(f80*#;6`4IAiqUw`=Pg$%C?#1 z_g@hIGerILSU>=P>z{gM|DS91A4cT@PEIB^hSop!uhMo#2G;+tQSpDO_6nOnPWSLU zS;a9m^DFMXR4?*X=}d7l;nXuHk&0|m`NQn%d?8|Ab3A9l9Jh5s120ibWBdB z$5YwsK3;wvp!Kn@)Qae{ef`0#NwlRpQ}k^r>yos_Ne1;xyKLO?4)t_G4eK~wkUS2A&@_;)K0-03XGBzU+5f+uMDxC z(s8!8!RvdC#@`~fx$r)TKdLD6fWEVdEYtV#{ncT-ZMX~eI#UeQ-+H(Z43vVn%Yj9X zLdu9>o%wnWdvzA-#d6Z~vzj-}V3FQ5;axDIZ;i(95IIU=GQ4WuU{tl-{gk!5{l4_d zvvb&uE{%!iFwpymz{wh?bKr1*qzeZb5f6e6m_ozRF&zux2mlK=v_(_s^R6b5lu?_W4W3#<$zeG~Pd)^!4tzhs}-Sx$FJP>)ZGF(hVTH|C3(U zs0PO&*h_ zNA-&qZpTP$$LtIgfiCn07}XDbK#HIXdmv8zdz4TY;ifNIH-0jy(gMSByG2EF~Th#eb_TueZC` zE?3I>UTMpKQ})=C;6p!?G)M6w^u*A57bD?2X`m3X^6;&4%i_m(uGJ3Z5h`nwxM<)H z$I5m?wN>O~8`BGnZ=y^p6;0+%_0K}Dcg|K;+fEi|qoBqvHj(M&aHGqNF48~XqhtU? z^ogwBzRlOfpAJ+Rw7IED8lRbTdBdyEK$gPUpUG}j-M42xDj_&qEAQEtbs>D#dRd7Y z<&TpSZ(quQDHiCFn&0xsrz~4`4tz!CdL8m~HxZM_agu@IrBpyeL1Ft}V$HX_ZqDPm z-f89)pjuEzGdq-PRu`b1m+qBGY{zr_>{6Ss>F|xHZlJj9dt5HD$u`1*WZe)qEIuDSR)%z+|n zatVlhQ?$w#XRS7xUrFE;Y8vMGhQS5*T{ZnY=q1P?w5g$OKJ#M&e??tAmPWHMj3xhS ziGxapy?kn@$~2%ZY;M8Bc@%$pkl%Rvj!?o%agBvpQ-Q61n9kznC4ttrRNQ4%GFR5u zyv%Yo9~yxQJWJSfj z?#HY$y=O~F|2pZs22pu|_&Ajd+D(Mt!nPUG{|1nlvP`=R#kKH zO*s$r_%ss5h1YO7k0bHJ2CXN)Yd6CHn~W!R=SqkWe=&nAZu(Q1G!xgcUilM@YVei@2@a`8he z9@pM`)VB*=e7-MWgLlXlc)t;fF&-AwM{E-EX}pViFn0I0CNw2bNEnN2dj!^4(^zS3 zobUm1uQnpqk_4q{pl*n06=TfK_C>UgurKFjRXsK_LEn};=79`TB12tv6KzwSu*-C8 z;=~ohDLZylHQ|Mpx-?yql>|e=vI1Z!epyUpAcDCp4T|*RV&X`Q$0ogNwy6mFALo^@ z9=&(9txO8V@E!@6^(W0{*~CT>+-MA~vnJULBxCTUW>X5>r7*eXYUT0B6+w@lzw%n> z_VjJ<2qf|(d6jYq2(x$(ZDf!yVkfnbvNmb5c|hhZ^2TV_LBz`9w!e_V*W_(MiA7|= z&EeIIkw*+$Xd!)j8<@_<}A5;~A_>3JT*kX^@}cDoLd>Qj<`Se^wdUa(j0dp+Tl8EptwBm{9OGsdFEq zM`!pjf(Lm(`$e3FLOjqA5LnN5o!}z{ zNf}rJuZh@yUtq&ErjHeGzX4(!luV!jB&;FAP|!R_QHYw#^Z1LwTePAKJ6X&IDNO#; z)#I@Xnnzyij~C@UH~X51JCgQeF0&hTXnuoElz#m{heZRexWc0k4<>0+ClX7%0 zEBqCCld1tD9Zwkr4{?Nor19#E5-YKfB8d?qgR82-Ow2^AuNevly2*tHA|sK!ybYkX zm-sLQH72P&{vEAW6+z~O5d0qd=xW~rua~5a?ymYFSD@8&gV)E5@RNNBAj^C99+Z5Z zR@Pq55mbCQbz+Mn$d_CMW<-+?TU960agEk1J<>d>0K=pF19yN))a~4>m^G&tc*xR+yMD*S=yip-q=H zIlredHpsJV8H(32@Zxc@bX6a21dUV95Th--8pE6C&3F>pk=yv$yd6@Haw;$v4+Fcb zRwn{Qo@0`7aPa2LQOP}j9v>sjOo5Kqvn|`FLizX zB+@-u4Lw|jsvz{p^>n8Vo8H2peIqJJnMN}A)q6%$Tmig7eu^}K2 zrh$X?T|ZMsoh{6pdw1G$_T<`Ds-G=jc;qcGdK4{?dN2-XxjDNbb(7pk|3JUVCU4y; z)?LXR>f+AAu)JEiti_Zy#z5{RgsC}R(@jl%9YZ>zu~hKQ*AxbvhC378-I@{~#%Y`Z zy=a=9YpewPIC+gkEUUwtUL7|RU7=!^Aa}Mk^6uxOgRGA#JXjWLsjFUnix|Mau{hDT z7mn*z1m5g`vP(#tjT0Zy4eAY(br&!RiiXE=ZI!{sE1#^#%x^Z7t1U)b<;%Y}Q9=5v z;wpDCEZ@OE36TWT=|gxigT@VaW9BvHS05;_P(#s z8zI4XFQys}q)<`tkX$WnSarn{3e!s}4(J!=Yf>+Y>cP3f;vr63f2{|S^`_pWc)^5_!R z*(x-fuBxL51@xe!lnDBKi}Br$c$BMZ3%f2Sa6kLabiBS{pq*yj;q|k(86x`PiC{p6 z_bxCW{>Q2BA8~Ggz&0jkrcU+-$ANBsOop*ms>34K9lNYil@}jC;?cYP(m^P}nR6FV zk(M%48Z&%2Rx$A&FhOEirEhY0(dn;-k(qkTU)sFQ`+-ih+s@A8g?r8Pw+}2;35WYf zi}VO`jS`p(tc)$X$a>-#WXoW!phhatC*$}|rk>|wUU71eUJG^$c6_jwX?iSHM@6__ zvV|6%U*$sSXJu9SX?2%M^kK|}a2QJ8AhF{fuXrHZxXsI~O zGKX45!K7p*MCPEQ=gp?eu&#AW*pR{lhQR##P_*{c_DjMGL|3T3-bSJ(o$|M{ytU}> zAV>wq*uE*qFo9KvnA^@juy{x<-u*#2NvkV={Ly}ysKYB-k`K3@K#^S1Bb$8Y#0L0# z`6IkSG&|Z$ODy|VLS+y5pFJx&8tvPmMd8c9FhCyiU8~k6FwkakUd^(_ml8`rnl>JS zZV){9G*)xBqPz^LDqRwyS6w86#D^~xP4($150M)SOZRe9sn=>V#aG0Iy(_^YcPpIz8QYM-#s+n% z@Jd?xQq?Xk6=<3xSY7XYP$$yd&Spu{A#uafiIfy8gRC`o0nk{ezEDjb=q_qRAlR1d zFq^*9Gn)yTG4b}R{!+3hWQ+u3GT~8nwl2S1lpw`s0X_qpxv)g+JIkVKl${sYf_nV~B>Em>M;RlqGb5WVil(89 zs=ld@|#;dq1*vQGz=7--Br-|l) zZ%Xh@v8>B7P?~}?Cg$q9_={59l%m~O&*a6TKsCMAzG&vD>k2WDzJ6!tc!V)+oxF;h zJH;apM=wO?r_+*#;ulohuP=E>^zon}a$NnlcQ{1$SO*i=jnGVcQa^>QOILc)e6;eNTI>os=eaJ{*^DE+~jc zS}TYeOykDmJ=6O%>m`i*>&pO_S;qMySJIyP=}4E&J%#1zju$RpVAkZbEl+p%?ZP^C z*$$2b4t%a(e+%>a>d_f_<JjxI#J1x;=hPd1zFPx=6T$;;X1TD*2(edZ3f46zaAoW>L53vS_J*N8TMB|n+;LD| zC=GkQPpyDY#Am4l49chDv*gojhRj_?63&&8#doW`INATAo(qY#{q}%nf@eTIXmtU< zdB<7YWfyCmBs|c)cK>1)v&M#!yNj#4d$~pVfDWQc_ke1?fw{T1Nce_b`v|Vp5ig(H zJvRD^+ps46^hLX;=e2!2e;w9y1D@!D$c@Jc&%%%IL=+xzw55&2?darw=9g~>P z9>?Kdc$r?6c$m%x2S$sdpPl>GQZ{rC9mPS63*qjCVa?OIBj!fW zm|g?>CVfGXNjOfcyqImXR_(tXS(F{FcoNzKvG5R$IgGaxC@)i(e+$ME}vPVIhd|mx2IIE+f zM?9opQHIVgBWu)^A|RzXw!^??S!x)SZOwZaJkGjc<_}2l^eSBm!eAJG9T>EC6I_sy z?bxzDIAn&K5*mX)$RQzDA?s)-no-XF(g*yl4%+GBf`##bDXJ==AQk*xmnatI;SsLp zP9XTHq5mmS=iWu~9ES>b%Q=1aMa|ya^vj$@qz9S!ih{T8_PD%Sf_QrNKwgrXw9ldm zHRVR98*{C?_XNpJn{abA!oix_mowRMu^2lV-LPi;0+?-F(>^5#OHX-fPED zCu^l7u3E%STI}c4{J2!)9SUlGP_@!d?5W^QJXOI-Ea`hFMKjR7TluLvzC-ozCPn1`Tpy z!vlv@_Z58ILX6>nDjTp-1LlFMx~-%GA`aJvG$?8*Ihn;mH37eK**rmOEwqegf-Ccx zrIX4;{c~RK>XuTXxYo5kMiWMy)!IC{*DHG@E$hx?RwP@+wuad(P1{@%tRkyJRqD)3 zMHHHZ4boqDn>-=DgR5VlhQTpfVy182Gk;A_S8A1-;U1RR>+$62>(MUx@Nox$vTjHq z%QR=j!6Gdyb5wu7y(YUktwMuW5<@jl?m4cv4BODiT5o8qVdC0MBqGr@-YBIwnpZAY znX9(_uQjP}JJ=!~Ve9#5I~rUnN|P_3D$LqZcvBnywYhjlMSFHm`;u9GPla{5QD7(7*6Tb3Svr8;(nuAd81q$*uq6HC_&~je*Ca7hP4sJp0av{M8480wF zxASi7Qv+~@2U%Nu1Ud;s-G4CTVWIPyx!sg&8ZG0Wq zG_}i3C(6_1>q3w!EH7$Kwq8uBp2F2N7}l65mk1p*9v0&+;th=_E-W)E;w}P(j⁢ zv5o9#E7!G0XmdzfsS{efPNi`1b44~SZ4Z8fuX!I}#8g+(wxzQwUT#Xb2(tbY1+EUhGKoT@KEU9Ktl>_0 z%bjDJg;#*gtJZv!-Zs`?^}v5eKmnbjqlvnSzE@_SP|LG_PJ6CYU+6zY6>92%E+ z=j@TZf-iW4(%U{lnYxQA;7Q!b;^brF8n0D>)`q5>|WDDXLrqYU_tKN2>=#@~OE7grMnNh?UOz-O~6 z6%rHy{#h9K0AT+lDC7q4{hw^|q6*Ry;;L%Q@)Ga}$60_q%D)rv(CtS$CQbpq9|y1e zRSrN4;$Jyl{m5bZw`$8TGvb}(LpY{-cQ)fcyJv7l3S52TLXVDsphtv&aPuDk1OzCA z4A^QtC(!11`IsNx_HnSy?>EKpHJWT^wmS~hc^p^zIIh@9f6U@I2 zC=Mve{j2^)mS#U$e{@Q?SO6%LDsXz@SY+=cK_QMmXBIU)j!$ajc-zLx3V60EXJ!qC zi<%2x8Q24YN+&8U@CIlN zrZkcT9yh%LrlGS9`G)KdP(@9Eo-AQz@8GEFWcb7U=a0H^ZVbLmz{+&M7W(nXJ4sN8 zJLR7eeK(K8`2-}j(T7JsO`L!+CvbueT%izanm-^A1Dn{`1Nw`9P?cq;7no+XfC`K(GO9?O^5zNIt4M+M8LM0=7Gz8UA@Z0N+lg+cX)NfazRu z5D)~HA^(u%w^cz+@2@_#S|u>GpB+j4KzQ^&Wcl9f z&hG#bCA(Yk0D&t&aJE^xME^&E-&xGHhXn%}psEIj641H+Nl-}boj;)Zt*t(4wZ5DN z@GXF$bL=&pBq-#vkTkh>7hl%K5|3 z{`Vn9b$iR-SoGENp}bn4;fR3>9sA%X2@1L3aE9yTra;Wb#_`xWwLSLdfu+PAu+o3| zGVnpzPr=ch{uuoHjtw7+_!L_2;knQ!DuDl0R`|%jr+}jFzXtrHIKc323?JO{l&;VF z*L1+}JU7%QJOg|5|Tc|D8fN zJORAg=_vsy{ak|o);@)Yh8Lkcg@$FG3k@ep36BRa^>~UmnRPziS>Z=`Jb2x*Q#`%A zU*i3&Vg?TluO@X0O;r2Jl6LKLUOVhSqg1*qOt^|8*c7 zo(298@+r$k_wQNGHv{|$tW(T8L+4_`FQ{kEW5Jgg{yf7ey4ss_(SNKfz(N9lx&a;< je(UuV8hP?p&}TPdm1I$XmG#(RzlD&B2izSj9sl%y5~4qc diff --git a/2023-2024/main-bot/networktables.json b/2023-2024/main-bot/networktables.json deleted file mode 100644 index fe51488..0000000 --- a/2023-2024/main-bot/networktables.json +++ /dev/null @@ -1 +0,0 @@ -[] diff --git a/2023-2024/main-bot/simgui-ds.json b/2023-2024/main-bot/simgui-ds.json deleted file mode 100644 index 73cc713..0000000 --- a/2023-2024/main-bot/simgui-ds.json +++ /dev/null @@ -1,92 +0,0 @@ -{ - "keyboardJoysticks": [ - { - "axisConfig": [ - { - "decKey": 65, - "incKey": 68 - }, - { - "decKey": 87, - "incKey": 83 - }, - { - "decKey": 69, - "decayRate": 0.0, - "incKey": 82, - "keyRate": 0.009999999776482582 - } - ], - "axisCount": 3, - "buttonCount": 4, - "buttonKeys": [ - 90, - 88, - 67, - 86 - ], - "povConfig": [ - { - "key0": 328, - "key135": 323, - "key180": 322, - "key225": 321, - "key270": 324, - "key315": 327, - "key45": 329, - "key90": 326 - } - ], - "povCount": 1 - }, - { - "axisConfig": [ - { - "decKey": 74, - "incKey": 76 - }, - { - "decKey": 73, - "incKey": 75 - } - ], - "axisCount": 2, - "buttonCount": 4, - "buttonKeys": [ - 77, - 44, - 46, - 47 - ], - "povCount": 0 - }, - { - "axisConfig": [ - { - "decKey": 263, - "incKey": 262 - }, - { - "decKey": 265, - "incKey": 264 - } - ], - "axisCount": 2, - "buttonCount": 6, - "buttonKeys": [ - 260, - 268, - 266, - 261, - 269, - 267 - ], - "povCount": 0 - }, - { - "axisCount": 0, - "buttonCount": 0, - "povCount": 0 - } - ] -} diff --git a/2023-2024/main-bot/simgui.json b/2023-2024/main-bot/simgui.json deleted file mode 100644 index 449f4b1..0000000 --- a/2023-2024/main-bot/simgui.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "NTProvider": { - "types": { - "/FMSInfo": "FMSInfo" - } - } -} diff --git a/2023-2024/main-bot/src/main/deploy/example.txt b/2023-2024/main-bot/src/main/deploy/example.txt deleted file mode 100644 index bb82515..0000000 --- a/2023-2024/main-bot/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/2023-2024/main-bot/src/main/deploy/robot_settings.json b/2023-2024/main-bot/src/main/deploy/robot_settings.json deleted file mode 100755 index 755d3d0..0000000 --- a/2023-2024/main-bot/src/main/deploy/robot_settings.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "controllerID": 0, - "auxControllerID": 1, - "swerveDrive": { - "FLSwerve": { - "driveID": 1, - "turnID": 2, - "encoderID": 10, - "location": "front", - "defensiveAngle": 315, - "posY": -0.23, - "posX": 0.36 - }, - "FRSwerve": { - "driveID": 7, - "turnID": 8, - "encoderID": 12, - "location": "front", - "defensiveAngle": 45, - "posY": 0.23, - "posX": 0.36 - }, - "BLSwerve": { - "driveID": 3, - "turnID": 4, - "encoderID": 11, - "location": "back", - "defensiveAngle": 45, - "posY": -0.23, - "posX": -0.36 - }, - "BRSwerve": { - "driveID": 5, - "turnID": 6, - "encoderID": 9, - "location": "back", - "defensiveAngle": 315, - "posY": 0.23, - "posX": -0.36 - } - } -} \ No newline at end of file diff --git a/2023-2024/main-bot/src/main/java/frc/CommonData.java b/2023-2024/main-bot/src/main/java/frc/CommonData.java deleted file mode 100644 index fe2b21a..0000000 --- a/2023-2024/main-bot/src/main/java/frc/CommonData.java +++ /dev/null @@ -1,164 +0,0 @@ -package frc; - -/** -* Data used by other classes. -*

-* This is used to store data that needs to be accessed by multiple classes. -*

-*/ -public final class CommonData { - - // Swerve Drive Variables // - - /** - * desiredTurn is the desired angle of the robot. - */ - private static double desiredTurn; - - /** - * forwardSpeed is the desired forward and backward speed of the robot. - */ - private static double forwardSpeed; - - /** - * sideSpeed is the desired left and right speed of the robot. - */ - private static double sideSpeed; - - /** - * battenDownTheHatches is used to control the defensive stance. - */ - private static boolean battenDownTheHatches; - - // NavX Variables // - - /** - * calibrate is used to determine if the NavX should be calibrated. - */ - private static boolean calibrate; - - // Autonomous Varaibles // - - /** - * counter is used in the state machine to see what state the robot is in. - */ - private static int counter; - - // Constructor // - // This is set to private as this is a utility class and - // should not be instantiated - private CommonData() { - throw new UnsupportedOperationException( - "This is a utility class and cannot be instantiated"); - } - - // Accesor Methods // - - /** - * Method for returning desiredTurn. - *s - * @return desiredTurn - */ - public static double getDesiredTurn() { - return desiredTurn; - } - - /** - * Method for setting the desiredTurn. - * - * @param value value to set desiredTurn - */ - public static void setDesiredTurn(final double value) { - desiredTurn = value; - } - - /** - * Method for returning forwardSpeed. - * - * @return forwardSpeed - */ - public static double getForwardSpeed() { - return forwardSpeed; - } - - /** - * Method for setting forwardSpeed. - * - * @param value value to set forwardSpeed - */ - public static void setForwardSpeed(final double value) { - forwardSpeed = value; - } - - /** - * Method for returning sideSpeed. - * - * @return sideSpeed - */ - public static double getSideSpeed() { - return sideSpeed; - } - - /** - * Method for setting sideSpeed. - * - * @param value value to set sideSpeed - */ - public static void setSideSpeed(final double value) { - sideSpeed = value; - } - - /** - * Method for returning battenDownTheHatches. - * - * @return battenDownTheHatches - */ - public static boolean getBattenDownTheHatches() { - return battenDownTheHatches; - } - - /** - * Method for setting battenDownTheHatches. - * - * @param value value to set battenDownTheHatches - */ - public static void setBattenDownTheHatches(final boolean value) { - battenDownTheHatches = value; - } - - /** - * Method for returning calibrate. - * - * @return calibrate - */ - public static boolean getCalibrate() { - return calibrate; - } - - /** - * Method for setting calibrate. - * - * @param value value to set calibrate - */ - public static void setCalibrate(final boolean value) { - calibrate = value; - } - - /** - * Method for returning counter. - * - * @return counter - */ - public static int getCounter() { - return counter; - } - - /** - * Method for setting counter. - * - * @param value value to set counter - */ - public static void setCounter(final int value) { - counter = value; - } -} diff --git a/2023-2024/main-bot/src/main/java/frc/components/IComponent.java b/2023-2024/main-bot/src/main/java/frc/components/IComponent.java deleted file mode 100755 index 2f57cf7..0000000 --- a/2023-2024/main-bot/src/main/java/frc/components/IComponent.java +++ /dev/null @@ -1,18 +0,0 @@ -package frc.components; - -/** - * Interface for components. - */ -public interface IComponent { - - // This is an interface. - // If a class implements any interface, - // it must have all of the methods in that interface. - // The methods defined in an interface are abstract, - // meaning they have no body. - - /** - * Method for updating the component. - */ - void update(); -} diff --git a/2023-2024/main-bot/src/main/java/frc/components/SwerveDrive.java b/2023-2024/main-bot/src/main/java/frc/components/SwerveDrive.java deleted file mode 100755 index 38ff9db..0000000 --- a/2023-2024/main-bot/src/main/java/frc/components/SwerveDrive.java +++ /dev/null @@ -1,132 +0,0 @@ -package frc.components; - -import com.kauailabs.navx.frc.AHRS; -import edu.wpi.first.math.geometry.Rotation2d; -import edu.wpi.first.math.kinematics.ChassisSpeeds; -import edu.wpi.first.math.kinematics.SwerveDriveKinematics; -import edu.wpi.first.wpilibj.SPI; -import frc.CommonData; -import frc.settings.SwerveDriveSettings; - -public class SwerveDrive implements IComponent { - - /** - * Overall Equation: - * - * Motor roations per second: - * Motor rotations per minute / 60 - * - * Wheel rotations per second: - * Motor rotations per second / gear ratio - * - * Wheel radius (in ft): - * Wheel diameter (in ft) / 2 - * or - * Wheel radius (in inches) / 12 - * - * Wheel circumference (in ft): - * Wheel radius (in ft) * 2 * pi - * - * Speed (in ft/s): - * Wheel rotations per second * wheel circumference (in ft) - * - * Total Equation: - * (Motor rotations per minute / 60) / gear ratio * wheel circumference - * (in ft) - * - * Note: The way it is lined out in the code is different but it still - * functions the same. - * - * Note: Phoenix 6 has a Swerve Drive API that can be utilized. - * It may be worth looking into. - * - * Note: These values are *not* correct for our current frame. - * These are for the 2022-2023 robot, they need to be updated. - */ - - /** - * The Falcon 500's RPM. - */ - private final static int FALCON_RPM = 6380; - - /** - * Gear ratio of the swerve modules. - */ - private final static double GEAR_RATIO = 3; - - /** - * Wheel circumference in feet. - */ - private final static double WHEEL_CIRCUMFERENCE = 0.3191858136; - - /** - * The maximum speed of the robot. - * - *

- * 60 is used to convert from minutes to seconds. - *

- */ - private final static double MAX_SPEED = (FALCON_RPM * WHEEL_CIRCUMFERENCE) / 60 / GEAR_RATIO; - - /** - * The maximum rotation of the robot. - */ - private final static double MAX_ROTATION = (MAX_SPEED * 2 * Math.PI) / 2.7389195456 / 2; - - // The 2.7389195456 value still needs to be documented - - /** - * The offset of the yaw. - */ - double yawOffset = 0; - - /** - * The constructor for the SwerveDrive class. - * @param settings The settings for the swerve drive. - */ - public SwerveDrive(final SwerveDriveSettings settings) { - swerveWheels = new SwerveWheel[] { - new SwerveWheel(settings.getFLSwerveSettings()), - new SwerveWheel(settings.getFRSwerveSettings()), - new SwerveWheel(settings.getBLSwerveSettings()), - new SwerveWheel(settings.getBRSwerveSettings()) - }; - - kinematics = new SwerveDriveKinematics(swerveWheels[0].getSwervePos(), swerveWheels[1].getSwervePos(), swerveWheels[2].getSwervePos(), swerveWheels[3].getSwervePos()); - } - - SwerveWheel[] swerveWheels; - - double leftOrRight; - double forwardOrBack; // This is the forward or back speed - - private AHRS ahrs = new AHRS(SPI.Port.kMXP); - - private SwerveDriveKinematics kinematics; - - public void update() { - - // Calabrate The NavX - if (CommonData.getCalibrate()) { - CommonData.setCalibrate(false); - yawOffset = ahrs.getYaw(); - } - - // Set to an if statement so the defensive code takes priority over driving - if (CommonData.getBattenDownTheHatches()) { - for (int i = 0; i < 4; i++) { - swerveWheels[i].defense(); - } - } - else { - final var desiredTranslationSpeedX = CommonData.getForwardSpeed() * MAX_SPEED; // This code uses '+x' as toward opposing alliance wall - final var desiredTranslationSpeedY = -CommonData.getSideSpeed() * MAX_SPEED; // This code uses '+y' as toward driver's right - final var desiredRotationSpeed = -CommonData.getDesiredTurn() * MAX_ROTATION; - var moduleStates = kinematics.toSwerveModuleStates(ChassisSpeeds.fromFieldRelativeSpeeds(desiredTranslationSpeedX, desiredTranslationSpeedY, desiredRotationSpeed, Rotation2d.fromDegrees(ahrs.getYaw()))); - - for (int i = 0; i < 4; i++) { - swerveWheels[i].set(moduleStates[i]); - } - } - } // Man that's a lot of curly braces -} diff --git a/2023-2024/main-bot/src/main/java/frc/components/SwerveWheel.java b/2023-2024/main-bot/src/main/java/frc/components/SwerveWheel.java deleted file mode 100755 index c845d21..0000000 --- a/2023-2024/main-bot/src/main/java/frc/components/SwerveWheel.java +++ /dev/null @@ -1,76 +0,0 @@ -package frc.components; - -import com.ctre.phoenix.motorcontrol.ControlMode; -import com.ctre.phoenix.motorcontrol.can.TalonFX; -import com.ctre.phoenix.sensors.CANCoder; -import edu.wpi.first.math.geometry.Rotation2d; -import edu.wpi.first.math.geometry.Translation2d; -import edu.wpi.first.math.kinematics.SwerveModuleState; -import frc.settings.SwerveWheelSettings; -import frc.settings.SwerveWheelSettings.Location; - -public class SwerveWheel -{ - TalonFX turnMotor; - TalonFX driveMotor; - CANCoder encoder; - - // 0.238125 Meters - // 0.365125 Meters - - Translation2d modulePos; - - double defensiveAngle; - - Location location; - - public SwerveWheel(SwerveWheelSettings settings) - { - turnMotor = new TalonFX(settings.getTurnID()); - driveMotor = new TalonFX(settings.getDriveID()); - encoder = new CANCoder(settings.getEncoderID()); - - location = settings.getLocation(); - defensiveAngle = settings.getDefensiveAngle(); - - modulePos = new Translation2d(settings.getPosX(), settings.getPosY()); - } - - public void set(SwerveModuleState swerveModuleState) { - - // TODO: Add documentation for this so each value is explained - swerveModuleState = SwerveModuleState.optimize(swerveModuleState, Rotation2d.fromDegrees(turnMotor.getSelectedSensorPosition() / 11.3777778)); - double maximumSpeed = (6380 * 0.3191858136) / 60 / 3; - - final double desiredTurnPos = swerveModuleState.angle.getDegrees() * 11.3777778; // conversion from degrees to native encoder value - - turnMotor.set(ControlMode.Position, desiredTurnPos); - - driveMotor.set(ControlMode.PercentOutput, swerveModuleState.speedMetersPerSecond / maximumSpeed); - // Using Velocity Can Be Used For Better Control But Percent Output Is Better Used For Practice - } - - public void defense() { - - // TODO: Add documentation for the 11.77777777 value - turnMotor.set(ControlMode.Position, defensiveAngle * 11.77777777); - driveMotor.set(ControlMode.PercentOutput, 0); - } - - public TalonFX getTurnMotor() { - return turnMotor; - } - - public TalonFX getDriveMotor() { - return driveMotor; - } - - public Translation2d getSwervePos() { - return modulePos; - } - - // public void battenDownTheHatches() - // { - // set(defensiveAngle, 0, 0); - // } -} \ No newline at end of file diff --git a/2023-2024/main-bot/src/main/java/frc/components/autonomous/Autonomous.java b/2023-2024/main-bot/src/main/java/frc/components/autonomous/Autonomous.java deleted file mode 100755 index 79a1cce..0000000 --- a/2023-2024/main-bot/src/main/java/frc/components/autonomous/Autonomous.java +++ /dev/null @@ -1,58 +0,0 @@ -package frc.components.autonomous; - -import frc.components.IComponent; -import frc.state_machine.StateMachine; - -/** - * Autonomous component. - *

- * This class is used for autonomous mode. - * It sets up a state machine and excutes the states contained. - *

- *

- * If you want to add a new state, see the constructor. - * {@link frc.components.autonomous.Autonomous#Autonomous()} - *

- * This class implements the - * {@link frc.components.IComponent IComponent} interface. - *

- * - * @see frc.state_machine.StateMachine - */ -public final class Autonomous implements IComponent { - - - /** - * State machine object. - */ - private StateMachine stateMachine = new StateMachine(); - - /** - * Autonomous constructor. - *

- * This is where new states are added to the state machine. - * Any state added here will be run during autonomous in - * the order they are added. - *

- *

- * You can add states by using the following code: - * - *

-     * stateMachine.addState(new StateName());
-     * 
- * - * Any added states must also exist in this directory as separate - * classes. - *

- * - * @see frc.components.autonomous.DriveState1 - */ - public Autonomous() { - stateMachine.addState(new DriveState1()); - } - - @Override - public void update() { - stateMachine.run(); - } -} diff --git a/2023-2024/main-bot/src/main/java/frc/components/autonomous/DriveState1.java b/2023-2024/main-bot/src/main/java/frc/components/autonomous/DriveState1.java deleted file mode 100644 index 2f8576c..0000000 --- a/2023-2024/main-bot/src/main/java/frc/components/autonomous/DriveState1.java +++ /dev/null @@ -1,60 +0,0 @@ -package frc.components.autonomous; - -import edu.wpi.first.wpilibj.Timer; -import frc.CommonData; -import frc.state_machine.State; - -/** - * The first drive state during autonomous mode. - *

- * This state drives the robot forward at 35% speed for 3 seconds - *

- */ -public final class DriveState1 extends State { - - /** - * The forward speed of the robot. - */ - private static final double FORWARD_SPEED = 0.35; - - /** - * The time the robot drives forward. - */ - private static final int DRIVE_TIME = 3; - - /** - * Timer object. - */ - private Timer timer; - - @Override - public void onEnter() { - // Mainly used for debugging - System.out.println("Drive State 1 entered"); - } - - @Override - public void onExit() { - // Mainly used for debugging - System.out.println("Drive State 1 exited"); - } - - @Override - public boolean run() { - - // Set the values so it drives forward at a speed of 35% in reverse - CommonData.setForwardSpeed(-FORWARD_SPEED); - CommonData.setDesiredTurn(0); - - // Set a new timer if one doesn't exist already - if (timer == null) { - timer = new Timer(); - timer.start(); - // If the timer has elapses 3 seconds, exit the state - } else if (timer.hasElapsed(DRIVE_TIME)) { - return true; - } - - return false; - } -} diff --git a/2023-2024/main-bot/src/main/java/frc/components/autonomous/package-info.java b/2023-2024/main-bot/src/main/java/frc/components/autonomous/package-info.java deleted file mode 100644 index 8fa5a28..0000000 --- a/2023-2024/main-bot/src/main/java/frc/components/autonomous/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * Contains classes that are used to run autonomous. - */ -package frc.components.autonomous; diff --git a/2023-2024/main-bot/src/main/java/frc/components/package-info.java b/2023-2024/main-bot/src/main/java/frc/components/package-info.java deleted file mode 100644 index 74893cd..0000000 --- a/2023-2024/main-bot/src/main/java/frc/components/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Package used to organize all of the components of the robot. - *

- * These components can include the drivetrain, an arm, an intake, etc. - *

- */ -package frc.components; diff --git a/2023-2024/main-bot/src/main/java/frc/controllers/LogitechF310.java b/2023-2024/main-bot/src/main/java/frc/controllers/LogitechF310.java deleted file mode 100755 index 74a8997..0000000 --- a/2023-2024/main-bot/src/main/java/frc/controllers/LogitechF310.java +++ /dev/null @@ -1,463 +0,0 @@ -package frc.controllers; - -import edu.wpi.first.wpilibj.Joystick; - -/** - * This class is used to create an LogitechF310 controller object. - *

- * This class uses the {@code Joystick} class from the wpilibj library. - *

- *

- * This uses a deadband that can be set if needed. This helps control drift. - * This value can be in a range of 0 to 1. The higher the value, the more the - * stick has to move to register. This value is set in the constructor and is - * set alongside the controller ID. As a note: The deadband is only applied - * to the joystick axes. - *

- * - * @see PS4 - * @see Xbox - * - * @see edu.wpi.first.wpilibj.Joystick - */ -public class LogitechF310 { - - // Button IDs // - - /** - * The axis ID for the left joystick x. - */ - private static final int JOYSTICK_LEFT_X = 0; - - /** - * The axis ID for the left joystick y. - */ - private static final int JOYSTICK_LEFT_Y = 1; - - /** - * The axis ID for the left trigger. - */ - private static final int TRIGGER_LEFT = 2; - - /** - * The axis ID for the right trigger. - */ - private static final int TRIGGER_RIGHT = 3; - - /** - * The axis ID for the right joystick x. - */ - private static final int JOYSTICK_RIGHT_X = 4; - - /** - * The axis ID for the right joystick y. - */ - private static final int JOYSTICK_RIGHT_Y = 5; - - /** - * The button ID for the A button. - */ - private static final int BUTTON_A = 1; - - /** - * The button ID for the B button. - */ - private static final int BUTTON_B = 2; - - /** - * The button ID for the X button. - */ - private static final int BUTTON_X = 3; - - /** - * The button ID for the Y button. - */ - private static final int BUTTON_Y = 4; - - /** - * The button ID for the left bumper. - */ - private static final int BUTTON_LEFT_BUMPER = 5; - - /** - * The button ID for the right bumper. - */ - private static final int BUTTON_RIGHT_BUMPER = 6; - - /** - * The button ID for the start button. - */ - private static final int BUTTON_START = 7; - - /** - * The button ID for the back button. - */ - private static final int BUTTON_BACK = 8; - - /** - * The controller object. - * In this case, a {@code Joystick} object. - * - * @see edu.wpi.first.wpilibj.Joystick - */ - private Joystick controller; - - /** - * The deadband value. - */ - private double deadBand; - - /** - * Constructor for the LogitechF310 class. - *

- * This constructor is used to create a LogitechF310 object. - * This takes in the controller ID and the deadband value. - *

- * - * @param id Controller ID (Port) - * @param deadBandValue Deadband value - */ - public LogitechF310(final int id, final double deadBandValue) { - controller = new Joystick(id); - deadBand = deadBandValue; - } - - // Deadband Method // - - /** - * Method for setting the deadband of the controller on the X and Y axes. - *

- * This sets a threshold the joystick must pass before registering a value. - * This value can be in a range of 0 to 1. The higher the value, - * the more the joystick has to move to register. - *

- * - * @return Deadbanded value - * - * @param value Value to be deadbanded - */ - private double deadBand(final double value) { - return Math.abs(value) < deadBand ? 0 : value; - } - - // Joystick Methods // - - /** - * Method for returning the X value of the left joystick. - * - * @return X value of the left joystick - * - * @see LogitechF310#getRightX - * @see LogitechF310#getRightY - * @see LogitechF310#getLeftY - */ - public double getLeftX() { - return deadBand(controller.getRawAxis(JOYSTICK_LEFT_X)); - } - - /** - * Method for returning the Y value of the left joystick. - * - * @return Y value of the left joystick - * - * @see LogitechF310#getRightX - * @see LogitechF310#getRightY - * @see LogitechF310#getLeftX - */ - public double getLeftY() { - return deadBand(controller.getRawAxis(JOYSTICK_LEFT_Y)); - } - - /** - * Method for returning the X value of the right joystick. - * - * @return X value of the right joystick - * - * @see LogitechF310#getRightY - * @see LogitechF310#getLeftX - * @see LogitechF310#getLeftY - */ - public double getRightX() { - return deadBand(controller.getRawAxis(JOYSTICK_RIGHT_X)); - } - - /** - * Method for returning the Y value of the right joystick. - * - * @return Y value of the right joystick - * - * @see LogitechF310#getRightX - * @see LogitechF310#getLeftX - * @see LogitechF310#getLeftY - */ - public double getRightY() { - return deadBand(controller.getRawAxis(JOYSTICK_RIGHT_Y)); - } - - // Trigger Methods // - - /** - * Method for returning the value of the left trigger. - * - * @return Value of the left trigger - * - * @see LogitechF310#getRightTrigger - */ - public double getLeftTrigger() { - return deadBand(controller.getRawAxis(TRIGGER_LEFT)); - } - - /** - * Method for returning the value of the right trigger. - * - * @return Value of the right trigger - * - * @see LogitechF310#getLeftTrigger - */ - public double getRightTrigger() { - return deadBand(controller.getRawAxis(TRIGGER_RIGHT)); - } - - // Button Methods // - - /** - * Method for returning the value of the A button. - * - * @return Value of the A button - * - * @see LogitechF310#getBButton - * @see LogitechF310#getXButton - * @see LogitechF310#getYButton - */ - public boolean getAButton() { - return controller.getRawButton(BUTTON_A); - } - - /** - * Method for returning the value of the B button. - * - * @return Value of the B button - * - * @see LogitechF310#getAButton - * @see LogitechF310#getXButton - * @see LogitechF310#getYButton - */ - public boolean getBButton() { - return controller.getRawButton(BUTTON_B); - } - - /** - * Method for returning the value of the X button. - * - * @return Value of the X button - * - * @see LogitechF310#getAButton - * @see LogitechF310#getBButton - * @see LogitechF310#getYButton - */ - public boolean getXButton() { - return controller.getRawButton(BUTTON_X); - } - - /** - * Method for returning the value of the Y button. - * - * @return Value of the Y button - * - * @see LogitechF310#getAButton - * @see LogitechF310#getBButton - * @see LogitechF310#getXButton - */ - public boolean getYButton() { - return controller.getRawButton(BUTTON_Y); - } - - /** - * Method for returning the value of the back button. - * - * @return Value of the back button - * - * @see LogitechF310#getStartButton - */ - public boolean getBackButton() { - return controller.getRawButton(BUTTON_START); - } - - /** - * Method for returning the value of the start button. - * - * @return Value of the start button - * - * @see LogitechF310#getBackButton - */ - public boolean getStartButton() { - return controller.getRawButton(BUTTON_BACK); - } - - /** - * Method for returning the value of the left bumper. - * - * @return Value of the left bumper - * - * @see LogitechF310#getRightBumper - */ - public boolean getLeftBumper() { - return controller.getRawButton(BUTTON_LEFT_BUMPER); - } - - /** - * Method for returning the value of the right bumper. - * - * @return Value of the right bumper - * - * @see LogitechF310#getLeftBumper - */ - public boolean getRightBumper() { - return controller.getRawButton(BUTTON_RIGHT_BUMPER); - } - - // D-Pad Methods // - - public enum DPad { - /** - * Up on the D-Pad. - */ - up, - - /** - * Down on the D-Pad. - */ - down, - - /** - * Right on the D-Pad. - */ - left, - - /** - * Left on the D-Pad. - */ - right, - - /** - * Up-Right on the D-Pad. - */ - upright, - - /** - * Up-Left on the D-Pad. - */ - upleft, - - /** - * Down-Right on the D-Pad. - */ - downright, - - /** - * Down-Left on the D-Pad. - */ - downleft, - - /** - * No direction on the D-Pad. - */ - none - } - - /** - * Upright D-Pad POV value. - */ - private static final int DPAD_UPRIGHT = 45; - - /** - * Right D-Pad POV value. - */ - private static final int DPAD_RIGHT = 90; - - /** - * Downright D-Pad POV value. - */ - private static final int DPAD_DOWNRIGHT = 135; - - /** - * Down POV D-Pad value. - */ - private static final int DPAD_DOWN = 180; - - /** - * Downleft D-Pad POV value. - */ - private static final int DPAD_DOWNLEFT = 225; - - /** - * Left D-Pad POV value. - */ - private static final int DPAD_LEFT = 270; - - /** - * Upleft D-Pad POV value. - */ - private static final int DPAD_UPLEFT = 315; - - /** - * Up D-Pad POV value. - */ - private static final int DPAD_UP = 360; - - /** - * Method for returning the value of the D-Pad. - * - * @return value of the D-Pad - * - * @see LogitechF310.DPad - */ - public DPad getDPad() { - switch (controller.getPOV()) { - case 0: - return DPad.up; - case DPAD_UPRIGHT: - return DPad.upright; - case DPAD_RIGHT: - return DPad.right; - case DPAD_DOWNRIGHT: - return DPad.downright; - case DPAD_DOWN: - return DPad.down; - case DPAD_DOWNLEFT: - return DPad.downleft; - case DPAD_LEFT: - return DPad.left; - case DPAD_UPLEFT: - return DPad.upleft; - case DPAD_UP: - return DPad.up; - default: - return DPad.none; - } - } - - // Rumble Methods // - - // This controller does not have rumble functionality :( - - // General Methods // - - /** - * Method for checking if the controller is connected. - * - * @return true if the controller is connected, false if not - */ - public boolean isConnected() { - return (controller.isConnected()); - } - - /** - * Method for getting the name of the controller. - * - * @return name of the controller - */ - public String getName() { - return controller.getName(); - } -} diff --git a/2023-2024/main-bot/src/main/java/frc/controllers/PS4.java b/2023-2024/main-bot/src/main/java/frc/controllers/PS4.java deleted file mode 100644 index cef2652..0000000 --- a/2023-2024/main-bot/src/main/java/frc/controllers/PS4.java +++ /dev/null @@ -1,498 +0,0 @@ -package frc.controllers; - -import edu.wpi.first.wpilibj.PS4Controller; -import edu.wpi.first.wpilibj.GenericHID.RumbleType; - -/** - * This class is used to create an PS4 controller object. - *

- * This class uses the {@code PS4Controller} class from the wpilibj library. - *

- *

- * This uses a deadband that can be set if needed. This helps control drift. - * This value can be in a range of 0 to 1. The higher the value, the more the - * stick has to move to register. This value is set in the constructor and is - * set alongside the controller ID. As a note: The deadband is only applied - * to the joystick axes. - *

- * - * @see LogitechF310 - * @see Xbox - * - * @see edu.wpi.first.wpilibj.PS4Controller - */ -public class PS4 { - - /** - * The controller object. - * In this case, a {@code PS4Controller} object. - * - * @see edu.wpi.first.wpilibj.PS4Controller - */ - private PS4Controller controller; - - /** - * The deadband value. - */ - private double deadBand; - - /** - * Constructor for the PS4 class. - *

- * This constructor is used to create a LogitechF310 object. - * This takes in the controller ID and the deadband value. - *

- * - * @param id Controller ID (Port) - * @param deadBandValue Deadband value - */ - public PS4(final int id, final double deadBandValue) { - controller = new PS4Controller(id); - deadBand = deadBandValue; - } - - // Deadband Method // - - // Although this isn't really needed for newer controllers, - // it's still here just in case one might develop drift - - /** - * Method for setting the deadband of the controller on the X and Y axes. - *

- * This sets a threshold the joystick must pass before registering a value. - * This value can be in a range of 0 to 1. The higher the value, - * the more the joystick has to move to register. - *

- * - * @return Deadbanded value - * - * @param value Value to be deadbanded - */ - private double deadBand(final double value) { - return Math.abs(value) < deadBand ? 0 : value; - } - - // Joystick Methods // - - /** - * Method for returning the X value of the left joystick. - * - * @return X value of the left joystick - * - * @see PS4#getRightX - * @see PS4#getRightY - * @see PS4#getLeftY - */ - public double getLeftX() { - return deadBand(controller.getLeftX()); - } - - /** - * Method for returning the Y value of the left joystick. - * - * @return Y value of the left joystick - * - * @see PS4#getRightX - * @see PS4#getRightY - * @see PS4#getLeftX - */ - public double getLeftY() { - return deadBand(controller.getLeftY()); - } - - /** - * Method for returning the X value of the right joystick. - * - * @return X value of the right joystick - * - * @see PS4#getLeftX - * @see PS4#getRightY - * @see PS4#getLeftY - */ - public double getRightX() { - return deadBand(controller.getRightX()); - } - - /** - * Method for returning the Y value of the right joystick. - * - * @return Y value of the right joystick - * - * @see PS4#getRightX - * @see PS4#getLeftX - * @see PS4#getLeftY - */ - public double getRightY() { - return deadBand(controller.getRightY()); - } - - // Trigger Methods // - - /** - * Method for returning the value of the left trigger. - * - * @return value of the left trigger - * - * @see PS4#getRightTrigger - */ - public double getLeftTrigger() { - return deadBand(controller.getL2Axis()); - } - - /** - * Method for returning the value of the right trigger. - * - * @return value of the right trigger - * - * @see PS4#getLeftTrigger - */ - public double getRightTrigger() { - return deadBand(controller.getR2Axis()); - } - - // Button Methods // - - /** - * Method for returning the value of the X button. - * - * @return value of the X button - * - * @see PS4#getSquareButton - * @see PS4#getCircleButton - * @see PS4#getTriangleButton - * @see PS4#getShareButton - * @see PS4#getOptionsButton - * @see PS4#getPlayStationButton - * @see PS4#getTouchpadButton - */ - public boolean getXButton() { - return controller.getCrossButton(); - } - - /** - * Method for returning the value of the Square button. - * - * @return value of the Square button - * - * @see PS4#getXButton - * @see PS4#getCircleButton - * @see PS4#getTriangleButton - * @see PS4#getShareButton - * @see PS4#getOptionsButton - * @see PS4#getPlayStationButton - * @see PS4#getTouchpadButton - */ - public boolean getSquareButton() { - return controller.getSquareButton(); - } - - /** - * Method for returning the value of the Circle button. - * - * @return value of the Circle button - * - * @see PS4#getXButton - * @see PS4#getSquareButton - * @see PS4#getTriangleButton - * @see PS4#getShareButton - * @see PS4#getOptionsButton - * @see PS4#getPlayStationButton - * @see PS4#getTouchpadButton - */ - public boolean getCircleButton() { - return controller.getCircleButton(); - } - - /** - * Method for returning the value of the Triangle button. - * - * @return value of the Triangle button - * - * @see PS4#getXButton - * @see PS4#getSquareButton - * @see PS4#getCircleButton - * @see PS4#getShareButton - * @see PS4#getOptionsButton - * @see PS4#getPlayStationButton - * @see PS4#getTouchpadButton - */ - public boolean getTriangleButton() { - return controller.getTriangleButton(); - } - - /** - * Method for returning the value of the Share button. - * - * @return value of the Share button - * - * @see PS4#getXButton - * @see PS4#getSquareButton - * @see PS4#getCircleButton - * @see PS4#getTriangleButton - * @see PS4#getOptionsButton - * @see PS4#getPlayStationButton - * @see PS4#getTouchpadButton - */ - public boolean getShareButton() { - return controller.getShareButton(); - } - - /** - * Method for returning the value of the Options button. - * - * @return value of the Options button - * - * @see PS4#getXButton - * @see PS4#getSquareButton - * @see PS4#getCircleButton - * @see PS4#getTriangleButton - * @see PS4#getShareButton - * @see PS4#getPlayStationButton - * @see PS4#getTouchpadButton - */ - public boolean getOptionsButton() { - return controller.getOptionsButton(); - } - - /** - * Method for returning the value of the PlayStation button. - * - * @return value of the PlayStation button - * - * @see PS4#getXButton - * @see PS4#getSquareButton - * @see PS4#getCircleButton - * @see PS4#getTriangleButton - * @see PS4#getShareButton - * @see PS4#getOptionsButton - * @see PS4#getTouchpadButton - */ - public boolean getPlayStationButton() { - return controller.getPSButton(); - } - - /** - * Method for returning the value of the left bumper. - * - * @return value of the left bumper - * - * @see PS4#getRightBumper - */ - public boolean getLeftBumper() { - return controller.getL1Button(); - } - - /** - * Method for returning the value of the right bumper. - * - * @return value of the right bumper - * - * @see PS4#getLeftBumper - */ - public boolean getRightBumper() { - return controller.getR1Button(); - } - - /** - * Method for returning the value of the left joystick button. - * - * @return value of the left joystick button - * - * @see PS4#getRightJoystickButton - */ - public boolean getLeftJoystickButton() { - return controller.getL3Button(); - } - - /** - * Method for returning the value of the right joystick button. - * - * @return value of the right joystick button - * - * @see PS4#getLeftJoystickButton - */ - public boolean getRightJoystickButton() { - return controller.getR3Button(); - } - - // Touchpad Methods // - - /** - * Method for returning the value of the Touchpad button. - * - * @return value of the Touchpad button - * - * @see PS4#getXButton - * @see PS4#getSquareButton - * @see PS4#getCircleButton - * @see PS4#getTriangleButton - * @see PS4#getShareButton - * @see PS4#getOptionsButton - * @see PS4#getPlayStationButton - */ - public boolean getTouchpadButton() { - return controller.getTouchpad(); - } - - // There is a 'touchpad' that uses an event loop - // but for the purpose of this class, it is not needed - // It might be added in a future version if there becomes a need for it - // If you have a need for it or have added it yourself, - // Submit a pull request or submit an issue on the GitHub repository - // https://github.com/J-The-Fox/FRC-Team-5098 - - // D-Pad Methods // - - public enum DPad { - /** - * Up on the D-Pad. - */ - up, - - /** - * Down on the D-Pad. - */ - down, - - /** - * Right on the D-Pad. - */ - left, - - /** - * Left on the D-Pad. - */ - right, - - /** - * Up-Right on the D-Pad. - */ - upright, - - /** - * Up-Left on the D-Pad. - */ - upleft, - - /** - * Down-Right on the D-Pad. - */ - downright, - - /** - * Down-Left on the D-Pad. - */ - downleft, - - /** - * No direction on the D-Pad. - */ - none - } - - /** - * Upright D-Pad POV value. - */ - private static final int DPAD_UPRIGHT = 45; - - /** - * Right D-Pad POV value. - */ - private static final int DPAD_RIGHT = 90; - - /** - * Downright D-Pad POV value. - */ - private static final int DPAD_DOWNRIGHT = 135; - - /** - * Down POV D-Pad value. - */ - private static final int DPAD_DOWN = 180; - - /** - * Downleft D-Pad POV value. - */ - private static final int DPAD_DOWNLEFT = 225; - - /** - * Left D-Pad POV value. - */ - private static final int DPAD_LEFT = 270; - - /** - * Upleft D-Pad POV value. - */ - private static final int DPAD_UPLEFT = 315; - - /** - * Up D-Pad POV value. - */ - private static final int DPAD_UP = 360; - - /** - * Method for returning the value of the D-Pad. - * - * @return value of the D-Pad - * - * @see PS4.DPad - */ - public DPad getDPad() { - switch (controller.getPOV()) { - case 0: - return DPad.up; - case DPAD_UPRIGHT: - return DPad.upright; - case DPAD_RIGHT: - return DPad.right; - case DPAD_DOWNRIGHT: - return DPad.downright; - case DPAD_DOWN: - return DPad.down; - case DPAD_DOWNLEFT: - return DPad.downleft; - case DPAD_LEFT: - return DPad.left; - case DPAD_UPLEFT: - return DPad.upleft; - case DPAD_UP: - return DPad.up; - default: - return DPad.none; - } - } - - // Rumble Methods // - - /** - * Method for setting the rumble of the controller. - * - * @param type type of rumble to set - * @param value value to set the rumble to - * - * @see edu.wpi.first.wpilibj.GenericHID.RumbleType - */ - public void setRumble(final RumbleType type, final double value) { - controller.setRumble(type, value); - } - - // General Methods // - - /** - * Method for checking if the controller is connected. - * - * @return true if the controller is connected, false if not - */ - public boolean isConnected() { - return (controller.isConnected()); - } - - /** - * Method for getting the name of the controller. - * - * @return name of the controller - */ - public String getName() { - return controller.getName(); - } -} diff --git a/2023-2024/main-bot/src/main/java/frc/controllers/Xbox.java b/2023-2024/main-bot/src/main/java/frc/controllers/Xbox.java deleted file mode 100644 index c8cc131..0000000 --- a/2023-2024/main-bot/src/main/java/frc/controllers/Xbox.java +++ /dev/null @@ -1,425 +0,0 @@ -package frc.controllers; - -import edu.wpi.first.wpilibj.XboxController; -import edu.wpi.first.wpilibj.GenericHID.RumbleType; - -/** - * This class is used to create an Xbox controller object. - *

- * This class uses the {@code XboxController} class from the wpilibj library. - *

- *

- * This uses a deadband that can be set if needed. This helps control drift. - * This value can be in a range of 0 to 1. The higher the value, the more the - * stick has to move to register. This value is set in the constructor and is - * set alongside the controller ID. As a note: The deadband is only applied - * to the joystick axes. - *

- * - * @see LogitechF310 - * @see PS4 - * - * @see edu.wpi.first.wpilibj.XboxController - */ -public class Xbox { - - /** - * The controller object. - * In this case, a {@code XboxController} object. - */ - private XboxController controller; - - /** - * The deadband value. - */ - private double deadBand; - - /** - * Constructor for the Xbox class. - *

- * This constructor is used to create a LogitechF310 object. - * This takes in the controller ID and the deadband value. - *

- * - * @param id Controller ID (Port) - * @param deadBandValue Deadband value - */ - public Xbox(final int id, final double deadBandValue) { - controller = new XboxController(id); - deadBand = deadBandValue; - } - - // Deadband Method // - - // Although this isn't really needed for newer controllers, - // it's still here just in case one might develop drift - - /** - * Method for setting the deadband of the controller on the X and Y axes. - *

- * This sets a threshold the joystick must pass before registering a value. - * This value can be in a range of 0 to 1. The higher the value, - * the more the joystick has to move to register. - *

- * - * @return Deadbanded value - * - * @param value Value to be deadbanded - */ - private double deadBand(final double value) { - return Math.abs(value) < deadBand ? 0 : value; - } - - // Joystick Methods // - - /** - * Method for returning the X value of the left joystick. - * - * @return X value of the left joystick - * - * @see Xbox#getRightX - * @see Xbox#getRightY - * @see Xbox#getLeftY - */ - public double getLeftX() { - return deadBand(controller.getLeftX()); - } - - /** - * Method for returning the Y value of the left joystick. - * - * @return Y value of the left joystick - * - * @see Xbox#getRightX - * @see Xbox#getRightY - * @see Xbox#getLeftX - */ - public double getLeftY() { - return deadBand(controller.getLeftY()); - } - - /** - * Method for returning the X value of the right joystick. - * - * @return X value of the right joystick - * - * @see Xbox#getRightY - * @see Xbox#getLeftX - * @see Xbox#getLeftY - */ - public double getRightX() { - return deadBand(controller.getRightX()); - } - - /** - * Method for returning the Y value of the right joystick. - * - * @return Y value of the right joystick - * - * @see Xbox#getRightX - * @see Xbox#getLeftX - * @see Xbox#getLeftY - */ - public double getRightY() { - return deadBand(controller.getRightY()); - } - - // Trigger Methods // - - /** - * Method for returning the value of the left trigger. - * - * @return value of the left trigger - * - * @see Xbox#getRightTrigger - */ - public double getLeftTrigger() { - return controller.getLeftTriggerAxis(); - } - - /** - * Method for returning the value of the right trigger. - * - * @return value of the right trigger - * - * @see Xbox#getLeftTrigger - */ - public double getRightTrigger() { - return controller.getRightTriggerAxis(); - } - - // Button Methods // - - /** - * Method for returning the value of the A button. - * - * @return value of the A button - * - * @see Xbox#getBButton - * @see Xbox#getXButton - * @see Xbox#getYButton - */ - public boolean getAButton() { - return controller.getAButton(); - } - - /** - * Method for returning the value of the B button. - * - * @return value of the B button - * - * @see Xbox#getAButton - * @see Xbox#getXButton - * @see Xbox#getYButton - */ - public boolean getBButton() { - return controller.getBButton(); - } - - /** - * Method for returning the value of the X button. - * - * @return value of the X button - * - * @see Xbox#getAButton - * @see Xbox#getBButton - * @see Xbox#getYButton - */ - public boolean getXButton() { - return controller.getXButton(); - } - - /** - * Method for returning the value of the Y button. - * - * @return value of the Y button - * - * @see Xbox#getAButton - * @see Xbox#getBButton - * @see Xbox#getXButton - */ - public boolean getYButton() { - return controller.getYButton(); - } - - /** - * Method for returning the value of the start button. - * - * @return value of the start button - * - * @see Xbox#getBackButton - */ - public boolean getStartButton() { - return controller.getStartButton(); - } - - /** - * Method for returning the value of the back button. - * - * @return value of the back button - * - * @see Xbox#getStartButton - */ - public boolean getBackButton() { - return controller.getBackButton(); - } - - /** - * Method for returning the value of the left bumper. - * - * @return value of the left bumper - * - * @see Xbox#getRightBumper - */ - public boolean getLeftBumper() { - return controller.getLeftBumper(); - } - - /** - * Method for returning the value of the right bumper. - * - * @return value of the right bumper - * - * @see Xbox#getLeftBumper - */ - public boolean getRightBumper() { - return controller.getRightBumper(); - } - - /** - * Method for returning the value of the left stick button. - * - * @return value of the left stick button - * - * @see Xbox#getRightStickButton - */ - public boolean getLeftStickButton() { - return controller.getLeftStickButton(); - } - - /** - * Method for returning the value of the right stick button. - * - * @return value of the right stick button - * - * @see Xbox#getLeftStickButton - */ - public boolean getRightStickButton() { - return controller.getRightStickButton(); - } - - // D-Pad Methods // - - public enum DPad { - /** - * Up on the D-Pad. - */ - up, - - /** - * Down on the D-Pad. - */ - down, - - /** - * Right on the D-Pad. - */ - left, - - /** - * Left on the D-Pad. - */ - right, - - /** - * Up-Right on the D-Pad. - */ - upright, - - /** - * Up-Left on the D-Pad. - */ - upleft, - - /** - * Down-Right on the D-Pad. - */ - downright, - - /** - * Down-Left on the D-Pad. - */ - downleft, - - /** - * No direction on the D-Pad. - */ - none - } - - /** - * Upright D-Pad POV value. - */ - private static final int DPAD_UPRIGHT = 45; - - /** - * Right D-Pad POV value. - */ - private static final int DPAD_RIGHT = 90; - - /** - * Downright D-Pad POV value. - */ - private static final int DPAD_DOWNRIGHT = 135; - - /** - * Down POV D-Pad value. - */ - private static final int DPAD_DOWN = 180; - - /** - * Downleft D-Pad POV value. - */ - private static final int DPAD_DOWNLEFT = 225; - - /** - * Left D-Pad POV value. - */ - private static final int DPAD_LEFT = 270; - - /** - * Upleft D-Pad POV value. - */ - private static final int DPAD_UPLEFT = 315; - - /** - * Up D-Pad POV value. - */ - private static final int DPAD_UP = 360; - - /** - * Method for returning the value of the D-Pad. - * - * @return value of the D-Pad - * - * @see Xbox.DPad - */ - public DPad getDPad() { - switch (controller.getPOV()) { - case 0: - return DPad.up; - case DPAD_UPRIGHT: - return DPad.upright; - case DPAD_RIGHT: - return DPad.right; - case DPAD_DOWNRIGHT: - return DPad.downright; - case DPAD_DOWN: - return DPad.down; - case DPAD_DOWNLEFT: - return DPad.downleft; - case DPAD_LEFT: - return DPad.left; - case DPAD_UPLEFT: - return DPad.upleft; - case DPAD_UP: - return DPad.up; - default: - return DPad.none; - } - } - - // Rumble Methods // - - /** - * Method for setting the rumble of the controller. - * - * @param type type of rumble to set - * @param value value to set the rumble to - * - * @see edu.wpi.first.wpilibj.GenericHID.RumbleType - */ - public void setRumble(final RumbleType type, final double value) { - controller.setRumble(type, value); - } - - // General Methods // - - /** - * Method for checking if the controller is connected. - * - * @return true if the controller is connected, false if not - */ - public boolean isConnected() { - return (controller.isConnected()); - } - - /** - * Method for getting the name of the controller. - * - * @return name of the controller - */ - public String getName() { - return controller.getName(); - } -} diff --git a/2023-2024/main-bot/src/main/java/frc/controllers/package-info.java b/2023-2024/main-bot/src/main/java/frc/controllers/package-info.java deleted file mode 100644 index 80793a8..0000000 --- a/2023-2024/main-bot/src/main/java/frc/controllers/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Holds controller classes - *

- * This can be used to hold both custom and pre-made controller classes. - *

- */ -package frc.controllers; diff --git a/2023-2024/main-bot/src/main/java/frc/package-info.java b/2023-2024/main-bot/src/main/java/frc/package-info.java deleted file mode 100644 index 36e2dec..0000000 --- a/2023-2024/main-bot/src/main/java/frc/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Main package for robot code. - *

- * All code that is deployed to the robot would be located under this package. - *

- */ -package frc; diff --git a/2023-2024/main-bot/src/main/java/frc/robot/Main.java b/2023-2024/main-bot/src/main/java/frc/robot/Main.java deleted file mode 100644 index 48b72ed..0000000 --- a/2023-2024/main-bot/src/main/java/frc/robot/Main.java +++ /dev/null @@ -1,30 +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. - *

- * - * @param args arguments from command line - */ - public static void main(final String... args) { - RobotBase.startRobot(Robot::new); - } -} diff --git a/2023-2024/main-bot/src/main/java/frc/robot/Robot.java b/2023-2024/main-bot/src/main/java/frc/robot/Robot.java deleted file mode 100644 index a48cbab..0000000 --- a/2023-2024/main-bot/src/main/java/frc/robot/Robot.java +++ /dev/null @@ -1,176 +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; - -// Imports // -import java.io.IOException; -import com.fasterxml.jackson.databind.ObjectMapper; -import edu.wpi.first.wpilibj.Filesystem; -import edu.wpi.first.wpilibj.TimedRobot; -import frc.CommonData; -import frc.components.IComponent; -import frc.components.SwerveDrive; -import frc.components.autonomous.Autonomous; -import frc.controllers.Xbox; -import frc.controllers.PS4; -import edu.wpi.first.wpilibj.GenericHID.RumbleType; -import frc.settings.Settings; - -/** -* 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 final class Robot extends TimedRobot { - - /** - * The settings object. - * This is used to store the settings from the robot_settings.json file. - */ - private static Settings settings; - static { - ObjectMapper mapper = new ObjectMapper(); - try { - var filepath = Filesystem.getDeployDirectory().toPath().resolve( - "robot_settings.json" - ); - settings = mapper.readValue(filepath.toFile(), Settings.class); - } - catch (IOException ex) { - System.out.println(ex.toString()); - } - } - - // Initialize the controllers // - // NOTE: This might be used for a more dynamic way of selecting controllers - - /** - * The main controller. - * This is used for the main driver. - *

- * This is an {@code Xbox} object. - *

- *

- * Notice: This might be changed in the future. - *

- */ - private Xbox controller = new Xbox(settings.getControllerID(), 0); - /** - * The auxiliary controller. - * This is used for the auxiliary driver. - *

- * This is a {@code PS4} object. - *

- *

- * Notice: This might be changed in the future. - *

- */ - private PS4 auxController = new PS4(settings.getAuxControllerID(), 0); - - // Set up the components - /** - * The components array. - * This is used to store all of the components. - *

- * This is an array of {@code IComponent} objects. - *

- *

- * Note: More components will be added here. - *

- */ - private IComponent[] components = new IComponent[] { - new SwerveDrive(settings.getSwerveDriveSettings()) - }; - - /** - * The autonomous object. - */ - private Autonomous autonomous; - - @Override - public void robotInit() { - } - - @Override - public void robotPeriodic() { - - // For each component in the components array, update it - // This calls the update method in each of the component classes - // Since this in the robotPeriodic method, - // this will apply to all modes (autonomous, teleop, etc.) - for (var actuator : components) - { - actuator.update(); - } - } - - @Override - public void autonomousInit() { - autonomous = new Autonomous(); - // Calibrate the gyro before autonomous to ensure that it is accurate - CommonData.setCalibrate(true); - } - - @Override - public void autonomousPeriodic() { - // Update the autonomous states - autonomous.update(); - } - - @Override - public void teleopInit() { - } - - @Override - public void teleopPeriodic() { - - // Update the controller values // - - // Update values for the Swerve Drive - CommonData.setBattenDownTheHatches(controller.getXButton()); - CommonData.setSideSpeed(controller.getLeftX()); - CommonData.setForwardSpeed(controller.getLeftY()); - CommonData.setDesiredTurn(Utility.snapToEdge(-controller.getRightX(), -1, 1, 0.9)); - } - - @Override - public void disabledInit() { - - // "Turn off" all functions of the robot // - - CommonData.setDesiredTurn(0); // Set the turn speed to 0 - CommonData.setForwardSpeed(0); // Set the drive speed to 0 - - // Turn off the rumble on any controllers - controller.setRumble(RumbleType.kBothRumble, 0); - auxController.setRumble(RumbleType.kBothRumble, 0); - - CommonData.setCounter(0); // Set the counter to 0 (used in autonomous) - } - - @Override - public void disabledPeriodic() { - } - - @Override - public void testInit() { - } - - @Override - public void testPeriodic() { - } - - @Override - public void simulationInit() { - } - - @Override - public void simulationPeriodic() { - } -} diff --git a/2023-2024/main-bot/src/main/java/frc/robot/Utility.java b/2023-2024/main-bot/src/main/java/frc/robot/Utility.java deleted file mode 100755 index 24e4f9b..0000000 --- a/2023-2024/main-bot/src/main/java/frc/robot/Utility.java +++ /dev/null @@ -1,88 +0,0 @@ -package frc.robot; - -/** - * The {@code Utility} class is used to store general methods that are used - * throughout the code. - *

- * Current methods include: - *

    - *
  • {@link Utility#printLn}
  • - *
  • {@link Utility#clamp}
  • - *
  • {@link Utility#snapToEdge}
  • - *
- * Additional methods may be added in the future if and when they are needed. - *

- */ -public final class Utility { - - // Constructor // - // This is set to private as this is a utility class and - // should not be instantiated - private Utility() { - throw new UnsupportedOperationException( - "This is a utility class and cannot be instantiated"); - } - - /** - * The {@code printCounter} variable is used to count how many times the - * {@code System.out.println} method has been called. - * This is used in the {@link Utility#printLn} method. - */ - private static int printCounter = 0; - - /** - * The {@code printLn} method is used to print a message to the - * console every 50 times it is called. - * This is to slow down the messages as it overwhlems the roboRIO - * and causes the console to lag. - * - * @param messageString String to print to the console - * - * @see Utility#printCounter - */ - public static void printLn(final String messageString) { - if (printCounter == 50) { - System.out.println(messageString); - printCounter = 0; - } else { - printCounter++; - } - } - - /** - * The {@code clamp} method is used to clamp a value between a minimum and - * maximum value. - *

- * If the value is less than the minimum, the minimum is returned. - * If the value is greater than the maximum, the maximum is returned. - * If the value is between the minimum and maximum, the value is returned. - *

- * - * @param value Value to clamp - * @param min Minimum value - * @param max Maximum value - * - * @return The clamped value - */ - public static double clamp(final double value, final double min, final double max) { - return value < min ? min : value > max ? max : value; - } - - /** - * Snap a value to the minimum or maximum value only if it is within a - * threshold. - * Although similar to the {@link Utility#clamp} method, - * this method is used to snap a value to the minimum or maximum value - * if it iswithin a threshold - * - * @param value Value to snap - * @param min Minimum value - * @param max Maximum value - * @param threshold Threshold to snap to - * - * @return The snapped value - */ - public static double snapToEdge(final double value, final double min, final double max, final double threshold) { - return value < -threshold ? min : value > threshold ? max : value; - } -} diff --git a/2023-2024/main-bot/src/main/java/frc/robot/package-info.java b/2023-2024/main-bot/src/main/java/frc/robot/package-info.java deleted file mode 100644 index 20c110b..0000000 --- a/2023-2024/main-bot/src/main/java/frc/robot/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Holds primary robot methods - *

- * This package is automatically created when creating a new robot project. - *

- */ -package frc.robot; diff --git a/2023-2024/main-bot/src/main/java/frc/settings/Settings.java b/2023-2024/main-bot/src/main/java/frc/settings/Settings.java deleted file mode 100755 index b7ddb3e..0000000 --- a/2023-2024/main-bot/src/main/java/frc/settings/Settings.java +++ /dev/null @@ -1,77 +0,0 @@ -package frc.settings; - -/** - * The settings object. - *

- * This is used to store the settings from the robot_settings.json file. - *

- */ -public class Settings { - - /** - * The swerve drive settings. - */ - private SwerveDriveSettings swerveDrive; - - // These might change to be more dynamic if possible - - /** - * The controller ID. - */ - private int controllerID; - - /** - * The auxiliary controller ID. - */ - private int auxControllerID; - - // Accessor Methods // - - /** - * Get the swerve drive settings. - * @return The swerve drive settings. - */ - public SwerveDriveSettings getSwerveDriveSettings() { - return swerveDrive; - } - - /** - * Set the swerve drive settings. - * @param settings The swerve drive settings. - */ - public void setSwerveDriveSettings(final SwerveDriveSettings settings) { - swerveDrive = settings; - } - - /** - * Get the controller ID. - * @return The controller ID. - */ - public int getControllerID() { - return controllerID; - } - - /** - * Set the controller ID. - * @param id The controller ID. - */ - public void setControllerID(final int id) { - controllerID = id; - } - - /** - * Get the auxiliary controller ID. - * @return The auxiliary controller ID. - */ - public int getAuxControllerID() { - return auxControllerID; - } - - /** - * Set the auxiliary controller ID. - * @param id The auxiliary controller ID. - */ - public void setAuxControllerID(final int id) { - auxControllerID = id; - } -} diff --git a/2023-2024/main-bot/src/main/java/frc/settings/SwerveDriveSettings.java b/2023-2024/main-bot/src/main/java/frc/settings/SwerveDriveSettings.java deleted file mode 100755 index db1dfb4..0000000 --- a/2023-2024/main-bot/src/main/java/frc/settings/SwerveDriveSettings.java +++ /dev/null @@ -1,116 +0,0 @@ -package frc.settings; - -/** - * The swerve drive settings. - *

- * This is used to store the settings for the swerve drive. - * Each wheel has its own settings located in the {@link SwerveWheelSettings} - * class. - */ -public class SwerveDriveSettings { - - // NOTE: In this change from public to private, the way we currently read - // the settings file might be broken. This is because it relies on - // the fields being public as it has to be able to access them. These - // values have to be the same as what is in the JSON file. Since they - // are now private and have accessors, we might have to change the - // way we read these values. An alternative might be to use the - // SimpleJSON library instead of the Jackson library as it might - // allow us to access the fields without them being public. - // This needs further testing. - // - // - Jay - - /** - * The swerve wheel settings for the front left wheel. - */ - private SwerveWheelSettings flSwerve; - - /** - * The swerve wheel settings for the front right wheel. - */ - private SwerveWheelSettings frSwerve; - - /** - * The swerve wheel settings for the back left wheel. - */ - private SwerveWheelSettings blSwerve; - - /** - * The swerve wheel settings for the back right wheel. - */ - private SwerveWheelSettings brSwerve; - - // Accessor Methods // - - /** - * Get the swerve wheel settings for the front left wheel. - * @return The swerve wheel settings for the front left wheel. - */ - public SwerveWheelSettings getFLSwerveSettings() { - return flSwerve; - } - - /** - * Set the swerve wheel settings for the front left wheel. - * - * @param settings The swerve wheel settings for the front left wheel. - */ - public void setFLSwerveSettings(final SwerveWheelSettings settings) { - flSwerve = settings; - } - - /** - * Get the swerve wheel settings for the front right wheel. - * - * @return The swerve wheel settings for the front right wheel. - */ - public SwerveWheelSettings getFRSwerveSettings() { - return frSwerve; - } - - /** - * Set the swerve wheel settings for the front right wheel. - * - * @param settings The swerve wheel settings for the front right wheel. - */ - public void setFRSwerveSettings(final SwerveWheelSettings settings) { - frSwerve = settings; - } - - /** - * Get the swerve wheel settings for the back left wheel. - * - * @return The swerve wheel settings for the back left wheel. - */ - public SwerveWheelSettings getBLSwerveSettings() { - return blSwerve; - } - - /** - * Set the swerve wheel settings for the back left wheel. - * - * @param settings The swerve wheel settings for the back left wheel. - */ - public void setBLSwerveSettings(final SwerveWheelSettings settings) { - blSwerve = settings; - } - - /** - * Get the swerve wheel settings for the back right wheel. - * - * @return The swerve wheel settings for the back right wheel. - */ - public SwerveWheelSettings getBRSwerveSettings() { - return brSwerve; - } - - /** - * Set the swerve wheel settings for the back right wheel. - * - * @param settings The swerve wheel settings for the back right wheel. - */ - public void setBRSwerveSettings(final SwerveWheelSettings settings) { - brSwerve = settings; - } -} diff --git a/2023-2024/main-bot/src/main/java/frc/settings/SwerveWheelSettings.java b/2023-2024/main-bot/src/main/java/frc/settings/SwerveWheelSettings.java deleted file mode 100755 index 6a21874..0000000 --- a/2023-2024/main-bot/src/main/java/frc/settings/SwerveWheelSettings.java +++ /dev/null @@ -1,187 +0,0 @@ -package frc.settings; - -/** - * The swerve wheel settings. - *

- * This is used to store the settings for each swerve wheel. - *

- */ -public class SwerveWheelSettings { - - /** - * The drive motor ID. - */ - private int driveID; - - /** - * The turn motor ID. - */ - private int turnID; - - /** - * The encoder ID. - */ - private int encoderID; - - public enum Location { - /** - * Front of the robot. - */ - front, - - /** - * Back of the robot. - */ - back - } - - /** - * The location of the swerve wheel. - */ - private Location location; - - /** - * The angle of the swerve wheel to be in during defensive mode. - */ - private double defensiveAngle; - - /** - * The location of the swerve wheel in relation to the center of the robot. - * This is the X position. - */ - private double posX; - - /** - * The location of the swerve wheel in relation to the center of the robot. - * This is the Y position. - */ - private double posY; - - // Accessor Methods // - - /** - * Get the drive motor ID. - * - * @return The drive motor ID. - */ - public int getDriveID() { - return driveID; - } - - /** - * Set the drive motor ID. - * - * @param id The drive motor ID. - */ - public void setDriveID(final int id) { - driveID = id; - } - - /** - * Get the turn motor ID. - * - * @return The turn motor ID. - */ - public int getTurnID() { - return turnID; - } - - /** - * Set the turn motor ID. - * - * @param id The turn motor ID. - */ - public void setTurnID(final int id) { - turnID = id; - } - - /** - * Get the encoder ID. - * - * @return The encoder ID. - */ - public int getEncoderID() { - return encoderID; - } - - /** - * Set the encoder ID. - * - * @param id The encoder ID. - */ - public void setEncoderID(final int id) { - encoderID = id; - } - - /** - * Get the location of the swerve wheel. - * - * @return The location of the swerve wheel. - */ - public Location getLocation() { - return location; - } - - /** - * Set the location of the swerve wheel. - * - * @param loc The location of the swerve wheel. - */ - public void setLocation(final Location loc) { - location = loc; - } - - /** - * Get the angle of the swerve wheel to be in during defensive mode. - * - * @return The angle of the swerve wheel to be in during defensive mode. - */ - public double getDefensiveAngle() { - return defensiveAngle; - } - - /** - * Set the angle of the swerve wheel to be in during defensive mode. - * - * @param angle The angle of the swerve wheel - */ - public void setDefensiveAngle(final double angle) { - defensiveAngle = angle; - } - - /** - * Get the location of the swerve wheel. - * - * @return The location of the swerve wheel on the X axis. - */ - public double getPosX() { - return posX; - } - - /** - * Set the location of the swerve wheel. - * - * @param x The location of the swerve wheel on the X axis. - */ - public void setPosX(final double x) { - posX = x; - } - - /** - * Get the location of the swerve wheel. - * - * @return The location of the swerve wheel on the Y axis. - */ - public double getPosY() { - return posY; - } - - /** - * Set the location of the swerve wheel. - * - * @param y The location of the swerve wheel on the Y axis. - */ - public void setPosY(final double y) { - posY = y; - } -} diff --git a/2023-2024/main-bot/src/main/java/frc/settings/package-info.java b/2023-2024/main-bot/src/main/java/frc/settings/package-info.java deleted file mode 100644 index 353657d..0000000 --- a/2023-2024/main-bot/src/main/java/frc/settings/package-info.java +++ /dev/null @@ -1,8 +0,0 @@ -/** - * Holds settings for the robot. - *

- * These settings are gathered from the settings.json - * file located in the deploy directory. - *

- */ -package frc.settings; diff --git a/2023-2024/main-bot/src/main/java/frc/state_machine/State.java b/2023-2024/main-bot/src/main/java/frc/state_machine/State.java deleted file mode 100755 index d2450f0..0000000 --- a/2023-2024/main-bot/src/main/java/frc/state_machine/State.java +++ /dev/null @@ -1,37 +0,0 @@ -package frc.state_machine; - -/** -* Abstract class used to create states for the state machine. -*/ -public abstract class State { - - // Imported from 2022-2023 code - - /** - * Method called when a state is entered. - */ - public void onEnter() { - } - - /** - * Method called when a state is exited. - */ - public void onExit() { - } - - /** - * Method called to check if a state is valid. - * @return boolean - */ - public boolean isValid() { - return true; - } - - /** - * Method called to run a state. - * This method should return true when the state is finished - * - * @return boolean - */ - public abstract boolean run(); -} diff --git a/2023-2024/main-bot/src/main/java/frc/state_machine/StateMachine.java b/2023-2024/main-bot/src/main/java/frc/state_machine/StateMachine.java deleted file mode 100755 index 3d9e73f..0000000 --- a/2023-2024/main-bot/src/main/java/frc/state_machine/StateMachine.java +++ /dev/null @@ -1,52 +0,0 @@ -package frc.state_machine; - -import java.util.ArrayList; -import java.util.List; - -/** - * State Machine class for controlling a state machine. - * This is mainly used during auto. - * - * @see frc.components.autonomous.Autonomous - */ -public final class StateMachine { - - /** - * The current state of the state machine. - */ - private State currentState; - - /** - * The list of states to run. - */ - private List states = new ArrayList(); - - /** - * Adds a state to the state machine. - * - * @param state The state to add to the state machine. - */ - public void addState(final State state) { - states.add(state); - } - - /** - * Method called to run the state machine. - */ - public void run() { - if (!states.isEmpty()) { - if (currentState == null && states.get(0).isValid()) { - currentState = states.get(0); - currentState.onEnter(); - states.remove(0); - } - } - - if (currentState != null) { - if (currentState.run()) { - currentState.onExit(); - currentState = null; - } - } - } -} diff --git a/2023-2024/main-bot/src/main/java/frc/state_machine/package-info.java b/2023-2024/main-bot/src/main/java/frc/state_machine/package-info.java deleted file mode 100644 index 7486149..0000000 --- a/2023-2024/main-bot/src/main/java/frc/state_machine/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -/** - * State machine package. - *

- * This package contains all of the code for the state machine. - *

- */ -package frc.state_machine; diff --git a/2023-2024/main-bot/vendordeps/NavX.json b/2023-2024/main-bot/vendordeps/NavX.json deleted file mode 100644 index e978a5f..0000000 --- a/2023-2024/main-bot/vendordeps/NavX.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "fileName": "NavX.json", - "name": "NavX", - "version": "2024.1.0", - "uuid": "cb311d09-36e9-4143-a032-55bb2b94443b", - "frcYear": "2024", - "mavenUrls": [ - "https://dev.studica.com/maven/release/2024/" - ], - "jsonUrl": "https://dev.studica.com/releases/2024/NavX.json", - "javaDependencies": [ - { - "groupId": "com.kauailabs.navx.frc", - "artifactId": "navx-frc-java", - "version": "2024.1.0" - } - ], - "jniDependencies": [], - "cppDependencies": [ - { - "groupId": "com.kauailabs.navx.frc", - "artifactId": "navx-frc-cpp", - "version": "2024.1.0", - "headerClassifier": "headers", - "sourcesClassifier": "sources", - "sharedLibrary": false, - "libName": "navx_frc", - "skipInvalidPlatforms": true, - "binaryPlatforms": [ - "linuxathena", - "linuxraspbian", - "linuxarm32", - "linuxarm64", - "linuxx86-64", - "osxuniversal", - "windowsx86-64" - ] - } - ] -} \ No newline at end of file diff --git a/2023-2024/main-bot/vendordeps/WPILibNewCommands.json b/2023-2024/main-bot/vendordeps/WPILibNewCommands.json deleted file mode 100644 index 67bf389..0000000 --- a/2023-2024/main-bot/vendordeps/WPILibNewCommands.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "fileName": "WPILibNewCommands.json", - "name": "WPILib-New-Commands", - "version": "1.0.0", - "uuid": "111e20f7-815e-48f8-9dd6-e675ce75b266", - "frcYear": "2024", - "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", - "linuxarm32", - "linuxarm64", - "windowsx86-64", - "windowsx86", - "linuxx86-64", - "osxuniversal" - ] - } - ] -} diff --git a/Example_Project/.gitignore b/Example_Project/.gitignore deleted file mode 100644 index 3325f5c..0000000 --- a/Example_Project/.gitignore +++ /dev/null @@ -1,172 +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/ - -# IntelliJ -*.iml -*.ipr -*.iws -.idea/ -out/ - -# Fleet -.fleet - -# Simulation GUI and other tools window save file -*-window.json diff --git a/Example_Project/.wpilib/wpilib_preferences.json b/Example_Project/.wpilib/wpilib_preferences.json deleted file mode 100644 index 4062463..0000000 --- a/Example_Project/.wpilib/wpilib_preferences.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "enableCppIntellisense": false, - "currentLanguage": "java", - "projectYear": "2023", - "teamNumber": 5098 -} \ No newline at end of file diff --git a/Example_Project/WPILib-License.md b/Example_Project/WPILib-License.md deleted file mode 100644 index 064ccbe..0000000 --- a/Example_Project/WPILib-License.md +++ /dev/null @@ -1,26 +0,0 @@ -# WPILib License - -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/Example_Project/build.gradle b/Example_Project/build.gradle deleted file mode 100644 index 5487988..0000000 --- a/Example_Project/build.gradle +++ /dev/null @@ -1,101 +0,0 @@ -plugins { - id "java" - id "edu.wpi.first.GradleRIO" version "2023.4.3" -} - -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 5. -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 'org.junit.jupiter:junit-jupiter-api:5.8.2' - testImplementation 'org.junit.jupiter:junit-jupiter-params:5.8.2' - testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.2' - - implementation 'com.fasterxml.jackson.core:jackson-databind:2.14.2' -} - -test { - useJUnitPlatform() - systemProperty 'junit.jupiter.extensions.autodetection.enabled', 'true' -} - -// 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) - -// Configure string concat to always inline compile -tasks.withType(JavaCompile) { - options.compilerArgs.add '-XDstringConcat=inline' -} diff --git a/Example_Project/gradle/wrapper/gradle-wrapper.jar b/Example_Project/gradle/wrapper/gradle-wrapper.jar deleted file mode 100644 index 249e5832f090a2944b7473328c07c9755baa3196..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 60756 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 '} - 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 \ - "$@" - -# Stop when "xargs" is not available. -if ! command -v xargs >/dev/null 2>&1 -then - die "xargs is not available" -fi - -# 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/Example_Project/gradlew.bat b/Example_Project/gradlew.bat deleted file mode 100644 index 53a6b23..0000000 --- a/Example_Project/gradlew.bat +++ /dev/null @@ -1,91 +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% equ 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% equ 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! -set EXIT_CODE=%ERRORLEVEL% -if %EXIT_CODE% equ 0 set EXIT_CODE=1 -if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% -exit /b %EXIT_CODE% - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega diff --git a/Example_Project/settings.gradle b/Example_Project/settings.gradle deleted file mode 100644 index ae1af1c..0000000 --- a/Example_Project/settings.gradle +++ /dev/null @@ -1,27 +0,0 @@ -import org.gradle.internal.os.OperatingSystem - -pluginManagement { - repositories { - mavenLocal() - gradlePluginPortal() - String frcYear = '2023' - 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/Example_Project/src/main/deploy/README.md b/Example_Project/src/main/deploy/README.md deleted file mode 100644 index 1f23064..0000000 --- a/Example_Project/src/main/deploy/README.md +++ /dev/null @@ -1,14 +0,0 @@ -# Deploy Directory - -> Copied from 'example.txt' - -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. - -## Current Files - -The file `robot_settings.json` is stored in this directory as we need to read the settings from it, and so it needs to be deployed to the robot. -The `robot_settings.json` file works hand in hand with the `frc/settings` directory. Anything in the `robot_settings.json` file must also be in the `Settings.java` file as a type decleration for the setting to be pulled. -This is because of how we implemeted the library to read the json file. -In Python this would be done with the `json` module however Java has no library equivilant so it needs to be used differently. The settings are read and used in the `Robot.java` file. \ No newline at end of file diff --git a/Example_Project/src/main/deploy/robot_settings.json b/Example_Project/src/main/deploy/robot_settings.json deleted file mode 100755 index ad32576..0000000 --- a/Example_Project/src/main/deploy/robot_settings.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "controllerID": 0, - "auxControllerID": 1, - "pneumaticSettings" : { - "pneumaticID": 0, - "largeSolenoidForwardChannelID": 0, - "largeSolenoidReverseChannelID": 1, - "smallSolenoidForwardChannelID": 2, - "smallSolenoidReverseChannelID": 3 - }, - "NavXSettings": { - "navXID": 0, - "navXPort": "kMXP", - "navXUpdateRate": 50 - }, - "ShuffleBoardSettings": { - "shuffleBoardPort": 5800 - } -} \ No newline at end of file diff --git a/Example_Project/src/main/java/frc/CommonData.java b/Example_Project/src/main/java/frc/CommonData.java deleted file mode 100644 index e084fa0..0000000 --- a/Example_Project/src/main/java/frc/CommonData.java +++ /dev/null @@ -1,27 +0,0 @@ -package frc; - -import frc.components.Pneumatics; - -/** - * This is mainly for storing varaiables that are accessed by multiple classes that write and read to the same variable - * This is useful for storing things like a position of a motor, the location of a sensor, or a constant value - * This is also used as a means of organization - */ - -// import frc.components.Pneumatics.State; - -public class CommonData { - - // Pneumatics states - public static Pneumatics.State largeSolenoidState; - public static Pneumatics.State smallSolenoidState; - - // Gyro data from the NavX2 - public static double robotPitch; - public static double robotRoll; - public static double robotYaw; - - // Encoder data from the Spark Max and CANCoder - public static double canCoderPosition; - public static double sparkMaxEncoderPosition; -} diff --git a/Example_Project/src/main/java/frc/components/IComponent.java b/Example_Project/src/main/java/frc/components/IComponent.java deleted file mode 100644 index cb691b4..0000000 --- a/Example_Project/src/main/java/frc/components/IComponent.java +++ /dev/null @@ -1,14 +0,0 @@ -package frc.components; - -public interface IComponent { - - /** - * This is the interface for all components in this directory. - * It contains the update method that is called every 20 milliseconds during the robot's operation. - * This method is used to update the component with new data. - * - * It is called in the Robot.java file in the periodic() method. - */ - - public void update(); -} \ No newline at end of file diff --git a/Example_Project/src/main/java/frc/components/Pneumatics.java b/Example_Project/src/main/java/frc/components/Pneumatics.java deleted file mode 100644 index d2bbf18..0000000 --- a/Example_Project/src/main/java/frc/components/Pneumatics.java +++ /dev/null @@ -1,53 +0,0 @@ -package frc.components; - -// Imports // -import edu.wpi.first.wpilibj.DoubleSolenoid; -import edu.wpi.first.wpilibj.DoubleSolenoid.Value; -import edu.wpi.first.wpilibj.PneumaticsModuleType; -import frc.CommonData; -import frc.settings.PneumaticsSettings; - -public class Pneumatics implements IComponent{ - - // Create an enum for the states of the solenoids - public enum State { - kOpen, - kClosed, - } - - // Create a new solenoid object - private DoubleSolenoid m_solenoidLarge; - private DoubleSolenoid m_solenoidSmall; - - public Pneumatics(PneumaticsSettings settings) { - // Set the settings for the solenoids using the settings in PneumaticsSettings.java - m_solenoidLarge = new DoubleSolenoid(settings.pneumaticsModuleID, PneumaticsModuleType.REVPH, settings.largeSolenoidForwardChannelID, settings.largeSolenoidReverseChannelID); - m_solenoidSmall = new DoubleSolenoid(settings.pneumaticsModuleID, PneumaticsModuleType.REVPH, settings.smallSolenoidForwardChannelID, settings.smallSolenoidReverseChannelID); - }; - - public void update(){ - - // Note: This assumes that the CommonData values are updated elsewhere - - // Update the solenoid state for the small solenoid - switch (CommonData.smallSolenoidState) - { - case kOpen: - m_solenoidSmall.set(Value.kForward); - break; - case kClosed: - m_solenoidSmall.set(Value.kReverse); - } - - // Update the solenoid state for the large solenoid - switch (CommonData.largeSolenoidState) - { - case kOpen: - m_solenoidLarge.set(Value.kForward); - break; - case kClosed: - m_solenoidLarge.set(Value.kReverse); - } - } -} - diff --git a/Example_Project/src/main/java/frc/components/ShuffleBoardController.java b/Example_Project/src/main/java/frc/components/ShuffleBoardController.java deleted file mode 100644 index 3e77d16..0000000 --- a/Example_Project/src/main/java/frc/components/ShuffleBoardController.java +++ /dev/null @@ -1,20 +0,0 @@ -package frc.components; - -// Local Imports -import frc.settings.ShuffleBoardSettings; -import frc.CommonData; - -public class ShuffleBoardController implements IComponent{ - // This is the ShuffleBoard Class. It contains methods and functions that are used to display data on the ShuffleBoard. - - - public ShuffleBoardController(ShuffleBoardSettings settings) { - // This is the ShuffleBoardSettings object. It contains all of the settings for the ShuffleBoard. - // It is initialized in the Settings.java file. - }; - - public void update(){ - // Place any Shuffleboard values here - } - -} diff --git a/Example_Project/src/main/java/frc/controllers/LogitechAttack3.java b/Example_Project/src/main/java/frc/controllers/LogitechAttack3.java deleted file mode 100755 index 3e220ed..0000000 --- a/Example_Project/src/main/java/frc/controllers/LogitechAttack3.java +++ /dev/null @@ -1,90 +0,0 @@ -package frc.controllers; - -import edu.wpi.first.wpilibj.Joystick; - -// Imported From Code/2022/stingr/main-bot - -public class LogitechAttack3 -{ - private final Joystick controller; - - // These are the button and axis IDs for the Logitech F310 controller. - // They are constants because they will never change. - // They always start with a k as a naming convention. - private final int kXAxis = 0; - private final int kYAxis = 1; - private final int kSlider = 2; - private final int kTrigger = 1; - private final int kButton2 = 2; - private final int kButton3 = 3; - private final int kButton4 = 4; - private final int kButton5 = 5; - private final int kButton6 = 6; - private final int kButton7 = 7; - private final int kButton8 = 8; - private final int kButton9 = 9; - private final int kButton10 = 10; - private final int kButton11 = 11; - - public double getX() - { - return controller.getRawAxis(kXAxis); - } - public double getY() - { - return controller.getRawAxis(kYAxis); - } - public double getSlider() - { - return controller.getRawAxis(kSlider); - } - public boolean getTrigger() - { - return controller.getRawButton(kTrigger); - } - public boolean getButton2() - { - return controller.getRawButton(kButton2); - } - public boolean getButton3() - { - return controller.getRawButton(kButton3); - } - public boolean getButton4() - { - return controller.getRawButton(kButton4); - } - public boolean getButton5() - { - return controller.getRawButton(kButton5); - } - public boolean getButton6() - { - return controller.getRawButton(kButton6); - } - public boolean getButton7() - { - return controller.getRawButton(kButton7); - } - public boolean getButton8() - { - return controller.getRawButton(kButton8); - } - public boolean getButton9() - { - return controller.getRawButton(kButton9); - } - public boolean getButton10() - { - return controller.getRawButton(kButton10); - } - public boolean getButton11() - { - return controller.getRawButton(kButton11); - } - - public LogitechAttack3(int controllerPort) - { - controller = new Joystick(controllerPort); - } -} \ No newline at end of file diff --git a/Example_Project/src/main/java/frc/controllers/LogitechF310.java b/Example_Project/src/main/java/frc/controllers/LogitechF310.java deleted file mode 100755 index 6e47c08..0000000 --- a/Example_Project/src/main/java/frc/controllers/LogitechF310.java +++ /dev/null @@ -1,184 +0,0 @@ -package frc.controllers; - -import edu.wpi.first.wpilibj.Joystick; -import java.lang.Math; - -// Imported From Code/2022/stingr/main-bot -// Note: This is modified from the original code to add deadbanding - -public class LogitechF310 -{ - - // These are the button and axis IDs for the Logitech F310 controller. - // They are constants because they will never change. - // They always start with a k as a naming convention. - private final int kIdButtonA = 1; - private final int kIdButtonB = 2; - private final int kIdButtonX = 3; - private final int kIdButtonY = 4; - private final int kIdButtonBumperLeft = 5; - private final int kIdButtonBumperRight = 6; - private final int kIdAxisleftX = 0; - private final int kIdAxisleftY = 1; - private final int kIdAxisrightX = 4; - private final int kIdAxisrightY = 5; - private final int kIdlefttrigger = 2; - private final int kIdrighttrigger = 3; - private final int kIdDpad = 0; - - private Joystick controller; - - public double deadBand(double value) - { - return Math.abs(value) < 0.2 ? 0 : value; - } - - public LogitechF310(int id) - { - controller = new Joystick(id); - } - - public boolean getA() - { - return controller.getRawButton(kIdButtonA); - } - - public boolean getB() - { - return controller.getRawButton(kIdButtonB); - } - - public boolean getX() - { - return controller.getRawButton(kIdButtonX); - } - - public boolean getY() - { - return controller.getRawButton(kIdButtonY); - } - - public boolean getLeftBumper() - { - return controller.getRawButton(kIdButtonBumperLeft); - } - - public boolean getRightBumper() - { - return controller.getRawButton(kIdButtonBumperRight); - } - - public double getLeftStickX() - { - return deadBand(controller.getRawAxis(kIdAxisleftX)); - } - - public double getLeftStickY() - { - return deadBand(controller.getRawAxis(kIdAxisleftY)); - } - - public double getRightStickX() - { - return deadBand(controller.getRawAxis(kIdAxisrightX)); - } - - public double getRightStickY() - { - return deadBand(controller.getRawAxis(kIdAxisrightY)); - } - - public double getLeftTrigger() - { - return controller.getRawAxis(kIdlefttrigger); - } - - public double getRightTrigger() - { - return controller.getRawAxis(kIdrighttrigger); - } - - public boolean getDUp() - { - int degrees = controller.getPOV(kIdDpad); - if (degrees == 315) - { - return true; - } - - if (degrees == 0) - { - return true; - } - - if (degrees == 45) - { - return true; - } - - return false; - } - - public boolean getDRight() - { - int degrees = controller.getPOV(kIdDpad); - if (degrees == 45) - { - return true; - } - - if (degrees == 90) - { - return true; - } - - if (degrees == 135) - { - return true; - } - - return false; - } - - public boolean getDDown() - { - int degrees = controller.getPOV(kIdDpad); - if (degrees == 135) - { - return true; - } - - if (degrees == 180) - { - return true; - } - - if (degrees == 225) - { - return true; - } - - return false; - } - - public boolean getDLeft() - { - int degrees = controller.getPOV(kIdDpad); - if (degrees == 225) - { - return true; - } - - if (degrees == 270) - { - return true; - } - - if (degrees == 315) - { - return true; - } - - return false; - } -} \ No newline at end of file diff --git a/Example_Project/src/main/java/frc/controllers/README.md b/Example_Project/src/main/java/frc/controllers/README.md deleted file mode 100644 index b02e836..0000000 --- a/Example_Project/src/main/java/frc/controllers/README.md +++ /dev/null @@ -1,202 +0,0 @@ -# Controllers - -This folder is used to store the controller files that are used to intereact with the controllers we use to control the robot -Altough this folder is not required, it is useful for organization - -There are two main types of controllers that could be used. The standard controller such as an Xbox One, Logitech F310, etc and a joystick controller like the Logitech Attack 3. Both are similar to set up. Same functions and methods, just different IDs - -## Set Up - -There are few different types of inputs on a controller. Axis input for things like joysticks, Button input for standard buttons and POV input for d-pads. - -A few imports are used to set up a controller class: -- `edu.wpi.first.wpilibj.Joystick` - For getting input from the controller (Required) -- `edu.wpi.first.wpilibj.GenericHID.RumbleType` - For controlling rumble if the controller supports it (Optional) -- `java.lang.Math` - For adding a deadband if the controller drifts (Optional) - -**Setting Up The Joystick:** - -The Joystick import is responsible for getting all input from the controller. To set it up, you need to define an ID for that controller. (Which is set in the Driver Station by the order of the controllers. So the top one is ID 0, the second one is ID 1, etc.) - -The code below is used to set an ID for an Xbox360 controller when an Xbox360 instance is created - -> Remember to put the code in your class! - -Ex: -```java -public Xbox360(int ID) - { - joystick = new Joystick(ID); - } -``` - -Now that the joystick is created. It can be used to gather input from the controller. - -**Setting Up Buttons:** - -To take inputs from buttons on the controller you need to use the `joystick.getRawButton(ID)` method. -We can use this method inside of whatever function, in this case getA(), to get the input of the controller -The method will return a boolean so the function will also return a boolean - -> The ID for the getRawButton method will change depending on the button that you are getting. -> If you don't know the ID for the button, you can look online or check in the Driver Station. -> In the Driver Station, go to the controller menu and click on the desired controller. Hit the button you want to ID and look which square lights up. -> The position of the sqaure indicates the ID of the button - -Ex: -```java -public boolean getA() - { - return joystick.getRawButton(1); - } -``` - -You can repeat this for however many buttons you have on your controller, naming the functions accordingly - -**Setting Up Axis Inputs:** - -Setting up inputs for an axis is similar to that of a controller except using the `joystick.getRawAxis(ID)` method. -The method will return a double (from -1 to 1) so the function will also return a double - -> Checking the ID of the axis is almost the same for checking the ID of the buttons. -> Instead of looking at which squares lights up, look at which bar moves up and down when moved - -Ex: -```java -public double getLeftStickX() - { - return joystick.getRawAxis(0); - } -``` - -You can repeat this for each axis you have on your controller, naming the functions accordingly - -**Setting Up A D-Pad:** - -The D-Pad differs greatly from any other method as it uses a POV to get which position it is in. -As such, it needs some extra code to get it working - -```java -public enum dPad { - up, - down, - left, - right, - upright, - upleft, - downright, - downleft, - none - } -``` - -This is an enum that is used for all 9 possible inputs from the D-Pad (including no input). -It is required for the next bit of code that follows it - -```java -public dPad getPad() - { - switch (joystick.getPOV()) - { - case 0: - return dPad.up; - - case 360: - return dPad.up; - - case 90: - return dPad.right; - - case 180: - return dPad.down; - - case 270: - return dPad.left; - - case 45: - return dPad.upright; - - case 135: - return dPad.downright; - - case 225: - return dPad.downleft; - - case 315: - return dPad.upleft; - - default: - return dPad.none; - } - } -``` - -This bit of code uses a switch statement to see which state the D-Pad is in and ouputs the enum value accordingly. -This takes a little more work than a standard button or axis but it simplifies the output greatly - - - -**Rumble Control** - -> Not every controller supports rumble. You can check this if the Driver Station reports two extra sliders for controlling rumble manually -> Note: The Logitech F310 does support rumble but does *not* have the rumble motors -> Note: Setting up rumble for a controller that does not support rumble will not throw an error. It will be ignored when it tries to run - -Since there 2 types of rumble, you need to set up a case for each rumble motor. -This uses the `joystick.setRumble(RumbleType, double)` to use the rumble feature - -> Make sure you import `edu.wpi.first.wpilibj.GenericHID.RumbleType` to use rumble - -Ex: -```java -public void rumbleHigh() // High - { - joystick.setRumble(RumbleType.kRightRumble, 1); - } - -public void rumbleLow() // Low - { - joystick.setRumble(RumbleType.kLeftRumble, 1); - } - -public void letsGetReadyToRumble() // Both - { - joystick.setRumble(RumbleType.kBothRumble, 1); - } - -public void rumbleOff() // Off - { - joystick.setRumble(RumbleType.kBothRumble, 0); - } -``` - -> The values can be a double from 0 to 1. You can set your own values however this example just uses 1 and 0 for on and off - -**Setting Up A Deadband:** - -Setting up a deadband is mainly only used for a controller that has a slight drift to it. This is used to prevent drifting when in use -The deadband uses a custom value that you can change to whatever you may need to fix the drift on your controller with software - -Ex: -```java -public double deadBand(double value) - { - return Math.abs(value) < 0.175 ? 0 : value; - } -``` - -This sets up a deadband function with a deadband of plus or minus 0.175 -This is simplified by using a [ternary operator](https://github.com/J-The-Fox/FRC-Team-5098/wiki/Java-Operators#ternary-operator) - -```java -public double getLeftStickX() - { - return deadBand(joystick.getRawAxis(0)); - } -``` - -This is using the deadband funtion created earlier to add a deadband to this axis - -> The proccess is similar for both the standard controller and the joystick controller. Just make sure all the IDs are set correctly! \ No newline at end of file diff --git a/Example_Project/src/main/java/frc/controllers/Xbox360.java b/Example_Project/src/main/java/frc/controllers/Xbox360.java deleted file mode 100755 index a4bbd19..0000000 --- a/Example_Project/src/main/java/frc/controllers/Xbox360.java +++ /dev/null @@ -1,171 +0,0 @@ -package frc.controllers; - -import edu.wpi.first.wpilibj.GenericHID.RumbleType; -import edu.wpi.first.wpilibj.Joystick; -import java.lang.Math; - -public class Xbox360 -{ - - public Xbox360(int ID) - { - joystick = new Joystick(ID); - } - - Joystick joystick; - - - // Create a deadBand method for the controller as it drifts a little - public double deadBand(double value) - { - return Math.abs(value) < 0.175 ? 0 : value; - } - - public double getLeftStickX() - { - return deadBand(joystick.getRawAxis(0)); - } - - public double getLeftStickY() - { - return deadBand(joystick.getRawAxis(1)); - } - - public double getRightStickX() - { - return deadBand(joystick.getRawAxis(4)); - } - - public double getRightStickY() - { - return deadBand(joystick.getRawAxis(5)); - } - - public boolean getA() - { - return joystick.getRawButton(1); - } - - public boolean getB() - { - return joystick.getRawButton(2); - } - - public boolean getX() - { - return joystick.getRawButton(3); - } - - public boolean getY() - { - return joystick.getRawButton(4); - } - - public boolean getLB() - { - return joystick.getRawButton(5); - } - - public boolean getRB() - { - return joystick.getRawButton(6); - } - - public boolean getBack() - { - return joystick.getRawButton(7); - } - - public boolean getStart() - { - return joystick.getRawButton(8); - } - - public boolean getLeftStick() - { - return joystick.getRawButton(9); - } - - public boolean getRightStick() - { - return joystick.getRawButton(10); - } - - public double getLeftTrigger() - { - return joystick.getRawAxis(2); - } - - public double getRightTrigger() - { - return joystick.getRawAxis(3); - } - - public enum dPad { - up, - down, - left, - right, - upright, - upleft, - downright, - downleft, - none - } - - public dPad getPad() - { - switch (joystick.getPOV()) - { - case 0: - return dPad.up; - - case 360: - return dPad.up; - - case 90: - return dPad.right; - - case 180: - return dPad.down; - - case 270: - return dPad.left; - - case 45: - return dPad.upright; - - case 135: - return dPad.downright; - - case 225: - return dPad.downleft; - - case 315: - return dPad.upleft; - - default: - return dPad.none; - } - } - - public void rumbleHigh() - { - joystick.setRumble(RumbleType.kRightRumble, 1); - } - - public void rumbleLow() - { - joystick.setRumble(RumbleType.kLeftRumble, 1); - } - - public void letsGetReadyToRumble() - { - joystick.setRumble(RumbleType.kBothRumble, 1); - } - - public void rumbleOff() - { - joystick.setRumble(RumbleType.kBothRumble, 0); - } -} \ No newline at end of file diff --git a/Example_Project/src/main/java/frc/robot/Main.java b/Example_Project/src/main/java/frc/robot/Main.java deleted file mode 100644 index 8776e5d..0000000 --- a/Example_Project/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/Example_Project/src/main/java/frc/robot/Robot.java b/Example_Project/src/main/java/frc/robot/Robot.java deleted file mode 100644 index b2dc458..0000000 --- a/Example_Project/src/main/java/frc/robot/Robot.java +++ /dev/null @@ -1,127 +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; - -// Imports // -import java.io.IOException; -import com.fasterxml.jackson.databind.ObjectMapper; -import edu.wpi.first.wpilibj.Filesystem; -import edu.wpi.first.wpilibj.PneumaticsModuleType; -import edu.wpi.first.wpilibj.TimedRobot; -import edu.wpi.first.wpilibj.Compressor; -import frc.CommonData; -import frc.components.IComponent; -import frc.components.ShuffleBoardController; -import frc.settings.Settings; - -/** - * 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 { - - // Read the robot_settings.json file and put it into the settings object. - public static Settings settings; - static { - ObjectMapper mapper = new ObjectMapper(); - // Try to read the robot_settings.json file and put it into the settings object. - try { - var filepath = Filesystem.getDeployDirectory().toPath().resolve("robot_settings.json"); - settings = mapper.readValue(filepath.toFile(), Settings.class); - } - // If there is an error, print the error to the console. - catch (IOException ex) { - System.out.println(ex.toString()); - } - } - - // Create a new compressor object to control the pneumatics. - - // This could possible be moved to the Pneumatics.java component. - // I would like to see if it's possbible to see what types of a pnematic module is currently plugged in. - // However I am not sure if that is possible. I may look into it in the future. - Compressor compressor = new Compressor(settings.pneumaticsSettings.pneumaticsModuleID, PneumaticsModuleType.REVPH); - - // Create a new IComponent array and add all of the components to it. - // This is used to call all the update methods in the periodic() method. - IComponent[] RobotComponents = new IComponent[] { - new ShuffleBoardController(settings.shuffleBoardSettings), - - }; - - @Override - public void robotInit() { - // This is ran when the robot is first turned on. This is where you should add any initialization code. - } - - @Override - public void robotPeriodic() { - // This is ran every 20ms while the robot is on. This is where you should add any code that needs to run constantly. - - // This calls all the update methods in the RobotComponents array to update all components. - for (IComponent component : RobotComponents) { - component.update(); - } - } - - @Override - public void autonomousInit() { - // This is ran when the robot is first put into autonomous mode. - // This is where you should add any code that needs to run when the robot is first put into autonomous mode. - } - - @Override - public void autonomousPeriodic() { - // This is ran every 20ms while the robot is in autonomous mode. - - for (IComponent component : RobotComponents) { - component.update(); - } - } - - @Override - public void teleopInit() { - // This is ran when the robot is first put into teleop mode. - // This is where you should add any code that needs to run when the robot is first put into teleop mode. - } - - @Override - public void teleopPeriodic() { - // This is ran every 20ms while the robot is in teleop mode. - } - - @Override - public void disabledInit() { - // This is ran when the robot is first put into disabled mode. - } - - @Override - public void disabledPeriodic() { - // This is ran every 20ms while the robot is in disabled mode. - } - - @Override - public void testInit() { - // This is ran when the robot is first put into test mode. - } - - @Override - public void testPeriodic() { - // This is ran every 20ms while the robot is in test mode. - } - - @Override - public void simulationInit() { - // This is ran when the robot is first put into simulation mode. - } - - @Override - public void simulationPeriodic() { - // This is ran every 20ms while the robot is in simulation mode. - } -} diff --git a/Example_Project/src/main/java/frc/robot/Utility.java b/Example_Project/src/main/java/frc/robot/Utility.java deleted file mode 100755 index 8b6fae1..0000000 --- a/Example_Project/src/main/java/frc/robot/Utility.java +++ /dev/null @@ -1,66 +0,0 @@ -package frc.robot; - -import java.lang.Math; - -public class Utility -/** - * This is the Utility Class. It contains methods and functions that don't fit into one specific class. - * This is where you should add any methods or functions that don't fit into one specific class. - * - * The functions and methods in this class were created for the 2022 - 2023 season. -*/ -{ - static int printCounter = 0; - - public static void printLn(String messageString) - /** - * This is a method that prints a message to the console every 50 times it is called. - * It is used to prevent the console from being flooded with messages as well as to prevent log messages being lost due to the connection speed - */ - { - if (printCounter == 50) - { - System.out.println(messageString); - printCounter = 0; - } - else - { - printCounter++; - // Increment the print counter by 1 - } - } - - public static double sigmoid(double x) - /** - * This is a sigmoid functinon. It is used to smooth out values as they approach 1 and 0. - * It resembles an S shape. - */ - { - return 1 / (1 + Math.pow(Math.E, -x)); - } - - public static double clamp(double value, double min, double max) - /** - * This is a clamp function. It is used to limit a value between a minimum and a maximum. - * If the value is above the maximum, it will be set to the maximum. - * If the value is below the minimum, it will be set to the minimum. - */ - { - // This is a ternary operator. It is a short way of writing an if statement. - return value < min ? min : value > max ? max - : value; - } - - public static double snapToEdge(double value, double min, double max, double threshold) - { - if (value < -threshold) - { - return min; - } - if (value > threshold) - { - return max; - } - return value; - } -} \ No newline at end of file diff --git a/Example_Project/src/main/java/frc/settings/NavXSettings.java b/Example_Project/src/main/java/frc/settings/NavXSettings.java deleted file mode 100644 index dcca5b6..0000000 --- a/Example_Project/src/main/java/frc/settings/NavXSettings.java +++ /dev/null @@ -1,5 +0,0 @@ -package frc.settings; - -public class NavXSettings { - -} diff --git a/Example_Project/src/main/java/frc/settings/PneumaticsSettings.java b/Example_Project/src/main/java/frc/settings/PneumaticsSettings.java deleted file mode 100644 index 4fe68b5..0000000 --- a/Example_Project/src/main/java/frc/settings/PneumaticsSettings.java +++ /dev/null @@ -1,13 +0,0 @@ -package frc.settings; - -public class PneumaticsSettings { - - // Pneumatics Control Module IDs - public int pneumaticsModuleID; - - // Solenoid IDs - public int largeSolenoidForwardChannelID; - public int largeSolenoidReverseChannelID; - public int smallSolenoidForwardChannelID; - public int smallSolenoidReverseChannelID; -} diff --git a/Example_Project/src/main/java/frc/settings/Settings.java b/Example_Project/src/main/java/frc/settings/Settings.java deleted file mode 100644 index d490711..0000000 --- a/Example_Project/src/main/java/frc/settings/Settings.java +++ /dev/null @@ -1,14 +0,0 @@ -package frc.settings; - -public class Settings { - - // Settings from the settings files in this directory - public PneumaticsSettings pneumaticsSettings; - public NavXSettings navXSettings; - public ShuffleBoardSettings shuffleBoardSettings; - - // Controller IDs - // We usually implement 2 controllers, an auxillary controller and a main controller. - public int controllerID; - public int auxControllerID; -} diff --git a/Example_Project/src/main/java/frc/settings/ShuffleBoardSettings.java b/Example_Project/src/main/java/frc/settings/ShuffleBoardSettings.java deleted file mode 100644 index 519bd2e..0000000 --- a/Example_Project/src/main/java/frc/settings/ShuffleBoardSettings.java +++ /dev/null @@ -1,6 +0,0 @@ -package frc.settings; - -public class ShuffleBoardSettings { - - -} diff --git a/Example_Project/src/main/java/frc/state_machine/State.java b/Example_Project/src/main/java/frc/state_machine/State.java deleted file mode 100755 index 7a4fb03..0000000 --- a/Example_Project/src/main/java/frc/state_machine/State.java +++ /dev/null @@ -1,19 +0,0 @@ -package frc.state_machine; - -public abstract class State -{ - public void onEnter() - { - } - public void onExit() - { - } - - public boolean isValid() - { - return true; - } - - // Returns 'true' when state is finished - public abstract boolean run(); -} diff --git a/Example_Project/src/main/java/frc/state_machine/StateMachine.java b/Example_Project/src/main/java/frc/state_machine/StateMachine.java deleted file mode 100755 index e5d0313..0000000 --- a/Example_Project/src/main/java/frc/state_machine/StateMachine.java +++ /dev/null @@ -1,45 +0,0 @@ -package frc.state_machine; - -import java.util.ArrayList; -import java.util.List; - -/** - * This is a state machine class. It is used to run a set of actions in order. - * A state will be ran when the state is invalid. - * The current state will keep running until the state is valid. - * Once the state is valid, the state will be removed from the list and the next state will be ran. - * Once the list is empty, the state machine will stop running. - */ - -public class StateMachine -{ - State m_currentState; - List m_states = new ArrayList(); - - public void addState(State state) - { - m_states.add(state); - } - - public void run() - { - if (!m_states.isEmpty()) - { - if (m_currentState == null && m_states.get(0).isValid()) - { - m_currentState = m_states.get(0); - m_currentState.onEnter(); - m_states.remove(0); - } - } - - if (m_currentState != null) - { - if (m_currentState.run()) - { - m_currentState.onExit(); - m_currentState = null; - } - } - } -} diff --git a/Example_Project/vendordeps/NavX.json b/Example_Project/vendordeps/NavX.json deleted file mode 100644 index 29ec93a..0000000 --- a/Example_Project/vendordeps/NavX.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "fileName": "NavX.json", - "name": "KauaiLabs_navX_FRC", - "version": "2023.0.3", - "uuid": "cb311d09-36e9-4143-a032-55bb2b94443b", - "mavenUrls": [ - "https://dev.studica.com/maven/release/2023/" - ], - "jsonUrl": "https://dev.studica.com/releases/2023/NavX.json", - "javaDependencies": [ - { - "groupId": "com.kauailabs.navx.frc", - "artifactId": "navx-frc-java", - "version": "2023.0.3" - } - ], - "jniDependencies": [], - "cppDependencies": [ - { - "groupId": "com.kauailabs.navx.frc", - "artifactId": "navx-frc-cpp", - "version": "2023.0.3", - "headerClassifier": "headers", - "sourcesClassifier": "sources", - "sharedLibrary": false, - "libName": "navx_frc", - "skipInvalidPlatforms": true, - "binaryPlatforms": [ - "linuxathena", - "linuxraspbian", - "linuxarm32", - "linuxarm64", - "linux86-64", - "osxuniversal", - "windowsx86-64" - ] - } - ] -} \ No newline at end of file diff --git a/Example_Project/vendordeps/PhoenixProAnd5.json b/Example_Project/vendordeps/PhoenixProAnd5.json deleted file mode 100644 index 21206b0..0000000 --- a/Example_Project/vendordeps/PhoenixProAnd5.json +++ /dev/null @@ -1,458 +0,0 @@ -{ - "fileName": "PhoenixProAnd5.json", - "name": "CTRE-Phoenix (Pro And v5)", - "version": "23.0.12", - "frcYear": 2023, - "uuid": "3fcf3402-e646-4fa6-971e-18afe8173b1a", - "mavenUrls": [ - "https://maven.ctr-electronics.com/release/" - ], - "jsonUrl": "https://maven.ctr-electronics.com/release/com/ctre/phoenixpro/PhoenixProAnd5-frc2023-latest.json", - "javaDependencies": [ - { - "groupId": "com.ctre.phoenix", - "artifactId": "api-java", - "version": "5.30.4" - }, - { - "groupId": "com.ctre.phoenix", - "artifactId": "wpiapi-java", - "version": "5.30.4" - }, - { - "groupId": "com.ctre.phoenixpro", - "artifactId": "wpiapi-java", - "version": "23.0.12" - } - ], - "jniDependencies": [ - { - "groupId": "com.ctre.phoenix", - "artifactId": "cci", - "version": "5.30.4", - "isJar": false, - "skipInvalidPlatforms": true, - "validPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxathena" - ], - "simMode": "hwsim" - }, - { - "groupId": "com.ctre.phoenix.sim", - "artifactId": "cci-sim", - "version": "5.30.4", - "isJar": false, - "skipInvalidPlatforms": true, - "validPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "osxuniversal" - ], - "simMode": "swsim" - }, - { - "groupId": "com.ctre.phoenixpro", - "artifactId": "tools", - "version": "23.0.12", - "isJar": false, - "skipInvalidPlatforms": true, - "validPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxathena" - ], - "simMode": "hwsim" - }, - { - "groupId": "com.ctre.phoenixpro.sim", - "artifactId": "tools-sim", - "version": "23.0.12", - "isJar": false, - "skipInvalidPlatforms": true, - "validPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "osxuniversal" - ], - "simMode": "swsim" - }, - { - "groupId": "com.ctre.phoenixpro.sim", - "artifactId": "simTalonSRX", - "version": "23.0.12", - "isJar": false, - "skipInvalidPlatforms": true, - "validPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "osxuniversal" - ], - "simMode": "swsim" - }, - { - "groupId": "com.ctre.phoenixpro.sim", - "artifactId": "simTalonFX", - "version": "23.0.12", - "isJar": false, - "skipInvalidPlatforms": true, - "validPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "osxuniversal" - ], - "simMode": "swsim" - }, - { - "groupId": "com.ctre.phoenixpro.sim", - "artifactId": "simVictorSPX", - "version": "23.0.12", - "isJar": false, - "skipInvalidPlatforms": true, - "validPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "osxuniversal" - ], - "simMode": "swsim" - }, - { - "groupId": "com.ctre.phoenixpro.sim", - "artifactId": "simPigeonIMU", - "version": "23.0.12", - "isJar": false, - "skipInvalidPlatforms": true, - "validPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "osxuniversal" - ], - "simMode": "swsim" - }, - { - "groupId": "com.ctre.phoenixpro.sim", - "artifactId": "simCANCoder", - "version": "23.0.12", - "isJar": false, - "skipInvalidPlatforms": true, - "validPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "osxuniversal" - ], - "simMode": "swsim" - }, - { - "groupId": "com.ctre.phoenixpro.sim", - "artifactId": "simProTalonFX", - "version": "23.0.12", - "isJar": false, - "skipInvalidPlatforms": true, - "validPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "osxuniversal" - ], - "simMode": "swsim" - }, - { - "groupId": "com.ctre.phoenixpro.sim", - "artifactId": "simProCANcoder", - "version": "23.0.12", - "isJar": false, - "skipInvalidPlatforms": true, - "validPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "osxuniversal" - ], - "simMode": "swsim" - }, - { - "groupId": "com.ctre.phoenixpro.sim", - "artifactId": "simProPigeon2", - "version": "23.0.12", - "isJar": false, - "skipInvalidPlatforms": true, - "validPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "osxuniversal" - ], - "simMode": "swsim" - } - ], - "cppDependencies": [ - { - "groupId": "com.ctre.phoenix", - "artifactId": "wpiapi-cpp", - "version": "5.30.4", - "libName": "CTRE_Phoenix_WPI", - "headerClassifier": "headers", - "sharedLibrary": true, - "skipInvalidPlatforms": true, - "binaryPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxathena" - ], - "simMode": "hwsim" - }, - { - "groupId": "com.ctre.phoenix", - "artifactId": "api-cpp", - "version": "5.30.4", - "libName": "CTRE_Phoenix", - "headerClassifier": "headers", - "sharedLibrary": true, - "skipInvalidPlatforms": true, - "binaryPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxathena" - ], - "simMode": "hwsim" - }, - { - "groupId": "com.ctre.phoenix", - "artifactId": "cci", - "version": "5.30.4", - "libName": "CTRE_PhoenixCCI", - "headerClassifier": "headers", - "sharedLibrary": true, - "skipInvalidPlatforms": true, - "binaryPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxathena" - ], - "simMode": "hwsim" - }, - { - "groupId": "com.ctre.phoenixpro", - "artifactId": "tools", - "version": "23.0.12", - "libName": "CTRE_PhoenixTools", - "headerClassifier": "headers", - "sharedLibrary": true, - "skipInvalidPlatforms": true, - "binaryPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxathena" - ], - "simMode": "hwsim" - }, - { - "groupId": "com.ctre.phoenix.sim", - "artifactId": "wpiapi-cpp-sim", - "version": "5.30.4", - "libName": "CTRE_Phoenix_WPISim", - "headerClassifier": "headers", - "sharedLibrary": true, - "skipInvalidPlatforms": true, - "binaryPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "osxuniversal" - ], - "simMode": "swsim" - }, - { - "groupId": "com.ctre.phoenix.sim", - "artifactId": "api-cpp-sim", - "version": "5.30.4", - "libName": "CTRE_PhoenixSim", - "headerClassifier": "headers", - "sharedLibrary": true, - "skipInvalidPlatforms": true, - "binaryPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "osxuniversal" - ], - "simMode": "swsim" - }, - { - "groupId": "com.ctre.phoenix.sim", - "artifactId": "cci-sim", - "version": "5.30.4", - "libName": "CTRE_PhoenixCCISim", - "headerClassifier": "headers", - "sharedLibrary": true, - "skipInvalidPlatforms": true, - "binaryPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "osxuniversal" - ], - "simMode": "swsim" - }, - { - "groupId": "com.ctre.phoenixpro.sim", - "artifactId": "tools-sim", - "version": "23.0.12", - "libName": "CTRE_PhoenixTools_Sim", - "headerClassifier": "headers", - "sharedLibrary": true, - "skipInvalidPlatforms": true, - "binaryPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "osxuniversal" - ], - "simMode": "swsim" - }, - { - "groupId": "com.ctre.phoenixpro.sim", - "artifactId": "simTalonSRX", - "version": "23.0.12", - "libName": "CTRE_SimTalonSRX", - "headerClassifier": "headers", - "sharedLibrary": true, - "skipInvalidPlatforms": true, - "binaryPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "osxuniversal" - ], - "simMode": "swsim" - }, - { - "groupId": "com.ctre.phoenixpro.sim", - "artifactId": "simTalonFX", - "version": "23.0.12", - "libName": "CTRE_SimTalonFX", - "headerClassifier": "headers", - "sharedLibrary": true, - "skipInvalidPlatforms": true, - "binaryPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "osxuniversal" - ], - "simMode": "swsim" - }, - { - "groupId": "com.ctre.phoenixpro.sim", - "artifactId": "simVictorSPX", - "version": "23.0.12", - "libName": "CTRE_SimVictorSPX", - "headerClassifier": "headers", - "sharedLibrary": true, - "skipInvalidPlatforms": true, - "binaryPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "osxuniversal" - ], - "simMode": "swsim" - }, - { - "groupId": "com.ctre.phoenixpro.sim", - "artifactId": "simPigeonIMU", - "version": "23.0.12", - "libName": "CTRE_SimPigeonIMU", - "headerClassifier": "headers", - "sharedLibrary": true, - "skipInvalidPlatforms": true, - "binaryPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "osxuniversal" - ], - "simMode": "swsim" - }, - { - "groupId": "com.ctre.phoenixpro.sim", - "artifactId": "simCANCoder", - "version": "23.0.12", - "libName": "CTRE_SimCANCoder", - "headerClassifier": "headers", - "sharedLibrary": true, - "skipInvalidPlatforms": true, - "binaryPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "osxuniversal" - ], - "simMode": "swsim" - }, - { - "groupId": "com.ctre.phoenixpro.sim", - "artifactId": "simProTalonFX", - "version": "23.0.12", - "libName": "CTRE_SimProTalonFX", - "headerClassifier": "headers", - "sharedLibrary": true, - "skipInvalidPlatforms": true, - "binaryPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "osxuniversal" - ], - "simMode": "swsim" - }, - { - "groupId": "com.ctre.phoenixpro.sim", - "artifactId": "simProCANcoder", - "version": "23.0.12", - "libName": "CTRE_SimProCANcoder", - "headerClassifier": "headers", - "sharedLibrary": true, - "skipInvalidPlatforms": true, - "binaryPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "osxuniversal" - ], - "simMode": "swsim" - }, - { - "groupId": "com.ctre.phoenixpro.sim", - "artifactId": "simProPigeon2", - "version": "23.0.12", - "libName": "CTRE_SimProPigeon2", - "headerClassifier": "headers", - "sharedLibrary": true, - "skipInvalidPlatforms": true, - "binaryPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "osxuniversal" - ], - "simMode": "swsim" - }, - { - "groupId": "com.ctre.phoenixpro", - "artifactId": "wpiapi-cpp", - "version": "23.0.12", - "libName": "CTRE_PhoenixPro_WPI", - "headerClassifier": "headers", - "sharedLibrary": true, - "skipInvalidPlatforms": true, - "binaryPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxathena" - ], - "simMode": "hwsim" - }, - { - "groupId": "com.ctre.phoenixpro.sim", - "artifactId": "wpiapi-cpp-sim", - "version": "23.0.12", - "libName": "CTRE_PhoenixPro_WPISim", - "headerClassifier": "headers", - "sharedLibrary": true, - "skipInvalidPlatforms": true, - "binaryPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "osxuniversal" - ], - "simMode": "swsim" - } - ] -} \ No newline at end of file diff --git a/Example_Project/vendordeps/README.md b/Example_Project/vendordeps/README.md deleted file mode 100644 index 18dc487..0000000 --- a/Example_Project/vendordeps/README.md +++ /dev/null @@ -1,36 +0,0 @@ -# Vendor Deps - -This folder holds all the vendor dependencies for the hardware of robot. - -## Installing, Updating, and Removing - -**Installing (Offline)**: -To add a vendor library that has been installed by an offline installer, press `Ctrl+Shift+P` and type `WPILib` or click on the WPILib icon in the top right to open the WPILib Command Palette and begin typing `Manage Vendor Libraries`, then select it from the menu. Select the option to `Install new libraries (offline)`. - -**Installing (Online)**: -To add a vendor library online, press `Ctrl+Shift+P` and type `WPILib` or click on the WPILib icon in the top right to open the WPILib Command Palette and begin typing `Manage Vendor Libraries`, then select it from the menu. Select the option to `Install new libraries (online)`. Then paste in the URL. Most vendor libraries can be found [here](https://docs.wpilib.org/en/stable/docs/software/vscode-overview/3rd-party-libraries.html#libraries). However you can also install external libraries the same way, just paste in the URL and hit enter - -**Updating (Offline)**: -Since dependencies are version managed on a per-project basis, even when installed offline, you will need to go to Manage Vendor Libraries and select `Check for updates (offline)` for each project you wish to update. - -**Updating (Online)**: -Part of the JSON file that vendors may optionally populate is an online update location. If a library has an appropriate location specified, running `Check for updates (online)` will check if a newer version of the library is available from the remote location. - - -**Removing**: -To remove a library dependency from a project, select `Manage Current Libraries` from the Manage Vendor Libraries menu, check the box for any libraries to uninstall and click `OK`. These libraries will be removed as dependencies from the project. - - -## Files In This `vendordep` Folder - -| File | Description | -| ---------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| NavX.json | Libraries for NavX-MXP, NavX-Micro, and Sensor Fusion | -| PhoenixProAnd5.json | Contains CANcoder, CANifier, CANdle, Pigeon IMU, Pigeon 2.0, Talon FX, Talon SRX, and Victor SPX Libraries and Phoenix Tuner program for configuring CTRE CAN devices | -| photonlib.json | Library for PhotonVision CV software | -| REVLib.json | Library for all REV devices including SPARK MAX and Color Sensor V3 | -| WPILibNewCommands.json | Libraries for WPILib new commands | - -More Info can be found in the [Wiki](https://github.com/J-The-Fox/FRC-Team-5098/wiki) - -Credit: Info parsed and copied from the [WPILib Docs](https://docs.wpilib.org/en/stable/) \ No newline at end of file diff --git a/Example_Project/vendordeps/photonlib.json b/Example_Project/vendordeps/photonlib.json deleted file mode 100644 index dad3105..0000000 --- a/Example_Project/vendordeps/photonlib.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "fileName": "photonlib.json", - "name": "photonlib", - "version": "v2023.4.2", - "uuid": "515fe07e-bfc6-11fa-b3de-0242ac130004 ", - "mavenUrls": [ - "https://maven.photonvision.org/repository/internal", - "https://maven.photonvision.org/repository/snapshots" - ], - "jsonUrl": "https://maven.photonvision.org/repository/internal/org/photonvision/PhotonLib-json/1.0/PhotonLib-json-1.0.json", - "jniDependencies": [], - "cppDependencies": [ - { - "groupId": "org.photonvision", - "artifactId": "PhotonLib-cpp", - "version": "v2023.4.2", - "libName": "Photon", - "headerClassifier": "headers", - "sharedLibrary": true, - "skipInvalidPlatforms": true, - "binaryPlatforms": [ - "windowsx86-64", - "linuxathena", - "linuxx86-64", - "osxuniversal" - ] - } - ], - "javaDependencies": [ - { - "groupId": "org.photonvision", - "artifactId": "PhotonLib-java", - "version": "v2023.4.2" - }, - { - "groupId": "org.photonvision", - "artifactId": "PhotonTargeting-java", - "version": "v2023.4.2" - } - ] -} \ No newline at end of file diff --git a/Learning_Materials/Beginner_Level/Course_Intro.txt b/Learning_Materials/Beginner_Level/Course_Intro.txt deleted file mode 100644 index 22d7205..0000000 --- a/Learning_Materials/Beginner_Level/Course_Intro.txt +++ /dev/null @@ -1,58 +0,0 @@ -Welcome to the beginning of your programming journey! If you find anything -confusing, weird, or just plain wrong, please let one of us know! As this will -be the first year this course goes into actiion, and will likely have some -kinks that need to be worked out. - -Here are some extra resources! - - W3Schools - This website is an extremely helpful reference, if you have any - questions, this one could probably clear things up - Java - https://www.w3schools.com/java/ - Python - https://www.w3schools.com/python/default.asp - - CodeAcademy - This site offers free courses on most programming languages, - however, as I've found, you can get lost or not really understand what it's - trying to tell you. It is still a good resource if you don't understand - something and need another way of looking at it. Or if you don't like our - course and want to try it another way - Java - https://www.codecademy.com/catalog/language/java - Python - https://www.codecademy.com/catalog/language/python - -More resources to come - -Cheating policy - DO NOT CHEAT! - You obviously know this, however I will say it here anyway to make sure the - message gets through. Cheating will only make things harder for you in the - future, as by not understanding the concepts outlined in the beginner level, you - will be woefully unprepared for the intermediate course. Think of it like math, - How are you supposed to do algebra if you don't even know how to divide. - - But, what is cheating? - - Copying what someone else put down just to show you did it - - Finding the first solution on the internet and copy and pasting - - - Exceptions - - If you understand why and how what you put down works, then I would not - really consider it cheating. The purpose of this course is to help you - understand how programming works. I don't care how you get there, as long - as you get there. (This rule does not apply to quizes) - - Asking for help is not cheating. Copying what they said mindlessly down is. - Don't be afraid to ask, even if you asked 50 times before and the concept - just isn't getting through, we would still prefer you ask rather than carry - on and not understand. - -We will be learning about - Datatypes - Operators - If-Else-Statement - functions - Scope - Classes and objects - -Good luck! Remember, if you have any questions just ask the captains! \ No newline at end of file diff --git a/Learning_Materials/Beginner_Level/Java/B1DataTypes.java b/Learning_Materials/Beginner_Level/Java/B1DataTypes.java deleted file mode 100644 index 7f29e55..0000000 --- a/Learning_Materials/Beginner_Level/Java/B1DataTypes.java +++ /dev/null @@ -1,36 +0,0 @@ -public class B1DataTypes { // ignore for now - public static void main(String[] args) { // ignore for now - // Hello! Ths is the file for all the various data types in java! Here are - // the main ones that we will be focusing on right now - int myNum = 5; // Integer (whole number) - double myDoubleNum = 5.99; // Decimal point number - float myFloatNum = 5.99f; // Decimal point number (needs to have the f at the end) - char myLetter = 'D'; // Character - boolean myBool = true; // Boolean - String myText = "Hello"; // String - - // By now, you should notice that each of the data types follow a pattern. They - // have a name, equals sign, then a value. This forms what I like to call the - // "variable equation". - // data_type variable_name = value; - - // Now, let's try printing out the values of these variables. To do this, we - // will use the pre-made method System.out.println(). This method will print - // out whatever is inside the parentheses. For example: - - // We can print values - System.out.println("Is 2+2=4?"); - // Or we can print out variables - System.out.println(myBool); - - // We can also create variables with nothing in them and then assign them later - int myNum2; - myNum2 = 10; // Notice how we don't use the data type when we assign a value to a variable - // that's already been created - System.out.println(myNum2); - - // Now, why don't you try some of yourself? create a few variables, and print - // them out. Have fun with it! - - } // no code can be past this curly brace -} diff --git a/Learning_Materials/Beginner_Level/Java/B2Operators.java b/Learning_Materials/Beginner_Level/Java/B2Operators.java deleted file mode 100644 index dcd39e5..0000000 --- a/Learning_Materials/Beginner_Level/Java/B2Operators.java +++ /dev/null @@ -1,46 +0,0 @@ -public class B2Operators { - public static void main(String[] args) { - // This next section is going to go over what 'operators' are, and what they do! - // There are various operators, but the 4 main types are - // - Arithmetic: adding, subtracting, multiplying, dividing, etc. - // - Assignment: assigning a value to a variable - // - Comparison: comparing two values - // - Logical: if this AND this, then that, (hope that made sense, basically it's - // just "AND" or "OR") - - // Examples - - // ARITHMETIC (+, -, *, /, %) - - int x = 5 + 10; // the "+" is an example of an arithmatic operator - // however you can also use it to concatenate strings - String testString = "Hello" + " World!"; // this will store testString as "Hello World!" - // There is also another more unknown operator, the modulos operator - // the modulos operator returns the remainder of a division problem - int remainder = 10 % 3; // this will store remainder as 1 - - // ASSIGNMENT (=, +=, -=, *=, /=, %=) - - int y = 5; // the "=" is an example of an assignment operator - // the "+=" adds a value to a variable - y += 5; // this will add 5 to y, so y will now be 10 - - // COMPARISON (==, !=, >, <, >=, <=) - - // the next part contains if statements, which we will go over in the next - // section - // so for now just focus on the operators - if (x == y) { // the "==" is an example of a comparison operator - System.out.println("x is equal to y!"); - } - - // LOGICAL (&&, ||) - - if (x == 5 && y == 5) { // the "&&" is an example of a logical operator, representing "AND" - System.out.println("x and y are both equal to 5!"); - } - if (x == 5 || y == 5) { // the "||" is an example of a logical operator, representing "OR" - System.out.println("either x or y is equal to 5!"); - } - } -} diff --git a/Learning_Materials/Beginner_Level/Java/B3IfElseStatement.java b/Learning_Materials/Beginner_Level/Java/B3IfElseStatement.java deleted file mode 100644 index f1cf989..0000000 --- a/Learning_Materials/Beginner_Level/Java/B3IfElseStatement.java +++ /dev/null @@ -1,37 +0,0 @@ -public class B3IfElseStatement { - - public static void main(String[] args) { - - String text; // This is an empty variable, that we will use later - - // If statements are used to check if a condition is true or false - // They are basically the bread and butter of programming, and are used in - // almost everything - - // This is an if statement, and it checks if 5 is greater than 2 - if (5 > 2) { - text = "value is greater than 2"; // If the condition is true, then this code will run - // notice how this line is inside the curly braces, this means that anything inside - // the curly braces will run if the condition is true - } - - // If-Else statements provide an alternative if the condition is false - if (text == "your mom") { - System.out.println("Your mom is the best and I would never say anything bad :)"); - } else { - System.out.println(text); // If the condition is false, then this code will run - } - - // If-Else-If statements provide multiple alternatives if the condition is false - if (text == "your mom") { - System.out.println("your mom is the best and I would never say anything bad :)"); - } else if (text == "value is greater than 2") { - System.out.println("Your doing good so far! (or are you???)");//If this condition is true, then this code will run - } else if (4903 < 0){ - System.out.println("This will never run, because the previous condition is true"); - } else { // you can still add an extra else statement at the end - System.out.println(text); - } - - } -} \ No newline at end of file diff --git a/Learning_Materials/Beginner_Level/Java/B4CheckIn.java b/Learning_Materials/Beginner_Level/Java/B4CheckIn.java deleted file mode 100644 index 3d25e22..0000000 --- a/Learning_Materials/Beginner_Level/Java/B4CheckIn.java +++ /dev/null @@ -1,14 +0,0 @@ -public class B4CheckIn { - // Hello! this is just a quick check in to see how you are doing with the course - // so far. - - // if you have any feedback, please let someone know! This whole thing is still - // very new and we are working out the kinks as we go along. - - // anyway, here are some little exercises you can do to make sure you are - // understanding the material so far - - // Question 1: How are Comparison and Logical Operators used in If statements? - - // Question 2: How many "else-if"s can you have in single if statement -} diff --git a/Learning_Materials/Beginner_Level/Java/B5Functions.java b/Learning_Materials/Beginner_Level/Java/B5Functions.java deleted file mode 100644 index 8dfc0f1..0000000 --- a/Learning_Materials/Beginner_Level/Java/B5Functions.java +++ /dev/null @@ -1,51 +0,0 @@ -public class B5Functions { - - // If you have a section of code that you need to use multiple times, you can - // put it in a function and call that function whenever you need to use that - // code. - // to create the function, you need to use the following syntax: - - // static void function_name() { - // code goes here - // } - - // the public/static part determines whether the function needs to be used in a - // object or not, we will go over this in more detail later - - // void determines whether the function returns a value or not, we will also go - // over this later in the file - - static void myFunction1() { - System.out.println("Hello World!"); - } - - static int myFunction2() { - return (50); // you use the return keyword to return a value - } - - static int myFunction3(int x, int y) { // this function takes in two parameters - return x + y; - } - - public static void main(String[] args) { - - // to have the code in the function run, you must "call" it - myFunction1(); // this will print out "Hello World!" - // you can also pass variables into functions - - // you can also have functions return a value - int value = myFunction2(); // this will return "Hello person I know!" - - // you can also pass variables into functions by createing parameters - // these parameters will be in the parentesis of the function - System.out.println(myFunction3(5, value)); // this will return 55 - - // built in functions - // there are many built in functions in java which don't require you to create - // them, an example is the "Math.max()" function - Math.max(5, 10); // returns the highest value of 5 and 10 - - // little food for thought, look at line 30... doesn't like kinda look like... a function? - // the main function is a special function that is called when you run the program - } -} diff --git a/Learning_Materials/Beginner_Level/Java/B6Scope.java b/Learning_Materials/Beginner_Level/Java/B6Scope.java deleted file mode 100644 index c698aad..0000000 --- a/Learning_Materials/Beginner_Level/Java/B6Scope.java +++ /dev/null @@ -1,42 +0,0 @@ -public class B6Scope { - static void assignMethod() { - int numInFunction = 5; - } - - static int returnMethod() { - int numInFunction = 5; - return numInFunction; - } - - public static void main(String[] args) { - - // in this lesson we will be talking about scope. Scope is the area in which - // a variable is (visible) accessible. For example, if you declare (create) a - // variable inside a if-else statement, it will only be accessible inside that - // if-else statement. - - boolean bool = true; - if (bool) { - int numInIfStatement = 5; // creates the variable x and sets it to 5 in the If statement - System.out.println(numInIfStatement); // this will work because x is accessible here - } // the Curly brackects represent the end of the if statements scope - - System.pit.println(numInIfStatement); // this will not work because x is not accessible here - - // The same goes for Functions - myMethod(); - System.out.println(numInFunction); // this will not work because numInFunction is not accessible here - - // However, there are two simple ways to get around this. The first is to - // declare the variable outside of the function or if statement. - int y = 5; // variable is outside of if statement - if (bool) { - y -= 5; // modfies the variable y - } - System.out.println(y); // this will work because y is accessible here - // The second way is to return the variable from the function - System.out.print(returnMethod()); // this will work because the function returns the variable - - // This also goes for objects and classes, which we will cover next - } -} diff --git a/Learning_Materials/Beginner_Level/Java/B7ClassesAndObjects/B71ClassesAndObjects.java b/Learning_Materials/Beginner_Level/Java/B7ClassesAndObjects/B71ClassesAndObjects.java deleted file mode 100644 index a817146..0000000 --- a/Learning_Materials/Beginner_Level/Java/B7ClassesAndObjects/B71ClassesAndObjects.java +++ /dev/null @@ -1,66 +0,0 @@ -public class B71ClassesAndObjects { // look, a class! - - // Hey! Your almost at the end of the beginner level. Don't get too excited - // though - // As this part is a pretty confusing part of coding, and should have your full - // attention - - // Classes and Objects - // Classes are a way to group functions and variables together - // Objects are instances of classes - - // it's okay if that sounds super confusing. It's cause it is, but hopefully the - // example we're about to go over will help you understand - - public static void main(String[] args) { - // To help make this a bit simpler, let's use an example - // Let's say your building a neighborhood - - // you would need blueprints for the houses, which in our case, represent - // classes (go to B72BlueprintForHouse.java to see the class) - - // you would also need to build the houses, which in our case, represent objects - // the syntax (wording) for creating a class is as follows: - - // class name = new class(); - B72BlueprintForHouse house1 = new B72BlueprintForHouse(); - - // you can also access or modify the attibutes of the house (the object) - System.out.println("House 1 is the color " + house1.color); // this will print out "red" - house1.color = "blue"; // this will change the color of the house to blue - System.out.println("House 1 is now the color " + house1.color); // this will print out "blue" - - // However, this in itself is not all that useful, it would be useful though if - // we could change the attibutes of the house - // When we create the class, which we can do! (See the file - // B73RevisedBlueprintForHouse.java) - - // Now, we can create the house with the attributes we want - B73RevisedBlueprintForHouse house2 = new B73RevisedBlueprintForHouse("green", "large"); - B73RevisedBlueprintForHouse house3 = new B73RevisedBlueprintForHouse("yellow", "small"); - - System.out.println("House 2 is " + house2.color + " color and size " + house2.size + "\nHouse 3 is " + house3.color - + " color and size " + house3.size); - - // you can also create a function in classes - // let's say you created a basic function to revert a house the the industry - // norm (see B74AnotherRevisedBlueprint.java) - - B74AnotherRevisedBlueprint house4 = new B74AnotherRevisedBlueprint("orange", "medium"); - System.out.println("House 4 is " + house4.color + " color and size " + house4.size); - - house4.changeToBasicHouse(); // this is where we call the function! - // notice how you need to have the object name, then a period, then the function - - System.out.println("House 4 is now " + house4.color + " color and size " + house4.size + ", the industry norm!"); - - // Finally, let is return to the "public" keyword. This is called an access - // modifier, and it determines who can access the class or function - // public: anyone can access the class or function - // default: only classes or functions in the same package can access the class - - // no worries if the public is a bit confusing, we will cover it more in the - // intermediate level - - } -} diff --git a/Learning_Materials/Beginner_Level/Java/B7ClassesAndObjects/B72BlueprintForHouse.java b/Learning_Materials/Beginner_Level/Java/B7ClassesAndObjects/B72BlueprintForHouse.java deleted file mode 100644 index ed9da2f..0000000 --- a/Learning_Materials/Beginner_Level/Java/B7ClassesAndObjects/B72BlueprintForHouse.java +++ /dev/null @@ -1,6 +0,0 @@ -public class B72BlueprintForHouse { // This is the class (blueprint) for the house - // here are some attributesfor the house - String color = "red"; - String size = "meduium"; -} -// something to note, the class name must be the same as the file name \ No newline at end of file diff --git a/Learning_Materials/Beginner_Level/Java/B7ClassesAndObjects/B73RevisedBlueprintForHouse.java b/Learning_Materials/Beginner_Level/Java/B7ClassesAndObjects/B73RevisedBlueprintForHouse.java deleted file mode 100644 index 37db323..0000000 --- a/Learning_Materials/Beginner_Level/Java/B7ClassesAndObjects/B73RevisedBlueprintForHouse.java +++ /dev/null @@ -1,15 +0,0 @@ -public class B73RevisedBlueprintForHouse { // Blueprint (class) for the house - // attributes for the house - String color; - String size; - - // this is called a constructor, and is used to create the object, - // this is where you can input parameters, if-else statements, etc. - public B73RevisedBlueprintForHouse(String color, String size) { - this.color = color; - this.size = size; - // notice how there is a "this." before the variable name - // This is so the program knows that you are referring to the variable in this - // object, and not another variable that could be floating around - } -} diff --git a/Learning_Materials/Beginner_Level/Java/B7ClassesAndObjects/B74AnotherRevisedBlueprint.java b/Learning_Materials/Beginner_Level/Java/B7ClassesAndObjects/B74AnotherRevisedBlueprint.java deleted file mode 100644 index b06ad0a..0000000 --- a/Learning_Materials/Beginner_Level/Java/B7ClassesAndObjects/B74AnotherRevisedBlueprint.java +++ /dev/null @@ -1,17 +0,0 @@ -public class B74AnotherRevisedBlueprint { // class - // attributes - String color; - String size; - - // constructor - public B74AnotherRevisedBlueprint(String color, String size) { - this.color = color; - this.size = size; - } - - // This is the function to change the house to the industry norm! - public void changeToBasicHouse() { - this.color = "purple"; - this.size = "small"; - } -} diff --git a/Learning_Materials/Beginner_Level/Java/B8FinalCheckIn.java b/Learning_Materials/Beginner_Level/Java/B8FinalCheckIn.java deleted file mode 100644 index aed7988..0000000 --- a/Learning_Materials/Beginner_Level/Java/B8FinalCheckIn.java +++ /dev/null @@ -1,21 +0,0 @@ -public class B8FinalCheckIn { - // Hello! Congrats, your done learning with the beginner level! - - // Here are some exercises you can do to make sure that you understand the material so far - - // What is the difference between a double and an integer? (B1) - - // What does the modulus operator do? How might it be useful? (B2) - - // What operator adds a value to itself? (B2) - - // How are functions useful? (B5) - - // What are parameters? (B5) - - // What is the difference between a class and a object? (B7) - - // Why do we use classes? (B7) - - // why do we sometimes use a constructor when creating classes? (B7) -} diff --git a/Learning_Materials/Beginner_Level/Python/B1DataTypes.py b/Learning_Materials/Beginner_Level/Python/B1DataTypes.py deleted file mode 100644 index ff6fd04..0000000 --- a/Learning_Materials/Beginner_Level/Python/B1DataTypes.py +++ /dev/null @@ -1,41 +0,0 @@ -# Hello! this is the data types file. Here we will learn about the data types in python. - -# Data types are the types of data that we can store in a variable. Python contains many data types. Some of them are: -# 1. int (any whole number) -a_number = 1 -# 2. float (any decimal number) -a_decimal = -0.57382 -# 3. str (any string) -a_string = "Hello World!" -# 4. char (any single character) -a_character = "a" -# 5. bool (A True or False) -a_boolean = True -the_other_boolean = False -# and many more! However for now we will focus only on these - -# By now, you should notice that each of the data types follow a pattern. They -# have a name, equals sign, then a value. This forms what I like to call the -# "variable equation". -# variable_name = value - -# (something to note is that in python, you can just assign a variable a value -# without declaring the data type. This will be different in java.) - -# Now, let's try printing out the values of these variables. To do this, we -# will use the pre-made method print(). This method will print out whatever -# is inside the parentheses. For example: - -# we can print a value -print("Hello world! is 2+2 = 4?") -# we can also print a variable -print(a_boolean) - -# You can also create a variable with no value, and assign it a value later. -a_num = None -a_num = 5 -print(a_num) - -# Now, if you want a bit of practice, try creating some of your own variables -# and printing them out. You may also consider writing a reference sheet for -# for those variables if you think you might forget them. diff --git a/Learning_Materials/Beginner_Level/Python/B2Operators.py b/Learning_Materials/Beginner_Level/Python/B2Operators.py deleted file mode 100644 index 355b8ee..0000000 --- a/Learning_Materials/Beginner_Level/Python/B2Operators.py +++ /dev/null @@ -1,39 +0,0 @@ -# This next section is going to go over what 'operators' are, and what they do! -# There are various operators, but the 4 main types are -# - Arithmetic: adding, subtracting, multiplying, dividing, etc. -# - Assignment: assigning a value to a variable -# - Comparison: comparing two values -# - Logical: if this AND this, then that, (hope that made sense, basically it's -# just "AND" or "OR") - -# Examples - -# ARITHMETIC (+, -, *, /, %) - -x = 5 + 4 # The "+" is an arithmetic operator -# however you can also use it to concatenate strings -testString = "Hello" + " World!" # this will store testString as "Hello World!" -# There is also another more unknown operator, the modulos operator -# the modulos operator returns the remainder of a division problem -remainder = 10 % 3 # this will store remainder as 1 - -# ASSIGNMENT (=, +=, -=, *=, /=, %=) - -y = 5 # The "=" is an assignment operator -# the "+=" adds a value to a variable -y += 5 # this will add 5 to y, so y will now be 10 - - -# COMPARISION (==, !=, >, <, >=, <=) - -# the next part contains "if statements", which are used to check if a condition is true\ -# We will cover these in more detail later, but for now just focus on the operators -if x == 5: # The "==" is a comparison operator - print("x is equal to 5!") - -# LOGICAL (and, or) - -if x == 5 and x > 4: # The "and" is a logical operator - print("x is equal to 5 and greater than 4!") -if x == 5 or x > 4: # The "or" is a logical operator - print("x is equal to 5 or greater than 4!") diff --git a/Learning_Materials/Beginner_Level/Python/B3IfElseStatement.py b/Learning_Materials/Beginner_Level/Python/B3IfElseStatement.py deleted file mode 100644 index c7da655..0000000 --- a/Learning_Materials/Beginner_Level/Python/B3IfElseStatement.py +++ /dev/null @@ -1,28 +0,0 @@ -# If statements are used to check if a condition is true or false -# They are basically the bread and butter of programming, and are used in -# almost everything -text = None - -if 5 > 2: # This is an if statement, and it checks if 5 is greater than 2 - # If the condition is true, then this code will run - text = "value is greater than 2" - # notice how this is indented, as opposed to - # other lines we've created. This means that it anything indented - # below the if statement is "inside" the if statement, and will run - - -# If-Else statements provide an alternative if the condition is false -if text == "your mom": - print("Your mom is very nice and I would never say anything bad about her :)") -else: - print(text) - -# If-Else-If statements provide other alternatives if the condition is false -if text == "your mom": - print("Your mom is very nice and I would never say anything bad about her :)") -elif text == "value is greater than 2": # elif statement - print("your doing good so far (or are you???)") -elif 48939018948 < 1: # you can have more than one elif statement - print("this will never run") -else: # You can also still have an else statement - print(text) diff --git a/Learning_Materials/Beginner_Level/Python/B4CheckIn.py b/Learning_Materials/Beginner_Level/Python/B4CheckIn.py deleted file mode 100644 index f6fe89c..0000000 --- a/Learning_Materials/Beginner_Level/Python/B4CheckIn.py +++ /dev/null @@ -1,10 +0,0 @@ -# Hello! This is just a quick check in to see how you are doing with the course so far. - -# If you have any feedback, please let someone know! -# This whole thing is still very new and we are working out the kinks as we go along. - -# Anyway, here are some little exercises you can do to make sure you are understanding the material so far - -# Question 1: How are Comparison and Logical Operators used in If statements? - -# Question 2: How many "else-if"s can you have in single if statement diff --git a/Learning_Materials/Beginner_Level/Python/B5Functions.py b/Learning_Materials/Beginner_Level/Python/B5Functions.py deleted file mode 100644 index da38b49..0000000 --- a/Learning_Materials/Beginner_Level/Python/B5Functions.py +++ /dev/null @@ -1,42 +0,0 @@ -# If you have a section of code that you need to use multiple times, -# you can put it in a function and call that function -# whenever you need to use that code. - -# To create the function, you need to use the keyword "def" -# followed by the name of the function and then a set of parentheses. -def testfunction(): - print("This is a function being called!") - - -# to have the code in the function run, you must "call" it -testfunction() - -# you can create parameters in the function, -# which are variables that you can pass into the function when you call it - - -def testfunction2(x): - print(x) - - -testfunction2("This is a function being called with a variable!") -testfunction2("Here it is being called again!") - -# you can have as many variables as you want, as long as you seperate them with a comma -# you can also have functions return a value - - -def testfunction3(x, y, z): - return x / y * z - - -print(testfunction3(10, 5, 2)) - -# there are also a few built in functions in python you can use, which don't require you to define them - -# Take, for example, the input() function -username = input("What is your name? ") -# This will display "What is your name?" -# Then, it will wait for the user to type something and press enter -# it will then store whatever the user typed into the variable "usersname" -print("Hello, " + username + "!") diff --git a/Learning_Materials/Beginner_Level/Python/B6Scope.py b/Learning_Materials/Beginner_Level/Python/B6Scope.py deleted file mode 100644 index 1d041ab..0000000 --- a/Learning_Materials/Beginner_Level/Python/B6Scope.py +++ /dev/null @@ -1,39 +0,0 @@ -# in this lesson we will be talking about scope. Scope is the area in which -# a variable is (visible) accessible. For example, if you declare (create) a -# variable inside a function, it will only be accessible inside that -# function. - - -def testfunction(): - x = 10 - return x - - -# testfunction() -# print( -# x -# ) -# If the above code was ran, this will cause an error, because x is not accessible outside of the function - -# there are two ways around this -# 1. you can declare the variable outside of the function -# 2. you can return the variable from the function - - -def anotherFunction(): - x = 5 - return x - - -print(anotherFunction()) # this will print 5 - -# This also goes for objects and classes, which we will cover later - -# FINAL NOTE! Python and java differ in how they handle scope. -# In java, variables create in if else statements and loops are subject to scope, -# and won't be visible (accessible) outside of there - -bool = True -if bool: - x = 10 -print(x) # this will cause an error in java, but not here, in python diff --git a/Learning_Materials/Beginner_Level/Python/B7ClassesAndObjects.py b/Learning_Materials/Beginner_Level/Python/B7ClassesAndObjects.py deleted file mode 100644 index 044dd88..0000000 --- a/Learning_Materials/Beginner_Level/Python/B7ClassesAndObjects.py +++ /dev/null @@ -1,73 +0,0 @@ -# Hey! Your almost at the end of the beginner level. Don't get too excited though -# As this part is a pretty confusing part of coding, and should have your full attention - -# Classes and Objects -# Classes are a way to group functions and variables together -# Objects are instances of classes - -# To help make this a bit simpler, let's use an example -# Let's say your building a neighborhood - -# you would need blueprints for the houses, which in our case, represent classes -class blueprintForHouse: - color = "red" - size = "medium" - - -# You can then build the actual houses, which in our case, represent objects -house1 = blueprintForHouse() -house2 = blueprintForHouse() -# Then you can use the variables in the objects for whatever you need -print("What is the color of house 1? ") -print("Why it's " + house1.color + " of course!") - -# you can also change the variables in the objects -# or in other words, change the color or size of the house -house2.color = "blue" -print("What is the color of house 2? ") -print("Why it's " + house2.color + " of course!") - -# There are also sometimes built in functions in the classes -# take, for example, the __init__ function, which allows you to adjust -# variables (or properties of the house) when you create the object (house) - - -class revisedBlueprintForHouse: - def __init__( - self, color, size - ): # ignore the self for now, just know it's necessary - self.color = color - self.size = size - - -newHouse1 = revisedBlueprintForHouse("green", "large") -newHouse2 = revisedBlueprintForHouse("yellow", "small") -print("house 1 is " + newHouse1.color + " and " + newHouse1.size) -print("house 2 is " + newHouse2.color + " and " + newHouse2.size) - -# You can also have functions in classes -# Take, for example, a function that changes the color of the house - - -class anotherBlueprintForHouse: - def __init__(self, color, size): - self.color = color - self.size = size - - def changeToBasicHouse(self): - self.color = "purple" - self.color = "small" - - # to digress for a sec, let us now look at the self keyword - # the self keyword is used to refer to the object itself - # for example, if you wanted to change the color of the house, - # you would need to use the self keyword - # as just saying "color = newColor" would just create a new variable, - # or change a pre-existing variable outside of the class - # but by using "self" the program knows that you are referring - # to the variable inside the class - - -newerHouse3 = anotherBlueprintForHouse("blue", "medium") -newerHouse3.changeToBasicHouse() -print("house 3 is " + newerHouse3.color + " & " + newerHouse3.size + " size!") diff --git a/Learning_Materials/Beginner_Level/Python/B8FinalCheckIn.py b/Learning_Materials/Beginner_Level/Python/B8FinalCheckIn.py deleted file mode 100644 index 2f3fed2..0000000 --- a/Learning_Materials/Beginner_Level/Python/B8FinalCheckIn.py +++ /dev/null @@ -1,19 +0,0 @@ -# Hello! Congrats, your done learning with the beginner level! - -# Here are some exercises you can do to make sure that you understand the material so far - -# what is the difference between a float and an integer? (B1) - -# what does the modulus operator do? How might it be useful? (B2) - -# what operator adds a value to itself? (B2) - -# How are functions useful? (B5) - -# What are parameters? (B5) - -# What is the difference between a class and a object? (B7) - -# Why do we use classes? (B7) - -# why do we use the __init__ function when creating classes? (B7) diff --git a/Learning_Materials/Intermediate_Level/Intermediate_Intro.txt b/Learning_Materials/Intermediate_Level/Intermediate_Intro.txt deleted file mode 100644 index a0a0016..0000000 --- a/Learning_Materials/Intermediate_Level/Intermediate_Intro.txt +++ /dev/null @@ -1,13 +0,0 @@ -Hey! Good to see you here! it means that your at least dedicated enough to -stick through a lot of boring reading files and wracking your brain at whatever -I meant. Now onto the second leg of your journey. This will include - - -Converting Data Types -Arrays -While and For Loops -Enums -More Class stuff -Importing Files and Libraries - -Transfering to Java if on Python \ No newline at end of file diff --git a/Learning_Materials/Intermediate_Level/Java/I0JavaCheatsheet.java b/Learning_Materials/Intermediate_Level/Java/I0JavaCheatsheet.java deleted file mode 100644 index 97df074..0000000 --- a/Learning_Materials/Intermediate_Level/Java/I0JavaCheatsheet.java +++ /dev/null @@ -1,106 +0,0 @@ -// SKIP TO LINE 7 - -// to declare (create) a function, you must use the following syntax: -public class I0JavaCheatsheet { - static void function_name() { - // code goes here - } - static boolean test_function() { - System.out.println("Hello World!"); - return true; - } - static int add(int x, int y) { - return x + y; - } - public int myInt(int x) { - return x; - } - // this is the main function, which is called whenever you press run in the top right - public static void main(String[] args) { - // Hello! This is a cheatsheet for the Python programmers are trasitioning to - // Java - // I will be going over the basics of Java, and how they compare to Python - // Feel free to mess around and try out what you learn here! - - // ---------- Comments ---------- // - - // This is a single line comment - /* - * This is a multi-line comment - */ - - // ---------- Variables ---------- // - - // to create variables, you must specify the type of variable - String text = "Hello World!"; // This is a String variable, called text, which holds the value "hello world" - int number = 5; // This is an integer variable, called number, which holds the value 5 - - // ---------- Print statements ---------- // - - // Print statements are a tad bit more complicated than in Python - System.out.println("Hello World!"); // This is the basic print statement, which sets a new line to print - System.out.print("Hello World!"); // This is the same as the above, but does not set a new line to print - - // ---------- Indedentation and curly braces ---------- // - - // Indentation doesn't show the scope of a things in java, in fact white space is ignored - // To show the scope of something, java uses curly braces - if (true) { // This is the start of the scope of the if statement -System.out.println("This is true!"); - } // end of the scope of if statement - - - // this is a ton of white space, but it doesn't matter - - - - else { - System.out.println("This is false!"); - // This is still in the scope - } - - // However, with that said, it is still good practice to indent your code, as it - // makes it easier to read and understand - - // ---------- Logic Operators (and, or, not) ---------- // - - // instead of using and, or, and not, java uses &&, ||, and ! - if (true && false) { // and - System.out.println("This is true!"); - } else if (true || false) { // or - System.out.println("This is false!"); - } else if (!true) { // not - System.out.println("This is false!"); - } - // another note, Java doesn't use elif, it uses else if - - // ---------- Functions ---------- // - - // functions are pretty different in java. - // to start, they have to be created before the main function (see line 12) - - // to see the syntax to create a function, see line 5 - - // the public/static part determines whether the function needs to be used in a - // object or not, we will go over this in more detail later (use static for now) - - // void determines whether the function returns a value or not. In this case - // void means it doesn't, however if you want to return a string (see line 8) - - // if you want to take in parameters, you will also need to specify the variable type (see line 12) - int total = add(5, 10); // this will return 15 - - // ---------- Classes and Objects ---------- // - - // your best bet for this one is to just go through the files in the coures for classes, but the cliff notes version is... - - // Every class be the name of the file (see line 4) - // Instead of using the function __init__, you create a constructor function using the class name - // to create a new object, you use the following syntax - I0JavaCheatsheet myObjectName = new I0JavaCheatsheet(); // this creates a new object called myObject - // functions created with the "public" keyword need objects to be called,(see line 15) - // while functions created with the "static" keyword do not - System.out.println(myObjectName.myInt(5)); // this will return 5 - - } -} diff --git a/Learning_Materials/Intermediate_Level/Java/I1ConvertingDatatypes.java b/Learning_Materials/Intermediate_Level/Java/I1ConvertingDatatypes.java deleted file mode 100644 index f0a6b59..0000000 --- a/Learning_Materials/Intermediate_Level/Java/I1ConvertingDatatypes.java +++ /dev/null @@ -1,36 +0,0 @@ -public class I1ConvertingDatatypes { - public static void main(String[] args) { - // Sometimes you need to convert data from one type to another to - // perform certain operations or to manipulate the data in a certain way. - - // for example, let's say you want to add these to variables together - int number = 1; - String text = "1"; - - // you can make the end result a string - String totalText = number + text; // the number variable is auto converted to a string - System.out.println(totalText); // totalNum is now the String "11" - - // or you can make the end result an int - Integer totalNum = number + Integer.parseInt(text); - // Notice how we had to use the Integer.parseInt() method to convert a string to an int - // unlike before, where the int was auto converted to a string, we have to manually convert the string to an int - System.out.println(totalNum); // totalNum is now the int 2 - - // each variable type has a function to convert it to a string - // for example, the int variable type has a function called Integer.toString() - - // each variable also has a function to convert a string to that variable type - // for example, the Float variable type has a function called Float.parseFloat() - // Just make sure it's possible to convert the String (you can't turn letters into numbers!) - - // regarding doubles/floats, converting to integer or lower data type will remove the decimal entirely - double decimalTest = 1.6; - int integerTest = (int) decimalTest; // this is called casting - // Notice how we specified the data type we wanted to convert to in the parenthesis - System.out.println(integerTest); // integer is now 1 - - // This is just the basics, if you'd like, do a bit of googling to learn more about converting data types - // as there is a lot out there, and sometimes the conversions are automatic, and sometimes they are tricky - } -} diff --git a/Learning_Materials/Intermediate_Level/Java/I2Arrays.java b/Learning_Materials/Intermediate_Level/Java/I2Arrays.java deleted file mode 100644 index e83f944..0000000 --- a/Learning_Materials/Intermediate_Level/Java/I2Arrays.java +++ /dev/null @@ -1,37 +0,0 @@ -public class I2Arrays { - public static void main(String[] args) { - //quick note: /* */ are multiline comments - /* - Now we are going to learn about array on python - - array, in short, are a variable that holds multiple values (called elements) - - In order to create a array, you would type square brackets - */ - - String[] names = {"Justin", "Henry", "Regulus", "Brandon"}; - // to create a array, put square brackets after the variable - // then when you put in your values, put curly brackets and separate each value (element) with a comma - - // each element is assigned a number, called an index. the first element is 0, the second is 1, and so on - - // to access a value, you would type the array name, then the index number in square brackets - System.out.println(names[1]); // this will print out "Henry" - - // you can also reassign values using the index - names[3] = "Gunner"; // this will change the "Brandon" to "Gunner" - - // Finally, you can also have a array inside of array - // This is called a 2d array, or a multi dimensional array - // useful for storing stuff in a grid format - - // to do this, add two square brackets after the variable - String[][] grid = { - {"x", "0", "x"}, - {"0", "x", "0"}, - {"x", "0", "x"} - }; - - - } -} diff --git a/Learning_Materials/Intermediate_Level/Java/I3Loops.java b/Learning_Materials/Intermediate_Level/Java/I3Loops.java deleted file mode 100644 index ec63029..0000000 --- a/Learning_Materials/Intermediate_Level/Java/I3Loops.java +++ /dev/null @@ -1,38 +0,0 @@ -public class I3Loops { - - public static void main(String[] args) { - - // loops are how we can easily repeat code - - // ------- While loop ------- // - - //the while loop repeats whenever the condition is true. - // you will need to be very careful, since this can lead to infinite loops - - int count = 0; - while (count < 5) { // while count is less than 5 - System.out.println(count); // print count - count++; // adds one to clap - } - - // Example of an infinite loop - // while (count < 6) { - // System.out.println("Hello World!"); - // } - - // ------- For loop ------- // - - // the for loop is a bit more complicated, but is safer than the while loop - // the for loop has three parts, the initialization, the condition, and the increment - for (int i = 0; i < 5; i++) { // i is initialized to 0, and is incremented by 1 every loop - System.out.println("take two: " + i); // prints i - } - - // Something fun you can do with for loops is also iterate (loop) through arrays - String[] names = {"John", "Bob", "Alice"}; - for (int i = 0; i < names.length; i++) { // i is initialized to 0, and is incremented by 1 every loop - System.out.println(names[i]); // prints the name at index i - } - - } -} \ No newline at end of file diff --git a/Learning_Materials/Intermediate_Level/Java/I4CheckIn.java b/Learning_Materials/Intermediate_Level/Java/I4CheckIn.java deleted file mode 100644 index 19d3fc2..0000000 --- a/Learning_Materials/Intermediate_Level/Java/I4CheckIn.java +++ /dev/null @@ -1,18 +0,0 @@ -public class I4CheckIn { - public static void main(String[] args) { - // Hey! congrats on making it to the check in, hope the previous stuff wasn't too hard :) - // A small note, if you have any questions, or aren't completely sure how something works, now - // is a good time to ask! As we will be building on these concepts, and it is no fun to just - // get stuck super far ahead and have no idea what is going on. - - // anyways, here are some questions - - // 1. How do you convert a string to an integer? - // 2. How can you use a loop in a for loop? - // 3. How can a while loop (or for loop) get stuck in an infinite loop? - - // A fun exercise you can do - // Create a program that takes a word from the user, and it's definition, and stores it in a dictionary array - // Include an array, loop, and function - } -} diff --git a/Learning_Materials/Intermediate_Level/Java/I5Enums.java b/Learning_Materials/Intermediate_Level/Java/I5Enums.java deleted file mode 100644 index 4d42826..0000000 --- a/Learning_Materials/Intermediate_Level/Java/I5Enums.java +++ /dev/null @@ -1,27 +0,0 @@ -public class I5Enums { - - // Here is an example of an enum - enum Direction { - NORTH, - SOUTH, - EAST, - WEST - } - public static void main(String[] args) { - /** - * Enums aren't often as used as the other variables, but we still use them in robotics, so it's important to know what they are. - * They are basically a way to store a set of constants (variables that cannot be changed) - */ - - - // We know that the direction of a robot can only be one of the four directions, so we can use an enum to store the directions - Direction robotDirection = Direction.NORTH; // robotDirection is now NORTH - robotDirection = Direction.SOUTH; // robotDirection is now SOUTH - // this way, we can't accidentally set robotDirection to something that isn't a direction - - /** - * A good example would be the code that is used for the controller dpad. - * Ex: https://github.com/J-The-Fox/FRC-Team-5098/blob/main/Example_Project/src/main/java/frc/controllers/README.md - */ - } -} diff --git a/Learning_Materials/Intermediate_Level/Python/I1ConvertingDatatypes.py b/Learning_Materials/Intermediate_Level/Python/I1ConvertingDatatypes.py deleted file mode 100644 index 828aaa0..0000000 --- a/Learning_Materials/Intermediate_Level/Python/I1ConvertingDatatypes.py +++ /dev/null @@ -1,27 +0,0 @@ -# Sometimes you need to convert data from one type to another to -# perform certain operations or to manipulate the data in a certain way. - -# for example, let's say you want to add these to variables together -intVariable = 2 -strVariable = " is the number of fingers I have" -# print(intVariable + strVariable) # this will give you an error -# as you can see, you can't add an integer and a string together - -# so you need to convert the integer to a string -addedVariable = str(intVariable) + strVariable - -print(addedVariable) - -# you can do this with any data type -# int() converts to an integer -# str() converts to a string -# double() converts to a double -# bool() converts to a boolean - -# just make sure it is possible to convert the data type -# print(int(strVariable)) # this will give you an error -# as you can't convert letters to a number - -# regarding doubles to integers, it will round down when converted -var = 7.9 -print(int(var)) # this will give you 7 diff --git a/Learning_Materials/Intermediate_Level/Python/I2Lists.py b/Learning_Materials/Intermediate_Level/Python/I2Lists.py deleted file mode 100644 index 1db23ff..0000000 --- a/Learning_Materials/Intermediate_Level/Python/I2Lists.py +++ /dev/null @@ -1,35 +0,0 @@ -# Now we are going to learn about lists in python - -# Lists, in short, are a variable that holds multiple values - -# In order to create a list, you would type square brackets -mylist = [] # this is an empty list - -# You can also create a list with elements (values) in it -# Seperate each element with a comma -numList = [1, 2, 3, 4, 5, 6, 7, 8, 9] # This is a list of integers - -mixedList = [1, "Hello", 3.14, True] # This is a list of mixed data types - -# you can also add/remove things to a list after it's been created -mylist.append(1) # this will add the number 1 to the end of the list -mylist.append(2) # this will add the number 2 to the end of the list -mylist.append(3) # this will add the number 3 to the end of the list -mylist.remove(2) # this will remove the number 2 from the list - -# something to note is that the elements (data in the list) are indexed -# this means that each element has a number associated with it -# the first element is 0, the second is 1, the third is 2, etc. -# you can access the elements by using the index -print(mylist[0]) # this will print the first element in the list - -# you can also change the elements in the list -mylist[0] = 5 # this will change the first element in the list to 5 - -# you can also insert elements into the list at specific points -mylist.insert(1, 2) # this will insert the number 2 at index 1 - -# finally, you can also have lists inside of lists -# this is called a 2D list, or multi-dimensional list -# this is useful for storing data in a grid format -ticTacToe = [["X", "O", "X"], ["O", "X", "O"], ["X", "O", "X"]] diff --git a/Learning_Materials/Robot_Level/Robot_Intro.txt b/Learning_Materials/Robot_Level/Robot_Intro.txt deleted file mode 100644 index 6302071..0000000 --- a/Learning_Materials/Robot_Level/Robot_Intro.txt +++ /dev/null @@ -1 +0,0 @@ -Alrighty! looks like your ready to move to some of the big stuff! \ No newline at end of file diff --git a/2023-2024/main-bot/WPILib-License.md b/WPILib-License.md similarity index 59% rename from 2023-2024/main-bot/WPILib-License.md rename to WPILib-License.md index 3b9a563..e7cd597 100644 --- a/2023-2024/main-bot/WPILib-License.md +++ b/WPILib-License.md @@ -1,16 +1,16 @@ -Copyright (c) 2009-2023 FIRST and other WPILib contributors +Copyright (c) 2009-2024 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. + * 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 diff --git a/2023-2024/main-bot/build.gradle b/build.gradle similarity index 88% rename from 2023-2024/main-bot/build.gradle rename to build.gradle index df1e4bc..ebe56af 100644 --- a/2023-2024/main-bot/build.gradle +++ b/build.gradle @@ -1,6 +1,6 @@ plugins { id "java" - id "edu.wpi.first.GradleRIO" version "2024.3.2" + id "edu.wpi.first.GradleRIO" version "2025.1.1-beta-1" } java { @@ -50,6 +50,7 @@ def includeDesktopSupport = false // Defining my dependencies. In this case, WPILib (+ friends), and vendor libraries. // Also defines JUnit 5. dependencies { + annotationProcessor wpi.java.deps.wpilibAnnotations() implementation wpi.java.deps.wpilib() implementation wpi.java.vendor.java() @@ -67,11 +68,8 @@ dependencies { nativeRelease wpi.java.vendor.jniRelease(wpi.platforms.desktop) simulationRelease wpi.sim.enableRelease() - testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.2' - testImplementation 'org.junit.jupiter:junit-jupiter-params:5.8.2' - testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.2' - - implementation 'com.fasterxml.jackson.core:jackson-databind:2.15.3' + testImplementation 'org.junit.jupiter:junit-jupiter:5.10.1' + testRuntimeOnly 'org.junit.platform:junit-platform-launcher' } test { diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..a4b76b9530d66f5e68d973ea569d8e19de379189 GIT binary patch literal 43583 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 yu?e%!_ptzGB|8GrCfu%p?(_ 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 GZ~q4|mN%#X literal 0 HcmV?d00001 diff --git a/2023-2024/main-bot/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties similarity index 91% rename from 2023-2024/main-bot/gradle/wrapper/gradle-wrapper.properties rename to gradle/wrapper/gradle-wrapper.properties index c5c2706..cd33eac 100644 --- a/2023-2024/main-bot/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=permwrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/2023-2024/main-bot/gradlew b/gradlew similarity index 96% rename from 2023-2024/main-bot/gradlew rename to gradlew index 1aa94a4..f5feea6 100755 --- a/2023-2024/main-bot/gradlew +++ b/gradlew @@ -15,6 +15,8 @@ # See the License for the specific language governing permissions and # limitations under the License. # +# SPDX-License-Identifier: Apache-2.0 +# ############################################################################## # @@ -55,7 +57,7 @@ # Darwin, MinGW, and NonStop. # # (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt # within the Gradle project. # # You can find Gradle at https://github.com/gradle/gradle/. @@ -84,7 +86,8 @@ done # shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} # Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) -APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s +' "$PWD" ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum diff --git a/2023-2024/main-bot/gradlew.bat b/gradlew.bat similarity index 88% rename from 2023-2024/main-bot/gradlew.bat rename to gradlew.bat index 6689b85..9b42019 100644 --- a/2023-2024/main-bot/gradlew.bat +++ b/gradlew.bat @@ -13,6 +13,8 @@ @rem See the License for the specific language governing permissions and @rem limitations under the License. @rem +@rem SPDX-License-Identifier: Apache-2.0 +@rem @if "%DEBUG%"=="" @echo off @rem ########################################################################## @@ -43,11 +45,11 @@ set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 if %ERRORLEVEL% equ 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. +echo. 1>&2 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 goto fail @@ -57,11 +59,11 @@ 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. +echo. 1>&2 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 goto fail diff --git a/2023-2024/main-bot/settings.gradle b/settings.gradle similarity index 93% rename from 2023-2024/main-bot/settings.gradle rename to settings.gradle index 3e30f84..7cab49b 100644 --- a/2023-2024/main-bot/settings.gradle +++ b/settings.gradle @@ -4,7 +4,7 @@ pluginManagement { repositories { mavenLocal() gradlePluginPortal() - String frcYear = '2024' + String frcYear = '2025' File frcHome if (OperatingSystem.current().isWindows()) { String publicFolder = System.getenv('PUBLIC') diff --git a/2022-2023/main-bot/src/main/deploy/example.txt b/src/main/deploy/example.txt old mode 100755 new mode 100644 similarity index 100% rename from 2022-2023/main-bot/src/main/deploy/example.txt rename to src/main/deploy/example.txt diff --git a/2022-2023/main-bot/src/main/java/frc/robot/Main.java b/src/main/java/frc/robot/Main.java old mode 100755 new mode 100644 similarity index 100% rename from 2022-2023/main-bot/src/main/java/frc/robot/Main.java rename to src/main/java/frc/robot/Main.java diff --git a/src/main/java/frc/robot/Robot.java b/src/main/java/frc/robot/Robot.java new file mode 100644 index 0000000..736b415 --- /dev/null +++ b/src/main/java/frc/robot/Robot.java @@ -0,0 +1,62 @@ +// 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.TimesliceRobot; +import edu.wpi.first.wpilibj.livewindow.LiveWindow; + +/** + * The methods in this class are called automatically corresponding to each mode, as described in + * the TimesliceRobot documentation. If you change the name of this class or the package after + * creating this project, you must also update the Main.java file in the project. + */ +public class Robot extends TimesliceRobot { + /** Robot constructor. */ + public Robot() { + // Run robot periodic() functions for 5 ms, and run controllers every 10 ms + super(0.005, 0.01); + + // LiveWindow causes drastic overruns in robot periodic functions that will + // interfere with controllers + LiveWindow.disableAllTelemetry(); + + // Runs for 2 ms after robot periodic functions + schedule(() -> {}, 0.002); + + // Runs for 2 ms after first controller function + schedule(() -> {}, 0.002); + + // Total usage: + // 5 ms (robot) + 2 ms (controller 1) + 2 ms (controller 2) = 9 ms + // 9 ms / 10 ms -> 90% allocated + } + + @Override + public void robotPeriodic() {} + + @Override + public void autonomousInit() {} + + @Override + public void autonomousPeriodic() {} + + @Override + public void teleopInit() {} + + @Override + public void teleopPeriodic() {} + + @Override + public void disabledInit() {} + + @Override + public void disabledPeriodic() {} + + @Override + public void testInit() {} + + @Override + public void testPeriodic() {} +} diff --git a/vendordeps/PathplannerLib-2025.0.0-beta-4.json b/vendordeps/PathplannerLib-2025.0.0-beta-4.json new file mode 100644 index 0000000..de2782e --- /dev/null +++ b/vendordeps/PathplannerLib-2025.0.0-beta-4.json @@ -0,0 +1,38 @@ +{ + "fileName": "PathplannerLib-2025.0.0-beta-4.json", + "name": "PathplannerLib", + "version": "2025.0.0-beta-4", + "uuid": "1b42324f-17c6-4875-8e77-1c312bc8c786", + "frcYear": "2025", + "mavenUrls": [ + "https://3015rangerrobotics.github.io/pathplannerlib/repo" + ], + "jsonUrl": "https://3015rangerrobotics.github.io/pathplannerlib/PathplannerLib-beta.json", + "javaDependencies": [ + { + "groupId": "com.pathplanner.lib", + "artifactId": "PathplannerLib-java", + "version": "2025.0.0-beta-4" + } + ], + "jniDependencies": [], + "cppDependencies": [ + { + "groupId": "com.pathplanner.lib", + "artifactId": "PathplannerLib-cpp", + "version": "2025.0.0-beta-4", + "libName": "PathplannerLib", + "headerClassifier": "headers", + "sharedLibrary": false, + "skipInvalidPlatforms": true, + "binaryPlatforms": [ + "windowsx86-64", + "osxuniversal", + "linuxx86-64", + "linuxathena", + "linuxarm32", + "linuxarm64" + ] + } + ] +} \ No newline at end of file diff --git a/2023-2024/main-bot/vendordeps/Phoenix5.json b/vendordeps/Phoenix5-5.34.0-beta-2.json similarity index 88% rename from 2023-2024/main-bot/vendordeps/Phoenix5.json rename to vendordeps/Phoenix5-5.34.0-beta-2.json index ff7359e..e27638b 100644 --- a/2023-2024/main-bot/vendordeps/Phoenix5.json +++ b/vendordeps/Phoenix5-5.34.0-beta-2.json @@ -1,13 +1,13 @@ { - "fileName": "Phoenix5.json", + "fileName": "Phoenix5-5.34.0-beta-2.json", "name": "CTRE-Phoenix (v5)", - "version": "5.33.1", - "frcYear": 2024, + "version": "5.34.0-beta-2", + "frcYear": "2025", "uuid": "ab676553-b602-441f-a38d-f1296eff6537", "mavenUrls": [ "https://maven.ctr-electronics.com/release/" ], - "jsonUrl": "https://maven.ctr-electronics.com/release/com/ctre/phoenix/Phoenix5-frc2024-latest.json", + "jsonUrl": "https://maven.ctr-electronics.com/release/com/ctre/phoenix/Phoenix5-frc2025-beta-latest.json", "requires": [ { "uuid": "e995de00-2c64-4df5-8831-c1441420ff19", @@ -20,19 +20,19 @@ { "groupId": "com.ctre.phoenix", "artifactId": "api-java", - "version": "5.33.1" + "version": "5.34.0-beta-2" }, { "groupId": "com.ctre.phoenix", "artifactId": "wpiapi-java", - "version": "5.33.1" + "version": "5.34.0-beta-2" } ], "jniDependencies": [ { "groupId": "com.ctre.phoenix", "artifactId": "cci", - "version": "5.33.1", + "version": "5.34.0-beta-2", "isJar": false, "skipInvalidPlatforms": true, "validPlatforms": [ @@ -45,7 +45,7 @@ { "groupId": "com.ctre.phoenix.sim", "artifactId": "cci-sim", - "version": "5.33.1", + "version": "5.34.0-beta-2", "isJar": false, "skipInvalidPlatforms": true, "validPlatforms": [ @@ -60,7 +60,7 @@ { "groupId": "com.ctre.phoenix", "artifactId": "wpiapi-cpp", - "version": "5.33.1", + "version": "5.34.0-beta-2", "libName": "CTRE_Phoenix_WPI", "headerClassifier": "headers", "sharedLibrary": true, @@ -75,7 +75,7 @@ { "groupId": "com.ctre.phoenix", "artifactId": "api-cpp", - "version": "5.33.1", + "version": "5.34.0-beta-2", "libName": "CTRE_Phoenix", "headerClassifier": "headers", "sharedLibrary": true, @@ -90,7 +90,7 @@ { "groupId": "com.ctre.phoenix", "artifactId": "cci", - "version": "5.33.1", + "version": "5.34.0-beta-2", "libName": "CTRE_PhoenixCCI", "headerClassifier": "headers", "sharedLibrary": true, @@ -105,7 +105,7 @@ { "groupId": "com.ctre.phoenix.sim", "artifactId": "wpiapi-cpp-sim", - "version": "5.33.1", + "version": "5.34.0-beta-2", "libName": "CTRE_Phoenix_WPISim", "headerClassifier": "headers", "sharedLibrary": true, @@ -120,7 +120,7 @@ { "groupId": "com.ctre.phoenix.sim", "artifactId": "api-cpp-sim", - "version": "5.33.1", + "version": "5.34.0-beta-2", "libName": "CTRE_PhoenixSim", "headerClassifier": "headers", "sharedLibrary": true, @@ -135,7 +135,7 @@ { "groupId": "com.ctre.phoenix.sim", "artifactId": "cci-sim", - "version": "5.33.1", + "version": "5.34.0-beta-2", "libName": "CTRE_PhoenixCCISim", "headerClassifier": "headers", "sharedLibrary": true, diff --git a/2023-2024/main-bot/vendordeps/Phoenix6.json b/vendordeps/Phoenix6-25.0.0-beta-2.json similarity index 85% rename from 2023-2024/main-bot/vendordeps/Phoenix6.json rename to vendordeps/Phoenix6-25.0.0-beta-2.json index 2b7d172..c56e61a 100644 --- a/2023-2024/main-bot/vendordeps/Phoenix6.json +++ b/vendordeps/Phoenix6-25.0.0-beta-2.json @@ -1,32 +1,50 @@ { - "fileName": "Phoenix6.json", + "fileName": "Phoenix6-25.0.0-beta-2.json", "name": "CTRE-Phoenix (v6)", - "version": "24.2.0", - "frcYear": 2024, + "version": "25.0.0-beta-2", + "frcYear": "2025", "uuid": "e995de00-2c64-4df5-8831-c1441420ff19", "mavenUrls": [ "https://maven.ctr-electronics.com/release/" ], - "jsonUrl": "https://maven.ctr-electronics.com/release/com/ctre/phoenix6/latest/Phoenix6-frc2024-latest.json", + "jsonUrl": "https://maven.ctr-electronics.com/release/com/ctre/phoenix6/latest/Phoenix6-frc2025-beta-latest.json", "conflictsWith": [ { "uuid": "3fcf3402-e646-4fa6-971e-18afe8173b1a", "errorMessage": "The combined Phoenix-6-And-5 vendordep is no longer supported. Please remove the vendordep and instead add both the latest Phoenix 6 vendordep and Phoenix 5 vendordep.", "offlineFileName": "Phoenix6And5.json" + }, + { + "uuid": "e7900d8d-826f-4dca-a1ff-182f658e98af", + "errorMessage": "Users can not have both the replay and regular Phoenix 6 vendordeps in their robot program.", + "offlineFileName": "Phoenix6-replay-frc2025-beta-latest.json" } ], "javaDependencies": [ { "groupId": "com.ctre.phoenix6", "artifactId": "wpiapi-java", - "version": "24.2.0" + "version": "25.0.0-beta-2" } ], "jniDependencies": [ + { + "groupId": "com.ctre.phoenix6", + "artifactId": "api-cpp", + "version": "25.0.0-beta-2", + "isJar": false, + "skipInvalidPlatforms": true, + "validPlatforms": [ + "windowsx86-64", + "linuxx86-64", + "linuxathena" + ], + "simMode": "hwsim" + }, { "groupId": "com.ctre.phoenix6", "artifactId": "tools", - "version": "24.2.0", + "version": "25.0.0-beta-2", "isJar": false, "skipInvalidPlatforms": true, "validPlatforms": [ @@ -38,8 +56,8 @@ }, { "groupId": "com.ctre.phoenix6.sim", - "artifactId": "tools-sim", - "version": "24.2.0", + "artifactId": "api-cpp-sim", + "version": "25.0.0-beta-2", "isJar": false, "skipInvalidPlatforms": true, "validPlatforms": [ @@ -51,8 +69,8 @@ }, { "groupId": "com.ctre.phoenix6.sim", - "artifactId": "simTalonSRX", - "version": "24.2.0", + "artifactId": "tools-sim", + "version": "25.0.0-beta-2", "isJar": false, "skipInvalidPlatforms": true, "validPlatforms": [ @@ -64,8 +82,8 @@ }, { "groupId": "com.ctre.phoenix6.sim", - "artifactId": "simTalonFX", - "version": "24.2.0", + "artifactId": "simTalonSRX", + "version": "25.0.0-beta-2", "isJar": false, "skipInvalidPlatforms": true, "validPlatforms": [ @@ -78,7 +96,7 @@ { "groupId": "com.ctre.phoenix6.sim", "artifactId": "simVictorSPX", - "version": "24.2.0", + "version": "25.0.0-beta-2", "isJar": false, "skipInvalidPlatforms": true, "validPlatforms": [ @@ -91,7 +109,7 @@ { "groupId": "com.ctre.phoenix6.sim", "artifactId": "simPigeonIMU", - "version": "24.2.0", + "version": "25.0.0-beta-2", "isJar": false, "skipInvalidPlatforms": true, "validPlatforms": [ @@ -104,7 +122,7 @@ { "groupId": "com.ctre.phoenix6.sim", "artifactId": "simCANCoder", - "version": "24.2.0", + "version": "25.0.0-beta-2", "isJar": false, "skipInvalidPlatforms": true, "validPlatforms": [ @@ -117,7 +135,7 @@ { "groupId": "com.ctre.phoenix6.sim", "artifactId": "simProTalonFX", - "version": "24.2.0", + "version": "25.0.0-beta-2", "isJar": false, "skipInvalidPlatforms": true, "validPlatforms": [ @@ -130,7 +148,7 @@ { "groupId": "com.ctre.phoenix6.sim", "artifactId": "simProCANcoder", - "version": "24.2.0", + "version": "25.0.0-beta-2", "isJar": false, "skipInvalidPlatforms": true, "validPlatforms": [ @@ -143,7 +161,7 @@ { "groupId": "com.ctre.phoenix6.sim", "artifactId": "simProPigeon2", - "version": "24.2.0", + "version": "25.0.0-beta-2", "isJar": false, "skipInvalidPlatforms": true, "validPlatforms": [ @@ -158,7 +176,7 @@ { "groupId": "com.ctre.phoenix6", "artifactId": "wpiapi-cpp", - "version": "24.2.0", + "version": "25.0.0-beta-2", "libName": "CTRE_Phoenix6_WPI", "headerClassifier": "headers", "sharedLibrary": true, @@ -173,7 +191,7 @@ { "groupId": "com.ctre.phoenix6", "artifactId": "tools", - "version": "24.2.0", + "version": "25.0.0-beta-2", "libName": "CTRE_PhoenixTools", "headerClassifier": "headers", "sharedLibrary": true, @@ -188,7 +206,7 @@ { "groupId": "com.ctre.phoenix6.sim", "artifactId": "wpiapi-cpp-sim", - "version": "24.2.0", + "version": "25.0.0-beta-2", "libName": "CTRE_Phoenix6_WPISim", "headerClassifier": "headers", "sharedLibrary": true, @@ -203,7 +221,7 @@ { "groupId": "com.ctre.phoenix6.sim", "artifactId": "tools-sim", - "version": "24.2.0", + "version": "25.0.0-beta-2", "libName": "CTRE_PhoenixTools_Sim", "headerClassifier": "headers", "sharedLibrary": true, @@ -218,7 +236,7 @@ { "groupId": "com.ctre.phoenix6.sim", "artifactId": "simTalonSRX", - "version": "24.2.0", + "version": "25.0.0-beta-2", "libName": "CTRE_SimTalonSRX", "headerClassifier": "headers", "sharedLibrary": true, @@ -230,25 +248,10 @@ ], "simMode": "swsim" }, - { - "groupId": "com.ctre.phoenix6.sim", - "artifactId": "simTalonFX", - "version": "24.2.0", - "libName": "CTRE_SimTalonFX", - "headerClassifier": "headers", - "sharedLibrary": true, - "skipInvalidPlatforms": true, - "binaryPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "osxuniversal" - ], - "simMode": "swsim" - }, { "groupId": "com.ctre.phoenix6.sim", "artifactId": "simVictorSPX", - "version": "24.2.0", + "version": "25.0.0-beta-2", "libName": "CTRE_SimVictorSPX", "headerClassifier": "headers", "sharedLibrary": true, @@ -263,7 +266,7 @@ { "groupId": "com.ctre.phoenix6.sim", "artifactId": "simPigeonIMU", - "version": "24.2.0", + "version": "25.0.0-beta-2", "libName": "CTRE_SimPigeonIMU", "headerClassifier": "headers", "sharedLibrary": true, @@ -278,7 +281,7 @@ { "groupId": "com.ctre.phoenix6.sim", "artifactId": "simCANCoder", - "version": "24.2.0", + "version": "25.0.0-beta-2", "libName": "CTRE_SimCANCoder", "headerClassifier": "headers", "sharedLibrary": true, @@ -293,7 +296,7 @@ { "groupId": "com.ctre.phoenix6.sim", "artifactId": "simProTalonFX", - "version": "24.2.0", + "version": "25.0.0-beta-2", "libName": "CTRE_SimProTalonFX", "headerClassifier": "headers", "sharedLibrary": true, @@ -308,7 +311,7 @@ { "groupId": "com.ctre.phoenix6.sim", "artifactId": "simProCANcoder", - "version": "24.2.0", + "version": "25.0.0-beta-2", "libName": "CTRE_SimProCANcoder", "headerClassifier": "headers", "sharedLibrary": true, @@ -323,7 +326,7 @@ { "groupId": "com.ctre.phoenix6.sim", "artifactId": "simProPigeon2", - "version": "24.2.0", + "version": "25.0.0-beta-2", "libName": "CTRE_SimProPigeon2", "headerClassifier": "headers", "sharedLibrary": true, diff --git a/Example_Project/vendordeps/REVLib.json b/vendordeps/REVLib-2025.0.0-beta-2.json similarity index 87% rename from Example_Project/vendordeps/REVLib.json rename to vendordeps/REVLib-2025.0.0-beta-2.json index f2d0b7d..85f6151 100644 --- a/Example_Project/vendordeps/REVLib.json +++ b/vendordeps/REVLib-2025.0.0-beta-2.json @@ -1,24 +1,25 @@ { - "fileName": "REVLib.json", + "fileName": "REVLib-2025.0.0-beta-2.json", "name": "REVLib", - "version": "2023.1.3", + "version": "2025.0.0-beta-2", + "frcYear": "2025", "uuid": "3f48eb8c-50fe-43a6-9cb7-44c86353c4cb", "mavenUrls": [ "https://maven.revrobotics.com/" ], - "jsonUrl": "https://software-metadata.revrobotics.com/REVLib-2023.json", + "jsonUrl": "https://software-metadata.revrobotics.com/REVLib-2025.json", "javaDependencies": [ { "groupId": "com.revrobotics.frc", "artifactId": "REVLib-java", - "version": "2023.1.3" + "version": "2025.0.0-beta-2" } ], "jniDependencies": [ { "groupId": "com.revrobotics.frc", "artifactId": "REVLib-driver", - "version": "2023.1.3", + "version": "2025.0.0-beta-2", "skipInvalidPlatforms": true, "isJar": false, "validPlatforms": [ @@ -36,7 +37,7 @@ { "groupId": "com.revrobotics.frc", "artifactId": "REVLib-cpp", - "version": "2023.1.3", + "version": "2025.0.0-beta-2", "libName": "REVLib", "headerClassifier": "headers", "sharedLibrary": false, @@ -54,7 +55,7 @@ { "groupId": "com.revrobotics.frc", "artifactId": "REVLib-driver", - "version": "2023.1.3", + "version": "2025.0.0-beta-2", "libName": "REVLibDriver", "headerClassifier": "headers", "sharedLibrary": false, diff --git a/vendordeps/Studica-2025.1.1-beta-3.json b/vendordeps/Studica-2025.1.1-beta-3.json new file mode 100644 index 0000000..2f64aaf --- /dev/null +++ b/vendordeps/Studica-2025.1.1-beta-3.json @@ -0,0 +1,71 @@ +{ + "fileName": "Studica-2025.1.1-beta-3.json", + "name": "Studica", + "version": "2025.1.1-beta-3", + "uuid": "cb311d09-36e9-4143-a032-55bb2b94443b", + "frcYear": "2025", + "mavenUrls": [ + "https://dev.studica.com/maven/release/2025/" + ], + "jsonUrl": "https://dev.studica.com/releases/2025/Studica-2025.1.1-beta-3.json", + "cppDependencies": [ + { + "artifactId": "Studica-cpp", + "binaryPlatforms": [ + "linuxathena", + "linuxarm32", + "linuxarm64", + "linuxx86-64", + "osxuniversal", + "windowsx86-64" + ], + "groupId": "com.studica.frc", + "headerClassifier": "headers", + "libName": "Studica", + "sharedLibrary": false, + "skipInvalidPlatforms": true, + "version": "2025.1.1-beta-3" + }, + { + "artifactId": "Studica-driver", + "binaryPlatforms": [ + "linuxathena", + "linuxarm32", + "linuxarm64", + "linuxx86-64", + "osxuniversal", + "windowsx86-64" + ], + "groupId": "com.studica.frc", + "headerClassifier": "headers", + "libName": "StudicaDriver", + "sharedLibrary": false, + "skipInvalidPlatforms": true, + "version": "2025.1.1-beta-3" + } + ], + "javaDependencies": [ + { + "artifactId": "Studica-java", + "groupId": "com.studica.frc", + "version": "2025.1.1-beta-3" + } + ], + "jniDependencies": [ + { + "artifactId": "Studica-driver", + "groupId": "com.studica.frc", + "isJar": false, + "skipInvalidPlatforms": true, + "validPlatforms": [ + "linuxathena", + "linuxarm32", + "linuxarm64", + "linuxx86-64", + "osxuniversal", + "windowsx86-64" + ], + "version": "2025.1.1-beta-3" + } + ] +} \ No newline at end of file diff --git a/Example_Project/vendordeps/WPILibNewCommands.json b/vendordeps/WPILibNewCommands.json similarity index 97% rename from Example_Project/vendordeps/WPILibNewCommands.json rename to vendordeps/WPILibNewCommands.json index bd535bf..3718e0a 100644 --- a/Example_Project/vendordeps/WPILibNewCommands.json +++ b/vendordeps/WPILibNewCommands.json @@ -3,6 +3,7 @@ "name": "WPILib-New-Commands", "version": "1.0.0", "uuid": "111e20f7-815e-48f8-9dd6-e675ce75b266", + "frcYear": "2025", "mavenUrls": [], "jsonUrl": "", "javaDependencies": [ From f1a71f27a20776567573231ad78c875dc7686aad Mon Sep 17 00:00:00 2001 From: Jay McNeely Date: Thu, 21 Nov 2024 12:59:02 -0600 Subject: [PATCH 02/39] Started updating the README. --- README.md | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 0aaf020..065d929 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,17 @@ # FRC Team 5098 Sting-r + + ![FRC-Team-5098-GitHub](https://github.com/J-The-Fox/FRC-Team-5098/assets/116409406/5e9d98b5-ade7-4456-bec0-9831072bbb54) -![badge](https://img.shields.io/github/last-commit/J-The-Fox/FRC-Team-5098?color=ee7b1a&display_timestamp=committer&label=Last%20Commit&style=flat-square) -![badge](https://img.shields.io/github/issues-pr/J-The-Fox/FRC-Team-5098?color=ee7b1a&label=Pull%20Requests&style=flat-square) -![badge](https://img.shields.io/github/contributors/J-The-Fox/FRC-Team-5098?color=ee7b1a&label=Contributors&style=flat-square) -![badge](https://img.shields.io/github/issues-raw/J-The-Fox/FRC-Team-5098?color=ee7b1a&label=Open%20Issues&style=flat-square) -![badge](https://img.shields.io/github/issues-closed-raw/J-The-Fox/FRC-Team-5098?color=ee7b1a&label=Closed%20Issues&style=flat-square) +![Last Commit](https://img.shields.io/github/last-commit/Sting-R/FRC-Team-5098?color=700e9b&display_timestamp=committer&label=Last%20Commit&style=flat-square) +![Pull Requests](https://img.shields.io/github/issues-pr/Sting-R/FRC-Team-5098?color=ffd000&label=Pull%20Requests&style=flat-square) +![Contributors](https://img.shields.io/github/contributors/Sting-R/FRC-Team-5098?color=700e9b&label=Contributors&style=flat-square) +![Open Issues](https://img.shields.io/github/issues-raw/Sting-R/FRC-Team-5098?color=ffd000&label=Open%20Issues&style=flat-square) +![Closed Issues](https://img.shields.io/github/issues-closed-raw/Sting-R/FRC-Team-5098?color=700e9b&label=Closed%20Issues&style=flat-square) -[![Readme Card](https://github-readme-stats-sigma-five.vercel.app/api/pin/?username=J-The-Fox&repo=FRC-Team-5098&theme=dark)](https://github.com/J-The-Fox/FRC-Team-5098) +[![Readme Card](https://github-readme-stats-sigma-five.vercel.app/api/pin/?username=Sting-R&repo=FRC-Team-5098&theme=shades-of-purple&bg_color=00000000)](https://github.com/Sting-R/FRC-Team-5098) ## Contributing @@ -29,7 +33,3 @@ If you would like to contribute to this repository; ✨amazing!✨ Just follow s - Be cival and kind. Giving constructive critisim is okay but at least be kind about it - If you have any questions or have an issue, feel free to start a discussion or open up an issue - Look in the [TODO discussion](https://github.com/J-The-Fox/FRC-Team-5098/discussions/4) to see what else needs to be completed. If you wanna add something or change something, feel free to ask - ---- -Happy Programming! -\- [J-The-Fox](https://github.com/J-The-Fox) From 6759e185ae2b1ac77a0cfbe866731ee903036896 Mon Sep 17 00:00:00 2001 From: Jay Date: Thu, 21 Nov 2024 14:03:05 -0600 Subject: [PATCH 03/39] Update README.md --- README.md | 90 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 90 insertions(+) diff --git a/README.md b/README.md index 065d929..a6e264a 100644 --- a/README.md +++ b/README.md @@ -18,6 +18,10 @@ Note: We can continue to use the original assets as there really isn't a reason This is free for **anyone** to contribute to! (Especailly if you are part of our team) If you would like to contribute to this repository; ✨amazing!✨ Just follow some rules: + + **Wiki** - Before you edit anything in the wiki, prepose your change in the [discussion](https://github.com/J-The-Fox/FRC-Team-5098/discussions/3) first - If you take images, text, screenshots, etc from somewhere else for the wiki, give credit to the original source or author! @@ -33,3 +37,89 @@ If you would like to contribute to this repository; ✨amazing!✨ Just follow s - Be cival and kind. Giving constructive critisim is okay but at least be kind about it - If you have any questions or have an issue, feel free to start a discussion or open up an issue - Look in the [TODO discussion](https://github.com/J-The-Fox/FRC-Team-5098/discussions/4) to see what else needs to be completed. If you wanna add something or change something, feel free to ask + +## Robot Setup + + + +### Networking + +This uses the standard TE.AM IP Notation[^1] + + + +**With the OpenMesh Radio** + +```mermaid +--- +config: + look: classic + layout: elk + theme: neo-dark +--- +flowchart TD + RoboRIO["RoboRIO + (10.50.98.2) + (172.22.11.2 via USB)"] <-- Ethernet --> NetworkSwitch["Network Switch + *Unmanaged*"] + NetworkSwitch <-- Ethernet --> Radio["Radio + *DHCP Server* + (10.50.98.1)"] & Limelight["Limelight + (10.50.98.Y)"] & OtherDevice["Other Networked Devices + (10.50.98.Z)"] & Computer["Computer + (10.50.98.X) + (172.22.11.1 via USB)"] + Computer <-- WiFi --> Radio + Computer <-- USB --> RoboRIO + NetworkSwitch@{ shape: card} + Computer@{ shape: tag-proc} + +``` +--- +**With the VH-109 Radio from West Coast Products** + +> [!NOTE] +> If there are 2 or less Limelights and other networked devices, those devices will be connected to the radio instead. So there will not be a need for a network switch + +```mermaid +--- +config: + look: classic + layout: elk + theme: neo-dark +--- +flowchart TD + RoboRIO["RoboRIO + (10.50.98.2) + (172.22.11.2 via USB)"] <-- Ethernet --> Radio["Radio + *DHCP Server* + (10.50.98.1)"] + NetworkSwitch["Network Switch + *Unmanaged*"] <-- Ethernet --> Radio & Limelight["Limelight + (10.50.98.Y)"] & OtherDevice["Other Networked Devices + (10.50.98.Z)"] + Computer["Computer + (10.50.98.X) + (172.22.11.1 via USB)"] <-- WiFi --> Radio + Computer <-- USB --> RoboRIO + Computer <-- Ethernet --> Radio + NetworkSwitch@{ shape: card} + Computer@{ shape: tag-proc} +``` + +### Drive System + +The drive system used is the Swerve X[^2] +The motor that we use is most likely going to be the Kraken X60 + +However, due to issues with the Kraken X60s during the 2023-2024 year, we may revert back to Falcon 500s. The issue at hand was the Kraken X60s failing during matches where the motor would fail to spin at full rpm, sound terrible and heat up very quickly. During last season alone, we lost 3 Kraken X60s. Hopefully during this year's 2024-2025 season, we won't experience as many issues. But the motors in use for th edrive system is still up for discussion. + +> [!NOTE] +> Other information will be posted whenever we have a more up-to-date design of our robot (and whenever we know what the challange will be!) + +[^1]: [TE.AM IP Notation](https://docs.wpilib.org/en/stable/docs/networking/networking-introduction/ip-configurations.html#te-am-ip-notation) +[^2]: [Swerve X](https://wcproducts.com/products/swerve-x) From a60b815c4db9f4d8084eb5fd60c03d089312e3c0 Mon Sep 17 00:00:00 2001 From: Jay McNeely Date: Thu, 21 Nov 2024 16:44:21 -0600 Subject: [PATCH 04/39] Started work on new code base. --- src/main/java/frc/CommonData.java | 49 +++++++ src/main/java/frc/components/PDH.java | 132 ++++++++++++++++++ src/main/java/frc/components/RoboRIO.java | 53 +++++++ .../java/frc/components/package-info.java | 1 + src/main/java/frc/subsystems/Drive.java | 5 + .../java/frc/subsystems/sensors/NavX.java | 58 ++++++++ .../frc/subsystems/sensors/package-info.java | 9 ++ 7 files changed, 307 insertions(+) create mode 100644 src/main/java/frc/CommonData.java create mode 100644 src/main/java/frc/components/PDH.java create mode 100644 src/main/java/frc/components/RoboRIO.java create mode 100644 src/main/java/frc/components/package-info.java create mode 100644 src/main/java/frc/subsystems/Drive.java create mode 100644 src/main/java/frc/subsystems/sensors/NavX.java create mode 100644 src/main/java/frc/subsystems/sensors/package-info.java diff --git a/src/main/java/frc/CommonData.java b/src/main/java/frc/CommonData.java new file mode 100644 index 0000000..f98a5cd --- /dev/null +++ b/src/main/java/frc/CommonData.java @@ -0,0 +1,49 @@ +package frc; + +/** + * CommonData Class + *

+ * This class is used to store common data that is used throughout the code. + *

+ */ +public class CommonData { + + // NavX Data // + + /** + * NavX Yaw + */ + public static double navXYaw; + + /** + * NavX Pitch + */ + public static double navXPitch; + + /** + * NavX Roll + */ + public static double navXRoll; + + /** + * NavX Acceleration X + */ + public static double navXAccelX; + + /** + * NavX Acceleration Y + */ + public static double navXAccelY; + + /** + * NavX Acceleration Z + */ + public static double navXAccelZ; + + /** + * NavX Temperature + */ + public static double navXTemp; + + // Power Distribution Panel Data // +} diff --git a/src/main/java/frc/components/PDH.java b/src/main/java/frc/components/PDH.java new file mode 100644 index 0000000..50f2deb --- /dev/null +++ b/src/main/java/frc/components/PDH.java @@ -0,0 +1,132 @@ +package frc.components; + +import edu.wpi.first.wpilibj.PowerDistribution; +import edu.wpi.first.hal.PowerDistributionFaults; +import edu.wpi.first.hal.PowerDistributionStickyFaults; +import edu.wpi.first.hal.PowerDistributionVersion; + +/** + * Power Distribution Hub Class + * + *

+ * This class holds methods used for the Power Distribution Hub. + *

+ */ +public class PDH { + + /** + * Number of channels on the Power Distribution Hub + */ + private int numChannels; + + /** + * Power Distribution Hub Object + */ + private PowerDistribution pdh; + + /** + * PDH Constructor + */ + public PDH(final int id){ + pdh = new PowerDistribution(id, PowerDistribution.ModuleType.kRev); + numChannels = pdh.getNumChannels(); + } + + // Power // + + /** + * Get the overall voltage of the Power Distribution Hub + * + * @return The voltage of the Power Distribution Hub + */ + public double getTotalVoltage(){ + return pdh.getVoltage(); + } + + /** + * Get the current of a specific channel on the Power Distribution Hub + * + * @param channel The channel to get the current of + * @return The current of the channel + */ + public double getChannelCurrent(final int channel) { + return pdh.getCurrent(channel); + } + + /** + * Get all channel currents of the Power Distribution Hub and return them + * in an array + * + * @return An array of all channel currents + */ + public double[] getChannelCurrents() { + double[] currents = new double[numChannels]; + for (int i = 0; i < numChannels; i++) { + currents[i] = pdh.getCurrent(i); + } + return currents; + } + + /** + * Get the total current of the Power Distribution Hub + * + * @return Total current of the Power Distribution Hub + */ + public double getTotalCurrent() { + return pdh.getTotalCurrent(); + } + + /** + * Get the total power of the Power Distribution Hub + * + * @return Total power of the Power Distribution Hub + */ + public double getTotalPower() { + return pdh.getTotalPower(); + } + + /** + * Get the total energy of the Power Distribution Hub + * + * @return Total energy of the Power Distribution Hub + */ + public double getTotalEnergy() { + return pdh.getTotalEnergy(); + } + + // Faults // + + /** + * Get any faults on the Power Distribution Hub + */ + public PowerDistributionFaults getFaults() { + return pdh.getFaults(); + } + + /** + * Get any sticky faults on the Power Distribution Hub + */ + public PowerDistributionStickyFaults getStickyFaults() { + return pdh.getStickyFaults(); + } + + /** + * Clear all sticky faults on the Power Distribution Hub + */ + public void clearStickyFaults() { + pdh.clearStickyFaults(); + } + + // Miscellaneous // + + /** + * Get the firmware version of the Power Distribution Hub + * + * @return Firmware version of the Power Distribution Hub + */ + public PowerDistributionVersion getFirmwareVersion() { + return pdh.getVersion(); + } + + // Temperature is not available on the PDH :( +} diff --git a/src/main/java/frc/components/RoboRIO.java b/src/main/java/frc/components/RoboRIO.java new file mode 100644 index 0000000..1c8d171 --- /dev/null +++ b/src/main/java/frc/components/RoboRIO.java @@ -0,0 +1,53 @@ +package frc.components; + +import edu.wpi.first.hal.simulation.RoboRioDataJNI; + +/** + * RoboRIO Class + * + *

+ * This class holds methods used for monitoring the RoboRIO. + *

+ */ +public class RoboRIO { + + /** + * Get the CPU temperature of the RoboRIO + */ + public static double getCPUTemperature() { + return RoboRioDataJNI.getCPUTemp(); + } + + /** + * Get the voltage of the RoboRIO + * + *

+ * This is the voltage going into the RoboRIO + * This does *not* include any channels on the RoboRIO such as DIO, PWM, + * CAN, etc. + *

+ */ + public static double getVoltage() { + return RoboRioDataJNI.getVInVoltage(); + } + + /** + * Get the current of the RoboRIO + * + *

+ * This is the current being drawn by the RoboRIO + * This does *not* include any channels on the RoboRIO such as DIO, PWM, + * CAN, etc. + *

+ */ + public static double getCurrent() { + return RoboRioDataJNI.getVInCurrent(); + } + + /** + * Get the serial number of the RoboRIO + */ + public static String getSerialNumber() { + return RoboRioDataJNI.getSerialNumber(); + } +} diff --git a/src/main/java/frc/components/package-info.java b/src/main/java/frc/components/package-info.java new file mode 100644 index 0000000..ffe3857 --- /dev/null +++ b/src/main/java/frc/components/package-info.java @@ -0,0 +1 @@ +package frc.components; diff --git a/src/main/java/frc/subsystems/Drive.java b/src/main/java/frc/subsystems/Drive.java new file mode 100644 index 0000000..734dc45 --- /dev/null +++ b/src/main/java/frc/subsystems/Drive.java @@ -0,0 +1,5 @@ +package frc.subsystems; + +public class Drive { + +} diff --git a/src/main/java/frc/subsystems/sensors/NavX.java b/src/main/java/frc/subsystems/sensors/NavX.java new file mode 100644 index 0000000..d7c3bf7 --- /dev/null +++ b/src/main/java/frc/subsystems/sensors/NavX.java @@ -0,0 +1,58 @@ +package frc.subsystems.sensors; + +import com.studica.frc.AHRS; +import com.studica.frc.AHRS.NavXComType; +import edu.wpi.first.wpilibj.SPI; // This is for a fallback Gyro + +import frc.CommonData; + +public class NavX { + + /** + * NavX Object + */ + private AHRS navX; + + /** + * NavX Constructor + */ + public NavX() { + navX = new AHRS(NavXComType.kMXP_SPI); + } + + /** + * Reset the NavX + */ + public void reset() { + navX.reset(); + } + + /** + * Get if the NavX is calibrating + * + * @return If the NavX is calibrating + */ + public boolean isCalibrating() { + return navX.isCalibrating(); + } + + /** + * NavX Update method + *

+ * This method is used to update the NavX data and publish it to CommonData. + * This is called via the Sensor.update() method within the Robot.java file. + *

+ *

+ * This uses the IComponent interface + *

+ */ + public void update() { + CommonData.navXYaw = navX.getYaw(); + CommonData.navXPitch = navX.getPitch(); + CommonData.navXRoll = navX.getRoll(); + CommonData.navXAccelX = navX.getWorldLinearAccelX(); + CommonData.navXAccelY = navX.getWorldLinearAccelY(); + CommonData.navXAccelZ = navX.getWorldLinearAccelZ(); + CommonData.navXTemp = navX.getTempC(); + } +} diff --git a/src/main/java/frc/subsystems/sensors/package-info.java b/src/main/java/frc/subsystems/sensors/package-info.java new file mode 100644 index 0000000..65ebcb3 --- /dev/null +++ b/src/main/java/frc/subsystems/sensors/package-info.java @@ -0,0 +1,9 @@ + +/** + * Sensors subsystem package. + *

+ * This package contains all sensor subsystems. + * This includes temperature, gyro, accelerometer, and other sensors. + *

+ */ +package frc.subsystems.sensors; \ No newline at end of file From aacd74eadca9529d7e0679a91d534c0e5d6530a1 Mon Sep 17 00:00:00 2001 From: Henry Hare <116603758+Dreadfall@users.noreply.github.com> Date: Wed, 27 Nov 2024 14:49:10 -0600 Subject: [PATCH 05/39] Update README.md Spelling corrections with grammerly :D --- README.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index a6e264a..280cf57 100644 --- a/README.md +++ b/README.md @@ -15,11 +15,11 @@ Note: We can continue to use the original assets as there really isn't a reason ## Contributing -This is free for **anyone** to contribute to! (Especailly if you are part of our team) +This is free for **anyone** to contribute to! (Especially if you are part of our team) If you would like to contribute to this repository; ✨amazing!✨ Just follow some rules: **Wiki** @@ -29,12 +29,12 @@ Note: The links here will be updated whenever the issues, wiki and discussions g **Code** - If you're adding code, please make it well documented. We all would like to know what it is doing without digging around -- If you would like to add another WPILib project, make sure to ask before hand. -- Stick to Java and Python if possible but if you would like to use C++, make it well documented as our team uses Java primarily. (Would need to go in its own WPILib project) +- If you would like to add another WPILib project, make sure to ask beforehand. +- Stick to Java and Python if possible, but if you would like to use C++, make it well documented as our team uses Java primarily. (Would need to go in its own WPILib project) - Add any examples you would like, can be related to the WPILib API or not. Any examples will help further the understanding of others **General** -- Be cival and kind. Giving constructive critisim is okay but at least be kind about it +- Be civil and kind. Giving constructive criticism is okay, but at least be kind about it - If you have any questions or have an issue, feel free to start a discussion or open up an issue - Look in the [TODO discussion](https://github.com/J-The-Fox/FRC-Team-5098/discussions/4) to see what else needs to be completed. If you wanna add something or change something, feel free to ask @@ -83,7 +83,7 @@ flowchart TD **With the VH-109 Radio from West Coast Products** > [!NOTE] -> If there are 2 or less Limelights and other networked devices, those devices will be connected to the radio instead. So there will not be a need for a network switch +> If there are 2 or fewer Limelights and other networked devices, those devices will be connected to the radio instead. So there will not be a need for a network switch. ```mermaid --- @@ -116,10 +116,10 @@ flowchart TD The drive system used is the Swerve X[^2] The motor that we use is most likely going to be the Kraken X60 -However, due to issues with the Kraken X60s during the 2023-2024 year, we may revert back to Falcon 500s. The issue at hand was the Kraken X60s failing during matches where the motor would fail to spin at full rpm, sound terrible and heat up very quickly. During last season alone, we lost 3 Kraken X60s. Hopefully during this year's 2024-2025 season, we won't experience as many issues. But the motors in use for th edrive system is still up for discussion. +However, due to issues with the Kraken X60s during the 2023-2024 year, we may revert back to Falcon 500s. The issue at hand was the Kraken X60s failing during matches where the motor would fail to spin at full rpm, sound terrible, and heat up very quickly. During last season alone, we lost 3 Kraken X60s. Hopefully, during this year's 2024-2025 season, we won't experience as many issues. But the motors in use for the drive system are still up for discussion. > [!NOTE] -> Other information will be posted whenever we have a more up-to-date design of our robot (and whenever we know what the challange will be!) +> Other information will be posted whenever we have a more up-to-date design of our robot (and whenever we know what the challenge will be!) [^1]: [TE.AM IP Notation](https://docs.wpilib.org/en/stable/docs/networking/networking-introduction/ip-configurations.html#te-am-ip-notation) [^2]: [Swerve X](https://wcproducts.com/products/swerve-x) From 394b313e2944e444628e9d4f0620d8c87aebaa15 Mon Sep 17 00:00:00 2001 From: Jay Date: Fri, 29 Nov 2024 09:14:36 -0600 Subject: [PATCH 06/39] Move Networking to the Wiki Moved the networking section to the Wiki, instead of here as it makes more sense to have that there --- README.md | 71 ------------------------------------------------------- 1 file changed, 71 deletions(-) diff --git a/README.md b/README.md index 280cf57..7d90322 100644 --- a/README.md +++ b/README.md @@ -40,77 +40,6 @@ Note: The links here will be updated whenever the issues, wiki, and discussions ## Robot Setup - - -### Networking - -This uses the standard TE.AM IP Notation[^1] - - - -**With the OpenMesh Radio** - -```mermaid ---- -config: - look: classic - layout: elk - theme: neo-dark ---- -flowchart TD - RoboRIO["RoboRIO - (10.50.98.2) - (172.22.11.2 via USB)"] <-- Ethernet --> NetworkSwitch["Network Switch - *Unmanaged*"] - NetworkSwitch <-- Ethernet --> Radio["Radio - *DHCP Server* - (10.50.98.1)"] & Limelight["Limelight - (10.50.98.Y)"] & OtherDevice["Other Networked Devices - (10.50.98.Z)"] & Computer["Computer - (10.50.98.X) - (172.22.11.1 via USB)"] - Computer <-- WiFi --> Radio - Computer <-- USB --> RoboRIO - NetworkSwitch@{ shape: card} - Computer@{ shape: tag-proc} - -``` ---- -**With the VH-109 Radio from West Coast Products** - -> [!NOTE] -> If there are 2 or fewer Limelights and other networked devices, those devices will be connected to the radio instead. So there will not be a need for a network switch. - -```mermaid ---- -config: - look: classic - layout: elk - theme: neo-dark ---- -flowchart TD - RoboRIO["RoboRIO - (10.50.98.2) - (172.22.11.2 via USB)"] <-- Ethernet --> Radio["Radio - *DHCP Server* - (10.50.98.1)"] - NetworkSwitch["Network Switch - *Unmanaged*"] <-- Ethernet --> Radio & Limelight["Limelight - (10.50.98.Y)"] & OtherDevice["Other Networked Devices - (10.50.98.Z)"] - Computer["Computer - (10.50.98.X) - (172.22.11.1 via USB)"] <-- WiFi --> Radio - Computer <-- USB --> RoboRIO - Computer <-- Ethernet --> Radio - NetworkSwitch@{ shape: card} - Computer@{ shape: tag-proc} -``` - ### Drive System The drive system used is the Swerve X[^2] From 9ec5b595a95fd411d5770fa32cb754b188d594f4 Mon Sep 17 00:00:00 2001 From: Jay McNeely Date: Mon, 2 Dec 2024 09:37:40 -0600 Subject: [PATCH 07/39] Bumped WPILib to 2025.1.1 Beta 2. --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index ebe56af..28e27fa 100644 --- a/build.gradle +++ b/build.gradle @@ -1,6 +1,6 @@ plugins { id "java" - id "edu.wpi.first.GradleRIO" version "2025.1.1-beta-1" + id "edu.wpi.first.GradleRIO" version "2025.1.1-beta-2" } java { From b459082437225fbfecd59df8d141fe5ec828c8f9 Mon Sep 17 00:00:00 2001 From: Jay McNeely Date: Mon, 2 Dec 2024 09:41:04 -0600 Subject: [PATCH 08/39] Bumped Gradle to 8.11 as required by WPILib update. --- gradle/wrapper/gradle-wrapper.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index cd33eac..8e975a5 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=permwrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.11-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME From c139a264de48adb1023da5ca84a5e668826494d2 Mon Sep 17 00:00:00 2001 From: Jay McNeely Date: Tue, 3 Dec 2024 11:49:15 -0600 Subject: [PATCH 09/39] Added a test Gradle workflow. --- .github/workflows/gradle.yml | 41 ++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 .github/workflows/gradle.yml diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml new file mode 100644 index 0000000..87d7bb5 --- /dev/null +++ b/.github/workflows/gradle.yml @@ -0,0 +1,41 @@ +# Gradle workflow to build the current project and generate a dependency graph for Dependabot Alerts. + +name: Gradle Dependencies and Build + +on: + push: + branches: [ "main" ] + pull_request: + branches: [ "main" ] + +jobs: + build: + + runs-on: ubuntu-latest + permissions: + contents: read + + steps: + - uses: actions/checkout@v4 + + # Configure Gradle for optimal use in GitHub Actions, including caching of downloaded dependencies. + # See: https://github.com/gradle/actions/blob/main/setup-gradle/README.md + - name: Setup Gradle + uses: gradle/actions/setup-gradle@af1da67850ed9a4cedd57bfd976089dd991e2582 # v4.0.0 + + - name: Build with Gradle Wrapper + run: ./gradlew build + + dependency-submission: + + runs-on: ubuntu-latest + permissions: + contents: write + + steps: + - uses: actions/checkout@v4 + + # Generates and submits a dependency graph, enabling Dependabot Alerts for all project dependencies. + # See: https://github.com/gradle/actions/blob/main/dependency-submission/README.md + - name: Generate and submit dependency graph + uses: gradle/actions/dependency-submission@af1da67850ed9a4cedd57bfd976089dd991e2582 # v4.0.0 \ No newline at end of file From af9cc87ae6a9476a587c3da1268dc864af26e26d Mon Sep 17 00:00:00 2001 From: Jay Date: Tue, 3 Dec 2024 11:51:01 -0600 Subject: [PATCH 10/39] Update gradle.yml branches to workflow-testing instead of main --- .github/workflows/gradle.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml index 87d7bb5..5f95ea1 100644 --- a/.github/workflows/gradle.yml +++ b/.github/workflows/gradle.yml @@ -4,9 +4,9 @@ name: Gradle Dependencies and Build on: push: - branches: [ "main" ] + branches: [ "workflow-testing" ] # Change to "main" when merged pull_request: - branches: [ "main" ] + branches: [ "workflow-testing" ] # Change to "main" when merged jobs: build: @@ -38,4 +38,4 @@ jobs: # Generates and submits a dependency graph, enabling Dependabot Alerts for all project dependencies. # See: https://github.com/gradle/actions/blob/main/dependency-submission/README.md - name: Generate and submit dependency graph - uses: gradle/actions/dependency-submission@af1da67850ed9a4cedd57bfd976089dd991e2582 # v4.0.0 \ No newline at end of file + uses: gradle/actions/dependency-submission@af1da67850ed9a4cedd57bfd976089dd991e2582 # v4.0.0 From e7fedd1801d1b57ec130f037fc16134887c32dd9 Mon Sep 17 00:00:00 2001 From: Jay Date: Tue, 3 Dec 2024 11:58:31 -0600 Subject: [PATCH 11/39] Add Java 17 JDK setup. --- .github/workflows/gradle.yml | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml index 5f95ea1..3c45c13 100644 --- a/.github/workflows/gradle.yml +++ b/.github/workflows/gradle.yml @@ -17,6 +17,13 @@ jobs: steps: - uses: actions/checkout@v4 + # Set up Java 17 JDK since the WPILib provided one isn't installed on this runner + # This will most likely change for a self-hosted runner + - name: Set up JDK 17 + uses: actions/setup-java@v4 + with: + java-version: '17' + distribution: 'temurin' # Configure Gradle for optimal use in GitHub Actions, including caching of downloaded dependencies. # See: https://github.com/gradle/actions/blob/main/setup-gradle/README.md @@ -35,6 +42,14 @@ jobs: steps: - uses: actions/checkout@v4 + # Set up Java 17 JDK since the WPILib provided one isn't installed on this runner + # This will most likely change for a self-hosted runner + - name: Set up JDK 17 + uses: actions/setup-java@v4 + with: + java-version: '17' + distribution: 'temurin' + # Generates and submits a dependency graph, enabling Dependabot Alerts for all project dependencies. # See: https://github.com/gradle/actions/blob/main/dependency-submission/README.md - name: Generate and submit dependency graph From 37da75603709cbef8c5ee9cda79d0f69538f4cc8 Mon Sep 17 00:00:00 2001 From: Jay Date: Wed, 4 Dec 2024 17:32:47 -0600 Subject: [PATCH 12/39] Create linter.yml Added a linter workflow that uses super-linter v4 --- .github/workflows/linter.yml | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 .github/workflows/linter.yml diff --git a/.github/workflows/linter.yml b/.github/workflows/linter.yml new file mode 100644 index 0000000..7800a11 --- /dev/null +++ b/.github/workflows/linter.yml @@ -0,0 +1,32 @@ +# Workflow to lint and format code using super-linter +# +# https://github.com/github/super-linter + +name: Linting and Formatting + +on: + push: + branches: [ "workflow-testing" ] # Change to "main" when merged + pull_request: + branches: [ "workflow-testing" ] # Change to "main" when merged + +jobs: + super-linter: + + runs-on: ubuntu-latest + permissions: + contents: read + + steps: + - uses: actions/checkout@v4 + with: + # Full git history is needed to get a proper list of changed files within `super-linter` + fetch-depth: 0 + + - name: Lint Code Base + uses: github/super-linter@v4 + # Update the environment here + env: + VALIDATE_ALL_CODEBASE: false + DEFAULT_BRANCH: "main" + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} From 0460842fb44761d45021552dbfb430f71c8ea5ed Mon Sep 17 00:00:00 2001 From: Jay Date: Wed, 4 Dec 2024 17:38:08 -0600 Subject: [PATCH 13/39] Add filter for files and folders using regex --- .github/workflows/linter.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/linter.yml b/.github/workflows/linter.yml index 7800a11..f7d4d34 100644 --- a/.github/workflows/linter.yml +++ b/.github/workflows/linter.yml @@ -28,5 +28,7 @@ jobs: # Update the environment here env: VALIDATE_ALL_CODEBASE: false + # Add files or folders to exclude here + FILTER_REGEX_EXCLUDE: ".*vendordeps/.*|.*gradlew|.*.gradle|.*WPILib-License.md.*" DEFAULT_BRANCH: "main" GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} From 12abae07e4afc9c2eab161d06195f01f4f41d4b6 Mon Sep 17 00:00:00 2001 From: Jay Date: Wed, 4 Dec 2024 17:48:58 -0600 Subject: [PATCH 14/39] Update linter.yml to check whole codebase, mainly for testing Changed the file to check the whole codebase, this is primarily for testing --- .github/workflows/linter.yml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/.github/workflows/linter.yml b/.github/workflows/linter.yml index f7d4d34..1f379ca 100644 --- a/.github/workflows/linter.yml +++ b/.github/workflows/linter.yml @@ -20,14 +20,17 @@ jobs: steps: - uses: actions/checkout@v4 with: - # Full git history is needed to get a proper list of changed files within `super-linter` + # Full git history is needed to get a proper list of changed files within + # `super-linter` fetch-depth: 0 - name: Lint Code Base uses: github/super-linter@v4 # Update the environment here env: - VALIDATE_ALL_CODEBASE: false + # Update to false whenever all previous files have been linted successfully so we + # aren't checking the whole codebase each time + VALIDATE_ALL_CODEBASE: true # Add files or folders to exclude here FILTER_REGEX_EXCLUDE: ".*vendordeps/.*|.*gradlew|.*.gradle|.*WPILib-License.md.*" DEFAULT_BRANCH: "main" From 842918ceeafef2fe137417380fc5c2117daf7055 Mon Sep 17 00:00:00 2001 From: Jay McNeely Date: Wed, 4 Dec 2024 18:26:32 -0600 Subject: [PATCH 15/39] Fixed up linter errors. --- src/main/java/frc/CommonData.java | 144 +++++++++++++++++- src/main/java/frc/components/PDH.java | 52 ++++--- src/main/java/frc/components/RoboRIO.java | 28 +++- .../java/frc/components/package-info.java | 3 + src/main/java/frc/robot/Main.java | 10 +- src/main/java/frc/robot/Robot.java | 65 ++++++-- src/main/java/frc/subsystems/Drive.java | 5 - .../java/frc/subsystems/sensors/NavX.java | 28 ++-- 8 files changed, 258 insertions(+), 77 deletions(-) delete mode 100644 src/main/java/frc/subsystems/Drive.java diff --git a/src/main/java/frc/CommonData.java b/src/main/java/frc/CommonData.java index f98a5cd..a0c84a8 100644 --- a/src/main/java/frc/CommonData.java +++ b/src/main/java/frc/CommonData.java @@ -13,37 +13,165 @@ public class CommonData { /** * NavX Yaw */ - public static double navXYaw; + private static double navXYaw; /** * NavX Pitch */ - public static double navXPitch; + private static double navXPitch; /** * NavX Roll */ - public static double navXRoll; + private static double navXRoll; /** * NavX Acceleration X */ - public static double navXAccelX; + private static double navXAccelX; /** * NavX Acceleration Y */ - public static double navXAccelY; + private static double navXAccelY; /** * NavX Acceleration Z */ - public static double navXAccelZ; + private static double navXAccelZ; /** * NavX Temperature */ - public static double navXTemp; + private static double navXTemp; - // Power Distribution Panel Data // + // Getters // + + /** + * Get the NavX Yaw + * + * @return The NavX Yaw + */ + public static double getNavXYaw() { + return navXYaw; + } + + /** + * Get the NavX Pitch + * + * @return The NavX Pitch + */ + public static double getNavXPitch() { + return navXPitch; + } + + /** + * Get the NavX Roll + * + * @return The NavX Roll + */ + public static double getNavXRoll() { + return navXRoll; + } + + /** + * Get the NavX Acceleration X + * + * @return The NavX Acceleration X + */ + public static double getNavXAccelX() { + return navXAccelX; + } + + /** + * Get the NavX Acceleration Y + * + * @return The NavX Acceleration Y + */ + public static double getNavXAccelY() { + return navXAccelY; + } + + /** + * Get the NavX Acceleration Z + * + * @return The NavX Acceleration Z + */ + public static double getNavXAccelZ() { + return navXAccelZ; + } + + /** + * Get the NavX Temperature + * + * @return The NavX Temperature + */ + public static double getNavXTemp() { + return navXTemp; + } + + // Setters // + + /** + * Set the NavX Yaw + * + * @param yaw The Yaw to set + */ + public static void setNavXYaw(final double yaw) { + navXYaw = yaw; + } + + /** + * Set the NavX Pitch + * + * @param pitch The Pitch to set + */ + public static void setNavXPitch(final double pitch) { + navXPitch = pitch; + } + + /** + * Set the NavX Roll + * + * @param roll The Roll to set + */ + public static void setNavXRoll(final double roll) { + navXRoll = roll; + } + + /** + * Set the NavX Acceleration X + * + * @param accelX The Acceleration X to set + */ + public static void setNavXAccelX(final double accelX) { + navXAccelX = accelX; + } + + /** + * Set the NavX Acceleration Y + * + * @param accelY The Acceleration Y to set + */ + public static void setNavXAccelY(final double accelY) { + navXAccelY = accelY; + } + + /** + * Set the NavX Acceleration Z + * + * @param accelZ The Acceleration Z to set + */ + public static void setNavXAccelZ(final double accelZ) { + navXAccelZ = accelZ; + } + + /** + * Set the NavX Temperature + * + * @param temp The Temperature to set + */ + public static void setNavXTemp(final double temp) { + navXTemp = temp; + } } diff --git a/src/main/java/frc/components/PDH.java b/src/main/java/frc/components/PDH.java index 50f2deb..1bf04ca 100644 --- a/src/main/java/frc/components/PDH.java +++ b/src/main/java/frc/components/PDH.java @@ -7,7 +7,7 @@ /** * Power Distribution Hub Class - * + * *

* This class holds methods used for the Power Distribution Hub. *

@@ -15,19 +15,21 @@ public class PDH { /** - * Number of channels on the Power Distribution Hub + * Number of channels on the Power Distribution Hub. */ private int numChannels; /** - * Power Distribution Hub Object + * Power Distribution Hub Object. */ private PowerDistribution pdh; /** - * PDH Constructor + * PDH Constructor. + * + * @param id The ID of the Power Distribution Hub */ - public PDH(final int id){ + public PDH(final int id) { pdh = new PowerDistribution(id, PowerDistribution.ModuleType.kRev); numChannels = pdh.getNumChannels(); } @@ -35,17 +37,17 @@ public PDH(final int id){ // Power // /** - * Get the overall voltage of the Power Distribution Hub - * + * Get the overall voltage of the Power Distribution Hub. + * * @return The voltage of the Power Distribution Hub */ - public double getTotalVoltage(){ + public double getTotalVoltage() { return pdh.getVoltage(); } /** - * Get the current of a specific channel on the Power Distribution Hub - * + * Get the current of a specific channel on the Power Distribution Hub. + * * @param channel The channel to get the current of * @return The current of the channel */ @@ -55,8 +57,8 @@ public double getChannelCurrent(final int channel) { /** * Get all channel currents of the Power Distribution Hub and return them - * in an array - * + * in an array. + * * @return An array of all channel currents */ public double[] getChannelCurrents() { @@ -68,8 +70,8 @@ public double[] getChannelCurrents() { } /** - * Get the total current of the Power Distribution Hub - * + * Get the total current of the Power Distribution Hub. + * * @return Total current of the Power Distribution Hub */ public double getTotalCurrent() { @@ -77,8 +79,8 @@ public double getTotalCurrent() { } /** - * Get the total power of the Power Distribution Hub - * + * Get the total power of the Power Distribution Hub. + * * @return Total power of the Power Distribution Hub */ public double getTotalPower() { @@ -86,8 +88,8 @@ public double getTotalPower() { } /** - * Get the total energy of the Power Distribution Hub - * + * Get the total energy of the Power Distribution Hub. + * * @return Total energy of the Power Distribution Hub */ public double getTotalEnergy() { @@ -97,21 +99,25 @@ public double getTotalEnergy() { // Faults // /** - * Get any faults on the Power Distribution Hub + * Get any faults on the Power Distribution Hub. + * + * @return Faults on the Power Distribution Hub */ public PowerDistributionFaults getFaults() { return pdh.getFaults(); } /** - * Get any sticky faults on the Power Distribution Hub + * Get any sticky faults on the Power Distribution Hub. + * + * @return Sticky faults on the Power Distribution Hub */ public PowerDistributionStickyFaults getStickyFaults() { return pdh.getStickyFaults(); } /** - * Clear all sticky faults on the Power Distribution Hub + * Clear all sticky faults on the Power Distribution Hub. */ public void clearStickyFaults() { pdh.clearStickyFaults(); @@ -120,8 +126,8 @@ public void clearStickyFaults() { // Miscellaneous // /** - * Get the firmware version of the Power Distribution Hub - * + * Get the firmware version of the Power Distribution Hub. + * * @return Firmware version of the Power Distribution Hub */ public PowerDistributionVersion getFirmwareVersion() { diff --git a/src/main/java/frc/components/RoboRIO.java b/src/main/java/frc/components/RoboRIO.java index 1c8d171..ef70ff5 100644 --- a/src/main/java/frc/components/RoboRIO.java +++ b/src/main/java/frc/components/RoboRIO.java @@ -3,42 +3,54 @@ import edu.wpi.first.hal.simulation.RoboRioDataJNI; /** - * RoboRIO Class - * + * RoboRIO Class. + * *

* This class holds methods used for monitoring the RoboRIO. *

*/ public class RoboRIO { + + /** + * Private constructor to prevent instantiation. + */ + private RoboRIO() { + throw new UnsupportedOperationException( + "This is a utility class and cannot be instantiated"); + } /** - * Get the CPU temperature of the RoboRIO + * Get the CPU temperature of the RoboRIO. */ public static double getCPUTemperature() { return RoboRioDataJNI.getCPUTemp(); } /** - * Get the voltage of the RoboRIO - * + * Get the voltage of the RoboRIO. + * *

* This is the voltage going into the RoboRIO * This does *not* include any channels on the RoboRIO such as DIO, PWM, * CAN, etc. *

+ * + * @return The voltage of the RoboRIO */ public static double getVoltage() { return RoboRioDataJNI.getVInVoltage(); } /** - * Get the current of the RoboRIO - * + * Get the current of the RoboRIO. + * *

* This is the current being drawn by the RoboRIO * This does *not* include any channels on the RoboRIO such as DIO, PWM, * CAN, etc. *

+ * + * @return The current of the RoboRIO */ public static double getCurrent() { return RoboRioDataJNI.getVInCurrent(); @@ -46,6 +58,8 @@ public static double getCurrent() { /** * Get the serial number of the RoboRIO + * + * @return The serial number of the RoboRIO */ public static String getSerialNumber() { return RoboRioDataJNI.getSerialNumber(); diff --git a/src/main/java/frc/components/package-info.java b/src/main/java/frc/components/package-info.java index ffe3857..123537e 100644 --- a/src/main/java/frc/components/package-info.java +++ b/src/main/java/frc/components/package-info.java @@ -1 +1,4 @@ +/** + * Contains all the components of the robot. + */ package frc.components; diff --git a/src/main/java/frc/robot/Main.java b/src/main/java/frc/robot/Main.java index 8776e5d..8303624 100644 --- a/src/main/java/frc/robot/Main.java +++ b/src/main/java/frc/robot/Main.java @@ -7,9 +7,9 @@ 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. + * 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() {} @@ -18,8 +18,10 @@ private Main() {} * Main initialization function. Do not perform any initialization here. * *

If you change your main robot class, change the parameter type. + * + * @param args Arguments passed to the main function. */ - public static void main(String... args) { + public static void main(final String... args) { RobotBase.startRobot(Robot::new); } } diff --git a/src/main/java/frc/robot/Robot.java b/src/main/java/frc/robot/Robot.java index 736b415..4762ecc 100644 --- a/src/main/java/frc/robot/Robot.java +++ b/src/main/java/frc/robot/Robot.java @@ -8,25 +8,49 @@ import edu.wpi.first.wpilibj.livewindow.LiveWindow; /** - * The methods in this class are called automatically corresponding to each mode, as described in - * the TimesliceRobot documentation. If you change the name of this class or the package after - * creating this project, you must also update the Main.java file in the project. + * The methods in this class are called automatically corresponding to each + * mode, as described in the TimesliceRobot documentation. If you change the + * name of this class or the package after creating this project, you must also + * update the Main.java file in the project. */ public class Robot extends TimesliceRobot { - /** Robot constructor. */ + + /** + * The period of the robot loop. + */ + private static final double kRobotPeriod = 0.005; + + /** + * The period of the controller loop. + */ + private static final double kControllerPeriod = 0.01; + + /** + * The period of the first controller loop. + */ + private static final double kController1Period = 0.002; + + /** + * The period of the second controller loop. + */ + private static final double kController2Period = 0.002; + + /** + * Robot constructor. + */ public Robot() { // Run robot periodic() functions for 5 ms, and run controllers every 10 ms - super(0.005, 0.01); + super(kRobotPeriod, kControllerPeriod); // LiveWindow causes drastic overruns in robot periodic functions that will // interfere with controllers LiveWindow.disableAllTelemetry(); // Runs for 2 ms after robot periodic functions - schedule(() -> {}, 0.002); + schedule(() -> {}, kController1Period); // Runs for 2 ms after first controller function - schedule(() -> {}, 0.002); + schedule(() -> {}, kController2Period); // Total usage: // 5 ms (robot) + 2 ms (controller 1) + 2 ms (controller 2) = 9 ms @@ -34,29 +58,38 @@ public Robot() { } @Override - public void robotPeriodic() {} + public void robotPeriodic() { + } @Override - public void autonomousInit() {} + public void autonomousInit() { + } @Override - public void autonomousPeriodic() {} + public void autonomousPeriodic() { + } @Override - public void teleopInit() {} + public void teleopInit() { + } @Override - public void teleopPeriodic() {} + public void teleopPeriodic() { + } @Override - public void disabledInit() {} + public void disabledInit() { + } @Override - public void disabledPeriodic() {} + public void disabledPeriodic() { + } @Override - public void testInit() {} + public void testInit() { + } @Override - public void testPeriodic() {} + public void testPeriodic() { + } } diff --git a/src/main/java/frc/subsystems/Drive.java b/src/main/java/frc/subsystems/Drive.java deleted file mode 100644 index 734dc45..0000000 --- a/src/main/java/frc/subsystems/Drive.java +++ /dev/null @@ -1,5 +0,0 @@ -package frc.subsystems; - -public class Drive { - -} diff --git a/src/main/java/frc/subsystems/sensors/NavX.java b/src/main/java/frc/subsystems/sensors/NavX.java index d7c3bf7..f97c2f8 100644 --- a/src/main/java/frc/subsystems/sensors/NavX.java +++ b/src/main/java/frc/subsystems/sensors/NavX.java @@ -2,34 +2,34 @@ import com.studica.frc.AHRS; import com.studica.frc.AHRS.NavXComType; -import edu.wpi.first.wpilibj.SPI; // This is for a fallback Gyro +// import edu.wpi.first.wpilibj.SPI; // This is for a fallback Gyro. import frc.CommonData; public class NavX { /** - * NavX Object + * NavX Object. */ private AHRS navX; /** - * NavX Constructor + * NavX Constructor. */ public NavX() { navX = new AHRS(NavXComType.kMXP_SPI); } /** - * Reset the NavX + * Reset the NavX. */ public void reset() { navX.reset(); } /** - * Get if the NavX is calibrating - * + * Get if the NavX is calibrating. + * * @return If the NavX is calibrating */ public boolean isCalibrating() { @@ -37,7 +37,7 @@ public boolean isCalibrating() { } /** - * NavX Update method + * NavX Update method. *

* This method is used to update the NavX data and publish it to CommonData. * This is called via the Sensor.update() method within the Robot.java file. @@ -47,12 +47,12 @@ public boolean isCalibrating() { *

*/ public void update() { - CommonData.navXYaw = navX.getYaw(); - CommonData.navXPitch = navX.getPitch(); - CommonData.navXRoll = navX.getRoll(); - CommonData.navXAccelX = navX.getWorldLinearAccelX(); - CommonData.navXAccelY = navX.getWorldLinearAccelY(); - CommonData.navXAccelZ = navX.getWorldLinearAccelZ(); - CommonData.navXTemp = navX.getTempC(); + CommonData.setNavXYaw(navX.getYaw()); + CommonData.setNavXPitch(navX.getPitch()); + CommonData.setNavXRoll(navX.getRoll()); + CommonData.setNavXAccelX(navX.getWorldLinearAccelX()); + CommonData.setNavXAccelY(navX.getWorldLinearAccelY()); + CommonData.setNavXAccelZ(navX.getWorldLinearAccelZ()); + CommonData.setNavXTemp(navX.getTempC()); } } From ae9763b1a6678b35fee4f1776024b33176d1e966 Mon Sep 17 00:00:00 2001 From: Jay McNeely Date: Wed, 4 Dec 2024 18:27:17 -0600 Subject: [PATCH 16/39] Added package-info.java files. --- src/main/java/frc/robot/package-info.java | 4 ++++ src/main/java/frc/subsystems/package-info.java | 4 ++++ 2 files changed, 8 insertions(+) create mode 100644 src/main/java/frc/robot/package-info.java create mode 100644 src/main/java/frc/subsystems/package-info.java diff --git a/src/main/java/frc/robot/package-info.java b/src/main/java/frc/robot/package-info.java new file mode 100644 index 0000000..0ac8d89 --- /dev/null +++ b/src/main/java/frc/robot/package-info.java @@ -0,0 +1,4 @@ +/** + * The main package for the robot code. + */ +package frc.robot; diff --git a/src/main/java/frc/subsystems/package-info.java b/src/main/java/frc/subsystems/package-info.java new file mode 100644 index 0000000..7d27539 --- /dev/null +++ b/src/main/java/frc/subsystems/package-info.java @@ -0,0 +1,4 @@ +/** + * Contains all the subsystems for the robot. + */ +package frc.subsystems; From 029f20e921c85a745b3eced052401794443f1ce9 Mon Sep 17 00:00:00 2001 From: Jay McNeely Date: Wed, 4 Dec 2024 18:27:37 -0600 Subject: [PATCH 17/39] Updated README to comply with linter. --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 7d90322..b757064 100644 --- a/README.md +++ b/README.md @@ -45,7 +45,8 @@ Note: The links here will be updated whenever the issues, wiki, and discussions The drive system used is the Swerve X[^2] The motor that we use is most likely going to be the Kraken X60 -However, due to issues with the Kraken X60s during the 2023-2024 year, we may revert back to Falcon 500s. The issue at hand was the Kraken X60s failing during matches where the motor would fail to spin at full rpm, sound terrible, and heat up very quickly. During last season alone, we lost 3 Kraken X60s. Hopefully, during this year's 2024-2025 season, we won't experience as many issues. But the motors in use for the drive system are still up for discussion. +However, due to issues with the Kraken X60s during the 2023-2024 year, we may revert back to Falcon 500s. The issue at hand was the Kraken X60s failing during matches where the motor would fail to spin at full rpm, sound terrible, and heat up very quickly. +During last season alone, we lost 3 Kraken X60s. Hopefully, during this year's 2024-2025 season, we won't experience as many issues. But the motors in use for the drive system are still up for discussion. > [!NOTE] > Other information will be posted whenever we have a more up-to-date design of our robot (and whenever we know what the challenge will be!) From 79aac5c022eb2e89d4ef0043ffb3d5cb72d2f83f Mon Sep 17 00:00:00 2001 From: Jay McNeely Date: Wed, 4 Dec 2024 18:40:57 -0600 Subject: [PATCH 18/39] Updated more files for linter check. --- src/main/java/frc/CommonData.java | 54 +++++---- src/main/java/frc/components/PDH.java | 6 +- src/main/java/frc/components/RoboRIO.java | 16 +-- src/main/java/frc/package-info.java | 7 ++ src/main/java/frc/robot/Main.java | 25 ++-- src/main/java/frc/robot/Robot.java | 112 +++++++++--------- .../frc/subsystems/sensors/package-info.java | 3 +- 7 files changed, 122 insertions(+), 101 deletions(-) create mode 100644 src/main/java/frc/package-info.java diff --git a/src/main/java/frc/CommonData.java b/src/main/java/frc/CommonData.java index a0c84a8..2b65df2 100644 --- a/src/main/java/frc/CommonData.java +++ b/src/main/java/frc/CommonData.java @@ -6,49 +6,57 @@ * This class is used to store common data that is used throughout the code. *

*/ -public class CommonData { - +public final class CommonData { + + /** + * Private constructor to prevent instantiation. + */ + private CommonData() { + throw new UnsupportedOperationException( + "This is a utility class and cannot be instantiated"); + } + // NavX Data // /** - * NavX Yaw + * NavX Yaw. */ private static double navXYaw; /** - * NavX Pitch + * NavX Pitch. */ private static double navXPitch; /** - * NavX Roll + * NavX Roll. */ private static double navXRoll; /** - * NavX Acceleration X + * NavX Acceleration X. */ private static double navXAccelX; /** - * NavX Acceleration Y + * NavX Acceleration Y. */ private static double navXAccelY; /** - * NavX Acceleration Z + * NavX Acceleration Z. */ private static double navXAccelZ; /** - * NavX Temperature + * NavX Temperature. */ private static double navXTemp; // Getters // /** - * Get the NavX Yaw + * Get the NavX Yaw. * * @return The NavX Yaw */ @@ -57,7 +65,7 @@ public static double getNavXYaw() { } /** - * Get the NavX Pitch + * Get the NavX Pitch. * * @return The NavX Pitch */ @@ -66,7 +74,7 @@ public static double getNavXPitch() { } /** - * Get the NavX Roll + * Get the NavX Roll. * * @return The NavX Roll */ @@ -75,7 +83,7 @@ public static double getNavXRoll() { } /** - * Get the NavX Acceleration X + * Get the NavX Acceleration X. * * @return The NavX Acceleration X */ @@ -84,7 +92,7 @@ public static double getNavXAccelX() { } /** - * Get the NavX Acceleration Y + * Get the NavX Acceleration Y. * * @return The NavX Acceleration Y */ @@ -93,7 +101,7 @@ public static double getNavXAccelY() { } /** - * Get the NavX Acceleration Z + * Get the NavX Acceleration Z. * * @return The NavX Acceleration Z */ @@ -102,7 +110,7 @@ public static double getNavXAccelZ() { } /** - * Get the NavX Temperature + * Get the NavX Temperature. * * @return The NavX Temperature */ @@ -113,7 +121,7 @@ public static double getNavXTemp() { // Setters // /** - * Set the NavX Yaw + * Set the NavX Yaw. * * @param yaw The Yaw to set */ @@ -122,7 +130,7 @@ public static void setNavXYaw(final double yaw) { } /** - * Set the NavX Pitch + * Set the NavX Pitch. * * @param pitch The Pitch to set */ @@ -131,7 +139,7 @@ public static void setNavXPitch(final double pitch) { } /** - * Set the NavX Roll + * Set the NavX Roll. * * @param roll The Roll to set */ @@ -140,7 +148,7 @@ public static void setNavXRoll(final double roll) { } /** - * Set the NavX Acceleration X + * Set the NavX Acceleration X. * * @param accelX The Acceleration X to set */ @@ -149,7 +157,7 @@ public static void setNavXAccelX(final double accelX) { } /** - * Set the NavX Acceleration Y + * Set the NavX Acceleration Y. * * @param accelY The Acceleration Y to set */ @@ -158,7 +166,7 @@ public static void setNavXAccelY(final double accelY) { } /** - * Set the NavX Acceleration Z + * Set the NavX Acceleration Z. * * @param accelZ The Acceleration Z to set */ @@ -167,7 +175,7 @@ public static void setNavXAccelZ(final double accelZ) { } /** - * Set the NavX Temperature + * Set the NavX Temperature. * * @param temp The Temperature to set */ diff --git a/src/main/java/frc/components/PDH.java b/src/main/java/frc/components/PDH.java index 1bf04ca..46b063b 100644 --- a/src/main/java/frc/components/PDH.java +++ b/src/main/java/frc/components/PDH.java @@ -95,7 +95,7 @@ public double getTotalPower() { public double getTotalEnergy() { return pdh.getTotalEnergy(); } - + // Faults // /** @@ -106,7 +106,7 @@ public double getTotalEnergy() { public PowerDistributionFaults getFaults() { return pdh.getFaults(); } - + /** * Get any sticky faults on the Power Distribution Hub. * @@ -115,7 +115,7 @@ public PowerDistributionFaults getFaults() { public PowerDistributionStickyFaults getStickyFaults() { return pdh.getStickyFaults(); } - + /** * Clear all sticky faults on the Power Distribution Hub. */ diff --git a/src/main/java/frc/components/RoboRIO.java b/src/main/java/frc/components/RoboRIO.java index ef70ff5..00c7995 100644 --- a/src/main/java/frc/components/RoboRIO.java +++ b/src/main/java/frc/components/RoboRIO.java @@ -9,7 +9,7 @@ * This class holds methods used for monitoring the RoboRIO. *

*/ -public class RoboRIO { +public final class RoboRIO { /** * Private constructor to prevent instantiation. @@ -18,9 +18,11 @@ private RoboRIO() { throw new UnsupportedOperationException( "This is a utility class and cannot be instantiated"); } - + /** * Get the CPU temperature of the RoboRIO. + * + * @return The CPU temperature of the RoboRIO */ public static double getCPUTemperature() { return RoboRioDataJNI.getCPUTemp(); @@ -30,11 +32,11 @@ public static double getCPUTemperature() { * Get the voltage of the RoboRIO. * *

- * This is the voltage going into the RoboRIO + * This is the voltage going into the RoboRIO * This does *not* include any channels on the RoboRIO such as DIO, PWM, * CAN, etc. *

- * + * * @return The voltage of the RoboRIO */ public static double getVoltage() { @@ -49,7 +51,7 @@ public static double getVoltage() { * This does *not* include any channels on the RoboRIO such as DIO, PWM, * CAN, etc. *

- * + * * @return The current of the RoboRIO */ public static double getCurrent() { @@ -57,8 +59,8 @@ public static double getCurrent() { } /** - * Get the serial number of the RoboRIO - * + * Get the serial number of the RoboRIO. + * * @return The serial number of the RoboRIO */ public static String getSerialNumber() { diff --git a/src/main/java/frc/package-info.java b/src/main/java/frc/package-info.java new file mode 100644 index 0000000..36e2dec --- /dev/null +++ b/src/main/java/frc/package-info.java @@ -0,0 +1,7 @@ +/** + * Main package for robot code. + *

+ * All code that is deployed to the robot would be located under this package. + *

+ */ +package frc; diff --git a/src/main/java/frc/robot/Main.java b/src/main/java/frc/robot/Main.java index 8303624..7e81ff3 100644 --- a/src/main/java/frc/robot/Main.java +++ b/src/main/java/frc/robot/Main.java @@ -12,16 +12,21 @@ * 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. - * - * @param args Arguments passed to the main function. - */ - public static void main(final String... args) { + /** + * Private constructor to prevent instantiation of this class. + */ + private Main() { + } + + /** + * Main initialization function. Do not perform any initialization here. + * + *

If you change your main robot class, change the parameter type. + * + * @param args Arguments passed to the main function. + */ + public static void main(final String... args) { RobotBase.startRobot(Robot::new); - } + } } diff --git a/src/main/java/frc/robot/Robot.java b/src/main/java/frc/robot/Robot.java index 4762ecc..c2ca63c 100644 --- a/src/main/java/frc/robot/Robot.java +++ b/src/main/java/frc/robot/Robot.java @@ -14,82 +14,82 @@ * update the Main.java file in the project. */ public class Robot extends TimesliceRobot { - - /** - * The period of the robot loop. - */ - private static final double kRobotPeriod = 0.005; - - /** - * The period of the controller loop. - */ - private static final double kControllerPeriod = 0.01; - - /** - * The period of the first controller loop. - */ - private static final double kController1Period = 0.002; - - /** - * The period of the second controller loop. - */ - private static final double kController2Period = 0.002; - - /** - * Robot constructor. - */ - public Robot() { + + /** + * The period of the robot loop. + */ + private static final double ROBOTPERIOD = 0.005; + + /** + * The period of the controller loop. + */ + private static final double CONTROLLERPERIOD = 0.01; + + /** + * The period of the first controller loop. + */ + private static final double CONTROLLER1PERIOD = 0.002; + + /** + * The period of the second controller loop. + */ + private static final double CONTROLLER2PERIOD = 0.002; + + /** + * Robot constructor. + */ + public Robot() { // Run robot periodic() functions for 5 ms, and run controllers every 10 ms - super(kRobotPeriod, kControllerPeriod); + super(ROBOTPERIOD, CONTROLLERPERIOD); // LiveWindow causes drastic overruns in robot periodic functions that will // interfere with controllers LiveWindow.disableAllTelemetry(); // Runs for 2 ms after robot periodic functions - schedule(() -> {}, kController1Period); + schedule(() -> { }, CONTROLLER1PERIOD); // Runs for 2 ms after first controller function - schedule(() -> {}, kController2Period); + schedule(() -> { }, CONTROLLER2PERIOD); // Total usage: // 5 ms (robot) + 2 ms (controller 1) + 2 ms (controller 2) = 9 ms // 9 ms / 10 ms -> 90% allocated - } + } - @Override - public void robotPeriodic() { - } + @Override + public void robotPeriodic() { + } - @Override - public void autonomousInit() { - } + @Override + public void autonomousInit() { + } - @Override - public void autonomousPeriodic() { - } + @Override + public void autonomousPeriodic() { + } - @Override - public void teleopInit() { - } + @Override + public void teleopInit() { + } - @Override - public void teleopPeriodic() { - } + @Override + public void teleopPeriodic() { + } - @Override - public void disabledInit() { - } + @Override + public void disabledInit() { + } - @Override - public void disabledPeriodic() { - } + @Override + public void disabledPeriodic() { + } - @Override - public void testInit() { - } + @Override + public void testInit() { + } - @Override - public void testPeriodic() { - } + @Override + public void testPeriodic() { + } } diff --git a/src/main/java/frc/subsystems/sensors/package-info.java b/src/main/java/frc/subsystems/sensors/package-info.java index 65ebcb3..a94cc3c 100644 --- a/src/main/java/frc/subsystems/sensors/package-info.java +++ b/src/main/java/frc/subsystems/sensors/package-info.java @@ -1,4 +1,3 @@ - /** * Sensors subsystem package. *

@@ -6,4 +5,4 @@ * This includes temperature, gyro, accelerometer, and other sensors. *

*/ -package frc.subsystems.sensors; \ No newline at end of file +package frc.subsystems.sensors; From fa16054375ce165d9ee1494fc928efd06b054ba3 Mon Sep 17 00:00:00 2001 From: Jay McNeely Date: Wed, 4 Dec 2024 18:45:07 -0600 Subject: [PATCH 19/39] Fixed up hopefully last files. --- README.md | 5 ++--- src/main/java/frc/robot/Main.java | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index b757064..158a338 100644 --- a/README.md +++ b/README.md @@ -42,7 +42,7 @@ Note: The links here will be updated whenever the issues, wiki, and discussions ### Drive System -The drive system used is the Swerve X[^2] +The drive system used is the Swerve X[^1] The motor that we use is most likely going to be the Kraken X60 However, due to issues with the Kraken X60s during the 2023-2024 year, we may revert back to Falcon 500s. The issue at hand was the Kraken X60s failing during matches where the motor would fail to spin at full rpm, sound terrible, and heat up very quickly. @@ -51,5 +51,4 @@ During last season alone, we lost 3 Kraken X60s. Hopefully, during this year's 2 > [!NOTE] > Other information will be posted whenever we have a more up-to-date design of our robot (and whenever we know what the challenge will be!) -[^1]: [TE.AM IP Notation](https://docs.wpilib.org/en/stable/docs/networking/networking-introduction/ip-configurations.html#te-am-ip-notation) -[^2]: [Swerve X](https://wcproducts.com/products/swerve-x) +[^1]: [Swerve X](https://wcproducts.com/products/swerve-x) diff --git a/src/main/java/frc/robot/Main.java b/src/main/java/frc/robot/Main.java index 7e81ff3..59d639c 100644 --- a/src/main/java/frc/robot/Main.java +++ b/src/main/java/frc/robot/Main.java @@ -23,7 +23,7 @@ private Main() { * Main initialization function. Do not perform any initialization here. * *

If you change your main robot class, change the parameter type. - * + * * @param args Arguments passed to the main function. */ public static void main(final String... args) { From 95788cc2b93bf2a28aca2a75ee9e19ad9b99fa04 Mon Sep 17 00:00:00 2001 From: Jay Date: Fri, 6 Dec 2024 11:23:35 -0600 Subject: [PATCH 20/39] Changed to self-hosted runner --- .github/workflows/linter.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/linter.yml b/.github/workflows/linter.yml index 1f379ca..35b9433 100644 --- a/.github/workflows/linter.yml +++ b/.github/workflows/linter.yml @@ -13,7 +13,7 @@ on: jobs: super-linter: - runs-on: ubuntu-latest + runs-on: self-hosted permissions: contents: read From 358e64a989fa62f56a771f61b8c7673e009aeece Mon Sep 17 00:00:00 2001 From: Jay Date: Fri, 6 Dec 2024 11:33:07 -0600 Subject: [PATCH 21/39] Starting fixing up warnings in linter.yml generated by super-linter --- .github/workflows/linter.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/linter.yml b/.github/workflows/linter.yml index 35b9433..097a062 100644 --- a/.github/workflows/linter.yml +++ b/.github/workflows/linter.yml @@ -1,14 +1,14 @@ # Workflow to lint and format code using super-linter # # https://github.com/github/super-linter - +--- name: Linting and Formatting on: push: - branches: [ "workflow-testing" ] # Change to "main" when merged + branches: ["workflow-testing"] # Change to "main" when merged pull_request: - branches: [ "workflow-testing" ] # Change to "main" when merged + branches: ["workflow-testing"] # Change to "main" when merged jobs: super-linter: From acf0b7c968909e499355e04091b87c186b3f8ee3 Mon Sep 17 00:00:00 2001 From: Jay Date: Fri, 10 Jan 2025 13:12:47 -0600 Subject: [PATCH 22/39] Switch back to ubuntu-latest for linters --- .github/workflows/linter.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/linter.yml b/.github/workflows/linter.yml index 097a062..b7a3840 100644 --- a/.github/workflows/linter.yml +++ b/.github/workflows/linter.yml @@ -13,7 +13,7 @@ on: jobs: super-linter: - runs-on: self-hosted + runs-on: ubuntu-latest permissions: contents: read From 35754f740a88646e6a9f42b741a91cefb29067e5 Mon Sep 17 00:00:00 2001 From: Jay McNeely Date: Fri, 10 Jan 2025 16:42:12 -0600 Subject: [PATCH 23/39] Update build.gradle for the kickoff release of WPILib --- build.gradle | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 28e27fa..11d95e6 100644 --- a/build.gradle +++ b/build.gradle @@ -1,6 +1,6 @@ plugins { id "java" - id "edu.wpi.first.GradleRIO" version "2025.1.1-beta-2" + id "edu.wpi.first.GradleRIO" version "2025.1.1" } java { @@ -33,6 +33,8 @@ deploy { frcStaticFileDeploy(getArtifactTypeClass('FileTreeArtifact')) { files = project.fileTree('src/main/deploy') directory = '/home/lvuser/deploy' + deleteOldFiles = false // Change to true to delete files on roboRIO that no + // longer exist in deploy directory of this project } } } From b5e74ce745c4352d1457afeee56c428b7ed378ae Mon Sep 17 00:00:00 2001 From: Jay McNeely Date: Fri, 10 Jan 2025 16:42:58 -0600 Subject: [PATCH 24/39] Removed beta libraries that are not compatible with the kickoff release --- .../java/frc/subsystems/sensors/NavX.java | 58 --------------- .../PathplannerLib-2025.0.0-beta-4.json | 38 ---------- vendordeps/Studica-2025.1.1-beta-3.json | 71 ------------------- 3 files changed, 167 deletions(-) delete mode 100644 src/main/java/frc/subsystems/sensors/NavX.java delete mode 100644 vendordeps/PathplannerLib-2025.0.0-beta-4.json delete mode 100644 vendordeps/Studica-2025.1.1-beta-3.json diff --git a/src/main/java/frc/subsystems/sensors/NavX.java b/src/main/java/frc/subsystems/sensors/NavX.java deleted file mode 100644 index f97c2f8..0000000 --- a/src/main/java/frc/subsystems/sensors/NavX.java +++ /dev/null @@ -1,58 +0,0 @@ -package frc.subsystems.sensors; - -import com.studica.frc.AHRS; -import com.studica.frc.AHRS.NavXComType; -// import edu.wpi.first.wpilibj.SPI; // This is for a fallback Gyro. - -import frc.CommonData; - -public class NavX { - - /** - * NavX Object. - */ - private AHRS navX; - - /** - * NavX Constructor. - */ - public NavX() { - navX = new AHRS(NavXComType.kMXP_SPI); - } - - /** - * Reset the NavX. - */ - public void reset() { - navX.reset(); - } - - /** - * Get if the NavX is calibrating. - * - * @return If the NavX is calibrating - */ - public boolean isCalibrating() { - return navX.isCalibrating(); - } - - /** - * NavX Update method. - *

- * This method is used to update the NavX data and publish it to CommonData. - * This is called via the Sensor.update() method within the Robot.java file. - *

- *

- * This uses the IComponent interface - *

- */ - public void update() { - CommonData.setNavXYaw(navX.getYaw()); - CommonData.setNavXPitch(navX.getPitch()); - CommonData.setNavXRoll(navX.getRoll()); - CommonData.setNavXAccelX(navX.getWorldLinearAccelX()); - CommonData.setNavXAccelY(navX.getWorldLinearAccelY()); - CommonData.setNavXAccelZ(navX.getWorldLinearAccelZ()); - CommonData.setNavXTemp(navX.getTempC()); - } -} diff --git a/vendordeps/PathplannerLib-2025.0.0-beta-4.json b/vendordeps/PathplannerLib-2025.0.0-beta-4.json deleted file mode 100644 index de2782e..0000000 --- a/vendordeps/PathplannerLib-2025.0.0-beta-4.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "fileName": "PathplannerLib-2025.0.0-beta-4.json", - "name": "PathplannerLib", - "version": "2025.0.0-beta-4", - "uuid": "1b42324f-17c6-4875-8e77-1c312bc8c786", - "frcYear": "2025", - "mavenUrls": [ - "https://3015rangerrobotics.github.io/pathplannerlib/repo" - ], - "jsonUrl": "https://3015rangerrobotics.github.io/pathplannerlib/PathplannerLib-beta.json", - "javaDependencies": [ - { - "groupId": "com.pathplanner.lib", - "artifactId": "PathplannerLib-java", - "version": "2025.0.0-beta-4" - } - ], - "jniDependencies": [], - "cppDependencies": [ - { - "groupId": "com.pathplanner.lib", - "artifactId": "PathplannerLib-cpp", - "version": "2025.0.0-beta-4", - "libName": "PathplannerLib", - "headerClassifier": "headers", - "sharedLibrary": false, - "skipInvalidPlatforms": true, - "binaryPlatforms": [ - "windowsx86-64", - "osxuniversal", - "linuxx86-64", - "linuxathena", - "linuxarm32", - "linuxarm64" - ] - } - ] -} \ No newline at end of file diff --git a/vendordeps/Studica-2025.1.1-beta-3.json b/vendordeps/Studica-2025.1.1-beta-3.json deleted file mode 100644 index 2f64aaf..0000000 --- a/vendordeps/Studica-2025.1.1-beta-3.json +++ /dev/null @@ -1,71 +0,0 @@ -{ - "fileName": "Studica-2025.1.1-beta-3.json", - "name": "Studica", - "version": "2025.1.1-beta-3", - "uuid": "cb311d09-36e9-4143-a032-55bb2b94443b", - "frcYear": "2025", - "mavenUrls": [ - "https://dev.studica.com/maven/release/2025/" - ], - "jsonUrl": "https://dev.studica.com/releases/2025/Studica-2025.1.1-beta-3.json", - "cppDependencies": [ - { - "artifactId": "Studica-cpp", - "binaryPlatforms": [ - "linuxathena", - "linuxarm32", - "linuxarm64", - "linuxx86-64", - "osxuniversal", - "windowsx86-64" - ], - "groupId": "com.studica.frc", - "headerClassifier": "headers", - "libName": "Studica", - "sharedLibrary": false, - "skipInvalidPlatforms": true, - "version": "2025.1.1-beta-3" - }, - { - "artifactId": "Studica-driver", - "binaryPlatforms": [ - "linuxathena", - "linuxarm32", - "linuxarm64", - "linuxx86-64", - "osxuniversal", - "windowsx86-64" - ], - "groupId": "com.studica.frc", - "headerClassifier": "headers", - "libName": "StudicaDriver", - "sharedLibrary": false, - "skipInvalidPlatforms": true, - "version": "2025.1.1-beta-3" - } - ], - "javaDependencies": [ - { - "artifactId": "Studica-java", - "groupId": "com.studica.frc", - "version": "2025.1.1-beta-3" - } - ], - "jniDependencies": [ - { - "artifactId": "Studica-driver", - "groupId": "com.studica.frc", - "isJar": false, - "skipInvalidPlatforms": true, - "validPlatforms": [ - "linuxathena", - "linuxarm32", - "linuxarm64", - "linuxx86-64", - "osxuniversal", - "windowsx86-64" - ], - "version": "2025.1.1-beta-3" - } - ] -} \ No newline at end of file From 2b4f329ec1cab465440144764ae627bc354335b4 Mon Sep 17 00:00:00 2001 From: Jay McNeely Date: Fri, 10 Jan 2025 16:44:05 -0600 Subject: [PATCH 25/39] Bumbed Phoenix 6, Phoenix 5, and WPILib New Commands to their full release. --- ...ta-2.json => Phoenix5-frc2025-latest.json} | 50 +++++--- ...ta-2.json => Phoenix6-frc2025-latest.json} | 111 +++++++++++++----- vendordeps/WPILibNewCommands.json | 74 ++++++------ 3 files changed, 151 insertions(+), 84 deletions(-) rename vendordeps/{Phoenix5-5.34.0-beta-2.json => Phoenix5-frc2025-latest.json} (75%) rename vendordeps/{Phoenix6-25.0.0-beta-2.json => Phoenix6-frc2025-latest.json} (79%) diff --git a/vendordeps/Phoenix5-5.34.0-beta-2.json b/vendordeps/Phoenix5-frc2025-latest.json similarity index 75% rename from vendordeps/Phoenix5-5.34.0-beta-2.json rename to vendordeps/Phoenix5-frc2025-latest.json index e27638b..c1098dc 100644 --- a/vendordeps/Phoenix5-5.34.0-beta-2.json +++ b/vendordeps/Phoenix5-frc2025-latest.json @@ -1,43 +1,56 @@ { - "fileName": "Phoenix5-5.34.0-beta-2.json", + "fileName": "Phoenix5-frc2025-latest.json", "name": "CTRE-Phoenix (v5)", - "version": "5.34.0-beta-2", + "version": "5.35.1", "frcYear": "2025", "uuid": "ab676553-b602-441f-a38d-f1296eff6537", "mavenUrls": [ "https://maven.ctr-electronics.com/release/" ], - "jsonUrl": "https://maven.ctr-electronics.com/release/com/ctre/phoenix/Phoenix5-frc2025-beta-latest.json", + "jsonUrl": "https://maven.ctr-electronics.com/release/com/ctre/phoenix/Phoenix5-frc2025-latest.json", "requires": [ { "uuid": "e995de00-2c64-4df5-8831-c1441420ff19", "errorMessage": "Phoenix 5 requires low-level libraries from Phoenix 6. Please add the Phoenix 6 vendordep before adding Phoenix 5.", - "offlineFileName": "Phoenix6.json", - "onlineUrl": "https://maven.ctr-electronics.com/release/com/ctre/phoenix6/latest/Phoenix6-frc2024-latest.json" + "offlineFileName": "Phoenix6-frc2025-latest.json", + "onlineUrl": "https://maven.ctr-electronics.com/release/com/ctre/phoenix6/latest/Phoenix6-frc2025-latest.json" + } + ], + "conflictsWith": [ + { + "uuid": "e7900d8d-826f-4dca-a1ff-182f658e98af", + "errorMessage": "Users must use the Phoenix 5 replay vendordep when using the Phoenix 6 replay vendordep.", + "offlineFileName": "Phoenix6-replay-frc2025-latest.json" + }, + { + "uuid": "fbc886a4-2cec-40c0-9835-71086a8cc3df", + "errorMessage": "Users cannot have both the replay and regular Phoenix 5 vendordeps in their robot program.", + "offlineFileName": "Phoenix5-replay-frc2025-latest.json" } ], "javaDependencies": [ { "groupId": "com.ctre.phoenix", "artifactId": "api-java", - "version": "5.34.0-beta-2" + "version": "5.35.1" }, { "groupId": "com.ctre.phoenix", "artifactId": "wpiapi-java", - "version": "5.34.0-beta-2" + "version": "5.35.1" } ], "jniDependencies": [ { "groupId": "com.ctre.phoenix", "artifactId": "cci", - "version": "5.34.0-beta-2", + "version": "5.35.1", "isJar": false, "skipInvalidPlatforms": true, "validPlatforms": [ "windowsx86-64", "linuxx86-64", + "linuxarm64", "linuxathena" ], "simMode": "hwsim" @@ -45,12 +58,13 @@ { "groupId": "com.ctre.phoenix.sim", "artifactId": "cci-sim", - "version": "5.34.0-beta-2", + "version": "5.35.1", "isJar": false, "skipInvalidPlatforms": true, "validPlatforms": [ "windowsx86-64", "linuxx86-64", + "linuxarm64", "osxuniversal" ], "simMode": "swsim" @@ -60,7 +74,7 @@ { "groupId": "com.ctre.phoenix", "artifactId": "wpiapi-cpp", - "version": "5.34.0-beta-2", + "version": "5.35.1", "libName": "CTRE_Phoenix_WPI", "headerClassifier": "headers", "sharedLibrary": true, @@ -68,6 +82,7 @@ "binaryPlatforms": [ "windowsx86-64", "linuxx86-64", + "linuxarm64", "linuxathena" ], "simMode": "hwsim" @@ -75,7 +90,7 @@ { "groupId": "com.ctre.phoenix", "artifactId": "api-cpp", - "version": "5.34.0-beta-2", + "version": "5.35.1", "libName": "CTRE_Phoenix", "headerClassifier": "headers", "sharedLibrary": true, @@ -83,6 +98,7 @@ "binaryPlatforms": [ "windowsx86-64", "linuxx86-64", + "linuxarm64", "linuxathena" ], "simMode": "hwsim" @@ -90,7 +106,7 @@ { "groupId": "com.ctre.phoenix", "artifactId": "cci", - "version": "5.34.0-beta-2", + "version": "5.35.1", "libName": "CTRE_PhoenixCCI", "headerClassifier": "headers", "sharedLibrary": true, @@ -98,6 +114,7 @@ "binaryPlatforms": [ "windowsx86-64", "linuxx86-64", + "linuxarm64", "linuxathena" ], "simMode": "hwsim" @@ -105,7 +122,7 @@ { "groupId": "com.ctre.phoenix.sim", "artifactId": "wpiapi-cpp-sim", - "version": "5.34.0-beta-2", + "version": "5.35.1", "libName": "CTRE_Phoenix_WPISim", "headerClassifier": "headers", "sharedLibrary": true, @@ -113,6 +130,7 @@ "binaryPlatforms": [ "windowsx86-64", "linuxx86-64", + "linuxarm64", "osxuniversal" ], "simMode": "swsim" @@ -120,7 +138,7 @@ { "groupId": "com.ctre.phoenix.sim", "artifactId": "api-cpp-sim", - "version": "5.34.0-beta-2", + "version": "5.35.1", "libName": "CTRE_PhoenixSim", "headerClassifier": "headers", "sharedLibrary": true, @@ -128,6 +146,7 @@ "binaryPlatforms": [ "windowsx86-64", "linuxx86-64", + "linuxarm64", "osxuniversal" ], "simMode": "swsim" @@ -135,7 +154,7 @@ { "groupId": "com.ctre.phoenix.sim", "artifactId": "cci-sim", - "version": "5.34.0-beta-2", + "version": "5.35.1", "libName": "CTRE_PhoenixCCISim", "headerClassifier": "headers", "sharedLibrary": true, @@ -143,6 +162,7 @@ "binaryPlatforms": [ "windowsx86-64", "linuxx86-64", + "linuxarm64", "osxuniversal" ], "simMode": "swsim" diff --git a/vendordeps/Phoenix6-25.0.0-beta-2.json b/vendordeps/Phoenix6-frc2025-latest.json similarity index 79% rename from vendordeps/Phoenix6-25.0.0-beta-2.json rename to vendordeps/Phoenix6-frc2025-latest.json index c56e61a..7f4bd2e 100644 --- a/vendordeps/Phoenix6-25.0.0-beta-2.json +++ b/vendordeps/Phoenix6-frc2025-latest.json @@ -1,42 +1,38 @@ { - "fileName": "Phoenix6-25.0.0-beta-2.json", + "fileName": "Phoenix6-frc2025-latest.json", "name": "CTRE-Phoenix (v6)", - "version": "25.0.0-beta-2", + "version": "25.1.0", "frcYear": "2025", "uuid": "e995de00-2c64-4df5-8831-c1441420ff19", "mavenUrls": [ "https://maven.ctr-electronics.com/release/" ], - "jsonUrl": "https://maven.ctr-electronics.com/release/com/ctre/phoenix6/latest/Phoenix6-frc2025-beta-latest.json", + "jsonUrl": "https://maven.ctr-electronics.com/release/com/ctre/phoenix6/latest/Phoenix6-frc2025-latest.json", "conflictsWith": [ - { - "uuid": "3fcf3402-e646-4fa6-971e-18afe8173b1a", - "errorMessage": "The combined Phoenix-6-And-5 vendordep is no longer supported. Please remove the vendordep and instead add both the latest Phoenix 6 vendordep and Phoenix 5 vendordep.", - "offlineFileName": "Phoenix6And5.json" - }, { "uuid": "e7900d8d-826f-4dca-a1ff-182f658e98af", "errorMessage": "Users can not have both the replay and regular Phoenix 6 vendordeps in their robot program.", - "offlineFileName": "Phoenix6-replay-frc2025-beta-latest.json" + "offlineFileName": "Phoenix6-replay-frc2025-latest.json" } ], "javaDependencies": [ { "groupId": "com.ctre.phoenix6", "artifactId": "wpiapi-java", - "version": "25.0.0-beta-2" + "version": "25.1.0" } ], "jniDependencies": [ { "groupId": "com.ctre.phoenix6", "artifactId": "api-cpp", - "version": "25.0.0-beta-2", + "version": "25.1.0", "isJar": false, "skipInvalidPlatforms": true, "validPlatforms": [ "windowsx86-64", "linuxx86-64", + "linuxarm64", "linuxathena" ], "simMode": "hwsim" @@ -44,12 +40,13 @@ { "groupId": "com.ctre.phoenix6", "artifactId": "tools", - "version": "25.0.0-beta-2", + "version": "25.1.0", "isJar": false, "skipInvalidPlatforms": true, "validPlatforms": [ "windowsx86-64", "linuxx86-64", + "linuxarm64", "linuxathena" ], "simMode": "hwsim" @@ -57,12 +54,13 @@ { "groupId": "com.ctre.phoenix6.sim", "artifactId": "api-cpp-sim", - "version": "25.0.0-beta-2", + "version": "25.1.0", "isJar": false, "skipInvalidPlatforms": true, "validPlatforms": [ "windowsx86-64", "linuxx86-64", + "linuxarm64", "osxuniversal" ], "simMode": "swsim" @@ -70,12 +68,13 @@ { "groupId": "com.ctre.phoenix6.sim", "artifactId": "tools-sim", - "version": "25.0.0-beta-2", + "version": "25.1.0", "isJar": false, "skipInvalidPlatforms": true, "validPlatforms": [ "windowsx86-64", "linuxx86-64", + "linuxarm64", "osxuniversal" ], "simMode": "swsim" @@ -83,12 +82,13 @@ { "groupId": "com.ctre.phoenix6.sim", "artifactId": "simTalonSRX", - "version": "25.0.0-beta-2", + "version": "25.1.0", "isJar": false, "skipInvalidPlatforms": true, "validPlatforms": [ "windowsx86-64", "linuxx86-64", + "linuxarm64", "osxuniversal" ], "simMode": "swsim" @@ -96,12 +96,13 @@ { "groupId": "com.ctre.phoenix6.sim", "artifactId": "simVictorSPX", - "version": "25.0.0-beta-2", + "version": "25.1.0", "isJar": false, "skipInvalidPlatforms": true, "validPlatforms": [ "windowsx86-64", "linuxx86-64", + "linuxarm64", "osxuniversal" ], "simMode": "swsim" @@ -109,12 +110,13 @@ { "groupId": "com.ctre.phoenix6.sim", "artifactId": "simPigeonIMU", - "version": "25.0.0-beta-2", + "version": "25.1.0", "isJar": false, "skipInvalidPlatforms": true, "validPlatforms": [ "windowsx86-64", "linuxx86-64", + "linuxarm64", "osxuniversal" ], "simMode": "swsim" @@ -122,12 +124,13 @@ { "groupId": "com.ctre.phoenix6.sim", "artifactId": "simCANCoder", - "version": "25.0.0-beta-2", + "version": "25.1.0", "isJar": false, "skipInvalidPlatforms": true, "validPlatforms": [ "windowsx86-64", "linuxx86-64", + "linuxarm64", "osxuniversal" ], "simMode": "swsim" @@ -135,12 +138,13 @@ { "groupId": "com.ctre.phoenix6.sim", "artifactId": "simProTalonFX", - "version": "25.0.0-beta-2", + "version": "25.1.0", "isJar": false, "skipInvalidPlatforms": true, "validPlatforms": [ "windowsx86-64", "linuxx86-64", + "linuxarm64", "osxuniversal" ], "simMode": "swsim" @@ -148,12 +152,13 @@ { "groupId": "com.ctre.phoenix6.sim", "artifactId": "simProCANcoder", - "version": "25.0.0-beta-2", + "version": "25.1.0", "isJar": false, "skipInvalidPlatforms": true, "validPlatforms": [ "windowsx86-64", "linuxx86-64", + "linuxarm64", "osxuniversal" ], "simMode": "swsim" @@ -161,12 +166,27 @@ { "groupId": "com.ctre.phoenix6.sim", "artifactId": "simProPigeon2", - "version": "25.0.0-beta-2", + "version": "25.1.0", + "isJar": false, + "skipInvalidPlatforms": true, + "validPlatforms": [ + "windowsx86-64", + "linuxx86-64", + "linuxarm64", + "osxuniversal" + ], + "simMode": "swsim" + }, + { + "groupId": "com.ctre.phoenix6.sim", + "artifactId": "simProCANrange", + "version": "25.1.0", "isJar": false, "skipInvalidPlatforms": true, "validPlatforms": [ "windowsx86-64", "linuxx86-64", + "linuxarm64", "osxuniversal" ], "simMode": "swsim" @@ -176,7 +196,7 @@ { "groupId": "com.ctre.phoenix6", "artifactId": "wpiapi-cpp", - "version": "25.0.0-beta-2", + "version": "25.1.0", "libName": "CTRE_Phoenix6_WPI", "headerClassifier": "headers", "sharedLibrary": true, @@ -184,6 +204,7 @@ "binaryPlatforms": [ "windowsx86-64", "linuxx86-64", + "linuxarm64", "linuxathena" ], "simMode": "hwsim" @@ -191,7 +212,7 @@ { "groupId": "com.ctre.phoenix6", "artifactId": "tools", - "version": "25.0.0-beta-2", + "version": "25.1.0", "libName": "CTRE_PhoenixTools", "headerClassifier": "headers", "sharedLibrary": true, @@ -199,6 +220,7 @@ "binaryPlatforms": [ "windowsx86-64", "linuxx86-64", + "linuxarm64", "linuxathena" ], "simMode": "hwsim" @@ -206,7 +228,7 @@ { "groupId": "com.ctre.phoenix6.sim", "artifactId": "wpiapi-cpp-sim", - "version": "25.0.0-beta-2", + "version": "25.1.0", "libName": "CTRE_Phoenix6_WPISim", "headerClassifier": "headers", "sharedLibrary": true, @@ -214,6 +236,7 @@ "binaryPlatforms": [ "windowsx86-64", "linuxx86-64", + "linuxarm64", "osxuniversal" ], "simMode": "swsim" @@ -221,7 +244,7 @@ { "groupId": "com.ctre.phoenix6.sim", "artifactId": "tools-sim", - "version": "25.0.0-beta-2", + "version": "25.1.0", "libName": "CTRE_PhoenixTools_Sim", "headerClassifier": "headers", "sharedLibrary": true, @@ -229,6 +252,7 @@ "binaryPlatforms": [ "windowsx86-64", "linuxx86-64", + "linuxarm64", "osxuniversal" ], "simMode": "swsim" @@ -236,7 +260,7 @@ { "groupId": "com.ctre.phoenix6.sim", "artifactId": "simTalonSRX", - "version": "25.0.0-beta-2", + "version": "25.1.0", "libName": "CTRE_SimTalonSRX", "headerClassifier": "headers", "sharedLibrary": true, @@ -244,6 +268,7 @@ "binaryPlatforms": [ "windowsx86-64", "linuxx86-64", + "linuxarm64", "osxuniversal" ], "simMode": "swsim" @@ -251,7 +276,7 @@ { "groupId": "com.ctre.phoenix6.sim", "artifactId": "simVictorSPX", - "version": "25.0.0-beta-2", + "version": "25.1.0", "libName": "CTRE_SimVictorSPX", "headerClassifier": "headers", "sharedLibrary": true, @@ -259,6 +284,7 @@ "binaryPlatforms": [ "windowsx86-64", "linuxx86-64", + "linuxarm64", "osxuniversal" ], "simMode": "swsim" @@ -266,7 +292,7 @@ { "groupId": "com.ctre.phoenix6.sim", "artifactId": "simPigeonIMU", - "version": "25.0.0-beta-2", + "version": "25.1.0", "libName": "CTRE_SimPigeonIMU", "headerClassifier": "headers", "sharedLibrary": true, @@ -274,6 +300,7 @@ "binaryPlatforms": [ "windowsx86-64", "linuxx86-64", + "linuxarm64", "osxuniversal" ], "simMode": "swsim" @@ -281,7 +308,7 @@ { "groupId": "com.ctre.phoenix6.sim", "artifactId": "simCANCoder", - "version": "25.0.0-beta-2", + "version": "25.1.0", "libName": "CTRE_SimCANCoder", "headerClassifier": "headers", "sharedLibrary": true, @@ -289,6 +316,7 @@ "binaryPlatforms": [ "windowsx86-64", "linuxx86-64", + "linuxarm64", "osxuniversal" ], "simMode": "swsim" @@ -296,7 +324,7 @@ { "groupId": "com.ctre.phoenix6.sim", "artifactId": "simProTalonFX", - "version": "25.0.0-beta-2", + "version": "25.1.0", "libName": "CTRE_SimProTalonFX", "headerClassifier": "headers", "sharedLibrary": true, @@ -304,6 +332,7 @@ "binaryPlatforms": [ "windowsx86-64", "linuxx86-64", + "linuxarm64", "osxuniversal" ], "simMode": "swsim" @@ -311,7 +340,7 @@ { "groupId": "com.ctre.phoenix6.sim", "artifactId": "simProCANcoder", - "version": "25.0.0-beta-2", + "version": "25.1.0", "libName": "CTRE_SimProCANcoder", "headerClassifier": "headers", "sharedLibrary": true, @@ -319,6 +348,7 @@ "binaryPlatforms": [ "windowsx86-64", "linuxx86-64", + "linuxarm64", "osxuniversal" ], "simMode": "swsim" @@ -326,7 +356,7 @@ { "groupId": "com.ctre.phoenix6.sim", "artifactId": "simProPigeon2", - "version": "25.0.0-beta-2", + "version": "25.1.0", "libName": "CTRE_SimProPigeon2", "headerClassifier": "headers", "sharedLibrary": true, @@ -334,6 +364,23 @@ "binaryPlatforms": [ "windowsx86-64", "linuxx86-64", + "linuxarm64", + "osxuniversal" + ], + "simMode": "swsim" + }, + { + "groupId": "com.ctre.phoenix6.sim", + "artifactId": "simProCANrange", + "version": "25.1.0", + "libName": "CTRE_SimProCANrange", + "headerClassifier": "headers", + "sharedLibrary": true, + "skipInvalidPlatforms": true, + "binaryPlatforms": [ + "windowsx86-64", + "linuxx86-64", + "linuxarm64", "osxuniversal" ], "simMode": "swsim" diff --git a/vendordeps/WPILibNewCommands.json b/vendordeps/WPILibNewCommands.json index 3718e0a..94fdc1a 100644 --- a/vendordeps/WPILibNewCommands.json +++ b/vendordeps/WPILibNewCommands.json @@ -1,38 +1,38 @@ { - "fileName": "WPILibNewCommands.json", - "name": "WPILib-New-Commands", - "version": "1.0.0", - "uuid": "111e20f7-815e-48f8-9dd6-e675ce75b266", - "frcYear": "2025", - "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", - "linuxarm32", - "linuxarm64", - "windowsx86-64", - "windowsx86", - "linuxx86-64", - "osxuniversal" - ] - } - ] -} + "fileName": "WPILibNewCommands.json", + "name": "WPILib-New-Commands", + "version": "1.0.0", + "uuid": "111e20f7-815e-48f8-9dd6-e675ce75b266", + "frcYear": "2025", + "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", + "linuxarm32", + "linuxarm64", + "windowsx86-64", + "windowsx86", + "linuxx86-64", + "osxuniversal" + ] + } + ] +} \ No newline at end of file From b128d4ae6f31aa67e5e0875441d025d221d5bea2 Mon Sep 17 00:00:00 2001 From: Jay McNeely Date: Fri, 10 Jan 2025 16:44:34 -0600 Subject: [PATCH 26/39] Removed other beta library --- vendordeps/REVLib-2025.0.0-beta-2.json | 74 -------------------------- 1 file changed, 74 deletions(-) delete mode 100644 vendordeps/REVLib-2025.0.0-beta-2.json diff --git a/vendordeps/REVLib-2025.0.0-beta-2.json b/vendordeps/REVLib-2025.0.0-beta-2.json deleted file mode 100644 index 85f6151..0000000 --- a/vendordeps/REVLib-2025.0.0-beta-2.json +++ /dev/null @@ -1,74 +0,0 @@ -{ - "fileName": "REVLib-2025.0.0-beta-2.json", - "name": "REVLib", - "version": "2025.0.0-beta-2", - "frcYear": "2025", - "uuid": "3f48eb8c-50fe-43a6-9cb7-44c86353c4cb", - "mavenUrls": [ - "https://maven.revrobotics.com/" - ], - "jsonUrl": "https://software-metadata.revrobotics.com/REVLib-2025.json", - "javaDependencies": [ - { - "groupId": "com.revrobotics.frc", - "artifactId": "REVLib-java", - "version": "2025.0.0-beta-2" - } - ], - "jniDependencies": [ - { - "groupId": "com.revrobotics.frc", - "artifactId": "REVLib-driver", - "version": "2025.0.0-beta-2", - "skipInvalidPlatforms": true, - "isJar": false, - "validPlatforms": [ - "windowsx86-64", - "windowsx86", - "linuxarm64", - "linuxx86-64", - "linuxathena", - "linuxarm32", - "osxuniversal" - ] - } - ], - "cppDependencies": [ - { - "groupId": "com.revrobotics.frc", - "artifactId": "REVLib-cpp", - "version": "2025.0.0-beta-2", - "libName": "REVLib", - "headerClassifier": "headers", - "sharedLibrary": false, - "skipInvalidPlatforms": true, - "binaryPlatforms": [ - "windowsx86-64", - "windowsx86", - "linuxarm64", - "linuxx86-64", - "linuxathena", - "linuxarm32", - "osxuniversal" - ] - }, - { - "groupId": "com.revrobotics.frc", - "artifactId": "REVLib-driver", - "version": "2025.0.0-beta-2", - "libName": "REVLibDriver", - "headerClassifier": "headers", - "sharedLibrary": false, - "skipInvalidPlatforms": true, - "binaryPlatforms": [ - "windowsx86-64", - "windowsx86", - "linuxarm64", - "linuxx86-64", - "linuxathena", - "linuxarm32", - "osxuniversal" - ] - } - ] -} \ No newline at end of file From ad70c18a2849f5817ca91a897d0a967bbedfe67d Mon Sep 17 00:00:00 2001 From: Jay McNeely Date: Fri, 10 Jan 2025 18:55:53 -0600 Subject: [PATCH 27/39] Updated codebase for Command-Based coding. Expect lint fails. --- .wpilib/wpilib_preferences.json | 2 +- LICENSE | 674 ------------------ src/main/java/frc/CommonData.java | 185 ----- src/main/java/frc/components/PDH.java | 138 ---- src/main/java/frc/components/RoboRIO.java | 69 -- .../java/frc/components/package-info.java | 4 - src/main/java/frc/package-info.java | 7 - src/main/java/frc/robot/Constants.java | 19 + src/main/java/frc/robot/Main.java | 29 +- src/main/java/frc/robot/Robot.java | 162 +++-- src/main/java/frc/robot/RobotContainer.java | 63 ++ src/main/java/frc/robot/commands/Autos.java | 20 + .../frc/robot/commands/ExampleCommand.java | 43 ++ src/main/java/frc/robot/package-info.java | 4 - .../robot/subsystems/ExampleSubsystem.java | 47 ++ .../java/frc/subsystems/package-info.java | 4 - .../frc/subsystems/sensors/package-info.java | 8 - vendordeps/WPILibNewCommands.json | 74 +- 18 files changed, 325 insertions(+), 1227 deletions(-) delete mode 100644 LICENSE delete mode 100644 src/main/java/frc/CommonData.java delete mode 100644 src/main/java/frc/components/PDH.java delete mode 100644 src/main/java/frc/components/RoboRIO.java delete mode 100644 src/main/java/frc/components/package-info.java delete mode 100644 src/main/java/frc/package-info.java create mode 100644 src/main/java/frc/robot/Constants.java create mode 100644 src/main/java/frc/robot/RobotContainer.java create mode 100644 src/main/java/frc/robot/commands/Autos.java create mode 100644 src/main/java/frc/robot/commands/ExampleCommand.java delete mode 100644 src/main/java/frc/robot/package-info.java create mode 100644 src/main/java/frc/robot/subsystems/ExampleSubsystem.java delete mode 100644 src/main/java/frc/subsystems/package-info.java delete mode 100644 src/main/java/frc/subsystems/sensors/package-info.java diff --git a/.wpilib/wpilib_preferences.json b/.wpilib/wpilib_preferences.json index f28fe25..475f197 100644 --- a/.wpilib/wpilib_preferences.json +++ b/.wpilib/wpilib_preferences.json @@ -1,6 +1,6 @@ { "enableCppIntellisense": false, "currentLanguage": "java", - "projectYear": "2025beta", + "projectYear": "2025", "teamNumber": 5098 } \ No newline at end of file diff --git a/LICENSE b/LICENSE deleted file mode 100644 index f288702..0000000 --- a/LICENSE +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/src/main/java/frc/CommonData.java b/src/main/java/frc/CommonData.java deleted file mode 100644 index 2b65df2..0000000 --- a/src/main/java/frc/CommonData.java +++ /dev/null @@ -1,185 +0,0 @@ -package frc; - -/** - * CommonData Class - *

- * This class is used to store common data that is used throughout the code. - *

- */ -public final class CommonData { - - /** - * Private constructor to prevent instantiation. - */ - private CommonData() { - throw new UnsupportedOperationException( - "This is a utility class and cannot be instantiated"); - } - - // NavX Data // - - /** - * NavX Yaw. - */ - private static double navXYaw; - - /** - * NavX Pitch. - */ - private static double navXPitch; - - /** - * NavX Roll. - */ - private static double navXRoll; - - /** - * NavX Acceleration X. - */ - private static double navXAccelX; - - /** - * NavX Acceleration Y. - */ - private static double navXAccelY; - - /** - * NavX Acceleration Z. - */ - private static double navXAccelZ; - - /** - * NavX Temperature. - */ - private static double navXTemp; - - // Getters // - - /** - * Get the NavX Yaw. - * - * @return The NavX Yaw - */ - public static double getNavXYaw() { - return navXYaw; - } - - /** - * Get the NavX Pitch. - * - * @return The NavX Pitch - */ - public static double getNavXPitch() { - return navXPitch; - } - - /** - * Get the NavX Roll. - * - * @return The NavX Roll - */ - public static double getNavXRoll() { - return navXRoll; - } - - /** - * Get the NavX Acceleration X. - * - * @return The NavX Acceleration X - */ - public static double getNavXAccelX() { - return navXAccelX; - } - - /** - * Get the NavX Acceleration Y. - * - * @return The NavX Acceleration Y - */ - public static double getNavXAccelY() { - return navXAccelY; - } - - /** - * Get the NavX Acceleration Z. - * - * @return The NavX Acceleration Z - */ - public static double getNavXAccelZ() { - return navXAccelZ; - } - - /** - * Get the NavX Temperature. - * - * @return The NavX Temperature - */ - public static double getNavXTemp() { - return navXTemp; - } - - // Setters // - - /** - * Set the NavX Yaw. - * - * @param yaw The Yaw to set - */ - public static void setNavXYaw(final double yaw) { - navXYaw = yaw; - } - - /** - * Set the NavX Pitch. - * - * @param pitch The Pitch to set - */ - public static void setNavXPitch(final double pitch) { - navXPitch = pitch; - } - - /** - * Set the NavX Roll. - * - * @param roll The Roll to set - */ - public static void setNavXRoll(final double roll) { - navXRoll = roll; - } - - /** - * Set the NavX Acceleration X. - * - * @param accelX The Acceleration X to set - */ - public static void setNavXAccelX(final double accelX) { - navXAccelX = accelX; - } - - /** - * Set the NavX Acceleration Y. - * - * @param accelY The Acceleration Y to set - */ - public static void setNavXAccelY(final double accelY) { - navXAccelY = accelY; - } - - /** - * Set the NavX Acceleration Z. - * - * @param accelZ The Acceleration Z to set - */ - public static void setNavXAccelZ(final double accelZ) { - navXAccelZ = accelZ; - } - - /** - * Set the NavX Temperature. - * - * @param temp The Temperature to set - */ - public static void setNavXTemp(final double temp) { - navXTemp = temp; - } -} diff --git a/src/main/java/frc/components/PDH.java b/src/main/java/frc/components/PDH.java deleted file mode 100644 index 46b063b..0000000 --- a/src/main/java/frc/components/PDH.java +++ /dev/null @@ -1,138 +0,0 @@ -package frc.components; - -import edu.wpi.first.wpilibj.PowerDistribution; -import edu.wpi.first.hal.PowerDistributionFaults; -import edu.wpi.first.hal.PowerDistributionStickyFaults; -import edu.wpi.first.hal.PowerDistributionVersion; - -/** - * Power Distribution Hub Class - * - *

- * This class holds methods used for the Power Distribution Hub. - *

- */ -public class PDH { - - /** - * Number of channels on the Power Distribution Hub. - */ - private int numChannels; - - /** - * Power Distribution Hub Object. - */ - private PowerDistribution pdh; - - /** - * PDH Constructor. - * - * @param id The ID of the Power Distribution Hub - */ - public PDH(final int id) { - pdh = new PowerDistribution(id, PowerDistribution.ModuleType.kRev); - numChannels = pdh.getNumChannels(); - } - - // Power // - - /** - * Get the overall voltage of the Power Distribution Hub. - * - * @return The voltage of the Power Distribution Hub - */ - public double getTotalVoltage() { - return pdh.getVoltage(); - } - - /** - * Get the current of a specific channel on the Power Distribution Hub. - * - * @param channel The channel to get the current of - * @return The current of the channel - */ - public double getChannelCurrent(final int channel) { - return pdh.getCurrent(channel); - } - - /** - * Get all channel currents of the Power Distribution Hub and return them - * in an array. - * - * @return An array of all channel currents - */ - public double[] getChannelCurrents() { - double[] currents = new double[numChannels]; - for (int i = 0; i < numChannels; i++) { - currents[i] = pdh.getCurrent(i); - } - return currents; - } - - /** - * Get the total current of the Power Distribution Hub. - * - * @return Total current of the Power Distribution Hub - */ - public double getTotalCurrent() { - return pdh.getTotalCurrent(); - } - - /** - * Get the total power of the Power Distribution Hub. - * - * @return Total power of the Power Distribution Hub - */ - public double getTotalPower() { - return pdh.getTotalPower(); - } - - /** - * Get the total energy of the Power Distribution Hub. - * - * @return Total energy of the Power Distribution Hub - */ - public double getTotalEnergy() { - return pdh.getTotalEnergy(); - } - - // Faults // - - /** - * Get any faults on the Power Distribution Hub. - * - * @return Faults on the Power Distribution Hub - */ - public PowerDistributionFaults getFaults() { - return pdh.getFaults(); - } - - /** - * Get any sticky faults on the Power Distribution Hub. - * - * @return Sticky faults on the Power Distribution Hub - */ - public PowerDistributionStickyFaults getStickyFaults() { - return pdh.getStickyFaults(); - } - - /** - * Clear all sticky faults on the Power Distribution Hub. - */ - public void clearStickyFaults() { - pdh.clearStickyFaults(); - } - - // Miscellaneous // - - /** - * Get the firmware version of the Power Distribution Hub. - * - * @return Firmware version of the Power Distribution Hub - */ - public PowerDistributionVersion getFirmwareVersion() { - return pdh.getVersion(); - } - - // Temperature is not available on the PDH :( -} diff --git a/src/main/java/frc/components/RoboRIO.java b/src/main/java/frc/components/RoboRIO.java deleted file mode 100644 index 00c7995..0000000 --- a/src/main/java/frc/components/RoboRIO.java +++ /dev/null @@ -1,69 +0,0 @@ -package frc.components; - -import edu.wpi.first.hal.simulation.RoboRioDataJNI; - -/** - * RoboRIO Class. - * - *

- * This class holds methods used for monitoring the RoboRIO. - *

- */ -public final class RoboRIO { - - /** - * Private constructor to prevent instantiation. - */ - private RoboRIO() { - throw new UnsupportedOperationException( - "This is a utility class and cannot be instantiated"); - } - - /** - * Get the CPU temperature of the RoboRIO. - * - * @return The CPU temperature of the RoboRIO - */ - public static double getCPUTemperature() { - return RoboRioDataJNI.getCPUTemp(); - } - - /** - * Get the voltage of the RoboRIO. - * - *

- * This is the voltage going into the RoboRIO - * This does *not* include any channels on the RoboRIO such as DIO, PWM, - * CAN, etc. - *

- * - * @return The voltage of the RoboRIO - */ - public static double getVoltage() { - return RoboRioDataJNI.getVInVoltage(); - } - - /** - * Get the current of the RoboRIO. - * - *

- * This is the current being drawn by the RoboRIO - * This does *not* include any channels on the RoboRIO such as DIO, PWM, - * CAN, etc. - *

- * - * @return The current of the RoboRIO - */ - public static double getCurrent() { - return RoboRioDataJNI.getVInCurrent(); - } - - /** - * Get the serial number of the RoboRIO. - * - * @return The serial number of the RoboRIO - */ - public static String getSerialNumber() { - return RoboRioDataJNI.getSerialNumber(); - } -} diff --git a/src/main/java/frc/components/package-info.java b/src/main/java/frc/components/package-info.java deleted file mode 100644 index 123537e..0000000 --- a/src/main/java/frc/components/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * Contains all the components of the robot. - */ -package frc.components; diff --git a/src/main/java/frc/package-info.java b/src/main/java/frc/package-info.java deleted file mode 100644 index 36e2dec..0000000 --- a/src/main/java/frc/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Main package for robot code. - *

- * All code that is deployed to the robot would be located under this package. - *

- */ -package frc; diff --git a/src/main/java/frc/robot/Constants.java b/src/main/java/frc/robot/Constants.java new file mode 100644 index 0000000..c50ba05 --- /dev/null +++ b/src/main/java/frc/robot/Constants.java @@ -0,0 +1,19 @@ +// 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 class OperatorConstants { + public static final int kDriverControllerPort = 0; + } +} diff --git a/src/main/java/frc/robot/Main.java b/src/main/java/frc/robot/Main.java index 59d639c..8776e5d 100644 --- a/src/main/java/frc/robot/Main.java +++ b/src/main/java/frc/robot/Main.java @@ -7,26 +7,19 @@ 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. + * 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() {} - /** - * Private constructor to prevent instantiation of this class. - */ - private Main() { - } - - /** - * Main initialization function. Do not perform any initialization here. - * - *

If you change your main robot class, change the parameter type. - * - * @param args Arguments passed to the main function. - */ - public static void main(final String... args) { + /** + * 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/src/main/java/frc/robot/Robot.java b/src/main/java/frc/robot/Robot.java index c2ca63c..47d3d5a 100644 --- a/src/main/java/frc/robot/Robot.java +++ b/src/main/java/frc/robot/Robot.java @@ -4,92 +4,98 @@ package frc.robot; -import edu.wpi.first.wpilibj.TimesliceRobot; -import edu.wpi.first.wpilibj.livewindow.LiveWindow; +import edu.wpi.first.wpilibj.TimedRobot; +import edu.wpi.first.wpilibj2.command.Command; +import edu.wpi.first.wpilibj2.command.CommandScheduler; /** - * The methods in this class are called automatically corresponding to each - * mode, as described in the TimesliceRobot documentation. If you change the - * name of this class or the package after creating this project, you must also - * update the Main.java file in the project. + * The methods in this class are called automatically 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 Main.java file in the project. */ -public class Robot extends TimesliceRobot { - - /** - * The period of the robot loop. - */ - private static final double ROBOTPERIOD = 0.005; - - /** - * The period of the controller loop. - */ - private static final double CONTROLLERPERIOD = 0.01; - - /** - * The period of the first controller loop. - */ - private static final double CONTROLLER1PERIOD = 0.002; - - /** - * The period of the second controller loop. - */ - private static final double CONTROLLER2PERIOD = 0.002; - - /** - * Robot constructor. - */ - public Robot() { - // Run robot periodic() functions for 5 ms, and run controllers every 10 ms - super(ROBOTPERIOD, CONTROLLERPERIOD); - - // LiveWindow causes drastic overruns in robot periodic functions that will - // interfere with controllers - LiveWindow.disableAllTelemetry(); - - // Runs for 2 ms after robot periodic functions - schedule(() -> { }, CONTROLLER1PERIOD); - - // Runs for 2 ms after first controller function - schedule(() -> { }, CONTROLLER2PERIOD); - - // Total usage: - // 5 ms (robot) + 2 ms (controller 1) + 2 ms (controller 2) = 9 ms - // 9 ms / 10 ms -> 90% allocated +public class Robot extends TimedRobot { + private Command m_autonomousCommand; + + private final RobotContainer m_robotContainer; + + /** + * This function is run when the robot is first started up and should be used for any + * initialization code. + */ + public Robot() { + // 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 20 ms, 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(); } - - @Override - public void robotPeriodic() { - } - - @Override - public void autonomousInit() { - } - - @Override - public void autonomousPeriodic() { - } - - @Override - public void teleopInit() { + } + + /** 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(); } + } - @Override - public void teleopPeriodic() { - } + /** This function is called periodically during operator control. */ + @Override + public void teleopPeriodic() {} - @Override - public void disabledInit() { - } + @Override + public void testInit() { + // Cancels all running commands at the start of test mode. + CommandScheduler.getInstance().cancelAll(); + } - @Override - public void disabledPeriodic() { - } + /** This function is called periodically during test mode. */ + @Override + public void testPeriodic() {} - @Override - public void testInit() { - } + /** This function is called once when the robot is first started up. */ + @Override + public void simulationInit() {} - @Override - public void testPeriodic() { - } + /** This function is called periodically whilst in simulation. */ + @Override + public void simulationPeriodic() {} } diff --git a/src/main/java/frc/robot/RobotContainer.java b/src/main/java/frc/robot/RobotContainer.java new file mode 100644 index 0000000..a33249e --- /dev/null +++ b/src/main/java/frc/robot/RobotContainer.java @@ -0,0 +1,63 @@ +// 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 frc.robot.Constants.OperatorConstants; +import frc.robot.commands.Autos; +import frc.robot.commands.ExampleCommand; +import frc.robot.subsystems.ExampleSubsystem; +import edu.wpi.first.wpilibj2.command.Command; +import edu.wpi.first.wpilibj2.command.button.CommandXboxController; +import edu.wpi.first.wpilibj2.command.button.Trigger; + +/** + * 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 trigger mappings) should be declared here. + */ +public class RobotContainer { + // The robot's subsystems and commands are defined here... + private final ExampleSubsystem m_exampleSubsystem = new ExampleSubsystem(); + + // Replace with CommandPS4Controller or CommandJoystick if needed + private final CommandXboxController m_driverController = + new CommandXboxController(OperatorConstants.kDriverControllerPort); + + /** The container for the robot. Contains subsystems, OI devices, and commands. */ + public RobotContainer() { + // Configure the trigger bindings + configureBindings(); + } + + /** + * Use this method to define your trigger->command mappings. Triggers can be created via the + * {@link Trigger#Trigger(java.util.function.BooleanSupplier)} constructor with an arbitrary + * predicate, or via the named factories in {@link + * edu.wpi.first.wpilibj2.command.button.CommandGenericHID}'s subclasses for {@link + * CommandXboxController Xbox}/{@link edu.wpi.first.wpilibj2.command.button.CommandPS4Controller + * PS4} controllers or {@link edu.wpi.first.wpilibj2.command.button.CommandJoystick Flight + * joysticks}. + */ + private void configureBindings() { + // Schedule `ExampleCommand` when `exampleCondition` changes to `true` + new Trigger(m_exampleSubsystem::exampleCondition) + .onTrue(new ExampleCommand(m_exampleSubsystem)); + + // Schedule `exampleMethodCommand` when the Xbox controller's B button is pressed, + // cancelling on release. + m_driverController.b().whileTrue(m_exampleSubsystem.exampleMethodCommand()); + } + + /** + * Use this to pass the autonomous command to the main {@link Robot} class. + * + * @return the command to run in autonomous + */ + public Command getAutonomousCommand() { + // An example command will be run in autonomous + return Autos.exampleAuto(m_exampleSubsystem); + } +} diff --git a/src/main/java/frc/robot/commands/Autos.java b/src/main/java/frc/robot/commands/Autos.java new file mode 100644 index 0000000..107aad7 --- /dev/null +++ b/src/main/java/frc/robot/commands/Autos.java @@ -0,0 +1,20 @@ +// 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.Command; +import edu.wpi.first.wpilibj2.command.Commands; + +public final class Autos { + /** Example static factory for an autonomous command. */ + public static Command exampleAuto(ExampleSubsystem subsystem) { + return Commands.sequence(subsystem.exampleMethodCommand(), new ExampleCommand(subsystem)); + } + + private Autos() { + throw new UnsupportedOperationException("This is a utility class!"); + } +} diff --git a/src/main/java/frc/robot/commands/ExampleCommand.java b/src/main/java/frc/robot/commands/ExampleCommand.java new file mode 100644 index 0000000..7481d3c --- /dev/null +++ b/src/main/java/frc/robot/commands/ExampleCommand.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.ExampleSubsystem; +import edu.wpi.first.wpilibj2.command.Command; + +/** An example command that uses an example subsystem. */ +public class ExampleCommand extends Command { + @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/src/main/java/frc/robot/package-info.java b/src/main/java/frc/robot/package-info.java deleted file mode 100644 index 0ac8d89..0000000 --- a/src/main/java/frc/robot/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * The main package for the robot code. - */ -package frc.robot; diff --git a/src/main/java/frc/robot/subsystems/ExampleSubsystem.java b/src/main/java/frc/robot/subsystems/ExampleSubsystem.java new file mode 100644 index 0000000..6b375da --- /dev/null +++ b/src/main/java/frc/robot/subsystems/ExampleSubsystem.java @@ -0,0 +1,47 @@ +// 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.Command; +import edu.wpi.first.wpilibj2.command.SubsystemBase; + +public class ExampleSubsystem extends SubsystemBase { + /** Creates a new ExampleSubsystem. */ + public ExampleSubsystem() {} + + /** + * Example command factory method. + * + * @return a command + */ + public Command exampleMethodCommand() { + // Inline construction of command goes here. + // Subsystem::RunOnce implicitly requires `this` subsystem. + return runOnce( + () -> { + /* one-time action goes here */ + }); + } + + /** + * An example method querying a boolean state of the subsystem (for example, a digital sensor). + * + * @return value of some boolean subsystem state, such as a digital sensor. + */ + public boolean exampleCondition() { + // Query some boolean state, such as a digital sensor. + return false; + } + + @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/src/main/java/frc/subsystems/package-info.java b/src/main/java/frc/subsystems/package-info.java deleted file mode 100644 index 7d27539..0000000 --- a/src/main/java/frc/subsystems/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * Contains all the subsystems for the robot. - */ -package frc.subsystems; diff --git a/src/main/java/frc/subsystems/sensors/package-info.java b/src/main/java/frc/subsystems/sensors/package-info.java deleted file mode 100644 index a94cc3c..0000000 --- a/src/main/java/frc/subsystems/sensors/package-info.java +++ /dev/null @@ -1,8 +0,0 @@ -/** - * Sensors subsystem package. - *

- * This package contains all sensor subsystems. - * This includes temperature, gyro, accelerometer, and other sensors. - *

- */ -package frc.subsystems.sensors; diff --git a/vendordeps/WPILibNewCommands.json b/vendordeps/WPILibNewCommands.json index 94fdc1a..3718e0a 100644 --- a/vendordeps/WPILibNewCommands.json +++ b/vendordeps/WPILibNewCommands.json @@ -1,38 +1,38 @@ { - "fileName": "WPILibNewCommands.json", - "name": "WPILib-New-Commands", - "version": "1.0.0", - "uuid": "111e20f7-815e-48f8-9dd6-e675ce75b266", - "frcYear": "2025", - "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", - "linuxarm32", - "linuxarm64", - "windowsx86-64", - "windowsx86", - "linuxx86-64", - "osxuniversal" - ] - } - ] -} \ No newline at end of file + "fileName": "WPILibNewCommands.json", + "name": "WPILib-New-Commands", + "version": "1.0.0", + "uuid": "111e20f7-815e-48f8-9dd6-e675ce75b266", + "frcYear": "2025", + "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", + "linuxarm32", + "linuxarm64", + "windowsx86-64", + "windowsx86", + "linuxx86-64", + "osxuniversal" + ] + } + ] +} From 207dbcdbf46043b70f84b2df694262941414d324 Mon Sep 17 00:00:00 2001 From: Jay McNeely Date: Fri, 10 Jan 2025 18:59:02 -0600 Subject: [PATCH 28/39] Added back vendordeps that were removed. --- vendordeps/PathplannerLib-2025.2.1.json | 38 +++ vendordeps/Phoenix5-5.35.1.json | 171 +++++++++++ vendordeps/Phoenix6-25.1.0.json | 389 ++++++++++++++++++++++++ vendordeps/REVLib-2025.0.0.json | 74 +++++ vendordeps/Studica-2025.0.0.json | 71 +++++ 5 files changed, 743 insertions(+) create mode 100644 vendordeps/PathplannerLib-2025.2.1.json create mode 100644 vendordeps/Phoenix5-5.35.1.json create mode 100644 vendordeps/Phoenix6-25.1.0.json create mode 100644 vendordeps/REVLib-2025.0.0.json create mode 100644 vendordeps/Studica-2025.0.0.json diff --git a/vendordeps/PathplannerLib-2025.2.1.json b/vendordeps/PathplannerLib-2025.2.1.json new file mode 100644 index 0000000..71e25f3 --- /dev/null +++ b/vendordeps/PathplannerLib-2025.2.1.json @@ -0,0 +1,38 @@ +{ + "fileName": "PathplannerLib-2025.2.1.json", + "name": "PathplannerLib", + "version": "2025.2.1", + "uuid": "1b42324f-17c6-4875-8e77-1c312bc8c786", + "frcYear": "2025", + "mavenUrls": [ + "https://3015rangerrobotics.github.io/pathplannerlib/repo" + ], + "jsonUrl": "https://3015rangerrobotics.github.io/pathplannerlib/PathplannerLib.json", + "javaDependencies": [ + { + "groupId": "com.pathplanner.lib", + "artifactId": "PathplannerLib-java", + "version": "2025.2.1" + } + ], + "jniDependencies": [], + "cppDependencies": [ + { + "groupId": "com.pathplanner.lib", + "artifactId": "PathplannerLib-cpp", + "version": "2025.2.1", + "libName": "PathplannerLib", + "headerClassifier": "headers", + "sharedLibrary": false, + "skipInvalidPlatforms": true, + "binaryPlatforms": [ + "windowsx86-64", + "linuxx86-64", + "osxuniversal", + "linuxathena", + "linuxarm32", + "linuxarm64" + ] + } + ] +} \ No newline at end of file diff --git a/vendordeps/Phoenix5-5.35.1.json b/vendordeps/Phoenix5-5.35.1.json new file mode 100644 index 0000000..69df8b5 --- /dev/null +++ b/vendordeps/Phoenix5-5.35.1.json @@ -0,0 +1,171 @@ +{ + "fileName": "Phoenix5-5.35.1.json", + "name": "CTRE-Phoenix (v5)", + "version": "5.35.1", + "frcYear": "2025", + "uuid": "ab676553-b602-441f-a38d-f1296eff6537", + "mavenUrls": [ + "https://maven.ctr-electronics.com/release/" + ], + "jsonUrl": "https://maven.ctr-electronics.com/release/com/ctre/phoenix/Phoenix5-frc2025-latest.json", + "requires": [ + { + "uuid": "e995de00-2c64-4df5-8831-c1441420ff19", + "errorMessage": "Phoenix 5 requires low-level libraries from Phoenix 6. Please add the Phoenix 6 vendordep before adding Phoenix 5.", + "offlineFileName": "Phoenix6-frc2025-latest.json", + "onlineUrl": "https://maven.ctr-electronics.com/release/com/ctre/phoenix6/latest/Phoenix6-frc2025-latest.json" + } + ], + "conflictsWith": [ + { + "uuid": "e7900d8d-826f-4dca-a1ff-182f658e98af", + "errorMessage": "Users must use the Phoenix 5 replay vendordep when using the Phoenix 6 replay vendordep.", + "offlineFileName": "Phoenix6-replay-frc2025-latest.json" + }, + { + "uuid": "fbc886a4-2cec-40c0-9835-71086a8cc3df", + "errorMessage": "Users cannot have both the replay and regular Phoenix 5 vendordeps in their robot program.", + "offlineFileName": "Phoenix5-replay-frc2025-latest.json" + } + ], + "javaDependencies": [ + { + "groupId": "com.ctre.phoenix", + "artifactId": "api-java", + "version": "5.35.1" + }, + { + "groupId": "com.ctre.phoenix", + "artifactId": "wpiapi-java", + "version": "5.35.1" + } + ], + "jniDependencies": [ + { + "groupId": "com.ctre.phoenix", + "artifactId": "cci", + "version": "5.35.1", + "isJar": false, + "skipInvalidPlatforms": true, + "validPlatforms": [ + "windowsx86-64", + "linuxx86-64", + "linuxarm64", + "linuxathena" + ], + "simMode": "hwsim" + }, + { + "groupId": "com.ctre.phoenix.sim", + "artifactId": "cci-sim", + "version": "5.35.1", + "isJar": false, + "skipInvalidPlatforms": true, + "validPlatforms": [ + "windowsx86-64", + "linuxx86-64", + "linuxarm64", + "osxuniversal" + ], + "simMode": "swsim" + } + ], + "cppDependencies": [ + { + "groupId": "com.ctre.phoenix", + "artifactId": "wpiapi-cpp", + "version": "5.35.1", + "libName": "CTRE_Phoenix_WPI", + "headerClassifier": "headers", + "sharedLibrary": true, + "skipInvalidPlatforms": true, + "binaryPlatforms": [ + "windowsx86-64", + "linuxx86-64", + "linuxarm64", + "linuxathena" + ], + "simMode": "hwsim" + }, + { + "groupId": "com.ctre.phoenix", + "artifactId": "api-cpp", + "version": "5.35.1", + "libName": "CTRE_Phoenix", + "headerClassifier": "headers", + "sharedLibrary": true, + "skipInvalidPlatforms": true, + "binaryPlatforms": [ + "windowsx86-64", + "linuxx86-64", + "linuxarm64", + "linuxathena" + ], + "simMode": "hwsim" + }, + { + "groupId": "com.ctre.phoenix", + "artifactId": "cci", + "version": "5.35.1", + "libName": "CTRE_PhoenixCCI", + "headerClassifier": "headers", + "sharedLibrary": true, + "skipInvalidPlatforms": true, + "binaryPlatforms": [ + "windowsx86-64", + "linuxx86-64", + "linuxarm64", + "linuxathena" + ], + "simMode": "hwsim" + }, + { + "groupId": "com.ctre.phoenix.sim", + "artifactId": "wpiapi-cpp-sim", + "version": "5.35.1", + "libName": "CTRE_Phoenix_WPISim", + "headerClassifier": "headers", + "sharedLibrary": true, + "skipInvalidPlatforms": true, + "binaryPlatforms": [ + "windowsx86-64", + "linuxx86-64", + "linuxarm64", + "osxuniversal" + ], + "simMode": "swsim" + }, + { + "groupId": "com.ctre.phoenix.sim", + "artifactId": "api-cpp-sim", + "version": "5.35.1", + "libName": "CTRE_PhoenixSim", + "headerClassifier": "headers", + "sharedLibrary": true, + "skipInvalidPlatforms": true, + "binaryPlatforms": [ + "windowsx86-64", + "linuxx86-64", + "linuxarm64", + "osxuniversal" + ], + "simMode": "swsim" + }, + { + "groupId": "com.ctre.phoenix.sim", + "artifactId": "cci-sim", + "version": "5.35.1", + "libName": "CTRE_PhoenixCCISim", + "headerClassifier": "headers", + "sharedLibrary": true, + "skipInvalidPlatforms": true, + "binaryPlatforms": [ + "windowsx86-64", + "linuxx86-64", + "linuxarm64", + "osxuniversal" + ], + "simMode": "swsim" + } + ] +} \ No newline at end of file diff --git a/vendordeps/Phoenix6-25.1.0.json b/vendordeps/Phoenix6-25.1.0.json new file mode 100644 index 0000000..473f6a8 --- /dev/null +++ b/vendordeps/Phoenix6-25.1.0.json @@ -0,0 +1,389 @@ +{ + "fileName": "Phoenix6-25.1.0.json", + "name": "CTRE-Phoenix (v6)", + "version": "25.1.0", + "frcYear": "2025", + "uuid": "e995de00-2c64-4df5-8831-c1441420ff19", + "mavenUrls": [ + "https://maven.ctr-electronics.com/release/" + ], + "jsonUrl": "https://maven.ctr-electronics.com/release/com/ctre/phoenix6/latest/Phoenix6-frc2025-latest.json", + "conflictsWith": [ + { + "uuid": "e7900d8d-826f-4dca-a1ff-182f658e98af", + "errorMessage": "Users can not have both the replay and regular Phoenix 6 vendordeps in their robot program.", + "offlineFileName": "Phoenix6-replay-frc2025-latest.json" + } + ], + "javaDependencies": [ + { + "groupId": "com.ctre.phoenix6", + "artifactId": "wpiapi-java", + "version": "25.1.0" + } + ], + "jniDependencies": [ + { + "groupId": "com.ctre.phoenix6", + "artifactId": "api-cpp", + "version": "25.1.0", + "isJar": false, + "skipInvalidPlatforms": true, + "validPlatforms": [ + "windowsx86-64", + "linuxx86-64", + "linuxarm64", + "linuxathena" + ], + "simMode": "hwsim" + }, + { + "groupId": "com.ctre.phoenix6", + "artifactId": "tools", + "version": "25.1.0", + "isJar": false, + "skipInvalidPlatforms": true, + "validPlatforms": [ + "windowsx86-64", + "linuxx86-64", + "linuxarm64", + "linuxathena" + ], + "simMode": "hwsim" + }, + { + "groupId": "com.ctre.phoenix6.sim", + "artifactId": "api-cpp-sim", + "version": "25.1.0", + "isJar": false, + "skipInvalidPlatforms": true, + "validPlatforms": [ + "windowsx86-64", + "linuxx86-64", + "linuxarm64", + "osxuniversal" + ], + "simMode": "swsim" + }, + { + "groupId": "com.ctre.phoenix6.sim", + "artifactId": "tools-sim", + "version": "25.1.0", + "isJar": false, + "skipInvalidPlatforms": true, + "validPlatforms": [ + "windowsx86-64", + "linuxx86-64", + "linuxarm64", + "osxuniversal" + ], + "simMode": "swsim" + }, + { + "groupId": "com.ctre.phoenix6.sim", + "artifactId": "simTalonSRX", + "version": "25.1.0", + "isJar": false, + "skipInvalidPlatforms": true, + "validPlatforms": [ + "windowsx86-64", + "linuxx86-64", + "linuxarm64", + "osxuniversal" + ], + "simMode": "swsim" + }, + { + "groupId": "com.ctre.phoenix6.sim", + "artifactId": "simVictorSPX", + "version": "25.1.0", + "isJar": false, + "skipInvalidPlatforms": true, + "validPlatforms": [ + "windowsx86-64", + "linuxx86-64", + "linuxarm64", + "osxuniversal" + ], + "simMode": "swsim" + }, + { + "groupId": "com.ctre.phoenix6.sim", + "artifactId": "simPigeonIMU", + "version": "25.1.0", + "isJar": false, + "skipInvalidPlatforms": true, + "validPlatforms": [ + "windowsx86-64", + "linuxx86-64", + "linuxarm64", + "osxuniversal" + ], + "simMode": "swsim" + }, + { + "groupId": "com.ctre.phoenix6.sim", + "artifactId": "simCANCoder", + "version": "25.1.0", + "isJar": false, + "skipInvalidPlatforms": true, + "validPlatforms": [ + "windowsx86-64", + "linuxx86-64", + "linuxarm64", + "osxuniversal" + ], + "simMode": "swsim" + }, + { + "groupId": "com.ctre.phoenix6.sim", + "artifactId": "simProTalonFX", + "version": "25.1.0", + "isJar": false, + "skipInvalidPlatforms": true, + "validPlatforms": [ + "windowsx86-64", + "linuxx86-64", + "linuxarm64", + "osxuniversal" + ], + "simMode": "swsim" + }, + { + "groupId": "com.ctre.phoenix6.sim", + "artifactId": "simProCANcoder", + "version": "25.1.0", + "isJar": false, + "skipInvalidPlatforms": true, + "validPlatforms": [ + "windowsx86-64", + "linuxx86-64", + "linuxarm64", + "osxuniversal" + ], + "simMode": "swsim" + }, + { + "groupId": "com.ctre.phoenix6.sim", + "artifactId": "simProPigeon2", + "version": "25.1.0", + "isJar": false, + "skipInvalidPlatforms": true, + "validPlatforms": [ + "windowsx86-64", + "linuxx86-64", + "linuxarm64", + "osxuniversal" + ], + "simMode": "swsim" + }, + { + "groupId": "com.ctre.phoenix6.sim", + "artifactId": "simProCANrange", + "version": "25.1.0", + "isJar": false, + "skipInvalidPlatforms": true, + "validPlatforms": [ + "windowsx86-64", + "linuxx86-64", + "linuxarm64", + "osxuniversal" + ], + "simMode": "swsim" + } + ], + "cppDependencies": [ + { + "groupId": "com.ctre.phoenix6", + "artifactId": "wpiapi-cpp", + "version": "25.1.0", + "libName": "CTRE_Phoenix6_WPI", + "headerClassifier": "headers", + "sharedLibrary": true, + "skipInvalidPlatforms": true, + "binaryPlatforms": [ + "windowsx86-64", + "linuxx86-64", + "linuxarm64", + "linuxathena" + ], + "simMode": "hwsim" + }, + { + "groupId": "com.ctre.phoenix6", + "artifactId": "tools", + "version": "25.1.0", + "libName": "CTRE_PhoenixTools", + "headerClassifier": "headers", + "sharedLibrary": true, + "skipInvalidPlatforms": true, + "binaryPlatforms": [ + "windowsx86-64", + "linuxx86-64", + "linuxarm64", + "linuxathena" + ], + "simMode": "hwsim" + }, + { + "groupId": "com.ctre.phoenix6.sim", + "artifactId": "wpiapi-cpp-sim", + "version": "25.1.0", + "libName": "CTRE_Phoenix6_WPISim", + "headerClassifier": "headers", + "sharedLibrary": true, + "skipInvalidPlatforms": true, + "binaryPlatforms": [ + "windowsx86-64", + "linuxx86-64", + "linuxarm64", + "osxuniversal" + ], + "simMode": "swsim" + }, + { + "groupId": "com.ctre.phoenix6.sim", + "artifactId": "tools-sim", + "version": "25.1.0", + "libName": "CTRE_PhoenixTools_Sim", + "headerClassifier": "headers", + "sharedLibrary": true, + "skipInvalidPlatforms": true, + "binaryPlatforms": [ + "windowsx86-64", + "linuxx86-64", + "linuxarm64", + "osxuniversal" + ], + "simMode": "swsim" + }, + { + "groupId": "com.ctre.phoenix6.sim", + "artifactId": "simTalonSRX", + "version": "25.1.0", + "libName": "CTRE_SimTalonSRX", + "headerClassifier": "headers", + "sharedLibrary": true, + "skipInvalidPlatforms": true, + "binaryPlatforms": [ + "windowsx86-64", + "linuxx86-64", + "linuxarm64", + "osxuniversal" + ], + "simMode": "swsim" + }, + { + "groupId": "com.ctre.phoenix6.sim", + "artifactId": "simVictorSPX", + "version": "25.1.0", + "libName": "CTRE_SimVictorSPX", + "headerClassifier": "headers", + "sharedLibrary": true, + "skipInvalidPlatforms": true, + "binaryPlatforms": [ + "windowsx86-64", + "linuxx86-64", + "linuxarm64", + "osxuniversal" + ], + "simMode": "swsim" + }, + { + "groupId": "com.ctre.phoenix6.sim", + "artifactId": "simPigeonIMU", + "version": "25.1.0", + "libName": "CTRE_SimPigeonIMU", + "headerClassifier": "headers", + "sharedLibrary": true, + "skipInvalidPlatforms": true, + "binaryPlatforms": [ + "windowsx86-64", + "linuxx86-64", + "linuxarm64", + "osxuniversal" + ], + "simMode": "swsim" + }, + { + "groupId": "com.ctre.phoenix6.sim", + "artifactId": "simCANCoder", + "version": "25.1.0", + "libName": "CTRE_SimCANCoder", + "headerClassifier": "headers", + "sharedLibrary": true, + "skipInvalidPlatforms": true, + "binaryPlatforms": [ + "windowsx86-64", + "linuxx86-64", + "linuxarm64", + "osxuniversal" + ], + "simMode": "swsim" + }, + { + "groupId": "com.ctre.phoenix6.sim", + "artifactId": "simProTalonFX", + "version": "25.1.0", + "libName": "CTRE_SimProTalonFX", + "headerClassifier": "headers", + "sharedLibrary": true, + "skipInvalidPlatforms": true, + "binaryPlatforms": [ + "windowsx86-64", + "linuxx86-64", + "linuxarm64", + "osxuniversal" + ], + "simMode": "swsim" + }, + { + "groupId": "com.ctre.phoenix6.sim", + "artifactId": "simProCANcoder", + "version": "25.1.0", + "libName": "CTRE_SimProCANcoder", + "headerClassifier": "headers", + "sharedLibrary": true, + "skipInvalidPlatforms": true, + "binaryPlatforms": [ + "windowsx86-64", + "linuxx86-64", + "linuxarm64", + "osxuniversal" + ], + "simMode": "swsim" + }, + { + "groupId": "com.ctre.phoenix6.sim", + "artifactId": "simProPigeon2", + "version": "25.1.0", + "libName": "CTRE_SimProPigeon2", + "headerClassifier": "headers", + "sharedLibrary": true, + "skipInvalidPlatforms": true, + "binaryPlatforms": [ + "windowsx86-64", + "linuxx86-64", + "linuxarm64", + "osxuniversal" + ], + "simMode": "swsim" + }, + { + "groupId": "com.ctre.phoenix6.sim", + "artifactId": "simProCANrange", + "version": "25.1.0", + "libName": "CTRE_SimProCANrange", + "headerClassifier": "headers", + "sharedLibrary": true, + "skipInvalidPlatforms": true, + "binaryPlatforms": [ + "windowsx86-64", + "linuxx86-64", + "linuxarm64", + "osxuniversal" + ], + "simMode": "swsim" + } + ] +} \ No newline at end of file diff --git a/vendordeps/REVLib-2025.0.0.json b/vendordeps/REVLib-2025.0.0.json new file mode 100644 index 0000000..cde6011 --- /dev/null +++ b/vendordeps/REVLib-2025.0.0.json @@ -0,0 +1,74 @@ +{ + "fileName": "REVLib-2025.0.0.json", + "name": "REVLib", + "version": "2025.0.0", + "frcYear": "2025", + "uuid": "3f48eb8c-50fe-43a6-9cb7-44c86353c4cb", + "mavenUrls": [ + "https://maven.revrobotics.com/" + ], + "jsonUrl": "https://software-metadata.revrobotics.com/REVLib-2025.json", + "javaDependencies": [ + { + "groupId": "com.revrobotics.frc", + "artifactId": "REVLib-java", + "version": "2025.0.0" + } + ], + "jniDependencies": [ + { + "groupId": "com.revrobotics.frc", + "artifactId": "REVLib-driver", + "version": "2025.0.0", + "skipInvalidPlatforms": true, + "isJar": false, + "validPlatforms": [ + "windowsx86-64", + "windowsx86", + "linuxarm64", + "linuxx86-64", + "linuxathena", + "linuxarm32", + "osxuniversal" + ] + } + ], + "cppDependencies": [ + { + "groupId": "com.revrobotics.frc", + "artifactId": "REVLib-cpp", + "version": "2025.0.0", + "libName": "REVLib", + "headerClassifier": "headers", + "sharedLibrary": false, + "skipInvalidPlatforms": true, + "binaryPlatforms": [ + "windowsx86-64", + "windowsx86", + "linuxarm64", + "linuxx86-64", + "linuxathena", + "linuxarm32", + "osxuniversal" + ] + }, + { + "groupId": "com.revrobotics.frc", + "artifactId": "REVLib-driver", + "version": "2025.0.0", + "libName": "REVLibDriver", + "headerClassifier": "headers", + "sharedLibrary": false, + "skipInvalidPlatforms": true, + "binaryPlatforms": [ + "windowsx86-64", + "windowsx86", + "linuxarm64", + "linuxx86-64", + "linuxathena", + "linuxarm32", + "osxuniversal" + ] + } + ] +} \ No newline at end of file diff --git a/vendordeps/Studica-2025.0.0.json b/vendordeps/Studica-2025.0.0.json new file mode 100644 index 0000000..ddb0e44 --- /dev/null +++ b/vendordeps/Studica-2025.0.0.json @@ -0,0 +1,71 @@ +{ + "fileName": "Studica-2025.0.0.json", + "name": "Studica", + "version": "2025.0.0", + "uuid": "cb311d09-36e9-4143-a032-55bb2b94443b", + "frcYear": "2025", + "mavenUrls": [ + "https://dev.studica.com/maven/release/2025/" + ], + "jsonUrl": "https://dev.studica.com/releases/2025/Studica-2025.0.0.json", + "cppDependencies": [ + { + "artifactId": "Studica-cpp", + "binaryPlatforms": [ + "linuxathena", + "linuxarm32", + "linuxarm64", + "linuxx86-64", + "osxuniversal", + "windowsx86-64" + ], + "groupId": "com.studica.frc", + "headerClassifier": "headers", + "libName": "Studica", + "sharedLibrary": false, + "skipInvalidPlatforms": true, + "version": "2025.0.0" + }, + { + "artifactId": "Studica-driver", + "binaryPlatforms": [ + "linuxathena", + "linuxarm32", + "linuxarm64", + "linuxx86-64", + "osxuniversal", + "windowsx86-64" + ], + "groupId": "com.studica.frc", + "headerClassifier": "headers", + "libName": "StudicaDriver", + "sharedLibrary": false, + "skipInvalidPlatforms": true, + "version": "2025.0.0" + } + ], + "javaDependencies": [ + { + "artifactId": "Studica-java", + "groupId": "com.studica.frc", + "version": "2025.0.0" + } + ], + "jniDependencies": [ + { + "artifactId": "Studica-driver", + "groupId": "com.studica.frc", + "isJar": false, + "skipInvalidPlatforms": true, + "validPlatforms": [ + "linuxathena", + "linuxarm32", + "linuxarm64", + "linuxx86-64", + "osxuniversal", + "windowsx86-64" + ], + "version": "2025.0.0" + } + ] +} \ No newline at end of file From 7a90dccd8e25e56064d39de0d0a0d4eedac67823 Mon Sep 17 00:00:00 2001 From: Jay McNeely Date: Fri, 10 Jan 2025 19:00:12 -0600 Subject: [PATCH 29/39] Removed previous files --- vendordeps/Phoenix5-frc2025-latest.json | 171 ----------- vendordeps/Phoenix6-frc2025-latest.json | 389 ------------------------ 2 files changed, 560 deletions(-) delete mode 100644 vendordeps/Phoenix5-frc2025-latest.json delete mode 100644 vendordeps/Phoenix6-frc2025-latest.json diff --git a/vendordeps/Phoenix5-frc2025-latest.json b/vendordeps/Phoenix5-frc2025-latest.json deleted file mode 100644 index c1098dc..0000000 --- a/vendordeps/Phoenix5-frc2025-latest.json +++ /dev/null @@ -1,171 +0,0 @@ -{ - "fileName": "Phoenix5-frc2025-latest.json", - "name": "CTRE-Phoenix (v5)", - "version": "5.35.1", - "frcYear": "2025", - "uuid": "ab676553-b602-441f-a38d-f1296eff6537", - "mavenUrls": [ - "https://maven.ctr-electronics.com/release/" - ], - "jsonUrl": "https://maven.ctr-electronics.com/release/com/ctre/phoenix/Phoenix5-frc2025-latest.json", - "requires": [ - { - "uuid": "e995de00-2c64-4df5-8831-c1441420ff19", - "errorMessage": "Phoenix 5 requires low-level libraries from Phoenix 6. Please add the Phoenix 6 vendordep before adding Phoenix 5.", - "offlineFileName": "Phoenix6-frc2025-latest.json", - "onlineUrl": "https://maven.ctr-electronics.com/release/com/ctre/phoenix6/latest/Phoenix6-frc2025-latest.json" - } - ], - "conflictsWith": [ - { - "uuid": "e7900d8d-826f-4dca-a1ff-182f658e98af", - "errorMessage": "Users must use the Phoenix 5 replay vendordep when using the Phoenix 6 replay vendordep.", - "offlineFileName": "Phoenix6-replay-frc2025-latest.json" - }, - { - "uuid": "fbc886a4-2cec-40c0-9835-71086a8cc3df", - "errorMessage": "Users cannot have both the replay and regular Phoenix 5 vendordeps in their robot program.", - "offlineFileName": "Phoenix5-replay-frc2025-latest.json" - } - ], - "javaDependencies": [ - { - "groupId": "com.ctre.phoenix", - "artifactId": "api-java", - "version": "5.35.1" - }, - { - "groupId": "com.ctre.phoenix", - "artifactId": "wpiapi-java", - "version": "5.35.1" - } - ], - "jniDependencies": [ - { - "groupId": "com.ctre.phoenix", - "artifactId": "cci", - "version": "5.35.1", - "isJar": false, - "skipInvalidPlatforms": true, - "validPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxarm64", - "linuxathena" - ], - "simMode": "hwsim" - }, - { - "groupId": "com.ctre.phoenix.sim", - "artifactId": "cci-sim", - "version": "5.35.1", - "isJar": false, - "skipInvalidPlatforms": true, - "validPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxarm64", - "osxuniversal" - ], - "simMode": "swsim" - } - ], - "cppDependencies": [ - { - "groupId": "com.ctre.phoenix", - "artifactId": "wpiapi-cpp", - "version": "5.35.1", - "libName": "CTRE_Phoenix_WPI", - "headerClassifier": "headers", - "sharedLibrary": true, - "skipInvalidPlatforms": true, - "binaryPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxarm64", - "linuxathena" - ], - "simMode": "hwsim" - }, - { - "groupId": "com.ctre.phoenix", - "artifactId": "api-cpp", - "version": "5.35.1", - "libName": "CTRE_Phoenix", - "headerClassifier": "headers", - "sharedLibrary": true, - "skipInvalidPlatforms": true, - "binaryPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxarm64", - "linuxathena" - ], - "simMode": "hwsim" - }, - { - "groupId": "com.ctre.phoenix", - "artifactId": "cci", - "version": "5.35.1", - "libName": "CTRE_PhoenixCCI", - "headerClassifier": "headers", - "sharedLibrary": true, - "skipInvalidPlatforms": true, - "binaryPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxarm64", - "linuxathena" - ], - "simMode": "hwsim" - }, - { - "groupId": "com.ctre.phoenix.sim", - "artifactId": "wpiapi-cpp-sim", - "version": "5.35.1", - "libName": "CTRE_Phoenix_WPISim", - "headerClassifier": "headers", - "sharedLibrary": true, - "skipInvalidPlatforms": true, - "binaryPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxarm64", - "osxuniversal" - ], - "simMode": "swsim" - }, - { - "groupId": "com.ctre.phoenix.sim", - "artifactId": "api-cpp-sim", - "version": "5.35.1", - "libName": "CTRE_PhoenixSim", - "headerClassifier": "headers", - "sharedLibrary": true, - "skipInvalidPlatforms": true, - "binaryPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxarm64", - "osxuniversal" - ], - "simMode": "swsim" - }, - { - "groupId": "com.ctre.phoenix.sim", - "artifactId": "cci-sim", - "version": "5.35.1", - "libName": "CTRE_PhoenixCCISim", - "headerClassifier": "headers", - "sharedLibrary": true, - "skipInvalidPlatforms": true, - "binaryPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxarm64", - "osxuniversal" - ], - "simMode": "swsim" - } - ] -} \ No newline at end of file diff --git a/vendordeps/Phoenix6-frc2025-latest.json b/vendordeps/Phoenix6-frc2025-latest.json deleted file mode 100644 index 7f4bd2e..0000000 --- a/vendordeps/Phoenix6-frc2025-latest.json +++ /dev/null @@ -1,389 +0,0 @@ -{ - "fileName": "Phoenix6-frc2025-latest.json", - "name": "CTRE-Phoenix (v6)", - "version": "25.1.0", - "frcYear": "2025", - "uuid": "e995de00-2c64-4df5-8831-c1441420ff19", - "mavenUrls": [ - "https://maven.ctr-electronics.com/release/" - ], - "jsonUrl": "https://maven.ctr-electronics.com/release/com/ctre/phoenix6/latest/Phoenix6-frc2025-latest.json", - "conflictsWith": [ - { - "uuid": "e7900d8d-826f-4dca-a1ff-182f658e98af", - "errorMessage": "Users can not have both the replay and regular Phoenix 6 vendordeps in their robot program.", - "offlineFileName": "Phoenix6-replay-frc2025-latest.json" - } - ], - "javaDependencies": [ - { - "groupId": "com.ctre.phoenix6", - "artifactId": "wpiapi-java", - "version": "25.1.0" - } - ], - "jniDependencies": [ - { - "groupId": "com.ctre.phoenix6", - "artifactId": "api-cpp", - "version": "25.1.0", - "isJar": false, - "skipInvalidPlatforms": true, - "validPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxarm64", - "linuxathena" - ], - "simMode": "hwsim" - }, - { - "groupId": "com.ctre.phoenix6", - "artifactId": "tools", - "version": "25.1.0", - "isJar": false, - "skipInvalidPlatforms": true, - "validPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxarm64", - "linuxathena" - ], - "simMode": "hwsim" - }, - { - "groupId": "com.ctre.phoenix6.sim", - "artifactId": "api-cpp-sim", - "version": "25.1.0", - "isJar": false, - "skipInvalidPlatforms": true, - "validPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxarm64", - "osxuniversal" - ], - "simMode": "swsim" - }, - { - "groupId": "com.ctre.phoenix6.sim", - "artifactId": "tools-sim", - "version": "25.1.0", - "isJar": false, - "skipInvalidPlatforms": true, - "validPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxarm64", - "osxuniversal" - ], - "simMode": "swsim" - }, - { - "groupId": "com.ctre.phoenix6.sim", - "artifactId": "simTalonSRX", - "version": "25.1.0", - "isJar": false, - "skipInvalidPlatforms": true, - "validPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxarm64", - "osxuniversal" - ], - "simMode": "swsim" - }, - { - "groupId": "com.ctre.phoenix6.sim", - "artifactId": "simVictorSPX", - "version": "25.1.0", - "isJar": false, - "skipInvalidPlatforms": true, - "validPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxarm64", - "osxuniversal" - ], - "simMode": "swsim" - }, - { - "groupId": "com.ctre.phoenix6.sim", - "artifactId": "simPigeonIMU", - "version": "25.1.0", - "isJar": false, - "skipInvalidPlatforms": true, - "validPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxarm64", - "osxuniversal" - ], - "simMode": "swsim" - }, - { - "groupId": "com.ctre.phoenix6.sim", - "artifactId": "simCANCoder", - "version": "25.1.0", - "isJar": false, - "skipInvalidPlatforms": true, - "validPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxarm64", - "osxuniversal" - ], - "simMode": "swsim" - }, - { - "groupId": "com.ctre.phoenix6.sim", - "artifactId": "simProTalonFX", - "version": "25.1.0", - "isJar": false, - "skipInvalidPlatforms": true, - "validPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxarm64", - "osxuniversal" - ], - "simMode": "swsim" - }, - { - "groupId": "com.ctre.phoenix6.sim", - "artifactId": "simProCANcoder", - "version": "25.1.0", - "isJar": false, - "skipInvalidPlatforms": true, - "validPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxarm64", - "osxuniversal" - ], - "simMode": "swsim" - }, - { - "groupId": "com.ctre.phoenix6.sim", - "artifactId": "simProPigeon2", - "version": "25.1.0", - "isJar": false, - "skipInvalidPlatforms": true, - "validPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxarm64", - "osxuniversal" - ], - "simMode": "swsim" - }, - { - "groupId": "com.ctre.phoenix6.sim", - "artifactId": "simProCANrange", - "version": "25.1.0", - "isJar": false, - "skipInvalidPlatforms": true, - "validPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxarm64", - "osxuniversal" - ], - "simMode": "swsim" - } - ], - "cppDependencies": [ - { - "groupId": "com.ctre.phoenix6", - "artifactId": "wpiapi-cpp", - "version": "25.1.0", - "libName": "CTRE_Phoenix6_WPI", - "headerClassifier": "headers", - "sharedLibrary": true, - "skipInvalidPlatforms": true, - "binaryPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxarm64", - "linuxathena" - ], - "simMode": "hwsim" - }, - { - "groupId": "com.ctre.phoenix6", - "artifactId": "tools", - "version": "25.1.0", - "libName": "CTRE_PhoenixTools", - "headerClassifier": "headers", - "sharedLibrary": true, - "skipInvalidPlatforms": true, - "binaryPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxarm64", - "linuxathena" - ], - "simMode": "hwsim" - }, - { - "groupId": "com.ctre.phoenix6.sim", - "artifactId": "wpiapi-cpp-sim", - "version": "25.1.0", - "libName": "CTRE_Phoenix6_WPISim", - "headerClassifier": "headers", - "sharedLibrary": true, - "skipInvalidPlatforms": true, - "binaryPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxarm64", - "osxuniversal" - ], - "simMode": "swsim" - }, - { - "groupId": "com.ctre.phoenix6.sim", - "artifactId": "tools-sim", - "version": "25.1.0", - "libName": "CTRE_PhoenixTools_Sim", - "headerClassifier": "headers", - "sharedLibrary": true, - "skipInvalidPlatforms": true, - "binaryPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxarm64", - "osxuniversal" - ], - "simMode": "swsim" - }, - { - "groupId": "com.ctre.phoenix6.sim", - "artifactId": "simTalonSRX", - "version": "25.1.0", - "libName": "CTRE_SimTalonSRX", - "headerClassifier": "headers", - "sharedLibrary": true, - "skipInvalidPlatforms": true, - "binaryPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxarm64", - "osxuniversal" - ], - "simMode": "swsim" - }, - { - "groupId": "com.ctre.phoenix6.sim", - "artifactId": "simVictorSPX", - "version": "25.1.0", - "libName": "CTRE_SimVictorSPX", - "headerClassifier": "headers", - "sharedLibrary": true, - "skipInvalidPlatforms": true, - "binaryPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxarm64", - "osxuniversal" - ], - "simMode": "swsim" - }, - { - "groupId": "com.ctre.phoenix6.sim", - "artifactId": "simPigeonIMU", - "version": "25.1.0", - "libName": "CTRE_SimPigeonIMU", - "headerClassifier": "headers", - "sharedLibrary": true, - "skipInvalidPlatforms": true, - "binaryPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxarm64", - "osxuniversal" - ], - "simMode": "swsim" - }, - { - "groupId": "com.ctre.phoenix6.sim", - "artifactId": "simCANCoder", - "version": "25.1.0", - "libName": "CTRE_SimCANCoder", - "headerClassifier": "headers", - "sharedLibrary": true, - "skipInvalidPlatforms": true, - "binaryPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxarm64", - "osxuniversal" - ], - "simMode": "swsim" - }, - { - "groupId": "com.ctre.phoenix6.sim", - "artifactId": "simProTalonFX", - "version": "25.1.0", - "libName": "CTRE_SimProTalonFX", - "headerClassifier": "headers", - "sharedLibrary": true, - "skipInvalidPlatforms": true, - "binaryPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxarm64", - "osxuniversal" - ], - "simMode": "swsim" - }, - { - "groupId": "com.ctre.phoenix6.sim", - "artifactId": "simProCANcoder", - "version": "25.1.0", - "libName": "CTRE_SimProCANcoder", - "headerClassifier": "headers", - "sharedLibrary": true, - "skipInvalidPlatforms": true, - "binaryPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxarm64", - "osxuniversal" - ], - "simMode": "swsim" - }, - { - "groupId": "com.ctre.phoenix6.sim", - "artifactId": "simProPigeon2", - "version": "25.1.0", - "libName": "CTRE_SimProPigeon2", - "headerClassifier": "headers", - "sharedLibrary": true, - "skipInvalidPlatforms": true, - "binaryPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxarm64", - "osxuniversal" - ], - "simMode": "swsim" - }, - { - "groupId": "com.ctre.phoenix6.sim", - "artifactId": "simProCANrange", - "version": "25.1.0", - "libName": "CTRE_SimProCANrange", - "headerClassifier": "headers", - "sharedLibrary": true, - "skipInvalidPlatforms": true, - "binaryPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxarm64", - "osxuniversal" - ], - "simMode": "swsim" - } - ] -} \ No newline at end of file From 9edc5d05ff57a5237af169504b719b4a1c0840e6 Mon Sep 17 00:00:00 2001 From: Jay McNeely Date: Fri, 10 Jan 2025 19:08:57 -0600 Subject: [PATCH 30/39] Switch branch over to repo-rework. --- .github/workflows/gradle.yml | 4 ++-- .github/workflows/linter.yml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml index 3c45c13..b25a586 100644 --- a/.github/workflows/gradle.yml +++ b/.github/workflows/gradle.yml @@ -4,9 +4,9 @@ name: Gradle Dependencies and Build on: push: - branches: [ "workflow-testing" ] # Change to "main" when merged + branches: [ "repo-rework" ] # Change to "main" when merged pull_request: - branches: [ "workflow-testing" ] # Change to "main" when merged + branches: [ "repo-rework" ] # Change to "main" when merged jobs: build: diff --git a/.github/workflows/linter.yml b/.github/workflows/linter.yml index b7a3840..c577fe9 100644 --- a/.github/workflows/linter.yml +++ b/.github/workflows/linter.yml @@ -6,9 +6,9 @@ name: Linting and Formatting on: push: - branches: ["workflow-testing"] # Change to "main" when merged + branches: ["repo-rework"] # Change to "main" when merged pull_request: - branches: ["workflow-testing"] # Change to "main" when merged + branches: ["repo-rework"] # Change to "main" when merged jobs: super-linter: From 832bec054b45c77b3a36d449898bd3087917aa7d Mon Sep 17 00:00:00 2001 From: Jay McNeely Date: Fri, 24 Jan 2025 15:11:26 -0600 Subject: [PATCH 31/39] Bumped WPILib version to 2025.2.1. --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 11d95e6..b9f0e50 100644 --- a/build.gradle +++ b/build.gradle @@ -1,6 +1,6 @@ plugins { id "java" - id "edu.wpi.first.GradleRIO" version "2025.1.1" + id "edu.wpi.first.GradleRIO" version "2025.2.1" } java { From 77780b382a76cd72b6ab63a4e716e10b1d1f9691 Mon Sep 17 00:00:00 2001 From: Jay McNeely Date: Fri, 7 Feb 2025 12:33:58 -0600 Subject: [PATCH 32/39] Updated Vendordeps. --- vendordeps/PathplannerLib.json | 38 +++ vendordeps/Phoenix5-frc2025-latest.json | 171 ++++++++++ vendordeps/Phoenix6-frc2025-latest.json | 419 ++++++++++++++++++++++++ 3 files changed, 628 insertions(+) create mode 100644 vendordeps/PathplannerLib.json create mode 100644 vendordeps/Phoenix5-frc2025-latest.json create mode 100644 vendordeps/Phoenix6-frc2025-latest.json diff --git a/vendordeps/PathplannerLib.json b/vendordeps/PathplannerLib.json new file mode 100644 index 0000000..2021898 --- /dev/null +++ b/vendordeps/PathplannerLib.json @@ -0,0 +1,38 @@ +{ + "fileName": "PathplannerLib.json", + "name": "PathplannerLib", + "version": "2025.2.3", + "uuid": "1b42324f-17c6-4875-8e77-1c312bc8c786", + "frcYear": "2025", + "mavenUrls": [ + "https://3015rangerrobotics.github.io/pathplannerlib/repo" + ], + "jsonUrl": "https://3015rangerrobotics.github.io/pathplannerlib/PathplannerLib.json", + "javaDependencies": [ + { + "groupId": "com.pathplanner.lib", + "artifactId": "PathplannerLib-java", + "version": "2025.2.3" + } + ], + "jniDependencies": [], + "cppDependencies": [ + { + "groupId": "com.pathplanner.lib", + "artifactId": "PathplannerLib-cpp", + "version": "2025.2.3", + "libName": "PathplannerLib", + "headerClassifier": "headers", + "sharedLibrary": false, + "skipInvalidPlatforms": true, + "binaryPlatforms": [ + "windowsx86-64", + "linuxx86-64", + "osxuniversal", + "linuxathena", + "linuxarm32", + "linuxarm64" + ] + } + ] +} \ No newline at end of file diff --git a/vendordeps/Phoenix5-frc2025-latest.json b/vendordeps/Phoenix5-frc2025-latest.json new file mode 100644 index 0000000..c1098dc --- /dev/null +++ b/vendordeps/Phoenix5-frc2025-latest.json @@ -0,0 +1,171 @@ +{ + "fileName": "Phoenix5-frc2025-latest.json", + "name": "CTRE-Phoenix (v5)", + "version": "5.35.1", + "frcYear": "2025", + "uuid": "ab676553-b602-441f-a38d-f1296eff6537", + "mavenUrls": [ + "https://maven.ctr-electronics.com/release/" + ], + "jsonUrl": "https://maven.ctr-electronics.com/release/com/ctre/phoenix/Phoenix5-frc2025-latest.json", + "requires": [ + { + "uuid": "e995de00-2c64-4df5-8831-c1441420ff19", + "errorMessage": "Phoenix 5 requires low-level libraries from Phoenix 6. Please add the Phoenix 6 vendordep before adding Phoenix 5.", + "offlineFileName": "Phoenix6-frc2025-latest.json", + "onlineUrl": "https://maven.ctr-electronics.com/release/com/ctre/phoenix6/latest/Phoenix6-frc2025-latest.json" + } + ], + "conflictsWith": [ + { + "uuid": "e7900d8d-826f-4dca-a1ff-182f658e98af", + "errorMessage": "Users must use the Phoenix 5 replay vendordep when using the Phoenix 6 replay vendordep.", + "offlineFileName": "Phoenix6-replay-frc2025-latest.json" + }, + { + "uuid": "fbc886a4-2cec-40c0-9835-71086a8cc3df", + "errorMessage": "Users cannot have both the replay and regular Phoenix 5 vendordeps in their robot program.", + "offlineFileName": "Phoenix5-replay-frc2025-latest.json" + } + ], + "javaDependencies": [ + { + "groupId": "com.ctre.phoenix", + "artifactId": "api-java", + "version": "5.35.1" + }, + { + "groupId": "com.ctre.phoenix", + "artifactId": "wpiapi-java", + "version": "5.35.1" + } + ], + "jniDependencies": [ + { + "groupId": "com.ctre.phoenix", + "artifactId": "cci", + "version": "5.35.1", + "isJar": false, + "skipInvalidPlatforms": true, + "validPlatforms": [ + "windowsx86-64", + "linuxx86-64", + "linuxarm64", + "linuxathena" + ], + "simMode": "hwsim" + }, + { + "groupId": "com.ctre.phoenix.sim", + "artifactId": "cci-sim", + "version": "5.35.1", + "isJar": false, + "skipInvalidPlatforms": true, + "validPlatforms": [ + "windowsx86-64", + "linuxx86-64", + "linuxarm64", + "osxuniversal" + ], + "simMode": "swsim" + } + ], + "cppDependencies": [ + { + "groupId": "com.ctre.phoenix", + "artifactId": "wpiapi-cpp", + "version": "5.35.1", + "libName": "CTRE_Phoenix_WPI", + "headerClassifier": "headers", + "sharedLibrary": true, + "skipInvalidPlatforms": true, + "binaryPlatforms": [ + "windowsx86-64", + "linuxx86-64", + "linuxarm64", + "linuxathena" + ], + "simMode": "hwsim" + }, + { + "groupId": "com.ctre.phoenix", + "artifactId": "api-cpp", + "version": "5.35.1", + "libName": "CTRE_Phoenix", + "headerClassifier": "headers", + "sharedLibrary": true, + "skipInvalidPlatforms": true, + "binaryPlatforms": [ + "windowsx86-64", + "linuxx86-64", + "linuxarm64", + "linuxathena" + ], + "simMode": "hwsim" + }, + { + "groupId": "com.ctre.phoenix", + "artifactId": "cci", + "version": "5.35.1", + "libName": "CTRE_PhoenixCCI", + "headerClassifier": "headers", + "sharedLibrary": true, + "skipInvalidPlatforms": true, + "binaryPlatforms": [ + "windowsx86-64", + "linuxx86-64", + "linuxarm64", + "linuxathena" + ], + "simMode": "hwsim" + }, + { + "groupId": "com.ctre.phoenix.sim", + "artifactId": "wpiapi-cpp-sim", + "version": "5.35.1", + "libName": "CTRE_Phoenix_WPISim", + "headerClassifier": "headers", + "sharedLibrary": true, + "skipInvalidPlatforms": true, + "binaryPlatforms": [ + "windowsx86-64", + "linuxx86-64", + "linuxarm64", + "osxuniversal" + ], + "simMode": "swsim" + }, + { + "groupId": "com.ctre.phoenix.sim", + "artifactId": "api-cpp-sim", + "version": "5.35.1", + "libName": "CTRE_PhoenixSim", + "headerClassifier": "headers", + "sharedLibrary": true, + "skipInvalidPlatforms": true, + "binaryPlatforms": [ + "windowsx86-64", + "linuxx86-64", + "linuxarm64", + "osxuniversal" + ], + "simMode": "swsim" + }, + { + "groupId": "com.ctre.phoenix.sim", + "artifactId": "cci-sim", + "version": "5.35.1", + "libName": "CTRE_PhoenixCCISim", + "headerClassifier": "headers", + "sharedLibrary": true, + "skipInvalidPlatforms": true, + "binaryPlatforms": [ + "windowsx86-64", + "linuxx86-64", + "linuxarm64", + "osxuniversal" + ], + "simMode": "swsim" + } + ] +} \ No newline at end of file diff --git a/vendordeps/Phoenix6-frc2025-latest.json b/vendordeps/Phoenix6-frc2025-latest.json new file mode 100644 index 0000000..acc78db --- /dev/null +++ b/vendordeps/Phoenix6-frc2025-latest.json @@ -0,0 +1,419 @@ +{ + "fileName": "Phoenix6-frc2025-latest.json", + "name": "CTRE-Phoenix (v6)", + "version": "25.2.2", + "frcYear": "2025", + "uuid": "e995de00-2c64-4df5-8831-c1441420ff19", + "mavenUrls": [ + "https://maven.ctr-electronics.com/release/" + ], + "jsonUrl": "https://maven.ctr-electronics.com/release/com/ctre/phoenix6/latest/Phoenix6-frc2025-latest.json", + "conflictsWith": [ + { + "uuid": "e7900d8d-826f-4dca-a1ff-182f658e98af", + "errorMessage": "Users can not have both the replay and regular Phoenix 6 vendordeps in their robot program.", + "offlineFileName": "Phoenix6-replay-frc2025-latest.json" + } + ], + "javaDependencies": [ + { + "groupId": "com.ctre.phoenix6", + "artifactId": "wpiapi-java", + "version": "25.2.2" + } + ], + "jniDependencies": [ + { + "groupId": "com.ctre.phoenix6", + "artifactId": "api-cpp", + "version": "25.2.2", + "isJar": false, + "skipInvalidPlatforms": true, + "validPlatforms": [ + "windowsx86-64", + "linuxx86-64", + "linuxarm64", + "linuxathena" + ], + "simMode": "hwsim" + }, + { + "groupId": "com.ctre.phoenix6", + "artifactId": "tools", + "version": "25.2.2", + "isJar": false, + "skipInvalidPlatforms": true, + "validPlatforms": [ + "windowsx86-64", + "linuxx86-64", + "linuxarm64", + "linuxathena" + ], + "simMode": "hwsim" + }, + { + "groupId": "com.ctre.phoenix6.sim", + "artifactId": "api-cpp-sim", + "version": "25.2.2", + "isJar": false, + "skipInvalidPlatforms": true, + "validPlatforms": [ + "windowsx86-64", + "linuxx86-64", + "linuxarm64", + "osxuniversal" + ], + "simMode": "swsim" + }, + { + "groupId": "com.ctre.phoenix6.sim", + "artifactId": "tools-sim", + "version": "25.2.2", + "isJar": false, + "skipInvalidPlatforms": true, + "validPlatforms": [ + "windowsx86-64", + "linuxx86-64", + "linuxarm64", + "osxuniversal" + ], + "simMode": "swsim" + }, + { + "groupId": "com.ctre.phoenix6.sim", + "artifactId": "simTalonSRX", + "version": "25.2.2", + "isJar": false, + "skipInvalidPlatforms": true, + "validPlatforms": [ + "windowsx86-64", + "linuxx86-64", + "linuxarm64", + "osxuniversal" + ], + "simMode": "swsim" + }, + { + "groupId": "com.ctre.phoenix6.sim", + "artifactId": "simVictorSPX", + "version": "25.2.2", + "isJar": false, + "skipInvalidPlatforms": true, + "validPlatforms": [ + "windowsx86-64", + "linuxx86-64", + "linuxarm64", + "osxuniversal" + ], + "simMode": "swsim" + }, + { + "groupId": "com.ctre.phoenix6.sim", + "artifactId": "simPigeonIMU", + "version": "25.2.2", + "isJar": false, + "skipInvalidPlatforms": true, + "validPlatforms": [ + "windowsx86-64", + "linuxx86-64", + "linuxarm64", + "osxuniversal" + ], + "simMode": "swsim" + }, + { + "groupId": "com.ctre.phoenix6.sim", + "artifactId": "simCANCoder", + "version": "25.2.2", + "isJar": false, + "skipInvalidPlatforms": true, + "validPlatforms": [ + "windowsx86-64", + "linuxx86-64", + "linuxarm64", + "osxuniversal" + ], + "simMode": "swsim" + }, + { + "groupId": "com.ctre.phoenix6.sim", + "artifactId": "simProTalonFX", + "version": "25.2.2", + "isJar": false, + "skipInvalidPlatforms": true, + "validPlatforms": [ + "windowsx86-64", + "linuxx86-64", + "linuxarm64", + "osxuniversal" + ], + "simMode": "swsim" + }, + { + "groupId": "com.ctre.phoenix6.sim", + "artifactId": "simProTalonFXS", + "version": "25.2.2", + "isJar": false, + "skipInvalidPlatforms": true, + "validPlatforms": [ + "windowsx86-64", + "linuxx86-64", + "linuxarm64", + "osxuniversal" + ], + "simMode": "swsim" + }, + { + "groupId": "com.ctre.phoenix6.sim", + "artifactId": "simProCANcoder", + "version": "25.2.2", + "isJar": false, + "skipInvalidPlatforms": true, + "validPlatforms": [ + "windowsx86-64", + "linuxx86-64", + "linuxarm64", + "osxuniversal" + ], + "simMode": "swsim" + }, + { + "groupId": "com.ctre.phoenix6.sim", + "artifactId": "simProPigeon2", + "version": "25.2.2", + "isJar": false, + "skipInvalidPlatforms": true, + "validPlatforms": [ + "windowsx86-64", + "linuxx86-64", + "linuxarm64", + "osxuniversal" + ], + "simMode": "swsim" + }, + { + "groupId": "com.ctre.phoenix6.sim", + "artifactId": "simProCANrange", + "version": "25.2.2", + "isJar": false, + "skipInvalidPlatforms": true, + "validPlatforms": [ + "windowsx86-64", + "linuxx86-64", + "linuxarm64", + "osxuniversal" + ], + "simMode": "swsim" + } + ], + "cppDependencies": [ + { + "groupId": "com.ctre.phoenix6", + "artifactId": "wpiapi-cpp", + "version": "25.2.2", + "libName": "CTRE_Phoenix6_WPI", + "headerClassifier": "headers", + "sharedLibrary": true, + "skipInvalidPlatforms": true, + "binaryPlatforms": [ + "windowsx86-64", + "linuxx86-64", + "linuxarm64", + "linuxathena" + ], + "simMode": "hwsim" + }, + { + "groupId": "com.ctre.phoenix6", + "artifactId": "tools", + "version": "25.2.2", + "libName": "CTRE_PhoenixTools", + "headerClassifier": "headers", + "sharedLibrary": true, + "skipInvalidPlatforms": true, + "binaryPlatforms": [ + "windowsx86-64", + "linuxx86-64", + "linuxarm64", + "linuxathena" + ], + "simMode": "hwsim" + }, + { + "groupId": "com.ctre.phoenix6.sim", + "artifactId": "wpiapi-cpp-sim", + "version": "25.2.2", + "libName": "CTRE_Phoenix6_WPISim", + "headerClassifier": "headers", + "sharedLibrary": true, + "skipInvalidPlatforms": true, + "binaryPlatforms": [ + "windowsx86-64", + "linuxx86-64", + "linuxarm64", + "osxuniversal" + ], + "simMode": "swsim" + }, + { + "groupId": "com.ctre.phoenix6.sim", + "artifactId": "tools-sim", + "version": "25.2.2", + "libName": "CTRE_PhoenixTools_Sim", + "headerClassifier": "headers", + "sharedLibrary": true, + "skipInvalidPlatforms": true, + "binaryPlatforms": [ + "windowsx86-64", + "linuxx86-64", + "linuxarm64", + "osxuniversal" + ], + "simMode": "swsim" + }, + { + "groupId": "com.ctre.phoenix6.sim", + "artifactId": "simTalonSRX", + "version": "25.2.2", + "libName": "CTRE_SimTalonSRX", + "headerClassifier": "headers", + "sharedLibrary": true, + "skipInvalidPlatforms": true, + "binaryPlatforms": [ + "windowsx86-64", + "linuxx86-64", + "linuxarm64", + "osxuniversal" + ], + "simMode": "swsim" + }, + { + "groupId": "com.ctre.phoenix6.sim", + "artifactId": "simVictorSPX", + "version": "25.2.2", + "libName": "CTRE_SimVictorSPX", + "headerClassifier": "headers", + "sharedLibrary": true, + "skipInvalidPlatforms": true, + "binaryPlatforms": [ + "windowsx86-64", + "linuxx86-64", + "linuxarm64", + "osxuniversal" + ], + "simMode": "swsim" + }, + { + "groupId": "com.ctre.phoenix6.sim", + "artifactId": "simPigeonIMU", + "version": "25.2.2", + "libName": "CTRE_SimPigeonIMU", + "headerClassifier": "headers", + "sharedLibrary": true, + "skipInvalidPlatforms": true, + "binaryPlatforms": [ + "windowsx86-64", + "linuxx86-64", + "linuxarm64", + "osxuniversal" + ], + "simMode": "swsim" + }, + { + "groupId": "com.ctre.phoenix6.sim", + "artifactId": "simCANCoder", + "version": "25.2.2", + "libName": "CTRE_SimCANCoder", + "headerClassifier": "headers", + "sharedLibrary": true, + "skipInvalidPlatforms": true, + "binaryPlatforms": [ + "windowsx86-64", + "linuxx86-64", + "linuxarm64", + "osxuniversal" + ], + "simMode": "swsim" + }, + { + "groupId": "com.ctre.phoenix6.sim", + "artifactId": "simProTalonFX", + "version": "25.2.2", + "libName": "CTRE_SimProTalonFX", + "headerClassifier": "headers", + "sharedLibrary": true, + "skipInvalidPlatforms": true, + "binaryPlatforms": [ + "windowsx86-64", + "linuxx86-64", + "linuxarm64", + "osxuniversal" + ], + "simMode": "swsim" + }, + { + "groupId": "com.ctre.phoenix6.sim", + "artifactId": "simProTalonFXS", + "version": "25.2.2", + "libName": "CTRE_SimProTalonFXS", + "headerClassifier": "headers", + "sharedLibrary": true, + "skipInvalidPlatforms": true, + "binaryPlatforms": [ + "windowsx86-64", + "linuxx86-64", + "linuxarm64", + "osxuniversal" + ], + "simMode": "swsim" + }, + { + "groupId": "com.ctre.phoenix6.sim", + "artifactId": "simProCANcoder", + "version": "25.2.2", + "libName": "CTRE_SimProCANcoder", + "headerClassifier": "headers", + "sharedLibrary": true, + "skipInvalidPlatforms": true, + "binaryPlatforms": [ + "windowsx86-64", + "linuxx86-64", + "linuxarm64", + "osxuniversal" + ], + "simMode": "swsim" + }, + { + "groupId": "com.ctre.phoenix6.sim", + "artifactId": "simProPigeon2", + "version": "25.2.2", + "libName": "CTRE_SimProPigeon2", + "headerClassifier": "headers", + "sharedLibrary": true, + "skipInvalidPlatforms": true, + "binaryPlatforms": [ + "windowsx86-64", + "linuxx86-64", + "linuxarm64", + "osxuniversal" + ], + "simMode": "swsim" + }, + { + "groupId": "com.ctre.phoenix6.sim", + "artifactId": "simProCANrange", + "version": "25.2.2", + "libName": "CTRE_SimProCANrange", + "headerClassifier": "headers", + "sharedLibrary": true, + "skipInvalidPlatforms": true, + "binaryPlatforms": [ + "windowsx86-64", + "linuxx86-64", + "linuxarm64", + "osxuniversal" + ], + "simMode": "swsim" + } + ] +} \ No newline at end of file From 91b3e8a133c5f2aefff14576bb4c95c00a2ff8cb Mon Sep 17 00:00:00 2001 From: Jay McNeely Date: Fri, 7 Feb 2025 12:44:26 -0600 Subject: [PATCH 33/39] Started Applying Linting Changes. --- src/main/java/frc/robot/Constants.java | 19 ++- src/main/java/frc/robot/Main.java | 27 ++-- src/main/java/frc/robot/Robot.java | 170 +++++++++++--------- src/main/java/frc/robot/RobotContainer.java | 32 ++-- 4 files changed, 137 insertions(+), 111 deletions(-) diff --git a/src/main/java/frc/robot/Constants.java b/src/main/java/frc/robot/Constants.java index c50ba05..1a8fe26 100644 --- a/src/main/java/frc/robot/Constants.java +++ b/src/main/java/frc/robot/Constants.java @@ -5,15 +5,18 @@ 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. + * 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. + *

+ * 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 class OperatorConstants { - public static final int kDriverControllerPort = 0; - } + public static class OperatorConstants { + public static final int kDriverControllerPort = 0; + } } diff --git a/src/main/java/frc/robot/Main.java b/src/main/java/frc/robot/Main.java index 8776e5d..9a90b34 100644 --- a/src/main/java/frc/robot/Main.java +++ b/src/main/java/frc/robot/Main.java @@ -7,19 +7,22 @@ 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. + * 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() {} + 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); - } + /** + * 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/src/main/java/frc/robot/Robot.java b/src/main/java/frc/robot/Robot.java index 47d3d5a..0494bc1 100644 --- a/src/main/java/frc/robot/Robot.java +++ b/src/main/java/frc/robot/Robot.java @@ -9,93 +9,107 @@ import edu.wpi.first.wpilibj2.command.CommandScheduler; /** - * The methods in this class are called automatically 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 Main.java file in the project. + * The methods in this class are called automatically 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 Main.java file in the project. */ public class Robot extends TimedRobot { - private Command m_autonomousCommand; - - private final RobotContainer m_robotContainer; - - /** - * This function is run when the robot is first started up and should be used for any - * initialization code. - */ - public Robot() { - // 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 20 ms, 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(); + private Command m_autonomousCommand; + + private final RobotContainer m_robotContainer; + + /** + * This function is run when the robot is first started up and should be used + * for any initialization code. + */ + public Robot() { + // 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 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 every 20 ms, 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() {} + /** This function is called periodically during operator control. */ + @Override + public void teleopPeriodic() { + } - @Override - public void testInit() { + @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() {} + /** This function is called periodically during test mode. */ + @Override + public void testPeriodic() { + } - /** This function is called once when the robot is first started up. */ - @Override - public void simulationInit() {} + /** This function is called once when the robot is first started up. */ + @Override + public void simulationInit() { + } - /** This function is called periodically whilst in simulation. */ - @Override - public void simulationPeriodic() {} + /** This function is called periodically whilst in simulation. */ + @Override + public void simulationPeriodic() { + } } diff --git a/src/main/java/frc/robot/RobotContainer.java b/src/main/java/frc/robot/RobotContainer.java index a33249e..8d83aab 100644 --- a/src/main/java/frc/robot/RobotContainer.java +++ b/src/main/java/frc/robot/RobotContainer.java @@ -13,10 +13,11 @@ import edu.wpi.first.wpilibj2.command.button.Trigger; /** - * 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 trigger mappings) should be declared here. + * 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 trigger mappings) should be declared here. */ public class RobotContainer { // The robot's subsystems and commands are defined here... @@ -26,19 +27,24 @@ public class RobotContainer { private final CommandXboxController m_driverController = new CommandXboxController(OperatorConstants.kDriverControllerPort); - /** The container for the robot. Contains subsystems, OI devices, and commands. */ + /** The container for the robot. Contains subsystems, OI devices, and + * commands. + */ public RobotContainer() { // Configure the trigger bindings configureBindings(); } /** - * Use this method to define your trigger->command mappings. Triggers can be created via the - * {@link Trigger#Trigger(java.util.function.BooleanSupplier)} constructor with an arbitrary - * predicate, or via the named factories in {@link - * edu.wpi.first.wpilibj2.command.button.CommandGenericHID}'s subclasses for {@link - * CommandXboxController Xbox}/{@link edu.wpi.first.wpilibj2.command.button.CommandPS4Controller - * PS4} controllers or {@link edu.wpi.first.wpilibj2.command.button.CommandJoystick Flight + * Use this method to define your trigger->command mappings. Triggers can be + * created via the + * {@link Trigger#Trigger(java.util.function.BooleanSupplier)} constructor + * with an arbitrary predicate, or via the named factories in + * {@link edu.wpi.first.wpilibj2.command.button.CommandGenericHID}'s + * subclasses for {@link CommandXboxController Xbox}/ + * {@link edu.wpi.first.wpilibj2.command.button.CommandPS4Controller PS4} + * controllers or + * {@link edu.wpi.first.wpilibj2.command.button.CommandJoystick Flight * joysticks}. */ private void configureBindings() { @@ -46,8 +52,8 @@ private void configureBindings() { new Trigger(m_exampleSubsystem::exampleCondition) .onTrue(new ExampleCommand(m_exampleSubsystem)); - // Schedule `exampleMethodCommand` when the Xbox controller's B button is pressed, - // cancelling on release. + // Schedule `exampleMethodCommand` when the Xbox controller's B button is + // pressed, cancelling on release. m_driverController.b().whileTrue(m_exampleSubsystem.exampleMethodCommand()); } From b29545b64e486fb98ba9193050e019b7cb06c14f Mon Sep 17 00:00:00 2001 From: Jay McNeely Date: Fri, 14 Feb 2025 12:08:02 -0600 Subject: [PATCH 34/39] Added package-info.java files to comply wiht Java Docs. --- src/main/java/frc/robot/commands/package-info.java | 6 ++++++ src/main/java/frc/robot/package-info.java | 5 +++++ src/main/java/frc/robot/subsystems/package-info.java | 5 +++++ 3 files changed, 16 insertions(+) create mode 100644 src/main/java/frc/robot/commands/package-info.java create mode 100644 src/main/java/frc/robot/package-info.java create mode 100644 src/main/java/frc/robot/subsystems/package-info.java diff --git a/src/main/java/frc/robot/commands/package-info.java b/src/main/java/frc/robot/commands/package-info.java new file mode 100644 index 0000000..11e4f26 --- /dev/null +++ b/src/main/java/frc/robot/commands/package-info.java @@ -0,0 +1,6 @@ + +/** + * Base commands package that holds all current commands that are used in the + * robot + */ +package frc.robot.commands; diff --git a/src/main/java/frc/robot/package-info.java b/src/main/java/frc/robot/package-info.java new file mode 100644 index 0000000..23a1ffd --- /dev/null +++ b/src/main/java/frc/robot/package-info.java @@ -0,0 +1,5 @@ +/** + * This is the main robot package that holds all the code that is ran on the + * robot. Any extra files are held outside of this package such as json files + */ +package frc.robot; diff --git a/src/main/java/frc/robot/subsystems/package-info.java b/src/main/java/frc/robot/subsystems/package-info.java new file mode 100644 index 0000000..5fb5211 --- /dev/null +++ b/src/main/java/frc/robot/subsystems/package-info.java @@ -0,0 +1,5 @@ +/** + * Main subsystem package, this holds all the subsystems that are used on + * the robot + */ +package frc.robot.subsystems; From 69794831f3d203581c8a8efd77e68e91d4d42c2b Mon Sep 17 00:00:00 2001 From: Jay McNeely Date: Fri, 14 Feb 2025 12:12:27 -0600 Subject: [PATCH 35/39] Updated Files for Linting. --- .../frc/robot/commands/ExampleCommand.java | 19 ++++-- .../robot/subsystems/ExampleSubsystem.java | 67 ++++++++++--------- 2 files changed, 49 insertions(+), 37 deletions(-) diff --git a/src/main/java/frc/robot/commands/ExampleCommand.java b/src/main/java/frc/robot/commands/ExampleCommand.java index 7481d3c..33d51b4 100644 --- a/src/main/java/frc/robot/commands/ExampleCommand.java +++ b/src/main/java/frc/robot/commands/ExampleCommand.java @@ -8,16 +8,22 @@ import edu.wpi.first.wpilibj2.command.Command; /** An example command that uses an example subsystem. */ -public class ExampleCommand extends Command { +public final class ExampleCommand extends Command { @SuppressWarnings({"PMD.UnusedPrivateField", "PMD.SingularField"}) + + /** + * This is an example subsystem that should be used with this command + */ private final ExampleSubsystem m_subsystem; + // This would need to bbe surpressed as it's not an actual error and it quite + // standard in some use cases such as this one /** * Creates a new ExampleCommand. * * @param subsystem The subsystem used by this command. */ - public ExampleCommand(ExampleSubsystem subsystem) { + public ExampleCommand(final ExampleSubsystem subsystem) { m_subsystem = subsystem; // Use addRequirements() here to declare subsystem dependencies. addRequirements(subsystem); @@ -25,15 +31,18 @@ public ExampleCommand(ExampleSubsystem subsystem) { // Called when the command is initially scheduled. @Override - public void initialize() {} + public void initialize() { + } // Called every time the scheduler runs while the command is scheduled. @Override - public void execute() {} + public void execute() { + } // Called once the command ends or is interrupted. @Override - public void end(boolean interrupted) {} + public void end(final boolean interrupted) { + } // Returns true when the command should end. @Override diff --git a/src/main/java/frc/robot/subsystems/ExampleSubsystem.java b/src/main/java/frc/robot/subsystems/ExampleSubsystem.java index 6b375da..6f5b84f 100644 --- a/src/main/java/frc/robot/subsystems/ExampleSubsystem.java +++ b/src/main/java/frc/robot/subsystems/ExampleSubsystem.java @@ -8,40 +8,43 @@ import edu.wpi.first.wpilibj2.command.SubsystemBase; public class ExampleSubsystem extends SubsystemBase { - /** Creates a new ExampleSubsystem. */ - public ExampleSubsystem() {} + + /** Creates a new ExampleSubsystem. */ + public ExampleSubsystem() { + } - /** - * Example command factory method. - * - * @return a command - */ - public Command exampleMethodCommand() { - // Inline construction of command goes here. - // Subsystem::RunOnce implicitly requires `this` subsystem. - return runOnce( - () -> { - /* one-time action goes here */ - }); - } + /** + * Example command factory method. + * + * @return a command + */ + public Command exampleMethodCommand() { + // Inline construction of command goes here. + // Subsystem::RunOnce implicitly requires `this` subsystem. + return runOnce( + () -> { + /* one-time action goes here */ + }); + } - /** - * An example method querying a boolean state of the subsystem (for example, a digital sensor). - * - * @return value of some boolean subsystem state, such as a digital sensor. - */ - public boolean exampleCondition() { - // Query some boolean state, such as a digital sensor. - return false; - } + /** + * An example method querying a boolean state of the subsystem (for + * example, a digital sensor). + * + * @return value of some boolean subsystem state, such as a digital sensor. + */ + public boolean exampleCondition() { + // Query some boolean state, such as a digital sensor. + return false; + } - @Override - public void periodic() { - // This method will be called once per scheduler run - } + @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 - } + @Override + public void simulationPeriodic() { + // This method will be called once per scheduler run during simulation + } } From 14f1a102e954ca495849fc92da61b81df45df3cb Mon Sep 17 00:00:00 2001 From: Jay Date: Fri, 14 Feb 2025 12:14:16 -0600 Subject: [PATCH 36/39] Delete vendordeps/Phoenix6-25.1.0.json --- vendordeps/Phoenix6-25.1.0.json | 389 -------------------------------- 1 file changed, 389 deletions(-) delete mode 100644 vendordeps/Phoenix6-25.1.0.json diff --git a/vendordeps/Phoenix6-25.1.0.json b/vendordeps/Phoenix6-25.1.0.json deleted file mode 100644 index 473f6a8..0000000 --- a/vendordeps/Phoenix6-25.1.0.json +++ /dev/null @@ -1,389 +0,0 @@ -{ - "fileName": "Phoenix6-25.1.0.json", - "name": "CTRE-Phoenix (v6)", - "version": "25.1.0", - "frcYear": "2025", - "uuid": "e995de00-2c64-4df5-8831-c1441420ff19", - "mavenUrls": [ - "https://maven.ctr-electronics.com/release/" - ], - "jsonUrl": "https://maven.ctr-electronics.com/release/com/ctre/phoenix6/latest/Phoenix6-frc2025-latest.json", - "conflictsWith": [ - { - "uuid": "e7900d8d-826f-4dca-a1ff-182f658e98af", - "errorMessage": "Users can not have both the replay and regular Phoenix 6 vendordeps in their robot program.", - "offlineFileName": "Phoenix6-replay-frc2025-latest.json" - } - ], - "javaDependencies": [ - { - "groupId": "com.ctre.phoenix6", - "artifactId": "wpiapi-java", - "version": "25.1.0" - } - ], - "jniDependencies": [ - { - "groupId": "com.ctre.phoenix6", - "artifactId": "api-cpp", - "version": "25.1.0", - "isJar": false, - "skipInvalidPlatforms": true, - "validPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxarm64", - "linuxathena" - ], - "simMode": "hwsim" - }, - { - "groupId": "com.ctre.phoenix6", - "artifactId": "tools", - "version": "25.1.0", - "isJar": false, - "skipInvalidPlatforms": true, - "validPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxarm64", - "linuxathena" - ], - "simMode": "hwsim" - }, - { - "groupId": "com.ctre.phoenix6.sim", - "artifactId": "api-cpp-sim", - "version": "25.1.0", - "isJar": false, - "skipInvalidPlatforms": true, - "validPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxarm64", - "osxuniversal" - ], - "simMode": "swsim" - }, - { - "groupId": "com.ctre.phoenix6.sim", - "artifactId": "tools-sim", - "version": "25.1.0", - "isJar": false, - "skipInvalidPlatforms": true, - "validPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxarm64", - "osxuniversal" - ], - "simMode": "swsim" - }, - { - "groupId": "com.ctre.phoenix6.sim", - "artifactId": "simTalonSRX", - "version": "25.1.0", - "isJar": false, - "skipInvalidPlatforms": true, - "validPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxarm64", - "osxuniversal" - ], - "simMode": "swsim" - }, - { - "groupId": "com.ctre.phoenix6.sim", - "artifactId": "simVictorSPX", - "version": "25.1.0", - "isJar": false, - "skipInvalidPlatforms": true, - "validPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxarm64", - "osxuniversal" - ], - "simMode": "swsim" - }, - { - "groupId": "com.ctre.phoenix6.sim", - "artifactId": "simPigeonIMU", - "version": "25.1.0", - "isJar": false, - "skipInvalidPlatforms": true, - "validPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxarm64", - "osxuniversal" - ], - "simMode": "swsim" - }, - { - "groupId": "com.ctre.phoenix6.sim", - "artifactId": "simCANCoder", - "version": "25.1.0", - "isJar": false, - "skipInvalidPlatforms": true, - "validPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxarm64", - "osxuniversal" - ], - "simMode": "swsim" - }, - { - "groupId": "com.ctre.phoenix6.sim", - "artifactId": "simProTalonFX", - "version": "25.1.0", - "isJar": false, - "skipInvalidPlatforms": true, - "validPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxarm64", - "osxuniversal" - ], - "simMode": "swsim" - }, - { - "groupId": "com.ctre.phoenix6.sim", - "artifactId": "simProCANcoder", - "version": "25.1.0", - "isJar": false, - "skipInvalidPlatforms": true, - "validPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxarm64", - "osxuniversal" - ], - "simMode": "swsim" - }, - { - "groupId": "com.ctre.phoenix6.sim", - "artifactId": "simProPigeon2", - "version": "25.1.0", - "isJar": false, - "skipInvalidPlatforms": true, - "validPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxarm64", - "osxuniversal" - ], - "simMode": "swsim" - }, - { - "groupId": "com.ctre.phoenix6.sim", - "artifactId": "simProCANrange", - "version": "25.1.0", - "isJar": false, - "skipInvalidPlatforms": true, - "validPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxarm64", - "osxuniversal" - ], - "simMode": "swsim" - } - ], - "cppDependencies": [ - { - "groupId": "com.ctre.phoenix6", - "artifactId": "wpiapi-cpp", - "version": "25.1.0", - "libName": "CTRE_Phoenix6_WPI", - "headerClassifier": "headers", - "sharedLibrary": true, - "skipInvalidPlatforms": true, - "binaryPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxarm64", - "linuxathena" - ], - "simMode": "hwsim" - }, - { - "groupId": "com.ctre.phoenix6", - "artifactId": "tools", - "version": "25.1.0", - "libName": "CTRE_PhoenixTools", - "headerClassifier": "headers", - "sharedLibrary": true, - "skipInvalidPlatforms": true, - "binaryPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxarm64", - "linuxathena" - ], - "simMode": "hwsim" - }, - { - "groupId": "com.ctre.phoenix6.sim", - "artifactId": "wpiapi-cpp-sim", - "version": "25.1.0", - "libName": "CTRE_Phoenix6_WPISim", - "headerClassifier": "headers", - "sharedLibrary": true, - "skipInvalidPlatforms": true, - "binaryPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxarm64", - "osxuniversal" - ], - "simMode": "swsim" - }, - { - "groupId": "com.ctre.phoenix6.sim", - "artifactId": "tools-sim", - "version": "25.1.0", - "libName": "CTRE_PhoenixTools_Sim", - "headerClassifier": "headers", - "sharedLibrary": true, - "skipInvalidPlatforms": true, - "binaryPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxarm64", - "osxuniversal" - ], - "simMode": "swsim" - }, - { - "groupId": "com.ctre.phoenix6.sim", - "artifactId": "simTalonSRX", - "version": "25.1.0", - "libName": "CTRE_SimTalonSRX", - "headerClassifier": "headers", - "sharedLibrary": true, - "skipInvalidPlatforms": true, - "binaryPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxarm64", - "osxuniversal" - ], - "simMode": "swsim" - }, - { - "groupId": "com.ctre.phoenix6.sim", - "artifactId": "simVictorSPX", - "version": "25.1.0", - "libName": "CTRE_SimVictorSPX", - "headerClassifier": "headers", - "sharedLibrary": true, - "skipInvalidPlatforms": true, - "binaryPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxarm64", - "osxuniversal" - ], - "simMode": "swsim" - }, - { - "groupId": "com.ctre.phoenix6.sim", - "artifactId": "simPigeonIMU", - "version": "25.1.0", - "libName": "CTRE_SimPigeonIMU", - "headerClassifier": "headers", - "sharedLibrary": true, - "skipInvalidPlatforms": true, - "binaryPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxarm64", - "osxuniversal" - ], - "simMode": "swsim" - }, - { - "groupId": "com.ctre.phoenix6.sim", - "artifactId": "simCANCoder", - "version": "25.1.0", - "libName": "CTRE_SimCANCoder", - "headerClassifier": "headers", - "sharedLibrary": true, - "skipInvalidPlatforms": true, - "binaryPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxarm64", - "osxuniversal" - ], - "simMode": "swsim" - }, - { - "groupId": "com.ctre.phoenix6.sim", - "artifactId": "simProTalonFX", - "version": "25.1.0", - "libName": "CTRE_SimProTalonFX", - "headerClassifier": "headers", - "sharedLibrary": true, - "skipInvalidPlatforms": true, - "binaryPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxarm64", - "osxuniversal" - ], - "simMode": "swsim" - }, - { - "groupId": "com.ctre.phoenix6.sim", - "artifactId": "simProCANcoder", - "version": "25.1.0", - "libName": "CTRE_SimProCANcoder", - "headerClassifier": "headers", - "sharedLibrary": true, - "skipInvalidPlatforms": true, - "binaryPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxarm64", - "osxuniversal" - ], - "simMode": "swsim" - }, - { - "groupId": "com.ctre.phoenix6.sim", - "artifactId": "simProPigeon2", - "version": "25.1.0", - "libName": "CTRE_SimProPigeon2", - "headerClassifier": "headers", - "sharedLibrary": true, - "skipInvalidPlatforms": true, - "binaryPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxarm64", - "osxuniversal" - ], - "simMode": "swsim" - }, - { - "groupId": "com.ctre.phoenix6.sim", - "artifactId": "simProCANrange", - "version": "25.1.0", - "libName": "CTRE_SimProCANrange", - "headerClassifier": "headers", - "sharedLibrary": true, - "skipInvalidPlatforms": true, - "binaryPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxarm64", - "osxuniversal" - ], - "simMode": "swsim" - } - ] -} \ No newline at end of file From 9831973dd345be7f6bebc21d0a3fce59032084fa Mon Sep 17 00:00:00 2001 From: Jay Date: Fri, 14 Feb 2025 12:14:26 -0600 Subject: [PATCH 37/39] Delete vendordeps/Phoenix5-5.35.1.json --- vendordeps/Phoenix5-5.35.1.json | 171 -------------------------------- 1 file changed, 171 deletions(-) delete mode 100644 vendordeps/Phoenix5-5.35.1.json diff --git a/vendordeps/Phoenix5-5.35.1.json b/vendordeps/Phoenix5-5.35.1.json deleted file mode 100644 index 69df8b5..0000000 --- a/vendordeps/Phoenix5-5.35.1.json +++ /dev/null @@ -1,171 +0,0 @@ -{ - "fileName": "Phoenix5-5.35.1.json", - "name": "CTRE-Phoenix (v5)", - "version": "5.35.1", - "frcYear": "2025", - "uuid": "ab676553-b602-441f-a38d-f1296eff6537", - "mavenUrls": [ - "https://maven.ctr-electronics.com/release/" - ], - "jsonUrl": "https://maven.ctr-electronics.com/release/com/ctre/phoenix/Phoenix5-frc2025-latest.json", - "requires": [ - { - "uuid": "e995de00-2c64-4df5-8831-c1441420ff19", - "errorMessage": "Phoenix 5 requires low-level libraries from Phoenix 6. Please add the Phoenix 6 vendordep before adding Phoenix 5.", - "offlineFileName": "Phoenix6-frc2025-latest.json", - "onlineUrl": "https://maven.ctr-electronics.com/release/com/ctre/phoenix6/latest/Phoenix6-frc2025-latest.json" - } - ], - "conflictsWith": [ - { - "uuid": "e7900d8d-826f-4dca-a1ff-182f658e98af", - "errorMessage": "Users must use the Phoenix 5 replay vendordep when using the Phoenix 6 replay vendordep.", - "offlineFileName": "Phoenix6-replay-frc2025-latest.json" - }, - { - "uuid": "fbc886a4-2cec-40c0-9835-71086a8cc3df", - "errorMessage": "Users cannot have both the replay and regular Phoenix 5 vendordeps in their robot program.", - "offlineFileName": "Phoenix5-replay-frc2025-latest.json" - } - ], - "javaDependencies": [ - { - "groupId": "com.ctre.phoenix", - "artifactId": "api-java", - "version": "5.35.1" - }, - { - "groupId": "com.ctre.phoenix", - "artifactId": "wpiapi-java", - "version": "5.35.1" - } - ], - "jniDependencies": [ - { - "groupId": "com.ctre.phoenix", - "artifactId": "cci", - "version": "5.35.1", - "isJar": false, - "skipInvalidPlatforms": true, - "validPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxarm64", - "linuxathena" - ], - "simMode": "hwsim" - }, - { - "groupId": "com.ctre.phoenix.sim", - "artifactId": "cci-sim", - "version": "5.35.1", - "isJar": false, - "skipInvalidPlatforms": true, - "validPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxarm64", - "osxuniversal" - ], - "simMode": "swsim" - } - ], - "cppDependencies": [ - { - "groupId": "com.ctre.phoenix", - "artifactId": "wpiapi-cpp", - "version": "5.35.1", - "libName": "CTRE_Phoenix_WPI", - "headerClassifier": "headers", - "sharedLibrary": true, - "skipInvalidPlatforms": true, - "binaryPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxarm64", - "linuxathena" - ], - "simMode": "hwsim" - }, - { - "groupId": "com.ctre.phoenix", - "artifactId": "api-cpp", - "version": "5.35.1", - "libName": "CTRE_Phoenix", - "headerClassifier": "headers", - "sharedLibrary": true, - "skipInvalidPlatforms": true, - "binaryPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxarm64", - "linuxathena" - ], - "simMode": "hwsim" - }, - { - "groupId": "com.ctre.phoenix", - "artifactId": "cci", - "version": "5.35.1", - "libName": "CTRE_PhoenixCCI", - "headerClassifier": "headers", - "sharedLibrary": true, - "skipInvalidPlatforms": true, - "binaryPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxarm64", - "linuxathena" - ], - "simMode": "hwsim" - }, - { - "groupId": "com.ctre.phoenix.sim", - "artifactId": "wpiapi-cpp-sim", - "version": "5.35.1", - "libName": "CTRE_Phoenix_WPISim", - "headerClassifier": "headers", - "sharedLibrary": true, - "skipInvalidPlatforms": true, - "binaryPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxarm64", - "osxuniversal" - ], - "simMode": "swsim" - }, - { - "groupId": "com.ctre.phoenix.sim", - "artifactId": "api-cpp-sim", - "version": "5.35.1", - "libName": "CTRE_PhoenixSim", - "headerClassifier": "headers", - "sharedLibrary": true, - "skipInvalidPlatforms": true, - "binaryPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxarm64", - "osxuniversal" - ], - "simMode": "swsim" - }, - { - "groupId": "com.ctre.phoenix.sim", - "artifactId": "cci-sim", - "version": "5.35.1", - "libName": "CTRE_PhoenixCCISim", - "headerClassifier": "headers", - "sharedLibrary": true, - "skipInvalidPlatforms": true, - "binaryPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "linuxarm64", - "osxuniversal" - ], - "simMode": "swsim" - } - ] -} \ No newline at end of file From 6349a274df810900ddd042eebde72a7fa7267d70 Mon Sep 17 00:00:00 2001 From: Jay Date: Fri, 14 Feb 2025 12:14:36 -0600 Subject: [PATCH 38/39] Delete vendordeps/PathplannerLib-2025.2.1.json --- vendordeps/PathplannerLib-2025.2.1.json | 38 ------------------------- 1 file changed, 38 deletions(-) delete mode 100644 vendordeps/PathplannerLib-2025.2.1.json diff --git a/vendordeps/PathplannerLib-2025.2.1.json b/vendordeps/PathplannerLib-2025.2.1.json deleted file mode 100644 index 71e25f3..0000000 --- a/vendordeps/PathplannerLib-2025.2.1.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "fileName": "PathplannerLib-2025.2.1.json", - "name": "PathplannerLib", - "version": "2025.2.1", - "uuid": "1b42324f-17c6-4875-8e77-1c312bc8c786", - "frcYear": "2025", - "mavenUrls": [ - "https://3015rangerrobotics.github.io/pathplannerlib/repo" - ], - "jsonUrl": "https://3015rangerrobotics.github.io/pathplannerlib/PathplannerLib.json", - "javaDependencies": [ - { - "groupId": "com.pathplanner.lib", - "artifactId": "PathplannerLib-java", - "version": "2025.2.1" - } - ], - "jniDependencies": [], - "cppDependencies": [ - { - "groupId": "com.pathplanner.lib", - "artifactId": "PathplannerLib-cpp", - "version": "2025.2.1", - "libName": "PathplannerLib", - "headerClassifier": "headers", - "sharedLibrary": false, - "skipInvalidPlatforms": true, - "binaryPlatforms": [ - "windowsx86-64", - "linuxx86-64", - "osxuniversal", - "linuxathena", - "linuxarm32", - "linuxarm64" - ] - } - ] -} \ No newline at end of file From acc8a0b89f3eb626b82e0b073f451557fd08f402 Mon Sep 17 00:00:00 2001 From: Jay McNeely Date: Sat, 15 Feb 2025 12:05:23 -0600 Subject: [PATCH 39/39] More linting changes. --- src/main/java/frc/robot/Constants.java | 4 ++++ src/main/java/frc/robot/Main.java | 4 +++- src/main/java/frc/robot/Robot.java | 9 +++++---- src/main/java/frc/robot/RobotContainer.java | 10 +++++++++- src/main/java/frc/robot/commands/package-info.java | 6 +++--- src/main/java/frc/robot/package-info.java | 6 ++++-- .../java/frc/robot/subsystems/ExampleSubsystem.java | 2 +- src/main/java/frc/robot/subsystems/package-info.java | 5 +++-- 8 files changed, 32 insertions(+), 14 deletions(-) diff --git a/src/main/java/frc/robot/Constants.java b/src/main/java/frc/robot/Constants.java index 1a8fe26..6da57f3 100644 --- a/src/main/java/frc/robot/Constants.java +++ b/src/main/java/frc/robot/Constants.java @@ -17,6 +17,10 @@ */ public final class Constants { public static class OperatorConstants { + + /** + * An example constant. Any of those can be put in here + */ public static final int kDriverControllerPort = 0; } } diff --git a/src/main/java/frc/robot/Main.java b/src/main/java/frc/robot/Main.java index 9a90b34..a9fe0d0 100644 --- a/src/main/java/frc/robot/Main.java +++ b/src/main/java/frc/robot/Main.java @@ -21,8 +21,10 @@ private Main() { *

* If you change your main robot class, change the parameter type. *

+ * + * @param args Any arguments passed into main */ - public static void main(String... args) { + public static void main(final String... args) { RobotBase.startRobot(Robot::new); } } diff --git a/src/main/java/frc/robot/Robot.java b/src/main/java/frc/robot/Robot.java index 0494bc1..c2f9dbc 100644 --- a/src/main/java/frc/robot/Robot.java +++ b/src/main/java/frc/robot/Robot.java @@ -14,7 +14,7 @@ * of this class or the package after creating this project, you must also * update the Main.java file in the project. */ -public class Robot extends TimedRobot { +public final class Robot extends TimedRobot { private Command m_autonomousCommand; private final RobotContainer m_robotContainer; @@ -41,9 +41,10 @@ public Robot() { */ @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 + // 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(); } diff --git a/src/main/java/frc/robot/RobotContainer.java b/src/main/java/frc/robot/RobotContainer.java index 8d83aab..40a816f 100644 --- a/src/main/java/frc/robot/RobotContainer.java +++ b/src/main/java/frc/robot/RobotContainer.java @@ -21,9 +21,17 @@ */ public class RobotContainer { // The robot's subsystems and commands are defined here... + + /** + * This is where any subsystems would get initialized + */ private final ExampleSubsystem m_exampleSubsystem = new ExampleSubsystem(); - // Replace with CommandPS4Controller or CommandJoystick if needed + /** + * The controller to use as the drive controller + * + * This can be replace with CommandPS4Controller or CommandJoystick if needed + */ private final CommandXboxController m_driverController = new CommandXboxController(OperatorConstants.kDriverControllerPort); diff --git a/src/main/java/frc/robot/commands/package-info.java b/src/main/java/frc/robot/commands/package-info.java index 11e4f26..1f43eb0 100644 --- a/src/main/java/frc/robot/commands/package-info.java +++ b/src/main/java/frc/robot/commands/package-info.java @@ -1,6 +1,6 @@ - /** - * Base commands package that holds all current commands that are used in the - * robot + * Base commands package. + * + * This holds all current commands that are used in the robot */ package frc.robot.commands; diff --git a/src/main/java/frc/robot/package-info.java b/src/main/java/frc/robot/package-info.java index 23a1ffd..cccb4d7 100644 --- a/src/main/java/frc/robot/package-info.java +++ b/src/main/java/frc/robot/package-info.java @@ -1,5 +1,7 @@ /** - * This is the main robot package that holds all the code that is ran on the - * robot. Any extra files are held outside of this package such as json files + * Main robot package. + * + * This holds all the code that is ran on the robot. Any extra files are held + * outside of this package such as json files */ package frc.robot; diff --git a/src/main/java/frc/robot/subsystems/ExampleSubsystem.java b/src/main/java/frc/robot/subsystems/ExampleSubsystem.java index 6f5b84f..5f2afe0 100644 --- a/src/main/java/frc/robot/subsystems/ExampleSubsystem.java +++ b/src/main/java/frc/robot/subsystems/ExampleSubsystem.java @@ -8,7 +8,7 @@ import edu.wpi.first.wpilibj2.command.SubsystemBase; public class ExampleSubsystem extends SubsystemBase { - + /** Creates a new ExampleSubsystem. */ public ExampleSubsystem() { } diff --git a/src/main/java/frc/robot/subsystems/package-info.java b/src/main/java/frc/robot/subsystems/package-info.java index 5fb5211..2092498 100644 --- a/src/main/java/frc/robot/subsystems/package-info.java +++ b/src/main/java/frc/robot/subsystems/package-info.java @@ -1,5 +1,6 @@ /** - * Main subsystem package, this holds all the subsystems that are used on - * the robot + * Main subsystem package. + * + * This holds all the subsystems that are used on the robot */ package frc.robot.subsystems;