diff --git a/pulsetunnel.lua b/pulsetunnel.lua index b2b1ccd..a8e1440 100644 --- a/pulsetunnel.lua +++ b/pulsetunnel.lua @@ -13,10 +13,21 @@ red = {} green = {} blue = {} +tmpRed = {} +tmpGreen = {} +tmpBlue = {} + +function weighted_avg(array, centerIndex) + return 0.2 * array[centerIndex - 1] + + 0.6 * array[centerIndex] + + 0.2 * array[centerIndex + 1] +end + function periodic() local redEnergy = get_energy_in_band(0, 400); local greenEnergy = get_energy_in_band(400, 4000); local blueEnergy = get_energy_in_band(4000, 22000); + local centerIndex = 2 * center_module; maxRedEnergy = maxRedEnergy * COOLDOWN_FACTOR if redEnergy > maxRedEnergy then @@ -34,22 +45,28 @@ function periodic() end -- move the color buffers on by one in each direction - for i = 2,center_module,1 do - red[i-1] = red[i] - green[i-1] = green[i] - blue[i-1] = blue[i] + for i = 2,centerIndex,1 do + tmpRed[i-1] = tmpRed[i] + tmpGreen[i-1] = tmpGreen[i] + tmpBlue[i-1] = tmpBlue[i] end - for i = num_modules-1,center_module,-1 do - red[i+1] = red[i] - green[i+1] = green[i] - blue[i+1] = blue[i] + for i = #tmpRed-1,centerIndex,-1 do + tmpRed[i+1] = tmpRed[i] + tmpGreen[i+1] = tmpGreen[i] + tmpBlue[i+1] = tmpBlue[i] end -- set the new value for the center module - red[center_module] = redEnergy / maxRedEnergy - green[center_module] = greenEnergy / maxGreenEnergy - blue[center_module] = blueEnergy / maxBlueEnergy + tmpRed[centerIndex] = redEnergy / maxRedEnergy + tmpGreen[centerIndex] = greenEnergy / maxGreenEnergy + tmpBlue[centerIndex] = blueEnergy / maxBlueEnergy + + for i = 1,num_modules do + red[i] = weighted_avg(tmpRed, 2*i) + green[i] = weighted_avg(tmpGreen, 2*i) + blue[i] = weighted_avg(tmpBlue, 2*i) + end -- return the 3 color arrays return red, green, blue @@ -65,6 +82,12 @@ function init(nmod, cmod) blue[i] = 0 end + for i = 1,2*(nmod+1) do + tmpRed[i] = 0 + tmpGreen[i] = 0 + tmpBlue[i] = 0 + end + -- don't use fading return 0 end