package message_server import ( "fmt" "joylink.club/bj-rtsts-server/dto/state_proto" "time" "joylink.club/bj-rtsts-server/dto/data_proto" "joylink.club/bj-rtsts-server/message_server/ms_api" "joylink.club/bj-rtsts-server/mqtt" "joylink.club/bj-rtsts-server/ts/simulation/wayside/memory" "joylink.club/ecs" "joylink.club/rtsssimulation/component" "joylink.club/rtsssimulation/entity" ) func NewPSLMs(vs *memory.VerifySimulation, mapId int32) ms_api.MsgTask { mapData := memory.QueryGiData[*data_proto.RtssGraphicStorage](mapId) return ms_api.NewScheduleTask(fmt.Sprintf("地图[%d]综合门控箱按钮状态", mapId), func() error { for _, box := range mapData.GateBoxs { did := memory.GetMapElementId(box.Common) data_proto, err := collectGateBoxPSLState(vs.World, mapId, box) if err != nil { return err } mqtt.GetMsgClient().PubPSLState(vs.SimulationId, mapId, did, data_proto) } return nil }, 200*time.Millisecond) } func collectGateBoxPSLState(world ecs.World, mapId int32, box *data_proto.GatedBox) (*state_proto.PushedDevicesStatus, error) { did := memory.GetMapElementId(box.Common) uidStructure := memory.QueryUidStructure[*memory.StationUidStructure](mapId) boxUid := uidStructure.PslIds[did].Uid mkxEntry, ok := entity.GetEntityByUid(world, boxUid) if !ok { return nil, fmt.Errorf("[id:%s]的门控箱实体找不到", boxUid) } mkx := component.MkxType.Get(mkxEntry) var buttonStateArr []*state_proto.ButtonState if ok { _, pslStorage := memory.QueryGiDataByName[*data_proto.PslGraphicStorage](box.RefGatedBoxMapCode) btnUidMap := make(map[string]uint32, len(pslStorage.PslButtons)) for _, button := range pslStorage.PslButtons { btnUidMap[boxUid+"_"+button.Code] = memory.GetMapElementId(button.Common) } btnArr := []*ecs.Entry{mkx.PCB, mkx.PCBPL, mkx.POB, mkx.POBPL, mkx.PAB, mkx.PABPL, mkx.WRZF, mkx.WRZFPL, mkx.QKQR, mkx.QKQRPL, mkx.MPL, mkx.JXTCPL} for _, btn := range btnArr { if btn == nil { continue } btnState := component.BitStateType.Get(btn) buttonStateArr = append(buttonStateArr, &state_proto.ButtonState{ Id: btnUidMap[component.UidType.Get(btn).Id], Down: btnState.Val, Active: btnState.Val, //Bypass: btnState.BypassEnable, }) } } return &state_proto.PushedDevicesStatus{ All: true, AllStatus: &state_proto.AllDevicesStatus{ ButtonState: buttonStateArr, }, }, nil }