From 6d6f675d0bf6bcfd6afec95be24c8b982ae3ee1d Mon Sep 17 00:00:00 2001
From: fctom1215 <fctom1215@outlook.com>
Date: 星期六, 14 三月 2020 23:44:01 +0800
Subject: [PATCH] 修改车辆传感器,未完成。

---
 lib/src/main/cpp/driver_test.cpp            |   28 ++--
 lib/src/main/cpp/test_common/car_sensor.h   |   46 ++++---
 lib/src/main/cpp/test_common/car_sensor.cpp |  234 ++++++++++++++++++++++++++++++++------
 lib/src/main/cpp/driver_test.h              |    4 
 4 files changed, 237 insertions(+), 75 deletions(-)

diff --git a/lib/src/main/cpp/driver_test.cpp b/lib/src/main/cpp/driver_test.cpp
index 1429252..91672cc 100644
--- a/lib/src/main/cpp/driver_test.cpp
+++ b/lib/src/main/cpp/driver_test.cpp
@@ -101,9 +101,6 @@
 #define RTK_BUFFER_SIZE            100
 #define CAR_MODEL_CACHE_SIZE      10
 
-static pthread_mutex_t rtk_clock_mutex = PTHREAD_MUTEX_INITIALIZER;
-struct RtkTime rtkClock;
-
 static rtk_info *RtkBuffer = NULL;
 static int RtkBufferNum = 0, RtkBufferIn = 0;
 
@@ -121,9 +118,6 @@
 
 void DriverTestInit(void)
 {
-    pthread_mutex_init(&rtk_clock_mutex, NULL);
-    memset(&rtkClock, 0, sizeof(rtkClock));
-
     ExamStart = false;
     memset(&MapList, 0, sizeof(MapList));
     MapNum = 0;
@@ -397,16 +391,10 @@
     }
 }
 
-void GetRtkClock(struct RtkTime *s)
-{
-    pthread_mutex_lock(&rtk_clock_mutex);
-    *s = rtkClock;
-    pthread_mutex_unlock(&rtk_clock_mutex);
-}
-
 void UpdateRTKInfo(const rtk_info *s)
 {
-    pthread_mutex_lock(&rtk_clock_mutex);
+    struct RtkTime rtkClock;
+
     rtkClock.YY = s->YY;
     rtkClock.MM = s->MM;
     rtkClock.DD = s->DD;
@@ -414,7 +402,10 @@
     rtkClock.mm = s->mm;
     rtkClock.ss = s->ss;
     rtkClock.mss = s->dss;
-    pthread_mutex_unlock(&rtk_clock_mutex);
+
+    if (ExamStart) {
+        ExecuteExam(&rtkClock);     // 鎵ц鏃犻渶杞﹁締瀹氫綅鐨勯」鐩�
+    }
 
     if (s->qf == 3) {
         RtkBuffer[RtkBufferIn] = *s;
@@ -517,10 +508,15 @@
     }
 }
 
+static void ExecuteExam(const struct RtkTime* rtkTime)
+{
+
+}
+
 static void ExecuteExam(double speed, int move, double azimuth, const struct RtkTime* rtkTime)
 {
     if (move != 0) {
-        if (ReadSensor(SENSOR_SEATBELT) == 0 && !reportSeatbeltEject) {
+        if (ReadCarStatus(SEATBELT) == EJECT_SEATBELT && !reportSeatbeltEject) {
             DEBUG("涓嶇郴瀹夊叏甯�");
             reportSeatbeltEject = true;
             AddExamFault(1, rtkTime);
diff --git a/lib/src/main/cpp/driver_test.h b/lib/src/main/cpp/driver_test.h
index 4ffde45..0fe5431 100644
--- a/lib/src/main/cpp/driver_test.h
+++ b/lib/src/main/cpp/driver_test.h
@@ -88,10 +88,10 @@
 void SetCarMeasurePoint(double *basePoint, int *axial, int *left_front_tire,
                         int *right_front_tire, int *left_rear_tire, int *right_rear_tire,
                         int *body, int bodyNum, double (*point)[2], int pointNum, double antPitch);
-void SensorChanged(int *sensorId, int *sensorValue, int num);
+
 void StartDriverExam(int start, int type);
 void StartMapExam(int map_id, int exam);
-void GetRtkClock(struct RtkTime *s);
+
 void UpdateRTKInfo(const rtk_info *s);
 void AddExamFault(int wrong, const struct RtkTime *rtkTime);
 car_model_cache_t *GetCarModelCache(int node);
diff --git a/lib/src/main/cpp/test_common/car_sensor.cpp b/lib/src/main/cpp/test_common/car_sensor.cpp
index 73afdc4..2a8e020 100644
--- a/lib/src/main/cpp/test_common/car_sensor.cpp
+++ b/lib/src/main/cpp/test_common/car_sensor.cpp
@@ -13,18 +13,53 @@
 
 #define MAX_SENSOR_NUM          32
 
-static uint16_t gpioStore = 0;
-static int engine_rpm = 0;
+static uint16_t gpioStore;
+static int left_turn_signal, right_turn_signal;
+static int flashMainBeamCnt;
+
+enum {
+    SENSOR_SEATBELT,
+    SENSOR_LEFT_TURN_SIGNAL,
+    SENSOR_RIGHT_TURN_SIGNAL,
+    SENSOR_HANDBREAK,
+    SENSOR_BREAK,
+    SENSOR_CLEARANCE_LIGHT,
+    SENSOR_DIPPED_BEAM_LIGHT,
+    SENSOR_MAIN_BEAM_LIGHT,
+    SENSOR_DOOR,
+    SENSOR_SHIFT_N,
+    SENSOR_SHIFT_1,
+    SENSOR_SHIFT_2,
+    SENSOR_SHIFT_3,
+    SENSOR_SHIFT_4,
+    SENSOR_SHIFT_5,
+    SENSOR_SHIFT_R,
+    SENSOR_ENGINE_START,
+    SENSOR_ENGINE_RPM,
+    SENSOR_SPEED
+};
+
+
+
+static int CarStatus[CAR_STATUS_END];
 
 static struct sensor_cfg {
     int gpioId;
     int funId;
     int validLvl;
-    int currValue;
 } SensorConfig[MAX_SENSOR_NUM];
 static int SensorNum = 0;
 
 static pthread_mutex_t sonser_mutex = PTHREAD_MUTEX_INITIALIZER;
+static pthread_mutex_t status_rw_mutex = PTHREAD_MUTEX_INITIALIZER;
+
+static void WriteCarStatus(uint16_t id, int value);
+static void LRLightTimeout(union sigval sig);
+static void ChangeLRLight(int light);
+static void ConfirmTurnSigalLater(union sigval sig);
+static void flashBeamLightClose(union sigval sig);
+static void confirmFlashBeamLightLater(union sigval sig);
+static void SensorChanged(int id, int value);
 
 void CarSensorInit(void)
 {
@@ -32,7 +67,13 @@
     SensorNum = 0;
     memset(SensorConfig, 0, sizeof(SensorConfig));
 
+    memset(CarStatus, 0, sizeof(CarStatus));
+
+    left_turn_signal = right_turn_signal = 0;
+    flashMainBeamCnt = 0;
+
     pthread_mutex_init(&sonser_mutex, NULL);
+    pthread_mutex_init(&status_rw_mutex, NULL);
 }
 
 void SetSensorCfg(int (*sensor)[3], int sensorNum)
@@ -50,68 +91,185 @@
         } else {
             SensorConfig[i].validLvl = 0;
         }
+
+        int level = 0;
+
         if (gpioStore & BV(SensorConfig[i].gpioId)) {
-            SensorConfig[i].currValue = 1;
+            level = 1;
+        }
+
+        if (level == SensorConfig[i].validLvl) {
+            SensorChanged(SensorConfig[i].funId, 1);
         } else {
-            SensorConfig[i].currValue = 0;
+            SensorChanged(SensorConfig[i].funId, 0);
         }
     }
 
     pthread_mutex_unlock(&sonser_mutex);
 }
 
-void UpdateSensor(uint16_t gpio, uint16_t speed, uint16_t engine)
+void UpdateSensor(uint16_t gpio, uint16_t speed, uint16_t rpm)
 {
     uint16_t chg = 0;
 
-    int reportSensor[MAX_SENSOR_NUM];
-    int reportValue[MAX_SENSOR_NUM];
-    int reportNum = 0;
-
     pthread_mutex_lock(&sonser_mutex);
-
     chg = gpioStore^gpio;
     gpioStore = gpio;
-    engine_rpm = engine;
+    pthread_mutex_unlock(&sonser_mutex);
+
+    WriteCarStatus(OBD_SPEED, speed);
+    WriteCarStatus(ENGINE_RPM, rpm);
 
     for (int i = 0; i < SensorNum; ++i) {
         if (chg & BV(SensorConfig[i].gpioId)) {
+            int level = 0;
+
             if (gpio & BV(SensorConfig[i].gpioId)) {
-                SensorConfig[i].currValue = 1;
-            } else {
-                SensorConfig[i].currValue = 0;
+                level = 1;
             }
 
-            reportSensor[reportNum] =  SensorConfig[i].funId;
-            reportValue[reportNum] =  (SensorConfig[i].validLvl == SensorConfig[i].currValue)?1:0;
-            reportNum++;
+            if (level == SensorConfig[i].validLvl) {
+                SensorChanged(SensorConfig[i].funId, 1);
+            } else {
+                SensorChanged(SensorConfig[i].funId, 0);
+            }
         }
     }
 
-    reportSensor[reportNum] = SENSOR_ENGINE_RPM;
-    reportValue[reportNum] = engine;
-    reportNum++;
 
-    pthread_mutex_unlock(&sonser_mutex);
-
-    SensorChanged(reportSensor, reportValue, reportNum);
 }
 
-int ReadSensor(uint16_t sensor_id)
+int ReadCarStatus(uint16_t id)
 {
-    int ret = -1;
+    int value;
 
-    pthread_mutex_lock(&sonser_mutex);
-    for (int i = 0; i < SensorNum; ++i) {
-        if (sensor_id == SensorConfig[i].funId) {
-            ret = (SensorConfig[i].validLvl == SensorConfig[i].currValue)?1:0;
-        }
-    }
+    pthread_mutex_lock(&status_rw_mutex);
+    value = CarStatus[id];
+    pthread_mutex_unlock(&status_rw_mutex);
 
-    if (sensor_id == SENSOR_ENGINE_RPM) {
-        ret = engine_rpm;
-    }
-    pthread_mutex_unlock(&sonser_mutex);
-
-    return ret;
+    return value;
 }
+
+static void WriteCarStatus(uint16_t id, int value)
+{
+    pthread_mutex_lock(&status_rw_mutex);
+    CarStatus[id] = value;
+    pthread_mutex_unlock(&status_rw_mutex);
+}
+
+static void LRLightTimeout(union sigval sig)
+{
+    AppTimer_delete(LRLightTimeout);
+
+    WriteCarStatus(TURN_SIGNAL_LAMP, OFF_LIGHT);
+}
+
+static void ChangeLRLight(int light)
+{
+    WriteCarStatus(TURN_SIGNAL_LAMP, light);
+
+    AppTimer_delete(LRLightTimeout);
+    AppTimer_add(LRLightTimeout, 1500);
+}
+
+static void ConfirmTurnSigalLater(union sigval sig)
+{
+    AppTimer_delete(ConfirmTurnSigalLater);
+
+    ChangeLRLight(sig.sival_int);
+}
+
+static void flashBeamLightClose(union sigval sig)
+{
+    WriteCarStatus(FLASH_BEAM_LAMP, OFF_LIGHT);
+}
+
+static void confirmFlashBeamLightLater(union sigval sig)
+{
+    AppTimer_delete(confirmFlashBeamLightLater);
+    flashMainBeamCnt = 0;
+}
+
+static void SensorChanged(int id, int value)
+{
+    switch (id) {
+        case SENSOR_LEFT_TURN_SIGNAL: {
+            left_turn_signal = value;
+
+            if (left_turn_signal) {
+                AppTimer_delete(ConfirmTurnSigalLater);
+                if (right_turn_signal) {
+                    // 鍒ゅ畾涓哄弻闂�
+                    ChangeLRLight(HAZARD_LIGHTS);
+                } else {
+                    AppTimer_add(ConfirmTurnSigalLater, 200, LEFT_TURN_LIGHT);
+                }
+            }
+            break;
+        }
+        case SENSOR_RIGHT_TURN_SIGNAL: {
+            right_turn_signal = value;
+
+            if (right_turn_signal) {
+                AppTimer_delete(ConfirmTurnSigalLater);
+                if (left_turn_signal) {
+                    // 鍒ゅ畾涓哄弻闂�
+                    ChangeLRLight(HAZARD_LIGHTS);
+                } else {
+                    AppTimer_add(ConfirmTurnSigalLater, 200, RIGHT_TURN_LIGHT);
+                }
+            }
+            break;
+        }
+        case SENSOR_CLEARANCE_LIGHT: {
+            if (value == 0) {
+                WriteCarStatus(CLEARANCE_LAMP, OFF_LIGHT);
+            } else {
+                WriteCarStatus(CLEARANCE_LAMP, CLEARANCE_LIGHT);
+            }
+            break;
+        }
+        case SENSOR_DIPPED_BEAM_LIGHT: {
+            if (value == 0) {
+                WriteCarStatus(DIPPED_BEAM_LAMP, OFF_LIGHT);
+            } else {
+                WriteCarStatus(DIPPED_BEAM_LAMP, DIPPED_BEAM_LIGHT);
+            }
+            break;
+        }
+        case SENSOR_MAIN_BEAM_LIGHT: {
+            if (value == 0) {
+                WriteCarStatus(MAIN_BEAM_LAMP, OFF_LIGHT);
+            } else {
+                WriteCarStatus(MAIN_BEAM_LAMP, MAIN_BEAM_LIGHT);
+            }
+
+            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;
+        }
+        case SENSOR_SEATBELT: {
+            if (value == 0) {
+                WriteCarStatus(SEATBELT, EJECT_SEATBELT);
+            } else {
+                WriteCarStatus(SEATBELT, INSERT_SEATBELT);
+            }
+            break;
+        }
+        case SENSOR_ENGINE_START: {
+            break;
+        }
+        default:
+            break;
+    }
+}
+
+
diff --git a/lib/src/main/cpp/test_common/car_sensor.h b/lib/src/main/cpp/test_common/car_sensor.h
index ef94afd..5d85ea7 100644
--- a/lib/src/main/cpp/test_common/car_sensor.h
+++ b/lib/src/main/cpp/test_common/car_sensor.h
@@ -8,28 +8,36 @@
 #include <cstdint>
 
 enum {
-    SENSOR_SEATBELT,
-    SENSOR_LEFT_TURN_SIGNAL,
-    SENSOR_RIGHT_TURN_SIGNAL,
-    SENSOR_HANDBREAK,
-    SENSOR_BREAK,
-    SENSOR_LIGHT,
-    SENSOR_FAR_LIGHT,
-    SENSOR_DOOR,
-    SENSOR_SHIFT_N,
-    SENSOR_SHIFT_1,
-    SENSOR_SHIFT_2,
-    SENSOR_SHIFT_3,
-    SENSOR_SHIFT_4,
-    SENSOR_SHIFT_5,
-    SENSOR_SHIFT_R,
-    SENSOR_ENGINE_START,
-    SENSOR_ENGINE_RPM
+    OBD_SPEED,
+    ENGINE_RPM,
+    SHIFT,
+    TURN_SIGNAL_LAMP,
+    DIPPED_BEAM_LAMP,
+    FOG_LAMP,
+    CLEARANCE_LAMP,
+    FLASH_BEAM_LAMP,
+    MAIN_BEAM_LAMP,
+    SEATBELT,
+    CAR_STATUS_END
+};
+
+enum {
+    OFF_LIGHT = 0,
+    EJECT_SEATBELT = 0,
+    HAZARD_LIGHTS,
+    LEFT_TURN_LIGHT,
+    RIGHT_TURN_LIGHT,
+    CLEARANCE_LIGHT,
+    DIPPED_BEAM_LIGHT,
+    MAIN_BEAM_LIGHT,
+    FLASH_BEAM_LIGHT,
+    FOG_LIGHT,
+    INSERT_SEATBELT
 };
 
 void CarSensorInit(void);
-int ReadSensor(uint16_t sensor_id);
-void UpdateSensor(uint16_t gpio, uint16_t speed, uint16_t engine);
+int ReadCarStatus(uint16_t id);
+void UpdateSensor(uint16_t gpio, uint16_t speed, uint16_t rpm);
 void SetSensorCfg(int (*sensor)[3], int sensorNum);
 
 #endif //MYAPPLICATION2_COMM_TEST_H

--
Gitblit v1.8.0