rts-sim-module/fi/train.go

108 lines
3.1 KiB
Go
Raw Permalink Normal View History

2023-11-09 14:59:18 +08:00
package fi
import (
"fmt"
"joylink.club/ecs"
"joylink.club/rtsssimulation/component"
"joylink.club/rtsssimulation/entity"
)
// AddTrainToWorld 添加列车
func AddTrainToWorld(w ecs.World, trainId string) error {
result := <-ecs.Request[ecs.EmptyType](w, func() ecs.Result[ecs.EmptyType] {
wd := entity.GetWorldData(w)
_, find := wd.EntityMap[trainId]
if !find {
2023-12-05 09:37:32 +08:00
entity.NewTrainEntity(w, trainId)
2023-11-09 14:59:18 +08:00
}
return ecs.NewOkEmptyResult()
})
return result.Err
}
// RemoveTrainFromWorld 移除列车
func RemoveTrainFromWorld(w ecs.World, trainId string) error {
result := <-ecs.Request[ecs.EmptyType](w, func() ecs.Result[ecs.EmptyType] {
wd := entity.GetWorldData(w)
te, find := wd.EntityMap[trainId]
if find {
te.Remove()
delete(wd.EntityMap, trainId)
}
return ecs.NewOkEmptyResult()
})
return result.Err
}
2023-11-10 16:03:33 +08:00
// UpdateTrainPositionFromDynamics 更新列车所在的物理区段
func UpdateTrainPositionFromDynamics(w ecs.World, tpi TrainPositionInfo) error {
2023-11-09 14:59:18 +08:00
result := <-ecs.Request[ecs.EmptyType](w, func() ecs.Result[ecs.EmptyType] {
wd := entity.GetWorldData(w)
2023-11-10 16:03:33 +08:00
te, find := wd.EntityMap[tpi.TrainId]
2023-11-09 14:59:18 +08:00
if find {
2023-11-10 16:03:33 +08:00
train := component.TrainPositionInfoType.Get(te)
2023-11-28 16:05:41 +08:00
//
2023-12-05 09:37:32 +08:00
//lastTrainHeadPos := &device_sys.TrainHeadPosition{Up: train.Up, HeadLink: train.HeadLink, HeadLinkOffset: train.HeadLinkOffset}
2023-11-28 16:05:41 +08:00
//
2023-11-10 16:03:33 +08:00
train.Up = tpi.Up
train.Len = int64(tpi.Len)
train.HeadLink = tpi.HeadLink
2023-11-13 13:53:46 +08:00
train.HeadLinkOffset = int64(tpi.HeadLinkOffset)
2023-11-10 16:03:33 +08:00
train.TailLink = tpi.TailLink
2023-11-13 13:53:46 +08:00
train.TailLinkOffset = int64(tpi.TailLinkOffset)
2023-12-05 09:37:32 +08:00
/*
//列车车头移动范围
curTrainHeadPos := &device_sys.TrainHeadPosition{Up: train.Up, HeadLink: train.HeadLink, HeadLinkOffset: train.HeadLinkOffset}
//根据列车位置探测应答器
device_sys.NewBaliseDetection().DetectBalise(w, te, lastTrainHeadPos, curTrainHeadPos)
*/
2023-11-28 13:30:04 +08:00
//
2023-11-09 14:59:18 +08:00
return ecs.NewOkEmptyResult()
} else {
2023-11-10 16:03:33 +08:00
return ecs.NewErrResult(fmt.Errorf("列车[%s]实体不存在", tpi.TrainId))
2023-11-09 14:59:18 +08:00
}
2023-11-10 10:39:41 +08:00
})
return result.Err
}
2023-11-23 16:30:39 +08:00
// /////////////////////////////////////////////////////////////////////////////////////////
2023-11-24 15:20:04 +08:00
2023-11-10 10:39:41 +08:00
type TrainPositionInfo struct {
//列车id
TrainId string
//列车头当前运行方向true偏移量增大/false减小方向
Up bool
//列车长度 mm
Len uint32
//列车所在轨道link
2023-11-10 10:50:09 +08:00
HeadLink string
2023-11-10 10:39:41 +08:00
//列车所在link偏移量mm
HeadLinkOffset uint32
//列车所在轨道link
2023-11-10 10:50:09 +08:00
TailLink string
2023-11-10 10:39:41 +08:00
//列车所在link偏移量mm
TailLinkOffset uint32
}
2023-12-05 09:37:32 +08:00
// TrainHeadPositionInfo 列车车头运行位置信息
type TrainHeadPositionInfo struct {
//列车id
TrainId string
//列车头当前运行方向true偏移量增大/false减小方向
Up bool
//列车所在轨道link
Link string
//列车所在link偏移量mm
LinkOffset int64
//列车运行速度m/s
Speed float32
//加速度(m/s^2)
Acceleration float32
}
func (t *TrainHeadPositionInfo) String() string {
return fmt.Sprintf("TrainHeadPositionInfo :: TrainId=%s Up=%t Link=%s LinkOffset=%d Speed=%f Ac=%f",
t.TrainId, t.Up, t.Link, t.LinkOffset, t.Speed, t.Acceleration)
}