[uBasic] USB Fernauslöser ohne Verzögerung?

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

Beitragvon gehtnix » 24.09.2008, 14:22

@Plenz

in der Ãœbersicht der Scriptbefehle tauchen noch weitere Variablen auf die in CHDK schon festgelegt sind.
Diese werden im Script nur abgerufen.

z.B. get_display_mode, liest den Zustand für den LCD-Mode aus. set_focus den Wert kann man setzen.
http://chdk.wikia.com/wiki/German/Handb ... BCr_uBasic

Dann noch diese Werte, gegliedert nach Digic II und III
http://chdk.wikia.com/wiki/PropertyCase
Diese werden im Script aufgerufen und ausgelesen

Mit @param legst Du selbst fest was damit "geschieht" - der Unterschied.
Du könntest zwar mit "@param get_usb_power" den so definieren, er würde aber nicht mit dem eigentlichen get_usb_power kollidieren weil es nur im Optionsmenü als Text angezeigt wird. Der eigentlichen Parameter wäre z.b. ein a.

gruß gehtnix
Benutzeravatar
gehtnix
CHDK-Legende
CHDK-Legende
 
Beiträge: 2406
Bilder: 8
Registriert: 17.04.2008, 12:42
Wohnort: München
Kamera(s): A610 100e+f + IXUS990 IS

Beitragvon Plenz » 24.09.2008, 14:48

Ich spreche von den Variablen c, p und z. Alle sind variabel und bekommen im Verlauf des Programms verschiedene Werte zugeordnet. Jedoch sollen nur c und z mit @param deklariert werden, und bei p soll das nicht notwendig sein. Warum dieser Unterschied?

Ich hoffe, meine Frage ist nun endlich verständlich formuliert.
Benutzeravatar
Plenz
CHDK-Begeisterter
CHDK-Begeisterter
 
Beiträge: 110
Bilder: 1
Registriert: 21.09.2008, 12:51
Kamera(s): SX230HS

Beitragvon msl » 24.09.2008, 14:49

Ich glaube, bei der Diskussion läuft einiges falsch. Es gibt für uBasic nur 52 Variablen, a - z und A - Z.

Über die Parametervorgabe ist es möglich, aber nicht zwingend notwendig, den Variablen a - z einen Vorgabewert zu verpassen, dem man dann auch im Skript-Menü verändern kann.

Generell haben alle Variablen erstmal den Wert 0.

get_usb_power ist eine Funktion, die bei Aufruf einen Rückgabewert hat, der dann einer Variablen zugewiesen werden kann. Im Beispiel erhält dann halt p den Rückgabewert.

Zur besseren Darstellung, was Variable und was Funktion ist, habe ich das Skript mal an LUA angepasst:
Syntax: [ Download ] [ Verstecken ]
Benutze Lua Syntax Highlighting
--[[

@title Remote Control

@param z Zustand

@default z 1

@param f Abstand Fokussierung

@default f 20

@param r RC Verzögerung

@default r 100

]]




count = 0



while 1 do

    repeat

        p = get_usb_power()

        wait_click(r)

        if is_pressed "remote" then

        count = count + 1

        if count > f then

        if z > 0 then

                release "shoot_half"

                sleep (100)

                press "shoot_half"

                end

        count = 0 end

        end



        if p > 100 then

        p = 0

        if z > 0 then

            z = 0

            release("shoot_half")

            print("sh AUS")

            else

            z = 1

            press("shoot_half")

            print("sh EIN")

            end

        end



        if p > 0 then

        p = 0

        cls()

        click("shoot_full")

        release("shoot_half")

        z = 0

            print("sh AUS")

        end

    until p > 0



end
Erstellt in 0.011 Sekunden, mit GeSHi 1.0.8.9


In LUA gibt es natürlich ganz andere Möglichkeiten, mit Variablen umzugehen.

Die Routine zur automatischen Wiederholung der Fokussierung funktioniert etwas anders, da LUA zu schnell ist. :D


Gruß msl
Zuletzt geändert von msl am 05.12.2008, 14:06, insgesamt 1-mal geändert.
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

Beitragvon Plenz » 24.09.2008, 14:59

Entschuldige bitte, ich programmiere seit 30 Jahren in einem Dutzend verschiedenster Programmiersprachen. Grundlagenunterricht ist wirklich Zeitverschwendung, danke aber trotzdem.

Wenn ich dich richtig verstanden habe, kann man sich also @params und @default generell sparen, oder?
Benutzeravatar
Plenz
CHDK-Begeisterter
CHDK-Begeisterter
 
Beiträge: 110
Bilder: 1
Registriert: 21.09.2008, 12:51
Kamera(s): SX230HS

Beitragvon gehtnix » 24.09.2008, 15:09

Genau, habe ich ja geschrieben.
c=0 reicht völlig aus.

Aber eben nur für dieses Script.

gruß gehtnix
Benutzeravatar
gehtnix
CHDK-Legende
CHDK-Legende
 
Beiträge: 2406
Bilder: 8
Registriert: 17.04.2008, 12:42
Wohnort: München
Kamera(s): A610 100e+f + IXUS990 IS

Beitragvon msl » 24.09.2008, 15:15

Hallo Plenz,

ja, Du kannst Dir das generell sparen. Es sei denn, Du willst Werte im Skriptmenü über die Tastatur verändern.

Ich wollte auch nicht Deine Kenntnisse in Frage stellen. Es wurde aber von anderer Seite behauptet, das Funktionen (oder Befehle) wie get_usb_power Variablen sind. Das wollte ich nur richtig stellen.

Du hast auch vollkommen richtig erkannt, dass bei uBasic der einfache "alte" Weg zu nehmen ist.

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

Beitragvon gehtnix » 24.09.2008, 15:27

@msl

Da gibt es nichts richtig zu stellen!

Das steht je bereits in dem Absatz drinnen, der eigentliche......

Du könntest zwar mit "@param get_usb_power" den so definieren, er würde aber nicht mit dem eigentlichen get_usb_power kollidieren weil es nur im Optionsmenü als Text angezeigt wird. Der eigentlichen Parameter wäre z.b. ein a.



gruß gehtnix
Benutzeravatar
gehtnix
CHDK-Legende
CHDK-Legende
 
Beiträge: 2406
Bilder: 8
Registriert: 17.04.2008, 12:42
Wohnort: München
Kamera(s): A610 100e+f + IXUS990 IS

Noch ein Problem

Beitragvon Plenz » 24.09.2008, 16:14

Nun denn - genug der Theorie :lol:

Jetzt bin ich noch auf ein anderes Problem gekommen. Hier noch mal mein aktuelles Skript:


Code: Alles auswählen
:start
  p=get_usb_power
  if p>100 then goto "half"
  if p>0 then goto "shoot"
  c=c+z
  if c>50 then goto "focus"
  goto "start"

:focus
  c=0
  release "shoot_half"
  sleep 100
  press "shoot_half"
  goto "start"

:half
  if z=0 then goto "shalf"
  release "shoot_half"
  z=0
  goto "start"

:shalf
  press "shoot_half"
  z=1
  goto "start"

:shoot
  click "shoot_full"
  sleep 1000
  do
    p = get_shooting
  until p<1
  release "shoot_half"
  z=0
  goto "start"

end



Das merkwürdige ist: wenn ich die Kamera NICHT in den Zustand "shoot_half" versetze und in den Zweig ":shoot" springe, passiert gar nicht. (Außer dass im Dunkeln die orange LED kurz aufleuchtet.) Mit Hilfe von print-Befehlen lässt sich klar nachweisen, dass die Befehle abgearbeitet werden, aber die Kamera macht kein Foto. Was könnte die Ursache dafür sein?
Benutzeravatar
Plenz
CHDK-Begeisterter
CHDK-Begeisterter
 
Beiträge: 110
Bilder: 1
Registriert: 21.09.2008, 12:51
Kamera(s): SX230HS

Beitragvon gehtnix » 24.09.2008, 16:53

Hi,

ich habe vorhin den param-kopf gelöscht und alles war Gut.
Das habe ich jetzt bei mir stehen.
Code: Alles auswählen
:shoot
  shoot
  z=0
  goto "start"



"shoot" reicht schon aus.
Was Du mit dem do und sleep bezweckst, verstehe ich nicht.

gruß gehtnix
Benutzeravatar
gehtnix
CHDK-Legende
CHDK-Legende
 
Beiträge: 2406
Bilder: 8
Registriert: 17.04.2008, 12:42
Wohnort: München
Kamera(s): A610 100e+f + IXUS990 IS

Beitragvon Plenz » 24.09.2008, 17:09

shoot beinhaltet aber auch das Fokussieren, oder? Mir geht es ja gerade darum, dass die Kamera bereits fokussiert hat und mit click "shoot_full" SOFORT auslöst. Das funktioniert ja auch prima mit meinem Script.

Nur: ohne vorheriges Fokussieren funktioniert mein Script nicht, und ich frage mich warum.

Kann es vielleicht sein, dass shoot mehr ist als nur click "shoot_full" ?
Ist es vielleicht ein Ersatz für
Code: Alles auswählen
press "shoot_half"
click "shoot_full"
release "shoot_half"

?
Benutzeravatar
Plenz
CHDK-Begeisterter
CHDK-Begeisterter
 
Beiträge: 110
Bilder: 1
Registriert: 21.09.2008, 12:51
Kamera(s): SX230HS

Beitragvon gehtnix » 24.09.2008, 20:23

Hi Plenz,

Du willst doch das Script in Deiner U-Wasser-Box nutzen?
Ich habe das mal angepasst, aber auch das andere lief bei mir mit shoot_full.

Code: Alles auswählen
@title Remote Control
:start2
p=101
goto "sprung"

:start
  p=get_usb_power
:sprung
  c=c+z
  if c>50 then goto "focus"
  if p>100 then goto "half"
  if p>0 then goto "shoot"
  goto "start"

:focus
  c=0
  release "shoot_half"
  sleep 100
  press "shoot_half"
  goto "start"

:half
  if z=0 then goto "shalf"
  release "shoot_half"
  z=0
  goto "start"

:shalf
  press "shoot_half"
  z=1
  goto "start"

:shoot
  click "shoot_full"
  release "shoot_half"
  z=0
  goto "start2"

end



shoot beinhaltet aber auch das Fokussieren, oder? - Ja

Kann es vielleicht sein, dass shoot mehr ist als nur click "shoot_full" ? Da müsste ich jetzt selbst nachlesen :D

gruß gehtnix
Benutzeravatar
gehtnix
CHDK-Legende
CHDK-Legende
 
Beiträge: 2406
Bilder: 8
Registriert: 17.04.2008, 12:42
Wohnort: München
Kamera(s): A610 100e+f + IXUS990 IS

Beitragvon Plenz » 24.09.2008, 20:42

gehtnix hat geschrieben:Du willst doch das Script in Deiner U-Wasser-Box nutzen?

Korrekt. Deshalb ist es auch suboptimal, dass dein Script das Fokussieren sofort einschaltet. Erst wird die Kamera eingeschaltet, dann in das Gehäuse gesetzt, das Gehäuse wird geschlossen, dann geht's ab ins Wasser und runter, bis es was zu sehen gibt, und DANN wird das Fokussieren gestartet.

gehtnix hat geschrieben:aber auch das andere lief bei mir mit shoot_full.

Hätte ich ja auch erwartet. Am Script kann das nicht liegen. Es liegt entweder an der Kamera oder am CHDK.

gehtnix hat geschrieben:Kann es vielleicht sein, dass shoot mehr ist als nur click "shoot_full" ? Da müsste ich jetzt selbst nachlesen :D

Wo denn? Gibt es noch andere Dokus als die, die man hier runterladen kann? Bei diesen habe ich natürlich schon selbst geschaut.
Benutzeravatar
Plenz
CHDK-Begeisterter
CHDK-Begeisterter
 
Beiträge: 110
Bilder: 1
Registriert: 21.09.2008, 12:51
Kamera(s): SX230HS

Beitragvon CHDKLover » 24.09.2008, 21:14

Hallo Plenz,
es gibt immer die Möglichkeit in der Quelle aller Probleme nachzuschauen.
Da habe ich folgendes gefunden:
Syntax: [ Download ] [ Verstecken ]
Benutze C Syntax Highlighting
void kbd_sched_shoot()

{

// WARNING stack program flow is reversed



    kbd_sched_delay(conf.script_shoot_delay*100);// XXX FIXME find out how to wait to jpeg save finished



    KBD_STACK_PUSH(SCRIPT_WAIT_SAVE);



    KBD_STACK_PUSH(KEY_SHOOT_FULL);

    KBD_STACK_PUSH(SCRIPT_RELEASE);



    kbd_sched_delay(20);



    KBD_STACK_PUSH(KEY_SHOOT_FULL);

    KBD_STACK_PUSH(SCRIPT_PRESS);



    KBD_STACK_PUSH(SCRIPT_WAIT_FLASH);

    KBD_STACK_PUSH(SCRIPT_WAIT_EXPHIST);

    KBD_STACK_PUSH(SCRIPT_PR_WAIT_EXPHIST);



    kbd_sched_delay(10);



    KBD_STACK_PUSH(KEY_SHOOT_HALF);

    KBD_STACK_PUSH(SCRIPT_PRESS);



    KBD_STACK_PUSH(SCRIPT_PR_WAIT_SAVE);



}
Erstellt in 0.005 Sekunden, mit GeSHi 1.0.8.9

Da die Befehle in ein Stack geschoben werden, wird zuerst der letzte Befehl ausgeführt!
warten...
Shoot_half drücken (Fokusieren)
warten 10ms, auf Blitz, ...
Shoot Taste drücken und gedrückt halten
warten 20ms
Shoot Taste loslassen
Scriptausführung unterbrechen (siehe Scriptoptionen)

CHDKLover
A610 100e CHDK-DE: aktuelle Version
Benutzeravatar
CHDKLover
Super-Mod
Super-Mod
 
Beiträge: 878
Bilder: 8
Registriert: 12.09.2007, 18:25
Wohnort: Dresden
Kamera(s): a610 100e

Beitragvon gehtnix » 24.09.2008, 21:26

Hi Plenz,

das mit Abtauchen, da hast Du schon das besser Vorgehen.

Seltsam dass es bei mir geht und nicht auf der 720 :roll:

Und zur Doku, da habe ich auch nichts anderes anzubieten.

gruß gehtnix
Benutzeravatar
gehtnix
CHDK-Legende
CHDK-Legende
 
Beiträge: 2406
Bilder: 8
Registriert: 17.04.2008, 12:42
Wohnort: München
Kamera(s): A610 100e+f + IXUS990 IS

Beitragvon _c_ » 25.09.2008, 20:32

Mit meiner A720 und CHDK 0.5.1-514 funktioniert das Skript so, dass nach einmaligem Druck auf den USB Taster die Kamera fokussiert, beim zweiten Druck wird dann ein Bild gemacht. Nach dem ersten Druck wird das Display dunkel (aber nicht abgestellt) und die blaue LED leuchtet. Nach dem zweiten Druck und erfolgter Aufnahme zeigt das Display wieder "normal" an.

Mit CHDK 010-462 blinken nach Start des Skripts die orange und gelbe LED oberhalb des Displays und nach Druck auf den Taster wird eine Aufnahme gemacht. Danach blinken wieder die Leds. Am Display erscheinen die "Scharfstellfenster", nach Druck wird das Display während der Aufnahme wieder grau.

Grüße
c.
A720 IS. CHDK-SVN 0.9.8, revision 765 Bild
_c_
CHDK-Begeisterter
CHDK-Begeisterter
 
Beiträge: 88
Registriert: 25.06.2008, 11:59

VorherigeNächste

Zurück zu Code-Ecke

Wer ist online?

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