diff --git a/api/simulation.go b/api/simulation.go index d9a1c88..8299b55 100644 --- a/api/simulation.go +++ b/api/simulation.go @@ -38,6 +38,7 @@ func InitSimulationRouter(api *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddle authed.POST("/ibp/key/operation", ibpKeyOperation) authed.GET("/:id/getMapKilometerRange", getMapKilometerRange) authed.POST("/psl/operation", pslBtnOperation) + authed.POST("/psd/operation", psdOperation) // 初始化地图信息 initPublishMapInfo() @@ -397,7 +398,7 @@ func ibpKeyOperation(c *gin.Context) { c.JSON(http.StatusOK, "ok") } -// PSL操作 +// PSL按钮操作 // // @Summary PSL操作 // @@ -412,7 +413,7 @@ func ibpKeyOperation(c *gin.Context) { // // @Success 200 {object} string // @Failure 500 {object} dto.ErrorDto -// @Router /api/v1/simulation/ibp/operation [post] +// @Router /api/v1/simulation/psl/operation [post] func pslBtnOperation(c *gin.Context) { req := &dto.PslOperationReqDto{} if err := c.ShouldBind(&req); err != nil { @@ -424,6 +425,35 @@ func pslBtnOperation(c *gin.Context) { c.JSON(http.StatusOK, "ok") } +// 屏蔽门操作 +// +// @Summary 屏蔽门操作 +// +// @Security JwtAuth +// +// @Description 屏蔽门操作 +// @Tags ATS测试仿真Api +// @Accept json +// @Produce json +// @Param Authorization header string true "JWT Token" +// @Param PsdOperationReq body request_proto.PsdOperationReq true "屏蔽门操作" +// +// @Success 200 {object} string +// @Failure 500 {object} dto.ErrorDto +// @Router /api/v1/simulation/psd/operation [post] +func psdOperation(c *gin.Context) { + req := &request_proto.PsdOperationReq{} + if err := c.ShouldBind(&req); err != nil { + panic(dto.ErrorDto{Code: dto.ArgumentParseError, Message: err.Error()}) + } + simulation := checkDeviceDataAndReturn(req.SimulationId) + slog.Info("传入状态参数", req) + if err := memory.HandlePsdOperation(simulation, req); err != nil { + panic(dto.ErrorDto{Code: dto.ArgumentError, Message: err.Error()}) + } + c.JSON(http.StatusOK, "ok") +} + // 获取仿真地图的公里标范围 // // @Summary 获取仿真地图的公里标范围 diff --git a/bj-rtss-message b/bj-rtss-message index ebfb67b..92c5696 160000 --- a/bj-rtss-message +++ b/bj-rtss-message @@ -1 +1 @@ -Subproject commit ebfb67be9c57e2bf9b3e4b8887f028911b9dba96 +Subproject commit 92c5696b7eb3b47b387f48e094f5c8644ddb7da8 diff --git a/docs/docs.go b/docs/docs.go index f768548..b158f08 100644 --- a/docs/docs.go +++ b/docs/docs.go @@ -3536,7 +3536,105 @@ const docTemplate = `{ } } }, - "/api/v1/simulation/ibp/operation": { + "/api/v1/simulation/list": { + "get": { + "security": [ + { + "JwtAuth": [] + } + ], + "description": "获取ATS测试系统所有仿真实例的基本信息", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "ATS测试仿真Api" + ], + "summary": "获取ATS测试系统所有仿真实例的基本信息", + "parameters": [ + { + "type": "string", + "description": "JWT Token", + "name": "Authorization", + "in": "header", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.SimulationInfoRspDto" + } + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/dto.ErrorDto" + } + } + } + } + }, + "/api/v1/simulation/psd/operation": { + "post": { + "security": [ + { + "JwtAuth": [] + } + ], + "description": "屏蔽门操作", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "ATS测试仿真Api" + ], + "summary": "屏蔽门操作", + "parameters": [ + { + "type": "string", + "description": "JWT Token", + "name": "Authorization", + "in": "header", + "required": true + }, + { + "description": "屏蔽门操作", + "name": "PsdOperationReq", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request_proto.PsdOperationReq" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "string" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/dto.ErrorDto" + } + } + } + } + }, + "/api/v1/simulation/psl/operation": { "post": { "security": [ { @@ -3588,52 +3686,6 @@ const docTemplate = `{ } } }, - "/api/v1/simulation/list": { - "get": { - "security": [ - { - "JwtAuth": [] - } - ], - "description": "获取ATS测试系统所有仿真实例的基本信息", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "ATS测试仿真Api" - ], - "summary": "获取ATS测试系统所有仿真实例的基本信息", - "parameters": [ - { - "type": "string", - "description": "JWT Token", - "name": "Authorization", - "in": "header", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/dto.SimulationInfoRspDto" - } - } - }, - "500": { - "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/dto.ErrorDto" - } - } - } - } - }, "/api/v1/simulation/relay/operation": { "post": { "security": [ @@ -5301,6 +5353,12 @@ const docTemplate = `{ }, "simulationId": { "type": "string" + }, + "trainIn": { + "type": "boolean" + }, + "trainOut": { + "type": "boolean" } } }, @@ -6058,6 +6116,69 @@ const docTemplate = `{ } } }, + "request_proto.PsdOperationReq": { + "type": "object", + "properties": { + "deviceId": { + "description": "设备id", + "type": "string" + }, + "mapId": { + "description": "图id", + "type": "integer" + }, + "operation": { + "description": "操作", + "allOf": [ + { + "$ref": "#/definitions/request_proto.Psd_Operation" + } + ] + }, + "simulationId": { + "description": "仿真id", + "type": "string" + } + } + }, + "request_proto.Psd_Operation": { + "type": "integer", + "enum": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9 + ], + "x-enum-comments": { + "Psd_CancelGm": "取消关门", + "Psd_CancelKm4": "取消四编组开门", + "Psd_CancelKm8": "取消八编组开门", + "Psd_ForceGm": "强制关门", + "Psd_ForceKm4": "强制四编组开门", + "Psd_ForceKm8": "强制八编组开门", + "Psd_Gm": "关门", + "Psd_Km4": "四编组开门", + "Psd_Km8": "八编组开门" + }, + "x-enum-varnames": [ + "Psd_Undefined", + "Psd_Km4", + "Psd_CancelKm4", + "Psd_Km8", + "Psd_CancelKm8", + "Psd_Gm", + "Psd_CancelGm", + "Psd_ForceKm4", + "Psd_ForceKm8", + "Psd_ForceGm" + ] + }, "request_proto.Section_Operation": { "type": "integer", "enum": [ diff --git a/docs/swagger.json b/docs/swagger.json index 2f75dcb..7285fc3 100644 --- a/docs/swagger.json +++ b/docs/swagger.json @@ -3529,7 +3529,105 @@ } } }, - "/api/v1/simulation/ibp/operation": { + "/api/v1/simulation/list": { + "get": { + "security": [ + { + "JwtAuth": [] + } + ], + "description": "获取ATS测试系统所有仿真实例的基本信息", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "ATS测试仿真Api" + ], + "summary": "获取ATS测试系统所有仿真实例的基本信息", + "parameters": [ + { + "type": "string", + "description": "JWT Token", + "name": "Authorization", + "in": "header", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/dto.SimulationInfoRspDto" + } + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/dto.ErrorDto" + } + } + } + } + }, + "/api/v1/simulation/psd/operation": { + "post": { + "security": [ + { + "JwtAuth": [] + } + ], + "description": "屏蔽门操作", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "ATS测试仿真Api" + ], + "summary": "屏蔽门操作", + "parameters": [ + { + "type": "string", + "description": "JWT Token", + "name": "Authorization", + "in": "header", + "required": true + }, + { + "description": "屏蔽门操作", + "name": "PsdOperationReq", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/request_proto.PsdOperationReq" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "string" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/dto.ErrorDto" + } + } + } + } + }, + "/api/v1/simulation/psl/operation": { "post": { "security": [ { @@ -3581,52 +3679,6 @@ } } }, - "/api/v1/simulation/list": { - "get": { - "security": [ - { - "JwtAuth": [] - } - ], - "description": "获取ATS测试系统所有仿真实例的基本信息", - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "tags": [ - "ATS测试仿真Api" - ], - "summary": "获取ATS测试系统所有仿真实例的基本信息", - "parameters": [ - { - "type": "string", - "description": "JWT Token", - "name": "Authorization", - "in": "header", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/dto.SimulationInfoRspDto" - } - } - }, - "500": { - "description": "Internal Server Error", - "schema": { - "$ref": "#/definitions/dto.ErrorDto" - } - } - } - } - }, "/api/v1/simulation/relay/operation": { "post": { "security": [ @@ -5294,6 +5346,12 @@ }, "simulationId": { "type": "string" + }, + "trainIn": { + "type": "boolean" + }, + "trainOut": { + "type": "boolean" } } }, @@ -6051,6 +6109,69 @@ } } }, + "request_proto.PsdOperationReq": { + "type": "object", + "properties": { + "deviceId": { + "description": "设备id", + "type": "string" + }, + "mapId": { + "description": "图id", + "type": "integer" + }, + "operation": { + "description": "操作", + "allOf": [ + { + "$ref": "#/definitions/request_proto.Psd_Operation" + } + ] + }, + "simulationId": { + "description": "仿真id", + "type": "string" + } + } + }, + "request_proto.Psd_Operation": { + "type": "integer", + "enum": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9 + ], + "x-enum-comments": { + "Psd_CancelGm": "取消关门", + "Psd_CancelKm4": "取消四编组开门", + "Psd_CancelKm8": "取消八编组开门", + "Psd_ForceGm": "强制关门", + "Psd_ForceKm4": "强制四编组开门", + "Psd_ForceKm8": "强制八编组开门", + "Psd_Gm": "关门", + "Psd_Km4": "四编组开门", + "Psd_Km8": "八编组开门" + }, + "x-enum-varnames": [ + "Psd_Undefined", + "Psd_Km4", + "Psd_CancelKm4", + "Psd_Km8", + "Psd_CancelKm8", + "Psd_Gm", + "Psd_CancelGm", + "Psd_ForceKm4", + "Psd_ForceKm8", + "Psd_ForceGm" + ] + }, "request_proto.Section_Operation": { "type": "integer", "enum": [ diff --git a/docs/swagger.yaml b/docs/swagger.yaml index ae3b795..e5b14b2 100644 --- a/docs/swagger.yaml +++ b/docs/swagger.yaml @@ -70,6 +70,10 @@ definitions: $ref: '#/definitions/request_proto.Section_Operation' simulationId: type: string + trainIn: + type: boolean + trainOut: + type: boolean required: - id - mapId @@ -598,6 +602,56 @@ definitions: description: 名称 type: string type: object + request_proto.Psd_Operation: + enum: + - 0 + - 1 + - 2 + - 3 + - 4 + - 5 + - 6 + - 7 + - 8 + - 9 + type: integer + x-enum-comments: + Psd_CancelGm: 取消关门 + Psd_CancelKm4: 取消四编组开门 + Psd_CancelKm8: 取消八编组开门 + Psd_ForceGm: 强制关门 + Psd_ForceKm4: 强制四编组开门 + Psd_ForceKm8: 强制八编组开门 + Psd_Gm: 关门 + Psd_Km4: 四编组开门 + Psd_Km8: 八编组开门 + x-enum-varnames: + - Psd_Undefined + - Psd_Km4 + - Psd_CancelKm4 + - Psd_Km8 + - Psd_CancelKm8 + - Psd_Gm + - Psd_CancelGm + - Psd_ForceKm4 + - Psd_ForceKm8 + - Psd_ForceGm + request_proto.PsdOperationReq: + properties: + deviceId: + description: 设备id + type: string + mapId: + description: 图id + type: integer + operation: + allOf: + - $ref: '#/definitions/request_proto.Psd_Operation' + description: 操作 + simulationId: + description: 仿真id + type: string + type: object request_proto.Section_Operation: enum: - 0 @@ -2985,7 +3039,69 @@ paths: summary: ATS测试-IBP钥匙操作 tags: - ATS测试仿真Api - /api/v1/simulation/ibp/operation: + /api/v1/simulation/list: + get: + consumes: + - application/json + description: 获取ATS测试系统所有仿真实例的基本信息 + parameters: + - description: JWT Token + in: header + name: Authorization + required: true + type: string + produces: + - application/json + responses: + "200": + description: OK + schema: + items: + $ref: '#/definitions/dto.SimulationInfoRspDto' + type: array + "500": + description: Internal Server Error + schema: + $ref: '#/definitions/dto.ErrorDto' + security: + - JwtAuth: [] + summary: 获取ATS测试系统所有仿真实例的基本信息 + tags: + - ATS测试仿真Api + /api/v1/simulation/psd/operation: + post: + consumes: + - application/json + description: 屏蔽门操作 + parameters: + - description: JWT Token + in: header + name: Authorization + required: true + type: string + - description: 屏蔽门操作 + in: body + name: PsdOperationReq + required: true + schema: + $ref: '#/definitions/request_proto.PsdOperationReq' + produces: + - application/json + responses: + "200": + description: OK + schema: + type: string + "500": + description: Internal Server Error + schema: + $ref: '#/definitions/dto.ErrorDto' + security: + - JwtAuth: [] + summary: 屏蔽门操作 + tags: + - ATS测试仿真Api + /api/v1/simulation/psl/operation: post: consumes: - application/json @@ -3018,35 +3134,6 @@ paths: summary: PSL操作 tags: - ATS测试仿真Api - /api/v1/simulation/list: - get: - consumes: - - application/json - description: 获取ATS测试系统所有仿真实例的基本信息 - parameters: - - description: JWT Token - in: header - name: Authorization - required: true - type: string - produces: - - application/json - responses: - "200": - description: OK - schema: - items: - $ref: '#/definitions/dto.SimulationInfoRspDto' - type: array - "500": - description: Internal Server Error - schema: - $ref: '#/definitions/dto.ErrorDto' - security: - - JwtAuth: [] - summary: 获取ATS测试系统所有仿真实例的基本信息 - tags: - - ATS测试仿真Api /api/v1/simulation/relay/operation: post: consumes: diff --git a/dto/error.go b/dto/error.go index 9e8674e..863d43d 100644 --- a/dto/error.go +++ b/dto/error.go @@ -13,6 +13,7 @@ const ( // DataOperationError 数据操作错误(增删改查操作出了意料之外的错误都算) DataOperationError = 2002 ArgumentParseError = 3000 + ArgumentError = 3001 //参数错误。指参数对应的数据不存在等情况 NoAuthOperationError = 4001 diff --git a/dto/request_proto/request.pb.go b/dto/request_proto/request.pb.go index 0ae6092..63ccf16 100644 --- a/dto/request_proto/request.pb.go +++ b/dto/request_proto/request.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.28.1 +// protoc-gen-go v1.31.0 // protoc v4.23.1 // source: request.proto @@ -233,6 +233,76 @@ func (Section_Operation) EnumDescriptor() ([]byte, []int) { return file_request_proto_rawDescGZIP(), []int{3, 0} } +type Psd_Operation int32 + +const ( + Psd_Undefined Psd_Operation = 0 + Psd_Km4 Psd_Operation = 1 //四编组开门 + Psd_CancelKm4 Psd_Operation = 2 //取消四编组开门 + Psd_Km8 Psd_Operation = 3 //八编组开门 + Psd_CancelKm8 Psd_Operation = 4 //取消八编组开门 + Psd_Gm Psd_Operation = 5 //关门 + Psd_CancelGm Psd_Operation = 6 //取消关门 + Psd_ForceKm4 Psd_Operation = 7 //强制四编组开门 + Psd_ForceKm8 Psd_Operation = 8 //强制八编组开门 + Psd_ForceGm Psd_Operation = 9 //强制关门 +) + +// Enum value maps for Psd_Operation. +var ( + Psd_Operation_name = map[int32]string{ + 0: "Undefined", + 1: "Km4", + 2: "CancelKm4", + 3: "Km8", + 4: "CancelKm8", + 5: "Gm", + 6: "CancelGm", + 7: "ForceKm4", + 8: "ForceKm8", + 9: "ForceGm", + } + Psd_Operation_value = map[string]int32{ + "Undefined": 0, + "Km4": 1, + "CancelKm4": 2, + "Km8": 3, + "CancelKm8": 4, + "Gm": 5, + "CancelGm": 6, + "ForceKm4": 7, + "ForceKm8": 8, + "ForceGm": 9, + } +) + +func (x Psd_Operation) Enum() *Psd_Operation { + p := new(Psd_Operation) + *p = x + return p +} + +func (x Psd_Operation) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (Psd_Operation) Descriptor() protoreflect.EnumDescriptor { + return file_request_proto_enumTypes[3].Descriptor() +} + +func (Psd_Operation) Type() protoreflect.EnumType { + return &file_request_proto_enumTypes[3] +} + +func (x Psd_Operation) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use Psd_Operation.Descriptor instead. +func (Psd_Operation) EnumDescriptor() ([]byte, []int) { + return file_request_proto_rawDescGZIP(), []int{4, 0} +} + // 道岔 type Turnout struct { state protoimpl.MessageState @@ -422,6 +492,117 @@ func (*Section) Descriptor() ([]byte, []int) { return file_request_proto_rawDescGZIP(), []int{3} } +// 屏蔽门 +type Psd struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *Psd) Reset() { + *x = Psd{} + if protoimpl.UnsafeEnabled { + mi := &file_request_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Psd) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Psd) ProtoMessage() {} + +func (x *Psd) ProtoReflect() protoreflect.Message { + mi := &file_request_proto_msgTypes[4] + 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 Psd.ProtoReflect.Descriptor instead. +func (*Psd) Descriptor() ([]byte, []int) { + return file_request_proto_rawDescGZIP(), []int{4} +} + +// 屏蔽门操作请求 +type PsdOperationReq struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + SimulationId string `protobuf:"bytes,1,opt,name=simulationId,proto3" json:"simulationId,omitempty"` // 仿真id + MapId int32 `protobuf:"varint,2,opt,name=mapId,proto3" json:"mapId,omitempty"` // 图id + DeviceId string `protobuf:"bytes,3,opt,name=deviceId,proto3" json:"deviceId,omitempty"` // 设备id + Operation Psd_Operation `protobuf:"varint,4,opt,name=operation,proto3,enum=request.Psd_Operation" json:"operation,omitempty"` // 操作 +} + +func (x *PsdOperationReq) Reset() { + *x = PsdOperationReq{} + if protoimpl.UnsafeEnabled { + mi := &file_request_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PsdOperationReq) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PsdOperationReq) ProtoMessage() {} + +func (x *PsdOperationReq) ProtoReflect() protoreflect.Message { + mi := &file_request_proto_msgTypes[5] + 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 PsdOperationReq.ProtoReflect.Descriptor instead. +func (*PsdOperationReq) Descriptor() ([]byte, []int) { + return file_request_proto_rawDescGZIP(), []int{5} +} + +func (x *PsdOperationReq) GetSimulationId() string { + if x != nil { + return x.SimulationId + } + return "" +} + +func (x *PsdOperationReq) GetMapId() int32 { + if x != nil { + return x.MapId + } + return 0 +} + +func (x *PsdOperationReq) GetDeviceId() string { + if x != nil { + return x.DeviceId + } + return "" +} + +func (x *PsdOperationReq) GetOperation() Psd_Operation { + if x != nil { + return x.Operation + } + return Psd_Undefined +} + var File_request_proto protoreflect.FileDescriptor var file_request_proto_rawDesc = []byte{ @@ -471,9 +652,28 @@ var file_request_proto_rawDesc = []byte{ 0x0b, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x50, 0x64, 0x72, 0x73, 0x74, 0x10, 0x03, 0x12, 0x0f, 0x0a, 0x0b, 0x53, 0x65, 0x74, 0x46, 0x61, 0x75, 0x6c, 0x74, 0x4f, 0x63, 0x63, 0x10, 0x04, 0x12, 0x12, 0x0a, 0x0e, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x46, 0x61, 0x75, 0x6c, 0x74, 0x4f, 0x63, - 0x63, 0x10, 0x05, 0x42, 0x15, 0x5a, 0x13, 0x2e, 0x2f, 0x64, 0x74, 0x6f, 0x2f, 0x72, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x33, + 0x63, 0x10, 0x05, 0x22, 0x91, 0x01, 0x0a, 0x03, 0x50, 0x73, 0x64, 0x22, 0x89, 0x01, 0x0a, 0x09, + 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x0d, 0x0a, 0x09, 0x55, 0x6e, 0x64, + 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x4b, 0x6d, 0x34, 0x10, + 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x4b, 0x6d, 0x34, 0x10, 0x02, + 0x12, 0x07, 0x0a, 0x03, 0x4b, 0x6d, 0x38, 0x10, 0x03, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x61, 0x6e, + 0x63, 0x65, 0x6c, 0x4b, 0x6d, 0x38, 0x10, 0x04, 0x12, 0x06, 0x0a, 0x02, 0x47, 0x6d, 0x10, 0x05, + 0x12, 0x0c, 0x0a, 0x08, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x47, 0x6d, 0x10, 0x06, 0x12, 0x0c, + 0x0a, 0x08, 0x46, 0x6f, 0x72, 0x63, 0x65, 0x4b, 0x6d, 0x34, 0x10, 0x07, 0x12, 0x0c, 0x0a, 0x08, + 0x46, 0x6f, 0x72, 0x63, 0x65, 0x4b, 0x6d, 0x38, 0x10, 0x08, 0x12, 0x0b, 0x0a, 0x07, 0x46, 0x6f, + 0x72, 0x63, 0x65, 0x47, 0x6d, 0x10, 0x09, 0x22, 0x9d, 0x01, 0x0a, 0x0f, 0x50, 0x73, 0x64, 0x4f, + 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 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, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, + 0x14, 0x0a, 0x05, 0x6d, 0x61, 0x70, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, + 0x6d, 0x61, 0x70, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, + 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, + 0x64, 0x12, 0x34, 0x0a, 0x09, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, + 0x73, 0x64, 0x2e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x6f, 0x70, + 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x15, 0x5a, 0x13, 0x2e, 0x2f, 0x64, 0x74, 0x6f, + 0x2f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x06, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -488,24 +688,28 @@ func file_request_proto_rawDescGZIP() []byte { return file_request_proto_rawDescData } -var file_request_proto_enumTypes = make([]protoimpl.EnumInfo, 3) -var file_request_proto_msgTypes = make([]protoimpl.MessageInfo, 4) +var file_request_proto_enumTypes = make([]protoimpl.EnumInfo, 4) +var file_request_proto_msgTypes = make([]protoimpl.MessageInfo, 6) var file_request_proto_goTypes = []interface{}{ (Turnout_Operation)(0), // 0: request.Turnout.Operation (Signal_Operation)(0), // 1: request.Signal.Operation (Section_Operation)(0), // 2: request.Section.Operation - (*Turnout)(nil), // 3: request.Turnout - (*TurnoutOperationReq)(nil), // 4: request.TurnoutOperationReq - (*Signal)(nil), // 5: request.Signal - (*Section)(nil), // 6: request.Section + (Psd_Operation)(0), // 3: request.Psd.Operation + (*Turnout)(nil), // 4: request.Turnout + (*TurnoutOperationReq)(nil), // 5: request.TurnoutOperationReq + (*Signal)(nil), // 6: request.Signal + (*Section)(nil), // 7: request.Section + (*Psd)(nil), // 8: request.Psd + (*PsdOperationReq)(nil), // 9: request.PsdOperationReq } var file_request_proto_depIdxs = []int32{ 0, // 0: request.TurnoutOperationReq.operation:type_name -> request.Turnout.Operation - 1, // [1:1] is the sub-list for method output_type - 1, // [1:1] is the sub-list for method input_type - 1, // [1:1] is the sub-list for extension type_name - 1, // [1:1] is the sub-list for extension extendee - 0, // [0:1] is the sub-list for field type_name + 3, // 1: request.PsdOperationReq.operation:type_name -> request.Psd.Operation + 2, // [2:2] is the sub-list for method output_type + 2, // [2:2] is the sub-list for method input_type + 2, // [2:2] is the sub-list for extension type_name + 2, // [2:2] is the sub-list for extension extendee + 0, // [0:2] is the sub-list for field type_name } func init() { file_request_proto_init() } @@ -562,14 +766,38 @@ func file_request_proto_init() { return nil } } + file_request_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Psd); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_request_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PsdOperationReq); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_request_proto_rawDesc, - NumEnums: 3, - NumMessages: 4, + NumEnums: 4, + NumMessages: 6, NumExtensions: 0, NumServices: 0, }, diff --git a/message_server/sfp_ms.go b/message_server/sfp_ms.go index 738b3bc..532e99c 100644 --- a/message_server/sfp_ms.go +++ b/message_server/sfp_ms.go @@ -104,8 +104,9 @@ func (ms *SfpMs) collectPsdStates() ([]*state.PsdState, error) { } } psdStateArr = append(psdStateArr, &state.PsdState{ - Id: door.Common.Id, - OpenDoorCodes: openSubDoor, + Id: door.Common.Id, + Close: component.PsdStateType.Get(psdEntry).Close, + OpenAsdCodes: openSubDoor, }) } } diff --git a/protobuf/file.bin b/protobuf/file.bin deleted file mode 100644 index 669973d..0000000 Binary files a/protobuf/file.bin and /dev/null differ diff --git a/protobuf/main_test.go b/protobuf/main_test.go deleted file mode 100644 index b8e86ac..0000000 --- a/protobuf/main_test.go +++ /dev/null @@ -1,280 +0,0 @@ -package protobuf - -import ( - "fmt" - "os" - "testing" - - "google.golang.org/protobuf/proto" - "joylink.club/bj-rtsts-server/ts/protos/graphicData" - proto2 "joylink.club/rtsssimulation/repository/model/proto" -) - -func TestBuildRepository(t *testing.T) { - - bytes, err := os.ReadFile("./file.bin") - dir, _ := os.Getwd() - println(dir) - if err != nil { - panic(err) - } - storage := &graphicData.RtssGraphicStorage{} - err = proto.Unmarshal(bytes, storage) - if err != nil { - panic(err) - } - repo := &proto2.Repository{} - - //todo 数据中id为379的区段B端无计轴,临时在代码里修改,后续删除 - storage.AxleCountings = append(storage.AxleCountings, &graphicData.AxleCounting{ - Common: &graphicData.CommonInfo{ - Id: "10000", - }, - KilometerSystem: &graphicData.KilometerSystem{ - Kilometer: 13403549, - CoordinateSystem: "MAIN_LINE", - Direction: graphicData.Direction_RIGHT, - }, - AxleCountingRef: []*graphicData.RelatedRef{{ - DeviceType: graphicData.RelatedRef_Section, - Id: "379", - DevicePort: graphicData.RelatedRef_B, - }}, - Index: 0, - // Invent: false, - Type: 0, - }) - - axleCountingMap := make(map[string]*graphicData.AxleCounting) - for _, data := range storage.AxleCountings { - if data.KilometerSystem == nil { - println(fmt.Sprintf("计轴[%s]缺少公里标", data.Common.Id)) - continue - } - axleCountingMap[data.Common.Id] = data - cpType := proto2.CheckPointType_AxleCounter - // if data.Invent { - // cpType = proto2.CheckPointType_Boundary - // } - cp := &proto2.CheckPoint{ - Id: data.Common.Id, - Km: convertKm(data.KilometerSystem), - Type: cpType, - DevicePorts: convertDevicePorts(data.AxleCountingRef), - } - repo.CheckPoints = append(repo.CheckPoints, cp) - } - for _, data := range storage.Section { - var turnoutIds []string - if data.SectionType == graphicData.Section_TurnoutPhysical { - turnoutIds = findTurnoutIds(axleCountingMap, data.AxleCountings) - } - physicalSection := &proto2.PhysicalSection{ - Id: data.Common.Id, - ADevicePort: convertDevicePort(data.PaRef), - BDevicePort: convertDevicePort(data.PbRef), - TurnoutIds: turnoutIds, - } - repo.PhysicalSections = append(repo.PhysicalSections, physicalSection) - } - for _, data := range storage.Turnouts { - var km *proto2.Kilometer - for _, ks := range data.KilometerSystem { - if ks.Kilometer != 0 { - km = convertKm(ks) - break - } - } - for _, kc := range buildKmConverts(data.KilometerSystem) { - repo.KilometerConverts = append(repo.KilometerConverts, kc) - } - turnout := &proto2.Turnout{ - Id: data.Common.Id, - Km: km, - ADevicePort: convertDevicePort(data.PaRef), - BDevicePort: convertDevicePort(data.PbRef), - CDevicePort: convertDevicePort(data.PcRef), - } - repo.Turnouts = append(repo.Turnouts, turnout) - } - for _, data := range storage.Signals { - var sectionId string - var turnoutPort *proto2.DevicePort - switch data.RefDev.DeviceType { - case graphicData.RelatedRef_Section: - sectionId = data.RefDev.Id - case graphicData.RelatedRef_Turnout: - turnoutPort = convertDevicePort(data.RefDev) - } - signal := &proto2.Signal{ - Id: data.Common.Id, - Km: convertKm(data.KilometerSystem), - SectionId: sectionId, - TurnoutPort: turnoutPort, - } - repo.Signals = append(repo.Signals, signal) - } - for _, data := range storage.Transponders { - var sectionId string - var turnoutPort *proto2.DevicePort - switch data.TransponderRef.DeviceType { - case graphicData.RelatedRef_Section: - sectionId = data.TransponderRef.Id - case graphicData.RelatedRef_Turnout: - turnoutPort = convertDevicePort(data.TransponderRef) - } - responder := &proto2.Transponder{ - Id: data.Common.Id, - Km: convertKm(data.KilometerSystem), - SectionId: sectionId, - TurnoutPort: turnoutPort, - } - repo.Transponders = append(repo.Transponders, responder) - } - slopeKsMap := make(map[string]*graphicData.SlopeKiloMarker) - for _, data := range storage.SlopeKiloMarker { - slopeKsMap[data.Common.Id] = data - for _, kc := range buildKmConverts(data.KilometerSystem) { - repo.KilometerConverts = append(repo.KilometerConverts, kc) - } - } - curveKsMap := make(map[string]*graphicData.CurvatureKiloMarker) - for _, data := range storage.CurvatureKiloMarker { - curveKsMap[data.Common.Id] = data - for _, kc := range buildKmConverts(data.KilometerSystem) { - repo.KilometerConverts = append(repo.KilometerConverts, kc) - } - } - for _, data := range storage.Slopes { - var kms []*proto2.Kilometer - for _, id := range data.RefDeviceId { - kms = append(kms, convertKm(slopeKsMap[id].KilometerSystem[0])) - } - slope := &proto2.Slope{ - Id: data.Common.Id, - Kms: kms, - Degree: data.SlopeNumber, - } - repo.Slopes = append(repo.Slopes, slope) - } - for _, data := range storage.Curvatures { - var kms []*proto2.Kilometer - for _, id := range data.RefDeviceId { - kms = append(kms, convertKm(curveKsMap[id].KilometerSystem[0])) - } - slope := &proto2.SectionalCurvature{ - Id: data.Common.Id, - Kms: kms, - Radius: data.CurvatureNumber, - } - repo.SectionalCurvatures = append(repo.SectionalCurvatures, slope) - } - repoBytes, err := proto.Marshal(repo) - if err != nil { - panic(err) - } - err = os.WriteFile("./repo.bin", repoBytes, os.ModePerm) - println(err) -} - -func convertKm(ks *graphicData.KilometerSystem) *proto2.Kilometer { - var dir proto2.Direction - switch ks.Direction { - case graphicData.Direction_LEFT: - dir = proto2.Direction_LEFT - case graphicData.Direction_RIGHT: - dir = proto2.Direction_RIGHT - } - return &proto2.Kilometer{ - Value: ks.Kilometer, - CoordinateSystem: ks.CoordinateSystem, - Direction: dir, - } -} - -func convertDevicePort(ref *graphicData.RelatedRef) *proto2.DevicePort { - if ref == nil { - return nil - } - var deviceType proto2.DeviceType - var port proto2.Port - switch ref.DevicePort { - case graphicData.RelatedRef_A: - port = proto2.Port_A - case graphicData.RelatedRef_B: - port = proto2.Port_B - case graphicData.RelatedRef_C: - port = proto2.Port_C - } - switch ref.DeviceType { - case graphicData.RelatedRef_Section: - deviceType = proto2.DeviceType_DeviceType_PhysicalSection - case graphicData.RelatedRef_Turnout: - deviceType = proto2.DeviceType_DeviceType_Turnout - default: - panic(fmt.Sprintf("异常的设备类型-%s", ref.DeviceType)) - } - return &proto2.DevicePort{ - DeviceId: ref.Id, - DeviceType: deviceType, - Port: port, - } -} - -func convertDevicePorts(refList []*graphicData.RelatedRef) []*proto2.DevicePort { - var dps []*proto2.DevicePort - for _, ref := range refList { - dps = append(dps, convertDevicePort(ref)) - } - return dps -} - -func findTurnoutIds(axleCountingMap map[string]*graphicData.AxleCounting, axleIds []string) []string { - if len(axleIds) <= 2 { - return nil - } - turnoutMap := make(map[string]bool) - for _, axleId := range axleIds { - axle := axleCountingMap[axleId] - relTurnoutCount := 0 - var turnoutId string - for _, ref := range axle.AxleCountingRef { - if ref.DeviceType == graphicData.RelatedRef_Turnout { - relTurnoutCount++ - turnoutId = ref.Id - } - } - if relTurnoutCount == 1 { - turnoutMap[turnoutId] = true - } - } - var turnoutIds []string - for id, _ := range turnoutMap { - turnoutIds = append(turnoutIds, id) - } - return turnoutIds -} - -func buildKmConverts(ksList []*graphicData.KilometerSystem) []*proto2.KilometerConvert { - var kmConvers []*proto2.KilometerConvert - for i, ks := range ksList { - if ks.Kilometer == 0 { - continue - } - for j := i + 1; j < len(ksList); j++ { - if ks.Kilometer == 0 { - continue - } - kmConvers = append(kmConvers, buildKmConvert(ks, ksList[j])) - } - } - return kmConvers -} - -func buildKmConvert(ks1 *graphicData.KilometerSystem, ks2 *graphicData.KilometerSystem) *proto2.KilometerConvert { - return &proto2.KilometerConvert{ - KmA: convertKm(ks1), - KmB: convertKm(ks2), - SameTrend: false, - } -} diff --git a/rtss_simulation b/rtss_simulation index ec32973..d77c370 160000 --- a/rtss_simulation +++ b/rtss_simulation @@ -1 +1 @@ -Subproject commit ec3297327025acb20e33268705d600be0c1f87fb +Subproject commit d77c37055ba841091f417b1c36fd8d3f6beb15c5 diff --git a/ts/protos/graphicData/ibpGraphics.pb.go b/ts/protos/graphicData/ibpGraphics.pb.go index ed3142d..90d7633 100644 --- a/ts/protos/graphicData/ibpGraphics.pb.go +++ b/ts/protos/graphicData/ibpGraphics.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.28.1 +// protoc-gen-go v1.31.0 // protoc v4.23.1 // source: ibpGraphics.proto diff --git a/ts/protos/graphicData/picture.pb.go b/ts/protos/graphicData/picture.pb.go index c59a50e..32a004e 100644 --- a/ts/protos/graphicData/picture.pb.go +++ b/ts/protos/graphicData/picture.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.28.1 +// protoc-gen-go v1.31.0 // protoc v4.23.1 // source: picture.proto diff --git a/ts/protos/graphicData/pslGraphics.pb.go b/ts/protos/graphicData/pslGraphics.pb.go index 43d468d..de96dad 100644 --- a/ts/protos/graphicData/pslGraphics.pb.go +++ b/ts/protos/graphicData/pslGraphics.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.28.1 +// protoc-gen-go v1.31.0 // protoc v4.23.1 // source: pslGraphics.proto diff --git a/ts/protos/graphicData/relayCabinetLayoutGraphics.pb.go b/ts/protos/graphicData/relayCabinetLayoutGraphics.pb.go index 52442f4..883af1b 100644 --- a/ts/protos/graphicData/relayCabinetLayoutGraphics.pb.go +++ b/ts/protos/graphicData/relayCabinetLayoutGraphics.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.28.1 +// protoc-gen-go v1.31.0 // protoc v4.23.1 // source: relayCabinetLayoutGraphics.proto diff --git a/ts/protos/graphicData/stationLayoutGraphics.pb.go b/ts/protos/graphicData/stationLayoutGraphics.pb.go index 43eb347..48b933f 100644 --- a/ts/protos/graphicData/stationLayoutGraphics.pb.go +++ b/ts/protos/graphicData/stationLayoutGraphics.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.28.1 +// protoc-gen-go v1.31.0 // protoc v4.23.1 // source: stationLayoutGraphics.proto diff --git a/ts/protos/state/device_state.pb.go b/ts/protos/state/device_state.pb.go index ece74b6..94144da 100644 --- a/ts/protos/state/device_state.pb.go +++ b/ts/protos/state/device_state.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.28.1 +// protoc-gen-go v1.31.0 // protoc v4.23.1 // source: device_state.proto @@ -1643,8 +1643,9 @@ type PsdState struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` //屏蔽门的id - OpenDoorCodes []int32 `protobuf:"varint,2,rep,packed,name=openDoorCodes,proto3" json:"openDoorCodes,omitempty"` //开启的小门的编号 + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` //屏蔽门的id + OpenAsdCodes []int32 `protobuf:"varint,2,rep,packed,name=openAsdCodes,proto3" json:"openAsdCodes,omitempty"` //开启的滑动门的编号 + Close bool `protobuf:"varint,3,opt,name=close,proto3" json:"close,omitempty"` //屏蔽门整体的关闭(继电器)状态 } func (x *PsdState) Reset() { @@ -1686,13 +1687,20 @@ func (x *PsdState) GetId() string { return "" } -func (x *PsdState) GetOpenDoorCodes() []int32 { +func (x *PsdState) GetOpenAsdCodes() []int32 { if x != nil { - return x.OpenDoorCodes + return x.OpenAsdCodes } return nil } +func (x *PsdState) GetClose() bool { + if x != nil { + return x.Close + } + return false +} + // 钥匙状态 type KeyState struct { state protoimpl.MessageState @@ -2309,98 +2317,99 @@ var file_device_state_proto_rawDesc = []byte{ 0x06, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x22, 0x34, 0x0a, 0x0a, 0x4c, 0x69, 0x67, 0x68, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x22, 0x40, 0x0a, + 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x22, 0x54, 0x0a, 0x08, 0x50, 0x73, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x6f, 0x70, 0x65, - 0x6e, 0x44, 0x6f, 0x6f, 0x72, 0x43, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x05, - 0x52, 0x0d, 0x6f, 0x70, 0x65, 0x6e, 0x44, 0x6f, 0x6f, 0x72, 0x43, 0x6f, 0x64, 0x65, 0x73, 0x22, - 0x2e, 0x0a, 0x08, 0x4b, 0x65, 0x79, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x67, - 0x65, 0x61, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x67, 0x65, 0x61, 0x72, 0x22, - 0x9e, 0x02, 0x0a, 0x0f, 0x56, 0x61, 0x72, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x12, 0x35, 0x0a, 0x0c, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x54, 0x72, - 0x61, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x73, 0x74, 0x61, 0x74, - 0x65, 0x2e, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x0c, 0x75, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x64, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x12, 0x26, 0x0a, 0x0e, 0x72, 0x65, - 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x49, 0x64, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x0e, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x54, 0x72, 0x61, 0x69, 0x6e, - 0x49, 0x64, 0x12, 0x38, 0x0a, 0x0d, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x77, 0x69, - 0x74, 0x63, 0x68, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x73, 0x74, 0x61, 0x74, - 0x65, 0x2e, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x0d, 0x75, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x12, 0x3b, 0x0a, 0x0e, - 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x53, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x0e, 0x75, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x64, 0x53, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x35, 0x0a, 0x0c, 0x75, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x11, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x53, 0x74, 0x61, - 0x74, 0x65, 0x52, 0x0c, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x93, 0x04, 0x0a, 0x10, 0x41, 0x6c, 0x6c, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x31, 0x0a, 0x0a, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x74, - 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x73, 0x74, 0x61, 0x74, - 0x65, 0x2e, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x0a, 0x74, 0x72, - 0x61, 0x69, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x34, 0x0a, 0x0b, 0x73, 0x77, 0x69, 0x74, - 0x63, 0x68, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x6f, 0x70, 0x65, + 0x6e, 0x41, 0x73, 0x64, 0x43, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x05, 0x52, + 0x0c, 0x6f, 0x70, 0x65, 0x6e, 0x41, 0x73, 0x64, 0x43, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x14, 0x0a, + 0x05, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x63, 0x6c, + 0x6f, 0x73, 0x65, 0x22, 0x2e, 0x0a, 0x08, 0x4b, 0x65, 0x79, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, + 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, + 0x12, 0x0a, 0x04, 0x67, 0x65, 0x61, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x67, + 0x65, 0x61, 0x72, 0x22, 0x9e, 0x02, 0x0a, 0x0f, 0x56, 0x61, 0x72, 0x69, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x35, 0x0a, 0x0c, 0x75, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x64, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, + 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, + 0x52, 0x0c, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x12, 0x26, + 0x0a, 0x0e, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x49, 0x64, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x54, + 0x72, 0x61, 0x69, 0x6e, 0x49, 0x64, 0x12, 0x38, 0x0a, 0x0d, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x64, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x53, 0x74, 0x61, 0x74, - 0x65, 0x52, 0x0b, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x37, - 0x0a, 0x0c, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x53, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x0c, 0x73, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x31, 0x0a, 0x0a, 0x72, 0x65, 0x70, 0x6c, 0x79, - 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x73, 0x74, - 0x61, 0x74, 0x65, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x0a, - 0x72, 0x65, 0x70, 0x6c, 0x79, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x34, 0x0a, 0x0b, 0x73, 0x69, - 0x67, 0x6e, 0x61, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x12, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x53, 0x74, - 0x61, 0x74, 0x65, 0x52, 0x0b, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, - 0x12, 0x34, 0x0a, 0x0b, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, - 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x42, 0x75, - 0x74, 0x74, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x0b, 0x62, 0x75, 0x74, 0x74, 0x6f, - 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x31, 0x0a, 0x0a, 0x41, 0x6c, 0x61, 0x72, 0x6d, 0x53, - 0x74, 0x61, 0x74, 0x65, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x73, 0x74, 0x61, - 0x74, 0x65, 0x2e, 0x41, 0x6c, 0x61, 0x72, 0x6d, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x0a, 0x41, - 0x6c, 0x61, 0x72, 0x6d, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x31, 0x0a, 0x0a, 0x4c, 0x69, 0x67, - 0x68, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, - 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x4c, 0x69, 0x67, 0x68, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, - 0x52, 0x0a, 0x4c, 0x69, 0x67, 0x68, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2b, 0x0a, 0x08, - 0x70, 0x73, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0f, - 0x2e, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x50, 0x73, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, - 0x08, 0x70, 0x73, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2b, 0x0a, 0x08, 0x4b, 0x65, 0x79, - 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x73, 0x74, - 0x61, 0x74, 0x65, 0x2e, 0x4b, 0x65, 0x79, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x08, 0x4b, 0x65, - 0x79, 0x53, 0x74, 0x61, 0x74, 0x65, 0x22, 0x94, 0x01, 0x0a, 0x13, 0x50, 0x75, 0x73, 0x68, 0x65, - 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x10, - 0x0a, 0x03, 0x61, 0x6c, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x61, 0x6c, 0x6c, - 0x12, 0x34, 0x0a, 0x09, 0x76, 0x61, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x56, 0x61, 0x72, 0x69, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x09, 0x76, 0x61, 0x72, - 0x53, 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, 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, 0xd8, 0x01, - 0x0a, 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, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x69, 0x6d, 0x75, 0x6c, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x3d, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x27, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x53, 0x69, - 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x53, - 0x69, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, - 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, - 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3f, 0x0a, 0x0f, 0x53, 0x69, 0x6d, 0x75, 0x6c, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x09, 0x0a, 0x05, 0x50, 0x41, - 0x55, 0x53, 0x45, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x53, 0x54, 0x41, 0x52, 0x54, 0x10, 0x01, - 0x12, 0x09, 0x0a, 0x05, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x44, - 0x45, 0x53, 0x54, 0x52, 0x4f, 0x59, 0x10, 0x03, 0x2a, 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, 0x4c, 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, 0x11, 0x2e, 0x2f, - 0x74, 0x73, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x62, - 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x65, 0x52, 0x0d, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, + 0x12, 0x3b, 0x0a, 0x0e, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x65, + 0x2e, 0x53, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x0e, 0x75, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x35, 0x0a, + 0x0c, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x18, 0x05, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x0c, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x93, 0x04, 0x0a, 0x10, 0x41, 0x6c, 0x6c, 0x44, 0x65, 0x76, 0x69, + 0x63, 0x65, 0x73, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x31, 0x0a, 0x0a, 0x74, 0x72, 0x61, + 0x69, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, + 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, + 0x52, 0x0a, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x34, 0x0a, 0x0b, + 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x12, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, + 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x0b, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x12, 0x37, 0x0a, 0x0c, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x65, + 0x2e, 0x53, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x0c, 0x73, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x31, 0x0a, 0x0a, 0x72, + 0x65, 0x70, 0x6c, 0x79, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x11, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x52, 0x0a, 0x72, 0x65, 0x70, 0x6c, 0x79, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x34, + 0x0a, 0x0b, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x05, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x53, 0x69, 0x67, 0x6e, + 0x61, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x0b, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x12, 0x34, 0x0a, 0x0b, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x53, 0x74, + 0x61, 0x74, 0x65, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x73, 0x74, 0x61, 0x74, + 0x65, 0x2e, 0x42, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x0b, 0x62, + 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x31, 0x0a, 0x0a, 0x41, 0x6c, + 0x61, 0x72, 0x6d, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, + 0x2e, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x41, 0x6c, 0x61, 0x72, 0x6d, 0x53, 0x74, 0x61, 0x74, + 0x65, 0x52, 0x0a, 0x41, 0x6c, 0x61, 0x72, 0x6d, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x31, 0x0a, + 0x0a, 0x4c, 0x69, 0x67, 0x68, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x08, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x11, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x4c, 0x69, 0x67, 0x68, 0x74, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x52, 0x0a, 0x4c, 0x69, 0x67, 0x68, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, + 0x12, 0x2b, 0x0a, 0x08, 0x70, 0x73, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x09, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x50, 0x73, 0x64, 0x53, 0x74, + 0x61, 0x74, 0x65, 0x52, 0x08, 0x70, 0x73, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2b, 0x0a, + 0x08, 0x4b, 0x65, 0x79, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x0f, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x4b, 0x65, 0x79, 0x53, 0x74, 0x61, 0x74, 0x65, + 0x52, 0x08, 0x4b, 0x65, 0x79, 0x53, 0x74, 0x61, 0x74, 0x65, 0x22, 0x94, 0x01, 0x0a, 0x13, 0x50, + 0x75, 0x73, 0x68, 0x65, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x6c, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x03, 0x61, 0x6c, 0x6c, 0x12, 0x34, 0x0a, 0x09, 0x76, 0x61, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, + 0x56, 0x61, 0x72, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, + 0x09, 0x76, 0x61, 0x72, 0x53, 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, 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, 0xd8, 0x01, 0x0a, 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, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x69, + 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x3d, 0x0a, 0x05, 0x73, 0x74, + 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x27, 0x2e, 0x73, 0x74, 0x61, 0x74, + 0x65, 0x2e, 0x53, 0x69, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x2e, 0x53, 0x69, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3f, 0x0a, 0x0f, 0x53, + 0x69, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x09, + 0x0a, 0x05, 0x50, 0x41, 0x55, 0x53, 0x45, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x53, 0x54, 0x41, + 0x52, 0x54, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x02, 0x12, + 0x0b, 0x0a, 0x07, 0x44, 0x45, 0x53, 0x54, 0x52, 0x4f, 0x59, 0x10, 0x03, 0x2a, 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, 0x4c, 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, 0x11, 0x2e, 0x2f, 0x74, 0x73, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x73, 0x74, + 0x61, 0x74, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/ts/simulation/wayside/memory/wayside_memory_map_init.go b/ts/simulation/wayside/memory/wayside_memory_map_init.go index 5ae68bf..9ba5eac 100644 --- a/ts/simulation/wayside/memory/wayside_memory_map_init.go +++ b/ts/simulation/wayside/memory/wayside_memory_map_init.go @@ -327,6 +327,8 @@ func getUidMapByType(uidData any, m interface{}) map[string]*elementIdStructure return (uidData.(*StationUidStructure)).ButtonIds case *graphicData.Station: return (uidData.(*StationUidStructure)).StationIds + case *graphicData.ScreenDoor: + return (uidData.(*StationUidStructure)).PsdIds default: panic(&dto.ErrorDto{Code: dto.ArgumentParseError, Message: "类型未映射字段"}) } diff --git a/ts/simulation/wayside/memory/wayside_memory_psd.go b/ts/simulation/wayside/memory/wayside_memory_psd.go index 05af74b..3de4e49 100644 --- a/ts/simulation/wayside/memory/wayside_memory_psd.go +++ b/ts/simulation/wayside/memory/wayside_memory_psd.go @@ -1 +1,35 @@ package memory + +import ( + "fmt" + "joylink.club/bj-rtsts-server/dto/request_proto" + "joylink.club/bj-rtsts-server/ts/protos/graphicData" + "joylink.club/rtsssimulation/fi" +) + +// 处理道岔操作 +func HandlePsdOperation(simulation *VerifySimulation, req *request_proto.PsdOperationReq) error { + uid := QueryUidByMidAndComId(req.MapId, req.DeviceId, &graphicData.ScreenDoor{}) + switch req.Operation { + case request_proto.Psd_Km4: + return fi.SetInterlockKm4(simulation.World, uid) + case request_proto.Psd_CancelKm4: + return fi.CancelInterlockKm4(simulation.World, uid) + case request_proto.Psd_Km8: + return fi.SetInterlockKm8(simulation.World, uid) + case request_proto.Psd_CancelKm8: + return fi.CancelInterlockKm8(simulation.World, uid) + case request_proto.Psd_Gm: + return fi.SetInterlockGm(simulation.World, uid) + case request_proto.Psd_CancelGm: + return fi.CancelInterlockGm(simulation.World, uid) + case request_proto.Psd_ForceKm4: + + case request_proto.Psd_ForceKm8: + + case request_proto.Psd_ForceGm: + default: + panic(fmt.Sprintf("未知的道岔操作:%s", req.Operation)) + } + return nil +} diff --git a/ts/simulation/wayside/memory/wayside_memory_psd_test.go b/ts/simulation/wayside/memory/wayside_memory_psd_test.go new file mode 100644 index 0000000..f7b0679 --- /dev/null +++ b/ts/simulation/wayside/memory/wayside_memory_psd_test.go @@ -0,0 +1,110 @@ +package memory + +import ( + "fmt" + "joylink.club/bj-rtsts-server/dto/request_proto" + "joylink.club/bj-rtsts-server/ts" + "joylink.club/bj-rtsts-server/ts/protos/graphicData" + "joylink.club/rtsssimulation/component" + "joylink.club/rtsssimulation/consts" + "joylink.club/rtsssimulation/entity" + "testing" + "time" +) + +// 先创建一个仿真再调 +func TestHandlePsdOperation(t *testing.T) { + simInfo := ts.ListAllSimulations()[0] + simId := simInfo.SimulationId + var mapId int32 + for _, id := range simInfo.MapIds { + if QueryGiType(id) == graphicData.PictureType_StationLayout { + mapId = id + } + } + if mapId == 0 { + fmt.Println("无信号布置图") + return + } + data := QueryGiData[*graphicData.RtssGraphicStorage](mapId) + deviceId := data.ScreenDoors[0].Common.Id + + simulation := ts.FindSimulation(simId) + wantErr := false + uid := QueryUidByMidAndComId(mapId, deviceId, &graphicData.Turnout{}) + entry, _ := entity.GetEntityByUid(simulation.World, uid) + asdList := component.AsdListType.Get(entry) + psdModel := entity.GetWorldData(simulation.World).Repo.FindPsd(uid) + + for key, value := range request_proto.Psd_Operation_value { + name := fmt.Sprintf("执行操作:%s", key) + req := &request_proto.PsdOperationReq{ + SimulationId: "", + MapId: mapId, + DeviceId: deviceId, + Operation: request_proto.Psd_Operation(value), + } + t.Run(name, func(t *testing.T) { + if err := HandlePsdOperation(simulation, req); (err != nil) != wantErr { + t.Errorf("HandlePsdOperation() error = %v, wantErr %v", err, wantErr) + } + tick := time.Tick(5 * time.Second) + <-tick + switch req.Operation { + case request_proto.Psd_Km4: + group := psdModel.FindAsdGroup(4) + for i, asd := range asdList.List { + pos := component.TwoPositionTransformType.Get(asd).Pos + if int32(i) < group.Start || int32(i) > group.End { + if pos != consts.TwoPosMin { + t.Errorf("4编组开门操作[编号:%d]的滑动门位置[%d]不正确", i, pos) + } + } else { + if pos != consts.TwoPosMax { + t.Errorf(fmt.Sprintf("4编组开门操作[编号:%d]的滑动门位置[%d]不正确", i, pos)) + } + } + } + case request_proto.Psd_CancelKm4: + if component.PscType.Get(entry).InterlockKM4 == true { + t.Errorf("取消4编组开门失败") + } + case request_proto.Psd_Km8: + group := psdModel.FindAsdGroup(8) + for i, asd := range asdList.List { + pos := component.TwoPositionTransformType.Get(asd).Pos + if int32(i) < group.Start || int32(i) > group.End { + if pos != consts.TwoPosMin { + t.Errorf("8编组开门操作[编号:%d]的滑动门位置[%d]不正确", i, pos) + } + } else { + if pos != consts.TwoPosMax { + t.Errorf("8编组开门操作[编号:%d]的滑动门位置[%d]不正确", i, pos) + } + } + } + case request_proto.Psd_CancelKm8: + if component.PscType.Get(entry).InterlockKM8 == true { + t.Errorf("取消8编组开门失败") + } + case request_proto.Psd_Gm: + for i, asd := range asdList.List { + pos := component.TwoPositionTransformType.Get(asd).Pos + if pos != consts.TwoPosMin { + t.Errorf("4编组开门操作[编号:%d]的滑动门位置[%d]不正确", i, pos) + } + } + case request_proto.Psd_CancelGm: + if component.PscType.Get(entry).InterlockGM == true { + t.Errorf("取消关门失败") + } + case request_proto.Psd_ForceKm4: + + case request_proto.Psd_ForceKm8: + + case request_proto.Psd_ForceGm: + + } + }) + } +}