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