A lua script that:
- dumps all PropertyCase values out to a file propdump.log
- compares PropertyCase values against the existing propdump.log file.
Useful to detect which property cases have changed.
You can configure a few variables:
- Change the range of propcases that is scanned (From propcase and To propcase).
- Disable outputting of the file (set Do dump? to 0)
- Dump to a numbered dump file (set Output to dump# to 1 or more (saves to file propdump.### where ### is the number you choose)
- Compare against a numbered dump (set Compare with dump# to 1 or more (compares against file propdump.### where ### is the number you choose) or -1 to disable comparison output.
- Do value comparisons in hex (default) or decimal (set As hex? to 0).
The most useful thing you may wish to use in other scripts, is that it shows:
- how to load a bunch of settings from a file (using LUA's loadstring (see http://www.wowwiki.com/API_loadstring) feature. Maybe see http://www.gammon.com.au/forum/bbshowpost.php?bbsubject_id=4960 or http://ebiff.sourceforge.net/manual.html for more complex examples - hard to find good examples even though this is a common technique in lots of languages e.g. http://json.org/.
- how to save data to a file that can be read in again easily (saving state between runs of the script - very useful!).
Here is an example of the log file output (which is read in on next script run) for propcases 0 to 10. The file has unneeded whitespace added because I find the extra tabs make the file more readable. Also LUA "arrays" normally have a much cleaner syntax like {itemA, itemB, itemC, itemD}, but I wanted a zero based array and I wanted to easily see the relation between propcase index and the propcase value.
{
[ 0]= 0,
[ 1]= 0,
[ 2]= 0,
[ 3]= 0,
[ 4]= 0,
[ 5]= 1,
[ 6]= 0,
[ 7]= 0,
[ 8]= 1,
[ 9]= 0,
[ 10]= 0,
ver=1,
from=0,
to=20
}
The script:
--propdump.lua by Morris Johns
-- dump property cases and compare for differences against last dump (see http://chdk.wikia.com/wiki/PropertyCase)
--[[
@title propdump
@param f From propcase
@default f 0
@param t To propcase
@default t 279
@param d Do dump?
@default d 1
@param h As hex?
@default h 1
@param i Compare with dump#
@default i 0
@param o Output to dump#
@default o 0
]]
-- setup
_from = f
_to = t
_dodump = d
_ashex = h
if i >= 0 then
_compare = true
end
if i == 0 then
i = "log"
end
_infilename = "A/propdump." .. i
if o == 0 then
o = "log"
end
_outfilename = "A/propdump." .. o
function logwrite(...)
if _dodump and not outfile then
outfile=io.open(_outfilename, "w+b")
end
if outfile then
outfile:write(...)
end
end
function waitshutter()
print("press half-shutter")
repeat
wait_click(100)
until not is_pressed("shoot_half")
repeat
wait_click(100)
until is_pressed("shoot_half")
end
-- load previous data
if _compare then
infile = io.open(_infilename, "rb")
if infile then
fn = loadstring("data=" .. infile:read("*a"))
if fn then
fn()
end
infile:close()
end
if not data then
print("no existing data")
end
end
-- loop through propcases
diffs = {}
logwrite("{\n")
for i = _from,_to do
v = get_prop(i)
logwrite("[", i, "]=\t", v, ",\n")
if data and data.ver == 1 and data.from <= i and i <= data.to then
-- do comparison
if data[i] ~= v then
if _ashex then
num1 = string.sub(string.format('%04X', data[i]), -4)
num2 = string.sub(string.format('%04X', v), -4)
else
num1 = data[i]
num2 = v
end
table.insert(diffs, "[" .. i .. "] " .. num1 .. " -> " .. num2)
end
end
end
logwrite("ver=1,\n")
logwrite("from=", f, ",\n")
logwrite("to=", t, ",\n")
diffs_were = unpack(diffs)
if _compare and diffs_were then
logwrite("diffs_were=", string.format("%q", diffs_were), ",\n")
end
logwrite("}\n")
if outfile then
outfile:close()
end
-- tell user the differences
if _compare then
for i,diff in ipairs(diffs) do
print(diff)
if i % 4 == 0 and diffs[i+1] then
waitshutter()
end
end
if get_mode() == 1 then
-- in play mode, screen cleared without this
waitshutter()
end
end