master_trigger_cfg.go 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. package cfg
  2. import (
  3. "cicv-data-closedloop/pji/common/cfg"
  4. "cicv-data-closedloop/pji/common/cutil"
  5. "cicv-data-closedloop/pji/common/log"
  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. log.GlobalLogger.Info("下载触发器插件从", trigger.TriggerScriptPath, "到", triggerLocalPath)
  40. err := cfg.OssBucket.GetObjectToFile(trigger.TriggerScriptPath, triggerLocalPath)
  41. if err != nil {
  42. log.GlobalLogger.Error("下载oss上的触发器插件失败:", err)
  43. continue
  44. }
  45. // 载入插件到数组
  46. {
  47. open, err := plugin.Open(triggerLocalPath)
  48. if err != nil {
  49. log.GlobalLogger.Error("加载本地插件", triggerLocalPath, "失败。", err)
  50. }
  51. topic0, err := open.Lookup("Topic")
  52. if err != nil {
  53. log.GlobalLogger.Error("加载本地插件", triggerLocalPath, "中的Topic方法失败。", err)
  54. continue
  55. }
  56. topic1, ok := topic0.(func() string)
  57. if ok != true {
  58. log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func() string):", err)
  59. continue
  60. }
  61. topic2 := topic1()
  62. rule, err := open.Lookup("Rule")
  63. if err != nil {
  64. log.GlobalLogger.Error("加载本地插件", triggerLocalPath, "中的Rule方法失败。", err)
  65. continue
  66. }
  67. //TODO 类型断言需要处理异常,防止程序崩溃
  68. if TopicOfOdom == topic2 {
  69. f := rule.(func(data *nav_msgs.Odometry) string)
  70. RuleOfOdom = append(RuleOfOdom, f)
  71. } else if TopicOfObstacleDetection == topic2 {
  72. f := rule.(func(data *std_msgs.UInt8) string)
  73. RuleOfObstacleDetection = append(RuleOfObstacleDetection, f)
  74. } else if TopicOfSysInfo == topic2 {
  75. f := rule.(func(data *pji_msgs.SysInfo) string)
  76. RuleOfSysInfo = append(RuleOfSysInfo, f)
  77. } else if TopicOfLocateInfo == topic2 {
  78. f := rule.(func(data *pji_msgs.LocateInfo) string)
  79. RuleOfLocateInfo = append(RuleOfLocateInfo, f)
  80. } else if TopicOfImu == topic2 {
  81. f := rule.(func(data *sensor_msgs.Imu) string)
  82. RuleOfImu = append(RuleOfImu, f)
  83. } else if TopicOfDiagnostics == topic2 {
  84. f := rule.(func(data *diagnostic_msgs.DiagnosticArray) string)
  85. RuleOfDiagnostics = append(RuleOfDiagnostics, f)
  86. } else {
  87. log.GlobalLogger.Error("未知的topic:", topic2)
  88. continue
  89. }
  90. label, err := open.Lookup("Label")
  91. if err != nil {
  92. log.GlobalLogger.Error("加载本地插件", triggerLocalPath, "中的TriggerName方法失败。", err)
  93. continue
  94. }
  95. labelFunc := label.(func() string)
  96. labelString := labelFunc()
  97. LabelMapTriggerId[labelString] = strconv.Itoa(trigger.TriggerId)
  98. log.GlobalLogger.Info("主节点加载触发器插件:【ros topic】=", topic2, ",【触发器label】=", labelString)
  99. }
  100. }
  101. }