Jahre später...(:-|))))...
Hallo Leute,
ich habe kürzlich die "USAGE.TXT"
von chdkptp mal genau durchgelesen und gefunden, dass sowohl der Befehl u(pload) als auch der Befehl d(ownload)
während eines auf der Kamera laufenden Scripts ausgeführt werden können, sofern man den Parameter "-nolua" angibt. Leider gilt dieses spannende feature nicht für die komplizierteren Befehle wie "imdl" usw.
Trotzdem hat es mich interessiert, das mal auszuprobieren, und die Ergebnisse möchte ich hier im Forum teilen und zur Diskussion stellen.
Ziel:
-Auf der Kamera läuft ein lua-script, das ab und zu ein Foto produziert und speichert.
-Auf dem PC (Linux, Knoppix 7.2) läuft ein shell-script, das mittels chdkptp ab und zu nachschaut, ob es was neues gibt und das dann abholt, speichert und in voller Qualität anzeigt.
- Das lua-script für die Kamera ist hier als einfaches Beispiel nur ein Motion-Detect-script
(Mit ein paar Erklärungen in Englisch) namens
shotntf4.lua:- Code: Alles auswählen
-- =shotntf4.lua=LUA CODE==== Written by joedi in Jan,2021 ==========
-- Thanks to all chdk and chdkptp programmers for the
-- huge work done in creating this capable system
function notify()
-- This function notifies the filename of the last
-- picture taken, to the special log file 'LOG_9999.TXT'
set_console_autoredraw(0) ; print_screen(9999) -- switch logging on
lastfn=string.format("%s/IMG_%04d.JPG",get_image_dir(),get_exp_count())
print(lastfn) -- do the notification
print_screen(false) -- switch logging off
end
-- MAIN starts here: -----
-- A simple motion detector as an example test program
-- which will be uploaded into the cam and executed there
-- See text of 'show-shots-notified-4.shs' bash shell script
-- modify motion detect parameters HERE as needed:
a=6 b=6 c=1 d=300000 e=200 g=3 h=0 i=0 j=0 k=0 l=0 m=0 n=0 o=2 p=500 f=25
-- will loop forever in cam ---
repeat
zones = md_detect_motion( a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p)
if( zones > 0 ) then shoot() end
notify()
sleep(2000)
until (false)
Das auf dem Linux-Rechner laufende bash-script namens
show-shots-notified-4.shs, auch mit diversen englischen Erklärungen, ist hier:
- Code: Alles auswählen
#! /bin/bash
# THIS SCRIPT downloads from cam the last photo taken, and shows it, while the script in cam is still running!
# ==Linux bash script: show-shots-notified-4.shs= = Written by joedi in Jan, 2021==
# function :-------------------------------------------
showpicoffon ()
{
# turn off old image:
proz=$(ps -e | grep "display" )
# echo $proz
if [ -n "$proz" ] ; then
prozid=$(echo $proz | cut -d " " -f 1 ); kill $prozid ;
fi
# show the new image:
display -resize 900x600 $1 &
}
# -- function ends ----------------------------------
# MAIN START:
usbok=$(lsusb | grep "Canon")
if [ -z "$usbok" ] ; then echo "connect/switch on Camera!" ; exit ; fi
# test section; no param means: tests will be done
# by uploading camprog "shotntf4.lua" into the cam and
# firing it up there... Otherwise the camprog as per
# parameter $1 will be used instead
if [ $# -ne 0 ] ;
then
camprog=$1
else
camprog="shotntf4.lua"
fi
echo "Will run in cam:"
echo $camprog
./chdkptp.sh -c -erec
./chdkptp.sh -c -e"lua <$camprog"
sleep 5
# .............................................................
# MAIN LOOP
while [ 1 -eq 1 ] ;
do
oldname=$wewant
# download the special log file that contains 'wewant',
# i.e. the file name of the most recent picture taken.
./chdkptp.sh -c -e'd -nolua A/CHDK/LOGS/LOG_9999.TXT'
wewant=$(cat LOG_9999.TXT)
echo $wewant
if [ ! "$oldname" = "$wewant" ] ;
then
mycmd=" -c -e'd -nolua $wewant ./'"
# The bash 'eval' command turned out to be essential here:
eval ./chdkptp.sh $mycmd
# did it arrive?
ls -l $(basename $wewant)
showpicoffon "$(basename $wewant)"
else
echo "no new image yet"
fi
# : do not ask too often:
sleep 3
done
# main loop ends ..................................
# MAIN ends .......................................
# Note: Only the chdkptp-commands (u)pload and (d)ownload
# allow for the '-nolua' parameter and thus may work in the
# cam while there is a lua script running there, too.
# joedi Jan 25, 2021
Das Zusammenspiel dieser beiden Programme ist so:
pc: usb-Verbindung prüfen
pc: Kamera connecten
pc: das lua-script in die Kamera schieben und dort starten
cam: script läuft, und die Funktion "notify()" meidet in einer Datei LOG_9999.TXT den Namen des letzten Fotos
pc: Holt alle paar Sekunden die o.a. Datei ab und liest den Inhalt; ist dieser neu, dann wird genau die diesem Namen entsprechende Fotodatei abgeholt, im akt. Verzeichnis gespeichert und (durch ImageMagicks "display") angezeigt.
Das funktioniert ziemlich gut. Wer mag das mal ausprobieren? Was für Ideen gibt es noch?
Bin ja mal gespannt auf Reaktionen.
Grüsse von Joedi