package hueimmersive; import java.awt.Color; import java.util.Timer; import java.util.TimerTask; public class Control { public static boolean immersiveProcessIsActive = false; private Timer captureLoop; private int transitionTime = 5; private float lastAutoOffBri = 0f; public Control() throws Exception { HBridge.setup(); if (Main.arguments.contains("force-on") && !Main.arguments.contains("force-off")) { turnAllLightsOn(); } if (Main.arguments.contains("force-off") && !Main.arguments.contains("force-on")) { turnAllLightsOff(); } if (Main.arguments.contains("force-start")) { startImmersiveProcess(); } } public void setLight(HLight light, Color color) throws Exception // calculate color and send it to light { float[] colorHSB = Color.RGBtoHSB(color.getRed(), color.getGreen(), color.getBlue(), null); // unmodified HSB color color = Color.getHSBColor(colorHSB[0], Math.max(0f, Math.min(1f, colorHSB[1] * (Main.ui.slider_Saturation.getValue() / 100f))), (float)(colorHSB[2] * (Main.ui.slider_Brightness.getValue() / 100f) * (Settings.Light.getBrightness(light) / 100f))); // modified color double[] xy = HColor.translate(color, Settings.getBoolean("gammacorrection")); // xy color int bri = Math.round(Color.RGBtoHSB(color.getRed(), color.getGreen(), color.getBlue(), null)[2] * 255); // brightness String APIurl = "http://" + HBridge.internalipaddress + "/api/" + HBridge.username + "/lights/" + light.id + "/state"; String data = "{\"xy\":[" + xy[0] + ", " + xy[1] + "], \"bri\":" + bri + ", \"transitiontime\":" + transitionTime + "}"; // turn light off automatically if the brightness is very low if (Settings.getBoolean("autoswitch")) { if (colorHSB[2] > lastAutoOffBri + 0.1f && light.isOn() == false) { data = "{\"on\":true, \"xy\":[" + xy[0] + ", " + xy[1] + "], \"bri\":" + bri + ", \"transitiontime\":" + transitionTime + "}"; } else if (colorHSB[2] <= 0.0627451f && light.isOn() == true) { data = "{\"on\":false, \"transitiontime\":3}"; lastAutoOffBri = colorHSB[2]; } } else if (Settings.getBoolean("autoswitch") == false && light.isOn() == false) { data = "{\"on\":true, \"xy\":[" + xy[0] + ", " + xy[1] + "], \"bri\":" + bri + ", \"transitiontime\":" + transitionTime + "}"; } HRequest.PUT(APIurl, data); } public void startImmersiveProcess() throws Exception { Main.ui.button_Off.setEnabled(false); Main.ui.button_On.setEnabled(false); Main.ui.button_Stop.setEnabled(true); Main.ui.button_Start.setEnabled(false); Main.ui.button_Once.setEnabled(false); immersiveProcessIsActive = true; for(HLight light : HBridge.lights) { light.storeLightColor(); } // create a loop to execute the immersive process captureLoop = new Timer(); TimerTask task = new TimerTask() { public void run() { try { ImmersiveProcess.execute(); } catch (Exception e) { Debug.exception(e); } } }; captureLoop.scheduleAtFixedRate(task, 0, Math.round(transitionTime * 100 * 0.68)); } public void stopImmersiveProcess() throws Exception { captureLoop.cancel(); captureLoop.purge(); immersiveProcessIsActive = false; Main.ui.setupOnOffButton(); Main.ui.button_Stop.setEnabled(false); Main.ui.button_Start.setEnabled(true); Main.ui.button_Once.setEnabled(true); Thread.sleep(250); ImmersiveProcess.setStandbyOutput(); if (Settings.getBoolean("restorelight")) { Thread.sleep(750); for(HLight light : HBridge.lights) { light.restoreLightColor(); } } } public void onceImmersiveProcess() throws Exception { Main.ui.button_Stop.setEnabled(false); Main.ui.button_Start.setEnabled(true); Main.ui.button_Once.setEnabled(true); ImmersiveProcess.execute(); } public void turnAllLightsOn() throws Exception { for(HLight light : HBridge.lights) { if (Settings.Light.getActive(light)) { light.turnOn(); } } Main.ui.setupOnOffButton(); } public void turnAllLightsOff() throws Exception { for(HLight light : HBridge.lights) { if (Settings.Light.getActive(light)) { light.turnOff(); } } Main.ui.setupOnOffButton(); } }