1 package kernel.models.variables;
10 import org.jetbrains.annotations.Contract;
11 import org.slf4j.Logger;
12 import org.slf4j.LoggerFactory;
14 import java.time.Duration;
31 private final List<Pressure> pressures =
new LinkedList<>();
37 private final Set<VariableChangeEventListener<Pressure>> listeners =
new 43 private volatile Integer numberOfDataPoints = 10;
49 private volatile Boolean isPollingThreadAlive = Boolean.FALSE;
55 private volatile Duration pollingInterval = Duration.ofMillis(1000);
62 this.pressureGauge = gauge;
63 Runnable pressureTask =
new PressurePollingTask();
64 isPollingThreadAlive = Boolean.TRUE;
65 kernel.getTaskRunner().execute(pressureTask);
81 return isPollingThreadAlive;
97 return this.numberOfDataPoints;
109 this.numberOfDataPoints = numberOfDataPoints;
118 return pollingInterval.multipliedBy(numberOfDataPoints);
126 return pollingInterval;
137 if (pollingInterval.isNegative()){
140 this.pollingInterval = pollingInterval;
151 listeners.add(listener);
160 listeners.remove(listener);
166 private class PressurePollingTask
implements Runnable {
171 private final Logger log = LoggerFactory.getLogger(
172 PressurePollingTask.class
180 while (isPollingThreadAlive) {
181 Float pressureValue = getPressure();
182 Pressure dataPoint = makeDataPoint(pressureValue);
183 pressures.add(dataPoint);
184 updateListeners(dataPoint);
185 checkPressureListSize();
186 waitForPollingInterval();
194 private void checkPressureListSize(){
195 if (pressures.size() > numberOfDataPoints){
196 removeTailOfHistory();
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;
208 pressures.remove(INDEX_OF_FIRST_ELEMENT);
214 private Float getPressure(){
219 isPollingThreadAlive = Boolean.TRUE;
220 }
catch (Exception error){
221 handleException(error);
222 pressure = pressures.get(0).getValue();
233 private void updateListeners(
Pressure newPressure){
235 listener.onChange(newPressure);
244 private void handleException(Exception error){
246 "Attempting to get pressure returned error {}", error
248 isPollingThreadAlive = Boolean.FALSE;
258 @Contract(
"_ -> !null")
259 private Pressure makeDataPoint(Float pressure){
260 Date rightNow =
new Date();
269 private void waitForPollingInterval(){
271 Thread.sleep(pollingInterval.toMillis());
272 }
catch (InterruptedException error){
273 log.info(
"Thread interrupted");
274 isPollingThreadAlive = Boolean.FALSE;
void setPollingInterval(Duration pollingInterval)
List< Pressure > getValues()
void setNumberOfDataPoints(Integer numberOfDataPoints)
void removeOnChangeListener(VariableChangeEventListener< Pressure > listener)
void addOnChangeListener(VariableChangeEventListener< Pressure > listener)
PressureProvider(PressureGauge gauge, Kernel kernel)
Boolean isProvidingVariables()
Duration getPollingInterval()
Integer getNumberOfDataPoints()
Duration getLengthOfHistory()