|  |  |  | @ -2,6 +2,8 @@ package com.yinuo.safetywatcher.watcher.port | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | import android.os.Handler | 
		
	
		
			
				|  |  |  |  | import android.os.Looper | 
		
	
		
			
				|  |  |  |  | import com.common.commonlib.db.DBUtils | 
		
	
		
			
				|  |  |  |  | import com.common.commonlib.db.entity.GasType | 
		
	
		
			
				|  |  |  |  | import kotlinx.coroutines.DelicateCoroutinesApi | 
		
	
		
			
				|  |  |  |  | import kotlinx.coroutines.Dispatchers | 
		
	
		
			
				|  |  |  |  | import kotlinx.coroutines.GlobalScope | 
		
	
	
		
			
				
					|  |  |  | @ -25,7 +27,6 @@ object GasUtils { | 
		
	
		
			
				|  |  |  |  |     private fun openPorts() { | 
		
	
		
			
				|  |  |  |  |         if (!mPortFlags[0]) { | 
		
	
		
			
				|  |  |  |  |             PlatformMultiPortUtils.openPort("/dev/tyyS0", BAUD_RATE) { | 
		
	
		
			
				|  |  |  |  |                 setFlag(0) | 
		
	
		
			
				|  |  |  |  |                 if (it.isNotEmpty() && it.size >= FULL_MSG_SIZE) { | 
		
	
		
			
				|  |  |  |  |                     val checkSum = getCheckSum(it) | 
		
	
		
			
				|  |  |  |  |                     // 校验通过 | 
		
	
	
		
			
				
					|  |  |  | @ -33,6 +34,7 @@ object GasUtils { | 
		
	
		
			
				|  |  |  |  |                         val gasName = it[1] | 
		
	
		
			
				|  |  |  |  |                         val gasUnit = it[2] | 
		
	
		
			
				|  |  |  |  |                         val gasValue: Double = (it[4] * 256 + it[5]) / 100.00 | 
		
	
		
			
				|  |  |  |  |                         setFlag(0, gasName, "/dev/tyyS0") | 
		
	
		
			
				|  |  |  |  |                     } | 
		
	
		
			
				|  |  |  |  |                 } | 
		
	
		
			
				|  |  |  |  |             } | 
		
	
	
		
			
				
					|  |  |  | @ -48,14 +50,24 @@ object GasUtils { | 
		
	
		
			
				|  |  |  |  |         } | 
		
	
		
			
				|  |  |  |  |     } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     private fun setFlag(index: Int) { | 
		
	
		
			
				|  |  |  |  |     @OptIn(DelicateCoroutinesApi::class) | 
		
	
		
			
				|  |  |  |  |     private fun updateGasTypeDb(gasName: Byte, port: String, online: Boolean) { | 
		
	
		
			
				|  |  |  |  |         GlobalScope.launch { | 
		
	
		
			
				|  |  |  |  |             val typeDao = DBUtils.gasTypeDao() | 
		
	
		
			
				|  |  |  |  |             typeDao.insert(GasType(gasName.toString(), port, online)) | 
		
	
		
			
				|  |  |  |  |         } | 
		
	
		
			
				|  |  |  |  |     } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     private fun setFlag(index: Int, gasName: Byte, port: String) { | 
		
	
		
			
				|  |  |  |  |         var flagRunnable = mPortRunnable[index] | 
		
	
		
			
				|  |  |  |  |         if (flagRunnable == null) { | 
		
	
		
			
				|  |  |  |  |             flagRunnable = FlagRunnable(index) | 
		
	
		
			
				|  |  |  |  |             flagRunnable = FlagRunnable(index, gasName, port) | 
		
	
		
			
				|  |  |  |  |             mPortRunnable[index] = flagRunnable | 
		
	
		
			
				|  |  |  |  |         } | 
		
	
		
			
				|  |  |  |  |         mHandler.removeCallbacks(flagRunnable) | 
		
	
		
			
				|  |  |  |  |         mPortFlags[index] = true | 
		
	
		
			
				|  |  |  |  |         updateGasTypeDb(gasName, port, true) | 
		
	
		
			
				|  |  |  |  |         // 如果一段时间内没有收到消息,认为连接断开 | 
		
	
		
			
				|  |  |  |  |         mHandler.postDelayed(flagRunnable, CHECK_TIME) | 
		
	
		
			
				|  |  |  |  |     } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
	
		
			
				
					|  |  |  | @ -64,6 +76,7 @@ object GasUtils { | 
		
	
		
			
				|  |  |  |  |     private fun watchPortFlag() { | 
		
	
		
			
				|  |  |  |  |         GlobalScope.launch(Dispatchers.Default) { | 
		
	
		
			
				|  |  |  |  |             while (true) { | 
		
	
		
			
				|  |  |  |  |                 // 延时一段时间后,尝试重新打开串口 | 
		
	
		
			
				|  |  |  |  |                 delay(CHECK_TIME) | 
		
	
		
			
				|  |  |  |  |                 launch(Dispatchers.Main) { | 
		
	
		
			
				|  |  |  |  |                     openPorts() | 
		
	
	
		
			
				
					|  |  |  | @ -72,7 +85,7 @@ object GasUtils { | 
		
	
		
			
				|  |  |  |  |         } | 
		
	
		
			
				|  |  |  |  |     } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     // 计算校验值 | 
		
	
		
			
				|  |  |  |  |     private fun getCheckSum(bytes: ByteArray?): Byte { | 
		
	
		
			
				|  |  |  |  |         var sum: Int = 0 | 
		
	
		
			
				|  |  |  |  |         bytes?.forEachIndexed { index, byte -> | 
		
	
	
		
			
				
					|  |  |  | @ -83,9 +96,15 @@ object GasUtils { | 
		
	
		
			
				|  |  |  |  |         return (sum.inv() + 1).toByte() | 
		
	
		
			
				|  |  |  |  |     } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     class FlagRunnable(private val index: Int) : Runnable { | 
		
	
		
			
				|  |  |  |  |     class FlagRunnable( | 
		
	
		
			
				|  |  |  |  |         private val index: Int, | 
		
	
		
			
				|  |  |  |  |         private val gasName: Byte, | 
		
	
		
			
				|  |  |  |  |         private val port: String | 
		
	
		
			
				|  |  |  |  |     ) : Runnable { | 
		
	
		
			
				|  |  |  |  |         override fun run() { | 
		
	
		
			
				|  |  |  |  |             PlatformMultiPortUtils.release(port) | 
		
	
		
			
				|  |  |  |  |             mPortFlags[index] = false | 
		
	
		
			
				|  |  |  |  |             updateGasTypeDb(gasName, "", false) | 
		
	
		
			
				|  |  |  |  |         } | 
		
	
		
			
				|  |  |  |  |     } | 
		
	
		
			
				|  |  |  |  | } |