Arduino a Tcl/Tk, časť 3 - HMI | klávesnica

22.11.2023 | 13:07 | Richard | Richard

Dizajn a funkcionalitu vzdialenej HMI obrazovky pre arduino máme zvládnutú. Dnes si ukážeme, ako na dotykovej obrazovke zadávať údaje pomocu virtuálnej klávesnice.

Obsah minulej časti

V minulej, teda druhej časti sme si vytvorili grafický interfejs a.k.a. HMI v jazyku Tcl/Tk. Dnes si k nemu pridáme ešte virtuálnu klávesnicu.

Klávesnice takové i makové

Keďže naše HMI beží v spolupráci s Raspberry Pi, tak najjednoduchším riešením by bolo pripojenie USB klávesnice. Alebo hoci aj nejakej malej bluetooth klávesnice, aké existujú pre chytré TV. To by fungovalo bez problémov.

Ale keď už máme tú dotykovú vrstvu, škoda by bolo používať na občasné zadanie parametrov nejaké ďalšie zariadenie. Najmä, ak v priemyselných strojoch existuje prax, že sa spravia nejaké nastavenia a predvoľby a tie sa potom používajú bez ďalších, alebo len veľmi zriedkavých úprav.

Onboard klávesnica

Virtulánych klávesníc existuje pre Raspberry Pi niekoľko. Námatkou spomeňme Florence alebo Matchbox.
Ale najviac sa mi páči Onboard. Je veľmi konfigurovateľná a je v repozitároch operačného systému.

Nainštalujeme ju známym postupom:
sudo apt install onboard

V hlavnom menu v sekcii "Pre postihnutých" ju nájdeme pod názvom "Klávesnica na obrazovke". Teda v slovenskej mutácii Raspbianu (snímky obrazovky sú v VNC klienta v nenatívnom rozlíšení obrazovky).


Obr. 0: Spustenie virtuálnej klávesnice
 

Ak sa ju nepodarí spustiť, spustíme ju z emulátora terminálu a pravdepodobne nám bude chýbať at-spi2-core, ktoré doinštalujeme:
sudo apt install at-spi2-core

A do tretice, ak chceme, aby nám obrazovka "vyskakovala", ak sme v editačnom dialógu, doinštalujeme mousetweaks:
sudo apt install mousetweaks


Spustíme si potom náš program, klikneme do editačného okienka spinbox-u a… nič sa nedeje, klávesnica "nevyskočí", aj keď je spustená.
A pritom, v textovom editore to ide… tak kde je problém?


Obr. 1: V textovom editore "mousepad" to funguje…

No problém spočíva v tom, že samotný balík AT-SPI, ktorý zahrňuje asistenčné technológie (patria tu lupy, čítačky obrazovky, klávesnice na obrazovke, braillovo písmo…) používa tzv. D-Bus, čo je spôsob vzájomnej komunikácie aplikácií. A to ide - keďže je to "dieťa" GNOME - ak sa využíva toolkit GTK.

Ale Tcl/Tk používa toolkit Tkinter, a ten D-Bus nevie detegovať.

Preto nám neostáva nič iné, len to nejako priohnúť 🤔.

 

Program v Tcl/Tk

Riešenie je pomerne jednoduché - zistiť, či sa kliklo na editačné pole, a ak áno, tak klávesnicu spustiť.

Zadefinujeme si pár premenných:

set prikazKlavesnice "onboard &"
set timeoutKillKeyboard 10000

Premenná prikazKlavesnice definuje samotnú spustiteľnú binárku, ak je klasicky (čo na 99% bude) v /usr/bin, a toto je definované v globálnych nastaveniach ciest v operačnom systéme, tak nie je potrebné určiť presnú cestu.
& na konci je tam samozrejme preto, aby sa program spustil na pozadí.
Premenná timeoutKillKeyboard definuje čas v ms, po ktorom sa, ak sa klávesnica nepoužíva, schová.

Ďalšie procedúry sú zrejmé z opisu či názvu:

proc killProcessKeyboard {} {
    global prikazKlavesnice
    set prikazKill "killall "
    append spojene $prikazKill $prikazKlavesnice
    exec {*}$spojene
}


proc onSpinBoxClick {} {
    global prikazKlavesnice timeoutKillKeyboard
    set prikazGrep "ps ax | grep -c "
    append spojene $prikazGrep $prikazKlavesnice
    set psOutput [exec {*}[string replace $spojene end-1 end ""]]
    if {$psOutput ne "1"} {
        puts "Program už beží!"
    } else {
        puts "Program ešte nebeží!"
        exec {*}$prikazKlavesnice
        after $timeoutKillKeyboard killProcessKeyboard
    }
}

Procedúra killProcessKeyboard zabije zobrazenú klávesnicu, procedúra onSpinBoxClick ju naopak zobrazí, ak sa do neho klikne.
Napohľad nepekná konštrukcia [exec {*}[string replace $spojene end-1 end ""]] spôsobí to, že zo spojeného reťazca, v ktorom je názov bežiaceho procesu a tiež príkaz grep -c, na zistenie počtu inštancií klávesnice, odreže & na konci. Následne porovnáva, koľko týchto grep-ov našiel. Len na okraj - vždy nájde o jeden viac - pretože nájde aj samotný proces oného aktuálneho grep-u.
 

A niekde to definície dizajnu okna vložíme samotné prepojenie udalosti kliknutia na samotný prvok, teda náš spinBox.
 

bind .spinInterval <Button-1> {onSpinBoxClick}

No a takto to (neprekvapivo) vyzerá v praxi:

Obr. 2: HMI a zobrazená klávesnica


Obr. 2a: HMI a iný dizajn klávesnice


Obr. 2b: Fotka z reálneho života ☺.
 

Klávesnica i rozloženie môže mať kdejaký dizajn, výber je bohatý a dá sa všemožne upraviť. Napr. na dizajn kultovej klávesnice IBM Model M.

Odkaz na stiahnutie: https://gitlab.com/tcl-tk-public/arduino-hmi-lan
(priamy odkaz: https://gitlab.com/tcl-tk-public/arduino-hmi-lan/-/blob/main/arduino_RPi_LAN_klavesnica.tcl)

Obsah ďalšej časti

Aby sme si prácu pri zobrazovaní požiadaviek arduina voči HMI zjednodušili, plánujem vytvoriť knižnicu (knižnice), ktoré budú používaním blízke ovládaniu LCD displeja. Takže nejaká alternatíva k lcd.print() či lcd.setCursor(cols, rows).
No uvidíme, ako sa to podarí.

Happy hacking!

    • RE: Arduino a Tcl/Tk, časť 3 - HMI | klávesnica 23.11.2023 | 08:11
      Avatar vxmery Mint 21.3 Cinnamon  Používateľ

      Napísané stručne, jasne a zrozumiteľne. Paráda Rišo.