From 2b756769ea4adad21332d8a294871712cd42cc3f Mon Sep 17 00:00:00 2001
From: 张世豪 <979909237@qq.com>
Date: 星期三, 26 十一月 2025 13:57:24 +0800
Subject: [PATCH] 优化了轮询逻辑注意有打印输出

---
 src/home/CardMachineUI.java |  186 ++++++++++++++++++++++++++++++++++-----------
 1 files changed, 139 insertions(+), 47 deletions(-)

diff --git a/src/home/CardMachineUI.java b/src/home/CardMachineUI.java
index 63c01cd..831171c 100644
--- a/src/home/CardMachineUI.java
+++ b/src/home/CardMachineUI.java
@@ -13,7 +13,6 @@
 import xitongshezhi.AdminLoginDialog;
 import xitongshezhi.CardPickupDialog;
 import xitongshezhi.ConfigSet;
-import xitongshezhi.Fkj;
 import chuankou.SerialPortService;
 import chuankou.Sendmsg;
 
@@ -77,15 +76,25 @@
 	private JPanel commFaultPanel;
 
 	public CardMachineUI() {
-	    try {
+		try {
 	        // 鍏堝垵濮嬪寲绯荤粺閰嶇疆鍜岀粍浠�
 	        initializeSystem();
 	        
+	        // 鍒濆鍖栦覆鍙hВ鏋愬櫒
+	        initializeSerialParser();
+	        
 	        // 鐒跺悗鍒濆鍖朥I
 	        initializeUI();
 	        initializeSlots();
 	        startUIUpdates(); // UI鍒锋柊瀹氭椂鍣�
-	        startSerialStatusMonitoring(); // 涓插彛鐘舵�佺洃鎺�        
+	        startSerialStatusMonitoring(); // 涓插彛鐘舵�佺洃鎺�
+	        setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
+	        addWindowListener(new java.awt.event.WindowAdapter() {
+	            @Override
+	            public void windowClosing(java.awt.event.WindowEvent windowEvent) {
+	                dispose(); // 璋冪敤鎴戜滑淇敼杩囩殑dispose鏂规硶
+	            }
+	        });
 	        
 	        //System.out.println("涓荤晫闈㈠垵濮嬪寲瀹屾垚");
 	    } catch (Exception e) {
@@ -110,7 +119,8 @@
 			if (serialConnected && lunxun.isPolling() && lunxun.isPaused()) {
 				// 鍙湁鍦ㄤ笉鍦ㄨ缃〉闈㈡椂鎵嶈嚜鍔ㄦ仮澶�
 				if (!isInConfigPage()) {
-					lunxun.resumePolling();
+//					lunxun.resumePolling();
+//					System.out.println("灏濊瘯鑷姩鍚姩杞鍔熻兘");
 				}
 			}
 		});
@@ -171,7 +181,7 @@
     }
 
 	private void initializeUI() {
-		setTitle("UWB浜哄憳瀹氫綅鍗″彂鍗℃満绠$悊绯荤粺");
+		setTitle("鍙戝崱鏈烘帶鍒惰蒋浠禫1.0");
 		setSize(SCREEN_WIDTH, SCREEN_HEIGHT);
 		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 		setLocationRelativeTo(null);
@@ -288,8 +298,9 @@
 	    refreshBtn.addActionListener(e -> {
 	        updateCardSlotsDisplay();
 	        updateStatistics();
+	        lunxun.resumePolling();
 	        JOptionPane.showMessageDialog(CardMachineUI.this, 
-	                "鎵嬪姩鍒锋柊瀹屾垚锛屽叡鍒锋柊 " + TOTAL_SLOTS + " 涓崱妲�", 
+	                "鎵嬪姩鍒锋柊瀹屾垚锛屽惎鍔ㄨ疆璇紝鍏卞埛鏂� " + TOTAL_SLOTS + " 涓崱妲�", 
 	                "鍒锋柊瀹屾垚", JOptionPane.INFORMATION_MESSAGE);
 	    });
 
@@ -470,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));
@@ -586,40 +605,73 @@
 	    
 	    if (pickupSuccess) {
 	        // 鍙栧崱鎴愬姛锛岃皟鐢╟hanggehaska鏂规硶鏀瑰彉鍗℃Ы灞炴��
-	        SlotManager.changgehaska(slotId, "1"); // "1"琛ㄧず绠$悊鍛樻搷浣�
+	        SlotManager.changgehaska(slotId,1); // "1"琛ㄧず绠$悊鍛樻搷浣�
 	        //System.out.println("鍗℃Ы " + slotId + " 鍙栧崱鎴愬姛锛屽凡鏇存柊鍗℃Ы鐘舵��");
 	    }
 	}
 	
 	public void dispose() {
-		// 鍋滄UI鍒锋柊瀹氭椂鍣�
-		if (uiUpdateTimer != null) {
-			uiUpdateTimer.stop();
-		}
-		
-		// 鍋滄涓插彛鐘舵�佺洃鎺�
-		if (serialStatusTimer != null) {
-			serialStatusTimer.stop();
-		}
-		
-		// 鍋滄杞鏌ヨ
-		if (lunxun.isPolling()) {
-			lunxun.stopPolling();
-			//System.out.println("搴旂敤绋嬪簭鍏抽棴锛岃疆璇㈡煡璇㈠凡鍋滄");
-		}
-		
-		// 鍋滄涓插彛鍗忚瑙f瀽鍣紙鏂板锛�
-		if (serialProtocolParser != null) {
-			serialProtocolParser.stop();
-		}
-		
-		// 鍋滄涓插彛鏈嶅姟
-		if (serialPortService != null) {
-			serialPortService.stopCapture();
-			serialPortService.close();
-		}
-		
-		super.dispose();
+		int result = JOptionPane.showConfirmDialog(this, 
+			    "纭畾瑕侀��鍑虹▼搴忓悧锛�", 
+			    "纭閫�鍑�", 
+			    JOptionPane.YES_NO_OPTION);
+			if (result != JOptionPane.YES_OPTION) {
+			    return; // 鐢ㄦ埛鍙栨秷閫�鍑�
+			}
+	    
+	    // 鍋滄UI鍒锋柊瀹氭椂鍣�
+	    if (uiUpdateTimer != null) {
+	        uiUpdateTimer.stop();
+	    }
+	    
+	    // 鍋滄涓插彛鐘舵�佺洃鎺�
+	    if (serialStatusTimer != null) {
+	        serialStatusTimer.stop();
+	    }
+	    
+	    // 鍋滄杞鏌ヨ
+	    if (lunxun.isPolling()) {
+	        lunxun.stopPolling();
+	        //System.out.println("搴旂敤绋嬪簭鍏抽棴锛岃疆璇㈡煡璇㈠凡鍋滄");
+	    }
+	    
+	    // 鍋滄涓插彛鍗忚瑙f瀽鍣紙鏂板锛�
+	    if (serialProtocolParser != null) {
+	        serialProtocolParser.stop();
+	    }
+	    
+	    // 鍋滄涓插彛鏈嶅姟
+	    if (serialPortService != null) {
+	        serialPortService.stopCapture();
+	        serialPortService.close();
+	    }
+	    
+	    super.dispose();
+	    
+	    // 鏂板锛氱‘淇濈▼搴忓畬鍏ㄩ��鍑哄墠閲婃斁鍗曞疄渚嬮攣
+	    try {
+	        // 閫氳繃鍙嶅皠璋冪敤 Homein 鐨勬竻鐞嗘柟娉�
+	        Class<?> homeinClass = Class.forName("home.Homein");
+	        java.lang.reflect.Method cleanupMethod = homeinClass.getDeclaredMethod("cleanupSingleInstanceLock");
+	        cleanupMethod.setAccessible(true);
+	        cleanupMethod.invoke(null);
+	        //System.out.println("鍗曞疄渚嬮攣宸查噴鏀�");
+	    } catch (Exception e) {
+	        System.err.println("閲婃斁鍗曞疄渚嬮攣鏃跺彂鐢熷紓甯�: " + e.getMessage());
+	        // 濡傛灉鍙嶅皠澶辫触锛屽皾璇曠洿鎺ュ叧闂鍙�
+	        try {
+	            java.net.ServerSocket socket = new java.net.ServerSocket();
+	            socket.setReuseAddress(true);
+	            socket.bind(new java.net.InetSocketAddress(9999));
+	            socket.close();
+	            //System.out.println("閫氳繃鐩存帴缁戝畾鏂瑰紡閲婃斁绔彛");
+	        } catch (Exception ex) {
+	            System.err.println("鐩存帴閲婃斁绔彛涔熷け璐�: " + ex.getMessage());
+	        }
+	    }
+	    
+	    // 鏂板锛氱‘淇濈▼搴忓畬鍏ㄩ��鍑�
+	    System.exit(0);
 	}
 	
 	/**
@@ -657,10 +709,10 @@
 	public boolean performCardPickup(int slotId) {
 		try {
 			// 璋冪敤OpenDoor鐢熸垚寮�闂ㄦ寚浠�
-			String command = OpenDoor.openOneDoor(slotId, OpenDoor.TYPE_ISSUE_CARD);
+//			String command = OpenDoor.openOneDoor(slotId, OpenDoor.TYPE_ISSUE_CARD);
 
 			// 浣跨敤Sendmsg鍙戦�佹寚浠ゅ埌涓插彛
-			boolean sendResult = Sendmsg.sendMessage(command);
+			boolean sendResult = Sendmsg.opendoorzhiling(slotId, 2);
 
 			if (sendResult) {				
 				return true;
@@ -796,12 +848,15 @@
 	/**
 	 * 鍚姩UI鍒锋柊瀹氭椂鍣� - 姣�3绉掑埛鏂颁竴娆�
 	 */
+	// 鍦╯tartUIUpdates()鏂规硶涓皟鐢�
 	private void startUIUpdates() {
-		uiUpdateTimer = new Timer(3000, e -> {			
-			updateCardSlotsDisplay();
-			updateStatistics();
-		});
-		uiUpdateTimer.start();
+	    uiUpdateTimer = new Timer(3000, e -> {
+	        ensurePollingRunning(); // 纭繚杞杩愯
+	        ensureSerialParserRunning(); // 纭繚涓插彛瑙f瀽鍣ㄨ繍琛�
+	        updateCardSlotsDisplay();
+	        updateStatistics();
+	    });
+	    uiUpdateTimer.start();
 	}
 	
 	/**
@@ -829,5 +884,42 @@
 	public SlotManager getSlotManager() {
 	    return slotManager;
 	}
+	
+	/**
+	 * 妫�鏌ュ苟纭繚杞鏌ヨ姝e父杩愯
+	 */
+	private void ensurePollingRunning() {
+	    if (!lunxun.isPolling() && lunxun.checkSerialConnection()) {
+	        // 濡傛灉杞鏈繍琛屼絾涓插彛宸茶繛鎺ワ紝鑷姩鍚姩杞
+	        boolean started = lunxun.startPolling();
+	        if (started) {
+	            System.out.println("妫�娴嬪埌杞鏈繍琛岋紝宸茶嚜鍔ㄥ惎鍔�");
+	        }
+	    }
+	}
+	
+	/**
+	 * 纭繚涓插彛瑙f瀽鍣ㄦ甯歌繍琛�
+	 */
+	private void ensureSerialParserRunning() {
+	    // 濡傛灉涓插彛瑙f瀽鍣ㄦ湭杩愯浣嗕覆鍙e凡杩炴帴锛岃嚜鍔ㄥ惎鍔�
+	    if (serialProtocolParser != null && !serialProtocolParser.isRunning() && lunxun.checkSerialConnection()) {
+	        serialProtocolParser.start();
+	        //System.out.println("妫�娴嬪埌涓插彛瑙f瀽鍣ㄦ湭杩愯锛屽凡鑷姩鍚姩");
+	    }
+	}
+	
+	/**
+	 * 鍒濆鍖栦覆鍙hВ鏋愬櫒
+	 */
+	private void initializeSerialParser() {
+	    try {
+	        serialProtocolParser = new SerialProtocolParser();
+	        serialProtocolParser.start();
+	        //System.out.println("涓插彛鍗忚瑙f瀽鍣ㄥ凡鍚姩");
+	    } catch (Exception e) {
+	        System.err.println("鍒濆鍖栦覆鍙hВ鏋愬櫒澶辫触: " + e.getMessage());
+	    }
+	}
 		
 }
\ No newline at end of file

--
Gitblit v1.10.0