Compare commits
7 Commits
b8dc207a0e
...
ff67c84f18
Author | SHA1 | Date | |
---|---|---|---|
|
ff67c84f18 | ||
ccaf53ec67 | |||
|
2fa2e90d57 | ||
|
037cf2f1be | ||
aa04a9fbf4 | |||
8a6de531c8 | |||
4bdd91c18b |
@ -406,7 +406,6 @@ func controlTrain(c *gin.Context) {
|
|||||||
// @Failure 500 {object} dto.ErrorDto
|
// @Failure 500 {object} dto.ErrorDto
|
||||||
// @Router /api/v1/simulation/train/remove/all [post]
|
// @Router /api/v1/simulation/train/remove/all [post]
|
||||||
func removeAllTrain(c *gin.Context) {
|
func removeAllTrain(c *gin.Context) {
|
||||||
|
|
||||||
rt := &dto.RemoveAllTrainRspDto{}
|
rt := &dto.RemoveAllTrainRspDto{}
|
||||||
if err := c.ShouldBind(&rt); err != nil {
|
if err := c.ShouldBind(&rt); err != nil {
|
||||||
panic(sys_error.New("移除所有列车失败,请求参数异常", err))
|
panic(sys_error.New("移除所有列车失败,请求参数异常", err))
|
||||||
|
37
config/bj_local_pxf_2.yml
Normal file
37
config/bj_local_pxf_2.yml
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
# 服务配置
|
||||||
|
server:
|
||||||
|
# 服务端口
|
||||||
|
port: 9092
|
||||||
|
|
||||||
|
# 数据源
|
||||||
|
datasource:
|
||||||
|
# 数据库访问url
|
||||||
|
dsn: root:Joylink@0503@tcp(172.29.5.167:3306)/bj-rtsts?charset=utf8mb4&parseTime=true&loc=UTC
|
||||||
|
|
||||||
|
# 日志配置
|
||||||
|
logging:
|
||||||
|
# 日志级别
|
||||||
|
level: info
|
||||||
|
# 格式化
|
||||||
|
# format: json
|
||||||
|
# 日志文件路径
|
||||||
|
path: /home/joylink/logs/bjrtsts2
|
||||||
|
# 日志文件名
|
||||||
|
fileName: bjrtsts.log
|
||||||
|
# 单个日志文件大小,单位mb,超过会自动滚动
|
||||||
|
fileMaxSize: 50
|
||||||
|
# 日志文件最大备份数量
|
||||||
|
fileMaxBackups: 100
|
||||||
|
# 日志文件最大保留时间,单位 天
|
||||||
|
maxAge: 30
|
||||||
|
# 是否压缩日志
|
||||||
|
compress: false
|
||||||
|
# 控制台是否输出
|
||||||
|
stdout: false
|
||||||
|
|
||||||
|
# 消息配置
|
||||||
|
messaging:
|
||||||
|
mqtt:
|
||||||
|
address: tcp://172.29.5.168:1883
|
||||||
|
username: rtsts_service
|
||||||
|
password: joylink@0503
|
@ -160,7 +160,8 @@ type VehiclePCSimConfig2 struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type VehiclePCSimConfig struct {
|
type VehiclePCSimConfig struct {
|
||||||
TrainEnds bool `json:"trainEnds" description:"列车端点A?"`
|
//TrainEnds bool `json:"trainEnds" description:"列车端点A?"`
|
||||||
|
ConfigName string `json:"configName" description:"连接名称"`
|
||||||
Open bool `json:"open" description:"是否开启"`
|
Open bool `json:"open" description:"是否开启"`
|
||||||
PcSimIp string `json:"pcSimIp" description:"pc仿真平台通信ip"`
|
PcSimIp string `json:"pcSimIp" description:"pc仿真平台通信ip"`
|
||||||
PcSimPort uint32 `json:"pcSimPort" description:"pc仿真平台通信端口"`
|
PcSimPort uint32 `json:"pcSimPort" description:"pc仿真平台通信端口"`
|
||||||
@ -179,15 +180,26 @@ type RsspNetConfig struct {
|
|||||||
RemoteIp string `json:"remoteIp" description:"远端IP"`
|
RemoteIp string `json:"remoteIp" description:"远端IP"`
|
||||||
RemotePort int `json:"remotePort" description:"远端端口"`
|
RemotePort int `json:"remotePort" description:"远端端口"`
|
||||||
LocalPort int `json:"localPort" description:"本地端口"`
|
LocalPort int `json:"localPort" description:"本地端口"`
|
||||||
SourceAddr string `json:"sourceAddr" description:"源地址(16进制,2字节)"`
|
|
||||||
TargetAddr string `json:"targetAddr" description:"目的地址(16进制,2字节)"`
|
RemoteAddr string `json:"sourceAddr" description:"联锁地址(16进制,2字节)"`
|
||||||
Sid1 string `json:"sid1" description:"SID_1(16进制,4字节)"`
|
LocalAddr string `json:"targetAddr" description:"计轴地址(16进制,2字节)"`
|
||||||
Sid2 string `json:"sid2" description:"SID_2(16进制,4字节)"`
|
|
||||||
Sinit1 string `json:"sinit1" description:"SINIT_1(16进制,4字节)"`
|
RemoteSid1 string `json:"remoteSid1" description:"联锁SID_1(16进制,4字节)"`
|
||||||
Sinit2 string `json:"sinit2" description:"SINIT_2(16进制,4字节)"`
|
RemoteSid2 string `json:"remoteSid2" description:"联锁SID_2(16进制,4字节)"`
|
||||||
DataVer1 string `json:"dataVer1" description:"DATAVER_1(16进制,4字节)"`
|
LocalSid1 string `json:"localSid1" description:"计轴SID_1(16进制,4字节)"`
|
||||||
DataVer2 string `json:"dataVer2" description:"DATAVER_2(16进制,4字节)"`
|
LocalSid2 string `json:"localSid2" description:"计轴SID_2(16进制,4字节)"`
|
||||||
MaxDeviation uint32 `json:"maxDeviation" description:"可容忍的最大时序偏差"`
|
|
||||||
|
RemoteSinit1 string `json:"remoteSinit1" description:"联锁SINIT_1(16进制,4字节)"`
|
||||||
|
RemoteSinit2 string `json:"remoteSinit2" description:"联锁SINIT_2(16进制,4字节)"`
|
||||||
|
LocalSinit1 string `json:"localSinit1" description:"计轴SINIT_1(16进制,4字节)"`
|
||||||
|
LocalSinit2 string `json:"localSinit2" description:"计轴SINIT_2(16进制,4字节)"`
|
||||||
|
|
||||||
|
RemoteDataVer1 string `json:"remoteDataVer1" description:"联锁DATAVER_1(16进制,4字节)"`
|
||||||
|
RemoteDataVer2 string `json:"remoteDataVer2" description:"联锁DATAVER_2(16进制,4字节)"`
|
||||||
|
LocalDataVer1 string `json:"localDataVer1" description:"计轴DATAVER_1(16进制,4字节)"`
|
||||||
|
LocalDataVer2 string `json:"localDataVer2" description:"计轴DATAVER_2(16进制,4字节)"`
|
||||||
|
|
||||||
|
MaxDeviation int `json:"maxDeviation" description:"可容忍的最大时序偏差"`
|
||||||
WaitSSRTimeout int `json:"waitSSRTimeout" description:"等待SSR回应的定时器超时值(ms)"`
|
WaitSSRTimeout int `json:"waitSSRTimeout" description:"等待SSR回应的定时器超时值(ms)"`
|
||||||
Period int `json:"period" description:"RSD发送周期(ms)"`
|
Period int `json:"period" description:"RSD发送周期(ms)"`
|
||||||
}
|
}
|
||||||
|
@ -3222,6 +3222,8 @@ type Transponder struct {
|
|||||||
FixedTelegram string `protobuf:"bytes,11,opt,name=fixedTelegram,proto3" json:"fixedTelegram,omitempty"` //应答器固定报文
|
FixedTelegram string `protobuf:"bytes,11,opt,name=fixedTelegram,proto3" json:"fixedTelegram,omitempty"` //应答器固定报文
|
||||||
FixedUserTelegram string `protobuf:"bytes,12,opt,name=fixedUserTelegram,proto3" json:"fixedUserTelegram,omitempty"` //应答器固定用户报文
|
FixedUserTelegram string `protobuf:"bytes,12,opt,name=fixedUserTelegram,proto3" json:"fixedUserTelegram,omitempty"` //应答器固定用户报文
|
||||||
OriginalCode string `protobuf:"bytes,13,opt,name=originalCode,proto3" json:"originalCode,omitempty"` //应答器原编号(厂商提供数据编号)
|
OriginalCode string `protobuf:"bytes,13,opt,name=originalCode,proto3" json:"originalCode,omitempty"` //应答器原编号(厂商提供数据编号)
|
||||||
|
LeuIndex uint32 `protobuf:"varint,14,opt,name=leuIndex,proto3" json:"leuIndex,omitempty"` //LEU索引
|
||||||
|
LeuInsideIndex uint32 `protobuf:"varint,15,opt,name=leuInsideIndex,proto3" json:"leuInsideIndex,omitempty"` // LEU内部索引
|
||||||
}
|
}
|
||||||
|
|
||||||
func (x *Transponder) Reset() {
|
func (x *Transponder) Reset() {
|
||||||
@ -3319,6 +3321,20 @@ func (x *Transponder) GetOriginalCode() string {
|
|||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (x *Transponder) GetLeuIndex() uint32 {
|
||||||
|
if x != nil {
|
||||||
|
return x.LeuIndex
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *Transponder) GetLeuInsideIndex() uint32 {
|
||||||
|
if x != nil {
|
||||||
|
return x.LeuInsideIndex
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
type SimpleRef struct {
|
type SimpleRef struct {
|
||||||
state protoimpl.MessageState
|
state protoimpl.MessageState
|
||||||
sizeCache protoimpl.SizeCache
|
sizeCache protoimpl.SizeCache
|
||||||
@ -6307,7 +6323,7 @@ var file_stationLayoutGraphics_proto_rawDesc = []byte{
|
|||||||
0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x73,
|
0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x73,
|
||||||
0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x54, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01,
|
0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x54, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01,
|
||||||
0x28, 0x09, 0x52, 0x0d, 0x73, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x54, 0x79, 0x70,
|
0x28, 0x09, 0x52, 0x0d, 0x73, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x54, 0x79, 0x70,
|
||||||
0x65, 0x22, 0x86, 0x04, 0x0a, 0x0b, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x65,
|
0x65, 0x22, 0xca, 0x04, 0x0a, 0x0b, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x65,
|
||||||
0x72, 0x12, 0x2f, 0x0a, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28,
|
0x72, 0x12, 0x2f, 0x0a, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28,
|
||||||
0x0b, 0x32, 0x17, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x44, 0x61, 0x74, 0x61, 0x2e,
|
0x0b, 0x32, 0x17, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x44, 0x61, 0x74, 0x61, 0x2e,
|
||||||
0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x06, 0x63, 0x6f, 0x6d, 0x6d,
|
0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x06, 0x63, 0x6f, 0x6d, 0x6d,
|
||||||
@ -6335,42 +6351,64 @@ var file_stationLayoutGraphics_proto_rawDesc = []byte{
|
|||||||
0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x66, 0x69, 0x78, 0x65, 0x64, 0x55, 0x73, 0x65, 0x72, 0x54,
|
0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x66, 0x69, 0x78, 0x65, 0x64, 0x55, 0x73, 0x65, 0x72, 0x54,
|
||||||
0x65, 0x6c, 0x65, 0x67, 0x72, 0x61, 0x6d, 0x12, 0x22, 0x0a, 0x0c, 0x6f, 0x72, 0x69, 0x67, 0x69,
|
0x65, 0x6c, 0x65, 0x67, 0x72, 0x61, 0x6d, 0x12, 0x22, 0x0a, 0x0c, 0x6f, 0x72, 0x69, 0x67, 0x69,
|
||||||
0x6e, 0x61, 0x6c, 0x43, 0x6f, 0x64, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6f,
|
0x6e, 0x61, 0x6c, 0x43, 0x6f, 0x64, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6f,
|
||||||
0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x43, 0x6f, 0x64, 0x65, 0x22, 0x3d, 0x0a, 0x13, 0x54,
|
0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x6c,
|
||||||
0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x45, 0x6e,
|
0x65, 0x75, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x6c,
|
||||||
0x75, 0x6d, 0x12, 0x06, 0x0a, 0x02, 0x46, 0x42, 0x10, 0x00, 0x12, 0x06, 0x0a, 0x02, 0x57, 0x42,
|
0x65, 0x75, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x26, 0x0a, 0x0e, 0x6c, 0x65, 0x75, 0x49, 0x6e,
|
||||||
0x10, 0x01, 0x12, 0x06, 0x0a, 0x02, 0x44, 0x42, 0x10, 0x02, 0x12, 0x06, 0x0a, 0x02, 0x56, 0x42,
|
0x73, 0x69, 0x64, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0d, 0x52,
|
||||||
0x10, 0x03, 0x12, 0x06, 0x0a, 0x02, 0x49, 0x42, 0x10, 0x04, 0x22, 0x8b, 0x01, 0x0a, 0x09, 0x53,
|
0x0e, 0x6c, 0x65, 0x75, 0x49, 0x6e, 0x73, 0x69, 0x64, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x22,
|
||||||
0x69, 0x6d, 0x70, 0x6c, 0x65, 0x52, 0x65, 0x66, 0x12, 0x41, 0x0a, 0x0a, 0x64, 0x65, 0x76, 0x69,
|
0x3d, 0x0a, 0x13, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x65, 0x72, 0x54, 0x79,
|
||||||
0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x21, 0x2e, 0x67,
|
0x70, 0x65, 0x45, 0x6e, 0x75, 0x6d, 0x12, 0x06, 0x0a, 0x02, 0x46, 0x42, 0x10, 0x00, 0x12, 0x06,
|
||||||
0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x69, 0x6d, 0x70, 0x6c,
|
0x0a, 0x02, 0x57, 0x42, 0x10, 0x01, 0x12, 0x06, 0x0a, 0x02, 0x44, 0x42, 0x10, 0x02, 0x12, 0x06,
|
||||||
0x65, 0x52, 0x65, 0x66, 0x2e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52,
|
0x0a, 0x02, 0x56, 0x42, 0x10, 0x03, 0x12, 0x06, 0x0a, 0x02, 0x49, 0x42, 0x10, 0x04, 0x22, 0x8b,
|
||||||
0x0a, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69,
|
0x01, 0x0a, 0x09, 0x53, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x52, 0x65, 0x66, 0x12, 0x41, 0x0a, 0x0a,
|
||||||
0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x69, 0x64, 0x22, 0x2b, 0x0a, 0x0a, 0x44,
|
0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e,
|
||||||
0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x54, 0x75, 0x72,
|
0x32, 0x21, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x53,
|
||||||
0x6e, 0x6f, 0x75, 0x74, 0x10, 0x00, 0x12, 0x10, 0x0a, 0x0c, 0x41, 0x78, 0x6c, 0x65, 0x43, 0x6f,
|
0x69, 0x6d, 0x70, 0x6c, 0x65, 0x52, 0x65, 0x66, 0x2e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54,
|
||||||
0x75, 0x6e, 0x74, 0x69, 0x6e, 0x67, 0x10, 0x01, 0x22, 0xcc, 0x02, 0x0a, 0x0b, 0x53, 0x65, 0x63,
|
0x79, 0x70, 0x65, 0x52, 0x0a, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12,
|
||||||
0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x6e, 0x6b, 0x12, 0x2f, 0x0a, 0x06, 0x63, 0x6f, 0x6d, 0x6d,
|
0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x69, 0x64, 0x22,
|
||||||
0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68,
|
0x2b, 0x0a, 0x0a, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a,
|
||||||
0x69, 0x63, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x49, 0x6e, 0x66,
|
0x07, 0x54, 0x75, 0x72, 0x6e, 0x6f, 0x75, 0x74, 0x10, 0x00, 0x12, 0x10, 0x0a, 0x0c, 0x41, 0x78,
|
||||||
0x6f, 0x52, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64,
|
0x6c, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x69, 0x6e, 0x67, 0x10, 0x01, 0x22, 0xcc, 0x02, 0x0a,
|
||||||
0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x2a, 0x0a,
|
0x0b, 0x53, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x6e, 0x6b, 0x12, 0x2f, 0x0a, 0x06,
|
||||||
0x06, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e,
|
0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67,
|
||||||
0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x50, 0x6f, 0x69, 0x6e,
|
0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f,
|
||||||
0x74, 0x52, 0x06, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x75, 0x70, 0x18,
|
0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x12, 0x12, 0x0a,
|
||||||
0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x75, 0x70, 0x12, 0x30, 0x0a, 0x07, 0x61, 0x53, 0x69,
|
0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64,
|
||||||
0x6d, 0x52, 0x65, 0x66, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x72, 0x61,
|
0x65, 0x12, 0x2a, 0x0a, 0x06, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28,
|
||||||
0x70, 0x68, 0x69, 0x63, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x52,
|
0x0b, 0x32, 0x12, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x44, 0x61, 0x74, 0x61, 0x2e,
|
||||||
0x65, 0x66, 0x52, 0x07, 0x61, 0x53, 0x69, 0x6d, 0x52, 0x65, 0x66, 0x12, 0x30, 0x0a, 0x07, 0x62,
|
0x50, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x06, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x12, 0x0e, 0x0a,
|
||||||
0x53, 0x69, 0x6d, 0x52, 0x65, 0x66, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67,
|
0x02, 0x75, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x75, 0x70, 0x12, 0x30, 0x0a,
|
||||||
0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x69, 0x6d, 0x70, 0x6c,
|
0x07, 0x61, 0x53, 0x69, 0x6d, 0x52, 0x65, 0x66, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16,
|
||||||
0x65, 0x52, 0x65, 0x66, 0x52, 0x07, 0x62, 0x53, 0x69, 0x6d, 0x52, 0x65, 0x66, 0x12, 0x2b, 0x0a,
|
0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x69, 0x6d,
|
||||||
0x04, 0x61, 0x52, 0x65, 0x66, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x72,
|
0x70, 0x6c, 0x65, 0x52, 0x65, 0x66, 0x52, 0x07, 0x61, 0x53, 0x69, 0x6d, 0x52, 0x65, 0x66, 0x12,
|
||||||
0x61, 0x70, 0x68, 0x69, 0x63, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x65,
|
0x30, 0x0a, 0x07, 0x62, 0x53, 0x69, 0x6d, 0x52, 0x65, 0x66, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b,
|
||||||
0x64, 0x52, 0x65, 0x66, 0x52, 0x04, 0x61, 0x52, 0x65, 0x66, 0x12, 0x2b, 0x0a, 0x04, 0x62, 0x52,
|
0x32, 0x16, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x53,
|
||||||
0x65, 0x66, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68,
|
0x69, 0x6d, 0x70, 0x6c, 0x65, 0x52, 0x65, 0x66, 0x52, 0x07, 0x62, 0x53, 0x69, 0x6d, 0x52, 0x65,
|
||||||
0x69, 0x63, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x52, 0x65,
|
0x66, 0x12, 0x2b, 0x0a, 0x04, 0x61, 0x52, 0x65, 0x66, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32,
|
||||||
0x66, 0x52, 0x04, 0x62, 0x52, 0x65, 0x66, 0x22, 0xa0, 0x02, 0x0a, 0x13, 0x41, 0x78, 0x6c, 0x65,
|
0x17, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65,
|
||||||
0x43, 0x6f, 0x75, 0x6e, 0x74, 0x69, 0x6e, 0x67, 0x53, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12,
|
0x6c, 0x61, 0x74, 0x65, 0x64, 0x52, 0x65, 0x66, 0x52, 0x04, 0x61, 0x52, 0x65, 0x66, 0x12, 0x2b,
|
||||||
|
0x0a, 0x04, 0x62, 0x52, 0x65, 0x66, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67,
|
||||||
|
0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x6c, 0x61, 0x74,
|
||||||
|
0x65, 0x64, 0x52, 0x65, 0x66, 0x52, 0x04, 0x62, 0x52, 0x65, 0x66, 0x22, 0xa0, 0x02, 0x0a, 0x13,
|
||||||
|
0x41, 0x78, 0x6c, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x69, 0x6e, 0x67, 0x53, 0x65, 0x63, 0x74,
|
||||||
|
0x69, 0x6f, 0x6e, 0x12, 0x2f, 0x0a, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x18, 0x01, 0x20,
|
||||||
|
0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x44, 0x61, 0x74,
|
||||||
|
0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x06, 0x63, 0x6f,
|
||||||
|
0x6d, 0x6d, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01,
|
||||||
|
0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x2a, 0x0a, 0x06, 0x70, 0x6f, 0x69, 0x6e,
|
||||||
|
0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68,
|
||||||
|
0x69, 0x63, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x06, 0x70, 0x6f,
|
||||||
|
0x69, 0x6e, 0x74, 0x73, 0x12, 0x2d, 0x0a, 0x05, 0x70, 0x61, 0x52, 0x65, 0x66, 0x18, 0x04, 0x20,
|
||||||
|
0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x44, 0x61, 0x74,
|
||||||
|
0x61, 0x2e, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x52, 0x65, 0x66, 0x52, 0x05, 0x70, 0x61,
|
||||||
|
0x52, 0x65, 0x66, 0x12, 0x2d, 0x0a, 0x05, 0x70, 0x62, 0x52, 0x65, 0x66, 0x18, 0x05, 0x20, 0x01,
|
||||||
|
0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x44, 0x61, 0x74, 0x61,
|
||||||
|
0x2e, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x52, 0x65, 0x66, 0x52, 0x05, 0x70, 0x62, 0x52,
|
||||||
|
0x65, 0x66, 0x12, 0x3a, 0x0a, 0x0a, 0x74, 0x75, 0x72, 0x6e, 0x6f, 0x75, 0x74, 0x50, 0x6f, 0x73,
|
||||||
|
0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63,
|
||||||
|
0x44, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x75, 0x72, 0x6e, 0x6f, 0x75, 0x74, 0x50, 0x6f, 0x73, 0x52,
|
||||||
|
0x65, 0x66, 0x52, 0x0a, 0x74, 0x75, 0x72, 0x6e, 0x6f, 0x75, 0x74, 0x50, 0x6f, 0x73, 0x22, 0xc3,
|
||||||
|
0x01, 0x0a, 0x0c, 0x4c, 0x6f, 0x67, 0x69, 0x63, 0x53, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12,
|
||||||
0x2f, 0x0a, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32,
|
0x2f, 0x0a, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32,
|
||||||
0x17, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x6f,
|
0x17, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x6f,
|
||||||
0x6d, 0x6d, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e,
|
0x6d, 0x6d, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e,
|
||||||
@ -6378,356 +6416,330 @@ var file_stationLayoutGraphics_proto_rawDesc = []byte{
|
|||||||
0x63, 0x6f, 0x64, 0x65, 0x12, 0x2a, 0x0a, 0x06, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x03,
|
0x63, 0x6f, 0x64, 0x65, 0x12, 0x2a, 0x0a, 0x06, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x03,
|
||||||
0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x44, 0x61,
|
0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x44, 0x61,
|
||||||
0x74, 0x61, 0x2e, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x06, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73,
|
0x74, 0x61, 0x2e, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x06, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73,
|
||||||
0x12, 0x2d, 0x0a, 0x05, 0x70, 0x61, 0x52, 0x65, 0x66, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32,
|
0x12, 0x24, 0x0a, 0x0d, 0x61, 0x78, 0x6c, 0x65, 0x53, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49,
|
||||||
0x17, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65,
|
0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x61, 0x78, 0x6c, 0x65, 0x53, 0x65, 0x63,
|
||||||
0x6c, 0x61, 0x74, 0x65, 0x64, 0x52, 0x65, 0x66, 0x52, 0x05, 0x70, 0x61, 0x52, 0x65, 0x66, 0x12,
|
0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x75, 0x72, 0x6e, 0x6f, 0x75,
|
||||||
0x2d, 0x0a, 0x05, 0x70, 0x62, 0x52, 0x65, 0x66, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17,
|
0x74, 0x49, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x74, 0x75, 0x72, 0x6e, 0x6f,
|
||||||
0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x6c,
|
0x75, 0x74, 0x49, 0x64, 0x22, 0x81, 0x03, 0x0a, 0x0c, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x65,
|
||||||
0x61, 0x74, 0x65, 0x64, 0x52, 0x65, 0x66, 0x52, 0x05, 0x70, 0x62, 0x52, 0x65, 0x66, 0x12, 0x3a,
|
0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2f, 0x0a, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x18,
|
||||||
0x0a, 0x0a, 0x74, 0x75, 0x72, 0x6e, 0x6f, 0x75, 0x74, 0x50, 0x6f, 0x73, 0x18, 0x06, 0x20, 0x03,
|
0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x44,
|
||||||
0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x44, 0x61, 0x74, 0x61,
|
0x61, 0x74, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x06,
|
||||||
0x2e, 0x54, 0x75, 0x72, 0x6e, 0x6f, 0x75, 0x74, 0x50, 0x6f, 0x73, 0x52, 0x65, 0x66, 0x52, 0x0a,
|
0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x12, 0x2a, 0x0a, 0x06, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73,
|
||||||
0x74, 0x75, 0x72, 0x6e, 0x6f, 0x75, 0x74, 0x50, 0x6f, 0x73, 0x22, 0xc3, 0x01, 0x0a, 0x0c, 0x4c,
|
0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63,
|
||||||
0x6f, 0x67, 0x69, 0x63, 0x53, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2f, 0x0a, 0x06, 0x63,
|
0x44, 0x61, 0x74, 0x61, 0x2e, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x06, 0x70, 0x6f, 0x69, 0x6e,
|
||||||
0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x72,
|
0x74, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09,
|
||||||
0x61, 0x70, 0x68, 0x69, 0x63, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e,
|
0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x3e, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x05,
|
||||||
0x49, 0x6e, 0x66, 0x6f, 0x52, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04,
|
0x20, 0x01, 0x28, 0x0e, 0x32, 0x2a, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x44, 0x61,
|
||||||
0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65,
|
0x74, 0x61, 0x2e, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e,
|
||||||
0x12, 0x2a, 0x0a, 0x06, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b,
|
0x54, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65,
|
||||||
0x32, 0x12, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x50,
|
0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e,
|
||||||
0x6f, 0x69, 0x6e, 0x74, 0x52, 0x06, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x12, 0x24, 0x0a, 0x0d,
|
0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x64, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52,
|
||||||
0x61, 0x78, 0x6c, 0x65, 0x53, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x07, 0x20,
|
0x0f, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x64, 0x65,
|
||||||
0x01, 0x28, 0x0d, 0x52, 0x0d, 0x61, 0x78, 0x6c, 0x65, 0x53, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e,
|
0x12, 0x18, 0x0a, 0x07, 0x69, 0x73, 0x43, 0x75, 0x72, 0x76, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28,
|
||||||
0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x75, 0x72, 0x6e, 0x6f, 0x75, 0x74, 0x49, 0x64, 0x18,
|
0x08, 0x52, 0x07, 0x69, 0x73, 0x43, 0x75, 0x72, 0x76, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x73, 0x65,
|
||||||
0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x74, 0x75, 0x72, 0x6e, 0x6f, 0x75, 0x74, 0x49, 0x64,
|
0x67, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28,
|
||||||
0x22, 0x81, 0x03, 0x0a, 0x0c, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x65, 0x63, 0x74, 0x69, 0x6f,
|
0x05, 0x52, 0x0d, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74,
|
||||||
0x6e, 0x12, 0x2f, 0x0a, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28,
|
0x12, 0x2c, 0x0a, 0x11, 0x74, 0x72, 0x61, 0x63, 0x6b, 0x4c, 0x6f, 0x67, 0x69, 0x63, 0x53, 0x65,
|
||||||
0x0b, 0x32, 0x17, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x44, 0x61, 0x74, 0x61, 0x2e,
|
0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x11, 0x74, 0x72, 0x61,
|
||||||
0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x06, 0x63, 0x6f, 0x6d, 0x6d,
|
0x63, 0x6b, 0x4c, 0x6f, 0x67, 0x69, 0x63, 0x53, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x28,
|
||||||
0x6f, 0x6e, 0x12, 0x2a, 0x0a, 0x06, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03,
|
0x0a, 0x10, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79,
|
||||||
0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x44, 0x61, 0x74, 0x61,
|
0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x4e, 0x4f, 0x52, 0x4d, 0x41, 0x4c, 0x10, 0x00, 0x12, 0x08,
|
||||||
0x2e, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x06, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x12, 0x12,
|
0x0a, 0x04, 0x46, 0x4f, 0x52, 0x4b, 0x10, 0x01, 0x22, 0x9c, 0x01, 0x0a, 0x11, 0x54, 0x72, 0x61,
|
||||||
0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f,
|
0x63, 0x6b, 0x4c, 0x6f, 0x67, 0x69, 0x63, 0x53, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2f,
|
||||||
0x64, 0x65, 0x12, 0x3e, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e,
|
|
||||||
0x32, 0x2a, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x54,
|
|
||||||
0x72, 0x61, 0x63, 0x6b, 0x53, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x54, 0x72, 0x61, 0x63,
|
|
||||||
0x6b, 0x53, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79,
|
|
||||||
0x70, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f,
|
|
||||||
0x6e, 0x43, 0x6f, 0x64, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x73,
|
|
||||||
0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x18, 0x0a, 0x07,
|
|
||||||
0x69, 0x73, 0x43, 0x75, 0x72, 0x76, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x69,
|
|
||||||
0x73, 0x43, 0x75, 0x72, 0x76, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e,
|
|
||||||
0x74, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x73,
|
|
||||||
0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2c, 0x0a, 0x11,
|
|
||||||
0x74, 0x72, 0x61, 0x63, 0x6b, 0x4c, 0x6f, 0x67, 0x69, 0x63, 0x53, 0x65, 0x63, 0x74, 0x69, 0x6f,
|
|
||||||
0x6e, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x11, 0x74, 0x72, 0x61, 0x63, 0x6b, 0x4c, 0x6f,
|
|
||||||
0x67, 0x69, 0x63, 0x53, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x28, 0x0a, 0x10, 0x54, 0x72,
|
|
||||||
0x61, 0x63, 0x6b, 0x53, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a,
|
|
||||||
0x0a, 0x06, 0x4e, 0x4f, 0x52, 0x4d, 0x41, 0x4c, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x46, 0x4f,
|
|
||||||
0x52, 0x4b, 0x10, 0x01, 0x22, 0x9c, 0x01, 0x0a, 0x11, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x4c, 0x6f,
|
|
||||||
0x67, 0x69, 0x63, 0x53, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2f, 0x0a, 0x06, 0x63, 0x6f,
|
|
||||||
0x6d, 0x6d, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x72, 0x61,
|
|
||||||
0x70, 0x68, 0x69, 0x63, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x49,
|
|
||||||
0x6e, 0x66, 0x6f, 0x52, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x12, 0x2a, 0x0a, 0x06, 0x70,
|
|
||||||
0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x72,
|
|
||||||
0x61, 0x70, 0x68, 0x69, 0x63, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x52,
|
|
||||||
0x06, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18,
|
|
||||||
0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6c,
|
|
||||||
0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x6c, 0x65, 0x6e,
|
|
||||||
0x67, 0x74, 0x68, 0x22, 0xca, 0x02, 0x0a, 0x0c, 0x53, 0x74, 0x6f, 0x70, 0x50, 0x6f, 0x73, 0x69,
|
|
||||||
0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2f, 0x0a, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x18, 0x01,
|
|
||||||
0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x44, 0x61,
|
|
||||||
0x74, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x06, 0x63,
|
|
||||||
0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20,
|
|
||||||
0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x66, 0x6c, 0x69,
|
|
||||||
0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x66, 0x6c, 0x69, 0x70, 0x12, 0x3e, 0x0a,
|
|
||||||
0x08, 0x63, 0x6f, 0x61, 0x63, 0x68, 0x4e, 0x75, 0x6d, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32,
|
|
||||||
0x22, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x53, 0x74,
|
|
||||||
0x6f, 0x70, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x6f, 0x61, 0x63, 0x68,
|
|
||||||
0x4e, 0x75, 0x6d, 0x52, 0x08, 0x63, 0x6f, 0x61, 0x63, 0x68, 0x4e, 0x75, 0x6d, 0x12, 0x46, 0x0a,
|
|
||||||
0x0f, 0x6b, 0x69, 0x6c, 0x6f, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d,
|
|
||||||
0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63,
|
|
||||||
0x44, 0x61, 0x74, 0x61, 0x2e, 0x4b, 0x69, 0x6c, 0x6f, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x53, 0x79,
|
|
||||||
0x73, 0x74, 0x65, 0x6d, 0x52, 0x0f, 0x6b, 0x69, 0x6c, 0x6f, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x53,
|
|
||||||
0x79, 0x73, 0x74, 0x65, 0x6d, 0x12, 0x2f, 0x0a, 0x06, 0x72, 0x65, 0x66, 0x44, 0x65, 0x76, 0x18,
|
|
||||||
0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x44,
|
|
||||||
0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x52, 0x65, 0x66, 0x52, 0x06,
|
|
||||||
0x72, 0x65, 0x66, 0x44, 0x65, 0x76, 0x22, 0x28, 0x0a, 0x08, 0x43, 0x6f, 0x61, 0x63, 0x68, 0x4e,
|
|
||||||
0x75, 0x6d, 0x12, 0x08, 0x0a, 0x04, 0x46, 0x6f, 0x75, 0x72, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03,
|
|
||||||
0x53, 0x69, 0x78, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x45, 0x69, 0x67, 0x68, 0x74, 0x10, 0x02,
|
|
||||||
0x22, 0x81, 0x01, 0x0a, 0x0a, 0x53, 0x70, 0x6b, 0x73, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x12,
|
|
||||||
0x2f, 0x0a, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32,
|
|
||||||
0x17, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x6f,
|
|
||||||
0x6d, 0x6d, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e,
|
|
||||||
0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04,
|
|
||||||
0x63, 0x6f, 0x64, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x66, 0x6c, 0x69, 0x70, 0x18, 0x03, 0x20, 0x01,
|
|
||||||
0x28, 0x08, 0x52, 0x04, 0x66, 0x6c, 0x69, 0x70, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x66, 0x53,
|
|
||||||
0x74, 0x61, 0x6e, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x72, 0x65, 0x66, 0x53,
|
|
||||||
0x74, 0x61, 0x6e, 0x64, 0x22, 0x80, 0x01, 0x0a, 0x09, 0x45, 0x73, 0x62, 0x42, 0x75, 0x74, 0x74,
|
|
||||||
0x6f, 0x6e, 0x12, 0x2f, 0x0a, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01,
|
|
||||||
0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x44, 0x61, 0x74, 0x61,
|
|
||||||
0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x06, 0x63, 0x6f, 0x6d,
|
|
||||||
0x6d, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28,
|
|
||||||
0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x66, 0x6c, 0x69, 0x70, 0x18,
|
|
||||||
0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x66, 0x6c, 0x69, 0x70, 0x12, 0x1a, 0x0a, 0x08, 0x72,
|
|
||||||
0x65, 0x66, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x72,
|
|
||||||
0x65, 0x66, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x22, 0xb9, 0x01, 0x0a, 0x08, 0x47, 0x61, 0x74, 0x65,
|
|
||||||
0x64, 0x42, 0x6f, 0x78, 0x12, 0x2f, 0x0a, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x18, 0x01,
|
|
||||||
0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x44, 0x61,
|
|
||||||
0x74, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x06, 0x63,
|
|
||||||
0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20,
|
|
||||||
0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x66, 0x6c, 0x69,
|
|
||||||
0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x66, 0x6c, 0x69, 0x70, 0x12, 0x2e, 0x0a,
|
|
||||||
0x12, 0x72, 0x65, 0x66, 0x47, 0x61, 0x74, 0x65, 0x64, 0x42, 0x6f, 0x78, 0x4d, 0x61, 0x70, 0x43,
|
|
||||||
0x6f, 0x64, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x72, 0x65, 0x66, 0x47, 0x61,
|
|
||||||
0x74, 0x65, 0x64, 0x42, 0x6f, 0x78, 0x4d, 0x61, 0x70, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x24, 0x0a,
|
|
||||||
0x0d, 0x72, 0x65, 0x66, 0x53, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x44, 0x6f, 0x6f, 0x72, 0x18, 0x07,
|
|
||||||
0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x72, 0x65, 0x66, 0x53, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x44,
|
|
||||||
0x6f, 0x6f, 0x72, 0x22, 0x97, 0x01, 0x0a, 0x06, 0x49, 0x62, 0x70, 0x42, 0x6f, 0x78, 0x12, 0x2f,
|
|
||||||
0x0a, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17,
|
|
||||||
0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x6f, 0x6d,
|
|
||||||
0x6d, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x12,
|
|
||||||
0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63,
|
|
||||||
0x6f, 0x64, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x72, 0x65, 0x66, 0x49, 0x62, 0x70, 0x4d, 0x61, 0x70,
|
|
||||||
0x43, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x72, 0x65, 0x66, 0x49,
|
|
||||||
0x62, 0x70, 0x4d, 0x61, 0x70, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x72, 0x65, 0x66,
|
|
||||||
0x53, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52,
|
|
||||||
0x0c, 0x72, 0x65, 0x66, 0x53, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0x99, 0x01,
|
|
||||||
0x0a, 0x06, 0x50, 0x73, 0x6c, 0x42, 0x6f, 0x78, 0x12, 0x2f, 0x0a, 0x06, 0x63, 0x6f, 0x6d, 0x6d,
|
|
||||||
0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68,
|
|
||||||
0x69, 0x63, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x49, 0x6e, 0x66,
|
|
||||||
0x6f, 0x52, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64,
|
|
||||||
0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x24, 0x0a,
|
|
||||||
0x0d, 0x72, 0x65, 0x66, 0x50, 0x73, 0x6c, 0x4d, 0x61, 0x70, 0x43, 0x6f, 0x64, 0x65, 0x18, 0x03,
|
|
||||||
0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x72, 0x65, 0x66, 0x50, 0x73, 0x6c, 0x4d, 0x61, 0x70, 0x43,
|
|
||||||
0x6f, 0x64, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x72, 0x65, 0x66, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f,
|
|
||||||
0x72, 0x6d, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x72, 0x65, 0x66, 0x50,
|
|
||||||
0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x49, 0x64, 0x22, 0x9e, 0x01, 0x0a, 0x0f, 0x53, 0x6c,
|
|
||||||
0x6f, 0x70, 0x65, 0x4b, 0x69, 0x6c, 0x6f, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x12, 0x2f, 0x0a,
|
|
||||||
0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e,
|
|
||||||
0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d,
|
|
||||||
0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x12, 0x12,
|
|
||||||
0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f,
|
|
||||||
0x64, 0x65, 0x12, 0x46, 0x0a, 0x0f, 0x6b, 0x69, 0x6c, 0x6f, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x53,
|
|
||||||
0x79, 0x73, 0x74, 0x65, 0x6d, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x72,
|
|
||||||
0x61, 0x70, 0x68, 0x69, 0x63, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x4b, 0x69, 0x6c, 0x6f, 0x6d, 0x65,
|
|
||||||
0x74, 0x65, 0x72, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x52, 0x0f, 0x6b, 0x69, 0x6c, 0x6f, 0x6d,
|
|
||||||
0x65, 0x74, 0x65, 0x72, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x22, 0xa2, 0x01, 0x0a, 0x13, 0x43,
|
|
||||||
0x75, 0x72, 0x76, 0x61, 0x74, 0x75, 0x72, 0x65, 0x4b, 0x69, 0x6c, 0x6f, 0x4d, 0x61, 0x72, 0x6b,
|
|
||||||
0x65, 0x72, 0x12, 0x2f, 0x0a, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01,
|
|
||||||
0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x44, 0x61, 0x74, 0x61,
|
|
||||||
0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x06, 0x63, 0x6f, 0x6d,
|
|
||||||
0x6d, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28,
|
|
||||||
0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x46, 0x0a, 0x0f, 0x6b, 0x69, 0x6c, 0x6f, 0x6d,
|
|
||||||
0x65, 0x74, 0x65, 0x72, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b,
|
|
||||||
0x32, 0x1c, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x4b,
|
|
||||||
0x69, 0x6c, 0x6f, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x52, 0x0f,
|
|
||||||
0x6b, 0x69, 0x6c, 0x6f, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x22,
|
|
||||||
0xcb, 0x01, 0x0a, 0x0a, 0x47, 0x61, 0x72, 0x61, 0x67, 0x65, 0x44, 0x6f, 0x6f, 0x72, 0x12, 0x2f,
|
|
||||||
0x0a, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17,
|
|
||||||
0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x6f, 0x6d,
|
|
||||||
0x6d, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x12,
|
|
||||||
0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63,
|
|
||||||
0x6f, 0x64, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x6c, 0x69, 0x6e, 0x6b, 0x53, 0x65, 0x63, 0x74, 0x69,
|
|
||||||
0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x6c, 0x69, 0x6e, 0x6b, 0x53, 0x65,
|
|
||||||
0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x30, 0x0a, 0x13, 0x63, 0x65, 0x6e, 0x74, 0x72, 0x61, 0x6c,
|
|
||||||
0x69, 0x7a, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x03,
|
|
||||||
0x28, 0x0d, 0x52, 0x13, 0x63, 0x65, 0x6e, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x53,
|
|
||||||
0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x72, 0x65, 0x66, 0x50, 0x73,
|
|
||||||
0x6c, 0x4d, 0x61, 0x70, 0x43, 0x6f, 0x64, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d,
|
|
||||||
0x72, 0x65, 0x66, 0x50, 0x73, 0x6c, 0x4d, 0x61, 0x70, 0x43, 0x6f, 0x64, 0x65, 0x22, 0xd5, 0x01,
|
|
||||||
0x0a, 0x0a, 0x43, 0x61, 0x72, 0x57, 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x12, 0x2f, 0x0a, 0x06,
|
|
||||||
0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67,
|
|
||||||
0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f,
|
|
||||||
0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x12, 0x12, 0x0a,
|
|
||||||
0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64,
|
|
||||||
0x65, 0x12, 0x20, 0x0a, 0x0b, 0x6c, 0x69, 0x6e, 0x6b, 0x53, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e,
|
|
||||||
0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x6c, 0x69, 0x6e, 0x6b, 0x53, 0x65, 0x63, 0x74,
|
|
||||||
0x69, 0x6f, 0x6e, 0x12, 0x30, 0x0a, 0x13, 0x63, 0x65, 0x6e, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x7a,
|
|
||||||
0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0d,
|
|
||||||
0x52, 0x13, 0x63, 0x65, 0x6e, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x53, 0x74, 0x61,
|
|
||||||
0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x75, 0x61, 0x6e, 0x4e, 0x75, 0x6d,
|
|
||||||
0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x64, 0x75, 0x61, 0x6e, 0x4e, 0x75, 0x6d, 0x12,
|
|
||||||
0x14, 0x0a, 0x05, 0x77, 0x69, 0x64, 0x74, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05,
|
|
||||||
0x77, 0x69, 0x64, 0x74, 0x68, 0x22, 0xbc, 0x01, 0x0a, 0x06, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e,
|
|
||||||
0x12, 0x2f, 0x0a, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b,
|
|
||||||
0x32, 0x17, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x43,
|
|
||||||
0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f,
|
|
||||||
0x6e, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52,
|
|
||||||
0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x32, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20,
|
|
||||||
0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x44, 0x61, 0x74,
|
|
||||||
0x61, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x54,
|
|
||||||
0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x66, 0x6c, 0x69,
|
|
||||||
0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x66, 0x6c, 0x69, 0x70, 0x22, 0x25, 0x0a,
|
|
||||||
0x0a, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x53,
|
|
||||||
0x74, 0x61, 0x74, 0x69, 0x63, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x44, 0x79, 0x6e, 0x61, 0x6d,
|
|
||||||
0x69, 0x63, 0x10, 0x01, 0x22, 0xa8, 0x01, 0x0a, 0x05, 0x53, 0x6c, 0x6f, 0x70, 0x65, 0x12, 0x2f,
|
|
||||||
0x0a, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17,
|
0x0a, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17,
|
||||||
0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x6f, 0x6d,
|
0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x6f, 0x6d,
|
||||||
0x6d, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x12,
|
0x6d, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x12,
|
||||||
0x2a, 0x0a, 0x06, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32,
|
0x2a, 0x0a, 0x06, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32,
|
||||||
0x12, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x50, 0x6f,
|
0x12, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x50, 0x6f,
|
||||||
0x69, 0x6e, 0x74, 0x52, 0x06, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x73,
|
0x69, 0x6e, 0x74, 0x52, 0x06, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x63,
|
||||||
0x6c, 0x6f, 0x70, 0x65, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x11,
|
0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12,
|
||||||
0x52, 0x0b, 0x73, 0x6c, 0x6f, 0x70, 0x65, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x20, 0x0a,
|
0x16, 0x0a, 0x06, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52,
|
||||||
0x0b, 0x72, 0x65, 0x66, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x18, 0x05, 0x20, 0x03,
|
0x06, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x22, 0xca, 0x02, 0x0a, 0x0c, 0x53, 0x74, 0x6f, 0x70,
|
||||||
0x28, 0x0d, 0x52, 0x0b, 0x72, 0x65, 0x66, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x22,
|
0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2f, 0x0a, 0x06, 0x63, 0x6f, 0x6d, 0x6d,
|
||||||
0xb4, 0x01, 0x0a, 0x09, 0x43, 0x75, 0x72, 0x76, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x2f, 0x0a,
|
0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68,
|
||||||
0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e,
|
0x69, 0x63, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x49, 0x6e, 0x66,
|
||||||
0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d,
|
0x6f, 0x52, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64,
|
||||||
0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x12, 0x2a,
|
0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x12, 0x0a,
|
||||||
0x0a, 0x06, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12,
|
0x04, 0x66, 0x6c, 0x69, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x66, 0x6c, 0x69,
|
||||||
0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x50, 0x6f, 0x69,
|
0x70, 0x12, 0x3e, 0x0a, 0x08, 0x63, 0x6f, 0x61, 0x63, 0x68, 0x4e, 0x75, 0x6d, 0x18, 0x04, 0x20,
|
||||||
0x6e, 0x74, 0x52, 0x06, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x12, 0x28, 0x0a, 0x0f, 0x63, 0x75,
|
0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x44, 0x61, 0x74,
|
||||||
0x72, 0x76, 0x61, 0x74, 0x75, 0x72, 0x65, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20,
|
0x61, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43,
|
||||||
0x01, 0x28, 0x11, 0x52, 0x0f, 0x63, 0x75, 0x72, 0x76, 0x61, 0x74, 0x75, 0x72, 0x65, 0x4e, 0x75,
|
0x6f, 0x61, 0x63, 0x68, 0x4e, 0x75, 0x6d, 0x52, 0x08, 0x63, 0x6f, 0x61, 0x63, 0x68, 0x4e, 0x75,
|
||||||
0x6d, 0x62, 0x65, 0x72, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x66, 0x44, 0x65, 0x76, 0x69, 0x63,
|
0x6d, 0x12, 0x46, 0x0a, 0x0f, 0x6b, 0x69, 0x6c, 0x6f, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x53, 0x79,
|
||||||
0x65, 0x49, 0x64, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x0b, 0x72, 0x65, 0x66, 0x44, 0x65,
|
0x73, 0x74, 0x65, 0x6d, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x72, 0x61,
|
||||||
0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x22, 0x95, 0x01, 0x0a, 0x0e, 0x44, 0x65, 0x70, 0x61, 0x72,
|
0x70, 0x68, 0x69, 0x63, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x4b, 0x69, 0x6c, 0x6f, 0x6d, 0x65, 0x74,
|
||||||
0x74, 0x75, 0x72, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x12, 0x2f, 0x0a, 0x06, 0x63, 0x6f, 0x6d,
|
0x65, 0x72, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x52, 0x0f, 0x6b, 0x69, 0x6c, 0x6f, 0x6d, 0x65,
|
||||||
0x6d, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x72, 0x61, 0x70,
|
0x74, 0x65, 0x72, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x12, 0x2f, 0x0a, 0x06, 0x72, 0x65, 0x66,
|
||||||
0x68, 0x69, 0x63, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x49, 0x6e,
|
0x44, 0x65, 0x76, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x72, 0x61, 0x70,
|
||||||
0x66, 0x6f, 0x52, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f,
|
0x68, 0x69, 0x63, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x52,
|
||||||
0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x22,
|
0x65, 0x66, 0x52, 0x06, 0x72, 0x65, 0x66, 0x44, 0x65, 0x76, 0x22, 0x28, 0x0a, 0x08, 0x43, 0x6f,
|
||||||
0x0a, 0x0c, 0x72, 0x75, 0x6e, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04,
|
0x61, 0x63, 0x68, 0x4e, 0x75, 0x6d, 0x12, 0x08, 0x0a, 0x04, 0x46, 0x6f, 0x75, 0x72, 0x10, 0x00,
|
||||||
0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x75, 0x6e, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69,
|
0x12, 0x07, 0x0a, 0x03, 0x53, 0x69, 0x78, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x45, 0x69, 0x67,
|
||||||
0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x66, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x18, 0x05,
|
0x68, 0x74, 0x10, 0x02, 0x22, 0x81, 0x01, 0x0a, 0x0a, 0x53, 0x70, 0x6b, 0x73, 0x53, 0x77, 0x69,
|
||||||
0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x72, 0x65, 0x66, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x22, 0x9a,
|
0x74, 0x63, 0x68, 0x12, 0x2f, 0x0a, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x18, 0x01, 0x20,
|
||||||
0x01, 0x0a, 0x0d, 0x41, 0x75, 0x74, 0x6f, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x42, 0x6f, 0x78,
|
0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x44, 0x61, 0x74,
|
||||||
|
0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x06, 0x63, 0x6f,
|
||||||
|
0x6d, 0x6d, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01,
|
||||||
|
0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x66, 0x6c, 0x69, 0x70,
|
||||||
|
0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x66, 0x6c, 0x69, 0x70, 0x12, 0x1a, 0x0a, 0x08,
|
||||||
|
0x72, 0x65, 0x66, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08,
|
||||||
|
0x72, 0x65, 0x66, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x22, 0x80, 0x01, 0x0a, 0x09, 0x45, 0x73, 0x62,
|
||||||
|
0x42, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x12, 0x2f, 0x0a, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e,
|
||||||
|
0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63,
|
||||||
|
0x44, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52,
|
||||||
|
0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18,
|
||||||
|
0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x66,
|
||||||
|
0x6c, 0x69, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x66, 0x6c, 0x69, 0x70, 0x12,
|
||||||
|
0x1a, 0x0a, 0x08, 0x72, 0x65, 0x66, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28,
|
||||||
|
0x0d, 0x52, 0x08, 0x72, 0x65, 0x66, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x22, 0xb9, 0x01, 0x0a, 0x08,
|
||||||
|
0x47, 0x61, 0x74, 0x65, 0x64, 0x42, 0x6f, 0x78, 0x12, 0x2f, 0x0a, 0x06, 0x63, 0x6f, 0x6d, 0x6d,
|
||||||
|
0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68,
|
||||||
|
0x69, 0x63, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x49, 0x6e, 0x66,
|
||||||
|
0x6f, 0x52, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64,
|
||||||
|
0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x12, 0x0a,
|
||||||
|
0x04, 0x66, 0x6c, 0x69, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x66, 0x6c, 0x69,
|
||||||
|
0x70, 0x12, 0x2e, 0x0a, 0x12, 0x72, 0x65, 0x66, 0x47, 0x61, 0x74, 0x65, 0x64, 0x42, 0x6f, 0x78,
|
||||||
|
0x4d, 0x61, 0x70, 0x43, 0x6f, 0x64, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x72,
|
||||||
|
0x65, 0x66, 0x47, 0x61, 0x74, 0x65, 0x64, 0x42, 0x6f, 0x78, 0x4d, 0x61, 0x70, 0x43, 0x6f, 0x64,
|
||||||
|
0x65, 0x12, 0x24, 0x0a, 0x0d, 0x72, 0x65, 0x66, 0x53, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x44, 0x6f,
|
||||||
|
0x6f, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x72, 0x65, 0x66, 0x53, 0x63, 0x72,
|
||||||
|
0x65, 0x65, 0x6e, 0x44, 0x6f, 0x6f, 0x72, 0x22, 0x97, 0x01, 0x0a, 0x06, 0x49, 0x62, 0x70, 0x42,
|
||||||
|
0x6f, 0x78, 0x12, 0x2f, 0x0a, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01,
|
||||||
|
0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x44, 0x61, 0x74, 0x61,
|
||||||
|
0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x06, 0x63, 0x6f, 0x6d,
|
||||||
|
0x6d, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28,
|
||||||
|
0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x72, 0x65, 0x66, 0x49, 0x62,
|
||||||
|
0x70, 0x4d, 0x61, 0x70, 0x43, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d,
|
||||||
|
0x72, 0x65, 0x66, 0x49, 0x62, 0x70, 0x4d, 0x61, 0x70, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x22, 0x0a,
|
||||||
|
0x0c, 0x72, 0x65, 0x66, 0x53, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x04, 0x20,
|
||||||
|
0x01, 0x28, 0x0d, 0x52, 0x0c, 0x72, 0x65, 0x66, 0x53, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49,
|
||||||
|
0x64, 0x22, 0x99, 0x01, 0x0a, 0x06, 0x50, 0x73, 0x6c, 0x42, 0x6f, 0x78, 0x12, 0x2f, 0x0a, 0x06,
|
||||||
|
0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67,
|
||||||
|
0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f,
|
||||||
|
0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x12, 0x12, 0x0a,
|
||||||
|
0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64,
|
||||||
|
0x65, 0x12, 0x24, 0x0a, 0x0d, 0x72, 0x65, 0x66, 0x50, 0x73, 0x6c, 0x4d, 0x61, 0x70, 0x43, 0x6f,
|
||||||
|
0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x72, 0x65, 0x66, 0x50, 0x73, 0x6c,
|
||||||
|
0x4d, 0x61, 0x70, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x72, 0x65, 0x66, 0x50, 0x6c,
|
||||||
|
0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d,
|
||||||
|
0x72, 0x65, 0x66, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x49, 0x64, 0x22, 0x9e, 0x01,
|
||||||
|
0x0a, 0x0f, 0x53, 0x6c, 0x6f, 0x70, 0x65, 0x4b, 0x69, 0x6c, 0x6f, 0x4d, 0x61, 0x72, 0x6b, 0x65,
|
||||||
|
0x72, 0x12, 0x2f, 0x0a, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28,
|
||||||
|
0x0b, 0x32, 0x17, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x44, 0x61, 0x74, 0x61, 0x2e,
|
||||||
|
0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x06, 0x63, 0x6f, 0x6d, 0x6d,
|
||||||
|
0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,
|
||||||
|
0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x46, 0x0a, 0x0f, 0x6b, 0x69, 0x6c, 0x6f, 0x6d, 0x65,
|
||||||
|
0x74, 0x65, 0x72, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32,
|
||||||
|
0x1c, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x4b, 0x69,
|
||||||
|
0x6c, 0x6f, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x52, 0x0f, 0x6b,
|
||||||
|
0x69, 0x6c, 0x6f, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x22, 0xa2,
|
||||||
|
0x01, 0x0a, 0x13, 0x43, 0x75, 0x72, 0x76, 0x61, 0x74, 0x75, 0x72, 0x65, 0x4b, 0x69, 0x6c, 0x6f,
|
||||||
|
0x4d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x12, 0x2f, 0x0a, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e,
|
||||||
|
0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63,
|
||||||
|
0x44, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52,
|
||||||
|
0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18,
|
||||||
|
0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x46, 0x0a, 0x0f, 0x6b,
|
||||||
|
0x69, 0x6c, 0x6f, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x18, 0x04,
|
||||||
|
0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x44, 0x61,
|
||||||
|
0x74, 0x61, 0x2e, 0x4b, 0x69, 0x6c, 0x6f, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x53, 0x79, 0x73, 0x74,
|
||||||
|
0x65, 0x6d, 0x52, 0x0f, 0x6b, 0x69, 0x6c, 0x6f, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x53, 0x79, 0x73,
|
||||||
|
0x74, 0x65, 0x6d, 0x22, 0xcb, 0x01, 0x0a, 0x0a, 0x47, 0x61, 0x72, 0x61, 0x67, 0x65, 0x44, 0x6f,
|
||||||
|
0x6f, 0x72, 0x12, 0x2f, 0x0a, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01,
|
||||||
|
0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x44, 0x61, 0x74, 0x61,
|
||||||
|
0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x06, 0x63, 0x6f, 0x6d,
|
||||||
|
0x6d, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28,
|
||||||
|
0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x6c, 0x69, 0x6e, 0x6b, 0x53,
|
||||||
|
0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x6c, 0x69,
|
||||||
|
0x6e, 0x6b, 0x53, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x30, 0x0a, 0x13, 0x63, 0x65, 0x6e,
|
||||||
|
0x74, 0x72, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73,
|
||||||
|
0x18, 0x04, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x13, 0x63, 0x65, 0x6e, 0x74, 0x72, 0x61, 0x6c, 0x69,
|
||||||
|
0x7a, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x72,
|
||||||
|
0x65, 0x66, 0x50, 0x73, 0x6c, 0x4d, 0x61, 0x70, 0x43, 0x6f, 0x64, 0x65, 0x18, 0x05, 0x20, 0x01,
|
||||||
|
0x28, 0x09, 0x52, 0x0d, 0x72, 0x65, 0x66, 0x50, 0x73, 0x6c, 0x4d, 0x61, 0x70, 0x43, 0x6f, 0x64,
|
||||||
|
0x65, 0x22, 0xd5, 0x01, 0x0a, 0x0a, 0x43, 0x61, 0x72, 0x57, 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67,
|
||||||
0x12, 0x2f, 0x0a, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b,
|
0x12, 0x2f, 0x0a, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b,
|
||||||
0x32, 0x17, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x43,
|
0x32, 0x17, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x43,
|
||||||
0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f,
|
0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f,
|
||||||
0x6e, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52,
|
0x6e, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52,
|
||||||
0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x66, 0x6c, 0x69, 0x70, 0x18, 0x03, 0x20,
|
0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x6c, 0x69, 0x6e, 0x6b, 0x53, 0x65, 0x63,
|
||||||
0x01, 0x28, 0x08, 0x52, 0x04, 0x66, 0x6c, 0x69, 0x70, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64,
|
0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x6c, 0x69, 0x6e, 0x6b,
|
||||||
0x65, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12,
|
0x53, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x30, 0x0a, 0x13, 0x63, 0x65, 0x6e, 0x74, 0x72,
|
||||||
0x1a, 0x0a, 0x08, 0x72, 0x65, 0x66, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28,
|
0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04,
|
||||||
0x0d, 0x52, 0x08, 0x72, 0x65, 0x66, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x22, 0x79, 0x0a, 0x17, 0x55,
|
0x20, 0x03, 0x28, 0x0d, 0x52, 0x13, 0x63, 0x65, 0x6e, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x7a, 0x65,
|
||||||
0x6e, 0x69, 0x71, 0x75, 0x65, 0x49, 0x64, 0x4f, 0x66, 0x53, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e,
|
0x64, 0x53, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x75, 0x61,
|
||||||
0x4c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x69, 0x74, 0x79, 0x18, 0x01,
|
0x6e, 0x4e, 0x75, 0x6d, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x64, 0x75, 0x61, 0x6e,
|
||||||
0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x69, 0x74, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x69,
|
0x4e, 0x75, 0x6d, 0x12, 0x14, 0x0a, 0x05, 0x77, 0x69, 0x64, 0x74, 0x68, 0x18, 0x06, 0x20, 0x01,
|
||||||
0x6e, 0x65, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6c, 0x69, 0x6e, 0x65,
|
0x28, 0x0d, 0x52, 0x05, 0x77, 0x69, 0x64, 0x74, 0x68, 0x22, 0xbc, 0x01, 0x0a, 0x06, 0x42, 0x65,
|
||||||
0x49, 0x64, 0x12, 0x32, 0x0a, 0x14, 0x6d, 0x61, 0x69, 0x6e, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x69,
|
0x61, 0x63, 0x6f, 0x6e, 0x12, 0x2f, 0x0a, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x18, 0x01,
|
||||||
0x6e, 0x61, 0x74, 0x65, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09,
|
0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x44, 0x61,
|
||||||
0x52, 0x14, 0x6d, 0x61, 0x69, 0x6e, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x74, 0x65,
|
0x74, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x06, 0x63,
|
||||||
0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x22, 0x90, 0x01, 0x0a, 0x10, 0x4b, 0x69, 0x6c, 0x6f, 0x6d,
|
0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20,
|
||||||
0x65, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x12, 0x2e, 0x0a, 0x03, 0x6b,
|
0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x32, 0x0a, 0x04, 0x74, 0x79, 0x70,
|
||||||
0x6d, 0x41, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68,
|
0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69,
|
||||||
0x69, 0x63, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x4b, 0x69, 0x6c, 0x6f, 0x6d, 0x65, 0x74, 0x65, 0x72,
|
0x63, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x2e, 0x42, 0x65, 0x61,
|
||||||
0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x52, 0x03, 0x6b, 0x6d, 0x41, 0x12, 0x2e, 0x0a, 0x03, 0x6b,
|
0x63, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x12, 0x0a,
|
||||||
0x6d, 0x42, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68,
|
0x04, 0x66, 0x6c, 0x69, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x66, 0x6c, 0x69,
|
||||||
0x69, 0x63, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x4b, 0x69, 0x6c, 0x6f, 0x6d, 0x65, 0x74, 0x65, 0x72,
|
0x70, 0x22, 0x25, 0x0a, 0x0a, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12,
|
||||||
0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x52, 0x03, 0x6b, 0x6d, 0x42, 0x12, 0x1c, 0x0a, 0x09, 0x73,
|
0x0a, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x69, 0x63, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x44,
|
||||||
0x61, 0x6d, 0x65, 0x54, 0x72, 0x65, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09,
|
0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x10, 0x01, 0x22, 0xa8, 0x01, 0x0a, 0x05, 0x53, 0x6c, 0x6f,
|
||||||
0x73, 0x61, 0x6d, 0x65, 0x54, 0x72, 0x65, 0x6e, 0x64, 0x22, 0xbd, 0x01, 0x0a, 0x13, 0x53, 0x74,
|
0x70, 0x65, 0x12, 0x2f, 0x0a, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01,
|
||||||
0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x65, 0x44, 0x65, 0x76, 0x69, 0x63,
|
0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x44, 0x61, 0x74, 0x61,
|
||||||
0x65, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
|
0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x06, 0x63, 0x6f, 0x6d,
|
||||||
0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x4e, 0x0a, 0x10, 0x63, 0x6f, 0x6d, 0x62, 0x69, 0x6e, 0x61,
|
0x6d, 0x6f, 0x6e, 0x12, 0x2a, 0x0a, 0x06, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20,
|
||||||
0x74, 0x69, 0x6f, 0x6e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32,
|
0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x44, 0x61, 0x74,
|
||||||
0x22, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x44, 0x65,
|
0x61, 0x2e, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x06, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x12,
|
||||||
0x76, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x6d, 0x62, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x74,
|
0x20, 0x0a, 0x0b, 0x73, 0x6c, 0x6f, 0x70, 0x65, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03,
|
||||||
0x79, 0x70, 0x65, 0x52, 0x10, 0x63, 0x6f, 0x6d, 0x62, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e,
|
0x20, 0x01, 0x28, 0x11, 0x52, 0x0b, 0x73, 0x6c, 0x6f, 0x70, 0x65, 0x4e, 0x75, 0x6d, 0x62, 0x65,
|
||||||
0x74, 0x79, 0x70, 0x65, 0x73, 0x12, 0x42, 0x0a, 0x0a, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54,
|
0x72, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x66, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64,
|
||||||
0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x67, 0x72, 0x61, 0x70,
|
0x18, 0x05, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x0b, 0x72, 0x65, 0x66, 0x44, 0x65, 0x76, 0x69, 0x63,
|
||||||
0x68, 0x69, 0x63, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x52,
|
0x65, 0x49, 0x64, 0x22, 0xb4, 0x01, 0x0a, 0x09, 0x43, 0x75, 0x72, 0x76, 0x61, 0x74, 0x75, 0x72,
|
||||||
0x65, 0x66, 0x2e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0a, 0x64,
|
0x65, 0x12, 0x2f, 0x0a, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28,
|
||||||
0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x22, 0x4b, 0x0a, 0x15, 0x44, 0x65, 0x76,
|
0x0b, 0x32, 0x17, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x44, 0x61, 0x74, 0x61, 0x2e,
|
||||||
0x69, 0x63, 0x65, 0x43, 0x6f, 0x6d, 0x62, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x74, 0x79,
|
0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x06, 0x63, 0x6f, 0x6d, 0x6d,
|
||||||
0x70, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
|
0x6f, 0x6e, 0x12, 0x2a, 0x0a, 0x06, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03,
|
||||||
0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x72, 0x65, 0x66, 0x44, 0x65, 0x76,
|
0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x44, 0x61, 0x74, 0x61,
|
||||||
0x69, 0x63, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x0a, 0x72, 0x65, 0x66, 0x44,
|
0x2e, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x06, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x12, 0x28,
|
||||||
0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x22, 0x62, 0x0a, 0x10, 0x53, 0x65, 0x63, 0x74, 0x69, 0x6f,
|
0x0a, 0x0f, 0x63, 0x75, 0x72, 0x76, 0x61, 0x74, 0x75, 0x72, 0x65, 0x4e, 0x75, 0x6d, 0x62, 0x65,
|
||||||
0x6e, 0x43, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x65,
|
0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x11, 0x52, 0x0f, 0x63, 0x75, 0x72, 0x76, 0x61, 0x74, 0x75,
|
||||||
0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x0a,
|
0x72, 0x65, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x66, 0x44,
|
||||||
0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x73, 0x12, 0x2e, 0x0a, 0x12, 0x63, 0x65,
|
0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x0b, 0x72,
|
||||||
0x6e, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e,
|
0x65, 0x66, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x22, 0x95, 0x01, 0x0a, 0x0e, 0x44,
|
||||||
0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x12, 0x63, 0x65, 0x6e, 0x74, 0x72, 0x61, 0x6c, 0x69,
|
0x65, 0x70, 0x61, 0x72, 0x74, 0x75, 0x72, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x12, 0x2f, 0x0a,
|
||||||
0x7a, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xc8, 0x02, 0x0a, 0x05, 0x54,
|
|
||||||
0x72, 0x61, 0x69, 0x6e, 0x12, 0x3d, 0x0a, 0x0a, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x4d, 0x6f, 0x64,
|
|
||||||
0x65, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1d, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68,
|
|
||||||
0x69, 0x63, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x2e, 0x54, 0x72, 0x61,
|
|
||||||
0x69, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x0a, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x4d, 0x6f,
|
|
||||||
0x64, 0x65, 0x6c, 0x12, 0x26, 0x0a, 0x0e, 0x63, 0x61, 0x72, 0x72, 0x69, 0x61, 0x67, 0x65, 0x4c,
|
|
||||||
0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x63, 0x61, 0x72,
|
|
||||||
0x72, 0x69, 0x61, 0x67, 0x65, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, 0x20, 0x0a, 0x0b, 0x74,
|
|
||||||
0x6f, 0x74, 0x61, 0x6c, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05,
|
|
||||||
0x52, 0x0b, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, 0x1c, 0x0a,
|
|
||||||
0x09, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x74, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09,
|
|
||||||
0x52, 0x09, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x74, 0x73, 0x12, 0x40, 0x0a, 0x0d, 0x64,
|
|
||||||
0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x07, 0x20, 0x01,
|
|
||||||
0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x54, 0x72, 0x61, 0x69,
|
|
||||||
0x6e, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0d,
|
|
||||||
0x64, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x2c, 0x0a,
|
|
||||||
0x11, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x4d, 0x61, 0x70,
|
|
||||||
0x49, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x11, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x43,
|
|
||||||
0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x4d, 0x61, 0x70, 0x49, 0x64, 0x22, 0x28, 0x0a, 0x0a, 0x54,
|
|
||||||
0x72, 0x61, 0x69, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x12, 0x05, 0x0a, 0x01, 0x41, 0x10, 0x00,
|
|
||||||
0x12, 0x05, 0x0a, 0x01, 0x42, 0x10, 0x01, 0x12, 0x05, 0x0a, 0x01, 0x43, 0x10, 0x02, 0x12, 0x05,
|
|
||||||
0x0a, 0x01, 0x44, 0x10, 0x03, 0x22, 0x31, 0x0a, 0x09, 0x4f, 0x74, 0x68, 0x65, 0x72, 0x4c, 0x69,
|
|
||||||
0x6e, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
|
|
||||||
0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x69, 0x64, 0x73, 0x18, 0x03, 0x20,
|
|
||||||
0x03, 0x28, 0x0d, 0x52, 0x03, 0x69, 0x64, 0x73, 0x22, 0x38, 0x0a, 0x10, 0x4c, 0x69, 0x61, 0x6e,
|
|
||||||
0x53, 0x75, 0x6f, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x44, 0x61, 0x74, 0x61, 0x12, 0x0e, 0x0a, 0x02,
|
|
||||||
0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05,
|
|
||||||
0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x69, 0x6e, 0x64,
|
|
||||||
0x65, 0x78, 0x22, 0x83, 0x06, 0x0a, 0x0b, 0x4c, 0x69, 0x61, 0x6e, 0x53, 0x75, 0x6f, 0x44, 0x61,
|
|
||||||
0x74, 0x61, 0x12, 0x39, 0x0a, 0x08, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01,
|
|
||||||
0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x44, 0x61,
|
|
||||||
0x74, 0x61, 0x2e, 0x4c, 0x69, 0x61, 0x6e, 0x53, 0x75, 0x6f, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x44,
|
|
||||||
0x61, 0x74, 0x61, 0x52, 0x08, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x37, 0x0a,
|
|
||||||
0x07, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d,
|
|
||||||
0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x4c, 0x69, 0x61,
|
|
||||||
0x6e, 0x53, 0x75, 0x6f, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x44, 0x61, 0x74, 0x61, 0x52, 0x07, 0x73,
|
|
||||||
0x77, 0x69, 0x74, 0x63, 0x68, 0x73, 0x12, 0x3f, 0x0a, 0x0b, 0x73, 0x63, 0x72, 0x65, 0x65, 0x6e,
|
|
||||||
0x44, 0x6f, 0x6f, 0x72, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x72,
|
|
||||||
0x61, 0x70, 0x68, 0x69, 0x63, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x4c, 0x69, 0x61, 0x6e, 0x53, 0x75,
|
|
||||||
0x6f, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x44, 0x61, 0x74, 0x61, 0x52, 0x0b, 0x73, 0x63, 0x72, 0x65,
|
|
||||||
0x65, 0x6e, 0x44, 0x6f, 0x6f, 0x72, 0x73, 0x12, 0x37, 0x0a, 0x07, 0x73, 0x69, 0x67, 0x6e, 0x61,
|
|
||||||
0x6c, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68,
|
|
||||||
0x69, 0x63, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x4c, 0x69, 0x61, 0x6e, 0x53, 0x75, 0x6f, 0x49, 0x6e,
|
|
||||||
0x64, 0x65, 0x78, 0x44, 0x61, 0x74, 0x61, 0x52, 0x07, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x73,
|
|
||||||
0x12, 0x39, 0x0a, 0x08, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x05, 0x20, 0x03,
|
|
||||||
0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x44, 0x61, 0x74, 0x61,
|
|
||||||
0x2e, 0x4c, 0x69, 0x61, 0x6e, 0x53, 0x75, 0x6f, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x44, 0x61, 0x74,
|
|
||||||
0x61, 0x52, 0x08, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x3d, 0x0a, 0x0a, 0x66,
|
|
||||||
0x6c, 0x6f, 0x6f, 0x64, 0x47, 0x61, 0x74, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32,
|
|
||||||
0x1d, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x4c, 0x69,
|
|
||||||
0x61, 0x6e, 0x53, 0x75, 0x6f, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x44, 0x61, 0x74, 0x61, 0x52, 0x0a,
|
|
||||||
0x66, 0x6c, 0x6f, 0x6f, 0x64, 0x47, 0x61, 0x74, 0x65, 0x73, 0x12, 0x3f, 0x0a, 0x0b, 0x73, 0x70,
|
|
||||||
0x6b, 0x73, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32,
|
|
||||||
0x1d, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x4c, 0x69,
|
|
||||||
0x61, 0x6e, 0x53, 0x75, 0x6f, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x44, 0x61, 0x74, 0x61, 0x52, 0x0b,
|
|
||||||
0x73, 0x70, 0x6b, 0x73, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x73, 0x12, 0x3f, 0x0a, 0x0b, 0x67,
|
|
||||||
0x61, 0x72, 0x61, 0x67, 0x65, 0x44, 0x6f, 0x6f, 0x72, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b,
|
|
||||||
0x32, 0x1d, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x4c,
|
|
||||||
0x69, 0x61, 0x6e, 0x53, 0x75, 0x6f, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x44, 0x61, 0x74, 0x61, 0x52,
|
|
||||||
0x0b, 0x67, 0x61, 0x72, 0x61, 0x67, 0x65, 0x44, 0x6f, 0x6f, 0x72, 0x73, 0x12, 0x3d, 0x0a, 0x0a,
|
|
||||||
0x63, 0x61, 0x72, 0x57, 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b,
|
|
||||||
0x32, 0x1d, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x4c,
|
|
||||||
0x69, 0x61, 0x6e, 0x53, 0x75, 0x6f, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x44, 0x61, 0x74, 0x61, 0x52,
|
|
||||||
0x0a, 0x63, 0x61, 0x72, 0x57, 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x12, 0x3d, 0x0a, 0x0a, 0x65,
|
|
||||||
0x73, 0x62, 0x42, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32,
|
|
||||||
0x1d, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x4c, 0x69,
|
|
||||||
0x61, 0x6e, 0x53, 0x75, 0x6f, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x44, 0x61, 0x74, 0x61, 0x52, 0x0a,
|
|
||||||
0x65, 0x73, 0x62, 0x42, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x73, 0x12, 0x3f, 0x0a, 0x0b, 0x68, 0x6f,
|
|
||||||
0x6c, 0x64, 0x42, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32,
|
|
||||||
0x1d, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x4c, 0x69,
|
|
||||||
0x61, 0x6e, 0x53, 0x75, 0x6f, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x44, 0x61, 0x74, 0x61, 0x52, 0x0b,
|
|
||||||
0x68, 0x6f, 0x6c, 0x64, 0x42, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x73, 0x12, 0x4b, 0x0a, 0x11, 0x75,
|
|
||||||
0x6e, 0x61, 0x74, 0x74, 0x65, 0x6e, 0x67, 0x65, 0x64, 0x42, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x73,
|
|
||||||
0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63,
|
|
||||||
0x44, 0x61, 0x74, 0x61, 0x2e, 0x4c, 0x69, 0x61, 0x6e, 0x53, 0x75, 0x6f, 0x49, 0x6e, 0x64, 0x65,
|
|
||||||
0x78, 0x44, 0x61, 0x74, 0x61, 0x52, 0x11, 0x75, 0x6e, 0x61, 0x74, 0x74, 0x65, 0x6e, 0x67, 0x65,
|
|
||||||
0x64, 0x42, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x73, 0x22, 0x87, 0x01, 0x0a, 0x10, 0x55, 0x6e, 0x61,
|
|
||||||
0x74, 0x74, 0x65, 0x6e, 0x67, 0x65, 0x64, 0x42, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x12, 0x2f, 0x0a,
|
|
||||||
0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e,
|
0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e,
|
||||||
0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d,
|
0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d,
|
||||||
0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x12, 0x12,
|
0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x12, 0x12,
|
||||||
0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f,
|
0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f,
|
||||||
0x64, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x66, 0x6c, 0x69, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08,
|
0x64, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x72, 0x75, 0x6e, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69,
|
||||||
0x52, 0x04, 0x66, 0x6c, 0x69, 0x70, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x66, 0x53, 0x74, 0x61,
|
0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x75, 0x6e, 0x44, 0x69, 0x72,
|
||||||
0x6e, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x72, 0x65, 0x66, 0x53, 0x74, 0x61,
|
0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x66, 0x53, 0x74, 0x61,
|
||||||
0x6e, 0x64, 0x22, 0x81, 0x01, 0x0a, 0x0a, 0x48, 0x6f, 0x6c, 0x64, 0x42, 0x75, 0x74, 0x74, 0x6f,
|
0x6e, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x72, 0x65, 0x66, 0x53, 0x74, 0x61,
|
||||||
|
0x6e, 0x64, 0x22, 0x9a, 0x01, 0x0a, 0x0d, 0x41, 0x75, 0x74, 0x6f, 0x52, 0x65, 0x74, 0x75, 0x72,
|
||||||
|
0x6e, 0x42, 0x6f, 0x78, 0x12, 0x2f, 0x0a, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x18, 0x01,
|
||||||
|
0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x44, 0x61,
|
||||||
|
0x74, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x06, 0x63,
|
||||||
|
0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20,
|
||||||
|
0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x66, 0x6c, 0x69,
|
||||||
|
0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x66, 0x6c, 0x69, 0x70, 0x12, 0x14, 0x0a,
|
||||||
|
0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e,
|
||||||
|
0x64, 0x65, 0x78, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x66, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x18,
|
||||||
|
0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x72, 0x65, 0x66, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x22,
|
||||||
|
0x79, 0x0a, 0x17, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x49, 0x64, 0x4f, 0x66, 0x53, 0x74, 0x61,
|
||||||
|
0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x69,
|
||||||
|
0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x69, 0x74, 0x79, 0x12, 0x16,
|
||||||
|
0x0a, 0x06, 0x6c, 0x69, 0x6e, 0x65, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06,
|
||||||
|
0x6c, 0x69, 0x6e, 0x65, 0x49, 0x64, 0x12, 0x32, 0x0a, 0x14, 0x6d, 0x61, 0x69, 0x6e, 0x43, 0x6f,
|
||||||
|
0x6f, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x18, 0x03,
|
||||||
|
0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x6d, 0x61, 0x69, 0x6e, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x69,
|
||||||
|
0x6e, 0x61, 0x74, 0x65, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x22, 0x90, 0x01, 0x0a, 0x10, 0x4b,
|
||||||
|
0x69, 0x6c, 0x6f, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x12,
|
||||||
|
0x2e, 0x0a, 0x03, 0x6b, 0x6d, 0x41, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67,
|
||||||
|
0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x4b, 0x69, 0x6c, 0x6f, 0x6d,
|
||||||
|
0x65, 0x74, 0x65, 0x72, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x52, 0x03, 0x6b, 0x6d, 0x41, 0x12,
|
||||||
|
0x2e, 0x0a, 0x03, 0x6b, 0x6d, 0x42, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67,
|
||||||
|
0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x4b, 0x69, 0x6c, 0x6f, 0x6d,
|
||||||
|
0x65, 0x74, 0x65, 0x72, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x52, 0x03, 0x6b, 0x6d, 0x42, 0x12,
|
||||||
|
0x1c, 0x0a, 0x09, 0x73, 0x61, 0x6d, 0x65, 0x54, 0x72, 0x65, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01,
|
||||||
|
0x28, 0x08, 0x52, 0x09, 0x73, 0x61, 0x6d, 0x65, 0x54, 0x72, 0x65, 0x6e, 0x64, 0x22, 0xbd, 0x01,
|
||||||
|
0x0a, 0x13, 0x53, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x65, 0x44,
|
||||||
|
0x65, 0x76, 0x69, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20,
|
||||||
|
0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x4e, 0x0a, 0x10, 0x63, 0x6f, 0x6d,
|
||||||
|
0x62, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x02, 0x20,
|
||||||
|
0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x44, 0x61, 0x74,
|
||||||
|
0x61, 0x2e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x6d, 0x62, 0x69, 0x6e, 0x61, 0x74,
|
||||||
|
0x69, 0x6f, 0x6e, 0x74, 0x79, 0x70, 0x65, 0x52, 0x10, 0x63, 0x6f, 0x6d, 0x62, 0x69, 0x6e, 0x61,
|
||||||
|
0x74, 0x69, 0x6f, 0x6e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x12, 0x42, 0x0a, 0x0a, 0x64, 0x65, 0x76,
|
||||||
|
0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e,
|
||||||
|
0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x6c, 0x61,
|
||||||
|
0x74, 0x65, 0x64, 0x52, 0x65, 0x66, 0x2e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70,
|
||||||
|
0x65, 0x52, 0x0a, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x22, 0x4b, 0x0a,
|
||||||
|
0x15, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x6d, 0x62, 0x69, 0x6e, 0x61, 0x74, 0x69,
|
||||||
|
0x6f, 0x6e, 0x74, 0x79, 0x70, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01,
|
||||||
|
0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x72, 0x65,
|
||||||
|
0x66, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x0a,
|
||||||
|
0x72, 0x65, 0x66, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x22, 0x62, 0x0a, 0x10, 0x53, 0x65,
|
||||||
|
0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x64, 0x65, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x1e,
|
||||||
|
0x0a, 0x0a, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03,
|
||||||
|
0x28, 0x0d, 0x52, 0x0a, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x73, 0x12, 0x2e,
|
||||||
|
0x0a, 0x12, 0x63, 0x65, 0x6e, 0x74, 0x72, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x53, 0x74, 0x61,
|
||||||
|
0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x12, 0x63, 0x65, 0x6e, 0x74,
|
||||||
|
0x72, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xc8,
|
||||||
|
0x02, 0x0a, 0x05, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x12, 0x3d, 0x0a, 0x0a, 0x74, 0x72, 0x61, 0x69,
|
||||||
|
0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1d, 0x2e, 0x67,
|
||||||
|
0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x54, 0x72, 0x61, 0x69, 0x6e,
|
||||||
|
0x2e, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x0a, 0x74, 0x72, 0x61,
|
||||||
|
0x69, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x12, 0x26, 0x0a, 0x0e, 0x63, 0x61, 0x72, 0x72, 0x69,
|
||||||
|
0x61, 0x67, 0x65, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52,
|
||||||
|
0x0e, 0x63, 0x61, 0x72, 0x72, 0x69, 0x61, 0x67, 0x65, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12,
|
||||||
|
0x20, 0x0a, 0x0b, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x03,
|
||||||
|
0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x4c, 0x65, 0x6e, 0x67, 0x74,
|
||||||
|
0x68, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x74, 0x73, 0x18, 0x06,
|
||||||
|
0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x74, 0x73, 0x12,
|
||||||
|
0x40, 0x0a, 0x0d, 0x64, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67,
|
||||||
|
0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e,
|
||||||
|
0x54, 0x72, 0x61, 0x69, 0x6e, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x43, 0x6f, 0x6e, 0x66,
|
||||||
|
0x69, 0x67, 0x52, 0x0d, 0x64, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69,
|
||||||
|
0x67, 0x12, 0x2c, 0x0a, 0x11, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f,
|
||||||
|
0x6c, 0x4d, 0x61, 0x70, 0x49, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x11, 0x74, 0x72,
|
||||||
|
0x61, 0x69, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x4d, 0x61, 0x70, 0x49, 0x64, 0x22,
|
||||||
|
0x28, 0x0a, 0x0a, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x12, 0x05, 0x0a,
|
||||||
|
0x01, 0x41, 0x10, 0x00, 0x12, 0x05, 0x0a, 0x01, 0x42, 0x10, 0x01, 0x12, 0x05, 0x0a, 0x01, 0x43,
|
||||||
|
0x10, 0x02, 0x12, 0x05, 0x0a, 0x01, 0x44, 0x10, 0x03, 0x22, 0x31, 0x0a, 0x09, 0x4f, 0x74, 0x68,
|
||||||
|
0x65, 0x72, 0x4c, 0x69, 0x6e, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01,
|
||||||
|
0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x69, 0x64,
|
||||||
|
0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x03, 0x69, 0x64, 0x73, 0x22, 0x38, 0x0a, 0x10,
|
||||||
|
0x4c, 0x69, 0x61, 0x6e, 0x53, 0x75, 0x6f, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x44, 0x61, 0x74, 0x61,
|
||||||
|
0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x69, 0x64,
|
||||||
|
0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52,
|
||||||
|
0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x83, 0x06, 0x0a, 0x0b, 0x4c, 0x69, 0x61, 0x6e, 0x53,
|
||||||
|
0x75, 0x6f, 0x44, 0x61, 0x74, 0x61, 0x12, 0x39, 0x0a, 0x08, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f,
|
||||||
|
0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68,
|
||||||
|
0x69, 0x63, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x4c, 0x69, 0x61, 0x6e, 0x53, 0x75, 0x6f, 0x49, 0x6e,
|
||||||
|
0x64, 0x65, 0x78, 0x44, 0x61, 0x74, 0x61, 0x52, 0x08, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e,
|
||||||
|
0x73, 0x12, 0x37, 0x0a, 0x07, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, 0x73, 0x18, 0x02, 0x20, 0x03,
|
||||||
|
0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x44, 0x61, 0x74, 0x61,
|
||||||
|
0x2e, 0x4c, 0x69, 0x61, 0x6e, 0x53, 0x75, 0x6f, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x44, 0x61, 0x74,
|
||||||
|
0x61, 0x52, 0x07, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, 0x73, 0x12, 0x3f, 0x0a, 0x0b, 0x73, 0x63,
|
||||||
|
0x72, 0x65, 0x65, 0x6e, 0x44, 0x6f, 0x6f, 0x72, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32,
|
||||||
|
0x1d, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x4c, 0x69,
|
||||||
|
0x61, 0x6e, 0x53, 0x75, 0x6f, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x44, 0x61, 0x74, 0x61, 0x52, 0x0b,
|
||||||
|
0x73, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x44, 0x6f, 0x6f, 0x72, 0x73, 0x12, 0x37, 0x0a, 0x07, 0x73,
|
||||||
|
0x69, 0x67, 0x6e, 0x61, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x67,
|
||||||
|
0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x4c, 0x69, 0x61, 0x6e, 0x53,
|
||||||
|
0x75, 0x6f, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x44, 0x61, 0x74, 0x61, 0x52, 0x07, 0x73, 0x69, 0x67,
|
||||||
|
0x6e, 0x61, 0x6c, 0x73, 0x12, 0x39, 0x0a, 0x08, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73,
|
||||||
|
0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63,
|
||||||
|
0x44, 0x61, 0x74, 0x61, 0x2e, 0x4c, 0x69, 0x61, 0x6e, 0x53, 0x75, 0x6f, 0x49, 0x6e, 0x64, 0x65,
|
||||||
|
0x78, 0x44, 0x61, 0x74, 0x61, 0x52, 0x08, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12,
|
||||||
|
0x3d, 0x0a, 0x0a, 0x66, 0x6c, 0x6f, 0x6f, 0x64, 0x47, 0x61, 0x74, 0x65, 0x73, 0x18, 0x06, 0x20,
|
||||||
|
0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x44, 0x61, 0x74,
|
||||||
|
0x61, 0x2e, 0x4c, 0x69, 0x61, 0x6e, 0x53, 0x75, 0x6f, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x44, 0x61,
|
||||||
|
0x74, 0x61, 0x52, 0x0a, 0x66, 0x6c, 0x6f, 0x6f, 0x64, 0x47, 0x61, 0x74, 0x65, 0x73, 0x12, 0x3f,
|
||||||
|
0x0a, 0x0b, 0x73, 0x70, 0x6b, 0x73, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x73, 0x18, 0x07, 0x20,
|
||||||
|
0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x44, 0x61, 0x74,
|
||||||
|
0x61, 0x2e, 0x4c, 0x69, 0x61, 0x6e, 0x53, 0x75, 0x6f, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x44, 0x61,
|
||||||
|
0x74, 0x61, 0x52, 0x0b, 0x73, 0x70, 0x6b, 0x73, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x73, 0x12,
|
||||||
|
0x3f, 0x0a, 0x0b, 0x67, 0x61, 0x72, 0x61, 0x67, 0x65, 0x44, 0x6f, 0x6f, 0x72, 0x73, 0x18, 0x08,
|
||||||
|
0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x44, 0x61,
|
||||||
|
0x74, 0x61, 0x2e, 0x4c, 0x69, 0x61, 0x6e, 0x53, 0x75, 0x6f, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x44,
|
||||||
|
0x61, 0x74, 0x61, 0x52, 0x0b, 0x67, 0x61, 0x72, 0x61, 0x67, 0x65, 0x44, 0x6f, 0x6f, 0x72, 0x73,
|
||||||
|
0x12, 0x3d, 0x0a, 0x0a, 0x63, 0x61, 0x72, 0x57, 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x18, 0x09,
|
||||||
|
0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x44, 0x61,
|
||||||
|
0x74, 0x61, 0x2e, 0x4c, 0x69, 0x61, 0x6e, 0x53, 0x75, 0x6f, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x44,
|
||||||
|
0x61, 0x74, 0x61, 0x52, 0x0a, 0x63, 0x61, 0x72, 0x57, 0x61, 0x73, 0x68, 0x69, 0x6e, 0x67, 0x12,
|
||||||
|
0x3d, 0x0a, 0x0a, 0x65, 0x73, 0x62, 0x42, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x73, 0x18, 0x0a, 0x20,
|
||||||
|
0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x44, 0x61, 0x74,
|
||||||
|
0x61, 0x2e, 0x4c, 0x69, 0x61, 0x6e, 0x53, 0x75, 0x6f, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x44, 0x61,
|
||||||
|
0x74, 0x61, 0x52, 0x0a, 0x65, 0x73, 0x62, 0x42, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x73, 0x12, 0x3f,
|
||||||
|
0x0a, 0x0b, 0x68, 0x6f, 0x6c, 0x64, 0x42, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x73, 0x18, 0x0b, 0x20,
|
||||||
|
0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x44, 0x61, 0x74,
|
||||||
|
0x61, 0x2e, 0x4c, 0x69, 0x61, 0x6e, 0x53, 0x75, 0x6f, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x44, 0x61,
|
||||||
|
0x74, 0x61, 0x52, 0x0b, 0x68, 0x6f, 0x6c, 0x64, 0x42, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x73, 0x12,
|
||||||
|
0x4b, 0x0a, 0x11, 0x75, 0x6e, 0x61, 0x74, 0x74, 0x65, 0x6e, 0x67, 0x65, 0x64, 0x42, 0x75, 0x74,
|
||||||
|
0x74, 0x6f, 0x6e, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x72, 0x61,
|
||||||
|
0x70, 0x68, 0x69, 0x63, 0x44, 0x61, 0x74, 0x61, 0x2e, 0x4c, 0x69, 0x61, 0x6e, 0x53, 0x75, 0x6f,
|
||||||
|
0x49, 0x6e, 0x64, 0x65, 0x78, 0x44, 0x61, 0x74, 0x61, 0x52, 0x11, 0x75, 0x6e, 0x61, 0x74, 0x74,
|
||||||
|
0x65, 0x6e, 0x67, 0x65, 0x64, 0x42, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x73, 0x22, 0x87, 0x01, 0x0a,
|
||||||
|
0x10, 0x55, 0x6e, 0x61, 0x74, 0x74, 0x65, 0x6e, 0x67, 0x65, 0x64, 0x42, 0x75, 0x74, 0x74, 0x6f,
|
||||||
0x6e, 0x12, 0x2f, 0x0a, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28,
|
0x6e, 0x12, 0x2f, 0x0a, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28,
|
||||||
0x0b, 0x32, 0x17, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x44, 0x61, 0x74, 0x61, 0x2e,
|
0x0b, 0x32, 0x17, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x44, 0x61, 0x74, 0x61, 0x2e,
|
||||||
0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x06, 0x63, 0x6f, 0x6d, 0x6d,
|
0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x06, 0x63, 0x6f, 0x6d, 0x6d,
|
||||||
@ -6735,16 +6747,24 @@ var file_stationLayoutGraphics_proto_rawDesc = []byte{
|
|||||||
0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x66, 0x6c, 0x69, 0x70, 0x18, 0x03,
|
0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x66, 0x6c, 0x69, 0x70, 0x18, 0x03,
|
||||||
0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x66, 0x6c, 0x69, 0x70, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65,
|
0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x66, 0x6c, 0x69, 0x70, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65,
|
||||||
0x66, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x72, 0x65,
|
0x66, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x72, 0x65,
|
||||||
0x66, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x2a, 0x1d, 0x0a, 0x09, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74,
|
0x66, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x22, 0x81, 0x01, 0x0a, 0x0a, 0x48, 0x6f, 0x6c, 0x64, 0x42,
|
||||||
0x69, 0x6f, 0x6e, 0x12, 0x06, 0x0a, 0x02, 0x55, 0x50, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x44,
|
0x75, 0x74, 0x74, 0x6f, 0x6e, 0x12, 0x2f, 0x0a, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x18,
|
||||||
0x4f, 0x57, 0x4e, 0x10, 0x01, 0x42, 0x69, 0x0a, 0x25, 0x63, 0x6c, 0x75, 0x62, 0x2e, 0x6a, 0x6f,
|
0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x44,
|
||||||
0x79, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x62, 0x6a, 0x72, 0x74, 0x73, 0x73, 0x2e, 0x61, 0x74, 0x73,
|
0x61, 0x74, 0x61, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x06,
|
||||||
0x2e, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x42, 0x13,
|
0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02,
|
||||||
0x4c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x47, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x73, 0x50, 0x72,
|
0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x66, 0x6c,
|
||||||
0x6f, 0x74, 0x6f, 0x5a, 0x2b, 0x6a, 0x6f, 0x79, 0x6c, 0x69, 0x6e, 0x6b, 0x2e, 0x63, 0x6c, 0x75,
|
0x69, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x66, 0x6c, 0x69, 0x70, 0x12, 0x1a,
|
||||||
0x62, 0x2f, 0x62, 0x6a, 0x2d, 0x72, 0x74, 0x73, 0x74, 0x73, 0x2d, 0x73, 0x65, 0x72, 0x76, 0x65,
|
0x0a, 0x08, 0x72, 0x65, 0x66, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d,
|
||||||
0x72, 0x2f, 0x64, 0x74, 0x6f, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f,
|
0x52, 0x08, 0x72, 0x65, 0x66, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x2a, 0x1d, 0x0a, 0x09, 0x44, 0x69,
|
||||||
0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
|
0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x06, 0x0a, 0x02, 0x55, 0x50, 0x10, 0x00, 0x12,
|
||||||
|
0x08, 0x0a, 0x04, 0x44, 0x4f, 0x57, 0x4e, 0x10, 0x01, 0x42, 0x69, 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, 0x13, 0x4c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x47, 0x72, 0x61, 0x70, 0x68, 0x69,
|
||||||
|
0x63, 0x73, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x5a, 0x2b, 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, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x70,
|
||||||
|
0x72, 0x6f, 0x74, 0x6f, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
|
||||||
}
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
@ -40,6 +40,7 @@ type RunConfigSelectOption struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type TrainConnTypeConfigDto struct {
|
type TrainConnTypeConfigDto struct {
|
||||||
|
TypeName string `json:"typeName" form:"typeName"` // 连接名称; //连接名称
|
||||||
ConnType state_proto.TrainConnState_TrainConnType `json:"connType" form:"connType"` // NONE = 0 未知连接 ;VOBC = 1; //半实物;PC_SIM = 2; //PC仿真
|
ConnType state_proto.TrainConnState_TrainConnType `json:"connType" form:"connType"` // NONE = 0 未知连接 ;VOBC = 1; //半实物;PC_SIM = 2; //PC仿真
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -152,6 +152,7 @@ type TrainConnThirdDto struct {
|
|||||||
SimulationId string `json:"simulationId" form:"simulationId"`
|
SimulationId string `json:"simulationId" form:"simulationId"`
|
||||||
Id string `json:"id" form:"id"` // 列车Id
|
Id string `json:"id" form:"id"` // 列车Id
|
||||||
ConnType state_proto.TrainConnState_TrainConnType `json:"connType" form:"connType"` //连接类型 0=未连接;1=半实物;2= 车载仿真
|
ConnType state_proto.TrainConnState_TrainConnType `json:"connType" form:"connType"` //连接类型 0=未连接;1=半实物;2= 车载仿真
|
||||||
|
TypeName string `json:"typeName" form:"typeName"` //连接名称
|
||||||
}
|
}
|
||||||
|
|
||||||
// 为仿真添加测试车请求
|
// 为仿真添加测试车请求
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -10,6 +10,14 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
func lowPower(power bool) bool {
|
||||||
|
if power {
|
||||||
|
return false
|
||||||
|
} else {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// 综合后备盘IBP消息服务
|
// 综合后备盘IBP消息服务
|
||||||
func NewTrainControlMs(vs *memory.VerifySimulation, mapId int32) ms_api.MsgTask {
|
func NewTrainControlMs(vs *memory.VerifySimulation, mapId int32) ms_api.MsgTask {
|
||||||
return ms_api.NewScheduleTask(fmt.Sprintf("地图[%d]列车控制", mapId), func() error {
|
return ms_api.NewScheduleTask(fmt.Sprintf("地图[%d]列车控制", mapId), func() error {
|
||||||
@ -18,12 +26,51 @@ func NewTrainControlMs(vs *memory.VerifySimulation, mapId int32) ms_api.MsgTask
|
|||||||
trainId := fmt.Sprintf("%v", key)
|
trainId := fmt.Sprintf("%v", key)
|
||||||
ts := value.(*state_proto.TrainState)
|
ts := value.(*state_proto.TrainState)
|
||||||
ttcc := ts.Tcc
|
ttcc := ts.Tcc
|
||||||
|
vobc := ts.VobcState
|
||||||
lights := make([]*state_proto.TrainControlState_ControlLight, 0)
|
lights := make([]*state_proto.TrainControlState_ControlLight, 0)
|
||||||
for _, light := range ttcc.LightMaps {
|
for lightKey, light := range ttcc.LightMaps {
|
||||||
|
switch lightKey {
|
||||||
|
case memory.LIGHT_JJZD:
|
||||||
|
state := lowPower(vobc.LightEmergencyBrakingStatus)
|
||||||
|
lights = append(lights, &state_proto.TrainControlState_ControlLight{Id: light.Id, Val: state})
|
||||||
|
case memory.LIGHT_QQY:
|
||||||
|
state := lowPower(vobc.LightTractionSafetyCircuit)
|
||||||
|
lights = append(lights, &state_proto.TrainControlState_ControlLight{Id: light.Id, Val: state})
|
||||||
|
case memory.LIGHT_JSSJH:
|
||||||
|
lights = append(lights, &state_proto.TrainControlState_ControlLight{Id: light.Id, Val: vobc.LightDriverActive})
|
||||||
|
case memory.LIGHT_TFZDHJ:
|
||||||
|
lights = append(lights, &state_proto.TrainControlState_ControlLight{Id: light.Id, Val: vobc.StopNotAllBrake})
|
||||||
|
case memory.LIGHT_QYYX:
|
||||||
|
lights = append(lights, &state_proto.TrainControlState_ControlLight{Id: light.Id, Val: vobc.TractionEffective})
|
||||||
|
case memory.LIGHT_ZDYX:
|
||||||
|
lights = append(lights, &state_proto.TrainControlState_ControlLight{Id: light.Id, Val: vobc.BrakeEffective})
|
||||||
|
case memory.LIGHT_TFZDSJ:
|
||||||
|
lights = append(lights, &state_proto.TrainControlState_ControlLight{Id: light.Id, Val: vobc.ParkingBrakeStatus})
|
||||||
|
case memory.LIGHT_CYZD:
|
||||||
|
lights = append(lights, &state_proto.TrainControlState_ControlLight{Id: light.Id, Val: vobc.MostUseBrake})
|
||||||
|
case memory.LIGHT_ZDGL:
|
||||||
|
lights = append(lights, &state_proto.TrainControlState_ControlLight{Id: light.Id, Val: vobc.BrakeQuarantine})
|
||||||
|
|
||||||
|
case memory.LIGHT_LSXH:
|
||||||
|
lights = append(lights, &state_proto.TrainControlState_ControlLight{Id: light.Id, Val: vobc.NoSpeedSigle})
|
||||||
|
case memory.LIGHT_ZMYX:
|
||||||
|
lights = append(lights, &state_proto.TrainControlState_ControlLight{Id: light.Id, Val: vobc.LeftDoorState})
|
||||||
|
case memory.LIGHT_YMYX:
|
||||||
|
lights = append(lights, &state_proto.TrainControlState_ControlLight{Id: light.Id, Val: vobc.RightDoorState})
|
||||||
|
case memory.LIGHT_ZFZSD:
|
||||||
|
lights = append(lights, &state_proto.TrainControlState_ControlLight{Id: light.Id, Val: vobc.TurnbackStatus})
|
||||||
|
case memory.LIGHT_BDATPKC:
|
||||||
|
lights = append(lights, &state_proto.TrainControlState_ControlLight{Id: light.Id, Val: vobc.LocalAtpControl})
|
||||||
|
|
||||||
|
default:
|
||||||
lights = append(lights, &state_proto.TrainControlState_ControlLight{Id: light.Id, Val: light.Val})
|
lights = append(lights, &state_proto.TrainControlState_ControlLight{Id: light.Id, Val: light.Val})
|
||||||
}
|
}
|
||||||
tcc := &state_proto.TrainControlStateMsg{Buttons: ttcc.Buttons, DriverKey: ttcc.DriverKey, DirKey: ttcc.DirKey, PushHandler: ttcc.PushHandler, Lights: lights}
|
}
|
||||||
|
buttons := make([]*state_proto.TrainControlState_ControlButton, 0)
|
||||||
|
for _, button := range ttcc.Buttons {
|
||||||
|
buttons = append(buttons, button)
|
||||||
|
}
|
||||||
|
tcc := &state_proto.TrainControlStateMsg{Buttons: buttons, DriverKey: ttcc.DriverKey, DirKey: ttcc.DirKey, PushHandler: ttcc.PushHandler, Lights: lights}
|
||||||
err := mqtt.GetMsgClient().PubTrainControlState(vs.SimulationId, trainId, tcc)
|
err := mqtt.GetMsgClient().PubTrainControlState(vs.SimulationId, trainId, tcc)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
slog.Error("发送列车控制mqtt失败", err)
|
slog.Error("发送列车控制mqtt失败", err)
|
||||||
|
@ -1 +1 @@
|
|||||||
Subproject commit 6cdf88a92d573fdb6502047d10abd1af7d0e40a2
|
Subproject commit 2f5d8c3cfdf06ced1a0b0a50f47f9353c441e196
|
@ -1,7 +1,10 @@
|
|||||||
package service
|
package service
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"joylink.club/bj-rtsts-server/config"
|
||||||
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"joylink.club/bj-rtsts-server/db/dbquery"
|
"joylink.club/bj-rtsts-server/db/dbquery"
|
||||||
@ -33,8 +36,31 @@ func ListProjectRunConfigQuery() []*dto.ProjectRunConfigDto {
|
|||||||
return dto.ConvertToRunConfigFromSlice(records)
|
return dto.ConvertToRunConfigFromSlice(records)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func checkRunConfig(jsonConfigStr string) *sys_error.BusinessError {
|
||||||
|
var configMap config.ThirdPartyConfig
|
||||||
|
err := json.Unmarshal([]byte(jsonConfigStr), &configMap)
|
||||||
|
if err != nil {
|
||||||
|
return sys_error.New("运行环境序列化错误", err)
|
||||||
|
}
|
||||||
|
checkSameMap := make(map[string]bool)
|
||||||
|
for _, simConfig := range configMap.PcSimConfigs {
|
||||||
|
if simConfig.ConfigName == "" || len(strings.TrimSpace(simConfig.ConfigName)) == 0 {
|
||||||
|
return sys_error.New(fmt.Sprintf("车载运行配置名称不能为空 配置ip:%v,端口%v", simConfig.PcSimIp, simConfig.PcSimPort), err)
|
||||||
|
}
|
||||||
|
if checkSameMap[simConfig.ConfigName] {
|
||||||
|
return sys_error.New(fmt.Sprintf("车载运行配置重复的名称:%v", simConfig.ConfigName), err)
|
||||||
|
}
|
||||||
|
checkSameMap[simConfig.ConfigName] = true
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
// 创建项目运行环境
|
// 创建项目运行环境
|
||||||
func CreateProjectRunConfig(dd *dto.ProjectRunConfigReqDto) bool {
|
func CreateProjectRunConfig(dd *dto.ProjectRunConfigReqDto) bool {
|
||||||
|
if checkErr := checkRunConfig(dd.ConfigContent); checkErr != nil {
|
||||||
|
panic(checkErr)
|
||||||
|
}
|
||||||
|
|
||||||
d := model.ProjectRunConfig{
|
d := model.ProjectRunConfig{
|
||||||
Name: dd.Name,
|
Name: dd.Name,
|
||||||
Description: dd.Description,
|
Description: dd.Description,
|
||||||
@ -42,6 +68,7 @@ func CreateProjectRunConfig(dd *dto.ProjectRunConfigReqDto) bool {
|
|||||||
CreateTime: time.Now(),
|
CreateTime: time.Now(),
|
||||||
UpdateTime: time.Now(),
|
UpdateTime: time.Now(),
|
||||||
}
|
}
|
||||||
|
|
||||||
err := dbquery.ProjectRunConfig.Save(&d)
|
err := dbquery.ProjectRunConfig.Save(&d)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(sys_error.New("保存失败,数据库错误请联系运维人员", err))
|
panic(sys_error.New("保存失败,数据库错误请联系运维人员", err))
|
||||||
@ -75,6 +102,9 @@ func QueryRunConfig(id int32) *dto.ProjectRunConfigDto {
|
|||||||
|
|
||||||
// 更新项目运行环境
|
// 更新项目运行环境
|
||||||
func UpdateProjectRunConfig(id int32, dd *dto.ProjectRunConfigReqDto) bool {
|
func UpdateProjectRunConfig(id int32, dd *dto.ProjectRunConfigReqDto) bool {
|
||||||
|
if checkErr := checkRunConfig(dd.ConfigContent); checkErr != nil {
|
||||||
|
panic(checkErr)
|
||||||
|
}
|
||||||
findOldQuery := dbquery.ProjectRunConfig
|
findOldQuery := dbquery.ProjectRunConfig
|
||||||
oldD, err := findOldQuery.Where(findOldQuery.ID.Eq(id)).Debug().First()
|
oldD, err := findOldQuery.Where(findOldQuery.ID.Eq(id)).Debug().First()
|
||||||
if oldD == nil || err != nil {
|
if oldD == nil || err != nil {
|
||||||
|
@ -28,8 +28,8 @@ const (
|
|||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
T_POLY_1 = 0x0FC22F87 //通道1的时间戳生成多项式
|
T_POLY_1 uint32 = 0x0FC22F87 //通道1的时间戳生成多项式
|
||||||
T_POLY_2 = 0xC3E887E1 //通道2的时间戳生成多项式
|
T_POLY_2 uint32 = 0xC3E887E1 //通道2的时间戳生成多项式
|
||||||
)
|
)
|
||||||
|
|
||||||
const Twait_sse = 3 //默认sse等待回应的周期数
|
const Twait_sse = 3 //默认sse等待回应的周期数
|
||||||
|
12
third_party/axle_device/beijing12/msg/rsd.go
vendored
12
third_party/axle_device/beijing12/msg/rsd.go
vendored
@ -21,13 +21,13 @@ type RsdMsg struct {
|
|||||||
|
|
||||||
func (r *RsdMsg) Encode() []byte {
|
func (r *RsdMsg) Encode() []byte {
|
||||||
data := r.MsgHeader.encode()
|
data := r.MsgHeader.encode()
|
||||||
data = binary.BigEndian.AppendUint32(data, r.SeqNum)
|
data = binary.LittleEndian.AppendUint32(data, r.SeqNum)
|
||||||
data = binary.BigEndian.AppendUint16(data, r.UserDataLen)
|
data = binary.LittleEndian.AppendUint16(data, r.UserDataLen)
|
||||||
data = binary.BigEndian.AppendUint32(data, r.Svc1)
|
data = binary.LittleEndian.AppendUint32(data, r.Svc1)
|
||||||
data = binary.BigEndian.AppendUint32(data, r.Svc2)
|
data = binary.LittleEndian.AppendUint32(data, r.Svc2)
|
||||||
data = append(data, r.UserData...)
|
data = append(data, r.UserData...)
|
||||||
r.Tail = message.Rssp_I_Crc16(r.UserData)
|
r.Tail = message.Rssp_I_Crc16(data)
|
||||||
data = binary.BigEndian.AppendUint16(data, r.Tail)
|
data = binary.LittleEndian.AppendUint16(data, r.Tail)
|
||||||
return data
|
return data
|
||||||
}
|
}
|
||||||
|
|
||||||
|
358
third_party/axle_device/beijing12/service.go
vendored
358
third_party/axle_device/beijing12/service.go
vendored
@ -38,16 +38,30 @@ type serviceContext struct {
|
|||||||
cancelFunc context.CancelFunc
|
cancelFunc context.CancelFunc
|
||||||
ciSectionIndexConfigs []*proto.CiSectionCodePoint
|
ciSectionIndexConfigs []*proto.CiSectionCodePoint
|
||||||
|
|
||||||
sourceAddr uint16 //源地址 从配置中的16进制字符串转来的
|
remoteAddr uint16 //联锁地址 从配置中的16进制字符串转来的
|
||||||
targetAddr uint16 //目的地址 从配置中的16进制字符串转来的
|
localAddr uint16 //计轴地址 从配置中的16进制字符串转来的
|
||||||
sid1 uint32 //SID1 从配置中的16进制字符串转来的
|
remoteSid1 uint32 //联锁SID1 从配置中的16进制字符串转来的
|
||||||
sid2 uint32 //SID2 从配置中的16进制字符串转来的
|
remoteSid2 uint32 //联锁SID2 从配置中的16进制字符串转来的
|
||||||
|
localSid1 uint32 //计轴SID1 从配置中的16进制字符串转来的
|
||||||
|
localSid2 uint32 //计轴SID2 从配置中的16进制字符串转来的
|
||||||
|
remoteSinit1 uint32 //联锁SINIT1 从配置中的16进制字符串转来的
|
||||||
|
remoteSinit2 uint32 //联锁SINIT2 从配置中的16进制字符串转来的
|
||||||
|
localSinit1 uint32 //计轴SINT1 从配置中的16进制字符串转来的
|
||||||
|
localSinit2 uint32 //计轴SINT2 从配置中的16进制字符串转来的
|
||||||
|
remoteDataVer1 uint32 //联锁DATAVER1 从配置中的16进制字符串转来的
|
||||||
|
remoteDataVer2 uint32 //联锁DATAVER2 从配置中的16进制字符串转来的
|
||||||
|
localDataVer1 uint32 //计轴DATAVER1 从配置中的16进制字符串转来的
|
||||||
|
localDataVer2 uint32 //计轴DATAVER2 从配置中的16进制字符串转来的
|
||||||
msgChan <-chan []byte //消息队列
|
msgChan <-chan []byte //消息队列
|
||||||
seqNum uint32 //当前的序列号
|
seqNum uint32 //当前的序列号
|
||||||
lastSeqNum uint32 //最近一次收到的序列号
|
lastSeqParam1 uint32 //最近一次的有效时序参数 remoteSinit1~+[remoteSid1^t1(n)]
|
||||||
lastTimeSeqParam uint32 //最近一次的有效时序参数
|
lastSeqParam2 uint32 //最近一次的有效时序参数 remoteSinit2~+[remoteSid2^t2(n)]
|
||||||
|
lfsr1 *lfsr //用来计算时间戳的lfsr
|
||||||
|
lfsr2 *lfsr //用来计算时间戳的lfsr
|
||||||
sseMsg *msg.SseMsg //发送出去的时序校验请求
|
sseMsg *msg.SseMsg //发送出去的时序校验请求
|
||||||
sseWaitTimer <-chan time.Time //sse超时定时器
|
sseWaitTimer <-chan time.Time //sse超时定时器
|
||||||
|
precSinit1 uint32 // 用来从SSR消息的SeqInit中提取时序参数
|
||||||
|
precSinit2 uint32 // 用来从SSR消息的SeqInit中提取时序参数
|
||||||
}
|
}
|
||||||
|
|
||||||
func Start(simulation *memory.VerifySimulation) {
|
func Start(simulation *memory.VerifySimulation) {
|
||||||
@ -73,40 +87,18 @@ func Start(simulation *memory.VerifySimulation) {
|
|||||||
logger().Warn(fmt.Sprintf("集中站[%s]无区段编码数据,服务不启动", rsspConfig.StationCode))
|
logger().Warn(fmt.Sprintf("集中站[%s]无区段编码数据,服务不启动", rsspConfig.StationCode))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
sourceAddr, err := strconv.ParseUint(rsspConfig.NetAConfig.SourceAddr, 16, 16)
|
//初始化服务上下文
|
||||||
if err != nil {
|
serviceCtx := initServiceContext(rsspConfig, ref, simulation)
|
||||||
panic(sys_error.New(fmt.Sprintf("%s集中站[%s]解析源地址[%s]出错", logTag, rsspConfig.StationCode, rsspConfig.NetAConfig.SourceAddr)))
|
//准备启动服务
|
||||||
}
|
|
||||||
targetAddr, err := strconv.ParseUint(rsspConfig.NetAConfig.TargetAddr, 16, 16)
|
|
||||||
if err != nil {
|
|
||||||
panic(sys_error.New(fmt.Sprintf("%s集中站[%s]解析目的地址[%s]出错", logTag, rsspConfig.StationCode, rsspConfig.NetAConfig.TargetAddr)))
|
|
||||||
}
|
|
||||||
sid1, err := strconv.ParseUint(rsspConfig.NetAConfig.Sid1, 16, 32)
|
|
||||||
if err != nil {
|
|
||||||
panic(sys_error.New(fmt.Sprintf("%s集中站[%s]解析SID1[%s]出错", logTag, rsspConfig.StationCode, rsspConfig.NetAConfig.Sid1)))
|
|
||||||
}
|
|
||||||
sid2, err := strconv.ParseUint(rsspConfig.NetAConfig.Sid2, 16, 32)
|
|
||||||
if err != nil {
|
|
||||||
panic(sys_error.New(fmt.Sprintf("%s集中站[%s]解析SID2[%s]出错", logTag, rsspConfig.StationCode, rsspConfig.NetAConfig.Sid2)))
|
|
||||||
}
|
|
||||||
//服务初始化及启动
|
|
||||||
msgChan := make(chan []byte, 100)
|
msgChan := make(chan []byte, 100)
|
||||||
serviceCtx := &serviceContext{
|
serviceCtx.msgChan = msgChan
|
||||||
sim: simulation,
|
|
||||||
config: rsspConfig,
|
|
||||||
ciSectionIndexConfigs: ref.SectionCodePoints,
|
|
||||||
sourceAddr: uint16(sourceAddr),
|
|
||||||
targetAddr: uint16(targetAddr),
|
|
||||||
sid1: uint32(sid1),
|
|
||||||
sid2: uint32(sid2),
|
|
||||||
msgChan: msgChan,
|
|
||||||
}
|
|
||||||
netAConfig := rsspConfig.NetAConfig
|
netAConfig := rsspConfig.NetAConfig
|
||||||
server := udp.NewServer(fmt.Sprintf(":%d", netAConfig.LocalPort), func(b []byte) {
|
server := udp.NewServer(fmt.Sprintf(":%d", netAConfig.LocalPort), func(b []byte) {
|
||||||
|
logger().Info(fmt.Sprintf("收到数据:%x", b))
|
||||||
msgChan <- b
|
msgChan <- b
|
||||||
})
|
})
|
||||||
client := udp.NewClient(fmt.Sprintf("%s:%d", netAConfig.RemoteIp, netAConfig.RemotePort))
|
client := udp.NewClient(fmt.Sprintf("%s:%d", netAConfig.RemoteIp, netAConfig.RemotePort))
|
||||||
err = server.Listen()
|
err := server.Listen()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(sys_error.New(fmt.Sprintf("%s集中站[%s]服务启动失败", logTag, rsspConfig.StationCode)))
|
panic(sys_error.New(fmt.Sprintf("%s集中站[%s]服务启动失败", logTag, rsspConfig.StationCode)))
|
||||||
} else {
|
} else {
|
||||||
@ -121,6 +113,103 @@ func Start(simulation *memory.VerifySimulation) {
|
|||||||
contextMap[rsspConfig.StationCode] = serviceCtx
|
contextMap[rsspConfig.StationCode] = serviceCtx
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func initServiceContext(rsspConfig config.RsspAxleConfig, ref *proto.CentralizedStationRef, simulation *memory.VerifySimulation) *serviceContext {
|
||||||
|
sourceAddr, err := strconv.ParseUint(rsspConfig.NetAConfig.RemoteAddr, 16, 16)
|
||||||
|
if err != nil {
|
||||||
|
panic(sys_error.New(fmt.Sprintf("%s集中站[%s]解析源地址[%s]出错", logTag, rsspConfig.StationCode, rsspConfig.NetAConfig.RemoteAddr)))
|
||||||
|
}
|
||||||
|
targetAddr, err := strconv.ParseUint(rsspConfig.NetAConfig.LocalAddr, 16, 16)
|
||||||
|
if err != nil {
|
||||||
|
panic(sys_error.New(fmt.Sprintf("%s集中站[%s]解析目的地址[%s]出错", logTag, rsspConfig.StationCode, rsspConfig.NetAConfig.LocalAddr)))
|
||||||
|
}
|
||||||
|
remoteSid1, err := strconv.ParseUint(rsspConfig.NetAConfig.RemoteSid1, 16, 32)
|
||||||
|
if err != nil {
|
||||||
|
panic(sys_error.New(fmt.Sprintf("%s集中站[%s]解析联锁SID1[%s]出错", logTag, rsspConfig.StationCode, rsspConfig.NetAConfig.RemoteSid1)))
|
||||||
|
}
|
||||||
|
remoteSid2, err := strconv.ParseUint(rsspConfig.NetAConfig.RemoteSid2, 16, 32)
|
||||||
|
if err != nil {
|
||||||
|
panic(sys_error.New(fmt.Sprintf("%s集中站[%s]解析联锁SID2[%s]出错", logTag, rsspConfig.StationCode, rsspConfig.NetAConfig.RemoteSid2)))
|
||||||
|
}
|
||||||
|
localSid1, err := strconv.ParseUint(rsspConfig.NetAConfig.LocalSid1, 16, 32)
|
||||||
|
if err != nil {
|
||||||
|
panic(sys_error.New(fmt.Sprintf("%s集中站[%s]解析计轴SID1[%s]出错", logTag, rsspConfig.StationCode, rsspConfig.NetAConfig.LocalSid1)))
|
||||||
|
}
|
||||||
|
localSid2, err := strconv.ParseUint(rsspConfig.NetAConfig.LocalSid2, 16, 32)
|
||||||
|
if err != nil {
|
||||||
|
panic(sys_error.New(fmt.Sprintf("%s集中站[%s]解析计轴SID2[%s]出错", logTag, rsspConfig.StationCode, rsspConfig.NetAConfig.LocalSid2)))
|
||||||
|
}
|
||||||
|
remoteSinit1, err := strconv.ParseUint(rsspConfig.NetAConfig.RemoteSinit1, 16, 32)
|
||||||
|
if err != nil {
|
||||||
|
panic(sys_error.New(fmt.Sprintf("%s集中站[%s]解析联锁SINT1[%s]出错", logTag, rsspConfig.StationCode, rsspConfig.NetAConfig.RemoteSinit1)))
|
||||||
|
}
|
||||||
|
remoteSinit2, err := strconv.ParseUint(rsspConfig.NetAConfig.RemoteSinit2, 16, 32)
|
||||||
|
if err != nil {
|
||||||
|
panic(sys_error.New(fmt.Sprintf("%s集中站[%s]解析联锁SINT2[%s]出错", logTag, rsspConfig.StationCode, rsspConfig.NetAConfig.RemoteSinit2)))
|
||||||
|
}
|
||||||
|
localSinit1, err := strconv.ParseUint(rsspConfig.NetAConfig.LocalSinit1, 16, 32)
|
||||||
|
if err != nil {
|
||||||
|
panic(sys_error.New(fmt.Sprintf("%s集中站[%s]解析计轴SINT1[%s]出错", logTag, rsspConfig.StationCode, rsspConfig.NetAConfig.LocalSinit1)))
|
||||||
|
}
|
||||||
|
localSinit2, err := strconv.ParseUint(rsspConfig.NetAConfig.LocalSinit2, 16, 32)
|
||||||
|
if err != nil {
|
||||||
|
panic(sys_error.New(fmt.Sprintf("%s集中站[%s]解析计轴SINT2[%s]出错", logTag, rsspConfig.StationCode, rsspConfig.NetAConfig.LocalSinit2)))
|
||||||
|
}
|
||||||
|
remoteDataVer1, err := strconv.ParseUint(rsspConfig.NetAConfig.RemoteDataVer1, 16, 32)
|
||||||
|
if err != nil {
|
||||||
|
panic(sys_error.New(fmt.Sprintf("%s集中站[%s]解析联锁DATAVER_1[%s]出错", logTag, rsspConfig.StationCode, rsspConfig.NetAConfig.RemoteDataVer1)))
|
||||||
|
}
|
||||||
|
remoteDataVer2, err := strconv.ParseUint(rsspConfig.NetAConfig.RemoteDataVer2, 16, 32)
|
||||||
|
if err != nil {
|
||||||
|
panic(sys_error.New(fmt.Sprintf("%s集中站[%s]解析联锁DATAVER_2[%s]出错", logTag, rsspConfig.StationCode, rsspConfig.NetAConfig.RemoteDataVer2)))
|
||||||
|
}
|
||||||
|
localDataVer1, err := strconv.ParseUint(rsspConfig.NetAConfig.LocalDataVer1, 16, 32)
|
||||||
|
if err != nil {
|
||||||
|
panic(sys_error.New(fmt.Sprintf("%s集中站[%s]解析计轴DATAVER_1[%s]出错", logTag, rsspConfig.StationCode, rsspConfig.NetAConfig.LocalDataVer1)))
|
||||||
|
}
|
||||||
|
localDataVer2, err := strconv.ParseUint(rsspConfig.NetAConfig.LocalDataVer2, 16, 32)
|
||||||
|
if err != nil {
|
||||||
|
panic(sys_error.New(fmt.Sprintf("%s集中站[%s]解析计轴DATAVER_2[%s]出错", logTag, rsspConfig.StationCode, rsspConfig.NetAConfig.LocalDataVer2)))
|
||||||
|
}
|
||||||
|
//服务初始化及启动
|
||||||
|
serviceCtx := &serviceContext{
|
||||||
|
sim: simulation,
|
||||||
|
config: rsspConfig,
|
||||||
|
ciSectionIndexConfigs: ref.SectionCodePoints,
|
||||||
|
remoteAddr: uint16(sourceAddr),
|
||||||
|
localAddr: uint16(targetAddr),
|
||||||
|
|
||||||
|
remoteSid1: uint32(remoteSid1),
|
||||||
|
remoteSid2: uint32(remoteSid2),
|
||||||
|
localSid1: uint32(localSid1),
|
||||||
|
localSid2: uint32(localSid2),
|
||||||
|
|
||||||
|
remoteSinit1: uint32(remoteSinit1),
|
||||||
|
remoteSinit2: uint32(remoteSinit2),
|
||||||
|
localSinit1: uint32(localSinit1),
|
||||||
|
localSinit2: uint32(localSinit2),
|
||||||
|
|
||||||
|
remoteDataVer1: uint32(remoteDataVer1),
|
||||||
|
remoteDataVer2: uint32(remoteDataVer2),
|
||||||
|
localDataVer1: uint32(localDataVer1),
|
||||||
|
localDataVer2: uint32(localDataVer2),
|
||||||
|
|
||||||
|
lfsr1: &lfsr{value: uint32(localSid1), poly: msg.T_POLY_1},
|
||||||
|
lfsr2: &lfsr{value: uint32(localSid2), poly: msg.T_POLY_2},
|
||||||
|
|
||||||
|
precSinit1: calculatePrecSinit(uint32(remoteSinit1), uint32(localSid1), uint32(remoteDataVer1)),
|
||||||
|
precSinit2: calculatePrecSinit(uint32(remoteSinit2), uint32(localSid2), uint32(remoteDataVer2)),
|
||||||
|
}
|
||||||
|
return serviceCtx
|
||||||
|
}
|
||||||
|
|
||||||
|
func calculatePrecSinit(remoteSinit uint32, localSid uint32, remoteDataVer uint32) uint32 {
|
||||||
|
l1 := lfsr{value: remoteSinit, poly: msg.T_POLY_1}
|
||||||
|
l1.add(localSid ^ remoteDataVer)
|
||||||
|
valueTmp := l1.value
|
||||||
|
l1.load(0).post(valueTmp)
|
||||||
|
return l1.value
|
||||||
|
}
|
||||||
|
|
||||||
func Stop(simulation *memory.VerifySimulation) {
|
func Stop(simulation *memory.VerifySimulation) {
|
||||||
mu.Lock()
|
mu.Lock()
|
||||||
defer mu.Unlock()
|
defer mu.Unlock()
|
||||||
@ -151,15 +240,18 @@ func (s *serviceContext) runCollectTask(ctx context.Context) {
|
|||||||
s.runCollectTask(ctx)
|
s.runCollectTask(ctx)
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
for range time.Tick(time.Millisecond * time.Duration(s.config.NetAConfig.Period)) {
|
for range time.Tick(time.Duration(s.config.NetAConfig.Period) * time.Millisecond) {
|
||||||
select {
|
select {
|
||||||
case <-ctx.Done():
|
case <-ctx.Done():
|
||||||
return
|
return
|
||||||
default:
|
default:
|
||||||
frame := s.collect()
|
frame := s.collect()
|
||||||
err := s.client.Send(frame.Encode())
|
data := frame.Encode()
|
||||||
|
err := s.client.Send(data)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger().Error("发送状态数据失败", "error", err)
|
logger().Error("发送状态数据失败", "error", err)
|
||||||
|
} else {
|
||||||
|
logger().Info(fmt.Sprintf("发送数据:%x", data))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -186,29 +278,34 @@ func (s *serviceContext) collect() *msg.RsdMsgBuilder {
|
|||||||
RJT: sectionRuntime.Rjt,
|
RJT: sectionRuntime.Rjt,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
userData := stateInfos.Encode()
|
userData := []byte{0x00} //检查字节
|
||||||
|
userData = append(userData, stateInfos.Encode()...)
|
||||||
|
//更新序列号及时间戳
|
||||||
|
s.seqNum++
|
||||||
|
s.lfsr1.add(0)
|
||||||
|
s.lfsr2.add(0)
|
||||||
|
//构建消息
|
||||||
builder := &msg.RsdMsgBuilder{
|
builder := &msg.RsdMsgBuilder{
|
||||||
MsgHeader: msg.MsgHeader{
|
MsgHeader: msg.MsgHeader{
|
||||||
ProtocolType: msg.ProtocolType_Sync,
|
ProtocolType: msg.ProtocolType_Sync,
|
||||||
MessageType: msg.MessageType_A,
|
MessageType: msg.MessageType_B, //从抓包数据里看到的
|
||||||
SourceAddr: s.sourceAddr,
|
SourceAddr: s.localAddr,
|
||||||
TargetAddr: s.targetAddr,
|
TargetAddr: s.remoteAddr,
|
||||||
},
|
},
|
||||||
SeqNum: s.seqNum,
|
SeqNum: s.seqNum,
|
||||||
Svc1: s.calculateSvc1(userData, s.seqNum),
|
Svc1: s.calculateSvc1(userData),
|
||||||
Svc2: s.calculateSvc2(userData, s.seqNum),
|
Svc2: s.calculateSvc2(userData),
|
||||||
UserData: userData,
|
UserData: userData,
|
||||||
}
|
}
|
||||||
s.seqNum++
|
|
||||||
return builder
|
return builder
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *serviceContext) calculateSvc1(userData []byte, seqNum uint32) uint32 {
|
func (s *serviceContext) calculateSvc1(userData []byte) uint32 {
|
||||||
return 0
|
return message.Rssp_I_Crc32C1(userData) ^ s.localSid1 ^ s.lfsr1.value ^ msg.SCW_1
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *serviceContext) calculateSvc2(userData []byte, seqNum uint32) uint32 {
|
func (s *serviceContext) calculateSvc2(userData []byte) uint32 {
|
||||||
return 0
|
return message.Rssp_I_Crc32C2(userData) ^ s.localSid2 ^ s.lfsr2.value ^ msg.SCW_2
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *serviceContext) runHandleMsgTask(ctx context.Context) {
|
func (s *serviceContext) runHandleMsgTask(ctx context.Context) {
|
||||||
@ -243,7 +340,7 @@ func (s *serviceContext) runHandleMsgTask(ctx context.Context) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (s *serviceContext) handleRsdMsg(data []byte) {
|
func (s *serviceContext) handleRsdMsg(data []byte) {
|
||||||
if s.sseMsg == nil { //正在时序校正过程中
|
if s.sseMsg != nil { //正在时序校正过程中
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
rsdMsg := &msg.RsdMsg{}
|
rsdMsg := &msg.RsdMsg{}
|
||||||
@ -253,20 +350,18 @@ func (s *serviceContext) handleRsdMsg(data []byte) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
//校验
|
//校验
|
||||||
if !s.validateRsdMsg(rsdMsg) {
|
validateResult := s.validateRsdMsg(rsdMsg, data)
|
||||||
|
if validateResult == 0 {
|
||||||
return
|
return
|
||||||
}
|
} else if validateResult == 2 {
|
||||||
//流程处理
|
//开启时序校正流程
|
||||||
seqDeviation := rsdMsg.SeqNum - s.lastSeqNum
|
logger().Error("时序校验失败,开始时序校正")
|
||||||
if s.lastSeqNum == 0 {
|
|
||||||
seqDeviation = 0
|
|
||||||
} else if seqDeviation < 0 || seqDeviation > s.config.NetAConfig.MaxDeviation { //序列号减小或时序差超出容忍限度
|
|
||||||
s.startSeeProgress()
|
s.startSeeProgress()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
s.lastSeqNum = rsdMsg.SeqNum
|
//流程处理
|
||||||
cmdInfos := msg.CmdInfos{}
|
cmdInfos := msg.CmdInfos{}
|
||||||
err = cmdInfos.Decode(rsdMsg.UserData)
|
err = cmdInfos.Decode(rsdMsg.UserData[1:]) //用户数据第一个字节是[检查字节]
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger().Error("解析命令信息出错", "error", err)
|
logger().Error("解析命令信息出错", "error", err)
|
||||||
return
|
return
|
||||||
@ -294,31 +389,39 @@ func (s *serviceContext) handleSseMsg(data []byte) {
|
|||||||
}
|
}
|
||||||
//校验
|
//校验
|
||||||
if !s.validateSseMsg(sseMsg) {
|
if !s.validateSseMsg(sseMsg) {
|
||||||
|
logger().Error("SSE数据校验失败")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
logger().Info(fmt.Sprintf("SSE数据通过校验:%x", data))
|
||||||
//回复
|
//回复
|
||||||
s.lastSeqNum = sseMsg.SeqNum
|
|
||||||
ssrMsg := msg.SsrMsg{
|
ssrMsg := msg.SsrMsg{
|
||||||
MsgHeader: msg.MsgHeader{
|
MsgHeader: msg.MsgHeader{
|
||||||
ProtocolType: msg.ProtocolType_Sync,
|
ProtocolType: msg.ProtocolType_Sync,
|
||||||
MessageType: msg.MessageType_SSR,
|
MessageType: msg.MessageType_SSR,
|
||||||
SourceAddr: s.sourceAddr,
|
SourceAddr: s.localAddr,
|
||||||
TargetAddr: s.targetAddr,
|
TargetAddr: s.remoteAddr,
|
||||||
},
|
},
|
||||||
SeqNumSsr: s.seqNum,
|
SeqNumSsr: s.seqNum,
|
||||||
SeqNumSse: sseMsg.SeqNum,
|
SeqNumSse: sseMsg.SeqNum,
|
||||||
SeqInit1: s.calculateSeqInit1(sseMsg.SeqEnq1),
|
SeqInit1: s.calculateSeqInit1(sseMsg.SeqEnq1),
|
||||||
SeqInit2: s.calculateSeqInit1(sseMsg.SeqEnq1),
|
SeqInit2: s.calculateSeqInit2(sseMsg.SeqEnq2),
|
||||||
DataVer: 0x01,
|
DataVer: 0x01,
|
||||||
}
|
}
|
||||||
err = s.client.Send(ssrMsg.Encode())
|
ssrBytes := ssrMsg.Encode()
|
||||||
|
err = s.client.Send(ssrBytes)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger().Error("发送SSR数据失败", "error", err)
|
logger().Error("发送SSR数据失败", "error", err)
|
||||||
|
} else {
|
||||||
|
logger().Info(fmt.Sprintf("发送SSR数据:%x", ssrBytes))
|
||||||
|
//更新本地数据
|
||||||
|
s.lastSeqParam1 = (&lfsr{value: s.remoteSinit1, poly: msg.T_POLY_1}).add(sseMsg.SeqEnq1)
|
||||||
|
s.lastSeqParam2 = (&lfsr{value: s.remoteSinit2, poly: msg.T_POLY_2}).add(sseMsg.SeqEnq2)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *serviceContext) handleSsrMsg(data []byte) {
|
func (s *serviceContext) handleSsrMsg(data []byte) {
|
||||||
if s.sseMsg == nil { //不在时序校正过程中
|
if s.sseMsg == nil { //不在时序校正过程中
|
||||||
|
logger().Warn("不在时序校正流程中,丢弃SSR数据")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
ssrMsg := &msg.SsrMsg{}
|
ssrMsg := &msg.SsrMsg{}
|
||||||
@ -329,11 +432,14 @@ func (s *serviceContext) handleSsrMsg(data []byte) {
|
|||||||
}
|
}
|
||||||
//校验
|
//校验
|
||||||
if !s.validateSsrMsg(ssrMsg) {
|
if !s.validateSsrMsg(ssrMsg) {
|
||||||
|
logger().Error("SSR数据校验失败")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
//完成校正时序
|
logger().Info("SSR数据通过校验")
|
||||||
|
//完成校正时序(precSinit~+t_e == Sinit_r~+(sid_r^t_r))
|
||||||
|
s.lastSeqParam1 = (&lfsr{value: s.precSinit1, poly: msg.T_POLY_1}).add(ssrMsg.SeqInit1 ^ (s.sseMsg.SeqEnq1 ^ s.localSid1))
|
||||||
|
s.lastSeqParam2 = (&lfsr{value: s.precSinit2, poly: msg.T_POLY_2}).add(ssrMsg.SeqInit2 ^ (s.sseMsg.SeqEnq2 ^ s.localSid2))
|
||||||
s.sseMsg = nil
|
s.sseMsg = nil
|
||||||
s.lastSeqNum = ssrMsg.SeqNumSsr
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 启动SSE流程
|
// 启动SSE流程
|
||||||
@ -342,42 +448,52 @@ func (s *serviceContext) startSeeProgress() {
|
|||||||
MsgHeader: msg.MsgHeader{
|
MsgHeader: msg.MsgHeader{
|
||||||
ProtocolType: msg.ProtocolType_Sync,
|
ProtocolType: msg.ProtocolType_Sync,
|
||||||
MessageType: msg.MessageType_SSE,
|
MessageType: msg.MessageType_SSE,
|
||||||
SourceAddr: s.sourceAddr,
|
SourceAddr: s.localAddr,
|
||||||
TargetAddr: s.targetAddr,
|
TargetAddr: s.remoteAddr,
|
||||||
},
|
},
|
||||||
SeqNum: s.seqNum,
|
SeqNum: s.seqNum,
|
||||||
SeqEnq1: s.calculateSeqEnq1(),
|
SeqEnq1: s.calculateSeqEnq1(),
|
||||||
SeqEnq2: s.calculateSeqEnq2(),
|
SeqEnq2: s.calculateSeqEnq2(),
|
||||||
}
|
}
|
||||||
err := s.client.Send(sseMsg.Encode())
|
sseBytes := sseMsg.Encode()
|
||||||
|
err := s.client.Send(sseBytes)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger().Error("发送SSE数据失败", "error", err)
|
logger().Error("发送SSE数据失败", "error", err)
|
||||||
} else {
|
} else {
|
||||||
|
logger().Info(fmt.Sprintf("发送SSE数据:%x", sseBytes))
|
||||||
s.sseMsg = sseMsg
|
s.sseMsg = sseMsg
|
||||||
s.sseWaitTimer = time.After(time.Duration(s.config.NetAConfig.Period*msg.Twait_sse) * time.Millisecond)
|
s.sseWaitTimer = time.After(time.Duration(s.config.NetAConfig.Period*msg.Twait_sse) * time.Millisecond)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *serviceContext) validateRsdMsg(rsdMsg *msg.RsdMsg) bool {
|
// 校验RSD消息
|
||||||
sourceAddr, _ := strconv.ParseUint(s.config.NetAConfig.SourceAddr, 16, 16)
|
// return 0-时序校验之外的失败 1-成功 2-时序异常
|
||||||
if rsdMsg.SourceAddr != uint16(sourceAddr) {
|
func (s *serviceContext) validateRsdMsg(rsdMsg *msg.RsdMsg, data []byte) int {
|
||||||
logger().Error(fmt.Sprintf("源地址[%x]不正确[%s]", rsdMsg.SourceAddr, s.config.NetAConfig.SourceAddr))
|
if rsdMsg.SourceAddr != s.remoteAddr {
|
||||||
return false
|
logger().Error(fmt.Sprintf("源地址[%x]不正确[%s]", rsdMsg.SourceAddr, s.config.NetAConfig.RemoteAddr))
|
||||||
|
return 0
|
||||||
}
|
}
|
||||||
targetAddr, _ := strconv.ParseUint(s.config.NetAConfig.TargetAddr, 16, 16)
|
if rsdMsg.TargetAddr != s.localAddr {
|
||||||
if rsdMsg.TargetAddr != uint16(targetAddr) {
|
logger().Error(fmt.Sprintf("目的地址[%x]不正确[%s]", rsdMsg.TargetAddr, s.config.NetAConfig.LocalAddr))
|
||||||
logger().Error(fmt.Sprintf("目的地址[%x]不正确[%s]", rsdMsg.TargetAddr, s.config.NetAConfig.TargetAddr))
|
return 0
|
||||||
return false
|
|
||||||
}
|
}
|
||||||
if len(rsdMsg.UserData) != len(s.ciSectionIndexConfigs) {
|
if len(rsdMsg.UserData)-1 != len(s.ciSectionIndexConfigs) { //用户数据第一个字节是[检查字节]
|
||||||
logger().Error(fmt.Sprintf("用户数据长度[%d]与配置长度[%d]不符", len(rsdMsg.UserData), len(s.ciSectionIndexConfigs)))
|
logger().Error(fmt.Sprintf("命令数据长度[%d]与配置长度[%d]不符", len(rsdMsg.UserData), len(s.ciSectionIndexConfigs)))
|
||||||
return false
|
return 0
|
||||||
}
|
}
|
||||||
if message.Rssp_I_Crc16(rsdMsg.UserData) != rsdMsg.Tail {
|
if message.Rssp_I_Crc16(data[:len(data)-2]) != rsdMsg.Tail {
|
||||||
logger().Error(fmt.Sprintf("报文位验证失败"))
|
logger().Error(fmt.Sprintf("报文尾验证失败"))
|
||||||
return false
|
return 0
|
||||||
}
|
}
|
||||||
return true
|
if !s.validateSvc1(rsdMsg.Svc1, rsdMsg.UserData) {
|
||||||
|
logger().Error(fmt.Sprintf("SVC1[%x]校验未通过", rsdMsg.Svc1))
|
||||||
|
return 2
|
||||||
|
}
|
||||||
|
if !s.validateSvc2(rsdMsg.Svc2, rsdMsg.UserData) {
|
||||||
|
logger().Error(fmt.Sprintf("SVC2[%x]校验未通过", rsdMsg.Svc2))
|
||||||
|
return 2
|
||||||
|
}
|
||||||
|
return 1
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *serviceContext) validateSseMsg(sseMsg *msg.SseMsg) bool {
|
func (s *serviceContext) validateSseMsg(sseMsg *msg.SseMsg) bool {
|
||||||
@ -386,26 +502,92 @@ func (s *serviceContext) validateSseMsg(sseMsg *msg.SseMsg) bool {
|
|||||||
|
|
||||||
func (s *serviceContext) validateSsrMsg(ssrMsg *msg.SsrMsg) bool {
|
func (s *serviceContext) validateSsrMsg(ssrMsg *msg.SsrMsg) bool {
|
||||||
if s.sseMsg.SeqNum != ssrMsg.SeqNumSse {
|
if s.sseMsg.SeqNum != ssrMsg.SeqNumSse {
|
||||||
logger().Error(fmt.Sprintf("SSR的Ne[%d]与请求方不符[%d]", ssrMsg.SeqNumSse, s.sseMsg.SeqNum))
|
logger().Error(fmt.Sprintf("SSR的时序号[%d]与请求方不符[%d]", ssrMsg.SeqNumSse, s.sseMsg.SeqNum))
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *serviceContext) validateSvc1(svc uint32, userData []byte) bool {
|
||||||
|
return s.validateSvc(svc, msg.SCW_1, message.Rssp_I_Crc32C1(userData), s.remoteSid1, s.remoteSinit1, &s.lastSeqParam1, msg.T_POLY_1)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *serviceContext) validateSvc2(svc uint32, userData []byte) bool {
|
||||||
|
return s.validateSvc(svc, msg.SCW_2, message.Rssp_I_Crc32C2(userData), s.remoteSid2, s.remoteSinit2, &s.lastSeqParam2, msg.T_POLY_2)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *serviceContext) validateSvc(svc uint32, scw uint32, crc1 uint32, sid uint32, sinit uint32, lastSeqParam *uint32, tPoly uint32) bool {
|
||||||
|
seqParam := crc1 ^ svc ^ scw
|
||||||
|
for i := 0; i <= s.config.NetAConfig.MaxDeviation; i++ {
|
||||||
|
seqLfsr := lfsr{value: *lastSeqParam, poly: tPoly}
|
||||||
|
constLfsr := lfsr{value: sinit, poly: tPoly}
|
||||||
|
constLfsr.add(sid)
|
||||||
|
for j := 0; j < i; j++ {
|
||||||
|
seqLfsr.add(0)
|
||||||
|
constLfsr.add(0)
|
||||||
|
}
|
||||||
|
if seqLfsr.add(seqParam) == constLfsr.add(sid) {
|
||||||
|
*lastSeqParam = seqLfsr.load(sinit).add(seqParam)
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
func (s *serviceContext) calculateSeqEnq1() uint32 {
|
func (s *serviceContext) calculateSeqEnq1() uint32 {
|
||||||
return 0
|
return s.localSid1 ^ s.lfsr1.value
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *serviceContext) calculateSeqEnq2() uint32 {
|
func (s *serviceContext) calculateSeqEnq2() uint32 {
|
||||||
return 0
|
return s.localSid2 ^ s.lfsr2.value
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *serviceContext) calculateSeqInit1(seqEnq1 uint32) uint32 {
|
func (s *serviceContext) calculateSeqInit1(seqEnq1 uint32) uint32 {
|
||||||
return 0
|
return seqEnq1 ^ s.localSid1 ^ s.localDataVer1 ^ s.lfsr1.value
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *serviceContext) calculateSeqInit2(seqEnq2 uint32) uint32 {
|
func (s *serviceContext) calculateSeqInit2(seqEnq2 uint32) uint32 {
|
||||||
return 0
|
return seqEnq2 ^ s.localSid2 ^ s.localDataVer2 ^ s.lfsr2.value
|
||||||
|
}
|
||||||
|
|
||||||
|
type lfsr struct {
|
||||||
|
value uint32
|
||||||
|
poly uint32 //时间戳生成多项式
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *lfsr) load(value uint32) *lfsr {
|
||||||
|
l.value = value
|
||||||
|
return l
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *lfsr) add(x uint32) uint32 {
|
||||||
|
l.value = l.value ^ x
|
||||||
|
var carry bool
|
||||||
|
for i := 0; i < 32; i++ {
|
||||||
|
carry = l.value&0x80000000 != 0
|
||||||
|
l.value = l.value << 1
|
||||||
|
if carry {
|
||||||
|
l.value ^= l.poly
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return l.value
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *lfsr) post(x uint32) uint32 {
|
||||||
|
|
||||||
|
var carry bool
|
||||||
|
for i := 0; i < 32; i++ {
|
||||||
|
carry = x&1 == 1
|
||||||
|
if carry {
|
||||||
|
x ^= l.poly
|
||||||
|
}
|
||||||
|
x = x >> 1
|
||||||
|
if carry {
|
||||||
|
x |= 0x80000000
|
||||||
|
}
|
||||||
|
}
|
||||||
|
l.value ^= x
|
||||||
|
return l.value
|
||||||
}
|
}
|
||||||
|
|
||||||
func logger() *slog.Logger {
|
func logger() *slog.Logger {
|
||||||
|
19
third_party/axle_device/beijing12/service_test.go
vendored
Normal file
19
third_party/axle_device/beijing12/service_test.go
vendored
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
package beijing12
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"joylink.club/bj-rtsts-server/third_party/axle_device/beijing12/msg"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func Test_serviceContext_calculateSvc1(t *testing.T) {
|
||||||
|
serviceCtx := &serviceContext{
|
||||||
|
localSid1: 0x7665986c,
|
||||||
|
localSid2: 0x67da286e,
|
||||||
|
lfsr1: &lfsr{value: uint32(0x7665986c), poly: msg.T_POLY_1},
|
||||||
|
lfsr2: &lfsr{value: uint32(0x67da286e), poly: msg.T_POLY_2},
|
||||||
|
}
|
||||||
|
userData := []byte{00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00}
|
||||||
|
fmt.Printf("%x\n", serviceCtx.calculateSvc1(userData))
|
||||||
|
fmt.Printf("%x\n", serviceCtx.calculateSvc2(userData))
|
||||||
|
}
|
10
third_party/dynamics/dynamics.go
vendored
10
third_party/dynamics/dynamics.go
vendored
@ -93,10 +93,18 @@ func (d *dynamics) updateState(state tpapi.ThirdPartyApiServiceState) {
|
|||||||
func (d *dynamics) State() tpapi.ThirdPartyApiServiceState {
|
func (d *dynamics) State() tpapi.ThirdPartyApiServiceState {
|
||||||
return d.state
|
return d.state
|
||||||
}
|
}
|
||||||
|
func (d *dynamics) FindAppendApiService() []tpapi.ThirdPartyApiService {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
func (d *dynamics) Name() string {
|
func (d *dynamics) Name() string {
|
||||||
return Name
|
return Name
|
||||||
}
|
}
|
||||||
|
func (d *dynamics) TrueService() bool {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
func (d *dynamics) ServiceDesc() string {
|
||||||
|
return Name
|
||||||
|
}
|
||||||
|
|
||||||
// 解码列车信息并处理
|
// 解码列车信息并处理
|
||||||
func (d *dynamics) handleDynamicsTrainInfo(b []byte) {
|
func (d *dynamics) handleDynamicsTrainInfo(b []byte) {
|
||||||
|
82
third_party/example/rssp/main.go
vendored
82
third_party/example/rssp/main.go
vendored
@ -1,82 +0,0 @@
|
|||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"joylink.club/bj-rtsts-server/third_party/message"
|
|
||||||
)
|
|
||||||
|
|
||||||
//func main() {
|
|
||||||
// var scw1 uint32 = 0xAE390B5A
|
|
||||||
// var t_p uint32 = 0x0FC22F87
|
|
||||||
// var sid1 uint32 = 0xa2bcfc8c
|
|
||||||
// var sinit uint32 = 0xb763ec88
|
|
||||||
//
|
|
||||||
// var svcn_1 uint32 = 0x08b12b3b
|
|
||||||
// //var svcn_1 uint32 = 0x3b2bb108
|
|
||||||
// var svcn uint32 = 0x547fd6ca
|
|
||||||
// //var svcn uint32 = 0xcad67f54
|
|
||||||
// var userData []byte = []byte{0x80, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00}
|
|
||||||
// crc1 := crc32Encode(userData)
|
|
||||||
//
|
|
||||||
// m := func(svc1 uint32) uint32 {
|
|
||||||
// return (svc1 ^ crc1) ^ scw1
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// rn_1 := m(svcn_1)
|
|
||||||
// rn := m(svcn)
|
|
||||||
// l1 := &Lfsr{
|
|
||||||
// value: sinit,
|
|
||||||
// p: t_p,
|
|
||||||
// }
|
|
||||||
// //l1.add(sid1)
|
|
||||||
// l1.add(rn_1)
|
|
||||||
// l1.add(rn)
|
|
||||||
// fmt.Printf("%x\n", l1.value)
|
|
||||||
//
|
|
||||||
// //sinit~<sid1~<sid1
|
|
||||||
// l2 := &Lfsr{
|
|
||||||
// value: sinit,
|
|
||||||
// p: t_p,
|
|
||||||
// }
|
|
||||||
// //l2.add(sid1)
|
|
||||||
// l2.add(sid1)
|
|
||||||
// l2.add(sid1)
|
|
||||||
// fmt.Printf("%x", l2.value)
|
|
||||||
//}
|
|
||||||
|
|
||||||
func main() {
|
|
||||||
var scw uint32 = 0xAE390B5A
|
|
||||||
var t_p uint32 = 0x0FC22F87
|
|
||||||
var sid uint32 = 0xa2bcfc8c
|
|
||||||
//var sinit uint32 = 0xb763ec88
|
|
||||||
|
|
||||||
lfsr := Lfsr{
|
|
||||||
value: sid,
|
|
||||||
p: t_p,
|
|
||||||
}
|
|
||||||
lfsr.add(1)
|
|
||||||
var userData []byte = []byte{0x80, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00}
|
|
||||||
crc1 := crc32Encode(userData)
|
|
||||||
svc := crc1 ^ sid ^ lfsr.value ^ scw
|
|
||||||
fmt.Printf("%x\n", svc)
|
|
||||||
}
|
|
||||||
|
|
||||||
func crc32Encode(data []byte) uint32 {
|
|
||||||
return message.Rssp_I_Crc32C1(data)
|
|
||||||
}
|
|
||||||
|
|
||||||
type Lfsr struct {
|
|
||||||
value uint32
|
|
||||||
p uint32
|
|
||||||
}
|
|
||||||
|
|
||||||
func (l *Lfsr) add(x uint32) uint32 {
|
|
||||||
l.value = l.value ^ x
|
|
||||||
for i := 0; i < 1; i++ {
|
|
||||||
l.value = l.value << 1
|
|
||||||
if l.value>>31 == 1 {
|
|
||||||
l.value ^= l.p
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return l.value
|
|
||||||
}
|
|
12
third_party/message/can_btm_data.go
vendored
12
third_party/message/can_btm_data.go
vendored
@ -66,6 +66,12 @@ type BtmDataMessageTimeAFrame struct {
|
|||||||
IsTrainPcSim bool
|
IsTrainPcSim bool
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func NewBtmDataMessageTimeAFrame2(sn byte, isTrainPcSim bool) *BtmDataMessageTimeAFrame {
|
||||||
|
return &BtmDataMessageTimeAFrame{
|
||||||
|
FId: *NewCanFrameId(CAN_ADDR_RSP_ATP, CAN_ADDR_RSP_BTM, 0x80+0x0e, sn),
|
||||||
|
IsTrainPcSim: isTrainPcSim,
|
||||||
|
}
|
||||||
|
}
|
||||||
func NewBtmDataMessageTimeAFrame(sn byte, isTrainPcSim bool) *BtmDataMessageTimeAFrame {
|
func NewBtmDataMessageTimeAFrame(sn byte, isTrainPcSim bool) *BtmDataMessageTimeAFrame {
|
||||||
return &BtmDataMessageTimeAFrame{
|
return &BtmDataMessageTimeAFrame{
|
||||||
FId: *NewCanFrameId(CAN_ADDR_RSP_ATP, CAN_ADDR_RSP_BTM, 0x80+0x0d, sn),
|
FId: *NewCanFrameId(CAN_ADDR_RSP_ATP, CAN_ADDR_RSP_BTM, 0x80+0x0d, sn),
|
||||||
@ -276,6 +282,12 @@ type BtmDataMessageEndFrame struct {
|
|||||||
IsTrainPcSim bool
|
IsTrainPcSim bool
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func NewBtmDataMessageEndFrame2(sn byte, isTrainPcSim bool) *BtmDataMessageEndFrame {
|
||||||
|
return &BtmDataMessageEndFrame{
|
||||||
|
FId: *NewCanFrameId(CAN_ADDR_RSP_ATP, CAN_ADDR_RSP_BTM, 0xff, sn),
|
||||||
|
IsTrainPcSim: isTrainPcSim,
|
||||||
|
}
|
||||||
|
}
|
||||||
func NewBtmDataMessageEndFrame(sn byte, isTrainPcSim bool) *BtmDataMessageEndFrame {
|
func NewBtmDataMessageEndFrame(sn byte, isTrainPcSim bool) *BtmDataMessageEndFrame {
|
||||||
return &BtmDataMessageEndFrame{
|
return &BtmDataMessageEndFrame{
|
||||||
FId: *NewCanFrameId(CAN_ADDR_RSP_ATP, CAN_ADDR_RSP_BTM, 0x80+0x7f, sn),
|
FId: *NewCanFrameId(CAN_ADDR_RSP_ATP, CAN_ADDR_RSP_BTM, 0x80+0x7f, sn),
|
||||||
|
95
third_party/message/can_btm_rsp.go
vendored
95
third_party/message/can_btm_rsp.go
vendored
@ -2,6 +2,101 @@ package message
|
|||||||
|
|
||||||
import "log/slog"
|
import "log/slog"
|
||||||
|
|
||||||
|
func CreateBtmRspFramesData2(statusRsp *BtmStatusRspFrame, msg []byte, msgPackError bool, msgTimeA uint32, msgTimeB uint32, tkTimeB uint32, isTrainPcSim bool) ([]byte, bool) {
|
||||||
|
/* if len(msg) > 104 { //数据帧最多存储13*8个字节
|
||||||
|
return nil, false
|
||||||
|
}*/
|
||||||
|
//最近一次ATP查询请求序列号
|
||||||
|
sn := statusRsp.FId.ID4
|
||||||
|
//13个BtmDataMessageFrame [0x00,0x0c]
|
||||||
|
//数据
|
||||||
|
dms := make([]*BtmDataMessageFrame, 13)
|
||||||
|
for mr := 0x00; mr <= 0x0c; mr++ {
|
||||||
|
dms[mr] = NewBtmDataMessageFrame(sn, byte(mr), isTrainPcSim)
|
||||||
|
dms[mr].Message = make([]byte, 8) //8字节数组,默认值0
|
||||||
|
//
|
||||||
|
if !msgPackError {
|
||||||
|
mi := mr * 8
|
||||||
|
if mi < len(msg) { //数据帧中有<=8个字节数据
|
||||||
|
if mi+7 < len(msg) {
|
||||||
|
dms[mr].Message = msg[mi : mi+8]
|
||||||
|
} else {
|
||||||
|
for i, d := range msg[mi:] {
|
||||||
|
dms[mr].Message[i] = d
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else { //BTM解包发生错误,则数据帧及CRC32A/B全填“0xFF”
|
||||||
|
for c := 0; c < 8; c++ {
|
||||||
|
dms[mr].Message[c] = 0xff
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//
|
||||||
|
dtA := NewBtmDataMessageTimeAFrame(sn, isTrainPcSim)
|
||||||
|
dtA.TimeA = msgTimeA
|
||||||
|
if !msgPackError {
|
||||||
|
var crc32AData []byte
|
||||||
|
crc32AData = append(crc32AData, msg...)
|
||||||
|
crc32AData = append(crc32AData, canTimeToBytes(dtA.TimeA)...)
|
||||||
|
dtA.Crc32A = Can_Crc32(crc32AData) //CRC32A的校验范围是:报文+时间戳A
|
||||||
|
} else { //BTM解包发生错误,则数据帧及CRC32A/B全填“0xFF”
|
||||||
|
dtA.Crc32A = 0xff_ff_ff_ff
|
||||||
|
}
|
||||||
|
//
|
||||||
|
dtB := NewBtmDataMessageTimeBFrame(sn, isTrainPcSim)
|
||||||
|
dtB.TimeB = msgTimeB
|
||||||
|
if !msgPackError {
|
||||||
|
var crc32BData []byte
|
||||||
|
crc32BData = append(crc32BData, msg...)
|
||||||
|
crc32BData = append(crc32BData, canTimeToBytes(dtB.TimeB)...)
|
||||||
|
dtB.Crc32B = Can_Crc32(crc32BData) //CRC32B的校验范围是:报文+时间戳B
|
||||||
|
} else { //BTM解包发生错误,则数据帧及CRC32A/B全填“0xFF”
|
||||||
|
dtB.Crc32B = 0xff_ff_ff_ff
|
||||||
|
}
|
||||||
|
//
|
||||||
|
end := NewBtmDataMessageEndFrame(sn, isTrainPcSim)
|
||||||
|
end.TkB = tkTimeB
|
||||||
|
//
|
||||||
|
statusCf := statusRsp.Encode()
|
||||||
|
dmsCfs := make([]*CanetFrame, 0, 13)
|
||||||
|
for _, dm := range dms {
|
||||||
|
dmsCfs = append(dmsCfs, dm.Encode())
|
||||||
|
}
|
||||||
|
dtACf := dtA.Encode()
|
||||||
|
dtBCf := dtB.Encode()
|
||||||
|
//
|
||||||
|
crc32cData := make([]byte, 0, 132)
|
||||||
|
crc32cData = append(crc32cData, statusCf.CanData...)
|
||||||
|
for _, dmCf := range dmsCfs {
|
||||||
|
crc32cData = append(crc32cData, dmCf.CanData...)
|
||||||
|
}
|
||||||
|
crc32cData = append(crc32cData, dtACf.CanData...)
|
||||||
|
crc32cData = append(crc32cData, dtBCf.CanData...)
|
||||||
|
crc32cData = append(crc32cData, canTimeToBytes(end.TkB)...)
|
||||||
|
//
|
||||||
|
end.Crc32C = Can_Crc32(crc32cData)
|
||||||
|
//
|
||||||
|
endCf := end.Encode()
|
||||||
|
//
|
||||||
|
rt := make([]byte, 0, 221) //17*13
|
||||||
|
rt = append(rt, statusCf.Encode2()...)
|
||||||
|
for _, dmCf := range dmsCfs {
|
||||||
|
rt = append(rt, dmCf.Encode2()...)
|
||||||
|
}
|
||||||
|
rt = append(rt, dtACf.Encode2()...)
|
||||||
|
rt = append(rt, dtBCf.Encode2()...)
|
||||||
|
rt = append(rt, endCf.Encode2()...)
|
||||||
|
if isTrainPcSim && len(rt) != 221 {
|
||||||
|
|
||||||
|
} else if len(rt) != 221 {
|
||||||
|
slog.Warn("len(rt)!=221")
|
||||||
|
return nil, false
|
||||||
|
}
|
||||||
|
|
||||||
|
return rt, true
|
||||||
|
}
|
||||||
|
|
||||||
// CreateBtmRspFramesData BTM与ATP之间为双向通信,ATP(主)定时发送请求帧,BTM(从)在未接收到应答器报文时回复状态应答器帧和时间同步帧,在接收到应答器报文时回复所有帧
|
// CreateBtmRspFramesData BTM与ATP之间为双向通信,ATP(主)定时发送请求帧,BTM(从)在未接收到应答器报文时回复状态应答器帧和时间同步帧,在接收到应答器报文时回复所有帧
|
||||||
//
|
//
|
||||||
// 数据帧与状态应答帧同时发送给ATP
|
// 数据帧与状态应答帧同时发送给ATP
|
||||||
|
315
third_party/message/rssp_code.go
vendored
315
third_party/message/rssp_code.go
vendored
@ -4,320 +4,43 @@ import "github.com/snksoft/crc"
|
|||||||
|
|
||||||
//rssp 协议中crc校验,查表法实现
|
//rssp 协议中crc校验,查表法实现
|
||||||
|
|
||||||
// // Crc16Table G(x)=X16+X11+X4+1,计算初始值为0
|
|
||||||
// var crc16Table []uint32 = nil
|
|
||||||
// var crc32C1Table []uint32 = nil
|
|
||||||
// var crc32C2Table []uint32 = nil
|
|
||||||
|
|
||||||
const (
|
|
||||||
// SCW常量
|
|
||||||
RSSP_I_C1_SCW uint32 = 0xae390b5a
|
|
||||||
RSSP_I_C2_SCW uint32 = 0xc103589c
|
|
||||||
//时间戳生成多项式
|
|
||||||
RSSP_I_C1_TS uint32 = 0x0fc22f87
|
|
||||||
RSSP_I_C2_TS uint32 = 0xc3e887e1
|
|
||||||
)
|
|
||||||
|
|
||||||
var (
|
var (
|
||||||
// crc16多项式为G(x)=X16+X11+X4+1
|
// crc16多项式为G(x)=X16+X11+X4+1
|
||||||
RSSP_I_CRC16 = &crc.Parameters{Width: 16, Polynomial: 0x0811, Init: 0x0, ReflectIn: true, ReflectOut: true, FinalXor: 0x0}
|
RSSP_I_CRC16 = crc.NewHash(&crc.Parameters{Width: 16, Polynomial: 0x0811, Init: 0x0, ReflectIn: true, ReflectOut: true, FinalXor: 0x0})
|
||||||
// 通道1 crc32多项式为0x100d4e63
|
// 通道1 crc32多项式为0x100d4e63
|
||||||
RSSP_I_C1_CRC32 = &crc.Parameters{Width: 32, Polynomial: 0x100d4e63, Init: 0x0, ReflectIn: true, ReflectOut: true, FinalXor: 0x0}
|
RSSP_I_C1_CRC32 = crc.NewHash(&crc.Parameters{Width: 32, Polynomial: 0x100d4e63, Init: 0x0, ReflectIn: true, ReflectOut: true, FinalXor: 0x0})
|
||||||
// 通道2 crc32多项式为0x8ce56011
|
// 通道2 crc32多项式为0x8ce56011
|
||||||
RSSP_I_C2_CRC32 = &crc.Parameters{Width: 32, Polynomial: 0x8ce56011, Init: 0x0, ReflectIn: true, ReflectOut: true, FinalXor: 0x0}
|
RSSP_I_C2_CRC32 = crc.NewHash(&crc.Parameters{Width: 32, Polynomial: 0x8ce56011, Init: 0x0, ReflectIn: true, ReflectOut: true, FinalXor: 0x0})
|
||||||
)
|
)
|
||||||
|
|
||||||
// Rssp_I_Crc16计算
|
// Rssp_I_Crc16计算
|
||||||
func Rssp_I_Crc16(data []byte) uint16 {
|
func Rssp_I_Crc16(data []byte) uint16 {
|
||||||
return uint16(crc.CalculateCRC(RSSP_I_CRC16, data))
|
return uint16(RSSP_I_CRC16.CalculateCRC(data))
|
||||||
}
|
}
|
||||||
|
|
||||||
// 通道1的crc32
|
// 通道1的crc32
|
||||||
func Rssp_I_Crc32C1(data []byte) uint32 {
|
func Rssp_I_Crc32C1(data []byte) uint32 {
|
||||||
return uint32(crc.CalculateCRC(RSSP_I_C1_CRC32, data))
|
newData := reverseBitsInByte(data)
|
||||||
|
return uint32(RSSP_I_C1_CRC32.CalculateCRC(newData))
|
||||||
}
|
}
|
||||||
|
|
||||||
// 通道2的crc32
|
// 通道2的crc32
|
||||||
func Rssp_I_Crc32C2(data []byte) uint32 {
|
func Rssp_I_Crc32C2(data []byte) uint32 {
|
||||||
return uint32(crc.CalculateCRC(RSSP_I_C2_CRC32, data))
|
newData := reverseBitsInByte(data)
|
||||||
|
return uint32(RSSP_I_C2_CRC32.CalculateCRC(newData))
|
||||||
}
|
}
|
||||||
|
|
||||||
// const ( //CRC生成多项式
|
func reverseBitsInByte(data []byte) []byte {
|
||||||
// RsspCrc16GX uint32 = 0b1_0000_1000_0001_0001 //生成多项式 G(X)=X16+X11+X4+1
|
var result byte
|
||||||
// RsspCrc32C1 uint32 = 0x100d4e63 //安全通道1 CRC32生成多项式
|
newData := make([]byte, len(data))
|
||||||
// RsspCrc32C2 uint32 = 0x8ce56011 //安全通道1 CRC32生成多项式
|
for i, b := range data {
|
||||||
// )
|
result = 0
|
||||||
|
for i := 0; i < 8; i++ {
|
||||||
// // InitRsspCrcTable 初始化RSSP协议中需要的CRC表
|
result <<= 1
|
||||||
// func InitRsspCrcTable() {
|
result |= b & 1
|
||||||
// if crc16Table == nil {
|
b >>= 1
|
||||||
// crc16Table = CreateCrcTable(RsspCrc16GX, 16, false)
|
|
||||||
// }
|
|
||||||
// if crc32C1Table == nil {
|
|
||||||
// crc32C1Table = CreateCrcTable(RsspCrc32C1, 32, false)
|
|
||||||
// }
|
|
||||||
// if crc32C2Table == nil {
|
|
||||||
// crc32C2Table = CreateCrcTable(RsspCrc32C2, 32, false)
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// func RsspCrc16(data []byte) uint16 {
|
|
||||||
// return uint16(CrcTableBased(data, 16, 0, false, false, 0, crc16Table))
|
|
||||||
// }
|
|
||||||
// func RsspC1Crc32(data []byte) uint32 {
|
|
||||||
// return CrcTableBased(data, 32, 0, false, false, 0, crc32C1Table)
|
|
||||||
// }
|
|
||||||
// func RsspC2Crc32(data []byte) uint32 {
|
|
||||||
// return CrcTableBased(data, 32, 0, false, false, 0, crc32C2Table)
|
|
||||||
// }
|
|
||||||
|
|
||||||
// // CreateCrcTable 创建CRC表,支持8、16、32位
|
|
||||||
// func CreateCrcTable(polynomial uint32, width int, input_reflected bool) []uint32 {
|
|
||||||
// var table = make([]uint32, 0, 256)
|
|
||||||
// for bt := 0x00; bt <= 0xff; bt++ {
|
|
||||||
// table = append(table, lookup(uint32(bt), polynomial, width, input_reflected))
|
|
||||||
// }
|
|
||||||
// return table
|
|
||||||
// }
|
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
// // 反转(0b00001010->0b01010000)
|
|
||||||
// func reflect(data uint32, width int) uint32 {
|
|
||||||
// var register1 uint32 = 0
|
|
||||||
// var significant_mask uint32 = 0xffffffff >> (32 - width)
|
|
||||||
// var register_msb_mask uint32 = 1 << (width - 1)
|
|
||||||
// var register_lsb_mask uint32 = 1
|
|
||||||
|
|
||||||
// for i := 0; i < width; i++ {
|
|
||||||
// need_or := (data>>i)®ister_lsb_mask == register_lsb_mask
|
|
||||||
// if need_or {
|
|
||||||
// register1 |= register_msb_mask >> i
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// return register1 & significant_mask
|
|
||||||
// }
|
|
||||||
|
|
||||||
// // 计算单个数值的crc
|
|
||||||
// func lookup(data uint32,
|
|
||||||
// polynomial uint32,
|
|
||||||
// width int,
|
|
||||||
// input_reflected bool) uint32 {
|
|
||||||
// var register1 uint32 = 0
|
|
||||||
// var significant_mask uint32 = 0xffffffff >> (32 - width)
|
|
||||||
// var register_msb_mask uint32 = 1 << (width - 1)
|
|
||||||
// var register_lsb_mask uint32 = 1
|
|
||||||
// var byte_msb_mask uint32 = 0x80
|
|
||||||
// var byte_lsb_mask uint32 = 1
|
|
||||||
|
|
||||||
// if input_reflected {
|
|
||||||
// polynomial = reflect(polynomial, width)
|
|
||||||
// }
|
|
||||||
|
|
||||||
// for i := 0; i < 1+(width/8); i++ {
|
|
||||||
// var byteData uint32 = 0
|
|
||||||
|
|
||||||
// if i < 1 {
|
|
||||||
// byteData = data
|
|
||||||
// }
|
|
||||||
|
|
||||||
// for j := 0; j < 8; j++ {
|
|
||||||
// need_xor := false
|
|
||||||
|
|
||||||
// if input_reflected {
|
|
||||||
// need_xor = (register1 & register_lsb_mask) == register_lsb_mask
|
|
||||||
// register1 >>= 1
|
|
||||||
|
|
||||||
// need_or := (byteData & byte_lsb_mask) == byte_lsb_mask
|
|
||||||
// byteData >>= 1
|
|
||||||
|
|
||||||
// if need_or {
|
|
||||||
// register1 |= register_msb_mask
|
|
||||||
// }
|
|
||||||
// } else {
|
|
||||||
// need_xor = (register1 & register_msb_mask) == register_msb_mask
|
|
||||||
// register1 <<= 1
|
|
||||||
|
|
||||||
// need_or := (byteData & byte_msb_mask) == byte_msb_mask
|
|
||||||
// byteData <<= 1
|
|
||||||
|
|
||||||
// if need_or {
|
|
||||||
// register1 |= register_lsb_mask
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
// if need_xor {
|
|
||||||
// register1 ^= polynomial
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// return register1 & significant_mask
|
|
||||||
// }
|
|
||||||
|
|
||||||
// // CrcTableBased 查表法计算字节数组的crc
|
|
||||||
// func CrcTableBased(
|
|
||||||
// data []byte,
|
|
||||||
// width int,
|
|
||||||
// initial_value uint32,
|
|
||||||
// input_reflected bool,
|
|
||||||
// result_reflected bool,
|
|
||||||
// final_xor_value uint32,
|
|
||||||
// table []uint32) uint32 {
|
|
||||||
// //
|
|
||||||
// length := len(data)
|
|
||||||
// var register1 uint32 = initial_value
|
|
||||||
// var significant_mask uint32 = 0xffffffff >> (32 - width)
|
|
||||||
// var register_lsb_mask uint32 = 0xff
|
|
||||||
|
|
||||||
// if input_reflected {
|
|
||||||
// register1 = reflect(register1, width)
|
|
||||||
// }
|
|
||||||
|
|
||||||
// for i := 0; i < length; i++ {
|
|
||||||
// var byteData = uint32(data[i])
|
|
||||||
// var shift_out uint32 = 0
|
|
||||||
|
|
||||||
// if input_reflected {
|
|
||||||
// shift_out = register1 & register_lsb_mask
|
|
||||||
// register1 = (register1 >> 8) ^ table[shift_out^byteData]
|
|
||||||
// } else {
|
|
||||||
// shift_out = (register1 >> (width - 8)) & register_lsb_mask
|
|
||||||
// register1 = (register1 << 8) ^ table[shift_out^byteData]
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
// if input_reflected != result_reflected {
|
|
||||||
// register1 = reflect(register1, width)
|
|
||||||
// }
|
|
||||||
// return (register1 ^ final_xor_value) & significant_mask
|
|
||||||
// }
|
|
||||||
|
|
||||||
// func Crc(data []byte,
|
|
||||||
// polynomial uint32,
|
|
||||||
// width int,
|
|
||||||
// initial_value uint32,
|
|
||||||
// input_reflected bool,
|
|
||||||
// result_reflected bool,
|
|
||||||
// final_xor_value uint32) uint32 {
|
|
||||||
// length := len(data)
|
|
||||||
// var register1 uint32 = initial_value
|
|
||||||
// var significant_mask uint32 = 0xffffffff >> (32 - width)
|
|
||||||
// var register_lsb_mask uint32 = 0xff
|
|
||||||
|
|
||||||
// if input_reflected {
|
|
||||||
// register1 = reflect(register1, width)
|
|
||||||
// }
|
|
||||||
|
|
||||||
// for i := 0; i < length; i++ {
|
|
||||||
// var byteData uint32 = uint32(data[i])
|
|
||||||
// var shift_out uint32 = 0
|
|
||||||
// var value uint32 = 0
|
|
||||||
|
|
||||||
// if input_reflected {
|
|
||||||
// shift_out = register1 & register_lsb_mask
|
|
||||||
// value = lookup(shift_out^byteData, polynomial, width, input_reflected)
|
|
||||||
// register1 = (register1 >> 8) ^ value
|
|
||||||
// } else {
|
|
||||||
// shift_out = (register1 >> (width - 8)) & register_lsb_mask
|
|
||||||
// value = lookup(shift_out^byteData, polynomial, width, input_reflected)
|
|
||||||
// register1 = (register1 << 8) ^ value
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
// if input_reflected != result_reflected {
|
|
||||||
// register1 = reflect(register1, width)
|
|
||||||
// }
|
|
||||||
// return (register1 ^ final_xor_value) & significant_mask
|
|
||||||
// }
|
|
||||||
|
|
||||||
//////////////////////////LFSR//////////////////////////////
|
|
||||||
|
|
||||||
// 线性反馈移位寄存器
|
|
||||||
type RsspLFSR struct {
|
|
||||||
polynomial uint32 //生成多项式
|
|
||||||
width int //寄存器宽度
|
|
||||||
register uint32 //寄存器
|
|
||||||
initValue uint32 //初始值
|
|
||||||
rightShift bool //true-右移,false-左移
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewRsspLFSR(polynomial uint32, width int, init_value uint32, rightShift bool) *RsspLFSR {
|
|
||||||
var wd_msb_mask uint32 = 1 << (width - 1)
|
|
||||||
var wd_mask uint32 = 0xffffffff >> (32 - width)
|
|
||||||
init_value &= wd_mask
|
|
||||||
polynomial &= wd_mask
|
|
||||||
polynomial = (polynomial >> 1) | wd_msb_mask
|
|
||||||
//
|
|
||||||
return &RsspLFSR{polynomial: polynomial, width: width, register: init_value, initValue: init_value, rightShift: rightShift}
|
|
||||||
}
|
|
||||||
func (r *RsspLFSR) move() {
|
|
||||||
r.move0(r.rightShift)
|
|
||||||
}
|
|
||||||
func (r *RsspLFSR) MoveRight() *RsspLFSR {
|
|
||||||
r.move0(true)
|
|
||||||
return r
|
|
||||||
}
|
|
||||||
func (r *RsspLFSR) MoveLeft() *RsspLFSR {
|
|
||||||
r.move0(false)
|
|
||||||
return r
|
|
||||||
}
|
|
||||||
func (r *RsspLFSR) move0(rightShift bool) {
|
|
||||||
var significant_mask uint32 = 0xffffffff >> (32 - r.width)
|
|
||||||
//
|
|
||||||
r.register &= significant_mask
|
|
||||||
cb := r.register & r.polynomial & significant_mask
|
|
||||||
out := bitXor(cb, r.width)
|
|
||||||
if rightShift {
|
|
||||||
r.register >>= 1
|
|
||||||
r.register = r.register | (out << (r.width - 1))
|
|
||||||
} else {
|
|
||||||
r.register <<= 1
|
|
||||||
r.register = r.register | out
|
|
||||||
}
|
}
|
||||||
r.register &= significant_mask
|
newData[i] = result
|
||||||
}
|
|
||||||
|
|
||||||
func (r *RsspLFSR) GetAndMove() uint32 {
|
|
||||||
rt := r.register
|
|
||||||
r.move()
|
|
||||||
return rt
|
|
||||||
}
|
|
||||||
func (r *RsspLFSR) Get() uint32 {
|
|
||||||
return r.register
|
|
||||||
}
|
|
||||||
func (r *RsspLFSR) Reset() {
|
|
||||||
r.register = r.initValue
|
|
||||||
}
|
|
||||||
|
|
||||||
// return 0 或 1
|
|
||||||
func bitXor(data uint32, width int) uint32 {
|
|
||||||
var v uint32 = 0
|
|
||||||
var lsb_mask uint32 = 1
|
|
||||||
for i := 0; i < width; i++ {
|
|
||||||
v ^= data >> i
|
|
||||||
}
|
}
|
||||||
return v & lsb_mask
|
return newData
|
||||||
}
|
|
||||||
|
|
||||||
// ///////////////////////////////////////////////////////
|
|
||||||
const RsspSnMax = uint32(4294967295)
|
|
||||||
|
|
||||||
type RsspSn struct {
|
|
||||||
sn uint32 //顺序序列号,最大值4294967295
|
|
||||||
initValue uint32
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewRsspSn(initValue uint32) *RsspSn {
|
|
||||||
return &RsspSn{sn: initValue, initValue: initValue}
|
|
||||||
}
|
|
||||||
func (s *RsspSn) GetAndAdd() uint32 {
|
|
||||||
if s.sn < RsspSnMax {
|
|
||||||
s.sn++
|
|
||||||
return s.sn
|
|
||||||
} else {
|
|
||||||
s.sn = s.initValue
|
|
||||||
return s.sn
|
|
||||||
}
|
|
||||||
}
|
|
||||||
func (s *RsspSn) Get() uint32 {
|
|
||||||
return s.sn
|
|
||||||
}
|
}
|
||||||
|
28
third_party/message/rssp_code_test.go
vendored
28
third_party/message/rssp_code_test.go
vendored
@ -2,19 +2,31 @@ package message
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"github.com/snksoft/crc"
|
||||||
"testing"
|
"testing"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestNewRsspLFSR(t *testing.T) {
|
|
||||||
lfsr := NewRsspLFSR(0x0FC22F87, 32, 0x7665986c, false)
|
|
||||||
for i := 0; i < 341; i++ {
|
|
||||||
lfsr.GetAndMove()
|
|
||||||
}
|
|
||||||
fmt.Printf("%x", lfsr.Get())
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestRssp_I_Crc16(t *testing.T) {
|
func TestRssp_I_Crc16(t *testing.T) {
|
||||||
bytes := []byte{0x01, 0x80, 0x3a, 0x30, 0x9e, 0x30, 0x24, 0x85, 00, 00, 0x23, 00, 0x3b, 0x2b, 0xb1, 0x08, 0xf8, 0xc0, 0x6c, 0x16, 0x80, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00}
|
bytes := []byte{0x01, 0x80, 0x3a, 0x30, 0x9e, 0x30, 0x24, 0x85, 00, 00, 0x23, 00, 0x3b, 0x2b, 0xb1, 0x08, 0xf8, 0xc0, 0x6c, 0x16, 0x80, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00}
|
||||||
crc := Rssp_I_Crc16(bytes)
|
crc := Rssp_I_Crc16(bytes)
|
||||||
fmt.Printf("crc16: %x\n", crc)
|
fmt.Printf("crc16: %x\n", crc)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func BenchmarkRssp_I_Crc32C1(b *testing.B) {
|
||||||
|
var params = &crc.Parameters{
|
||||||
|
Width: 32,
|
||||||
|
Polynomial: 0x100d4e63,
|
||||||
|
ReflectIn: true,
|
||||||
|
ReflectOut: true,
|
||||||
|
Init: 0,
|
||||||
|
FinalXor: 0,
|
||||||
|
}
|
||||||
|
hash := crc.NewHash(params)
|
||||||
|
bytes := []byte{0x01, 0x80, 0x3a, 0x30, 0x9e, 0x30, 0x24, 0x85, 00, 00, 0x23, 00, 0x3b, 0x2b, 0xb1, 0x08, 0xf8, 0xc0, 0x6c, 0x16, 0x80, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00}
|
||||||
|
for i := 0; i < b.N; i++ {
|
||||||
|
hash.CalculateCRC(bytes)
|
||||||
|
}
|
||||||
|
//for i := 0; i < b.N; i++ {
|
||||||
|
// crc.CalculateCRC(params, bytes)
|
||||||
|
//}
|
||||||
|
}
|
||||||
|
4
third_party/message/train_pc_sim_message.go
vendored
4
third_party/message/train_pc_sim_message.go
vendored
@ -121,8 +121,6 @@ func AtpLowPowerByte(d byte) bool {
|
|||||||
|
|
||||||
// 列车速度位置报告
|
// 列车速度位置报告
|
||||||
type TrainSpeedPlaceReportMsg struct {
|
type TrainSpeedPlaceReportMsg struct {
|
||||||
//列车id
|
|
||||||
TrainId string
|
|
||||||
PulseCount1 uint32
|
PulseCount1 uint32
|
||||||
PulseCount2 uint32
|
PulseCount2 uint32
|
||||||
}
|
}
|
||||||
@ -255,4 +253,6 @@ const (
|
|||||||
DOOR_MODE_AM
|
DOOR_MODE_AM
|
||||||
//MM人开人关
|
//MM人开人关
|
||||||
DOOR_MODE_MM
|
DOOR_MODE_MM
|
||||||
|
_
|
||||||
|
NOT_BREAK
|
||||||
)
|
)
|
||||||
|
@ -51,7 +51,15 @@ func (s *semiPhysicalTrainImpl) State() tpapi.ThirdPartyApiServiceState {
|
|||||||
func (s *semiPhysicalTrainImpl) Name() string {
|
func (s *semiPhysicalTrainImpl) Name() string {
|
||||||
return Name
|
return Name
|
||||||
}
|
}
|
||||||
|
func (d *semiPhysicalTrainImpl) FindAppendApiService() []tpapi.ThirdPartyApiService {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
func (d *semiPhysicalTrainImpl) TrueService() bool {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
func (d *semiPhysicalTrainImpl) ServiceDesc() string {
|
||||||
|
return Name
|
||||||
|
}
|
||||||
func (s *semiPhysicalTrainImpl) handleTrainControlMsg(b []byte) {
|
func (s *semiPhysicalTrainImpl) handleTrainControlMsg(b []byte) {
|
||||||
s.udpDelayRecorder.RecordInterval()
|
s.udpDelayRecorder.RecordInterval()
|
||||||
// slog.Debug(fmt.Sprintf("半实物列车控制消息近期消息间隔: %v", s.udpDelayRecorder.GetIntervals()))
|
// slog.Debug(fmt.Sprintf("半实物列车控制消息近期消息间隔: %v", s.udpDelayRecorder.GetIntervals()))
|
||||||
|
31
third_party/third_party.go
vendored
31
third_party/third_party.go
vendored
@ -40,24 +40,39 @@ func convertServiceName(name string) state_proto.SimulationThirdPartyApiService_
|
|||||||
func GetRunningServiceStates() *state_proto.SimulationThirdPartyApiService {
|
func GetRunningServiceStates() *state_proto.SimulationThirdPartyApiService {
|
||||||
ss := &state_proto.SimulationThirdPartyApiService{}
|
ss := &state_proto.SimulationThirdPartyApiService{}
|
||||||
for _, tpas := range tpapiService {
|
for _, tpas := range tpapiService {
|
||||||
t := convertServiceName(tpas.Name())
|
if tpas.TrueService() {
|
||||||
if t == state_proto.SimulationThirdPartyApiService_Undefined {
|
collectServiceState(ss, tpas)
|
||||||
slog.Error("未知的第三方接口服务类型", "name", tpas.Name())
|
} else {
|
||||||
continue
|
trueServices := tpas.FindAppendApiService()
|
||||||
|
if trueServices != nil && len(trueServices) > 0 {
|
||||||
|
for _, trueService := range trueServices {
|
||||||
|
collectServiceState(ss, trueService)
|
||||||
}
|
}
|
||||||
switch tpas.State() {
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
return ss
|
||||||
|
}
|
||||||
|
func collectServiceState(ss *state_proto.SimulationThirdPartyApiService, service tpapi.ThirdPartyApiService) {
|
||||||
|
t := convertServiceName(service.Name())
|
||||||
|
if t == state_proto.SimulationThirdPartyApiService_Undefined {
|
||||||
|
slog.Error("未知的第三方接口服务类型", "name", service.Name())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
switch service.State() {
|
||||||
case tpapi.ThirdPartyState_Normal:
|
case tpapi.ThirdPartyState_Normal:
|
||||||
ss.States = append(ss.States, &state_proto.SimulationThirdPartyApiServiceState{
|
ss.States = append(ss.States, &state_proto.SimulationThirdPartyApiServiceState{
|
||||||
Type: t,
|
Type: t,
|
||||||
|
ServiceName: service.ServiceDesc(),
|
||||||
State: state_proto.SimulationThirdPartyApiService_Normal,
|
State: state_proto.SimulationThirdPartyApiService_Normal,
|
||||||
})
|
})
|
||||||
case tpapi.ThirdPartyState_Broken:
|
case tpapi.ThirdPartyState_Broken:
|
||||||
ss.States = append(ss.States, &state_proto.SimulationThirdPartyApiServiceState{
|
ss.States = append(ss.States, &state_proto.SimulationThirdPartyApiServiceState{
|
||||||
Type: t,
|
Type: t,
|
||||||
|
ServiceName: service.ServiceDesc(),
|
||||||
State: state_proto.SimulationThirdPartyApiService_Error,
|
State: state_proto.SimulationThirdPartyApiService_Error,
|
||||||
})
|
})
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
return ss
|
|
||||||
}
|
}
|
||||||
|
5
third_party/tpapi/service.go
vendored
5
third_party/tpapi/service.go
vendored
@ -23,6 +23,11 @@ type ThirdPartyApiService interface {
|
|||||||
Name() string
|
Name() string
|
||||||
// 服务状态
|
// 服务状态
|
||||||
State() ThirdPartyApiServiceState
|
State() ThirdPartyApiServiceState
|
||||||
|
FindAppendApiService() []ThirdPartyApiService
|
||||||
|
//是否真实服务,如果为假,就会调用FindAppendApiService方法
|
||||||
|
TrueService() bool
|
||||||
|
//服务描述
|
||||||
|
ServiceDesc() string
|
||||||
}
|
}
|
||||||
|
|
||||||
// func NewThirdPartyApiService() ThirdPartyApiService {
|
// func NewThirdPartyApiService() ThirdPartyApiService {
|
||||||
|
@ -4,46 +4,72 @@ import (
|
|||||||
"joylink.club/bj-rtsts-server/dto/state_proto"
|
"joylink.club/bj-rtsts-server/dto/state_proto"
|
||||||
"joylink.club/bj-rtsts-server/third_party/message"
|
"joylink.club/bj-rtsts-server/third_party/message"
|
||||||
"joylink.club/bj-rtsts-server/third_party/tcp"
|
"joylink.club/bj-rtsts-server/third_party/tcp"
|
||||||
|
"joylink.club/bj-rtsts-server/third_party/tpapi"
|
||||||
|
"log/slog"
|
||||||
)
|
)
|
||||||
|
|
||||||
type trainPcReciverData struct {
|
type TrainPcReciverData struct {
|
||||||
|
tpapi.ThirdPartyApiService
|
||||||
clientKey string
|
clientKey string
|
||||||
tcpClient *tcp.TcpClient
|
tcpClient *tcp.TcpClient
|
||||||
pcSimManage TrainPcSimManage
|
pcSimManage TrainPcSimManage
|
||||||
|
trainInit bool
|
||||||
|
state tpapi.ThirdPartyApiServiceState
|
||||||
|
speedPlace *message.TrainSpeedPlaceReportMsg
|
||||||
|
train *state_proto.TrainState
|
||||||
}
|
}
|
||||||
|
|
||||||
func (rd *trainPcReciverData) receiverDataHandle(n int, data []byte) {
|
func (rd *TrainPcReciverData) Name() string {
|
||||||
|
return Name
|
||||||
|
}
|
||||||
|
|
||||||
|
// 服务状态
|
||||||
|
func (rd *TrainPcReciverData) State() tpapi.ThirdPartyApiServiceState {
|
||||||
|
return rd.state
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d *TrainPcReciverData) updateState(state tpapi.ThirdPartyApiServiceState) {
|
||||||
|
d.state = state
|
||||||
|
}
|
||||||
|
func (d *TrainPcReciverData) readError(err error) {
|
||||||
|
slog.Error("连接车载pc仿真tcp服务断开", err)
|
||||||
|
d.updateState(tpapi.ThirdPartyState_Broken)
|
||||||
|
d.tcpClient = nil
|
||||||
|
|
||||||
|
}
|
||||||
|
func (d *TrainPcReciverData) ServiceDesc() string {
|
||||||
|
return d.clientKey
|
||||||
|
}
|
||||||
|
func (rd *TrainPcReciverData) receiverDataHandle(n int, data []byte) {
|
||||||
|
|
||||||
receiveData := data[:n]
|
receiveData := data[:n]
|
||||||
|
|
||||||
|
trainPcMsgs := message.TrainPcSimDecode(receiveData)
|
||||||
|
train := rd.train
|
||||||
|
if train == nil {
|
||||||
|
slog.Error("车载输出数字量,未找到连接车载pc仿真的列车")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if !train.ConnState.Conn {
|
||||||
|
slog.Error("车载输出数字量,,列车未连接车载pc仿真")
|
||||||
|
return
|
||||||
|
}
|
||||||
//hexSourceData := hex.EncodeToString(receiveData)
|
//hexSourceData := hex.EncodeToString(receiveData)
|
||||||
//slog.Info(fmt.Sprintf("接受列车激活端:%v pc仿真接收数据:%v", rd.clientKey, hexSourceData))
|
//slog.Info(fmt.Sprintf("接受列车激活端:%v pc仿真接收数据:%v", rd.clientKey, hexSourceData))
|
||||||
trainPcMsgs := message.TrainPcSimDecode(receiveData)
|
|
||||||
connType := state_proto.TrainConnState_PC_SIM_A
|
|
||||||
if rd.clientKey == "B" {
|
|
||||||
connType = state_proto.TrainConnState_PC_SIM_B
|
|
||||||
}
|
|
||||||
for _, baseMsg := range trainPcMsgs {
|
for _, baseMsg := range trainPcMsgs {
|
||||||
//slog.Info(fmt.Sprintf("pc仿真接收数据:%v,类型:%X", hexSourceData, baseMsg.Type))
|
//slog.Info(fmt.Sprintf("pc仿真接收数据:%v,类型:%X", hexSourceData, baseMsg.Type))
|
||||||
switch baseMsg.Type {
|
switch baseMsg.Type {
|
||||||
//case RECIVE_TRAIN_CREATE_REMOVE:
|
//case RECIVE_TRAIN_CREATE_REMOVE:
|
||||||
// pc.trainPcSimManage.TrainPcSimConnOrRemoveHandle(baseMsg.Data[0])
|
// pc.trainPcSimManage.TrainPcSimConnOrRemoveHandle(baseMsg.Data[0])
|
||||||
//case message.RECIVE_TRAIN_INTERFACE_CABINET_OUTR:
|
case message.RECIVE_TRAIN_INTERFACE_CABINET_OUTR:
|
||||||
// rd.pcSimManage.TrainPcSimDigitalOutInfoHandle(connType, baseMsg.Data)
|
initResult := rd.pcSimManage.TrainPcSimDigitalOutInfoHandle(train, rd.trainInit, baseMsg.Data)
|
||||||
|
rd.trainInit = initResult
|
||||||
case message.RECIVE_TRAIN_INTERFACE_CABINET_OUTR_BACK:
|
case message.RECIVE_TRAIN_INTERFACE_CABINET_OUTR_BACK:
|
||||||
rd.pcSimManage.TrainPcSimDigitalReportHandle(connType, baseMsg.Data)
|
rd.pcSimManage.TrainPcSimDigitalReportHandle(train, baseMsg.Data)
|
||||||
case message.RECIVE_TRAIN_QUERY_STATUS:
|
case message.RECIVE_TRAIN_QUERY_STATUS:
|
||||||
rd.pcSimManage.TrainBtmQuery(connType, baseMsg.Data)
|
rd.pcSimManage.TrainBtmQuery(train, baseMsg.Data)
|
||||||
/*train := rd.pcSimManage.FindConnTrain(connType)
|
|
||||||
mockMsgs := rd.pcSimManage.ObtainTrainDigitalMockData(train)
|
|
||||||
for _, msg := range mockMsgs {
|
|
||||||
err := rd.tcpClient.Send(msg.Encode())
|
|
||||||
if err != nil {
|
|
||||||
slog.Error("查询btm发送模拟量失败 msg:", err.Error(), err)
|
|
||||||
}
|
|
||||||
}*/
|
|
||||||
case message.RECIVE_TRAIN_MOCK_DATA:
|
case message.RECIVE_TRAIN_MOCK_DATA:
|
||||||
rd.pcSimManage.TrainPcSimMockInfo(connType, baseMsg.Data)
|
rd.pcSimManage.TrainPcSimMockInfo(train, baseMsg.Data)
|
||||||
|
|
||||||
//case RECIVE_TRAIN_DOOR_MODE:
|
//case RECIVE_TRAIN_DOOR_MODE:
|
||||||
// pc.trainPcSimManage.TrainDoorModeHandle(baseMsg.Data[0])
|
// pc.trainPcSimManage.TrainDoorModeHandle(baseMsg.Data[0])
|
||||||
|
452
third_party/train_pc_sim/train_pc_sim.go
vendored
452
third_party/train_pc_sim/train_pc_sim.go
vendored
@ -6,17 +6,19 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"joylink.club/bj-rtsts-server/config"
|
"joylink.club/bj-rtsts-server/config"
|
||||||
"joylink.club/bj-rtsts-server/dto/state_proto"
|
"joylink.club/bj-rtsts-server/dto/state_proto"
|
||||||
|
"joylink.club/bj-rtsts-server/sys_error"
|
||||||
"joylink.club/bj-rtsts-server/third_party/message"
|
"joylink.club/bj-rtsts-server/third_party/message"
|
||||||
"joylink.club/bj-rtsts-server/third_party/tcp"
|
"joylink.club/bj-rtsts-server/third_party/tcp"
|
||||||
"joylink.club/bj-rtsts-server/third_party/tpapi"
|
"joylink.club/bj-rtsts-server/third_party/tpapi"
|
||||||
"log/slog"
|
"log/slog"
|
||||||
|
"math"
|
||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
type TrainControlEvent struct {
|
type TrainControlEvent struct {
|
||||||
Command byte
|
Type byte
|
||||||
Status byte
|
Data []byte
|
||||||
}
|
}
|
||||||
|
|
||||||
//var FireTrainControlEventType = ecs.NewEventType[TrainControlEvent]()
|
//var FireTrainControlEventType = ecs.NewEventType[TrainControlEvent]()
|
||||||
@ -37,11 +39,17 @@ type TrainPcSim interface {
|
|||||||
SendBaliseData(train *state_proto.TrainState, msgType byte, data []byte)
|
SendBaliseData(train *state_proto.TrainState, msgType byte, data []byte)
|
||||||
SendBaliseData2(train *state_proto.TrainState, msgType byte, data []string)
|
SendBaliseData2(train *state_proto.TrainState, msgType byte, data []string)
|
||||||
//发布列车控制的相关事件
|
//发布列车控制的相关事件
|
||||||
PublishTrainControlEvent(train *state_proto.TrainState, events []TrainControlEvent)
|
//PublishTrainControlEvent(train *state_proto.TrainState, events []TrainControlEvent)
|
||||||
|
|
||||||
|
SendTrainControlMsg(train *state_proto.TrainState, baseMessage []message.TrainPcSimBaseMessage)
|
||||||
// CreateOrRemoveSpeedPLace 创建或删除速度位置信息
|
// CreateOrRemoveSpeedPLace 创建或删除速度位置信息
|
||||||
CreateOrRemoveSpeedPLace(train *state_proto.TrainState)
|
//CreateOrRemoveSpeedPLace(train *state_proto.TrainState)
|
||||||
// CreateOrRemoveTrain 创建或删除列车
|
// CreateOrRemoveTrain 创建或删除列车
|
||||||
CreateOrRemoveTrain(train *state_proto.TrainState, isCreate bool) error
|
CreateOrRemoveTrain(train *state_proto.TrainState, isCreate bool) error
|
||||||
|
// TrainPluseCount 计算列车脉冲
|
||||||
|
TrainPluseCount(sta *state_proto.TrainState, h1, h2, t1, t2 float32)
|
||||||
|
ResetPluseCount(sta *state_proto.TrainState)
|
||||||
|
//FindAllThirdPartState() []tpapi.ThirdPartyApiService
|
||||||
}
|
}
|
||||||
|
|
||||||
type TrainPcSimManage interface {
|
type TrainPcSimManage interface {
|
||||||
@ -51,36 +59,25 @@ type TrainPcSimManage interface {
|
|||||||
//获取列车模拟量数据
|
//获取列车模拟量数据
|
||||||
ObtainTrainDigitalMockData(train *state_proto.TrainState) []message.TrainPcSimBaseMessage
|
ObtainTrainDigitalMockData(train *state_proto.TrainState) []message.TrainPcSimBaseMessage
|
||||||
// TrainPcSimDigitalOutInfoHandle 4.4.1. 车载输出数字量信息报文内容
|
// TrainPcSimDigitalOutInfoHandle 4.4.1. 车载输出数字量信息报文内容
|
||||||
TrainPcSimDigitalOutInfoHandle(connType state_proto.TrainConnState_TrainConnType, data []byte)
|
TrainPcSimDigitalOutInfoHandle(train *state_proto.TrainState, trainInit bool, data []byte) bool
|
||||||
// TrainPcSimDigitalReportHandle 4.4.2. 车载输出数字反馈量信息报文内容
|
// TrainPcSimDigitalReportHandle 4.4.2. 车载输出数字反馈量信息报文内容
|
||||||
TrainPcSimDigitalReportHandle(connType state_proto.TrainConnState_TrainConnType, data []byte)
|
TrainPcSimDigitalReportHandle(train *state_proto.TrainState, data []byte)
|
||||||
FindConnTrain(ct state_proto.TrainConnState_TrainConnType) *state_proto.TrainState
|
FindConnTrain(ct state_proto.TrainConnState_TrainConnType) *state_proto.TrainState
|
||||||
// TrainPcSimMockInfo 门模式
|
// TrainPcSimMockInfo 门模式
|
||||||
//TrainDoorModeHandle(state byte)
|
//TrainDoorModeHandle(state byte)
|
||||||
//处理列车pc仿真模拟量数据
|
//处理列车pc仿真模拟量数据
|
||||||
TrainPcSimMockInfo(connType state_proto.TrainConnState_TrainConnType, data []byte)
|
TrainPcSimMockInfo(train *state_proto.TrainState, data []byte)
|
||||||
// TrainBtmQuery 处理列车btm查询
|
// TrainBtmQuery 处理列车btm查询
|
||||||
TrainBtmQuery(connType state_proto.TrainConnState_TrainConnType, data []byte)
|
TrainBtmQuery(train *state_proto.TrainState, data []byte)
|
||||||
}
|
}
|
||||||
|
type trainPcSimService struct {
|
||||||
const Name = "车载pc仿真"
|
state tpapi.ThirdPartyApiServiceState
|
||||||
|
newPcSimclientMap map[string]*TrainPcReciverData
|
||||||
func FindTrainPcSimClientKey(t *state_proto.TrainState) string {
|
cancleContext context.CancelFunc
|
||||||
if t.ConnState.ConnType == state_proto.TrainConnState_PC_SIM_A {
|
trainPcSimManage TrainPcSimManage
|
||||||
return "A"
|
//speedPlace *message.TrainSpeedPlaceReportMsg
|
||||||
} else if t.ConnState.ConnType == state_proto.TrainConnState_PC_SIM_B {
|
//trainSpeedPlace map[string]*message.TrainSpeedPlaceReportMsg
|
||||||
return "B"
|
configs []config.VehiclePCSimConfig
|
||||||
}
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
func (d *trainPcSimService) Name() string {
|
|
||||||
return Name
|
|
||||||
}
|
|
||||||
func (d *trainPcSimService) State() tpapi.ThirdPartyApiServiceState {
|
|
||||||
return d.state
|
|
||||||
}
|
|
||||||
func (d *trainPcSimService) updateState(state tpapi.ThirdPartyApiServiceState) {
|
|
||||||
d.state = state
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
@ -97,26 +94,85 @@ func Default() TrainPcSim {
|
|||||||
return singleObj
|
return singleObj
|
||||||
}
|
}
|
||||||
|
|
||||||
type trainPcSimService struct {
|
const Name = "车载pc仿真"
|
||||||
state tpapi.ThirdPartyApiServiceState
|
|
||||||
newPcSimclientMap map[string]*trainPcReciverData
|
func (d *trainPcSimService) Name() string {
|
||||||
cancleContext context.CancelFunc
|
return ""
|
||||||
trainPcSimManage TrainPcSimManage
|
}
|
||||||
speedPlace *message.TrainSpeedPlaceReportMsg
|
func (d *trainPcSimService) State() tpapi.ThirdPartyApiServiceState {
|
||||||
configs []config.VehiclePCSimConfig
|
return tpapi.ThirdPartyState_Closed
|
||||||
|
}
|
||||||
|
func (d *trainPcSimService) FindAppendApiService() []tpapi.ThirdPartyApiService {
|
||||||
|
return d.findAllThirdPartState()
|
||||||
|
}
|
||||||
|
func (d *trainPcSimService) TrueService() bool {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
func (d *trainPcSimService) ServiceDesc() string {
|
||||||
|
return Name
|
||||||
|
}
|
||||||
|
func FindTrainPcSimClientKey2(t *state_proto.TrainState) string {
|
||||||
|
return t.ConnState.TypeName
|
||||||
|
}
|
||||||
|
func (d *trainPcSimService) findTrainConn(sta *state_proto.TrainState) (*TrainPcReciverData, error) {
|
||||||
|
trainPcReciver := d.newPcSimclientMap[sta.ConnState.TypeName]
|
||||||
|
if trainPcReciver == nil {
|
||||||
|
return nil, fmt.Errorf("")
|
||||||
|
}
|
||||||
|
return trainPcReciver, nil
|
||||||
|
}
|
||||||
|
func (d *trainPcSimService) findAllThirdPartState() []tpapi.ThirdPartyApiService {
|
||||||
|
services := make([]tpapi.ThirdPartyApiService, 0)
|
||||||
|
for _, data := range d.newPcSimclientMap {
|
||||||
|
services = append(services, data)
|
||||||
|
}
|
||||||
|
return services
|
||||||
}
|
}
|
||||||
|
|
||||||
// 接受来自pc仿真的消息
|
func pluseCountSpeed(wheelDiameter int32, speedMeter float32) uint32 {
|
||||||
func (d *trainPcSimService) readError(err error) {
|
s1 := speedMeter * 1000
|
||||||
slog.Error("连接车载pc仿真tcp服务断开", err)
|
pluseCountData := s1 * 200 / math.Pi / float32(wheelDiameter)
|
||||||
d.updateState(tpapi.ThirdPartyState_Broken)
|
|
||||||
|
return uint32(pluseCountData)
|
||||||
}
|
}
|
||||||
func (d *trainPcSimService) newCloseAllConn() {
|
func (d *trainPcSimService) ResetPluseCount(sta *state_proto.TrainState) {
|
||||||
for _, rd := range d.newPcSimclientMap {
|
if sd, err := d.findTrainConn(sta); err == nil {
|
||||||
if rd != nil {
|
sd.speedPlace.PulseCount1 = 0
|
||||||
rd.tcpClient.Close()
|
sd.speedPlace.PulseCount2 = 0
|
||||||
rd.tcpClient = nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
func (d *trainPcSimService) TrainPluseCount(sta *state_proto.TrainState, h1, h2, t1, t2 float32) {
|
||||||
|
defer initLock.Unlock()
|
||||||
|
initLock.Lock()
|
||||||
|
if sta.TrainRunUp {
|
||||||
|
if sta.TrainEndsA.SpeedSensorEnableA {
|
||||||
|
sta.PluseCount.PulseCount1 = pluseCountSpeed(sta.WheelDiameter, h1)
|
||||||
|
}
|
||||||
|
if sta.TrainEndsA.SpeedSensorEnableB {
|
||||||
|
sta.PluseCount.PulseCount2 = pluseCountSpeed(sta.WheelDiameter, h2)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if sta.TrainEndsB.SpeedSensorEnableA {
|
||||||
|
sta.PluseCount.PulseCount1 = pluseCountSpeed(sta.WheelDiameter, t1)
|
||||||
|
}
|
||||||
|
if sta.TrainEndsB.SpeedSensorEnableB {
|
||||||
|
sta.PluseCount.PulseCount2 = pluseCountSpeed(sta.WheelDiameter, t2)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d *trainPcSimService) TrainPluseCountReset(sta *state_proto.TrainState) {
|
||||||
|
defer initLock.Unlock()
|
||||||
|
initLock.Lock()
|
||||||
|
sta.PluseCount.PulseCount1 = 0
|
||||||
|
sta.PluseCount.PulseCount2 = 0
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d *trainPcSimService) newCloseAllConn() {
|
||||||
|
trains := d.trainPcSimManage.GetConnTrain2()
|
||||||
|
for _, train := range trains {
|
||||||
|
d.CreateOrRemoveTrain(train, false)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -125,27 +181,22 @@ func (d *trainPcSimService) newCloseConn(clientKey string) {
|
|||||||
if rd != nil {
|
if rd != nil {
|
||||||
rd.tcpClient.Close()
|
rd.tcpClient.Close()
|
||||||
rd.tcpClient = nil
|
rd.tcpClient = nil
|
||||||
|
rd.train = nil
|
||||||
|
rd.speedPlace = nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *trainPcSimService) findConfig(tcChar string) (*config.VehiclePCSimConfig, error) {
|
func (d *trainPcSimService) findConfig(configName string) (*config.VehiclePCSimConfig, error) {
|
||||||
configFlag := false
|
|
||||||
if tcChar == "A" {
|
|
||||||
configFlag = true
|
|
||||||
} else if tcChar == "B" {
|
|
||||||
configFlag = false
|
|
||||||
} else {
|
|
||||||
return nil, fmt.Errorf(fmt.Sprintf("未知车载pc连接标识:%v", tcChar))
|
|
||||||
}
|
|
||||||
for _, cfg := range d.configs {
|
for _, cfg := range d.configs {
|
||||||
if cfg.Open && cfg.TrainEnds == configFlag {
|
if cfg.Open && cfg.ConfigName == configName {
|
||||||
return &cfg, nil
|
return &cfg, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
return nil, fmt.Errorf("未找到对应的车载pc连接配置")
|
return nil, fmt.Errorf("未找到对应的车载pc连接配置")
|
||||||
}
|
}
|
||||||
func (d *trainPcSimService) connTrainPcSim(ctx context.Context) {
|
|
||||||
|
/*func (d *trainPcSimService) connTrainPcSim(ctx context.Context) {
|
||||||
|
|
||||||
go func() {
|
go func() {
|
||||||
for {
|
for {
|
||||||
@ -164,10 +215,9 @@ func (d *trainPcSimService) connTrainPcSim(ctx context.Context) {
|
|||||||
d.newCloseConn(clientKey)
|
d.newCloseConn(clientKey)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
rd := d.newPcSimclientMap[clientKey]
|
rd := d.newPcSimclientMap[clientKey]
|
||||||
if rd == nil {
|
if rd == nil {
|
||||||
d.newPcSimclientMap[clientKey] = &trainPcReciverData{pcSimManage: d.trainPcSimManage, clientKey: clientKey, tcpClient: &tcp.TcpClient{}}
|
d.newPcSimclientMap[clientKey] = &TrainPcReciverData{pcSimManage: d.trainPcSimManage, clientKey: clientKey, tcpClient: &tcp.TcpClient{}}
|
||||||
}
|
}
|
||||||
if !rd.tcpClient.IsConning() {
|
if !rd.tcpClient.IsConning() {
|
||||||
d.newCloseConn(clientKey)
|
d.newCloseConn(clientKey)
|
||||||
@ -178,67 +228,83 @@ func (d *trainPcSimService) connTrainPcSim(ctx context.Context) {
|
|||||||
time.Sleep(time.Second)
|
time.Sleep(time.Second)
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
}
|
}*/
|
||||||
|
|
||||||
func (d *trainPcSimService) initConn(clientKey string) {
|
func (d *trainPcSimService) initConn(clientKey string) error {
|
||||||
|
|
||||||
rd := d.newPcSimclientMap[clientKey]
|
rd := d.newPcSimclientMap[clientKey]
|
||||||
if rd != nil && rd.tcpClient != nil && rd.tcpClient.IsConning() {
|
if rd != nil && rd.tcpClient != nil && rd.tcpClient.IsConning() {
|
||||||
return
|
return nil
|
||||||
|
} else {
|
||||||
|
rd.trainInit = false
|
||||||
|
rd.tcpClient = nil
|
||||||
}
|
}
|
||||||
rd = &trainPcReciverData{pcSimManage: d.trainPcSimManage, clientKey: clientKey, tcpClient: &tcp.TcpClient{}}
|
|
||||||
d.newPcSimclientMap[clientKey] = rd
|
|
||||||
cfg, _ := d.findConfig(clientKey)
|
|
||||||
addr := fmt.Sprintf("%v:%v", cfg.PcSimIp, cfg.PcSimPort)
|
|
||||||
|
|
||||||
client2, err := tcp.StartTcpClient(addr, rd.receiverDataHandle, d.readError)
|
cfg, cfgErr := d.findConfig(clientKey)
|
||||||
|
if cfgErr != nil {
|
||||||
|
errMsg := fmt.Sprintf("没找到对应的配置信息 key:%v", clientKey)
|
||||||
|
slog.Error(errMsg, cfgErr.Error())
|
||||||
|
rd.updateState(tpapi.ThirdPartyState_Broken)
|
||||||
|
return sys_error.New(errMsg, cfgErr)
|
||||||
|
}
|
||||||
|
addr := fmt.Sprintf("%v:%v", cfg.PcSimIp, cfg.PcSimPort)
|
||||||
|
client2, err := tcp.StartTcpClient(addr, rd.receiverDataHandle, rd.readError)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
slog.Error(fmt.Sprintf("车载pc连接失败 clientKey:%v,error:%v", clientKey, err.Error()))
|
connErrMsg := fmt.Sprintf("车载pc连接失败 clientKey:%v", clientKey)
|
||||||
d.updateState(tpapi.ThirdPartyState_Broken)
|
slog.Error(connErrMsg, err.Error())
|
||||||
|
rd.updateState(tpapi.ThirdPartyState_Broken)
|
||||||
|
return sys_error.New(connErrMsg, err)
|
||||||
} else {
|
} else {
|
||||||
rd.tcpClient = client2
|
rd.tcpClient = client2
|
||||||
}
|
}
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
func (d *trainPcSimService) Start(pcSimManage TrainPcSimManage) {
|
|
||||||
configs := pcSimManage.GetTrainPcSimConfig()
|
|
||||||
d.newPcSimclientMap = make(map[string]*trainPcReciverData)
|
|
||||||
|
|
||||||
|
func (d *trainPcSimService) Start(pcSimManage TrainPcSimManage) {
|
||||||
|
|
||||||
|
configs := pcSimManage.GetTrainPcSimConfig()
|
||||||
|
d.newPcSimclientMap = make(map[string]*TrainPcReciverData)
|
||||||
if len(configs) <= 0 {
|
if len(configs) <= 0 {
|
||||||
slog.Info("车载pc仿真配置未开启")
|
slog.Info("车载pc仿真配置未开启")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
closedCount := 0
|
closedCount := 0
|
||||||
for _, c := range configs {
|
for _, c := range configs {
|
||||||
if !c.Open {
|
if !c.Open {
|
||||||
closedCount++
|
closedCount++
|
||||||
|
} else {
|
||||||
|
ck := c.ConfigName
|
||||||
|
pcReciver := &TrainPcReciverData{clientKey: ck, pcSimManage: pcSimManage}
|
||||||
|
pcReciver.updateState(tpapi.ThirdPartyState_Closed)
|
||||||
|
d.newPcSimclientMap[ck] = pcReciver
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if closedCount == len(configs) {
|
if closedCount == len(configs) {
|
||||||
slog.Error("车载pc仿真配置未开启")
|
slog.Error("车载pc仿真配置未开启")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
//third_party.AppendService(d.findAllThirdPartState())
|
||||||
d.configs = configs
|
d.configs = configs
|
||||||
ctx, ctxFun := context.WithCancel(context.Background())
|
ctx, ctxFun := context.WithCancel(context.Background())
|
||||||
d.cancleContext = ctxFun
|
d.cancleContext = ctxFun
|
||||||
d.trainPcSimManage = pcSimManage
|
d.trainPcSimManage = pcSimManage
|
||||||
d.connTrainPcSim(ctx)
|
//d.connTrainPcSim(ctx)
|
||||||
d.updateState(tpapi.ThirdPartyState_Normal)
|
|
||||||
go d.sendTrainLocationAndSpeedTask(ctx)
|
go d.sendTrainLocationAndSpeedTask(ctx)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *trainPcSimService) Stop() {
|
func (d *trainPcSimService) Stop() {
|
||||||
d.updateState(tpapi.ThirdPartyState_Closed)
|
for _, data := range d.newPcSimclientMap {
|
||||||
|
data.updateState(tpapi.ThirdPartyState_Closed)
|
||||||
|
}
|
||||||
if d.cancleContext != nil {
|
if d.cancleContext != nil {
|
||||||
d.cancleContext()
|
d.cancleContext()
|
||||||
d.cancleContext = nil
|
d.cancleContext = nil
|
||||||
}
|
}
|
||||||
//d.closeAllConn()
|
|
||||||
d.newCloseAllConn()
|
d.newCloseAllConn()
|
||||||
}
|
}
|
||||||
func (d *trainPcSimService) CreateOrRemoveSpeedPLace(train *state_proto.TrainState) {
|
|
||||||
|
/*
|
||||||
|
func (d *trainPcSimService) CreateOrRemoveSpeedPLace(train *state_proto.TrainState) {
|
||||||
if train.ConnState.Conn && (train.ConnState.ConnType == state_proto.TrainConnState_PC_SIM_A || train.ConnState.ConnType == state_proto.TrainConnState_PC_SIM_B) {
|
if train.ConnState.Conn && (train.ConnState.ConnType == state_proto.TrainConnState_PC_SIM_A || train.ConnState.ConnType == state_proto.TrainConnState_PC_SIM_B) {
|
||||||
train.PluseCount = &state_proto.SensorSpeedPulseCount{}
|
train.PluseCount = &state_proto.SensorSpeedPulseCount{}
|
||||||
d.speedPlace = &message.TrainSpeedPlaceReportMsg{TrainId: train.Id}
|
d.speedPlace = &message.TrainSpeedPlaceReportMsg{TrainId: train.Id}
|
||||||
@ -246,55 +312,65 @@ func (d *trainPcSimService) CreateOrRemoveSpeedPLace(train *state_proto.TrainSta
|
|||||||
train.PluseCount = nil
|
train.PluseCount = nil
|
||||||
d.speedPlace = nil
|
d.speedPlace = nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
func (d *trainPcSimService) CreateOrRemoveTrain(train *state_proto.TrainState, isCreate bool) error {
|
func (d *trainPcSimService) CreateOrRemoveTrain(train *state_proto.TrainState, isCreate bool) error {
|
||||||
clientKey := FindTrainPcSimClientKey(train)
|
clientKey := FindTrainPcSimClientKey2(train)
|
||||||
d.initConn(clientKey)
|
err := d.initConn(clientKey)
|
||||||
log := "删除列车"
|
if err != nil {
|
||||||
|
d.newCloseConn(clientKey)
|
||||||
|
return err
|
||||||
|
}
|
||||||
data := []byte{message.FLAG_CAMMAND_REMOVE_TRAIN}
|
data := []byte{message.FLAG_CAMMAND_REMOVE_TRAIN}
|
||||||
if isCreate {
|
if isCreate {
|
||||||
log = "创建列车"
|
|
||||||
data[0] = message.FLAG_CAMMAND_CREATE_TRAIN
|
data[0] = message.FLAG_CAMMAND_CREATE_TRAIN
|
||||||
}
|
}
|
||||||
msg := &message.TrainPcSimBaseMessage{Data: data, Type: message.RECIVE_TRAIN_CREATE_REMOVE}
|
msg := &message.TrainPcSimBaseMessage{Data: data, Type: message.RECIVE_TRAIN_CREATE_REMOVE}
|
||||||
rd := d.newPcSimclientMap[clientKey]
|
rd := d.newPcSimclientMap[clientKey]
|
||||||
if rd != nil {
|
if rd != nil {
|
||||||
sd := msg.Encode()
|
initTrainErr := d.initTrain(rd, train, isCreate, msg)
|
||||||
slog.Info(fmt.Sprintf("%v-列车号:%v,发送数据:%v", log, train.Id, hex.EncodeToString(sd)))
|
|
||||||
err := rd.tcpClient.Send(sd)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
initTrainErr := d.initTrain(rd, train, isCreate)
|
|
||||||
if !isCreate {
|
if !isCreate {
|
||||||
d.newCloseConn(clientKey)
|
d.newCloseConn(clientKey)
|
||||||
}
|
}
|
||||||
if initTrainErr != nil {
|
if initTrainErr != nil {
|
||||||
return initTrainErr
|
return initTrainErr
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
func (d *trainPcSimService) initTrain(rd *trainPcReciverData, train *state_proto.TrainState, isCreate bool) error {
|
func (d *trainPcSimService) initTrain(rd *TrainPcReciverData, train *state_proto.TrainState, isCreate bool, trains *message.TrainPcSimBaseMessage) error {
|
||||||
msgs := make([]message.TrainPcSimBaseMessage, 0)
|
msgs := make([]message.TrainPcSimBaseMessage, 0)
|
||||||
|
sendMsg := make([]byte, 0)
|
||||||
if isCreate {
|
if isCreate {
|
||||||
|
rd.speedPlace = &message.TrainSpeedPlaceReportMsg{}
|
||||||
|
train.PluseCount = &state_proto.SensorSpeedPulseCount{}
|
||||||
|
rd.train = train
|
||||||
|
tcc := train.Tcc
|
||||||
|
tcc.LineInitTimeStamp12 = 0
|
||||||
|
tcc.Line12ConnErr = false
|
||||||
tmpMsgs := d.trainPcSimManage.ObtainTrainDigitalMockData(train)
|
tmpMsgs := d.trainPcSimManage.ObtainTrainDigitalMockData(train)
|
||||||
msgs = append(msgs, tmpMsgs...)
|
msgs = append(msgs, tmpMsgs...)
|
||||||
msgs = append(msgs, message.TrainPcSimBaseMessage{Data: []byte{}, Type: message.SENDER_TRAIN_TC_ACTIVE}) //驾驶室激活
|
msgs = append(msgs, message.TrainPcSimBaseMessage{Data: []byte{0x00}, Type: message.RECIVE_TRAIN_DOOR_MODE}) //门模式
|
||||||
msgs = append(msgs, message.TrainPcSimBaseMessage{Data: []byte{message.DRIVER_ACTIVE_REPORT, 1}, Type: message.SENDER_TRAIN_OUTR_INFO}) //驾驶室激活反馈按钮
|
msgs = append(msgs, message.TrainPcSimBaseMessage{Data: []byte{}, Type: message.RECIVE_TRAIN_BTN_CLEAR_ALL_PRE_DATA}) //清空应答器
|
||||||
} else {
|
} else {
|
||||||
|
train.VobcState.Tc1Active = false
|
||||||
|
train.VobcState.Tc2Active = false
|
||||||
|
tcc := train.Tcc
|
||||||
|
for _, key := range tcc.DriverKey {
|
||||||
|
key.Val = false
|
||||||
|
}
|
||||||
|
msgs = append(msgs, message.TrainPcSimBaseMessage{Data: []byte{message.TRAIN_BRAKE_STATE, 0}, Type: message.SENDER_TRAIN_OUTR_INFO}) //驾驶室激活
|
||||||
|
msgs = append(msgs, message.TrainPcSimBaseMessage{Data: []byte{message.KEY_STATE, 0}, Type: message.SENDER_TRAIN_OUTR_INFO}) //驾驶室激活
|
||||||
msgs = append(msgs, message.TrainPcSimBaseMessage{Data: []byte{}, Type: message.SENDER_TRAIN_TC_NOT_ACTIVE}) //驾驶室激活
|
msgs = append(msgs, message.TrainPcSimBaseMessage{Data: []byte{}, Type: message.SENDER_TRAIN_TC_NOT_ACTIVE}) //驾驶室激活
|
||||||
}
|
}
|
||||||
for _, msg := range msgs {
|
for _, msg := range msgs {
|
||||||
data := msg.Encode()
|
data := msg.Encode()
|
||||||
hexData := hex.EncodeToString(data)
|
sendMsg = append(sendMsg, data...)
|
||||||
err := rd.tcpClient.Send(data)
|
|
||||||
if err != nil {
|
|
||||||
slog.Error(fmt.Sprintf("列车设置激活%v 失败:%v", isCreate, hexData))
|
|
||||||
return fmt.Errorf(fmt.Sprintf("列车设置激活%v 失败:%v", isCreate, hex.EncodeToString(data)), err)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
sendMsg = append(sendMsg, trains.Encode()...)
|
||||||
|
hexData := hex.EncodeToString(sendMsg)
|
||||||
|
slog.Info(fmt.Sprintf("发送列车初始化消息:%v", hexData))
|
||||||
|
rd.tcpClient.Send(sendMsg)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -309,18 +385,25 @@ func (d *trainPcSimService) sendTrainLocationAndSpeedTask(ctx context.Context) {
|
|||||||
trains := d.trainPcSimManage.GetConnTrain2()
|
trains := d.trainPcSimManage.GetConnTrain2()
|
||||||
for _, train := range trains {
|
for _, train := range trains {
|
||||||
if train.ConnState.Conn && train.PluseCount != nil {
|
if train.ConnState.Conn && train.PluseCount != nil {
|
||||||
clientKey := FindTrainPcSimClientKey(train)
|
trainClient, trainDataErr := d.findTrainConn(train)
|
||||||
rd := d.newPcSimclientMap[clientKey]
|
if trainDataErr != nil {
|
||||||
|
slog.Error(fmt.Sprintf("pc仿真速度位置未找到对应的列车 id:%v", train.Id))
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
connState := tpapi.ThirdPartyState_Normal
|
||||||
|
if train.Tcc.Line12ConnErr {
|
||||||
|
connState = tpapi.ThirdPartyState_Broken
|
||||||
|
}
|
||||||
|
trainClient.updateState(connState)
|
||||||
s1, s2 := train.PluseCount.PulseCount1, train.PluseCount.PulseCount2
|
s1, s2 := train.PluseCount.PulseCount1, train.PluseCount.PulseCount2
|
||||||
d.speedPlace.ParsePulseCount1(s1, s2)
|
trainClient.speedPlace.ParsePulseCount1(s1, s2)
|
||||||
data := d.speedPlace.Encode(train.TrainRunUp, s1, s2)
|
data := trainClient.speedPlace.Encode(train.TrainRunUp, s1, s2)
|
||||||
bm := &message.TrainPcSimBaseMessage{Type: message.SENDER_TRAIN_LOCATION_INFO, Data: data}
|
bm := &message.TrainPcSimBaseMessage{Type: message.SENDER_TRAIN_LOCATION_INFO, Data: data}
|
||||||
train.PluseCount.PulseCount1 = 0
|
d.TrainPluseCountReset(train)
|
||||||
train.PluseCount.PulseCount2 = 0
|
|
||||||
dataCode := bm.Encode()
|
dataCode := bm.Encode()
|
||||||
slog.Info(fmt.Sprintf("发送列车速度位置,列车:%v,s1: %v,s2: %v,c2: %v,c2: %v,发送数据:%v", train.Id, s1, s2, d.speedPlace.PulseCount1, d.speedPlace.PulseCount2, hex.EncodeToString(dataCode)))
|
slog.Info(fmt.Sprintf("发送列车速度位置,列车:%v,s1: %v,s2: %v,c2: %v,c2: %v,发送数据:%v", train.Id, s1, s2, trainClient.speedPlace.PulseCount1, trainClient.speedPlace.PulseCount2, hex.EncodeToString(dataCode)))
|
||||||
err := rd.tcpClient.Send(dataCode)
|
err := trainClient.tcpClient.Send(dataCode)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
slog.Error(fmt.Sprintf("发送列车速度位置失败,列车:%v,发送数据:%v", train.Id, hex.EncodeToString(dataCode)))
|
slog.Error(fmt.Sprintf("发送列车速度位置失败,列车:%v,发送数据:%v", train.Id, hex.EncodeToString(dataCode)))
|
||||||
}
|
}
|
||||||
@ -334,11 +417,14 @@ func (d *trainPcSimService) sendTrainLocationAndSpeedTask(ctx context.Context) {
|
|||||||
|
|
||||||
// SendDriverActive Deprecated 发送驾驶激活
|
// SendDriverActive Deprecated 发送驾驶激活
|
||||||
func (d *trainPcSimService) SendDriverActive(train *state_proto.TrainState) {
|
func (d *trainPcSimService) SendDriverActive(train *state_proto.TrainState) {
|
||||||
|
trainClient, trainDataErr := d.findTrainConn(train)
|
||||||
|
if trainDataErr != nil {
|
||||||
|
slog.Error(fmt.Sprintf("发送驾驶激活,未找到对应的列车连接,列车id:%v", train.Id))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
vobc := train.VobcState
|
vobc := train.VobcState
|
||||||
|
|
||||||
clientKey := FindTrainPcSimClientKey(train)
|
|
||||||
//client := d.pcSimClientMap[clientKey]
|
|
||||||
rd := d.newPcSimclientMap[clientKey]
|
|
||||||
defulatBuf := make([]byte, 0)
|
defulatBuf := make([]byte, 0)
|
||||||
msg := &message.TrainPcSimBaseMessage{Data: defulatBuf}
|
msg := &message.TrainPcSimBaseMessage{Data: defulatBuf}
|
||||||
if train.TrainRunUp {
|
if train.TrainRunUp {
|
||||||
@ -354,36 +440,40 @@ func (d *trainPcSimService) SendDriverActive(train *state_proto.TrainState) {
|
|||||||
msg.Type = message.SENDER_TRAIN_TC_NOT_ACTIVE
|
msg.Type = message.SENDER_TRAIN_TC_NOT_ACTIVE
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//:"创建列车-列车号:1,发送数据:eb0050010156e4"}
|
msgs := make([]byte, 0)
|
||||||
//{,"msg":"发送驾驶激活列车","1":"数据","!BADKEY":"eb0004002437"}
|
if msg.Type == message.SENDER_TRAIN_TC_ACTIVE {
|
||||||
|
dd3 := message.TrainPcSimBaseMessage{Data: []byte{message.KEY_STATE, 1}, Type: message.SENDER_TRAIN_OUTR_INFO}
|
||||||
|
msgs = append(msgs, dd3.Encode()...)
|
||||||
|
} else {
|
||||||
|
dd3 := message.TrainPcSimBaseMessage{Data: []byte{message.KEY_STATE, 0}, Type: message.SENDER_TRAIN_OUTR_INFO}
|
||||||
|
msgs = append(msgs, dd3.Encode()...)
|
||||||
|
}
|
||||||
|
msgs = append(msgs, msg.Encode()...)
|
||||||
|
hexData := hex.EncodeToString(msgs)
|
||||||
|
slog.Info(fmt.Sprintf("发送驾驶激活列车id:%v,数据:%v", train.Id, hexData))
|
||||||
|
err := trainClient.tcpClient.Send(msgs)
|
||||||
|
|
||||||
da := msg.Encode()
|
|
||||||
slog.Info(fmt.Sprintf("发送驾驶激活列车id:%v,数据:%v", train.Id, hex.EncodeToString(da)))
|
|
||||||
err := rd.tcpClient.Send(da)
|
|
||||||
//err := client.Send(da)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
slog.Error(fmt.Sprintf("发送驾驶激活失败列车id:%v,数据:%v,err:%v", train.Id, hex.EncodeToString(da), err.Error()))
|
slog.Error(fmt.Sprintf("发送驾驶激活失败列车id:%v,数据:%v,err:%v", train.Id, hexData, err.Error()))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
func (d *trainPcSimService) SendHandleSwitch(oldTraction, oldBrakeForce int64, tractionState bool, train *state_proto.TrainState) {
|
func (d *trainPcSimService) SendHandleSwitch(oldTraction, oldBrakeForce int64, tractionState bool, train *state_proto.TrainState) {
|
||||||
|
trainClient, trainDataErr := d.findTrainConn(train)
|
||||||
|
if trainDataErr != nil {
|
||||||
|
slog.Error(fmt.Sprintf("发送列车牵引知道失败,未找到对应的列车id:%v", train.Id))
|
||||||
|
return
|
||||||
|
}
|
||||||
tc := train.ConnState
|
tc := train.ConnState
|
||||||
if tc.Conn {
|
if tc.Conn {
|
||||||
vobc := train.VobcState
|
|
||||||
clientKey := FindTrainPcSimClientKey(train)
|
|
||||||
rd := d.newPcSimclientMap[clientKey]
|
|
||||||
|
|
||||||
//client := d.pcSimClientMap[clientKey]
|
vobc := train.VobcState
|
||||||
|
|
||||||
msg := &message.TrainPcSimBaseMessage{}
|
msg := &message.TrainPcSimBaseMessage{}
|
||||||
newTraction := vobc.TractionForce
|
newTraction := vobc.TractionForce
|
||||||
//newBrake := -vobc.BrakeForce
|
|
||||||
//newOldBrakeForce := -oldBrakeForce
|
|
||||||
if tractionState {
|
if tractionState {
|
||||||
if newTraction <= oldTraction && newTraction == 0 {
|
if newTraction <= oldTraction && newTraction <= 0 {
|
||||||
//手柄取消前进
|
//手柄取消前进
|
||||||
msg.Type = message.RECIVE_TRAIN_HAND_KEY_CANCLE_FORWARD
|
msg.Type = message.RECIVE_TRAIN_HAND_KEY_CANCLE_FORWARD
|
||||||
} else if newTraction > oldTraction {
|
|
||||||
//手柄前进
|
|
||||||
msg.Type = message.SENDER_TRAIN_HAND_KEY_FORWARD
|
|
||||||
} else {
|
} else {
|
||||||
//手柄前进
|
//手柄前进
|
||||||
msg.Type = message.SENDER_TRAIN_HAND_KEY_FORWARD
|
msg.Type = message.SENDER_TRAIN_HAND_KEY_FORWARD
|
||||||
@ -393,8 +483,7 @@ func (d *trainPcSimService) SendHandleSwitch(oldTraction, oldBrakeForce int64, t
|
|||||||
/*if newBrake >= newOldBrakeForce && newBrake == 0 {
|
/*if newBrake >= newOldBrakeForce && newBrake == 0 {
|
||||||
//手柄取消后退
|
//手柄取消后退
|
||||||
msg.Type = message.RECIVE_TRAIN_HAND_KEY_CACLE_BACKWARD
|
msg.Type = message.RECIVE_TRAIN_HAND_KEY_CACLE_BACKWARD
|
||||||
} else
|
} else if newBrake < newOldBrakeForce {
|
||||||
if newBrake < newOldBrakeForce {
|
|
||||||
//手柄后退
|
//手柄后退
|
||||||
msg.Type = message.RECIVE_TRAIN_HAND_KEY_BACKWARD
|
msg.Type = message.RECIVE_TRAIN_HAND_KEY_BACKWARD
|
||||||
} else {
|
} else {
|
||||||
@ -404,16 +493,20 @@ func (d *trainPcSimService) SendHandleSwitch(oldTraction, oldBrakeForce int64, t
|
|||||||
msg.Type = message.RECIVE_TRAIN_HAND_KEY_BACKWARD
|
msg.Type = message.RECIVE_TRAIN_HAND_KEY_BACKWARD
|
||||||
}
|
}
|
||||||
da := msg.Encode()
|
da := msg.Encode()
|
||||||
slog.Info("发送列车手柄消息", "clientKey", clientKey, "msg", hex.EncodeToString(da))
|
slog.Info("发送列车手柄消息", "msg", hex.EncodeToString(da))
|
||||||
err := rd.tcpClient.Send(da)
|
err := trainClient.tcpClient.Send(da)
|
||||||
//err := client.Send(da)
|
//err := client.Send(da)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
slog.Error("发送列车手柄消息失败", "clientKey", clientKey, "msg", hex.EncodeToString(da))
|
slog.Error("发送列车手柄消息失败", "msg", hex.EncodeToString(da))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
func (d *trainPcSimService) SendTrainDirection(train *state_proto.TrainState, trainForward, trainBackward bool) {
|
func (d *trainPcSimService) SendTrainDirection(train *state_proto.TrainState, trainForward, trainBackward bool) {
|
||||||
|
trainClient, trainDataErr := d.findTrainConn(train)
|
||||||
|
if trainDataErr != nil {
|
||||||
|
slog.Error(fmt.Sprintf("发送列车方向失败,未找到列车连接,trainId:%s", train.Id))
|
||||||
|
return
|
||||||
|
}
|
||||||
baseMsgs := make([]*message.TrainPcSimBaseMessage, 0)
|
baseMsgs := make([]*message.TrainPcSimBaseMessage, 0)
|
||||||
if !trainForward && !trainBackward {
|
if !trainForward && !trainBackward {
|
||||||
baseMsgs = append(baseMsgs, &message.TrainPcSimBaseMessage{Type: message.RECIVE_TRAIN_HAND_KEY_CANCLE_FORWARD})
|
baseMsgs = append(baseMsgs, &message.TrainPcSimBaseMessage{Type: message.RECIVE_TRAIN_HAND_KEY_CANCLE_FORWARD})
|
||||||
@ -423,29 +516,31 @@ func (d *trainPcSimService) SendTrainDirection(train *state_proto.TrainState, tr
|
|||||||
} else if trainBackward {
|
} else if trainBackward {
|
||||||
baseMsgs = append(baseMsgs, &message.TrainPcSimBaseMessage{Type: message.RECIVE_TRAIN_HAND_KEY_BACKWARD})
|
baseMsgs = append(baseMsgs, &message.TrainPcSimBaseMessage{Type: message.RECIVE_TRAIN_HAND_KEY_BACKWARD})
|
||||||
}
|
}
|
||||||
clientKey := FindTrainPcSimClientKey(train)
|
|
||||||
rd := d.newPcSimclientMap[clientKey]
|
|
||||||
//client := d.pcSimClientMap[clientKey]
|
|
||||||
for _, msg := range baseMsgs {
|
for _, msg := range baseMsgs {
|
||||||
da := msg.Encode()
|
da := msg.Encode()
|
||||||
slog.Info(fmt.Sprintf("发送列车方向列车:%v ,数据:%v", train.Id, hex.EncodeToString(da)))
|
slog.Info(fmt.Sprintf("发送列车方向列车:%v ,数据:%v", train.Id, hex.EncodeToString(da)))
|
||||||
err := rd.tcpClient.Send(da)
|
err := trainClient.tcpClient.Send(da)
|
||||||
//err := client.Send(da)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
slog.Error(fmt.Sprintf("发送列车方向失败列车:%v ,数据:%v,err:%v", train.Id, hex.EncodeToString(da), err.Error()))
|
slog.Error(fmt.Sprintf("发送列车方向失败列车:%v ,数据:%v,err:%v", train.Id, hex.EncodeToString(da), err.Error()))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *trainPcSimService) SendBaliseData2(train *state_proto.TrainState, msgType byte, data []string) {
|
func (d *trainPcSimService) SendBaliseData2(train *state_proto.TrainState, msgType byte, data []string) {
|
||||||
|
trainClient, trainDataErr := d.findTrainConn(train)
|
||||||
|
if trainDataErr != nil {
|
||||||
|
slog.Error(fmt.Sprintf("发送列车PC仿真应答器信息失败2,未找到列车连接,trainId:%v", train.Id))
|
||||||
|
return
|
||||||
|
}
|
||||||
for _, hexData := range data {
|
for _, hexData := range data {
|
||||||
dd, _ := hex.DecodeString(hexData)
|
dd, _ := hex.DecodeString(hexData)
|
||||||
msg := &message.TrainPcSimBaseMessage{Type: msgType, Data: dd}
|
msg := &message.TrainPcSimBaseMessage{Type: msgType, Data: dd}
|
||||||
clientKey := FindTrainPcSimClientKey(train)
|
|
||||||
rd := d.newPcSimclientMap[clientKey]
|
|
||||||
da := msg.Encode()
|
|
||||||
slog.Info(fmt.Sprintf("发送列车PC仿真应答器信息,数据类型:0x%X,数据:%v", msgType, hex.EncodeToString(da)))
|
|
||||||
|
|
||||||
err := rd.tcpClient.Send(da)
|
da := msg.Encode()
|
||||||
|
//slog.Info(fmt.Sprintf("发送列车PC仿真应答器信息,数据类型:0x%X,数据:%v", msgType, hex.EncodeToString(da)))
|
||||||
|
err := trainClient.tcpClient.Send(da)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
slog.Info(fmt.Sprintf("发送列车PC仿真应答器信息失败,数据:%v", hex.EncodeToString(da)))
|
slog.Info(fmt.Sprintf("发送列车PC仿真应答器信息失败,数据:%v", hex.EncodeToString(da)))
|
||||||
}
|
}
|
||||||
@ -453,44 +548,65 @@ func (d *trainPcSimService) SendBaliseData2(train *state_proto.TrainState, msgTy
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (d *trainPcSimService) SendBaliseData(train *state_proto.TrainState, msgType byte, data []byte) {
|
func (d *trainPcSimService) SendBaliseData(train *state_proto.TrainState, msgType byte, data []byte) {
|
||||||
|
trainClient, trainDataErr := d.findTrainConn(train)
|
||||||
|
if trainDataErr != nil {
|
||||||
|
slog.Error(fmt.Sprintf("发送列车PC仿真应答器信息失败,未找到列车连接,trainId:%v", train.Id))
|
||||||
|
return
|
||||||
|
}
|
||||||
msg := &message.TrainPcSimBaseMessage{}
|
msg := &message.TrainPcSimBaseMessage{}
|
||||||
msg.Type = msgType
|
msg.Type = msgType
|
||||||
msg.Data = data
|
msg.Data = data
|
||||||
clientKey := FindTrainPcSimClientKey(train)
|
|
||||||
rd := d.newPcSimclientMap[clientKey]
|
|
||||||
|
|
||||||
da := msg.Encode()
|
da := msg.Encode()
|
||||||
slog.Info(fmt.Sprintf("发送列车PC仿真应答器信息,无应答器:%v,数据:%v", msgType == message.RECIVE_TRAIN_BTM_NOT_DATA, hex.EncodeToString(da)))
|
//slog.Info(fmt.Sprintf("发送列车PC仿真应答器信息,无应答器:%v,数据:%v", msgType == message.RECIVE_TRAIN_BTM_NOT_DATA, hex.EncodeToString(da)))
|
||||||
|
err := trainClient.tcpClient.Send(da)
|
||||||
err := rd.tcpClient.Send(da)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
slog.Info(fmt.Sprintf("发送列车PC仿真应答器信息失败,数据:%v", hex.EncodeToString(da)))
|
slog.Info(fmt.Sprintf("发送列车PC仿真应答器信息失败,数据:%v", hex.EncodeToString(da)))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *trainPcSimService) PublishTrainControlEvent(train *state_proto.TrainState, events []TrainControlEvent) {
|
/*func (d *trainPcSimService) PublishTrainControlEvent(train *state_proto.TrainState, events []TrainControlEvent) {
|
||||||
if len(events) <= 0 {
|
if len(events) <= 0 {
|
||||||
slog.Warn("发布事件数量为空")
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
clientKey := FindTrainPcSimClientKey(train)
|
trainClient, trainDataErr := d.findTrainConn(train)
|
||||||
rd := d.newPcSimclientMap[clientKey]
|
if trainDataErr != nil {
|
||||||
|
slog.Error("")
|
||||||
//client := d.pcSimClientMap[clientKey]
|
return
|
||||||
for _, event := range events {
|
|
||||||
msg := &message.TrainPcSimBaseMessage{}
|
|
||||||
msg.Type = message.SENDER_TRAIN_OUTR_INFO
|
|
||||||
data := []byte{event.Command, event.Status}
|
|
||||||
msg.Data = data
|
|
||||||
code := msg.Encode()
|
|
||||||
hexCode := hex.EncodeToString(code)
|
|
||||||
slog.Info(fmt.Sprintf("输出列车控制输出量,命令码位:%v 对应状态:%v,发送数据:%v", event.Command, event.Status, hexCode))
|
|
||||||
err := rd.tcpClient.Send(code)
|
|
||||||
if err != nil {
|
|
||||||
slog.Error(fmt.Sprintf("输出列车控制输出量发送失败,命令码位:%v 对应状态:%v,发送数据:%v", event.Command, event.Status, hexCode))
|
|
||||||
}
|
}
|
||||||
//client.Send(msg.Encode())
|
|
||||||
//FireTrainControlEventType.Publish(world, &event)
|
msgs := make([]byte, 0)
|
||||||
|
for _, event := range events {
|
||||||
|
msg := &message.TrainPcSimBaseMessage{Type: event.Type, Data: event.Data}
|
||||||
|
code := msg.Encode()
|
||||||
|
msgs = append(msgs, code...)
|
||||||
|
}
|
||||||
|
hexCode := hex.EncodeToString(msgs)
|
||||||
|
slog.Info(fmt.Sprintf("列车数字量信息发送数据:%v", hexCode))
|
||||||
|
err := trainClient.tcpClient.Send(msgs)
|
||||||
|
if err != nil {
|
||||||
|
slog.Error(fmt.Sprintf("列车数字量信息发送失败,数据:%v", hexCode))
|
||||||
|
}
|
||||||
|
}*/
|
||||||
|
|
||||||
|
func (d *trainPcSimService) SendTrainControlMsg(train *state_proto.TrainState, baseMessage []message.TrainPcSimBaseMessage) {
|
||||||
|
if len(baseMessage) <= 0 {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
trainClient, trainDataErr := d.findTrainConn(train)
|
||||||
|
if trainDataErr != nil {
|
||||||
|
slog.Error(fmt.Sprintf("发送列车控制信息失败,无连接,列车Id:%v", train.Id))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, msg := range baseMessage {
|
||||||
|
d.sendData(trainClient.tcpClient, msg.Encode())
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
func (d *trainPcSimService) sendData(client *tcp.TcpClient, data []byte) {
|
||||||
|
err := client.Send(data)
|
||||||
|
if err != nil {
|
||||||
|
slog.Error(fmt.Sprintf("列车数字量信息发送失败,数据:%v", err.Error()))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -12,6 +12,37 @@ const (
|
|||||||
JJZD = "JJZD" //紧急停车
|
JJZD = "JJZD" //紧急停车
|
||||||
QHFXKZ = "QHFXKZ" //驾驶方向
|
QHFXKZ = "QHFXKZ" //驾驶方向
|
||||||
QYSB = "QYSB" //牵引制动手柄
|
QYSB = "QYSB" //牵引制动手柄
|
||||||
|
|
||||||
|
ATPQCKG = "ATPQCKG" //ATP切除开关
|
||||||
|
KZM = "KZM" //开左门按钮
|
||||||
|
GZM = "GZM" //关左门按钮
|
||||||
|
GYM = "GYM" //关右门按钮
|
||||||
|
KYM = "KYM" //开右门
|
||||||
|
ZAWTGJC = "ZAWTGJC" //障碍物/脱轨检测
|
||||||
|
ZDZGZ = "ZDZGZ" //制动重故障
|
||||||
|
ATPSD = "ATPSD" //ATP上电按钮
|
||||||
|
MSQR = "MSQR" //模式确认
|
||||||
|
ZF = "ZF"
|
||||||
|
QZMYX = "QZMYX" //强制门允许
|
||||||
|
MSJJ = "MSJJ" //模式降级
|
||||||
|
MSSJ = "MSSJ" // 模式升级
|
||||||
|
HX = "HX" //唤醒按钮
|
||||||
|
JX = "JX" //检修按钮
|
||||||
|
XM = "XM" //休眠按钮
|
||||||
|
LIGHT_JJZD = JJZD
|
||||||
|
LIGHT_QQY = "QQY" //切牵引指示灯
|
||||||
|
LIGHT_JSSJH = "JSSJH" // 驾驶室激活
|
||||||
|
LIGHT_TFZDHJ = "TFZDHJ" //停放制动缓解
|
||||||
|
LIGHT_QYYX = "QYYX" // 牵引有效
|
||||||
|
LIGHT_ZDYX = "ZDYX" //制动有效
|
||||||
|
LIGHT_TFZDSJ = "TFZDSJ" //停放制动施加
|
||||||
|
LIGHT_CYZD = "CYZD" //常用制动
|
||||||
|
LIGHT_ZDGL = "ZDGL" //制动隔离
|
||||||
|
LIGHT_LSXH = "LSXH" //零速信号
|
||||||
|
LIGHT_ZMYX = "ZMYX" //左门允许
|
||||||
|
LIGHT_YMYX = "YMYX" //右门允许
|
||||||
|
LIGHT_ZFZSD = "ZFZSD" //折返指示灯
|
||||||
|
LIGHT_BDATPKC = "BDATPKC" //本段atp控车
|
||||||
)
|
)
|
||||||
|
|
||||||
// 获取列车控制图形数据
|
// 获取列车控制图形数据
|
||||||
@ -68,14 +99,17 @@ func findTrainTccGraphicDataHandler(tccG *data_proto.TccGraphicStorage, id uint3
|
|||||||
}
|
}
|
||||||
|
|
||||||
func initTrainVobc(trainLoad int64, trainIsUp bool) (*state_proto.TrainVobcState, uint32) {
|
func initTrainVobc(trainLoad int64, trainIsUp bool) (*state_proto.TrainVobcState, uint32) {
|
||||||
vobc := &state_proto.TrainVobcState{TrainLoad: int64(trainLoad), BrakingStatus: true, BrakeForce: DEFAULT_BRAKE_FORCE, DirectionForward: true}
|
vobc := &state_proto.TrainVobcState{TrainLoad: int64(trainLoad), BrakingStatus: true, BrakeForce: 100, DirectionForward: true,
|
||||||
|
AllDoorClose: true, ObstacleCheckBtn: true, RightDoorCloseCommand: true, LeftDoorCloseCommand: true, BrakeHeavyFault: true, AtpCutSwitch: true,
|
||||||
|
ConfirmBtn: true, AtpPowerOnBtn: true,
|
||||||
|
}
|
||||||
|
|
||||||
var trainActDir uint32 = 0
|
var trainActDir uint32 = 0
|
||||||
if trainIsUp {
|
if trainIsUp {
|
||||||
vobc.Tc1Active = true
|
//vobc.Tc1Active = true
|
||||||
trainActDir = 1
|
trainActDir = 1
|
||||||
} else {
|
} else {
|
||||||
//vobc.Tc1Active = true
|
//vobc.Tc2Active = true
|
||||||
vobc.Tc2Active = true
|
|
||||||
trainActDir = 2
|
trainActDir = 2
|
||||||
}
|
}
|
||||||
return vobc, trainActDir
|
return vobc, trainActDir
|
||||||
@ -98,15 +132,16 @@ func initTrainTcc(vs *VerifySimulation, runDir bool, breaking int32) *state_prot
|
|||||||
tcc.LightMaps[light.Code] = &state_proto.TrainControlState_ControlLight{Id: light.Common.Id, Val: light.InitialState}
|
tcc.LightMaps[light.Code] = &state_proto.TrainControlState_ControlLight{Id: light.Common.Id, Val: light.InitialState}
|
||||||
}
|
}
|
||||||
|
|
||||||
btns := make([]*state_proto.TrainControlState_ControlButton, 0)
|
btns := make(map[string]*state_proto.TrainControlState_ControlButton, 0)
|
||||||
for _, b := range tccGI.TccButtons {
|
for _, b := range tccGI.TccButtons {
|
||||||
btn := &state_proto.TrainControlState_ControlButton{Id: b.Common.Id, Passed: false}
|
btn := &state_proto.TrainControlState_ControlButton{Id: b.Common.Id, Passed: false}
|
||||||
if b.Code == JJZD {
|
switch b.Code {
|
||||||
btn.Passed = false
|
case ATPQCKG, GZM, GYM, ZAWTGJC, ZDZGZ, ATPSD, MSQR:
|
||||||
|
btn.Passed = true
|
||||||
}
|
}
|
||||||
btns = append(btns, btn)
|
btns[b.Code] = btn
|
||||||
|
//btns = append(btns, btn)
|
||||||
}
|
}
|
||||||
|
|
||||||
tcc.Buttons = btns
|
tcc.Buttons = btns
|
||||||
for _, b := range tccGI.TccHandles {
|
for _, b := range tccGI.TccHandles {
|
||||||
if b.Code == QYSB {
|
if b.Code == QYSB {
|
||||||
@ -117,11 +152,11 @@ func initTrainTcc(vs *VerifySimulation, runDir bool, breaking int32) *state_prot
|
|||||||
for _, b := range tccGI.TccKeys {
|
for _, b := range tccGI.TccKeys {
|
||||||
if b.GetType() == data_proto.TccKey_driverControllerActivationClint {
|
if b.GetType() == data_proto.TccKey_driverControllerActivationClint {
|
||||||
val := false
|
val := false
|
||||||
if b.Code == SKQYS1 && runDir {
|
/* if b.Code == SKQYS1 && runDir {
|
||||||
val = true
|
val = true
|
||||||
} else if b.Code == SKQYS2 && !runDir {
|
} else if b.Code == SKQYS2 && !runDir {
|
||||||
val = true
|
val = true
|
||||||
}
|
}*/
|
||||||
ds = append(ds, &state_proto.TrainControlState_DriverKeySwitch{Id: b.Common.Id, Val: val})
|
ds = append(ds, &state_proto.TrainControlState_DriverKeySwitch{Id: b.Common.Id, Val: val})
|
||||||
} else if b.GetType() == data_proto.TccKey_frontAndRearDirectionalControl {
|
} else if b.GetType() == data_proto.TccKey_frontAndRearDirectionalControl {
|
||||||
tcc.DirKey = &state_proto.TrainControlState_DirectionKeySwitch{Id: b.Common.Id, Val: uint32(message.IsTrue(true))}
|
tcc.DirKey = &state_proto.TrainControlState_DirectionKeySwitch{Id: b.Common.Id, Val: uint32(message.IsTrue(true))}
|
||||||
|
@ -146,16 +146,16 @@ func filterOtherLineDevice(data *data_proto.RtssGraphicStorage) {
|
|||||||
for _, d := range data.Section {
|
for _, d := range data.Section {
|
||||||
did := GetMapElementId(d.Common)
|
did := GetMapElementId(d.Common)
|
||||||
if otherDeviceIdMap[did] {
|
if otherDeviceIdMap[did] {
|
||||||
slog.Warn("区段[id:%v][code:%s]设备是其他线路设备已过滤", did, d.Code)
|
slog.Warn(fmt.Sprintf("区段[id:%v][code:%s]设备是其他线路设备已过滤", did, d.Code))
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if d.PaRef != nil && otherDeviceIdMap[d.PaRef.Id] {
|
if d.PaRef != nil && otherDeviceIdMap[d.PaRef.Id] {
|
||||||
d.PaRef = nil
|
d.PaRef = nil
|
||||||
slog.Warn("区段[id:%v][code:%s]设备A端是其他线路设备已置空", did, d.Code)
|
slog.Warn(fmt.Sprintf("区段[id:%v][code:%s]设备A端是其他线路设备已置空", did, d.Code))
|
||||||
}
|
}
|
||||||
if d.PbRef != nil && otherDeviceIdMap[d.PbRef.Id] {
|
if d.PbRef != nil && otherDeviceIdMap[d.PbRef.Id] {
|
||||||
d.PbRef = nil
|
d.PbRef = nil
|
||||||
slog.Warn("区段[id:%v][code:%s]设备B端是其他线路设备已置空", did, d.Code)
|
slog.Warn(fmt.Sprintf("区段[id:%v][code:%s]设备B端是其他线路设备已置空", did, d.Code))
|
||||||
}
|
}
|
||||||
var acs []uint32
|
var acs []uint32
|
||||||
for _, id := range d.AxleCountings {
|
for _, id := range d.AxleCountings {
|
||||||
@ -176,7 +176,7 @@ func filterOtherLineDevice(data *data_proto.RtssGraphicStorage) {
|
|||||||
for _, d := range data.AxleCountings {
|
for _, d := range data.AxleCountings {
|
||||||
did := GetMapElementId(d.Common)
|
did := GetMapElementId(d.Common)
|
||||||
if otherDeviceIdMap[did] {
|
if otherDeviceIdMap[did] {
|
||||||
slog.Warn("计轴[id:%v][code:%s]设备其他线路设备已过滤", did, d.Code)
|
slog.Warn(fmt.Sprintf("计轴[id:%v][code:%s]设备其他线路设备已过滤", did, d.Code))
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
var refs []*data_proto.RelatedRef
|
var refs []*data_proto.RelatedRef
|
||||||
@ -195,20 +195,20 @@ func filterOtherLineDevice(data *data_proto.RtssGraphicStorage) {
|
|||||||
for _, d := range data.Turnouts {
|
for _, d := range data.Turnouts {
|
||||||
did := GetMapElementId(d.Common)
|
did := GetMapElementId(d.Common)
|
||||||
if otherDeviceIdMap[did] {
|
if otherDeviceIdMap[did] {
|
||||||
slog.Warn("道岔[id:%v][code:%s]设备其他线路设备已过滤", did, d.Code)
|
slog.Warn(fmt.Sprintf("道岔[id:%v][code:%s]设备其他线路设备已过滤", did, d.Code))
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if d.PaRef != nil && otherDeviceIdMap[d.PaRef.Id] {
|
if d.PaRef != nil && otherDeviceIdMap[d.PaRef.Id] {
|
||||||
d.PaRef = nil
|
d.PaRef = nil
|
||||||
slog.Warn("道岔[id:%v][code:%s]设备A端是其他线路设备已置空", did, d.Code)
|
slog.Warn(fmt.Sprintf("道岔[id:%v][code:%s]设备A端是其他线路设备已置空", did, d.Code))
|
||||||
}
|
}
|
||||||
if d.PbRef != nil && otherDeviceIdMap[d.PbRef.Id] {
|
if d.PbRef != nil && otherDeviceIdMap[d.PbRef.Id] {
|
||||||
d.PbRef = nil
|
d.PbRef = nil
|
||||||
slog.Warn("道岔[id:%v][code:%s]设备B端是其他线路设备已置空", did, d.Code)
|
slog.Warn(fmt.Sprintf("道岔[id:%v][code:%s]设备B端是其他线路设备已置空", did, d.Code))
|
||||||
}
|
}
|
||||||
if d.PcRef != nil && otherDeviceIdMap[d.PcRef.Id] {
|
if d.PcRef != nil && otherDeviceIdMap[d.PcRef.Id] {
|
||||||
d.PcRef = nil
|
d.PcRef = nil
|
||||||
slog.Warn("道岔[id:%v][code:%s]设备C端是其他线路设备已置空", did, d.Code)
|
slog.Warn(fmt.Sprintf("道岔[id:%v][code:%s]设备C端是其他线路设备已置空", did, d.Code))
|
||||||
}
|
}
|
||||||
if d.PaTrackSectionId != 0 && otherDeviceIdMap[d.PaTrackSectionId] {
|
if d.PaTrackSectionId != 0 && otherDeviceIdMap[d.PaTrackSectionId] {
|
||||||
d.PaTrackSectionId = 0
|
d.PaTrackSectionId = 0
|
||||||
@ -227,7 +227,7 @@ func filterOtherLineDevice(data *data_proto.RtssGraphicStorage) {
|
|||||||
for _, d := range data.Signals {
|
for _, d := range data.Signals {
|
||||||
did := GetMapElementId(d.Common)
|
did := GetMapElementId(d.Common)
|
||||||
if otherDeviceIdMap[did] {
|
if otherDeviceIdMap[did] {
|
||||||
slog.Warn("信号机[id:%v][code:%s]设备其他线路设备已过滤", did, d.Code)
|
slog.Warn(fmt.Sprintf("信号机[id:%v][code:%s]设备其他线路设备已过滤", did, d.Code))
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
signals = append(signals, d)
|
signals = append(signals, d)
|
||||||
@ -238,7 +238,7 @@ func filterOtherLineDevice(data *data_proto.RtssGraphicStorage) {
|
|||||||
for _, d := range data.Transponders {
|
for _, d := range data.Transponders {
|
||||||
did := GetMapElementId(d.Common)
|
did := GetMapElementId(d.Common)
|
||||||
if otherDeviceIdMap[did] {
|
if otherDeviceIdMap[did] {
|
||||||
slog.Warn("应答器[id:%v][code:%s]设备其他线路设备已过滤", did, d.Code)
|
slog.Warn(fmt.Sprintf("应答器[id:%v][code:%s]设备其他线路设备已过滤", did, d.Code))
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
transponders = append(transponders, d)
|
transponders = append(transponders, d)
|
||||||
|
@ -5,8 +5,8 @@ import (
|
|||||||
"joylink.club/bj-rtsts-server/dto/common_proto"
|
"joylink.club/bj-rtsts-server/dto/common_proto"
|
||||||
"joylink.club/bj-rtsts-server/service"
|
"joylink.club/bj-rtsts-server/service"
|
||||||
"joylink.club/bj-rtsts-server/third_party/can_btm"
|
"joylink.club/bj-rtsts-server/third_party/can_btm"
|
||||||
|
"joylink.club/bj-rtsts-server/third_party/train_pc_sim"
|
||||||
"log/slog"
|
"log/slog"
|
||||||
"math"
|
|
||||||
"reflect"
|
"reflect"
|
||||||
"strconv"
|
"strconv"
|
||||||
"time"
|
"time"
|
||||||
@ -143,17 +143,18 @@ func TrainConnTypeUpdate(vs *VerifySimulation, ct *dto.TrainConnThirdDto) {
|
|||||||
panic(sys_error.New(fmt.Sprintf("列车【%s】不存在", ct.Id)))
|
panic(sys_error.New(fmt.Sprintf("列车【%s】不存在", ct.Id)))
|
||||||
}
|
}
|
||||||
train := data.(*state_proto.TrainState)
|
train := data.(*state_proto.TrainState)
|
||||||
|
if train.DynamicState.Speed != 0 {
|
||||||
|
panic(sys_error.New(fmt.Sprintf("列车[%s]需要停稳才能连接半实物", train.Id)))
|
||||||
|
}
|
||||||
if ct.ConnType != state_proto.TrainConnState_NONE {
|
if ct.ConnType != state_proto.TrainConnState_NONE {
|
||||||
//列车连接 半实物或车载pc仿真
|
//列车连接 半实物或车载pc仿真
|
||||||
allTrainMap.Range(func(k, v any) bool {
|
allTrainMap.Range(func(k, v any) bool {
|
||||||
tmpTrain := v.(*state_proto.TrainState)
|
tmpTrain := v.(*state_proto.TrainState)
|
||||||
if tmpTrain.ConnState.Conn {
|
connState := tmpTrain.ConnState
|
||||||
|
if connState.Conn {
|
||||||
connTypeName := "半实物"
|
connTypeName := "半实物"
|
||||||
if tmpTrain.ConnState.ConnType == state_proto.TrainConnState_PC_SIM_A {
|
if connState.ConnType == state_proto.TrainConnState_PC_SIM && connState.TypeName == ct.TypeName {
|
||||||
connTypeName = "车载pc仿真-A"
|
connTypeName = fmt.Sprintf("车载pc仿真-%v", ct.TypeName)
|
||||||
} else if tmpTrain.ConnState.ConnType == state_proto.TrainConnState_PC_SIM_B {
|
|
||||||
connTypeName = "车载pc仿真-B"
|
|
||||||
}
|
}
|
||||||
panic(sys_error.New(fmt.Sprintf("列车[%s]已经连接 [%v],此列车无法连接", k, connTypeName)))
|
panic(sys_error.New(fmt.Sprintf("列车[%s]已经连接 [%v],此列车无法连接", k, connTypeName)))
|
||||||
return false
|
return false
|
||||||
@ -163,7 +164,9 @@ func TrainConnTypeUpdate(vs *VerifySimulation, ct *dto.TrainConnThirdDto) {
|
|||||||
}
|
}
|
||||||
train.ConnState.Conn = true
|
train.ConnState.Conn = true
|
||||||
train.ConnState.ConnType = ct.ConnType
|
train.ConnState.ConnType = ct.ConnType
|
||||||
if ct.ConnType == state_proto.TrainConnState_PC_SIM_A || ct.ConnType == state_proto.TrainConnState_PC_SIM_B {
|
train.ConnState.TypeName = ct.TypeName
|
||||||
|
if ct.ConnType == state_proto.TrainConnState_PC_SIM {
|
||||||
|
train.Tcc.LineInitTimeStamp12 = 0
|
||||||
err := TrainPcSimConnOrRemoveHandle(train, true)
|
err := TrainPcSimConnOrRemoveHandle(train, true)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
train.ConnState.Conn = false
|
train.ConnState.Conn = false
|
||||||
@ -177,6 +180,7 @@ func TrainConnTypeUpdate(vs *VerifySimulation, ct *dto.TrainConnThirdDto) {
|
|||||||
|
|
||||||
// 列车断开三方连接
|
// 列车断开三方连接
|
||||||
func TrainUnConn(vs *VerifySimulation, trainId string) {
|
func TrainUnConn(vs *VerifySimulation, trainId string) {
|
||||||
|
|
||||||
allTrainMap := &vs.Memory.Status.TrainStateMap
|
allTrainMap := &vs.Memory.Status.TrainStateMap
|
||||||
data, ok := allTrainMap.Load(trainId)
|
data, ok := allTrainMap.Load(trainId)
|
||||||
if !ok {
|
if !ok {
|
||||||
@ -187,8 +191,11 @@ func TrainUnConn(vs *VerifySimulation, trainId string) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
panic(sys_error.New("未连接车载PC仿真,无法断开连接"))
|
panic(sys_error.New("未连接车载PC仿真,无法断开连接"))
|
||||||
}
|
}
|
||||||
|
defer func() {
|
||||||
train.ConnState.Conn = false
|
train.ConnState.Conn = false
|
||||||
train.ConnState.ConnType = state_proto.TrainConnState_NONE
|
train.ConnState.ConnType = state_proto.TrainConnState_NONE
|
||||||
|
train.ConnState.TypeName = ""
|
||||||
|
}()
|
||||||
}
|
}
|
||||||
func createOrUpdateStateDynamicConfig(trainState *state_proto.TrainState, configTrainData dto.ConfigTrainData, trainEndsA dto.ConfigTrainEnds,
|
func createOrUpdateStateDynamicConfig(trainState *state_proto.TrainState, configTrainData dto.ConfigTrainData, trainEndsA dto.ConfigTrainEnds,
|
||||||
trainEndsB dto.ConfigTrainEnds) {
|
trainEndsB dto.ConfigTrainEnds) {
|
||||||
@ -407,50 +414,12 @@ func handleTrainPositionFromDynamic(vs *VerifySimulation, info *message.Dynamics
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// 接受动力学时间15毫米
|
|
||||||
const RECEIVE_DYNAMIC_DATA_RATE = 15
|
|
||||||
|
|
||||||
func formatSpeedTime(s int32) int32 {
|
|
||||||
//d3, _ := strconv.ParseFloat(fmt.Sprintf("%.2f", s), 64)
|
|
||||||
return int32(math.Abs(math.Round(float64(s))))
|
|
||||||
}
|
|
||||||
func formatSpeedTime2(s int32) uint32 {
|
|
||||||
return uint32(math.Abs(float64(float32(s) / 3.6 / 100 * 1000)))
|
|
||||||
}
|
|
||||||
|
|
||||||
const (
|
|
||||||
aa = 0x79
|
|
||||||
)
|
|
||||||
|
|
||||||
func pluseCount(sta *state_proto.TrainState, h1, h2, t1, t2 float32) {
|
func pluseCount(sta *state_proto.TrainState, h1, h2, t1, t2 float32) {
|
||||||
if sta.PluseCount == nil {
|
if sta.PluseCount == nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if sta.TrainRunUp {
|
train_pc_sim.Default().TrainPluseCount(sta, h1, h2, t1, t2)
|
||||||
//p1 := formatSpeedTime2(sta.DynamicState.HeadSensorSpeed1)
|
|
||||||
//p2 := formatSpeedTime2(sta.DynamicState.HeadSensorSpeed2)
|
|
||||||
|
|
||||||
//p1 := uint32(formatSpeedTime(sta.DynamicState.HeadSensorSpeed1 * RECEIVE_DYNAMIC_DATA_RATE))
|
|
||||||
//p2 := uint32(formatSpeedTime(sta.DynamicState.HeadSensorSpeed2 * RECEIVE_DYNAMIC_DATA_RATE))
|
|
||||||
|
|
||||||
if sta.TrainEndsA.SpeedSensorEnableA {
|
|
||||||
sta.PluseCount.PulseCount1 = sta.PluseCount.PulseCount1 + uint32(h1*1000*0.08)
|
|
||||||
}
|
|
||||||
if sta.TrainEndsA.SpeedSensorEnableB {
|
|
||||||
sta.PluseCount.PulseCount2 = sta.PluseCount.PulseCount2 + uint32(h2*1000*0.08)
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
//t1 := uint32(formatSpeedTime(sta.DynamicState.TailSensorSpeed1 * RECEIVE_DYNAMIC_DATA_RATE))
|
|
||||||
//t2 := uint32(formatSpeedTime(sta.DynamicState.TailSensorSpeed2 * RECEIVE_DYNAMIC_DATA_RATE))
|
|
||||||
//t1 := formatSpeedTime2(sta.DynamicState.HeadSensorSpeed1)
|
|
||||||
//t2 := formatSpeedTime2(sta.DynamicState.HeadSensorSpeed2)
|
|
||||||
if sta.TrainEndsB.SpeedSensorEnableA {
|
|
||||||
sta.PluseCount.PulseCount1 = sta.PluseCount.PulseCount1 + uint32(t1*1000*0.08)
|
|
||||||
}
|
|
||||||
if sta.TrainEndsB.SpeedSensorEnableB {
|
|
||||||
sta.PluseCount.PulseCount2 = sta.PluseCount.PulseCount2 + uint32(t2*1000*0.08)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
func RemoveAllTrain(vs *VerifySimulation) {
|
func RemoveAllTrain(vs *VerifySimulation) {
|
||||||
allTrainMap := &vs.Memory.Status.TrainStateMap
|
allTrainMap := &vs.Memory.Status.TrainStateMap
|
||||||
@ -473,12 +442,16 @@ func removeTrain(vs *VerifySimulation, trainId string, train *state_proto.TrainS
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if train.ConnState.Conn {
|
thirdConn := train.ConnState
|
||||||
train.ConnState.Conn = false
|
if thirdConn.Conn {
|
||||||
|
thirdConn.Conn = false
|
||||||
err = TrainPcSimConnOrRemoveHandle(train, false)
|
err = TrainPcSimConnOrRemoveHandle(train, false)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
train.ConnState.Conn = true
|
train.ConnState.Conn = true
|
||||||
return err
|
return err
|
||||||
|
} else {
|
||||||
|
thirdConn.ConnType = state_proto.TrainConnState_NONE
|
||||||
|
thirdConn.TypeName = ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if train.VobcState != nil {
|
if train.VobcState != nil {
|
||||||
@ -489,7 +462,7 @@ func removeTrain(vs *VerifySimulation, trainId string, train *state_proto.TrainS
|
|||||||
vobc.BrakeForce = DEFAULT_BRAKE_FORCE
|
vobc.BrakeForce = DEFAULT_BRAKE_FORCE
|
||||||
}
|
}
|
||||||
train.Show = false
|
train.Show = false
|
||||||
train.ConnState.ConnType = state_proto.TrainConnState_NONE
|
|
||||||
return fi.RemoveTrainFromWorld(vs.World, trainId)
|
return fi.RemoveTrainFromWorld(vs.World, trainId)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -532,16 +532,12 @@ func (s *VerifySimulation) CollectInterlockRelayInfo(code string) *message.Inter
|
|||||||
func (s *VerifySimulation) FindTrainConnTypes() []dto.TrainConnTypeConfigDto {
|
func (s *VerifySimulation) FindTrainConnTypes() []dto.TrainConnTypeConfigDto {
|
||||||
typeConfig := make([]dto.TrainConnTypeConfigDto, 0)
|
typeConfig := make([]dto.TrainConnTypeConfigDto, 0)
|
||||||
if /*s.runConfig.Vobc.Open &&*/ s.runConfig.Vobc.Ip != "" {
|
if /*s.runConfig.Vobc.Open &&*/ s.runConfig.Vobc.Ip != "" {
|
||||||
typeConfig = append(typeConfig, dto.TrainConnTypeConfigDto{ConnType: state_proto.TrainConnState_VOBC})
|
typeConfig = append(typeConfig, dto.TrainConnTypeConfigDto{TypeName: "半实物vobc", ConnType: state_proto.TrainConnState_VOBC})
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, pcSim := range s.runConfig.PcSimConfigs {
|
for _, pcSim := range s.runConfig.PcSimConfigs {
|
||||||
dto := dto.TrainConnTypeConfigDto{ConnType: state_proto.TrainConnState_PC_SIM_A}
|
|
||||||
if !pcSim.TrainEnds {
|
typeConfig = append(typeConfig, dto.TrainConnTypeConfigDto{TypeName: pcSim.ConfigName, ConnType: state_proto.TrainConnState_PC_SIM})
|
||||||
dd := &dto
|
|
||||||
dd.ConnType = state_proto.TrainConnState_PC_SIM_B
|
|
||||||
}
|
|
||||||
typeConfig = append(typeConfig, dto)
|
|
||||||
}
|
}
|
||||||
/* if s.runConfig.PcSimConfig.Open {
|
/* if s.runConfig.PcSimConfig.Open {
|
||||||
typeConfig = append(typeConfig, dto.TrainConnTypeConfigDto{ConnType: state_proto.TrainConnState_PC_SIM})
|
typeConfig = append(typeConfig, dto.TrainConnTypeConfigDto{ConnType: state_proto.TrainConnState_PC_SIM})
|
||||||
|
@ -38,25 +38,32 @@ func ControlTrainUpdate(s *VerifySimulation, ct *request_proto.TrainControl) {
|
|||||||
sta := data.(*state_proto.TrainState)
|
sta := data.(*state_proto.TrainState)
|
||||||
vobc := sta.VobcState
|
vobc := sta.VobcState
|
||||||
tcc := sta.Tcc
|
tcc := sta.Tcc
|
||||||
var tce []train_pc_sim.TrainControlEvent = nil
|
|
||||||
|
var baseMsg []message.TrainPcSimBaseMessage = nil
|
||||||
if ct.ControlType == request_proto.TrainControl_EMERGENT_BUTTON {
|
if ct.ControlType == request_proto.TrainControl_EMERGENT_BUTTON {
|
||||||
//tce = trainControlEB(vobc, tcc, ct.Button, ct.DeviceId, tccGraphicData)
|
baseMsg = trainControlButton(vobc, tcc.Buttons, ct.DeviceId, ct.ControlButton.Active, tccGraphicData)
|
||||||
tce = trainControlButton(vobc, tcc.Buttons, ct.DeviceId, ct.ControlButton.Active, tccGraphicData)
|
|
||||||
} else if ct.ControlType == request_proto.TrainControl_DRIVER_KEY_SWITCH {
|
} else if ct.ControlType == request_proto.TrainControl_DRIVER_KEY_SWITCH {
|
||||||
tce = trainControlDriverKey(sta, ct.DriverKey, ct.DeviceId, tccGraphicData)
|
baseMsg = trainControlDriverKey(sta, ct.DriverKey, ct.DeviceId, tccGraphicData)
|
||||||
//train_pc_sim.Default().SendDriverActive(sta)
|
train_pc_sim.Default().SendDriverActive(sta)
|
||||||
} else if ct.ControlType == request_proto.TrainControl_DIRECTION_KEY_SWITCH {
|
} else if ct.ControlType == request_proto.TrainControl_DIRECTION_KEY_SWITCH {
|
||||||
tce = trainControlDirKey(sta.DynamicState.Speed, vobc, tcc, ct.DirKey, ct.DeviceId, tccGraphicData)
|
baseMsg = trainControlDirKey(sta.DynamicState.Speed, vobc, tcc, ct.DirKey, ct.DeviceId, tccGraphicData)
|
||||||
//此处先注释,根据现场调试情况 2024-4-16
|
//此处先注释,根据现场调试情况 2024-4-16
|
||||||
train_pc_sim.Default().SendTrainDirection(sta, sta.VobcState.DirectionForward, sta.VobcState.DirectionBackward)
|
train_pc_sim.Default().SendTrainDirection(sta, sta.VobcState.DirectionForward, sta.VobcState.DirectionBackward)
|
||||||
} else if ct.ControlType == request_proto.TrainControl_HANDLER {
|
} else if ct.ControlType == request_proto.TrainControl_HANDLER {
|
||||||
|
if vobc.Tc1Active && vobc.Tc2Active {
|
||||||
|
panic(sys_error.New("TC1和TC2都未激活不能搬动牵引制动手柄 "))
|
||||||
|
}
|
||||||
oldTraction := sta.VobcState.TractionForce
|
oldTraction := sta.VobcState.TractionForce
|
||||||
oldBrakeForce := sta.VobcState.BrakeForce
|
oldBrakeForce := sta.VobcState.BrakeForce
|
||||||
isTraction := ct.Handler.Val > 0 //是否制动
|
isTraction := ct.Handler.Val > 0 //是否制动
|
||||||
tce = trainControlHandle(vobc, tcc, ct.Handler, ct.DeviceId, tccGraphicData)
|
baseMsg = trainControlHandle(vobc, tcc, ct.Handler, ct.DeviceId, tccGraphicData)
|
||||||
train_pc_sim.Default().SendHandleSwitch(oldTraction, oldBrakeForce, isTraction, sta)
|
train_pc_sim.Default().SendHandleSwitch(oldTraction, oldBrakeForce, isTraction, sta)
|
||||||
}
|
}
|
||||||
|
if vobc.DirectionForward && vobc.TractionForce == 0 {
|
||||||
|
baseMsg = append(baseMsg, message.TrainPcSimBaseMessage{Type: message.SENDER_TRAIN_OUTR_INFO, Data: []byte{message.DIR_ZERO_FORWARD, 1}})
|
||||||
|
} else {
|
||||||
|
baseMsg = append(baseMsg, message.TrainPcSimBaseMessage{Type: message.SENDER_TRAIN_OUTR_INFO, Data: []byte{message.DIR_ZERO_FORWARD, 0}})
|
||||||
|
}
|
||||||
if !vobc.DirectionForward && !vobc.DirectionBackward {
|
if !vobc.DirectionForward && !vobc.DirectionBackward {
|
||||||
vobc.TractionStatus = false
|
vobc.TractionStatus = false
|
||||||
vobc.TractionForce = 0
|
vobc.TractionForce = 0
|
||||||
@ -64,62 +71,56 @@ func ControlTrainUpdate(s *VerifySimulation, ct *request_proto.TrainControl) {
|
|||||||
if vobc.EmergencyBrakingStatus {
|
if vobc.EmergencyBrakingStatus {
|
||||||
vobc.TractionForce = 0
|
vobc.TractionForce = 0
|
||||||
}
|
}
|
||||||
if sta.ConnState.Conn && (sta.ConnState.ConnType == state_proto.TrainConnState_PC_SIM_A || sta.ConnState.ConnType == state_proto.TrainConnState_PC_SIM_B) && tce != nil {
|
if sta.ConnState.Conn && (sta.ConnState.ConnType == state_proto.TrainConnState_PC_SIM) && baseMsg != nil {
|
||||||
train_pc_sim.Default().PublishTrainControlEvent(sta, tce)
|
train_pc_sim.Default().SendTrainControlMsg(sta, baseMsg)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func findBtnFromTccByDeviceId(tcc []*state_proto.TrainControlState_ControlButton, deviceId uint32) (*state_proto.TrainControlState_ControlButton, bool) {
|
func trainControlButton(vobc *state_proto.TrainVobcState, buttonMap map[string]*state_proto.TrainControlState_ControlButton, deviceId uint32, active bool, tccGraphic *data_proto.TccGraphicStorage) []message.TrainPcSimBaseMessage {
|
||||||
for _, tccBtn := range tcc {
|
|
||||||
if tccBtn.Id == deviceId {
|
|
||||||
return tccBtn, true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nil, false
|
|
||||||
}
|
|
||||||
func trainControlButton(vobc *state_proto.TrainVobcState, tcc []*state_proto.TrainControlState_ControlButton, deviceId uint32, active bool, tccGraphic *data_proto.TccGraphicStorage) []train_pc_sim.TrainControlEvent {
|
|
||||||
if graphicBtn, ok := findTrainTccGraphicDataButton(tccGraphic, deviceId); ok {
|
if graphicBtn, ok := findTrainTccGraphicDataButton(tccGraphic, deviceId); ok {
|
||||||
btn, btnOk := findBtnFromTccByDeviceId(tcc, deviceId)
|
btn := buttonMap[graphicBtn.Code]
|
||||||
if btnOk == false {
|
if btn == nil {
|
||||||
slog.Error("未找到对应的车载摁钮code:", graphicBtn.Code, "设备id:", deviceId)
|
slog.Error("未找到对应的车载摁钮code:", graphicBtn.Code, "设备id:", deviceId)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
switch graphicBtn.Code {
|
switch graphicBtn.Code {
|
||||||
case "JJZD": // 紧急制动
|
case JJZD: // 紧急制动
|
||||||
return controlEBBtn(vobc, active, btn)
|
return controlEBBtn(vobc, active, btn)
|
||||||
case "ATPQCKG": //atp切除
|
case ATPQCKG: //atp切除
|
||||||
return controlAtpBtn(vobc, active, btn)
|
return controlAtpBtn(vobc, active, btn)
|
||||||
case "WBJJZDFK": //外部紧急制动反馈
|
/* case "WBJJZDFK": //外部紧急制动反馈
|
||||||
return controlOutEbReportBtn(vobc, active, btn)
|
return controlOutEbReportBtn(vobc, active, btn)*/
|
||||||
case "KZM": //开左门按钮
|
case KZM: //开左门按钮
|
||||||
return controlLeftDoorBtn(vobc, active, btn)
|
return controlLeftDoorBtn(vobc, active, btn)
|
||||||
case "GZM": //关左门按钮
|
case GZM: //关左门按钮
|
||||||
return controlLeftDoorCloseBtn(vobc, active, btn)
|
return controlLeftDoorCloseBtn(vobc, active, btn)
|
||||||
case "KYM": //开右门按钮
|
case KYM: //开右门按钮
|
||||||
return controlRightDoorBtn(vobc, active, btn)
|
return controlRightDoorBtn(vobc, active, btn)
|
||||||
case "GYM": //关右门按钮
|
case GYM: //关右门按钮
|
||||||
return controlRightDoorCloseBtn(vobc, active, btn)
|
return controlRightDoorCloseBtn(vobc, active, btn)
|
||||||
case "ZF": //折返按钮
|
case ZF: //折返按钮
|
||||||
return controlReverseBtn(vobc, active, btn)
|
return controlReverseBtn(vobc, active, btn)
|
||||||
case "QZMYX": //强制门允许
|
case QZMYX: //强制门允许
|
||||||
return controlDoorAllowBtn(vobc, active, btn)
|
return controlDoorAllowBtn(vobc, active, btn)
|
||||||
case "MSJJ": //模式降级按钮
|
case MSJJ: //模式降级按钮
|
||||||
return controlModeDownBtn(vobc, active, btn)
|
return controlModeDownBtn(vobc, active, btn)
|
||||||
case "MSSJ": //模式升级按钮
|
case MSSJ: //模式升级按钮
|
||||||
return controlModeUpBtn(vobc, active, btn)
|
return controlModeUpBtn(vobc, active, btn)
|
||||||
case "MSQR": //模式确认按钮
|
case MSQR: //模式确认按钮
|
||||||
return controlModeConfirmBtn(vobc, active, btn)
|
return controlModeConfirmBtn(vobc, active, btn)
|
||||||
case "ZAWTGJC": //障碍物/脱轨检测
|
case ZAWTGJC: //障碍物/脱轨检测
|
||||||
return controlObstacleDetectionBtn(vobc, active, btn)
|
return controlObstacleDetectionBtn(vobc, active, btn)
|
||||||
case "ZDZGZ": //制动重故障
|
case ZDZGZ: //制动重故障
|
||||||
return controlBrakeHeavyBtn(vobc, active, btn)
|
return controlBrakeHeavyBtn(vobc, active, btn)
|
||||||
case "ATPSD": //ATP上电按钮
|
case ATPSD: //ATP上电按钮
|
||||||
return controlAtpPowerBtn(vobc, active, btn)
|
return controlAtpPowerBtn(vobc, active, btn)
|
||||||
case "HX": //唤醒按钮
|
case HX: //唤醒按钮
|
||||||
return controlWakeUpBtn(vobc, active, btn)
|
return controlWakeUpBtn(vobc, active, btn)
|
||||||
case "JX": //检修按钮
|
case JX: //检修按钮
|
||||||
return controlOverhaulBtn(vobc, active, btn)
|
return controlOverhaulBtn(vobc, active, btn)
|
||||||
case "XM": //休眠按钮
|
case XM: //休眠按钮
|
||||||
return controlSleepBtn(vobc, active, btn)
|
return controlSleepBtn(vobc, active, btn)
|
||||||
default:
|
default:
|
||||||
return nil
|
return nil
|
||||||
@ -130,7 +131,7 @@ func trainControlButton(vobc *state_proto.TrainVobcState, tcc []*state_proto.Tra
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 应急摁钮
|
// 应急摁钮
|
||||||
func controlEBBtn(vobc *state_proto.TrainVobcState, active bool, tccBtn *state_proto.TrainControlState_ControlButton) []train_pc_sim.TrainControlEvent {
|
func controlEBBtn(vobc *state_proto.TrainVobcState, active bool, tccBtn *state_proto.TrainControlState_ControlButton) []message.TrainPcSimBaseMessage {
|
||||||
if !active {
|
if !active {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@ -138,198 +139,197 @@ func controlEBBtn(vobc *state_proto.TrainVobcState, active bool, tccBtn *state_p
|
|||||||
vobc.EmergencyBrakingStatus = true
|
vobc.EmergencyBrakingStatus = true
|
||||||
vobc.TractionForce = 0
|
vobc.TractionForce = 0
|
||||||
vobc.BrakeForce = DEFAULT_BRAKE_FORCE
|
vobc.BrakeForce = DEFAULT_BRAKE_FORCE
|
||||||
return []train_pc_sim.TrainControlEvent{{Command: message.OUTER_EMERGENCY_BRAKE, Status: 1}, {Command: message.TRAIN_BRAKE_STATE, Status: 1}} //紧急制动
|
return []message.TrainPcSimBaseMessage{{Type: message.SENDER_TRAIN_OUTR_INFO, Data: []byte{message.OUTER_EMERGENCY_BRAKE, 0}}, {Type: message.SENDER_TRAIN_OUTR_INFO, Data: []byte{message.TRAIN_BRAKE_STATE, 1}}}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// atp 切除
|
// atp 切除
|
||||||
func controlAtpBtn(vobc *state_proto.TrainVobcState, active bool, tccBtn *state_proto.TrainControlState_ControlButton) []train_pc_sim.TrainControlEvent {
|
func controlAtpBtn(vobc *state_proto.TrainVobcState, active bool, tccBtn *state_proto.TrainControlState_ControlButton) []message.TrainPcSimBaseMessage {
|
||||||
var status byte = 0
|
var status byte = 0
|
||||||
if active {
|
if active {
|
||||||
status = 1
|
status = 1
|
||||||
}
|
}
|
||||||
vobc.AtpCutSwitch = active
|
vobc.AtpCutSwitch = active
|
||||||
tccBtn.Passed = active
|
tccBtn.Passed = active
|
||||||
return []train_pc_sim.TrainControlEvent{{Command: message.ATP_CUT, Status: status}} //紧急制动
|
return []message.TrainPcSimBaseMessage{{Type: message.SENDER_TRAIN_OUTR_INFO, Data: []byte{message.ATP_CUT, status}}}
|
||||||
}
|
|
||||||
|
|
||||||
// 外部紧急制动反馈
|
|
||||||
func controlOutEbReportBtn(vobc *state_proto.TrainVobcState, active bool, tccBtn *state_proto.TrainControlState_ControlButton) []train_pc_sim.TrainControlEvent {
|
|
||||||
var status byte = 0
|
|
||||||
if active {
|
|
||||||
status = 1
|
|
||||||
}
|
|
||||||
vobc.OuterEmergentBrakeReport = active
|
|
||||||
tccBtn.Passed = active
|
|
||||||
return []train_pc_sim.TrainControlEvent{{Command: message.OUTER_EMERGENCY_BRAKE, Status: status}} //紧急制动
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 开左门按钮
|
// 开左门按钮
|
||||||
func controlLeftDoorBtn(vobc *state_proto.TrainVobcState, active bool, tccBtn *state_proto.TrainControlState_ControlButton) []train_pc_sim.TrainControlEvent {
|
func controlLeftDoorBtn(vobc *state_proto.TrainVobcState, active bool, tccBtn *state_proto.TrainControlState_ControlButton) []message.TrainPcSimBaseMessage {
|
||||||
var status byte = 0
|
var status byte = 0
|
||||||
if active {
|
if active {
|
||||||
status = 1
|
status = 1
|
||||||
}
|
}
|
||||||
vobc.LeftDoorOpenCommand = active
|
vobc.LeftDoorOpenCommand = active
|
||||||
tccBtn.Passed = active
|
tccBtn.Passed = active
|
||||||
return []train_pc_sim.TrainControlEvent{{Command: message.LEFT_OPEN_DOOR, Status: status}}
|
return []message.TrainPcSimBaseMessage{{Type: message.SENDER_TRAIN_OUTR_INFO, Data: []byte{message.LEFT_OPEN_DOOR, status}}}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 关左门按钮
|
// 关左门按钮
|
||||||
func controlLeftDoorCloseBtn(vobc *state_proto.TrainVobcState, active bool, tccBtn *state_proto.TrainControlState_ControlButton) []train_pc_sim.TrainControlEvent {
|
func controlLeftDoorCloseBtn(vobc *state_proto.TrainVobcState, active bool, tccBtn *state_proto.TrainControlState_ControlButton) []message.TrainPcSimBaseMessage {
|
||||||
var status byte = 0
|
var status byte = 0
|
||||||
if active {
|
if active {
|
||||||
status = 1
|
status = 1
|
||||||
}
|
}
|
||||||
vobc.LeftDoorCloseCommand = active
|
vobc.LeftDoorCloseCommand = active
|
||||||
tccBtn.Passed = active
|
tccBtn.Passed = active
|
||||||
return []train_pc_sim.TrainControlEvent{{Command: message.CLOSE_LEFT_DOOR, Status: status}}
|
return []message.TrainPcSimBaseMessage{{Type: message.SENDER_TRAIN_OUTR_INFO, Data: []byte{message.CLOSE_LEFT_DOOR, status}}}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 开右门
|
// 开右门
|
||||||
func controlRightDoorBtn(vobc *state_proto.TrainVobcState, active bool, tccBtn *state_proto.TrainControlState_ControlButton) []train_pc_sim.TrainControlEvent {
|
func controlRightDoorBtn(vobc *state_proto.TrainVobcState, active bool, tccBtn *state_proto.TrainControlState_ControlButton) []message.TrainPcSimBaseMessage {
|
||||||
var status byte = 0
|
var status byte = 0
|
||||||
if active {
|
if active {
|
||||||
status = 1
|
status = 1
|
||||||
}
|
}
|
||||||
vobc.RightDoorOpenCommand = active
|
vobc.RightDoorOpenCommand = active
|
||||||
tccBtn.Passed = active
|
tccBtn.Passed = active
|
||||||
return []train_pc_sim.TrainControlEvent{{Command: message.OPEN_RIGHT_DOOR, Status: status}}
|
return []message.TrainPcSimBaseMessage{{Type: message.SENDER_TRAIN_OUTR_INFO, Data: []byte{message.OPEN_RIGHT_DOOR, status}}}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 关右门按钮
|
// 关右门按钮
|
||||||
func controlRightDoorCloseBtn(vobc *state_proto.TrainVobcState, active bool, tccBtn *state_proto.TrainControlState_ControlButton) []train_pc_sim.TrainControlEvent {
|
func controlRightDoorCloseBtn(vobc *state_proto.TrainVobcState, active bool, tccBtn *state_proto.TrainControlState_ControlButton) []message.TrainPcSimBaseMessage {
|
||||||
var status byte = 0
|
var status byte = 0
|
||||||
if active {
|
if active {
|
||||||
status = 1
|
status = 1
|
||||||
}
|
}
|
||||||
vobc.RightDoorCloseCommand = active
|
vobc.RightDoorCloseCommand = active
|
||||||
tccBtn.Passed = active
|
tccBtn.Passed = active
|
||||||
return []train_pc_sim.TrainControlEvent{{Command: message.CLOSE_RIGHT_DOOR, Status: status}}
|
return []message.TrainPcSimBaseMessage{{Type: message.SENDER_TRAIN_OUTR_INFO, Data: []byte{message.CLOSE_RIGHT_DOOR, status}}}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 折返
|
// 折返
|
||||||
func controlReverseBtn(vobc *state_proto.TrainVobcState, active bool, tccBtn *state_proto.TrainControlState_ControlButton) []train_pc_sim.TrainControlEvent {
|
func controlReverseBtn(vobc *state_proto.TrainVobcState, active bool, tccBtn *state_proto.TrainControlState_ControlButton) []message.TrainPcSimBaseMessage {
|
||||||
var status byte = 0
|
var status byte = 0
|
||||||
if active {
|
if active {
|
||||||
status = 1
|
status = 1
|
||||||
}
|
}
|
||||||
//vobc.RightDoorCloseCommand = active
|
//vobc.RightDoorCloseCommand = active
|
||||||
|
vobc.TurnbackStatus = active
|
||||||
tccBtn.Passed = active
|
tccBtn.Passed = active
|
||||||
return []train_pc_sim.TrainControlEvent{{Command: message.TURN_BACK, Status: status}}
|
return []message.TrainPcSimBaseMessage{{Type: message.SENDER_TRAIN_OUTR_INFO, Data: []byte{message.TURN_BACK, status}}}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 强制门允许
|
// 强制门允许
|
||||||
func controlDoorAllowBtn(vobc *state_proto.TrainVobcState, active bool, tccBtn *state_proto.TrainControlState_ControlButton) []train_pc_sim.TrainControlEvent {
|
func controlDoorAllowBtn(vobc *state_proto.TrainVobcState, active bool, tccBtn *state_proto.TrainControlState_ControlButton) []message.TrainPcSimBaseMessage {
|
||||||
var status byte = 0
|
var status byte = 0
|
||||||
if active {
|
if active {
|
||||||
status = 1
|
status = 1
|
||||||
}
|
}
|
||||||
tccBtn.Passed = active
|
tccBtn.Passed = active
|
||||||
vobc.ForceDoorAllow = active
|
vobc.ForceDoorAllow = active
|
||||||
return []train_pc_sim.TrainControlEvent{{Command: message.FORCE_DOOR_ALLOW, Status: status}}
|
return []message.TrainPcSimBaseMessage{{Type: message.SENDER_TRAIN_OUTR_INFO, Data: []byte{message.FORCE_DOOR_ALLOW, status}}}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 模式降级按钮
|
// 模式降级按钮
|
||||||
func controlModeDownBtn(vobc *state_proto.TrainVobcState, active bool, tccBtn *state_proto.TrainControlState_ControlButton) []train_pc_sim.TrainControlEvent {
|
func controlModeDownBtn(vobc *state_proto.TrainVobcState, active bool, tccBtn *state_proto.TrainControlState_ControlButton) []message.TrainPcSimBaseMessage {
|
||||||
var status byte = 0
|
var status byte = 0
|
||||||
if active {
|
if active {
|
||||||
status = 1
|
status = 1
|
||||||
}
|
}
|
||||||
tccBtn.Passed = active
|
tccBtn.Passed = active
|
||||||
vobc.ModeLevelDownBtn = active
|
vobc.ModeLevelDownBtn = active
|
||||||
return []train_pc_sim.TrainControlEvent{{Command: message.TRAIN_MODE_DOWN, Status: status}}
|
return []message.TrainPcSimBaseMessage{{Type: message.SENDER_TRAIN_OUTR_INFO, Data: []byte{message.TRAIN_MODE_DOWN, status}}}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 模式升级按钮
|
// 模式升级按钮
|
||||||
func controlModeUpBtn(vobc *state_proto.TrainVobcState, active bool, tccBtn *state_proto.TrainControlState_ControlButton) []train_pc_sim.TrainControlEvent {
|
func controlModeUpBtn(vobc *state_proto.TrainVobcState, active bool, tccBtn *state_proto.TrainControlState_ControlButton) []message.TrainPcSimBaseMessage {
|
||||||
var status byte = 0
|
var status byte = 0
|
||||||
if active {
|
if active {
|
||||||
status = 1
|
status = 1
|
||||||
}
|
}
|
||||||
tccBtn.Passed = active
|
tccBtn.Passed = active
|
||||||
vobc.ModeLevelUpBtn = active
|
vobc.ModeLevelUpBtn = active
|
||||||
return []train_pc_sim.TrainControlEvent{{Command: message.TRAIN_MODE_UP, Status: status}}
|
return []message.TrainPcSimBaseMessage{{Type: message.SENDER_TRAIN_OUTR_INFO, Data: []byte{message.TRAIN_MODE_UP, status}}}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 模式确认按钮
|
// 模式确认按钮
|
||||||
func controlModeConfirmBtn(vobc *state_proto.TrainVobcState, active bool, tccBtn *state_proto.TrainControlState_ControlButton) []train_pc_sim.TrainControlEvent {
|
func controlModeConfirmBtn(vobc *state_proto.TrainVobcState, active bool, tccBtn *state_proto.TrainControlState_ControlButton) []message.TrainPcSimBaseMessage {
|
||||||
var status byte = 0
|
var status byte = 0
|
||||||
if active {
|
if active {
|
||||||
status = 1
|
status = 1
|
||||||
}
|
}
|
||||||
tccBtn.Passed = active
|
tccBtn.Passed = active
|
||||||
vobc.ConfirmBtn = active
|
vobc.ConfirmBtn = active
|
||||||
return []train_pc_sim.TrainControlEvent{{Command: message.CONFIRM, Status: status}}
|
return []message.TrainPcSimBaseMessage{{Type: message.SENDER_TRAIN_OUTR_INFO, Data: []byte{message.CONFIRM, status}}}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 障碍物/脱轨检测
|
// 障碍物/脱轨检测
|
||||||
func controlObstacleDetectionBtn(vobc *state_proto.TrainVobcState, active bool, tccBtn *state_proto.TrainControlState_ControlButton) []train_pc_sim.TrainControlEvent {
|
func controlObstacleDetectionBtn(vobc *state_proto.TrainVobcState, active bool, tccBtn *state_proto.TrainControlState_ControlButton) []message.TrainPcSimBaseMessage {
|
||||||
var status byte = 0
|
var status byte = 0
|
||||||
if active {
|
if active {
|
||||||
status = 1
|
status = 1
|
||||||
}
|
}
|
||||||
tccBtn.Passed = active
|
tccBtn.Passed = active
|
||||||
vobc.ObstacleCheckBtn = active
|
vobc.ObstacleCheckBtn = active
|
||||||
return []train_pc_sim.TrainControlEvent{{Command: message.OBSTACLE_CHECK, Status: status}}
|
return []message.TrainPcSimBaseMessage{{Type: message.SENDER_TRAIN_OUTR_INFO, Data: []byte{message.OBSTACLE_CHECK, status}}}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 制动重故障
|
// 制动重故障
|
||||||
func controlBrakeHeavyBtn(vobc *state_proto.TrainVobcState, active bool, tccBtn *state_proto.TrainControlState_ControlButton) []train_pc_sim.TrainControlEvent {
|
func controlBrakeHeavyBtn(vobc *state_proto.TrainVobcState, active bool, tccBtn *state_proto.TrainControlState_ControlButton) []message.TrainPcSimBaseMessage {
|
||||||
var status byte = 0
|
var status byte = 0
|
||||||
if active {
|
if active {
|
||||||
status = 1
|
status = 1
|
||||||
}
|
}
|
||||||
tccBtn.Passed = active
|
tccBtn.Passed = active
|
||||||
vobc.BrakeHeavyFault = active
|
vobc.BrakeHeavyFault = active
|
||||||
return []train_pc_sim.TrainControlEvent{{Command: message.BRAKE_HEAVY_FAULT, Status: status}}
|
return []message.TrainPcSimBaseMessage{{Type: message.SENDER_TRAIN_OUTR_INFO, Data: []byte{message.BRAKE_HEAVY_FAULT, status}}}
|
||||||
}
|
}
|
||||||
|
|
||||||
// ATP上电按钮
|
// ATP上电按钮
|
||||||
func controlAtpPowerBtn(vobc *state_proto.TrainVobcState, active bool, tccBtn *state_proto.TrainControlState_ControlButton) []train_pc_sim.TrainControlEvent {
|
func controlAtpPowerBtn(vobc *state_proto.TrainVobcState, active bool, tccBtn *state_proto.TrainControlState_ControlButton) []message.TrainPcSimBaseMessage {
|
||||||
var status byte = 0
|
var status byte = 0
|
||||||
if active {
|
if active {
|
||||||
status = 1
|
status = 1
|
||||||
}
|
}
|
||||||
tccBtn.Passed = active
|
tccBtn.Passed = active
|
||||||
vobc.AtpPowerOnBtn = active
|
vobc.AtpPowerOnBtn = active
|
||||||
return []train_pc_sim.TrainControlEvent{{Command: message.ATP_POWER_ON, Status: status}}
|
return []message.TrainPcSimBaseMessage{{Type: message.SENDER_TRAIN_OUTR_INFO, Data: []byte{message.ATP_POWER_ON, status}}}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 唤醒按钮
|
// 唤醒按钮
|
||||||
func controlWakeUpBtn(vobc *state_proto.TrainVobcState, active bool, tccBtn *state_proto.TrainControlState_ControlButton) []train_pc_sim.TrainControlEvent {
|
func controlWakeUpBtn(vobc *state_proto.TrainVobcState, active bool, tccBtn *state_proto.TrainControlState_ControlButton) []message.TrainPcSimBaseMessage {
|
||||||
var status byte = 0
|
var status byte = 0
|
||||||
if active {
|
if active {
|
||||||
status = 1
|
status = 1
|
||||||
}
|
}
|
||||||
tccBtn.Passed = active
|
tccBtn.Passed = active
|
||||||
vobc.WakeUpBtn = active
|
vobc.WakeUpBtn = active
|
||||||
return []train_pc_sim.TrainControlEvent{{Command: message.WAKE_UP, Status: status}}
|
return []message.TrainPcSimBaseMessage{{Type: message.SENDER_TRAIN_OUTR_INFO, Data: []byte{message.WAKE_UP, status}}}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 检修按钮
|
// 检修按钮
|
||||||
func controlOverhaulBtn(vobc *state_proto.TrainVobcState, active bool, tccBtn *state_proto.TrainControlState_ControlButton) []train_pc_sim.TrainControlEvent {
|
func controlOverhaulBtn(vobc *state_proto.TrainVobcState, active bool, tccBtn *state_proto.TrainControlState_ControlButton) []message.TrainPcSimBaseMessage {
|
||||||
var status byte = 0
|
var status byte = 0
|
||||||
if active {
|
if active {
|
||||||
status = 1
|
status = 1
|
||||||
}
|
}
|
||||||
tccBtn.Passed = active
|
tccBtn.Passed = active
|
||||||
vobc.OverhaulBtn = active
|
vobc.OverhaulBtn = active
|
||||||
return []train_pc_sim.TrainControlEvent{{Command: message.OVERHAUL, Status: status}}
|
return []message.TrainPcSimBaseMessage{{Type: message.SENDER_TRAIN_OUTR_INFO, Data: []byte{message.OVERHAUL, status}}}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 休眠按钮
|
// 休眠按钮
|
||||||
func controlSleepBtn(vobc *state_proto.TrainVobcState, active bool, tccBtn *state_proto.TrainControlState_ControlButton) []train_pc_sim.TrainControlEvent {
|
func controlSleepBtn(vobc *state_proto.TrainVobcState, active bool, tccBtn *state_proto.TrainControlState_ControlButton) []message.TrainPcSimBaseMessage {
|
||||||
var status byte = 0
|
var status byte = 0
|
||||||
if active {
|
if active {
|
||||||
status = 1
|
status = 1
|
||||||
}
|
}
|
||||||
tccBtn.Passed = active
|
tccBtn.Passed = active
|
||||||
vobc.SleepBtn = active
|
vobc.SleepBtn = active
|
||||||
return []train_pc_sim.TrainControlEvent{{Command: message.SLEEP, Status: status}}
|
return []message.TrainPcSimBaseMessage{{Type: message.SENDER_TRAIN_OUTR_INFO, Data: []byte{message.SLEEP, status}}}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 列车方向
|
// 列车方向
|
||||||
func trainControlDirKey(trainSpeed int32, vobc *state_proto.TrainVobcState, tcc *state_proto.TrainControlState, request *request_proto.TrainControl_DirectionKeySwitch, deviceId uint32, tccGraphic *data_proto.TccGraphicStorage) []train_pc_sim.TrainControlEvent {
|
func trainControlDirKey(trainSpeed int32, vobc *state_proto.TrainVobcState, tcc *state_proto.TrainControlState, request *request_proto.TrainControl_DirectionKeySwitch, deviceId uint32, tccGraphic *data_proto.TccGraphicStorage) []message.TrainPcSimBaseMessage {
|
||||||
_, find := findTrainTccGraphicDataKey(tccGraphic, deviceId)
|
_, find := findTrainTccGraphicDataKey(tccGraphic, deviceId)
|
||||||
if !find {
|
if !find {
|
||||||
slog.Error("未找到对应的列车方向键deviceId:", deviceId)
|
slog.Error("未找到对应的列车方向键deviceId:", deviceId)
|
||||||
@ -338,7 +338,6 @@ func trainControlDirKey(trainSpeed int32, vobc *state_proto.TrainVobcState, tcc
|
|||||||
if tcc.DirKey == nil {
|
if tcc.DirKey == nil {
|
||||||
tcc.DirKey = &state_proto.TrainControlState_DirectionKeySwitch{Id: deviceId}
|
tcc.DirKey = &state_proto.TrainControlState_DirectionKeySwitch{Id: deviceId}
|
||||||
}
|
}
|
||||||
|
|
||||||
direction := request_proto.TrainControl_Direction(request.Val)
|
direction := request_proto.TrainControl_Direction(request.Val)
|
||||||
if trainSpeed > 0 {
|
if trainSpeed > 0 {
|
||||||
panic(sys_error.New("列车未停稳时,不能变更方向"))
|
panic(sys_error.New("列车未停稳时,不能变更方向"))
|
||||||
@ -350,21 +349,13 @@ func trainControlDirKey(trainSpeed int32, vobc *state_proto.TrainVobcState, tcc
|
|||||||
} else if direction == request_proto.TrainControl_BACKWARD {
|
} else if direction == request_proto.TrainControl_BACKWARD {
|
||||||
vobc.DirectionBackward = true
|
vobc.DirectionBackward = true
|
||||||
}
|
}
|
||||||
|
|
||||||
tcc.DirKey.Val = request.Val
|
tcc.DirKey.Val = request.Val
|
||||||
tce := make([]train_pc_sim.TrainControlEvent, 0)
|
return []message.TrainPcSimBaseMessage{{Type: message.SENDER_TRAIN_OUTR_INFO, Data: []byte{message.HANDLE_BACKWORD, message.IsTrue(vobc.DirectionBackward)}},
|
||||||
tce = append(tce, train_pc_sim.TrainControlEvent{Command: message.HANDLE_BACKWORD, Status: message.IsTrue(vobc.DirectionBackward)})
|
{Type: message.SENDER_TRAIN_OUTR_INFO, Data: []byte{message.HANDLE_FORWORD, message.IsTrue(vobc.DirectionForward)}}}
|
||||||
tce = append(tce, train_pc_sim.TrainControlEvent{Command: message.HANDLE_FORWORD, Status: message.IsTrue(vobc.DirectionForward)})
|
|
||||||
if vobc.DirectionForward {
|
|
||||||
tce = append(tce, train_pc_sim.TrainControlEvent{Command: message.DIR_ZERO_FORWARD, Status: 1})
|
|
||||||
} else {
|
|
||||||
tce = append(tce, train_pc_sim.TrainControlEvent{Command: message.DIR_ZERO_FORWARD, Status: 0})
|
|
||||||
}
|
|
||||||
return tce
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 列车驾驶端激活
|
// 列车驾驶端激活
|
||||||
func trainControlDriverKey(train *state_proto.TrainState, request *request_proto.TrainControl_DriverKeySwitch, deviceId uint32, tccGraphic *data_proto.TccGraphicStorage) []train_pc_sim.TrainControlEvent {
|
func trainControlDriverKey(train *state_proto.TrainState, request *request_proto.TrainControl_DriverKeySwitch, deviceId uint32, tccGraphic *data_proto.TccGraphicStorage) []message.TrainPcSimBaseMessage {
|
||||||
obj, find := findTrainTccGraphicDataKey(tccGraphic, deviceId)
|
obj, find := findTrainTccGraphicDataKey(tccGraphic, deviceId)
|
||||||
if !find {
|
if !find {
|
||||||
slog.Error("未找到对应的驾驶端激活设备deviceId:", deviceId)
|
slog.Error("未找到对应的驾驶端激活设备deviceId:", deviceId)
|
||||||
@ -400,72 +391,63 @@ func trainControlDriverKey(train *state_proto.TrainState, request *request_proto
|
|||||||
if addNew {
|
if addNew {
|
||||||
tcc.DriverKey = append(tcc.DriverKey, &state_proto.TrainControlState_DriverKeySwitch{Id: deviceId, Val: request.Val})
|
tcc.DriverKey = append(tcc.DriverKey, &state_proto.TrainControlState_DriverKeySwitch{Id: deviceId, Val: request.Val})
|
||||||
}
|
}
|
||||||
return []train_pc_sim.TrainControlEvent{{Command: message.KEY_STATE, Status: message.IsTrue(request.Val)}}
|
return []message.TrainPcSimBaseMessage{{Type: message.SENDER_TRAIN_OUTR_INFO, Data: []byte{message.KEY_STATE, message.IsTrue(request.Val)}}}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 列车牵引控制
|
// 列车牵引控制
|
||||||
func trainControlHandle(vobc *state_proto.TrainVobcState, tcc *state_proto.TrainControlState, request *request_proto.TrainControl_PushHandler, deviceId uint32, tccGraphic *data_proto.TccGraphicStorage) []train_pc_sim.TrainControlEvent {
|
func trainControlHandle(vobc *state_proto.TrainVobcState, tcc *state_proto.TrainControlState, request *request_proto.TrainControl_PushHandler, deviceId uint32, tccGraphic *data_proto.TccGraphicStorage) []message.TrainPcSimBaseMessage {
|
||||||
_, find := findTrainTccGraphicDataHandler(tccGraphic, deviceId)
|
_, find := findTrainTccGraphicDataHandler(tccGraphic, deviceId)
|
||||||
if !find {
|
if !find {
|
||||||
slog.Error("未找到对应的牵引制动手柄设备deviceId:", deviceId)
|
slog.Error("未找到对应的牵引制动手柄设备deviceId:", deviceId)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
jjzdBtnGraphic, jjzdOk := findTrainTccGraphicDataButtonByCode(tccGraphic, JJZD)
|
|
||||||
if !jjzdOk {
|
jjzdBtn := tcc.Buttons[JJZD]
|
||||||
slog.Error("未找到紧急停车摁钮 code:", JJZD)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
jjzdBtn, finder := findBtnFromTccByDeviceId(tcc.Buttons, jjzdBtnGraphic.Common.Id)
|
|
||||||
if !finder {
|
|
||||||
slog.Error("从列车控制数据中未找到紧急停车摁钮 code:", JJZD, "deviceId:", jjzdBtn.Id)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
vobc.TractionStatus = false
|
vobc.TractionStatus = false
|
||||||
vobc.TractionForce = 0
|
vobc.TractionForce = 0
|
||||||
vobc.BrakingStatus = false
|
vobc.BrakingStatus = false
|
||||||
vobc.BrakeForce = 0
|
vobc.BrakeForce = 0
|
||||||
vobc.MaintainBrakeStatus = false
|
vobc.MaintainBrakeStatus = false
|
||||||
tce := make([]train_pc_sim.TrainControlEvent, 0)
|
|
||||||
tce = append(tce, train_pc_sim.TrainControlEvent{Command: message.HANDLE_TO_ZERO, Status: 0})
|
var zeroState byte = 0
|
||||||
|
var brakeState byte = 0
|
||||||
|
|
||||||
if request.Val > 0 {
|
if request.Val > 0 {
|
||||||
vobc.TractionStatus = true
|
vobc.TractionStatus = true
|
||||||
vobc.TractionForce = int64(request.Val * 180)
|
vobc.TractionForce = int64(request.Val * 180)
|
||||||
tce = append(tce, train_pc_sim.TrainControlEvent{Command: message.TRAIN_BRAKE_STATE, Status: 0})
|
|
||||||
} else if request.Val < 0 {
|
|
||||||
|
|
||||||
|
} else if request.Val < 0 {
|
||||||
vobc.BrakingStatus = true
|
vobc.BrakingStatus = true
|
||||||
vobc.BrakeForce = int64(-request.Val * 180)
|
vobc.BrakeForce = int64(-request.Val * 180)
|
||||||
vobc.EmergencyBrakingStatus = false
|
vobc.EmergencyBrakingStatus = false
|
||||||
jjzdBtn.Passed = false
|
jjzdBtn.Passed = false
|
||||||
|
brakeState = 1
|
||||||
tce = append(tce, train_pc_sim.TrainControlEvent{Command: message.TRAIN_BRAKE_STATE, Status: 1})
|
|
||||||
tce = append(tce, train_pc_sim.TrainControlEvent{Command: message.OUTER_EMERGENCY_BRAKE, Status: 0})
|
|
||||||
} else {
|
} else {
|
||||||
tce = append(tce, train_pc_sim.TrainControlEvent{Command: message.HANDLE_TO_ZERO, Status: 1})
|
zeroState = 1
|
||||||
}
|
}
|
||||||
if tcc.PushHandler == nil {
|
if tcc.PushHandler == nil {
|
||||||
tcc.PushHandler = &state_proto.TrainControlState_PushHandler{Id: deviceId}
|
tcc.PushHandler = &state_proto.TrainControlState_PushHandler{Id: deviceId}
|
||||||
}
|
}
|
||||||
tcc.PushHandler.Val = request.Val
|
tcc.PushHandler.Val = request.Val
|
||||||
return tce
|
|
||||||
}
|
|
||||||
|
|
||||||
/*func (s *VerifySimulation) GetConnTrain() *state_proto.TrainState {
|
return []message.TrainPcSimBaseMessage{{Type: message.SENDER_TRAIN_OUTR_INFO, Data: []byte{message.HANDLE_TO_ZERO, zeroState}},
|
||||||
return s.findConnTrain(state_proto.TrainConnState_PC_SIM)
|
{Type: message.SENDER_TRAIN_OUTR_INFO, Data: []byte{message.TRAIN_BRAKE_STATE, brakeState}},
|
||||||
}*/
|
{Type: message.SENDER_TRAIN_OUTR_INFO, Data: []byte{message.OUTER_EMERGENCY_BRAKE, 1}}}
|
||||||
|
}
|
||||||
|
|
||||||
func (s *VerifySimulation) GetConnTrain2() []*state_proto.TrainState {
|
func (s *VerifySimulation) GetConnTrain2() []*state_proto.TrainState {
|
||||||
return s.findConnTrain2(state_proto.TrainConnState_PC_SIM_A, state_proto.TrainConnState_PC_SIM_B)
|
return s.findConnTrain2(state_proto.TrainConnState_PC_SIM)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *VerifySimulation) findConnTrain2(ct1, ct2 state_proto.TrainConnState_TrainConnType) []*state_proto.TrainState {
|
func (s *VerifySimulation) findConnTrain2(ct1 ...state_proto.TrainConnState_TrainConnType) []*state_proto.TrainState {
|
||||||
var trains = make([]*state_proto.TrainState, 0)
|
var trains = make([]*state_proto.TrainState, 0)
|
||||||
s.Memory.Status.TrainStateMap.Range(func(k, v any) bool {
|
s.Memory.Status.TrainStateMap.Range(func(k, v any) bool {
|
||||||
train := v.(*state_proto.TrainState)
|
train := v.(*state_proto.TrainState)
|
||||||
if train.Show {
|
if train.Show {
|
||||||
connState := train.ConnState
|
connState := train.ConnState
|
||||||
if connState.ConnType == ct1 || connState.ConnType == ct2 {
|
finded := index(ct1, connState.ConnType)
|
||||||
|
if finded >= 0 {
|
||||||
trains = append(trains, train)
|
trains = append(trains, train)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -473,6 +455,16 @@ func (s *VerifySimulation) findConnTrain2(ct1, ct2 state_proto.TrainConnState_Tr
|
|||||||
})
|
})
|
||||||
return trains
|
return trains
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func index(arr []state_proto.TrainConnState_TrainConnType, search state_proto.TrainConnState_TrainConnType) int {
|
||||||
|
for i, v := range arr {
|
||||||
|
if v == search {
|
||||||
|
return i
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return -1
|
||||||
|
}
|
||||||
|
|
||||||
func (s *VerifySimulation) FindConnTrain(ct state_proto.TrainConnState_TrainConnType) *state_proto.TrainState {
|
func (s *VerifySimulation) FindConnTrain(ct state_proto.TrainConnState_TrainConnType) *state_proto.TrainState {
|
||||||
var findTrain *state_proto.TrainState
|
var findTrain *state_proto.TrainState
|
||||||
s.Memory.Status.TrainStateMap.Range(func(k, v any) bool {
|
s.Memory.Status.TrainStateMap.Range(func(k, v any) bool {
|
||||||
@ -487,24 +479,63 @@ func (s *VerifySimulation) FindConnTrain(ct state_proto.TrainConnState_TrainConn
|
|||||||
return findTrain
|
return findTrain
|
||||||
}
|
}
|
||||||
|
|
||||||
// 4.4.1. 车载输出数字量信息报文内容
|
// 反馈atp输出数字量数据
|
||||||
func (s *VerifySimulation) TrainPcSimDigitalOutInfoHandle(connType state_proto.TrainConnState_TrainConnType, data []byte) {
|
func (s *VerifySimulation) reportTrainMockInitMsg(train *state_proto.TrainState, data1, data3 byte, trainInit bool) bool {
|
||||||
slog.Info(fmt.Sprintf("处理车载输出数字量信息报文内容:%v", hex.EncodeToString(data)))
|
|
||||||
train := s.FindConnTrain(connType)
|
|
||||||
if train == nil {
|
|
||||||
slog.Error("车载输出数字量,未找到连接车载pc仿真的列车")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if !train.ConnState.Conn {
|
|
||||||
slog.Error("车载输出数字量,,列车未连接车载pc仿真")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
vobc := train.VobcState
|
vobc := train.VobcState
|
||||||
trainPcSimDigitalOutInfoHandleCode39_32(data[4], vobc)
|
tcc := train.Tcc
|
||||||
trainPcSimDigitalOutInfoHandleCode31_24(connType, data[3], vobc)
|
tce := make([]message.TrainPcSimBaseMessage, 0)
|
||||||
|
tcc.Line12ConnErr = false
|
||||||
|
initResult := trainInit
|
||||||
|
if vobc.Tc1Active || vobc.Tc2Active {
|
||||||
|
state := message.GetBit(data1, 3)
|
||||||
|
if trainInit {
|
||||||
|
if data1 == 0 {
|
||||||
|
tcc.Line12ConnErr = true
|
||||||
|
slog.Warn("接受atp模拟量数据,data[4]=0,模拟断开")
|
||||||
|
}
|
||||||
|
if state == 0 {
|
||||||
|
train_pc_sim.Default().ResetPluseCount(train)
|
||||||
|
jjzdBtn := tcc.Buttons[JJZD]
|
||||||
|
ebTce := controlEBBtn(vobc, true, jjzdBtn)
|
||||||
|
tce = append(tce, ebTce...)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
initResult = true
|
||||||
|
if tcc.LineInitTimeStamp12 <= 0 {
|
||||||
|
tcc.LineInitTimeStamp12 = time.Now().Add(time.Second * 6).Unix()
|
||||||
|
}
|
||||||
|
if tcc.LineInitTimeStamp12 > time.Now().Unix() {
|
||||||
|
tce = append(tce, message.TrainPcSimBaseMessage{Type: message.SENDER_TRAIN_OUTR_INFO, Data: []byte{message.OUTER_EMERGENCY_BRAKE, state}})
|
||||||
|
initData := s.ObtainTrainDigitalMockDataForStatus(train)
|
||||||
|
tce = append(tce, initData...)
|
||||||
|
initResult = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//驾驶室激活反馈
|
||||||
|
if message.GetBit(data3, 3) == 0 {
|
||||||
|
tce = append(tce, message.TrainPcSimBaseMessage{Type: message.SENDER_TRAIN_OUTR_INFO, Data: []byte{message.DRIVER_ACTIVE_REPORT, 1}})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
train_pc_sim.Default().SendTrainControlMsg(train, tce)
|
||||||
|
return initResult
|
||||||
|
}
|
||||||
|
|
||||||
|
// 4.4.1. 车载输出数字量信息报文内容
|
||||||
|
func (s *VerifySimulation) TrainPcSimDigitalOutInfoHandle(train *state_proto.TrainState, trainInit bool, data []byte) bool {
|
||||||
|
/*for i, d := range data {
|
||||||
|
slog.Info(fmt.Sprintf("atp模拟量分析index:%v ,bin:%2b,trainInit:%v", i, d, trainInit))
|
||||||
|
}*/
|
||||||
|
|
||||||
|
initResult := s.reportTrainMockInitMsg(train, data[4], data[1], trainInit)
|
||||||
|
vobc := train.VobcState
|
||||||
|
trainPcSimDigitalOutInfoHandleCode7_0(data[4], vobc)
|
||||||
|
trainPcSimDigitalOutInfoHandleCode15_8(data[3], vobc)
|
||||||
trainPcSimDigitalOutInfoHandleCode23_16(data[2], vobc)
|
trainPcSimDigitalOutInfoHandleCode23_16(data[2], vobc)
|
||||||
trainPcSimDigitalOutInfoHandleCode15_8(data[1], vobc)
|
trainPcSimDigitalOutInfoHandleCode31_24(data[1], vobc)
|
||||||
trainPcSimDigitalOutInfoHandleCode7_0(data[0], vobc)
|
trainPcSimDigitalOutInfoHandleCode39_32(data[0], vobc)
|
||||||
|
return initResult
|
||||||
|
|
||||||
}
|
}
|
||||||
func trainPcSimDigitalOutInfoHandleCode39_32(d byte, vobc *state_proto.TrainVobcState) {
|
func trainPcSimDigitalOutInfoHandleCode39_32(d byte, vobc *state_proto.TrainVobcState) {
|
||||||
vobc.MostUseBrake = message.IsTrueForByte(message.GetBit(d, 0)) //? 常用制动
|
vobc.MostUseBrake = message.IsTrueForByte(message.GetBit(d, 0)) //? 常用制动
|
||||||
@ -517,25 +548,29 @@ func trainPcSimDigitalOutInfoHandleCode39_32(d byte, vobc *state_proto.TrainVobc
|
|||||||
vobc.StopNotAllBrake = message.IsTrueForByte(message.GetBit(d, 7)) //? 停放制动缓解
|
vobc.StopNotAllBrake = message.IsTrueForByte(message.GetBit(d, 7)) //? 停放制动缓解
|
||||||
|
|
||||||
}
|
}
|
||||||
func trainPcSimDigitalOutInfoHandleCode31_24(connType state_proto.TrainConnState_TrainConnType, d byte, vobc *state_proto.TrainVobcState) {
|
func trainPcSimDigitalOutInfoHandleCode31_24(d byte, vobc *state_proto.TrainVobcState) {
|
||||||
|
|
||||||
vobc.AtoOpenLeftDoor = message.IsTrueForByte(message.GetBit(d, 0)) //?//ATO开左门
|
vobc.AtoOpenLeftDoor = message.IsTrueForByte(message.GetBit(d, 0)) //?//ATO开左门
|
||||||
vobc.AtoOpenRightDoor = message.IsTrueForByte(message.GetBit(d, 1)) //?//ATO开右门
|
vobc.AtoOpenRightDoor = message.IsTrueForByte(message.GetBit(d, 1)) //?//ATO开右门
|
||||||
vobc.AtoCloseLeftDoor = message.IsTrueForByte(message.GetBit(d, 2)) //?//ATO关左门
|
vobc.AtoCloseLeftDoor = message.IsTrueForByte(message.GetBit(d, 2)) //?//ATO关左门
|
||||||
if connType == state_proto.TrainConnState_PC_SIM_A {
|
/* if connType == state_proto.TrainConnState_PC_SIM_A {
|
||||||
vobc.Tc1Active = message.IsTrueForByte(message.GetBit(d, 3))
|
vobc.Tc1Active = message.IsTrueForByte(message.GetBit(d, 3))
|
||||||
} else {
|
} else {
|
||||||
vobc.Tc2Active = message.IsTrueForByte(message.GetBit(d, 3))
|
vobc.Tc2Active = message.IsTrueForByte(message.GetBit(d, 3))
|
||||||
}
|
}*/
|
||||||
//驾驶室激活
|
|
||||||
|
vobc.LightDriverActive = message.IsTrueForByte(message.GetBit(d, 3)) //驾驶室激活
|
||||||
vobc.NoSpeedSigle = message.IsTrueForByte(message.GetBit(d, 4)) //?//零速信号
|
vobc.NoSpeedSigle = message.IsTrueForByte(message.GetBit(d, 4)) //?//零速信号
|
||||||
vobc.Fam = message.IsTrueForByte(message.GetBit(d, 5)) //FAM模式
|
vobc.Fam = message.IsTrueForByte(message.GetBit(d, 5)) //FAM模式
|
||||||
vobc.Cam = message.IsTrueForByte(message.GetBit(d, 6)) //CAM模式
|
vobc.Cam = message.IsTrueForByte(message.GetBit(d, 6)) //CAM模式
|
||||||
vobc.TrainStartedLed = message.IsTrueForByte(message.GetBit(d, 7)) //?//列车启动指示灯
|
vobc.TrainStartedLed = message.IsTrueForByte(message.GetBit(d, 7)) //?//列车启动指示灯
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func trainPcSimDigitalOutInfoHandleCode23_16(d byte, vobc *state_proto.TrainVobcState) {
|
func trainPcSimDigitalOutInfoHandleCode23_16(d byte, vobc *state_proto.TrainVobcState) {
|
||||||
vobc.DirectionForward = message.IsTrueForByte(message.GetBit(d, 0)) //列车方向1
|
vobc.LightDir1 = message.IsTrueForByte(message.GetBit(d, 0)) //列车方向1
|
||||||
vobc.DirectionBackward = message.IsTrueForByte(message.GetBit(d, 1)) //列车方向2
|
vobc.LightDir2 = message.IsTrueForByte(message.GetBit(d, 1)) //列车方向1
|
||||||
|
//vobc.DirectionForward = message.IsTrueForByte(message.GetBit(d, 0)) //列车方向1
|
||||||
|
//vobc.DirectionBackward = message.IsTrueForByte(message.GetBit(d, 1)) //列车方向2
|
||||||
vobc.AtoLazyCommandOut = message.IsTrueForByte(message.GetBit(d, 2)) //?ATO惰行命令输出
|
vobc.AtoLazyCommandOut = message.IsTrueForByte(message.GetBit(d, 2)) //?ATO惰行命令输出
|
||||||
vobc.SleepBtn = message.IsTrueForByte(message.GetBit(d, 3)) //?休眠指令
|
vobc.SleepBtn = message.IsTrueForByte(message.GetBit(d, 3)) //?休眠指令
|
||||||
vobc.WakeUpBtn = message.IsTrueForByte(message.GetBit(d, 4)) //?唤醒指令
|
vobc.WakeUpBtn = message.IsTrueForByte(message.GetBit(d, 4)) //?唤醒指令
|
||||||
@ -545,6 +580,7 @@ func trainPcSimDigitalOutInfoHandleCode23_16(d byte, vobc *state_proto.TrainVobc
|
|||||||
|
|
||||||
}
|
}
|
||||||
func trainPcSimDigitalOutInfoHandleCode15_8(d byte, vobc *state_proto.TrainVobcState) {
|
func trainPcSimDigitalOutInfoHandleCode15_8(d byte, vobc *state_proto.TrainVobcState) {
|
||||||
|
|
||||||
vobc.LocalAtpControl = message.IsTrueForByte(message.GetBit(d, 0)) //?本端ATP控车
|
vobc.LocalAtpControl = message.IsTrueForByte(message.GetBit(d, 0)) //?本端ATP控车
|
||||||
vobc.Ato = message.IsTrueForByte(message.GetBit(d, 1)) //ATO模式
|
vobc.Ato = message.IsTrueForByte(message.GetBit(d, 1)) //ATO模式
|
||||||
vobc.AtoTractionCommandOut = message.IsTrueForByte(message.GetBit(d, 2)) //?ATO牵引命令输出
|
vobc.AtoTractionCommandOut = message.IsTrueForByte(message.GetBit(d, 2)) //?ATO牵引命令输出
|
||||||
@ -560,25 +596,18 @@ func trainPcSimDigitalOutInfoHandleCode7_0(d byte, vobc *state_proto.TrainVobcSt
|
|||||||
vobc.TrainDoorOutLed = message.IsTrueForByte(message.GetBit(d, 1)) //? 车门外指示灯
|
vobc.TrainDoorOutLed = message.IsTrueForByte(message.GetBit(d, 1)) //? 车门外指示灯
|
||||||
vobc.ParkingBrakeStatus = message.IsTrueForByte(message.GetBit(d, 2)) //停放制动施加
|
vobc.ParkingBrakeStatus = message.IsTrueForByte(message.GetBit(d, 2)) //停放制动施加
|
||||||
vobc.EmergencyBrakingStatus = message.AtpLowPowerByte(message.GetBit(d, 3)) //紧急制动
|
vobc.EmergencyBrakingStatus = message.AtpLowPowerByte(message.GetBit(d, 3)) //紧急制动
|
||||||
vobc.LeftDoorOpenCommand = message.IsTrueForByte(message.GetBit(d, 4)) //开左门允许
|
vobc.LeftDoorState = message.IsTrueForByte(message.GetBit(d, 4)) //开左门允许
|
||||||
vobc.RightDoorOpenCommand = message.IsTrueForByte(message.GetBit(d, 5)) //开右门允许
|
vobc.RightDoorState = message.IsTrueForByte(message.GetBit(d, 5)) //开右门允许
|
||||||
vobc.RightDoorCloseCommand = message.IsTrueForByte(message.GetBit(d, 6)) //关右门
|
vobc.RightDoorCloseCommand = message.IsTrueForByte(message.GetBit(d, 6)) //关右门
|
||||||
vobc.AllDoorClose = message.IsTrueForByte(message.GetBit(d, 7)) //车门保持关闭
|
vobc.AllDoorClose = message.IsTrueForByte(message.GetBit(d, 7)) //车门保持关闭
|
||||||
|
vobc.LightTractionSafetyCircuit = vobc.TractionSafetyCircuit //切牵引
|
||||||
|
vobc.LightEmergencyBrakingStatus = vobc.EmergencyBrakingStatus //紧急制动
|
||||||
}
|
}
|
||||||
|
|
||||||
// 4.4.2. 车载输出数字反馈量信息报文内容
|
// 4.4.2. 车载输出数字反馈量信息报文内容
|
||||||
func (s *VerifySimulation) TrainPcSimDigitalReportHandle(connType state_proto.TrainConnState_TrainConnType, data []byte) {
|
func (s *VerifySimulation) TrainPcSimDigitalReportHandle(train *state_proto.TrainState, data []byte) {
|
||||||
slog.Info(fmt.Sprintf("车载输出数字量反馈信息", hex.EncodeToString(data)))
|
slog.Info(fmt.Sprintf("车载输出数字量反馈信息", hex.EncodeToString(data)))
|
||||||
train := s.FindConnTrain(connType)
|
|
||||||
if train == nil {
|
|
||||||
slog.Error("车载输出数字反馈量信息,未找到连接车载pc仿真的列车")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if !train.ConnState.Conn {
|
|
||||||
slog.Error("车载输出数字反馈量信息,列车未连接车载pc仿真")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
vobc := train.VobcState
|
vobc := train.VobcState
|
||||||
|
|
||||||
//buf := bytes.NewBuffer(data)
|
//buf := bytes.NewBuffer(data)
|
||||||
@ -597,12 +626,13 @@ func (s *VerifySimulation) TrainPcSimDigitalReportHandle(connType state_proto.Tr
|
|||||||
// 创建/删除列车
|
// 创建/删除列车
|
||||||
func TrainPcSimConnOrRemoveHandle(train *state_proto.TrainState, create bool) error {
|
func TrainPcSimConnOrRemoveHandle(train *state_proto.TrainState, create bool) error {
|
||||||
connState := train.ConnState
|
connState := train.ConnState
|
||||||
if connState.ConnType == state_proto.TrainConnState_PC_SIM_A || connState.ConnType == state_proto.TrainConnState_PC_SIM_B {
|
if connState.ConnType == state_proto.TrainConnState_PC_SIM {
|
||||||
crErr := train_pc_sim.Default().CreateOrRemoveTrain(train, create)
|
crErr := train_pc_sim.Default().CreateOrRemoveTrain(train, create)
|
||||||
|
//train_pc_sim.Default().CreateOrRemoveSpeedPLace(train)
|
||||||
if crErr != nil {
|
if crErr != nil {
|
||||||
return crErr
|
return crErr
|
||||||
}
|
}
|
||||||
train_pc_sim.Default().CreateOrRemoveSpeedPLace(train)
|
|
||||||
} else if connState.ConnType == state_proto.TrainConnState_VOBC {
|
} else if connState.ConnType == state_proto.TrainConnState_VOBC {
|
||||||
electrical_machinery.Default().ClearOrRemoveTrain(train)
|
electrical_machinery.Default().ClearOrRemoveTrain(train)
|
||||||
}
|
}
|
||||||
@ -629,8 +659,8 @@ func TrainPcSimConnOrRemoveHandle(train *state_proto.TrainState, create bool) er
|
|||||||
}*/
|
}*/
|
||||||
|
|
||||||
// 4.4.3. 车载输出模拟量信息报文内容(0x03)
|
// 4.4.3. 车载输出模拟量信息报文内容(0x03)
|
||||||
func (s *VerifySimulation) TrainPcSimMockInfo(connType state_proto.TrainConnState_TrainConnType, data []byte) {
|
func (s *VerifySimulation) TrainPcSimMockInfo(train *state_proto.TrainState, data []byte) {
|
||||||
train := s.FindConnTrain(connType)
|
/*train := s.FindConnTrain(connType)
|
||||||
if train == nil {
|
if train == nil {
|
||||||
slog.Error("车载输出模拟量,未找到连接车载pc仿真的列车")
|
slog.Error("车载输出模拟量,未找到连接车载pc仿真的列车")
|
||||||
return
|
return
|
||||||
@ -638,27 +668,31 @@ func (s *VerifySimulation) TrainPcSimMockInfo(connType state_proto.TrainConnStat
|
|||||||
if !train.ConnState.Conn {
|
if !train.ConnState.Conn {
|
||||||
slog.Error("车载输出模拟量,列车未连接车载pc仿真")
|
slog.Error("车载输出模拟量,列车未连接车载pc仿真")
|
||||||
return
|
return
|
||||||
}
|
}*/
|
||||||
mockData := binary.BigEndian.Uint16(data)
|
mockData := binary.BigEndian.Uint16(data)
|
||||||
train.VobcState.MockInfo = uint32(mockData)
|
train.VobcState.MockInfo = uint32(mockData)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 4.4.4. 车载输出BTM查询同步帧报文内容(0x04)
|
// 4.4.4. 车载输出BTM查询同步帧报文内容(0x04)
|
||||||
func (s *VerifySimulation) TrainBtmQuery(connType state_proto.TrainConnState_TrainConnType, data []byte) {
|
func (s *VerifySimulation) TrainBtmQuery(train *state_proto.TrainState, data []byte) {
|
||||||
slog.Info(fmt.Sprintf("收到车载输出BTM查询同步帧报文内容:%v", hex.EncodeToString(data)))
|
//slog.Info(fmt.Sprintf("收到车载输出BTM查询同步帧报文内容:%v", hex.EncodeToString(data)))
|
||||||
if len(data) < 12 {
|
if len(data) < 12 {
|
||||||
slog.Error("列车btm查询报文长度错误:", len(data))
|
slog.Error("列车btm查询报文长度错误:", len(data))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
train := s.FindConnTrain(connType)
|
//train := s.FindConnTrain(connType)
|
||||||
if train == nil {
|
if train.BtmState == nil {
|
||||||
|
slog.Warn("列车暂时未获取到应答器信息")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
/*if train == nil {
|
||||||
slog.Error("车载输出btm查询,未找到连接车载pc仿真的列车")
|
slog.Error("车载输出btm查询,未找到连接车载pc仿真的列车")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if !train.ConnState.Conn {
|
if !train.ConnState.Conn {
|
||||||
slog.Error("车载输出btm查询,列车未连接车载pc仿真")
|
slog.Error("车载输出btm查询,列车未连接车载pc仿真")
|
||||||
return
|
return
|
||||||
}
|
}*/
|
||||||
|
|
||||||
trainAtm := message.NewCanetFrame2(data, true)
|
trainAtm := message.NewCanetFrame2(data, true)
|
||||||
atpReq := &message.AtpRequestFrame{IsTrainPcSim: true}
|
atpReq := &message.AtpRequestFrame{IsTrainPcSim: true}
|
||||||
@ -693,14 +727,21 @@ func (s *VerifySimulation) TrainBtmQuery(connType state_proto.TrainConnState_Tra
|
|||||||
} else {
|
} else {
|
||||||
//有数据
|
//有数据
|
||||||
aliseData, _ := hex.DecodeString(train.BtmState.Telegram)
|
aliseData, _ := hex.DecodeString(train.BtmState.Telegram)
|
||||||
statusDataCf, statusDataCfOk := message.CreateBtmRspFramesData(btmRepFrame, aliseData, false, cl.TkNow(), cl.TkNow(), cl.TkNow(), true)
|
statusDataCf, statusDataCfOk := message.CreateBtmRspFramesData2(btmRepFrame, aliseData, false, cl.TkNow(), cl.TkNow(), cl.TkNow(), true)
|
||||||
if statusDataCfOk {
|
if statusDataCfOk {
|
||||||
queryData := make([]byte, 0)
|
/* queryData := make([]byte, 0)
|
||||||
queryData = append(queryData, btmRepFrame.Encode().Encode2()...)
|
queryData = append(queryData, btmRepFrame.Encode().Encode2()...)
|
||||||
queryData = append(queryData, timeSyncF.Encode().Encode2()...)
|
queryData = append(queryData, timeSyncF.Encode().Encode2()...)
|
||||||
queryData = append(queryData, statusDataCf...) //数据帧包含结束帧
|
queryData = append(queryData, statusDataCf...) //数据帧包含结束帧
|
||||||
train.BtmState.BaliseTelegramForPcSimResend = fmt.Sprintf("%X", statusDataCf)
|
train.BtmState.BaliseTelegramForPcSimResend = fmt.Sprintf("%X", statusDataCf)
|
||||||
train_pc_sim.Default().SendBaliseData(train, message.RECIVE_TRAIN_BTM_HAS_DATA, queryData)
|
train_pc_sim.Default().SendBaliseData(train, message.RECIVE_TRAIN_BTM_HAS_DATA, queryData)*/
|
||||||
|
queryDataStr := make([]string, 0)
|
||||||
|
queryDataStr = append(queryDataStr, hex.EncodeToString(btmRepFrame.Encode().Encode2()))
|
||||||
|
queryDataStr = append(queryDataStr, hex.EncodeToString(timeSyncF.Encode().Encode2()))
|
||||||
|
queryDataStr = append(queryDataStr, hex.EncodeToString(statusDataCf)) //数据帧包含结束帧
|
||||||
|
train.BtmState.BaliseTelegramForPcSimResend = fmt.Sprintf("%X", statusDataCf)
|
||||||
|
train_pc_sim.Default().SendBaliseData2(train, message.RECIVE_TRAIN_BTM_HAS_DATA, queryDataStr)
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
slog.Error("列车pc仿真 BtmCanetClient应答帧、数据帧编码失败")
|
slog.Error("列车pc仿真 BtmCanetClient应答帧、数据帧编码失败")
|
||||||
}
|
}
|
||||||
@ -733,45 +774,85 @@ func clock(atpReq *message.AtpRequestFrame) can_btm.BtmClock {
|
|||||||
now := time.Now()
|
now := time.Now()
|
||||||
return can_btm.BtmClock{BtmTk: atpReq.Time, SysTk: now}
|
return can_btm.BtmClock{BtmTk: atpReq.Time, SysTk: now}
|
||||||
}
|
}
|
||||||
func (s *VerifySimulation) ObtainTrainDigitalMockData(train *state_proto.TrainState) []message.TrainPcSimBaseMessage {
|
func (s *VerifySimulation) ObtainTrainDigitalMockDataForStatus(train *state_proto.TrainState) []message.TrainPcSimBaseMessage {
|
||||||
msgArr := make([]message.TrainPcSimBaseMessage, 0)
|
msgArr := make([]message.TrainPcSimBaseMessage, 0)
|
||||||
vs := train.VobcState
|
vs := train.VobcState
|
||||||
tcc := train.Tcc
|
tcc := train.Tcc
|
||||||
|
|
||||||
if vs.Tc1Active || vs.Tc2Active {
|
if vs.Tc1Active || vs.Tc2Active {
|
||||||
msgArr = append(msgArr, message.TrainPcSimBaseMessage{Data: []byte{message.KEY_STATE, 1}, Type: message.SENDER_TRAIN_OUTR_INFO}) //钥匙激活
|
msgArr = append(msgArr, message.TrainPcSimBaseMessage{Data: []byte{message.KEY_STATE, 1}, Type: message.SENDER_TRAIN_OUTR_INFO}) //钥匙激活
|
||||||
|
msgArr = append(msgArr, message.TrainPcSimBaseMessage{Data: []byte{message.DRIVER_ACTIVE_REPORT, 1}, Type: message.SENDER_TRAIN_OUTR_INFO}) //列车完整性
|
||||||
|
} else {
|
||||||
|
msgArr = append(msgArr, message.TrainPcSimBaseMessage{Data: []byte{message.DRIVER_ACTIVE_REPORT, 0}, Type: message.SENDER_TRAIN_OUTR_INFO}) //列车完整性
|
||||||
|
}
|
||||||
|
if vs.BrakeForce == 0 {
|
||||||
|
msgArr = append(msgArr, message.TrainPcSimBaseMessage{Data: []byte{message.HANDLE_TO_ZERO, 1}, Type: message.SENDER_TRAIN_OUTR_INFO}) //列车制动状态
|
||||||
}
|
}
|
||||||
|
|
||||||
if vs.BrakingStatus {
|
if vs.BrakingStatus {
|
||||||
msgArr = append(msgArr, message.TrainPcSimBaseMessage{Data: []byte{message.TRAIN_BRAKE_STATE, 1}, Type: message.SENDER_TRAIN_OUTR_INFO}) //列车制动状态
|
msgArr = append(msgArr, message.TrainPcSimBaseMessage{Data: []byte{message.TRAIN_BRAKE_STATE, 1}, Type: message.SENDER_TRAIN_OUTR_INFO}) //列车制动状态
|
||||||
}
|
}
|
||||||
|
|
||||||
if vs.EmergencyBrakingStatus {
|
if vs.EmergencyBrakingStatus {
|
||||||
msgArr = append(msgArr, message.TrainPcSimBaseMessage{Data: []byte{message.OUTER_EMERGENCY_BRAKE, 1}, Type: message.SENDER_TRAIN_OUTR_INFO}) //紧急制动
|
msgArr = append(msgArr, message.TrainPcSimBaseMessage{Data: []byte{message.OUTER_EMERGENCY_BRAKE, 0}, Type: message.SENDER_TRAIN_OUTR_INFO}) //紧急制动
|
||||||
}
|
}
|
||||||
|
|
||||||
dir := request_proto.TrainControl_Direction(tcc.DirKey.Val)
|
dir := request_proto.TrainControl_Direction(tcc.DirKey.Val)
|
||||||
if dir == request_proto.TrainControl_FORWARD {
|
/*if vs.DirectionForward && vs.TractionForce == 0 {
|
||||||
msgArr = append(msgArr, message.TrainPcSimBaseMessage{Data: []byte{message.DIR_ZERO_FORWARD, 1}, Type: message.SENDER_TRAIN_OUTR_INFO}) //手柄零位方向向前
|
msgArr = append(msgArr, message.TrainPcSimBaseMessage{Data: []byte{message.DIR_ZERO_FORWARD, 1}, Type: message.SENDER_TRAIN_OUTR_INFO}) //手柄零位方向向前
|
||||||
|
} else*/if dir == request_proto.TrainControl_FORWARD {
|
||||||
|
//msgArr = append(msgArr, message.TrainPcSimBaseMessage{Data: []byte{message.DIR_ZERO_FORWARD, 0}, Type: message.SENDER_TRAIN_OUTR_INFO}) //手柄零位方向向前
|
||||||
msgArr = append(msgArr, message.TrainPcSimBaseMessage{Data: []byte{message.HANDLE_FORWORD, 1}, Type: message.SENDER_TRAIN_OUTR_INFO}) //方向手柄向前控制
|
msgArr = append(msgArr, message.TrainPcSimBaseMessage{Data: []byte{message.HANDLE_FORWORD, 1}, Type: message.SENDER_TRAIN_OUTR_INFO}) //方向手柄向前控制
|
||||||
msgArr = append(msgArr, message.TrainPcSimBaseMessage{Data: []byte{message.HANDLE_BACKWORD, 0}, Type: message.SENDER_TRAIN_OUTR_INFO}) //方向手柄向前控制
|
msgArr = append(msgArr, message.TrainPcSimBaseMessage{Data: []byte{message.HANDLE_BACKWORD, 0}, Type: message.SENDER_TRAIN_OUTR_INFO}) //方向手柄向前控制
|
||||||
} else if dir == request_proto.TrainControl_BACKWARD {
|
} else if dir == request_proto.TrainControl_BACKWARD {
|
||||||
|
//msgArr = append(msgArr, message.TrainPcSimBaseMessage{Data: []byte{message.DIR_ZERO_FORWARD, 0}, Type: message.SENDER_TRAIN_OUTR_INFO}) //手柄零位方向向前
|
||||||
msgArr = append(msgArr, message.TrainPcSimBaseMessage{Data: []byte{message.HANDLE_FORWORD, 0}, Type: message.SENDER_TRAIN_OUTR_INFO}) //方向手柄向前控制
|
msgArr = append(msgArr, message.TrainPcSimBaseMessage{Data: []byte{message.HANDLE_FORWORD, 0}, Type: message.SENDER_TRAIN_OUTR_INFO}) //方向手柄向前控制
|
||||||
msgArr = append(msgArr, message.TrainPcSimBaseMessage{Data: []byte{message.DIR_ZERO_FORWARD, 0}, Type: message.SENDER_TRAIN_OUTR_INFO}) //手柄零位方向向前
|
|
||||||
msgArr = append(msgArr, message.TrainPcSimBaseMessage{Data: []byte{message.HANDLE_BACKWORD, 1}, Type: message.SENDER_TRAIN_OUTR_INFO}) //方向手柄向前控制
|
msgArr = append(msgArr, message.TrainPcSimBaseMessage{Data: []byte{message.HANDLE_BACKWORD, 1}, Type: message.SENDER_TRAIN_OUTR_INFO}) //方向手柄向前控制
|
||||||
}
|
}
|
||||||
|
if vs.RightDoorCloseCommand {
|
||||||
msgArr = append(msgArr, message.TrainPcSimBaseMessage{Data: []byte{message.CLOSE_RIGHT_DOOR, 1}, Type: message.SENDER_TRAIN_OUTR_INFO}) //关右门按钮
|
msgArr = append(msgArr, message.TrainPcSimBaseMessage{Data: []byte{message.CLOSE_RIGHT_DOOR, 1}, Type: message.SENDER_TRAIN_OUTR_INFO}) //关右门按钮
|
||||||
|
}
|
||||||
|
if vs.LeftDoorCloseCommand {
|
||||||
msgArr = append(msgArr, message.TrainPcSimBaseMessage{Data: []byte{message.CLOSE_LEFT_DOOR, 1}, Type: message.SENDER_TRAIN_OUTR_INFO}) //关左门按钮
|
msgArr = append(msgArr, message.TrainPcSimBaseMessage{Data: []byte{message.CLOSE_LEFT_DOOR, 1}, Type: message.SENDER_TRAIN_OUTR_INFO}) //关左门按钮
|
||||||
msgArr = append(msgArr, message.TrainPcSimBaseMessage{Data: []byte{message.TRAIN_INTEGRITY, 1}, Type: message.SENDER_TRAIN_OUTR_INFO}) //列车完整性
|
}
|
||||||
|
if vs.AllDoorClose {
|
||||||
msgArr = append(msgArr, message.TrainPcSimBaseMessage{Data: []byte{message.DOOR_LOCK_STATE, 1}, Type: message.SENDER_TRAIN_OUTR_INFO}) //车门锁闭状态
|
msgArr = append(msgArr, message.TrainPcSimBaseMessage{Data: []byte{message.DOOR_LOCK_STATE, 1}, Type: message.SENDER_TRAIN_OUTR_INFO}) //车门锁闭状态
|
||||||
|
}
|
||||||
|
if vs.ObstacleCheckBtn {
|
||||||
msgArr = append(msgArr, message.TrainPcSimBaseMessage{Data: []byte{message.OBSTACLE_CHECK, 1}, Type: message.SENDER_TRAIN_OUTR_INFO}) //障碍物检测按钮
|
msgArr = append(msgArr, message.TrainPcSimBaseMessage{Data: []byte{message.OBSTACLE_CHECK, 1}, Type: message.SENDER_TRAIN_OUTR_INFO}) //障碍物检测按钮
|
||||||
|
}
|
||||||
|
if vs.BrakeHeavyFault {
|
||||||
msgArr = append(msgArr, message.TrainPcSimBaseMessage{Data: []byte{message.BRAKE_HEAVY_FAULT, 1}, Type: message.SENDER_TRAIN_OUTR_INFO}) //制动重故障
|
msgArr = append(msgArr, message.TrainPcSimBaseMessage{Data: []byte{message.BRAKE_HEAVY_FAULT, 1}, Type: message.SENDER_TRAIN_OUTR_INFO}) //制动重故障
|
||||||
msgArr = append(msgArr, message.TrainPcSimBaseMessage{Data: []byte{message.EMERGENT_HANDLE_DOWN, 1}, Type: message.SENDER_TRAIN_OUTR_INFO}) //紧急手柄拉下
|
}
|
||||||
msgArr = append(msgArr, message.TrainPcSimBaseMessage{Data: []byte{message.LIFE_DOOR, 1}, Type: message.SENDER_TRAIN_OUTR_INFO}) //逃生门状态
|
if vs.AtpCutSwitch {
|
||||||
msgArr = append(msgArr, message.TrainPcSimBaseMessage{Data: []byte{message.ATP_CUT, 1}, Type: message.SENDER_TRAIN_OUTR_INFO}) //atp切除
|
msgArr = append(msgArr, message.TrainPcSimBaseMessage{Data: []byte{message.ATP_CUT, 1}, Type: message.SENDER_TRAIN_OUTR_INFO}) //atp切除
|
||||||
msgArr = append(msgArr, message.TrainPcSimBaseMessage{Data: []byte{39, 1}, Type: message.SENDER_TRAIN_OUTR_INFO}) //非制动
|
}
|
||||||
//msgArr = append(msgArr, message.TrainPcSimBaseMessage{Data: []byte{40, 1}, Type: message.SENDER_TRAIN_OUTR_INFO}) //本端机械钩
|
if vs.AtpPowerOnBtn {
|
||||||
//msgArr = append(msgArr, message.TrainPcSimBaseMessage{Data: []byte{41, 1}, Type: message.SENDER_TRAIN_OUTR_INFO}) //对端机械钩
|
msgArr = append(msgArr, message.TrainPcSimBaseMessage{Data: []byte{message.ATP_POWER_ON, 1}, Type: message.SENDER_TRAIN_OUTR_INFO}) //atp上电
|
||||||
msgArr = append(msgArr, message.TrainPcSimBaseMessage{Data: []byte{}, Type: message.RECIVE_TRAIN_BTN_CLEAR_ALL_PRE_DATA}) //清空应答器
|
}
|
||||||
|
if vs.TurnbackStatus {
|
||||||
|
msgArr = append(msgArr, message.TrainPcSimBaseMessage{Data: []byte{message.TURN_BACK, 1}, Type: message.SENDER_TRAIN_OUTR_INFO}) //atp上电
|
||||||
|
}
|
||||||
|
msgArr = append(msgArr, message.TrainPcSimBaseMessage{Data: []byte{message.LIFE_DOOR, 1}, Type: message.SENDER_TRAIN_OUTR_INFO}) //逃生门状态
|
||||||
|
msgArr = append(msgArr, message.TrainPcSimBaseMessage{Data: []byte{message.EMERGENT_HANDLE_DOWN, 1}, Type: message.SENDER_TRAIN_OUTR_INFO}) //紧急手柄拉下
|
||||||
|
msgArr = append(msgArr, message.TrainPcSimBaseMessage{Data: []byte{message.TRAIN_TRACTION_CUTED, 1}, Type: message.SENDER_TRAIN_OUTR_INFO}) //紧急手柄拉下
|
||||||
|
return msgArr
|
||||||
|
}
|
||||||
|
func (s *VerifySimulation) ObtainTrainDigitalMockData(train *state_proto.TrainState) []message.TrainPcSimBaseMessage {
|
||||||
|
msgArr := make([]message.TrainPcSimBaseMessage, 0)
|
||||||
|
|
||||||
|
stateArr := s.ObtainTrainDigitalMockDataForStatus(train)
|
||||||
|
msgArr = append(msgArr, stateArr...)
|
||||||
|
msgArr = append(msgArr, message.TrainPcSimBaseMessage{Data: []byte{message.ATO_SEND_TRAIN, 0}, Type: message.SENDER_TRAIN_OUTR_INFO}) //ATO发车按钮
|
||||||
|
msgArr = append(msgArr, message.TrainPcSimBaseMessage{Data: []byte{message.LEFT_DOOR_STATE, 0}, Type: message.SENDER_TRAIN_OUTR_INFO}) //左门状态按钮
|
||||||
|
msgArr = append(msgArr, message.TrainPcSimBaseMessage{Data: []byte{message.RIGHT_DOOR_STATE, 0}, Type: message.SENDER_TRAIN_OUTR_INFO}) //列车完整性
|
||||||
|
msgArr = append(msgArr, message.TrainPcSimBaseMessage{Data: []byte{message.CONFIRM, 1}, Type: message.SENDER_TRAIN_OUTR_INFO}) //列车完整性
|
||||||
|
msgArr = append(msgArr, message.TrainPcSimBaseMessage{Data: []byte{message.TRAIN_INTEGRITY, 1}, Type: message.SENDER_TRAIN_OUTR_INFO}) //列车完整性
|
||||||
|
|
||||||
|
msgArr = append(msgArr, message.TrainPcSimBaseMessage{Data: []byte{message.NOT_BREAK, 1}, Type: message.SENDER_TRAIN_OUTR_INFO}) //非制动
|
||||||
|
msgArr = append(msgArr, message.TrainPcSimBaseMessage{Data: []byte{38, 0}, Type: message.SENDER_TRAIN_OUTR_INFO}) //只牵引
|
||||||
|
msgArr = append(msgArr, message.TrainPcSimBaseMessage{Data: []byte{40, 1}, Type: message.SENDER_TRAIN_OUTR_INFO}) //本端机械钩
|
||||||
|
msgArr = append(msgArr, message.TrainPcSimBaseMessage{Data: []byte{41, 1}, Type: message.SENDER_TRAIN_OUTR_INFO}) //对端机械钩
|
||||||
|
|
||||||
train.BtmState = nil
|
train.BtmState = nil
|
||||||
return msgArr
|
return msgArr
|
||||||
}
|
}
|
||||||
|
@ -153,8 +153,7 @@ func runThirdParty(s *memory.VerifySimulation) error {
|
|||||||
|
|
||||||
// 停止仿真
|
// 停止仿真
|
||||||
func stopThirdParty(s *memory.VerifySimulation) {
|
func stopThirdParty(s *memory.VerifySimulation) {
|
||||||
// 停止动力学接口功能
|
|
||||||
dynamics.Default().Stop()
|
|
||||||
// 停止半实物
|
// 停止半实物
|
||||||
semi_physical_train.Default().Stop()
|
semi_physical_train.Default().Stop()
|
||||||
// 联锁启动
|
// 联锁启动
|
||||||
@ -183,6 +182,8 @@ func stopThirdParty(s *memory.VerifySimulation) {
|
|||||||
train_pc_sim.Default().Stop()
|
train_pc_sim.Default().Stop()
|
||||||
|
|
||||||
btm_vobc.Default().Stop()
|
btm_vobc.Default().Stop()
|
||||||
|
// 停止动力学接口功能
|
||||||
|
dynamics.Default().Stop()
|
||||||
}
|
}
|
||||||
|
|
||||||
func createSimulationId(projectId int32) string {
|
func createSimulationId(projectId int32) string {
|
||||||
|
Loading…
Reference in New Issue
Block a user