Wideband autonomous SDR analysis engine forked from sdr-visual-suite
Du kannst nicht mehr als 25 Themen auswählen Themen müssen entweder mit einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

86 Zeilen
1.7KB

  1. package main
  2. import (
  3. "encoding/json"
  4. "log"
  5. "time"
  6. "sdr-visual-suite/internal/detector"
  7. )
  8. func (s *signalSnapshot) set(sig []detector.Signal) {
  9. s.mu.Lock()
  10. defer s.mu.Unlock()
  11. s.signals = append([]detector.Signal(nil), sig...)
  12. }
  13. func (s *signalSnapshot) get() []detector.Signal {
  14. s.mu.RLock()
  15. defer s.mu.RUnlock()
  16. return append([]detector.Signal(nil), s.signals...)
  17. }
  18. func (g *gpuStatus) set(active bool, err error) {
  19. g.mu.Lock()
  20. defer g.mu.Unlock()
  21. g.Active = active
  22. if err != nil {
  23. g.Error = err.Error()
  24. } else {
  25. g.Error = ""
  26. }
  27. }
  28. func (g *gpuStatus) snapshot() gpuStatus {
  29. g.mu.RLock()
  30. defer g.mu.RUnlock()
  31. return gpuStatus{Available: g.Available, Active: g.Active, Error: g.Error}
  32. }
  33. func newHub() *hub {
  34. return &hub{clients: map[*client]struct{}{}, lastLogTs: time.Now()}
  35. }
  36. func (h *hub) add(c *client) {
  37. h.mu.Lock()
  38. defer h.mu.Unlock()
  39. h.clients[c] = struct{}{}
  40. log.Printf("ws connected (%d clients)", len(h.clients))
  41. }
  42. func (h *hub) remove(c *client) {
  43. c.closeOnce.Do(func() { close(c.done) })
  44. h.mu.Lock()
  45. defer h.mu.Unlock()
  46. delete(h.clients, c)
  47. log.Printf("ws disconnected (%d clients)", len(h.clients))
  48. }
  49. func (h *hub) broadcast(frame SpectrumFrame) {
  50. b, err := json.Marshal(frame)
  51. if err != nil {
  52. log.Printf("marshal frame: %v", err)
  53. return
  54. }
  55. h.mu.Lock()
  56. clients := make([]*client, 0, len(h.clients))
  57. for c := range h.clients {
  58. clients = append(clients, c)
  59. }
  60. h.mu.Unlock()
  61. for _, c := range clients {
  62. select {
  63. case c.send <- b:
  64. default:
  65. h.remove(c)
  66. }
  67. }
  68. h.frameCnt++
  69. if time.Since(h.lastLogTs) > 2*time.Second {
  70. h.lastLogTs = time.Now()
  71. log.Printf("broadcast frames=%d clients=%d", h.frameCnt, len(clients))
  72. }
  73. }