Source code for adafruit_featherwing.joy_featherwing

# SPDX-FileCopyrightText: 2018 Kattni Rembor for Adafruit Industries
#
# SPDX-License-Identifier: MIT

"""
`adafruit_featherwing.joy_featherwing`
====================================================

Helper for using the `Joy FeatherWing <https://www.adafruit.com/product/3632>`_.

* Author(s): Kattni Rembor
"""

__version__ = "0.0.0+auto.0"
__repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_FeatherWing.git"

import board
from micropython import const
import adafruit_seesaw.seesaw

try:
    from typing import Optional, Tuple
    from busio import I2C
except ImportError:
    pass


BUTTON_A = const(1 << 6)
BUTTON_B = const(1 << 7)
BUTTON_Y = const(1 << 9)
BUTTON_X = const(1 << 10)
BUTTON_SELECT = const(1 << 14)


[docs] class JoyFeatherWing: """Class representing an `Adafruit Joy FeatherWing <https://www.adafruit.com/product/3632>`_. Automatically uses the feather's I2C bus.""" def __init__(self, i2c: Optional[I2C] = None): if i2c is None: i2c = board.I2C() self._seesaw = adafruit_seesaw.seesaw.Seesaw(i2c) self._seesaw.pin_mode_bulk( BUTTON_A | BUTTON_B | BUTTON_Y | BUTTON_X | BUTTON_SELECT, self._seesaw.INPUT_PULLUP, ) # Initialise joystick_offset self._joystick_offset = (0, 0) @property def button_a(self): """Joy featherwing button A. .. image :: ../docs/_static/joy_featherwing/joy_featherwing_a.jpg :alt: Joy FeatherWing Button A This example prints when button A is pressed. .. code-block:: python from adafruit_featherwing import joy_featherwing import time wing = joy_featherwing.JoyFeatherWing() while True: if wing.button_a: print("Button A pressed!") """ return self._check_button(BUTTON_A) @property def button_b(self): """Joy featherwing button B. .. image :: ../docs/_static/joy_featherwing/joy_featherwing_b.jpg :alt: Joy FeatherWing Button B This example prints when button B is pressed. .. code-block:: python from adafruit_featherwing import joy_featherwing import time wing = joy_featherwing.JoyFeatherWing() while True: if wing.button_b: print("Button B pressed!") """ return self._check_button(BUTTON_B) @property def button_x(self): """Joy featherwing button X. .. image :: ../docs/_static/joy_featherwing/joy_featherwing_x.jpg :alt: Joy FeatherWing Button X This example prints when button X is pressed. .. code-block:: python from adafruit_featherwing import joy_featherwing import time wing = joy_featherwing.JoyFeatherWing() while True: if wing.button_x: print("Button X pressed!") """ return self._check_button(BUTTON_X) @property def button_y(self): """Joy featherwing button Y. .. image :: ../docs/_static/joy_featherwing/joy_featherwing_y.jpg :alt: Joy FeatherWing Button Y This example prints when button Y is pressed. .. code-block:: python from adafruit_featherwing import joy_featherwing import time wing = joy_featherwing.JoyFeatherWing() while True: if wing.button_y: print("Button Y pressed!") """ return self._check_button(BUTTON_Y) @property def button_select(self): """Joy featherwing button SELECT. .. image :: ../docs/_static/joy_featherwing/joy_featherwing_select.jpg :alt: Joy FeatherWing Button SELECT This example prints when button SELECT is pressed. .. code-block:: python from adafruit_featherwing import joy_featherwing import time wing = joy_featherwing.JoyFeatherWing() while True: if wing.button_select: print("Button SELECT pressed!") """ return self._check_button(BUTTON_SELECT) def _check_button(self, button: int) -> bool: """Utilises the seesaw to determine which button is being pressed.""" buttons = self._seesaw.digital_read_bulk(button) return not buttons != 0 @property def joystick_offset(self): """Offset used to correctly report (0, 0) when the joystick is centered. Provide a tuple of (x, y) to set your joystick center to (0, 0). The offset you provide is subtracted from the current reading. For example, if your joystick reads as (-4, 0), you would enter (-4, 0) as the offset. The code will subtract -4 from -4, and 0 from 0, returning (0, 0). This example supplies an offset for zeroing, and prints the coordinates of the joystick when it is moved. .. code-block:: python from adafruit_featherwing import joy_featherwing import time wing = joy_featherwing.JoyFeatherWing() last_x = 0 last_y = 0 while True: wing.joystick_offset = (-4, 0) x, y = wing.joystick if (abs(x - last_x) > 3) or (abs(y - last_y) > 3): last_x = x last_y = y print(x, y) time.sleep(0.01) """ return self._joystick_offset @joystick_offset.setter def joystick_offset(self, offset: Tuple[int, int]): self._joystick_offset = offset
[docs] def zero_joystick(self): """Zeros the joystick by using current reading as (0, 0). Note: You must not be touching the joystick at the time of zeroing for it to be accurate. This example zeros the joystick, and prints the coordinates of joystick when it is moved. .. code-block:: python from adafruit_featherwing import joy_featherwing import time wing = joy_featherwing.JoyFeatherWing() last_x = 0 last_y = 0 wing.zero_joystick() while True: x, y = wing.joystick if (abs(x - last_x) > 3) or (abs(y - last_y) > 3): last_x = x last_y = y print(x, y) time.sleep(0.01) """ self._joystick_offset = (0, 0) self._joystick_offset = self.joystick
@property def joystick(self): """Joy FeatherWing joystick. .. image :: ../docs/_static/joy_featherwing/joy_featherwing_joystick.jpg :alt: Joy FeatherWing Joystick This example zeros the joystick, and prints the coordinates of joystick when it is moved. .. code-block:: python from adafruit_featherwing import joy_featherwing import time wing = joy_featherwing.JoyFeatherWing() last_x = 0 last_y = 0 wing.zero_joystick() while True: x, y = wing.joystick if (abs(x - last_x) > 3) or (abs(y - last_y) > 3): last_x = x last_y = y print(x, y) time.sleep(0.01) """ x = int(127 - self._seesaw.analog_read(2) / 4) - self._joystick_offset[0] y = int(self._seesaw.analog_read(3) / 4 - 127) - self._joystick_offset[1] return x, y