diff --git a/core/src/main/java/org/teamtators/rotator/commands/CoreCommands.java b/core/src/main/java/org/teamtators/rotator/commands/CoreCommands.java index 09b3d54..605cf0c 100644 --- a/core/src/main/java/org/teamtators/rotator/commands/CoreCommands.java +++ b/core/src/main/java/org/teamtators/rotator/commands/CoreCommands.java @@ -28,6 +28,8 @@ public static void register(ConfigCommandStore commandStore) { commandStore.registerClass(TurretTarget.class); commandStore.registerClass(TurretPrep.class); + commandStore.registerClass(OIRumble.class); + commandStore.registerClass(WaitCommand.class); commandStore.registerClass(ChooserCommand.class); } diff --git a/core/src/main/java/org/teamtators/rotator/commands/OIRumble.java b/core/src/main/java/org/teamtators/rotator/commands/OIRumble.java new file mode 100644 index 0000000..3d94da5 --- /dev/null +++ b/core/src/main/java/org/teamtators/rotator/commands/OIRumble.java @@ -0,0 +1,70 @@ +package org.teamtators.rotator.commands; + +import org.teamtators.rotator.CommandBase; +import org.teamtators.rotator.CoreRobot; +import org.teamtators.rotator.config.Configurable; +import org.teamtators.rotator.control.Timer; +import org.teamtators.rotator.operatorInterface.AbstractOperatorInterface; +import org.teamtators.rotator.operatorInterface.LogitechF310; +import org.teamtators.rotator.operatorInterface.RumbleType; + +public class OIRumble extends CommandBase implements Configurable { + + private Config config; + private int times; + private Timer timer; + private boolean rumbling; + private LogitechF310 joystick; + private AbstractOperatorInterface operatorInterface; + + public OIRumble(CoreRobot robot) { + super("OIRumble"); + timer = robot.timer(); + this.operatorInterface = robot.operatorInterface(); + } + + @Override + public void configure(Config config) { + this.config = config; + if (config.joystick.equals("driver")) { + joystick = operatorInterface.driverJoystick(); + } else if (config.joystick.equals("gunner")) { + joystick = operatorInterface.gunnerJoystick(); + } + } + + @Override + protected void initialize() { + logger.info("Rumbling {} times", config.maxTimes); + times = 0; + joystick.setRumble(config.type, (float) config.value); + rumbling = true; + timer.start(); + } + + @Override + protected boolean step() { + if (rumbling && timer.hasPeriodElapsed(config.onTime)) { + joystick.setRumble(config.type, 0); + rumbling = false; + times++; + } else if (!rumbling && timer.hasPeriodElapsed(config.offTime)) { + joystick.setRumble(config.type, (float) config.value); + rumbling = true; + } + return times >= config.maxTimes; + } + + protected void finish() { + joystick.setRumble(config.type, 0); + } + + static class Config { + public int maxTimes; + public double onTime; + public double offTime; + public String joystick = "driver"; + public RumbleType type; + public double value; + } +} diff --git a/core/src/main/java/org/teamtators/rotator/operatorInterface/LogitechF310.java b/core/src/main/java/org/teamtators/rotator/operatorInterface/LogitechF310.java index ba3577b..b8890aa 100644 --- a/core/src/main/java/org/teamtators/rotator/operatorInterface/LogitechF310.java +++ b/core/src/main/java/org/teamtators/rotator/operatorInterface/LogitechF310.java @@ -28,6 +28,8 @@ default TriggerSource getTriggerSource(Button button) { return new LogitechTrigger(this, button); } + void setRumble(RumbleType rumbleType, float value); + /** * Enum containing the location of all the buttons on a Logitech F310 gamepad */ @@ -115,4 +117,5 @@ public boolean getActive() { return joystick.getButtonValue(button); } } + } diff --git a/core/src/main/java/org/teamtators/rotator/operatorInterface/RumbleType.java b/core/src/main/java/org/teamtators/rotator/operatorInterface/RumbleType.java new file mode 100644 index 0000000..ce735c3 --- /dev/null +++ b/core/src/main/java/org/teamtators/rotator/operatorInterface/RumbleType.java @@ -0,0 +1,6 @@ +package org.teamtators.rotator.operatorInterface; + +public enum RumbleType { + LEFT, + RIGHT +} diff --git a/core/src/main/java/org/teamtators/rotator/operatorInterface/noop/NoopLogitechF310.java b/core/src/main/java/org/teamtators/rotator/operatorInterface/noop/NoopLogitechF310.java index b960a3c..878c8ea 100644 --- a/core/src/main/java/org/teamtators/rotator/operatorInterface/noop/NoopLogitechF310.java +++ b/core/src/main/java/org/teamtators/rotator/operatorInterface/noop/NoopLogitechF310.java @@ -1,6 +1,7 @@ package org.teamtators.rotator.operatorInterface.noop; import org.teamtators.rotator.operatorInterface.LogitechF310; +import org.teamtators.rotator.operatorInterface.RumbleType; public class NoopLogitechF310 implements LogitechF310 { @Override @@ -12,4 +13,9 @@ public double getAxisValue(Axis axisKind) { public boolean getButtonValue(Button button) { return false; } + + @Override + public void setRumble(RumbleType rumbleType, float value) { + + } } diff --git a/desktop/src/main/java/org/teamtators/rotator/ui/WASDJoystick.java b/desktop/src/main/java/org/teamtators/rotator/ui/WASDJoystick.java index 4f7655c..a61bc17 100644 --- a/desktop/src/main/java/org/teamtators/rotator/ui/WASDJoystick.java +++ b/desktop/src/main/java/org/teamtators/rotator/ui/WASDJoystick.java @@ -3,6 +3,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.teamtators.rotator.operatorInterface.LogitechF310; +import org.teamtators.rotator.operatorInterface.RumbleType; import org.teamtators.rotator.scheduler.TriggerSource; import javax.inject.Inject; @@ -29,6 +30,11 @@ public WASDJoystick() { reset(); } + @Override + public void setRumble(RumbleType rumbleType, float value) { + + } + public void reset() { up = false; left = false; diff --git a/rio/src/main/java/org/teamtators/rotator/operatorInterface/WPILibLogitechF310.java b/rio/src/main/java/org/teamtators/rotator/operatorInterface/WPILibLogitechF310.java index 865e3c8..91b7ad5 100644 --- a/rio/src/main/java/org/teamtators/rotator/operatorInterface/WPILibLogitechF310.java +++ b/rio/src/main/java/org/teamtators/rotator/operatorInterface/WPILibLogitechF310.java @@ -21,6 +21,18 @@ public WPILibLogitechF310(int port) { super(port); } + @Override + public void setRumble(org.teamtators.rotator.operatorInterface.RumbleType type, float value) { + switch (type) { + case LEFT: + setRumble(RumbleType.kLeftRumble, value); + break; + case RIGHT: + setRumble(RumbleType.kRightRumble, value); + break; + } + } + @Override public double getAxisValue(Axis axisKind) { return getRawAxis(axisKind.getAxisNumber());