1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
|
from unittest import TestCase
from unittest.mock import patch
import binascii
import bme280
import machine
import asyncio as uasyncio
# smbus.SMBus
class SMBusMock:
def __init__(self, bus):
assert bus == 42
def close(self):
pass
def write_i2c_block_data(self, addr, reg, data):
pass
def read_i2c_block_data(self, addr, reg, length):
if reg == 0xD0 and length == 1: # id
return [ 0x60, ]
if reg == 0x88 and length == 26: # cal burst 1
return list(binascii.unhexlify("04719f673200198a4dd6d00bc419fafff9ff0c3020d18813004b"))
if reg == 0xE1 and length == 7: # cal burst 2
return list(binascii.unhexlify("5a01001626031e"))
if reg == 0xF7 and length == 8: # value burst
return list(binascii.unhexlify("5e962085efc07bd2"))
return [ 0, ] * length
# machine.I2C
class I2CMock(SMBusMock):
def __init__(self, index=None, scl=None, sda=None, freq=None):
if index is not None:
assert index == 42
assert freq is not None
if isinstance(scl, PinMock):
assert scl._pin == 11
if isinstance(scl, int):
assert scl == 11
if isinstance(sda, PinMock):
assert sda._pin == 12
if isinstance(sda, int):
assert sda == 12
def deinit(self):
pass
def writeto_mem(self, addr, reg, data):
self.write_i2c_block_data(addr, reg, data)
def readfrom_mem(self, addr, reg, length):
return bytes(self.read_i2c_block_data(addr, reg, length))
# machine.SoftI2C
class SoftI2CMock(I2CMock):
def __init__(self, **kwargs):
assert "index" not in kwargs
I2CMock.__init__(self, **kwargs)
# machine.Pin
class PinMock:
OPEN_DRAIN = object()
def __init__(self, pin, mode, value):
assert mode == self.OPEN_DRAIN
assert value == 1
self._pin = pin
class Test_I2CDummy(TestCase):
@patch("bme280.bme280.isMicropython", False)
@patch("smbus.SMBus", SMBusMock)
def test_linux(self):
with bme280.BME280(i2cBus=42) as bme:
t, h, p = bme.readForced(filter=bme280.FILTER_4,
tempOversampling=bme280.OVSMPL_4,
humidityOversampling=bme280.OVSMPL_16,
pressureOversampling=bme280.OVSMPL_4)
self.assertTrue(t > 0 and h > 0 and p > 0)
with bme280.BME280(i2cBus=42, calc=bme280.CALC_INT32) as bme:
t, h, p = bme.readForced()
self.assertAlmostEqual(t, 27.099998, places=4)
self.assertAlmostEqual(h, 0.451729, places=4)
self.assertAlmostEqual(p, 98484.001160, places=1)
with bme280.BME280(i2cBus=42, calc=bme280.CALC_INT64) as bme:
t, h, p = bme.readForced()
self.assertAlmostEqual(t, 27.099998, places=4)
self.assertAlmostEqual(h, 0.451729, places=4)
self.assertAlmostEqual(p / 100, 984.84001160, places=1)
with bme280.BME280(i2cBus=42, calc=bme280.CALC_FLOAT) as bme:
t, h, p = bme.readForced()
self.assertAlmostEqual(t, 27.099998, places=1)
self.assertAlmostEqual(h, 0.451729, places=2)
self.assertAlmostEqual(p / 100, 984.84001160, places=1)
@patch("bme280.bme280.isMicropython", True)
@patch("machine.I2C", I2CMock, create=True)
@patch("machine.SoftI2C", SoftI2CMock, create=True)
@patch("machine.Pin", PinMock, create=True)
def test_micropython(self):
with bme280.BME280(i2cBus=42) as bme:
t, h, p = bme.readForced()
self.assertTrue(t > 0 and h > 0 and p > 0)
with bme280.BME280(i2cBus={ "index": 42, "scl": 11, "sda": 12 }) as bme:
t, h, p = bme.readForced()
self.assertTrue(t > 0 and h > 0 and p > 0)
with bme280.BME280(i2cBus={ "scl": 11, "sda": 12 }) as bme:
t, h, p = bme.readForced()
self.assertTrue(t > 0 and h > 0 and p > 0)
with bme280.BME280(i2cBus=machine.I2C(42, scl=11, sda=12, freq=100000)) as bme:
t, h, p = bme.readForced()
self.assertTrue(t > 0 and h > 0 and p > 0)
with bme280.BME280(i2cBus=machine.I2C(42,
scl=machine.Pin(11, mode=machine.Pin.OPEN_DRAIN, value=1),
sda=machine.Pin(12, mode=machine.Pin.OPEN_DRAIN, value=1),
freq=100000)) as bme:
t, h, p = bme.readForced()
self.assertTrue(t > 0 and h > 0 and p > 0)
# Test async
async def coroutine_():
async with bme280.BME280(i2cBus=42) as bme:
t, h, p = await bme.readForcedAsync()
self.assertTrue(t > 0 and h > 0 and p > 0)
uasyncio.run(coroutine_())
# Normal mode
with bme280.BME280(i2cBus=42) as bme:
bme.start(mode=bme280.MODE_NORMAL,
standbyTime=bme280.T_SB_10ms)
# Other methods
with bme280.BME280(i2cBus=42) as bme:
bme.readForced()
self.assertFalse(bme.isMeasuring())
bme.reset()
# vim: ts=4 sw=4 expandtab
|