From 874eaf02ceab085fc4fe1b97298e61590d5edddf Mon Sep 17 00:00:00 2001 From: zdmx Date: Fri, 27 Sep 2024 23:01:17 +0200 Subject: [PATCH] succd: calcuate change rate for safety interlock directly from adc ringbuffer --- succbone/succd/main.go | 1 - succbone/succd/process.go | 25 ++++++++++++++++++++----- succbone/succd/ringbuffer.go | 34 ---------------------------------- 3 files changed, 20 insertions(+), 40 deletions(-) delete mode 100644 succbone/succd/ringbuffer.go diff --git a/succbone/succd/main.go b/succbone/succd/main.go index 2a03729..32e5c17 100644 --- a/succbone/succd/main.go +++ b/succbone/succd/main.go @@ -31,7 +31,6 @@ func main() { } d.aboveRough.threshold = float64(flagPressureThresholdRough) d.aboveHigh.threshold = float64(flagPressureThresholdHigh) - d.lastPressures = newRingbuffer() if flagFake { klog.Infof("Starting with fake peripherals") d.adcPirani = &fakeADC{} diff --git a/succbone/succd/process.go b/succbone/succd/process.go index 466355a..fe8d9e0 100644 --- a/succbone/succd/process.go +++ b/succbone/succd/process.go @@ -17,8 +17,6 @@ type daemon struct { // Pirani gauge. adcPirani adc - lastPressures ringbuffer - failsafe bool highPressure bool @@ -125,10 +123,8 @@ func (d *daemon) processOnce(_ context.Context) error { d.aboveRough.process(float64(mbar)) d.aboveHigh.process(float64(mbar)) - d.lastPressures.AddValue(mbar) - // max rate of 1.0 in 500 ms because ringbuffer holds 5 values - if d.lastPressures.MaxMinDiff() > 1.0 { + if d.piraniRateOfChange() > 2.0 { if !d.failsafe { d.failsafe = true klog.Errorf("Pressure changed too fast; entering failsafe mode") @@ -199,6 +195,25 @@ func (d *daemon) processOnce(_ context.Context) error { return nil } +func (d *daemon) piraniRateOfChange() float32 { + max := d.adcPiraniVolts[0] + min := d.adcPiraniVolts[0] + for _, val := range d.adcPiraniVolts { + if val < min { + min = val + } + if val > max { + max = val + } + } + max_bar = math.Pow(10.0, float64(max)-8.5); + max_mbar = float32(max_bar * 1000.0) + min_bar = math.Pow(10.0, float64(min)-8.5); + min_mbar = float32(min_bar * 1000.0) + + (max_mbar - min_mbar) +} + // pirani returns the Pirani gauge voltage and pressure. func (d *daemon) pirani() (volts float32, mbar float32) { d.mu.RLock() diff --git a/succbone/succd/ringbuffer.go b/succbone/succd/ringbuffer.go deleted file mode 100644 index 76be63c..0000000 --- a/succbone/succd/ringbuffer.go +++ /dev/null @@ -1,34 +0,0 @@ -package main - -type ringbuffer struct { - data []float32 - idx int -} - -func newRingbuffer() ringbuffer { - return ringbuffer { - data: make([]float32, 5), - idx: 0, - } -} - -func (rb *ringbuffer) AddValue(value float32) { - rb.data[rb.idx] = value; - rb.idx = (rb.idx + 1) % len(rb.data) -} - -func (rb *ringbuffer) MaxMinDiff() float32 { - min := rb.data[0] - max := rb.data[0] - - for _, val := range rb.data { - if val < min { - min = val - } - if val > max { - max = val - } - } - - return max - min -}