示例#1
0
        protected void ChangeLineAngleCheck(CarSignalInfo signalInfo)
        {
            //由于停车和起步的时候会报触发规则,所以过滤
            //全程变道最低速度

            if (signalInfo.SpeedInKmh < 10)
            {
                return;
            }
            //过滤掉变更车道和会车,超车,掉头,左转,右转,起步,靠边停车
            if (tempExamitemSkip)
            {
                return;
            }
            //因为掉头,变道,角度达到就结束了,太快,所以延迟15s
            if (tempExamItem && finishTime.HasValue)
            {
                if ((DateTime.Now - finishTime.Value).TotalSeconds > 15)
                {
                    finishTime            = null;
                    tempExamItem          = false;
                    StartChangeLanesAngle = signalInfo.BearingAngle;
                }
                else
                {
                    return;
                }
            }
            //播报后进行延时
            if (IsChangeLineSpeak)
            {
                if ((DateTime.Now - delayDateTime).TotalSeconds > 12)
                {
                    IsChangeLineSpeak = false;
                    //重置角度
                    RecordSignalCount     = 0;
                    RecordSignalTime      = DateTime.Now;
                    StartChangeLanesAngle = signalInfo.BearingAngle;
                }
                else
                {
                    //重置角度
                    RecordSignalCount     = 0;
                    RecordSignalTime      = DateTime.Now;
                    StartChangeLanesAngle = signalInfo.BearingAngle;
                    return;
                }
            }
            RecordSignalCount++;
            if (!RecordSignalTime.HasValue)
            {
                RecordSignalTime = DateTime.Now;
            }
            //过滤掉大于30度的跳动
            if (GeoHelper.GetDiffAngle(StartChangeLanesAngle, signalInfo.BearingAngle) > 30)
            {
                StartChangeLanesAngle = signalInfo.BearingAngle;
                return;
            }
            //判断车辆是否在进行变道
            if ((DateTime.Now - RecordSignalTime.Value).TotalSeconds >= Settings.CommonExamItemsChangeLanesTimeOut && IsChangeLineSpeak == false && signalInfo.BearingAngle.IsValidAngle() &&
                StartChangeLanesAngle.IsValidAngle() &&
                !GeoHelper.IsBetweenDiffAngle(signalInfo.BearingAngle, StartChangeLanesAngle, Settings.CommonExamItemsChangeLanesAngle))
            {
                //if (!signalInfo.Sensor.LeftIndicatorLight || !signalInfo.Sensor.RightIndicatorLight)
                if (!CarSignalSet.Query(DateTime.Now - TimeSpan.FromSeconds(12)).Any(d => d.Sensor.LeftIndicatorLight ||
                                                                                     d.Sensor.RightIndicatorLight))
                {
                    delayDateTime         = DateTime.Now;
                    IsChangeLineSpeak     = true;
                    RecordSignalCount     = 0;
                    RecordSignalTime      = null;
                    StartChangeLanesAngle = signalInfo.BearingAngle;
                    BreakRule(DeductionRuleCodes.RC30205, DeductionRuleCodes.SRC3020503);
                }
                else
                {
                    delayDateTime     = DateTime.Now;
                    IsChangeLineSpeak = true;

                    //转向灯是否超过3秒,检测12秒前
                    var leftLight = AdvancedSignal.CheckOperationAheadSeconds(x => x.Sensor.LeftIndicatorLight, DateTime.Now - TimeSpan.FromSeconds(12), Settings.TurnLightAheadOfTime);;
                    if (leftLight)
                    {
                        return;
                    }

                    var rightLight = AdvancedSignal.CheckOperationAheadSeconds(x => x.Sensor.RightIndicatorLight, DateTime.Now - TimeSpan.FromSeconds(12), Settings.TurnLightAheadOfTime);;
                    if (rightLight)
                    {
                        return;
                    }

                    BreakRule(DeductionRuleCodes.RC30206, DeductionRuleCodes.SRC3020603);
                }
            }

            if (RecordSignalTime != null && (DateTime.Now - RecordSignalTime.Value).TotalSeconds > Settings.CommonExamItemsChangeLanesTimeOut)
            {
                //重置角度
                RecordSignalTime      = null;
                StartChangeLanesAngle = signalInfo.BearingAngle;
            }
        }