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/stop", baliseTelegramStop)
authed.PUT("/balise/telegram/send", baliseTelegramSend) authed.PUT("/balise/telegram/send", baliseTelegramSend)
authed.PUT("/balise/reset", baliseReset) authed.PUT("/balise/reset", baliseReset)
authed.PUT("/ckm/operation") authed.PUT("/ckm/operation", ckmOperation)
//authed.POST("/bypass/operation", bypassBtnOrKeyOperation) //authed.POST("/bypass/operation", bypassBtnOrKeyOperation)
// 初始化地图信息 // 初始化地图信息
@ -614,7 +614,10 @@ func pslBtnOperation(c *gin.Context) {
} }
simulation := checkDeviceDataAndReturn(req.SimulationId) simulation := checkDeviceDataAndReturn(req.SimulationId)
slog.Info("传入状态参数", req) 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") c.JSON(http.StatusOK, "ok")
} }
@ -932,34 +935,6 @@ func ckmOperation(c *gin.Context) {
c.JSON(http.StatusOK, "ok") 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 { func checkDeviceDataAndReturn(simId string) *memory.VerifySimulation {
deviceMemory := ts.FindSimulation(simId) deviceMemory := ts.FindSimulation(simId)

View File

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

View File

@ -3,6 +3,7 @@ package message_server
import ( import (
"fmt" "fmt"
"joylink.club/bj-rtsts-server/dto/state_proto" "joylink.club/bj-rtsts-server/dto/state_proto"
"log/slog"
"time" "time"
"joylink.club/bj-rtsts-server/dto/data_proto" "joylink.club/bj-rtsts-server/dto/data_proto"
@ -16,19 +17,34 @@ import (
func NewPSLMs(vs *memory.VerifySimulation, mapId int32) ms_api.MsgTask { func NewPSLMs(vs *memory.VerifySimulation, mapId int32) ms_api.MsgTask {
mapData := memory.QueryGiData[*data_proto.RtssGraphicStorage](mapId) 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 { for _, box := range mapData.GateBoxs {
did := memory.GetMapElementId(box.Common) did := memory.GetMapElementId(box.Common)
data_proto, err := collectGateBoxPSLState(vs.World, mapId, box) data, err := collectGateBoxPSLState(vs.World, mapId, box)
if err != nil { if err != nil {
return err 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 return nil
}, 200*time.Millisecond) }, 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) { func collectGateBoxPSLState(world ecs.World, mapId int32, box *data_proto.GatedBox) (*state_proto.PushedDevicesStatus, error) {
did := memory.GetMapElementId(box.Common) did := memory.GetMapElementId(box.Common)
uidStructure := memory.QueryUidStructure[*memory.StationUidStructure](mapId) uidStructure := memory.QueryUidStructure[*memory.StationUidStructure](mapId)
@ -67,3 +83,43 @@ func collectGateBoxPSLState(world ecs.World, mapId int32, box *data_proto.GatedB
}, },
}, nil }, 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 { if err != nil {
return err return err
} }
ckmStates, err := collectCkmStates(vs.World, mapId)
if err != nil {
return err
}
ststes := &state_proto.PushedDevicesStatus{ ststes := &state_proto.PushedDevicesStatus{
All: true, All: true,
AllStatus: &state_proto.AllDevicesStatus{ AllStatus: &state_proto.AllDevicesStatus{
@ -70,6 +74,7 @@ func NewSfpMs(vs *memory.VerifySimulation, mapId int32) ms_api.MsgTask {
SectionState: sectionStates, SectionState: sectionStates,
PlatformState: platformStates, PlatformState: platformStates,
BaliseState: baliseStates, BaliseState: baliseStates,
CkmStates: ckmStates,
}, },
} }
err = mqtt.GetMsgClient().PubSfpState(vs.SimulationId, mapId, ststes) 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) }, 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) { func collectBaliseStates(world ecs.World, mapId int32) ([]*state_proto.BaliseState, error) {
uidStructure := memory.QueryUidStructure[*memory.StationUidStructure](mapId) 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" appcomponent "joylink.club/bj-rtsts-server/ts/simulation/app_component"
"joylink.club/ecs" "joylink.club/ecs"
"joylink.club/rtsssimulation/entity" "joylink.club/rtsssimulation/entity"
"joylink.club/rtsssimulation/fi"
"unsafe" "unsafe"
) )
@ -22,22 +21,6 @@ func CkmOperation(simulation *VerifySimulation, req *request_proto.CkmOperationR
return nil 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 { func setParam(simulation *VerifySimulation, req *request_proto.CkmOperationReq) *sys_error.BusinessError {
uid := QueryUidByMidAndComId(req.MapId, req.DeviceId, &data_proto.GarageDoor{}) uid := QueryUidByMidAndComId(req.MapId, req.DeviceId, &data_proto.GarageDoor{})
result := <-ecs.Request[ecs.EmptyType](simulation.World, func() ecs.Result[ecs.EmptyType] { 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, city, lineId)
idArr = append(idArr, stationIndexList...) idArr = append(idArr, stationIndexList...)
idArr = append(idArr, code) 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 SpksSwitchIds map[uint32]*elementIdStructure
IbpIds map[uint32]*elementIdStructure IbpIds map[uint32]*elementIdStructure
CkmIds map[uint32]*elementIdStructure CkmIds map[uint32]*elementIdStructure
CkmBoxIds map[uint32]*elementIdStructure
} }
type RelayUidStructure struct { type RelayUidStructure struct {
@ -259,7 +258,6 @@ func initStationUid(data *data_proto.RtssGraphicStorage) *StationUidStructure {
//SpksSwitchIds: make(map[uint32]*elementIdStructure, len(data.SpksSwitchs)), //SpksSwitchIds: make(map[uint32]*elementIdStructure, len(data.SpksSwitchs)),
IbpIds: make(map[uint32]*elementIdStructure, len(data.IbpBoxs)), IbpIds: make(map[uint32]*elementIdStructure, len(data.IbpBoxs)),
CkmIds: make(map[uint32]*elementIdStructure, len(data.GarageDoors)), CkmIds: make(map[uint32]*elementIdStructure, len(data.GarageDoors)),
CkmBoxIds: make(map[uint32]*elementIdStructure, len(data.GarageDoors)),
} }
city, lineId, _ := getUIdPrefix(data.UniqueIdPrefix) city, lineId, _ := getUIdPrefix(data.UniqueIdPrefix)
// 处理车站信息 // 处理车站信息
@ -422,6 +420,15 @@ func initStationUid(data *data_proto.RtssGraphicStorage) *StationUidStructure {
Uid: GenerateElementUid(city, lineId, nil, ckm.Code), 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人员防护 //// SPKS人员防护
//for _, spk := range data.SpksSwitchs { //for _, spk := range data.SpksSwitchs {
// if spk.RefStand == 0 { // if spk.RefStand == 0 {

View File

@ -1,16 +1,23 @@
package memory package memory
import ( import (
"joylink.club/bj-rtsts-server/sys_error"
"joylink.club/rtsssimulation/fi" "joylink.club/rtsssimulation/fi"
) )
// 操作PSL按钮 // 操作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) uid := QueryUidStructure[*StationUidStructure](mapId)
gateBoxUid := uid.PslIds[gateBoxId].Uid gateBoxUid := uid.PslIds[gateBoxId].Uid
var err error
if pressDown { if pressDown {
fi.PressDownButton(sim.World, gateBoxUid+"_"+btnCode) err = fi.PressDownButton(sim.World, gateBoxUid+"_"+btnCode)
} else { } 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 { for _, platform := range repo.Platforms {
platformMap[platform.Id] = platform platformMap[platform.Id] = platform
} }
ckmMap := make(map[string]*proto.Ckm)
for _, ckm := range repo.Ckms {
ckmMap[ckm.Id] = ckm
}
ciecs := stationMap[stationUid] //联锁集中站 ciecs := stationMap[stationUid] //联锁集中站
if ciecs == nil { if ciecs == nil {
panic(fmt.Errorf("联锁集中站[%s]不存在", stationUid)) panic(fmt.Errorf("联锁集中站[%s]不存在", stationUid))
@ -813,6 +817,27 @@ func buildAndRelateElectronicComponent(repo *proto.Repository, relayGi *data_pro
Egs: egs, 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) centralizedStationId := GenerateElementUid(city, lineId, nil, station)
ref := queryCentralizedStationRef(centralizedStationId, repo) ref := queryCentralizedStationRef(centralizedStationId, repo)
@ -1268,7 +1275,7 @@ func fillProtoRepository(repo *proto.Repository, storage *data_proto.RtssGraphic
platformId_psdUid_map[data.GetRefPlatformId()] = psd.Id platformId_psdUid_map[data.GetRefPlatformId()] = psd.Id
repo.Psds = append(repo.Psds, psd) repo.Psds = append(repo.Psds, psd)
} }
//PSL //屏蔽门PSL
for _, data := range storage.PslBoxs { for _, data := range storage.PslBoxs {
boxUidInfo := uidsMap.PslIds[GetMapElementId(data.Common)] boxUidInfo := uidsMap.PslIds[GetMapElementId(data.Common)]
mkx := &proto.Mkx{ mkx := &proto.Mkx{
@ -1319,6 +1326,43 @@ func fillProtoRepository(repo *proto.Repository, storage *data_proto.RtssGraphic
station := repoStationMap[data.RefStationId] station := repoStationMap[data.RefStationId]
handlerIBPDeviceToStation(station, boxUidInfo.Uid, repo, data.RefIbpMapCode) 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的设备关联到车站中 // 将IBP的设备关联到车站中