package com.kuxhausen.huemore.net.hue; import android.content.Context; import android.os.SystemClock; import com.kuxhausen.huemore.net.NetworkBulb; import com.kuxhausen.huemore.net.hue.api.BulbAttributes; import com.kuxhausen.huemore.net.hue.api.NetworkMethods; import com.kuxhausen.huemore.state.BulbState; import com.kuxhausen.huemore.utils.DeferredLog; public class HueBulb implements NetworkBulb { public static final long SEND_TIMEOUT_TIME = 2000; public final static float BS_BRI_CONVERSION = 2.55f; private Long mBaseId; private String mName; /** * for now this is just bulbNumber * */ private String mDeviceId; private HueBulbData mData; private Context mContext; private HubConnection mConnection; private BulbState desiredState = new BulbState(); //using SystemClock.elapsedTimes public Long lastSendInitiatedTime; public BulbState confirmed = new BulbState(); private Integer mMaxBri; // TODO chance once a better Device Id implemented public String getHubBulbNumber() { return mDeviceId; } public HueBulb(Context c, Long bulbBaseId, String bulbName, String bulbDeviceId, HueBulbData bulbData, HubConnection hubConnection) { mContext = c; mBaseId = bulbBaseId; mName = bulbName; mDeviceId = bulbDeviceId; mData = bulbData; mConnection = hubConnection; } @Override public void setState(BulbState target) { this.mConnection.updateDesiredLastChanged(); BulbState reachableTarget = HueUtils.toReachableState(mData, target); desiredState.merge(reachableTarget); mConnection.getLooper().queueSendState(this); //TODO move or limit to actual state changes this.mConnection.getDeviceManager().onStateChanged(); if(DeferredLog.isLoggable()) { DeferredLog.i("setState", reachableTarget.toString()); } } @Override public BulbState getState(GetStateConfidence confidence) { BulbState result = new BulbState(); switch (confidence) { case GUESS: BulbState guess = new BulbState(); guess.setPercentBri(50); guess.setOn(true); guess.setAlert(BulbState.Alert.NONE); guess.setEffect(BulbState.Effect.NONE); guess.setMiredCT(300); guess.setTransitionTime(BulbState.TRANSITION_TIME_DEFAULT); result = BulbState.merge(guess, result); case KNOWN: result = BulbState.merge(confirmed, result); case DESIRED: result = BulbState.merge(desiredState, result); } return result; } public void confirm(BulbState transmitted) { // remove successful changes from pending lastSendInitiatedTime = null; DeferredLog.d("net.hue.bulb.confirm", "unconfirmedDesired %s", desiredState); // recalculate any remaining desired state //desiredState = transmitted.delta(desiredState); // update confirmed BulbState.confirmChange(confirmed, transmitted); BulbState.confirmChange(desiredState, transmitted); //desiredState = confirmed.delta(desiredState); DeferredLog.d("net.hue.bulb.confirm", "confirmedDesired %s", desiredState); } public void attributesReturned(BulbAttributes attributes) { if (attributes == null || attributes.state == null) { return; } //these may be stale by up to 4 seconds, but lets set them to the confirmed for now //TODO better handle //for now only touch brightness since that's atleast user visible confirmed.set255Bri(attributes.state.get255Bri()); if (desiredState.get255Bri() == null) { desiredState.set255Bri(attributes.state.get255Bri()); //notify brightness bar this.mConnection.getDeviceManager().onStateChanged(); DeferredLog.d("net.hue.bulb.attribute", "onAttributeReturned with bri: %d", desiredState.get255Bri()); } } public boolean hasOngoingTransmission() { return (lastSendInitiatedTime != null) && (SystemClock.elapsedRealtime() - lastSendInitiatedTime < SEND_TIMEOUT_TIME); } public boolean hasPendingTransmission() { return (getSendState() != null && !getSendState().isEmpty()); } /** * returns desiredState */ public BulbState getSendState() { BulbState toSend = confirmed.delta(desiredState); return toSend; } @Override public String getName() { return mName; } @Override public void rename(String name) { BulbAttributes bAttrs = new BulbAttributes(); bAttrs.name = name; for (Route route : mConnection.getBestRoutes()) { NetworkMethods.setBulbAttributes(route, mConnection.mData.hashedUsername, mContext, mConnection.getRequestQueue(), mConnection, Integer.parseInt(mDeviceId), bAttrs); } } @Override public Long getBaseId() { return mBaseId; } @Override public ConnectivityState getConnectivityState() { return mConnection.getConnectivityState(); } public HueBulbData getData() { return mData; } }