#!/usr/bin/perl ###################################################################################### ## ## autocam: camera control script for eclipses ## ## uses SQLite3 database interface ## ## version: 0.1 28/06/2008 ## ###################################################################################### use DBI; use Time::HiRes qw( usleep ualarm gettimeofday tv_interval nanosleep clock_gettime clock_getres clock_nanosleep clock stat ); ## ## subroutines ## ## ## Alarm - play warning sound ## sub alarm { print "alarm called\n"; } ## ## Use gPhoto to fire the shutter over the USB cable via C++ module camera_control ## Param 0: shutter speed value ## Param 1: bracket value ## sub fireshutter_camera_control { my $time_enter_sub = [gettimeofday]; print "fireshutter_camera_control\n"; my $strCameraControl = "camera_control " . @_[0] . " " . @_[1]; if (system($strCameraControl) != 0){ print "camera_control failed\n"; } print "time in camera_control: " . tv_interval ( $time_enter_sub ) . "\n"; } ## ## Use gPhoto to fire the shutter over the USB cable ## sub fireshutter_usb { print "fireshutter_usb\n"; my $strFireShutter = "gphoto2 --camera='Canon EOS 40D (PTP mode)' --port=usb: --set-config capture=on --capture-image"; print "Firing\n"; if (system($strFireShutter) != 0){ ## call gPhoto to fire shutter print "gPhoto failed to fire shutter\n"; } } ## ## Use the serial cable to fire the shutter ## Parameter 0: number of seconds to depress shutter button for continuous firing; 0 is fire once ## sub fireshutter_serial { print "fireshutter_serial\n"; my $strSerialPort = "serial_port " . @_[0]; if (system($strSerialPort) != 0){ ## call serial port program to fire shutter via serial/usb print "Serial_port failed to fire shutter\n"; } } ## ## Use gPhoto to set the shutter speed over the USB cable ## sub setshutterspeed { print "setshutterspeed @_[0]\n"; my $strShutterSpeed = "gphoto2 --camera='Canon EOS 40D (PTP mode)' --port=usb: --set-config capture=on --set-config eos-shutterspeed=" . @_[0]; print "string now: $strShutterSpeed\n"; print "Setting shutter speed to: @_[0]\n"; if (system($strShutterSpeed) != 0){ ## call gPhoto to set shutter speed print "gPhoto failed to set shutter speed\n"; } } ## ## Use gPhoto to set the shutter speed and fire the shutter over the USB cable ## Param 0: shutter speed value ## Param 1: bracket value ## Param 2: pause time in seconds ## sub setshutterfire { my $time_enter_sub = [gettimeofday]; print "setshutterfire @_[0] @_[1]\n"; my $strShutterFire = "gphoto2 --camera='Canon EOS 40D (PTP mode)' --port=usb: --set-config capture=on --set-config eos-shutterspeed=" . @_[0] . " --capture-image"; print "string now: $strShutterFire\n"; print "Setting shutter speed to: @_[0]\n"; if (system($strShutterFire) != 0){ ## call gPhoto to set shutter speed and fire print "gPhoto failed to set shutter speed\n"; return; } ## ## bracketing? ## if (@_[1] < 1) { return } my $bracket_under = @_[0] + @_[1]; my $bracket_over = @_[0] - @_[1]; print "bracket_under: $bracket_under bracket_over: $bracket_over\n"; usleep (@_[2] * 1000000); ## ## take two more shots at +/- has values 1 - 6 corresponding to 1/3 stop increments ## $strShutterFire = "gphoto2 --camera='Canon EOS 40D (PTP mode)' --port=usb: --set-config capture=on --set-config eos-shutterspeed=" . $bracket_over . " --capture-image"; print "Setting shutter speed to: $bracket_over\n"; if (system($strShutterFire) != 0){ ## call gPhoto to set shutter speed and fire print "gPhoto failed to set shutter speed\n"; return; } usleep (@_[2] * 1000000); $strShutterFire = "gphoto2 --camera='Canon EOS 40D (PTP mode)' --port=usb: --set-config capture=on --set-config eos-shutterspeed=" . $bracket_under . " --capture-image"; print "Setting shutter speed to: $bracket_under\n"; if (system($strShutterFire) != 0){ ## call gPhoto to set shutter speed and fire print "gPhoto failed to set shutter speed\n"; return; } print "time in shutter/fire: " . tv_interval ( $time_enter_sub ) . "\n"; } ################################################################### ## main program starts here ################################################################### my $i = 0; my $gphoto_shutter_speed = 0; my $gphoto_shutter_speed_prev = 0; my $bracket = 0; ## divide by 3 to get stops my $pause = 0; ## dead time between shots @shutterspeedtranslate = ("bulb","30s","25s","20s","15s","13s","10s","8s","6s","5s","4s","3.2s","2.5s", "2s","1.6s","1.3s", "1s","0.8s","0.6","0.5s","0.4s","0.3s","4","5","6","8","10","13","15","20","25","30","40","50","60","80","100","125","160", "200","250","320","400","500","640","800","1000","1250","1600","2000","2500","3200","4000","5000","6000","6400","8000"); print "Checking for camera ...\n"; ##system("gphoto2 --auto-detect"); if (system("gphoto2 --camera='Canon EOS 40D (PTP mode)' --port=usb: --list-config") != 0) {print "gPhoto cannot detect a camera\n"; exit 1; } print "\nExtended capabilities\n\n"; if (system("gphoto2 --camera='Canon EOS 40D (PTP mode)' --port=usb: --set-config capture=on --list-config") != 0) {print "gPhoto cannot detect a camera\n"; exit 1; } print "\n"; my $sim_time = 60; my $sim_flag = 1; @timeData = localtime(time); print "@timeData\n"; ($second, $minute, $hour) = localtime(time); my $timeinsecs = ($hour * 3600) + ($minute * 60) + $second; print "Seconds of the day: $timeinsecs\n"; $ref_to_gettimeofday = [gettimeofday]; ($seconds, $microseconds) = gettimeofday; print "Seconds of the day: $seconds $microseconds\n"; print "Sleeping (nominally) for 5 seconds: "; print usleep(5000000)/1000; print " milliseconds\n"; print "interval: " . tv_interval ( $ref_to_gettimeofday ) . "\n"; $dbh = DBI->connect( "dbi:SQLite:/home/nick/eclipse.db" ) || die "Cannot connect: $DBI::errstr"; $res = $dbh->selectall_arrayref( q( select relative, reltime, interface, type, parameter, parameter_2 from events order by eorder, reltime ) ); print "Here are the event times:\n\n"; foreach $val ( @$res ) { foreach $i (0..$#$val) { print "$val->[$i] " } print "$#$val\n"; } if ($sim_flag) { $res = $dbh->selectall_arrayref( q( select (ct.ctime + e.reltime) - (select ctime from contact_times where contact = "2nd Contact") time, e.interface, e.type, e.parameter, e.parameter_2 from events e, contact_times ct where e.relative = ct.contact order by esequence ) ); } else { $res = $dbh->selectall_arrayref( q( select (ct.ctime + e.reltime) time, e.interface, e.type, e.parameter, e.parameter_2 from events e, contact_times ct where e.relative = ct.contact order by esequence ) ); } print "Time now is $timeinsecs\n\nand here are the events in actual event time order:\n\n"; ## read into array .. foreach $val( @$res ) { my $timetogo = @$val[0] + $timeinsecs + 30; my $interface = @$val[1]; my $type = @$val[2]; my $parameter = @$val[3]; my $parameter_2 = @$val[4]; if ($interface =~ m/^c1/) ## decode shutter speed { $i = 0; until (($parameter eq $shutterspeedtranslate[$i]) || ($i >= $#shutterspeedtranslate)) { $i++; } $gphoto_shutter_speed = $i; } ## now store in an array ... push (@main_array,[$timetogo,$interface,$type,$parameter,$gphoto_shutter_speed,$parameter_2]); } ## end of foreach loop $dbh->disconnect; foreach $val(@main_array) { print "@$val[0] @$val[1] @$val[2] @$val[3] @$val[4] @$val[5]\n"; } ## read the array and action ... foreach $val(@main_array) { $timetogo = @$val[0]; $interface = @$val[1]; $type = @$val[2]; $parameter = @$val[3]; $gphoto_shutter_speed = @$val[4]; $parameter_2 = @$val[5]; print "Next event is $type at: $timetogo on interface: $interface for $parameter\n"; ($second, $minute, $hour) = localtime(time); my $timewaiting = ($hour * 3600) + ($minute * 60) + $second; ## If the next event is for camera 1 and serial fire, and shutter speed change ## set shutter speed in anticipation ... if (($interface =~ m/^c1s$/) && ($gphoto_shutter_speed_prev != $gphoto_shutter_speed)) { setshutterspeed($gphoto_shutter_speed); } else {print "not changing shutter speed\n"} until ($timewaiting > $timetogo ) { ## waiting ($second, $minute, $hour) = localtime(time); $timewaiting = ($hour * 3600) + ($minute * 60) + $second; } print "now!\n"; if ($interface =~ m/^c1u$/) { setshutterfire($gphoto_shutter_speed, $bracket, $pause); } ## if ($interface =~ m/^c1u$/) { fireshutter_camera_control($gphoto_shutter_speed, $bracket); } elsif ($interface =~ m/^c1s$/) { fireshutter_serial($parameter_2); } elsif ($interface =~ m/^a$/) { alarm(); } else {print "unrecognised interface: $interface\n"; } $gphoto_shutter_speed_prev = $gphoto_shutter_speed; } ## end of foreach @main_array print "All done!\n";