Compare commits

...

1 commit

Author SHA1 Message Date
bemasher
c2fca58625 Switch from rtl_tcp to direct access. 2015-11-26 23:06:46 -07:00

92
recv.go
View file

@ -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()
} }