Talk Script: Python, asyncio, libgpiod, and Pointless Blinking

gpiod Intro

  • gpiod basics, Box

    • Show center on/off

    • Quickly explain request_lines() (request.set_value() vs. request.set_values())

    • Show blink.glt2024.box

    • Use Box.matrix

    • insert snippets/blink, and use it

asyncio Intro

  • threading

    • insert snippets/threads

    • strace -f ... ⟶ PIDs

    • Complain about threads

  • Change to asyncio

  • strace -f ... again ⟶ no PIDs

gpiod, And Interrupts

  • blink.base.sleep: timer event

  • Other events? ⟶ interrupt on GPIO line

  • Show blueprints/gpiod-interrupts.py

  • Discuss edges, timestamps, bouncing

  • FALLING, debounce_period

  • Transform into generator, events()

Nice, Pythonic!

gpiod, Interrupts, and asyncio

  • async def main(); simply iterate over events()

  • ⟶ works

  • Second button, 19? Hm, tasks.

  • Wrap events() iteration in print_events()

  • Make print_events() async

  • In main(), create two tasks around print_events()

  • ⟶ one works, the other not

We block! Aha, async all over

  • Question: how make events() async? asynchronous generator?

  • Future, loops, blah

And blink?

  • Show wait_button

  • back in blink-demo.py, replace sleep(3) with wait_button()

textual

python-sdbus

Start the server:

$ ./dbus-blink-server.py

On another terminal, use busctl

$ busctl --user list
$ busctl --user introspect <TAB>
$ busctl --user call ...