package cfg import ( "cicv-data-closedloop/kinglong/common/cfg" "cicv-data-closedloop/kinglong/common/cutil" "cicv-data-closedloop/kinglong/common/log" "cicv-data-closedloop/pjisuv_msgs" "plugin" "strconv" "strings" ) var ( TopicOfNodeFaultInfo = "/nodefault_info" TopicOfCicvLocation = "/cicv_location" TopicOfTpperception = "/tpperception" TopicOfFaultInfo = "/fault_info" TopicOfDataRead = "/data_read" RuleOfNodefaultInfo []func(data *pjisuv_msgs.FaultInfo) string RuleOfCicvLocation []func(data *pjisuv_msgs.PerceptionLocalization) string RuleOfTpperception []func(data *pjisuv_msgs.PerceptionObjects, velocityX float64, velocityY float64, yaw float64) string RuleOfFaultInfo []func(data *pjisuv_msgs.FaultVec) string RuleOfDataRead []func(data *pjisuv_msgs.Retrieval) string LabelMapTriggerId = make(map[string]string) ) func InitTriggerConfig() { log.GlobalLogger.Info("主节点加载触发器插件 - 开始。") // 下载所有触发器的文件 for _, trigger := range cfg.PlatformConfig.TaskTriggers { // 获取文件名 pathSplit := strings.Split(trigger.TriggerScriptPath, "/") fileName := pathSplit[len(pathSplit)-1] // 下载 triggerLocalPath := cfg.CloudConfig.TriggersDir + fileName cutil.CreateParentDir(triggerLocalPath) log.GlobalLogger.Info("下载触发器插件从 ", trigger.TriggerScriptPath, " 到 ", triggerLocalPath) err := cfg.OssBucket.GetObjectToFile(trigger.TriggerScriptPath, triggerLocalPath) if err != nil { log.GlobalLogger.Error("下载 oss 上的触发器插件失败:", err) continue } // 载入插件到数组 open, err := plugin.Open(triggerLocalPath) if err != nil { log.GlobalLogger.Error("加载本地插件", triggerLocalPath, "失败。", err) continue } topic0, err := open.Lookup("Topic") if err != nil { log.GlobalLogger.Error("加载本地插件", triggerLocalPath, "中的Topic方法失败。", err) continue } topic1, ok := topic0.(func() string) if ok != true { log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func() string):", err) continue } topic2 := topic1() rule, err := open.Lookup("Rule") if err != nil { log.GlobalLogger.Error("加载本地插件", triggerLocalPath, "中的Rule方法失败。", err) continue } if TopicOfNodeFaultInfo == topic2 { f, ok := rule.(func(data *pjisuv_msgs.FaultInfo) string) if ok != true { log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *kinglong_msgs.FaultInfo) string):", err) continue } RuleOfNodefaultInfo = append(RuleOfNodefaultInfo, f) } else if TopicOfCicvLocation == topic2 { f, ok := rule.(func(data *pjisuv_msgs.PerceptionLocalization) string) if ok != true { log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *kinglong_msgs.PerceptionLocalization) string):", err) continue } RuleOfCicvLocation = append(RuleOfCicvLocation, f) } else if TopicOfTpperception == topic2 { f, ok := rule.(func(data *pjisuv_msgs.PerceptionObjects, velocityX float64, velocityY float64, yaw float64) string) if ok != true { log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *kinglong_msgs.PerceptionObjects, velocityX float64, velocityY float64, yaw float64) string):", err) continue } RuleOfTpperception = append(RuleOfTpperception, f) } else if TopicOfFaultInfo == topic2 { f, ok := rule.(func(data *pjisuv_msgs.FaultVec) string) if ok != true { log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *kinglong_msgs.FaultVec) string):", err) continue } RuleOfFaultInfo = append(RuleOfFaultInfo, f) } else if TopicOfDataRead == topic2 { f, ok := rule.(func(data *pjisuv_msgs.Retrieval) string) if ok != true { log.GlobalLogger.Error("插件", triggerLocalPath, "中的Topic方法必须是(func(data *kinglong_msgs.Retrieval) string):", err) continue } RuleOfDataRead = append(RuleOfDataRead, f) } else { log.GlobalLogger.Error("未知的topic:", topic2) continue } label, err := open.Lookup("Label") if err != nil { log.GlobalLogger.Error("加载本地插件 ", triggerLocalPath, " 中的 Label 方法失败。", err) continue } labelFunc := label.(func() string) labelString := labelFunc() LabelMapTriggerId[labelString] = strconv.Itoa(trigger.TriggerId) log.GlobalLogger.Info("主节点加载触发器插件:【ros topic】=", topic2, ",【触发器label】=", labelString, "【触发器ID】=", trigger.TriggerId, "【label和id映射关系】=", LabelMapTriggerId) } log.GlobalLogger.Info("主节点加载触发器插件 - 成功。") }