diff --git a/MP.MONO.DECODER/Program.cs b/MP.MONO.DECODER/Program.cs index 60b9814..c50b4bb 100644 --- a/MP.MONO.DECODER/Program.cs +++ b/MP.MONO.DECODER/Program.cs @@ -15,39 +15,100 @@ if (numTest == 1) { // inserisco dati in LUA... List alarmList = new List(); + string alarmStatus = ""; + string luaPath = Path.Combine(Directory.GetCurrentDirectory(), "lua", "AlarmDecoder.lua"); + state.NewTable("alarmListTable"); + LuaTable tabA = state.GetTable("alarmListTable"); +#if false alarmList = new List() { "Allarme01", "Allarme02", "##Allarme03", "Allarme04" }; - //state.NewTable("alarmList"); - //state.DoString(" print(alarmList) "); state["alarmList"] = alarmList; - //state.DoString(" print(alarmList) "); state["numAlarm"] = alarmList.Count; + + state["lastVal"] = 0; + state["currVal"] = 3; // chiamo script - string luaPath = Path.Combine(Directory.GetCurrentDirectory(), "lua", "AlarmDecoder.lua"); state.DoFile(luaPath); - - LuaTable tabA = state.GetTable("alarmListFix"); + tabA = state.GetTable("alarmListTable"); +#endif // aggiorno valori - alarmList = new List() { "Allarme01", "Allarme02", "##Allarme03", "Allarme04", "Allarme05", "##Allarme06", "Allarme07", "Allarme08" }; + alarmList = new List() { "Allarme01", "Allarme02", "##Allarme03", "Allarme04", "##Allarme05", "Allarme06", "Allarme07", "Allarme08" }; state["alarmList"] = alarmList; state["numAlarm"] = alarmList.Count; - // rieseguo + + //state.DoString(@" + //function setupAlarms() + // for i = numAlarm,1, -1 + // do + // alarmListTable[i] = alarmList[i-1] + // end + //end + //"); + //var scriptFunc = state["setupAlarms"] as LuaFunction; + //var res2 = scriptFunc.Call(); + + // eseguo + state["lastVal"] = 0; + state["currVal"] = 3; state.DoFile(luaPath); + alarmStatus = state.GetString("alarmStatus"); + Console.WriteLine(alarmStatus); + //tabA = state.GetTable("alarmListActive"); + //foreach (var item in tabA.Values) + //{ + // Console.WriteLine(item); + //} + Thread.Sleep(800); + + state["currVal"] = 7; + state.DoFile(luaPath); + alarmStatus = state.GetString("alarmStatus"); + Console.WriteLine(alarmStatus); + //tabA = state.GetTable("alarmListActive"); + //foreach (var item in tabA.Values) + //{ + // Console.WriteLine(item); + //} + Thread.Sleep(800); + + state["currVal"] = 15; + state.DoFile(luaPath); + alarmStatus = state.GetString("alarmStatus"); + Console.WriteLine(alarmStatus); + //tabA = state.GetTable("alarmListActive"); + //foreach (var item in tabA.Values) + //{ + // Console.WriteLine(item); + //} + + Thread.Sleep(800); + + state["currVal"] = 0; + state.DoFile(luaPath); + alarmStatus = state.GetString("alarmStatus"); + Console.WriteLine(alarmStatus); + //tabA = state.GetTable("alarmListActive"); + //foreach (var item in tabA.Values) + //{ + // Console.WriteLine(item); + //} //state.DoString("a={b={c=2}}"); //LuaTable tabA = state.GetTable("a"); //LuaTable tabB = state.GetTable("a.b"); //state.DoString(" print(a) "); - //foreach (var item in tabA) - //{ - // Console.WriteLine(item); - //} //foreach (var item in tabB) //{ // Console.WriteLine(item); //} + //tabA = state.GetTable("alarmListActive"); + //foreach (var item in tabA.Values) + //{ + // Console.WriteLine(item); + //} + } else if (numTest == 2) { diff --git a/MP.MONO.DECODER/lua/AlarmDecoder.lua b/MP.MONO.DECODER/lua/AlarmDecoder.lua index b82cd0f..dc036dc 100644 --- a/MP.MONO.DECODER/lua/AlarmDecoder.lua +++ b/MP.MONO.DECODER/lua/AlarmDecoder.lua @@ -24,15 +24,34 @@ callMode = callMode or '' -- se non รจ da NLua inizializzo variabili accessorie if(callMode ~= 'NLua') then - alarmList = {"Allarme01", "Allarme02", "##Silenzio", "##Allarme04", "Allarme05", "Allarme06", "Allarme07", "##Allarme08"} + alarmList = {"##Allarme01", "Allarme02", "AllarmeSilenziato03", "##Allarme04", "Allarme05", "Allarme06", "Allarme07", "##Allarme08"} numAlarm = #alarmList - --print(alarmList) + -- valori status da testare + bitMask = 0 + lastVal = 0 + currVal = 3 end -alarmListTable={} +function testBit(testVal, i) + local answ=0 + local idx=2^(i-1) + -- verifico se sia bit diverso... + answ = (testVal&idx == idx) + return answ +end + +function valMask(testVal) + return testVal & bitMask +end + +-- init tabella +alarmListTable = {} +alarmListActive = {} +alarmStatus = "" if numAlarm > 0 and alarmList[0] ~= nil then + bitMask = 0 for i = numAlarm,1, -1 do alarmListTable[i] = alarmList[i-1] @@ -41,12 +60,59 @@ else alarmListTable = alarmList end -print('------------------------------') -for i = 1, numAlarm +-- calcolo maschera... +for i = 1, numAlarm,1 do - print("AL"..i.." | "..alarmListTable[i]) + if(string.sub(alarmListTable[i],0,2)~='##') + then + bitMask = bitMask + 2^(i-1) + end end +--print('BitMask: '..bitMask) + +for i = 1, numAlarm do + bTest = testBit(valMask(currVal),i) + if(bTest) + then + -- print("AL"..i.." | "..alarmListTable[i]) + alarmListActive[i]=alarmListTable[i] + end +end + +-- confronto lastVal e currVal +if(valMask(lastVal) ~= valMask(currVal)) +then + print('LastVal: '.. lastVal .. ' | CurrVal: '.. currVal .. ' || LastValMask: '.. valMask(lastVal) .. ' | CurrValMask: '.. valMask(currVal)) + --for i = 1, numAlarm + --do + -- bTest = testBit(valMask(currVal),i) + -- if(bTest) + -- then + -- -- print("AL"..i.." | "..alarmListTable[i]) + -- alarmListActive[i]=alarmListTable[i] + -- end + --end + -- salva nuovo valore corrente (post mask) + lastVal = valMask(currVal) +else + print('UNCHANGED | LastValMask: '.. valMask(lastVal) .. ' | CurrValMask: '.. valMask(currVal)) +end + +for k, v in pairs(alarmListActive) do + alarmStatus = alarmStatus .. k .. ' - ' .. v .. ' | ' +end + +if(#alarmStatus == 0) then + alarmStatus = 'All OK' +else + if(#alarmStatus > 3) then + alarmStatus = string.sub(alarmStatus, 0, #alarmStatus -3) + end +end + +--print(alarmStatus) + --print('------------------------------') -- --for i,val in pairs(alarmListTable) do @@ -57,42 +123,3 @@ end --for i,val in ipairs(alarmListTable) do -- print("AL"..i.." | "..val) --end - -rawVal = 6 -b0 = 1 -b1 = 2 -b2 = 4 ---bVal = bit.tobit(rawVal) ---bHex = bit.tohex(rawVal) ---print(bit.band(bVal,b0)) ---print(bit.band(bVal,b1)) ---print(bit.band(bVal,b2)) ---print(bHex) - ---print('------------------------------') ---print(6&1 == 1) ---print(6&2 == 2) ---print(6&4 == 4) ---print(6&2 == 8) ---print(6&4 == 16) ---print('------------------------------') ---print(6|1) ---print(6|2) ---print(6|4) ---print(6|2) ---print(6|4) - ---OR, XOR, AND = 1, 3, 4 --- ---function bitoper(a, b, oper) --- local r, m, s = 0, 2^31 --- repeat --- s,a,b = a+b+m, a%m, b%m --- r,m = r + m*oper%(s-a-b), m/2 --- until m < 1 --- return r ---end --- ---print(bitoper(6,3,OR)) --> 7 ---print(bitoper(6,3,XOR)) --> 5 ---print(bitoper(6,3,AND)) --> 2 \ No newline at end of file