|
@@ -4,19 +4,32 @@ import (
|
|
|
commonConfig "cicv-data-closedloop/aarch64/pjisuv/common/config"
|
|
|
"cicv-data-closedloop/common/config/c_log"
|
|
|
"cicv-data-closedloop/common/util"
|
|
|
+ "github.com/bluenviron/goroslib/v2"
|
|
|
+ "github.com/bluenviron/goroslib/v2/pkg/msgs/std_msgs"
|
|
|
"os"
|
|
|
"strings"
|
|
|
+ "sync"
|
|
|
"time"
|
|
|
)
|
|
|
|
|
|
var (
|
|
|
- dir = "/home/root/competition/"
|
|
|
- commandArgs = []string{"record", "--split", "--duration=1", "/pji_gps", "/data_read"}
|
|
|
+ dir = "/home/root/competition/"
|
|
|
+ commandArgs = []string{"record", "--split", "--duration=1", "/pji_gps", "/data_read"}
|
|
|
+ topic = "/cicv_competition"
|
|
|
+ examBeginUrl = "3"
|
|
|
+ cacheMutex sync.Mutex
|
|
|
+ cacheTeamName map[string]time.Time
|
|
|
+ heartBeatTimeThreshold = 5 * time.Second // 心跳时间
|
|
|
)
|
|
|
|
|
|
// todo 实车比赛临时使用
|
|
|
// history record命令无法录制()
|
|
|
func ForCompetition() {
|
|
|
+ go dataCollection()
|
|
|
+}
|
|
|
+
|
|
|
+// 全量数据采集
|
|
|
+func dataCollection() {
|
|
|
c_log.GlobalLogger.Info("开始采集实车算法比赛全量数据。")
|
|
|
util.CreateDir(dir)
|
|
|
// 1 打包
|
|
@@ -46,3 +59,45 @@ func ForCompetition() {
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+// data格式为队伍编号
|
|
|
+// 保存单次考试时间区间
|
|
|
+func examBegin() {
|
|
|
+ _, _ = goroslib.NewSubscriber(goroslib.SubscriberConf{
|
|
|
+ Node: commonConfig.RosNode,
|
|
|
+ Topic: topic,
|
|
|
+ Callback: func(data *std_msgs.String) {
|
|
|
+ teamName := data.Data
|
|
|
+ cacheMutex.Lock()
|
|
|
+ {
|
|
|
+ if !util.ContainsKey(cacheTeamName, teamName) { // 1 如果缓存数组中没有此队名,代表考试开始,缓存此队名,和当前时间戳
|
|
|
+ cacheTeamName[teamName] = time.Now()
|
|
|
+ // todo 发送http请求到begin接口
|
|
|
+ } else { // 2 如果缓存数组中有此队名,代表考试进行中,刷新时间戳
|
|
|
+ cacheTeamName[teamName] = time.Now()
|
|
|
+ }
|
|
|
+ }
|
|
|
+ cacheMutex.Unlock()
|
|
|
+ },
|
|
|
+ })
|
|
|
+}
|
|
|
+
|
|
|
+func examEnd() {
|
|
|
+ for {
|
|
|
+ time.Sleep(time.Duration(1) * time.Second)
|
|
|
+ cacheMutex.Lock()
|
|
|
+ {
|
|
|
+ keysToDelete := []string{}
|
|
|
+ for teamName, heartBeatTime := range cacheTeamName {
|
|
|
+ if time.Since(heartBeatTime) > heartBeatTimeThreshold { // 检查缓存中的队名,如果超过心跳时间,则代表考试结束,删除缓存中的队名
|
|
|
+ keysToDelete = append(keysToDelete, teamName)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ for _, key := range keysToDelete { // 检查缓存中的队名,如果超过心跳时间,则代表考试结束,删除缓存中的队名
|
|
|
+ delete(cacheTeamName, key)
|
|
|
+ // todo 发送http请求到end接口
|
|
|
+ }
|
|
|
+ }
|
|
|
+ cacheMutex.Unlock()
|
|
|
+ }
|
|
|
+}
|