package message_server import ( "fmt" "joylink.club/iot/service/model" "time" "joylink.club/bj-rtsts-server/dto/state_proto" "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 NewRccMs(vs *memory.VerifySimulation, mapId int32) ms_api.MsgTask { return ms_api.NewScheduleTask(fmt.Sprintf("地图[%d]继电器状态", mapId), func() error { relayStates, err := collectRelayState(vs.World, mapId) if err != nil { return err } stationQc, err := collectStationQcState(vs, mapId) if err != nil { return err } ststes := &state_proto.PushedDevicesStatus{ All: true, AllStatus: &state_proto.AllDevicesStatus{ ReplyState: relayStates, StationQc: stationQc, }, } mqtt.GetMsgClient().PubRCCState(vs.SimulationId, mapId, ststes) return nil }, 200*time.Millisecond) } // 获取仿真地图的继电器状态,前端推送 func collectRelayState(world ecs.World, mapId int32) ([]*state_proto.ReplyState, error) { // 获取本地图下的继电器信息 uidMap := memory.QueryMapUidMapByType(mapId, &data_proto.Relay{}) var replyStateArr []*state_proto.ReplyState for _, u := range uidMap { entry, ok := entity.GetEntityByUid(world, u.Uid) if !ok { // 暂时注释,很多继电器都没初始化 //return nil, fmt.Errorf("继电器实体不存在: World id=%d, uid=%s", r.vs.World.BaliseId(), u.Uid) continue } if entry.HasComponent(component.RelayTag) { bit := component.BitStateType.Get(entry) force := entry.HasComponent(component.RelayFaultForceType) replyStateArr = append(replyStateArr, &state_proto.ReplyState{Id: u.CommonId, Xh: bit.Val, Force: force}) } } return replyStateArr, nil } // 收集车站联锁驱采表状态 func collectStationQcState(simulation *memory.VerifySimulation, mapId int32) (*state_proto.StationQc, error) { state := &state_proto.StationQc{} relayData := memory.QueryGiData[*data_proto.RelayCabinetGraphicStorage](mapId) if relayData.CiQdList == nil && relayData.CiCjList == nil { return state, nil } stationCode := relayData.UniqueIdPrefix.BelongsConcentrationStation for _, qcEntry := range entity.GetWorldData(simulation.World).CiQcEntities { qcTable := component.CiQcTableType.Get(qcEntry) structure := simulation.UidMap[qcTable.EcsUid] if structure.Code != stationCode { continue } //驱采表实体与地图对应后-> qcState := component.CiQcStateType.Get(qcEntry) if len(qcTable.QdBits) != 0 { qdBits := model.DecodeBools(qcState.Qbs) for i, qdData := range qcTable.QdBits { state.QdStates = append(state.QdStates, &state_proto.StationQc_State{ Row: qdData.Row, Col: qdData.Col, On: qdBits[i], }) } } if len(qcTable.CjBits) != 0 { cjBits := model.DecodeBools(qcState.Cbs) for i, cjData := range qcTable.CjBits { state.CjStates = append(state.CjStates, &state_proto.StationQc_State{ Row: cjData.Row, Col: cjData.Col, On: cjBits[i], }) } } } return state, nil }