From 4f53b32b13195b91cdf8d3b21eb0e8006859ce8a Mon Sep 17 00:00:00 2001 From: Thomas Franks Date: Tue, 23 Aug 2022 15:56:01 -0400 Subject: [PATCH 1/3] resolves #18 Missing Type Annotations --- adafruit_bmp3xx.py | 62 +++++++++++++++++++++++++--------------------- 1 file changed, 34 insertions(+), 28 deletions(-) diff --git a/adafruit_bmp3xx.py b/adafruit_bmp3xx.py index 75345ad..0e82cc5 100644 --- a/adafruit_bmp3xx.py +++ b/adafruit_bmp3xx.py @@ -32,6 +32,14 @@ from micropython import const +try: + from typing import Tuple + from typing_extensions import Literal + from digitalio import DigitalInOut + from busio import I2C, SPI +except ImportError: + pass + __version__ = "0.0.0+auto.0" __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_BMP3XX.git" @@ -57,10 +65,10 @@ class BMP3XX: """Base class for BMP3XX sensor.""" - def __init__(self): + def __init__(self) -> None: chip_id = self._read_byte(_REGISTER_CHIPID) if chip_id not in (_BMP388_CHIP_ID, _BMP390_CHIP_ID): - raise RuntimeError("Failed to find BMP3XX! Chip ID 0x%x" % chip_id) + raise RuntimeError(f"Failed to find BMP3XX! Chip ID {hex(chip_id)}") self._read_coefficients() self.reset() self.sea_level_pressure = 1013.25 @@ -68,69 +76,67 @@ def __init__(self): """Sea level pressure in hPa.""" @property - def pressure(self): + def pressure(self) -> float: """The pressure in hPa.""" return self._read()[0] / 100 @property - def temperature(self): + def temperature(self) -> float: """The temperature in degrees Celsius""" return self._read()[1] @property - def altitude(self): + def altitude(self) -> float: """The altitude in meters based on the currently set sea level pressure.""" # see https://www.weather.gov/media/epz/wxcalc/pressureAltitude.pdf return 44307.7 * (1 - (self.pressure / self.sea_level_pressure) ** 0.190284) @property - def pressure_oversampling(self): + def pressure_oversampling(self) -> int: """The pressure oversampling setting.""" return _OSR_SETTINGS[self._read_byte(_REGISTER_OSR) & 0x07] @pressure_oversampling.setter - def pressure_oversampling(self, oversample): + def pressure_oversampling(self, oversample: Literal[1, 2, 4, 8, 16, 32]) -> None: if oversample not in _OSR_SETTINGS: - raise ValueError("Oversampling must be one of: {}".format(_OSR_SETTINGS)) + raise ValueError(f"Oversampling must be one of: {_OSR_SETTINGS}") new_setting = self._read_byte(_REGISTER_OSR) & 0xF8 | _OSR_SETTINGS.index( oversample ) self._write_register_byte(_REGISTER_OSR, new_setting) @property - def temperature_oversampling(self): + def temperature_oversampling(self) -> int: """The temperature oversampling setting.""" return _OSR_SETTINGS[self._read_byte(_REGISTER_OSR) >> 3 & 0x07] @temperature_oversampling.setter - def temperature_oversampling(self, oversample): + def temperature_oversampling(self, oversample: Literal[1, 2, 4, 8, 16, 32]) -> None: if oversample not in _OSR_SETTINGS: - raise ValueError("Oversampling must be one of: {}".format(_OSR_SETTINGS)) + raise ValueError(f"Oversampling must be one of: {_OSR_SETTINGS}") new_setting = ( self._read_byte(_REGISTER_OSR) & 0xC7 | _OSR_SETTINGS.index(oversample) << 3 ) self._write_register_byte(_REGISTER_OSR, new_setting) @property - def filter_coefficient(self): + def filter_coefficient(self) -> int: """The IIR filter coefficient.""" return _IIR_SETTINGS[self._read_byte(_REGISTER_CONFIG) >> 1 & 0x07] @filter_coefficient.setter - def filter_coefficient(self, coef): + def filter_coefficient(self, coef: Literal[0, 2, 4, 8, 16, 32, 64, 128]) -> None: if coef not in _IIR_SETTINGS: - raise ValueError( - "Filter coefficient must be one of: {}".format(_IIR_SETTINGS) - ) + raise ValueError(f"Filter coefficient must be one of: {_IIR_SETTINGS}") self._write_register_byte(_REGISTER_CONFIG, _IIR_SETTINGS.index(coef) << 1) - def reset(self): + def reset(self) -> None: """Perform a power on reset. All user configuration settings are overwritten with their default state. """ self._write_register_byte(_REGISTER_CMD, 0xB6) - def _read(self): + def _read(self) -> Tuple[float, float]: """Returns a tuple for temperature and pressure.""" # OK, pylint. This one is all kinds of stuff you shouldn't worry about. # pylint: disable=invalid-name, too-many-locals @@ -178,7 +184,7 @@ def _read(self): # pressure in hPa, temperature in deg C return pressure, temperature - def _read_coefficients(self): + def _read_coefficients(self) -> None: """Read & save the calibration coefficients""" coeff = self._read_register(_REGISTER_CAL_DATA, 21) # See datasheet, pg. 27, table 22 @@ -205,15 +211,15 @@ def _read_coefficients(self): coeff[13] / 2**65.0, ) # P11 - def _read_byte(self, register): + def _read_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: """Low level register reading, not implemented in base class""" raise NotImplementedError() - def _write_register_byte(self, register, value): + def _write_register_byte(self, register: int, value: int) -> None: """Low level register writing, not implemented in base class""" raise NotImplementedError() @@ -252,13 +258,13 @@ class BMP3XX_I2C(BMP3XX): """ - def __init__(self, i2c, address=0x77): + def __init__(self, i2c: I2C, address: int = 0x77) -> None: from adafruit_bus_device import i2c_device self._i2c = i2c_device.I2CDevice(i2c, address) super().__init__() - def _read_register(self, register, length): + def _read_register(self, register: int, length: int) -> bytearray: """Low level register reading over I2C, returns a list of values""" result = bytearray(length) with self._i2c as i2c: @@ -266,7 +272,7 @@ def _read_register(self, register, length): i2c.readinto(result) return result - def _write_register_byte(self, register, value): + def _write_register_byte(self, register: int, value: int) -> None: """Low level register writing over I2C, writes one 8-bit value""" with self._i2c as i2c: i2c.write(bytes((register & 0xFF, value & 0xFF))) @@ -308,7 +314,7 @@ class BMP3XX_SPI(BMP3XX): """ - def __init__(self, spi, cs): + def __init__(self, spi: SPI, cs: DigitalInOut) -> None: from adafruit_bus_device import spi_device self._spi = spi_device.SPIDevice(spi, cs) @@ -317,7 +323,7 @@ def __init__(self, spi, cs): time.sleep(0.001) super().__init__() - def _read_register(self, register, length): + def _read_register(self, register: int, length: int) -> bytearray: """Low level register reading over SPI, returns a list of values""" result = bytearray(length) with self._spi as spi: @@ -326,7 +332,7 @@ def _read_register(self, register, length): spi.readinto(result) return result - def _write_register_byte(self, register, value): + def _write_register_byte(self, register: int, value: int) -> None: """Low level register writing over SPI, writes one 8-bit value""" with self._spi as spi: # pylint: disable=no-member From 6545e0c4c6255c3b1944cdb37710881d546e996a Mon Sep 17 00:00:00 2001 From: Thomas Franks Date: Wed, 24 Aug 2022 22:00:11 -0400 Subject: [PATCH 2/3] resolves #18 Missing Type Annotations --- adafruit_bmp3xx.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/adafruit_bmp3xx.py b/adafruit_bmp3xx.py index 0e82cc5..8b2c66e 100644 --- a/adafruit_bmp3xx.py +++ b/adafruit_bmp3xx.py @@ -34,7 +34,6 @@ try: from typing import Tuple - from typing_extensions import Literal from digitalio import DigitalInOut from busio import I2C, SPI except ImportError: @@ -97,7 +96,7 @@ def pressure_oversampling(self) -> int: return _OSR_SETTINGS[self._read_byte(_REGISTER_OSR) & 0x07] @pressure_oversampling.setter - def pressure_oversampling(self, oversample: Literal[1, 2, 4, 8, 16, 32]) -> None: + def pressure_oversampling(self, oversample: int) -> None: if oversample not in _OSR_SETTINGS: raise ValueError(f"Oversampling must be one of: {_OSR_SETTINGS}") new_setting = self._read_byte(_REGISTER_OSR) & 0xF8 | _OSR_SETTINGS.index( @@ -111,7 +110,7 @@ def temperature_oversampling(self) -> int: return _OSR_SETTINGS[self._read_byte(_REGISTER_OSR) >> 3 & 0x07] @temperature_oversampling.setter - def temperature_oversampling(self, oversample: Literal[1, 2, 4, 8, 16, 32]) -> None: + def temperature_oversampling(self, oversample: int) -> None: if oversample not in _OSR_SETTINGS: raise ValueError(f"Oversampling must be one of: {_OSR_SETTINGS}") new_setting = ( @@ -125,7 +124,7 @@ def filter_coefficient(self) -> int: return _IIR_SETTINGS[self._read_byte(_REGISTER_CONFIG) >> 1 & 0x07] @filter_coefficient.setter - def filter_coefficient(self, coef: Literal[0, 2, 4, 8, 16, 32, 64, 128]) -> None: + def filter_coefficient(self, coef: int) -> None: if coef not in _IIR_SETTINGS: raise ValueError(f"Filter coefficient must be one of: {_IIR_SETTINGS}") self._write_register_byte(_REGISTER_CONFIG, _IIR_SETTINGS.index(coef) << 1) From 0bae88edbdb7563e81eda30a48a6eba2aa1229af Mon Sep 17 00:00:00 2001 From: Thomas Franks Date: Wed, 24 Aug 2022 22:04:21 -0400 Subject: [PATCH 3/3] resolves #18 Missing Type Annotations --- adafruit_bmp3xx.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/adafruit_bmp3xx.py b/adafruit_bmp3xx.py index 8b2c66e..5e25b19 100644 --- a/adafruit_bmp3xx.py +++ b/adafruit_bmp3xx.py @@ -214,7 +214,7 @@ def _read_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: int, length: int) -> None: + def _read_register(self, register: int, length: int) -> bytearray: """Low level register reading, not implemented in base class""" raise NotImplementedError()