package tv.piratemedia.lightcontroler; import android.content.Context; import android.graphics.Color; import android.os.Handler; import android.util.Log; import java.io.IOException; import java.util.Map; import tv.piratemedia.lightcontroler.api.ControlProviders; import tv.piratemedia.lightcontroler.api.Provider; /** * Created by Eliot Stocker on 16/10/2016. */ public class MiiLightProvider { private UDPConnection UDPC; private Context context; private int lastOn = -1; public MiiLightProvider(Context c, Handler h) { UDPC = new UDPConnection(c, h); context = c; } private void onLightOn(int Zone, String Type) { byte[] messageBA = new byte[3]; if(Type.equals(ControlProviders.ZONE_TYPE_COLOR)) { switch (Zone) { case 0: messageBA[0] = 66; break; case 1: messageBA[0] = 69; break; case 2: messageBA[0] = 71; break; case 3: messageBA[0] = 73; break; case 4: messageBA[0] = 75; break; } } else if(Type.equals(ControlProviders.ZONE_TYPE_WHITE)) { switch(Zone) { case 0: messageBA[0] = 53; break; case 1: messageBA[0] = 56; break; case 2: messageBA[0] = 61; break; case 3: messageBA[0] = 55; break; case 4: messageBA[0] = 50; break; } } messageBA[1] = 0; messageBA[2] = 85; lastOn = Zone; try { UDPC.sendMessage(messageBA); } catch (IOException e) { e.printStackTrace(); //TODO: add alert to tell user we cant send command } try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } } private void onLightOff(int Zone, String Type) { byte[] messageBA = new byte[3]; if(Type.equals(ControlProviders.ZONE_TYPE_COLOR)) { switch (Zone) { case 0: messageBA[0] = 65; break; case 1: messageBA[0] = 70; break; case 2: messageBA[0] = 72; break; case 3: messageBA[0] = 74; break; case 4: messageBA[0] = 76; break; } } else if(Type.equals(ControlProviders.ZONE_TYPE_WHITE)) { switch (Zone) { case 0: messageBA[0] = 57; break; case 5: messageBA[0] = 59; break; case 6: messageBA[0] = 51; break; case 7: messageBA[0] = 58; break; case 8: messageBA[0] = 54; break; } } messageBA[1] = 0; messageBA[2] = 85; try { UDPC.sendMessage(messageBA); } catch (IOException e) { e.printStackTrace(); //TODO: add alert to tell user we cant send command } } public void onGlobalOn() { this.onLightOn(0, ControlProviders.ZONE_TYPE_COLOR); try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } this.onLightOn(0, ControlProviders.ZONE_TYPE_WHITE); } public void onGlobalOff() { this.onLightOff(0, ControlProviders.ZONE_TYPE_COLOR); try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } this.onLightOff(0, ControlProviders.ZONE_TYPE_WHITE); } private int[] values = {2,3,4,5,8,9,10,11,13,14,15,16,17,18,19,20,21,23,24,25}; public void onSetBrightness(String Type, int Zone, float Brightness) { int lz = (Type.equals(ControlProviders.ZONE_TYPE_WHITE) ? 5 : 0) + Zone; if(lastOn != lz) { this.onLightOn(Zone, Type); lastOn = lz; try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } } int val = Math.round(((float)(values.length - 1) * Brightness)); byte[] messageBA = new byte[3]; messageBA[0] = 78; messageBA[1] = (byte)(values[val]); messageBA[2] = 85; try { UDPC.sendMessage(messageBA); } catch (IOException e) { e.printStackTrace(); //add alert to tell user we cant send command } } public void onIncreaseBrightness(String Type, int Zone) { int lz = (Type.equals(ControlProviders.ZONE_TYPE_WHITE) ? 5 : 0) + Zone; if(lastOn != lz) { this.onLightOn(Zone, Type); lastOn = lz; try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } } byte[] messageBA = new byte[3]; messageBA[0] = 60; messageBA[1] = 0; messageBA[2] = 85; try { UDPC.sendMessage(messageBA); } catch (IOException e) { e.printStackTrace(); //TODO: add alert to tell user we cant send command } } public void onDecreaseBrightness(String Type, int Zone) { int lz = (Type.equals(ControlProviders.ZONE_TYPE_WHITE) ? 5 : 0) + Zone; if(lastOn != lz) { this.onLightOn(Zone, Type); lastOn = lz; try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } } byte[] messageBA = new byte[3]; messageBA[0] = 52; messageBA[1] = 0; messageBA[2] = 85; try { UDPC.sendMessage(messageBA); } catch (IOException e) { e.printStackTrace(); //TODO: add alert to tell user we cant send command } } public void onSetColor(int Zone, int color) { if(lastOn != Zone) { this.onLightOn(Zone, ControlProviders.ZONE_TYPE_COLOR); lastOn = Zone; try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } } float[] colors = new float[3]; Color.colorToHSV(color, colors); Float deg = (float) Math.toRadians(-colors[0]); Float dec = (deg/((float)Math.PI*2f))*255f; //rotation compensation dec = dec + 175; if(dec > 255) { dec = dec - 255; } byte[] messageBA = new byte[3]; messageBA[0] = 64; messageBA[1] = (byte)dec.intValue(); messageBA[2] = 85; try { UDPC.sendMessage(messageBA); } catch (IOException e) { e.printStackTrace(); //add alert to tell user we cant send command } } public void onSetTemperature(String Type, int Zone, float Temp) { //no needed here } public void onIncreaseTemperature(String Type, int Zone) { int lz = (Type.equals(ControlProviders.ZONE_TYPE_WHITE) ? 5 : 0) + Zone; if(lastOn != lz) { this.onLightOn(Zone, Type); lastOn = lz; try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } } byte[] messageBA = new byte[3]; messageBA[0] = 62; messageBA[1] = 0; messageBA[2] = 85; try { UDPC.sendMessage(messageBA); } catch (IOException e) { e.printStackTrace(); //add alert to tell user we cant send command } } public void onDecreaseTemperature(String Type, int Zone) { int lz = (Type.equals(ControlProviders.ZONE_TYPE_WHITE) ? 5 : 0) + Zone; if(lastOn != lz) { this.onLightOn(Zone, Type); lastOn = lz; try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } } byte[] messageBA = new byte[3]; messageBA[0] = 63; messageBA[1] = 0; messageBA[2] = 85; try { UDPC.sendMessage(messageBA); } catch (IOException e) { e.printStackTrace(); //add alert to tell user we cant send command } } public void onSetNight(String Type, int Zone) { this.onLightOn(Zone, Type); try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } byte[] messageBA = new byte[3]; if(Type.equals(ControlProviders.ZONE_TYPE_WHITE)) { switch (Zone) { case 0: messageBA[0] = (byte) 185; break; case 1: messageBA[0] = (byte) 187; break; case 2: messageBA[0] = (byte) 179; break; case 3: messageBA[0] = (byte) 186; break; case 4: messageBA[0] = (byte) 182; break; } } else { switch (Zone) { case 0: messageBA[0] = (byte) 193; break; case 1: messageBA[0] = (byte) 198; break; case 2: messageBA[0] = (byte) 200; break; case 3: messageBA[0] = (byte) 202; break; case 4: messageBA[0] = (byte) 204; break; } } messageBA[1] = 0; messageBA[2] = 85; try { UDPC.sendMessage(messageBA); } catch (IOException e) { e.printStackTrace(); //add alert to tell user we cant send command } } public void onSetFull(String Type, int Zone) { this.onLightOn(Zone, Type); try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } byte[] messageBA = new byte[3]; switch(Zone) { case 0: messageBA[0] = (byte)181; break; case 1: messageBA[0] = (byte)184; break; case 2: messageBA[0] = (byte)189; break; case 3: messageBA[0] = (byte)183; break; case 4: messageBA[0] = (byte)178; break; } messageBA[1] = 0; messageBA[2] = 85; try { UDPC.sendMessage(messageBA); } catch (IOException e) { e.printStackTrace(); //add alert to tell user we cant send command } } public void onSetWhite(int Zone) { byte[] messageBA = new byte[3]; switch(Zone) { case 0: messageBA[0] = (byte)194; break; case 1: messageBA[0] = (byte)197; break; case 2: messageBA[0] = (byte)199; break; case 3: messageBA[0] = (byte)201; break; case 4: messageBA[0] = (byte)203; break; } messageBA[1] = 0; messageBA[2] = 85; try { UDPC.sendMessage(messageBA); } catch (IOException e) { e.printStackTrace(); //TODO: add alert to tell user we cant send command } } public void sendCommand(String action) { sendCommand(action, null, -1, null); } public void sendCommand(String action, String Type, int Zone) { sendCommand(action, Type, Zone, null); } public void sendCommand(String action, String Type, int Zone, Map<String, Object> data) { //should run command async here switch(action) { case "LightOn": this.onLightOn(Zone, Type); break; case "LightOff": this.onLightOff(Zone, Type); break; case "GlobalOn": this.onGlobalOn(); break; case "GlobalOff": this.onGlobalOff(); break; case "Brightness": this.onSetBrightness(Type, Zone, (float)data.get("value")); break; case "IncreaseBrightness": this.onIncreaseBrightness(Type, Zone); break; case "DecreaseBrightness": this.onDecreaseBrightness(Type, Zone); break; case "LightColor": this.onSetColor(Zone, (int)data.get("value")); break; case "Temperature": this.onSetTemperature(Type, Zone, (float)data.get("value")); break; case "IncreaseTemperature": this.onIncreaseTemperature(Type, Zone); break; case "DecreaseTemperature": this.onDecreaseTemperature(Type, Zone); break; case "LightNight": this.onSetNight(Type, Zone); break; case "LightFull": this.onSetFull(Type, Zone); break; case "LightWhite": this.onSetWhite(Zone); break; } } }