rm-hull / luma.examples

Companion repo for running examples against the luma.oled, luma.lcd, luma.led_matrix and luma.emulator display drivers.
MIT License
370 stars 144 forks source link

ht1621 demo error #72

Open thijstriemstra opened 6 years ago

thijstriemstra commented 6 years ago

Error when trying the demo:

$ python examples/sevensegment_demo.py -d ht1621
/home/rpitest/pi-test/luma.core/luma/core/interface/serial.py:164: RuntimeWarning: This channel is already in use, continuing anyway.  Use GPIO.setwarnings(False) to disable warnings.
  self._gpio.setup(pin, self._gpio.OUT)
Traceback (most recent call last):
  File "luma.examples/examples/sevensegment_demo.py", line 115, in <module>
    main()
  File "luma.examples/examples/sevensegment_demo.py", line 70, in main
    device = get_device()
  File "/home/rpitest/pi-test/luma.examples/examples/demo_opts.py", line 61, in get_device
    device = cmdline.create_device(args)
  File "/home/rpitest/pi-test/luma.core/luma/core/cmdline.py", line 176, in create_device
    device = Device(spi, **vars(args))
TypeError: __init__() got multiple values for argument 'gpio'
rm-hull commented 6 years ago

Just refreshing myself with that driver code and noticed your comment - https://github.com/rm-hull/luma.lcd/pull/45#issuecomment-296324693

Presume you're on python3?

thijstriemstra commented 6 years ago

Yep.

rm-hull commented 6 years ago

So it looks like the ht1621 doesn't quite conform to the same interface as the other drivers, and because gpio is marked as a positional argument, but it looks like the cmdline parser passes it as a keyword argument, hence the error you reported.

Presumably if you write a simple test program as described in https://luma-lcd.readthedocs.io/en/latest/python-usage.html#seven-segment-drivers, the driver works?

I think one possible 'fix' for this would be to change the constructor to be:

    def __init__(self, serial_interface=None, width=6, rotate=0, WR=11, DAT=10, CS=8, **kwargs):
        super(ht1621, self).__init__(luma.lcd.const.ht1621, noop())
        self.capabilities(width, 8, rotate)
        self.segment_mapper = dot_muncher
        self._gpio = kwargs.get('gpio') or self.__rpi_gpio__()

This should be compatible with the cmdline/demo-opts and continue to work for direct invocation, but I'm not in a position to test this at the moment, could you try it?

rm-hull commented 6 years ago

As to your other comment, in the headline about a missing config: as everything is defaulted in the constructor, the only thing a config file would contain is:

-d ht1621

We can add it if you like?

thijstriemstra commented 6 years ago

Presumably if you write a simple test program as described in https://luma-lcd.readthedocs.io/en/latest/python-usage.html#seven-segment-drivers, the driver works?

Yep!

but I'm not in a position to test this at the moment, could you try it?

Same here, but will do.

We can add it if you like?

Sound good (for newbies).

thijstriemstra commented 6 years ago

Created #75 for the config file, still need to test the suggested fix for that error.

thijstriemstra commented 6 years ago

Closed too soon, that PR shouldn't have closed this.

thijstriemstra commented 6 years ago

@rm-hull tried your fix and getting the same error:

$ python examples/sevensegment_demo.py -d ht1621
Version: luma.lcd 1.0.3 (luma.core 1.2.1)
Display: ht1621
Interface: i2c
Dimensions: 128 x 64
------------------------------------------------------------
/home/rpitest/pi-test/luma.core/luma/core/interface/serial.py:164: RuntimeWarning: This channel is already in use, continuing anyway.  Use GPIO.setwarnings(False) to disable warnings.
  self._gpio.setup(pin, self._gpio.OUT)
Traceback (most recent call last):
  File "examples/sevensegment_demo.py", line 121, in <module>
    main()
  File "examples/sevensegment_demo.py", line 71, in main
    device = get_device()
  File "/home/rpitest/pi-test/luma.examples/examples/demo_opts.py", line 63, in get_device
    device = cmdline.create_device(args)
  File "/home/rpitest/pi-test/luma.core/luma/core/cmdline.py", line 176, in create_device
    device = Device(spi, **vars(args))
TypeError: __init__() got multiple values for argument 'gpio'

the traceback also doesn't refer to luma.lcd specifically, hence the fix doesn't work?

patch I used:

diff --git a/luma/lcd/device.py b/luma/lcd/device.py
index a9f518a..b80df97 100644
--- a/luma/lcd/device.py
+++ b/luma/lcd/device.py
@@ -270,7 +270,7 @@ class ht1621(device):
         super(ht1621, self).__init__(luma.lcd.const.ht1621, noop())
         self.capabilities(width, 8, rotate)
         self.segment_mapper = dot_muncher
-        self._gpio = gpio or self.__rpi_gpio__()
+        self._gpio = kwargs.get('gpio') or self.__rpi_gpio__()

         self._WR = self._configure(WR)
         self._DAT = self._configure(DAT)
rm-hull commented 6 years ago

Also the constructor in the suggested fix different:

-def __init__(self, gpio=None, width=6, rotate=0, WR=11, DAT=10, CS=8, **kwargs):
+def __init__(self, serial_interface=None, width=6, rotate=0, WR=11, DAT=10, CS=8, **kwargs):
thijstriemstra commented 6 years ago

ah! let me check.

That got rid of the error but the demo prints weird characters..

$ python examples/sevensegment_demo.py -d ht1621
Version: luma.lcd 1.0.3 (luma.core 1.2.1)
Display: ht1621
Interface: i2c
Dimensions: 128 x 64
------------------------------------------------------------
/home/rpitest/pi-test/luma.core/luma/core/interface/serial.py:164: RuntimeWarning: This channel is already in use, continuing anyway.  Use GPIO.setwarnings(False) to disable warnings.
  self._gpio.setup(pin, self._gpio.OUT)
/home/rpitest/pi-test/luma.lcd/luma/lcd/aux.py:36: RuntimeWarning: This channel is already in use, continuing anyway.  Use GPIO.setwarnings(False) to disable warnings.
  self._gpio.setup(self._gpio_LIGHT, self._gpio.OUT)
Simple text...
Digit slicing
rm-hull commented 6 years ago

If the demo is printing weird characters then that implies the segments on your board are wired up differently, and that we need a different segment mapper that that provided: https://github.com/rm-hull/luma.lcd/blob/master/luma/lcd/segment_mapper.py

I remember having to implement a translation layer for the NeoSegments (see https://github.com/rm-hull/luma.led_matrix/blob/master/luma/led_matrix/device.py#L512-L538) - maybe we need something similar here?

thijstriemstra commented 6 years ago

@rm-hull you have a copy of this device as well right? Could you give it a try at some point?

thijstriemstra commented 6 years ago

ps. using suggested code (and not the examples) worked fine for me (only tested numerals though).