local function getBit(gate, val) local gatedata = Gate.getdata(gate) --print("get bit", val) if gatedata.listenState=="wait" then if val==1 then gatedata.listenState = "getbits" gatedata.bitsReceived = 0 --print("", "state = listen") end elseif gatedata.listenState=="getbits" then gatedata.valReceived = gatedata.valReceived + math.pow(2, textbrick2_bitsNeeded-1-gatedata.bitsReceived)*val gatedata.bitsReceived = gatedata.bitsReceived+1 --print("", "append", gatedata.bitsReceived-1, val) if gatedata.bitsReceived==textbrick2_bitsNeeded then gatedata.listenState = "terminate" end elseif gatedata.listenState=="terminate" then if val==1 then --print("", "terminate") local printid = gatedata.valReceived local printname = textbrick2_idxToPrint[printid] Gate.cb(gate, printname) --print("", "set print", string.format("%02x", printid), printname) end gatedata.listenState = "wait" gatedata.bitsReceived = 0 gatedata.valReceived = 0 end end local function changeTo(gate, val) local gatedata = Gate.getdata(gate) local tick = Gate.gettick(gate) local ticks = tick-gatedata.lastTickChanged local bits = math.min(ticks, 10) for i = 1, bits do getBit(gate, val) end gatedata.lastTickChanged = tick end return function(gate) if Gate.getportisrising(gate, 1) then changeTo(gate, 0) elseif Gate.getportisfalling(gate, 1) then changeTo(gate, 1) end end