From 15bdc45892bc871f436cafc6b9d9f9e65df3c1f0 Mon Sep 17 00:00:00 2001 From: tiger_zhou Date: Wed, 11 Sep 2024 21:19:42 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=97=E8=BD=A6=E6=8A=98=E8=BF=94rm=E6=A8=A1?= =?UTF-8?q?=E5=BC=8F=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config/dev.yml | 8 +- dto/state_proto/device_state.pb.go | 110 +------ rts-sim-testing-message | 2 +- .../train_pc_sim/train_pc_receive_handler.go | 26 +- third_party/train_pc_sim/train_pc_sim.go | 136 ++++----- .../wayside/memory/wayside_memory_train.go | 11 +- .../wayside/memory/wayside_simulation.go | 10 +- .../memory/wayside_simulation_train_pc.go | 269 +++++++----------- 8 files changed, 211 insertions(+), 361 deletions(-) diff --git a/config/dev.yml b/config/dev.yml index 9691b36..5612785 100644 --- a/config/dev.yml +++ b/config/dev.yml @@ -6,8 +6,8 @@ server: # 数据源 datasource: # 数据库访问url - dsn: root:root@tcp(127.0.0.1:3306)/bj-rtss?charset=utf8mb4&parseTime=true&loc=UTC -# dsn: root:joylink0503@tcp(192.168.33.233:3306)/bj-rtss?charset=utf8mb4&parseTime=true&loc=UTC +# dsn: root:root@tcp(127.0.0.1:3306)/bj-rtss?charset=utf8mb4&parseTime=true&loc=UTC + dsn: root:joylink0503@tcp(192.168.33.233:3306)/bj-rtss?charset=utf8mb4&parseTime=true&loc=UTC # 日志配置 logging: @@ -33,7 +33,7 @@ logging: # 消息配置 messaging: mqtt: - address: tcp://127.0.0.1:1883 -# address: tcp://192.168.33.233:1883 +# address: tcp://127.0.0.1:1883 + address: tcp://192.168.33.233:1883 username: rtsts_service password: joylink@0503 \ No newline at end of file diff --git a/dto/state_proto/device_state.pb.go b/dto/state_proto/device_state.pb.go index b329b65..a09907b 100644 --- a/dto/state_proto/device_state.pb.go +++ b/dto/state_proto/device_state.pb.go @@ -1210,8 +1210,8 @@ type TrainState struct { TrainEmergencyBrake float32 `protobuf:"fixed32,38,opt,name=TrainEmergencyBrake,proto3" json:"TrainEmergencyBrake,omitempty"` //列车紧急制动减速度 ProjectCode string `protobuf:"bytes,39,opt,name=projectCode,proto3" json:"projectCode,omitempty"` // TrainBtmCache BtmBaliseCache = 40; - TrainPort TrainState_TrainPort `protobuf:"varint,40,opt,name=trainPort,proto3,enum=state.TrainState_TrainPort" json:"trainPort,omitempty"` //列车当前驾驶的端口 - PulseCountMap map[int32]*SensorSpeedPulseCount `protobuf:"bytes,41,rep,name=pulseCountMap,proto3" json:"pulseCountMap,omitempty" protobuf_key:"varint,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + TrainPort TrainState_TrainPort `protobuf:"varint,40,opt,name=trainPort,proto3,enum=state.TrainState_TrainPort" json:"trainPort,omitempty"` //列车当前驾驶的端口 + PulseCountMap map[int32]*SensorSpeedPulseCount `protobuf:"bytes,41,rep,name=pulseCountMap,proto3" json:"pulseCountMap,omitempty" protobuf_key:"varint,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` //列车每端对应的速度 key = TrainPort 枚举的值 } func (x *TrainState) Reset() { @@ -5224,16 +5224,8 @@ type TrainControlState struct { DriverKey []*TrainControlState_DriverKeySwitch `protobuf:"bytes,2,rep,name=driverKey,proto3" json:"driverKey,omitempty"` //驾驶端激活 SwitchKeyMap map[string]*TrainControlState_SwitchKeyChange `protobuf:"bytes,3,rep,name=switchKeyMap,proto3" json:"switchKeyMap,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // DirectionKeySwitch dirKey = 3; //接车运行方向 - PushHandler *TrainControlState_PushHandler `protobuf:"bytes,4,opt,name=pushHandler,proto3" json:"pushHandler,omitempty"` //牵引制动手柄 - LightMaps map[string]*TrainControlState_ControlLight `protobuf:"bytes,5,rep,name=lightMaps,proto3" json:"lightMaps,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - LineInitTimeStamp12PortA int64 `protobuf:"varint,6,opt,name=lineInitTimeStamp12PortA,proto3" json:"lineInitTimeStamp12PortA,omitempty"` //12号线列出初始化时间戳 - LineInitTimeStamp12PortB int64 `protobuf:"varint,7,opt,name=lineInitTimeStamp12PortB,proto3" json:"lineInitTimeStamp12PortB,omitempty"` //12号线列出初始化时间戳 - Line12ConnErrPortA bool `protobuf:"varint,8,opt,name=line12ConnErrPortA,proto3" json:"line12ConnErrPortA,omitempty"` //12号线连接错误,因为12号线atp故障(此时atp需要重启)时,还是会发送数据通过此次属性标记atp状态情况(多次观察atp故障时,atp输出数字量返回的数据最后一个直接是0) - Line12ConnErrPortB bool `protobuf:"varint,9,opt,name=line12ConnErrPortB,proto3" json:"line12ConnErrPortB,omitempty"` //12号线连接错误,因为12号线atp故障(此时atp需要重启)时,还是会发送数据通过此次属性标记atp状态情况(多次观察atp故障时,atp输出数字量返回的数据最后一个直接是0) - TrainConnInitComplatePortA bool `protobuf:"varint,10,opt,name=TrainConnInitComplatePortA,proto3" json:"TrainConnInitComplatePortA,omitempty"` - TrainConnInitComplatePortB bool `protobuf:"varint,11,opt,name=TrainConnInitComplatePortB,proto3" json:"TrainConnInitComplatePortB,omitempty"` - ActiveTrainA bool `protobuf:"varint,12,opt,name=activeTrainA,proto3" json:"activeTrainA,omitempty"` - ActiveTrainB bool `protobuf:"varint,13,opt,name=activeTrainB,proto3" json:"activeTrainB,omitempty"` + PushHandler *TrainControlState_PushHandler `protobuf:"bytes,4,opt,name=pushHandler,proto3" json:"pushHandler,omitempty"` //牵引制动手柄 + LightMaps map[string]*TrainControlState_ControlLight `protobuf:"bytes,5,rep,name=lightMaps,proto3" json:"lightMaps,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` } func (x *TrainControlState) Reset() { @@ -5303,62 +5295,6 @@ func (x *TrainControlState) GetLightMaps() map[string]*TrainControlState_Control return nil } -func (x *TrainControlState) GetLineInitTimeStamp12PortA() int64 { - if x != nil { - return x.LineInitTimeStamp12PortA - } - return 0 -} - -func (x *TrainControlState) GetLineInitTimeStamp12PortB() int64 { - if x != nil { - return x.LineInitTimeStamp12PortB - } - return 0 -} - -func (x *TrainControlState) GetLine12ConnErrPortA() bool { - if x != nil { - return x.Line12ConnErrPortA - } - return false -} - -func (x *TrainControlState) GetLine12ConnErrPortB() bool { - if x != nil { - return x.Line12ConnErrPortB - } - return false -} - -func (x *TrainControlState) GetTrainConnInitComplatePortA() bool { - if x != nil { - return x.TrainConnInitComplatePortA - } - return false -} - -func (x *TrainControlState) GetTrainConnInitComplatePortB() bool { - if x != nil { - return x.TrainConnInitComplatePortB - } - return false -} - -func (x *TrainControlState) GetActiveTrainA() bool { - if x != nil { - return x.ActiveTrainA - } - return false -} - -func (x *TrainControlState) GetActiveTrainB() bool { - if x != nil { - return x.ActiveTrainB - } - return false -} - // 返回前端列车控制状态 type TrainControlStateMsg struct { state protoimpl.MessageState @@ -5565,6 +5501,14 @@ func (x *StationQc_State) GetOn() bool { return false } +// int64 lineInitTimeStamp12PortA = 6; //12号线列出初始化时间戳 +// int64 lineInitTimeStamp12PortB = 7; //12号线列出初始化时间戳 +// bool line12ConnErrPortA = 8;//12号线连接错误,因为12号线atp故障(此时atp需要重启)时,还是会发送数据通过此次属性标记atp状态情况(多次观察atp故障时,atp输出数字量返回的数据最后一个直接是0) +// bool line12ConnErrPortB = 9;//12号线连接错误,因为12号线atp故障(此时atp需要重启)时,还是会发送数据通过此次属性标记atp状态情况(多次观察atp故障时,atp输出数字量返回的数据最后一个直接是0) +// bool TrainConnInitComplatePortA = 10; +// bool TrainConnInitComplatePortB = 11; +// bool activeTrainA = 12; +// bool activeTrainB = 13; // bool Line12ConnErr = 14; // int64 lineInitTimeStamp12 = 15; type TrainControlState_ControlButton struct { @@ -6824,7 +6768,7 @@ var file_device_state_proto_rawDesc = []byte{ 0x63, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, - 0x65, 0x22, 0xd5, 0x0a, 0x0a, 0x11, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x72, + 0x65, 0x22, 0xb5, 0x07, 0x0a, 0x11, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x3f, 0x0a, 0x07, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x53, 0x74, 0x61, @@ -6847,33 +6791,7 @@ var file_device_state_proto_rawDesc = []byte{ 0x74, 0x4d, 0x61, 0x70, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x4c, 0x69, 0x67, 0x68, 0x74, 0x4d, 0x61, 0x70, 0x73, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x4d, 0x61, 0x70, 0x73, 0x12, - 0x3a, 0x0a, 0x18, 0x6c, 0x69, 0x6e, 0x65, 0x49, 0x6e, 0x69, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x53, - 0x74, 0x61, 0x6d, 0x70, 0x31, 0x32, 0x50, 0x6f, 0x72, 0x74, 0x41, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x18, 0x6c, 0x69, 0x6e, 0x65, 0x49, 0x6e, 0x69, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x53, - 0x74, 0x61, 0x6d, 0x70, 0x31, 0x32, 0x50, 0x6f, 0x72, 0x74, 0x41, 0x12, 0x3a, 0x0a, 0x18, 0x6c, - 0x69, 0x6e, 0x65, 0x49, 0x6e, 0x69, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x74, 0x61, 0x6d, 0x70, - 0x31, 0x32, 0x50, 0x6f, 0x72, 0x74, 0x42, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x18, 0x6c, - 0x69, 0x6e, 0x65, 0x49, 0x6e, 0x69, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x74, 0x61, 0x6d, 0x70, - 0x31, 0x32, 0x50, 0x6f, 0x72, 0x74, 0x42, 0x12, 0x2e, 0x0a, 0x12, 0x6c, 0x69, 0x6e, 0x65, 0x31, - 0x32, 0x43, 0x6f, 0x6e, 0x6e, 0x45, 0x72, 0x72, 0x50, 0x6f, 0x72, 0x74, 0x41, 0x18, 0x08, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x12, 0x6c, 0x69, 0x6e, 0x65, 0x31, 0x32, 0x43, 0x6f, 0x6e, 0x6e, 0x45, - 0x72, 0x72, 0x50, 0x6f, 0x72, 0x74, 0x41, 0x12, 0x2e, 0x0a, 0x12, 0x6c, 0x69, 0x6e, 0x65, 0x31, - 0x32, 0x43, 0x6f, 0x6e, 0x6e, 0x45, 0x72, 0x72, 0x50, 0x6f, 0x72, 0x74, 0x42, 0x18, 0x09, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x12, 0x6c, 0x69, 0x6e, 0x65, 0x31, 0x32, 0x43, 0x6f, 0x6e, 0x6e, 0x45, - 0x72, 0x72, 0x50, 0x6f, 0x72, 0x74, 0x42, 0x12, 0x3e, 0x0a, 0x1a, 0x54, 0x72, 0x61, 0x69, 0x6e, - 0x43, 0x6f, 0x6e, 0x6e, 0x49, 0x6e, 0x69, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, - 0x50, 0x6f, 0x72, 0x74, 0x41, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x1a, 0x54, 0x72, 0x61, - 0x69, 0x6e, 0x43, 0x6f, 0x6e, 0x6e, 0x49, 0x6e, 0x69, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x61, - 0x74, 0x65, 0x50, 0x6f, 0x72, 0x74, 0x41, 0x12, 0x3e, 0x0a, 0x1a, 0x54, 0x72, 0x61, 0x69, 0x6e, - 0x43, 0x6f, 0x6e, 0x6e, 0x49, 0x6e, 0x69, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, - 0x50, 0x6f, 0x72, 0x74, 0x42, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x1a, 0x54, 0x72, 0x61, - 0x69, 0x6e, 0x43, 0x6f, 0x6e, 0x6e, 0x49, 0x6e, 0x69, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x61, - 0x74, 0x65, 0x50, 0x6f, 0x72, 0x74, 0x42, 0x12, 0x22, 0x0a, 0x0c, 0x61, 0x63, 0x74, 0x69, 0x76, - 0x65, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x41, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, - 0x63, 0x74, 0x69, 0x76, 0x65, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x41, 0x12, 0x22, 0x0a, 0x0c, 0x61, - 0x63, 0x74, 0x69, 0x76, 0x65, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x42, 0x18, 0x0d, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x0c, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x42, 0x1a, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x4d, 0x61, 0x70, 0x73, 0x1a, 0x62, 0x0a, 0x0c, 0x42, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x3c, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, diff --git a/rts-sim-testing-message b/rts-sim-testing-message index 35c2c8e..76a91b6 160000 --- a/rts-sim-testing-message +++ b/rts-sim-testing-message @@ -1 +1 @@ -Subproject commit 35c2c8e7748a4a30230ef4fcaedbfd7d2466299d +Subproject commit 76a91b6495fc3a6b725b4ff3ba003423e3efb38e diff --git a/third_party/train_pc_sim/train_pc_receive_handler.go b/third_party/train_pc_sim/train_pc_receive_handler.go index ef83f5a..6954ebd 100644 --- a/third_party/train_pc_sim/train_pc_receive_handler.go +++ b/third_party/train_pc_sim/train_pc_receive_handler.go @@ -18,7 +18,20 @@ type TrainPcReciverData struct { speedPlace *message.TrainSpeedPlaceReportMsg train *state_proto.TrainState success bool - aPort bool + //aPort bool //列车钥匙激活端口 true = 1端 ,false = 2端 + RealTrainPort state_proto.TrainState_TrainPort + LineInitTimeStamp int64 + TrainConnInitComplate bool + ConnErr bool +} + +func (rd *TrainPcReciverData) ConnError() bool { + connState := tpapi.ThirdPartyState_Normal + if rd.ConnErr { + connState = tpapi.ThirdPartyState_Broken + } + rd.updateState(connState) + return rd.ConnErr } func (rd *TrainPcReciverData) Name() string { @@ -40,10 +53,13 @@ func (d *TrainPcReciverData) readError(err error) { } func (d *TrainPcReciverData) ServiceDesc() string { - if d.aPort { + if d.RealTrainPort == state_proto.TrainState_PORT_A { return fmt.Sprintf("%v-A端", d.clientKey) - } else { + } else if d.RealTrainPort == state_proto.TrainState_PORT_B { return fmt.Sprintf("%v-B端", d.clientKey) + } else { + return fmt.Sprintf("%v-位置服务端口", d.clientKey) + } } @@ -70,11 +86,11 @@ func (rd *TrainPcReciverData) receiverDataHandle(n int, data []byte) { //case RECIVE_TRAIN_CREATE_REMOVE: // pc.trainPcSimManage.TrainPcSimConnOrRemoveHandle(baseMsg.Data[0]) case message.RECIVE_TRAIN_INTERFACE_CABINET_OUTR: - rd.pcSimManage.TrainPcSimDigitalOutInfoHandle(rd.aPort, rd.tcpClient, train, baseMsg.Data) + rd.pcSimManage.TrainPcSimDigitalOutInfoHandle(rd, train, baseMsg.Data) case message.RECIVE_TRAIN_INTERFACE_CABINET_OUTR_BACK: rd.pcSimManage.TrainPcSimDigitalReportHandle(train, baseMsg.Data) case message.RECIVE_TRAIN_QUERY_STATUS: - rd.pcSimManage.TrainBtmQuery2(train, baseMsg.Data, rd.aPort) + rd.pcSimManage.TrainBtmQuery2(train, baseMsg.Data, rd.RealTrainPort) //case message.RECIVE_TRAIN_MOCK_DATA: // rd.pcSimManage.TrainPcSimMockInfo(train, baseMsg.Data) diff --git a/third_party/train_pc_sim/train_pc_sim.go b/third_party/train_pc_sim/train_pc_sim.go index 32865a9..9b2c1a3 100644 --- a/third_party/train_pc_sim/train_pc_sim.go +++ b/third_party/train_pc_sim/train_pc_sim.go @@ -36,12 +36,13 @@ type TrainPcSim interface { //因文档说明不清楚,在调用的时候目前是注释状态,现场调试可能会用到 SendTrainDirection(train *state_proto.TrainState, trainForward, trainBackward bool) //发送应答器信息数据 - SendBaliseData(train *state_proto.TrainState, trainPort bool, msgType byte, data []byte) + + SendBaliseData2(train *state_proto.TrainState, trainClientPort state_proto.TrainState_TrainPort, msgType byte, data []byte) //发布列车控制的相关事件 //PublishTrainControlEvent(train *state_proto.TrainState, events []TrainControlEvent) - SendTrainControlMsg(train *state_proto.TrainState, baseMessage []message.TrainPcSimBaseMessage, aport bool) + SendTrainControlMsg2(train *state_proto.TrainState, baseMessage []message.TrainPcSimBaseMessage, trainClientPort state_proto.TrainState_TrainPort) // CreateOrRemoveSpeedPLace 创建或删除速度位置信息 //CreateOrRemoveSpeedPLace(train *state_proto.TrainState) // CreateOrRemoveTrain 创建或删除列车 @@ -57,7 +58,7 @@ type TrainPcSimManage interface { //获取列车模拟量数据 ObtainTrainDigitalMockData(train *state_proto.TrainState) []message.TrainPcSimBaseMessage // TrainPcSimDigitalOutInfoHandle 4.4.1. 车载输出数字量信息报文内容 - TrainPcSimDigitalOutInfoHandle(aport bool, client *tcp.TcpClient, train *state_proto.TrainState, data []byte) bool + TrainPcSimDigitalOutInfoHandle(pc *TrainPcReciverData, train *state_proto.TrainState, data []byte) bool // TrainPcSimDigitalReportHandle 4.4.2. 车载输出数字反馈量信息报文内容 TrainPcSimDigitalReportHandle(train *state_proto.TrainState, data []byte) FindConnTrain(ct state_proto.TrainConnState_TrainConnType) *state_proto.TrainState @@ -67,7 +68,7 @@ type TrainPcSimManage interface { TrainPcSimMockInfo(train *state_proto.TrainState, data []byte) // TrainBtmQuery 处理列车btm查询 - TrainBtmQuery2(train *state_proto.TrainState, data []byte, trainPort bool) + TrainBtmQuery2(train *state_proto.TrainState, data []byte, trainClientPort state_proto.TrainState_TrainPort) } type trainPcSimService struct { state tpapi.ThirdPartyApiServiceState @@ -116,18 +117,19 @@ func (d *trainPcSimService) ServiceDesc() string { func FindTrainPcSimClientKey2(t *state_proto.TrainState) string { return t.ConnState.TypeName } -func (d *trainPcSimService) findTrainConnForPort(sta *state_proto.TrainState, aport bool) (*TrainPcReciverData, error) { +func (d *trainPcSimService) findTrainConnForPort2(sta *state_proto.TrainState, trainClientPort state_proto.TrainState_TrainPort) (*TrainPcReciverData, error) { rds := d.newPcSimclientMap3[sta.ConnState.TypeName] if rds == nil { return nil, fmt.Errorf("") } for _, rd := range rds { - if rd.aPort == aport { + if rd.RealTrainPort == trainClientPort { return rd, nil } } return nil, fmt.Errorf("") } + func (d *trainPcSimService) findTrainConn(sta *state_proto.TrainState) (*TrainPcReciverData, error) { rds := d.newPcSimclientMap3[sta.ConnState.TypeName] if rds == nil { @@ -260,13 +262,21 @@ func (d *trainPcSimService) initConn2(clientKey string) error { } e1 := d.connServer(cfg.OpenA, cfg.APcSimIp, cfg.APcSimPort, rd1) if e1 != nil { + rd1.updateState(tpapi.ThirdPartyState_Broken) return sys_error.New(fmt.Sprintf("配置:%v 端口A连接失败", clientKey)) } e2 := d.connServer(cfg.OpenB, cfg.BPcSimIp, cfg.BPcSimPort, rd2) if e2 != nil { + rd1.updateState(tpapi.ThirdPartyState_Broken) return sys_error.New(fmt.Sprintf("配置:%v 端口B连接失败", clientKey)) } - rd1.aPort = true + if rd1.success { + //rd1.aPort = true + rd1.RealTrainPort = state_proto.TrainState_PORT_A + } + if rd2.success { + rd2.RealTrainPort = state_proto.TrainState_PORT_B + } return nil } @@ -284,7 +294,7 @@ func (d *trainPcSimService) connServer(open bool, ip string, port uint32, rd *Tr //slog.Info(addr, "连接.,...") client2, err := tcp.StartTcpClient(addr, rd.receiverDataHandle, rd.readError) if err != nil { - rd.updateState(tpapi.ThirdPartyState_Broken) + return sys_error.New(fmt.Sprintf("车载atp连接失败,add:%v ,message:%v", addr, err)) } else { rd.success = true rd.tcpClient = client2 @@ -348,13 +358,14 @@ func (d *trainPcSimService) Stop() { func (d *trainPcSimService) CreateOrRemoveTrain(train *state_proto.TrainState, isCreate bool) error { clientKey := FindTrainPcSimClientKey2(train) - err := d.initConn2(clientKey) - if err != nil { - d.newCloseConn(clientKey) - return err - } + data := []byte{message.FLAG_CAMMAND_REMOVE_TRAIN} if isCreate { + err := d.initConn2(clientKey) + if err != nil { + d.newCloseConn(clientKey) + return err + } data[0] = message.FLAG_CAMMAND_CREATE_TRAIN } msg := &message.TrainPcSimBaseMessage{Data: data, Type: message.RECIVE_TRAIN_CREATE_REMOVE} @@ -386,12 +397,9 @@ func (d *trainPcSimService) initTrain(rd *TrainPcReciverData, train *state_proto train.PulseCountMap[int32(state_proto.TrainState_PORT_B.Number())] = &state_proto.SensorSpeedPulseCount{} rd.train = train tcc := train.Tcc - tcc.LineInitTimeStamp12PortA = 0 - tcc.LineInitTimeStamp12PortB = 0 - tcc.Line12ConnErrPortA = false - tcc.Line12ConnErrPortB = false - //tcc.LineInitTimeStamp12 = 0 - //tcc.Line12ConnErr = false + rd.TrainConnInitComplate = false + rd.LineInitTimeStamp = 0 + if isCreate { tmpMsgs := d.trainPcSimManage.ObtainTrainDigitalMockData(train) msgs = append(msgs, tmpMsgs...) @@ -433,35 +441,22 @@ func (d *trainPcSimService) sendTrainLocationAndSpeedTask(ctx context.Context) { if train.ConnState.Conn { for numKey, pc := range train.PulseCountMap { trainPort := state_proto.TrainState_TrainPort(numKey) - aPort := true - if trainPort == state_proto.TrainState_PORT_B { - aPort = false - } - trainClient, _ := d.findTrainConnForPort(train, aPort) + trainClient, _ := d.findTrainConnForPort2(train, trainPort) if trainClient.success { if trainClient.speedPlace == nil || trainClient.tcpClient == nil { slog.Error(fmt.Sprintf("pc仿真速度位置脉冲对象为空 列车id:%v", train.Id)) continue } - connState := tpapi.ThirdPartyState_Normal - if trainClient.aPort && train.Tcc.Line12ConnErrPortA { - connState = tpapi.ThirdPartyState_Broken - } else if trainClient.aPort == false && train.Tcc.Line12ConnErrPortB { - connState = tpapi.ThirdPartyState_Broken - } - trainClient.updateState(connState) - s1, _ := d.pluseSpeed(pc, train.WheelDiameter) - runDir := uint16(2) - if train.VobcState.DirectionForward { - runDir = 1 - } else if train.VobcState.DirectionBackward { - runDir = 0 + if trainClient.ConnError() { + continue } + s1, speed := d.pluseSpeed(pc, train.WheelDiameter) + runDir := d.trainDirection(speed, train, trainClient.RealTrainPort) disPluse := pluseCountSpeed(train.WheelDiameter, trainClient.speedPlace.PulseCount1) data := trainClient.speedPlace.Encode(runDir, s1, disPluse) bm := &message.TrainPcSimBaseMessage{Type: message.SENDER_TRAIN_LOCATION_INFO, Data: data} dataCode := bm.Encode() - //slog.Info(fmt.Sprintf("发送列车速度位置,列车:%v,A端:%v,列车速度:%v,计数脉冲: %v,累计里程: %v ,发送数据:%v", train.Id, trainClient.aPort, speed, s1, trainClient.speedPlace.PulseCount1, hex.EncodeToString(dataCode)), trainClient.aPort) + slog.Info(fmt.Sprintf("发送列车速度位置,列车:%v,列车服务端:%v,列车速度:%v,计数脉冲: %v,累计里程: %v ,发送数据:%X", train.Id, trainClient.RealTrainPort.String(), speed, s1, trainClient.speedPlace.PulseCount1, dataCode)) err := trainClient.tcpClient.Send(dataCode) if err != nil { slog.Error(fmt.Sprintf("发送列车速度位置失败,列车:%v,发送数据:%v", train.Id, hex.EncodeToString(dataCode))) @@ -473,44 +468,28 @@ func (d *trainPcSimService) sendTrainLocationAndSpeedTask(ctx context.Context) { } } -// SendDriverActive Deprecated 发送驾驶激活 -/*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 - } +func (d *trainPcSimService) trainDirection(speed float32, train *state_proto.TrainState, clientPort state_proto.TrainState_TrainPort) uint16 { + runDir := uint16(2) vobc := train.VobcState - msg := &message.TrainPcSimBaseMessage{} - - if trainClient.aPort { - msg.Type = message.SENDER_TRAIN_TC_NOT_ACTIVE - if vobc.Tc1Active { - msg.Type = message.SENDER_TRAIN_TC_ACTIVE - } - } else { - msg.Type = message.SENDER_TRAIN_TC_NOT_ACTIVE - if vobc.Tc2Active { - msg.Type = message.SENDER_TRAIN_TC_ACTIVE + if speed == 0 || train.TrainPort == state_proto.TrainState_PORT_NONE || (vobc.DirectionForward == false && vobc.DirectionBackward == false) { + return runDir + } + if vobc.DirectionForward { + runDir = 1 + } else if vobc.DirectionBackward { + runDir = 0 + } + if train.TrainPort != clientPort { + if vobc.DirectionForward { + runDir = 0 + } else if vobc.DirectionBackward { + runDir = 1 } } - msgs := make([]byte, 0) - 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), trainClient.aPort) - err := trainClient.tcpClient.Send(msgs) - if err != nil { - slog.Error(fmt.Sprintf("发送驾驶激活失败列车id:%v,数据:%v,err:%v", train.Id, hexData, err.Error())) - } -}*/ + return runDir +} + func (d *trainPcSimService) SendHandleSwitch(oldTraction, oldBrakeForce int64, tractionState bool, train *state_proto.TrainState) { trainClient, trainDataErr := d.findTrainConn(train) if trainDataErr != nil { @@ -580,9 +559,9 @@ func (d *trainPcSimService) SendTrainDirection(train *state_proto.TrainState, tr } } -func (d *trainPcSimService) SendBaliseData(train *state_proto.TrainState, trainPort bool, msgType byte, data []byte) { - //trainClient, trainDataErr := d.findTrainConn(train) - trainClient, trainDataErr := d.findTrainConnForPort(train, trainPort) +func (d *trainPcSimService) SendBaliseData2(train *state_proto.TrainState, trainClientPort state_proto.TrainState_TrainPort, msgType byte, data []byte) { + + trainClient, trainDataErr := d.findTrainConnForPort2(train, trainClientPort) if trainDataErr != nil { slog.Error(fmt.Sprintf("发送列车PC仿真应答器信息失败,未找到列车连接,trainId:%v", train.Id)) return @@ -599,12 +578,12 @@ func (d *trainPcSimService) SendBaliseData(train *state_proto.TrainState, trainP } } -func (d *trainPcSimService) SendTrainControlMsg(train *state_proto.TrainState, baseMessage []message.TrainPcSimBaseMessage, aport bool) { +func (d *trainPcSimService) SendTrainControlMsg2(train *state_proto.TrainState, baseMessage []message.TrainPcSimBaseMessage, trainClientPort state_proto.TrainState_TrainPort) { if len(baseMessage) <= 0 { return } //trainClient, trainDataErr := d.findTrainConn(train) - trainClient, trainDataErr := d.findTrainConnForPort(train, aport) + trainClient, trainDataErr := d.findTrainConnForPort2(train, trainClientPort) if trainDataErr != nil { slog.Error(fmt.Sprintf("发送列车控制信息失败,无连接,列车Id:%v", train.Id)) return @@ -612,10 +591,11 @@ func (d *trainPcSimService) SendTrainControlMsg(train *state_proto.TrainState, b for _, msg := range baseMessage { dd := msg.Encode() - slog.Info(fmt.Sprintf("发送操控列车控制信息:%x", dd), aport) + //slog.Info(fmt.Sprintf("发送操控列车控制信息:%x", dd), aport) d.sendData(trainClient.tcpClient, dd) } } + func (d *trainPcSimService) sendData(client *tcp.TcpClient, data []byte) { err := client.Send(data) if err != nil { diff --git a/ts/simulation/wayside/memory/wayside_memory_train.go b/ts/simulation/wayside/memory/wayside_memory_train.go index 31b349e..09564af 100644 --- a/ts/simulation/wayside/memory/wayside_memory_train.go +++ b/ts/simulation/wayside/memory/wayside_memory_train.go @@ -171,8 +171,8 @@ func TrainConnTypeUpdate(vs *VerifySimulation, ct *dto.TrainConnThirdDto) { train.ConnState.TypeName = ct.TypeName if ct.ConnType == state_proto.TrainConnState_PC_SIM { //train.Tcc.LineInitTimeStamp12 = 0 - train.Tcc.LineInitTimeStamp12PortA = 0 - train.Tcc.LineInitTimeStamp12PortB = 0 + //train.Tcc.LineInitTimeStamp12PortA = 0 + //train.Tcc.LineInitTimeStamp12PortB = 0 err := TrainPcSimConnOrRemoveHandle(train, true) if err != nil { @@ -356,6 +356,13 @@ func UpdateTrainStateByDynamics(vs *VerifySimulation, trainId string, info *mess if sta.OldLinkOffset != outLinkOffset { sta.OldLinkOffset = outLinkOffset } + if sta.OldTailLink != tailLinkId { + sta.OldTailLink = tailLinkId + } + if sta.OldTailLinkOffset != tailLinkOffset { + sta.OldTailLinkOffset = tailLinkOffset + } + sta.HeadDeviceId = vs.GetComIdByUid(id) sta.DevicePort = port sta.HeadOffset = offset diff --git a/ts/simulation/wayside/memory/wayside_simulation.go b/ts/simulation/wayside/memory/wayside_simulation.go index d999616..cbdea69 100644 --- a/ts/simulation/wayside/memory/wayside_simulation.go +++ b/ts/simulation/wayside/memory/wayside_simulation.go @@ -272,14 +272,12 @@ func (s *VerifySimulation) HandleDynamicsTrainInfo(info *message.DynamicsTrainIn acc.Default().TrainAccSender(info, trainState) } if vs.Ato { - trainPort := true - if train.TrainPort == state_proto.TrainState_PORT_B { - trainPort = false - } else if train.TrainPort == state_proto.TrainState_PORT_NONE { + + if train.TrainPort == state_proto.TrainState_PORT_NONE { slog.Info("") return } - trainAtoControlTractionAndBrake(train, trainPort) + trainAtoControlTractionAndBrake(train) var msgs []message.TrainPcSimBaseMessage if vs.AtoOpenRightDoor || vs.AtoOpenLeftDoor { btn := train.Tcc.Buttons[KZM] @@ -294,7 +292,7 @@ func (s *VerifySimulation) HandleDynamicsTrainInfo(info *message.DynamicsTrainIn } msgs = controlDoorCloseBtn(train.VobcState, true, btn, vs.AtoOpenLeftDoor, false) } - train_pc_sim.Default().SendTrainControlMsg(train, msgs, trainPort) + train_pc_sim.Default().SendTrainControlMsg2(train, msgs, train.TrainPort) } else if vs.TractionStatus { f := trainTractionPower(train.TrainLoad, train.Tcc.PushHandler.Val, trainState.DynamicState.Speed, train.TrainMaxAcc, train.TrainMaxSpeed) vs.TractionForce = f / 1000 * 100 diff --git a/ts/simulation/wayside/memory/wayside_simulation_train_pc.go b/ts/simulation/wayside/memory/wayside_simulation_train_pc.go index 7fe837d..a43e435 100644 --- a/ts/simulation/wayside/memory/wayside_simulation_train_pc.go +++ b/ts/simulation/wayside/memory/wayside_simulation_train_pc.go @@ -80,16 +80,10 @@ func ControlTrainUpdate(s *VerifySimulation, ct *request_proto.TrainControl) { vobc.TractionForce = 0 } if sta.ConnState.Conn && (sta.ConnState.ConnType == state_proto.TrainConnState_PC_SIM) && baseMsg != nil { - if sta.TrainPort == state_proto.TrainState_PORT_A { - train_pc_sim.Default().SendTrainControlMsg(sta, baseMsg, true) - } else if sta.TrainPort == state_proto.TrainState_PORT_B { - train_pc_sim.Default().SendTrainControlMsg(sta, baseMsg, false) - } + train_pc_sim.Default().SendTrainControlMsg2(sta, baseMsg, sta.TrainPort) if vobc.Tc1Active == false && vobc.Tc2Active == false { sta.TrainPort = state_proto.TrainState_PORT_NONE } - //train_pc_sim.Default().SendTrainControlMsg(sta, baseMsg, aPort) - } } @@ -399,10 +393,13 @@ func trainControlDriverKey(train *state_proto.TrainState, request *request_proto if obj.Code == SKQYS1 { vobc.Tc1Active = request.Val train.TrainPort = state_proto.TrainState_PORT_A + train.BtmBaliseCacheA = &state_proto.TrainBtmCache{BaliseList: make([]*state_proto.BTMState, 3)} } else if obj.Code == SKQYS2 { vobc.Tc2Active = request.Val train.TrainPort = state_proto.TrainState_PORT_B + train.BtmBaliseCacheB = &state_proto.TrainBtmCache{BaliseList: make([]*state_proto.BTMState, 3)} } + if vobc.Tc1Active && vobc.Tc2Active { if obj.Code == SKQYS1 { vobc.Tc1Active = false @@ -411,26 +408,26 @@ func trainControlDriverKey(train *state_proto.TrainState, request *request_proto } panic(sys_error.New("驾驶端不能同时激活")) } - var addNew = true + for _, k := range tcc.DriverKey { if k.Id == deviceId { k.Id = deviceId k.Val = request.Val - addNew = false break } } - if addNew { - tcc.DriverKey = append(tcc.DriverKey, &state_proto.TrainControlState_DriverKeySwitch{Id: deviceId, Val: request.Val}) - } + tce := make([]message.TrainPcSimBaseMessage, 0) tce = append(tce, message.TrainPcSimBaseMessage{Type: message.SENDER_TRAIN_OUTR_INFO, Data: []byte{message.KEY_STATE, message.IsTrue(request.Val)}}) + train.OldLink = "" + train.OldLinkOffset = 0 + train.OldTailLink = "" + train.OldTailLinkOffset = 0 if request.Val { tce = append(tce, message.TrainPcSimBaseMessage{Type: message.SENDER_TRAIN_TC_ACTIVE}) } else { tce = append(tce, message.TrainPcSimBaseMessage{Type: message.SENDER_TRAIN_TC_NOT_ACTIVE}) } - //tce = append(tce, message.TrainPcSimBaseMessage{Type: message.SENDER_TRAIN_OUTR_INFO, Data: []byte{message.DRIVER_ACTIVE_REPORT, message.IsTrue(request.Val)}}) return tce @@ -503,7 +500,7 @@ func trainTractionPowerAtoStepLevel(trainLoad int32, speedKM int32, stepLevel in f := float64(m) * (acc * (1 - speedM/sp)) return int64(f) } -func trainAtoControlTractionAndBrake(train *state_proto.TrainState, aport bool) { +func trainAtoControlTractionAndBrake(train *state_proto.TrainState) { vs := train.VobcState vs.TractionStatus = false vs.TractionForce = 0 @@ -534,7 +531,7 @@ func trainAtoControlTractionAndBrake(train *state_proto.TrainState, aport bool) {Type: message.SENDER_TRAIN_OUTR_INFO, Data: []byte{message.NOT_BREAK, notBreak}}, } slog.Info(fmt.Sprintf("列车 id:%v,ato:%v,AtoLevle:%v,牵引:%v,制动:%v,牵引力:%v,制动力%v", train.Id, vs.Ato, vs.AtoStepLevel, vs.AtoTractionCommandOut, vs.AtoBrakeCommand, vs.TractionForce, vs.BrakeForce)) - train_pc_sim.Default().SendTrainControlMsg(train, msg, aport) + train_pc_sim.Default().SendTrainControlMsg2(train, msg, train.TrainPort) } // 列车牵引控制 @@ -629,95 +626,7 @@ func (s *VerifySimulation) FindConnTrain(ct state_proto.TrainConnState_TrainConn } // 反馈atp输出数字量数据 -func (s *VerifySimulation) reportTrainMockInitMsg(aport bool, client *tcp.TcpClient, train *state_proto.TrainState, data1, data3 byte) { - vobc := train.VobcState - tcc := train.Tcc - tce := make([]message.TrainPcSimBaseMessage, 0) - initTimeStamp := tcc.LineInitTimeStamp12PortA - connErr := tcc.Line12ConnErrPortA - initConn := tcc.TrainConnInitComplatePortA - if vobc.Tc2Active { - initTimeStamp = tcc.LineInitTimeStamp12PortB - connErr = tcc.Line12ConnErrPortB - initConn = tcc.TrainConnInitComplatePortB - } - - //tcc.Line12ConnErr = false - if vobc.Tc1Active || vobc.Tc2Active { - state := message.GetBit(data1, 3) - if /* vobc.TrainConnInitComplate*/ initConn { - if data1 == 0 { - //tcc.Line12ConnErr = true - connErr = true - } - if state == 0 { - jjzdBtn := tcc.Buttons[JJZD] - ebTce := controlEBBtn(train, true, jjzdBtn) - tce = append(tce, ebTce...) - } else if message.GetBit(data1, 0) == 0 { - jjzdBtn := tcc.Buttons[JJZD] - ebTce := controlEBBtn(train, true, jjzdBtn) - tce = append(tce, ebTce...) - tce = append(tce, message.TrainPcSimBaseMessage{Type: message.SENDER_TRAIN_OUTR_INFO, Data: []byte{message.OUTER_EMERGENCY_BRAKE, state}}) - tce = append(tce, message.TrainPcSimBaseMessage{Type: message.SENDER_TRAIN_OUTR_INFO, Data: []byte{message.TRAIN_TRACTION_CUTED, 1}}) - } else { - tce = append(tce, message.TrainPcSimBaseMessage{Type: message.SENDER_TRAIN_OUTR_INFO, Data: []byte{message.OUTER_EMERGENCY_BRAKE, state}}) - } - } else { - initConn = true - if initTimeStamp <= 0 { - initTimeStamp = time.Now().Add(time.Second * 6).Unix() - } - if initTimeStamp > 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...) - if aport { - tcc.ActiveTrainA = true - } else { - tcc.ActiveTrainB = true - } - initConn = false - } - /*if vobc.LineInitTimeStamp12 <= 0 { - vobc.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...) - vobc.TrainConnInitComplate = false - }*/ - - } - if vobc.Tc1Active { - tcc.LineInitTimeStamp12PortA = initTimeStamp - tcc.Line12ConnErrPortB = connErr - tcc.TrainConnInitComplatePortA = initConn - } else if vobc.Tc2Active { - tcc.LineInitTimeStamp12PortA = initTimeStamp - tcc.Line12ConnErrPortB = connErr - tcc.TrainConnInitComplatePortB = initConn - } - //tce = append(tce, message.TrainPcSimBaseMessage{Type: message.SENDER_TRAIN_OUTR_INFO, Data: []byte{message.DRIVER_ACTIVE_REPORT, 1}}) - //驾驶室激活反馈 - if message.GetBit(data3, 3) == 0 { - act := byte(0) - if vobc.Tc1Active || vobc.Tc2Active { - act = 1 - } - tce = append(tce, message.TrainPcSimBaseMessage{Type: message.SENDER_TRAIN_OUTR_INFO, Data: []byte{message.DRIVER_ACTIVE_REPORT, act}}) - } - - tce = append(tce, message.TrainPcSimBaseMessage{Type: message.SENDER_TRAIN_OUTR_INFO, Data: []byte{message.TRAIN_INTEGRITY, 1}}) - - } - - //train_pc_sim.Default().SendTrainControlMsg(train, tce) - //return initResult -} - -func (s *VerifySimulation) reportTrainMockInitMsg2(aport, act, initConn bool, initTimeStamp int64, train *state_proto.TrainState, data1, data3 byte) (int64, bool, bool, []message.TrainPcSimBaseMessage) { +func (s *VerifySimulation) reportTrainMockInitMsg2(driverActive, initConn bool, initTimeStamp int64, trainClientPort state_proto.TrainState_TrainPort, train *state_proto.TrainState, data1, data3 byte) (int64, bool, bool, []message.TrainPcSimBaseMessage) { tcc := train.Tcc tce := make([]message.TrainPcSimBaseMessage, 0) @@ -727,16 +636,14 @@ func (s *VerifySimulation) reportTrainMockInitMsg2(aport, act, initConn bool, in if message.GetBit(data3, 3) == 0 { actt := byte(0) - if act { + if driverActive { actt = 1 } tce = append(tce, message.TrainPcSimBaseMessage{Type: message.SENDER_TRAIN_OUTR_INFO, Data: []byte{message.DRIVER_ACTIVE_REPORT, actt}}) } tce = append(tce, message.TrainPcSimBaseMessage{Type: message.SENDER_TRAIN_OUTR_INFO, Data: []byte{message.TRAIN_INTEGRITY, 1}}) - if act == false { - //tce = append(tce, message.TrainPcSimBaseMessage{Type: message.SENDER_TRAIN_OUTR_INFO, Data: []byte{message.OUTER_EMERGENCY_BRAKE, state}}) - //tce = append(tce, message.TrainPcSimBaseMessage{Type: message.SENDER_TRAIN_OUTR_INFO, Data: []byte{message.TRAIN_INTEGRITY, 1}}) + if driverActive == false { return initTimeStamp, initConn, false, tce } if initConn { @@ -744,12 +651,10 @@ func (s *VerifySimulation) reportTrainMockInitMsg2(aport, act, initConn bool, in connErr = true } if state == 0 { - //slog.Info("列车紧急制动%v", aport) jjzdBtn := tcc.Buttons[JJZD] ebTce := controlEBBtn(train, true, jjzdBtn) tce = append(tce, ebTce...) } else if message.GetBit(data1, 0) == 0 { - //slog.Info(fmt.Sprintf("列车紧切牵引%v ,state :%v", aport, state)) jjzdBtn := tcc.Buttons[JJZD] ebTce := controlEBBtn(train, true, jjzdBtn) tce = append(tce, ebTce...) @@ -766,11 +671,11 @@ func (s *VerifySimulation) reportTrainMockInitMsg2(aport, act, initConn bool, in 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...) - if aport { - tcc.ActiveTrainA = true - } else if aport == false { - tcc.ActiveTrainB = true - } + /* if trainClientPort == state_proto.TrainState_PORT_A { + tcc.ActiveTrainA = true + } else if trainClientPort == state_proto.TrainState_PORT_A { + tcc.ActiveTrainB = true + }*/ initConn = false } } @@ -797,7 +702,7 @@ func trainAtoLevel(at3, at2, at1 bool) state_proto.TrainVobcState_AtoStepLevel { return state_proto.TrainVobcState_ATO_STEP_LEVEL_NONE } } -func (s *VerifySimulation) shuziliang(aport bool, client *tcp.TcpClient, baseMessage []message.TrainPcSimBaseMessage) { +func (s *VerifySimulation) shuziliang(client *tcp.TcpClient, baseMessage []message.TrainPcSimBaseMessage) { for _, msg := range baseMessage { dd := msg.Encode() //slog.Info(fmt.Sprintf("发送列车控制信息:%x", dd), aport) @@ -807,7 +712,7 @@ func (s *VerifySimulation) shuziliang(aport bool, client *tcp.TcpClient, baseMes } // 4.4.1. 车载输出数字量信息报文内容 -func (s *VerifySimulation) TrainPcSimDigitalOutInfoHandle(aport bool, client *tcp.TcpClient, train *state_proto.TrainState, data []byte) bool { +func (s *VerifySimulation) TrainPcSimDigitalOutInfoHandle(pc *train_pc_sim.TrainPcReciverData, train *state_proto.TrainState, data []byte) bool { //slog.Info("开始接受atp输出模拟量==============%v", aport) /* for i, d := range data { @@ -823,46 +728,64 @@ func (s *VerifySimulation) TrainPcSimDigitalOutInfoHandle(aport bool, client *tc //s.reportTrainMockInitMsg(aport, client, train, data[4], data[1]) vobc := train.VobcState + act := vobc.Tc1Active + if pc.RealTrainPort == state_proto.TrainState_PORT_B { + act = vobc.Tc2Active + } + ts, initConn, connErr, tce := s.reportTrainMockInitMsg2(act, pc.TrainConnInitComplate, pc.LineInitTimeStamp, pc.RealTrainPort, train, data[4], data[1]) + pc.TrainConnInitComplate = initConn + pc.LineInitTimeStamp = ts + pc.ConnErr = connErr - if aport { - ts, initConn, connErr, tce := s.reportTrainMockInitMsg2(aport, vobc.Tc1Active, train.Tcc.TrainConnInitComplatePortA, train.Tcc.LineInitTimeStamp12PortA, train, data[4], data[1]) - if train.Tcc.ActiveTrainA { - train.Tcc.LineInitTimeStamp12PortA = ts - train.Tcc.TrainConnInitComplatePortA = initConn - train.Tcc.Line12ConnErrPortA = connErr - s.shuziliang(aport, client, tce) - } - - if train.VobcState.Tc1Active { - trainPcSimDigitalOutInfoHandleCode7_0(data[4], vobc) - trainPcSimDigitalOutInfoHandleCode15_8(data[3], vobc) - trainPcSimDigitalOutInfoHandleCode23_16(data[2], vobc) - trainPcSimDigitalOutInfoHandleCode31_24(data[1], vobc) - trainPcSimDigitalOutInfoHandleCode39_32(data[0], vobc) - if vobc.Ato { - vobc.AtoStepLevel = trainAtoLevel(vobc.AtoTractionCommand3, vobc.AtoTractionCommand2, vobc.AtoTractionCommand1) - } - } - } else { - ts, initConn, connErr, tce := s.reportTrainMockInitMsg2(aport, vobc.Tc2Active, train.Tcc.TrainConnInitComplatePortB, train.Tcc.LineInitTimeStamp12PortB, train, data[4], data[1]) - if train.Tcc.ActiveTrainB { - train.Tcc.LineInitTimeStamp12PortB = ts - train.Tcc.TrainConnInitComplatePortB = initConn - train.Tcc.Line12ConnErrPortB = connErr - s.shuziliang(aport, client, tce) - } - if train.VobcState.Tc2Active { - trainPcSimDigitalOutInfoHandleCode7_0(data[4], vobc) - trainPcSimDigitalOutInfoHandleCode15_8(data[3], vobc) - trainPcSimDigitalOutInfoHandleCode23_16(data[2], vobc) - trainPcSimDigitalOutInfoHandleCode31_24(data[1], vobc) - trainPcSimDigitalOutInfoHandleCode39_32(data[0], vobc) - if vobc.Ato { - vobc.AtoStepLevel = trainAtoLevel(vobc.AtoTractionCommand3, vobc.AtoTractionCommand2, vobc.AtoTractionCommand1) - } + train_pc_sim.Default().SendTrainControlMsg2(train, tce, pc.RealTrainPort) + if act { + trainPcSimDigitalOutInfoHandleCode7_0(data[4], vobc) + trainPcSimDigitalOutInfoHandleCode15_8(data[3], vobc) + trainPcSimDigitalOutInfoHandleCode23_16(data[2], vobc) + trainPcSimDigitalOutInfoHandleCode31_24(data[1], vobc) + trainPcSimDigitalOutInfoHandleCode39_32(data[0], vobc) + if vobc.Ato { + vobc.AtoStepLevel = trainAtoLevel(vobc.AtoTractionCommand3, vobc.AtoTractionCommand2, vobc.AtoTractionCommand1) } } + /* + if pc.RealTrainPort == state_proto.TrainState_PORT_A { + ts, initConn, connErr, tce := s.reportTrainMockInitMsg2(vobc.Tc1Active, pc.TrainConnInitComplate, pc.LineInitTimeStamp, pc.RealTrainPort, train, data[4], data[1]) + pc.TrainConnInitComplate = initConn + pc.LineInitTimeStamp = ts + pc.ConnErr = connErr + + train_pc_sim.Default().SendTrainControlMsg2(train, tce, pc.RealTrainPort) + if train.VobcState.Tc1Active { + trainPcSimDigitalOutInfoHandleCode7_0(data[4], vobc) + trainPcSimDigitalOutInfoHandleCode15_8(data[3], vobc) + trainPcSimDigitalOutInfoHandleCode23_16(data[2], vobc) + trainPcSimDigitalOutInfoHandleCode31_24(data[1], vobc) + trainPcSimDigitalOutInfoHandleCode39_32(data[0], vobc) + if vobc.Ato { + vobc.AtoStepLevel = trainAtoLevel(vobc.AtoTractionCommand3, vobc.AtoTractionCommand2, vobc.AtoTractionCommand1) + } + } + } else if pc.RealTrainPort == state_proto.TrainState_PORT_B { + ts, initConn, connErr, tce := s.reportTrainMockInitMsg2(vobc.Tc2Active, pc.TrainConnInitComplate, pc.LineInitTimeStamp, pc.RealTrainPort, train, data[4], data[1]) + pc.TrainConnInitComplate = initConn + pc.LineInitTimeStamp = ts + pc.ConnErr = connErr + + train_pc_sim.Default().SendTrainControlMsg2(train, tce, pc.RealTrainPort) + if train.VobcState.Tc2Active { + trainPcSimDigitalOutInfoHandleCode7_0(data[4], vobc) + trainPcSimDigitalOutInfoHandleCode15_8(data[3], vobc) + trainPcSimDigitalOutInfoHandleCode23_16(data[2], vobc) + trainPcSimDigitalOutInfoHandleCode31_24(data[1], vobc) + trainPcSimDigitalOutInfoHandleCode39_32(data[0], vobc) + if vobc.Ato { + vobc.AtoStepLevel = trainAtoLevel(vobc.AtoTractionCommand3, vobc.AtoTractionCommand2, vobc.AtoTractionCommand1) + } + } + }*/ + return true } @@ -1003,7 +926,7 @@ func (s *VerifySimulation) TrainPcSimMockInfo(train *state_proto.TrainState, dat } // 4.4.4. 车载输出BTM查询同步帧报文内容(0x04) -func (s *VerifySimulation) TrainBtmQuery2(train *state_proto.TrainState, data []byte, trainPort bool) { +func (s *VerifySimulation) TrainBtmQuery2(train *state_proto.TrainState, data []byte, trainClientPort state_proto.TrainState_TrainPort) { ts := time.Now().UnixMilli() if len(data) < 12 { @@ -1020,9 +943,10 @@ func (s *VerifySimulation) TrainBtmQuery2(train *state_proto.TrainState, data [] var balise *state_proto.BTMState var dsn, bc, mc byte btmCache := train.BtmBaliseCacheA - if train.VobcState.Tc2Active { + if train.TrainPort != trainClientPort { btmCache = train.BtmBaliseCacheB } + if atpReq.IsResend() { balise, dsn, bc, mc = can_btm.FindBaliseResend(btmCache, true) } else { @@ -1034,27 +958,23 @@ func (s *VerifySimulation) TrainBtmQuery2(train *state_proto.TrainState, data [] timeSyncF.T2 = cl.BtmTk timeSyncF.T3 = cl.TkNow() if balise == nil { - queryData := make([]byte, 0) - queryData = append(queryData, btmRepFrame.EncodeBtmAtp().Encode()...) - queryData = append(queryData, timeSyncF.EncodeBtmAtp().Encode()...) - train_pc_sim.Default().SendBaliseData(train, trainPort, message.RECIVE_TRAIN_BTM_NOT_DATA, queryData) + queryData := createLine12EmptyBaliseData(btmRepFrame, timeSyncF) + sendLine12EmptyBaliseData(train, trainClientPort, queryData) //slog.Info(fmt.Sprintf("接受应答器查询:%x发送无应答器数据,id:%v,数据:%X", data, trainAtm.CanId.ID4, queryData)) } else { logstr := "" if atpReq.IsResend() { - logstr = fmt.Sprintf("准备重新发送应答id:%v,接受时间:%v,发送时间:%v , 数据:%v 经过:%v,解报文:%v,接受应答器报文:%X", balise.BaliseId, ts, time.Now().UnixMilli(), balise.Telegram, bc, mc, data) + logstr = fmt.Sprintf("准备重新发送应答id:%v,接受时间:%v,发送时间:%v , 数据:%v 经过:%v,解报文:%v,接受应答器报文:%X clientPoret:%v trainPort:%v", balise.BaliseId, ts, time.Now().UnixMilli(), balise.Telegram, bc, mc, data, trainClientPort.String(), train.TrainPort.String()) } else if !balise.IsSend { balise.IsSend = true - logstr = fmt.Sprintf("准备发送应答id:%v,接受时间:%v,发送时间:%v , 数据:%v 经过:%v,解报文:%v,接受应答器报文:%X", balise.BaliseId, ts, time.Now().UnixMilli(), balise.Telegram, bc, mc, data) - } else { - queryData := make([]byte, 0) - queryData = append(queryData, btmRepFrame.EncodeBtmAtp().Encode()...) - queryData = append(queryData, timeSyncF.EncodeBtmAtp().Encode()...) - train_pc_sim.Default().SendBaliseData(train, trainPort, message.RECIVE_TRAIN_BTM_NOT_DATA, queryData) + logstr = fmt.Sprintf("准备发送应答id:%v,接受时间:%v,发送时间:%v , 数据:%v 经过:%v,解报文:%v,接受应答器报文:%X clientPoret:%v trainPort:%v", balise.BaliseId, ts, time.Now().UnixMilli(), balise.Telegram, bc, mc, data, trainClientPort.String(), train.TrainPort.String()) + } /*else { + queryData := createLine12EmptyBaliseData(btmRepFrame, timeSyncF) + sendLine12EmptyBaliseData(train, trainClientPort, queryData) return - } - slog.Info(logstr, trainPort) + }*/ + slog.Info(logstr, trainClientPort.String()) aliseData, _ := hex.DecodeString(balise.Telegram) stateRepFrame := btmRepFrame.EncodeBtmAtp() statusDataCf, statusDataCfOk := message.CreateBtmAtpDataRspFramesData(stateRepFrame, aliseData, false, balise.HasData, cl.BtmTk, cl.BtmTk, cl.BtmTk) @@ -1066,13 +986,24 @@ func (s *VerifySimulation) TrainBtmQuery2(train *state_proto.TrainState, data [] queryData = append(queryData, timeSyncF.EncodeBtmAtp().Encode()...) queryData = append(queryData, statusDataCf...) //数据帧包含结束帧 balise.BaliseTelegramForPcSimResend = fmt.Sprintf("%X", statusDataCf) - train_pc_sim.Default().SendBaliseData(train, trainPort, message.RECIVE_TRAIN_BTM_HAS_DATA, queryData) + train_pc_sim.Default().SendBaliseData2(train, trainClientPort, message.RECIVE_TRAIN_BTM_HAS_DATA, queryData) } else { slog.Error("列车pc仿真 BtmCanetClient应答帧、数据帧编码失败") } } } +func sendLine12EmptyBaliseData(train *state_proto.TrainState, trainClientPort state_proto.TrainState_TrainPort, emptyBaliseData []byte) { + train_pc_sim.Default().SendBaliseData2(train, trainClientPort, message.RECIVE_TRAIN_BTM_NOT_DATA, emptyBaliseData) +} + +func createLine12EmptyBaliseData(btmRepFrame *message.BtmStatusRspFrame, timeSyncFrame *message.BtmTimeSyncCheckFrame) []byte { + queryData := make([]byte, 0) + queryData = append(queryData, btmRepFrame.EncodeBtmAtp().Encode()...) + queryData = append(queryData, timeSyncFrame.EncodeBtmAtp().Encode()...) + return queryData +} + func createBtmStatus(canIdSn byte, btmState *state_proto.BTMState, atpReq *message.AtpRequestFrame, cl can_btm.BtmClock, dsn, baliseCount, messageCount byte) *message.BtmStatusRspFrame { statusF := message.NewBtmStatusRspFrame(canIdSn) statusF.PowerAmplifierOn = true