From dc2a01d4764efd33a23afcaf4f1d7543dc35c4fa Mon Sep 17 00:00:00 2001
From: fctom1215 <fctom1215@outlook.com>
Date: 星期三, 19 二月 2020 15:32:57 +0800
Subject: [PATCH] 上坡地图修正

---
 lib/src/main/cpp/test_items/comm_test.cpp |  156 ++++++++++++++++++++++++++++++++++++++++++++--------
 1 files changed, 132 insertions(+), 24 deletions(-)

diff --git a/lib/src/main/cpp/test_items/comm_test.cpp b/lib/src/main/cpp/test_items/comm_test.cpp
index 3ea8099..3ca6c44 100644
--- a/lib/src/main/cpp/test_items/comm_test.cpp
+++ b/lib/src/main/cpp/test_items/comm_test.cpp
@@ -5,20 +5,37 @@
 #include "comm_test.h"
 #include "../driver_test.h"
 #include "../defs.h"
+#include "../common/apptimer.h"
 
 static bool seatbeltInsert;
 static bool engineStart;
 
 const int ENGINE_MIN_ROTATE = 200;
 
+static bool commTest = false;
 static uint16_t gpioStore = 0;
-static uint16_t engineStore = 0;
 
-static void SensorChange(int index, bool value);
+static void SensorChange(int gpio, bool value);
+static void EngineStartHold(union sigval sig);
 
-void CommTestStart(void)
+void CommTestInit(void)
 {
-    gpioStore = engineStore = 0;
+    gpioStore = 0;
+    engineStart = true;
+    commTest = false;
+}
+
+void CommTestStart(bool start)
+{
+    commTest = start;
+    if (start) {
+        // 妫�鏌ュ畨鍏ㄥ甫
+        if (CheckSensorX(SEATBELT) == 0) {
+            struct RtkTime rt;
+            GetRtkClock(&rt);
+            AddExamFault(1, &rt);
+        }
+    }
 }
 
 void UpdateSensor(uint16_t gpio, uint16_t speed, uint16_t engine)
@@ -27,37 +44,128 @@
 
     uint16_t chg = gpioStore^gpio;
 
-    if (chg == 0)
-        return;
+    gpioStore = gpio;
 
-    for (int i = 0; i < 16; ++i) {
-        if (chg & BV(i)) {
-            SensorChange(i, (bool)(gpio & BV(i)));
+    if (commTest) {
+        for (int i = 0; i < 16; ++i) {
+            if (chg & BV(i)) {
+                SensorChange(i, (bool) (gpio & BV(i)));
+            }
         }
     }
 
-    gpioStore = gpio;
-
-
-
-    // 瀹夊叏甯�
-
-    // 鎸′綅
-
-    // 鍚姩鎸囩ず
-
-    // 鐔勭伀鐩戞帶
+    if (engine < ENGINE_MIN_ROTATE) {
+        if (engineStart) {
+            if (commTest) {
+                // 鐔勭伀1娆★紝鎵�10鍒�
+                struct RtkTime rt;
+                GetRtkClock(&rt);
+                AddExamFault(5, &rt);
+            }
+            engineStart = false;
+        }
+    } else {
+        engineStart = true;
+    }
 }
 
-static void SensorChange(int index, bool value)
+int CheckSensorX(int func)
+{
+    int gpio;
+    bool level;
+    int validLevel = GetSensorValidLevel();
+
+    // 浼犳劅鍣ㄦ棤鏁堬紝璁や负閫氳繃
+    switch (func) {
+        case SEATBELT:
+            FindSensorCfg(SENSOR_SEATBELT, gpio, level);
+            if (gpio >= 0 && (gpioStore & BV(gpio)) != (validLevel & BV(gpio)) ) {
+                return 0;
+            }
+            return 1;
+        case LEFT_TURN_SIGNAL:
+            FindSensorCfg(SENSOR_LEFT_TURN_SIGNAL, gpio, level);
+            if (gpio == -1 || (gpioStore & BV(gpio)) == (validLevel & BV(gpio)) ) {
+                return 1;
+            }
+            return 0;
+        case RIGHT_TURN_SIGNAL:
+            FindSensorCfg(SENSOR_RIGHT_TURN_SIGNAL, gpio, level);
+            if (gpio == -1 || (gpioStore & BV(gpio)) == (validLevel & BV(gpio)) ) {
+                return 1;
+            }
+            return 0;
+        case HANDBREAK:
+            FindSensorCfg(SENSOR_HANDBREAK, gpio, level);
+            if (gpio == -1 || (gpioStore & BV(gpio)) == (validLevel & BV(gpio)) ) {
+                return 1;
+            }
+            return 0;
+        case SHIFT:
+            FindSensorCfg(SENSOR_SHIFT_N, gpio, level);
+            if (gpio == -1 || (gpioStore & BV(gpio)) == (validLevel & BV(gpio))) {
+                return 'N';
+            }
+            return 0;
+        default:
+            break;
+    }
+
+    return -1;
+}
+
+static void EngineStartHold(union sigval sig) {
+    AppTimer_delete(EngineStartHold);
+
+    // 涓嶅強鏃舵澗寮�鍚姩寮�鍏筹紝鎵�10鍒�
+    struct RtkTime rt;
+    GetRtkClock(&rt);
+    AddExamFault(4, &rt);
+}
+
+static void SensorChange(int gpio, bool value)
 {
     int func;
+    bool level;
+
+    GetSensorCfg(gpio, func, level);
 
     switch (func) {
         case SENSOR_SEATBELT:
-            break;
-        case SENSOR_TURNRIGHT:
-            break;
+            if (level != value) {
+                // 涓嶄娇鐢ㄥ畨鍏ㄥ甫锛屼笉鍚堟牸
+                seatbeltInsert = false;
 
+                struct RtkTime rt;
+                GetRtkClock(&rt);
+                AddExamFault(1, &rt);
+            } else {
+                seatbeltInsert = true;
+            }
+            break;
+        case SENSOR_RIGHT_TURN_SIGNAL:
+            break;
+        case SENSOR_LEFT_TURN_SIGNAL:
+            break;
+        case SENSOR_HANDBREAK:
+            break;
+        case SENSOR_ENGINE_START:
+            AppTimer_delete(EngineStartHold);
+            if (level == value) {
+                AppTimer_add(EngineStartHold, D_SEC(2));
+
+                // 妫�鏌ユ槸鍚﹀湪绌烘尅
+                if (CheckSensorX(SHIFT) != 'N') {
+                    // 涓嶆槸绌烘尅鐐圭伀锛屼笉鍚堟牸
+                    struct RtkTime rt;
+                    GetRtkClock(&rt);
+                    AddExamFault(3, &rt);
+                }
+            } else {
+
+            }
+            break;
+        default:
+            break;
     }
 }

--
Gitblit v1.8.0