--[[ ***LowLight-Skript*** zur Verkürzung der Verschlusszeit bei schlechten Lichtverhältnissen unter Verwendung von Tonwertkurven (nicht für 12-Bit-Raw-Kameras) by Sinter feat. CHDKLover, msl Vorläufige Planung eines RC für LowLight 1.0 vorerst mittels stabilem get_tv96() und noch ohne Messung on-the-fly. ********************************* @title LowLight 0.9.7.1 @param z AnspruchnivKorrektur 1=ein @default z 1 @param n AnsprKorrekUmfang [1/3 EV] @default n 0 @param g ISOBoostStufen-Limit [1-4] @default g 4 @param o CamISO [0=manuell 1=autom] @default o 1 @param m ISOMaximalgrenze96 [sv96] @default m 699 @param c CustomTimerDauer [s] 0=aus @default c 0 @param b CustomTimerBlinken 1=ein @default b 1 @param a Rauschreduzierung 0=aus @default a 0 @param e Am Ende ExitAlt 0/1 0=nein @default e 0 @param r Rückblick Dauer [s] 0=aus @default r 2 @param f Erstmessungs-Fokus 1=ein @default f 1 @param w Restrisiko piepsen 1=ein @default w 1 @param k Mehr Konsolenzeilen 1=ein @default k 1 @param v Infoumfang 1=vollständig @default v 1 --]] if z < 0 or z > 1 then z = 1 end if n < -9 or n > 9 then n = 0 end if g < 1 or g > 4 then g = 4 end if a < 0 or a > 1 then a = 0 end if e < 0 or e > 1 then e = 0 end if r < 0 then r = 0 end if w < 0 or w > 1 then w = 1 end if k < 0 or k > 1 then k = 1 end if c < 0 then c = 0 end if v < 0 or v > 1 then v = 1 end if f < 0 or f > 1 then f = 1 end if o < 0 or o > 1 then o = 1 end if m < 371 or m > 699 then m = 699 end --functions function sel_cam_value() local camera = {} camera.a450 = {fl = 54, fle = 38} camera.a460 = {fl = 54, fle = 38} camera.a470 = {fl = 63, fle = 38} camera.a480 = {fl = 66, fle = 37} camera.a530 = {fl = 58, fle = 35} camera.a540 = {fl = 58, fle = 35} camera.a550 = {fl = 58, fle = 35} camera.a560 = {fl = 58, fle = 35} camera.a570 = {fl = 58, fle = 35} camera.a580 = {fl = 58, fle = 35} camera.a590 = {fl = 58, fle = 35} camera.a610 = {fl = 73, fle = 35} camera.a620 = {fl = 73, fle = 35} camera.a630 = {fl = 73, fle = 35} camera.a640 = {fl = 73, fle = 35} camera.a650 = {fl = 74, fle = 35} camera.a700 = {fl = 58, fle = 35} camera.a710 = {fl = 58, fle = 35} camera.a720 = {fl = 58, fle = 35} camera.a1000 = {fl = 62, fle = 35} camera.a1100 = {fl = 62, fle = 35} camera.a2000 = {fl = 64, fle = 36} camera.a2100 = {fl = 64, fle = 36} camera.d10 = {fl = 62, fle = 35} camera.e1 = {fl = 62, fle = 35} camera.g7 = {fl = 74, fle = 35} camera.g9 = {fl = 74, fle = 35} camera.g10 = {fl = 61, fle = 28} --camera.g11 = {fl = 61, fle = 28} --12Bit camera.s2is = {fl = 60, fle = 36} camera.s3is = {fl = 60, fle = 36} camera.s5is = {fl = 60, fle = 36} camera.s80 = {fl = 58, fle = 28} camera.ixusizoom_sd30 = {fl = 63, fle = 38} camera.ixusi7_sd40 = {fl = 63, fle = 38} camera.ixus30_sd200 = {fl = 58, fle = 35} camera.ixus40_sd300 = {fl = 58, fle = 35} camera.ixus50_sd400 = {fl = 58, fle = 35} camera.ixusW_sd430 = {fl = 58, fle = 35} camera.ixus55_sd450 = {fl = 58, fle = 35} camera.ixus700_sd500 = {fl = 77, fle = 37} camera.ixus750_sd550 = {fl = 77, fle = 37} camera.ixus60_sd600 = {fl = 58, fle = 35} camera.ixus65_sd630 = {fl = 58, fle = 35} camera.ixus800_sd700 = {fl = 58, fle = 35} camera.ixus75_sd750 = {fl = 58, fle = 35} camera.ixus85_sd770 = {fl = 62, fle = 35} camera.ixus100_sd780 = {fl = 59, fle = 33} camera.ixus90_sd790 = {fl = 62, fle = 35} camera.ixus850_sd800 = {fl = 46, fle = 28} camera.ixus950_sd850 = {fl = 58, fle = 35} camera.ixus860_sd870 = {fl = 46, fle = 28} camera.ixus870_sd880 = {fl = 50, fle = 28} --camera.ixus970_sd890 = {fl = 66, fle = 37} --12Bit camera.ixus900_sd900 = {fl = 77, fle = 37} camera.ixus120_sd940 = {fl = 50, fle = 28} camera.ixus960_sd950 = {fl = 77, fle = 36} camera.ixus110_sd960 = {fl = 50, fle = 28} camera.ixus990_sd970 = {fl = 66, fle = 37} camera.ixus200_sd980 = {fl = 43, fle = 24} --camera.ixus980_sd990 = {fl = 77, fle = 36} --12Bit camera.ixus70_sd1000 = {fl = 58, fle = 35} camera.ixus80_sd1100 = {fl = 62, fle = 38} camera.ixus95_sd1200 = {fl = 62, fle = 35} --camera.sx1 = {fl = 50, fle = 28} --12Bit --camera.sx10 = {fl = 50, fle = 28} --12Bit camera.sx20 = {fl = 50, fle = 28} camera.sx100is = {fl = 60, fle = 36} --camera.sx110is = {fl = 60, fle = 36} --12Bit camera.sx120is = {fl = 60, fle = 36} --camera.sx200is = {fl = 50, fle = 28} --12Bit local bi = get_buildinfo() sel_camera=camera[bi.platform] if sel_camera ~= nil then return true,sel_camera.fl, sel_camera.fle else return false end end function restore() if curve_file ~= nil then set_curve_file(curve_file) end if curve_state ~= nil then set_curve_state(curve_state) end if rawnrstatusbeibeginn ~= nil then set_raw_nr(rawnrstatusbeibeginn) end print_screen(false) set_led(9,0) set_record(1) if f == 1 then set_aflock(0) end if o=1 then set_sv96(iso_apex96_ursprgl) end --## ISO auf Ursprungswert zurücksetzen falls Parameter o aktiv end function existFile(name) local ret=false local f=io.open(name,"r") if f~=nil then ret=true f:close() end return ret end function format_num(num) local ret = tostring(num) if num < 10 then ret = " " .. num elseif num < 100 then ret = " " .. num elseif num < 1000 then ret = " " .. num end return ret end function printText(msg, lineLen) local s="" local lines=0 local sep=" " msg=msg.." " local t={string.match(msg, (string.gsub(msg, "[^"..sep.."]*"..sep, "([^"..sep.."]*)"..sep)))} -- for word in string.gmatch(msg, "[abcdefghijklmnopqrstuvwxyzABZDEFGHIJKLMNOPQRSTUVWXYZ%d]*") do -- for word in string.gmatch(msg, "%a*") do for key,word in pairs(t) do wordLen=string.len(word) if string.len(s)+wordLen>=lineLen then print(s) lines=lines+1 s=word.." " else s=s..word if string.len(s)14 then lines=14 end return lines end function printError(msg) len=string.len(msg) set_console_layout(2,0,43,14) lines=printText(msg,41)+1 -- +1 für Skriptendemeldung start=7-lines/2 set_console_layout(2,start,43,start+lines) end function init() --Abhängigkeiten überprüfen ret=0 if not (existFile("A/CHDK/CURVES/ISOBOOST/IB1EV.CVF") and existFile("A/CHDK/CURVES/ISOBOOST/IB2EV.CVF") and existFile("A/CHDK/CURVES/ISOBOOST/IB3EV.CVF") and existFile("A/CHDK/CURVES/ISOBOOST/IB4EV.CVF")) then ret=-1 elseif not existFile("A/CHDK/LUALIB/propcase.lua") then ret=-2 else proptable=require "propcase" local flash_prop=proptable.FLASH_MODE if flash_prop~=nil then set_prop(proptable.FLASH_MODE,2) else ret=-3 end end return ret end function print_blocksatz25_text_wert(textbaustein,wertbaustein) local kombiniert=string.sub(textbaustein.." "..string.rep(".",24),1,24-string.len(wertbaustein)).." "..tostring(wertbaustein) print(kombiniert) end function print_blocksatz25_text_text(textbaustein1,textbaustein2) local kombiniert=string.sub(textbaustein1.." "..string.rep(".",24),1,24-string.len(textbaustein2)).." "..textbaustein2 print(kombiniert) end function customtimercountdown(secondscustomtimer,led_blinken) local countdown=secondscustomtimer local led_blinken=led_blinken if countdown < 0 then countdown=0 end if led_blinken < 0 then led_blinken=0 end if led_blinken > 1 then led_blinken=1 end while countdown >= 1 do if countdown >=3 then for i=1,2 do set_led(9,led_blinken) sleep(10) set_led(9,0) play_sound(4) sleep(450) end else for i=1,10 do set_led(9,led_blinken) sleep(10) set_led(9,0) play_sound(4) sleep(50) end end countdown=countdown-1 end end function print_tv96_seconds(tv96wert) tv_seconds = {"64","50.8","40.3","32","25.4","20","15","12.7","10","8","6.3","5","4","3.2","2.5","2", "1.6","1.3","1","0.8","0.6","0.5","0.4","0.3","1/4","1/5","1/6","1/8","1/10","1/13","1/15","1/20", "1/25","1/30","1/40","1/50","1/60","1/80","1/100","1/125","1/160","1/200","1/250","1/320","1/400", "1/500","1/640","1/800","1/1000","1/1250","1/1600","1/2000","1/2500","1/3200","1/4000","1/5000", "1/6400","1/8000","1/10000", "1/12500","1/16000","1/20000","1/25000","1/32000","1/40000","1/50000"} local text1="Belichtet mit" local text2=tv_seconds[((tv96wert+576)/32)+1].." s" print_blocksatz25_text_text(text1,text2) end function init() if existFile("A/CHDK/CURVES/ISOBOOST/IB1EV.CVF") and existFile("A/CHDK/CURVES/ISOBOOST/IB2EV.CVF") and existFile("A/CHDK/CURVES/ISOBOOST/IB3EV.CVF") and existFile("A/CHDK/CURVES/ISOBOOST/IB4EV.CVF") then ret=true end return ret end -- start main print_screen(1) iblimituser=g iso_maximalgrenze96=m found,fl,fle=sel_cam_value() mehrdeutigkeitsproblem=0 init=init() if init==-1 then printError("Die benötigten Tonwertkurven wurden nicht gefunden! Bitte das komplette CHDK-Paket erneut von www.wirklemms.de laden.") elseif init==-2 then printError("Die Propertycase-Liste konnte nicht geladen werden! Bitte das komplette CHDK-Paket erneut von www.wirklemms.de laden."); elseif init==-3 then printError("Propertycase-Liste ist ungültig! Bitte das komplette CHDK-Paket erneut von www.wirklemms.de laden."); elseif found then curve_state=get_curve_state() cls() if k == 1 then set_console_layout(0,0,25,13) else set_console_layout(0,0,25,5) end rawnrstatusbeibeginn=get_raw_nr() if a==0 then set_raw_nr(1) else set_raw_nr(2) end if z == 0 then n=0 end if n ~= 0 then ansprkorrektur_ev_ganzzahl=n/3 ansprkorrektur_ev_modulo=n%3 if n > 0 then vorz="+" elseif n < 0 then vorz="" end if ansprkorrektur_ev_modulo == 0 then print("ANSPRUCHKORREKTUR "..vorz..ansprkorrektur_ev_ganzzahl,"EV") elseif n > 0 then print("ANSPRUCHKORREK. "..vorz..ansprkorrektur_ev_ganzzahl, ansprkorrektur_ev_modulo.."/3 EV") elseif n < 0 then print("ANSPRUCHKORREK. -"..(-1)*ansprkorrektur_ev_ganzzahl,(-1)*ansprkorrektur_ev_modulo.."/3 EV") end end get_dof = get_dofinfo() analogbrennweite=(get_dof.eff_focal_length/1000) if v == 1 then print_blocksatz25_text_wert("Analogbrennweite [mm]",analogbrennweite) end if analogbrennweite <= 40 then minimapex=512 elseif analogbrennweite <= 50 then minimapex=544 elseif analogbrennweite <= 60 then minimapex=576 elseif analogbrennweite <= 80 then minimapex=608 elseif analogbrennweite <= 100 then minimapex=640 elseif analogbrennweite <= 125 then minimapex=672 elseif analogbrennweite <= 160 then minimapex=704 elseif analogbrennweite <= 200 then minimapex=736 elseif analogbrennweite <= 250 then minimapex=768 elseif analogbrennweite <= 320 then minimapex=800 elseif analogbrennweite > 320 then minimapex=832 end minimapex=minimapex+(n*32) if v == 1 then if n == 0 then print("erfordert TvMinimApex",minimapex) else print("erfordern TvMinimApex",minimapex) end end if c ~= 0 then customtimercountdown(c,b) end press("shoot_half") repeat until get_shooting() == true -- Für automatische ISO-Steuerung eingefügter if-Abschnitt. Erfassung von ISO-Istwert und -- Berechnung des für unsere Zwecke noch verfügbaren ISO-Reservepotentials if o=1 then iso_apex96_ursprgl=get_sv96() --##### Einlesen des eingestellten ISO-Werts als apex96 print("get_sv96= ",iso_apex96_ursprgl) if m0) and (belichtungsueberschuss<=iso_reserve96) then --## Vollständiger Ausgleich mittels ISO-Erhöhung möglich set_sv96(iso_apex96_ursprgl+belichtungsueberschuss) --## Teilerhöhung von ISO print("Vollständ. Ausgleich mittels ISO-Erhöhung.") print("ISO_Apex_neu ",iso_apex96_ursprgl+belichtungsueberschuss) kamerawillbelichten=kamerawillbelichten+belichtungsueberschuss belichtungsueberschuss=0 --## verbleibender Belichtungsüberschuss für ISOBoost-Anwendung elseif belichtungsueberschuss>0 and (belichtungsueberschuss>iso_reserve96) then --## Trotz maximaler ISO-Erhöhung nur Teilausgleich möglich set_sv96(iso_maximalgrenze96) --## Ausschöpfung der maximalen ISO-Erhöhung print("Teilausgleich mittels vollst. Ausschöpfung von ISO.") print("ISO_Apex_neu ",iso_maximalgrenze96) kamerawillbelichten=kamerawillbelichten+iso_reserve96 belichtungsueberschuss=belichtungsueberschuss-(iso_reserve96) --## verbleibender Belichtungsüberschuss für ISOBoost-Anwendung end end if belichtungsueberschuss <= 0 then print("ISOBoost nicht benötigt.") wert=kamerawillbelichten set_curve_state(0) else ev=((belichtungsueberschuss-32)/96)+1 if ev > iblimituser then ev=iblimituser end print("->Anwendung von ISOBoost"..ev) curve_file=get_curve_file() set_curve_file(string.format("ISOBoost/IB%dEV.CVF",ev)) set_curve_state(1) wert=(kamerawillbelichten+(96*ev)) end if v == 1 then print_blocksatz25_text_wert("realisierter TvApex",wert) end set_tv96_direct(wert) press("shoot_half") repeat sleep(1) until get_shooting() == true press("shoot_full") release("shoot_full") release("shoot_half") set_led(8,1) repeat sleep(1) until get_shooting() ~= true set_led(8,0) if (minimapex-kamerawillbelichten) > (iblimituser*96) then print_tv96_seconds(wert) print("Anspruch nicht erreicht!") verwackelungsrisiko=(((minimapex-kamerawillbelichten)-(iblimituser*96))+64)/96 verwriskganzzahl=((minimapex-kamerawillbelichten)-(iblimituser*96))/96 verwriskmodulo=((minimapex-kamerawillbelichten)-(iblimituser*96))%96 if verwriskmodulo == 0 then print("RISIKOVERBLEIB = ...", verwriskganzzahl,"EV") else print("RISIKOVERBLEIB =", verwriskganzzahl, (verwriskmodulo/32).."/3 EV") end print("! Falls möglich bitte ISO") if verwackelungsrisiko > 1 then print("um",verwackelungsrisiko, "Stufen erhöhen!!") else print("um",verwackelungsrisiko, "Stufe erhöhen!!") end if w == 1 then for i=1,verwackelungsrisiko do play_sound(4) sleep(120) end end else print_tv96_seconds(wert) print("=>Anspruchniveau erfüllt.") end -- review //by msl if r > 0 then set_record(0) sleep(r * 1000 + 1000) set_record(1) sleep(1000) end else printError("Das Skript unterstützt leider nur Kameras mit 10-Bit-Raw-Format. Diese Kamera arbeit mit einem 12-Bit-Raw-Format.") end console_redraw() if f ==1 then set_aflock(0) end restore() if e == 1 then exit_alt() end --////////