Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

71 рядки
1.5KB

  1. package classifier
  2. import (
  3. _ "embed"
  4. "encoding/json"
  5. "log"
  6. )
  7. //go:embed hard_rules.json
  8. var hardRulesJSON []byte
  9. type hardRule struct {
  10. Name string `json:"name"`
  11. Match hardMatch `json:"match"`
  12. Result hardResult `json:"result"`
  13. Note string `json:"note"`
  14. }
  15. type hardMatch struct {
  16. MinMHz float64 `json:"min_mhz,omitempty"`
  17. MaxMHz float64 `json:"max_mhz,omitempty"`
  18. MinBWHz float64 `json:"min_bw_hz,omitempty"`
  19. MaxBWHz float64 `json:"max_bw_hz,omitempty"`
  20. }
  21. type hardResult struct {
  22. ModType string `json:"mod_type"`
  23. Confidence float64 `json:"confidence"`
  24. }
  25. type hardRulesFile struct {
  26. Rules []hardRule `json:"rules"`
  27. }
  28. var loadedHardRules []hardRule
  29. func init() {
  30. var f hardRulesFile
  31. if err := json.Unmarshal(hardRulesJSON, &f); err != nil {
  32. log.Printf("classifier: failed to load hard rules: %v", err)
  33. return
  34. }
  35. loadedHardRules = f.Rules
  36. }
  37. func TryHardRule(centerHz float64, bwHz float64) *Classification {
  38. mhz := centerHz / 1e6
  39. for _, r := range loadedHardRules {
  40. if r.Match.MinMHz > 0 && mhz < r.Match.MinMHz {
  41. continue
  42. }
  43. if r.Match.MaxMHz > 0 && mhz > r.Match.MaxMHz {
  44. continue
  45. }
  46. if r.Match.MinBWHz > 0 && bwHz < r.Match.MinBWHz {
  47. continue
  48. }
  49. if r.Match.MaxBWHz > 0 && bwHz > r.Match.MaxBWHz {
  50. continue
  51. }
  52. mod := SignalClass(r.Result.ModType)
  53. return &Classification{
  54. ModType: mod,
  55. Confidence: r.Result.Confidence,
  56. BW3dB: bwHz,
  57. Scores: map[SignalClass]float64{mod: 10.0},
  58. }
  59. }
  60. return nil
  61. }