BakeoutController-Basic  0.1
A Controller for the Omicron vacuum chamber
models/variables/PressureProvider.java
1 package kernel.models.variables;
2 
5 import kernel.Kernel;
10 import org.jetbrains.annotations.Contract;
11 import org.slf4j.Logger;
12 import org.slf4j.LoggerFactory;
13 
14 import java.time.Duration;
15 import java.util.*;
16 
21 public class PressureProvider implements VariableProvider<Pressure> {
22 
26  private PressureGauge pressureGauge;
27 
31  private final List<Pressure> pressures = new LinkedList<>();
32 
37  private final Set<VariableChangeEventListener<Pressure>> listeners = new
38  HashSet<>();
39 
43  private volatile Integer numberOfDataPoints = 10;
44 
49  private volatile Boolean isPollingThreadAlive = Boolean.FALSE;
50 
55  private volatile Duration pollingInterval = Duration.ofMillis(1000);
56 
62  this.pressureGauge = gauge;
63  Runnable pressureTask = new PressurePollingTask();
64  isPollingThreadAlive = Boolean.TRUE;
65  kernel.getTaskRunner().execute(pressureTask);
66  }
67 
71  @Override
72  public List<Pressure> getValues(){
73  return pressures;
74  }
75 
79  @Override
80  public Boolean isProvidingVariables(){
81  return isPollingThreadAlive;
82  }
83 
87  @Override
88  public void clearHistory(){
89  pressures.clear();
90  }
91 
95  @Override
96  public Integer getNumberOfDataPoints(){
97  return this.numberOfDataPoints;
98  }
99 
107  @Override
108  public void setNumberOfDataPoints(Integer numberOfDataPoints) {
109  this.numberOfDataPoints = numberOfDataPoints;
110  }
111 
116  @Override
117  public Duration getLengthOfHistory(){
118  return pollingInterval.multipliedBy(numberOfDataPoints);
119  }
120 
124  @Override
125  public Duration getPollingInterval(){
126  return pollingInterval;
127  }
128 
134  @Override
135  public void setPollingInterval(Duration pollingInterval) throws
137  if (pollingInterval.isNegative()){
138  throw new NegativeDurationException(pollingInterval);
139  }
140  this.pollingInterval = pollingInterval;
141  }
142 
148  @Override
149  public void addOnChangeListener(
151  listeners.add(listener);
152  }
153 
157  @Override
160  listeners.remove(listener);
161  }
162 
166  private class PressurePollingTask implements Runnable {
167 
171  private final Logger log = LoggerFactory.getLogger(
172  PressurePollingTask.class
173  );
174 
178  @Override
179  public void run(){
180  while (isPollingThreadAlive) {
181  Float pressureValue = getPressure();
182  Pressure dataPoint = makeDataPoint(pressureValue);
183  pressures.add(dataPoint);
184  updateListeners(dataPoint);
185  checkPressureListSize();
186  waitForPollingInterval();
187  }
188  }
189 
194  private void checkPressureListSize(){
195  if (pressures.size() > numberOfDataPoints){
196  removeTailOfHistory();
197  }
198  }
199 
203  private void removeTailOfHistory(){
204  log.debug("Detected list of pressures greater than allowed. " +
205  "Removing last element.");
206  int INDEX_OF_FIRST_ELEMENT = 0;
207 
208  pressures.remove(INDEX_OF_FIRST_ELEMENT);
209  }
210 
214  private Float getPressure(){
215  Float pressure;
216 
217  try {
218  pressure = pressureGauge.getPressure();
219  isPollingThreadAlive = Boolean.TRUE;
220  } catch (Exception error){
221  handleException(error);
222  pressure = pressures.get(0).getValue();
223  }
224 
225  return pressure;
226  }
227 
233  private void updateListeners(Pressure newPressure){
234  for(VariableChangeEventListener<Pressure> listener: listeners){
235  listener.onChange(newPressure);
236  }
237  }
238 
244  private void handleException(Exception error){
245  log.error(
246  "Attempting to get pressure returned error {}", error
247  );
248  isPollingThreadAlive = Boolean.FALSE;
249  }
250 
258  @Contract("_ -> !null")
259  private Pressure makeDataPoint(Float pressure){
260  Date rightNow = new Date();
261 
262  return new PressureDataPoint(rightNow, pressure);
263  }
264 
269  private void waitForPollingInterval(){
270  try {
271  Thread.sleep(pollingInterval.toMillis());
272  } catch (InterruptedException error){
273  log.info("Thread interrupted");
274  isPollingThreadAlive = Boolean.FALSE;
275  }
276  }
277  }
278 }
void removeOnChangeListener(VariableChangeEventListener< Pressure > listener)
void addOnChangeListener(VariableChangeEventListener< Pressure > listener)
Git Repo