Track consecutive same vs different sequence numbers

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
Ian Gulliver
2026-01-30 15:27:18 -08:00
parent d06a46dea5
commit 664f0850de

37
main.go
View File

@@ -37,7 +37,9 @@ type App struct {
inputBySrc map[string]uint64 inputBySrc map[string]uint64
inputByUniv map[string]uint64 inputByUniv map[string]uint64
inputByName map[string]uint64 inputByName map[string]uint64
inputSeqCounts map[string]map[uint8]uint64 inputLastSeq map[string]uint8
inputSeqSame map[string]uint64
inputSeqDiff map[string]uint64
} }
func main() { func main() {
@@ -157,7 +159,9 @@ func main() {
inputBySrc: map[string]uint64{}, inputBySrc: map[string]uint64{},
inputByUniv: map[string]uint64{}, inputByUniv: map[string]uint64{},
inputByName: map[string]uint64{}, inputByName: map[string]uint64{},
inputSeqCounts: map[string]map[uint8]uint64{}, inputLastSeq: map[string]uint8{},
inputSeqSame: map[string]uint64{},
inputSeqDiff: map[string]uint64{},
} }
// Create ArtNet receiver if enabled // Create ArtNet receiver if enabled
@@ -287,10 +291,14 @@ func (a *App) HandleSACN(src *net.UDPAddr, pkt *sacn.DataPacket) {
a.inputBySrc[src.IP.String()]++ a.inputBySrc[src.IP.String()]++
a.inputByUniv[univKey]++ a.inputByUniv[univKey]++
a.inputByName[pkt.SourceName]++ a.inputByName[pkt.SourceName]++
if a.inputSeqCounts[univKey] == nil { if lastSeq, ok := a.inputLastSeq[univKey]; ok {
a.inputSeqCounts[univKey] = map[uint8]uint64{} if pkt.Sequence == lastSeq {
a.inputSeqSame[univKey]++
} else {
a.inputSeqDiff[univKey]++
} }
a.inputSeqCounts[univKey][pkt.Sequence]++ }
a.inputLastSeq[univKey] = pkt.Sequence
a.inputMu.Unlock() a.inputMu.Unlock()
u := config.Universe{Protocol: config.ProtocolSACN, Number: pkt.Universe} u := config.Universe{Protocol: config.ProtocolSACN, Number: pkt.Universe}
@@ -356,11 +364,13 @@ func (a *App) printStats() {
inputBySrc := a.inputBySrc inputBySrc := a.inputBySrc
inputByUniv := a.inputByUniv inputByUniv := a.inputByUniv
inputByName := a.inputByName inputByName := a.inputByName
inputSeqCounts := a.inputSeqCounts inputSeqSame := a.inputSeqSame
inputSeqDiff := a.inputSeqDiff
a.inputBySrc = map[string]uint64{} a.inputBySrc = map[string]uint64{}
a.inputByUniv = map[string]uint64{} a.inputByUniv = map[string]uint64{}
a.inputByName = map[string]uint64{} a.inputByName = map[string]uint64{}
a.inputSeqCounts = map[string]map[uint8]uint64{} a.inputSeqSame = map[string]uint64{}
a.inputSeqDiff = map[string]uint64{}
a.inputMu.Unlock() a.inputMu.Unlock()
if len(inputBySrc) > 0 { if len(inputBySrc) > 0 {
@@ -378,18 +388,11 @@ func (a *App) printStats() {
if len(inputByUniv) > 0 { if len(inputByUniv) > 0 {
log.Printf("[stats] input by universe (last 10s):") log.Printf("[stats] input by universe (last 10s):")
for univ, count := range inputByUniv { for univ, count := range inputByUniv {
log.Printf("[stats] %s: %d packets", univ, count) same := inputSeqSame[univ]
diff := inputSeqDiff[univ]
log.Printf("[stats] %s: %d packets (seq same=%d diff=%d)", univ, count, same, diff)
} }
} }
for univ, seqs := range inputSeqCounts {
var duplicates uint64
for _, count := range seqs {
if count > 1 {
duplicates += count - 1
}
}
log.Printf("[stats] %s: %d unique seqs, %d duplicates", univ, len(seqs), duplicates)
}
if len(a.cfg.Mappings) == 0 { if len(a.cfg.Mappings) == 0 {
return return