68 lines
No EOL
2.3 KiB
Lua
Executable file
68 lines
No EOL
2.3 KiB
Lua
Executable file
local function init()
|
|
colorChangeTime = getTime() -- Initialize time
|
|
phase = 0
|
|
currentLed = 0 -- Current lit LED position
|
|
scroll_oldtime = getTime() -- Initialize scroll_oldtime
|
|
scroll_cycle = 0 -- Initialize scroll_cycle
|
|
end
|
|
|
|
-- Function to generate smooth cyclic colors
|
|
local function getColor(phase, length)
|
|
local position = (phase % length) / length
|
|
local r, g, b = 0, 0, 0
|
|
local maxBrightness = 255 -- Maximum brightness value
|
|
|
|
-- RGB color transition: red -> green -> blue -> red
|
|
if position < 1/3 then
|
|
-- From red to green
|
|
r = maxBrightness * (1 - 3 * position)
|
|
g = maxBrightness * (3 * position)
|
|
elseif position < 2/3 then
|
|
-- From green to blue
|
|
position = position - 1/3
|
|
g = maxBrightness * (1 - 3 * position)
|
|
b = maxBrightness * (3 * position)
|
|
else
|
|
-- From blue to red
|
|
position = position - 2/3
|
|
b = maxBrightness * (1 - 3 * position)
|
|
r = maxBrightness * (3 * position)
|
|
end
|
|
|
|
-- Skip colors that are close to the background color
|
|
local bg_r, bg_g, bg_b = 72, 0, 72 -- Background color
|
|
local threshold = 30 -- Color difference threshold
|
|
if math.abs(r - bg_r) < threshold and math.abs(g - bg_g) < threshold and math.abs(b - bg_b) < threshold then
|
|
return getColor((phase + 1) % length, length) -- Skip this color and get the next one
|
|
end
|
|
|
|
return r, g, b
|
|
end
|
|
|
|
local colorPhase = 0 -- Initialize color phase
|
|
|
|
local function run()
|
|
for i=LED_STRIP_LENGTH - 1, 0, -1 do -- Reverse iteration
|
|
if (i == scroll_cycle) then
|
|
local r, g, b = getColor(colorPhase, 255)
|
|
setRGBLedColor(i, r, g, b)
|
|
else
|
|
setRGBLedColor(i, 72, 0, 72)
|
|
end
|
|
end
|
|
if ((getTime() - scroll_oldtime) > 8) then
|
|
scroll_oldtime = getTime()
|
|
scroll_cycle = scroll_cycle - 1 -- Decrement scroll_cycle
|
|
if (scroll_cycle < 0) then
|
|
scroll_cycle = LED_STRIP_LENGTH - 1 -- Reset scroll_cycle to the end of the strip
|
|
end
|
|
end
|
|
colorPhase = (colorPhase + 1) % 255 -- Update color phase
|
|
applyRGBLedColors()
|
|
end
|
|
|
|
local function background()
|
|
-- Called periodically while the Special Function switch is off
|
|
end
|
|
|
|
return { run=run, background=background, init=init } |