--[[--------------------------------------------------- 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()