| @@ -128,6 +128,14 @@ func (m *sourceManager) Stats() sdr.SourceStats { | |||||
| return sdr.SourceStats{} | return sdr.SourceStats{} | ||||
| } | } | ||||
| func (m *sourceManager) Flush() { | |||||
| m.mu.RLock() | |||||
| defer m.mu.RUnlock() | |||||
| if fl, ok := m.src.(sdr.Flushable); ok { | |||||
| fl.Flush() | |||||
| } | |||||
| } | |||||
| func newSourceManager(src sdr.Source, newSource func(cfg config.Config) (sdr.Source, error)) *sourceManager { | func newSourceManager(src sdr.Source, newSource func(cfg config.Config) (sdr.Source, error)) *sourceManager { | ||||
| return &sourceManager{src: src, newSource: newSource} | return &sourceManager{src: src, newSource: newSource} | ||||
| } | } | ||||
| @@ -428,7 +436,7 @@ func main() { | |||||
| _ = server.Shutdown(ctxTimeout) | _ = server.Shutdown(ctxTimeout) | ||||
| } | } | ||||
| func runDSP(ctx context.Context, src sdr.Source, cfg config.Config, det *detector.Detector, window []float64, h *hub, eventFile *os.File, updates <-chan dspUpdate, gpuState *gpuStatus) { | |||||
| func runDSP(ctx context.Context, srcMgr *sourceManager, cfg config.Config, det *detector.Detector, window []float64, h *hub, eventFile *os.File, updates <-chan dspUpdate, gpuState *gpuStatus) { | |||||
| ticker := time.NewTicker(cfg.FrameInterval()) | ticker := time.NewTicker(cfg.FrameInterval()) | ||||
| defer ticker.Stop() | defer ticker.Stop() | ||||
| enc := json.NewEncoder(eventFile) | enc := json.NewEncoder(eventFile) | ||||
| @@ -467,9 +475,7 @@ func runDSP(ctx context.Context, src sdr.Source, cfg config.Config, det *detecto | |||||
| dcEnabled = upd.dcBlock | dcEnabled = upd.dcBlock | ||||
| iqEnabled = upd.iqBalance | iqEnabled = upd.iqBalance | ||||
| if cfg.FFTSize != prevFFT || cfg.UseGPUFFT != prevUseGPU { | if cfg.FFTSize != prevFFT || cfg.UseGPUFFT != prevUseGPU { | ||||
| if flushable, ok := src.(sdr.Flushable); ok { | |||||
| flushable.Flush() | |||||
| } | |||||
| srcMgr.Flush() | |||||
| gotSamples = false | gotSamples = false | ||||
| if gpuEngine != nil { | if gpuEngine != nil { | ||||
| gpuEngine.Close() | gpuEngine.Close() | ||||
| @@ -491,11 +497,11 @@ func runDSP(ctx context.Context, src sdr.Source, cfg config.Config, det *detecto | |||||
| dcBlocker.Reset() | dcBlocker.Reset() | ||||
| ticker.Reset(cfg.FrameInterval()) | ticker.Reset(cfg.FrameInterval()) | ||||
| case <-ticker.C: | case <-ticker.C: | ||||
| iq, err := src.ReadIQ(cfg.FFTSize) | |||||
| iq, err := srcMgr.ReadIQ(cfg.FFTSize) | |||||
| if err != nil { | if err != nil { | ||||
| log.Printf("read IQ: %v", err) | log.Printf("read IQ: %v", err) | ||||
| if strings.Contains(err.Error(), "timeout") { | if strings.Contains(err.Error(), "timeout") { | ||||
| if err := src.Restart(cfg); err != nil { | |||||
| if err := srcMgr.Restart(cfg); err != nil { | |||||
| log.Printf("restart failed: %v", err) | log.Printf("restart failed: %v", err) | ||||
| } | } | ||||
| } | } | ||||