From 1166d7ffe5e4dcaa80b2b4c8a0092cafb4ecc563 Mon Sep 17 00:00:00 2001 From: tiger_zhou Date: Thu, 4 Jul 2024 09:26:37 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=97=E8=BD=A6=E8=B0=83=E6=95=B4=E8=BF=9E?= =?UTF-8?q?=E6=8E=A512=E5=8F=B7=E7=BA=BF=E8=BD=A6=E8=BD=BD,=E9=9D=99?= =?UTF-8?q?=E6=80=81=E6=83=85=E5=86=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bin/acc_conn-example.go | 103 +++-------- third_party/message/can_atp_req.go | 2 + third_party/message/can_btm_status_rsp.go | 3 +- third_party/message/can_btm_time_sync_rsp.go | 3 +- third_party/message/can_net.go | 65 +++++-- third_party/message/train_pc_sim_message.go | 13 +- .../message/train_pc_sim_message_type.go | 2 +- third_party/train_pc_sim/example/main.go | 2 +- .../train_pc_sim/train_pc_receive_handler.go | 53 ++++++ third_party/train_pc_sim/train_pc_sim.go | 107 ++--------- .../wayside/memory/train_tcc_graphic.go | 4 +- .../wayside/memory/wayside_memory_train.go | 36 ++-- .../memory/wayside_simulation_train_pc.go | 170 +++++------------- 13 files changed, 242 insertions(+), 321 deletions(-) create mode 100644 third_party/train_pc_sim/train_pc_receive_handler.go diff --git a/bin/acc_conn-example.go b/bin/acc_conn-example.go index a5fd26c..72b57fc 100644 --- a/bin/acc_conn-example.go +++ b/bin/acc_conn-example.go @@ -75,9 +75,15 @@ func initTrainPc() { createOrRemoveTrain() circleSendTrainActive() circleSendTrainMockData() - go circleSendTrainSpeedPlace() + //go circleSendTrainSpeedPlace() + //sendBtm() } +const ( + e1 = 0x1e + aa = 0x17 +) + func createOrRemoveTrain() { msgs := make([]*message.TrainPcSimBaseMessage, 0) //msgs = append(msgs, &message.TrainPcSimBaseMessage{Data: []byte{0x00}, Type: message.RECIVE_TRAIN_CREATE_REMOVE}) @@ -103,86 +109,15 @@ func circleSendTrainActive() { } } -const ( - a1 = 0x26 - a2 = 0x27 - a3 = 0x2d - a4 = 0x03 - a5 = 0x1e - a6 = 0x16 - a7 = 0x17 - a8 = 0x0a - a9 = 0x05 - a10 = 0x08 - a11 = 0x07 - a12 = 0x06 - a13 = 0x09 - a14 = 0x0f - a15 = 0x0e - a16 = 0x21 - a17 = 0x15 - a18 = 0x1d - a19 = 0x14 - a20 = 0x13 - a21 = 0x22 - a22 = 0x28 - a23 = 0x29 - a24 = 0x1f - a25 = 0x10 - a26 = 0x0c - a27 = 0x04 - a28 = 0x1e -) - -//eb0705c383 -//eb0805c673 -//eb0007040172e5 -//eb600600727e -//eb00071e017985 -//eb00071600bf85 -//eb00071700be15 - -//eb00070a00b745 -//eb00070500b2b5 -//eb00070800b625 -//eb00070700b3d5 -//eb00070600b245 -//eb00070900b7b5 -//eb00070f00b415 -//eb00070e017445 -//eb00072600ab85 -//eb000727016bd5 -//eb500601b3b1 -//eb00072100a9b5 -//eb000715017eb5 -//eb00071d017975 -//eb00071400bee5 -//eb000713017d15 -//eb000722016885 -//eb000728016e25 -//eb000729016fb5 -//eb00071f017815 -//eb00071000bc25 -//eb01190001000000000000000000000000667b6e43026dfd4e -// -// -//eb0405c373 -//eb000714017f25 -//eb0905c7e3 -//eb0705c383 -//eb00072d00acb5 -//eb00070300b115 - func circleSendTrainMockData() { msgs := make([]*message.TrainPcSimBaseMessage, 0) msgs = append(msgs, &message.TrainPcSimBaseMessage{Type: message.SENDER_TRAIN_OUTR_INFO, Data: []byte{byte(0), 1}}) - - msgs = append(msgs, &message.TrainPcSimBaseMessage{Type: message.SENDER_TRAIN_OUTR_INFO, Data: []byte{byte(16), 1}}) - msgs = append(msgs, &message.TrainPcSimBaseMessage{Type: message.SENDER_TRAIN_OUTR_INFO, Data: []byte{byte(3), 0}}) - msgs = append(msgs, &message.TrainPcSimBaseMessage{Type: message.SENDER_TRAIN_OUTR_INFO, Data: []byte{byte(3), 0}}) //msgs = append(msgs, &message.TrainPcSimBaseMessage{Type: message.SENDER_TRAIN_OUTR_INFO, Data: []byte{byte(16), 1}}) - //msgs = append(msgs, &message.TrainPcSimBaseMessage{Type: message.SENDER_TRAIN_OUTR_INFO, Data: []byte{byte(45), 1}}) - //msgs = append(msgs, &message.TrainPcSimBaseMessage{Type: message.SENDER_TRAIN_OUTR_INFO, Data: []byte{byte(46), 1}}) + msgs = append(msgs, &message.TrainPcSimBaseMessage{Type: message.SENDER_TRAIN_OUTR_INFO, Data: []byte{byte(3), 0}}) + //msgs = append(msgs, &message.TrainPcSimBaseMessage{Type: message.SENDER_TRAIN_OUTR_INFO, Data: []byte{byte(3), 0}}) + msgs = append(msgs, &message.TrainPcSimBaseMessage{Type: message.SENDER_TRAIN_OUTR_INFO, Data: []byte{byte(16), 1}}) + msgs = append(msgs, &message.TrainPcSimBaseMessage{Type: message.SENDER_TRAIN_OUTR_INFO, Data: []byte{byte(45), 1}}) + msgs = append(msgs, &message.TrainPcSimBaseMessage{Type: message.SENDER_TRAIN_OUTR_INFO, Data: []byte{byte(46), 1}}) /* for i := 3; i <= 50; i++ { if i != 2 { msgs = append(msgs, &message.TrainPcSimBaseMessage{Type: message.SENDER_TRAIN_OUTR_INFO, Data: []byte{byte(i), 0}}) @@ -211,6 +146,11 @@ func circleSendTrainMockData() { time.Sleep(time.Millisecond * 1000) } } +func sendBtm() { + source := "eb3305d543eb3211000005ea000000010000082b7989eb321100003573000000010000257ce38eeb3211000005d90000000100002731a483eb3211000005c8000000010000322d6b8aeb32110000356200000001000033976df1eb3179000005fb000000010000060390007f8182fd8b10183280003ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02edeb31790000358400000001000007b990007f819ac20b10183280003ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcefe4eb31790000070d00000001000008f690007f8183868b10183280003ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc72a9eb3179000035950000000100000a3390007f819aca8b10183280003ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc5487eb31790000071e000000010000279b90007f81838f0b10183280003ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcddd1eb3179000005fb000000010000060390007f8182fd8b10183280003ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02edeb31790000358400000001000007b990007f819ac20b10183280003ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcefe4eb31790000070d00000001000008f690007f8183868b10183280003ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc72a9eb3179000035950000000100000a3390007f819aca8b10183280003ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc5487eb31790000071e000000010000279b90007f81838f0b10183280003ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcddd1" + data, _ := hex.DecodeString(source) + trainpcClient.Send(data) +} func circleSendTrainSpeedPlace() { for { data := make([]byte, 0) @@ -240,9 +180,12 @@ func circleSendTrainSpeedPlace() { } } func trainPcDataHandle(n int, data []byte) { - return - //hexData := hex.EncodeToString(data[:n]) - //slog.Info(fmt.Sprintf("列车pc仿真接口长度:%v,实际长度:%v,接受数据:%v", len(data), n, hexData)) + hexData := hex.EncodeToString(data[:n]) + slog.Info(fmt.Sprintf("列车pc仿真接口长度:%v,实际长度:%v,接受数据:%v", len(data), n, hexData)) + //source := "eb3211000005ea000000010000082b7989eb321100003573000000010000257ce38eeb3211000005d90000000100002731a483eb3211000005c8000000010000322d6b8aeb32110000356200000001000033976df1eb3179000005fb000000010000060390007f8182fd8b10183280003ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02edeb31790000358400000001000007b990007f819ac20b10183280003ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcefe4eb31790000070d00000001000008f690007f8183868b10183280003ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc72a9eb3179000035950000000100000a3390007f819aca8b10183280003ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc5487eb31790000071e000000010000279b90007f81838f0b10183280003ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcddd1eb3179000005fb000000010000060390007f8182fd8b10183280003ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc02edeb31790000358400000001000007b990007f819ac20b10183280003ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcefe4eb31790000070d00000001000008f690007f8183868b10183280003ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc72a9eb3179000035950000000100000a3390007f819aca8b10183280003ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc5487eb31790000071e000000010000279b90007f81838f0b10183280003ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcddd1" + //data2, _ := hex.DecodeString(source) + //trainpcClient.Send(data2) + } func trainPcConnErr(err error) { diff --git a/third_party/message/can_atp_req.go b/third_party/message/can_atp_req.go index 415935a..1a67950 100644 --- a/third_party/message/can_atp_req.go +++ b/third_party/message/can_atp_req.go @@ -68,6 +68,7 @@ type AtpRequestFrame struct { Crc16 uint16 //解码时CRC16校验结果,true-校验通过 Crc16CheckOk bool + IsTrainPcSim bool } // NewAtpRequestFrame 创建ATP查询帧 @@ -178,6 +179,7 @@ func (f *AtpRequestFrame) Decode(cf *CanetFrame) bool { } func (f *AtpRequestFrame) Encode() *CanetFrame { cf := &CanetFrame{} + cf.IsTrainPcSim = f.IsTrainPcSim cf.CanId = f.FId cf.CanLen = 8 cf.FF = true diff --git a/third_party/message/can_btm_status_rsp.go b/third_party/message/can_btm_status_rsp.go index 3661f47..5ee94ad 100644 --- a/third_party/message/can_btm_status_rsp.go +++ b/third_party/message/can_btm_status_rsp.go @@ -32,7 +32,8 @@ type BtmStatusRspFrame struct { func NewBtmStatusRspFrame(sn byte, isTrainPcSim bool) *BtmStatusRspFrame { return &BtmStatusRspFrame{ - FId: *NewCanFrameId(CAN_ADDR_RSP_ATP, CAN_ADDR_RSP_BTM, CAN_FRAME_STATUS_RSP, sn), + FId: *NewCanFrameId(CAN_ADDR_RSP_ATP, CAN_ADDR_RSP_BTM, CAN_FRAME_STATUS_RSP, sn), + //FId: *NewCanFrameId(0x00, 0x00, 0x05, sn), IsTrainPcSim: isTrainPcSim, } } diff --git a/third_party/message/can_btm_time_sync_rsp.go b/third_party/message/can_btm_time_sync_rsp.go index 20fbbfe..f825a71 100644 --- a/third_party/message/can_btm_time_sync_rsp.go +++ b/third_party/message/can_btm_time_sync_rsp.go @@ -20,7 +20,8 @@ type BtmTimeSyncCheckFrame struct { func NewBtmTimeSyncCheckFrame(sn byte, isTrainPcSim bool) *BtmTimeSyncCheckFrame { return &BtmTimeSyncCheckFrame{ - FId: *NewCanFrameId(CAN_ADDR_RSP_ATP, CAN_ADDR_RSP_BTM, CAN_FRAME_TIME_SYNC_RSP, sn), + FId: *NewCanFrameId(CAN_ADDR_RSP_ATP, CAN_ADDR_RSP_BTM, CAN_FRAME_TIME_SYNC_RSP, sn), + //FId: *NewCanFrameId(0x00, 0x00, 0x35, sn), IsTrainPcSim: isTrainPcSim, } } diff --git a/third_party/message/can_net.go b/third_party/message/can_net.go index 4c958fe..df13c34 100644 --- a/third_party/message/can_net.go +++ b/third_party/message/can_net.go @@ -1,6 +1,8 @@ package message import ( + "bytes" + "encoding/binary" "fmt" "log/slog" "strings" @@ -21,6 +23,26 @@ func NewCanetFrame(buf []byte, isTrainPcSim bool) *CanetFrame { cf.Decode(buf) return cf } + +func NewCanetFrame2(buf []byte, isTrainPcSim bool) *CanetFrame { + cf := &CanetFrame{IsTrainPcSim: isTrainPcSim} + cf.Decode2(buf) + return cf +} +func (p *CanetFrame) Encode2() []byte { + buf := make([]byte, 0) + //CAN 帧ID + frameId := uint32(p.CanId.ID1)<<21 | uint32(p.CanId.ID2)<<13 | uint32(p.CanId.ID3)<<5 | uint32(p.CanId.ID4) + + buf = binary.BigEndian.AppendUint32(buf, frameId) + //CAN 帧数据 + if len(p.CanData) != 8 { + panic("len(p.CanData)!=8") + } + buf = append(buf, p.CanData...) + return buf +} + func (p *CanetFrame) Encode() []byte { buf := make([]byte, 0) if !p.IsTrainPcSim { @@ -39,7 +61,12 @@ func (p *CanetFrame) Encode() []byte { buf = append(buf, p.CanId.ID1) buf = append(buf, p.CanId.ID2) buf = append(buf, p.CanId.ID3) - buf = append(buf, p.CanId.ID4<<3) + if p.IsTrainPcSim { + buf = append(buf, p.CanId.ID4) + } else { + buf = append(buf, p.CanId.ID4<<3) + } + //CAN 帧数据 if len(p.CanData) != 8 { panic("len(p.CanData)!=8") @@ -47,19 +74,35 @@ func (p *CanetFrame) Encode() []byte { buf = append(buf, p.CanData...) return buf } +func (p *CanetFrame) Decode2(buf []byte) { -func (p *CanetFrame) Decode(buf []byte) { - - // - if !p.IsTrainPcSim { - if len(buf) != 13 { - panic("len(buf)!=13") - } - p.FF = buf[0]&0x80 == 0x80 - p.RTR = buf[0]&0x40 == 0x40 - p.CanLen = buf[0] & 0x0f + bb := bytes.NewBuffer(buf) + var idSource uint32 + binary.Read(bb, binary.BigEndian, &idSource) + data := make([]byte, bb.Len()) + _, err := bb.Read(data) + if err != nil { + fmt.Println(err) + return } + b1 := byte(idSource >> 21) + b2 := byte((idSource << 7) >> 13) + b3 := byte((idSource << 15) >> 20) + b4 := byte(idSource & 0x1f) + p.CanId.ID1 = b1 + p.CanId.ID2 = b2 + p.CanId.ID3 = b3 + p.CanId.ID4 = b4 + p.CanData = data +} +func (p *CanetFrame) Decode(buf []byte) { + if len(buf) != 13 { + panic("len(buf)!=13") + } + p.FF = buf[0]&0x80 == 0x80 + p.RTR = buf[0]&0x40 == 0x40 + p.CanLen = buf[0] & 0x0f //1 2 3 4 p.CanId.ID1 = buf[1] p.CanId.ID2 = buf[2] diff --git a/third_party/message/train_pc_sim_message.go b/third_party/message/train_pc_sim_message.go index 2724d85..96b9761 100644 --- a/third_party/message/train_pc_sim_message.go +++ b/third_party/message/train_pc_sim_message.go @@ -36,6 +36,7 @@ func (tp *TrainPcSimBaseMessage) Encode() []byte { //pack = binary.BigEndian.AppendUint16(pack, uint16(crc.CalculateCRC(crc.CRC16, pack[1:]))) return pack } + func TrainPcSimDecode(data []byte) []*TrainPcSimBaseMessage { bms := make([]*TrainPcSimBaseMessage, 0) @@ -109,6 +110,15 @@ func IsTrueForByte(d byte) bool { return false } +// 确定、否定是你软件里的概念吧,比如ATP输出量---紧急,我们就认为是低电平有效。即0代表有紧急,1代表无紧急; +// 比如ATP的输入量---钥匙,我们认为是高电平有效,即1代表上钥匙,0代表下钥匙。 +func AtpLowPowerByte(d byte) bool { + if d == 0 { + return true + } + return false +} + // 列车速度位置报告 type TrainSpeedPlaceReportMsg struct { //列车id @@ -236,7 +246,8 @@ const ( TRAIN_LOW_POWER //ATP上电按钮 ATP_POWER_ON - _ + //atp切除 + ATP_CUT //AA自动开关门 DOOR_MODE_AA diff --git a/third_party/message/train_pc_sim_message_type.go b/third_party/message/train_pc_sim_message_type.go index 083e052..de0c577 100644 --- a/third_party/message/train_pc_sim_message_type.go +++ b/third_party/message/train_pc_sim_message_type.go @@ -30,7 +30,7 @@ const ( RECIVE_TRAIN_BTM_NOT_DATA = 0x32 //清空所有预发应答器 - //recive_train_btn_clear_all_pre_data = 0x33 + RECIVE_TRAIN_BTN_CLEAR_ALL_PRE_DATA = 0x33 //创建/删除列车 RECIVE_TRAIN_CREATE_REMOVE = 0x50 diff --git a/third_party/train_pc_sim/example/main.go b/third_party/train_pc_sim/example/main.go index 11ff22f..01ef978 100644 --- a/third_party/train_pc_sim/example/main.go +++ b/third_party/train_pc_sim/example/main.go @@ -168,7 +168,7 @@ func startService(port int) { createServer(port, func(n int, data []byte) { msg := &message.TrainPcSimBaseMessage{} d := data[:n] - fmt.Println(fmt.Sprintf("接受数据:%v", hex.EncodeToString(d))) + //fmt.Println(fmt.Sprintf("接受数据:%v", hex.EncodeToString(d))) msg.Decode(d) pd := fmt.Sprintf("%X", d) diff --git a/third_party/train_pc_sim/train_pc_receive_handler.go b/third_party/train_pc_sim/train_pc_receive_handler.go new file mode 100644 index 0000000..769867d --- /dev/null +++ b/third_party/train_pc_sim/train_pc_receive_handler.go @@ -0,0 +1,53 @@ +package train_pc_sim + +import ( + "joylink.club/bj-rtsts-server/dto/state_proto" + "joylink.club/bj-rtsts-server/third_party/message" + "joylink.club/bj-rtsts-server/third_party/tcp" +) + +type trainPcReciverData struct { + clientKey string + tcpClient *tcp.TcpClient + pcSimManage TrainPcSimManage +} + +func (rd *trainPcReciverData) receiverDataHandle(n int, data []byte) { + + receiveData := data[:n] + + //hexSourceData := hex.EncodeToString(receiveData) + //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 { + //slog.Info(fmt.Sprintf("pc仿真接收数据:%v,类型:%X", hexSourceData, baseMsg.Type)) + switch baseMsg.Type { + //case RECIVE_TRAIN_CREATE_REMOVE: + // pc.trainPcSimManage.TrainPcSimConnOrRemoveHandle(baseMsg.Data[0]) + //case message.RECIVE_TRAIN_INTERFACE_CABINET_OUTR: + // rd.pcSimManage.TrainPcSimDigitalOutInfoHandle(connType, baseMsg.Data) + case message.RECIVE_TRAIN_INTERFACE_CABINET_OUTR_BACK: + rd.pcSimManage.TrainPcSimDigitalReportHandle(connType, baseMsg.Data) + case message.RECIVE_TRAIN_QUERY_STATUS: + rd.pcSimManage.TrainBtmQuery(connType, 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: + rd.pcSimManage.TrainPcSimMockInfo(connType, baseMsg.Data) + + //case RECIVE_TRAIN_DOOR_MODE: + // pc.trainPcSimManage.TrainDoorModeHandle(baseMsg.Data[0]) + } + } + +} diff --git a/third_party/train_pc_sim/train_pc_sim.go b/third_party/train_pc_sim/train_pc_sim.go index 5194e47..054048a 100644 --- a/third_party/train_pc_sim/train_pc_sim.go +++ b/third_party/train_pc_sim/train_pc_sim.go @@ -35,6 +35,7 @@ type TrainPcSim interface { SendTrainDirection(train *state_proto.TrainState, trainForward, trainBackward bool) //发送应答器信息数据 SendBaliseData(train *state_proto.TrainState, msgType byte, data []byte) + SendBaliseData2(train *state_proto.TrainState, msgType byte, data []string) //发布列车控制的相关事件 PublishTrainControlEvent(train *state_proto.TrainState, events []TrainControlEvent) // CreateOrRemoveSpeedPLace 创建或删除速度位置信息 @@ -53,7 +54,7 @@ type TrainPcSimManage interface { TrainPcSimDigitalOutInfoHandle(connType state_proto.TrainConnState_TrainConnType, data []byte) // TrainPcSimDigitalReportHandle 4.4.2. 车载输出数字反馈量信息报文内容 TrainPcSimDigitalReportHandle(connType state_proto.TrainConnState_TrainConnType, data []byte) - + FindConnTrain(ct state_proto.TrainConnState_TrainConnType) *state_proto.TrainState // TrainPcSimMockInfo 门模式 //TrainDoorModeHandle(state byte) //处理列车pc仿真模拟量数据 @@ -61,48 +62,9 @@ type TrainPcSimManage interface { // TrainBtmQuery 处理列车btm查询 TrainBtmQuery(connType state_proto.TrainConnState_TrainConnType, data []byte) } -type trainPcReciverData struct { - clientKey string - tcpClient *tcp.TcpClient - pcSimManage TrainPcSimManage -} - -func (rd *trainPcReciverData) receiverDataHandle(n int, data []byte) { - return - //receiveData := data[:n] - // - //hexSourceData := hex.EncodeToString(receiveData) - // - //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 { - // slog.Info(fmt.Sprintf("pc仿真接收数据:%v,类型:%v", hexSourceData, baseMsg.Type)) - // switch baseMsg.Type { - // //case RECIVE_TRAIN_CREATE_REMOVE: - // // pc.trainPcSimManage.TrainPcSimConnOrRemoveHandle(baseMsg.Data[0]) - // case message.RECIVE_TRAIN_INTERFACE_CABINET_OUTR: - // rd.pcSimManage.TrainPcSimDigitalOutInfoHandle(connType, baseMsg.Data) - // case message.RECIVE_TRAIN_INTERFACE_CABINET_OUTR_BACK: - // rd.pcSimManage.TrainPcSimDigitalReportHandle(connType, baseMsg.Data) - // case message.RECIVE_TRAIN_QUERY_STATUS: - // rd.pcSimManage.TrainBtmQuery(connType, baseMsg.Data) - // case message.RECIVE_TRAIN_MOCK_DATA: - // rd.pcSimManage.TrainPcSimMockInfo(connType, baseMsg.Data) - // //case RECIVE_TRAIN_DOOR_MODE: - // // pc.trainPcSimManage.TrainDoorModeHandle(baseMsg.Data[0]) - // } - //} - -} const Name = "车载pc仿真" -//const CLIENT_KEY = "clientKey" - func FindTrainPcSimClientKey(t *state_proto.TrainState) string { if t.ConnState.ConnType == state_proto.TrainConnState_PC_SIM_A { return "A" @@ -357,7 +319,7 @@ func (d *trainPcSimService) sendTrainLocationAndSpeedTask(ctx context.Context) { train.PluseCount.PulseCount1 = 0 train.PluseCount.PulseCount2 = 0 dataCode := bm.Encode() - //slog.Info(fmt.Sprintf("发送列车速度位置,列车:%v,发送数据:%v", train.Id, hex.EncodeToString(dataCode))) + 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))) err := rd.tcpClient.Send(dataCode) if err != nil { slog.Error(fmt.Sprintf("发送列车速度位置失败,列车:%v,发送数据:%v", train.Id, hex.EncodeToString(dataCode))) @@ -474,6 +436,21 @@ func (d *trainPcSimService) SendTrainDirection(train *state_proto.TrainState, tr } } } +func (d *trainPcSimService) SendBaliseData2(train *state_proto.TrainState, msgType byte, data []string) { + for _, hexData := range data { + dd, _ := hex.DecodeString(hexData) + 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) + if err != nil { + slog.Info(fmt.Sprintf("发送列车PC仿真应答器信息失败,数据:%v", hex.EncodeToString(da))) + } + } +} func (d *trainPcSimService) SendBaliseData(train *state_proto.TrainState, msgType byte, data []byte) { msg := &message.TrainPcSimBaseMessage{} @@ -482,9 +459,8 @@ func (d *trainPcSimService) SendBaliseData(train *state_proto.TrainState, msgTyp clientKey := FindTrainPcSimClientKey(train) rd := d.newPcSimclientMap[clientKey] - //client := d.pcSimClientMap[clientKey] da := msg.Encode() - slog.Info(fmt.Sprintf("发送列车PC仿真应答器信息,数据:%v", hex.EncodeToString(da))) + slog.Info(fmt.Sprintf("发送列车PC仿真应答器信息,无应答器:%v,数据:%v", msgType == message.RECIVE_TRAIN_BTM_NOT_DATA, hex.EncodeToString(da))) err := rd.tcpClient.Send(da) if err != nil { @@ -492,15 +468,6 @@ func (d *trainPcSimService) SendBaliseData(train *state_proto.TrainState, msgTyp } } -/* - func (d *trainPcSimService) trainControlEventHandle( event TrainControlEvent) { - msg := &message.TrainPcSimBaseMessage{} - msg.Type = SENDER_TRAIN_OUTR_INFO - data := []byte{event.Command, event.Status} - msg.Data = data - d.pcSimClient.Send(msg.Encode()) - } -*/ func (d *trainPcSimService) PublishTrainControlEvent(train *state_proto.TrainState, events []TrainControlEvent) { if len(events) <= 0 { slog.Warn("发布事件数量为空") @@ -527,39 +494,3 @@ func (d *trainPcSimService) PublishTrainControlEvent(train *state_proto.TrainSta } } - -// 接受来自pc仿真的消息 -/*func (d *trainPcSimService) reivceData(len int, data []byte, properties map[string]interface{}) { - clientKey := properties[CLIENT_KEY] - ck := fmt.Sprintf("%v", clientKey) - if d.pcSimClientMap[ck] == nil { - slog.Error(fmt.Sprintf("不存在%v的客户端,数据解析不予处理", ck)) - return - } - - connType := state_proto.TrainConnState_PC_SIM_A - if clientKey == "B" { - connType = state_proto.TrainConnState_PC_SIM_B - } - baseMsg := &message.TrainPcSimBaseMessage{} - err := baseMsg.Decode(data) - if err != nil { - slog.Error("车载pc仿真接受数据解析失败 ") - return - } - - switch baseMsg.Type { - //case RECIVE_TRAIN_CREATE_REMOVE: - // pc.trainPcSimManage.TrainPcSimConnOrRemoveHandle(baseMsg.Data[0]) - case RECIVE_TRAIN_INTERFACE_CABINET_OUTR: - d.trainPcSimManage.TrainPcSimDigitalOutInfoHandle(connType, baseMsg.Data) - case RECIVE_TRAIN_INTERFACE_CABINET_OUTR_BACK: - d.trainPcSimManage.TrainPcSimDigitalReportHandle(connType, baseMsg.Data) - case RECIVE_TRAIN_QUERY_STATUS: - d.trainPcSimManage.TrainBtmQuery(connType, baseMsg.Data) - case RECIVE_TRAIN_MOCK_DATA: - d.trainPcSimManage.TrainPcSimMockInfo(connType, baseMsg.Data) - //case RECIVE_TRAIN_DOOR_MODE: - // pc.trainPcSimManage.TrainDoorModeHandle(baseMsg.Data[0]) - } -}*/ diff --git a/ts/simulation/wayside/memory/train_tcc_graphic.go b/ts/simulation/wayside/memory/train_tcc_graphic.go index bb92212..f62bd9d 100644 --- a/ts/simulation/wayside/memory/train_tcc_graphic.go +++ b/ts/simulation/wayside/memory/train_tcc_graphic.go @@ -74,7 +74,7 @@ func initTrainVobc(trainLoad int64, trainIsUp bool) (*state_proto.TrainVobcState } // 初始化列车控制数据 -func initTrainTcc(vs *VerifySimulation, runDir bool) *state_proto.TrainControlState { +func initTrainTcc(vs *VerifySimulation, runDir bool, breaking int32) *state_proto.TrainControlState { var tccGI *data_proto.TccGraphicStorage for _, id := range vs.MapIds { if QueryGiType(id) == data_proto.PictureType_TrainControlCab { @@ -92,7 +92,7 @@ func initTrainTcc(vs *VerifySimulation, runDir bool) *state_proto.TrainControlSt } for _, b := range tccGI.TccHandles { if b.Code == QYSB { - tcc.PushHandler = &state_proto.TrainControlState_PushHandler{Id: b.Common.Id, Val: 0} + tcc.PushHandler = &state_proto.TrainControlState_PushHandler{Id: b.Common.Id, Val: -100} } } ds := make([]*state_proto.TrainControlState_DriverKeySwitch, 0) diff --git a/ts/simulation/wayside/memory/wayside_memory_train.go b/ts/simulation/wayside/memory/wayside_memory_train.go index 84b8a31..480e25b 100644 --- a/ts/simulation/wayside/memory/wayside_memory_train.go +++ b/ts/simulation/wayside/memory/wayside_memory_train.go @@ -103,7 +103,7 @@ func AddTrainStateNew(vs *VerifySimulation, status *state_proto.TrainState, conf //status.TrainActiveDirection = trainActDir - status.Tcc = initTrainTcc(vs, status.TrainRunUp) + status.Tcc = initTrainTcc(vs, status.TrainRunUp, DEFAULT_BRAKE_FORCE) status.VobcBtm = &state_proto.VobcBtmState{TelegramState: make([]*state_proto.VobcBtmState_TelegramState, 0), History: make(map[uint32]*state_proto.VobcBtmState_VobcBtmHistoryState)} slog.Debug("列车初始化", "trainIndex", trainIndex, "linkId", linkId, "loffset", loffset) linkIdInt, _ := strconv.Atoi(linkId) @@ -358,7 +358,7 @@ func UpdateTrainStateByDynamics(vs *VerifySimulation, trainId string, info *mess sta.DynamicState.Acceleration = info.Acceleration sta.DynamicState.Displacement = int32(info.Displacement) - pluseCount(sta) + pluseCount(sta, info.HeadSpeed1, info.HeadSpeed2, info.TailSpeed1, info.TailSpeed2) return sta } @@ -414,27 +414,41 @@ func formatSpeedTime(s int32) int32 { //d3, _ := strconv.ParseFloat(fmt.Sprintf("%.2f", s), 64) return int32(math.Abs(math.Round(float64(s)))) } -func pluseCount(sta *state_proto.TrainState) { +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) { if sta.PluseCount == nil { return } if sta.TrainRunUp { - p1 := uint32(formatSpeedTime(sta.DynamicState.HeadSensorSpeed1 * RECEIVE_DYNAMIC_DATA_RATE)) - p2 := uint32(formatSpeedTime(sta.DynamicState.HeadSensorSpeed2 * RECEIVE_DYNAMIC_DATA_RATE)) + //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 + p1 + sta.PluseCount.PulseCount1 = sta.PluseCount.PulseCount1 + uint32(h1*1000*0.08) } if sta.TrainEndsA.SpeedSensorEnableB { - sta.PluseCount.PulseCount2 = sta.PluseCount.PulseCount2 + p2 + 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 := 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 + t1 + sta.PluseCount.PulseCount1 = sta.PluseCount.PulseCount1 + uint32(t1*1000*0.08) } if sta.TrainEndsB.SpeedSensorEnableB { - sta.PluseCount.PulseCount2 = sta.PluseCount.PulseCount2 + t2 + sta.PluseCount.PulseCount2 = sta.PluseCount.PulseCount2 + uint32(t2*1000*0.08) } } } diff --git a/ts/simulation/wayside/memory/wayside_simulation_train_pc.go b/ts/simulation/wayside/memory/wayside_simulation_train_pc.go index 90ad81c..133b0d3 100644 --- a/ts/simulation/wayside/memory/wayside_simulation_train_pc.go +++ b/ts/simulation/wayside/memory/wayside_simulation_train_pc.go @@ -87,8 +87,8 @@ func trainControlEB(vobc *state_proto.TrainVobcState, tcc *state_proto.TrainCont vobc.EmergencyBrakingStatus = true vobc.TractionForce = 0 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 []train_pc_sim.TrainControlEvent{{Command: message.CONFIRM, Status: 1}} //紧急制动 } // 列车方向 @@ -252,101 +252,12 @@ func (s *VerifySimulation) TrainPcSimDigitalOutInfoHandle(connType state_proto.T slog.Error("车载输出数字量,,列车未连接车载pc仿真") return } - //buf := bytes.NewBuffer(data) vobc := train.VobcState - - //cutTraction, _ := buf.ReadByte() //切牵引 - //trainDoorOutLed, _ := buf.ReadByte() //车门外指示灯 - //stopBrakeAppend, _ := buf.ReadByte() //停放制动施加 - //emergentBrake, _ := buf.ReadByte() //紧急制动 - //leftOpenDoor, _ := buf.ReadByte() //开左门允许 - //rightOpenDoor, _ := buf.ReadByte() //开右门允许 - //closeRightDoor, _ := buf.ReadByte() //关右门 - //doorAlwaysClosed, _ := buf.ReadByte() //车门保持关闭 - //localAtpControl, _ := buf.ReadByte() //本端ATP控车 - //atoMode, _ := buf.ReadByte() //ATO模式 - //atoTractionCommandOut, _ := buf.ReadByte() //ATO牵引命令输出 - //atoTractionCommand1, _ := buf.ReadByte() //ATO牵引指令1 - //atoTractionCommand2, _ := buf.ReadByte() //ATO牵引指令2 - //atoTractionCommand3, _ := buf.ReadByte() //ATO牵引指令3 - //atoBrakeCommand, _ := buf.ReadByte() //ATO制动命令输出 - //skipCommand, _ := buf.ReadByte() //跳跃指令 - //direction1, _ := buf.ReadByte() //列车方向1 - //direction2, _ := buf.ReadByte() //列车方向2 - //atoLazyCommandOut, _ := buf.ReadByte() //ATO惰行命令输出 - //sleepCommand, _ := buf.ReadByte() //休眠指令 - //wakeUpCommand, _ := buf.ReadByte() //唤醒指令 - //toPullTrainLed, _ := buf.ReadByte() //ATO发车指示灯 - //arLightCommand, _ := buf.ReadByte() //AR灯命令 - //atoAlwaysBrake, _ := buf.ReadByte() //ATO保持制动 - //atoOpenLeftDoor, _ := buf.ReadByte() //ATO开左门 - //atoOpenRightDoor, _ := buf.ReadByte() //ATO开右门 - //atoCloseLeftDoor, _ := buf.ReadByte() //ATO关左门 - //ariverActive, _ := buf.ReadByte() //驾驶室激活 - //noSpeedSigle, _ := buf.ReadByte() //零速信号 - //famMode, _ := buf.ReadByte() //FAM模式 - //camMode, _ := buf.ReadByte() //CAM模式 - //trainStartedLed, _ := buf.ReadByte() //列车启动指示灯 - //mostUseBrake, _ := buf.ReadByte() //常用制动 - //splittingOut, _ := buf.ReadByte() //过分相输出 - //modeRelay, _ := buf.ReadByte() //模式继电器 - //tractionEffective, _ := buf.ReadByte() //牵引有效 - //brakeEffective, _ := buf.ReadByte() //制动有效 - //lifeDoorUsed, _ := buf.ReadByte() //逃生门使能 - //brakeQuarantine, _ := buf.ReadByte() //制动隔离 - //stopNotAllBrake, _ := buf.ReadByte() //停放制动缓解 - - //vobc.TractionSafetyCircuit = message.IsTrueForByte(cutTraction) - //vobc.TrainDoorOutLed = message.IsTrueForByte(trainDoorOutLed) //? 说明暂无此属性 - //vobc.ParkingBrakeStatus = message.IsTrueForByte(stopBrakeAppend) - //vobc.EmergencyBrakingStatus = message.IsTrueForByte(emergentBrake) - //vobc.LeftDoorOpenCommand = message.IsTrueForByte(leftOpenDoor) - //vobc.RightDoorOpenCommand = message.IsTrueForByte(rightOpenDoor) - //vobc.RightDoorCloseCommand = message.IsTrueForByte(closeRightDoor) - //vobc.AllDoorClose = message.IsTrueForByte(doorAlwaysClosed) - - //vobc.LocalAtpControl = message.IsTrueForByte(localAtpControl) //? - //vobc.Ato = message.IsTrueForByte(atoMode) - //vobc.AtoTractionCommandOut = message.IsTrueForByte(atoTractionCommandOut) //? - //vobc.AtoTractionCommand1 = message.IsTrueForByte(atoTractionCommand1) //? - //vobc.AtoTractionCommand2 = message.IsTrueForByte(atoTractionCommand2) //? - //vobc.AtoTractionCommand3 = message.IsTrueForByte(atoTractionCommand3) //? - //vobc.AtoBrakeCommand = message.IsTrueForByte(atoBrakeCommand) //? - //vobc.JumpStatus = message.IsTrueForByte(skipCommand) - - //vobc.DirectionForward = message.IsTrueForByte(direction1) - //vobc.DirectionBackward = message.IsTrueForByte(direction2) - //vobc.AtoLazyCommandOut = message.IsTrueForByte(atoLazyCommandOut) //? - //vobc.SleepBtn = message.IsTrueForByte(sleepCommand) - //vobc.WakeUpBtn = message.IsTrueForByte(wakeUpCommand) - //vobc.AtoSendTrainBtn = message.IsTrueForByte(toPullTrainLed) - //vobc.TurnbackStatus = message.IsTrueForByte(arLightCommand) //? - //vobc.AtoAlwaysBrake = message.IsTrueForByte(atoAlwaysBrake) //? - - //vobc.AtoOpenLeftDoor = message.IsTrueForByte(atoOpenLeftDoor) //? - //vobc.AtoOpenRightDoor = message.IsTrueForByte(atoOpenRightDoor) //? - //vobc.AtoCloseLeftDoor = message.IsTrueForByte(atoCloseLeftDoor) //? - //vobc.Tc1Active = message.IsTrueForByte(ariverActive) - //vobc.NoSpeedSigle = message.IsTrueForByte(noSpeedSigle) //? - //vobc.Fam = message.IsTrueForByte(famMode) - //vobc.Cam = message.IsTrueForByte(camMode) - //vobc.TrainStartedLed = message.IsTrueForByte(trainStartedLed) //? - - //vobc.MostUseBrake = message.IsTrueForByte(mostUseBrake) //? //常用制动 - //vobc.SplittingOut = message.IsTrueForByte(splittingOut) //? //过分相输出 - //vobc.ModeRelay = message.IsTrueForByte(modeRelay) //? //模式继电器 - //vobc.TractionEffective = message.IsTrueForByte(tractionEffective) //? //牵引有效 - //vobc.BrakeEffective = message.IsTrueForByte(brakeEffective) //? //制动有效 - //vobc.LifeDoorState = message.IsTrueForByte(lifeDoorUsed) //逃生门使能 - //vobc.BrakeQuarantine = message.IsTrueForByte(brakeQuarantine) //? //制动隔离 - //vobc.StopNotAllBrake = message.IsTrueForByte(stopNotAllBrake) //? //停放制动缓解 - trainPcSimDigitalOutInfoHandleCode39_32(data[0], vobc) - trainPcSimDigitalOutInfoHandleCode31_24(connType, data[1], vobc) + trainPcSimDigitalOutInfoHandleCode39_32(data[4], vobc) + trainPcSimDigitalOutInfoHandleCode31_24(connType, data[3], vobc) trainPcSimDigitalOutInfoHandleCode23_16(data[2], vobc) - trainPcSimDigitalOutInfoHandleCode15_8(data[3], vobc) - trainPcSimDigitalOutInfoHandleCode7_0(data[4], vobc) - //cm := &message.TrainControlMsg{TrainId: train.Id, ControlInfo: vobc} - //dynamics.Default().SendTrainControl(cm) + trainPcSimDigitalOutInfoHandleCode15_8(data[1], vobc) + trainPcSimDigitalOutInfoHandleCode7_0(data[0], vobc) } func trainPcSimDigitalOutInfoHandleCode39_32(d byte, vobc *state_proto.TrainVobcState) { vobc.MostUseBrake = message.IsTrueForByte(message.GetBit(d, 0)) //? 常用制动 @@ -398,14 +309,14 @@ func trainPcSimDigitalOutInfoHandleCode15_8(d byte, vobc *state_proto.TrainVobcS } func trainPcSimDigitalOutInfoHandleCode7_0(d byte, vobc *state_proto.TrainVobcState) { - vobc.TractionSafetyCircuit = message.IsTrueForByte(message.GetBit(d, 0)) //切牵引 - vobc.TrainDoorOutLed = message.IsTrueForByte(message.GetBit(d, 1)) //? 车门外指示灯 - vobc.ParkingBrakeStatus = message.IsTrueForByte(message.GetBit(d, 2)) //停放制动施加 - vobc.EmergencyBrakingStatus = message.IsTrueForByte(message.GetBit(d, 3)) //紧急制动 - vobc.LeftDoorOpenCommand = message.IsTrueForByte(message.GetBit(d, 4)) //开左门允许 - vobc.RightDoorOpenCommand = message.IsTrueForByte(message.GetBit(d, 5)) //开右门允许 - vobc.RightDoorCloseCommand = message.IsTrueForByte(message.GetBit(d, 6)) //关右门 - vobc.AllDoorClose = message.IsTrueForByte(message.GetBit(d, 7)) //车门保持关闭 + vobc.TractionSafetyCircuit = message.AtpLowPowerByte(message.GetBit(d, 0)) //切牵引 + vobc.TrainDoorOutLed = message.IsTrueForByte(message.GetBit(d, 1)) //? 车门外指示灯 + vobc.ParkingBrakeStatus = message.IsTrueForByte(message.GetBit(d, 2)) //停放制动施加 + vobc.EmergencyBrakingStatus = message.AtpLowPowerByte(message.GetBit(d, 3)) //紧急制动 + vobc.LeftDoorOpenCommand = message.IsTrueForByte(message.GetBit(d, 4)) //开左门允许 + vobc.RightDoorOpenCommand = message.IsTrueForByte(message.GetBit(d, 5)) //开右门允许 + vobc.RightDoorCloseCommand = message.IsTrueForByte(message.GetBit(d, 6)) //关右门 + vobc.AllDoorClose = message.IsTrueForByte(message.GetBit(d, 7)) //车门保持关闭 } @@ -502,8 +413,8 @@ func (s *VerifySimulation) TrainBtmQuery(connType state_proto.TrainConnState_Tra return } - trainAtm := message.NewCanetFrame(data, true) - atpReq := &message.AtpRequestFrame{} + trainAtm := message.NewCanetFrame2(data, true) + atpReq := &message.AtpRequestFrame{IsTrainPcSim: true} if !atpReq.Decode(trainAtm) { slog.Warn("列车pc驾驶模拟-CanetFrame解码成AtpRequestFrame失败", "CanetFrame", trainAtm.String()) return @@ -523,18 +434,23 @@ func (s *VerifySimulation) TrainBtmQuery(connType state_proto.TrainConnState_Tra telCount := strings.Count(train.BtmState.Telegram, "00") if telCount >= balise_const.UserTelegramByteLen { //无数据 - queryData := make([]byte, 0) - queryData = append(queryData, btmRepFrame.Encode().Encode()...) - queryData = append(queryData, timeSyncF.Encode().Encode()...) - train_pc_sim.Default().SendBaliseData(train, message.RECIVE_TRAIN_BTM_NOT_DATA, queryData) + queryDataStr := make([]string, 0) + queryDataStr = append(queryDataStr, hex.EncodeToString(btmRepFrame.Encode().Encode2())) + queryDataStr = append(queryDataStr, hex.EncodeToString(timeSyncF.Encode().Encode2())) + train_pc_sim.Default().SendBaliseData2(train, message.RECIVE_TRAIN_BTM_NOT_DATA, queryDataStr) + + /* queryData := make([]byte, 0) + queryData = append(queryData, btmRepFrame.Encode().Encode()...) + queryData = append(queryData, timeSyncF.Encode().Encode()...) + train_pc_sim.Default().SendBaliseData(train, message.RECIVE_TRAIN_BTM_NOT_DATA, queryData)*/ } else { //有数据 aliseData, _ := hex.DecodeString(train.BtmState.Telegram) statusDataCf, statusDataCfOk := message.CreateBtmRspFramesData(btmRepFrame, aliseData, false, cl.TkNow(), cl.TkNow(), cl.TkNow(), true) if statusDataCfOk { queryData := make([]byte, 0) - queryData = append(queryData, btmRepFrame.Encode().Encode()...) - queryData = append(queryData, timeSyncF.Encode().Encode()...) + queryData = append(queryData, btmRepFrame.Encode().Encode2()...) + queryData = append(queryData, timeSyncF.Encode().Encode2()...) queryData = append(queryData, statusDataCf...) //数据帧包含结束帧 train.BtmState.BaliseTelegramForPcSimResend = fmt.Sprintf("%X", statusDataCf) train_pc_sim.Default().SendBaliseData(train, message.RECIVE_TRAIN_BTM_HAS_DATA, queryData) @@ -546,7 +462,7 @@ func (s *VerifySimulation) TrainBtmQuery(connType state_proto.TrainConnState_Tra } func createBtmStatus(canIdSn byte, btmState *state_proto.BTMState, atpReq *message.AtpRequestFrame, cl can_btm.BtmClock) *message.BtmStatusRspFrame { - statusF := message.NewBtmStatusRspFrame(canIdSn, true) + statusF := message.NewBtmStatusRspFrame(canIdSn, atpReq.IsTrainPcSim) //btmStatus := aa(train, atpReq) statusF.PowerAmplifierOn = true @@ -560,7 +476,9 @@ func createBtmStatus(canIdSn byte, btmState *state_proto.BTMState, atpReq *messa if btmState.AboveBalise { statusF.DetailedCode = 0x07 } - statusF.Dsn = byte(btmState.DataSerialNumber) + dsn := byte(btmState.DataSerialNumber) + 1 + btmState.DataSerialNumber = uint32(dsn) + statusF.Dsn = dsn return statusF } @@ -576,14 +494,11 @@ func (s *VerifySimulation) ObtainTrainDigitalMockData(train *state_proto.TrainSt if vs.Tc1Active || vs.Tc2Active { msgArr = append(msgArr, message.TrainPcSimBaseMessage{Data: []byte{message.KEY_STATE, 1}, Type: message.SENDER_TRAIN_OUTR_INFO}) //钥匙激活 } - if tcc.PushHandler.Val == 0 { - 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.TRAIN_BRAKE_STATE, 1}, Type: message.SENDER_TRAIN_OUTR_INFO}) //手柄零位方向向前 - } + if vs.BrakingStatus { msgArr = append(msgArr, message.TrainPcSimBaseMessage{Data: []byte{message.TRAIN_BRAKE_STATE, 1}, Type: message.SENDER_TRAIN_OUTR_INFO}) //列车制动状态 } - //if tcc.Ebutton.Passed { + if vs.EmergencyBrakingStatus { msgArr = append(msgArr, message.TrainPcSimBaseMessage{Data: []byte{message.OUTER_EMERGENCY_BRAKE, 1}, Type: message.SENDER_TRAIN_OUTR_INFO}) //紧急制动 } @@ -597,12 +512,19 @@ func (s *VerifySimulation) ObtainTrainDigitalMockData(train *state_proto.TrainSt 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.CLOSE_RIGHT_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.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.LEFT_DOOR_STATE, 1}, Type: message.SENDER_TRAIN_OUTR_INFO}) //左门状态 - //msgArr = append(msgArr, message.TrainPcSimBaseMessage{Data: []byte{message.RIGHT_DOOR_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}) //右门状态 + 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_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}) //列车完整性 + 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.OBSTACLE_CHECK, 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}) //逃生门状态 + 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}) //本端机械钩 + //msgArr = append(msgArr, message.TrainPcSimBaseMessage{Data: []byte{41, 1}, Type: message.SENDER_TRAIN_OUTR_INFO}) //对端机械钩 + msgArr = append(msgArr, message.TrainPcSimBaseMessage{Data: []byte{}, Type: message.RECIVE_TRAIN_BTN_CLEAR_ALL_PRE_DATA}) //清空应答器 + train.BtmState = nil return msgArr }