-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathm5_8encoder.py
More file actions
90 lines (68 loc) · 2.69 KB
/
Copy pathm5_8encoder.py
File metadata and controls
90 lines (68 loc) · 2.69 KB
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
from machine import I2C
import struct
class M5_8Encoder:
ENCODERS = const(8)
LEDS = const(9)
def __init__(
self,
i2c: I2C,
address: int = 0x41,
):
self.address = address
self._i2c = i2c
def _read(self, mem_addr: int, num_bytes: int):
self._i2c.writeto(self.address, bytes([mem_addr]))
return self._i2c.readfrom(self.address, num_bytes)
def _write(self, mem_addr: int, data: bytes):
self._i2c.writeto_mem(self.address, mem_addr, data)
def read_counter(self, counter: int):
if not (0 <= counter < self.ENCODERS):
raise ValueError(
f"Invalid counter number {counter} (valid values: 0-{self.ENCODERS - 1})"
)
val = self._read(4 * counter, 4)
return struct.unpack("<i", val)[0]
def read_all_counters(self):
return [self.read_counter(i) for i in range(self.ENCODERS)]
def reset_counter(self, counter: int):
if not (0 <= counter < self.ENCODERS):
raise ValueError(
f"Invalid counter number {counter} (valid values: 0-{self.ENCODERS - 1})"
)
self._write(0x40 + counter, bytes([0xFF]))
def reset_all_counters(self):
self._write(0x40, bytes([0xFF] * self.ENCODERS))
def read_increment(self, counter: int):
if not (0 <= counter < self.ENCODERS):
raise ValueError(
f"Invalid increment number {counter} (valid values: 0-{self.ENCODERS - 1})"
)
val = self._read(0x20 + 4 * counter, 4)
return struct.unpack("<i", val)[0]
def read_all_increments(self):
return [self.read_increment(i) for i in range(self.ENCODERS)]
def read_button(self, button: int):
if not (0 <= button < self.ENCODERS):
raise ValueError(
f"Invalid button number {button} (valid values: 0-{self.ENCODERS - 1})"
)
val = self._read(0x50 + button, 1)
return struct.unpack("B", val)[0]
def read_all_buttons(self):
return [self.read_button(idx) for idx in range(self.ENCODERS)]
def read_switch(self):
val = self._read(0x60, 1)
return struct.unpack("B", val)[0]
def set_led(self, led: int, color: bytes):
if not (0 <= led < self.LEDS):
raise ValueError(
f"Invalid led number {led} (valid values: 0-{self.LEDS - 1})"
)
if len(color) != 3:
raise ValueError(
f"Colour must be a bytearray of lenth 3 (not {len(color)})"
)
self._write(0x70 + 3 * led, color)
def firmware_version(self):
val = self._read(0xFE, 1)
return struct.unpack("B", val)[0]