| | |
| | | package dell_system; |
| | | import com.fazecast.jSerialComm.SerialPort; |
| | | import Dell55aa.Dell55AA12HighPerf; |
| | | import Dell55aa.Dell55AA12HighPerf.ParseResult; |
| | | import dell55AAData.PacketParser; |
| | | import javax.swing.*; |
| | | import javax.swing.border.TitledBorder; |
| | | import javax.swing.event.PopupMenuEvent; |
| | |
| | | |
| | | SwingUtilities.invokeLater(() -> { |
| | | packetCounter++; |
| | | lblPacketCount.setText(String.format(messages.getString("packet.count.format"), packetCounter)); // 更新计数标签 |
| | | lblPacketCount.setText(String.format(messages.getString("packet.count.format"), packetCounter)); |
| | | |
| | | try { |
| | | // 将字节数据转换为十六进制字符串 |
| | | String hexData = bytesToHex(data).toUpperCase(); |
| | | // 使用Dell55AA12HighPerf解析 |
| | | ParseResult result = Dell55AA12HighPerf.parse(hexData); |
| | | |
| | | if (result != null) { |
| | | // 构建状态字符串 |
| | | String buttonStatus = result.sosButtonPressed ? messages.getString("yes") : messages.getString("no"); |
| | | String staticStatus = result.isStatic ? messages.getString("yes") : messages.getString("no"); |
| | | String sleepStatus = result.isSleeping ? messages.getString("yes") : messages.getString("no"); |
| | | String vibrationStatus = (result.vibrationState == 1) ? messages.getString("on") : messages.getString("off"); |
| | | String uwbStatus = result.tagRemoved ? messages.getString("off") : messages.getString("on"); |
| | | |
| | | // 构建基站信息 |
| | | StringBuilder anchorIds = new StringBuilder(); |
| | | StringBuilder distances = new StringBuilder(); |
| | | StringBuilder anchorPowers = new StringBuilder(); |
| | | |
| | | for (int i = 0; i < result.anchorCount; i++) { |
| | | if (i > 0) { |
| | | anchorIds.append(","); |
| | | distances.append(","); |
| | | anchorPowers.append(","); |
| | | } |
| | | anchorIds.append(result.anchorIds[i]); |
| | | distances.append(result.distances[i]); |
| | | anchorPowers.append(result.anchorPowers[i]); |
| | | } |
| | | |
| | | // 格式化输出 |
| | | StringBuilder parsedOutput = new StringBuilder(); |
| | | |
| | | // 添加时间戳(如果勾选) |
| | | if (chkTimestamp.isSelected()) { |
| | | parsedOutput.append("[").append(sdf.format(new Date())).append("]\n"); |
| | | } |
| | | |
| | | parsedOutput.append(String.format( |
| | | "%s: %d\n%s: %d\n%s: %d%%\n%s: %s[%s], %s[%s], %s[%s], %s[%s], %s[%s]\n%s: %d\n%s: %d\n%s: (%s)\n%s: (%s)\n%s: (%s)\n\n", |
| | | messages.getString("label.id"), result.tagId, |
| | | messages.getString("label.sequence"), result.sequenceNum, |
| | | messages.getString("label.power"), result.power, |
| | | messages.getString("label.status"), |
| | | messages.getString("status.button"), buttonStatus, |
| | | messages.getString("status.static"), staticStatus, |
| | | messages.getString("status.sleeping"), sleepStatus, |
| | | messages.getString("status.vibration"), vibrationStatus, |
| | | messages.getString("status.uwb_switch"), uwbStatus, |
| | | messages.getString("label.tag_height"), result.tagHeight, |
| | | messages.getString("label.anchor_count"), result.anchorCount, |
| | | messages.getString("label.anchor_ids"), anchorIds.toString(), |
| | | messages.getString("label.distances"), distances.toString(), |
| | | messages.getString("label.anchor_powers"), anchorPowers.toString() |
| | | )); |
| | | |
| | | txtParsedData.append(parsedOutput.toString()); |
| | | String parsed = PacketParser.parse(data, messages, chkTimestamp.isSelected()); |
| | | txtParsedData.append(parsed); |
| | | txtParsedData.setCaretPosition(txtParsedData.getDocument().getLength()); |
| | | lblParseStatus.setText(String.format("%s (Packets: %d)", messages.getString("parser.ready"), packetCounter)); |
| | | } else { |
| | | StringBuilder invalidMsg = new StringBuilder(); |
| | | // 添加时间戳(如果勾选) |
| | | if (chkTimestamp.isSelected()) { |
| | | |
| | | invalidMsg.append("[").append(sdf.format(new Date())).append("]\n"); |
| | | } |
| | | invalidMsg.append(String.format("[Packet #%d] Not a valid 55AA12 packet\n\n", packetCounter)); |
| | | |
| | | txtParsedData.append(invalidMsg.toString()); |
| | | lblParseStatus.setText(String.format("Parser: Invalid (Packets: %d)", packetCounter)); |
| | | } |
| | | } catch (Exception e) { |
| | | StringBuilder errorMsg = new StringBuilder(); |
| | | // 添加时间戳(如果勾选) |
| | | if (chkTimestamp.isSelected()) { |
| | | errorMsg.append("[").append(sdf.format(new Date())).append("]\n"); |
| | | } |
| | | errorMsg.append(String.format("[Packet #%d] Parse error: %s\n\n", |
| | | packetCounter, e.getMessage())); |
| | | |
| | | txtParsedData.append(errorMsg.toString()); |
| | | lblParseStatus.setText( |
| | | String.format("%s (Packets: %d)", |
| | | messages.getString("parser.ready"), packetCounter)); |
| | | } catch (Exception ex) { |
| | | StringBuilder sb = new StringBuilder(); |
| | | if (chkTimestamp.isSelected()) sb.append('[').append(sdf.format(new Date())).append("]\n"); |
| | | sb.append(String.format("[Packet #%d] Parse error: %s\n\n", packetCounter, ex.getMessage())); |
| | | txtParsedData.append(sb.toString()); |
| | | lblParseStatus.setText(String.format("Parser: Error (Packets: %d)", packetCounter)); |
| | | } |
| | | }); |
| | | } |
| | | |
| | | /* ================= UI 更新 ================= */ |
| | | private void appendRawData(byte[] bytes) { |
| | | SwingUtilities.invokeLater(() -> { |
| | |
| | | } |
| | | }); |
| | | } |
| | | } |
| | | |
| | | // 新增辅助方法:字节数组转十六进制字符串 |
| | | private String bytesToHex(byte[] bytes) { |
| | | StringBuilder sb = new StringBuilder(); |
| | | for (byte b : bytes) { |
| | | sb.append(String.format("%02X", b)); |
| | | } |
| | | return sb.toString(); |
| | | } |
| | | |
| | | // 修改clearDisplay方法 |