-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathiic.py
75 lines (60 loc) · 2.66 KB
/
iic.py
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
from mma8451.register.classes import Register, Flag
from threading import Lock
from typing import Tuple
class IIC():
def __init__(self, pigpio_pi, iic_dev : int, iic_addr : int):
self.pi = pigpio_pi
self.iic_addr = iic_addr
self.iic = self.pi.i2c_open(iic_dev, iic_addr)
self.lock = Lock()
def _write_register(self, register : int, data : int):
self.lock.acquire()
self.pi.i2c_write_byte_data(self.iic, register, data)
self.lock.release()
def _read_register(self, register : int) -> int:
self.lock.acquire()
data = self.pi.i2c_read_byte_data(self.iic, register)
self.lock.release()
return data
def _block_read2(self, register : int, length : int) -> Tuple[int, bytes]:
self.lock.acquire()
data = self.pi.i2c_zip(self.iic,
[4, self.iic_addr, 7, 1, register, 6, length, 0])
self.lock.release()
return data
def _block_read(self, register : int, length : int) -> Tuple[int, bytes]:
self.lock.acquire()
data = self.pi.i2c_read_i2c_block_data(self.iic, register, length)
self.lock.release()
return data
def write_register(self, register : Register, data : int):
self._write_register(register._addr, data)
def read_register(self, register : Register) -> int:
return self._read_register(register._addr)
def block_read(self, offset : Register, length : int) -> bytes:
if length > 32:
data_size, data = self._block_read2(offset._addr, length)
else:
data_size, data = self._block_read(offset._addr, length)
if data_size < 0:
raise OSError('Error ' + str(data_size) + ': unable to read i2c block data')
return data
def _set_flag(self, register : int, flag : int):
self._write_register(register, self._read_register(register) | flag)
def _unset_flag(self, register : int, flag : int):
self._write_register(register, self._read_register(register) & ~flag)
def set_flag(self, regorflag, flag : int = None):
if flag is None: flag = regorflag
self._set_flag(regorflag._addr, flag)
def unset_flag(self, regorflag, flag : int = None):
if flag is None: flag = regorflag
self._unset_flag(regorflag._addr, flag)
@staticmethod
def check_flag(bitfield : int, flag : int) -> bool:
if flag == 0:
raise ValueError("Flag does not have any bits set!")
return (bitfield & flag) != 0
def read_flag(self, flag : Flag) -> bool:
return self.check_flag(self.read_register(flag._addr), flag)
def close(self):
self.pi.i2c_close(self.iic)