BakeoutController-Basic  0.1
A Controller for the Omicron vacuum chamber
models/variables/VoltageProvider.java
1 package kernel.models.variables;
2 
3 import devices.PowerSupply;
5 import kernel.Kernel;
9 import org.jetbrains.annotations.Contract;
10 import org.slf4j.Logger;
11 import org.slf4j.LoggerFactory;
12 
13 import java.io.IOException;
14 import java.time.Duration;
15 import java.util.*;
16 
21 public class VoltageProvider implements kernel.views.variables.VoltageProvider
22 {
23 
27  private PowerSupply powerSupply;
28 
32  private final List<Voltage> voltages = new LinkedList<>();
33 
38  private volatile Boolean isThreadAlive = Boolean.FALSE;
39 
43  private volatile Integer numberOfDataPoints = 10;
44 
49  private volatile Duration pollingInterval = Duration.ofMillis(1000);
50 
54  private final Set<VariableChangeEventListener<Voltage>> listeners = new
55  HashSet<>();
56 
62  public VoltageProvider(PowerSupply powerSupply, Kernel kernel){
63  this.powerSupply = powerSupply;
64  isThreadAlive = Boolean.TRUE;
65  kernel.getTaskRunner().execute(new VoltagePollingTask());
66  }
67 
71  @Override
72  public List<Voltage> getValues(){
73  return voltages;
74  }
75 
80  @Override
81  public Boolean isProvidingVariables(){
82  return isThreadAlive;
83  }
84 
88  @Override
89  public void clearHistory(){
90  voltages.clear();
91  }
92 
96  @Override
97  public Integer getNumberOfDataPoints(){
98  return numberOfDataPoints;
99  }
100 
104  @Override
105  public void setNumberOfDataPoints(Integer numberOfDataPoints){
106  this.numberOfDataPoints = numberOfDataPoints;
107  }
108 
114  @Override
115  public void setPollingInterval(Duration interval) throws
117  if (interval.isNegative()){
118  throw new NegativeDurationException(interval);
119  }
120  pollingInterval = interval;
121  }
122 
126  @Override
127  public Duration getLengthOfHistory(){
128  return pollingInterval.multipliedBy(numberOfDataPoints);
129  }
130 
134  @Override
135  public Duration getPollingInterval(){
136  return this.pollingInterval;
137  }
138 
142  @Override
145  ){
146  listeners.remove(listener);
147  }
148 
153  @Override
154  public void addOnChangeListener(
156  ){
157  listeners.add(listener);
158  }
159 
163  private class VoltagePollingTask implements Runnable {
164 
169  private final Logger log = LoggerFactory.getLogger
170  (VoltagePollingTask.class);
171 
175  @Override
176  public void run(){
177  while (isThreadAlive){
178  Double voltage = getVoltage();
179  Voltage dataPoint = makeDataPoint(voltage);
180  voltages.add(dataPoint);
181  updateListeners(dataPoint);
182  checkVoltageListSize();
183  waitForPollingInterval();
184  }
185  }
186 
191  private Double getVoltage(){
192  Double voltage;
193 
194  try {
195  voltage = powerSupply.getMeasuredVoltage();
196  isThreadAlive = Boolean.TRUE;
197  } catch (IOException error){
198  handleIOException(error);
199  voltage = voltages.get(0).getValue();
200  }
201 
202  return voltage;
203  }
204 
211  private void handleIOException(IOException error){
212  log.warn("Attempting to get measured voltage returned error {}",
213  error);
214 
215  isThreadAlive = Boolean.FALSE;
216  }
217 
224  @Contract("_ -> !null")
225  private Voltage makeDataPoint(Double measuredVoltage){
226  return new VoltageDataPoint(new Date(), measuredVoltage);
227  }
228 
234  private void updateListeners(Voltage dataPoint){
235  for (VariableChangeEventListener<Voltage> listener: listeners){
236  listener.onChange(dataPoint);
237  }
238  }
239 
244  private void checkVoltageListSize(){
245  if (voltages.size() > numberOfDataPoints){
246  removeTailOfHistory();
247  }
248  }
249 
253  private void removeTailOfHistory(){
254  log.debug("Detected more voltages than allowed data points, " +
255  "removing last element");
256  voltages.remove(0);
257  }
258 
264  private void waitForPollingInterval(){
265  try {
266  Thread.sleep(pollingInterval.toMillis());
267  } catch (InterruptedException error){
268  log.debug("Voltage polling task interrupted");
269  isThreadAlive = Boolean.FALSE;
270  }
271  }
272  }
273 }
void addOnChangeListener(VariableChangeEventListener< Voltage > listener)
void removeOnChangeListener(VariableChangeEventListener< Voltage > listener)
Double getMeasuredVoltage()
VoltageProvider(PowerSupply powerSupply, Kernel kernel)
Git Repo