Skip to content

Commit c7d4e1c

Browse files
authored
Merge pull request #62 from rsbohn/dexter0819
Provide proxies for I2C and SPI
2 parents 69a07bc + e521dfc commit c7d4e1c

File tree

3 files changed

+70
-81
lines changed

3 files changed

+70
-81
lines changed

adafruit_bme280/advanced.py

Lines changed: 5 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
"""
3232
from micropython import const
3333
from adafruit_bme280.basic import Adafruit_BME280
34+
from adafruit_bme280.protocol import I2C_Impl, SPI_Impl
3435

3536
try:
3637
import typing # pylint: disable=unused-import
@@ -141,14 +142,14 @@ class Adafruit_BME280_Advanced(Adafruit_BME280):
141142
"""
142143

143144
# pylint: disable=too-many-instance-attributes
144-
def __init__(self) -> None:
145+
def __init__(self, proxy: typing.Union[I2C_Impl, SPI_Impl]) -> None:
145146
"""Check the BME280 was found, read the coefficients and enable the sensor"""
146147
self._overscan_humidity = OVERSCAN_X1
147148
self._overscan_temperature = OVERSCAN_X1
148149
self._overscan_pressure = OVERSCAN_X16
149150
self._mode = MODE_SLEEP
150151
self._t_standby = STANDBY_TC_125
151-
super().__init__()
152+
super().__init__(proxy)
152153

153154
@property
154155
def standby_period(self) -> int:
@@ -317,25 +318,7 @@ class Adafruit_BME280_I2C(Adafruit_BME280_Advanced):
317318
"""
318319

319320
def __init__(self, i2c: I2C, address: int = _BME280_ADDRESS) -> None:
320-
from adafruit_bus_device import ( # pylint: disable=import-outside-toplevel
321-
i2c_device,
322-
)
323-
324-
self._i2c = i2c_device.I2CDevice(i2c, address)
325-
super().__init__()
326-
327-
def _read_register(self, register: int, length: int) -> bytearray:
328-
with self._i2c as i2c:
329-
i2c.write(bytes([register & 0xFF]))
330-
result = bytearray(length)
331-
i2c.readinto(result)
332-
# print("$%02X => %s" % (register, [hex(i) for i in result]))
333-
return result
334-
335-
def _write_register_byte(self, register: int, value: int) -> None:
336-
with self._i2c as i2c:
337-
i2c.write(bytes([register & 0xFF, value & 0xFF]))
338-
# print("$%02X <= 0x%02X" % (register, value))
321+
super().__init__(I2C_Impl(i2c, address))
339322

340323

341324
class Adafruit_BME280_SPI(Adafruit_BME280_Advanced):
@@ -387,23 +370,4 @@ class Adafruit_BME280_SPI(Adafruit_BME280_Advanced):
387370
"""
388371

389372
def __init__(self, spi: SPI, cs: DigitalInOut, baudrate: int = 100000) -> None:
390-
from adafruit_bus_device import ( # pylint: disable=import-outside-toplevel
391-
spi_device,
392-
)
393-
394-
self._spi = spi_device.SPIDevice(spi, cs, baudrate=baudrate)
395-
super().__init__()
396-
397-
def _read_register(self, register: int, length: int) -> bytearray:
398-
register = (register | 0x80) & 0xFF # Read single, bit 7 high.
399-
with self._spi as spi:
400-
spi.write(bytearray([register])) # pylint: disable=no-member
401-
result = bytearray(length)
402-
spi.readinto(result) # pylint: disable=no-member
403-
# print("$%02X => %s" % (register, [hex(i) for i in result]))
404-
return result
405-
406-
def _write_register_byte(self, register: int, value: int) -> None:
407-
register &= 0x7F # Write, bit 7 low.
408-
with self._spi as spi:
409-
spi.write(bytes([register, value & 0xFF])) # pylint: disable=no-member
373+
super().__init__(SPI_Impl(spi, cs, baudrate))

adafruit_bme280/basic.py

Lines changed: 7 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
from time import sleep
3535

3636
from micropython import const
37+
from adafruit_bme280.protocol import I2C_Impl, SPI_Impl
3738

3839
try:
3940
import typing # pylint: disable=unused-import
@@ -88,9 +89,10 @@ class Adafruit_BME280:
8889
"""
8990

9091
# pylint: disable=too-many-instance-attributes
91-
def __init__(self) -> None:
92+
def __init__(self, bus_implementation: typing.Union[I2C_Impl, SPI_Impl]) -> None:
9293
"""Check the BME280 was found, read the coefficients and enable the sensor"""
9394
# Check device ID.
95+
self._bus_implementation = bus_implementation
9496
chip_id = self._read_byte(_BME280_REGISTER_CHIPID)
9597
if _BME280_CHIPID != chip_id:
9698
raise RuntimeError("Failed to find BME280! Chip ID 0x%x" % chip_id)
@@ -309,10 +311,10 @@ def _read24(self, register: int) -> float:
309311
return ret
310312

311313
def _read_register(self, register: int, length: int) -> bytearray:
312-
raise NotImplementedError()
314+
return self._bus_implementation.read_register(register, length)
313315

314316
def _write_register_byte(self, register: int, value: int) -> None:
315-
raise NotImplementedError()
317+
self._bus_implementation.write_register_byte(register, value)
316318

317319

318320
class Adafruit_BME280_I2C(Adafruit_BME280):
@@ -363,24 +365,7 @@ class Adafruit_BME280_I2C(Adafruit_BME280):
363365
"""
364366

365367
def __init__(self, i2c: I2C, address: int = 0x77) -> None: # BME280_ADDRESS
366-
from adafruit_bus_device import ( # pylint: disable=import-outside-toplevel
367-
i2c_device,
368-
)
369-
370-
self._i2c = i2c_device.I2CDevice(i2c, address)
371-
super().__init__()
372-
373-
def _read_register(self, register: int, length: int) -> bytearray:
374-
with self._i2c as i2c:
375-
i2c.write(bytes([register & 0xFF]))
376-
result = bytearray(length)
377-
i2c.readinto(result)
378-
return result
379-
380-
def _write_register_byte(self, register: int, value: int) -> None:
381-
with self._i2c as i2c:
382-
i2c.write(bytes([register & 0xFF, value & 0xFF]))
383-
# print("$%02X <= 0x%02X" % (register, value))
368+
super().__init__(I2C_Impl(i2c, address))
384369

385370

386371
class Adafruit_BME280_SPI(Adafruit_BME280):
@@ -433,22 +418,4 @@ class Adafruit_BME280_SPI(Adafruit_BME280):
433418
"""
434419

435420
def __init__(self, spi: SPI, cs: DigitalInOut, baudrate: int = 100000) -> None:
436-
from adafruit_bus_device import ( # pylint: disable=import-outside-toplevel
437-
spi_device,
438-
)
439-
440-
self._spi = spi_device.SPIDevice(spi, cs, baudrate=baudrate)
441-
super().__init__()
442-
443-
def _read_register(self, register: int, length: int) -> bytearray:
444-
register = (register | 0x80) & 0xFF # Read single, bit 7 high.
445-
with self._spi as spi:
446-
spi.write(bytearray([register])) # pylint: disable=no-member
447-
result = bytearray(length)
448-
spi.readinto(result) # pylint: disable=no-member
449-
return result
450-
451-
def _write_register_byte(self, register: int, value: int) -> None:
452-
register &= 0x7F # Write, bit 7 low.
453-
with self._spi as spi:
454-
spi.write(bytes([register, value & 0xFF])) # pylint: disable=no-member
421+
super().__init__(SPI_Impl(spi, cs, baudrate))

adafruit_bme280/protocol.py

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
# SPDX-FileCopyrightText: 2022 Randall Bohn (dexter)
2+
#
3+
# SPDX-License-Identifier: MIT
4+
"Provides the protocol objects for I2C and SPI"
5+
6+
from busio import I2C, SPI
7+
from digitalio import DigitalInOut
8+
9+
10+
class I2C_Impl:
11+
"Protocol implementation for the I2C bus."
12+
13+
def __init__(self, i2c: I2C, address: int) -> None:
14+
from adafruit_bus_device import ( # pylint: disable=import-outside-toplevel
15+
i2c_device,
16+
)
17+
18+
self._i2c = i2c_device.I2CDevice(i2c, address)
19+
20+
def read_register(self, register: int, length: int) -> bytearray:
21+
"Read from the device register."
22+
with self._i2c as i2c:
23+
i2c.write(bytes([register & 0xFF]))
24+
result = bytearray(length)
25+
i2c.readinto(result)
26+
return result
27+
28+
def write_register_byte(self, register: int, value: int) -> None:
29+
"Write to the device register."
30+
with self._i2c as i2c:
31+
i2c.write(bytes([register & 0xFF, value & 0xFF]))
32+
33+
34+
class SPI_Impl:
35+
"Protocol implemenation for the SPI bus."
36+
37+
def __init__(self, spi: SPI, cs: DigitalInOut, baudrate: int = 100000) -> None:
38+
from adafruit_bus_device import ( # pylint: disable=import-outside-toplevel
39+
spi_device,
40+
)
41+
42+
self._spi = spi_device.SPIDevice(spi, cs, baudrate=baudrate)
43+
44+
def read_register(self, register: int, length: int) -> bytearray:
45+
"Read from the device register."
46+
register = (register | 0x80) & 0xFF # Read single, bit 7 high.
47+
with self._spi as spi:
48+
spi.write(bytearray([register])) # pylint: disable=no-member
49+
result = bytearray(length)
50+
spi.readinto(result) # pylint: disable=no-member
51+
# print("$%02X => %s" % (register, [hex(i) for i in result]))
52+
return result
53+
54+
def write_register_byte(self, register: int, value: int) -> None:
55+
"Write value to the device register."
56+
register &= 0x7F # Write, bit 7 low.
57+
with self._spi as spi:
58+
spi.write(bytes([register, value & 0xFF])) # pylint: disable=no-member

0 commit comments

Comments
 (0)