master_trigger_cfg.go 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. package cfg
  2. import (
  3. "cicv-data-closedloop/common/config/c_log"
  4. "cicv-data-closedloop/common/util"
  5. "cicv-data-closedloop/pji/common/cfg"
  6. "github.com/bluenviron/goroslib/v2/pkg/msgs/std_msgs"
  7. "plugin"
  8. "strconv"
  9. "strings"
  10. )
  11. var (
  12. TopicOfObstacleDetection = "/obstacle_detection"
  13. RuleOfObstacleDetection []func(data *std_msgs.UInt8) string
  14. LabelMapTriggerId = make(map[string]string)
  15. )
  16. func InitTriggerConfig() {
  17. // 下载所有触发器的文件
  18. for _, trigger := range cfg.PlatformConfig.TaskTriggers {
  19. // 获取文件名
  20. slice := strings.Split(trigger.TriggerScriptPath, "/")
  21. fileName := slice[len(slice)-1]
  22. // 下载
  23. triggerLocalPath := cfg.CloudConfig.TriggersDir + fileName
  24. _ = util.CreateParentDir(triggerLocalPath)
  25. c_log.GlobalLogger.Info("下载触发器插件从", trigger.TriggerScriptPath, "到", triggerLocalPath)
  26. err := cfg.OssBucket.GetObjectToFile(trigger.TriggerScriptPath, triggerLocalPath)
  27. if err != nil {
  28. c_log.GlobalLogger.Error("下载oss上的触发器插件失败:", err)
  29. continue
  30. }
  31. // 载入插件到数组
  32. open, err := plugin.Open(triggerLocalPath)
  33. if err != nil {
  34. c_log.GlobalLogger.Error("加载本地插件", triggerLocalPath, "失败。", err)
  35. }
  36. topic0, err := open.Lookup("Topic")
  37. if err != nil {
  38. c_log.GlobalLogger.Error("加载本地插件", triggerLocalPath, "中的Topic方法失败。", err)
  39. continue
  40. }
  41. topic1, ok := topic0.(func() string)
  42. if ok != true {
  43. c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func() string):", err)
  44. continue
  45. }
  46. topic2 := topic1()
  47. rule, err := open.Lookup("Rule")
  48. if err != nil {
  49. c_log.GlobalLogger.Error("加载本地插件", triggerLocalPath, "中的Rule方法失败。", err)
  50. continue
  51. }
  52. // 判断规则类型
  53. if TopicOfObstacleDetection == topic2 {
  54. f, ok := rule.(func(data *std_msgs.UInt8) string)
  55. if ok != true {
  56. c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *std_msgs.UInt8) string):", err)
  57. continue
  58. }
  59. RuleOfObstacleDetection = append(RuleOfObstacleDetection, f)
  60. } else {
  61. c_log.GlobalLogger.Error("未知的topic:", topic2)
  62. continue
  63. }
  64. label, err := open.Lookup("Label")
  65. if err != nil {
  66. c_log.GlobalLogger.Error("加载本地插件", triggerLocalPath, "中的TriggerName方法失败。", err)
  67. continue
  68. }
  69. labelFunc, ok := label.(func() string)
  70. if ok != true {
  71. c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Label方法必须是(func() string):", err)
  72. continue
  73. }
  74. labelString := labelFunc()
  75. LabelMapTriggerId[labelString] = strconv.Itoa(trigger.TriggerId)
  76. c_log.GlobalLogger.Info("主节点加载触发器插件:【ros topic】=", topic2, ",【触发器label】=", labelString, "【触发器ID】=", trigger.TriggerId, "【label和id映射关系】=", LabelMapTriggerId)
  77. }
  78. c_log.GlobalLogger.Info("主节点加载触发器插件 - 成功。")
  79. }
  80. //
  81. //var (
  82. // TopicOfOdom = "/odom"
  83. // RuleOfOdom []func(data *nav_msgs.Odometry) string
  84. // TopicOfObstacleDetection = "/obstacle_detection"
  85. // RuleOfObstacleDetection []func(data *std_msgs.UInt8) string
  86. // TopicOfSysInfo = "/sys_info"
  87. // RuleOfSysInfo []func(data *pji_msgs.SysInfo) string
  88. // TopicOfLocateInfo = "/locate_info"
  89. // RuleOfLocateInfo []func(data *pji_msgs.LocateInfo) string
  90. // TopicOfImu = "/imu"
  91. // RuleOfImu []func(data *sensor_msgs.Imu) string
  92. // TopicOfDiagnostics = "/diagnostics"
  93. // RuleOfDiagnostics []func(data *diagnostic_msgs.DiagnosticArray) string
  94. // LabelMapTriggerId = make(map[string]string)
  95. //
  96. //)
  97. //
  98. //func InitTriggerConfig() {
  99. // // 下载所有触发器的文件
  100. // for _, trigger := range cfg.PlatformConfig.TaskTriggers {
  101. // // 获取文件名
  102. // slice := strings.Split(trigger.TriggerScriptPath, "/")
  103. // fileName := slice[len(slice)-1]
  104. // // 下载
  105. // triggerLocalPath := cfg.CloudConfig.TriggersDir + fileName
  106. // cutil.CreateParentDir(triggerLocalPath)
  107. // c_log.GlobalLogger.Info("下载触发器插件从", trigger.TriggerScriptPath, "到", triggerLocalPath)
  108. // err := cfg.OssBucket.GetObjectToFile(trigger.TriggerScriptPath, triggerLocalPath)
  109. // if err != nil {
  110. // c_log.GlobalLogger.Error("下载oss上的触发器插件失败:", err)
  111. // continue
  112. // }
  113. // // 载入插件到数组
  114. // open, err := plugin.Open(triggerLocalPath)
  115. // if err != nil {
  116. // c_log.GlobalLogger.Error("加载本地插件", triggerLocalPath, "失败。", err)
  117. // }
  118. // topic0, err := open.Lookup("Topic")
  119. // if err != nil {
  120. // c_log.GlobalLogger.Error("加载本地插件", triggerLocalPath, "中的Topic方法失败。", err)
  121. // continue
  122. // }
  123. // topic1, ok := topic0.(func() string)
  124. // if ok != true {
  125. // c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func() string):", err)
  126. // continue
  127. // }
  128. // topic2 := topic1()
  129. // rule, err := open.Lookup("Rule")
  130. // if err != nil {
  131. // c_log.GlobalLogger.Error("加载本地插件", triggerLocalPath, "中的Rule方法失败。", err)
  132. // continue
  133. // }
  134. // if TopicOfOdom == topic2 {
  135. // f, ok := rule.(func(data *nav_msgs.Odometry) string)
  136. // if ok != true {
  137. // c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *nav_msgs.Odometry) string):", err)
  138. // continue
  139. // }
  140. // RuleOfOdom = append(RuleOfOdom, f)
  141. // } else if TopicOfObstacleDetection == topic2 {
  142. // f, ok := rule.(func(data *std_msgs.UInt8) string)
  143. // if ok != true {
  144. // c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *std_msgs.UInt8) string):", err)
  145. // continue
  146. // }
  147. // RuleOfObstacleDetection = append(RuleOfObstacleDetection, f)
  148. // } else if TopicOfSysInfo == topic2 {
  149. // f, ok := rule.(func(data *pji_msgs.SysInfo) string)
  150. // if ok != true {
  151. // c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *pji_msgs.SysInfo) string):", err)
  152. // continue
  153. // }
  154. // RuleOfSysInfo = append(RuleOfSysInfo, f)
  155. // } else if TopicOfLocateInfo == topic2 {
  156. // f, ok := rule.(func(data *pji_msgs.LocateInfo) string)
  157. // if ok != true {
  158. // c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *pji_msgs.LocateInfo) string):", err)
  159. // continue
  160. // }
  161. // RuleOfLocateInfo = append(RuleOfLocateInfo, f)
  162. // } else if TopicOfImu == topic2 {
  163. // f, ok := rule.(func(data *sensor_msgs.Imu) string)
  164. // if ok != true {
  165. // c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *sensor_msgs.Imu) string):", err)
  166. // continue
  167. // }
  168. // RuleOfImu = append(RuleOfImu, f)
  169. // } else if TopicOfDiagnostics == topic2 {
  170. // f, ok := rule.(func(data *diagnostic_msgs.DiagnosticArray) string)
  171. // if ok != true {
  172. // c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *diagnostic_msgs.DiagnosticArray) string):", err)
  173. // continue
  174. // }
  175. // RuleOfDiagnostics = append(RuleOfDiagnostics, f)
  176. // } else {
  177. // c_log.GlobalLogger.Error("未知的topic:", topic2)
  178. // continue
  179. // }
  180. //
  181. // label, err := open.Lookup("Label")
  182. // if err != nil {
  183. // c_log.GlobalLogger.Error("加载本地插件", triggerLocalPath, "中的TriggerName方法失败。", err)
  184. // continue
  185. // }
  186. // labelFunc, ok := label.(func() string)
  187. // if ok != true {
  188. // c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Label方法必须是(func() string):", err)
  189. // continue
  190. // }
  191. // labelString := labelFunc()
  192. // LabelMapTriggerId[labelString] = strconv.Itoa(trigger.TriggerId)
  193. // c_log.GlobalLogger.Info("主节点加载触发器插件:【ros topic】=", topic2, ",【触发器label】=", labelString, "【触发器ID】=", trigger.TriggerId, "【label和id映射关系】=", LabelMapTriggerId)
  194. // }
  195. // c_log.GlobalLogger.Info("主节点加载触发器插件 - 成功。")
  196. //}