Arduino a Tcl/Tk, časť 3 - HMI | klávesnica
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!
Pre pridávanie komentárov sa musíte prihlásiť.
Napísané stručne, jasne a zrozumiteľne. Paráda Rišo.