package main import ( "context" "flag" "net/http" "os" "os/signal" "k8s.io/klog" ) var ( flagFake bool flagListenHTTP string flagPressureThresholdRough = ScientificNotationValue(1e-1) flagPressureThresholdHigh = ScientificNotationValue(1e-4) ) func main() { flag.BoolVar(&flagFake, "fake", false, "Enable fake mode which allows to run succd for tests outside the succbone") flag.StringVar(&flagListenHTTP, "listen_http", ":8080", "Address at which to listen for HTTP requests") flag.TextVar(&flagPressureThresholdRough, "pressure_threshold_rough", &flagPressureThresholdRough, "Threshold for opening up diffusion pump (mbar)") flag.TextVar(&flagPressureThresholdHigh, "pressure_threshold_high", &flagPressureThresholdHigh, "Threshold for enabling high voltage circuits (mbar)") flag.Parse() ctx, _ := signal.NotifyContext(context.Background(), os.Interrupt) d := daemon{ rpOn: true, } d.aboveRough.threshold = float64(flagPressureThresholdRough) d.aboveHigh.threshold = float64(flagPressureThresholdHigh) if flagFake { klog.Infof("Starting with fake peripherals") d.adcPirani = &fakeADC{} d.gpioRoughingPump = &fakeGPIO{desc: "rp"} d.gpioDiffusionPump = &fakeGPIO{desc: "~dp"} d.gpioBtnPumpDown = &fakeGPIO{desc: "~pd"} d.gpioBtnVent = &fakeGPIO{desc: "~vent"} d.gpioBelowRough = &fakeGPIO{desc: "~rough"} d.gpioBelowHigh = &fakeGPIO{desc: "~high"} } else { adc, err := newBBADC(0) if err != nil { klog.Exitf("Failed to setup Pirani ADC: %v", err) } d.adcPirani = adc for _, c := range []struct { out *gpio num int }{ {&d.gpioRoughingPump, 115}, {&d.gpioDiffusionPump, 49}, {&d.gpioBtnPumpDown, 48}, {&d.gpioBtnVent, 60}, {&d.gpioBelowRough, 30}, {&d.gpioBelowHigh, 7}, } { *c.out, err = newBBGPIO(c.num, true) if err != nil { klog.Exitf("Failed to setup GPIO: %v", err) } } } http.HandleFunc("/", d.httpIndex) http.HandleFunc("/favicon.png", d.httpFavicon) http.HandleFunc("/stream", d.httpStream) http.HandleFunc("/metrics", d.httpMetrics) http.HandleFunc("/button/vent", d.httpButtonVent) http.HandleFunc("/button/pumpdown", d.httpButtonPumpDown) http.HandleFunc("/rp/on", d.httpRoughingPumpEnable) http.HandleFunc("/rp/off", d.httpRoughingPumpDisable) http.HandleFunc("/dp/on", d.httpDiffusionPumpEnable) http.HandleFunc("/dp/off", d.httpDiffusionPumpDisable) klog.Infof("Listening for HTTP at %s", flagListenHTTP) go func() { if err := http.ListenAndServe(flagListenHTTP, nil); err != nil { klog.Errorf("HTTP listen failed: %v", err) } }() go d.process(ctx) <-ctx.Done() }