package message_server import ( "fmt" "joylink.club/bj-rtsts-server/dto/state_proto" "log/slog" "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) uidStructure := memory.QueryUidStructure[*memory.StationUidStructure](mapId) return ms_api.NewScheduleTask(fmt.Sprintf("地图[%d]PSL按钮状态", mapId), func() error { for _, psl := range mapData.PslBoxs { 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) } for _, psl := range mapData.GarageDoors { 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) } 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) } func sendMsg(vs *memory.VerifySimulation, mapId int32, pslId uint32, data *state_proto.PushedDevicesStatus) { err := mqtt.GetMsgClient().PubPSLState(vs.SimulationId, mapId, pslId, data) if err != nil { slog.Error(fmt.Sprintf("发送PSL状态出错:%s", err.Error())) } } 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: btnStates, }, }, nil }