package org.cowboycoders.ant.sensors; import java.util.Timer; import java.util.TimerTask; /** * Aggregates sensor data based on precedence * Created by fluxoid on 22/12/15. */ public class DataSourceCombiner { private final HeartRateListener listener; private final int timeout; private Timer timer; /** * between 0-100 inclusive */ private volatile int precedence = 100; /** * @param merged updated with latest value from source with lowest precedence * @param timeoutMillis timeout until precedence resets */ public DataSourceCombiner(HeartRateListener merged, int timeoutMillis) { this.listener = merged; this.timeout = timeoutMillis; this.timer = new Timer(true); } /** * Poll with latest values * * @param value latest sensor data * @param precedence 0-100 inclusive; lower numbers have higher precedence (i.e are more * believable) */ public void update(int value, int precedence) { if (precedence < 0 || precedence > 100) { throw new IllegalArgumentException("precedence out of range"); } if (this.precedence < precedence) return; timer.cancel(); this.timer = new Timer(true); timer.schedule( new TimerTask() { @Override public void run() { DataSourceCombiner.this.precedence = 100; } }, timeout); this.precedence = precedence; listener.onValueChange(value); } }