local function getBit(gate, val)
	--print("get bit", val)
	if gate.listenState=="wait" then
		if val==1 then
			gate.listenState = "getbits"
			gate.bitsReceived = 0
			--print("", "state = listen")
		end
	elseif gate.listenState=="getbits" then
		gate.valReceived = gate.valReceived + math.pow(2, textbrick2_bitsNeeded-1-gate.bitsReceived)*val
		gate.bitsReceived = gate.bitsReceived+1
		
		--print("", "append", gate.bitsReceived-1, val)
		
		if gate.bitsReceived==textbrick2_bitsNeeded then
			
			gate.listenState = "terminate"
		end
	elseif gate.listenState=="terminate" then
		if val==1 then
			print("", "terminate")
			
			local printid = gate.valReceived
			local printname = textbrick2_idxToPrint[printid]
			
			gate:cb(printname)
			
			--print("", "set print", string.format("%02x", printid), printname)
		end
		
		gate.listenState = "wait"
		
		gate.bitsReceived = 0
		gate.valReceived = 0
	end
end

local function changeTo(gate, val)
	local tick = gate:gettick()
	local ticks = tick-gate.lastTickChanged
	
	local bits = math.min(ticks, 10)
	for i = 1, bits do
		getBit(gate, val)
	end
	
	gate.lastTickChanged = tick
end

return function(gate)
	if gate.ports[1]:isrising() then
		changeTo(gate, 0)
	elseif gate.ports[1]:isfalling() then
		changeTo(gate, 1)
	end
end