diff --git a/component/signal_jdxh.go b/component/signal_jdxh.go new file mode 100644 index 0000000..1c6cdff --- /dev/null +++ b/component/signal_jdxh.go @@ -0,0 +1,36 @@ +package component + +import "joylink.club/ecs" + +// SignalJDXHElectronic 电路状态:信号机JDXH(红-绿-黄) 进段信号机(三显示不封灯、无单黄显示、带引导) +type SignalJDXHElectronic struct { + // 2DJ灯丝继电器,true-吸合 + JDXH_2DJ *ecs.Entry + //灯丝继电器,true-吸合 + JDXH_DJ *ecs.Entry + //列车信号继电器,true-吸合 + JDXH_LXJ *ecs.Entry + //引导信号继电器,true-吸合 + JDXH_YXJ *ecs.Entry +} + +// SignalJDXHFilament 信号机JDXH 灯丝状态 +type SignalJDXHFilament struct { + // 物理黄灯,true-灯丝正常 + Uf bool + // 物理绿灯,true-灯丝正常 + Lf bool + // 物理红灯,true-灯丝正常 + Hf bool + // 物理黄灯,true-亮 + U bool + // 物理绿灯,true-亮 + L bool + // 物理红灯,true-亮 + H bool +} + +var ( + SignalJDXHElectronicType = ecs.NewComponentType[SignalJDXHElectronic]() + SignalJDXHFilamentType = ecs.NewComponentType[SignalJDXHFilament]() +) diff --git a/entity/signal.go b/entity/signal.go index db1a13e..335725b 100644 --- a/entity/signal.go +++ b/entity/signal.go @@ -40,6 +40,9 @@ func LoadSignals(w ecs.World) error { return le } case consts.SIGNAL_JDXH: + if le := loadSignalJdxh(w, signal, signalEntry, elecs, data.EntityMap); le != nil { + return le + } case consts.SIGNAL_DCXH: if le := loadSignalDcxh(w, signal, signalEntry, elecs, data.EntityMap); le != nil { return le diff --git a/entity/signal_jdxh.go b/entity/signal_jdxh.go new file mode 100644 index 0000000..6f203db --- /dev/null +++ b/entity/signal_jdxh.go @@ -0,0 +1,39 @@ +package entity + +import ( + "fmt" + "joylink.club/ecs" + "joylink.club/rtsssimulation/component" + "joylink.club/rtsssimulation/consts" + "joylink.club/rtsssimulation/repository" +) + +func loadSignalJdxh(w ecs.World, signal *repository.Signal, signalEntry *ecs.Entry, elecs []repository.IGroupedElectronicComponent, entityMap map[string]*ecs.Entry) error { + + if len(elecs) == 4 { //jdxh组合类型包含3个继电器 + signalEntry.AddComponent(component.SignalJDXHElectronicType) + signalEntry.AddComponent(component.SignalJDXHFilamentType) + // + elecState := &component.SignalJDXHElectronic{} + for _, elec := range elecs { + switch elec.Code() { + case consts.SIGNAL_DJ: + elecState.JDXH_DJ = NewRelayEntity(w, elec.(*repository.Relay), entityMap) + case consts.SIGNAL_2DJ: + elecState.JDXH_2DJ = NewRelayEntity(w, elec.(*repository.Relay), entityMap) + case consts.SIGNAL_LXJ: + elecState.JDXH_LXJ = NewRelayEntity(w, elec.(*repository.Relay), entityMap) + case consts.SIGNAL_YXJ: + elecState.JDXH_YXJ = NewRelayEntity(w, elec.(*repository.Relay), entityMap) + default: + return fmt.Errorf("id=[%s]的信号机jdxh,无效电子元器件名称[%s]", signal.Id(), elec.Code()) + } + } + // + component.SignalJDXHElectronicType.Set(signalEntry, elecState) + component.SignalJDXHFilamentType.Set(signalEntry, &component.SignalJDXHFilament{Uf: true, Lf: true, Hf: true, U: false, L: false, H: false}) + } else { + return fmt.Errorf("id=[%s]的信号机jdxh,电子元器件数量须为4", signal.Id()) + } + return nil +} diff --git a/sys/bind.go b/sys/bind.go index 6d020be..0ba0e62 100644 --- a/sys/bind.go +++ b/sys/bind.go @@ -23,5 +23,6 @@ func BindSystem(w ecs.World) { circuit_sys.NewSignal3XH3System(), circuit_sys.NewSignal3XH4System(), circuit_sys.NewSignalDCXHSystem(), - circuit_sys.NewSignalJCKXHSystem()) + circuit_sys.NewSignalJCKXHSystem(), + circuit_sys.NewSignalJDXHSystem()) } diff --git a/sys/circuit_sys/signal_jdxh.go b/sys/circuit_sys/signal_jdxh.go new file mode 100644 index 0000000..9f7e9c2 --- /dev/null +++ b/sys/circuit_sys/signal_jdxh.go @@ -0,0 +1,72 @@ +package circuit_sys + +import ( + "github.com/yohamta/donburi/filter" + "joylink.club/ecs" + "joylink.club/rtsssimulation/component" +) + +type SignalJDXHSystem struct { + query *ecs.Query +} + +func NewSignalJDXHSystem() *SignalJDXHSystem { + return &SignalJDXHSystem{query: ecs.NewQuery(filter.Contains(component.SignalJDXHElectronicType, component.SignalJDXHFilamentType))} +} + +// Update world 执行 +func (s *SignalJDXHSystem) Update(w ecs.World) { + s.query.Each(w, func(e *ecs.Entry) { + state := component.SignalJDXHElectronicType.Get(e) + filament := component.SignalJDXHFilamentType.Get(e) + // + s.calculateL(state, filament) + s.calculateU(state, filament) + s.calculateH(state, filament) + s.calculateDJ(state, filament) + s.calculate2DJ(state, filament) + }) +} + +func (s *SignalJDXHSystem) calculateU(state *component.SignalJDXHElectronic, filament *component.SignalJDXHFilament) { + lxj := component.BitStateType.Get(state.JDXH_LXJ) + dj := component.BitStateType.Get(state.JDXH_DJ) + yxj := component.BitStateType.Get(state.JDXH_YXJ) + isU := filament.Uf && !lxj.Val && dj.Val && yxj.Val + filament.U = isU +} + +func (s *SignalJDXHSystem) calculateL(state *component.SignalJDXHElectronic, filament *component.SignalJDXHFilament) { + lxj := component.BitStateType.Get(state.JDXH_LXJ) + isL := filament.Lf && lxj.Val + filament.L = isL +} + +func (s *SignalJDXHSystem) calculateH(state *component.SignalJDXHElectronic, filament *component.SignalJDXHFilament) { + lxj := component.BitStateType.Get(state.JDXH_LXJ) + isH := filament.Hf && !lxj.Val + filament.H = isH +} + +func (s *SignalJDXHSystem) calculateDJ(state *component.SignalJDXHElectronic, filament *component.SignalJDXHFilament) { + lxj := component.BitStateType.Get(state.JDXH_LXJ) + dj := component.BitStateType.Get(state.JDXH_DJ) + isDJ := filament.Lf && lxj.Val || filament.Hf && !lxj.Val + if isDJ != dj.Val { + drive := component.RelayDriveType.Get(state.JDXH_DJ) + drive.Td = isDJ + drive.Xq = isDJ + } +} +func (s *SignalJDXHSystem) calculate2DJ(state *component.SignalJDXHElectronic, filament *component.SignalJDXHFilament) { + lxj := component.BitStateType.Get(state.JDXH_LXJ) + dj := component.BitStateType.Get(state.JDXH_DJ) + edj := component.BitStateType.Get(state.JDXH_2DJ) + yxj := component.BitStateType.Get(state.JDXH_YXJ) + is2DJ := filament.Uf && !lxj.Val && dj.Val && yxj.Val + if is2DJ != edj.Val { + drive := component.RelayDriveType.Get(state.JDXH_2DJ) + drive.Td = is2DJ + drive.Xq = is2DJ + } +}