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 +++++++++++----------
 lib/src/main/cpp/test_common/car_sensor.h     |    5 
 lib/src/main/cpp/test_items2/dummy_light.cpp  |   94 ++++++++++++++++--
 lib/src/main/cpp/test_items2/dummy_light.h    |   20 +++
 lib/src/main/cpp/test_items2/common_check.cpp |   12 +-
 lib/src/main/cpp/test_common/car_sensor.cpp   |    3 
 6 files changed, 171 insertions(+), 71 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;
     }
 }
 
diff --git a/lib/src/main/cpp/test_common/car_sensor.cpp b/lib/src/main/cpp/test_common/car_sensor.cpp
index 2a8e020..d053ad9 100644
--- a/lib/src/main/cpp/test_common/car_sensor.cpp
+++ b/lib/src/main/cpp/test_common/car_sensor.cpp
@@ -244,14 +244,13 @@
                 WriteCarStatus(MAIN_BEAM_LAMP, MAIN_BEAM_LIGHT);
             }
 
-            if (flashMainBeamCnt > 3) {         // 浜�-鐏�-浜�-鐏�
+            if (++flashMainBeamCnt > 3) {         // 浜�-鐏�-浜�-鐏�
                 WriteCarStatus(FLASH_BEAM_LAMP, FLASH_BEAM_LIGHT);
 
                 AppTimer_delete(flashBeamLightClose);
                 AppTimer_add(flashBeamLightClose, D_SEC(5));
             }
 
-            flashMainBeamCnt++;
             AppTimer_delete(confirmFlashBeamLightLater);
             AppTimer_add(confirmFlashBeamLightLater, D_SEC(3));
             break;
diff --git a/lib/src/main/cpp/test_common/car_sensor.h b/lib/src/main/cpp/test_common/car_sensor.h
index 5d85ea7..0350fd9 100644
--- a/lib/src/main/cpp/test_common/car_sensor.h
+++ b/lib/src/main/cpp/test_common/car_sensor.h
@@ -18,12 +18,14 @@
     FLASH_BEAM_LAMP,
     MAIN_BEAM_LAMP,
     SEATBELT,
+    ENGINE_START,
     CAR_STATUS_END
 };
 
 enum {
     OFF_LIGHT = 0,
     EJECT_SEATBELT = 0,
+    ENGINE_START_INACTIVE = 0,
     HAZARD_LIGHTS,
     LEFT_TURN_LIGHT,
     RIGHT_TURN_LIGHT,
@@ -32,7 +34,8 @@
     MAIN_BEAM_LIGHT,
     FLASH_BEAM_LIGHT,
     FOG_LIGHT,
-    INSERT_SEATBELT
+    INSERT_SEATBELT,
+    ENGINE_START_ACTIVE
 };
 
 void CarSensorInit(void);
diff --git a/lib/src/main/cpp/test_items2/common_check.cpp b/lib/src/main/cpp/test_items2/common_check.cpp
index d4e483b..3dde24c 100644
--- a/lib/src/main/cpp/test_items2/common_check.cpp
+++ b/lib/src/main/cpp/test_items2/common_check.cpp
@@ -20,14 +20,14 @@
 
         if (prevMoveDirect == 0) {
             // 璧锋鎸傞敊鎸★紝涓嶅悎鏍�
-            if (ReadSensor(SENSOR_SHIFT_1) != 1) {
-                AddExamFault(19, rtkTime);
-            }
+//            if (ReadSensor(SENSOR_SHIFT_1) != 1) {
+//                AddExamFault(19, rtkTime);
+//            }
 
             // 璧锋娌℃湁鍏抽棴杞﹂棬锛屼笉鍚堟牸
-            if (ReadSensor(SENSOR_DOOR) != 1) {
-                AddExamFault(23, rtkTime);
-            }
+//            if (ReadSensor(SENSOR_DOOR) != 1) {
+//                AddExamFault(23, rtkTime);
+//            }
 
             // 鍚庢粦鍒ゆ柇
 
diff --git a/lib/src/main/cpp/test_items2/dummy_light.cpp b/lib/src/main/cpp/test_items2/dummy_light.cpp
index c25c199..83d3ee1 100644
--- a/lib/src/main/cpp/test_items2/dummy_light.cpp
+++ b/lib/src/main/cpp/test_items2/dummy_light.cpp
@@ -7,46 +7,119 @@
 #include "dummy_light.h"
 #include "../native-lib.h"
 #include "../jni_log.h"
+#include "../test_common/car_sensor.h"
 
 #define DEBUG(fmt, args...)     LOGD("<dummy_light> <%s>: " fmt, __func__, ##args)
 
+static struct RtkTime currRtkTime;
 static struct dummy_light_exam *content;
 static int contentNum;
 static int currContent;
+static int checkCnt;
+static bool turn_left_active, flash_beam_active;
 
-static void DummyLightCheckLight(union sigval sig);
+static void DummyLightCheckActive(union sigval sig);
 static void ExamDummyLight(union sigval sig);
 
-void StartDummyLightExam(struct dummy_light_exam *ptr, int num)
+void StartDummyLightExam(struct dummy_light_exam *ptr, int num, const struct RtkTime* rtkTime)
 {
     DEBUG("StartDummyLightExam");
     content = ptr;
     contentNum = num;
     currContent = 0;
+    currRtkTime = *rtkTime;
 
-    AppTimer_delete(DummyLightCheckLight);
+    AppTimer_delete(DummyLightCheckActive);
     AppTimer_delete(ExamDummyLight);
     AppTimer_add(ExamDummyLight, D_SEC(2));
+}
+
+int ExecuteDummyLightExam(const struct RtkTime* rtkTime)
+{
+    currRtkTime = *rtkTime;
+    return (currContent == contentNum)?2:1;
 }
 
 void DummyLightTTSDone(int id)
 {
     DEBUG("DummyLightTTSDone %d", id);
-
+    // 绛夎闊虫挱鎶ュ畬姣曞悗璁℃椂
     if (id == 100) {
-        AppTimer_add(DummyLightCheckLight, D_SEC(3), id);
+        AppTimer_add(DummyLightCheckActive, D_SEC(3), id);
     } else if (id == 101) {
-        AppTimer_add(DummyLightCheckLight, D_SEC(1), id);
+        AppTimer_add(DummyLightCheckActive, D_SEC(1), id);
+    } else if (id == OVERTAKE) {
+        checkCnt = 0;
+        turn_left_active = flash_beam_active = false;
+        AppTimer_add(DummyLightCheckActive, D_SEC(1), id);
     } else {
-        AppTimer_add(DummyLightCheckLight, D_SEC(5), id);
+        AppTimer_add(DummyLightCheckActive, D_SEC(5), id);
     }
 }
 
-static void DummyLightCheckLight(union sigval sig)
+static void DummyLightCheckActive(union sigval sig)
 {
-    AppTimer_delete(DummyLightCheckLight);
+    AppTimer_delete(DummyLightCheckActive);
 
-    DEBUG("DummyLightCheckLight %d", sig.sival_int);
+    DEBUG("DummyLightCheckActive %d", sig.sival_int);
+
+    switch (sig.sival_int) {
+        case DRIVE_AT_NIGHT:
+        case TURN_ON_MAIN_BEAM_LAMP:
+            if (ReadCarStatus(MAIN_BEAM_LAMP) != MAIN_BEAM_LIGHT) {
+                AddExamFault(58, &currRtkTime);
+            }
+            break;
+        case TURN_ON_DIPPED_LAMP:
+        case BRIDGE_MEET_CAR:
+        case FOLLOW_CAR:
+            if (ReadCarStatus(DIPPED_BEAM_LAMP) != DIPPED_BEAM_LIGHT) {
+                AddExamFault(58, &currRtkTime);
+            }
+            break;
+        case DRIVE_IN_FOG:
+            if (ReadCarStatus(FOG_LAMP) != FOG_LIGHT) {
+                AddExamFault(58, &currRtkTime);
+            }
+            break;
+        case THROUGE_CROSSWALK:
+        case THROUGE_CURVE:
+        case THROUGE_CROSSROADS:
+            if (ReadCarStatus(FLASH_BEAM_LAMP) != FLASH_BEAM_LIGHT) {
+                AddExamFault(58, &currRtkTime);
+            }
+            break;
+        case OVERTAKE:
+            if (++checkCnt < 5) {
+                if (!flash_beam_active) {
+                    if (ReadCarStatus(TURN_SIGNAL_LAMP) == LEFT_TURN_LIGHT) {
+                        turn_left_active = true;
+                    }
+                }
+                if (turn_left_active) {
+                    if (ReadCarStatus(FLASH_BEAM_LAMP) == FLASH_BEAM_LIGHT) {
+                        flash_beam_active = true;
+                    }
+                }
+                AppTimer_add(DummyLightCheckActive, D_SEC(1), OVERTAKE);
+                return;
+            } else {
+                if (!flash_beam_active || !turn_left_active) {
+                    AddExamFault(58, &currRtkTime);
+                }
+            }
+            break;
+        case CAR_FAULT:
+        case PARK_CAR_TEMP:
+            if (ReadCarStatus(TURN_SIGNAL_LAMP) != HAZARD_LIGHTS) {
+                AddExamFault(58, &currRtkTime);
+            }
+            break;
+        default:
+            break;
+    }
+
+    AppTimer_add(ExamDummyLight, D_SEC(1));
 }
 
 static void ExamDummyLight(union sigval sig)
@@ -58,6 +131,5 @@
 
         PlayTTS(content[currContent].tts, content[currContent].item);
         currContent++;
-        AppTimer_add(ExamDummyLight, D_SEC(5));
     }
 }
diff --git a/lib/src/main/cpp/test_items2/dummy_light.h b/lib/src/main/cpp/test_items2/dummy_light.h
index 34bc315..8f481d2 100644
--- a/lib/src/main/cpp/test_items2/dummy_light.h
+++ b/lib/src/main/cpp/test_items2/dummy_light.h
@@ -5,12 +5,30 @@
 #ifndef MYAPPLICATION2_DUMMY_LIGHT_H
 #define MYAPPLICATION2_DUMMY_LIGHT_H
 
+#include "../driver_test.h"
+
+enum {
+    TURN_ON_DIPPED_LAMP = 1,
+    DRIVE_AT_NIGHT,
+    BRIDGE_MEET_CAR,
+    TURN_ON_MAIN_BEAM_LAMP,
+    FOLLOW_CAR,
+    DRIVE_IN_FOG,
+    THROUGE_CROSSWALK,
+    CAR_FAULT,
+    THROUGE_CURVE,
+    THROUGE_CROSSROADS,
+    PARK_CAR_TEMP,
+    OVERTAKE
+};
+
 struct dummy_light_exam {
     int item;
     char tts[512];
 };
 
-void StartDummyLightExam(struct dummy_light_exam *ptr, int num);
+void StartDummyLightExam(struct dummy_light_exam *ptr, int num, const struct RtkTime* rtkTime);
+int ExecuteDummyLightExam(const struct RtkTime* rtkTime);
 void DummyLightTTSDone(int id);
 
 #endif //MYAPPLICATION2_DUMMY_LIGHT_H

--
Gitblit v1.8.0