From b2c2a0fff8c4ff12b85fec65262612a70deed1fd Mon Sep 17 00:00:00 2001 From: Trevor Tsang Date: Tue, 27 Feb 2018 19:27:51 -0700 Subject: [PATCH 1/8] Updated outdated implementation causing crashes --- .../module/joysticks/XboxController.java | 4 +- .../util/dashboard/BooleanDashboard.java | 97 ------------------- .../first/util/dashboard/NumberDashboard.java | 77 --------------- .../first/util/dashboard/StringDashboard.java | 86 ---------------- 4 files changed, 2 insertions(+), 262 deletions(-) delete mode 100644 src/edu/first/util/dashboard/BooleanDashboard.java delete mode 100644 src/edu/first/util/dashboard/NumberDashboard.java delete mode 100644 src/edu/first/util/dashboard/StringDashboard.java diff --git a/src/edu/first/module/joysticks/XboxController.java b/src/edu/first/module/joysticks/XboxController.java index 74e946f..a4f1a71 100644 --- a/src/edu/first/module/joysticks/XboxController.java +++ b/src/edu/first/module/joysticks/XboxController.java @@ -56,8 +56,8 @@ public class XboxController extends BindingJoystick { /** * Port for axis. */ - public static final int LEFT_X = 0, LEFT_Y = 1, LEFT_TRIGGER = 2, RIGHT_TRIGGER = 3, - RIGHT_X = 4, RIGHT_Y = 5, RIGHT_FROM_MIDDLE = 6, LEFT_FROM_MIDDLE = 7, TRIGGERS = 8; + public static final int LEFT_X = 1, LEFT_Y = 2, LEFT_TRIGGER = 3, RIGHT_TRIGGER = 4, + RIGHT_X = 5, RIGHT_Y = 6, RIGHT_FROM_MIDDLE = 7, LEFT_FROM_MIDDLE = 8, TRIGGERS = 9; /** * Constructs the joystick with the {@link edu.wpi.first.wpilibj.Joystick} diff --git a/src/edu/first/util/dashboard/BooleanDashboard.java b/src/edu/first/util/dashboard/BooleanDashboard.java deleted file mode 100644 index 44d3633..0000000 --- a/src/edu/first/util/dashboard/BooleanDashboard.java +++ /dev/null @@ -1,97 +0,0 @@ -package edu.first.util.dashboard; - -import edu.first.identifiers.Position; -import edu.first.identifiers.Switch; -import edu.wpi.first.wpilibj.smartdashboard.SmartDashboard; -import edu.wpi.first.wpilibj.tables.TableKeyNotDefinedException; - -/** - * General class that interacts with boolean values on the - * {@link SmartDashboard}. - * - * @since June 23 13 - * @author Joel Gallant - */ -public class BooleanDashboard implements Switch, Position { - - private final String key; - private final boolean defaultValue; - - /** - * Constructs the dashboard value with the key used to access it. - * - * @param key unique key that accesses the value - * @param defaultValue value to return if none exists - */ - public BooleanDashboard(String key, boolean defaultValue) { - this.key = key; - this.defaultValue = defaultValue; - } - - public BooleanDashboard(int dashboardIndex, boolean defaultValue) { - this("DB/Button " + dashboardIndex, defaultValue); - } - - /** - * Returns the key of the dashboard value that is used to access it. - * - * @return key in smart dashboard - */ - public String getKey() { - return key; - } - - /** - * Returns whether or not the value is currently stored on the CRIO. - * - * @return if value exists - */ - public boolean exists() { - try { - SmartDashboard.getBoolean(key, defaultValue); - return true; - } catch (TableKeyNotDefinedException ex) { - return false; - } - } - - /** - * Returns the current value associated with the key. Will return the - * default value when it does not {@link #exists() exist}. - * - * @return current value - */ - public boolean get() { - return SmartDashboard.getBoolean(key, defaultValue); - } - - /** - * Sets the value to be associated with the key. - * - * @param val new value to set - */ - public void set(boolean val) { - SmartDashboard.putBoolean(key, val); - } - - /** - * Sets the value to be associated with the key. - * - * @param pos new value to set - */ - @Override - public void setPosition(boolean pos) { - SmartDashboard.putBoolean(key, pos); - } - - /** - * Returns the current value associated with the key. Will return the - * default value when it does not {@link #exists() exist}. - * - * @return current value - */ - @Override - public boolean getPosition() { - return SmartDashboard.getBoolean(key, defaultValue); - } -} diff --git a/src/edu/first/util/dashboard/NumberDashboard.java b/src/edu/first/util/dashboard/NumberDashboard.java deleted file mode 100644 index b4053c3..0000000 --- a/src/edu/first/util/dashboard/NumberDashboard.java +++ /dev/null @@ -1,77 +0,0 @@ -package edu.first.util.dashboard; - -import edu.first.identifiers.Input; -import edu.first.identifiers.Output; -import edu.wpi.first.wpilibj.smartdashboard.SmartDashboard; -import edu.wpi.first.wpilibj.tables.TableKeyNotDefinedException; - -/** - * General class that interacts with number values on the {@link SmartDashboard} - * - * @since June 23 13 - * @author Joel Gallant - */ -public class NumberDashboard implements Input, Output { - - private final String key; - private final double defaultValue; - - /** - * Constructs the dashboard value with the key used to access it. - * - * @param key unique key that accesses the value - * @param defaultValue value to return if none exists - */ - public NumberDashboard(String key, double defaultValue) { - this.key = key; - this.defaultValue = defaultValue; - } - - public NumberDashboard(int dashboardIndex, double defaultValue) { - this("DB/Slider " + dashboardIndex, defaultValue); - } - - /** - * Returns the key of the dashboard value that is used to access it. - * - * @return key in smart dashboard - */ - public String getKey() { - return key; - } - - /** - * Returns whether or not the value is currently stored on the CRIO. - * - * @return if value exists - */ - public boolean exists() { - try { - SmartDashboard.getNumber(key, defaultValue); - return true; - } catch (TableKeyNotDefinedException ex) { - return false; - } - } - - /** - * Returns the current value associated with the key. Will return the - * default value when it does not {@link #exists() exist}. - * - * @return current value - */ - @Override - public double get() { - return SmartDashboard.getNumber(key, defaultValue); - } - - /** - * Sets the value to be associated with the key. - * - * @param val new value to set - */ - @Override - public void set(double val) { - SmartDashboard.putNumber(key, val); - } -} diff --git a/src/edu/first/util/dashboard/StringDashboard.java b/src/edu/first/util/dashboard/StringDashboard.java deleted file mode 100644 index 1d9d62f..0000000 --- a/src/edu/first/util/dashboard/StringDashboard.java +++ /dev/null @@ -1,86 +0,0 @@ -package edu.first.util.dashboard; - -import edu.first.identifiers.StringInput; -import edu.wpi.first.wpilibj.smartdashboard.SmartDashboard; -import edu.wpi.first.wpilibj.tables.TableKeyNotDefinedException; - -/** - * General class that interacts with string values on the - * {@link SmartDashboard}. - * - * @since June 23 13 - * @author Joel Gallant - */ -public class StringDashboard implements StringInput { - - private final String key; - private final String defaultValue; - - /** - * Constructs the dashboard value with the key used to access it. - * - * @param key unique key that accesses the value - * @param defaultValue value to return if none exists - */ - public StringDashboard(String key, String defaultValue) { - this.key = key; - this.defaultValue = defaultValue; - } - - public StringDashboard(int dashboardIndex, String defaultValue) { - this("DB/String " + dashboardIndex, defaultValue); - } - - /** - * Returns the key of the dashboard value that is used to access it. - * - * @return key in smart dashboard - */ - public String getKey() { - return key; - } - - /** - * Returns whether or not the value is currently stored on the CRIO. - * - * @return if value exists - */ - public boolean exists() { - try { - SmartDashboard.getString(key, defaultValue); - return true; - } catch (TableKeyNotDefinedException ex) { - return false; - } - } - - /** - * Returns the current value associated with the key. Will return the - * default value when it does not {@link #exists() exist}. - * - * @return current value - */ - public String get() { - return SmartDashboard.getString(key, defaultValue); - } - - /** - * Returns the current value associated with the key. Will return the - * default value when it does not {@link #exists() exist}. - * - * @return current value - */ - @Override - public String getValue() { - return SmartDashboard.getString(key, defaultValue); - } - - /** - * Sets the value to be associated with the key. - * - * @param val new value to set - */ - public void set(String val) { - SmartDashboard.putString(key, val); - } -} From ad92ca9d90ab0a675ab4fca04c998109d916692b Mon Sep 17 00:00:00 2001 From: Trevor Tsang Date: Thu, 1 Mar 2018 17:41:08 -0700 Subject: [PATCH 2/8] Initial Gradle implementation --- build.gradle | 45 +++++ gradle/wrapper/gradle-wrapper.properties | 5 + gradlew | 172 ++++++++++++++++++ gradlew.bat | 84 +++++++++ .../module/joysticks/XboxController.java | 17 +- 5 files changed, 315 insertions(+), 8 deletions(-) create mode 100644 build.gradle create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100644 gradlew create mode 100644 gradlew.bat diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..d3f4f36 --- /dev/null +++ b/build.gradle @@ -0,0 +1,45 @@ +/* + * This file was generated by the Gradle 'init' task. + * + * This generated file contains a sample Java Library project to get you started. + * For more details take a look at the Java Libraries chapter in the Gradle + * user guide available at https://docs.gradle.org/4.5.1/userguide/java_library_plugin.html + */ + +plugins { + id 'java' + id "jaci.openrio.gradle.GradleRIO" version "2018.01.22" +} + +sourceSets { + main { + java { + srcDir 'src' + } + } + + test { + java { + srcDir 'src' + } + } +} + +dependencies { + // This dependency is exported to consumers, that is to say found on their compile classpath. + // api 'org.apache.commons:commons-math3:3.6.1' + + // This dependency is used internally, and not exposed to consumers on their own compile classpath. + compile "edu.wpi.first.wpilibj:athena-jni:+" + compile "edu.wpi.first.wpilibj:athena:+" + + // Use JUnit test framework + // testImplementation 'junit:junit:4.12' +} + +// In this section you declare where to find the dependencies of your project +repositories { + maven { + url "http://first.wpi.edu/FRC/roborio/maven/" + } +} diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..568c50b --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-4.5.1-bin.zip diff --git a/gradlew b/gradlew new file mode 100644 index 0000000..cccdd3d --- /dev/null +++ b/gradlew @@ -0,0 +1,172 @@ +#!/usr/bin/env sh + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$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="" + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +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" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=$(save "$@") + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong +if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then + cd "$(dirname "$0")" +fi + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000..f955316 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,84 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/src/edu/first/module/joysticks/XboxController.java b/src/edu/first/module/joysticks/XboxController.java index a4f1a71..545b0d0 100644 --- a/src/edu/first/module/joysticks/XboxController.java +++ b/src/edu/first/module/joysticks/XboxController.java @@ -24,17 +24,17 @@ * Raw axes: * *
- * 0: Left Stick X Axis
+ * 1: Left Stick X Axis
  *     Left: Negative; Right: Positive
- * 1: Left Stick Y Axis
+ * 2: Left Stick Y Axis
  *     Up: Positive; Down: Negative
- * 2: Left Trigger
- * 3: Right Trigger
- * 4: Right Stick X Axis
+ * 3: Left Trigger
+ * 4: Right Trigger
+ * 5: Right Stick X Axis
  *     Left: Negative; Right: Positive
- * 5: Right Stick Y Axis
+ * 6: Right Stick Y Axis
  *     Up: Positive; Down: Negative
- * 6: Directional Pad (Not recommended, buggy)
+ * N/A: Directional Pad (Not recommended, buggy)
  *     Left: -1; Right: +1
  * 7: Right distance from the middle
  *     Up: Positive; Down: Negative
@@ -57,7 +57,8 @@ public class XboxController extends BindingJoystick {
      * Port for axis.
      */
     public static final int LEFT_X = 1, LEFT_Y = 2, LEFT_TRIGGER = 3, RIGHT_TRIGGER = 4,
-            RIGHT_X = 5, RIGHT_Y = 6, RIGHT_FROM_MIDDLE = 7, LEFT_FROM_MIDDLE = 8, TRIGGERS = 9;
+            RIGHT_X = 5, RIGHT_Y = 6, RIGHT_FROM_MIDDLE = 7, LEFT_FROM_MIDDLE = 8, TRIGGERS = 9, 
+            DPAD = 10;
 
     /**
      * Constructs the joystick with the {@link edu.wpi.first.wpilibj.Joystick}

From 39a6f336aa81d109e59bf3eb0f1a45d87e067712 Mon Sep 17 00:00:00 2001
From: Trevor Tsang 
Date: Thu, 1 Mar 2018 17:48:43 -0700
Subject: [PATCH 3/8] Slightly updated build.gradle

---
 build.gradle | 14 --------------
 1 file changed, 14 deletions(-)

diff --git a/build.gradle b/build.gradle
index d3f4f36..ca8c97e 100644
--- a/build.gradle
+++ b/build.gradle
@@ -1,11 +1,3 @@
-/*
- * This file was generated by the Gradle 'init' task.
- *
- * This generated file contains a sample Java Library project to get you started.
- * For more details take a look at the Java Libraries chapter in the Gradle
- * user guide available at https://docs.gradle.org/4.5.1/userguide/java_library_plugin.html
- */
-
 plugins {
     id 'java'
     id "jaci.openrio.gradle.GradleRIO" version "2018.01.22"
@@ -17,12 +9,6 @@ sourceSets {
          srcDir 'src'
       }
    }
-	
-   test {
-      java {
-         srcDir 'src'
-      }
-   }
 }
 
 dependencies {

From 7579866c74718404442624bab952f62f3981ec39 Mon Sep 17 00:00:00 2001
From: Trevor Tsang 
Date: Thu, 1 Mar 2018 18:09:50 -0700
Subject: [PATCH 4/8] Button indexes start at 1

---
 .../module/joysticks/XboxController.java      | 48 +++++++++----------
 1 file changed, 24 insertions(+), 24 deletions(-)

diff --git a/src/edu/first/module/joysticks/XboxController.java b/src/edu/first/module/joysticks/XboxController.java
index 545b0d0..b18f039 100644
--- a/src/edu/first/module/joysticks/XboxController.java
+++ b/src/edu/first/module/joysticks/XboxController.java
@@ -9,36 +9,36 @@
  * Raw buttons:
  *
  * 
- * 0: A
- * 1: B
- * 2: X
- * 3: Y
- * 4: Left Bumper
- * 5: Right Bumper
- * 6: Back
- * 7: Start
- * 8: Left Joystick
- * 9: Right Joystick
+ * 1: A
+ * 2: B
+ * 3: X
+ * 4: Y
+ * 5: Left Bumper
+ * 6: Right Bumper
+ * 7: Back
+ * 8: Start
+ * 9: Left Joystick
+ * 10: Right Joystick
  * 
* * Raw axes: * *
- * 1: Left Stick X Axis
+ * 0: Left Stick X Axis
  *     Left: Negative; Right: Positive
- * 2: Left Stick Y Axis
+ * 1: Left Stick Y Axis
  *     Up: Positive; Down: Negative
- * 3: Left Trigger
- * 4: Right Trigger
- * 5: Right Stick X Axis
+ * 2: Left Trigger
+ * 3: Right Trigger
+ * 4: Right Stick X Axis
  *     Left: Negative; Right: Positive
- * 6: Right Stick Y Axis
+ * 5: Right Stick Y Axis
  *     Up: Positive; Down: Negative
  * N/A: Directional Pad (Not recommended, buggy)
  *     Left: -1; Right: +1
- * 7: Right distance from the middle
+ * 6: Right distance from the middle
  *     Up: Positive; Down: Negative
- * 8: Left distance from the middle
+ * 7: Left distance from the middle
  *     Up: Positive; Down: Negative
  * 
* @@ -50,15 +50,15 @@ public class XboxController extends BindingJoystick { /** * Port for button. */ - public static final int A = 0, B = 1, X = 2, - Y = 3, LEFT_BUMPER = 4, RIGHT_BUMPER = 5, - BACK = 6, START = 7, LEFT_STICK = 8, RIGHT_STICK = 9; + public static final int A = 1, B = 2, X = 3, + Y = 4, LEFT_BUMPER = 5, RIGHT_BUMPER = 6, + BACK = 7, START = 8, LEFT_STICK = 9, RIGHT_STICK = 10; /** * Port for axis. */ - public static final int LEFT_X = 1, LEFT_Y = 2, LEFT_TRIGGER = 3, RIGHT_TRIGGER = 4, - RIGHT_X = 5, RIGHT_Y = 6, RIGHT_FROM_MIDDLE = 7, LEFT_FROM_MIDDLE = 8, TRIGGERS = 9, - DPAD = 10; + public static final int LEFT_X = 0, LEFT_Y = 1, LEFT_TRIGGER = 2, RIGHT_TRIGGER = 3, + RIGHT_X = 4, RIGHT_Y = 5, RIGHT_FROM_MIDDLE = 6, LEFT_FROM_MIDDLE = 7, TRIGGERS = 8, + DPAD = 9; /** * Constructs the joystick with the {@link edu.wpi.first.wpilibj.Joystick} From b89bdeaaba0db8690654ffd1f65d0a93a8b35049 Mon Sep 17 00:00:00 2001 From: Trevor Tsang Date: Thu, 1 Mar 2018 18:14:28 -0700 Subject: [PATCH 5/8] Updated build.gradle again --- build.gradle | 8 -------- 1 file changed, 8 deletions(-) diff --git a/build.gradle b/build.gradle index ca8c97e..106daa9 100644 --- a/build.gradle +++ b/build.gradle @@ -12,18 +12,10 @@ sourceSets { } dependencies { - // This dependency is exported to consumers, that is to say found on their compile classpath. - // api 'org.apache.commons:commons-math3:3.6.1' - - // This dependency is used internally, and not exposed to consumers on their own compile classpath. compile "edu.wpi.first.wpilibj:athena-jni:+" compile "edu.wpi.first.wpilibj:athena:+" - - // Use JUnit test framework - // testImplementation 'junit:junit:4.12' } -// In this section you declare where to find the dependencies of your project repositories { maven { url "http://first.wpi.edu/FRC/roborio/maven/" From a3a0911daeeb584b50b64a8acb32c6a70949d7b8 Mon Sep 17 00:00:00 2001 From: Trevor Tsang Date: Sat, 3 Mar 2018 13:23:08 -0700 Subject: [PATCH 6/8] Added POV support --- src/edu/first/main/Constants.java | 44 ---- src/edu/first/main/GamePeriods.java | 203 ------------------ .../module/joysticks/JoystickModule.java | 24 +++ .../module/joysticks/XboxController.java | 10 +- src/edu/first/robot/RobotMode.java | 5 +- src/edu/first/robot/SafeRobotMode.java | 1 - src/edu/first/robot/SimpleRobot.java | 1 - 7 files changed, 32 insertions(+), 256 deletions(-) delete mode 100644 src/edu/first/main/Constants.java delete mode 100644 src/edu/first/main/GamePeriods.java diff --git a/src/edu/first/main/Constants.java b/src/edu/first/main/Constants.java deleted file mode 100644 index 4b1c588..0000000 --- a/src/edu/first/main/Constants.java +++ /dev/null @@ -1,44 +0,0 @@ -package edu.first.main; - -/** - * The central repository for all constant values. Values here are expected to - * be accessible to the entire program, and for anyone to view. - * - * Values in this interface follow this general contract: - *
    - *
  • Values should never need to be changed when code is deployed - *
  • Values should represent something universally true in all cases - *
  • Values should not be costly or lengthly to initialize - *
  • Values should be self-documented (self-explanatory) or have JavaDocs - * attached - *
- * - * There are many different possible ways to make use of this class. - * - * - * For putting values into {@code Constants}: - * - *
    - *
  • Create categorical interfaces with values that are alike and make this - * class extend them - *
  • Separate values in this interface using line breaks and comments - *
  • Use arrays as categories inside of this class indicating similar - * constant types - *
- * - * - * For accessing values in {@code Constants}: - * - *
    - *
  • If using this first structure of putting values into - * {@code Constants}, implement the appropriate interface to reduce class - * loading time - *
  • If not using the first method, implement this interface on classes to - * access the constants within it - *
- * - * @since May 07 13 - * @author Joel Gallant - */ -public interface Constants { -} diff --git a/src/edu/first/main/GamePeriods.java b/src/edu/first/main/GamePeriods.java deleted file mode 100644 index b578aba..0000000 --- a/src/edu/first/main/GamePeriods.java +++ /dev/null @@ -1,203 +0,0 @@ -/* - * This software was created by Alberta Tech Alliance, Team 4334, in - * Calgary, Alberta. This version is a fork by FRC Western Canada. - */ -package edu.first.main; - -import edu.first.robot.IterativeRobotAdapter; -import edu.first.robot.RobotMode; -import edu.first.robot.SafeRobotMode; -import edu.wpi.first.wpilibj.IterativeRobot; - -/** - * This class is called by the VM automatically for every game mode. It is meant - * to start all necessary functions, and is the gateway from the Java VM into - * your code. {@code GamePeriods} is final because the functionality it provides - * is through {@link RobotMode Robot Modes}. Although the implementation and - * specifics about how {@link RobotMode} is used is up to the programmer, the - * usage of {@link RobotMode} is necessary. This does not detract from - * {@code GamePeriods}'s usefulness because it contains all of the methods of - * {@code GamePeriods} and more. - * - * Please change the static variable {@link #robotMode} to your robot. Do so - * however you wish, but you may experience problems if set statically (happens - * before some internal initialisations of WPILibJ). - * - * If you change the name of this class or the package after creating this - * project, you must also update the manifest file in the resource directory. - * (/resources/META-INF/MANIFEST.MF under "MIDlet-1") - * - * This class is not thread safe and should never be manually - * constructed, but by mandate (VM) its constructor needs to be public. - * - * @since May 07 13 - * @author Joel Gallant - */ -public final class GamePeriods extends IterativeRobot { - - // Stored to "end" the game mode after it is finished - private static GameMode previousGameMode = null; - // The current game mode - change to yours - private static RobotMode robotMode; - - /** - * Please never use this! - */ - public GamePeriods() { - // Init robot mode here so that static initializing doesn't interfere with wpi code - robotMode = new SafeRobotMode(new IterativeRobotAdapter("Null")); - } - - /** - * Initializes the robot. Is run once at the start of the robot's execution - * cycle, but never again. Effectively should "start the robot", in whatever - * context it happens to be in. - */ - @Override - public void robotInit() { - robotMode.init(); - } - - /** - * Initializes the disabled mode of the robot. Usually, this method "turns - * off" the functions of the robot, like background threads and motor - * controllers. - * - * Every time disabled is run, the {@code RobotMode} is updated. This only - * happens during the disabled period. - */ - @Override - public void disabledInit() { - finishAndNewMode(GameMode.DISABLED); - robotMode.initDisabled(); - } - - /** - * Runs periodically during the disabled period. - * - * In the context of {@link IterativeRobot}, "periodic" means 50 times per - * second, or 50Hz. It is run every 0.02 seconds. This is not guaranteed, - * and is only run once every time the DriverStation sends packets. It can - * be roughly assumed that it runs at 50Hz, but should not be depended on. - */ - @Override - public void disabledPeriodic() { - robotMode.periodicDisabled(); - } - - /** - * Initializes anything needed for the autonomous period of the robot. - */ - @Override - public void autonomousInit() { - finishAndNewMode(GameMode.AUTONOMOUS); - robotMode.initAutonomous(); - } - - /** - * Runs periodically during the autonomous period. - * - * In the context of {@link IterativeRobot}, "periodic" means 50 times per - * second, or 50Hz. It is run every 0.02 seconds. This is not guaranteed, - * and is only run once every time the DriverStation sends packets. It can - * be roughly assumed that it runs at 50Hz, but should not be depended on. - */ - @Override - public void autonomousPeriodic() { - robotMode.periodicAutonomous(); - } - - /** - * Initializes anything needed for the teleoperated period of the robot. - */ - @Override - public void teleopInit() { - finishAndNewMode(GameMode.TELEOPERATED); - robotMode.initTeleoperated(); - } - - /** - * Runs periodically during the teleoperated period. - * - * In the context of {@link IterativeRobot}, "periodic" means 50 times per - * second, or 50Hz. It is run every 0.02 seconds. This is not guaranteed, - * and is only run once every time the DriverStation sends packets. It can - * be roughly assumed that it runs at 50Hz, but should not be depended on. - */ - @Override - public void teleopPeriodic() { - robotMode.periodicTeleoperated(); - } - - /** - * Initializes anything needed for the test period of the robot. - */ - @Override - public void testInit() { - finishAndNewMode(GameMode.TEST); - robotMode.initTest(); - } - - /** - * Runs periodically during the test period. - * - * In the context of {@link IterativeRobot}, "periodic" means 50 times per - * second, or 50Hz. It is run every 0.02 seconds. This is not guaranteed, - * and is only run once every time the DriverStation sends packets. It can - * be roughly assumed that it runs at 50Hz, but should not be depended on. - */ - @Override - public void testPeriodic() { - robotMode.periodicTest(); - } - - /** - * Finishes the {@code GameMode} given the last time this method was run. - * - * @param newMode the mode that the user is headed into which will be ended - * the next time this method is run - */ - private void finishAndNewMode(GameMode newMode) { - if (previousGameMode != null) { - previousGameMode.end(); - } - previousGameMode = newMode; - } - - /** - * Representation of the different game modes used to end them using the - * methods in {@link RobotMode}. - */ - private static abstract class GameMode { - - static final GameMode DISABLED = new GameMode() { - @Override - void end() { - robotMode.endDisabled(); - } - }; - static final GameMode AUTONOMOUS = new GameMode() { - @Override - void end() { - robotMode.endAutonomous(); - } - }; - static final GameMode TELEOPERATED = new GameMode() { - @Override - void end() { - robotMode.endTeleoperated(); - } - }; - static final GameMode TEST = new GameMode() { - @Override - void end() { - robotMode.endTest(); - } - }; - - /** - * Ends the mode selected. - */ - abstract void end(); - } -} diff --git a/src/edu/first/module/joysticks/JoystickModule.java b/src/edu/first/module/joysticks/JoystickModule.java index 1b9a00c..afcd0a3 100644 --- a/src/edu/first/module/joysticks/JoystickModule.java +++ b/src/edu/first/module/joysticks/JoystickModule.java @@ -107,6 +107,14 @@ public final double getRawAxisValue(int port) { public final Button getRawAxisAsButton(int port, double threshold) { return new RawAxisButton(port, threshold); } + + public final Button getPOVAsButton(int minAngle, int maxAngle) { + return new POVButton(minAngle, maxAngle); + } + + public final Button getPOVAsButton(int angle) { + return new POVButton(angle, angle); + } /** * {@inheritDoc} @@ -344,6 +352,22 @@ public boolean getPosition() { } } } + + private class POVButton implements Button { + + private final int min, max; + + public POVButton(int minAngle, int maxAngle) { + this.min = minAngle; + this.max = maxAngle; + } + + @Override + public boolean getPosition() { + int angle = joystick.getPOV(); + return (angle <= min) && (angle <= max); + } + } private class Rumble implements Output { diff --git a/src/edu/first/module/joysticks/XboxController.java b/src/edu/first/module/joysticks/XboxController.java index b18f039..8795068 100644 --- a/src/edu/first/module/joysticks/XboxController.java +++ b/src/edu/first/module/joysticks/XboxController.java @@ -52,13 +52,13 @@ public class XboxController extends BindingJoystick { */ public static final int A = 1, B = 2, X = 3, Y = 4, LEFT_BUMPER = 5, RIGHT_BUMPER = 6, - BACK = 7, START = 8, LEFT_STICK = 9, RIGHT_STICK = 10; + BACK = 7, START = 8, LEFT_STICK = 9, RIGHT_STICK = 10, + DPAD_UP = 11, DPAD_DOWN = 12, DPAD_LEFT = 13, DPAD_RIGHT = 14; /** * Port for axis. */ public static final int LEFT_X = 0, LEFT_Y = 1, LEFT_TRIGGER = 2, RIGHT_TRIGGER = 3, - RIGHT_X = 4, RIGHT_Y = 5, RIGHT_FROM_MIDDLE = 6, LEFT_FROM_MIDDLE = 7, TRIGGERS = 8, - DPAD = 9; + RIGHT_X = 4, RIGHT_Y = 5, RIGHT_FROM_MIDDLE = 6, LEFT_FROM_MIDDLE = 7, TRIGGERS = 8; /** * Constructs the joystick with the {@link edu.wpi.first.wpilibj.Joystick} @@ -73,6 +73,10 @@ protected XboxController(Joystick joystick) { setAxis(RIGHT_FROM_MIDDLE, new FromMiddle(getRightY(), getRightX())); setAxis(LEFT_FROM_MIDDLE, new FromMiddle(getLeftY(), getLeftX())); setAxis(TRIGGERS, new Combination(getLeftTrigger(), getRightTrigger())); + setButton(DPAD_UP, this.getPOVAsButton(0)); + setButton(DPAD_DOWN, this.getPOVAsButton(180)); + setButton(DPAD_LEFT, this.getPOVAsButton(270)); + setButton(DPAD_RIGHT, this.getPOVAsButton(90)); invertAxis(LEFT_Y); invertAxis(RIGHT_Y); invertAxis(LEFT_FROM_MIDDLE); diff --git a/src/edu/first/robot/RobotMode.java b/src/edu/first/robot/RobotMode.java index 00a6a0b..5002fc5 100644 --- a/src/edu/first/robot/RobotMode.java +++ b/src/edu/first/robot/RobotMode.java @@ -1,8 +1,5 @@ package edu.first.robot; -import edu.first.main.Constants; -import edu.first.main.GamePeriods; - /** * The framework for all "modes" a robot can perform, this is the basic class * that tells the robot what it should do and when it should do it. @@ -42,7 +39,7 @@ * @see SimpleRobot * @author Joel Gallant */ -public interface RobotMode extends Constants { +public interface RobotMode { /** * Initializes the robot. This means that after this method is run, diff --git a/src/edu/first/robot/SafeRobotMode.java b/src/edu/first/robot/SafeRobotMode.java index d43e08b..59e2377 100644 --- a/src/edu/first/robot/SafeRobotMode.java +++ b/src/edu/first/robot/SafeRobotMode.java @@ -1,6 +1,5 @@ package edu.first.robot; -import edu.first.main.GamePeriods; import edu.first.util.log.Logger; /** diff --git a/src/edu/first/robot/SimpleRobot.java b/src/edu/first/robot/SimpleRobot.java index a5afa6c..fdc6cb8 100644 --- a/src/edu/first/robot/SimpleRobot.java +++ b/src/edu/first/robot/SimpleRobot.java @@ -1,6 +1,5 @@ package edu.first.robot; -import edu.first.main.GamePeriods; import edu.first.util.DriverstationInfo; /** From 427a556d261d35d8dba76f44ebfe1b072325b0ed Mon Sep 17 00:00:00 2001 From: Trevor Tsang Date: Sat, 3 Mar 2018 14:09:04 -0700 Subject: [PATCH 7/8] Updated LoopingCommand to 2017 functionality --- .../first/commands/common/LoopingCommand.java | 38 ++++++++++++++----- 1 file changed, 28 insertions(+), 10 deletions(-) diff --git a/src/edu/first/commands/common/LoopingCommand.java b/src/edu/first/commands/common/LoopingCommand.java index 7fa0de7..43ad27c 100644 --- a/src/edu/first/commands/common/LoopingCommand.java +++ b/src/edu/first/commands/common/LoopingCommand.java @@ -9,26 +9,44 @@ * @author Joel Gallant */ public abstract class LoopingCommand implements Command { + private boolean first = true; + + public LoopingCommand() { + } /** * Runs {@link #runLoop()} until {@link #continueLoop()} returns false. */ @Override public final void run() { - while (continueLoop()) { - runLoop(); + while(this.continueLoop()) { + if (this.first) { + this.first = false; + + try { + if (this.getClass().getMethod("firstLoop").getDeclaringClass().getTypeName().endsWith("LoopingCommand")) { + this.runLoop(); + } else { + this.firstLoop(); + } + } catch (SecurityException | NoSuchMethodException var2) { + throw new RuntimeException(var2); + } + } else { + this.runLoop(); + } } + + this.end(); + } + + public void firstLoop() { + } + + public void end() { } - /** - * Returns whether the loop should run again. - * - * @return if loop should continue - */ public abstract boolean continueLoop(); - /** - * Runs the actual instructions of the command. - */ public abstract void runLoop(); } From f5c848d4cd83429caefc7b16ee9aa7aa3b091a61 Mon Sep 17 00:00:00 2001 From: Trevor Tsang Date: Sat, 29 Sep 2018 21:19:39 -0600 Subject: [PATCH 8/8] Added TalonSRX, VictorSPX, and MotorModule --- .../first/module/actuators/MotorModule.java | 90 ++++++++++ .../module/actuators/TalonSRXModule.java | 163 ++++++++++++++++++ .../module/actuators/TalonSRXModuleGroup.java | 87 ++++++++++ .../module/actuators/VictorSPXModule.java | 86 +++++++++ 4 files changed, 426 insertions(+) create mode 100644 src/edu/first/module/actuators/MotorModule.java create mode 100644 src/edu/first/module/actuators/TalonSRXModule.java create mode 100644 src/edu/first/module/actuators/TalonSRXModuleGroup.java create mode 100644 src/edu/first/module/actuators/VictorSPXModule.java diff --git a/src/edu/first/module/actuators/MotorModule.java b/src/edu/first/module/actuators/MotorModule.java new file mode 100644 index 0000000..faae37c --- /dev/null +++ b/src/edu/first/module/actuators/MotorModule.java @@ -0,0 +1,90 @@ +package main.java.ca.fourthreethreefour.module.actuators; + +import edu.first.module.Module; +import edu.first.module.actuators.SpeedController; + +public class MotorModule extends Module.StandardModule implements SpeedController { + + private Module module; + private SpeedController speedController; + + public static enum Type { + TALON_SRX, VICTOR_SPX, + } + + public MotorModule(Type type, int channel) { + switch (type) { + case TALON_SRX: + TalonSRXModule talon = new TalonSRXModule(channel); + this.module = talon; + this.speedController = talon; + break; + case VICTOR_SPX: + VictorSPXModule victor = new VictorSPXModule(channel); + this.module = victor; + this.speedController = victor; + break; + } + } + + @Override + public void init() { + this.module.init(); + } + + @Override + public void setSpeed(double speed) { + this.speedController.setSpeed(speed); + } + + @Override + public void setRawSpeed(int speed) { + this.speedController.setRawSpeed(speed); + } + + @Override + public double getSpeed() { + return this.speedController.getSpeed(); + } + + @Override + public int getRawSpeed() { + return this.speedController.getRawSpeed(); + } + + @Override + public void update() { + this.speedController.update(); + } + + @Override + public void setRate(double rate) { + this.speedController.setRate(rate); + } + + @Override + public void set(double value) { + this.speedController.set(value); + } + + @Override + public double getRate() { + return this.speedController.getRate(); + } + + @Override + public double get() { + return this.speedController.get(); + } + + @Override + protected void enableModule() { + this.module.enable(); + } + + @Override + protected void disableModule() { + this.module.disable(); + } + +} diff --git a/src/edu/first/module/actuators/TalonSRXModule.java b/src/edu/first/module/actuators/TalonSRXModule.java new file mode 100644 index 0000000..d0a7c9d --- /dev/null +++ b/src/edu/first/module/actuators/TalonSRXModule.java @@ -0,0 +1,163 @@ +package main.java.ca.fourthreethreefour.module.actuators; + +import com.ctre.phoenix.motorcontrol.can.WPI_TalonSRX; + +import edu.first.module.actuators.SpeedController; +import edu.first.module.Module; + +/** + * The general purpose class that manipulates Talon speed controllers made by + * IFI / CTRE. Should work for all models through CAN. + * + * @since Feb 13 18 + * @author Trevor Tsang + */ +public class TalonSRXModule extends Module.StandardModule implements SpeedController { + + private final WPI_TalonSRX talon; + + protected TalonSRXModule(WPI_TalonSRX talon) { + if(talon == null) { + throw new NullPointerException("Null talon given"); + } + this.talon = talon; + } + + /** + * {@inheritDoc} + */ + public TalonSRXModule(int channel) { + this(new WPI_TalonSRX(channel)); + } + + /** + * {@inheritDoc} + */ + @Override + public void init() { + } + + /** + * {@inheritDoc} + */ + @Override + protected void enableModule() { + } + + /** + * {@inheritDoc} + */ + @Override + protected void disableModule() { + this.set(0); + } + + /** + * {@inheritDoc} + */ + @Override + public void setSpeed(double speed) { + talon.set(speed); + } + + /** + * {@inheritDoc} + */ + @Override + public void setRawSpeed(int speed) { + talon.set((speed - 127) / 127); + } + + /** + * {@inheritDoc} + */ + @Override + public double getSpeed() { + return talon.get(); + } + + /** + * {@inheritDoc} + */ + @Override + public int getRawSpeed() { + return (int) (talon.get() * 127 + 127); + } + + /** + * {@inheritDoc} + */ + @Override + public void update() { + } + + /** + * {@inheritDoc} + */ + @Override + public void setRate(double rate) { + talon.set(rate); + } + + /** + * {@inheritDoc} + */ + @Override + public void set(double value) { + talon.set(value); + } + + /** + * {@inheritDoc} + */ + public void setInverted(boolean isInverted) { + talon.setInverted(isInverted); + } + + /** + * {@inheritDoc} + */ + public boolean getInverted(boolean isInverted) { + return talon.getInverted(); + } + + /** + * {@inheritDoc} + */ + @Override + public double getRate() { + return talon.get(); + } + + /** + * {@inheritDoc} + */ + @Override + public double get() { + return talon.get(); + } + + /** + * {@inheritDoc} + */ + public void stopMotor() { + talon.stopMotor(); + } + + /** + * {@inheritDoc} + * @return object that can get/set individual raw sensor values. + */ + public Object getSensorCollection() { + return talon.getSensorCollection(); + } + + /** + * {@inheritDoc} + * @return + */ + public double getAnalogIn() { + return talon.getSensorCollection().getAnalogIn(); + } + +} diff --git a/src/edu/first/module/actuators/TalonSRXModuleGroup.java b/src/edu/first/module/actuators/TalonSRXModuleGroup.java new file mode 100644 index 0000000..7d423b4 --- /dev/null +++ b/src/edu/first/module/actuators/TalonSRXModuleGroup.java @@ -0,0 +1,87 @@ +package main.java.ca.fourthreethreefour.module.actuators; + +import edu.first.module.actuators.SpeedController; +import edu.first.module.actuators.SpeedControllerGroup; +import edu.first.module.subsystems.Subsystem; + +public class TalonSRXModuleGroup extends Subsystem implements SpeedController { + + private final SpeedControllerGroup group; + + public TalonSRXModuleGroup(TalonSRXModule[] group) { + super(group); + this.group = new SpeedControllerGroup(group); + } + + /** + * {@inheritDoc} + */ + @Override + public void setSpeed(double speed) { + group.setSpeed(speed); + } + + /** + * {@inheritDoc} + */ + @Override + public void setRawSpeed(int speed) { + group.setRawSpeed(speed); + } + + /** + * {@inheritDoc} + */ + @Override + public double getSpeed() { + return group.getSpeed(); + } + + /** + * {@inheritDoc} + */ + @Override + public int getRawSpeed() { + return group.getRawSpeed(); + } + + /** + * {@inheritDoc} + */ + @Override + public void update() { + } + + /** + * {@inheritDoc} + */ + @Override + public void setRate(double rate) { + group.set(rate); + } + + /** + * {@inheritDoc} + */ + @Override + public void set(double value) { + group.set(value); + } + + /** + * {@inheritDoc} + */ + @Override + public double getRate() { + return group.get(); + } + + /** + * {@inheritDoc} + */ + @Override + public double get() { + return group.get(); + } + +} diff --git a/src/edu/first/module/actuators/VictorSPXModule.java b/src/edu/first/module/actuators/VictorSPXModule.java new file mode 100644 index 0000000..1e9384d --- /dev/null +++ b/src/edu/first/module/actuators/VictorSPXModule.java @@ -0,0 +1,86 @@ +package main.java.ca.fourthreethreefour.module.actuators; + +import com.ctre.phoenix.motorcontrol.ControlMode; +import com.ctre.phoenix.motorcontrol.can.VictorSPX; + +import edu.first.module.Module; +import edu.first.module.actuators.SpeedController; + +public class VictorSPXModule extends Module.StandardModule implements SpeedController { + + private final VictorSPX victor; + + protected VictorSPXModule(VictorSPX victor) { + if (victor == null) { + throw new NullPointerException("Null victor given"); + } + this.victor = victor; + } + + public VictorSPXModule(int channel) { + this(new VictorSPX(channel)); + } + + @Override + public void init() { + } + + @Override + protected void enableModule() { + } + + @Override + protected void disableModule() { + victor.set(ControlMode.Disabled, 0); + } + + @Override + public double get() { + return victor.getMotorOutputPercent(); + } + + @Override + public double getRate() { + return victor.getMotorOutputPercent(); + } + + @Override + public int getRawSpeed() { + return (int) victor.getMotorOutputVoltage(); + } + + @Override + public double getSpeed() { + return victor.getMotorOutputPercent(); + } + + @Override + public void set(double value) { + victor.set(ControlMode.PercentOutput, value); + } + + @Override + public void setRate(double value) { + victor.set(ControlMode.Velocity, value); + } + + @Override + public void setRawSpeed(int value) { + victor.set(ControlMode.PercentOutput, value); + } + + @Override + public void setSpeed(double value) { + victor.set(ControlMode.PercentOutput, value); + } + + @Override + public void update() { + victor.valueUpdated(); + } + + public double getAnalogIn() { + return victor.getSensorCollection().getAnalogIn(); + } + +}