cleanup and idiomatic code in prep for #239

pull/274/head
Joseph Poirier 2016-02-21 10:40:14 -06:00
rodzic cebb1ba103
commit e9221e5097
2 zmienionych plików z 87 dodań i 96 usunięć

Wyświetl plik

@ -73,6 +73,8 @@ const (
TRACK_RESOLUTION = float32(360.0 / 256.0)
)
var maxSignalStrength int
var uatReplayLog string
var esReplayLog string
var gpsReplayLog string

Wyświetl plik

@ -24,30 +24,18 @@ import (
rtl "github.com/jpoirier/gortlsdr"
)
type UAT struct {
type Device struct {
dev *rtl.Context
wg *sync.WaitGroup
closeCh chan int
indexID int
ppm int
serial string
hasID bool
}
type ES struct {
dev *rtl.Context
indexID int
ppm int
serial string
}
var UATDev *UAT
var ESDev *ES
var uat_shutdown chan int
var uat_wg *sync.WaitGroup = &sync.WaitGroup{}
var es_shutdown chan int
var es_wg *sync.WaitGroup = &sync.WaitGroup{}
var maxSignalStrength int
var UATDev *Device
var ESDev *Device
func readToChan(fp io.ReadCloser, ch chan []byte) {
for {
@ -62,7 +50,7 @@ func readToChan(fp io.ReadCloser, ch chan []byte) {
}
func (e *ES) read() {
defer es_wg.Done()
defer e.wg.Done()
log.Println("Entered ES read() ...")
cmd := exec.Command("/usr/bin/dump1090", "--net", "--device-index", strconv.Itoa(e.indexID), "--ppm", strconv.Itoa(e.ppm))
stdout, _ := cmd.StdoutPipe()
@ -84,8 +72,7 @@ func (e *ES) read() {
select {
case buf := <-outputChan:
replayLog(string(buf), MSGCLASS_DUMP1090)
case <-es_shutdown:
case <-e.closeCh:
log.Println("ES read(): shutdown msg received, calling cmd.Process.Kill() ...")
err := cmd.Process.Kill()
if err != nil {
@ -97,13 +84,12 @@ func (e *ES) read() {
return
default:
time.Sleep(1 * time.Second)
}
}
}
func (u *UAT) read() {
defer uat_wg.Done()
defer u.wg.Done()
log.Println("Entered UAT read() ...")
var buffer = make([]uint8, rtl.DefaultBufLength)
@ -120,7 +106,7 @@ func (u *UAT) read() {
buf := buffer[:nRead]
godump978.InChan <- buf
}
case <-uat_shutdown:
case <-u.closeCh:
log.Println("UAT read(): shutdown msg received...")
return
}
@ -128,21 +114,21 @@ func (u *UAT) read() {
}
func getPPM(serial string) int {
r, err := regexp.Compile("str?a?t?u?x:\\d+:?(-?\\d*)");
r, err := regexp.Compile("str?a?t?u?x:\\d+:?(-?\\d*)")
if err != nil {
return globalSettings.PPM
}
arr := r.FindStringSubmatch(serial);
arr := r.FindStringSubmatch(serial)
if arr == nil {
return globalSettings.PPM
}
if ppm, err := strconv.Atoi(arr[1]); err != nil {
return globalSettings.PPM
} else {
return ppm
}
if ppm, err := strconv.Atoi(arr[1]); err != nil {
return globalSettings.PPM
} else {
return ppm
}
}
func (e *ES) sdrConfig() (err error) {
@ -150,9 +136,17 @@ func (e *ES) sdrConfig() (err error) {
return
}
const (
TunerGain = 480
SampleRate = 2083334
NewRTLFreq = 28800000
NewTunerFreq = 28800000
CenterFreq = 978000000
Bandwidth = 1000000
)
func (u *UAT) sdrConfig() (err error) {
log.Printf("===== UAT Device name: %s =====\n", rtl.GetDeviceName(u.indexID))
u.ppm = getPPM(u.serial)
if u.dev, err = rtl.Open(u.indexID); err != nil {
log.Printf("\tUAT Open Failed...\n")
@ -170,8 +164,7 @@ func (u *UAT) sdrConfig() (err error) {
log.Printf("\tSetTunerGainMode Successful\n")
}
tgain := 480
err = u.dev.SetTunerGain(tgain)
err = u.dev.SetTunerGain(TunerGain)
if err != nil {
u.dev.Close()
log.Printf("\tSetTunerGain Failed - error: %s\n", err)
@ -181,14 +174,13 @@ func (u *UAT) sdrConfig() (err error) {
}
//---------- Get/Set Sample Rate ----------
samplerate := 2083334
err = u.dev.SetSampleRate(samplerate)
err = u.dev.SetSampleRate(SampleRate)
if err != nil {
u.dev.Close()
log.Printf("\tSetSampleRate Failed - error: %s\n", err)
return
} else {
log.Printf("\tSetSampleRate - rate: %d\n", samplerate)
log.Printf("\tSetSampleRate - rate: %d\n", SampleRate)
}
log.Printf("\tGetSampleRate: %d\n", u.dev.GetSampleRate())
@ -202,20 +194,18 @@ func (u *UAT) sdrConfig() (err error) {
log.Printf("\tGetXtalFreq - Rtl: %d, Tuner: %d\n", rtlFreq, tunerFreq)
}
newRTLFreq := 28800000
newTunerFreq := 28800000
err = u.dev.SetXtalFreq(newRTLFreq, newTunerFreq)
err = u.dev.SetXtalFreq(NewRTLFreq, NewTunerFreq)
if err != nil {
u.dev.Close()
log.Printf("\tSetXtalFreq Failed - error: %s\n", err)
return
} else {
log.Printf("\tSetXtalFreq - Center freq: %d, Tuner freq: %d\n",
newRTLFreq, newTunerFreq)
NewRTLFreq, NewTunerFreq)
}
//---------- Get/Set Center Freq ----------
err = u.dev.SetCenterFreq(978000000)
err = u.dev.SetCenterFreq(CenterFreq)
if err != nil {
u.dev.Close()
log.Printf("\tSetCenterFreq 978MHz Failed, error: %s\n", err)
@ -227,14 +217,13 @@ func (u *UAT) sdrConfig() (err error) {
log.Printf("\tGetCenterFreq: %d\n", u.dev.GetCenterFreq())
//---------- Set Bandwidth ----------
bw := 1000000
log.Printf("\tSetting Bandwidth: %d\n", bw)
if err = u.dev.SetTunerBw(bw); err != nil {
log.Printf("\tSetting Bandwidth: %d\n", Bandwidth)
if err = u.dev.SetTunerBw(Bandwidth); err != nil {
u.dev.Close()
log.Printf("\tSetTunerBw %d Failed, error: %s\n", bw, err)
log.Printf("\tSetTunerBw %d Failed, error: %s\n", Bandwidth, err)
return
} else {
log.Printf("\tSetTunerBw %d Successful\n", bw)
log.Printf("\tSetTunerBw %d Successful\n", Bandwidth)
}
if err = u.dev.ResetBuffer(); err != nil {
@ -244,9 +233,11 @@ func (u *UAT) sdrConfig() (err error) {
} else {
log.Printf("\tResetBuffer Successful\n")
}
//---------- Get/Set Freq Correction ----------
freqCorr := u.dev.GetFreqCorrection()
log.Printf("\tGetFreqCorrection: %d\n", freqCorr)
u.ppm = getPPM(u.serial)
err = u.dev.SetFreqCorrection(u.ppm)
if err != nil {
u.dev.Close()
@ -290,24 +281,22 @@ func (e *ES) writeID() error {
func (u *UAT) shutdown() {
log.Println("Entered UAT shutdown() ...")
close(uat_shutdown) // signal to shutdown
log.Println("UAT shutdown(): calling uat_wg.Wait() ...")
uat_wg.Wait() // Wait for the goroutine to shutdown
log.Println("UAT shutdown(): uat_wg.Wait() returned...")
close(u.closeCh) // signal to shutdown
log.Println("UAT shutdown(): calling u.wg.Wait() ...")
u.wg.Wait() // Wait for the goroutine to shutdown
log.Println("UAT shutdown(): u.wg.Wait() returned...")
log.Println("UAT shutdown(): closing device ...")
u.dev.Close() // preempt the blocking ReadSync call
}
func (e *ES) shutdown() {
log.Println("Entered ES shutdown() ...")
close(es_shutdown) // signal to shutdown
log.Println("ES shutdown(): calling es_wg.Wait() ...")
es_wg.Wait() // Wait for the goroutine to shutdown
log.Println("ES shutdown(): es_wg.Wait() returned...")
close(e.closeCh) // signal to shutdown
log.Println("ES shutdown(): calling e.wg.Wait() ...")
e.wg.Wait() // Wait for the goroutine to shutdown
log.Println("ES shutdown(): e.wg.Wait() returned...")
}
var devMap = map[int]string{0: "", 1: ""}
var sdrShutdown bool
func sdrKill() {
@ -319,20 +308,30 @@ func sdrKill() {
}
}
type rUAT regexp.Regexp
func (r *rUAT) hasID(serial string) bool {
if r == nil {
return !strings.HasPrefix(serial, "stratux:978")
}
return r.MatchString(serial)
}
type rES regexp.Regexp
func (r *rES) hasID(serial string) bool {
if r == nil {
return strings.HasPrefix(serial, "stratux:1090")
}
return r.MatchString(serial)
}
// Watch for config/device changes.
func sdrWatcher() {
var doSkip bool
rES, err := regexp.Compile("str?a?t?u?x:1090")
if err != nil {
rES = nil
log.Println("failed to compile ES regexp because %s", err.Error())
}
rUAT, err := regexp.Compile("str?a?t?u?x:978")
if err != nil {
rUAT = nil
log.Println("failed to compile UAT regexp because %s", err.Error())
}
// Compile returns a nil pointer when it fails and
// we do the nil check in the hasID method
rES, _ = regexp.Compile("str?a?t?u?x:1090")
rUAT, _ = regexp.Compile("str?a?t?u?x:978")
for {
time.Sleep(1 * time.Second)
@ -349,7 +348,6 @@ func sdrWatcher() {
}
count := rtl.GetDeviceCount()
atomic.StoreUint32(&globalStatus.Devices, uint32(count))
// log.Println("DeviceCount...", count)
// support two and only two dongles
if count > 2 {
@ -358,7 +356,6 @@ func sdrWatcher() {
// cleanup if necessary
if count < 1 || (!globalSettings.UAT_Enabled && !globalSettings.ES_Enabled) {
// log.Println("count == 0, doing cleanup if necessary...")
if UATDev != nil {
UATDev.shutdown()
UATDev = nil
@ -371,7 +368,13 @@ func sdrWatcher() {
}
if count == 1 {
if UATDev != nil && ESDev == nil {
if UATDev != nil && ESDev != nil {
// this is a bit heavy handed but we shouldn't be in this state
ESDev.shutdown()
ESDev = nil
UATDev.shutdown()
UATDev = nil
} else if UATDev != nil && ESDev == nil {
UATDev.indexID = 0
} else if UATDev == nil && ESDev != nil {
ESDev.indexID = 0
@ -381,9 +384,8 @@ func sdrWatcher() {
// UAT specific handling
// When count is one, favor UAT in the case where the user
// has enabled both UAT and ES via the web interface.
id := 0
if globalSettings.UAT_Enabled {
// log.Println("globalSettings.UAT_Enabled == true")
id := 0
if count == 1 {
if ESDev != nil {
ESDev.shutdown()
@ -403,20 +405,14 @@ func sdrWatcher() {
serial = ""
}
if (rES != nil) {
doSkip = rES.MatchString(serial)
} else {
doSkip = strings.Compare(serial, "stratux:1090") == 0
}
if !doSkip {
UATDev = &UAT{indexID: id, serial: serial}
if !!rES.hasID(serial) {
UATDev = &Device{indexID: id, serial: serial, wg: &sync.WaitGroup{}}
if err := UATDev.sdrConfig(); err != nil {
log.Printf("UATDev = &UAT{indexID: id} failed: %s\n", err)
UATDev = nil
} else {
uat_shutdown = make(chan int)
uat_wg.Add(1)
UATDev.closeCh = make(chan int)
UATDev.wg.Add(1)
go UATDev.read()
}
}
@ -430,9 +426,8 @@ func sdrWatcher() {
}
// ES specific handling
id = 0
if globalSettings.ES_Enabled {
// log.Println("globalSettings.ES_Enabled == true")
id := 0
if count == 1 {
if globalSettings.UAT_Enabled {
// defer to the UAT handler
@ -452,20 +447,14 @@ func sdrWatcher() {
serial = ""
}
if (rUAT != nil) {
doSkip = rUAT.MatchString(serial)
} else {
doSkip = strings.Compare(serial, "stratux:978") == 0
}
if !doSkip {
ESDev = &ES{indexID: id, serial: serial}
if !!rUAT.hasID(serial) {
ESDev = &Device{indexID: id, serial: serial, wg: &sync.WaitGroup{}}
if err := ESDev.sdrConfig(); err != nil {
log.Printf("ESDev = &ES{indexID: id} failed: %s\n", err)
ESDev = nil
} else {
es_shutdown = make(chan int)
es_wg.Add(1)
ESDev.closeCh = make(chan int)
ESDev.wg.Add(1)
go ESDev.read()
}
}