feat: introduce basic light-server program
This commit is contained in:
parent
ce90d6c69c
commit
46635141da
@ -14,6 +14,7 @@ local LIST_TURTLE_CONFIG_FILES = {
|
||||
}
|
||||
|
||||
local LIST_SERVER_FILES = {
|
||||
'light-server.lua',
|
||||
'inferium-server.lua',
|
||||
'notify-server.lua'
|
||||
}
|
||||
|
||||
115
light-server.lua
Normal file
115
light-server.lua
Normal file
@ -0,0 +1,115 @@
|
||||
local MAIN_DELAY_ON = 0.25
|
||||
local MAIN_DELAY_OFF = 0
|
||||
local SECONDARY_DELAY_ON = 0.75
|
||||
local SECONDARY_DELAY_OFF = 0.25
|
||||
|
||||
local MAIN_INPUT_SIDE = 'top'
|
||||
local MAIN_OUTPUT_SIDE = 'left'
|
||||
|
||||
local SECONDARY_INPUT_SIDE = 'back'
|
||||
local SECONDARY_OUTPUT_SIDE = 'front'
|
||||
|
||||
local function getMainColorsOrder()
|
||||
return {
|
||||
colors.white,
|
||||
colors.orange,
|
||||
colors.magenta,
|
||||
colors.lightBlue,
|
||||
colors.yellow,
|
||||
colors.lime,
|
||||
colors.pink,
|
||||
colors.gray,
|
||||
colors.lightGray,
|
||||
colors.cyan,
|
||||
colors.purple,
|
||||
colors.blue,
|
||||
colors.brown,
|
||||
colors.green,
|
||||
colors.red,
|
||||
colors.black
|
||||
}
|
||||
end
|
||||
|
||||
local function getSecondaryColorsOrder()
|
||||
return {
|
||||
colors.white,
|
||||
colors.orange,
|
||||
colors.magenta
|
||||
}
|
||||
end
|
||||
|
||||
local function switchOnLight(bundledOutput, colorsOrder, sleepTime)
|
||||
if sleepTime <= 0 then
|
||||
bundledOutput.setColorState(colors.combine(table.unpack(colorsOrder)))
|
||||
return
|
||||
end
|
||||
|
||||
for _, color in pairs(colorsOrder) do
|
||||
bundledOutput.setOn(color)
|
||||
os.sleep(sleepTime)
|
||||
end
|
||||
end
|
||||
|
||||
local function switchOffLight(bundledOutput, colorsOrder, sleepTime)
|
||||
if sleepTime <= 0 then
|
||||
bundledOutput.setColorState(0)
|
||||
return
|
||||
end
|
||||
|
||||
for _, color in pairs(colorsOrder) do
|
||||
bundledOutput.setOff(color)
|
||||
os.sleep(sleepTime)
|
||||
end
|
||||
end
|
||||
|
||||
local function mainLoop()
|
||||
local mainOutput = rs.createBundledOutput(MAIN_OUTPUT_SIDE)
|
||||
local secondaryOutput = rs.createBundledOutput(SECONDARY_OUTPUT_SIDE)
|
||||
|
||||
local mainColorsOrder = getMainColorsOrder()
|
||||
local secondaryColorsOrder = getSecondaryColorsOrder()
|
||||
|
||||
while true do
|
||||
local _, lightIsOn, typeOfRoom = os.pullEvent('light_command')
|
||||
|
||||
if typeOfRoom == 'main' then
|
||||
if lightIsOn then
|
||||
switchOnLight(mainOutput, mainColorsOrder, MAIN_DELAY_ON)
|
||||
else
|
||||
switchOffLight(mainOutput, mainColorsOrder, MAIN_DELAY_OFF)
|
||||
end
|
||||
elseif typeOfRoom == 'secondary' then
|
||||
if lightIsOn then
|
||||
switchOnLight(secondaryOutput, secondaryColorsOrder, SECONDARY_DELAY_ON)
|
||||
else
|
||||
switchOffLight(secondaryOutput, secondaryColorsOrder, SECONDARY_DELAY_OFF)
|
||||
end
|
||||
else
|
||||
error('unknown type of room "' .. tostring(typeOfRoom) .. '"', 0)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local function redstoneLoop()
|
||||
local mainState = nil
|
||||
local secondaryState = nil
|
||||
|
||||
while true do
|
||||
local newMainState = redstone.getInput(MAIN_INPUT_SIDE)
|
||||
local newSecondaryState = redstone.getInput(SECONDARY_INPUT_SIDE)
|
||||
|
||||
if mainState ~= newMainState then
|
||||
mainState = newMainState
|
||||
os.queueEvent('main', newMainState)
|
||||
end
|
||||
|
||||
if secondaryState ~= newSecondaryState then
|
||||
secondaryState = newSecondaryState
|
||||
os.queueEvent('secondary', newSecondaryState)
|
||||
end
|
||||
|
||||
os.pullEvent('redstone')
|
||||
end
|
||||
end
|
||||
|
||||
parallel.waitForAny(mainLoop, redstoneLoop)
|
||||
Loading…
Reference in New Issue
Block a user