kopia lustrzana https://github.com/cyoung/stratux
cleanup and idiomatic code in prep for #239
rodzic
cebb1ba103
commit
e9221e5097
|
@ -73,6 +73,8 @@ const (
|
|||
TRACK_RESOLUTION = float32(360.0 / 256.0)
|
||||
)
|
||||
|
||||
var maxSignalStrength int
|
||||
|
||||
var uatReplayLog string
|
||||
var esReplayLog string
|
||||
var gpsReplayLog string
|
||||
|
|
181
main/sdr.go
181
main/sdr.go
|
@ -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()
|
||||
}
|
||||
}
|
||||
|
|
Ładowanie…
Reference in New Issue