1package calibration
 2
 3import (
 4	"ewdetect/comms"
 5	"ewdetect/config"
 6	"ewdetect/stations"
 7	"math"
 8	"time"
 9
10	"github.com/rs/zerolog/log"
11)
12
13func Init() {
14	if !config.FastStartup {
15		log.Info().Msg("Collecting data for cold start calibration")
16		time.Sleep(config.ColdStartCalibrationTime)
17		log.Info().Msg("Starting cold start calibration")
18		for connection := range comms.Connections {
19			if _, ok := stations.Stations[connection]; ok {
20				for key := range *comms.Connections[connection].Buffers {
21					log.Debug().
22						Str("connection", connection).
23						Str("key", key).
24						Msg("Processing calibration")
25					buffer := *(*comms.Connections[connection].Buffers)[key]
26					head := (*comms.Connections[connection].Heads)[key]
27					avg := int32(0)
28					n := int32(0)
29					for i, b := range buffer {
30						if i < head {
31							avg += b
32							n++
33						}
34					}
35					dc := avg / n
36					rmss := .0
37					for i, b := range buffer {
38						if i < head {
39							floatS := float64(b - dc)
40							rmss += floatS * floatS
41						}
42					}
43					noise_floor := int32(math.Sqrt(2) * math.Sqrt(rmss/float64(n)))
44					prev := (*stations.Stations[connection])[key]
45
46					(*stations.Stations[connection])[key] = stations.Station{
47						Name:       prev.Name,
48						Lat:        prev.Lat,
49						Lon:        prev.Lon,
50						SampleRate: prev.SampleRate,
51						DC:         dc,
52						NoiseFloor: noise_floor,
53						Calibrated: true,
54					}
55					log.Debug().
56						Str("station", prev.Name).
57						Int32("dc", dc).
58						Int32("noise_floor", noise_floor).
59						Msg("Station calibrated")
60				}
61			}
62		}
63		stations.SerializeStationData()
64		log.Info().Msg("Calibration complete")
65	}
66}