`B7+PNjEbXBkv=B+Pi^~L#EO$D$ZqTiD8f<5$eyb54-(=3
zh)6i8i|jp(@OnRrY5B8t|LFXFQVQ895n*P16cEKTrT*~yLH6Z4e*bZ5otpRDri&+A
zfNbK1D5@O=sm`fN=WzWyse!za5n%^+6dHPGX#8DyIK>?9qyX}2XvBWVqbP%%D)7$=
z=#$WulZlZR<{m#gU7lwqK4WS1Ne$#_P{b17qe$~UOXCl>5b|6WVh;5vVnR<%d+Lnp
z$uEmML38}U4vaW8>shm6CzB(Wei3s#NAWE3)a2)z@i{4jTn;;aQS)O@l{rUM`J@K&
l00vQ5JBs~;vo!vr%%-k{2_Fq1Mn4QF81S)AQ99zk{{c4yR+0b!
literal 0
HcmV?d00001
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 0000000..5e82d67
--- /dev/null
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,7 @@
+distributionBase=GRADLE_USER_HOME
+distributionPath=permwrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-bin.zip
+networkTimeout=10000
+validateDistributionUrl=true
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=permwrapper/dists
diff --git a/gradlew b/gradlew
new file mode 100644
index 0000000..1aa94a4
--- /dev/null
+++ b/gradlew
@@ -0,0 +1,249 @@
+#!/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/HEAD/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
+
+# This is normally unused
+# 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
+
+# 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
+ if ! command -v java >/dev/null 2>&1
+ then
+ 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
+fi
+
+# Increase the maximum file descriptors if we can.
+if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
+ case $MAX_FD in #(
+ max*)
+ # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.
+ # shellcheck disable=SC2039,SC3045
+ MAX_FD=$( ulimit -H -n ) ||
+ warn "Could not query maximum file descriptor limit"
+ esac
+ case $MAX_FD in #(
+ '' | soft) :;; #(
+ *)
+ # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.
+ # shellcheck disable=SC2039,SC3045
+ 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
+
+
+# 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"'
+
+# Collect all arguments for the java command:
+# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments,
+# and any embedded shellness will be escaped.
+# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be
+# treated as '${Hostname}' itself on the command line.
+
+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..93e3f59
--- /dev/null
+++ b/gradlew.bat
@@ -0,0 +1,92 @@
+@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=.
+@rem This is normally unused
+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..d94f73c
--- /dev/null
+++ b/settings.gradle
@@ -0,0 +1,30 @@
+import org.gradle.internal.os.OperatingSystem
+
+pluginManagement {
+ repositories {
+ mavenLocal()
+ gradlePluginPortal()
+ String frcYear = '2024'
+ 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
+ }
+ }
+}
+
+Properties props = System.getProperties();
+props.setProperty("org.gradle.internal.native.headers.unresolved.dependencies.ignore", "true");
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..7871d53
--- /dev/null
+++ b/src/main/java/frc/lib/math/Conversions.java
@@ -0,0 +1,94 @@
+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
+ * @param circumference Circumference of Wheel
+ * @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..e4c1815
--- /dev/null
+++ b/src/main/java/frc/robot/Constants.java
@@ -0,0 +1,33 @@
+package frc.robot;
+
+/**
+ * Constants file.
+ */
+public final class Constants {
+ /**
+ * Stick Deadband
+ */
+ public static final double stickDeadband = 0.1;
+ /**
+ * Driver ID
+ */
+ public static final int driverID = 0;
+ /**
+ * Operator ID
+ */
+ public static final int operatorID = 1;
+
+ /**
+ * Motor CAN id's.
+ */
+ public static final class Motors {
+ }
+
+ /**
+ * Pneumatics CAN id constants.
+ */
+ public static final class Pneumatics {
+ }
+
+
+}
diff --git a/src/main/java/frc/robot/Main.java b/src/main/java/frc/robot/Main.java
new file mode 100644
index 0000000..66a8c84
--- /dev/null
+++ b/src/main/java/frc/robot/Main.java
@@ -0,0 +1,28 @@
+// 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 String args
+ */
+ 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..b22af27
--- /dev/null
+++ b/src/main/java/frc/robot/Robot.java
@@ -0,0 +1,201 @@
+// 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 java.io.IOException;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.Scanner;
+import org.littletonrobotics.junction.LogFileUtil;
+import org.littletonrobotics.junction.LoggedRobot;
+import org.littletonrobotics.junction.Logger;
+import org.littletonrobotics.junction.networktables.NT4Publisher;
+import org.littletonrobotics.junction.wpilog.WPILOGReader;
+import org.littletonrobotics.junction.wpilog.WPILOGWriter;
+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 LoggedRobot {
+ private RobotContainer robotContainer;
+ private Command autoChooser;
+
+ /**
+ * Robnot Run type
+ */
+ public static enum RobotRunType {
+ /** Real Robot. */
+ kReal,
+ /** Simulation runtime. */
+ kSimulation,
+ /** Replay runtime. */
+ kReplay;
+ }
+
+ public RobotRunType robotRunType = RobotRunType.kReal;
+
+ // 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() {
+ // Record metadata
+ Logger.recordMetadata("ProjectName", BuildConstants.MAVEN_NAME);
+ Logger.recordMetadata("BuildDate", BuildConstants.BUILD_DATE);
+ Logger.recordMetadata("GitSHA", BuildConstants.GIT_SHA);
+ Logger.recordMetadata("GitDate", BuildConstants.GIT_DATE);
+ Logger.recordMetadata("GitBranch", BuildConstants.GIT_BRANCH);
+ switch (BuildConstants.DIRTY) {
+ case 0:
+ Logger.recordMetadata("GitDirty", "All changes committed");
+ break;
+ case 1:
+ Logger.recordMetadata("GitDirty", "Uncommitted changes");
+ break;
+ default:
+ Logger.recordMetadata("GitDirty", "Unknown");
+ break;
+ }
+
+
+
+ if (isReal()) {
+ Logger.addDataReceiver(new WPILOGWriter("/media/sda1")); // Log to a USB stick
+ Logger.addDataReceiver(new NT4Publisher()); // Publish data to NetworkTables
+ // new PowerDistribution(1, ModuleType.kRev); // Enables power distribution logging
+ setUseTiming(true);
+ robotRunType = RobotRunType.kReal;
+ } else {
+ String logPath = findReplayLog();
+ if (logPath == null) {
+ Logger.addDataReceiver(new NT4Publisher()); // Publish data to NetworkTables
+ setUseTiming(true);
+ robotRunType = RobotRunType.kSimulation;
+ } else {
+ // (or prompt the user)
+ Logger.setReplaySource(new WPILOGReader(logPath)); // Read replay log
+ Logger
+ .addDataReceiver(new WPILOGWriter(LogFileUtil.addPathSuffix(logPath, "_sim")));
+ // Save outputs to a new log
+ setUseTiming(false); // Run as fast as possible
+ robotRunType = RobotRunType.kReplay;
+
+ }
+ }
+ // Logger.disableDeterministicTimestamps() // See "Deterministic Timestamps" in the
+ // "Understanding Data Flow" page
+ Logger.start(); // Start logging! No more data receivers, replay sources, or metadata values
+
+ // Instantiate our RobotContainer. This will perform all our button bindings,
+ // and put our autonomous chooser on the dashboard.
+ robotContainer = new RobotContainer(robotRunType);
+ }
+
+ /**
+ * 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() {}
+
+
+ private static final String environmentVariable = "AKIT_LOG_PATH";
+ private static final String advantageScopeFileName = "akit-log-path.txt";
+
+ /**
+ * Finds the path to a log file for replay, using the following priorities: 1. The value of the
+ * "AKIT_LOG_PATH" environment variable, if set 2. The file currently open in AdvantageScope, if
+ * available 3. The result of the prompt displayed to the user
+ */
+ public static String findReplayLog() {
+ // Read environment variables
+ String envPath = System.getenv(environmentVariable);
+ if (envPath != null) {
+ System.out.println("Using log from " + environmentVariable
+ + " environment variable - \"" + envPath + "\"");
+ return envPath;
+ }
+
+ // Read file from AdvantageScope
+ Path advantageScopeTempPath =
+ Paths.get(System.getProperty("java.io.tmpdir"), advantageScopeFileName);
+ String advantageScopeLogPath = null;
+ try (Scanner fileScanner = new Scanner(advantageScopeTempPath)) {
+ advantageScopeLogPath = fileScanner.nextLine();
+ } catch (IOException e) {
+ System.out.println("Something went wrong");
+ }
+ if (advantageScopeLogPath != null) {
+ System.out.println("Using log from AdvantageScope - \"" + advantageScopeLogPath + "\"");
+ return advantageScopeLogPath;
+ }
+ return null;
+ }
+}
diff --git a/src/main/java/frc/robot/RobotContainer.java b/src/main/java/frc/robot/RobotContainer.java
new file mode 100644
index 0000000..2756f2f
--- /dev/null
+++ b/src/main/java/frc/robot/RobotContainer.java
@@ -0,0 +1,78 @@
+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.InstantCommand;
+import edu.wpi.first.wpilibj2.command.WaitCommand;
+import edu.wpi.first.wpilibj2.command.button.CommandXboxController;
+import frc.robot.Robot.RobotRunType;
+import frc.robot.subsystems.drive.Drivetrain;
+import frc.robot.subsystems.drive.DrivetrainIO;
+import frc.robot.subsystems.drive.DrivetrainReal;
+
+/**
+ * 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<>();
+
+ /* Subsystems */
+ private Drivetrain drivetrain;
+
+ /**
+ * The container for the robot. Contains subsystems, OI devices, and commands.
+ */
+ public RobotContainer(RobotRunType runtimeType) {
+ SmartDashboard.putData("Choose Auto: ", autoChooser);
+ autoChooser.setDefaultOption("Wait 1 Second", "wait");
+ switch (runtimeType) {
+ case kReal:
+ drivetrain = new Drivetrain(new DrivetrainReal());
+ break;
+ case kSimulation:
+ // drivetrain = new Drivetrain(new DrivetrainSim() {});
+ break;
+ default:
+ drivetrain = new Drivetrain(new DrivetrainIO() {});
+ }
+ // 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() {
+ Command autocommand;
+ String stuff = autoChooser.getSelected();
+ switch (stuff) {
+ case "wait":
+ autocommand = new WaitCommand(1.0);
+ break;
+ default:
+ autocommand = new InstantCommand();
+ }
+ return autocommand;
+ }
+}
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/subsystems/.keep b/src/main/java/frc/robot/subsystems/.keep
new file mode 100644
index 0000000..e69de29
diff --git a/src/main/java/frc/robot/subsystems/drive/Drivetrain.java b/src/main/java/frc/robot/subsystems/drive/Drivetrain.java
new file mode 100644
index 0000000..88e6569
--- /dev/null
+++ b/src/main/java/frc/robot/subsystems/drive/Drivetrain.java
@@ -0,0 +1,27 @@
+package frc.robot.subsystems.drive;
+
+import org.littletonrobotics.junction.Logger;
+import edu.wpi.first.wpilibj2.command.SubsystemBase;
+
+/**
+ * Drivetrain subsystem.
+ */
+
+public class Drivetrain extends SubsystemBase {
+ private DrivetrainIO io;
+ private DrivetrainIOInputsAutoLogged inputs = new DrivetrainIOInputsAutoLogged();
+
+ /**
+ * Create Wrist Intake Subsystem
+ */
+ public Drivetrain(DrivetrainIO io) {
+ this.io = io;
+ }
+
+ @Override
+ public void periodic() {
+ io.updateInputs(inputs);
+ Logger.processInputs("Drivetrain", inputs);
+ }
+}
+
diff --git a/src/main/java/frc/robot/subsystems/drive/DrivetrainIO.java b/src/main/java/frc/robot/subsystems/drive/DrivetrainIO.java
new file mode 100644
index 0000000..842e1aa
--- /dev/null
+++ b/src/main/java/frc/robot/subsystems/drive/DrivetrainIO.java
@@ -0,0 +1,25 @@
+package frc.robot.subsystems.drive;
+
+import org.littletonrobotics.junction.AutoLog;
+import edu.wpi.first.math.geometry.Rotation2d;
+
+/**
+ * DrivetrainIO interface
+ */
+public interface DrivetrainIO {
+ /**
+ * Drivetrain IO
+ */
+ @AutoLog
+ public static class DrivetrainIOInputs {
+ public Rotation2d gyroYaw = new Rotation2d();
+ }
+
+ /** Updates the set of loggable inputs. */
+ public default void updateInputs(DrivetrainIOInputs inputs) {}
+
+ /** Run the motor at the specified voltage. */
+ public default void setDriveVoltage(double lvolts, double rvolts) {}
+
+
+}
diff --git a/src/main/java/frc/robot/subsystems/drive/DrivetrainReal.java b/src/main/java/frc/robot/subsystems/drive/DrivetrainReal.java
new file mode 100644
index 0000000..f8f17d1
--- /dev/null
+++ b/src/main/java/frc/robot/subsystems/drive/DrivetrainReal.java
@@ -0,0 +1,26 @@
+package frc.robot.subsystems.drive;
+
+import edu.wpi.first.math.geometry.Rotation2d;
+
+/**
+ * DrivetrainReal
+ */
+public class DrivetrainReal implements DrivetrainIO {
+
+
+ /**
+ * Drivetrain Real
+ */
+ public DrivetrainReal() {}
+
+ @Override
+ public void updateInputs(DrivetrainIOInputs inputs) {
+ inputs.gyroYaw = Rotation2d.fromDegrees(0);
+ }
+
+ /**
+ * Drive Voltage
+ */
+ public void setDriveVoltage(double lvolts, double rvolts) {}
+
+}
diff --git a/vendordeps/AdvantageKit.json b/vendordeps/AdvantageKit.json
new file mode 100644
index 0000000..63dacbb
--- /dev/null
+++ b/vendordeps/AdvantageKit.json
@@ -0,0 +1,42 @@
+{
+ "fileName": "AdvantageKit.json",
+ "name": "AdvantageKit",
+ "version": "3.2.1",
+ "uuid": "d820cc26-74e3-11ec-90d6-0242ac120003",
+ "frcYear": "2024",
+ "mavenUrls": [],
+ "jsonUrl": "https://github.com/Mechanical-Advantage/AdvantageKit/releases/latest/download/AdvantageKit.json",
+ "javaDependencies": [
+ {
+ "groupId": "org.littletonrobotics.akit.junction",
+ "artifactId": "wpilib-shim",
+ "version": "3.2.1"
+ },
+ {
+ "groupId": "org.littletonrobotics.akit.junction",
+ "artifactId": "junction-core",
+ "version": "3.2.1"
+ },
+ {
+ "groupId": "org.littletonrobotics.akit.conduit",
+ "artifactId": "conduit-api",
+ "version": "3.2.1"
+ }
+ ],
+ "jniDependencies": [
+ {
+ "groupId": "org.littletonrobotics.akit.conduit",
+ "artifactId": "conduit-wpilibio",
+ "version": "3.2.1",
+ "skipInvalidPlatforms": false,
+ "isJar": false,
+ "validPlatforms": [
+ "linuxathena",
+ "windowsx86-64",
+ "linuxx86-64",
+ "osxuniversal"
+ ]
+ }
+ ],
+ "cppDependencies": []
+}
\ No newline at end of file
diff --git a/vendordeps/NavX.json b/vendordeps/NavX.json
new file mode 100644
index 0000000..e978a5f
--- /dev/null
+++ b/vendordeps/NavX.json
@@ -0,0 +1,40 @@
+{
+ "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/vendordeps/PathplannerLib.json b/vendordeps/PathplannerLib.json
new file mode 100644
index 0000000..6dc648d
--- /dev/null
+++ b/vendordeps/PathplannerLib.json
@@ -0,0 +1,38 @@
+{
+ "fileName": "PathplannerLib.json",
+ "name": "PathplannerLib",
+ "version": "2024.2.8",
+ "uuid": "1b42324f-17c6-4875-8e77-1c312bc8c786",
+ "frcYear": "2024",
+ "mavenUrls": [
+ "https://3015rangerrobotics.github.io/pathplannerlib/repo"
+ ],
+ "jsonUrl": "https://3015rangerrobotics.github.io/pathplannerlib/PathplannerLib.json",
+ "javaDependencies": [
+ {
+ "groupId": "com.pathplanner.lib",
+ "artifactId": "PathplannerLib-java",
+ "version": "2024.2.8"
+ }
+ ],
+ "jniDependencies": [],
+ "cppDependencies": [
+ {
+ "groupId": "com.pathplanner.lib",
+ "artifactId": "PathplannerLib-cpp",
+ "version": "2024.2.8",
+ "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.json b/vendordeps/Phoenix5.json
new file mode 100644
index 0000000..ff7359e
--- /dev/null
+++ b/vendordeps/Phoenix5.json
@@ -0,0 +1,151 @@
+{
+ "fileName": "Phoenix5.json",
+ "name": "CTRE-Phoenix (v5)",
+ "version": "5.33.1",
+ "frcYear": 2024,
+ "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",
+ "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"
+ }
+ ],
+ "javaDependencies": [
+ {
+ "groupId": "com.ctre.phoenix",
+ "artifactId": "api-java",
+ "version": "5.33.1"
+ },
+ {
+ "groupId": "com.ctre.phoenix",
+ "artifactId": "wpiapi-java",
+ "version": "5.33.1"
+ }
+ ],
+ "jniDependencies": [
+ {
+ "groupId": "com.ctre.phoenix",
+ "artifactId": "cci",
+ "version": "5.33.1",
+ "isJar": false,
+ "skipInvalidPlatforms": true,
+ "validPlatforms": [
+ "windowsx86-64",
+ "linuxx86-64",
+ "linuxathena"
+ ],
+ "simMode": "hwsim"
+ },
+ {
+ "groupId": "com.ctre.phoenix.sim",
+ "artifactId": "cci-sim",
+ "version": "5.33.1",
+ "isJar": false,
+ "skipInvalidPlatforms": true,
+ "validPlatforms": [
+ "windowsx86-64",
+ "linuxx86-64",
+ "osxuniversal"
+ ],
+ "simMode": "swsim"
+ }
+ ],
+ "cppDependencies": [
+ {
+ "groupId": "com.ctre.phoenix",
+ "artifactId": "wpiapi-cpp",
+ "version": "5.33.1",
+ "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.33.1",
+ "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.33.1",
+ "libName": "CTRE_PhoenixCCI",
+ "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.33.1",
+ "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.33.1",
+ "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.33.1",
+ "libName": "CTRE_PhoenixCCISim",
+ "headerClassifier": "headers",
+ "sharedLibrary": true,
+ "skipInvalidPlatforms": true,
+ "binaryPlatforms": [
+ "windowsx86-64",
+ "linuxx86-64",
+ "osxuniversal"
+ ],
+ "simMode": "swsim"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/vendordeps/Phoenix6.json b/vendordeps/Phoenix6.json
new file mode 100644
index 0000000..0322385
--- /dev/null
+++ b/vendordeps/Phoenix6.json
@@ -0,0 +1,339 @@
+{
+ "fileName": "Phoenix6.json",
+ "name": "CTRE-Phoenix (v6)",
+ "version": "24.3.0",
+ "frcYear": 2024,
+ "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",
+ "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"
+ }
+ ],
+ "javaDependencies": [
+ {
+ "groupId": "com.ctre.phoenix6",
+ "artifactId": "wpiapi-java",
+ "version": "24.3.0"
+ }
+ ],
+ "jniDependencies": [
+ {
+ "groupId": "com.ctre.phoenix6",
+ "artifactId": "tools",
+ "version": "24.3.0",
+ "isJar": false,
+ "skipInvalidPlatforms": true,
+ "validPlatforms": [
+ "windowsx86-64",
+ "linuxx86-64",
+ "linuxathena"
+ ],
+ "simMode": "hwsim"
+ },
+ {
+ "groupId": "com.ctre.phoenix6.sim",
+ "artifactId": "tools-sim",
+ "version": "24.3.0",
+ "isJar": false,
+ "skipInvalidPlatforms": true,
+ "validPlatforms": [
+ "windowsx86-64",
+ "linuxx86-64",
+ "osxuniversal"
+ ],
+ "simMode": "swsim"
+ },
+ {
+ "groupId": "com.ctre.phoenix6.sim",
+ "artifactId": "simTalonSRX",
+ "version": "24.3.0",
+ "isJar": false,
+ "skipInvalidPlatforms": true,
+ "validPlatforms": [
+ "windowsx86-64",
+ "linuxx86-64",
+ "osxuniversal"
+ ],
+ "simMode": "swsim"
+ },
+ {
+ "groupId": "com.ctre.phoenix6.sim",
+ "artifactId": "simTalonFX",
+ "version": "24.3.0",
+ "isJar": false,
+ "skipInvalidPlatforms": true,
+ "validPlatforms": [
+ "windowsx86-64",
+ "linuxx86-64",
+ "osxuniversal"
+ ],
+ "simMode": "swsim"
+ },
+ {
+ "groupId": "com.ctre.phoenix6.sim",
+ "artifactId": "simVictorSPX",
+ "version": "24.3.0",
+ "isJar": false,
+ "skipInvalidPlatforms": true,
+ "validPlatforms": [
+ "windowsx86-64",
+ "linuxx86-64",
+ "osxuniversal"
+ ],
+ "simMode": "swsim"
+ },
+ {
+ "groupId": "com.ctre.phoenix6.sim",
+ "artifactId": "simPigeonIMU",
+ "version": "24.3.0",
+ "isJar": false,
+ "skipInvalidPlatforms": true,
+ "validPlatforms": [
+ "windowsx86-64",
+ "linuxx86-64",
+ "osxuniversal"
+ ],
+ "simMode": "swsim"
+ },
+ {
+ "groupId": "com.ctre.phoenix6.sim",
+ "artifactId": "simCANCoder",
+ "version": "24.3.0",
+ "isJar": false,
+ "skipInvalidPlatforms": true,
+ "validPlatforms": [
+ "windowsx86-64",
+ "linuxx86-64",
+ "osxuniversal"
+ ],
+ "simMode": "swsim"
+ },
+ {
+ "groupId": "com.ctre.phoenix6.sim",
+ "artifactId": "simProTalonFX",
+ "version": "24.3.0",
+ "isJar": false,
+ "skipInvalidPlatforms": true,
+ "validPlatforms": [
+ "windowsx86-64",
+ "linuxx86-64",
+ "osxuniversal"
+ ],
+ "simMode": "swsim"
+ },
+ {
+ "groupId": "com.ctre.phoenix6.sim",
+ "artifactId": "simProCANcoder",
+ "version": "24.3.0",
+ "isJar": false,
+ "skipInvalidPlatforms": true,
+ "validPlatforms": [
+ "windowsx86-64",
+ "linuxx86-64",
+ "osxuniversal"
+ ],
+ "simMode": "swsim"
+ },
+ {
+ "groupId": "com.ctre.phoenix6.sim",
+ "artifactId": "simProPigeon2",
+ "version": "24.3.0",
+ "isJar": false,
+ "skipInvalidPlatforms": true,
+ "validPlatforms": [
+ "windowsx86-64",
+ "linuxx86-64",
+ "osxuniversal"
+ ],
+ "simMode": "swsim"
+ }
+ ],
+ "cppDependencies": [
+ {
+ "groupId": "com.ctre.phoenix6",
+ "artifactId": "wpiapi-cpp",
+ "version": "24.3.0",
+ "libName": "CTRE_Phoenix6_WPI",
+ "headerClassifier": "headers",
+ "sharedLibrary": true,
+ "skipInvalidPlatforms": true,
+ "binaryPlatforms": [
+ "windowsx86-64",
+ "linuxx86-64",
+ "linuxathena"
+ ],
+ "simMode": "hwsim"
+ },
+ {
+ "groupId": "com.ctre.phoenix6",
+ "artifactId": "tools",
+ "version": "24.3.0",
+ "libName": "CTRE_PhoenixTools",
+ "headerClassifier": "headers",
+ "sharedLibrary": true,
+ "skipInvalidPlatforms": true,
+ "binaryPlatforms": [
+ "windowsx86-64",
+ "linuxx86-64",
+ "linuxathena"
+ ],
+ "simMode": "hwsim"
+ },
+ {
+ "groupId": "com.ctre.phoenix6.sim",
+ "artifactId": "wpiapi-cpp-sim",
+ "version": "24.3.0",
+ "libName": "CTRE_Phoenix6_WPISim",
+ "headerClassifier": "headers",
+ "sharedLibrary": true,
+ "skipInvalidPlatforms": true,
+ "binaryPlatforms": [
+ "windowsx86-64",
+ "linuxx86-64",
+ "osxuniversal"
+ ],
+ "simMode": "swsim"
+ },
+ {
+ "groupId": "com.ctre.phoenix6.sim",
+ "artifactId": "tools-sim",
+ "version": "24.3.0",
+ "libName": "CTRE_PhoenixTools_Sim",
+ "headerClassifier": "headers",
+ "sharedLibrary": true,
+ "skipInvalidPlatforms": true,
+ "binaryPlatforms": [
+ "windowsx86-64",
+ "linuxx86-64",
+ "osxuniversal"
+ ],
+ "simMode": "swsim"
+ },
+ {
+ "groupId": "com.ctre.phoenix6.sim",
+ "artifactId": "simTalonSRX",
+ "version": "24.3.0",
+ "libName": "CTRE_SimTalonSRX",
+ "headerClassifier": "headers",
+ "sharedLibrary": true,
+ "skipInvalidPlatforms": true,
+ "binaryPlatforms": [
+ "windowsx86-64",
+ "linuxx86-64",
+ "osxuniversal"
+ ],
+ "simMode": "swsim"
+ },
+ {
+ "groupId": "com.ctre.phoenix6.sim",
+ "artifactId": "simTalonFX",
+ "version": "24.3.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.3.0",
+ "libName": "CTRE_SimVictorSPX",
+ "headerClassifier": "headers",
+ "sharedLibrary": true,
+ "skipInvalidPlatforms": true,
+ "binaryPlatforms": [
+ "windowsx86-64",
+ "linuxx86-64",
+ "osxuniversal"
+ ],
+ "simMode": "swsim"
+ },
+ {
+ "groupId": "com.ctre.phoenix6.sim",
+ "artifactId": "simPigeonIMU",
+ "version": "24.3.0",
+ "libName": "CTRE_SimPigeonIMU",
+ "headerClassifier": "headers",
+ "sharedLibrary": true,
+ "skipInvalidPlatforms": true,
+ "binaryPlatforms": [
+ "windowsx86-64",
+ "linuxx86-64",
+ "osxuniversal"
+ ],
+ "simMode": "swsim"
+ },
+ {
+ "groupId": "com.ctre.phoenix6.sim",
+ "artifactId": "simCANCoder",
+ "version": "24.3.0",
+ "libName": "CTRE_SimCANCoder",
+ "headerClassifier": "headers",
+ "sharedLibrary": true,
+ "skipInvalidPlatforms": true,
+ "binaryPlatforms": [
+ "windowsx86-64",
+ "linuxx86-64",
+ "osxuniversal"
+ ],
+ "simMode": "swsim"
+ },
+ {
+ "groupId": "com.ctre.phoenix6.sim",
+ "artifactId": "simProTalonFX",
+ "version": "24.3.0",
+ "libName": "CTRE_SimProTalonFX",
+ "headerClassifier": "headers",
+ "sharedLibrary": true,
+ "skipInvalidPlatforms": true,
+ "binaryPlatforms": [
+ "windowsx86-64",
+ "linuxx86-64",
+ "osxuniversal"
+ ],
+ "simMode": "swsim"
+ },
+ {
+ "groupId": "com.ctre.phoenix6.sim",
+ "artifactId": "simProCANcoder",
+ "version": "24.3.0",
+ "libName": "CTRE_SimProCANcoder",
+ "headerClassifier": "headers",
+ "sharedLibrary": true,
+ "skipInvalidPlatforms": true,
+ "binaryPlatforms": [
+ "windowsx86-64",
+ "linuxx86-64",
+ "osxuniversal"
+ ],
+ "simMode": "swsim"
+ },
+ {
+ "groupId": "com.ctre.phoenix6.sim",
+ "artifactId": "simProPigeon2",
+ "version": "24.3.0",
+ "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..f85acd4
--- /dev/null
+++ b/vendordeps/REVLib.json
@@ -0,0 +1,74 @@
+{
+ "fileName": "REVLib.json",
+ "name": "REVLib",
+ "version": "2024.2.4",
+ "frcYear": "2024",
+ "uuid": "3f48eb8c-50fe-43a6-9cb7-44c86353c4cb",
+ "mavenUrls": [
+ "https://maven.revrobotics.com/"
+ ],
+ "jsonUrl": "https://software-metadata.revrobotics.com/REVLib-2024.json",
+ "javaDependencies": [
+ {
+ "groupId": "com.revrobotics.frc",
+ "artifactId": "REVLib-java",
+ "version": "2024.2.4"
+ }
+ ],
+ "jniDependencies": [
+ {
+ "groupId": "com.revrobotics.frc",
+ "artifactId": "REVLib-driver",
+ "version": "2024.2.4",
+ "skipInvalidPlatforms": true,
+ "isJar": false,
+ "validPlatforms": [
+ "windowsx86-64",
+ "windowsx86",
+ "linuxarm64",
+ "linuxx86-64",
+ "linuxathena",
+ "linuxarm32",
+ "osxuniversal"
+ ]
+ }
+ ],
+ "cppDependencies": [
+ {
+ "groupId": "com.revrobotics.frc",
+ "artifactId": "REVLib-cpp",
+ "version": "2024.2.4",
+ "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": "2024.2.4",
+ "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..67bf389
--- /dev/null
+++ b/vendordeps/WPILibNewCommands.json
@@ -0,0 +1,38 @@
+{
+ "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/vendordeps/photonlib.json b/vendordeps/photonlib.json
new file mode 100644
index 0000000..0e80a16
--- /dev/null
+++ b/vendordeps/photonlib.json
@@ -0,0 +1,57 @@
+{
+ "fileName": "photonlib.json",
+ "name": "photonlib",
+ "version": "v2024.3.1",
+ "uuid": "515fe07e-bfc6-11fa-b3de-0242ac130004",
+ "frcYear": "2024",
+ "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": "v2024.3.1",
+ "libName": "photonlib",
+ "headerClassifier": "headers",
+ "sharedLibrary": true,
+ "skipInvalidPlatforms": true,
+ "binaryPlatforms": [
+ "windowsx86-64",
+ "linuxathena",
+ "linuxx86-64",
+ "osxuniversal"
+ ]
+ },
+ {
+ "groupId": "org.photonvision",
+ "artifactId": "photontargeting-cpp",
+ "version": "v2024.3.1",
+ "libName": "photontargeting",
+ "headerClassifier": "headers",
+ "sharedLibrary": true,
+ "skipInvalidPlatforms": true,
+ "binaryPlatforms": [
+ "windowsx86-64",
+ "linuxathena",
+ "linuxx86-64",
+ "osxuniversal"
+ ]
+ }
+ ],
+ "javaDependencies": [
+ {
+ "groupId": "org.photonvision",
+ "artifactId": "photonlib-java",
+ "version": "v2024.3.1"
+ },
+ {
+ "groupId": "org.photonvision",
+ "artifactId": "photontargeting-java",
+ "version": "v2024.3.1"
+ }
+ ]
+}
\ No newline at end of file