Example #1
0
        public async Task <IExamItem> StartItemAsync(ExamItemExecutionContext context, CancellationToken token, string ItemVoice = "", string ItemEndVoice = "")
        {
            try
            {
                //todo:如果
                var examItem =
                    ExamItems.FirstOrDefault(x => x.ItemCode == context.ItemCode && x.State == ExamItemState.Progressing);
                if (examItem != null)
                {
                    if (!string.IsNullOrEmpty(ItemVoice))
                    {
                        examItem.VoiceFile = ItemVoice;
                    }
                    if (!string.IsNullOrEmpty(ItemEndVoice))
                    {
                        examItem.EndVoiceFile = ItemEndVoice;
                    }
                    return(examItem);
                }
                examItem = ProviderFactory.CreateExamItem(context.ItemCode, ItemVoice, ItemEndVoice);
                if (examItem != null)
                {
                    if (!string.IsNullOrEmpty(ItemVoice))
                    {
                        examItem.VoiceFile = ItemVoice;
                    }
                    if (!string.IsNullOrEmpty(ItemEndVoice))
                    {
                        examItem.EndVoiceFile = ItemEndVoice;
                    }
                }
                lock (ExamItems)
                {
                    ExamItems.Add(examItem);
                }
                await examItem.StartAsync(context, token).ContinueWith((task) =>
                {
                    if (task.Exception != null)
                    {
                        Logger.ErrorFormat("运行考试项目{0}发生异常,原因:{1}", context.ItemCode, task.Exception, task.Exception);
                    }
                }, token);

                return(examItem);
            }
            catch (Exception exp)
            {
                Logger.ErrorFormat("创建考试项目{0}发生异常,原因:{1}", context.ItemCode, exp, exp);
                return(null);
            }
        }
Example #2
0
        private Task <IExamItem> StartItemAsync(ExamItemStartMessage message, IDictionary <string, object> properties)
        {
            var itemCode = message.ExamItemCode;

            if (Context.ExamItemStates.All(x => x.ItemCode != itemCode))
            {
                Logger.WarnFormat("考试项目:{0}不存在", itemCode);
                return(null);
            }
            var context = new ExamItemExecutionContext(Context);

            context.TriggerSource = ExamItemTriggerSource.Map;
            context.Properties    = properties;
            context.TriggerPoint  = message.MapPoint;
            context.ItemCode      = message.ExamItemCode;

            return(StartItemAsync(context, CancellationToken.None));
        }
        //泸州特殊项目过滤完成了就不在自动触发
        protected override async Task MatchMapPointsAsync(CarSignalInfo signalInfo)
        {
            //只是一个条件
            if (Settings.PullOverStartFlage == false && Settings.EndExamByDistance && IsTriggerPullOver == false)
            {
                if (signalInfo.Distance >= Settings.ExamDistance)
                {
                    IsTriggerPullOver = true;
                    Logger.Info("里程达到三公里自动触发考试项目");
                    Messenger.Send <PullOverTriggerMessage>(new PullOverTriggerMessage());
                    return;
                }
            }
            //直线行驶路段忽略其它的考试项目
            if (ExamItems.Any(d => d.ItemCode == ExamItemCodes.StraightDriving && d.State != ExamItemState.Finished))
            {
                return;
            }

            var points = PointSearcher.Search(signalInfo);

            //对解除限速进行
            if (points.Any(d => d.PointType == MapPointType.UnfreezeSpeedLimit))
            {
                Messenger.Send(new EndSpeedLimitMessage());
            }
            var query = from p in points
                        where !ExamItems.Any(x => x.State != ExamItemState.Finished && x.TriggerPoint != null && x.TriggerPoint.PointType == p.PointType) &&
                        _mapTriggerPoints.All(x => x.Index != p.Index)
                        select p;

            foreach (var mapPoint in query)
            {
                var context = new ExamItemExecutionContext(Context);

                var item = DataService.AllExamItems.FirstOrDefault(x => x.MapPointType == mapPoint.PointType);
                if (item != null)
                {
                    if (Settings.PullOverStartFlage && InitPointList.Count > 0 && context.ExamMode == ExamMode.Examming)
                    {
                        Constants.IsExamMode_Luzhou = true;
                        if (item.MapPointType != MapPointType.TurnLeft && item.MapPointType != MapPointType.TurnRight)
                        {
                            //只报一次,除了左,右转
                            if (!FinishedPointList.Contains(item.MapPointType))
                            {
                                FinishedPointList.Add(item.MapPointType);
                            }
                            else
                            {
                                //播报过的项目,直接返回
                                return;
                            }
                        }
                        //////左转,右转,直行路口不过滤
                        ////if (FinishedPointList.Contains(item.MapPointType))
                        ////{
                        ////    //泸州过滤掉所有考试项目
                        ////    //if (item.ItemCode != ExamItemCodes.TurnLeft && item.ItemCode != ExamItemCodes.TurnRight &&
                        ////    //    item.ItemCode != ExamItemCodes.StraightThrough && item.ItemCode != ExamItemCodes.TurnRound
                        ////    //    && item.ItemCode != ExamItemCodes.SchoolArea && item.ItemCode != ExamItemCodes.BusArea && item.ItemCode != ExamItemCodes.PedestrianCrossing && item.ItemCode != ExamItemCodes.PedestrianCrossingHasPeople)
                        ////    {
                        ////        Logger.Info("跳过项目:" + item.ItemCode);
                        ////        continue;
                        ////    }
                        ////}

                        ////if (!FinishedPointList.Contains(item.MapPointType) && item.MapPointType != MapPointType.PullOver)
                        ////{
                        ////    FinishedPointList.Add(item.MapPointType);
                        ////    Logger.Info(item.MapPointType.ToString() + ":" + FinishedPointList.Count.ToString());
                        ////}
                    }
                    context.ItemCode = item.ItemCode;
                    ///超变会处理,相应的点位随机触发超车,变道,会车
                    if (item.ItemCode == ExamItemCodes.OvertakeChangeMeeting)
                    {
                        context.ItemCode = ExamItemCodes.GetRandomExamItemFromOvertakeChangeMeeting();
                    }
                    context.TriggerSource = ExamItemTriggerSource.Map;
                    context.Properties    = mapPoint.Properties;
                    context.TriggerPoint  = mapPoint;
                    Logger.InfoFormat("当前GPS:{0}-{1}-{2}", signalInfo.Gps.LatitudeDegrees, signalInfo.Gps.LongitudeDegrees, signalInfo.Gps.SpeedInKmh);
                    Logger.InfoFormat("点位GPS:{0}-{1}", mapPoint.Point.Latitude, mapPoint.Point.Longitude);
                    Logger.InfoFormat("相距位置:{0}米", GeoHelper.GetDistance(mapPoint.Point.Longitude, mapPoint.Point.Latitude, signalInfo.Gps.LongitudeDegrees, signalInfo.Gps.LatitudeDegrees));
                    Logger.InfoFormat("点位触发项目:{0}", item.ItemName);

                    await StartItemAsync(context, CancellationToken.None);
                }
                _mapTriggerPoints.Enqueue(mapPoint);
            }
            while (_mapTriggerPoints.Count > 2)
            {
                _mapTriggerPoints.Dequeue();
            }
        }
Example #4
0
        protected override async Task MatchMapPointsAsync(CarSignalInfo signalInfo)
        {
            //只是一个条件
            if (Settings.EndExamByDistance && IsTriggerPullOver == false)
            {
                if (signalInfo.Distance >= Settings.ExamDistance)
                {
                    IsTriggerPullOver = true;
                    Logger.Info("@@里程达到三公里自动触发考试项目");
                    Messenger.Send <PullOverTriggerMessage>(new PullOverTriggerMessage());
                    return;
                }
            }

            //直线行驶路段忽略其它的考试项目
            if (ExamItems.Any(d => d.ItemCode == ExamItemCodes.StraightDriving && d.State != ExamItemState.Finished))
            {
                return;
            }

            var points = PointSearcher.Search(signalInfo);

            //对解除限速进行
            if (points.Any(d => d.PointType == MapPointType.UnfreezeSpeedLimit))
            {
                Messenger.Send(new EndSpeedLimitMessage());
            }
            var query = from p in points
                        where !ExamItems.Any(x => x.State != ExamItemState.Finished && x.TriggerPoint != null && x.TriggerPoint.PointType == p.PointType) &&
                        _mapTriggerPoints.All(x => x.Index != p.Index)
                        select p;


            foreach (var mapPoint in query)
            {
                var context = new ExamItemExecutionContext(Context);

                var item = DataService.AllExamItems.FirstOrDefault(x => x.MapPointType == mapPoint.PointType);


                //其实最简单还是要在这里处理
                if (item != null)
                {
                    //排除语音点和起步
                    if (InitPointList.Count > 0 && !item.ItemName.Contains("点"))
                    {
                        if (!examingItem.Any(x => x.Equals(item.MapPointType)) && item.MapPointType != MapPointType.VehicleStarting)
                        {
                            examingItem.Enqueue(item.MapPointType);
                            FinishedPointList.Add(item.MapPointType);
                            Logger.Info("@@加入队列项目:{0}", item.ItemName);
                        }
                        if (examingItem.Count > 1)
                        {
                            examingItem.Dequeue();
                        }
                    }
                    context.ItemCode = item.ItemCode;
                    ///超变会处理,相应的点位随机触发超车,变道,会车
                    if (item.ItemCode == ExamItemCodes.OvertakeChangeMeeting)
                    {
                        context.ItemCode = ExamItemCodes.GetRandomExamItemFromOvertakeChangeMeeting();
                    }
                    context.TriggerSource = ExamItemTriggerSource.Map;
                    context.Properties    = mapPoint.Properties;
                    context.TriggerPoint  = mapPoint;
                    Logger.InfoFormat("当前GPS:{0}-{1}-{2}", signalInfo.Gps.LatitudeDegrees, signalInfo.Gps.LongitudeDegrees, signalInfo.Gps.SpeedInKmh);
                    Logger.InfoFormat("点位GPS:{0}-{1}", mapPoint.Point.Latitude, mapPoint.Point.Longitude);
                    Logger.InfoFormat("相距位置:{0}米", GeoHelper.GetDistance(mapPoint.Point.Longitude, mapPoint.Point.Latitude, signalInfo.Gps.LongitudeDegrees, signalInfo.Gps.LatitudeDegrees));
                    Logger.InfoFormat("点位触发项目:{0}", item.ItemName);

                    await StartItemAsync(context, CancellationToken.None);
                }
                _mapTriggerPoints.Enqueue(mapPoint);
            }
            while (_mapTriggerPoints.Count > 2)
            {
                _mapTriggerPoints.Dequeue();
            }
        }