package main import "k8s.io/klog" // daemonController is the control/data interface passed on to external system // controllers, eg. the web interface. // // This is a subset of daemon functions limited to a safe, explicit subset. type daemonController interface { loopLoad() int64 // snapshot returns an internally consistent copy of the daemon state. snapshot() *daemonState // rpSet enables/disables the roughing pump. rpSet(bool) // dpSet enables/disables the diffusion pump. dpSet(bool) // pumpDownPress simulates a pumpdown button press. pumpDownPress() // ventPRess simulates a vent button press. ventPress() // returns the current gpio state of the pump down button gpioPumpDownStatus() bool // returns the current gpio state of the vent button gpioVentStatus() bool gpioBelowRoughStatus() bool gpioBelowHighStatus() bool } func (d *daemon) loopLoad() int64 { return d.load.Load() } func (d *daemon) snapshot() *daemonState { d.mu.RLock() ds := d.daemonState d.mu.RUnlock() return &ds } func (d *daemon) rpSet(state bool) { d.mu.Lock() defer d.mu.Unlock() if !state && d.dpOn { klog.Errorf("SAFETY: Refusing to disable roughing pump while diffusion pump is active") return } d.rpOn = state } func (d *daemon) dpSet(state bool) { d.mu.Lock() defer d.mu.Unlock() if state && (d.safety.failsafe || d.safety.highPressure) { klog.Errorf("SAFETY: Refusing to enable diffusion pump with safety alerts present") return } d.dpOn = state } func (d *daemon) pumpDownPress() { d.mu.Lock() defer d.mu.Unlock() d.pumpdown.trigger() } func (d *daemon) ventPress() { d.mu.Lock() defer d.mu.Unlock() d.vent.trigger() } func (d *daemon) gpioPumpDownStatus() bool { d.mu.Lock() defer d.mu.Unlock() return d.gpioBtnPumpDown.get() } func (d *daemon) gpioVentStatus() bool { d.mu.Lock() defer d.mu.Unlock() return d.gpioBtnVent.get() } func (d *daemon) gpioBelowRoughStatus() bool { d.mu.Lock() defer d.mu.Unlock() return d.gpioBelowRough.get() } func (d *daemon) gpioBelowHighStatus() bool { d.mu.Lock() defer d.mu.Unlock() return d.gpioBelowHigh.get() }