Wideband autonomous SDR analysis engine forked from sdr-visual-suite
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

60 lines
2.1KB

  1. package pipeline
  2. import (
  3. "strings"
  4. "sdr-wideband-suite/internal/classifier"
  5. )
  6. type SignalDecision struct {
  7. Candidate Candidate `json:"candidate"`
  8. Class string `json:"class,omitempty"`
  9. ShouldRecord bool `json:"should_record"`
  10. ShouldAutoDecode bool `json:"should_auto_decode"`
  11. Reason string `json:"reason,omitempty"`
  12. MonitorBias float64 `json:"monitor_bias,omitempty"`
  13. MonitorDetail *MonitorWindowMatch `json:"monitor_detail,omitempty"`
  14. RecordAdmission *PriorityAdmission `json:"record_admission,omitempty"`
  15. DecodeAdmission *PriorityAdmission `json:"decode_admission,omitempty"`
  16. }
  17. func DecideSignalAction(policy Policy, candidate Candidate, cls *classifier.Classification) SignalDecision {
  18. if len(policy.MonitorWindows) > 0 {
  19. _ = ApplyMonitorWindowMatches(policy, &candidate)
  20. }
  21. decision := SignalDecision{Candidate: candidate}
  22. classTag := ""
  23. hintTag := strings.TrimSpace(candidate.Hint)
  24. if cls != nil {
  25. decision.Class = string(cls.ModType)
  26. classTag = decision.Class
  27. }
  28. if classTag != "" && WantsClass(policy.AutoRecordClasses, classTag) {
  29. decision.ShouldRecord = true
  30. decision.Reason = DecisionReasonRecordClass
  31. } else if classTag == "" && hintTag != "" && WantsClass(policy.AutoRecordClasses, hintTag) {
  32. decision.ShouldRecord = true
  33. decision.Reason = DecisionReasonRecordHint
  34. }
  35. if classTag != "" && WantsClass(policy.AutoDecodeClasses, classTag) {
  36. decision.ShouldAutoDecode = true
  37. if decision.Reason == "" {
  38. decision.Reason = DecisionReasonDecodeClass
  39. }
  40. } else if classTag == "" && hintTag != "" && WantsClass(policy.AutoDecodeClasses, hintTag) {
  41. decision.ShouldAutoDecode = true
  42. if decision.Reason == "" {
  43. decision.Reason = DecisionReasonDecodeHint
  44. }
  45. }
  46. if decision.Reason == "" && candidate.Hint != "" {
  47. decision.Reason = DecisionReasonHintOnly
  48. }
  49. monitorBias, monitorDetail := MonitorWindowBias(policy, candidate)
  50. if monitorBias != 0 {
  51. decision.MonitorBias = monitorBias
  52. decision.MonitorDetail = monitorDetail
  53. }
  54. return decision
  55. }