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
|
||
|
}
|