diff --git a/ats/verify/simulation/wayside/memory/wayside_memory_map.go b/ats/verify/simulation/wayside/memory/wayside_memory_map.go index 05e30b0..2ead4a0 100644 --- a/ats/verify/simulation/wayside/memory/wayside_memory_map.go +++ b/ats/verify/simulation/wayside/memory/wayside_memory_map.go @@ -131,10 +131,10 @@ func sectionMapToEcsLink(repo *repository.Repository, id string, status *state.T if section == nil { panic(sys_error.New(fmt.Sprintf("地图不存在uid:%s缓存", id))) } - link := section.ALinkPosition().Link() - // 检查link偏移 - status.HeadOffset = checkOffsetInLink(status.HeadOffset, status.TrainLength, link) ao, bo := section.ALinkPosition().Offset(), section.BLinkPosition().Offset() + // 检查区段长度是否足够放下列车 + status.HeadOffset = checkDeviceContainTrain(status.HeadOffset, status.TrainLength, bo-ao) + link := section.ALinkPosition().Link() // 是否从A到B,统一坐标 ak, bk := convertRepoBaseKm(repo, section.AKilometer()), convertRepoBaseKm(repo, section.BKilometer()) akv, bkv := ak.Value, bk.Value @@ -186,16 +186,16 @@ func turnoutMapToEcsLink(repo *repository.Repository, id string, status *state.T default: panic(sys_error.New(fmt.Sprintf("无效端口【%s】偏移量", port))) } - // 关联link - link := portPosition.Link() - // 检查link偏移 - status.HeadOffset = checkOffsetInLink(status.HeadOffset, status.TrainLength, link) // 岔心公里标 crossKm = turnout.GetTurnoutKm(proto2.Port_None) portKm, err := repo.ConvertKilometer(portKm, crossKm.CoordinateSystem) if err != nil { panic(sys_error.New("公里标转换出错", err)) } + // 检查link偏移 + status.HeadOffset = checkDeviceContainTrain(status.HeadOffset, status.TrainLength, crossKm.Value-portKm.Value) + // 关联link + link := portPosition.Link() isStart := link.ARelation().Device().Id() == id up := runDirection if (portKm.Value > crossKm.Value) != isStart { @@ -366,16 +366,17 @@ func convertRepoBaseKm(r *repository.Repository, km *proto2.Kilometer) *proto2.K return k } -// 检查偏移是否在link上,返回最终的offset -func checkOffsetInLink(offset, trainLen int64, link *repository.Link) int64 { - if offset > link.Length() { - panic(sys_error.New(fmt.Sprintf("偏移【%d】超出link范围【%d】", offset, link.Length()))) +// 检查列车是否可以放到设备上 +func checkDeviceContainTrain(offset, trainLen, deviceLen int64) int64 { + l := int64(math.Abs(float64(deviceLen))) + if offset > l { + panic(sys_error.New(fmt.Sprintf("偏移【%d】超出设备范围【%d】", offset, l))) } if trainLen > offset { // 如果列车长度超过设置offset offset = trainLen } - if offset > link.Length() { - panic(sys_error.New(fmt.Sprintf("列车长度【%d】超出link范围【%d】", trainLen, link.Length()))) + if offset > l { + panic(sys_error.New(fmt.Sprintf("列车长度【%d】超出设备范围【%d】", trainLen, l))) } return offset }