From 195f187ba84a93acacba6de31471af4bcbd0b68e Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Wed, 23 Mar 2022 20:07:26 +0100 Subject: [PATCH] Fix decodificatore lua x variabili calcolate (test in LUA) --- MP.MONO.DECODER/lua/AlarmDecoder.lua | 12 +- MP.MONO.DECODER/lua/ParamsDecoder.lua | 154 ++++++++-------------- MP.MONO.DECODER/lua/test/ScratchPad.lua | 164 ++++++++---------------- 3 files changed, 107 insertions(+), 223 deletions(-) diff --git a/MP.MONO.DECODER/lua/AlarmDecoder.lua b/MP.MONO.DECODER/lua/AlarmDecoder.lua index d8d95a8..01e9103 100644 --- a/MP.MONO.DECODER/lua/AlarmDecoder.lua +++ b/MP.MONO.DECODER/lua/AlarmDecoder.lua @@ -2,15 +2,13 @@ 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) -- muteMask(INT) valore disableMask x silenziamento allarmi (xFF default = tutto attivo, ogni bit a 0 è silenziato) - opzionale +- 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 (stirng con status finale risultato allarmi attivi) - -Viene calcolato internamente la disableMask dall'elenco allarmi +- 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 diff --git a/MP.MONO.DECODER/lua/ParamsDecoder.lua b/MP.MONO.DECODER/lua/ParamsDecoder.lua index d8d95a8..c9470cf 100644 --- a/MP.MONO.DECODER/lua/ParamsDecoder.lua +++ b/MP.MONO.DECODER/lua/ParamsDecoder.lua @@ -1,134 +1,84 @@ --[[--------------------------------------------------- -Procedura decodifica Allarmi: +Procedura calcolo statistiche parametri: Variabili IN: -- alarmList(array/tabella) (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 +- vcFunct(string): tipo di processing da effettuare tra [POINT/AVG/MEDIAN/MIN/MAX] +- valList(): elenco VALORI double da processare Variabili OUT: -- alarmStatus (stirng con status finale risultato allarmi attivi) - -Viene calcolato internamente la disableMask dall'elenco allarmi +- calcVal(double): valore calcolato finale -----------------------------------------------------]] --- ricezione da codice tab status allarmi, attenzione da C# è 0 based, qui è 1 based --> fix costruzione tabella + +-- Per eventuale debug +local ZBS = "c:/ZeroBraneStudio" +if not package.path:find(ZBS,1,true) then + package.path = ZBS .. "/lualibs/?/?.lua;" .. ZBS .. "/lualibs/?.lua;" .. package.path + package.cpath = ZBS .. "/bin/?.dll;" .. ZBS .. "/bin/clibs53/?.dll;" .. package.cpath +end -- 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' +callMode = callMode or '' +vcFunct = vcFunct or '' +valList = valList or {} +calcVal = 0 +calcOk = false -- 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 + -- imposto valori test + valList = { 4.0, 5.0, 3.0, 6.0, 1.0, 2.0 } + vcFunct = 'MIN' + --POINT AVG MEDIAN MIN MAX 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] +local function doCalc() + if(#valList>0) then + -- verifica il tipo di richiesta + if(vcFunct == 'AVG') then + s = 0 + for i,v in ipairs(valList) do + s = s + v + end + calcVal = s / #valList + elseif(vcFunct == 'POINT') then + calcVal = valList[#valList] + elseif(vcFunct == 'MEDIAN') then + table.sort(valList) + calcVal = valList[#valList/2] + elseif(vcFunct == 'MIN') then + table.sort(valList) + calcVal = valList[1] + elseif(vcFunct == 'MAX') then + table.sort(valList) + calcVal = valList[#valList] end + calcOk = true else - alarmListTable = alarmList + calcVal = 0 + calcOk = false 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 + print('------------------------------') + print('calcOk: ' .. tostring(calcOk)) + print('vcFunct: ' .. vcFunct) + for i,val in pairs(valList) do + print("v_"..i.." | "..val) + end + print('calcVal: ' .. calcVal) + print('------------------------------') end end -- MAIN -alarmListTable = {} -alarmListActive = {} -alarmStatus = "" checkInit() -setupTable() - -checkVariation() -checkActiveAlarms() -calcStatusVar() +doCalc() displayTestInfo() diff --git a/MP.MONO.DECODER/lua/test/ScratchPad.lua b/MP.MONO.DECODER/lua/test/ScratchPad.lua index 6ac664c..b714306 100644 --- a/MP.MONO.DECODER/lua/test/ScratchPad.lua +++ b/MP.MONO.DECODER/lua/test/ScratchPad.lua @@ -1,146 +1,82 @@ --[[--------------------------------------------------- -Procedura decodifica Allarmi: +Procedura calcolo statistiche parametri: 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 +- vcFunct(string): tipo di processing da effettuare tra [POINT/AVG/MEDIAN/MIN/MAX] +- valList(): elenco VALORI double da processare Variabili OUT: -- alarmStatus (stirng con status finale risultato allarmi attivi) - -Viene calcolato internamente la disableMask dall'elenco allarmi +- calcVal(double): valore calcolato finale -----------------------------------------------------]] --- ricezione da codice tab status allarmi, attenzione da C# è 0 based, qui è 1 based --> fix costruzione tabella + +-- Per eventuale debug +local ZBS = "c:/ZeroBraneStudio" +if not package.path:find(ZBS,1,true) then + package.path = ZBS .. "/lualibs/?/?.lua;" .. ZBS .. "/lualibs/?.lua;" .. package.path + package.cpath = ZBS .. "/bin/?.dll;" .. ZBS .. "/bin/clibs53/?.dll;" .. package.cpath +end -- 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' +callMode = callMode or '' +vcFunct = vcFunct or '' +valList = valList or {} +calcVal = 0 +calcOk = false -- 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 + -- imposto valori test + valList = { 4.0, 5.0, 3.0, 6.0, 1.0, 2.0 } + vcFunct = 'MAX' + --POINT AVG MEDIAN MIN MAX 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] +local function doCalc() + if(#valList>0) then + -- verifica il tipo di richiesta + if(vcFunct == 'AVG') then + s = 0 + for i,v in ipairs(valList) do + s = s + v + end + calcVal = s / #valList + elseif(vcFunct == 'POINT') then + calcVal = valList[#valList] + elseif(vcFunct == 'MEDIAN') then + table.sort(valList) + calcVal = valList[#valList/2] + elseif(vcFunct == 'MIN') then + calcVal = math.min(valList) + elseif(vcFunct == 'MAX') then + calcVal = math.max(valList) end + calcOk = true else - alarmListTable = alarmList + calcVal = 0 + calcOk = false 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 + print('------------------------------') + print('calcOk: ' .. tostring(calcOk)) + print('vcFunct: ' .. vcFunct) + for i,val in pairs(valList) do + print("v_"..i.." | "..val) + end + print('calcVal: ' .. calcVal) + print('------------------------------') 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 -- MAIN -alarmListTable = {} -alarmListActive = {} -alarmStatus = "" checkInit() -setupTable() ---setupDisableMask() - -checkVariation() -checkActiveAlarms() -calcStatusVar() +doCalc() displayTestInfo()