This commit is contained in:
xzb 2023-10-20 18:01:12 +08:00
commit 365f5a50d9
10 changed files with 96 additions and 38 deletions

View File

@ -7,7 +7,7 @@ var MkxTag = ecs.NewTag()
var MkxInfoType = ecs.NewComponentType[MkxInfo]() var MkxInfoType = ecs.NewComponentType[MkxInfo]()
type MkxInfo struct { type MkxInfo struct {
PlatformId string PsdId string
} }
var MkxCircuitType = ecs.NewComponentType[MkxCircuit]() var MkxCircuitType = ecs.NewComponentType[MkxCircuit]()

View File

@ -1,6 +1,7 @@
package entity package entity
import ( import (
"fmt"
"joylink.club/ecs" "joylink.club/ecs"
"joylink.club/rtsssimulation/component" "joylink.club/rtsssimulation/component"
"joylink.club/rtsssimulation/repository" "joylink.club/rtsssimulation/repository"
@ -19,6 +20,9 @@ func LoadMkx(w ecs.World) error {
} }
func loadMkxCircuit(world ecs.World, entry *ecs.Entry, mkx *repository.Mkx, entryMap map[string]*ecs.Entry) { func loadMkxCircuit(world ecs.World, entry *ecs.Entry, mkx *repository.Mkx, entryMap map[string]*ecs.Entry) {
if len(mkx.ComponentGroups()) == 0 {
return
}
circuit := &component.MkxCircuit{} circuit := &component.MkxCircuit{}
for _, group := range mkx.ComponentGroups() { for _, group := range mkx.ComponentGroups() {
for _, ec := range group.Components() { for _, ec := range group.Components() {
@ -29,6 +33,8 @@ func loadMkxCircuit(world ecs.World, entry *ecs.Entry, mkx *repository.Mkx, entr
circuit.Pobj = NewRelayEntity(world, relay, entryMap) circuit.Pobj = NewRelayEntity(world, relay, entryMap)
} else if strings.Contains(ec.Code(), "PABJ") { } else if strings.Contains(ec.Code(), "PABJ") {
circuit.Pabj = NewRelayEntity(world, relay, entryMap) circuit.Pabj = NewRelayEntity(world, relay, entryMap)
} else {
println(fmt.Sprintf("未知的门控箱继电器[%s]", ec.Id()))
} }
} }
} }
@ -50,21 +56,23 @@ func loadMkxCircuit(world ecs.World, entry *ecs.Entry, mkx *repository.Mkx, entr
func NewMkxEntry(world ecs.World, mkx *repository.Mkx, worldData *component.WorldData) *ecs.Entry { func NewMkxEntry(world ecs.World, mkx *repository.Mkx, worldData *component.WorldData) *ecs.Entry {
entry, ok := worldData.EntityMap[mkx.Id()] entry, ok := worldData.EntityMap[mkx.Id()]
if !ok { if !ok {
entry = world.Entry(world.Create(component.MkxTag, component.UidType, component.MkxInfoType, component.MkxCircuitType)) entry = world.Entry(world.Create(component.MkxTag, component.UidType, component.MkxInfoType, component.MkxCircuitType,
component.MkxCollectionCircuitType))
component.UidType.SetValue(entry, component.Uid{Id: mkx.Id()}) component.UidType.SetValue(entry, component.Uid{Id: mkx.Id()})
component.MkxInfoType.SetValue(entry, component.MkxInfo{PlatformId: mkx.PlatformId()}) component.MkxInfoType.SetValue(entry, component.MkxInfo{PsdId: mkx.PsdId()})
worldData.EntityMap[mkx.Id()] = entry worldData.EntityMap[mkx.Id()] = entry
} }
return entry return entry
} }
func NewMkxBox(world ecs.World, btn *repository.Button, entryMap map[string]*ecs.Entry) *ecs.Entry { func NewMkxBox(world ecs.World, btn *repository.Button, entryMap map[string]*ecs.Entry) *ecs.Entry {
mplButton := repository.NewButton(btn.Id()+"mpl", "mpl", proto.Button_NO_Reset_Up) mplButton := repository.NewButton(btn.Id()+"mpl", "mpl", proto.Button_NO_Reset_Press)
box := &component.MkxBox{ box := &component.MkxBox{
Btn: NewButtonEntity(world, btn, entryMap), Btn: NewButtonEntity(world, btn, entryMap),
MkxplBtn: NewButtonEntity(world, mplButton, entryMap), MkxplBtn: NewButtonEntity(world, mplButton, entryMap),
} }
entry := world.Entry(world.Create(component.MkxBoxType)) entry := world.Entry(world.Create(component.MkxBoxType))
component.MkxBoxType.Set(entry, box) component.MkxBoxType.Set(entry, box)
component.BitStateType.SetValue(box.MkxplBtn, component.BitState{Val: true})
return entry return entry
} }

View File

@ -17,6 +17,9 @@ func LoadPsd(w ecs.World) error {
} }
func loadPsdCircuit(world ecs.World, entry *ecs.Entry, psd *repository.Psd, entryMap map[string]*ecs.Entry) { func loadPsdCircuit(world ecs.World, entry *ecs.Entry, psd *repository.Psd, entryMap map[string]*ecs.Entry) {
if len(psd.ComponentGroups()) == 0 {
return
}
circuit := &component.PsdCircuit{} circuit := &component.PsdCircuit{}
for _, group := range psd.ComponentGroups() { for _, group := range psd.ComponentGroups() {
for _, ec := range group.Components() { for _, ec := range group.Components() {
@ -42,7 +45,7 @@ func NewPsdEntry(world ecs.World, psd *repository.Psd, worldData *component.Worl
entry, ok := worldData.EntityMap[psd.Id()] entry, ok := worldData.EntityMap[psd.Id()]
if !ok { if !ok {
entry = world.Entry(world.Create(component.PsdTag, component.UidType, component.PsdInfoType, component.PsdStateType, entry = world.Entry(world.Create(component.PsdTag, component.UidType, component.PsdInfoType, component.PsdStateType,
component.PsdCircuitType, component.PsdDriveCircuitType, component.PsdCollectionCircuitType, component.PsdMotorType)) component.PsdDriveCircuitType, component.PsdCollectionCircuitType, component.PsdMotorType))
component.UidType.SetValue(entry, component.Uid{Id: psd.Id()}) component.UidType.SetValue(entry, component.Uid{Id: psd.Id()})
component.PsdInfoType.SetValue(entry, component.PsdInfo{PlatformId: psd.PlatformId()}) component.PsdInfoType.SetValue(entry, component.PsdInfo{PlatformId: psd.PlatformId()})
psdMotor := world.Entry(world.Create(component.PsdMotorStateType)) psdMotor := world.Entry(world.Create(component.PsdMotorStateType))

View File

@ -4,25 +4,25 @@ import "joylink.club/rtsssimulation/repository/model/proto"
type Mkx struct { type Mkx struct {
Identity Identity
platformId string psdId string
pcbButtons []*Button pcbButtons []*Button
pobButtons []*Button pobButtons []*Button
pabButtons []*Button pabButtons []*Button
componentGroups []*ElectronicComponentGroup componentGroups []*ElectronicComponentGroup
} }
func NewMkx(id string) *Mkx { func NewMkx(id string, psdId string) *Mkx {
return &Mkx{ return &Mkx{
Identity: identity{ Identity: identity{
id: id, id: id,
deviceType: proto.DeviceType_DeviceType_Mkx, deviceType: proto.DeviceType_DeviceType_Mkx,
}, },
componentGroups: nil, psdId: psdId,
} }
} }
func (m *Mkx) PlatformId() string { func (m *Mkx) PsdId() string {
return m.platformId return m.psdId
} }
func (m *Mkx) PcbButtons() []*Button { func (m *Mkx) PcbButtons() []*Button {

View File

@ -7,7 +7,6 @@ import (
"math" "math"
"strconv" "strconv"
"go.uber.org/zap"
"joylink.club/rtsssimulation/repository/model/proto" "joylink.club/rtsssimulation/repository/model/proto"
"joylink.club/rtsssimulation/util/number" "joylink.club/rtsssimulation/util/number"
) )
@ -28,14 +27,14 @@ func BuildRepository(source *proto.Repository) (*Repository, error) {
if err != nil { if err != nil {
return nil, err return nil, err
} }
zap.S().Debug("基础模型构建完毕") slog.Info("基础模型构建完毕")
err = buildModelRelationship(source, repository) err = buildModelRelationship(source, repository)
zap.S().Debug("模型关系构建完毕") slog.Info("模型关系构建完毕")
if err != nil { if err != nil {
return nil, err return nil, err
} }
err = buildLinksAndRelate(repository) err = buildLinksAndRelate(repository)
zap.S().Debug("构建Link并与模型关联完毕") slog.Info("构建Link并与模型关联完毕")
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -115,7 +114,7 @@ func buildModels(source *proto.Repository, repository *Repository) error {
repository.stationMap[m.Id()] = m repository.stationMap[m.Id()] = m
} }
for _, protoData := range source.Mkxs { for _, protoData := range source.Mkxs {
m := NewMkx(protoData.Id) m := NewMkx(protoData.Id, protoData.PsdId)
repository.mkxMap[m.Id()] = m repository.mkxMap[m.Id()] = m
} }
for _, protoData := range source.Keys { for _, protoData := range source.Keys {

View File

@ -27,5 +27,12 @@ func BindSystem(w ecs.World) {
circuit_sys.NewSignalJCKXHSystem(), circuit_sys.NewSignalJCKXHSystem(),
circuit_sys.NewSignalJDXHSystem(), circuit_sys.NewSignalJDXHSystem(),
device_sys.NewLightSys(), device_sys.NewLightSys(),
//屏蔽门
circuit_sys.NewPsdSys(),
device_sys.NewPsdMotorSys(),
//门控箱
circuit_sys.NewMkxSys(),
//联锁机
device_sys.NewInterlockSys(),
) )
} }

View File

@ -12,7 +12,7 @@ type MkxSys struct {
func NewMkxSys() *MkxSys { func NewMkxSys() *MkxSys {
return &MkxSys{ return &MkxSys{
query: ecs.NewQuery(filter.Contains(component.PsdCircuitType, component.PsdDriveCircuitType)), query: ecs.NewQuery(filter.Contains(component.MkxCircuitType, component.MkxCollectionCircuitType)),
} }
} }
@ -21,25 +21,38 @@ func (p *MkxSys) Update(world ecs.World) {
circuit := component.MkxCircuitType.Get(entry) circuit := component.MkxCircuitType.Get(entry)
p.exciteRelay(circuit.PcbList, circuit.Pcbj) p.exciteRelay(circuit.PcbList, circuit.Pcbj)
p.exciteRelay(circuit.PobList, circuit.Pobj) p.exciteRelay(circuit.PobList, circuit.Pobj)
if circuit.Pabj != nil { //北岗子没有PABJ而是PDBJ原因未知
p.exciteRelay(circuit.PabList, circuit.Pabj) p.exciteRelay(circuit.PabList, circuit.Pabj)
}
//联锁采集
collectionCircuit := component.MkxCollectionCircuitType.Get(entry)
pcb := component.BitStateType.Get(circuit.Pcbj).Val
collectionCircuit.Pcb = pcb
pob := component.BitStateType.Get(circuit.Pobj).Val
collectionCircuit.Pob = pob
if circuit.Pabj != nil { //北岗子没有PABJ而是PDBJ原因未知
pab := component.BitStateType.Get(circuit.Pabj).Val
collectionCircuit.Pab = pab
}
}) })
} }
func (p *MkxSys) exciteRelay(entries []*ecs.Entry, relay *ecs.Entry) { func (p *MkxSys) exciteRelay(entries []*ecs.Entry, relay *ecs.Entry) {
on := false on := false
for _, pcbEntry := range entries { for _, entry := range entries {
pcb := component.MkxBoxType.Get(pcbEntry) box := component.MkxBoxType.Get(entry)
btn := component.BitStateType.Get(pcb.Btn) btn := component.BitStateType.Get(box.Btn)
mkxplBtn := component.BitStateType.Get(pcb.MkxplBtn) mkxplBtn := component.BitStateType.Get(box.MkxplBtn)
if btn.Val && mkxplBtn.Val { if btn.Val && mkxplBtn.Val {
on = true on = true
break
} }
} }
if on { if on {
component.RelayDriveType.Get(relay).Td = true component.RelayDriveType.Get(relay).Td = true
component.BitStateType.Get(relay).Val = true //component.BitStateType.Get(relay).Val = true
} else { } else {
component.RelayDriveType.Get(relay).Td = false component.RelayDriveType.Get(relay).Td = false
component.BitStateType.Get(relay).Val = false //component.BitStateType.Get(relay).Val = false
} }
} }

View File

@ -12,7 +12,7 @@ type PsdSys struct {
func NewPsdSys() *PsdSys { func NewPsdSys() *PsdSys {
return &PsdSys{ return &PsdSys{
query: ecs.NewQuery(filter.Contains(component.PsdCircuitType, component.PsdDriveCircuitType)), query: ecs.NewQuery(filter.Contains(component.PsdDriveCircuitType, component.PsdMotorType)),
} }
} }
@ -20,13 +20,17 @@ func (p *PsdSys) Update(world ecs.World) {
p.query.Each(world, func(entry *ecs.Entry) { p.query.Each(world, func(entry *ecs.Entry) {
psdMotor := component.PsdMotorType.Get(entry) psdMotor := component.PsdMotorType.Get(entry)
psdMotorState := component.PsdMotorStateType.Get(psdMotor) psdMotorState := component.PsdMotorStateType.Get(psdMotor)
psd := component.PsdCircuitType.Get(entry)
psdDrive := component.PsdDriveCircuitType.Get(entry) psdDrive := component.PsdDriveCircuitType.Get(entry)
p.exciteByDrive(psd, psdDrive) if entry.HasComponent(component.PsdCircuitType) { //有屏蔽门电路
p.exciteGMJ(psdMotorState, psd, psdDrive) psdCircuit := component.PsdCircuitType.Get(entry)
p.exciteKMJ4(psdMotorState, psd, psdDrive) p.exciteByDrive(psdCircuit, psdDrive)
p.exciteKMJ8(psdMotorState, psd, psdDrive) p.exciteGMJ(psdMotorState, psdCircuit, psdDrive)
p.exciteMGJ(entry, psdMotorState) p.exciteKMJ4(psdMotorState, psdCircuit, psdDrive)
p.exciteKMJ8(psdMotorState, psdCircuit, psdDrive)
p.exciteMGJ(psdCircuit, psdMotorState)
} else { //无屏蔽门电路,直接驱动电机
p.driveMotor(psdMotorState, psdDrive.GMJ, psdDrive.KMJ4, psdDrive.KMJ8)
}
p.updatePsdState(entry, psdMotorState) p.updatePsdState(entry, psdMotorState)
}) })
} }
@ -46,6 +50,23 @@ func (p *PsdSys) exciteByDrive(psd *component.PsdCircuit, drive *component.PsdDr
} }
} }
// 驱动电机
func (p *PsdSys) driveMotor(psdMotorState *component.PsdMotorState, gm, km4, km8 bool) {
if gm {
psdMotorState.Gm_Td = true
psdMotorState.Km4_Td = false
psdMotorState.Km8_Td = false
} else if km4 {
psdMotorState.Gm_Td = false
psdMotorState.Km4_Td = true
psdMotorState.Km8_Td = false
} else if km8 {
psdMotorState.Gm_Td = false
psdMotorState.Km4_Td = false
psdMotorState.Km8_Td = true
}
}
func (p *PsdSys) exciteGMJ(state *component.PsdMotorState, psd *component.PsdCircuit, psdDrive *component.PsdDriveCircuit) { func (p *PsdSys) exciteGMJ(state *component.PsdMotorState, psd *component.PsdCircuit, psdDrive *component.PsdDriveCircuit) {
gmj := component.BitStateType.Get(psd.GMJ) gmj := component.BitStateType.Get(psd.GMJ)
kmj4 := component.BitStateType.Get(psd.KMJ4) kmj4 := component.BitStateType.Get(psd.KMJ4)
@ -106,8 +127,7 @@ func (p *PsdSys) exciteKMJ8(state *component.PsdMotorState, psd *component.PsdCi
} }
} }
func (p *PsdSys) exciteMGJ(entry *ecs.Entry, state *component.PsdMotorState) { func (p *PsdSys) exciteMGJ(psdCircuit *component.PsdCircuit, state *component.PsdMotorState) {
psdCircuit := component.PsdCircuitType.Get(entry)
if state.Is4Km() || state.Is8Km() { if state.Is4Km() || state.Is8Km() {
component.RelayDriveType.Get(psdCircuit.MGJ).Td = false component.RelayDriveType.Get(psdCircuit.MGJ).Td = false
component.BitStateType.Get(psdCircuit.MGJ).Val = false component.BitStateType.Get(psdCircuit.MGJ).Val = false

View File

@ -13,7 +13,7 @@ type InterlockSys struct {
func NewInterlockSys() *InterlockSys { func NewInterlockSys() *InterlockSys {
return &InterlockSys{ return &InterlockSys{
psdQuery: ecs.NewQuery(filter.Contains(component.PsdInfoType, component.PsdDriveCircuitType)), psdQuery: ecs.NewQuery(filter.Contains(component.PsdTag, component.UidType, component.PsdDriveCircuitType)),
mkxQuery: ecs.NewQuery(filter.Contains(component.MkxInfoType, component.MkxCollectionCircuitType)), mkxQuery: ecs.NewQuery(filter.Contains(component.MkxInfoType, component.MkxCollectionCircuitType)),
} }
} }
@ -21,19 +21,18 @@ func NewInterlockSys() *InterlockSys {
func (s *InterlockSys) Update(world ecs.World) { func (s *InterlockSys) Update(world ecs.World) {
psdEntryMap := make(map[string]*ecs.Entry) psdEntryMap := make(map[string]*ecs.Entry)
s.psdQuery.Each(world, func(entry *ecs.Entry) { s.psdQuery.Each(world, func(entry *ecs.Entry) {
psdEntryMap[component.PsdInfoType.Get(entry).PlatformId] = entry psdEntryMap[component.UidType.Get(entry).Id] = entry
}) })
s.mkxQuery.Each(world, func(entry *ecs.Entry) { s.mkxQuery.Each(world, func(entry *ecs.Entry) {
mkxState := component.MkxCollectionCircuitType.Get(entry) mkxState := component.MkxCollectionCircuitType.Get(entry)
if mkxState.Pcb { if mkxState.Pcb {
psdEntry := psdEntryMap[component.MkxInfoType.Get(entry).PlatformId] psdEntry := psdEntryMap[component.MkxInfoType.Get(entry).PsdId]
psdDriveCircuit := component.PsdDriveCircuitType.Get(psdEntry) psdDriveCircuit := component.PsdDriveCircuitType.Get(psdEntry)
psdDriveCircuit.GMJ = true psdDriveCircuit.GMJ = true
psdDriveCircuit.KMJ4 = false psdDriveCircuit.KMJ4 = false
psdDriveCircuit.KMJ8 = false psdDriveCircuit.KMJ8 = false
} } else if mkxState.Pob {
if mkxState.Pob { psdEntry := psdEntryMap[component.MkxInfoType.Get(entry).PsdId]
psdEntry := psdEntryMap[component.MkxInfoType.Get(entry).PlatformId]
psdDriveCircuit := component.PsdDriveCircuitType.Get(psdEntry) psdDriveCircuit := component.PsdDriveCircuitType.Get(psdEntry)
psdDriveCircuit.GMJ = false psdDriveCircuit.GMJ = false
psdDriveCircuit.KMJ4 = false psdDriveCircuit.KMJ4 = false

View File

@ -48,6 +48,9 @@ func gm(psdMotorState *component.PsdMotorState, rate int32) {
psdMotorState.Km8_4 = newRate psdMotorState.Km8_4 = newRate
} }
} }
if !psdMotorState.Is8Km() && !psdMotorState.Is4Km() {
psdMotorState.Gm_Td = false
}
} }
func km4(psdMotorState *component.PsdMotorState, rate int32) { func km4(psdMotorState *component.PsdMotorState, rate int32) {
@ -59,6 +62,9 @@ func km4(psdMotorState *component.PsdMotorState, rate int32) {
psdMotorState.Km4 = newRate psdMotorState.Km4 = newRate
} }
} }
if psdMotorState.Is4Km() || psdMotorState.Is8Km() {
psdMotorState.Km4_Td = false
}
} }
func km8(psdMotorState *component.PsdMotorState, rate int32) { func km8(psdMotorState *component.PsdMotorState, rate int32) {
@ -78,4 +84,7 @@ func km8(psdMotorState *component.PsdMotorState, rate int32) {
psdMotorState.Km8_4 = newRate psdMotorState.Km8_4 = newRate
} }
} }
if psdMotorState.Is8Km() {
psdMotorState.Km8_Td = false
}
} }