master_trigger_cfg.go 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. package cfg
  2. import (
  3. "cicv-data-closedloop/kinglong/common/cfg"
  4. "cicv-data-closedloop/kinglong/common/cutil"
  5. "cicv-data-closedloop/kinglong/common/log"
  6. "cicv-data-closedloop/kinglong_msgs"
  7. "plugin"
  8. "strconv"
  9. "strings"
  10. )
  11. var (
  12. TopicOfNodeFaultInfo = "/nodefault_info"
  13. TopicOfCicvLocation = "/cicv_location"
  14. TopicOfTpperception = "/tpperception"
  15. TopicOfFaultInfo = "/fault_info"
  16. TopicOfDataRead = "/data_read"
  17. RuleOfNodefaultInfo []func(data *kinglong_msgs.FaultInfo) string
  18. RuleOfCicvLocation []func(data *kinglong_msgs.PerceptionLocalization) string
  19. RuleOfTpperception []func(data *kinglong_msgs.PerceptionObjects, velocityX float64, velocityY float64, yaw float64) string
  20. RuleOfFaultInfo []func(data *kinglong_msgs.FaultVec) string
  21. RuleOfDataRead []func(data *kinglong_msgs.Retrieval) string
  22. LabelMapTriggerId = make(map[string]string)
  23. )
  24. func InitTriggerConfig() {
  25. log.GlobalLogger.Info("主节点加载触发器插件 - 开始。")
  26. // 下载所有触发器的文件
  27. for _, trigger := range cfg.PlatformConfig.TaskTriggers {
  28. // 获取文件名
  29. pathSplit := strings.Split(trigger.TriggerScriptPath, "/")
  30. fileName := pathSplit[len(pathSplit)-1]
  31. // 下载
  32. triggerLocalPath := cfg.CloudConfig.TriggersDir + fileName
  33. cutil.CreateParentDir(triggerLocalPath)
  34. log.GlobalLogger.Info("下载触发器插件从 ", trigger.TriggerScriptPath, " 到 ", triggerLocalPath)
  35. err := cfg.OssBucket.GetObjectToFile(trigger.TriggerScriptPath, triggerLocalPath)
  36. if err != nil {
  37. log.GlobalLogger.Error("下载 oss 上的触发器插件失败:", err)
  38. continue
  39. }
  40. // 载入插件到数组
  41. open, err := plugin.Open(triggerLocalPath)
  42. if err != nil {
  43. log.GlobalLogger.Error("加载本地插件", triggerLocalPath, "失败。", err)
  44. continue
  45. }
  46. topic0, err := open.Lookup("Topic")
  47. if err != nil {
  48. log.GlobalLogger.Error("加载本地插件", triggerLocalPath, "中的Topic方法失败。", err)
  49. continue
  50. }
  51. topic1, ok := topic0.(func() string)
  52. if ok != true {
  53. log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func() string):", err)
  54. continue
  55. }
  56. topic2 := topic1()
  57. rule, err := open.Lookup("Rule")
  58. if err != nil {
  59. log.GlobalLogger.Error("加载本地插件", triggerLocalPath, "中的Rule方法失败。", err)
  60. continue
  61. }
  62. if TopicOfNodeFaultInfo == topic2 {
  63. f, ok := rule.(func(data *kinglong_msgs.FaultInfo) string)
  64. if ok != true {
  65. log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *kinglong_msgs.FaultInfo) string):", err)
  66. continue
  67. }
  68. RuleOfNodefaultInfo = append(RuleOfNodefaultInfo, f)
  69. } else if TopicOfCicvLocation == topic2 {
  70. f, ok := rule.(func(data *kinglong_msgs.PerceptionLocalization) string)
  71. if ok != true {
  72. log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *kinglong_msgs.PerceptionLocalization) string):", err)
  73. continue
  74. }
  75. RuleOfCicvLocation = append(RuleOfCicvLocation, f)
  76. } else if TopicOfTpperception == topic2 {
  77. f, ok := rule.(func(data *kinglong_msgs.PerceptionObjects, velocityX float64, velocityY float64, yaw float64) string)
  78. if ok != true {
  79. log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *kinglong_msgs.PerceptionObjects, velocityX float64, velocityY float64, yaw float64) string):", err)
  80. continue
  81. }
  82. RuleOfTpperception = append(RuleOfTpperception, f)
  83. } else if TopicOfFaultInfo == topic2 {
  84. f, ok := rule.(func(data *kinglong_msgs.FaultVec) string)
  85. if ok != true {
  86. log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *kinglong_msgs.FaultVec) string):", err)
  87. continue
  88. }
  89. RuleOfFaultInfo = append(RuleOfFaultInfo, f)
  90. } else if TopicOfDataRead == topic2 {
  91. f, ok := rule.(func(data *kinglong_msgs.Retrieval) string)
  92. if ok != true {
  93. log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *kinglong_msgs.Retrieval) string):", err)
  94. continue
  95. }
  96. RuleOfDataRead = append(RuleOfDataRead, f)
  97. } else {
  98. log.GlobalLogger.Error("未知的topic:", topic2)
  99. continue
  100. }
  101. label, err := open.Lookup("Label")
  102. if err != nil {
  103. log.GlobalLogger.Error("加载本地插件 ", triggerLocalPath, " 中的 Label 方法失败。", err)
  104. continue
  105. }
  106. labelFunc := label.(func() string)
  107. labelString := labelFunc()
  108. LabelMapTriggerId[labelString] = strconv.Itoa(trigger.TriggerId)
  109. log.GlobalLogger.Info("主节点加载触发器插件:【ros topic】=", topic2, ",【触发器label】=", labelString, "【触发器ID】=", trigger.TriggerId, "【label和id映射关系】=", LabelMapTriggerId)
  110. }
  111. log.GlobalLogger.Info("主节点加载触发器插件 - 成功。")
  112. }