+++ /dev/null
-<!DOCTYPE html>
-<html>
-<head>
- <title>DualSense rumble test</title>
- <style>
- body { font-family: sans-serif; padding: 20px; background: #1a1a1a; color: #fff; }
- button { padding: 15px 30px; font-size: 16px; margin: 10px; cursor: pointer; }
- #status { margin: 20px 0; padding: 10px; background: #333; }
- </style>
-</head>
-<body>
- <h1>DualSense rumble test</h1>
- <div id="status">Not connected</div>
- <button onclick="connect()">connect controller</button>
- <button onclick="rumble()" id="rumbleBtn" disabled>test rumble</button>
-
- <script>
- const SONY_VENDOR_ID = 0x054c;
- const DUALSENSE_PRODUCT_ID = 0x0ce6;
- let device = null;
-
- async function connect() {
- const devices = await navigator.hid.requestDevice({
- filters: [{ vendorId: SONY_VENDOR_ID, productId: DUALSENSE_PRODUCT_ID }]
- });
- if (devices.length === 0) return;
-
- device = devices[0];
- await device.open();
- document.getElementById('status').textContent = 'connected: ' + device.productName;
- document.getElementById('rumbleBtn').disabled = false;
- }
-
- async function sendRumble(left, right) {
- if (!device) return;
-
- // get report size from device
- let size = 47;
- if (device.collections?.[0]?.outputReports?.[0]?.items?.[0]) {
- const item = device.collections[0].outputReports[0].items[0];
- size = (item.reportSize * item.reportCount) / 8;
- }
-
- const report = new Uint8Array(size);
- report[0] = 0x03; // enable rumble
- report[1] = 0xF7;
- report[2] = right;
- report[3] = left;
-
- await device.sendReport(0x02, report);
- }
-
- async function rumble() {
- await sendRumble(255, 255);
- setTimeout(() => sendRumble(0, 0), 500);
- }
-
- // auto-connect if already paired
- navigator.hid.getDevices().then(async devices => {
- const ds = devices.find(d => d.vendorId === SONY_VENDOR_ID && d.productId === DUALSENSE_PRODUCT_ID);
- if (ds) {
- device = ds;
- await device.open();
- document.getElementById('status').textContent = 'connected: ' + device.productName;
- document.getElementById('rumbleBtn').disabled = false;
- }
- });
- </script>
-</body>
-</html>
import frc.robot.constants.Constants;
import frc.robot.controls.BaseDriverConfig;
import frc.robot.controls.Operator;
-import frc.robot.controls.PS5ControllerDriverConfig;
import frc.robot.controls.PS5XboxModeDriverConfig;
import frc.robot.subsystems.Climb.LinearClimb;
import frc.robot.subsystems.Intake.Intake;
import edu.wpi.first.wpilibj.DriverStation.Alliance;
import edu.wpi.first.wpilibj2.command.CommandScheduler;
import edu.wpi.first.wpilibj2.command.InstantCommand;
-import edu.wpi.first.wpilibj2.command.SequentialCommandGroup;
-import edu.wpi.first.wpilibj2.command.WaitCommand;
import frc.robot.Robot;
import frc.robot.constants.Constants;
import frc.robot.subsystems.drivetrain.Drivetrain;
getDrivetrain().setDesiredPose(() -> null);
CommandScheduler.getInstance().cancelAll();
}));
-
- // rumble test
- driver.get(Button.A).onTrue(new SequentialCommandGroup(
- new InstantCommand(() -> driver.setRumble(GameController.RumbleStatus.RUMBLE_ON)),
- new WaitCommand(0.5),
- new InstantCommand(() -> driver.setRumble(GameController.RumbleStatus.RUMBLE_OFF))));
}
@Override
public GameController getGameController() {
return driver;
}
-
- public void startRumble() {
- driver.setRumble(GameController.RumbleStatus.RUMBLE_ON);
- }
-
- public void endRumble() {
- driver.setRumble(GameController.RumbleStatus.RUMBLE_OFF);
- }
-
}
import edu.wpi.first.wpilibj2.command.CommandScheduler;
import edu.wpi.first.wpilibj2.command.FunctionalCommand;
import edu.wpi.first.wpilibj2.command.InstantCommand;
-import edu.wpi.first.wpilibj2.command.SequentialCommandGroup;
-import edu.wpi.first.wpilibj2.command.WaitCommand;
import frc.robot.Robot;
import frc.robot.commands.gpm.AutoShootCommand;
import frc.robot.commands.gpm.ClimbDriveCommand;
if (intake != null && spindexer != null && shooter != null) {
controller.get(PS5Button.CIRCLE).onTrue(new InstantCommand(() -> {
reverseMotors = new ReverseMotors(intake, spindexer);
- reverseMotors.schedule();
+ CommandScheduler.getInstance().schedule(reverseMotors);
})).onFalse(new InstantCommand(() -> {
if (reverseMotors != null) {
reverseMotors.cancel();
climb.retract();
}));
- // Drive to climb position and rumble
- controller.get(PS5Button.TRIANGLE).onTrue(new SequentialCommandGroup(
- new ClimbDriveCommand(climb, getDrivetrain()),
- new InstantCommand(() -> this.startRumble()),
- new WaitCommand(1),
- new InstantCommand(() -> this.endRumble())));
+ // Drive to climb position
+ controller.get(PS5Button.TRIANGLE).onTrue(new ClimbDriveCommand(climb, getDrivetrain()));
}
// Hood
public boolean getIsAlign() {
return false;
}
-
- // doesn't work on ps5 controllers, use PS5XboxModeDriverConfig instead
- public void startRumble() {
- controller.rumbleOn();
- }
-
- // doesn't work on ps5 controllers, use PS5XboxModeDriverConfig instead
- public void endRumble() {
- controller.rumbleOff();
- }
}
if (intake != null && spindexer != null && shooter != null) {
controller.get(CIRCLE).onTrue(new InstantCommand(() -> {
reverseMotors = new ReverseMotors(intake, spindexer);
- reverseMotors.schedule();
+ CommandScheduler.getInstance().schedule(reverseMotors);
})).onFalse(new InstantCommand(() -> {
if (reverseMotors != null) {
reverseMotors.cancel();
package lib.controllers;
import edu.wpi.first.wpilibj.Joystick;
-import edu.wpi.first.wpilibj.GenericHID.RumbleType;
import edu.wpi.first.wpilibj2.command.button.Trigger;
import java.util.function.BooleanSupplier;
LEFT_Y(1),
RIGHT_X(2),
/**
- * note: ps5 controller trigger goes from -1 when unpressed, to 1 when fully pressed
+ * note: ps5 controller trigger goes from -1 when unpressed, to 1 when fully
+ * pressed
*/
LEFT_TRIGGER(3),
/**
- * note: ps5 controller trigger goes from -1 when unpressed, to 1 when fully pressed
+ * note: ps5 controller trigger goes from -1 when unpressed, to 1 when fully
+ * pressed
*/
RIGHT_TRIGGER(4),
RIGHT_Y(5);
public Joystick get() {
return controller;
}
-
- public void rumbleOn() {
- controller.setRumble(Joystick.RumbleType.kLeftRumble, 1.0);
- controller.setRumble(Joystick.RumbleType.kRightRumble, 1.0);
- }
-
- public void rumbleOff() {
- controller.setRumble(Joystick.RumbleType.kLeftRumble, 0.0);
- controller.setRumble(Joystick.RumbleType.kRightRumble, 0.0);
- }
}
\ No newline at end of file