From b7ee99a71e88a08a09fe9daada6675a175d09be1 Mon Sep 17 00:00:00 2001
From: zhuguifei <zhuguifei@zhuguifeideiMac.local>
Date: 星期三, 14 一月 2026 10:35:27 +0800
Subject: [PATCH] 部分优化
---
app/src/main/java/com/shlb/comb/fragment/SettingsFragment.java | 475 +++++++++++++++++++++++++++++++++++++++++++++++++---------
1 files changed, 397 insertions(+), 78 deletions(-)
diff --git a/app/src/main/java/com/shlb/comb/fragment/SettingsFragment.java b/app/src/main/java/com/shlb/comb/fragment/SettingsFragment.java
index 2702ac4..4ff3346 100644
--- a/app/src/main/java/com/shlb/comb/fragment/SettingsFragment.java
+++ b/app/src/main/java/com/shlb/comb/fragment/SettingsFragment.java
@@ -1,5 +1,6 @@
package com.shlb.comb.fragment;
+import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
@@ -34,32 +35,50 @@
import android.text.Html;
import android.content.DialogInterface;
+/**
+ * 璁剧疆鐣岄潰 Fragment
+ * <p>
+ * 璇ョ被璐熻矗璁惧鍙傛暟鐨勯厤缃�佽澶囩姸鎬佺殑鐩戞帶浠ュ強钃濈墮閫氫俊鐨勫鐞嗭細
+ * 1. 鏀寔绔欏彿銆佸眰鏁般�佹尝鐗圭巼绛夊弬鏁扮殑璇诲彇鍜屽啓鍏�
+ * 2. 瀹炴椂鐩戞帶璁惧鍦ㄧ嚎鐘舵�佸拰鐜荤拑鏈夋棤鎯呭喌
+ * 3. 鎻愪緵钃濈墮杩炴帴鐘舵�佺殑鏄剧ず鍜屽鐞�
+ * 4. 瀹炵幇鏃ュ織璁板綍鍜屾樉绀哄姛鑳�
+ * 5. 鏀寔鍛ㄦ湡鎬ф暟鎹鍙栵紙姣�1绉掞級锛岄伩鍏嶉绻佹棩蹇楀鑷撮〉闈㈠崱椤�
+ * </p>
+ */
public class SettingsFragment extends Fragment {
- private RecyclerView rvGrid;
- private EditText etLayer;
- private EditText etStation;
- private Spinner spinnerBaud;
- private QMUIRoundButton btnWriteAll;
- private QMUIRoundButton btnReadData;
- private QMUIRoundButton btnReadParam;
- private QMUIRoundButton btnClearLog;
- private TextView tvStatus;
- private TextView tvLog;
- private TextView tvLayerStatus;
- private TextView tvStationStatus;
- private TextView tvBaudStatus;
- private android.widget.ScrollView svLog;
-
- private QMUITipDialog mLoadingDialog;
-
- private GridAdapter mAdapter;
- private List<BoxStatus> boxStatusList = new ArrayList<>();
- private StringBuilder logBuilder = new StringBuilder();
+ // 鐢ㄦ埛鐣岄潰缁勪欢
+ private RecyclerView rvGrid; // 璁惧鐘舵�佺綉鏍艰鍥�
+ private TextView etLayer; // 灞傛暟鏄剧ず鏂囨湰妗�
+ private EditText etStation; // 绔欏彿杈撳叆妗�
+ private Spinner spinnerBaud; // 娉㈢壒鐜囬�夋嫨鍣�
+ private QMUIRoundButton btnWriteAll; // 鍐欏叆鎵�鏈夊弬鏁版寜閽�
+ private QMUIRoundButton btnReadParam; // 璇诲彇鍙傛暟鎸夐挳
+ private QMUIRoundButton btnClearLog; // 娓呴櫎鏃ュ織鎸夐挳
+ private TextView tvMonitorTitle; // 鐩戞帶璇︽儏鏍囬
+ private TextView tvMonitorUpdateTime; // 鐩戞帶鏁版嵁鏇存柊鏃堕棿
+ private TextView tvStatus; // 鐘舵�佹樉绀烘枃鏈�
+ private TextView tvLog; // 鏃ュ織鏄剧ず鏂囨湰
+ private TextView tvLayerStatus; // 灞傛暟鐘舵�佹爣绛�
+ private TextView tvStationStatus; // 绔欏彿鐘舵�佹爣绛�
+ private TextView tvBaudStatus; // 娉㈢壒鐜囩姸鎬佹爣绛�
- private java.util.Queue<String> cmdQueue = new java.util.LinkedList<>();
+ private android.widget.ScrollView svLog; // 鏃ュ織婊氬姩瑙嗗浘
+ private androidx.cardview.widget.CardView cvLog; // 鏃ュ織瀹瑰櫒
+
+ private QMUITipDialog mLoadingDialog; // 鍔犺浇瀵硅瘽妗�
+
+ private GridAdapter mAdapter; // 缃戞牸閫傞厤鍣�
+ private List<BoxStatus> boxStatusList = new ArrayList<>(); // 璁惧鐘舵�佸垪琛�
+ private StringBuilder logBuilder = new StringBuilder(); // 鏃ュ織鍐呭鏋勫缓鍣�
+
+ private java.util.Queue<String> cmdQueue = new java.util.LinkedList<>(); // 鎸囦护闃熷垪锛岀敤浜庢寜椤哄簭鎵ц鎸囦护
private String currentExecutingCmd = ""; // 褰撳墠姝e湪鎵ц鐨勬寚浠わ紝鐢ㄤ簬鏍¢獙鍝嶅簲
-
+ private boolean isPeriodicRead = false; // 鏍囪鏄惁涓哄懆鏈熸�ц鍙栵紝鐢ㄤ簬鎺у埗鏃ュ織璁板綍
+ private boolean isFirstLoad = true; // 鏍囪鏄惁涓洪娆″姞杞斤紝閬垮厤閲嶅瑙﹀彂璇诲彇鍙傛暟
+ private View currentOperatingButton; // 褰撳墠姝e湪鎿嶄綔鐨勬寜閽�
+
private static class BoxStatus {
int id;
boolean isOnline;
@@ -72,30 +91,61 @@
}
}
- private Runnable autoReadRunnable = new Runnable() {
+ // 鍛ㄦ湡鎬ц鍙栨暟鎹浉鍏冲彉閲�
+ private android.os.Handler periodicReadHandler = new android.os.Handler(); // 鐢ㄤ簬澶勭悊鍛ㄦ湡鎬ц鍙栦换鍔$殑Handler
+ private static final long PERIODIC_READ_INTERVAL = 500; // 鍛ㄦ湡鎬ц鍙栭棿闅旓紙姣锛夛細1绉�
+
+ private Runnable periodicReadRunnable = new Runnable() {
+ @Override
+ public void run() {
+ // 姣�1绉掕鍙栦竴娆℃暟鎹紝涓嶈褰曟棩蹇�
+ if (BleGlobalManager.getInstance().isConnected()) {
+ periodicReadData();
+
+ // 缁х画瀹夋帓涓嬩竴娆¤鍙�
+ periodicReadHandler.postDelayed(this, PERIODIC_READ_INTERVAL);
+ }
+ }
+ };
+
+ // 鑷姩璇诲彇鍙傛暟鐩稿叧鍙橀噺
+ private Runnable autoReadRunnable = new Runnable() { // 钃濈墮杩炴帴鎴愬姛鍚庤嚜鍔ㄨ鍙栧弬鏁扮殑浠诲姟
@Override
public void run() {
// 钃濈墮杩炴帴鎴愬姛鍚� 鑷姩瑙﹀彂鐩戞帶璇︽儏鐨� 璇诲彇鏁版嵁 鍜� 鍙傛暟璁惧畾杩欓噷鐨� 璇诲彇鍙傛暟
if (BleGlobalManager.getInstance().isConnected()) {
showLoading("姝e湪鍚屾鏁版嵁...");
- if (btnReadData != null) btnReadData.performClick();
-
+ // 鍏堣Е鍙戣鍙栨暟鎹�
+ tvStatus.setText("鐘舵�侊細姝e湪璇诲彇鏁版嵁...");
+ if (tvMonitorTitle != null) tvMonitorTitle.performClick();
+
+
new android.os.Handler().postDelayed(() -> {
+ // 鍐嶈Е鍙戣鍙栧弬鏁�
if (btnReadParam != null) btnReadParam.performClick();
// 鍋囪鍙傛暟璇诲彇瑙﹀彂鍚� 1.5绉� 鍏抽棴 loading锛屾垨鑰呭湪瑙f瀽瀹屾墍鏈夊弬鏁板悗鍏抽棴
// 杩欓噷绠�鍗曞鐞嗭紝寤舵椂鍏抽棴
new android.os.Handler().postDelayed(() -> {
dismissLoading();
+ // 鍒濆璁剧疆瀹屾垚鍚庡惎鍔ㄥ懆鏈熸�ц鍙�
+ startPeriodicRead(PERIODIC_READ_INTERVAL);
+ isFirstLoad = false; // 棣栨鍔犺浇瀹屾垚
}, 1500);
}, 1000); // 闂撮殧1绉掞紝閬垮厤鎸囦护鍐茬獊
}
}
};
- private android.os.Handler debounceHandler = new android.os.Handler();
- private static final long DEBOUNCE_DELAY_MS = 1500; // 1.5 seconds debounce
+ private android.os.Handler debounceHandler = new android.os.Handler(); // 鐢ㄤ簬闃叉姈澶勭悊鐨凥andler
+ private static final long DEBOUNCE_DELAY_MS = 1500; // 闃叉姈寤惰繜鏃堕棿锛堟绉掞級锛�1.5绉�
+/**
+ * Fragment 鍙鏃惰皟鐢�
+ * <p>
+ * 娉ㄥ唽 EventBus 骞舵洿鏂拌摑鐗欒繛鎺ョ姸鎬�
+ * </p>
+ */
@Override
public void onStart() {
super.onStart();
@@ -105,11 +155,70 @@
updateConnectionStatus();
}
+/**
+ * Fragment 涓嶅彲瑙佹椂璋冪敤
+ * <p>
+ * 鍙栨秷娉ㄥ唽 EventBus锛岄伩鍏嶅唴瀛樻硠婕�
+ * </p>
+ */
@Override
public void onStop() {
super.onStop();
if (EventBus.getDefault().isRegistered(this)) {
EventBus.getDefault().unregister(this);
+ }
+ }
+
+/**
+ * Fragment 鎭㈠鍙鏃惰皟鐢�
+ * \u003cp\u003e
+ * 濡傛灉钃濈墮宸茶繛鎺ワ紝鎭㈠鍛ㄦ湡鎬ц鍙栨暟鎹�
+ * \u003c/p\u003e
+ */
+ @Override
+ public void onResume() {
+ super.onResume();
+ // 鏍规嵁绯荤粺璁剧疆鎺у埗鏃ュ織鏄剧ず
+ boolean isCmdLogEnabled = com.blankj.utilcode.util.SPUtils.getInstance().getBoolean("cmd_log_enabled", false);
+ if (cvLog != null) {
+ cvLog.setVisibility(isCmdLogEnabled ? View.VISIBLE : View.GONE);
+ }
+
+ // 濡傛灉钃濈墮宸茶繛鎺ワ紝鎭㈠鍛ㄦ湡鎬ц鍙�
+ if (BleGlobalManager.getInstance().isConnected()) {
+ // 鍙湁褰撲笉鏄娆″姞杞斤紙鍗充粠鍏朵粬椤甸潰杩斿洖锛夋椂鎵嶆墜鍔ㄨЕ鍙戣鍙栧弬鏁�
+ // 棣栨鍔犺浇浼氳蛋 autoReadRunnable
+ if (!isFirstLoad && btnReadParam != null) {
+ btnReadParam.performClick();
+ }
+ startPeriodicRead(3000);
+ }
+ }
+
+/**
+ * Fragment 鏆傚仠鏃惰皟鐢�
+ * \u003cp\u003e
+ * 鍋滄鍛ㄦ湡鎬ц鍙栨暟鎹紝鑺傜渷璧勬簮
+ * \u003c/p\u003e
+ */
+ @Override
+ public void onPause() {
+ super.onPause();
+ // 绂诲紑椤甸潰鏃跺仠姝㈠懆鏈熸�ц鍙�
+ stopPeriodicRead();
+ }
+
+ @Override
+ public void onDestroyView() {
+ super.onDestroyView();
+ // 娓呯悊鎵�鏈� Handler 鍥炶皟锛岄伩鍏嶅唴瀛樻硠婕�
+ stopPeriodicRead();
+ debounceHandler.removeCallbacks(autoReadRunnable);
+
+ // 娓呯悊鍔犺浇瀵硅瘽妗�
+ if (mLoadingDialog != null) {
+ mLoadingDialog.dismiss();
+ mLoadingDialog = null;
}
}
@@ -121,40 +230,66 @@
}
}
+/**
+ * 浜嬩欢鎬荤嚎鐩戝惉鍣�
+ * <p>
+ * 澶勭悊钃濈墮杩炴帴鐘舵�佸彉鍖栧拰璁惧鏁版嵁鎺ユ敹浜嬩欢
+ * </p>
+ * @param event 浜嬩欢瀵硅薄
+ */
@Subscribe(threadMode = ThreadMode.MAIN)
public void onEventRefresh(UpdateEvent event) {
if (event.getType() == UpdateEvent.Type.CONN_STATU) {
- // Check if obj is integer
+ // 妫�鏌bj鏄惁涓烘暣鏁�
if (event.getObj() instanceof Integer) {
int status = (int) event.getObj();
if (status == BluetoothProfile.STATE_CONNECTED) {
tvStatus.setText("鐘舵�侊細宸茶繛鎺�");
Toast.makeText(getContext(), "钃濈墮宸茶繛鎺�", Toast.LENGTH_SHORT).show();
-
+
// 钃濈墮杩炴帴鎴愬姛鍚� 鑷姩瑙﹀彂
triggerAutoRead();
} else {
tvStatus.setText("鐘舵�侊細宸叉柇寮�");
+ // 钃濈墮鏂紑鏃跺仠姝㈠懆鏈熸�ц鍙�
+ stopPeriodicRead();
}
}
} else if (event.getType() == UpdateEvent.Type.DEVICE_INFO) {
- // Received data
+ // 鏀跺埌鏁版嵁
String hex = event.getMsg();
- tvStatus.setText("鏀跺埌鏁版嵁: " + hex);
- appendLog(hex, false); // false for received (Green)
+ if (tvStatus != null && !isPeriodicRead) {
+ tvStatus.setText("鏀跺埌鏁版嵁: " + hex);
+ }
+
+ // 妫�鏌ユ槸鍚︿负鍛ㄦ湡鎬ц鍙�
+ if (!isPeriodicRead) {
+ appendLog(hex, false); // false琛ㄧず鎺ユ敹鐨勬暟鎹紙缁胯壊锛�
+ }
+
parseAndRefresh(hex);
+
+ // 鏃犺鏄惁涓哄懆鏈熸�ц鍙栵紝澶勭悊瀹屾垚鍚庨兘閲嶇疆鏍囪
+ isPeriodicRead = false;
}
}
+/**
+ * 瑙f瀽骞跺埛鏂版暟鎹�
+ * <p>
+ * 鏍规嵁鎸囦护绫诲瀷鍒嗗彂鍒颁笉鍚岀殑瑙f瀽鏂规硶
+ * </p>
+ * @param hex 鍗佸叚杩涘埗鏍煎紡鐨勫師濮嬫暟鎹�
+ */
private void parseAndRefresh(String hex) {
if (hex == null) return;
- // 鏍规嵁CMD鍓�8浣嶅垽鏂寚浠ょ被鍨�
+ // 鏍规嵁鎸囦护鍓�8浣嶅垽鏂寚浠ょ被鍨�
if (hex.length() >= 8) {
// 鍙傛暟璇诲彇杩斿洖 (闀垮害鑷冲皯12浣�)
- // 璇诲眰鏁�: A55A0308...
- // 璇荤珯鍙�: A55A0304...
- // 璇绘尝鐗圭巼: A55A0305...
+ // 璇诲眰鏁版寚浠�: A55A0308...
+ // 璇荤珯鍙锋寚浠�: A55A0304...
+ // 璇绘尝鐗圭巼鎸囦护: A55A0305...
if (hex.length() >= 12 && (
hex.startsWith(CMD.READ_FLOORS.substring(0, 8)) ||
hex.startsWith(CMD.READ_STATION_NUM.substring(0, 8)) ||
@@ -164,14 +299,14 @@
}
// 鏁版嵁璇诲彇杩斿洖 (闀垮害鑷冲皯32浣�)
- // 璇绘暟鎹�: A55A0301...
+ // 璇绘暟鎹寚浠�: A55A0301...
if (hex.length() >= 32 && hex.startsWith(CMD.READ_DATA.substring(0, 8))) {
parseDataResponse(hex);
return;
}
}
- // 鍐欏叆鎸囦护鐨勮繑鍥� (A55A06寮�澶�)
+ // 鍐欏叆鎸囦护鐨勮繑鍥� (浠55A06寮�澶�)
if (hex.startsWith("A55A06") && hex.length() >= 12) {
parseWriteResponse(hex);
return;
@@ -208,11 +343,18 @@
}
setLabelStatus(tvBaudStatus, "(璇诲彇鍊�)", R.color.base_color);
appendLog("璇诲彇娉㈢壒鐜�: " + value);
+
+ // 璇诲彇缁撴潫锛屾仮澶嶆寜閽姸鎬�
+ restoreCurrentButton();
} else if ("08".equals(cmdType)) {
// 灞傛暟
- if (etLayer != null) etLayer.setText(String.valueOf(value));
+ if (etLayer != null) {
+ etLayer.setText(String.valueOf(value));
+ etLayer.setTextColor(0xFF333333);
+ }
setLabelStatus(tvLayerStatus, "(璇诲彇鍊�)", R.color.base_color);
appendLog("璇诲彇灞傛暟: " + value);
+ com.blankj.utilcode.util.SPUtils.getInstance().put("layer_count", value);
}
} catch (Exception e) {
e.printStackTrace();
@@ -259,6 +401,7 @@
cmdQueue.clear();
currentExecutingCmd = "";
tvStatus.setText("鍐欏叆澶辫触");
+ restoreCurrentButton(); // 鎭㈠鎸夐挳
if (currentExecutingCmd.startsWith(CMD.WRITE_STATION_NUM)) {
setLabelStatus(tvStationStatus, "(鍐欏叆澶辫触)", R.color.orange);
@@ -278,6 +421,7 @@
// 寮傚父涔熻涓哄け璐�
setLabelStatus(tvStationStatus, "(鍐欏叆澶辫触)", R.color.orange);
setLabelStatus(tvBaudStatus, "(鍐欏叆澶辫触)", R.color.orange);
+ restoreCurrentButton(); // 寮傚父鎭㈠鎸夐挳
}
}
@@ -303,25 +447,38 @@
currentExecutingCmd = "";
tvStatus.setText("鍙傛暟鍐欏叆瀹屾垚");
Toast.makeText(getContext(), "鍙傛暟鍐欏叆鎴愬姛", Toast.LENGTH_SHORT).show();
+ restoreCurrentButton(); // 鍏ㄩ儴瀹屾垚锛屾仮澶嶆寜閽�
}
}
/**
* 瑙f瀽鐩戞帶鏁版嵁杩斿洖 (鏄惁鏈夌幓鐠冦�佸湪绾跨姸鎬�)
*/
+/**
+ * 瑙f瀽鐩戞帶鏁版嵁杩斿洖
+ * <p>
+ * 瑙f瀽璁惧鍦ㄧ嚎鐘舵�佸拰鐜荤拑鏈夋棤鎯呭喌
+ * </p>
+ * @param hex 鍗佸叚杩涘埗鏍煎紡鐨勫師濮嬫暟鎹�
+ */
private void parseDataResponse(String hex) {
try {
// 瑙f瀽鏄惁鏈夌幓鐠�: 绗�11-18浣� (8涓瓧绗� = 32浣�)
// 绱㈠紩 10-17
String glassHex = hex.substring(10, 18);
- appendLog("瑙f瀽鐜荤拑鏁版嵁: " + glassHex);
+ if(!isPeriodicRead){
+ appendLog("瑙f瀽鐜荤拑鏁版嵁: " + glassHex);
+ }
+
- // 鐩存帴瑙f瀽 hex 涓� long (Big Endian)
- // "00000004" -> 4 -> ...00100 -> Bit 2 -> Box 3
+ // 鐩存帴灏嗗崄鍏繘鍒惰В鏋愪负闀挎暣鍨� (澶х搴�)
+ // "00000004" -> 4 -> ...00100 -> 绗�2浣� -> 绗�3涓牸瀛�
long glassBits = Long.parseLong(glassHex, 16);
String onlineHex = hex.substring(18, 26);
+ if(!isPeriodicRead){
appendLog("瑙f瀽鍦ㄧ嚎鏁版嵁: " + onlineHex);
+ }
long onlineBits = Long.parseLong(onlineHex, 16);
// 鏇存柊30涓牸瀛愮殑鐘舵��
@@ -337,6 +494,12 @@
// 鍒锋柊鍒楄〃鏄剧ず
if (mAdapter != null) {
mAdapter.notifyDataSetChanged();
+ }
+
+ // 鏇存柊鐩戞帶鏁版嵁鎺ユ敹鏃堕棿
+ if (tvMonitorUpdateTime != null) {
+ String currentTime = com.blankj.utilcode.util.TimeUtils.getNowString(new java.text.SimpleDateFormat("HH:mm:ss"));
+ tvMonitorUpdateTime.setText(currentTime);
}
} catch (Exception e) {
@@ -358,7 +521,7 @@
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
- // Initialize box status list
+ // 鍒濆鍖栬澶囩姸鎬佸垪琛�
boxStatusList.clear();
for (int i = 1; i <= 30; i++) {
boxStatusList.add(new BoxStatus(i));
@@ -378,6 +541,82 @@
debounceHandler.postDelayed(autoReadRunnable, DEBOUNCE_DELAY_MS);
}
+ private void startPeriodicRead(long delay) {
+ // 鍏堝仠姝㈠彲鑳藉瓨鍦ㄧ殑浠诲姟锛岄伩鍏嶉噸澶嶅惎鍔�
+ stopPeriodicRead();
+
+ // 鍚姩鍛ㄦ湡鎬ц鍙�
+ periodicReadHandler.postDelayed(periodicReadRunnable, delay);
+ }
+
+ private void stopPeriodicRead() {
+ periodicReadHandler.removeCallbacks(periodicReadRunnable);
+ }
+
+ /**
+ * 涓撻棬鐢ㄤ簬鍛ㄦ湡鎬ц鍙栨暟鎹殑鏂规硶锛屼笉璁板綍鏃ュ織
+ */
+/**
+ * 鍛ㄦ湡鎬ц鍙栨暟鎹紙姣�1绉掞級
+ * <p>
+ * 涓撻棬鐢ㄤ簬鍛ㄦ湡鎬ц鍙栨暟鎹紝涓嶈褰曟棩蹇椾互閬垮厤椤甸潰鍗¢】
+ * </p>
+ */
+ private void periodicReadData() {
+ try {
+ if (BleGlobalManager.getInstance() != null && BleGlobalManager.getInstance().isConnected()) {
+ if (tvStatus != null && isPeriodicRead) {
+ tvStatus.setText("鐘舵�侊細姝e湪璇诲彇鏁版嵁...");
+ }
+ // 璁剧疆鍛ㄦ湡鎬ц鍙栨爣璁�
+ isPeriodicRead = true;
+ // 鐩存帴鍙戦�佸懡浠わ紝涓嶈褰曟棩蹇�
+ sendCmdWithCrcNoLog(CMD.READ_DATA);
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ // 寮傚父涔熶笉璁板綍鏃ュ織锛岄伩鍏嶅崱椤�
+ // 纭繚鏍囪琚噸缃�
+ isPeriodicRead = false;
+ }
+ }
+
+ /**
+ * 鍙戦�佸懡浠や絾涓嶈褰曟棩蹇楋紙鐢ㄤ簬鍛ㄦ湡鎬ц鍙栵級
+ */
+/**
+ * 鍙戦�佸甫 CRC 鏍¢獙鐨勬寚浠わ紙涓嶈褰曟棩蹇楋級
+ * <p>
+ * 涓撻棬鐢ㄤ簬鍛ㄦ湡鎬ц鍙栨暟鎹紝閬垮厤棰戠箒璁板綍鏃ュ織瀵艰嚧椤甸潰鍗¢】
+ * </p>
+ * @param cmd 鍗佸叚杩涘埗鏍煎紡鐨勬寚浠ゅ唴瀹�
+ */
+ private void sendCmdWithCrcNoLog(String cmd) {
+ if (!BleGlobalManager.getInstance().isConnected()) {
+ return; // 闈欓粯杩斿洖锛屼笉鏄剧ず Toast 鎴栨棩蹇�
+ }
+
+ byte[] cmdBytes = BleGlobalManager.hexStringToBytes(cmd);
+ if (cmdBytes != null) {
+ String crc = CRCutil.getCRC(cmdBytes);
+ // 纭繚CRC涓�4涓瓧绗︼紝涓嶈冻鍒欒ˉ闆�
+ while (crc.length() < 4) {
+ crc = "0" + crc;
+ }
+ String fullCmd = cmd + crc.toUpperCase();
+
+ // 涓嶈褰曟棩蹇楋紝鐩存帴鍙戦�佸懡浠�
+ BleGlobalManager.getInstance().sendCmd(fullCmd);
+ }
+ }
+
+/**
+ * 鏄剧ず鍔犺浇瀵硅瘽妗�
+ * <p>
+ * 鐢ㄤ簬鎿嶄綔杩囩▼涓殑绛夊緟鎻愮ず
+ * </p>
+ * @param msg 鍔犺浇鎻愮ず淇℃伅
+ */
private void showLoading(String msg) {
if (mLoadingDialog != null && mLoadingDialog.isShowing()) {
mLoadingDialog.dismiss();
@@ -386,25 +625,36 @@
.setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING)
.setTipWord(msg)
.create();
- // 鍏佽鐐瑰嚮澶栭儴鎴栬繑鍥為敭鍙栨秷 loading锛堝彧鏄叧闂� dialog锛�
+ // 鍏佽鐐瑰嚮澶栭儴鎴栬繑鍥為敭鍙栨秷鍔犺浇锛堜粎鍏抽棴瀵硅瘽妗嗭級
mLoadingDialog.setCancelable(true);
mLoadingDialog.setCanceledOnTouchOutside(true);
mLoadingDialog.show();
}
+/**
+ * 鍏抽棴鍔犺浇瀵硅瘽妗�
+ */
private void dismissLoading() {
if (mLoadingDialog != null && mLoadingDialog.isShowing()) {
mLoadingDialog.dismiss();
}
}
+/**
+ * 鍒濆鍖栫晫闈㈢粍浠�
+ * <p>
+ * 璁剧疆鍚勪釜UI缁勪欢鐨勫紩鐢ㄥ拰鐩戝惉鍣�
+ * </p>
+ * @param view Fragment 鐨勬牴瑙嗗浘
+ */
private void initView(View view) {
rvGrid = view.findViewById(R.id.rv_grid);
etLayer = view.findViewById(R.id.et_layer);
etStation = view.findViewById(R.id.et_station);
spinnerBaud = view.findViewById(R.id.spinner_baud);
btnWriteAll = view.findViewById(R.id.btn_write_all);
- btnReadData = view.findViewById(R.id.btn_read_data);
+ tvMonitorTitle = view.findViewById(R.id.tv_monitor_title);
+ tvMonitorUpdateTime = view.findViewById(R.id.tv_monitor_update_time);
btnReadParam = view.findViewById(R.id.btn_read_param);
btnClearLog = view.findViewById(R.id.btn_clear_log);
tvStatus = view.findViewById(R.id.tv_status);
@@ -412,7 +662,9 @@
svLog = view.findViewById(R.id.sv_log);
tvLayerStatus = view.findViewById(R.id.tv_layer_status);
tvStationStatus = view.findViewById(R.id.tv_station_status);
+
tvBaudStatus = view.findViewById(R.id.tv_baud_status);
+ cvLog = view.findViewById(R.id.cv_log);
// 瑙e喅鏃ュ織鍖哄煙婊戝姩鍐茬獊
svLog.setOnTouchListener((v, event) -> {
@@ -423,7 +675,7 @@
return false;
});
- // Restore logs if any
+ // 鎭㈠鏃ュ織锛堝鏋滄湁锛�
if (logBuilder.length() > 0) {
tvLog.setText(Html.fromHtml(logBuilder.toString()));
} else {
@@ -431,21 +683,25 @@
tvLog.setText(Html.fromHtml(logBuilder.toString()));
}
- // Grid Setup
- // 10 columns to match the image (10 boxes per row)
- // Since we are in a horizontal scroll view, this will layout correctly
+ // 缃戞牸甯冨眬璁剧疆
+ // 姣忚10涓牸瀛�
+ // 鐢变簬鍦ㄦ按骞虫粴鍔ㄨ鍥句腑锛屽竷灞�浼氳嚜鍔ㄨ皟鏁�
rvGrid.setLayoutManager(new GridLayoutManager(getContext(), 10));
mAdapter = new GridAdapter();
rvGrid.setAdapter(mAdapter);
- // Spinner Setup
+ // 娉㈢壒鐜囬�夋嫨鍣ㄨ缃�
String[] baudRates = new String[]{"156Kbps", "625Kbps", "2.5Mbps", "5Mbps", "10Mbps"};
ArrayAdapter<String> spinnerAdapter = new ArrayAdapter<>(getContext(), android.R.layout.simple_spinner_item, baudRates);
spinnerAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinnerBaud.setAdapter(spinnerAdapter);
- spinnerBaud.setSelection(0); // Select 156Kbps by default
+ spinnerBaud.setSelection(0); // 榛樿閫夋嫨156Kbps
- // Button Listeners
+ tvMonitorTitle.setOnClickListener(v -> {
+ onMonitorTitleClick();
+ });
+
+ // 鎸夐挳鐩戝惉鍣ㄨ缃�
btnWriteAll.setOnClickListener(v -> {
if (!BleGlobalManager.getInstance().isConnected()) {
Toast.makeText(getContext(), "璇峰厛杩炴帴钃濈墮", Toast.LENGTH_SHORT).show();
@@ -470,6 +726,9 @@
return;
}
+ currentOperatingButton = btnWriteAll;
+ updateButtonState(currentOperatingButton, false); // Disable buttons, gray out write button
+
// 鏋勯�犳寚浠ら槦鍒�
cmdQueue.clear();
@@ -493,26 +752,19 @@
processNextCmd();
});
- btnReadData.setOnClickListener(v -> {
- if (BleGlobalManager.getInstance().isConnected()) {
- tvStatus.setText("鐘舵�侊細姝e湪璇诲彇鏁版嵁...");
- sendCmdWithCrc(CMD.READ_DATA);
- } else {
- Toast.makeText(getContext(), "璇峰厛杩炴帴钃濈墮", Toast.LENGTH_SHORT).show();
- appendLog("閿欒: 钃濈墮鏈繛鎺�");
- }
- });
btnReadParam.setOnClickListener(v -> {
if (BleGlobalManager.getInstance().isConnected()) {
+ currentOperatingButton = btnReadParam;
+ updateButtonState(currentOperatingButton, false); // Disable buttons, gray out read button
tvStatus.setText("鐘舵�侊細姝e湪璇诲彇鍙傛暟...");
sendCmdWithCrc(CMD.READ_FLOORS);
new android.os.Handler().postDelayed(() -> {
sendCmdWithCrc(CMD.READ_STATION_NUM);
- }, 200);
+ }, 500);
new android.os.Handler().postDelayed(() -> {
sendCmdWithCrc(CMD.READ_BAUD_RATE);
- }, 400);
+ }, 1000);
} else {
Toast.makeText(getContext(), "璇峰厛杩炴帴钃濈墮", Toast.LENGTH_SHORT).show();
appendLog("閿欒: 钃濈墮鏈繛鎺�");
@@ -526,6 +778,41 @@
});
}
+/**
+ * 鐩戞帶璇︽儏鏍囬鐐瑰嚮浜嬩欢
+ * <p>
+ * 鎵嬪姩瑙﹀彂鏁版嵁璇诲彇锛屼細璁板綍瀹屾暣鏃ュ織
+ * </p>
+ */
+ public void onMonitorTitleClick() {
+ try {
+ if (BleGlobalManager.getInstance() != null && BleGlobalManager.getInstance().isConnected()) {
+ if (tvStatus != null) {
+ tvStatus.setText("鐘舵�侊細姝e湪璇诲彇鏁版嵁...");
+ }
+ // 纭繚涓嶆槸鍛ㄦ湡鎬ц鍙栵紝浠ヤ究璁板綍鏃ュ織
+ isPeriodicRead = false;
+ sendCmdWithCrc(CMD.READ_DATA);
+ } else {
+ Context context = getContext();
+ if (context != null) {
+ Toast.makeText(context, "璇峰厛杩炴帴钃濈墮", Toast.LENGTH_SHORT).show();
+ }
+ appendLog("閿欒: 钃濈墮鏈繛鎺�");
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ appendLog("鐐瑰嚮鐩戞帶璇︽儏鏃跺彂鐢熼敊璇�: " + e.getMessage());
+ }
+ }
+
+/**
+ * 璁板綍鏅�氭棩蹇�
+ * <p>
+ * 灏嗘棩蹇椾俊鎭坊鍔犲埌鏃ュ織鏋勫缓鍣ㄥ苟鏄剧ず
+ * </p>
+ * @param msg 鏃ュ織鍐呭
+ */
private void appendLog(String msg) {
appendLog(msg, null);
}
@@ -579,13 +866,38 @@
return "";
}
+ private void updateButtonState(View btn, boolean enable) {
+ if (btn == null) return;
+ btn.setEnabled(enable);
+ if (enable) {
+ btn.getBackground().clearColorFilter();
+ } else {
+ btn.getBackground().setColorFilter(android.graphics.Color.GRAY, android.graphics.PorterDuff.Mode.MULTIPLY);
+ }
+ }
+
+ private void restoreCurrentButton() {
+ if (currentOperatingButton != null) {
+ updateButtonState(currentOperatingButton, true);
+ currentOperatingButton = null;
+ }
+ }
+
+/**
+ * 璁板綍鏃ュ織
+ * <p>
+ * 灏嗘棩蹇椾俊鎭坊鍔犲埌鏃ュ織鏋勫缓鍣ㄥ苟鏄剧ず锛屾敮鎸佸彂閫�/鎺ユ敹绫诲瀷鐨勫尯鍒�
+ * </p>
+ * @param msg 鏃ュ織鍐呭
+ * @param isSent true琛ㄧず鍙戦�佺殑鎸囦护锛宖alse琛ㄧず鎺ユ敹鐨勬暟鎹�
+ */
private void appendLog(String msg, Boolean isSent) {
String time = com.blankj.utilcode.util.TimeUtils.getNowString(new java.text.SimpleDateFormat("HH:mm:ss.SSS"));
String displayMsg = msg;
String cmdDesc = "";
- // 濡傛灉鏄� hex 鎸囦护 (绾� 0-9 A-F a-f)锛屽姞绌烘牸鏍煎紡鍖�
+ // 濡傛灉鏄崄鍏繘鍒舵寚浠� (绾� 0-9 A-F a-f)锛屽姞绌烘牸鏍煎紡鍖�
if (msg.matches("^[0-9A-Fa-f]+$")) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < msg.length(); i += 2) {
@@ -603,7 +915,7 @@
String logLine;
if (isSent != null) {
- String color = isSent ? "#1890ff" : "#05aa87"; // Blue for sent, Green for received
+ String color = isSent ? "#1890ff" : "#05aa87"; // 鍙戦�佷负钃濊壊锛屾帴鏀朵负缁胯壊
// 鎷兼帴鍒板墠缂�鍚庨潰: "鍙戦��-璇荤珯鍙�: " 鎴� "鏀跺埌-璇荤珯鍙�: "
String prefix = (isSent ? "鍙戦��" : "鏀跺埌") + cmdDesc + ": ";
logLine = time + " <font color='" + color + "'>" + prefix + displayMsg + "</font><br>";
@@ -621,6 +933,13 @@
}
}
+/**
+ * 鍙戦�佸甫 CRC 鏍¢獙鐨勬寚浠�
+ * <p>
+ * 璁$畻鎸囦护鐨� CRC 鏍¢獙鍊煎苟鍙戦�侊紝鍚屾椂璁板綍鏃ュ織
+ * </p>
+ * @param cmd 鍗佸叚杩涘埗鏍煎紡鐨勬寚浠ゅ唴瀹�
+ */
private void sendCmdWithCrc(String cmd) {
if (!BleGlobalManager.getInstance().isConnected()) {
Toast.makeText(getContext(), "璇峰厛杩炴帴钃濈墮", Toast.LENGTH_SHORT).show();
@@ -637,7 +956,7 @@
}
String fullCmd = cmd + crc.toUpperCase();
- appendLog(fullCmd, true); // true for sent (Blue)
+ appendLog(fullCmd, true); // true琛ㄧず鍙戦�佺殑鎸囦护锛堣摑鑹诧級
BleGlobalManager.getInstance().sendCmd(fullCmd);
} else {
appendLog("閿欒: 鎸囦护杞崲澶辫触");
@@ -655,14 +974,14 @@
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
- // Calculate Box ID based on 3 rows of 10, Right to Left logic as seen in image
- // Row 1 (pos 0-9): 10 ... 1
- // Row 2 (pos 10-19): 20 ... 11
- // Row 3 (pos 20-29): 30 ... 21
+ // 鏍规嵁3琛�10鍒楃殑缃戞牸锛屼粠宸﹀埌鍙宠绠楁牸瀛怚D
+ // 绗�1琛� (浣嶇疆0-9): 1 ... 10
+ // 绗�2琛� (浣嶇疆10-19): 11 ... 20
+ // 绗�3琛� (浣嶇疆20-29): 21 ... 30
int row = position / 10;
int col = position % 10;
- int boxId = (row + 1) * 10 - col;
+ int boxId = row * 10 + (col + 1);
holder.tvBoxNumber.setText(String.valueOf(boxId));
@@ -676,18 +995,18 @@
}
if (status != null) {
- // Priority: Online > Glass
- // User requirement: "浼樺厛鏄剧ず鏄惁鍦ㄧ嚎" (Prioritize displaying online status)
- // "19-26涓轰篃鏄�16杩涘埗锛岃В鏋愭垚浜岃繘鍒�32浠g爜鎴戣繖30涓牸瀛愭槸鍚﹀湪绾�"
- // Usually this means if offline, show offline color. If online, show state (glass/no glass).
+ // 浼樺厛绾�: 鍦ㄧ嚎鐘舵�� > 鐜荤拑鐘舵��
+ // 鐢ㄦ埛闇�姹�: "浼樺厛鏄剧ず鏄惁鍦ㄧ嚎"
+ // "19-26浣嶄篃鏄�16杩涘埗锛岃В鏋愭垚浜岃繘鍒�32浣嶈〃绀�30涓牸瀛愮殑鍦ㄧ嚎鐘舵��"
+ // 閫氬父鎰忓懗鐫�濡傛灉绂荤嚎锛屾樉绀虹绾块鑹诧紱濡傛灉鍦ㄧ嚎锛屾樉绀虹幓鐠冪姸鎬侊紙鏈�/鏃狅級
if (!status.isOnline) {
- holder.viewBox.setBackgroundResource(R.drawable.bg_box_offline); // Offline (Grey)
+ holder.viewBox.setBackgroundResource(R.drawable.bg_box_offline); // 绂荤嚎锛堢伆鑹诧級
} else {
if (status.hasGlass) {
- holder.viewBox.setBackgroundResource(R.drawable.bg_box_full); // Green
+ holder.viewBox.setBackgroundResource(R.drawable.bg_box_full); // 缁胯壊
} else {
- holder.viewBox.setBackgroundResource(R.drawable.bg_box_empty); // Online but empty (White)
+ holder.viewBox.setBackgroundResource(R.drawable.bg_box_empty); // 鍦ㄧ嚎浣嗘棤鐜荤拑锛堢櫧鑹诧級
}
}
}
--
Gitblit v1.9.3