sc3-rom-dump/rom/programs/redstone.lua

123 lines
3.5 KiB
Lua

-- SPDX-FileCopyrightText: 2017 Daniel Ratcliffe
--
-- SPDX-License-Identifier: LicenseRef-CCPL
local tArgs = { ... }
local function printUsage()
local programName = arg[0] or fs.getName(shell.getRunningProgram())
print("Usages:")
print(programName .. " probe")
print(programName .. " set <side> <value>")
print(programName .. " set <side> <color> <value>")
print(programName .. " pulse <side> <count> <period>")
end
local sCommand = tArgs[1]
if sCommand == "probe" then
-- "redstone probe"
-- Regular input
print("Redstone inputs: ")
local count = 0
local bundledCount = 0
for _, sSide in ipairs(redstone.getSides()) do
if redstone.getBundledInput(sSide) > 0 then
bundledCount = bundledCount + 1
end
if redstone.getInput(sSide) then
if count > 0 then
io.write(", ")
end
io.write(sSide)
count = count + 1
end
end
if count > 0 then
print(".")
else
print("None.")
end
-- Bundled input
if bundledCount > 0 then
print()
print("Bundled inputs:")
for _, sSide in ipairs(redstone.getSides()) do
local nInput = redstone.getBundledInput(sSide)
if nInput ~= 0 then
write(sSide .. ": ")
local count = 0
for sColour, nColour in pairs(colors) do
if type(nColour) == "number" and colors.test(nInput, nColour) then
if count > 0 then
write(", ")
end
if term.isColour() then
term.setTextColour(nColour)
end
write(sColour)
if term.isColour() then
term.setTextColour(colours.white)
end
count = count + 1
end
end
print(".")
end
end
end
elseif sCommand == "pulse" then
-- "redstone pulse"
local sSide = tArgs[2]
local nCount = tonumber(tArgs[3]) or 1
local nPeriod = tonumber(tArgs[4]) or 0.5
for _ = 1, nCount do
redstone.setOutput(sSide, true)
sleep(nPeriod / 2)
redstone.setOutput(sSide, false)
sleep(nPeriod / 2)
end
elseif sCommand == "set" then
-- "redstone set"
local sSide = tArgs[2]
if #tArgs > 3 then
-- Bundled cable output
local sColour = tArgs[3]
local nColour = colors[sColour] or colours[sColour]
if type(nColour) ~= "number" then
printError("No such color")
return
end
local sValue = tArgs[4]
if sValue == "true" then
rs.setBundledOutput(sSide, colors.combine(rs.getBundledOutput(sSide), nColour))
elseif sValue == "false" then
rs.setBundledOutput(sSide, colors.subtract(rs.getBundledOutput(sSide), nColour))
else
print("Value must be boolean")
end
else
-- Regular output
local sValue = tArgs[3]
local nValue = tonumber(sValue)
if sValue == "true" then
rs.setOutput(sSide, true)
elseif sValue == "false" then
rs.setOutput(sSide, false)
elseif nValue and nValue >= 0 and nValue <= 15 then
rs.setAnalogOutput(sSide, nValue)
else
print("Value must be boolean or 0-15")
end
end
else
-- Something else
printUsage()
end