From e021e593c56c3338ddddd35d7817ef6cd2fa504b Mon Sep 17 00:00:00 2001
From: fctom1215 <fctom1215@outlook.com>
Date: 星期日, 15 三月 2020 22:55:22 +0800
Subject: [PATCH] 完善车辆信号测试。

---
 lib/src/main/cpp/driver_test.cpp |  108 +++++++++++++++++++++++++++++-------------------------
 1 files changed, 58 insertions(+), 50 deletions(-)

diff --git a/lib/src/main/cpp/driver_test.cpp b/lib/src/main/cpp/driver_test.cpp
index 91672cc..8d94ecf 100644
--- a/lib/src/main/cpp/driver_test.cpp
+++ b/lib/src/main/cpp/driver_test.cpp
@@ -89,6 +89,7 @@
 static int CurrEnterMapIndex = -1;
 
 static int CurrExamStatus = EXAM_AREA_NONE;      // 1 娴嬭瘯瀹屾垚 0 娴嬭瘯涓� -1 娴嬭瘯閿欒閫�鍑�
+static int exam_dummy_light;
 
 static car_model *CarModel = NULL;
 static car_model *CarModelPrev = NULL;
@@ -96,6 +97,9 @@
 static struct dummy_light_exam *DummyLightContent;
 static int DummyLightContentSize;
 static bool engineRuning = false;
+const int ENGINE_MIN_ROTATE = 200;
+static bool engineStart = false;
+static bool engineStartTimeout = false;
 
 #define MOV_AVG_SIZE                1
 #define RTK_BUFFER_SIZE            100
@@ -105,6 +109,8 @@
 static int RtkBufferNum = 0, RtkBufferIn = 0;
 
 static void DetectEnterOrExitMap(void);
+static void EngineStartHold(union sigval sig);
+static void ExecuteExam(const struct RtkTime* rtkTime);
 static void ExecuteExam(double speed, int move, double azimuth, const struct RtkTime* rtkTime);
 static uint32_t CalcTimeDiff(const rtk_info *a, const rtk_info *b);
 static void ReadDriverExamPrimerTimeout(union sigval sig);
@@ -332,8 +338,6 @@
     for (int i = 0; i < n; i++) {
         DummyLightContent[i] = cfg[i];
     }
-
-    StartDummyLightExam(DummyLightContent, DummyLightContentSize);
 }
 
 void StartDriverExam(int start, int type)
@@ -374,7 +378,7 @@
             reportSeatbeltEject = false;
 
             if (type == TEST_TYPE_ROAD_DUMMY_LIGHT) {
-                StartDummyLightExam(DummyLightContent, DummyLightContentSize);
+                exam_dummy_light = 0;
             }
         }
         MA_SendExamStatus(1, 0);
@@ -510,7 +514,56 @@
 
 static void ExecuteExam(const struct RtkTime* rtkTime)
 {
+    if (ReadCarStatus(ENGINE_RPM) < ENGINE_MIN_ROTATE) {
+        if (engineRuning) {
+            engineRuning = false;
+            if (ExamType == TEST_TYPE_AREA) {
+                // 鐔勭伀1娆★紝鎵�10鍒�
+                AddExamFault(5, rtkTime);
+            } else {
+                AddExamFault(20, rtkTime);
+            }
+        }
+    } else {
+        engineRuning = true;
+    }
 
+    if (ReadCarStatus(ENGINE_START) == ENGINE_START_ACTIVE) {
+        if (!engineStart) {
+            engineStart = true;
+            if (ReadCarStatus(SHIFT) != 'N') {
+                // 涓嶆槸绌烘尅鐐圭伀锛屼笉鍚堟牸
+                if (ExamType == TEST_TYPE_AREA)
+                    AddExamFault(3, rtkTime);
+                else
+                    AddExamFault(4, rtkTime);
+            }
+            AppTimer_delete(EngineStartHold);
+            AppTimer_add(EngineStartHold, D_SEC(2));
+        }
+    } else if (engineStart) {
+        engineStart = false;
+        AppTimer_delete(EngineStartHold);
+    }
+
+    if (engineStartTimeout) {
+        engineStartTimeout = false;
+
+        // 涓嶅強鏃舵澗寮�鍚姩寮�鍏筹紝鎵�10鍒�
+        if (ExamType == TEST_TYPE_AREA)
+            AddExamFault(4, rtkTime);
+    }
+
+    if (ExamType == TEST_TYPE_ROAD_DUMMY_LIGHT) {
+        if (exam_dummy_light == 0) {
+            StartDummyLightExam(DummyLightContent, DummyLightContentSize, rtkTime);
+            exam_dummy_light = 1;
+            // 姹囨姤鐏厜鑰冭瘯寮�濮�
+        } else if (exam_dummy_light == 1) {
+            exam_dummy_light = ExecuteDummyLightExam(rtkTime);
+            // 姹囨姤鐏厜鑰冭瘯缁撴潫
+        }
+    }
 }
 
 static void ExecuteExam(double speed, int move, double azimuth, const struct RtkTime* rtkTime)
@@ -607,53 +660,8 @@
 static void EngineStartHold(union sigval sig) {
     AppTimer_delete(EngineStartHold);
 
-    // 涓嶅強鏃舵澗寮�鍚姩寮�鍏筹紝鎵�10鍒�
-    if (ReadSensor(SENSOR_ENGINE_START) == 1 && ExamStart) {
-        if (ExamType == TEST_TYPE_AREA)
-            AddExamFault(4, &rtkClock);
-    }
-}
-
-void SensorChanged(int *sensorId, int *sensorValue, int num)
-{
-    const int ENGINE_MIN_ROTATE = 200;
-
-    for (int i = 0; i < num; ++i) {
-        switch (sensorId[i]) {
-            case SENSOR_SEATBELT:
-                break;
-            case SENSOR_ENGINE_START:
-                AppTimer_delete(EngineStartHold);
-
-                if (sensorValue[i] == 1) {
-                    if (ReadSensor(SENSOR_SHIFT_N) == 0) {
-                        // 涓嶆槸绌烘尅鐐圭伀锛屼笉鍚堟牸
-                        if (ExamType == TEST_TYPE_AREA)
-                            AddExamFault(3, &rtkClock);
-                        else
-                            AddExamFault(4, &rtkClock);
-                    }
-                    AppTimer_add(EngineStartHold, D_SEC(2));
-                }
-                break;
-            case SENSOR_ENGINE_RPM:
-                if (sensorValue[i] < ENGINE_MIN_ROTATE) {
-                    if (engineRuning) {
-                        engineRuning = false;
-                        if (ExamType == TEST_TYPE_AREA) {
-                            // 鐔勭伀1娆★紝鎵�10鍒�
-                            AddExamFault(5, &rtkClock);
-                        } else {
-                            AddExamFault(20, &rtkClock);
-                        }
-                    }
-                } else {
-                    engineRuning = true;
-                }
-                break;
-            default:
-                break;
-        }
+    if (ReadCarStatus(ENGINE_START) == ENGINE_START_ACTIVE) {
+        engineStartTimeout = true;
     }
 }
 

--
Gitblit v1.8.0