diff --git a/app/src/main/java/com/casic/detector/base/BaseApplication.kt b/app/src/main/java/com/casic/detector/base/BaseApplication.kt index 1250e19..9c25ed1 100644 --- a/app/src/main/java/com/casic/detector/base/BaseApplication.kt +++ b/app/src/main/java/com/casic/detector/base/BaseApplication.kt @@ -14,18 +14,20 @@ class BaseApplication : Application() { private val kTag = "BaseApplication" - private var serialPort: SerialPort? = null + private val suffix = "/dev/ttysWK" + private var serialPorts: ArrayList = ArrayList() @Throws(SecurityException::class, IOException::class, InvalidParameterException::class) - fun getSerialPort(): SerialPort? { - if (serialPort == null) { + fun getSerialPorts(): ArrayList { + if (serialPorts.isEmpty()) { /** * Open the serial port * */ - serialPort = - SerialPort(File("/dev/ttysWK1"), 9600, 0) + serialPorts.add(SerialPort(File("${suffix}1"), 9600, 0)) + serialPorts.add(SerialPort(File("${suffix}2"), 9600, 0)) + serialPorts.add(SerialPort(File("${suffix}0"), 9600, 0)) } - return serialPort + return serialPorts } companion object { @@ -50,9 +52,8 @@ } fun closeSerialPort() { - if (serialPort != null) { - serialPort?.close() - serialPort = null + serialPorts.forEach { + it.close() } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/detector/base/BaseApplication.kt b/app/src/main/java/com/casic/detector/base/BaseApplication.kt index 1250e19..9c25ed1 100644 --- a/app/src/main/java/com/casic/detector/base/BaseApplication.kt +++ b/app/src/main/java/com/casic/detector/base/BaseApplication.kt @@ -14,18 +14,20 @@ class BaseApplication : Application() { private val kTag = "BaseApplication" - private var serialPort: SerialPort? = null + private val suffix = "/dev/ttysWK" + private var serialPorts: ArrayList = ArrayList() @Throws(SecurityException::class, IOException::class, InvalidParameterException::class) - fun getSerialPort(): SerialPort? { - if (serialPort == null) { + fun getSerialPorts(): ArrayList { + if (serialPorts.isEmpty()) { /** * Open the serial port * */ - serialPort = - SerialPort(File("/dev/ttysWK1"), 9600, 0) + serialPorts.add(SerialPort(File("${suffix}1"), 9600, 0)) + serialPorts.add(SerialPort(File("${suffix}2"), 9600, 0)) + serialPorts.add(SerialPort(File("${suffix}0"), 9600, 0)) } - return serialPort + return serialPorts } companion object { @@ -50,9 +52,8 @@ } fun closeSerialPort() { - if (serialPort != null) { - serialPort?.close() - serialPort = null + serialPorts.forEach { + it.close() } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/detector/base/SerialPortActivity.kt b/app/src/main/java/com/casic/detector/base/SerialPortActivity.kt index 92ab97c..a63bba9 100644 --- a/app/src/main/java/com/casic/detector/base/SerialPortActivity.kt +++ b/app/src/main/java/com/casic/detector/base/SerialPortActivity.kt @@ -2,9 +2,13 @@ import android.os.Bundle import androidx.appcompat.app.AppCompatActivity +import androidx.lifecycle.lifecycleScope import androidx.viewbinding.ViewBinding import com.casic.detector.uart.SerialPort import com.pengxh.kt.lite.extensions.show +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext import java.io.IOException import java.io.InputStream import java.io.OutputStream @@ -17,28 +21,10 @@ private var serialPort: SerialPort? = null var outStream: OutputStream? = null - private var inStream: InputStream? = null - private var readThread: ReadThread? = null - inner class ReadThread : Thread() { - override fun run() { - super.run() - while (!isInterrupted) { - var size: Int - try { - val buffer = ByteArray(32) - if (inStream == null) return - size = inStream!!.read(buffer) - if (size > 0) { - onDataReceived(buffer, size) - } - } catch (e: IOException) { - e.printStackTrace() - return - } - } - } - } + private var inStream: InputStream? = null + private var inStream1: InputStream? = null + private var inStream2: InputStream? = null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -50,12 +36,72 @@ initEvent() try { - serialPort = BaseApplication.get().getSerialPort() - outStream = serialPort?.outputStream - inStream = serialPort?.inputStream + val serialPorts = BaseApplication.get().getSerialPorts() + if (serialPorts.isNotEmpty()) { + outStream = serialPorts[0].outputStream - readThread = ReadThread() - readThread?.start() + inStream = serialPorts[0].inputStream + inStream1 = serialPorts[1].inputStream + inStream2 = serialPorts[2].inputStream + + //多协程读取串口数据 + lifecycleScope.launch(Dispatchers.IO) { + while (true) { + var size: Int + try { + val buffer = ByteArray(32) + if (inStream == null) return@launch + size = inStream!!.read(buffer) + if (size > 0) { + withContext(Dispatchers.Main) { + onDataReceived(buffer, size) + } + } + } catch (e: IOException) { + e.printStackTrace() + return@launch + } + } + } + + lifecycleScope.launch(Dispatchers.IO) { + while (true) { + var size: Int + try { + val buffer = ByteArray(32) + if (inStream1 == null) return@launch + size = inStream1!!.read(buffer) + if (size > 0) { + withContext(Dispatchers.Main) { + onDataReceived(buffer, size) + } + } + } catch (e: IOException) { + e.printStackTrace() + return@launch + } + } + } + + lifecycleScope.launch(Dispatchers.IO) { + while (true) { + var size: Int + try { + val buffer = ByteArray(32) + if (inStream2 == null) return@launch + size = inStream2!!.read(buffer) + if (size > 0) { + withContext(Dispatchers.Main) { + onDataReceived(buffer, size) + } + } + } catch (e: IOException) { + e.printStackTrace() + return@launch + } + } + } + } } catch (e: SecurityException) { "您没有串口的读写权限!".show(this) } catch (e: IOException) { @@ -94,11 +140,4 @@ * 串口读数 * */ abstract fun onDataReceived(buffer: ByteArray?, size: Int) - - override fun onDestroy() { - super.onDestroy() - readThread?.interrupt() - BaseApplication.get().closeSerialPort() - serialPort = null - } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/detector/base/BaseApplication.kt b/app/src/main/java/com/casic/detector/base/BaseApplication.kt index 1250e19..9c25ed1 100644 --- a/app/src/main/java/com/casic/detector/base/BaseApplication.kt +++ b/app/src/main/java/com/casic/detector/base/BaseApplication.kt @@ -14,18 +14,20 @@ class BaseApplication : Application() { private val kTag = "BaseApplication" - private var serialPort: SerialPort? = null + private val suffix = "/dev/ttysWK" + private var serialPorts: ArrayList = ArrayList() @Throws(SecurityException::class, IOException::class, InvalidParameterException::class) - fun getSerialPort(): SerialPort? { - if (serialPort == null) { + fun getSerialPorts(): ArrayList { + if (serialPorts.isEmpty()) { /** * Open the serial port * */ - serialPort = - SerialPort(File("/dev/ttysWK1"), 9600, 0) + serialPorts.add(SerialPort(File("${suffix}1"), 9600, 0)) + serialPorts.add(SerialPort(File("${suffix}2"), 9600, 0)) + serialPorts.add(SerialPort(File("${suffix}0"), 9600, 0)) } - return serialPort + return serialPorts } companion object { @@ -50,9 +52,8 @@ } fun closeSerialPort() { - if (serialPort != null) { - serialPort?.close() - serialPort = null + serialPorts.forEach { + it.close() } } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/detector/base/SerialPortActivity.kt b/app/src/main/java/com/casic/detector/base/SerialPortActivity.kt index 92ab97c..a63bba9 100644 --- a/app/src/main/java/com/casic/detector/base/SerialPortActivity.kt +++ b/app/src/main/java/com/casic/detector/base/SerialPortActivity.kt @@ -2,9 +2,13 @@ import android.os.Bundle import androidx.appcompat.app.AppCompatActivity +import androidx.lifecycle.lifecycleScope import androidx.viewbinding.ViewBinding import com.casic.detector.uart.SerialPort import com.pengxh.kt.lite.extensions.show +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext import java.io.IOException import java.io.InputStream import java.io.OutputStream @@ -17,28 +21,10 @@ private var serialPort: SerialPort? = null var outStream: OutputStream? = null - private var inStream: InputStream? = null - private var readThread: ReadThread? = null - inner class ReadThread : Thread() { - override fun run() { - super.run() - while (!isInterrupted) { - var size: Int - try { - val buffer = ByteArray(32) - if (inStream == null) return - size = inStream!!.read(buffer) - if (size > 0) { - onDataReceived(buffer, size) - } - } catch (e: IOException) { - e.printStackTrace() - return - } - } - } - } + private var inStream: InputStream? = null + private var inStream1: InputStream? = null + private var inStream2: InputStream? = null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -50,12 +36,72 @@ initEvent() try { - serialPort = BaseApplication.get().getSerialPort() - outStream = serialPort?.outputStream - inStream = serialPort?.inputStream + val serialPorts = BaseApplication.get().getSerialPorts() + if (serialPorts.isNotEmpty()) { + outStream = serialPorts[0].outputStream - readThread = ReadThread() - readThread?.start() + inStream = serialPorts[0].inputStream + inStream1 = serialPorts[1].inputStream + inStream2 = serialPorts[2].inputStream + + //多协程读取串口数据 + lifecycleScope.launch(Dispatchers.IO) { + while (true) { + var size: Int + try { + val buffer = ByteArray(32) + if (inStream == null) return@launch + size = inStream!!.read(buffer) + if (size > 0) { + withContext(Dispatchers.Main) { + onDataReceived(buffer, size) + } + } + } catch (e: IOException) { + e.printStackTrace() + return@launch + } + } + } + + lifecycleScope.launch(Dispatchers.IO) { + while (true) { + var size: Int + try { + val buffer = ByteArray(32) + if (inStream1 == null) return@launch + size = inStream1!!.read(buffer) + if (size > 0) { + withContext(Dispatchers.Main) { + onDataReceived(buffer, size) + } + } + } catch (e: IOException) { + e.printStackTrace() + return@launch + } + } + } + + lifecycleScope.launch(Dispatchers.IO) { + while (true) { + var size: Int + try { + val buffer = ByteArray(32) + if (inStream2 == null) return@launch + size = inStream2!!.read(buffer) + if (size > 0) { + withContext(Dispatchers.Main) { + onDataReceived(buffer, size) + } + } + } catch (e: IOException) { + e.printStackTrace() + return@launch + } + } + } + } } catch (e: SecurityException) { "您没有串口的读写权限!".show(this) } catch (e: IOException) { @@ -94,11 +140,4 @@ * 串口读数 * */ abstract fun onDataReceived(buffer: ByteArray?, size: Int) - - override fun onDestroy() { - super.onDestroy() - readThread?.interrupt() - BaseApplication.get().closeSerialPort() - serialPort = null - } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/detector/view/SearchLabelActivity.kt b/app/src/main/java/com/casic/detector/view/SearchLabelActivity.kt index e29f411..c66adba 100644 --- a/app/src/main/java/com/casic/detector/view/SearchLabelActivity.kt +++ b/app/src/main/java/com/casic/detector/view/SearchLabelActivity.kt @@ -6,10 +6,10 @@ import android.os.Bundle import android.os.Handler import android.os.Message -import android.util.Log import android.view.animation.Animation import android.view.animation.RotateAnimation import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.lifecycleScope import com.casic.detector.R import com.casic.detector.base.SerialPortActivity import com.casic.detector.bean.TaskBean @@ -31,6 +31,9 @@ import com.pengxh.kt.lite.utils.WeakReferenceHandler import com.pengxh.kt.lite.vm.LoadState import com.pengxh.kt.lite.widget.dialog.AlertMessageDialog +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.delay +import kotlinx.coroutines.launch import java.io.IOException import java.text.DecimalFormat import java.util.Timer @@ -95,33 +98,28 @@ // } // }) - //搜索信号,发射一次指令即可 + //搜索信号,搜索能量指令 detectTimer.schedule(object : TimerTask() { override fun run() { try { if (!isDetectDepth) { - outStream?.write('2'.code) - outStream?.flush() + lifecycleScope.launch(Dispatchers.IO) { + if (!isDetectDepth) { + outStream?.write('2'.code) + outStream?.flush() + + delay(100) + + outStream?.write('6'.code) + outStream?.flush() + } + } } } catch (e: IOException) { e.printStackTrace() } } }, 100, 100) - - //发送搜索能量指令 - detectTimer.schedule(object : TimerTask() { - override fun run() { - try { - if (!isDetectDepth) { - outStream?.write('6'.code) - outStream?.flush() - } - } catch (e: IOException) { - e.printStackTrace() - } - } - }, 150, 100) } override fun initEvent() { @@ -174,7 +172,6 @@ if (msg.what == dataReceivedCode) { val buffer = msg.obj as ByteArray val hex = buffer.toHex() - Log.d(kTag, "hex => $hex") //能量强度 //4E30363634000000000000000000000000000000000000000000000000000000 @@ -284,8 +281,6 @@ val id = hex.substring(0, 20).hexToString() val regex = "^[a-z0-9A-Z]+$" if (id.matches(Regex(regex))) { - this.identifierId = id - binding.depthButton.isEnabled = true binding.depthButton.setTextColor(Color.WHITE) binding.depthButton.setBackgroundResource(R.mipmap.left_button_enable) @@ -298,15 +293,15 @@ binding.searchResultView.setBackgroundResource(R.mipmap.bg_small_text_green) //自动上传标识器 - taskLabel = DataBaseManager.get.queryTaskLabelByIdAndState( - identifierId, "未开始" - ) + taskLabel = DataBaseManager.get.queryTaskLabelByIdAndState(id, "未开始") if (taskLabel != null) { val userName = SaveKeyValues.getValue( LocaleConstant.USER_NAME, "" - ) as String - taskViewModel.uploadMarker(userName, identifierId) + ).toString() + taskViewModel.uploadMarker(userName, id) } + + this.identifierId = id } } }