[libgpiod][PATCH] bindings: python: fix LineRequest.set_value only works for the last entry

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



From: Chuang Zhu <git@xxxxxxxxx>

When multiple entries are requested using line names in
Chip.request_lines, only the the last entry is added to
LineRequest._name_map, causing a ValueError when trying to use
LineRequest.set_value on any former entries.

>>> import gpiod
>>> lr = gpiod.Chip('/dev/gpiochip0').request_lines(
...     config={
...         'LINE0': gpiod.LineSettings(direction=gpiod.line.Direction.OUTPUT,
...                                     output_value=gpiod.line.Value.INACTIVE),
...         'LINE2': gpiod.LineSettings(direction=gpiod.line.Direction.OUTPUT, active_low=True,
...                                     output_value=gpiod.line.Value.ACTIVE),
...     }
... )
>>> lr._name_map
{'LINE2': 2}
>>> lr.set_value('LINE0', gpiod.line.Value.ACTIVE)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File ".../gpiod/line_request.py", line 126, in set_value
    self.set_values({line: value})
  File ".../gpiod/line_request.py", line 138, in set_values
    mapped = {
             ^
  File ".../gpiod/line_request.py", line 139, in <dictcomp>
    self._name_map[line] if self._check_line_name(line) else line: values[line]
                            ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File ".../gpiod/line_request.py", line 82, in _check_line_name
    raise ValueError("unknown line name: {}".format(line))
ValueError: unknown line name: LINE0

Signed-off-by: Chuang Zhu <git@xxxxxxxxx>
---
 bindings/python/gpiod/chip.py | 9 +++++----
 1 file changed, 5 insertions(+), 4 deletions(-)

diff --git a/bindings/python/gpiod/chip.py b/bindings/python/gpiod/chip.py
index b3d8e61..ce77d27 100644
--- a/bindings/python/gpiod/chip.py
+++ b/bindings/python/gpiod/chip.py
@@ -279,11 +279,12 @@ class Chip:
         else:
             mapped_output_values = None
 
+        offsets = list()
+        name_map = dict()
+        offset_map = dict()
+        global_output_values = list()
+
         for lines, settings in config.items():
-            offsets = list()
-            name_map = dict()
-            offset_map = dict()
-            global_output_values = list()
 
             if isinstance(lines, int) or isinstance(lines, str):
                 lines = (lines,)
-- 
2.44.0





[Index of Archives]     [Linux SPI]     [Linux Kernel]     [Linux ARM (vger)]     [Linux ARM MSM]     [Linux Omap]     [Linux Arm]     [Linux Tegra]     [Fedora ARM]     [Linux for Samsung SOC]     [eCos]     [Linux Fastboot]     [Gcc Help]     [Git]     [DCCP]     [IETF Announce]     [Security]     [Linux MIPS]     [Yosemite Campsites]

  Powered by Linux