继电器

This commit is contained in:
xzb 2023-08-29 16:22:39 +08:00
parent 5af2b04ef6
commit 38769c954c
6 changed files with 51 additions and 13 deletions

View File

@ -55,3 +55,9 @@ var RelayStateComponent = ecs.NewComponentType[cstate.RelayState]()
// 紧急停车按钮状态组件 // 紧急停车按钮状态组件
var EmpStateComponent = ecs.NewComponentType[cstate.EmpState]() var EmpStateComponent = ecs.NewComponentType[cstate.EmpState]()
// 生成标签组件
// 用于标记实体便于查找
func NewComponentTag() *ecs.ComponentType[struct{}] {
return ecs.NewComponentType[struct{}]()
}

View File

@ -84,8 +84,6 @@ func foreachModels(modelManager umi.IModelManager, deviceType umi.DeviceType, ea
} }
// ////////////////////////////////////////////////////////////////////// // //////////////////////////////////////////////////////////////////////
// 设备继电器标签,即标记继电器属于哪个设备的
type DeviceRelayTag struct{}
// 创建模型仓库引用实体 // 创建模型仓库引用实体
func CreateModelStorageRefEntity(w ecs.World) *ecs.Entry { func CreateModelStorageRefEntity(w ecs.World) *ecs.Entry {
@ -100,14 +98,14 @@ func CreateWorldTimeEntity(w ecs.World) *ecs.Entry {
// 创建道岔实体 // 创建道岔实体
func CreateSwitchEntity(w ecs.World) *ecs.Entry { func CreateSwitchEntity(w ecs.World) *ecs.Entry {
e := w.Create(components.DeviceIdentityComponent, components.SwitchRelayStateComponent, components.PercentageDeviceStateComponent, components.MovableDeviceStateComponent, components.RelayTagHandlerComponent) e := w.Create(components.DeviceIdentityComponent, components.SwitchRelayStateComponent, components.PercentageDeviceStateComponent, components.MovableDeviceStateComponent, components.RelayTagHandlerComponent)
components.RelayTagHandlerComponent.Set(e, &cstate.EntityTagHandler{Tag: ecs.NewComponentType[DeviceRelayTag]()}) components.RelayTagHandlerComponent.Set(e, &cstate.EntityTagHandler{Tag: components.NewComponentTag()})
return e return e
} }
// 创建信号机实体 // 创建信号机实体
func CreateSignalEntity(w ecs.World) *ecs.Entry { func CreateSignalEntity(w ecs.World) *ecs.Entry {
e := w.Create(components.DeviceIdentityComponent, components.SignalStateComponent, components.RelayTagHandlerComponent) e := w.Create(components.DeviceIdentityComponent, components.SignalStateComponent, components.RelayTagHandlerComponent)
components.RelayTagHandlerComponent.Set(e, &cstate.EntityTagHandler{Tag: ecs.NewComponentType[DeviceRelayTag]()}) components.RelayTagHandlerComponent.Set(e, &cstate.EntityTagHandler{Tag: components.NewComponentTag()})
return e return e
} }
@ -116,14 +114,11 @@ func CreatePhysicalSectionEntity(w ecs.World) *ecs.Entry {
return w.Create(components.DeviceIdentityComponent, components.PhysicalSectionStateComponent) return w.Create(components.DeviceIdentityComponent, components.PhysicalSectionStateComponent)
} }
// 屏蔽门与其cell关系tag定义
type PsdCellTag struct{}
// 创建站台单侧屏蔽门实体 // 创建站台单侧屏蔽门实体
func CreatePsdEntity(w ecs.World) *ecs.Entry { func CreatePsdEntity(w ecs.World) *ecs.Entry {
e := w.Create(components.DeviceIdentityComponent, components.PsdStateComponent, components.PsdTagHandlerComponent, components.RelayTagHandlerComponent) e := w.Create(components.DeviceIdentityComponent, components.PsdStateComponent, components.PsdTagHandlerComponent, components.RelayTagHandlerComponent)
components.PsdTagHandlerComponent.Set(e, &cstate.EntityTagHandler{Tag: ecs.NewComponentType[PsdCellTag]()}) components.PsdTagHandlerComponent.Set(e, &cstate.EntityTagHandler{Tag: components.NewComponentTag()})
components.RelayTagHandlerComponent.Set(e, &cstate.EntityTagHandler{Tag: ecs.NewComponentType[DeviceRelayTag]()}) components.RelayTagHandlerComponent.Set(e, &cstate.EntityTagHandler{Tag: components.NewComponentTag()})
return e return e
} }
@ -156,6 +151,6 @@ func CreateRelayEntity(w ecs.World, deviceEntry *ecs.Entry) *ecs.Entry {
// 创建紧急停车按钮实体 // 创建紧急停车按钮实体
func CreateEmpEntity(w ecs.World) *ecs.Entry { func CreateEmpEntity(w ecs.World) *ecs.Entry {
e := w.Create(components.DeviceIdentityComponent, components.EmpStateComponent, components.RelayTagHandlerComponent) e := w.Create(components.DeviceIdentityComponent, components.EmpStateComponent, components.RelayTagHandlerComponent)
components.RelayTagHandlerComponent.Set(e, &cstate.EntityTagHandler{Tag: ecs.NewComponentType[DeviceRelayTag]()}) components.RelayTagHandlerComponent.Set(e, &cstate.EntityTagHandler{Tag: components.NewComponentTag()})
return e return e
} }

View File

@ -0,0 +1,37 @@
package system
import (
"github.com/yohamta/donburi/filter"
"joylink.club/ecs"
"joylink.club/rtsssimulation/components"
"joylink.club/rtsssimulation/umi"
)
// 紧急停车按钮继电器系统
type EmpRelaySystem struct {
relaySystem
// 紧急停车按钮查询
query *ecs.Query
}
func NewEmpRelaySystem() *EmpRelaySystem {
return &EmpRelaySystem{
relaySystem: relaySystem{relayQuery: make(map[string]*ecs.Query)},
query: ecs.NewQuery(filter.Contains(components.EmpStateComponent)),
}
}
// world 执行
func (me *EmpRelaySystem) Update(world ecs.World) {
me.query.Each(world, func(empEntry *ecs.Entry) {
//key-继电器作用名value-继电器实体
usageRelayMapper := make(map[string]*ecs.Entry)
//迭代关联的所有继电器
me.getDeviceRelayQuery(empEntry).Each(world, func(empRelayEntry *ecs.Entry) {
relayId := components.DeviceIdentityComponent.Get(empRelayEntry).Id
relayModel := (WorldModelStorage(world).FindById(relayId)).(umi.IRelayModel)
usageRelayMapper[relayModel.UsageName()] = empRelayEntry
})
//根据具体业务逻辑处理继电器
})
}

View File

@ -7,7 +7,7 @@ import (
"joylink.club/rtsssimulation/components/cstate" "joylink.club/rtsssimulation/components/cstate"
) )
var PsdQuery = ecs.NewQuery(filter.Contains(components.DeviceIdentityComponent, components.PsdStateComponent, components.PsdTagHandlerComponent)) var PsdQuery = ecs.NewQuery(filter.Contains(components.PsdStateComponent, components.PsdTagHandlerComponent))
const ( const (
//屏蔽门完全关闭 //屏蔽门完全关闭

View File

@ -18,7 +18,7 @@ type SignalRelaySystem struct {
func NewSignalReplaySystem() *SignalRelaySystem { func NewSignalReplaySystem() *SignalRelaySystem {
return &SignalRelaySystem{ return &SignalRelaySystem{
relaySystem: relaySystem{relayQuery: make(map[string]*ecs.Query)}, relaySystem: relaySystem{relayQuery: make(map[string]*ecs.Query)},
query: ecs.NewQuery(filter.Contains(components.DeviceIdentityComponent, components.SignalStateComponent)), query: ecs.NewQuery(filter.Contains(components.SignalStateComponent)),
} }
} }

View File

@ -7,7 +7,7 @@ import (
"joylink.club/rtsssimulation/umi" "joylink.club/rtsssimulation/umi"
) )
var SwitchQuery *ecs.Query = ecs.NewQuery(filter.Contains(components.DeviceIdentityComponent, components.SwitchRelayStateComponent, components.PercentageDeviceStateComponent)) var SwitchQuery *ecs.Query = ecs.NewQuery(filter.Contains(components.SwitchRelayStateComponent, components.PercentageDeviceStateComponent))
const ( const (
//道岔定位 //道岔定位