diff --git a/.editorconfig b/.editorconfig
new file mode 100644
index 0000000..acda138
--- /dev/null
+++ b/.editorconfig
@@ -0,0 +1,15 @@
+# EditorConfig is awesome: https://EditorConfig.org
+
+# top-most EditorConfig file
+root = true
+
+# Unix-style newlines with a newline ending every file
+[*]
+end_of_line = lf
+insert_final_newline = true
+trim_trailing_whitespace = true
+
+# 4 space indentation
+[*.java]
+indent_style = space
+indent_size = 4
diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 0000000..dfe0770
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1,2 @@
+# Auto detect text files and perform LF normalization
+* text=auto
diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml
new file mode 100644
index 0000000..e16335c
--- /dev/null
+++ b/.github/workflows/main.yml
@@ -0,0 +1,81 @@
+# This is a basic workflow to help you get started with Actions
+
+name: CI
+
+# Controls when the action will run.
+on:
+ # Triggers the workflow on push
+ push:
+ # Allows you to run this workflow manually from the Actions tab
+ workflow_dispatch:
+
+# A workflow run is made up of one or more jobs that can run sequentially or in parallel
+jobs:
+ linting:
+ name: Linting
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v3 # v2 minimum required
+ - name: Run check style
+ uses: nikitasavinov/checkstyle-action@master
+ with:
+ github_token: ${{ secrets.GITHUB_TOKEN }}
+ reporter: 'github-check'
+ tool_name: 'testtool'
+ fail_on_error: true
+ filter_mode: nofilter
+ level: error
+ checkstyle_config: checks.xml
+ checkstyle_version: '9.2.1'
+ spell_check:
+ name: Spell Check
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v3 # v2 minimum required
+ - name: Run Spell Check
+ uses: codespell-project/actions-codespell@master
+ with:
+ check_filenames: true
+ merge_conflict_job:
+ runs-on: ubuntu-latest
+ name: Find merge conflicts
+ steps:
+ # Checkout the source code so there are some files to look at.
+ - uses: actions/checkout@v3
+ # Run the actual merge conflict finder
+ - name: Merge Conflict finder
+ uses: olivernybroe/action-conflict-finder@v4.0
+ javadoc:
+ name: Test Javadocs Generation
+ # The type of runner that the job will run on
+ runs-on: ubuntu-22.04
+ # This grabs the WPILib docker container
+ container: wpilib/roborio-cross-ubuntu:2023-22.04
+ # Steps represent a sequence of tasks that will be executed as part of the job
+ steps:
+ # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
+ - uses: actions/checkout@v3
+ # Grant execute permission for gradlew
+ - name: Grant execute permission for gradlew
+ run: chmod +x gradlew
+ # Runs a single command using the runners shell
+ - name: Create Javadocs
+ run: ./gradlew javadoc
+ build:
+ name: Build
+ # The type of runner that the job will run on
+ runs-on: ubuntu-22.04
+ # This grabs the WPILib docker container
+ container: wpilib/roborio-cross-ubuntu:2023-22.04
+ # Steps represent a sequence of tasks that will be executed as part of the job
+ steps:
+ # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
+ - uses: actions/checkout@v3
+ # Grant execute permission for gradlew
+ - name: Grant execute permission for gradlew
+ run: chmod +x gradlew
+ # Runs a single command using the runners shell
+ - name: Compile and run tests on robot code
+ run: ./gradlew build
diff --git a/.github/workflows/pages.yml b/.github/workflows/pages.yml
new file mode 100644
index 0000000..f893315
--- /dev/null
+++ b/.github/workflows/pages.yml
@@ -0,0 +1,51 @@
+# This is a basic workflow to help you get started with Actions
+
+name: Javadoc
+
+# Controls when the action will run.
+on:
+ # Triggers the workflow on push
+ push:
+ branches:
+ - main
+ # Allows you to run this workflow manually from the Actions tab
+ workflow_dispatch:
+
+permissions:
+ contents: read
+ pages: write
+ id-token: write
+
+concurrency:
+ group: "pages"
+ cancel-in-progress: true
+
+jobs:
+ javadoc:
+ environment:
+ name: github-pages
+ url: ${{ steps.deployment.outputs.page_url }}
+ name: Generate Javadocs
+ # The type of runner that the job will run on
+ runs-on: ubuntu-22.04
+ # This grabs the WPILib docker container
+ container: wpilib/roborio-cross-ubuntu:2023-22.04
+ # Steps represent a sequence of tasks that will be executed as part of the job
+ steps:
+ # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
+ - uses: actions/checkout@v3
+ # Grant execute permission for gradlew
+ - name: Grant execute permission for gradlew
+ run: chmod +x gradlew
+ # Runs a single command using the runners shell
+ - name: Create Javadocs
+ run: ./gradlew javadoc
+ - name: Setup Pages
+ uses: actions/configure-pages@v3
+ - name: Upload artifact
+ uses: actions/upload-pages-artifact@v1
+ with:
+ path: './build/docs/javadoc'
+ - name: Deploy to Github Pages
+ id: deployment
+ uses: actions/deploy-pages@v1
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..9535c83
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,162 @@
+# This gitignore has been specially created by the WPILib team.
+# If you remove items from this file, intellisense might break.
+
+### C++ ###
+# Prerequisites
+*.d
+
+# Compiled Object files
+*.slo
+*.lo
+*.o
+*.obj
+
+# Precompiled Headers
+*.gch
+*.pch
+
+# Compiled Dynamic libraries
+*.so
+*.dylib
+*.dll
+
+# Fortran module files
+*.mod
+*.smod
+
+# Compiled Static libraries
+*.lai
+*.la
+*.a
+*.lib
+
+# Executables
+*.exe
+*.out
+*.app
+
+### Java ###
+# Compiled class file
+*.class
+
+# Log file
+*.log
+
+# BlueJ files
+*.ctxt
+
+# Mobile Tools for Java (J2ME)
+.mtj.tmp/
+
+# Package Files #
+*.jar
+*.war
+*.nar
+*.ear
+*.zip
+*.tar.gz
+*.rar
+
+# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
+hs_err_pid*
+
+### Linux ###
+*~
+
+# temporary files which can be created if a process still has a handle open of a deleted file
+.fuse_hidden*
+
+# KDE directory preferences
+.directory
+
+# Linux trash folder which might appear on any partition or disk
+.Trash-*
+
+# .nfs files are created when an open file is removed but is still being accessed
+.nfs*
+
+### macOS ###
+# General
+.DS_Store
+.AppleDouble
+.LSOverride
+
+# Icon must end with two \r
+Icon
+
+# Thumbnails
+._*
+
+# Files that might appear in the root of a volume
+.DocumentRevisions-V100
+.fseventsd
+.Spotlight-V100
+.TemporaryItems
+.Trashes
+.VolumeIcon.icns
+.com.apple.timemachine.donotpresent
+
+# Directories potentially created on remote AFP share
+.AppleDB
+.AppleDesktop
+Network Trash Folder
+Temporary Items
+.apdisk
+
+### VisualStudioCode ###
+.vscode/*
+!.vscode/settings.json
+!.vscode/tasks.json
+!.vscode/launch.json
+!.vscode/extensions.json
+
+### Windows ###
+# Windows thumbnail cache files
+Thumbs.db
+ehthumbs.db
+ehthumbs_vista.db
+
+# Dump file
+*.stackdump
+
+# Folder config file
+[Dd]esktop.ini
+
+# Recycle Bin used on file shares
+$RECYCLE.BIN/
+
+# Windows Installer files
+*.cab
+*.msi
+*.msix
+*.msm
+*.msp
+
+# Windows shortcuts
+*.lnk
+
+### Gradle ###
+.gradle
+/build/
+
+# Ignore Gradle GUI config
+gradle-app.setting
+
+# Avoid ignoring Gradle wrapper jar file (.jar files are usually ignored)
+!gradle-wrapper.jar
+
+# Cache of project
+.gradletasknamecache
+
+# # Work around https://youtrack.jetbrains.com/issue/IDEA-116898
+# gradle/wrapper/gradle-wrapper.properties
+
+# # VS Code Specific Java Settings
+# DO NOT REMOVE .classpath and .project
+.classpath
+.project
+.settings/
+bin/
+
+# Simulation GUI and other tools window save file
+*-window.json
diff --git a/.vscode/extensions.json b/.vscode/extensions.json
new file mode 100644
index 0000000..f78081d
--- /dev/null
+++ b/.vscode/extensions.json
@@ -0,0 +1,11 @@
+{
+ "recommendations": [
+ "vscjava.vscode-java-debug",
+ "editorconfig.editorconfig",
+ "vscjava.vscode-java-pack",
+ "github.vscode-pull-request-github",
+ "eamodio.gitlens",
+ "redhat.java",
+ "wpilibsuite.vscode-wpilib"
+ ]
+}
diff --git a/.vscode/launch.json b/.vscode/launch.json
new file mode 100644
index 0000000..c9c9713
--- /dev/null
+++ b/.vscode/launch.json
@@ -0,0 +1,21 @@
+{
+ // Use IntelliSense to learn about possible attributes.
+ // Hover to view descriptions of existing attributes.
+ // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
+ "version": "0.2.0",
+ "configurations": [
+
+ {
+ "type": "wpilib",
+ "name": "WPILib Desktop Debug",
+ "request": "launch",
+ "desktop": true,
+ },
+ {
+ "type": "wpilib",
+ "name": "WPILib roboRIO Debug",
+ "request": "launch",
+ "desktop": false,
+ }
+ ]
+}
diff --git a/.vscode/settings.json b/.vscode/settings.json
new file mode 100644
index 0000000..5a9bb23
--- /dev/null
+++ b/.vscode/settings.json
@@ -0,0 +1,42 @@
+{
+ "java.configuration.updateBuildConfiguration": "automatic",
+ "java.server.launchMode": "Standard",
+ "files.exclude": {
+ "**/.git": true,
+ "**/.svn": true,
+ "**/.hg": true,
+ "**/CVS": true,
+ "**/.DS_Store": true,
+ "bin/": true,
+ "**/.classpath": true,
+ "**/.project": true,
+ "**/.settings": true,
+ "**/.factorypath": true,
+ "**/*~": true
+ },
+ "java.test.config": [
+ {
+ "name": "WPIlibUnitTests",
+ "workingDirectory": "${workspaceFolder}/build/jni/release",
+ "vmargs": [
+ "-Djava.library.path=${workspaceFolder}/build/jni/release"
+ ],
+ "env": {
+ "LD_LIBRARY_PATH": "${workspaceFolder}/build/jni/release",
+ "DYLD_LIBRARY_PATH": "${workspaceFolder}/build/jni/release"
+ }
+ },
+ ],
+ "java.test.defaultConfig": "WPIlibUnitTests",
+ "java.format.settings.url": "formatter.xml",
+ "java.format.settings.profile": "GoogleStyle",
+ "[java]": {
+ "editor.defaultFormatter": "redhat.java",
+ },
+ "editor.codeActionsOnSave": {
+ "source.organizeImports": true
+ },
+ "editor.formatOnSave": true,
+ "editor.formatOnPaste": true,
+ "terminal.integrated.defaultProfile.windows": "Git Bash"
+}
diff --git a/.wpilib/wpilib_preferences.json b/.wpilib/wpilib_preferences.json
new file mode 100644
index 0000000..027c91d
--- /dev/null
+++ b/.wpilib/wpilib_preferences.json
@@ -0,0 +1,6 @@
+{
+ "enableCppIntellisense": false,
+ "currentLanguage": "java",
+ "projectYear": "2023",
+ "teamNumber": 5572
+}
\ No newline at end of file
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..b81307b
--- /dev/null
+++ b/README.md
@@ -0,0 +1,7 @@
+# Java-Template
+[![CI](https://github.com/Frc5572/FRC2023/actions/workflows/main.yml/badge.svg)](https://github.com/Frc5572/FRC2023/actions/workflows/main.yml) [![Java Docs](https://img.shields.io/badge/docs-20XX-blue)](https://frc5572.github.io/Java-Template/)
+
+
+Template repo for Java template
+
+Good examples can be found https://github.com/wpilibsuite/allwpilib/tree/main/wpilibjExamples/src/main/java/edu/wpi/first/wpilibj/examples
diff --git a/WPILib-License.md b/WPILib-License.md
new file mode 100644
index 0000000..3d5a824
--- /dev/null
+++ b/WPILib-License.md
@@ -0,0 +1,24 @@
+Copyright (c) 2009-2021 FIRST and other WPILib contributors
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ * Neither the name of FIRST, WPILib, nor the names of other WPILib
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY FIRST AND OTHER WPILIB CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY NONINFRINGEMENT AND FITNESS FOR A PARTICULAR
+PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL FIRST OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/build.gradle b/build.gradle
new file mode 100644
index 0000000..8a0b7d7
--- /dev/null
+++ b/build.gradle
@@ -0,0 +1,109 @@
+plugins {
+ id "java"
+ id "edu.wpi.first.GradleRIO" version "2023.4.2"
+}
+
+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'
+}
+
+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'
+}
+
+javadoc {
+ configure(options) {
+ options.addBooleanOption("-allow-script-in-comments",true)
+ options.addStringOption("link", "https://first.wpi.edu/wpilib/allwpilib/docs/release/java")
+ options.header = ""
+ }
+}
diff --git a/checks.xml b/checks.xml
new file mode 100644
index 0000000..f4f41c5
--- /dev/null
+++ b/checks.xml
@@ -0,0 +1,373 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/formatter.xml b/formatter.xml
new file mode 100644
index 0000000..bab800e
--- /dev/null
+++ b/formatter.xml
@@ -0,0 +1,337 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 0000000..249e583
Binary files /dev/null and b/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 0000000..c23a1b3
--- /dev/null
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,5 @@
+distributionBase=GRADLE_USER_HOME
+distributionPath=permwrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-bin.zip
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=permwrapper/dists
diff --git a/gradlew b/gradlew
new file mode 100755
index 0000000..a69d9cb
--- /dev/null
+++ b/gradlew
@@ -0,0 +1,240 @@
+#!/bin/sh
+
+#
+# Copyright © 2015-2021 the original authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+##############################################################################
+#
+# Gradle start up script for POSIX generated by Gradle.
+#
+# Important for running:
+#
+# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is
+# noncompliant, but you have some other compliant shell such as ksh or
+# bash, then to run this script, type that shell name before the whole
+# command line, like:
+#
+# ksh Gradle
+#
+# Busybox and similar reduced shells will NOT work, because this script
+# requires all of these POSIX shell features:
+# * functions;
+# * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,
+# «${var#prefix}», «${var%suffix}», and «$( cmd )»;
+# * compound commands having a testable exit status, especially «case»;
+# * various built-in commands including «command», «set», and «ulimit».
+#
+# Important for patching:
+#
+# (2) This script targets any POSIX shell, so it avoids extensions provided
+# by Bash, Ksh, etc; in particular arrays are avoided.
+#
+# The "traditional" practice of packing multiple parameters into a
+# space-separated string is a well documented source of bugs and security
+# problems, so this is (mostly) avoided, by progressively accumulating
+# options in "$@", and eventually passing that to Java.
+#
+# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,
+# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;
+# see the in-line comments for details.
+#
+# There are tweaks for specific operating systems such as AIX, CygWin,
+# Darwin, MinGW, and NonStop.
+#
+# (3) This script is generated from the Groovy template
+# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
+# within the Gradle project.
+#
+# You can find Gradle at https://github.com/gradle/gradle/.
+#
+##############################################################################
+
+# Attempt to set APP_HOME
+
+# Resolve links: $0 may be a link
+app_path=$0
+
+# Need this for daisy-chained symlinks.
+while
+ APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path
+ [ -h "$app_path" ]
+do
+ ls=$( ls -ld "$app_path" )
+ link=${ls#*' -> '}
+ case $link in #(
+ /*) app_path=$link ;; #(
+ *) app_path=$APP_HOME$link ;;
+ esac
+done
+
+APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit
+
+APP_NAME="Gradle"
+APP_BASE_NAME=${0##*/}
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD=maximum
+
+warn () {
+ echo "$*"
+} >&2
+
+die () {
+ echo
+ echo "$*"
+ echo
+ exit 1
+} >&2
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+nonstop=false
+case "$( uname )" in #(
+ CYGWIN* ) cygwin=true ;; #(
+ Darwin* ) darwin=true ;; #(
+ MSYS* | MINGW* ) msys=true ;; #(
+ NONSTOP* ) nonstop=true ;;
+esac
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+ if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+ # IBM's JDK on AIX uses strange locations for the executables
+ JAVACMD=$JAVA_HOME/jre/sh/java
+ else
+ JAVACMD=$JAVA_HOME/bin/java
+ fi
+ if [ ! -x "$JAVACMD" ] ; then
+ die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+ fi
+else
+ JAVACMD=java
+ which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+fi
+
+# Increase the maximum file descriptors if we can.
+if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
+ case $MAX_FD in #(
+ max*)
+ MAX_FD=$( ulimit -H -n ) ||
+ warn "Could not query maximum file descriptor limit"
+ esac
+ case $MAX_FD in #(
+ '' | soft) :;; #(
+ *)
+ ulimit -n "$MAX_FD" ||
+ warn "Could not set maximum file descriptor limit to $MAX_FD"
+ esac
+fi
+
+# Collect all arguments for the java command, stacking in reverse order:
+# * args from the command line
+# * the main class name
+# * -classpath
+# * -D...appname settings
+# * --module-path (only if needed)
+# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.
+
+# For Cygwin or MSYS, switch paths to Windows format before running java
+if "$cygwin" || "$msys" ; then
+ APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
+ CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" )
+
+ JAVACMD=$( cygpath --unix "$JAVACMD" )
+
+ # Now convert the arguments - kludge to limit ourselves to /bin/sh
+ for arg do
+ if
+ case $arg in #(
+ -*) false ;; # don't mess with options #(
+ /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath
+ [ -e "$t" ] ;; #(
+ *) false ;;
+ esac
+ then
+ arg=$( cygpath --path --ignore --mixed "$arg" )
+ fi
+ # Roll the args list around exactly as many times as the number of
+ # args, so each arg winds up back in the position where it started, but
+ # possibly modified.
+ #
+ # NB: a `for` loop captures its iteration list before it begins, so
+ # changing the positional parameters here affects neither the number of
+ # iterations, nor the values presented in `arg`.
+ shift # remove old arg
+ set -- "$@" "$arg" # push replacement arg
+ done
+fi
+
+# Collect all arguments for the java command;
+# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of
+# shell script including quotes and variable substitutions, so put them in
+# double quotes to make sure that they get re-expanded; and
+# * put everything else in single quotes, so that it's not re-expanded.
+
+set -- \
+ "-Dorg.gradle.appname=$APP_BASE_NAME" \
+ -classpath "$CLASSPATH" \
+ org.gradle.wrapper.GradleWrapperMain \
+ "$@"
+
+# 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/gradlew.bat b/gradlew.bat
new file mode 100644
index 0000000..f127cfd
--- /dev/null
+++ b/gradlew.bat
@@ -0,0 +1,91 @@
+@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/limelight pipelines/2022_Shop_Targeting.vpr b/limelight pipelines/2022_Shop_Targeting.vpr
new file mode 100644
index 0000000..d59cb87
--- /dev/null
+++ b/limelight pipelines/2022_Shop_Targeting.vpr
@@ -0,0 +1,68 @@
+area_max:100
+area_min:0.0026873856000000015
+area_similarity:26
+aspect_max:20
+aspect_min:0
+black_level:40
+blue_balance:2500
+calibration_type:0
+contour_grouping:3
+contour_sort_final:0
+convexity_max:100
+convexity_min:80
+corner_approx:5.000000
+crop_x_max:1
+crop_x_min:-1
+crop_y_max:1.000000
+crop_y_min:-1.000000
+cross_a_a:1
+cross_a_x:0
+cross_a_y:0
+cross_b_a:1
+cross_b_x:0
+cross_b_y:0
+desc:Shop_Targeting
+desired_contour_region:0
+dilation_steps:1
+direction_filter:0
+dual_close_sort_origin:0
+erosion_steps:0
+exposure:3
+force_convex:1
+hue_max:94
+hue_min:22
+image_flip:0
+image_source:0
+img_to_show:0
+intersection_filter:3
+invert_hue:0
+multigroup_max:5
+multigroup_min:2
+multigroup_rejector:1
+pipeline_led_enabled:1
+pipeline_led_power:100
+pipeline_res:0
+pipeline_type:0
+red_balance:2500
+roi_x:0.000000
+roi_y:0.000000
+sat_max:255
+sat_min:83
+send_corners:0
+send_raw_contours:0
+solve3d:0
+solve3d_algo:0
+solve3d_bindtarget:1
+solve3d_conf:0.990000
+solve3d_error:8
+solve3d_guess:0
+solve3d_iterations:50
+solve3d_precies:1
+solve3d_precise:0
+solve3d_zoffset:0.000000
+val_max:220
+val_min:18
+x_outlier_miqr:1
+y_max:1.000000
+y_min:-1.000000
+y_outlier_miqr:2.5
diff --git a/settings.gradle b/settings.gradle
new file mode 100644
index 0000000..48c039e
--- /dev/null
+++ b/settings.gradle
@@ -0,0 +1,27 @@
+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/shuffleboard config/shuffleboard.json b/shuffleboard config/shuffleboard.json
new file mode 100644
index 0000000..631b51d
--- /dev/null
+++ b/shuffleboard config/shuffleboard.json
@@ -0,0 +1,868 @@
+{
+ "tabPane": [
+ {
+ "title": "SmartDashboard",
+ "autoPopulate": true,
+ "autoPopulatePrefix": "SmartDashboard/",
+ "widgetPane": {
+ "gridSize": 128.0,
+ "showGrid": true,
+ "hgap": 16.0,
+ "vgap": 16.0,
+ "titleType": 0,
+ "tiles": {
+ "0,0": {
+ "size": [
+ 1,
+ 1
+ ],
+ "content": {
+ "_type": "Text View",
+ "_source0": "network_table:///SmartDashboard/limelight_PipelineName",
+ "_title": "limelight_PipelineName"
+ }
+ },
+ "1,0": {
+ "size": [
+ 1,
+ 1
+ ],
+ "content": {
+ "_type": "Text View",
+ "_source0": "network_table:///SmartDashboard/Mod 2 Integrated",
+ "_title": "Mod 2 Integrated"
+ }
+ },
+ "2,0": {
+ "size": [
+ 1,
+ 1
+ ],
+ "content": {
+ "_type": "ComboBox Chooser",
+ "_source0": "network_table:///SmartDashboard/Choose Auto: ",
+ "_title": "Choose Auto: "
+ }
+ },
+ "3,0": {
+ "size": [
+ 1,
+ 1
+ ],
+ "content": {
+ "_type": "Text View",
+ "_source0": "network_table:///SmartDashboard/Mod 0 Velocity",
+ "_title": "Mod 0 Velocity"
+ }
+ },
+ "4,0": {
+ "size": [
+ 1,
+ 1
+ ],
+ "content": {
+ "_type": "Text View",
+ "_source0": "network_table:///SmartDashboard/Mod 3 Cancoder",
+ "_title": "Mod 3 Cancoder"
+ }
+ },
+ "5,0": {
+ "size": [
+ 1,
+ 1
+ ],
+ "content": {
+ "_type": "Text View",
+ "_source0": "network_table:///SmartDashboard/Mod 0 Cancoder",
+ "_title": "Mod 0 Cancoder"
+ }
+ },
+ "6,0": {
+ "size": [
+ 1,
+ 1
+ ],
+ "content": {
+ "_type": "Text View",
+ "_source0": "network_table:///SmartDashboard/Mod 0 Integrated",
+ "_title": "Mod 0 Integrated"
+ }
+ },
+ "7,0": {
+ "size": [
+ 1,
+ 1
+ ],
+ "content": {
+ "_type": "Boolean Box",
+ "_source0": "network_table:///SmartDashboard/Magazine Switch",
+ "_title": "Magazine Switch",
+ "Colors/Color when true": "#7CFC00FF",
+ "Colors/Color when false": "#8B0000FF"
+ }
+ },
+ "8,0": {
+ "size": [
+ 1,
+ 1
+ ],
+ "content": {
+ "_type": "Text View",
+ "_source0": "network_table:///SmartDashboard/Mod 3 Integrated",
+ "_title": "Mod 3 Integrated"
+ }
+ },
+ "9,0": {
+ "size": [
+ 1,
+ 1
+ ],
+ "content": {
+ "_type": "Text View",
+ "_source0": "network_table:///SmartDashboard/Mod 1 Velocity",
+ "_title": "Mod 1 Velocity"
+ }
+ },
+ "10,0": {
+ "size": [
+ 1,
+ 1
+ ],
+ "content": {
+ "_type": "Text View",
+ "_source0": "network_table:///SmartDashboard/limelight_Interface",
+ "_title": "limelight_Interface"
+ }
+ },
+ "11,0": {
+ "size": [
+ 1,
+ 1
+ ],
+ "content": {
+ "_type": "Text View",
+ "_source0": "network_table:///SmartDashboard/Mod 1 Cancoder",
+ "_title": "Mod 1 Cancoder"
+ }
+ },
+ "12,0": {
+ "size": [
+ 1,
+ 1
+ ],
+ "content": {
+ "_type": "Text View",
+ "_source0": "network_table:///SmartDashboard/Mod 1 Integrated",
+ "_title": "Mod 1 Integrated"
+ }
+ },
+ "0,1": {
+ "size": [
+ 1,
+ 1
+ ],
+ "content": {
+ "_type": "Text View",
+ "_source0": "network_table:///SmartDashboard/Mod 2 Velocity",
+ "_title": "Mod 2 Velocity"
+ }
+ },
+ "1,1": {
+ "size": [
+ 1,
+ 1
+ ],
+ "content": {
+ "_type": "Text View",
+ "_source0": "network_table:///SmartDashboard/Mod 2 Cancoder",
+ "_title": "Mod 2 Cancoder"
+ }
+ },
+ "2,1": {
+ "size": [
+ 1,
+ 1
+ ],
+ "content": {
+ "_type": "Text View",
+ "_source0": "network_table:///SmartDashboard/limelight_Stream",
+ "_title": "limelight_Stream"
+ }
+ },
+ "3,1": {
+ "size": [
+ 1,
+ 1
+ ],
+ "content": {
+ "_type": "Text View",
+ "_source0": "network_table:///SmartDashboard/Mod 3 Velocity",
+ "_title": "Mod 3 Velocity"
+ }
+ },
+ "4,1": {
+ "size": [
+ 1,
+ 1
+ ],
+ "content": {
+ "_type": "Text View",
+ "_source0": "network_table:///SmartDashboard/SetPoint (RPM)",
+ "_title": "SetPoint (RPM)"
+ }
+ },
+ "5,1": {
+ "size": [
+ 1,
+ 1
+ ],
+ "content": {
+ "_type": "Text View",
+ "_source0": "network_table:///SmartDashboard/DB/Slider 0",
+ "_title": "DB/Slider 0"
+ }
+ },
+ "6,1": {
+ "size": [
+ 1,
+ 1
+ ],
+ "content": {
+ "_type": "Text View",
+ "_source0": "network_table:///SmartDashboard/DB/Slider 1",
+ "_title": "DB/Slider 1"
+ }
+ },
+ "7,1": {
+ "size": [
+ 1,
+ 1
+ ],
+ "content": {
+ "_type": "Text View",
+ "_source0": "network_table:///SmartDashboard/DB/Slider 2",
+ "_title": "DB/Slider 2"
+ }
+ },
+ "8,1": {
+ "size": [
+ 1,
+ 1
+ ],
+ "content": {
+ "_type": "Text View",
+ "_source0": "network_table:///SmartDashboard/DB/Slider 3",
+ "_title": "DB/Slider 3"
+ }
+ },
+ "9,1": {
+ "size": [
+ 1,
+ 1
+ ],
+ "content": {
+ "_type": "Text View",
+ "_source0": "network_table:///SmartDashboard/Auto Selector",
+ "_title": "Auto Selector"
+ }
+ },
+ "10,1": {
+ "size": [
+ 1,
+ 1
+ ],
+ "content": {
+ "_type": "Boolean Box",
+ "_source0": "network_table:///SmartDashboard/DB/Button 0",
+ "_title": "DB/Button 0",
+ "Colors/Color when true": "#7CFC00FF",
+ "Colors/Color when false": "#8B0000FF"
+ }
+ },
+ "11,1": {
+ "size": [
+ 1,
+ 1
+ ],
+ "content": {
+ "_type": "Boolean Box",
+ "_source0": "network_table:///SmartDashboard/DB/Button 1",
+ "_title": "DB/Button 1",
+ "Colors/Color when true": "#7CFC00FF",
+ "Colors/Color when false": "#8B0000FF"
+ }
+ },
+ "12,1": {
+ "size": [
+ 1,
+ 1
+ ],
+ "content": {
+ "_type": "Boolean Box",
+ "_source0": "network_table:///SmartDashboard/DB/Button 2",
+ "_title": "DB/Button 2",
+ "Colors/Color when true": "#7CFC00FF",
+ "Colors/Color when false": "#8B0000FF"
+ }
+ },
+ "0,2": {
+ "size": [
+ 1,
+ 1
+ ],
+ "content": {
+ "_type": "Boolean Box",
+ "_source0": "network_table:///SmartDashboard/DB/Button 3",
+ "_title": "DB/Button 3",
+ "Colors/Color when true": "#7CFC00FF",
+ "Colors/Color when false": "#8B0000FF"
+ }
+ },
+ "1,2": {
+ "size": [
+ 1,
+ 1
+ ],
+ "content": {
+ "_type": "Text View",
+ "_source0": "network_table:///SmartDashboard/DB/String 0",
+ "_title": "DB/String 0"
+ }
+ },
+ "2,2": {
+ "size": [
+ 1,
+ 1
+ ],
+ "content": {
+ "_type": "Text View",
+ "_source0": "network_table:///SmartDashboard/DB/String 1",
+ "_title": "DB/String 1"
+ }
+ },
+ "3,2": {
+ "size": [
+ 1,
+ 1
+ ],
+ "content": {
+ "_type": "Text View",
+ "_source0": "network_table:///SmartDashboard/DB/String 2",
+ "_title": "DB/String 2"
+ }
+ },
+ "4,2": {
+ "size": [
+ 1,
+ 1
+ ],
+ "content": {
+ "_type": "Text View",
+ "_source0": "network_table:///SmartDashboard/DB/String 3",
+ "_title": "DB/String 3"
+ }
+ },
+ "5,2": {
+ "size": [
+ 1,
+ 1
+ ],
+ "content": {
+ "_type": "Text View",
+ "_source0": "network_table:///SmartDashboard/DB/String 4",
+ "_title": "DB/String 4"
+ }
+ },
+ "6,2": {
+ "size": [
+ 1,
+ 1
+ ],
+ "content": {
+ "_type": "Text View",
+ "_source0": "network_table:///SmartDashboard/DB/String 5",
+ "_title": "DB/String 5"
+ }
+ },
+ "7,2": {
+ "size": [
+ 1,
+ 1
+ ],
+ "content": {
+ "_type": "Text View",
+ "_source0": "network_table:///SmartDashboard/DB/String 6",
+ "_title": "DB/String 6"
+ }
+ },
+ "8,2": {
+ "size": [
+ 1,
+ 1
+ ],
+ "content": {
+ "_type": "Text View",
+ "_source0": "network_table:///SmartDashboard/DB/String 7",
+ "_title": "DB/String 7"
+ }
+ },
+ "9,2": {
+ "size": [
+ 1,
+ 1
+ ],
+ "content": {
+ "_type": "Text View",
+ "_source0": "network_table:///SmartDashboard/DB/String 8",
+ "_title": "DB/String 8"
+ }
+ },
+ "10,2": {
+ "size": [
+ 1,
+ 1
+ ],
+ "content": {
+ "_type": "Text View",
+ "_source0": "network_table:///SmartDashboard/DB/String 9",
+ "_title": "DB/String 9"
+ }
+ }
+ }
+ }
+ },
+ {
+ "title": "LiveWindow",
+ "autoPopulate": true,
+ "autoPopulatePrefix": "LiveWindow/",
+ "widgetPane": {
+ "gridSize": 128.0,
+ "showGrid": true,
+ "hgap": 16.0,
+ "vgap": 16.0,
+ "titleType": 0,
+ "tiles": {
+ "0,0": {
+ "size": [
+ 2,
+ 4
+ ],
+ "content": {
+ "_type": "Subsystem Layout",
+ "_source0": "network_table:///LiveWindow/Ungrouped",
+ "_title": "Ungrouped",
+ "Layout/Label position": "BOTTOM",
+ "_children": [
+ {
+ "_type": "PID Controller",
+ "_source0": "network_table:///LiveWindow/Ungrouped/PIDController[16]",
+ "_title": "PIDController[16]"
+ },
+ {
+ "_type": "Text View",
+ "_source0": "network_table:///LiveWindow/Ungrouped/DoubleSolenoid[1,2]/Value",
+ "_title": "DoubleSolenoid[1,2]/Value"
+ },
+ {
+ "_type": "PID Controller",
+ "_source0": "network_table:///LiveWindow/Ungrouped/PIDController[25]",
+ "_title": "PIDController[25]"
+ },
+ {
+ "_type": "PID Controller",
+ "_source0": "network_table:///LiveWindow/Ungrouped/PIDController[13]",
+ "_title": "PIDController[13]"
+ },
+ {
+ "_type": "PID Controller",
+ "_source0": "network_table:///LiveWindow/Ungrouped/PIDController[17]",
+ "_title": "PIDController[17]"
+ },
+ {
+ "_type": "PID Controller",
+ "_source0": "network_table:///LiveWindow/Ungrouped/PIDController[14]",
+ "_title": "PIDController[14]"
+ },
+ {
+ "_type": "PID Controller",
+ "_source0": "network_table:///LiveWindow/Ungrouped/PIDController[22]",
+ "_title": "PIDController[22]"
+ },
+ {
+ "_type": "PID Controller",
+ "_source0": "network_table:///LiveWindow/Ungrouped/PIDController[26]",
+ "_title": "PIDController[26]"
+ },
+ {
+ "_type": "PID Controller",
+ "_source0": "network_table:///LiveWindow/Ungrouped/PIDController[6]",
+ "_title": "PIDController[6]"
+ },
+ {
+ "_type": "PID Controller",
+ "_source0": "network_table:///LiveWindow/Ungrouped/PIDController[23]",
+ "_title": "PIDController[23]"
+ },
+ {
+ "_type": "PID Controller",
+ "_source0": "network_table:///LiveWindow/Ungrouped/PIDController[7]",
+ "_title": "PIDController[7]"
+ },
+ {
+ "_type": "PID Controller",
+ "_source0": "network_table:///LiveWindow/Ungrouped/PIDController[18]",
+ "_title": "PIDController[18]"
+ },
+ {
+ "_type": "PID Controller",
+ "_source0": "network_table:///LiveWindow/Ungrouped/PIDController[8]",
+ "_title": "PIDController[8]"
+ },
+ {
+ "_type": "PID Controller",
+ "_source0": "network_table:///LiveWindow/Ungrouped/PIDController[11]",
+ "_title": "PIDController[11]"
+ },
+ {
+ "_type": "PID Controller",
+ "_source0": "network_table:///LiveWindow/Ungrouped/PIDController[19]",
+ "_title": "PIDController[19]"
+ },
+ {
+ "_type": "Gyro",
+ "_source0": "network_table:///LiveWindow/Ungrouped/navX-Sensor[4]",
+ "_title": "navX-Sensor[4]",
+ "Visuals/Major tick spacing": 45.0,
+ "Visuals/Starting angle": 180.0,
+ "Visuals/Show tick mark ring": true,
+ "Visuals/Counter clockwise": false
+ },
+ {
+ "_type": "PID Controller",
+ "_source0": "network_table:///LiveWindow/Ungrouped/PIDController[10]",
+ "_title": "PIDController[10]"
+ },
+ {
+ "_type": "PID Controller",
+ "_source0": "network_table:///LiveWindow/Ungrouped/PIDController[20]",
+ "_title": "PIDController[20]"
+ },
+ {
+ "_type": "Boolean Box",
+ "_source0": "network_table:///LiveWindow/Ungrouped/DigitalInput[1]/Value",
+ "_title": "DigitalInput[1]/Value",
+ "Colors/Color when true": "#7CFC00FF",
+ "Colors/Color when false": "#8B0000FF"
+ },
+ {
+ "_type": "PID Controller",
+ "_source0": "network_table:///LiveWindow/Ungrouped/PIDController[5]",
+ "_title": "PIDController[5]"
+ },
+ {
+ "_type": "PID Controller",
+ "_source0": "network_table:///LiveWindow/Ungrouped/PIDController[15]",
+ "_title": "PIDController[15]"
+ },
+ {
+ "_type": "PID Controller",
+ "_source0": "network_table:///LiveWindow/Ungrouped/PIDController[24]",
+ "_title": "PIDController[24]"
+ },
+ {
+ "_type": "PID Controller",
+ "_source0": "network_table:///LiveWindow/Ungrouped/PIDController[4]",
+ "_title": "PIDController[4]"
+ },
+ {
+ "_type": "PID Controller",
+ "_source0": "network_table:///LiveWindow/Ungrouped/PIDController[9]",
+ "_title": "PIDController[9]"
+ },
+ {
+ "_type": "PID Controller",
+ "_source0": "network_table:///LiveWindow/Ungrouped/PIDController[12]",
+ "_title": "PIDController[12]"
+ },
+ {
+ "_type": "PID Controller",
+ "_source0": "network_table:///LiveWindow/Ungrouped/PIDController[21]",
+ "_title": "PIDController[21]"
+ },
+ {
+ "_type": "Text View",
+ "_source0": "network_table:///LiveWindow/Ungrouped/DoubleSolenoid[1,0]/Value",
+ "_title": "DoubleSolenoid[1,0]/Value"
+ },
+ {
+ "_type": "Motor Controller",
+ "_source0": "network_table:///LiveWindow/Ungrouped/Talon FX [11]",
+ "_title": "LiveWindow/Ungrouped/Talon FX [11]",
+ "Visuals/Orientation": "HORIZONTAL"
+ },
+ {
+ "_type": "Motor Controller",
+ "_source0": "network_table:///LiveWindow/Ungrouped/Talon FX [12]",
+ "_title": "LiveWindow/Ungrouped/Talon FX [12]",
+ "Visuals/Orientation": "HORIZONTAL"
+ },
+ {
+ "_type": "Motor Controller",
+ "_source0": "network_table:///LiveWindow/Ungrouped/Talon FX [9]",
+ "_title": "LiveWindow/Ungrouped/Talon FX [9]",
+ "Visuals/Orientation": "HORIZONTAL"
+ },
+ {
+ "_type": "Motor Controller",
+ "_source0": "network_table:///LiveWindow/Ungrouped/MotorControllerGroup[2]",
+ "_title": "LiveWindow/Ungrouped/MotorControllerGroup[2]",
+ "Visuals/Orientation": "HORIZONTAL"
+ },
+ {
+ "_type": "Motor Controller",
+ "_source0": "network_table:///LiveWindow/Ungrouped/MotorControllerGroup[1]",
+ "_title": "LiveWindow/Ungrouped/MotorControllerGroup[1]",
+ "Visuals/Orientation": "HORIZONTAL"
+ },
+ {
+ "_type": "Motor Controller",
+ "_source0": "network_table:///LiveWindow/Ungrouped/Talon FX [10]",
+ "_title": "LiveWindow/Ungrouped/Talon FX [10]",
+ "Visuals/Orientation": "HORIZONTAL"
+ }
+ ]
+ }
+ },
+ "2,0": {
+ "size": [
+ 2,
+ 4
+ ],
+ "content": {
+ "_type": "Subsystem Layout",
+ "_source0": "network_table:///LiveWindow/OutsideClimber",
+ "_title": "OutsideClimber",
+ "Layout/Label position": "BOTTOM",
+ "_children": []
+ }
+ },
+ "4,0": {
+ "size": [
+ 2,
+ 4
+ ],
+ "content": {
+ "_type": "Subsystem Layout",
+ "_source0": "network_table:///LiveWindow/InsideClimber",
+ "_title": "InsideClimber",
+ "Layout/Label position": "BOTTOM",
+ "_children": []
+ }
+ },
+ "6,0": {
+ "size": [
+ 2,
+ 4
+ ],
+ "content": {
+ "_type": "Subsystem Layout",
+ "_source0": "network_table:///LiveWindow/OuterMagazine",
+ "_title": "OuterMagazine",
+ "Layout/Label position": "BOTTOM",
+ "_children": [
+ {
+ "_type": "PID Controller",
+ "_source0": "network_table:///LiveWindow/OuterMagazine/PID Controller",
+ "_title": "PID Controller"
+ }
+ ]
+ }
+ },
+ "8,0": {
+ "size": [
+ 2,
+ 4
+ ],
+ "content": {
+ "_type": "Subsystem Layout",
+ "_source0": "network_table:///LiveWindow/LEDs",
+ "_title": "LEDs",
+ "Layout/Label position": "BOTTOM",
+ "_children": []
+ }
+ },
+ "10,0": {
+ "size": [
+ 2,
+ 4
+ ],
+ "content": {
+ "_type": "Subsystem Layout",
+ "_source0": "network_table:///LiveWindow/Intake",
+ "_title": "Intake",
+ "Layout/Label position": "BOTTOM",
+ "_children": []
+ }
+ },
+ "0,4": {
+ "size": [
+ 2,
+ 4
+ ],
+ "content": {
+ "_type": "Subsystem Layout",
+ "_source0": "network_table:///LiveWindow/InnerMagazine",
+ "_title": "InnerMagazine",
+ "Layout/Label position": "BOTTOM",
+ "_children": [
+ {
+ "_type": "PID Controller",
+ "_source0": "network_table:///LiveWindow/InnerMagazine/PID Controller",
+ "_title": "PID Controller"
+ }
+ ]
+ }
+ },
+ "2,4": {
+ "size": [
+ 2,
+ 4
+ ],
+ "content": {
+ "_type": "Subsystem Layout",
+ "_source0": "network_table:///LiveWindow/Turret",
+ "_title": "Turret",
+ "Layout/Label position": "BOTTOM",
+ "_children": []
+ }
+ },
+ "4,4": {
+ "size": [
+ 2,
+ 4
+ ],
+ "content": {
+ "_type": "Subsystem Layout",
+ "_source0": "network_table:///LiveWindow/Swerve",
+ "_title": "Swerve",
+ "Layout/Label position": "BOTTOM",
+ "_children": []
+ }
+ },
+ "6,4": {
+ "size": [
+ 2,
+ 4
+ ],
+ "content": {
+ "_type": "Subsystem Layout",
+ "_source0": "network_table:///LiveWindow/Shooter",
+ "_title": "Shooter",
+ "Layout/Label position": "BOTTOM",
+ "_children": [
+ {
+ "_type": "PID Controller",
+ "_source0": "network_table:///LiveWindow/Shooter/PID Controller",
+ "_title": "PID Controller"
+ }
+ ]
+ }
+ }
+ }
+ }
+ },
+ {
+ "title": "Tab 3",
+ "autoPopulate": false,
+ "autoPopulatePrefix": "",
+ "widgetPane": {
+ "gridSize": 128.0,
+ "showGrid": true,
+ "hgap": 16.0,
+ "vgap": 16.0,
+ "titleType": 0,
+ "tiles": {
+ "0,1": {
+ "size": [
+ 7,
+ 4
+ ],
+ "content": {
+ "_type": "Camera Stream",
+ "_source0": "camera_server://Magazine Camera",
+ "_title": "Magazine Camera",
+ "Crosshair/Show crosshair": true,
+ "Crosshair/Crosshair color": "#FFFFFFFF",
+ "Controls/Show controls": false,
+ "Controls/Rotation": "NONE",
+ "compression": -1.0,
+ "fps": -1,
+ "imageWidth": -1,
+ "imageHeight": -1
+ }
+ },
+ "7,1": {
+ "size": [
+ 6,
+ 4
+ ],
+ "content": {
+ "_type": "Camera Stream",
+ "_source0": "camera_server://limelight",
+ "_title": "limelight",
+ "Crosshair/Show crosshair": true,
+ "Crosshair/Crosshair color": "#FFFFFFFF",
+ "Controls/Show controls": false,
+ "Controls/Rotation": "NONE",
+ "compression": -1.0,
+ "fps": -1,
+ "imageWidth": -1,
+ "imageHeight": -1
+ }
+ },
+ "0,0": {
+ "size": [
+ 2,
+ 1
+ ],
+ "content": {
+ "_type": "ComboBox Chooser",
+ "_source0": "network_table:///SmartDashboard/Choose Auto: ",
+ "_title": "SmartDashboard/Choose Auto: "
+ }
+ },
+ "2,0": {
+ "size": [
+ 2,
+ 1
+ ],
+ "content": {
+ "_type": "Boolean Box",
+ "_source0": "network_table:///SmartDashboard/Magazine Switch",
+ "_title": "SmartDashboard/Magazine Switch",
+ "Colors/Color when true": "#7CFC00FF",
+ "Colors/Color when false": "#8B0000FF"
+ }
+ },
+ "4,0": {
+ "size": [
+ 2,
+ 1
+ ],
+ "content": {
+ "_type": "Text View",
+ "_source0": "network_table:///LiveWindow/Ungrouped/navX-Sensor[4]/Value",
+ "_title": "LiveWindow/Ungrouped/navX-Sensor[4]/Value"
+ }
+ }
+ }
+ }
+ }
+ ],
+ "windowGeometry": {
+ "x": -8.0,
+ "y": -8.0,
+ "width": 1936.0,
+ "height": 1056.0
+ }
+}
diff --git a/src/main/deploy/example.txt b/src/main/deploy/example.txt
new file mode 100644
index 0000000..bb82515
--- /dev/null
+++ b/src/main/deploy/example.txt
@@ -0,0 +1,3 @@
+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/src/main/java/frc/lib/math/Conversions.java b/src/main/java/frc/lib/math/Conversions.java
new file mode 100644
index 0000000..e48082e
--- /dev/null
+++ b/src/main/java/frc/lib/math/Conversions.java
@@ -0,0 +1,93 @@
+package frc.lib.math;
+
+/**
+ * Mathematical conversions for swerve calculations
+ */
+public class Conversions {
+
+ /**
+ * @param counts Falcon Counts
+ * @param gearRatio Gear Ratio between Falcon and Mechanism
+ * @return Degrees of Rotation of Mechanism falconToDegrees
+ */
+ public static double falconToDegrees(double counts, double gearRatio) {
+ return counts * (360.0 / (gearRatio * 2048.0));
+ }
+
+ /**
+ * @param degrees Degrees of rotation of Mechanism
+ * @param gearRatio Gear Ratio between Falcon and Mechanism
+ * @return Falcon Counts degreesToFalcon
+ */
+ public static double degreesToFalcon(double degrees, double gearRatio) {
+ double ticks = degrees / (360.0 / (gearRatio * 2048.0));
+ return ticks;
+ }
+
+ /**
+ * @param velocityCounts Falcon Velocity Counts
+ * @param gearRatio Gear Ratio between Falcon and Mechanism (set to 1 for Falcon RPM)
+ * @return RPM of Mechanism
+ */
+ public static double falconToRPM(double velocityCounts, double gearRatio) {
+ double motorRPM = velocityCounts * (600.0 / 2048.0);
+ double mechRPM = motorRPM / gearRatio;
+ return mechRPM;
+ }
+
+ /**
+ * @param rpm RPM of mechanism
+ * @param gearRatio Gear Ratio between Falcon and Mechanism (set to 1 for Falcon RPM)
+ * @return RPM of Mechanism
+ */
+ public static double rpmToFalcon(double rpm, double gearRatio) {
+ double motorRPM = rpm * gearRatio;
+ double sensorCounts = motorRPM * (2048.0 / 600.0);
+ return sensorCounts;
+ }
+
+ /**
+ * @param counts Falcon Counts
+ * @param gearRatio Gear Ratio between Falcon and Mechanism
+ * @return Degrees of Rotation of Mechanism falconToDegrees
+ */
+ public static double falconToMeters(double counts, double gearRatio, double circumference) {
+ return counts * circumference / (gearRatio * 2048.0);
+ }
+
+ /**
+ * @param velocitycounts Falcon Velocity Counts
+ * @param circumference Circumference of Wheel
+ * @param gearRatio Gear Ratio between Falcon and Mechanism (set to 1 for Falcon RPM)
+ * @return Falcon Velocity Counts
+ */
+ public static double falconToMPS(double velocitycounts, double circumference,
+ double gearRatio) {
+ double wheelRPM = falconToRPM(velocitycounts, gearRatio);
+ double wheelMPS = (wheelRPM * circumference) / 60;
+ return wheelMPS;
+ }
+
+ /**
+ * @param velocity Velocity MPS
+ * @param circumference Circumference of Wheel
+ * @param gearRatio Gear Ratio between Falcon and Mechanism (set to 1 for Falcon RPM)
+ * @return Falcon Velocity Counts
+ */
+ public static double mpsToFalcon(double velocity, double circumference, double gearRatio) {
+ double wheelRPM = ((velocity * 60) / circumference);
+ double wheelVelocity = rpmToFalcon(wheelRPM, gearRatio);
+ return wheelVelocity;
+ }
+
+ /**
+ * Normalize angle to between 0 to 360
+ *
+ * @param goal initial angle
+ * @return normalized angle
+ */
+ public static double reduceTo0_360(double goal) {
+ return goal % 360;
+ }
+
+}
diff --git a/src/main/java/frc/robot/Constants.java b/src/main/java/frc/robot/Constants.java
new file mode 100644
index 0000000..229f569
--- /dev/null
+++ b/src/main/java/frc/robot/Constants.java
@@ -0,0 +1,33 @@
+package frc.robot;
+
+/**
+ * Constants file.
+ */
+
+public final class Constants {
+ public static final double stickDeadband = 0.1;
+ public static final int driverID = 0;
+ public static final int operatorID = 1;
+
+ /**
+ * Motor CAN id's.
+ */
+ public static final class Motors {
+ }
+
+ /**
+ * Pneumatics CAN id constants.
+ */
+ public static final class Pneumatics {
+ }
+
+ /**
+ * Vision constants for limelight calculations.
+ */
+ public static final class VisionConstants {
+ public static final double deadPocket = 0.05;
+ public static final double limelightHeight = 0;
+ public static final double targetHeight = 0;
+ public static final double limelightAngle = 0;
+ }
+}
diff --git a/src/main/java/frc/robot/Main.java b/src/main/java/frc/robot/Main.java
new file mode 100644
index 0000000..04437ec
--- /dev/null
+++ b/src/main/java/frc/robot/Main.java
@@ -0,0 +1,26 @@
+// 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/src/main/java/frc/robot/Robot.java b/src/main/java/frc/robot/Robot.java
new file mode 100644
index 0000000..e3efde2
--- /dev/null
+++ b/src/main/java/frc/robot/Robot.java
@@ -0,0 +1,100 @@
+// Copyright (c) FIRST and other WPILib contributors.
+// Open Source Software; you can modify and/or share it under the terms of
+// the WPILib BSD license file in the root directory of this project.
+
+package frc.robot;
+
+import edu.wpi.first.wpilibj.TimedRobot;
+import edu.wpi.first.wpilibj2.command.Command;
+import edu.wpi.first.wpilibj2.command.CommandScheduler;
+
+/**
+ * Runs tasks on Roborio in this file.
+ */
+public class Robot extends TimedRobot {
+ private RobotContainer robotContainer;
+ private Command autoChooser;
+
+
+
+ // private Ultrasonic ultrasonic = new Ultrasonic();
+ /**
+ * This function is run when the robot is first started up and should be used for any
+ * initialization code.
+ */
+ @Override
+ public void robotInit() {
+ // Instantiate our RobotContainer. This will perform all our button bindings,
+ // and put our
+ // autonomous chooser on the dashboard.
+ robotContainer = new RobotContainer();
+
+ }
+
+ /**
+ * This function is called every robot packet, no matter the mode. Use this for items like
+ * diagnostics that you want ran during disabled, autonomous, teleoperated and test.
+ *
+ *
+ * This runs after the mode specific periodic functions, but before LiveWindow and
+ * SmartDashboard integrated updating.
+ */
+ @Override
+ public void robotPeriodic() {
+ // Runs the Scheduler. This is responsible for polling buttons, adding newly-scheduled
+ // commands,
+ // running already-scheduled commands, removing finished or interrupted commands, and
+ // running
+ // subsystem periodic() methods. This must be called from the robot's periodic block in
+ // order for
+ // anything in the Command-based framework to work.
+ CommandScheduler.getInstance().run();
+ }
+
+ @Override
+ public void disabledInit() {}
+
+ @Override
+ public void disabledPeriodic() {}
+
+ /**
+ * This autonomous runs the autonomous command selected by your {@link RobotContainer} class.
+ */
+ @Override
+ public void autonomousInit() {
+ robotContainer.getAutonomousCommand().schedule();
+ autoChooser = robotContainer.getAutonomousCommand();
+
+ // schedule the autonomous command (example)
+ if (autoChooser != null) {
+ autoChooser.schedule();
+ }
+ }
+
+ /** This function is called periodically during autonomous. */
+ @Override
+ public void autonomousPeriodic() {}
+
+ @Override
+ public void teleopInit() {
+ if (autoChooser != null) {
+ autoChooser.cancel();
+ }
+ }
+
+ /** This function is called periodically during operator control. */
+ @Override
+ public void teleopPeriodic() {
+ // vision.update();
+ }
+
+ @Override
+ public void testInit() {
+ // Cancels all running commands at the start of test mode.
+ CommandScheduler.getInstance().cancelAll();
+ }
+
+ /** This function is called periodically during test mode. */
+ @Override
+ public void testPeriodic() {}
+}
diff --git a/src/main/java/frc/robot/RobotContainer.java b/src/main/java/frc/robot/RobotContainer.java
new file mode 100644
index 0000000..e05ae4f
--- /dev/null
+++ b/src/main/java/frc/robot/RobotContainer.java
@@ -0,0 +1,60 @@
+package frc.robot;
+
+import edu.wpi.first.wpilibj.GenericHID;
+import edu.wpi.first.wpilibj.XboxController;
+import edu.wpi.first.wpilibj.smartdashboard.SendableChooser;
+import edu.wpi.first.wpilibj.smartdashboard.SmartDashboard;
+import edu.wpi.first.wpilibj2.command.Command;
+import edu.wpi.first.wpilibj2.command.WaitCommand;
+import edu.wpi.first.wpilibj2.command.button.CommandXboxController;
+
+/**
+ * This class is where the bulk of the robot should be declared. Since Command-based is a
+ * "declarative" paradigm, very little robot logic should actually be handled in the {@link Robot}
+ * periodic methods (other than the scheduler calls). Instead, the structure of the robot (including
+ * subsystems, commands, and button mappings) should be declared here.
+ */
+public class RobotContainer {
+ /* Controllers */
+ private final CommandXboxController driver = new CommandXboxController(Constants.driverID);
+ private final CommandXboxController operator = new CommandXboxController(Constants.operatorID);
+
+ // Initialize AutoChooser Sendable
+ private final SendableChooser autoChooser = new SendableChooser<>();
+
+ // Field Relative and openLoop Variables
+ boolean fieldRelative;
+ boolean openLoop;
+
+
+ /* Subsystems */
+
+ /**
+ * The container for the robot. Contains subsystems, OI devices, and commands.
+ */
+ public RobotContainer() {
+ SmartDashboard.putData("Choose Auto: ", autoChooser);
+ autoChooser.setDefaultOption("Do Nothing", new WaitCommand(1));
+ // Configure the button bindings
+ configureButtonBindings();
+ }
+
+ /**
+ * Use this method to define your button->command mappings. Buttons can be created by
+ * instantiating a {@link GenericHID} or one of its subclasses
+ * ({@link edu.wpi.first.wpilibj.Joystick} or {@link XboxController}), and then passing it to a
+ * {@link edu.wpi.first.wpilibj2.command.button.JoystickButton}.
+ */
+ private void configureButtonBindings() {}
+
+ /**
+ * Gets the user's selected autonomous command.
+ *
+ * @return Returns autonomous command selected.
+ */
+ public Command getAutonomousCommand() {
+ // return new P1_3B(swerveDrive, shooter, innerMagazine, outerMagazine, intake, turret,
+ // vision);
+ return autoChooser.getSelected();
+ }
+}
diff --git a/src/main/java/frc/robot/autos/.keep b/src/main/java/frc/robot/autos/.keep
new file mode 100644
index 0000000..e69de29
diff --git a/src/main/java/frc/robot/commands/.keep b/src/main/java/frc/robot/commands/.keep
new file mode 100644
index 0000000..e69de29
diff --git a/src/main/java/frc/robot/modules/.keep b/src/main/java/frc/robot/modules/.keep
new file mode 100644
index 0000000..e69de29
diff --git a/src/main/java/frc/robot/modules/Vision.java b/src/main/java/frc/robot/modules/Vision.java
new file mode 100644
index 0000000..016e912
--- /dev/null
+++ b/src/main/java/frc/robot/modules/Vision.java
@@ -0,0 +1,93 @@
+package frc.robot.modules;
+
+import edu.wpi.first.networktables.NetworkTable;
+import edu.wpi.first.networktables.NetworkTableInstance;
+import frc.robot.Constants;
+
+/**
+ * Vision subsystem.
+ */
+
+public class Vision {
+ NetworkTable table = NetworkTableInstance.getDefault().getTable("limelight");
+ double deadPocket = Constants.VisionConstants.deadPocket;
+ double h1 = Constants.VisionConstants.limelightHeight;
+ double h2 = Constants.VisionConstants.targetHeight;
+ double a1 = Constants.VisionConstants.limelightAngle;
+ double calculatedValue;
+ double a2;
+ double distance = 0.0;
+ double disX = 0;
+ double disY = 0;
+ double tx = 0;
+ double ty = 0;
+ double tv = 0;
+ double calculated;
+ boolean targetFound = false;
+
+ /**
+ *
+ * @return distance from target in inches
+ */
+ public double getDistance() {
+ // Vertical Offset From Crosshair To Target (LL1: -20.5 degrees to 20.5 degrees | LL2:
+ // -24.85 to 24.85 degrees)
+ a2 = table.getEntry("ty").getDouble(0.0);
+ distance = (h2 - h1) / java.lang.Math.tan(java.lang.Math.toRadians(a1 + a2));
+ return distance;
+ }
+
+ /**
+ *
+ * @return distance from center of target
+ */
+
+ public double getAimValue() {
+ // Horizontal Offset From Crosshair To Target (LL1: -27 degrees to 27 degrees | LL2: -29.8
+ // to 29.8 degrees)
+ tx = table.getEntry("tx").getDouble(0.0);
+ // targetFound = false;
+ // disX = 0;
+ disX = tx;
+ double calculated = (disX / 125) * 3;
+ calculated =
+ (Math.abs(calculated) <= deadPocket) ? 0 : (calculated >= .3) ? .3 : calculated;
+ return calculated;
+ }
+
+ /**
+ * @return whether target is found
+ */
+ public boolean getTargetFound() {
+ // Whether the limelight has any valid targets (0 or 1)
+ tv = table.getEntry("tv").getDouble(0.0);
+ return tv == 1.0;
+ }
+
+ /**
+ * @return whether target is aligned
+ */
+ public boolean getTargetAligned() {
+ return getTargetFound() && calculated == 0;
+ }
+
+ /**
+ * Turn the Limelight LEDs on or off.
+ *
+ * @param enabled True to turn on the LEDs, False to turn off.
+ */
+ public void setLEDMode(boolean enabled) {
+ int value = enabled ? 3 : 1;
+ this.table.getEntry("ledMode").setNumber(value);
+ }
+
+ /**
+ * Sets the Limelight camera mode, Driver or Vision mode.
+ *
+ * @param driver True to enable Drive mode, False to enable Vision mode.
+ */
+ public void setCameraMode(boolean driver) {
+ int value = driver ? 1 : 0;
+ this.table.getEntry("camMode").setNumber(value);
+ }
+}
diff --git a/src/main/java/frc/robot/subsystems/.keep b/src/main/java/frc/robot/subsystems/.keep
new file mode 100644
index 0000000..e69de29
diff --git a/vendordeps/NavX.json b/vendordeps/NavX.json
new file mode 100644
index 0000000..29ec93a
--- /dev/null
+++ b/vendordeps/NavX.json
@@ -0,0 +1,39 @@
+{
+ "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/vendordeps/PathplannerLib.json b/vendordeps/PathplannerLib.json
new file mode 100644
index 0000000..68a48fc
--- /dev/null
+++ b/vendordeps/PathplannerLib.json
@@ -0,0 +1,35 @@
+{
+ "fileName": "PathplannerLib.json",
+ "name": "PathplannerLib",
+ "version": "2023.4.2",
+ "uuid": "1b42324f-17c6-4875-8e77-1c312bc8c786",
+ "mavenUrls": [
+ "https://3015rangerrobotics.github.io/pathplannerlib/repo"
+ ],
+ "jsonUrl": "https://3015rangerrobotics.github.io/pathplannerlib/PathplannerLib.json",
+ "javaDependencies": [
+ {
+ "groupId": "com.pathplanner.lib",
+ "artifactId": "PathplannerLib-java",
+ "version": "2023.4.2"
+ }
+ ],
+ "jniDependencies": [],
+ "cppDependencies": [
+ {
+ "groupId": "com.pathplanner.lib",
+ "artifactId": "PathplannerLib-cpp",
+ "version": "2023.4.2",
+ "libName": "PathplannerLib",
+ "headerClassifier": "headers",
+ "sharedLibrary": false,
+ "skipInvalidPlatforms": true,
+ "binaryPlatforms": [
+ "windowsx86-64",
+ "linuxx86-64",
+ "osxuniversal",
+ "linuxathena"
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/vendordeps/Phoenix.json b/vendordeps/Phoenix.json
new file mode 100644
index 0000000..27ee06e
--- /dev/null
+++ b/vendordeps/Phoenix.json
@@ -0,0 +1,423 @@
+{
+ "fileName": "Phoenix.json",
+ "name": "CTRE-Phoenix (v5)",
+ "version": "5.30.4+23.0.8",
+ "frcYear": 2023,
+ "uuid": "ab676553-b602-441f-a38d-f1296eff6537",
+ "mavenUrls": [
+ "https://maven.ctr-electronics.com/release/"
+ ],
+ "jsonUrl": "https://maven.ctr-electronics.com/release/com/ctre/phoenix/Phoenix5-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"
+ }
+ ],
+ "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.8",
+ "isJar": false,
+ "skipInvalidPlatforms": true,
+ "validPlatforms": [
+ "windowsx86-64",
+ "linuxx86-64",
+ "linuxathena"
+ ],
+ "simMode": "hwsim"
+ },
+ {
+ "groupId": "com.ctre.phoenixpro.sim",
+ "artifactId": "tools-sim",
+ "version": "23.0.8",
+ "isJar": false,
+ "skipInvalidPlatforms": true,
+ "validPlatforms": [
+ "windowsx86-64",
+ "linuxx86-64",
+ "osxuniversal"
+ ],
+ "simMode": "swsim"
+ },
+ {
+ "groupId": "com.ctre.phoenixpro.sim",
+ "artifactId": "simTalonSRX",
+ "version": "23.0.8",
+ "isJar": false,
+ "skipInvalidPlatforms": true,
+ "validPlatforms": [
+ "windowsx86-64",
+ "linuxx86-64",
+ "osxuniversal"
+ ],
+ "simMode": "swsim"
+ },
+ {
+ "groupId": "com.ctre.phoenixpro.sim",
+ "artifactId": "simTalonFX",
+ "version": "23.0.8",
+ "isJar": false,
+ "skipInvalidPlatforms": true,
+ "validPlatforms": [
+ "windowsx86-64",
+ "linuxx86-64",
+ "osxuniversal"
+ ],
+ "simMode": "swsim"
+ },
+ {
+ "groupId": "com.ctre.phoenixpro.sim",
+ "artifactId": "simVictorSPX",
+ "version": "23.0.8",
+ "isJar": false,
+ "skipInvalidPlatforms": true,
+ "validPlatforms": [
+ "windowsx86-64",
+ "linuxx86-64",
+ "osxuniversal"
+ ],
+ "simMode": "swsim"
+ },
+ {
+ "groupId": "com.ctre.phoenixpro.sim",
+ "artifactId": "simPigeonIMU",
+ "version": "23.0.8",
+ "isJar": false,
+ "skipInvalidPlatforms": true,
+ "validPlatforms": [
+ "windowsx86-64",
+ "linuxx86-64",
+ "osxuniversal"
+ ],
+ "simMode": "swsim"
+ },
+ {
+ "groupId": "com.ctre.phoenixpro.sim",
+ "artifactId": "simCANCoder",
+ "version": "23.0.8",
+ "isJar": false,
+ "skipInvalidPlatforms": true,
+ "validPlatforms": [
+ "windowsx86-64",
+ "linuxx86-64",
+ "osxuniversal"
+ ],
+ "simMode": "swsim"
+ },
+ {
+ "groupId": "com.ctre.phoenixpro.sim",
+ "artifactId": "simProTalonFX",
+ "version": "23.0.8",
+ "isJar": false,
+ "skipInvalidPlatforms": true,
+ "validPlatforms": [
+ "windowsx86-64",
+ "linuxx86-64",
+ "osxuniversal"
+ ],
+ "simMode": "swsim"
+ },
+ {
+ "groupId": "com.ctre.phoenixpro.sim",
+ "artifactId": "simProCANcoder",
+ "version": "23.0.8",
+ "isJar": false,
+ "skipInvalidPlatforms": true,
+ "validPlatforms": [
+ "windowsx86-64",
+ "linuxx86-64",
+ "osxuniversal"
+ ],
+ "simMode": "swsim"
+ },
+ {
+ "groupId": "com.ctre.phoenixpro.sim",
+ "artifactId": "simProPigeon2",
+ "version": "23.0.8",
+ "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.8",
+ "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.8",
+ "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.8",
+ "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.8",
+ "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.8",
+ "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.8",
+ "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.8",
+ "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.8",
+ "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.8",
+ "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.8",
+ "libName": "CTRE_SimProPigeon2",
+ "headerClassifier": "headers",
+ "sharedLibrary": true,
+ "skipInvalidPlatforms": true,
+ "binaryPlatforms": [
+ "windowsx86-64",
+ "linuxx86-64",
+ "osxuniversal"
+ ],
+ "simMode": "swsim"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/vendordeps/REVLib.json b/vendordeps/REVLib.json
new file mode 100644
index 0000000..f2d0b7d
--- /dev/null
+++ b/vendordeps/REVLib.json
@@ -0,0 +1,73 @@
+{
+ "fileName": "REVLib.json",
+ "name": "REVLib",
+ "version": "2023.1.3",
+ "uuid": "3f48eb8c-50fe-43a6-9cb7-44c86353c4cb",
+ "mavenUrls": [
+ "https://maven.revrobotics.com/"
+ ],
+ "jsonUrl": "https://software-metadata.revrobotics.com/REVLib-2023.json",
+ "javaDependencies": [
+ {
+ "groupId": "com.revrobotics.frc",
+ "artifactId": "REVLib-java",
+ "version": "2023.1.3"
+ }
+ ],
+ "jniDependencies": [
+ {
+ "groupId": "com.revrobotics.frc",
+ "artifactId": "REVLib-driver",
+ "version": "2023.1.3",
+ "skipInvalidPlatforms": true,
+ "isJar": false,
+ "validPlatforms": [
+ "windowsx86-64",
+ "windowsx86",
+ "linuxarm64",
+ "linuxx86-64",
+ "linuxathena",
+ "linuxarm32",
+ "osxuniversal"
+ ]
+ }
+ ],
+ "cppDependencies": [
+ {
+ "groupId": "com.revrobotics.frc",
+ "artifactId": "REVLib-cpp",
+ "version": "2023.1.3",
+ "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": "2023.1.3",
+ "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/WPILibNewCommands.json b/vendordeps/WPILibNewCommands.json
new file mode 100644
index 0000000..b5ebdcd
--- /dev/null
+++ b/vendordeps/WPILibNewCommands.json
@@ -0,0 +1,37 @@
+{
+ "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"
+ ]
+ }
+ ]
+}