【动力学link转换】

This commit is contained in:
weizhihong 2023-09-27 16:49:10 +08:00
parent 9799ed41d1
commit 88c54e23b8
4 changed files with 110 additions and 34 deletions

View File

@ -166,7 +166,7 @@ func convert(info *dynamics.TrainInfo, sta *state.TrainState, simulation *memory
zap.S().Debugf("原始消息:[%d-%d-%d]", info.Number, info.Link, info.LinkOffset) zap.S().Debugf("原始消息:[%d-%d-%d]", info.Number, info.Link, info.LinkOffset)
id, port, offset, runDirection, pointTo, kilometer := memory.QueryDeviceByCalcLink(simulation.Repo, strconv.Itoa(int(info.Link)), int64(info.LinkOffset), info.Up) id, port, offset, runDirection, pointTo, kilometer := memory.QueryDeviceByCalcLink(simulation.Repo, strconv.Itoa(int(info.Link)), int64(info.LinkOffset), info.Up)
zap.S().Debugf("转换后的消息:[%d-车头:%s-偏移:%d-上行:%v-是否ab:%v]", info.Number, id, offset, runDirection, pointTo) zap.S().Debugf("转换后的消息:[%d-车头:%s-偏移:%d-上行:%v-是否ab:%v]", info.Number, id, offset, runDirection, pointTo)
sta.HeadDeviceId = id sta.HeadDeviceId = strconv.Itoa(int(simulation.GetComIdByIndex(id)))
sta.DevicePort = port sta.DevicePort = port
sta.HeadOffset = offset sta.HeadOffset = offset
sta.PointTo = pointTo sta.PointTo = pointTo

View File

@ -181,35 +181,59 @@ func QueryDeviceByCalcLink(repo *repository.Repository, id string, offset int64,
if offset > link.Length() { if offset > link.Length() {
panic(dto.ErrorDto{Code: dto.DataNotExist, Message: fmt.Sprintf("偏移【%d】超出link范围【%d】", offset, link.Length())}) panic(dto.ErrorDto{Code: dto.DataNotExist, Message: fmt.Sprintf("偏移【%d】超出link范围【%d】", offset, link.Length())})
} }
// 判断是否在道岔上
onTurnout, isA := isOnLinkTurnout(link, offset)
if onTurnout {
return ecsLinkMapToTurnout(isA, offset, up, link)
} else {
return ecsLinkMapToSection(offset, up, link)
}
}
// 是否在link的道岔上
func isOnLinkTurnout(link *repository.Link, offset int64) (bool, bool) {
aTp := link.ARelation() aTp := link.ARelation()
var turnoutOffset int64
if aTp != nil {
turnoutOffset = aTp.Turnout().FindLinkPositionByPort(aTp.Port()).Offset()
}
if offset <= turnoutOffset {
return true, true
}
bTp := link.BRelation() bTp := link.BRelation()
aOffset := aTp.Turnout().FindLinkPositionByPort(aTp.Port()).Offset() if bTp != nil {
bOffset := bTp.Turnout().FindLinkPositionByPort(bTp.Port()).Offset() turnoutOffset = bTp.Turnout().FindLinkPositionByPort(bTp.Port()).Offset()
if offset <= aOffset { return offset >= turnoutOffset, false
deviceId = aTp.Turnout().Id() }
deviceOffset = aOffset - (aOffset - offset) return false, false
if up { }
pointTo = false
// 处理在道岔上link映射
func ecsLinkMapToTurnout(isA bool, offset int64, up bool, link *repository.Link) (
deviceId, port string, deviceOffset int64, runDirection, pointTo bool, km int64) {
tp := link.ARelation()
if !isA {
tp = link.BRelation()
}
deviceId = tp.Turnout().Id()
tpOffset := tp.Turnout().FindLinkPositionByPort(tp.Port()).Offset()
crossKm, portKm := tp.Turnout().GetTurnoutKm(proto2.Port_None).Value, tp.Turnout().GetTurnoutKm(tp.Port()).Value
if isA {
deviceOffset = tpOffset - (tpOffset - offset)
pointTo = !up
} else { } else {
pointTo = true
}
switch aTp.Port() {
case proto2.Port_A:
port = "A"
case proto2.Port_B:
port = "B"
case proto2.Port_C:
port = "C"
}
} else if offset >= bOffset {
deviceId = bTp.Turnout().Id()
deviceOffset = link.Length() - offset deviceOffset = link.Length() - offset
if up { pointTo = up
pointTo = true
} else {
pointTo = false
} }
switch bTp.Port() { // 查询公里标大于端口公里标
if crossKm > portKm {
km = crossKm - deviceOffset
runDirection = pointTo
} else {
km = crossKm + deviceOffset
runDirection = !pointTo
}
switch tp.Port() {
case proto2.Port_A: case proto2.Port_A:
port = "A" port = "A"
case proto2.Port_B: case proto2.Port_B:
@ -217,6 +241,46 @@ func QueryDeviceByCalcLink(repo *repository.Repository, id string, offset int64,
case proto2.Port_C: case proto2.Port_C:
port = "C" port = "C"
} }
return
}
// 处理在道岔上link映射
func ecsLinkMapToSection(offset int64, up bool, link *repository.Link) (
deviceId, port string, deviceOffset int64, runDirection, pointTo bool, km int64) {
var section *repository.PhysicalSection
for _, s := range link.PhysicalSections() {
ao, bo := s.ALinkPosition().Offset(), s.BLinkPosition().Offset()
if (ao <= offset && offset <= bo) || (bo <= offset && offset <= ao) {
section = s
break
}
}
if section == nil {
panic(dto.ErrorDto{Code: dto.DataNotExist, Message: fmt.Sprintf("未找到link设备偏移【%d】", offset)})
}
// 元素ID
deviceId = section.Id()
// link偏移变大方向
ao, bo := section.ALinkPosition().Offset(), section.BLinkPosition().Offset()
ak, bk := section.AKilometer().Value, section.BKilometer().Value
if up {
pointTo = ao < bo
runDirection = ((ak < bk) == (ao < bo))
} else {
pointTo = bo > ao
runDirection = ((ak > bk) == (ao > bo))
}
// a点偏移 大于 b点偏移
if ao > bo {
deviceOffset = ao - offset
} else {
deviceOffset = offset - ao
}
// a点公里标 大于 b点公里标
if ak > bk {
km = ak - deviceOffset
} else {
km = ak + deviceOffset
} }
return return
} }

View File

@ -158,6 +158,18 @@ func (s *VerifySimulation) GetComIdByUid(uid string) string {
return es[uid].CommonId return es[uid].CommonId
} }
// 获取仿真世界信息
func (s *VerifySimulation) GetComIdByIndex(uid string) int32 {
es := s.uidMap
if es == nil {
panic(&dto.ErrorDto{Code: dto.DataNotExist, Message: "无映射信息"})
}
if es[uid] == nil {
panic(&dto.ErrorDto{Code: dto.DataNotExist, Message: "无【uid】映射信息"})
}
return es[uid].Index
}
func buildProtoRepository(mapIds []int32) (*proto.Repository, error) { func buildProtoRepository(mapIds []int32) (*proto.Repository, error) {
repo := &proto.Repository{} repo := &proto.Repository{}
var exceptStationGiMapIds []int32 var exceptStationGiMapIds []int32

@ -1 +1 @@
Subproject commit 5833de36fbb1e153672aa1ddf049f7006eefca60 Subproject commit be88137f2ab670707c7bd80f708ad1379c62f141