diff --git a/message_server/psl_ms.go b/message_server/psl_ms.go index 062b15f..c2329a3 100644 --- a/message_server/psl_ms.go +++ b/message_server/psl_ms.go @@ -17,22 +17,31 @@ import ( func NewPSLMs(vs *memory.VerifySimulation, mapId int32) ms_api.MsgTask { mapData := memory.QueryGiData[*data_proto.RtssGraphicStorage](mapId) + uidStructure := memory.QueryUidStructure[*memory.StationUidStructure](mapId) return ms_api.NewScheduleTask(fmt.Sprintf("地图[%d]PSL按钮状态", mapId), func() error { - for _, box := range mapData.GateBoxs { - did := memory.GetMapElementId(box.Common) - data, err := collectGateBoxPSLState(vs.World, mapId, box) + for _, psl := range mapData.PslBoxs { + data, err := collectPslStates(vs.World, psl.RefPslMapCode, uidStructure.PslIds[psl.Common.Id].Uid) if err != nil { - return err + slog.Error(err.Error()) + continue } - sendMsg(vs, mapId, did, data) + sendMsg(vs, mapId, psl.Common.Id, data) } - for _, ckm := range mapData.GarageDoors { - did := memory.GetMapElementId(ckm.Common) - data, err := collectGarageDoorBoxPSLState(vs.World, mapId, ckm) + for _, psl := range mapData.GarageDoors { + data, err := collectPslStates(vs.World, psl.RefPslMapCode, uidStructure.PslIds[psl.Common.Id].Uid) if err != nil { - return err + slog.Error(err.Error()) + continue } - sendMsg(vs, mapId, did, data) + sendMsg(vs, mapId, psl.Common.Id, data) + } + for _, psl := range mapData.FloodGates { + data, err := collectPslStates(vs.World, psl.RefPslMapCode, uidStructure.PslIds[psl.Common.Id].Uid) + if err != nil { + slog.Error(err.Error()) + continue + } + sendMsg(vs, mapId, psl.Common.Id, data) } return nil }, 200*time.Millisecond) @@ -45,81 +54,25 @@ func sendMsg(vs *memory.VerifySimulation, mapId int32, pslId uint32, data *state } } -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, - }) +func collectPslStates(world ecs.World, pslMapCode string, pslUid string) (*state_proto.PushedDevicesStatus, error) { + var btnStates []*state_proto.ButtonState + _, pslStorage := memory.QueryGiDataByName[*data_proto.PslGraphicStorage](pslMapCode) + for _, button := range pslStorage.PslButtons { + btnEntry, ok := entity.GetEntityByUid(world, memory.BuildUid(pslUid, button.Code)) + if !ok { + slog.Error(fmt.Sprintf("[id:%s]的PSL的按钮[code:%s]对应的实体找不到", pslUid, button.Code)) + continue } + btnStates = append(btnStates, &state_proto.ButtonState{ + Id: button.Common.Id, + Down: component.BitStateType.Get(btnEntry).Val, + Active: component.BitStateType.Get(btnEntry).Val, + }) } return &state_proto.PushedDevicesStatus{ All: true, AllStatus: &state_proto.AllDevicesStatus{ - ButtonState: buttonStateArr, + ButtonState: btnStates, }, }, nil } - -func collectGarageDoorBoxPSLState(world ecs.World, mapId int32, box *data_proto.GarageDoor) (*state_proto.PushedDevicesStatus, error) { - return nil, nil - //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 -}