]> Repositories - Adafruit_Blinka-hackapet.git/blob - python/bitbangio/__init__.py
Working I2C reference testcase on CircuitPython
[Adafruit_Blinka-hackapet.git] / python / bitbangio / __init__.py
1 from machine import Pin, I2C as _I2C
2
3 class I2C:
4     def __init__(self, scl, sda, frequency=400000):
5         self.init(scl, sda, frequency)
6
7     def init(self, scl, sda, frequency):
8         self.deinit()
9         id = -1 # force bitbanging implementation - in future introspect platform if SDA/SCL matches hardware I2C
10         self._i2c = _I2C(id, Pin(scl.id), Pin(sda.id), frequency)
11
12     def deinit(self):
13         try:
14             del self._i2c
15         except AttributeError:
16             pass
17
18     def __enter__(self):
19         return self
20
21     def __exit__(self, exc_type, exc_value, traceback):
22         self.deinit()
23
24     def scan(self):
25         return self._i2c.scan()
26
27     def try_lock(self):
28         if self._locked:
29             return False
30         else:
31             self._locked=True
32             return True
33
34     def unlock(self):
35         if self._locked:
36             self._locked = False
37         else:
38             raise ValueError("Not locked")
39
40     def readfrom_into(self, address, buffer, start=0, end=None):
41         if start is not 0 or end is not None:
42             if end is None:
43                 end = len(buffer)
44             buffer = memoryview(buffer)[start:end]
45         return self._i2c.readfrom_into(address, buffer, stop=False)
46
47     def writeto(self, address, buffer, start=0, end=None, stop=True):
48         if start is not 0 or end is not None:
49             if end is None:
50                 end = len(buffer)
51             buffer = memoryview(buffer)[start:end]
52         return self._i2c.writeto(address, buffer, stop)