From f7a18ec4494b9c5c9ef3fd440bbf68ffc6425e18 Mon Sep 17 00:00:00 2001
From: yy1717 <fctom1215@outlook.com>
Date: 星期四, 08 十二月 2022 15:40:56 +0800
Subject: [PATCH] 智慧驾培首次提交

---
 lib/src/main/cpp/common/serial_port.cpp |  160 +++++++++++++++++++---------------------------------
 1 files changed, 59 insertions(+), 101 deletions(-)

diff --git a/lib/src/main/cpp/common/serial_port.cpp b/lib/src/main/cpp/common/serial_port.cpp
index a41832b..a7c36a0 100644
--- a/lib/src/main/cpp/common/serial_port.cpp
+++ b/lib/src/main/cpp/common/serial_port.cpp
@@ -4,7 +4,7 @@
 
 #include <jni.h>
 #include <string>
-
+#include <mutex>
 #include <sys/stat.h>
 #include <stdbool.h>
 #include <stdint.h>
@@ -15,16 +15,22 @@
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <fcntl.h>
-#include <pthread.h>
 #include "../jni_log.h"
 #include "serial_port.h"
 
 using namespace std;
 
-static volatile int serial_port_fd[2] = {0, 0};
-static pthread_mutex_t mutex[2] = {PTHREAD_MUTEX_INITIALIZER, PTHREAD_MUTEX_INITIALIZER};
+SerialPort::SerialPort(struct serial_config cfg)
+{
+    this->cfg = cfg;
+}
 
-int setRTS(int fd, int level)
+SerialPort::~SerialPort()
+{
+    UninitSerialPort();
+}
+
+int SerialPort::setRTS(int level)
 {
     int status;
 
@@ -47,7 +53,7 @@
 /*********************************************************************
  * PUBLIC FUNCTIONS
  */
-static int SetSerialPort(int fd, int speed, int databits, char parity, int stopbits, int flowctrl) {
+int SerialPort::SetSerialPort(int fd, int speed, int databits, char parity, int stopbits, int flowctrl) {
     int status = 0;
     struct termios opt;
     int speed_arr[] = {B921600, B576000, B500000, B460800, B230400, B115200, B38400, B19200,
@@ -142,7 +148,7 @@
     return status;
 }
 
-static int OpenSerialPort(const char *name) {
+int SerialPort::OpenSerialPort(const char *name) {
     int uart_fd;
 
 //    uart_fd = open(name, O_RDWR /*| O_NONBLOCK/*| O_NOCTTY | O_NDELAY*/);
@@ -151,14 +157,13 @@
     return uart_fd;
 }
 
-static void CloseSerialPort(int fd) {
+void SerialPort::CloseSerialPort(int fd) {
     close(fd);
 }
 
-int WriteSerialPort(int id, const void *buf, int len) {
+int SerialPort::WriteSerialPort(const void *buf, int len) {
     int ret = -1;
     int fds_ret;
-    int fd = GetSerialPort(id);
 
     struct timeval tv;
     fd_set wrfds;
@@ -173,7 +178,7 @@
     FD_ZERO(&wrfds); //clean
     FD_SET(fd, &wrfds); //set
 
-    pthread_mutex_lock(&mutex[id]);
+    lock_guard<std::mutex> lock(mtx);
 
     fds_ret = select(fd + 1, NULL, &wrfds, NULL, &tv);
 
@@ -194,113 +199,66 @@
         LOGE("Serial Port error 2\n");
     }
 
-    pthread_mutex_unlock(&mutex[id]);
-
     return ret;
 }
 
-int GetSerialPort(int id) {
-    return serial_port_fd[id];
-}
-
-int InitSerialPort(int id, int baud, int dataBits, char parity, int stopBits, int flowctrl)
+int SerialPort::InitSerialPort(void)
 {
-    char name[32];
+//    char name[32];
+//
+//    if (id == UART_0) {
+//        strcpy(name, "/dev/ttyCH341USB5");
+//    } else if (id == UART_1) {
+//        strcpy(name, "/dev/ttyCH341USB6");
+//    } else {
+//        return -1;
+//    }
 
-    if (id == UART_0) {
-        strcpy(name, "/dev/ttyHSL0");
-    } else if (id == UART_1) {
-        strcpy(name, "/dev/ttyHSL1");
-    } else {
+    fd = OpenSerialPort(cfg.name);
+    if (fd <= 0) {
         return -1;
     }
 
-    UninitSerialPort(id);
-
-    serial_port_fd[id] = OpenSerialPort(name);
-    if (serial_port_fd[id] <= 0) {
-        return -1;
-    }
-
-    if (SetSerialPort(serial_port_fd[id], baud, dataBits, parity, stopBits, flowctrl) != 0) {
+    if (SetSerialPort(fd, cfg.baud, cfg.data_bit, cfg.verify_bit, cfg.stop_bit, cfg.flow_ctrl) != 0) {
         return -2;
     }
-    pthread_mutex_init(&mutex[id], NULL);
 
     return 0;
 }
 
-void UninitSerialPort(int id)
+void SerialPort::UninitSerialPort(void)
 {
-    if (serial_port_fd[id] > 0) {
-        CloseSerialPort(serial_port_fd[id]);
-        pthread_mutex_destroy(&mutex[id]);
-        serial_port_fd[id] = 0;
+    if (fd > 0) {
+        CloseSerialPort(fd);
+        fd = 0;
     }
 }
 
-int ReadSerialPort(int id, uint8_t *out, uint16_t length)
+int SerialPort::ReadSerialPort(uint8_t *out, uint16_t length)
 {
-    if (serial_port_fd[id] <= 0) return 0;
-    return read(serial_port_fd[id], out, length);
-}
+    if (fd <= 0) return 0;
 
-//extern "C"
-//JNIEXPORT jint JNICALL
-//Java_com_example_yy_jnicallback_MyService_InitSerialPort(
-//        JNIEnv *env,
-//        jobject /* this */,
-//        jstring name,
-//        jint baud,
-//        jint dataBits,
-//        jbyte parity,
-//        jint stopBits) {
-//
-//    const char *s = env->GetStringUTFChars(name, 0);
-//    char item_value[128];
-//    strcpy(item_value, s);
-//    env->ReleaseStringUTFChars(name, s);
-//    LOGD("serial port = %s", item_value);
-//
-//    if (serial_port_fd > 0) {
-//        CloseSerialPort(serial_port_fd);
-//        pthread_mutex_destroy(&mutex);
-//        serial_port_fd = 0;
-//    }
-//
-//    serial_port_fd = OpenSerialPort(item_value);
-//    if (serial_port_fd <= 0) {
-//        return -1;
-//    }
-//
-//    if (SetSerialPort(serial_port_fd, baud, dataBits, parity, stopBits) != 0) {
-//        return -2;
-//    }
-//    pthread_mutex_init(&mutex, NULL);
-//    return 0;
-//}
-//
-//extern "C"
-//JNIEXPORT void JNICALL
-//Java_com_example_yy_jnicallback_MyService_MonitSerialPort(
-//        JNIEnv *env,
-//        jobject /* this */) {
-//    if (serial_port_fd > 0) {
-//        uint8_t UartRxBuf[4096];
-//
-///*        uint8_t pkt[] = {0x7E, 0x80, 0x02, 0x00, 0x00, 0x26, 0x00, 0x00, 0x01, 0x38, 0x20, 0x20,
-//                         0x55, 0x45, 0x04, 0x4E,
-//                         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x02, 0x61, 0x63,
-//                         0x0C, 0x06, 0xEA, 0x04,
-//                         0xFE, 0x00, 0x00, 0x01, 0x63, 0x00, 0xB4, 0x13, 0x03, 0x05, 0x18, 0x18,
-//                         0x52, 0x01, 0x04, 0x00,
-//                         0x00, 0x00, 0x00, 0x05, 0x02, 0x00, 0x00, 0x4D, 0x7E};
-//        WriteSerialPort(serial_port_fd, pkt, sizeof(pkt));*/
-//
-//        int length = read(serial_port_fd, UartRxBuf, sizeof(UartRxBuf));
-//
-//        if (length > 0) {
-//            Parse(DATA_ACCESS_MCU, UartRxBuf, length);
-//        }
-//    }
-//}
+    struct timeval tv;
+    fd_set wrfds;
+
+    tv.tv_sec = 5;
+    tv.tv_usec = 0;
+
+    FD_ZERO(&wrfds); //clean
+    FD_SET(fd, &wrfds); //set
+
+    int fds_ret = select(fd + 1, &wrfds, NULL, NULL, &tv);
+
+    if (fds_ret < 0) {
+        return -1;
+    }
+    else if(fds_ret == 0) {
+        // timeout
+        return -2;
+    }
+    else if(FD_ISSET(fd, &wrfds)) {
+        return read(fd, out, length);
+    }
+
+    return -3;
+}

--
Gitblit v1.8.0