001// Copyright (c) FIRST and other WPILib contributors. 002// Open Source Software; you can modify and/or share it under the terms of 003// the WPILib BSD license file in the root directory of this project. 004 005// THIS FILE WAS AUTO-GENERATED BY ./wpilibj/generate_hids.py. DO NOT MODIFY 006 007package edu.wpi.first.wpilibj; 008 009// import edu.wpi.first.hal.FRCNetComm.tResourceType; 010// import edu.wpi.first.hal.HAL; 011import edu.wpi.first.util.sendable.Sendable; 012import edu.wpi.first.util.sendable.SendableBuilder; 013import edu.wpi.first.wpilibj.event.BooleanEvent; 014import edu.wpi.first.wpilibj.event.EventLoop; 015 016/** 017 * Handle input from Stadia controllers connected to the Driver Station. 018 * 019 * <p>This class handles Stadia input that comes from the Driver Station. Each time a value is 020 * requested the most recent value is returned. There is a single class instance for each controller 021 * and the mapping of ports to hardware buttons depends on the code in the Driver Station. 022 * 023 * <p>Only first party controllers from Google are guaranteed to have the correct mapping, and 024 * only through the official NI DS. Sim is not guaranteed to have the same mapping, as well as any 025 * 3rd party controllers. 026 */ 027public class StadiaController extends GenericHID implements Sendable { 028 /** Represents a digital button on a StadiaController. */ 029 public enum Button { 030 /** A button. */ 031 kA(1), 032 /** B button. */ 033 kB(2), 034 /** X button. */ 035 kX(3), 036 /** Y button. */ 037 kY(4), 038 /** Left bumper button. */ 039 kLeftBumper(5), 040 /** Right bumper button. */ 041 kRightBumper(6), 042 /** Left stick button. */ 043 kLeftStick(7), 044 /** Right stick button. */ 045 kRightStick(8), 046 /** Ellipses button. */ 047 kEllipses(9), 048 /** Hamburger button. */ 049 kHamburger(10), 050 /** Stadia button. */ 051 kStadia(11), 052 /** Right trigger button. */ 053 kRightTrigger(12), 054 /** Left trigger button. */ 055 kLeftTrigger(13), 056 /** Google button. */ 057 kGoogle(14), 058 /** Frame button. */ 059 kFrame(15); 060 061 /** Button value. */ 062 public final int value; 063 064 Button(int value) { 065 this.value = value; 066 } 067 068 /** 069 * Get the human-friendly name of the button, matching the relevant methods. This is done by 070 * stripping the leading `k`, and appending `Button`. 071 * 072 * <p>Primarily used for automated unit tests. 073 * 074 * @return the human-friendly name of the button. 075 */ 076 @Override 077 public String toString() { 078 // Remove leading `k` 079 return this.name().substring(1) + "Button"; 080 } 081 } 082 083 /** Represents an axis on an StadiaController. */ 084 public enum Axis { 085 /** Left X axis. */ 086 kLeftX(0), 087 /** Right X axis. */ 088 kRightX(3), 089 /** Left Y axis. */ 090 kLeftY(1), 091 /** Right Y axis. */ 092 kRightY(4); 093 094 /** Axis value. */ 095 public final int value; 096 097 Axis(int value) { 098 this.value = value; 099 } 100 101 /** 102 * Get the human-friendly name of the axis, matching the relevant methods. This is done by 103 * stripping the leading `k`, and appending `Axis` if the name ends with `Trigger`. 104 * 105 * <p>Primarily used for automated unit tests. 106 * 107 * @return the human-friendly name of the axis. 108 */ 109 @Override 110 public String toString() { 111 var name = this.name().substring(1); // Remove leading `k` 112 if (name.endsWith("Trigger")) { 113 return name + "Axis"; 114 } 115 return name; 116 } 117 } 118 119 /** 120 * Construct an instance of a controller. 121 * 122 * @param port The port index on the Driver Station that the controller is plugged into (0-5). 123 */ 124 public StadiaController(final int port) { 125 super(port); 126 // HAL.report(tResourceType.kResourceType_StadiaController, port + 1); 127 } 128 129 /** 130 * Get the X axis value of left side of the controller. Right is positive. 131 * 132 * @return The axis value. 133 */ 134 public double getLeftX() { 135 return getRawAxis(Axis.kLeftX.value); 136 } 137 138 /** 139 * Get the X axis value of right side of the controller. Right is positive. 140 * 141 * @return The axis value. 142 */ 143 public double getRightX() { 144 return getRawAxis(Axis.kRightX.value); 145 } 146 147 /** 148 * Get the Y axis value of left side of the controller. Back is positive. 149 * 150 * @return The axis value. 151 */ 152 public double getLeftY() { 153 return getRawAxis(Axis.kLeftY.value); 154 } 155 156 /** 157 * Get the Y axis value of right side of the controller. Back is positive. 158 * 159 * @return The axis value. 160 */ 161 public double getRightY() { 162 return getRawAxis(Axis.kRightY.value); 163 } 164 165 /** 166 * Read the value of the A button on the controller. 167 * 168 * @return The state of the button. 169 */ 170 public boolean getAButton() { 171 return getRawButton(Button.kA.value); 172 } 173 174 /** 175 * Whether the A button was pressed since the last check. 176 * 177 * @return Whether the button was pressed since the last check. 178 */ 179 public boolean getAButtonPressed() { 180 return getRawButtonPressed(Button.kA.value); 181 } 182 183 /** 184 * Whether the A button was released since the last check. 185 * 186 * @return Whether the button was released since the last check. 187 */ 188 public boolean getAButtonReleased() { 189 return getRawButtonReleased(Button.kA.value); 190 } 191 192 /** 193 * Constructs an event instance around the A button's digital signal. 194 * 195 * @param loop the event loop instance to attach the event to. 196 * @return an event instance representing the A button's digital signal 197 * attached to the given loop. 198 */ 199 public BooleanEvent a(EventLoop loop) { 200 return button(Button.kA.value, loop); 201 } 202 203 /** 204 * Read the value of the B button on the controller. 205 * 206 * @return The state of the button. 207 */ 208 public boolean getBButton() { 209 return getRawButton(Button.kB.value); 210 } 211 212 /** 213 * Whether the B button was pressed since the last check. 214 * 215 * @return Whether the button was pressed since the last check. 216 */ 217 public boolean getBButtonPressed() { 218 return getRawButtonPressed(Button.kB.value); 219 } 220 221 /** 222 * Whether the B button was released since the last check. 223 * 224 * @return Whether the button was released since the last check. 225 */ 226 public boolean getBButtonReleased() { 227 return getRawButtonReleased(Button.kB.value); 228 } 229 230 /** 231 * Constructs an event instance around the B button's digital signal. 232 * 233 * @param loop the event loop instance to attach the event to. 234 * @return an event instance representing the B button's digital signal 235 * attached to the given loop. 236 */ 237 public BooleanEvent b(EventLoop loop) { 238 return button(Button.kB.value, loop); 239 } 240 241 /** 242 * Read the value of the X button on the controller. 243 * 244 * @return The state of the button. 245 */ 246 public boolean getXButton() { 247 return getRawButton(Button.kX.value); 248 } 249 250 /** 251 * Whether the X button was pressed since the last check. 252 * 253 * @return Whether the button was pressed since the last check. 254 */ 255 public boolean getXButtonPressed() { 256 return getRawButtonPressed(Button.kX.value); 257 } 258 259 /** 260 * Whether the X button was released since the last check. 261 * 262 * @return Whether the button was released since the last check. 263 */ 264 public boolean getXButtonReleased() { 265 return getRawButtonReleased(Button.kX.value); 266 } 267 268 /** 269 * Constructs an event instance around the X button's digital signal. 270 * 271 * @param loop the event loop instance to attach the event to. 272 * @return an event instance representing the X button's digital signal 273 * attached to the given loop. 274 */ 275 public BooleanEvent x(EventLoop loop) { 276 return button(Button.kX.value, loop); 277 } 278 279 /** 280 * Read the value of the Y button on the controller. 281 * 282 * @return The state of the button. 283 */ 284 public boolean getYButton() { 285 return getRawButton(Button.kY.value); 286 } 287 288 /** 289 * Whether the Y button was pressed since the last check. 290 * 291 * @return Whether the button was pressed since the last check. 292 */ 293 public boolean getYButtonPressed() { 294 return getRawButtonPressed(Button.kY.value); 295 } 296 297 /** 298 * Whether the Y button was released since the last check. 299 * 300 * @return Whether the button was released since the last check. 301 */ 302 public boolean getYButtonReleased() { 303 return getRawButtonReleased(Button.kY.value); 304 } 305 306 /** 307 * Constructs an event instance around the Y button's digital signal. 308 * 309 * @param loop the event loop instance to attach the event to. 310 * @return an event instance representing the Y button's digital signal 311 * attached to the given loop. 312 */ 313 public BooleanEvent y(EventLoop loop) { 314 return button(Button.kY.value, loop); 315 } 316 317 /** 318 * Read the value of the left bumper button on the controller. 319 * 320 * @return The state of the button. 321 */ 322 public boolean getLeftBumperButton() { 323 return getRawButton(Button.kLeftBumper.value); 324 } 325 326 /** 327 * Whether the left bumper button was pressed since the last check. 328 * 329 * @return Whether the button was pressed since the last check. 330 */ 331 public boolean getLeftBumperButtonPressed() { 332 return getRawButtonPressed(Button.kLeftBumper.value); 333 } 334 335 /** 336 * Whether the left bumper button was released since the last check. 337 * 338 * @return Whether the button was released since the last check. 339 */ 340 public boolean getLeftBumperButtonReleased() { 341 return getRawButtonReleased(Button.kLeftBumper.value); 342 } 343 344 /** 345 * Constructs an event instance around the left bumper button's digital signal. 346 * 347 * @param loop the event loop instance to attach the event to. 348 * @return an event instance representing the left bumper button's digital signal 349 * attached to the given loop. 350 */ 351 public BooleanEvent leftBumper(EventLoop loop) { 352 return button(Button.kLeftBumper.value, loop); 353 } 354 355 /** 356 * Read the value of the right bumper button on the controller. 357 * 358 * @return The state of the button. 359 */ 360 public boolean getRightBumperButton() { 361 return getRawButton(Button.kRightBumper.value); 362 } 363 364 /** 365 * Whether the right bumper button was pressed since the last check. 366 * 367 * @return Whether the button was pressed since the last check. 368 */ 369 public boolean getRightBumperButtonPressed() { 370 return getRawButtonPressed(Button.kRightBumper.value); 371 } 372 373 /** 374 * Whether the right bumper button was released since the last check. 375 * 376 * @return Whether the button was released since the last check. 377 */ 378 public boolean getRightBumperButtonReleased() { 379 return getRawButtonReleased(Button.kRightBumper.value); 380 } 381 382 /** 383 * Constructs an event instance around the right bumper button's digital signal. 384 * 385 * @param loop the event loop instance to attach the event to. 386 * @return an event instance representing the right bumper button's digital signal 387 * attached to the given loop. 388 */ 389 public BooleanEvent rightBumper(EventLoop loop) { 390 return button(Button.kRightBumper.value, loop); 391 } 392 393 /** 394 * Read the value of the left stick button on the controller. 395 * 396 * @return The state of the button. 397 */ 398 public boolean getLeftStickButton() { 399 return getRawButton(Button.kLeftStick.value); 400 } 401 402 /** 403 * Whether the left stick button was pressed since the last check. 404 * 405 * @return Whether the button was pressed since the last check. 406 */ 407 public boolean getLeftStickButtonPressed() { 408 return getRawButtonPressed(Button.kLeftStick.value); 409 } 410 411 /** 412 * Whether the left stick button was released since the last check. 413 * 414 * @return Whether the button was released since the last check. 415 */ 416 public boolean getLeftStickButtonReleased() { 417 return getRawButtonReleased(Button.kLeftStick.value); 418 } 419 420 /** 421 * Constructs an event instance around the left stick button's digital signal. 422 * 423 * @param loop the event loop instance to attach the event to. 424 * @return an event instance representing the left stick button's digital signal 425 * attached to the given loop. 426 */ 427 public BooleanEvent leftStick(EventLoop loop) { 428 return button(Button.kLeftStick.value, loop); 429 } 430 431 /** 432 * Read the value of the right stick button on the controller. 433 * 434 * @return The state of the button. 435 */ 436 public boolean getRightStickButton() { 437 return getRawButton(Button.kRightStick.value); 438 } 439 440 /** 441 * Whether the right stick button was pressed since the last check. 442 * 443 * @return Whether the button was pressed since the last check. 444 */ 445 public boolean getRightStickButtonPressed() { 446 return getRawButtonPressed(Button.kRightStick.value); 447 } 448 449 /** 450 * Whether the right stick button was released since the last check. 451 * 452 * @return Whether the button was released since the last check. 453 */ 454 public boolean getRightStickButtonReleased() { 455 return getRawButtonReleased(Button.kRightStick.value); 456 } 457 458 /** 459 * Constructs an event instance around the right stick button's digital signal. 460 * 461 * @param loop the event loop instance to attach the event to. 462 * @return an event instance representing the right stick button's digital signal 463 * attached to the given loop. 464 */ 465 public BooleanEvent rightStick(EventLoop loop) { 466 return button(Button.kRightStick.value, loop); 467 } 468 469 /** 470 * Read the value of the ellipses button on the controller. 471 * 472 * @return The state of the button. 473 */ 474 public boolean getEllipsesButton() { 475 return getRawButton(Button.kEllipses.value); 476 } 477 478 /** 479 * Whether the ellipses button was pressed since the last check. 480 * 481 * @return Whether the button was pressed since the last check. 482 */ 483 public boolean getEllipsesButtonPressed() { 484 return getRawButtonPressed(Button.kEllipses.value); 485 } 486 487 /** 488 * Whether the ellipses button was released since the last check. 489 * 490 * @return Whether the button was released since the last check. 491 */ 492 public boolean getEllipsesButtonReleased() { 493 return getRawButtonReleased(Button.kEllipses.value); 494 } 495 496 /** 497 * Constructs an event instance around the ellipses button's digital signal. 498 * 499 * @param loop the event loop instance to attach the event to. 500 * @return an event instance representing the ellipses button's digital signal 501 * attached to the given loop. 502 */ 503 public BooleanEvent ellipses(EventLoop loop) { 504 return button(Button.kEllipses.value, loop); 505 } 506 507 /** 508 * Read the value of the hamburger button on the controller. 509 * 510 * @return The state of the button. 511 */ 512 public boolean getHamburgerButton() { 513 return getRawButton(Button.kHamburger.value); 514 } 515 516 /** 517 * Whether the hamburger button was pressed since the last check. 518 * 519 * @return Whether the button was pressed since the last check. 520 */ 521 public boolean getHamburgerButtonPressed() { 522 return getRawButtonPressed(Button.kHamburger.value); 523 } 524 525 /** 526 * Whether the hamburger button was released since the last check. 527 * 528 * @return Whether the button was released since the last check. 529 */ 530 public boolean getHamburgerButtonReleased() { 531 return getRawButtonReleased(Button.kHamburger.value); 532 } 533 534 /** 535 * Constructs an event instance around the hamburger button's digital signal. 536 * 537 * @param loop the event loop instance to attach the event to. 538 * @return an event instance representing the hamburger button's digital signal 539 * attached to the given loop. 540 */ 541 public BooleanEvent hamburger(EventLoop loop) { 542 return button(Button.kHamburger.value, loop); 543 } 544 545 /** 546 * Read the value of the stadia button on the controller. 547 * 548 * @return The state of the button. 549 */ 550 public boolean getStadiaButton() { 551 return getRawButton(Button.kStadia.value); 552 } 553 554 /** 555 * Whether the stadia button was pressed since the last check. 556 * 557 * @return Whether the button was pressed since the last check. 558 */ 559 public boolean getStadiaButtonPressed() { 560 return getRawButtonPressed(Button.kStadia.value); 561 } 562 563 /** 564 * Whether the stadia button was released since the last check. 565 * 566 * @return Whether the button was released since the last check. 567 */ 568 public boolean getStadiaButtonReleased() { 569 return getRawButtonReleased(Button.kStadia.value); 570 } 571 572 /** 573 * Constructs an event instance around the stadia button's digital signal. 574 * 575 * @param loop the event loop instance to attach the event to. 576 * @return an event instance representing the stadia button's digital signal 577 * attached to the given loop. 578 */ 579 public BooleanEvent stadia(EventLoop loop) { 580 return button(Button.kStadia.value, loop); 581 } 582 583 /** 584 * Read the value of the right trigger button on the controller. 585 * 586 * @return The state of the button. 587 */ 588 public boolean getRightTriggerButton() { 589 return getRawButton(Button.kRightTrigger.value); 590 } 591 592 /** 593 * Whether the right trigger button was pressed since the last check. 594 * 595 * @return Whether the button was pressed since the last check. 596 */ 597 public boolean getRightTriggerButtonPressed() { 598 return getRawButtonPressed(Button.kRightTrigger.value); 599 } 600 601 /** 602 * Whether the right trigger button was released since the last check. 603 * 604 * @return Whether the button was released since the last check. 605 */ 606 public boolean getRightTriggerButtonReleased() { 607 return getRawButtonReleased(Button.kRightTrigger.value); 608 } 609 610 /** 611 * Constructs an event instance around the right trigger button's digital signal. 612 * 613 * @param loop the event loop instance to attach the event to. 614 * @return an event instance representing the right trigger button's digital signal 615 * attached to the given loop. 616 */ 617 public BooleanEvent rightTrigger(EventLoop loop) { 618 return button(Button.kRightTrigger.value, loop); 619 } 620 621 /** 622 * Read the value of the left trigger button on the controller. 623 * 624 * @return The state of the button. 625 */ 626 public boolean getLeftTriggerButton() { 627 return getRawButton(Button.kLeftTrigger.value); 628 } 629 630 /** 631 * Whether the left trigger button was pressed since the last check. 632 * 633 * @return Whether the button was pressed since the last check. 634 */ 635 public boolean getLeftTriggerButtonPressed() { 636 return getRawButtonPressed(Button.kLeftTrigger.value); 637 } 638 639 /** 640 * Whether the left trigger button was released since the last check. 641 * 642 * @return Whether the button was released since the last check. 643 */ 644 public boolean getLeftTriggerButtonReleased() { 645 return getRawButtonReleased(Button.kLeftTrigger.value); 646 } 647 648 /** 649 * Constructs an event instance around the left trigger button's digital signal. 650 * 651 * @param loop the event loop instance to attach the event to. 652 * @return an event instance representing the left trigger button's digital signal 653 * attached to the given loop. 654 */ 655 public BooleanEvent leftTrigger(EventLoop loop) { 656 return button(Button.kLeftTrigger.value, loop); 657 } 658 659 /** 660 * Read the value of the google button on the controller. 661 * 662 * @return The state of the button. 663 */ 664 public boolean getGoogleButton() { 665 return getRawButton(Button.kGoogle.value); 666 } 667 668 /** 669 * Whether the google button was pressed since the last check. 670 * 671 * @return Whether the button was pressed since the last check. 672 */ 673 public boolean getGoogleButtonPressed() { 674 return getRawButtonPressed(Button.kGoogle.value); 675 } 676 677 /** 678 * Whether the google button was released since the last check. 679 * 680 * @return Whether the button was released since the last check. 681 */ 682 public boolean getGoogleButtonReleased() { 683 return getRawButtonReleased(Button.kGoogle.value); 684 } 685 686 /** 687 * Constructs an event instance around the google button's digital signal. 688 * 689 * @param loop the event loop instance to attach the event to. 690 * @return an event instance representing the google button's digital signal 691 * attached to the given loop. 692 */ 693 public BooleanEvent google(EventLoop loop) { 694 return button(Button.kGoogle.value, loop); 695 } 696 697 /** 698 * Read the value of the frame button on the controller. 699 * 700 * @return The state of the button. 701 */ 702 public boolean getFrameButton() { 703 return getRawButton(Button.kFrame.value); 704 } 705 706 /** 707 * Whether the frame button was pressed since the last check. 708 * 709 * @return Whether the button was pressed since the last check. 710 */ 711 public boolean getFrameButtonPressed() { 712 return getRawButtonPressed(Button.kFrame.value); 713 } 714 715 /** 716 * Whether the frame button was released since the last check. 717 * 718 * @return Whether the button was released since the last check. 719 */ 720 public boolean getFrameButtonReleased() { 721 return getRawButtonReleased(Button.kFrame.value); 722 } 723 724 /** 725 * Constructs an event instance around the frame button's digital signal. 726 * 727 * @param loop the event loop instance to attach the event to. 728 * @return an event instance representing the frame button's digital signal 729 * attached to the given loop. 730 */ 731 public BooleanEvent frame(EventLoop loop) { 732 return button(Button.kFrame.value, loop); 733 } 734 735 /** 736 * Read the value of the left bumper (LB) button on the controller. 737 * 738 * @return The state of the button. 739 * @deprecated Use {@link getLeftBumperButton} instead. This function is deprecated for removal 740 * to make function names consistent to allow the HID classes to be automatically generated. 741 */ 742 @Deprecated(since = "2025", forRemoval = true) 743 public boolean getLeftBumper() { 744 return getRawButton(Button.kLeftBumper.value); 745 } 746 747 /** 748 * Read the value of the right bumper (RB) button on the controller. 749 * 750 * @return The state of the button. 751 * @deprecated Use {@link getRightBumperButton} instead. This function is deprecated for removal 752 * to make function names consistent to allow the HID classes to be automatically generated. 753 */ 754 @Deprecated(since = "2025", forRemoval = true) 755 public boolean getRightBumper() { 756 return getRawButton(Button.kRightBumper.value); 757 } 758 759 /** 760 * Whether the left bumper (LB) was pressed since the last check. 761 * 762 * @return Whether the button was pressed since the last check. 763 * @deprecated Use {@link getLeftBumperButtonPressed} instead. This function is deprecated for 764 * removal to make function names consistent to allow the HID classes to be automatically 765 * generated. 766 */ 767 @Deprecated(since = "2025", forRemoval = true) 768 public boolean getLeftBumperPressed() { 769 return getRawButtonPressed(Button.kLeftBumper.value); 770 } 771 772 /** 773 * Whether the right bumper (RB) was pressed since the last check. 774 * 775 * @return Whether the button was pressed since the last check. 776 * @deprecated Use {@link getRightBumperButtonPressed} instead. This function is deprecated for 777 * removal to make function names consistent to allow the HID classes to be automatically 778 * generated. 779 */ 780 @Deprecated(since = "2025", forRemoval = true) 781 public boolean getRightBumperPressed() { 782 return getRawButtonPressed(Button.kRightBumper.value); 783 } 784 785 /** 786 * Whether the left bumper (LB) was released since the last check. 787 * 788 * @return Whether the button was released since the last check. 789 * @deprecated Use {@link getLeftBumperButtonReleased} instead. This function is deprecated for 790 * removal to make function names consistent to allow the HID classes to be automatically 791 * generated. 792 */ 793 @Deprecated(since = "2025", forRemoval = true) 794 public boolean getLeftBumperReleased() { 795 return getRawButtonReleased(Button.kLeftBumper.value); 796 } 797 798 /** 799 * Whether the right bumper (RB) was released since the last check. 800 * 801 * @return Whether the button was released since the last check. 802 * @deprecated Use {@link getRightBumperButtonReleased} instead. This function is deprecated for 803 * removal to make function names consistent to allow the HID classes to be automatically 804 * generated. 805 */ 806 @Deprecated(since = "2025", forRemoval = true) 807 public boolean getRightBumperReleased() { 808 return getRawButtonReleased(Button.kRightBumper.value); 809 } 810 811 @Override 812 public void initSendable(SendableBuilder builder) { 813 builder.setSmartDashboardType("HID"); 814 builder.publishConstString("ControllerType", "Stadia"); 815 builder.addDoubleProperty("LeftX", this::getLeftX, null); 816 builder.addDoubleProperty("RightX", this::getRightX, null); 817 builder.addDoubleProperty("LeftY", this::getLeftY, null); 818 builder.addDoubleProperty("RightY", this::getRightY, null); 819 builder.addBooleanProperty("A", this::getAButton, null); 820 builder.addBooleanProperty("B", this::getBButton, null); 821 builder.addBooleanProperty("X", this::getXButton, null); 822 builder.addBooleanProperty("Y", this::getYButton, null); 823 builder.addBooleanProperty("LeftBumper", this::getLeftBumperButton, null); 824 builder.addBooleanProperty("RightBumper", this::getRightBumperButton, null); 825 builder.addBooleanProperty("LeftStick", this::getLeftStickButton, null); 826 builder.addBooleanProperty("RightStick", this::getRightStickButton, null); 827 builder.addBooleanProperty("Ellipses", this::getEllipsesButton, null); 828 builder.addBooleanProperty("Hamburger", this::getHamburgerButton, null); 829 builder.addBooleanProperty("Stadia", this::getStadiaButton, null); 830 builder.addBooleanProperty("RightTrigger", this::getRightTriggerButton, null); 831 builder.addBooleanProperty("LeftTrigger", this::getLeftTriggerButton, null); 832 builder.addBooleanProperty("Google", this::getGoogleButton, null); 833 builder.addBooleanProperty("Frame", this::getFrameButton, null); 834 } 835}