130 lines
3.3 KiB
Lua
130 lines
3.3 KiB
Lua
local rs = require('libs/rs')
|
|
|
|
local MAIN_DELAY_ON = 0.25
|
|
local MAIN_DELAY_OFF = 0.10
|
|
local SECONDARY_DELAY_ON = 1.25
|
|
local SECONDARY_DELAY_OFF = 0.5
|
|
|
|
local MAIN_INPUT_SIDE = 'top'
|
|
local MAIN_OUTPUT_SIDE = 'left'
|
|
|
|
local SECONDARY_INPUT_SIDE = 'back'
|
|
local SECONDARY_OUTPUT_SIDE = 'front'
|
|
|
|
local VERSION = '1.1.1'
|
|
|
|
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 applyCommand(bundledOutput, loopQueue, colorsOrder, delayOn, delayOff)
|
|
local nextState = table.remove(loopQueue, 1)
|
|
|
|
if nextState == nil then
|
|
return
|
|
end
|
|
|
|
if nextState then
|
|
switchOnLight(bundledOutput, colorsOrder, delayOn)
|
|
else
|
|
switchOffLight(bundledOutput, colorsOrder, delayOff)
|
|
end
|
|
|
|
return applyCommand(bundledOutput, loopQueue, colorsOrder, delayOn, delayOff)
|
|
end
|
|
|
|
local function createLoop(side, eventName, loopQueue, colorsOrder, delayOn, delayOff)
|
|
local bundledOutput = rs.createBundledOutput(side)
|
|
|
|
return function()
|
|
while true do
|
|
os.pullEvent(eventName)
|
|
applyCommand(bundledOutput, loopQueue, colorsOrder, delayOn, delayOff)
|
|
end
|
|
end
|
|
end
|
|
|
|
local function createRedstoneLoop(mainLoopQueue, secondaryLoopQueue)
|
|
local mainState = nil
|
|
local secondaryState = nil
|
|
|
|
return function()
|
|
while true do
|
|
local newMainState = redstone.getInput(MAIN_INPUT_SIDE)
|
|
local newSecondaryState = redstone.getInput(SECONDARY_INPUT_SIDE)
|
|
|
|
if mainState ~= newMainState then
|
|
mainState = newMainState
|
|
table.insert(mainLoopQueue, newMainState)
|
|
os.queueEvent('light_command_main', newMainState)
|
|
end
|
|
|
|
if secondaryState ~= newSecondaryState then
|
|
secondaryState = newSecondaryState
|
|
table.insert(secondaryLoopQueue, newSecondaryState)
|
|
os.queueEvent('light_command_secondary', newSecondaryState)
|
|
end
|
|
|
|
os.pullEvent('redstone')
|
|
end
|
|
end
|
|
end
|
|
|
|
local mainLoopQueue = {}
|
|
local secondaryLoopQueue = {}
|
|
|
|
local mainLoop = createLoop(MAIN_OUTPUT_SIDE, 'light_command_main', mainLoopQueue, getMainColorsOrder(), MAIN_DELAY_ON, MAIN_DELAY_OFF)
|
|
local secondaryLoop = createLoop(SECONDARY_OUTPUT_SIDE, 'light_command_secondary', secondaryLoopQueue, getSecondaryColorsOrder(), SECONDARY_DELAY_ON, SECONDARY_DELAY_OFF)
|
|
local redstoneLoop = createRedstoneLoop(mainLoopQueue, secondaryLoopQueue)
|
|
|
|
print('> Starting light server v' .. VERSION)
|
|
parallel.waitForAny(mainLoop, secondaryLoop, redstoneLoop) |