1 package kernel.models.variables;
9 import org.jetbrains.annotations.Contract;
10 import org.slf4j.Logger;
11 import org.slf4j.LoggerFactory;
13 import java.io.IOException;
14 import java.time.Duration;
32 private final List<Voltage> voltages =
new LinkedList<>();
38 private volatile Boolean isThreadAlive = Boolean.FALSE;
43 private volatile Integer numberOfDataPoints = 10;
49 private volatile Duration pollingInterval = Duration.ofMillis(1000);
54 private final Set<VariableChangeEventListener<Voltage>> listeners =
new 63 this.powerSupply = powerSupply;
64 isThreadAlive = Boolean.TRUE;
65 kernel.getTaskRunner().execute(
new VoltagePollingTask());
98 return numberOfDataPoints;
106 this.numberOfDataPoints = numberOfDataPoints;
117 if (interval.isNegative()){
120 pollingInterval = interval;
128 return pollingInterval.multipliedBy(numberOfDataPoints);
136 return this.pollingInterval;
146 listeners.remove(listener);
157 listeners.add(listener);
163 private class VoltagePollingTask
implements Runnable {
169 private final Logger log = LoggerFactory.getLogger
170 (VoltagePollingTask.class);
177 while (isThreadAlive){
178 Double voltage = getVoltage();
179 Voltage dataPoint = makeDataPoint(voltage);
180 voltages.add(dataPoint);
181 updateListeners(dataPoint);
182 checkVoltageListSize();
183 waitForPollingInterval();
191 private Double getVoltage(){
196 isThreadAlive = Boolean.TRUE;
197 }
catch (IOException error){
198 handleIOException(error);
199 voltage = voltages.get(0).getValue();
211 private void handleIOException(IOException error){
212 log.warn(
"Attempting to get measured voltage returned error {}",
215 isThreadAlive = Boolean.FALSE;
224 @Contract(
"_ -> !null")
225 private Voltage makeDataPoint(Double measuredVoltage){
234 private void updateListeners(
Voltage dataPoint){
236 listener.onChange(dataPoint);
244 private void checkVoltageListSize(){
245 if (voltages.size() > numberOfDataPoints){
246 removeTailOfHistory();
253 private void removeTailOfHistory(){
254 log.debug(
"Detected more voltages than allowed data points, " +
255 "removing last element");
264 private void waitForPollingInterval(){
266 Thread.sleep(pollingInterval.toMillis());
267 }
catch (InterruptedException error){
268 log.debug(
"Voltage polling task interrupted");
269 isThreadAlive = Boolean.FALSE;
void setNumberOfDataPoints(Integer numberOfDataPoints)
Duration getLengthOfHistory()
List< Voltage > getValues()
void addOnChangeListener(VariableChangeEventListener< Voltage > listener)
void setPollingInterval(Duration interval)
Duration getPollingInterval()
void removeOnChangeListener(VariableChangeEventListener< Voltage > listener)
Double getMeasuredVoltage()
Boolean isProvidingVariables()
VoltageProvider(PowerSupply powerSupply, Kernel kernel)
Integer getNumberOfDataPoints()