158 lines
4.1 KiB
Go
158 lines
4.1 KiB
Go
package system
|
||
|
||
import (
|
||
"github.com/yohamta/donburi/filter"
|
||
"joylink.club/ecs"
|
||
sysEvent "joylink.club/rtsssimulation/system/event"
|
||
)
|
||
|
||
// 电路状态:信号机3XH-1(红-绿-黄) 道岔防护信号机(三显示不封灯,有单黄显示、带引导)
|
||
type Signal3XH1State struct {
|
||
// 物理黄灯,true-亮
|
||
U bool
|
||
// 物理绿灯,true-亮
|
||
L bool
|
||
// 物理红灯,true-亮
|
||
H bool
|
||
// 点灯继电器,true-吸合,常态落下表示逻辑点灯
|
||
DDJ bool
|
||
//2DJ灯丝继电器,true-吸合
|
||
EDJ bool
|
||
//灯丝继电器,true-吸合
|
||
DJ bool
|
||
//列车信号继电器,true-吸合
|
||
LXJ bool
|
||
//引导信号继电器,true-吸合
|
||
YXJ bool
|
||
//开通正线信号继电器,true-吸合
|
||
ZXJ bool
|
||
}
|
||
|
||
func NewSignal3XH1State() *Signal3XH1State {
|
||
return &Signal3XH1State{
|
||
U: false,
|
||
L: false,
|
||
H: false,
|
||
DDJ: true,
|
||
EDJ: false,
|
||
DJ: false,
|
||
LXJ: false,
|
||
YXJ: false,
|
||
ZXJ: false,
|
||
}
|
||
}
|
||
|
||
// 信号机3XH-1电路状态组件
|
||
var Signal3XH1StateComponent = ecs.NewComponentType[Signal3XH1State]()
|
||
|
||
type Signal3XH1System struct {
|
||
stateQuery *ecs.Query
|
||
}
|
||
|
||
func NewSignal3XH1System() *Signal3XH1System {
|
||
return &Signal3XH1System{
|
||
stateQuery: ecs.NewQuery(filter.Contains(Signal3XH1StateComponent)),
|
||
}
|
||
}
|
||
|
||
// 处理继电器发送来的事件
|
||
func (me *Signal3XH1System) AddEventListeners(w ecs.World) {
|
||
//注册继电器状态事件处理器
|
||
sysEvent.RelayStateChangedEventBus.Subscribe(w, func(w ecs.World, event sysEvent.RelayStateChangedEvent) {
|
||
|
||
})
|
||
}
|
||
|
||
// world 执行
|
||
func (me *Signal3XH1System) Update(w ecs.World) {
|
||
me.stateQuery.Each(w, func(e *ecs.Entry) {
|
||
signal3XH1State := Signal3XH1StateComponent.Get(e)
|
||
//
|
||
_U := signal3XH1State.U
|
||
_L := signal3XH1State.L
|
||
_H := signal3XH1State.H
|
||
//
|
||
me.calculateU(w, signal3XH1State)
|
||
me.calculateL(w, signal3XH1State)
|
||
me.calculateH(w, signal3XH1State)
|
||
me.calculateDJ(w, e, signal3XH1State)
|
||
me.calculate2DJ(w, e, signal3XH1State)
|
||
//状态改变发送事件
|
||
if _U != signal3XH1State.U || _H != signal3XH1State.H || _L != signal3XH1State.L {
|
||
sysEvent.Signal3XH1AspectChangedEventBus.Publish(w, createSignal3XH1AspectChangedEvent(w, e, signal3XH1State))
|
||
}
|
||
})
|
||
}
|
||
|
||
// 黄灯点灯电路
|
||
// 开放引导信号,黄灯亮且红灯亮
|
||
// 开放列车信号且开通侧向,只黄灯亮
|
||
func (me *Signal3XH1System) calculateU(w ecs.World, state *Signal3XH1State) {
|
||
//引导信号
|
||
isY := !state.DDJ && !state.LXJ && state.DJ && state.YXJ
|
||
//侧向行车信号
|
||
isLC := !state.DDJ && state.LXJ && !state.ZXJ
|
||
state.U = isY || isLC
|
||
}
|
||
|
||
// 绿灯点灯电路
|
||
// 开放正线行车信号,只亮绿灯
|
||
func (me *Signal3XH1System) calculateL(w ecs.World, state *Signal3XH1State) {
|
||
isL := !state.DDJ && state.LXJ && state.ZXJ
|
||
state.L = isL
|
||
}
|
||
|
||
// 红灯点灯电路
|
||
// 列车信号禁止时,亮红灯
|
||
func (me *Signal3XH1System) calculateH(w ecs.World, state *Signal3XH1State) {
|
||
isH := !state.DDJ && !state.LXJ
|
||
state.H = isH
|
||
}
|
||
|
||
// DJ 灯丝继电器电路
|
||
func (me *Signal3XH1System) calculateDJ(w ecs.World, e *ecs.Entry, state *Signal3XH1State) {
|
||
_DJ := state.DJ
|
||
//
|
||
isDj := !state.DDJ
|
||
state.DJ = isDj
|
||
//状态改变发送事件
|
||
if _DJ != state.DJ {
|
||
sysEvent.RelayStateChangedEventBus.Publish(w, createSignal3XH1DJChangedEvent(w, e, state))
|
||
}
|
||
}
|
||
|
||
// 2DJ 灯丝继电器电路
|
||
func (me *Signal3XH1System) calculate2DJ(w ecs.World, e *ecs.Entry, state *Signal3XH1State) {
|
||
_2DJ := state.EDJ
|
||
//
|
||
state.EDJ = state.U
|
||
//状态改变发送事件
|
||
if _2DJ != state.EDJ {
|
||
sysEvent.RelayStateChangedEventBus.Publish(w, createSignal3XH12DJChangedEvent(w, e, state))
|
||
}
|
||
}
|
||
|
||
func createSignal3XH1DJChangedEvent(w ecs.World, e *ecs.Entry, state *Signal3XH1State) *sysEvent.RelayStateChangedEvent {
|
||
|
||
return &sysEvent.RelayStateChangedEvent{
|
||
Id: "123",
|
||
Closed: state.DJ,
|
||
}
|
||
}
|
||
func createSignal3XH12DJChangedEvent(w ecs.World, e *ecs.Entry, state *Signal3XH1State) *sysEvent.RelayStateChangedEvent {
|
||
|
||
return &sysEvent.RelayStateChangedEvent{
|
||
Id: "123",
|
||
Closed: state.EDJ,
|
||
}
|
||
}
|
||
func createSignal3XH1AspectChangedEvent(w ecs.World, e *ecs.Entry, state *Signal3XH1State) *sysEvent.Signal3XH1AspectChangedEvent {
|
||
|
||
return &sysEvent.Signal3XH1AspectChangedEvent{
|
||
Id: "123",
|
||
U: state.U,
|
||
L: state.L,
|
||
H: state.H,
|
||
}
|
||
}
|