From a603653ac94368ed0a8124fad92562278d4de6e1 Mon Sep 17 00:00:00 2001 From: Christopher Young Date: Thu, 10 Sep 2015 20:43:32 -0400 Subject: [PATCH] godump978 and gortlsdr integration for UAT. globalStatus.Devices implemented. Auto retry, on SDR error, etc. --- Makefile | 2 +- main/gen_gdl90.go | 1 + main/sdr.go | 162 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 164 insertions(+), 1 deletion(-) create mode 100644 main/sdr.go diff --git a/Makefile b/Makefile index 1a734f7e..57f1131d 100644 --- a/Makefile +++ b/Makefile @@ -4,7 +4,7 @@ GOARM ?= 7 all: GOOS=$(GOOS) GOARCH=$(GOARCH) GOARM=$(GOARM) go get -t -d -v ./... - GOOS=$(GOOS) GOARCH=$(GOARCH) GOARM=$(GOARM) go build main/gen_gdl90.go main/traffic.go main/ry835ai.go main/network.go main/managementinterface.go + GOOS=$(GOOS) GOARCH=$(GOARCH) GOARM=$(GOARM) go build main/gen_gdl90.go main/traffic.go main/ry835ai.go main/network.go main/managementinterface.go main/sdr.go test: sh -c true diff --git a/main/gen_gdl90.go b/main/gen_gdl90.go index caed5dcc..b21f7f81 100644 --- a/main/gen_gdl90.go +++ b/main/gen_gdl90.go @@ -585,6 +585,7 @@ func main() { MsgLog = make([]msg, 0) crcInit() // Initialize CRC16 table. + sdrInit() initTraffic() globalStatus.Version = stratuxVersion diff --git a/main/sdr.go b/main/sdr.go new file mode 100644 index 00000000..00901a6f --- /dev/null +++ b/main/sdr.go @@ -0,0 +1,162 @@ +package main + + +import ( + "../godump978" + "log" + "time" + rtl "github.com/jpoirier/gortlsdr" +) + +var uatSDR int // Index. +var esSDR int // Index. + +// Read 978MHz from SDR. +func sdrReader() { + var err error + var dev *rtl.Context + + log.Printf("===== UAT Device name: %s =====\n", rtl.GetDeviceName(uatSDR)) + if dev, err = rtl.Open(uatSDR); err != nil { + log.Printf("\tOpen Failed, exiting\n") + uatSDR = -1 + return + } + defer dev.Close() + m, p, s, err := dev.GetUsbStrings() + if err != nil { + log.Printf("\tGetUsbStrings Failed - error: %s\n", err) + } else { + log.Printf("\tGetUsbStrings - %s %s %s\n", m, p, s) + } + log.Printf("\tGetTunerType: %s\n", dev.GetTunerType()) + + //---------- Set Tuner Gain ---------- + tgain := 480 + + err = dev.SetTunerGainMode(true) + if err != nil { + log.Printf("\tSetTunerGainMode Failed - error: %s\n", err) + } else { + log.Printf("\tSetTunerGainMode Successful\n") + } + + err = dev.SetTunerGain(tgain) + if err != nil { + log.Printf("\tSetTunerGain Failed - error: %s\n", err) + } else { + log.Printf("\tSetTunerGain Successful\n") + } + + //---------- Get/Set Sample Rate ---------- + samplerate := 2083334 + err = dev.SetSampleRate(samplerate) + if err != nil { + log.Printf("\tSetSampleRate Failed - error: %s\n", err) + } else { + log.Printf("\tSetSampleRate - rate: %d\n", samplerate) + } + log.Printf("\tGetSampleRate: %d\n", dev.GetSampleRate()) + + //---------- Get/Set Xtal Freq ---------- + rtlFreq, tunerFreq, err := dev.GetXtalFreq() + if err != nil { + log.Printf("\tGetXtalFreq Failed - error: %s\n", err) + } else { + log.Printf("\tGetXtalFreq - Rtl: %d, Tuner: %d\n", rtlFreq, tunerFreq) + } + + newRTLFreq := 28800000 + newTunerFreq := 28800000 + err = dev.SetXtalFreq(newRTLFreq, newTunerFreq) + if err != nil { + log.Printf("\tSetXtalFreq Failed - error: %s\n", err) + } else { + log.Printf("\tSetXtalFreq - Center freq: %d, Tuner freq: %d\n", + newRTLFreq, newTunerFreq) + } + + //---------- Get/Set Center Freq ---------- + err = dev.SetCenterFreq(978000000) + if err != nil { + log.Printf("\tSetCenterFreq 978MHz Failed, error: %s\n", err) + } else { + log.Printf("\tSetCenterFreq 978MHz Successful\n") + } + + log.Printf("\tGetCenterFreq: %d\n", dev.GetCenterFreq()) + + //---------- Set Bandwidth ---------- + bw := 1000000 + log.Printf("\tSetting Bandwidth: %d\n", bw) + if err = dev.SetTunerBw(bw); err != nil { + log.Printf("\tSetTunerBw %d Failed, error: %s\n", bw, err) + } else { + log.Printf("\tSetTunerBw %d Successful\n", bw) + } + + if err = dev.ResetBuffer(); err == nil { + log.Printf("\tResetBuffer Successful\n") + } else { + log.Printf("\tResetBuffer Failed - error: %s\n", err) + } + + for uatSDR != -1 { + var buffer = make([]uint8, rtl.DefaultBufLength) + nRead, err := dev.ReadSync(buffer, rtl.DefaultBufLength) + if err != nil { + log.Printf("\tReadSync Failed - error: %s\n", err) + uatSDR = -1 + break + } else { +// log.Printf("\tReadSync %d\n", nRead) + buf := buffer[:nRead] + godump978.InChan <- buf + } + } +} + +// Read from the godump978 channel - on or off. +func uatReader() { + for { + uat := <-godump978.OutChan + o, msgtype := parseInput(uat) + if o != nil && msgtype != 0 { + relayMessage(msgtype, o) + } + } +} + +// Watch for config/device changes. +func sdrWatcher() { + timer := time.NewTicker(1 * time.Second) + for { + <-timer.C + // Update device count. + globalStatus.Devices = uint(rtl.GetDeviceCount()) + + if uatSDR == -1 && globalSettings.UAT_Enabled { + if globalStatus.Devices == 0 { + log.Printf("No RTL-SDR devices.\n") + continue + } + uatSDR = 0 + go sdrReader() + } + if esSDR == -1 && globalSettings.ES_Enabled { + if globalStatus.Devices == 0 || (globalStatus.Devices == 1 && globalSettings.UAT_Enabled) { + log.Printf("Not enough RTL-SDR devices.\n") + } + esSDR = 1 + } + } +} + +func sdrInit() { + uatSDR = -1 + esSDR = -1 + go sdrWatcher() + go uatReader() + godump978.Dump978Init() + go godump978.ProcessDataFromChannel() +} \ No newline at end of file