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 []Identity ////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() []Identity { 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 ...Identity) { 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 }