aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFTCTechNH <ftctechnh@gmail.com>2018-10-30 16:16:44 -0400
committerFTCTechNH <ftctechnh@gmail.com>2018-10-30 16:16:44 -0400
commit6533f15abae3976aaeca63d6241c69db1d791968 (patch)
tree50118ac125abff94bcef182d1a9bf48880527205
parent58d723a1d11a1c03ffb3a30f4a38c3601eac61d8 (diff)
downloadftc-6533f15abae3976aaeca63d6241c69db1d791968.zip
ftc-6533f15abae3976aaeca63d6241c69db1d791968.tar.gz
ftc-6533f15abae3976aaeca63d6241c69db1d791968.tar.bz2
ftc-6533f15abae3976aaeca63d6241c69db1d791968.tar.xz
changes for v4.2 release.
-rw-r--r--FtcRobotController/src/main/AndroidManifest.xml5
-rw-r--r--FtcRobotController/src/main/assets/RoverRuckus.tflitebin0 -> 1484128 bytes
-rw-r--r--FtcRobotController/src/main/java/org/firstinspires/ftc/robotcontroller/external/samples/ConceptRevSPARKMini.java112
-rw-r--r--FtcRobotController/src/main/java/org/firstinspires/ftc/robotcontroller/external/samples/ConceptSoundsASJava.java135
-rw-r--r--FtcRobotController/src/main/java/org/firstinspires/ftc/robotcontroller/external/samples/ConceptSoundsOnBotJava.java119
-rw-r--r--FtcRobotController/src/main/java/org/firstinspires/ftc/robotcontroller/external/samples/ConceptTensorFlowObjectDetection.java177
-rw-r--r--FtcRobotController/src/main/java/org/firstinspires/ftc/robotcontroller/external/samples/ConceptTensorFlowObjectDetectionWebcam.java177
-rw-r--r--FtcRobotController/src/main/java/org/firstinspires/ftc/robotcontroller/internal/FtcRobotControllerActivity.java28
-rw-r--r--FtcRobotController/src/main/res/layout/activity_ftc_controller.xml23
-rw-r--r--FtcRobotController/src/main/res/raw/gold.wavbin0 -> 104016 bytes
-rw-r--r--FtcRobotController/src/main/res/raw/silver.wavbin0 -> 99068 bytes
-rw-r--r--README.md28
-rw-r--r--TeamCode/src/main/res/raw/readme.md1
-rw-r--r--build.common.gradle4
-rw-r--r--build.gradle9
-rw-r--r--doc/apk/FtcDriverStation-release.apkbin18030734 -> 39497669 bytes
-rw-r--r--doc/apk/FtcRobotController-release.apkbin20331058 -> 23165914 bytes
-rw-r--r--doc/javadoc/com/qualcomm/ftccommon/SoundPlayer.html31
-rw-r--r--doc/javadoc/com/qualcomm/ftccommon/package-tree.html24
-rw-r--r--doc/javadoc/com/qualcomm/robotcore/eventloop/opmode/package-tree.html4
-rw-r--r--doc/javadoc/com/qualcomm/robotcore/hardware/package-tree.html26
-rw-r--r--doc/javadoc/index-all.html17
-rw-r--r--doc/javadoc/org/firstinspires/ftc/robotcore/external/ClassFactory.html53
-rw-r--r--doc/javadoc/org/firstinspires/ftc/robotcore/external/navigation/VuforiaBase.html23
-rw-r--r--doc/javadoc/org/firstinspires/ftc/robotcore/external/navigation/VuforiaLocalizer.html39
-rw-r--r--doc/javadoc/org/firstinspires/ftc/robotcore/external/navigation/VuforiaRelicRecovery.html2
-rw-r--r--doc/javadoc/org/firstinspires/ftc/robotcore/external/navigation/VuforiaRoverRuckus.html2
-rw-r--r--doc/javadoc/org/firstinspires/ftc/robotcore/external/navigation/package-tree.html16
-rw-r--r--doc/javadoc/org/firstinspires/ftc/robotcore/external/package-tree.html4
-rw-r--r--libs/Blocks-release-sources.jarbin184931 -> 344172 bytes
-rw-r--r--libs/Blocks-release.aarbin1954907 -> 2000406 bytes
-rw-r--r--libs/FtcCommon-release-sources.jarbin210148 -> 210680 bytes
-rw-r--r--libs/FtcCommon-release.aarbin930932 -> 945071 bytes
-rw-r--r--libs/Hardware-release-sources.jarbin505956 -> 507385 bytes
-rw-r--r--libs/Hardware-release.aarbin525829 -> 540161 bytes
-rw-r--r--libs/Inspection-release-sources.jarbin11388 -> 11388 bytes
-rw-r--r--libs/Inspection-release.aarbin30608 -> 44498 bytes
-rw-r--r--libs/RobotCore-release-sources.jarbin2296761 -> 2340354 bytes
-rw-r--r--libs/RobotCore-release.aarbin18350573 -> 18440736 bytes
39 files changed, 987 insertions, 72 deletions
diff --git a/FtcRobotController/src/main/AndroidManifest.xml b/FtcRobotController/src/main/AndroidManifest.xml
index 4bf2994..fa8de5c 100644
--- a/FtcRobotController/src/main/AndroidManifest.xml
+++ b/FtcRobotController/src/main/AndroidManifest.xml
@@ -2,8 +2,8 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.qualcomm.ftcrobotcontroller"
- android:versionCode="29"
- android:versionName="4.1">
+ android:versionCode="30"
+ android:versionName="4.2">
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
@@ -17,6 +17,7 @@
<!-- The main robot controller activity -->
<activity
android:name="org.firstinspires.ftc.robotcontroller.internal.FtcRobotControllerActivity"
+ android:screenOrientation="fullUser"
android:configChanges="orientation|screenSize"
android:label="@string/app_name"
android:launchMode="singleTask" >
diff --git a/FtcRobotController/src/main/assets/RoverRuckus.tflite b/FtcRobotController/src/main/assets/RoverRuckus.tflite
new file mode 100644
index 0000000..2c538cb
--- /dev/null
+++ b/FtcRobotController/src/main/assets/RoverRuckus.tflite
Binary files differ
diff --git a/FtcRobotController/src/main/java/org/firstinspires/ftc/robotcontroller/external/samples/ConceptRevSPARKMini.java b/FtcRobotController/src/main/java/org/firstinspires/ftc/robotcontroller/external/samples/ConceptRevSPARKMini.java
new file mode 100644
index 0000000..b81b7de
--- /dev/null
+++ b/FtcRobotController/src/main/java/org/firstinspires/ftc/robotcontroller/external/samples/ConceptRevSPARKMini.java
@@ -0,0 +1,112 @@
+/* Copyright (c) 2018 FIRST. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted (subject to the limitations in the disclaimer below) provided that
+ * the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this list
+ * of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice, this
+ * list of conditions and the following disclaimer in the documentation and/or
+ * other materials provided with the distribution.
+ *
+ * Neither the name of FIRST nor the names of its contributors may be used to endorse or
+ * promote products derived from this software without specific prior written permission.
+ *
+ * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY THIS
+ * LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.firstinspires.ftc.robotcontroller.external.samples;
+
+import com.qualcomm.robotcore.eventloop.opmode.Disabled;
+import com.qualcomm.robotcore.eventloop.opmode.LinearOpMode;
+import com.qualcomm.robotcore.eventloop.opmode.TeleOp;
+import com.qualcomm.robotcore.hardware.DcMotorSimple;
+import com.qualcomm.robotcore.util.ElapsedTime;
+import com.qualcomm.robotcore.util.Range;
+
+
+/**
+ *
+ * This OpMode executes a basic Tank Drive Teleop for a two wheeled robot using two REV SPARK Minis.
+ * To use this example, connect two REV SPARK Minis into servo ports on the Expansion Hub. On the
+ * robot configuration, use the drop down list under 'Servos' to select 'REV SPARK Mini Controller'
+ * and name them 'left_drive' and 'right_drive'.
+ *
+ * Use Android Studios to Copy this Class, and Paste it into your team's code folder with a new name.
+ * Remove or comment out the @Disabled line to add this opmode to the Driver Station OpMode list
+ */
+
+@TeleOp(name="REV SPARK Mini Simple Drive Example", group="Concept")
+@Disabled
+public class ConceptRevSPARKMini extends LinearOpMode {
+
+ // Declare OpMode members.
+ private ElapsedTime runtime = new ElapsedTime();
+ private DcMotorSimple leftDrive = null;
+ private DcMotorSimple rightDrive = null;
+
+ @Override
+ public void runOpMode() {
+ telemetry.addData("Status", "Initialized");
+ telemetry.update();
+
+ // Initialize the hardware variables. Note that the strings used here as parameters
+ // to 'get' must correspond to the names assigned during the robot configuration
+ // step (using the FTC Robot Controller app on the phone).
+ leftDrive = hardwareMap.get(DcMotorSimple.class, "left_drive");
+ rightDrive = hardwareMap.get(DcMotorSimple.class, "right_drive");
+
+ // Most robots need the motor on one side to be reversed to drive forward
+ // Reverse the motor that runs backwards when connected directly to the battery
+ leftDrive.setDirection(DcMotorSimple.Direction.FORWARD);
+ rightDrive.setDirection(DcMotorSimple.Direction.REVERSE);
+
+ // Wait for the game to start (driver presses PLAY)
+ waitForStart();
+ runtime.reset();
+
+ // run until the end of the match (driver presses STOP)
+ while (opModeIsActive()) {
+
+ // Setup a variable for each drive wheel to save power level for telemetry
+ double leftPower;
+ double rightPower;
+
+ // Choose to drive using either Tank Mode, or POV Mode
+ // Comment out the method that's not used. The default below is POV.
+
+ // POV Mode uses left stick to go forward, and right stick to turn.
+ // - This uses basic math to combine motions and is easier to drive straight.
+ double drive = -gamepad1.left_stick_y;
+ double turn = gamepad1.right_stick_x;
+ leftPower = Range.clip(drive + turn, -1.0, 1.0) ;
+ rightPower = Range.clip(drive - turn, -1.0, 1.0) ;
+
+ // Tank Mode uses one stick to control each wheel.
+ // - This requires no math, but it is hard to drive forward slowly and keep straight.
+ // leftPower = -gamepad1.left_stick_y ;
+ // rightPower = -gamepad1.right_stick_y ;
+
+ // Send calculated power to wheels
+ leftDrive.setPower(leftPower);
+ rightDrive.setPower(rightPower);
+
+ // Show the elapsed game time and wheel power.
+ telemetry.addData("Status", "Run Time: " + runtime.toString());
+ telemetry.addData("Motors", "left (%.2f), right (%.2f)", leftPower, rightPower);
+ telemetry.update();
+ }
+ }
+}
diff --git a/FtcRobotController/src/main/java/org/firstinspires/ftc/robotcontroller/external/samples/ConceptSoundsASJava.java b/FtcRobotController/src/main/java/org/firstinspires/ftc/robotcontroller/external/samples/ConceptSoundsASJava.java
new file mode 100644
index 0000000..51d99d2
--- /dev/null
+++ b/FtcRobotController/src/main/java/org/firstinspires/ftc/robotcontroller/external/samples/ConceptSoundsASJava.java
@@ -0,0 +1,135 @@
+/* Copyright (c) 2018 FIRST. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted (subject to the limitations in the disclaimer below) provided that
+ * the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this list
+ * of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice, this
+ * list of conditions and the following disclaimer in the documentation and/or
+ * other materials provided with the distribution.
+ *
+ * Neither the name of FIRST nor the names of its contributors may be used to endorse or
+ * promote products derived from this software without specific prior written permission.
+ *
+ * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY THIS
+ * LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.firstinspires.ftc.robotcontroller.external.samples;
+
+import com.qualcomm.ftccommon.SoundPlayer;
+import com.qualcomm.robotcore.eventloop.opmode.Disabled;
+import com.qualcomm.robotcore.eventloop.opmode.LinearOpMode;
+import com.qualcomm.robotcore.eventloop.opmode.TeleOp;
+
+import java.io.File;
+
+/**
+ * This file demonstrates how to play simple sounds on both the RC and DS phones.
+ * It illustrates how to build sounds into your application as a resource.
+ * This technique is best suited for use with Android Studio since it assumes you will be creating a new application
+ *
+ * If you are using OnBotJava, please see the ConceptSoundsOnBotJava sample
+ *
+ * Use Android Studios to Copy this Class, and Paste it into your team's code folder with a new name.
+ * Remove or comment out the @Disabled line to add this opmode to the Driver Station OpMode list
+ *
+ * Operation:
+ *
+ * Gamepad X & B buttons are used to trigger sounds in this example, but any event can be used.
+ * Note: Time should be allowed for sounds to complete before playing other sounds.
+ *
+ * For sound files to be used as a compiled-in resource, they need to be located in a folder called "raw" under your "res" (resources) folder.
+ * You can create your own "raw" folder from scratch, or you can copy the one from the FtcRobotController module.
+ *
+ * Android Studio coders will ultimately need a folder in your path as follows:
+ * <project root>/TeamCode/src/main/res/raw
+ *
+ * Copy any .wav files you want to play into this folder.
+ * Make sure that your files ONLY use lower-case characters, and have no spaces or special characters other than underscore.
+ *
+ * The name you give your .wav files will become the resource ID for these sounds.
+ * eg: gold.wav becomes R.raw.gold
+ *
+ * If you wish to use the sounds provided for this sample, they are located in:
+ * <project root>/FtcRobotController/src/main/res/raw
+ * You can copy and paste the entire 'raw' folder using Android Studio.
+ *
+ */
+
+@TeleOp(name="Concept: Sound Resources", group="Concept")
+@Disabled
+public class ConceptSoundsASJava extends LinearOpMode {
+
+ // Declare OpMode members.
+ private boolean goldFound; // Sound file present flags
+ private boolean silverFound;
+
+ private boolean isX = false; // Gamepad button state variables
+ private boolean isB = false;
+
+ private boolean wasX = false; // Gamepad button history variables
+ private boolean WasB = false;
+
+ @Override
+ public void runOpMode() {
+
+ // Determine Resource IDs for sounds built into the RC application.
+ int silverSoundID = hardwareMap.appContext.getResources().getIdentifier("silver", "raw", hardwareMap.appContext.getPackageName());
+ int goldSoundID = hardwareMap.appContext.getResources().getIdentifier("gold", "raw", hardwareMap.appContext.getPackageName());
+
+ // Determine if sound resources are found.
+ // Note: Preloading is NOT required, but it's a good way to verify all your sounds are available before you run.
+ if (goldSoundID != 0)
+ goldFound = SoundPlayer.getInstance().preload(hardwareMap.appContext, goldSoundID);
+
+ if (silverSoundID != 0)
+ silverFound = SoundPlayer.getInstance().preload(hardwareMap.appContext, silverSoundID);
+
+ // Display sound status
+ telemetry.addData("gold resource", goldFound ? "Found" : "NOT found\n Add gold.wav to /src/main/res/raw" );
+ telemetry.addData("silver resource", silverFound ? "Found" : "Not found\n Add silver.wav to /src/main/res/raw" );
+
+ // Wait for the game to start (driver presses PLAY)
+ telemetry.addData(">", "Press Start to continue");
+ telemetry.update();
+ waitForStart();
+
+ telemetry.addData(">", "Press X, B to play sounds.");
+ telemetry.update();
+
+ // run until the end of the match (driver presses STOP)
+ while (opModeIsActive()) {
+
+ // say Silver each time gamepad X is pressed (This sound is a resource)
+ if (silverFound && (isX = gamepad1.x) && !wasX) {
+ SoundPlayer.getInstance().startPlaying(hardwareMap.appContext, silverSoundID);
+ telemetry.addData("Playing", "Resource Silver");
+ telemetry.update();
+ }
+
+ // say Gold each time gamepad B is pressed (This sound is a resource)
+ if (goldFound && (isB = gamepad1.b) && !WasB) {
+ SoundPlayer.getInstance().startPlaying(hardwareMap.appContext, goldSoundID);
+ telemetry.addData("Playing", "Resource Gold");
+ telemetry.update();
+ }
+
+ // Save last button states
+ wasX = isX;
+ WasB = isB;
+ }
+ }
+}
diff --git a/FtcRobotController/src/main/java/org/firstinspires/ftc/robotcontroller/external/samples/ConceptSoundsOnBotJava.java b/FtcRobotController/src/main/java/org/firstinspires/ftc/robotcontroller/external/samples/ConceptSoundsOnBotJava.java
new file mode 100644
index 0000000..bacb66e
--- /dev/null
+++ b/FtcRobotController/src/main/java/org/firstinspires/ftc/robotcontroller/external/samples/ConceptSoundsOnBotJava.java
@@ -0,0 +1,119 @@
+/* Copyright (c) 2018 FIRST. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted (subject to the limitations in the disclaimer below) provided that
+ * the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this list
+ * of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice, this
+ * list of conditions and the following disclaimer in the documentation and/or
+ * other materials provided with the distribution.
+ *
+ * Neither the name of FIRST nor the names of its contributors may be used to endorse or
+ * promote products derived from this software without specific prior written permission.
+ *
+ * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY THIS
+ * LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.firstinspires.ftc.robotcontroller.external.samples;
+
+import com.qualcomm.ftccommon.SoundPlayer;
+import com.qualcomm.robotcore.eventloop.opmode.Disabled;
+import com.qualcomm.robotcore.eventloop.opmode.LinearOpMode;
+import com.qualcomm.robotcore.eventloop.opmode.TeleOp;
+import java.io.File;
+
+/**
+ * This file demonstrates how to play simple sounds on both the RC and DS phones.
+ * It illustrates how to play sound files that have been copied to the RC Phone
+ * This technique is best suited for use with OnBotJava since it does not require the app to be modified.
+ *
+ * Operation:
+ *
+ * Gamepad X & B buttons are used to trigger sounds in this example, but any event can be used.
+ * Note: Time should be allowed for sounds to complete before playing other sounds.
+ *
+ * To play a new sound, you will need to copy the .wav files to the phone, and then provide the full path to them as part of your OpMode.
+ * This is done in this sample for the two sound files. silver.wav and gold.wav
+ *
+ * You can put the files in a variety of soundPaths, but we recommend you put them in the /FIRST/blocks/sounds folder.
+ * Your OpModes will have guaranteed access to this folder, and you can transfer files into this folder using the BLOCKS web page.
+ * -- There is a link called "sounds" on the right hand side of the color bar on the BLOCKS page that can be used to send sound files to this folder by default.
+ * Or you can use Windows File Manager, or ADB to transfer the sound files
+ *
+ * To get full use of THIS sample, you will need to copy two sound file called silver.wav and gold.wav to /FIRST/blocks/sounds on the RC phone.
+ * They can be located here:
+ * https://github.com/ftctechnh/ftc_app/tree/master/FtcRobotController/src/main/res/raw/gold.wav
+ * https://github.com/ftctechnh/ftc_app/tree/master/FtcRobotController/src/main/res/raw/silver.wav
+ */
+
+@TeleOp(name="Concept: Sound Files", group="Concept")
+@Disabled
+public class ConceptSoundsOnBotJava extends LinearOpMode {
+
+ // Point to sound files on the phone's drive
+ private String soundPath = "/FIRST/blocks/sounds";
+ private File goldFile = new File("/sdcard" + soundPath + "/gold.wav");
+ private File silverFile = new File("/sdcard" + soundPath + "/silver.wav");
+
+ // Declare OpMode members.
+ private boolean isX = false; // Gamepad button state variables
+ private boolean isB = false;
+
+ private boolean wasX = false; // Gamepad button history variables
+ private boolean WasB = false;
+
+ @Override
+ public void runOpMode() {
+
+ // Make sure that the sound files exist on the phone
+ boolean goldFound = goldFile.exists();
+ boolean silverFound = silverFile.exists();
+
+ // Display sound status
+ telemetry.addData("gold sound", goldFound ? "Found" : "NOT Found \nCopy gold.wav to " + soundPath );
+ telemetry.addData("silver sound", silverFound ? "Found" : "NOT Found \nCopy silver.wav to " + soundPath );
+
+ // Wait for the game to start (driver presses PLAY)
+ telemetry.addData(">", "Press Start to continue");
+ telemetry.update();
+ waitForStart();
+
+ telemetry.addData(">", "Press X or B to play sounds.");
+ telemetry.update();
+
+ // run until the end of the match (driver presses STOP)
+ while (opModeIsActive()) {
+
+ // say Silver each time gamepad X is pressed (This sound is a resource)
+ if (silverFound && (isX = gamepad1.x) && !wasX) {
+ SoundPlayer.getInstance().startPlaying(hardwareMap.appContext, silverFile);
+ telemetry.addData("Playing", "Silver File");
+ telemetry.update();
+ }
+
+ // say Gold each time gamepad B is pressed (This sound is a resource)
+ if (goldFound && (isB = gamepad1.b) && !WasB) {
+ SoundPlayer.getInstance().startPlaying(hardwareMap.appContext, goldFile);
+ telemetry.addData("Playing", "Gold File");
+ telemetry.update();
+ }
+
+ // Save last button states
+ wasX = isX;
+ WasB = isB;
+ }
+ }
+}
diff --git a/FtcRobotController/src/main/java/org/firstinspires/ftc/robotcontroller/external/samples/ConceptTensorFlowObjectDetection.java b/FtcRobotController/src/main/java/org/firstinspires/ftc/robotcontroller/external/samples/ConceptTensorFlowObjectDetection.java
new file mode 100644
index 0000000..1b7c9ef
--- /dev/null
+++ b/FtcRobotController/src/main/java/org/firstinspires/ftc/robotcontroller/external/samples/ConceptTensorFlowObjectDetection.java
@@ -0,0 +1,177 @@
+/* Copyright (c) 2018 FIRST. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted (subject to the limitations in the disclaimer below) provided that
+ * the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this list
+ * of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice, this
+ * list of conditions and the following disclaimer in the documentation and/or
+ * other materials provided with the distribution.
+ *
+ * Neither the name of FIRST nor the names of its contributors may be used to endorse or
+ * promote products derived from this software without specific prior written permission.
+ *
+ * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY THIS
+ * LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.firstinspires.ftc.robotcontroller.external.samples;
+
+import com.qualcomm.robotcore.eventloop.opmode.Disabled;
+import com.qualcomm.robotcore.eventloop.opmode.LinearOpMode;
+import com.qualcomm.robotcore.eventloop.opmode.TeleOp;
+import java.util.List;
+import org.firstinspires.ftc.robotcore.external.ClassFactory;
+import org.firstinspires.ftc.robotcore.external.navigation.VuforiaLocalizer;
+import org.firstinspires.ftc.robotcore.external.navigation.VuforiaLocalizer.CameraDirection;
+import org.firstinspires.ftc.robotcore.external.tfod.TFObjectDetector;
+import org.firstinspires.ftc.robotcore.external.tfod.Recognition;
+
+/**
+ * This 2018-2019 OpMode illustrates the basics of using the TensorFlow Object Detection API to
+ * determine the position of the gold and silver minerals.
+ *
+ * Use Android Studio to Copy this Class, and Paste it into your team's code folder with a new name.
+ * Remove or comment out the @Disabled line to add this opmode to the Driver Station OpMode list.
+ *
+ * IMPORTANT: In order to use this OpMode, you need to obtain your own Vuforia license key as
+ * is explained below.
+ */
+@TeleOp(name = "Concept: TensorFlow Object Detection", group = "Concept")
+@Disabled
+public class ConceptTensorFlowObjectDetection extends LinearOpMode {
+ private static final String TFOD_MODEL_ASSET = "RoverRuckus.tflite";
+ private static final String LABEL_GOLD_MINERAL = "Gold Mineral";
+ private static final String LABEL_SILVER_MINERAL = "Silver Mineral";
+
+ /*
+ * IMPORTANT: You need to obtain your own license key to use Vuforia. The string below with which
+ * 'parameters.vuforiaLicenseKey' is initialized is for illustration only, and will not function.
+ * A Vuforia 'Development' license key, can be obtained free of charge from the Vuforia developer
+ * web site at https://developer.vuforia.com/license-manager.
+ *
+ * Vuforia license keys are always 380 characters long, and look as if they contain mostly
+ * random data. As an example, here is a example of a fragment of a valid key:
+ * ... yIgIzTqZ4mWjk9wd3cZO9T1axEqzuhxoGlfOOI2dRzKS4T0hQ8kT ...
+ * Once you've obtained a license key, copy the string from the Vuforia web site
+ * and paste it in to your code on the next line, between the double quotes.
+ */
+ private static final String VUFORIA_KEY = " -- YOUR NEW VUFORIA KEY GOES HERE --- ";
+
+ /**
+ * {@link #vuforia} is the variable we will use to store our instance of the Vuforia
+ * localization engine.
+ */
+ private VuforiaLocalizer vuforia;
+
+ /**
+ * {@link #tfod} is the variable we will use to store our instance of the Tensor Flow Object
+ * Detection engine.
+ */
+ private TFObjectDetector tfod;
+
+ @Override
+ public void runOpMode() {
+ // The TFObjectDetector uses the camera frames from the VuforiaLocalizer, so we create that
+ // first.
+ initVuforia();
+
+ if (ClassFactory.getInstance().canCreateTFObjectDetector()) {
+ initTfod();
+ } else {
+ telemetry.addData("Sorry!", "This device is not compatible with TFOD");
+ }
+
+ /** Wait for the game to begin */
+ telemetry.addData(">", "Press Play to start tracking");
+ telemetry.update();
+ waitForStart();
+
+ if (opModeIsActive()) {
+ /** Activate Tensor Flow Object Detection. */
+ if (tfod != null) {
+ tfod.activate();
+ }
+
+ while (opModeIsActive()) {
+ if (tfod != null) {
+ // getUpdatedRecognitions() will return null if no new information is available since
+ // the last time that call was made.
+ List<Recognition> updatedRecognitions = tfod.getUpdatedRecognitions();
+ if (updatedRecognitions != null) {
+ telemetry.addData("# Object Detected", updatedRecognitions.size());
+ if (updatedRecognitions.size() == 3) {
+ int goldMineralX = -1;
+ int silverMineral1X = -1;
+ int silverMineral2X = -1;
+ for (Recognition recognition : updatedRecognitions) {
+ if (recognition.getLabel().equals(LABEL_GOLD_MINERAL)) {
+ goldMineralX = (int) recognition.getLeft();
+ } else if (silverMineral1X == -1) {
+ silverMineral1X = (int) recognition.getLeft();
+ } else {
+ silverMineral2X = (int) recognition.getLeft();
+ }
+ }
+ if (goldMineralX != -1 && silverMineral1X != -1 && silverMineral2X != -1) {
+ if (goldMineralX < silverMineral1X && goldMineralX < silverMineral2X) {
+ telemetry.addData("Gold Mineral Position", "Left");
+ } else if (goldMineralX > silverMineral1X && goldMineralX > silverMineral2X) {
+ telemetry.addData("Gold Mineral Position", "Right");
+ } else {
+ telemetry.addData("Gold Mineral Position", "Center");
+ }
+ }
+ }
+ telemetry.update();
+ }
+ }
+ }
+ }
+
+ if (tfod != null) {
+ tfod.shutdown();
+ }
+ }
+
+ /**
+ * Initialize the Vuforia localization engine.
+ */
+ private void initVuforia() {
+ /*
+ * Configure Vuforia by creating a Parameter object, and passing it to the Vuforia engine.
+ */
+ VuforiaLocalizer.Parameters parameters = new VuforiaLocalizer.Parameters();
+
+ parameters.vuforiaLicenseKey = VUFORIA_KEY;
+ parameters.cameraDirection = CameraDirection.BACK;
+
+ // Instantiate the Vuforia engine
+ vuforia = ClassFactory.getInstance().createVuforia(parameters);
+
+ // Loading trackables is not necessary for the Tensor Flow Object Detection engine.
+ }
+
+ /**
+ * Initialize the Tensor Flow Object Detection engine.
+ */
+ private void initTfod() {
+ int tfodMonitorViewId = hardwareMap.appContext.getResources().getIdentifier(
+ "tfodMonitorViewId", "id", hardwareMap.appContext.getPackageName());
+ TFObjectDetector.Parameters tfodParameters = new TFObjectDetector.Parameters(tfodMonitorViewId);
+ tfod = ClassFactory.getInstance().createTFObjectDetector(tfodParameters, vuforia);
+ tfod.loadModelFromAsset(TFOD_MODEL_ASSET, LABEL_GOLD_MINERAL, LABEL_SILVER_MINERAL);
+ }
+}
diff --git a/FtcRobotController/src/main/java/org/firstinspires/ftc/robotcontroller/external/samples/ConceptTensorFlowObjectDetectionWebcam.java b/FtcRobotController/src/main/java/org/firstinspires/ftc/robotcontroller/external/samples/ConceptTensorFlowObjectDetectionWebcam.java
new file mode 100644
index 0000000..f68eed1
--- /dev/null
+++ b/FtcRobotController/src/main/java/org/firstinspires/ftc/robotcontroller/external/samples/ConceptTensorFlowObjectDetectionWebcam.java
@@ -0,0 +1,177 @@
+/* Copyright (c) 2018 FIRST. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted (subject to the limitations in the disclaimer below) provided that
+ * the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this list
+ * of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice, this
+ * list of conditions and the following disclaimer in the documentation and/or
+ * other materials provided with the distribution.
+ *
+ * Neither the name of FIRST nor the names of its contributors may be used to endorse or
+ * promote products derived from this software without specific prior written permission.
+ *
+ * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY THIS
+ * LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.firstinspires.ftc.robotcontroller.external.samples;
+
+import com.qualcomm.robotcore.eventloop.opmode.Disabled;
+import com.qualcomm.robotcore.eventloop.opmode.LinearOpMode;
+import com.qualcomm.robotcore.eventloop.opmode.TeleOp;
+import java.util.List;
+import org.firstinspires.ftc.robotcore.external.ClassFactory;
+import org.firstinspires.ftc.robotcore.external.hardware.camera.WebcamName;
+import org.firstinspires.ftc.robotcore.external.navigation.VuforiaLocalizer;
+import org.firstinspires.ftc.robotcore.external.tfod.TFObjectDetector;
+import org.firstinspires.ftc.robotcore.external.tfod.Recognition;
+
+/**
+ * This 2018-2019 OpMode illustrates the basics of using the TensorFlow Object Detection API to
+ * determine the position of the gold and silver minerals.
+ *
+ * Use Android Studio to Copy this Class, and Paste it into your team's code folder with a new name.
+ * Remove or comment out the @Disabled line to add this opmode to the Driver Station OpMode list.
+ *
+ * IMPORTANT: In order to use this OpMode, you need to obtain your own Vuforia license key as
+ * is explained below.
+ */
+@TeleOp(name = "Concept: TensorFlow Object Detection Webcam", group = "Concept")
+@Disabled
+public class ConceptTensorFlowObjectDetectionWebcam extends LinearOpMode {
+ private static final String TFOD_MODEL_ASSET = "RoverRuckus.tflite";
+ private static final String LABEL_GOLD_MINERAL = "Gold Mineral";
+ private static final String LABEL_SILVER_MINERAL = "Silver Mineral";
+
+ /*
+ * IMPORTANT: You need to obtain your own license key to use Vuforia. The string below with which
+ * 'parameters.vuforiaLicenseKey' is initialized is for illustration only, and will not function.
+ * A Vuforia 'Development' license key, can be obtained free of charge from the Vuforia developer
+ * web site at https://developer.vuforia.com/license-manager.
+ *
+ * Vuforia license keys are always 380 characters long, and look as if they contain mostly
+ * random data. As an example, here is a example of a fragment of a valid key:
+ * ... yIgIzTqZ4mWjk9wd3cZO9T1axEqzuhxoGlfOOI2dRzKS4T0hQ8kT ...
+ * Once you've obtained a license key, copy the string from the Vuforia web site
+ * and paste it in to your code on the next line, between the double quotes.
+ */
+ private static final String VUFORIA_KEY = " -- YOUR NEW VUFORIA KEY GOES HERE --- ";
+
+ /**
+ * {@link #vuforia} is the variable we will use to store our instance of the Vuforia
+ * localization engine.
+ */
+ private VuforiaLocalizer vuforia;
+
+ /**
+ * {@link #tfod} is the variable we will use to store our instance of the Tensor Flow Object
+ * Detection engine.
+ */
+ private TFObjectDetector tfod;
+
+ @Override
+ public void runOpMode() {
+ // The TFObjectDetector uses the camera frames from the VuforiaLocalizer, so we create that
+ // first.
+ initVuforia();
+
+ if (ClassFactory.getInstance().canCreateTFObjectDetector()) {
+ initTfod();
+ } else {
+ telemetry.addData("Sorry!", "This device is not compatible with TFOD");
+ }
+
+ /** Wait for the game to begin */
+ telemetry.addData(">", "Press Play to start tracking");
+ telemetry.update();
+ waitForStart();
+
+ if (opModeIsActive()) {
+ /** Activate Tensor Flow Object Detection. */
+ if (tfod != null) {
+ tfod.activate();
+ }
+
+ while (opModeIsActive()) {
+ if (tfod != null) {
+ // getUpdatedRecognitions() will return null if no new information is available since
+ // the last time that call was made.
+ List<Recognition> updatedRecognitions = tfod.getUpdatedRecognitions();
+ if (updatedRecognitions != null) {
+ telemetry.addData("# Object Detected", updatedRecognitions.size());
+ if (updatedRecognitions.size() == 3) {
+ int goldMineralX = -1;
+ int silverMineral1X = -1;
+ int silverMineral2X = -1;
+ for (Recognition recognition : updatedRecognitions) {
+ if (recognition.getLabel().equals(LABEL_GOLD_MINERAL)) {
+ goldMineralX = (int) recognition.getLeft();
+ } else if (silverMineral1X == -1) {
+ silverMineral1X = (int) recognition.getLeft();
+ } else {
+ silverMineral2X = (int) recognition.getLeft();
+ }
+ }
+ if (goldMineralX != -1 && silverMineral1X != -1 && silverMineral2X != -1) {
+ if (goldMineralX < silverMineral1X && goldMineralX < silverMineral2X) {
+ telemetry.addData("Gold Mineral Position", "Left");
+ } else if (goldMineralX > silverMineral1X && goldMineralX > silverMineral2X) {
+ telemetry.addData("Gold Mineral Position", "Right");
+ } else {
+ telemetry.addData("Gold Mineral Position", "Center");
+ }
+ }
+ }
+ telemetry.update();
+ }
+ }
+ }
+ }
+
+ if (tfod != null) {
+ tfod.shutdown();
+ }
+ }
+
+ /**
+ * Initialize the Vuforia localization engine.
+ */
+ private void initVuforia() {
+ /*
+ * Configure Vuforia by creating a Parameter object, and passing it to the Vuforia engine.
+ */
+ VuforiaLocalizer.Parameters parameters = new VuforiaLocalizer.Parameters();
+
+ parameters.vuforiaLicenseKey = VUFORIA_KEY;
+ parameters.cameraName = hardwareMap.get(WebcamName.class, "Webcam 1");
+
+ // Instantiate the Vuforia engine
+ vuforia = ClassFactory.getInstance().createVuforia(parameters);
+
+ // Loading trackables is not necessary for the Tensor Flow Object Detection engine.
+ }
+
+ /**
+ * Initialize the Tensor Flow Object Detection engine.
+ */
+ private void initTfod() {
+ int tfodMonitorViewId = hardwareMap.appContext.getResources().getIdentifier(
+ "tfodMonitorViewId", "id", hardwareMap.appContext.getPackageName());
+ TFObjectDetector.Parameters tfodParameters = new TFObjectDetector.Parameters(tfodMonitorViewId);
+ tfod = ClassFactory.getInstance().createTFObjectDetector(tfodParameters, vuforia);
+ tfod.loadModelFromAsset(TFOD_MODEL_ASSET, LABEL_GOLD_MINERAL, LABEL_SILVER_MINERAL);
+ }
+}
diff --git a/FtcRobotController/src/main/java/org/firstinspires/ftc/robotcontroller/internal/FtcRobotControllerActivity.java b/FtcRobotController/src/main/java/org/firstinspires/ftc/robotcontroller/internal/FtcRobotControllerActivity.java
index d5d6872..a8c68fd 100644
--- a/FtcRobotController/src/main/java/org/firstinspires/ftc/robotcontroller/internal/FtcRobotControllerActivity.java
+++ b/FtcRobotController/src/main/java/org/firstinspires/ftc/robotcontroller/internal/FtcRobotControllerActivity.java
@@ -57,6 +57,7 @@ import android.view.View;
import android.webkit.WebView;
import android.widget.ImageButton;
import android.widget.LinearLayout;
+import android.widget.LinearLayout.LayoutParams;
import android.widget.PopupMenu;
import android.widget.TextView;
@@ -286,6 +287,8 @@ public class FtcRobotControllerActivity extends Activity
}
});
+ updateMonitorLayout(getResources().getConfiguration());
+
BlocksOpMode.setActivityAndWebView(this, (WebView) findViewById(R.id.webViewBlocksRuntime));
ClassManagerFactory.registerFilters();
@@ -556,6 +559,31 @@ public class FtcRobotControllerActivity extends Activity
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
// don't destroy assets on screen rotation
+ updateMonitorLayout(newConfig);
+ }
+
+ /**
+ * Updates the orientation of monitorContainer (which contains cameraMonitorView and
+ * tfodMonitorView) based on the given configuration. Makes the children split the space.
+ */
+ private void updateMonitorLayout(Configuration configuration) {
+ LinearLayout monitorContainer = (LinearLayout) findViewById(R.id.monitorContainer);
+ if (configuration.orientation == Configuration.ORIENTATION_LANDSCAPE) {
+ // When the phone is landscape, lay out the monitor views horizontally.
+ monitorContainer.setOrientation(LinearLayout.HORIZONTAL);
+ for (int i = 0; i < monitorContainer.getChildCount(); i++) {
+ View view = monitorContainer.getChildAt(i);
+ view.setLayoutParams(new LayoutParams(0, LayoutParams.MATCH_PARENT, 1 /* weight */));
+ }
+ } else {
+ // When the phone is portrait, lay out the monitor views vertically.
+ monitorContainer.setOrientation(LinearLayout.VERTICAL);
+ for (int i = 0; i < monitorContainer.getChildCount(); i++) {
+ View view = monitorContainer.getChildAt(i);
+ view.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, 0, 1 /* weight */));
+ }
+ }
+ monitorContainer.requestLayout();
}
@Override
diff --git a/FtcRobotController/src/main/res/layout/activity_ftc_controller.xml b/FtcRobotController/src/main/res/layout/activity_ftc_controller.xml
index b47f9c2..c74e2de 100644
--- a/FtcRobotController/src/main/res/layout/activity_ftc_controller.xml
+++ b/FtcRobotController/src/main/res/layout/activity_ftc_controller.xml
@@ -126,11 +126,28 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
android:layout_above="@+id/textGamepad1">
<LinearLayout
- android:id="@+id/cameraMonitorViewId"
+ android:id="@+id/monitorContainer"
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:orientation="vertical"
- />
+ android:orientation="vertical">
+
+ <LinearLayout
+ android:id="@+id/cameraMonitorViewId"
+ android:visibility="gone"
+ android:layout_width="match_parent"
+ android:layout_height="0dp"
+ android:layout_weight="1"
+ android:orientation="vertical"
+ />
+ <FrameLayout
+ android:id="@+id/tfodMonitorViewId"
+ android:visibility="gone"
+ android:layout_width="match_parent"
+ android:layout_height="0dp"
+ android:layout_weight="1"
+ />
+
+ </LinearLayout>
<!-- When visible, the error message will overlay and thus partially
obscure part of the camera monitor. We make this trade off so as to
diff --git a/FtcRobotController/src/main/res/raw/gold.wav b/FtcRobotController/src/main/res/raw/gold.wav
new file mode 100644
index 0000000..3a7baf8
--- /dev/null
+++ b/FtcRobotController/src/main/res/raw/gold.wav
Binary files differ
diff --git a/FtcRobotController/src/main/res/raw/silver.wav b/FtcRobotController/src/main/res/raw/silver.wav
new file mode 100644
index 0000000..25918a7
--- /dev/null
+++ b/FtcRobotController/src/main/res/raw/silver.wav
Binary files differ
diff --git a/README.md b/README.md
index 5e0731f..eee1c92 100644
--- a/README.md
+++ b/README.md
@@ -45,6 +45,34 @@ For technical questions regarding the SDK, please visit the FTC Technology forum
# Release Information
**************************************************************************************
+Version 4.2 (built on 18.10.30)
+ * Includes fix to avoid deadlock situation with WatchdogMonitor which could result in USB communication errors.
+ - Comm error appeared to require that user disconnect USB cable and restart the Robot Controller app to recover.
+ - robotControllerLog.txt would have error messages that included the words "E RobotCore: lynx xmit lock: #### abandoning lock:"
+ * Includes fix to correctly list the parent module address for a REV Robotics Expansion Hub in a configuration (.xml) file.
+ - Bug in versions 4.0 and 4.1 would incorrect list the address module for a parent REV Robotics device as "1".
+ - If the parent module had a higher address value than the daisy-chained module, then this bug would prevent the Robot Controller from communicating with the downstream Expansion Hub.
+ * Added requirement for ACCESS_COARSE_LOCATION to allow a Driver Station running Android Oreo to scan for Wi-Fi Direct devices.
+ * Added google() repo to build.gradle because aapt2 must be downloaded from the google() repository beginning with version 3.2 of the Android Gradle Plugin.
+ - Important Note: Android Studio users will need to be connected to the Internet the first time build the ftc_app project.
+ - Internet connectivity is required for the first build so the appropriate files can be downloaded from the Google repository.
+ - Users should not need to be connected to the Internet for subsequent builds.
+ - This should also fix buid issue where Android Studio would complain that it "Could not find com.android.tools.lint:lint-gradle:26.1.4" (or similar).
+ * Added support for REV Spark Mini motor controller as part of the configuration menu for a servo/PWM port on the REV Expansion Hub.
+ * Provide definition for TorqueNado motor type.
+ * Provide examples for playing audio files in an Op Mode.
+ * Block Development Tool Changes
+ - Includes a fix for a problem with the Velocity blocks that were reported in the FTC Technology forum (Blocks Programming subforum).
+ - Change the "Save completed successfully." message to a white color so it will contrast with a green background.
+ - Fixed the "Download image" feature so it will work if there are text blocks in the op mode.
+ * Introduce support for Google's TensorFlow Lite technology for object detetion for 2018-2019 game.
+ - TensorFlow lite can recognize Gold Mineral and Silver Mineral from 2018-2019 game.
+ - Example Java and Block op modes are included to show how to determine the relative position of the gold block (left, center, right).
+
+**************************************************************************************
+# Release Information
+**************************************************************************************
+
Version 4.1 (released on 18.09.24)
Changes include:
diff --git a/TeamCode/src/main/res/raw/readme.md b/TeamCode/src/main/res/raw/readme.md
new file mode 100644
index 0000000..355a3c4
--- /dev/null
+++ b/TeamCode/src/main/res/raw/readme.md
@@ -0,0 +1 @@
+Place your sound files in this folder to use them as project resources. \ No newline at end of file
diff --git a/build.common.gradle b/build.common.gradle
index 9930f2a..50b7a0e 100644
--- a/build.common.gradle
+++ b/build.common.gradle
@@ -32,6 +32,10 @@ android {
}
}
+ aaptOptions {
+ noCompress "tflite"
+ }
+
defaultConfig {
applicationId 'com.qualcomm.ftcrobotcontroller'
minSdkVersion 19
diff --git a/build.gradle b/build.gradle
index b20f639..e13ce16 100644
--- a/build.gradle
+++ b/build.gradle
@@ -13,4 +13,11 @@ buildscript {
}
}
-
+// This is now required because aapt2 has to be downloaded from the
+// google() repository beginning with version 3.2 of the Android Gradle Plugin
+allprojects {
+ repositories {
+ google()
+ jcenter()
+ }
+}
diff --git a/doc/apk/FtcDriverStation-release.apk b/doc/apk/FtcDriverStation-release.apk
index fee9edf..c73361f 100644
--- a/doc/apk/FtcDriverStation-release.apk
+++ b/doc/apk/FtcDriverStation-release.apk
Binary files differ
diff --git a/doc/apk/FtcRobotController-release.apk b/doc/apk/FtcRobotController-release.apk
index 0dfa2db..a4fb715 100644
--- a/doc/apk/FtcRobotController-release.apk
+++ b/doc/apk/FtcRobotController-release.apk
Binary files differ
diff --git a/doc/javadoc/com/qualcomm/ftccommon/SoundPlayer.html b/doc/javadoc/com/qualcomm/ftccommon/SoundPlayer.html
index 10ff5cb..14cbe21 100644
--- a/doc/javadoc/com/qualcomm/ftccommon/SoundPlayer.html
+++ b/doc/javadoc/com/qualcomm/ftccommon/SoundPlayer.html
@@ -208,42 +208,46 @@ extends java.lang.Object</pre>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../com/qualcomm/ftccommon/SoundPlayer.html#masterVolume">masterVolume</a></span></code>&nbsp;</td>
</tr>
<tr class="rowColor">
+<td class="colFirst"><code>protected MediaPlayer</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../com/qualcomm/ftccommon/SoundPlayer.html#mediaSizer">mediaSizer</a></span></code>&nbsp;</td>
+</tr>
+<tr class="altColor">
<td class="colFirst"><code>static int</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../com/qualcomm/ftccommon/SoundPlayer.html#msSoundTransmissionFreshness">msSoundTransmissionFreshness</a></span></code>&nbsp;</td>
</tr>
-<tr class="altColor">
+<tr class="rowColor">
<td class="colFirst"><code>protected java.util.concurrent.ScheduledExecutorService</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../com/qualcomm/ftccommon/SoundPlayer.html#scheduledThreadPool">scheduledThreadPool</a></span></code>&nbsp;</td>
</tr>
-<tr class="rowColor">
+<tr class="altColor">
<td class="colFirst"><code>protected SharedPreferences</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../com/qualcomm/ftccommon/SoundPlayer.html#sharedPreferences">sharedPreferences</a></span></code>&nbsp;</td>
</tr>
-<tr class="altColor">
+<tr class="rowColor">
<td class="colFirst"><code>protected float</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../com/qualcomm/ftccommon/SoundPlayer.html#soundOffVolume">soundOffVolume</a></span></code>&nbsp;</td>
</tr>
-<tr class="rowColor">
+<tr class="altColor">
<td class="colFirst"><code>protected float</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../com/qualcomm/ftccommon/SoundPlayer.html#soundOnVolume">soundOnVolume</a></span></code>&nbsp;</td>
</tr>
-<tr class="altColor">
+<tr class="rowColor">
<td class="colFirst"><code>protected SoundPool</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../com/qualcomm/ftccommon/SoundPlayer.html#soundPool">soundPool</a></span></code>&nbsp;</td>
</tr>
-<tr class="rowColor">
+<tr class="altColor">
<td class="colFirst"><code>static java.lang.String</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../com/qualcomm/ftccommon/SoundPlayer.html#TAG">TAG</a></span></code>&nbsp;</td>
</tr>
-<tr class="altColor">
+<tr class="rowColor">
<td class="colFirst"><code>protected java.util.concurrent.ExecutorService</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../com/qualcomm/ftccommon/SoundPlayer.html#threadPool">threadPool</a></span></code>&nbsp;</td>
</tr>
-<tr class="rowColor">
+<tr class="altColor">
<td class="colFirst"><code>static boolean</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../com/qualcomm/ftccommon/SoundPlayer.html#TRACE">TRACE</a></span></code>&nbsp;</td>
</tr>
-<tr class="altColor">
+<tr class="rowColor">
<td class="colFirst"><code>protected Tracer</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../com/qualcomm/ftccommon/SoundPlayer.html#tracer">tracer</a></span></code>&nbsp;</td>
</tr>
@@ -683,6 +687,15 @@ extends java.lang.Object</pre>
<pre>protected&nbsp;float masterVolume</pre>
</li>
</ul>
+<a name="mediaSizer">
+<!-- -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>mediaSizer</h4>
+<pre>protected&nbsp;MediaPlayer mediaSizer</pre>
+</li>
+</ul>
<a name="currentlyPlayingSounds">
<!-- -->
</a>
diff --git a/doc/javadoc/com/qualcomm/ftccommon/package-tree.html b/doc/javadoc/com/qualcomm/ftccommon/package-tree.html
index e39720e..40b2faf 100644
--- a/doc/javadoc/com/qualcomm/ftccommon/package-tree.html
+++ b/doc/javadoc/com/qualcomm/ftccommon/package-tree.html
@@ -104,12 +104,12 @@
<li type="circle">com.qualcomm.ftccommon.<a href="../../../com/qualcomm/ftccommon/CommandList.USBAccessibleLynxModulesResp.html" title="class in com.qualcomm.ftccommon"><span class="typeNameLink">CommandList.USBAccessibleLynxModulesResp</span></a></li>
<li type="circle">RecvLoopRunnable.DegenerateCallback
<ul>
-<li type="circle">com.qualcomm.ftccommon.<a href="../../../com/qualcomm/ftccommon/FtcLynxModuleAddressUpdateActivity.ReceiveLoopCallback.html" title="class in com.qualcomm.ftccommon"><span class="typeNameLink">FtcLynxModuleAddressUpdateActivity.ReceiveLoopCallback</span></a></li>
+<li type="circle">com.qualcomm.ftccommon.<a href="../../../com/qualcomm/ftccommon/FtcWifiDirectRememberedGroupsActivity.RecvLoopCallback.html" title="class in com.qualcomm.ftccommon"><span class="typeNameLink">FtcWifiDirectRememberedGroupsActivity.RecvLoopCallback</span></a></li>
</ul>
</li>
<li type="circle">RecvLoopRunnable.DegenerateCallback
<ul>
-<li type="circle">com.qualcomm.ftccommon.<a href="../../../com/qualcomm/ftccommon/FtcWifiDirectRememberedGroupsActivity.RecvLoopCallback.html" title="class in com.qualcomm.ftccommon"><span class="typeNameLink">FtcWifiDirectRememberedGroupsActivity.RecvLoopCallback</span></a></li>
+<li type="circle">com.qualcomm.ftccommon.<a href="../../../com/qualcomm/ftccommon/FtcLynxModuleAddressUpdateActivity.ReceiveLoopCallback.html" title="class in com.qualcomm.ftccommon"><span class="typeNameLink">FtcLynxModuleAddressUpdateActivity.ReceiveLoopCallback</span></a></li>
</ul>
</li>
<li type="circle">RecvLoopRunnable.DegenerateCallback
@@ -173,42 +173,42 @@
<li type="circle">com.qualcomm.ftccommon.<a href="../../../com/qualcomm/ftccommon/SoundPlayer.PlaySoundParams.html" title="class in com.qualcomm.ftccommon"><span class="typeNameLink">SoundPlayer.PlaySoundParams</span></a></li>
<li type="circle">ThemedActivity
<ul>
-<li type="circle">com.qualcomm.ftccommon.<a href="../../../com/qualcomm/ftccommon/FtcAboutActivity.html" title="class in com.qualcomm.ftccommon"><span class="typeNameLink">FtcAboutActivity</span></a></li>
+<li type="circle">com.qualcomm.ftccommon.<a href="../../../com/qualcomm/ftccommon/FtcAdvancedRCSettingsActivity.html" title="class in com.qualcomm.ftccommon"><span class="typeNameLink">FtcAdvancedRCSettingsActivity</span></a></li>
</ul>
</li>
<li type="circle">ThemedActivity
<ul>
-<li type="circle">com.qualcomm.ftccommon.<a href="../../../com/qualcomm/ftccommon/ViewLogsActivity.html" title="class in com.qualcomm.ftccommon"><span class="typeNameLink">ViewLogsActivity</span></a></li>
+<li type="circle">com.qualcomm.ftccommon.<a href="../../../com/qualcomm/ftccommon/FtcWifiDirectRememberedGroupsActivity.html" title="class in com.qualcomm.ftccommon"><span class="typeNameLink">FtcWifiDirectRememberedGroupsActivity</span></a></li>
</ul>
</li>
<li type="circle">ThemedActivity
<ul>
-<li type="circle">com.qualcomm.ftccommon.<a href="../../../com/qualcomm/ftccommon/FtcWifiDirectChannelSelectorActivity.html" title="class in com.qualcomm.ftccommon"><span class="typeNameLink">FtcWifiDirectChannelSelectorActivity</span></a></li>
+<li type="circle">com.qualcomm.ftccommon.<a href="../../../com/qualcomm/ftccommon/ConfigWifiDirectActivity.html" title="class in com.qualcomm.ftccommon"><span class="typeNameLink">ConfigWifiDirectActivity</span></a></li>
</ul>
</li>
<li type="circle">ThemedActivity
<ul>
-<li type="circle">com.qualcomm.ftccommon.<a href="../../../com/qualcomm/ftccommon/ConfigWifiDirectActivity.html" title="class in com.qualcomm.ftccommon"><span class="typeNameLink">ConfigWifiDirectActivity</span></a></li>
+<li type="circle">com.qualcomm.ftccommon.<a href="../../../com/qualcomm/ftccommon/FtcWifiDirectChannelSelectorActivity.html" title="class in com.qualcomm.ftccommon"><span class="typeNameLink">FtcWifiDirectChannelSelectorActivity</span></a></li>
</ul>
</li>
<li type="circle">ThemedActivity
<ul>
-<li type="circle">com.qualcomm.ftccommon.<a href="../../../com/qualcomm/ftccommon/FtcLynxFirmwareUpdateActivity.html" title="class in com.qualcomm.ftccommon"><span class="typeNameLink">FtcLynxFirmwareUpdateActivity</span></a></li>
+<li type="circle">com.qualcomm.ftccommon.<a href="../../../com/qualcomm/ftccommon/ViewLogsActivity.html" title="class in com.qualcomm.ftccommon"><span class="typeNameLink">ViewLogsActivity</span></a></li>
</ul>
</li>
<li type="circle">ThemedActivity
<ul>
-<li type="circle">com.qualcomm.ftccommon.<a href="../../../com/qualcomm/ftccommon/FtcRobotControllerSettingsActivity.html" title="class in com.qualcomm.ftccommon"><span class="typeNameLink">FtcRobotControllerSettingsActivity</span></a></li>
+<li type="circle">com.qualcomm.ftccommon.<a href="../../../com/qualcomm/ftccommon/FtcAboutActivity.html" title="class in com.qualcomm.ftccommon"><span class="typeNameLink">FtcAboutActivity</span></a></li>
</ul>
</li>
<li type="circle">ThemedActivity
<ul>
-<li type="circle">com.qualcomm.ftccommon.<a href="../../../com/qualcomm/ftccommon/FtcAdvancedRCSettingsActivity.html" title="class in com.qualcomm.ftccommon"><span class="typeNameLink">FtcAdvancedRCSettingsActivity</span></a></li>
+<li type="circle">com.qualcomm.ftccommon.<a href="../../../com/qualcomm/ftccommon/FtcLynxFirmwareUpdateActivity.html" title="class in com.qualcomm.ftccommon"><span class="typeNameLink">FtcLynxFirmwareUpdateActivity</span></a></li>
</ul>
</li>
<li type="circle">ThemedActivity
<ul>
-<li type="circle">com.qualcomm.ftccommon.<a href="../../../com/qualcomm/ftccommon/FtcWifiDirectRememberedGroupsActivity.html" title="class in com.qualcomm.ftccommon"><span class="typeNameLink">FtcWifiDirectRememberedGroupsActivity</span></a></li>
+<li type="circle">com.qualcomm.ftccommon.<a href="../../../com/qualcomm/ftccommon/FtcRobotControllerSettingsActivity.html" title="class in com.qualcomm.ftccommon"><span class="typeNameLink">FtcRobotControllerSettingsActivity</span></a></li>
</ul>
</li>
<li type="circle">com.qualcomm.ftccommon.<a href="../../../com/qualcomm/ftccommon/UpdateUI.html" title="class in com.qualcomm.ftccommon"><span class="typeNameLink">UpdateUI</span></a></li>
@@ -231,10 +231,10 @@
<ul>
<li type="circle">java.lang.Enum&lt;E&gt; (implements java.lang.Comparable&lt;T&gt;, java.io.Serializable)
<ul>
-<li type="circle">com.qualcomm.ftccommon.<a href="../../../com/qualcomm/ftccommon/FtcLynxFirmwareUpdateActivity.FwResponseStatus.html" title="enum in com.qualcomm.ftccommon"><span class="typeNameLink">FtcLynxFirmwareUpdateActivity.FwResponseStatus</span></a></li>
+<li type="circle">com.qualcomm.ftccommon.<a href="../../../com/qualcomm/ftccommon/SoundPlayer.StopWhat.html" title="enum in com.qualcomm.ftccommon"><span class="typeNameLink">SoundPlayer.StopWhat</span></a></li>
<li type="circle">com.qualcomm.ftccommon.<a href="../../../com/qualcomm/ftccommon/ConfigWifiDirectActivity.Flag.html" title="enum in com.qualcomm.ftccommon"><span class="typeNameLink">ConfigWifiDirectActivity.Flag</span></a></li>
<li type="circle">com.qualcomm.ftccommon.<a href="../../../com/qualcomm/ftccommon/LaunchActivityConstantsList.RequestCode.html" title="enum in com.qualcomm.ftccommon"><span class="typeNameLink">LaunchActivityConstantsList.RequestCode</span></a></li>
-<li type="circle">com.qualcomm.ftccommon.<a href="../../../com/qualcomm/ftccommon/SoundPlayer.StopWhat.html" title="enum in com.qualcomm.ftccommon"><span class="typeNameLink">SoundPlayer.StopWhat</span></a></li>
+<li type="circle">com.qualcomm.ftccommon.<a href="../../../com/qualcomm/ftccommon/FtcLynxFirmwareUpdateActivity.FwResponseStatus.html" title="enum in com.qualcomm.ftccommon"><span class="typeNameLink">FtcLynxFirmwareUpdateActivity.FwResponseStatus</span></a></li>
</ul>
</li>
</ul>
diff --git a/doc/javadoc/com/qualcomm/robotcore/eventloop/opmode/package-tree.html b/doc/javadoc/com/qualcomm/robotcore/eventloop/opmode/package-tree.html
index 35141a2..f7c1d09 100644
--- a/doc/javadoc/com/qualcomm/robotcore/eventloop/opmode/package-tree.html
+++ b/doc/javadoc/com/qualcomm/robotcore/eventloop/opmode/package-tree.html
@@ -107,10 +107,10 @@
</ul>
<h2 title="Annotation Type Hierarchy">Annotation Type Hierarchy</h2>
<ul>
-<li type="circle">com.qualcomm.robotcore.eventloop.opmode.<a href="../../../../../com/qualcomm/robotcore/eventloop/opmode/TeleOp.html" title="annotation in com.qualcomm.robotcore.eventloop.opmode"><span class="typeNameLink">TeleOp</span></a> (implements java.lang.annotation.Annotation)</li>
<li type="circle">com.qualcomm.robotcore.eventloop.opmode.<a href="../../../../../com/qualcomm/robotcore/eventloop/opmode/Autonomous.html" title="annotation in com.qualcomm.robotcore.eventloop.opmode"><span class="typeNameLink">Autonomous</span></a> (implements java.lang.annotation.Annotation)</li>
-<li type="circle">com.qualcomm.robotcore.eventloop.opmode.<a href="../../../../../com/qualcomm/robotcore/eventloop/opmode/OpModeRegistrar.html" title="annotation in com.qualcomm.robotcore.eventloop.opmode"><span class="typeNameLink">OpModeRegistrar</span></a> (implements java.lang.annotation.Annotation)</li>
<li type="circle">com.qualcomm.robotcore.eventloop.opmode.<a href="../../../../../com/qualcomm/robotcore/eventloop/opmode/Disabled.html" title="annotation in com.qualcomm.robotcore.eventloop.opmode"><span class="typeNameLink">Disabled</span></a> (implements java.lang.annotation.Annotation)</li>
+<li type="circle">com.qualcomm.robotcore.eventloop.opmode.<a href="../../../../../com/qualcomm/robotcore/eventloop/opmode/OpModeRegistrar.html" title="annotation in com.qualcomm.robotcore.eventloop.opmode"><span class="typeNameLink">OpModeRegistrar</span></a> (implements java.lang.annotation.Annotation)</li>
+<li type="circle">com.qualcomm.robotcore.eventloop.opmode.<a href="../../../../../com/qualcomm/robotcore/eventloop/opmode/TeleOp.html" title="annotation in com.qualcomm.robotcore.eventloop.opmode"><span class="typeNameLink">TeleOp</span></a> (implements java.lang.annotation.Annotation)</li>
</ul>
</div>
<!-- ======= START OF BOTTOM NAVBAR ====== -->
diff --git a/doc/javadoc/com/qualcomm/robotcore/hardware/package-tree.html b/doc/javadoc/com/qualcomm/robotcore/hardware/package-tree.html
index 5247834..c3ea2e6 100644
--- a/doc/javadoc/com/qualcomm/robotcore/hardware/package-tree.html
+++ b/doc/javadoc/com/qualcomm/robotcore/hardware/package-tree.html
@@ -314,25 +314,25 @@
<ul>
<li type="circle">java.lang.Enum&lt;E&gt; (implements java.lang.Comparable&lt;T&gt;, java.io.Serializable)
<ul>
-<li type="circle">com.qualcomm.robotcore.hardware.<a href="../../../../com/qualcomm/robotcore/hardware/HardwareDeviceHealth.HealthStatus.html" title="enum in com.qualcomm.robotcore.hardware"><span class="typeNameLink">HardwareDeviceHealth.HealthStatus</span></a></li>
-<li type="circle">com.qualcomm.robotcore.hardware.<a href="../../../../com/qualcomm/robotcore/hardware/CompassSensor.CompassMode.html" title="enum in com.qualcomm.robotcore.hardware"><span class="typeNameLink">CompassSensor.CompassMode</span></a></li>
-<li type="circle">com.qualcomm.robotcore.hardware.<a href="../../../../com/qualcomm/robotcore/hardware/DigitalChannelController.Mode.html" title="enum in com.qualcomm.robotcore.hardware"><span class="typeNameLink">DigitalChannelController.Mode</span></a></li>
-<li type="circle">com.qualcomm.robotcore.hardware.<a href="../../../../com/qualcomm/robotcore/hardware/DcMotorSimple.Direction.html" title="enum in com.qualcomm.robotcore.hardware"><span class="typeNameLink">DcMotorSimple.Direction</span></a></li>
-<li type="circle">com.qualcomm.robotcore.hardware.<a href="../../../../com/qualcomm/robotcore/hardware/I2cDeviceSynchImpl.WRITE_CACHE_STATUS.html" title="enum in com.qualcomm.robotcore.hardware"><span class="typeNameLink">I2cDeviceSynchImpl.WRITE_CACHE_STATUS</span></a></li>
-<li type="circle">com.qualcomm.robotcore.hardware.<a href="../../../../com/qualcomm/robotcore/hardware/I2cWaitControl.html" title="enum in com.qualcomm.robotcore.hardware"><span class="typeNameLink">I2cWaitControl</span></a></li>
-<li type="circle">com.qualcomm.robotcore.hardware.<a href="../../../../com/qualcomm/robotcore/hardware/DcMotor.ZeroPowerBehavior.html" title="enum in com.qualcomm.robotcore.hardware"><span class="typeNameLink">DcMotor.ZeroPowerBehavior</span></a></li>
<li type="circle">com.qualcomm.robotcore.hardware.<a href="../../../../com/qualcomm/robotcore/hardware/HardwareDevice.Manufacturer.html" title="enum in com.qualcomm.robotcore.hardware"><span class="typeNameLink">HardwareDevice.Manufacturer</span></a></li>
-<li type="circle">com.qualcomm.robotcore.hardware.<a href="../../../../com/qualcomm/robotcore/hardware/ServoController.PwmStatus.html" title="enum in com.qualcomm.robotcore.hardware"><span class="typeNameLink">ServoController.PwmStatus</span></a></li>
-<li type="circle">com.qualcomm.robotcore.hardware.<a href="../../../../com/qualcomm/robotcore/hardware/DeviceManager.UsbDeviceType.html" title="enum in com.qualcomm.robotcore.hardware"><span class="typeNameLink">DeviceManager.UsbDeviceType</span></a></li>
-<li type="circle">com.qualcomm.robotcore.hardware.<a href="../../../../com/qualcomm/robotcore/hardware/MotorControlAlgorithm.html" title="enum in com.qualcomm.robotcore.hardware"><span class="typeNameLink">MotorControlAlgorithm</span></a></li>
-<li type="circle">com.qualcomm.robotcore.hardware.<a href="../../../../com/qualcomm/robotcore/hardware/I2cDeviceSynch.ReadMode.html" title="enum in com.qualcomm.robotcore.hardware"><span class="typeNameLink">I2cDeviceSynch.ReadMode</span></a></li>
<li type="circle">com.qualcomm.robotcore.hardware.<a href="../../../../com/qualcomm/robotcore/hardware/DigitalChannel.Mode.html" title="enum in com.qualcomm.robotcore.hardware"><span class="typeNameLink">DigitalChannel.Mode</span></a></li>
<li type="circle">com.qualcomm.robotcore.hardware.<a href="../../../../com/qualcomm/robotcore/hardware/ControlSystem.html" title="enum in com.qualcomm.robotcore.hardware"><span class="typeNameLink">ControlSystem</span></a></li>
+<li type="circle">com.qualcomm.robotcore.hardware.<a href="../../../../com/qualcomm/robotcore/hardware/DeviceManager.UsbDeviceType.html" title="enum in com.qualcomm.robotcore.hardware"><span class="typeNameLink">DeviceManager.UsbDeviceType</span></a></li>
+<li type="circle">com.qualcomm.robotcore.hardware.<a href="../../../../com/qualcomm/robotcore/hardware/ServoController.PwmStatus.html" title="enum in com.qualcomm.robotcore.hardware"><span class="typeNameLink">ServoController.PwmStatus</span></a></li>
+<li type="circle">com.qualcomm.robotcore.hardware.<a href="../../../../com/qualcomm/robotcore/hardware/DigitalChannelController.Mode.html" title="enum in com.qualcomm.robotcore.hardware"><span class="typeNameLink">DigitalChannelController.Mode</span></a></li>
+<li type="circle">com.qualcomm.robotcore.hardware.<a href="../../../../com/qualcomm/robotcore/hardware/I2cDeviceSynchImpl.WRITE_CACHE_STATUS.html" title="enum in com.qualcomm.robotcore.hardware"><span class="typeNameLink">I2cDeviceSynchImpl.WRITE_CACHE_STATUS</span></a></li>
<li type="circle">com.qualcomm.robotcore.hardware.<a href="../../../../com/qualcomm/robotcore/hardware/DcMotor.RunMode.html" title="enum in com.qualcomm.robotcore.hardware"><span class="typeNameLink">DcMotor.RunMode</span></a></li>
-<li type="circle">com.qualcomm.robotcore.hardware.<a href="../../../../com/qualcomm/robotcore/hardware/Servo.Direction.html" title="enum in com.qualcomm.robotcore.hardware"><span class="typeNameLink">Servo.Direction</span></a></li>
-<li type="circle">com.qualcomm.robotcore.hardware.<a href="../../../../com/qualcomm/robotcore/hardware/I2cDeviceSynchImpl.CONTROLLER_PORT_MODE.html" title="enum in com.qualcomm.robotcore.hardware"><span class="typeNameLink">I2cDeviceSynchImpl.CONTROLLER_PORT_MODE</span></a></li>
+<li type="circle">com.qualcomm.robotcore.hardware.<a href="../../../../com/qualcomm/robotcore/hardware/MotorControlAlgorithm.html" title="enum in com.qualcomm.robotcore.hardware"><span class="typeNameLink">MotorControlAlgorithm</span></a></li>
+<li type="circle">com.qualcomm.robotcore.hardware.<a href="../../../../com/qualcomm/robotcore/hardware/I2cDeviceSynch.ReadMode.html" title="enum in com.qualcomm.robotcore.hardware"><span class="typeNameLink">I2cDeviceSynch.ReadMode</span></a></li>
<li type="circle">com.qualcomm.robotcore.hardware.<a href="../../../../com/qualcomm/robotcore/hardware/I2cDeviceSynchImpl.READ_CACHE_STATUS.html" title="enum in com.qualcomm.robotcore.hardware"><span class="typeNameLink">I2cDeviceSynchImpl.READ_CACHE_STATUS</span></a></li>
<li type="circle">com.qualcomm.robotcore.hardware.<a href="../../../../com/qualcomm/robotcore/hardware/IrSeekerSensor.Mode.html" title="enum in com.qualcomm.robotcore.hardware"><span class="typeNameLink">IrSeekerSensor.Mode</span></a></li>
+<li type="circle">com.qualcomm.robotcore.hardware.<a href="../../../../com/qualcomm/robotcore/hardware/DcMotor.ZeroPowerBehavior.html" title="enum in com.qualcomm.robotcore.hardware"><span class="typeNameLink">DcMotor.ZeroPowerBehavior</span></a></li>
+<li type="circle">com.qualcomm.robotcore.hardware.<a href="../../../../com/qualcomm/robotcore/hardware/CompassSensor.CompassMode.html" title="enum in com.qualcomm.robotcore.hardware"><span class="typeNameLink">CompassSensor.CompassMode</span></a></li>
+<li type="circle">com.qualcomm.robotcore.hardware.<a href="../../../../com/qualcomm/robotcore/hardware/HardwareDeviceHealth.HealthStatus.html" title="enum in com.qualcomm.robotcore.hardware"><span class="typeNameLink">HardwareDeviceHealth.HealthStatus</span></a></li>
+<li type="circle">com.qualcomm.robotcore.hardware.<a href="../../../../com/qualcomm/robotcore/hardware/I2cWaitControl.html" title="enum in com.qualcomm.robotcore.hardware"><span class="typeNameLink">I2cWaitControl</span></a></li>
+<li type="circle">com.qualcomm.robotcore.hardware.<a href="../../../../com/qualcomm/robotcore/hardware/DcMotorSimple.Direction.html" title="enum in com.qualcomm.robotcore.hardware"><span class="typeNameLink">DcMotorSimple.Direction</span></a></li>
+<li type="circle">com.qualcomm.robotcore.hardware.<a href="../../../../com/qualcomm/robotcore/hardware/Servo.Direction.html" title="enum in com.qualcomm.robotcore.hardware"><span class="typeNameLink">Servo.Direction</span></a></li>
+<li type="circle">com.qualcomm.robotcore.hardware.<a href="../../../../com/qualcomm/robotcore/hardware/I2cDeviceSynchImpl.CONTROLLER_PORT_MODE.html" title="enum in com.qualcomm.robotcore.hardware"><span class="typeNameLink">I2cDeviceSynchImpl.CONTROLLER_PORT_MODE</span></a></li>
</ul>
</li>
</ul>
diff --git a/doc/javadoc/index-all.html b/doc/javadoc/index-all.html
index 1c3978e..81a8496 100644
--- a/doc/javadoc/index-all.html
+++ b/doc/javadoc/index-all.html
@@ -615,6 +615,10 @@
</dd>
<dt><span class="memberNameLink"><a href="com/qualcomm/ftccommon/FtcLynxFirmwareUpdateActivity.html#cancelUpdate">cancelUpdate</a></span> - Variable in class com.qualcomm.ftccommon.<a href="com/qualcomm/ftccommon/FtcLynxFirmwareUpdateActivity.html" title="class in com.qualcomm.ftccommon">FtcLynxFirmwareUpdateActivity</a></dt>
<dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/firstinspires/ftc/robotcore/external/ClassFactory.html#canCreateTFObjectDetector--">canCreateTFObjectDetector()</a></span> - Method in class org.firstinspires.ftc.robotcore.external.<a href="org/firstinspires/ftc/robotcore/external/ClassFactory.html" title="class in org.firstinspires.ftc.robotcore.external">ClassFactory</a></dt>
+<dd>
+<div class="block">Return true if this device is compatible with Tensor Flow Object Detection, false otherwise.</div>
+</dd>
<dt><span class="memberNameLink"><a href="com/qualcomm/robotcore/hardware/HardwareMap.DeviceMapping.html#cast-java.lang.Object-">cast(Object)</a></span> - Method in class com.qualcomm.robotcore.hardware.<a href="com/qualcomm/robotcore/hardware/HardwareMap.DeviceMapping.html" title="class in com.qualcomm.robotcore.hardware">HardwareMap.DeviceMapping</a></dt>
<dd>
<div class="block">A small utility that assists in keeping the Java generics type system happy</div>
@@ -1201,6 +1205,11 @@
</dd>
<dt><span class="memberNameLink"><a href="com/qualcomm/robotcore/hardware/DeviceManager.html#createServoEx-com.qualcomm.robotcore.hardware.ServoControllerEx-int-java.lang.String-ServoConfigurationType-">createServoEx(ServoControllerEx, int, String, ServoConfigurationType)</a></span> - Method in interface com.qualcomm.robotcore.hardware.<a href="com/qualcomm/robotcore/hardware/DeviceManager.html" title="interface in com.qualcomm.robotcore.hardware">DeviceManager</a></dt>
<dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/firstinspires/ftc/robotcore/external/ClassFactory.html#createTFObjectDetector-TFObjectDetector.Parameters-org.firstinspires.ftc.robotcore.external.navigation.VuforiaLocalizer-">createTFObjectDetector(TFObjectDetector.Parameters, VuforiaLocalizer)</a></span> - Method in class org.firstinspires.ftc.robotcore.external.<a href="org/firstinspires/ftc/robotcore/external/ClassFactory.html" title="class in org.firstinspires.ftc.robotcore.external">ClassFactory</a></dt>
+<dd>
+<div class="block"><code>createTFObjectDetector</code> returns
+ an instance of the Tensor Flow object detector engine configured with the indicated set of parameters.</div>
+</dd>
<dt><span class="memberNameLink"><a href="com/qualcomm/robotcore/hardware/DeviceManager.html#createUsbDcMotorController-com.qualcomm.robotcore.util.SerialNumber-java.lang.String-">createUsbDcMotorController(SerialNumber, String)</a></span> - Method in interface com.qualcomm.robotcore.hardware.<a href="com/qualcomm/robotcore/hardware/DeviceManager.html" title="interface in com.qualcomm.robotcore.hardware">DeviceManager</a></dt>
<dd>
<div class="block">Create an instance of a DcMotorController</div>
@@ -1703,6 +1712,10 @@
<div class="block">(Advanced) Ensures that Vuforia exposes necessary data formats in <code>Frame</code>s that allows
<a href="org/firstinspires/ftc/robotcore/external/navigation/VuforiaLocalizer.html#convertFrameToBitmap-Frame-"><code>VuforiaLocalizer.convertFrameToBitmap(Frame)</code></a> to function</div>
</dd>
+<dt><span class="memberNameLink"><a href="org/firstinspires/ftc/robotcore/external/navigation/VuforiaLocalizer.html#enableConvertFrameToFormat-int...-">enableConvertFrameToFormat(int...)</a></span> - Method in interface org.firstinspires.ftc.robotcore.external.navigation.<a href="org/firstinspires/ftc/robotcore/external/navigation/VuforiaLocalizer.html" title="interface in org.firstinspires.ftc.robotcore.external.navigation">VuforiaLocalizer</a></dt>
+<dd>
+<div class="block">(Advanced) Ask Vuforia to convert frames to the given requested formats.</div>
+</dd>
<dt><span class="memberNameLink"><a href="com/qualcomm/robotcore/hardware/LightMultiplexor.html#enableCount">enableCount</a></span> - Variable in class com.qualcomm.robotcore.hardware.<a href="com/qualcomm/robotcore/hardware/LightMultiplexor.html" title="class in com.qualcomm.robotcore.hardware">LightMultiplexor</a></dt>
<dd>&nbsp;</dd>
<dt><span class="memberNameLink"><a href="com/qualcomm/robotcore/hardware/I2cDeviceSynchImpl.Callback.html#enabledReadMode">enabledReadMode</a></span> - Variable in class com.qualcomm.robotcore.hardware.<a href="com/qualcomm/robotcore/hardware/I2cDeviceSynchImpl.Callback.html" title="class in com.qualcomm.robotcore.hardware">I2cDeviceSynchImpl.Callback</a></dt>
@@ -3570,6 +3583,8 @@
<dd>
<div class="block">Returns the raw pose of the trackable as reported by Vuforia.</div>
</dd>
+<dt><span class="memberNameLink"><a href="org/firstinspires/ftc/robotcore/external/navigation/VuforiaBase.html#getVuforiaLocalizer--">getVuforiaLocalizer()</a></span> - Method in class org.firstinspires.ftc.robotcore.external.navigation.<a href="org/firstinspires/ftc/robotcore/external/navigation/VuforiaBase.html" title="class in org.firstinspires.ftc.robotcore.external.navigation">VuforiaBase</a></dt>
+<dd>&nbsp;</dd>
<dt><span class="memberNameLink"><a href="org/firstinspires/ftc/robotcore/external/navigation/VuforiaTrackableDefaultListener.html#getVuMarkInstanceId--">getVuMarkInstanceId()</a></span> - Method in class org.firstinspires.ftc.robotcore.external.navigation.<a href="org/firstinspires/ftc/robotcore/external/navigation/VuforiaTrackableDefaultListener.html" title="class in org.firstinspires.ftc.robotcore.external.navigation">VuforiaTrackableDefaultListener</a></dt>
<dd>
<div class="block">Returns the instance id of the currently visible VuMark associated with this
@@ -4923,6 +4938,8 @@
</dd>
<dt><span class="memberNameLink"><a href="org/firstinspires/ftc/robotcore/external/JavaUtil.html#medianOfList-java.util.List-">medianOfList(List)</a></span> - Static method in class org.firstinspires.ftc.robotcore.external.<a href="org/firstinspires/ftc/robotcore/external/JavaUtil.html" title="class in org.firstinspires.ftc.robotcore.external">JavaUtil</a></dt>
<dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="com/qualcomm/ftccommon/SoundPlayer.html#mediaSizer">mediaSizer</a></span> - Variable in class com.qualcomm.ftccommon.<a href="com/qualcomm/ftccommon/SoundPlayer.html" title="class in com.qualcomm.ftccommon">SoundPlayer</a></dt>
+<dd>&nbsp;</dd>
<dt><span class="memberNameLink"><a href="com/qualcomm/robotcore/hardware/DcMotor.RunMode.html#migrate--">migrate()</a></span> - Method in enum com.qualcomm.robotcore.hardware.<a href="com/qualcomm/robotcore/hardware/DcMotor.RunMode.html" title="enum in com.qualcomm.robotcore.hardware">DcMotor.RunMode</a></dt>
<dd>
<div class="block"><span class="deprecatedLabel">Deprecated.</span>
diff --git a/doc/javadoc/org/firstinspires/ftc/robotcore/external/ClassFactory.html b/doc/javadoc/org/firstinspires/ftc/robotcore/external/ClassFactory.html
index 5818545..c00daec 100644
--- a/doc/javadoc/org/firstinspires/ftc/robotcore/external/ClassFactory.html
+++ b/doc/javadoc/org/firstinspires/ftc/robotcore/external/ClassFactory.html
@@ -17,7 +17,7 @@
catch(err) {
}
//-->
-var methods = {"i0":6,"i1":41,"i2":6,"i3":9};
+var methods = {"i0":6,"i1":6,"i2":6,"i3":41,"i4":6,"i5":9};
var tabs = {65535:["t0","All Methods"],1:["t1","Static Methods"],2:["t2","Instance Methods"],4:["t3","Abstract Methods"],8:["t4","Concrete Methods"],32:["t6","Deprecated Methods"]};
var altColor = "altColor";
var rowColor = "rowColor";
@@ -166,13 +166,27 @@ extends java.lang.Object</pre>
<th class="colLast" scope="col">Method and Description</th>
</tr>
<tr id="i0" class="altColor">
+<td class="colFirst"><code>abstract boolean</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/firstinspires/ftc/robotcore/external/ClassFactory.html#canCreateTFObjectDetector--">canCreateTFObjectDetector</a></span>()</code>
+<div class="block">Return true if this device is compatible with Tensor Flow Object Detection, false otherwise.</div>
+</td>
+</tr>
+<tr id="i1" class="rowColor">
+<td class="colFirst"><code>abstract TFObjectDetector</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/firstinspires/ftc/robotcore/external/ClassFactory.html#createTFObjectDetector-TFObjectDetector.Parameters-org.firstinspires.ftc.robotcore.external.navigation.VuforiaLocalizer-">createTFObjectDetector</a></span>(TFObjectDetector.Parameters&nbsp;parameters,
+ <a href="../../../../../org/firstinspires/ftc/robotcore/external/navigation/VuforiaLocalizer.html" title="interface in org.firstinspires.ftc.robotcore.external.navigation">VuforiaLocalizer</a>&nbsp;vuforiaLocalizer)</code>
+<div class="block"><code>createTFObjectDetector</code> returns
+ an instance of the Tensor Flow object detector engine configured with the indicated set of parameters.</div>
+</td>
+</tr>
+<tr id="i2" class="altColor">
<td class="colFirst"><code>abstract <a href="../../../../../org/firstinspires/ftc/robotcore/external/navigation/VuforiaLocalizer.html" title="interface in org.firstinspires.ftc.robotcore.external.navigation">VuforiaLocalizer</a></code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/firstinspires/ftc/robotcore/external/ClassFactory.html#createVuforia-org.firstinspires.ftc.robotcore.external.navigation.VuforiaLocalizer.Parameters-">createVuforia</a></span>(<a href="../../../../../org/firstinspires/ftc/robotcore/external/navigation/VuforiaLocalizer.Parameters.html" title="class in org.firstinspires.ftc.robotcore.external.navigation">VuforiaLocalizer.Parameters</a>&nbsp;parameters)</code>
<div class="block"><a href="../../../../../org/firstinspires/ftc/robotcore/external/ClassFactory.html#createVuforia-org.firstinspires.ftc.robotcore.external.navigation.VuforiaLocalizer.Parameters-"><code>createVuforia</code></a> returns
an instance of the Vuforia localizer engine configured with the indicated set of parameters.</div>
</td>
</tr>
-<tr id="i1" class="rowColor">
+<tr id="i3" class="rowColor">
<td class="colFirst"><code>static <a href="../../../../../org/firstinspires/ftc/robotcore/external/navigation/VuforiaLocalizer.html" title="interface in org.firstinspires.ftc.robotcore.external.navigation">VuforiaLocalizer</a></code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/firstinspires/ftc/robotcore/external/ClassFactory.html#createVuforiaLocalizer-org.firstinspires.ftc.robotcore.external.navigation.VuforiaLocalizer.Parameters-">createVuforiaLocalizer</a></span>(<a href="../../../../../org/firstinspires/ftc/robotcore/external/navigation/VuforiaLocalizer.Parameters.html" title="class in org.firstinspires.ftc.robotcore.external.navigation">VuforiaLocalizer.Parameters</a>&nbsp;parameters)</code>
<div class="block"><span class="deprecatedLabel">Deprecated.</span>&nbsp;
@@ -180,14 +194,14 @@ extends java.lang.Object</pre>
</div>
</td>
</tr>
-<tr id="i2" class="altColor">
+<tr id="i4" class="altColor">
<td class="colFirst"><code>abstract CameraManager</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/firstinspires/ftc/robotcore/external/ClassFactory.html#getCameraManager--">getCameraManager</a></span>()</code>
<div class="block">Returns a <code>CameraManager</code> which can be used to access the USB webcams
attached to the robot controller.</div>
</td>
</tr>
-<tr id="i3" class="rowColor">
+<tr id="i5" class="rowColor">
<td class="colFirst"><code>static <a href="../../../../../org/firstinspires/ftc/robotcore/external/ClassFactory.html" title="class in org.firstinspires.ftc.robotcore.external">ClassFactory</a></code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/firstinspires/ftc/robotcore/external/ClassFactory.html#getInstance--">getInstance</a></span>()</code>&nbsp;</td>
</tr>
@@ -260,6 +274,37 @@ extends java.lang.Object</pre>
</dl>
</li>
</ul>
+<a name="canCreateTFObjectDetector--">
+<!-- -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>canCreateTFObjectDetector</h4>
+<pre>public abstract&nbsp;boolean&nbsp;canCreateTFObjectDetector()</pre>
+<div class="block">Return true if this device is compatible with Tensor Flow Object Detection, false otherwise.</div>
+</li>
+</ul>
+<a name="createTFObjectDetector-TFObjectDetector.Parameters-org.firstinspires.ftc.robotcore.external.navigation.VuforiaLocalizer-">
+<!-- -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>createTFObjectDetector</h4>
+<pre>public abstract&nbsp;TFObjectDetector&nbsp;createTFObjectDetector(TFObjectDetector.Parameters&nbsp;parameters,
+ <a href="../../../../../org/firstinspires/ftc/robotcore/external/navigation/VuforiaLocalizer.html" title="interface in org.firstinspires.ftc.robotcore.external.navigation">VuforiaLocalizer</a>&nbsp;vuforiaLocalizer)</pre>
+<div class="block"><code>createTFObjectDetector</code> returns
+ an instance of the Tensor Flow object detector engine configured with the indicated set of parameters.</div>
+<dl>
+<dt><span class="paramLabel">Parameters:</span></dt>
+<dd><code>parameters</code> - the parameters used to configure the instance of the engine</dd>
+<dd><code>vuforiaLocalizer</code> - the VuforiaLocalizer that will be used to obtain camera frames</dd>
+<dt><span class="returnLabel">Returns:</span></dt>
+<dd>an instance of the Tensor Flow object detector engine.</dd>
+<dt><span class="seeLabel">See Also:</span></dt>
+<dd><code>TFObjectDetector</code></dd>
+</dl>
+</li>
+</ul>
<a name="getCameraManager--">
<!-- -->
</a>
diff --git a/doc/javadoc/org/firstinspires/ftc/robotcore/external/navigation/VuforiaBase.html b/doc/javadoc/org/firstinspires/ftc/robotcore/external/navigation/VuforiaBase.html
index a91c95e..d0a1b78 100644
--- a/doc/javadoc/org/firstinspires/ftc/robotcore/external/navigation/VuforiaBase.html
+++ b/doc/javadoc/org/firstinspires/ftc/robotcore/external/navigation/VuforiaBase.html
@@ -17,7 +17,7 @@
catch(err) {
}
//-->
-var methods = {"i0":10,"i1":10,"i2":9,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10};
+var methods = {"i0":10,"i1":10,"i2":9,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10};
var tabs = {65535:["t0","All Methods"],1:["t1","Static Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]};
var altColor = "altColor";
var rowColor = "rowColor";
@@ -226,6 +226,10 @@ extends java.lang.Object</pre>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/firstinspires/ftc/robotcore/external/navigation/VuforiaBase.html#getListener-java.lang.String-">getListener</a></span>(java.lang.String&nbsp;name)</code>&nbsp;</td>
</tr>
<tr id="i6" class="altColor">
+<td class="colFirst"><code><a href="../../../../../../org/firstinspires/ftc/robotcore/external/navigation/VuforiaLocalizer.html" title="interface in org.firstinspires.ftc.robotcore.external.navigation">VuforiaLocalizer</a></code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/firstinspires/ftc/robotcore/external/navigation/VuforiaBase.html#getVuforiaLocalizer--">getVuforiaLocalizer</a></span>()</code>&nbsp;</td>
+</tr>
+<tr id="i7" class="rowColor">
<td class="colFirst"><code>void</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/firstinspires/ftc/robotcore/external/navigation/VuforiaBase.html#initialize-java.lang.String-CameraName-java.lang.String-boolean-boolean-org.firstinspires.ftc.robotcore.external.navigation.VuforiaLocalizer.Parameters.CameraMonitorFeedback-float-float-float-float-float-float-boolean-">initialize</a></span>(java.lang.String&nbsp;vuforiaLicenseKey,
CameraName&nbsp;cameraName,
@@ -243,7 +247,7 @@ extends java.lang.Object</pre>
<div class="block">Initializes Vuforia, with a CameraName.</div>
</td>
</tr>
-<tr id="i7" class="rowColor">
+<tr id="i8" class="altColor">
<td class="colFirst"><code>void</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/firstinspires/ftc/robotcore/external/navigation/VuforiaBase.html#initialize-java.lang.String-org.firstinspires.ftc.robotcore.external.navigation.VuforiaLocalizer.CameraDirection-boolean-boolean-org.firstinspires.ftc.robotcore.external.navigation.VuforiaLocalizer.Parameters.CameraMonitorFeedback-float-float-float-float-float-float-boolean-">initialize</a></span>(java.lang.String&nbsp;vuforiaLicenseKey,
<a href="../../../../../../org/firstinspires/ftc/robotcore/external/navigation/VuforiaLocalizer.CameraDirection.html" title="enum in org.firstinspires.ftc.robotcore.external.navigation">VuforiaLocalizer.CameraDirection</a>&nbsp;cameraDirection,
@@ -260,17 +264,17 @@ extends java.lang.Object</pre>
<div class="block">Initializes Vuforia, with a CameraDirection.</div>
</td>
</tr>
-<tr id="i8" class="altColor">
+<tr id="i9" class="rowColor">
<td class="colFirst"><code>java.lang.String</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/firstinspires/ftc/robotcore/external/navigation/VuforiaBase.html#printTrackableNames--">printTrackableNames</a></span>()</code>&nbsp;</td>
</tr>
-<tr id="i9" class="rowColor">
+<tr id="i10" class="altColor">
<td class="colFirst"><code><a href="../../../../../../org/firstinspires/ftc/robotcore/external/navigation/VuforiaBase.TrackingResults.html" title="class in org.firstinspires.ftc.robotcore.external.navigation">VuforiaBase.TrackingResults</a></code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/firstinspires/ftc/robotcore/external/navigation/VuforiaBase.html#track-java.lang.String-">track</a></span>(java.lang.String&nbsp;name)</code>
<div class="block">Returns the TrackingResults of the trackable with the given name.</div>
</td>
</tr>
-<tr id="i10" class="altColor">
+<tr id="i11" class="rowColor">
<td class="colFirst"><code><a href="../../../../../../org/firstinspires/ftc/robotcore/external/navigation/VuforiaBase.TrackingResults.html" title="class in org.firstinspires.ftc.robotcore.external.navigation">VuforiaBase.TrackingResults</a></code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/firstinspires/ftc/robotcore/external/navigation/VuforiaBase.html#trackPose-java.lang.String-">trackPose</a></span>(java.lang.String&nbsp;name)</code>
<div class="block">Returns the TrackingResults of the pose of the trackable with the given name.</div>
@@ -403,6 +407,15 @@ extends java.lang.Object</pre>
<pre>public static&nbsp;<a href="../../../../../../org/firstinspires/ftc/robotcore/external/navigation/VuforiaLocalizer.Parameters.html" title="class in org.firstinspires.ftc.robotcore.external.navigation">VuforiaLocalizer.Parameters</a>&nbsp;createParameters()</pre>
</li>
</ul>
+<a name="getVuforiaLocalizer--">
+<!-- -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>getVuforiaLocalizer</h4>
+<pre>public&nbsp;<a href="../../../../../../org/firstinspires/ftc/robotcore/external/navigation/VuforiaLocalizer.html" title="interface in org.firstinspires.ftc.robotcore.external.navigation">VuforiaLocalizer</a>&nbsp;getVuforiaLocalizer()</pre>
+</li>
+</ul>
<a name="activate--">
<!-- -->
</a>
diff --git a/doc/javadoc/org/firstinspires/ftc/robotcore/external/navigation/VuforiaLocalizer.html b/doc/javadoc/org/firstinspires/ftc/robotcore/external/navigation/VuforiaLocalizer.html
index b8177a5..dfadbb4 100644
--- a/doc/javadoc/org/firstinspires/ftc/robotcore/external/navigation/VuforiaLocalizer.html
+++ b/doc/javadoc/org/firstinspires/ftc/robotcore/external/navigation/VuforiaLocalizer.html
@@ -17,7 +17,7 @@
catch(err) {
}
//-->
-var methods = {"i0":6,"i1":6,"i2":6,"i3":6,"i4":6,"i5":6,"i6":6,"i7":6,"i8":6,"i9":6,"i10":6};
+var methods = {"i0":6,"i1":6,"i2":6,"i3":6,"i4":6,"i5":6,"i6":6,"i7":6,"i8":6,"i9":6,"i10":6,"i11":6};
var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],4:["t3","Abstract Methods"]};
var altColor = "altColor";
var rowColor = "rowColor";
@@ -174,57 +174,63 @@ var activeTableTab = "activeTableTab";
</td>
</tr>
<tr id="i2" class="altColor">
+<td class="colFirst"><code>boolean[]</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/firstinspires/ftc/robotcore/external/navigation/VuforiaLocalizer.html#enableConvertFrameToFormat-int...-">enableConvertFrameToFormat</a></span>(int...&nbsp;pixelFormats)</code>
+<div class="block">(Advanced) Ask Vuforia to convert frames to the given requested formats.</div>
+</td>
+</tr>
+<tr id="i3" class="rowColor">
<td class="colFirst"><code>Camera</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/firstinspires/ftc/robotcore/external/navigation/VuforiaLocalizer.html#getCamera--">getCamera</a></span>()</code>
<div class="block">Provides access to the <code>Camera</code> used by Vuforia.</div>
</td>
</tr>
-<tr id="i3" class="rowColor">
+<tr id="i4" class="altColor">
<td class="colFirst"><code>CameraCalibration</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/firstinspires/ftc/robotcore/external/navigation/VuforiaLocalizer.html#getCameraCalibration--">getCameraCalibration</a></span>()</code>
<div class="block">(Advanced) Returns information about Vuforia's knowledge of the camera that it is using.</div>
</td>
</tr>
-<tr id="i4" class="altColor">
+<tr id="i5" class="rowColor">
<td class="colFirst"><code>CameraName</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/firstinspires/ftc/robotcore/external/navigation/VuforiaLocalizer.html#getCameraName--">getCameraName</a></span>()</code>
<div class="block">Provides access to the name of the camera used by Vuforia.</div>
</td>
</tr>
-<tr id="i5" class="rowColor">
+<tr id="i6" class="altColor">
<td class="colFirst"><code>void</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/firstinspires/ftc/robotcore/external/navigation/VuforiaLocalizer.html#getFrameOnce--">getFrameOnce</a></span>(&lt;any&gt;&nbsp;frameConsumer)</code>
<div class="block">(Advanced) Calls the indicated code with a frame from the video stream, exactly once.</div>
</td>
</tr>
-<tr id="i6" class="altColor">
+<tr id="i7" class="rowColor">
<td class="colFirst"><code>java.util.concurrent.BlockingQueue&lt;<a href="../../../../../../org/firstinspires/ftc/robotcore/external/navigation/VuforiaLocalizer.CloseableFrame.html" title="class in org.firstinspires.ftc.robotcore.external.navigation">VuforiaLocalizer.CloseableFrame</a>&gt;</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/firstinspires/ftc/robotcore/external/navigation/VuforiaLocalizer.html#getFrameQueue--">getFrameQueue</a></span>()</code>
<div class="block">(Advanced) Returns a queue into which, if requested, Vuforia <code>Frame</code>s are placed
as they become available.</div>
</td>
</tr>
-<tr id="i7" class="rowColor">
+<tr id="i8" class="altColor">
<td class="colFirst"><code>int</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/firstinspires/ftc/robotcore/external/navigation/VuforiaLocalizer.html#getFrameQueueCapacity--">getFrameQueueCapacity</a></span>()</code>
<div class="block">(Advanced) Returns the current capacity of the frame queue.</div>
</td>
</tr>
-<tr id="i8" class="altColor">
+<tr id="i9" class="rowColor">
<td class="colFirst"><code><a href="../../../../../../org/firstinspires/ftc/robotcore/external/navigation/VuforiaTrackables.html" title="interface in org.firstinspires.ftc.robotcore.external.navigation">VuforiaTrackables</a></code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/firstinspires/ftc/robotcore/external/navigation/VuforiaLocalizer.html#loadTrackablesFromAsset-java.lang.String-">loadTrackablesFromAsset</a></span>(java.lang.String&nbsp;assetName)</code>
<div class="block">Loads a Vuforia dataset from the indicated application asset, which must be of
type .XML.</div>
</td>
</tr>
-<tr id="i9" class="rowColor">
+<tr id="i10" class="altColor">
<td class="colFirst"><code><a href="../../../../../../org/firstinspires/ftc/robotcore/external/navigation/VuforiaTrackables.html" title="interface in org.firstinspires.ftc.robotcore.external.navigation">VuforiaTrackables</a></code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/firstinspires/ftc/robotcore/external/navigation/VuforiaLocalizer.html#loadTrackablesFromFile-java.lang.String-">loadTrackablesFromFile</a></span>(java.lang.String&nbsp;absoluteFileName)</code>
<div class="block">Loads a Vuforia dataset from the indicated file, which must be a .XML file
and contain the full file path.</div>
</td>
</tr>
-<tr id="i10" class="altColor">
+<tr id="i11" class="rowColor">
<td class="colFirst"><code>void</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/firstinspires/ftc/robotcore/external/navigation/VuforiaLocalizer.html#setFrameQueueCapacity-int-">setFrameQueueCapacity</a></span>(int&nbsp;capacity)</code>
<div class="block">(Advanced) Sets the maximum number of <code>Frame</code>s that will simultaneously be stored in the
@@ -430,6 +436,21 @@ var activeTableTab = "activeTableTab";
<a href="../../../../../../org/firstinspires/ftc/robotcore/external/navigation/VuforiaLocalizer.html#convertFrameToBitmap-Frame-"><code>convertFrameToBitmap(Frame)</code></a> to function</div>
</li>
</ul>
+<a name="enableConvertFrameToFormat-int...-">
+<!-- -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>enableConvertFrameToFormat</h4>
+<pre>boolean[]&nbsp;enableConvertFrameToFormat(int...&nbsp;pixelFormats)</pre>
+<div class="block">(Advanced) Ask Vuforia to convert frames to the given requested formats. Returns
+ success/failure result for each format.</div>
+<dl>
+<dt><span class="paramLabel">Parameters:</span></dt>
+<dd><code>pixelFormats</code> - Formats to request Vuforia to convert to.</dd>
+</dl>
+</li>
+</ul>
<a name="convertFrameToBitmap-Frame-">
<!-- -->
</a>
diff --git a/doc/javadoc/org/firstinspires/ftc/robotcore/external/navigation/VuforiaRelicRecovery.html b/doc/javadoc/org/firstinspires/ftc/robotcore/external/navigation/VuforiaRelicRecovery.html
index 8836cfd..58c4bff 100644
--- a/doc/javadoc/org/firstinspires/ftc/robotcore/external/navigation/VuforiaRelicRecovery.html
+++ b/doc/javadoc/org/firstinspires/ftc/robotcore/external/navigation/VuforiaRelicRecovery.html
@@ -206,7 +206,7 @@ extends <a href="../../../../../../org/firstinspires/ftc/robotcore/external/navi
<!-- -->
</a>
<h3>Methods inherited from class&nbsp;org.firstinspires.ftc.robotcore.external.navigation.<a href="../../../../../../org/firstinspires/ftc/robotcore/external/navigation/VuforiaBase.html" title="class in org.firstinspires.ftc.robotcore.external.navigation">VuforiaBase</a></h3>
-<code><a href="../../../../../../org/firstinspires/ftc/robotcore/external/navigation/VuforiaBase.html#activate--">activate</a>, <a href="../../../../../../org/firstinspires/ftc/robotcore/external/navigation/VuforiaBase.html#close--">close</a>, <a href="../../../../../../org/firstinspires/ftc/robotcore/external/navigation/VuforiaBase.html#createParameters--">createParameters</a>, <a href="../../../../../../org/firstinspires/ftc/robotcore/external/navigation/VuforiaBase.html#deactivate--">deactivate</a>, <a href="../../../../../../org/firstinspires/ftc/robotcore/external/navigation/VuforiaBase.html#getListener-java.lang.String-">getListener</a>, <a href="../../../../../../org/firstinspires/ftc/robotcore/external/navigation/VuforiaBase.html#initialize-java.lang.String-CameraName-java.lang.String-boolean-boolean-org.firstinspires.ftc.robotcore.external.navigation.VuforiaLocalizer.Parameters.CameraMonitorFeedback-float-float-float-float-float-float-boolean-">initialize</a>, <a href="../../../../../../org/firstinspires/ftc/robotcore/external/navigation/VuforiaBase.html#initialize-java.lang.String-org.firstinspires.ftc.robotcore.external.navigation.VuforiaLocalizer.CameraDirection-boolean-boolean-org.firstinspires.ftc.robotcore.external.navigation.VuforiaLocalizer.Parameters.CameraMonitorFeedback-float-float-float-float-float-float-boolean-">initialize</a>, <a href="../../../../../../org/firstinspires/ftc/robotcore/external/navigation/VuforiaBase.html#printTrackableNames--">printTrackableNames</a></code></li>
+<code><a href="../../../../../../org/firstinspires/ftc/robotcore/external/navigation/VuforiaBase.html#activate--">activate</a>, <a href="../../../../../../org/firstinspires/ftc/robotcore/external/navigation/VuforiaBase.html#close--">close</a>, <a href="../../../../../../org/firstinspires/ftc/robotcore/external/navigation/VuforiaBase.html#createParameters--">createParameters</a>, <a href="../../../../../../org/firstinspires/ftc/robotcore/external/navigation/VuforiaBase.html#deactivate--">deactivate</a>, <a href="../../../../../../org/firstinspires/ftc/robotcore/external/navigation/VuforiaBase.html#getListener-java.lang.String-">getListener</a>, <a href="../../../../../../org/firstinspires/ftc/robotcore/external/navigation/VuforiaBase.html#getVuforiaLocalizer--">getVuforiaLocalizer</a>, <a href="../../../../../../org/firstinspires/ftc/robotcore/external/navigation/VuforiaBase.html#initialize-java.lang.String-CameraName-java.lang.String-boolean-boolean-org.firstinspires.ftc.robotcore.external.navigation.VuforiaLocalizer.Parameters.CameraMonitorFeedback-float-float-float-float-float-float-boolean-">initialize</a>, <a href="../../../../../../org/firstinspires/ftc/robotcore/external/navigation/VuforiaBase.html#initialize-java.lang.String-org.firstinspires.ftc.robotcore.external.navigation.VuforiaLocalizer.CameraDirection-boolean-boolean-org.firstinspires.ftc.robotcore.external.navigation.VuforiaLocalizer.Parameters.CameraMonitorFeedback-float-float-float-float-float-float-boolean-">initialize</a>, <a href="../../../../../../org/firstinspires/ftc/robotcore/external/navigation/VuforiaBase.html#printTrackableNames--">printTrackableNames</a></code></li>
</ul>
<ul class="blockList">
<li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">
diff --git a/doc/javadoc/org/firstinspires/ftc/robotcore/external/navigation/VuforiaRoverRuckus.html b/doc/javadoc/org/firstinspires/ftc/robotcore/external/navigation/VuforiaRoverRuckus.html
index ccf0344..07a1cdd 100644
--- a/doc/javadoc/org/firstinspires/ftc/robotcore/external/navigation/VuforiaRoverRuckus.html
+++ b/doc/javadoc/org/firstinspires/ftc/robotcore/external/navigation/VuforiaRoverRuckus.html
@@ -184,7 +184,7 @@ extends <a href="../../../../../../org/firstinspires/ftc/robotcore/external/navi
<!-- -->
</a>
<h3>Methods inherited from class&nbsp;org.firstinspires.ftc.robotcore.external.navigation.<a href="../../../../../../org/firstinspires/ftc/robotcore/external/navigation/VuforiaBase.html" title="class in org.firstinspires.ftc.robotcore.external.navigation">VuforiaBase</a></h3>
-<code><a href="../../../../../../org/firstinspires/ftc/robotcore/external/navigation/VuforiaBase.html#activate--">activate</a>, <a href="../../../../../../org/firstinspires/ftc/robotcore/external/navigation/VuforiaBase.html#close--">close</a>, <a href="../../../../../../org/firstinspires/ftc/robotcore/external/navigation/VuforiaBase.html#createParameters--">createParameters</a>, <a href="../../../../../../org/firstinspires/ftc/robotcore/external/navigation/VuforiaBase.html#deactivate--">deactivate</a>, <a href="../../../../../../org/firstinspires/ftc/robotcore/external/navigation/VuforiaBase.html#emptyTrackingResults-java.lang.String-">emptyTrackingResults</a>, <a href="../../../../../../org/firstinspires/ftc/robotcore/external/navigation/VuforiaBase.html#getListener-java.lang.String-">getListener</a>, <a href="../../../../../../org/firstinspires/ftc/robotcore/external/navigation/VuforiaBase.html#initialize-java.lang.String-CameraName-java.lang.String-boolean-boolean-org.firstinspires.ftc.robotcore.external.navigation.VuforiaLocalizer.Parameters.CameraMonitorFeedback-float-float-float-float-float-float-boolean-">initialize</a>, <a href="../../../../../../org/firstinspires/ftc/robotcore/external/navigation/VuforiaBase.html#initialize-java.lang.String-org.firstinspires.ftc.robotcore.external.navigation.VuforiaLocalizer.CameraDirection-boolean-boolean-org.firstinspires.ftc.robotcore.external.navigation.VuforiaLocalizer.Parameters.CameraMonitorFeedback-float-float-float-float-float-float-boolean-">initialize</a>, <a href="../../../../../../org/firstinspires/ftc/robotcore/external/navigation/VuforiaBase.html#printTrackableNames--">printTrackableNames</a>, <a href="../../../../../../org/firstinspires/ftc/robotcore/external/navigation/VuforiaBase.html#track-java.lang.String-">track</a>, <a href="../../../../../../org/firstinspires/ftc/robotcore/external/navigation/VuforiaBase.html#trackPose-java.lang.String-">trackPose</a></code></li>
+<code><a href="../../../../../../org/firstinspires/ftc/robotcore/external/navigation/VuforiaBase.html#activate--">activate</a>, <a href="../../../../../../org/firstinspires/ftc/robotcore/external/navigation/VuforiaBase.html#close--">close</a>, <a href="../../../../../../org/firstinspires/ftc/robotcore/external/navigation/VuforiaBase.html#createParameters--">createParameters</a>, <a href="../../../../../../org/firstinspires/ftc/robotcore/external/navigation/VuforiaBase.html#deactivate--">deactivate</a>, <a href="../../../../../../org/firstinspires/ftc/robotcore/external/navigation/VuforiaBase.html#emptyTrackingResults-java.lang.String-">emptyTrackingResults</a>, <a href="../../../../../../org/firstinspires/ftc/robotcore/external/navigation/VuforiaBase.html#getListener-java.lang.String-">getListener</a>, <a href="../../../../../../org/firstinspires/ftc/robotcore/external/navigation/VuforiaBase.html#getVuforiaLocalizer--">getVuforiaLocalizer</a>, <a href="../../../../../../org/firstinspires/ftc/robotcore/external/navigation/VuforiaBase.html#initialize-java.lang.String-CameraName-java.lang.String-boolean-boolean-org.firstinspires.ftc.robotcore.external.navigation.VuforiaLocalizer.Parameters.CameraMonitorFeedback-float-float-float-float-float-float-boolean-">initialize</a>, <a href="../../../../../../org/firstinspires/ftc/robotcore/external/navigation/VuforiaBase.html#initialize-java.lang.String-org.firstinspires.ftc.robotcore.external.navigation.VuforiaLocalizer.CameraDirection-boolean-boolean-org.firstinspires.ftc.robotcore.external.navigation.VuforiaLocalizer.Parameters.CameraMonitorFeedback-float-float-float-float-float-float-boolean-">initialize</a>, <a href="../../../../../../org/firstinspires/ftc/robotcore/external/navigation/VuforiaBase.html#printTrackableNames--">printTrackableNames</a>, <a href="../../../../../../org/firstinspires/ftc/robotcore/external/navigation/VuforiaBase.html#track-java.lang.String-">track</a>, <a href="../../../../../../org/firstinspires/ftc/robotcore/external/navigation/VuforiaBase.html#trackPose-java.lang.String-">trackPose</a></code></li>
</ul>
<ul class="blockList">
<li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">
diff --git a/doc/javadoc/org/firstinspires/ftc/robotcore/external/navigation/package-tree.html b/doc/javadoc/org/firstinspires/ftc/robotcore/external/navigation/package-tree.html
index 60a02b2..0532541 100644
--- a/doc/javadoc/org/firstinspires/ftc/robotcore/external/navigation/package-tree.html
+++ b/doc/javadoc/org/firstinspires/ftc/robotcore/external/navigation/package-tree.html
@@ -139,19 +139,19 @@
<ul>
<li type="circle">java.lang.Enum&lt;E&gt; (implements java.lang.Comparable&lt;T&gt;, java.io.Serializable)
<ul>
+<li type="circle">org.firstinspires.ftc.robotcore.external.navigation.<a href="../../../../../../org/firstinspires/ftc/robotcore/external/navigation/AxesReference.html" title="enum in org.firstinspires.ftc.robotcore.external.navigation"><span class="typeNameLink">AxesReference</span></a></li>
+<li type="circle">org.firstinspires.ftc.robotcore.external.navigation.<a href="../../../../../../org/firstinspires/ftc/robotcore/external/navigation/RelicRecoveryVuMark.html" title="enum in org.firstinspires.ftc.robotcore.external.navigation"><span class="typeNameLink">RelicRecoveryVuMark</span></a></li>
+<li type="circle">org.firstinspires.ftc.robotcore.external.navigation.<a href="../../../../../../org/firstinspires/ftc/robotcore/external/navigation/VuforiaLocalizer.CameraDirection.html" title="enum in org.firstinspires.ftc.robotcore.external.navigation"><span class="typeNameLink">VuforiaLocalizer.CameraDirection</span></a></li>
<li type="circle">org.firstinspires.ftc.robotcore.external.navigation.<a href="../../../../../../org/firstinspires/ftc/robotcore/external/navigation/TempUnit.html" title="enum in org.firstinspires.ftc.robotcore.external.navigation"><span class="typeNameLink">TempUnit</span></a></li>
-<li type="circle">org.firstinspires.ftc.robotcore.external.navigation.<a href="../../../../../../org/firstinspires/ftc/robotcore/external/navigation/VuforiaLocalizer.Parameters.CameraMonitorFeedback.html" title="enum in org.firstinspires.ftc.robotcore.external.navigation"><span class="typeNameLink">VuforiaLocalizer.Parameters.CameraMonitorFeedback</span></a></li>
+<li type="circle">org.firstinspires.ftc.robotcore.external.navigation.<a href="../../../../../../org/firstinspires/ftc/robotcore/external/navigation/AxesOrder.html" title="enum in org.firstinspires.ftc.robotcore.external.navigation"><span class="typeNameLink">AxesOrder</span></a></li>
+<li type="circle">org.firstinspires.ftc.robotcore.external.navigation.<a href="../../../../../../org/firstinspires/ftc/robotcore/external/navigation/UnnormalizedAngleUnit.html" title="enum in org.firstinspires.ftc.robotcore.external.navigation"><span class="typeNameLink">UnnormalizedAngleUnit</span></a></li>
+<li type="circle">org.firstinspires.ftc.robotcore.external.navigation.<a href="../../../../../../org/firstinspires/ftc/robotcore/external/navigation/VuMarkInstanceId.Type.html" title="enum in org.firstinspires.ftc.robotcore.external.navigation"><span class="typeNameLink">VuMarkInstanceId.Type</span></a></li>
<li type="circle">org.firstinspires.ftc.robotcore.external.navigation.<a href="../../../../../../org/firstinspires/ftc/robotcore/external/navigation/Axis.html" title="enum in org.firstinspires.ftc.robotcore.external.navigation"><span class="typeNameLink">Axis</span></a></li>
<li type="circle">org.firstinspires.ftc.robotcore.external.navigation.<a href="../../../../../../org/firstinspires/ftc/robotcore/external/navigation/DistanceUnit.html" title="enum in org.firstinspires.ftc.robotcore.external.navigation"><span class="typeNameLink">DistanceUnit</span></a></li>
-<li type="circle">org.firstinspires.ftc.robotcore.external.navigation.<a href="../../../../../../org/firstinspires/ftc/robotcore/external/navigation/RelicRecoveryVuMark.html" title="enum in org.firstinspires.ftc.robotcore.external.navigation"><span class="typeNameLink">RelicRecoveryVuMark</span></a></li>
-<li type="circle">org.firstinspires.ftc.robotcore.external.navigation.<a href="../../../../../../org/firstinspires/ftc/robotcore/external/navigation/AxesReference.html" title="enum in org.firstinspires.ftc.robotcore.external.navigation"><span class="typeNameLink">AxesReference</span></a></li>
<li type="circle">org.firstinspires.ftc.robotcore.external.navigation.<a href="../../../../../../org/firstinspires/ftc/robotcore/external/navigation/Rotation.html" title="enum in org.firstinspires.ftc.robotcore.external.navigation"><span class="typeNameLink">Rotation</span></a></li>
-<li type="circle">org.firstinspires.ftc.robotcore.external.navigation.<a href="../../../../../../org/firstinspires/ftc/robotcore/external/navigation/AngleUnit.html" title="enum in org.firstinspires.ftc.robotcore.external.navigation"><span class="typeNameLink">AngleUnit</span></a></li>
-<li type="circle">org.firstinspires.ftc.robotcore.external.navigation.<a href="../../../../../../org/firstinspires/ftc/robotcore/external/navigation/VuMarkInstanceId.Type.html" title="enum in org.firstinspires.ftc.robotcore.external.navigation"><span class="typeNameLink">VuMarkInstanceId.Type</span></a></li>
-<li type="circle">org.firstinspires.ftc.robotcore.external.navigation.<a href="../../../../../../org/firstinspires/ftc/robotcore/external/navigation/VuforiaLocalizer.CameraDirection.html" title="enum in org.firstinspires.ftc.robotcore.external.navigation"><span class="typeNameLink">VuforiaLocalizer.CameraDirection</span></a></li>
-<li type="circle">org.firstinspires.ftc.robotcore.external.navigation.<a href="../../../../../../org/firstinspires/ftc/robotcore/external/navigation/UnnormalizedAngleUnit.html" title="enum in org.firstinspires.ftc.robotcore.external.navigation"><span class="typeNameLink">UnnormalizedAngleUnit</span></a></li>
-<li type="circle">org.firstinspires.ftc.robotcore.external.navigation.<a href="../../../../../../org/firstinspires/ftc/robotcore/external/navigation/AxesOrder.html" title="enum in org.firstinspires.ftc.robotcore.external.navigation"><span class="typeNameLink">AxesOrder</span></a></li>
+<li type="circle">org.firstinspires.ftc.robotcore.external.navigation.<a href="../../../../../../org/firstinspires/ftc/robotcore/external/navigation/VuforiaLocalizer.Parameters.CameraMonitorFeedback.html" title="enum in org.firstinspires.ftc.robotcore.external.navigation"><span class="typeNameLink">VuforiaLocalizer.Parameters.CameraMonitorFeedback</span></a></li>
<li type="circle">org.firstinspires.ftc.robotcore.external.navigation.<a href="../../../../../../org/firstinspires/ftc/robotcore/external/navigation/Orientation.AngleSet.html" title="enum in org.firstinspires.ftc.robotcore.external.navigation"><span class="typeNameLink">Orientation.AngleSet</span></a></li>
+<li type="circle">org.firstinspires.ftc.robotcore.external.navigation.<a href="../../../../../../org/firstinspires/ftc/robotcore/external/navigation/AngleUnit.html" title="enum in org.firstinspires.ftc.robotcore.external.navigation"><span class="typeNameLink">AngleUnit</span></a></li>
</ul>
</li>
</ul>
diff --git a/doc/javadoc/org/firstinspires/ftc/robotcore/external/package-tree.html b/doc/javadoc/org/firstinspires/ftc/robotcore/external/package-tree.html
index 74a69dc..8bb2695 100644
--- a/doc/javadoc/org/firstinspires/ftc/robotcore/external/package-tree.html
+++ b/doc/javadoc/org/firstinspires/ftc/robotcore/external/package-tree.html
@@ -115,11 +115,11 @@
<ul>
<li type="circle">java.lang.Enum&lt;E&gt; (implements java.lang.Comparable&lt;T&gt;, java.io.Serializable)
<ul>
-<li type="circle">org.firstinspires.ftc.robotcore.external.<a href="../../../../../org/firstinspires/ftc/robotcore/external/JavaUtil.TrimMode.html" title="enum in org.firstinspires.ftc.robotcore.external"><span class="typeNameLink">JavaUtil.TrimMode</span></a></li>
+<li type="circle">org.firstinspires.ftc.robotcore.external.<a href="../../../../../org/firstinspires/ftc/robotcore/external/JavaUtil.SortDirection.html" title="enum in org.firstinspires.ftc.robotcore.external"><span class="typeNameLink">JavaUtil.SortDirection</span></a></li>
<li type="circle">org.firstinspires.ftc.robotcore.external.<a href="../../../../../org/firstinspires/ftc/robotcore/external/JavaUtil.SortType.html" title="enum in org.firstinspires.ftc.robotcore.external"><span class="typeNameLink">JavaUtil.SortType</span></a></li>
<li type="circle">org.firstinspires.ftc.robotcore.external.<a href="../../../../../org/firstinspires/ftc/robotcore/external/JavaUtil.AtMode.html" title="enum in org.firstinspires.ftc.robotcore.external"><span class="typeNameLink">JavaUtil.AtMode</span></a></li>
<li type="circle">org.firstinspires.ftc.robotcore.external.<a href="../../../../../org/firstinspires/ftc/robotcore/external/Telemetry.Log.DisplayOrder.html" title="enum in org.firstinspires.ftc.robotcore.external"><span class="typeNameLink">Telemetry.Log.DisplayOrder</span></a></li>
-<li type="circle">org.firstinspires.ftc.robotcore.external.<a href="../../../../../org/firstinspires/ftc/robotcore/external/JavaUtil.SortDirection.html" title="enum in org.firstinspires.ftc.robotcore.external"><span class="typeNameLink">JavaUtil.SortDirection</span></a></li>
+<li type="circle">org.firstinspires.ftc.robotcore.external.<a href="../../../../../org/firstinspires/ftc/robotcore/external/JavaUtil.TrimMode.html" title="enum in org.firstinspires.ftc.robotcore.external"><span class="typeNameLink">JavaUtil.TrimMode</span></a></li>
</ul>
</li>
</ul>
diff --git a/libs/Blocks-release-sources.jar b/libs/Blocks-release-sources.jar
index 1e90c2c..6d41212 100644
--- a/libs/Blocks-release-sources.jar
+++ b/libs/Blocks-release-sources.jar
Binary files differ
diff --git a/libs/Blocks-release.aar b/libs/Blocks-release.aar
index 7522d78..02ecc4c 100644
--- a/libs/Blocks-release.aar
+++ b/libs/Blocks-release.aar
Binary files differ
diff --git a/libs/FtcCommon-release-sources.jar b/libs/FtcCommon-release-sources.jar
index 8d2a589..9d7df51 100644
--- a/libs/FtcCommon-release-sources.jar
+++ b/libs/FtcCommon-release-sources.jar
Binary files differ
diff --git a/libs/FtcCommon-release.aar b/libs/FtcCommon-release.aar
index ea4d537..df9632c 100644
--- a/libs/FtcCommon-release.aar
+++ b/libs/FtcCommon-release.aar
Binary files differ
diff --git a/libs/Hardware-release-sources.jar b/libs/Hardware-release-sources.jar
index 5413c61..693054d 100644
--- a/libs/Hardware-release-sources.jar
+++ b/libs/Hardware-release-sources.jar
Binary files differ
diff --git a/libs/Hardware-release.aar b/libs/Hardware-release.aar
index f01c6be..a8a43b5 100644
--- a/libs/Hardware-release.aar
+++ b/libs/Hardware-release.aar
Binary files differ
diff --git a/libs/Inspection-release-sources.jar b/libs/Inspection-release-sources.jar
index 7528207..ca201da 100644
--- a/libs/Inspection-release-sources.jar
+++ b/libs/Inspection-release-sources.jar
Binary files differ
diff --git a/libs/Inspection-release.aar b/libs/Inspection-release.aar
index 7f9795f..219e1da 100644
--- a/libs/Inspection-release.aar
+++ b/libs/Inspection-release.aar
Binary files differ
diff --git a/libs/RobotCore-release-sources.jar b/libs/RobotCore-release-sources.jar
index ffac243..99a09b5 100644
--- a/libs/RobotCore-release-sources.jar
+++ b/libs/RobotCore-release-sources.jar
Binary files differ
diff --git a/libs/RobotCore-release.aar b/libs/RobotCore-release.aar
index dc7ce35..5fe8472 100644
--- a/libs/RobotCore-release.aar
+++ b/libs/RobotCore-release.aar
Binary files differ