diff --git a/app/src/main/java/com/casic/detector/common/callback/OnSerialPortDataListener.kt b/app/src/main/java/com/casic/detector/common/callback/OnSerialPortDataListener.kt deleted file mode 100644 index b06a068..0000000 --- a/app/src/main/java/com/casic/detector/common/callback/OnSerialPortDataListener.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.detector.common.callback - -import java.io.OutputStream - -interface OnSerialPortDataListener { - fun write(outStream: OutputStream) - - fun onDataReceived(buffer: ByteArray) -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/detector/common/callback/OnSerialPortDataListener.kt b/app/src/main/java/com/casic/detector/common/callback/OnSerialPortDataListener.kt deleted file mode 100644 index b06a068..0000000 --- a/app/src/main/java/com/casic/detector/common/callback/OnSerialPortDataListener.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.detector.common.callback - -import java.io.OutputStream - -interface OnSerialPortDataListener { - fun write(outStream: OutputStream) - - fun onDataReceived(buffer: ByteArray) -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/detector/common/callback/OnSerialPortListener.kt b/app/src/main/java/com/casic/detector/common/callback/OnSerialPortListener.kt new file mode 100644 index 0000000..ae8ed0f --- /dev/null +++ b/app/src/main/java/com/casic/detector/common/callback/OnSerialPortListener.kt @@ -0,0 +1,5 @@ +package com.casic.detector.common.callback + +interface OnSerialPortListener { + fun onDataReceived(bytes: ByteArray) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/detector/common/callback/OnSerialPortDataListener.kt b/app/src/main/java/com/casic/detector/common/callback/OnSerialPortDataListener.kt deleted file mode 100644 index b06a068..0000000 --- a/app/src/main/java/com/casic/detector/common/callback/OnSerialPortDataListener.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.detector.common.callback - -import java.io.OutputStream - -interface OnSerialPortDataListener { - fun write(outStream: OutputStream) - - fun onDataReceived(buffer: ByteArray) -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/detector/common/callback/OnSerialPortListener.kt b/app/src/main/java/com/casic/detector/common/callback/OnSerialPortListener.kt new file mode 100644 index 0000000..ae8ed0f --- /dev/null +++ b/app/src/main/java/com/casic/detector/common/callback/OnSerialPortListener.kt @@ -0,0 +1,5 @@ +package com.casic.detector.common.callback + +interface OnSerialPortListener { + fun onDataReceived(bytes: ByteArray) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/detector/common/service/NtripConnectService.kt b/app/src/main/java/com/casic/detector/common/service/NtripConnectService.kt index 3279043..9d49a9a 100644 --- a/app/src/main/java/com/casic/detector/common/service/NtripConnectService.kt +++ b/app/src/main/java/com/casic/detector/common/service/NtripConnectService.kt @@ -1,10 +1,7 @@ package com.casic.detector.common.service import android.app.Service -import android.content.ComponentName -import android.content.Context import android.content.Intent -import android.content.ServiceConnection import android.os.Handler import android.os.IBinder import android.os.Message @@ -15,6 +12,7 @@ import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.LifecycleRegistry import androidx.lifecycle.lifecycleScope +import com.casic.detector.common.base.BaseApplication import com.casic.detector.common.extensions.convertToGPGGA import com.casic.detector.common.utils.LocaleConstant import com.casic.detector.common.utils.NtripAuthorizationCreator @@ -41,7 +39,6 @@ private val kTag = "NtripConnectService" private val registry = LifecycleRegistry(this) private var connectState = ConnectState.CLOSED - private var serialPortService: SerialPortService? = null private var outStream: OutputStream? = null private lateinit var socketClient: SocketClient @@ -65,11 +62,6 @@ override fun onCreate() { super.onCreate() weakReferenceHandler = WeakReferenceHandler(this) - //绑定串口通信服务 - Intent(this, SerialPortService::class.java).also { - bindService(it, serviceConnection, Context.BIND_AUTO_CREATE) - } - RtkLocationTool.getCurrentLocation(this) { val weakHandler = MainActivity.weakReferenceHandler ?: return@getCurrentLocation val message = weakHandler.obtainMessage() @@ -86,19 +78,6 @@ } } - private val serviceConnection = object : ServiceConnection { - override fun onServiceConnected(name: ComponentName?, iBinder: IBinder?) { - if (iBinder is SerialPortService.ServiceBinder) { - serialPortService = iBinder.getSerialPortService() - Log.d(kTag, "onServiceConnected: 服务已绑定") - } - } - - override fun onServiceDisconnected(name: ComponentName?) { - - } - } - override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { lifecycleScope.launch(Dispatchers.IO) { connectQianXunServer() @@ -117,7 +96,7 @@ if (result.contains("ICY 200 OK")) { "高精度定位服务连接成功".show(this) //连接服务即打开串口 - outStream = serialPortService?.getOutputStream() + outStream = BaseApplication.get().getSerialPorts().first().outputStream } } else { //居中显示 @@ -175,9 +154,4 @@ .build() socketClient.connect() } - - override fun onDestroy() { - super.onDestroy() - unbindService(serviceConnection) - } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/detector/common/callback/OnSerialPortDataListener.kt b/app/src/main/java/com/casic/detector/common/callback/OnSerialPortDataListener.kt deleted file mode 100644 index b06a068..0000000 --- a/app/src/main/java/com/casic/detector/common/callback/OnSerialPortDataListener.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.detector.common.callback - -import java.io.OutputStream - -interface OnSerialPortDataListener { - fun write(outStream: OutputStream) - - fun onDataReceived(buffer: ByteArray) -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/detector/common/callback/OnSerialPortListener.kt b/app/src/main/java/com/casic/detector/common/callback/OnSerialPortListener.kt new file mode 100644 index 0000000..ae8ed0f --- /dev/null +++ b/app/src/main/java/com/casic/detector/common/callback/OnSerialPortListener.kt @@ -0,0 +1,5 @@ +package com.casic.detector.common.callback + +interface OnSerialPortListener { + fun onDataReceived(bytes: ByteArray) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/detector/common/service/NtripConnectService.kt b/app/src/main/java/com/casic/detector/common/service/NtripConnectService.kt index 3279043..9d49a9a 100644 --- a/app/src/main/java/com/casic/detector/common/service/NtripConnectService.kt +++ b/app/src/main/java/com/casic/detector/common/service/NtripConnectService.kt @@ -1,10 +1,7 @@ package com.casic.detector.common.service import android.app.Service -import android.content.ComponentName -import android.content.Context import android.content.Intent -import android.content.ServiceConnection import android.os.Handler import android.os.IBinder import android.os.Message @@ -15,6 +12,7 @@ import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.LifecycleRegistry import androidx.lifecycle.lifecycleScope +import com.casic.detector.common.base.BaseApplication import com.casic.detector.common.extensions.convertToGPGGA import com.casic.detector.common.utils.LocaleConstant import com.casic.detector.common.utils.NtripAuthorizationCreator @@ -41,7 +39,6 @@ private val kTag = "NtripConnectService" private val registry = LifecycleRegistry(this) private var connectState = ConnectState.CLOSED - private var serialPortService: SerialPortService? = null private var outStream: OutputStream? = null private lateinit var socketClient: SocketClient @@ -65,11 +62,6 @@ override fun onCreate() { super.onCreate() weakReferenceHandler = WeakReferenceHandler(this) - //绑定串口通信服务 - Intent(this, SerialPortService::class.java).also { - bindService(it, serviceConnection, Context.BIND_AUTO_CREATE) - } - RtkLocationTool.getCurrentLocation(this) { val weakHandler = MainActivity.weakReferenceHandler ?: return@getCurrentLocation val message = weakHandler.obtainMessage() @@ -86,19 +78,6 @@ } } - private val serviceConnection = object : ServiceConnection { - override fun onServiceConnected(name: ComponentName?, iBinder: IBinder?) { - if (iBinder is SerialPortService.ServiceBinder) { - serialPortService = iBinder.getSerialPortService() - Log.d(kTag, "onServiceConnected: 服务已绑定") - } - } - - override fun onServiceDisconnected(name: ComponentName?) { - - } - } - override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { lifecycleScope.launch(Dispatchers.IO) { connectQianXunServer() @@ -117,7 +96,7 @@ if (result.contains("ICY 200 OK")) { "高精度定位服务连接成功".show(this) //连接服务即打开串口 - outStream = serialPortService?.getOutputStream() + outStream = BaseApplication.get().getSerialPorts().first().outputStream } } else { //居中显示 @@ -175,9 +154,4 @@ .build() socketClient.connect() } - - override fun onDestroy() { - super.onDestroy() - unbindService(serviceConnection) - } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/detector/common/service/SerialPortService.kt b/app/src/main/java/com/casic/detector/common/service/SerialPortService.kt index af54d85..6d9e518 100644 --- a/app/src/main/java/com/casic/detector/common/service/SerialPortService.kt +++ b/app/src/main/java/com/casic/detector/common/service/SerialPortService.kt @@ -5,30 +5,77 @@ import android.os.Binder import android.os.IBinder import android.util.Log -import androidx.lifecycle.Lifecycle -import androidx.lifecycle.LifecycleOwner -import androidx.lifecycle.LifecycleRegistry -import androidx.lifecycle.lifecycleScope import com.casic.detector.common.base.BaseApplication -import com.casic.detector.common.callback.OnSerialPortDataListener +import com.casic.detector.common.callback.OnSerialPortListener import com.casic.detector.common.utils.GpioManager -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.isActive -import kotlinx.coroutines.launch -import kotlinx.coroutines.withContext import java.io.IOException -import java.io.OutputStream +import java.util.concurrent.Executors -class SerialPortService : Service(), LifecycleOwner { + +class SerialPortService : Service() { private val kTag = "SerialPortService" - private val registry = LifecycleRegistry(this) private val gpioManager by lazy { GpioManager() } - private val serialPorts by lazy { BaseApplication.get().getSerialPorts() } - private var gpioState = "" + private val serialPorts = BaseApplication.get().getSerialPorts() + private var executor = Executors.newFixedThreadPool(2) //创建一个固定大小的线程池,可控制线程最大并发数,超出的线程会在队列中等待 - override fun getLifecycle(): Lifecycle { - return registry + /** + * 读取数据 1 + * 暂停读取 0 + * */ + private var gpioState = 0 + + fun openSerialPort(commandArray: ArrayList, listener: OnSerialPortListener) { + //调高串口电位 + gpioManager.setGpioHigh("18") + gpioState = 1 + Log.d(kTag, "openSerialPort: 调高串口电位") + + Thread.sleep(100) + + val outputStream = serialPorts.first().outputStream + commandArray.forEach { + outputStream.write(it.code) + outputStream.flush() + Thread.sleep(50) + } + + executor.execute { + //读 + while (gpioState == 1) { + try { + val byteArray = ByteArray(32) + val size = serialPorts.first().inputStream.read(byteArray) + if (size > 0) { + listener.onDataReceived(byteArray) + } + } catch (e: IOException) { + e.printStackTrace() + } + } + } + + executor.execute { + //读 + while (gpioState == 1) { + try { + val byteArray = ByteArray(16) + val size = serialPorts.last().inputStream.read(byteArray) + if (size > 0) { + listener.onDataReceived(byteArray) + } + } catch (e: IOException) { + e.printStackTrace() + } + } + } + } + + fun closeSerialPort() { + //降低串口电位 + gpioManager.setGpioLow("18") + gpioState = 0 + Log.d(kTag, "closeSerialPort: 降低串口电位") } override fun onBind(intent: Intent?): IBinder { @@ -40,73 +87,4 @@ return this@SerialPortService } } - - fun openSerialPort(listener: OnSerialPortDataListener) { - //调高串口电位 - gpioManager.setGpioHigh("18") - gpioState = "1" - Log.d(kTag, "openSerialPort: 调高串口电位") - - Thread.sleep(100) - - lifecycleScope.launch(Dispatchers.IO) { - serialPorts.apply { - //写 - listener.write(this[0].outputStream) - val stream = this[0].inputStream - //读 - while (isActive) { - try { - val buffer = ByteArray(16) - val size = stream.read(buffer) - if (size > 0) { - withContext(Dispatchers.Main) { - if (gpioState == "1") { - listener.onDataReceived(buffer) - } - } - } - } catch (e: IOException) { - e.printStackTrace() - } - } - } - } - - lifecycleScope.launch(Dispatchers.IO) { - serialPorts.apply { - val stream = this[1].inputStream - //读 - while (isActive) { - try { - val buffer = ByteArray(16) - val size = stream.read(buffer) - if (size > 0) { - withContext(Dispatchers.Main) { - if (gpioState == "1") { - listener.onDataReceived(buffer) - } - } - } - } catch (e: IOException) { - e.printStackTrace() - } - } - } - } - } - - fun getOutputStream(): OutputStream { - //调高串口电位 - gpioManager.setGpioHigh("18") - Log.d(kTag, "getOutputStream: 调高串口电位") - return serialPorts.last().outputStream - } - - fun closeSerialPort() { - //降低串口电位 - gpioManager.setGpioLow("18") - gpioState = "0" - Log.d(kTag, "closeSerialPort: 降低串口电位") - } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/detector/common/callback/OnSerialPortDataListener.kt b/app/src/main/java/com/casic/detector/common/callback/OnSerialPortDataListener.kt deleted file mode 100644 index b06a068..0000000 --- a/app/src/main/java/com/casic/detector/common/callback/OnSerialPortDataListener.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.detector.common.callback - -import java.io.OutputStream - -interface OnSerialPortDataListener { - fun write(outStream: OutputStream) - - fun onDataReceived(buffer: ByteArray) -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/detector/common/callback/OnSerialPortListener.kt b/app/src/main/java/com/casic/detector/common/callback/OnSerialPortListener.kt new file mode 100644 index 0000000..ae8ed0f --- /dev/null +++ b/app/src/main/java/com/casic/detector/common/callback/OnSerialPortListener.kt @@ -0,0 +1,5 @@ +package com.casic.detector.common.callback + +interface OnSerialPortListener { + fun onDataReceived(bytes: ByteArray) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/detector/common/service/NtripConnectService.kt b/app/src/main/java/com/casic/detector/common/service/NtripConnectService.kt index 3279043..9d49a9a 100644 --- a/app/src/main/java/com/casic/detector/common/service/NtripConnectService.kt +++ b/app/src/main/java/com/casic/detector/common/service/NtripConnectService.kt @@ -1,10 +1,7 @@ package com.casic.detector.common.service import android.app.Service -import android.content.ComponentName -import android.content.Context import android.content.Intent -import android.content.ServiceConnection import android.os.Handler import android.os.IBinder import android.os.Message @@ -15,6 +12,7 @@ import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.LifecycleRegistry import androidx.lifecycle.lifecycleScope +import com.casic.detector.common.base.BaseApplication import com.casic.detector.common.extensions.convertToGPGGA import com.casic.detector.common.utils.LocaleConstant import com.casic.detector.common.utils.NtripAuthorizationCreator @@ -41,7 +39,6 @@ private val kTag = "NtripConnectService" private val registry = LifecycleRegistry(this) private var connectState = ConnectState.CLOSED - private var serialPortService: SerialPortService? = null private var outStream: OutputStream? = null private lateinit var socketClient: SocketClient @@ -65,11 +62,6 @@ override fun onCreate() { super.onCreate() weakReferenceHandler = WeakReferenceHandler(this) - //绑定串口通信服务 - Intent(this, SerialPortService::class.java).also { - bindService(it, serviceConnection, Context.BIND_AUTO_CREATE) - } - RtkLocationTool.getCurrentLocation(this) { val weakHandler = MainActivity.weakReferenceHandler ?: return@getCurrentLocation val message = weakHandler.obtainMessage() @@ -86,19 +78,6 @@ } } - private val serviceConnection = object : ServiceConnection { - override fun onServiceConnected(name: ComponentName?, iBinder: IBinder?) { - if (iBinder is SerialPortService.ServiceBinder) { - serialPortService = iBinder.getSerialPortService() - Log.d(kTag, "onServiceConnected: 服务已绑定") - } - } - - override fun onServiceDisconnected(name: ComponentName?) { - - } - } - override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { lifecycleScope.launch(Dispatchers.IO) { connectQianXunServer() @@ -117,7 +96,7 @@ if (result.contains("ICY 200 OK")) { "高精度定位服务连接成功".show(this) //连接服务即打开串口 - outStream = serialPortService?.getOutputStream() + outStream = BaseApplication.get().getSerialPorts().first().outputStream } } else { //居中显示 @@ -175,9 +154,4 @@ .build() socketClient.connect() } - - override fun onDestroy() { - super.onDestroy() - unbindService(serviceConnection) - } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/detector/common/service/SerialPortService.kt b/app/src/main/java/com/casic/detector/common/service/SerialPortService.kt index af54d85..6d9e518 100644 --- a/app/src/main/java/com/casic/detector/common/service/SerialPortService.kt +++ b/app/src/main/java/com/casic/detector/common/service/SerialPortService.kt @@ -5,30 +5,77 @@ import android.os.Binder import android.os.IBinder import android.util.Log -import androidx.lifecycle.Lifecycle -import androidx.lifecycle.LifecycleOwner -import androidx.lifecycle.LifecycleRegistry -import androidx.lifecycle.lifecycleScope import com.casic.detector.common.base.BaseApplication -import com.casic.detector.common.callback.OnSerialPortDataListener +import com.casic.detector.common.callback.OnSerialPortListener import com.casic.detector.common.utils.GpioManager -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.isActive -import kotlinx.coroutines.launch -import kotlinx.coroutines.withContext import java.io.IOException -import java.io.OutputStream +import java.util.concurrent.Executors -class SerialPortService : Service(), LifecycleOwner { + +class SerialPortService : Service() { private val kTag = "SerialPortService" - private val registry = LifecycleRegistry(this) private val gpioManager by lazy { GpioManager() } - private val serialPorts by lazy { BaseApplication.get().getSerialPorts() } - private var gpioState = "" + private val serialPorts = BaseApplication.get().getSerialPorts() + private var executor = Executors.newFixedThreadPool(2) //创建一个固定大小的线程池,可控制线程最大并发数,超出的线程会在队列中等待 - override fun getLifecycle(): Lifecycle { - return registry + /** + * 读取数据 1 + * 暂停读取 0 + * */ + private var gpioState = 0 + + fun openSerialPort(commandArray: ArrayList, listener: OnSerialPortListener) { + //调高串口电位 + gpioManager.setGpioHigh("18") + gpioState = 1 + Log.d(kTag, "openSerialPort: 调高串口电位") + + Thread.sleep(100) + + val outputStream = serialPorts.first().outputStream + commandArray.forEach { + outputStream.write(it.code) + outputStream.flush() + Thread.sleep(50) + } + + executor.execute { + //读 + while (gpioState == 1) { + try { + val byteArray = ByteArray(32) + val size = serialPorts.first().inputStream.read(byteArray) + if (size > 0) { + listener.onDataReceived(byteArray) + } + } catch (e: IOException) { + e.printStackTrace() + } + } + } + + executor.execute { + //读 + while (gpioState == 1) { + try { + val byteArray = ByteArray(16) + val size = serialPorts.last().inputStream.read(byteArray) + if (size > 0) { + listener.onDataReceived(byteArray) + } + } catch (e: IOException) { + e.printStackTrace() + } + } + } + } + + fun closeSerialPort() { + //降低串口电位 + gpioManager.setGpioLow("18") + gpioState = 0 + Log.d(kTag, "closeSerialPort: 降低串口电位") } override fun onBind(intent: Intent?): IBinder { @@ -40,73 +87,4 @@ return this@SerialPortService } } - - fun openSerialPort(listener: OnSerialPortDataListener) { - //调高串口电位 - gpioManager.setGpioHigh("18") - gpioState = "1" - Log.d(kTag, "openSerialPort: 调高串口电位") - - Thread.sleep(100) - - lifecycleScope.launch(Dispatchers.IO) { - serialPorts.apply { - //写 - listener.write(this[0].outputStream) - val stream = this[0].inputStream - //读 - while (isActive) { - try { - val buffer = ByteArray(16) - val size = stream.read(buffer) - if (size > 0) { - withContext(Dispatchers.Main) { - if (gpioState == "1") { - listener.onDataReceived(buffer) - } - } - } - } catch (e: IOException) { - e.printStackTrace() - } - } - } - } - - lifecycleScope.launch(Dispatchers.IO) { - serialPorts.apply { - val stream = this[1].inputStream - //读 - while (isActive) { - try { - val buffer = ByteArray(16) - val size = stream.read(buffer) - if (size > 0) { - withContext(Dispatchers.Main) { - if (gpioState == "1") { - listener.onDataReceived(buffer) - } - } - } - } catch (e: IOException) { - e.printStackTrace() - } - } - } - } - } - - fun getOutputStream(): OutputStream { - //调高串口电位 - gpioManager.setGpioHigh("18") - Log.d(kTag, "getOutputStream: 调高串口电位") - return serialPorts.last().outputStream - } - - fun closeSerialPort() { - //降低串口电位 - gpioManager.setGpioLow("18") - gpioState = "0" - Log.d(kTag, "closeSerialPort: 降低串口电位") - } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/detector/common/view/InstallMarkerActivity.kt b/app/src/main/java/com/casic/detector/common/view/InstallMarkerActivity.kt index f9187a6..414e738 100644 --- a/app/src/main/java/com/casic/detector/common/view/InstallMarkerActivity.kt +++ b/app/src/main/java/com/casic/detector/common/view/InstallMarkerActivity.kt @@ -22,7 +22,7 @@ import com.casic.detector.common.bean.MarkerLocalBean import com.casic.detector.common.callback.OnGetLocationListener import com.casic.detector.common.callback.OnImageCompressListener -import com.casic.detector.common.callback.OnSerialPortDataListener +import com.casic.detector.common.callback.OnSerialPortListener import com.casic.detector.common.databinding.ActivityInstallMarkerBinding import com.casic.detector.common.extensions.compressImage import com.casic.detector.common.extensions.getDefaultValue @@ -56,12 +56,11 @@ import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.widget.TitleBarView import java.io.File -import java.io.OutputStream import java.util.Calendar import java.util.Date class InstallMarkerActivity : KotlinBaseActivity(), - OnSerialPortDataListener { + OnSerialPortListener { private val kTag = "InstallMarkerActivity" private val context = this @@ -258,25 +257,22 @@ LoadingDialogHub.show(this, "标识器读取中,请稍后...") countDownTimer.start() binding.readMarkerButton.isEnabled = false - serialPortService?.openSerialPort(this) + serialPortService?.openSerialPort(arrayListOf('2'), this) } } - override fun write(outStream: OutputStream) { - outStream.write('2'.code) - outStream.flush() - } - - override fun onDataReceived(buffer: ByteArray) { - val hex = buffer.toHex() - Log.d(kTag, hex) + override fun onDataReceived(bytes: ByteArray) { + Log.d(kTag, bytes.contentToString()) + val hex = bytes.toHex() val markerId = hex.take(20).hexToString() if (markerId.isNumber()) { - LoadingDialogHub.dismiss() - countDownTimer.cancel() - serialPortService?.closeSerialPort() - binding.readMarkerButton.isEnabled = true - binding.identifierInclude.identifierIdView.text = markerId + runOnUiThread { + LoadingDialogHub.dismiss() + countDownTimer.cancel() + serialPortService?.closeSerialPort() + binding.readMarkerButton.isEnabled = true + binding.identifierInclude.identifierIdView.text = markerId + } } } diff --git a/app/src/main/java/com/casic/detector/common/callback/OnSerialPortDataListener.kt b/app/src/main/java/com/casic/detector/common/callback/OnSerialPortDataListener.kt deleted file mode 100644 index b06a068..0000000 --- a/app/src/main/java/com/casic/detector/common/callback/OnSerialPortDataListener.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.detector.common.callback - -import java.io.OutputStream - -interface OnSerialPortDataListener { - fun write(outStream: OutputStream) - - fun onDataReceived(buffer: ByteArray) -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/detector/common/callback/OnSerialPortListener.kt b/app/src/main/java/com/casic/detector/common/callback/OnSerialPortListener.kt new file mode 100644 index 0000000..ae8ed0f --- /dev/null +++ b/app/src/main/java/com/casic/detector/common/callback/OnSerialPortListener.kt @@ -0,0 +1,5 @@ +package com.casic.detector.common.callback + +interface OnSerialPortListener { + fun onDataReceived(bytes: ByteArray) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/detector/common/service/NtripConnectService.kt b/app/src/main/java/com/casic/detector/common/service/NtripConnectService.kt index 3279043..9d49a9a 100644 --- a/app/src/main/java/com/casic/detector/common/service/NtripConnectService.kt +++ b/app/src/main/java/com/casic/detector/common/service/NtripConnectService.kt @@ -1,10 +1,7 @@ package com.casic.detector.common.service import android.app.Service -import android.content.ComponentName -import android.content.Context import android.content.Intent -import android.content.ServiceConnection import android.os.Handler import android.os.IBinder import android.os.Message @@ -15,6 +12,7 @@ import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.LifecycleRegistry import androidx.lifecycle.lifecycleScope +import com.casic.detector.common.base.BaseApplication import com.casic.detector.common.extensions.convertToGPGGA import com.casic.detector.common.utils.LocaleConstant import com.casic.detector.common.utils.NtripAuthorizationCreator @@ -41,7 +39,6 @@ private val kTag = "NtripConnectService" private val registry = LifecycleRegistry(this) private var connectState = ConnectState.CLOSED - private var serialPortService: SerialPortService? = null private var outStream: OutputStream? = null private lateinit var socketClient: SocketClient @@ -65,11 +62,6 @@ override fun onCreate() { super.onCreate() weakReferenceHandler = WeakReferenceHandler(this) - //绑定串口通信服务 - Intent(this, SerialPortService::class.java).also { - bindService(it, serviceConnection, Context.BIND_AUTO_CREATE) - } - RtkLocationTool.getCurrentLocation(this) { val weakHandler = MainActivity.weakReferenceHandler ?: return@getCurrentLocation val message = weakHandler.obtainMessage() @@ -86,19 +78,6 @@ } } - private val serviceConnection = object : ServiceConnection { - override fun onServiceConnected(name: ComponentName?, iBinder: IBinder?) { - if (iBinder is SerialPortService.ServiceBinder) { - serialPortService = iBinder.getSerialPortService() - Log.d(kTag, "onServiceConnected: 服务已绑定") - } - } - - override fun onServiceDisconnected(name: ComponentName?) { - - } - } - override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { lifecycleScope.launch(Dispatchers.IO) { connectQianXunServer() @@ -117,7 +96,7 @@ if (result.contains("ICY 200 OK")) { "高精度定位服务连接成功".show(this) //连接服务即打开串口 - outStream = serialPortService?.getOutputStream() + outStream = BaseApplication.get().getSerialPorts().first().outputStream } } else { //居中显示 @@ -175,9 +154,4 @@ .build() socketClient.connect() } - - override fun onDestroy() { - super.onDestroy() - unbindService(serviceConnection) - } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/detector/common/service/SerialPortService.kt b/app/src/main/java/com/casic/detector/common/service/SerialPortService.kt index af54d85..6d9e518 100644 --- a/app/src/main/java/com/casic/detector/common/service/SerialPortService.kt +++ b/app/src/main/java/com/casic/detector/common/service/SerialPortService.kt @@ -5,30 +5,77 @@ import android.os.Binder import android.os.IBinder import android.util.Log -import androidx.lifecycle.Lifecycle -import androidx.lifecycle.LifecycleOwner -import androidx.lifecycle.LifecycleRegistry -import androidx.lifecycle.lifecycleScope import com.casic.detector.common.base.BaseApplication -import com.casic.detector.common.callback.OnSerialPortDataListener +import com.casic.detector.common.callback.OnSerialPortListener import com.casic.detector.common.utils.GpioManager -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.isActive -import kotlinx.coroutines.launch -import kotlinx.coroutines.withContext import java.io.IOException -import java.io.OutputStream +import java.util.concurrent.Executors -class SerialPortService : Service(), LifecycleOwner { + +class SerialPortService : Service() { private val kTag = "SerialPortService" - private val registry = LifecycleRegistry(this) private val gpioManager by lazy { GpioManager() } - private val serialPorts by lazy { BaseApplication.get().getSerialPorts() } - private var gpioState = "" + private val serialPorts = BaseApplication.get().getSerialPorts() + private var executor = Executors.newFixedThreadPool(2) //创建一个固定大小的线程池,可控制线程最大并发数,超出的线程会在队列中等待 - override fun getLifecycle(): Lifecycle { - return registry + /** + * 读取数据 1 + * 暂停读取 0 + * */ + private var gpioState = 0 + + fun openSerialPort(commandArray: ArrayList, listener: OnSerialPortListener) { + //调高串口电位 + gpioManager.setGpioHigh("18") + gpioState = 1 + Log.d(kTag, "openSerialPort: 调高串口电位") + + Thread.sleep(100) + + val outputStream = serialPorts.first().outputStream + commandArray.forEach { + outputStream.write(it.code) + outputStream.flush() + Thread.sleep(50) + } + + executor.execute { + //读 + while (gpioState == 1) { + try { + val byteArray = ByteArray(32) + val size = serialPorts.first().inputStream.read(byteArray) + if (size > 0) { + listener.onDataReceived(byteArray) + } + } catch (e: IOException) { + e.printStackTrace() + } + } + } + + executor.execute { + //读 + while (gpioState == 1) { + try { + val byteArray = ByteArray(16) + val size = serialPorts.last().inputStream.read(byteArray) + if (size > 0) { + listener.onDataReceived(byteArray) + } + } catch (e: IOException) { + e.printStackTrace() + } + } + } + } + + fun closeSerialPort() { + //降低串口电位 + gpioManager.setGpioLow("18") + gpioState = 0 + Log.d(kTag, "closeSerialPort: 降低串口电位") } override fun onBind(intent: Intent?): IBinder { @@ -40,73 +87,4 @@ return this@SerialPortService } } - - fun openSerialPort(listener: OnSerialPortDataListener) { - //调高串口电位 - gpioManager.setGpioHigh("18") - gpioState = "1" - Log.d(kTag, "openSerialPort: 调高串口电位") - - Thread.sleep(100) - - lifecycleScope.launch(Dispatchers.IO) { - serialPorts.apply { - //写 - listener.write(this[0].outputStream) - val stream = this[0].inputStream - //读 - while (isActive) { - try { - val buffer = ByteArray(16) - val size = stream.read(buffer) - if (size > 0) { - withContext(Dispatchers.Main) { - if (gpioState == "1") { - listener.onDataReceived(buffer) - } - } - } - } catch (e: IOException) { - e.printStackTrace() - } - } - } - } - - lifecycleScope.launch(Dispatchers.IO) { - serialPorts.apply { - val stream = this[1].inputStream - //读 - while (isActive) { - try { - val buffer = ByteArray(16) - val size = stream.read(buffer) - if (size > 0) { - withContext(Dispatchers.Main) { - if (gpioState == "1") { - listener.onDataReceived(buffer) - } - } - } - } catch (e: IOException) { - e.printStackTrace() - } - } - } - } - } - - fun getOutputStream(): OutputStream { - //调高串口电位 - gpioManager.setGpioHigh("18") - Log.d(kTag, "getOutputStream: 调高串口电位") - return serialPorts.last().outputStream - } - - fun closeSerialPort() { - //降低串口电位 - gpioManager.setGpioLow("18") - gpioState = "0" - Log.d(kTag, "closeSerialPort: 降低串口电位") - } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/detector/common/view/InstallMarkerActivity.kt b/app/src/main/java/com/casic/detector/common/view/InstallMarkerActivity.kt index f9187a6..414e738 100644 --- a/app/src/main/java/com/casic/detector/common/view/InstallMarkerActivity.kt +++ b/app/src/main/java/com/casic/detector/common/view/InstallMarkerActivity.kt @@ -22,7 +22,7 @@ import com.casic.detector.common.bean.MarkerLocalBean import com.casic.detector.common.callback.OnGetLocationListener import com.casic.detector.common.callback.OnImageCompressListener -import com.casic.detector.common.callback.OnSerialPortDataListener +import com.casic.detector.common.callback.OnSerialPortListener import com.casic.detector.common.databinding.ActivityInstallMarkerBinding import com.casic.detector.common.extensions.compressImage import com.casic.detector.common.extensions.getDefaultValue @@ -56,12 +56,11 @@ import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.widget.TitleBarView import java.io.File -import java.io.OutputStream import java.util.Calendar import java.util.Date class InstallMarkerActivity : KotlinBaseActivity(), - OnSerialPortDataListener { + OnSerialPortListener { private val kTag = "InstallMarkerActivity" private val context = this @@ -258,25 +257,22 @@ LoadingDialogHub.show(this, "标识器读取中,请稍后...") countDownTimer.start() binding.readMarkerButton.isEnabled = false - serialPortService?.openSerialPort(this) + serialPortService?.openSerialPort(arrayListOf('2'), this) } } - override fun write(outStream: OutputStream) { - outStream.write('2'.code) - outStream.flush() - } - - override fun onDataReceived(buffer: ByteArray) { - val hex = buffer.toHex() - Log.d(kTag, hex) + override fun onDataReceived(bytes: ByteArray) { + Log.d(kTag, bytes.contentToString()) + val hex = bytes.toHex() val markerId = hex.take(20).hexToString() if (markerId.isNumber()) { - LoadingDialogHub.dismiss() - countDownTimer.cancel() - serialPortService?.closeSerialPort() - binding.readMarkerButton.isEnabled = true - binding.identifierInclude.identifierIdView.text = markerId + runOnUiThread { + LoadingDialogHub.dismiss() + countDownTimer.cancel() + serialPortService?.closeSerialPort() + binding.readMarkerButton.isEnabled = true + binding.identifierInclude.identifierIdView.text = markerId + } } } 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 17f00a2..3a59b4b 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 @@ -1,7 +1,10 @@ package com.casic.detector.common.view import android.app.Activity +import android.content.ComponentName +import android.content.Context import android.content.Intent +import android.content.ServiceConnection import android.graphics.BitmapFactory import android.graphics.Color import android.graphics.drawable.BitmapDrawable @@ -10,6 +13,7 @@ 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 @@ -32,7 +36,7 @@ import com.casic.detector.common.bean.MarkerLocalBean import com.casic.detector.common.bean.TaskLocalBean import com.casic.detector.common.callback.OnGetLocationListener -import com.casic.detector.common.callback.OnSerialPortDataListener +import com.casic.detector.common.callback.OnSerialPortListener import com.casic.detector.common.cluster.ClusterItem import com.casic.detector.common.cluster.ClusterOverlay import com.casic.detector.common.cluster.RegionItem @@ -83,9 +87,8 @@ import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import java.io.File -import java.io.OutputStream -class MainActivity : KotlinBaseActivity(), OnSerialPortDataListener, +class MainActivity : KotlinBaseActivity(), OnSerialPortListener, Handler.Callback { //TODO 此代码正式版删除 @@ -124,9 +127,25 @@ binding.rootView.initImmersionBar(this, false, R.color.themeColor) } + private val serviceConnection = object : ServiceConnection { + override fun onServiceConnected(name: ComponentName?, iBinder: IBinder?) { + if (iBinder is SerialPortService.ServiceBinder) { + serialPortService = iBinder.getSerialPortService() + Log.d(kTag, "onServiceConnected: 服务已绑定") + } + } + + override fun onServiceDisconnected(name: ComponentName?) { + + } + } + override fun initOnCreate(savedInstanceState: Bundle?) { weakReferenceHandler = WeakReferenceHandler(this) -// startService(Intent(this, NtripConnectService::class.java)) + //绑定串口通信服务 + Intent(this, SerialPortService::class.java).also { + bindService(it, serviceConnection, Context.BIND_AUTO_CREATE) + } soundResourceId = soundPool.load(this, R.raw.ring3, 1) //地图初始化 initMapConfig(savedInstanceState) @@ -498,31 +517,27 @@ private fun openSerialPort() { binding.stopFreeTaskButton.visibility = View.VISIBLE isFreeTask = true - serialPortService?.openSerialPort(this) + serialPortService?.openSerialPort(arrayListOf('2', '6'), this) } - override fun write(outStream: OutputStream) { - outStream.write('2'.code) - outStream.flush() - - Thread.sleep(50) - - outStream.write('6'.code) - outStream.flush() - } - - override fun onDataReceived(buffer: ByteArray) { + override fun onDataReceived(bytes: ByteArray) { //只响一次,因为探测频率高,所以依旧是连续的报警声 soundPool.play(soundResourceId, 1f, 1f, 0, 0, 1f) - if (buffer.first() == 78.toByte()) { - val energy = buffer.handleSignalStrength().take(10).hexToString() - val signalStrength = energy.substring(1).toInt() - if (signalStrength <= 1500 && detailDialog.isShowing) { - detailDialog.dismiss() + if (bytes.first() == 78.toByte()) { + val energy = bytes.handleSignalStrength().take(10).hexToString() + try { + val signalStrength = energy.substring(1).toInt() + runOnUiThread { + if (signalStrength <= 1500 && detailDialog.isShowing) { + detailDialog.dismiss() + } + } + } catch (e: NumberFormatException) { + e.printStackTrace() } } - val hex = buffer.toHex() + val hex = bytes.toHex() val markerId = hex.take(20).hexToString() if (markerId.isNumber()) { //添加地图Marker @@ -543,13 +558,15 @@ 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() + runOnUiThread { + if (!detailDialog.isShowing) { + val markerBean = DataBaseManager.get.queryMarkerById(markerId).firstOrNull() + if (markerBean == null) { + "无法查询到此ID【${markerId}】的信息".show(context) + } else { + detailDialog.setMarker(markerBean) + detailDialog.show() + } } } } @@ -898,6 +915,7 @@ binding.mapView.onDestroy() soundPool.autoPause() serialPortService?.closeSerialPort() + unbindService(serviceConnection) locationTool.stopLocation() BaseApplication.get().closeSerialPort() } diff --git a/app/src/main/java/com/casic/detector/common/callback/OnSerialPortDataListener.kt b/app/src/main/java/com/casic/detector/common/callback/OnSerialPortDataListener.kt deleted file mode 100644 index b06a068..0000000 --- a/app/src/main/java/com/casic/detector/common/callback/OnSerialPortDataListener.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.casic.detector.common.callback - -import java.io.OutputStream - -interface OnSerialPortDataListener { - fun write(outStream: OutputStream) - - fun onDataReceived(buffer: ByteArray) -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/detector/common/callback/OnSerialPortListener.kt b/app/src/main/java/com/casic/detector/common/callback/OnSerialPortListener.kt new file mode 100644 index 0000000..ae8ed0f --- /dev/null +++ b/app/src/main/java/com/casic/detector/common/callback/OnSerialPortListener.kt @@ -0,0 +1,5 @@ +package com.casic.detector.common.callback + +interface OnSerialPortListener { + fun onDataReceived(bytes: ByteArray) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/detector/common/service/NtripConnectService.kt b/app/src/main/java/com/casic/detector/common/service/NtripConnectService.kt index 3279043..9d49a9a 100644 --- a/app/src/main/java/com/casic/detector/common/service/NtripConnectService.kt +++ b/app/src/main/java/com/casic/detector/common/service/NtripConnectService.kt @@ -1,10 +1,7 @@ package com.casic.detector.common.service import android.app.Service -import android.content.ComponentName -import android.content.Context import android.content.Intent -import android.content.ServiceConnection import android.os.Handler import android.os.IBinder import android.os.Message @@ -15,6 +12,7 @@ import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.LifecycleRegistry import androidx.lifecycle.lifecycleScope +import com.casic.detector.common.base.BaseApplication import com.casic.detector.common.extensions.convertToGPGGA import com.casic.detector.common.utils.LocaleConstant import com.casic.detector.common.utils.NtripAuthorizationCreator @@ -41,7 +39,6 @@ private val kTag = "NtripConnectService" private val registry = LifecycleRegistry(this) private var connectState = ConnectState.CLOSED - private var serialPortService: SerialPortService? = null private var outStream: OutputStream? = null private lateinit var socketClient: SocketClient @@ -65,11 +62,6 @@ override fun onCreate() { super.onCreate() weakReferenceHandler = WeakReferenceHandler(this) - //绑定串口通信服务 - Intent(this, SerialPortService::class.java).also { - bindService(it, serviceConnection, Context.BIND_AUTO_CREATE) - } - RtkLocationTool.getCurrentLocation(this) { val weakHandler = MainActivity.weakReferenceHandler ?: return@getCurrentLocation val message = weakHandler.obtainMessage() @@ -86,19 +78,6 @@ } } - private val serviceConnection = object : ServiceConnection { - override fun onServiceConnected(name: ComponentName?, iBinder: IBinder?) { - if (iBinder is SerialPortService.ServiceBinder) { - serialPortService = iBinder.getSerialPortService() - Log.d(kTag, "onServiceConnected: 服务已绑定") - } - } - - override fun onServiceDisconnected(name: ComponentName?) { - - } - } - override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { lifecycleScope.launch(Dispatchers.IO) { connectQianXunServer() @@ -117,7 +96,7 @@ if (result.contains("ICY 200 OK")) { "高精度定位服务连接成功".show(this) //连接服务即打开串口 - outStream = serialPortService?.getOutputStream() + outStream = BaseApplication.get().getSerialPorts().first().outputStream } } else { //居中显示 @@ -175,9 +154,4 @@ .build() socketClient.connect() } - - override fun onDestroy() { - super.onDestroy() - unbindService(serviceConnection) - } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/detector/common/service/SerialPortService.kt b/app/src/main/java/com/casic/detector/common/service/SerialPortService.kt index af54d85..6d9e518 100644 --- a/app/src/main/java/com/casic/detector/common/service/SerialPortService.kt +++ b/app/src/main/java/com/casic/detector/common/service/SerialPortService.kt @@ -5,30 +5,77 @@ import android.os.Binder import android.os.IBinder import android.util.Log -import androidx.lifecycle.Lifecycle -import androidx.lifecycle.LifecycleOwner -import androidx.lifecycle.LifecycleRegistry -import androidx.lifecycle.lifecycleScope import com.casic.detector.common.base.BaseApplication -import com.casic.detector.common.callback.OnSerialPortDataListener +import com.casic.detector.common.callback.OnSerialPortListener import com.casic.detector.common.utils.GpioManager -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.isActive -import kotlinx.coroutines.launch -import kotlinx.coroutines.withContext import java.io.IOException -import java.io.OutputStream +import java.util.concurrent.Executors -class SerialPortService : Service(), LifecycleOwner { + +class SerialPortService : Service() { private val kTag = "SerialPortService" - private val registry = LifecycleRegistry(this) private val gpioManager by lazy { GpioManager() } - private val serialPorts by lazy { BaseApplication.get().getSerialPorts() } - private var gpioState = "" + private val serialPorts = BaseApplication.get().getSerialPorts() + private var executor = Executors.newFixedThreadPool(2) //创建一个固定大小的线程池,可控制线程最大并发数,超出的线程会在队列中等待 - override fun getLifecycle(): Lifecycle { - return registry + /** + * 读取数据 1 + * 暂停读取 0 + * */ + private var gpioState = 0 + + fun openSerialPort(commandArray: ArrayList, listener: OnSerialPortListener) { + //调高串口电位 + gpioManager.setGpioHigh("18") + gpioState = 1 + Log.d(kTag, "openSerialPort: 调高串口电位") + + Thread.sleep(100) + + val outputStream = serialPorts.first().outputStream + commandArray.forEach { + outputStream.write(it.code) + outputStream.flush() + Thread.sleep(50) + } + + executor.execute { + //读 + while (gpioState == 1) { + try { + val byteArray = ByteArray(32) + val size = serialPorts.first().inputStream.read(byteArray) + if (size > 0) { + listener.onDataReceived(byteArray) + } + } catch (e: IOException) { + e.printStackTrace() + } + } + } + + executor.execute { + //读 + while (gpioState == 1) { + try { + val byteArray = ByteArray(16) + val size = serialPorts.last().inputStream.read(byteArray) + if (size > 0) { + listener.onDataReceived(byteArray) + } + } catch (e: IOException) { + e.printStackTrace() + } + } + } + } + + fun closeSerialPort() { + //降低串口电位 + gpioManager.setGpioLow("18") + gpioState = 0 + Log.d(kTag, "closeSerialPort: 降低串口电位") } override fun onBind(intent: Intent?): IBinder { @@ -40,73 +87,4 @@ return this@SerialPortService } } - - fun openSerialPort(listener: OnSerialPortDataListener) { - //调高串口电位 - gpioManager.setGpioHigh("18") - gpioState = "1" - Log.d(kTag, "openSerialPort: 调高串口电位") - - Thread.sleep(100) - - lifecycleScope.launch(Dispatchers.IO) { - serialPorts.apply { - //写 - listener.write(this[0].outputStream) - val stream = this[0].inputStream - //读 - while (isActive) { - try { - val buffer = ByteArray(16) - val size = stream.read(buffer) - if (size > 0) { - withContext(Dispatchers.Main) { - if (gpioState == "1") { - listener.onDataReceived(buffer) - } - } - } - } catch (e: IOException) { - e.printStackTrace() - } - } - } - } - - lifecycleScope.launch(Dispatchers.IO) { - serialPorts.apply { - val stream = this[1].inputStream - //读 - while (isActive) { - try { - val buffer = ByteArray(16) - val size = stream.read(buffer) - if (size > 0) { - withContext(Dispatchers.Main) { - if (gpioState == "1") { - listener.onDataReceived(buffer) - } - } - } - } catch (e: IOException) { - e.printStackTrace() - } - } - } - } - } - - fun getOutputStream(): OutputStream { - //调高串口电位 - gpioManager.setGpioHigh("18") - Log.d(kTag, "getOutputStream: 调高串口电位") - return serialPorts.last().outputStream - } - - fun closeSerialPort() { - //降低串口电位 - gpioManager.setGpioLow("18") - gpioState = "0" - Log.d(kTag, "closeSerialPort: 降低串口电位") - } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/detector/common/view/InstallMarkerActivity.kt b/app/src/main/java/com/casic/detector/common/view/InstallMarkerActivity.kt index f9187a6..414e738 100644 --- a/app/src/main/java/com/casic/detector/common/view/InstallMarkerActivity.kt +++ b/app/src/main/java/com/casic/detector/common/view/InstallMarkerActivity.kt @@ -22,7 +22,7 @@ import com.casic.detector.common.bean.MarkerLocalBean import com.casic.detector.common.callback.OnGetLocationListener import com.casic.detector.common.callback.OnImageCompressListener -import com.casic.detector.common.callback.OnSerialPortDataListener +import com.casic.detector.common.callback.OnSerialPortListener import com.casic.detector.common.databinding.ActivityInstallMarkerBinding import com.casic.detector.common.extensions.compressImage import com.casic.detector.common.extensions.getDefaultValue @@ -56,12 +56,11 @@ import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.widget.TitleBarView import java.io.File -import java.io.OutputStream import java.util.Calendar import java.util.Date class InstallMarkerActivity : KotlinBaseActivity(), - OnSerialPortDataListener { + OnSerialPortListener { private val kTag = "InstallMarkerActivity" private val context = this @@ -258,25 +257,22 @@ LoadingDialogHub.show(this, "标识器读取中,请稍后...") countDownTimer.start() binding.readMarkerButton.isEnabled = false - serialPortService?.openSerialPort(this) + serialPortService?.openSerialPort(arrayListOf('2'), this) } } - override fun write(outStream: OutputStream) { - outStream.write('2'.code) - outStream.flush() - } - - override fun onDataReceived(buffer: ByteArray) { - val hex = buffer.toHex() - Log.d(kTag, hex) + override fun onDataReceived(bytes: ByteArray) { + Log.d(kTag, bytes.contentToString()) + val hex = bytes.toHex() val markerId = hex.take(20).hexToString() if (markerId.isNumber()) { - LoadingDialogHub.dismiss() - countDownTimer.cancel() - serialPortService?.closeSerialPort() - binding.readMarkerButton.isEnabled = true - binding.identifierInclude.identifierIdView.text = markerId + runOnUiThread { + LoadingDialogHub.dismiss() + countDownTimer.cancel() + serialPortService?.closeSerialPort() + binding.readMarkerButton.isEnabled = true + binding.identifierInclude.identifierIdView.text = markerId + } } } 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 17f00a2..3a59b4b 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 @@ -1,7 +1,10 @@ package com.casic.detector.common.view import android.app.Activity +import android.content.ComponentName +import android.content.Context import android.content.Intent +import android.content.ServiceConnection import android.graphics.BitmapFactory import android.graphics.Color import android.graphics.drawable.BitmapDrawable @@ -10,6 +13,7 @@ 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 @@ -32,7 +36,7 @@ import com.casic.detector.common.bean.MarkerLocalBean import com.casic.detector.common.bean.TaskLocalBean import com.casic.detector.common.callback.OnGetLocationListener -import com.casic.detector.common.callback.OnSerialPortDataListener +import com.casic.detector.common.callback.OnSerialPortListener import com.casic.detector.common.cluster.ClusterItem import com.casic.detector.common.cluster.ClusterOverlay import com.casic.detector.common.cluster.RegionItem @@ -83,9 +87,8 @@ import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import java.io.File -import java.io.OutputStream -class MainActivity : KotlinBaseActivity(), OnSerialPortDataListener, +class MainActivity : KotlinBaseActivity(), OnSerialPortListener, Handler.Callback { //TODO 此代码正式版删除 @@ -124,9 +127,25 @@ binding.rootView.initImmersionBar(this, false, R.color.themeColor) } + private val serviceConnection = object : ServiceConnection { + override fun onServiceConnected(name: ComponentName?, iBinder: IBinder?) { + if (iBinder is SerialPortService.ServiceBinder) { + serialPortService = iBinder.getSerialPortService() + Log.d(kTag, "onServiceConnected: 服务已绑定") + } + } + + override fun onServiceDisconnected(name: ComponentName?) { + + } + } + override fun initOnCreate(savedInstanceState: Bundle?) { weakReferenceHandler = WeakReferenceHandler(this) -// startService(Intent(this, NtripConnectService::class.java)) + //绑定串口通信服务 + Intent(this, SerialPortService::class.java).also { + bindService(it, serviceConnection, Context.BIND_AUTO_CREATE) + } soundResourceId = soundPool.load(this, R.raw.ring3, 1) //地图初始化 initMapConfig(savedInstanceState) @@ -498,31 +517,27 @@ private fun openSerialPort() { binding.stopFreeTaskButton.visibility = View.VISIBLE isFreeTask = true - serialPortService?.openSerialPort(this) + serialPortService?.openSerialPort(arrayListOf('2', '6'), this) } - override fun write(outStream: OutputStream) { - outStream.write('2'.code) - outStream.flush() - - Thread.sleep(50) - - outStream.write('6'.code) - outStream.flush() - } - - override fun onDataReceived(buffer: ByteArray) { + override fun onDataReceived(bytes: ByteArray) { //只响一次,因为探测频率高,所以依旧是连续的报警声 soundPool.play(soundResourceId, 1f, 1f, 0, 0, 1f) - if (buffer.first() == 78.toByte()) { - val energy = buffer.handleSignalStrength().take(10).hexToString() - val signalStrength = energy.substring(1).toInt() - if (signalStrength <= 1500 && detailDialog.isShowing) { - detailDialog.dismiss() + if (bytes.first() == 78.toByte()) { + val energy = bytes.handleSignalStrength().take(10).hexToString() + try { + val signalStrength = energy.substring(1).toInt() + runOnUiThread { + if (signalStrength <= 1500 && detailDialog.isShowing) { + detailDialog.dismiss() + } + } + } catch (e: NumberFormatException) { + e.printStackTrace() } } - val hex = buffer.toHex() + val hex = bytes.toHex() val markerId = hex.take(20).hexToString() if (markerId.isNumber()) { //添加地图Marker @@ -543,13 +558,15 @@ 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() + runOnUiThread { + if (!detailDialog.isShowing) { + val markerBean = DataBaseManager.get.queryMarkerById(markerId).firstOrNull() + if (markerBean == null) { + "无法查询到此ID【${markerId}】的信息".show(context) + } else { + detailDialog.setMarker(markerBean) + detailDialog.show() + } } } } @@ -898,6 +915,7 @@ binding.mapView.onDestroy() soundPool.autoPause() serialPortService?.closeSerialPort() + unbindService(serviceConnection) locationTool.stopLocation() BaseApplication.get().closeSerialPort() } diff --git a/app/src/main/java/com/casic/detector/common/view/SearchMarkerActivity.kt b/app/src/main/java/com/casic/detector/common/view/SearchMarkerActivity.kt index 45acaaf..14ebdcf 100644 --- a/app/src/main/java/com/casic/detector/common/view/SearchMarkerActivity.kt +++ b/app/src/main/java/com/casic/detector/common/view/SearchMarkerActivity.kt @@ -24,7 +24,7 @@ import com.amap.api.maps.model.LatLng import com.casic.detector.common.R import com.casic.detector.common.callback.OnGetLocationListener -import com.casic.detector.common.callback.OnSerialPortDataListener +import com.casic.detector.common.callback.OnSerialPortListener import com.casic.detector.common.databinding.ActivitySearchMarkerBinding import com.casic.detector.common.extensions.handleSignalStrength import com.casic.detector.common.extensions.hexToString @@ -49,7 +49,6 @@ import kotlinx.coroutines.delay import kotlinx.coroutines.launch import kotlinx.coroutines.withContext -import java.io.OutputStream import java.util.Timer import java.util.TimerTask import kotlin.math.atan2 @@ -84,7 +83,10 @@ if (iBinder is SerialPortService.ServiceBinder) { serialPortService = iBinder.getSerialPortService() Log.d(kTag, "onServiceConnected: 服务已绑定") - lifecycleScope.launch(Dispatchers.Main) { searchMarker() } + lifecycleScope.launch(Dispatchers.Main) { + delay(300) + searchMarker() + } } } @@ -179,7 +181,10 @@ LoadingDialogHub.dismiss() serialPortService?.closeSerialPort() "标识器深度探测超时,请移动位置重试".show(context) - lifecycleScope.launch(Dispatchers.Main) { searchMarker() } + lifecycleScope.launch(Dispatchers.Main) { + delay(300) + searchMarker() + } } } @@ -196,32 +201,35 @@ } if (tag == '1') { "此标识器无法读取埋深!".show(this) - lifecycleScope.launch(Dispatchers.Main) { searchMarker() } + lifecycleScope.launch(Dispatchers.Main) { + delay(300) + searchMarker() + } } else { LoadingDialogHub.show(this, "正在探测标识器埋深,请稍后...") countDownTimer.start() // 发送读取标识器埋设深度指令 - serialPortService?.openSerialPort(object : OnSerialPortDataListener { - override fun write(outStream: OutputStream) { - // 发送读取标识器埋设深度指令 - outStream.write(tag.code) - outStream.flush() - } - - override fun onDataReceived(buffer: ByteArray) { - val hex = buffer.toHex() - if (hex.startsWith("53")) { - LoadingDialogHub.dismiss() - countDownTimer.cancel() - showDepthDialog(hex) + serialPortService?.openSerialPort( + arrayListOf(tag), object : OnSerialPortListener { + override fun onDataReceived(bytes: ByteArray) { + val hex = bytes.toHex() + if (hex.startsWith("53")) { + runOnUiThread { + LoadingDialogHub.dismiss() + countDownTimer.cancel() + showDepthDialog(hex) + } + } } - } - }) + }) } } else { LoadingDialogHub.dismiss() "标识器未安装,安装成功后才可读取埋深!".show(this) - lifecycleScope.launch(Dispatchers.Main) { searchMarker() } + lifecycleScope.launch(Dispatchers.Main) { + delay(300) + searchMarker() + } } } @@ -256,7 +264,10 @@ AlertMessageDialog.OnDialogButtonClickListener { override fun onConfirmClick() { serialPortService?.closeSerialPort() - lifecycleScope.launch(Dispatchers.Main) { searchMarker() } + lifecycleScope.launch(Dispatchers.Main) { + delay(300) + searchMarker() + } } }).build().show() } catch (e: WindowManager.BadTokenException) { @@ -269,68 +280,59 @@ /** * 搜索标识器 * */ - private suspend fun searchMarker() { - delay(300) - serialPortService?.openSerialPort(object : OnSerialPortDataListener { - override fun write(outStream: OutputStream) { - outStream.write('2'.code) - outStream.flush() + private fun searchMarker() { + serialPortService?.openSerialPort(arrayListOf('2', '6'), object : OnSerialPortListener { + override fun onDataReceived(bytes: ByteArray) { + runOnUiThread { + if (bytes.first() == 78.toByte()) { + val energy = bytes.handleSignalStrength().take(10).hexToString() + try { + signalEnergy = energy.substring(1).toInt() + if (signalEnergy >= 4000) { + soundPool.play(fastSoundResourceId, 1f, 1f, 0, 0, 1f) + } else { + soundPool.play(slowSoundResourceId, 1f, 1f, 0, 0, 1f) + } - Thread.sleep(100) + //通过设置进度条表示能量值 + binding.energyPgBar.progress = signalEnergy + binding.energyValueView.text = "${signalEnergy}dB" - outStream.write('6'.code) - outStream.flush() - } + //根据信号强度更新界面 + if (signalEnergy <= 700) {//18° + binding.energyTipsView.text = "信号较弱,可能距离较远" + binding.energyTipsView.setTextColor(Color.parseColor("#8D1717")) + binding.energyTipsView.setBackgroundResource(R.mipmap.bg_large_text_red) - override fun onDataReceived(buffer: ByteArray) { - if (buffer.first() == 78.toByte()) { - val energy = buffer.handleSignalStrength().take(10).hexToString() - try { - signalEnergy = energy.substring(1).toInt() - if (signalEnergy >= 4000) { - soundPool.play(fastSoundResourceId, 1f, 1f, 0, 0, 1f) - } else { - soundPool.play(slowSoundResourceId, 1f, 1f, 0, 0, 1f) + binding.depthButton.isEnabled = false + binding.depthButton.setTextColor(Color.parseColor("#CCCCCC")) + binding.depthButton.setBackgroundResource(R.mipmap.left_button_disable) + binding.markerInfoButton.isEnabled = false + binding.markerInfoButton.setTextColor(Color.parseColor("#CCCCCC")) + binding.markerInfoButton.setBackgroundResource(R.mipmap.right_button_disable) + + binding.searchResultView.text = "未检测到标识器" + binding.searchResultView.setTextColor(Color.parseColor("#8D1717")) + binding.searchResultView.setBackgroundResource(R.mipmap.bg_small_text_red) + } else if (signalEnergy >= 4100) { + binding.energyTipsView.text = "信号极强,接近标识器正上方" + binding.energyTipsView.setTextColor(Color.parseColor("#428d00")) + binding.energyTipsView.setBackgroundResource(R.mipmap.bg_large_text_green) + } else { + binding.energyTipsView.text = "已靠近,请继续移动位置" + binding.energyTipsView.setTextColor(Color.parseColor("#8C5700")) + binding.energyTipsView.setBackgroundResource(R.mipmap.bg_large_text_yellow) + } + } catch (e: NumberFormatException) { + e.printStackTrace() } - - //通过设置进度条表示能量值 - binding.energyPgBar.progress = signalEnergy - binding.energyValueView.text = "${signalEnergy}dB" - - //根据信号强度更新界面 - if (signalEnergy <= 700) {//18° - binding.energyTipsView.text = "信号较弱,可能距离较远" - binding.energyTipsView.setTextColor(Color.parseColor("#8D1717")) - binding.energyTipsView.setBackgroundResource(R.mipmap.bg_large_text_red) - - binding.depthButton.isEnabled = false - binding.depthButton.setTextColor(Color.parseColor("#CCCCCC")) - binding.depthButton.setBackgroundResource(R.mipmap.left_button_disable) - binding.markerInfoButton.isEnabled = false - binding.markerInfoButton.setTextColor(Color.parseColor("#CCCCCC")) - binding.markerInfoButton.setBackgroundResource(R.mipmap.right_button_disable) - - binding.searchResultView.text = "未检测到标识器" - binding.searchResultView.setTextColor(Color.parseColor("#8D1717")) - binding.searchResultView.setBackgroundResource(R.mipmap.bg_small_text_red) - } else if (signalEnergy >= 4100) { - binding.energyTipsView.text = "信号极强,接近标识器正上方" - binding.energyTipsView.setTextColor(Color.parseColor("#428d00")) - binding.energyTipsView.setBackgroundResource(R.mipmap.bg_large_text_green) - } else { - binding.energyTipsView.text = "已靠近,请继续移动位置" - binding.energyTipsView.setTextColor(Color.parseColor("#8C5700")) - binding.energyTipsView.setBackgroundResource(R.mipmap.bg_large_text_yellow) + } else { + val id = bytes.toHex().take(20).hexToString() + Log.d(kTag, bytes.contentToString()) + if (id.isNumber()) { + markerId = id + handleMarker(markerId) } - } catch (e: NumberFormatException) { - e.printStackTrace() - } - } else { - Log.d(kTag, buffer.contentToString()) - val id = buffer.toHex().take(20).hexToString() - if (id.isNumber()) { - markerId = id - handleMarker(markerId) } } }