From 2b756769ea4adad21332d8a294871712cd42cc3f Mon Sep 17 00:00:00 2001
From: 张世豪 <979909237@qq.com>
Date: 星期三, 26 十一月 2025 13:57:24 +0800
Subject: [PATCH] 优化了轮询逻辑注意有打印输出
---
bin/home/CardMachineUI.class | 0
bin/publicway/SerialProtocolParser.class | 0
bin/chushihua/SlotManager.class | 0
bin/.gitignore | 2
src/chushihua/lunxun.java | 185 ++++++++++++-------------
src/publicway/SerialProtocolParser.java | 117 ++++++++++++++++
bin/chushihua/lunxun.class | 0
src/chushihua/SlotManager.java | 4
bin/chushihua/lunxun$PollingTask.class | 0
src/chuankou/SerialPortService.java | 10 +
bin/chuankou/SerialPortService.class | 0
log.properties | 26 +++
src/home/CardMachineUI.java | 18 +
13 files changed, 251 insertions(+), 111 deletions(-)
diff --git a/bin/.gitignore b/bin/.gitignore
index 9a0ec28..1971ae3 100644
--- a/bin/.gitignore
+++ b/bin/.gitignore
@@ -1,5 +1,7 @@
/chuankou/
/chushihua/
+/dialog/
/home/
+/jiekou/
/publicway/
/xitongshezhi/
diff --git a/bin/chuankou/SerialPortService.class b/bin/chuankou/SerialPortService.class
index 2f2422e..3e07c98 100644
--- a/bin/chuankou/SerialPortService.class
+++ b/bin/chuankou/SerialPortService.class
Binary files differ
diff --git a/bin/chushihua/SlotManager.class b/bin/chushihua/SlotManager.class
index e8e3056..ddda933 100644
--- a/bin/chushihua/SlotManager.class
+++ b/bin/chushihua/SlotManager.class
Binary files differ
diff --git a/bin/chushihua/lunxun$PollingTask.class b/bin/chushihua/lunxun$PollingTask.class
index fa85784..d8182a8 100644
--- a/bin/chushihua/lunxun$PollingTask.class
+++ b/bin/chushihua/lunxun$PollingTask.class
Binary files differ
diff --git a/bin/chushihua/lunxun.class b/bin/chushihua/lunxun.class
index 534d698..a69f4ae 100644
--- a/bin/chushihua/lunxun.class
+++ b/bin/chushihua/lunxun.class
Binary files differ
diff --git a/bin/home/CardMachineUI.class b/bin/home/CardMachineUI.class
index a49d9c9..550f306 100644
--- a/bin/home/CardMachineUI.class
+++ b/bin/home/CardMachineUI.class
Binary files differ
diff --git a/bin/publicway/SerialProtocolParser.class b/bin/publicway/SerialProtocolParser.class
index b91af32..ca0fde3 100644
--- a/bin/publicway/SerialProtocolParser.class
+++ b/bin/publicway/SerialProtocolParser.class
Binary files differ
diff --git a/log.properties b/log.properties
index 50d0198..6b349be 100644
--- a/log.properties
+++ b/log.properties
@@ -1,5 +1,5 @@
-#\u64CD\u4F5C\u65E5\u5FD7\u8BB0\u5F55 - \u6700\u540E\u66F4\u65B0: Sat Nov 22 15:43:14 CST 2025
-#Sat Nov 22 15:43:14 CST 2025
+#\u64CD\u4F5C\u65E5\u5FD7\u8BB0\u5F55 - \u6700\u540E\u66F4\u65B0: Wed Nov 26 13:54:51 CST 2025
+#Wed Nov 26 13:54:51 CST 2025
log_1763724957486_7ed8425e=[2025-11-21 19\:35\:57] 鍙栧崱鎿嶄綔锛氬崱妲�1琚鐞嗗憳鍙栧崱
log_1763724957585_8967e0b2=[2025-11-21 19\:35\:57] 鍙栧崱鎿嶄綔锛氬崱妲�2琚鐞嗗憳鍙栧崱
log_1763724957735_6574dba5=[2025-11-21 19\:35\:57] 鍙栧崱鎿嶄綔锛氬崱妲�3琚鐞嗗憳鍙栧崱
@@ -115,3 +115,25 @@
log_1763797394271_ad30a236=[2025-11-22 15\:43\:14] DDCC0008F003515AA55AA5027A7E;type2鎺у埗鎵撳紑3鏌滈棬
log_1763797394281_00876aa0=[2025-11-22 15\:43\:14] 鍙栧崱鎿嶄綔锛氬崱妲�3琚鐞嗗憳鍙栧崱
log_1763797394622_9137f63b=[2025-11-22 15\:43\:14] 3鍙峰崱妲藉彇鍗″け璐�
+log_1764135397723_84402e54=[2025-11-26 13\:36\:37] DDCC0008F010515AA55AA502BB5C;type2鎺у埗鎵撳紑16鏌滈棬
+log_1764135398043_85ab4e55=[2025-11-26 13\:36\:38] 鍙栧崱鎿嶄綔锛氬崱妲�16琚鐞嗗憳鍙栧崱
+log_1764135398198_2349ce0d=[2025-11-26 13\:36\:38] DDCC0008F011515AA55AA5027B4C;type2鎺у埗鎵撳紑17鏌滈棬
+log_1764135398521_707e724d=[2025-11-26 13\:36\:38] 鍙栧崱鎿嶄綔锛氬崱妲�17琚鐞嗗憳鍙栧崱
+log_1764135398672_2ff90b31=[2025-11-26 13\:36\:38] DDCC0008F012515AA55AA5027B7F;type2鎺у埗鎵撳紑18鏌滈棬
+log_1764135399002_72e36700=[2025-11-26 13\:36\:39] 鍙栧崱鎿嶄綔锛氬崱妲�18琚鐞嗗憳鍙栧崱
+log_1764135399101_6cfd16ca=[2025-11-26 13\:36\:39] DDCC0008F013515AA55AA502BB6F;type2鎺у埗鎵撳紑19鏌滈棬
+log_1764135399422_6d2b3023=[2025-11-26 13\:36\:39] 19鍙峰崱妲藉彇鍗″け璐�
+log_1764135400746_19bde6e5=[2025-11-26 13\:36\:40] DDCC0008F012515AA55AA5027B7F;type2鎺у埗鎵撳紑18鏌滈棬
+log_1764135401072_bfc61929=[2025-11-26 13\:36\:41] 鍙栧崱鎿嶄綔锛氬崱妲�18琚鐞嗗憳鍙栧崱
+log_1764135401428_8765a316=[2025-11-26 13\:36\:41] DDCC0008F013515AA55AA502BB6F;type2鎺у埗鎵撳紑19鏌滈棬
+log_1764135401751_b0dc6eeb=[2025-11-26 13\:36\:41] 鍙栧崱鎿嶄綔锛氬崱妲�19琚鐞嗗憳鍙栧崱
+log_1764135403137_780179c3=[2025-11-26 13\:36\:43] DDCC0008F013515AA55AA502BB6F;type2鎺у埗鎵撳紑19鏌滈棬
+log_1764135403461_84264232=[2025-11-26 13\:36\:43] 鍙栧崱鎿嶄綔锛氬崱妲�19琚鐞嗗憳鍙栧崱
+log_1764136489886_1b915fb2=[2025-11-26 13\:54\:49] DDCC0008F010515AA55AA502BB5C;type2鎺у埗鎵撳紑16鏌滈棬
+log_1764136490213_558da777=[2025-11-26 13\:54\:50] 鍙栧崱鎿嶄綔锛氬崱妲�16琚鐞嗗憳鍙栧崱
+log_1764136490338_35642c9c=[2025-11-26 13\:54\:50] DDCC0008F011515AA55AA5027B4C;type2鎺у埗鎵撳紑17鏌滈棬
+log_1764136490673_e331bdd6=[2025-11-26 13\:54\:50] 鍙栧崱鎿嶄綔锛氬崱妲�17琚鐞嗗憳鍙栧崱
+log_1764136490851_72a1541e=[2025-11-26 13\:54\:50] DDCC0008F012515AA55AA5027B7F;type2鎺у埗鎵撳紑18鏌滈棬
+log_1764136491173_e8aa6057=[2025-11-26 13\:54\:51] 鍙栧崱鎿嶄綔锛氬崱妲�18琚鐞嗗憳鍙栧崱
+log_1764136491324_8d1b32d1=[2025-11-26 13\:54\:51] DDCC0008F013515AA55AA502BB6F;type2鎺у埗鎵撳紑19鏌滈棬
+log_1764136491652_fa44283b=[2025-11-26 13\:54\:51] 鍙栧崱鎿嶄綔锛氬崱妲�19琚鐞嗗憳鍙栧崱
diff --git a/src/chuankou/SerialPortService.java b/src/chuankou/SerialPortService.java
index e2e835b..edddf8a 100644
--- a/src/chuankou/SerialPortService.java
+++ b/src/chuankou/SerialPortService.java
@@ -6,6 +6,7 @@
import java.io.InputStream;
import java.io.OutputStream;
import publicway.SerialProtocolParser; // 娣诲姞瀵煎叆
+import publicway.TimestampUtil;
import xitongshezhi.SystemDebugDialog;
public class SerialPortService {
@@ -181,6 +182,7 @@
if (len > 0) {
buffer.write(readBuffer, 0, len);
lastReceivedTime = currentTime;
+ System.out.println("鏀跺埌鍘熷鏁版嵁: " + bytesToHex(readBuffer, len)+"鏃堕棿"+TimestampUtil.getTimestamp());
}
if (len <= 0 && buffer.size() == 0) {
@@ -264,5 +266,11 @@
int result = port.writeBytes(data, data.length);
return result > 0;
}
-
+ private String bytesToHex(byte[] bytes, int length) {
+ StringBuilder sb = new StringBuilder();
+ for (int i = 0; i < length; i++) {
+ sb.append(String.format("%02X ", bytes[i]));
+ }
+ return sb.toString().trim();
+ }
}
\ No newline at end of file
diff --git a/src/chushihua/SlotManager.java b/src/chushihua/SlotManager.java
index b85cb60..bec177f 100644
--- a/src/chushihua/SlotManager.java
+++ b/src/chushihua/SlotManager.java
@@ -7,6 +7,7 @@
import dialog.Dingshidialog;
import home.Fkj;
+import publicway.TimestampUtil;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
@@ -529,7 +530,8 @@
slotNumber+"鍙峰崱妲借繕鍗℃垚鍔熸劅璋㈡偍鐨勪娇鐢�"
);
});
- //System.out.println("鍗℃Ы " + slotNumber + " 杩樺崱鎴愬姛锛屽崱鍙蜂粠 " + oldCardNumber + " 鍙樹负 " + newCardNumber);
+// System.out.println("杩樺崱鎴愬姛" + slotNumber + " 杩樺崱鎴愬姛锛屽崱鍙蜂粠 " + oldCardNumber + " 鍙樹负 " + newCardNumber);
+ System.out.println("杩樺崱鎴愬姛"+slotNumber +"鏃堕棿"+ " 杩樺崱鎴愬姛锛屽崱鍙蜂粠 " + oldCardNumber + " 鍙樹负 " + newCardNumber+TimestampUtil.getTimestamp());
}
}
diff --git a/src/chushihua/lunxun.java b/src/chushihua/lunxun.java
index 2e3420d..c3ffeb7 100644
--- a/src/chushihua/lunxun.java
+++ b/src/chushihua/lunxun.java
@@ -5,6 +5,7 @@
import home.Fkj;
import home.MachineConfig;
import publicway.QueryData;
+import publicway.TimestampUtil;
import xitongshezhi.SystemDebugDialog;
import java.util.Iterator;
@@ -24,7 +25,7 @@
private static volatile boolean isPaused = false;
private static final AtomicBoolean shouldStop = new AtomicBoolean(false);
private static Thread pollingThread;
- private static int pollingInterval = 100; // 榛樿杞闂撮殧
+ private static int pollingInterval =50; // 榛樿杞闂撮殧
public static boolean sendChaxunzhiling=true;//鏄惁鍚戜覆鍙e彂閫佹煡璇㈡寚浠�
// 娣诲姞闈欐�佸彉閲忔帶鍒朵汉鑴告娴�
public static boolean ishaveface = false; // 鏄惁妫�娴嬪埌浜鸿劯锛岄粯璁ゆ病鏈変汉鑴�
@@ -370,19 +371,17 @@
* 浼樺寲锛氬唴瀛樼鐞嗗拰閲嶇敤瀵硅薄
*/
private static class PollingTask implements Runnable {
- private int currentIndex = 0; // 褰撳墠绱㈠紩锛岀敤浜庨亶鍘唖lotArray
- private int consecutiveFailures = 0; // 杩炵画澶辫触娆℃暟
- private static final int MAX_CONSECUTIVE_FAILURES = 5; // 鏈�澶ц繛缁け璐ユ鏁�
- private final StringBuilder debugBuilder = new StringBuilder(100); // 閲嶇敤 StringBuilder
+ private int currentIndex = 0; // 褰撳墠绱㈠紩锛岀敤浜庨亶鍘唖lotArray
+ private int consecutiveFailures = 0; // 杩炵画澶辫触娆℃暟
+ private static final int MAX_CONSECUTIVE_FAILURES = 5; // 鏈�澶ц繛缁け璐ユ鏁�
+ private final StringBuilder debugBuilder = new StringBuilder(100); // 閲嶇敤 StringBuilder
- @Override
- public void run() {
+ @Override
+ public void run() {
//System.out.println("杞鏌ヨ绾跨▼寮�濮嬭繍琛�");
while (isRunning && !Thread.currentThread().isInterrupted() && !shouldStop.get()) {
try {
-
-// System.out.println("鏌ヨ涓�.....绾跨▼");
// 妫�鏌ユ槸鍚︽殏鍋�
if (isPaused) {
synchronized (lunxun.class) {
@@ -413,81 +412,69 @@
continue;
}
- // 鏂板锛氭牴鎹崱妲界姸鎬佸拰鏌ヨ棰戠巼鍐冲畾鏄惁鍙戦�佹煡璇�
- boolean sentQuery = false;
- long currentTime = System.currentTimeMillis();
-
- // 閬嶅巻鍗℃Ы锛屽鎵鹃渶瑕佹煡璇㈢殑鍗℃Ы
- for (int i = 0; i < slotArray.length && !sentQuery; i++) {
+ // 閬嶅巻鎵�鏈夊崱妲�
+ for (int i = 0; i < slotArray.length; i++) {
+ if (!isRunning || shouldStop.get()) {
+ break;
+ }
+
int slotIndex = (currentIndex + i) % slotArray.length;
Fkj slot = slotArray[slotIndex];
if (slot != null) {
String hasCard = slot.getHasCard();
int slotNumber = slotIndex + 1;
- Long lastQueryTime = lastQueryTimeMap.get(slotNumber);
- // 鏂板锛氬鏋滄湁浜鸿劯妫�娴嬶紝鍒欏彧鏌ヨ鏃犲崱鍗℃Ы
+ // 妫�鏌ユ槸鍚﹀洜涓轰汉鑴告娴嬮渶瑕佽烦杩囨湁鍗″崱妲�
if (ishaveface && "1".equals(hasCard)) {
- // 璺宠繃鏈夊崱鍗℃Ы鐨勬煡璇�
+ // 璺宠繃鏈夊崱鍗℃Ы锛岀珛鍗崇户缁笅涓�涓紝涓嶇瓑寰�
if (DEBUG_ENABLED) {
debugBuilder.setLength(0);
debugBuilder.append("妫�娴嬪埌浜鸿劯锛岃烦杩囨湁鍗″崱妲� ").append(slotNumber).append(" 鐨勬煡璇n");
SystemDebugDialog.appendAsciiData(debugBuilder.toString());
}
- continue;
+ continue; // 绔嬪嵆缁х画涓嬩竴涓崱妲斤紝涓嶇瓑寰�
}
- // 纭畾鏌ヨ闂撮殧锛氬彧鏈塰asCard="1"鐨勫崱妲戒娇鐢�10绉掗棿闅旓紝鍏朵粬鎯呭喌锛堝寘鎷�"-1"锛夐兘浣跨敤100ms闂撮殧
- int queryInterval = "1".equals(hasCard) ? HAS_CARD_QUERY_INTERVAL : NO_CARD_QUERY_INTERVAL;
+ // 鍙戦�佹煡璇㈡寚浠ゅ埌褰撳墠鍗℃Ы
+ boolean sendSuccess = sendQueryToSlot(slotNumber);
+
+ if (sendSuccess) {
+ // 鏇存柊鏈�鍚庢煡璇㈡椂闂�
+ lastQueryTimeMap.put(slotNumber, System.currentTimeMillis());
+ consecutiveFailures = 0;
- // 妫�鏌ユ槸鍚﹁揪鍒版煡璇㈡椂闂�
- if (lastQueryTime == null || currentTime - lastQueryTime >= queryInterval) {
- if (sendQueryToSlot(slotNumber)) {
- // 鏇存柊鏈�鍚庢煡璇㈡椂闂�
- lastQueryTimeMap.put(slotNumber, currentTime);
- sentQuery = true;
- consecutiveFailures = 0;
-
- // 鎴愬姛鍙戦�佹煡璇㈠悗锛岀瓑寰�100ms鍐嶇户缁笅涓�涓煡璇�
- Thread.sleep(100);
-
- if (DEBUG_ENABLED) {
- String status;
- if ("1".equals(hasCard)) {
- status = "鏈夊崱";
- } else if ("-1".equals(hasCard)) {
- status = "鏈煡";
- } else {
- status = "鏃犲崱";
- }
-
- // 浣跨敤閲嶇敤鐨� StringBuilder 鏋勫缓璋冭瘯淇℃伅
- debugBuilder.setLength(0);
- debugBuilder.append("Slot ").append(slotNumber)
- .append(" (").append(status).append(") 鏌ヨ鎴愬姛锛岄棿闅�: ")
- .append(queryInterval).append("ms\n");
- SystemDebugDialog.appendAsciiData(debugBuilder.toString());
+ if (DEBUG_ENABLED) {
+ String status;
+ if ("1".equals(hasCard)) {
+ status = "鏈夊崱";
+ } else if ("-1".equals(hasCard)) {
+ status = "鏈煡";
+ } else {
+ status = "鏃犲崱";
}
- } else {
- consecutiveFailures++;
- if (consecutiveFailures >= MAX_CONSECUTIVE_FAILURES) {
- logErrorWithRateLimit("consecutive_failures", "lunxun杩炵画澶辫触娆℃暟杩囧锛屾殏鍋滆疆璇�");
- pausePolling();
- break;
- }
+
+ debugBuilder.setLength(0);
+ debugBuilder.append("Slot ").append(slotNumber)
+ .append(" (").append(status).append(") 鏌ヨ鎴愬姛\n");
+ SystemDebugDialog.appendAsciiData(debugBuilder.toString());
+ }
+ } else {
+ consecutiveFailures++;
+ if (consecutiveFailures >= MAX_CONSECUTIVE_FAILURES) {
+ logErrorWithRateLimit("consecutive_failures", "lunxun杩炵画澶辫触娆℃暟杩囧锛屾殏鍋滆疆璇�");
+ pausePolling();
+ break;
}
}
+
+ // 鍙戦�佹煡璇㈡寚浠ゅ悗绛夊緟50ms锛岀劧鍚庣户缁笅涓�涓崱妲�
+ Thread.sleep(50);
}
}
// 鏇存柊褰撳墠绱㈠紩
currentIndex = (currentIndex + 1) % slotArray.length;
- // 濡傛灉娌℃湁鍙戦�佹煡璇紝绛夊緟涓�娈垫椂闂村啀缁х画
- if (!sentQuery) {
- Thread.sleep(pollingInterval);
- }
-
} catch (InterruptedException e) {
//System.out.println("杞鏌ヨ绾跨▼琚腑鏂�");
Thread.currentThread().interrupt();
@@ -527,45 +514,49 @@
* 鍚戞寚瀹氬崱妲藉彂閫佹煡璇㈡寚浠� - 浼樺寲鐗堟湰
* 浣跨敤缂撳瓨鎸囦护锛屼紭鍖栬皟璇曡緭鍑�
*/
- private boolean sendQueryToSlot(int slotNumber) {
- try {
- // 浣跨敤缂撳瓨鐨勬煡璇㈡寚浠�
- String queryCommand = getCachedQueryCommand(slotNumber);
-// System.out.println("鎸囦护鏄細"+queryCommand);
- if (DEBUG_ENABLED) {
- SystemDebugDialog.appendAsciiData("send to "+slotNumber+" queryCommand");
- }
+ /**
+ * 鍚戞寚瀹氬崱妲藉彂閫佹煡璇㈡寚浠� - 浼樺寲鐗堟湰
+ * 浣跨敤缂撳瓨鎸囦护锛屼紭鍖栬皟璇曡緭鍑�
+ */
+ private boolean sendQueryToSlot(int slotNumber) {
+ try {
+ // 浣跨敤缂撳瓨鐨勬煡璇㈡寚浠�
+ String queryCommand = getCachedQueryCommand(slotNumber);
+ System.out.println(slotNumber+"鍙戦�佷簡鎸囦护鏄細"+queryCommand+"鏃堕棿"+TimestampUtil.getTimestamp());
+
+ if (DEBUG_ENABLED) {
+ SystemDebugDialog.appendAsciiData("send to "+slotNumber+" queryCommand");
+ }
- if (queryCommand != null && !queryCommand.trim().isEmpty()) {
- // 鍙戦�佸埌涓插彛
+ if (queryCommand != null && !queryCommand.trim().isEmpty()) {
+ // 鍙戦�佸埌涓插彛
+ if(sendChaxunzhiling) {
+ boolean sendResult = Sendmsg.sendMessage(queryCommand);
+ if (sendResult) {
+ return true;
+ } else {
+ if (DEBUG_ENABLED) {
+ SystemDebugDialog.appendAsciiData(slotNumber+" Send query command to card slot err");
+ }
+ // 鍙戦�佸け璐ュ彲鑳芥槸涓插彛鏂紑锛屾洿鏂拌繛鎺ョ姸鎬�
+ serialConnected = false;
+ return false;
+ }
+ } else {
+ return false;
+ }
+ } else {
+ logErrorWithRateLimit("empty_query_command", "鐢熸垚鐨勬煡璇㈡寚浠や负绌猴紝鍗℃Ы: " + slotNumber);
+ return false;
+ }
- if(sendChaxunzhiling) {
- boolean sendResult = Sendmsg.sendMessage(queryCommand);
- if (sendResult) {
- return true;
- } else {
- if (DEBUG_ENABLED) {
- SystemDebugDialog.appendAsciiData(slotNumber+" Send query command to card slot err");
- }
- // 鍙戦�佸け璐ュ彲鑳芥槸涓插彛鏂紑锛屾洿鏂拌繛鎺ョ姸鎬�
- serialConnected = false;
- return false;
- }
- }else {
- return false;
- }
- } else {
- logErrorWithRateLimit("empty_query_command", "鐢熸垚鐨勬煡璇㈡寚浠や负绌猴紝鍗℃Ы: " + slotNumber);
- return false;
- }
-
- } catch (Exception e) {
- logErrorWithRateLimit("send_query_exception", "鍙戦�佹煡璇㈡寚浠ゅ埌鍗℃Ы " + slotNumber + " 鏃跺彂鐢熷紓甯�: " + e.getMessage());
- // 鍙戠敓寮傚父鏃舵洿鏂颁覆鍙h繛鎺ョ姸鎬�
- serialConnected = false;
- return false;
- }
- }
+ } catch (Exception e) {
+ logErrorWithRateLimit("send_query_exception", "鍙戦�佹煡璇㈡寚浠ゅ埌鍗℃Ы " + slotNumber + " 鏃跺彂鐢熷紓甯�: " + e.getMessage());
+ // 鍙戠敓寮傚父鏃舵洿鏂颁覆鍙h繛鎺ョ姸鎬�
+ serialConnected = false;
+ return false;
+ }
+ }
}
/**
diff --git a/src/home/CardMachineUI.java b/src/home/CardMachineUI.java
index 2caf8e5..831171c 100644
--- a/src/home/CardMachineUI.java
+++ b/src/home/CardMachineUI.java
@@ -481,14 +481,22 @@
final int slotId = i;
SlotStatus status = getSlotStatusFromManager(slotId);
- // 娣诲姞璋冭瘯淇℃伅
+ // 鑾峰彇鍗℃Ы淇℃伅
Fkj slotInfo = slotManager.getSlotInfo(slotId);
- if (slotInfo != null) {
- } else {
- System.err.println("鍗℃Ы " + slotId + " - 鑾峰彇淇℃伅澶辫触");
+ String cardNumber = "鏃犲崱";
+ if (slotInfo != null && slotInfo.getCardNumber() != null) {
+ String cardNum = slotInfo.getCardNumber();
+ // 鍒ゆ柇鍗″彿鏄惁鏈夋晥锛堜笉鏄�"-1"鎴�"0000"锛�
+ if (!"-1".equals(cardNum) && !"0000".equals(cardNum)) {
+ cardNumber = cardNum;
+ }
}
- JButton slotButton = new JButton(String.valueOf(slotId));
+ // 鍒涘缓鍖呭惈鍗℃Ы缂栧彿鍜屽崱鍙风殑HTML鏂囨湰
+ String buttonText = String.format("<html><div style='text-align: center;'>%d<br/><span style='font-size: 10px;'>%s</span></div></html>",
+ slotId, cardNumber);
+
+ JButton slotButton = new JButton(buttonText);
slotButton.setBackground(status.getColor());
slotButton.setForeground(Color.WHITE);
slotButton.setFont(new Font("Microsoft YaHei", Font.BOLD, 14));
diff --git a/src/publicway/SerialProtocolParser.java b/src/publicway/SerialProtocolParser.java
index 732c879..36ccf34 100644
--- a/src/publicway/SerialProtocolParser.java
+++ b/src/publicway/SerialProtocolParser.java
@@ -2,9 +2,12 @@
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
+import java.util.Collections;
+import java.util.Set;
import chuankou.SerialPortService;
import chushihua.SlotManager;
@@ -54,6 +57,13 @@
// 瀵硅薄姹狅紝鍑忓皯瀵硅薄鍒涘缓
private final Object packetPoolLock = new Object();
+ // ==================== 鏂板锛氭暟鎹寘鍘婚噸缂撳瓨 ====================
+ private final Set<String> processedPacketCache = Collections.newSetFromMap(
+ new ConcurrentHashMap<String, Boolean>());
+ private static final int MAX_CACHE_SIZE = 1000;
+ private static final long CACHE_CLEANUP_INTERVAL = 60000; // 1鍒嗛挓娓呯悊涓�娆$紦瀛�
+ private long lastCacheCleanupTime = 0;
+
/**
* 鍚姩瑙f瀽鍣�
*/
@@ -64,9 +74,8 @@
isRunning = true;
- // 鍚姩鎵归噺澶勭悊锛堟瘡50ms澶勭悊涓�娆★級
- batchExecutor.scheduleAtFixedRate(this::batchProcess, 50, 50, TimeUnit.MILLISECONDS);
-
+ // 鍚姩鎵归噺澶勭悊锛堟瘡10ms澶勭悊涓�娆★級
+ batchExecutor.scheduleAtFixedRate(this::batchProcess, 10, 10, TimeUnit.MILLISECONDS);
processorThread = new Thread(this::processPackets, "Serial-Protocol-Parser");
processorThread.setDaemon(true);
processorThread.start();
@@ -106,6 +115,9 @@
// 娓呯┖闃熷垪鍜岀紦鍐插尯
clearQueues();
bufferPosition = 0;
+
+ // 娓呯┖鍘婚噸缂撳瓨
+ processedPacketCache.clear();
}
/**
@@ -203,6 +215,9 @@
// 瀹氭湡妫�鏌ュ唴瀛�
checkMemory();
+ // 瀹氭湡娓呯悊鍘婚噸缂撳瓨
+ cleanupPacketCache();
+
} catch (Exception e) {
System.err.println("鎵归噺澶勭悊鏁版嵁鏃跺彂鐢熷紓甯�: " + e.getMessage());
// 鍙戠敓寮傚父鏃堕噸缃姸鎬�
@@ -275,6 +290,26 @@
}
/**
+ * 娓呯悊鏁版嵁鍖呭幓閲嶇紦瀛�
+ */
+ private void cleanupPacketCache() {
+ long currentTime = System.currentTimeMillis();
+ if (currentTime - lastCacheCleanupTime < CACHE_CLEANUP_INTERVAL) {
+ return;
+ }
+
+ lastCacheCleanupTime = currentTime;
+
+ // 濡傛灉缂撳瓨澶у皬瓒呰繃闄愬埗锛屾竻绌虹紦瀛�
+ if (processedPacketCache.size() >= MAX_CACHE_SIZE) {
+ processedPacketCache.clear();
+ if (lunxun.DEBUG_ENABLED) {
+ SystemDebugDialog.appendAsciiData("鏁版嵁鍖呭幓閲嶇紦瀛樺凡娓呯┖锛屽綋鍓嶅ぇ灏�: " + processedPacketCache.size());
+ }
+ }
+ }
+
+ /**
* 澶勭悊缂撳啿鍖轰腑鐨勬暟鎹紝瑙f瀽瀹屾暣鏁版嵁鍖�
*/
private void processBuffer() {
@@ -318,6 +353,27 @@
// 鎻愬彇瀹屾暣鏁版嵁鍖�
byte[] packet = extractPacket(startIndex, totalPacketLength);
if (packet != null) {
+ // ==================== 鏂板锛氭暟鎹寘鍘婚噸妫�鏌� ====================
+ String packetHash = generatePacketHash(packet);
+ if (processedPacketCache.contains(packetHash)) {
+ // 璺宠繃閲嶅鏁版嵁鍖�
+ if (lunxun.DEBUG_ENABLED) {
+ SystemDebugDialog.appendAsciiData("璺宠繃閲嶅鏁版嵁鍖�: " + bytesToHex(packet));
+ }
+
+ // 绉诲姩缂撳啿鍖轰綅缃紝缁х画澶勭悊涓嬩竴涓寘
+ int remaining = bufferPosition - (startIndex + totalPacketLength);
+ if (remaining > 0) {
+ System.arraycopy(dataBuffer, startIndex + totalPacketLength, dataBuffer, 0, remaining);
+ }
+ bufferPosition = remaining;
+ processedCount++;
+ continue;
+ }
+
+ // 娣诲姞鍒板幓閲嶇紦瀛�
+ processedPacketCache.add(packetHash);
+
// 灏嗘暟鎹寘鏀惧叆闃熷垪渚涜В鏋�
if (!dataQueue.offer(packet)) {
// 闃熷垪宸叉弧锛岄噴鏀緋acket寮曠敤
@@ -339,6 +395,35 @@
}
/**
+ * 鐢熸垚鏁版嵁鍖呭搱甯屽�肩敤浜庡幓閲�
+ * 鍩轰簬鍏抽敭瀛楁锛氫富鏈哄湴鍧� + 鍗℃Ы鍦板潃 + 鍔熻兘鐮� + 鏁版嵁鍐呭
+ */
+ private String generatePacketHash(byte[] packet) {
+ if (packet == null || packet.length < 7) {
+ return "";
+ }
+
+ StringBuilder key = new StringBuilder(64);
+
+ // 娣诲姞鍗忚澶翠俊鎭�
+ key.append(packet[4] & 0xFF).append(":"); // 涓绘満鍦板潃 (浣嶇疆4)
+ key.append(packet[5] & 0xFF).append(":"); // 鍗℃Ы鍦板潃 (浣嶇疆5)
+ key.append(packet[6] & 0xFF).append(":"); // 鍔熻兘鐮� (浣嶇疆6)
+
+ // 娣诲姞鏁版嵁鍐呭鍝堝笇锛堟帓闄ゅ寘澶村拰CRC锛�
+ int dataStart = 7; // 鏁版嵁寮�濮嬩綅缃�
+ int dataEnd = packet.length - 2; // 鎺掗櫎CRC瀛楄妭
+
+ // 鍙栨暟鎹唴瀹圭殑鍓�20涓瓧鑺備綔涓哄搱甯屼緷鎹�
+ int hashLength = Math.min(dataEnd - dataStart, 20);
+ for (int i = dataStart; i < dataStart + hashLength && i < dataEnd; i++) {
+ key.append(String.format("%02X", packet[i]));
+ }
+
+ return key.toString();
+ }
+
+ /**
* 鎻愬彇鏁版嵁鍖咃紝閲嶇敤byte鏁扮粍鍑忓皯瀵硅薄鍒涘缓
*/
private byte[] extractPacket(int startIndex, int totalPacketLength) {
@@ -408,6 +493,7 @@
* 瑙f瀽鏁版嵁鍖呭苟鏍规嵁鍔熻兘鐮佽皟鐢ㄧ浉搴旀柟娉�
*/
private void parsePacket(byte[] packet) {
+ System.out.println("寮�濮嬭В鏋愭敹鍒扮殑鏁版嵁"+bytesToHex(packet)+"鏃堕棿"+TimestampUtil.getTimestamp());
if (packet == null || packet.length < MIN_PACKET_LENGTH) {
return;
}
@@ -418,6 +504,7 @@
byte hostAddress = packet[4]; // 涓绘満鍦板潃
byte slotAddress = packet[5]; // 鍗℃Ы鍦板潃
byte functionCode = packet[6]; // 鍔熻兘鐮�
+
// 鏁版嵁闀垮害 (浠庡崗璁腑璇诲彇)
int dataLength = ((packet[2] & 0xFF) << 8) | (packet[3] & 0xFF);
@@ -529,14 +616,16 @@
* 鑾峰彇瑙f瀽鍣ㄧ姸鎬佷俊鎭�
*/
public String getStatusInfo() {
- return String.format("涓插彛瑙f瀽鍣ㄧ姸鎬�: %s, 闃熷垪澶у皬: %d/%d, 鎵归噺闃熷垪: %d/%d, 缂撳啿鍖�: %d/%d",
+ return String.format("涓插彛瑙f瀽鍣ㄧ姸鎬�: %s, 闃熷垪澶у皬: %d/%d, 鎵归噺闃熷垪: %d/%d, 缂撳啿鍖�: %d/%d, 鍘婚噸缂撳瓨: %d/%d",
isRunning ? "杩愯涓�" : "宸插仠姝�",
dataQueue.size(),
dataQueue.remainingCapacity() + dataQueue.size(),
batchQueue.size(),
batchQueue.remainingCapacity() + batchQueue.size(),
bufferPosition,
- dataBuffer.length);
+ dataBuffer.length,
+ processedPacketCache.size(),
+ MAX_CACHE_SIZE);
}
/**
@@ -554,5 +643,23 @@
clearQueues();
bufferPosition = 0;
hexBuilder.setLength(0);
+ processedPacketCache.clear();
+ }
+
+ /**
+ * 鎵嬪姩娓呯┖鏁版嵁鍖呭幓閲嶇紦瀛橈紙鐢ㄤ簬璋冭瘯鎴栫壒娈婃儏鍐碉級
+ */
+ public void clearPacketCache() {
+ processedPacketCache.clear();
+ if (lunxun.DEBUG_ENABLED) {
+ SystemDebugDialog.appendAsciiData("鏁版嵁鍖呭幓閲嶇紦瀛樺凡鎵嬪姩娓呯┖");
+ }
+ }
+
+ /**
+ * 鑾峰彇鍘婚噸缂撳瓨澶у皬锛堢敤浜庣洃鎺э級
+ */
+ public int getPacketCacheSize() {
+ return processedPacketCache.size();
}
}
\ No newline at end of file
--
Gitblit v1.10.0