diff --git a/app/src/main/cpp/serial_port.cpp b/app/src/main/cpp/serial_port.cpp index 6d6601f..174420a 100644 --- a/app/src/main/cpp/serial_port.cpp +++ b/app/src/main/cpp/serial_port.cpp @@ -87,7 +87,7 @@ extern "C" JNIEXPORT jobject JNICALL -Java_com_casic_detector_common_uart_JNIKit_open(JNIEnv *env, jobject thiz, jstring path, +Java_com_casic_detector_common_uart_SerialPort_open(JNIEnv *env, jobject thiz, jstring path, jint baud_rate, jint flags) { int fd; speed_t speed; @@ -157,18 +157,22 @@ extern "C" JNIEXPORT void JNICALL -Java_com_casic_detector_common_uart_JNIKit_close(JNIEnv *env, jobject thiz) { - jclass j_fd_class = env->FindClass("java/io/FileDescriptor"); +Java_com_casic_detector_common_uart_SerialPort_close(JNIEnv *env, jobject thiz) { + jclass serial_port_class = env->GetObjectClass(thiz); + jclass file_descriptor_class = env->FindClass("java/io/FileDescriptor"); + + // fd 对应SerialPortKit里面的 fd + char fd_buffer[4] = {0}; + strcat(fd_buffer, "fd"); + jfieldID fd_field_id = env->GetFieldID(serial_port_class, fd_buffer, + "Ljava/io/FileDescriptor;"); char descriptor_buffer[16] = {0}; strcat(descriptor_buffer, "descriptor"); - jfieldID j_desc_fieldID = env->GetFieldID(j_fd_class, descriptor_buffer, "I"); + jfieldID descriptor_field_id = env->GetFieldID(file_descriptor_class, descriptor_buffer, "I"); - if (j_fd_object == nullptr) { - __android_log_print(ANDROID_LOG_DEBUG, jni_tag, "j_fd_object is nullptr"); - return; - } - jint descriptor = env->GetIntField(j_fd_object, j_desc_fieldID); + jobject fd_obj = env->GetObjectField(thiz, fd_field_id); + jint descriptor = env->GetIntField(fd_obj, descriptor_field_id); __android_log_print(ANDROID_LOG_DEBUG, jni_tag, "close()"); close(descriptor); diff --git a/app/src/main/cpp/serial_port.cpp b/app/src/main/cpp/serial_port.cpp index 6d6601f..174420a 100644 --- a/app/src/main/cpp/serial_port.cpp +++ b/app/src/main/cpp/serial_port.cpp @@ -87,7 +87,7 @@ extern "C" JNIEXPORT jobject JNICALL -Java_com_casic_detector_common_uart_JNIKit_open(JNIEnv *env, jobject thiz, jstring path, +Java_com_casic_detector_common_uart_SerialPort_open(JNIEnv *env, jobject thiz, jstring path, jint baud_rate, jint flags) { int fd; speed_t speed; @@ -157,18 +157,22 @@ extern "C" JNIEXPORT void JNICALL -Java_com_casic_detector_common_uart_JNIKit_close(JNIEnv *env, jobject thiz) { - jclass j_fd_class = env->FindClass("java/io/FileDescriptor"); +Java_com_casic_detector_common_uart_SerialPort_close(JNIEnv *env, jobject thiz) { + jclass serial_port_class = env->GetObjectClass(thiz); + jclass file_descriptor_class = env->FindClass("java/io/FileDescriptor"); + + // fd 对应SerialPortKit里面的 fd + char fd_buffer[4] = {0}; + strcat(fd_buffer, "fd"); + jfieldID fd_field_id = env->GetFieldID(serial_port_class, fd_buffer, + "Ljava/io/FileDescriptor;"); char descriptor_buffer[16] = {0}; strcat(descriptor_buffer, "descriptor"); - jfieldID j_desc_fieldID = env->GetFieldID(j_fd_class, descriptor_buffer, "I"); + jfieldID descriptor_field_id = env->GetFieldID(file_descriptor_class, descriptor_buffer, "I"); - if (j_fd_object == nullptr) { - __android_log_print(ANDROID_LOG_DEBUG, jni_tag, "j_fd_object is nullptr"); - return; - } - jint descriptor = env->GetIntField(j_fd_object, j_desc_fieldID); + jobject fd_obj = env->GetObjectField(thiz, fd_field_id); + jint descriptor = env->GetIntField(fd_obj, descriptor_field_id); __android_log_print(ANDROID_LOG_DEBUG, jni_tag, "close()"); close(descriptor); diff --git a/app/src/main/java/com/casic/detector/common/base/BaseApplication.kt b/app/src/main/java/com/casic/detector/common/base/BaseApplication.kt index 5ce6c8b..458f3fb 100644 --- a/app/src/main/java/com/casic/detector/common/base/BaseApplication.kt +++ b/app/src/main/java/com/casic/detector/common/base/BaseApplication.kt @@ -3,7 +3,7 @@ import android.app.Application import com.casic.detector.common.greendao.DaoMaster import com.casic.detector.common.greendao.DaoSession -import com.casic.detector.common.utils.SerialPort +import com.casic.detector.common.uart.SerialPort import com.pengxh.kt.lite.utils.SaveKeyValues import java.io.File import java.io.IOException @@ -30,7 +30,7 @@ fun closeSerialPort() { serialPorts?.forEach { - it.close() + it.closeSerialPort() } } diff --git a/app/src/main/cpp/serial_port.cpp b/app/src/main/cpp/serial_port.cpp index 6d6601f..174420a 100644 --- a/app/src/main/cpp/serial_port.cpp +++ b/app/src/main/cpp/serial_port.cpp @@ -87,7 +87,7 @@ extern "C" JNIEXPORT jobject JNICALL -Java_com_casic_detector_common_uart_JNIKit_open(JNIEnv *env, jobject thiz, jstring path, +Java_com_casic_detector_common_uart_SerialPort_open(JNIEnv *env, jobject thiz, jstring path, jint baud_rate, jint flags) { int fd; speed_t speed; @@ -157,18 +157,22 @@ extern "C" JNIEXPORT void JNICALL -Java_com_casic_detector_common_uart_JNIKit_close(JNIEnv *env, jobject thiz) { - jclass j_fd_class = env->FindClass("java/io/FileDescriptor"); +Java_com_casic_detector_common_uart_SerialPort_close(JNIEnv *env, jobject thiz) { + jclass serial_port_class = env->GetObjectClass(thiz); + jclass file_descriptor_class = env->FindClass("java/io/FileDescriptor"); + + // fd 对应SerialPortKit里面的 fd + char fd_buffer[4] = {0}; + strcat(fd_buffer, "fd"); + jfieldID fd_field_id = env->GetFieldID(serial_port_class, fd_buffer, + "Ljava/io/FileDescriptor;"); char descriptor_buffer[16] = {0}; strcat(descriptor_buffer, "descriptor"); - jfieldID j_desc_fieldID = env->GetFieldID(j_fd_class, descriptor_buffer, "I"); + jfieldID descriptor_field_id = env->GetFieldID(file_descriptor_class, descriptor_buffer, "I"); - if (j_fd_object == nullptr) { - __android_log_print(ANDROID_LOG_DEBUG, jni_tag, "j_fd_object is nullptr"); - return; - } - jint descriptor = env->GetIntField(j_fd_object, j_desc_fieldID); + jobject fd_obj = env->GetObjectField(thiz, fd_field_id); + jint descriptor = env->GetIntField(fd_obj, descriptor_field_id); __android_log_print(ANDROID_LOG_DEBUG, jni_tag, "close()"); close(descriptor); diff --git a/app/src/main/java/com/casic/detector/common/base/BaseApplication.kt b/app/src/main/java/com/casic/detector/common/base/BaseApplication.kt index 5ce6c8b..458f3fb 100644 --- a/app/src/main/java/com/casic/detector/common/base/BaseApplication.kt +++ b/app/src/main/java/com/casic/detector/common/base/BaseApplication.kt @@ -3,7 +3,7 @@ import android.app.Application import com.casic.detector.common.greendao.DaoMaster import com.casic.detector.common.greendao.DaoSession -import com.casic.detector.common.utils.SerialPort +import com.casic.detector.common.uart.SerialPort import com.pengxh.kt.lite.utils.SaveKeyValues import java.io.File import java.io.IOException @@ -30,7 +30,7 @@ fun closeSerialPort() { serialPorts?.forEach { - it.close() + it.closeSerialPort() } } diff --git a/app/src/main/java/com/casic/detector/common/uart/JNIKit.java b/app/src/main/java/com/casic/detector/common/uart/JNIKit.java deleted file mode 100644 index 24b163f..0000000 --- a/app/src/main/java/com/casic/detector/common/uart/JNIKit.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.casic.detector.common.uart; - -import java.io.FileDescriptor; - -public class JNIKit { - static { - System.loadLibrary("serial_port"); - } - - public native FileDescriptor open(String path, int baudRate, int flags); - - public native void close(); -} diff --git a/app/src/main/cpp/serial_port.cpp b/app/src/main/cpp/serial_port.cpp index 6d6601f..174420a 100644 --- a/app/src/main/cpp/serial_port.cpp +++ b/app/src/main/cpp/serial_port.cpp @@ -87,7 +87,7 @@ extern "C" JNIEXPORT jobject JNICALL -Java_com_casic_detector_common_uart_JNIKit_open(JNIEnv *env, jobject thiz, jstring path, +Java_com_casic_detector_common_uart_SerialPort_open(JNIEnv *env, jobject thiz, jstring path, jint baud_rate, jint flags) { int fd; speed_t speed; @@ -157,18 +157,22 @@ extern "C" JNIEXPORT void JNICALL -Java_com_casic_detector_common_uart_JNIKit_close(JNIEnv *env, jobject thiz) { - jclass j_fd_class = env->FindClass("java/io/FileDescriptor"); +Java_com_casic_detector_common_uart_SerialPort_close(JNIEnv *env, jobject thiz) { + jclass serial_port_class = env->GetObjectClass(thiz); + jclass file_descriptor_class = env->FindClass("java/io/FileDescriptor"); + + // fd 对应SerialPortKit里面的 fd + char fd_buffer[4] = {0}; + strcat(fd_buffer, "fd"); + jfieldID fd_field_id = env->GetFieldID(serial_port_class, fd_buffer, + "Ljava/io/FileDescriptor;"); char descriptor_buffer[16] = {0}; strcat(descriptor_buffer, "descriptor"); - jfieldID j_desc_fieldID = env->GetFieldID(j_fd_class, descriptor_buffer, "I"); + jfieldID descriptor_field_id = env->GetFieldID(file_descriptor_class, descriptor_buffer, "I"); - if (j_fd_object == nullptr) { - __android_log_print(ANDROID_LOG_DEBUG, jni_tag, "j_fd_object is nullptr"); - return; - } - jint descriptor = env->GetIntField(j_fd_object, j_desc_fieldID); + jobject fd_obj = env->GetObjectField(thiz, fd_field_id); + jint descriptor = env->GetIntField(fd_obj, descriptor_field_id); __android_log_print(ANDROID_LOG_DEBUG, jni_tag, "close()"); close(descriptor); diff --git a/app/src/main/java/com/casic/detector/common/base/BaseApplication.kt b/app/src/main/java/com/casic/detector/common/base/BaseApplication.kt index 5ce6c8b..458f3fb 100644 --- a/app/src/main/java/com/casic/detector/common/base/BaseApplication.kt +++ b/app/src/main/java/com/casic/detector/common/base/BaseApplication.kt @@ -3,7 +3,7 @@ import android.app.Application import com.casic.detector.common.greendao.DaoMaster import com.casic.detector.common.greendao.DaoSession -import com.casic.detector.common.utils.SerialPort +import com.casic.detector.common.uart.SerialPort import com.pengxh.kt.lite.utils.SaveKeyValues import java.io.File import java.io.IOException @@ -30,7 +30,7 @@ fun closeSerialPort() { serialPorts?.forEach { - it.close() + it.closeSerialPort() } } diff --git a/app/src/main/java/com/casic/detector/common/uart/JNIKit.java b/app/src/main/java/com/casic/detector/common/uart/JNIKit.java deleted file mode 100644 index 24b163f..0000000 --- a/app/src/main/java/com/casic/detector/common/uart/JNIKit.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.casic.detector.common.uart; - -import java.io.FileDescriptor; - -public class JNIKit { - static { - System.loadLibrary("serial_port"); - } - - public native FileDescriptor open(String path, int baudRate, int flags); - - public native void close(); -} diff --git a/app/src/main/java/com/casic/detector/common/uart/SerialPort.kt b/app/src/main/java/com/casic/detector/common/uart/SerialPort.kt new file mode 100644 index 0000000..1abddc6 --- /dev/null +++ b/app/src/main/java/com/casic/detector/common/uart/SerialPort.kt @@ -0,0 +1,51 @@ +package com.casic.detector.common.uart + +import android.util.Log +import java.io.File +import java.io.FileDescriptor +import java.io.FileInputStream +import java.io.FileOutputStream +import java.io.IOException +import java.io.InputStream +import java.io.OutputStream + +class SerialPort(device: File, baudRate: Int, flags: Int) { + + private val kTag = "SerialPort" + private var fd: FileDescriptor? = null + var inputStream: InputStream + var outputStream: OutputStream + + init { + System.loadLibrary("serial_port") + + if (!device.canRead() || !device.canWrite()) { + try { + val su = Runtime.getRuntime().exec("/system/bin/su") + val cmd = "chmod 666 ${device.absolutePath} \n exit \n" + su.outputStream.write(cmd.toByteArray()) + if (su.waitFor() != 0 || !device.canRead() || !device.canWrite()) { + throw SecurityException() + } + } catch (e: Exception) { + e.printStackTrace() + throw SecurityException() + } + } + fd = open(device.absolutePath, baudRate, flags) + if (fd == null) { + Log.e(kTag, "SerialPortKit open returns null") + throw IOException() + } + inputStream = FileInputStream(fd) + outputStream = FileOutputStream(fd) + } + + fun closeSerialPort() { + close() + } + + private external fun open(path: String, baudRate: Int, flags: Int): FileDescriptor? + + private external fun close() +} \ No newline at end of file diff --git a/app/src/main/cpp/serial_port.cpp b/app/src/main/cpp/serial_port.cpp index 6d6601f..174420a 100644 --- a/app/src/main/cpp/serial_port.cpp +++ b/app/src/main/cpp/serial_port.cpp @@ -87,7 +87,7 @@ extern "C" JNIEXPORT jobject JNICALL -Java_com_casic_detector_common_uart_JNIKit_open(JNIEnv *env, jobject thiz, jstring path, +Java_com_casic_detector_common_uart_SerialPort_open(JNIEnv *env, jobject thiz, jstring path, jint baud_rate, jint flags) { int fd; speed_t speed; @@ -157,18 +157,22 @@ extern "C" JNIEXPORT void JNICALL -Java_com_casic_detector_common_uart_JNIKit_close(JNIEnv *env, jobject thiz) { - jclass j_fd_class = env->FindClass("java/io/FileDescriptor"); +Java_com_casic_detector_common_uart_SerialPort_close(JNIEnv *env, jobject thiz) { + jclass serial_port_class = env->GetObjectClass(thiz); + jclass file_descriptor_class = env->FindClass("java/io/FileDescriptor"); + + // fd 对应SerialPortKit里面的 fd + char fd_buffer[4] = {0}; + strcat(fd_buffer, "fd"); + jfieldID fd_field_id = env->GetFieldID(serial_port_class, fd_buffer, + "Ljava/io/FileDescriptor;"); char descriptor_buffer[16] = {0}; strcat(descriptor_buffer, "descriptor"); - jfieldID j_desc_fieldID = env->GetFieldID(j_fd_class, descriptor_buffer, "I"); + jfieldID descriptor_field_id = env->GetFieldID(file_descriptor_class, descriptor_buffer, "I"); - if (j_fd_object == nullptr) { - __android_log_print(ANDROID_LOG_DEBUG, jni_tag, "j_fd_object is nullptr"); - return; - } - jint descriptor = env->GetIntField(j_fd_object, j_desc_fieldID); + jobject fd_obj = env->GetObjectField(thiz, fd_field_id); + jint descriptor = env->GetIntField(fd_obj, descriptor_field_id); __android_log_print(ANDROID_LOG_DEBUG, jni_tag, "close()"); close(descriptor); diff --git a/app/src/main/java/com/casic/detector/common/base/BaseApplication.kt b/app/src/main/java/com/casic/detector/common/base/BaseApplication.kt index 5ce6c8b..458f3fb 100644 --- a/app/src/main/java/com/casic/detector/common/base/BaseApplication.kt +++ b/app/src/main/java/com/casic/detector/common/base/BaseApplication.kt @@ -3,7 +3,7 @@ import android.app.Application import com.casic.detector.common.greendao.DaoMaster import com.casic.detector.common.greendao.DaoSession -import com.casic.detector.common.utils.SerialPort +import com.casic.detector.common.uart.SerialPort import com.pengxh.kt.lite.utils.SaveKeyValues import java.io.File import java.io.IOException @@ -30,7 +30,7 @@ fun closeSerialPort() { serialPorts?.forEach { - it.close() + it.closeSerialPort() } } diff --git a/app/src/main/java/com/casic/detector/common/uart/JNIKit.java b/app/src/main/java/com/casic/detector/common/uart/JNIKit.java deleted file mode 100644 index 24b163f..0000000 --- a/app/src/main/java/com/casic/detector/common/uart/JNIKit.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.casic.detector.common.uart; - -import java.io.FileDescriptor; - -public class JNIKit { - static { - System.loadLibrary("serial_port"); - } - - public native FileDescriptor open(String path, int baudRate, int flags); - - public native void close(); -} diff --git a/app/src/main/java/com/casic/detector/common/uart/SerialPort.kt b/app/src/main/java/com/casic/detector/common/uart/SerialPort.kt new file mode 100644 index 0000000..1abddc6 --- /dev/null +++ b/app/src/main/java/com/casic/detector/common/uart/SerialPort.kt @@ -0,0 +1,51 @@ +package com.casic.detector.common.uart + +import android.util.Log +import java.io.File +import java.io.FileDescriptor +import java.io.FileInputStream +import java.io.FileOutputStream +import java.io.IOException +import java.io.InputStream +import java.io.OutputStream + +class SerialPort(device: File, baudRate: Int, flags: Int) { + + private val kTag = "SerialPort" + private var fd: FileDescriptor? = null + var inputStream: InputStream + var outputStream: OutputStream + + init { + System.loadLibrary("serial_port") + + if (!device.canRead() || !device.canWrite()) { + try { + val su = Runtime.getRuntime().exec("/system/bin/su") + val cmd = "chmod 666 ${device.absolutePath} \n exit \n" + su.outputStream.write(cmd.toByteArray()) + if (su.waitFor() != 0 || !device.canRead() || !device.canWrite()) { + throw SecurityException() + } + } catch (e: Exception) { + e.printStackTrace() + throw SecurityException() + } + } + fd = open(device.absolutePath, baudRate, flags) + if (fd == null) { + Log.e(kTag, "SerialPortKit open returns null") + throw IOException() + } + inputStream = FileInputStream(fd) + outputStream = FileOutputStream(fd) + } + + fun closeSerialPort() { + close() + } + + private external fun open(path: String, baudRate: Int, flags: Int): FileDescriptor? + + private external fun close() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/detector/common/utils/SerialPort.kt b/app/src/main/java/com/casic/detector/common/utils/SerialPort.kt deleted file mode 100644 index 0bd69ef..0000000 --- a/app/src/main/java/com/casic/detector/common/utils/SerialPort.kt +++ /dev/null @@ -1,45 +0,0 @@ -package com.casic.detector.common.utils - -import android.util.Log -import com.casic.detector.common.uart.JNIKit -import java.io.File -import java.io.FileInputStream -import java.io.FileOutputStream -import java.io.IOException -import java.io.InputStream -import java.io.OutputStream - -class SerialPort(device: File, baudRate: Int, flags: Int) { - - private val kTag = "SerialPort" - private val jni by lazy { JNIKit() } - var inputStream: InputStream - var outputStream: OutputStream - - init { - if (!device.canRead() || !device.canWrite()) { - try { - val su = Runtime.getRuntime().exec("/system/bin/su") - val cmd = "chmod 666 ${device.absolutePath} \n exit \n" - su.outputStream.write(cmd.toByteArray()) - if (su.waitFor() != 0 || !device.canRead() || !device.canWrite()) { - throw SecurityException() - } - } catch (e: Exception) { - e.printStackTrace() - throw SecurityException() - } - } - val fd = jni.open(device.absolutePath, baudRate, flags) - if (fd == null) { - Log.e(kTag, "SerialPortKit open returns null") - throw IOException() - } - inputStream = FileInputStream(fd) - outputStream = FileOutputStream(fd) - } - - fun close() { - jni.close() - } -} \ No newline at end of file diff --git a/app/src/main/cpp/serial_port.cpp b/app/src/main/cpp/serial_port.cpp index 6d6601f..174420a 100644 --- a/app/src/main/cpp/serial_port.cpp +++ b/app/src/main/cpp/serial_port.cpp @@ -87,7 +87,7 @@ extern "C" JNIEXPORT jobject JNICALL -Java_com_casic_detector_common_uart_JNIKit_open(JNIEnv *env, jobject thiz, jstring path, +Java_com_casic_detector_common_uart_SerialPort_open(JNIEnv *env, jobject thiz, jstring path, jint baud_rate, jint flags) { int fd; speed_t speed; @@ -157,18 +157,22 @@ extern "C" JNIEXPORT void JNICALL -Java_com_casic_detector_common_uart_JNIKit_close(JNIEnv *env, jobject thiz) { - jclass j_fd_class = env->FindClass("java/io/FileDescriptor"); +Java_com_casic_detector_common_uart_SerialPort_close(JNIEnv *env, jobject thiz) { + jclass serial_port_class = env->GetObjectClass(thiz); + jclass file_descriptor_class = env->FindClass("java/io/FileDescriptor"); + + // fd 对应SerialPortKit里面的 fd + char fd_buffer[4] = {0}; + strcat(fd_buffer, "fd"); + jfieldID fd_field_id = env->GetFieldID(serial_port_class, fd_buffer, + "Ljava/io/FileDescriptor;"); char descriptor_buffer[16] = {0}; strcat(descriptor_buffer, "descriptor"); - jfieldID j_desc_fieldID = env->GetFieldID(j_fd_class, descriptor_buffer, "I"); + jfieldID descriptor_field_id = env->GetFieldID(file_descriptor_class, descriptor_buffer, "I"); - if (j_fd_object == nullptr) { - __android_log_print(ANDROID_LOG_DEBUG, jni_tag, "j_fd_object is nullptr"); - return; - } - jint descriptor = env->GetIntField(j_fd_object, j_desc_fieldID); + jobject fd_obj = env->GetObjectField(thiz, fd_field_id); + jint descriptor = env->GetIntField(fd_obj, descriptor_field_id); __android_log_print(ANDROID_LOG_DEBUG, jni_tag, "close()"); close(descriptor); diff --git a/app/src/main/java/com/casic/detector/common/base/BaseApplication.kt b/app/src/main/java/com/casic/detector/common/base/BaseApplication.kt index 5ce6c8b..458f3fb 100644 --- a/app/src/main/java/com/casic/detector/common/base/BaseApplication.kt +++ b/app/src/main/java/com/casic/detector/common/base/BaseApplication.kt @@ -3,7 +3,7 @@ import android.app.Application import com.casic.detector.common.greendao.DaoMaster import com.casic.detector.common.greendao.DaoSession -import com.casic.detector.common.utils.SerialPort +import com.casic.detector.common.uart.SerialPort import com.pengxh.kt.lite.utils.SaveKeyValues import java.io.File import java.io.IOException @@ -30,7 +30,7 @@ fun closeSerialPort() { serialPorts?.forEach { - it.close() + it.closeSerialPort() } } diff --git a/app/src/main/java/com/casic/detector/common/uart/JNIKit.java b/app/src/main/java/com/casic/detector/common/uart/JNIKit.java deleted file mode 100644 index 24b163f..0000000 --- a/app/src/main/java/com/casic/detector/common/uart/JNIKit.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.casic.detector.common.uart; - -import java.io.FileDescriptor; - -public class JNIKit { - static { - System.loadLibrary("serial_port"); - } - - public native FileDescriptor open(String path, int baudRate, int flags); - - public native void close(); -} diff --git a/app/src/main/java/com/casic/detector/common/uart/SerialPort.kt b/app/src/main/java/com/casic/detector/common/uart/SerialPort.kt new file mode 100644 index 0000000..1abddc6 --- /dev/null +++ b/app/src/main/java/com/casic/detector/common/uart/SerialPort.kt @@ -0,0 +1,51 @@ +package com.casic.detector.common.uart + +import android.util.Log +import java.io.File +import java.io.FileDescriptor +import java.io.FileInputStream +import java.io.FileOutputStream +import java.io.IOException +import java.io.InputStream +import java.io.OutputStream + +class SerialPort(device: File, baudRate: Int, flags: Int) { + + private val kTag = "SerialPort" + private var fd: FileDescriptor? = null + var inputStream: InputStream + var outputStream: OutputStream + + init { + System.loadLibrary("serial_port") + + if (!device.canRead() || !device.canWrite()) { + try { + val su = Runtime.getRuntime().exec("/system/bin/su") + val cmd = "chmod 666 ${device.absolutePath} \n exit \n" + su.outputStream.write(cmd.toByteArray()) + if (su.waitFor() != 0 || !device.canRead() || !device.canWrite()) { + throw SecurityException() + } + } catch (e: Exception) { + e.printStackTrace() + throw SecurityException() + } + } + fd = open(device.absolutePath, baudRate, flags) + if (fd == null) { + Log.e(kTag, "SerialPortKit open returns null") + throw IOException() + } + inputStream = FileInputStream(fd) + outputStream = FileOutputStream(fd) + } + + fun closeSerialPort() { + close() + } + + private external fun open(path: String, baudRate: Int, flags: Int): FileDescriptor? + + private external fun close() +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/detector/common/utils/SerialPort.kt b/app/src/main/java/com/casic/detector/common/utils/SerialPort.kt deleted file mode 100644 index 0bd69ef..0000000 --- a/app/src/main/java/com/casic/detector/common/utils/SerialPort.kt +++ /dev/null @@ -1,45 +0,0 @@ -package com.casic.detector.common.utils - -import android.util.Log -import com.casic.detector.common.uart.JNIKit -import java.io.File -import java.io.FileInputStream -import java.io.FileOutputStream -import java.io.IOException -import java.io.InputStream -import java.io.OutputStream - -class SerialPort(device: File, baudRate: Int, flags: Int) { - - private val kTag = "SerialPort" - private val jni by lazy { JNIKit() } - var inputStream: InputStream - var outputStream: OutputStream - - init { - if (!device.canRead() || !device.canWrite()) { - try { - val su = Runtime.getRuntime().exec("/system/bin/su") - val cmd = "chmod 666 ${device.absolutePath} \n exit \n" - su.outputStream.write(cmd.toByteArray()) - if (su.waitFor() != 0 || !device.canRead() || !device.canWrite()) { - throw SecurityException() - } - } catch (e: Exception) { - e.printStackTrace() - throw SecurityException() - } - } - val fd = jni.open(device.absolutePath, baudRate, flags) - if (fd == null) { - Log.e(kTag, "SerialPortKit open returns null") - throw IOException() - } - inputStream = FileInputStream(fd) - outputStream = FileOutputStream(fd) - } - - fun close() { - jni.close() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/detector/common/view/MainActivity.kt b/app/src/main/java/com/casic/detector/common/view/MainActivity.kt index dec7c08..93535d2 100644 --- a/app/src/main/java/com/casic/detector/common/view/MainActivity.kt +++ b/app/src/main/java/com/casic/detector/common/view/MainActivity.kt @@ -84,19 +84,16 @@ import com.pengxh.kt.lite.extensions.convertColor import com.pengxh.kt.lite.extensions.convertDrawable import com.pengxh.kt.lite.extensions.createDownloadFileDir -import com.pengxh.kt.lite.extensions.createLogFile import com.pengxh.kt.lite.extensions.dateToTimestamp import com.pengxh.kt.lite.extensions.dp2px import com.pengxh.kt.lite.extensions.getSystemService import com.pengxh.kt.lite.extensions.initDialogLayoutParams import com.pengxh.kt.lite.extensions.isNetworkConnected import com.pengxh.kt.lite.extensions.navigatePageTo -import com.pengxh.kt.lite.extensions.readAssetsFile import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.extensions.timestampToCompleteDate import com.pengxh.kt.lite.extensions.timestampToTime import com.pengxh.kt.lite.extensions.toJson -import com.pengxh.kt.lite.extensions.writeToFile import com.pengxh.kt.lite.utils.FileDownloadManager import com.pengxh.kt.lite.utils.LoadState import com.pengxh.kt.lite.utils.LoadingDialogHub @@ -1497,6 +1494,7 @@ private val taskCode by lazy { SaveKeyValues.getValue(LocaleConstant.TASK_CODE, "") as String } + private val markerPoints by lazy { ArrayList() } private val binding: DialogSearchMarkerNewBinding by binding() private var markerId = "" private lateinit var searchMarkerTimer: Timer @@ -1563,28 +1561,12 @@ override fun show() { super.show() - //TODO 将测试点文本数据序列化 - val assetsFileContent = readAssetsFile("Log.txt") - val result = ArrayList() - for (line in assetsFileContent.split("]")) { - if (line.isBlank()) { - continue - } - val split = line.replace("[", "").split(",") - val double = DoubleArray(2) - double[0] = split[0].replace(" ", "").toDouble() - double[1] = split[1].replace(" ", "").toDouble() - - result.add(double) - } - locationTool = LocationTool(context) //点位渲染,每次定位都计算当前位置与符合条件的点距离 locationTool.getCurrentLocation(false, object : OnGetLocationListener { override fun onAMapLocationGet(location: AMapLocation?) { - val random = result.random() location?.apply { - renderDataPoint(this, random) + renderDataPoint(this) } } }) @@ -1592,10 +1574,9 @@ /** * 计算并渲染数据点。点太多采用协程计算,不然会有点卡顿 - * @param location 定位点(天宝RTK获取) - * @param testPoint 模拟点 + * @param location 定位点(RTK获取) * */ - private fun renderDataPoint(location: AMapLocation, testPoint: DoubleArray) { + private fun renderDataPoint(location: AMapLocation) { val longitude = location.longitude val latitude = location.latitude lifecycleScope.launch(Dispatchers.IO) { @@ -1605,38 +1586,22 @@ LatLng(it.lat.toDouble(), it.lng.toDouble()), LatLng(latitude, longitude) ) val formatDistance = decimalFormat.format(distance).toFloat() + + markerPoints.add(MarkerDistanceData(it.markerId, formatDistance)) + if (formatDistance <= LocaleConstant.MAX_DISTANCE) { val angle = atan2( (it.lat.toDouble() - latitude), (it.lng.toDouble() - longitude) ) + Math.PI val formatAngle = decimalFormat.format(angle).toDouble() - "[$longitude, $latitude,$formatDistance, $formatAngle]".writeToFile( - createLogFile() - ) - dataPoints.add(RadarScanView.DataPoint(formatAngle, formatDistance)) - } - -// if (it.markerId == "0008865561" || it.markerId == "0008877280") { -// val distance = AMapUtils.calculateLineDistance( -// LatLng(it.lat.toDouble(), it.lng.toDouble()), -// LatLng(testPoint[1], testPoint[0]) +// "[$longitude, $latitude,$formatDistance, $formatAngle]".writeToFile( +// createLogFile() // ) -// -// val formatDistance = decimalFormat.format(distance).toFloat() -// if (formatDistance <= LocaleConstant.MAX_DISTANCE) { -// val angle = atan2( -// (it.lat.toDouble() - testPoint[1]), -// (it.lng.toDouble() - testPoint[0]) -// ) + Math.PI -// val formatAngle = decimalFormat.format(angle).toDouble() -// -// "[${it.markerId}, ${testPoint[0]}, ${testPoint[1]}, $formatDistance, $formatAngle]".writeToFile( -// createLogFile() -// ) -// dataPoints.add(RadarScanView.DataPoint(formatAngle, formatDistance)) -// } -// } + dataPoints.add( + RadarScanView.DataPoint(formatAngle, formatDistance) + ) + } } withContext(Dispatchers.Main) { binding.radarScanView.renderPointData(dataPoints, @@ -1715,6 +1680,11 @@ binding.energyTipsView.text = "信号极强,接近标识器正上方" binding.energyTipsView.setTextColor(Color.parseColor("#428d00")) binding.energyTipsView.setBackgroundResource(R.mipmap.bg_large_text_green) + + markerPoints.sortBy(MarkerDistanceData::distance) + val nearestPoint = markerPoints.first() + markerId = nearestPoint.markerId + handleMarker() } else { binding.energyTipsView.text = "已靠近,请继续移动位置" binding.energyTipsView.setTextColor(Color.parseColor("#8C5700")) @@ -1744,27 +1714,30 @@ val id = hex.take(20).hexToString() if (id.isNumber()) { markerId = id + handleMarker() + } + } + } - binding.depthButton.isEnabled = true - binding.depthButton.setTextColor(Color.WHITE) - binding.depthButton.setBackgroundResource(R.mipmap.left_button_enable) - binding.markerInfoButton.isEnabled = true - binding.markerInfoButton.setTextColor(Color.WHITE) - binding.markerInfoButton.setBackgroundResource(R.mipmap.right_button_enable) + private fun handleMarker() { + binding.depthButton.isEnabled = true + binding.depthButton.setTextColor(Color.WHITE) + binding.depthButton.setBackgroundResource(R.mipmap.left_button_enable) + binding.markerInfoButton.isEnabled = true + binding.markerInfoButton.setTextColor(Color.WHITE) + binding.markerInfoButton.setBackgroundResource(R.mipmap.right_button_enable) - binding.searchResultView.text = "已检测到标识器" - binding.searchResultView.setTextColor(Color.parseColor("#428d00")) - binding.searchResultView.setBackgroundResource(R.mipmap.bg_small_text_green) + binding.searchResultView.text = "已检测到标识器" + binding.searchResultView.setTextColor(Color.parseColor("#428d00")) + binding.searchResultView.setBackgroundResource(R.mipmap.bg_small_text_green) - //自动上传标识器 - if (isExecuteTask) { - val taskMarkerLocalBean = DataBaseManager.get.queryTaskMarkerById( - taskId, taskCode, markerId, "0" - ) - taskMarkerLocalBean?.apply { - taskViewModel.uploadMarker(context, this) - } - } + //自动上传标识器 + if (isExecuteTask) { + val taskMarkerLocalBean = DataBaseManager.get.queryTaskMarkerById( + taskId, taskCode, markerId, "0" + ) + taskMarkerLocalBean?.apply { + taskViewModel.uploadMarker(context, this) } } } @@ -1808,4 +1781,9 @@ super.dismiss() } } + + /** + * 标识器与当前定位的数据 + * */ + data class MarkerDistanceData(var markerId: String, var distance: Float) } \ No newline at end of file