Introduce a hysteresis for outdoor condition determination.

Avoids flicker when brightness is around the threshold.

Change-Id: I8658725450496b89123abb26b6ef8ce333c709e5
This commit is contained in:
Danny Baumann 2016-08-02 09:26:49 +02:00 committed by Steve Kondik
parent d62a53f690
commit c0dd46d30f
4 changed files with 13 additions and 3 deletions

View File

@ -38,6 +38,7 @@ public class AmbientLuxObserver {
private final SensorManager mSensorManager; private final SensorManager mSensorManager;
private final float mThresholdLux; private final float mThresholdLux;
private final float mHysteresisLux;
private final int mThresholdDuration; private final int mThresholdDuration;
private boolean mLightSensorEnabled = false; private boolean mLightSensorEnabled = false;
@ -61,9 +62,10 @@ public class AmbientLuxObserver {
} }
public AmbientLuxObserver(Context context, Looper looper, public AmbientLuxObserver(Context context, Looper looper,
float thresholdLux, int thresholdDuration) { float thresholdLux, float hysteresisLux, int thresholdDuration) {
mLuxHandler = new AmbientLuxHandler(looper); mLuxHandler = new AmbientLuxHandler(looper);
mThresholdLux = thresholdLux; mThresholdLux = thresholdLux;
mHysteresisLux = hysteresisLux;
mThresholdDuration = thresholdDuration; mThresholdDuration = thresholdDuration;
mRingBuffer = new TimedMovingAverageRingBuffer(thresholdDuration); mRingBuffer = new TimedMovingAverageRingBuffer(thresholdDuration);
@ -103,7 +105,9 @@ public class AmbientLuxObserver {
" mAmbientLux=" + mAmbientLux); " mAmbientLux=" + mAmbientLux);
} }
direction = mAmbientLux >= mThresholdLux ? HIGH : LOW; final float threshold = mState == HIGH
? mThresholdLux - mHysteresisLux : mThresholdLux;
direction = mAmbientLux >= threshold ? HIGH : LOW;
if (mState != direction) { if (mState != direction) {
mState = direction; mState = direction;
if (mCallback != null) { if (mCallback != null) {

View File

@ -40,6 +40,7 @@ public class OutdoorModeController extends LiveDisplayFeature {
// default values // default values
private final int mDefaultOutdoorLux; private final int mDefaultOutdoorLux;
private final int mOutdoorLuxHysteresis;
private final boolean mDefaultAutoOutdoorMode; private final boolean mDefaultAutoOutdoorMode;
private final boolean mSelfManaged; private final boolean mSelfManaged;
@ -59,6 +60,8 @@ public class OutdoorModeController extends LiveDisplayFeature {
mDefaultOutdoorLux = mContext.getResources().getInteger( mDefaultOutdoorLux = mContext.getResources().getInteger(
org.cyanogenmod.platform.internal.R.integer.config_outdoorAmbientLux); org.cyanogenmod.platform.internal.R.integer.config_outdoorAmbientLux);
mOutdoorLuxHysteresis = mContext.getResources().getInteger(
org.cyanogenmod.platform.internal.R.integer.config_outdoorAmbientLuxHysteresis);
mDefaultAutoOutdoorMode = mContext.getResources().getBoolean( mDefaultAutoOutdoorMode = mContext.getResources().getBoolean(
org.cyanogenmod.platform.internal.R.bool.config_defaultAutoOutdoorMode); org.cyanogenmod.platform.internal.R.bool.config_defaultAutoOutdoorMode);
} }
@ -71,7 +74,7 @@ public class OutdoorModeController extends LiveDisplayFeature {
if (!mSelfManaged) { if (!mSelfManaged) {
mLuxObserver = new AmbientLuxObserver(mContext, mHandler.getLooper(), mLuxObserver = new AmbientLuxObserver(mContext, mHandler.getLooper(),
mDefaultOutdoorLux, SENSOR_WINDOW_MS); mDefaultOutdoorLux, mOutdoorLuxHysteresis, SENSOR_WINDOW_MS);
} }
registerSettings( registerSettings(
@ -128,6 +131,7 @@ public class OutdoorModeController extends LiveDisplayFeature {
pw.println(" mSelfManaged=" + mSelfManaged); pw.println(" mSelfManaged=" + mSelfManaged);
if (!mSelfManaged) { if (!mSelfManaged) {
pw.println(" mDefaultOutdoorLux=" + mDefaultOutdoorLux); pw.println(" mDefaultOutdoorLux=" + mDefaultOutdoorLux);
pw.println(" mOutdoorLuxHysteresis=" + mOutdoorLuxHysteresis);
pw.println(); pw.println();
pw.println(" OutdoorModeController State:"); pw.println(" OutdoorModeController State:");
pw.println(" mAutoOutdoorMode=" + isAutomaticOutdoorModeEnabled()); pw.println(" mAutoOutdoorMode=" + isAutomaticOutdoorModeEnabled());

View File

@ -55,6 +55,7 @@
<integer name="config_dayColorTemperature">6500</integer> <integer name="config_dayColorTemperature">6500</integer>
<integer name="config_nightColorTemperature">4800</integer> <integer name="config_nightColorTemperature">4800</integer>
<integer name="config_outdoorAmbientLux">12000</integer> <integer name="config_outdoorAmbientLux">12000</integer>
<integer name="config_outdoorAmbientLuxHysteresis">1500</integer>
<integer name="config_defaultLiveDisplayMode">2</integer> <integer name="config_defaultLiveDisplayMode">2</integer>
<!-- These values should map to the true min and max <!-- These values should map to the true min and max

View File

@ -72,6 +72,7 @@
<java-symbol type="integer" name="config_dayColorTemperature" /> <java-symbol type="integer" name="config_dayColorTemperature" />
<java-symbol type="integer" name="config_nightColorTemperature" /> <java-symbol type="integer" name="config_nightColorTemperature" />
<java-symbol type="integer" name="config_outdoorAmbientLux" /> <java-symbol type="integer" name="config_outdoorAmbientLux" />
<java-symbol type="integer" name="config_outdoorAmbientLuxHysteresis" />
<java-symbol type="integer" name="config_defaultLiveDisplayMode" /> <java-symbol type="integer" name="config_defaultLiveDisplayMode" />
<java-symbol type="integer" name="config_minColorTemperature" /> <java-symbol type="integer" name="config_minColorTemperature" />
<java-symbol type="integer" name="config_maxColorTemperature" /> <java-symbol type="integer" name="config_maxColorTemperature" />