Browse Source

同步Simple Demo分支部分修改:1.修改prepareBle的loadingCallBack 2.修改Modbus调试页的钥匙卡扣slaveIdx 3.切完工作模式后不断开蓝牙连接 4.修复钥匙卡扣指令左右判断 5.优化硬件初始化

Frankensteinly 10 months ago
parent
commit
6f111a4e18

+ 48 - 44
app/src/main/java/com/grkj/iscs/BusinessManager.kt

@@ -208,7 +208,7 @@ object BusinessManager {
         dlg.setType(TipDialog.TYPE_CONFIRM)
         dlg.setConfirmListener {
             ModBusController.controlKeyBuckle(false, isLeft, slaveIdx)
-            getTicketStatusBusiness(mac, ActivityUtils.currentActivity() as BaseActivity<*>) { b, s ->
+            getTicketStatusBusiness(mac, ActivityUtils.currentActivity() as BaseActivity<*>) { b, s, rst ->
                 (ActivityUtils.currentActivity() as BaseActivity<*>).handleLoading(b, s)
             }
         }
@@ -310,7 +310,7 @@ object BusinessManager {
     private fun prepareBle(
         mac: String,
         activity: AppCompatActivity,
-        loadingCallBack: (Boolean, String?) -> Unit,
+        loadingCallBack: (Boolean, String?, Boolean?) -> Unit,
         prepareDoneCallBack: (Boolean, BleBean?) -> Unit
     ) {
         CommonUtils.checkBlePermission(activity) {
@@ -319,9 +319,9 @@ object BusinessManager {
     }
 
     @AfterPermissionGranted(PERMISSION_REQUEST_CODE)
-    fun doScanBle(mac: String, loadingCallBack: (Boolean, String?) -> Unit, prepareDoneCallBack: (Boolean, BleBean?) -> Unit) {
+    fun doScanBle(mac: String, loadingCallBack: (Boolean, String?, Boolean?) -> Unit, prepareDoneCallBack: (Boolean, BleBean?) -> Unit) {
         LogUtil.d("扫描开始:$mac")
-        loadingCallBack(true, "正在扫描设备...")
+        loadingCallBack(true, "正在扫描设备...", null)
         BleUtil.instance?.scan(object : CustomBleScanCallback() {
             override fun onPrompt(promptStr: String?) {
                 BleManager.getInstance().enableBluetooth()
@@ -348,9 +348,10 @@ object BusinessManager {
             }
 
             override fun onScanFinished(scanResultList: MutableList<BleDevice>?) {
-                loadingCallBack.invoke(false, null)
+                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 {
@@ -365,26 +366,26 @@ object BusinessManager {
      */
     fun doConnect(
         bleDevice: BleDevice,
-        loadingCallBack: (Boolean, String?) -> Unit,
+        loadingCallBack: (Boolean, String?, Boolean?) -> Unit,
         prepareDoneCallBack: (Boolean, BleBean?) -> Unit
     ) {
-        loadingCallBack.invoke(true, CommonUtils.getStr(R.string.ble_connecting))
+        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)
+                    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))
+                    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)
+                    loadingCallBack.invoke(false, null, null)
                     LogUtil.i("onConnectSuccess : $bleDevice")
                     bleDevice?.let {
                         val bleBean = BleBean(it)
@@ -402,7 +403,7 @@ object BusinessManager {
                 }
 
                 override fun onDisConnected(isActiveDisConnected: Boolean, device: BleDevice?, gatt: BluetoothGatt?, status: Int) {
-                    loadingCallBack.invoke(false, null)
+                    loadingCallBack.invoke(false, null, false)
                     ToastUtils.tip(CommonUtils.getStr(R.string.ble_disconnect))
                     BleUtil.instance?.getBleDeviceByMac(device?.mac)?.let {
                         BleUtil.instance?.deviceList?.remove(it)
@@ -416,10 +417,10 @@ object BusinessManager {
      */
     private fun indicate(
         bleBean: BleBean?,
-        loadingCallBack: (Boolean, String?) -> Unit,
+        loadingCallBack: (Boolean, String?, Boolean?) -> Unit,
         prepareDoneCallBack: (Boolean, BleBean?) -> Unit
     ) {
-        loadingCallBack.invoke(true, "开始监听...")
+        loadingCallBack.invoke(true, "开始监听...", null)
         bleBean?.let {
             BleUtil.instance?.indicate(it.bleDevice, indicateCallback = object : CustomBleIndicateCallback() {
                 override fun onPrompt(promptStr: String?) {
@@ -442,7 +443,7 @@ object BusinessManager {
                 }
 
                 override fun onIndicateFailure(exception: BleException?) {
-                    loadingCallBack.invoke(false, null)
+                    loadingCallBack.invoke(false, null, false)
                     ToastUtils.tip("监听失败")
                     LogUtil.i("监听失败")
                     prepareDoneCallBack.invoke(false, null)
@@ -463,20 +464,20 @@ object BusinessManager {
      */
     private fun getToken(
         bleBean: BleBean?,
-        loadingCallBack: (Boolean, String?) -> Unit,
+        loadingCallBack: (Boolean, String?, Boolean?) -> Unit,
         prepareDoneCallBack: (Boolean, BleBean?) -> Unit
     ) {
-        loadingCallBack.invoke(true, "开始获取token...")
+        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获取成功")
+                    loadingCallBack.invoke(false, "token获取成功", null)
                     LogUtil.i("getToken success : ${bleBean.bleDevice.mac}")
                     prepareDoneCallBack.invoke(true, bleBean)
                 }
 
                 override fun onWriteFailure(exception: BleException?) {
-                    loadingCallBack.invoke(false, "token获取失败")
+                    loadingCallBack.invoke(false, "token获取失败", false)
                     LogUtil.e("getToken fail : ${bleBean.bleDevice.mac}")
                     prepareDoneCallBack.invoke(false, null)
                 }
@@ -493,7 +494,7 @@ object BusinessManager {
         mac: String,
         ticketDetail: TicketDetailRespVO,
         activity: AppCompatActivity,
-        loadingCallBack: (Boolean, String?) -> Unit,
+        loadingCallBack: (Boolean, String?, Boolean?) -> Unit,
     ) {
         prepareBle(mac, activity, loadingCallBack) { done, bleBean ->
             if (done) {
@@ -505,7 +506,7 @@ object BusinessManager {
                     }
                 }
             } else {
-                loadingCallBack.invoke(false, null)
+                loadingCallBack.invoke(false, null, false)
             }
         }
     }
@@ -513,29 +514,29 @@ object BusinessManager {
     /**
      * 读取工作票完成情况
      */
-    fun getTicketStatusBusiness(mac: String, activity: AppCompatActivity, loadingCallBack: (Boolean, String?) -> Unit) {
+    fun getTicketStatusBusiness(mac: String, activity: AppCompatActivity, loadingCallBack: (Boolean, String?, Boolean?) -> Unit) {
         prepareBle(mac, activity, loadingCallBack) { done, bleBean ->
             if (done) {
                 Executor.delayOnMain(500) {
                     getTicketStatus(bleBean!!.bleDevice, loadingCallBack)
                 }
             } else {
-                loadingCallBack.invoke(false, null)
+                loadingCallBack.invoke(false, null, false)
             }
         }
     }
 
-    private fun sendTicket(jsonStr: String, bleDevice: BleDevice, loadingCallBack: (Boolean, String?) -> Unit) {
-        loadingCallBack.invoke(true, "开始下发工作票...")
+    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, "工作票下发中...")
+                loadingCallBack.invoke(true, "工作票下发中...", null)
             }
 
             override fun onWriteFailure(exception: BleException?) {
                 LogUtil.e("sendTicket fail : ${bleDevice.mac}")
-                loadingCallBack.invoke(false, "工作票下发失败")
+                loadingCallBack.invoke(false, "工作票下发失败", null)
             }
         })
     }
@@ -588,7 +589,7 @@ object BusinessManager {
         return jsonStr
     }
 
-    fun handleRsp(bleBean: BleBean, byteArray: ByteArray, loadingCallBack: (Boolean, String?) -> 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)
@@ -627,26 +628,27 @@ object BusinessManager {
      * job : 0x01:工作模式 0x02:待机模式
      * res : 0x01:成功 0x02:失败
      */
-    private fun handleSwitchModeResult(byteArray: ByteArray, loadingCallBack: (Boolean, String?) -> 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)
+        loadingCallBack.invoke(false, null, null)
         if (res == 0x01.toByte() && job == 0x01.toByte()) {
-            loadingCallBack.invoke(false, "切换工作模式成功")
+            loadingCallBack.invoke(false, "切换工作模式成功", null)
         } else if (res == 0x02.toByte() && job == 0x01.toByte()) {
-            loadingCallBack.invoke(false, "切换待机模式成功")
+            loadingCallBack.invoke(false, "切换待机模式成功", null)
         }
-        BleManager.getInstance().disconnectAllDevice()
+        // TODO 切换完不断开
+//        BleManager.getInstance().disconnectAllDevice()
     }
 
     /**
      * 工作票下发结果
      * res:0x00:成功 0x01:失败 0x02:传输超时 0x0D:当前IDX超出范围 0x0E:当前数据CRC校验失败 0x14:JSON结构错误 0x63:未知错误
      */
-    private fun handleWorkTicketResult(bleBean: BleBean, byteArray: ByteArray, loadingCallBack: (Boolean, String?) -> Unit) {
+    private fun handleWorkTicketResult(bleBean: BleBean, byteArray: ByteArray, loadingCallBack: (Boolean, String?, Boolean?) -> Unit) {
         LogUtil.i("handleWorkTicketResult : ${byteArray.toHexStrings()}")
-        loadingCallBack.invoke(false, null)
+        loadingCallBack.invoke(false, null, null)
         val idx = byteArray[4] + byteArray[5]
         val total = byteArray[6] + byteArray[7]
         val res = byteArray[8]
@@ -667,7 +669,7 @@ object BusinessManager {
         } else {
             LogUtil.i("Work ticket is done")
             // 下发完毕,切换工作模式
-            loadingCallBack.invoke(true, "切换钥匙为工作模式")
+            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")}
@@ -677,9 +679,10 @@ object BusinessManager {
             // 打开钥匙卡扣
             val keyBean = ModBusController.getKeyByRfid(bleBean.bleDevice.mac)
             if (keyBean == null) {
-                loadingCallBack.invoke(false, "未找到钥匙信息")
+                loadingCallBack.invoke(false, "未找到钥匙信息", false)
                 ToastUtils.tip(R.string.key_not_exists)
             } else {
+                loadingCallBack.invoke(false, null, true)
                 val dock = ModBusController.getDockByKeyMac(bleBean.bleDevice.mac)
                 ModBusController.controlKeyBuckle(true, keyBean.isLeft, dock?.addr?.toInt())
             }
@@ -689,7 +692,7 @@ object BusinessManager {
     /**
      * 处理工作票完成情况
      */
-    private fun handleTicketStatus(bleDevice: BleDevice, byteArray: ByteArray, loadingCallBack: (Boolean, String?) -> Unit) {
+    private fun handleTicketStatus(bleDevice: BleDevice, byteArray: ByteArray, loadingCallBack: (Boolean, String?, Boolean?) -> Unit) {
         // TODO 需要有超时重传机制
         LogUtil.i("handleTicketStatus : ${byteArray.toHexStrings()}")
 
@@ -704,7 +707,7 @@ object BusinessManager {
         }
         // TODO 缺少res处理
         if (idx != total - 1) {
-            loadingCallBack.invoke(true, "获取工作票分包")
+            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")
@@ -715,10 +718,11 @@ object BusinessManager {
                 }
             })
         } else {
-            loadingCallBack.invoke(false, "工作票完成状态读取完成")
+            loadingCallBack.invoke(false, "工作票完成状态读取完成", null)
             BleUtil.instance?.getBleDeviceByMac(bleDevice.mac)?.let {
                 println("工作票完成接收 : ${String(it.ticketStatus)}")
-                loadingCallBack.invoke(false, "工作票完成接收${String(it.ticketStatus)}")
+                // TD:Ticket Done
+                loadingCallBack.invoke(false, "TD${String(it.ticketStatus)}", true)
                 // TODO 清空ticket
                 it.ticketStatus = byteArrayOf()
                 // TODO 根据工作票完成情况,切换为待机模式
@@ -772,14 +776,14 @@ object BusinessManager {
     /**
      * 获取工作票完成情况
      */
-    private fun getTicketStatus(bleDevice: BleDevice, loadingCallBack: (Boolean, String?) -> Unit) {
-        loadingCallBack.invoke(true, "开始获取工作票")
+    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, "工作票获取成功")
+                loadingCallBack.invoke(false, "工作票获取成功", null)
                 println("getTicketStatus success")}
             override fun onWriteFailure(exception: BleException?) {
-                loadingCallBack.invoke(false, "工作票获取失败")
+                loadingCallBack.invoke(false, "工作票获取失败", false)
                 println("getTicketStatus fail")}
         })
     }

+ 12 - 6
app/src/main/java/com/grkj/iscs/activity/test/ModbusActivity.kt

@@ -94,18 +94,24 @@ class ModbusActivity : BaseMvpActivity<IModbusView, ModBusPresenter, ActivityMod
 
         mBinding?.openKeyBuckle?.setOnClickListener {
             println("____________________________________")
-            // TODO 暂时写死,调试用
-            ModBusController.controlKeyBuckle(isOpen = true, true, 0) {
-                LogUtil.i("开锁钥匙卡扣 : ${it.toHexStrings()}")
+            if (mBinding?.slaveIdx?.text.toString().isEmpty()) {
+                ToastUtils.tip("请输入设备编号")
+                return@setOnClickListener
+            }
+            ModBusController.controlKeyBuckle(isOpen = true, false, mBinding?.slaveIdx?.text.toString().toInt()) {
+                LogUtil.i("开钥匙卡扣 : ${it.toHexStrings()}")
                 println("____________________________________")
             }
         }
 
         mBinding?.closeKeyBuckle?.setOnClickListener {
             println("____________________________________")
-            // TODO 暂时写死,调试用
-            ModBusController.controlKeyBuckle(isOpen = false, true, 0) {
-                LogUtil.i("关锁钥匙卡扣 : ${it.toHexStrings()}")
+            if (mBinding?.slaveIdx?.text.toString().isEmpty()) {
+                ToastUtils.tip("请输入设备编号")
+                return@setOnClickListener
+            }
+            ModBusController.controlKeyBuckle(isOpen = false, false, mBinding?.slaveIdx?.text.toString().toInt()) {
+                LogUtil.i("关钥匙卡扣 : ${it.toHexStrings()}")
                 println("____________________________________")
             }
         }

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

@@ -129,7 +129,7 @@ object ModBusController {
                 }
                 LogUtil.i("initDevicesStatus 设备(${bytes[0].toInt()})类型:$type")
                 // TODO 待完善
-                Executor.delayOnMain(REPEAT_FREQUENCY) {
+                Executor.delayOnMain(REPEAT_FREQUENCY * 3) {
                     initLock()    // 打开所有无锁的卡扣、关闭所有有锁的卡扣、读取所有锁的RFID
                     initKey()     // 打开所有无钥匙的卡扣、关闭所有有钥匙的卡扣、关闭所有钥匙灯光、读取所有钥匙的RFID
                 }

+ 1 - 1
app/src/main/java/com/grkj/iscs/modbus/ModBusManager.kt

@@ -333,7 +333,7 @@ class ModBusManager(
     fun generateKeyBuckleCmd(isOpen: Boolean, index: Int): MBFrame {
         return MBFrame(
             FRAME_TYPE_WRITE,
-            byteArrayOf(0x00, 0x11, if (index == 0) 0b00010000.toByte() else 0b0000001, if (isOpen) 0x00 else 0xFF.toByte())
+            byteArrayOf(0x00, 0x11, if (index == 1) 0b00010000.toByte() else 0b0000001, if (isOpen) 0x00 else 0xFF.toByte())
         )
     }
 

+ 2 - 2
app/src/main/java/com/grkj/iscs/presentation/PresentationLoginActivity.kt

@@ -108,10 +108,10 @@ class PresentationLoginActivity : BaseActivity<ActivityPresentationLoginBinding>
 
                                 DEVICE_TYPE_KEY -> {
                                     Executor.runOnMain {
-                                        BusinessManager.getTicketStatusBusiness(PresentationManager.keyMac, this) { b, s ->
+                                        BusinessManager.getTicketStatusBusiness(PresentationManager.keyMac, this) { b, s, rst ->
                                             handleLoading(b, s)
                                             if (!s.isNullOrEmpty() && s.startsWith("工作票完成接收")) {
-                                                val ticket = s.substring(7)
+                                                val ticket = s.substring(2)
                                                 val ticketStatusBean = Gson().fromJson(ticket, WorkTicketStatusBean::class.java)
                                                 PresentationManager.updateWorkTicket(ticketStatusBean)
                                             }

+ 2 - 2
app/src/main/java/com/grkj/iscs/presenter/TicketDetailPresenter.kt

@@ -104,7 +104,7 @@ class TicketDetailPresenter : BasePresenter<ITicketDetailView>() {
                         NetApi.updateKeyTake(ticketDetail.ticketId!!, keyPair.second?.rfid!!, mContext!!.serialNo()) {
                             if (it) {
                                 // 下发工作票
-                                BusinessManager.sendTicketBusiness(keyPair.second?.mac!!, ticketDetail, mvpView as TicketDetailActivity) { b, s ->
+                                BusinessManager.sendTicketBusiness(keyPair.second?.mac!!, ticketDetail, mvpView as TicketDetailActivity) { b, s, rst ->
 
                                 }
                             }
@@ -121,7 +121,7 @@ class TicketDetailPresenter : BasePresenter<ITicketDetailView>() {
                         NetApi.updateKeyTake(ticketDetail.ticketId!!, keyPair.second?.rfid!!, mContext!!.serialNo()) {
                             if (it) {
                                 // 下发工作票
-                                BusinessManager.sendTicketBusiness(keyPair.second?.mac!!, ticketDetail, mvpView as TicketDetailActivity) { b, s ->
+                                BusinessManager.sendTicketBusiness(keyPair.second?.mac!!, ticketDetail, mvpView as TicketDetailActivity) { b, s, rst ->
                                     (mvpView as TicketDetailActivity).handleLoading(b, s)
                                 }
                             }