143 lines
3.9 KiB
Lua
143 lines
3.9 KiB
Lua
--[[---------------------------------------------------
|
|
Procedura decodifica Allarmi:
|
|
|
|
Variabili IN:
|
|
- alarmList(array/tabella) (elenco allarmi gestiti a bitmap, se ## = silenziati)
|
|
- currVal(INT) stato corrente
|
|
- lastVal(INT) ultimo stato (oppure 0) - opzionale
|
|
- muteMask(INT) valore disableMask x silenziamento allarmi (xFF default = tutto attivo, ogni bit a 0 è silenziato) - opzionale
|
|
|
|
Variabili OUT:
|
|
- alarmStatus (stirng con status finale risultato allarmi attivi)
|
|
|
|
Viene calcolato internamente la disableMask dall'elenco allarmi
|
|
-----------------------------------------------------]]
|
|
|
|
-- 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
|
|
--disableMask = disableMask or 0x00 -- caso calcolato internamente
|
|
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 = 255
|
|
disableMask = 0x00
|
|
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
|
|
-- calcolo maschera...
|
|
local function setupdisableMask()
|
|
if(callMode ~= 'NLua') then
|
|
for i = 1, numAlarm,1 do
|
|
if(string.sub(alarmListTable[i],0,2)~='##') then
|
|
disableMask = disableMask + 2^(i-1)
|
|
end
|
|
end
|
|
disableMask = math.tointeger(disableMask)
|
|
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(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()
|
|
setupdisableMask()
|
|
checkVariation()
|
|
checkActiveAlarms()
|
|
calcStatusVar()
|
|
displayTestInfo()
|