master_trigger_cfg.go 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. package cfg
  2. import (
  3. "cicv-data-closedloop/common/config/c_log"
  4. "cicv-data-closedloop/pji/common/cfg"
  5. "cicv-data-closedloop/pji/common/cutil"
  6. "cicv-data-closedloop/pji_msgs"
  7. "github.com/bluenviron/goroslib/v2/pkg/msgs/diagnostic_msgs"
  8. "github.com/bluenviron/goroslib/v2/pkg/msgs/nav_msgs"
  9. "github.com/bluenviron/goroslib/v2/pkg/msgs/sensor_msgs"
  10. "github.com/bluenviron/goroslib/v2/pkg/msgs/std_msgs"
  11. "plugin"
  12. "strconv"
  13. "strings"
  14. )
  15. var (
  16. TopicOfOdom = "/odom"
  17. RuleOfOdom []func(data *nav_msgs.Odometry) string
  18. TopicOfObstacleDetection = "/obstacle_detection"
  19. RuleOfObstacleDetection []func(data *std_msgs.UInt8) string
  20. TopicOfSysInfo = "/sys_info"
  21. RuleOfSysInfo []func(data *pji_msgs.SysInfo) string
  22. TopicOfLocateInfo = "/locate_info"
  23. RuleOfLocateInfo []func(data *pji_msgs.LocateInfo) string
  24. TopicOfImu = "/imu"
  25. RuleOfImu []func(data *sensor_msgs.Imu) string
  26. TopicOfDiagnostics = "/diagnostics"
  27. RuleOfDiagnostics []func(data *diagnostic_msgs.DiagnosticArray) string
  28. LabelMapTriggerId = make(map[string]string)
  29. )
  30. func InitTriggerConfig() {
  31. // 下载所有触发器的文件
  32. for _, trigger := range cfg.PlatformConfig.TaskTriggers {
  33. // 获取文件名
  34. slice := strings.Split(trigger.TriggerScriptPath, "/")
  35. fileName := slice[len(slice)-1]
  36. // 下载
  37. triggerLocalPath := cfg.CloudConfig.TriggersDir + fileName
  38. cutil.CreateParentDir(triggerLocalPath)
  39. c_log.GlobalLogger.Info("下载触发器插件从", trigger.TriggerScriptPath, "到", triggerLocalPath)
  40. err := cfg.OssBucket.GetObjectToFile(trigger.TriggerScriptPath, triggerLocalPath)
  41. if err != nil {
  42. c_log.GlobalLogger.Error("下载oss上的触发器插件失败:", err)
  43. continue
  44. }
  45. // 载入插件到数组
  46. open, err := plugin.Open(triggerLocalPath)
  47. if err != nil {
  48. c_log.GlobalLogger.Error("加载本地插件", triggerLocalPath, "失败。", err)
  49. }
  50. topic0, err := open.Lookup("Topic")
  51. if err != nil {
  52. c_log.GlobalLogger.Error("加载本地插件", triggerLocalPath, "中的Topic方法失败。", err)
  53. continue
  54. }
  55. topic1, ok := topic0.(func() string)
  56. if ok != true {
  57. c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func() string):", err)
  58. continue
  59. }
  60. topic2 := topic1()
  61. rule, err := open.Lookup("Rule")
  62. if err != nil {
  63. c_log.GlobalLogger.Error("加载本地插件", triggerLocalPath, "中的Rule方法失败。", err)
  64. continue
  65. }
  66. if TopicOfOdom == topic2 {
  67. f, ok := rule.(func(data *nav_msgs.Odometry) string)
  68. if ok != true {
  69. c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *nav_msgs.Odometry) string):", err)
  70. continue
  71. }
  72. RuleOfOdom = append(RuleOfOdom, f)
  73. } else if TopicOfObstacleDetection == topic2 {
  74. f, ok := rule.(func(data *std_msgs.UInt8) string)
  75. if ok != true {
  76. c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *std_msgs.UInt8) string):", err)
  77. continue
  78. }
  79. RuleOfObstacleDetection = append(RuleOfObstacleDetection, f)
  80. } else if TopicOfSysInfo == topic2 {
  81. f, ok := rule.(func(data *pji_msgs.SysInfo) string)
  82. if ok != true {
  83. c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *pji_msgs.SysInfo) string):", err)
  84. continue
  85. }
  86. RuleOfSysInfo = append(RuleOfSysInfo, f)
  87. } else if TopicOfLocateInfo == topic2 {
  88. f, ok := rule.(func(data *pji_msgs.LocateInfo) string)
  89. if ok != true {
  90. c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *pji_msgs.LocateInfo) string):", err)
  91. continue
  92. }
  93. RuleOfLocateInfo = append(RuleOfLocateInfo, f)
  94. } else if TopicOfImu == topic2 {
  95. f, ok := rule.(func(data *sensor_msgs.Imu) string)
  96. if ok != true {
  97. c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *sensor_msgs.Imu) string):", err)
  98. continue
  99. }
  100. RuleOfImu = append(RuleOfImu, f)
  101. } else if TopicOfDiagnostics == topic2 {
  102. f, ok := rule.(func(data *diagnostic_msgs.DiagnosticArray) string)
  103. if ok != true {
  104. c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *diagnostic_msgs.DiagnosticArray) string):", err)
  105. continue
  106. }
  107. RuleOfDiagnostics = append(RuleOfDiagnostics, f)
  108. } else {
  109. c_log.GlobalLogger.Error("未知的topic:", topic2)
  110. continue
  111. }
  112. label, err := open.Lookup("Label")
  113. if err != nil {
  114. c_log.GlobalLogger.Error("加载本地插件", triggerLocalPath, "中的TriggerName方法失败。", err)
  115. continue
  116. }
  117. labelFunc, ok := label.(func() string)
  118. if ok != true {
  119. c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Label方法必须是(func() string):", err)
  120. continue
  121. }
  122. labelString := labelFunc()
  123. LabelMapTriggerId[labelString] = strconv.Itoa(trigger.TriggerId)
  124. c_log.GlobalLogger.Info("主节点加载触发器插件:【ros topic】=", topic2, ",【触发器label】=", labelString, "【触发器ID】=", trigger.TriggerId, "【label和id映射关系】=", LabelMapTriggerId)
  125. }
  126. c_log.GlobalLogger.Info("主节点加载触发器插件 - 成功。")
  127. }