Files
mapo-mono/MP.MONO.DECODER/lua/AlarmDecoder.lua
T
2022-03-23 20:07:26 +01:00

133 lines
3.7 KiB
Lua

--[[---------------------------------------------------
Procedura decodifica Allarmi:
Variabili IN:
- alarmList(array): elenco allarmi gestiti a bitmap, se ## = silenziati
- currVal(INT): stato corrente
- lastVal(INT): ultimo stato (oppure 0)
- muteMask(INT): valore disableMask x silenziamento allarmi (xFF default = tutto attivo, ogni bit a 0 è silenziato) - opzionale
Variabili OUT:
- alarmStatus: string con status finale risultato allarmi attivi
-----------------------------------------------------]]
-- ricezione da codice tab status allarmi, attenzione da C# è 0 based, qui è 1 based --> fix costruzione tabella
-- variabile semaforo callMode (locali o remote da NLua)
callMode = callMode or ''
currVal = currVal or 0
lastVal = lastVal or 0
muteMask = muteMask or 0XFF
disableMask = disableMask or 0xFF
valueChanged = false
prefix = prefix or 'AREA'
-- se non è da NLua inizializzo variabili accessorie
local function checkInit()
if (callMode ~= 'NLua') then
alarmList = {"Allarme01", "Allarme02", "Allarme03", "Allarme04", "Allarme05", "Allarme06", "Allarme07",
"Allarme08", "##Allarme09", "##Allarme10", "##Allarme11", "##Allarme12", "##Allarme13",
"##Allarme14", "##Allarme15", "##Allarme16"}
numAlarm = #alarmList
-- valori status da testare
lastVal = 0
currVal = 1403
disableMask = 0xFF
muteMask = 0xFF3F
end
end
local function testBit(testVal, i)
local answ=0
local idx=2^(i-1)
-- verifico se sia bit diverso...
answ = (testVal&idx == idx)
return answ
end
local function valMask(testVal)
return testVal & disableMask & muteMask
end
local function setupTable()
if numAlarm > 0 and alarmList[0] ~= nil then
--disableMask = 0
for i = numAlarm,1, -1 do
alarmListTable[i] = alarmList[i-1]
end
else
alarmListTable = alarmList
end
end
-- confronto lastVal e currVal
local function checkVariation()
valueChanged = valMask(lastVal) ~= valMask(currVal)
if (callMode ~= 'NLua') then
if (valueChanged) then
print('LastVal: ' .. lastVal .. ' | CurrVal: ' .. currVal .. ' || LastValMask: ' .. valMask(lastVal) .. ' | CurrValMask: ' .. valMask(currVal))
else
print('UNCHANGED | LastValMask: ' .. valMask(lastVal) .. ' | CurrValMask: ' .. valMask(currVal))
end
end
-- salva nuovo valore corrente (post mask)
lastVal = valMask(currVal)
end
local function checkActiveAlarms()
local hasAlarms = 0
for i = 1, numAlarm do
bTest = testBit(lastVal, i)
--bTest = testBit(valMask(currVal), i)
if (bTest) then
alarmListActive[#alarmListActive + 1] = '[' .. prefix .. '.' .. string.format("%02d", i) .. '] ' .. alarmListTable[i]
hasAlarms = 1
end
end
-- ordino allarmi...
if (hasAlarms == 1) then
table.sort(alarmListActive)
end
end
local function calcStatusVar()
for k, v in pairs(alarmListActive) do
alarmStatus = alarmStatus .. v .. ' | '
end
if (#alarmStatus == 0) then
alarmStatus = 'All OK'
else
if (#alarmStatus > 3) then
alarmStatus = string.sub(alarmStatus, 0, #alarmStatus - 3)
end
end
end
local function displayTestInfo()
if (callMode ~= 'NLua') then
print('muteMask: ' .. muteMask .. ' | disableMask: ' .. disableMask)
print(alarmStatus)
-- print('------------------------------')
-- for i,val in pairs(alarmListTable) do
-- print("AL"..i.." | "..val)
-- end
end
end
-- MAIN
alarmListTable = {}
alarmListActive = {}
alarmStatus = ""
checkInit()
setupTable()
checkVariation()
checkActiveAlarms()
calcStatusVar()
displayTestInfo()