[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, 13: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: 4567
Bilder: 271
Registriert: 22.02.2008, 11:47
Wohnort: Leipzig
Kamera(s): A720 1.00c
SX220 1.01a

Re: CHDK & Lua - erste Schritte

Beitragvon msl » 05.08.2014, 13: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.006 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: 4567
Bilder: 271
Registriert: 22.02.2008, 11:47
Wohnort: Leipzig
Kamera(s): A720 1.00c
SX220 1.01a

Re: CHDK & Lua - erste Schritte

Beitragvon msl » 11.08.2014, 10: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.005 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.004 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: 4567
Bilder: 271
Registriert: 22.02.2008, 11:47
Wohnort: Leipzig
Kamera(s): A720 1.00c
SX220 1.01a

Re: CHDK & Lua - erste Schritte

Beitragvon msl » 11.10.2014, 10: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: 4567
Bilder: 271
Registriert: 22.02.2008, 11:47
Wohnort: Leipzig
Kamera(s): A720 1.00c
SX220 1.01a

Re: CHDK & Lua - erste Schritte

Beitragvon msl » 07.10.2016, 23: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: 4567
Bilder: 271
Registriert: 22.02.2008, 11:47
Wohnort: Leipzig
Kamera(s): A720 1.00c
SX220 1.01a

Re: CHDK & Lua - erste Schritte

Beitragvon Caefix » 24.07.2018, 18: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....,..
Syntax: [ Download ] [ Verstecken ]
Benutze Lua Syntax Highlighting
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
Erstellt in 0.008 Sekunden, mit GeSHi 1.0.8.9
P.S. empfehlenswerte nächste Schritte (für die Maus...)
http://forum.chdk-treff.de/download/file.php?id=2890
Zuletzt geändert von Caefix am 18.10.2021, 14:56, insgesamt 1-mal geändert.
EsGibtKeinenErdaufgangAufDemMond! SoSimpel...
Benutzeravatar
Caefix
CHDK-Begeisterter
CHDK-Begeisterter
 
Beiträge: 78
Registriert: 15.06.2018, 19:14
Kamera(s): Einige!

Re: CHDK & Lua - erste Schritte

Beitragvon Joedi » 21.10.2020, 21:05

Hallo CHDK-Freunde, das Thema "Erste Schritte" hat mich angesprochen, und ich möchte ein paar meiner rüh-Erkenntnisse beim Programmieren von lua-Scripts teilen. Vielleicht hilft es anderen Anfängern.

Was waren meine ersten Schwierigkeiten?

  • Zwischen "CHDK ist gestartet" (z.B. durch autobooting) und "ALT-modus ist eingeschaltet" zu unterscheiden, den einige wenige Funktionen wie die Abfrage der usb-Schnittstelle sowie einige On-Screen-Displays (OSD) laufen ja auch ausserhalb des ALT-modus.
  • Wer etwas Erfahrung mit anderen Programmiersprachen hat, für den ist lua angenehm unkompliziert! Da es aber kein GOTO gibt, muss man die Fallunterscheidungen (if, while usw) vorher etwas planen, das ist alles.
  • Anfangs war ich sehr verwirrt darüber, dass die Befehlsnamen von uBasic auch fast alle bei lua brauchbar sind (mit der Massgabe, eventuelle Paraneter in () Klammern anzugeben).
  • Die älteren CHDK- Handbücher waren stellenweise sehr mager. Mit der Version von 2015 ist das deutlich besser geworden.
  • Eine bleibende Schwierigkeit ist die Tatsache, dass viele Grössen zwar mit "get_xxx_mode()" abgefragt werden können, aber längst nicht alle mit "set_xxx_mode(WERT)" auch gesetzt werden können. Aber das ist dann eben eine Herausforderung...
  • Das Durchsehem eines scripts in der Kamera mit dem Textbetrachter ist nicht schön, denn das vor- und zurück-Scrollen macht sehr unterschiedliche Sprünge. Und man will halt nicht immer den EDITOR starten, der das doch deutlich besser kann.

  • Der EDITOR hingegem ist genial! Mit ihm kann man nach wirklich nur kurzer Eingewöhnung sehr gut kleinere Änderungen an scripts vornehmen, direkt in der Kamera und völlig ohne den PC. Echt gut!
  • Ich benutze eine "Arbeitsumgebung" unter Linux zum Schreiben und Testen meiner Scripts. Siehe auch mein Posting viewtopic.php?f=7&t=3652.
  • Wenn ich unsicher bei der Schreibweise der Befehlssyntax bin oder einfach nur mal sehem will, wie andere, erfahrenere Leute programmiert haben, schaue ich mir z.B. die scripts unter /Test oder die hervorragenden Scripte AvPlus.lua oder CHDKplus.lua usw. näher an.
  • Eine gewisser, leider wohl gar nicht lösbarer Problemkreis war/ist für mich, dass
  • ein "mode" sich sowohl auf die Fokussierung (AF.MF) beziehen kann,
    aber "mode" auch als Wort für die Belichtungssteuerung verwemdet wird: Dass sind dan
  • die "capture_modes". mit den grundlegendem capture_modes 1...5 ( Auto, P, Tv, Av, M) und den VIELEN "speziellen" wie Landschaft, Tiere, Sonenuntergang und was noch alles (siehe Mode-Tablle im Handbuch).
  • Bei lua sind alle Befehlsblöcke (also Folgen von mehreren Befehlen) immer mit end abzuschliessen; desgleichen Funktionen (function).
    Es muss also z.B. heissen
    if Bedingung then Befehlsblock end, oder
    if Bedingung then Befehlsblock else anderer Befehlsblock end, usw.
  • In den meisten Beispielprogrammen oder scripts sind die Befehlsblöcke als einzelne Zeilen mit je einem Befehl geschrieben:
    if Bedingung
    then

    Befehl1
    Befehl2
    Befehl3
    usw.
    end
    Für kompliziertere Fälle ist das bestimmt gut; für einfache Fälle liebe ich allerdings die "Einzeiler", wo was zu erledigen ist übersichtlich in einer einzigen Zeile steht.
    if Bedingung then Befehl1 Befehl2 Befehl3 end
    Lua macht dies möglich, denn als Trennzeichen zwischen Befehlen reicht ein einfaches Leezeichen (space, blank) aus. Im Gegenzug dürfen allerdings im allgemeinen andereenorts auch keine "überflüssigen" Leerzeichen sein. Zeilenwechsel (line feed) wird im Prinzip ignoriert. N.B. Deshalb u.a. auch unbedingt das end am End' eines Befehlsblockes.
  • Bedingungen: Obwohl nicht immer zwingend nötig, setze ich Bedingungen immer in Klammern, also:
    ( Bedingung ). Falls die Bedingung aus mehreren Teilen besteht, z.B. ((a>=0) or (z==1) and (y~=5)) bräuchte man die Klammern sowieso, und die geklammerten Ausdrücke findet man im Text schneller
  • Eine Lua-Besonderheit: Bei Test (s.o.) auf Gleichheit muss das Gleichheitszeichen doppelt stehen!== Und: Nicht-Gleich muss als ~= geschrieben werden.
  • Worüber ich mehrfach gestolpert bin: Nach repeat Befehlsblock until Bedingung hatte ich treu und brav ein end gesetzt. Hier darf aber KEIN end stehen. Meine Erklärung: nach dem until folgt ja kein Befehlsblock, sondern nur eine Bedingung.
  • Ernst zu nehmen sind die Hinweise der Erfahrenen, dass nicht unbedingt alle Befehle bei allen chdk-fähigen Kameras wie erwartet funktionieren; oft ist also Probieren und Testen angesagt.
  • Machne Befehle brauchen zur Ausführung Zeit, auch ohne und besonders aber mit Beteiligung von Mechanik. Wenn möglich also nach solchen Befehlen immer eine Warteschleife wie beispielsweise
    repeat sleep(200) until (get_XXXX()==YYYY) einfügen, oder auf Verdacht zumindest ein sleep(1000), dass man dann experimentell verringern kann.
  • Einige Abfragebefehle wie z.B. get_focus_ok() liefern nur dann Ergebnisse, wenn die Kamera in den entsprechenden Zustand versetzt wurde. Glücklicherweise meldet uns lua, wenn einer Grösse kein Wert zugewiesen wurde.
[/list][/list]
So, das war'S zunächst mal an Erfahrungen von mir; ich bin nach wie vor total begeistert von chdk und dem Forum und sage danke für die enorme Vorarbeit, die für chdk schon geleistet wurde.
Grüsse von joedi


(END)
Joedi
CHDK-Einsteiger
CHDK-Einsteiger
 
Beiträge: 17
Registriert: 17.02.2020, 21:02
Wohnort: MA/HD
Kamera(s): IXUS60, A470, A530, A570IS, A590IS, SX230, M10

Re: CHDK & Lua - erste Schritte

Beitragvon Caefix » 04.01.2021, 18:32

Praktische Kleinigkeiten, v.a. wenn man auch in Ubasic mit der Kamera kommuniziert... 8-[
Syntax: [ Download ] [ Verstecken ]
Benutze Lua Syntax Highlighting
if ubas then function ubasic()
on=1
off=0
max_int=0x7fffffff
_HLP=tostring(tostring):find(" 00")~=nil --< HostLuaPortable Makro <local>
if not props then props=require("propcase") end
function get_af_frame() return props.af_frame end
function get_metering_mode() return props.metering_mode end

function abs(x) if x<0 then return -x else return x end end
function cap(x) while (abs(x)>9) do x=x/10 end end
function even(x) return bitand(x,1)==0 end
function odd(x)  return bitand(x,1)==1 end
function sgn(x) if x<0 then return -1 elseif x>0 then return 1 else return 0 end end
function swap(x,y) x,y=y,x end

function get_far_limit()
  if not dof then dof=get_dofinfo() end
  return dof.far_limit end
function get_near_limit()
  if not dof then dof=get_dofinfo() end
  return dof.near_limit end
function get_dof()
  if not dof then dof=get_dofinfo() end
  return dof.dof end
function get_eff_focal_length()
  if not dof then dof=get_dofinfo() end
  return dof.eff_focal_length end
function get_focal_length()
  if not dof then dof=get_dofinfo() end
  return dof.focal_length end
function get_hyp_dist()
  if not dof then dof=get_dofinfo() end
  return dof.hyp_dist end
function get_min_stack_dist()
  if not dof then dof=get_dofinfo() end
  return dof.min_stack_dist end
end ubasic() end


function julian_day()
  local Y,M,D=get_time(&#39;Y&#39;),get_time(&#39;M&#39;),get_time(&#39;D&#39;)
  local jd=367*Y -7*(Y+(M+9)/12)/4 +275*M/9 +D+1721013
  return jd
end -- print(julian_day())

function get_free_mem()
  return "~~[Mem:"..tostring(get_meminfo ("system")["free_size"]/1000).."]"
end
Erstellt in 0.007 Sekunden, mit GeSHi 1.0.8.9
Zuletzt geändert von Caefix am 18.10.2021, 14:52, insgesamt 1-mal geändert.
EsGibtKeinenErdaufgangAufDemMond! SoSimpel...
Benutzeravatar
Caefix
CHDK-Begeisterter
CHDK-Begeisterter
 
Beiträge: 78
Registriert: 15.06.2018, 19:14
Kamera(s): Einige!

Re: CHDK & Lua - erste Schritte

Beitragvon Joedi » 10.05.2021, 23:42

Hi, ich möchte gern im logging eines Skripts auch den Namen des Skripts verwenden. Zugriff auf den @title-Wert des Lua-Headers geht aber nicht. gibt es da einen Trick?
Oder alternativ: Wie komme ich von innerhalb eines lua-Skripts an den eigenen Dateinamen ?
Grüße von joedi
Joedi
CHDK-Einsteiger
CHDK-Einsteiger
 
Beiträge: 17
Registriert: 17.02.2020, 21:02
Wohnort: MA/HD
Kamera(s): IXUS60, A470, A530, A570IS, A590IS, SX230, M10

Re: CHDK & Lua - erste Schritte

Beitragvon Caefix » 12.05.2021, 20:17

:( Da war mal wo ein Schnipsel mit debug.?? & regulären Ausdrücken, der das konnte.
Das könnte aber die Zeit gewesen sein, als auch das Lua-Script während des Ablaufs noch im Klartext im Speicher lag.
So bleibt wohl nur, ein Script vorzuschalten, das den luafile=file_browser(...) Return an loadfile(...) weiterreicht.
local gsub,err=loadfile(luafile)
ex,ret=assert(gsub)(a,b,c...)
...
Next Problem: Ein so geladenes Script weiß nichts von den Werten aus dem Header und gibt einen Fehler mit "NIL-Value", wenn nicht vorgegeben.
Abhilfe: Siehe Scryptix.lua...

oder: :idea: Script "doppelt aufrufen": definiere title=file_browser("A/CHDK/SCRIPTS") nach dem Start...
EsGibtKeinenErdaufgangAufDemMond! SoSimpel...
Benutzeravatar
Caefix
CHDK-Begeisterter
CHDK-Begeisterter
 
Beiträge: 78
Registriert: 15.06.2018, 19:14
Kamera(s): Einige!

Re: CHDK & Lua - erste Schritte

Beitragvon msl » 13.05.2021, 09:13

In der CHDK-Konfiguration wird auch das aktuell geladene Skript mit vollständigem Pfad gespeichert. Das lässt sich über get_config_value auslesen. In der CHDK-Quellcode-Datei conf.c findet man die notwendigen IDs.

Mit script_name=get_config_value(1054) wird der vollständige Pfad als String in script_name gespeichert.

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

Re: CHDK & Lua - erste Schritte

Beitragvon Caefix » 13.05.2021, 16:45

:D
Syntax: [ Download ] [ Verstecken ]
Benutze Lua Syntax Highlighting
--[[--
@title Schnipsel V.0.5904 <img src="./images/smilies/smile.gif" alt=":)" title="Smile" />
--]]
--
script_name=get_config_value(1054)
title=script_name
for lin in io.lines(script_name) do
    if lin:find("@title ") then title=string.sub(lin,7,42); break end
end
collectgarbage()
print(title,"\13",script_name)
Erstellt in 0.003 Sekunden, mit GeSHi 1.0.8.9

--[[--
Freilich könnte man auch ganze Abschnitte aus des Skripts Kommentarzone in die Logdatei übertragen...
--]]--
Zuletzt geändert von Caefix am 18.10.2021, 14:48, insgesamt 1-mal geändert.
EsGibtKeinenErdaufgangAufDemMond! SoSimpel...
Benutzeravatar
Caefix
CHDK-Begeisterter
CHDK-Begeisterter
 
Beiträge: 78
Registriert: 15.06.2018, 19:14
Kamera(s): Einige!

Re: CHDK & Lua - erste Schritte

Beitragvon Joedi » 22.05.2021, 21:33

Danke zu script_name=get_config_value(1054).Hat sehr gut funktioniert. Grüße joedi
Joedi
CHDK-Einsteiger
CHDK-Einsteiger
 
Beiträge: 17
Registriert: 17.02.2020, 21:02
Wohnort: MA/HD
Kamera(s): IXUS60, A470, A530, A570IS, A590IS, SX230, M10


Zurück zu Code-Ecke

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast