-
Notifications
You must be signed in to change notification settings - Fork 0
/
I2C.py
51 lines (47 loc) · 1.48 KB
/
I2C.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
import smbus
import logging
import traceback
import inspect
class I2C:
def __init__(self, address, relay=None):
self.address = address
self.relay = relay
self.i2c = smbus.SMBus(1)
self.CheckCRC = False
def Send(self, command, data = []):
if self.relay != None and not self.relay.Enabled:
return
for i in range(len(data)):
if data[i] < 0:
data[i] = 0
if data[i] > 255:
data[i] = 255
packet = [command, len(data)] + data
crc = self.CRC(packet)
bytes = [len(data)] + data + [crc]
attempts = 5
for i in range(attempts):
try:
self.i2c.write_i2c_block_data(self.address, command, bytes)
if self.CheckCRC:
check = self.i2c.read_byte(self.address)
if crc == check:
break
else:
continue
else:
break
except IOError:
if i == attempts - 1:
caller = inspect.stack()[1]
logging.warning(caller[1] + " " + caller[3] + "\n" + traceback.format_exc())
def CRC(self, data):
crc = 0x00
for d in data:
for i in range(8):
sum = (crc ^ d) & 0x01
crc >>= 1
if sum:
crc ^= 0x8C
d >>= 1
return crc