Skip to content
This repository was archived by the owner on Nov 23, 2025. It is now read-only.

Commit b31241e

Browse files
committed
Adding the AIO/DIO functionality.
1 parent fc89397 commit b31241e

5 files changed

Lines changed: 37 additions & 59 deletions

File tree

CHANGES.rst

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,12 @@ Version 0.5.0
1515
reset details are obtained from.
1616
* Enabling volatile instructions on arduino devices as this is now
1717
available at the firmware level.
18+
* Removed volatility from get_adc_input as this doesn't apply to that
19+
function.
20+
* Removing the concept of separate analog and digital pins.
21+
If these are distinct then the analog should be aliased as virtual higher
22+
index pins.
23+
* Fixed a bug where get compatible pins wasn't verifying requirements.
1824

1925
Version 0.4.0
2026
-------------

tests/test_devices.py

Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -31,20 +31,3 @@ def test_get_compatible_pins(uos_device: UOSDevice):
3131
uos_device.device.get_compatible_pins(
3232
UOSFunction(name="bad_function", address_lut={}, ack=False)
3333
)
34-
35-
36-
def test_pin_aliases(uos_device: UOSDevice):
37-
"""Makes sure all aliases are defined bidirectionally."""
38-
# Check digital pins have valid analog aliases and vice-versa.
39-
for pin_mapping in (
40-
(uos_device.device.digital_pins, uos_device.device.analog_pins),
41-
(uos_device.device.analog_pins, uos_device.device.digital_pins),
42-
):
43-
for pin_number in pin_mapping[0]:
44-
pin = pin_mapping[0][pin_number]
45-
if pin.alias is not None:
46-
assert isinstance(pin.alias, int)
47-
assert pin.alias in pin_mapping[1]
48-
alias = pin_mapping[1][pin.alias]
49-
assert alias.alias is not None
50-
assert alias.alias == pin_number

uoshardware/abstractions.py

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -240,7 +240,7 @@ class Pin:
240240
adc_in: bool = False
241241
pull_up: bool = False
242242
pull_down: bool = False
243-
alias: int | None = None
243+
aliases: list = field(default_factory=list)
244244

245245

246246
@dataclass(frozen=True)
@@ -250,8 +250,7 @@ class Device:
250250
name: str
251251
interfaces: list
252252
functions_enabled: dict
253-
digital_pins: dict = field(default_factory=dict)
254-
analog_pins: dict = field(default_factory=dict)
253+
pins: dict = field(default_factory=dict)
255254
aux_params: dict = field(default_factory=dict)
256255

257256
def get_compatible_pins(self, function: UOSFunction) -> dict:
@@ -265,12 +264,12 @@ def get_compatible_pins(self, function: UOSFunction) -> dict:
265264
or function not in UOSFunctions.enumerate_functions()
266265
):
267266
raise UOSUnsupportedError(f"UOS function {function.name} doesn't exist.")
268-
requirements = function.pin_requirements
269-
if requirements is None: # pins are not relevant to this function
267+
if function.pin_requirements is None: # pins are not relevant to this function
270268
return {}
271-
pin_dict = self.analog_pins if "adc_in" in requirements else self.digital_pins
272269
return {
273-
pin_name: pin
274-
for pin_name, pin in pin_dict.items()
275-
if all(hasattr(pin, requirement) for requirement in requirements)
270+
pin_index: pin
271+
for pin_index, pin in self.pins.items()
272+
if all(
273+
getattr(pin, requirement) for requirement in function.pin_requirements
274+
)
276275
}

uoshardware/api.py

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ class UOSDevice: # dead: disable
5151
5252
:ivar device: Device definitions as parsed from a compatible ini.
5353
:ivar identity: The type of device, this is must have a valid device in the config.
54-
:ivar connection: Compliant connection string for identifying the device and interface.
54+
:ivar address: Compliant connection string for identifying the device and interface.
5555
:ivar __device_interface: Lower level communication protocol layer.
5656
:ivar __kwargs: Connection specific / optional parameters.
5757
"""
@@ -165,21 +165,16 @@ def get_gpio_input(
165165
def get_adc_input(
166166
self,
167167
pin: int,
168-
volatility: Persistence = Persistence.NONE,
169168
) -> ComResult:
170169
"""Read the current 10 bit ADC value.
171170
172171
:param pin: The index of the analog pin to read
173-
:param volatility: How volatile should the command be, use constants from uoshardware.
174172
:return: ComResult object containing the ADC readings.
175173
"""
176174
return self.__execute_instruction(
177175
UOSFunctions.get_adc_input,
178176
InstructionArguments(
179-
payload=tuple([pin]),
180-
expected_rx_packets=2,
181-
check_pin=pin,
182-
volatility=volatility,
177+
payload=tuple([pin]), expected_rx_packets=2, check_pin=pin
183178
),
184179
)
185180

uoshardware/devices/_arduino.py

Lines changed: 21 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
UOSFunctions.get_system_info.name: [Persistence.NONE],
1616
UOSFunctions.get_gpio_config.name: [Persistence.NONE],
1717
},
18-
digital_pins={
18+
pins={
1919
2: Pin(gpio_out=True, gpio_in=True, pull_up=True),
2020
3: Pin(
2121
gpio_out=True,
@@ -60,32 +60,32 @@
6060
gpio_in=True,
6161
pull_up=True,
6262
),
63-
14: Pin(gpio_out=True, gpio_in=True, pull_up=True, alias=0),
64-
15: Pin(gpio_out=True, gpio_in=True, pull_up=True, alias=1),
65-
16: Pin(gpio_out=True, gpio_in=True, pull_up=True, alias=2),
66-
17: Pin(gpio_out=True, gpio_in=True, pull_up=True, alias=3),
63+
14: Pin(gpio_out=True, gpio_in=True, pull_up=True, aliases=["A0"], adc_in=True),
64+
15: Pin(gpio_out=True, gpio_in=True, pull_up=True, aliases=["A1"], adc_in=True),
65+
16: Pin(gpio_out=True, gpio_in=True, pull_up=True, aliases=["A2"], adc_in=True),
66+
17: Pin(gpio_out=True, gpio_in=True, pull_up=True, aliases=["A3"], adc_in=True),
6767
18: Pin(
6868
gpio_out=True,
6969
gpio_in=True,
7070
pull_up=True,
71-
alias=4,
71+
adc_in=True,
72+
aliases=["A4"],
7273
),
7374
19: Pin(
7475
gpio_out=True,
7576
gpio_in=True,
7677
pull_up=True,
77-
alias=5,
78+
adc_in=True,
79+
aliases=["A5"],
80+
),
81+
20: Pin(
82+
adc_in=True,
83+
aliases=["A6"],
84+
),
85+
21: Pin(
86+
adc_in=True,
87+
aliases=["A7"],
7888
),
79-
},
80-
analog_pins={
81-
0: Pin(adc_in=True, alias=14),
82-
1: Pin(adc_in=True, alias=15),
83-
2: Pin(adc_in=True, alias=16),
84-
3: Pin(adc_in=True, alias=17),
85-
4: Pin(adc_in=True, alias=18),
86-
5: Pin(adc_in=True, alias=19),
87-
6: Pin(adc_in=True),
88-
7: Pin(adc_in=True),
8989
},
9090
aux_params={"default_baudrate": 115200},
9191
)
@@ -95,15 +95,10 @@
9595
name="Arduino Uno 3",
9696
interfaces=_ARDUINO_NANO_3.interfaces,
9797
functions_enabled=_ARDUINO_NANO_3.functions_enabled,
98-
digital_pins=_ARDUINO_NANO_3.digital_pins,
99-
analog_pins={
100-
0: Pin(adc_in=True, alias=14),
101-
1: Pin(adc_in=True, alias=15),
102-
2: Pin(adc_in=True, alias=16),
103-
3: Pin(adc_in=True, alias=17),
104-
4: Pin(adc_in=True, alias=18),
105-
5: Pin(adc_in=True, alias=19),
106-
# Uno has 2 less ADCs pins than the nano.
98+
pins={ # Doesn't expose the addition mux'd ADCs.
99+
pin_index: value
100+
for pin_index, value in _ARDUINO_NANO_3.pins.items()
101+
if pin_index not in {20, 21}
107102
},
108103
aux_params={"default_baudrate": 115200},
109104
)

0 commit comments

Comments
 (0)