pull/182/head
Christopher Young 2015-12-17 16:11:17 -05:00
rodzic 6b9a750ddc
commit 495fb46fee
1 zmienionych plików z 120 dodań i 184 usunięć

Wyświetl plik

@ -2,10 +2,10 @@ package main
import ( import (
"bufio" "bufio"
"flag"
"compress/gzip" "compress/gzip"
"encoding/hex" "encoding/hex"
"encoding/json" "encoding/json"
"flag"
"fmt" "fmt"
"io" "io"
"io/ioutil" "io/ioutil"
@ -31,7 +31,7 @@ const (
maxDatagramSize = 8192 maxDatagramSize = 8192
maxUserMsgQueueSize = 25000 // About 10MB per port per connected client. maxUserMsgQueueSize = 25000 // About 10MB per port per connected client.
logDirectory = "/var/log/stratux" logDirectory = "/var/log/stratux"
UPLINK_BLOCK_DATA_BITS = 576 UPLINK_BLOCK_DATA_BITS = 576
UPLINK_BLOCK_BITS = (UPLINK_BLOCK_DATA_BITS + 160) UPLINK_BLOCK_BITS = (UPLINK_BLOCK_DATA_BITS + 160)
UPLINK_BLOCK_DATA_BYTES = (UPLINK_BLOCK_DATA_BITS / 8) UPLINK_BLOCK_DATA_BYTES = (UPLINK_BLOCK_DATA_BITS / 8)
@ -61,11 +61,11 @@ const (
TRACK_RESOLUTION = float32(360.0 / 256.0) TRACK_RESOLUTION = float32(360.0 / 256.0)
) )
var uatReplayLog string var uatReplayLog string
var esReplayLog string var esReplayLog string
var gpsReplayLog string var gpsReplayLog string
var ahrsReplayLog string var ahrsReplayLog string
var dump1090ReplayLog string var dump1090ReplayLog string
var stratuxBuild string var stratuxBuild string
var stratuxVersion string var stratuxVersion string
@ -76,17 +76,17 @@ var Crc16Table [256]uint16
// Current AHRS, pressure altitude, etc. // Current AHRS, pressure altitude, etc.
var mySituation SituationData var mySituation SituationData
type WriteCloser interface {
io.Writer
io.Closer
}
// File handles for replay logging. // File handles for replay logging.
var uatReplayWriter *os.File var uatReplayWriter WriteCloser
var uatReplayWriterGzip *gzip.Writer var esReplayWriter WriteCloser
var esReplayWriter *os.File var gpsReplayWriter WriteCloser
var esReplayWriterGzip *gzip.Writer var ahrsReplayWriter WriteCloser
var gpsReplayWriter *os.File var dump1090ReplayWriter WriteCloser
var gpsReplayWriterGzip *gzip.Writer
var ahrsReplayWriter *os.File
var ahrsReplayWriterGzip *gzip.Writer
var dump1090ReplayWriter *os.File
var dump1090ReplayWriterGzip *gzip.Writer
var developerMode bool var developerMode bool
@ -115,49 +115,48 @@ type ADSBTower struct {
Messages_total uint64 Messages_total uint64
} }
var ADSBTowers map[string]ADSBTower // Running list of all towers seen. (lat,lng) -> ADSBTower var ADSBTowers map[string]ADSBTower // Running list of all towers seen. (lat,lng) -> ADSBTower
func constructFilenames() { func constructFilenames() {
var fileIndexNumber uint var fileIndexNumber uint
// First, create the log file directory if it does not exist // First, create the log file directory if it does not exist
os.Mkdir(logDirectory,0644) os.Mkdir(logDirectory, 0644)
f, err := os.Open(indexFilename) f, err := os.Open(indexFilename)
if err != nil { if err != nil {
log.Printf("Unable to open index file %s using index of 0\n", indexFilename) log.Printf("Unable to open index file %s using index of 0\n", indexFilename)
fileIndexNumber=0 fileIndexNumber = 0
} else { } else {
_, err := fmt.Fscanf(f,"%d\n",&fileIndexNumber) _, err := fmt.Fscanf(f, "%d\n", &fileIndexNumber)
if err != nil { if err != nil {
log.Printf("Unable to read index file %s using index of 0\n", indexFilename) log.Printf("Unable to read index file %s using index of 0\n", indexFilename)
} }
f.Close() f.Close()
fileIndexNumber++ fileIndexNumber++
} }
fo, err := os.Create(indexFilename) fo, err := os.Create(indexFilename)
if err != nil { if err != nil {
log.Printf("Error creating index file %s\n", indexFilename) log.Printf("Error creating index file %s\n", indexFilename)
} }
_, err2 := fmt.Fprintf(fo,"%d\n",fileIndexNumber) _, err2 := fmt.Fprintf(fo, "%d\n", fileIndexNumber)
if err2 != nil { if err2 != nil {
log.Printf("Error writing to index file %s\n", indexFilename) log.Printf("Error writing to index file %s\n", indexFilename)
} }
fo.Sync() fo.Sync()
fo.Close() fo.Close()
if developerMode == true { if developerMode == true {
uatReplayLog = fmt.Sprintf("%s/%04d-uat.log",logDirectory,fileIndexNumber) uatReplayLog = fmt.Sprintf("%s/%04d-uat.log", logDirectory, fileIndexNumber)
esReplayLog = fmt.Sprintf("%s/%04d-es.log",logDirectory,fileIndexNumber) esReplayLog = fmt.Sprintf("%s/%04d-es.log", logDirectory, fileIndexNumber)
gpsReplayLog = fmt.Sprintf("%s/%04d-gps.log",logDirectory,fileIndexNumber) gpsReplayLog = fmt.Sprintf("%s/%04d-gps.log", logDirectory, fileIndexNumber)
ahrsReplayLog = fmt.Sprintf("%s/%04d-ahrs.log",logDirectory,fileIndexNumber) ahrsReplayLog = fmt.Sprintf("%s/%04d-ahrs.log", logDirectory, fileIndexNumber)
dump1090ReplayLog = fmt.Sprintf("%s/%04d-dump1090.log",logDirectory,fileIndexNumber) dump1090ReplayLog = fmt.Sprintf("%s/%04d-dump1090.log", logDirectory, fileIndexNumber)
} else { } else {
uatReplayLog = fmt.Sprintf("%s/%04d-uat.log.gz",logDirectory,fileIndexNumber) uatReplayLog = fmt.Sprintf("%s/%04d-uat.log.gz", logDirectory, fileIndexNumber)
esReplayLog = fmt.Sprintf("%s/%04d-es.log.gz",logDirectory,fileIndexNumber) esReplayLog = fmt.Sprintf("%s/%04d-es.log.gz", logDirectory, fileIndexNumber)
gpsReplayLog = fmt.Sprintf("%s/%04d-gps.log.gz",logDirectory,fileIndexNumber) gpsReplayLog = fmt.Sprintf("%s/%04d-gps.log.gz", logDirectory, fileIndexNumber)
ahrsReplayLog = fmt.Sprintf("%s/%04d-ahrs.log.gz",logDirectory,fileIndexNumber) ahrsReplayLog = fmt.Sprintf("%s/%04d-ahrs.log.gz", logDirectory, fileIndexNumber)
dump1090ReplayLog = fmt.Sprintf("%s/%04d-dump1090.log.gz",logDirectory,fileIndexNumber) dump1090ReplayLog = fmt.Sprintf("%s/%04d-dump1090.log.gz", logDirectory, fileIndexNumber)
} }
} }
@ -562,42 +561,24 @@ func replayLog(msg string, msgclass int) {
if len(msg) == 0 { // Blank message. if len(msg) == 0 { // Blank message.
return return
} }
var fp *os.File var fp WriteCloser
var wt *gzip.Writer
if developerMode == true { switch msgclass {
switch msgclass { case MSGCLASS_UAT:
case MSGCLASS_UAT: fp = uatReplayWriter
fp = uatReplayWriter case MSGCLASS_ES:
case MSGCLASS_ES: fp = esReplayWriter
fp = esReplayWriter case MSGCLASS_GPS:
case MSGCLASS_GPS: fp = gpsReplayWriter
fp = gpsReplayWriter case MSGCLASS_AHRS:
case MSGCLASS_AHRS: fp = ahrsReplayWriter
fp = ahrsReplayWriter case MSGCLASS_DUMP1090:
case MSGCLASS_DUMP1090: fp = dump1090ReplayWriter
fp = dump1090ReplayWriter }
}
if fp != nil { if fp != nil {
s := makeReplayLogEntry(msg) s := makeReplayLogEntry(msg)
fp.Write([]byte(s)) fp.Write([]byte(s))
}
} else {
switch msgclass {
case MSGCLASS_UAT:
wt = uatReplayWriterGzip
case MSGCLASS_ES:
wt = esReplayWriterGzip
case MSGCLASS_GPS:
wt = gpsReplayWriterGzip
case MSGCLASS_AHRS:
wt = ahrsReplayWriterGzip
case MSGCLASS_DUMP1090:
wt = dump1090ReplayWriterGzip
}
if wt != nil {
s := makeReplayLogEntry(msg)
wt.Write([]byte(s))
}
} }
} }
@ -914,31 +895,26 @@ func replayMark(active bool) {
} }
func openReplay(fn string) (*os.File, error) { func openReplay(fn string, compressed bool) (WriteCloser, error) {
fp, err := os.OpenFile(fn, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666) fp, err := os.OpenFile(fn, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
if err != nil { if err != nil {
log.Printf("Failed to open log file '%s': %s\n", fn, err.Error()) log.Printf("Failed to open log file '%s': %s\n", fn, err.Error())
return nil, err return nil, err
}
var ret WriteCloser
if compressed {
ret = gzip.NewWriter(fp) //FIXME: Close() on the gzip.Writer will not close the underlying file.
} else { } else {
timeFmt := "Mon Jan 2 15:04:05 -0700 MST 2006" ret = fp
fmt.Fprintf(fp, "START,%s,%s\n", timeStarted.Format(timeFmt), time.Now().Format(timeFmt)) // Start time marker.
} }
return fp, err
}
func openReplayGzip(fn string) (*gzip.Writer, error) {
fp, err := os.OpenFile(fn, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
if err != nil {
log.Printf("Failed to open log file '%s': %s\n", fn, err.Error())
return nil, err
}
gzw := gzip.NewWriter(fp) //FIXME: Close() on the gzip.Writer will not close the underlying file.
timeFmt := "Mon Jan 2 15:04:05 -0700 MST 2006" timeFmt := "Mon Jan 2 15:04:05 -0700 MST 2006"
s := fmt.Sprintf("START,%s,%s\n", timeStarted.Format(timeFmt), time.Now().Format(timeFmt)) // Start time marker. s := fmt.Sprintf("START,%s,%s\n", timeStarted.Format(timeFmt), time.Now().Format(timeFmt)) // Start time marker.
gzw.Write([]byte(s))
return gzw, err ret.Write([]byte(s))
return ret, err
} }
func printStats() { func printStats() {
@ -999,8 +975,6 @@ func uatReplay(f *os.File, replaySpeed uint64) {
uatReplayDone = true uatReplayDone = true
} }
func openReplayFile(fn string) *os.File { func openReplayFile(fn string) *os.File {
f, err := os.Open(fn) f, err := os.Open(fn)
if err != nil { if err != nil {
@ -1011,25 +985,24 @@ func openReplayFile(fn string) *os.File {
return f return f
} }
func main() { func main() {
// replayESFilename := flag.String("eslog", "none", "ES Log filename") // replayESFilename := flag.String("eslog", "none", "ES Log filename")
replayUATFilename := flag.String("uatlog", "none", "UAT Log filename") replayUATFilename := flag.String("uatlog", "none", "UAT Log filename")
develFlag := flag.Bool("developer", false, "Developer mode") develFlag := flag.Bool("developer", false, "Developer mode")
replayFlag := flag.Bool("replay", false, "Replay file flag") replayFlag := flag.Bool("replay", false, "Replay file flag")
replaySpeed := flag.Int("speed", 1, "Replay speed multiplier") replaySpeed := flag.Int("speed", 1, "Replay speed multiplier")
flag.Parse() flag.Parse()
timeStarted = time.Now() timeStarted = time.Now()
runtime.GOMAXPROCS(runtime.NumCPU()) // redundant with Go v1.5+ compiler runtime.GOMAXPROCS(runtime.NumCPU()) // redundant with Go v1.5+ compiler
if *develFlag == true { if *develFlag == true {
log.Printf("Developer mode flag true!\n") log.Printf("Developer mode flag true!\n")
developerMode=true developerMode = true
} }
// Duplicate log.* output to debugLog. // Duplicate log.* output to debugLog.
fp, err := os.OpenFile(debugLog, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666) fp, err := os.OpenFile(debugLog, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
if err != nil { if err != nil {
@ -1042,18 +1015,18 @@ func main() {
log.Printf("Stratux %s (%s) starting.\n", stratuxVersion, stratuxBuild) log.Printf("Stratux %s (%s) starting.\n", stratuxVersion, stratuxBuild)
constructFilenames() constructFilenames()
ADSBTowers = make(map[string]ADSBTower) ADSBTowers = make(map[string]ADSBTower)
MsgLog = make([]msg, 0) MsgLog = make([]msg, 0)
crcInit() // Initialize CRC16 table. crcInit() // Initialize CRC16 table.
if *replayFlag == true { if *replayFlag == true {
// if (*replayESFilename == "none") || (*replayUATFilename == "none") { // if (*replayESFilename == "none") || (*replayUATFilename == "none") {
// log.Fatal("Must specify both UAT and ES log files\n") // log.Fatal("Must specify both UAT and ES log files\n")
// } // }
log.Printf("Replay file %s\n", *replayUATFilename) log.Printf("Replay file %s\n", *replayUATFilename)
} }
sdrInit() sdrInit()
initTraffic() initTraffic()
@ -1063,78 +1036,41 @@ func main() {
// Set up the replay logs. Keep these files open in any case, even if replay logging is disabled. // Set up the replay logs. Keep these files open in any case, even if replay logging is disabled.
// UAT replay log. if uatwt, err := openReplay(uatReplayLog, !developerMode); err != nil {
if developerMode == true { globalSettings.ReplayLog = false
if uatwt, err := openReplay(uatReplayLog); err != nil {
globalSettings.ReplayLog = false
} else {
uatReplayWriter = uatwt
defer uatReplayWriter.Close()
}
// 1090ES replay log.
if eswt, err := openReplay(esReplayLog); err != nil {
globalSettings.ReplayLog = false
} else {
esReplayWriter = eswt
defer esReplayWriter.Close()
}
// GPS replay log.
if gpswt, err := openReplay(gpsReplayLog); err != nil {
globalSettings.ReplayLog = false
} else {
gpsReplayWriter = gpswt
defer gpsReplayWriter.Close()
}
// AHRS replay log.
if ahrswt, err := openReplay(ahrsReplayLog); err != nil {
globalSettings.ReplayLog = false
} else {
ahrsReplayWriter = ahrswt
defer ahrsReplayWriter.Close()
}
// Dump1090 replay log.
if dump1090wt, err := openReplay(dump1090ReplayLog); err != nil {
globalSettings.ReplayLog = false
} else {
dump1090ReplayWriter = dump1090wt
defer dump1090ReplayWriter.Close()
}
} else { } else {
if uatwt, err := openReplayGzip(uatReplayLog); err != nil { uatReplayWriter = uatwt
globalSettings.ReplayLog = false defer uatReplayWriter.Close()
} else {
uatReplayWriterGzip = uatwt
defer uatReplayWriterGzip.Close()
}
// 1090ES replay log.
if eswt, err := openReplayGzip(esReplayLog); err != nil {
globalSettings.ReplayLog = false
} else {
esReplayWriterGzip = eswt
defer esReplayWriterGzip.Close()
}
// GPS replay log.
if gpswt, err := openReplayGzip(gpsReplayLog); err != nil {
globalSettings.ReplayLog = false
} else {
gpsReplayWriterGzip = gpswt
defer gpsReplayWriterGzip.Close()
}
// AHRS replay log.
if ahrswt, err := openReplayGzip(ahrsReplayLog); err != nil {
globalSettings.ReplayLog = false
} else {
ahrsReplayWriterGzip = ahrswt
defer ahrsReplayWriterGzip.Close()
}
// Dump1090 replay log.
if dump1090wt, err := openReplayGzip(dump1090ReplayLog); err != nil {
globalSettings.ReplayLog = false
} else {
dump1090ReplayWriterGzip = dump1090wt
defer dump1090ReplayWriterGzip.Close()
}
} }
// 1090ES replay log.
if eswt, err := openReplay(esReplayLog, !developerMode); err != nil {
globalSettings.ReplayLog = false
} else {
esReplayWriter = eswt
defer esReplayWriter.Close()
}
// GPS replay log.
if gpswt, err := openReplay(gpsReplayLog, !developerMode); err != nil {
globalSettings.ReplayLog = false
} else {
gpsReplayWriter = gpswt
defer gpsReplayWriter.Close()
}
// AHRS replay log.
if ahrswt, err := openReplay(ahrsReplayLog, !developerMode); err != nil {
globalSettings.ReplayLog = false
} else {
ahrsReplayWriter = ahrswt
defer ahrsReplayWriter.Close()
}
// Dump1090 replay log.
if dump1090wt, err := openReplay(dump1090ReplayLog, !developerMode); err != nil {
globalSettings.ReplayLog = false
} else {
dump1090ReplayWriter = dump1090wt
defer dump1090ReplayWriter.Close()
}
// Mark the files (whether we're logging or not). // Mark the files (whether we're logging or not).
replayMark(globalSettings.ReplayLog) replayMark(globalSettings.ReplayLog)
@ -1158,24 +1094,24 @@ func main() {
if *replayFlag == true { if *replayFlag == true {
f := openReplayFile(*replayUATFilename) f := openReplayFile(*replayUATFilename)
// if len(os.Args) >= 4 { // if len(os.Args) >= 4 {
// i, err := strconv.ParseUint(os.Args[3], 10, 64) // i, err := strconv.ParseUint(os.Args[3], 10, 64)
// if err == nil { // if err == nil {
// replaySpeed = i // replaySpeed = i
// } // }
// } // }
playSpeed := uint64(*replaySpeed) playSpeed := uint64(*replaySpeed)
fmt.Fprintf(os.Stderr, "Replay speed: %dx\n", playSpeed) fmt.Fprintf(os.Stderr, "Replay speed: %dx\n", playSpeed)
go uatReplay(f, playSpeed) go uatReplay(f, playSpeed)
// go esReplay(f2, playSpeed) // go esReplay(f2, playSpeed)
for { for {
time.Sleep(1 * time.Second) time.Sleep(1 * time.Second)
if uatReplayDone { if uatReplayDone {
//&& esDone { //&& esDone {
return return
} }
} }
} else { } else {
for { for {
buf, err := reader.ReadString('\n') buf, err := reader.ReadString('\n')