rts-sim-testing-service/ats/verify/simulation/simulation_manage.go

121 lines
3.1 KiB
Go
Raw Normal View History

2023-07-31 08:41:42 +08:00
package simulation
import (
2023-08-10 14:18:55 +08:00
"strconv"
"sync"
2023-09-12 10:00:13 +08:00
"joylink.club/bj-rtsts-server/ats/verify/simulation/wayside/memory"
"joylink.club/bj-rtsts-server/config"
"joylink.club/bj-rtsts-server/sys_error"
"joylink.club/bj-rtsts-server/third_party/dynamics"
"joylink.club/bj-rtsts-server/third_party/semi_physical_train"
2023-07-31 08:41:42 +08:00
2023-08-01 14:54:11 +08:00
"joylink.club/bj-rtsts-server/dto"
2023-07-31 08:41:42 +08:00
)
// 仿真存储集合
2023-08-01 14:54:11 +08:00
var simulationMap sync.Map
2023-07-31 08:41:42 +08:00
2023-08-30 18:05:11 +08:00
// 创建前检查
func IsExistSimulation() bool {
i := 0
simulationMap.Range(func(_, _ any) bool {
i++
return true
})
return i > 0
}
2023-07-31 08:41:42 +08:00
// 创建仿真对象
func CreateSimulation(projectId int32, mapIds []int32) (string, error) {
2023-09-19 11:02:50 +08:00
simulationId := createSimulationId(projectId)
2023-08-01 14:54:11 +08:00
_, e := simulationMap.Load(simulationId)
if !e && IsExistSimulation() {
return "", sys_error.New("一套环境同时只能运行一个仿真")
}
2023-08-01 14:54:11 +08:00
if !e {
verifySimulation, err := memory.CreateSimulation(projectId, mapIds)
if err != nil {
return "", err
2023-09-19 11:02:50 +08:00
}
verifySimulation.SimulationId = simulationId
if config.Config.Dynamics.Open {
// 动力学接口调用
lineBaseInfo := verifySimulation.BuildLineBaseInfo()
err := dynamics.Default().RequestStartSimulation(lineBaseInfo)
if err != nil {
return "", err
}
dynamics.Default().Start(verifySimulation)
}
if config.Config.Vobc.Open {
// 半实物系统接口功能启动
semi_physical_train.Default().Start(verifySimulation)
}
simulationMap.Store(simulationId, verifySimulation)
// 全部成功,启动仿真
verifySimulation.World.StartUp()
2023-07-31 08:41:42 +08:00
}
return simulationId, nil
2023-07-31 08:41:42 +08:00
}
// 删除仿真对象
func DestroySimulation(simulationId string) {
2023-09-21 14:54:27 +08:00
s, e := simulationMap.Load(simulationId)
if !e {
return
}
simulationInfo := s.(*memory.VerifySimulation)
simulationMap.Delete(simulationId)
2023-09-21 14:54:27 +08:00
// 停止ecs world
simulationInfo.World.Close()
if config.Config.Dynamics.Open {
// 停止动力学接口功能
dynamics.Default().Stop()
dynamics.Default().RequestStopSimulation()
}
if config.Config.Vobc.Open {
semi_physical_train.Default().Stop()
}
2023-07-31 08:41:42 +08:00
}
2023-09-19 11:02:50 +08:00
func createSimulationId(projectId int32) string {
// 当前服务器IP + 端口 + 项目
return config.SimulationId_prefix + "_" + strconv.Itoa(config.Config.Server.Port) + "_" + strconv.Itoa(int(projectId))
2023-07-31 08:41:42 +08:00
}
// 获取仿真列表
func ListAllSimulations() []*dto.SimulationInfoRspDto {
2023-08-31 16:16:18 +08:00
var simArr []*dto.SimulationInfoRspDto
simulationMap.Range(func(_, v any) bool {
2023-08-01 14:54:11 +08:00
s := v.(*memory.VerifySimulation)
simArr = append(simArr, &dto.SimulationInfoRspDto{
2023-08-01 14:54:11 +08:00
SimulationId: s.SimulationId,
2023-09-19 11:02:50 +08:00
MapId: s.MapIds[0],
MapIds: s.MapIds,
ProjectId: s.ProjectId,
2023-08-01 14:54:11 +08:00
})
return true
})
return simArr
2023-07-31 08:41:42 +08:00
}
// 根据仿真id查找仿真实例
2023-08-01 14:54:11 +08:00
func FindSimulation(simulationId string) *memory.VerifySimulation {
m, e := simulationMap.Load(simulationId)
if e {
return m.(*memory.VerifySimulation)
}
return nil
}
// 获取普通仿真数组
func GetSimulationArr() []*memory.VerifySimulation {
2023-08-31 16:16:18 +08:00
var result []*memory.VerifySimulation
simulationMap.Range(func(_, v any) bool {
2023-08-01 14:54:11 +08:00
result = append(result, v.(*memory.VerifySimulation))
return true
})
return result
2023-07-31 08:41:42 +08:00
}