Aftelklokjes of timers zijn er in overvloed, maar wat als je een aftelklok nodig hebt die verschillende fasen in een proces moet begeleiden. Met een script heb je die zo in elkaar geknutseld.
Zo stond ik voor het volgende timerprobleem: een behandeling bestaat uit een voorbereidende fase van 8 minuten, gevolgd door de behandeling zelf van 6 sessies van telkens 1 minuut waarbij na elke minuut een handeling moet worden uitgevoerd.
Elke fase moet begeleid worden door visuele en auditieve meldingen. Dit kan zowel in een terminalvenster, maar ook grafisch.
Elk Desktop systeem heeft standaard een aantal geluiden aan boord. Zo gebruikt een openSUSE Leap 15.2 FreeDesktop en KDE geluiden, die je met de volgende opdrachten kunt beoordelen:
dany@main:~> ogg123 /usr/share/sounds/freedesktop/stereo/*.oga
Geluidsapparaat: PulseAudio Output
Afspelen: /usr/share/sounds/freedesktop/stereo/alarm-clock-elapsed.oga
Ogg-Vorbisstroom: 2 kanaal, 48000 Hz
Klaar.
Afspelen: /usr/share/sounds/freedesktop/stereo/audio-channel-front-center.oga
Ogg-Vorbisstroom: 1 kanaal, 48000 Hz
Klaar.
...
Afspelen: /usr/share/sounds/freedesktop/stereo/window-attention.oga
Ogg-Vorbisstroom: 2 kanaal, 44100 Hz
Klaar.
Afspelen: /usr/share/sounds/freedesktop/stereo/window-question.oga
Ogg-Vorbisstroom: 2 kanaal, 44100 Hz
Klaar.
En
dany@main:~> ogg123 /usr/share/sounds/Oxygen-*.ogg
Geluidsapparaat: PulseAudio Output
Afspelen: /usr/share/sounds/Oxygen-Im-Cant-Connect.ogg
Ogg-Vorbisstroom: 2 kanaal, 48000 Hz
Klaar.
Afspelen: /usr/share/sounds/Oxygen-Im-Connection-Lost.ogg
Ogg-Vorbisstroom: 2 kanaal, 48000 Hz
Klaar.
...
Afspelen: /usr/share/sounds/Oxygen-Window-Shade-Down.ogg
Ogg-Vorbisstroom: 1 kanaal, 44100 Hz
Klaar.
Afspelen: /usr/share/sounds/Oxygen-Window-Shade-Up.ogg
Ogg-Vorbisstroom: 1 kanaal, 44100 Hz
Klaar.
Breek deze opdrachten niet af met Ctrl+c, de opdracht ogg123 zal wel stoppen met afspelen, maar niet afsluiten. Je kunt ogg123 wel afsluiten in een ander terminalvenster met de opdracht:
dany@main:~> killall ogg123
Voor de visuele meldingen kan je in KDE gebruik maken van kdialog. Kdialog zorgt voor interactie met een script via grafische vensters en/of meldingen. Handig om scripts toegankelijk te maken voor niet terminal gebruikers.
Onderstaande script kan je aanmaken met jouw favoriete editor (bijv. Kate) en daarna opslaan in de bin map van jouw Persoonlijke map. De bestandsnaam van het script kan je vrij kiezen (ik koos voor mftimer.sh). De bin map in de Persoonlijke map is de standaardmap voor zelf geschreven programma's en scripts.
Na het opslaan van het script, moet je het script uitvoerbaar maken om het te kunnen starten, met de opdracht:
dany@main:~> chmod +x bin/mftimer.sh
#!/bin/bash # Multifunctionele timer # # Stel de timer in met de volgende variabelen # Bereken de duur van de voorbereiding in seconden voorbereiding=$(( 8 * 60 )) # Aantal behandelingssessies sessies=6 # Duur sessies in seconden sessieTijd=60 # Systeeminstellingen titel="Multifunctionele timer" # Aftelfunctie # oproepen met telaf $1 $2 # waarbij $1 de aftelduur in seconden bevat # waarbij $2 de tekst van de groeibalk bevat function telaf { echo $2 groeibalk=$(kdialog --title "$titel" --progressbar "$2") qdbus-qt5 $groeibalk showCancelButton false # Tijd waarbij het aftellen begint in seconden startSeconden=$(date +%s) # Er is nog geen tijd verlopen verlopen=0 # Hoelang moet het aftellen duren in seconden duur=$1 # Herhaal tot de afteltijd verlopen is while [ "$verlopen" -le "$duur" ]; do # Overblijvende tijd in minuten en seconden berekenen minuten=$(( (duur - verlopen) / 60)) seconden=$(( (duur - verlopen) % 60)) # Wacht een halve seconde (niets doen) sleep 0.5 # Plaats op steeds dezelfde regel de nog overblijvende tijd in minuten en seconden (telkens met 2 cijfers) printf " %02d:%02d \r" $minuten $seconden qdbus-qt5 $groeibalk Set org.kde.kdialog.ProgressDialog value $(( (verlopen * 100) / duur )) # Huidige tijd in seconden tijdSeconden=$(date +%s) # Bereken de reeds verlopen tijd in seconden verlopen=$((tijdSeconden - startSeconden)) done qdbus-qt5 $groeibalk org.kde.kdialog.ProgressDialog.close } # Geluid afspelen om de voorbereiding te starten # En tegelijkertijd een geluidstest uit te voeren (volume e.d.m.) (ogg123 /usr/share/sounds/Oxygen-Sys-Log-In-Short.ogg >/dev/null 2>&1) & echo "Soundcheck" kdialog --title "$titel" --passivepopup "Soundcheck" 5 # Voorbereidende fase met melding, timer en afsluitende alarmsignaal (geluid) telaf $voorbereiding "Voorbereiding" (ogg123 /usr/share/sounds/freedesktop/stereo/phone-incoming-call.oga >/dev/null 2>&1) & # De behandelende fase bestaat uit verschillende sessies die allemaal even lang duren echo "Start de behandeling" for (( i=1; i<=sessies; i++)); do # Elke sessie heeft een timer en toont op het einde een melding en een geluidssignaal telaf $sessieTijd "Sessie $i" (ogg123 /usr/share/sounds/freedesktop/stereo/complete.oga >/dev/null 2>&1) & done # De behandeling is afgewerkt kdialog --title "$titel" --passivepopup "De behandeling afronden" 5 echo "De behandeling afronden" (ogg123 /usr/share/sounds/Oxygen-Im-Phone-Ring.ogg >/dev/null 2>&1) &
Voer je het script uit in een terminal, dan krijg je naast de auditieve en grafische meldingen ook tekstmeldingen en een aftelklok in de terminal.
dany@main:~> mftimer.sh
Soundcheck
Voorbereiding
Start de behandeling
Sessie 1
Sessie 2
Sessie 3
Sessie 4
Sessie 5
Sessie 6
00:45
De behandeling afronden
He spreekt voor zich dat je scripts naar hartenlust kunt aanpassen, om het aan ieders wensen te laten voldoen. Succes ermee.