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}