120 lines
3.6 KiB
Go
120 lines
3.6 KiB
Go
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 {
|
||
entity.NewTrainWithBtmEntity(w, trainId)
|
||
}
|
||
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
|
||
}
|
||
|
||
// UpdateTrainPositionFromDynamics 更新列车所在的物理区段
|
||
func UpdateTrainPositionFromDynamics(w ecs.World, tpi TrainPositionInfo) error {
|
||
result := <-ecs.Request[ecs.EmptyType](w, func() ecs.Result[ecs.EmptyType] {
|
||
wd := entity.GetWorldData(w)
|
||
te, find := wd.EntityMap[tpi.TrainId]
|
||
if find {
|
||
train := component.TrainPositionInfoType.Get(te)
|
||
train.Up = tpi.Up
|
||
train.Len = int64(tpi.Len)
|
||
train.HeadLink = tpi.HeadLink
|
||
train.HeadLinkOffset = int64(tpi.HeadLinkOffset)
|
||
train.TailLink = tpi.TailLink
|
||
train.TailLinkOffset = int64(tpi.TailLinkOffset)
|
||
return ecs.NewOkEmptyResult()
|
||
} else {
|
||
return ecs.NewErrResult(fmt.Errorf("列车[%s]实体不存在", tpi.TrainId))
|
||
}
|
||
|
||
})
|
||
return result.Err
|
||
}
|
||
|
||
// TrainBalisePowerAmplifierSwitch 车载应答器天线功率放大器开关控制
|
||
func TrainBalisePowerAmplifierSwitch(w ecs.World, trainId string, turnOn bool) error {
|
||
result := <-ecs.Request[ecs.EmptyType](w, func() ecs.Result[ecs.EmptyType] {
|
||
wd := entity.GetWorldData(w)
|
||
te, find := wd.EntityMap[trainId]
|
||
if find {
|
||
train := component.TrainBtmType.Get(te)
|
||
train.PowerAmplifierSwitch = turnOn
|
||
return ecs.NewOkEmptyResult()
|
||
} else {
|
||
return ecs.NewErrResult(fmt.Errorf("列车[%s]实体不存在", trainId))
|
||
}
|
||
})
|
||
return result.Err
|
||
}
|
||
|
||
// FindTrainBaliseBtmStatus 获取车载BTM的相关状态信息
|
||
func FindTrainBaliseBtmStatus(w ecs.World, trainId string) ecs.Result[*TrainBaliseBtmStatus] {
|
||
result := <-ecs.Request[*TrainBaliseBtmStatus](w, func() ecs.Result[*TrainBaliseBtmStatus] {
|
||
wd := entity.GetWorldData(w)
|
||
te, find := wd.EntityMap[trainId]
|
||
if find {
|
||
btm := component.TrainBtmType.Get(te)
|
||
btmStatus := &TrainBaliseBtmStatus{
|
||
PowerAmplifierOn: btm.PowerAmplifierSwitch,
|
||
PowerAmplifierFault: false,
|
||
AboveBalise: btm.AboveBalise,
|
||
AntennaFault: false,
|
||
}
|
||
return ecs.NewOkResult(btmStatus)
|
||
} else {
|
||
return ecs.NewResult[*TrainBaliseBtmStatus](nil, fmt.Errorf("列车[%s]实体不存在", trainId))
|
||
}
|
||
})
|
||
return result
|
||
}
|
||
|
||
// /////////////////////////////////////////////////////////////////////////////////////////
|
||
type TrainBaliseBtmStatus struct {
|
||
PowerAmplifierOn bool //BTM功率放大器是否开启
|
||
PowerAmplifierFault bool //BTM功率放大器是否有故障
|
||
AntennaFault bool //BTM应答器天线是否有故障
|
||
AboveBalise bool //BTM当前是否在应答器上方
|
||
}
|
||
|
||
type TrainPositionInfo struct {
|
||
//列车id
|
||
TrainId string
|
||
//列车头当前运行方向(true偏移量增大/false减小方向)
|
||
Up bool
|
||
//列车长度 mm
|
||
Len uint32
|
||
//列车所在轨道link
|
||
HeadLink string
|
||
//列车所在link偏移量(mm)
|
||
HeadLinkOffset uint32
|
||
//列车所在轨道link
|
||
TailLink string
|
||
//列车所在link偏移量(mm)
|
||
TailLinkOffset uint32
|
||
}
|