| | |
| | | |
| | | import javax.swing.SwingWorker; |
| | | |
| | | import chushihua.SlotManager; |
| | | import chushihua.lunxun; |
| | | import dialog.Charulog; |
| | | import dialog.Dingshidialog; |
| | | import dialog.Errlog; |
| | | import publicway.OpenDoor; |
| | | import publicway.TimestampUtil; |
| | | import xitongshezhi.SystemDebugDialog; |
| | | |
| | | /** |
| | |
| | | * ä¼åå
å使ç¨ï¼é¿å
é¿æ¶é´è¿è¡å
åæ³æ¼ |
| | | */ |
| | | public class Sendmsg { |
| | | // éæä¸²å£æå¡å®ä¾ |
| | | private static volatile SerialPortService serialService = null; |
| | | private static final AtomicBoolean isPortOpen = new AtomicBoolean(false); |
| | | |
| | | // æ¹ä¸ºéfinalï¼æ¯æå¨ææ§å¶ |
| | | private static volatile boolean DEBUG_MODE = false; |
| | | |
| | | // 使ç¨ThreadLocalä¿è¯SimpleDateFormat线ç¨å®å
¨ |
| | | private static final ThreadLocal<SimpleDateFormat> TIME_FORMATTER = |
| | | ThreadLocal.withInitial(() -> new SimpleDateFormat("HH:mm:ss.SSS")); |
| | | |
| | | // ç¼åå符串æå»ºå¨ï¼åå°å¯¹è±¡å建 |
| | | private static final ThreadLocal<StringBuilder> STRING_BUILDER_CACHE = |
| | | ThreadLocal.withInitial(() -> new StringBuilder(128)); |
| | | |
| | | // è®°å½æ´»è·çSwingWorkerï¼ä¾¿äºç®¡ç |
| | | private static final ConcurrentHashMap<String, SwingWorker<?, ?>> ACTIVE_WORKERS = |
| | | new ConcurrentHashMap<>(); |
| | | |
| | | |
| | | /**å塿å¡å¨æ§å¶æå¼æä¸ªæé¨è°ç¨æä»¤ |
| | | * @param int slotIdæé¨ç¼å·1-60 |
| | | * @param int type 1æ¯æå¡å¨åå¡ï¼2æ¯ç®¡çååå¡*/ |
| | | public static boolean opendoorzhiling(int slotId,int type) { |
| | | lunxun.setSendChaxunzhiling(false);//æåæ¥è¯¢æä»¤ |
| | | |
| | | try { |
| | | // è°ç¨OpenDoorçæå¼é¨æä»¤ |
| | | String command = OpenDoor.openOneDoor(slotId, type); |
| | | boolean sendResult = Sendmsg.sendMessage(command); |
| | | |
| | | StringBuilder mesBuilder = STRING_BUILDER_CACHE.get(); |
| | | mesBuilder.setLength(0); // æ¸
空éç¨ |
| | | mesBuilder.append(command).append(";type").append(type).append("æ§å¶æå¼").append(slotId).append("æé¨"); |
| | | String mes = mesBuilder.toString(); |
| | | |
| | | Charulog.logOperation(mes); |
| | | if (lunxun.DEBUG_ENABLED) { |
| | | SystemDebugDialog.appendAsciiData(mes); |
| | | } |
| | | |
| | | return sendResult; |
| | | } finally { |
| | | // ç¡®ä¿æ¢å¤æ¥è¯¢æä»¤ |
| | | lunxun.setSendChaxunzhiling(true); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * æå¼å
¨é¨å¡æ§½çå
¬ç¨éææ¹æ³ |
| | | * @param type æä½ç±»åï¼1-æå¡å¨åå¡ï¼2-管çååå¡ |
| | | */ |
| | | public static void openAllSlots(int type) { |
| | | lunxun.setSendChaxunzhiling(false);//æåæ¥è¯¢æä»¤ |
| | | |
| | | String workerKey = "openAllSlots_" + System.currentTimeMillis(); |
| | | |
| | | // 使ç¨SwingWorkerå¨åå°æ§è¡ï¼é¿å
é»å¡UI |
| | | SwingWorker<Void, Void> worker = new SwingWorker<Void, Void>() { |
| | | @Override |
| | | protected Void doInBackground() throws Exception { |
| | | // é忿塿§½ï¼1-60ï¼ |
| | | for (int slotId = 1; slotId <= 60 && !isCancelled(); slotId++) { |
| | | try { |
| | | // çæå¼é¨æä»¤ |
| | | String command = OpenDoor.openOneDoor(slotId, type); |
| | | |
| | | // åé䏲壿令 |
| | | boolean sent = Sendmsg.sendMessage(command); |
| | | |
| | | if (!sent) { |
| | | Errlog.logOperation("åéæä»¤å°å¡æ§½ " + slotId + " 失败"); |
| | | } |
| | | |
| | | // é´é100msï¼ä½æ£æ¥æ¯å¦è¢«åæ¶ |
| | | Thread.sleep(100); |
| | | |
| | | } catch (InterruptedException e) { |
| | | Thread.currentThread().interrupt(); |
| | | break; // è¢«ä¸ææ¶éåºå¾ªç¯ |
| | | } catch (Exception e) { |
| | | Errlog.logOperation("å¤ç塿§½ " + slotId + " æ¶åçé误: " + e.getMessage()); |
| | | // ç»§ç»å¤çä¸ä¸ä¸ªå¡æ§½ï¼ä¸ä¸æå¾ªç¯ |
| | | } |
| | | } |
| | | return null; |
| | | } |
| | | |
| | | @Override |
| | | protected void done() { |
| | | try { |
| | | // æ¸
çworkerå¼ç¨ |
| | | ACTIVE_WORKERS.remove(workerKey); |
| | | |
| | | // å¯éï¼å®æåå¯ä»¥æ·»å åè°å¤ç |
| | | if (!isCancelled()) { |
| | | StringBuilder messageBuilder = STRING_BUILDER_CACHE.get(); |
| | | messageBuilder.setLength(0); |
| | | |
| | | String types = "管çå"; |
| | | if(type == 1) { |
| | | types = "æå¡å¨æä»¤"; |
| | | } |
| | | messageBuilder.append(types).append("å·²å°å
¨é¨å¡æ§½å·²ç»æå¼è¯·åå¡"); |
| | | String message = messageBuilder.toString(); |
| | | |
| | | Dingshidialog.showTimedDialog(null, 5, message); |
| | | Charulog.logOperation(message); |
| | | } |
| | | } finally { |
| | | // ç¡®ä¿æ¢å¤æ¥è¯¢æä»¤ |
| | | lunxun.setSendChaxunzhiling(true); |
| | | } |
| | | } |
| | | }; |
| | | |
| | | // è®°å½worker便äºç®¡ç |
| | | ACTIVE_WORKERS.put(workerKey, worker); |
| | | worker.execute(); |
| | | } |
| | | |
| | | /** |
| | | * åæ¶æææ£å¨æ§è¡çä»»å¡ |
| | | */ |
| | | public static void cancelAllTasks() { |
| | | ACTIVE_WORKERS.forEach((key, worker) -> { |
| | | if (!worker.isDone()) { |
| | | worker.cancel(true); |
| | | } |
| | | }); |
| | | ACTIVE_WORKERS.clear(); |
| | | } |
| | | |
| | | /** |
| | | * è®¾ç½®ä¸²å£æå¡å®ä¾ |
| | | * @param service 䏲壿å¡å®ä¾ |
| | | * @param open 䏲壿¯å¦æå¼ |
| | | */ |
| | | public static void setSerialService(SerialPortService service, boolean open) { |
| | | serialService = service; |
| | | isPortOpen.set(open); |
| | | } |
| | | |
| | | /** |
| | | * è·å䏲壿å¡å®ä¾ |
| | | */ |
| | | public static SerialPortService getSerialService() { |
| | | return serialService; |
| | | } |
| | | |
| | | /** |
| | | * åéæ¶æ¯å°ä¸²å£ï¼å¸¦éè¯æºå¶ï¼ |
| | | */ |
| | | public static boolean sendMessage(String message) { |
| | | if (!isPortOpen.get() || serialService == null) { |
| | | Errlog.logOperation("[" + getCurrentTime() + "] 䏲壿ªæå¼ï¼æ æ³åéæ°æ®"); |
| | | return false; |
| | | } |
| | | |
| | | if (message == null || message.trim().isEmpty()) { |
| | | Errlog.logOperation("[" + getCurrentTime() + "] åéæ°æ®ä¸ºç©º"); |
| | | return false; |
| | | } |
| | | |
| | | String text = message.trim(); |
| | | int retryCount = 0; |
| | | final int MAX_RETRY = 2; |
| | | |
| | | while (retryCount <= MAX_RETRY) { |
| | | try { |
| | | byte[] data = hexStringToByteArray(text); |
| | | if (data == null) { |
| | | Errlog.logOperation("[" + getCurrentTime() + "] HEX转æ¢å¤±è´¥ï¼æ°æ®: " + text); |
| | | return false; |
| | | } |
| | | |
| | | boolean sendResult = serialService.send(data); |
| | | |
| | | if (sendResult) { |
| | | if (DEBUG_MODE) { |
| | | System.out.println("[" + getCurrentTime() + "] åéæå: " + text.toUpperCase()); |
| | | } |
| | | return true; |
| | | } else { |
| | | retryCount++; |
| | | if (retryCount <= MAX_RETRY) { |
| | | Errlog.logOperation("[" + getCurrentTime() + "] åéå¤±è´¥ï¼æ£å¨éè¯ (" + retryCount + "/" + MAX_RETRY + ")"); |
| | | try { |
| | | Thread.sleep(50); // éè¯åçå¾
|
| | | } catch (InterruptedException e) { |
| | | Thread.currentThread().interrupt(); |
| | | break; |
| | | } |
| | | } else { |
| | | if (DEBUG_MODE) { |
| | | Errlog.logOperation("[" + getCurrentTime() + "] 串å£åéå¤±è´¥ï¼æä»¤: " + text.toUpperCase()); |
| | | Errlog.logOperation("[" + getCurrentTime() + "] 串å£ç¶æ - æå¼: " + isPortOpen.get() + ", æå¡: " + (serialService != null)); |
| | | if (serialService != null) { |
| | | Errlog.logOperation("[" + getCurrentTime() + "] 䏲壿å¡ç¶æ - æ¯å¦æå¼: " + serialService.isOpen()); |
| | | } |
| | | } |
| | | return false; |
| | | } |
| | | } |
| | | } catch (Exception e) { |
| | | Errlog.logOperation("[" + getCurrentTime() + "] åéå¼å¸¸ï¼æä»¤: " + text.toUpperCase()); |
| | | if (DEBUG_MODE) { |
| | | e.printStackTrace(); |
| | | } |
| | | return false; |
| | | } |
| | | } |
| | | |
| | | return false; |
| | | } |
| | | |
| | | /** |
| | | * æ£æ¥ä¸²å£æ¯å¦å·²æå¼ |
| | | * @return 䏲壿å¼ç¶æ |
| | | */ |
| | | public static boolean isPortOpen() { |
| | | boolean open = isPortOpen.get() && serialService != null; |
| | | if (!open && DEBUG_MODE) { |
| | | Errlog.logOperation("[" + getCurrentTime() + "] 串å£ç¶ææ£æ¥: æªæå¼"); |
| | | } |
| | | return open; |
| | | } |
| | | |
| | | /** |
| | | * HEXå符串转åèæ°ç» |
| | | * @param s HEXå符串 |
| | | * @return åèæ°ç» |
| | | */ |
| | | private static byte[] hexStringToByteArray(String s) { |
| | | if (s == null || s.isEmpty()) { |
| | | return new byte[0]; |
| | | } |
| | | |
| | | s = s.replaceAll("\\s+", ""); // ç§»é¤ç©ºæ ¼ |
| | | int len = s.length(); |
| | | if (len % 2 != 0) { |
| | | throw new IllegalArgumentException("HEXå符串é¿åº¦å¿
é¡»ä¸ºå¶æ°ï¼å½åé¿åº¦: " + len + ", æ°æ®: " + s); |
| | | } |
| | | |
| | | byte[] data = new byte[len / 2]; |
| | | for (int i = 0; i < len; i += 2) { |
| | | int high = Character.digit(s.charAt(i), 16); |
| | | int low = Character.digit(s.charAt(i + 1), 16); |
| | | |
| | | if (high == -1 || low == -1) { |
| | | throw new IllegalArgumentException("æ æçHEXå符: '" + s.charAt(i) + s.charAt(i + 1) + "' å¨ä½ç½® " + i + "-" + (i+1) + ", 宿´æ°æ®: " + s); |
| | | } |
| | | |
| | | data[i / 2] = (byte) ((high << 4) + low); |
| | | } |
| | | return data; |
| | | } |
| | | |
| | | /** |
| | | * åèæ°ç»è½¬HEXå符串 |
| | | * @param bytes åèæ°ç» |
| | | * @return HEXå符串 |
| | | */ |
| | | public static String bytesToHex(byte[] bytes) { |
| | | if (bytes == null || bytes.length == 0) { |
| | | return ""; |
| | | } |
| | | |
| | | StringBuilder sb = STRING_BUILDER_CACHE.get(); |
| | | sb.setLength(0); |
| | | for (byte b : bytes) { |
| | | sb.append(String.format("%02x", b)); |
| | | } |
| | | return sb.toString(); |
| | | } |
| | | |
| | | /** |
| | | * è·åå½åæ¶é´å符串 |
| | | * @return æ¶é´å符串 |
| | | */ |
| | | private static String getCurrentTime() { |
| | | return TIME_FORMATTER.get().format(new Date()); |
| | | } |
| | | |
| | | /** |
| | | * å¯ç¨è°è¯æ¨¡å¼ |
| | | */ |
| | | public static void enableDebugMode() { |
| | | DEBUG_MODE = true; |
| | | System.out.println("[" + getCurrentTime() + "] Sendmsgè°è¯æ¨¡å¼å·²å¯ç¨"); |
| | | } |
| | | |
| | | /** |
| | | * ç¦ç¨è°è¯æ¨¡å¼ |
| | | */ |
| | | public static void disableDebugMode() { |
| | | DEBUG_MODE = false; |
| | | System.out.println("[" + getCurrentTime() + "] Sendmsgè°è¯æ¨¡å¼å·²ç¦ç¨"); |
| | | } |
| | | |
| | | /** |
| | | * 设置è°è¯æ¨¡å¼ |
| | | */ |
| | | public static void setDebugMode(boolean debug) { |
| | | DEBUG_MODE = debug; |
| | | System.out.println("[" + getCurrentTime() + "] Sendmsgè°è¯æ¨¡å¼: " + (debug ? "å¯ç¨" : "ç¦ç¨")); |
| | | } |
| | | |
| | | /** |
| | | * æ¸
çèµæºï¼é²æ¢å
åæ³æ¼ |
| | | */ |
| | | public static void cleanup() { |
| | | cancelAllTasks(); |
| | | |
| | | // æ¸
çThreadLocalèµæº |
| | | TIME_FORMATTER.remove(); |
| | | STRING_BUILDER_CACHE.remove(); |
| | | |
| | | if (DEBUG_MODE) { |
| | | System.out.println("[" + getCurrentTime() + "] Sendmsgèµæºæ¸
ç宿"); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * è·åæ´»è·ä»»å¡æ°é |
| | | */ |
| | | public static int getActiveTaskCount() { |
| | | return ACTIVE_WORKERS.size(); |
| | | } |
| | | // éæä¸²å£æå¡å®ä¾ |
| | | private static volatile SerialPortService serialService = null; |
| | | private static final AtomicBoolean isPortOpen = new AtomicBoolean(false); |
| | | |
| | | // æ¹ä¸ºéfinalï¼æ¯æå¨ææ§å¶ |
| | | private static volatile boolean DEBUG_MODE = false; |
| | | |
| | | // 使ç¨ThreadLocalä¿è¯SimpleDateFormat线ç¨å®å
¨ |
| | | private static final ThreadLocal<SimpleDateFormat> TIME_FORMATTER = |
| | | ThreadLocal.withInitial(() -> new SimpleDateFormat("HH:mm:ss.SSS")); |
| | | |
| | | // ç¼åå符串æå»ºå¨ï¼åå°å¯¹è±¡å建 |
| | | private static final ThreadLocal<StringBuilder> STRING_BUILDER_CACHE = |
| | | ThreadLocal.withInitial(() -> new StringBuilder(128)); |
| | | |
| | | // è®°å½æ´»è·çSwingWorkerï¼ä¾¿äºç®¡ç |
| | | private static final ConcurrentHashMap<String, SwingWorker<?, ?>> ACTIVE_WORKERS = |
| | | new ConcurrentHashMap<>(); |
| | | |
| | | |
| | | /**å塿å¡å¨æ§å¶æå¼æä¸ªæé¨è°ç¨æä»¤ |
| | | * @param int slotIdæé¨ç¼å·1-60 |
| | | * @param int type 1æ¯æå¡å¨åå¡ï¼2æ¯ç®¡çååå¡*/ |
| | | public static boolean opendoorzhiling(int slotId,int type) { |
| | | lunxun.setSendChaxunzhiling(false);//æåæ¥è¯¢æä»¤ |
| | | |
| | | try { |
| | | // è°ç¨OpenDoorçæå¼é¨æä»¤ |
| | | String command = OpenDoor.openOneDoor(slotId, type); |
| | | boolean sendResult = Sendmsg.sendMessage(command); |
| | | |
| | | StringBuilder mesBuilder = STRING_BUILDER_CACHE.get(); |
| | | mesBuilder.setLength(0); // æ¸
空éç¨ |
| | | mesBuilder.append(command).append(";type").append(type).append("æ§å¶æå¼").append(slotId).append("æé¨"); |
| | | String mes = mesBuilder.toString(); |
| | | |
| | | // è·åå½åæ¶é´ |
| | | String currentTime = TimestampUtil.getTimestamp(); |
| | | // æ´æ°å¡æ§½çæ¶å°å塿令æ¶é´ |
| | | SlotManager.slotArray[slotId-1].setReceiveCardCommandTime(currentTime); |
| | | |
| | | Charulog.logOperation(mes); |
| | | if (lunxun.DEBUG_ENABLED) { |
| | | SystemDebugDialog.appendAsciiData(mes); |
| | | } |
| | | |
| | | return sendResult; |
| | | } finally { |
| | | // ç¡®ä¿æ¢å¤æ¥è¯¢æä»¤ |
| | | lunxun.setSendChaxunzhiling(true); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * æå¼å
¨é¨å¡æ§½çå
¬ç¨éææ¹æ³ |
| | | * @param type æä½ç±»åï¼1-æå¡å¨åå¡ï¼2-管çååå¡ |
| | | */ |
| | | public static void openAllSlots(int type) { |
| | | lunxun.setSendChaxunzhiling(false);//æåæ¥è¯¢æä»¤ |
| | | |
| | | String workerKey = "openAllSlots_" + System.currentTimeMillis(); |
| | | |
| | | // 使ç¨SwingWorkerå¨åå°æ§è¡ï¼é¿å
é»å¡UI |
| | | SwingWorker<Void, Void> worker = new SwingWorker<Void, Void>() { |
| | | @Override |
| | | protected Void doInBackground() throws Exception { |
| | | // é忿塿§½ï¼1-60ï¼ |
| | | for (int slotId = 1; slotId <= 60 && !isCancelled(); slotId++) { |
| | | try { |
| | | // çæå¼é¨æä»¤ |
| | | String command = OpenDoor.openOneDoor(slotId, type); |
| | | |
| | | // åé䏲壿令 |
| | | boolean sent = Sendmsg.sendMessage(command); |
| | | |
| | | if (!sent) { |
| | | Errlog.logOperation("åéæä»¤å°å¡æ§½ " + slotId + " 失败"); |
| | | }else { |
| | | // è·åå½åæ¶é´ |
| | | String currentTime = TimestampUtil.getTimestamp(); |
| | | // æ´æ°å¡æ§½çæ¶å°å塿令æ¶é´ |
| | | SlotManager.slotArray[slotId-1].setReceiveCardCommandTime(currentTime); |
| | | } |
| | | |
| | | // é´é100msï¼ä½æ£æ¥æ¯å¦è¢«åæ¶ |
| | | Thread.sleep(100); |
| | | |
| | | } catch (InterruptedException e) { |
| | | Thread.currentThread().interrupt(); |
| | | break; // è¢«ä¸ææ¶éåºå¾ªç¯ |
| | | } catch (Exception e) { |
| | | Errlog.logOperation("å¤ç塿§½ " + slotId + " æ¶åçé误: " + e.getMessage()); |
| | | // ç»§ç»å¤çä¸ä¸ä¸ªå¡æ§½ï¼ä¸ä¸æå¾ªç¯ |
| | | } |
| | | } |
| | | return null; |
| | | } |
| | | |
| | | @Override |
| | | protected void done() { |
| | | try { |
| | | // æ¸
çworkerå¼ç¨ |
| | | ACTIVE_WORKERS.remove(workerKey); |
| | | |
| | | // å¯éï¼å®æåå¯ä»¥æ·»å åè°å¤ç |
| | | if (!isCancelled()) { |
| | | StringBuilder messageBuilder = STRING_BUILDER_CACHE.get(); |
| | | messageBuilder.setLength(0); |
| | | |
| | | String types = "管çå"; |
| | | if(type == 1) { |
| | | types = "æå¡å¨æä»¤"; |
| | | } |
| | | messageBuilder.append(types).append("å·²å°å
¨é¨å¡æ§½å·²ç»æå¼è¯·åå¡"); |
| | | String message = messageBuilder.toString(); |
| | | |
| | | Dingshidialog.showTimedDialog(null, 5, message); |
| | | Charulog.logOperation(message); |
| | | } |
| | | } finally { |
| | | // ç¡®ä¿æ¢å¤æ¥è¯¢æä»¤ |
| | | lunxun.setSendChaxunzhiling(true); |
| | | } |
| | | } |
| | | }; |
| | | |
| | | // è®°å½worker便äºç®¡ç |
| | | ACTIVE_WORKERS.put(workerKey, worker); |
| | | worker.execute(); |
| | | } |
| | | |
| | | /** |
| | | * åæ¶æææ£å¨æ§è¡çä»»å¡ |
| | | */ |
| | | public static void cancelAllTasks() { |
| | | ACTIVE_WORKERS.forEach((key, worker) -> { |
| | | if (!worker.isDone()) { |
| | | worker.cancel(true); |
| | | } |
| | | }); |
| | | ACTIVE_WORKERS.clear(); |
| | | } |
| | | |
| | | /** |
| | | * è®¾ç½®ä¸²å£æå¡å®ä¾ |
| | | * @param service 䏲壿å¡å®ä¾ |
| | | * @param open 䏲壿¯å¦æå¼ |
| | | */ |
| | | public static void setSerialService(SerialPortService service, boolean open) { |
| | | serialService = service; |
| | | isPortOpen.set(open); |
| | | } |
| | | |
| | | /** |
| | | * è·å䏲壿å¡å®ä¾ |
| | | */ |
| | | public static SerialPortService getSerialService() { |
| | | return serialService; |
| | | } |
| | | |
| | | /** |
| | | * åéæ¶æ¯å°ä¸²å£ï¼å¸¦éè¯æºå¶ï¼ |
| | | */ |
| | | public static boolean sendMessage(String message) { |
| | | if (!isPortOpen.get() || serialService == null) { |
| | | Errlog.logOperation("[" + getCurrentTime() + "] 䏲壿ªæå¼ï¼æ æ³åéæ°æ®"); |
| | | return false; |
| | | } |
| | | |
| | | if (message == null || message.trim().isEmpty()) { |
| | | Errlog.logOperation("[" + getCurrentTime() + "] åéæ°æ®ä¸ºç©º"); |
| | | return false; |
| | | } |
| | | |
| | | String text = message.trim(); |
| | | int retryCount = 0; |
| | | final int MAX_RETRY = 2; |
| | | |
| | | while (retryCount <= MAX_RETRY) { |
| | | try { |
| | | byte[] data = hexStringToByteArray(text); |
| | | if (data == null) { |
| | | Errlog.logOperation("[" + getCurrentTime() + "] HEX转æ¢å¤±è´¥ï¼æ°æ®: " + text); |
| | | return false; |
| | | } |
| | | |
| | | boolean sendResult = serialService.send(data); |
| | | |
| | | if (sendResult) { |
| | | if (DEBUG_MODE) { |
| | | System.out.println("[" + getCurrentTime() + "] åéæå: " + text.toUpperCase()); |
| | | } |
| | | return true; |
| | | } else { |
| | | retryCount++; |
| | | if (retryCount <= MAX_RETRY) { |
| | | Errlog.logOperation("[" + getCurrentTime() + "] åéå¤±è´¥ï¼æ£å¨éè¯ (" + retryCount + "/" + MAX_RETRY + ")"); |
| | | try { |
| | | Thread.sleep(50); // éè¯åçå¾
|
| | | } catch (InterruptedException e) { |
| | | Thread.currentThread().interrupt(); |
| | | break; |
| | | } |
| | | } else { |
| | | if (DEBUG_MODE) { |
| | | Errlog.logOperation("[" + getCurrentTime() + "] 串å£åéå¤±è´¥ï¼æä»¤: " + text.toUpperCase()); |
| | | Errlog.logOperation("[" + getCurrentTime() + "] 串å£ç¶æ - æå¼: " + isPortOpen.get() + ", æå¡: " + (serialService != null)); |
| | | if (serialService != null) { |
| | | Errlog.logOperation("[" + getCurrentTime() + "] 䏲壿å¡ç¶æ - æ¯å¦æå¼: " + serialService.isOpen()); |
| | | } |
| | | } |
| | | return false; |
| | | } |
| | | } |
| | | } catch (Exception e) { |
| | | Errlog.logOperation("[" + getCurrentTime() + "] åéå¼å¸¸ï¼æä»¤: " + text.toUpperCase()); |
| | | if (DEBUG_MODE) { |
| | | e.printStackTrace(); |
| | | } |
| | | return false; |
| | | } |
| | | } |
| | | |
| | | return false; |
| | | } |
| | | |
| | | /** |
| | | * æ£æ¥ä¸²å£æ¯å¦å·²æå¼ |
| | | * @return 䏲壿å¼ç¶æ |
| | | */ |
| | | public static boolean isPortOpen() { |
| | | boolean open = isPortOpen.get() && serialService != null; |
| | | if (!open && DEBUG_MODE) { |
| | | Errlog.logOperation("[" + getCurrentTime() + "] 串å£ç¶ææ£æ¥: æªæå¼"); |
| | | } |
| | | return open; |
| | | } |
| | | |
| | | /** |
| | | * HEXå符串转åèæ°ç» |
| | | * @param s HEXå符串 |
| | | * @return åèæ°ç» |
| | | */ |
| | | private static byte[] hexStringToByteArray(String s) { |
| | | if (s == null || s.isEmpty()) { |
| | | return new byte[0]; |
| | | } |
| | | |
| | | s = s.replaceAll("\\s+", ""); // ç§»é¤ç©ºæ ¼ |
| | | int len = s.length(); |
| | | if (len % 2 != 0) { |
| | | throw new IllegalArgumentException("HEXå符串é¿åº¦å¿
é¡»ä¸ºå¶æ°ï¼å½åé¿åº¦: " + len + ", æ°æ®: " + s); |
| | | } |
| | | |
| | | byte[] data = new byte[len / 2]; |
| | | for (int i = 0; i < len; i += 2) { |
| | | int high = Character.digit(s.charAt(i), 16); |
| | | int low = Character.digit(s.charAt(i + 1), 16); |
| | | |
| | | if (high == -1 || low == -1) { |
| | | throw new IllegalArgumentException("æ æçHEXå符: '" + s.charAt(i) + s.charAt(i + 1) + "' å¨ä½ç½® " + i + "-" + (i+1) + ", 宿´æ°æ®: " + s); |
| | | } |
| | | |
| | | data[i / 2] = (byte) ((high << 4) + low); |
| | | } |
| | | return data; |
| | | } |
| | | |
| | | /** |
| | | * åèæ°ç»è½¬HEXå符串 |
| | | * @param bytes åèæ°ç» |
| | | * @return HEXå符串 |
| | | */ |
| | | public static String bytesToHex(byte[] bytes) { |
| | | if (bytes == null || bytes.length == 0) { |
| | | return ""; |
| | | } |
| | | |
| | | StringBuilder sb = STRING_BUILDER_CACHE.get(); |
| | | sb.setLength(0); |
| | | for (byte b : bytes) { |
| | | sb.append(String.format("%02x", b)); |
| | | } |
| | | return sb.toString(); |
| | | } |
| | | |
| | | /** |
| | | * è·åå½åæ¶é´å符串 |
| | | * @return æ¶é´å符串 |
| | | */ |
| | | private static String getCurrentTime() { |
| | | return TIME_FORMATTER.get().format(new Date()); |
| | | } |
| | | |
| | | /** |
| | | * å¯ç¨è°è¯æ¨¡å¼ |
| | | */ |
| | | public static void enableDebugMode() { |
| | | DEBUG_MODE = true; |
| | | System.out.println("[" + getCurrentTime() + "] Sendmsgè°è¯æ¨¡å¼å·²å¯ç¨"); |
| | | } |
| | | |
| | | /** |
| | | * ç¦ç¨è°è¯æ¨¡å¼ |
| | | */ |
| | | public static void disableDebugMode() { |
| | | DEBUG_MODE = false; |
| | | System.out.println("[" + getCurrentTime() + "] Sendmsgè°è¯æ¨¡å¼å·²ç¦ç¨"); |
| | | } |
| | | |
| | | /** |
| | | * 设置è°è¯æ¨¡å¼ |
| | | */ |
| | | public static void setDebugMode(boolean debug) { |
| | | DEBUG_MODE = debug; |
| | | System.out.println("[" + getCurrentTime() + "] Sendmsgè°è¯æ¨¡å¼: " + (debug ? "å¯ç¨" : "ç¦ç¨")); |
| | | } |
| | | |
| | | /** |
| | | * æ¸
çèµæºï¼é²æ¢å
åæ³æ¼ |
| | | */ |
| | | public static void cleanup() { |
| | | cancelAllTasks(); |
| | | |
| | | // æ¸
çThreadLocalèµæº |
| | | TIME_FORMATTER.remove(); |
| | | STRING_BUILDER_CACHE.remove(); |
| | | |
| | | if (DEBUG_MODE) { |
| | | System.out.println("[" + getCurrentTime() + "] Sendmsgèµæºæ¸
ç宿"); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * è·åæ´»è·ä»»å¡æ°é |
| | | */ |
| | | public static int getActiveTaskCount() { |
| | | return ACTIVE_WORKERS.size(); |
| | | } |
| | | } |