Merge branch 'master' of https://git.code.tencent.com/beijing-rtss-test/bj-rtsts-server-go
This commit is contained in:
commit
71f8163cab
@ -30,7 +30,6 @@ func InitSimulationRouter(api *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddle
|
|||||||
authed.POST("/train/add", addTrain)
|
authed.POST("/train/add", addTrain)
|
||||||
authed.POST("/train/remove", removeTrain)
|
authed.POST("/train/remove", removeTrain)
|
||||||
authed.POST("/switch/operation", switchOperation)
|
authed.POST("/switch/operation", switchOperation)
|
||||||
authed.GET("/getDataChannelName", getDataChannelName)
|
|
||||||
authed.POST("/relay/operation", relayOperation)
|
authed.POST("/relay/operation", relayOperation)
|
||||||
authed.POST("/signal/operation", signalOperation)
|
authed.POST("/signal/operation", signalOperation)
|
||||||
authed.POST("/axleSection/operation", axleSectionOperation)
|
authed.POST("/axleSection/operation", axleSectionOperation)
|
||||||
@ -42,10 +41,6 @@ func InitSimulationRouter(api *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddle
|
|||||||
|
|
||||||
// 初始化地图信息
|
// 初始化地图信息
|
||||||
initPublishMapInfo()
|
initPublishMapInfo()
|
||||||
// apiproto.Register(&apiproto.SimulationServer{})
|
|
||||||
// apiproto.Register(&apiproto.SimulationIBPServer{})
|
|
||||||
// apiproto.Register(&apiproto.SimulationPSLServer{})
|
|
||||||
// apiproto.Register(&apiproto.MemoryChangeServer{SimulationMap: make(map[string]*state.SimulationStatus)})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func initPublishMapInfo() {
|
func initPublishMapInfo() {
|
||||||
@ -89,16 +84,17 @@ func createByProjectId(c *gin.Context) {
|
|||||||
mapIds[i] = mapInfo.ID
|
mapIds[i] = mapInfo.ID
|
||||||
}
|
}
|
||||||
// 运行环境配置
|
// 运行环境配置
|
||||||
var runConfigStr string
|
|
||||||
runConfig := service.QueryRunConfig(req.ProjectRunConfigId)
|
runConfig := service.QueryRunConfig(req.ProjectRunConfigId)
|
||||||
if runConfig != nil {
|
simulationId, err := ts.CreateSimulation(req.ProjectId, mapIds, runConfig)
|
||||||
runConfigStr = runConfig.ConfigContent
|
|
||||||
}
|
|
||||||
simulationId, err := ts.CreateSimulation(req.ProjectId, mapIds, runConfigStr)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(sys_error.New("测试启动失败", err))
|
panic(sys_error.New("测试启动失败", err))
|
||||||
}
|
}
|
||||||
rsp := dto.SimulationCreateRspDto{ProjectId: req.ProjectId, MapId: mapIds[0], MapIds: mapIds}
|
rsp := dto.SimulationCreateRspDto{
|
||||||
|
ProjectId: req.ProjectId,
|
||||||
|
MapId: mapIds[0],
|
||||||
|
MapIds: mapIds,
|
||||||
|
ProjectRunConfigId: req.ProjectRunConfigId,
|
||||||
|
}
|
||||||
rsp.SimulationId = simulationId
|
rsp.SimulationId = simulationId
|
||||||
c.JSON(http.StatusOK, &rsp)
|
c.JSON(http.StatusOK, &rsp)
|
||||||
}
|
}
|
||||||
@ -425,29 +421,6 @@ func pslBtnOperation(c *gin.Context) {
|
|||||||
c.JSON(http.StatusOK, "ok")
|
c.JSON(http.StatusOK, "ok")
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取仿真信息更新通道名称
|
|
||||||
//
|
|
||||||
// @Summary 获取仿真信息更新通道名称
|
|
||||||
//
|
|
||||||
// @Security JwtAuth
|
|
||||||
//
|
|
||||||
// @Description 获取仿真信息更新通道名称
|
|
||||||
//
|
|
||||||
// Deprecated: 此接口废弃,使用轮询方式更新启动的测试列表
|
|
||||||
//
|
|
||||||
// @Tags ATS测试仿真Api
|
|
||||||
// @Accept json
|
|
||||||
// @Produce json
|
|
||||||
// @Param Authorization header string true "JWT Token"
|
|
||||||
//
|
|
||||||
// @Success 200 {object} string
|
|
||||||
// @Failure 500 {object} dto.ErrorDto
|
|
||||||
// @Router /api/v1/simulation/getDataChannelName [get]
|
|
||||||
func getDataChannelName(c *gin.Context) {
|
|
||||||
// c.JSON(http.StatusOK, config.SimulationId_prefix+apiproto.MemoryChangeServerSuffix)
|
|
||||||
panic(sys_error.New("接口已废弃", fmt.Errorf("此接口废弃,使用轮询方式更新启动的测试列表")))
|
|
||||||
}
|
|
||||||
|
|
||||||
// 获取仿真地图的公里标范围
|
// 获取仿真地图的公里标范围
|
||||||
//
|
//
|
||||||
// @Summary 获取仿真地图的公里标范围
|
// @Summary 获取仿真地图的公里标范围
|
||||||
|
@ -1 +1 @@
|
|||||||
Subproject commit 6827f9671a619b95d80dac699463bbcd9ed0cb15
|
Subproject commit 8afde905e5b5376dc0bce29c099fb5fef2576e02
|
@ -52,6 +52,7 @@ type centrifugo struct {
|
|||||||
|
|
||||||
// 第三方配置结构
|
// 第三方配置结构
|
||||||
type ThridPartyConfig struct {
|
type ThridPartyConfig struct {
|
||||||
|
Id int32 `json:"id"`
|
||||||
Dynamics DynamicsConfig `json:"dynamics"`
|
Dynamics DynamicsConfig `json:"dynamics"`
|
||||||
Vobc VobcConfig `json:"vobc"`
|
Vobc VobcConfig `json:"vobc"`
|
||||||
Interlock InterlockConfig `json:"interlock"`
|
Interlock InterlockConfig `json:"interlock"`
|
||||||
|
@ -9,9 +9,9 @@ type PageProjectRunConfigReqDto struct {
|
|||||||
|
|
||||||
type ProjectRunConfigReqDto struct {
|
type ProjectRunConfigReqDto struct {
|
||||||
Id int32 `json:"id" form:"id"`
|
Id int32 `json:"id" form:"id"`
|
||||||
Name string `json:"name" form:"name"`
|
Name string `json:"name" form:"name" binding:"required"`
|
||||||
Description string `json:"description" form:"description"`
|
Description string `json:"description" form:"description"`
|
||||||
ConfigContent string `json:"config" form:"config"`
|
ConfigContent string `json:"config" form:"config" binding:"required"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type ProjectRunConfigDto struct {
|
type ProjectRunConfigDto struct {
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||||
// versions:
|
// versions:
|
||||||
// protoc-gen-go v1.31.0
|
// protoc-gen-go v1.28.1
|
||||||
// protoc v4.23.1
|
// protoc v4.23.1
|
||||||
// source: request.proto
|
// source: request.proto
|
||||||
|
|
||||||
|
@ -25,6 +25,8 @@ type SimulationCreateRspDto struct {
|
|||||||
SimulationId string `json:"simulationId" form:"simulationId"`
|
SimulationId string `json:"simulationId" form:"simulationId"`
|
||||||
// 地图列表
|
// 地图列表
|
||||||
MapIds []int32 `json:"mapIds" form:"mapIds"`
|
MapIds []int32 `json:"mapIds" form:"mapIds"`
|
||||||
|
// 运行环境ID
|
||||||
|
ProjectRunConfigId int32 `json:"runConfigId" form:"runConfigId"`
|
||||||
}
|
}
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////////
|
||||||
@ -136,10 +138,11 @@ type CheckMapDataRspDto struct {
|
|||||||
|
|
||||||
// 仿真实例的基本信息响应
|
// 仿真实例的基本信息响应
|
||||||
type SimulationInfoRspDto struct {
|
type SimulationInfoRspDto struct {
|
||||||
SimulationId string `form:"simulationId" json:"simulationId"`
|
SimulationId string `form:"simulationId" json:"simulationId"`
|
||||||
MapId int32 `json:"mapId" form:"mapId"`
|
MapId int32 `json:"mapId" form:"mapId"`
|
||||||
MapIds []int32 `form:"mapIds" json:"mapIds"`
|
MapIds []int32 `form:"mapIds" json:"mapIds"`
|
||||||
ProjectId int32 `form:"projectId" json:"projectId"`
|
ProjectId int32 `form:"projectId" json:"projectId"`
|
||||||
|
ProjectRunConfigId int32 `form:"runConfigId" json:"runConfigId" ` // 运行环境ID
|
||||||
}
|
}
|
||||||
type SimulationInfoRspDtoArr []SimulationInfoRspDto
|
type SimulationInfoRspDtoArr []SimulationInfoRspDto
|
||||||
|
|
||||||
|
@ -1,66 +0,0 @@
|
|||||||
package apiproto
|
|
||||||
|
|
||||||
import (
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"google.golang.org/protobuf/proto"
|
|
||||||
"joylink.club/bj-rtsts-server/config"
|
|
||||||
"joylink.club/bj-rtsts-server/dto"
|
|
||||||
"joylink.club/bj-rtsts-server/ts"
|
|
||||||
"joylink.club/bj-rtsts-server/ts/protos/state"
|
|
||||||
)
|
|
||||||
|
|
||||||
var MemoryChangeServerSuffix = "serve-data"
|
|
||||||
|
|
||||||
type MemoryChangeServer struct {
|
|
||||||
SimulationMap map[string]*state.SimulationStatus
|
|
||||||
}
|
|
||||||
|
|
||||||
// 返回通道格式
|
|
||||||
func (t *MemoryChangeServer) getChannelName() string {
|
|
||||||
return config.SimulationId_prefix + MemoryChangeServerSuffix
|
|
||||||
}
|
|
||||||
|
|
||||||
// 消息运行间隔
|
|
||||||
func (t *MemoryChangeServer) getInterval() time.Duration {
|
|
||||||
return 1 * time.Second
|
|
||||||
}
|
|
||||||
|
|
||||||
// 定时发送数据
|
|
||||||
func (t *MemoryChangeServer) onTick() []TopicMsg {
|
|
||||||
simArr := ts.GetSimulationArr()
|
|
||||||
addArr, delArr := []*state.SimulationStatus{}, []*state.SimulationStatus{}
|
|
||||||
// 增加的仿真
|
|
||||||
allSim := make(map[string]bool)
|
|
||||||
for _, v := range simArr {
|
|
||||||
allSim[v.SimulationId] = true
|
|
||||||
if t.SimulationMap[v.SimulationId] != nil {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
status := &state.SimulationStatus{SimulationId: v.SimulationId, MapId: v.MapIds[0], ProjectId: v.ProjectId, MapIds: v.MapIds}
|
|
||||||
t.SimulationMap[v.SimulationId] = status
|
|
||||||
addArr = append(addArr, status)
|
|
||||||
}
|
|
||||||
// 已经移除的仿真
|
|
||||||
for k, v := range t.SimulationMap {
|
|
||||||
if allSim[k] {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
delArr = append(delArr, v)
|
|
||||||
}
|
|
||||||
// 删除已替换仿真主键
|
|
||||||
if len(delArr) > 0 {
|
|
||||||
for _, v := range delArr {
|
|
||||||
delete(t.SimulationMap, v.SimulationId)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if len(addArr) == 0 && len(delArr) == 0 {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
msg := &state.MemoryDataStatus{AddSimulations: addArr, RemoveSimulations: delArr}
|
|
||||||
b, err := proto.Marshal(msg)
|
|
||||||
if err != nil {
|
|
||||||
panic(dto.ErrorDto{Code: dto.ArgumentParseError, Message: err.Error()})
|
|
||||||
}
|
|
||||||
return []TopicMsg{{channalName: t.getChannelName(), data: b}}
|
|
||||||
}
|
|
@ -1,153 +0,0 @@
|
|||||||
package apiproto
|
|
||||||
|
|
||||||
import (
|
|
||||||
context "context"
|
|
||||||
"log/slog"
|
|
||||||
"runtime/debug"
|
|
||||||
"time"
|
|
||||||
)
|
|
||||||
|
|
||||||
// 消息服务
|
|
||||||
type IMsgServer interface {
|
|
||||||
// 获取通道名
|
|
||||||
getChannelName() string
|
|
||||||
|
|
||||||
// 发送消息间隔时间,单位ms
|
|
||||||
getInterval() time.Duration
|
|
||||||
|
|
||||||
// 定时发送的消息
|
|
||||||
onTick() []TopicMsg
|
|
||||||
}
|
|
||||||
|
|
||||||
// 消息实体
|
|
||||||
type TopicMsg struct {
|
|
||||||
// 通道名称
|
|
||||||
channalName string
|
|
||||||
|
|
||||||
// 消息信息
|
|
||||||
data []byte
|
|
||||||
}
|
|
||||||
|
|
||||||
type MsgServer struct {
|
|
||||||
IMsgServer
|
|
||||||
ctx context.Context
|
|
||||||
cancelFn context.CancelFunc
|
|
||||||
}
|
|
||||||
|
|
||||||
// 消息服务管理map
|
|
||||||
var servers map[string]*MsgServer = make(map[string]*MsgServer)
|
|
||||||
|
|
||||||
// 注册消息服务
|
|
||||||
func Register(server IMsgServer) *MsgServer {
|
|
||||||
ms := &MsgServer{
|
|
||||||
IMsgServer: server,
|
|
||||||
}
|
|
||||||
ctx, cancelFn := context.WithCancel(context.Background())
|
|
||||||
ms.ctx = ctx
|
|
||||||
ms.cancelFn = cancelFn
|
|
||||||
go run(ms)
|
|
||||||
servers[server.getChannelName()] = ms
|
|
||||||
return ms
|
|
||||||
}
|
|
||||||
|
|
||||||
// 注销消息服务
|
|
||||||
func Unregister(key string) {
|
|
||||||
server := servers[key]
|
|
||||||
if server == nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
server.cancelFn()
|
|
||||||
delete(servers, key)
|
|
||||||
}
|
|
||||||
|
|
||||||
// 消息服务运行
|
|
||||||
func run(server *MsgServer) {
|
|
||||||
defer func() {
|
|
||||||
if err := recover(); err != nil {
|
|
||||||
slog.Error("消息服务运行异常", "serverChannelName", server.getChannelName(), "error", err, "stack", string(debug.Stack()))
|
|
||||||
debug.PrintStack()
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
for {
|
|
||||||
select {
|
|
||||||
case <-server.ctx.Done():
|
|
||||||
slog.Info("消息服务退出", "serverChannelName", server.getChannelName())
|
|
||||||
return
|
|
||||||
default:
|
|
||||||
}
|
|
||||||
topicMsgs := server.onTick()
|
|
||||||
if len(topicMsgs) > 0 {
|
|
||||||
// for _, msg := range topicMsgs {
|
|
||||||
// PublishMsg(msg.channalName, msg.data)
|
|
||||||
// }
|
|
||||||
}
|
|
||||||
time.Sleep(server.getInterval())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// // 消息类型服务集合
|
|
||||||
// var serverMap = make(map[string]*IMsgServer)
|
|
||||||
|
|
||||||
// // 消息服务退出通道
|
|
||||||
// var serverExitChannelMap = make(map[string]chan bool)
|
|
||||||
|
|
||||||
// // 服务运行
|
|
||||||
// func doServerRun(tick *time.Ticker, server IMsgServer, exitChannel chan bool) {
|
|
||||||
// // 循环推送信息
|
|
||||||
// for {
|
|
||||||
// <-tick.C
|
|
||||||
// topicMsgs := server.onTick()
|
|
||||||
// if len(topicMsgs) == 0 {
|
|
||||||
// continue
|
|
||||||
// }
|
|
||||||
// for _, msg := range topicMsgs {
|
|
||||||
// PublishMsg(msg.channalName, msg.data)
|
|
||||||
// }
|
|
||||||
// select {
|
|
||||||
// case <-exitChannel:
|
|
||||||
// return
|
|
||||||
// default:
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
// // 注册服务
|
|
||||||
// func RegisterMsgServer(server IMsgServer) {
|
|
||||||
// if client == nil {
|
|
||||||
// InitClient()
|
|
||||||
// }
|
|
||||||
// serverMap[server.getChannelName()] = &server
|
|
||||||
// if server.getInterval() > 0 {
|
|
||||||
// exitChannel := make(chan bool)
|
|
||||||
// serverExitChannelMap[server.getChannelName()] = exitChannel
|
|
||||||
// tick := time.NewTicker(server.getInterval())
|
|
||||||
// go func() {
|
|
||||||
// defer func() {
|
|
||||||
// if r := recover(); r != nil {
|
|
||||||
// slog.Debug("定时器发生错误,%v\n", r)
|
|
||||||
// }
|
|
||||||
// // 重新启动,防止服务卡死
|
|
||||||
// doServerRun(tick, server, exitChannel)
|
|
||||||
// }()
|
|
||||||
// // 循环推送信息
|
|
||||||
// doServerRun(tick, server, exitChannel)
|
|
||||||
// }()
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
// // 注销消息服务
|
|
||||||
// func UnRegisterMsgServer(key string) {
|
|
||||||
// channel := serverExitChannelMap[key]
|
|
||||||
// if channel != nil {
|
|
||||||
// // 定时任务取消
|
|
||||||
// channel <- false
|
|
||||||
// delete(serverExitChannelMap, key)
|
|
||||||
// // 删除集合信息
|
|
||||||
// delete(serverMap, key)
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
// // 获取消息服务
|
|
||||||
// func GetMsgServer(key string) *IMsgServer {
|
|
||||||
// return serverMap[key]
|
|
||||||
// }
|
|
@ -1,59 +0,0 @@
|
|||||||
package apiproto
|
|
||||||
|
|
||||||
import (
|
|
||||||
"strconv"
|
|
||||||
"strings"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"google.golang.org/protobuf/proto"
|
|
||||||
"joylink.club/bj-rtsts-server/dto"
|
|
||||||
"joylink.club/bj-rtsts-server/ts"
|
|
||||||
"joylink.club/bj-rtsts-server/ts/protos/graphicData"
|
|
||||||
"joylink.club/bj-rtsts-server/ts/simulation/wayside/memory"
|
|
||||||
)
|
|
||||||
|
|
||||||
type SimulationIBPServer struct{}
|
|
||||||
|
|
||||||
// 返回通道格式
|
|
||||||
func (t *SimulationIBPServer) getChannelName() string {
|
|
||||||
return "simulation-ibp-{sid}_{mid}_{station}-status"
|
|
||||||
}
|
|
||||||
|
|
||||||
// 消息运行间隔
|
|
||||||
func (t *SimulationIBPServer) getInterval() time.Duration {
|
|
||||||
return 200 * time.Millisecond
|
|
||||||
}
|
|
||||||
|
|
||||||
// 定时发送数据
|
|
||||||
func (t *SimulationIBPServer) onTick() []TopicMsg {
|
|
||||||
simArr := ts.GetSimulationArr()
|
|
||||||
var msgArr []TopicMsg
|
|
||||||
for _, v := range simArr {
|
|
||||||
for _, mapId := range v.MapIds {
|
|
||||||
mapType := memory.QueryGiType(mapId)
|
|
||||||
if mapType != graphicData.PictureType_StationLayout {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
mapData := memory.QueryGiData[*graphicData.RtssGraphicStorage](mapId)
|
|
||||||
idStr := strconv.Itoa(int(mapId))
|
|
||||||
for _, station := range mapData.Stations {
|
|
||||||
channelName := handlerIBPChannelName(v.SimulationId, idStr, station.Common.Id, t.getChannelName())
|
|
||||||
b, err := proto.Marshal(v.GetAllIBPState(mapId, station.Common.Id, station.RefIbpMapCode))
|
|
||||||
if err != nil {
|
|
||||||
panic(dto.ErrorDto{Code: dto.DataOperationError, Message: err.Error()})
|
|
||||||
}
|
|
||||||
msgArr = append(msgArr, TopicMsg{channalName: channelName, data: b})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return msgArr
|
|
||||||
}
|
|
||||||
|
|
||||||
// 处理订阅通道名称
|
|
||||||
func handlerIBPChannelName(sid, mapId, station string, format string) string {
|
|
||||||
var channelName string
|
|
||||||
channelName = strings.Replace(format, "{sid}", sid, 1)
|
|
||||||
channelName = strings.Replace(channelName, "{mid}", mapId, 1)
|
|
||||||
channelName = strings.Replace(channelName, "{station}", station, 1)
|
|
||||||
return channelName
|
|
||||||
}
|
|
@ -1,59 +0,0 @@
|
|||||||
package apiproto
|
|
||||||
|
|
||||||
import (
|
|
||||||
"strconv"
|
|
||||||
"strings"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"google.golang.org/protobuf/proto"
|
|
||||||
"joylink.club/bj-rtsts-server/dto"
|
|
||||||
"joylink.club/bj-rtsts-server/ts"
|
|
||||||
"joylink.club/bj-rtsts-server/ts/protos/graphicData"
|
|
||||||
"joylink.club/bj-rtsts-server/ts/simulation/wayside/memory"
|
|
||||||
)
|
|
||||||
|
|
||||||
type SimulationPSLServer struct{}
|
|
||||||
|
|
||||||
// 返回通道格式
|
|
||||||
func (t *SimulationPSLServer) getChannelName() string {
|
|
||||||
return "simulation-psl-{sid}_{mid}_{psl}-status"
|
|
||||||
}
|
|
||||||
|
|
||||||
// 消息运行间隔
|
|
||||||
func (t *SimulationPSLServer) getInterval() time.Duration {
|
|
||||||
return 200 * time.Millisecond
|
|
||||||
}
|
|
||||||
|
|
||||||
// 定时发送数据
|
|
||||||
func (t *SimulationPSLServer) onTick() []TopicMsg {
|
|
||||||
simArr := ts.GetSimulationArr()
|
|
||||||
var msgArr []TopicMsg
|
|
||||||
for _, v := range simArr {
|
|
||||||
for _, mapId := range v.MapIds {
|
|
||||||
mapType := memory.QueryGiType(mapId)
|
|
||||||
if mapType != graphicData.PictureType_StationLayout {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
mapData := memory.QueryGiData[*graphicData.RtssGraphicStorage](mapId)
|
|
||||||
idStr := strconv.Itoa(int(mapId))
|
|
||||||
for _, box := range mapData.GateBoxs {
|
|
||||||
channelName := handlerPSLChannelName(v.SimulationId, idStr, box.Common.Id, t.getChannelName())
|
|
||||||
b, err := proto.Marshal(v.GetAllPSLState(mapId, box.Common.Id))
|
|
||||||
if err != nil {
|
|
||||||
panic(dto.ErrorDto{Code: dto.DataOperationError, Message: err.Error()})
|
|
||||||
}
|
|
||||||
msgArr = append(msgArr, TopicMsg{channalName: channelName, data: b})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return msgArr
|
|
||||||
}
|
|
||||||
|
|
||||||
// 处理订阅通道名称
|
|
||||||
func handlerPSLChannelName(sid, mapId, psl string, format string) string {
|
|
||||||
var channelName string
|
|
||||||
channelName = strings.Replace(format, "{sid}", sid, 1)
|
|
||||||
channelName = strings.Replace(channelName, "{mid}", mapId, 1)
|
|
||||||
channelName = strings.Replace(channelName, "{psl}", psl, 1)
|
|
||||||
return channelName
|
|
||||||
}
|
|
@ -1,49 +0,0 @@
|
|||||||
package apiproto
|
|
||||||
|
|
||||||
import (
|
|
||||||
"strconv"
|
|
||||||
"strings"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"google.golang.org/protobuf/proto"
|
|
||||||
"joylink.club/bj-rtsts-server/dto"
|
|
||||||
"joylink.club/bj-rtsts-server/ts"
|
|
||||||
)
|
|
||||||
|
|
||||||
type SimulationServer struct{}
|
|
||||||
|
|
||||||
// 返回通道格式
|
|
||||||
func (t *SimulationServer) getChannelName() string {
|
|
||||||
return "simulation-{sid}_{mid}-devices-status"
|
|
||||||
}
|
|
||||||
|
|
||||||
// 消息运行间隔
|
|
||||||
func (t *SimulationServer) getInterval() time.Duration {
|
|
||||||
return 200 * time.Millisecond
|
|
||||||
}
|
|
||||||
|
|
||||||
// 定时发送数据
|
|
||||||
func (t *SimulationServer) onTick() []TopicMsg {
|
|
||||||
simArr := ts.GetSimulationArr()
|
|
||||||
var msgArr []TopicMsg
|
|
||||||
for _, v := range simArr {
|
|
||||||
for _, mapId := range v.MapIds {
|
|
||||||
idStr := strconv.Itoa(int(mapId))
|
|
||||||
channelName := handlerChannelName(v.SimulationId, idStr, t.getChannelName())
|
|
||||||
b, err := proto.Marshal(v.GetAllState(mapId))
|
|
||||||
if err != nil {
|
|
||||||
panic(dto.ErrorDto{Code: dto.DataOperationError, Message: err.Error()})
|
|
||||||
}
|
|
||||||
msgArr = append(msgArr, TopicMsg{channalName: channelName, data: b})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return msgArr
|
|
||||||
}
|
|
||||||
|
|
||||||
// 处理订阅通道名称
|
|
||||||
func handlerChannelName(sid, mapId string, format string) string {
|
|
||||||
var channelName string
|
|
||||||
channelName = strings.Replace(format, "{sid}", sid, 1)
|
|
||||||
channelName = strings.Replace(channelName, "{mid}", mapId, 1)
|
|
||||||
return channelName
|
|
||||||
}
|
|
@ -1,24 +0,0 @@
|
|||||||
package apiproto
|
|
||||||
|
|
||||||
import "time"
|
|
||||||
|
|
||||||
type TestServer struct {
|
|
||||||
data map[string]string
|
|
||||||
}
|
|
||||||
|
|
||||||
func (t *TestServer) getChannelName() string {
|
|
||||||
return "test"
|
|
||||||
}
|
|
||||||
|
|
||||||
func (t *TestServer) getInterval() time.Duration {
|
|
||||||
return time.Second
|
|
||||||
}
|
|
||||||
|
|
||||||
func (t *TestServer) allMsgData(params map[string]string) []byte {
|
|
||||||
return []byte(`{"input": "hello world"}`)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (t *TestServer) onTick() []TopicMsg {
|
|
||||||
msg := TopicMsg{t.getChannelName(), []byte(`{"input": "hello from GRPC"}`)}
|
|
||||||
return []TopicMsg{msg}
|
|
||||||
}
|
|
@ -2,8 +2,6 @@ package message_server
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"strconv"
|
|
||||||
"strings"
|
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"google.golang.org/protobuf/proto"
|
"google.golang.org/protobuf/proto"
|
||||||
@ -11,6 +9,9 @@ import (
|
|||||||
"joylink.club/bj-rtsts-server/ts/protos/graphicData"
|
"joylink.club/bj-rtsts-server/ts/protos/graphicData"
|
||||||
"joylink.club/bj-rtsts-server/ts/protos/state"
|
"joylink.club/bj-rtsts-server/ts/protos/state"
|
||||||
"joylink.club/bj-rtsts-server/ts/simulation/wayside/memory"
|
"joylink.club/bj-rtsts-server/ts/simulation/wayside/memory"
|
||||||
|
"joylink.club/ecs"
|
||||||
|
"joylink.club/rtsssimulation/component"
|
||||||
|
"joylink.club/rtsssimulation/entity"
|
||||||
)
|
)
|
||||||
|
|
||||||
// 综合后备盘IBP消息服务
|
// 综合后备盘IBP消息服务
|
||||||
@ -19,8 +20,12 @@ type IbpMs struct {
|
|||||||
mapId int32
|
mapId int32
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func NewIBPMs(vs *memory.VerifySimulation, mapId int32) *IbpMs {
|
||||||
|
return &IbpMs{vs: vs, mapId: mapId}
|
||||||
|
}
|
||||||
|
|
||||||
func (ms *IbpMs) GetChannel() string {
|
func (ms *IbpMs) GetChannel() string {
|
||||||
return "simulation-ibp-{sid}_{mid}_{station}-status"
|
return "simulation-ibp-%s_%d_%s-status"
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ms *IbpMs) GetInterval() time.Duration {
|
func (ms *IbpMs) GetInterval() time.Duration {
|
||||||
@ -30,9 +35,8 @@ func (ms *IbpMs) GetInterval() time.Duration {
|
|||||||
func (ms *IbpMs) OnTick() ([]*ms_api.TopicMsg, error) {
|
func (ms *IbpMs) OnTick() ([]*ms_api.TopicMsg, error) {
|
||||||
var msgArr []*ms_api.TopicMsg
|
var msgArr []*ms_api.TopicMsg
|
||||||
mapData := memory.QueryGiData[*graphicData.RtssGraphicStorage](ms.mapId)
|
mapData := memory.QueryGiData[*graphicData.RtssGraphicStorage](ms.mapId)
|
||||||
idStr := strconv.Itoa(int(ms.mapId))
|
|
||||||
for _, station := range mapData.Stations {
|
for _, station := range mapData.Stations {
|
||||||
channel := handlerIBPChannelName(ms.vs.SimulationId, idStr, station.Common.Id, ms.GetChannel())
|
channel := ms.handlerIBPChannelName(station.Common.Id)
|
||||||
stationIbpState, err := ms.collectStationIbpState(station)
|
stationIbpState, err := ms.collectStationIbpState(station)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
@ -46,16 +50,117 @@ func (ms *IbpMs) OnTick() ([]*ms_api.TopicMsg, error) {
|
|||||||
return msgArr, nil
|
return msgArr, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 当发生错误时执行的逻辑
|
||||||
|
func (ms *IbpMs) OnError(err error) {
|
||||||
|
}
|
||||||
|
|
||||||
func (ms *IbpMs) collectStationIbpState(station *graphicData.Station) (*state.PushedDevicesStatus, error) {
|
func (ms *IbpMs) collectStationIbpState(station *graphicData.Station) (*state.PushedDevicesStatus, error) {
|
||||||
// TODO: 重构之前的消息服务
|
if station.RefIbpMapCode == "" {
|
||||||
return nil, nil
|
return nil, nil
|
||||||
|
}
|
||||||
|
stationUid := memory.QueryUidByMidAndComId(ms.mapId, station.Common.Id, &graphicData.Station{})
|
||||||
|
ibpStorage := memory.GetStorageIBPMapData(station.RefIbpMapCode)
|
||||||
|
buttonStates, err := ms.collectIBPButtonState(stationUid, ibpStorage.IbpButtons)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
alarmStates, err := ms.collectIBPAlarmState(stationUid, ibpStorage.IbpAlarms)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
lightStates, err := ms.collectIBPLightState(stationUid, ibpStorage.IbpLights)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
keyStates, err := ms.collectIBPKeyState(stationUid, ibpStorage.IbpKeys)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return &state.PushedDevicesStatus{
|
||||||
|
All: true,
|
||||||
|
AllStatus: &state.AllDevicesStatus{
|
||||||
|
ButtonState: buttonStates,
|
||||||
|
AlarmState: alarmStates,
|
||||||
|
LightState: lightStates,
|
||||||
|
KeyState: keyStates,
|
||||||
|
},
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// 收集IBP按钮状态
|
||||||
|
func (ms *IbpMs) collectIBPButtonState(stationUid string, ibpButtons []*graphicData.IBPButton) ([]*state.ButtonState, error) {
|
||||||
|
var states []*state.ButtonState
|
||||||
|
for _, data := range ibpButtons { // 按钮
|
||||||
|
entry, ok := entity.GetEntityByUid(ms.vs.World, stationUid+"_button_"+data.Code)
|
||||||
|
if !ok {
|
||||||
|
return nil, fmt.Errorf("ibp按钮实体不存在: World id=%d, uid=%s", ms.vs.World.Id(), stationUid+"_button_"+data.Code)
|
||||||
|
}
|
||||||
|
if entry.HasComponent(component.ButtonTag) {
|
||||||
|
states = append(states, getIBPButtonState(data.Common.Id, entry))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return states, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取IBP盘按钮状态
|
||||||
|
func getIBPButtonState(id string, entry *ecs.Entry) *state.ButtonState {
|
||||||
|
status := &state.ButtonState{Id: id}
|
||||||
|
bit := component.BitStateType.Get(entry)
|
||||||
|
status.Down = bit.Val
|
||||||
|
// 如果按钮包含灯
|
||||||
|
if entry.HasComponent(component.SingleLightType) {
|
||||||
|
lightComponent := component.SingleLightType.Get(entry)
|
||||||
|
status.Active = component.BitStateType.Get(lightComponent.Light).Val
|
||||||
|
}
|
||||||
|
return status
|
||||||
|
}
|
||||||
|
|
||||||
|
// 收集报警器状态
|
||||||
|
func (ms *IbpMs) collectIBPAlarmState(stationUid string, ibpAlarms []*graphicData.IbpAlarm) ([]*state.AlarmState, error) {
|
||||||
|
var states []*state.AlarmState
|
||||||
|
for _, data := range ibpAlarms { // 报警器
|
||||||
|
entry, ok := entity.GetEntityByUid(ms.vs.World, stationUid+"_alarm_"+data.Code)
|
||||||
|
if !ok {
|
||||||
|
return nil, fmt.Errorf("ibp报警器实体不存在: World id=%d, uid=%s", ms.vs.World.Id(), stationUid+"_alarm_"+data.Code)
|
||||||
|
}
|
||||||
|
if entry.HasComponent(component.AlarmTag) {
|
||||||
|
states = append(states, &state.AlarmState{Id: data.Common.Id, Active: component.BitStateType.Get(entry).Val})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return states, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// 收集灯状态信息
|
||||||
|
func (ms *IbpMs) collectIBPLightState(stationUid string, ibpLights []*graphicData.IbpLight) ([]*state.LightState, error) {
|
||||||
|
var states []*state.LightState
|
||||||
|
for _, data := range ibpLights { // 指示灯
|
||||||
|
entry, ok := entity.GetEntityByUid(ms.vs.World, stationUid+"_light_"+data.Code)
|
||||||
|
if !ok {
|
||||||
|
return nil, fmt.Errorf("ibp指示灯实体不存在: World id=%d, uid=%s", ms.vs.World.Id(), stationUid+"_light_"+data.Code)
|
||||||
|
}
|
||||||
|
if entry.HasComponent(component.LightTag) {
|
||||||
|
states = append(states, &state.LightState{Id: data.Common.Id, Active: component.BitStateType.Get(entry).Val})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return states, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// 收集钥匙状态
|
||||||
|
func (ms *IbpMs) collectIBPKeyState(stationUid string, ibpKeys []*graphicData.IbpKey) ([]*state.KeyState, error) {
|
||||||
|
var states []*state.KeyState
|
||||||
|
for _, data := range ibpKeys { // 钥匙
|
||||||
|
entry, ok := entity.GetEntityByUid(ms.vs.World, stationUid+"_key_"+data.Code)
|
||||||
|
if !ok {
|
||||||
|
return nil, fmt.Errorf("ibp钥匙实体不存在: World id=%d, uid=%s", ms.vs.World.Id(), stationUid+"_key_"+data.Code)
|
||||||
|
}
|
||||||
|
if entry.HasComponent(component.KeyTag) {
|
||||||
|
states = append(states, &state.KeyState{Id: data.Common.Id, Gear: component.GearStateType.Get(entry).Val})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return states, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// 处理订阅通道名称
|
// 处理订阅通道名称
|
||||||
func handlerIBPChannelName(sid, mapId, station string, format string) string {
|
func (ms *IbpMs) handlerIBPChannelName(stationId string) string {
|
||||||
var channelName string
|
return fmt.Sprintf(ms.GetChannel(), ms.vs.SimulationId, ms.mapId, stationId)
|
||||||
channelName = strings.Replace(format, "{sid}", sid, 1)
|
|
||||||
channelName = strings.Replace(channelName, "{mid}", mapId, 1)
|
|
||||||
channelName = strings.Replace(channelName, "{station}", station, 1)
|
|
||||||
return channelName
|
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,86 @@
|
|||||||
package message_server
|
package message_server
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"google.golang.org/protobuf/proto"
|
||||||
|
"joylink.club/bj-rtsts-server/message_server/ms_api"
|
||||||
|
"joylink.club/bj-rtsts-server/ts/protos/graphicData"
|
||||||
|
"joylink.club/bj-rtsts-server/ts/protos/state"
|
||||||
|
"joylink.club/bj-rtsts-server/ts/simulation/wayside/memory"
|
||||||
|
)
|
||||||
|
|
||||||
// PSL或门控箱消息服务
|
// PSL或门控箱消息服务
|
||||||
type PslMs struct {
|
type PslMs struct {
|
||||||
|
vs *memory.VerifySimulation
|
||||||
|
mapId int32
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewPSLMs(vs *memory.VerifySimulation, mapId int32) *PslMs {
|
||||||
|
return &PslMs{vs: vs, mapId: mapId}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *PslMs) GetChannel() string {
|
||||||
|
return "simulation-psl-%s_%d_%s-status"
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *PslMs) GetInterval() time.Duration {
|
||||||
|
return 200 * time.Millisecond
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *PslMs) OnTick() ([]*ms_api.TopicMsg, error) {
|
||||||
|
var msgArr []*ms_api.TopicMsg
|
||||||
|
mapData := memory.QueryGiData[*graphicData.RtssGraphicStorage](r.mapId)
|
||||||
|
for _, box := range mapData.GateBoxs {
|
||||||
|
channel := r.handlerPSLChannelName(box.Common.Id)
|
||||||
|
state, err := r.collectGateBoxPSLState(box)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
b, err := proto.Marshal(state)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("PSL设备状态消息服务数据序列化失败: %s", err)
|
||||||
|
}
|
||||||
|
msgArr = append(msgArr, ms_api.NewTopicMsg(channel, b))
|
||||||
|
}
|
||||||
|
return msgArr, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *PslMs) OnError(err error) {}
|
||||||
|
|
||||||
|
// 处理订阅通道名称
|
||||||
|
func (r *PslMs) handlerPSLChannelName(gateBoxId string) string {
|
||||||
|
return fmt.Sprintf(r.GetChannel(), r.vs.SimulationId, r.mapId, gateBoxId)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *PslMs) collectGateBoxPSLState(gatedBox *graphicData.GatedBox) (*state.PushedDevicesStatus, error) {
|
||||||
|
//world := s.GetSimulationWorld()
|
||||||
|
//uidStructure := queryUidStructure[*StationUidStructure](mapId)
|
||||||
|
//boxUid := uidStructure.GateBoxIds[boxId].Uid
|
||||||
|
//mkxEntry, ok := entity.GetEntityByUid(world, boxUid)
|
||||||
|
//var buttonStateArr []*state.ButtonState
|
||||||
|
//if ok {
|
||||||
|
// mkxCircuit := component.MkxCircuitType.Get(mkxEntry)
|
||||||
|
// var boxArr []*ecs.Entry
|
||||||
|
// boxArr = append(boxArr, mkxCircuit.PcbList...)
|
||||||
|
// boxArr = append(boxArr, mkxCircuit.PobList...)
|
||||||
|
// boxArr = append(boxArr, mkxCircuit.PabList...)
|
||||||
|
// for _, mkxBoxEntry := range boxArr {
|
||||||
|
// mkxBox := component.MkxBoxType.Get(mkxBoxEntry)
|
||||||
|
// uid := component.UidType.Get(mkxBox.Btn).Id
|
||||||
|
// down := component.BitStateType.Get(mkxBox.Btn).Val
|
||||||
|
// buttonStateArr = append(buttonStateArr, &state.ButtonState{
|
||||||
|
// Id: uid,
|
||||||
|
// Down: down,
|
||||||
|
// })
|
||||||
|
// }
|
||||||
|
//}
|
||||||
|
//return &state.PushedDevicesStatus{
|
||||||
|
// All: true,
|
||||||
|
// AllStatus: &state.AllDevicesStatus{
|
||||||
|
// ButtonState: buttonStateArr,
|
||||||
|
// },
|
||||||
|
//}
|
||||||
|
return nil, nil
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,82 @@
|
|||||||
package message_server
|
package message_server
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"google.golang.org/protobuf/proto"
|
||||||
|
"joylink.club/bj-rtsts-server/message_server/ms_api"
|
||||||
|
"joylink.club/bj-rtsts-server/ts/protos/graphicData"
|
||||||
|
"joylink.club/bj-rtsts-server/ts/protos/state"
|
||||||
|
"joylink.club/bj-rtsts-server/ts/simulation/wayside/memory"
|
||||||
|
"joylink.club/rtsssimulation/component"
|
||||||
|
"joylink.club/rtsssimulation/entity"
|
||||||
|
)
|
||||||
|
|
||||||
// 继电器组合柜布置图消息服务
|
// 继电器组合柜布置图消息服务
|
||||||
type RccMs struct {
|
type RccMs struct {
|
||||||
|
vs *memory.VerifySimulation
|
||||||
|
mapId int32
|
||||||
|
channel string
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewRccMs(vs *memory.VerifySimulation, mapId int32) *RccMs {
|
||||||
|
return &RccMs{
|
||||||
|
vs: vs,
|
||||||
|
mapId: mapId,
|
||||||
|
channel: fmt.Sprintf("simulation-%s_%d-devices-status", vs.SimulationId, mapId),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取消息服务名
|
||||||
|
func (r *RccMs) GetChannel() string {
|
||||||
|
return r.channel
|
||||||
|
}
|
||||||
|
|
||||||
|
// 发送消息间隔时间,单位ms
|
||||||
|
func (r *RccMs) GetInterval() time.Duration {
|
||||||
|
return 200 * time.Millisecond
|
||||||
|
}
|
||||||
|
|
||||||
|
// 构造定时发送的消息
|
||||||
|
func (r *RccMs) OnTick() ([]*ms_api.TopicMsg, error) {
|
||||||
|
relayStates, err := r.collectRelayState()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
ststes := &state.PushedDevicesStatus{
|
||||||
|
All: true,
|
||||||
|
AllStatus: &state.AllDevicesStatus{
|
||||||
|
ReplyState: relayStates,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
b, err := proto.Marshal(ststes)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("信号布置图设备状态消息服务数据序列化失败, %s", err)
|
||||||
|
}
|
||||||
|
return []*ms_api.TopicMsg{ms_api.NewTopicMsg(r.channel, b)}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// 当发生错误时执行的逻辑
|
||||||
|
func (r *RccMs) OnError(err error) {
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取仿真地图的继电器状态,前端推送
|
||||||
|
func (r *RccMs) collectRelayState() ([]*state.ReplyState, error) {
|
||||||
|
// 获取本地图下的继电器信息
|
||||||
|
uidMap := memory.QueryMapUidMapByType(r.mapId, &graphicData.Relay{})
|
||||||
|
var replyStateArr []*state.ReplyState
|
||||||
|
for _, u := range uidMap {
|
||||||
|
entry, ok := entity.GetEntityByUid(r.vs.World, u.Uid)
|
||||||
|
if !ok {
|
||||||
|
// 暂时注释,很多继电器都没初始化
|
||||||
|
//return nil, fmt.Errorf("继电器实体不存在: World id=%d, uid=%s", r.vs.World.Id(), u.Uid)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if entry.HasComponent(component.RelayTag) {
|
||||||
|
bit := component.BitStateType.Get(entry)
|
||||||
|
replyStateArr = append(replyStateArr, &state.ReplyState{Id: u.CommonId, Xh: bit.Val})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return replyStateArr, nil
|
||||||
}
|
}
|
||||||
|
@ -21,8 +21,7 @@ type SfpMs struct {
|
|||||||
channel string
|
channel string
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewSfpMs(vs *memory.VerifySimulation) *SfpMs {
|
func NewSfpMs(vs *memory.VerifySimulation, mapId int32) *SfpMs {
|
||||||
mapId := int32(0)
|
|
||||||
return &SfpMs{
|
return &SfpMs{
|
||||||
vs: vs,
|
vs: vs,
|
||||||
mapId: mapId,
|
mapId: mapId,
|
||||||
@ -90,14 +89,75 @@ func (ms *SfpMs) OnError(err error) {
|
|||||||
|
|
||||||
// 收集屏蔽门状态
|
// 收集屏蔽门状态
|
||||||
func (ms *SfpMs) collectPsdStates() ([]*state.PsdState, error) {
|
func (ms *SfpMs) collectPsdStates() ([]*state.PsdState, error) {
|
||||||
// TODO: 重构之前的消息服务
|
world := ms.vs.World
|
||||||
return nil, nil
|
uidStructure := memory.QueryUidStructure[*memory.StationUidStructure](ms.mapId)
|
||||||
|
data := memory.QueryGiData[*graphicData.RtssGraphicStorage](ms.mapId)
|
||||||
|
var psdStateArr []*state.PsdState
|
||||||
|
for _, door := range data.ScreenDoors {
|
||||||
|
uid := uidStructure.PsdIds[door.Common.Id].Uid
|
||||||
|
psdEntry, ok := entity.GetEntityByUid(world, uid)
|
||||||
|
if ok {
|
||||||
|
var amount int32
|
||||||
|
psdState := component.PsdStateType.Get(psdEntry)
|
||||||
|
if psdState.Km8 {
|
||||||
|
amount = 8
|
||||||
|
} else if psdState.Km4 {
|
||||||
|
amount = 4
|
||||||
|
} else {
|
||||||
|
amount = 0
|
||||||
|
}
|
||||||
|
start, end := getStartEndCodeByGroup(door, amount)
|
||||||
|
var openSubDoor []int32
|
||||||
|
for i := start; i <= end; i++ {
|
||||||
|
openSubDoor = append(openSubDoor, i)
|
||||||
|
}
|
||||||
|
psdStateArr = append(psdStateArr, &state.PsdState{
|
||||||
|
Id: door.Common.Id,
|
||||||
|
OpenDoorCodes: openSubDoor,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return psdStateArr, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func getStartEndCodeByGroup(door *graphicData.ScreenDoor, groupAmount int32) (int32, int32) {
|
||||||
|
for _, group := range door.ScreenDoorGroupList {
|
||||||
|
if group.TrainGroupAmount == groupAmount {
|
||||||
|
return group.StartSmallDoor, group.EndSmallDoor
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0, -1
|
||||||
}
|
}
|
||||||
|
|
||||||
// 收集区段状态
|
// 收集区段状态
|
||||||
func (ms *SfpMs) collectSectionStates() ([]*state.SectionState, error) {
|
func (ms *SfpMs) collectSectionStates() ([]*state.SectionState, error) {
|
||||||
// TODO: 重构之前的消息服务
|
uidMap := memory.QueryMapUidMapByType(ms.mapId, &graphicData.Section{})
|
||||||
return nil, nil
|
var sectionArr []*state.SectionState
|
||||||
|
for _, u := range uidMap {
|
||||||
|
s := handlerSectionState(ms.vs.World, u.Uid)
|
||||||
|
if s == nil {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
s.Id = u.CommonId
|
||||||
|
sectionArr = append(sectionArr, s)
|
||||||
|
}
|
||||||
|
return sectionArr, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func handlerSectionState(w ecs.World, uid string) *state.SectionState {
|
||||||
|
entry, ok := entity.GetEntityByUid(w, uid)
|
||||||
|
if !ok {
|
||||||
|
//fmt.Printf("id=%s的信号机不存在", uid)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
if entry.HasComponent(component.AxleSectionTag) { //计轴区段
|
||||||
|
sectionState := &state.SectionState{}
|
||||||
|
axleState := component.AxleSectionStateType.Get(entry)
|
||||||
|
sectionState.Occupied = axleState.Occ
|
||||||
|
sectionState.Type = state.SectionType_Axle
|
||||||
|
return sectionState
|
||||||
|
}
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// 收集车站按钮状态
|
// 收集车站按钮状态
|
||||||
|
@ -6,6 +6,7 @@ import (
|
|||||||
|
|
||||||
"joylink.club/bj-rtsts-server/message_server/ms_api"
|
"joylink.club/bj-rtsts-server/message_server/ms_api"
|
||||||
"joylink.club/bj-rtsts-server/message_server/ms_manage"
|
"joylink.club/bj-rtsts-server/message_server/ms_manage"
|
||||||
|
"joylink.club/bj-rtsts-server/ts/protos/graphicData"
|
||||||
"joylink.club/bj-rtsts-server/ts/simulation/wayside/memory"
|
"joylink.club/bj-rtsts-server/ts/simulation/wayside/memory"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -23,11 +24,21 @@ func Start(vs *memory.VerifySimulation) {
|
|||||||
_, ok := smsMap.Load(vs.SimulationId)
|
_, ok := smsMap.Load(vs.SimulationId)
|
||||||
if !ok {
|
if !ok {
|
||||||
sms := &SimulationMs{
|
sms := &SimulationMs{
|
||||||
vs: vs,
|
vs: vs,
|
||||||
mss: []ms_api.IMsgServer{
|
mss: []ms_api.IMsgServer{},
|
||||||
NewSfpMs(vs),
|
|
||||||
},
|
|
||||||
}
|
}
|
||||||
|
for _, mapId := range vs.MapIds {
|
||||||
|
t := memory.QueryOnlyGiType(mapId)
|
||||||
|
switch t {
|
||||||
|
case graphicData.PictureType_StationLayout: // 平面布置图
|
||||||
|
// 添加车站关联的平面布置图、IBP、PSL信息
|
||||||
|
sms.mss = append(sms.mss, NewSfpMs(vs, mapId), NewIBPMs(vs, mapId), NewPSLMs(vs, mapId))
|
||||||
|
case graphicData.PictureType_RelayCabinetLayout: // 继电器柜
|
||||||
|
sms.mss = append(sms.mss, NewRccMs(vs, mapId))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// 启动仿真状态服务
|
||||||
|
NewSimulationStateMs(vs)
|
||||||
ms_manage.Register(sms)
|
ms_manage.Register(sms)
|
||||||
smsMap.Store(vs.SimulationId, sms)
|
smsMap.Store(vs.SimulationId, sms)
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,53 @@
|
|||||||
package message_server
|
package message_server
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"google.golang.org/protobuf/proto"
|
||||||
|
apiproto "joylink.club/bj-rtsts-server/grpcproto"
|
||||||
|
"joylink.club/bj-rtsts-server/ts/protos/state"
|
||||||
|
"joylink.club/bj-rtsts-server/ts/simulation/wayside/memory"
|
||||||
|
"joylink.club/ecs"
|
||||||
|
)
|
||||||
|
|
||||||
// 世界状态变化消息服务
|
// 世界状态变化消息服务
|
||||||
type SimulationStateMs struct {
|
type SimulationStateMs struct {
|
||||||
|
vs *memory.VerifySimulation
|
||||||
|
channel string
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewSimulationStateMs(vs *memory.VerifySimulation) *SimulationStateMs {
|
||||||
|
ms := &SimulationStateMs{
|
||||||
|
vs: vs,
|
||||||
|
channel: fmt.Sprintf("simulation-%s-status", vs.SimulationId),
|
||||||
|
}
|
||||||
|
ecs.WorldStateChangeEvent.Subscribe(ms.vs.World, func(_ ecs.World, e ecs.WorldStateChange) {
|
||||||
|
switch e.NewState {
|
||||||
|
case ecs.WorldClose:
|
||||||
|
doSendState(ms.channel, &state.SimulationStatus{
|
||||||
|
SimulationId: vs.SimulationId,
|
||||||
|
State: state.SimulationStatus_DESTROY,
|
||||||
|
})
|
||||||
|
case ecs.WorldError:
|
||||||
|
doSendState(ms.channel, &state.SimulationStatus{
|
||||||
|
SimulationId: vs.SimulationId,
|
||||||
|
State: state.SimulationStatus_ERROR,
|
||||||
|
})
|
||||||
|
case ecs.WorldPause:
|
||||||
|
doSendState(ms.channel, &state.SimulationStatus{
|
||||||
|
SimulationId: vs.SimulationId,
|
||||||
|
State: state.SimulationStatus_PAUSE,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
return ms
|
||||||
|
}
|
||||||
|
|
||||||
|
func doSendState(channel string, status *state.SimulationStatus) error {
|
||||||
|
b, err := proto.Marshal(status)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("仿真状态消息服务数据序列化失败, %s", err)
|
||||||
|
}
|
||||||
|
apiproto.PublishMsg(channel, b)
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -1 +1 @@
|
|||||||
Subproject commit 4fc223c9f7154d6a01e75db0c5745ad6c177c57e
|
Subproject commit 085bfdc6f9afc84c0724c49441aa59d734906a6a
|
@ -21,7 +21,7 @@ func PageProjectRunConfigQuery(query *dto.PageProjectRunConfigReqDto) *dto.PageD
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
panic(sys_error.New("查询失败,数据库错误请联系运维人员", err))
|
panic(sys_error.New("查询失败,数据库错误请联系运维人员", err))
|
||||||
}
|
}
|
||||||
return &dto.PageDto{Total: int(total), PageQueryDto: query.PageQueryDto, Records: records}
|
return &dto.PageDto{Total: int(total), PageQueryDto: query.PageQueryDto, Records: dto.ConvertToRunConfigFromSlice(records)}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 查询项目运行环境列表
|
// 查询项目运行环境列表
|
||||||
|
@ -151,7 +151,11 @@ func QueryProjectPublishedGi(id int32) []*model.PublishedGi {
|
|||||||
mids[i] = m.Mid
|
mids[i] = m.Mid
|
||||||
}
|
}
|
||||||
dp := dbquery.PublishedGi
|
dp := dbquery.PublishedGi
|
||||||
publishedGis, _ := dp.Select(dp.ID, dp.Name, dp.Category, dp.Type).Where(dp.ID.In(mids...), dp.Status.Eq(1)).Order(dp.Name).Find()
|
publishedGis, _ := dp.
|
||||||
|
Select(dp.ID, dp.Name, dp.Category, dp.Type).
|
||||||
|
Where(dp.ID.In(mids...), dp.Status.Eq(1)).
|
||||||
|
Order(dp.Type, dp.Name).
|
||||||
|
Find()
|
||||||
return publishedGis
|
return publishedGis
|
||||||
}
|
}
|
||||||
|
|
||||||
|
97
third_party/deprecated/example_test.go
vendored
97
third_party/deprecated/example_test.go
vendored
@ -1,97 +0,0 @@
|
|||||||
package dynamics
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/hex"
|
|
||||||
"encoding/json"
|
|
||||||
"fmt"
|
|
||||||
"log"
|
|
||||||
"net"
|
|
||||||
"strconv"
|
|
||||||
"testing"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/gin-gonic/gin"
|
|
||||||
"github.com/panjf2000/gnet/v2"
|
|
||||||
"joylink.club/bj-rtsts-server/config"
|
|
||||||
)
|
|
||||||
|
|
||||||
// 这里用来测试通信与数据传输是否正常
|
|
||||||
|
|
||||||
func TestAll(t *testing.T) {
|
|
||||||
loadAndChangeConfig()
|
|
||||||
//注册列车信息处理逻辑
|
|
||||||
RegisterTrainInfoHandler(func(info *TrainInfo) {
|
|
||||||
fmt.Println("处理列车信息...")
|
|
||||||
fmt.Println(info)
|
|
||||||
})
|
|
||||||
//启动udp服务
|
|
||||||
go RunUdpServer()
|
|
||||||
////启动仅用于的测试的模拟远程udp服务
|
|
||||||
go runTestUdpServer()
|
|
||||||
////启动http服务
|
|
||||||
go runTestHttpServer()
|
|
||||||
time.Sleep(2 * time.Second)
|
|
||||||
//向本地udp服务发送数据
|
|
||||||
sendDataToLocalUdpServer()
|
|
||||||
//向远程udp服务发送数据
|
|
||||||
_ = sendDynamicsMsg(encoderDynamicsTurnout(&TurnoutInfo{Code: 02}))
|
|
||||||
//发送http请求
|
|
||||||
_, _, _ = SendInitTrainReq(&InitTrainInfo{Speed: 10})
|
|
||||||
}
|
|
||||||
|
|
||||||
func loadAndChangeConfig() {
|
|
||||||
config.LoadConfig()
|
|
||||||
config.Config.Dynamics.Ip = "127.0.0.1"
|
|
||||||
config.Config.Dynamics.HttpPort = 3500
|
|
||||||
}
|
|
||||||
|
|
||||||
func sendDataToLocalUdpServer() {
|
|
||||||
addr, _ := net.ResolveUDPAddr("udp", "127.0.0.1:"+strconv.Itoa(config.Config.Dynamics.UdpLocalPort))
|
|
||||||
conn, _ := net.DialUDP("udp", nil, addr)
|
|
||||||
buf, _ := hex.DecodeString("0009012EE009000000070380000006000100020003000A000A000A000A000A000A000A")
|
|
||||||
conn.Write(buf)
|
|
||||||
conn.Close()
|
|
||||||
}
|
|
||||||
|
|
||||||
func runTestHttpServer() {
|
|
||||||
engine := gin.Default()
|
|
||||||
engine.POST("/api/aerodynamics/init/train", func(context *gin.Context) {
|
|
||||||
info := InitTrainInfo{}
|
|
||||||
err := context.ShouldBindJSON(&info)
|
|
||||||
if err != nil {
|
|
||||||
println(err.Error())
|
|
||||||
}
|
|
||||||
data, err := json.MarshalIndent(info, "", " ")
|
|
||||||
fmt.Println("---------------- 接收到的列车初始化信息 ----------------")
|
|
||||||
fmt.Println(string(data))
|
|
||||||
if info.Speed != 10 {
|
|
||||||
println("http服务接收到的数据异常")
|
|
||||||
}
|
|
||||||
})
|
|
||||||
engine.Run(fmt.Sprintf(":%d", config.Config.Dynamics.HttpPort))
|
|
||||||
}
|
|
||||||
|
|
||||||
func runTestUdpServer() {
|
|
||||||
server := &testUdpServer{addr: fmt.Sprintf("udp://:%d", config.Config.Dynamics.UdpRemotePort), multicore: false}
|
|
||||||
log.Fatal(gnet.Run(server, server.addr, gnet.WithMulticore(server.multicore)))
|
|
||||||
}
|
|
||||||
|
|
||||||
type testUdpServer struct {
|
|
||||||
gnet.BuiltinEventEngine
|
|
||||||
|
|
||||||
eng gnet.Engine
|
|
||||||
addr string
|
|
||||||
multicore bool
|
|
||||||
|
|
||||||
eventHandlers []gnet.EventHandler
|
|
||||||
}
|
|
||||||
|
|
||||||
func (server *testUdpServer) OnTraffic(c gnet.Conn) gnet.Action {
|
|
||||||
buf, err := c.Next(-1)
|
|
||||||
if err != nil {
|
|
||||||
println(err.Error())
|
|
||||||
}
|
|
||||||
fmt.Println("---------------- 远程udp服务接收到的字节数据 ----------------")
|
|
||||||
fmt.Println(buf)
|
|
||||||
return gnet.None
|
|
||||||
}
|
|
120
third_party/deprecated/http.go
vendored
120
third_party/deprecated/http.go
vendored
@ -1,120 +0,0 @@
|
|||||||
package dynamics
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"encoding/json"
|
|
||||||
"fmt"
|
|
||||||
"net/http"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"joylink.club/bj-rtsts-server/config"
|
|
||||||
)
|
|
||||||
|
|
||||||
func SendInitTrainReq(info *InitTrainInfo) (int, *[]byte, error) {
|
|
||||||
if !config.Config.Dynamics.Open {
|
|
||||||
return http.StatusOK, nil, nil
|
|
||||||
}
|
|
||||||
baseUrl := getUrlBase()
|
|
||||||
uri := "/api/aerodynamics/init/train/"
|
|
||||||
url := baseUrl + uri
|
|
||||||
data, _ := json.Marshal(info)
|
|
||||||
client := http.Client{
|
|
||||||
Timeout: time.Second * 5,
|
|
||||||
}
|
|
||||||
resp, err := client.Post(url, "application/json", bytes.NewBuffer(data))
|
|
||||||
if err != nil {
|
|
||||||
s := err.Error()
|
|
||||||
println(s)
|
|
||||||
return 0, nil, err
|
|
||||||
}
|
|
||||||
var buf []byte
|
|
||||||
_, err = resp.Body.Read(buf)
|
|
||||||
if err != nil {
|
|
||||||
return resp.StatusCode, nil, err
|
|
||||||
}
|
|
||||||
return resp.StatusCode, &buf, resp.Body.Close()
|
|
||||||
}
|
|
||||||
|
|
||||||
func SendRemoveTrainReq(info *InitTrainInfo) (int, *[]byte, error) {
|
|
||||||
if !config.Config.Dynamics.Open {
|
|
||||||
return http.StatusOK, nil, nil
|
|
||||||
}
|
|
||||||
baseUrl := getUrlBase()
|
|
||||||
uri := "/api/aerodynamics/remove/train/"
|
|
||||||
url := baseUrl + uri
|
|
||||||
data, _ := json.Marshal(info)
|
|
||||||
client := http.Client{
|
|
||||||
Timeout: time.Second * 5,
|
|
||||||
}
|
|
||||||
resp, err := client.Post(url, "application/json", bytes.NewBuffer(data))
|
|
||||||
if err != nil {
|
|
||||||
s := err.Error()
|
|
||||||
println(s)
|
|
||||||
return 0, nil, err
|
|
||||||
}
|
|
||||||
var buf []byte
|
|
||||||
_, err = resp.Body.Read(buf)
|
|
||||||
if err != nil {
|
|
||||||
return resp.StatusCode, nil, err
|
|
||||||
}
|
|
||||||
return resp.StatusCode, &buf, resp.Body.Close()
|
|
||||||
}
|
|
||||||
|
|
||||||
func SendSimulationStartReq(base *LineBaseInfo) (int, *[]byte, error) {
|
|
||||||
if !config.Config.Dynamics.Open {
|
|
||||||
return http.StatusOK, nil, nil
|
|
||||||
}
|
|
||||||
baseUrl := getUrlBase()
|
|
||||||
uri := "/api/start/"
|
|
||||||
url := baseUrl + uri
|
|
||||||
data, _ := json.Marshal(base)
|
|
||||||
resp, err := http.Post(url, "application/json", bytes.NewBuffer(data))
|
|
||||||
if err != nil {
|
|
||||||
s := err.Error()
|
|
||||||
println(s)
|
|
||||||
return 0, nil, err
|
|
||||||
}
|
|
||||||
var buf []byte
|
|
||||||
_, err = resp.Body.Read(buf)
|
|
||||||
if err != nil {
|
|
||||||
return resp.StatusCode, nil, err
|
|
||||||
}
|
|
||||||
return resp.StatusCode, &buf, resp.Body.Close()
|
|
||||||
}
|
|
||||||
|
|
||||||
func SendSimulationEndReq() (int, *[]byte, error) {
|
|
||||||
if !config.Config.Dynamics.Open {
|
|
||||||
return http.StatusOK, nil, nil
|
|
||||||
}
|
|
||||||
baseUrl := getUrlBase()
|
|
||||||
uri := "/api/end/"
|
|
||||||
url := baseUrl + uri
|
|
||||||
resp, err := http.Post(url, "application/json", nil)
|
|
||||||
if err != nil {
|
|
||||||
s := err.Error()
|
|
||||||
println(s)
|
|
||||||
return 0, nil, err
|
|
||||||
}
|
|
||||||
var buf []byte
|
|
||||||
_, err = resp.Body.Read(buf)
|
|
||||||
if err != nil {
|
|
||||||
return resp.StatusCode, nil, err
|
|
||||||
}
|
|
||||||
return resp.StatusCode, &buf, resp.Body.Close()
|
|
||||||
}
|
|
||||||
|
|
||||||
var (
|
|
||||||
urlBase string
|
|
||||||
)
|
|
||||||
|
|
||||||
func getUrlBase() string {
|
|
||||||
if urlBase == "" {
|
|
||||||
ip := config.Config.Dynamics.Ip
|
|
||||||
var port string
|
|
||||||
if config.Config.Dynamics.HttpPort != 0 {
|
|
||||||
port = fmt.Sprintf(":%d", config.Config.Dynamics.HttpPort)
|
|
||||||
}
|
|
||||||
urlBase = "http://" + ip + port
|
|
||||||
}
|
|
||||||
return urlBase
|
|
||||||
}
|
|
52
third_party/deprecated/httpData.go
vendored
52
third_party/deprecated/httpData.go
vendored
@ -1,52 +0,0 @@
|
|||||||
package dynamics
|
|
||||||
|
|
||||||
type InitTrainInfo struct {
|
|
||||||
TrainIndex uint16 `json:"trainIndex"`
|
|
||||||
LinkIndex uint16 `json:"linkIndex"`
|
|
||||||
LinkOffset uint32 `json:"linkOffset"`
|
|
||||||
//单位0.1km/h
|
|
||||||
Speed uint16 `json:"speed"`
|
|
||||||
Up bool `json:"up"`
|
|
||||||
TrainLength uint16 `json:"trainLength"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// 移除列车请求参数
|
|
||||||
type RemoveTrainReq struct {
|
|
||||||
TrainIndex uint16 `json:"trainIndex"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// LineBaseInfo 线路基础信息,提供给动力学作为计算依据
|
|
||||||
type LineBaseInfo struct {
|
|
||||||
LinkList []*Link `json:"linkList"`
|
|
||||||
SlopeList []*Slope `json:"slopeList"`
|
|
||||||
CurveList []*Curve `json:"curveList"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type Link struct {
|
|
||||||
ID int32 `json:"id"`
|
|
||||||
//长度 mm
|
|
||||||
Len int32 `json:"len"`
|
|
||||||
ARelTurnoutId int32 `json:"ARelTurnoutId"`
|
|
||||||
ARelTurnoutPoint string `json:"ARelTurnoutPoint"`
|
|
||||||
BRelTurnoutId int32 `json:"BRelTurnoutId"`
|
|
||||||
BRelTurnoutPoint string `json:"BRelTurnoutPoint"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type Slope struct {
|
|
||||||
ID int32 `json:"id"`
|
|
||||||
StartLinkId int32 `json:"startLinkId"`
|
|
||||||
StartLinkOffset int32 `json:"startLinkOffset"`
|
|
||||||
EndLinkId int32 `json:"endLinkId"`
|
|
||||||
EndLinkOffset int32 `json:"endLinkOffset"`
|
|
||||||
//坡度的三角函数(猜是sin)值的*1000
|
|
||||||
DegreeTrig int32 `json:"degreeTrig"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type Curve struct {
|
|
||||||
ID int32 `json:"id"`
|
|
||||||
StartLinkId int32 `json:"startLinkId"`
|
|
||||||
StartLinkOffset int32 `json:"startLinkOffset"`
|
|
||||||
EndLinkId int32 `json:"endLinkId"`
|
|
||||||
EndLinkOffset int32 `json:"endLinkOffset"`
|
|
||||||
Curvature int32 `json:"curvature"`
|
|
||||||
}
|
|
102
third_party/deprecated/http_test.go
vendored
102
third_party/deprecated/http_test.go
vendored
@ -1,102 +0,0 @@
|
|||||||
package dynamics
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/json"
|
|
||||||
"testing"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/spf13/viper"
|
|
||||||
"joylink.club/bj-rtsts-server/config"
|
|
||||||
)
|
|
||||||
|
|
||||||
func TestSendTrainInitReq(t *testing.T) {
|
|
||||||
viper.AddConfigPath("../")
|
|
||||||
config.LoadConfig()
|
|
||||||
info := InitTrainInfo{
|
|
||||||
TrainIndex: uint16(1),
|
|
||||||
LinkIndex: 2,
|
|
||||||
LinkOffset: 3,
|
|
||||||
Speed: 4,
|
|
||||||
Up: true,
|
|
||||||
}
|
|
||||||
time.Sleep(time.Second)
|
|
||||||
SendInitTrainReq(&info)
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestSendSimulationStartReq(t *testing.T) {
|
|
||||||
viper.AddConfigPath("../")
|
|
||||||
config.LoadConfig()
|
|
||||||
SendSimulationStartReq(mockLineBaseInfo())
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestSendSimulationEndReq(t *testing.T) {
|
|
||||||
viper.AddConfigPath("../")
|
|
||||||
config.LoadConfig()
|
|
||||||
SendSimulationEndReq()
|
|
||||||
}
|
|
||||||
|
|
||||||
func mockLineBaseInfo() *LineBaseInfo {
|
|
||||||
var links []*Link
|
|
||||||
for i := 1; i <= 12; i++ {
|
|
||||||
var atid int32
|
|
||||||
var btid int32
|
|
||||||
if i <= 6 {
|
|
||||||
atid = int32(i - 1)
|
|
||||||
btid = int32(i)
|
|
||||||
} else {
|
|
||||||
atid = int32(i - 2)
|
|
||||||
btid = int32(i - 1)
|
|
||||||
}
|
|
||||||
if i == 1 || i == 7 {
|
|
||||||
atid = 0
|
|
||||||
} else if i == 6 || i == 12 {
|
|
||||||
btid = 0
|
|
||||||
}
|
|
||||||
links = append(links, &Link{
|
|
||||||
ID: int32(i),
|
|
||||||
Len: int32(i * 100000),
|
|
||||||
ARelTurnoutId: atid,
|
|
||||||
ARelTurnoutPoint: "A",
|
|
||||||
BRelTurnoutId: btid,
|
|
||||||
BRelTurnoutPoint: "B",
|
|
||||||
})
|
|
||||||
}
|
|
||||||
for i := 13; i <= 17; i++ {
|
|
||||||
links = append(links, &Link{
|
|
||||||
ID: int32(i),
|
|
||||||
Len: int32(i * 100000),
|
|
||||||
ARelTurnoutId: int32(i - 12),
|
|
||||||
ARelTurnoutPoint: "A",
|
|
||||||
BRelTurnoutId: int32(i - 12 + 5),
|
|
||||||
BRelTurnoutPoint: "B",
|
|
||||||
})
|
|
||||||
}
|
|
||||||
slopes := []*Slope{{
|
|
||||||
ID: 1,
|
|
||||||
StartLinkId: 1,
|
|
||||||
StartLinkOffset: 1,
|
|
||||||
EndLinkId: 1,
|
|
||||||
EndLinkOffset: 1,
|
|
||||||
DegreeTrig: 1,
|
|
||||||
}}
|
|
||||||
curves := []*Curve{{
|
|
||||||
ID: 1,
|
|
||||||
StartLinkId: 1,
|
|
||||||
StartLinkOffset: 1,
|
|
||||||
EndLinkId: 1,
|
|
||||||
EndLinkOffset: 1,
|
|
||||||
Curvature: 1,
|
|
||||||
}}
|
|
||||||
base := LineBaseInfo{
|
|
||||||
LinkList: links,
|
|
||||||
SlopeList: slopes,
|
|
||||||
CurveList: curves,
|
|
||||||
}
|
|
||||||
return &base
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestCalculationBase(t *testing.T) {
|
|
||||||
base := mockLineBaseInfo()
|
|
||||||
marshal, _ := json.Marshal(base)
|
|
||||||
println(string(marshal))
|
|
||||||
}
|
|
270
third_party/deprecated/udp.go
vendored
270
third_party/deprecated/udp.go
vendored
@ -1,270 +0,0 @@
|
|||||||
package dynamics
|
|
||||||
|
|
||||||
import (
|
|
||||||
"container/list"
|
|
||||||
"encoding/binary"
|
|
||||||
"errors"
|
|
||||||
"fmt"
|
|
||||||
"log/slog"
|
|
||||||
"math"
|
|
||||||
"net"
|
|
||||||
"sync"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/panjf2000/gnet/v2"
|
|
||||||
"go.uber.org/zap"
|
|
||||||
"joylink.club/bj-rtsts-server/config"
|
|
||||||
)
|
|
||||||
|
|
||||||
func init() {
|
|
||||||
go func() {
|
|
||||||
for {
|
|
||||||
info := <-trainInfoChan
|
|
||||||
for e := handlerList.Front(); e != nil; e = e.Next() {
|
|
||||||
func() {
|
|
||||||
defer func() {
|
|
||||||
r := recover()
|
|
||||||
if r != nil {
|
|
||||||
slog.Error("列车信息处理函数报错", "error", r)
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
handler := e.Value.(TrainInfoHandler)
|
|
||||||
handler(info)
|
|
||||||
}()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
}
|
|
||||||
|
|
||||||
type TurnoutInfoFunc func() []*TurnoutInfo
|
|
||||||
|
|
||||||
var (
|
|
||||||
running bool
|
|
||||||
mutex sync.Mutex
|
|
||||||
turnoutInfoFunc TurnoutInfoFunc
|
|
||||||
//道岔消息生命信号
|
|
||||||
turnoutLifeSignal uint16
|
|
||||||
//列车消息生命信号
|
|
||||||
trainLifeSignal uint16
|
|
||||||
//列车生命信号是否初始化
|
|
||||||
trainLifeSignalInit bool
|
|
||||||
//用于处理生命信号循环使用产生的各种特殊处理
|
|
||||||
limit uint16 = 10000
|
|
||||||
//列车消息队列
|
|
||||||
trainInfoChan chan *TrainInfo = make(chan *TrainInfo)
|
|
||||||
)
|
|
||||||
|
|
||||||
var handlerList list.List
|
|
||||||
|
|
||||||
type TrainInfoHandler func(info *TrainInfo)
|
|
||||||
|
|
||||||
type udpServer struct {
|
|
||||||
gnet.BuiltinEventEngine
|
|
||||||
|
|
||||||
eng gnet.Engine
|
|
||||||
addr string
|
|
||||||
multicore bool
|
|
||||||
}
|
|
||||||
|
|
||||||
func (server *udpServer) OnBoot(eng gnet.Engine) gnet.Action {
|
|
||||||
server.eng = eng
|
|
||||||
slog.Info("udp server启动", "multicore", server.multicore, "listeningOn", server.addr)
|
|
||||||
return gnet.None
|
|
||||||
}
|
|
||||||
|
|
||||||
// OnTraffic 接收到数据后的解析
|
|
||||||
func (server *udpServer) OnTraffic(c gnet.Conn) gnet.Action {
|
|
||||||
defer func() {
|
|
||||||
if r := recover(); r != nil {
|
|
||||||
zap.L().Error("udp服务数据解析异常", zap.Any("panic", r))
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
buf, _ := c.Next(-1)
|
|
||||||
lifeSignal := binary.BigEndian.Uint16(buf[0:2])
|
|
||||||
if !trainLifeSignalInit {
|
|
||||||
trainLifeSignalInit = true
|
|
||||||
} else if trainLifeSignal < limit {
|
|
||||||
if lifeSignal < trainLifeSignal || lifeSignal > trainLifeSignal-limit {
|
|
||||||
slog.Debug("丢弃列车信息", "lifeSignal", lifeSignal, "trainLifeSignal", trainLifeSignal)
|
|
||||||
return gnet.None
|
|
||||||
}
|
|
||||||
} else if trainLifeSignal < math.MaxUint16-10000 {
|
|
||||||
if lifeSignal < trainLifeSignal {
|
|
||||||
slog.Debug("丢弃列车信息", "lifeSignal", lifeSignal, "trainLifeSignal", trainLifeSignal)
|
|
||||||
return gnet.None
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if lifeSignal < trainLifeSignal && lifeSignal > trainLifeSignal+10000 {
|
|
||||||
slog.Debug("丢弃列车信息", "lifeSignal", lifeSignal, "trainLifeSignal", trainLifeSignal)
|
|
||||||
return gnet.None
|
|
||||||
}
|
|
||||||
}
|
|
||||||
trainLifeSignal = lifeSignal
|
|
||||||
trainInfo := decoderDynamicsTrainInfo(buf)
|
|
||||||
trainInfoChan <- trainInfo
|
|
||||||
return gnet.None
|
|
||||||
}
|
|
||||||
|
|
||||||
func RunUdpServer() {
|
|
||||||
if !config.Config.Dynamics.Open {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
server := &udpServer{addr: fmt.Sprintf("udp://:%d", config.Config.Dynamics.UdpLocalPort), multicore: false}
|
|
||||||
err := gnet.Run(server, server.addr, gnet.WithMulticore(server.multicore))
|
|
||||||
zap.L().Fatal("udp服务启动失败", zap.Error(err))
|
|
||||||
}
|
|
||||||
|
|
||||||
func Run(tiFunc TurnoutInfoFunc) error {
|
|
||||||
if !config.Config.Dynamics.Open {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
mutex.Lock()
|
|
||||||
defer mutex.Unlock()
|
|
||||||
trainLifeSignalInit = false
|
|
||||||
return runSendTurnoutStateTask(tiFunc)
|
|
||||||
}
|
|
||||||
|
|
||||||
// 注册数据操作
|
|
||||||
func RegisterTrainInfoHandler(handler TrainInfoHandler) {
|
|
||||||
handlerList.PushBack(handler)
|
|
||||||
}
|
|
||||||
|
|
||||||
func Stop() {
|
|
||||||
mutex.Lock()
|
|
||||||
defer mutex.Unlock()
|
|
||||||
turnoutInfoFunc = nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// 动力学消息发送消息
|
|
||||||
func sendDynamicsMsg(buf []byte) error {
|
|
||||||
defer func() {
|
|
||||||
if r := recover(); r != nil {
|
|
||||||
slog.Error("发送道岔信息失败", r)
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
addr := fmt.Sprintf("%v:%v", config.Config.Dynamics.Ip, config.Config.Dynamics.UdpRemotePort)
|
|
||||||
remoteAddr, _ := net.ResolveUDPAddr("udp", addr)
|
|
||||||
conn, err := net.DialUDP("udp", nil, remoteAddr)
|
|
||||||
if err != nil {
|
|
||||||
slog.Error("UDP通信失败", err)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
defer func(conn *net.UDPConn) {
|
|
||||||
err := conn.Close()
|
|
||||||
if err != nil {
|
|
||||||
slog.Error("关闭UDP连接失败", "error", err)
|
|
||||||
}
|
|
||||||
}(conn)
|
|
||||||
_, err = conn.Write(buf)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// 给动力学发送列车信息
|
|
||||||
func SendDynamicsTrainMsg(buf []byte) error {
|
|
||||||
defer func() {
|
|
||||||
if r := recover(); r != nil {
|
|
||||||
slog.Error("发送道岔信息失败", r)
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
addr := fmt.Sprintf("%v:%v", config.Config.Dynamics.Ip, config.Config.Dynamics.UdpRemoteTrainPort)
|
|
||||||
remoteAddr, _ := net.ResolveUDPAddr("udp", addr)
|
|
||||||
conn, err := net.DialUDP("udp", nil, remoteAddr)
|
|
||||||
if err != nil {
|
|
||||||
slog.Error("UDP通信失败", err)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
defer func(conn *net.UDPConn) {
|
|
||||||
err := conn.Close()
|
|
||||||
if err != nil {
|
|
||||||
slog.Error("关闭UDP连接失败", "error", err)
|
|
||||||
}
|
|
||||||
}(conn)
|
|
||||||
_, err = conn.Write(buf)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// 发送道岔状态任务
|
|
||||||
func runSendTurnoutStateTask(tiFunc TurnoutInfoFunc) error {
|
|
||||||
if running {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
if tiFunc == nil {
|
|
||||||
return errors.New("tiFunc不能为空")
|
|
||||||
}
|
|
||||||
turnoutInfoFunc = tiFunc
|
|
||||||
go func() {
|
|
||||||
defer func() {
|
|
||||||
if r := recover(); r != nil {
|
|
||||||
fmt.Println("Recovered from panic:", r)
|
|
||||||
}
|
|
||||||
// 重新运行
|
|
||||||
doDynamicsTurnoutUDPRun()
|
|
||||||
}()
|
|
||||||
// 动力学UDP逻辑运行
|
|
||||||
doDynamicsTurnoutUDPRun()
|
|
||||||
}()
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func doDynamicsTurnoutUDPRun() {
|
|
||||||
tick := time.Tick(50 * time.Millisecond)
|
|
||||||
for range tick {
|
|
||||||
if turnoutInfoFunc == nil {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
slice := turnoutInfoFunc()
|
|
||||||
for _, turnoutInfo := range slice {
|
|
||||||
turnoutInfo.lifeSignal = turnoutLifeSignal
|
|
||||||
// sendTurnoutInfo 发送道岔信息
|
|
||||||
err := sendDynamicsMsg(encoderDynamicsTurnout(turnoutInfo))
|
|
||||||
if err != nil {
|
|
||||||
slog.Error("发送道岔信息到动力学失败", "error", err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
turnoutLifeSignal++
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 解析动力学的列车信息
|
|
||||||
func decoderDynamicsTrainInfo(buf []byte) *TrainInfo {
|
|
||||||
trainInfo := &TrainInfo{}
|
|
||||||
trainInfo.LifeSignal = binary.BigEndian.Uint16(buf[0:2])
|
|
||||||
trainInfo.Number = buf[2]
|
|
||||||
trainInfo.Len = binary.BigEndian.Uint16(buf[3:5])
|
|
||||||
trainInfo.Link = buf[5]
|
|
||||||
trainInfo.LinkOffset = binary.BigEndian.Uint32(buf[6:10])
|
|
||||||
trainInfo.Slope = binary.BigEndian.Uint16(buf[10:12])
|
|
||||||
b := buf[12]
|
|
||||||
trainInfo.UpSlope = (b & (1 << 7)) != 0
|
|
||||||
trainInfo.Up = (b & (1 << 6)) != 0
|
|
||||||
trainInfo.TotalResistance = int32(binary.BigEndian.Uint32(buf[14:18]))
|
|
||||||
trainInfo.AirResistance = int32(binary.BigEndian.Uint32(buf[18:22]))
|
|
||||||
trainInfo.SlopeResistance = int32(binary.BigEndian.Uint32(buf[22:26]))
|
|
||||||
trainInfo.CurveResistance = int32(binary.BigEndian.Uint32(buf[26:30]))
|
|
||||||
trainInfo.Speed = math.Float32frombits(binary.BigEndian.Uint32(buf[30:34]))
|
|
||||||
trainInfo.HeadSpeed1 = math.Float32frombits(binary.BigEndian.Uint32(buf[34:38]))
|
|
||||||
trainInfo.HeadSpeed2 = math.Float32frombits(binary.BigEndian.Uint32(buf[38:42]))
|
|
||||||
trainInfo.TailSpeed1 = math.Float32frombits(binary.BigEndian.Uint32(buf[42:46]))
|
|
||||||
trainInfo.TailSpeed2 = math.Float32frombits(binary.BigEndian.Uint32(buf[46:50]))
|
|
||||||
trainInfo.HeadRadarSpeed = math.Float32frombits(binary.BigEndian.Uint32(buf[50:54]))
|
|
||||||
trainInfo.TailRadarSpeed = math.Float32frombits(binary.BigEndian.Uint32(buf[54:58]))
|
|
||||||
trainInfo.Acceleration = math.Float32frombits(binary.BigEndian.Uint32(buf[58:62]))
|
|
||||||
trainInfo.VobcLifeSignal = binary.BigEndian.Uint16(buf[62:64])
|
|
||||||
return trainInfo
|
|
||||||
}
|
|
||||||
|
|
||||||
// 将道岔转为动力学的消息
|
|
||||||
func encoderDynamicsTurnout(info *TurnoutInfo) []byte {
|
|
||||||
var data []byte
|
|
||||||
data = binary.BigEndian.AppendUint16(data, info.lifeSignal)
|
|
||||||
data = binary.BigEndian.AppendUint16(data, info.Code)
|
|
||||||
var b byte
|
|
||||||
if info.NPosition {
|
|
||||||
b |= 1 << 7
|
|
||||||
}
|
|
||||||
if info.RPosition {
|
|
||||||
b |= 1 << 6
|
|
||||||
}
|
|
||||||
data = append(data, b)
|
|
||||||
return data
|
|
||||||
}
|
|
53
third_party/deprecated/udpData.go
vendored
53
third_party/deprecated/udpData.go
vendored
@ -1,53 +0,0 @@
|
|||||||
package dynamics
|
|
||||||
|
|
||||||
type TurnoutInfo struct {
|
|
||||||
lifeSignal uint16
|
|
||||||
Code uint16
|
|
||||||
NPosition bool
|
|
||||||
RPosition bool
|
|
||||||
}
|
|
||||||
|
|
||||||
type TrainInfo struct {
|
|
||||||
//生命信号
|
|
||||||
LifeSignal uint16
|
|
||||||
//列车号(车辆)
|
|
||||||
Number uint8
|
|
||||||
//列车长度 cm
|
|
||||||
Len uint16
|
|
||||||
//列车所在轨道link
|
|
||||||
Link uint8
|
|
||||||
//列车所在link偏移量(mm)
|
|
||||||
LinkOffset uint32
|
|
||||||
//列车所在位置坡度值(‰)
|
|
||||||
Slope uint16
|
|
||||||
//列车所在位置坡度走势(上/下坡)
|
|
||||||
UpSlope bool
|
|
||||||
//列车当前运行方向(偏移量增大/减小方向)
|
|
||||||
Up bool
|
|
||||||
//实际运行阻力(总)(N)
|
|
||||||
TotalResistance int32
|
|
||||||
//阻力1(空气阻力)(N)
|
|
||||||
AirResistance int32
|
|
||||||
//阻力2(坡道阻力)(N)
|
|
||||||
SlopeResistance int32
|
|
||||||
//阻力3(曲线阻力)(N)
|
|
||||||
CurveResistance int32
|
|
||||||
//列车运行速度(m/s)
|
|
||||||
Speed float32
|
|
||||||
//头车速传1速度值(m/s)
|
|
||||||
HeadSpeed1 float32
|
|
||||||
//头车速度2速度值(m/s)
|
|
||||||
HeadSpeed2 float32
|
|
||||||
//尾车速传1速度值(m/s)
|
|
||||||
TailSpeed1 float32
|
|
||||||
//尾车速度2速度值(m/s)
|
|
||||||
TailSpeed2 float32
|
|
||||||
//头车雷达速度值(m/s)
|
|
||||||
HeadRadarSpeed float32
|
|
||||||
//尾车雷达速度值(m/s)
|
|
||||||
TailRadarSpeed float32
|
|
||||||
//加速度(m/s^2)
|
|
||||||
Acceleration float32
|
|
||||||
// 对应动力学生命周期值
|
|
||||||
VobcLifeSignal uint16
|
|
||||||
}
|
|
210
third_party/deprecated/udp_test.go
vendored
210
third_party/deprecated/udp_test.go
vendored
@ -1,210 +0,0 @@
|
|||||||
package dynamics
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/hex"
|
|
||||||
"fmt"
|
|
||||||
"io"
|
|
||||||
"net"
|
|
||||||
"runtime"
|
|
||||||
"testing"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/panjf2000/gnet/v2"
|
|
||||||
"github.com/spf13/viper"
|
|
||||||
"joylink.club/bj-rtsts-server/config"
|
|
||||||
)
|
|
||||||
|
|
||||||
func TestRunUdpServer(t *testing.T) {
|
|
||||||
viper.AddConfigPath("../")
|
|
||||||
config.LoadConfig()
|
|
||||||
RegisterTrainInfoHandler(func(info *TrainInfo) {
|
|
||||||
fmt.Println("处理列车信息...")
|
|
||||||
fmt.Println(info)
|
|
||||||
})
|
|
||||||
RunUdpServer()
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestSendTurnoutInfo(t *testing.T) {
|
|
||||||
viper.AddConfigPath("../")
|
|
||||||
config.LoadConfig()
|
|
||||||
tick := time.Tick(50 * time.Millisecond)
|
|
||||||
for range tick {
|
|
||||||
for i := 1; i <= 9; i++ {
|
|
||||||
sendDynamicsMsg(encoderDynamicsTurnout(&TurnoutInfo{
|
|
||||||
Code: uint16(i),
|
|
||||||
NPosition: true,
|
|
||||||
RPosition: false,
|
|
||||||
}))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkUdpServer_OnTraffic(b *testing.B) {
|
|
||||||
runtime.GOMAXPROCS(1) //1个协程
|
|
||||||
buf, _ := hex.DecodeString("0009012EE009000000070380000006000100020003000A000A000A000A000A000A000A")
|
|
||||||
// 创建 udpServer 对象
|
|
||||||
server := &udpServer{}
|
|
||||||
// 创建虚拟的 gnet.Conn 对象
|
|
||||||
conn := &virtualConn{
|
|
||||||
readBuffer: buf,
|
|
||||||
}
|
|
||||||
|
|
||||||
// 在 Benchmark 中运行测试
|
|
||||||
for i := 0; i < b.N; i++ {
|
|
||||||
server.OnTraffic(conn)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
type virtualConn struct {
|
|
||||||
readBuffer []byte
|
|
||||||
}
|
|
||||||
|
|
||||||
func (vc *virtualConn) Read(p []byte) (n int, err error) {
|
|
||||||
//TODO implement me
|
|
||||||
panic("implement me")
|
|
||||||
}
|
|
||||||
|
|
||||||
func (vc *virtualConn) Write(p []byte) (n int, err error) {
|
|
||||||
//TODO implement me
|
|
||||||
panic("implement me")
|
|
||||||
}
|
|
||||||
|
|
||||||
func (vc *virtualConn) Context() (ctx interface{}) {
|
|
||||||
//TODO implement me
|
|
||||||
panic("implement me")
|
|
||||||
}
|
|
||||||
|
|
||||||
func (vc *virtualConn) SetContext(ctx interface{}) {
|
|
||||||
//TODO implement me
|
|
||||||
panic("implement me")
|
|
||||||
}
|
|
||||||
|
|
||||||
func (vc *virtualConn) Close() (err error) {
|
|
||||||
//TODO implement me
|
|
||||||
panic("implement me")
|
|
||||||
}
|
|
||||||
|
|
||||||
func (vc *virtualConn) WriteTo(w io.Writer) (n int64, err error) {
|
|
||||||
//TODO implement me
|
|
||||||
panic("implement me")
|
|
||||||
}
|
|
||||||
|
|
||||||
func (vc *virtualConn) Next(n int) (buf []byte, err error) {
|
|
||||||
//TODO implement me
|
|
||||||
return vc.readBuffer, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (vc *virtualConn) Peek(n int) (buf []byte, err error) {
|
|
||||||
//TODO implement me
|
|
||||||
panic("implement me")
|
|
||||||
}
|
|
||||||
|
|
||||||
func (vc *virtualConn) Discard(n int) (discarded int, err error) {
|
|
||||||
//TODO implement me
|
|
||||||
panic("implement me")
|
|
||||||
}
|
|
||||||
|
|
||||||
func (vc *virtualConn) InboundBuffered() (n int) {
|
|
||||||
//TODO implement me
|
|
||||||
panic("implement me")
|
|
||||||
}
|
|
||||||
|
|
||||||
func (vc *virtualConn) ReadFrom(r io.Reader) (n int64, err error) {
|
|
||||||
//TODO implement me
|
|
||||||
panic("implement me")
|
|
||||||
}
|
|
||||||
|
|
||||||
func (vc *virtualConn) Writev(bs [][]byte) (n int, err error) {
|
|
||||||
//TODO implement me
|
|
||||||
panic("implement me")
|
|
||||||
}
|
|
||||||
|
|
||||||
func (vc *virtualConn) Flush() (err error) {
|
|
||||||
//TODO implement me
|
|
||||||
panic("implement me")
|
|
||||||
}
|
|
||||||
|
|
||||||
func (vc *virtualConn) OutboundBuffered() (n int) {
|
|
||||||
//TODO implement me
|
|
||||||
panic("implement me")
|
|
||||||
}
|
|
||||||
|
|
||||||
func (vc *virtualConn) AsyncWrite(buf []byte, callback gnet.AsyncCallback) (err error) {
|
|
||||||
//TODO implement me
|
|
||||||
panic("implement me")
|
|
||||||
}
|
|
||||||
|
|
||||||
func (vc *virtualConn) AsyncWritev(bs [][]byte, callback gnet.AsyncCallback) (err error) {
|
|
||||||
//TODO implement me
|
|
||||||
panic("implement me")
|
|
||||||
}
|
|
||||||
|
|
||||||
func (vc *virtualConn) Fd() int {
|
|
||||||
//TODO implement me
|
|
||||||
panic("implement me")
|
|
||||||
}
|
|
||||||
|
|
||||||
func (vc *virtualConn) Dup() (int, error) {
|
|
||||||
//TODO implement me
|
|
||||||
panic("implement me")
|
|
||||||
}
|
|
||||||
|
|
||||||
func (vc *virtualConn) SetReadBuffer(bytes int) error {
|
|
||||||
//TODO implement me
|
|
||||||
panic("implement me")
|
|
||||||
}
|
|
||||||
|
|
||||||
func (vc *virtualConn) SetWriteBuffer(bytes int) error {
|
|
||||||
//TODO implement me
|
|
||||||
panic("implement me")
|
|
||||||
}
|
|
||||||
|
|
||||||
func (vc *virtualConn) SetLinger(sec int) error {
|
|
||||||
//TODO implement me
|
|
||||||
panic("implement me")
|
|
||||||
}
|
|
||||||
|
|
||||||
func (vc *virtualConn) SetKeepAlivePeriod(d time.Duration) error {
|
|
||||||
//TODO implement me
|
|
||||||
panic("implement me")
|
|
||||||
}
|
|
||||||
|
|
||||||
func (vc *virtualConn) SetNoDelay(noDelay bool) error {
|
|
||||||
//TODO implement me
|
|
||||||
panic("implement me")
|
|
||||||
}
|
|
||||||
|
|
||||||
func (vc *virtualConn) LocalAddr() (addr net.Addr) {
|
|
||||||
//TODO implement me
|
|
||||||
panic("implement me")
|
|
||||||
}
|
|
||||||
|
|
||||||
func (vc *virtualConn) RemoteAddr() (addr net.Addr) {
|
|
||||||
//TODO implement me
|
|
||||||
panic("implement me")
|
|
||||||
}
|
|
||||||
|
|
||||||
func (vc *virtualConn) Wake(callback gnet.AsyncCallback) (err error) {
|
|
||||||
//TODO implement me
|
|
||||||
panic("implement me")
|
|
||||||
}
|
|
||||||
|
|
||||||
func (vc *virtualConn) CloseWithCallback(callback gnet.AsyncCallback) (err error) {
|
|
||||||
//TODO implement me
|
|
||||||
panic("implement me")
|
|
||||||
}
|
|
||||||
|
|
||||||
func (vc *virtualConn) SetDeadline(t time.Time) (err error) {
|
|
||||||
//TODO implement me
|
|
||||||
panic("implement me")
|
|
||||||
}
|
|
||||||
|
|
||||||
func (vc *virtualConn) SetReadDeadline(t time.Time) (err error) {
|
|
||||||
//TODO implement me
|
|
||||||
panic("implement me")
|
|
||||||
}
|
|
||||||
|
|
||||||
func (vc *virtualConn) SetWriteDeadline(t time.Time) (err error) {
|
|
||||||
//TODO implement me
|
|
||||||
panic("implement me")
|
|
||||||
}
|
|
185
third_party/deprecated/vobc/udp.go
vendored
185
third_party/deprecated/vobc/udp.go
vendored
@ -1,185 +0,0 @@
|
|||||||
package vobc
|
|
||||||
|
|
||||||
import (
|
|
||||||
"container/list"
|
|
||||||
"encoding/binary"
|
|
||||||
"fmt"
|
|
||||||
"log/slog"
|
|
||||||
"math"
|
|
||||||
"net"
|
|
||||||
"sync"
|
|
||||||
|
|
||||||
"github.com/panjf2000/gnet/v2"
|
|
||||||
"go.uber.org/zap"
|
|
||||||
"joylink.club/bj-rtsts-server/config"
|
|
||||||
)
|
|
||||||
|
|
||||||
var (
|
|
||||||
running bool
|
|
||||||
mutex sync.Mutex
|
|
||||||
receiveTrainLifeSignal uint16 //接收列车消息生命信号
|
|
||||||
sendTrainLifeSignal uint16 //发送的列车消息生命信号
|
|
||||||
trainLifeSignalInit bool //列车生命信号是否初始化
|
|
||||||
limit uint16 = 10000 //用于处理生命信号循环使用产生的各种特殊处理
|
|
||||||
vobcMsgInfoChan chan []byte = make(chan []byte) //列车消息队列
|
|
||||||
//处理方法列表
|
|
||||||
handlerList list.List
|
|
||||||
)
|
|
||||||
|
|
||||||
func init() {
|
|
||||||
go func() {
|
|
||||||
for {
|
|
||||||
info := <-vobcMsgInfoChan
|
|
||||||
for e := handlerList.Front(); e != nil; e = e.Next() {
|
|
||||||
func() {
|
|
||||||
defer func() {
|
|
||||||
r := recover()
|
|
||||||
if r != nil {
|
|
||||||
slog.Error("列车信息处理函数报错")
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
handler := e.Value.(VobcDataHandler)
|
|
||||||
handler(info)
|
|
||||||
}()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
}
|
|
||||||
|
|
||||||
type VobcDataHandler func([]byte)
|
|
||||||
|
|
||||||
type udpServer struct {
|
|
||||||
gnet.BuiltinEventEngine
|
|
||||||
|
|
||||||
eng gnet.Engine
|
|
||||||
addr string
|
|
||||||
multicore bool
|
|
||||||
}
|
|
||||||
|
|
||||||
// udp 启动时运行
|
|
||||||
func (server *udpServer) OnBoot(eng gnet.Engine) gnet.Action {
|
|
||||||
server.eng = eng
|
|
||||||
slog.Info("vobc udp server 启动", "multicore", server.multicore, "addr", server.addr)
|
|
||||||
return gnet.None
|
|
||||||
}
|
|
||||||
|
|
||||||
// OnTraffic 接收到数据后的解析
|
|
||||||
func (server *udpServer) OnTraffic(c gnet.Conn) gnet.Action {
|
|
||||||
defer func() {
|
|
||||||
if r := recover(); r != nil {
|
|
||||||
zap.L().Error("vobc udp服务数据解析异常", zap.Any("panic", r))
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
buf, _ := c.Next(-1)
|
|
||||||
lifeSignal := binary.BigEndian.Uint16(buf[0:2])
|
|
||||||
if !trainLifeSignalInit {
|
|
||||||
trainLifeSignalInit = true
|
|
||||||
} else if receiveTrainLifeSignal < limit {
|
|
||||||
if lifeSignal < receiveTrainLifeSignal || lifeSignal > receiveTrainLifeSignal-limit {
|
|
||||||
slog.Debug("丢弃列车信息", "lifeSignal", lifeSignal, "trainLifeSignal", receiveTrainLifeSignal)
|
|
||||||
return gnet.None
|
|
||||||
}
|
|
||||||
} else if receiveTrainLifeSignal < math.MaxUint16-10000 {
|
|
||||||
if lifeSignal < receiveTrainLifeSignal {
|
|
||||||
slog.Debug("丢弃列车信息", "lifeSignal", lifeSignal, "trainLifeSignal", receiveTrainLifeSignal)
|
|
||||||
return gnet.None
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if lifeSignal < receiveTrainLifeSignal && lifeSignal > receiveTrainLifeSignal+10000 {
|
|
||||||
slog.Debug("丢弃列车信息", "lifeSignal", lifeSignal, "trainLifeSignal", receiveTrainLifeSignal)
|
|
||||||
return gnet.None
|
|
||||||
}
|
|
||||||
}
|
|
||||||
receiveTrainLifeSignal = lifeSignal
|
|
||||||
// trainInfo := decoderVobcTrainInfo(buf)
|
|
||||||
//消息队列
|
|
||||||
vobcMsgInfoChan <- buf
|
|
||||||
return gnet.None
|
|
||||||
}
|
|
||||||
|
|
||||||
// 注册处理vobc处理方法
|
|
||||||
func RegisterTrainInfoHandler(handler VobcDataHandler) {
|
|
||||||
handlerList.PushBack(handler)
|
|
||||||
}
|
|
||||||
|
|
||||||
// 创建UDP服务
|
|
||||||
func RunUdpServer() {
|
|
||||||
if !config.Config.Vobc.Open {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
server := &udpServer{addr: fmt.Sprintf("udp://:%d", config.Config.Vobc.LocalPort), multicore: false}
|
|
||||||
err := gnet.Run(server, server.addr, gnet.WithMulticore(server.multicore))
|
|
||||||
zap.L().Fatal("vobc udp服务启动失败", zap.Error(err))
|
|
||||||
}
|
|
||||||
|
|
||||||
// 发送列车速度到VOBC
|
|
||||||
func SendTrainSpeedTask(speed float64) error {
|
|
||||||
if running {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
mutex.Lock()
|
|
||||||
defer mutex.Unlock()
|
|
||||||
trainInfo := &SendTrainInfo{
|
|
||||||
LifeSignal: sendTrainLifeSignal,
|
|
||||||
Speed: uint16(speed),
|
|
||||||
}
|
|
||||||
err := sendVobcMsg(encoderVobcTrainInfo(trainInfo))
|
|
||||||
if err != nil {
|
|
||||||
slog.Error("发送Vobc信息失败", err)
|
|
||||||
}
|
|
||||||
sendTrainLifeSignal++
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// UDP停止
|
|
||||||
func Stop() {
|
|
||||||
mutex.Lock()
|
|
||||||
defer mutex.Unlock()
|
|
||||||
running = false
|
|
||||||
}
|
|
||||||
|
|
||||||
// Vobc 消息发送消息
|
|
||||||
func sendVobcMsg(buf []byte) error {
|
|
||||||
defer func() {
|
|
||||||
if r := recover(); r != nil {
|
|
||||||
slog.Error("发送列车速度信息失败", r)
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
addr := fmt.Sprintf("%v:%v", config.Config.Vobc.Ip, config.Config.Vobc.RemotePort)
|
|
||||||
remoteAddr, _ := net.ResolveUDPAddr("udp", addr)
|
|
||||||
conn, err := net.DialUDP("udp", nil, remoteAddr)
|
|
||||||
if err != nil {
|
|
||||||
slog.Error("UDP通信失败", err)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
defer func(conn *net.UDPConn) {
|
|
||||||
err := conn.Close()
|
|
||||||
if err != nil {
|
|
||||||
slog.Error("Vobc UDP连接关闭失败", err)
|
|
||||||
}
|
|
||||||
}(conn)
|
|
||||||
_, err = conn.Write(buf)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// 将道岔转为动力学的消息
|
|
||||||
func encoderVobcTrainInfo(info *SendTrainInfo) []byte {
|
|
||||||
var data []byte
|
|
||||||
data = binary.BigEndian.AppendUint16(data, info.LifeSignal)
|
|
||||||
data = binary.BigEndian.AppendUint16(data, info.Speed)
|
|
||||||
if info.Upslope {
|
|
||||||
data = append(data, 1)
|
|
||||||
} else {
|
|
||||||
data = append(data, 0)
|
|
||||||
}
|
|
||||||
// 中间预留一位
|
|
||||||
data = append(data, 0)
|
|
||||||
data = append(data, info.Acceleration) // 加速度 100 = 1 m/s*s
|
|
||||||
data = append(data, info.Deceleration) // 减速度 100 = 1 m/s*s
|
|
||||||
data = binary.BigEndian.AppendUint32(data, info.TotalResistance) // 实际运行阻力 100 = 1KN
|
|
||||||
data = binary.BigEndian.AppendUint32(data, info.AirResistance) // 空气阻力 100 = 1KN
|
|
||||||
data = binary.BigEndian.AppendUint32(data, info.SlopeResistance) // 坡道阻力 100 = 1KN
|
|
||||||
data = binary.BigEndian.AppendUint32(data, info.CurveResistance) // 曲线阻力 100 = 1KN
|
|
||||||
data = binary.BigEndian.AppendUint16(data, info.Slope) // 坡度值 1= 1‰
|
|
||||||
return data
|
|
||||||
}
|
|
115
third_party/deprecated/vobc/udp_msg.go
vendored
115
third_party/deprecated/vobc/udp_msg.go
vendored
@ -1,115 +0,0 @@
|
|||||||
package vobc
|
|
||||||
|
|
||||||
import "encoding/binary"
|
|
||||||
|
|
||||||
// 接收到的列车信息
|
|
||||||
type ReceiveTrainInfo struct {
|
|
||||||
//【0 1】两个字节
|
|
||||||
// 生命信号 每个周期+1
|
|
||||||
LifeSignal uint16
|
|
||||||
//【2】 一个字节
|
|
||||||
// TC1激活状态 1=激活
|
|
||||||
Tc1Active bool
|
|
||||||
// TC2激活状态 1=激活
|
|
||||||
Tc2Active bool
|
|
||||||
// 列车方向向前 1=方向向前
|
|
||||||
DirectionForward bool
|
|
||||||
// 列车方向向后 1=方向向后
|
|
||||||
DirectionBackward bool
|
|
||||||
// 列车牵引状态 1=牵引
|
|
||||||
TractionStatus bool
|
|
||||||
// 列车制动状态 1=制动
|
|
||||||
BrakingStatus bool
|
|
||||||
// 列车紧急制动状态 1=紧急制动
|
|
||||||
EmergencyBrakingStatus bool
|
|
||||||
// 列车折返状态(AR) 1=折返
|
|
||||||
TurnbackStatus bool
|
|
||||||
//【3】 一个字节
|
|
||||||
// 跳跃状态 1=跳跃
|
|
||||||
JumpStatus bool
|
|
||||||
// ATO模式 1=ATO模式
|
|
||||||
ATO bool
|
|
||||||
// FAM模式 1=FAM模式
|
|
||||||
FAM bool
|
|
||||||
// CAM模式 1=CAM模式
|
|
||||||
CAM bool
|
|
||||||
// 牵引安全回路 1=牵引安全切除
|
|
||||||
TractionSafetyCircuit bool
|
|
||||||
// 停放制动状态 1=停放施加
|
|
||||||
ParkingBrakeStatus bool
|
|
||||||
// 保持制动状态 1=保持制动施加
|
|
||||||
MaintainBrakeStatus bool
|
|
||||||
//【4 5】 两个字节 列车牵引力 100=1KN
|
|
||||||
TractionForce uint16
|
|
||||||
//【6 7】 列车制动力 100=1KN
|
|
||||||
BrakeForce uint16
|
|
||||||
//【8 9】 列车载荷 100=1ton
|
|
||||||
TrainLoad uint16
|
|
||||||
// 【15】 一个字节
|
|
||||||
// 列车开左门指令 1=开门
|
|
||||||
LeftDoorOpenCommand bool
|
|
||||||
// 列车开右门指令 1=开门
|
|
||||||
RightDoorOpenCommand bool
|
|
||||||
// 列车关左门指令 1=关门
|
|
||||||
LeftDoorCloseCommand bool
|
|
||||||
// 列车关右门指令 1=关门
|
|
||||||
RightDoorCloseCommand bool
|
|
||||||
// 整列车门关好 1=门关好
|
|
||||||
AllDoorClose bool
|
|
||||||
}
|
|
||||||
|
|
||||||
// 解析VOBC列车信息
|
|
||||||
func (r *ReceiveTrainInfo) DecoderVobcTrainInfo(buf []byte) *ReceiveTrainInfo {
|
|
||||||
r.LifeSignal = binary.BigEndian.Uint16(buf[0:2])
|
|
||||||
b2 := buf[2]
|
|
||||||
r.Tc1Active = (b2 & (1 << 7)) != 0
|
|
||||||
r.Tc2Active = (b2 & (1 << 6)) != 0
|
|
||||||
r.DirectionForward = (b2 & (1 << 5)) != 0
|
|
||||||
r.DirectionBackward = (b2 & (1 << 4)) != 0
|
|
||||||
r.TractionStatus = (b2 & (1 << 3)) != 0
|
|
||||||
r.BrakingStatus = (b2 & (1 << 2)) != 0
|
|
||||||
r.EmergencyBrakingStatus = (b2 & (1 << 1)) != 0
|
|
||||||
r.TurnbackStatus = (b2 & 1) != 0
|
|
||||||
b3 := buf[3]
|
|
||||||
r.JumpStatus = (b3 & (1 << 7)) != 0
|
|
||||||
r.ATO = (b3 & (1 << 6)) != 0
|
|
||||||
r.FAM = (b3 & (1 << 5)) != 0
|
|
||||||
r.CAM = (b3 & (1 << 4)) != 0
|
|
||||||
r.TractionSafetyCircuit = (b3 & (1 << 3)) != 0
|
|
||||||
r.ParkingBrakeStatus = (b3 & (1 << 2)) != 0
|
|
||||||
r.MaintainBrakeStatus = (b3 & (1 << 1)) != 0
|
|
||||||
r.TractionForce = binary.BigEndian.Uint16(buf[4:6])
|
|
||||||
r.BrakeForce = binary.BigEndian.Uint16(buf[6:8])
|
|
||||||
r.TrainLoad = binary.BigEndian.Uint16(buf[8:10])
|
|
||||||
b4 := buf[15]
|
|
||||||
r.LeftDoorOpenCommand = (b4 & (1 << 7)) != 0
|
|
||||||
r.RightDoorOpenCommand = (b4 & (1 << 6)) != 0
|
|
||||||
r.LeftDoorCloseCommand = (b4 & (1 << 5)) != 0
|
|
||||||
r.RightDoorCloseCommand = (b4 & (1 << 4)) != 0
|
|
||||||
r.AllDoorClose = (b4 & (1 << 3)) != 0
|
|
||||||
return r
|
|
||||||
}
|
|
||||||
|
|
||||||
// 发送列车信息
|
|
||||||
type SendTrainInfo struct {
|
|
||||||
// 生命信号 每个周期+1
|
|
||||||
LifeSignal uint16
|
|
||||||
// 列车速度 10=1km/h
|
|
||||||
Speed uint16
|
|
||||||
// 上坡
|
|
||||||
Upslope bool
|
|
||||||
// 坡度值 1= 1‰
|
|
||||||
Slope uint16
|
|
||||||
// 加速度 100 = 1 m/s*s
|
|
||||||
Acceleration uint8
|
|
||||||
// 减速度 100 = 1 m/s*s
|
|
||||||
Deceleration uint8
|
|
||||||
// 实际运行阻力 100 = 1KN
|
|
||||||
TotalResistance uint32
|
|
||||||
// 空气阻力 100 = 1KN
|
|
||||||
AirResistance uint32
|
|
||||||
// 坡道阻力 100 = 1KN
|
|
||||||
SlopeResistance uint32
|
|
||||||
// 曲线阻力 100 = 1KN
|
|
||||||
CurveResistance uint32
|
|
||||||
}
|
|
8
third_party/dynamics/dynamics.go
vendored
8
third_party/dynamics/dynamics.go
vendored
@ -184,7 +184,8 @@ func (d *dynamics) Start(manager DynamicsMessageManager) error {
|
|||||||
// 初始化运行资源
|
// 初始化运行资源
|
||||||
err := d.initDynamicsRunRepository()
|
err := d.initDynamicsRunRepository()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic("启动动力学消息服务错误: 存在正在运行的任务")
|
d.Stop() // 发送错误后将信息销毁
|
||||||
|
panic(err)
|
||||||
}
|
}
|
||||||
ctx, cancle := context.WithCancel(context.Background())
|
ctx, cancle := context.WithCancel(context.Background())
|
||||||
go d.sendTurnoutStateTask(ctx)
|
go d.sendTurnoutStateTask(ctx)
|
||||||
@ -205,8 +206,7 @@ func (d *dynamics) initDynamics() {
|
|||||||
// 动力学运行所需数据
|
// 动力学运行所需数据
|
||||||
func (d *dynamics) initDynamicsRunRepository() error {
|
func (d *dynamics) initDynamicsRunRepository() error {
|
||||||
// 动力学接口调用
|
// 动力学接口调用
|
||||||
lineBaseInfo := d.manager.GetDynamicsRunRepository()
|
err := d.requestStartSimulation(d.manager.GetDynamicsRunRepository())
|
||||||
err := d.requestStartSimulation(lineBaseInfo)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@ -229,8 +229,8 @@ func (d *dynamics) Stop() {
|
|||||||
}
|
}
|
||||||
if d.turnoutTaskCancel != nil {
|
if d.turnoutTaskCancel != nil {
|
||||||
d.turnoutTaskCancel()
|
d.turnoutTaskCancel()
|
||||||
d.manager = nil
|
|
||||||
}
|
}
|
||||||
|
d.manager = nil
|
||||||
}
|
}
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
25
third_party/interlock/interlock.go
vendored
25
third_party/interlock/interlock.go
vendored
@ -15,8 +15,8 @@ import (
|
|||||||
|
|
||||||
// 联锁代理通信接口
|
// 联锁代理通信接口
|
||||||
type InterlockMessageManager interface {
|
type InterlockMessageManager interface {
|
||||||
CollectRelayInfo() *message.InterlockSendMsgPkg
|
CollectInterlockRelayInfo() []*message.InterlockSendMsgPkg
|
||||||
HandleDriverInfo(b []byte)
|
HandleInterlockDriverInfo(b []byte)
|
||||||
GetInterlockRunConfig() *config.InterlockConfig
|
GetInterlockRunConfig() *config.InterlockConfig
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -55,7 +55,7 @@ type interlockProxy struct {
|
|||||||
func (i *interlockProxy) handleDriverInfo(b []byte) {
|
func (i *interlockProxy) handleDriverInfo(b []byte) {
|
||||||
handler := i.manager
|
handler := i.manager
|
||||||
if handler != nil {
|
if handler != nil {
|
||||||
handler.HandleDriverInfo(b)
|
handler.HandleInterlockDriverInfo(b)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -78,10 +78,11 @@ func (i *interlockProxy) Start(manager InterlockMessageManager) {
|
|||||||
i.collectInfoTaskCancel = cancle
|
i.collectInfoTaskCancel = cancle
|
||||||
}
|
}
|
||||||
|
|
||||||
const (
|
// 采集电路状态发送间隔,单位ms
|
||||||
// 采集电路状态发送间隔,单位ms
|
const InterlockMessageSendInterval = 50
|
||||||
InterlockMessageSendInterval = 50
|
|
||||||
)
|
// 序列号
|
||||||
|
var serialNumber uint8
|
||||||
|
|
||||||
// 定时发送采集电路状态任务
|
// 定时发送采集电路状态任务
|
||||||
func (i *interlockProxy) collectInfoStateTask(ctx context.Context) {
|
func (i *interlockProxy) collectInfoStateTask(ctx context.Context) {
|
||||||
@ -97,8 +98,12 @@ func (i *interlockProxy) collectInfoStateTask(ctx context.Context) {
|
|||||||
return
|
return
|
||||||
default:
|
default:
|
||||||
}
|
}
|
||||||
collectInfoStates := i.manager.CollectRelayInfo()
|
collectInfoStates := i.manager.CollectInterlockRelayInfo()
|
||||||
i.sendCollectUdpClient.SendMsg(collectInfoStates)
|
for _, state := range collectInfoStates {
|
||||||
|
serialNumber++
|
||||||
|
state.Header.SerialNumber = serialNumber
|
||||||
|
i.sendCollectUdpClient.SendMsg(state)
|
||||||
|
}
|
||||||
time.Sleep(time.Millisecond * InterlockMessageSendInterval)
|
time.Sleep(time.Millisecond * InterlockMessageSendInterval)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -112,8 +117,8 @@ func (i *interlockProxy) Stop() {
|
|||||||
}
|
}
|
||||||
if i.collectInfoTaskCancel != nil {
|
if i.collectInfoTaskCancel != nil {
|
||||||
i.collectInfoTaskCancel()
|
i.collectInfoTaskCancel()
|
||||||
i.manager = nil
|
|
||||||
}
|
}
|
||||||
|
i.manager = nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (i *interlockProxy) SendCollectMessage(b []byte) {
|
func (i *interlockProxy) SendCollectMessage(b []byte) {
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||||
// versions:
|
// versions:
|
||||||
// protoc-gen-go v1.31.0
|
// protoc-gen-go v1.28.1
|
||||||
// protoc v4.23.1
|
// protoc v4.23.1
|
||||||
// source: ibpGraphics.proto
|
// source: ibpGraphics.proto
|
||||||
|
|
||||||
@ -773,10 +773,9 @@ var file_ibpGraphics_proto_rawDesc = []byte{
|
|||||||
0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63,
|
0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63,
|
||||||
0x44, 0x61, 0x74, 0x61, 0x2e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x6d, 0x62, 0x69,
|
0x44, 0x61, 0x74, 0x61, 0x2e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x6d, 0x62, 0x69,
|
||||||
0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x74, 0x79, 0x70, 0x65, 0x52, 0x10, 0x63, 0x6f, 0x6d, 0x62,
|
0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x74, 0x79, 0x70, 0x65, 0x52, 0x10, 0x63, 0x6f, 0x6d, 0x62,
|
||||||
0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x42, 0x21, 0x5a, 0x1f,
|
0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x42, 0x19, 0x5a, 0x17,
|
||||||
0x2e, 0x2f, 0x61, 0x74, 0x73, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x2f, 0x70, 0x72, 0x6f,
|
0x2e, 0x2f, 0x74, 0x73, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x67, 0x72, 0x61, 0x70,
|
||||||
0x74, 0x6f, 0x73, 0x2f, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x44, 0x61, 0x74, 0x61, 0x62,
|
0x68, 0x69, 0x63, 0x44, 0x61, 0x74, 0x61, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
|
||||||
0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||||
// versions:
|
// versions:
|
||||||
// protoc-gen-go v1.31.0
|
// protoc-gen-go v1.28.1
|
||||||
// protoc v4.23.1
|
// protoc v4.23.1
|
||||||
// source: picture.proto
|
// source: picture.proto
|
||||||
|
|
||||||
@ -84,10 +84,9 @@ var file_picture_proto_rawDesc = []byte{
|
|||||||
0x0a, 0x0d, 0x53, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x10,
|
0x0a, 0x0d, 0x53, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x10,
|
||||||
0x00, 0x12, 0x07, 0x0a, 0x03, 0x50, 0x73, 0x6c, 0x10, 0x01, 0x12, 0x16, 0x0a, 0x12, 0x52, 0x65,
|
0x00, 0x12, 0x07, 0x0a, 0x03, 0x50, 0x73, 0x6c, 0x10, 0x01, 0x12, 0x16, 0x0a, 0x12, 0x52, 0x65,
|
||||||
0x6c, 0x61, 0x79, 0x43, 0x61, 0x62, 0x69, 0x6e, 0x65, 0x74, 0x4c, 0x61, 0x79, 0x6f, 0x75, 0x74,
|
0x6c, 0x61, 0x79, 0x43, 0x61, 0x62, 0x69, 0x6e, 0x65, 0x74, 0x4c, 0x61, 0x79, 0x6f, 0x75, 0x74,
|
||||||
0x10, 0x02, 0x12, 0x07, 0x0a, 0x03, 0x49, 0x42, 0x50, 0x10, 0x03, 0x42, 0x21, 0x5a, 0x1f, 0x2e,
|
0x10, 0x02, 0x12, 0x07, 0x0a, 0x03, 0x49, 0x42, 0x50, 0x10, 0x03, 0x42, 0x19, 0x5a, 0x17, 0x2e,
|
||||||
0x2f, 0x61, 0x74, 0x73, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x2f, 0x70, 0x72, 0x6f, 0x74,
|
0x2f, 0x74, 0x73, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x67, 0x72, 0x61, 0x70, 0x68,
|
||||||
0x6f, 0x73, 0x2f, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x44, 0x61, 0x74, 0x61, 0x62, 0x06,
|
0x69, 0x63, 0x44, 0x61, 0x74, 0x61, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
|
||||||
0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||||
// versions:
|
// versions:
|
||||||
// protoc-gen-go v1.31.0
|
// protoc-gen-go v1.28.1
|
||||||
// protoc v4.23.1
|
// protoc v4.23.1
|
||||||
// source: pslGraphics.proto
|
// source: pslGraphics.proto
|
||||||
|
|
||||||
@ -499,9 +499,9 @@ var file_pslGraphics_proto_rawDesc = []byte{
|
|||||||
0x0a, 0x0f, 0x50, 0x73, 0x6c, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6c, 0x6f,
|
0x0a, 0x0f, 0x50, 0x73, 0x6c, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6c, 0x6f,
|
||||||
0x72, 0x12, 0x07, 0x0a, 0x03, 0x72, 0x65, 0x64, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x67, 0x72,
|
0x72, 0x12, 0x07, 0x0a, 0x03, 0x72, 0x65, 0x64, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x67, 0x72,
|
||||||
0x65, 0x65, 0x6e, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x62, 0x6c, 0x75, 0x65, 0x10, 0x02, 0x42,
|
0x65, 0x65, 0x6e, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x62, 0x6c, 0x75, 0x65, 0x10, 0x02, 0x42,
|
||||||
0x21, 0x5a, 0x1f, 0x2e, 0x2f, 0x61, 0x74, 0x73, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x2f,
|
0x19, 0x5a, 0x17, 0x2e, 0x2f, 0x74, 0x73, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x67,
|
||||||
0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x44, 0x61,
|
0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x44, 0x61, 0x74, 0x61, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74,
|
||||||
0x74, 0x61, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
|
0x6f, 0x33,
|
||||||
}
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||||
// versions:
|
// versions:
|
||||||
// protoc-gen-go v1.31.0
|
// protoc-gen-go v1.28.1
|
||||||
// protoc v4.23.1
|
// protoc v4.23.1
|
||||||
// source: relayCabinetLayoutGraphics.proto
|
// source: relayCabinetLayoutGraphics.proto
|
||||||
|
|
||||||
@ -87,6 +87,52 @@ func (Relay_ModelType) EnumDescriptor() ([]byte, []int) {
|
|||||||
return file_relayCabinetLayoutGraphics_proto_rawDescGZIP(), []int{2, 0}
|
return file_relayCabinetLayoutGraphics_proto_rawDescGZIP(), []int{2, 0}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type CjDataItem_PostionType int32
|
||||||
|
|
||||||
|
const (
|
||||||
|
CjDataItem_Q CjDataItem_PostionType = 0
|
||||||
|
CjDataItem_H CjDataItem_PostionType = 1
|
||||||
|
)
|
||||||
|
|
||||||
|
// Enum value maps for CjDataItem_PostionType.
|
||||||
|
var (
|
||||||
|
CjDataItem_PostionType_name = map[int32]string{
|
||||||
|
0: "Q",
|
||||||
|
1: "H",
|
||||||
|
}
|
||||||
|
CjDataItem_PostionType_value = map[string]int32{
|
||||||
|
"Q": 0,
|
||||||
|
"H": 1,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
func (x CjDataItem_PostionType) Enum() *CjDataItem_PostionType {
|
||||||
|
p := new(CjDataItem_PostionType)
|
||||||
|
*p = x
|
||||||
|
return p
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x CjDataItem_PostionType) String() string {
|
||||||
|
return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
|
||||||
|
}
|
||||||
|
|
||||||
|
func (CjDataItem_PostionType) Descriptor() protoreflect.EnumDescriptor {
|
||||||
|
return file_relayCabinetLayoutGraphics_proto_enumTypes[1].Descriptor()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (CjDataItem_PostionType) Type() protoreflect.EnumType {
|
||||||
|
return &file_relayCabinetLayoutGraphics_proto_enumTypes[1]
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x CjDataItem_PostionType) Number() protoreflect.EnumNumber {
|
||||||
|
return protoreflect.EnumNumber(x)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Deprecated: Use CjDataItem_PostionType.Descriptor instead.
|
||||||
|
func (CjDataItem_PostionType) EnumDescriptor() ([]byte, []int) {
|
||||||
|
return file_relayCabinetLayoutGraphics_proto_rawDescGZIP(), []int{11, 0}
|
||||||
|
}
|
||||||
|
|
||||||
type RelayCabinetGraphicStorage struct {
|
type RelayCabinetGraphicStorage struct {
|
||||||
state protoimpl.MessageState
|
state protoimpl.MessageState
|
||||||
sizeCache protoimpl.SizeCache
|
sizeCache protoimpl.SizeCache
|
||||||
@ -101,6 +147,8 @@ type RelayCabinetGraphicStorage struct {
|
|||||||
PhaseFailureProtectors []*PhaseFailureProtector `protobuf:"bytes,7,rep,name=phaseFailureProtectors,proto3" json:"phaseFailureProtectors,omitempty"`
|
PhaseFailureProtectors []*PhaseFailureProtector `protobuf:"bytes,7,rep,name=phaseFailureProtectors,proto3" json:"phaseFailureProtectors,omitempty"`
|
||||||
CombinationtypeList []*Combinationtype `protobuf:"bytes,8,rep,name=combinationtypeList,proto3" json:"combinationtypeList,omitempty"`
|
CombinationtypeList []*Combinationtype `protobuf:"bytes,8,rep,name=combinationtypeList,proto3" json:"combinationtypeList,omitempty"`
|
||||||
SignalFaultAlarms []*SignalFaultAlarm `protobuf:"bytes,9,rep,name=signalFaultAlarms,proto3" json:"signalFaultAlarms,omitempty"`
|
SignalFaultAlarms []*SignalFaultAlarm `protobuf:"bytes,9,rep,name=signalFaultAlarms,proto3" json:"signalFaultAlarms,omitempty"`
|
||||||
|
CiCjList *CiCj `protobuf:"bytes,10,opt,name=ciCjList,proto3" json:"ciCjList,omitempty"` //采集列表
|
||||||
|
CiQdList *CiQd `protobuf:"bytes,11,opt,name=ciQdList,proto3" json:"ciQdList,omitempty"` //驱动列表
|
||||||
}
|
}
|
||||||
|
|
||||||
func (x *RelayCabinetGraphicStorage) Reset() {
|
func (x *RelayCabinetGraphicStorage) Reset() {
|
||||||
@ -191,6 +239,20 @@ func (x *RelayCabinetGraphicStorage) GetSignalFaultAlarms() []*SignalFaultAlarm
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (x *RelayCabinetGraphicStorage) GetCiCjList() *CiCj {
|
||||||
|
if x != nil {
|
||||||
|
return x.CiCjList
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *RelayCabinetGraphicStorage) GetCiQdList() *CiQd {
|
||||||
|
if x != nil {
|
||||||
|
return x.CiQdList
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
type RelayCabinet struct {
|
type RelayCabinet struct {
|
||||||
state protoimpl.MessageState
|
state protoimpl.MessageState
|
||||||
sizeCache protoimpl.SizeCache
|
sizeCache protoimpl.SizeCache
|
||||||
@ -607,6 +669,377 @@ func (x *UniqueIdType) GetBelongsConcentrationStation() string {
|
|||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 采集
|
||||||
|
type CiCj struct {
|
||||||
|
state protoimpl.MessageState
|
||||||
|
sizeCache protoimpl.SizeCache
|
||||||
|
unknownFields protoimpl.UnknownFields
|
||||||
|
|
||||||
|
DsCount int32 `protobuf:"varint,1,opt,name=dsCount,proto3" json:"dsCount,omitempty"` //数据集位数——对应着excel表行数
|
||||||
|
CjList []*CjDataSet `protobuf:"bytes,2,rep,name=cjList,proto3" json:"cjList,omitempty"` //采集列表(二维数据,数组长度对应着excel表列数--数据集个数)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *CiCj) Reset() {
|
||||||
|
*x = CiCj{}
|
||||||
|
if protoimpl.UnsafeEnabled {
|
||||||
|
mi := &file_relayCabinetLayoutGraphics_proto_msgTypes[8]
|
||||||
|
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||||
|
ms.StoreMessageInfo(mi)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *CiCj) String() string {
|
||||||
|
return protoimpl.X.MessageStringOf(x)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (*CiCj) ProtoMessage() {}
|
||||||
|
|
||||||
|
func (x *CiCj) ProtoReflect() protoreflect.Message {
|
||||||
|
mi := &file_relayCabinetLayoutGraphics_proto_msgTypes[8]
|
||||||
|
if protoimpl.UnsafeEnabled && x != nil {
|
||||||
|
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||||
|
if ms.LoadMessageInfo() == nil {
|
||||||
|
ms.StoreMessageInfo(mi)
|
||||||
|
}
|
||||||
|
return ms
|
||||||
|
}
|
||||||
|
return mi.MessageOf(x)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Deprecated: Use CiCj.ProtoReflect.Descriptor instead.
|
||||||
|
func (*CiCj) Descriptor() ([]byte, []int) {
|
||||||
|
return file_relayCabinetLayoutGraphics_proto_rawDescGZIP(), []int{8}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *CiCj) GetDsCount() int32 {
|
||||||
|
if x != nil {
|
||||||
|
return x.DsCount
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *CiCj) GetCjList() []*CjDataSet {
|
||||||
|
if x != nil {
|
||||||
|
return x.CjList
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
type CjDataSet struct {
|
||||||
|
state protoimpl.MessageState
|
||||||
|
sizeCache protoimpl.SizeCache
|
||||||
|
unknownFields protoimpl.UnknownFields
|
||||||
|
|
||||||
|
Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` //对应着excel中的列名,如'D1'
|
||||||
|
BitList []*CjData `protobuf:"bytes,2,rep,name=bitList,proto3" json:"bitList,omitempty"` //对应着excel中的一列的数据
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *CjDataSet) Reset() {
|
||||||
|
*x = CjDataSet{}
|
||||||
|
if protoimpl.UnsafeEnabled {
|
||||||
|
mi := &file_relayCabinetLayoutGraphics_proto_msgTypes[9]
|
||||||
|
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||||
|
ms.StoreMessageInfo(mi)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *CjDataSet) String() string {
|
||||||
|
return protoimpl.X.MessageStringOf(x)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (*CjDataSet) ProtoMessage() {}
|
||||||
|
|
||||||
|
func (x *CjDataSet) ProtoReflect() protoreflect.Message {
|
||||||
|
mi := &file_relayCabinetLayoutGraphics_proto_msgTypes[9]
|
||||||
|
if protoimpl.UnsafeEnabled && x != nil {
|
||||||
|
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||||
|
if ms.LoadMessageInfo() == nil {
|
||||||
|
ms.StoreMessageInfo(mi)
|
||||||
|
}
|
||||||
|
return ms
|
||||||
|
}
|
||||||
|
return mi.MessageOf(x)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Deprecated: Use CjDataSet.ProtoReflect.Descriptor instead.
|
||||||
|
func (*CjDataSet) Descriptor() ([]byte, []int) {
|
||||||
|
return file_relayCabinetLayoutGraphics_proto_rawDescGZIP(), []int{9}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *CjDataSet) GetName() string {
|
||||||
|
if x != nil {
|
||||||
|
return x.Name
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *CjDataSet) GetBitList() []*CjData {
|
||||||
|
if x != nil {
|
||||||
|
return x.BitList
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
type CjData struct {
|
||||||
|
state protoimpl.MessageState
|
||||||
|
sizeCache protoimpl.SizeCache
|
||||||
|
unknownFields protoimpl.UnknownFields
|
||||||
|
|
||||||
|
RefRelays []*CjDataItem `protobuf:"bytes,1,rep,name=refRelays,proto3" json:"refRelays,omitempty"` //采集的继电器
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *CjData) Reset() {
|
||||||
|
*x = CjData{}
|
||||||
|
if protoimpl.UnsafeEnabled {
|
||||||
|
mi := &file_relayCabinetLayoutGraphics_proto_msgTypes[10]
|
||||||
|
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||||
|
ms.StoreMessageInfo(mi)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *CjData) String() string {
|
||||||
|
return protoimpl.X.MessageStringOf(x)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (*CjData) ProtoMessage() {}
|
||||||
|
|
||||||
|
func (x *CjData) ProtoReflect() protoreflect.Message {
|
||||||
|
mi := &file_relayCabinetLayoutGraphics_proto_msgTypes[10]
|
||||||
|
if protoimpl.UnsafeEnabled && x != nil {
|
||||||
|
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||||
|
if ms.LoadMessageInfo() == nil {
|
||||||
|
ms.StoreMessageInfo(mi)
|
||||||
|
}
|
||||||
|
return ms
|
||||||
|
}
|
||||||
|
return mi.MessageOf(x)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Deprecated: Use CjData.ProtoReflect.Descriptor instead.
|
||||||
|
func (*CjData) Descriptor() ([]byte, []int) {
|
||||||
|
return file_relayCabinetLayoutGraphics_proto_rawDescGZIP(), []int{10}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *CjData) GetRefRelays() []*CjDataItem {
|
||||||
|
if x != nil {
|
||||||
|
return x.RefRelays
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
type CjDataItem struct {
|
||||||
|
state protoimpl.MessageState
|
||||||
|
sizeCache protoimpl.SizeCache
|
||||||
|
unknownFields protoimpl.UnknownFields
|
||||||
|
|
||||||
|
RelayId string `protobuf:"bytes,1,opt,name=relayId,proto3" json:"relayId,omitempty"` //采集对应的继电器Id
|
||||||
|
Position CjDataItem_PostionType `protobuf:"varint,2,opt,name=position,proto3,enum=relayCabinetGraphicData.CjDataItem_PostionType" json:"position,omitempty"` //继电器的位置,QH对应着吸合
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *CjDataItem) Reset() {
|
||||||
|
*x = CjDataItem{}
|
||||||
|
if protoimpl.UnsafeEnabled {
|
||||||
|
mi := &file_relayCabinetLayoutGraphics_proto_msgTypes[11]
|
||||||
|
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||||
|
ms.StoreMessageInfo(mi)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *CjDataItem) String() string {
|
||||||
|
return protoimpl.X.MessageStringOf(x)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (*CjDataItem) ProtoMessage() {}
|
||||||
|
|
||||||
|
func (x *CjDataItem) ProtoReflect() protoreflect.Message {
|
||||||
|
mi := &file_relayCabinetLayoutGraphics_proto_msgTypes[11]
|
||||||
|
if protoimpl.UnsafeEnabled && x != nil {
|
||||||
|
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||||
|
if ms.LoadMessageInfo() == nil {
|
||||||
|
ms.StoreMessageInfo(mi)
|
||||||
|
}
|
||||||
|
return ms
|
||||||
|
}
|
||||||
|
return mi.MessageOf(x)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Deprecated: Use CjDataItem.ProtoReflect.Descriptor instead.
|
||||||
|
func (*CjDataItem) Descriptor() ([]byte, []int) {
|
||||||
|
return file_relayCabinetLayoutGraphics_proto_rawDescGZIP(), []int{11}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *CjDataItem) GetRelayId() string {
|
||||||
|
if x != nil {
|
||||||
|
return x.RelayId
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *CjDataItem) GetPosition() CjDataItem_PostionType {
|
||||||
|
if x != nil {
|
||||||
|
return x.Position
|
||||||
|
}
|
||||||
|
return CjDataItem_Q
|
||||||
|
}
|
||||||
|
|
||||||
|
// 驱动
|
||||||
|
type CiQd struct {
|
||||||
|
state protoimpl.MessageState
|
||||||
|
sizeCache protoimpl.SizeCache
|
||||||
|
unknownFields protoimpl.UnknownFields
|
||||||
|
|
||||||
|
DsCount int32 `protobuf:"varint,1,opt,name=dsCount,proto3" json:"dsCount,omitempty"` //数据集位数——对应着excel表行数
|
||||||
|
QdList []*QdDataSet `protobuf:"bytes,2,rep,name=qdList,proto3" json:"qdList,omitempty"` //驱动列表(二维数据,数组长度对应着excel表列数--数据集个数)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *CiQd) Reset() {
|
||||||
|
*x = CiQd{}
|
||||||
|
if protoimpl.UnsafeEnabled {
|
||||||
|
mi := &file_relayCabinetLayoutGraphics_proto_msgTypes[12]
|
||||||
|
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||||
|
ms.StoreMessageInfo(mi)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *CiQd) String() string {
|
||||||
|
return protoimpl.X.MessageStringOf(x)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (*CiQd) ProtoMessage() {}
|
||||||
|
|
||||||
|
func (x *CiQd) ProtoReflect() protoreflect.Message {
|
||||||
|
mi := &file_relayCabinetLayoutGraphics_proto_msgTypes[12]
|
||||||
|
if protoimpl.UnsafeEnabled && x != nil {
|
||||||
|
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||||
|
if ms.LoadMessageInfo() == nil {
|
||||||
|
ms.StoreMessageInfo(mi)
|
||||||
|
}
|
||||||
|
return ms
|
||||||
|
}
|
||||||
|
return mi.MessageOf(x)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Deprecated: Use CiQd.ProtoReflect.Descriptor instead.
|
||||||
|
func (*CiQd) Descriptor() ([]byte, []int) {
|
||||||
|
return file_relayCabinetLayoutGraphics_proto_rawDescGZIP(), []int{12}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *CiQd) GetDsCount() int32 {
|
||||||
|
if x != nil {
|
||||||
|
return x.DsCount
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *CiQd) GetQdList() []*QdDataSet {
|
||||||
|
if x != nil {
|
||||||
|
return x.QdList
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
type QdDataSet struct {
|
||||||
|
state protoimpl.MessageState
|
||||||
|
sizeCache protoimpl.SizeCache
|
||||||
|
unknownFields protoimpl.UnknownFields
|
||||||
|
|
||||||
|
Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` //对应着excel中的列名,如'D1'
|
||||||
|
BitList []*QdData `protobuf:"bytes,2,rep,name=bitList,proto3" json:"bitList,omitempty"` //对应着excel中的一列的数据
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *QdDataSet) Reset() {
|
||||||
|
*x = QdDataSet{}
|
||||||
|
if protoimpl.UnsafeEnabled {
|
||||||
|
mi := &file_relayCabinetLayoutGraphics_proto_msgTypes[13]
|
||||||
|
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||||
|
ms.StoreMessageInfo(mi)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *QdDataSet) String() string {
|
||||||
|
return protoimpl.X.MessageStringOf(x)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (*QdDataSet) ProtoMessage() {}
|
||||||
|
|
||||||
|
func (x *QdDataSet) ProtoReflect() protoreflect.Message {
|
||||||
|
mi := &file_relayCabinetLayoutGraphics_proto_msgTypes[13]
|
||||||
|
if protoimpl.UnsafeEnabled && x != nil {
|
||||||
|
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||||
|
if ms.LoadMessageInfo() == nil {
|
||||||
|
ms.StoreMessageInfo(mi)
|
||||||
|
}
|
||||||
|
return ms
|
||||||
|
}
|
||||||
|
return mi.MessageOf(x)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Deprecated: Use QdDataSet.ProtoReflect.Descriptor instead.
|
||||||
|
func (*QdDataSet) Descriptor() ([]byte, []int) {
|
||||||
|
return file_relayCabinetLayoutGraphics_proto_rawDescGZIP(), []int{13}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *QdDataSet) GetName() string {
|
||||||
|
if x != nil {
|
||||||
|
return x.Name
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *QdDataSet) GetBitList() []*QdData {
|
||||||
|
if x != nil {
|
||||||
|
return x.BitList
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
type QdData struct {
|
||||||
|
state protoimpl.MessageState
|
||||||
|
sizeCache protoimpl.SizeCache
|
||||||
|
unknownFields protoimpl.UnknownFields
|
||||||
|
|
||||||
|
RefRelays []string `protobuf:"bytes,1,rep,name=refRelays,proto3" json:"refRelays,omitempty"` //驱动的继电器Id
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *QdData) Reset() {
|
||||||
|
*x = QdData{}
|
||||||
|
if protoimpl.UnsafeEnabled {
|
||||||
|
mi := &file_relayCabinetLayoutGraphics_proto_msgTypes[14]
|
||||||
|
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||||
|
ms.StoreMessageInfo(mi)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *QdData) String() string {
|
||||||
|
return protoimpl.X.MessageStringOf(x)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (*QdData) ProtoMessage() {}
|
||||||
|
|
||||||
|
func (x *QdData) ProtoReflect() protoreflect.Message {
|
||||||
|
mi := &file_relayCabinetLayoutGraphics_proto_msgTypes[14]
|
||||||
|
if protoimpl.UnsafeEnabled && x != nil {
|
||||||
|
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||||
|
if ms.LoadMessageInfo() == nil {
|
||||||
|
ms.StoreMessageInfo(mi)
|
||||||
|
}
|
||||||
|
return ms
|
||||||
|
}
|
||||||
|
return mi.MessageOf(x)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Deprecated: Use QdData.ProtoReflect.Descriptor instead.
|
||||||
|
func (*QdData) Descriptor() ([]byte, []int) {
|
||||||
|
return file_relayCabinetLayoutGraphics_proto_rawDescGZIP(), []int{14}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *QdData) GetRefRelays() []string {
|
||||||
|
if x != nil {
|
||||||
|
return x.RefRelays
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
var File_relayCabinetLayoutGraphics_proto protoreflect.FileDescriptor
|
var File_relayCabinetLayoutGraphics_proto protoreflect.FileDescriptor
|
||||||
|
|
||||||
var file_relayCabinetLayoutGraphics_proto_rawDesc = []byte{
|
var file_relayCabinetLayoutGraphics_proto_rawDesc = []byte{
|
||||||
@ -615,7 +1048,7 @@ var file_relayCabinetLayoutGraphics_proto_rawDesc = []byte{
|
|||||||
0x74, 0x6f, 0x12, 0x17, 0x72, 0x65, 0x6c, 0x61, 0x79, 0x43, 0x61, 0x62, 0x69, 0x6e, 0x65, 0x74,
|
0x74, 0x6f, 0x12, 0x17, 0x72, 0x65, 0x6c, 0x61, 0x79, 0x43, 0x61, 0x62, 0x69, 0x6e, 0x65, 0x74,
|
||||||
0x47, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x44, 0x61, 0x74, 0x61, 0x1a, 0x1b, 0x73, 0x74, 0x61,
|
0x47, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x44, 0x61, 0x74, 0x61, 0x1a, 0x1b, 0x73, 0x74, 0x61,
|
||||||
0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x47, 0x72, 0x61, 0x70, 0x68, 0x69,
|
0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x47, 0x72, 0x61, 0x70, 0x68, 0x69,
|
||||||
0x63, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x9c, 0x05, 0x0a, 0x1a, 0x52, 0x65, 0x6c,
|
0x63, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x92, 0x06, 0x0a, 0x1a, 0x52, 0x65, 0x6c,
|
||||||
0x61, 0x79, 0x43, 0x61, 0x62, 0x69, 0x6e, 0x65, 0x74, 0x47, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63,
|
0x61, 0x79, 0x43, 0x61, 0x62, 0x69, 0x6e, 0x65, 0x74, 0x47, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63,
|
||||||
0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x12, 0x2b, 0x0a, 0x06, 0x63, 0x61, 0x6e, 0x76, 0x61,
|
0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x12, 0x2b, 0x0a, 0x06, 0x63, 0x61, 0x6e, 0x76, 0x61,
|
||||||
0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69,
|
0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69,
|
||||||
@ -657,70 +1090,116 @@ var file_relayCabinetLayoutGraphics_proto_rawDesc = []byte{
|
|||||||
0x79, 0x43, 0x61, 0x62, 0x69, 0x6e, 0x65, 0x74, 0x47, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x44,
|
0x79, 0x43, 0x61, 0x62, 0x69, 0x6e, 0x65, 0x74, 0x47, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x44,
|
||||||
0x61, 0x74, 0x61, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x46, 0x61, 0x75, 0x6c, 0x74, 0x41,
|
0x61, 0x74, 0x61, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x46, 0x61, 0x75, 0x6c, 0x74, 0x41,
|
||||||
0x6c, 0x61, 0x72, 0x6d, 0x52, 0x11, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x46, 0x61, 0x75, 0x6c,
|
0x6c, 0x61, 0x72, 0x6d, 0x52, 0x11, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x46, 0x61, 0x75, 0x6c,
|
||||||
0x74, 0x41, 0x6c, 0x61, 0x72, 0x6d, 0x73, 0x22, 0x53, 0x0a, 0x0c, 0x52, 0x65, 0x6c, 0x61, 0x79,
|
0x74, 0x41, 0x6c, 0x61, 0x72, 0x6d, 0x73, 0x12, 0x39, 0x0a, 0x08, 0x63, 0x69, 0x43, 0x6a, 0x4c,
|
||||||
0x43, 0x61, 0x62, 0x69, 0x6e, 0x65, 0x74, 0x12, 0x2f, 0x0a, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f,
|
0x69, 0x73, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x72, 0x65, 0x6c, 0x61,
|
||||||
0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69,
|
0x79, 0x43, 0x61, 0x62, 0x69, 0x6e, 0x65, 0x74, 0x47, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x44,
|
||||||
0x63, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f,
|
0x61, 0x74, 0x61, 0x2e, 0x43, 0x69, 0x43, 0x6a, 0x52, 0x08, 0x63, 0x69, 0x43, 0x6a, 0x4c, 0x69,
|
||||||
0x52, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65,
|
0x73, 0x74, 0x12, 0x39, 0x0a, 0x08, 0x63, 0x69, 0x51, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x18, 0x0b,
|
||||||
0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x22, 0xac, 0x02, 0x0a,
|
0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x72, 0x65, 0x6c, 0x61, 0x79, 0x43, 0x61, 0x62, 0x69,
|
||||||
0x05, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x12, 0x2f, 0x0a, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e,
|
0x6e, 0x65, 0x74, 0x47, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x43,
|
||||||
0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63,
|
0x69, 0x51, 0x64, 0x52, 0x08, 0x63, 0x69, 0x51, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x53, 0x0a,
|
||||||
0x44, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52,
|
0x0c, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x43, 0x61, 0x62, 0x69, 0x6e, 0x65, 0x74, 0x12, 0x2f, 0x0a,
|
||||||
0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18,
|
|
||||||
0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x44, 0x0a, 0x08, 0x6e,
|
|
||||||
0x65, 0x77, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x28, 0x2e,
|
|
||||||
0x72, 0x65, 0x6c, 0x61, 0x79, 0x43, 0x61, 0x62, 0x69, 0x6e, 0x65, 0x74, 0x47, 0x72, 0x61, 0x70,
|
|
||||||
0x68, 0x69, 0x63, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x2e, 0x4d, 0x6f,
|
|
||||||
0x64, 0x65, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x52, 0x08, 0x6e, 0x65, 0x77, 0x4d, 0x6f, 0x64, 0x65,
|
|
||||||
0x6c, 0x22, 0x97, 0x01, 0x0a, 0x09, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x12,
|
|
||||||
0x0b, 0x0a, 0x07, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09,
|
|
||||||
0x4a, 0x50, 0x58, 0x43, 0x5f, 0x31, 0x30, 0x30, 0x30, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x4a,
|
|
||||||
0x50, 0x58, 0x43, 0x5f, 0x31, 0x37, 0x30, 0x30, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x4a, 0x57,
|
|
||||||
0x4a, 0x58, 0x43, 0x5f, 0x34, 0x38, 0x30, 0x10, 0x03, 0x12, 0x11, 0x0a, 0x0d, 0x4a, 0x57, 0x4a,
|
|
||||||
0x58, 0x43, 0x5f, 0x48, 0x31, 0x32, 0x35, 0x5f, 0x38, 0x30, 0x10, 0x04, 0x12, 0x0d, 0x0a, 0x09,
|
|
||||||
0x4a, 0x57, 0x58, 0x43, 0x5f, 0x31, 0x37, 0x30, 0x30, 0x10, 0x05, 0x12, 0x0d, 0x0a, 0x09, 0x4a,
|
|
||||||
0x57, 0x58, 0x43, 0x5f, 0x48, 0x33, 0x34, 0x30, 0x10, 0x06, 0x12, 0x11, 0x0a, 0x0d, 0x4a, 0x59,
|
|
||||||
0x4a, 0x58, 0x43, 0x5f, 0x31, 0x36, 0x30, 0x5f, 0x32, 0x36, 0x30, 0x10, 0x07, 0x12, 0x0c, 0x0a,
|
|
||||||
0x08, 0x4a, 0x5a, 0x58, 0x43, 0x5f, 0x48, 0x31, 0x38, 0x10, 0x08, 0x22, 0x5c, 0x0a, 0x15, 0x50,
|
|
||||||
0x68, 0x61, 0x73, 0x65, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x65,
|
|
||||||
0x63, 0x74, 0x6f, 0x72, 0x12, 0x2f, 0x0a, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x18, 0x01,
|
|
||||||
0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x44, 0x61,
|
|
||||||
0x74, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x06, 0x63,
|
|
||||||
0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20,
|
|
||||||
0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x22, 0x57, 0x0a, 0x10, 0x53, 0x69, 0x67,
|
|
||||||
0x6e, 0x61, 0x6c, 0x46, 0x61, 0x75, 0x6c, 0x74, 0x41, 0x6c, 0x61, 0x72, 0x6d, 0x12, 0x2f, 0x0a,
|
|
||||||
0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e,
|
0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e,
|
||||||
0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d,
|
0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d,
|
||||||
0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x12, 0x12,
|
0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x12, 0x12,
|
||||||
0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f,
|
0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f,
|
||||||
0x64, 0x65, 0x22, 0xc1, 0x01, 0x0a, 0x11, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x6c,
|
0x64, 0x65, 0x22, 0xac, 0x02, 0x0a, 0x05, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x12, 0x2f, 0x0a, 0x06,
|
||||||
0x61, 0x74, 0x65, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65,
|
0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67,
|
||||||
0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x54, 0x0a, 0x10,
|
0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f,
|
||||||
0x63, 0x6f, 0x6d, 0x62, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x74, 0x79, 0x70, 0x65, 0x73,
|
0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x12, 0x12, 0x0a,
|
||||||
0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x72, 0x65, 0x6c, 0x61, 0x79, 0x43, 0x61,
|
0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64,
|
||||||
|
0x65, 0x12, 0x44, 0x0a, 0x08, 0x6e, 0x65, 0x77, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x18, 0x04, 0x20,
|
||||||
|
0x01, 0x28, 0x0e, 0x32, 0x28, 0x2e, 0x72, 0x65, 0x6c, 0x61, 0x79, 0x43, 0x61, 0x62, 0x69, 0x6e,
|
||||||
|
0x65, 0x74, 0x47, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65,
|
||||||
|
0x6c, 0x61, 0x79, 0x2e, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x52, 0x08, 0x6e,
|
||||||
|
0x65, 0x77, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x22, 0x97, 0x01, 0x0a, 0x09, 0x4d, 0x6f, 0x64, 0x65,
|
||||||
|
0x6c, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e,
|
||||||
|
0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x4a, 0x50, 0x58, 0x43, 0x5f, 0x31, 0x30, 0x30, 0x30, 0x10,
|
||||||
|
0x01, 0x12, 0x0d, 0x0a, 0x09, 0x4a, 0x50, 0x58, 0x43, 0x5f, 0x31, 0x37, 0x30, 0x30, 0x10, 0x02,
|
||||||
|
0x12, 0x0d, 0x0a, 0x09, 0x4a, 0x57, 0x4a, 0x58, 0x43, 0x5f, 0x34, 0x38, 0x30, 0x10, 0x03, 0x12,
|
||||||
|
0x11, 0x0a, 0x0d, 0x4a, 0x57, 0x4a, 0x58, 0x43, 0x5f, 0x48, 0x31, 0x32, 0x35, 0x5f, 0x38, 0x30,
|
||||||
|
0x10, 0x04, 0x12, 0x0d, 0x0a, 0x09, 0x4a, 0x57, 0x58, 0x43, 0x5f, 0x31, 0x37, 0x30, 0x30, 0x10,
|
||||||
|
0x05, 0x12, 0x0d, 0x0a, 0x09, 0x4a, 0x57, 0x58, 0x43, 0x5f, 0x48, 0x33, 0x34, 0x30, 0x10, 0x06,
|
||||||
|
0x12, 0x11, 0x0a, 0x0d, 0x4a, 0x59, 0x4a, 0x58, 0x43, 0x5f, 0x31, 0x36, 0x30, 0x5f, 0x32, 0x36,
|
||||||
|
0x30, 0x10, 0x07, 0x12, 0x0c, 0x0a, 0x08, 0x4a, 0x5a, 0x58, 0x43, 0x5f, 0x48, 0x31, 0x38, 0x10,
|
||||||
|
0x08, 0x22, 0x5c, 0x0a, 0x15, 0x50, 0x68, 0x61, 0x73, 0x65, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72,
|
||||||
|
0x65, 0x50, 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x2f, 0x0a, 0x06, 0x63, 0x6f,
|
||||||
|
0x6d, 0x6d, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x72, 0x61,
|
||||||
|
0x70, 0x68, 0x69, 0x63, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x49,
|
||||||
|
0x6e, 0x66, 0x6f, 0x52, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x63,
|
||||||
|
0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x22,
|
||||||
|
0x57, 0x0a, 0x10, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x46, 0x61, 0x75, 0x6c, 0x74, 0x41, 0x6c,
|
||||||
|
0x61, 0x72, 0x6d, 0x12, 0x2f, 0x0a, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x18, 0x01, 0x20,
|
||||||
|
0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x44, 0x61, 0x74,
|
||||||
|
0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x06, 0x63, 0x6f,
|
||||||
|
0x6d, 0x6d, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01,
|
||||||
|
0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x22, 0xc1, 0x01, 0x0a, 0x11, 0x44, 0x65, 0x76,
|
||||||
|
0x69, 0x63, 0x65, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x12, 0x12,
|
||||||
|
0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f,
|
||||||
|
0x64, 0x65, 0x12, 0x54, 0x0a, 0x10, 0x63, 0x6f, 0x6d, 0x62, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f,
|
||||||
|
0x6e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x72,
|
||||||
|
0x65, 0x6c, 0x61, 0x79, 0x43, 0x61, 0x62, 0x69, 0x6e, 0x65, 0x74, 0x47, 0x72, 0x61, 0x70, 0x68,
|
||||||
|
0x69, 0x63, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x62, 0x69, 0x6e, 0x61, 0x74, 0x69,
|
||||||
|
0x6f, 0x6e, 0x74, 0x79, 0x70, 0x65, 0x52, 0x10, 0x63, 0x6f, 0x6d, 0x62, 0x69, 0x6e, 0x61, 0x74,
|
||||||
|
0x69, 0x6f, 0x6e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x12, 0x42, 0x0a, 0x0a, 0x64, 0x65, 0x76, 0x69,
|
||||||
|
0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x67,
|
||||||
|
0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x6c, 0x61, 0x74,
|
||||||
|
0x65, 0x64, 0x52, 0x65, 0x66, 0x2e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65,
|
||||||
|
0x52, 0x0a, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x22, 0x43, 0x0a, 0x0f,
|
||||||
|
0x43, 0x6f, 0x6d, 0x62, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x74, 0x79, 0x70, 0x65, 0x12,
|
||||||
|
0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63,
|
||||||
|
0x6f, 0x64, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x66, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x73,
|
||||||
|
0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x66, 0x52, 0x65, 0x6c, 0x61, 0x79,
|
||||||
|
0x73, 0x22, 0x7c, 0x0a, 0x0c, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x49, 0x64, 0x54, 0x79, 0x70,
|
||||||
|
0x65, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x69, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
|
||||||
|
0x04, 0x63, 0x69, 0x74, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x69, 0x6e, 0x65, 0x49, 0x64, 0x18,
|
||||||
|
0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6c, 0x69, 0x6e, 0x65, 0x49, 0x64, 0x12, 0x40, 0x0a,
|
||||||
|
0x1b, 0x62, 0x65, 0x6c, 0x6f, 0x6e, 0x67, 0x73, 0x43, 0x6f, 0x6e, 0x63, 0x65, 0x6e, 0x74, 0x72,
|
||||||
|
0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01,
|
||||||
|
0x28, 0x09, 0x52, 0x1b, 0x62, 0x65, 0x6c, 0x6f, 0x6e, 0x67, 0x73, 0x43, 0x6f, 0x6e, 0x63, 0x65,
|
||||||
|
0x6e, 0x74, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22,
|
||||||
|
0x5c, 0x0a, 0x04, 0x43, 0x69, 0x43, 0x6a, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x73, 0x43, 0x6f, 0x75,
|
||||||
|
0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x64, 0x73, 0x43, 0x6f, 0x75, 0x6e,
|
||||||
|
0x74, 0x12, 0x3a, 0x0a, 0x06, 0x63, 0x6a, 0x4c, 0x69, 0x73, 0x74, 0x18, 0x02, 0x20, 0x03, 0x28,
|
||||||
|
0x0b, 0x32, 0x22, 0x2e, 0x72, 0x65, 0x6c, 0x61, 0x79, 0x43, 0x61, 0x62, 0x69, 0x6e, 0x65, 0x74,
|
||||||
|
0x47, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x6a, 0x44, 0x61,
|
||||||
|
0x74, 0x61, 0x53, 0x65, 0x74, 0x52, 0x06, 0x63, 0x6a, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x5a, 0x0a,
|
||||||
|
0x09, 0x43, 0x6a, 0x44, 0x61, 0x74, 0x61, 0x53, 0x65, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61,
|
||||||
|
0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x39,
|
||||||
|
0x0a, 0x07, 0x62, 0x69, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32,
|
||||||
|
0x1f, 0x2e, 0x72, 0x65, 0x6c, 0x61, 0x79, 0x43, 0x61, 0x62, 0x69, 0x6e, 0x65, 0x74, 0x47, 0x72,
|
||||||
|
0x61, 0x70, 0x68, 0x69, 0x63, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x6a, 0x44, 0x61, 0x74, 0x61,
|
||||||
|
0x52, 0x07, 0x62, 0x69, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x4b, 0x0a, 0x06, 0x43, 0x6a, 0x44,
|
||||||
|
0x61, 0x74, 0x61, 0x12, 0x41, 0x0a, 0x09, 0x72, 0x65, 0x66, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x73,
|
||||||
|
0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x72, 0x65, 0x6c, 0x61, 0x79, 0x43, 0x61,
|
||||||
0x62, 0x69, 0x6e, 0x65, 0x74, 0x47, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x44, 0x61, 0x74, 0x61,
|
0x62, 0x69, 0x6e, 0x65, 0x74, 0x47, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x44, 0x61, 0x74, 0x61,
|
||||||
0x2e, 0x43, 0x6f, 0x6d, 0x62, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x74, 0x79, 0x70, 0x65,
|
0x2e, 0x43, 0x6a, 0x44, 0x61, 0x74, 0x61, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x09, 0x72, 0x65, 0x66,
|
||||||
0x52, 0x10, 0x63, 0x6f, 0x6d, 0x62, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x74, 0x79, 0x70,
|
0x52, 0x65, 0x6c, 0x61, 0x79, 0x73, 0x22, 0x90, 0x01, 0x0a, 0x0a, 0x43, 0x6a, 0x44, 0x61, 0x74,
|
||||||
0x65, 0x73, 0x12, 0x42, 0x0a, 0x0a, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65,
|
0x61, 0x49, 0x74, 0x65, 0x6d, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x6c, 0x61, 0x79, 0x49, 0x64,
|
||||||
0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63,
|
0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x65, 0x6c, 0x61, 0x79, 0x49, 0x64, 0x12,
|
||||||
0x44, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x52, 0x65, 0x66, 0x2e,
|
0x4b, 0x0a, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28,
|
||||||
0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0a, 0x64, 0x65, 0x76, 0x69,
|
0x0e, 0x32, 0x2f, 0x2e, 0x72, 0x65, 0x6c, 0x61, 0x79, 0x43, 0x61, 0x62, 0x69, 0x6e, 0x65, 0x74,
|
||||||
0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x22, 0x43, 0x0a, 0x0f, 0x43, 0x6f, 0x6d, 0x62, 0x69, 0x6e,
|
0x47, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x6a, 0x44, 0x61,
|
||||||
0x61, 0x74, 0x69, 0x6f, 0x6e, 0x74, 0x79, 0x70, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64,
|
0x74, 0x61, 0x49, 0x74, 0x65, 0x6d, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79,
|
||||||
0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x1c, 0x0a,
|
0x70, 0x65, 0x52, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x1b, 0x0a, 0x0b,
|
||||||
0x09, 0x72, 0x65, 0x66, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09,
|
0x50, 0x6f, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x05, 0x0a, 0x01, 0x51,
|
||||||
0x52, 0x09, 0x72, 0x65, 0x66, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x73, 0x22, 0x7c, 0x0a, 0x0c, 0x55,
|
0x10, 0x00, 0x12, 0x05, 0x0a, 0x01, 0x48, 0x10, 0x01, 0x22, 0x5c, 0x0a, 0x04, 0x43, 0x69, 0x51,
|
||||||
0x6e, 0x69, 0x71, 0x75, 0x65, 0x49, 0x64, 0x54, 0x79, 0x70, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x63,
|
0x64, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01,
|
||||||
0x69, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x69, 0x74, 0x79, 0x12,
|
0x28, 0x05, 0x52, 0x07, 0x64, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x3a, 0x0a, 0x06, 0x71,
|
||||||
0x16, 0x0a, 0x06, 0x6c, 0x69, 0x6e, 0x65, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52,
|
0x64, 0x4c, 0x69, 0x73, 0x74, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x72, 0x65,
|
||||||
0x06, 0x6c, 0x69, 0x6e, 0x65, 0x49, 0x64, 0x12, 0x40, 0x0a, 0x1b, 0x62, 0x65, 0x6c, 0x6f, 0x6e,
|
0x6c, 0x61, 0x79, 0x43, 0x61, 0x62, 0x69, 0x6e, 0x65, 0x74, 0x47, 0x72, 0x61, 0x70, 0x68, 0x69,
|
||||||
0x67, 0x73, 0x43, 0x6f, 0x6e, 0x63, 0x65, 0x6e, 0x74, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53,
|
0x63, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x51, 0x64, 0x44, 0x61, 0x74, 0x61, 0x53, 0x65, 0x74, 0x52,
|
||||||
0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x1b, 0x62, 0x65,
|
0x06, 0x71, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x5a, 0x0a, 0x09, 0x51, 0x64, 0x44, 0x61, 0x74,
|
||||||
0x6c, 0x6f, 0x6e, 0x67, 0x73, 0x43, 0x6f, 0x6e, 0x63, 0x65, 0x6e, 0x74, 0x72, 0x61, 0x74, 0x69,
|
0x61, 0x53, 0x65, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01,
|
||||||
0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x21, 0x5a, 0x1f, 0x2e, 0x2f, 0x61,
|
0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x39, 0x0a, 0x07, 0x62, 0x69, 0x74, 0x4c,
|
||||||
0x74, 0x73, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73,
|
0x69, 0x73, 0x74, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x72, 0x65, 0x6c, 0x61,
|
||||||
0x2f, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x44, 0x61, 0x74, 0x61, 0x62, 0x06, 0x70, 0x72,
|
0x79, 0x43, 0x61, 0x62, 0x69, 0x6e, 0x65, 0x74, 0x47, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x44,
|
||||||
0x6f, 0x74, 0x6f, 0x33,
|
0x61, 0x74, 0x61, 0x2e, 0x51, 0x64, 0x44, 0x61, 0x74, 0x61, 0x52, 0x07, 0x62, 0x69, 0x74, 0x4c,
|
||||||
|
0x69, 0x73, 0x74, 0x22, 0x26, 0x0a, 0x06, 0x51, 0x64, 0x44, 0x61, 0x74, 0x61, 0x12, 0x1c, 0x0a,
|
||||||
|
0x09, 0x72, 0x65, 0x66, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09,
|
||||||
|
0x52, 0x09, 0x72, 0x65, 0x66, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x73, 0x42, 0x19, 0x5a, 0x17, 0x2e,
|
||||||
|
0x2f, 0x74, 0x73, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x67, 0x72, 0x61, 0x70, 0x68,
|
||||||
|
0x69, 0x63, 0x44, 0x61, 0x74, 0x61, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
|
||||||
}
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
@ -735,43 +1214,59 @@ func file_relayCabinetLayoutGraphics_proto_rawDescGZIP() []byte {
|
|||||||
return file_relayCabinetLayoutGraphics_proto_rawDescData
|
return file_relayCabinetLayoutGraphics_proto_rawDescData
|
||||||
}
|
}
|
||||||
|
|
||||||
var file_relayCabinetLayoutGraphics_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
|
var file_relayCabinetLayoutGraphics_proto_enumTypes = make([]protoimpl.EnumInfo, 2)
|
||||||
var file_relayCabinetLayoutGraphics_proto_msgTypes = make([]protoimpl.MessageInfo, 8)
|
var file_relayCabinetLayoutGraphics_proto_msgTypes = make([]protoimpl.MessageInfo, 15)
|
||||||
var file_relayCabinetLayoutGraphics_proto_goTypes = []interface{}{
|
var file_relayCabinetLayoutGraphics_proto_goTypes = []interface{}{
|
||||||
(Relay_ModelType)(0), // 0: relayCabinetGraphicData.Relay.ModelType
|
(Relay_ModelType)(0), // 0: relayCabinetGraphicData.Relay.ModelType
|
||||||
(*RelayCabinetGraphicStorage)(nil), // 1: relayCabinetGraphicData.RelayCabinetGraphicStorage
|
(CjDataItem_PostionType)(0), // 1: relayCabinetGraphicData.CjDataItem.PostionType
|
||||||
(*RelayCabinet)(nil), // 2: relayCabinetGraphicData.RelayCabinet
|
(*RelayCabinetGraphicStorage)(nil), // 2: relayCabinetGraphicData.RelayCabinetGraphicStorage
|
||||||
(*Relay)(nil), // 3: relayCabinetGraphicData.Relay
|
(*RelayCabinet)(nil), // 3: relayCabinetGraphicData.RelayCabinet
|
||||||
(*PhaseFailureProtector)(nil), // 4: relayCabinetGraphicData.PhaseFailureProtector
|
(*Relay)(nil), // 4: relayCabinetGraphicData.Relay
|
||||||
(*SignalFaultAlarm)(nil), // 5: relayCabinetGraphicData.SignalFaultAlarm
|
(*PhaseFailureProtector)(nil), // 5: relayCabinetGraphicData.PhaseFailureProtector
|
||||||
(*DeviceRelateRelay)(nil), // 6: relayCabinetGraphicData.DeviceRelateRelay
|
(*SignalFaultAlarm)(nil), // 6: relayCabinetGraphicData.SignalFaultAlarm
|
||||||
(*Combinationtype)(nil), // 7: relayCabinetGraphicData.Combinationtype
|
(*DeviceRelateRelay)(nil), // 7: relayCabinetGraphicData.DeviceRelateRelay
|
||||||
(*UniqueIdType)(nil), // 8: relayCabinetGraphicData.UniqueIdType
|
(*Combinationtype)(nil), // 8: relayCabinetGraphicData.Combinationtype
|
||||||
(*Canvas)(nil), // 9: graphicData.Canvas
|
(*UniqueIdType)(nil), // 9: relayCabinetGraphicData.UniqueIdType
|
||||||
(*CommonInfo)(nil), // 10: graphicData.CommonInfo
|
(*CiCj)(nil), // 10: relayCabinetGraphicData.CiCj
|
||||||
(RelatedRef_DeviceType)(0), // 11: graphicData.RelatedRef.DeviceType
|
(*CjDataSet)(nil), // 11: relayCabinetGraphicData.CjDataSet
|
||||||
|
(*CjData)(nil), // 12: relayCabinetGraphicData.CjData
|
||||||
|
(*CjDataItem)(nil), // 13: relayCabinetGraphicData.CjDataItem
|
||||||
|
(*CiQd)(nil), // 14: relayCabinetGraphicData.CiQd
|
||||||
|
(*QdDataSet)(nil), // 15: relayCabinetGraphicData.QdDataSet
|
||||||
|
(*QdData)(nil), // 16: relayCabinetGraphicData.QdData
|
||||||
|
(*Canvas)(nil), // 17: graphicData.Canvas
|
||||||
|
(*CommonInfo)(nil), // 18: graphicData.CommonInfo
|
||||||
|
(RelatedRef_DeviceType)(0), // 19: graphicData.RelatedRef.DeviceType
|
||||||
}
|
}
|
||||||
var file_relayCabinetLayoutGraphics_proto_depIdxs = []int32{
|
var file_relayCabinetLayoutGraphics_proto_depIdxs = []int32{
|
||||||
9, // 0: relayCabinetGraphicData.RelayCabinetGraphicStorage.canvas:type_name -> graphicData.Canvas
|
17, // 0: relayCabinetGraphicData.RelayCabinetGraphicStorage.canvas:type_name -> graphicData.Canvas
|
||||||
2, // 1: relayCabinetGraphicData.RelayCabinetGraphicStorage.relayCabinets:type_name -> relayCabinetGraphicData.RelayCabinet
|
3, // 1: relayCabinetGraphicData.RelayCabinetGraphicStorage.relayCabinets:type_name -> relayCabinetGraphicData.RelayCabinet
|
||||||
3, // 2: relayCabinetGraphicData.RelayCabinetGraphicStorage.relays:type_name -> relayCabinetGraphicData.Relay
|
4, // 2: relayCabinetGraphicData.RelayCabinetGraphicStorage.relays:type_name -> relayCabinetGraphicData.Relay
|
||||||
6, // 3: relayCabinetGraphicData.RelayCabinetGraphicStorage.deviceRelateRelayList:type_name -> relayCabinetGraphicData.DeviceRelateRelay
|
7, // 3: relayCabinetGraphicData.RelayCabinetGraphicStorage.deviceRelateRelayList:type_name -> relayCabinetGraphicData.DeviceRelateRelay
|
||||||
8, // 4: relayCabinetGraphicData.RelayCabinetGraphicStorage.UniqueIdPrefix:type_name -> relayCabinetGraphicData.UniqueIdType
|
9, // 4: relayCabinetGraphicData.RelayCabinetGraphicStorage.UniqueIdPrefix:type_name -> relayCabinetGraphicData.UniqueIdType
|
||||||
4, // 5: relayCabinetGraphicData.RelayCabinetGraphicStorage.phaseFailureProtectors:type_name -> relayCabinetGraphicData.PhaseFailureProtector
|
5, // 5: relayCabinetGraphicData.RelayCabinetGraphicStorage.phaseFailureProtectors:type_name -> relayCabinetGraphicData.PhaseFailureProtector
|
||||||
7, // 6: relayCabinetGraphicData.RelayCabinetGraphicStorage.combinationtypeList:type_name -> relayCabinetGraphicData.Combinationtype
|
8, // 6: relayCabinetGraphicData.RelayCabinetGraphicStorage.combinationtypeList:type_name -> relayCabinetGraphicData.Combinationtype
|
||||||
5, // 7: relayCabinetGraphicData.RelayCabinetGraphicStorage.signalFaultAlarms:type_name -> relayCabinetGraphicData.SignalFaultAlarm
|
6, // 7: relayCabinetGraphicData.RelayCabinetGraphicStorage.signalFaultAlarms:type_name -> relayCabinetGraphicData.SignalFaultAlarm
|
||||||
10, // 8: relayCabinetGraphicData.RelayCabinet.common:type_name -> graphicData.CommonInfo
|
10, // 8: relayCabinetGraphicData.RelayCabinetGraphicStorage.ciCjList:type_name -> relayCabinetGraphicData.CiCj
|
||||||
10, // 9: relayCabinetGraphicData.Relay.common:type_name -> graphicData.CommonInfo
|
14, // 9: relayCabinetGraphicData.RelayCabinetGraphicStorage.ciQdList:type_name -> relayCabinetGraphicData.CiQd
|
||||||
0, // 10: relayCabinetGraphicData.Relay.newModel:type_name -> relayCabinetGraphicData.Relay.ModelType
|
18, // 10: relayCabinetGraphicData.RelayCabinet.common:type_name -> graphicData.CommonInfo
|
||||||
10, // 11: relayCabinetGraphicData.PhaseFailureProtector.common:type_name -> graphicData.CommonInfo
|
18, // 11: relayCabinetGraphicData.Relay.common:type_name -> graphicData.CommonInfo
|
||||||
10, // 12: relayCabinetGraphicData.SignalFaultAlarm.common:type_name -> graphicData.CommonInfo
|
0, // 12: relayCabinetGraphicData.Relay.newModel:type_name -> relayCabinetGraphicData.Relay.ModelType
|
||||||
7, // 13: relayCabinetGraphicData.DeviceRelateRelay.combinationtypes:type_name -> relayCabinetGraphicData.Combinationtype
|
18, // 13: relayCabinetGraphicData.PhaseFailureProtector.common:type_name -> graphicData.CommonInfo
|
||||||
11, // 14: relayCabinetGraphicData.DeviceRelateRelay.deviceType:type_name -> graphicData.RelatedRef.DeviceType
|
18, // 14: relayCabinetGraphicData.SignalFaultAlarm.common:type_name -> graphicData.CommonInfo
|
||||||
15, // [15:15] is the sub-list for method output_type
|
8, // 15: relayCabinetGraphicData.DeviceRelateRelay.combinationtypes:type_name -> relayCabinetGraphicData.Combinationtype
|
||||||
15, // [15:15] is the sub-list for method input_type
|
19, // 16: relayCabinetGraphicData.DeviceRelateRelay.deviceType:type_name -> graphicData.RelatedRef.DeviceType
|
||||||
15, // [15:15] is the sub-list for extension type_name
|
11, // 17: relayCabinetGraphicData.CiCj.cjList:type_name -> relayCabinetGraphicData.CjDataSet
|
||||||
15, // [15:15] is the sub-list for extension extendee
|
12, // 18: relayCabinetGraphicData.CjDataSet.bitList:type_name -> relayCabinetGraphicData.CjData
|
||||||
0, // [0:15] is the sub-list for field type_name
|
13, // 19: relayCabinetGraphicData.CjData.refRelays:type_name -> relayCabinetGraphicData.CjDataItem
|
||||||
|
1, // 20: relayCabinetGraphicData.CjDataItem.position:type_name -> relayCabinetGraphicData.CjDataItem.PostionType
|
||||||
|
15, // 21: relayCabinetGraphicData.CiQd.qdList:type_name -> relayCabinetGraphicData.QdDataSet
|
||||||
|
16, // 22: relayCabinetGraphicData.QdDataSet.bitList:type_name -> relayCabinetGraphicData.QdData
|
||||||
|
23, // [23:23] is the sub-list for method output_type
|
||||||
|
23, // [23:23] is the sub-list for method input_type
|
||||||
|
23, // [23:23] is the sub-list for extension type_name
|
||||||
|
23, // [23:23] is the sub-list for extension extendee
|
||||||
|
0, // [0:23] is the sub-list for field type_name
|
||||||
}
|
}
|
||||||
|
|
||||||
func init() { file_relayCabinetLayoutGraphics_proto_init() }
|
func init() { file_relayCabinetLayoutGraphics_proto_init() }
|
||||||
@ -877,14 +1372,98 @@ func file_relayCabinetLayoutGraphics_proto_init() {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
file_relayCabinetLayoutGraphics_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
|
||||||
|
switch v := v.(*CiCj); i {
|
||||||
|
case 0:
|
||||||
|
return &v.state
|
||||||
|
case 1:
|
||||||
|
return &v.sizeCache
|
||||||
|
case 2:
|
||||||
|
return &v.unknownFields
|
||||||
|
default:
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
file_relayCabinetLayoutGraphics_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {
|
||||||
|
switch v := v.(*CjDataSet); i {
|
||||||
|
case 0:
|
||||||
|
return &v.state
|
||||||
|
case 1:
|
||||||
|
return &v.sizeCache
|
||||||
|
case 2:
|
||||||
|
return &v.unknownFields
|
||||||
|
default:
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
file_relayCabinetLayoutGraphics_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {
|
||||||
|
switch v := v.(*CjData); i {
|
||||||
|
case 0:
|
||||||
|
return &v.state
|
||||||
|
case 1:
|
||||||
|
return &v.sizeCache
|
||||||
|
case 2:
|
||||||
|
return &v.unknownFields
|
||||||
|
default:
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
file_relayCabinetLayoutGraphics_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} {
|
||||||
|
switch v := v.(*CjDataItem); i {
|
||||||
|
case 0:
|
||||||
|
return &v.state
|
||||||
|
case 1:
|
||||||
|
return &v.sizeCache
|
||||||
|
case 2:
|
||||||
|
return &v.unknownFields
|
||||||
|
default:
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
file_relayCabinetLayoutGraphics_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} {
|
||||||
|
switch v := v.(*CiQd); i {
|
||||||
|
case 0:
|
||||||
|
return &v.state
|
||||||
|
case 1:
|
||||||
|
return &v.sizeCache
|
||||||
|
case 2:
|
||||||
|
return &v.unknownFields
|
||||||
|
default:
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
file_relayCabinetLayoutGraphics_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} {
|
||||||
|
switch v := v.(*QdDataSet); i {
|
||||||
|
case 0:
|
||||||
|
return &v.state
|
||||||
|
case 1:
|
||||||
|
return &v.sizeCache
|
||||||
|
case 2:
|
||||||
|
return &v.unknownFields
|
||||||
|
default:
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
file_relayCabinetLayoutGraphics_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} {
|
||||||
|
switch v := v.(*QdData); i {
|
||||||
|
case 0:
|
||||||
|
return &v.state
|
||||||
|
case 1:
|
||||||
|
return &v.sizeCache
|
||||||
|
case 2:
|
||||||
|
return &v.unknownFields
|
||||||
|
default:
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
type x struct{}
|
type x struct{}
|
||||||
out := protoimpl.TypeBuilder{
|
out := protoimpl.TypeBuilder{
|
||||||
File: protoimpl.DescBuilder{
|
File: protoimpl.DescBuilder{
|
||||||
GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
|
GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
|
||||||
RawDescriptor: file_relayCabinetLayoutGraphics_proto_rawDesc,
|
RawDescriptor: file_relayCabinetLayoutGraphics_proto_rawDesc,
|
||||||
NumEnums: 1,
|
NumEnums: 2,
|
||||||
NumMessages: 8,
|
NumMessages: 15,
|
||||||
NumExtensions: 0,
|
NumExtensions: 0,
|
||||||
NumServices: 0,
|
NumServices: 0,
|
||||||
},
|
},
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -1,6 +1,6 @@
|
|||||||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||||
// versions:
|
// versions:
|
||||||
// protoc-gen-go v1.31.0
|
// protoc-gen-go v1.28.1
|
||||||
// protoc v4.23.1
|
// protoc v4.23.1
|
||||||
// source: device_state.proto
|
// source: device_state.proto
|
||||||
|
|
||||||
@ -149,6 +149,58 @@ func (Signal_Aspect) EnumDescriptor() ([]byte, []int) {
|
|||||||
return file_device_state_proto_rawDescGZIP(), []int{4, 0}
|
return file_device_state_proto_rawDescGZIP(), []int{4, 0}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type SimulationStatus_SimulationState int32
|
||||||
|
|
||||||
|
const (
|
||||||
|
SimulationStatus_PAUSE SimulationStatus_SimulationState = 0
|
||||||
|
SimulationStatus_START SimulationStatus_SimulationState = 1
|
||||||
|
SimulationStatus_ERROR SimulationStatus_SimulationState = 2
|
||||||
|
SimulationStatus_DESTROY SimulationStatus_SimulationState = 3
|
||||||
|
)
|
||||||
|
|
||||||
|
// Enum value maps for SimulationStatus_SimulationState.
|
||||||
|
var (
|
||||||
|
SimulationStatus_SimulationState_name = map[int32]string{
|
||||||
|
0: "PAUSE",
|
||||||
|
1: "START",
|
||||||
|
2: "ERROR",
|
||||||
|
3: "DESTROY",
|
||||||
|
}
|
||||||
|
SimulationStatus_SimulationState_value = map[string]int32{
|
||||||
|
"PAUSE": 0,
|
||||||
|
"START": 1,
|
||||||
|
"ERROR": 2,
|
||||||
|
"DESTROY": 3,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
func (x SimulationStatus_SimulationState) Enum() *SimulationStatus_SimulationState {
|
||||||
|
p := new(SimulationStatus_SimulationState)
|
||||||
|
*p = x
|
||||||
|
return p
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x SimulationStatus_SimulationState) String() string {
|
||||||
|
return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
|
||||||
|
}
|
||||||
|
|
||||||
|
func (SimulationStatus_SimulationState) Descriptor() protoreflect.EnumDescriptor {
|
||||||
|
return file_device_state_proto_enumTypes[2].Descriptor()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (SimulationStatus_SimulationState) Type() protoreflect.EnumType {
|
||||||
|
return &file_device_state_proto_enumTypes[2]
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x SimulationStatus_SimulationState) Number() protoreflect.EnumNumber {
|
||||||
|
return protoreflect.EnumNumber(x)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Deprecated: Use SimulationStatus_SimulationState.Descriptor instead.
|
||||||
|
func (SimulationStatus_SimulationState) EnumDescriptor() ([]byte, []int) {
|
||||||
|
return file_device_state_proto_rawDescGZIP(), []int{19, 0}
|
||||||
|
}
|
||||||
|
|
||||||
// 相邻端点定义的link的状态
|
// 相邻端点定义的link的状态
|
||||||
type LinkState struct {
|
type LinkState struct {
|
||||||
state protoimpl.MessageState
|
state protoimpl.MessageState
|
||||||
@ -1878,10 +1930,9 @@ type SimulationStatus struct {
|
|||||||
sizeCache protoimpl.SizeCache
|
sizeCache protoimpl.SizeCache
|
||||||
unknownFields protoimpl.UnknownFields
|
unknownFields protoimpl.UnknownFields
|
||||||
|
|
||||||
SimulationId string `protobuf:"bytes,1,opt,name=simulationId,proto3" json:"simulationId,omitempty"`
|
SimulationId string `protobuf:"bytes,1,opt,name=simulationId,proto3" json:"simulationId,omitempty"`
|
||||||
MapId int32 `protobuf:"varint,2,opt,name=mapId,proto3" json:"mapId,omitempty"`
|
State SimulationStatus_SimulationState `protobuf:"varint,2,opt,name=state,proto3,enum=state.SimulationStatus_SimulationState" json:"state,omitempty"`
|
||||||
ProjectId int32 `protobuf:"varint,3,opt,name=projectId,proto3" json:"projectId,omitempty"`
|
Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"`
|
||||||
MapIds []int32 `protobuf:"varint,4,rep,packed,name=mapIds,proto3" json:"mapIds,omitempty"`
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (x *SimulationStatus) Reset() {
|
func (x *SimulationStatus) Reset() {
|
||||||
@ -1923,89 +1974,18 @@ func (x *SimulationStatus) GetSimulationId() string {
|
|||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
|
|
||||||
func (x *SimulationStatus) GetMapId() int32 {
|
func (x *SimulationStatus) GetState() SimulationStatus_SimulationState {
|
||||||
if x != nil {
|
if x != nil {
|
||||||
return x.MapId
|
return x.State
|
||||||
}
|
}
|
||||||
return 0
|
return SimulationStatus_PAUSE
|
||||||
}
|
}
|
||||||
|
|
||||||
func (x *SimulationStatus) GetProjectId() int32 {
|
func (x *SimulationStatus) GetDescription() string {
|
||||||
if x != nil {
|
if x != nil {
|
||||||
return x.ProjectId
|
return x.Description
|
||||||
}
|
}
|
||||||
return 0
|
return ""
|
||||||
}
|
|
||||||
|
|
||||||
func (x *SimulationStatus) GetMapIds() []int32 {
|
|
||||||
if x != nil {
|
|
||||||
return x.MapIds
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// 变更信息状态
|
|
||||||
type MemoryDataStatus struct {
|
|
||||||
state protoimpl.MessageState
|
|
||||||
sizeCache protoimpl.SizeCache
|
|
||||||
unknownFields protoimpl.UnknownFields
|
|
||||||
|
|
||||||
AllSimulations []*SimulationStatus `protobuf:"bytes,1,rep,name=allSimulations,proto3" json:"allSimulations,omitempty"`
|
|
||||||
AddSimulations []*SimulationStatus `protobuf:"bytes,2,rep,name=addSimulations,proto3" json:"addSimulations,omitempty"`
|
|
||||||
RemoveSimulations []*SimulationStatus `protobuf:"bytes,3,rep,name=removeSimulations,proto3" json:"removeSimulations,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
func (x *MemoryDataStatus) Reset() {
|
|
||||||
*x = MemoryDataStatus{}
|
|
||||||
if protoimpl.UnsafeEnabled {
|
|
||||||
mi := &file_device_state_proto_msgTypes[20]
|
|
||||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
|
||||||
ms.StoreMessageInfo(mi)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (x *MemoryDataStatus) String() string {
|
|
||||||
return protoimpl.X.MessageStringOf(x)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (*MemoryDataStatus) ProtoMessage() {}
|
|
||||||
|
|
||||||
func (x *MemoryDataStatus) ProtoReflect() protoreflect.Message {
|
|
||||||
mi := &file_device_state_proto_msgTypes[20]
|
|
||||||
if protoimpl.UnsafeEnabled && x != nil {
|
|
||||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
|
||||||
if ms.LoadMessageInfo() == nil {
|
|
||||||
ms.StoreMessageInfo(mi)
|
|
||||||
}
|
|
||||||
return ms
|
|
||||||
}
|
|
||||||
return mi.MessageOf(x)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Deprecated: Use MemoryDataStatus.ProtoReflect.Descriptor instead.
|
|
||||||
func (*MemoryDataStatus) Descriptor() ([]byte, []int) {
|
|
||||||
return file_device_state_proto_rawDescGZIP(), []int{20}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (x *MemoryDataStatus) GetAllSimulations() []*SimulationStatus {
|
|
||||||
if x != nil {
|
|
||||||
return x.AllSimulations
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (x *MemoryDataStatus) GetAddSimulations() []*SimulationStatus {
|
|
||||||
if x != nil {
|
|
||||||
return x.AddSimulations
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (x *MemoryDataStatus) GetRemoveSimulations() []*SimulationStatus {
|
|
||||||
if x != nil {
|
|
||||||
return x.RemoveSimulations
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var File_device_state_proto protoreflect.FileDescriptor
|
var File_device_state_proto protoreflect.FileDescriptor
|
||||||
@ -2275,38 +2255,29 @@ var file_device_state_proto_rawDesc = []byte{
|
|||||||
0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x35, 0x0a, 0x09, 0x61, 0x6c, 0x6c, 0x53, 0x74, 0x61, 0x74,
|
0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x35, 0x0a, 0x09, 0x61, 0x6c, 0x6c, 0x53, 0x74, 0x61, 0x74,
|
||||||
0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x65,
|
0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x65,
|
||||||
0x2e, 0x41, 0x6c, 0x6c, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x53, 0x74, 0x61, 0x74, 0x75,
|
0x2e, 0x41, 0x6c, 0x6c, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x53, 0x74, 0x61, 0x74, 0x75,
|
||||||
0x73, 0x52, 0x09, 0x61, 0x6c, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x82, 0x01, 0x0a,
|
0x73, 0x52, 0x09, 0x61, 0x6c, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0xd8, 0x01, 0x0a,
|
||||||
0x10, 0x53, 0x69, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75,
|
0x10, 0x53, 0x69, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75,
|
||||||
0x73, 0x12, 0x22, 0x0a, 0x0c, 0x73, 0x69, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49,
|
0x73, 0x12, 0x22, 0x0a, 0x0c, 0x73, 0x69, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49,
|
||||||
0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x69, 0x6d, 0x75, 0x6c, 0x61, 0x74,
|
0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x69, 0x6d, 0x75, 0x6c, 0x61, 0x74,
|
||||||
0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x61, 0x70, 0x49, 0x64, 0x18, 0x02,
|
0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x3d, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02,
|
||||||
0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6d, 0x61, 0x70, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x70,
|
0x20, 0x01, 0x28, 0x0e, 0x32, 0x27, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x53, 0x69, 0x6d,
|
||||||
0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09,
|
0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x53, 0x69,
|
||||||
0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x61, 0x70,
|
0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73,
|
||||||
0x49, 0x64, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x05, 0x52, 0x06, 0x6d, 0x61, 0x70, 0x49, 0x64,
|
0x74, 0x61, 0x74, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74,
|
||||||
0x73, 0x22, 0xdb, 0x01, 0x0a, 0x10, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x44, 0x61, 0x74, 0x61,
|
0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72,
|
||||||
0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x3f, 0x0a, 0x0e, 0x61, 0x6c, 0x6c, 0x53, 0x69, 0x6d,
|
0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3f, 0x0a, 0x0f, 0x53, 0x69, 0x6d, 0x75, 0x6c, 0x61,
|
||||||
0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17,
|
0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x09, 0x0a, 0x05, 0x50, 0x41, 0x55,
|
||||||
0x2e, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x53, 0x69, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f,
|
0x53, 0x45, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x53, 0x54, 0x41, 0x52, 0x54, 0x10, 0x01, 0x12,
|
||||||
0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x0e, 0x61, 0x6c, 0x6c, 0x53, 0x69, 0x6d, 0x75,
|
0x09, 0x0a, 0x05, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x44, 0x45,
|
||||||
0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x3f, 0x0a, 0x0e, 0x61, 0x64, 0x64, 0x53, 0x69,
|
0x53, 0x54, 0x52, 0x4f, 0x59, 0x10, 0x03, 0x2a, 0x37, 0x0a, 0x0b, 0x53, 0x65, 0x63, 0x74, 0x69,
|
||||||
0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32,
|
0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x07, 0x0a, 0x03, 0x41, 0x6e, 0x79, 0x10, 0x00, 0x12,
|
||||||
0x17, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x53, 0x69, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69,
|
0x08, 0x0a, 0x04, 0x41, 0x78, 0x6c, 0x65, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x4c, 0x6f, 0x67,
|
||||||
0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x0e, 0x61, 0x64, 0x64, 0x53, 0x69, 0x6d,
|
0x69, 0x63, 0x10, 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x50, 0x68, 0x79, 0x73, 0x69, 0x63, 0x10, 0x03,
|
||||||
0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x45, 0x0a, 0x11, 0x72, 0x65, 0x6d, 0x6f,
|
0x42, 0x4c, 0x0a, 0x25, 0x63, 0x6c, 0x75, 0x62, 0x2e, 0x6a, 0x6f, 0x79, 0x6c, 0x69, 0x6e, 0x6b,
|
||||||
0x76, 0x65, 0x53, 0x69, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20,
|
0x2e, 0x62, 0x6a, 0x72, 0x74, 0x73, 0x73, 0x2e, 0x61, 0x74, 0x73, 0x2e, 0x76, 0x65, 0x72, 0x69,
|
||||||
0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x53, 0x69, 0x6d, 0x75,
|
0x66, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x42, 0x10, 0x44, 0x65, 0x76, 0x69, 0x63,
|
||||||
0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x11, 0x72, 0x65,
|
0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x5a, 0x11, 0x2e, 0x2f, 0x74,
|
||||||
0x6d, 0x6f, 0x76, 0x65, 0x53, 0x69, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2a,
|
0x73, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x62, 0x06,
|
||||||
0x37, 0x0a, 0x0b, 0x53, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x07,
|
|
||||||
0x0a, 0x03, 0x41, 0x6e, 0x79, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x41, 0x78, 0x6c, 0x65, 0x10,
|
|
||||||
0x01, 0x12, 0x09, 0x0a, 0x05, 0x4c, 0x6f, 0x67, 0x69, 0x63, 0x10, 0x02, 0x12, 0x0a, 0x0a, 0x06,
|
|
||||||
0x50, 0x68, 0x79, 0x73, 0x69, 0x63, 0x10, 0x03, 0x42, 0x54, 0x0a, 0x25, 0x63, 0x6c, 0x75, 0x62,
|
|
||||||
0x2e, 0x6a, 0x6f, 0x79, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x62, 0x6a, 0x72, 0x74, 0x73, 0x73, 0x2e,
|
|
||||||
0x61, 0x74, 0x73, 0x2e, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
|
|
||||||
0x73, 0x42, 0x10, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x50, 0x72,
|
|
||||||
0x6f, 0x74, 0x6f, 0x5a, 0x19, 0x2e, 0x2f, 0x61, 0x74, 0x73, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66,
|
|
||||||
0x79, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x62, 0x06,
|
|
||||||
0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
|
0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2322,62 +2293,60 @@ func file_device_state_proto_rawDescGZIP() []byte {
|
|||||||
return file_device_state_proto_rawDescData
|
return file_device_state_proto_rawDescData
|
||||||
}
|
}
|
||||||
|
|
||||||
var file_device_state_proto_enumTypes = make([]protoimpl.EnumInfo, 2)
|
var file_device_state_proto_enumTypes = make([]protoimpl.EnumInfo, 3)
|
||||||
var file_device_state_proto_msgTypes = make([]protoimpl.MessageInfo, 21)
|
var file_device_state_proto_msgTypes = make([]protoimpl.MessageInfo, 20)
|
||||||
var file_device_state_proto_goTypes = []interface{}{
|
var file_device_state_proto_goTypes = []interface{}{
|
||||||
(SectionType)(0), // 0: state.SectionType
|
(SectionType)(0), // 0: state.SectionType
|
||||||
(Signal_Aspect)(0), // 1: state.Signal.Aspect
|
(Signal_Aspect)(0), // 1: state.Signal.Aspect
|
||||||
(*LinkState)(nil), // 2: state.LinkState
|
(SimulationStatus_SimulationState)(0), // 2: state.SimulationStatus.SimulationState
|
||||||
(*SectionState)(nil), // 3: state.SectionState
|
(*LinkState)(nil), // 3: state.LinkState
|
||||||
(*SwitchState)(nil), // 4: state.SwitchState
|
(*SectionState)(nil), // 4: state.SectionState
|
||||||
(*SignalState)(nil), // 5: state.SignalState
|
(*SwitchState)(nil), // 5: state.SwitchState
|
||||||
(*Signal)(nil), // 6: state.Signal
|
(*SignalState)(nil), // 6: state.SignalState
|
||||||
(*PlatformState)(nil), // 7: state.PlatformState
|
(*Signal)(nil), // 7: state.Signal
|
||||||
(*StationState)(nil), // 8: state.StationState
|
(*PlatformState)(nil), // 8: state.PlatformState
|
||||||
(*TrainState)(nil), // 9: state.TrainState
|
(*StationState)(nil), // 9: state.StationState
|
||||||
(*TrainDynamicState)(nil), // 10: state.TrainDynamicState
|
(*TrainState)(nil), // 10: state.TrainState
|
||||||
(*TrainVobcState)(nil), // 11: state.TrainVobcState
|
(*TrainDynamicState)(nil), // 11: state.TrainDynamicState
|
||||||
(*ReplyState)(nil), // 12: state.ReplyState
|
(*TrainVobcState)(nil), // 12: state.TrainVobcState
|
||||||
(*ButtonState)(nil), // 13: state.ButtonState
|
(*ReplyState)(nil), // 13: state.ReplyState
|
||||||
(*AlarmState)(nil), // 14: state.AlarmState
|
(*ButtonState)(nil), // 14: state.ButtonState
|
||||||
(*LightState)(nil), // 15: state.LightState
|
(*AlarmState)(nil), // 15: state.AlarmState
|
||||||
(*PsdState)(nil), // 16: state.PsdState
|
(*LightState)(nil), // 16: state.LightState
|
||||||
(*KeyState)(nil), // 17: state.KeyState
|
(*PsdState)(nil), // 17: state.PsdState
|
||||||
(*VariationStatus)(nil), // 18: state.VariationStatus
|
(*KeyState)(nil), // 18: state.KeyState
|
||||||
(*AllDevicesStatus)(nil), // 19: state.AllDevicesStatus
|
(*VariationStatus)(nil), // 19: state.VariationStatus
|
||||||
(*PushedDevicesStatus)(nil), // 20: state.PushedDevicesStatus
|
(*AllDevicesStatus)(nil), // 20: state.AllDevicesStatus
|
||||||
(*SimulationStatus)(nil), // 21: state.SimulationStatus
|
(*PushedDevicesStatus)(nil), // 21: state.PushedDevicesStatus
|
||||||
(*MemoryDataStatus)(nil), // 22: state.MemoryDataStatus
|
(*SimulationStatus)(nil), // 22: state.SimulationStatus
|
||||||
}
|
}
|
||||||
var file_device_state_proto_depIdxs = []int32{
|
var file_device_state_proto_depIdxs = []int32{
|
||||||
0, // 0: state.SectionState.type:type_name -> state.SectionType
|
0, // 0: state.SectionState.type:type_name -> state.SectionType
|
||||||
1, // 1: state.SignalState.aspect:type_name -> state.Signal.Aspect
|
1, // 1: state.SignalState.aspect:type_name -> state.Signal.Aspect
|
||||||
10, // 2: state.TrainState.dynamicState:type_name -> state.TrainDynamicState
|
11, // 2: state.TrainState.dynamicState:type_name -> state.TrainDynamicState
|
||||||
11, // 3: state.TrainState.vobcState:type_name -> state.TrainVobcState
|
12, // 3: state.TrainState.vobcState:type_name -> state.TrainVobcState
|
||||||
9, // 4: state.VariationStatus.updatedTrain:type_name -> state.TrainState
|
10, // 4: state.VariationStatus.updatedTrain:type_name -> state.TrainState
|
||||||
4, // 5: state.VariationStatus.updatedSwitch:type_name -> state.SwitchState
|
5, // 5: state.VariationStatus.updatedSwitch:type_name -> state.SwitchState
|
||||||
3, // 6: state.VariationStatus.updatedSection:type_name -> state.SectionState
|
4, // 6: state.VariationStatus.updatedSection:type_name -> state.SectionState
|
||||||
12, // 7: state.VariationStatus.updatedReply:type_name -> state.ReplyState
|
13, // 7: state.VariationStatus.updatedReply:type_name -> state.ReplyState
|
||||||
9, // 8: state.AllDevicesStatus.trainState:type_name -> state.TrainState
|
10, // 8: state.AllDevicesStatus.trainState:type_name -> state.TrainState
|
||||||
4, // 9: state.AllDevicesStatus.switchState:type_name -> state.SwitchState
|
5, // 9: state.AllDevicesStatus.switchState:type_name -> state.SwitchState
|
||||||
3, // 10: state.AllDevicesStatus.sectionState:type_name -> state.SectionState
|
4, // 10: state.AllDevicesStatus.sectionState:type_name -> state.SectionState
|
||||||
12, // 11: state.AllDevicesStatus.replyState:type_name -> state.ReplyState
|
13, // 11: state.AllDevicesStatus.replyState:type_name -> state.ReplyState
|
||||||
5, // 12: state.AllDevicesStatus.signalState:type_name -> state.SignalState
|
6, // 12: state.AllDevicesStatus.signalState:type_name -> state.SignalState
|
||||||
13, // 13: state.AllDevicesStatus.buttonState:type_name -> state.ButtonState
|
14, // 13: state.AllDevicesStatus.buttonState:type_name -> state.ButtonState
|
||||||
14, // 14: state.AllDevicesStatus.AlarmState:type_name -> state.AlarmState
|
15, // 14: state.AllDevicesStatus.AlarmState:type_name -> state.AlarmState
|
||||||
15, // 15: state.AllDevicesStatus.LightState:type_name -> state.LightState
|
16, // 15: state.AllDevicesStatus.LightState:type_name -> state.LightState
|
||||||
16, // 16: state.AllDevicesStatus.psdState:type_name -> state.PsdState
|
17, // 16: state.AllDevicesStatus.psdState:type_name -> state.PsdState
|
||||||
17, // 17: state.AllDevicesStatus.KeyState:type_name -> state.KeyState
|
18, // 17: state.AllDevicesStatus.KeyState:type_name -> state.KeyState
|
||||||
18, // 18: state.PushedDevicesStatus.varStatus:type_name -> state.VariationStatus
|
19, // 18: state.PushedDevicesStatus.varStatus:type_name -> state.VariationStatus
|
||||||
19, // 19: state.PushedDevicesStatus.allStatus:type_name -> state.AllDevicesStatus
|
20, // 19: state.PushedDevicesStatus.allStatus:type_name -> state.AllDevicesStatus
|
||||||
21, // 20: state.MemoryDataStatus.allSimulations:type_name -> state.SimulationStatus
|
2, // 20: state.SimulationStatus.state:type_name -> state.SimulationStatus.SimulationState
|
||||||
21, // 21: state.MemoryDataStatus.addSimulations:type_name -> state.SimulationStatus
|
21, // [21:21] is the sub-list for method output_type
|
||||||
21, // 22: state.MemoryDataStatus.removeSimulations:type_name -> state.SimulationStatus
|
21, // [21:21] is the sub-list for method input_type
|
||||||
23, // [23:23] is the sub-list for method output_type
|
21, // [21:21] is the sub-list for extension type_name
|
||||||
23, // [23:23] is the sub-list for method input_type
|
21, // [21:21] is the sub-list for extension extendee
|
||||||
23, // [23:23] is the sub-list for extension type_name
|
0, // [0:21] is the sub-list for field type_name
|
||||||
23, // [23:23] is the sub-list for extension extendee
|
|
||||||
0, // [0:23] is the sub-list for field type_name
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func init() { file_device_state_proto_init() }
|
func init() { file_device_state_proto_init() }
|
||||||
@ -2626,26 +2595,14 @@ func file_device_state_proto_init() {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
file_device_state_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} {
|
|
||||||
switch v := v.(*MemoryDataStatus); i {
|
|
||||||
case 0:
|
|
||||||
return &v.state
|
|
||||||
case 1:
|
|
||||||
return &v.sizeCache
|
|
||||||
case 2:
|
|
||||||
return &v.unknownFields
|
|
||||||
default:
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
type x struct{}
|
type x struct{}
|
||||||
out := protoimpl.TypeBuilder{
|
out := protoimpl.TypeBuilder{
|
||||||
File: protoimpl.DescBuilder{
|
File: protoimpl.DescBuilder{
|
||||||
GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
|
GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
|
||||||
RawDescriptor: file_device_state_proto_rawDesc,
|
RawDescriptor: file_device_state_proto_rawDesc,
|
||||||
NumEnums: 2,
|
NumEnums: 3,
|
||||||
NumMessages: 21,
|
NumMessages: 20,
|
||||||
NumExtensions: 0,
|
NumExtensions: 0,
|
||||||
NumServices: 0,
|
NumServices: 0,
|
||||||
},
|
},
|
||||||
|
@ -2,10 +2,6 @@ package memory
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"joylink.club/bj-rtsts-server/ts/protos/graphicData"
|
"joylink.club/bj-rtsts-server/ts/protos/graphicData"
|
||||||
"joylink.club/bj-rtsts-server/ts/protos/state"
|
|
||||||
"joylink.club/ecs"
|
|
||||||
"joylink.club/rtsssimulation/component"
|
|
||||||
"joylink.club/rtsssimulation/entity"
|
|
||||||
"joylink.club/rtsssimulation/fi"
|
"joylink.club/rtsssimulation/fi"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -24,74 +20,3 @@ func ChangeIBPKeyState(sim *VerifySimulation, mapId int32, stationId, keyCode st
|
|||||||
stationUid := QueryUidByMidAndComId(mapId, stationId, &graphicData.Station{})
|
stationUid := QueryUidByMidAndComId(mapId, stationId, &graphicData.Station{})
|
||||||
fi.SwitchKeyGear(sim.World, stationUid+"_key_"+keyCode, gear)
|
fi.SwitchKeyGear(sim.World, stationUid+"_key_"+keyCode, gear)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取仿真车站按钮状态,前端推送
|
|
||||||
func GetMapAllIBPState(sim *VerifySimulation, mapId int32, stationId, ibpMapCode string) *state.AllDevicesStatus {
|
|
||||||
status := &state.AllDevicesStatus{
|
|
||||||
ButtonState: []*state.ButtonState{},
|
|
||||||
LightState: []*state.LightState{},
|
|
||||||
AlarmState: []*state.AlarmState{},
|
|
||||||
KeyState: []*state.KeyState{},
|
|
||||||
}
|
|
||||||
stationUid := QueryUidByMidAndComId(mapId, stationId, &graphicData.Station{})
|
|
||||||
ibpStorage := getStorageIBPMapData(ibpMapCode)
|
|
||||||
for _, data := range ibpStorage.IbpButtons { // 按钮
|
|
||||||
entry, ok := entity.GetEntityByUid(sim.World, stationUid+"_button_"+data.Code)
|
|
||||||
if !ok {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
if entry.HasComponent(component.ButtonTag) {
|
|
||||||
status.ButtonState = append(status.ButtonState, getIBPButtonState(data.Common.Id, entry))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for _, data := range ibpStorage.IbpAlarms { // 报警器
|
|
||||||
entry, ok := entity.GetEntityByUid(sim.World, stationUid+"_alarm_"+data.Code)
|
|
||||||
if !ok {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
if entry.HasComponent(component.AlarmTag) {
|
|
||||||
status.AlarmState = append(status.AlarmState, &state.AlarmState{
|
|
||||||
Id: data.Common.Id,
|
|
||||||
Active: component.BitStateType.Get(entry).Val,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for _, data := range ibpStorage.IbpLights { // 指示灯
|
|
||||||
entry, ok := entity.GetEntityByUid(sim.World, stationUid+"_light_"+data.Code)
|
|
||||||
if !ok {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
if entry.HasComponent(component.LightTag) {
|
|
||||||
status.LightState = append(status.LightState, &state.LightState{
|
|
||||||
Id: data.Common.Id,
|
|
||||||
Active: component.BitStateType.Get(entry).Val,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for _, data := range ibpStorage.IbpKeys { // 钥匙
|
|
||||||
entry, ok := entity.GetEntityByUid(sim.World, stationUid+"_key_"+data.Code)
|
|
||||||
if !ok {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
if entry.HasComponent(component.KeyTag) {
|
|
||||||
status.KeyState = append(status.KeyState, &state.KeyState{
|
|
||||||
Id: data.Common.Id,
|
|
||||||
Gear: component.GearStateType.Get(entry).Val,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return status
|
|
||||||
}
|
|
||||||
|
|
||||||
// 获取IBP盘按钮状态
|
|
||||||
func getIBPButtonState(id string, entry *ecs.Entry) *state.ButtonState {
|
|
||||||
status := &state.ButtonState{Id: id}
|
|
||||||
bit := component.BitStateType.Get(entry)
|
|
||||||
status.Down = bit.Val
|
|
||||||
// 如果按钮包含灯
|
|
||||||
if entry.HasComponent(component.SingleLightType) {
|
|
||||||
lightComponent := component.SingleLightType.Get(entry)
|
|
||||||
status.Active = component.BitStateType.Get(lightComponent.Light).Val
|
|
||||||
}
|
|
||||||
return status
|
|
||||||
}
|
|
||||||
|
@ -86,6 +86,14 @@ func QueryGiType(mapId int32) graphicData.PictureType {
|
|||||||
return value.(graphicData.PictureType)
|
return value.(graphicData.PictureType)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func QueryOnlyGiType(mapId int32) graphicData.PictureType {
|
||||||
|
value, ok := giTypeMap.Load(mapId)
|
||||||
|
if !ok {
|
||||||
|
panic(sys_error.New(fmt.Sprintf("[mapId:%d]不存在", mapId)))
|
||||||
|
}
|
||||||
|
return value.(graphicData.PictureType)
|
||||||
|
}
|
||||||
|
|
||||||
func QueryGiData[T proto.Message](mapId int32) T {
|
func QueryGiData[T proto.Message](mapId int32) T {
|
||||||
value, _ := giDataMap.Load(mapId)
|
value, _ := giDataMap.Load(mapId)
|
||||||
return value.(T)
|
return value.(T)
|
||||||
@ -108,7 +116,7 @@ func QueryEcsLinkByDeviceInfo(repo *repository.Repository, mapId int32, status *
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func getStorageIBPMapData(mapCode string) *graphicData.IBPGraphicStorage {
|
func GetStorageIBPMapData(mapCode string) *graphicData.IBPGraphicStorage {
|
||||||
// 处理关联的IBP盘信息
|
// 处理关联的IBP盘信息
|
||||||
if mapCode == "" {
|
if mapCode == "" {
|
||||||
return nil
|
return nil
|
||||||
|
@ -19,7 +19,7 @@ type elementIdStructure struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 数组为Index为 common.ButtonCode, index, uid
|
// 数组为Index为 common.ButtonCode, index, uid
|
||||||
type stationUidStructure struct {
|
type StationUidStructure struct {
|
||||||
AxlePointIds map[string]*elementIdStructure
|
AxlePointIds map[string]*elementIdStructure
|
||||||
TurnoutIds map[string]*elementIdStructure
|
TurnoutIds map[string]*elementIdStructure
|
||||||
PhysicalSectionIds map[string]*elementIdStructure
|
PhysicalSectionIds map[string]*elementIdStructure
|
||||||
@ -34,7 +34,7 @@ type stationUidStructure struct {
|
|||||||
GateBoxIds map[string]*elementIdStructure
|
GateBoxIds map[string]*elementIdStructure
|
||||||
}
|
}
|
||||||
|
|
||||||
type relayUidStructure struct {
|
type RelayUidStructure struct {
|
||||||
RelayCabinetIds map[string]*elementIdStructure
|
RelayCabinetIds map[string]*elementIdStructure
|
||||||
RelayIds map[string]*elementIdStructure
|
RelayIds map[string]*elementIdStructure
|
||||||
}
|
}
|
||||||
@ -65,8 +65,8 @@ func getUIdPrefix(prefix interface{}) (string, string, string) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 初始化平面布置图 UID
|
// 初始化平面布置图 UID
|
||||||
func initStationUid(data *graphicData.RtssGraphicStorage) *stationUidStructure {
|
func initStationUid(data *graphicData.RtssGraphicStorage) *StationUidStructure {
|
||||||
gus := &stationUidStructure{
|
gus := &StationUidStructure{
|
||||||
AxlePointIds: make(map[string]*elementIdStructure, len(data.AxleCountings)),
|
AxlePointIds: make(map[string]*elementIdStructure, len(data.AxleCountings)),
|
||||||
TurnoutIds: make(map[string]*elementIdStructure, len(data.Turnouts)),
|
TurnoutIds: make(map[string]*elementIdStructure, len(data.Turnouts)),
|
||||||
PhysicalSectionIds: make(map[string]*elementIdStructure, len(data.Section)),
|
PhysicalSectionIds: make(map[string]*elementIdStructure, len(data.Section)),
|
||||||
@ -201,8 +201,8 @@ func initStationUid(data *graphicData.RtssGraphicStorage) *stationUidStructure {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 初始化继电器柜 UID
|
// 初始化继电器柜 UID
|
||||||
func initRelayCabinetUid(data *graphicData.RelayCabinetGraphicStorage) *relayUidStructure {
|
func initRelayCabinetUid(data *graphicData.RelayCabinetGraphicStorage) *RelayUidStructure {
|
||||||
rus := &relayUidStructure{
|
rus := &RelayUidStructure{
|
||||||
RelayCabinetIds: make(map[string]*elementIdStructure, len(data.RelayCabinets)),
|
RelayCabinetIds: make(map[string]*elementIdStructure, len(data.RelayCabinets)),
|
||||||
RelayIds: make(map[string]*elementIdStructure, len(data.Relays)),
|
RelayIds: make(map[string]*elementIdStructure, len(data.Relays)),
|
||||||
}
|
}
|
||||||
@ -277,7 +277,7 @@ func buildRepositoryAllUidsMap(mapIds []int32, repo *repository.Repository) map[
|
|||||||
if !ok {
|
if !ok {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
u, ok := d.(*stationUidStructure)
|
u, ok := d.(*StationUidStructure)
|
||||||
if ok {
|
if ok {
|
||||||
saveToAllUidMap(u.AxlePointIds)
|
saveToAllUidMap(u.AxlePointIds)
|
||||||
saveToAllUidMap(u.PhysicalSectionIds)
|
saveToAllUidMap(u.PhysicalSectionIds)
|
||||||
@ -294,7 +294,7 @@ func buildRepositoryAllUidsMap(mapIds []int32, repo *repository.Repository) map[
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 获取地图UID的映射集合
|
// 获取地图UID的映射集合
|
||||||
func queryUidStructure[T *stationUidStructure | *relayUidStructure](mapId int32) T {
|
func QueryUidStructure[T *StationUidStructure | *RelayUidStructure](mapId int32) T {
|
||||||
uidData, ok := giUidMap.Load(mapId)
|
uidData, ok := giUidMap.Load(mapId)
|
||||||
if !ok {
|
if !ok {
|
||||||
panic(fmt.Errorf("id=%d的发布图没有uid缓存数据", mapId))
|
panic(fmt.Errorf("id=%d的发布图没有uid缓存数据", mapId))
|
||||||
@ -306,27 +306,27 @@ func queryUidStructure[T *stationUidStructure | *relayUidStructure](mapId int32)
|
|||||||
func getUidMapByType(uidData any, m interface{}) map[string]*elementIdStructure {
|
func getUidMapByType(uidData any, m interface{}) map[string]*elementIdStructure {
|
||||||
switch m.(type) {
|
switch m.(type) {
|
||||||
case *graphicData.AxleCounting:
|
case *graphicData.AxleCounting:
|
||||||
return (uidData.(*stationUidStructure)).AxlePointIds
|
return (uidData.(*StationUidStructure)).AxlePointIds
|
||||||
case *graphicData.Turnout:
|
case *graphicData.Turnout:
|
||||||
return (uidData.(*stationUidStructure)).TurnoutIds
|
return (uidData.(*StationUidStructure)).TurnoutIds
|
||||||
case *graphicData.Section:
|
case *graphicData.Section:
|
||||||
return (uidData.(*stationUidStructure)).PhysicalSectionIds
|
return (uidData.(*StationUidStructure)).PhysicalSectionIds
|
||||||
case *graphicData.Signal:
|
case *graphicData.Signal:
|
||||||
return (uidData.(*stationUidStructure)).SignalIds
|
return (uidData.(*StationUidStructure)).SignalIds
|
||||||
case *graphicData.Transponder:
|
case *graphicData.Transponder:
|
||||||
return (uidData.(*stationUidStructure)).TransponderIds
|
return (uidData.(*StationUidStructure)).TransponderIds
|
||||||
case *graphicData.Slope:
|
case *graphicData.Slope:
|
||||||
return (uidData.(*stationUidStructure)).SlopeIds
|
return (uidData.(*StationUidStructure)).SlopeIds
|
||||||
case *graphicData.Curvature:
|
case *graphicData.Curvature:
|
||||||
return (uidData.(*stationUidStructure)).CurvatureIds
|
return (uidData.(*StationUidStructure)).CurvatureIds
|
||||||
case *graphicData.RelayCabinet:
|
case *graphicData.RelayCabinet:
|
||||||
return (uidData.(*relayUidStructure)).RelayCabinetIds
|
return (uidData.(*RelayUidStructure)).RelayCabinetIds
|
||||||
case *graphicData.Relay:
|
case *graphicData.Relay:
|
||||||
return (uidData.(*relayUidStructure)).RelayIds
|
return (uidData.(*RelayUidStructure)).RelayIds
|
||||||
case *graphicData.EsbButton:
|
case *graphicData.EsbButton:
|
||||||
return (uidData.(*stationUidStructure)).ButtonIds
|
return (uidData.(*StationUidStructure)).ButtonIds
|
||||||
case *graphicData.Station:
|
case *graphicData.Station:
|
||||||
return (uidData.(*stationUidStructure)).StationIds
|
return (uidData.(*StationUidStructure)).StationIds
|
||||||
default:
|
default:
|
||||||
panic(&dto.ErrorDto{Code: dto.ArgumentParseError, Message: "类型未映射字段"})
|
panic(&dto.ErrorDto{Code: dto.ArgumentParseError, Message: "类型未映射字段"})
|
||||||
}
|
}
|
||||||
|
@ -1,50 +1 @@
|
|||||||
package memory
|
package memory
|
||||||
|
|
||||||
import (
|
|
||||||
"joylink.club/bj-rtsts-server/ts/protos/graphicData"
|
|
||||||
"joylink.club/bj-rtsts-server/ts/protos/state"
|
|
||||||
"joylink.club/rtsssimulation/component"
|
|
||||||
"joylink.club/rtsssimulation/entity"
|
|
||||||
)
|
|
||||||
|
|
||||||
// 获取所有的列车信息
|
|
||||||
func GetMapAllPsdState(vs *VerifySimulation, mapId int32) []*state.PsdState {
|
|
||||||
world := vs.GetSimulationWorld()
|
|
||||||
uidStructure := queryUidStructure[*stationUidStructure](mapId)
|
|
||||||
data := QueryGiData[*graphicData.RtssGraphicStorage](mapId)
|
|
||||||
var psdStateArr []*state.PsdState
|
|
||||||
for _, door := range data.ScreenDoors {
|
|
||||||
uid := uidStructure.PsdIds[door.Common.Id].Uid
|
|
||||||
psdEntry, ok := entity.GetEntityByUid(world, uid)
|
|
||||||
if ok {
|
|
||||||
var amount int32
|
|
||||||
psdState := component.PsdStateType.Get(psdEntry)
|
|
||||||
if psdState.Km8 {
|
|
||||||
amount = 8
|
|
||||||
} else if psdState.Km4 {
|
|
||||||
amount = 4
|
|
||||||
} else {
|
|
||||||
amount = 0
|
|
||||||
}
|
|
||||||
start, end := getStartEndCodeByGroup(door, amount)
|
|
||||||
var openSubDoor []int32
|
|
||||||
for i := start; i <= end; i++ {
|
|
||||||
openSubDoor = append(openSubDoor, i)
|
|
||||||
}
|
|
||||||
psdStateArr = append(psdStateArr, &state.PsdState{
|
|
||||||
Id: door.Common.Id,
|
|
||||||
OpenDoorCodes: openSubDoor,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return psdStateArr
|
|
||||||
}
|
|
||||||
|
|
||||||
func getStartEndCodeByGroup(door *graphicData.ScreenDoor, groupAmount int32) (int32, int32) {
|
|
||||||
for _, group := range door.ScreenDoorGroupList {
|
|
||||||
if group.TrainGroupAmount == groupAmount {
|
|
||||||
return group.StartSmallDoor, group.EndSmallDoor
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return 0, -1
|
|
||||||
}
|
|
||||||
|
@ -4,9 +4,9 @@ import (
|
|||||||
"joylink.club/rtsssimulation/fi"
|
"joylink.club/rtsssimulation/fi"
|
||||||
)
|
)
|
||||||
|
|
||||||
// 操作IBP按钮
|
// 操作PSL按钮
|
||||||
func ChangePSLButtonState(sim *VerifySimulation, mapId int32, gateBoxId, btnCode string, pressDown bool) {
|
func ChangePSLButtonState(sim *VerifySimulation, mapId int32, gateBoxId, btnCode string, pressDown bool) {
|
||||||
uid := queryUidStructure[*stationUidStructure](mapId)
|
uid := QueryUidStructure[*StationUidStructure](mapId)
|
||||||
gateBoxUid := uid.GateBoxIds[gateBoxId].Uid
|
gateBoxUid := uid.GateBoxIds[gateBoxId].Uid
|
||||||
if pressDown {
|
if pressDown {
|
||||||
fi.PressDownButton(sim.World, gateBoxUid+"_"+btnCode)
|
fi.PressDownButton(sim.World, gateBoxUid+"_"+btnCode)
|
||||||
|
@ -2,9 +2,6 @@ package memory
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"joylink.club/bj-rtsts-server/ts/protos/graphicData"
|
"joylink.club/bj-rtsts-server/ts/protos/graphicData"
|
||||||
"joylink.club/bj-rtsts-server/ts/protos/state"
|
|
||||||
"joylink.club/rtsssimulation/component"
|
|
||||||
"joylink.club/rtsssimulation/entity"
|
|
||||||
"joylink.club/rtsssimulation/fi"
|
"joylink.club/rtsssimulation/fi"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -17,21 +14,3 @@ func ChangeRelayState(sim *VerifySimulation, mapId int32, id string, td bool) {
|
|||||||
fi.DriveRelayDown(sim.World, uid)
|
fi.DriveRelayDown(sim.World, uid)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取仿真地图的继电器状态,前端推送
|
|
||||||
func GetMapAllRelayState(sim *VerifySimulation, mapId int32) []*state.ReplyState {
|
|
||||||
// 获取本地图下的继电器信息
|
|
||||||
uidMap := QueryMapUidMapByType(mapId, &graphicData.Relay{})
|
|
||||||
var replyStateArr []*state.ReplyState
|
|
||||||
for _, u := range uidMap {
|
|
||||||
entry, ok := entity.GetEntityByUid(sim.World, u.Uid)
|
|
||||||
if !ok {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
if entry.HasComponent(component.RelayTag) {
|
|
||||||
bit := component.BitStateType.Get(entry)
|
|
||||||
replyStateArr = append(replyStateArr, &state.ReplyState{Id: u.CommonId, Xh: bit.Val})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return replyStateArr
|
|
||||||
}
|
|
||||||
|
@ -6,41 +6,9 @@ import (
|
|||||||
"joylink.club/bj-rtsts-server/dto"
|
"joylink.club/bj-rtsts-server/dto"
|
||||||
"joylink.club/bj-rtsts-server/dto/request_proto"
|
"joylink.club/bj-rtsts-server/dto/request_proto"
|
||||||
"joylink.club/bj-rtsts-server/ts/protos/graphicData"
|
"joylink.club/bj-rtsts-server/ts/protos/graphicData"
|
||||||
"joylink.club/bj-rtsts-server/ts/protos/state"
|
|
||||||
"joylink.club/ecs"
|
|
||||||
"joylink.club/rtsssimulation/component"
|
|
||||||
"joylink.club/rtsssimulation/entity"
|
|
||||||
"joylink.club/rtsssimulation/fi"
|
"joylink.club/rtsssimulation/fi"
|
||||||
)
|
)
|
||||||
|
|
||||||
func GetMapAllSectionState(sim *VerifySimulation, mapId int32) []*state.SectionState {
|
|
||||||
uidMap := QueryMapUidMapByType(mapId, &graphicData.Section{})
|
|
||||||
var sectionArr []*state.SectionState
|
|
||||||
for _, u := range uidMap {
|
|
||||||
s := handlerSectionState(sim.World, u.Uid)
|
|
||||||
if s == nil {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
s.Id = u.CommonId
|
|
||||||
sectionArr = append(sectionArr, s)
|
|
||||||
}
|
|
||||||
return sectionArr
|
|
||||||
}
|
|
||||||
func handlerSectionState(w ecs.World, uid string) *state.SectionState {
|
|
||||||
entry, ok := entity.GetEntityByUid(w, uid)
|
|
||||||
if !ok {
|
|
||||||
//fmt.Printf("id=%s的信号机不存在", uid)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
if entry.HasComponent(component.AxleSectionTag) { //计轴区段
|
|
||||||
sectionState := &state.SectionState{}
|
|
||||||
axleState := component.AxleSectionStateType.Get(entry)
|
|
||||||
sectionState.Occupied = axleState.Occ
|
|
||||||
sectionState.Type = state.SectionType_Axle
|
|
||||||
return sectionState
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
func ChangeAxleSectionState(simulation *VerifySimulation, req *dto.AxleSectionOperationReqDto) {
|
func ChangeAxleSectionState(simulation *VerifySimulation, req *dto.AxleSectionOperationReqDto) {
|
||||||
sectionUid := QueryUidByMidAndComId(req.MapId, req.DeviceId, &graphicData.Section{})
|
sectionUid := QueryUidByMidAndComId(req.MapId, req.DeviceId, &graphicData.Section{})
|
||||||
slog.Debug("操作计轴区段", "axleSectionUid", sectionUid)
|
slog.Debug("操作计轴区段", "axleSectionUid", sectionUid)
|
||||||
|
@ -9,10 +9,8 @@ import (
|
|||||||
"joylink.club/bj-rtsts-server/ts/protos/graphicData"
|
"joylink.club/bj-rtsts-server/ts/protos/graphicData"
|
||||||
"joylink.club/bj-rtsts-server/ts/protos/state"
|
"joylink.club/bj-rtsts-server/ts/protos/state"
|
||||||
"joylink.club/ecs"
|
"joylink.club/ecs"
|
||||||
"joylink.club/rtsssimulation/component"
|
|
||||||
"joylink.club/rtsssimulation/component/component_proto"
|
"joylink.club/rtsssimulation/component/component_proto"
|
||||||
"joylink.club/rtsssimulation/consts"
|
"joylink.club/rtsssimulation/consts"
|
||||||
"joylink.club/rtsssimulation/entity"
|
|
||||||
"joylink.club/rtsssimulation/fi"
|
"joylink.club/rtsssimulation/fi"
|
||||||
"joylink.club/rtsssimulation/repository"
|
"joylink.club/rtsssimulation/repository"
|
||||||
"joylink.club/rtsssimulation/repository/model/proto"
|
"joylink.club/rtsssimulation/repository/model/proto"
|
||||||
@ -228,66 +226,3 @@ func changeSignal2XH1State(w ecs.World, signalUid string, toAspect state.Signal_
|
|||||||
panic(dto.ErrorDto{Code: dto.OperationOfSignalNotSupported, Message: dto.ErrorTipMap[dto.OperationOfSignalNotSupported]})
|
panic(dto.ErrorDto{Code: dto.OperationOfSignalNotSupported, Message: dto.ErrorTipMap[dto.OperationOfSignalNotSupported]})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取仿真地图的信号机状态,用于推送给前端
|
|
||||||
func GetMapAllSignalState(sim *VerifySimulation, mapId int32) []*state.SignalState {
|
|
||||||
uidMap := QueryMapUidMapByType(mapId, &graphicData.Signal{})
|
|
||||||
var signalArr []*state.SignalState
|
|
||||||
for _, u := range uidMap {
|
|
||||||
s := handlerSignalState(sim.World, u.Uid)
|
|
||||||
if s == nil {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
s.Id = u.CommonId
|
|
||||||
signalArr = append(signalArr, s)
|
|
||||||
}
|
|
||||||
return signalArr
|
|
||||||
}
|
|
||||||
func handlerSignalState(w ecs.World, uid string) *state.SignalState {
|
|
||||||
entry, ok := entity.GetEntityByUid(w, uid)
|
|
||||||
if !ok {
|
|
||||||
//fmt.Printf("id=%s的信号机不存在", uid)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
if !entry.HasComponent(component.SignalLightsType) { //信号机灯列表
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
signalState := &state.SignalState{}
|
|
||||||
lights := component.SignalLightsType.Get(entry)
|
|
||||||
isL := false
|
|
||||||
isH := false
|
|
||||||
isU := false
|
|
||||||
isA := false
|
|
||||||
isB := false
|
|
||||||
for _, light := range lights.Lights {
|
|
||||||
switch {
|
|
||||||
case light.HasComponent(component.LdTag):
|
|
||||||
isL = component.BitStateType.Get(light).Val
|
|
||||||
case light.HasComponent(component.HdTag):
|
|
||||||
isH = component.BitStateType.Get(light).Val
|
|
||||||
case light.HasComponent(component.UdTag):
|
|
||||||
isU = component.BitStateType.Get(light).Val
|
|
||||||
case light.HasComponent(component.BdTag):
|
|
||||||
isB = component.BitStateType.Get(light).Val
|
|
||||||
case light.HasComponent(component.AdTag):
|
|
||||||
isA = component.BitStateType.Get(light).Val
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if isH && isU {
|
|
||||||
signalState.Aspect = state.Signal_HU
|
|
||||||
} else {
|
|
||||||
switch {
|
|
||||||
case isL:
|
|
||||||
signalState.Aspect = state.Signal_L
|
|
||||||
case isH:
|
|
||||||
signalState.Aspect = state.Signal_H
|
|
||||||
case isU:
|
|
||||||
signalState.Aspect = state.Signal_U
|
|
||||||
case isB:
|
|
||||||
signalState.Aspect = state.Signal_B
|
|
||||||
case isA:
|
|
||||||
signalState.Aspect = state.Signal_A
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return signalState
|
|
||||||
}
|
|
||||||
|
@ -2,13 +2,10 @@ package memory
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"joylink.club/bj-rtsts-server/ts/protos/graphicData"
|
"joylink.club/bj-rtsts-server/ts/protos/graphicData"
|
||||||
"joylink.club/bj-rtsts-server/ts/protos/state"
|
|
||||||
"joylink.club/rtsssimulation/component"
|
|
||||||
"joylink.club/rtsssimulation/entity"
|
|
||||||
"joylink.club/rtsssimulation/fi"
|
"joylink.club/rtsssimulation/fi"
|
||||||
)
|
)
|
||||||
|
|
||||||
// 操作IBP按钮
|
// 操作esb按钮
|
||||||
func ChangeEsbButtonState(sim *VerifySimulation, mapId int32, btnId string, pressDown bool) {
|
func ChangeEsbButtonState(sim *VerifySimulation, mapId int32, btnId string, pressDown bool) {
|
||||||
uid := QueryUidByMidAndComId(mapId, btnId, &graphicData.EsbButton{})
|
uid := QueryUidByMidAndComId(mapId, btnId, &graphicData.EsbButton{})
|
||||||
if pressDown {
|
if pressDown {
|
||||||
@ -17,21 +14,3 @@ func ChangeEsbButtonState(sim *VerifySimulation, mapId int32, btnId string, pres
|
|||||||
fi.PressUpButton(sim.World, uid)
|
fi.PressUpButton(sim.World, uid)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取仿真车站按钮状态,前端推送
|
|
||||||
func GetMapAllStationButtonState(sim *VerifySimulation, mapId int32) []*state.ButtonState {
|
|
||||||
// 获取地图上的按钮状态
|
|
||||||
var btnStateArr []*state.ButtonState
|
|
||||||
uidMap := QueryMapUidMapByType(mapId, &graphicData.EsbButton{})
|
|
||||||
for _, u := range uidMap {
|
|
||||||
entry, ok := entity.GetEntityByUid(sim.World, u.Uid)
|
|
||||||
if !ok {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
if entry.HasComponent(component.ButtonTag) { // 按钮
|
|
||||||
bit := component.BitStateType.Get(entry)
|
|
||||||
btnStateArr = append(btnStateArr, &state.ButtonState{Id: u.CommonId, Down: bit.Val})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return btnStateArr
|
|
||||||
}
|
|
||||||
|
@ -80,9 +80,6 @@ func RemoveTrainState(vs *VerifySimulation, id string) {
|
|||||||
err := dynamics.Default().RequestRemoveTrain(&message.RemoveTrainReq{
|
err := dynamics.Default().RequestRemoveTrain(&message.RemoveTrainReq{
|
||||||
TrainIndex: uint16(trainIndex),
|
TrainIndex: uint16(trainIndex),
|
||||||
})
|
})
|
||||||
// httpCode, _, err := dynamics.SendRemoveTrainReq(&dynamics.InitTrainInfo{
|
|
||||||
// TrainIndex: uint16(trainIndex),
|
|
||||||
// })
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(dto.ErrorDto{Code: dto.DynamicsError, Message: err.Error()})
|
panic(dto.ErrorDto{Code: dto.DynamicsError, Message: err.Error()})
|
||||||
}
|
}
|
||||||
@ -95,29 +92,3 @@ func RemoveTrainState(vs *VerifySimulation, id string) {
|
|||||||
panic(fmt.Sprintf("列车【%s】不存在", id))
|
panic(fmt.Sprintf("列车【%s】不存在", id))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取所有的列车信息
|
|
||||||
func GetAllTrainState(vs *VerifySimulation) []*state.TrainState {
|
|
||||||
allTrainMap := &vs.Memory.Status.TrainStateMap
|
|
||||||
var trainArr []*state.TrainState
|
|
||||||
allTrainMap.Range(func(_, v any) bool {
|
|
||||||
trainArr = append(trainArr, v.(*state.TrainState))
|
|
||||||
return true
|
|
||||||
})
|
|
||||||
return trainArr
|
|
||||||
}
|
|
||||||
|
|
||||||
// 获取移除列车ID并清空
|
|
||||||
func GetRemovedTrainId(vs *VerifySimulation) []string {
|
|
||||||
ids := vs.Memory.ChangeStatus.RemoveTrainId
|
|
||||||
length := len(ids)
|
|
||||||
if length > 0 {
|
|
||||||
copyData := make([]string, length)
|
|
||||||
// 将数据复制到新的切片空间中
|
|
||||||
copy(copyData, ids)
|
|
||||||
// 清空变更信息
|
|
||||||
vs.Memory.ChangeStatus.RemoveTrainId = []string{}
|
|
||||||
return copyData
|
|
||||||
}
|
|
||||||
return []string{}
|
|
||||||
}
|
|
||||||
|
@ -54,22 +54,6 @@ func GetAllTurnoutState(sim *VerifySimulation) []*state.SwitchState {
|
|||||||
return switchArr
|
return switchArr
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取仿真地图的道岔状态,前端推送
|
|
||||||
func GetMapAllTurnoutState(sim *VerifySimulation, mapId int32) []*state.SwitchState {
|
|
||||||
// 获取本地图下的道岔信息
|
|
||||||
uidMap := QueryMapUidMapByType(mapId, &graphicData.Turnout{})
|
|
||||||
var switchArr []*state.SwitchState
|
|
||||||
for _, u := range uidMap {
|
|
||||||
s := handlerTurnoutState(sim.World, u.Uid)
|
|
||||||
if s == nil {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
s.Id = u.CommonId
|
|
||||||
switchArr = append(switchArr, s)
|
|
||||||
}
|
|
||||||
return switchArr
|
|
||||||
}
|
|
||||||
|
|
||||||
func handlerTurnoutState(w ecs.World, uid string) *state.SwitchState {
|
func handlerTurnoutState(w ecs.World, uid string) *state.SwitchState {
|
||||||
entry, ok := entity.GetEntityByUid(w, uid)
|
entry, ok := entity.GetEntityByUid(w, uid)
|
||||||
if !ok {
|
if !ok {
|
||||||
|
@ -5,20 +5,16 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"log/slog"
|
"log/slog"
|
||||||
"math"
|
"math"
|
||||||
"runtime"
|
|
||||||
"sort"
|
"sort"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
rtss_simulation "joylink.club/rtsssimulation"
|
|
||||||
|
|
||||||
"joylink.club/bj-rtsts-server/config"
|
"joylink.club/bj-rtsts-server/config"
|
||||||
"joylink.club/bj-rtsts-server/dto"
|
"joylink.club/bj-rtsts-server/dto"
|
||||||
"joylink.club/bj-rtsts-server/sys_error"
|
"joylink.club/bj-rtsts-server/sys_error"
|
||||||
"joylink.club/bj-rtsts-server/third_party/dynamics"
|
"joylink.club/bj-rtsts-server/third_party/dynamics"
|
||||||
"joylink.club/bj-rtsts-server/third_party/interlock"
|
|
||||||
"joylink.club/bj-rtsts-server/third_party/message"
|
"joylink.club/bj-rtsts-server/third_party/message"
|
||||||
"joylink.club/bj-rtsts-server/third_party/semi_physical_train"
|
"joylink.club/bj-rtsts-server/third_party/semi_physical_train"
|
||||||
"joylink.club/bj-rtsts-server/ts/protos/graphicData"
|
"joylink.club/bj-rtsts-server/ts/protos/graphicData"
|
||||||
@ -47,6 +43,8 @@ type VerifySimulation struct {
|
|||||||
uidMap map[string]*elementIdStructure
|
uidMap map[string]*elementIdStructure
|
||||||
// 运行环境配置
|
// 运行环境配置
|
||||||
runConfig *config.ThridPartyConfig
|
runConfig *config.ThridPartyConfig
|
||||||
|
// 运行状态
|
||||||
|
runState state.SimulationStatus_SimulationState
|
||||||
}
|
}
|
||||||
|
|
||||||
// 轨旁仿真内存模型
|
// 轨旁仿真内存模型
|
||||||
@ -93,12 +91,16 @@ func NewWaysideMemory() *WaysideMemory {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 创建仿真对象
|
// 创建仿真对象
|
||||||
func CreateSimulation(projectId int32, mapIds []int32, runConfig string) (*VerifySimulation, error) {
|
func CreateSimulation(projectId int32, mapIds []int32, runConfig *dto.ProjectRunConfigDto) (*VerifySimulation, error) {
|
||||||
// 地图信息
|
// 地图信息
|
||||||
sort.Slice(mapIds, func(i, j int) bool {
|
sort.Slice(mapIds, func(i, j int) bool {
|
||||||
return mapIds[i] < mapIds[j]
|
return QueryOnlyGiType(mapIds[i]) < QueryOnlyGiType(mapIds[j])
|
||||||
})
|
})
|
||||||
verifySimulation := &VerifySimulation{ProjectId: projectId, MapIds: mapIds}
|
verifySimulation := &VerifySimulation{
|
||||||
|
ProjectId: projectId,
|
||||||
|
MapIds: mapIds,
|
||||||
|
runState: state.SimulationStatus_PAUSE,
|
||||||
|
}
|
||||||
// 设置运行环境
|
// 设置运行环境
|
||||||
err := verifySimulation.initRunConfig(runConfig)
|
err := verifySimulation.initRunConfig(runConfig)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -109,89 +111,27 @@ func CreateSimulation(projectId int32, mapIds []int32, runConfig string) (*Verif
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
// 创建world
|
|
||||||
err = verifySimulation.initWorld()
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
// 运行第三方服务
|
|
||||||
err = verifySimulation.runThirdParty()
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return verifySimulation, nil
|
return verifySimulation, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取全量状态
|
// 启动
|
||||||
func (s *VerifySimulation) GetAllState(mapId int32) *state.PushedDevicesStatus {
|
func (s *VerifySimulation) Start() {
|
||||||
giType := QueryGiType(mapId)
|
s.runState = state.SimulationStatus_START
|
||||||
switch giType {
|
|
||||||
case graphicData.PictureType_StationLayout:
|
|
||||||
return &state.PushedDevicesStatus{
|
|
||||||
All: true,
|
|
||||||
AllStatus: &state.AllDevicesStatus{
|
|
||||||
SwitchState: GetMapAllTurnoutState(s, mapId),
|
|
||||||
TrainState: GetAllTrainState(s),
|
|
||||||
SignalState: GetMapAllSignalState(s, mapId),
|
|
||||||
ButtonState: GetMapAllStationButtonState(s, mapId),
|
|
||||||
PsdState: GetMapAllPsdState(s, mapId),
|
|
||||||
SectionState: GetMapAllSectionState(s, mapId),
|
|
||||||
},
|
|
||||||
}
|
|
||||||
case graphicData.PictureType_RelayCabinetLayout:
|
|
||||||
return &state.PushedDevicesStatus{
|
|
||||||
All: true,
|
|
||||||
AllStatus: &state.AllDevicesStatus{
|
|
||||||
ReplyState: GetMapAllRelayState(s, mapId),
|
|
||||||
},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return &state.PushedDevicesStatus{}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取门控箱状态
|
// 销毁
|
||||||
func (s *VerifySimulation) GetAllPSLState(mapId int32, boxId string) *state.PushedDevicesStatus {
|
func (s *VerifySimulation) Destroy() {
|
||||||
//world := s.GetSimulationWorld()
|
s.runState = state.SimulationStatus_DESTROY
|
||||||
//uidStructure := queryUidStructure[*stationUidStructure](mapId)
|
|
||||||
//boxUid := uidStructure.GateBoxIds[boxId].Uid
|
|
||||||
//mkxEntry, ok := entity.GetEntityByUid(world, boxUid)
|
|
||||||
//var buttonStateArr []*state.ButtonState
|
|
||||||
//if ok {
|
|
||||||
// mkxCircuit := component.MkxCircuitType.Get(mkxEntry)
|
|
||||||
// var boxArr []*ecs.Entry
|
|
||||||
// boxArr = append(boxArr, mkxCircuit.PcbList...)
|
|
||||||
// boxArr = append(boxArr, mkxCircuit.PobList...)
|
|
||||||
// boxArr = append(boxArr, mkxCircuit.PabList...)
|
|
||||||
// for _, mkxBoxEntry := range boxArr {
|
|
||||||
// mkxBox := component.MkxBoxType.Get(mkxBoxEntry)
|
|
||||||
// uid := component.UidType.Get(mkxBox.Btn).Id
|
|
||||||
// down := component.BitStateType.Get(mkxBox.Btn).Val
|
|
||||||
// buttonStateArr = append(buttonStateArr, &state.ButtonState{
|
|
||||||
// Id: uid,
|
|
||||||
// Down: down,
|
|
||||||
// })
|
|
||||||
// }
|
|
||||||
//}
|
|
||||||
//return &state.PushedDevicesStatus{
|
|
||||||
// All: true,
|
|
||||||
// AllStatus: &state.AllDevicesStatus{
|
|
||||||
// ButtonState: buttonStateArr,
|
|
||||||
// },
|
|
||||||
//}
|
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取车站IBP状态
|
// 暂停
|
||||||
func (s *VerifySimulation) GetAllIBPState(mapId int32, stationId string, ibpMapCode string) *state.PushedDevicesStatus {
|
func (s *VerifySimulation) Pause() {
|
||||||
return &state.PushedDevicesStatus{
|
s.runState = state.SimulationStatus_PAUSE
|
||||||
All: true,
|
|
||||||
AllStatus: GetMapAllIBPState(s, mapId, stationId, ibpMapCode),
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取仿真世界信息
|
// 获取状态
|
||||||
func (s *VerifySimulation) GetSimulationWorld() ecs.World {
|
func (s *VerifySimulation) GetRunState() state.SimulationStatus_SimulationState {
|
||||||
return s.World
|
return s.runState
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取仿真世界信息
|
// 获取仿真世界信息
|
||||||
@ -285,10 +225,6 @@ func convert(info *message.DynamicsTrainInfo, sta *state.TrainState, simulation
|
|||||||
|
|
||||||
// 获取动力学配置信息
|
// 获取动力学配置信息
|
||||||
func (s *VerifySimulation) GetDynamicsRunConfig() *config.DynamicsConfig {
|
func (s *VerifySimulation) GetDynamicsRunConfig() *config.DynamicsConfig {
|
||||||
// TODO:目前为了兼容当前配置方式,做成查询方式后删除IP判断
|
|
||||||
if config.Config.Dynamics.Ip != "" {
|
|
||||||
return &config.Config.Dynamics
|
|
||||||
}
|
|
||||||
return &s.runConfig.Dynamics
|
return &s.runConfig.Dynamics
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -387,15 +323,11 @@ func (s *VerifySimulation) HandleSemiPhysicalTrainControlMsg(b []byte) {
|
|||||||
|
|
||||||
// 获取半实物运行配置信息
|
// 获取半实物运行配置信息
|
||||||
func (s *VerifySimulation) GetSemiPhysicalRunConfig() *config.VobcConfig {
|
func (s *VerifySimulation) GetSemiPhysicalRunConfig() *config.VobcConfig {
|
||||||
// TODO:目前为了兼容当前配置方式,做成查询方式后删除IP判断
|
|
||||||
if config.Config.Vobc.Ip != "" {
|
|
||||||
return &config.Config.Vobc
|
|
||||||
}
|
|
||||||
return &s.runConfig.Vobc
|
return &s.runConfig.Vobc
|
||||||
}
|
}
|
||||||
|
|
||||||
// 处理接到的联锁消息
|
// 处理接到的联锁消息
|
||||||
func (s *VerifySimulation) HandleDriverInfo(b []byte) {
|
func (s *VerifySimulation) HandleInterlockDriverInfo(b []byte) {
|
||||||
driverMsg := message.NewInterlockReceiveMsgPkg(0, 128, 8*131)
|
driverMsg := message.NewInterlockReceiveMsgPkg(0, 128, 8*131)
|
||||||
driverMsg.Decode(b)
|
driverMsg.Decode(b)
|
||||||
driveState := driverMsg.DriveInfo
|
driveState := driverMsg.DriveInfo
|
||||||
@ -408,42 +340,72 @@ func (s *VerifySimulation) HandleDriverInfo(b []byte) {
|
|||||||
|
|
||||||
// 获取联锁配置
|
// 获取联锁配置
|
||||||
func (s *VerifySimulation) GetInterlockRunConfig() *config.InterlockConfig {
|
func (s *VerifySimulation) GetInterlockRunConfig() *config.InterlockConfig {
|
||||||
// TODO:目前为了兼容当前配置方式,做成查询方式后删除IP判断
|
|
||||||
if config.Config.Interlock.Ip != "" {
|
|
||||||
return &config.Config.Interlock
|
|
||||||
}
|
|
||||||
return &s.runConfig.Interlock
|
return &s.runConfig.Interlock
|
||||||
}
|
}
|
||||||
|
|
||||||
// 采集联锁中的继电器消息
|
// 采集联锁中的继电器消息
|
||||||
func (s *VerifySimulation) CollectRelayInfo() *message.InterlockSendMsgPkg {
|
func (s *VerifySimulation) CollectInterlockRelayInfo() []*message.InterlockSendMsgPkg {
|
||||||
msg := &message.InterlockSendMsgPkg{}
|
var msgPkgs []*message.InterlockSendMsgPkg
|
||||||
relayArr := make([]string, 256)
|
for _, mapId := range s.MapIds { // 获取继电器地图信息
|
||||||
for index, id := range relayArr {
|
if QueryOnlyGiType(mapId) != graphicData.PictureType_RelayCabinetLayout { // 继电器柜
|
||||||
if index%2 == 0 {
|
continue
|
||||||
msg.Info = append(msg.Info, fi.CollectXQCircuitState(s.World, id))
|
|
||||||
} else {
|
|
||||||
msg.Info = append(msg.Info, fi.CollectLXCircuitState(s.World, id))
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
mapData := QueryGiData[*graphicData.RelayCabinetGraphicStorage](mapId)
|
||||||
|
// 配置继电器为空
|
||||||
|
dataLenght := len(mapData.CiCjList.CjList) * int(mapData.CiCjList.DsCount)
|
||||||
|
if dataLenght == 0 {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
index := 0
|
||||||
|
collectInfo := make([]bool, dataLenght)
|
||||||
|
uidMap := QueryUidStructure[*RelayUidStructure](mapId)
|
||||||
|
// 遍历继电器获取继电器状态
|
||||||
|
for _, col := range mapData.CiCjList.CjList {
|
||||||
|
for _, row := range col.BitList {
|
||||||
|
rs := len(row.RefRelays) > 0
|
||||||
|
for _, j := range row.RefRelays {
|
||||||
|
u := uidMap.RelayIds[j.RelayId]
|
||||||
|
if u == nil {
|
||||||
|
panic(sys_error.New(fmt.Sprintf("地图【id:%d】不存在继电器的【comId:%s】UID映射关系", mapId, j.RelayId)))
|
||||||
|
}
|
||||||
|
if j.Position == graphicData.CjDataItem_Q {
|
||||||
|
rs = rs && fi.CollectXQCircuitState(s.World, u.Uid)
|
||||||
|
} else {
|
||||||
|
rs = rs && fi.CollectLXCircuitState(s.World, u.Uid)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
collectInfo[index] = rs
|
||||||
|
index++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
msgPkgs = append(msgPkgs, &message.InterlockSendMsgPkg{Info: collectInfo})
|
||||||
}
|
}
|
||||||
return msg
|
return msgPkgs
|
||||||
}
|
}
|
||||||
|
|
||||||
// 初始化仿真运行配置
|
// 初始化仿真运行配置
|
||||||
func (s *VerifySimulation) initRunConfig(configStr string) error {
|
func (s *VerifySimulation) initRunConfig(runConfig *dto.ProjectRunConfigDto) error {
|
||||||
if configStr == "" {
|
if runConfig == nil || runConfig.ConfigContent == "" {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
var configMap config.ThridPartyConfig
|
var configMap config.ThridPartyConfig
|
||||||
err := json.Unmarshal([]byte(configStr), &configMap)
|
err := json.Unmarshal([]byte(runConfig.ConfigContent), &configMap)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return sys_error.New("配置信息格式错误", err)
|
return sys_error.New("配置信息格式错误", err)
|
||||||
}
|
}
|
||||||
s.runConfig = &configMap
|
s.runConfig = &configMap
|
||||||
|
s.runConfig.Id = runConfig.Id
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 获取仿真运行参数ID
|
||||||
|
func (s *VerifySimulation) GetRunConfigId() int32 {
|
||||||
|
if s.runConfig == nil {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
return s.runConfig.Id
|
||||||
|
}
|
||||||
|
|
||||||
// 初始化运行资源
|
// 初始化运行资源
|
||||||
func (s *VerifySimulation) initRepository() error {
|
func (s *VerifySimulation) initRepository() error {
|
||||||
// 构建Repository
|
// 构建Repository
|
||||||
@ -473,48 +435,6 @@ func (s *VerifySimulation) initRepository() error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// 创建world
|
|
||||||
func (s *VerifySimulation) initWorld() error {
|
|
||||||
//创建仿真
|
|
||||||
w, err := rtss_simulation.NewSimulation(s.Repo)
|
|
||||||
if err != nil {
|
|
||||||
return sys_error.New("仿真创建失败", err)
|
|
||||||
}
|
|
||||||
s.World = w
|
|
||||||
// 保证World关闭
|
|
||||||
runtime.SetFinalizer(s, func(verifySimulation *VerifySimulation) {
|
|
||||||
slog.Info("---关闭仿真World---")
|
|
||||||
verifySimulation.World.Close()
|
|
||||||
})
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// 运行仿真第三方模块
|
|
||||||
func (s *VerifySimulation) runThirdParty() error {
|
|
||||||
// 动力学启动
|
|
||||||
err := dynamics.Default().Start(s)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
// 半实物启动
|
|
||||||
semi_physical_train.Default().Start(s)
|
|
||||||
// 联锁启动
|
|
||||||
interlock.Default().Start(s)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// 停止仿真
|
|
||||||
func (s *VerifySimulation) StopSimulation() {
|
|
||||||
// 停止ecs world
|
|
||||||
s.World.Close()
|
|
||||||
// 停止动力学接口功能
|
|
||||||
dynamics.Default().Stop()
|
|
||||||
// 停止半实物
|
|
||||||
semi_physical_train.Default().Stop()
|
|
||||||
// 联锁启动
|
|
||||||
interlock.Default().Stop()
|
|
||||||
}
|
|
||||||
|
|
||||||
func buildProtoRepository(mapIds []int32) (*proto.Repository, error) {
|
func buildProtoRepository(mapIds []int32) (*proto.Repository, error) {
|
||||||
repo := &proto.Repository{}
|
repo := &proto.Repository{}
|
||||||
var exceptStationGiMapIds []int32
|
var exceptStationGiMapIds []int32
|
||||||
@ -540,7 +460,7 @@ func buildProtoRepository(mapIds []int32) (*proto.Repository, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func buildAndRelateElectronicComponent(repo *proto.Repository, relayGi *graphicData.RelayCabinetGraphicStorage, mapId int32) {
|
func buildAndRelateElectronicComponent(repo *proto.Repository, relayGi *graphicData.RelayCabinetGraphicStorage, mapId int32) {
|
||||||
uidsMap := queryUidStructure[*relayUidStructure](mapId)
|
uidsMap := QueryUidStructure[*RelayUidStructure](mapId)
|
||||||
city := relayGi.UniqueIdPrefix.City
|
city := relayGi.UniqueIdPrefix.City
|
||||||
lineId := relayGi.UniqueIdPrefix.LineId
|
lineId := relayGi.UniqueIdPrefix.LineId
|
||||||
station := relayGi.UniqueIdPrefix.BelongsConcentrationStation
|
station := relayGi.UniqueIdPrefix.BelongsConcentrationStation
|
||||||
@ -721,7 +641,7 @@ func convertRelayModel(modelType graphicData.Relay_ModelType) proto.Relay_Model
|
|||||||
func fillProtoRepository(repo *proto.Repository, storage *graphicData.RtssGraphicStorage, mapId int32) {
|
func fillProtoRepository(repo *proto.Repository, storage *graphicData.RtssGraphicStorage, mapId int32) {
|
||||||
repo.MainCoordinateSystem = storage.UniqueIdPrefix.MainCoordinateSystem
|
repo.MainCoordinateSystem = storage.UniqueIdPrefix.MainCoordinateSystem
|
||||||
axleCountingMap := make(map[string]*graphicData.AxleCounting)
|
axleCountingMap := make(map[string]*graphicData.AxleCounting)
|
||||||
uidsMap := queryUidStructure[*stationUidStructure](mapId)
|
uidsMap := QueryUidStructure[*StationUidStructure](mapId)
|
||||||
for _, data := range storage.AxleCountings {
|
for _, data := range storage.AxleCountings {
|
||||||
axleCountingMap[data.Common.Id] = data
|
axleCountingMap[data.Common.Id] = data
|
||||||
cpType := proto.CheckPointType_AxleCounter
|
cpType := proto.CheckPointType_AxleCounter
|
||||||
@ -947,7 +867,7 @@ func fillProtoRepository(repo *proto.Repository, storage *graphicData.RtssGraphi
|
|||||||
|
|
||||||
// 将IBP的设备关联到车站中
|
// 将IBP的设备关联到车站中
|
||||||
func handlerIBPDeviceToStation(station *proto.Station, repo *proto.Repository, ibpMap string) {
|
func handlerIBPDeviceToStation(station *proto.Station, repo *proto.Repository, ibpMap string) {
|
||||||
storage := getStorageIBPMapData(ibpMap)
|
storage := GetStorageIBPMapData(ibpMap)
|
||||||
if storage == nil {
|
if storage == nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -1036,7 +956,7 @@ func handlerIBPDeviceToStation(station *proto.Station, repo *proto.Repository, i
|
|||||||
station.ElectronicGroup = append(station.ElectronicGroup, empGroup, spksGroup)
|
station.ElectronicGroup = append(station.ElectronicGroup, empGroup, spksGroup)
|
||||||
}
|
}
|
||||||
|
|
||||||
func converCheckPointUid(data *proto.CheckPoint, uidsMap *stationUidStructure) *proto.CheckPoint {
|
func converCheckPointUid(data *proto.CheckPoint, uidsMap *StationUidStructure) *proto.CheckPoint {
|
||||||
data.Id = uidsMap.AxlePointIds[data.Id].Uid
|
data.Id = uidsMap.AxlePointIds[data.Id].Uid
|
||||||
for _, c := range data.DevicePorts {
|
for _, c := range data.DevicePorts {
|
||||||
c.DeviceId = converRefUid(c.DeviceId, c.DeviceType, uidsMap)
|
c.DeviceId = converRefUid(c.DeviceId, c.DeviceType, uidsMap)
|
||||||
@ -1044,7 +964,7 @@ func converCheckPointUid(data *proto.CheckPoint, uidsMap *stationUidStructure) *
|
|||||||
return data
|
return data
|
||||||
}
|
}
|
||||||
|
|
||||||
func converSectionUid(data *proto.PhysicalSection, uidsMap *stationUidStructure) *proto.PhysicalSection {
|
func converSectionUid(data *proto.PhysicalSection, uidsMap *StationUidStructure) *proto.PhysicalSection {
|
||||||
data.Id = uidsMap.PhysicalSectionIds[data.Id].Uid
|
data.Id = uidsMap.PhysicalSectionIds[data.Id].Uid
|
||||||
if data.ADevicePort != nil {
|
if data.ADevicePort != nil {
|
||||||
data.ADevicePort.DeviceId = converRefUid(data.ADevicePort.DeviceId, data.ADevicePort.DeviceType, uidsMap)
|
data.ADevicePort.DeviceId = converRefUid(data.ADevicePort.DeviceId, data.ADevicePort.DeviceType, uidsMap)
|
||||||
@ -1060,7 +980,7 @@ func converSectionUid(data *proto.PhysicalSection, uidsMap *stationUidStructure)
|
|||||||
return data
|
return data
|
||||||
}
|
}
|
||||||
|
|
||||||
func converTurnoutUid(data *proto.Turnout, uidsMap *stationUidStructure) *proto.Turnout {
|
func converTurnoutUid(data *proto.Turnout, uidsMap *StationUidStructure) *proto.Turnout {
|
||||||
data.Id = uidsMap.TurnoutIds[data.Id].Uid
|
data.Id = uidsMap.TurnoutIds[data.Id].Uid
|
||||||
if data.ADevicePort != nil {
|
if data.ADevicePort != nil {
|
||||||
data.ADevicePort.DeviceId = converRefUid(data.ADevicePort.DeviceId, data.ADevicePort.DeviceType, uidsMap)
|
data.ADevicePort.DeviceId = converRefUid(data.ADevicePort.DeviceId, data.ADevicePort.DeviceType, uidsMap)
|
||||||
@ -1074,7 +994,7 @@ func converTurnoutUid(data *proto.Turnout, uidsMap *stationUidStructure) *proto.
|
|||||||
return data
|
return data
|
||||||
}
|
}
|
||||||
|
|
||||||
func converSignalUid(data *proto.Signal, uidsMap *stationUidStructure) *proto.Signal {
|
func converSignalUid(data *proto.Signal, uidsMap *StationUidStructure) *proto.Signal {
|
||||||
data.Id = uidsMap.SignalIds[data.Id].Uid
|
data.Id = uidsMap.SignalIds[data.Id].Uid
|
||||||
if data.SectionId != "" {
|
if data.SectionId != "" {
|
||||||
data.SectionId = converRefUid(data.SectionId, proto.DeviceType_DeviceType_PhysicalSection, uidsMap)
|
data.SectionId = converRefUid(data.SectionId, proto.DeviceType_DeviceType_PhysicalSection, uidsMap)
|
||||||
@ -1085,7 +1005,7 @@ func converSignalUid(data *proto.Signal, uidsMap *stationUidStructure) *proto.Si
|
|||||||
return data
|
return data
|
||||||
}
|
}
|
||||||
|
|
||||||
func converTransponderUid(data *proto.Transponder, uidsMap *stationUidStructure) *proto.Transponder {
|
func converTransponderUid(data *proto.Transponder, uidsMap *StationUidStructure) *proto.Transponder {
|
||||||
data.Id = uidsMap.TransponderIds[data.Id].Uid
|
data.Id = uidsMap.TransponderIds[data.Id].Uid
|
||||||
if data.SectionId != "" {
|
if data.SectionId != "" {
|
||||||
data.SectionId = converRefUid(data.SectionId, proto.DeviceType_DeviceType_PhysicalSection, uidsMap)
|
data.SectionId = converRefUid(data.SectionId, proto.DeviceType_DeviceType_PhysicalSection, uidsMap)
|
||||||
@ -1096,17 +1016,17 @@ func converTransponderUid(data *proto.Transponder, uidsMap *stationUidStructure)
|
|||||||
return data
|
return data
|
||||||
}
|
}
|
||||||
|
|
||||||
func converSlopeUid(data *proto.Slope, uidsMap *stationUidStructure) *proto.Slope {
|
func converSlopeUid(data *proto.Slope, uidsMap *StationUidStructure) *proto.Slope {
|
||||||
data.Id = uidsMap.SlopeIds[data.Id].Uid
|
data.Id = uidsMap.SlopeIds[data.Id].Uid
|
||||||
return data
|
return data
|
||||||
}
|
}
|
||||||
|
|
||||||
func converCurvatureUid(data *proto.SectionalCurvature, uidsMap *stationUidStructure) *proto.SectionalCurvature {
|
func converCurvatureUid(data *proto.SectionalCurvature, uidsMap *StationUidStructure) *proto.SectionalCurvature {
|
||||||
data.Id = uidsMap.CurvatureIds[data.Id].Uid
|
data.Id = uidsMap.CurvatureIds[data.Id].Uid
|
||||||
return data
|
return data
|
||||||
}
|
}
|
||||||
|
|
||||||
func converRefUid(id string, d proto.DeviceType, uidsMap *stationUidStructure) string {
|
func converRefUid(id string, d proto.DeviceType, uidsMap *StationUidStructure) string {
|
||||||
var elementId *elementIdStructure
|
var elementId *elementIdStructure
|
||||||
switch d {
|
switch d {
|
||||||
case proto.DeviceType_DeviceType_CheckPoint:
|
case proto.DeviceType_DeviceType_CheckPoint:
|
||||||
|
@ -1,15 +1,21 @@
|
|||||||
package ts
|
package ts
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"log/slog"
|
||||||
|
"runtime"
|
||||||
"strconv"
|
"strconv"
|
||||||
"sync"
|
"sync"
|
||||||
|
|
||||||
"joylink.club/bj-rtsts-server/config"
|
"joylink.club/bj-rtsts-server/config"
|
||||||
"joylink.club/bj-rtsts-server/message_server"
|
"joylink.club/bj-rtsts-server/message_server"
|
||||||
"joylink.club/bj-rtsts-server/sys_error"
|
"joylink.club/bj-rtsts-server/sys_error"
|
||||||
|
"joylink.club/bj-rtsts-server/third_party/dynamics"
|
||||||
|
"joylink.club/bj-rtsts-server/third_party/interlock"
|
||||||
|
"joylink.club/bj-rtsts-server/third_party/semi_physical_train"
|
||||||
"joylink.club/bj-rtsts-server/ts/simulation/wayside/memory"
|
"joylink.club/bj-rtsts-server/ts/simulation/wayside/memory"
|
||||||
|
|
||||||
"joylink.club/bj-rtsts-server/dto"
|
"joylink.club/bj-rtsts-server/dto"
|
||||||
|
rtss_simulation "joylink.club/rtsssimulation"
|
||||||
)
|
)
|
||||||
|
|
||||||
// 仿真存储集合
|
// 仿真存储集合
|
||||||
@ -26,7 +32,7 @@ func IsExistSimulation() bool {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 创建仿真对象
|
// 创建仿真对象
|
||||||
func CreateSimulation(projectId int32, mapIds []int32, runConfig string) (string, error) {
|
func CreateSimulation(projectId int32, mapIds []int32, runConfig *dto.ProjectRunConfigDto) (string, error) {
|
||||||
simulationId := createSimulationId(projectId)
|
simulationId := createSimulationId(projectId)
|
||||||
_, e := simulationMap.Load(simulationId)
|
_, e := simulationMap.Load(simulationId)
|
||||||
if !e && IsExistSimulation() {
|
if !e && IsExistSimulation() {
|
||||||
@ -38,7 +44,18 @@ func CreateSimulation(projectId int32, mapIds []int32, runConfig string) (string
|
|||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
verifySimulation.SimulationId = simulationId
|
verifySimulation.SimulationId = simulationId
|
||||||
|
// world构建
|
||||||
|
err = initWorld(verifySimulation)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
// 第三方服务处理
|
||||||
|
err = runThirdParty(verifySimulation)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
simulationMap.Store(simulationId, verifySimulation)
|
simulationMap.Store(simulationId, verifySimulation)
|
||||||
|
verifySimulation.Start()
|
||||||
// 全部成功,启动仿真
|
// 全部成功,启动仿真
|
||||||
verifySimulation.World.StartUp()
|
verifySimulation.World.StartUp()
|
||||||
// 启动仿真消息服务
|
// 启动仿真消息服务
|
||||||
@ -55,8 +72,52 @@ func DestroySimulation(simulationId string) {
|
|||||||
}
|
}
|
||||||
simulationMap.Delete(simulationId)
|
simulationMap.Delete(simulationId)
|
||||||
simulationInfo := s.(*memory.VerifySimulation)
|
simulationInfo := s.(*memory.VerifySimulation)
|
||||||
|
simulationInfo.Destroy()
|
||||||
|
// 停止ecs world
|
||||||
|
simulationInfo.World.Close()
|
||||||
|
// 停止第三方
|
||||||
|
stopThirdParty(simulationInfo)
|
||||||
message_server.Close(simulationInfo)
|
message_server.Close(simulationInfo)
|
||||||
simulationInfo.StopSimulation()
|
}
|
||||||
|
|
||||||
|
// 创建world
|
||||||
|
func initWorld(s *memory.VerifySimulation) error {
|
||||||
|
//创建仿真
|
||||||
|
w, err := rtss_simulation.NewSimulation(s.Repo)
|
||||||
|
if err != nil {
|
||||||
|
return sys_error.New("仿真创建失败", err)
|
||||||
|
}
|
||||||
|
s.World = w
|
||||||
|
// 保证World关闭
|
||||||
|
runtime.SetFinalizer(s, func(verifySimulation *memory.VerifySimulation) {
|
||||||
|
slog.Info("---关闭仿真World---")
|
||||||
|
verifySimulation.World.Close()
|
||||||
|
})
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// 运行仿真第三方模块
|
||||||
|
func runThirdParty(s *memory.VerifySimulation) error {
|
||||||
|
// 动力学启动
|
||||||
|
err := dynamics.Default().Start(s)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
// 半实物启动
|
||||||
|
semi_physical_train.Default().Start(s)
|
||||||
|
// 联锁启动
|
||||||
|
interlock.Default().Start(s)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// 停止仿真
|
||||||
|
func stopThirdParty(s *memory.VerifySimulation) {
|
||||||
|
// 停止动力学接口功能
|
||||||
|
dynamics.Default().Stop()
|
||||||
|
// 停止半实物
|
||||||
|
semi_physical_train.Default().Stop()
|
||||||
|
// 联锁启动
|
||||||
|
interlock.Default().Stop()
|
||||||
}
|
}
|
||||||
|
|
||||||
func createSimulationId(projectId int32) string {
|
func createSimulationId(projectId int32) string {
|
||||||
@ -70,10 +131,11 @@ func ListAllSimulations() []*dto.SimulationInfoRspDto {
|
|||||||
simulationMap.Range(func(_, v any) bool {
|
simulationMap.Range(func(_, v any) bool {
|
||||||
s := v.(*memory.VerifySimulation)
|
s := v.(*memory.VerifySimulation)
|
||||||
simArr = append(simArr, &dto.SimulationInfoRspDto{
|
simArr = append(simArr, &dto.SimulationInfoRspDto{
|
||||||
SimulationId: s.SimulationId,
|
SimulationId: s.SimulationId,
|
||||||
MapId: s.MapIds[0],
|
MapId: s.MapIds[0],
|
||||||
MapIds: s.MapIds,
|
MapIds: s.MapIds,
|
||||||
ProjectId: s.ProjectId,
|
ProjectId: s.ProjectId,
|
||||||
|
ProjectRunConfigId: s.GetRunConfigId(),
|
||||||
})
|
})
|
||||||
return true
|
return true
|
||||||
})
|
})
|
||||||
@ -88,13 +150,3 @@ func FindSimulation(simulationId string) *memory.VerifySimulation {
|
|||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取普通仿真数组
|
|
||||||
func GetSimulationArr() []*memory.VerifySimulation {
|
|
||||||
var result []*memory.VerifySimulation
|
|
||||||
simulationMap.Range(func(_, v any) bool {
|
|
||||||
result = append(result, v.(*memory.VerifySimulation))
|
|
||||||
return true
|
|
||||||
})
|
|
||||||
return result
|
|
||||||
}
|
|
||||||
|
Loading…
Reference in New Issue
Block a user