From 87156fa3adfa2e3232a6f6e612584aa8a4ebaea1 Mon Sep 17 00:00:00 2001
From: yy1717 <fctom1215@outlook.com>
Date: 星期二, 19 一月 2021 18:40:25 +0800
Subject: [PATCH] 添加模拟灯光

---
 lib/src/main/cpp/rtk_platform/platform.cpp |  157 ++++++++++++++++++++-------------------------------
 1 files changed, 62 insertions(+), 95 deletions(-)

diff --git a/lib/src/main/cpp/rtk_platform/platform.cpp b/lib/src/main/cpp/rtk_platform/platform.cpp
index 1f28070..33efdc8 100644
--- a/lib/src/main/cpp/rtk_platform/platform.cpp
+++ b/lib/src/main/cpp/rtk_platform/platform.cpp
@@ -25,6 +25,7 @@
 #include "../test_items2/stop_car.h"
 #include "../test_items2/operate_gear.h"
 #include "../test_items2/drive_straight.h"
+#include "../rtk_module/virtual_rtk.h"
 
 #define PARSE_BUFF_SIZE         4096
 
@@ -79,13 +80,12 @@
 
 static bool mAyDevice = false;
 
-struct platformSocket exceptSocket, currSocket;
+struct platformSocket exceptSocket;
 static sem_t sem_status_changed;
 
 static bool requestPlatformSendRtk = false;
-static int platform_tcp_fd = 0;
+static CTcpPort *ctp = NULL;
 
-static pthread_mutex_t platform_tx_mutex = PTHREAD_MUTEX_INITIALIZER;
 static pthread_mutex_t events_mutex = PTHREAD_MUTEX_INITIALIZER;
 
 static struct gpsBrief gbf;
@@ -101,10 +101,12 @@
 
 static void ReqRtkPlatformConfigTimeout(union sigval sig);
 
+static void TcpEventCallback(int stat, void *p, void *context);
+static void TcpDataCallback(void *buffer, int length, void *p, void *context);
+
 static void ConnectPlatform(const char *domain_name, int port);
 static void ConnectPlatformLater(union sigval sig);
 
-static void *PlatformDataListenThread(void *p);
 static void *StatusListenThread(void *p);
 static void PlatformChangeEntry(uint32_t events, const uint8_t *data, int length);
 
@@ -194,14 +196,10 @@
     memset(&rbf, 0, sizeof(rbf));
     memset(&defaultMcuRom, 0, sizeof(defaultMcuRom));
 
-    pthread_mutex_init(&platform_tx_mutex, NULL);
     pthread_mutex_init(&events_mutex, NULL);
 
     eventQueue = NULL;
 
-    platform_tcp_fd = -1;
-
-    memset(&currSocket, 0, sizeof(currSocket));
     memset(&platformStatus, 0, sizeof(platformStatus));
 
     sem_init(&sem_status_changed, 0, 0);
@@ -247,14 +245,16 @@
         platformStatus.registed = 0;
     }
 
-    pthread_mutex_lock(&platform_tx_mutex);
-    if (platform_tcp_fd > 0 && (exceptSocket.port != currSocket.port || strcmp(currSocket.domain_name, exceptSocket.domain_name))) {
-        DisconnectTCP(platform_tcp_fd);
-        platform_tcp_fd = -1;
-    } else if (platform_tcp_fd <= 0) {
-        ConnectPlatform(exceptSocket.domain_name, exceptSocket.port);
-    }
-    pthread_mutex_unlock(&platform_tx_mutex);
+    ConnectPlatform(exceptSocket.domain_name, exceptSocket.port);
+
+//    pthread_mutex_lock(&platform_tx_mutex);
+//    if (platform_tcp_fd > 0 && (exceptSocket.port != currSocket.port || strcmp(currSocket.domain_name, exceptSocket.domain_name))) {
+//        DisconnectTCP(platform_tcp_fd);
+//        platform_tcp_fd = -1;
+//    } else if (platform_tcp_fd <= 0) {
+//        ConnectPlatform(exceptSocket.domain_name, exceptSocket.port);
+//    }
+//    pthread_mutex_unlock(&platform_tx_mutex);
 }
 
 void PlatformStatusChanged(uint32_t event, const uint8_t *data, int length)
@@ -270,17 +270,43 @@
         return;
 
     DEBUG("杩炴帴RTK骞冲彴 %s: %d", domain_name, port);
-    // TODO
-    struct platformSocketInfo *ptr = (struct platformSocketInfo *)malloc(sizeof(struct platformSocketInfo));
 
-    strcpy(ptr->domain_name, domain_name);
-    ptr->port = port;
+    if (ctp == NULL) {
+        ctp = new CTcpPort();
 
-    pthread_t platform_pid;
-    pthread_attr_t attr;
-    pthread_attr_init(&attr);
-    pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);//detached
-    pthread_create(&platform_pid, &attr, PlatformDataListenThread, ptr);
+        ctp->set_event_callback(TcpEventCallback, NULL);
+        ctp->set_data_callback(TcpDataCallback, NULL);
+    }
+
+    if (!ctp->IsOpen()) {
+        ctp->OpenTcpPort(domain_name, port);
+    } else if ((ctp->m_nPort != port || strcmp(ctp->m_sIp.c_str(), domain_name))) {
+        ctp->CloseTcpPort();
+    }
+}
+
+static void TcpEventCallback(int stat, void *p, void *context)
+{
+    CTcpPort *pTcpPort = (CTcpPort *)p;
+    uint8_t buffer[256];
+
+    strcpy((char *)buffer, pTcpPort->m_sIp.c_str());
+
+    buffer[pTcpPort->m_sIp.length() + 1] = HI_UINT16(pTcpPort->m_nPort);
+    buffer[pTcpPort->m_sIp.length() + 2] = LO_UINT16(pTcpPort->m_nPort);
+
+    if (stat == 0) {
+        PlatformStatusChanged(PLATFORM_CONNECT_EVT, buffer, pTcpPort->m_sIp.length() + 3);
+    } else {
+        PlatformStatusChanged(PLATFORM_DISCONNECT_EVT, buffer, pTcpPort->m_sIp.length() + 3);
+    }
+}
+
+static void TcpDataCallback(void *buffer, int length, void *p, void *context)
+{
+    if (length > 0) {
+        Parse(DATA_ACCESS_PLATFORM, (uint8_t *)buffer, length);
+    }
 }
 
 static void ConnectPlatformLater(union sigval sig) {
@@ -306,8 +332,8 @@
 {
     switch (events) {
         case PLATFORM_CONNECT_EVT: {
-            DEBUG("骞冲彴杩炴帴鎴愬姛 %s:%d", currSocket.domain_name, currSocket.port);
-            MA_RtkPlatformConnect(1, currSocket.domain_name, currSocket.port);
+            DEBUG("骞冲彴杩炴帴鎴愬姛 %s:%d", data, BUILD_UINT16(data[strlen((char *)data) + 2], data[strlen((char *)data) + 1]));
+            MA_RtkPlatformConnect(1, (char *)data, BUILD_UINT16(data[strlen((char *)data) + 2], data[strlen((char *)data) + 1]));
 
             platformStatus.connected = 1;
             if (!platformStatus.registed || platformStatus.platformKeyLength == 0) {
@@ -321,8 +347,8 @@
         }
 
         case PLATFORM_DISCONNECT_EVT: {
-            DEBUG("骞冲彴鏂紑 %s:%d", currSocket.domain_name, currSocket.port);
-            MA_RtkPlatformConnect(0, currSocket.domain_name, currSocket.port);
+            DEBUG("骞冲彴鏂紑 %s:%d", data, BUILD_UINT16(data[strlen((char *)data) + 2], data[strlen((char *)data) + 1]));
+            MA_RtkPlatformConnect(0, (char *)data, BUILD_UINT16(data[strlen((char *)data) + 2], data[strlen((char *)data) + 1]));
 
             AppTimer_delete(ConnectPlatformLater);
             AppTimer_add(ConnectPlatformLater, D_SEC(2));
@@ -660,7 +686,11 @@
             break;
         }
         case BLUETOOTH_DATA_EVT: {
-            ParseMcu(data, length);
+            if (Virtual2IsConnected()) {
+
+            } else {
+                ParseMcu(data, length);
+            }
             break;
         }
         case SENSOR_CHANGE_EVT: {
@@ -672,76 +702,13 @@
     }
 }
 
-static void *PlatformDataListenThread(void *p) {
-    struct platformSocket *ptr = (struct platformSocket *)p;
-
-    uint8_t RxBuf[PARSE_BUFF_SIZE];
-
-    int fds_ret;
-    struct timeval tv;
-    fd_set rdfds;
-    fd_set exfds;
-
-    int fd = -1;
-    int RxBufLen = 0;
-
-    fd = ConnectTCP(ptr->domain_name, ptr->port);
-
-    pthread_mutex_lock(&platform_tx_mutex);
-    platform_tcp_fd = fd;
-
-    currSocket = *ptr;
-
-    pthread_mutex_unlock(&platform_tx_mutex);
-
-    if (fd > 0) {
-        PlatformStatusChanged(PLATFORM_CONNECT_EVT, NULL, 0);
-    }
-
-    while (fd > 0) {
-        tv.tv_sec = 5;
-        tv.tv_usec = 0;
-        FD_ZERO(&rdfds); //clean
-        FD_SET(fd, &rdfds); //set
-
-        fds_ret = select(fd + 1, &rdfds, NULL, NULL, &tv);
-
-        if (fds_ret < 0) {
-            break;
-        } else if(fds_ret == 0) {
-            //Occur failure(such as line disconnect)
-        } else if(FD_ISSET(fd, &rdfds)) {
-            RxBufLen = ReadTCP(fd, RxBuf, sizeof(RxBuf));
-
-            if (RxBufLen < 0) {
-                break;
-            } else if (RxBufLen > 0) {
-                Parse(DATA_ACCESS_PLATFORM, RxBuf, RxBufLen);
-            }
-        }
-    }
-
-    pthread_mutex_lock(&platform_tx_mutex);
-    if (platform_tcp_fd > 0) {
-        DisconnectTCP(platform_tcp_fd);
-        platform_tcp_fd = -1;
-    }
-    pthread_mutex_unlock(&platform_tx_mutex);
-    free(ptr);
-
-    PlatformStatusChanged(PLATFORM_DISCONNECT_EVT, NULL, 0);
-    pthread_exit(NULL);
-}
-
 int WritePlatform(const uint8_t * buf, uint32_t len)
 {
     int ret = -1;
 
-    pthread_mutex_lock(&platform_tx_mutex);
-    if (platform_tcp_fd > 0) {
-        ret = WriteTCP(platform_tcp_fd, buf, len);
+    if (ctp != NULL && ctp->IsOpen()) {
+        ret = ctp->WriteTCP(buf, len);
     }
-    pthread_mutex_unlock(&platform_tx_mutex);
 
     return ret;
 }

--
Gitblit v1.8.0