rts-sim-testing-service/third_party/message/dynamics.go
tiger_zhou 272274a5c4
All checks were successful
local-test分支打包构建docker并发布运行 / Docker-Build (push) Successful in 2m54s
列车应答器添加可变报文,修改列车初始化制动力及列车行驶制动力
2024-08-09 16:41:41 +08:00

133 lines
3.6 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package message
import (
"encoding/binary"
"math"
"time"
)
type DynamicsTurnoutInfo struct {
LifeSignal uint16
TurnoutInfos []*TurnoutInfo
}
type TurnoutInfo struct {
Code uint16
NPosition bool
RPosition bool
}
func (t *DynamicsTurnoutInfo) Encode() []byte {
var data []byte
data = binary.BigEndian.AppendUint16(data, t.LifeSignal)
for _, info := range t.TurnoutInfos {
data = binary.BigEndian.AppendUint16(data, info.Code)
var b byte
if info.NPosition {
b |= 1 << 7
}
if info.RPosition {
b |= 1 << 6
}
data = append(data, b)
}
return data
}
type DynamicsTrainInfo struct {
//生命信号
LifeSignal uint16
//列车号(车辆)
Number uint8
//列车长度 cm
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
//位移mm
Displacement float32
TrainActToMax bool
TrainActToMin bool
UpdateTime int64
}
// 解析动力学的列车信息
func (t *DynamicsTrainInfo) Decode(buf []byte) error {
t.LifeSignal = binary.BigEndian.Uint16(buf[0:2])
t.Number = buf[2]
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 = IsTrueForByte(GetBit(b, 7))
t.Up = IsTrueForByte(GetBit(b, 6))
t.TrainActToMax = IsTrueForByte(GetBit(b, 4))
t.TrainActToMin = IsTrueForByte(GetBit(b, 5))
//t.UpSlope = (b & (1 << 7)) != 0
//t.Up = (b & (1 << 6)) != 0
//t.TrainActToMax = (b & (1 << 5)) != 0
//t.TrainActToMin = (b & (1 << 4)) != 0
//t.TrainActToMax = (b & (1 << 4)) != 0
//t.TrainActToMin = (b & (1 << 5)) != 0
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])
//tt := binary.BigEndian.Uint16(buf[66:68])
//t.Displacement = float32(tt)
dirBin := binary.BigEndian.Uint32(buf[66:70])
t.Displacement = math.Float32frombits(dirBin)
t.UpdateTime = time.Now().UnixMilli()
return nil
}