[uBasic] "select a key" - SELECT mit Ausdruck

CHDK-Skripte, CHDK-Entwicklung, PC-Zusatzprogramme, Informationen für Tüftler

"select a key" - SELECT mit Ausdruck

Beitragvon rudi » 20.09.2009, 18:45

Hallo Scripter,
ich habe festgestellt, dass die SELECT-Anweisung zusätzlich zum dt. Handbuch sowohl im SELECT- als auch im CASE-Zweig Ausdrücke verarbeitet.
Da mir der Unterschied zwischen IS_KEY und IS_PRESSED nicht so klar war, habe ich meine Beispiele damit vollgestopft. Die letzte CASE-Anweisung ist besonders zu beachten.

Als Erstes die klassische Tastenauswahl mit WAIT_CLICK:
Code: Alles auswählen
@title select a key 1
print "Start und Ende mit SET"
wait_click

print "--- START ---"
do
  wait_click
  select 1
    case is_key "up" ; print "Taste oben"
    case is_key "down" ; print "Taste unten"
    case is_key "left" ; print "Taste links"
    case is_key "right" ; print "Taste rechts"
    case is_key "zoom_in", is_key "zoom_out" ; print "eine Zoom Taste"
    case_else print "freie Taste"
  end_select
until is_key "set"

print "--- ENDE ---"
end


Nun ein Beispiel, bei dem IS_KEY nur noch funktioniert wenn dadurch WAIT_CLICK abgebrochen wird:
Code: Alles auswählen
rem is_key funktioniert immer nur einmal und
rem nur vor Ende der <WaitTime>! Teste mit Zoom_Out
@title select a key 2
i=0
print "Start und Ende mit SET"
wait_click

print "--- START ---"
do
  wait_click 500
  select 1
    case is_pressed "up" ; print "Taste oben"
    case is_pressed "down" ; print "Taste unten"
    case is_pressed "left" ; print "Taste links"
    case is_pressed "right" ; print "Taste rechts"
    case is_pressed "zoom_in", is_key "zoom_out" ; print "eine Zoom Taste"
    case_else print "keine/freie Taste [",i,"]"
  end_select
  i=i+1
until is_pressed "set"

print "--- ENDE ---"
end


Und zum Abschluss habe ich auf WAIT_CLICK ganz verzichtet und IS_KEY hat gar keine Wirkung mehr:
Code: Alles auswählen
rem is_key funktioniert nicht! Teste mit Zoom_Out
@title select a key 3
i=0
print "Start und Ende mit SET"
wait_click
rem Wartezeit ist erforderlich,
rem sonst wird das Script sofort wieder beendet
rem wegen der SET-Taste für Start und Stop
sleep 500

print "--- START ---"
do
  select 1
    case is_pressed "up" ; print "Taste oben"
    case is_pressed "down" ; print "Taste unten"
    case is_pressed "left" ; print "Taste links"
    case is_pressed "right" ; print "Taste rechts"
    case is_pressed "zoom_in", is_key "zoom_out" ; print "eine Zoom Taste"
    case_else print "keine/freie Taste [",i,"]"
  end_select
  i=i+1
until is_pressed "set"

print "--- ENDE ---"
end


Grüße Rudi
Benutzeravatar
rudi
CHDK-Spezialist
CHDK-Spezialist
 
Beiträge: 510
Registriert: 11.09.2009, 11:27
Kamera(s): A590IS_101B, SX260_100B

Beitragvon gehtnix » 21.09.2009, 00:26

Hi Rudi,

diese Varianten waren mir bisher auch noch nicht bekannt. Ich habe mal in meinen Beiträgen gestöbert:

if is_pressed (Sevenup Zeile 189) ist kürzer als mit select.

wait_click (HDR-Hyper Zeile 49) wäre mit select nicht möglich da mehrere Befehle folgen.

Bei Deiner Variante "key 3" fällt mir auf, dass die gedrückte Taste manchmal doppelt im Ausdruck erscheint.

gruß gehntix
Benutzeravatar
gehtnix
CHDK-Legende
CHDK-Legende
 
Beiträge: 2406
Bilder: 8
Registriert: 17.04.2008, 12:42
Wohnort: München
Kamera(s): A610 100e+f + IXUS990 IS

Beitragvon rudi » 21.09.2009, 11:35

Hallo gehtnix,

die Wiederholungen treten auch bei "select a key2" auf, du musst nur die Taste lange genung gedrückt halten - außer bei ZOOM_OUT.
Mit IS_PRESSED kann man eine Taste immer Abfragen, sie muss nur genau in diesem Moment gedrückt sein. Mit IS_KEY erhält man ein Ergebnis nur, wenn mit dem Tastendruck WAIT_CLICK abgebrochen wurde.

Da CASE nur eine Zeile haben darf und GOTO/GOSUB direkt nach dem Semikolon stehen muss, ist dieser Befehl NICHT anwendbar:
Code: Alles auswählen
rem diesen Befehlsaufbau NICHT verwenden!!!
case is_pressed "up" ; if t=0 then gosub "LCD_ON" else  gosub "LCD_OFF"

Dafür eignet sich diese Möglichkeit:
Code: Alles auswählen
rem Schalten der Hintergrundbeleuchtung
rem im laufenden Programm
@title select a key 4
i=0
rem Toggle-Flag
t=1
print "Start und Ende mit SET"
wait_click
rem Wartezeit ist erforderlich,
rem sonst wird das Script sofort wieder beendet
rem wegen der SET-Taste für Start und Stop
sleep 500

print "--- START ---"
do
  sleep 5000
  select 1
    case is_pressed "up" & (t=0) ; gosub "LCD_ON"
    case is_pressed "up" & (t=1) ; gosub "LCD_OFF"
  end_select
  print "Warte [",i,"]"
  i=i+1
until is_pressed "set"

rem Hintergrundbeleuchtung an
gosub "LCD_ON"
print "--- ENDE ---"
end

:LCD_ON
  t=1
  set_backlight t
  print "LCD an"
return

:LCD_OFF
  t=0
  set_backlight t
  print "LCD aus"
return

Noch eine Festellung zu "AND" und "&":
"AND" kann nur in <Bedingungen> verwendet werden und besitzt dort die höchste Priorität.
In <Ausdrücken> kann nur "&" verwndet werden.

Gruß Rudi
Benutzeravatar
rudi
CHDK-Spezialist
CHDK-Spezialist
 
Beiträge: 510
Registriert: 11.09.2009, 11:27
Kamera(s): A590IS_101B, SX260_100B


Zurück zu Code-Ecke

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 25 Gäste

cron