diff --git a/light-server.lua b/light-server.lua index 2c8e83e..85e38ad 100644 --- a/light-server.lua +++ b/light-server.lua @@ -11,7 +11,7 @@ local MAIN_OUTPUT_SIDE = 'left' local SECONDARY_INPUT_SIDE = 'back' local SECONDARY_OUTPUT_SIDE = 'front' -local VERSION = '1.0.1' +local VERSION = '1.0.2' local function getMainColorsOrder() return { @@ -67,50 +67,61 @@ local function switchOffLight(bundledOutput, colorsOrder, sleepTime) end local mainLoopQueue = {} +local secondaryLoopQueue = {} + +local function applyMainCommand(bundledOutput) + local nextState = table.remove(mainLoopQueue, 1) + + if nextState == nil then + return + end -local function applyMainCommand(bundledOutput, lightIsOn) local mainColorsOrder = getMainColorsOrder() - if lightIsOn then + if nextState then switchOnLight(bundledOutput, mainColorsOrder, MAIN_DELAY_ON) else switchOffLight(bundledOutput, mainColorsOrder, MAIN_DELAY_OFF) end + + return applyMainCommand(bundledOutput) end -local function applySecondaryCommand(bundledOutput, lightIsOn) +local function applySecondaryCommand(bundledOutput) + local nextState = table.remove(secondaryLoopQueue, 1) + + if nextState == nil then + return + end + local secondaryColorsOrder = getSecondaryColorsOrder() - if lightIsOn then + if nextState then switchOnLight(bundledOutput, secondaryColorsOrder, SECONDARY_DELAY_ON) else switchOffLight(bundledOutput, secondaryColorsOrder, SECONDARY_DELAY_OFF) end + + return applySecondaryCommand(bundledOutput) end local function mainLoop() local mainOutput = rs.createBundledOutput(MAIN_OUTPUT_SIDE) + + while true do + os.pullEvent('light_command_main') + table.remove(mainLoopQueue, 1) + applyMainCommand(mainOutput) + end +end + +local function secondaryLoop() local secondaryOutput = rs.createBundledOutput(SECONDARY_OUTPUT_SIDE) while true do - local _, typeOfRoom, lightIsOn = os.pullEvent('light_command') - table.remove(mainLoopQueue, 1) - - if typeOfRoom == 'main' then - applyMainCommand(mainOutput, lightIsOn) - elseif typeOfRoom == 'secondary' then - applySecondaryCommand(secondaryOutput, lightIsOn) - else - error('unknown type of room "' .. tostring(typeOfRoom) .. '"', 0) - end - - local event = table.remove(mainLoopQueue, 1) - - if event and event.typeOfRoom == 'main' then - applyMainCommand(mainOutput, event.lightIsOn) - elseif event and event.typeOfRoom == 'secondary' then - applySecondaryCommand(secondaryOutput, event.lightIsOn) - end + os.pullEvent('light_command_secondary') + table.remove(secondaryLoopQueue, 1) + applySecondaryCommand(secondaryOutput) end end @@ -125,13 +136,13 @@ local function redstoneLoop() if mainState ~= newMainState then mainState = newMainState table.insert(mainLoopQueue, { typeOfRoom = 'main', lightIsOn = newMainState }) - os.queueEvent('light_command', 'main', newMainState) + os.queueEvent('light_command_main', newMainState) end if secondaryState ~= newSecondaryState then secondaryState = newSecondaryState table.insert(mainLoopQueue, { typeOfRoom = 'secondary', lightIsOn = newSecondaryState }) - os.queueEvent('light_command', 'secondary', newSecondaryState) + os.queueEvent('light_command_secondary', newSecondaryState) end os.pullEvent('redstone') @@ -139,4 +150,4 @@ local function redstoneLoop() end print('> Starting light server v' .. VERSION) -parallel.waitForAny(mainLoop, redstoneLoop) \ No newline at end of file +parallel.waitForAny(mainLoop, secondaryLoop, redstoneLoop) \ No newline at end of file