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"
@ -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,21 +115,20 @@ 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)
} }
@ -140,24 +139,24 @@ func constructFilenames() {
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,9 +561,8 @@ 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
@ -577,28 +575,11 @@ func replayLog(msg string, msgclass int) {
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))
}
}
} }
type WeatherMessage struct { type WeatherMessage struct {
@ -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,10 +985,9 @@ 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")
@ -1027,7 +1000,7 @@ func main() {
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.
@ -1048,9 +1021,9 @@ func main() {
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)
} }
@ -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 {
if uatwt, err := openReplay(uatReplayLog); err != nil {
globalSettings.ReplayLog = false globalSettings.ReplayLog = false
} else { } else {
uatReplayWriter = uatwt uatReplayWriter = uatwt
defer uatReplayWriter.Close() defer uatReplayWriter.Close()
} }
// 1090ES replay log. // 1090ES replay log.
if eswt, err := openReplay(esReplayLog); err != nil { if eswt, err := openReplay(esReplayLog, !developerMode); err != nil {
globalSettings.ReplayLog = false globalSettings.ReplayLog = false
} else { } else {
esReplayWriter = eswt esReplayWriter = eswt
defer esReplayWriter.Close() defer esReplayWriter.Close()
} }
// GPS replay log. // GPS replay log.
if gpswt, err := openReplay(gpsReplayLog); err != nil { if gpswt, err := openReplay(gpsReplayLog, !developerMode); err != nil {
globalSettings.ReplayLog = false globalSettings.ReplayLog = false
} else { } else {
gpsReplayWriter = gpswt gpsReplayWriter = gpswt
defer gpsReplayWriter.Close() defer gpsReplayWriter.Close()
} }
// AHRS replay log. // AHRS replay log.
if ahrswt, err := openReplay(ahrsReplayLog); err != nil { if ahrswt, err := openReplay(ahrsReplayLog, !developerMode); err != nil {
globalSettings.ReplayLog = false globalSettings.ReplayLog = false
} else { } else {
ahrsReplayWriter = ahrswt ahrsReplayWriter = ahrswt
defer ahrsReplayWriter.Close() defer ahrsReplayWriter.Close()
} }
// Dump1090 replay log. // Dump1090 replay log.
if dump1090wt, err := openReplay(dump1090ReplayLog); err != nil { if dump1090wt, err := openReplay(dump1090ReplayLog, !developerMode); err != nil {
globalSettings.ReplayLog = false globalSettings.ReplayLog = false
} else { } else {
dump1090ReplayWriter = dump1090wt dump1090ReplayWriter = dump1090wt
defer dump1090ReplayWriter.Close() defer dump1090ReplayWriter.Close()
} }
} else {
if uatwt, err := openReplayGzip(uatReplayLog); err != nil {
globalSettings.ReplayLog = false
} 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()
}
}
// 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,16 +1094,16 @@ 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 {