LingxinMeng 9 ay önce
ebeveyn
işleme
2f35878c5d

+ 5 - 3
aarch64/pjisuv/master/config/trigger_init.go

@@ -6,6 +6,7 @@ import (
 	"cicv-data-closedloop/common/util"
 	"cicv-data-closedloop/pjisuv_msgs"
 	entity "cicv-data-closedloop/pjisuv_param"
+	"cicv-data-closedloop/pjisuv_ticker"
 	"github.com/bluenviron/goroslib/v2/pkg/msgs/geometry_msgs"
 	"github.com/bluenviron/goroslib/v2/pkg/msgs/nav_msgs"
 	"github.com/bluenviron/goroslib/v2/pkg/msgs/sensor_msgs"
@@ -82,11 +83,12 @@ func InitTriggerConfig() {
 			continue
 		}
 
-		if TopicOfCicvExtend == topic2 { // 自定义扩展
-			if f, ok1 := rule.(func(param entity.PjisuvParam) string); ok1 {
-				RuleOfCicvExtend = append(RuleOfCicvExtend, f)
+		if pjisuv_ticker.TickerTopic == topic2 { // 定时任务触发器
+			if f, ok1 := rule.(func(shareVars *sync.Map) string); ok1 {
+				RuleOfCicvTicker = append(RuleOfCicvTicker, f)
 				goto JudgeDone
 			}
+			log(triggerLocalPath)
 			continue
 		} else if TopicOfAmrPose == topic2 { //1
 			if f, ok1 := rule.(func(data *visualization_msgs.MarkerArray) string); ok1 {

+ 3 - 3
aarch64/pjisuv/master/config/trigger_var.go

@@ -13,9 +13,9 @@ import (
 
 var (
 	LabelMapTriggerId = new(sync.Map)
-	// 扩展
-	TopicOfCicvExtend = "/cicv_extend"
-	RuleOfCicvExtend  []func(param pjisuv_param.PjisuvParam) string
+
+	// 定时任务触发器,详见 pjisuv_ticker包
+	RuleOfCicvTicker = make([]func(shareVars *sync.Map) string, 0) // tick代表定时任务间隔时间;对于长度为0的slice,无论是使用var还是make创建,它们在内存占用上的差异通常可以忽略不计
 
 	//1
 	TopicOfAmrPose = "/amr_pose"

+ 18 - 10
aarch64/pjisuv/master/service/produce_window.go

@@ -9,6 +9,7 @@ import (
 	"cicv-data-closedloop/common/util"
 	"cicv-data-closedloop/pjisuv_msgs"
 	"cicv-data-closedloop/pjisuv_param"
+	"cicv-data-closedloop/pjisuv_ticker"
 	"github.com/bluenviron/goroslib/v2"
 	"github.com/bluenviron/goroslib/v2/pkg/msgs/geometry_msgs"
 	"github.com/bluenviron/goroslib/v2/pkg/msgs/nav_msgs"
@@ -22,6 +23,8 @@ import (
 
 // 所有共享变量
 var (
+	tickChan = make(chan string)
+
 	pjisuvParam = pjisuv_param.PjisuvParam{
 		ObjDicOfTpperception:      make(map[uint32][]float32),
 		ObjTypeDicOfTpperception:  make(map[uint32]uint8),
@@ -59,18 +62,23 @@ func ProduceWindow() {
 	subscribersMutexes := make([]sync.Mutex, len(commonConfig.SubscribeTopics))
 	for i, topic := range commonConfig.SubscribeTopics {
 		for {
-			// 增加了可扩展性
-			if topic == masterConfig.TopicOfCicvExtend {
+			// 定时器,区别于订阅者
+			if topic == pjisuv_ticker.TickerTopic {
+				// 1 把所有触发器函数执行一遍,触发器内部创建额外的定时任务goroutine
+				for _, f := range masterConfig.RuleOfCicvTicker {
+					f(shareVars)
+				}
+				// 2 创建goroutine接收定时任务触发器返回的Label和Time,执行触发逻辑
 				go func() {
 					for {
-						time.Sleep(time.Duration(3500) * time.Millisecond)
-						for _, f := range masterConfig.RuleOfCicvExtend {
-							label := f(pjisuvParam)
-							if label != "" {
-								saveTimeWindow(label, util.GetNowTimeCustom(), commonEntity.GetLastTimeWindow())
-								subscribersTimes[i] = time.Now()
-								break
-							}
+						time.Sleep(time.Duration(1)) // 降低循环频率
+						select {
+						case tickInfo := <-pjisuv_ticker.TickerChan:
+							faultLabel := tickInfo.FaultLabel
+							faultHappenTime := tickInfo.FaultHappenTime
+							lastTimeWindow := commonEntity.GetLastTimeWindow() // 获取最后一个时间窗口
+							saveTimeWindow(faultLabel, faultHappenTime, lastTimeWindow)
+						default:
 						}
 					}
 				}()

+ 22 - 0
pjisuv_ticker/ticker_chan.go

@@ -0,0 +1,22 @@
+package pjisuv_ticker
+
+import "time"
+
+/*
+ 此文件为固定版本,不允许任何修改
+*/
+
+var TickerTopic = "/cicv_ticker"
+
+var TickerChan = make(chan TickInfo)
+
+type TickInfo struct {
+	FaultLabel      string
+	FaultHappenTime string
+}
+
+func GetNowTimeCustom() string {
+	currentTime := time.Now()
+	formattedTime := currentTime.Format("2006-01-02-15-04-05")
+	return formattedTime
+}

+ 44 - 0
trigger/pjisuv/cicv_ticker/Example/main/Example.go

@@ -0,0 +1,44 @@
+package main
+
+import (
+	"cicv-data-closedloop/pjisuv_ticker"
+	"fmt"
+	"sync"
+	"time"
+)
+
+// 定时任务触发器固定的
+func Topic() string {
+	return pjisuv_ticker.TickerTopic
+}
+
+// ******* 禁止存在下划线_
+// 触发器标记
+func Label() string {
+	return "Example"
+}
+
+func Rule(shareVars *sync.Map) {
+	defer func() {
+		if r := recover(); r != nil {
+			fmt.Println("Recovered from panic:", r)
+		}
+	}()
+	// 1 使用goroutine
+	go func() {
+		// 2 定义触发器的间隔时间,来自Tick()函数
+		ticker := time.NewTicker(time.Duration(4) * time.Second)
+		defer ticker.Stop()
+		// 3 运行一个无限循环
+		for {
+			select {
+			// 定时器触发时执行的代码
+			case <-ticker.C:
+				if true {
+					// 将错误Label发送到channel通道中
+					pjisuv_ticker.TickerChan <- pjisuv_ticker.TickInfo{FaultLabel: Label(), FaultHappenTime: pjisuv_ticker.GetNowTimeCustom()}
+				}
+			}
+		}
+	}()
+}