Example #1
0
        /// <summary>
        /// Server服务实例向Client服务实例Notify当前周期的Mission对象
        /// </summary>
        /// <returns></returns>
        public IEnumerator <ITask> MissionParaNotification()
        {
            // Notify all subscribers.
            MissionPara announce = new MissionPara();

            // 将当前仿真使命的通用Mission对象拷贝一份用于策略调用的参数传递
            Mission mission = (Mission)MyMission.Instance().MissionRef.Clone();

            for (int i = 0; i < mission.CommonPara.TeamCount; i++)
            {// 循环对每条仿真机器鱼施加图像处理干扰 LiYoubing 20110617
                for (int j = 0; j < mission.CommonPara.FishCntPerTeam; j++)
                {
                    RoboFish f = mission.TeamsRef[i].Fishes[j];
                    Interference.ImageProcessInterference(ref f.PositionMm, ref f.BodyDirectionRad,
                                                          f.VelocityMmPs, f.AngularVelocityRadPs);
                }
            }
            for (int i = 0; i < mission.EnvRef.Balls.Count; i++)
            {// 循环对所有仿真水球施加图像处理干扰 LiYoubing 20110617
                Ball  b   = mission.EnvRef.Balls[i];
                float tmp = 0;
                Interference.ImageProcessInterference(ref b.PositionMm, ref tmp, b.VelocityMmPs, b.AngularVelocityRadPs);
            }
            announce.Body = new MissionParaRequest(mission);
            //announce.Body = new MissionParaRequest(MyMission.Instance().MissionRef);//modified 20101203
            base.SendNotification(_submgrPort, announce);

            announce.ResponsePort.Post(DefaultUpdateResponseType.Instance);
            yield break;
        }
Example #2
0
        /// <summary>
        /// 指示是否已经发生过策略调用异常true是false否
        /// 20110820废弃 策略代码中存在条件性除零/数组越界等异常时 不必要直接结束掉策略运行
        /// </summary>
        //bool _strategyExceptionFlag = false;

        /// <summary>
        /// 进行策略调用 获取指定id对应队伍的决策数据
        /// </summary>
        /// <param name="teamId">待获取决策数据的队伍id(从0开始)</param>
        void GetLocalDecision(int teamId)
        {
            MyMission myMission = MyMission.Instance();

            Decision[] decisions = null;
            if (_serverControlBoard.TeamStrategyControls[teamId].StrategyInterface != null
                /*&& _strategyExceptionFlag == false*/)
            {// 进行null检查确保不出异常 LiYoubing 20110511
                // 将当前仿真使命的通用Mission对象拷贝一份用于策略调用的参数传递
                Mission mission = (Mission)MyMission.Instance().MissionRef.Clone();
                for (int i = 0; i < mission.CommonPara.TeamCount; i++)
                {// 循环对每条仿真机器鱼施加图像处理干扰 LiYoubing 20110617
                    for (int j = 0; j < mission.CommonPara.FishCntPerTeam; j++)
                    {
                        RoboFish f = mission.TeamsRef[i].Fishes[j];
                        Interference.ImageProcessInterference(ref f.PositionMm, ref f.BodyDirectionRad,
                                                              f.VelocityMmPs, f.AngularVelocityRadPs);
                    }
                }
                for (int i = 0; i < mission.EnvRef.Balls.Count; i++)
                {// 循环对所有仿真水球施加图像处理干扰 LiYoubing 20110617
                    Ball  b   = mission.EnvRef.Balls[i];
                    float tmp = 0;
                    Interference.ImageProcessInterference(ref b.PositionMm, ref tmp, b.VelocityMmPs, b.AngularVelocityRadPs);
                }
                // 交换半场后交换策略处理 LiYoubing 20110711
                // 交换半场后TeamsRef[0]/[1]代表交换前右/左半场的队伍因此应该分别调用第1/0号控件所加载的策略
                int strategyId = myMission.ParasRef.IsExchangedHalfCourt ? (teamId + 1) % 2 : teamId;
                try
                {
                    decisions = _serverControlBoard.TeamStrategyControls[strategyId].StrategyInterface.GetDecision(
                        mission, teamId);
                }
                catch
                {
                    //_strategyExceptionFlag = true;
                    MessageBox.Show("Remoting object timeout.\nThe instance of class Strategy has been released."
                                    + "\nYour simulated robofish will not be controlled.",
                                    "Confirming", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                }
                //decision = _serverControlBoard.TeamStrategyControls[teamId].StrategyInterface.GetDecision(
                //   mission, teamId);
                //decision = _serverControlBoard.TeamStrategyControls[teamId].StrategyInterface.GetDecision(
                //   myMission.MissionRef, teamId);
            }
            if (decisions == null)
            {
                return;
            }
            for (int j = 0; j < myMission.TeamsRef[teamId].Fishes.Count; j++)
            {
                myMission.DecisionRef[teamId, j] = decisions[j];
            }
        }