trigger_init.go 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424
  1. package config
  2. import (
  3. "cicv-data-closedloop/aarch64/pjisuv/common/config"
  4. "cicv-data-closedloop/common/config/c_log"
  5. "cicv-data-closedloop/common/util"
  6. "cicv-data-closedloop/pjisuv_msgs"
  7. entity "cicv-data-closedloop/pjisuv_param"
  8. "github.com/bluenviron/goroslib/v2/pkg/msgs/geometry_msgs"
  9. "github.com/bluenviron/goroslib/v2/pkg/msgs/nav_msgs"
  10. "github.com/bluenviron/goroslib/v2/pkg/msgs/sensor_msgs"
  11. "github.com/bluenviron/goroslib/v2/pkg/msgs/tf2_msgs"
  12. "github.com/bluenviron/goroslib/v2/pkg/msgs/visualization_msgs"
  13. "plugin"
  14. "slices"
  15. )
  16. func InitTriggerConfig() {
  17. triggerLocalPathsMapTriggerId := make(map[string]string)
  18. c_log.GlobalLogger.Info("主节点加载触发器插件 - 开始。")
  19. // 1 获取数采任务的触发器列表
  20. cloudTriggers := &config.PlatformConfig.TaskTriggers
  21. // 2 获取本地触发器列表(触发器目录的一级子目录为【触发器ID_触发器Label】)
  22. localTriggerIds := util.GetFirstLevelSubdirectories(config.CloudConfig.TriggersDir)
  23. // 3 对比触发器列表,本地没有的则下载
  24. for _, trigger := range *cloudTriggers {
  25. id := util.ToString(trigger.TriggerId)
  26. hasIdDir := slices.Contains(localTriggerIds, id) // 改成了 slices 工具库
  27. triggerLocalDir := config.CloudConfig.TriggersDir + id + "/"
  28. hasLabelSo, soPaths := util.CheckSoFilesInDirectory(triggerLocalDir)
  29. var triggerLocalPath string
  30. if hasIdDir && hasLabelSo { // 已存在的触发器需要判断是否大小一致
  31. triggerLocalPath = soPaths[0]
  32. ossSize, _ := util.GetOSSFileSize(config.OssBucket, trigger.TriggerScriptPath)
  33. localSize, _ := util.GetFileSize(triggerLocalPath)
  34. if ossSize == localSize {
  35. c_log.GlobalLogger.Info("触发器插件 ", triggerLocalPath, " 存在且与云端触发器大小一致。")
  36. triggerLocalPathsMapTriggerId[triggerLocalPath] = id
  37. continue
  38. }
  39. }
  40. label := util.GetFileNameWithoutExtension(config.CloudConfig.TriggersDir + trigger.TriggerScriptPath)
  41. triggerLocalPath = config.CloudConfig.TriggersDir + id + "/" + label + ".so"
  42. c_log.GlobalLogger.Info("下载触发器插件从 ", trigger.TriggerScriptPath, " 到 ", triggerLocalPath)
  43. config.OssMutex.Lock()
  44. _ = util.CreateParentDir(triggerLocalPath)
  45. err := config.OssBucket.GetObjectToFile(trigger.TriggerScriptPath, triggerLocalPath)
  46. config.OssMutex.Unlock()
  47. if err != nil {
  48. c_log.GlobalLogger.Error("下载 OSS 上的触发器插件失败:", err)
  49. continue
  50. }
  51. triggerLocalPathsMapTriggerId[triggerLocalPath] = id
  52. }
  53. success := 0
  54. // 加载所有触发器的文件
  55. for triggerLocalPath, triggerId := range triggerLocalPathsMapTriggerId {
  56. // 载入插件到数组
  57. open, err := plugin.Open(triggerLocalPath)
  58. if err != nil {
  59. c_log.GlobalLogger.Error("加载本地插件", triggerLocalPath, "失败。", err)
  60. continue
  61. }
  62. topic0, err := open.Lookup("Topic")
  63. if err != nil {
  64. c_log.GlobalLogger.Error("加载本地插件", triggerLocalPath, "中的Topic方法失败。", err)
  65. continue
  66. }
  67. topic1, ok := topic0.(func() string)
  68. if ok != true {
  69. c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func() string):", err)
  70. continue
  71. }
  72. topic2 := topic1()
  73. rule, err := open.Lookup("Rule")
  74. if err != nil {
  75. c_log.GlobalLogger.Error("加载本地插件", triggerLocalPath, "中的Rule方法失败。", err)
  76. continue
  77. }
  78. if TopicOfCicvExtend == topic2 { // 自定义扩展
  79. f, ok := rule.(func(param entity.PjisuvParam) string)
  80. if ok != true {
  81. c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(param entity.ExtendParam):", err)
  82. continue
  83. }
  84. RuleOfCicvExtend = append(RuleOfCicvExtend, f)
  85. } else if TopicOfAmrPose == topic2 { //1
  86. f1, ok1 := rule.(func(data *visualization_msgs.MarkerArray) string)
  87. if ok1 {
  88. RuleOfAmrPose1 = append(RuleOfAmrPose1, f1)
  89. } else {
  90. f2, ok2 := rule.(func(data *visualization_msgs.MarkerArray, param *entity.PjisuvParam) string)
  91. if ok2 {
  92. RuleOfAmrPose2 = append(RuleOfAmrPose2, f2)
  93. } else {
  94. c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Rule方法参数格式错误:", err)
  95. continue
  96. }
  97. }
  98. } else if TopicOfBoundingBoxesFast == topic2 { //2
  99. f1, ok1 := rule.(func(data *pjisuv_msgs.BoundingBoxArray) string)
  100. if ok1 {
  101. RuleOfBoundingBoxesFast1 = append(RuleOfBoundingBoxesFast1, f1)
  102. } else {
  103. f2, ok2 := rule.(func(data *pjisuv_msgs.BoundingBoxArray, param *entity.PjisuvParam) string)
  104. if ok2 {
  105. RuleOfBoundingBoxesFast2 = append(RuleOfBoundingBoxesFast2, f2)
  106. } else {
  107. c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Rule方法参数格式错误:", err)
  108. continue
  109. }
  110. }
  111. } else if TopicOfCameraFault == topic2 { //3
  112. f1, ok1 := rule.(func(data *pjisuv_msgs.FaultVec) string)
  113. if ok1 {
  114. RuleOfCameraFault1 = append(RuleOfCameraFault1, f1)
  115. } else {
  116. f2, ok2 := rule.(func(data *pjisuv_msgs.FaultVec, param *entity.PjisuvParam) string)
  117. if ok2 {
  118. RuleOfCameraFault2 = append(RuleOfCameraFault2, f2)
  119. } else {
  120. c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Rule方法参数格式错误:", err)
  121. continue
  122. }
  123. }
  124. } else if TopicOfCanData == topic2 { //4
  125. f1, ok1 := rule.(func(data *pjisuv_msgs.Frame) string)
  126. if ok1 {
  127. RuleOfCanData1 = append(RuleOfCanData1, f1)
  128. } else {
  129. f2, ok2 := rule.(func(data *pjisuv_msgs.Frame, param *entity.PjisuvParam) string)
  130. if ok2 {
  131. RuleOfCanData2 = append(RuleOfCanData2, f2)
  132. } else {
  133. c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Rule方法参数格式错误:", err)
  134. continue
  135. }
  136. }
  137. } else if TopicOfCh128x1LslidarPointCloud == topic2 { //5
  138. f1, ok1 := rule.(func(data *sensor_msgs.PointCloud2) string)
  139. if ok1 {
  140. RuleOfCh128x1LslidarPointCloud1 = append(RuleOfCh128x1LslidarPointCloud1, f1)
  141. } else {
  142. f2, ok2 := rule.(func(data *sensor_msgs.PointCloud2, param *entity.PjisuvParam) string)
  143. if ok2 {
  144. RuleOfCh128x1LslidarPointCloud2 = append(RuleOfCh128x1LslidarPointCloud2, f2)
  145. } else {
  146. c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Rule方法参数格式错误:", err)
  147. continue
  148. }
  149. }
  150. } else if TopicOfCh64wLLslidarPointCloud == topic2 { //6
  151. f1, ok1 := rule.(func(data *sensor_msgs.PointCloud2) string)
  152. if ok1 {
  153. RuleOfCh64wLLslidarPointCloud1 = append(RuleOfCh64wLLslidarPointCloud1, f1)
  154. } else {
  155. f2, ok2 := rule.(func(data *sensor_msgs.PointCloud2, param *entity.PjisuvParam) string)
  156. if ok2 {
  157. RuleOfCh64wLLslidarPointCloud2 = append(RuleOfCh64wLLslidarPointCloud2, f2)
  158. } else {
  159. c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Rule方法参数格式错误:", err)
  160. continue
  161. }
  162. }
  163. } else if TopicOfCh64wLScan == topic2 { //7
  164. f1, ok1 := rule.(func(data *sensor_msgs.LaserScan) string)
  165. if ok1 {
  166. RuleOfCh64wLScan1 = append(RuleOfCh64wLScan1, f1)
  167. } else {
  168. f2, ok2 := rule.(func(data *sensor_msgs.LaserScan, param *entity.PjisuvParam) string)
  169. if ok2 {
  170. RuleOfCh64wLScan2 = append(RuleOfCh64wLScan2, f2)
  171. } else {
  172. c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Rule方法参数格式错误:", err)
  173. continue
  174. }
  175. }
  176. } else if TopicOfCh64wRLslidarPointCloud == topic2 { //8
  177. //f, ok := rule.(func(data *sensor_msgs.PointCloud2) string)
  178. //if ok != true {
  179. // c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *sensor_msgs.PointCloud2) string):", err)
  180. // continue
  181. //}
  182. //RuleOfCh64wRLslidarPointCloud = append(RuleOfCh64wRLslidarPointCloud, f)
  183. f1, ok1 := rule.(func(data *sensor_msgs.LaserScan) string)
  184. if ok1 {
  185. RuleOfCh64wLScan1 = append(RuleOfCh64wLScan1, f1)
  186. } else {
  187. f2, ok2 := rule.(func(data *sensor_msgs.LaserScan, param *entity.PjisuvParam) string)
  188. if ok2 {
  189. RuleOfCh64wLScan2 = append(RuleOfCh64wLScan2, f2)
  190. } else {
  191. c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Rule方法参数格式错误:", err)
  192. continue
  193. }
  194. }
  195. } else if TopicOfCh64wRScan == topic2 { //9
  196. f, ok := rule.(func(data *sensor_msgs.LaserScan) string)
  197. if ok != true {
  198. c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *sensor_msgs.LaserScan) string):", err)
  199. continue
  200. }
  201. RuleOfCh64wRScan = append(RuleOfCh64wRScan, f)
  202. } else if TopicOfCicvLidarclusterMovingObjects == topic2 { //10
  203. f, ok := rule.(func(data *pjisuv_msgs.PerceptionCicvMovingObjects) string)
  204. if ok != true {
  205. c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *pjisuv_msgs.PerceptionCicvMovingObjects) string):", err)
  206. continue
  207. }
  208. RuleOfCicvLidarclusterMovingObjects = append(RuleOfCicvLidarclusterMovingObjects, f)
  209. } else if TopicOfCicvAmrTrajectory == topic2 { //11
  210. f, ok := rule.(func(data *pjisuv_msgs.Trajectory, param entity.PjisuvParam) string)
  211. if ok != true {
  212. c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *pjisuv_msgs.Trajectory,param entity.PjisuvParam) string):", err)
  213. continue
  214. }
  215. RuleOfCicvAmrTrajectory = append(RuleOfCicvAmrTrajectory, f)
  216. } else if TopicOfCicvLocation == topic2 { //12
  217. f1, ok1 := rule.(func(data *pjisuv_msgs.PerceptionLocalization) string)
  218. if ok1 {
  219. RuleOfCicvLocation1 = append(RuleOfCicvLocation1, f1)
  220. } else {
  221. f2, ok2 := rule.(func(data *pjisuv_msgs.PerceptionLocalization, param *entity.PjisuvParam) string)
  222. if ok2 {
  223. RuleOfCicvLocation2 = append(RuleOfCicvLocation2, f2)
  224. } else {
  225. c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Rule方法参数格式错误:", err)
  226. continue
  227. }
  228. }
  229. } else if TopicOfCloudClusters == topic2 { //13
  230. f, ok := rule.(func(data *pjisuv_msgs.AutowareCloudClusterArray) string)
  231. if ok != true {
  232. c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *pjisuv_msgs.AutowareCloudClusterArray) string):", err)
  233. continue
  234. }
  235. RuleOfCloudClusters = append(RuleOfCloudClusters, f)
  236. } else if TopicOfHeartbeatInfo == topic2 { //14
  237. f, ok := rule.(func(data *pjisuv_msgs.HeartBeatInfo) string)
  238. if ok != true {
  239. c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *pjisuv_msgs.HeartBeatInfo) string):", err)
  240. continue
  241. }
  242. RuleOfHeartbeatInfo = append(RuleOfHeartbeatInfo, f)
  243. } else if TopicOfLidarPretreatmentCost == topic2 { //15
  244. f, ok := rule.(func(data *geometry_msgs.Vector3Stamped) string)
  245. if ok != true {
  246. c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *geometry_msgs.Vector3Stamped) string):", err)
  247. continue
  248. }
  249. RuleOfLidarPretreatmentCost = append(RuleOfLidarPretreatmentCost, f)
  250. } else if TopicOfLidarPretreatmentOdometry == topic2 { //16
  251. f, ok := rule.(func(data *nav_msgs.Odometry) string)
  252. if ok != true {
  253. c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *nav_msgs.Odometry) string):", err)
  254. continue
  255. }
  256. RuleOfLidarPretreatmentOdometry = append(RuleOfLidarPretreatmentOdometry, f)
  257. } else if TopicOfLidarRoi == topic2 { //17
  258. f, ok := rule.(func(data *geometry_msgs.PolygonStamped) string)
  259. if ok != true {
  260. c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *geometry_msgs.PolygonStamped) string):", err)
  261. continue
  262. }
  263. RuleOfLidarRoi = append(RuleOfLidarRoi, f)
  264. } else if TopicOfLine1 == topic2 { //18
  265. f, ok := rule.(func(data *nav_msgs.Path) string)
  266. if ok != true {
  267. c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *nav_msgs.Path) string):", err)
  268. continue
  269. }
  270. RuleOfLine1 = append(RuleOfLine1, f)
  271. } else if TopicOfLine2 == topic2 { //19
  272. f, ok := rule.(func(data *nav_msgs.Path) string)
  273. if ok != true {
  274. c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *nav_msgs.Path) string):", err)
  275. continue
  276. }
  277. RuleOfLine2 = append(RuleOfLine2, f)
  278. } else if TopicOfMapPolygon == topic2 { //20
  279. f, ok := rule.(func(data *pjisuv_msgs.PolygonStamped, param entity.PjisuvParam) string)
  280. if ok != true {
  281. c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *pjisuv_msgs.PolygonStamped,param entity.PjisuvParam) string):", err)
  282. continue
  283. }
  284. RuleOfMapPolygon = append(RuleOfMapPolygon, f)
  285. } else if TopicOfObstacleDisplay == topic2 { //21
  286. f, ok := rule.(func(data *visualization_msgs.MarkerArray) string)
  287. if ok != true {
  288. c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *visualization_msgs.MarkerArray) string):", err)
  289. continue
  290. }
  291. RuleOfObstacleDisplay = append(RuleOfObstacleDisplay, f)
  292. } else if TopicOfPjControlPub == topic2 { //22
  293. f, ok := rule.(func(data *pjisuv_msgs.CommonVehicleCmd) string)
  294. if ok != true {
  295. c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *pjisuv_msgs.CommonVehicleCmd) string):", err)
  296. continue
  297. }
  298. RuleOfPjControlPub = append(RuleOfPjControlPub, f)
  299. } else if TopicOfPointsCluster == topic2 { //23
  300. f, ok := rule.(func(data *sensor_msgs.PointCloud2) string)
  301. if ok != true {
  302. c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *sensor_msgs.PointCloud2) string):", err)
  303. continue
  304. }
  305. RuleOfPointsCluster = append(RuleOfPointsCluster, f)
  306. } else if TopicOfPointsConcat == topic2 { //24
  307. f, ok := rule.(func(data *sensor_msgs.PointCloud2) string)
  308. if ok != true {
  309. c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *sensor_msgs.PointCloud2) string):", err)
  310. continue
  311. }
  312. RuleOfPointsConcat = append(RuleOfPointsConcat, f)
  313. } else if TopicOfReferenceDisplay == topic2 { //25
  314. f, ok := rule.(func(data *nav_msgs.Path) string)
  315. if ok != true {
  316. c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *nav_msgs.Path) string):", err)
  317. continue
  318. }
  319. RuleOfReferenceDisplay = append(RuleOfReferenceDisplay, f)
  320. } else if TopicOfReferenceTrajectory == topic2 { //26
  321. f, ok := rule.(func(data *pjisuv_msgs.Trajectory) string)
  322. if ok != true {
  323. c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *pjisuv_msgs.Trajectory) string):", err)
  324. continue
  325. }
  326. RuleOfReferenceTrajectory = append(RuleOfReferenceTrajectory, f)
  327. } else if TopicOfRoiPoints == topic2 { //27
  328. f, ok := rule.(func(data *sensor_msgs.PointCloud2) string)
  329. if ok != true {
  330. c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *sensor_msgs.PointCloud2) string):", err)
  331. continue
  332. }
  333. RuleOfRoiPoints = append(RuleOfRoiPoints, f)
  334. } else if TopicOfRoiPolygon == topic2 { //28
  335. f, ok := rule.(func(data *nav_msgs.Path) string)
  336. if ok != true {
  337. c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *nav_msgs.Path) string):", err)
  338. continue
  339. }
  340. RuleOfRoiPolygon = append(RuleOfRoiPolygon, f)
  341. } else if TopicOfTf == topic2 { //29
  342. f, ok := rule.(func(data *tf2_msgs.TFMessage) string)
  343. if ok != true {
  344. c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *tf2_msgs.TFMessage) string):", err)
  345. continue
  346. }
  347. RuleOfTf = append(RuleOfTf, f)
  348. } else if TopicOfTpperception == topic2 { //30
  349. f, ok := rule.(func(data *pjisuv_msgs.PerceptionObjects, param entity.PjisuvParam) string)
  350. if ok != true {
  351. c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *pjisuv_msgs.PerceptionObjects, param entity.ExtendParam) string):", err)
  352. continue
  353. }
  354. RuleOfTpperception = append(RuleOfTpperception, f)
  355. } else if TopicOfTpperceptionVis == topic2 { //31
  356. f, ok := rule.(func(data *visualization_msgs.MarkerArray) string)
  357. if ok != true {
  358. c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *visualization_msgs.MarkerArray) string):", err)
  359. continue
  360. }
  361. RuleOfTpperceptionVis = append(RuleOfTpperceptionVis, f)
  362. } else if TopicOfTprouteplan == topic2 { //32
  363. f, ok := rule.(func(data *pjisuv_msgs.RoutePlan) string)
  364. if ok != true {
  365. c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *pjisuv_msgs.RoutePlan) string):", err)
  366. continue
  367. }
  368. RuleOfTprouteplan = append(RuleOfTprouteplan, f)
  369. } else if TopicOfTrajectoryDisplay == topic2 { //33
  370. f, ok := rule.(func(data *nav_msgs.Path) string)
  371. if ok != true {
  372. c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *nav_msgs.Path) string):", err)
  373. continue
  374. }
  375. RuleOfTrajectoryDisplay = append(RuleOfTrajectoryDisplay, f)
  376. } else if TopicOfUngroundCloudpoints == topic2 { //34
  377. f, ok := rule.(func(data *sensor_msgs.PointCloud2) string)
  378. if ok != true {
  379. c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *sensor_msgs.PointCloud2) string):", err)
  380. continue
  381. }
  382. RuleOfUngroundCloudpoints = append(RuleOfUngroundCloudpoints, f)
  383. } else if TopicOfCameraImage == topic2 { //35
  384. f, ok := rule.(func(data *sensor_msgs.Image) string)
  385. if ok != true {
  386. c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *sensor_msgs.Image) string):", err)
  387. continue
  388. }
  389. RuleOfCameraImage = append(RuleOfCameraImage, f)
  390. } else if TopicOfDataRead == topic2 { //36
  391. f, ok := rule.(func(data *pjisuv_msgs.Retrieval) string)
  392. if ok != true {
  393. c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *pjisuv_msgs.Retrieval) string):", err)
  394. continue
  395. }
  396. RuleOfDataRead = append(RuleOfDataRead, f)
  397. } else if TopicOfPjVehicleFdbPub == topic2 { //39
  398. f, ok := rule.(func(data *pjisuv_msgs.VehicleFdb, param *entity.PjisuvParam) string)
  399. if ok != true {
  400. c_log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *pjisuv_msgs.VehicleFdb) string):", err)
  401. continue
  402. }
  403. RuleOfPjVehicleFdbPub = append(RuleOfPjVehicleFdbPub, f)
  404. } else {
  405. c_log.GlobalLogger.Error("未知的topic:", topic2)
  406. continue
  407. }
  408. label, err := open.Lookup("Label")
  409. if err != nil {
  410. c_log.GlobalLogger.Error("加载本地插件 ", triggerLocalPath, " 中的 Label 方法失败。", err)
  411. continue
  412. }
  413. labelFunc := label.(func() string)
  414. labelString := labelFunc()
  415. LabelMapTriggerId.Store(labelString, triggerId)
  416. success++
  417. }
  418. c_log.GlobalLogger.Info("一共应加载", len(config.PlatformConfig.TaskTriggers), "个触发器,实际加载 ", success, " 个触发器。")
  419. }