Skip to content

Adding Type Annotations #76

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Jan 20, 2023
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
87 changes: 61 additions & 26 deletions adafruit_lis3dh.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,14 @@

from micropython import const

try:
from typing import Optional
from typing_extensions import Literal
from busio import I2C, SPI
except ImportError:
pass


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

Expand Down Expand Up @@ -93,7 +101,11 @@ class LIS3DH:
the LIS3DH INT2 interrupt pin
"""

def __init__(self, int1=None, int2=None):
def __init__(
self,
int1: Optional[digitalio.DigitalInOut] = None,
int2: Optional[digitalio.DigitalInOut] = None,
) -> None:
# Check device ID.
device_id = self._read_register_byte(_REG_WHOAMI)
if device_id != 0x33:
Expand All @@ -120,7 +132,9 @@ def __init__(self, int1=None, int2=None):
self._int1.pull = digitalio.Pull.UP

@property
def data_rate(self):
def data_rate(
self,
) -> int:
"""The data rate of the accelerometer.

Could have the following values:
Expand All @@ -141,14 +155,17 @@ def data_rate(self):
return (ctl1 >> 4) & 0x0F

@data_rate.setter
def data_rate(self, rate):
def data_rate(
self,
rate: int,
):
ctl1 = self._read_register_byte(_REG_CTRL1)
ctl1 &= ~(0xF0)
ctl1 |= rate << 4
self._write_register_byte(_REG_CTRL1, ctl1)

@property
def range(self):
def range(self) -> Literal[RANGE_2_G, RANGE_4_G, RANGE_8_G, RANGE_16_G]:
"""The range of the accelerometer.

Could have the following values:
Expand All @@ -163,14 +180,14 @@ def range(self):
return (ctl4 >> 4) & 0x03

@range.setter
def range(self, range_value):
def range(self, range_value: Literal[RANGE_2_G, RANGE_4_G, RANGE_8_G, RANGE_16_G]):
ctl4 = self._read_register_byte(_REG_CTRL4)
ctl4 &= ~0x30
ctl4 |= range_value << 4
self._write_register_byte(_REG_CTRL4, ctl4)

@property
def acceleration(self):
def acceleration(self) -> AccelerationTuple:
"""The x, y, z acceleration values returned
in a 3-tuple and are in :math:`m / s ^ 2`"""
divider = 1
Expand All @@ -193,7 +210,9 @@ def acceleration(self):

return AccelerationTuple(x, y, z)

def shake(self, shake_threshold=30, avg_count=10, total_delay=0.1):
def shake(
self, shake_threshold: int = 30, avg_count: int = 10, total_delay: float = 0.1
) -> bool:
"""Detect when the accelerometer is shaken. Optional parameters:

:param int shake_threshold: Increase or decrease to change shake sensitivity.
Expand Down Expand Up @@ -226,7 +245,7 @@ def shake(self, shake_threshold=30, avg_count=10, total_delay=0.1):
total_accel = math.sqrt(sum(map(lambda x: x * x, avg)))
return total_accel > shake_threshold

def read_adc_raw(self, adc):
def read_adc_raw(self, adc: Literal[1, 2, 3]) -> int:
"""Retrieve the raw analog to digital converter value. ADC must be a
value 1, 2, or 3.
"""
Expand All @@ -237,7 +256,8 @@ def read_adc_raw(self, adc):
"<h", self._read_register((_REG_OUTADC1_L + ((adc - 1) * 2)) | 0x80, 2)[0:2]
)[0]

def read_adc_mV(self, adc): # pylint: disable=invalid-name
# pylint: disable=invalid-name
def read_adc_mV(self, adc: Literal[1, 2, 3]) -> float:
"""Read the specified analog to digital converter value in millivolts.
ADC must be a value 1, 2, or 3. NOTE the ADC can only measure voltages
in the range of ~900-1200mV!
Expand All @@ -256,7 +276,7 @@ def read_adc_mV(self, adc): # pylint: disable=invalid-name
return 1800 + (raw + 32512) * (-900 / 65024)

@property
def tapped(self):
def tapped(self) -> int:
"""
True if a tap was detected recently. Whether its a single tap or double tap is
determined by the tap param on :attr:`set_tap`. :attr:`tapped` may be True over
Expand Down Expand Up @@ -284,14 +304,14 @@ def tapped(self):

def set_tap(
self,
tap,
threshold,
tap: Literal[0, 1, 2],
threshold: int,
*,
time_limit=10,
time_latency=20,
time_window=255,
click_cfg=None
):
time_limit: int = 10,
time_latency: int = 20,
time_window: int = 255,
click_cfg: Optional[int] = None
) -> None:
"""
The tap detection parameters.

Expand Down Expand Up @@ -338,17 +358,17 @@ def set_tap(
self._write_register_byte(_REG_TIMELATENCY, time_latency)
self._write_register_byte(_REG_TIMEWINDOW, time_window)

def _read_register_byte(self, register):
def _read_register_byte(self, register: int) -> int:
# Read a byte register value and return it.
return self._read_register(register, 1)[0]

def _read_register(self, register, length):
def _read_register(self, register: int, length: int) -> None:
# Read an arbitrarily long register (specified by length number of
# bytes) and return a bytearray of the retrieved data.
# Subclasses MUST implement this!
raise NotImplementedError

def _write_register_byte(self, register, value):
def _write_register_byte(self, register: int, value: int) -> None:
# Write a single byte register at the specified register address.
# Subclasses MUST implement this!
raise NotImplementedError
Expand Down Expand Up @@ -387,7 +407,14 @@ class LIS3DH_I2C(LIS3DH):

"""

def __init__(self, i2c, *, address=0x18, int1=None, int2=None):
def __init__(
self,
i2c: I2C,
*,
address: int = 0x18,
int1: Optional[digitalio.DigitalInOut] = None,
int2: Optional[digitalio.DigitalInOut] = None
) -> None:
from adafruit_bus_device import ( # pylint: disable=import-outside-toplevel
i2c_device,
)
Expand All @@ -396,14 +423,14 @@ def __init__(self, i2c, *, address=0x18, int1=None, int2=None):
self._buffer = bytearray(6)
super().__init__(int1=int1, int2=int2)

def _read_register(self, register, length):
def _read_register(self, register: int, length: int) -> bytearray:
self._buffer[0] = register & 0xFF
with self._i2c as i2c:
i2c.write(self._buffer, start=0, end=1)
i2c.readinto(self._buffer, start=0, end=length)
return self._buffer

def _write_register_byte(self, register, value):
def _write_register_byte(self, register: int, value: int) -> None:
self._buffer[0] = register & 0xFF
self._buffer[1] = value & 0xFF
with self._i2c as i2c:
Expand Down Expand Up @@ -442,7 +469,15 @@ class LIS3DH_SPI(LIS3DH):

"""

def __init__(self, spi, cs, *, baudrate=100000, int1=None, int2=None):
def __init__(
self,
spi: SPI,
cs: digitalio.DigitalInOut,
*,
baudrate: int = 100000,
int1: Optional[digitalio.DigitalInOut] = None,
int2: Optional[digitalio.DigitalInOut] = None
) -> None:
from adafruit_bus_device import ( # pylint: disable=import-outside-toplevel
spi_device,
)
Expand All @@ -451,7 +486,7 @@ def __init__(self, spi, cs, *, baudrate=100000, int1=None, int2=None):
self._buffer = bytearray(6)
super().__init__(int1=int1, int2=int2)

def _read_register(self, register, length):
def _read_register(self, register: int, length: int) -> bytearray:
if length == 1:
self._buffer[0] = (register | 0x80) & 0xFF # Read single, bit 7 high.
else:
Expand All @@ -461,7 +496,7 @@ def _read_register(self, register, length):
spi.readinto(self._buffer, start=0, end=length) # pylint: disable=no-member
return self._buffer

def _write_register_byte(self, register, value):
def _write_register_byte(self, register: int, value: int) -> None:
self._buffer[0] = register & 0x7F # Write, bit 7 low.
self._buffer[1] = value & 0xFF
with self._spi as spi:
Expand Down