Einige Einsteigerfragen zu PTP und den LUA Befehlen

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

Einige Einsteigerfragen zu PTP und den LUA Befehlen

Beitragvon dorumn » 12.05.2011, 00:46

Hallo,

ich suche schon ziemlich lange nach einer Möglichkeit, eine Digitalkamera vom Rechner aus via Kommandozeile fernsteuern zu können. Vor kurzem bin ich auf CHDK und die PTP Schnittstelle gestoßen. Damit ist es mir erstmals gelungen, ein Foto mit einer Canon Powershot A620 vom Rechner aus zu machen und es dann auch herunterzuladen. Erstmal vielen Dank an die Community für diese bereitgestellten Funktionen.

Ich nutze Windows XP und CHDKPTP und gehe dabei folgendermaßen vor:
1. Ich verbinde mich mit der Kamera und wechsle in den Aufnahmemodus:
chdkptp.exe -c -e"lua set_record(1)"
2. Bild machen:
chdkptp.exe -c -e"lua shoot()"
3. Bild herunterladen:
chdkptp.exe -c -e"d dcim/100canon/FILENAME.jpg"

Soweit funktioniert das auch aber mir sind noch einige Dinge unklar.
1. Ich würde nach dem herunterladen des aktuellen Bildes gern alle Bilder in dem Ordner löschen. Ist dies in LUA möglich?

2. Ich möchte das automatische Ausschalten meiner Kamera unterbinden. Ich habs mit folgenden Befehlen versucht (diesmal im interaktiven Modus):
lua return get_config_value(67,-1)
lua set_config_value(67,1)
Ich bekomme mit "get" aber schon keinen Wert zurück. Wenn ich den obigen Befehl eingebe passiert erstmal gar nichts. Nach "getm" bekomme ich folgende Fehlermeldung:
error:runtime::1 attempt to call global 'get_config_value' (a nil value)
Was mache ich da falsch?

3. Das gleiche Problem habe ich beim Abschalten des Blitzes.
lua return get_config_value(236,-1)

4. Gibt es vielleicht auch eine Möglichkeit, die Bilder nur in Graustufen aufzunehmen?

Über Hilfe würde ich mich freuen.
dorumn
CHDK-Einsteiger
CHDK-Einsteiger
 
Beiträge: 12
Registriert: 11.05.2011, 18:46
Kamera(s): Canon Powershot A620
Canon Powershot A480

Re: Einige Einsteigerfragen zu PTP und den LUA Befehlen

Beitragvon rudi » 12.05.2011, 12:03

Hallo dorumn,

willkommen hier im Forum. Da hast du dich bereits erfolgreich eingearbeitet - sehr schön.

dorumn hat geschrieben:1. Ich würde nach dem herunterladen des aktuellen Bildes gern alle Bilder in dem Ordner löschen. Ist dies in LUA möglich?
Jede Datei in dem Ordner muss einzeln gelöscht werden. Du kannst per "lua"-Befehl auch komplexere Befehlsfolgen ausführen lassen. Oder du siehst dir die PTPcamGUI an, da ist die Löschmöglichkeit im "DCIM-Download" mit integriert.

dorumn hat geschrieben:2. Ich möchte das automatische Ausschalten meiner Kamera unterbinden. Ich habs mit folgenden Befehlen versucht (diesmal im interaktiven Modus):
lua return get_config_value(67,-1)
.
Fehlermeldung:
error:runtime::1 attempt to call global 'get_config_value' (a nil value)
Auf Grund der Fehlermeldung vermute ich, du hast das int. CHDK auf der Kamera. Die von dir gewünschte Funktion ist nur mit CHDK-DE nutzbar.

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

Re: Einige Einsteigerfragen zu PTP und den LUA Befehlen

Beitragvon dorumn » 12.05.2011, 15:48

Hallo Rudi,

ja, ich hatte die falsche CHDK Version drauf, habs geändert und jetzt kann ich die Werte auslesen und ändern. Allerdings schaltet sich meine Kamera immernoch nach max 5 Minuten ab. Ich habe mittels "Get_config_value(67,-1)" den Wert "1" herausbekommen. Das sollte doch shon für das deaktivieren der Stromsparfunktion stehen? Hab den Wert mittels "set_config_value" auch mal auf 0 gesetzt, mit dem gleichen Ergebnis. Muss ich da noch etwas beachten?

Zur Löschung der Bilder: Mir ist es mit "os.remove" gelungen, ein einzelnes Bild zu entfernen. Jetzt wollte ich mir ein Skript schreiben, dass sich die Namen aller Bilder im "100Canon" Ordner holt und sie dann der Reihe nach löscht. Aber wie bekomme ich die Liste der Bilder in eine Variable? Ich habe "os.execute("ls A/DCIM/100CANON")" getestet aber da bekomme ich gar nichts zurück (nur wieder "a nil value").
Die GUI ist nichts für mich.
dorumn
CHDK-Einsteiger
CHDK-Einsteiger
 
Beiträge: 12
Registriert: 11.05.2011, 18:46
Kamera(s): Canon Powershot A620
Canon Powershot A480

Re: Einige Einsteigerfragen zu PTP und den LUA Befehlen

Beitragvon rudi » 12.05.2011, 16:42

Hallo Dorumn,

schau dir die Funktion os.listdir() im Wiki an.

Die gesamte Funktion könnte dann so aussehen (ungetestet):
Syntax: [ Download ] [ Verstecken ]
Benutze Lua Syntax Highlighting
-- c gibt die Anzahl der gelöschten Dateien zurück
-- bei einem Löschfehler wird alles abgebrochen

function delfileson(path)
  local fd,c,i,fpath,stat=os.listdir(path),0
  if fd~=nil and #fd>0 then
    for i=1, #fd do
      fpath=path .. "/" .. fd[i]
      stat=os.stat(fpath)
      if stat~=nil and stat.is_file==true and os.remove(fpath)~=nil then
        c=c+1
      else
        break
      end
    end
  end
  return c
end
Erstellt in 0.007 Sekunden, mit GeSHi 1.0.8.9


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

Re: Einige Einsteigerfragen zu PTP und den LUA Befehlen

Beitragvon reyalp » 12.05.2011, 17:53

If you are using chdkptp, you might want to look at chdku.listdir() in http://trac.assembla.com/chdkptp/browse ... /chdku.lua

You can run something like this on the PC (using the ! command or add to one of the lua files).
Code: Alles auswählen
files=chdku.listdir("A/DCIM/100CANON",{stat="*"})
for i,st in ipairs(files) do
  if st.is_file then
     chdku.execwait("os.remove('A/DCIM/100CANON/'..st.name..")")
  end
end

Of course, you will want some error checking, and so on. This is untested, off the top of my head so there are probably mistakes!

If you use !, everything must be on one line.

I suggest using the latest .lua files from svn if you are using chdkptp, i've fixed some bugs since the last binary update. The C code hasn't changed so the binaries are fine.

Sorry for posting english, i use google translate to read, I guess you can do the same ;)
reyalp
CHDK-Einsteiger
CHDK-Einsteiger
 
Beiträge: 29
Registriert: 25.12.2010, 01:18
Kamera(s): a540 d10 sx160 elph130 g7x sx710 elph180 sx730

Re: Einige Einsteigerfragen zu PTP und den LUA Befehlen

Beitragvon dorumn » 12.05.2011, 22:50

Hallo Rudi,

ich hab mal deinen Code genommen, den in ein .lua File kopiert und das in den SCRIPTS Ordner der Kamera kopiert. Das sieht jetzt so aus:
Code: Alles auswählen
--[[
@title deleteallfiles
]]

function delfileson(path)
  local fd,c,i,fpath,stat=os.listdir(path),0
  if fd~=nil and #fd>0 then
    for i=1, #fd do
      fpath=path .. "/" .. fd[i]
      stat=os.stat(fpath)
      if stat~=nil and stat.is_file==true and os.remove(fpath)~=nil then
        c=c+1
      else
        c=-1
        break
      end
    end
  end
  return c
end

write_usb_msg("Delete all Files")
write_usb_msg(delfileson("A/DCIM/100CANON"))
write_usb_msg("END")


Das Skript hab ich dann via "lua loadfile("A/CHDK/SCRIPTS/delete.lua")()" gestartet und anschließend mit "getm" die Ausgaben abgefragt. Da tut sich aber nichts, "error:runtime::68 ... nil value". Was hab ich denn da falsch gemacht?

Hello reyalp,
I've added your code at the end of "chdku.lua", looks like this:
Code: Alles auswählen
function chdku.deleteallfiles()
  files=chdku.listdir("A/DCIM/100CANON",{stat="*"})
  for i,st in ipairs(files) do
    if st.is_file then
      chdku.execwait("os.remove('A/DCIM/100CANON/'..st.name..'')")
    end
  end
end

After saving I called the function:
!chdku.deleteallfiles()
But nothing happens, no errors but the image files are still there too.
dorumn
CHDK-Einsteiger
CHDK-Einsteiger
 
Beiträge: 12
Registriert: 11.05.2011, 18:46
Kamera(s): Canon Powershot A620
Canon Powershot A480

Re: Einige Einsteigerfragen zu PTP und den LUA Befehlen

Beitragvon reyalp » 13.05.2011, 04:16

dorumn hat geschrieben:I've added your code at the end of "chdku.lua", looks like this:
Code: Alles auswählen
function chdku.deleteallfiles()
  files=chdku.listdir("A/DCIM/100CANON",{stat="*"})
  for i,st in ipairs(files) do
    if st.is_file then
      chdku.execwait("os.remove('A/DCIM/100CANON/'..st.name..'')")
    end
  end
end

After saving I called the function:
!chdku.deleteallfiles()
But nothing happens, no errors but the image files are still there too.

I said it was untested and you'd want to add error checking ;)

It looks like I had some errors in the quoting on execwait, and since you aren't checking for errors, you got no error message.

I've checked in a working version in http://trac.assembla.com/chdkptp/changeset/54
Use
Code: Alles auswählen
!return chdku.deletefiles("A/DCIM/CANON100")

Return will make the CLI print the result. You can also send a pattern (lua pattern, not DOS glob) like
Code: Alles auswählen
!return chdku.deletefiles("A/DCIM/CANON100","%.JPG$")

Note the directory must not end in / *unless* it's A/ (thanks canon #-o )
reyalp
CHDK-Einsteiger
CHDK-Einsteiger
 
Beiträge: 29
Registriert: 25.12.2010, 01:18
Kamera(s): a540 d10 sx160 elph130 g7x sx710 elph180 sx730

Re: Einige Einsteigerfragen zu PTP und den LUA Befehlen

Beitragvon dorumn » 13.05.2011, 14:39

Thank you reyalp, your updated code works very well.

Die Kamera schaltet sich auch nicht mehr automatisch aus seit ich den Parameter 3 verwende:
set_config_value(67,3)
Dabei dachte ich, dass "3" das Ausschalten nur deaktiviert, wenn ein Lua Skript läuft. Soweit ich weiß läuft bei mir aber keins, aber solange es funktioniert ...

Einzig den Blitz kann ich nicht deaktivieren, bei "0" und "1" bleibt er aktiviert und "2" scheint nicht zu funktionieren, denn wenn ich den Befehl
set_config_value(236,2)
eingebe, schaltet sich die Kamera sofort ab.
dorumn
CHDK-Einsteiger
CHDK-Einsteiger
 
Beiträge: 12
Registriert: 11.05.2011, 18:46
Kamera(s): Canon Powershot A620
Canon Powershot A480

Re: Einige Einsteigerfragen zu PTP und den LUA Befehlen

Beitragvon msl » 13.05.2011, 15:42

Hallo,

das Verwenden von set_config_value() ist hier eigentlich überflüssig, da du diese Einstellungen im CHDK-Menü vornehmen kannst.

set_config_value(67,3) ist die Einstellung für Stromsparmodus [always] im CHDK-Menü.

set_config_value(236,2) gibt es es nicht. Hier sind nur 0 oder 1 zulässig bzw. [off/on]. Die Einstellung steht für Flash Override und bedeutet, dass trotz deaktiviertem Blitz ein Blitz mit einstellbarer Stärke erzwungen wird. Die Blitz-Einstellung musst du mit den Canon-Einstellungen aktivieren/deaktivieren. Man kann aber auch die zuständige Propertycase-Variable lesen oder setzen (für die A620 Propset 1 - Nr. 16).

Im Übrigen könnte die GUI genau für solche Probleme die richtige Testumgebung sein. ;)

@reyalp

Thanks for helping. English writing is not a problem. You are welcome.

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: Einige Einsteigerfragen zu PTP und den LUA Befehlen

Beitragvon dorumn » 14.05.2011, 13:56

Hallo msl,

danke für den Tipp, da hab ich mich wohl bei den Werten vertan. Mit set_prop(16,2) im Aufnahmemodus funktioniert es einwandfrei.
dorumn
CHDK-Einsteiger
CHDK-Einsteiger
 
Beiträge: 12
Registriert: 11.05.2011, 18:46
Kamera(s): Canon Powershot A620
Canon Powershot A480


Zurück zu Code-Ecke

Wer ist online?

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

cron