fix(light-server): add mainLoopQueue

and try to process events after the animation execution
This commit is contained in:
Guillaume ARM 2024-05-28 01:22:44 +02:00
parent c00d495460
commit ee8a5da868

View File

@ -11,7 +11,7 @@ local MAIN_OUTPUT_SIDE = 'left'
local SECONDARY_INPUT_SIDE = 'back' local SECONDARY_INPUT_SIDE = 'back'
local SECONDARY_OUTPUT_SIDE = 'front' local SECONDARY_OUTPUT_SIDE = 'front'
local VERSION = '1.0.0' local VERSION = '1.0.1'
local function getMainColorsOrder() local function getMainColorsOrder()
return { return {
@ -66,31 +66,51 @@ local function switchOffLight(bundledOutput, colorsOrder, sleepTime)
end end
end end
local mainLoopQueue = {}
local function applyMainCommand(bundledOutput, lightIsOn)
local mainColorsOrder = getMainColorsOrder()
if lightIsOn then
switchOnLight(bundledOutput, mainColorsOrder, MAIN_DELAY_ON)
else
switchOffLight(bundledOutput, mainColorsOrder, MAIN_DELAY_OFF)
end
end
local function applySecondaryCommand(bundledOutput, lightIsOn)
local secondaryColorsOrder = getSecondaryColorsOrder()
if lightIsOn then
switchOnLight(bundledOutput, secondaryColorsOrder, SECONDARY_DELAY_ON)
else
switchOffLight(bundledOutput, secondaryColorsOrder, SECONDARY_DELAY_OFF)
end
end
local function mainLoop() local function mainLoop()
local mainOutput = rs.createBundledOutput(MAIN_OUTPUT_SIDE) local mainOutput = rs.createBundledOutput(MAIN_OUTPUT_SIDE)
local secondaryOutput = rs.createBundledOutput(SECONDARY_OUTPUT_SIDE) local secondaryOutput = rs.createBundledOutput(SECONDARY_OUTPUT_SIDE)
local mainColorsOrder = getMainColorsOrder()
local secondaryColorsOrder = getSecondaryColorsOrder()
while true do while true do
local _, typeOfRoom, lightIsOn = os.pullEvent('light_command') local _, typeOfRoom, lightIsOn = os.pullEvent('light_command')
table.remove(mainLoopQueue, 1)
if typeOfRoom == 'main' then if typeOfRoom == 'main' then
if lightIsOn then applyMainCommand(mainOutput, lightIsOn)
switchOnLight(mainOutput, mainColorsOrder, MAIN_DELAY_ON)
else
switchOffLight(mainOutput, mainColorsOrder, MAIN_DELAY_OFF)
end
elseif typeOfRoom == 'secondary' then elseif typeOfRoom == 'secondary' then
if lightIsOn then applySecondaryCommand(mainOutput, lightIsOn)
switchOnLight(secondaryOutput, secondaryColorsOrder, SECONDARY_DELAY_ON)
else
switchOffLight(secondaryOutput, secondaryColorsOrder, SECONDARY_DELAY_OFF)
end
else else
error('unknown type of room "' .. tostring(typeOfRoom) .. '"', 0) error('unknown type of room "' .. tostring(typeOfRoom) .. '"', 0)
end 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
end end
end end
@ -104,11 +124,13 @@ local function redstoneLoop()
if mainState ~= newMainState then if mainState ~= newMainState then
mainState = newMainState mainState = newMainState
table.insert(mainLoopQueue, { typeOfRoom = 'main', lightIsOn = newMainState })
os.queueEvent('light_command', 'main', newMainState) os.queueEvent('light_command', 'main', newMainState)
end end
if secondaryState ~= newSecondaryState then if secondaryState ~= newSecondaryState then
secondaryState = newSecondaryState secondaryState = newSecondaryState
table.insert(mainLoopQueue, { typeOfRoom = 'secondary', lightIsOn = newSecondaryState })
os.queueEvent('light_command', 'secondary', newSecondaryState) os.queueEvent('light_command', 'secondary', newSecondaryState)
end end