Skip to content

Commit 4330d4e

Browse files
authored
Merge pull request #49 from billvanleeuwen424/main
Type annotations. Issue #45
2 parents 00ede08 + 4cd2a03 commit 4330d4e

File tree

1 file changed

+55
-28
lines changed

1 file changed

+55
-28
lines changed

adafruit_bme680.py

Lines changed: 55 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,18 @@
3333
import math
3434
from micropython import const
3535

36+
try:
37+
# Used only for type annotations.
38+
39+
import typing # pylint: disable=unused-import
40+
41+
from circuitpython_typing import ReadableBuffer
42+
from busio import I2C, SPI
43+
from digitalio import DigitalInOut
44+
45+
except ImportError:
46+
pass
47+
3648
__version__ = "0.0.0-auto.0"
3749
__repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_BME680.git"
3850

@@ -104,7 +116,7 @@
104116
)
105117

106118

107-
def _read24(arr):
119+
def _read24(arr: ReadableBuffer) -> float:
108120
"""Parse an unsigned 24-bit value as a floating point and return it."""
109121
ret = 0.0
110122
# print([hex(i) for i in arr])
@@ -120,7 +132,7 @@ class Adafruit_BME680:
120132
:param int refresh_rate: Maximum number of readings per second. Faster property reads
121133
will be from the previous reading."""
122134

123-
def __init__(self, *, refresh_rate=10):
135+
def __init__(self, *, refresh_rate: int = 10) -> None:
124136
"""Check the BME680 was found, read the coefficients and enable the sensor for continuous
125137
reads."""
126138
self._write(_BME680_REG_SOFTRESET, [0xB6])
@@ -160,62 +172,62 @@ def __init__(self, *, refresh_rate=10):
160172
self._min_refresh_time = 1 / refresh_rate
161173

162174
@property
163-
def pressure_oversample(self):
175+
def pressure_oversample(self) -> int:
164176
"""The oversampling for pressure sensor"""
165177
return _BME680_SAMPLERATES[self._pressure_oversample]
166178

167179
@pressure_oversample.setter
168-
def pressure_oversample(self, sample_rate):
180+
def pressure_oversample(self, sample_rate: int) -> None:
169181
if sample_rate in _BME680_SAMPLERATES:
170182
self._pressure_oversample = _BME680_SAMPLERATES.index(sample_rate)
171183
else:
172184
raise RuntimeError("Invalid oversample")
173185

174186
@property
175-
def humidity_oversample(self):
187+
def humidity_oversample(self) -> int:
176188
"""The oversampling for humidity sensor"""
177189
return _BME680_SAMPLERATES[self._humidity_oversample]
178190

179191
@humidity_oversample.setter
180-
def humidity_oversample(self, sample_rate):
192+
def humidity_oversample(self, sample_rate: int) -> None:
181193
if sample_rate in _BME680_SAMPLERATES:
182194
self._humidity_oversample = _BME680_SAMPLERATES.index(sample_rate)
183195
else:
184196
raise RuntimeError("Invalid oversample")
185197

186198
@property
187-
def temperature_oversample(self):
199+
def temperature_oversample(self) -> int:
188200
"""The oversampling for temperature sensor"""
189201
return _BME680_SAMPLERATES[self._temp_oversample]
190202

191203
@temperature_oversample.setter
192-
def temperature_oversample(self, sample_rate):
204+
def temperature_oversample(self, sample_rate: int) -> None:
193205
if sample_rate in _BME680_SAMPLERATES:
194206
self._temp_oversample = _BME680_SAMPLERATES.index(sample_rate)
195207
else:
196208
raise RuntimeError("Invalid oversample")
197209

198210
@property
199-
def filter_size(self):
211+
def filter_size(self) -> int:
200212
"""The filter size for the built in IIR filter"""
201213
return _BME680_FILTERSIZES[self._filter]
202214

203215
@filter_size.setter
204-
def filter_size(self, size):
216+
def filter_size(self, size: int) -> None:
205217
if size in _BME680_FILTERSIZES:
206218
self._filter = _BME680_FILTERSIZES.index(size)
207219
else:
208220
raise RuntimeError("Invalid size")
209221

210222
@property
211-
def temperature(self):
223+
def temperature(self) -> float:
212224
"""The compensated temperature in degrees Celsius."""
213225
self._perform_reading()
214226
calc_temp = ((self._t_fine * 5) + 128) / 256
215227
return calc_temp / 100
216228

217229
@property
218-
def pressure(self):
230+
def pressure(self) -> float:
219231
"""The barometric pressure in hectoPascals"""
220232
self._perform_reading()
221233
var1 = (self._t_fine / 2) - 64000
@@ -242,12 +254,12 @@ def pressure(self):
242254
return calc_pres / 100
243255

244256
@property
245-
def relative_humidity(self):
257+
def relative_humidity(self) -> float:
246258
"""The relative humidity in RH %"""
247259
return self.humidity
248260

249261
@property
250-
def humidity(self):
262+
def humidity(self) -> float:
251263
"""The relative humidity in RH %"""
252264
self._perform_reading()
253265
temp_scaled = ((self._t_fine * 5) + 128) / 256
@@ -284,14 +296,14 @@ def humidity(self):
284296
return calc_hum
285297

286298
@property
287-
def altitude(self):
299+
def altitude(self) -> float:
288300
"""The altitude based on current :attr:`pressure` vs the sea level pressure
289301
(:attr:`sea_level_pressure`) - which you must enter ahead of time)"""
290302
pressure = self.pressure # in Si units for hPascal
291303
return 44330 * (1.0 - math.pow(pressure / self.sea_level_pressure, 0.1903))
292304

293305
@property
294-
def gas(self):
306+
def gas(self) -> int:
295307
"""The gas resistance in ohms"""
296308
self._perform_reading()
297309
if self._chip_variant == 0x01:
@@ -311,7 +323,7 @@ def gas(self):
311323
calc_gas_res = (var3 + (var2 / 2)) / var2
312324
return int(calc_gas_res)
313325

314-
def _perform_reading(self):
326+
def _perform_reading(self) -> None:
315327
"""Perform a single-shot reading from the sensor and fill internal data structure for
316328
calculations"""
317329
if time.monotonic() - self._last_reading < self._min_refresh_time:
@@ -357,7 +369,7 @@ def _perform_reading(self):
357369
var3 = (var3 * self._temp_calibration[2] * 16) / 16384
358370
self._t_fine = int(var2 + var3)
359371

360-
def _read_calibration(self):
372+
def _read_calibration(self) -> None:
361373
"""Read & save the calibration coefficients"""
362374
coeff = self._read(_BME680_BME680_COEFF_ADDR1, 25)
363375
coeff += self._read(_BME680_BME680_COEFF_ADDR2, 16)
@@ -381,14 +393,14 @@ def _read_calibration(self):
381393
self._heat_val = self._read_byte(0x00)
382394
self._sw_err = (self._read_byte(0x04) & 0xF0) / 16
383395

384-
def _read_byte(self, register):
396+
def _read_byte(self, register: int) -> int:
385397
"""Read a byte register value and return it"""
386398
return self._read(register, 1)[0]
387399

388-
def _read(self, register, length):
400+
def _read(self, register: int, length: int) -> bytearray:
389401
raise NotImplementedError()
390402

391-
def _write(self, register, values):
403+
def _write(self, register: int, values: bytearray) -> None:
392404
raise NotImplementedError()
393405

394406

@@ -437,7 +449,14 @@ class Adafruit_BME680_I2C(Adafruit_BME680):
437449
438450
"""
439451

440-
def __init__(self, i2c, address=0x77, debug=False, *, refresh_rate=10):
452+
def __init__(
453+
self,
454+
i2c: I2C,
455+
address: int = 0x77,
456+
debug: bool = False,
457+
*,
458+
refresh_rate: int = 10
459+
) -> None:
441460
"""Initialize the I2C device at the 'address' given"""
442461
from adafruit_bus_device import ( # pylint: disable=import-outside-toplevel
443462
i2c_device,
@@ -447,7 +466,7 @@ def __init__(self, i2c, address=0x77, debug=False, *, refresh_rate=10):
447466
self._debug = debug
448467
super().__init__(refresh_rate=refresh_rate)
449468

450-
def _read(self, register, length):
469+
def _read(self, register: int, length: int) -> bytearray:
451470
"""Returns an array of 'length' bytes from the 'register'"""
452471
with self._i2c as i2c:
453472
i2c.write(bytes([register & 0xFF]))
@@ -457,7 +476,7 @@ def _read(self, register, length):
457476
print("\t$%02X => %s" % (register, [hex(i) for i in result]))
458477
return result
459478

460-
def _write(self, register, values):
479+
def _write(self, register: int, values: ReadableBuffer) -> None:
461480
"""Writes an array of 'length' bytes to the 'register'"""
462481
with self._i2c as i2c:
463482
buffer = bytearray(2 * len(values))
@@ -518,7 +537,15 @@ class Adafruit_BME680_SPI(Adafruit_BME680):
518537
519538
"""
520539

521-
def __init__(self, spi, cs, baudrate=100000, debug=False, *, refresh_rate=10):
540+
def __init__(
541+
self,
542+
spi: SPI,
543+
cs: DigitalInOut,
544+
baudrate: int = 100000,
545+
debug: bool = False,
546+
*,
547+
refresh_rate: int = 10
548+
) -> None:
522549
from adafruit_bus_device import ( # pylint: disable=import-outside-toplevel
523550
spi_device,
524551
)
@@ -527,7 +554,7 @@ def __init__(self, spi, cs, baudrate=100000, debug=False, *, refresh_rate=10):
527554
self._debug = debug
528555
super().__init__(refresh_rate=refresh_rate)
529556

530-
def _read(self, register, length):
557+
def _read(self, register: int, length: int) -> bytearray:
531558
if register != _BME680_REG_STATUS:
532559
# _BME680_REG_STATUS exists in both SPI memory pages
533560
# For all other registers, we must set the correct memory page
@@ -542,7 +569,7 @@ def _read(self, register, length):
542569
print("\t$%02X => %s" % (register, [hex(i) for i in result]))
543570
return result
544571

545-
def _write(self, register, values):
572+
def _write(self, register: int, values: ReadableBuffer) -> None:
546573
if register != _BME680_REG_STATUS:
547574
# _BME680_REG_STATUS exists in both SPI memory pages
548575
# For all other registers, we must set the correct memory page
@@ -557,7 +584,7 @@ def _write(self, register, values):
557584
if self._debug:
558585
print("\t$%02X <= %s" % (values[0], [hex(i) for i in values[1:]]))
559586

560-
def _set_spi_mem_page(self, register):
587+
def _set_spi_mem_page(self, register: int) -> None:
561588
spi_mem_page = 0x00
562589
if register < 0x80:
563590
spi_mem_page = 0x10

0 commit comments

Comments
 (0)