[Lua] CHDK & Lua - erste Schritte

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

CHDK & Lua - erste Schritte

Beitragvon msl » 04.08.2014, 14:43

Hallo CHDK-Freunde,

da sich immer mehr für die Skriptsprache Lua interessieren, soll hier eine Möglichkeit gegeben werden, grundsätzliche Informationen und Hilfestellungen zu sammeln.

Lua ist eine mächtige und relativ einfache Sprache. Einfach deshalb, weil Lua mit sehr wenigen Befehlen auskommt und die Definition von Variablen unkompliziert ist. Lua lässt sich mit benutzerdefinierten Funktionen erweitern. So sind auch alle CHDK-spezifischen Funktionen benutzerdefinierte Funktionen, die im CHDK bereits vordefiniert wurden.

Die Grundlegende Funktionsweise von Lua sollte man sich mit Hilfe der Lua-Referenz aneignen.

Lua-Version 5.2 (verwendet in chdkptp, englisch) => http://www.lua.org/manual/5.2/
Lua-Version 5.1 (verwendet in CHDK, deutsch) => http://lua.coders-online.net/?contentID=1

Lua für Einsteiger (deutsch) => http://lua.gts-stolberg.de/
Programmieren in Lua, erste Ausgabe (englisch) => http://www.lua.org/pil/contents.html

Die CHDK-spezifischen Lua-Funktionen bauen auf den CHDK-uBASIC-Befehlen auf. D.h., grundsätzlich sind fast alle uBASIC-Befehle auch in Lua anwendbar. Man muss nur die Lua-Syntax beachten. Zusätzlich gibt es eine Reihe von Funktionen, die ausschließlich für Lua in das CHDK integriert wurden.

Im deutschen CHDK-Handbuch findet man im Kapitel uBASIC alle Skriptfunktionen, die für uBASIC und Lua nutzbar sind. Im Kapitel Lua werden alle Funktionen gelistet, die nur für Lua gelten oder abweichend zu uBASIC in Lua benutzt werden. Außerdem gibt es auf CHDK.wiki eine sehr gute Referenz zu den Skriptbefehlen.

http://chdk.wikia.com/wiki/CHDK_Scripti ... rence_Page

Lua-Skripte werden als einfache Text-Dokumente mit der Dateiendung .lua abgespeichert. Deshalb kann ein Lua-Skript mit jedem beliebigen Texteditor erstellt werden. Es wird aber ein professioneller Editor empfohlen, der in der Lage ist, die Syntax von Programmiersprachen zu erkennen und den Code dadurch farblich zu kennzeichnen (Syntax-Highlighting), z.B. Notepad++.

Für Notepad++ gibt es auch eine kleine Entwicklerumgebung, mit der man CHDK-Lua-Skripte testen kann. Diese Testumgebung ist in der Lage, Skripte grundsätzlich auf Syntaxfehler zu prüfen und Skripte aus dem Editor heraus Lokal oder auf der Kamera zu testen. Beim lokalen Test stehen nicht alle kameraspezifischen Funktionen zur Verfügung.

viewtopic.php?f=7&t=2973

Um die Skripte auf der Kamera zu testen, ist eine PTP-Verbindung notwendig. Die Einrichtung dieser Verbindung wird beim Projekt ptpCamGui ausführlich beschrieben:

viewtopic.php?f=7&t=2207

Mit ptpCamGui können Lua-Skripte ebenfalls getestet werden. Dazu besitzt das Programm eine Lua-Konsole.

Viel mächtiger ist aber der PTP-Klient chdkptp. Dieser Klient ist selbst in großen Teilen in Lua geschrieben. Der Klient gestattet das Ausführen von Lua-Skripts. Dabei wird zwischen lokalen und auf der Kamera ausgeführten Skripts unterschieden.

viewtopic.php?f=7&t=2699

Und nun noch ein paar Links, die sich mit CHDK-spezifischen Skripttechniken beschäftigen.

viewtopic.php?f=7&t=1594
viewtopic.php?f=7&t=3077
http://chdk.wikia.com/wiki/Lua/Lua_Reference

Weitere Hilfestellungen zu Lua allgemein und CHDK-spezifisch sind an dieser Stelle willkommen. Das ist sicherlich auch ein guter Platz, um allgemein über Lua-Skripttechniken zu diskutieren.

Gruß msl
Benutzeravatar
msl
Super-Mod
Super-Mod
 
Beiträge: 4556
Bilder: 271
Registriert: 22.02.2008, 12:47
Wohnort: Leipzig
Kamera(s): A720 1.00c
SX220 1.01a

Re: CHDK & Lua - erste Schritte

Beitragvon msl » 05.08.2014, 14:17

Ein CHDK-Lua-Skript beginnt meistens mit den Definitionen für den Skripttitel und den Parametern. Definierte Parameter werden dann im CHDK-Skript-Menü angezeigt und können in dem Menü verändert werden.

Titel und Parameter werden in einem Lua-Kommentarblock eingefügt. So ein Block beginnt immer mit --[[ und endet mit ]]. Damit CHDK weiß, dass es sich um Titel- bzw. Parameter-Definitionen handelt, muss diesen Definitionen ein @ vorangestellt werden.

Das CHDK besitzt zur Ausgabe von Texten und Werten eine Skriptkonsole. Mit der Lua-Funktion print() wird in diese Konsole geschrieben.

Hier nun ein kleines Beispiel:
Syntax: [ Download ] [ Verstecken ]
Benutze Lua Syntax Highlighting
--[[
@title mein erstes Lua-Skript
@param a Auswahl Zahl
@default a 1
@range a 1 10
@param b Auswahl Farbe
@default b 0
@values b rot blau gelb
]]


color = "unbekannt"
if     b == 0 then color = "rot"
elseif b == 1 then color = "blau"
elseif b == 2 then color = "gelb"
end

print(a)
print("eingestellte Farbe "..color)
Erstellt in 0.003 Sekunden, mit GeSHi 1.0.8.9


@title mein erstes Lua-Skript
Skripttiteldefinition, die den Titeltext enthält, der links unten im Display angezeigt wird

@param a Auswahl Zahl
@default a 1
@range a 1 10
Parameterdefinition für die Variable a. Der Text hinter @param a wird im Skriptmenü angezeigt. @default a 1 definiert den voreingestellten Wert für die Variable a. Mit @range a 1 10 kann optional ein Wertebereich definiert werden.

@param b Auswahl Farbe
@default b 0
@values b rot blau gelb
Parameterdefinition für die Variable b. Der Text hinter @param b wird im Skriptmenü angezeigt. @default b 0 definiert den voreingestellten Wert für die Variable a. Mit @values b rot blau gelb können optional ein Aufzählungen definiert werden. Den Aufzählungen werden numerische Werte beginnend mit Null zugeordnet. Im Beispiel entspricht rot = 0, blau = 1 und gelb = 2.

color = "unbekannt"
if b == 0 then color = "rot"
elseif b == 1 then color = "blau"
elseif b == 2 then color = "gelb"
end
Der Variable color wird die Zeichenkette "unbekannt" zugeordnet. Je nach eingestellter Parametervariable b wird der Variable color dann die passende Farbe zugewiesen. Dabei wird die ursprüngliche Zeichenkette "unbekannt" überschrieben.

print(a)
print("eingestellte Farbe "..color)
Mit diesen beiden Anweisungen erfolgt die Ausgabe auf der Skriptkonsole. print(a) zeigt die Zahl an, die für die Parametervariable a im Skriptmenü eingestellt wurde. print("eingestellte Farbe "..color) gibt den Text "eingestellte Farbe " gefolgt von der im Skriptmenü eingestellten Farbe aus. In Lua werden Zeichenketten durch zwei hintereinander stehende Punkte verbunden.

Soweit der prinzipielle Aufbau eines CHDK-Lua-Skripts. Wer möchte, kann an dieser Stelle mit weiterführenden Beschreibungen fortsetzen.

Gruß msl
Benutzeravatar
msl
Super-Mod
Super-Mod
 
Beiträge: 4556
Bilder: 271
Registriert: 22.02.2008, 12:47
Wohnort: Leipzig
Kamera(s): A720 1.00c
SX220 1.01a

Re: CHDK & Lua - erste Schritte

Beitragvon msl » 11.08.2014, 11:16

In einem CHDK-Lua-Skript haben wir die Möglichkeit, die Tasten der Kamera virtuell zu bedienen und eine Tasteneingabe durch den Kamerabenutzer im Skript abzufragen.

Um eine Taste virtuell zu bedienen, gibt es zwei Möglichkeiten.

1. click(<Taste>) - Hier wird ein kurzer Tastendruck ausgeführt.

2. press(<Taste>), release(<Taste>) - Mit dieser Kombination kann ein längerer Tastendruck simuliert werden. Dabei wird mit dem Befehl press die Taste gehalten und mit release wieder losgelassen. Zu beachten ist, dass ein press ohne release die Taste dauerhaft halten wird. Man muss also im Skript dafür sorgen, dass die Taste auch wieder losgelassen wird. Zwischen press und release können andere Befehle stehen.

Syntax: [ Download ] [ Verstecken ]
Benutze Lua Syntax Highlighting
--[[
@title click & press/release
]]


click("zoom_in")

press("zoom_in")
sleep(200)
release("zoom_in")
Erstellt in 0.003 Sekunden, mit GeSHi 1.0.8.9
Im Beispiel kann man den Unterschied zwischen click und press/release sehen.

Außerdem gibt es noch einen besonderen aber wichtigen Befehl: shoot(). In diesem Befehl ist der komplexe Vorgang Fokussieren und Auslösen zusammengefasst.

Die Namen für die Tasten werden als Zeichenkette in doppelte oder einfache Anführungsstriche angegeben. Die Namen ergeben sich aus der englischen Bezeichnung und sind abhängig von den verfügbaren Bedienelementen der jeweilig benutzen Kamera.

"up", "down", "left" "right", "set", "shoot_half", "shoot_full", "shoot_full_only", "zoom_in", "zoom_out", "menu", "display", "print", "erase", "iso", "flash", "mf", "macro", "video", "timer", "expo_corr", "fe", "face", "zoom_assist", "ae_lock", "metering_mode", "help", "mode", "remote", "no_key"

Die letzten beiden Namen können nur für die Abfrage, ob eine Taste gedrückt wurde, benutzt werden. "remote" steht für eine CHDK-USB-Fernbedienung. "no_key" wird eingesetzt, um festzustellen, dass keine Taste gedrückt wird.

Für die Tastaturabfrage gibt es zwei Funktionen: is_key(<Taste>) und is_pressed(<Taste>). Beide Funktionen sind ziemlich identisch. is_key fragt ab, ob eine Taste gedrückt ist und is_pressed stellt fest, ob eine Taste gedrückt wurde.

Die beiden Funktionen sollten als Bedingung abgefragt werden. Wird die Bedingung wahr, wird/wurde die Taste gedrückt. Zusätzlich brauchen wir noch eine Wartefunktion, die auf eine Eingabe wartet: wait_click(<optional Zeit in ms>). Wenn man bei dieser Funktion 0 oder keine Zeitangabe macht, wird das Skript an dieser Stelle so lange warten, bis eine Taste gedrückt wird. Ansonsten wartet die Funktion entsprechend der Zeitangabe. Ohne diesen Wartebefehl wäre das Lua-Skript zu schnell. Die richtige Tastaturabfrage würde eher zufällig und nicht gezielt gelingen.

Um die Tastaturabfrage sinnvoll zu nutzen, muss das oben beschriebene Konstrukt in eine wiederholende Schleife gepackt werden. Hier kann man z.B. eine Repeat-Schleife verwenden. die wird so oft wiederholt, bis eine bestimmte Bedingung erfüllt ist.

Ãœber die allgemeine Funktionsweise von Bedingungen und Schleifen sollte man sich in den genannten Lua-Referenzen und allgemeinen Lua-Tutorials informieren.

Syntax: [ Download ] [ Verstecken ]
Benutze Lua Syntax Highlighting
--[[
@title Tastaturtest
]]


repeat
    wait_click(0)
    if is_key("set") then print("Taste SET gedrückt") end
until is_key("menu")
Erstellt in 0.003 Sekunden, mit GeSHi 1.0.8.9
Im Beispiel wird das Skript in einer Schleife laufen, die auf eine Tasteneingabe wartet. Wird SET gedrückt, wird das entsprechend angezeigt. Mit der Taste MENU wird die Schleife und damit das Skript beendet.
Benutzeravatar
msl
Super-Mod
Super-Mod
 
Beiträge: 4556
Bilder: 271
Registriert: 22.02.2008, 12:47
Wohnort: Leipzig
Kamera(s): A720 1.00c
SX220 1.01a

Re: CHDK & Lua - erste Schritte

Beitragvon msl » 11.10.2014, 11:35

Ausgabe auf dem Kamerabildschirm

Viele Skriptaufgaben benötigen Informationen auf dem Kamerabildschirm. Dafür gibt es generell zwei unterschiedliche Methoden.

1. Textausgabe auf der Skriptkonsole

CHDK besitzt eine sogenannte Skriptkonsole. Das ist der Bereich, der mit print(<Text>) beschrieben werden kann. Als Vorgabe hat die Konsole eine Größe von 25 x 5 Zeichen (25 Zeichen breit mit 5 Zeilen) Diese Größe kann mit dem Befehl set_console_layout(x1,y1,x2,y2) verändert werden. Dabei ist der Ursprung 0,0 links unten.

Die Textausgabe mit print() erfolgt zeilenweise beginnend unten. Ist der Text länger als die definierte Breite der Konsole, wird in die nächste Zeile geschrieben. Sind alle Zeilen beschrieben, wird beim nächsten Print-Befehl die oberste Zeile entfernt.

Der Inhalt der Konsole kann mit dem Befehl cls() gelöscht werden.

Als Vorgabe wird die Konsole immer automatisch neu geschrieben, wenn ein Print-Befehl ausgeführt wird. Das lässt sich mit set_console_autoredraw(0) unterbinden. Dann wird erst nach dem Befehl console_redraw() neu geschrieben. So ist es möglich, mehrere Konsolenzeilen in einem "Rutsch" darzustellen. Mit set_console_autoredraw(1) wird die Automatik wieder aktiviert.

2. Zeichnen inklusive Textausgabe auf dem gesamten Bildschirm

CHDK verfügt über eine einfache Zeichenfunktion, mit der Punkte, Linien, Rechtecke (gefüllt und ungefüllt), Ellipsen (gefüllt und ungefüllt) sowie Texte mit unterschiedlichen Farben auf dem gesamten Bildschirmbereich dargestellt werden können.

draw_pixel(x, y, cl)
draw_line(x1, y1, x2, y2, cl)
draw_rect(x1, y1, x2, y2, cl, th)
draw_rect_filled(x1, y1, x2, y2, cl1, cl2, th)
draw_ellipse(x, y, a, b, cl)
draw_ellipse_filled(x, y, a, b, cl)
draw_string(x,y,t,clt,clb,xscale,yscale)
draw_clear()


Die nähere Bedeutung der Argumente ist in der CHDK-Dokumentation nachzulesen. Die Positionierung erfolgt entsprechend der Ausgabe-Pixel. Der Ursprung (0,0) befindet sich links oben. Die Dimensionen lassen sich mit folgenden Befehlen ermitteln:

get_gui_screen_width()
get_gui_screen_height()


Da CHDK-OSD-Elemente und die kameraeigenen OSD-Elemente miteinander konkurrieren, muss man bei Verwendung der zuvor genannten Draw-Funktionen dafür Sorge tragen, dass das Zeichnen der Elemente zyklisch wiederholt werden muss. Daraus ergeben sich anspruchsvollere Skriptroutinen.
Benutzeravatar
msl
Super-Mod
Super-Mod
 
Beiträge: 4556
Bilder: 271
Registriert: 22.02.2008, 12:47
Wohnort: Leipzig
Kamera(s): A720 1.00c
SX220 1.01a

Re: CHDK & Lua - erste Schritte

Beitragvon msl » 08.10.2016, 00:02

Nach langer Zeit mal wieder eine Fortsetzung...

Zeichenketten (Strings)

Unter Lua gibt es verschiedene Methode, Zeichenketten festzulegen:

Dadurch ist es möglich, die verwendeten Einfassungszeichen auch innerhalb einer Zeichenketten zu verwenden:
Code: Alles auswählen
'"Hello" [[World]]'
würde als
Code: Alles auswählen
"Hello" [[World]]
ausgegeben werden.

Mit ' und " können nur einzeilige Zeichenketten definiert werden. Bei Verwendung der doppelten eckigen Klammern sind mehrzeilige Zeichenketten möglich. Dabei ist zu beachten, dass mehrzeilige Zeichenketten unter CHDK auf dem Kamerabildschirm als eine Zeile ausgeben gegeben:
Code: Alles auswählen
[[Hello
World]]

Zeichenketten können mit .. verbunden werden:
Code: Alles auswählen
"Hello" .. "World"

Zur Weiterverarbeitung von Zeichenketten existiert eine spezielle Funktionsbibliothek: http://lua-users.org/wiki/StringLibraryTutorial

Mit string.format() lassen sich Variableninhalte in existierende Zeichenketten einfügen. Dazu muss die Zeichenkette den Platzhalter % gefolgt von der Art des Platzhalters enthalten:
Code: Alles auswählen
string.format("%s World %d", "Hello", 100)
ergibt
Code: Alles auswählen
Hello World 100
%s steht für eine Zeichenkette und %d für eine Zahl.
Benutzeravatar
msl
Super-Mod
Super-Mod
 
Beiträge: 4556
Bilder: 271
Registriert: 22.02.2008, 12:47
Wohnort: Leipzig
Kamera(s): A720 1.00c
SX220 1.01a

Re: CHDK & Lua - erste Schritte

Beitragvon Caefix » 24.07.2018, 19:17

P.S. Immer wieder stolpert man über Zeilen der Art:
Superskript bricht nach xxx[x] Bildern/Stunden/Tagen unerklärlicherweise ab. Batterie/Wildschwein war´s nicht.
-->> for .., while.. & do .. until knabbern|müllen (m.E. Voodoo?/closure) ~xyz Bytes Speicher ab|zu.
-->> Drum könnte es u.U. helfen an notwendigen & nicht störenden Stellen collectgarbage() einfüzugen.
:...,....1....,....2....,....3....,....4....,....5....,....6....,....7....,...& so wird aus einem wait_click(0) ein Schaltwerk:...,....1....,....2....,....3....,....4....,....5....,....6....,....7....,...
Code: Alles auswählen

function getkey(x,...)
local k=0
local t=1000
console_redraw()
if ...~=nil then print("*<",...,">") end
if x==nil then x=42 end
if x<10 then sleep(33)
   repeat wait_click(9) until is_key "no_key"
   if x<8 then play_sound(x) end
   wait_click(t*t)
   if x~=8 then sleep(123) end end
if x>t then wait_click(x) end
 local ti=get_tick_count()

 while is_pressed "face" do k=1 end
 while is_pressed "up" do k=2 end
 while is_pressed "video" do k=3 end
 while is_pressed "left" do k=4 end
 while is_pressed "set" do k=5 end
 while is_pressed "right" do k=6 end
 while is_pressed "display" do k=7 end
 while is_pressed "down" do k=8 end
 while is_pressed "menu" do k=9 end
 while is_pressed "help" do k=11 end
 while is_pressed "playback" do k=13 end
 while is_pressed "print" do k=16 end
 while is_pressed "zoom_in" do k=22 end
 while is_pressed "zoom_out" do k=24 end
 while is_pressed "shoot_half" do k=29 end

 ti=get_tick_count()-ti
 while x==t do x=0
    k=get_orientation_sensor()
   if go==nil then go=k/90+99 end
    if k==0 then G=go else play_sound(1+k/90) end
    if k==90 then G=G-1 end
    if k==270 then G=G+1 end end
return k,ti
end

P.S. empfehlenswerte nächste Schritte (für die Maus...)
download/file.php?id=2890
EsGibtKeinenErdaufgangAufDemMond! SoSimpel...
Caefix
CHDK-Einsteiger
CHDK-Einsteiger
 
Beiträge: 33
Registriert: 15.06.2018, 20:14
Kamera(s): Einige!


Zurück zu Code-Ecke

Wer ist online?

Mitglieder in diesem Forum: Google [Bot] und 1 Gast