Fix for swapped parity when using lf_bulk_program.lua (#591)

This commit is contained in:
Tom Harkness 2018-04-03 16:14:51 +10:00 committed by pwpiwi
parent f5ecd97b15
commit e069547c27

View file

@ -9,7 +9,7 @@ bit32 = require('bit32')
usage = [[ script run lf_bulk_program.lua -f facility -b base_id_num -c count usage = [[ script run lf_bulk_program.lua -f facility -b base_id_num -c count
e.g: e.g:
script run lf_bulk_program.lua -f 1 -b 1000 -c 10 script run lf_bulk_program.lua -f 1 -b 1000 -c 10
]] ]]
author = "Brian Redbeard" author = "Brian Redbeard"
@ -32,12 +32,12 @@ function toBits(num,bits)
end end
--[[Likely, I'm an idiot, but I couldn't find any parity functions in Lua --[[Likely, I'm an idiot, but I couldn't find any parity functions in Lua
This can also be done with a combination of bitwise operations (in fact, This can also be done with a combination of bitwise operations (in fact,
is the canonically "correct" way to do it, but my brain doesn't just is the canonically "correct" way to do it, but my brain doesn't just
default to this and so counting some ones is good enough for me]]-- default to this and so counting some ones is good enough for me]]--
local function evenparity(s) local function evenparity(s)
local _, count = string.gsub(s, "1", "") local _, count = string.gsub(s, "1", "")
local p = count % 2 local p = count % 2
if (p == 0) then if (p == 0) then
return(false) return(false)
@ -45,7 +45,7 @@ local function evenparity(s)
return(true) return(true)
end end
end end
local function isempty(s) local function isempty(s)
return s == nil or s == '' return s == nil or s == ''
@ -57,12 +57,13 @@ end
local function cardHex(i,f) local function cardHex(i,f)
fac = bit32.lshift(f,16) fac = bit32.lshift(f,16)
id = bit32.bor(i, fac) id = bit32.bor(i, fac)
stream=toBits(id,26) stream=toBits(id,24)
--As the function defaults to even parity and returns a boolean, --As the function defaults to even parity and returns a boolean,
--perform a 'not' function to get odd parity --perform a 'not' function to get odd parity
high = not evenparity(string.sub(stream,0,12)) and 1 or 0 high = evenparity(string.sub(stream,1,12)) and 1 or 0
low = evenparity(string.sub(stream,13)) and 1 or 0 low = not evenparity(string.sub(stream,13)) and 1 or 0
bits = bit32.bor(bit32.lshift(id,1), low) bits = bit32.bor(bit32.lshift(id,1), low)
bits = bit32.bor(bits, bit32.lshift(high,25)) bits = bit32.bor(bits, bit32.lshift(high,25))
@ -71,13 +72,13 @@ local function cardHex(i,f)
--to create a higher order and lower order component which we will --to create a higher order and lower order component which we will
--then assemble in the return. The math above defines the proper --then assemble in the return. The math above defines the proper
--encoding as per HID/Weigand/etc. These bit flips are due to the --encoding as per HID/Weigand/etc. These bit flips are due to the
--format length check on bit 38 (cmdlfhid.c:64) and --format length check on bit 38 (cmdlfhid.c:64) and
--bit 31 (cmdlfhid.c:66). --bit 31 (cmdlfhid.c:66).
preamble = bit32.bor(0, bit32.lshift(1,5)) preamble = bit32.bor(0, bit32.lshift(1,5))
bits = bit32.bor(bits, bit32.lshift(1,26)) bits = bit32.bor(bits, bit32.lshift(1,26))
return ("%04x%08x"):format(preamble,bits) return ("%04x%08x"):format(preamble,bits)
end end
local function main(args) local function main(args)
@ -86,22 +87,22 @@ local function main(args)
--long arguments, but it seems this library was chosen for BSD style --long arguments, but it seems this library was chosen for BSD style
--compatibility --compatibility
for o, a in getopt.getopt(args, 'f:b:c:h') do for o, a in getopt.getopt(args, 'f:b:c:h') do
if o == 'f' then if o == 'f' then
if isempty(a) then if isempty(a) then
print("You did not supply a facility code, using 0") print("You did not supply a facility code, using 0")
facility = 0 facility = 0
else else
facility = a facility = a
end end
elseif o == 'b' then elseif o == 'b' then
if isempty(a) then if isempty(a) then
print("You must supply the flag -b (base id)") print("You must supply the flag -b (base id)")
return return
else else
baseid = a baseid = a
end end
elseif o == 'c' then elseif o == 'c' then
if isempty(a) then if isempty(a) then
print("You must supply the flag -c (count)") print("You must supply the flag -c (count)")
return return
else else
@ -118,22 +119,22 @@ local function main(args)
--works, specifying ":" does not enforce supplying a value, thus we --works, specifying ":" does not enforce supplying a value, thus we
--need to do these checks all over again. --need to do these checks all over again.
if isempty(baseid) then if isempty(baseid) then
print("You must supply the flag -b (base id)") print("You must supply the flag -b (base id)")
print(usage) print(usage)
return return
end end
if isempty(count) then if isempty(count) then
print("You must supply the flag -c (count)") print("You must supply the flag -c (count)")
print(usage) print(usage)
return return
end end
--If the facility ID is non specified, ensure we code it as zero --If the facility ID is non specified, ensure we code it as zero
if isempty(facility) then if isempty(facility) then
print("Using 0 for the facility code as -f was not supplied") print("Using 0 for the facility code as -f was not supplied")
facility = 0 facility = 0
end end
--The next baseid + count function presents a logic/UX conflict --The next baseid + count function presents a logic/UX conflict
@ -144,7 +145,7 @@ local function main(args)
endid = baseid + count endid = baseid + count
for cardnum = baseid,endid do for cardnum = baseid,endid do
local card = cardHex(cardnum, facility) local card = cardHex(cardnum, facility)
print("Press enter to program card "..cardnum..":"..facility.." (hex: "..card..")") print("Press enter to program card "..cardnum..":"..facility.." (hex: "..card..")")
--This would be better with "press any key", but we'll take --This would be better with "press any key", but we'll take