# The MIT License (MIT)
#
# Copyright (c) 2018 Kattni Rembor for Adafruit Industries LLC
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.
"""
`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"
from micropython import const
import adafruit_seesaw.seesaw
from adafruit_featherwing import shared
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):
self._seesaw = adafruit_seesaw.seesaw.Seesaw(shared.I2C_BUS)
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):
"""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.
.. image :: ../docs/_static/joy_featherwing/joy_featherwing_joystick.jpg
:alt: Joy FeatherWing Joystick
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):
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.
.. 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)
"""
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