2024-04-02 18:20:10 +08:00
|
|
|
|
package memory
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"encoding/binary"
|
|
|
|
|
"encoding/hex"
|
|
|
|
|
"fmt"
|
|
|
|
|
"joylink.club/bj-rtsts-server/config"
|
2024-04-09 10:40:18 +08:00
|
|
|
|
"joylink.club/bj-rtsts-server/dto/data_proto"
|
2024-04-02 18:20:10 +08:00
|
|
|
|
"joylink.club/bj-rtsts-server/dto/request_proto"
|
|
|
|
|
"joylink.club/bj-rtsts-server/dto/state_proto"
|
|
|
|
|
"joylink.club/bj-rtsts-server/sys_error"
|
|
|
|
|
"joylink.club/bj-rtsts-server/third_party/can_btm"
|
2024-06-07 13:26:46 +08:00
|
|
|
|
"joylink.club/bj-rtsts-server/third_party/electrical_machinery"
|
2024-04-02 18:20:10 +08:00
|
|
|
|
"joylink.club/bj-rtsts-server/third_party/message"
|
2024-09-10 15:37:40 +08:00
|
|
|
|
"joylink.club/bj-rtsts-server/third_party/tcp"
|
2024-04-02 18:20:10 +08:00
|
|
|
|
train_pc_sim "joylink.club/bj-rtsts-server/third_party/train_pc_sim"
|
|
|
|
|
"log/slog"
|
2024-08-07 09:31:46 +08:00
|
|
|
|
"math"
|
2024-04-02 18:20:10 +08:00
|
|
|
|
"time"
|
|
|
|
|
)
|
|
|
|
|
|
2024-05-24 09:00:43 +08:00
|
|
|
|
func (s *VerifySimulation) GetTrainPcSimConfig() []config.VehiclePCSimConfig {
|
|
|
|
|
return s.runConfig.PcSimConfigs
|
2024-04-02 18:20:10 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 列车控制
|
2024-04-09 10:40:18 +08:00
|
|
|
|
func ControlTrainUpdate(s *VerifySimulation, ct *request_proto.TrainControl) {
|
2024-04-02 18:20:10 +08:00
|
|
|
|
allTrainMap := &s.Memory.Status.TrainStateMap
|
|
|
|
|
data, ok := allTrainMap.Load(ct.TrainId)
|
|
|
|
|
if !ok {
|
|
|
|
|
panic(sys_error.New(fmt.Sprintf("列车【%s】不存在", ct.TrainId)))
|
|
|
|
|
}
|
2024-04-09 10:40:18 +08:00
|
|
|
|
tccGraphicData := findTrainTccGraphicData(s)
|
|
|
|
|
if tccGraphicData == nil {
|
|
|
|
|
slog.Error("列车控制未找到TCC图形数据")
|
|
|
|
|
panic(sys_error.New("未找到TCC图形数据"))
|
|
|
|
|
}
|
2024-04-02 18:20:10 +08:00
|
|
|
|
sta := data.(*state_proto.TrainState)
|
2024-05-08 14:39:23 +08:00
|
|
|
|
vobc := sta.VobcState
|
|
|
|
|
tcc := sta.Tcc
|
2024-09-14 10:12:46 +08:00
|
|
|
|
if ct.ControlType != request_proto.TrainControl_DRIVER_KEY_SWITCH && sta.TrainPort == state_proto.TrainState_PORT_NONE {
|
2024-09-10 18:00:44 +08:00
|
|
|
|
panic(sys_error.New("请先上驾驶端钥匙"))
|
|
|
|
|
}
|
2024-07-19 15:24:28 +08:00
|
|
|
|
|
|
|
|
|
var baseMsg []message.TrainPcSimBaseMessage = nil
|
2024-04-02 18:20:10 +08:00
|
|
|
|
if ct.ControlType == request_proto.TrainControl_EMERGENT_BUTTON {
|
2024-08-30 18:08:14 +08:00
|
|
|
|
baseMsg = trainControlButton(sta, ct.DeviceId, ct.ControlButton.Active, tccGraphicData)
|
2024-04-02 18:20:10 +08:00
|
|
|
|
} else if ct.ControlType == request_proto.TrainControl_DRIVER_KEY_SWITCH {
|
2024-07-19 15:24:28 +08:00
|
|
|
|
baseMsg = trainControlDriverKey(sta, ct.DriverKey, ct.DeviceId, tccGraphicData)
|
2024-09-10 15:37:40 +08:00
|
|
|
|
//train_pc_sim.Default().SendDriverActive(sta)
|
2024-04-02 18:20:10 +08:00
|
|
|
|
} else if ct.ControlType == request_proto.TrainControl_DIRECTION_KEY_SWITCH {
|
2024-08-22 13:12:03 +08:00
|
|
|
|
baseMsg = trainControlDirKey(sta.DynamicState.Speed, vobc, tcc, ct.SwitchKey, ct.DeviceId, tccGraphicData)
|
2024-04-17 09:32:25 +08:00
|
|
|
|
//此处先注释,根据现场调试情况 2024-4-16
|
2024-06-27 10:37:52 +08:00
|
|
|
|
train_pc_sim.Default().SendTrainDirection(sta, sta.VobcState.DirectionForward, sta.VobcState.DirectionBackward)
|
2024-04-02 18:20:10 +08:00
|
|
|
|
} else if ct.ControlType == request_proto.TrainControl_HANDLER {
|
2024-08-05 16:32:21 +08:00
|
|
|
|
if !vobc.Tc1Active && !vobc.Tc2Active {
|
2024-07-15 15:00:33 +08:00
|
|
|
|
panic(sys_error.New("TC1和TC2都未激活不能搬动牵引制动手柄 "))
|
|
|
|
|
}
|
2024-08-15 14:54:16 +08:00
|
|
|
|
if vobc.TractionSafetyCircuit {
|
|
|
|
|
panic(sys_error.New("牵引切除,不能进行列车控制"))
|
|
|
|
|
}
|
2024-08-30 18:08:14 +08:00
|
|
|
|
//oldTraction := sta.VobcState.TractionForce
|
|
|
|
|
//oldBrakeForce := sta.VobcState.BrakeForce
|
|
|
|
|
//isTraction := ct.Handler.Val > 0 //是否制动
|
|
|
|
|
baseMsg = trainControlHandle(sta, ct.Handler, ct.DeviceId, tccGraphicData)
|
|
|
|
|
//train_pc_sim.Default().SendHandleSwitch(oldTraction, oldBrakeForce, isTraction, sta)
|
2024-08-22 13:12:03 +08:00
|
|
|
|
} else if ct.ControlType == request_proto.TrainControl_TRAIN_DOOR_MODE_CHANGE {
|
|
|
|
|
baseMsg = trainDoorModeChangeHandle(vobc, tcc, ct.SwitchKey, ct.DeviceId, tccGraphicData)
|
2024-04-02 18:20:10 +08:00
|
|
|
|
}
|
2024-07-11 14:58:34 +08:00
|
|
|
|
if vobc.DirectionForward && vobc.TractionForce == 0 {
|
2024-07-19 15:24:28 +08:00
|
|
|
|
baseMsg = append(baseMsg, message.TrainPcSimBaseMessage{Type: message.SENDER_TRAIN_OUTR_INFO, Data: []byte{message.DIR_ZERO_FORWARD, 1}})
|
2024-07-11 14:58:34 +08:00
|
|
|
|
} else {
|
2024-07-19 15:24:28 +08:00
|
|
|
|
baseMsg = append(baseMsg, message.TrainPcSimBaseMessage{Type: message.SENDER_TRAIN_OUTR_INFO, Data: []byte{message.DIR_ZERO_FORWARD, 0}})
|
2024-07-11 14:58:34 +08:00
|
|
|
|
}
|
2024-05-08 14:39:23 +08:00
|
|
|
|
if !vobc.DirectionForward && !vobc.DirectionBackward {
|
|
|
|
|
vobc.TractionStatus = false
|
|
|
|
|
vobc.TractionForce = 0
|
|
|
|
|
}
|
2024-05-10 08:23:50 +08:00
|
|
|
|
if vobc.EmergencyBrakingStatus {
|
|
|
|
|
vobc.TractionForce = 0
|
|
|
|
|
}
|
2024-07-19 15:24:28 +08:00
|
|
|
|
if sta.ConnState.Conn && (sta.ConnState.ConnType == state_proto.TrainConnState_PC_SIM) && baseMsg != nil {
|
2024-09-11 21:19:42 +08:00
|
|
|
|
train_pc_sim.Default().SendTrainControlMsg2(sta, baseMsg, sta.TrainPort)
|
2024-09-10 18:00:44 +08:00
|
|
|
|
if vobc.Tc1Active == false && vobc.Tc2Active == false {
|
|
|
|
|
sta.TrainPort = state_proto.TrainState_PORT_NONE
|
|
|
|
|
}
|
2024-04-02 18:20:10 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2024-08-30 18:08:14 +08:00
|
|
|
|
func trainControlButton(train *state_proto.TrainState, deviceId uint32, active bool, tccGraphic *data_proto.TccGraphicStorage) []message.TrainPcSimBaseMessage {
|
2024-07-19 15:24:28 +08:00
|
|
|
|
|
2024-07-04 14:47:24 +08:00
|
|
|
|
if graphicBtn, ok := findTrainTccGraphicDataButton(tccGraphic, deviceId); ok {
|
2024-08-30 18:08:14 +08:00
|
|
|
|
btn := train.Tcc.Buttons[graphicBtn.Code]
|
2024-07-19 15:24:28 +08:00
|
|
|
|
if btn == nil {
|
2024-07-04 14:47:24 +08:00
|
|
|
|
slog.Error("未找到对应的车载摁钮code:", graphicBtn.Code, "设备id:", deviceId)
|
|
|
|
|
return nil
|
|
|
|
|
}
|
2024-08-30 18:08:14 +08:00
|
|
|
|
vobc := train.VobcState
|
2024-07-04 14:47:24 +08:00
|
|
|
|
switch graphicBtn.Code {
|
2024-07-19 15:24:28 +08:00
|
|
|
|
case JJZD: // 紧急制动
|
2024-08-30 18:08:14 +08:00
|
|
|
|
return controlEBBtn(train, active, btn)
|
2024-07-19 15:24:28 +08:00
|
|
|
|
case ATPQCKG: //atp切除
|
2024-07-04 14:47:24 +08:00
|
|
|
|
return controlAtpBtn(vobc, active, btn)
|
2024-08-22 13:12:03 +08:00
|
|
|
|
case KZM, KYM: //开左门按钮
|
2024-08-30 18:08:14 +08:00
|
|
|
|
return controlDoorOpenBtn(vobc, active, btn, graphicBtn.Code == KZM, true)
|
2024-08-22 13:12:03 +08:00
|
|
|
|
case GZM, GYM: //关左门按钮
|
2024-08-30 18:08:14 +08:00
|
|
|
|
return controlDoorCloseBtn(vobc, active, btn, graphicBtn.Code == GZM, true)
|
2024-07-19 15:24:28 +08:00
|
|
|
|
case ZF: //折返按钮
|
2024-07-04 14:47:24 +08:00
|
|
|
|
return controlReverseBtn(vobc, active, btn)
|
2024-07-19 15:24:28 +08:00
|
|
|
|
case QZMYX: //强制门允许
|
2024-07-04 14:47:24 +08:00
|
|
|
|
return controlDoorAllowBtn(vobc, active, btn)
|
2024-07-19 15:24:28 +08:00
|
|
|
|
case MSJJ: //模式降级按钮
|
2024-07-04 14:47:24 +08:00
|
|
|
|
return controlModeDownBtn(vobc, active, btn)
|
2024-07-19 15:24:28 +08:00
|
|
|
|
case MSSJ: //模式升级按钮
|
2024-07-04 14:47:24 +08:00
|
|
|
|
return controlModeUpBtn(vobc, active, btn)
|
2024-07-19 15:24:28 +08:00
|
|
|
|
case MSQR: //模式确认按钮
|
2024-07-04 14:47:24 +08:00
|
|
|
|
return controlModeConfirmBtn(vobc, active, btn)
|
2024-07-19 15:24:28 +08:00
|
|
|
|
case ZAWTGJC: //障碍物/脱轨检测
|
2024-07-04 14:47:24 +08:00
|
|
|
|
return controlObstacleDetectionBtn(vobc, active, btn)
|
2024-07-19 15:24:28 +08:00
|
|
|
|
case ZDZGZ: //制动重故障
|
2024-07-04 14:47:24 +08:00
|
|
|
|
return controlBrakeHeavyBtn(vobc, active, btn)
|
2024-07-19 15:24:28 +08:00
|
|
|
|
case ATPSD: //ATP上电按钮
|
2024-07-04 14:47:24 +08:00
|
|
|
|
return controlAtpPowerBtn(vobc, active, btn)
|
2024-07-19 15:24:28 +08:00
|
|
|
|
case HX: //唤醒按钮
|
2024-07-04 14:47:24 +08:00
|
|
|
|
return controlWakeUpBtn(vobc, active, btn)
|
2024-07-19 15:24:28 +08:00
|
|
|
|
case JX: //检修按钮
|
2024-07-04 14:47:24 +08:00
|
|
|
|
return controlOverhaulBtn(vobc, active, btn)
|
2024-07-19 15:24:28 +08:00
|
|
|
|
case XM: //休眠按钮
|
2024-07-04 14:47:24 +08:00
|
|
|
|
return controlSleepBtn(vobc, active, btn)
|
2024-08-29 16:09:07 +08:00
|
|
|
|
case ATOQD:
|
|
|
|
|
return controlAtoSenderBtn(vobc, active, btn)
|
2024-07-04 14:47:24 +08:00
|
|
|
|
default:
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
} else {
|
2024-05-07 15:00:59 +08:00
|
|
|
|
return nil
|
|
|
|
|
}
|
2024-07-04 14:47:24 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 应急摁钮
|
2024-08-30 18:08:14 +08:00
|
|
|
|
func controlEBBtn(train *state_proto.TrainState, active bool, tccBtn *state_proto.TrainControlState_ControlButton) []message.TrainPcSimBaseMessage {
|
2024-07-04 14:47:24 +08:00
|
|
|
|
if !active {
|
2024-04-16 17:26:37 +08:00
|
|
|
|
return nil
|
2024-04-09 10:40:18 +08:00
|
|
|
|
}
|
2024-07-04 14:47:24 +08:00
|
|
|
|
tccBtn.Passed = active
|
2024-08-30 18:08:14 +08:00
|
|
|
|
vobc := train.VobcState
|
2024-08-29 16:09:07 +08:00
|
|
|
|
vobc.TractionStatus = false
|
2024-05-08 14:39:23 +08:00
|
|
|
|
vobc.EmergencyBrakingStatus = true
|
|
|
|
|
vobc.TractionForce = 0
|
2024-08-29 16:09:07 +08:00
|
|
|
|
|
2024-08-30 18:08:14 +08:00
|
|
|
|
vobc.BrakeForce = trainBraking(train.TrainLoad, 100, train.TrainEmergencyBrake) / 1000 * 100
|
2024-08-05 16:32:21 +08:00
|
|
|
|
vobc.BrakingStatus = true
|
2024-08-07 09:31:46 +08:00
|
|
|
|
return []message.TrainPcSimBaseMessage{
|
|
|
|
|
{Type: message.SENDER_TRAIN_OUTR_INFO, Data: []byte{message.OUTER_EMERGENCY_BRAKE, 0}},
|
|
|
|
|
{Type: message.SENDER_TRAIN_OUTR_INFO, Data: []byte{message.TRAIN_BRAKE_STATE, 1}}}
|
2024-07-19 15:24:28 +08:00
|
|
|
|
|
2024-07-04 14:47:24 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// atp 切除
|
2024-07-19 15:24:28 +08:00
|
|
|
|
func controlAtpBtn(vobc *state_proto.TrainVobcState, active bool, tccBtn *state_proto.TrainControlState_ControlButton) []message.TrainPcSimBaseMessage {
|
2024-07-04 14:47:24 +08:00
|
|
|
|
var status byte = 0
|
|
|
|
|
if active {
|
|
|
|
|
status = 1
|
|
|
|
|
}
|
|
|
|
|
vobc.AtpCutSwitch = active
|
|
|
|
|
tccBtn.Passed = active
|
2024-07-19 15:24:28 +08:00
|
|
|
|
return []message.TrainPcSimBaseMessage{{Type: message.SENDER_TRAIN_OUTR_INFO, Data: []byte{message.ATP_CUT, status}}}
|
2024-07-04 14:47:24 +08:00
|
|
|
|
}
|
2024-08-30 18:08:14 +08:00
|
|
|
|
func controlDoorCloseBtn(vobc *state_proto.TrainVobcState, active bool, tccBtn *state_proto.TrainControlState_ControlButton, isLeft bool, onbtn bool) []message.TrainPcSimBaseMessage {
|
2024-08-22 13:12:03 +08:00
|
|
|
|
status := message.IsTrue(active)
|
2024-08-30 18:08:14 +08:00
|
|
|
|
if onbtn {
|
|
|
|
|
tccBtn.Passed = active
|
|
|
|
|
|
|
|
|
|
}
|
2024-08-22 13:12:03 +08:00
|
|
|
|
var doorAct byte = message.CLOSE_LEFT_DOOR
|
|
|
|
|
var doorState byte = message.LEFT_DOOR_STATE
|
2024-08-27 11:58:08 +08:00
|
|
|
|
msg := make([]message.TrainPcSimBaseMessage, 0)
|
2024-08-22 13:12:03 +08:00
|
|
|
|
if isLeft {
|
|
|
|
|
vobc.LeftDoorCloseCommand = active
|
|
|
|
|
} else {
|
|
|
|
|
vobc.RightDoorCloseCommand = active
|
|
|
|
|
doorAct = message.CLOSE_RIGHT_DOOR
|
|
|
|
|
doorState = message.RIGHT_DOOR_STATE
|
|
|
|
|
}
|
2024-08-27 11:58:08 +08:00
|
|
|
|
msg = append(msg, message.TrainPcSimBaseMessage{Type: message.SENDER_TRAIN_OUTR_INFO, Data: []byte{doorAct, status}})
|
|
|
|
|
if vobc.LeftDoorCloseCommand && vobc.RightDoorCloseCommand {
|
|
|
|
|
msg = append(msg, message.TrainPcSimBaseMessage{Type: message.SENDER_TRAIN_OUTR_INFO, Data: []byte{message.DOOR_LOCK_STATE, 1}})
|
2024-08-22 13:12:03 +08:00
|
|
|
|
}
|
2024-08-27 11:58:08 +08:00
|
|
|
|
msg = append(msg, message.TrainPcSimBaseMessage{Type: message.SENDER_TRAIN_OUTR_INFO, Data: []byte{doorState, 0}})
|
|
|
|
|
//msg = append(msg, message.TrainPcSimBaseMessage{Type: message.SENDER_TRAIN_OUTR_INFO, Data: []byte{doorAct, 0}})
|
|
|
|
|
return msg
|
2024-08-22 13:12:03 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 开车门
|
2024-08-30 18:08:14 +08:00
|
|
|
|
func controlDoorOpenBtn(vobc *state_proto.TrainVobcState, active bool, tccBtn *state_proto.TrainControlState_ControlButton, isLeft bool, onbtn bool) []message.TrainPcSimBaseMessage {
|
2024-08-22 13:12:03 +08:00
|
|
|
|
status := message.IsTrue(active)
|
|
|
|
|
msg := make([]message.TrainPcSimBaseMessage, 0)
|
2024-08-30 18:08:14 +08:00
|
|
|
|
if onbtn {
|
|
|
|
|
tccBtn.Passed = active
|
|
|
|
|
|
|
|
|
|
}
|
2024-08-22 13:12:03 +08:00
|
|
|
|
var doorAct byte = message.LEFT_OPEN_DOOR
|
|
|
|
|
var doorState byte = message.LEFT_DOOR_STATE
|
|
|
|
|
if isLeft {
|
|
|
|
|
vobc.LeftDoorOpenCommand = active
|
2024-08-30 18:08:14 +08:00
|
|
|
|
//vobc.LeftDoorCloseCommand = false
|
2024-08-22 13:12:03 +08:00
|
|
|
|
} else {
|
|
|
|
|
vobc.RightDoorOpenCommand = active
|
2024-08-30 18:08:14 +08:00
|
|
|
|
//vobc.RightDoorCloseCommand = false
|
2024-08-22 13:12:03 +08:00
|
|
|
|
doorAct = message.OPEN_RIGHT_DOOR
|
|
|
|
|
doorState = message.RIGHT_DOOR_STATE
|
|
|
|
|
}
|
|
|
|
|
msg = append(msg, message.TrainPcSimBaseMessage{Type: message.SENDER_TRAIN_OUTR_INFO, Data: []byte{doorAct, status}})
|
|
|
|
|
if active {
|
|
|
|
|
msg = append(msg, message.TrainPcSimBaseMessage{Type: message.SENDER_TRAIN_OUTR_INFO, Data: []byte{message.DOOR_LOCK_STATE, 0}})
|
|
|
|
|
msg = append(msg, message.TrainPcSimBaseMessage{Type: message.SENDER_TRAIN_OUTR_INFO, Data: []byte{doorState, status}})
|
|
|
|
|
}
|
|
|
|
|
return msg
|
|
|
|
|
}
|
2024-07-04 14:47:24 +08:00
|
|
|
|
|
|
|
|
|
// 折返
|
2024-07-19 15:24:28 +08:00
|
|
|
|
func controlReverseBtn(vobc *state_proto.TrainVobcState, active bool, tccBtn *state_proto.TrainControlState_ControlButton) []message.TrainPcSimBaseMessage {
|
2024-07-04 14:47:24 +08:00
|
|
|
|
var status byte = 0
|
|
|
|
|
if active {
|
|
|
|
|
status = 1
|
|
|
|
|
}
|
|
|
|
|
//vobc.RightDoorCloseCommand = active
|
2024-07-15 15:00:33 +08:00
|
|
|
|
vobc.TurnbackStatus = active
|
2024-07-04 14:47:24 +08:00
|
|
|
|
tccBtn.Passed = active
|
2024-07-19 15:24:28 +08:00
|
|
|
|
return []message.TrainPcSimBaseMessage{{Type: message.SENDER_TRAIN_OUTR_INFO, Data: []byte{message.TURN_BACK, status}}}
|
|
|
|
|
|
2024-07-04 14:47:24 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 强制门允许
|
2024-07-19 15:24:28 +08:00
|
|
|
|
func controlDoorAllowBtn(vobc *state_proto.TrainVobcState, active bool, tccBtn *state_proto.TrainControlState_ControlButton) []message.TrainPcSimBaseMessage {
|
2024-07-04 14:47:24 +08:00
|
|
|
|
var status byte = 0
|
|
|
|
|
if active {
|
|
|
|
|
status = 1
|
|
|
|
|
}
|
|
|
|
|
tccBtn.Passed = active
|
|
|
|
|
vobc.ForceDoorAllow = active
|
2024-07-19 15:24:28 +08:00
|
|
|
|
return []message.TrainPcSimBaseMessage{{Type: message.SENDER_TRAIN_OUTR_INFO, Data: []byte{message.FORCE_DOOR_ALLOW, status}}}
|
|
|
|
|
|
2024-07-04 14:47:24 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 模式降级按钮
|
2024-07-19 15:24:28 +08:00
|
|
|
|
func controlModeDownBtn(vobc *state_proto.TrainVobcState, active bool, tccBtn *state_proto.TrainControlState_ControlButton) []message.TrainPcSimBaseMessage {
|
2024-07-04 14:47:24 +08:00
|
|
|
|
var status byte = 0
|
|
|
|
|
if active {
|
|
|
|
|
status = 1
|
|
|
|
|
}
|
|
|
|
|
tccBtn.Passed = active
|
|
|
|
|
vobc.ModeLevelDownBtn = active
|
2024-07-19 15:24:28 +08:00
|
|
|
|
return []message.TrainPcSimBaseMessage{{Type: message.SENDER_TRAIN_OUTR_INFO, Data: []byte{message.TRAIN_MODE_DOWN, status}}}
|
|
|
|
|
|
2024-07-04 14:47:24 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 模式升级按钮
|
2024-07-19 15:24:28 +08:00
|
|
|
|
func controlModeUpBtn(vobc *state_proto.TrainVobcState, active bool, tccBtn *state_proto.TrainControlState_ControlButton) []message.TrainPcSimBaseMessage {
|
2024-07-04 14:47:24 +08:00
|
|
|
|
var status byte = 0
|
|
|
|
|
if active {
|
|
|
|
|
status = 1
|
|
|
|
|
}
|
|
|
|
|
tccBtn.Passed = active
|
|
|
|
|
vobc.ModeLevelUpBtn = active
|
2024-07-19 15:24:28 +08:00
|
|
|
|
return []message.TrainPcSimBaseMessage{{Type: message.SENDER_TRAIN_OUTR_INFO, Data: []byte{message.TRAIN_MODE_UP, status}}}
|
|
|
|
|
|
2024-07-04 14:47:24 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 模式确认按钮
|
2024-07-19 15:24:28 +08:00
|
|
|
|
func controlModeConfirmBtn(vobc *state_proto.TrainVobcState, active bool, tccBtn *state_proto.TrainControlState_ControlButton) []message.TrainPcSimBaseMessage {
|
2024-07-04 14:47:24 +08:00
|
|
|
|
var status byte = 0
|
|
|
|
|
if active {
|
|
|
|
|
status = 1
|
|
|
|
|
}
|
|
|
|
|
tccBtn.Passed = active
|
|
|
|
|
vobc.ConfirmBtn = active
|
2024-07-19 15:24:28 +08:00
|
|
|
|
return []message.TrainPcSimBaseMessage{{Type: message.SENDER_TRAIN_OUTR_INFO, Data: []byte{message.CONFIRM, status}}}
|
|
|
|
|
|
2024-07-04 14:47:24 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 障碍物/脱轨检测
|
2024-07-19 15:24:28 +08:00
|
|
|
|
func controlObstacleDetectionBtn(vobc *state_proto.TrainVobcState, active bool, tccBtn *state_proto.TrainControlState_ControlButton) []message.TrainPcSimBaseMessage {
|
2024-07-04 14:47:24 +08:00
|
|
|
|
var status byte = 0
|
|
|
|
|
if active {
|
|
|
|
|
status = 1
|
|
|
|
|
}
|
|
|
|
|
tccBtn.Passed = active
|
|
|
|
|
vobc.ObstacleCheckBtn = active
|
2024-07-19 15:24:28 +08:00
|
|
|
|
return []message.TrainPcSimBaseMessage{{Type: message.SENDER_TRAIN_OUTR_INFO, Data: []byte{message.OBSTACLE_CHECK, status}}}
|
2024-07-04 14:47:24 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 制动重故障
|
2024-07-19 15:24:28 +08:00
|
|
|
|
func controlBrakeHeavyBtn(vobc *state_proto.TrainVobcState, active bool, tccBtn *state_proto.TrainControlState_ControlButton) []message.TrainPcSimBaseMessage {
|
2024-07-04 14:47:24 +08:00
|
|
|
|
var status byte = 0
|
|
|
|
|
if active {
|
|
|
|
|
status = 1
|
|
|
|
|
}
|
|
|
|
|
tccBtn.Passed = active
|
|
|
|
|
vobc.BrakeHeavyFault = active
|
2024-07-19 15:24:28 +08:00
|
|
|
|
return []message.TrainPcSimBaseMessage{{Type: message.SENDER_TRAIN_OUTR_INFO, Data: []byte{message.BRAKE_HEAVY_FAULT, status}}}
|
2024-07-04 14:47:24 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// ATP上电按钮
|
2024-07-19 15:24:28 +08:00
|
|
|
|
func controlAtpPowerBtn(vobc *state_proto.TrainVobcState, active bool, tccBtn *state_proto.TrainControlState_ControlButton) []message.TrainPcSimBaseMessage {
|
2024-07-04 14:47:24 +08:00
|
|
|
|
var status byte = 0
|
|
|
|
|
if active {
|
|
|
|
|
status = 1
|
|
|
|
|
}
|
|
|
|
|
tccBtn.Passed = active
|
|
|
|
|
vobc.AtpPowerOnBtn = active
|
2024-07-19 15:24:28 +08:00
|
|
|
|
return []message.TrainPcSimBaseMessage{{Type: message.SENDER_TRAIN_OUTR_INFO, Data: []byte{message.ATP_POWER_ON, status}}}
|
2024-07-04 14:47:24 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 唤醒按钮
|
2024-07-19 15:24:28 +08:00
|
|
|
|
func controlWakeUpBtn(vobc *state_proto.TrainVobcState, active bool, tccBtn *state_proto.TrainControlState_ControlButton) []message.TrainPcSimBaseMessage {
|
2024-07-04 14:47:24 +08:00
|
|
|
|
var status byte = 0
|
|
|
|
|
if active {
|
|
|
|
|
status = 1
|
|
|
|
|
}
|
|
|
|
|
tccBtn.Passed = active
|
|
|
|
|
vobc.WakeUpBtn = active
|
2024-07-19 15:24:28 +08:00
|
|
|
|
return []message.TrainPcSimBaseMessage{{Type: message.SENDER_TRAIN_OUTR_INFO, Data: []byte{message.WAKE_UP, status}}}
|
2024-07-04 14:47:24 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 检修按钮
|
2024-07-19 15:24:28 +08:00
|
|
|
|
func controlOverhaulBtn(vobc *state_proto.TrainVobcState, active bool, tccBtn *state_proto.TrainControlState_ControlButton) []message.TrainPcSimBaseMessage {
|
2024-07-04 14:47:24 +08:00
|
|
|
|
var status byte = 0
|
|
|
|
|
if active {
|
|
|
|
|
status = 1
|
|
|
|
|
}
|
|
|
|
|
tccBtn.Passed = active
|
|
|
|
|
vobc.OverhaulBtn = active
|
2024-07-19 15:24:28 +08:00
|
|
|
|
return []message.TrainPcSimBaseMessage{{Type: message.SENDER_TRAIN_OUTR_INFO, Data: []byte{message.OVERHAUL, status}}}
|
2024-07-04 14:47:24 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 休眠按钮
|
2024-07-19 15:24:28 +08:00
|
|
|
|
func controlSleepBtn(vobc *state_proto.TrainVobcState, active bool, tccBtn *state_proto.TrainControlState_ControlButton) []message.TrainPcSimBaseMessage {
|
2024-07-04 14:47:24 +08:00
|
|
|
|
var status byte = 0
|
|
|
|
|
if active {
|
|
|
|
|
status = 1
|
|
|
|
|
}
|
|
|
|
|
tccBtn.Passed = active
|
|
|
|
|
vobc.SleepBtn = active
|
2024-07-19 15:24:28 +08:00
|
|
|
|
return []message.TrainPcSimBaseMessage{{Type: message.SENDER_TRAIN_OUTR_INFO, Data: []byte{message.SLEEP, status}}}
|
2024-04-02 18:20:10 +08:00
|
|
|
|
}
|
2024-08-29 16:09:07 +08:00
|
|
|
|
func controlAtoSenderBtn(vobc *state_proto.TrainVobcState, active bool, tccBtn *state_proto.TrainControlState_ControlButton) []message.TrainPcSimBaseMessage {
|
|
|
|
|
var status byte = 0
|
|
|
|
|
if active {
|
|
|
|
|
status = 1
|
|
|
|
|
}
|
|
|
|
|
tccBtn.Passed = active
|
|
|
|
|
vobc.AtoSendTrainBtn = active
|
|
|
|
|
return []message.TrainPcSimBaseMessage{{Type: message.SENDER_TRAIN_OUTR_INFO, Data: []byte{message.ATO_SEND_TRAIN, status}}}
|
|
|
|
|
}
|
2024-04-02 18:20:10 +08:00
|
|
|
|
|
|
|
|
|
// 列车方向
|
2024-08-22 13:12:03 +08:00
|
|
|
|
func trainControlDirKey(trainSpeed int32, vobc *state_proto.TrainVobcState, tcc *state_proto.TrainControlState, request *request_proto.TrainControl_SwitchKeyChange, deviceId uint32, tccGraphic *data_proto.TccGraphicStorage) []message.TrainPcSimBaseMessage {
|
|
|
|
|
dirKey, find := findTrainTccGraphicDataKey(tccGraphic, deviceId)
|
2024-04-09 10:40:18 +08:00
|
|
|
|
if !find {
|
|
|
|
|
slog.Error("未找到对应的列车方向键deviceId:", deviceId)
|
2024-05-09 14:36:13 +08:00
|
|
|
|
panic(sys_error.New("未找到对应的列车方向键"))
|
|
|
|
|
}
|
2024-08-22 13:12:03 +08:00
|
|
|
|
|
|
|
|
|
direction := request_proto.TrainControl_KeyLocation(request.Val)
|
2024-05-09 14:36:13 +08:00
|
|
|
|
if trainSpeed > 0 {
|
|
|
|
|
panic(sys_error.New("列车未停稳时,不能变更方向"))
|
|
|
|
|
}
|
2024-05-08 14:39:23 +08:00
|
|
|
|
vobc.DirectionBackward = false
|
2024-05-09 14:36:13 +08:00
|
|
|
|
vobc.DirectionForward = false
|
2024-08-22 13:12:03 +08:00
|
|
|
|
if direction == request_proto.TrainControl_KL_FONT {
|
2024-05-08 14:39:23 +08:00
|
|
|
|
vobc.DirectionForward = true
|
2024-08-22 13:12:03 +08:00
|
|
|
|
} else if direction == request_proto.TrainControl_KL_END {
|
2024-05-08 14:39:23 +08:00
|
|
|
|
vobc.DirectionBackward = true
|
2024-04-02 18:20:10 +08:00
|
|
|
|
}
|
2024-08-22 13:12:03 +08:00
|
|
|
|
tcc.SwitchKeyMap[dirKey.Code].Val = request.Val
|
2024-07-19 15:24:28 +08:00
|
|
|
|
return []message.TrainPcSimBaseMessage{{Type: message.SENDER_TRAIN_OUTR_INFO, Data: []byte{message.HANDLE_BACKWORD, message.IsTrue(vobc.DirectionBackward)}},
|
|
|
|
|
{Type: message.SENDER_TRAIN_OUTR_INFO, Data: []byte{message.HANDLE_FORWORD, message.IsTrue(vobc.DirectionForward)}}}
|
2024-04-02 18:20:10 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 列车驾驶端激活
|
2024-07-19 15:24:28 +08:00
|
|
|
|
func trainControlDriverKey(train *state_proto.TrainState, request *request_proto.TrainControl_DriverKeySwitch, deviceId uint32, tccGraphic *data_proto.TccGraphicStorage) []message.TrainPcSimBaseMessage {
|
2024-04-09 10:40:18 +08:00
|
|
|
|
obj, find := findTrainTccGraphicDataKey(tccGraphic, deviceId)
|
|
|
|
|
if !find {
|
|
|
|
|
slog.Error("未找到对应的驾驶端激活设备deviceId:", deviceId)
|
|
|
|
|
return nil
|
|
|
|
|
}
|
2024-05-20 15:21:22 +08:00
|
|
|
|
if train.DynamicState.Speed != 0 {
|
2024-05-09 14:36:13 +08:00
|
|
|
|
panic(sys_error.New("因列车未停稳,不支持此操作"))
|
|
|
|
|
}
|
2024-05-20 15:21:22 +08:00
|
|
|
|
vobc := train.VobcState
|
|
|
|
|
tcc := train.Tcc
|
2024-05-08 14:39:23 +08:00
|
|
|
|
if obj.Code == SKQYS1 {
|
|
|
|
|
vobc.Tc1Active = request.Val
|
2024-09-10 18:00:44 +08:00
|
|
|
|
train.TrainPort = state_proto.TrainState_PORT_A
|
2024-09-11 21:19:42 +08:00
|
|
|
|
train.BtmBaliseCacheA = &state_proto.TrainBtmCache{BaliseList: make([]*state_proto.BTMState, 3)}
|
2024-05-08 14:39:23 +08:00
|
|
|
|
} else if obj.Code == SKQYS2 {
|
|
|
|
|
vobc.Tc2Active = request.Val
|
2024-09-10 18:00:44 +08:00
|
|
|
|
train.TrainPort = state_proto.TrainState_PORT_B
|
2024-09-11 21:19:42 +08:00
|
|
|
|
train.BtmBaliseCacheB = &state_proto.TrainBtmCache{BaliseList: make([]*state_proto.BTMState, 3)}
|
2024-05-08 14:39:23 +08:00
|
|
|
|
}
|
2024-09-11 21:19:42 +08:00
|
|
|
|
|
2024-05-08 14:39:23 +08:00
|
|
|
|
if vobc.Tc1Active && vobc.Tc2Active {
|
|
|
|
|
if obj.Code == SKQYS1 {
|
|
|
|
|
vobc.Tc1Active = false
|
|
|
|
|
} else if obj.Code == SKQYS2 {
|
|
|
|
|
vobc.Tc2Active = false
|
2024-04-28 11:01:12 +08:00
|
|
|
|
}
|
|
|
|
|
panic(sys_error.New("驾驶端不能同时激活"))
|
|
|
|
|
}
|
2024-09-11 21:19:42 +08:00
|
|
|
|
|
2024-05-08 14:39:23 +08:00
|
|
|
|
for _, k := range tcc.DriverKey {
|
2024-04-02 18:20:10 +08:00
|
|
|
|
if k.Id == deviceId {
|
|
|
|
|
k.Id = deviceId
|
|
|
|
|
k.Val = request.Val
|
|
|
|
|
break
|
|
|
|
|
}
|
|
|
|
|
}
|
2024-09-11 21:19:42 +08:00
|
|
|
|
|
2024-09-10 15:37:40 +08:00
|
|
|
|
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)}})
|
2024-09-11 21:19:42 +08:00
|
|
|
|
train.OldLink = ""
|
|
|
|
|
train.OldLinkOffset = 0
|
|
|
|
|
train.OldTailLink = ""
|
|
|
|
|
train.OldTailLinkOffset = 0
|
2024-09-10 18:00:44 +08:00
|
|
|
|
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})
|
2024-09-10 15:37:40 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return tce
|
2024-04-02 18:20:10 +08:00
|
|
|
|
|
|
|
|
|
}
|
2024-08-22 13:12:03 +08:00
|
|
|
|
func trainDoorModeChangeHandle(vobc *state_proto.TrainVobcState, tcc *state_proto.TrainControlState, request *request_proto.TrainControl_SwitchKeyChange, deviceId uint32, tccGraphic *data_proto.TccGraphicStorage) []message.TrainPcSimBaseMessage {
|
2024-08-29 16:09:07 +08:00
|
|
|
|
sk, find := findTrainTccGraphicDataKey(tccGraphic, deviceId)
|
2024-08-22 13:12:03 +08:00
|
|
|
|
if !find {
|
|
|
|
|
slog.Error("未找到对应的牵引制动手柄设备deviceId:", deviceId)
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
msg := make([]message.TrainPcSimBaseMessage, 0)
|
|
|
|
|
kl := request_proto.TrainControl_KeyLocation(request.Val)
|
|
|
|
|
msg = append(msg, message.TrainPcSimBaseMessage{Type: message.SENDER_TRAIN_OUTR_INFO, Data: []byte{message.DOOR_MODE_AA, 0}})
|
|
|
|
|
msg = append(msg, message.TrainPcSimBaseMessage{Type: message.SENDER_TRAIN_OUTR_INFO, Data: []byte{message.DOOR_MODE_AM, 0}})
|
|
|
|
|
msg = append(msg, message.TrainPcSimBaseMessage{Type: message.SENDER_TRAIN_OUTR_INFO, Data: []byte{message.DOOR_MODE_MM, 0}})
|
|
|
|
|
switch kl {
|
|
|
|
|
case request_proto.TrainControl_KL_END:
|
|
|
|
|
vobc.DoorModeMM = true
|
2024-08-29 16:09:07 +08:00
|
|
|
|
msg = append(msg, message.TrainPcSimBaseMessage{Type: message.SENDER_TRAIN_OUTR_INFO, Data: []byte{message.DOOR_MODE_MM, 1}})
|
2024-08-22 13:12:03 +08:00
|
|
|
|
case request_proto.TrainControl_KL_CENTER:
|
|
|
|
|
vobc.DoorModeAM = true
|
|
|
|
|
msg = append(msg, message.TrainPcSimBaseMessage{Type: message.SENDER_TRAIN_OUTR_INFO, Data: []byte{message.DOOR_MODE_AM, 1}})
|
|
|
|
|
case request_proto.TrainControl_KL_FONT:
|
2024-08-29 16:09:07 +08:00
|
|
|
|
msg = append(msg, message.TrainPcSimBaseMessage{Type: message.SENDER_TRAIN_OUTR_INFO, Data: []byte{message.DOOR_MODE_AA, 1}})
|
2024-08-22 13:12:03 +08:00
|
|
|
|
vobc.DoorModeAA = true
|
|
|
|
|
}
|
|
|
|
|
tcc.SwitchKeyMap[sk.Code].Val = request.Val
|
|
|
|
|
return msg
|
|
|
|
|
}
|
2024-04-02 18:20:10 +08:00
|
|
|
|
|
2024-08-30 18:08:14 +08:00
|
|
|
|
func trainBraking(trainLoad int32, handleVal int32, brakePower float32) int64 {
|
|
|
|
|
tl := trainLoad * 1000 //列车初始化已经 * 100,再*10 就是对应的kg
|
2024-08-27 11:58:08 +08:00
|
|
|
|
//F=ma 单位 F单位:牛顿,m单位:千克,a单位:米/秒²
|
2024-08-30 18:08:14 +08:00
|
|
|
|
totalPower := float64(tl) * float64(brakePower)
|
2024-08-29 16:09:07 +08:00
|
|
|
|
n := int64(math.Abs(float64(handleVal)) / 100 * totalPower)
|
2024-08-27 11:58:08 +08:00
|
|
|
|
return n
|
|
|
|
|
}
|
|
|
|
|
|
2024-08-30 18:08:14 +08:00
|
|
|
|
func trainTractionPower(trainLoad int32, handleVal int32, speedKM int32, trainMaxAcc, trainMaxSpeed float32) int64 {
|
2024-08-29 16:09:07 +08:00
|
|
|
|
//f(牛) = m(质量) * (加速度* 牵引杆%* (1 - 速度(米/秒)/(最大速度(米/秒) * 牵引杆%)))
|
|
|
|
|
//
|
2024-08-30 18:08:14 +08:00
|
|
|
|
m := trainLoad * 1000
|
2024-08-29 16:09:07 +08:00
|
|
|
|
speedM := float64(speedKM) / 3.6 / 100
|
2024-08-30 18:08:14 +08:00
|
|
|
|
acc := math.Abs(float64(handleVal)) / 100 * float64(trainMaxAcc)
|
|
|
|
|
sp := math.Abs(float64(handleVal)) / 100 * float64(trainMaxSpeed/3.6)
|
2024-08-29 16:09:07 +08:00
|
|
|
|
if speedM > sp {
|
|
|
|
|
return 0
|
|
|
|
|
}
|
|
|
|
|
f := float64(m) * (acc * (1 - speedM/sp))
|
|
|
|
|
return int64(f)
|
|
|
|
|
}
|
2024-08-30 18:08:14 +08:00
|
|
|
|
func trainBrakeAtoStepLevel(trainLoad int32, stepLevel int32, brakePower float32) int64 {
|
|
|
|
|
tl := trainLoad * 1000 //列车初始化已经 * 100,再*10 就是对应的kg
|
|
|
|
|
//F=ma 单位 F单位:牛顿,m单位:千克,a单位:米/秒²
|
|
|
|
|
totalPower := float64(tl) * float64(brakePower)
|
|
|
|
|
n := totalPower / 7 * float64(stepLevel)
|
|
|
|
|
return int64(n)
|
|
|
|
|
}
|
|
|
|
|
func trainTractionPowerAtoStepLevel(trainLoad int32, speedKM int32, stepLevel int32, trainMaxAcc, trainMaxSpeed float32) int64 {
|
|
|
|
|
//f(牛) = m(质量) * (加速度* 牵引杆%* (1 - 速度(米/秒)/(最大速度(米/秒) * 牵引杆%)))
|
|
|
|
|
//
|
|
|
|
|
m := trainLoad * 1000
|
|
|
|
|
sl := float64(stepLevel)
|
|
|
|
|
speedM := float64(speedKM) / 3.6 / 100
|
|
|
|
|
acc := float64(trainMaxAcc) / 7 * sl
|
|
|
|
|
sp := float64(trainMaxSpeed/3.6) / 7 * sl
|
|
|
|
|
if speedM > sp {
|
|
|
|
|
return 0
|
|
|
|
|
}
|
|
|
|
|
f := float64(m) * (acc * (1 - speedM/sp))
|
|
|
|
|
return int64(f)
|
|
|
|
|
}
|
2024-09-11 21:19:42 +08:00
|
|
|
|
func trainAtoControlTractionAndBrake(train *state_proto.TrainState) {
|
2024-08-30 18:08:14 +08:00
|
|
|
|
vs := train.VobcState
|
|
|
|
|
vs.TractionStatus = false
|
|
|
|
|
vs.TractionForce = 0
|
|
|
|
|
vs.BrakingStatus = false
|
|
|
|
|
vs.BrakeForce = 0
|
|
|
|
|
vs.MaintainBrakeStatus = false
|
|
|
|
|
var brakeState byte = 0
|
|
|
|
|
var notBreak byte = 0
|
|
|
|
|
if vs.AtoTractionCommandOut && vs.AtoBrakeCommand {
|
|
|
|
|
f := trainBrakeAtoStepLevel(train.TrainLoad, int32(vs.AtoStepLevel.Number()), train.TrainMaxBrake)
|
|
|
|
|
vs.BrakeForce = f / 1000 * 100
|
|
|
|
|
vs.BrakingStatus = true
|
|
|
|
|
brakeState = 1
|
|
|
|
|
} else if vs.AtoTractionCommandOut {
|
|
|
|
|
f := trainTractionPowerAtoStepLevel(train.TrainLoad, train.DynamicState.Speed, int32(vs.AtoStepLevel.Number()), train.TrainMaxAcc, train.TrainMaxSpeed)
|
|
|
|
|
vs.TractionForce = f / 1000 * 100
|
|
|
|
|
vs.TractionStatus = true
|
|
|
|
|
notBreak = 1
|
|
|
|
|
} else if vs.AtoBrakeCommand {
|
|
|
|
|
f := trainBrakeAtoStepLevel(train.TrainLoad, int32(vs.AtoStepLevel.Number()), train.TrainMaxBrake)
|
|
|
|
|
vs.BrakeForce = f / 1000 * 100
|
|
|
|
|
vs.BrakingStatus = true
|
|
|
|
|
brakeState = 1
|
|
|
|
|
}
|
|
|
|
|
msg := []message.TrainPcSimBaseMessage{
|
|
|
|
|
{Type: message.SENDER_TRAIN_OUTR_INFO, Data: []byte{message.TRAIN_BRAKE_STATE, brakeState}},
|
|
|
|
|
|
|
|
|
|
{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))
|
2024-09-11 21:19:42 +08:00
|
|
|
|
train_pc_sim.Default().SendTrainControlMsg2(train, msg, train.TrainPort)
|
2024-08-30 18:08:14 +08:00
|
|
|
|
}
|
2024-08-29 16:09:07 +08:00
|
|
|
|
|
2024-04-02 18:20:10 +08:00
|
|
|
|
// 列车牵引控制
|
2024-08-30 18:08:14 +08:00
|
|
|
|
func trainControlHandle(train *state_proto.TrainState, request *request_proto.TrainControl_PushHandler, deviceId uint32, tccGraphic *data_proto.TccGraphicStorage) []message.TrainPcSimBaseMessage {
|
2024-04-09 10:40:18 +08:00
|
|
|
|
_, find := findTrainTccGraphicDataHandler(tccGraphic, deviceId)
|
|
|
|
|
if !find {
|
|
|
|
|
slog.Error("未找到对应的牵引制动手柄设备deviceId:", deviceId)
|
|
|
|
|
return nil
|
|
|
|
|
}
|
2024-08-30 18:08:14 +08:00
|
|
|
|
tcc := train.Tcc
|
|
|
|
|
vobc := train.VobcState
|
2024-07-19 15:24:28 +08:00
|
|
|
|
jjzdBtn := tcc.Buttons[JJZD]
|
2024-05-08 14:39:23 +08:00
|
|
|
|
vobc.TractionStatus = false
|
|
|
|
|
vobc.TractionForce = 0
|
|
|
|
|
vobc.BrakingStatus = false
|
|
|
|
|
vobc.BrakeForce = 0
|
|
|
|
|
vobc.MaintainBrakeStatus = false
|
2024-08-30 18:08:14 +08:00
|
|
|
|
var notBreak byte = 0
|
2024-07-11 14:58:34 +08:00
|
|
|
|
var zeroState byte = 0
|
|
|
|
|
var brakeState byte = 0
|
2024-08-29 16:09:07 +08:00
|
|
|
|
//var traction byte = 0
|
|
|
|
|
|
2024-04-02 18:20:10 +08:00
|
|
|
|
if request.Val > 0 {
|
2024-05-08 14:39:23 +08:00
|
|
|
|
vobc.TractionStatus = true
|
2024-08-30 18:08:14 +08:00
|
|
|
|
vobc.TractionForce = trainTractionPower(train.TrainLoad, request.Val, train.DynamicState.Speed, train.TrainMaxAcc, train.TrainMaxSpeed) / 1000 * 100
|
2024-08-05 16:32:21 +08:00
|
|
|
|
notBreak = 1
|
2024-08-29 16:09:07 +08:00
|
|
|
|
//traction = 1
|
2024-04-02 18:20:10 +08:00
|
|
|
|
} else if request.Val < 0 {
|
2024-05-08 14:39:23 +08:00
|
|
|
|
vobc.BrakingStatus = true
|
2024-08-30 18:08:14 +08:00
|
|
|
|
vobc.BrakeForce = trainBraking(train.TrainLoad, request.Val, train.TrainMaxBrake) / 1000 * 100
|
2024-05-08 14:39:23 +08:00
|
|
|
|
vobc.EmergencyBrakingStatus = false
|
2024-07-04 14:47:24 +08:00
|
|
|
|
jjzdBtn.Passed = false
|
2024-08-22 13:12:03 +08:00
|
|
|
|
brakeState = 1
|
|
|
|
|
|
2024-04-02 18:20:10 +08:00
|
|
|
|
} else {
|
2024-07-11 14:58:34 +08:00
|
|
|
|
zeroState = 1
|
2024-08-29 16:09:07 +08:00
|
|
|
|
brakeState = 1
|
2024-04-02 18:20:10 +08:00
|
|
|
|
}
|
2024-05-08 14:39:23 +08:00
|
|
|
|
if tcc.PushHandler == nil {
|
|
|
|
|
tcc.PushHandler = &state_proto.TrainControlState_PushHandler{Id: deviceId}
|
2024-04-02 18:20:10 +08:00
|
|
|
|
}
|
2024-05-08 14:39:23 +08:00
|
|
|
|
tcc.PushHandler.Val = request.Val
|
2024-07-19 15:24:28 +08:00
|
|
|
|
|
|
|
|
|
return []message.TrainPcSimBaseMessage{{Type: message.SENDER_TRAIN_OUTR_INFO, Data: []byte{message.HANDLE_TO_ZERO, zeroState}},
|
|
|
|
|
{Type: message.SENDER_TRAIN_OUTR_INFO, Data: []byte{message.TRAIN_BRAKE_STATE, brakeState}},
|
2024-08-07 09:31:46 +08:00
|
|
|
|
/*{Type: message.SENDER_TRAIN_OUTR_INFO, Data: []byte{message.OUTER_EMERGENCY_BRAKE, 1}},*/
|
2024-08-22 13:12:03 +08:00
|
|
|
|
{Type: message.SENDER_TRAIN_OUTR_INFO, Data: []byte{message.NOT_BREAK, notBreak}},
|
2024-08-29 16:09:07 +08:00
|
|
|
|
/*{Type: message.SENDER_TRAIN_OUTR_INFO, Data: []byte{38, traction}}*/}
|
2024-04-02 18:20:10 +08:00
|
|
|
|
}
|
2024-04-09 08:55:33 +08:00
|
|
|
|
|
2024-05-24 09:00:43 +08:00
|
|
|
|
func (s *VerifySimulation) GetConnTrain2() []*state_proto.TrainState {
|
2024-07-19 15:24:28 +08:00
|
|
|
|
return s.findConnTrain2(state_proto.TrainConnState_PC_SIM)
|
2024-05-24 09:00:43 +08:00
|
|
|
|
}
|
|
|
|
|
|
2024-07-19 15:24:28 +08:00
|
|
|
|
func (s *VerifySimulation) findConnTrain2(ct1 ...state_proto.TrainConnState_TrainConnType) []*state_proto.TrainState {
|
2024-05-24 09:00:43 +08:00
|
|
|
|
var trains = make([]*state_proto.TrainState, 0)
|
|
|
|
|
s.Memory.Status.TrainStateMap.Range(func(k, v any) bool {
|
|
|
|
|
train := v.(*state_proto.TrainState)
|
|
|
|
|
if train.Show {
|
|
|
|
|
connState := train.ConnState
|
2024-07-19 15:24:28 +08:00
|
|
|
|
finded := index(ct1, connState.ConnType)
|
|
|
|
|
if finded >= 0 {
|
2024-05-24 09:00:43 +08:00
|
|
|
|
trains = append(trains, train)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return true
|
|
|
|
|
})
|
|
|
|
|
return trains
|
2024-04-09 08:55:33 +08:00
|
|
|
|
}
|
2024-07-19 15:24:28 +08:00
|
|
|
|
|
|
|
|
|
func index(arr []state_proto.TrainConnState_TrainConnType, search state_proto.TrainConnState_TrainConnType) int {
|
|
|
|
|
for i, v := range arr {
|
|
|
|
|
if v == search {
|
|
|
|
|
return i
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return -1
|
|
|
|
|
}
|
|
|
|
|
|
2024-06-06 17:57:30 +08:00
|
|
|
|
func (s *VerifySimulation) FindConnTrain(ct state_proto.TrainConnState_TrainConnType) *state_proto.TrainState {
|
2024-04-02 18:20:10 +08:00
|
|
|
|
var findTrain *state_proto.TrainState
|
|
|
|
|
s.Memory.Status.TrainStateMap.Range(func(k, v any) bool {
|
|
|
|
|
train := v.(*state_proto.TrainState)
|
|
|
|
|
connState := train.ConnState
|
|
|
|
|
if connState.ConnType == ct {
|
|
|
|
|
findTrain = train
|
|
|
|
|
return false
|
|
|
|
|
}
|
|
|
|
|
return true
|
|
|
|
|
})
|
|
|
|
|
return findTrain
|
|
|
|
|
}
|
|
|
|
|
|
2024-07-15 15:00:33 +08:00
|
|
|
|
// 反馈atp输出数字量数据
|
2024-09-11 21:19:42 +08:00
|
|
|
|
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) {
|
2024-09-10 15:37:40 +08:00
|
|
|
|
|
|
|
|
|
tcc := train.Tcc
|
|
|
|
|
tce := make([]message.TrainPcSimBaseMessage, 0)
|
|
|
|
|
connErr := false
|
|
|
|
|
state := message.GetBit(data1, 3)
|
|
|
|
|
|
|
|
|
|
if message.GetBit(data3, 3) == 0 {
|
|
|
|
|
actt := byte(0)
|
2024-09-11 21:19:42 +08:00
|
|
|
|
if driverActive {
|
2024-09-10 15:37:40 +08:00
|
|
|
|
actt = 1
|
|
|
|
|
}
|
|
|
|
|
tce = append(tce, message.TrainPcSimBaseMessage{Type: message.SENDER_TRAIN_OUTR_INFO, Data: []byte{message.DRIVER_ACTIVE_REPORT, actt}})
|
|
|
|
|
}
|
2024-09-10 15:51:59 +08:00
|
|
|
|
tce = append(tce, message.TrainPcSimBaseMessage{Type: message.SENDER_TRAIN_OUTR_INFO, Data: []byte{message.TRAIN_INTEGRITY, 1}})
|
2024-09-10 15:37:40 +08:00
|
|
|
|
|
2024-09-11 21:19:42 +08:00
|
|
|
|
if driverActive == false {
|
2024-09-10 15:37:40 +08:00
|
|
|
|
return initTimeStamp, initConn, false, tce
|
|
|
|
|
}
|
|
|
|
|
if initConn {
|
|
|
|
|
if data1 == 0 {
|
|
|
|
|
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 {
|
|
|
|
|
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...)
|
|
|
|
|
initConn = false
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return initTimeStamp, initConn, connErr, tce
|
|
|
|
|
}
|
2024-08-30 18:08:14 +08:00
|
|
|
|
func trainAtoLevel(at3, at2, at1 bool) state_proto.TrainVobcState_AtoStepLevel {
|
2024-08-29 16:09:07 +08:00
|
|
|
|
switch {
|
2024-08-30 18:08:14 +08:00
|
|
|
|
case at3 == false && at2 == false && at1 == true:
|
|
|
|
|
return state_proto.TrainVobcState_ATO_STEP_LEVEL_1
|
|
|
|
|
case at3 == false && at2 == true && at1 == true:
|
|
|
|
|
return state_proto.TrainVobcState_ATO_STEP_LEVEL_2
|
|
|
|
|
case at3 == false && at2 == true && at1 == false:
|
|
|
|
|
return state_proto.TrainVobcState_ATO_STEP_LEVEL_3
|
|
|
|
|
case at3 == true && at2 == true && at1 == false:
|
|
|
|
|
return state_proto.TrainVobcState_ATO_STEP_LEVEL_4
|
|
|
|
|
case at3 == true && at2 == false && at1 == false:
|
|
|
|
|
return state_proto.TrainVobcState_ATO_STEP_LEVEL_5
|
|
|
|
|
case at3 == true && at2 == false && at1 == true:
|
|
|
|
|
return state_proto.TrainVobcState_ATO_STEP_LEVEL_6
|
|
|
|
|
case at3 == true && at2 == true && at1 == true:
|
|
|
|
|
return state_proto.TrainVobcState_ATO_STEP_LEVEL_7
|
2024-08-29 16:09:07 +08:00
|
|
|
|
default:
|
2024-08-30 18:08:14 +08:00
|
|
|
|
return state_proto.TrainVobcState_ATO_STEP_LEVEL_NONE
|
2024-08-29 16:09:07 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
2024-09-11 21:19:42 +08:00
|
|
|
|
func (s *VerifySimulation) shuziliang(client *tcp.TcpClient, baseMessage []message.TrainPcSimBaseMessage) {
|
2024-09-10 15:37:40 +08:00
|
|
|
|
for _, msg := range baseMessage {
|
|
|
|
|
dd := msg.Encode()
|
2024-09-11 13:28:56 +08:00
|
|
|
|
//slog.Info(fmt.Sprintf("发送列车控制信息:%x", dd), aport)
|
2024-09-10 15:37:40 +08:00
|
|
|
|
client.Send(dd)
|
2024-08-29 16:09:07 +08:00
|
|
|
|
|
2024-09-10 15:37:40 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
2024-08-29 16:09:07 +08:00
|
|
|
|
|
2024-09-10 15:37:40 +08:00
|
|
|
|
// 4.4.1. 车载输出数字量信息报文内容
|
2024-09-11 21:19:42 +08:00
|
|
|
|
func (s *VerifySimulation) TrainPcSimDigitalOutInfoHandle(pc *train_pc_sim.TrainPcReciverData, train *state_proto.TrainState, data []byte) bool {
|
2024-08-29 16:09:07 +08:00
|
|
|
|
|
2024-09-10 15:37:40 +08:00
|
|
|
|
//slog.Info("开始接受atp输出模拟量==============%v", aport)
|
|
|
|
|
/* for i, d := range data {
|
2024-09-11 13:28:56 +08:00
|
|
|
|
dd := &strings.Builder{}
|
|
|
|
|
for j := 0; j < 8; j++ {
|
|
|
|
|
dd.WriteString(fmt.Sprintf(" bit%v val:%v , ", j, message.GetBit(d, uint(j))))
|
|
|
|
|
}
|
|
|
|
|
slog.Info(fmt.Sprintf("接受atp模拟量id:%v,data:%b,bits:%v", i, d, dd.String()))
|
|
|
|
|
}*/
|
|
|
|
|
|
2024-09-10 15:37:40 +08:00
|
|
|
|
//slog.Info(fmt.Sprintf("%v", dd.String()), aport)
|
|
|
|
|
//slog.Info("结束接受atp输出模拟量eeeeeeeeeeeeeeeeee", aport)
|
|
|
|
|
|
|
|
|
|
//s.reportTrainMockInitMsg(aport, client, train, data[4], data[1])
|
2024-07-19 15:24:28 +08:00
|
|
|
|
vobc := train.VobcState
|
2024-09-11 21:19:42 +08:00
|
|
|
|
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
|
|
|
|
|
|
|
|
|
|
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)
|
2024-09-10 15:37:40 +08:00
|
|
|
|
}
|
2024-09-11 21:19:42 +08:00
|
|
|
|
}
|
2024-09-11 13:28:56 +08:00
|
|
|
|
|
2024-09-11 21:19:42 +08:00
|
|
|
|
/*
|
|
|
|
|
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)
|
|
|
|
|
}
|
2024-09-10 15:37:40 +08:00
|
|
|
|
}
|
2024-09-11 21:19:42 +08:00
|
|
|
|
} 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)
|
|
|
|
|
}
|
2024-09-10 15:37:40 +08:00
|
|
|
|
}
|
2024-09-11 21:19:42 +08:00
|
|
|
|
}*/
|
2024-09-10 15:37:40 +08:00
|
|
|
|
|
|
|
|
|
return true
|
2024-07-15 15:00:33 +08:00
|
|
|
|
|
2024-04-02 18:20:10 +08:00
|
|
|
|
}
|
2024-04-11 08:55:12 +08:00
|
|
|
|
func trainPcSimDigitalOutInfoHandleCode39_32(d byte, vobc *state_proto.TrainVobcState) {
|
2024-04-16 17:26:37 +08:00
|
|
|
|
vobc.MostUseBrake = message.IsTrueForByte(message.GetBit(d, 0)) //? 常用制动
|
|
|
|
|
vobc.SplittingOut = message.IsTrueForByte(message.GetBit(d, 1)) //? 过分相输出
|
|
|
|
|
vobc.ModeRelay = message.IsTrueForByte(message.GetBit(d, 2)) //? 模式继电器
|
|
|
|
|
vobc.TractionEffective = message.IsTrueForByte(message.GetBit(d, 3)) //? 牵引有效
|
|
|
|
|
vobc.BrakeEffective = message.IsTrueForByte(message.GetBit(d, 4)) //? 制动有效
|
|
|
|
|
vobc.LifeDoorState = message.IsTrueForByte(message.GetBit(d, 5)) //?逃生门使能
|
|
|
|
|
vobc.BrakeQuarantine = message.IsTrueForByte(message.GetBit(d, 6)) //? 制动隔离
|
|
|
|
|
vobc.StopNotAllBrake = message.IsTrueForByte(message.GetBit(d, 7)) //? 停放制动缓解
|
2024-04-11 08:55:12 +08:00
|
|
|
|
|
|
|
|
|
}
|
2024-07-19 15:24:28 +08:00
|
|
|
|
func trainPcSimDigitalOutInfoHandleCode31_24(d byte, vobc *state_proto.TrainVobcState) {
|
|
|
|
|
|
2024-04-11 08:55:12 +08:00
|
|
|
|
vobc.AtoOpenLeftDoor = message.IsTrueForByte(message.GetBit(d, 0)) //?//ATO开左门
|
|
|
|
|
vobc.AtoOpenRightDoor = message.IsTrueForByte(message.GetBit(d, 1)) //?//ATO开右门
|
|
|
|
|
vobc.AtoCloseLeftDoor = message.IsTrueForByte(message.GetBit(d, 2)) //?//ATO关左门
|
2024-07-19 15:24:28 +08:00
|
|
|
|
/* if connType == state_proto.TrainConnState_PC_SIM_A {
|
|
|
|
|
vobc.Tc1Active = message.IsTrueForByte(message.GetBit(d, 3))
|
|
|
|
|
} else {
|
|
|
|
|
vobc.Tc2Active = message.IsTrueForByte(message.GetBit(d, 3))
|
|
|
|
|
}*/
|
2024-04-11 08:55:12 +08:00
|
|
|
|
|
2024-07-19 15:24:28 +08:00
|
|
|
|
vobc.LightDriverActive = message.IsTrueForByte(message.GetBit(d, 3)) //驾驶室激活
|
|
|
|
|
vobc.NoSpeedSigle = message.IsTrueForByte(message.GetBit(d, 4)) //?//零速信号
|
|
|
|
|
vobc.Fam = message.IsTrueForByte(message.GetBit(d, 5)) //FAM模式
|
|
|
|
|
vobc.Cam = message.IsTrueForByte(message.GetBit(d, 6)) //CAM模式
|
|
|
|
|
vobc.TrainStartedLed = message.IsTrueForByte(message.GetBit(d, 7)) //?//列车启动指示灯
|
2024-04-11 08:55:12 +08:00
|
|
|
|
}
|
2024-07-19 15:24:28 +08:00
|
|
|
|
|
2024-04-11 08:55:12 +08:00
|
|
|
|
func trainPcSimDigitalOutInfoHandleCode23_16(d byte, vobc *state_proto.TrainVobcState) {
|
2024-07-19 15:24:28 +08:00
|
|
|
|
vobc.LightDir1 = message.IsTrueForByte(message.GetBit(d, 0)) //列车方向1
|
|
|
|
|
vobc.LightDir2 = message.IsTrueForByte(message.GetBit(d, 1)) //列车方向1
|
|
|
|
|
//vobc.DirectionForward = message.IsTrueForByte(message.GetBit(d, 0)) //列车方向1
|
|
|
|
|
//vobc.DirectionBackward = message.IsTrueForByte(message.GetBit(d, 1)) //列车方向2
|
2024-04-16 17:26:37 +08:00
|
|
|
|
vobc.AtoLazyCommandOut = message.IsTrueForByte(message.GetBit(d, 2)) //?ATO惰行命令输出
|
|
|
|
|
vobc.SleepBtn = message.IsTrueForByte(message.GetBit(d, 3)) //?休眠指令
|
|
|
|
|
vobc.WakeUpBtn = message.IsTrueForByte(message.GetBit(d, 4)) //?唤醒指令
|
2024-08-29 16:09:07 +08:00
|
|
|
|
vobc.LightAtoSend = message.IsTrueForByte(message.GetBit(d, 5)) //?ATO发车指示灯
|
2024-04-16 17:26:37 +08:00
|
|
|
|
vobc.TurnbackStatus = message.IsTrueForByte(message.GetBit(d, 6)) //?AR灯命令
|
|
|
|
|
vobc.AtoAlwaysBrake = message.IsTrueForByte(message.GetBit(d, 7)) //? ATO保持制动
|
2024-04-11 08:55:12 +08:00
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
func trainPcSimDigitalOutInfoHandleCode15_8(d byte, vobc *state_proto.TrainVobcState) {
|
2024-07-19 15:24:28 +08:00
|
|
|
|
|
2024-04-16 17:26:37 +08:00
|
|
|
|
vobc.LocalAtpControl = message.IsTrueForByte(message.GetBit(d, 0)) //?本端ATP控车
|
2024-04-11 08:55:12 +08:00
|
|
|
|
vobc.Ato = message.IsTrueForByte(message.GetBit(d, 1)) //ATO模式
|
2024-04-16 17:26:37 +08:00
|
|
|
|
vobc.AtoTractionCommandOut = message.IsTrueForByte(message.GetBit(d, 2)) //?ATO牵引命令输出
|
|
|
|
|
vobc.AtoTractionCommand1 = message.IsTrueForByte(message.GetBit(d, 3)) //?ATO牵引指令1
|
|
|
|
|
vobc.AtoTractionCommand2 = message.IsTrueForByte(message.GetBit(d, 4)) //?ATO牵引指令2
|
|
|
|
|
vobc.AtoTractionCommand3 = message.IsTrueForByte(message.GetBit(d, 5)) //?ATO牵引指令3
|
2024-08-29 16:09:07 +08:00
|
|
|
|
vobc.AtoBrakeCommand = message.AtpLowPowerByte(message.GetBit(d, 6)) //?ATO制动命令输出
|
2024-04-11 08:55:12 +08:00
|
|
|
|
vobc.JumpStatus = message.IsTrueForByte(message.GetBit(d, 7)) //跳跃指令
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
func trainPcSimDigitalOutInfoHandleCode7_0(d byte, vobc *state_proto.TrainVobcState) {
|
2024-07-04 09:26:37 +08:00
|
|
|
|
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)) //紧急制动
|
2024-07-19 15:24:28 +08:00
|
|
|
|
vobc.LeftDoorState = message.IsTrueForByte(message.GetBit(d, 4)) //开左门允许
|
|
|
|
|
vobc.RightDoorState = message.IsTrueForByte(message.GetBit(d, 5)) //开右门允许
|
2024-08-27 11:58:08 +08:00
|
|
|
|
vobc.AtoCloseRightDoor = message.IsTrueForByte(message.GetBit(d, 6)) //ATO关右门
|
2024-07-04 09:26:37 +08:00
|
|
|
|
vobc.AllDoorClose = message.IsTrueForByte(message.GetBit(d, 7)) //车门保持关闭
|
2024-07-19 15:24:28 +08:00
|
|
|
|
vobc.LightTractionSafetyCircuit = vobc.TractionSafetyCircuit //切牵引
|
|
|
|
|
vobc.LightEmergencyBrakingStatus = vobc.EmergencyBrakingStatus //紧急制动
|
2024-04-11 08:55:12 +08:00
|
|
|
|
}
|
2024-04-02 18:20:10 +08:00
|
|
|
|
|
|
|
|
|
// 4.4.2. 车载输出数字反馈量信息报文内容
|
2024-07-19 15:24:28 +08:00
|
|
|
|
func (s *VerifySimulation) TrainPcSimDigitalReportHandle(train *state_proto.TrainState, data []byte) {
|
2024-06-27 10:37:52 +08:00
|
|
|
|
slog.Info(fmt.Sprintf("车载输出数字量反馈信息", hex.EncodeToString(data)))
|
2024-07-19 15:24:28 +08:00
|
|
|
|
|
2024-04-02 18:20:10 +08:00
|
|
|
|
vobc := train.VobcState
|
2024-04-11 08:55:12 +08:00
|
|
|
|
|
|
|
|
|
//buf := bytes.NewBuffer(data)
|
|
|
|
|
//localEndAct, _ := buf.ReadByte()
|
|
|
|
|
//direction1, _ := buf.ReadByte()
|
|
|
|
|
//direction2, _ := buf.ReadByte()
|
|
|
|
|
//vobc.Tc1Active = message.IsTrueForByte(localEndAct) //本端驾驶室激活(钥匙)
|
|
|
|
|
//vobc.DirectionForward = message.IsTrueForByte(direction1) //方向手柄进位
|
|
|
|
|
//vobc.DirectionBackward = message.IsTrueForByte(direction2) //方向手柄退位
|
|
|
|
|
buf := data[0]
|
|
|
|
|
vobc.Tc1Active = message.IsTrueForByte(message.GetBit(buf, 0)) //本端驾驶室激活(钥匙)
|
|
|
|
|
vobc.DirectionForward = message.IsTrueForByte(message.GetBit(buf, 1)) //方向手柄进位
|
|
|
|
|
vobc.DirectionBackward = message.IsTrueForByte(message.GetBit(buf, 2)) //方向手柄退位
|
2024-04-02 18:20:10 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 创建/删除列车
|
2024-06-13 14:16:52 +08:00
|
|
|
|
func TrainPcSimConnOrRemoveHandle(train *state_proto.TrainState, create bool) error {
|
2024-06-07 13:26:46 +08:00
|
|
|
|
connState := train.ConnState
|
2024-07-19 15:24:28 +08:00
|
|
|
|
if connState.ConnType == state_proto.TrainConnState_PC_SIM {
|
2024-06-27 10:37:52 +08:00
|
|
|
|
crErr := train_pc_sim.Default().CreateOrRemoveTrain(train, create)
|
2024-07-19 15:24:28 +08:00
|
|
|
|
//train_pc_sim.Default().CreateOrRemoveSpeedPLace(train)
|
2024-04-29 13:58:14 +08:00
|
|
|
|
if crErr != nil {
|
|
|
|
|
return crErr
|
|
|
|
|
}
|
2024-07-11 14:58:34 +08:00
|
|
|
|
|
2024-06-07 13:26:46 +08:00
|
|
|
|
} else if connState.ConnType == state_proto.TrainConnState_VOBC {
|
|
|
|
|
electrical_machinery.Default().ClearOrRemoveTrain(train)
|
2024-04-18 11:14:05 +08:00
|
|
|
|
}
|
|
|
|
|
return nil
|
2024-04-02 18:20:10 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 门模式
|
2024-04-13 09:40:25 +08:00
|
|
|
|
/*func TrainDoorModeHandle(train *state_proto.TrainState) {
|
2024-04-02 18:20:10 +08:00
|
|
|
|
if !train.ConnState.Conn {
|
|
|
|
|
slog.Error("车载pc仿真门模式,列车未连接车载pc仿真")
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
switch state {
|
|
|
|
|
case 0x00:
|
|
|
|
|
//0x00表示自开自关(AA)
|
|
|
|
|
train.VobcState.DoorModeAA = true
|
|
|
|
|
case 0x01:
|
|
|
|
|
//0x01表示自开人关(AM)
|
|
|
|
|
train.VobcState.DoorModeAM = true
|
|
|
|
|
case 0x02:
|
|
|
|
|
//0x02表示人开人关(MM)
|
|
|
|
|
train.VobcState.DoorModeMM = true
|
|
|
|
|
}
|
2024-04-13 09:40:25 +08:00
|
|
|
|
}*/
|
2024-04-02 18:20:10 +08:00
|
|
|
|
|
|
|
|
|
// 4.4.3. 车载输出模拟量信息报文内容(0x03)
|
2024-07-19 15:24:28 +08:00
|
|
|
|
func (s *VerifySimulation) TrainPcSimMockInfo(train *state_proto.TrainState, data []byte) {
|
|
|
|
|
/*train := s.FindConnTrain(connType)
|
2024-04-02 18:20:10 +08:00
|
|
|
|
if train == nil {
|
|
|
|
|
slog.Error("车载输出模拟量,未找到连接车载pc仿真的列车")
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
if !train.ConnState.Conn {
|
|
|
|
|
slog.Error("车载输出模拟量,列车未连接车载pc仿真")
|
|
|
|
|
return
|
2024-07-19 15:24:28 +08:00
|
|
|
|
}*/
|
2024-04-02 18:20:10 +08:00
|
|
|
|
mockData := binary.BigEndian.Uint16(data)
|
|
|
|
|
train.VobcState.MockInfo = uint32(mockData)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 4.4.4. 车载输出BTM查询同步帧报文内容(0x04)
|
2024-09-11 21:19:42 +08:00
|
|
|
|
func (s *VerifySimulation) TrainBtmQuery2(train *state_proto.TrainState, data []byte, trainClientPort state_proto.TrainState_TrainPort) {
|
2024-08-09 16:41:41 +08:00
|
|
|
|
|
2024-08-05 16:32:21 +08:00
|
|
|
|
ts := time.Now().UnixMilli()
|
2024-04-02 18:20:10 +08:00
|
|
|
|
if len(data) < 12 {
|
|
|
|
|
slog.Error("列车btm查询报文长度错误:", len(data))
|
|
|
|
|
return
|
|
|
|
|
}
|
2024-08-13 17:33:57 +08:00
|
|
|
|
|
2024-07-25 14:55:46 +08:00
|
|
|
|
trainAtm := message.NewBtmHeadFrame(data)
|
|
|
|
|
atpReq := &message.AtpRequestFrame{}
|
|
|
|
|
if !atpReq.Decode2(trainAtm) {
|
2024-04-02 18:20:10 +08:00
|
|
|
|
slog.Warn("列车pc驾驶模拟-CanetFrame解码成AtpRequestFrame失败", "CanetFrame", trainAtm.String())
|
|
|
|
|
return
|
|
|
|
|
}
|
2024-08-15 14:54:16 +08:00
|
|
|
|
var balise *state_proto.BTMState
|
|
|
|
|
var dsn, bc, mc byte
|
2024-09-10 15:37:40 +08:00
|
|
|
|
btmCache := train.BtmBaliseCacheA
|
2024-09-11 21:19:42 +08:00
|
|
|
|
if train.TrainPort != trainClientPort {
|
2024-09-10 15:37:40 +08:00
|
|
|
|
btmCache = train.BtmBaliseCacheB
|
|
|
|
|
}
|
2024-09-11 21:19:42 +08:00
|
|
|
|
|
2024-08-15 14:54:16 +08:00
|
|
|
|
if atpReq.IsResend() {
|
2024-09-10 15:37:40 +08:00
|
|
|
|
balise, dsn, bc, mc = can_btm.FindBaliseResend(btmCache, true)
|
2024-08-15 14:54:16 +08:00
|
|
|
|
} else {
|
2024-09-10 15:37:40 +08:00
|
|
|
|
balise, dsn, bc, mc = can_btm.FindBaliseByNotSend(btmCache, true)
|
2024-08-15 14:54:16 +08:00
|
|
|
|
}
|
2024-04-02 18:20:10 +08:00
|
|
|
|
cl := clock(atpReq)
|
2024-08-13 17:32:49 +08:00
|
|
|
|
btmRepFrame := createBtmStatus(trainAtm.CanId.ID4, balise, atpReq, cl, dsn, bc, mc)
|
2024-08-15 14:54:16 +08:00
|
|
|
|
timeSyncF := message.NewBtmTimeSyncCheckFrame(trainAtm.CanId.ID4)
|
|
|
|
|
timeSyncF.T2 = cl.BtmTk
|
|
|
|
|
timeSyncF.T3 = cl.TkNow()
|
|
|
|
|
if balise == nil {
|
2024-09-11 21:19:42 +08:00
|
|
|
|
queryData := createLine12EmptyBaliseData(btmRepFrame, timeSyncF)
|
|
|
|
|
sendLine12EmptyBaliseData(train, trainClientPort, queryData)
|
2024-08-22 13:12:03 +08:00
|
|
|
|
//slog.Info(fmt.Sprintf("接受应答器查询:%x发送无应答器数据,id:%v,数据:%X", data, trainAtm.CanId.ID4, queryData))
|
2024-08-15 14:54:16 +08:00
|
|
|
|
} else {
|
|
|
|
|
logstr := ""
|
|
|
|
|
if atpReq.IsResend() {
|
2024-09-11 21:19:42 +08:00
|
|
|
|
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())
|
2024-08-13 17:32:49 +08:00
|
|
|
|
|
2024-08-15 14:54:16 +08:00
|
|
|
|
} else if !balise.IsSend {
|
|
|
|
|
balise.IsSend = true
|
2024-09-11 21:19:42 +08:00
|
|
|
|
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)
|
2024-08-15 14:54:16 +08:00
|
|
|
|
return
|
2024-09-11 21:19:42 +08:00
|
|
|
|
}*/
|
|
|
|
|
slog.Info(logstr, trainClientPort.String())
|
2024-08-15 14:54:16 +08:00
|
|
|
|
aliseData, _ := hex.DecodeString(balise.Telegram)
|
|
|
|
|
stateRepFrame := btmRepFrame.EncodeBtmAtp()
|
|
|
|
|
statusDataCf, statusDataCfOk := message.CreateBtmAtpDataRspFramesData(stateRepFrame, aliseData, false, balise.HasData, cl.BtmTk, cl.BtmTk, cl.BtmTk)
|
|
|
|
|
if statusDataCfOk {
|
2024-07-25 14:55:46 +08:00
|
|
|
|
timeSyncF.T2 = cl.BtmTk
|
|
|
|
|
timeSyncF.T3 = cl.TkNow()
|
|
|
|
|
queryData := make([]byte, 0)
|
2024-08-15 14:54:16 +08:00
|
|
|
|
queryData = append(queryData, stateRepFrame.Encode()...)
|
2024-07-25 14:55:46 +08:00
|
|
|
|
queryData = append(queryData, timeSyncF.EncodeBtmAtp().Encode()...)
|
2024-08-15 14:54:16 +08:00
|
|
|
|
queryData = append(queryData, statusDataCf...) //数据帧包含结束帧
|
|
|
|
|
balise.BaliseTelegramForPcSimResend = fmt.Sprintf("%X", statusDataCf)
|
2024-09-11 21:19:42 +08:00
|
|
|
|
train_pc_sim.Default().SendBaliseData2(train, trainClientPort, message.RECIVE_TRAIN_BTM_HAS_DATA, queryData)
|
2024-08-15 14:54:16 +08:00
|
|
|
|
} else {
|
|
|
|
|
slog.Error("列车pc仿真 BtmCanetClient应答帧、数据帧编码失败")
|
2024-04-02 18:20:10 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2024-09-11 21:19:42 +08:00
|
|
|
|
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
|
|
|
|
|
}
|
|
|
|
|
|
2024-08-13 17:32:49 +08:00
|
|
|
|
func createBtmStatus(canIdSn byte, btmState *state_proto.BTMState, atpReq *message.AtpRequestFrame, cl can_btm.BtmClock, dsn, baliseCount, messageCount byte) *message.BtmStatusRspFrame {
|
2024-07-25 14:55:46 +08:00
|
|
|
|
statusF := message.NewBtmStatusRspFrame(canIdSn)
|
2024-04-02 18:20:10 +08:00
|
|
|
|
statusF.PowerAmplifierOn = true
|
|
|
|
|
statusF.PowerAmplifierFailure = false
|
|
|
|
|
statusF.AtpReqCrcCheckWrong = !atpReq.Crc16CheckOk
|
|
|
|
|
statusF.AntennaFault = false
|
2024-08-13 17:32:49 +08:00
|
|
|
|
statusF.BaliseCounter = baliseCount
|
|
|
|
|
statusF.MessageCounter = messageCount
|
2024-07-25 14:55:46 +08:00
|
|
|
|
//statusF.TkTimeA = cl.TkNow()
|
|
|
|
|
statusF.TkTimeA = cl.BtmTk
|
2024-04-02 18:20:10 +08:00
|
|
|
|
statusF.DetailedCode = 0
|
2024-08-13 17:32:49 +08:00
|
|
|
|
if btmState != nil && btmState.AboveBalise {
|
2024-04-02 18:20:10 +08:00
|
|
|
|
statusF.DetailedCode = 0x07
|
|
|
|
|
}
|
2024-07-04 09:26:37 +08:00
|
|
|
|
statusF.Dsn = dsn
|
2024-04-02 18:20:10 +08:00
|
|
|
|
return statusF
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func clock(atpReq *message.AtpRequestFrame) can_btm.BtmClock {
|
|
|
|
|
now := time.Now()
|
|
|
|
|
return can_btm.BtmClock{BtmTk: atpReq.Time, SysTk: now}
|
|
|
|
|
}
|
2024-07-15 15:00:33 +08:00
|
|
|
|
func (s *VerifySimulation) ObtainTrainDigitalMockDataForStatus(train *state_proto.TrainState) []message.TrainPcSimBaseMessage {
|
2024-06-27 10:37:52 +08:00
|
|
|
|
msgArr := make([]message.TrainPcSimBaseMessage, 0)
|
|
|
|
|
vs := train.VobcState
|
|
|
|
|
|
|
|
|
|
if vs.Tc1Active || vs.Tc2Active {
|
2024-09-10 15:37:40 +08:00
|
|
|
|
msgArr = append(msgArr, message.TrainPcSimBaseMessage{Data: []byte{message.KEY_STATE, 1}, Type: message.SENDER_TRAIN_OUTR_INFO}) //钥匙激活
|
|
|
|
|
//msgArr = append(msgArr, message.TrainPcSimBaseMessage{Data: []byte{message.DRIVER_ACTIVE_REPORT, 1}, Type: message.SENDER_TRAIN_OUTR_INFO}) //列车完整性
|
|
|
|
|
} /* else {
|
2024-07-15 15:00:33 +08:00
|
|
|
|
msgArr = append(msgArr, message.TrainPcSimBaseMessage{Data: []byte{message.DRIVER_ACTIVE_REPORT, 0}, Type: message.SENDER_TRAIN_OUTR_INFO}) //列车完整性
|
2024-09-10 15:37:40 +08:00
|
|
|
|
}*/
|
2024-07-11 14:58:34 +08:00
|
|
|
|
if vs.BrakeForce == 0 {
|
|
|
|
|
msgArr = append(msgArr, message.TrainPcSimBaseMessage{Data: []byte{message.HANDLE_TO_ZERO, 1}, Type: message.SENDER_TRAIN_OUTR_INFO}) //列车制动状态
|
|
|
|
|
}
|
2024-06-27 10:37:52 +08:00
|
|
|
|
if vs.BrakingStatus {
|
|
|
|
|
msgArr = append(msgArr, message.TrainPcSimBaseMessage{Data: []byte{message.TRAIN_BRAKE_STATE, 1}, Type: message.SENDER_TRAIN_OUTR_INFO}) //列车制动状态
|
|
|
|
|
}
|
2024-07-04 09:26:37 +08:00
|
|
|
|
|
2024-06-27 10:37:52 +08:00
|
|
|
|
if vs.EmergencyBrakingStatus {
|
2024-07-11 14:58:34 +08:00
|
|
|
|
msgArr = append(msgArr, message.TrainPcSimBaseMessage{Data: []byte{message.OUTER_EMERGENCY_BRAKE, 0}, Type: message.SENDER_TRAIN_OUTR_INFO}) //紧急制动
|
2024-06-27 10:37:52 +08:00
|
|
|
|
}
|
2024-07-11 14:58:34 +08:00
|
|
|
|
|
2024-08-22 13:12:03 +08:00
|
|
|
|
if vs.DirectionForward {
|
2024-07-11 14:58:34 +08:00
|
|
|
|
msgArr = append(msgArr, message.TrainPcSimBaseMessage{Data: []byte{message.HANDLE_FORWORD, 1}, Type: message.SENDER_TRAIN_OUTR_INFO}) //方向手柄向前控制
|
|
|
|
|
msgArr = append(msgArr, message.TrainPcSimBaseMessage{Data: []byte{message.HANDLE_BACKWORD, 0}, Type: message.SENDER_TRAIN_OUTR_INFO}) //方向手柄向前控制
|
2024-08-22 13:12:03 +08:00
|
|
|
|
} else if vs.DirectionForward {
|
|
|
|
|
|
2024-07-11 14:58:34 +08:00
|
|
|
|
msgArr = append(msgArr, message.TrainPcSimBaseMessage{Data: []byte{message.HANDLE_FORWORD, 0}, Type: message.SENDER_TRAIN_OUTR_INFO}) //方向手柄向前控制
|
|
|
|
|
msgArr = append(msgArr, message.TrainPcSimBaseMessage{Data: []byte{message.HANDLE_BACKWORD, 1}, Type: message.SENDER_TRAIN_OUTR_INFO}) //方向手柄向前控制
|
|
|
|
|
}
|
2024-08-27 11:58:08 +08:00
|
|
|
|
/* if vs.RightDoorCloseCommand {
|
|
|
|
|
msgArr = append(msgArr, message.TrainPcSimBaseMessage{Data: []byte{message.CLOSE_RIGHT_DOOR, 1}, Type: message.SENDER_TRAIN_OUTR_INFO}) //关右门按钮
|
|
|
|
|
}
|
|
|
|
|
if vs.LeftDoorCloseCommand {
|
|
|
|
|
msgArr = append(msgArr, message.TrainPcSimBaseMessage{Data: []byte{message.CLOSE_LEFT_DOOR, 1}, Type: message.SENDER_TRAIN_OUTR_INFO}) //关左门按钮
|
|
|
|
|
}
|
|
|
|
|
if vs.AllDoorClose {
|
|
|
|
|
|
|
|
|
|
}*/
|
2024-07-11 14:58:34 +08:00
|
|
|
|
if vs.ObstacleCheckBtn {
|
|
|
|
|
msgArr = append(msgArr, message.TrainPcSimBaseMessage{Data: []byte{message.OBSTACLE_CHECK, 1}, Type: message.SENDER_TRAIN_OUTR_INFO}) //障碍物检测按钮
|
|
|
|
|
}
|
|
|
|
|
if vs.BrakeHeavyFault {
|
|
|
|
|
msgArr = append(msgArr, message.TrainPcSimBaseMessage{Data: []byte{message.BRAKE_HEAVY_FAULT, 1}, Type: message.SENDER_TRAIN_OUTR_INFO}) //制动重故障
|
|
|
|
|
}
|
|
|
|
|
if vs.AtpCutSwitch {
|
|
|
|
|
msgArr = append(msgArr, message.TrainPcSimBaseMessage{Data: []byte{message.ATP_CUT, 1}, Type: message.SENDER_TRAIN_OUTR_INFO}) //atp切除
|
|
|
|
|
}
|
|
|
|
|
if vs.AtpPowerOnBtn {
|
|
|
|
|
msgArr = append(msgArr, message.TrainPcSimBaseMessage{Data: []byte{message.ATP_POWER_ON, 1}, Type: message.SENDER_TRAIN_OUTR_INFO}) //atp上电
|
|
|
|
|
}
|
2024-07-15 15:00:33 +08:00
|
|
|
|
if vs.TurnbackStatus {
|
|
|
|
|
msgArr = append(msgArr, message.TrainPcSimBaseMessage{Data: []byte{message.TURN_BACK, 1}, Type: message.SENDER_TRAIN_OUTR_INFO}) //atp上电
|
|
|
|
|
}
|
2024-07-04 09:26:37 +08:00
|
|
|
|
msgArr = append(msgArr, message.TrainPcSimBaseMessage{Data: []byte{message.LIFE_DOOR, 1}, Type: message.SENDER_TRAIN_OUTR_INFO}) //逃生门状态
|
2024-07-15 15:00:33 +08:00
|
|
|
|
msgArr = append(msgArr, message.TrainPcSimBaseMessage{Data: []byte{message.EMERGENT_HANDLE_DOWN, 1}, Type: message.SENDER_TRAIN_OUTR_INFO}) //紧急手柄拉下
|
|
|
|
|
msgArr = append(msgArr, message.TrainPcSimBaseMessage{Data: []byte{message.TRAIN_TRACTION_CUTED, 1}, Type: message.SENDER_TRAIN_OUTR_INFO}) //紧急手柄拉下
|
2024-08-22 13:12:03 +08:00
|
|
|
|
|
2024-07-15 15:00:33 +08:00
|
|
|
|
return msgArr
|
|
|
|
|
}
|
|
|
|
|
func (s *VerifySimulation) ObtainTrainDigitalMockData(train *state_proto.TrainState) []message.TrainPcSimBaseMessage {
|
|
|
|
|
msgArr := make([]message.TrainPcSimBaseMessage, 0)
|
2024-08-27 11:58:08 +08:00
|
|
|
|
vs := train.VobcState
|
2024-07-15 15:00:33 +08:00
|
|
|
|
stateArr := s.ObtainTrainDigitalMockDataForStatus(train)
|
|
|
|
|
msgArr = append(msgArr, stateArr...)
|
2024-08-22 13:12:03 +08:00
|
|
|
|
|
2024-07-15 15:00:33 +08:00
|
|
|
|
msgArr = append(msgArr, message.TrainPcSimBaseMessage{Data: []byte{message.ATO_SEND_TRAIN, 0}, Type: message.SENDER_TRAIN_OUTR_INFO}) //ATO发车按钮
|
|
|
|
|
msgArr = append(msgArr, message.TrainPcSimBaseMessage{Data: []byte{message.LEFT_DOOR_STATE, 0}, Type: message.SENDER_TRAIN_OUTR_INFO}) //左门状态按钮
|
|
|
|
|
msgArr = append(msgArr, message.TrainPcSimBaseMessage{Data: []byte{message.RIGHT_DOOR_STATE, 0}, Type: message.SENDER_TRAIN_OUTR_INFO}) //列车完整性
|
|
|
|
|
msgArr = append(msgArr, message.TrainPcSimBaseMessage{Data: []byte{message.CONFIRM, 1}, Type: message.SENDER_TRAIN_OUTR_INFO}) //列车完整性
|
|
|
|
|
msgArr = append(msgArr, message.TrainPcSimBaseMessage{Data: []byte{message.TRAIN_INTEGRITY, 1}, Type: message.SENDER_TRAIN_OUTR_INFO}) //列车完整性
|
|
|
|
|
|
2024-08-27 11:58:08 +08:00
|
|
|
|
msgArr = append(msgArr, message.TrainPcSimBaseMessage{Data: []byte{message.NOT_BREAK, 1}, Type: message.SENDER_TRAIN_OUTR_INFO}) //非制动
|
|
|
|
|
msgArr = append(msgArr, message.TrainPcSimBaseMessage{Data: []byte{38, 0}, Type: message.SENDER_TRAIN_OUTR_INFO}) //只牵引
|
|
|
|
|
msgArr = append(msgArr, message.TrainPcSimBaseMessage{Data: []byte{40, 1}, Type: message.SENDER_TRAIN_OUTR_INFO}) //本端机械钩
|
|
|
|
|
msgArr = append(msgArr, message.TrainPcSimBaseMessage{Data: []byte{41, 1}, Type: message.SENDER_TRAIN_OUTR_INFO}) //对端机械钩
|
|
|
|
|
msgArr = append(msgArr, message.TrainPcSimBaseMessage{Data: []byte{message.DOOR_LOCK_STATE, 1}, Type: message.SENDER_TRAIN_OUTR_INFO}) //车门锁闭状态
|
|
|
|
|
var modeAA, modeAM, modeMM byte = 0, 0, 0
|
|
|
|
|
if vs.DoorModeAA {
|
|
|
|
|
modeAA = 1
|
|
|
|
|
}
|
|
|
|
|
if vs.DoorModeAM {
|
|
|
|
|
modeAM = 1
|
|
|
|
|
}
|
|
|
|
|
if vs.DoorModeMM {
|
|
|
|
|
modeMM = 1
|
|
|
|
|
}
|
|
|
|
|
msgArr = append(msgArr, message.TrainPcSimBaseMessage{Data: []byte{message.DOOR_MODE_AA, modeAA}, Type: message.SENDER_TRAIN_OUTR_INFO})
|
|
|
|
|
msgArr = append(msgArr, message.TrainPcSimBaseMessage{Data: []byte{message.DOOR_MODE_AM, modeAM}, Type: message.SENDER_TRAIN_OUTR_INFO})
|
|
|
|
|
msgArr = append(msgArr, message.TrainPcSimBaseMessage{Data: []byte{message.DOOR_MODE_MM, modeMM}, Type: message.SENDER_TRAIN_OUTR_INFO})
|
2024-09-05 09:21:49 +08:00
|
|
|
|
|
2024-06-27 10:37:52 +08:00
|
|
|
|
return msgArr
|
|
|
|
|
}
|