From 09c54e2bfa51aa9800f224fda7ad3754b353bfed Mon Sep 17 00:00:00 2001
From: zhuguifei <zhuguifei@zhuguifeideiMac.local>
Date: 星期三, 14 一月 2026 08:43:21 +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