computercraft/redstone_toggle
2023-11-22 23:03:25 +01:00

96 lines
3.3 KiB
Lua

-- vi: ft=lua
local hostname = "redstone_toggle" .. os.getComputerID()
function dump(o)
if o == nil then
return ""
end
if type(o) == 'table' then
local s = '{ '
for k,v in pairs(o) do
if type(k) ~= 'number' then k = '"'..k..'"' end
s = s .. '['..k..'] = ' .. dump(v) .. ','
end
return s .. '} '
end
return tostring(o)
end
function recv()
while true do
local event, id, data = os.pullEvent()
if event == "rednet_message" then
print(id .. " (" .. event .. ")> " .. dump(data))
if type(data) == 'table' then
if data[1] == 'eval' then
local cmd_fn, err = loadstring(data[2])
if not cmd_fn then
print("Failed to compile '" .. data[2] .. "': " .. err)
rednet.send(id, "Failed to compile '" .. data[2] .. "': " .. err)
else
local success, output = pcall(cmd_fn)
if success then
if output then
print("Command output from '" .. data[2] .. "': " .. dump(output))
rednet.send(id, "Command output from '" .. data[2] .. "': " .. dump(output))
else
print("There is no command output from '" .. data[2] .. "'")
rednet.send(id, "There is no command output from '" .. data[2] .. "'")
end
else
print("Runtime error: " .. output)
rednet.send(id, "Runtime error: " .. output)
end
end
end
elseif type(data) == 'string' then
if data == 'ping' then
print("Pong!")
rednet.send(id, "Pong!")
elseif data == 'toggle' then
local output_state = not redstone.getInput("back")
redstone.setOutput("back", output_state)
print("Toggled output to: " .. tostring(output_state))
rednet.send(id, "Toggled output to: " .. tostring(output_state))
elseif data == 'get_state' then
local output_state = redstone.getInput("back")
print("Output state: " .. tostring(output_state))
rednet.send(id, {'output_state', output_state})
end
end
end
end
end
function lever_input()
local lever_state = redstone.getInput("top")
while true do
local new_lever_state = redstone.getInput("top")
if new_lever_state ~= lever_state then
lever_state = new_lever_state
local output_state = not redstone.getInput("back")
redstone.setOutput("back", output_state)
print("Toggled output to: " .. tostring(output_state))
end
sleep(1)
end
end
local sides = peripheral.getNames()
for i = 1, #sides do
if peripheral.getType(sides[i]) == "modem" then
modemSide = sides[i]
break
end
end
rednet.open(modemSide)
rednet.host("rmm", hostname)
parallel.waitForAny(recv, lever_input)
rednet.close(modemSide)