rts-sim-testing-service/third_party/message/dynamics.go

101 lines
2.8 KiB
Go
Raw Normal View History

package message
import (
"encoding/binary"
"math"
)
type DynamicsTurnoutInfo struct {
LifeSignal uint16
Code uint16
NPosition bool
RPosition bool
}
func (t *DynamicsTurnoutInfo) Encode() []byte {
var data []byte
data = binary.BigEndian.AppendUint16(data, t.LifeSignal)
data = binary.BigEndian.AppendUint16(data, t.Code)
var b byte
if t.NPosition {
b |= 1 << 7
}
if t.RPosition {
b |= 1 << 6
}
data = append(data, b)
return data
}
type DynamicsTrainInfo struct {
//生命信号
LifeSignal uint16
//列车号(车辆)
Number uint8
//列车长度 cm
2023-11-10 09:28:27 +08:00
Len uint32
//列车所在轨道link
Link uint8
//列车所在link偏移量mm
LinkOffset uint32
//列车所在位置坡度值(‰)
Slope uint16
//列车所在位置坡度走势(上/下坡)
UpSlope bool
//列车当前运行方向(偏移量增大/减小方向)
Up bool
//实际运行阻力N
TotalResistance int32
//阻力1空气阻力N
AirResistance int32
//阻力2坡道阻力N
SlopeResistance int32
//阻力3曲线阻力N
CurveResistance int32
//列车运行速度m/s
Speed float32
//头车速传1速度值m/s
HeadSpeed1 float32
//头车速度2速度值m/s
HeadSpeed2 float32
//尾车速传1速度值m/s
TailSpeed1 float32
//尾车速度2速度值m/s
TailSpeed2 float32
//头车雷达速度值m/s
HeadRadarSpeed float32
//尾车雷达速度值m/s
TailRadarSpeed float32
//加速度(m/s^2)
Acceleration float32
// 对应动力学生命周期值
VobcLifeSignal uint16
}
// 解析动力学的列车信息
func (t *DynamicsTrainInfo) Decode(buf []byte) error {
t.LifeSignal = binary.BigEndian.Uint16(buf[0:2])
t.Number = buf[2]
2023-11-10 09:28:27 +08:00
t.Len = binary.BigEndian.Uint32(buf[3:7])
t.Link = buf[7]
t.LinkOffset = binary.BigEndian.Uint32(buf[8:12])
t.Slope = binary.BigEndian.Uint16(buf[12:14])
b := buf[14]
t.UpSlope = (b & (1 << 7)) != 0
t.Up = (b & (1 << 6)) != 0
2023-11-10 09:28:27 +08:00
t.TotalResistance = int32(binary.BigEndian.Uint32(buf[16:20]))
t.AirResistance = int32(binary.BigEndian.Uint32(buf[20:24]))
t.SlopeResistance = int32(binary.BigEndian.Uint32(buf[24:28]))
t.CurveResistance = int32(binary.BigEndian.Uint32(buf[28:32]))
t.Speed = math.Float32frombits(binary.BigEndian.Uint32(buf[32:36]))
t.HeadSpeed1 = math.Float32frombits(binary.BigEndian.Uint32(buf[36:40]))
t.HeadSpeed2 = math.Float32frombits(binary.BigEndian.Uint32(buf[40:44]))
t.TailSpeed1 = math.Float32frombits(binary.BigEndian.Uint32(buf[44:48]))
t.TailSpeed2 = math.Float32frombits(binary.BigEndian.Uint32(buf[48:52]))
t.HeadRadarSpeed = math.Float32frombits(binary.BigEndian.Uint32(buf[52:56]))
t.TailRadarSpeed = math.Float32frombits(binary.BigEndian.Uint32(buf[56:60]))
t.Acceleration = math.Float32frombits(binary.BigEndian.Uint32(buf[60:64]))
t.VobcLifeSignal = binary.BigEndian.Uint16(buf[64:66])
return nil
}