package system import ( "fmt" "github.com/yohamta/donburi/filter" "joylink.club/ecs" sysEvent "joylink.club/rtsssimulation/system/event" "joylink.club/rtsssimulation/umi" ) // 信号机电路继电器组合类型和功能名称常量 // 其他信号机的一并定义于此 const ( //继电器组合类型 SIGNAL_3XH1 = "3XH-1" SIGNAL_3XH2 = "3XH-2" SIGNAL_3XH3 = "3XH-3" SIGNAL_3XH4 = "3XH-4" SIGNAL_2XH1 = "2XH-1" SIGNAL_JDXH = "JDXH" SIGNAL_DCXH = "DCXH" SIGNAL_JCKXH = "JCKXH" //继电器功能名称 SIGNAL_DDJ = "DDJ" SIGNAL_DJ = "DJ" SIGNAL_2DJ = "2DJ" SIGNAL_LXJ = "LXJ" SIGNAL_YXJ = "YXJ" SIGNAL_ZXJ = "ZXJ" ) // Signal3XH1State 电路状态:信号机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 } // Signal3XH1FilamentState 信号机3XH-1 灯丝状态 type Signal3XH1FilamentState struct { // 物理黄灯,true-灯丝正常 Uf bool // 物理绿灯,true-灯丝正常 Lf bool // 物理红灯,true-灯丝正常 Hf bool } func NewSignal3XH1FilamentState() *Signal3XH1FilamentState { return &Signal3XH1FilamentState{Uf: true, Lf: true, Hf: true} } func NewSignal3XH1State() *Signal3XH1State { return &Signal3XH1State{ U: false, L: false, H: false, DDJ: true, EDJ: false, DJ: false, LXJ: false, YXJ: false, ZXJ: false, } } // Signal3XH1StateComponent 信号机3XH-1电路状态组件 var Signal3XH1StateComponent = ecs.NewComponentType[Signal3XH1State]() var Signal3XH1FilamentStateComponent = ecs.NewComponentType[Signal3XH1FilamentState]() var signal3XH1Query = ecs.NewQuery(filter.Contains(EntityIdentityComponent, Signal3XH1StateComponent)) type Signal3XH1System struct { } func NewSignal3XH1System() *Signal3XH1System { return &Signal3XH1System{} } // Signal3XH1RelayActionEventProcessor 继电器动作事件处理 // 将继电器动作的结果同步到系统 var Signal3XH1RelayActionEventProcessor = func(w ecs.World, event sysEvent.RelayActionEvent) { //根据event来更新Signal3XH1State中对应继电器的状态 signal3XH1Query.Each(w, func(e *ecs.Entry) { signalModel := FindModelStorage(w).FindById(EntityIdentityComponent.Get(e).Id) roler, ok := signalModel.(umi.IRelayCRole) if ok { if relayGroup, relayName, find := roler.FindCircuitRoleById(event.Id); find { if relayGroup == SIGNAL_3XH1 { state := Signal3XH1StateComponent.Get(e) switch relayName { case SIGNAL_DDJ: state.DDJ = event.Xh case SIGNAL_DJ: state.DJ = event.Xh case SIGNAL_2DJ: state.EDJ = event.Xh case SIGNAL_LXJ: state.LXJ = event.Xh case SIGNAL_YXJ: state.YXJ = event.Xh case SIGNAL_ZXJ: state.ZXJ = event.Xh default: panic(fmt.Sprintf("Signal3XH1的模型[%s]中继电器功能名称[%s]无法识别", signalModel.GetId(), relayName)) } } else { panic(fmt.Sprintf("Signal3XH1的模型[%s]中继电器组合类型[%s]无法识别", signalModel.GetId(), relayGroup)) } } } else { panic("Signal3XH1的模型未实现接口umi.IRelayCRoler") } }) } // Update world 执行 func (me *Signal3XH1System) Update(w ecs.World) { signal3XH1Query.Each(w, func(e *ecs.Entry) { signal3XH1State := Signal3XH1StateComponent.Get(e) filament := Signal3XH1FilamentStateComponent.Get(e) // me.calculateU(w, signal3XH1State, filament) me.calculateL(w, signal3XH1State, filament) me.calculateH(w, signal3XH1State, filament) me.calculateDJ(w, e, signal3XH1State, filament) me.calculate2DJ(w, e, signal3XH1State, filament) }) } // 黄灯点灯电路 // 开放引导信号,黄灯亮且红灯亮 // 开放列车信号且开通侧向,只黄灯亮 func (me *Signal3XH1System) calculateU(w ecs.World, state *Signal3XH1State, filament *Signal3XH1FilamentState) { //引导信号 isY := !state.DDJ && !state.LXJ && state.DJ && state.YXJ //侧向行车信号 isLC := !state.DDJ && state.LXJ && !state.ZXJ state.U = filament.Uf && (isY || isLC) } // 绿灯点灯电路 // 开放正线行车信号,只亮绿灯 func (me *Signal3XH1System) calculateL(w ecs.World, state *Signal3XH1State, filament *Signal3XH1FilamentState) { isL := !state.DDJ && state.LXJ && state.ZXJ state.L = filament.Lf && isL } // 红灯点灯电路 // 列车信号禁止时,亮红灯 func (me *Signal3XH1System) calculateH(w ecs.World, state *Signal3XH1State, filament *Signal3XH1FilamentState) { isH := !state.DDJ && !state.LXJ state.H = filament.Hf && isH } // DJ 灯丝继电器电路 func (me *Signal3XH1System) calculateDJ(w ecs.World, e *ecs.Entry, state *Signal3XH1State, filament *Signal3XH1FilamentState) { _DJ := state.DJ isDj := filament.Lf && !state.DDJ && state.LXJ && state.ZXJ || filament.Uf && !state.DDJ && state.LXJ && !state.ZXJ || filament.Hf && !state.DDJ && !state.LXJ //通知继电器进行动作 if _DJ != isDj { if event, ok := createRelayNeedChangeEvent(w, EntityIdentityComponent.Get(e).Id, SIGNAL_3XH1, SIGNAL_DJ, isDj); ok { sysEvent.RelayNeedChangeEventBus.Publish(w, event) } } } // 2DJ 灯丝继电器电路 func (me *Signal3XH1System) calculate2DJ(w ecs.World, e *ecs.Entry, state *Signal3XH1State, filament *Signal3XH1FilamentState) { _2DJ := state.EDJ // is2DJ := filament.Uf && !state.DDJ && !state.LXJ && state.DJ && state.YXJ //通知继电器进行动作 if _2DJ != is2DJ { if event, ok := createRelayNeedChangeEvent(w, EntityIdentityComponent.Get(e).Id, SIGNAL_3XH1, SIGNAL_2DJ, is2DJ); ok { sysEvent.RelayNeedChangeEventBus.Publish(w, event) } } }