Source code for robotpy_ext.control.toggle

from functools import partial

import wpilib


[docs] class Toggle: """Utility class for joystick button toggle Usage:: foo = Toggle(joystick, 3) if foo: toggleFunction() if foo.on: onToggle() if foo.off: offToggle() """ class _SteadyDebounce: """ Similar to ButtonDebouncer, but the output stays steady for the given periodic_filter. E.g, if you set the period to 2 and press the button, the value will return true for 2 seconds. Steady debounce will return true for the given period, allowing it to be used with Toggle """ def __init__(self, joystick: wpilib.Joystick, button: int, period: float): """ :param joystick: Joystick object :type joystick: :class:`wpilib.Joystick` :param button: Number of button to retrieve :type button: int :param period: Period of time (in seconds) to wait before allowing new button presses. Defaults to 0.5 seconds. :type period: float """ self.joystick = joystick self.button = button self.debounce_period = float(period) self.latest = ( -self.debounce_period ) # Negative latest prevents get from returning true until joystick is presed for the first time self.enabled = False def get(self): """ :returns: The value of the joystick button. Once the button is pressed, the return value will be `True` until the time expires """ now = wpilib.Timer.getFPGATimestamp() if now - self.latest < self.debounce_period: return True if self.joystick.getRawButton(self.button): self.latest = now return True else: return False def __init__( self, joystick: wpilib.Joystick, button: int, debounce_period: float = None ): """ :param joystick: :class:`wpilib.Joystick` that contains the button to toggle :param button: Number of button that will act as toggle. Same value used in `getRawButton()` :param debounce_period: Period in seconds to wait before registering a new button press. """ if debounce_period is not None: self.joystickget = Toggle._SteadyDebounce( joystick, button, debounce_period ).get else: self.joystick = joystick self.joystickget = partial(self.joystick.getRawButton, button) self.released = False self.toggle = False self.state = False
[docs] def get(self): """ :return: State of toggle :rtype: bool """ current_state = self.joystickget() if current_state and not self.released: self.released = True self.toggle = not self.toggle self.state = not self.state # Toggles between 1 and 0. elif not current_state and self.released: self.released = False return self.toggle
@property def on(self): """ Equates to true if toggle is in the 'on' state """ self.get() return self.state @property def off(self): """ Equates to true if toggle is in the 'off' state """ self.get() return not self.state __bool__ = get