Esempio n. 1
0
        protected override void ExecuteCore(CarSignalInfo signalInfo)
        {
            if (!IsLoudSpeakerCheck && signalInfo.Sensor.Loudspeaker)
            {
                IsLoudSpeakerCheck = true;
            }
            //过滤10m
            if (!isOverPrepareDistance)
            {
                //超车10米后才评判
                if (signalInfo.Distance - StartDistance < Settings.OvertakePrepareDistance)
                {
                    return;
                }
                if (signalInfo.BearingAngle.IsValidAngle())
                {
                    isOverPrepareDistance = true;
                    StartAngle            = signalInfo.BearingAngle;
                }
                return;
            }
            //检测是否超速
            if (Settings.OvertakeSpeedLimit > 0 && signalInfo.SpeedInKmh > Settings.OvertakeSpeedLimit)
            {
                CheckRule(true, DeductionRuleCodes.RC30116);
            }

            //超车只要达到最低速度就可以了
            if (Settings.OvertakeLowestSpeed >= 0 && signalInfo.SpeedInKmh > Settings.OvertakeLowestSpeed)
            {
                IsArrivedLowSpeed = true;
            }

            //检测开始超车转向角度
            if (OvertakeStepState == OvertakeStep.None)
            {
                if (signalInfo.BearingAngle.IsValidAngle() &&
                    !GeoHelper.IsBetweenDiffAngle(signalInfo.BearingAngle, StartAngle, Settings.OvertakeChangeLanesAngle))
                {
                    //检测是否反向超车,20161107
                    //if (Settings.ReverseOvertakeCheck)
                    //{
                    //    var current = Locator.Current.Resolve<DirectionJudgeClass>();
                    //    var direction = current.JudgeDirectoin(StartAngle, signalInfo.BearingAngle, Settings.OvertakeChangeLanesAngle, Settings.AngleSource);
                    //    if (direction == Direction.Right)
                    //    {
                    //        CheckRule(true, DeductionRuleCodes.RC41409);
                    //    }
                    //}
                    //设置开始变道时的距离
                    OvertakeStepState          = OvertakeStep.StartChangeLanesToLeft;
                    StartChangingLanesDistance = signalInfo.Distance;

                    if (Settings.OvertakeLightCheck && !IsCheckedOvertakeLeftLight)
                    {
                        IsCheckedOvertakeLeftLight = true;
                        //超车,左转向灯***********/
                        if (!CarSignalSet.Query(StartTime).Any(d => d.Sensor.LeftIndicatorLight))
                        {
                            BreakRule(DeductionRuleCodes.RC30205, DeductionRuleCodes.SRC3020504);
                            Logger.InfoFormat("OverTakeTest Not LeftIndicatorLight");
                        }
                        else
                        {
                            if (!AdvancedSignal.CheckOperationAheadSeconds(x => x.Sensor.LeftIndicatorLight, StartTime, Settings.TurnLightAheadOfTime))
                            {
                                BreakRule(DeductionRuleCodes.RC30206, DeductionRuleCodes.SRC3020604);
                                Logger.InfoFormat("OverTakeTest LeftIndicatorLight Time:{0}", Settings.TurnLightAheadOfTime);
                            }
                        }
                    }
                }
            }
            else if (OvertakeStepState == OvertakeStep.StartChangeLanesToLeft)
            {
                //当开始变道后向前行驶15米则认为变道成功
                Logger.DebugFormat("OvertakeDistince :{0}", signalInfo.Distance - StartChangingLanesDistance);
                if (signalInfo.Distance - StartChangingLanesDistance >= ChangingLanesDistance &&
                    signalInfo.BearingAngle.IsValidAngle())
                {
                    OvertakeStepState     = OvertakeStep.EndChangeLanesToLeft;
                    StartChangeLanesAngle = signalInfo.BearingAngle;
                }
            }
            else if (OvertakeStepState == OvertakeStep.EndChangeLanesToLeft)
            {
                //结束考试项目
                IsSuccess = true;
                return;
            }



            base.ExecuteCore(signalInfo);
        }
Esempio n. 2
0
        protected override void ExecuteCore(CarSignalInfo signalInfo)
        {
            if (!IsLoudSpeakerCheck && signalInfo.Sensor.Loudspeaker)
            {
                IsLoudSpeakerCheck = true;
            }
            //过滤10m
            //准备距离0 处理
            if (!isOverPrepareDistance && Settings.OvertakePrepareDistance > 0)
            {
                //超车10米后才评判
                if (signalInfo.Distance - StartDistance < Settings.OvertakePrepareDistance)
                {
                    return;
                }
                if (signalInfo.BearingAngle.IsValidAngle())
                {
                    isOverPrepareDistance = true;
                    StartAngle            = signalInfo.BearingAngle;
                }
                return;
            }
            //检测是否超速

            //检测打错灯,一进入就打右转
            if (OvertakeStepState == OvertakeStep.None && !checkErrorLight)
            {
                //超车,第一次打的是右转右灯判错
                if (signalInfo.Sensor.RightIndicatorLight || signalInfo.Sensor.LeftIndicatorLight)
                {
                    checkErrorLight = true;
                    if (signalInfo.Sensor.RightIndicatorLight)
                    {
                        CheckRule(true, DeductionRuleCodes.RC30205, DeductionRuleCodes.SRC3020504);
                    }
                }
            }

            //TODO:以前有部分客户反馈是会2扣分得。原因不明。不知道是不是信号不稳定影响得。有时间可以打开在多次测试 2018.04.22 鲍君
            if (IsCheckOverSpeed == false && ((Settings.OvertakeSpeedLimit > 0 && signalInfo.SpeedInKmh > Settings.OvertakeSpeedLimit) ||
                                              (Settings.OvertakeLowestSpeed > 0 && signalInfo.SpeedInKmh < Settings.OvertakeLowestSpeed)))
            {
                IsCheckOverSpeed = true;
                CheckRule(true, DeductionRuleCodes.RC30116);
            }

            //达到一次速度
            if (Settings.OvertakeSpeedOnce > 10)
            {
                if (signalInfo.SpeedInKmh > Settings.OvertakeSpeedOnce)
                {
                    _reachSpeedSet.Enqueue(signalInfo.SpeedInKmh);
                }
                if (_reachSpeedSet.Count > 30)
                {
                    _reachSpeedSet.Dequeue();
                }
            }


            //检测是否低于规定速度

            //Logger.InfoFormat("OverTakeTest {0}", OvertakeStepState.ToString());
            //检测开始超车转向角度
            //如果角度大于0
            if (Settings.OvertakeChangeLanesAngle > 0)
            {
                if (OvertakeStepState == OvertakeStep.None)
                {
                    if (signalInfo.BearingAngle.IsValidAngle() &&
                        !GeoHelper.IsBetweenDiffAngle(signalInfo.BearingAngle, StartAngle, Settings.OvertakeChangeLanesAngle))
                    {
                        //设置开始变道时的距离(由于评判转向灯太快,所以延后大概1秒)
                        if (!StartChangingLanesDistance.HasValue)
                        {
                            StartChangingLanesDistance = signalInfo.Distance;
                        }

                        //变道摆正10米后才开始评判
                        if (signalInfo.Distance - StartChangingLanesDistance.Value < 10)
                        {
                            return;
                        }

                        //设置开始变道时的距离
                        OvertakeStepState = OvertakeStep.StartChangeLanesToLeft;

                        if (Settings.OvertakeLightCheck && !IsCheckedOvertakeLeftLight)
                        {
                            IsCheckedOvertakeLeftLight = true;
                            //超车,左转向灯,或者右灯判错
                            if (!CarSignalSet.Query(StartTime).Any(d => d.Sensor.LeftIndicatorLight))
                            {
                                CheckRule(true, DeductionRuleCodes.RC30205, DeductionRuleCodes.SRC3020504);
                            }
                            else
                            {
                                if (!AdvancedSignal.CheckOperationAheadSeconds(x => x.Sensor.LeftIndicatorLight, StartTime, Settings.TurnLightAheadOfTime))
                                {
                                    BreakRule(DeductionRuleCodes.RC30206, DeductionRuleCodes.SRC3020604);
                                }
                            }
                        }

                        //判断一下是否有点客户不需要返回原车道
                    }
                }
                else if (OvertakeStepState == OvertakeStep.StartChangeLanesToLeft)
                {
                    //当开始变道后向前行驶15米则认为变道成功
                    if (signalInfo.Distance - StartChangingLanesDistance >= OvertakeChangingLanesSuccessOrBackToOriginalLanceDistance &&
                        signalInfo.BearingAngle.IsValidAngle())
                    {
                        //路径
                        //
                        OvertakeStepState     = OvertakeStep.EndChangeLanesToLeft;
                        StartChangeLanesAngle = signalInfo.BearingAngle;

                        //如果设置了不需要返回原车道

                        if (!Settings.OvertakeBackToOriginalLane)
                        {
                            OvertakeStepState = OvertakeStep.EndChangeLanesToRight;
                        }
                        else
                        {
                            Speaker.PlayAudioAsync(Settings.OvertakeBackToOriginalLaneVocie);
                        }
                    }
                }
                else if (OvertakeStepState == OvertakeStep.EndChangeLanesToLeft)
                {
                    if (signalInfo.BearingAngle.IsValidAngle() && !GeoHelper.IsBetweenDiffAngle(signalInfo.BearingAngle, StartChangeLanesAngle, Settings.OvertakeChangeLanesAngle))
                    {
                        OvertakeStepState = OvertakeStep.EndChangeLanesToRight;
                        if (Settings.OvertakeLightCheck && !IsCheckedOvertakeRightLight)
                        {
                            IsCheckedOvertakeRightLight = true;
                            if (!CarSignalSet.Query(StartTime).Any(d => d.Sensor.RightIndicatorLight))
                            {
                                BreakRule(DeductionRuleCodes.RC30205, DeductionRuleCodes.SRC3020504);
                            }
                            else
                            {
                                if (!AdvancedSignal.CheckOperationAheadSeconds(x => x.Sensor.RightIndicatorLight, StartTime, Settings.TurnLightAheadOfTime))
                                {
                                    BreakRule(DeductionRuleCodes.RC30205, DeductionRuleCodes.SRC3020506);
                                }
                            }
                        }
                    }
                }
                else if (OvertakeStepState == OvertakeStep.EndChangeLanesToRight)
                {
                    //结束考试项目
                    //StopCore();
                    IsSuccess = true;
                    return;
                }
            }
            else
            {
                //表示客户其实只关心打灯问题
                //简单的处理 如果打右转灯之前没有打过左转灯则扣分
                if (signalInfo.Sensor.RightIndicatorLight && !IsCheckedOvertakeLeftLight)
                {
                    //如果没有打左转灯就扣分
                    if (!AdvancedSignal.CheckOperationAheadSeconds(x => x.Sensor.LeftIndicatorLight, StartTime, Settings.TurnLightAheadOfTime))
                    {
                        //CheckRule(true, DeductionRuleCodes.RC30205, DeductionRuleCodes.SRC3020504);
                        //只有泸州版本才这样
                        //todo:之所以不分出来 是觉得其实全国所有的版本都可以这样做
                        if (DataBase.VersionNumber.Contains("泸州"))
                        {
                            BreakRule(DeductionRuleCodes.RC30205, DeductionRuleCodes.SRC3020506);
                        }
                        else
                        {
                            BreakRule(DeductionRuleCodes.RC30205, DeductionRuleCodes.SRC3020504);
                        }

                        // BreakRule(DeductionRuleCodes.RC30205, DeductionRuleCodes.SRC3020504);
                        IsCheckedOvertakeLeftLight = true;
                    }
                }
                //    if (signalInfo.Sensor.RightIndicatorLight)
                //    {
                //        IsCheckedOvertakeLeftLight = true;
                //        CheckRule(tru

                IsSuccess = true;
            }



            base.ExecuteCore(signalInfo);
        }
Esempio n. 3
0
        protected override void ExecuteCore(CarSignalInfo signalInfo)
        {
            if (!IsLoudSpeakerCheck && signalInfo.Sensor.Loudspeaker)
            {
                IsLoudSpeakerCheck = true;
            }
            //过滤10m
            if (!isOverPrepareDistance)
            {
                //超车10米后才评判
                if (signalInfo.Distance - StartDistance < Settings.OvertakePrepareDistance)
                {
                    return;
                }
                if (signalInfo.BearingAngle.IsValidAngle())
                {
                    isOverPrepareDistance = true;
                    StartAngle            = signalInfo.BearingAngle;
                }
                return;
            }
            //检测是否超速
            if (Settings.OvertakeSpeedLimit > 0 && signalInfo.SpeedInKmh > Settings.OvertakeSpeedLimit)
            {
                Logger.Error("OvertakeSpeedLimitOver" + signalInfo.SpeedInKmh.ToString());
                //CheckRule(true, DeductionRuleCodes.RC30116);
            }

            if (Settings.OvertakeLowestSpeed > 0 && signalInfo.SpeedInKmh < Settings.OvertakeLowestSpeed)
            {
                Logger.Error("OvertakeSpeedLimitLow" + signalInfo.SpeedInKmh.ToString());
                // CheckRule(true, DeductionRuleCodes.RC30116);
            }

            //检测是否低于规定速度

            //Logger.InfoFormat("OverTakeTest {0}", OvertakeStepState.ToString());
            //检测开始超车转向角度
            if (OvertakeStepState == OvertakeStep.None)
            {
                if (signalInfo.BearingAngle.IsValidAngle() &&
                    !GeoHelper.IsBetweenDiffAngle(signalInfo.BearingAngle, StartAngle, Settings.OvertakeChangeLanesAngle))
                {
                    //设置开始变道时的距离
                    OvertakeStepState          = OvertakeStep.StartChangeLanesToLeft;
                    StartChangingLanesDistance = signalInfo.Distance;

                    if (Settings.OvertakeLightCheck && !IsCheckedOvertakeLeftLight)
                    {
                        IsCheckedOvertakeLeftLight = true;
                        //超车,左转向灯
                        if (!CarSignalSet.Query(StartTime).Any(d => d.Sensor.LeftIndicatorLight))
                        {
                            BreakRule(DeductionRuleCodes.RC30205, DeductionRuleCodes.SRC3020504);
                        }
                        else
                        {
                            if (!AdvancedSignal.CheckOperationAheadSeconds(x => x.Sensor.LeftIndicatorLight, StartTime, Settings.TurnLightAheadOfTime))
                            {
                                BreakRule(DeductionRuleCodes.RC30206, DeductionRuleCodes.SRC3020604);
                            }
                        }
                    }

                    //判断一下是否有点客户不需要返回原车道
                }
            }
            else if (OvertakeStepState == OvertakeStep.StartChangeLanesToLeft)
            {
                //当开始变道后向前行驶15米则认为变道成功
                if (signalInfo.Distance - StartChangingLanesDistance >= OvertakeChangingLanesSuccessOrBackToOriginalLanceDistance &&
                    signalInfo.BearingAngle.IsValidAngle())
                {
                    //路径
                    //
                    OvertakeStepState     = OvertakeStep.EndChangeLanesToLeft;
                    StartChangeLanesAngle = signalInfo.BearingAngle;

                    //如果设置了不需要返回原车道
                    if (!Settings.OvertakeBackToOriginalLane)
                    {
                        OvertakeStepState = OvertakeStep.EndChangeLanesToRight;
                    }
                    else
                    {
                        Speaker.PlayAudioAsync(Settings.OvertakeBackToOriginalLaneVocie);
                    }
                }
            }
            else if (OvertakeStepState == OvertakeStep.EndChangeLanesToLeft)
            {
                if (!GeoHelper.IsBetweenDiffAngle(signalInfo.BearingAngle, StartChangeLanesAngle, Settings.OvertakeChangeLanesAngle))
                {
                    OvertakeStepState = OvertakeStep.EndChangeLanesToRight;
                    if (Settings.OvertakeLightCheck && !IsCheckedOvertakeRightLight)
                    {
                        IsCheckedOvertakeRightLight = true;
                        if (!CarSignalSet.Query(StartTime).Any(d => d.Sensor.RightIndicatorLight))
                        {
                            BreakRule(DeductionRuleCodes.RC30205, DeductionRuleCodes.SRC3020504);
                        }
                        else
                        {
                            if (!AdvancedSignal.CheckOperationAheadSeconds(x => x.Sensor.RightIndicatorLight, StartTime, Settings.TurnLightAheadOfTime))
                            {
                                BreakRule(DeductionRuleCodes.RC30206, DeductionRuleCodes.SRC3020604);
                            }
                        }
                    }
                }
            }
            else if (OvertakeStepState == OvertakeStep.EndChangeLanesToRight)
            {
                //结束考试项目
                //StopCore();
                IsSuccess = true;
                return;
            }



            base.ExecuteCore(signalInfo);
        }