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 }