Example #1
0
func publishData(r *types.SensorSuiteReading, c chan bool) {
	defer func() {
		c <- true
	}()

	aggAddr := viper.GetString("aggregator_address")
	aggURL := url.URL{Scheme: "ws", Host: aggAddr, Path: "/ws"}
	for {
		writer, err := wswriter.GetWSWriter(&aggURL)
		if err != nil {
			log.Print("Unable to connect to aggregator.")
			log.Print("Will retry in 5 seconds")
			time.Sleep(5 * time.Second)
			continue
		} else {
			log.Print("Connected to aggregator")
		}

		ticker := time.NewTicker(1 * time.Second)
	R:
		for {
			select {
			case <-ticker.C:
				r.RLock()
				m, _ := json.Marshal(r)
				r.RUnlock()
				err := writer.Write(m)
				if err != nil {
					break R
				}
			case <-writer.Exit:
				log.Print("Lost connection to aggregator")
				break R
			}
		}
		ticker.Stop()
		writer = nil
	}
}
Example #2
0
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
		}
	}
}