197 lines
3.6 KiB
Go
197 lines
3.6 KiB
Go
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
|
||
}
|