aboutsummaryrefslogtreecommitdiffstats
path: root/tests/test_i2c_dummy.py
blob: 0eee8278e29a22f7577456ecd8f4e4386a49edc5 (plain)
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
bues.ch cgit interface