mirror of
https://github.com/wpilibsuite/allwpilib
synced 2026-06-19 00:41:43 +00:00
[wpilib] Remove UserControls (#8973)
It was too complex, and we can solve it by figuring out how to make singleton GenericHID objects, implemented in #8970.
This commit is contained in:
@@ -1,33 +0,0 @@
|
||||
// Copyright (c) FIRST and other WPILib contributors.
|
||||
// Open Source Software; you can modify and/or share it under the terms of
|
||||
// the WPILib BSD license file in the root directory of this project.
|
||||
|
||||
package org.wpilib.driverstation;
|
||||
|
||||
import org.wpilib.driverstation.internal.DriverStationBackend;
|
||||
|
||||
/**
|
||||
* A default implementation of UserControls that provides Gamepad instances for each of the 6
|
||||
* joystick ports provided by the DS.
|
||||
*/
|
||||
public class DefaultUserControls implements UserControls {
|
||||
private final Gamepad[] m_gamepads;
|
||||
|
||||
/** Constructs a DefaultUserControls instance with Gamepads for each port. */
|
||||
public DefaultUserControls() {
|
||||
m_gamepads = new Gamepad[DriverStationBackend.JOYSTICK_PORTS];
|
||||
for (int i = 0; i < m_gamepads.length; i++) {
|
||||
m_gamepads[i] = new Gamepad(i);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the Gamepad instance for the specified port.
|
||||
*
|
||||
* @param port The joystick port number.
|
||||
* @return The Gamepad instance for the given port.
|
||||
*/
|
||||
public Gamepad getGamepad(int port) {
|
||||
return m_gamepads[port];
|
||||
}
|
||||
}
|
||||
@@ -1,15 +0,0 @@
|
||||
// Copyright (c) FIRST and other WPILib contributors.
|
||||
// Open Source Software; you can modify and/or share it under the terms of
|
||||
// the WPILib BSD license file in the root directory of this project.
|
||||
|
||||
package org.wpilib.driverstation;
|
||||
|
||||
/**
|
||||
* An interface representing user controls such as gamepads or joysticks. If your main robot class
|
||||
* has a UserControlsInstance attribute with a class implementing this interface, the constructor is
|
||||
* able to receive an instance of that class. Additionally, any OpModes can also receive that same
|
||||
* instance.
|
||||
*
|
||||
* <p>The implementation of this class must have a default constructor
|
||||
*/
|
||||
public interface UserControls {}
|
||||
@@ -1,26 +0,0 @@
|
||||
// Copyright (c) FIRST and other WPILib contributors.
|
||||
// Open Source Software; you can modify and/or share it under the terms of
|
||||
// the WPILib BSD license file in the root directory of this project.
|
||||
|
||||
package org.wpilib.driverstation;
|
||||
|
||||
import java.lang.annotation.ElementType;
|
||||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
import java.lang.annotation.Target;
|
||||
|
||||
/**
|
||||
* An annotation to specify the UserControls implementation class to be used for a robot. Apply this
|
||||
* annotation to your main robot class, providing a class that implements the UserControls
|
||||
* interface.
|
||||
*/
|
||||
@Target(ElementType.TYPE)
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
public @interface UserControlsInstance {
|
||||
/**
|
||||
* The UserControls implementation class to be used.
|
||||
*
|
||||
* @return The class that implements UserControls.
|
||||
*/
|
||||
Class<? extends UserControls> value();
|
||||
}
|
||||
@@ -24,8 +24,6 @@ import java.util.jar.JarFile;
|
||||
import org.wpilib.driverstation.Alert;
|
||||
import org.wpilib.driverstation.DriverStationErrors;
|
||||
import org.wpilib.driverstation.RobotState;
|
||||
import org.wpilib.driverstation.UserControls;
|
||||
import org.wpilib.driverstation.UserControlsInstance;
|
||||
import org.wpilib.driverstation.internal.DriverStationBackend;
|
||||
import org.wpilib.hardware.hal.ControlWord;
|
||||
import org.wpilib.hardware.hal.DriverStationJNI;
|
||||
@@ -90,23 +88,6 @@ public abstract class OpModeRobot extends RobotBase {
|
||||
"Error adding OpMode " + cls.getSimpleName() + ": " + message, false);
|
||||
}
|
||||
|
||||
private final Optional<Class<? extends UserControls>> m_userControlsBaseClass;
|
||||
private UserControls m_userControlsInstance;
|
||||
|
||||
void setUserControlsInstance(UserControls userControlsInstance) {
|
||||
if (m_userControlsBaseClass.isEmpty()) {
|
||||
throw new IllegalStateException("No UserControls class specified");
|
||||
}
|
||||
|
||||
if (!m_userControlsBaseClass.get().isAssignableFrom(userControlsInstance.getClass())) {
|
||||
throw new IllegalArgumentException(
|
||||
userControlsInstance.getClass().getSimpleName()
|
||||
+ " is not assignable to "
|
||||
+ m_userControlsBaseClass.get().getSimpleName());
|
||||
}
|
||||
m_userControlsInstance = userControlsInstance;
|
||||
}
|
||||
|
||||
/**
|
||||
* Find a public constructor to instantiate the opmode. This constructor can have up to 2
|
||||
* parameters. The first parameter (if present) must be assignable from this.getClass(). The
|
||||
@@ -116,28 +97,12 @@ public abstract class OpModeRobot extends RobotBase {
|
||||
private <T> Optional<ConstructorMatch<T>> findOpModeConstructor(Class<T> cls) {
|
||||
Optional<ConstructorMatch<T>> ctor;
|
||||
|
||||
// try 2-parameter constructor
|
||||
if (m_userControlsBaseClass.isPresent()) {
|
||||
ctor = ConstructorMatch.findBestConstructor(cls, getClass(), m_userControlsBaseClass.get());
|
||||
if (ctor.isPresent()) {
|
||||
return ctor;
|
||||
}
|
||||
}
|
||||
|
||||
// try 1-parameter constructor with RobotBase parameter
|
||||
ctor = ConstructorMatch.findBestConstructor(cls, getClass());
|
||||
if (ctor.isPresent()) {
|
||||
return ctor;
|
||||
}
|
||||
|
||||
// try 1-parameter constructor with UserControls parameter
|
||||
if (m_userControlsBaseClass.isPresent()) {
|
||||
ctor = ConstructorMatch.findBestConstructor(cls, m_userControlsBaseClass.get());
|
||||
if (ctor.isPresent()) {
|
||||
return ctor;
|
||||
}
|
||||
}
|
||||
|
||||
// try no-parameter constructor
|
||||
ctor = ConstructorMatch.findBestConstructor(cls);
|
||||
return ctor;
|
||||
@@ -151,11 +116,7 @@ public abstract class OpModeRobot extends RobotBase {
|
||||
return null;
|
||||
}
|
||||
try {
|
||||
if (m_userControlsInstance != null) {
|
||||
return constructor.get().newInstance(this, m_userControlsInstance);
|
||||
} else {
|
||||
return constructor.get().newInstance(this);
|
||||
}
|
||||
return constructor.get().newInstance(this);
|
||||
} catch (ReflectiveOperationException e) {
|
||||
DriverStationErrors.reportError(
|
||||
"Could not instantiate OpMode " + cls.getSimpleName(), e.getStackTrace());
|
||||
@@ -564,14 +525,6 @@ public abstract class OpModeRobot extends RobotBase {
|
||||
// Add LoopFunc as periodic callback (match C++)
|
||||
addPeriodic(this::loopFunc, period);
|
||||
|
||||
// Check to see if we have a DS annotation
|
||||
UserControlsInstance userControlsAnnotation =
|
||||
getClass().getAnnotation(UserControlsInstance.class);
|
||||
if (userControlsAnnotation != null) {
|
||||
m_userControlsBaseClass = Optional.of(userControlsAnnotation.value());
|
||||
} else {
|
||||
m_userControlsBaseClass = Optional.empty();
|
||||
}
|
||||
// Scan for annotated opmode classes within the derived class's package and subpackages
|
||||
addAnnotatedOpModeClasses(getClass().getPackage());
|
||||
RobotState.publishOpModes();
|
||||
|
||||
@@ -8,8 +8,6 @@ import java.util.Optional;
|
||||
import java.util.concurrent.locks.ReentrantLock;
|
||||
import org.wpilib.driverstation.DriverStationErrors;
|
||||
import org.wpilib.driverstation.RobotState;
|
||||
import org.wpilib.driverstation.UserControls;
|
||||
import org.wpilib.driverstation.UserControlsInstance;
|
||||
import org.wpilib.driverstation.internal.DriverStationBackend;
|
||||
import org.wpilib.hardware.hal.HAL;
|
||||
import org.wpilib.hardware.hal.HALUtil;
|
||||
@@ -291,32 +289,16 @@ public abstract class RobotBase implements AutoCloseable {
|
||||
private static boolean m_suppressExitWarning;
|
||||
|
||||
private static <T extends RobotBase> T constructRobot(Class<T> robotClass) throws Throwable {
|
||||
UserControlsInstance userControlsAttribute =
|
||||
robotClass.getDeclaredAnnotation(UserControlsInstance.class);
|
||||
UserControls userControlsInstance = null;
|
||||
Optional<ConstructorMatch<T>> constructorMatch = Optional.empty();
|
||||
if (userControlsAttribute != null) {
|
||||
var userControlsClass = userControlsAttribute.value();
|
||||
userControlsInstance = userControlsClass.getDeclaredConstructor().newInstance();
|
||||
constructorMatch = ConstructorMatch.findBestConstructor(robotClass, userControlsClass);
|
||||
}
|
||||
|
||||
if (constructorMatch.isEmpty()) {
|
||||
// Try to find a constructor with no parameters if there is no UserControls constructor
|
||||
constructorMatch = ConstructorMatch.findBestConstructor(robotClass);
|
||||
}
|
||||
Optional<ConstructorMatch<T>> constructorMatch =
|
||||
ConstructorMatch.findBestConstructor(robotClass);
|
||||
|
||||
if (constructorMatch.isEmpty()) {
|
||||
throw new IllegalArgumentException(
|
||||
"No valid constructor found in robot class " + robotClass.getName());
|
||||
}
|
||||
|
||||
T robot = constructorMatch.get().newInstance(userControlsInstance);
|
||||
T robot = constructorMatch.get().newInstance();
|
||||
|
||||
if (userControlsInstance != null && robot instanceof OpModeRobot opModeRobot) {
|
||||
// Insert the UserControls instance into the opModeRobot for use when constructing opmodes
|
||||
opModeRobot.setUserControlsInstance(userControlsInstance);
|
||||
}
|
||||
return robot;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user