diff --git a/app/src/main/java/com/casic/common/detector/gd/service/SerialPortService.kt b/app/src/main/java/com/casic/common/detector/gd/service/SerialPortService.kt index 42ad30c..c533b20 100644 --- a/app/src/main/java/com/casic/common/detector/gd/service/SerialPortService.kt +++ b/app/src/main/java/com/casic/common/detector/gd/service/SerialPortService.kt @@ -6,87 +6,100 @@ import android.os.IBinder import android.util.Log import com.casic.common.detector.gd.base.BaseApplication -import com.casic.common.detector.gd.callback.OnSerialPortListener -import com.casic.common.detector.gd.utils.GpioManager +import com.casic.common.detector.gd.utils.CurrentSegment +import com.casic.common.detector.gd.utils.LocaleConstant +import com.casic.common.detector.gd.utils.RuntimeCache +import com.casic.common.detector.gd.view.InstallMarkerActivity +import com.casic.common.detector.gd.view.MainActivity +import com.casic.common.detector.gd.view.SearchMarkerActivity import java.io.IOException import java.io.InputStream -import java.io.OutputStream import java.util.concurrent.Executors import java.util.concurrent.TimeUnit -import java.util.concurrent.atomic.AtomicInteger class SerialPortService : Service() { private val kTag = "SerialPortService" - private val gpioManager by lazy { GpioManager() } - private val serialPorts = BaseApplication.get().getSerialPorts() private val sendExecutor = Executors.newFixedThreadPool(5) - private var readExecutor = Executors.newSingleThreadScheduledExecutor() - private var outStream: OutputStream? = null - private var inStreamFirst: InputStream? = null - private var inStreamLast: InputStream? = null + private val readExecutor = Executors.newSingleThreadScheduledExecutor() - /** - * 读取数据 1 - * 暂停读取 0 - * */ - private val gpioState = AtomicInteger(0) + //输出流 + private val outStream by lazy { BaseApplication.get().getSerialPorts().first().outputStream } - fun openSerialPort(commandArray: ArrayList, listener: OnSerialPortListener) { - if (gpioState.get() != 1) { - gpioManager.setGpioHigh("18") - gpioState.set(1) - Log.d(kTag, "openSerialPort: 调高串口电位") - } else { - Log.d(kTag, "openSerialPort: 已经是高电位,直接读数据") - } + //输入流 + private val firstInStream by lazy { BaseApplication.get().getSerialPorts().first().inputStream } + private val lastInStream by lazy { BaseApplication.get().getSerialPorts().last().inputStream } + override fun onCreate() { + super.onCreate() try { - outStream = serialPorts.first().outputStream - // 使用线程池发送数据 - commandArray.forEach { command -> - sendExecutor.submit { - try { - outStream?.write(command.code) - outStream?.flush() - Thread.sleep(1000) - } catch (e: IOException) { - Log.e(kTag, "Error writing to output stream", e) - } catch (e: InterruptedException) { - Log.e(kTag, "Thread interrupted", e) - } - } - } - - inStreamFirst = serialPorts.first().inputStream - inStreamLast = serialPorts.last().inputStream - // 使用单线程调度器读取数据 readExecutor.scheduleAtFixedRate({ - if (gpioState.get() == 1) { - readData(inStreamFirst!!, listener) - } + readData(firstInStream) }, 100, 150, TimeUnit.MILLISECONDS) readExecutor.scheduleAtFixedRate({ - if (gpioState.get() == 1) { - readData(inStreamLast!!, listener) - } + readData(lastInStream) }, 100, 150, TimeUnit.MILLISECONDS) } catch (e: IOException) { e.printStackTrace() - closeSerialPort() } } - private fun readData(inputStream: InputStream, listener: OnSerialPortListener) { + private fun readData(inputStream: InputStream) { try { val buffer = ByteArray(1024) var bytesRead: Int while (inputStream.available() > 0) { bytesRead = inputStream.read(buffer) if (bytesRead > 0) { - listener.onDataReceived(buffer.copyOf(bytesRead)) + when (RuntimeCache.currentSegment) { + CurrentSegment.DetectMarkerDepth -> { + //深度 + SearchMarkerActivity.weakReferenceHandler?.apply { + val message = obtainMessage() + message.what = LocaleConstant.DETECT_MARKER_DEPTH + message.obj = buffer.copyOf(bytesRead) + sendMessage(message) + } + } + + CurrentSegment.InstallMarker -> { + //安装点 + InstallMarkerActivity.weakReferenceHandler?.apply { + val message = obtainMessage() + message.what = LocaleConstant.INSTALL_MARKER + message.obj = buffer.copyOf(bytesRead) + sendMessage(message) + } + } + + CurrentSegment.FreeInspection -> { + //自由巡检 + MainActivity.weakReferenceHandler?.apply { + val message = obtainMessage() + message.what = LocaleConstant.FREE_INSPECTION + message.obj = buffer.copyOf(bytesRead) + sendMessage(message) + } + } + + CurrentSegment.SearchMarker -> { + //搜索标识器 + SearchMarkerActivity.weakReferenceHandler?.apply { + val message = obtainMessage() + message.what = LocaleConstant.SEARCH_MARKER + message.obj = buffer.copyOf(bytesRead) + sendMessage(message) + } + } + + else -> { + Log.d( + kTag, "空状态 ===> ${buffer.copyOf(bytesRead).contentToString()}" + ) + } + } } } } catch (e: IOException) { @@ -94,18 +107,17 @@ } } - fun closeSerialPort() { - if (gpioState.get() == 0) { - Log.d(kTag, "closeSerialPort: 已经是低电位,直接返回") - return + fun writeCommand(commandArray: ArrayList) { + // 使用线程池发送数据 + commandArray.forEach { command -> + sendExecutor.submit { + outStream.write(command.code) + outStream.flush() + } + Thread.sleep(1000) } - // 降低串口电位 - gpioManager.setGpioLow("18") - gpioState.set(0) - Log.d(kTag, "closeSerialPort: 降低串口电位") } - override fun onBind(intent: Intent?): IBinder { return ServiceBinder() } diff --git a/app/src/main/java/com/casic/common/detector/gd/service/SerialPortService.kt b/app/src/main/java/com/casic/common/detector/gd/service/SerialPortService.kt index 42ad30c..c533b20 100644 --- a/app/src/main/java/com/casic/common/detector/gd/service/SerialPortService.kt +++ b/app/src/main/java/com/casic/common/detector/gd/service/SerialPortService.kt @@ -6,87 +6,100 @@ import android.os.IBinder import android.util.Log import com.casic.common.detector.gd.base.BaseApplication -import com.casic.common.detector.gd.callback.OnSerialPortListener -import com.casic.common.detector.gd.utils.GpioManager +import com.casic.common.detector.gd.utils.CurrentSegment +import com.casic.common.detector.gd.utils.LocaleConstant +import com.casic.common.detector.gd.utils.RuntimeCache +import com.casic.common.detector.gd.view.InstallMarkerActivity +import com.casic.common.detector.gd.view.MainActivity +import com.casic.common.detector.gd.view.SearchMarkerActivity import java.io.IOException import java.io.InputStream -import java.io.OutputStream import java.util.concurrent.Executors import java.util.concurrent.TimeUnit -import java.util.concurrent.atomic.AtomicInteger class SerialPortService : Service() { private val kTag = "SerialPortService" - private val gpioManager by lazy { GpioManager() } - private val serialPorts = BaseApplication.get().getSerialPorts() private val sendExecutor = Executors.newFixedThreadPool(5) - private var readExecutor = Executors.newSingleThreadScheduledExecutor() - private var outStream: OutputStream? = null - private var inStreamFirst: InputStream? = null - private var inStreamLast: InputStream? = null + private val readExecutor = Executors.newSingleThreadScheduledExecutor() - /** - * 读取数据 1 - * 暂停读取 0 - * */ - private val gpioState = AtomicInteger(0) + //输出流 + private val outStream by lazy { BaseApplication.get().getSerialPorts().first().outputStream } - fun openSerialPort(commandArray: ArrayList, listener: OnSerialPortListener) { - if (gpioState.get() != 1) { - gpioManager.setGpioHigh("18") - gpioState.set(1) - Log.d(kTag, "openSerialPort: 调高串口电位") - } else { - Log.d(kTag, "openSerialPort: 已经是高电位,直接读数据") - } + //输入流 + private val firstInStream by lazy { BaseApplication.get().getSerialPorts().first().inputStream } + private val lastInStream by lazy { BaseApplication.get().getSerialPorts().last().inputStream } + override fun onCreate() { + super.onCreate() try { - outStream = serialPorts.first().outputStream - // 使用线程池发送数据 - commandArray.forEach { command -> - sendExecutor.submit { - try { - outStream?.write(command.code) - outStream?.flush() - Thread.sleep(1000) - } catch (e: IOException) { - Log.e(kTag, "Error writing to output stream", e) - } catch (e: InterruptedException) { - Log.e(kTag, "Thread interrupted", e) - } - } - } - - inStreamFirst = serialPorts.first().inputStream - inStreamLast = serialPorts.last().inputStream - // 使用单线程调度器读取数据 readExecutor.scheduleAtFixedRate({ - if (gpioState.get() == 1) { - readData(inStreamFirst!!, listener) - } + readData(firstInStream) }, 100, 150, TimeUnit.MILLISECONDS) readExecutor.scheduleAtFixedRate({ - if (gpioState.get() == 1) { - readData(inStreamLast!!, listener) - } + readData(lastInStream) }, 100, 150, TimeUnit.MILLISECONDS) } catch (e: IOException) { e.printStackTrace() - closeSerialPort() } } - private fun readData(inputStream: InputStream, listener: OnSerialPortListener) { + private fun readData(inputStream: InputStream) { try { val buffer = ByteArray(1024) var bytesRead: Int while (inputStream.available() > 0) { bytesRead = inputStream.read(buffer) if (bytesRead > 0) { - listener.onDataReceived(buffer.copyOf(bytesRead)) + when (RuntimeCache.currentSegment) { + CurrentSegment.DetectMarkerDepth -> { + //深度 + SearchMarkerActivity.weakReferenceHandler?.apply { + val message = obtainMessage() + message.what = LocaleConstant.DETECT_MARKER_DEPTH + message.obj = buffer.copyOf(bytesRead) + sendMessage(message) + } + } + + CurrentSegment.InstallMarker -> { + //安装点 + InstallMarkerActivity.weakReferenceHandler?.apply { + val message = obtainMessage() + message.what = LocaleConstant.INSTALL_MARKER + message.obj = buffer.copyOf(bytesRead) + sendMessage(message) + } + } + + CurrentSegment.FreeInspection -> { + //自由巡检 + MainActivity.weakReferenceHandler?.apply { + val message = obtainMessage() + message.what = LocaleConstant.FREE_INSPECTION + message.obj = buffer.copyOf(bytesRead) + sendMessage(message) + } + } + + CurrentSegment.SearchMarker -> { + //搜索标识器 + SearchMarkerActivity.weakReferenceHandler?.apply { + val message = obtainMessage() + message.what = LocaleConstant.SEARCH_MARKER + message.obj = buffer.copyOf(bytesRead) + sendMessage(message) + } + } + + else -> { + Log.d( + kTag, "空状态 ===> ${buffer.copyOf(bytesRead).contentToString()}" + ) + } + } } } } catch (e: IOException) { @@ -94,18 +107,17 @@ } } - fun closeSerialPort() { - if (gpioState.get() == 0) { - Log.d(kTag, "closeSerialPort: 已经是低电位,直接返回") - return + fun writeCommand(commandArray: ArrayList) { + // 使用线程池发送数据 + commandArray.forEach { command -> + sendExecutor.submit { + outStream.write(command.code) + outStream.flush() + } + Thread.sleep(1000) } - // 降低串口电位 - gpioManager.setGpioLow("18") - gpioState.set(0) - Log.d(kTag, "closeSerialPort: 降低串口电位") } - override fun onBind(intent: Intent?): IBinder { return ServiceBinder() } diff --git a/app/src/main/java/com/casic/common/detector/gd/utils/CurrentSegment.kt b/app/src/main/java/com/casic/common/detector/gd/utils/CurrentSegment.kt new file mode 100644 index 0000000..0606b72 --- /dev/null +++ b/app/src/main/java/com/casic/common/detector/gd/utils/CurrentSegment.kt @@ -0,0 +1,23 @@ +package com.casic.common.detector.gd.utils + +sealed class CurrentSegment { + /** + * 安装标识器 + * */ + object InstallMarker : CurrentSegment() + + /** + * 自由巡检 + * */ + object FreeInspection : CurrentSegment() + + /** + * 搜索标识器 + * */ + object SearchMarker : CurrentSegment() + + /** + * 探测标识器深度 + * */ + object DetectMarkerDepth : CurrentSegment() +} diff --git a/app/src/main/java/com/casic/common/detector/gd/service/SerialPortService.kt b/app/src/main/java/com/casic/common/detector/gd/service/SerialPortService.kt index 42ad30c..c533b20 100644 --- a/app/src/main/java/com/casic/common/detector/gd/service/SerialPortService.kt +++ b/app/src/main/java/com/casic/common/detector/gd/service/SerialPortService.kt @@ -6,87 +6,100 @@ import android.os.IBinder import android.util.Log import com.casic.common.detector.gd.base.BaseApplication -import com.casic.common.detector.gd.callback.OnSerialPortListener -import com.casic.common.detector.gd.utils.GpioManager +import com.casic.common.detector.gd.utils.CurrentSegment +import com.casic.common.detector.gd.utils.LocaleConstant +import com.casic.common.detector.gd.utils.RuntimeCache +import com.casic.common.detector.gd.view.InstallMarkerActivity +import com.casic.common.detector.gd.view.MainActivity +import com.casic.common.detector.gd.view.SearchMarkerActivity import java.io.IOException import java.io.InputStream -import java.io.OutputStream import java.util.concurrent.Executors import java.util.concurrent.TimeUnit -import java.util.concurrent.atomic.AtomicInteger class SerialPortService : Service() { private val kTag = "SerialPortService" - private val gpioManager by lazy { GpioManager() } - private val serialPorts = BaseApplication.get().getSerialPorts() private val sendExecutor = Executors.newFixedThreadPool(5) - private var readExecutor = Executors.newSingleThreadScheduledExecutor() - private var outStream: OutputStream? = null - private var inStreamFirst: InputStream? = null - private var inStreamLast: InputStream? = null + private val readExecutor = Executors.newSingleThreadScheduledExecutor() - /** - * 读取数据 1 - * 暂停读取 0 - * */ - private val gpioState = AtomicInteger(0) + //输出流 + private val outStream by lazy { BaseApplication.get().getSerialPorts().first().outputStream } - fun openSerialPort(commandArray: ArrayList, listener: OnSerialPortListener) { - if (gpioState.get() != 1) { - gpioManager.setGpioHigh("18") - gpioState.set(1) - Log.d(kTag, "openSerialPort: 调高串口电位") - } else { - Log.d(kTag, "openSerialPort: 已经是高电位,直接读数据") - } + //输入流 + private val firstInStream by lazy { BaseApplication.get().getSerialPorts().first().inputStream } + private val lastInStream by lazy { BaseApplication.get().getSerialPorts().last().inputStream } + override fun onCreate() { + super.onCreate() try { - outStream = serialPorts.first().outputStream - // 使用线程池发送数据 - commandArray.forEach { command -> - sendExecutor.submit { - try { - outStream?.write(command.code) - outStream?.flush() - Thread.sleep(1000) - } catch (e: IOException) { - Log.e(kTag, "Error writing to output stream", e) - } catch (e: InterruptedException) { - Log.e(kTag, "Thread interrupted", e) - } - } - } - - inStreamFirst = serialPorts.first().inputStream - inStreamLast = serialPorts.last().inputStream - // 使用单线程调度器读取数据 readExecutor.scheduleAtFixedRate({ - if (gpioState.get() == 1) { - readData(inStreamFirst!!, listener) - } + readData(firstInStream) }, 100, 150, TimeUnit.MILLISECONDS) readExecutor.scheduleAtFixedRate({ - if (gpioState.get() == 1) { - readData(inStreamLast!!, listener) - } + readData(lastInStream) }, 100, 150, TimeUnit.MILLISECONDS) } catch (e: IOException) { e.printStackTrace() - closeSerialPort() } } - private fun readData(inputStream: InputStream, listener: OnSerialPortListener) { + private fun readData(inputStream: InputStream) { try { val buffer = ByteArray(1024) var bytesRead: Int while (inputStream.available() > 0) { bytesRead = inputStream.read(buffer) if (bytesRead > 0) { - listener.onDataReceived(buffer.copyOf(bytesRead)) + when (RuntimeCache.currentSegment) { + CurrentSegment.DetectMarkerDepth -> { + //深度 + SearchMarkerActivity.weakReferenceHandler?.apply { + val message = obtainMessage() + message.what = LocaleConstant.DETECT_MARKER_DEPTH + message.obj = buffer.copyOf(bytesRead) + sendMessage(message) + } + } + + CurrentSegment.InstallMarker -> { + //安装点 + InstallMarkerActivity.weakReferenceHandler?.apply { + val message = obtainMessage() + message.what = LocaleConstant.INSTALL_MARKER + message.obj = buffer.copyOf(bytesRead) + sendMessage(message) + } + } + + CurrentSegment.FreeInspection -> { + //自由巡检 + MainActivity.weakReferenceHandler?.apply { + val message = obtainMessage() + message.what = LocaleConstant.FREE_INSPECTION + message.obj = buffer.copyOf(bytesRead) + sendMessage(message) + } + } + + CurrentSegment.SearchMarker -> { + //搜索标识器 + SearchMarkerActivity.weakReferenceHandler?.apply { + val message = obtainMessage() + message.what = LocaleConstant.SEARCH_MARKER + message.obj = buffer.copyOf(bytesRead) + sendMessage(message) + } + } + + else -> { + Log.d( + kTag, "空状态 ===> ${buffer.copyOf(bytesRead).contentToString()}" + ) + } + } } } } catch (e: IOException) { @@ -94,18 +107,17 @@ } } - fun closeSerialPort() { - if (gpioState.get() == 0) { - Log.d(kTag, "closeSerialPort: 已经是低电位,直接返回") - return + fun writeCommand(commandArray: ArrayList) { + // 使用线程池发送数据 + commandArray.forEach { command -> + sendExecutor.submit { + outStream.write(command.code) + outStream.flush() + } + Thread.sleep(1000) } - // 降低串口电位 - gpioManager.setGpioLow("18") - gpioState.set(0) - Log.d(kTag, "closeSerialPort: 降低串口电位") } - override fun onBind(intent: Intent?): IBinder { return ServiceBinder() } diff --git a/app/src/main/java/com/casic/common/detector/gd/utils/CurrentSegment.kt b/app/src/main/java/com/casic/common/detector/gd/utils/CurrentSegment.kt new file mode 100644 index 0000000..0606b72 --- /dev/null +++ b/app/src/main/java/com/casic/common/detector/gd/utils/CurrentSegment.kt @@ -0,0 +1,23 @@ +package com.casic.common.detector.gd.utils + +sealed class CurrentSegment { + /** + * 安装标识器 + * */ + object InstallMarker : CurrentSegment() + + /** + * 自由巡检 + * */ + object FreeInspection : CurrentSegment() + + /** + * 搜索标识器 + * */ + object SearchMarker : CurrentSegment() + + /** + * 探测标识器深度 + * */ + object DetectMarkerDepth : CurrentSegment() +} diff --git a/app/src/main/java/com/casic/common/detector/gd/utils/LocaleConstant.kt b/app/src/main/java/com/casic/common/detector/gd/utils/LocaleConstant.kt index b6e804b..2334680 100644 --- a/app/src/main/java/com/casic/common/detector/gd/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/common/detector/gd/utils/LocaleConstant.kt @@ -13,8 +13,11 @@ ) const val PERMISSIONS_CODE = 999 - const val RADIUS_SIZE = 100 //相距多少米才聚合,单位:米 const val MAX_DISTANCE = 5.5f //表盘最大显示距离 + const val FREE_INSPECTION = 20250101 + const val INSTALL_MARKER = 20250102 + const val DETECT_MARKER_DEPTH = 20250103 + const val SEARCH_MARKER = 20250104 const val AUTO_SAVE = "AUTO_SAVE" const val USER_ACCOUNT = "USER_ACCOUNT" diff --git a/app/src/main/java/com/casic/common/detector/gd/service/SerialPortService.kt b/app/src/main/java/com/casic/common/detector/gd/service/SerialPortService.kt index 42ad30c..c533b20 100644 --- a/app/src/main/java/com/casic/common/detector/gd/service/SerialPortService.kt +++ b/app/src/main/java/com/casic/common/detector/gd/service/SerialPortService.kt @@ -6,87 +6,100 @@ import android.os.IBinder import android.util.Log import com.casic.common.detector.gd.base.BaseApplication -import com.casic.common.detector.gd.callback.OnSerialPortListener -import com.casic.common.detector.gd.utils.GpioManager +import com.casic.common.detector.gd.utils.CurrentSegment +import com.casic.common.detector.gd.utils.LocaleConstant +import com.casic.common.detector.gd.utils.RuntimeCache +import com.casic.common.detector.gd.view.InstallMarkerActivity +import com.casic.common.detector.gd.view.MainActivity +import com.casic.common.detector.gd.view.SearchMarkerActivity import java.io.IOException import java.io.InputStream -import java.io.OutputStream import java.util.concurrent.Executors import java.util.concurrent.TimeUnit -import java.util.concurrent.atomic.AtomicInteger class SerialPortService : Service() { private val kTag = "SerialPortService" - private val gpioManager by lazy { GpioManager() } - private val serialPorts = BaseApplication.get().getSerialPorts() private val sendExecutor = Executors.newFixedThreadPool(5) - private var readExecutor = Executors.newSingleThreadScheduledExecutor() - private var outStream: OutputStream? = null - private var inStreamFirst: InputStream? = null - private var inStreamLast: InputStream? = null + private val readExecutor = Executors.newSingleThreadScheduledExecutor() - /** - * 读取数据 1 - * 暂停读取 0 - * */ - private val gpioState = AtomicInteger(0) + //输出流 + private val outStream by lazy { BaseApplication.get().getSerialPorts().first().outputStream } - fun openSerialPort(commandArray: ArrayList, listener: OnSerialPortListener) { - if (gpioState.get() != 1) { - gpioManager.setGpioHigh("18") - gpioState.set(1) - Log.d(kTag, "openSerialPort: 调高串口电位") - } else { - Log.d(kTag, "openSerialPort: 已经是高电位,直接读数据") - } + //输入流 + private val firstInStream by lazy { BaseApplication.get().getSerialPorts().first().inputStream } + private val lastInStream by lazy { BaseApplication.get().getSerialPorts().last().inputStream } + override fun onCreate() { + super.onCreate() try { - outStream = serialPorts.first().outputStream - // 使用线程池发送数据 - commandArray.forEach { command -> - sendExecutor.submit { - try { - outStream?.write(command.code) - outStream?.flush() - Thread.sleep(1000) - } catch (e: IOException) { - Log.e(kTag, "Error writing to output stream", e) - } catch (e: InterruptedException) { - Log.e(kTag, "Thread interrupted", e) - } - } - } - - inStreamFirst = serialPorts.first().inputStream - inStreamLast = serialPorts.last().inputStream - // 使用单线程调度器读取数据 readExecutor.scheduleAtFixedRate({ - if (gpioState.get() == 1) { - readData(inStreamFirst!!, listener) - } + readData(firstInStream) }, 100, 150, TimeUnit.MILLISECONDS) readExecutor.scheduleAtFixedRate({ - if (gpioState.get() == 1) { - readData(inStreamLast!!, listener) - } + readData(lastInStream) }, 100, 150, TimeUnit.MILLISECONDS) } catch (e: IOException) { e.printStackTrace() - closeSerialPort() } } - private fun readData(inputStream: InputStream, listener: OnSerialPortListener) { + private fun readData(inputStream: InputStream) { try { val buffer = ByteArray(1024) var bytesRead: Int while (inputStream.available() > 0) { bytesRead = inputStream.read(buffer) if (bytesRead > 0) { - listener.onDataReceived(buffer.copyOf(bytesRead)) + when (RuntimeCache.currentSegment) { + CurrentSegment.DetectMarkerDepth -> { + //深度 + SearchMarkerActivity.weakReferenceHandler?.apply { + val message = obtainMessage() + message.what = LocaleConstant.DETECT_MARKER_DEPTH + message.obj = buffer.copyOf(bytesRead) + sendMessage(message) + } + } + + CurrentSegment.InstallMarker -> { + //安装点 + InstallMarkerActivity.weakReferenceHandler?.apply { + val message = obtainMessage() + message.what = LocaleConstant.INSTALL_MARKER + message.obj = buffer.copyOf(bytesRead) + sendMessage(message) + } + } + + CurrentSegment.FreeInspection -> { + //自由巡检 + MainActivity.weakReferenceHandler?.apply { + val message = obtainMessage() + message.what = LocaleConstant.FREE_INSPECTION + message.obj = buffer.copyOf(bytesRead) + sendMessage(message) + } + } + + CurrentSegment.SearchMarker -> { + //搜索标识器 + SearchMarkerActivity.weakReferenceHandler?.apply { + val message = obtainMessage() + message.what = LocaleConstant.SEARCH_MARKER + message.obj = buffer.copyOf(bytesRead) + sendMessage(message) + } + } + + else -> { + Log.d( + kTag, "空状态 ===> ${buffer.copyOf(bytesRead).contentToString()}" + ) + } + } } } } catch (e: IOException) { @@ -94,18 +107,17 @@ } } - fun closeSerialPort() { - if (gpioState.get() == 0) { - Log.d(kTag, "closeSerialPort: 已经是低电位,直接返回") - return + fun writeCommand(commandArray: ArrayList) { + // 使用线程池发送数据 + commandArray.forEach { command -> + sendExecutor.submit { + outStream.write(command.code) + outStream.flush() + } + Thread.sleep(1000) } - // 降低串口电位 - gpioManager.setGpioLow("18") - gpioState.set(0) - Log.d(kTag, "closeSerialPort: 降低串口电位") } - override fun onBind(intent: Intent?): IBinder { return ServiceBinder() } diff --git a/app/src/main/java/com/casic/common/detector/gd/utils/CurrentSegment.kt b/app/src/main/java/com/casic/common/detector/gd/utils/CurrentSegment.kt new file mode 100644 index 0000000..0606b72 --- /dev/null +++ b/app/src/main/java/com/casic/common/detector/gd/utils/CurrentSegment.kt @@ -0,0 +1,23 @@ +package com.casic.common.detector.gd.utils + +sealed class CurrentSegment { + /** + * 安装标识器 + * */ + object InstallMarker : CurrentSegment() + + /** + * 自由巡检 + * */ + object FreeInspection : CurrentSegment() + + /** + * 搜索标识器 + * */ + object SearchMarker : CurrentSegment() + + /** + * 探测标识器深度 + * */ + object DetectMarkerDepth : CurrentSegment() +} diff --git a/app/src/main/java/com/casic/common/detector/gd/utils/LocaleConstant.kt b/app/src/main/java/com/casic/common/detector/gd/utils/LocaleConstant.kt index b6e804b..2334680 100644 --- a/app/src/main/java/com/casic/common/detector/gd/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/common/detector/gd/utils/LocaleConstant.kt @@ -13,8 +13,11 @@ ) const val PERMISSIONS_CODE = 999 - const val RADIUS_SIZE = 100 //相距多少米才聚合,单位:米 const val MAX_DISTANCE = 5.5f //表盘最大显示距离 + const val FREE_INSPECTION = 20250101 + const val INSTALL_MARKER = 20250102 + const val DETECT_MARKER_DEPTH = 20250103 + const val SEARCH_MARKER = 20250104 const val AUTO_SAVE = "AUTO_SAVE" const val USER_ACCOUNT = "USER_ACCOUNT" diff --git a/app/src/main/java/com/casic/common/detector/gd/utils/RuntimeCache.kt b/app/src/main/java/com/casic/common/detector/gd/utils/RuntimeCache.kt new file mode 100644 index 0000000..104f971 --- /dev/null +++ b/app/src/main/java/com/casic/common/detector/gd/utils/RuntimeCache.kt @@ -0,0 +1,5 @@ +package com.casic.common.detector.gd.utils + +object RuntimeCache { + var currentSegment: CurrentSegment? = null +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/common/detector/gd/service/SerialPortService.kt b/app/src/main/java/com/casic/common/detector/gd/service/SerialPortService.kt index 42ad30c..c533b20 100644 --- a/app/src/main/java/com/casic/common/detector/gd/service/SerialPortService.kt +++ b/app/src/main/java/com/casic/common/detector/gd/service/SerialPortService.kt @@ -6,87 +6,100 @@ import android.os.IBinder import android.util.Log import com.casic.common.detector.gd.base.BaseApplication -import com.casic.common.detector.gd.callback.OnSerialPortListener -import com.casic.common.detector.gd.utils.GpioManager +import com.casic.common.detector.gd.utils.CurrentSegment +import com.casic.common.detector.gd.utils.LocaleConstant +import com.casic.common.detector.gd.utils.RuntimeCache +import com.casic.common.detector.gd.view.InstallMarkerActivity +import com.casic.common.detector.gd.view.MainActivity +import com.casic.common.detector.gd.view.SearchMarkerActivity import java.io.IOException import java.io.InputStream -import java.io.OutputStream import java.util.concurrent.Executors import java.util.concurrent.TimeUnit -import java.util.concurrent.atomic.AtomicInteger class SerialPortService : Service() { private val kTag = "SerialPortService" - private val gpioManager by lazy { GpioManager() } - private val serialPorts = BaseApplication.get().getSerialPorts() private val sendExecutor = Executors.newFixedThreadPool(5) - private var readExecutor = Executors.newSingleThreadScheduledExecutor() - private var outStream: OutputStream? = null - private var inStreamFirst: InputStream? = null - private var inStreamLast: InputStream? = null + private val readExecutor = Executors.newSingleThreadScheduledExecutor() - /** - * 读取数据 1 - * 暂停读取 0 - * */ - private val gpioState = AtomicInteger(0) + //输出流 + private val outStream by lazy { BaseApplication.get().getSerialPorts().first().outputStream } - fun openSerialPort(commandArray: ArrayList, listener: OnSerialPortListener) { - if (gpioState.get() != 1) { - gpioManager.setGpioHigh("18") - gpioState.set(1) - Log.d(kTag, "openSerialPort: 调高串口电位") - } else { - Log.d(kTag, "openSerialPort: 已经是高电位,直接读数据") - } + //输入流 + private val firstInStream by lazy { BaseApplication.get().getSerialPorts().first().inputStream } + private val lastInStream by lazy { BaseApplication.get().getSerialPorts().last().inputStream } + override fun onCreate() { + super.onCreate() try { - outStream = serialPorts.first().outputStream - // 使用线程池发送数据 - commandArray.forEach { command -> - sendExecutor.submit { - try { - outStream?.write(command.code) - outStream?.flush() - Thread.sleep(1000) - } catch (e: IOException) { - Log.e(kTag, "Error writing to output stream", e) - } catch (e: InterruptedException) { - Log.e(kTag, "Thread interrupted", e) - } - } - } - - inStreamFirst = serialPorts.first().inputStream - inStreamLast = serialPorts.last().inputStream - // 使用单线程调度器读取数据 readExecutor.scheduleAtFixedRate({ - if (gpioState.get() == 1) { - readData(inStreamFirst!!, listener) - } + readData(firstInStream) }, 100, 150, TimeUnit.MILLISECONDS) readExecutor.scheduleAtFixedRate({ - if (gpioState.get() == 1) { - readData(inStreamLast!!, listener) - } + readData(lastInStream) }, 100, 150, TimeUnit.MILLISECONDS) } catch (e: IOException) { e.printStackTrace() - closeSerialPort() } } - private fun readData(inputStream: InputStream, listener: OnSerialPortListener) { + private fun readData(inputStream: InputStream) { try { val buffer = ByteArray(1024) var bytesRead: Int while (inputStream.available() > 0) { bytesRead = inputStream.read(buffer) if (bytesRead > 0) { - listener.onDataReceived(buffer.copyOf(bytesRead)) + when (RuntimeCache.currentSegment) { + CurrentSegment.DetectMarkerDepth -> { + //深度 + SearchMarkerActivity.weakReferenceHandler?.apply { + val message = obtainMessage() + message.what = LocaleConstant.DETECT_MARKER_DEPTH + message.obj = buffer.copyOf(bytesRead) + sendMessage(message) + } + } + + CurrentSegment.InstallMarker -> { + //安装点 + InstallMarkerActivity.weakReferenceHandler?.apply { + val message = obtainMessage() + message.what = LocaleConstant.INSTALL_MARKER + message.obj = buffer.copyOf(bytesRead) + sendMessage(message) + } + } + + CurrentSegment.FreeInspection -> { + //自由巡检 + MainActivity.weakReferenceHandler?.apply { + val message = obtainMessage() + message.what = LocaleConstant.FREE_INSPECTION + message.obj = buffer.copyOf(bytesRead) + sendMessage(message) + } + } + + CurrentSegment.SearchMarker -> { + //搜索标识器 + SearchMarkerActivity.weakReferenceHandler?.apply { + val message = obtainMessage() + message.what = LocaleConstant.SEARCH_MARKER + message.obj = buffer.copyOf(bytesRead) + sendMessage(message) + } + } + + else -> { + Log.d( + kTag, "空状态 ===> ${buffer.copyOf(bytesRead).contentToString()}" + ) + } + } } } } catch (e: IOException) { @@ -94,18 +107,17 @@ } } - fun closeSerialPort() { - if (gpioState.get() == 0) { - Log.d(kTag, "closeSerialPort: 已经是低电位,直接返回") - return + fun writeCommand(commandArray: ArrayList) { + // 使用线程池发送数据 + commandArray.forEach { command -> + sendExecutor.submit { + outStream.write(command.code) + outStream.flush() + } + Thread.sleep(1000) } - // 降低串口电位 - gpioManager.setGpioLow("18") - gpioState.set(0) - Log.d(kTag, "closeSerialPort: 降低串口电位") } - override fun onBind(intent: Intent?): IBinder { return ServiceBinder() } diff --git a/app/src/main/java/com/casic/common/detector/gd/utils/CurrentSegment.kt b/app/src/main/java/com/casic/common/detector/gd/utils/CurrentSegment.kt new file mode 100644 index 0000000..0606b72 --- /dev/null +++ b/app/src/main/java/com/casic/common/detector/gd/utils/CurrentSegment.kt @@ -0,0 +1,23 @@ +package com.casic.common.detector.gd.utils + +sealed class CurrentSegment { + /** + * 安装标识器 + * */ + object InstallMarker : CurrentSegment() + + /** + * 自由巡检 + * */ + object FreeInspection : CurrentSegment() + + /** + * 搜索标识器 + * */ + object SearchMarker : CurrentSegment() + + /** + * 探测标识器深度 + * */ + object DetectMarkerDepth : CurrentSegment() +} diff --git a/app/src/main/java/com/casic/common/detector/gd/utils/LocaleConstant.kt b/app/src/main/java/com/casic/common/detector/gd/utils/LocaleConstant.kt index b6e804b..2334680 100644 --- a/app/src/main/java/com/casic/common/detector/gd/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/common/detector/gd/utils/LocaleConstant.kt @@ -13,8 +13,11 @@ ) const val PERMISSIONS_CODE = 999 - const val RADIUS_SIZE = 100 //相距多少米才聚合,单位:米 const val MAX_DISTANCE = 5.5f //表盘最大显示距离 + const val FREE_INSPECTION = 20250101 + const val INSTALL_MARKER = 20250102 + const val DETECT_MARKER_DEPTH = 20250103 + const val SEARCH_MARKER = 20250104 const val AUTO_SAVE = "AUTO_SAVE" const val USER_ACCOUNT = "USER_ACCOUNT" diff --git a/app/src/main/java/com/casic/common/detector/gd/utils/RuntimeCache.kt b/app/src/main/java/com/casic/common/detector/gd/utils/RuntimeCache.kt new file mode 100644 index 0000000..104f971 --- /dev/null +++ b/app/src/main/java/com/casic/common/detector/gd/utils/RuntimeCache.kt @@ -0,0 +1,5 @@ +package com.casic.common.detector.gd.utils + +object RuntimeCache { + var currentSegment: CurrentSegment? = null +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/common/detector/gd/view/InstallMarkerActivity.kt b/app/src/main/java/com/casic/common/detector/gd/view/InstallMarkerActivity.kt index cb02061..2b9ab70 100644 --- a/app/src/main/java/com/casic/common/detector/gd/view/InstallMarkerActivity.kt +++ b/app/src/main/java/com/casic/common/detector/gd/view/InstallMarkerActivity.kt @@ -11,7 +11,9 @@ import android.media.SoundPool import android.os.Bundle import android.os.CountDownTimer +import android.os.Handler import android.os.IBinder +import android.os.Message import android.util.Log import android.view.View import android.widget.AdapterView @@ -22,7 +24,6 @@ import com.casic.common.detector.gd.bean.MarkerLocalBean import com.casic.common.detector.gd.callback.OnGetLocationListener import com.casic.common.detector.gd.callback.OnImageCompressListener -import com.casic.common.detector.gd.callback.OnSerialPortListener import com.casic.common.detector.gd.databinding.ActivityInstallMarkerBinding import com.casic.common.detector.gd.extensions.compressImage import com.casic.common.detector.gd.extensions.getDefaultValue @@ -33,9 +34,11 @@ import com.casic.common.detector.gd.extensions.toMarkerId import com.casic.common.detector.gd.extensions.toObjectType import com.casic.common.detector.gd.service.SerialPortService +import com.casic.common.detector.gd.utils.CurrentSegment import com.casic.common.detector.gd.utils.DataBaseManager import com.casic.common.detector.gd.utils.LocaleConstant import com.casic.common.detector.gd.utils.LocationKit +import com.casic.common.detector.gd.utils.RuntimeCache import com.casic.common.detector.gd.vm.TaskViewModel import com.luck.picture.lib.basic.PictureSelector import com.luck.picture.lib.config.SelectMimeType @@ -52,13 +55,13 @@ import com.pengxh.kt.lite.utils.LoadState import com.pengxh.kt.lite.utils.LoadingDialog import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.widget.TitleBarView import java.io.File import java.util.Calendar import java.util.Date -class InstallMarkerActivity : KotlinBaseActivity(), - OnSerialPortListener { +class InstallMarkerActivity : KotlinBaseActivity(), Handler.Callback { private val kTag = "InstallMarkerActivity" private val context = this @@ -255,22 +258,23 @@ LoadingDialog.show(this, "标识器读取中,请稍后...") countDownTimer.start() binding.readMarkerButton.isEnabled = false - serialPortService?.openSerialPort(arrayListOf('2'), this) + RuntimeCache.currentSegment = CurrentSegment.InstallMarker + serialPortService?.writeCommand(arrayListOf('2')) } } - - override fun onDataReceived(buffer: ByteArray) { - if (buffer.isEmpty()) return - if ((buffer.first().toInt() and 0xFF).toString(16).uppercase() == "30") { - val markerId = buffer.toMarkerId() - runOnUiThread { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == LocaleConstant.INSTALL_MARKER) { + val buffer = msg.obj as ByteArray + if ((buffer.first().toInt() and 0xFF).toString(16).uppercase() == "30") { + val markerId = buffer.toMarkerId() LoadingDialog.dismiss() countDownTimer.cancel() binding.readMarkerButton.isEnabled = true binding.identifierInclude.identifierIdView.text = markerId } } + return true } /** @@ -378,7 +382,13 @@ } } + companion object { + var weakReferenceHandler: WeakReferenceHandler? = null + } + override fun initOnCreate(savedInstanceState: Bundle?) { + weakReferenceHandler = WeakReferenceHandler(this) + //绑定串口通信服务 Intent(this, SerialPortService::class.java).also { bindService(it, serviceConnection, Context.BIND_AUTO_CREATE) @@ -542,7 +552,7 @@ override fun onDestroy() { super.onDestroy() - serialPortService?.closeSerialPort() + RuntimeCache.currentSegment = null locationKit.stopLocation() unbindService(serviceConnection) } diff --git a/app/src/main/java/com/casic/common/detector/gd/service/SerialPortService.kt b/app/src/main/java/com/casic/common/detector/gd/service/SerialPortService.kt index 42ad30c..c533b20 100644 --- a/app/src/main/java/com/casic/common/detector/gd/service/SerialPortService.kt +++ b/app/src/main/java/com/casic/common/detector/gd/service/SerialPortService.kt @@ -6,87 +6,100 @@ import android.os.IBinder import android.util.Log import com.casic.common.detector.gd.base.BaseApplication -import com.casic.common.detector.gd.callback.OnSerialPortListener -import com.casic.common.detector.gd.utils.GpioManager +import com.casic.common.detector.gd.utils.CurrentSegment +import com.casic.common.detector.gd.utils.LocaleConstant +import com.casic.common.detector.gd.utils.RuntimeCache +import com.casic.common.detector.gd.view.InstallMarkerActivity +import com.casic.common.detector.gd.view.MainActivity +import com.casic.common.detector.gd.view.SearchMarkerActivity import java.io.IOException import java.io.InputStream -import java.io.OutputStream import java.util.concurrent.Executors import java.util.concurrent.TimeUnit -import java.util.concurrent.atomic.AtomicInteger class SerialPortService : Service() { private val kTag = "SerialPortService" - private val gpioManager by lazy { GpioManager() } - private val serialPorts = BaseApplication.get().getSerialPorts() private val sendExecutor = Executors.newFixedThreadPool(5) - private var readExecutor = Executors.newSingleThreadScheduledExecutor() - private var outStream: OutputStream? = null - private var inStreamFirst: InputStream? = null - private var inStreamLast: InputStream? = null + private val readExecutor = Executors.newSingleThreadScheduledExecutor() - /** - * 读取数据 1 - * 暂停读取 0 - * */ - private val gpioState = AtomicInteger(0) + //输出流 + private val outStream by lazy { BaseApplication.get().getSerialPorts().first().outputStream } - fun openSerialPort(commandArray: ArrayList, listener: OnSerialPortListener) { - if (gpioState.get() != 1) { - gpioManager.setGpioHigh("18") - gpioState.set(1) - Log.d(kTag, "openSerialPort: 调高串口电位") - } else { - Log.d(kTag, "openSerialPort: 已经是高电位,直接读数据") - } + //输入流 + private val firstInStream by lazy { BaseApplication.get().getSerialPorts().first().inputStream } + private val lastInStream by lazy { BaseApplication.get().getSerialPorts().last().inputStream } + override fun onCreate() { + super.onCreate() try { - outStream = serialPorts.first().outputStream - // 使用线程池发送数据 - commandArray.forEach { command -> - sendExecutor.submit { - try { - outStream?.write(command.code) - outStream?.flush() - Thread.sleep(1000) - } catch (e: IOException) { - Log.e(kTag, "Error writing to output stream", e) - } catch (e: InterruptedException) { - Log.e(kTag, "Thread interrupted", e) - } - } - } - - inStreamFirst = serialPorts.first().inputStream - inStreamLast = serialPorts.last().inputStream - // 使用单线程调度器读取数据 readExecutor.scheduleAtFixedRate({ - if (gpioState.get() == 1) { - readData(inStreamFirst!!, listener) - } + readData(firstInStream) }, 100, 150, TimeUnit.MILLISECONDS) readExecutor.scheduleAtFixedRate({ - if (gpioState.get() == 1) { - readData(inStreamLast!!, listener) - } + readData(lastInStream) }, 100, 150, TimeUnit.MILLISECONDS) } catch (e: IOException) { e.printStackTrace() - closeSerialPort() } } - private fun readData(inputStream: InputStream, listener: OnSerialPortListener) { + private fun readData(inputStream: InputStream) { try { val buffer = ByteArray(1024) var bytesRead: Int while (inputStream.available() > 0) { bytesRead = inputStream.read(buffer) if (bytesRead > 0) { - listener.onDataReceived(buffer.copyOf(bytesRead)) + when (RuntimeCache.currentSegment) { + CurrentSegment.DetectMarkerDepth -> { + //深度 + SearchMarkerActivity.weakReferenceHandler?.apply { + val message = obtainMessage() + message.what = LocaleConstant.DETECT_MARKER_DEPTH + message.obj = buffer.copyOf(bytesRead) + sendMessage(message) + } + } + + CurrentSegment.InstallMarker -> { + //安装点 + InstallMarkerActivity.weakReferenceHandler?.apply { + val message = obtainMessage() + message.what = LocaleConstant.INSTALL_MARKER + message.obj = buffer.copyOf(bytesRead) + sendMessage(message) + } + } + + CurrentSegment.FreeInspection -> { + //自由巡检 + MainActivity.weakReferenceHandler?.apply { + val message = obtainMessage() + message.what = LocaleConstant.FREE_INSPECTION + message.obj = buffer.copyOf(bytesRead) + sendMessage(message) + } + } + + CurrentSegment.SearchMarker -> { + //搜索标识器 + SearchMarkerActivity.weakReferenceHandler?.apply { + val message = obtainMessage() + message.what = LocaleConstant.SEARCH_MARKER + message.obj = buffer.copyOf(bytesRead) + sendMessage(message) + } + } + + else -> { + Log.d( + kTag, "空状态 ===> ${buffer.copyOf(bytesRead).contentToString()}" + ) + } + } } } } catch (e: IOException) { @@ -94,18 +107,17 @@ } } - fun closeSerialPort() { - if (gpioState.get() == 0) { - Log.d(kTag, "closeSerialPort: 已经是低电位,直接返回") - return + fun writeCommand(commandArray: ArrayList) { + // 使用线程池发送数据 + commandArray.forEach { command -> + sendExecutor.submit { + outStream.write(command.code) + outStream.flush() + } + Thread.sleep(1000) } - // 降低串口电位 - gpioManager.setGpioLow("18") - gpioState.set(0) - Log.d(kTag, "closeSerialPort: 降低串口电位") } - override fun onBind(intent: Intent?): IBinder { return ServiceBinder() } diff --git a/app/src/main/java/com/casic/common/detector/gd/utils/CurrentSegment.kt b/app/src/main/java/com/casic/common/detector/gd/utils/CurrentSegment.kt new file mode 100644 index 0000000..0606b72 --- /dev/null +++ b/app/src/main/java/com/casic/common/detector/gd/utils/CurrentSegment.kt @@ -0,0 +1,23 @@ +package com.casic.common.detector.gd.utils + +sealed class CurrentSegment { + /** + * 安装标识器 + * */ + object InstallMarker : CurrentSegment() + + /** + * 自由巡检 + * */ + object FreeInspection : CurrentSegment() + + /** + * 搜索标识器 + * */ + object SearchMarker : CurrentSegment() + + /** + * 探测标识器深度 + * */ + object DetectMarkerDepth : CurrentSegment() +} diff --git a/app/src/main/java/com/casic/common/detector/gd/utils/LocaleConstant.kt b/app/src/main/java/com/casic/common/detector/gd/utils/LocaleConstant.kt index b6e804b..2334680 100644 --- a/app/src/main/java/com/casic/common/detector/gd/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/common/detector/gd/utils/LocaleConstant.kt @@ -13,8 +13,11 @@ ) const val PERMISSIONS_CODE = 999 - const val RADIUS_SIZE = 100 //相距多少米才聚合,单位:米 const val MAX_DISTANCE = 5.5f //表盘最大显示距离 + const val FREE_INSPECTION = 20250101 + const val INSTALL_MARKER = 20250102 + const val DETECT_MARKER_DEPTH = 20250103 + const val SEARCH_MARKER = 20250104 const val AUTO_SAVE = "AUTO_SAVE" const val USER_ACCOUNT = "USER_ACCOUNT" diff --git a/app/src/main/java/com/casic/common/detector/gd/utils/RuntimeCache.kt b/app/src/main/java/com/casic/common/detector/gd/utils/RuntimeCache.kt new file mode 100644 index 0000000..104f971 --- /dev/null +++ b/app/src/main/java/com/casic/common/detector/gd/utils/RuntimeCache.kt @@ -0,0 +1,5 @@ +package com.casic.common.detector.gd.utils + +object RuntimeCache { + var currentSegment: CurrentSegment? = null +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/common/detector/gd/view/InstallMarkerActivity.kt b/app/src/main/java/com/casic/common/detector/gd/view/InstallMarkerActivity.kt index cb02061..2b9ab70 100644 --- a/app/src/main/java/com/casic/common/detector/gd/view/InstallMarkerActivity.kt +++ b/app/src/main/java/com/casic/common/detector/gd/view/InstallMarkerActivity.kt @@ -11,7 +11,9 @@ import android.media.SoundPool import android.os.Bundle import android.os.CountDownTimer +import android.os.Handler import android.os.IBinder +import android.os.Message import android.util.Log import android.view.View import android.widget.AdapterView @@ -22,7 +24,6 @@ import com.casic.common.detector.gd.bean.MarkerLocalBean import com.casic.common.detector.gd.callback.OnGetLocationListener import com.casic.common.detector.gd.callback.OnImageCompressListener -import com.casic.common.detector.gd.callback.OnSerialPortListener import com.casic.common.detector.gd.databinding.ActivityInstallMarkerBinding import com.casic.common.detector.gd.extensions.compressImage import com.casic.common.detector.gd.extensions.getDefaultValue @@ -33,9 +34,11 @@ import com.casic.common.detector.gd.extensions.toMarkerId import com.casic.common.detector.gd.extensions.toObjectType import com.casic.common.detector.gd.service.SerialPortService +import com.casic.common.detector.gd.utils.CurrentSegment import com.casic.common.detector.gd.utils.DataBaseManager import com.casic.common.detector.gd.utils.LocaleConstant import com.casic.common.detector.gd.utils.LocationKit +import com.casic.common.detector.gd.utils.RuntimeCache import com.casic.common.detector.gd.vm.TaskViewModel import com.luck.picture.lib.basic.PictureSelector import com.luck.picture.lib.config.SelectMimeType @@ -52,13 +55,13 @@ import com.pengxh.kt.lite.utils.LoadState import com.pengxh.kt.lite.utils.LoadingDialog import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.widget.TitleBarView import java.io.File import java.util.Calendar import java.util.Date -class InstallMarkerActivity : KotlinBaseActivity(), - OnSerialPortListener { +class InstallMarkerActivity : KotlinBaseActivity(), Handler.Callback { private val kTag = "InstallMarkerActivity" private val context = this @@ -255,22 +258,23 @@ LoadingDialog.show(this, "标识器读取中,请稍后...") countDownTimer.start() binding.readMarkerButton.isEnabled = false - serialPortService?.openSerialPort(arrayListOf('2'), this) + RuntimeCache.currentSegment = CurrentSegment.InstallMarker + serialPortService?.writeCommand(arrayListOf('2')) } } - - override fun onDataReceived(buffer: ByteArray) { - if (buffer.isEmpty()) return - if ((buffer.first().toInt() and 0xFF).toString(16).uppercase() == "30") { - val markerId = buffer.toMarkerId() - runOnUiThread { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == LocaleConstant.INSTALL_MARKER) { + val buffer = msg.obj as ByteArray + if ((buffer.first().toInt() and 0xFF).toString(16).uppercase() == "30") { + val markerId = buffer.toMarkerId() LoadingDialog.dismiss() countDownTimer.cancel() binding.readMarkerButton.isEnabled = true binding.identifierInclude.identifierIdView.text = markerId } } + return true } /** @@ -378,7 +382,13 @@ } } + companion object { + var weakReferenceHandler: WeakReferenceHandler? = null + } + override fun initOnCreate(savedInstanceState: Bundle?) { + weakReferenceHandler = WeakReferenceHandler(this) + //绑定串口通信服务 Intent(this, SerialPortService::class.java).also { bindService(it, serviceConnection, Context.BIND_AUTO_CREATE) @@ -542,7 +552,7 @@ override fun onDestroy() { super.onDestroy() - serialPortService?.closeSerialPort() + RuntimeCache.currentSegment = null locationKit.stopLocation() unbindService(serviceConnection) } diff --git a/app/src/main/java/com/casic/common/detector/gd/view/MainActivity.kt b/app/src/main/java/com/casic/common/detector/gd/view/MainActivity.kt index b4afad3..06af88e 100644 --- a/app/src/main/java/com/casic/common/detector/gd/view/MainActivity.kt +++ b/app/src/main/java/com/casic/common/detector/gd/view/MainActivity.kt @@ -10,7 +10,9 @@ import android.media.AudioAttributes import android.media.SoundPool import android.os.Bundle +import android.os.Handler import android.os.IBinder +import android.os.Message import android.util.Log import android.view.KeyEvent import android.view.View @@ -36,7 +38,6 @@ import com.casic.common.detector.gd.bean.TaskLocalBean import com.casic.common.detector.gd.callback.OnGetAddressListener import com.casic.common.detector.gd.callback.OnGetLocationListener -import com.casic.common.detector.gd.callback.OnSerialPortListener import com.casic.common.detector.gd.databinding.ActivityMainBinding import com.casic.common.detector.gd.extensions.appendDownloadUrl import com.casic.common.detector.gd.extensions.createTaskCode @@ -47,12 +48,15 @@ import com.casic.common.detector.gd.model.TaskModel import com.casic.common.detector.gd.service.NtripConnectService import com.casic.common.detector.gd.service.SerialPortService +import com.casic.common.detector.gd.utils.CurrentSegment import com.casic.common.detector.gd.utils.DataBaseManager import com.casic.common.detector.gd.utils.ExcelKit import com.casic.common.detector.gd.utils.FileType +import com.casic.common.detector.gd.utils.GpioManager import com.casic.common.detector.gd.utils.LocaleConstant import com.casic.common.detector.gd.utils.LocationKit import com.casic.common.detector.gd.utils.RouteOnMap +import com.casic.common.detector.gd.utils.RuntimeCache import com.casic.common.detector.gd.vm.TaskViewModel import com.casic.common.detector.gd.widgets.MarkerDetailDialog import com.casic.common.detector.gd.widgets.QueryMarkerDialog @@ -69,6 +73,7 @@ import com.pengxh.kt.lite.utils.LoadState import com.pengxh.kt.lite.utils.LoadingDialog import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.widget.TitleBarView import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.pengxh.kt.lite.widget.dialog.AlertInputDialog @@ -78,13 +83,45 @@ import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import java.io.File +import java.util.concurrent.atomic.AtomicInteger class MainActivity : KotlinBaseActivity(), AMap.OnMarkerClickListener, - OnMapLongClickListener, OnSerialPortListener { + OnMapLongClickListener, Handler.Callback { private val kTag = "MainActivity" private val context = this + + /***************************************************************************************/ + private val gpioManager by lazy { GpioManager() } + + /** + * 读取数据 1 + * 暂停读取 0 + * */ + private val gpioState = AtomicInteger(0) + private fun openSerialPort() { + if (gpioState.get() != 1) { + gpioManager.setGpioHigh("18") + gpioState.set(1) + Log.d(kTag, "openSerialPort: 调高串口电位") + } else { + Log.d(kTag, "openSerialPort: 已经是高电位,直接读数据") + } + } + + private fun closeSerialPort() { + if (gpioState.get() == 0) { + Log.d(kTag, "closeSerialPort: 已经是低电位,直接返回") + return + } + // 降低串口电位 + gpioManager.setGpioLow("18") + gpioState.set(0) + Log.d(kTag, "closeSerialPort: 降低串口电位") + } + + /***************************************************************************************/ private val samplePopupWindow by lazy { SamplePopupWindow(this) } private val detailDialog by lazy { MarkerDetailDialog(this) } private val locationKit by lazy { LocationKit(this) } @@ -129,7 +166,13 @@ } } + companion object { + var weakReferenceHandler: WeakReferenceHandler? = null + } + override fun initOnCreate(savedInstanceState: Bundle?) { + weakReferenceHandler = WeakReferenceHandler(this) + //地图初始化 initMapConfig(savedInstanceState) @@ -374,7 +417,12 @@ } else { "此工单下无标识器,将执行自由巡检任务".show(context) freeTaskId = task.taskId - openSerialPort() + + binding.stopFreeTaskButton.visibility = View.VISIBLE + isFreeTask = true + RuntimeCache.currentSegment = + CurrentSegment.FreeInspection + serialPortService?.writeCommand(arrayListOf('2', '6')) } } @@ -431,7 +479,7 @@ override fun onConfirmClick() { isFreeTask = false soundPool.autoPause() - serialPortService?.closeSerialPort() + RuntimeCache.currentSegment = null binding.stopFreeTaskButton.visibility = View.GONE if (freeTaskId.isNullOrBlank()) { @@ -476,64 +524,64 @@ val userId = SaveKeyValues.getValue(LocaleConstant.USER_ID, "") as String taskViewModel.createFreeTask(context, userId, value) - openSerialPort() + binding.stopFreeTaskButton.visibility = View.VISIBLE + isFreeTask = true + RuntimeCache.currentSegment = CurrentSegment.FreeInspection + serialPortService?.writeCommand(arrayListOf('2', '6')) } override fun onCancelClick() {} }).build().show() } - private fun openSerialPort() { - binding.stopFreeTaskButton.visibility = View.VISIBLE - isFreeTask = true - serialPortService?.openSerialPort(arrayListOf('2', '6'), this) - } - - override fun onDataReceived(buffer: ByteArray) { - if (buffer.isEmpty()) return - //只响一次,因为探测频率高,所以依旧是连续的报警声 - soundPool.play(soundResourceId, 1f, 1f, 0, 0, 1f) - when ((buffer.first().toInt() and 0xFF).toString(16).uppercase()) { - "4E" -> { - val signalEnergy = buffer.toSignalStrength() - if (signalEnergy <= 1500) { - detailDialog.show() - } - } - - "30" -> { - val markerId = buffer.toMarkerId() - //添加地图Marker - if (!ids.contains(markerId)) { - //根据markerId查询标识器经纬度 - val labels = DataBaseManager.get.queryMarkerById(markerId) - if (labels.isNotEmpty()) { - val bean = labels.first() - aMap.addMarker( - MarkerOptions() - .position(LatLng(bean.lat.toDouble(), bean.lng.toDouble())) - .icon(BitmapDescriptorFactory.fromResource(R.mipmap.label_blue1)) - ) - } - } - ids.add(markerId) - - //显示标识器详细信息 - if (!detailDialog.isShowing) { - val markerBean = DataBaseManager.get.queryMarkerById(markerId).firstOrNull() - if (markerBean == null) { - "无法查询到此ID【${markerId}】的信息".show(context) - } else { - detailDialog.setMarker(markerBean) + override fun handleMessage(msg: Message): Boolean { + if (msg.what == LocaleConstant.FREE_INSPECTION) { + val buffer = msg.obj as ByteArray + //只响一次,因为探测频率高,所以依旧是连续的报警声 + soundPool.play(soundResourceId, 1f, 1f, 0, 0, 1f) + when ((buffer.first().toInt() and 0xFF).toString(16).uppercase()) { + "4E" -> { + val signalEnergy = buffer.toSignalStrength() + if (signalEnergy <= 1500) { detailDialog.show() } } - } - else -> { - Log.d(kTag, "乱码数据: ${buffer.contentToString()}") + "30" -> { + val markerId = buffer.toMarkerId() + //添加地图Marker + if (!ids.contains(markerId)) { + //根据markerId查询标识器经纬度 + val labels = DataBaseManager.get.queryMarkerById(markerId) + if (labels.isNotEmpty()) { + val bean = labels.first() + aMap.addMarker( + MarkerOptions() + .position(LatLng(bean.lat.toDouble(), bean.lng.toDouble())) + .icon(BitmapDescriptorFactory.fromResource(R.mipmap.label_blue1)) + ) + } + } + ids.add(markerId) + + //显示标识器详细信息 + if (!detailDialog.isShowing) { + val markerBean = DataBaseManager.get.queryMarkerById(markerId).firstOrNull() + if (markerBean == null) { + "无法查询到此ID【${markerId}】的信息".show(context) + } else { + detailDialog.setMarker(markerBean) + detailDialog.show() + } + } + } + + else -> { + Log.d(kTag, "乱码数据: ${buffer.contentToString()}") + } } } + return true } override fun observeRequestState() { @@ -816,6 +864,7 @@ override fun onResume() { super.onResume() binding.mapView.onResume() + openSerialPort() } override fun onPause() { @@ -834,6 +883,7 @@ soundPool.autoPause() locationKit.stopLocation() unbindService(serviceConnection) + closeSerialPort() BaseApplication.get().closeSerialPort() } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/common/detector/gd/service/SerialPortService.kt b/app/src/main/java/com/casic/common/detector/gd/service/SerialPortService.kt index 42ad30c..c533b20 100644 --- a/app/src/main/java/com/casic/common/detector/gd/service/SerialPortService.kt +++ b/app/src/main/java/com/casic/common/detector/gd/service/SerialPortService.kt @@ -6,87 +6,100 @@ import android.os.IBinder import android.util.Log import com.casic.common.detector.gd.base.BaseApplication -import com.casic.common.detector.gd.callback.OnSerialPortListener -import com.casic.common.detector.gd.utils.GpioManager +import com.casic.common.detector.gd.utils.CurrentSegment +import com.casic.common.detector.gd.utils.LocaleConstant +import com.casic.common.detector.gd.utils.RuntimeCache +import com.casic.common.detector.gd.view.InstallMarkerActivity +import com.casic.common.detector.gd.view.MainActivity +import com.casic.common.detector.gd.view.SearchMarkerActivity import java.io.IOException import java.io.InputStream -import java.io.OutputStream import java.util.concurrent.Executors import java.util.concurrent.TimeUnit -import java.util.concurrent.atomic.AtomicInteger class SerialPortService : Service() { private val kTag = "SerialPortService" - private val gpioManager by lazy { GpioManager() } - private val serialPorts = BaseApplication.get().getSerialPorts() private val sendExecutor = Executors.newFixedThreadPool(5) - private var readExecutor = Executors.newSingleThreadScheduledExecutor() - private var outStream: OutputStream? = null - private var inStreamFirst: InputStream? = null - private var inStreamLast: InputStream? = null + private val readExecutor = Executors.newSingleThreadScheduledExecutor() - /** - * 读取数据 1 - * 暂停读取 0 - * */ - private val gpioState = AtomicInteger(0) + //输出流 + private val outStream by lazy { BaseApplication.get().getSerialPorts().first().outputStream } - fun openSerialPort(commandArray: ArrayList, listener: OnSerialPortListener) { - if (gpioState.get() != 1) { - gpioManager.setGpioHigh("18") - gpioState.set(1) - Log.d(kTag, "openSerialPort: 调高串口电位") - } else { - Log.d(kTag, "openSerialPort: 已经是高电位,直接读数据") - } + //输入流 + private val firstInStream by lazy { BaseApplication.get().getSerialPorts().first().inputStream } + private val lastInStream by lazy { BaseApplication.get().getSerialPorts().last().inputStream } + override fun onCreate() { + super.onCreate() try { - outStream = serialPorts.first().outputStream - // 使用线程池发送数据 - commandArray.forEach { command -> - sendExecutor.submit { - try { - outStream?.write(command.code) - outStream?.flush() - Thread.sleep(1000) - } catch (e: IOException) { - Log.e(kTag, "Error writing to output stream", e) - } catch (e: InterruptedException) { - Log.e(kTag, "Thread interrupted", e) - } - } - } - - inStreamFirst = serialPorts.first().inputStream - inStreamLast = serialPorts.last().inputStream - // 使用单线程调度器读取数据 readExecutor.scheduleAtFixedRate({ - if (gpioState.get() == 1) { - readData(inStreamFirst!!, listener) - } + readData(firstInStream) }, 100, 150, TimeUnit.MILLISECONDS) readExecutor.scheduleAtFixedRate({ - if (gpioState.get() == 1) { - readData(inStreamLast!!, listener) - } + readData(lastInStream) }, 100, 150, TimeUnit.MILLISECONDS) } catch (e: IOException) { e.printStackTrace() - closeSerialPort() } } - private fun readData(inputStream: InputStream, listener: OnSerialPortListener) { + private fun readData(inputStream: InputStream) { try { val buffer = ByteArray(1024) var bytesRead: Int while (inputStream.available() > 0) { bytesRead = inputStream.read(buffer) if (bytesRead > 0) { - listener.onDataReceived(buffer.copyOf(bytesRead)) + when (RuntimeCache.currentSegment) { + CurrentSegment.DetectMarkerDepth -> { + //深度 + SearchMarkerActivity.weakReferenceHandler?.apply { + val message = obtainMessage() + message.what = LocaleConstant.DETECT_MARKER_DEPTH + message.obj = buffer.copyOf(bytesRead) + sendMessage(message) + } + } + + CurrentSegment.InstallMarker -> { + //安装点 + InstallMarkerActivity.weakReferenceHandler?.apply { + val message = obtainMessage() + message.what = LocaleConstant.INSTALL_MARKER + message.obj = buffer.copyOf(bytesRead) + sendMessage(message) + } + } + + CurrentSegment.FreeInspection -> { + //自由巡检 + MainActivity.weakReferenceHandler?.apply { + val message = obtainMessage() + message.what = LocaleConstant.FREE_INSPECTION + message.obj = buffer.copyOf(bytesRead) + sendMessage(message) + } + } + + CurrentSegment.SearchMarker -> { + //搜索标识器 + SearchMarkerActivity.weakReferenceHandler?.apply { + val message = obtainMessage() + message.what = LocaleConstant.SEARCH_MARKER + message.obj = buffer.copyOf(bytesRead) + sendMessage(message) + } + } + + else -> { + Log.d( + kTag, "空状态 ===> ${buffer.copyOf(bytesRead).contentToString()}" + ) + } + } } } } catch (e: IOException) { @@ -94,18 +107,17 @@ } } - fun closeSerialPort() { - if (gpioState.get() == 0) { - Log.d(kTag, "closeSerialPort: 已经是低电位,直接返回") - return + fun writeCommand(commandArray: ArrayList) { + // 使用线程池发送数据 + commandArray.forEach { command -> + sendExecutor.submit { + outStream.write(command.code) + outStream.flush() + } + Thread.sleep(1000) } - // 降低串口电位 - gpioManager.setGpioLow("18") - gpioState.set(0) - Log.d(kTag, "closeSerialPort: 降低串口电位") } - override fun onBind(intent: Intent?): IBinder { return ServiceBinder() } diff --git a/app/src/main/java/com/casic/common/detector/gd/utils/CurrentSegment.kt b/app/src/main/java/com/casic/common/detector/gd/utils/CurrentSegment.kt new file mode 100644 index 0000000..0606b72 --- /dev/null +++ b/app/src/main/java/com/casic/common/detector/gd/utils/CurrentSegment.kt @@ -0,0 +1,23 @@ +package com.casic.common.detector.gd.utils + +sealed class CurrentSegment { + /** + * 安装标识器 + * */ + object InstallMarker : CurrentSegment() + + /** + * 自由巡检 + * */ + object FreeInspection : CurrentSegment() + + /** + * 搜索标识器 + * */ + object SearchMarker : CurrentSegment() + + /** + * 探测标识器深度 + * */ + object DetectMarkerDepth : CurrentSegment() +} diff --git a/app/src/main/java/com/casic/common/detector/gd/utils/LocaleConstant.kt b/app/src/main/java/com/casic/common/detector/gd/utils/LocaleConstant.kt index b6e804b..2334680 100644 --- a/app/src/main/java/com/casic/common/detector/gd/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/common/detector/gd/utils/LocaleConstant.kt @@ -13,8 +13,11 @@ ) const val PERMISSIONS_CODE = 999 - const val RADIUS_SIZE = 100 //相距多少米才聚合,单位:米 const val MAX_DISTANCE = 5.5f //表盘最大显示距离 + const val FREE_INSPECTION = 20250101 + const val INSTALL_MARKER = 20250102 + const val DETECT_MARKER_DEPTH = 20250103 + const val SEARCH_MARKER = 20250104 const val AUTO_SAVE = "AUTO_SAVE" const val USER_ACCOUNT = "USER_ACCOUNT" diff --git a/app/src/main/java/com/casic/common/detector/gd/utils/RuntimeCache.kt b/app/src/main/java/com/casic/common/detector/gd/utils/RuntimeCache.kt new file mode 100644 index 0000000..104f971 --- /dev/null +++ b/app/src/main/java/com/casic/common/detector/gd/utils/RuntimeCache.kt @@ -0,0 +1,5 @@ +package com.casic.common.detector.gd.utils + +object RuntimeCache { + var currentSegment: CurrentSegment? = null +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/common/detector/gd/view/InstallMarkerActivity.kt b/app/src/main/java/com/casic/common/detector/gd/view/InstallMarkerActivity.kt index cb02061..2b9ab70 100644 --- a/app/src/main/java/com/casic/common/detector/gd/view/InstallMarkerActivity.kt +++ b/app/src/main/java/com/casic/common/detector/gd/view/InstallMarkerActivity.kt @@ -11,7 +11,9 @@ import android.media.SoundPool import android.os.Bundle import android.os.CountDownTimer +import android.os.Handler import android.os.IBinder +import android.os.Message import android.util.Log import android.view.View import android.widget.AdapterView @@ -22,7 +24,6 @@ import com.casic.common.detector.gd.bean.MarkerLocalBean import com.casic.common.detector.gd.callback.OnGetLocationListener import com.casic.common.detector.gd.callback.OnImageCompressListener -import com.casic.common.detector.gd.callback.OnSerialPortListener import com.casic.common.detector.gd.databinding.ActivityInstallMarkerBinding import com.casic.common.detector.gd.extensions.compressImage import com.casic.common.detector.gd.extensions.getDefaultValue @@ -33,9 +34,11 @@ import com.casic.common.detector.gd.extensions.toMarkerId import com.casic.common.detector.gd.extensions.toObjectType import com.casic.common.detector.gd.service.SerialPortService +import com.casic.common.detector.gd.utils.CurrentSegment import com.casic.common.detector.gd.utils.DataBaseManager import com.casic.common.detector.gd.utils.LocaleConstant import com.casic.common.detector.gd.utils.LocationKit +import com.casic.common.detector.gd.utils.RuntimeCache import com.casic.common.detector.gd.vm.TaskViewModel import com.luck.picture.lib.basic.PictureSelector import com.luck.picture.lib.config.SelectMimeType @@ -52,13 +55,13 @@ import com.pengxh.kt.lite.utils.LoadState import com.pengxh.kt.lite.utils.LoadingDialog import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.widget.TitleBarView import java.io.File import java.util.Calendar import java.util.Date -class InstallMarkerActivity : KotlinBaseActivity(), - OnSerialPortListener { +class InstallMarkerActivity : KotlinBaseActivity(), Handler.Callback { private val kTag = "InstallMarkerActivity" private val context = this @@ -255,22 +258,23 @@ LoadingDialog.show(this, "标识器读取中,请稍后...") countDownTimer.start() binding.readMarkerButton.isEnabled = false - serialPortService?.openSerialPort(arrayListOf('2'), this) + RuntimeCache.currentSegment = CurrentSegment.InstallMarker + serialPortService?.writeCommand(arrayListOf('2')) } } - - override fun onDataReceived(buffer: ByteArray) { - if (buffer.isEmpty()) return - if ((buffer.first().toInt() and 0xFF).toString(16).uppercase() == "30") { - val markerId = buffer.toMarkerId() - runOnUiThread { + override fun handleMessage(msg: Message): Boolean { + if (msg.what == LocaleConstant.INSTALL_MARKER) { + val buffer = msg.obj as ByteArray + if ((buffer.first().toInt() and 0xFF).toString(16).uppercase() == "30") { + val markerId = buffer.toMarkerId() LoadingDialog.dismiss() countDownTimer.cancel() binding.readMarkerButton.isEnabled = true binding.identifierInclude.identifierIdView.text = markerId } } + return true } /** @@ -378,7 +382,13 @@ } } + companion object { + var weakReferenceHandler: WeakReferenceHandler? = null + } + override fun initOnCreate(savedInstanceState: Bundle?) { + weakReferenceHandler = WeakReferenceHandler(this) + //绑定串口通信服务 Intent(this, SerialPortService::class.java).also { bindService(it, serviceConnection, Context.BIND_AUTO_CREATE) @@ -542,7 +552,7 @@ override fun onDestroy() { super.onDestroy() - serialPortService?.closeSerialPort() + RuntimeCache.currentSegment = null locationKit.stopLocation() unbindService(serviceConnection) } diff --git a/app/src/main/java/com/casic/common/detector/gd/view/MainActivity.kt b/app/src/main/java/com/casic/common/detector/gd/view/MainActivity.kt index b4afad3..06af88e 100644 --- a/app/src/main/java/com/casic/common/detector/gd/view/MainActivity.kt +++ b/app/src/main/java/com/casic/common/detector/gd/view/MainActivity.kt @@ -10,7 +10,9 @@ import android.media.AudioAttributes import android.media.SoundPool import android.os.Bundle +import android.os.Handler import android.os.IBinder +import android.os.Message import android.util.Log import android.view.KeyEvent import android.view.View @@ -36,7 +38,6 @@ import com.casic.common.detector.gd.bean.TaskLocalBean import com.casic.common.detector.gd.callback.OnGetAddressListener import com.casic.common.detector.gd.callback.OnGetLocationListener -import com.casic.common.detector.gd.callback.OnSerialPortListener import com.casic.common.detector.gd.databinding.ActivityMainBinding import com.casic.common.detector.gd.extensions.appendDownloadUrl import com.casic.common.detector.gd.extensions.createTaskCode @@ -47,12 +48,15 @@ import com.casic.common.detector.gd.model.TaskModel import com.casic.common.detector.gd.service.NtripConnectService import com.casic.common.detector.gd.service.SerialPortService +import com.casic.common.detector.gd.utils.CurrentSegment import com.casic.common.detector.gd.utils.DataBaseManager import com.casic.common.detector.gd.utils.ExcelKit import com.casic.common.detector.gd.utils.FileType +import com.casic.common.detector.gd.utils.GpioManager import com.casic.common.detector.gd.utils.LocaleConstant import com.casic.common.detector.gd.utils.LocationKit import com.casic.common.detector.gd.utils.RouteOnMap +import com.casic.common.detector.gd.utils.RuntimeCache import com.casic.common.detector.gd.vm.TaskViewModel import com.casic.common.detector.gd.widgets.MarkerDetailDialog import com.casic.common.detector.gd.widgets.QueryMarkerDialog @@ -69,6 +73,7 @@ import com.pengxh.kt.lite.utils.LoadState import com.pengxh.kt.lite.utils.LoadingDialog import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.widget.TitleBarView import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.pengxh.kt.lite.widget.dialog.AlertInputDialog @@ -78,13 +83,45 @@ import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import java.io.File +import java.util.concurrent.atomic.AtomicInteger class MainActivity : KotlinBaseActivity(), AMap.OnMarkerClickListener, - OnMapLongClickListener, OnSerialPortListener { + OnMapLongClickListener, Handler.Callback { private val kTag = "MainActivity" private val context = this + + /***************************************************************************************/ + private val gpioManager by lazy { GpioManager() } + + /** + * 读取数据 1 + * 暂停读取 0 + * */ + private val gpioState = AtomicInteger(0) + private fun openSerialPort() { + if (gpioState.get() != 1) { + gpioManager.setGpioHigh("18") + gpioState.set(1) + Log.d(kTag, "openSerialPort: 调高串口电位") + } else { + Log.d(kTag, "openSerialPort: 已经是高电位,直接读数据") + } + } + + private fun closeSerialPort() { + if (gpioState.get() == 0) { + Log.d(kTag, "closeSerialPort: 已经是低电位,直接返回") + return + } + // 降低串口电位 + gpioManager.setGpioLow("18") + gpioState.set(0) + Log.d(kTag, "closeSerialPort: 降低串口电位") + } + + /***************************************************************************************/ private val samplePopupWindow by lazy { SamplePopupWindow(this) } private val detailDialog by lazy { MarkerDetailDialog(this) } private val locationKit by lazy { LocationKit(this) } @@ -129,7 +166,13 @@ } } + companion object { + var weakReferenceHandler: WeakReferenceHandler? = null + } + override fun initOnCreate(savedInstanceState: Bundle?) { + weakReferenceHandler = WeakReferenceHandler(this) + //地图初始化 initMapConfig(savedInstanceState) @@ -374,7 +417,12 @@ } else { "此工单下无标识器,将执行自由巡检任务".show(context) freeTaskId = task.taskId - openSerialPort() + + binding.stopFreeTaskButton.visibility = View.VISIBLE + isFreeTask = true + RuntimeCache.currentSegment = + CurrentSegment.FreeInspection + serialPortService?.writeCommand(arrayListOf('2', '6')) } } @@ -431,7 +479,7 @@ override fun onConfirmClick() { isFreeTask = false soundPool.autoPause() - serialPortService?.closeSerialPort() + RuntimeCache.currentSegment = null binding.stopFreeTaskButton.visibility = View.GONE if (freeTaskId.isNullOrBlank()) { @@ -476,64 +524,64 @@ val userId = SaveKeyValues.getValue(LocaleConstant.USER_ID, "") as String taskViewModel.createFreeTask(context, userId, value) - openSerialPort() + binding.stopFreeTaskButton.visibility = View.VISIBLE + isFreeTask = true + RuntimeCache.currentSegment = CurrentSegment.FreeInspection + serialPortService?.writeCommand(arrayListOf('2', '6')) } override fun onCancelClick() {} }).build().show() } - private fun openSerialPort() { - binding.stopFreeTaskButton.visibility = View.VISIBLE - isFreeTask = true - serialPortService?.openSerialPort(arrayListOf('2', '6'), this) - } - - override fun onDataReceived(buffer: ByteArray) { - if (buffer.isEmpty()) return - //只响一次,因为探测频率高,所以依旧是连续的报警声 - soundPool.play(soundResourceId, 1f, 1f, 0, 0, 1f) - when ((buffer.first().toInt() and 0xFF).toString(16).uppercase()) { - "4E" -> { - val signalEnergy = buffer.toSignalStrength() - if (signalEnergy <= 1500) { - detailDialog.show() - } - } - - "30" -> { - val markerId = buffer.toMarkerId() - //添加地图Marker - if (!ids.contains(markerId)) { - //根据markerId查询标识器经纬度 - val labels = DataBaseManager.get.queryMarkerById(markerId) - if (labels.isNotEmpty()) { - val bean = labels.first() - aMap.addMarker( - MarkerOptions() - .position(LatLng(bean.lat.toDouble(), bean.lng.toDouble())) - .icon(BitmapDescriptorFactory.fromResource(R.mipmap.label_blue1)) - ) - } - } - ids.add(markerId) - - //显示标识器详细信息 - if (!detailDialog.isShowing) { - val markerBean = DataBaseManager.get.queryMarkerById(markerId).firstOrNull() - if (markerBean == null) { - "无法查询到此ID【${markerId}】的信息".show(context) - } else { - detailDialog.setMarker(markerBean) + override fun handleMessage(msg: Message): Boolean { + if (msg.what == LocaleConstant.FREE_INSPECTION) { + val buffer = msg.obj as ByteArray + //只响一次,因为探测频率高,所以依旧是连续的报警声 + soundPool.play(soundResourceId, 1f, 1f, 0, 0, 1f) + when ((buffer.first().toInt() and 0xFF).toString(16).uppercase()) { + "4E" -> { + val signalEnergy = buffer.toSignalStrength() + if (signalEnergy <= 1500) { detailDialog.show() } } - } - else -> { - Log.d(kTag, "乱码数据: ${buffer.contentToString()}") + "30" -> { + val markerId = buffer.toMarkerId() + //添加地图Marker + if (!ids.contains(markerId)) { + //根据markerId查询标识器经纬度 + val labels = DataBaseManager.get.queryMarkerById(markerId) + if (labels.isNotEmpty()) { + val bean = labels.first() + aMap.addMarker( + MarkerOptions() + .position(LatLng(bean.lat.toDouble(), bean.lng.toDouble())) + .icon(BitmapDescriptorFactory.fromResource(R.mipmap.label_blue1)) + ) + } + } + ids.add(markerId) + + //显示标识器详细信息 + if (!detailDialog.isShowing) { + val markerBean = DataBaseManager.get.queryMarkerById(markerId).firstOrNull() + if (markerBean == null) { + "无法查询到此ID【${markerId}】的信息".show(context) + } else { + detailDialog.setMarker(markerBean) + detailDialog.show() + } + } + } + + else -> { + Log.d(kTag, "乱码数据: ${buffer.contentToString()}") + } } } + return true } override fun observeRequestState() { @@ -816,6 +864,7 @@ override fun onResume() { super.onResume() binding.mapView.onResume() + openSerialPort() } override fun onPause() { @@ -834,6 +883,7 @@ soundPool.autoPause() locationKit.stopLocation() unbindService(serviceConnection) + closeSerialPort() BaseApplication.get().closeSerialPort() } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/common/detector/gd/view/SearchMarkerActivity.kt b/app/src/main/java/com/casic/common/detector/gd/view/SearchMarkerActivity.kt index 7fc6532..54beacd 100644 --- a/app/src/main/java/com/casic/common/detector/gd/view/SearchMarkerActivity.kt +++ b/app/src/main/java/com/casic/common/detector/gd/view/SearchMarkerActivity.kt @@ -13,7 +13,9 @@ import android.media.SoundPool import android.os.Bundle import android.os.CountDownTimer +import android.os.Handler import android.os.IBinder +import android.os.Message import android.util.Log import android.view.View import android.view.WindowManager @@ -24,16 +26,17 @@ import com.amap.api.maps.model.LatLng import com.casic.common.detector.gd.R import com.casic.common.detector.gd.callback.OnGetLocationListener -import com.casic.common.detector.gd.callback.OnSerialPortListener import com.casic.common.detector.gd.databinding.ActivitySearchMarkerBinding import com.casic.common.detector.gd.extensions.toBuryDepth import com.casic.common.detector.gd.extensions.toMarkerId import com.casic.common.detector.gd.extensions.toSignalStrength import com.casic.common.detector.gd.model.MarkerDistanceData import com.casic.common.detector.gd.service.SerialPortService +import com.casic.common.detector.gd.utils.CurrentSegment import com.casic.common.detector.gd.utils.DataBaseManager import com.casic.common.detector.gd.utils.LocaleConstant import com.casic.common.detector.gd.utils.LocationKit +import com.casic.common.detector.gd.utils.RuntimeCache import com.casic.common.detector.gd.vm.TaskViewModel import com.casic.common.detector.gd.widgets.RadarScanView import com.pengxh.kt.lite.base.KotlinBaseActivity @@ -43,6 +46,7 @@ import com.pengxh.kt.lite.utils.LiteKitConstant import com.pengxh.kt.lite.utils.LoadingDialog import com.pengxh.kt.lite.utils.SaveKeyValues +import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.widget.dialog.AlertMessageDialog import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.delay @@ -53,7 +57,7 @@ import kotlin.math.atan2 class SearchMarkerActivity : KotlinBaseActivity(), - SensorEventListener { + SensorEventListener, Handler.Callback { private val kTag = "SearchMarkerActivity" private val context = this @@ -95,17 +99,17 @@ } override fun onServiceDisconnected(name: ComponentName?) { - if (name != null) { - serialPortService?.let { - // 确保在服务断开连接时释放资源 - it.closeSerialPort() - serialPortService = null - } - } + } } + companion object { + var weakReferenceHandler: WeakReferenceHandler? = null + } + override fun initOnCreate(savedInstanceState: Bundle?) { + weakReferenceHandler = WeakReferenceHandler(this) + val flag = intent.getStringExtra(LiteKitConstant.INTENT_PARAM_KEY) as String isExecuteTask = flag != "0" @@ -221,17 +225,8 @@ LoadingDialog.show(this, "正在探测标识器埋深,请稍后...") countDownTimer.start() // 发送读取标识器埋设深度指令 - serialPortService?.openSerialPort( - arrayListOf(tag), object : OnSerialPortListener { - override fun onDataReceived(buffer: ByteArray) { - if (buffer.isEmpty()) return - val tag = (buffer.first().toInt() and 0xFF).toString(16).uppercase() - if (tag == "53") { -// serialPortService?.closeSerialPort() - showDepthDialog(buffer.toBuryDepth()) - } - } - }) + RuntimeCache.currentSegment = CurrentSegment.DetectMarkerDepth + serialPortService?.writeCommand(arrayListOf(tag)) } } else { LoadingDialog.dismiss() @@ -256,6 +251,46 @@ } } + override fun handleMessage(msg: Message): Boolean { + val buffer = msg.obj as ByteArray + if (msg.what == LocaleConstant.DETECT_MARKER_DEPTH) { + val tag = (buffer.first().toInt() and 0xFF).toString(16).uppercase() + if (tag == "53") { + showDepthDialog(buffer.toBuryDepth()) + } + } else if (msg.what == LocaleConstant.SEARCH_MARKER) { + try { + // 读取到信号强度 + when ((buffer.first().toInt() and 0xFF).toString(16).uppercase()) { + "4E" -> { + val signalEnergy = buffer.toSignalStrength() + + //声音 + updateSound(signalEnergy) + + //信号强度显示 + updateProgressBar(signalEnergy) + + //搜索信号文字显示 + updateTextResult(signalEnergy) + } + + "30" -> { + handleMarker(buffer.toMarkerId()) + } + + else -> { + Log.d(kTag, "乱码数据: ${buffer.contentToString()}") + } + } + } catch (e: Exception) { + e.printStackTrace() + Log.e(kTag, "Error processing buffer data", e) + } + } + return true + } + private fun showDepthDialog(depth: Int) { countDownTimer.cancel() runOnUiThread { @@ -286,41 +321,8 @@ * 搜索标识器 * */ private fun searchMarker() { - serialPortService?.openSerialPort(arrayListOf('2', '6'), object : OnSerialPortListener { - override fun onDataReceived(buffer: ByteArray) { - if (buffer.isEmpty()) return - runOnUiThread { - try { - // 读取到信号强度 - when ((buffer.first().toInt() and 0xFF).toString(16).uppercase()) { - "4E" -> { - val signalEnergy = buffer.toSignalStrength() - - //声音 - updateSound(signalEnergy) - - //信号强度显示 - updateProgressBar(signalEnergy) - - //搜索信号文字显示 - updateTextResult(signalEnergy) - } - - "30" -> { - handleMarker(buffer.toMarkerId()) - } - - else -> { - Log.d(kTag, "乱码数据: ${buffer.contentToString()}") - } - } - } catch (e: Exception) { - e.printStackTrace() - Log.e(kTag, "Error processing buffer data", e) - } - } - } - }) + RuntimeCache.currentSegment = CurrentSegment.SearchMarker + serialPortService?.writeCommand(arrayListOf('2', '6')) } private fun updateSound(signalEnergy: Int) { @@ -515,7 +517,7 @@ override fun onDestroy() { super.onDestroy() soundPool.autoPause() - serialPortService?.closeSerialPort() + RuntimeCache.currentSegment = null locationKit.stopLocation() unbindService(serviceConnection) }