rts-sim-module/repository/link.go

197 lines
3.7 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 repository
import (
"fmt"
"joylink.club/rtsssimulation/repository/model/proto"
)
type Link struct {
Identity
length int64
aRelation *TurnoutPort
bRelation *TurnoutPort
//组成Link的非道岔物理区段按在link上偏移量从小到大排列
physicalSections []*PhysicalSection
aKm *proto.Kilometer
bKm *proto.Kilometer
//按偏移量小到大排序的、此Link上的模型非区段边界检测点、应答器、信号机
devices []LinkPositionDevice
////Link关联的模型包含LinkNode
//devicePositions []*DeviceLinkPosition
}
var _ Identity = &Link{}
func NewLink(id string) *Link {
return &Link{
Identity: identity{id, proto.DeviceType_DeviceType_Link},
}
}
// GetAllPhysicalSection 获取与该link关联的所有物理区段(包括岔区非岔区)
func (l *Link) GetAllPhysicalSection() []*PhysicalSection {
var rt []*PhysicalSection
if l.physicalSections != nil {
rt = append(rt, l.physicalSections...)
}
if l.aRelation != nil {
rt = append(rt, l.aRelation.turnout.section)
}
if l.bRelation != nil {
rt = append(rt, l.bRelation.turnout.section)
}
return rt
}
func (l *Link) Length() int64 {
return l.length
}
func (l *Link) ARelation() *TurnoutPort {
return l.aRelation
}
func (l *Link) BRelation() *TurnoutPort {
return l.bRelation
}
func (l *Link) Devices() []LinkPositionDevice {
return l.devices
}
func (l *Link) PortNum() int {
return 2
}
func (l *Link) PhysicalSections() []*PhysicalSection {
return l.physicalSections
}
func (l *Link) AKm() *proto.Kilometer {
return l.aKm
}
func (l *Link) BKm() *proto.Kilometer {
return l.bKm
}
func (l *Link) bindTurnoutPort(port proto.Port, turnoutPort *TurnoutPort) {
switch port {
case proto.Port_A:
l.aRelation = turnoutPort
case proto.Port_B:
l.bRelation = turnoutPort
}
l.bindKm(turnoutPort.turnout.km, port)
}
func (l *Link) bindPhysicalSections(section *PhysicalSection) {
l.physicalSections = append(l.physicalSections, section)
}
func (l *Link) bindKm(km *proto.Kilometer, port proto.Port) {
switch port {
case proto.Port_A:
l.aKm = km
case proto.Port_B:
l.bKm = km
}
}
func (l *Link) bindDevices(devices ...LinkPositionDevice) {
for _, device := range devices {
l.devices = append(l.devices, device)
}
}
func (l *Link) findEndKm() *proto.Kilometer {
if l.aRelation == nil {
return l.aKm
} else if l.bRelation == nil {
return l.bKm
}
return nil
}
// 查找Link轨道尽头端的偏移量
// 如果该link未连接轨道尽头返回false
func (l *Link) findEndOffset() (int64, bool) {
if l.aRelation == nil {
return 0, true
}
if l.bRelation == nil {
return l.length, true
}
return 0, false
}
// LinkPosition link位置
type LinkPosition struct {
link *Link
offset int64
}
func NewLinkPosition(link *Link, offset int64) *LinkPosition {
return &LinkPosition{link: link, offset: offset}
}
func (l LinkPosition) Link() *Link {
return l.link
}
func (l LinkPosition) Offset() int64 {
return l.offset
}
func (l LinkPosition) String() string {
return fmt.Sprintf("[LinkPosition:{%s-%d]", l.link.Id(), l.offset)
}
// link端口
type LinkPort struct {
link *Link
port proto.Port
}
func NewLinkPort(link *Link, port proto.Port) LinkPort {
return LinkPort{
link: link,
port: port,
}
}
func (l *LinkPort) Port() proto.Port {
return l.port
}
func (l *LinkPort) Device() PortedDevice {
return l.link
}
func (l *LinkPort) IsPortA() bool {
return l.port == proto.Port_A
}
func (l *LinkPort) Link() *Link {
return l.link
}
type LinkRange struct {
link *Link
start int64
end int64
}
func (l *LinkRange) Link() *Link {
return l.link
}
func (l *LinkRange) Start() int64 {
return l.start
}
func (l *LinkRange) End() int64 {
return l.end
}