[wpilib, commands] Cache controller BooleanEvents/Triggers and directly construct Triggers (#6738)

This has been a common footgun for teams, due to calling the factory functions in periodic loops.
This commit is contained in:
Gold856
2024-07-29 10:58:23 -04:00
committed by GitHub
parent 073192d513
commit 3c2bdafd57
21 changed files with 235 additions and 187 deletions

View File

@@ -60,7 +60,7 @@ public class Command{{ ConsoleName }}Controller extends CommandGenericHID {
* to the given loop.
*/
public Trigger {{ button.name }}(EventLoop loop) {
return m_hid.{{ button.name }}(loop).castTo(Trigger::new);
return button({{ ConsoleName }}Controller.Button.k{{ capitalize_first(button.name) }}.value, loop);
}
{% endfor -%}
{% for trigger in triggers -%}
@@ -76,7 +76,7 @@ public class Command{{ ConsoleName }}Controller extends CommandGenericHID {
* threshold, attached to the given event loop
*/
public Trigger {{ trigger.name }}(double threshold, EventLoop loop) {
return m_hid.{{ trigger.name }}(threshold, loop).castTo(Trigger::new);
return axisGreaterThan({{ ConsoleName }}Controller.Axis.k{{ capitalize_first(trigger.name) }}.value, threshold, loop);
}
/**

View File

@@ -18,14 +18,16 @@ frc::{{ ConsoleName }}Controller& Command{{ ConsoleName }}Controller::GetHID() {
}
{% for button in buttons %}
Trigger Command{{ ConsoleName }}Controller::{{ capitalize_first(button.name) }}(frc::EventLoop* loop) const {
return m_hid.{{ capitalize_first(button.name) }}(loop).CastTo<Trigger>();
return Button(frc::{{ ConsoleName }}Controller::Button::k{{ capitalize_first(button.name) }}, loop);
}
{% endfor -%}
{% for trigger in triggers -%}
{% if trigger.UseThresholdMethods %}
Trigger Command{{ ConsoleName }}Controller::{{ capitalize_first(trigger.name) }}(double threshold,
frc::EventLoop* loop) const {
return m_hid.{{ capitalize_first(trigger.name) }}(threshold, loop).CastTo<Trigger>();
return Trigger(loop, [this, threshold] {
return m_hid.Get{{ capitalize_first(trigger.name) }}Axis() > threshold;
});
}
{% endif -%}
{% endfor -%}

View File

@@ -58,7 +58,7 @@ public class CommandPS4Controller extends CommandGenericHID {
* to the given loop.
*/
public Trigger square(EventLoop loop) {
return m_hid.square(loop).castTo(Trigger::new);
return button(PS4Controller.Button.kSquare.value, loop);
}
/**
@@ -80,7 +80,7 @@ public class CommandPS4Controller extends CommandGenericHID {
* to the given loop.
*/
public Trigger cross(EventLoop loop) {
return m_hid.cross(loop).castTo(Trigger::new);
return button(PS4Controller.Button.kCross.value, loop);
}
/**
@@ -102,7 +102,7 @@ public class CommandPS4Controller extends CommandGenericHID {
* to the given loop.
*/
public Trigger circle(EventLoop loop) {
return m_hid.circle(loop).castTo(Trigger::new);
return button(PS4Controller.Button.kCircle.value, loop);
}
/**
@@ -124,7 +124,7 @@ public class CommandPS4Controller extends CommandGenericHID {
* to the given loop.
*/
public Trigger triangle(EventLoop loop) {
return m_hid.triangle(loop).castTo(Trigger::new);
return button(PS4Controller.Button.kTriangle.value, loop);
}
/**
@@ -146,7 +146,7 @@ public class CommandPS4Controller extends CommandGenericHID {
* to the given loop.
*/
public Trigger L1(EventLoop loop) {
return m_hid.L1(loop).castTo(Trigger::new);
return button(PS4Controller.Button.kL1.value, loop);
}
/**
@@ -168,7 +168,7 @@ public class CommandPS4Controller extends CommandGenericHID {
* to the given loop.
*/
public Trigger R1(EventLoop loop) {
return m_hid.R1(loop).castTo(Trigger::new);
return button(PS4Controller.Button.kR1.value, loop);
}
/**
@@ -190,7 +190,7 @@ public class CommandPS4Controller extends CommandGenericHID {
* to the given loop.
*/
public Trigger L2(EventLoop loop) {
return m_hid.L2(loop).castTo(Trigger::new);
return button(PS4Controller.Button.kL2.value, loop);
}
/**
@@ -212,7 +212,7 @@ public class CommandPS4Controller extends CommandGenericHID {
* to the given loop.
*/
public Trigger R2(EventLoop loop) {
return m_hid.R2(loop).castTo(Trigger::new);
return button(PS4Controller.Button.kR2.value, loop);
}
/**
@@ -234,7 +234,7 @@ public class CommandPS4Controller extends CommandGenericHID {
* to the given loop.
*/
public Trigger share(EventLoop loop) {
return m_hid.share(loop).castTo(Trigger::new);
return button(PS4Controller.Button.kShare.value, loop);
}
/**
@@ -256,7 +256,7 @@ public class CommandPS4Controller extends CommandGenericHID {
* to the given loop.
*/
public Trigger options(EventLoop loop) {
return m_hid.options(loop).castTo(Trigger::new);
return button(PS4Controller.Button.kOptions.value, loop);
}
/**
@@ -278,7 +278,7 @@ public class CommandPS4Controller extends CommandGenericHID {
* to the given loop.
*/
public Trigger L3(EventLoop loop) {
return m_hid.L3(loop).castTo(Trigger::new);
return button(PS4Controller.Button.kL3.value, loop);
}
/**
@@ -300,7 +300,7 @@ public class CommandPS4Controller extends CommandGenericHID {
* to the given loop.
*/
public Trigger R3(EventLoop loop) {
return m_hid.R3(loop).castTo(Trigger::new);
return button(PS4Controller.Button.kR3.value, loop);
}
/**
@@ -322,7 +322,7 @@ public class CommandPS4Controller extends CommandGenericHID {
* to the given loop.
*/
public Trigger PS(EventLoop loop) {
return m_hid.PS(loop).castTo(Trigger::new);
return button(PS4Controller.Button.kPS.value, loop);
}
/**
@@ -344,7 +344,7 @@ public class CommandPS4Controller extends CommandGenericHID {
* to the given loop.
*/
public Trigger touchpad(EventLoop loop) {
return m_hid.touchpad(loop).castTo(Trigger::new);
return button(PS4Controller.Button.kTouchpad.value, loop);
}
/**

View File

@@ -58,7 +58,7 @@ public class CommandPS5Controller extends CommandGenericHID {
* to the given loop.
*/
public Trigger square(EventLoop loop) {
return m_hid.square(loop).castTo(Trigger::new);
return button(PS5Controller.Button.kSquare.value, loop);
}
/**
@@ -80,7 +80,7 @@ public class CommandPS5Controller extends CommandGenericHID {
* to the given loop.
*/
public Trigger cross(EventLoop loop) {
return m_hid.cross(loop).castTo(Trigger::new);
return button(PS5Controller.Button.kCross.value, loop);
}
/**
@@ -102,7 +102,7 @@ public class CommandPS5Controller extends CommandGenericHID {
* to the given loop.
*/
public Trigger circle(EventLoop loop) {
return m_hid.circle(loop).castTo(Trigger::new);
return button(PS5Controller.Button.kCircle.value, loop);
}
/**
@@ -124,7 +124,7 @@ public class CommandPS5Controller extends CommandGenericHID {
* to the given loop.
*/
public Trigger triangle(EventLoop loop) {
return m_hid.triangle(loop).castTo(Trigger::new);
return button(PS5Controller.Button.kTriangle.value, loop);
}
/**
@@ -146,7 +146,7 @@ public class CommandPS5Controller extends CommandGenericHID {
* to the given loop.
*/
public Trigger L1(EventLoop loop) {
return m_hid.L1(loop).castTo(Trigger::new);
return button(PS5Controller.Button.kL1.value, loop);
}
/**
@@ -168,7 +168,7 @@ public class CommandPS5Controller extends CommandGenericHID {
* to the given loop.
*/
public Trigger R1(EventLoop loop) {
return m_hid.R1(loop).castTo(Trigger::new);
return button(PS5Controller.Button.kR1.value, loop);
}
/**
@@ -190,7 +190,7 @@ public class CommandPS5Controller extends CommandGenericHID {
* to the given loop.
*/
public Trigger L2(EventLoop loop) {
return m_hid.L2(loop).castTo(Trigger::new);
return button(PS5Controller.Button.kL2.value, loop);
}
/**
@@ -212,7 +212,7 @@ public class CommandPS5Controller extends CommandGenericHID {
* to the given loop.
*/
public Trigger R2(EventLoop loop) {
return m_hid.R2(loop).castTo(Trigger::new);
return button(PS5Controller.Button.kR2.value, loop);
}
/**
@@ -234,7 +234,7 @@ public class CommandPS5Controller extends CommandGenericHID {
* to the given loop.
*/
public Trigger create(EventLoop loop) {
return m_hid.create(loop).castTo(Trigger::new);
return button(PS5Controller.Button.kCreate.value, loop);
}
/**
@@ -256,7 +256,7 @@ public class CommandPS5Controller extends CommandGenericHID {
* to the given loop.
*/
public Trigger options(EventLoop loop) {
return m_hid.options(loop).castTo(Trigger::new);
return button(PS5Controller.Button.kOptions.value, loop);
}
/**
@@ -278,7 +278,7 @@ public class CommandPS5Controller extends CommandGenericHID {
* to the given loop.
*/
public Trigger L3(EventLoop loop) {
return m_hid.L3(loop).castTo(Trigger::new);
return button(PS5Controller.Button.kL3.value, loop);
}
/**
@@ -300,7 +300,7 @@ public class CommandPS5Controller extends CommandGenericHID {
* to the given loop.
*/
public Trigger R3(EventLoop loop) {
return m_hid.R3(loop).castTo(Trigger::new);
return button(PS5Controller.Button.kR3.value, loop);
}
/**
@@ -322,7 +322,7 @@ public class CommandPS5Controller extends CommandGenericHID {
* to the given loop.
*/
public Trigger PS(EventLoop loop) {
return m_hid.PS(loop).castTo(Trigger::new);
return button(PS5Controller.Button.kPS.value, loop);
}
/**
@@ -344,7 +344,7 @@ public class CommandPS5Controller extends CommandGenericHID {
* to the given loop.
*/
public Trigger touchpad(EventLoop loop) {
return m_hid.touchpad(loop).castTo(Trigger::new);
return button(PS5Controller.Button.kTouchpad.value, loop);
}
/**

View File

@@ -58,7 +58,7 @@ public class CommandStadiaController extends CommandGenericHID {
* to the given loop.
*/
public Trigger a(EventLoop loop) {
return m_hid.a(loop).castTo(Trigger::new);
return button(StadiaController.Button.kA.value, loop);
}
/**
@@ -80,7 +80,7 @@ public class CommandStadiaController extends CommandGenericHID {
* to the given loop.
*/
public Trigger b(EventLoop loop) {
return m_hid.b(loop).castTo(Trigger::new);
return button(StadiaController.Button.kB.value, loop);
}
/**
@@ -102,7 +102,7 @@ public class CommandStadiaController extends CommandGenericHID {
* to the given loop.
*/
public Trigger x(EventLoop loop) {
return m_hid.x(loop).castTo(Trigger::new);
return button(StadiaController.Button.kX.value, loop);
}
/**
@@ -124,7 +124,7 @@ public class CommandStadiaController extends CommandGenericHID {
* to the given loop.
*/
public Trigger y(EventLoop loop) {
return m_hid.y(loop).castTo(Trigger::new);
return button(StadiaController.Button.kY.value, loop);
}
/**
@@ -146,7 +146,7 @@ public class CommandStadiaController extends CommandGenericHID {
* to the given loop.
*/
public Trigger leftBumper(EventLoop loop) {
return m_hid.leftBumper(loop).castTo(Trigger::new);
return button(StadiaController.Button.kLeftBumper.value, loop);
}
/**
@@ -168,7 +168,7 @@ public class CommandStadiaController extends CommandGenericHID {
* to the given loop.
*/
public Trigger rightBumper(EventLoop loop) {
return m_hid.rightBumper(loop).castTo(Trigger::new);
return button(StadiaController.Button.kRightBumper.value, loop);
}
/**
@@ -190,7 +190,7 @@ public class CommandStadiaController extends CommandGenericHID {
* to the given loop.
*/
public Trigger leftStick(EventLoop loop) {
return m_hid.leftStick(loop).castTo(Trigger::new);
return button(StadiaController.Button.kLeftStick.value, loop);
}
/**
@@ -212,7 +212,7 @@ public class CommandStadiaController extends CommandGenericHID {
* to the given loop.
*/
public Trigger rightStick(EventLoop loop) {
return m_hid.rightStick(loop).castTo(Trigger::new);
return button(StadiaController.Button.kRightStick.value, loop);
}
/**
@@ -234,7 +234,7 @@ public class CommandStadiaController extends CommandGenericHID {
* to the given loop.
*/
public Trigger ellipses(EventLoop loop) {
return m_hid.ellipses(loop).castTo(Trigger::new);
return button(StadiaController.Button.kEllipses.value, loop);
}
/**
@@ -256,7 +256,7 @@ public class CommandStadiaController extends CommandGenericHID {
* to the given loop.
*/
public Trigger hamburger(EventLoop loop) {
return m_hid.hamburger(loop).castTo(Trigger::new);
return button(StadiaController.Button.kHamburger.value, loop);
}
/**
@@ -278,7 +278,7 @@ public class CommandStadiaController extends CommandGenericHID {
* to the given loop.
*/
public Trigger stadia(EventLoop loop) {
return m_hid.stadia(loop).castTo(Trigger::new);
return button(StadiaController.Button.kStadia.value, loop);
}
/**
@@ -300,7 +300,7 @@ public class CommandStadiaController extends CommandGenericHID {
* to the given loop.
*/
public Trigger rightTrigger(EventLoop loop) {
return m_hid.rightTrigger(loop).castTo(Trigger::new);
return button(StadiaController.Button.kRightTrigger.value, loop);
}
/**
@@ -322,7 +322,7 @@ public class CommandStadiaController extends CommandGenericHID {
* to the given loop.
*/
public Trigger leftTrigger(EventLoop loop) {
return m_hid.leftTrigger(loop).castTo(Trigger::new);
return button(StadiaController.Button.kLeftTrigger.value, loop);
}
/**
@@ -344,7 +344,7 @@ public class CommandStadiaController extends CommandGenericHID {
* to the given loop.
*/
public Trigger google(EventLoop loop) {
return m_hid.google(loop).castTo(Trigger::new);
return button(StadiaController.Button.kGoogle.value, loop);
}
/**
@@ -366,7 +366,7 @@ public class CommandStadiaController extends CommandGenericHID {
* to the given loop.
*/
public Trigger frame(EventLoop loop) {
return m_hid.frame(loop).castTo(Trigger::new);
return button(StadiaController.Button.kFrame.value, loop);
}
/**

View File

@@ -58,7 +58,7 @@ public class CommandXboxController extends CommandGenericHID {
* to the given loop.
*/
public Trigger a(EventLoop loop) {
return m_hid.a(loop).castTo(Trigger::new);
return button(XboxController.Button.kA.value, loop);
}
/**
@@ -80,7 +80,7 @@ public class CommandXboxController extends CommandGenericHID {
* to the given loop.
*/
public Trigger b(EventLoop loop) {
return m_hid.b(loop).castTo(Trigger::new);
return button(XboxController.Button.kB.value, loop);
}
/**
@@ -102,7 +102,7 @@ public class CommandXboxController extends CommandGenericHID {
* to the given loop.
*/
public Trigger x(EventLoop loop) {
return m_hid.x(loop).castTo(Trigger::new);
return button(XboxController.Button.kX.value, loop);
}
/**
@@ -124,7 +124,7 @@ public class CommandXboxController extends CommandGenericHID {
* to the given loop.
*/
public Trigger y(EventLoop loop) {
return m_hid.y(loop).castTo(Trigger::new);
return button(XboxController.Button.kY.value, loop);
}
/**
@@ -146,7 +146,7 @@ public class CommandXboxController extends CommandGenericHID {
* to the given loop.
*/
public Trigger leftBumper(EventLoop loop) {
return m_hid.leftBumper(loop).castTo(Trigger::new);
return button(XboxController.Button.kLeftBumper.value, loop);
}
/**
@@ -168,7 +168,7 @@ public class CommandXboxController extends CommandGenericHID {
* to the given loop.
*/
public Trigger rightBumper(EventLoop loop) {
return m_hid.rightBumper(loop).castTo(Trigger::new);
return button(XboxController.Button.kRightBumper.value, loop);
}
/**
@@ -190,7 +190,7 @@ public class CommandXboxController extends CommandGenericHID {
* to the given loop.
*/
public Trigger back(EventLoop loop) {
return m_hid.back(loop).castTo(Trigger::new);
return button(XboxController.Button.kBack.value, loop);
}
/**
@@ -212,7 +212,7 @@ public class CommandXboxController extends CommandGenericHID {
* to the given loop.
*/
public Trigger start(EventLoop loop) {
return m_hid.start(loop).castTo(Trigger::new);
return button(XboxController.Button.kStart.value, loop);
}
/**
@@ -234,7 +234,7 @@ public class CommandXboxController extends CommandGenericHID {
* to the given loop.
*/
public Trigger leftStick(EventLoop loop) {
return m_hid.leftStick(loop).castTo(Trigger::new);
return button(XboxController.Button.kLeftStick.value, loop);
}
/**
@@ -256,7 +256,7 @@ public class CommandXboxController extends CommandGenericHID {
* to the given loop.
*/
public Trigger rightStick(EventLoop loop) {
return m_hid.rightStick(loop).castTo(Trigger::new);
return button(XboxController.Button.kRightStick.value, loop);
}
/**
@@ -270,7 +270,7 @@ public class CommandXboxController extends CommandGenericHID {
* threshold, attached to the given event loop
*/
public Trigger leftTrigger(double threshold, EventLoop loop) {
return m_hid.leftTrigger(threshold, loop).castTo(Trigger::new);
return axisGreaterThan(XboxController.Axis.kLeftTrigger.value, threshold, loop);
}
/**
@@ -309,7 +309,7 @@ public class CommandXboxController extends CommandGenericHID {
* threshold, attached to the given event loop
*/
public Trigger rightTrigger(double threshold, EventLoop loop) {
return m_hid.rightTrigger(threshold, loop).castTo(Trigger::new);
return axisGreaterThan(XboxController.Axis.kRightTrigger.value, threshold, loop);
}
/**

View File

@@ -16,59 +16,59 @@ frc::PS4Controller& CommandPS4Controller::GetHID() {
}
Trigger CommandPS4Controller::Square(frc::EventLoop* loop) const {
return m_hid.Square(loop).CastTo<Trigger>();
return Button(frc::PS4Controller::Button::kSquare, loop);
}
Trigger CommandPS4Controller::Cross(frc::EventLoop* loop) const {
return m_hid.Cross(loop).CastTo<Trigger>();
return Button(frc::PS4Controller::Button::kCross, loop);
}
Trigger CommandPS4Controller::Circle(frc::EventLoop* loop) const {
return m_hid.Circle(loop).CastTo<Trigger>();
return Button(frc::PS4Controller::Button::kCircle, loop);
}
Trigger CommandPS4Controller::Triangle(frc::EventLoop* loop) const {
return m_hid.Triangle(loop).CastTo<Trigger>();
return Button(frc::PS4Controller::Button::kTriangle, loop);
}
Trigger CommandPS4Controller::L1(frc::EventLoop* loop) const {
return m_hid.L1(loop).CastTo<Trigger>();
return Button(frc::PS4Controller::Button::kL1, loop);
}
Trigger CommandPS4Controller::R1(frc::EventLoop* loop) const {
return m_hid.R1(loop).CastTo<Trigger>();
return Button(frc::PS4Controller::Button::kR1, loop);
}
Trigger CommandPS4Controller::L2(frc::EventLoop* loop) const {
return m_hid.L2(loop).CastTo<Trigger>();
return Button(frc::PS4Controller::Button::kL2, loop);
}
Trigger CommandPS4Controller::R2(frc::EventLoop* loop) const {
return m_hid.R2(loop).CastTo<Trigger>();
return Button(frc::PS4Controller::Button::kR2, loop);
}
Trigger CommandPS4Controller::Share(frc::EventLoop* loop) const {
return m_hid.Share(loop).CastTo<Trigger>();
return Button(frc::PS4Controller::Button::kShare, loop);
}
Trigger CommandPS4Controller::Options(frc::EventLoop* loop) const {
return m_hid.Options(loop).CastTo<Trigger>();
return Button(frc::PS4Controller::Button::kOptions, loop);
}
Trigger CommandPS4Controller::L3(frc::EventLoop* loop) const {
return m_hid.L3(loop).CastTo<Trigger>();
return Button(frc::PS4Controller::Button::kL3, loop);
}
Trigger CommandPS4Controller::R3(frc::EventLoop* loop) const {
return m_hid.R3(loop).CastTo<Trigger>();
return Button(frc::PS4Controller::Button::kR3, loop);
}
Trigger CommandPS4Controller::PS(frc::EventLoop* loop) const {
return m_hid.PS(loop).CastTo<Trigger>();
return Button(frc::PS4Controller::Button::kPS, loop);
}
Trigger CommandPS4Controller::Touchpad(frc::EventLoop* loop) const {
return m_hid.Touchpad(loop).CastTo<Trigger>();
return Button(frc::PS4Controller::Button::kTouchpad, loop);
}
double CommandPS4Controller::GetLeftX() const {

View File

@@ -16,59 +16,59 @@ frc::PS5Controller& CommandPS5Controller::GetHID() {
}
Trigger CommandPS5Controller::Square(frc::EventLoop* loop) const {
return m_hid.Square(loop).CastTo<Trigger>();
return Button(frc::PS5Controller::Button::kSquare, loop);
}
Trigger CommandPS5Controller::Cross(frc::EventLoop* loop) const {
return m_hid.Cross(loop).CastTo<Trigger>();
return Button(frc::PS5Controller::Button::kCross, loop);
}
Trigger CommandPS5Controller::Circle(frc::EventLoop* loop) const {
return m_hid.Circle(loop).CastTo<Trigger>();
return Button(frc::PS5Controller::Button::kCircle, loop);
}
Trigger CommandPS5Controller::Triangle(frc::EventLoop* loop) const {
return m_hid.Triangle(loop).CastTo<Trigger>();
return Button(frc::PS5Controller::Button::kTriangle, loop);
}
Trigger CommandPS5Controller::L1(frc::EventLoop* loop) const {
return m_hid.L1(loop).CastTo<Trigger>();
return Button(frc::PS5Controller::Button::kL1, loop);
}
Trigger CommandPS5Controller::R1(frc::EventLoop* loop) const {
return m_hid.R1(loop).CastTo<Trigger>();
return Button(frc::PS5Controller::Button::kR1, loop);
}
Trigger CommandPS5Controller::L2(frc::EventLoop* loop) const {
return m_hid.L2(loop).CastTo<Trigger>();
return Button(frc::PS5Controller::Button::kL2, loop);
}
Trigger CommandPS5Controller::R2(frc::EventLoop* loop) const {
return m_hid.R2(loop).CastTo<Trigger>();
return Button(frc::PS5Controller::Button::kR2, loop);
}
Trigger CommandPS5Controller::Create(frc::EventLoop* loop) const {
return m_hid.Create(loop).CastTo<Trigger>();
return Button(frc::PS5Controller::Button::kCreate, loop);
}
Trigger CommandPS5Controller::Options(frc::EventLoop* loop) const {
return m_hid.Options(loop).CastTo<Trigger>();
return Button(frc::PS5Controller::Button::kOptions, loop);
}
Trigger CommandPS5Controller::L3(frc::EventLoop* loop) const {
return m_hid.L3(loop).CastTo<Trigger>();
return Button(frc::PS5Controller::Button::kL3, loop);
}
Trigger CommandPS5Controller::R3(frc::EventLoop* loop) const {
return m_hid.R3(loop).CastTo<Trigger>();
return Button(frc::PS5Controller::Button::kR3, loop);
}
Trigger CommandPS5Controller::PS(frc::EventLoop* loop) const {
return m_hid.PS(loop).CastTo<Trigger>();
return Button(frc::PS5Controller::Button::kPS, loop);
}
Trigger CommandPS5Controller::Touchpad(frc::EventLoop* loop) const {
return m_hid.Touchpad(loop).CastTo<Trigger>();
return Button(frc::PS5Controller::Button::kTouchpad, loop);
}
double CommandPS5Controller::GetLeftX() const {

View File

@@ -16,63 +16,63 @@ frc::StadiaController& CommandStadiaController::GetHID() {
}
Trigger CommandStadiaController::A(frc::EventLoop* loop) const {
return m_hid.A(loop).CastTo<Trigger>();
return Button(frc::StadiaController::Button::kA, loop);
}
Trigger CommandStadiaController::B(frc::EventLoop* loop) const {
return m_hid.B(loop).CastTo<Trigger>();
return Button(frc::StadiaController::Button::kB, loop);
}
Trigger CommandStadiaController::X(frc::EventLoop* loop) const {
return m_hid.X(loop).CastTo<Trigger>();
return Button(frc::StadiaController::Button::kX, loop);
}
Trigger CommandStadiaController::Y(frc::EventLoop* loop) const {
return m_hid.Y(loop).CastTo<Trigger>();
return Button(frc::StadiaController::Button::kY, loop);
}
Trigger CommandStadiaController::LeftBumper(frc::EventLoop* loop) const {
return m_hid.LeftBumper(loop).CastTo<Trigger>();
return Button(frc::StadiaController::Button::kLeftBumper, loop);
}
Trigger CommandStadiaController::RightBumper(frc::EventLoop* loop) const {
return m_hid.RightBumper(loop).CastTo<Trigger>();
return Button(frc::StadiaController::Button::kRightBumper, loop);
}
Trigger CommandStadiaController::LeftStick(frc::EventLoop* loop) const {
return m_hid.LeftStick(loop).CastTo<Trigger>();
return Button(frc::StadiaController::Button::kLeftStick, loop);
}
Trigger CommandStadiaController::RightStick(frc::EventLoop* loop) const {
return m_hid.RightStick(loop).CastTo<Trigger>();
return Button(frc::StadiaController::Button::kRightStick, loop);
}
Trigger CommandStadiaController::Ellipses(frc::EventLoop* loop) const {
return m_hid.Ellipses(loop).CastTo<Trigger>();
return Button(frc::StadiaController::Button::kEllipses, loop);
}
Trigger CommandStadiaController::Hamburger(frc::EventLoop* loop) const {
return m_hid.Hamburger(loop).CastTo<Trigger>();
return Button(frc::StadiaController::Button::kHamburger, loop);
}
Trigger CommandStadiaController::Stadia(frc::EventLoop* loop) const {
return m_hid.Stadia(loop).CastTo<Trigger>();
return Button(frc::StadiaController::Button::kStadia, loop);
}
Trigger CommandStadiaController::RightTrigger(frc::EventLoop* loop) const {
return m_hid.RightTrigger(loop).CastTo<Trigger>();
return Button(frc::StadiaController::Button::kRightTrigger, loop);
}
Trigger CommandStadiaController::LeftTrigger(frc::EventLoop* loop) const {
return m_hid.LeftTrigger(loop).CastTo<Trigger>();
return Button(frc::StadiaController::Button::kLeftTrigger, loop);
}
Trigger CommandStadiaController::Google(frc::EventLoop* loop) const {
return m_hid.Google(loop).CastTo<Trigger>();
return Button(frc::StadiaController::Button::kGoogle, loop);
}
Trigger CommandStadiaController::Frame(frc::EventLoop* loop) const {
return m_hid.Frame(loop).CastTo<Trigger>();
return Button(frc::StadiaController::Button::kFrame, loop);
}
double CommandStadiaController::GetLeftX() const {

View File

@@ -16,53 +16,57 @@ frc::XboxController& CommandXboxController::GetHID() {
}
Trigger CommandXboxController::A(frc::EventLoop* loop) const {
return m_hid.A(loop).CastTo<Trigger>();
return Button(frc::XboxController::Button::kA, loop);
}
Trigger CommandXboxController::B(frc::EventLoop* loop) const {
return m_hid.B(loop).CastTo<Trigger>();
return Button(frc::XboxController::Button::kB, loop);
}
Trigger CommandXboxController::X(frc::EventLoop* loop) const {
return m_hid.X(loop).CastTo<Trigger>();
return Button(frc::XboxController::Button::kX, loop);
}
Trigger CommandXboxController::Y(frc::EventLoop* loop) const {
return m_hid.Y(loop).CastTo<Trigger>();
return Button(frc::XboxController::Button::kY, loop);
}
Trigger CommandXboxController::LeftBumper(frc::EventLoop* loop) const {
return m_hid.LeftBumper(loop).CastTo<Trigger>();
return Button(frc::XboxController::Button::kLeftBumper, loop);
}
Trigger CommandXboxController::RightBumper(frc::EventLoop* loop) const {
return m_hid.RightBumper(loop).CastTo<Trigger>();
return Button(frc::XboxController::Button::kRightBumper, loop);
}
Trigger CommandXboxController::Back(frc::EventLoop* loop) const {
return m_hid.Back(loop).CastTo<Trigger>();
return Button(frc::XboxController::Button::kBack, loop);
}
Trigger CommandXboxController::Start(frc::EventLoop* loop) const {
return m_hid.Start(loop).CastTo<Trigger>();
return Button(frc::XboxController::Button::kStart, loop);
}
Trigger CommandXboxController::LeftStick(frc::EventLoop* loop) const {
return m_hid.LeftStick(loop).CastTo<Trigger>();
return Button(frc::XboxController::Button::kLeftStick, loop);
}
Trigger CommandXboxController::RightStick(frc::EventLoop* loop) const {
return m_hid.RightStick(loop).CastTo<Trigger>();
return Button(frc::XboxController::Button::kRightStick, loop);
}
Trigger CommandXboxController::LeftTrigger(double threshold,
frc::EventLoop* loop) const {
return m_hid.LeftTrigger(threshold, loop).CastTo<Trigger>();
return Trigger(loop, [this, threshold] {
return m_hid.GetLeftTriggerAxis() > threshold;
});
}
Trigger CommandXboxController::RightTrigger(double threshold,
frc::EventLoop* loop) const {
return m_hid.RightTrigger(threshold, loop).CastTo<Trigger>();
return Trigger(loop, [this, threshold] {
return m_hid.GetRightTriggerAxis() > threshold;
});
}
double CommandXboxController::GetLeftX() const {

View File

@@ -4,9 +4,12 @@
package edu.wpi.first.wpilibj2.command.button;
import edu.wpi.first.math.Pair;
import edu.wpi.first.wpilibj.GenericHID;
import edu.wpi.first.wpilibj.event.EventLoop;
import edu.wpi.first.wpilibj2.command.CommandScheduler;
import java.util.HashMap;
import java.util.Map;
/**
* A version of {@link GenericHID} with {@link Trigger} factories for command-based.
@@ -15,6 +18,12 @@ import edu.wpi.first.wpilibj2.command.CommandScheduler;
*/
public class CommandGenericHID {
private final GenericHID m_hid;
private final Map<EventLoop, Map<Integer, Trigger>> m_buttonCache = new HashMap<>();
private final Map<EventLoop, Map<Pair<Integer, Double>, Trigger>> m_axisLessThanCache =
new HashMap<>();
private final Map<EventLoop, Map<Pair<Integer, Double>, Trigger>> m_axisGreaterThanCache =
new HashMap<>();
private final Map<EventLoop, Map<Integer, Trigger>> m_povCache = new HashMap<>();
/**
* Construct an instance of a device.
@@ -43,7 +52,7 @@ public class CommandGenericHID {
* @see #button(int, EventLoop)
*/
public Trigger button(int button) {
return this.button(button, CommandScheduler.getInstance().getDefaultButtonLoop());
return button(button, CommandScheduler.getInstance().getDefaultButtonLoop());
}
/**
@@ -54,7 +63,8 @@ public class CommandGenericHID {
* @return an event instance representing the button's digital signal attached to the given loop.
*/
public Trigger button(int button, EventLoop loop) {
return new Trigger(loop, () -> m_hid.getRawButton(button));
var cache = m_buttonCache.computeIfAbsent(loop, k -> new HashMap<>());
return cache.computeIfAbsent(button, k -> new Trigger(loop, () -> m_hid.getRawButton(k)));
}
/**
@@ -85,7 +95,10 @@ public class CommandGenericHID {
* @return a Trigger instance based around this angle of a POV on the HID.
*/
public Trigger pov(int pov, int angle, EventLoop loop) {
return new Trigger(loop, () -> m_hid.getPOV(pov) == angle);
var cache = m_povCache.computeIfAbsent(loop, k -> new HashMap<>());
// angle can be -1, so use 3600 instead of 360
return cache.computeIfAbsent(
pov * 3600 + angle, k -> new Trigger(loop, () -> m_hid.getPOV(pov) == angle));
}
/**
@@ -212,7 +225,9 @@ public class CommandGenericHID {
* threshold.
*/
public Trigger axisLessThan(int axis, double threshold, EventLoop loop) {
return m_hid.axisLessThan(axis, threshold, loop).castTo(Trigger::new);
var cache = m_axisLessThanCache.computeIfAbsent(loop, k -> new HashMap<>());
return cache.computeIfAbsent(
Pair.of(axis, threshold), k -> new Trigger(loop, () -> getRawAxis(axis) < threshold));
}
/**
@@ -240,7 +255,9 @@ public class CommandGenericHID {
* threshold.
*/
public Trigger axisGreaterThan(int axis, double threshold, EventLoop loop) {
return m_hid.axisGreaterThan(axis, threshold, loop).castTo(Trigger::new);
var cache = m_axisGreaterThanCache.computeIfAbsent(loop, k -> new HashMap<>());
return cache.computeIfAbsent(
Pair.of(axis, threshold), k -> new Trigger(loop, () -> getRawAxis(axis) > threshold));
}
/**

View File

@@ -55,7 +55,7 @@ public class CommandJoystick extends CommandGenericHID {
* given loop.
*/
public Trigger trigger(EventLoop loop) {
return m_hid.trigger(loop).castTo(Trigger::new);
return button(Joystick.ButtonType.kTrigger.value, loop);
}
/**
@@ -77,7 +77,7 @@ public class CommandJoystick extends CommandGenericHID {
* loop.
*/
public Trigger top(EventLoop loop) {
return m_hid.top(loop).castTo(Trigger::new);
return button(Joystick.ButtonType.kTop.value, loop);
}
/**

View File

@@ -13,7 +13,7 @@ frc::GenericHID& CommandGenericHID::GetHID() {
}
Trigger CommandGenericHID::Button(int button, frc::EventLoop* loop) const {
return m_hid.Button(button, loop).CastTo<Trigger>();
return Trigger(loop, [this, button] { return m_hid.GetRawButton(button); });
}
Trigger CommandGenericHID::POV(int angle, frc::EventLoop* loop) const {

View File

@@ -14,11 +14,11 @@ frc::Joystick& CommandJoystick::GetHID() {
}
Trigger CommandJoystick::Trigger(frc::EventLoop* loop) const {
return m_hid.Trigger(loop).CastTo<class Trigger>();
return Button(frc::Joystick::ButtonType::kTriggerButton, loop);
}
Trigger CommandJoystick::Top(frc::EventLoop* loop) const {
return m_hid.Top(loop).CastTo<class Trigger>();
return Button(frc::Joystick::ButtonType::kTopButton, loop);
}
double CommandJoystick::GetMagnitude() const {

View File

@@ -133,7 +133,7 @@ public class {{ ConsoleName }}Controller extends GenericHID implements Sendable
* threshold, attached to the given event loop
*/
public BooleanEvent {{ trigger.name }}(double threshold, EventLoop loop) {
return new BooleanEvent(loop, () -> get{{ capitalize_first(trigger.name) }}Axis() > threshold);
return axisGreaterThan(Axis.k{{ capitalize_first(trigger.name) }}.value, threshold, loop);
}
/**
@@ -185,7 +185,7 @@ public class {{ ConsoleName }}Controller extends GenericHID implements Sendable
* attached to the given loop.
*/
public BooleanEvent {{ button.name }}(EventLoop loop) {
return new BooleanEvent(loop, this::get{{ capitalize_first(button.name) }}Button);
return button(Button.k{{ capitalize_first(button.name) }}.value, loop);
}
{% endfor -%}
{% if ConsoleName == "Xbox" or ConsoleName == "Stadia" %}

View File

@@ -219,7 +219,7 @@ public class PS4Controller extends GenericHID implements Sendable {
* attached to the given loop.
*/
public BooleanEvent square(EventLoop loop) {
return new BooleanEvent(loop, this::getSquareButton);
return button(Button.kSquare.value, loop);
}
/**
@@ -257,7 +257,7 @@ public class PS4Controller extends GenericHID implements Sendable {
* attached to the given loop.
*/
public BooleanEvent cross(EventLoop loop) {
return new BooleanEvent(loop, this::getCrossButton);
return button(Button.kCross.value, loop);
}
/**
@@ -295,7 +295,7 @@ public class PS4Controller extends GenericHID implements Sendable {
* attached to the given loop.
*/
public BooleanEvent circle(EventLoop loop) {
return new BooleanEvent(loop, this::getCircleButton);
return button(Button.kCircle.value, loop);
}
/**
@@ -333,7 +333,7 @@ public class PS4Controller extends GenericHID implements Sendable {
* attached to the given loop.
*/
public BooleanEvent triangle(EventLoop loop) {
return new BooleanEvent(loop, this::getTriangleButton);
return button(Button.kTriangle.value, loop);
}
/**
@@ -371,7 +371,7 @@ public class PS4Controller extends GenericHID implements Sendable {
* attached to the given loop.
*/
public BooleanEvent L1(EventLoop loop) {
return new BooleanEvent(loop, this::getL1Button);
return button(Button.kL1.value, loop);
}
/**
@@ -409,7 +409,7 @@ public class PS4Controller extends GenericHID implements Sendable {
* attached to the given loop.
*/
public BooleanEvent R1(EventLoop loop) {
return new BooleanEvent(loop, this::getR1Button);
return button(Button.kR1.value, loop);
}
/**
@@ -447,7 +447,7 @@ public class PS4Controller extends GenericHID implements Sendable {
* attached to the given loop.
*/
public BooleanEvent L2(EventLoop loop) {
return new BooleanEvent(loop, this::getL2Button);
return button(Button.kL2.value, loop);
}
/**
@@ -485,7 +485,7 @@ public class PS4Controller extends GenericHID implements Sendable {
* attached to the given loop.
*/
public BooleanEvent R2(EventLoop loop) {
return new BooleanEvent(loop, this::getR2Button);
return button(Button.kR2.value, loop);
}
/**
@@ -523,7 +523,7 @@ public class PS4Controller extends GenericHID implements Sendable {
* attached to the given loop.
*/
public BooleanEvent share(EventLoop loop) {
return new BooleanEvent(loop, this::getShareButton);
return button(Button.kShare.value, loop);
}
/**
@@ -561,7 +561,7 @@ public class PS4Controller extends GenericHID implements Sendable {
* attached to the given loop.
*/
public BooleanEvent options(EventLoop loop) {
return new BooleanEvent(loop, this::getOptionsButton);
return button(Button.kOptions.value, loop);
}
/**
@@ -599,7 +599,7 @@ public class PS4Controller extends GenericHID implements Sendable {
* attached to the given loop.
*/
public BooleanEvent L3(EventLoop loop) {
return new BooleanEvent(loop, this::getL3Button);
return button(Button.kL3.value, loop);
}
/**
@@ -637,7 +637,7 @@ public class PS4Controller extends GenericHID implements Sendable {
* attached to the given loop.
*/
public BooleanEvent R3(EventLoop loop) {
return new BooleanEvent(loop, this::getR3Button);
return button(Button.kR3.value, loop);
}
/**
@@ -675,7 +675,7 @@ public class PS4Controller extends GenericHID implements Sendable {
* attached to the given loop.
*/
public BooleanEvent PS(EventLoop loop) {
return new BooleanEvent(loop, this::getPSButton);
return button(Button.kPS.value, loop);
}
/**
@@ -713,7 +713,7 @@ public class PS4Controller extends GenericHID implements Sendable {
* attached to the given loop.
*/
public BooleanEvent touchpad(EventLoop loop) {
return new BooleanEvent(loop, this::getTouchpadButton);
return button(Button.kTouchpad.value, loop);
}
/**

View File

@@ -219,7 +219,7 @@ public class PS5Controller extends GenericHID implements Sendable {
* attached to the given loop.
*/
public BooleanEvent square(EventLoop loop) {
return new BooleanEvent(loop, this::getSquareButton);
return button(Button.kSquare.value, loop);
}
/**
@@ -257,7 +257,7 @@ public class PS5Controller extends GenericHID implements Sendable {
* attached to the given loop.
*/
public BooleanEvent cross(EventLoop loop) {
return new BooleanEvent(loop, this::getCrossButton);
return button(Button.kCross.value, loop);
}
/**
@@ -295,7 +295,7 @@ public class PS5Controller extends GenericHID implements Sendable {
* attached to the given loop.
*/
public BooleanEvent circle(EventLoop loop) {
return new BooleanEvent(loop, this::getCircleButton);
return button(Button.kCircle.value, loop);
}
/**
@@ -333,7 +333,7 @@ public class PS5Controller extends GenericHID implements Sendable {
* attached to the given loop.
*/
public BooleanEvent triangle(EventLoop loop) {
return new BooleanEvent(loop, this::getTriangleButton);
return button(Button.kTriangle.value, loop);
}
/**
@@ -371,7 +371,7 @@ public class PS5Controller extends GenericHID implements Sendable {
* attached to the given loop.
*/
public BooleanEvent L1(EventLoop loop) {
return new BooleanEvent(loop, this::getL1Button);
return button(Button.kL1.value, loop);
}
/**
@@ -409,7 +409,7 @@ public class PS5Controller extends GenericHID implements Sendable {
* attached to the given loop.
*/
public BooleanEvent R1(EventLoop loop) {
return new BooleanEvent(loop, this::getR1Button);
return button(Button.kR1.value, loop);
}
/**
@@ -447,7 +447,7 @@ public class PS5Controller extends GenericHID implements Sendable {
* attached to the given loop.
*/
public BooleanEvent L2(EventLoop loop) {
return new BooleanEvent(loop, this::getL2Button);
return button(Button.kL2.value, loop);
}
/**
@@ -485,7 +485,7 @@ public class PS5Controller extends GenericHID implements Sendable {
* attached to the given loop.
*/
public BooleanEvent R2(EventLoop loop) {
return new BooleanEvent(loop, this::getR2Button);
return button(Button.kR2.value, loop);
}
/**
@@ -523,7 +523,7 @@ public class PS5Controller extends GenericHID implements Sendable {
* attached to the given loop.
*/
public BooleanEvent create(EventLoop loop) {
return new BooleanEvent(loop, this::getCreateButton);
return button(Button.kCreate.value, loop);
}
/**
@@ -561,7 +561,7 @@ public class PS5Controller extends GenericHID implements Sendable {
* attached to the given loop.
*/
public BooleanEvent options(EventLoop loop) {
return new BooleanEvent(loop, this::getOptionsButton);
return button(Button.kOptions.value, loop);
}
/**
@@ -599,7 +599,7 @@ public class PS5Controller extends GenericHID implements Sendable {
* attached to the given loop.
*/
public BooleanEvent L3(EventLoop loop) {
return new BooleanEvent(loop, this::getL3Button);
return button(Button.kL3.value, loop);
}
/**
@@ -637,7 +637,7 @@ public class PS5Controller extends GenericHID implements Sendable {
* attached to the given loop.
*/
public BooleanEvent R3(EventLoop loop) {
return new BooleanEvent(loop, this::getR3Button);
return button(Button.kR3.value, loop);
}
/**
@@ -675,7 +675,7 @@ public class PS5Controller extends GenericHID implements Sendable {
* attached to the given loop.
*/
public BooleanEvent PS(EventLoop loop) {
return new BooleanEvent(loop, this::getPSButton);
return button(Button.kPS.value, loop);
}
/**
@@ -713,7 +713,7 @@ public class PS5Controller extends GenericHID implements Sendable {
* attached to the given loop.
*/
public BooleanEvent touchpad(EventLoop loop) {
return new BooleanEvent(loop, this::getTouchpadButton);
return button(Button.kTouchpad.value, loop);
}
/**

View File

@@ -197,7 +197,7 @@ public class StadiaController extends GenericHID implements Sendable {
* attached to the given loop.
*/
public BooleanEvent a(EventLoop loop) {
return new BooleanEvent(loop, this::getAButton);
return button(Button.kA.value, loop);
}
/**
@@ -235,7 +235,7 @@ public class StadiaController extends GenericHID implements Sendable {
* attached to the given loop.
*/
public BooleanEvent b(EventLoop loop) {
return new BooleanEvent(loop, this::getBButton);
return button(Button.kB.value, loop);
}
/**
@@ -273,7 +273,7 @@ public class StadiaController extends GenericHID implements Sendable {
* attached to the given loop.
*/
public BooleanEvent x(EventLoop loop) {
return new BooleanEvent(loop, this::getXButton);
return button(Button.kX.value, loop);
}
/**
@@ -311,7 +311,7 @@ public class StadiaController extends GenericHID implements Sendable {
* attached to the given loop.
*/
public BooleanEvent y(EventLoop loop) {
return new BooleanEvent(loop, this::getYButton);
return button(Button.kY.value, loop);
}
/**
@@ -349,7 +349,7 @@ public class StadiaController extends GenericHID implements Sendable {
* attached to the given loop.
*/
public BooleanEvent leftBumper(EventLoop loop) {
return new BooleanEvent(loop, this::getLeftBumperButton);
return button(Button.kLeftBumper.value, loop);
}
/**
@@ -387,7 +387,7 @@ public class StadiaController extends GenericHID implements Sendable {
* attached to the given loop.
*/
public BooleanEvent rightBumper(EventLoop loop) {
return new BooleanEvent(loop, this::getRightBumperButton);
return button(Button.kRightBumper.value, loop);
}
/**
@@ -425,7 +425,7 @@ public class StadiaController extends GenericHID implements Sendable {
* attached to the given loop.
*/
public BooleanEvent leftStick(EventLoop loop) {
return new BooleanEvent(loop, this::getLeftStickButton);
return button(Button.kLeftStick.value, loop);
}
/**
@@ -463,7 +463,7 @@ public class StadiaController extends GenericHID implements Sendable {
* attached to the given loop.
*/
public BooleanEvent rightStick(EventLoop loop) {
return new BooleanEvent(loop, this::getRightStickButton);
return button(Button.kRightStick.value, loop);
}
/**
@@ -501,7 +501,7 @@ public class StadiaController extends GenericHID implements Sendable {
* attached to the given loop.
*/
public BooleanEvent ellipses(EventLoop loop) {
return new BooleanEvent(loop, this::getEllipsesButton);
return button(Button.kEllipses.value, loop);
}
/**
@@ -539,7 +539,7 @@ public class StadiaController extends GenericHID implements Sendable {
* attached to the given loop.
*/
public BooleanEvent hamburger(EventLoop loop) {
return new BooleanEvent(loop, this::getHamburgerButton);
return button(Button.kHamburger.value, loop);
}
/**
@@ -577,7 +577,7 @@ public class StadiaController extends GenericHID implements Sendable {
* attached to the given loop.
*/
public BooleanEvent stadia(EventLoop loop) {
return new BooleanEvent(loop, this::getStadiaButton);
return button(Button.kStadia.value, loop);
}
/**
@@ -615,7 +615,7 @@ public class StadiaController extends GenericHID implements Sendable {
* attached to the given loop.
*/
public BooleanEvent rightTrigger(EventLoop loop) {
return new BooleanEvent(loop, this::getRightTriggerButton);
return button(Button.kRightTrigger.value, loop);
}
/**
@@ -653,7 +653,7 @@ public class StadiaController extends GenericHID implements Sendable {
* attached to the given loop.
*/
public BooleanEvent leftTrigger(EventLoop loop) {
return new BooleanEvent(loop, this::getLeftTriggerButton);
return button(Button.kLeftTrigger.value, loop);
}
/**
@@ -691,7 +691,7 @@ public class StadiaController extends GenericHID implements Sendable {
* attached to the given loop.
*/
public BooleanEvent google(EventLoop loop) {
return new BooleanEvent(loop, this::getGoogleButton);
return button(Button.kGoogle.value, loop);
}
/**
@@ -729,7 +729,7 @@ public class StadiaController extends GenericHID implements Sendable {
* attached to the given loop.
*/
public BooleanEvent frame(EventLoop loop) {
return new BooleanEvent(loop, this::getFrameButton);
return button(Button.kFrame.value, loop);
}
/**

View File

@@ -177,7 +177,7 @@ public class XboxController extends GenericHID implements Sendable {
* threshold, attached to the given event loop
*/
public BooleanEvent leftTrigger(double threshold, EventLoop loop) {
return new BooleanEvent(loop, () -> getLeftTriggerAxis() > threshold);
return axisGreaterThan(Axis.kLeftTrigger.value, threshold, loop);
}
/**
@@ -213,7 +213,7 @@ public class XboxController extends GenericHID implements Sendable {
* threshold, attached to the given event loop
*/
public BooleanEvent rightTrigger(double threshold, EventLoop loop) {
return new BooleanEvent(loop, () -> getRightTriggerAxis() > threshold);
return axisGreaterThan(Axis.kRightTrigger.value, threshold, loop);
}
/**
@@ -263,7 +263,7 @@ public class XboxController extends GenericHID implements Sendable {
* attached to the given loop.
*/
public BooleanEvent a(EventLoop loop) {
return new BooleanEvent(loop, this::getAButton);
return button(Button.kA.value, loop);
}
/**
@@ -301,7 +301,7 @@ public class XboxController extends GenericHID implements Sendable {
* attached to the given loop.
*/
public BooleanEvent b(EventLoop loop) {
return new BooleanEvent(loop, this::getBButton);
return button(Button.kB.value, loop);
}
/**
@@ -339,7 +339,7 @@ public class XboxController extends GenericHID implements Sendable {
* attached to the given loop.
*/
public BooleanEvent x(EventLoop loop) {
return new BooleanEvent(loop, this::getXButton);
return button(Button.kX.value, loop);
}
/**
@@ -377,7 +377,7 @@ public class XboxController extends GenericHID implements Sendable {
* attached to the given loop.
*/
public BooleanEvent y(EventLoop loop) {
return new BooleanEvent(loop, this::getYButton);
return button(Button.kY.value, loop);
}
/**
@@ -415,7 +415,7 @@ public class XboxController extends GenericHID implements Sendable {
* attached to the given loop.
*/
public BooleanEvent leftBumper(EventLoop loop) {
return new BooleanEvent(loop, this::getLeftBumperButton);
return button(Button.kLeftBumper.value, loop);
}
/**
@@ -453,7 +453,7 @@ public class XboxController extends GenericHID implements Sendable {
* attached to the given loop.
*/
public BooleanEvent rightBumper(EventLoop loop) {
return new BooleanEvent(loop, this::getRightBumperButton);
return button(Button.kRightBumper.value, loop);
}
/**
@@ -491,7 +491,7 @@ public class XboxController extends GenericHID implements Sendable {
* attached to the given loop.
*/
public BooleanEvent back(EventLoop loop) {
return new BooleanEvent(loop, this::getBackButton);
return button(Button.kBack.value, loop);
}
/**
@@ -529,7 +529,7 @@ public class XboxController extends GenericHID implements Sendable {
* attached to the given loop.
*/
public BooleanEvent start(EventLoop loop) {
return new BooleanEvent(loop, this::getStartButton);
return button(Button.kStart.value, loop);
}
/**
@@ -567,7 +567,7 @@ public class XboxController extends GenericHID implements Sendable {
* attached to the given loop.
*/
public BooleanEvent leftStick(EventLoop loop) {
return new BooleanEvent(loop, this::getLeftStickButton);
return button(Button.kLeftStick.value, loop);
}
/**
@@ -605,7 +605,7 @@ public class XboxController extends GenericHID implements Sendable {
* attached to the given loop.
*/
public BooleanEvent rightStick(EventLoop loop) {
return new BooleanEvent(loop, this::getRightStickButton);
return button(Button.kRightStick.value, loop);
}
/**

View File

@@ -6,6 +6,7 @@ package edu.wpi.first.wpilibj;
import edu.wpi.first.hal.DriverStationJNI;
import edu.wpi.first.math.MathUtil;
import edu.wpi.first.math.Pair;
import edu.wpi.first.wpilibj.event.BooleanEvent;
import edu.wpi.first.wpilibj.event.EventLoop;
import java.util.HashMap;
@@ -97,6 +98,12 @@ public class GenericHID {
private int m_outputs;
private int m_leftRumble;
private int m_rightRumble;
private final Map<EventLoop, Map<Integer, BooleanEvent>> m_buttonCache = new HashMap<>();
private final Map<EventLoop, Map<Pair<Integer, Double>, BooleanEvent>> m_axisLessThanCache =
new HashMap<>();
private final Map<EventLoop, Map<Pair<Integer, Double>, BooleanEvent>> m_axisGreaterThanCache =
new HashMap<>();
private final Map<EventLoop, Map<Integer, BooleanEvent>> m_povCache = new HashMap<>();
/**
* Construct an instance of a device.
@@ -159,7 +166,10 @@ public class GenericHID {
* @return an event instance representing the button's digital signal attached to the given loop.
*/
public BooleanEvent button(int button, EventLoop loop) {
return new BooleanEvent(loop, () -> getRawButton(button));
synchronized (m_buttonCache) {
var cache = m_buttonCache.computeIfAbsent(loop, k -> new HashMap<>());
return cache.computeIfAbsent(button, k -> new BooleanEvent(loop, () -> getRawButton(k)));
}
}
/**
@@ -223,7 +233,12 @@ public class GenericHID {
* @return a BooleanEvent instance based around this angle of a POV on the HID.
*/
public BooleanEvent pov(int pov, int angle, EventLoop loop) {
return new BooleanEvent(loop, () -> getPOV(pov) == angle);
synchronized (m_povCache) {
var cache = m_povCache.computeIfAbsent(loop, k -> new HashMap<>());
// angle can be -1, so use 3600 instead of 360
return cache.computeIfAbsent(
pov * 3600 + angle, k -> new BooleanEvent(loop, () -> getPOV(pov) == angle));
}
}
/**
@@ -335,7 +350,12 @@ public class GenericHID {
* @return an event instance that is true when the axis value is less than the provided threshold.
*/
public BooleanEvent axisLessThan(int axis, double threshold, EventLoop loop) {
return new BooleanEvent(loop, () -> getRawAxis(axis) < threshold);
synchronized (m_axisLessThanCache) {
var cache = m_axisLessThanCache.computeIfAbsent(loop, k -> new HashMap<>());
return cache.computeIfAbsent(
Pair.of(axis, threshold),
k -> new BooleanEvent(loop, () -> getRawAxis(axis) < threshold));
}
}
/**
@@ -349,7 +369,12 @@ public class GenericHID {
* threshold.
*/
public BooleanEvent axisGreaterThan(int axis, double threshold, EventLoop loop) {
return new BooleanEvent(loop, () -> getRawAxis(axis) > threshold);
synchronized (m_axisGreaterThanCache) {
var cache = m_axisGreaterThanCache.computeIfAbsent(loop, k -> new HashMap<>());
return cache.computeIfAbsent(
Pair.of(axis, threshold),
k -> new BooleanEvent(loop, () -> getRawAxis(axis) > threshold));
}
}
/**

View File

@@ -261,7 +261,7 @@ public class Joystick extends GenericHID {
* given loop.
*/
public BooleanEvent trigger(EventLoop loop) {
return new BooleanEvent(loop, this::getTrigger);
return button(ButtonType.kTrigger.value, loop);
}
/**
@@ -299,7 +299,7 @@ public class Joystick extends GenericHID {
* loop.
*/
public BooleanEvent top(EventLoop loop) {
return new BooleanEvent(loop, this::getTop);
return button(ButtonType.kTop.value, loop);
}
/**