Compare commits
1 commit
master
...
raspberryp
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c2fca58625 |
1 changed files with 40 additions and 52 deletions
92
recv.go
92
recv.go
|
|
@ -24,7 +24,6 @@ import (
|
||||||
"log"
|
"log"
|
||||||
"os"
|
"os"
|
||||||
"os/signal"
|
"os/signal"
|
||||||
"runtime/pprof"
|
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
|
@ -32,13 +31,13 @@ import (
|
||||||
"github.com/bemasher/rtlamr/parse"
|
"github.com/bemasher/rtlamr/parse"
|
||||||
"github.com/bemasher/rtlamr/r900"
|
"github.com/bemasher/rtlamr/r900"
|
||||||
"github.com/bemasher/rtlamr/scm"
|
"github.com/bemasher/rtlamr/scm"
|
||||||
"github.com/bemasher/rtltcp"
|
"github.com/jpoirier/gortlsdr"
|
||||||
)
|
)
|
||||||
|
|
||||||
var rcvr Receiver
|
var rcvr Receiver
|
||||||
|
|
||||||
type Receiver struct {
|
type Receiver struct {
|
||||||
rtltcp.SDR
|
*rtlsdr.Context
|
||||||
p parse.Parser
|
p parse.Parser
|
||||||
fc parse.FilterChain
|
fc parse.FilterChain
|
||||||
}
|
}
|
||||||
|
|
@ -59,29 +58,14 @@ func (rcvr *Receiver) NewReceiver() {
|
||||||
rcvr.p.Log()
|
rcvr.p.Log()
|
||||||
}
|
}
|
||||||
|
|
||||||
// Connect to rtl_tcp server.
|
// Open rtl-sdr dongle.
|
||||||
if err := rcvr.Connect(nil); err != nil {
|
var err error
|
||||||
|
if rcvr.Context, err = rtlsdr.Open(0); err != nil {
|
||||||
log.Fatal(err)
|
log.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
rcvr.HandleFlags()
|
|
||||||
|
|
||||||
// Tell the user how many gain settings were reported by rtl_tcp.
|
|
||||||
if !*quiet {
|
|
||||||
log.Println("GainCount:", rcvr.SDR.Info.GainCount)
|
|
||||||
}
|
|
||||||
|
|
||||||
centerfreqFlagSet := false
|
|
||||||
sampleRateFlagSet := false
|
|
||||||
gainFlagSet := false
|
|
||||||
flag.Visit(func(f *flag.Flag) {
|
flag.Visit(func(f *flag.Flag) {
|
||||||
switch f.Name {
|
switch f.Name {
|
||||||
case "centerfreq":
|
|
||||||
centerfreqFlagSet = true
|
|
||||||
case "samplerate":
|
|
||||||
sampleRateFlagSet = true
|
|
||||||
case "gainbyindex", "tunergainmode", "tunergain", "agcmode":
|
|
||||||
gainFlagSet = true
|
|
||||||
case "unique":
|
case "unique":
|
||||||
rcvr.fc.Add(NewUniqueFilter())
|
rcvr.fc.Add(NewUniqueFilter())
|
||||||
case "filterid":
|
case "filterid":
|
||||||
|
|
@ -91,19 +75,20 @@ func (rcvr *Receiver) NewReceiver() {
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
// Set some parameters for listening.
|
if err := rcvr.SetCenterFreq(int(rcvr.p.Cfg().CenterFreq)); err != nil {
|
||||||
if centerfreqFlagSet {
|
log.Fatal(err)
|
||||||
rcvr.SetCenterFreq(uint32(rcvr.Flags.CenterFreq))
|
}
|
||||||
} else {
|
if err := rcvr.SetSampleRate(int(rcvr.p.Cfg().SampleRate)); err != nil {
|
||||||
rcvr.SetCenterFreq(rcvr.p.Cfg().CenterFreq)
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
if err := rcvr.SetTunerGainMode(false); err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if !sampleRateFlagSet {
|
log.Println(rcvr.GetCenterFreq())
|
||||||
rcvr.SetSampleRate(uint32(rcvr.p.Cfg().SampleRate))
|
log.Println(rcvr.GetSampleRate())
|
||||||
}
|
|
||||||
if !gainFlagSet {
|
rcvr.ResetBuffer()
|
||||||
rcvr.SetGainMode(true)
|
|
||||||
}
|
|
||||||
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
@ -120,18 +105,23 @@ func (rcvr *Receiver) Run() {
|
||||||
}
|
}
|
||||||
|
|
||||||
in, out := io.Pipe()
|
in, out := io.Pipe()
|
||||||
|
userCtx := rtlsdr.UserCtx(out)
|
||||||
|
|
||||||
go func() {
|
defer func() {
|
||||||
tcpBlock := make([]byte, 16384)
|
in.Close()
|
||||||
for {
|
out.Close()
|
||||||
n, err := rcvr.Read(tcpBlock)
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
out.Write(tcpBlock[:n])
|
|
||||||
}
|
|
||||||
}()
|
}()
|
||||||
|
|
||||||
|
ctx := &rtlsdr.CustUserCtx{
|
||||||
|
func(buf []byte, ctx *rtlsdr.UserCtx) {
|
||||||
|
out := (*ctx).(*io.PipeWriter)
|
||||||
|
out.Write(buf)
|
||||||
|
},
|
||||||
|
&userCtx,
|
||||||
|
}
|
||||||
|
|
||||||
|
go rcvr.ReadAsync2(ctx, 1, 16384)
|
||||||
|
|
||||||
block := make([]byte, rcvr.p.Cfg().BlockSize2)
|
block := make([]byte, rcvr.p.Cfg().BlockSize2)
|
||||||
|
|
||||||
start := time.Now()
|
start := time.Now()
|
||||||
|
|
@ -204,10 +194,7 @@ func init() {
|
||||||
log.SetFlags(log.Lshortfile | log.Lmicroseconds)
|
log.SetFlags(log.Lshortfile | log.Lmicroseconds)
|
||||||
}
|
}
|
||||||
|
|
||||||
var cpuprofile = flag.String("cpuprofile", "", "write cpu profile to this file")
|
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
rcvr.RegisterFlags()
|
|
||||||
RegisterFlags()
|
RegisterFlags()
|
||||||
|
|
||||||
flag.Parse()
|
flag.Parse()
|
||||||
|
|
@ -215,18 +202,19 @@ func main() {
|
||||||
|
|
||||||
rcvr.NewReceiver()
|
rcvr.NewReceiver()
|
||||||
|
|
||||||
defer logFile.Close()
|
defer func() {
|
||||||
defer sampleFile.Close()
|
logFile.Close()
|
||||||
defer rcvr.Close()
|
sampleFile.Close()
|
||||||
|
|
||||||
if *cpuprofile != "" {
|
fmt.Println("Cancelling...")
|
||||||
f, err := os.Create(*cpuprofile)
|
err := rcvr.CancelAsync()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatal(err)
|
log.Fatal(err)
|
||||||
}
|
}
|
||||||
pprof.StartCPUProfile(f)
|
fmt.Println("Closing...")
|
||||||
defer pprof.StopCPUProfile()
|
rcvr.Close()
|
||||||
}
|
os.Exit(0)
|
||||||
|
}()
|
||||||
|
|
||||||
rcvr.Run()
|
rcvr.Run()
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue