Skip to content

Commit 88d22ea

Browse files
author
Thomas Preston
committed
Added analogue channels
1 parent d1a530f commit 88d22ea

File tree

1 file changed

+70
-21
lines changed

1 file changed

+70
-21
lines changed

codebug_tether/core.py

Lines changed: 70 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -8,25 +8,39 @@
88

99
DEFAULT_SERIAL_PORT = '/dev/ttyACM0'
1010

11-
CHANNEL_INDEX_OUTPUT = 5
12-
CHANNEL_INDEX_LEG_INPUT = 6
13-
CHANNEL_INDEX_BUTTON_INPUT = 7
14-
CHANNEL_INDEX_IO_DIRECTION = 8
15-
CHANNEL_INDEX_PULLUPS = 9
16-
CHANNEL_INDEX_EXT_CONF = 10
17-
CHANNEL_INDEX_SPI_RATE = 11
18-
CHANNEL_INDEX_SPI_LENGTH = 12
19-
CHANNEL_INDEX_SPI_CONTROL = 13
20-
CHANNEL_INDEX_I2C_ADDR = 14
21-
CHANNEL_INDEX_I2C_LENGTH = 15
22-
CHANNEL_INDEX_I2C_CONTROL = 16
23-
CHANNEL_INDEX_UART_RX_OFFSET = 17
24-
CHANNEL_INDEX_UART_RX_LENGTH = 18
25-
CHANNEL_INDEX_UART_TX_OFFSET = 19
26-
CHANNEL_INDEX_UART_TX_LENGTH = 20
27-
CHANNEL_INDEX_UART_CONTROL = 21
28-
CHANNEL_INDEX_COLOURTAIL_LENGTH = 22
29-
CHANNEL_INDEX_COLOURTAIL_CONTROL = 23
11+
IO_DIGITAL_OUTPUT = 0
12+
IO_DIGITAL_INPUT = 1
13+
IO_ANALOG_INPUT = 2
14+
IO_PWM_OUTPUT = 3
15+
16+
# CHANNEL_INDEX_ROW_0 = 0
17+
# CHANNEL_INDEX_ROW_1 = 1
18+
# CHANNEL_INDEX_ROW_2 = 2
19+
# CHANNEL_INDEX_ROW_3 = 3
20+
# CHANNEL_INDEX_ROW_4 = 4
21+
(CHANNEL_INDEX_OUTPUT,
22+
CHANNEL_INDEX_LEG_INPUT,
23+
CHANNEL_INDEX_BUTTON_INPUT,
24+
CHANNEL_INDEX_ANALOGUE_INPUT_0,
25+
CHANNEL_INDEX_ANALOGUE_INPUT_1,
26+
CHANNEL_INDEX_ANALOGUE_INPUT_2,
27+
CHANNEL_INDEX_IO_DIRECTION_LEGS,
28+
CHANNEL_INDEX_IO_DIRECTION_EXT,
29+
CHANNEL_INDEX_PULLUPS,
30+
CHANNEL_INDEX_EXT_CONF,
31+
CHANNEL_INDEX_SPI_RATE,
32+
CHANNEL_INDEX_SPI_LENGTH,
33+
CHANNEL_INDEX_SPI_CONTROL,
34+
CHANNEL_INDEX_I2C_ADDR,
35+
CHANNEL_INDEX_I2C_LENGTH,
36+
CHANNEL_INDEX_I2C_CONTROL,
37+
CHANNEL_INDEX_UART_RX_OFFSET,
38+
CHANNEL_INDEX_UART_RX_LENGTH,
39+
CHANNEL_INDEX_UART_TX_OFFSET,
40+
CHANNEL_INDEX_UART_TX_LENGTH,
41+
CHANNEL_INDEX_UART_CONTROL,
42+
CHANNEL_INDEX_COLOURTAIL_LENGTH,
43+
CHANNEL_INDEX_COLOURTAIL_CONTROL) = range(5, 25)
3044

3145
EXTENSION_CONF_IO = 0x01
3246
EXTENSION_CONF_SPI = 0x02
@@ -88,6 +102,23 @@ def get_input(self, input_index):
88102
channel_index = CHANNEL_INDEX_LEG_INPUT
89103
return self.get_bit(channel_index, input_index)
90104

105+
def read_analogue(self, leg_index):
106+
"""Reads the analogue value of the leg at leg_index. The leg must
107+
first be configured as an analogue input. For example:
108+
109+
>>> codebug = CodeBug()
110+
>>> codebug.set_leg_io(0, IO_ANALOG_INPUT)
111+
>>> codebug.read_analogue(0)
112+
128
113+
114+
"""
115+
if leg_index == 0:
116+
return self.get(CHANNEL_INDEX_ANALOGUE_INPUT_0)
117+
elif leg_index == 1:
118+
return self.get(CHANNEL_INDEX_ANALOGUE_INPUT_1)
119+
elif leg_index == 2:
120+
return self.get(CHANNEL_INDEX_ANALOGUE_INPUT_2)
121+
91122
def set_pullup(self, input_index, state):
92123
"""Sets the state of the input pullups. Turn off to enable touch
93124
sensitive pads (bridge GND and input with fingers).
@@ -109,8 +140,26 @@ def get_output(self, output_index):
109140
return self.get_bit(CHANNEL_INDEX_OUTPUT, output_index)
110141

111142
def set_leg_io(self, leg_index, direction):
112-
"""Sets the I/O direction of the leg at index."""
113-
self.set_bit(CHANNEL_INDEX_IO_DIRECTION, leg_index, direction)
143+
"""Sets the I/O direction of the leg at index. For example:
144+
145+
>>> codebug = CodeBug()
146+
>>> codebug.set_leg_io(0, IO_DIGITAL_OUTPUT)
147+
>>> codebug.set_leg_io(0, IO_PWM_OUTPUT)
148+
>>> codebug.set_leg_io(1, IO_DIGITAL_INPUT)
149+
>>> codebug.set_leg_io(2, IO_ANALOG_INPUT)
150+
151+
"""
152+
if leg_index < 4:
153+
clear_mask = 0b11 << leg_index * 2
154+
direction_mask = (0b11 & direction) << leg_index * 2
155+
self.and_mask(CHANNEL_INDEX_IO_DIRECTION_LEGS, clear_mask)
156+
self.or_mask(CHANNEL_INDEX_IO_DIRECTION_LEGS, direction_mask)
157+
else:
158+
ext_index = leg_index - 4
159+
clear_mask = 0b11 << ext_index * 2
160+
direction_mask = (0b11 & direction) << ext_index * 2
161+
self.and_mask(CHANNEL_INDEX_IO_DIRECTION_EXT, clear_mask)
162+
self.or_mask(CHANNEL_INDEX_IO_DIRECTION_EXT, direction_mask)
114163

115164
def clear(self):
116165
"""Clears the pixels on CodeBug.

0 commit comments

Comments
 (0)