import datetime
import os
import subprocess
import sys
import time
import glob
import re
frame_num_regex = re.compile(r'IMG_(\d+)\.')
jpeg_frame_numbers = list(int(frame_num_regex.search(f).group(1)) for f in glob.glob('images/jpeg/IMG_*.*'))
raw_frame_numbers = list(int(frame_num_regex.search(f).group(1)) for f in glob.glob('images/raw/IMG_*.*'))
jpeg_frame_num = 1
raw_frame_num = 1
if jpeg_frame_numbers:
jpeg_frame_num = max(jpeg_frame_numbers) + 1
if raw_frame_numbers:
raw_frame_num = max(raw_frame_numbers) + 1
jpeg_info_file = open('images/jpeg/info.txt', 'a')
raw_info_file = open('images/raw/info.txt', 'a')
def get_new_data(file):
last_file_pointer = 0
while True:
file.seek(last_file_pointer)
data = []
for line in file:
data.append(line)
yield ''.join(data)
last_file_pointer = file.tell()
proc = subprocess.Popen('chdkptp.exe -i -c', stdin=subprocess.PIPE)
stdout_file = open('stdout.txt', 'r')
stdout = get_new_data(stdout_file)
time.sleep(1)
print stdout.next()
def run_command(command, delay):
print command
proc.stdin.write('%s\n' % command)
proc.stdin.flush()
time.sleep(delay)
result = stdout.next()
print result
return result
print run_command('reboot\n', 10)
print run_command('connect\n', 2)
print run_command('luar switch_mode_usb(1);\n', 10)
# Camera Dials
# Mode Dial to Manual
# EV offset to 0
# ISO to 80
# Camera Settings
# Mute On
# Power Save Off
# Settings Menu
# Focus Bracketing Off
# Multiple Shots Off
print run_command('luar ' +
# menu update script
'click("menu"); sleep(2000); ' + # open up the menu
# shooting settings
'click("down"); sleep(500); ' + # skip over af frame
'if get_prop(299) == 0 then click("down"); sleep(500); end; ' + # skip over af-point zoom
'click("down"); sleep(500); if get_prop(299)==1 then click("right"); sleep(500); end; ' + # set servo af off 0
'click("down"); sleep(500); if get_prop(12)==1 then click("right"); sleep(500); end; ' + # set continuous af off 0
'click("down"); sleep(500); if get_prop(5)==1 then click("right"); sleep(500); end; ' + # set af-assist beam off 0
'click("down"); sleep(500); ' + # skip over mf-point zoom
'click("down"); sleep(500); if get_prop(283)==1 then click("right"); sleep(500); end; ' + # set safety mf off 0
'click("down"); sleep(500); click("right"); ' + # enter flash control menu
'while get_prop(141) ~= 2 do click("right"); sleep(500); end; ' + # sets flash output to max 2
'click("down"); sleep(500); if get_prop(64)==1 then click("right"); sleep(500); end; ' + # set shutter sync to first curtain 0
'click("down"); sleep(500); if get_prop(217)==1 then click("right"); sleep(500); end; ' + # set red-eye lamp to off 0
'click("menu"); sleep(500); ' + # return from flash control menu
'click("down"); sleep(500); ' + # skip spot ae point
'click("down"); sleep(500); ' + # skip review
'click("down"); sleep(500); ' + # skip review-info
'click("down"); sleep(500); if get_prop(310)==1 then click("right"); sleep(500); end; ' + # set blink detection to off 0
'click("down"); sleep(500); ' + # skip custom display
'click("down"); sleep(500); ' + # skip reverse display no propcase
'click("down"); sleep(500); while get_prop(145) ~= 4 do click("right"); sleep(500); end; ' + # sets image stabalization mode to off 4 (continuous, ?, shoot only, panning, off)
'click("down"); sleep(500); while get_prop(60) ~= 0 do click("right"); sleep(500); end; ' + # sets converter to none 0
'click("down"); sleep(500); ' + # skip set func display
'click("down"); sleep(500); ' + # skip set shortcut button display
'click("down"); sleep(500); ' + # skip save settings display
'click("down"); sleep(500); ' + # return to top of menu
# camera settings
'click("right"); sleep(500); ' + # enter camera settings
'click("down"); sleep(500); click("right"); sleep(500); ' + # can't set mute to on 1 (as it defaults to off)
# end menu update script
'click("menu"); sleep(2000); ' + # close the menu
# settings update script
'click("set"); sleep(2000); ' + # open up the settings
'while get_prop(273) ~= 888 do click("right"); sleep(500); end; ' + # set white balance to flash 888
'click("down"); sleep(500); ' + # can't set focus bracket off no propcase
'click("down"); sleep(500); ' + # can't set to single shot mode no propcase
'click("down"); sleep(500); while get_prop(141) ~= 2 do click("right"); sleep(500); end; ' + # set flash output to max 2
'click("down"); sleep(500); if get_prop(196) == 1 then click("right"); sleep(500); end; ' + # set nd filter to off 0
'if get_prop(214) ~= 0 then click("down"); sleep(500); end; ' + # skip aspect ratio if we are in raw and jpeg so we can goto set the raw and jpeg setting then we'll come back
'click("down"); sleep(500); while get_prop(214) ~= 2 do click("right"); sleep(1000); end; ' + # set raw and jpeg to both on 2 (raw, jpeg, raw and jpeg)
'click("up"); sleep(500); while get_prop(300) ~= 0 do click("right"); sleep(500); end; ' + # set aspect ratio to 4:3 0 (4:3, 16:9, 3:2, 1:1, 4:5)
'click("down"); sleep(500); click("down"); sleep(500); while get_prop(222) ~= 0 do click("right"); sleep(500); end; ' + # set file size to L 0 (L, M1, M2, ?, S)
'click("down"); sleep(500); ' + # return to top of menu
# end settings menu update script
'click("set"); sleep(2000); ' + # close up the settings
# general stuff
'while get_prop(143) ~= 1 do click("right"); sleep(3000); end; ' + # sets flash mode to on 1
'if get_prop(6) == 1 then click("left") sleep(3000); end; ' + # sets macro mode to off 0
'if get_prop(133) == 0 then click("up") sleep(3000); end; ' + # sets manual focus mode to off 0
'while get_prop(227) ~= 0 do click("down"); sleep(3000) end; ' + # sets timer mode to off 0
'set_zoom(7); sleep(5000); ' + # zoom to proper depth 7
'sleep(1000); set_backlight(0);\n', 80)
while True:
folders_before = set(run_command('ls DCIM', 1).splitlines()[1:-1])
current_folder_before = max(folder[:-1] for folder in folders_before if folder != 'CANONMSC/')
files_before = set(run_command('ls DCIM/%s' % current_folder_before, 1).splitlines()[1:-1])
photo_datetime = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
run_command('luar ' +
'set_av96_direct(472); ' + # set the av to 96*log2(a^2) 2.8=>285 OR 8.0=>576 OR 5.5=>472 OR 6.5=>519 OR 6.2=>505 OR 6.0=>496
'set_tv96_direct(1053); ' + # set the exposure to 1/2000=>1053 by 96*log2(1/t) OR 1/1000=>957 OR 1/200=>734 OR 1/50=>542
'sleep(500); ' + # a little pause for good measure
'press("shoot_half"); sleep(2000); set_focus(1000); sleep(4000); ' + # set manual focus mode and focus to 1000 mm
'click("shoot_full"); sleep(4000); release("shoot_half"); sleep(2000); set_backlight(0);', 30)
folders_after = set(run_command('ls DCIM', 1).splitlines()[1:-1])
current_folder_after = max(folder[:-1] for folder in folders_after if folder != 'CANONMSC/')
if current_folder_before != current_folder_after:
files_before = set()
files_after = set(run_command('ls DCIM/%s' % current_folder_after, 1).splitlines()[1:-1])
for new_file in files_after.difference(files_before):
if new_file.endswith('.JPG'):
run_command('download A/DCIM/104___09/%s images/jpeg/IMG_%06i.%s' % (new_file, jpeg_frame_num, new_file[-3:]), 5)
jpeg_info_file.write('%06i\t%s\n' % (jpeg_frame_num, photo_datetime))
jpeg_info_file.flush()
jpeg_frame_num += 1
elif new_file.endswith('.CR2'):
run_command('download A/DCIM/104___09/%s images/raw/IMG_%06i.%s' % (new_file, raw_frame_num, new_file[-3:]), 20)
raw_info_file.write('%06i\t%s\n' % (raw_frame_num, photo_datetime))
raw_info_file.flush()
raw_frame_num += 1
run_command('luar os.remove("A/DCIM/104___09/%s");' % new_file, 2)
time.sleep(300)