Wideband autonomous SDR analysis engine forked from sdr-visual-suite
Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.

105 řádky
1.9KB

  1. package main
  2. import (
  3. "sdr-visual-suite/internal/config"
  4. "sdr-visual-suite/internal/sdr"
  5. )
  6. func (m *sourceManager) Restart(cfg config.Config) error {
  7. m.mu.Lock()
  8. defer m.mu.Unlock()
  9. old := m.src
  10. _ = old.Stop()
  11. next, err := m.newSource(cfg)
  12. if err != nil {
  13. _ = old.Start()
  14. m.src = old
  15. return err
  16. }
  17. if err := next.Start(); err != nil {
  18. _ = next.Stop()
  19. _ = old.Start()
  20. m.src = old
  21. return err
  22. }
  23. m.src = next
  24. return nil
  25. }
  26. func (m *sourceManager) Stats() sdr.SourceStats {
  27. m.mu.RLock()
  28. defer m.mu.RUnlock()
  29. if sp, ok := m.src.(sdr.StatsProvider); ok {
  30. return sp.Stats()
  31. }
  32. return sdr.SourceStats{}
  33. }
  34. func (m *sourceManager) Flush() {
  35. m.mu.RLock()
  36. defer m.mu.RUnlock()
  37. if fl, ok := m.src.(sdr.Flushable); ok {
  38. fl.Flush()
  39. }
  40. }
  41. func newSourceManager(src sdr.Source, newSource func(cfg config.Config) (sdr.Source, error)) *sourceManager {
  42. return &sourceManager{src: src, newSource: newSource}
  43. }
  44. func (m *sourceManager) Start() error {
  45. m.mu.RLock()
  46. defer m.mu.RUnlock()
  47. return m.src.Start()
  48. }
  49. func (m *sourceManager) Stop() error {
  50. m.mu.RLock()
  51. defer m.mu.RUnlock()
  52. return m.src.Stop()
  53. }
  54. func (m *sourceManager) ReadIQ(n int) ([]complex64, error) {
  55. m.mu.RLock()
  56. defer m.mu.RUnlock()
  57. return m.src.ReadIQ(n)
  58. }
  59. func (m *sourceManager) ApplyConfig(cfg config.Config) error {
  60. m.mu.Lock()
  61. defer m.mu.Unlock()
  62. if updatable, ok := m.src.(sdr.ConfigurableSource); ok {
  63. if err := updatable.UpdateConfig(cfg.SampleRate, cfg.CenterHz, cfg.GainDb, cfg.AGC, cfg.TunerBwKHz); err == nil {
  64. return nil
  65. }
  66. }
  67. old := m.src
  68. _ = old.Stop()
  69. next, err := m.newSource(cfg)
  70. if err != nil {
  71. _ = old.Start()
  72. return err
  73. }
  74. if err := next.Start(); err != nil {
  75. _ = next.Stop()
  76. _ = old.Start()
  77. return err
  78. }
  79. m.src = next
  80. return nil
  81. }
  82. func pushDSPUpdate(ch chan dspUpdate, update dspUpdate) {
  83. select {
  84. case ch <- update:
  85. default:
  86. select {
  87. case <-ch:
  88. default:
  89. }
  90. ch <- update
  91. }
  92. }