From 0db905904fbc90bd4d82d8330b3413463d85a2c2 Mon Sep 17 00:00:00 2001 From: Christopher Young Date: Tue, 22 Sep 2015 09:52:49 -0400 Subject: [PATCH] Print stats in main log. 2015/09/22 13:52:11 stats [uptime 1 minute ago] 2015/09/22 13:52:11 - CPUTemp=49.23 deg C, MemStats.Alloc=101MB, MemStats.Sys=126MB, totalNetworkMessagesSent=0 2015/09/22 13:52:11 - UAT/min 103,226/103,226 [maxSS=55.30%], ES/min 0/0 2015/09/22 13:52:11 - Total traffic targets tracked=0, last GPS fix: a long while ago --- main/gen_gdl90.go | 32 +++++++++++++++++++++++++++++++- main/network.go | 7 ++++++- main/sdr.go | 2 ++ main/traffic.go | 15 +++++++++------ 4 files changed, 48 insertions(+), 8 deletions(-) diff --git a/main/gen_gdl90.go b/main/gen_gdl90.go index 85fd6967..8873c984 100644 --- a/main/gen_gdl90.go +++ b/main/gen_gdl90.go @@ -13,6 +13,7 @@ import ( "strconv" "strings" "time" + "github.com/dustin/go-humanize" ) // http://www.faa.gov/nextgen/programs/adsb/wsa/media/GDL90_Public_ICD_RevA.PDF @@ -391,6 +392,19 @@ func parseInput(buf string) ([]byte, uint16) { parseDownlinkReport(s) } + if isUplink && len(x) >= 3 { + // See if we can parse out the signal strength. + ss := x[2] + if strings.HasPrefix(ss, "ss=") { + ssStr := ss[3:] + if ssInt, err := strconv.Atoi(ssStr); err == nil { + if ssInt > maxSignalStrength { + maxSignalStrength = ssInt + } + } + } + } + s = s[1:] msglen := len(s) / 2 @@ -536,7 +550,7 @@ func defaultSettings() { globalSettings.ES_Enabled = false //TODO globalSettings.GPS_Enabled = false //TODO //FIXME: Need to change format below. - globalSettings.NetworkOutputs = []networkConnection{{nil, "", 4000, NETWORK_GDL90_STANDARD, nil, time.Time{}, time.Time{}}, {nil, "", 43211, NETWORK_GDL90_STANDARD | NETWORK_AHRS_GDL90, nil, time.Time{}, time.Time{}}, {nil, "", 49002, NETWORK_AHRS_FFSIM, nil, time.Time{}, time.Time{}}} + globalSettings.NetworkOutputs = []networkConnection{{nil, "", 4000, NETWORK_GDL90_STANDARD, nil, time.Time{}, time.Time{}, 0}, {nil, "", 43211, NETWORK_GDL90_STANDARD | NETWORK_AHRS_GDL90, nil, time.Time{}, time.Time{}, 0}, {nil, "", 49002, NETWORK_AHRS_FFSIM, nil, time.Time{}, time.Time{}, 0}} globalSettings.AHRS_Enabled = false globalSettings.DEBUG = false globalSettings.ReplayLog = false //TODO: 'true' for debug builds. @@ -590,6 +604,19 @@ func openReplay(fn string) (*os.File, error) { return ret, err } +func printStats() { + statTimer := time.NewTicker(30 * time.Second) + for { + <-statTimer.C + var memstats runtime.MemStats + runtime.ReadMemStats(&memstats) + log.Printf("stats [up since: %s]\n", humanize.Time(timeStarted)) + log.Printf(" - CPUTemp=%.02f deg C, MemStats.Alloc=%s, MemStats.Sys=%s, totalNetworkMessagesSent=%s\n", globalStatus.CPUTemp, humanize.Bytes(uint64(memstats.Alloc)), humanize.Bytes(uint64(memstats.Sys)), humanize.Comma(int64(totalNetworkMessagesSent))) + log.Printf(" - UAT/min %s/%s [maxSS=%.02f%%], ES/min %s/%s\n", humanize.Comma(int64(globalStatus.UAT_messages_last_minute)), humanize.Comma(int64(globalStatus.UAT_messages_max)), float64(maxSignalStrength) / 10.0, humanize.Comma(int64(globalStatus.ES_messages_last_minute)), humanize.Comma(int64(globalStatus.ES_messages_max))) + log.Printf(" - Total traffic targets tracked=%s, last GPS fix: %s\n", humanize.Comma(int64(len(seenTraffic))), humanize.Time(mySituation.lastFixLocalTime)) + } +} + func main() { timeStarted = time.Now() runtime.GOMAXPROCS(runtime.NumCPU()) // redundant with Go v1.5+ compiler @@ -651,6 +678,9 @@ func main() { // Initialize the (out) network handler. initNetwork() + // Start printing stats periodically to the logfiles. + go printStats() + reader := bufio.NewReader(os.Stdin) for { diff --git a/main/network.go b/main/network.go index 0219a329..2f5e5109 100644 --- a/main/network.go +++ b/main/network.go @@ -41,6 +41,8 @@ var outSockets map[string]networkConnection var dhcpLeases map[string]string var netMutex *sync.Mutex +var totalNetworkMessagesSent uint32 + var pingResponse map[string]time.Time // Last time an IP responded to an "echo" response. const ( @@ -108,6 +110,7 @@ func sendToAllConnectedClients(msg networkMessage) { if !msg.queueable { if !isSleeping(k) { netconn.Conn.Write(msg.msg) // Write immediately. + totalNetworkMessagesSent++ } } else { if !isSleeping(k) { @@ -118,7 +121,7 @@ func sendToAllConnectedClients(msg networkMessage) { log.Printf("%s:%d - message queue overflow.\n", netconn.Ip, netconn.Port) netconn.numOverflows++ s := 2 * netconn.numOverflows // Double the amount we chop off on each overflow. - if s >= len(netconn.messageQueue) { + if int(s) >= len(netconn.messageQueue) { netconn.messageQueue = make([][]byte, 0) } else { netconn.messageQueue = netconn.messageQueue[s:] @@ -193,6 +196,7 @@ func messageQueueSender() { if len(netconn.messageQueue) > 0 && !isSleeping(k) && !isThrottled(k) { tmpConn := netconn tmpConn.Conn.Write(tmpConn.messageQueue[0]) + totalNetworkMessagesSent++ tmpConn.messageQueue = tmpConn.messageQueue[1:] outSockets[k] = tmpConn } @@ -251,6 +255,7 @@ func icmpEchoSender(c *icmp.PacketConn) { log.Printf("couldn't send ICMP Echo: %s\n", err.Error()) continue } + totalNetworkMessagesSent++ } } } diff --git a/main/sdr.go b/main/sdr.go index 34a81c1e..67301353 100644 --- a/main/sdr.go +++ b/main/sdr.go @@ -10,6 +10,8 @@ import ( var uatSDR int // Index. var esSDR int // Index. +var maxSignalStrength int + // Read 978MHz from SDR. func sdrReader() { var err error diff --git a/main/traffic.go b/main/traffic.go index 4ba94958..f94effb1 100644 --- a/main/traffic.go +++ b/main/traffic.go @@ -73,6 +73,7 @@ type TrafficInfo struct { var traffic map[uint32]TrafficInfo var trafficMutex *sync.Mutex +var seenTraffic map[uint32]bool // Historical list of all ICAO addresses seen. func cleanupOldEntries() { for icao_addr, ti := range traffic { @@ -351,6 +352,7 @@ func parseDownlinkReport(s string) { } traffic[ti.icao_addr] = ti + seenTraffic[ti.icao_addr] = true // Mark as seen. } func esListen() { @@ -417,18 +419,18 @@ func esListen() { altFloat, err := strconv.ParseFloat(alt, 32) if err != nil { -// log.Printf("err parsing alt (%s): %s\n", alt, err.Error()) + // log.Printf("err parsing alt (%s): %s\n", alt, err.Error()) valid_change = false } latFloat, err := strconv.ParseFloat(lat, 32) if err != nil { -// log.Printf("err parsing lat (%s): %s\n", lat, err.Error()) + // log.Printf("err parsing lat (%s): %s\n", lat, err.Error()) valid_change = false } lngFloat, err := strconv.ParseFloat(lng, 32) if err != nil { -// log.Printf("err parsing lng (%s): %s\n", lng, err.Error()) + // log.Printf("err parsing lng (%s): %s\n", lng, err.Error()) valid_change = false } @@ -452,18 +454,18 @@ func esListen() { speedFloat, err := strconv.ParseFloat(speed, 32) if err != nil { -// log.Printf("err parsing speed (%s): %s\n", speed, err.Error()) + // log.Printf("err parsing speed (%s): %s\n", speed, err.Error()) valid_change = false } trackFloat, err := strconv.ParseFloat(track, 32) if err != nil { -// log.Printf("err parsing track (%s): %s\n", track, err.Error()) + // log.Printf("err parsing track (%s): %s\n", track, err.Error()) valid_change = false } vvelFloat, err := strconv.ParseFloat(vvel, 32) if err != nil { -// log.Printf("err parsing vvel (%s): %s\n", vvel, err.Error()) + // log.Printf("err parsing vvel (%s): %s\n", vvel, err.Error()) valid_change = false } @@ -503,6 +505,7 @@ func esListen() { } traffic[icaoDec] = ti // Update information on this ICAO code. + seenTraffic[icaoDec] = true // Mark as seen. trafficMutex.Unlock() } }