Converting TV96 value to shutter time - LUA Scripting - CHDK Forum

# Converting TV96 value to shutter time

• 4 Replies
• 5734 Views

#### lapser

• 1093
##### Converting TV96 value to shutter time
« on: 28 / September / 2012, 23:23:03 »
Code: (lua) [Select]
`function seconds(tv) -- for chdk 32 bit integer numbers  if(tlog==nil)then    tlog="000007015022029037044052059067075083091098106114122131139147155164172181189198207215224233242251260269278288297306316325335345354364374384394404414424435445456466477488498509520531542553565576587599610622634646658670682694706719731744756769782795808821834847861874888901915929943957971986"  end  pre="1/"  if(tv<=0)then    tv=-tv    pre=""  end  ti=(tv%96)*3+1 -- index into tlog  tv=(2^(tv/96))*(string.sub(tlog,ti,ti+2)+1000) -- time value in msec  ti=tv/1000 -- integer part  ts=string.format("%s%u.%03u",pre,ti,tv%1000) -- xx.xxx or 1/xx.xxx  if(ti>1)then -- truncate digits to reflect decimal precision    if(ti>149)then ti=-5    elseif(ti>14)then ti=-3    else ti=-2 end    ts=string.sub(ts,1,ti)  end  return tsend`I wrote this function to convert Canon TV96 values into shutter times. It returns a string with the shutter time in seconds. I use it like this:

tv96=get_tv96()
print(tv96, "=", seconds(tv96),"seconds")
EOS-M3_120f / SX50_100b / SX260_101a / G1X_100g / D20_100b

#### outslider

• 762
##### Re: Converting TV96 value to shutter time
« Reply #1 on: 29 / September / 2012, 06:22:49 »
Ooo, that's nice;) I'll use this in my intervalometer with auto Tv, where the displaying value is incorrect now:

http://chdk.setepontos.com/index.php?topic=7757.0
if (2*b || !2*b) {
cout<<question
}

Compile error: poor Yorick

#### msl

• 1280
• A720 IS, SX220 HS 1.01a
##### Re: Converting TV96 value to shutter time
« Reply #2 on: 29 / September / 2012, 07:07:49 »
A very nice function. Thanks for that.

Another way is using a table:
Code: (lua) [Select]
`function print_tv(val)    local i = val + 19+15    local tv_str = {"2048","1625","1290","1024","812","645","512","406","322",                    "256","203","161","128","101","80","64","50","40","32","25",                    "20","15","13","10","8","6","5","4","3.2","2.5","2","1.6",                    "1.3","1.0","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"}    if (i > #tv_str) or (i < 1) then        return "n/a"    else        return tv_str[i]    endend print(print_tv(get_tv96()/32))`
msl

#### lapser

• 1093
##### Re: Converting TV96 value to shutter time
« Reply #3 on: 29 / September / 2012, 10:33:39 »
Ooo, that's nice;) I'll use this in my intervalometer with auto Tv, where the displaying value is incorrect now:
Thanks. I'm still perfecting a time lapse script, and wrote this function for it. I liked the exposure adjustment at low brightness in your script.
Another way is using a table:
I started with a log table, but realized that using a string would be much more efficient in memory and speed. I also wanted a more exact value rather than an approximation. When TV96 changes by one, at least 1 digit of the output time changes so you can tell something happened.

I used Lua for Windows to create the log table (string) and debug the time converter. Then I changed it to a function for CHDK by removing the "math.floor" calls, since CHDK uses integer variables. This code runs under Lua for Windows (not CHDK):

Code: (lua) [Select]
`f=io.open("testing.txt","wb")f:write("tlog=\"")for i=0,95 do   nlog=math.floor(1000*(2^(i/96))+0.5)-1000  f:write(string.format("%3u",nlog))endf:write("\"\n")f:close()--produces this line:tlog="000007015022029037044052059067075083091098106114122131139147155164172181189198207215224233242251260269278288297306316325335345354364374384394404414424435445456466477488498509520531542553565576587599610622634646658670682694706719731744756769782795808821834847861874888901915929943957971986"repeat  io.write("Enter Tv96 value:")  tv=tonumber(io.read())  if(tv==nil)then break end  pre="1/"  if(tv<=0)then    tv=-tv    pre=""  end  ti=(tv%96)*3+1 -- index into tlog  tv=(2^math.floor(tv/96))*(string.sub(tlog,ti,ti+2)+1000) -- time value xxxxxx  ti=math.floor(tv/1000) -- integer part  ts=string.format("%s%u.%03u",pre,ti,tv%1000) -- xx.xxx or 1/xx.xxx  if(ti>1)then -- truncate digits to reflect decimal precision    if(ti>149)then ti=-5    elseif(ti>14)then ti=-3    else ti=-2 end    ts=string.sub(ts,1,ti)  end  io.write("time=",ts,"\n")until(false)`
EOS-M3_120f / SX50_100b / SX260_101a / G1X_100g / D20_100b

#### outslider

• 762
##### Re: Converting TV96 value to shutter time
« Reply #4 on: 29 / September / 2012, 11:50:55 »
Ooo, that's nice;) I'll use this in my intervalometer with auto Tv, where the displaying value is incorrect now:
Thanks. I'm still perfecting a time lapse script, and wrote this function for it. I liked the exposure adjustment at low brightness in your script.

I would like to see your improved script posted on forum;)
if (2*b || !2*b) {
cout<<question
}

Compile error: poor Yorick