diff --git a/app/src/main/java/com/shuwei/intelligent/shelves/activity/HomeActivity.kt b/app/src/main/java/com/shuwei/intelligent/shelves/activity/HomeActivity.kt index 7ab68c4..42d9670 100644 --- a/app/src/main/java/com/shuwei/intelligent/shelves/activity/HomeActivity.kt +++ b/app/src/main/java/com/shuwei/intelligent/shelves/activity/HomeActivity.kt @@ -30,12 +30,15 @@ import com.shuwei.intelligent.shelves.net.NetViewModel import com.shuwei.intelligent.shelves.net.RespData import com.shuwei.intelligent.shelves.net.UiState import com.shuwei.intelligent.shelves.serial.ProtocolConstants.C_TEMP_CMD +import com.shuwei.intelligent.shelves.serial.ProtocolConstants.FOOTER +import com.shuwei.intelligent.shelves.serial.ProtocolConstants.HEADER import com.shuwei.intelligent.shelves.serial.ProtocolConstants.LEFT_SHELF_OPEN_CMD import com.shuwei.intelligent.shelves.serial.ProtocolConstants.RIGHT_SHELF_OPEN_CMD import com.shuwei.intelligent.shelves.serial.ProtocolConstants.START_TEMP_CTRL_CMD import com.shuwei.intelligent.shelves.serial.SerialFrameParser import com.shuwei.intelligent.shelves.serial.SerialPortManager import com.shuwei.intelligent.shelves.serial.SerialProtocolHandler +import com.shuwei.intelligent.shelves.utils.GridLayoutTool import com.shuwei.intelligent.shelves.utils.IntervalExecutor import com.shuwei.intelligent.shelves.utils.ext.copyTextToClipboard import com.shuwei.intelligent.shelves.utils.ext.gone @@ -77,24 +80,25 @@ class HomeActivity : BaseActivity() { private val viewModel: NetViewModel by viewModels() // 串口协议解析器,通过回调通知本 Activity - private val serialProtocolHandler = SerialProtocolHandler(object : SerialProtocolHandler.Callback { - override fun onSendCmd(cmd: String) = sendCmd(cmd) + private val serialProtocolHandler = + SerialProtocolHandler(object : SerialProtocolHandler.Callback { + override fun onSendCmd(cmd: String) = sendCmd(cmd) - override fun onWeightUpdated(shelfNo: Int, weight: Int) { - if (shelfNo in 1..10 && list.size == 10) { - list.firstOrNull { it.deviceNo == shelfNo }?.let { model -> - model.weight = weight.toDouble() - val pos = list.indexOf(model) - shelfAdapter.notifyItemChanged(pos) - log("getWeightInfo: deviceNo=${model.deviceNo},realWeight=$weight") - EventBus.getDefault().post(SendWeightEvent(model.deviceNo, weight)) + override fun onWeightUpdated(shelfNo: Int, weight: Int) { + if (shelfNo in 1..list.size) { + list.firstOrNull { it.deviceNo == shelfNo }?.let { model -> + model.weight = weight.toDouble() + val pos = list.indexOf(model) + shelfAdapter.notifyItemChanged(pos) + log("getWeightInfo: deviceNo=${model.deviceNo},realWeight=$weight") + EventBus.getDefault().post(SendWeightEvent(model.deviceNo, weight)) + } } } - } - override fun onTempReport(logMsg: String) { - updateLeftStatus(deviceName) - log(logMsg) + override fun onTempReport(logMsg: String) { + updateLeftStatus(deviceName) + log(logMsg) // if (tipDialog == null) { // tipDialog = CommonDialog(this@HomeActivity).apply { // dialogTitle = "温馨提示" @@ -105,10 +109,10 @@ class HomeActivity : BaseActivity() { // tipDialog?.dialogContent = logMsg // tipDialog?.show() // } - } + } - override fun onLog(message: String) = log(message) - }) + override fun onLog(message: String) = log(message) + }) private val serialFrameParser = SerialFrameParser() @@ -203,6 +207,13 @@ class HomeActivity : BaseActivity() { viewModel.getShelfList(deviceId = App.deviceId) } + private val defDeviceList = listOf( + //原410货柜 + "7a991439-3a12-3ef7-809b-c0258b839473", + //原1楼餐厅货柜 + "4787e213-90ab-3e32-88e0-ac271a937751" + ) + private fun getTokenSuccess(data: RespData<*>) { log("getTokenSuccess: $data") data.data?.let { @@ -229,22 +240,14 @@ class HomeActivity : BaseActivity() { updateLeftStatus(deviceName) App.canteenId = shelfResult.placeId - val tempList = shelfResult.containerGoodsList + var tempList = shelfResult.containerGoodsList if (tempList.isNullOrEmpty()) { loadEmptyView() return } list.clear() - val leftSize = (tempList.size + 1) / 2 // 左列长度(向上取整) - val rightSize = tempList.size / 2 // 右列长度(向下取整) - repeat(rightSize) { index -> - list.add(tempList[index].also { it.deviceId = App.deviceId }) - list.add(tempList[leftSize + index].also { it.deviceId = App.deviceId }) - } - // 处理奇数长度:左列比右列多一个 - if (tempList.size % 2 != 0) { - list.add(tempList[rightSize].also { it.deviceId = App.deviceId }) - } + tempList = GridLayoutTool.initListSort(tempList) + list.addAll(tempList) shelfAdapter.notifyDataSetChanged() } @@ -285,7 +288,8 @@ class HomeActivity : BaseActivity() { if (noDataWarningDialog == null) { noDataWarningDialog = CommonDialog(this@HomeActivity).apply { dialogTitle = "设备提示" - dialogContent = "长时间未收到数据,若无法开门或秤重量不更新情况,请考虑断电重启设备" + dialogContent = + "长时间未收到数据,若无法开门或秤重量不更新情况,请考虑断电重启设备" } } if (noDataWarningDialog?.isShowing == false) { @@ -372,10 +376,11 @@ class HomeActivity : BaseActivity() { } private fun initRecyclerView() { - binding.rvShelf.run { - layoutManager = GridLayoutManager(this@HomeActivity, 2, GridLayoutManager.VERTICAL, false) - adapter = shelfAdapter - itemAnimator.let { + val layoutManager = GridLayoutTool.getLayoutManager(this@HomeActivity) ?: return + binding.rvShelf.let { + it.layoutManager = layoutManager + it.adapter = shelfAdapter + it.itemAnimator.let { if (it is DefaultItemAnimator) { it.supportsChangeAnimations = false } @@ -433,9 +438,10 @@ class HomeActivity : BaseActivity() { * 保存定时任务 */ private fun saveGoodsTask() { - saveTaskJob = taskExecutor.startIntervalTaskWithInitialDelay(1 * 60 * 1000L, 5 * 60 * 1000L) { - syncShelfGoodsToServer() - } + saveTaskJob = + taskExecutor.startIntervalTaskWithInitialDelay(1 * 60 * 1000L, 5 * 60 * 1000L) { + syncShelfGoodsToServer() + } } private var overdueTaskJob: Job? = null @@ -472,8 +478,8 @@ class HomeActivity : BaseActivity() { * 构建 ShelfBody 并提交到服务端(被定时任务与 ShelfActivity 返回共用) */ private fun syncShelfGoodsToServer() { - log("performSync: list:${list.toJsonString()}") - val submitList = list.sortedBy { it.deviceNo } + log("performSync显示list:${list.toJsonString()}") + val submitList = GridLayoutTool.submitListSort(list) submitList.forEach { if (it.goodsId.isNullOrBlank()) { it.weight = it.weightBak @@ -486,7 +492,7 @@ class HomeActivity : BaseActivity() { it.humidity = showHumidity it.goodsList = submitList } - log("performSync: body:${body.toJsonString()}") + log("performSync提交body:${body.toJsonString()}") viewModel.saveShelfGoodsList(body) } } diff --git a/app/src/main/java/com/shuwei/intelligent/shelves/base/BaseActivity.kt b/app/src/main/java/com/shuwei/intelligent/shelves/base/BaseActivity.kt index 19ec605..2d81626 100644 --- a/app/src/main/java/com/shuwei/intelligent/shelves/base/BaseActivity.kt +++ b/app/src/main/java/com/shuwei/intelligent/shelves/base/BaseActivity.kt @@ -68,7 +68,13 @@ open class BaseActivity : AppCompatActivity() { lightSwitchClick() binding.tvLeftStatus.setOnDoubleClickListener { - finish() + //finish() + val intent = Intent(Intent.ACTION_MAIN).apply { + addCategory(Intent.CATEGORY_HOME) + flags = Intent.FLAG_ACTIVITY_NEW_TASK + } + startActivity(intent) + } binding.tvRightStatus.setOnDoubleClickListener { if (enableRightStatusMenu) showRightStatusPopup(binding.tvRightStatus) @@ -99,7 +105,7 @@ open class BaseActivity : AppCompatActivity() { } fun updateLeftStatus(data: String) { - binding.tvLeftStatus.text = data + binding.tvLeftStatus.text = data.ifBlank { " " } } fun updateRightStatus(data: String) { diff --git a/app/src/main/java/com/shuwei/intelligent/shelves/serial/ProtocolConstants.kt b/app/src/main/java/com/shuwei/intelligent/shelves/serial/ProtocolConstants.kt index bf3f2a2..5b3d43a 100644 --- a/app/src/main/java/com/shuwei/intelligent/shelves/serial/ProtocolConstants.kt +++ b/app/src/main/java/com/shuwei/intelligent/shelves/serial/ProtocolConstants.kt @@ -88,8 +88,11 @@ object ProtocolConstants { // ---------------------------------------------------------------- /** 激活指令(1楼餐厅) */ - const val ACTIVE_CMD = - "${HEADER}000281C5D70A7D428B44A57454F5DACA241938938B4B9CBD73673E9C8E7FC0C4992D${FOOTER}" +// const val ACTIVE_CMD = +// "${HEADER}000281C5D70A7D428B44A57454F5DACA241938938B4B9CBD73673E9C8E7FC0C4992D${FOOTER}" + +// 410激活码 +// const val ACTIVE_CMD = "${HEADER}000281C5D70A7D42894EA17650F5D0BB516838E7863C9ABD766C38958AFF0F3C062D${FOOTER}" /** 左货架开锁指令 */ const val LEFT_SHELF_OPEN_CMD = @@ -119,4 +122,45 @@ object ProtocolConstants { /** 温控指令 */ const val TEMPERATURE_CTRL = "${HEADER}0F01040000${FOOTER}" + + /** + * 设备2列,10格 + */ + val device2Columns = listOf( + //原410货柜 + "7a991439-3a12-3ef7-809b-c0258b839473", + //原1楼餐厅货柜 + "4787e213-90ab-3e32-88e0-ac271a937751" + ) + + /** + * 设备3列,15格,左侧1列竖向编号1、2、3、4、5,右侧2列5行编号为6-7、8-9、10-11、12-13、14-15 + */ + val device3ColumnsOrder = listOf(1, 6, 7, 2, 8, 9, 3, 10, 11, 4, 12, 13, 5, 14, 15) + /** + * 设备2列,10格,左侧1列竖向编号1、2、3、4、5,右侧1列6,7,8,9,10 + */ + val device2ColumnsOrder = listOf(1, 6, 2, 7, 3, 8, 4, 9, 5, 10) + + /** + * 设备3列,15格,左侧1列竖向编号1、2、3、4、5,右侧2列5行编号为6-7、8-9、10-11、12-13、14-15 + */ + val device3Columns = listOf( + //新设备1 + "d369f9b0-1c5b-3066-ba72-988e1449cecc", + //新设备2 + "505ce1b1-facc-3eb2-855a-3dadda5ba358" + ) + + /** 激活指令map,key为设备号,value为激活码 */ + val ACTIVE_MAP = mutableMapOf( + //原410货柜 + "7a991439-3a12-3ef7-809b-c0258b839473" to "${HEADER}000281C5D70A7D42894EA17650F5D0BB516838E7863C9ABD766C38958AFF0F3C062D${FOOTER}", + //原1楼餐厅货柜 + "4787e213-90ab-3e32-88e0-ac271a937751" to "${HEADER}000281C5D70A7D428B44A57454F5DACA241938938B4B9CBD73673E9C8E7FC0C4992D${FOOTER}", + //新设备1,临时使用1楼餐厅激活码 + "d369f9b0-1c5b-3066-ba72-988e1449cecc" to "${HEADER}000281C5D70A7D428B44A57454F5DACA241938938B4B9CBD73673E9C8E7FC0C4992D${FOOTER}", + //新设备2,临时使用1楼餐厅激活码 + "505ce1b1-facc-3eb2-855a-3dadda5ba358" to "${HEADER}000281C5D70A7D428B44A57454F5DACA241938938B4B9CBD73673E9C8E7FC0C4992D${FOOTER}", + ) } diff --git a/app/src/main/java/com/shuwei/intelligent/shelves/serial/SerialProtocolHandler.kt b/app/src/main/java/com/shuwei/intelligent/shelves/serial/SerialProtocolHandler.kt index 53f5d47..e6a42a3 100644 --- a/app/src/main/java/com/shuwei/intelligent/shelves/serial/SerialProtocolHandler.kt +++ b/app/src/main/java/com/shuwei/intelligent/shelves/serial/SerialProtocolHandler.kt @@ -1,7 +1,8 @@ package com.shuwei.intelligent.shelves.serial +import com.shuwei.intelligent.shelves.App import com.shuwei.intelligent.shelves.serial.ProtocolConstants.ACTIVATE_BODY_LENGTH -import com.shuwei.intelligent.shelves.serial.ProtocolConstants.ACTIVE_CMD +import com.shuwei.intelligent.shelves.serial.ProtocolConstants.ACTIVE_MAP import com.shuwei.intelligent.shelves.serial.ProtocolConstants.BYTES_PER_WEIGHT import com.shuwei.intelligent.shelves.serial.ProtocolConstants.CMD_ACTIVATE import com.shuwei.intelligent.shelves.serial.ProtocolConstants.CMD_CARD_UPLOAD @@ -96,8 +97,9 @@ class SerialProtocolHandler(private val callback: Callback) { if (reqBody.length == ACTIVATE_BODY_LENGTH) { terminalId = reqBody.substring(2, 32) terminalVersion = reqBody.substring(32, 42) - callback.onLog("收到[激活]${cmdFlag}指令:${data},终端id:${terminalId},固件版本:${terminalVersion},发送激活命令:$ACTIVE_CMD") - callback.onSendCmd(ACTIVE_CMD) + val activeCode = ACTIVE_MAP[App.deviceId]?:"" + callback.onLog("收到[激活]${cmdFlag}指令:${data},终端id:${terminalId},固件版本:${terminalVersion},发送激活命令:$activeCode") + callback.onSendCmd(activeCode) } } diff --git a/app/src/main/java/com/shuwei/intelligent/shelves/utils/GridLayoutTool.kt b/app/src/main/java/com/shuwei/intelligent/shelves/utils/GridLayoutTool.kt new file mode 100644 index 0000000..97ab9e5 --- /dev/null +++ b/app/src/main/java/com/shuwei/intelligent/shelves/utils/GridLayoutTool.kt @@ -0,0 +1,54 @@ +package com.shuwei.intelligent.shelves.utils + +import android.content.Context +import androidx.recyclerview.widget.GridLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.shuwei.intelligent.shelves.App +import com.shuwei.intelligent.shelves.model.ShelfModel +import com.shuwei.intelligent.shelves.serial.ProtocolConstants + +object GridLayoutTool { + + /** + * 设备2列,10格 + */ + private val device2Columns = ProtocolConstants.device2Columns + + /** + * 设备3列,15格,左侧1列竖向编号1、2、3、4、5,右侧2列5行编号为6-7、8-9、10-11、12-13、14-15 + */ + private val device3Columns = ProtocolConstants.device3Columns + + fun getLayoutManager(context: Context): RecyclerView.LayoutManager? { + return if (device2Columns.contains(App.deviceId)) { + GridLayoutManager(context, 2, GridLayoutManager.VERTICAL, false) + } else if (device3Columns.contains(App.deviceId)) { + GridLayoutManager(context, 3, GridLayoutManager.VERTICAL, false) + } else { + null + } + } + + /** + * 初始化list显示顺序 + */ + fun initListSort(source: List): List { + val map = source.associateBy { it.deviceNo } + return if (device3Columns.contains(App.deviceId)) { + // 按全局定义的显示顺序取对应数据,找不到则跳过 + ProtocolConstants.device3ColumnsOrder.mapNotNull { map[it] } + } else if (device2Columns.contains(App.deviceId)) { + ProtocolConstants.device2ColumnsOrder.mapNotNull { map[it] } + } else { + source + } + } + + /** + * 提交接口list顺序 + */ + fun submitListSort(source: List): List { + return source.sortedBy { it.deviceNo } + } + +} \ No newline at end of file diff --git a/app/src/main/res/layout/activity_base.xml b/app/src/main/res/layout/activity_base.xml index 4726d73..3fcde39 100644 --- a/app/src/main/res/layout/activity_base.xml +++ b/app/src/main/res/layout/activity_base.xml @@ -23,7 +23,7 @@ android:layout_gravity="start" android:textSize="24sp" android:fontFamily="sans-serif-medium" - tools:text="1-1冷藏柜 -2°C / 87%" /> + android:text=" " />