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); }
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); }
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); }