Parcourir la source

修复钥匙卡扣指令错误;封装业务manager,将硬件逻辑从页面剥离

Frankensteinly il y a 1 an
Parent
commit
a03818f158

+ 98 - 0
app/src/main/java/com/grkj/iscs/BusinessManager.kt

@@ -0,0 +1,98 @@
+package com.grkj.iscs
+
+import com.grkj.iscs.extentions.removeLeadingZeros
+import com.grkj.iscs.extentions.toHexStrings
+import com.grkj.iscs.modbus.ModBusController
+import com.grkj.iscs.model.DeviceConst.DEVICE_TYPE_CARD
+import com.grkj.iscs.model.DeviceConst.DEVICE_TYPE_FINGERPRINT
+import com.grkj.iscs.model.DeviceConst.DEVICE_TYPE_KEY
+import com.grkj.iscs.model.DeviceConst.DEVICE_TYPE_LOCK
+import com.grkj.iscs.model.DeviceConst.DOCK_TYPE_KEY
+import com.grkj.iscs.model.DeviceConst.DOCK_TYPE_LOCK
+import com.grkj.iscs.model.DeviceConst.DOCK_TYPE_PORTABLE
+import com.grkj.iscs.util.ToastUtils
+import com.grkj.iscs.util.log.LogUtil
+
+/**
+ * 业务层管理
+ */
+object BusinessManager {
+
+    fun connectDock(count: Int, isNeedInit: Boolean = false) {
+        ModBusController.setSlaveCount(count)
+        ModBusController.interruptReadTrashBinStatus(false)
+        ModBusController.start(MyApplication.instance!!.applicationContext)
+        ModBusController.unregisterListener(MyApplication.instance!!.applicationContext)
+
+        if (isNeedInit) {
+            ModBusController.initDevicesStatus()
+        }
+    }
+
+    fun disconnectDock() {
+        ModBusController.stop()
+    }
+
+    fun registerStatusListener() {
+        ModBusController.registerStatusListener(this) { res ->
+            LogUtil.i("设备状态:${(res as List<ByteArray>).map { it.toHexStrings() }}")
+            res.forEach { bytes ->
+                val dockBean = ModBusController.updateStatus(bytes) ?: return@forEach
+                when (dockBean.type) {
+                    DOCK_TYPE_KEY -> {
+                        dockBean.getKeyList().forEach { keyBean ->
+                            if (keyBean.isExist) {
+                                // 放回钥匙,读取rfid
+                                ModBusController.readKeyRfid(dockBean.addr.toInt() - 1, keyBean.isLeft) { isLeft, res ->
+                                    val rfid = res.copyOfRange(3, 11).toHexStrings(false).removeLeadingZeros()
+                                    ModBusController.updateKeyRfid(dockBean.addr.toInt(), keyBean.isLeft, rfid)
+                                    // TODO 从HTTP读取Mac
+                                    // TODO 蓝牙通信
+                                    // TODO 关卡扣
+                                }
+                            }
+                        }
+                    }
+                    DOCK_TYPE_LOCK -> {
+                        dockBean.getLockList().forEach { lockBean ->
+                            if (lockBean.isExist) {
+                                ModBusController.readLockRfid(dockBean.addr.toInt() - 1, lockBean.idx) { res ->
+                                    val rfid = res.copyOfRange(3, 11).toHexStrings(false).removeLeadingZeros()
+                                    ModBusController.updateLockRfid(dockBean.addr.toInt(), lockBean.idx, rfid)
+                                }
+                            }
+                        }
+                    }
+                    DOCK_TYPE_PORTABLE -> {
+                        // TODO 便携式待完善
+                        dockBean.deviceList.forEach { deviceBean ->
+                            if (deviceBean.isExist) {
+                                when (deviceBean.type) {
+                                    DEVICE_TYPE_KEY -> {
+
+                                    }
+                                    DEVICE_TYPE_LOCK -> {
+                                        ModBusController.readLockRfid(dockBean.addr.toInt() - 1, deviceBean.idx) { res ->
+                                            val rfid = res.copyOfRange(3, 11).toHexStrings(false).removeLeadingZeros()
+                                            ModBusController.updateLockRfid(dockBean.addr.toInt(), deviceBean.idx, rfid)
+                                        }
+                                    }
+                                    DEVICE_TYPE_CARD -> {
+                                        ModBusController.readPortalCaseCardRfid(dockBean.addr.toInt() - 1) { res ->
+                                            val rfid = res.copyOfRange(3, 11).toHexStrings(false).removeLeadingZeros()
+                                            println("卡片RFID : $rfid")
+                                            ToastUtils.tip("卡片RFID : $rfid")
+                                        }
+                                    }
+                                    DEVICE_TYPE_FINGERPRINT -> {
+
+                                    }
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
+}

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

@@ -328,12 +328,12 @@ class ModBusManager(
      * 操作钥匙/便携式底座钥匙卡扣,一次只操作一个卡扣
      *
      * @param isOpen true:开操作 false:关操作
-     * @param index 0:左 1:右 便携式底座钥匙传0
+     * @param index 0:左 1:右 便携式底座钥匙传1
      */
     fun generateKeyBuckleCmd(isOpen: Boolean, index: Int): MBFrame {
         return MBFrame(
             FRAME_TYPE_WRITE,
-            byteArrayOf(0x00, 0x11, if (index == 0) 0b10000000.toByte() else 0b00001000, if (isOpen) 0x00 else 0xFF.toByte())
+            byteArrayOf(0x00, 0x11, if (index == 0) 0b00010000.toByte() else 0b0000001, if (isOpen) 0x00 else 0xFF.toByte())
         )
     }
 

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

@@ -4,6 +4,7 @@ import android.os.Environment
 import android.view.Gravity
 import android.widget.CheckBox
 import androidx.recyclerview.widget.LinearLayoutManager
+import com.grkj.iscs.BusinessManager
 import com.grkj.iscs.R
 import com.grkj.iscs.base.BaseMvpActivity
 import com.grkj.iscs.databinding.ActivityPresentationBinding
@@ -57,7 +58,7 @@ class PresentationActivity :
     }
 
     override fun initView() {
-        presenter?.initModbus()
+        BusinessManager.connectDock(1, false)
 
         val path =
             Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).absolutePath + "/presentation/presentation.txt"

+ 2 - 1
app/src/main/java/com/grkj/iscs/PageControl.java → app/src/main/java/com/grkj/iscs/widget/PageControl.java

@@ -1,4 +1,4 @@
-package com.grkj.iscs;
+package com.grkj.iscs.widget;
 
 
 import android.content.Context;
@@ -10,6 +10,7 @@ import android.widget.TextView;
 
 import androidx.annotation.Nullable;
 
+import com.grkj.iscs.R;
 import com.grkj.iscs.util.Utils;
 
 /**

+ 1 - 1
app/src/main/res/layout/activity_web_socket.xml

@@ -7,7 +7,7 @@
     android:background="#123456"
     tools:context=".activity.WebSocketActivity">
 
-    <com.grkj.iscs.PageControl
+    <com.grkj.iscs.widget.PageControl
         android:id="@+id/page"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content" />