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.

48 lines
1.5KB

  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. }
  13. func DecideSignalAction(policy Policy, candidate Candidate, cls *classifier.Classification) SignalDecision {
  14. decision := SignalDecision{Candidate: candidate}
  15. classTag := ""
  16. hintTag := strings.TrimSpace(candidate.Hint)
  17. if cls != nil {
  18. decision.Class = string(cls.ModType)
  19. classTag = decision.Class
  20. }
  21. if classTag != "" && WantsClass(policy.AutoRecordClasses, classTag) {
  22. decision.ShouldRecord = true
  23. decision.Reason = DecisionReasonRecordClass
  24. } else if classTag == "" && hintTag != "" && WantsClass(policy.AutoRecordClasses, hintTag) {
  25. decision.ShouldRecord = true
  26. decision.Reason = DecisionReasonRecordHint
  27. }
  28. if classTag != "" && WantsClass(policy.AutoDecodeClasses, classTag) {
  29. decision.ShouldAutoDecode = true
  30. if decision.Reason == "" {
  31. decision.Reason = DecisionReasonDecodeClass
  32. }
  33. } else if classTag == "" && hintTag != "" && WantsClass(policy.AutoDecodeClasses, hintTag) {
  34. decision.ShouldAutoDecode = true
  35. if decision.Reason == "" {
  36. decision.Reason = DecisionReasonDecodeHint
  37. }
  38. }
  39. if decision.Reason == "" && candidate.Hint != "" {
  40. decision.Reason = DecisionReasonHintOnly
  41. }
  42. return decision
  43. }