88
99DEFAULT_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
3145EXTENSION_CONF_IO = 0x01
3246EXTENSION_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