Browse Source

refactor(更新)
- 蓝牙队列调度器新增注释
- 蓝牙模块新增断开和关机重启指令
- 硬件管理卡片编号规则调整
- 移除待办事项中无效的todoId赋值

周文健 3 months ago
parent
commit
23095b4f4d

+ 6 - 0
app/src/main/java/com/grkj/iscs/features/main/fragment/hardware_manage/CardManageFragment.kt

@@ -136,6 +136,9 @@ class CardManageFragment : BaseFragment<FragmentCardManageBinding>() {
         }
     }
 
+    /**
+     * 加载卡片
+     */
     private fun loadCards(reset: Boolean = false) {
         if (reset) viewModel.cardManageDataList.clear()
         viewModel.getCardData(viewModel.cardFilterData, !reset).observe(this) {
@@ -152,6 +155,9 @@ class CardManageFragment : BaseFragment<FragmentCardManageBinding>() {
         }
     }
 
+    /**
+     * 产出选中的卡片
+     */
     private fun deleteSelectedCards() {
         if (viewModel.cardManageDataList.none { it.isSelected }) {
             PopTip.tip(R.string.please_select_card); return

+ 0 - 4
app/src/main/java/com/grkj/iscs/features/main/viewmodel/hardware_manage/CardManageViewModel.kt

@@ -105,7 +105,6 @@ class CardManageViewModel @Inject constructor(
      */
     fun updateCard(data: UpdateCardDataVo): LiveData<Boolean> =
         liveData(Dispatchers.IO) {
-            val defaultCardCodeSize = hardwareRepository.getDefaultCardNameCount()
             val isCard = BeanUtils.copyProperties(data, IsJobCard::class.java)
             isCard?.exStatus =
                 if (data.exStatus) {
@@ -113,9 +112,6 @@ class CardManageViewModel @Inject constructor(
                 } else {
                     CommonDictDataEnum.JOB_CARD_STATUS.commonDictRes.find { it.dictLabel == "异常" }?.dictValue
                 }
-            if (isCard?.cardCode.isNullOrEmpty()) {
-                isCard?.cardCode = "CARD_${defaultCardCodeSize + 1}"
-            }
             isCard?.let {
                 hardwareRepository.updateCardInfo(it)
                 emit(true)

+ 3 - 5
data/src/main/java/com/grkj/data/logic/impl/standard/HardwareLogic.kt

@@ -214,10 +214,9 @@ class HardwareLogic @Inject constructor(
     }
 
     override fun addCardHardware(cardCode: List<String>) {
-        var defaultCardCodeSize = hardwareDao.getDefaultCardNameCount()
         val isJobCard = cardCode.mapIndexed { index, cardCode ->
             val isJobCard = IsJobCard()
-            isJobCard.cardCode = "CARD_${defaultCardCodeSize + index + 1}"
+            isJobCard.cardCode = "CARD_${index + 1}"
             isJobCard.cardNfc = cardCode
             isJobCard.exStatus =
                 CommonDictDataEnum.JOB_CARD_STATUS.commonDictRes.find { it.dictLabel == "正常" }?.dictValue
@@ -239,10 +238,9 @@ class HardwareLogic @Inject constructor(
     }
 
     override fun addRfidTokenHardware(pointRfid: List<String>) {
-        var defaultRfidTokenCodeSize = hardwareDao.getDefaultRfidTokenNameCount()
         val isRfidToken = pointRfid.mapIndexed { index, rfid ->
             val isRfidToken = IsRfidToken()
-            isRfidToken.rfidCode = "RFID_${defaultRfidTokenCodeSize + index + 1}"
+            isRfidToken.rfidCode = "RFID_${index + 1}"
             isRfidToken.rfid = rfid
             isRfidToken.status =
                 CommonDictDataEnum.RFID_TOKEN_STATUS.commonDictRes.find { it.dictLabel == "正常" }?.dictValue
@@ -253,7 +251,7 @@ class HardwareLogic @Inject constructor(
 
     override fun saveKeyInfo(keyNfc: String, keyMacAddress: String) {
         val isKey = IsKey()
-        var defaultKeyCodeSize = hardwareDao.getDefaultKeyNameCount()
+        val defaultKeyCodeSize = hardwareDao.getDefaultKeyNameCount()
         hardwareDao.getAllKeyData().size
         isKey.keyCode = "KEY_${defaultKeyCodeSize + 1}"
         isKey.keyNfc = keyNfc

+ 0 - 1
data/src/main/java/com/grkj/data/model/extension/TodoDataExtension.kt

@@ -17,7 +17,6 @@ fun TodoStepJoin.toTodoVo(sameTicketStepJoinData: List<TodoStepJoin>): TodoItemV
     val type = OperationTypeEnum.fromJoin(this, isCreator)
     val temp = this
     return TodoItemVo().apply {
-        this.todoId = temp.stepId
         this.ticketId = temp.ticketId
         this.ticketName = temp.ticketName
         this.ticketStatus = temp.ticketStatus

+ 36 - 0
ui-base/src/main/java/com/grkj/ui_base/utils/ble/BleCmdManager.kt

@@ -46,6 +46,7 @@ object BleCmdManager {
     /**
      * 获取令牌
      */
+    @SuppressLint("MissingPermission")
     fun getToken(mac: String?, callback: CustomBleWriteCallback?) {
         logger.info("$mac")
         BleConnectionManager.getBleDeviceByMac(mac)?.bleDevice?.let {
@@ -83,6 +84,7 @@ object BleCmdManager {
      *
      * @param mode 0x01:工作模式 0x02:待机模式
      */
+    @SuppressLint("MissingPermission")
     fun switchMode(mode: ByteArray, bleDevice: BleDevice, callback: CustomBleWriteCallback?) {
         BleConnectionManager.getBleDeviceByMac(bleDevice.mac)?.let {
             BleUtil.Companion.instance?.write(
@@ -108,6 +110,7 @@ object BleCmdManager {
     /**
      * 工作票下发
      */
+    @SuppressLint("MissingPermission")
     fun sendWorkTicket(
         json: String,
         idx: Int = 0,
@@ -264,6 +267,7 @@ object BleCmdManager {
     /**
      * 获取工作票完成情况
      */
+    @SuppressLint("MissingPermission")
     fun getTicketStatus(bleDevice: BleDevice, callback: CustomBleWriteCallback?) {
         BleConnectionManager.getBleDeviceByMac(bleDevice.mac)?.let {
             BleUtil.Companion.instance?.write(
@@ -345,6 +349,7 @@ object BleCmdManager {
     /**
      * 获取工作票完成情况分包
      */
+    @SuppressLint("MissingPermission")
     private fun getTicketStatusPart(
         idx: ByteArray,
         total: ByteArray,
@@ -364,6 +369,7 @@ object BleCmdManager {
     /**
      * 获取钥匙电量
      */
+    @SuppressLint("MissingPermission")
     fun getPower(mac: String?, callback: CustomBleWriteCallback?) {
         BleConnectionManager.getBleDeviceByMac(mac)?.let {
             BleUtil.Companion.instance?.write(
@@ -399,6 +405,34 @@ object BleCmdManager {
         }
     }
 
+    /**
+     * 关闭蓝牙请求
+     */
+    @SuppressLint("MissingPermission")
+    fun bleDisconnectReq(mac: String?, callback: CustomBleWriteCallback?) {
+        BleConnectionManager.getBleDeviceByMac(mac)?.let {
+            BleUtil.Companion.instance?.write(
+                it.bleDevice,
+                cmd = assembleData(it, BleConst.REQ_DISCONNECT_BLE),
+                writeCallback = callback
+            )
+        }
+    }
+
+    /**
+     * 关机或重启请求
+     */
+    @SuppressLint("MissingPermission")
+    fun shutdownOrRebootReq(mac: String?, isShutdown: Boolean = true, callback: CustomBleWriteCallback?) {
+        BleConnectionManager.getBleDeviceByMac(mac)?.let {
+            BleUtil.Companion.instance?.write(
+                it.bleDevice,
+                cmd = assembleData(it, BleConst.REQ_SHUTDOWN_OR_REBOOT+if (isShutdown) 0x02.toByte() else 0x01.toByte()),
+                writeCallback = callback
+            )
+        }
+    }
+
     /**
      * 发送文件
      * type: 1:固件文件 2:点位PNG文件
@@ -411,6 +445,7 @@ object BleCmdManager {
      * PGSZ:当前包长度(字节)
      * PGDATA:当前包数据
      */
+    @SuppressLint("MissingPermission")
     fun sendFile(
         type: Int,
         file: File,
@@ -478,6 +513,7 @@ object BleCmdManager {
     /**
      * 获取版本
      */
+    @SuppressLint("MissingPermission")
     fun getVersion(mac: String?, callback: CustomBleWriteCallback?) {
         BleConnectionManager.getBleDeviceByMac(mac)?.let {
             BleUtil.Companion.instance?.write(

+ 20 - 0
ui-base/src/main/java/com/grkj/ui_base/utils/ble/BleConst.kt

@@ -73,4 +73,24 @@ object BleConst {
 
     // 获取固件版本号响应
     val RSP_GET_VERSION = byteArrayOf(0xEE.toByte(), 0x02, 0x03, 0x01)
+
+    /**
+     * 蓝牙断开指令
+     */
+    val REQ_DISCONNECT_BLE = byteArrayOf(0x02.toByte(), 0x01, 0x01, 0xEA.toByte())
+
+    /**
+     * 蓝牙断开回复
+     */
+    val RES_DISCONNECT_BLE = byteArrayOf(0x02.toByte(), 0x02, 0x02, 0xEA.toByte())
+
+    /**
+     * 关机或重启指令
+     */
+    val REQ_SHUTDOWN_OR_REBOOT = byteArrayOf(0x02.toByte(), 0x01, 0x02, 0xEE.toByte())
+
+    /**
+     * 关机回复
+     */
+    val RES_SHUTDOWN_OR_REBOOT = byteArrayOf(0x02.toByte(), 0x02, 0x03, 0xEE.toByte())
 }

+ 58 - 6
ui-base/src/main/java/com/grkj/ui_base/utils/ble/BleQueueDispatcher.kt

@@ -14,17 +14,42 @@ import kotlinx.coroutines.delay
 import kotlinx.coroutines.launch
 import org.slf4j.Logger
 import org.slf4j.LoggerFactory
-import kotlin.math.log
 
+/**
+ * 蓝牙队列调度器
+ */
 abstract class BleQueueDispatcher {
     private val logger: Logger = LoggerFactory.getLogger(BleQueueDispatcher::class.java)
+
+    /**
+     * 任务队列
+     */
     private val taskQueue =
         ArrayDeque<Pair<String, MutableList<(Boolean) -> Unit>>>() // mac + callback
+
+    /**
+     * 正在连接的设备
+     */
     private val activeMacs = mutableMapOf<String, MutableList<(Boolean) -> Unit>>()
+
+    /**
+     * 已连接的设备
+     */
     private val connectedMacs = mutableSetOf<String>()
+
+    /**
+     * 断连计划
+     */
     private val pendingDisconnectJobs = mutableMapOf<String, Job>()
 
+    /**
+     * 最大连接数
+     */
     open val maxConnections: Int = 1
+
+    /**
+     * 调度器
+     */
     private val dispatcherScope = CoroutineScope(Dispatchers.IO + SupervisorJob())
 
     /**
@@ -77,8 +102,14 @@ abstract class BleQueueDispatcher {
         }
     }
 
+    /**
+     * 连接
+     */
     protected abstract fun doConnect(mac: String, callback: (Boolean) -> Unit)
 
+    /**
+     * 移除设备
+     */
     @Synchronized
     fun clear(mac: String) {
         taskQueue.removeIf { it.first == mac }
@@ -87,6 +118,9 @@ abstract class BleQueueDispatcher {
         pendingDisconnectJobs.remove(mac)?.cancel()
     }
 
+    /**
+     * 计划断连
+     */
     @SuppressLint("MissingPermission")
     @Synchronized
     fun scheduleDisconnect(mac: String, delayMillis: Long = 0) {
@@ -115,6 +149,9 @@ abstract class BleQueueDispatcher {
         pendingDisconnectJobs[mac] = job
     }
 
+    /**
+     * 断开设备连接
+     */
     @RequiresPermission(Manifest.permission.BLUETOOTH_CONNECT)
     private fun disconnectDeviceByMac(mac: String) {
         val device = BleManager.getAllConnectedDevice().find { it.mac == mac }
@@ -123,6 +160,9 @@ abstract class BleQueueDispatcher {
         }
     }
 
+    /**
+     * 断开所有连接
+     */
     @Synchronized
     fun disconnectAll(delayMillis: Long = 0) {
         val allMacs = connectedMacs.toList()
@@ -131,17 +171,29 @@ abstract class BleQueueDispatcher {
         }
     }
 
-
+    /**
+     * 是否连接中
+     */
     fun isConnecting(mac: String): Boolean = activeMacs.containsKey(mac)
-    fun isQueued(mac: String): Boolean = taskQueue.any { it.first == mac }
-    fun isConnected(mac: String): Boolean = connectedMacs.contains(mac)
 
-    fun getConnectedMacs(): List<String> = connectedMacs.toList()
+    /**
+     * 是否队列中
+     */
+    fun isQueued(mac: String): Boolean = taskQueue.any { it.first == mac }
 
-    fun getActiveMacs(): List<String> = activeMacs.keys.toList()
+    /**
+     * 是否已连接
+     */
+    fun isConnected(mac: String): Boolean = connectedMacs.contains(mac)
 
+    /**
+     * 是否可以连接
+     */
     fun canConnect(): Boolean = (activeMacs.size + connectedMacs.size) <= maxConnections
 
+    /**
+     * 是否可以断连
+     */
     fun shouldDisconnect(mac: String): Boolean =
         isConnecting(mac) || isQueued(mac) || isConnected(mac)
 }