Serge Bazanski
8f7ec7e141
This improves the structure of the code, separating the data/control interface out and then implementing the http interface as a user of this interface.
85 lines
2.1 KiB
Go
85 lines
2.1 KiB
Go
package main
|
|
|
|
import "math"
|
|
|
|
// daemonState contains all the state of the daemon. A copy of it can be
|
|
// requested for consumers, eg. the web view.
|
|
type daemonState struct {
|
|
safety safetyStatus
|
|
|
|
// adcPiraniVolts is a moving window of read ADC values, used to calculate a
|
|
// moving average.
|
|
adcPiraniVolts []float32
|
|
rpOn bool
|
|
dpOn bool
|
|
|
|
vent momentaryOutput
|
|
pumpdown momentaryOutput
|
|
aboveRough thresholdOutput
|
|
aboveHigh thresholdOutput
|
|
}
|
|
|
|
type safetyStatus struct {
|
|
// failsafe mode is enabled when the pirani gauge appears to be
|
|
// disconnected, and is disabled only when an atmosphere is read.
|
|
failsafe bool
|
|
// highPressure mode is enabled when the pressure reading is above 1e-1
|
|
// mbar, locking out the diffusion pump from being enabled.
|
|
highPressure bool
|
|
}
|
|
|
|
type piraniDetection uint
|
|
|
|
const (
|
|
// piraniDetectionUnknown means the system isn't yet sure whether the pirani
|
|
// gauge is connected.
|
|
piraniDetectionUnknown piraniDetection = iota
|
|
// piraniDetectionConnected means the system assumes the pirani gauge is
|
|
// connected.
|
|
piraniDetectionConnected = iota
|
|
// piraniDetectionDisconnected means the system assumes the pirani gauge is
|
|
// disconnected.
|
|
piraniDetectionDisconnected = iota
|
|
)
|
|
|
|
// piraniDetection guesses whether the pirani gauge is connected.
|
|
func (d *daemonState) piraniDetection() piraniDetection {
|
|
if len(d.adcPiraniVolts) < 3 {
|
|
return piraniDetectionUnknown
|
|
}
|
|
volts := float32(0.0)
|
|
for _, v := range d.adcPiraniVolts[len(d.adcPiraniVolts)-3:] {
|
|
volts += v
|
|
}
|
|
volts /= 3.0
|
|
|
|
bar := math.Pow(10.0, float64(volts)-8.5)
|
|
mbar := float32(bar * 1000.0)
|
|
|
|
if mbar < 4e-6 {
|
|
return piraniDetectionDisconnected
|
|
}
|
|
return piraniDetectionConnected
|
|
}
|
|
|
|
func (d *daemonState) pirani() (volts float32, mbar float32) {
|
|
volts = 0.0
|
|
for _, v := range d.adcPiraniVolts {
|
|
volts += v
|
|
}
|
|
if len(d.adcPiraniVolts) != 0 {
|
|
volts /= float32(len(d.adcPiraniVolts))
|
|
}
|
|
|
|
// Per Pirani probe docs.
|
|
bar := math.Pow(10.0, float64(volts)-8.5)
|
|
mbar = float32(bar * 1000.0)
|
|
return
|
|
}
|
|
|
|
func (d *daemonState) vacuumStatus() (rough, high bool) {
|
|
rough = !d.aboveRough.output
|
|
high = !d.aboveHigh.output
|
|
return
|
|
}
|