diff --git a/bricks/inputs/switch-input.lua b/bricks/inputs/switch-input.lua index 422a170..12392ff 100644 --- a/bricks/inputs/switch-input.lua +++ b/bricks/inputs/switch-input.lua @@ -1,11 +1,11 @@ - -return function(gate, argv) - if #argv == 1 then - gate.ports[1]:setstate(toboolean(argv[1])) - gate.ports[2]:setstate(toboolean(argv[1])) - else - gate.ports[1]:setstate(not gate.ports[1].state) - gate.ports[2]:setstate(not gate.ports[2].state) - end - gate:cb("1\t" .. bool_to_int[gate.ports[1].state]) -end + +return function(gate, argv) + if #argv == 1 then + gate.ports[1]:setstate(toboolean(argv[1])) + gate.ports[2]:setstate(toboolean(argv[1])) + else + gate.ports[1]:setstate(not gate.ports[1].state) + gate.ports[2]:setstate(not gate.ports[2].state) + end + gate:cb(bool_to_int[gate.ports[1].state]) +end diff --git a/scripts/lualogic.cs b/scripts/lualogic.cs index b6bdd9a..eba3192 100644 --- a/scripts/lualogic.cs +++ b/scripts/lualogic.cs @@ -121,7 +121,7 @@ function llr(){ deleteVariables("$LuaLogic*"); $LuaLogic::Path = %path; - resetAllOpCallFunc(); + //resetAllOpCallFunc(); exec("./lualogic.cs"); schedule(3000, 0, lualogic_connect, 25000); } diff --git a/scripts/tcp.cs b/scripts/tcp.cs index 520a8d2..c1f5557 100644 --- a/scripts/tcp.cs +++ b/scripts/tcp.cs @@ -1,125 +1,122 @@ -function LuaLogicTCP::sendData(%this) -{ - cancel(%this.lualogicTick); - %this.lualogicTick = %this.schedule(31, "sendData"); - - if(%this.data !$= "") - { - %data = %this.data; - while(strpos(%data, ";;") != -1) - %data = strReplace(%data, ";;", "; ;"); - - %this.send(%data @ "\n"); - %this.data = ""; - } -} - -function LuaLogicTCP::onConnected(%this) -{ - lualogic_print("tcp connected"); - - %this.data = ""; - %this.sendData(); - %this.isConnected = true; - - lualogic_sendoptions(); - lualogic_sendgatedefinitions(); - lualogic_sendall(); -} - -function LuaLogicTCP::onLine(%this, %line) -{ - %cmd = getField(%line, 0); - switch$(%cmd) - { - case "WU": - %state = getField(%line, 1)|0; - %count = getFieldCount(%line); - - if(%state) - { - for(%i = 2; %i < %count; %i++) - { - %brick = getField(%line, %i); - if(isObject(%brick)) - %brick.setColorFX(3); - } - } - else - { - for(%i = 2; %i < %count; %i++) - { - %brick = getField(%line, %i); - if(isObject(%brick)) - %brick.setColorFX(0); - } - } - case "TPS": - %tz = getField(%line, 1); - - %count = ClientGroup.getCount(); - for(%i = 0; %i < %count; %i++) - { - %client = ClientGroup.getObject(%i); - if(%client.logicLTR) - commandToClient(%client, 'bottomPrint', "\c3Logic Tick Rate\c6: " @ %tz, 2, 1); - } - case "GINFO": - %client = getField(%line, 1); - if(isObject(%client)) - { - %info = getField(%line, 2); - %info = strReplace(%info, "\\c0", "\c0"); - %info = strReplace(%info, "\\c2", "\c2"); - %info = strReplace(%info, "\\c5", "\c5"); - %client.centerPrint(%info, 5); - } - case "SINFO": - if(isObject(%client = getField(%line, 1))) - { - %wires = getField(%line, 2); - %gates = getField(%line, 3); - %inports = getField(%line, 4); - %outports = getField(%line, 5); - - messageClient(%client, '', '\c3Wires\c6: %1', %wires); - messageClient(%client, '', '\c3Gates\c6: %1', %gates); - messageClient(%client, '', '\c3Ports\c6: %1 inputs | %2 outputs (%3 total)', %inports, %outports, %inports + %outports); - } - case "CB": - %data = getFields(%line, 1, getFieldCount(%line)); - %data = nextToken(%data, brick, "\t"); - while(%brick !$= "") - { - %data = nextToken(%data, argc, "\t"); - if(%argc > 0) - { - %data = nextToken(%data, args, "\t"); - for(%i = 1; %i < %argc; %i++) - { - %data = nextToken(%data, arg, "\t"); - %args = %args TAB %arg; - } - } - - if(isObject(%brick)) - %brick.getDatablock().LuaLogic_Callback(%brick, %args); - - %data = nextToken(%data, brick, "\t"); - } - case "TEST": - talk("Time: " @ getField(%line, 1)); - } -} - -function LuaLogicTCP::onConnectFailed(%this) -{ - lualogic_print("tcp failed to connect"); -} - -function LuaLogicTCP::onDisconnect(%this) -{ - lualogic_print("tcp disconnected"); - %this.isConnected = false; - cancel(%this.lualogicTick); -} +function LuaLogicTCP::sendData(%this) +{ + cancel(%this.lualogicTick); + %this.lualogicTick = %this.schedule(31, "sendData"); + + if(%this.data !$= "") + { + %data = %this.data; + while(strpos(%data, ";;") != -1) + %data = strReplace(%data, ";;", "; ;"); + + %this.send(%data @ "\n"); + %this.data = ""; + } +} + +function LuaLogicTCP::onConnected(%this) +{ + lualogic_print("tcp connected"); + + %this.data = ""; + %this.sendData(); + %this.isConnected = true; + + lualogic_sendoptions(); + lualogic_sendgatedefinitions(); + lualogic_sendall(); +} + +function LuaLogicTCP::onLine(%this, %line) +{ + %cmd = getField(%line, 0); + switch$(%cmd) + { + case "WU": + %state = getField(%line, 1)|0; + %count = getFieldCount(%line); + + if(%state) + { + for(%i = 2; %i < %count; %i++) + { + %brick = getField(%line, %i); + if(isObject(%brick)) + %brick.setColorFX(3); + } + } + else + { + for(%i = 2; %i < %count; %i++) + { + %brick = getField(%line, %i); + if(isObject(%brick)) + %brick.setColorFX(0); + } + } + case "TPS": + %tz = getField(%line, 1); + + %count = ClientGroup.getCount(); + for(%i = 0; %i < %count; %i++) + { + %client = ClientGroup.getObject(%i); + if(%client.logicLTR) + commandToClient(%client, 'bottomPrint', "\c3Logic Tick Rate\c6: " @ %tz, 2, 1); + } + case "GINFO": + %client = getField(%line, 1); + if(isObject(%client)) + { + %info = getField(%line, 2); + %info = strReplace(%info, "\\c0", "\c0"); + %info = strReplace(%info, "\\c2", "\c2"); + %info = strReplace(%info, "\\c5", "\c5"); + %client.centerPrint(%info, 5); + } + case "SINFO": + if(isObject(%client = getField(%line, 1))) + { + %wires = getField(%line, 2); + %gates = getField(%line, 3); + %inports = getField(%line, 4); + %outports = getField(%line, 5); + + messageClient(%client, '', '\c3Wires\c6: %1', %wires); + messageClient(%client, '', '\c3Gates\c6: %1', %gates); + messageClient(%client, '', '\c3Ports\c6: %1 inputs | %2 outputs (%3 total)', %inports, %outports, %inports + %outports); + } + case "CB": + %data = getFields(%line, 1, getFieldCount(%line)); + %data = nextToken(%data, brick, "\t"); + while(%brick !$= ""){ + %data = nextToken(%data, argc, "\t"); + + for(%i=0; %i<%argc; %i++){ + %data = nextToken(%data, av, "\t"); + %argv[%i] = lualogic_collapseescape(%av); + //talk("argv[" @ %i @ "] = " @ %argv[%i]); + } + + if(isObject(%brick)){ + %brick.getDatablock().LuaLogic_Callback(%brick, %argv0, %argv1, %argv2, %argv3, %argv4, %argv5, %argv6, %argv7, %argv8, %argv9); + } + + %data = nextToken(%data, brick, "\t"); + } + case "TEST": + talk("Time: " @ getField(%line, 1)); + } +} + +function LuaLogicTCP::onConnectFailed(%this) +{ + lualogic_print("tcp failed to connect"); +} + +function LuaLogicTCP::onDisconnect(%this) +{ + lualogic_print("tcp disconnected"); + %this.isConnected = false; + cancel(%this.lualogicTick); +} diff --git a/scripts/utilities.cs b/scripts/utilities.cs index 616017c..cf6f916 100644 --- a/scripts/utilities.cs +++ b/scripts/utilities.cs @@ -1,15 +1,4 @@ -function lualogic_escapelogicfunction(%text){ - %text = strReplace(%text, "\\", "\\/"); - - %text = strReplace(%text, "\r", "\\r"); - %text = strReplace(%text, "\n", "\\n"); - %text = strReplace(%text, "\t", "\\t"); - %text = strReplace(%text, ";" , "\\:"); - - return %text; -} - function lualogic_registergatedefinition(%data){ //lualogic_registergatedefinition_auto(%data); @@ -36,9 +25,9 @@ function lualogic_registergatedefinition_auto(%data) %def = %id @ ";" @ %data.logicUIName @ ";" @ %data.logicUIDesc @ ";" @ - lualogic_escapelogicfunction(%data.logicInit) @ ";" @ - lualogic_escapelogicfunction(%data.logicUpdate) @ ";" @ - lualogic_escapelogicfunction(%data.logicInput) @ ";" @ + lualogic_expandescape(%data.logicInit) @ ";" @ + lualogic_expandescape(%data.logicUpdate) @ ";" @ + lualogic_expandescape(%data.logicInput) @ ";" @ (%ports = %data.numLogicPorts) ; @@ -141,7 +130,7 @@ function lualogic_sendinput(%gate, %argc, %arg0, %arg1, %arg2, %arg3, %arg4, %ar { %args = %arg0; for(%i = 1; %i < %argc; %i++) - %args = %args @ ";" @ %arg[%i]; + %args = %args @ ";" @ lualogic_expandescape(%arg[%i]); if(%argc > 0) lualogic_send("IN;" @ %gate.getID() @ ";" @ %argc @ ";" @ %args); @@ -244,3 +233,55 @@ function lualogic_readfile(%filename){ return %filestr; } + +$LuaLogic::EscapeCount = 0; +$LuaLogic::EscapeIn[$LuaLogic::EscapeCount] = "\\"; $LuaLogic::EscapeOut[$LuaLogic::EscapeCount] = "b"; $LuaLogic::EscapeCount++; +$LuaLogic::EscapeIn[$LuaLogic::EscapeCount] = "\t"; $LuaLogic::EscapeOut[$LuaLogic::EscapeCount] = "t"; $LuaLogic::EscapeCount++; +$LuaLogic::EscapeIn[$LuaLogic::EscapeCount] = "\n"; $LuaLogic::EscapeOut[$LuaLogic::EscapeCount] = "n"; $LuaLogic::EscapeCount++; +$LuaLogic::EscapeIn[$LuaLogic::EscapeCount] = "\r"; $LuaLogic::EscapeOut[$LuaLogic::EscapeCount] = "r"; $LuaLogic::EscapeCount++; +$LuaLogic::EscapeIn[$LuaLogic::EscapeCount] = "\'"; $LuaLogic::EscapeOut[$LuaLogic::EscapeCount] = "a"; $LuaLogic::EscapeCount++; +$LuaLogic::EscapeIn[$LuaLogic::EscapeCount] = "\""; $LuaLogic::EscapeOut[$LuaLogic::EscapeCount] = "q"; $LuaLogic::EscapeCount++; +$LuaLogic::EscapeIn[$LuaLogic::EscapeCount] = ";" ; $LuaLogic::EscapeOut[$LuaLogic::EscapeCount] = "s"; $LuaLogic::EscapeCount++; +$LuaLogic::EscapeIn[$LuaLogic::EscapeCount] = ":" ; $LuaLogic::EscapeOut[$LuaLogic::EscapeCount] = "c"; $LuaLogic::EscapeCount++; + +function lualogic_expandescape(%str){ + %ostr = ""; + + %len = strLen(%str); + for(%i=0; %i<%len; %i++){ + %ci = getSubStr(%str, %i, 1); + + %co = %ci; + for(%j=0; %j<$LuaLogic::EscapeCount; %j++){ + if(%ci$=$LuaLogic::EscapeIn[%j]){ %co = "\\" @ $LuaLogic::EscapeOut[%j]; } + } + + %ostr = %ostr @ %co; + } + + return %ostr; +} + +function lualogic_collapseescape(%str){ + %ostr = ""; + + %i = 0; + %len = strLen(%str); + while(%i<%len){ + %ci = getSubStr(%str, %i, 1); + + %co = %ci; + if(%ci=="\\" && %i<%len-1){ + %i++; + %ci = getSubStr(%str, %i, 1); + for(%j=0; %j<$LuaLogic::EscapeCount; %j++){ + if(%ci$=$LuaLogic::EscapeOut[%j]){ %co = $LuaLogic::EscapeIn[%j]; } + } + } + + %ostr = %ostr @ %co; + %i++; + } + + return %ostr; +}