[PTP] elementare PTP-Interface-Funktion

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

Re: elementare PTP-Interface-Funktion

Beitragvon msl » 07.12.2010, 23:06

Hallo,

nur zur Information: Durch die Änderungen in Rev. 497 gibt der Konsolen-Befehl luar keine Werte zurück. Das Problem wird bestimmt in Kürze geklärt, lässt sich aber bei den aktuell durchgeführten und noch durchzuführenden komplexen Änderungen zur Trennung der Skriptsprachen leider nicht vermeiden.

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: elementare PTP-Interface-Funktion

Beitragvon TaiJiGong » 12.12.2010, 21:29

Hallo Zusammen,

finde es etwas Schade das sich nicht mehr Leute zum probieren/testen finden. Vieleicht könnte man das [Info] in [Test] ändern.

Die letzte Zeit verwende ich öffters die Sequenz:

- upload
- reboot
- mode 1
- lua shoot()

Läuft ohne Probleme. Und es ist zum Testen von Software kein handtieren mit der SD-Card mehr erforderlich. Das ist natürlich nur ein minimaler Ausschnitt wozu man PTP verwenden kann und ich würde mich freuen wenn wir das um weitere Funktionen erweitern würden.

Viele Grüße,

TaiJiGong
Canon IXUS 100 (SD780) Firmware: 1.00C, sonst nur rein mechanische Kameras wie Pentax-MX
TaiJiGong
CHDK-Begeisterter
CHDK-Begeisterter
 
Beiträge: 320
Registriert: 08.04.2010, 20:10
Wohnort: München
Kamera(s): IXUS100is, 100c
IXUS IIs (etwas defekt ohne CHDK)

Re: elementare PTP-Interface-Funktion

Beitragvon rudi » 13.12.2010, 12:51

Hallo,

TaiJiGong hat geschrieben:... ich würde mich freuen wenn wir das um weitere Funktionen erweitern würden.

Das wird wohl noch etwas dauern. Solange das "luar"-Problem besteht und der Umbau für die Skriptrennung nicht abgeschlossen ist, ruht die Entwicklung auch im int. Forum.

Dem "luar"-Problem bin ich jetzt nachgegangen und habe folgende Erkenntnisse gewonnen:

Die Auswirkungen des Problems lassen sich in der ptp.c ab Zeile 391 finden.
Ein Zähler in der While-Schleife (Zeile 394) ergab, dass diese niemals durchlaufen wird, unabhängig von der Komplexität der "luar"-Ausdrücke. Selbst ein "luar sleep(2000)" ermöglichte ohne Wartezeit eine neue Eingabe in der ptp-Komandozeile. Das führt zu der Erkenntnis, dass "script_is_running()" keinen gültigen Wert liefert und die Warteschleife nicht durchlaufen wird. Ich habe spasseshalber mal das Ergebnis negiert und siehe da, es kommt zum ptp-Timeout und die Kamera wartet und wartet und ... auf das Scriptende.
Dass Verhalten von "script_is_running()" war auch schon beim Anpassen des msl-Branches bemerkt worden.

Scheibt man nach der While-Schleife einen Sleep-Befehl, dann werden die Ergebnisse wieder sichtbar. Dieser wird allerdings immer ausgeführt und muss natürlich länger als die "luar"-Ausführungszeit sein. Tests wie "luar sleep()" sind dann aber unangebracht.

Meine Testversion sieht jetzt so aus:
Syntax: [ Download ] [ Verstecken ]
Benutze C Syntax Highlighting
391         if ( param3 & PTP_CHDK_ES_WAIT )
392         {
393
394           while ( script_is_running() )
395             msleep(100);
396          msleep(2000);
397           if ( param3 & PTP_CHDK_ES_RESULT )
Erstellt in 0.004 Sekunden, mit GeSHi 1.0.8.9


[EDIT]
Jetzt habe ich den Fehler gefunden. Beim Erzeugen des neuen Action-Stacks wird statt der Task-ID des Stacks der Stack-Index zurückgegeben. Dadurch geht der Test "script_is_running()" ins Leere. Anbei der Patch für Trunk 506.
[/EDIT]


Gruß rudi
Dateianhänge
trunk506_luar_patch.diff
luar-Patch Basis: Trunk506
(402 Bytes) 483-mal heruntergeladen
Zuletzt geändert von rudi am 13.12.2010, 19:30, insgesamt 1-mal geändert.
Benutzeravatar
rudi
CHDK-Spezialist
CHDK-Spezialist
 
Beiträge: 510
Registriert: 11.09.2009, 11:27
Kamera(s): A590IS_101B, SX260_100B

Re: elementare PTP-Interface-Funktion

Beitragvon msl » 13.12.2010, 19:22

rudi, du bist genial. =D>

Vielen Dank für deine Analyse. Die Änderung wird schnellstmöglich eingepflegt.

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: elementare PTP-Interface-Funktion

Beitragvon TZocker » 18.12.2010, 15:17

Mal was anderes:

Bei meiner a650

Funzt theoretisch nur wann: Ich habe fest gestellt das es manchmal vorkommt das man nach
mode 1
lua shoot()

die kammera zu erst in mode 1 wechselt und dann aber kein bild macht aber wenn man dann den mode modus wechselt dann macht sie ein bild.

wäre es auch möglich das man nicht immer im wiedergabemodus der kamera sein muss um der kamera befehle zugeben.
Canon A 650 IS
TZocker
CHDK-Begeisterter
CHDK-Begeisterter
 
Beiträge: 51
Registriert: 12.06.2009, 16:20
Kamera(s): A 650

Re: elementare PTP-Interface-Funktion

Beitragvon rudi » 18.12.2010, 21:38

Hallo TZocker,

alle Aufnahmefunktionen können nur im Aufnahme-Modus (mode 1) erfolgen. Für alle anderen Befehle ist der Mode egal. Die PTP-Verbindung kann nur im Wiedergabemodus hergestellt werden.

TZocker hat geschrieben:... die kammera zu erst in mode 1 wechselt und dann aber kein bild macht aber wenn man dann den mode modus wechselt dann macht sie ein bild.

Kannst du das bitte noch einmal anders beschreiben?

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

Re: elementare PTP-Interface-Funktion

Beitragvon TZocker » 18.12.2010, 22:05

also Ausgang: Kamera im Wiedergabemodus mit pc verbunden

gibt man die befehle ein:

mode 1
lua shoot()

so wechselt die kamera in modus 1 (Fotomodus)

manchmal überspring die kamera den befehl lua shoot() dies geschied zz bei mir sehr häufig

wenn man dann manuell per Hand auf den Fotomodus wechselt fürt die kamera lua shoot() aus.
Canon A 650 IS
TZocker
CHDK-Begeisterter
CHDK-Begeisterter
 
Beiträge: 51
Registriert: 12.06.2009, 16:20
Kamera(s): A 650

Re: elementare PTP-Interface-Funktion

Beitragvon rudi » 20.12.2010, 07:38

Hallo TZocker,

der mode-Befehl wird mittels des LUA-Befehls "switch_mode_usb(mode)" ausgeführt. Der Befehl startet nur die Umschaltung, er wartet nicht auf die erfolgreiche Beendigung. Daher kann das shoot() schon vor dem Abschluss der Umschaltung zur Kamera geschickt werden. Im besten Fall wird es ignoriert. Im ungünstigsten Fall reagiert dann die Kamera nicht mehr.

Versuche es mal so
Code: Alles auswählen
mode 1
// Warten bis die Kamera für die Aufnahme bereit ist
lua shoot()


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

Re: elementare PTP-Interface-Funktion

Beitragvon TaiJiGong » 20.12.2010, 22:48

Hallo Zusammen,

Revision 509: 20 Dec 2010 10:29:24
Aktualisierung auf Rev. 1005 offizieller Trunk
* http://tools.assembla.com/chdk/changeset/1005/trunk
* Betrifft PTP-Interface
* PTP-Modul um 2 Funktionen erweitert: ScriptSupport und ScriptStatus
* Auslesbar als Bit-Maske, damit erweiterbar fuer andere Abfragen
* Bit 0 Parameter 1 gesetzt ScriptSupport=Lua, Bit 0 Parameter 1 gesetzt ScriptStatus=aktiv

Weis schon jemand wie diese Funktionen nutzbar sind ?


Viele Grüße,

TaiJiGong
Canon IXUS 100 (SD780) Firmware: 1.00C, sonst nur rein mechanische Kameras wie Pentax-MX
TaiJiGong
CHDK-Begeisterter
CHDK-Begeisterter
 
Beiträge: 320
Registriert: 08.04.2010, 20:10
Wohnort: München
Kamera(s): IXUS100is, 100c
IXUS IIs (etwas defekt ohne CHDK)

Re: elementare PTP-Interface-Funktion

Beitragvon rudi » 20.12.2010, 23:36

Hallo TaiJiGong,

TaiJiGong hat geschrieben:Weis schon jemand wie diese Funktionen nutzbar sind ?

Änderungem für diese Funktionen werden erst nach Aktualisierung der ptpcam.exe nutzbar. Patches und eine ptpcam.exe dazu findest du hier.

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

Re: elementare PTP-Interface-Funktion

Beitragvon rudi » 22.12.2010, 19:09

Hallo PTP-ler,

im ersten Beitrag habe ich die Befehlsliste und die ptpcam.exe aktualisiert. Die Kamera und ptpcam.exe besitzen jetzt eine Version 0.2 (Konsolenbefehl "version").

Wozu werden die neuen Befehle benötigt?

script-support:
Da es zukünftig möglich sein wird CHDK komplett ohne Skriptunterstützung kompilieren zu können und evtl. zusätzlich uBasic noch zur Verfügung steht, ist es erforderlich per PTP diese Information abfragen zu können. Ist der Wert größer Null, dann ist mindestens eine Skriptsprache nutzbar. Welche das ist wird durch den Wert angegeben. Zur Zeit ist nur lua implementiert und wird mit "1" gekennzeichnet.

Hier kann lua genutzt werden:
Code: Alles auswählen
<conn> script-support
script-support:1

script-status:
Nach dem Starten eines Skriptes mit dem Befehl "lua ..." erhält ptpcam die Kontrolle sofort nach dem Start zurück. Mit "script-status" erhält man eine Information ob das Skript noch ausgeführt wird. Der Rückgabewert "0" bedeutet "kein Skript wird ausgeführt". Ein Rückgabewert größer Null zeigt die ausführende Skriptsprache an. Der Wert ist äquivalent zum Befehl "script-support".
Hinweis: Wird während der Ausführung eines Skriptes ein weiter lua-Befehl übermittelt, wird dieser kommentarlos nicht ausgeführt.

Hier wird ein 10 Sekunden dauerndes Skript gestartet und lässt eine LED blinken. Während der Ausführung kann der "script-status" zur Kontrolle abgefragt werden.
Tipp: Die erste Statusabfrage dient hauptsächlichst der Eingabe in die Konsole, denn dadurch kann man nach dem Skriptstart mittels der Taste "Cursor-Auf" den Befehl zur Ausführung wiederholen und "ENTER" drücken.
Code: Alles auswählen
<conn> script-status
script-running:0
<conn> lua for i=0,10 do set_led(8,1);sleep(700);set_led(8,0);sleep(300) end
<conn> script-status
script-running:1
<conn> script-status
script-running:1
<conn> script-status
script-running:1
<conn> script-status
script-running:0


Dank msl sind die Quellen für ptpcam jetzt im Trunk eingepflegt. Benutzer der CHDK-Shell können damit die ptpcam.exe (32Bit) selbst erstellen.
Dazu muss das Makefile den Speicherort des Libusb-Treibers kennen, der bei jedem Benutzer anders sein kann. Daher habe ich einen angepassten Libusb-Ordner erstellt, sowie das korregierte Makefile "makefile.chdkshell" (siehe Anhang).

Eine eigen ptpcam.exe erstellen:

    [EDIT 23.12.10]
    Der Punkt 1. Vorbereitung kann ab Revision 511 übersprungen werden. Msl hat die Dateien mit in den Trunk eingepflegt. Danke msl.
    [/EDIT]


    1. Vorbereitung (nur für Revision 510!)
  • CHDK-Shell mit aktuellem DE-Trunk öffnen.
  • In den Ordner "tools/ptpcam/" des aktuellen Trunks den Inhalt des Anhangs kopieren.

    2. Erstellen
  • Die Kompilerkonsole der CHDK-Shell durch Klicken auf das Konsolen-Icon rechts neben dem Button "Compile Selected" öffnen.
  • Diese Befehlszeile kompiliert nun die ptpcam.exe
    Code: Alles auswählen
    make -C tools/ptpcam -f makefile.chdkshell
  • Die Konsole mit "exit" beenden.
  • Die erstellte ptpcam.exe steht im Ordner "tools/ptpcam/".

Gruß rudi
Dateianhänge
tools_ptpcam_chdkshell.zip
Ordner und Makfile zum Erstellen der ptpcam.exe mit CHDK-Shell
(6.31 KiB) 491-mal heruntergeladen
Benutzeravatar
rudi
CHDK-Spezialist
CHDK-Spezialist
 
Beiträge: 510
Registriert: 11.09.2009, 11:27
Kamera(s): A590IS_101B, SX260_100B

Re: elementare PTP-Interface-Funktion

Beitragvon rudi » 25.12.2010, 19:05

Neuerung ab Revision 515:

Die ptpcam.exe kann nun auch in der Komandozeile verwendet werden.

Beispiel die Abfrage der Version:
Code: Alles auswählen
ptpcam --chdk="version"
ptpcam: 0.2
camera: 0.2

Wichtig!
  1. Der Befehl muss in Anführungszeichen eingeschlossen sein.
  2. Das Gleichheitszeichen muss ohnen Leerzeichen geschrieben werden.
  3. Auch für das Abfragen der chdk Befehle mit "help" muss die PTP-Verbindung stehen.
Beispiel2 - "help_ptpcam_chdk.cmd":
Syntax: [ Download ] [ Verstecken ]
Benutze DOS Syntax Highlighting
rem CHDK-DE Revision 515
rem Neu: Modus Komandozeile für ptpcam.exe --chdk

rem Verwendung

rem ptpcam --chdk="Befehl"

rem Beispiel: speichert die Befhlsliste für Modus --chdk

rem in der Datei help_ptpcam_chdk.txt

@echo off
set hfile=help_ptpcam_chdk.txt
@echo ------------------------------------------
@echo  Erstelle Hilfedatei fuer "ptpcam --chdk"
@echo  Dateiname: %hfile%
@echo ------------------------------------------
@echo.
@echo PTP-Verbindung hergestellen!
@echo.
pause
ptpcam.exe --chdk="help" > %hfile%
Erstellt in 0.003 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: elementare PTP-Interface-Funktion

Beitragvon TaiJiGong » 28.12.2010, 11:42

Hallo rudi,

At revision 515.

Kompilieren unter LINUX (opensuse) ist OK. Um warnings zu unter drücken habe ich eine Kleinigkeit in libptp-endian.h geändert.

Code: Alles auswählen
lua for i=0,10 do set_led(2,1); sleep(1000); set_led(2,0); sleep(1000) end


Geht nicht auf Anhieb. Die Kammera schaltet sich aus. Nach etwas probieren habe ich fest gestellet das die Schleife funktioniert, wenn zuvor ein lua Befehl (z.B.: lua set_led(2,1) ) ausgeführt wurde.



Viele Grüße,

TaiJiGong
Dateianhänge
libptp-endian.diff
(520 Bytes) 487-mal heruntergeladen
Canon IXUS 100 (SD780) Firmware: 1.00C, sonst nur rein mechanische Kameras wie Pentax-MX
TaiJiGong
CHDK-Begeisterter
CHDK-Begeisterter
 
Beiträge: 320
Registriert: 08.04.2010, 20:10
Wohnort: München
Kamera(s): IXUS100is, 100c
IXUS IIs (etwas defekt ohne CHDK)

Re: elementare PTP-Interface-Funktion

Beitragvon TaiJiGong » 29.12.2010, 20:39

Hallo Zusammen,

ich habe heute mal versucht per PTP Directories auszulesen. Um zu sehen welche Bilder auf der SD-CARD gespeichert sind. Nun bin ich soweit das etwas funktioniert, aber leider gibt es noch Probleme:

- Die Größe von LUA-Variablen ist evtl. beschränkt oder "luar" kann nur eine bestimmte größe eines RETURN Strings per PTP zurück geben.

Ich habe das Script "LS.LUA" auf die SD-Card nach "A/LS.LUA" kopiert/upload. Mit luar dofile(..) kann man es dann aufrufen.

Ausgabe meins "ersten" LUA-Scripts:

<conn> luar dofile( "A/LS.LUA" )
100CANON [DIR]

Directory [A/DCIM/100CANON]

CRW_2636.CRW 18653760
CRW_2637.CRW 18653760
108CANON [DIR]

Directory [A/DCIM/108CANON]

IMG_2620.JPG 1893668
IMG_2621.JPG 1726163
IMG_2624.JPG 1715254
IMG_2625.JPG 1755012
IMG_2626.JPG 1711056
IMG_2627.JPG 1752496
IMG_2628.JPG 1756710
IMG_2629.JPG 1643004
IMG_2630.JPG 1641315
IMG_2631.JPG 1710764
IMG_2632.JPG 1690827
IMG_2633.JPG 1714918
IMG_2634.JPG 1711933
IMG_2635.JPG 1746996
IMG_2636.JPG 1871663
IMG_2637.JPG 1769803
CANONMSC [DIR]

Directory [A/DCIM/CANONMSC]

M0108.CTG 160
<conn> shutdown
< > q


Wenn jemand mit LUA Erfahrung hat, würde ich mich um Anregungen freuen. Ins Besondere währe die Übergabe einer Variablen an das Script interressant.

Viele Grüße,

TaiJiGong
Dateianhänge
ls.lua
(1.23 KiB) 492-mal heruntergeladen
Canon IXUS 100 (SD780) Firmware: 1.00C, sonst nur rein mechanische Kameras wie Pentax-MX
TaiJiGong
CHDK-Begeisterter
CHDK-Begeisterter
 
Beiträge: 320
Registriert: 08.04.2010, 20:10
Wohnort: München
Kamera(s): IXUS100is, 100c
IXUS IIs (etwas defekt ohne CHDK)

Re: elementare PTP-Interface-Funktion

Beitragvon TaiJiGong » 30.12.2010, 21:41

Hallo Zusammen,

ich habe das Script um die Ausgabe des Datums (der letzten Änderung) erweitert.

Code: Alles auswählen
Directory [A/DCIM/100CANON]

CRW_2636.CRW      18653760    2010-12-29 21:15:30
CRW_2637.CRW      18653760    2010-12-29 21:15:46


Viele Grüße,

TaiJiGong
Dateianhänge
ls.lua
(1.37 KiB) 501-mal heruntergeladen
Canon IXUS 100 (SD780) Firmware: 1.00C, sonst nur rein mechanische Kameras wie Pentax-MX
TaiJiGong
CHDK-Begeisterter
CHDK-Begeisterter
 
Beiträge: 320
Registriert: 08.04.2010, 20:10
Wohnort: München
Kamera(s): IXUS100is, 100c
IXUS IIs (etwas defekt ohne CHDK)

VorherigeNächste

Zurück zu Code-Ecke

Wer ist online?

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