Эх сурвалжийг харах

同步Simple Demo分支部分修改:1.优化底座分发机制 2.优化loading的入参类型 3.蓝牙改长连接

Frankensteinly 10 сар өмнө
parent
commit
44ac482627

+ 93 - 58
app/src/main/java/com/grkj/iscs/BusinessManager.kt

@@ -107,7 +107,7 @@ object BusinessManager {
      * 总的监听,做预处理,其余的所有监听均使用本监听处理后的数据,只允许调用一次
      */
     fun registerMainListener() {
-        ModBusController.registerStatusListener(MyApplication.instance!!.applicationContext) { res ->
+        ModBusController.registerStatusListener(this) { res ->
             LogUtil.i("设备状态:${(res as List<ByteArray>).map { it.toHexStrings() }}")
             res.forEach { bytes ->
                 val dockBean = ModBusController.updateStatus(bytes) ?: return@forEach
@@ -213,7 +213,9 @@ object BusinessManager {
                         }
                     }
                 }
-                listeners.forEach { it.callBack(dockBean) }
+                Executor.delayOnMain(200) {
+                    listeners.forEach { it.callBack(dockBean) }
+                }
             }
         }
     }
@@ -326,21 +328,23 @@ object BusinessManager {
     /****************************************** 蓝牙 ******************************************/
     /******************************************蓝牙通用准备******************************************/
 
-    private fun prepareBle(
+    fun prepareBle(
         mac: String,
         activity: AppCompatActivity,
-        loadingCallBack: (Boolean, String?, Boolean?) -> Unit,
-        prepareDoneCallBack: (Boolean, BleBean?) -> Unit
+        loadingCallBack: ((Boolean, String?, Boolean?) -> Unit)?,
+        prepareDoneCallBack: ((Boolean, BleBean?) -> Unit)?
     ) {
-        CommonUtils.checkBlePermission(activity) {
-            doScanBle(mac, loadingCallBack, prepareDoneCallBack)
+        Executor.runOnMain {
+            CommonUtils.checkBlePermission(activity) {
+                doScanBle(mac, loadingCallBack, prepareDoneCallBack)
+            }
         }
     }
 
     @AfterPermissionGranted(PERMISSION_REQUEST_CODE)
-    fun doScanBle(mac: String, loadingCallBack: (Boolean, String?, Boolean?) -> Unit, prepareDoneCallBack: (Boolean, BleBean?) -> Unit) {
+    fun doScanBle(mac: String, loadingCallBack: ((Boolean, String?, Boolean?) -> Unit)?, prepareDoneCallBack: ((Boolean, BleBean?) -> Unit)?) {
         LogUtil.d("扫描开始:$mac")
-        loadingCallBack(true, "正在扫描设备...", null)
+        loadingCallBack?.invoke(true, "正在扫描设备...", null)
         BleUtil.instance?.scan(object : CustomBleScanCallback() {
             override fun onPrompt(promptStr: String?) {
                 BleManager.getInstance().enableBluetooth()
@@ -367,10 +371,19 @@ object BusinessManager {
             }
 
             override fun onScanFinished(scanResultList: MutableList<BleDevice>?) {
-                loadingCallBack.invoke(false, null, null)
+                //                if (BleUtil.instance?.deviceList?.isEmpty() == true) {
+//                    ToastUtils.tip(R.string.ble_no_device_found)
+//                    loadingCallBack?.invoke(false, null, false)
+//                    return
+//                }
+//                BleUtil.instance?.getBleDeviceByMac(mac)?.bleDevice?.let {
+//                    doConnect(it, loadingCallBack, prepareDoneCallBack)
+//                }
+//                scanResultList?.find { it.mac == mac }?.let {
+                loadingCallBack?.invoke(false, null, null)
                 if (BleUtil.instance?.deviceList?.isEmpty() == true) {
                     ToastUtils.tip(R.string.ble_no_device_found)
-                    loadingCallBack.invoke(false, null, false)
+                    loadingCallBack?.invoke(false, null, false)
                     return
                 }
                 BleUtil.instance?.getBleDeviceByMac(mac)?.bleDevice?.let {
@@ -385,26 +398,26 @@ object BusinessManager {
      */
     fun doConnect(
         bleDevice: BleDevice,
-        loadingCallBack: (Boolean, String?, Boolean?) -> Unit,
-        prepareDoneCallBack: (Boolean, BleBean?) -> Unit
+        loadingCallBack: ((Boolean, String?, Boolean?) -> Unit)?,
+        prepareDoneCallBack: ((Boolean, BleBean?) -> Unit)?
     ) {
-        loadingCallBack.invoke(true, CommonUtils.getStr(R.string.ble_connecting), null)
+        loadingCallBack?.invoke(true, CommonUtils.getStr(R.string.ble_connecting), null)
         BleManager.getInstance().disconnect(bleDevice)
         BleUtil.instance?.connectBySelect(bleDevice,
             object : CustomBleGattCallback() {
                 override fun onPrompt(promptStr: String?) {
-                    loadingCallBack.invoke(false, promptStr, false)
+                    loadingCallBack?.invoke(false, promptStr, false)
                 }
 
                 override fun onStartConnect() {}
 
                 override fun onConnectFail(bleDevice: BleDevice?, exception: BleException?) {
-                    loadingCallBack.invoke(false, CommonUtils.getStr(R.string.ble_connect_fail), false)
-                    prepareDoneCallBack.invoke(false, null)
+                    loadingCallBack?.invoke(false, CommonUtils.getStr(R.string.ble_connect_fail), false)
+                    prepareDoneCallBack?.invoke(false, null)
                 }
 
                 override fun onConnectSuccess(bleDevice: BleDevice?, gatt: BluetoothGatt?, status: Int) {
-                    loadingCallBack.invoke(false, null, null)
+                    loadingCallBack?.invoke(false, null, null)
                     LogUtil.i("onConnectSuccess : $bleDevice")
                     bleDevice?.let {
                         val bleBean = BleBean(it)
@@ -422,7 +435,7 @@ object BusinessManager {
                 }
 
                 override fun onDisConnected(isActiveDisConnected: Boolean, device: BleDevice?, gatt: BluetoothGatt?, status: Int) {
-                    loadingCallBack.invoke(false, null, false)
+                    loadingCallBack?.invoke(false, null, false)
                     ToastUtils.tip(CommonUtils.getStr(R.string.ble_disconnect))
                     BleUtil.instance?.getBleDeviceByMac(device?.mac)?.let {
                         BleUtil.instance?.deviceList?.remove(it)
@@ -436,10 +449,10 @@ object BusinessManager {
      */
     private fun indicate(
         bleBean: BleBean?,
-        loadingCallBack: (Boolean, String?, Boolean?) -> Unit,
-        prepareDoneCallBack: (Boolean, BleBean?) -> Unit
+        loadingCallBack: ((Boolean, String?, Boolean?) -> Unit)?,
+        prepareDoneCallBack: ((Boolean, BleBean?) -> Unit)?
     ) {
-        loadingCallBack.invoke(true, "开始监听...", null)
+        loadingCallBack?.invoke(true, "开始监听...", null)
         bleBean?.let {
             BleUtil.instance?.indicate(it.bleDevice, indicateCallback = object : CustomBleIndicateCallback() {
                 override fun onPrompt(promptStr: String?) {
@@ -462,10 +475,10 @@ object BusinessManager {
                 }
 
                 override fun onIndicateFailure(exception: BleException?) {
-                    loadingCallBack.invoke(false, null, false)
+                    loadingCallBack?.invoke(false, null, false)
                     ToastUtils.tip("监听失败")
                     LogUtil.i("监听失败")
-                    prepareDoneCallBack.invoke(false, null)
+                    prepareDoneCallBack?.invoke(false, null)
                 }
 
                 override fun onCharacteristicChanged(data: ByteArray?) {
@@ -483,22 +496,22 @@ object BusinessManager {
      */
     private fun getToken(
         bleBean: BleBean?,
-        loadingCallBack: (Boolean, String?, Boolean?) -> Unit,
-        prepareDoneCallBack: (Boolean, BleBean?) -> Unit
+        loadingCallBack: ((Boolean, String?, Boolean?) -> Unit)?,
+        prepareDoneCallBack: ((Boolean, BleBean?) -> Unit)?
     ) {
-        loadingCallBack.invoke(true, "开始获取token...", null)
+        loadingCallBack?.invoke(true, "开始获取token...", null)
         bleBean?.let {
             BleCmdManager.getToken(it.bleDevice.mac, object : CustomBleWriteCallback() {
                 override fun onWriteSuccess(current: Int, total: Int, justWrite: ByteArray?) {
-                    loadingCallBack.invoke(false, "token获取成功", null)
+                    loadingCallBack?.invoke(false, "token获取成功", null)
                     LogUtil.i("getToken success : ${bleBean.bleDevice.mac}")
-                    prepareDoneCallBack.invoke(true, bleBean)
+                    prepareDoneCallBack?.invoke(true, bleBean)
                 }
 
                 override fun onWriteFailure(exception: BleException?) {
-                    loadingCallBack.invoke(false, "token获取失败", false)
+                    loadingCallBack?.invoke(false, "token获取失败", false)
                     LogUtil.e("getToken fail : ${bleBean.bleDevice.mac}")
-                    prepareDoneCallBack.invoke(false, null)
+                    prepareDoneCallBack?.invoke(false, null)
                 }
             })
         }
@@ -513,11 +526,17 @@ object BusinessManager {
         mac: String,
         ticketDetail: TicketDetailRespVO,
         activity: AppCompatActivity,
-        loadingCallBack: (Boolean, String?, Boolean?) -> Unit,
+        loadingCallBack: ((Boolean, String?, Boolean?) -> Unit)?,
     ) {
         prepareBle(mac, activity, loadingCallBack) { done, bleBean ->
             if (done) {
                 Executor.delayOnMain(500) {
+                    // TODO 蓝牙准备操作
+//                    val bleBean = BleUtil.instance?.getBleDeviceByMac(mac)
+//                    if (bleBean == null) {
+//                        ToastUtils.tip(R.string.simple_key_is_not_connected)
+//                        return@delayOnMain
+//                    }
                     // 单bleBean json赋值
                     bleBean?.ticketSend = generateTicketSendJson(ticketDetail)
                     bleBean?.ticketSend?.let { itJson ->
@@ -525,7 +544,7 @@ object BusinessManager {
                     }
                 }
             } else {
-                loadingCallBack.invoke(false, null, false)
+                loadingCallBack?.invoke(false, null, false)
             }
         }
     }
@@ -533,29 +552,35 @@ object BusinessManager {
     /**
      * 读取工作票完成情况
      */
-    fun getTicketStatusBusiness(mac: String, activity: AppCompatActivity, loadingCallBack: (Boolean, String?, Boolean?) -> Unit) {
+    fun getTicketStatusBusiness(mac: String, activity: AppCompatActivity, loadingCallBack: ((Boolean, String?, Boolean?) -> Unit)?) {
         prepareBle(mac, activity, loadingCallBack) { done, bleBean ->
             if (done) {
                 Executor.delayOnMain(500) {
+                    // TODO 蓝牙准备操作
+//                    val bleBean = BleUtil.instance?.getBleDeviceByMac(mac)
+//                    if (bleBean == null) {
+//                        ToastUtils.tip(R.string.simple_key_is_not_connected)
+//                        return@delayOnMain
+//                    }
                     getTicketStatus(bleBean!!.bleDevice, loadingCallBack)
                 }
             } else {
-                loadingCallBack.invoke(false, null, false)
+                loadingCallBack?.invoke(false, null, false)
             }
         }
     }
 
-    private fun sendTicket(jsonStr: String, bleDevice: BleDevice, loadingCallBack: (Boolean, String?, Boolean?) -> Unit) {
-        loadingCallBack.invoke(true, "开始下发工作票...", null)
+    private fun sendTicket(jsonStr: String, bleDevice: BleDevice, loadingCallBack: ((Boolean, String?, Boolean?) -> Unit)?) {
+        loadingCallBack?.invoke(true, "开始下发工作票...", null)
         BleCmdManager.sendWorkTicket(jsonStr, bleDevice = bleDevice, callback = object : CustomBleWriteCallback() {
             override fun onWriteSuccess(current: Int, total: Int, justWrite: ByteArray?) {
                 println("sendTicket success")
-                loadingCallBack.invoke(true, "工作票下发中...", null)
+                loadingCallBack?.invoke(true, "工作票下发中...", null)
             }
 
             override fun onWriteFailure(exception: BleException?) {
                 LogUtil.e("sendTicket fail : ${bleDevice.mac}")
-                loadingCallBack.invoke(false, "工作票下发失败", null)
+                loadingCallBack?.invoke(false, "工作票下发失败", null)
             }
         })
     }
@@ -608,7 +633,7 @@ object BusinessManager {
         return jsonStr
     }
 
-    fun handleRsp(bleBean: BleBean, byteArray: ByteArray, loadingCallBack: (Boolean, String?, Boolean?) -> Unit) {
+    fun handleRsp(bleBean: BleBean, byteArray: ByteArray, loadingCallBack: ((Boolean, String?, Boolean?) -> Unit)?) {
         // TODO Token校验
 //        val len = byteArray[2].toInt()
 //        val token = byteArray.copyOfRange(len + 7, len + 11)
@@ -647,15 +672,15 @@ object BusinessManager {
      * job : 0x01:工作模式 0x02:待机模式
      * res : 0x01:成功 0x02:失败
      */
-    private fun handleSwitchModeResult(byteArray: ByteArray, loadingCallBack: (Boolean, String?, Boolean?) -> Unit) {
+    private fun handleSwitchModeResult(byteArray: ByteArray, loadingCallBack: ((Boolean, String?, Boolean?) -> Unit)?) {
         LogUtil.i("handleSwitchModeResult : ${byteArray.toHexStrings()}")
         val job = byteArray[4]
         val res = byteArray[5]
-        loadingCallBack.invoke(false, null, null)
+        loadingCallBack?.invoke(false, null, null)
         if (res == 0x01.toByte() && job == 0x01.toByte()) {
-            loadingCallBack.invoke(false, "切换工作模式成功", null)
+            loadingCallBack?.invoke(false, "切换工作模式成功", null)
         } else if (res == 0x02.toByte() && job == 0x01.toByte()) {
-            loadingCallBack.invoke(false, "切换待机模式成功", null)
+            loadingCallBack?.invoke(false, "切换待机模式成功", null)
         }
         // TODO 切换完不断开
 //        BleManager.getInstance().disconnectAllDevice()
@@ -665,9 +690,9 @@ object BusinessManager {
      * 工作票下发结果
      * res:0x00:成功 0x01:失败 0x02:传输超时 0x0D:当前IDX超出范围 0x0E:当前数据CRC校验失败 0x14:JSON结构错误 0x63:未知错误
      */
-    private fun handleWorkTicketResult(bleBean: BleBean, byteArray: ByteArray, loadingCallBack: (Boolean, String?, Boolean?) -> Unit) {
+    private fun handleWorkTicketResult(bleBean: BleBean, byteArray: ByteArray, loadingCallBack: ((Boolean, String?, Boolean?) -> Unit)?) {
         LogUtil.i("handleWorkTicketResult : ${byteArray.toHexStrings()}")
-        loadingCallBack.invoke(false, null, null)
+        loadingCallBack?.invoke(false, null, null)
         val idx = byteArray[4] + byteArray[5]
         val total = byteArray[6] + byteArray[7]
         val res = byteArray[8]
@@ -688,20 +713,23 @@ object BusinessManager {
         } else {
             LogUtil.i("Work ticket is done")
             // 下发完毕,切换工作模式
-            loadingCallBack.invoke(true, "切换钥匙为工作模式", null)
+            loadingCallBack?.invoke(true, "切换钥匙为工作模式", null)
             BleCmdManager.switchMode(STATUS_WORK, bleBean.bleDevice, object : CustomBleWriteCallback() {
                 override fun onWriteSuccess(current: Int, total: Int, justWrite: ByteArray?) {
-                    println("switch mode 1 success")}
+                    println("switch mode 1 success")
+                    // TODO 只能在这里断开,不能全部断开
+//                    BleManager.getInstance().disconnect(bleBean.bleDevice)
+                }
                 override fun onWriteFailure(exception: BleException?) {
                     println("switch mode 1 fail")}
             })
             // 打开钥匙卡扣
             val keyBean = ModBusController.getKeyByMac(bleBean.bleDevice.mac)
             if (keyBean == null) {
-                loadingCallBack.invoke(false, "未找到钥匙信息", false)
+                loadingCallBack?.invoke(false, "未找到钥匙信息", false)
                 ToastUtils.tip(R.string.key_not_exists)
             } else {
-                loadingCallBack.invoke(false, null, true)
+                loadingCallBack?.invoke(false, null, true)
                 val dock = ModBusController.getDockByKeyMac(bleBean.bleDevice.mac)
                 ModBusController.controlKeyBuckle(true, keyBean.isLeft, dock?.addr!!.toInt() - 1)
             }
@@ -711,7 +739,7 @@ object BusinessManager {
     /**
      * 处理工作票完成情况
      */
-    private fun handleTicketStatus(bleDevice: BleDevice, byteArray: ByteArray, loadingCallBack: (Boolean, String?, Boolean?) -> Unit) {
+    private fun handleTicketStatus(bleDevice: BleDevice, byteArray: ByteArray, loadingCallBack: ((Boolean, String?, Boolean?) -> Unit)?) {
         // TODO 需要有超时重传机制
         LogUtil.i("handleTicketStatus : ${byteArray.toHexStrings()}")
 
@@ -726,7 +754,7 @@ object BusinessManager {
         }
         // TODO 缺少res处理
         if (idx != total - 1) {
-            loadingCallBack.invoke(true, "获取工作票分包", null)
+            loadingCallBack?.invoke(true, "获取工作票分包", null)
             getTicketStatusPart((idx + 1).toByteArray(), total.toByteArray(), byteArrayOf(0x01.toByte()), bleDevice, object : CustomBleWriteCallback() {
                 override fun onWriteSuccess(current: Int, total: Int, justWrite: ByteArray?) {
                     println("getTicketStatusPart success")
@@ -737,11 +765,11 @@ object BusinessManager {
                 }
             })
         } else {
-            loadingCallBack.invoke(false, "工作票完成状态读取完成", null)
+            loadingCallBack?.invoke(false, "工作票完成状态读取完成", null)
             BleUtil.instance?.getBleDeviceByMac(bleDevice.mac)?.let {
                 println("工作票完成接收 : ${String(it.ticketStatus)}")
                 // TD:Ticket Done
-                loadingCallBack.invoke(false, "TD${String(it.ticketStatus)}", true)
+                loadingCallBack?.invoke(false, "TD${String(it.ticketStatus)}", true)
                 // TODO 清空ticket
                 it.ticketStatus = byteArrayOf()
                 // TODO 根据工作票完成情况,切换为待机模式
@@ -752,6 +780,13 @@ object BusinessManager {
                         println("switch mode 1 fail")}
                 })
 
+                // TODO 和confirm dialog冲突,待定
+                val dock = ModBusController.getDockByKeyMac(bleDevice.mac)
+                val keyBean = dock?.getKeyList()?.find { it.mac == bleDevice.mac }
+                keyBean?.let {
+                    ModBusController.controlKeyBuckle(false, keyBean.isLeft, dock.addr.toInt() - 1)
+                }
+
                 // 上报隔离点状态
                 val workTicketGetBO = Gson().fromJson(String(it.ticketStatus), WorkTicketGetBO::class.java)
                 val keyNfc = ModBusController.getKeyByMac(bleDevice.mac)?.rfid
@@ -795,14 +830,14 @@ object BusinessManager {
     /**
      * 获取工作票完成情况
      */
-    private fun getTicketStatus(bleDevice: BleDevice, loadingCallBack: (Boolean, String?, Boolean?) -> Unit) {
-        loadingCallBack.invoke(true, "开始获取工作票", null)
+    private fun getTicketStatus(bleDevice: BleDevice, loadingCallBack: ((Boolean, String?, Boolean?) -> Unit)?) {
+        loadingCallBack?.invoke(true, "开始获取工作票", null)
         BleCmdManager.getTicketStatus(bleDevice, object : CustomBleWriteCallback() {
             override fun onWriteSuccess(current: Int, total: Int, justWrite: ByteArray?) {
-                loadingCallBack.invoke(false, "工作票获取成功", null)
+                loadingCallBack?.invoke(false, "工作票获取成功", null)
                 println("getTicketStatus success")}
             override fun onWriteFailure(exception: BleException?) {
-                loadingCallBack.invoke(false, "工作票获取失败", false)
+                loadingCallBack?.invoke(false, "工作票获取失败", false)
                 println("getTicketStatus fail")}
         })
     }

+ 4 - 0
app/src/main/java/com/grkj/iscs/modbus/ModBusController.kt

@@ -173,6 +173,10 @@ object ModBusController {
                         val rfid = res.copyOfRange(3, 11).toHexStrings(false).removeLeadingZeros()
                         LogUtil.i("初始化钥匙 RFID : $rfid")
                         updateKeyRfid(dockBean.addr.toInt(), isLeft, rfid)
+                        // TODO 蓝牙准备操作
+//                        BusinessManager.prepareBle(mac, ActivityUtils.currentActivity() as BaseActivity<*>, { _,_,_ -> }) { _,_ ->
+//
+//                        }
                     }
                     controlKeyBuckle(false, key.isLeft, dockBean.addr.toInt() - 1)
                 } else {