# 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