package message_server import ( "fmt" "joylink.club/bj-rtsts-server/dto/state_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" "log/slog" "time" ) func lowPower(power bool) bool { if power { return false } else { return true } } // 综合后备盘IBP消息服务 func NewTrainControlMs(vs *memory.VerifySimulation, mapId int32) ms_api.MsgTask { return ms_api.NewScheduleTask(fmt.Sprintf("地图[%d]列车控制", mapId), func() error { allTrainMap := &vs.Memory.Status.TrainStateMap allTrainMap.Range(func(key, value any) bool { trainId := fmt.Sprintf("%v", key) ts := value.(*state_proto.TrainState) ttcc := ts.Tcc vobc := ts.VobcState lights := make([]*state_proto.TrainControlState_ControlLight, 0) for lightKey, light := range ttcc.LightMaps { switch lightKey { case memory.LIGHT_JJZD: state := lowPower(vobc.LightEmergencyBrakingStatus) lights = append(lights, &state_proto.TrainControlState_ControlLight{Id: light.Id, Val: state}) case memory.LIGHT_QQY: state := lowPower(vobc.LightTractionSafetyCircuit) lights = append(lights, &state_proto.TrainControlState_ControlLight{Id: light.Id, Val: state}) case memory.LIGHT_JSSJH: lights = append(lights, &state_proto.TrainControlState_ControlLight{Id: light.Id, Val: vobc.LightDriverActive}) case memory.LIGHT_TFZDHJ: lights = append(lights, &state_proto.TrainControlState_ControlLight{Id: light.Id, Val: vobc.StopNotAllBrake}) case memory.LIGHT_QYYX: lights = append(lights, &state_proto.TrainControlState_ControlLight{Id: light.Id, Val: vobc.TractionEffective}) case memory.LIGHT_ZDYX: lights = append(lights, &state_proto.TrainControlState_ControlLight{Id: light.Id, Val: vobc.BrakeEffective}) case memory.LIGHT_TFZDSJ: lights = append(lights, &state_proto.TrainControlState_ControlLight{Id: light.Id, Val: vobc.ParkingBrakeStatus}) case memory.LIGHT_CYZD: lights = append(lights, &state_proto.TrainControlState_ControlLight{Id: light.Id, Val: vobc.MostUseBrake}) case memory.LIGHT_ZDGL: lights = append(lights, &state_proto.TrainControlState_ControlLight{Id: light.Id, Val: vobc.BrakeQuarantine}) case memory.LIGHT_LSXH: lights = append(lights, &state_proto.TrainControlState_ControlLight{Id: light.Id, Val: vobc.NoSpeedSigle}) case memory.LIGHT_ZMYX: lights = append(lights, &state_proto.TrainControlState_ControlLight{Id: light.Id, Val: vobc.LeftDoorState}) case memory.LIGHT_YMYX: lights = append(lights, &state_proto.TrainControlState_ControlLight{Id: light.Id, Val: vobc.RightDoorState}) case memory.LIGHT_ZFZSD: lights = append(lights, &state_proto.TrainControlState_ControlLight{Id: light.Id, Val: vobc.TurnbackStatus}) case memory.LIGHT_BDATPKC: lights = append(lights, &state_proto.TrainControlState_ControlLight{Id: light.Id, Val: vobc.LocalAtpControl}) case memory.LIGHT_ATOFCZSD: lights = append(lights, &state_proto.TrainControlState_ControlLight{Id: light.Id, Val: vobc.LightAtoSend}) case memory.LIGHT_ATO_OPEN_LEFT_DOOR: lights = append(lights, &state_proto.TrainControlState_ControlLight{Id: light.Id, Val: vobc.AtoOpenLeftDoor}) case memory.LIGHT_ATO_OPEN_RIGHT_DOOR: lights = append(lights, &state_proto.TrainControlState_ControlLight{Id: light.Id, Val: vobc.AtoOpenRightDoor}) case memory.LIGHT_ATO_CLOSE_LEFT_DOOR: lights = append(lights, &state_proto.TrainControlState_ControlLight{Id: light.Id, Val: vobc.AtoCloseLeftDoor}) case memory.LIGHT_ATO_CLOSE_RIGHT_DOOR: lights = append(lights, &state_proto.TrainControlState_ControlLight{Id: light.Id, Val: vobc.AtoCloseRightDoor}) default: lights = append(lights, &state_proto.TrainControlState_ControlLight{Id: light.Id, Val: light.Val}) } } buttons := make([]*state_proto.TrainControlState_ControlButton, 0) for _, button := range ttcc.Buttons { buttons = append(buttons, button) } sks := make([]*state_proto.TrainControlState_SwitchKeyChange, 0) for _, sk := range ttcc.SwitchKeyMap { sks = append(sks, sk) } tcc := &state_proto.TrainControlStateMsg{Buttons: buttons, DriverKey: ttcc.DriverKey, SwitchKeys: sks, PushHandler: ttcc.PushHandler, Lights: lights} err := mqtt.GetMsgClient().PubTrainControlState(vs.SimulationId, trainId, tcc) if err != nil { slog.Error("发送列车控制mqtt失败", err) } return true }) return nil }, 200*time.Millisecond) }