Compare commits

...

2 Commits

Author SHA1 Message Date
9d6acd9c20 【新增】测试模块车库门状态proto定义及车库门状态发送逻辑
【删除】ecs的车库门状态及相关逻辑
2024-03-26 16:48:37 +08:00
141cc633b9 【新增】车库门PSL模型构建及相关ecs逻辑;
【改动】车库门ecs逻辑
2024-03-26 13:12:17 +08:00
12 changed files with 644 additions and 344 deletions

View File

@ -53,7 +53,7 @@ func InitSimulationRouter(api *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddle
authed.PUT("/balise/telegram/stop", baliseTelegramStop)
authed.PUT("/balise/telegram/send", baliseTelegramSend)
authed.PUT("/balise/reset", baliseReset)
authed.PUT("/ckm/operation")
authed.PUT("/ckm/operation", ckmOperation)
//authed.POST("/bypass/operation", bypassBtnOrKeyOperation)
// 初始化地图信息
@ -614,7 +614,10 @@ func pslBtnOperation(c *gin.Context) {
}
simulation := checkDeviceDataAndReturn(req.SimulationId)
slog.Info("传入状态参数", req)
memory.ChangePSLButtonState(simulation, req.MapId, req.PslId, req.ButtonCode, req.Down)
var err *sys_error.BusinessError = memory.ChangePSLButtonState(simulation, req.MapId, req.PslId, req.ButtonCode, req.Down)
if err != nil {
panic(err)
}
c.JSON(http.StatusOK, "ok")
}
@ -932,34 +935,6 @@ func ckmOperation(c *gin.Context) {
c.JSON(http.StatusOK, "ok")
}
// 车库门控制盒操作
//
// @Summary 车库门控制盒操作
//
// @Security JwtAuth
//
// @Description 车库门操作
// @Tags ATS测试仿真Api
// @Accept json
// @Param Authorization header string true "JWT Token"
// @Param CkmBoxOperationReq body request_proto.CkmBoxOperationReq true "车库门控制盒操作"
//
// @Success 200 {object} string
// @Failure 500 {object} dto.ErrorDto
// @Router /api/v1/simulation/ckm/operation [put]
func ckmBoxOperation(c *gin.Context) {
req := &request_proto.CkmBoxOperationReq{}
if err := c.ShouldBind(&req); err != nil {
panic(dto.ErrorDto{Code: dto.ArgumentParseError, Message: err.Error()})
}
simulation := checkDeviceDataAndReturn(req.SimulationId)
var err *sys_error.BusinessError = memory.CkmBoxOperation(simulation, req)
if err != nil {
panic(err)
}
c.JSON(http.StatusOK, "ok")
}
// 获取仿真设备数据并返回
func checkDeviceDataAndReturn(simId string) *memory.VerifySimulation {
deviceMemory := ts.FindSimulation(simId)

View File

@ -249,7 +249,7 @@ func (x SimulationStatus_SimulationState) Number() protoreflect.EnumNumber {
// Deprecated: Use SimulationStatus_SimulationState.Descriptor instead.
func (SimulationStatus_SimulationState) EnumDescriptor() ([]byte, []int) {
return file_device_state_proto_rawDescGZIP(), []int{28, 0}
return file_device_state_proto_rawDescGZIP(), []int{29, 0}
}
type SimulationThirdPartyApiService_Type int32
@ -301,7 +301,7 @@ func (x SimulationThirdPartyApiService_Type) Number() protoreflect.EnumNumber {
// Deprecated: Use SimulationThirdPartyApiService_Type.Descriptor instead.
func (SimulationThirdPartyApiService_Type) EnumDescriptor() ([]byte, []int) {
return file_device_state_proto_rawDescGZIP(), []int{29, 0}
return file_device_state_proto_rawDescGZIP(), []int{30, 0}
}
// 服务状态
@ -350,7 +350,7 @@ func (x SimulationThirdPartyApiService_State) Number() protoreflect.EnumNumber {
// Deprecated: Use SimulationThirdPartyApiService_State.Descriptor instead.
func (SimulationThirdPartyApiService_State) EnumDescriptor() ([]byte, []int) {
return file_device_state_proto_rawDescGZIP(), []int{29, 1}
return file_device_state_proto_rawDescGZIP(), []int{30, 1}
}
// 相邻端点定义的link的状态
@ -3492,6 +3492,78 @@ func (x *StationQc) GetCjStates() []*StationQc_State {
return nil
}
// 车库门
type CkmState struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
Id uint32 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"` //车库门的id
Mgj bool `protobuf:"varint,2,opt,name=mgj,proto3" json:"mgj,omitempty"` //车库门关闭继电器
Param *request_proto.CkmParam `protobuf:"bytes,3,opt,name=param,proto3" json:"param,omitempty"` //屏蔽门设置的参数
StateLoss bool `protobuf:"varint,4,opt,name=stateLoss,proto3" json:"stateLoss,omitempty"` //状态丢失
}
func (x *CkmState) Reset() {
*x = CkmState{}
if protoimpl.UnsafeEnabled {
mi := &file_device_state_proto_msgTypes[25]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}
func (x *CkmState) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*CkmState) ProtoMessage() {}
func (x *CkmState) ProtoReflect() protoreflect.Message {
mi := &file_device_state_proto_msgTypes[25]
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 CkmState.ProtoReflect.Descriptor instead.
func (*CkmState) Descriptor() ([]byte, []int) {
return file_device_state_proto_rawDescGZIP(), []int{25}
}
func (x *CkmState) GetId() uint32 {
if x != nil {
return x.Id
}
return 0
}
func (x *CkmState) GetMgj() bool {
if x != nil {
return x.Mgj
}
return false
}
func (x *CkmState) GetParam() *request_proto.CkmParam {
if x != nil {
return x.Param
}
return nil
}
func (x *CkmState) GetStateLoss() bool {
if x != nil {
return x.StateLoss
}
return false
}
// 仿真运行时状态变化量,当前时刻与上一时刻比较得到
type VariationStatus struct {
state protoimpl.MessageState
@ -3513,7 +3585,7 @@ type VariationStatus struct {
func (x *VariationStatus) Reset() {
*x = VariationStatus{}
if protoimpl.UnsafeEnabled {
mi := &file_device_state_proto_msgTypes[25]
mi := &file_device_state_proto_msgTypes[26]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@ -3526,7 +3598,7 @@ func (x *VariationStatus) String() string {
func (*VariationStatus) ProtoMessage() {}
func (x *VariationStatus) ProtoReflect() protoreflect.Message {
mi := &file_device_state_proto_msgTypes[25]
mi := &file_device_state_proto_msgTypes[26]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@ -3539,7 +3611,7 @@ func (x *VariationStatus) ProtoReflect() protoreflect.Message {
// Deprecated: Use VariationStatus.ProtoReflect.Descriptor instead.
func (*VariationStatus) Descriptor() ([]byte, []int) {
return file_device_state_proto_rawDescGZIP(), []int{25}
return file_device_state_proto_rawDescGZIP(), []int{26}
}
func (x *VariationStatus) GetUpdatedTrain() []*TrainMapState {
@ -3609,12 +3681,14 @@ type AllDevicesStatus struct {
BaliseState []*BaliseState `protobuf:"bytes,12,rep,name=baliseState,proto3" json:"baliseState,omitempty"`
// 车站联锁驱采状态
StationQc *StationQc `protobuf:"bytes,13,opt,name=stationQc,proto3" json:"stationQc,omitempty"`
// 车库门状态
CkmStates []*CkmState `protobuf:"bytes,14,rep,name=ckmStates,proto3" json:"ckmStates,omitempty"`
}
func (x *AllDevicesStatus) Reset() {
*x = AllDevicesStatus{}
if protoimpl.UnsafeEnabled {
mi := &file_device_state_proto_msgTypes[26]
mi := &file_device_state_proto_msgTypes[27]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@ -3627,7 +3701,7 @@ func (x *AllDevicesStatus) String() string {
func (*AllDevicesStatus) ProtoMessage() {}
func (x *AllDevicesStatus) ProtoReflect() protoreflect.Message {
mi := &file_device_state_proto_msgTypes[26]
mi := &file_device_state_proto_msgTypes[27]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@ -3640,7 +3714,7 @@ func (x *AllDevicesStatus) ProtoReflect() protoreflect.Message {
// Deprecated: Use AllDevicesStatus.ProtoReflect.Descriptor instead.
func (*AllDevicesStatus) Descriptor() ([]byte, []int) {
return file_device_state_proto_rawDescGZIP(), []int{26}
return file_device_state_proto_rawDescGZIP(), []int{27}
}
func (x *AllDevicesStatus) GetTrainState() []*TrainMapState {
@ -3734,6 +3808,13 @@ func (x *AllDevicesStatus) GetStationQc() *StationQc {
return nil
}
func (x *AllDevicesStatus) GetCkmStates() []*CkmState {
if x != nil {
return x.CkmStates
}
return nil
}
// 服务器端向前端推送的设备状态信息
type PushedDevicesStatus struct {
state protoimpl.MessageState
@ -3752,7 +3833,7 @@ type PushedDevicesStatus struct {
func (x *PushedDevicesStatus) Reset() {
*x = PushedDevicesStatus{}
if protoimpl.UnsafeEnabled {
mi := &file_device_state_proto_msgTypes[27]
mi := &file_device_state_proto_msgTypes[28]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@ -3765,7 +3846,7 @@ func (x *PushedDevicesStatus) String() string {
func (*PushedDevicesStatus) ProtoMessage() {}
func (x *PushedDevicesStatus) ProtoReflect() protoreflect.Message {
mi := &file_device_state_proto_msgTypes[27]
mi := &file_device_state_proto_msgTypes[28]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@ -3778,7 +3859,7 @@ func (x *PushedDevicesStatus) ProtoReflect() protoreflect.Message {
// Deprecated: Use PushedDevicesStatus.ProtoReflect.Descriptor instead.
func (*PushedDevicesStatus) Descriptor() ([]byte, []int) {
return file_device_state_proto_rawDescGZIP(), []int{27}
return file_device_state_proto_rawDescGZIP(), []int{28}
}
func (x *PushedDevicesStatus) GetAll() bool {
@ -3815,7 +3896,7 @@ type SimulationStatus struct {
func (x *SimulationStatus) Reset() {
*x = SimulationStatus{}
if protoimpl.UnsafeEnabled {
mi := &file_device_state_proto_msgTypes[28]
mi := &file_device_state_proto_msgTypes[29]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@ -3828,7 +3909,7 @@ func (x *SimulationStatus) String() string {
func (*SimulationStatus) ProtoMessage() {}
func (x *SimulationStatus) ProtoReflect() protoreflect.Message {
mi := &file_device_state_proto_msgTypes[28]
mi := &file_device_state_proto_msgTypes[29]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@ -3841,7 +3922,7 @@ func (x *SimulationStatus) ProtoReflect() protoreflect.Message {
// Deprecated: Use SimulationStatus.ProtoReflect.Descriptor instead.
func (*SimulationStatus) Descriptor() ([]byte, []int) {
return file_device_state_proto_rawDescGZIP(), []int{28}
return file_device_state_proto_rawDescGZIP(), []int{29}
}
func (x *SimulationStatus) GetSimulationId() string {
@ -3871,7 +3952,7 @@ type SimulationThirdPartyApiService struct {
func (x *SimulationThirdPartyApiService) Reset() {
*x = SimulationThirdPartyApiService{}
if protoimpl.UnsafeEnabled {
mi := &file_device_state_proto_msgTypes[29]
mi := &file_device_state_proto_msgTypes[30]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@ -3884,7 +3965,7 @@ func (x *SimulationThirdPartyApiService) String() string {
func (*SimulationThirdPartyApiService) ProtoMessage() {}
func (x *SimulationThirdPartyApiService) ProtoReflect() protoreflect.Message {
mi := &file_device_state_proto_msgTypes[29]
mi := &file_device_state_proto_msgTypes[30]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@ -3897,7 +3978,7 @@ func (x *SimulationThirdPartyApiService) ProtoReflect() protoreflect.Message {
// Deprecated: Use SimulationThirdPartyApiService.ProtoReflect.Descriptor instead.
func (*SimulationThirdPartyApiService) Descriptor() ([]byte, []int) {
return file_device_state_proto_rawDescGZIP(), []int{29}
return file_device_state_proto_rawDescGZIP(), []int{30}
}
func (x *SimulationThirdPartyApiService) GetStates() []*SimulationThirdPartyApiServiceState {
@ -3922,7 +4003,7 @@ type SimulationThirdPartyApiServiceState struct {
func (x *SimulationThirdPartyApiServiceState) Reset() {
*x = SimulationThirdPartyApiServiceState{}
if protoimpl.UnsafeEnabled {
mi := &file_device_state_proto_msgTypes[30]
mi := &file_device_state_proto_msgTypes[31]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@ -3935,7 +4016,7 @@ func (x *SimulationThirdPartyApiServiceState) String() string {
func (*SimulationThirdPartyApiServiceState) ProtoMessage() {}
func (x *SimulationThirdPartyApiServiceState) ProtoReflect() protoreflect.Message {
mi := &file_device_state_proto_msgTypes[30]
mi := &file_device_state_proto_msgTypes[31]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@ -3948,7 +4029,7 @@ func (x *SimulationThirdPartyApiServiceState) ProtoReflect() protoreflect.Messag
// Deprecated: Use SimulationThirdPartyApiServiceState.ProtoReflect.Descriptor instead.
func (*SimulationThirdPartyApiServiceState) Descriptor() ([]byte, []int) {
return file_device_state_proto_rawDescGZIP(), []int{30}
return file_device_state_proto_rawDescGZIP(), []int{31}
}
func (x *SimulationThirdPartyApiServiceState) GetType() SimulationThirdPartyApiService_Type {
@ -3980,7 +4061,7 @@ type TrainControlState struct {
func (x *TrainControlState) Reset() {
*x = TrainControlState{}
if protoimpl.UnsafeEnabled {
mi := &file_device_state_proto_msgTypes[31]
mi := &file_device_state_proto_msgTypes[32]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@ -3993,7 +4074,7 @@ func (x *TrainControlState) String() string {
func (*TrainControlState) ProtoMessage() {}
func (x *TrainControlState) ProtoReflect() protoreflect.Message {
mi := &file_device_state_proto_msgTypes[31]
mi := &file_device_state_proto_msgTypes[32]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@ -4006,7 +4087,7 @@ func (x *TrainControlState) ProtoReflect() protoreflect.Message {
// Deprecated: Use TrainControlState.ProtoReflect.Descriptor instead.
func (*TrainControlState) Descriptor() ([]byte, []int) {
return file_device_state_proto_rawDescGZIP(), []int{31}
return file_device_state_proto_rawDescGZIP(), []int{32}
}
func (x *TrainControlState) GetEbutton() *TrainControlState_EmergentButton {
@ -4050,7 +4131,7 @@ type StationQc_State struct {
func (x *StationQc_State) Reset() {
*x = StationQc_State{}
if protoimpl.UnsafeEnabled {
mi := &file_device_state_proto_msgTypes[33]
mi := &file_device_state_proto_msgTypes[34]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@ -4063,7 +4144,7 @@ func (x *StationQc_State) String() string {
func (*StationQc_State) ProtoMessage() {}
func (x *StationQc_State) ProtoReflect() protoreflect.Message {
mi := &file_device_state_proto_msgTypes[33]
mi := &file_device_state_proto_msgTypes[34]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@ -4112,7 +4193,7 @@ type TrainControlState_EmergentButton struct {
func (x *TrainControlState_EmergentButton) Reset() {
*x = TrainControlState_EmergentButton{}
if protoimpl.UnsafeEnabled {
mi := &file_device_state_proto_msgTypes[34]
mi := &file_device_state_proto_msgTypes[35]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@ -4125,7 +4206,7 @@ func (x *TrainControlState_EmergentButton) String() string {
func (*TrainControlState_EmergentButton) ProtoMessage() {}
func (x *TrainControlState_EmergentButton) ProtoReflect() protoreflect.Message {
mi := &file_device_state_proto_msgTypes[34]
mi := &file_device_state_proto_msgTypes[35]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@ -4138,7 +4219,7 @@ func (x *TrainControlState_EmergentButton) ProtoReflect() protoreflect.Message {
// Deprecated: Use TrainControlState_EmergentButton.ProtoReflect.Descriptor instead.
func (*TrainControlState_EmergentButton) Descriptor() ([]byte, []int) {
return file_device_state_proto_rawDescGZIP(), []int{31, 0}
return file_device_state_proto_rawDescGZIP(), []int{32, 0}
}
func (x *TrainControlState_EmergentButton) GetId() uint32 {
@ -4168,7 +4249,7 @@ type TrainControlState_DriverKeySwitch struct {
func (x *TrainControlState_DriverKeySwitch) Reset() {
*x = TrainControlState_DriverKeySwitch{}
if protoimpl.UnsafeEnabled {
mi := &file_device_state_proto_msgTypes[35]
mi := &file_device_state_proto_msgTypes[36]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@ -4181,7 +4262,7 @@ func (x *TrainControlState_DriverKeySwitch) String() string {
func (*TrainControlState_DriverKeySwitch) ProtoMessage() {}
func (x *TrainControlState_DriverKeySwitch) ProtoReflect() protoreflect.Message {
mi := &file_device_state_proto_msgTypes[35]
mi := &file_device_state_proto_msgTypes[36]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@ -4194,7 +4275,7 @@ func (x *TrainControlState_DriverKeySwitch) ProtoReflect() protoreflect.Message
// Deprecated: Use TrainControlState_DriverKeySwitch.ProtoReflect.Descriptor instead.
func (*TrainControlState_DriverKeySwitch) Descriptor() ([]byte, []int) {
return file_device_state_proto_rawDescGZIP(), []int{31, 1}
return file_device_state_proto_rawDescGZIP(), []int{32, 1}
}
func (x *TrainControlState_DriverKeySwitch) GetId() uint32 {
@ -4230,7 +4311,7 @@ type TrainControlState_DirectionKeySwitch struct {
func (x *TrainControlState_DirectionKeySwitch) Reset() {
*x = TrainControlState_DirectionKeySwitch{}
if protoimpl.UnsafeEnabled {
mi := &file_device_state_proto_msgTypes[36]
mi := &file_device_state_proto_msgTypes[37]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@ -4243,7 +4324,7 @@ func (x *TrainControlState_DirectionKeySwitch) String() string {
func (*TrainControlState_DirectionKeySwitch) ProtoMessage() {}
func (x *TrainControlState_DirectionKeySwitch) ProtoReflect() protoreflect.Message {
mi := &file_device_state_proto_msgTypes[36]
mi := &file_device_state_proto_msgTypes[37]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@ -4256,7 +4337,7 @@ func (x *TrainControlState_DirectionKeySwitch) ProtoReflect() protoreflect.Messa
// Deprecated: Use TrainControlState_DirectionKeySwitch.ProtoReflect.Descriptor instead.
func (*TrainControlState_DirectionKeySwitch) Descriptor() ([]byte, []int) {
return file_device_state_proto_rawDescGZIP(), []int{31, 2}
return file_device_state_proto_rawDescGZIP(), []int{32, 2}
}
func (x *TrainControlState_DirectionKeySwitch) GetId() uint32 {
@ -4286,7 +4367,7 @@ type TrainControlState_PushHandler struct {
func (x *TrainControlState_PushHandler) Reset() {
*x = TrainControlState_PushHandler{}
if protoimpl.UnsafeEnabled {
mi := &file_device_state_proto_msgTypes[37]
mi := &file_device_state_proto_msgTypes[38]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@ -4299,7 +4380,7 @@ func (x *TrainControlState_PushHandler) String() string {
func (*TrainControlState_PushHandler) ProtoMessage() {}
func (x *TrainControlState_PushHandler) ProtoReflect() protoreflect.Message {
mi := &file_device_state_proto_msgTypes[37]
mi := &file_device_state_proto_msgTypes[38]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@ -4312,7 +4393,7 @@ func (x *TrainControlState_PushHandler) ProtoReflect() protoreflect.Message {
// Deprecated: Use TrainControlState_PushHandler.ProtoReflect.Descriptor instead.
func (*TrainControlState_PushHandler) Descriptor() ([]byte, []int) {
return file_device_state_proto_rawDescGZIP(), []int{31, 3}
return file_device_state_proto_rawDescGZIP(), []int{32, 3}
}
func (x *TrainControlState_PushHandler) GetId() uint32 {
@ -4913,158 +4994,169 @@ var file_device_state_proto_rawDesc = []byte{
0x0a, 0x03, 0x72, 0x6f, 0x77, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x72, 0x6f, 0x77,
0x12, 0x10, 0x0a, 0x03, 0x63, 0x6f, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x63,
0x6f, 0x6c, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02,
0x6f, 0x6e, 0x22, 0xa1, 0x02, 0x0a, 0x0f, 0x56, 0x61, 0x72, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e,
0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x38, 0x0a, 0x0c, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65,
0x64, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x73,
0x74, 0x61, 0x74, 0x65, 0x2e, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x4d, 0x61, 0x70, 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, 0xb8, 0x05, 0x0a, 0x10, 0x41, 0x6c, 0x6c, 0x44, 0x65,
0x76, 0x69, 0x63, 0x65, 0x73, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x34, 0x0a, 0x0a, 0x74,
0x72, 0x61, 0x69, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32,
0x14, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x4d, 0x61, 0x70,
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, 0x12,
0x3a, 0x0a, 0x0d, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x53, 0x74, 0x61, 0x74, 0x65,
0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x50,
0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x0d, 0x70, 0x6c,
0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x34, 0x0a, 0x0b, 0x62,
0x61, 0x6c, 0x69, 0x73, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b,
0x32, 0x12, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x42, 0x61, 0x6c, 0x69, 0x73, 0x65, 0x53,
0x74, 0x61, 0x74, 0x65, 0x52, 0x0b, 0x62, 0x61, 0x6c, 0x69, 0x73, 0x65, 0x53, 0x74, 0x61, 0x74,
0x65, 0x12, 0x2e, 0x0a, 0x09, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x51, 0x63, 0x18, 0x0d,
0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x53, 0x74, 0x61,
0x74, 0x69, 0x6f, 0x6e, 0x51, 0x63, 0x52, 0x09, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x51,
0x63, 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, 0xc2, 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,
0x22, 0x4b, 0x0a, 0x0f, 0x53, 0x69, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74,
0x61, 0x74, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x49, 0x6e, 0x69, 0x74, 0x10, 0x00, 0x12, 0x0b, 0x0a,
0x07, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x50, 0x61,
0x75, 0x73, 0x65, 0x10, 0x02, 0x12, 0x09, 0x0a, 0x05, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x10, 0x03,
0x12, 0x0b, 0x0a, 0x07, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x10, 0x04, 0x22, 0xc0, 0x01,
0x0a, 0x1e, 0x53, 0x69, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x68, 0x69, 0x72,
0x64, 0x50, 0x61, 0x72, 0x74, 0x79, 0x41, 0x70, 0x69, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65,
0x12, 0x42, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b,
0x32, 0x2a, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x53, 0x69, 0x6d, 0x75, 0x6c, 0x61, 0x74,
0x6f, 0x6e, 0x22, 0x73, 0x0a, 0x08, 0x43, 0x6b, 0x6d, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x0e,
0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x69, 0x64, 0x12, 0x10,
0x0a, 0x03, 0x6d, 0x67, 0x6a, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x6d, 0x67, 0x6a,
0x12, 0x27, 0x0a, 0x05, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32,
0x11, 0x2e, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x43, 0x6b, 0x6d, 0x50, 0x61, 0x72,
0x61, 0x6d, 0x52, 0x05, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x74, 0x61,
0x74, 0x65, 0x4c, 0x6f, 0x73, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x73, 0x74,
0x61, 0x74, 0x65, 0x4c, 0x6f, 0x73, 0x73, 0x22, 0xa1, 0x02, 0x0a, 0x0f, 0x56, 0x61, 0x72, 0x69,
0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x38, 0x0a, 0x0c, 0x75,
0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x03, 0x28,
0x0b, 0x32, 0x14, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x4d,
0x61, 0x70, 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, 0xe7, 0x05, 0x0a, 0x10,
0x41, 0x6c, 0x6c, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73,
0x12, 0x34, 0x0a, 0x0a, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x01,
0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x54, 0x72, 0x61,
0x69, 0x6e, 0x4d, 0x61, 0x70, 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, 0x12, 0x3a, 0x0a, 0x0d, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d,
0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x73, 0x74,
0x61, 0x74, 0x65, 0x2e, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x53, 0x74, 0x61, 0x74,
0x65, 0x52, 0x0d, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x53, 0x74, 0x61, 0x74, 0x65,
0x12, 0x34, 0x0a, 0x0b, 0x62, 0x61, 0x6c, 0x69, 0x73, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18,
0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x42, 0x61,
0x6c, 0x69, 0x73, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x0b, 0x62, 0x61, 0x6c, 0x69, 0x73,
0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2e, 0x0a, 0x09, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f,
0x6e, 0x51, 0x63, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x73, 0x74, 0x61, 0x74,
0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x51, 0x63, 0x52, 0x09, 0x73, 0x74, 0x61,
0x74, 0x69, 0x6f, 0x6e, 0x51, 0x63, 0x12, 0x2d, 0x0a, 0x09, 0x63, 0x6b, 0x6d, 0x53, 0x74, 0x61,
0x74, 0x65, 0x73, 0x18, 0x0e, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x73, 0x74, 0x61, 0x74,
0x65, 0x2e, 0x43, 0x6b, 0x6d, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x09, 0x63, 0x6b, 0x6d, 0x53,
0x74, 0x61, 0x74, 0x65, 0x73, 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, 0xc2, 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, 0x22, 0x4b, 0x0a, 0x0f, 0x53, 0x69, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69,
0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x49, 0x6e, 0x69, 0x74, 0x10,
0x00, 0x12, 0x0b, 0x0a, 0x07, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x10, 0x01, 0x12, 0x09,
0x0a, 0x05, 0x50, 0x61, 0x75, 0x73, 0x65, 0x10, 0x02, 0x12, 0x09, 0x0a, 0x05, 0x45, 0x72, 0x72,
0x6f, 0x72, 0x10, 0x03, 0x12, 0x0b, 0x0a, 0x07, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x10,
0x04, 0x22, 0xc0, 0x01, 0x0a, 0x1e, 0x53, 0x69, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e,
0x54, 0x68, 0x69, 0x72, 0x64, 0x50, 0x61, 0x72, 0x74, 0x79, 0x41, 0x70, 0x69, 0x53, 0x65, 0x72,
0x76, 0x69, 0x63, 0x65, 0x12, 0x42, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x65, 0x73, 0x18, 0x01,
0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x53, 0x69, 0x6d,
0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x68, 0x69, 0x72, 0x64, 0x50, 0x61, 0x72, 0x74,
0x79, 0x41, 0x70, 0x69, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65,
0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x65, 0x73, 0x22, 0x3a, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65,
0x12, 0x0d, 0x0a, 0x09, 0x55, 0x6e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x10, 0x00, 0x12,
0x0c, 0x0a, 0x08, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x73, 0x10, 0x01, 0x12, 0x15, 0x0a,
0x11, 0x53, 0x65, 0x6d, 0x69, 0x50, 0x68, 0x79, 0x73, 0x69, 0x63, 0x61, 0x6c, 0x54, 0x72, 0x61,
0x69, 0x6e, 0x10, 0x02, 0x22, 0x1e, 0x0a, 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x0a, 0x0a,
0x06, 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x45, 0x72, 0x72,
0x6f, 0x72, 0x10, 0x01, 0x22, 0xa8, 0x01, 0x0a, 0x23, 0x53, 0x69, 0x6d, 0x75, 0x6c, 0x61, 0x74,
0x69, 0x6f, 0x6e, 0x54, 0x68, 0x69, 0x72, 0x64, 0x50, 0x61, 0x72, 0x74, 0x79, 0x41, 0x70, 0x69,
0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x06, 0x73, 0x74,
0x61, 0x74, 0x65, 0x73, 0x22, 0x3a, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0d, 0x0a, 0x09,
0x55, 0x6e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x44,
0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x73, 0x10, 0x01, 0x12, 0x15, 0x0a, 0x11, 0x53, 0x65, 0x6d,
0x69, 0x50, 0x68, 0x79, 0x73, 0x69, 0x63, 0x61, 0x6c, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x10, 0x02,
0x22, 0x1e, 0x0a, 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x4e, 0x6f, 0x72,
0x6d, 0x61, 0x6c, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x10, 0x01,
0x22, 0xa8, 0x01, 0x0a, 0x23, 0x53, 0x69, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54,
0x68, 0x69, 0x72, 0x64, 0x50, 0x61, 0x72, 0x74, 0x79, 0x41, 0x70, 0x69, 0x53, 0x65, 0x72, 0x76,
0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x3e, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65,
0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2a, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x53,
0x69, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x68, 0x69, 0x72, 0x64, 0x50, 0x61,
0x72, 0x74, 0x79, 0x41, 0x70, 0x69, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x54, 0x79,
0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x41, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74,
0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e,
0x53, 0x69, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x68, 0x69, 0x72, 0x64, 0x50,
0x61, 0x72, 0x74, 0x79, 0x41, 0x70, 0x69, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x53,
0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0xa8, 0x04, 0x0a, 0x11,
0x54, 0x72, 0x61, 0x69, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x53, 0x74, 0x61, 0x74,
0x65, 0x12, 0x41, 0x0a, 0x07, 0x65, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01,
0x28, 0x0b, 0x32, 0x27, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x54, 0x72, 0x61, 0x69, 0x6e,
0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x45, 0x6d, 0x65,
0x72, 0x67, 0x65, 0x6e, 0x74, 0x42, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x52, 0x07, 0x65, 0x62, 0x75,
0x74, 0x74, 0x6f, 0x6e, 0x12, 0x46, 0x0a, 0x09, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x4b, 0x65,
0x79, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e,
0x54, 0x72, 0x61, 0x69, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x53, 0x74, 0x61, 0x74,
0x65, 0x2e, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x4b, 0x65, 0x79, 0x53, 0x77, 0x69, 0x74, 0x63,
0x68, 0x52, 0x09, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x4b, 0x65, 0x79, 0x12, 0x43, 0x0a, 0x06,
0x64, 0x69, 0x72, 0x4b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x73,
0x74, 0x61, 0x74, 0x65, 0x2e, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f,
0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e,
0x4b, 0x65, 0x79, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x52, 0x06, 0x64, 0x69, 0x72, 0x4b, 0x65,
0x79, 0x12, 0x46, 0x0a, 0x0b, 0x70, 0x75, 0x73, 0x68, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72,
0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x54,
0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x3e, 0x0a, 0x04,
0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2a, 0x2e, 0x73, 0x74, 0x61,
0x74, 0x65, 0x2e, 0x53, 0x69, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x68, 0x69,
0x72, 0x64, 0x50, 0x61, 0x72, 0x74, 0x79, 0x41, 0x70, 0x69, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63,
0x65, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x41, 0x0a, 0x05,
0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x73, 0x74,
0x61, 0x74, 0x65, 0x2e, 0x53, 0x69, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x68,
0x69, 0x72, 0x64, 0x50, 0x61, 0x72, 0x74, 0x79, 0x41, 0x70, 0x69, 0x53, 0x65, 0x72, 0x76, 0x69,
0x63, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22,
0xa8, 0x04, 0x0a, 0x11, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c,
0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x41, 0x0a, 0x07, 0x65, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e,
0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x54,
0x72, 0x61, 0x69, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65,
0x2e, 0x50, 0x75, 0x73, 0x68, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x52, 0x0b, 0x70, 0x75,
0x73, 0x68, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x1a, 0x38, 0x0a, 0x0e, 0x45, 0x6d, 0x65,
0x72, 0x67, 0x65, 0x6e, 0x74, 0x42, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x12, 0x0e, 0x0a, 0x02, 0x69,
0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x69, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x70,
0x61, 0x73, 0x73, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x61, 0x73,
0x73, 0x65, 0x64, 0x1a, 0x58, 0x0a, 0x0f, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x4b, 0x65, 0x79,
0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01,
0x28, 0x0d, 0x52, 0x02, 0x69, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x76, 0x61, 0x6c, 0x18, 0x02, 0x20,
0x01, 0x28, 0x08, 0x52, 0x03, 0x76, 0x61, 0x6c, 0x12, 0x23, 0x0a, 0x02, 0x64, 0x74, 0x18, 0x03,
0x20, 0x01, 0x28, 0x0e, 0x32, 0x13, 0x2e, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x44,
0x72, 0x69, 0x76, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x52, 0x02, 0x64, 0x74, 0x1a, 0x36, 0x0a,
0x12, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4b, 0x65, 0x79, 0x53, 0x77, 0x69,
0x74, 0x63, 0x68, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52,
0x02, 0x69, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x76, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d,
0x52, 0x03, 0x76, 0x61, 0x6c, 0x1a, 0x2f, 0x0a, 0x0b, 0x50, 0x75, 0x73, 0x68, 0x48, 0x61, 0x6e,
0x64, 0x6c, 0x65, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d,
0x52, 0x02, 0x69, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x76, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28,
0x05, 0x52, 0x03, 0x76, 0x61, 0x6c, 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,
0x67, 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, 0x2c, 0x6a, 0x6f, 0x79, 0x6c,
0x69, 0x6e, 0x6b, 0x2e, 0x63, 0x6c, 0x75, 0x62, 0x2f, 0x62, 0x6a, 0x2d, 0x72, 0x74, 0x73, 0x74,
0x73, 0x2d, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2f, 0x64, 0x74, 0x6f, 0x2f, 0x73, 0x74, 0x61,
0x74, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
0x2e, 0x45, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x6e, 0x74, 0x42, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x52,
0x07, 0x65, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x12, 0x46, 0x0a, 0x09, 0x64, 0x72, 0x69, 0x76,
0x65, 0x72, 0x4b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x73, 0x74,
0x61, 0x74, 0x65, 0x2e, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c,
0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x4b, 0x65, 0x79, 0x53,
0x77, 0x69, 0x74, 0x63, 0x68, 0x52, 0x09, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x4b, 0x65, 0x79,
0x12, 0x43, 0x0a, 0x06, 0x64, 0x69, 0x72, 0x4b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b,
0x32, 0x2b, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x43, 0x6f,
0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x44, 0x69, 0x72, 0x65, 0x63,
0x74, 0x69, 0x6f, 0x6e, 0x4b, 0x65, 0x79, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x52, 0x06, 0x64,
0x69, 0x72, 0x4b, 0x65, 0x79, 0x12, 0x46, 0x0a, 0x0b, 0x70, 0x75, 0x73, 0x68, 0x48, 0x61, 0x6e,
0x64, 0x6c, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x73, 0x74, 0x61,
0x74, 0x65, 0x2e, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x53,
0x74, 0x61, 0x74, 0x65, 0x2e, 0x50, 0x75, 0x73, 0x68, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72,
0x52, 0x0b, 0x70, 0x75, 0x73, 0x68, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x1a, 0x38, 0x0a,
0x0e, 0x45, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x6e, 0x74, 0x42, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x12,
0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x69, 0x64, 0x12,
0x16, 0x0a, 0x06, 0x70, 0x61, 0x73, 0x73, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52,
0x06, 0x70, 0x61, 0x73, 0x73, 0x65, 0x64, 0x1a, 0x58, 0x0a, 0x0f, 0x44, 0x72, 0x69, 0x76, 0x65,
0x72, 0x4b, 0x65, 0x79, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64,
0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x69, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x76, 0x61,
0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x76, 0x61, 0x6c, 0x12, 0x23, 0x0a, 0x02,
0x64, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x13, 0x2e, 0x72, 0x65, 0x71, 0x75, 0x65,
0x73, 0x74, 0x2e, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x52, 0x02, 0x64,
0x74, 0x1a, 0x36, 0x0a, 0x12, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4b, 0x65,
0x79, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20,
0x01, 0x28, 0x0d, 0x52, 0x02, 0x69, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x76, 0x61, 0x6c, 0x18, 0x02,
0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x76, 0x61, 0x6c, 0x1a, 0x2f, 0x0a, 0x0b, 0x50, 0x75, 0x73,
0x68, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01,
0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x69, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x76, 0x61, 0x6c, 0x18,
0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x76, 0x61, 0x6c, 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, 0x67, 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, 0x2c,
0x6a, 0x6f, 0x79, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x63, 0x6c, 0x75, 0x62, 0x2f, 0x62, 0x6a, 0x2d,
0x72, 0x74, 0x73, 0x74, 0x73, 0x2d, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2f, 0x64, 0x74, 0x6f,
0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x06, 0x70, 0x72,
0x6f, 0x74, 0x6f, 0x33,
}
var (
@ -5080,7 +5172,7 @@ func file_device_state_proto_rawDescGZIP() []byte {
}
var file_device_state_proto_enumTypes = make([]protoimpl.EnumInfo, 6)
var file_device_state_proto_msgTypes = make([]protoimpl.MessageInfo, 38)
var file_device_state_proto_msgTypes = make([]protoimpl.MessageInfo, 39)
var file_device_state_proto_goTypes = []interface{}{
(SectionType)(0), // 0: state.SectionType
(Signal_Aspect)(0), // 1: state.Signal.Aspect
@ -5113,42 +5205,44 @@ var file_device_state_proto_goTypes = []interface{}{
(*MkxJState)(nil), // 28: state.MkxJState
(*BaliseState)(nil), // 29: state.BaliseState
(*StationQc)(nil), // 30: state.StationQc
(*VariationStatus)(nil), // 31: state.VariationStatus
(*AllDevicesStatus)(nil), // 32: state.AllDevicesStatus
(*PushedDevicesStatus)(nil), // 33: state.PushedDevicesStatus
(*SimulationStatus)(nil), // 34: state.SimulationStatus
(*SimulationThirdPartyApiService)(nil), // 35: state.SimulationThirdPartyApiService
(*SimulationThirdPartyApiServiceState)(nil), // 36: state.SimulationThirdPartyApiServiceState
(*TrainControlState)(nil), // 37: state.TrainControlState
nil, // 38: state.SignalState.RelayStateMapEntry
(*StationQc_State)(nil), // 39: state.StationQc.State
(*TrainControlState_EmergentButton)(nil), // 40: state.TrainControlState.EmergentButton
(*TrainControlState_DriverKeySwitch)(nil), // 41: state.TrainControlState.DriverKeySwitch
(*TrainControlState_DirectionKeySwitch)(nil), // 42: state.TrainControlState.DirectionKeySwitch
(*TrainControlState_PushHandler)(nil), // 43: state.TrainControlState.PushHandler
(*request_proto.PointsParam)(nil), // 44: request.PointsParam
(*request_proto.SignalParam)(nil), // 45: request.SignalParam
(*common_proto.TrainDynamicConfig)(nil), // 46: common.TrainDynamicConfig
(*common_proto.TrainEndsState)(nil), // 47: common.TrainEndsState
(*request_proto.PsdParam)(nil), // 48: request.PsdParam
(*data_proto.KilometerSystem)(nil), // 49: graphicData.KilometerSystem
(request_proto.DriverType)(0), // 50: request.DriverType
(*CkmState)(nil), // 31: state.CkmState
(*VariationStatus)(nil), // 32: state.VariationStatus
(*AllDevicesStatus)(nil), // 33: state.AllDevicesStatus
(*PushedDevicesStatus)(nil), // 34: state.PushedDevicesStatus
(*SimulationStatus)(nil), // 35: state.SimulationStatus
(*SimulationThirdPartyApiService)(nil), // 36: state.SimulationThirdPartyApiService
(*SimulationThirdPartyApiServiceState)(nil), // 37: state.SimulationThirdPartyApiServiceState
(*TrainControlState)(nil), // 38: state.TrainControlState
nil, // 39: state.SignalState.RelayStateMapEntry
(*StationQc_State)(nil), // 40: state.StationQc.State
(*TrainControlState_EmergentButton)(nil), // 41: state.TrainControlState.EmergentButton
(*TrainControlState_DriverKeySwitch)(nil), // 42: state.TrainControlState.DriverKeySwitch
(*TrainControlState_DirectionKeySwitch)(nil), // 43: state.TrainControlState.DirectionKeySwitch
(*TrainControlState_PushHandler)(nil), // 44: state.TrainControlState.PushHandler
(*request_proto.PointsParam)(nil), // 45: request.PointsParam
(*request_proto.SignalParam)(nil), // 46: request.SignalParam
(*common_proto.TrainDynamicConfig)(nil), // 47: common.TrainDynamicConfig
(*common_proto.TrainEndsState)(nil), // 48: common.TrainEndsState
(*request_proto.PsdParam)(nil), // 49: request.PsdParam
(*data_proto.KilometerSystem)(nil), // 50: graphicData.KilometerSystem
(*request_proto.CkmParam)(nil), // 51: request.CkmParam
(request_proto.DriverType)(0), // 52: request.DriverType
}
var file_device_state_proto_depIdxs = []int32{
44, // 0: state.SwitchState.param:type_name -> request.PointsParam
45, // 0: state.SwitchState.param:type_name -> request.PointsParam
1, // 1: state.SignalState.aspect:type_name -> state.Signal.Aspect
45, // 2: state.SignalState.param:type_name -> request.SignalParam
38, // 3: state.SignalState.relayStateMap:type_name -> state.SignalState.RelayStateMapEntry
46, // 2: state.SignalState.param:type_name -> request.SignalParam
39, // 3: state.SignalState.relayStateMap:type_name -> state.SignalState.RelayStateMapEntry
21, // 4: state.PlatformState.spksState:type_name -> state.ReplyState
28, // 5: state.PlatformState.mkxJState:type_name -> state.MkxJState
2, // 6: state.TrainConnState.connType:type_name -> state.TrainConnState.TrainConnType
15, // 7: state.TrainState.dynamicState:type_name -> state.TrainDynamicState
16, // 8: state.TrainState.vobcState:type_name -> state.TrainVobcState
46, // 9: state.TrainState.trainDynamicConfig:type_name -> common.TrainDynamicConfig
47, // 10: state.TrainState.trainEndsA:type_name -> common.TrainEndsState
47, // 11: state.TrainState.trainEndsB:type_name -> common.TrainEndsState
47, // 9: state.TrainState.trainDynamicConfig:type_name -> common.TrainDynamicConfig
48, // 10: state.TrainState.trainEndsA:type_name -> common.TrainEndsState
48, // 11: state.TrainState.trainEndsB:type_name -> common.TrainEndsState
18, // 12: state.TrainState.btmState:type_name -> state.BTMState
37, // 13: state.TrainState.tcc:type_name -> state.TrainControlState
38, // 13: state.TrainState.tcc:type_name -> state.TrainControlState
13, // 14: state.TrainState.connState:type_name -> state.TrainConnState
19, // 15: state.TrainMapState.trainDynamicConfig:type_name -> state.TrainDynamicConfigMqtt
20, // 16: state.TrainMapState.trainEndsA:type_name -> state.TrainEndsStateMqtt
@ -5156,44 +5250,46 @@ var file_device_state_proto_depIdxs = []int32{
18, // 18: state.TrainMapState.btmState:type_name -> state.BTMState
13, // 19: state.TrainMapState.connState:type_name -> state.TrainConnState
26, // 20: state.PsdState.asdStates:type_name -> state.AsdState
48, // 21: state.PsdState.param:type_name -> request.PsdParam
49, // 21: state.PsdState.param:type_name -> request.PsdParam
21, // 22: state.MkxJState.replyState:type_name -> state.ReplyState
49, // 23: state.BaliseState.km:type_name -> graphicData.KilometerSystem
39, // 24: state.StationQc.qdStates:type_name -> state.StationQc.State
39, // 25: state.StationQc.cjStates:type_name -> state.StationQc.State
17, // 26: state.VariationStatus.updatedTrain:type_name -> state.TrainMapState
8, // 27: state.VariationStatus.updatedSwitch:type_name -> state.SwitchState
7, // 28: state.VariationStatus.updatedSection:type_name -> state.SectionState
21, // 29: state.VariationStatus.updatedReply:type_name -> state.ReplyState
17, // 30: state.AllDevicesStatus.trainState:type_name -> state.TrainMapState
8, // 31: state.AllDevicesStatus.switchState:type_name -> state.SwitchState
7, // 32: state.AllDevicesStatus.sectionState:type_name -> state.SectionState
21, // 33: state.AllDevicesStatus.replyState:type_name -> state.ReplyState
9, // 34: state.AllDevicesStatus.signalState:type_name -> state.SignalState
22, // 35: state.AllDevicesStatus.buttonState:type_name -> state.ButtonState
23, // 36: state.AllDevicesStatus.AlarmState:type_name -> state.AlarmState
24, // 37: state.AllDevicesStatus.LightState:type_name -> state.LightState
25, // 38: state.AllDevicesStatus.psdState:type_name -> state.PsdState
27, // 39: state.AllDevicesStatus.KeyState:type_name -> state.KeyState
11, // 40: state.AllDevicesStatus.platformState:type_name -> state.PlatformState
29, // 41: state.AllDevicesStatus.baliseState:type_name -> state.BaliseState
30, // 42: state.AllDevicesStatus.stationQc:type_name -> state.StationQc
31, // 43: state.PushedDevicesStatus.varStatus:type_name -> state.VariationStatus
32, // 44: state.PushedDevicesStatus.allStatus:type_name -> state.AllDevicesStatus
3, // 45: state.SimulationStatus.state:type_name -> state.SimulationStatus.SimulationState
36, // 46: state.SimulationThirdPartyApiService.states:type_name -> state.SimulationThirdPartyApiServiceState
4, // 47: state.SimulationThirdPartyApiServiceState.type:type_name -> state.SimulationThirdPartyApiService.Type
5, // 48: state.SimulationThirdPartyApiServiceState.state:type_name -> state.SimulationThirdPartyApiService.State
40, // 49: state.TrainControlState.ebutton:type_name -> state.TrainControlState.EmergentButton
41, // 50: state.TrainControlState.driverKey:type_name -> state.TrainControlState.DriverKeySwitch
42, // 51: state.TrainControlState.dirKey:type_name -> state.TrainControlState.DirectionKeySwitch
43, // 52: state.TrainControlState.pushHandler:type_name -> state.TrainControlState.PushHandler
50, // 53: state.TrainControlState.DriverKeySwitch.dt:type_name -> request.DriverType
54, // [54:54] is the sub-list for method output_type
54, // [54:54] is the sub-list for method input_type
54, // [54:54] is the sub-list for extension type_name
54, // [54:54] is the sub-list for extension extendee
0, // [0:54] is the sub-list for field type_name
50, // 23: state.BaliseState.km:type_name -> graphicData.KilometerSystem
40, // 24: state.StationQc.qdStates:type_name -> state.StationQc.State
40, // 25: state.StationQc.cjStates:type_name -> state.StationQc.State
51, // 26: state.CkmState.param:type_name -> request.CkmParam
17, // 27: state.VariationStatus.updatedTrain:type_name -> state.TrainMapState
8, // 28: state.VariationStatus.updatedSwitch:type_name -> state.SwitchState
7, // 29: state.VariationStatus.updatedSection:type_name -> state.SectionState
21, // 30: state.VariationStatus.updatedReply:type_name -> state.ReplyState
17, // 31: state.AllDevicesStatus.trainState:type_name -> state.TrainMapState
8, // 32: state.AllDevicesStatus.switchState:type_name -> state.SwitchState
7, // 33: state.AllDevicesStatus.sectionState:type_name -> state.SectionState
21, // 34: state.AllDevicesStatus.replyState:type_name -> state.ReplyState
9, // 35: state.AllDevicesStatus.signalState:type_name -> state.SignalState
22, // 36: state.AllDevicesStatus.buttonState:type_name -> state.ButtonState
23, // 37: state.AllDevicesStatus.AlarmState:type_name -> state.AlarmState
24, // 38: state.AllDevicesStatus.LightState:type_name -> state.LightState
25, // 39: state.AllDevicesStatus.psdState:type_name -> state.PsdState
27, // 40: state.AllDevicesStatus.KeyState:type_name -> state.KeyState
11, // 41: state.AllDevicesStatus.platformState:type_name -> state.PlatformState
29, // 42: state.AllDevicesStatus.baliseState:type_name -> state.BaliseState
30, // 43: state.AllDevicesStatus.stationQc:type_name -> state.StationQc
31, // 44: state.AllDevicesStatus.ckmStates:type_name -> state.CkmState
32, // 45: state.PushedDevicesStatus.varStatus:type_name -> state.VariationStatus
33, // 46: state.PushedDevicesStatus.allStatus:type_name -> state.AllDevicesStatus
3, // 47: state.SimulationStatus.state:type_name -> state.SimulationStatus.SimulationState
37, // 48: state.SimulationThirdPartyApiService.states:type_name -> state.SimulationThirdPartyApiServiceState
4, // 49: state.SimulationThirdPartyApiServiceState.type:type_name -> state.SimulationThirdPartyApiService.Type
5, // 50: state.SimulationThirdPartyApiServiceState.state:type_name -> state.SimulationThirdPartyApiService.State
41, // 51: state.TrainControlState.ebutton:type_name -> state.TrainControlState.EmergentButton
42, // 52: state.TrainControlState.driverKey:type_name -> state.TrainControlState.DriverKeySwitch
43, // 53: state.TrainControlState.dirKey:type_name -> state.TrainControlState.DirectionKeySwitch
44, // 54: state.TrainControlState.pushHandler:type_name -> state.TrainControlState.PushHandler
52, // 55: state.TrainControlState.DriverKeySwitch.dt:type_name -> request.DriverType
56, // [56:56] is the sub-list for method output_type
56, // [56:56] is the sub-list for method input_type
56, // [56:56] is the sub-list for extension type_name
56, // [56:56] is the sub-list for extension extendee
0, // [0:56] is the sub-list for field type_name
}
func init() { file_device_state_proto_init() }
@ -5503,7 +5599,7 @@ func file_device_state_proto_init() {
}
}
file_device_state_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*VariationStatus); i {
switch v := v.(*CkmState); i {
case 0:
return &v.state
case 1:
@ -5515,7 +5611,7 @@ func file_device_state_proto_init() {
}
}
file_device_state_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*AllDevicesStatus); i {
switch v := v.(*VariationStatus); i {
case 0:
return &v.state
case 1:
@ -5527,7 +5623,7 @@ func file_device_state_proto_init() {
}
}
file_device_state_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*PushedDevicesStatus); i {
switch v := v.(*AllDevicesStatus); i {
case 0:
return &v.state
case 1:
@ -5539,7 +5635,7 @@ func file_device_state_proto_init() {
}
}
file_device_state_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*SimulationStatus); i {
switch v := v.(*PushedDevicesStatus); i {
case 0:
return &v.state
case 1:
@ -5551,7 +5647,7 @@ func file_device_state_proto_init() {
}
}
file_device_state_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*SimulationThirdPartyApiService); i {
switch v := v.(*SimulationStatus); i {
case 0:
return &v.state
case 1:
@ -5563,7 +5659,7 @@ func file_device_state_proto_init() {
}
}
file_device_state_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*SimulationThirdPartyApiServiceState); i {
switch v := v.(*SimulationThirdPartyApiService); i {
case 0:
return &v.state
case 1:
@ -5575,6 +5671,18 @@ func file_device_state_proto_init() {
}
}
file_device_state_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*SimulationThirdPartyApiServiceState); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
file_device_state_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*TrainControlState); i {
case 0:
return &v.state
@ -5586,7 +5694,7 @@ func file_device_state_proto_init() {
return nil
}
}
file_device_state_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} {
file_device_state_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*StationQc_State); i {
case 0:
return &v.state
@ -5598,7 +5706,7 @@ func file_device_state_proto_init() {
return nil
}
}
file_device_state_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} {
file_device_state_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*TrainControlState_EmergentButton); i {
case 0:
return &v.state
@ -5610,7 +5718,7 @@ func file_device_state_proto_init() {
return nil
}
}
file_device_state_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} {
file_device_state_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*TrainControlState_DriverKeySwitch); i {
case 0:
return &v.state
@ -5622,7 +5730,7 @@ func file_device_state_proto_init() {
return nil
}
}
file_device_state_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} {
file_device_state_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*TrainControlState_DirectionKeySwitch); i {
case 0:
return &v.state
@ -5634,7 +5742,7 @@ func file_device_state_proto_init() {
return nil
}
}
file_device_state_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} {
file_device_state_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*TrainControlState_PushHandler); i {
case 0:
return &v.state
@ -5653,7 +5761,7 @@ func file_device_state_proto_init() {
GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
RawDescriptor: file_device_state_proto_rawDesc,
NumEnums: 6,
NumMessages: 38,
NumMessages: 39,
NumExtensions: 0,
NumServices: 0,
},

View File

@ -3,6 +3,7 @@ package message_server
import (
"fmt"
"joylink.club/bj-rtsts-server/dto/state_proto"
"log/slog"
"time"
"joylink.club/bj-rtsts-server/dto/data_proto"
@ -16,19 +17,34 @@ import (
func NewPSLMs(vs *memory.VerifySimulation, mapId int32) ms_api.MsgTask {
mapData := memory.QueryGiData[*data_proto.RtssGraphicStorage](mapId)
return ms_api.NewScheduleTask(fmt.Sprintf("地图[%d]综合门控箱按钮状态", mapId), func() error {
return ms_api.NewScheduleTask(fmt.Sprintf("地图[%d]PSL按钮状态", mapId), func() error {
for _, box := range mapData.GateBoxs {
did := memory.GetMapElementId(box.Common)
data_proto, err := collectGateBoxPSLState(vs.World, mapId, box)
data, err := collectGateBoxPSLState(vs.World, mapId, box)
if err != nil {
return err
}
mqtt.GetMsgClient().PubPSLState(vs.SimulationId, mapId, did, data_proto)
sendMsg(vs, mapId, did, data)
}
for _, box := range mapData.GarageDoorBoxes {
did := memory.GetMapElementId(box.Common)
data, err := collectGarageDoorBoxPSLState(vs.World, mapId, box)
if err != nil {
return err
}
sendMsg(vs, mapId, did, data)
}
return nil
}, 200*time.Millisecond)
}
func sendMsg(vs *memory.VerifySimulation, mapId int32, pslId uint32, data *state_proto.PushedDevicesStatus) {
err := mqtt.GetMsgClient().PubPSLState(vs.SimulationId, mapId, pslId, data)
if err != nil {
slog.Error(fmt.Sprintf("发送PSL状态出错%s", err.Error()))
}
}
func collectGateBoxPSLState(world ecs.World, mapId int32, box *data_proto.GatedBox) (*state_proto.PushedDevicesStatus, error) {
did := memory.GetMapElementId(box.Common)
uidStructure := memory.QueryUidStructure[*memory.StationUidStructure](mapId)
@ -67,3 +83,43 @@ func collectGateBoxPSLState(world ecs.World, mapId int32, box *data_proto.GatedB
},
}, nil
}
func collectGarageDoorBoxPSLState(world ecs.World, mapId int32, box *data_proto.GarageDoorBox) (*state_proto.PushedDevicesStatus, error) {
return nil, nil
//did := memory.GetMapElementId(box.Common)
//uidStructure := memory.QueryUidStructure[*memory.StationUidStructure](mapId)
//boxUid := uidStructure.PslIds[did].Uid
//mkxEntry, ok := entity.GetEntityByUid(world, boxUid)
//if !ok {
// return nil, fmt.Errorf("[id:%s]的门控箱实体找不到", boxUid)
//}
//mkx := component.MkxType.Get(mkxEntry)
//var buttonStateArr []*state_proto.ButtonState
//if ok {
// _, pslStorage := memory.QueryGiDataByName[*data_proto.PslGraphicStorage](box.RefGatedBoxMapCode)
// btnUidMap := make(map[string]uint32, len(pslStorage.PslButtons))
// for _, button := range pslStorage.PslButtons {
// btnUidMap[boxUid+"_"+button.Code] = memory.GetMapElementId(button.Common)
// }
// btnArr := []*ecs.Entry{mkx.PCB, mkx.PCBPL, mkx.POB, mkx.POBPL, mkx.PAB, mkx.PABPL, mkx.WRZF, mkx.WRZFPL,
// mkx.QKQR, mkx.QKQRPL, mkx.MPL, mkx.JXTCPL}
// for _, btn := range btnArr {
// if btn == nil {
// continue
// }
// btnState := component.BitStateType.Get(btn)
// buttonStateArr = append(buttonStateArr, &state_proto.ButtonState{
// Id: btnUidMap[component.UidType.Get(btn).Id],
// Down: btnState.Val,
// Active: btnState.Val,
// //Bypass: btnState.BypassEnable,
// })
// }
//}
//return &state_proto.PushedDevicesStatus{
// All: true,
// AllStatus: &state_proto.AllDevicesStatus{
// ButtonState: buttonStateArr,
// },
//}, nil
}

View File

@ -59,6 +59,10 @@ func NewSfpMs(vs *memory.VerifySimulation, mapId int32) ms_api.MsgTask {
if err != nil {
return err
}
ckmStates, err := collectCkmStates(vs.World, mapId)
if err != nil {
return err
}
ststes := &state_proto.PushedDevicesStatus{
All: true,
AllStatus: &state_proto.AllDevicesStatus{
@ -70,6 +74,7 @@ func NewSfpMs(vs *memory.VerifySimulation, mapId int32) ms_api.MsgTask {
SectionState: sectionStates,
PlatformState: platformStates,
BaliseState: baliseStates,
CkmStates: ckmStates,
},
}
err = mqtt.GetMsgClient().PubSfpState(vs.SimulationId, mapId, ststes)
@ -80,6 +85,30 @@ func NewSfpMs(vs *memory.VerifySimulation, mapId int32) ms_api.MsgTask {
}, 1000*time.Millisecond)
}
func collectCkmStates(world ecs.World, mapId int32) ([]*state_proto.CkmState, error) {
uidStructure := memory.QueryUidStructure[*memory.StationUidStructure](mapId)
var ckmStates []*state_proto.CkmState
for id, structure := range uidStructure.CkmIds {
entry, ok := entity.GetEntityByUid(world, structure.Uid)
if ok {
circuit := component.CkmCircuitType.Get(entry)
mgj := component.BitStateType.Get(circuit.MGJ).Val
ckmParam := appcomponent.CkmParamType.Get(entry)
if ckmParam == nil {
ckmParam = &request_proto.CkmParam{}
}
stateLoss := entry.HasComponent(component.CkmStateLossTag)
ckmStates = append(ckmStates, &state_proto.CkmState{
Id: id,
Mgj: mgj,
Param: ckmParam,
StateLoss: stateLoss,
})
}
}
return ckmStates, nil
}
// 收集应答器状态
func collectBaliseStates(world ecs.World, mapId int32) ([]*state_proto.BaliseState, error) {
uidStructure := memory.QueryUidStructure[*memory.StationUidStructure](mapId)

86
protobuf/main.go Normal file
View File

@ -0,0 +1,86 @@
package main
import (
"bufio"
"fmt"
"io/fs"
"log"
"os"
"os/exec"
"path/filepath"
"strings"
)
var (
basePath, _ = os.Getwd()
protoFolder = filepath.Join(basePath, "rts-sim-testing-message", "protos")
protocPath = filepath.Join(basePath, "rts-sim-testing-message", "protoc-23.1", "bin", "win64", "protoc")
modulePrefix = "joylink.club/bj-rtsts-server"
)
func main() {
//先安装以下插件
//go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
protoFiles := getProtoFiles()
// 编译proto文件为Go文件
if err := compileProto(protoFiles); err != nil {
log.Fatalf("编译proto文件失败%v", err)
}
}
// 获取指定文件夹下的所有proto文件的绝对路径
func getProtoFiles() []string {
var protoFiles []string
err := filepath.WalkDir(protoFolder, func(path string, d fs.DirEntry, err error) error {
if !d.IsDir() {
protoFiles = append(protoFiles, path)
}
return err
})
if err != nil {
log.Fatal("获取proto文件列表失败:", err)
}
return protoFiles
}
// 编译proto文件为Go文件
func compileProto(protoFiles []string) error {
for _, fileName := range protoFiles {
file, err := os.Open(fileName)
if err != nil {
return err
}
scanner := bufio.NewScanner(file)
var outPath string
for scanner.Scan() {
text := scanner.Text()
if !strings.HasPrefix(text, "option go_package") {
continue
}
start := strings.Index(text, modulePrefix)
if start < 0 {
break
}
start += len(modulePrefix)
dir := "." + text[start:len(text)-2]
err := os.MkdirAll(dir, fs.ModeDir)
if err != nil {
panic(fmt.Sprintf("创建目录 %s 失败:%v", dir, err))
}
outPath = "paths=source_relative:" + dir
break
}
if outPath == "" {
outPath = "./"
}
cmd := exec.Command(protocPath, "-I="+protoFolder, "--go_out="+outPath, fileName)
fmt.Println(cmd.String())
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
if err := cmd.Run(); err != nil {
return err
}
}
return nil
}

@ -1 +1 @@
Subproject commit f0a6c534ec7b4b0bb128a435c17ef2b20e481b94
Subproject commit d63be32ad560b64cf0f3306108064ed59b6f29e8

@ -1 +1 @@
Subproject commit b748c7ff3ed7d401c8caeaecd3d4ec719ae27ee2
Subproject commit 8086bc2c8c61fe43878051544624aff69aaacbc2

View File

@ -8,7 +8,6 @@ import (
appcomponent "joylink.club/bj-rtsts-server/ts/simulation/app_component"
"joylink.club/ecs"
"joylink.club/rtsssimulation/entity"
"joylink.club/rtsssimulation/fi"
"unsafe"
)
@ -22,22 +21,6 @@ func CkmOperation(simulation *VerifySimulation, req *request_proto.CkmOperationR
return nil
}
func CkmBoxOperation(sim *VerifySimulation, req *request_proto.CkmBoxOperationReq) *sys_error.BusinessError {
uid := QueryUidStructure[*StationUidStructure](req.MapId)
ckmBoxBtnUid := uid.CkmBoxIds[req.CkmBoxId].Uid
var err error
if req.Down {
err = fi.PressDownButton(sim.World, ckmBoxBtnUid+"_"+req.ButtonCode)
} else {
err = fi.PressUpButton(sim.World, ckmBoxBtnUid+"_"+req.ButtonCode)
}
if err != nil {
return sys_error.New("车库门控制盒操作失败", err)
} else {
return nil
}
}
func setParam(simulation *VerifySimulation, req *request_proto.CkmOperationReq) *sys_error.BusinessError {
uid := QueryUidByMidAndComId(req.MapId, req.DeviceId, &data_proto.GarageDoor{})
result := <-ecs.Request[ecs.EmptyType](simulation.World, func() ecs.Result[ecs.EmptyType] {

View File

@ -79,7 +79,12 @@ func GenerateElementUid(city, lineId string, stationIndexList []string, code str
idArr = append(idArr, city, lineId)
idArr = append(idArr, stationIndexList...)
idArr = append(idArr, code)
return strings.Join(idArr, "_")
return BuildUid(idArr...)
}
// GenerateElementUid 构建uid。将args用'_'连接
func BuildUid(args ...string) string {
return strings.Join(args, "_")
}
// 移除内存中的地图信息

View File

@ -45,7 +45,6 @@ type StationUidStructure struct {
SpksSwitchIds map[uint32]*elementIdStructure
IbpIds map[uint32]*elementIdStructure
CkmIds map[uint32]*elementIdStructure
CkmBoxIds map[uint32]*elementIdStructure
}
type RelayUidStructure struct {
@ -257,9 +256,8 @@ func initStationUid(data *data_proto.RtssGraphicStorage) *StationUidStructure {
PsdIds: make(map[uint32]*elementIdStructure, len(data.ScreenDoors)),
PslIds: make(map[uint32]*elementIdStructure, len(data.GateBoxs)),
//SpksSwitchIds: make(map[uint32]*elementIdStructure, len(data.SpksSwitchs)),
IbpIds: make(map[uint32]*elementIdStructure, len(data.IbpBoxs)),
CkmIds: make(map[uint32]*elementIdStructure, len(data.GarageDoors)),
CkmBoxIds: make(map[uint32]*elementIdStructure, len(data.GarageDoors)),
IbpIds: make(map[uint32]*elementIdStructure, len(data.IbpBoxs)),
CkmIds: make(map[uint32]*elementIdStructure, len(data.GarageDoors)),
}
city, lineId, _ := getUIdPrefix(data.UniqueIdPrefix)
// 处理车站信息
@ -422,6 +420,15 @@ func initStationUid(data *data_proto.RtssGraphicStorage) *StationUidStructure {
Uid: GenerateElementUid(city, lineId, nil, ckm.Code),
}
}
for _, box := range data.GarageDoorBoxes {
eid := GetMapElementId(box.Common)
ckmUid := gus.CkmIds[box.RefGarageDoorId].Uid
gus.PslIds[eid] = &elementIdStructure{
CommonId: eid,
Code: box.Code,
Uid: BuildUid(ckmUid, strconv.Itoa(int(eid))),
}
}
//// SPKS人员防护
//for _, spk := range data.SpksSwitchs {
// if spk.RefStand == 0 {

View File

@ -1,16 +1,23 @@
package memory
import (
"joylink.club/bj-rtsts-server/sys_error"
"joylink.club/rtsssimulation/fi"
)
// 操作PSL按钮
func ChangePSLButtonState(sim *VerifySimulation, mapId int32, gateBoxId uint32, btnCode string, pressDown bool) {
func ChangePSLButtonState(sim *VerifySimulation, mapId int32, gateBoxId uint32, btnCode string, pressDown bool) *sys_error.BusinessError {
uid := QueryUidStructure[*StationUidStructure](mapId)
gateBoxUid := uid.PslIds[gateBoxId].Uid
var err error
if pressDown {
fi.PressDownButton(sim.World, gateBoxUid+"_"+btnCode)
err = fi.PressDownButton(sim.World, gateBoxUid+"_"+btnCode)
} else {
fi.PressUpButton(sim.World, gateBoxUid+"_"+btnCode)
err = fi.PressUpButton(sim.World, gateBoxUid+"_"+btnCode)
}
if err != nil {
return sys_error.New("操作PSL按钮出错", err)
} else {
return nil
}
}

View File

@ -704,6 +704,10 @@ func buildAndRelateElectronicComponent(repo *proto.Repository, relayGi *data_pro
for _, platform := range repo.Platforms {
platformMap[platform.Id] = platform
}
ckmMap := make(map[string]*proto.Ckm)
for _, ckm := range repo.Ckms {
ckmMap[ckm.Id] = ckm
}
ciecs := stationMap[stationUid] //联锁集中站
if ciecs == nil {
panic(fmt.Errorf("联锁集中站[%s]不存在", stationUid))
@ -813,6 +817,27 @@ func buildAndRelateElectronicComponent(repo *proto.Repository, relayGi *data_pro
Egs: egs,
})
}
case data_proto.RelatedRef_GarageDoor: //车库门
{
ckm, ok := ckmMap[GenerateElementUid(city, lineId, nil, relationship.Code)]
if !ok {
continue
}
for _, group := range relationship.Combinationtypes {
var componentIds []string
for _, relayId := range group.RefRelays {
if relayUidStructure.RelayIds[relayId] == nil {
continue
}
componentIds = append(componentIds, relayUidStructure.RelayIds[relayId].Uid)
}
ckm.ElectronicComponentGroups = append(ckm.ElectronicComponentGroups,
&proto.ElectronicComponentGroup{
Code: group.Code,
ComponentIds: componentIds,
})
}
}
}
}
//门控箱
@ -848,24 +873,6 @@ func buildAndRelateElectronicComponent(repo *proto.Repository, relayGi *data_pro
}
}
}
//cis := stationMap[stationUid]
//// 零散组合
//for _, com := range relayGi.CombinationtypeList {
// if com.Code == "LS" { // 零散组合
// d := &proto.ElectronicGroup{Code: com.Code}
// for _, relayId := range com.RefRelays {
// if relayUidStructure.RelayIds[relayId] == nil {
// continue
// }
// d.Components = append(d.Components, &proto.ElectronicComponent{
// BaliseId: relayUidStructure.RelayIds[relayId].Uid,
// DeviceType: proto.DeviceType_DeviceType_Relay,
// })
// }
// cis.ElectronicGroup = append(cis.ElectronicGroup, d)
// fmt.Println("构建零散组合结果:", d)
// }
//}
// 处理该集中站采集、驱动配置信息
centralizedStationId := GenerateElementUid(city, lineId, nil, station)
ref := queryCentralizedStationRef(centralizedStationId, repo)
@ -1268,7 +1275,7 @@ func fillProtoRepository(repo *proto.Repository, storage *data_proto.RtssGraphic
platformId_psdUid_map[data.GetRefPlatformId()] = psd.Id
repo.Psds = append(repo.Psds, psd)
}
//PSL
//屏蔽门PSL
for _, data := range storage.PslBoxs {
boxUidInfo := uidsMap.PslIds[GetMapElementId(data.Common)]
mkx := &proto.Mkx{
@ -1319,6 +1326,43 @@ func fillProtoRepository(repo *proto.Repository, storage *data_proto.RtssGraphic
station := repoStationMap[data.RefStationId]
handlerIBPDeviceToStation(station, boxUidInfo.Uid, repo, data.RefIbpMapCode)
}
//车库门
for _, data := range storage.GarageDoors {
id := GetMapElementId(data.Common)
ckm := &proto.Ckm{
Id: uidsMap.CkmIds[id].Uid,
}
repo.Ckms = append(repo.Ckms, ckm)
}
//车库门PSL
for _, data := range storage.GarageDoorBoxes {
boxUidInfo := uidsMap.PslIds[GetMapElementId(data.Common)]
ckmPsl := &proto.CkmPsl{
Id: boxUidInfo.Uid,
CkmId: uidsMap.CkmIds[data.RefGarageDoorId].Uid,
}
repo.CkmPsls = append(repo.CkmPsls, ckmPsl)
_, pslStorage := QueryGiDataByName[*data_proto.PslGraphicStorage](data.RefPslMapCode)
for _, button := range pslStorage.PslButtons {
repoButton := &proto.Button{
Id: boxUidInfo.Uid + "_" + button.Code,
Code: button.Code,
ButtonType: proto.Button_Reset_Press,
HasLight: true,
}
repo.Buttons = append(repo.Buttons, repoButton)
switch button.Code {
case "KMA":
ckmPsl.KmaId = repoButton.Id
case "GMA":
ckmPsl.GmaId = repoButton.Id
case "MPLA":
ckmPsl.MplaId = repoButton.Id
case "MMSA":
ckmPsl.MmsaId = repoButton.Id
}
}
}
}
// 将IBP的设备关联到车站中