From c64da51ae481dfc2a25e5a6e39bb94f22d65428a Mon Sep 17 00:00:00 2001
From: yy1717 <fctom1215@outlook.com>
Date: 星期五, 10 一月 2020 13:33:09 +0800
Subject: [PATCH] s

---
 lib/src/main/cpp/master/comm_if.h                       |   25 +++++
 lib/src/main/cpp/driver_test.cpp                        |   90 ++++++++++++++++-
 lib/src/main/cpp/master/comm_if.cpp                     |   95 ++++++++++++++++++
 lib/src/main/cpp/native-lib.cpp                         |    9 +
 lib/src/main/cpp/driver_test.h                          |    1 
 lib/src/main/cpp/rtk_platform/platform.cpp              |    5 
 lib/src/main/java/com/anyun/exam/lib/RemoteService.java |   33 ++++--
 7 files changed, 232 insertions(+), 26 deletions(-)

diff --git a/lib/src/main/cpp/driver_test.cpp b/lib/src/main/cpp/driver_test.cpp
index 55464ad..945f6bb 100644
--- a/lib/src/main/cpp/driver_test.cpp
+++ b/lib/src/main/cpp/driver_test.cpp
@@ -86,6 +86,19 @@
 
 struct car_desc_ *CarDesc = NULL;
 
+typedef struct {
+    PointF basePoint;
+    int axial[2];
+    int left_front_tire[2];
+    int right_front_tire[2];
+    int left_rear_tire[2];
+    int right_rear_tire[2];
+    int pointNum;
+    struct car_desc_ *carDesc;
+} car_model;
+
+static car_model *CarModel = NULL;
+
 struct car_coord_ *CarCoord = NULL;
 static double currSpeed = 0, currAzimuth = 0;
 static PointF currCoord;
@@ -122,6 +135,7 @@
 {
     memset(&MapList, 0, sizeof(MapList));
     MapNum = 0;
+    CarModel = NULL;
 
     carModelDescFile = (carModelDesc_t *)malloc(sizeof(carModelDesc_t));
 
@@ -259,22 +273,20 @@
     ErrorList.clear();
 
     TextSpeak("寮�濮嬫祴璇�");
-
-    AppTimer_add(ReadDriverExamPrimerTimeout, D_SEC(2));
-    ReadDriverExamPrimer();
 }
 
 static void ReadDriverExamPrimerTimeout(union sigval sig)
 {
     AppTimer_delete(ReadDriverExamPrimerTimeout);
+    AppTimer_add(ReadDriverExamPrimerTimeout, D_SEC(2));
     ReadDriverExamPrimer();
 }
 
 void ReadDriverExamPrimer(void)
 {
-//    MA_ReadMap();
-//    MA_ReadCar();
-//    MA_ReadSensor();
+    MA_ReadMap();
+    MA_ReadCar();
+    MA_ReadSensor();
 }
 
 void ClearMap(void)
@@ -327,6 +339,56 @@
                     double (*point)[2], int pointNum)
 {
     DEBUG("SetCarMeasurePoint pointNum %d", pointNum);
+
+    if (point == NULL || pointNum == 0) return;
+
+    if (CarModel != NULL) {
+        CarModel->carDesc != NULL;
+        free(CarModel->carDesc);
+        free(CarModel);
+        CarModel = NULL;
+    }
+
+    CarModel = (car_model *)malloc(sizeof(CarModel));
+    CarModel->basePoint.X = basePoint[0];
+    CarModel->basePoint.Y = basePoint[1];
+    CarModel->axial[0] = axial[0];
+    CarModel->axial[1] = axial[1];
+    CarModel->left_front_tire[0] = left_front_tire[0];
+    CarModel->left_front_tire[1] = left_front_tire[1];
+    CarModel->right_front_tire[0] = right_front_tire[0];
+    CarModel->right_front_tire[1] = right_front_tire[1];
+    CarModel->left_rear_tire[0] = left_rear_tire[0];
+    CarModel->left_rear_tire[1] = left_rear_tire[1];
+    CarModel->right_rear_tire[0] = right_rear_tire[0];
+    CarModel->right_rear_tire[1] = right_rear_tire[1];
+    CarModel->pointNum = pointNum;
+
+    CarModel->carDesc = (struct car_desc_ *)malloc(sizeof(struct car_desc_) * pointNum);
+
+    // 娴嬮噺鍧愭爣杞崲涓鸿窛绂�-瑙掑害褰㈠紡
+    double C02 = (point[0][0]-basePoint[0])*(point[0][0]-basePoint[0]) +
+                 (point[0][1]-basePoint[1])*(point[0][1]-basePoint[1]);
+    double C0 = sqrt(C02);
+
+    CarModel->carDesc[0].distance = sqrt(C02);
+    CarModel->carDesc[0].angle = 0.0;
+
+    for (int i = 1; i < pointNum; ++i) {
+        double dis2 = (point[i][0]-basePoint[0])*(point[i][0]-basePoint[0]) +
+                      (point[i][1]-basePoint[1])*(point[i][1]-basePoint[1]);
+        double dis = sqrt(dis2);
+
+        CarModel->carDesc[i].distance = dis;
+
+        CarModel->carDesc[i].angle = 180 * acos((dis2 + C02 - ((point[i][0]-point[0][0])*(point[i][0]-point[0][0]) +
+                                                   (point[i][1]-point[0][1])*(point[i][1]-point[0][1])))/(2*C0*dis)) / M_PI;
+
+        if (i > axial[1])
+            CarModel->carDesc[i].angle = 360.0 - CarModel->carDesc[i].angle;
+    }
+
+    DEBUG("SetCarMeasurePoint Calc Over");
 }
 
 void SetSensorCfg(int (*sensor)[2], int sensorNum)
@@ -334,6 +396,22 @@
     DEBUG("SetSensorCfg sensorNum %d", sensorNum);
 }
 
+void StartDriverExam(int start)
+{
+    bool err = false;
+
+    if (MapNum == 0) {
+        err = true;
+        MA_SendExamStatus(0, -1);
+    }
+    if (CarModel == NULL) {
+        err = true;
+        MA_SendExamStatus(0, -2);
+    }
+    if (!err)
+        MA_SendExamStatus(1, 0);
+}
+
 void UpdateRTKInfo(struct rtk_info *s)
 {
     struct tm test_tm;
diff --git a/lib/src/main/cpp/driver_test.h b/lib/src/main/cpp/driver_test.h
index 896814b..85ebb28 100644
--- a/lib/src/main/cpp/driver_test.h
+++ b/lib/src/main/cpp/driver_test.h
@@ -52,6 +52,7 @@
                         int *right_front_tire, int *left_rear_tire, int *right_rear_tire,
                         double (*point)[2], int pointNum);
 void SetSensorCfg(int (*sensor)[2], int sensorNum);
+void StartDriverExam(int start);
 
 void UpdateRTKInfo(struct rtk_info *s);
 void UpdateCarCoord(void);
diff --git a/lib/src/main/cpp/master/comm_if.cpp b/lib/src/main/cpp/master/comm_if.cpp
index 5301d23..ee203d4 100644
--- a/lib/src/main/cpp/master/comm_if.cpp
+++ b/lib/src/main/cpp/master/comm_if.cpp
@@ -14,8 +14,10 @@
 
 #include <string>
 #include <iostream>
+#include <vector>
 
 using namespace rapidjson;
+using namespace std;
 
 #define ID_SM_NDK_START         0x0001
 #define ID_SM_REQ_RTK_PLAT_CFG         0x0002
@@ -33,7 +35,7 @@
 #define ID_SM_EXAM_STATUS       0x0009
 #define ID_SM_GPS_BRIEF         0x000A
 #define ID_SM_RTK_BRIEF         0x000B
-#define ID_SM_EXAM_BRIEF         0x000B
+#define ID_SM_EXAM_BRIEF         0x000C
 
 void MA_NdkStart(void)
 {
@@ -113,6 +115,88 @@
 void MA_ReadSensor(void)
 {
     SendMsgToMainProc(ID_SM_READ_SENSOR_CFG, NULL);
+}
+
+void MA_SendExamStatus(int start, int errorCode)
+{
+    StringBuffer sb;
+    Writer<StringBuffer> writer(sb);
+
+    writer.StartObject();
+
+    writer.Key("exam");
+    writer.Int(start);
+    writer.Key("error");
+    writer.Int(errorCode);
+
+    writer.EndObject();
+
+    SendMsgToMainProc(ID_SM_EXAM_STATUS, sb.GetString());
+}
+
+void MA_SendGpsBrief(const struct gpsBrief *brief)
+{
+    StringBuffer sb;
+    Writer<StringBuffer> writer(sb);
+
+    writer.StartObject();
+
+    writer.Key("utc");
+    writer.String(brief->utc);
+    writer.Key("sat_num");
+    writer.Int(brief->sat_num);
+    writer.Key("qf");
+    writer.Int(brief->qf);
+    writer.Key("latitude");
+    writer.Double(brief->latitude);
+    writer.Key("longitude");
+    writer.Double(brief->longitude);
+    writer.Key("altitude");
+    writer.Double(brief->altitude);
+    writer.Key("speed");
+    writer.Double(brief->speed);
+
+    writer.EndObject();
+
+    SendMsgToMainProc(ID_SM_GPS_BRIEF, sb.GetString());
+}
+
+void MA_SendRtkBrief(const struct rtkBrief *brief)
+{
+    char a[2] = {brief->coord_x_dir, 0};
+    char b[2] = {brief->coord_y_dir, 0};
+
+    StringBuffer sb;
+    Writer<StringBuffer> writer(sb);
+
+    writer.StartObject();
+
+    writer.Key("utc");
+    writer.String(brief->utc);
+    writer.Key("qf");
+    writer.Int(brief->qf);
+    writer.Key("coord_x");
+    writer.Double(brief->coord_x);
+    writer.Key("coord_x_dir");
+    writer.String(a);
+    writer.Key("coord_y");
+    writer.Double(brief->coord_y);
+    writer.Key("coord_y_dir");
+    writer.String(b);
+    writer.Key("heading");
+    writer.Double(brief->heading);
+    writer.Key("pitch");
+    writer.Double(brief->pitch);
+    writer.Key("roll");
+    writer.Double(brief->roll);
+    writer.EndObject();
+
+    SendMsgToMainProc(ID_SM_RTK_BRIEF, sb.GetString());
+}
+
+void MA_SendExamWrong(vector<int>&err)
+{
+
 }
 
 void MA_MainProcMsgEntry(int cmd, const char *value)
@@ -367,7 +451,14 @@
             break;
         }
         case ID_MS_START_EXAM: {
-
+            Document doc;
+            doc.Parse(value);
+            if (!doc.HasParseError()) {
+                if (doc.HasMember("exam")) {
+                    Value& s = doc["exam"];
+                    StartDriverExam(s.GetInt());
+                }
+            }
             break;
         }
         default:break;
diff --git a/lib/src/main/cpp/master/comm_if.h b/lib/src/main/cpp/master/comm_if.h
index 48633c7..33c6f32 100644
--- a/lib/src/main/cpp/master/comm_if.h
+++ b/lib/src/main/cpp/master/comm_if.h
@@ -7,6 +7,28 @@
 
 #include <cstdint>
 
+struct gpsBrief {
+    char utc[32];
+    int sat_num;
+    int qf;
+    double latitude;
+    double longitude;
+    double altitude;
+    double speed;
+};
+
+struct rtkBrief {
+    char utc[32];
+    int qf;
+    double coord_x;
+    char coord_x_dir;
+    double coord_y;
+    char coord_y_dir;
+    double heading;
+    double pitch;
+    double roll;
+};
+
 void MA_MainProcMsgEntry(int cmd, const char *value);
 
 void MA_NdkStart(void);
@@ -17,5 +39,8 @@
 void MA_ReadMap(void);
 void MA_ReadCar(void);
 void MA_ReadSensor(void);
+void MA_SendExamStatus(int start, int errorCode);
+void MA_SendGpsBrief(const struct gpsBrief *brief);
+void MA_SendRtkBrief(const struct rtkBrief *brief);
 
 #endif //MYAPPLICATION2_COMM_IF_H
diff --git a/lib/src/main/cpp/native-lib.cpp b/lib/src/main/cpp/native-lib.cpp
index 0729f69..e813fed 100644
--- a/lib/src/main/cpp/native-lib.cpp
+++ b/lib/src/main/cpp/native-lib.cpp
@@ -25,6 +25,8 @@
 const int RTK_PLATFORM_PORT = 12125;
 const uint8_t phone[] = {0x20,0x19,0x10,0x15,0x00,0x00,0x00,0x01};
 
+static void SendBootIndicate(union sigval sig);
+
 int DESEncrypt(const uint8_t *key, int key_length,
         const uint8_t *plaintext, int plaintext_length,
         uint8_t **ciphertext)
@@ -234,13 +236,18 @@
     // 涓嶈兘鐩存帴璧嬪��(g_obj = ojb)
     sg_obj = env->NewGlobalRef(thiz);
 
-    MA_NdkStart();
     AppTimer_Init();
     ConfigMCU();
     DriverTestInit();
     ConfigRTKModule();
 
     InitPlatform(phone, RTK_PLATFORM_IP, RTK_PLATFORM_PORT);
+    AppTimer_add(SendBootIndicate, 500);
+}
+
+static void SendBootIndicate(union sigval sig) {
+    AppTimer_delete(SendBootIndicate);
+    MA_NdkStart();
 }
 
 extern "C"
diff --git a/lib/src/main/cpp/rtk_platform/platform.cpp b/lib/src/main/cpp/rtk_platform/platform.cpp
index f3d5bb9..0ed3ff3 100644
--- a/lib/src/main/cpp/rtk_platform/platform.cpp
+++ b/lib/src/main/cpp/rtk_platform/platform.cpp
@@ -107,9 +107,6 @@
     pthread_attr_init(&attr);
     pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);//detached
     pthread_create(&pid, &attr, StatusListenThread, NULL);
-
-    AppTimer_add(ReqRtkPlatformConfigTimeout, D_SEC(2));
-    MA_ReqRtkPlatformConfig();
 }
 
 static void ReqRtkPlatformConfigTimeout(union sigval sig)
@@ -135,7 +132,7 @@
     strcpy(deviceInfo.imei, p->imei);
     SetPlatformTxPhoneNum(p->phone);
 
-    platformStatus.registed = p->registered;
+    platformStatus.registed = 0;//p->registered;
     platformStatus.platformKeyLength = strlen(p->password) / 2;
 
     if (platformStatus.platformKeyLength > 0) {
diff --git a/lib/src/main/java/com/anyun/exam/lib/RemoteService.java b/lib/src/main/java/com/anyun/exam/lib/RemoteService.java
index f8b7133..c509eb4 100644
--- a/lib/src/main/java/com/anyun/exam/lib/RemoteService.java
+++ b/lib/src/main/java/com/anyun/exam/lib/RemoteService.java
@@ -68,7 +68,14 @@
         Log.i(TAG,"onCreate()");
         speaker = new Speaker(getApplicationContext());
 
-        startNative();
+        new Thread(new StartNative()).start();
+    }
+
+    class StartNative implements Runnable {
+        @Override
+        public void run() {
+            startNative();
+        }
     }
 
     @Override
@@ -78,23 +85,23 @@
         mIsServiceDestroyed.set(true);
     }
 
-    private void onMessageArrived(int cmd, String json){
+    private void onMessageArrived(int cmd, String json) {
         int N = mListenerList.getRegisteredCallbackCount();
 
-        mListenerList.beginBroadcast();
-
-        for (int i = 0; i < N; i++) {
-            mListener  = mListenerList.getBroadcastItem(i);
-            if (mListener != null){
-                try {
-                    mListener.onMessageArrived(cmd, json);
-                } catch (RemoteException e) {
-                    e.printStackTrace();
+        synchronized(this) {
+            mListenerList.beginBroadcast();
+            for (int i = 0; i < N; i++) {
+                mListener = mListenerList.getBroadcastItem(i);
+                if (mListener != null) {
+                    try {
+                        mListener.onMessageArrived(cmd, json);
+                    } catch (RemoteException e) {
+                        e.printStackTrace();
+                    }
                 }
             }
-
+            mListenerList.finishBroadcast();
         }
-        mListenerList.finishBroadcast();
     }
 
     public void SendMsgToMainProc(int cmd, String value) {

--
Gitblit v1.8.0