孟令鑫 1 год назад
Родитель
Сommit
ee2722e839
2 измененных файлов с 75 добавлено и 59 удалено
  1. 58 59
      aarch64/pjisuv/master/package/service/produce_window.go
  2. 17 0
      common/util/u_slice.go

+ 58 - 59
aarch64/pjisuv/master/package/service/produce_window.go

@@ -1,13 +1,12 @@
 package svc
 
 import (
-	commonConfig "cicv-data-closedloop/kinglong/common/cfg"
-	"cicv-data-closedloop/kinglong/common/ent"
-	"cicv-data-closedloop/kinglong/common/global"
-	"cicv-data-closedloop/kinglong/common/log"
-	"cicv-data-closedloop/kinglong/common/svc"
-	"cicv-data-closedloop/kinglong/common/util"
-	masterConfig "cicv-data-closedloop/kinglong/master/pkg/cfg"
+	commonConfig "cicv-data-closedloop/aarch64/pjisuv/common/config"
+	"cicv-data-closedloop/aarch64/pjisuv/common/service"
+	masterConfig "cicv-data-closedloop/aarch64/pjisuv/master/package/config"
+	"cicv-data-closedloop/common/config/c_log"
+	"cicv-data-closedloop/common/entity"
+	"cicv-data-closedloop/common/util"
 	"cicv-data-closedloop/pjisuv_msgs"
 	"github.com/bluenviron/goroslib/v2"
 	"os"
@@ -29,33 +28,33 @@ var (
 
 // PrepareTimeWindowProducerQueue 负责监听所有主题并修改时间窗口
 func PrepareTimeWindowProducerQueue() {
-	log.GlobalLogger.Info("订阅者 goroutine,启动。")
+	c_log.GlobalLogger.Info("订阅者 goroutine,启动。")
 
 	//创建订阅者0订阅主题 nodefault_info
-	log.GlobalLogger.Info("创建订阅者0订阅话题 ", masterConfig.TopicOfNodeFaultInfo)
+	c_log.GlobalLogger.Info("创建订阅者0订阅话题 ", masterConfig.TopicOfNodeFaultInfo)
 	subscriber0, err := goroslib.NewSubscriber(goroslib.SubscriberConf{
 		Node:  commonConfig.RosNode,
 		Topic: masterConfig.TopicOfNodeFaultInfo,
 		Callback: func(data *pjisuv_msgs.FaultInfo) {
 			if len(masterConfig.RuleOfNodefaultInfo) == 0 {
-				//log.GlobalLogger.Info("话题 nodefault_info没有触发器")
+				//c_log.GlobalLogger.Info("话题 nodefault_info没有触发器")
 				return
 			}
-			global.Subscriber0TimeMutex.Lock()
+			entity.Subscriber0TimeMutex.Lock()
 			// 判断是否是连续故障码
-			gap := time.Since(global.Subscriber0Time).Seconds()
+			gap := time.Since(entity.Subscriber0Time).Seconds()
 			if gap < 2 {
-				global.Subscriber0Time = time.Now()
-				global.Subscriber0TimeMutex.Unlock()
+				entity.Subscriber0Time = time.Now()
+				entity.Subscriber0TimeMutex.Unlock()
 				return
 			} else {
 				// 2 不是连续故障码
-				global.Subscriber0Time = time.Now()
-				global.Subscriber0TimeMutex.Unlock()
+				entity.Subscriber0Time = time.Now()
+				entity.Subscriber0TimeMutex.Unlock()
 				subscriber0Mutex.Lock()
 				{
-					faultHappenTime := util.GetNowTimeCustom() // 获取当前故障发生时间
-					lastTimeWindow := util.GetLastTimeWindow() // 获取最后一个时间窗口
+					faultHappenTime := util.GetNowTimeCustom()   // 获取当前故障发生时间
+					lastTimeWindow := entity.GetLastTimeWindow() // 获取最后一个时间窗口
 					var faultLabel string
 					for _, f := range masterConfig.RuleOfNodefaultInfo {
 						faultLabel = f(data)
@@ -70,23 +69,23 @@ func PrepareTimeWindowProducerQueue() {
 
 		}})
 	if err != nil {
-		log.GlobalLogger.Info("创建订阅者0发生故障:", err)
+		c_log.GlobalLogger.Info("创建订阅者0发生故障:", err)
 		os.Exit(-1)
 	}
 	// 创建订阅者1订阅主题 cicv_location
-	log.GlobalLogger.Info("创建订阅者1订阅话题 ", masterConfig.TopicOfCicvLocation)
+	c_log.GlobalLogger.Info("创建订阅者1订阅话题 ", masterConfig.TopicOfCicvLocation)
 	subscriber1, err := goroslib.NewSubscriber(goroslib.SubscriberConf{
 		Node:  commonConfig.RosNode,
 		Topic: masterConfig.TopicOfCicvLocation,
 		Callback: func(data *pjisuv_msgs.PerceptionLocalization) {
 			if len(masterConfig.RuleOfCicvLocation) == 0 {
-				log.GlobalLogger.Info("话题 cicv_location 没有触发器")
+				c_log.GlobalLogger.Info("话题 cicv_location 没有触发器")
 				return
 			}
 			subscriber1Mutex.Lock()
 			{
-				faultHappenTime := util.GetNowTimeCustom() // 获取当前故障发生时间
-				lastTimeWindow := util.GetLastTimeWindow() // 获取最后一个时间窗口
+				faultHappenTime := util.GetNowTimeCustom()   // 获取当前故障发生时间
+				lastTimeWindow := entity.GetLastTimeWindow() // 获取最后一个时间窗口
 				// 更新共享变量
 				m.RLock()
 				{
@@ -108,33 +107,33 @@ func PrepareTimeWindowProducerQueue() {
 		},
 	})
 	if err != nil {
-		log.GlobalLogger.Info("创建订阅者1发生故障:", err)
+		c_log.GlobalLogger.Info("创建订阅者1发生故障:", err)
 		os.Exit(-1)
 	}
 	// 创建订阅者2订阅主题 tpperception
-	log.GlobalLogger.Info("创建订阅者2订阅话题 ", masterConfig.TopicOfTpperception)
+	c_log.GlobalLogger.Info("创建订阅者2订阅话题 ", masterConfig.TopicOfTpperception)
 	subscriber2, err := goroslib.NewSubscriber(goroslib.SubscriberConf{
 		Node:  commonConfig.RosNode,
 		Topic: masterConfig.TopicOfTpperception,
 		Callback: func(data *pjisuv_msgs.PerceptionObjects) {
 			if len(masterConfig.RuleOfTpperception) == 0 {
-				log.GlobalLogger.Info("话题 tpperception 没有触发器")
+				c_log.GlobalLogger.Info("话题 tpperception 没有触发器")
 				return
 			}
-			global.Subscriber2TimeMutex.Lock()
+			entity.Subscriber2TimeMutex.Lock()
 			// 判断是否是连续故障码
-			gap := time.Since(global.Subscriber2Time).Seconds()
+			gap := time.Since(entity.Subscriber2Time).Seconds()
 			if gap < 10 {
-				global.Subscriber2TimeMutex.Unlock()
+				entity.Subscriber2TimeMutex.Unlock()
 				return
 			} else {
 				// 2 不是连续故障码
-				global.Subscriber2Time = time.Now()
-				global.Subscriber2TimeMutex.Unlock()
+				entity.Subscriber2Time = time.Now()
+				entity.Subscriber2TimeMutex.Unlock()
 				subscriber2Mutex.Lock()
 				{
-					faultHappenTime := util.GetNowTimeCustom() // 获取当前故障发生时间
-					lastTimeWindow := util.GetLastTimeWindow() // 获取最后一个时间窗口
+					faultHappenTime := util.GetNowTimeCustom()   // 获取当前故障发生时间
+					lastTimeWindow := entity.GetLastTimeWindow() // 获取最后一个时间窗口
 					var faultLabel string
 					for _, f := range masterConfig.RuleOfTpperception {
 						faultLabel = f(data, velocityX, velocityY, yaw)
@@ -149,34 +148,34 @@ func PrepareTimeWindowProducerQueue() {
 
 		}})
 	if err != nil {
-		log.GlobalLogger.Info("创建订阅者2发生故障:", err)
+		c_log.GlobalLogger.Info("创建订阅者2发生故障:", err)
 		os.Exit(-1)
 	}
 	// 创建订阅者3订阅主题 fault_info
-	log.GlobalLogger.Info("创建订阅者3订阅话题 ", masterConfig.TopicOfFaultInfo)
+	c_log.GlobalLogger.Info("创建订阅者3订阅话题 ", masterConfig.TopicOfFaultInfo)
 	subscriber3, err := goroslib.NewSubscriber(goroslib.SubscriberConf{
 		Node:  commonConfig.RosNode,
 		Topic: masterConfig.TopicOfFaultInfo,
 		Callback: func(data *pjisuv_msgs.FaultVec) {
 			if len(masterConfig.RuleOfFaultInfo) == 0 {
-				log.GlobalLogger.Info("话题 fault_info 没有触发器")
+				c_log.GlobalLogger.Info("话题 fault_info 没有触发器")
 				return
 			}
-			global.Subscriber3TimeMutex.Lock()
+			entity.Subscriber3TimeMutex.Lock()
 			// 判断是否是连续故障码
-			gap := time.Since(global.Subscriber3Time).Seconds()
+			gap := time.Since(entity.Subscriber3Time).Seconds()
 			if gap < 2 {
-				global.Subscriber3Time = time.Now()
-				global.Subscriber3TimeMutex.Unlock()
+				entity.Subscriber3Time = time.Now()
+				entity.Subscriber3TimeMutex.Unlock()
 				return
 			} else {
 				// 2 不是连续故障码
-				global.Subscriber3Time = time.Now()
-				global.Subscriber3TimeMutex.Unlock()
+				entity.Subscriber3Time = time.Now()
+				entity.Subscriber3TimeMutex.Unlock()
 				subscriber3Mutex.Lock()
 				{
-					faultHappenTime := util.GetNowTimeCustom() // 获取当前故障发生时间
-					lastTimeWindow := util.GetLastTimeWindow() // 获取最后一个时间窗口
+					faultHappenTime := util.GetNowTimeCustom()   // 获取当前故障发生时间
+					lastTimeWindow := entity.GetLastTimeWindow() // 获取最后一个时间窗口
 					var faultLabel string
 					for _, f := range masterConfig.RuleOfFaultInfo {
 						faultLabel = f(data)
@@ -191,24 +190,24 @@ func PrepareTimeWindowProducerQueue() {
 
 		}})
 	if err != nil {
-		log.GlobalLogger.Info("创建订阅者3发生故障:", err)
+		c_log.GlobalLogger.Info("创建订阅者3发生故障:", err)
 		os.Exit(-1)
 	}
 	// 创建订阅者4订阅主题 data_read
 	// TODO 高频率触发
-	log.GlobalLogger.Info("创建订阅者4订阅话题 ", masterConfig.TopicOfDataRead)
+	c_log.GlobalLogger.Info("创建订阅者4订阅话题 ", masterConfig.TopicOfDataRead)
 	subscriber4, err := goroslib.NewSubscriber(goroslib.SubscriberConf{
 		Node:  commonConfig.RosNode,
 		Topic: masterConfig.TopicOfDataRead,
 		Callback: func(data *pjisuv_msgs.Retrieval) {
 			if len(masterConfig.RuleOfDataRead) == 0 {
-				//log.GlobalLogger.Info("话题 data_read 没有触发器")
+				//c_log.GlobalLogger.Info("话题 data_read 没有触发器")
 				return
 			}
 			subscriber4Mutex.Lock()
 			{
-				faultHappenTime := util.GetNowTimeCustom() // 获取当前故障发生时间
-				lastTimeWindow := util.GetLastTimeWindow() // 获取最后一个时间窗口
+				faultHappenTime := util.GetNowTimeCustom()   // 获取当前故障发生时间
+				lastTimeWindow := entity.GetLastTimeWindow() // 获取最后一个时间窗口
 				var faultLabel string
 				for _, f := range masterConfig.RuleOfDataRead {
 					faultLabel = f(data)
@@ -222,13 +221,13 @@ func PrepareTimeWindowProducerQueue() {
 		},
 	})
 	if err != nil {
-		log.GlobalLogger.Info("创建订阅者3发生故障:", err)
+		c_log.GlobalLogger.Info("创建订阅者3发生故障:", err)
 		os.Exit(-1)
 	}
 	select {
-	case signal := <-svc.ChannelKillWindowProducer:
+	case signal := <-service.ChannelKillWindowProducer:
 		if signal == 1 {
-			defer svc.AddKillTimes("3")
+			defer service.AddKillTimes("3")
 			subscriber0.Close()
 			subscriber1.Close()
 			subscriber2.Close()
@@ -240,11 +239,11 @@ func PrepareTimeWindowProducerQueue() {
 	}
 }
 
-func saveTimeWindow(faultLabel string, faultHappenTime string, lastTimeWindow *ent.TimeWindow) {
+func saveTimeWindow(faultLabel string, faultHappenTime string, lastTimeWindow *entity.TimeWindow) {
 	masterTopics, slaveTopics := getTopicsOfNode(faultLabel)
 	if lastTimeWindow == nil || util.TimeCustom1GreaterTimeCustom2(faultHappenTime, lastTimeWindow.TimeWindowEnd) {
 		// 2-1 如果是不在旧故障窗口内,添加一个新窗口
-		newTimeWindow := ent.TimeWindow{
+		newTimeWindow := entity.TimeWindow{
 			FaultTime:       faultHappenTime,
 			TimeWindowBegin: util.TimeCustomChange(faultHappenTime, -commonConfig.PlatformConfig.TaskBeforeTime),
 			TimeWindowEnd:   util.TimeCustomChange(faultHappenTime, commonConfig.PlatformConfig.TaskAfterTime),
@@ -253,13 +252,13 @@ func saveTimeWindow(faultLabel string, faultHappenTime string, lastTimeWindow *e
 			MasterTopics:    masterTopics,
 			SlaveTopics:     slaveTopics,
 		}
-		log.GlobalLogger.Infof("不在旧故障窗口内,向生产者队列添加一个新窗口,【Lable】=%v,【FaultTime】=%v,【Length】=%v", newTimeWindow.Labels, newTimeWindow.FaultTime, newTimeWindow.Length)
+		c_log.GlobalLogger.Infof("不在旧故障窗口内,向生产者队列添加一个新窗口,【Lable】=%v,【FaultTime】=%v,【Length】=%v", newTimeWindow.Labels, newTimeWindow.FaultTime, newTimeWindow.Length)
 
-		util.AddTimeWindowToTimeWindowProducerQueue(newTimeWindow)
+		entity.AddTimeWindowToTimeWindowProducerQueue(newTimeWindow)
 	} else {
 		// 2-2 如果在旧故障窗口内
-		global.TimeWindowProducerQueueMutex.RLock()
-		defer global.TimeWindowProducerQueueMutex.RUnlock()
+		entity.TimeWindowProducerQueueMutex.RLock()
+		defer entity.TimeWindowProducerQueueMutex.RUnlock()
 		// 2-2-1 更新故障窗口end时间
 		maxEnd := util.TimeCustomChange(lastTimeWindow.TimeWindowBegin, commonConfig.PlatformConfig.TaskMaxTime)
 		expectEnd := util.TimeCustomChange(faultHappenTime, commonConfig.PlatformConfig.TaskAfterTime)
@@ -280,7 +279,7 @@ func saveTimeWindow(faultLabel string, faultHappenTime string, lastTimeWindow *e
 		lastTimeWindow.MasterTopics = util.MergeSlice(sourceMasterTopics, masterTopics)
 		sourceSlaveTopics := lastTimeWindow.SlaveTopics
 		lastTimeWindow.SlaveTopics = util.MergeSlice(sourceSlaveTopics, slaveTopics)
-		log.GlobalLogger.Infof("在旧故障窗口内,更新生产者队列最新的窗口,【Lable】=%v,【FaultTime】=%v,【Length】=%v", lastTimeWindow.Labels, lastTimeWindow.FaultTime, lastTimeWindow.Length)
+		c_log.GlobalLogger.Infof("在旧故障窗口内,更新生产者队列最新的窗口,【Lable】=%v,【FaultTime】=%v,【Length】=%v", lastTimeWindow.Labels, lastTimeWindow.FaultTime, lastTimeWindow.Length)
 
 	}
 }

+ 17 - 0
common/util/u_slice.go

@@ -9,3 +9,20 @@ func AppendIfNotExists(slice []string, element string) []string {
 	}
 	return append(slice, element) // 元素不存在,追加到切片末尾
 }
+func MergeSlice(slice1 []string, slice2 []string) []string {
+
+	// 遍历第二个切片中的元素,并去重追加到结果切片1中
+	for _, element := range slice2 {
+		found := false
+		for _, item := range slice1 {
+			if element == item {
+				found = true
+				break
+			}
+		}
+		if !found {
+			slice1 = append(slice1, element)
+		}
+	}
+	return slice1
+}