package vobc import "encoding/binary" // 接收到的列车信息 type ReceiveTrainInfo struct { //【0 1】两个字节 // 生命信号 每个周期+1 LifeSignal uint16 //【2】 一个字节 // TC1激活状态 1=激活 Tc1Active bool // TC2激活状态 1=激活 Tc2Active bool // 列车方向向前 1=方向向前 DirectionForward bool // 列车方向向后 1=方向向后 DirectionBackward bool // 列车牵引状态 1=牵引 TractionStatus bool // 列车制动状态 1=制动 BrakingStatus bool // 列车紧急制动状态 1=紧急制动 EmergencyBrakingStatus bool // 列车折返状态(AR) 1=折返 TurnbackStatus bool //【3】 一个字节 // 跳跃状态 1=跳跃 JumpStatus bool // ATO模式 1=ATO模式 ATO bool // FAM模式 1=FAM模式 FAM bool // CAM模式 1=CAM模式 CAM bool // 牵引安全回路 1=牵引安全切除 TractionSafetyCircuit bool // 停放制动状态 1=停放施加 ParkingBrakeStatus bool // 保持制动状态 1=保持制动施加 MaintainBrakeStatus bool //【4 5】 两个字节 列车牵引力 100=1KN TractionForce uint16 //【6 7】 列车制动力 100=1KN BrakeForce uint16 //【8 9】 列车载荷 100=1ton TrainLoad uint16 // 【15】 一个字节 // 列车开左门指令 1=开门 LeftDoorOpenCommand bool // 列车开右门指令 1=开门 RightDoorOpenCommand bool // 列车关左门指令 1=关门 LeftDoorCloseCommand bool // 列车关右门指令 1=关门 RightDoorCloseCommand bool // 整列车门关好 1=门关好 AllDoorClose bool } // 解析VOBC列车信息 func (r *ReceiveTrainInfo) DecoderVobcTrainInfo(buf []byte) *ReceiveTrainInfo { r.LifeSignal = binary.BigEndian.Uint16(buf[0:2]) b2 := buf[2] r.Tc1Active = (b2 & (1 << 7)) != 0 r.Tc2Active = (b2 & (1 << 6)) != 0 r.DirectionForward = (b2 & (1 << 5)) != 0 r.DirectionBackward = (b2 & (1 << 4)) != 0 r.TractionStatus = (b2 & (1 << 3)) != 0 r.BrakingStatus = (b2 & (1 << 2)) != 0 r.EmergencyBrakingStatus = (b2 & (1 << 1)) != 0 r.TurnbackStatus = (b2 & 1) != 0 b3 := buf[3] r.JumpStatus = (b3 & (1 << 7)) != 0 r.ATO = (b3 & (1 << 6)) != 0 r.FAM = (b3 & (1 << 5)) != 0 r.CAM = (b3 & (1 << 4)) != 0 r.TractionSafetyCircuit = (b3 & (1 << 3)) != 0 r.ParkingBrakeStatus = (b3 & (1 << 2)) != 0 r.MaintainBrakeStatus = (b3 & (1 << 1)) != 0 r.TractionForce = binary.BigEndian.Uint16(buf[4:6]) r.BrakeForce = binary.BigEndian.Uint16(buf[6:8]) r.TrainLoad = binary.BigEndian.Uint16(buf[8:10]) b4 := buf[15] r.LeftDoorOpenCommand = (b4 & (1 << 7)) != 0 r.RightDoorOpenCommand = (b4 & (1 << 6)) != 0 r.LeftDoorCloseCommand = (b4 & (1 << 5)) != 0 r.RightDoorCloseCommand = (b4 & (1 << 4)) != 0 r.AllDoorClose = (b4 & (1 << 3)) != 0 return r } // 发送列车信息 type SendTrainInfo struct { // 生命信号 每个周期+1 LifeSignal uint16 // 列车速度 10=1km/h Speed uint16 // 上坡 Upslope bool // 坡度值 1= 1‰ Slope uint16 // 加速度 100 = 1 m/s*s Acceleration uint16 // 实际运行阻力 100 = 1KN TotalResistance uint16 // 空气阻力 100 = 1KN AirResistance uint16 // 坡道阻力 100 = 1KN SlopeResistance uint16 // 曲线阻力 100 = 1KN CurveResistance uint16 }