[PTP] CHDKptp liveView: Shoot&Download-Button

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

CHDKptp liveView: Shoot&Download-Button

Beitragvon matzgp » 20.05.2013, 17:03

Hallo Allerseits und frohe Pfingsten
kurze Vorgeschichte: Hab mir wegen (typischem) Kratzer auf der Frontlinse meiner G9 eine gebrauchte G12 gekauft und wollte wieder Fotos per Laptop aufnehmen...Fernsteuerung ging aber nicht mehr, hat Canon ja bekanntlich abgeschaltet. Zum Glück gibts PTP, also OpenSource Programm gesucht und CHDKptp liveView gefunden Genial!! Da meine Frau Artikelfotos für ihren shop hiermit machen muss, habe ich das gui.lua ein wenig verschlankt und eingedeutscht.
Was mir/uns aber fehlt ist ein simpler download button, worüber die letzte Aufnahme auf ein entspr. Zielverzeichnis heruntergeladen wird. Das geht momentan nur mit der tree Funktion (etwas umständlich). Im ptpgui ist es ja implementiert, aber halt nicht in lua.

Daher meine Frage: gibt es evtl. eine Datei-download Routine, die ich in das gui.lua file von CHDKptp einfügen kann? so fit bin ich in lua noch nicht...(c++/lisp ist ok ;_))

VIELEN Dank

Matthias
Zuletzt geändert von msl am 29.05.2013, 09:59, insgesamt 2-mal geändert.
Grund: edit by mod:Titel ergänzt
matzgp
CHDK-Einsteiger
CHDK-Einsteiger
 
Beiträge: 7
Registriert: 20.05.2013, 16:50
Kamera(s): Canon G12

Re: CHDKptp liveView

Beitragvon msl » 20.05.2013, 19:56

Hallo und willkommen,

prinzipiell musst du bei so einer Aufgabe den Pfad der letzten Aufnahme auf der SD-Karte herausfinden. Wenn du den kennst, brauchst du nur noch die in chdkptp eingebaute Download-Funktion mit den entsprechenden Pfaden zu versehen und das ganze auf einen GUI-Button zu legen.

Es gibt 2 Arten von Lua-Skripten in Verbindung mit chdkptp. Die, die auf der Kamera laufen und die, die auf dem PC unter dem chdkptp-Klienten verwendeten werden.

Um den Pfad der letzten JPG-Datei zu ermitteln, kannst du folgende Zeile an die Kamera senden und ausführen lassen:
Code: Alles auswählen
string.format('%s/IMG_%04d.JPG',get_image_dir(),get_exp_count())
Diese Zeile gibt den Pfad als String zurück.

Im USAGE.TXT sind alle weiteren PC-seitigen Kommandos beschrieben. Damit sollte es möglich sein, eine Funktion zum Downloaden zu bauen.

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: CHDKptp liveView

Beitragvon matzgp » 21.05.2013, 06:24

Hallo, msl
vielen Dank für die schnelle Antwort und Danke für die Aufnahme ins Forum!
Soweit ich das bisher verstanden habe brauche ich die entspr. download routine als LUA script, das auf dem pc läuft.
Wo finde ich die in chdkptp eingebaute download-Funktion als lua script ??
DANKE
lg Matthias
matzgp
CHDK-Einsteiger
CHDK-Einsteiger
 
Beiträge: 7
Registriert: 20.05.2013, 16:50
Kamera(s): Canon G12

Re: CHDKptp liveView

Beitragvon msl » 21.05.2013, 21:09

Hallo,

deine Frage wird im oben verlinkten USAGE.TXT beantwortet.

Code: Alles auswählen
download (d) [-nolua] <remote> [local]
oder
Code: Alles auswählen
mdownload (mdl) [options] <remote, remote, ...> <target dir>

Die Optionsbeschreibung steht im genannten Text.

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: CHDKptp liveView

Beitragvon matzgp » 21.05.2013, 22:46

Hallo msl
Danke für Deine Geduld,
die entspr. usage hatte ich gefunden, ich komme wohl mit der syntax noch nicht klar...
hatte im gui.lua folgenden Button hinzugefügt:

expand="HORIZONTAL",
iup.button{
title='Testdownload',
size='95x15',
action=function(self)
gui.execquick([[
shoot()
pfad = (string.format('%s/IMG_%04d.JPG',get_image_dir(),get_exp_count()))
mdownload pfad c:\Temp
end
]])
end,
},

leider funzt das mit dem download danach noch nicht. pfad hat die letzte Datei erwischt (hatte ich mit print pfad überprüft) scheinbar funzt die variablenübergabe noch nicht..
DANKE
Matthias
matzgp
CHDK-Einsteiger
CHDK-Einsteiger
 
Beiträge: 7
Registriert: 20.05.2013, 16:50
Kamera(s): Canon G12

Re: CHDKptp liveView

Beitragvon msl » 22.05.2013, 12:11

Hallo,

ganz so einfach geht es dann nicht. :)

Zuerst sollte bedacht werden, was in der Kamera und was mit chdkptp ausgeführt wird. Außerdem muss man auch die zeitlichen Abläufe berücksichtigen. Es nützt nichts, den Download einzuleiten, wenn das Shooting noch garnicht fertig ist. Deshalb würde ich den Shoot-Befehl und das Herunterladen trennen.

Außerdem müssen die Konsolenbefehle für die GUI angepasst werden.

Ein Button für das Shooting ist vorhanden. Deshalb hier nun eine Lösung, die den Download organisiert. Dazu habe ich das Auslesen von Pfad und Dateiname auf der SD-Karte getrennt, um den Namen auch beim Speichern auf den PC verwenden zu können. Das Herunterladen der Datei wird nur eingeleitet, wenn das Auslesen von Pfad und Name erfolgreich war. Damit unterbinden wir mögliche Fehler im nächsten Schritt.
Syntax: [ Download ] [ Verstecken ]
Benutze Lua Syntax Highlighting
expand="HORIZONTAL",
iup.button{
    title="Testdownload",
    size="95x15",
    action=function(self)
        state1, path=con:execwait([[return get_image_dir()]])
        state2, name=con:execwait([[return string.format("/IMG_%04d.JPG",get_exp_count())]])
        if state1 and state2 then con:download(path..name, "D:/tmp"..name) end
    end,
},
Erstellt in 0.007 Sekunden, mit GeSHi 1.0.8.9


Theoretisch müsste man nun eine Routine erarbeiten, die auf ein mögliches Überschreiben einer existierenden Datei reagiert.

Gruß msl

P.S. Der GeSHi-Parser für Lua keine Hochkommas anzeigen, deshalb sind alle Hochkommas als Anführungszeichen dargestellt. Für Lua ist es egal, ob man Hochkomma oder Anführungszeichen verwendet.
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: CHDKptp liveView

Beitragvon matzgp » 22.05.2013, 13:59

Hallo msl
super Danke, war schon klar, dass das soo einfach nicht geht.
Daher nochmals vielen Dank für Deine Mühe.
Manchmal gibt es einen Punkt wo Autodidakik nicht mehr geht...
vielleicht kann ich mich ja mal revanchieren ;-)
Matthias
matzgp
CHDK-Einsteiger
CHDK-Einsteiger
 
Beiträge: 7
Registriert: 20.05.2013, 16:50
Kamera(s): Canon G12

Re: CHDKptp liveView

Beitragvon matzgp » 25.05.2013, 13:03

Hallo, ich nochmal,
wie müsste man den shoot() Befehl einbauen damit man gleichzeitig mit einer Taste auslöst UND den download veranlasst...
(klappt irgendwie nicht bei mir)
Danke
Matthias
matzgp
CHDK-Einsteiger
CHDK-Einsteiger
 
Beiträge: 7
Registriert: 20.05.2013, 16:50
Kamera(s): Canon G12

Re: CHDKptp liveView

Beitragvon msl » 26.05.2013, 09:43

Hallo,

prinzipiell sollte das kein Problem sein. Allerdings würde mich interessieren, unter welchen Bedingungen fotografiert wird? Es muss ja sichergestellt werden, dass das Shooting abgeschlossen ist, bevor die Bilddatei auf den Rechner geladen wird.

Nachfolgender Code sollte generell funktionieren. Es wird überprüft, ob überhaupt ein Aufnahmemodus aktiv ist. Wenn ja, wird das Shooting durchgeführt, bei dem gewartet wird, bis der gesamte Vorgang abgeschlossen wurde. Dafür wurden die Bestandteile von shoot() auseinandergenommen. Danach erfolgt der Download in der Hoffnung, dass auch das aktuelle Bild heruntergeladen wird.

Zur besseren Ãœbersicht habe noch ein paar Konsolenausgaben eingebaut.

Syntax: [ Download ] [ Verstecken ]
Benutze Lua Syntax Highlighting
iup.button{
    title="Shoot + Download",
    size="95x15",
    action=function(self)
        state1, rec=con:execwait([[local rec,vid = get_mode()
                        if rec and not vid then
                            press("shoot_half")
                            local n = 0
                            repeat
                                sleep(10)
                                n = n + 1
                            until get_shooting() == true or n > 100
                            press("shoot_full")
                            release("shoot_full")
                            release("shoot_half")
                            repeat sleep(10) until get_shooting() ~= true
                        end
                        return rec]])
        if not rec then gui.infomsg("no record mode\n") end
        if rec then
            state2, path=con:execwait([[return get_image_dir()]])
            state3, name=con:execwait([[return string.format("IMG_%04d.JPG",get_exp_count())]])
            if state2 and state3 then
            con:download(path.."/"..name, "D:/tmp/"..name)
            gui.infomsg("%s downloaded\n", name)
            end
        end
    end,
},
Erstellt in 0.009 Sekunden, mit GeSHi 1.0.8.9


Gruß msl

P.S. Ich habe mal den Thread-Titel ergänzt.
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: CHDKptp liveView: Shoot&Download-Button

Beitragvon matzgp » 26.05.2013, 13:19

wow, wo kann man denn hier was in die Kaffee-Kasse einzahlen...
Die Bedingungen des shootings sind still-Aufnahmen... d.h. Objekt unter live-view einrichten und dann aufnehmen.. hinterher direkte Kontrolle der Aufnahme mit irfanView, daher nach jedem Schuss der download, da es im live-view nicht aussagekräftig ist. Der eigentliche Grund war, dass wir von einer G9 auf eine G12 gewechselt sind und im nach hinein fesgestellt (leider) haben, dass die Fernbedienungsfunktion von Canon "abgeschaltet" war.
Da die SSD (wegen automatischem Start chdk) gelocked ist, dauert es, bis das Foto gespeichert ist, daher hab ich die sleep schleife <until get_shooting()> etwas verlängert)
Insofern bin ich froh, dass es Euch gibt!!

Danke Matthias

p.s. so ganz hab ich die lua syntax halt noch nicht drauf...
matzgp
CHDK-Einsteiger
CHDK-Einsteiger
 
Beiträge: 7
Registriert: 20.05.2013, 16:50
Kamera(s): Canon G12

Re: CHDKptp liveView: Shoot&Download-Button

Beitragvon msl » 26.05.2013, 22:55

Gut, dann sollten die Routinen zur Überprüfung des Shootings ausreichen.

Was mir nicht gefällt, ist die Festlegung, wo die Fotos abgelegt werden. Hier sollte eigentlich noch eine Auswahl möglich sein. Da sind wir dann schon beim Thema Lua.

Lua ist eine einfache aber mächtige Skriptsprache. Sie kommt mit 21 Schlüsselwörtern aus. Dazu gehören dann noch ähnlich viele Grundfunktionen. Der Rest wird über Bibliotheken, Module und Addons geregelt. CHDK-Lua hat dann noch die Besonderheit, dass nur mit Integer gerechnet werden kann.

Die hier verwendete GUI wird mit IUP.Lua bewerkstelligt. Das ganze wirkt dann etwas verwirrend, weil viele Dinge miteinander verknüpft werden, LUa + IUP, chdkptp-Funktionen, kameraspezifische Funktion.

Vielleicht ergibt sich noch eine Möglichkeit, eine entsprechende Auswahlmöglichkeit für den Speicherort zu integrieren.

Gruß msl

P.S. Die Kaffee-Kasse kommt bei uns in Form eines Spenden-Button daher (Download- und Impressum-Seite). Eingehende Spenden werden ausschließlich für Server-Unkosten eingesetzt.
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: CHDKptp liveView: Shoot&Download-Button

Beitragvon msl » 28.05.2013, 19:50

Hallo,

da die bisherige Lösung nur schnell zusammengeschrieben war, hier nun eine geordnete Lösung mit zusätzlicher Zielordnerauswahl per GUI-Button.
Syntax: [ Download ] [ Verstecken ]
Benutze Lua Syntax Highlighting
--def default download destination
local dest="C:\\"

--destination dir and shoot & download
    iup.hbox{
        iup.button{
            title="dest",
            size="23x15",
            action=function(self)
                local dlg=iup.filedlg{
                    dialogtype = "DIR",
                    title = "Destination",
                    directory="C:"
                }
                dlg:popup(iup_centerparent, iup_centerparent)
                if dlg.status == "0" then dest = dlg.value end
                gui.infomsg("download destination %s\n", dest)
            end,
        },
        iup.fill{},
        iup.button{
            title="shoot+download",
            size="67x15",
            fgcolor="255 0 0",
            action=function(self)
                local status, rec=con:execwait([[local rec,vid = get_mode()
                                            if rec and not vid then
                                                press("shoot_half")
                                                local n = 0
                                                repeat
                                                    sleep(10)
                                                    n = n + 1
                                                until get_shooting() == true or n > 100
                                                press("shoot_full")
                                                release("shoot_full")
                                                release("shoot_half")
                                                repeat sleep(10) until get_shooting() ~= true
                                            end
                                            return rec]])
                if not rec then gui.infomsg("no record mode\n") end
                if rec then
                    local status, path, name=con:execwait(&#39;return get_image_dir(), string.format("IMG_%04d.JPG",get_exp_count())&#39;)
                    if status then
                    dest = string.gsub(dest, "\\", "/")
                    if string.sub(dest, #dest) ~= "/" then dest=dest.."/" end
                    con:download(path.."/"..name, dest..name)
                    gui.infomsg("%s downloaded\n", name)
                    end
                end
            end,
        },
        expand="HORIZONTAL",
    },
    iup.fill{},
Erstellt in 0.012 Sekunden, mit GeSHi 1.0.8.9


(Achtung: Hochkomma wird falsch angezeigt. Statt & # 3 9 ; ist ein Hochkomma einzusetzen.)

Im Anhang befindet sich die komplette Datei gui.lua, mit der man die Orignaldatei aus dem chdkptp-Paket ersetzen kann.

Der Button [dest] öffnet ein Fenster, in dem man den Zielordner für die herunterzuladende Zieldatei auswählen kann. Vorgabe ist C:\. Mit dem Button [shoot+download] wird ein Foto erstellt und sofort in den festgelegten Zielordner. heruntergeladen.

Gruß msl
Dateianhänge
gui.lua
gui.lua mit eingefügter Shoot&Download-Funktion für chdkptp
(17.25 KiB) 727-mal heruntergeladen
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: CHDKptp liveView: Shoot&Download-Button

Beitragvon matzgp » 28.05.2013, 21:04

Perfekt!!
DANKE (nur ganz schnell)
ich denke, das bringt das CHDKptp ein ganzes Stück voran!
Matthias
matzgp
CHDK-Einsteiger
CHDK-Einsteiger
 
Beiträge: 7
Registriert: 20.05.2013, 16:50
Kamera(s): Canon G12

Re: CHDKptp liveView: Shoot&Download-Button

Beitragvon Marcel22 » 11.05.2018, 12:55

Hallo Liebes CHDK Forum :-)
mein Plan ist es für eine Hochzeit eine Fotobox zu basteln.
Dafür würde ich gerne die Software Freebooth verwenden (kostenlos).
Diese Software funktioniert super und ich benutze diese mit einem Android Handy (Daten werden von Handy über FTP auf Notebook übertragen mit WLAN).
Ich würde gerne als alternative meine alte IXUS 115 HS Kamera verwenden.
Dazu habe ich CHDK erfolgreich Installiert.
Mit der CHDKptp Software ist nun der Plan ein Skript zu schreiben welches ein Bild aufnimmt und danach sofort abspeichert (Capture JPG funktioniert leider nicht).
Später soll dann noch ein Bluetooth Shutter für die Bildaufnahme verwendet werden. Dazu ist der Plan das Skript als Schleife laufen zu lassen und bei Tasteneingabe die Aufnahme + Speicehrung durchzuführen.
Nun hab ich das oben gennante Skript gui.lua auf die neuste gui.lua version upgedatet (fehlende Zeilen hinzugefügt). Beim Ausführen des Shoot&Download Button wird ein Bild aufgenommen aber nicht abgespeichert. Das Problem liegt an folgender Zeile 506:
if not rec then gui.infomsg("no record mode\n")
Das rec ist null und somit wird dann der Download nicht ausgeführt.
Woran liegt der Fehler in diesem Skript ?

Code: Alles auswählen
--destination dir and shoot & download
    iup.hbox{
        iup.button{
            title="dest",
            size="23x15",
            action=function(self)
                local dlg=iup.filedlg{
                    dialogtype = "DIR",
                    title = "Destination",
                    directory="C:"
                }
                dlg:popup(iup_centerparent, iup_centerparent)
                if dlg.status == "0" then dest = dlg.value end
                gui.infomsg("download destination %s\n", dest)
            end,
        },
        iup.fill{},
        iup.button{
            title="shoot+download",
            size="67x15",
            fgcolor="255 0 0",
            action=function(self)
                local status, rec=con:execwait([[local rec,vid = get_mode()
                                            if rec and not vid then
                                                press("shoot_half")
                                                local n = 0
                                                repeat
                                                    sleep(10)
                                                    n = n + 1
                                                until get_shooting() == true or n > 100
                                                press("shoot_full")
                                                release("shoot_full")
                                                release("shoot_half")
                                                repeat sleep(10) until get_shooting() ~= true
                                            end
                                            return rec]])
                if not rec then gui.infomsg("no record mode\n")
            end
            
                if rec then
                    local status, path, name=con:execwait('return get_image_dir(), string.format("IMG_%04d.JPG",get_exp_count())')
                    if status then
                    dest = string.gsub(dest, "\\", "/")
                    if string.sub(dest, #dest) ~= "/" then dest=dest.."/" end
                    con:download(path.."/"..name, dest..name)
                    gui.infomsg("%s downloaded\n", name)
                    end
                end
            end,
        },
        expand="HORIZONTAL",
    },


Vielen Dank schoneinmal für eure Hilfe :-)
Marcel22
CHDK-Einsteiger
CHDK-Einsteiger
 
Beiträge: 4
Registriert: 11.05.2018, 12:43
Kamera(s): IXUS 115 HS

Re: CHDKptp liveView: Shoot&Download-Button

Beitragvon Werner_O » 25.05.2018, 15:22

Hallo Marcel22,

zunächst einmal muß ich ehrlich zugeben, daß ich Dein Script nur zu kleinen Teilen verstehe :-(

Mir ist aber aufgefallen, daß Du anscheinend die Variable "rec" als lokale Variable innerhalb der Struktur "action=function(self) ... end" definiert hast. Nach dem "end" gibt es diese lokale Variable aber m.W. nicht mehr und das nachfolgende "if rec then ... end" läuft dann ins Leere.
Möglicherweise klappt es ja, wenn Du "rec" stattdessen als globale Variable definierst.

Viel Glück und liebe Grüße
Werner_O
Benutzeravatar
Werner_O
CHDK-Legende
CHDK-Legende
 
Beiträge: 1027
Registriert: 22.10.2010, 13:12
Wohnort: Köln
Kamera(s): SX20 1.02d
SX240 1.01a
S100 1.01a
S3 1.00a

Nächste

Zurück zu Code-Ecke

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast