func sensorUpdateRoutine(r *types.SensorSuiteReading, c chan bool) { tempAddr := viper.GetString("temperature_address") radAddr := viper.GetString("radiation_address") addr := viper.GetString("listen_address") tu := url.URL{Scheme: "ws", Host: tempAddr, Path: "/ws"} ru := url.URL{Scheme: "ws", Host: radAddr, Path: "/ws"} tuStr := tu.String() ruStr := ru.String() tempReader, err := wsreader.GetWSReader(&tuStr) if err != nil { log.Printf("%s", err) c <- true return } radReader, err := wsreader.GetWSReader(&ruStr) if err != nil { log.Printf("%s", err) c <- true return } tempReader.Run() radReader.Run() blaster := wsblaster.GetBlaster(&addr, false) go blaster.Run() tr := &types.TemperatureReading{} rr := &types.RadiationReading{} ticker := time.NewTicker(1 * time.Second) for { select { case m := <-tempReader.C: json.Unmarshal(m, tr) r.Lock() r.Temperature = tr.Temperature r.Unlock() case m := <-radReader.C: json.Unmarshal(m, rr) r.Lock() r.Radiation = rr.Radiation r.Unlock() case <-ticker.C: r.RLock() m, _ := json.Marshal(r) r.RUnlock() blaster.Write(m) case <-tempReader.Exit: log.Printf("Lost connection to Temperature websocket") c <- true return case <-radReader.Exit: log.Printf("Lost connection to Radiation websocket") c <- true return } } }