From 11ae0985443da422a7031a68375abd16a0c129f8 Mon Sep 17 00:00:00 2001 From: brutzman <brutzman@nps.edu> Date: Sun, 19 Jun 2022 17:21:09 -0700 Subject: [PATCH] test recording use date, time values rather than byte array --- .../dis7/utilities/stream/PduRecorder.java | 67 +++++++++++++++---- 1 file changed, 53 insertions(+), 14 deletions(-) diff --git a/src/edu/nps/moves/dis7/utilities/stream/PduRecorder.java b/src/edu/nps/moves/dis7/utilities/stream/PduRecorder.java index b5e16a3cea..1fcff7fc82 100644 --- a/src/edu/nps/moves/dis7/utilities/stream/PduRecorder.java +++ b/src/edu/nps/moves/dis7/utilities/stream/PduRecorder.java @@ -16,6 +16,9 @@ import java.nio.CharBuffer; import java.nio.charset.Charset; import java.nio.file.Path; import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.Arrays; import java.util.Base64; @@ -107,12 +110,14 @@ public class PduRecorder // implements PduReceiver private DisThreadedNetworkInterface disThreadedNetworkInterface; private DisThreadedNetworkInterface.RawPduListener disRawPduListener; - private Long startNanoTime = null; - private StringBuilder sb = new StringBuilder(); - private Base64.Encoder base64Encoder = Base64.getEncoder(); - private int pduCount = 0; // debug - private boolean headerWritten = false; - private boolean running = true; // starts recording by default + private long startNanoTime = -1; // sentinel + private StringBuilder sb = new StringBuilder(); + private Base64.Encoder base64Encoder = Base64.getEncoder(); + private int pduCount = 0; // debug + private boolean headerWritten = false; + private boolean running = true; // starts recording by default + private boolean readableTimeStamp = true; // use normal date, time strings vice bytes + private long sessionDuration = -1; private void initialize() { @@ -309,19 +314,25 @@ public class PduRecorder // implements PduReceiver public void receivePdu(byte[] newBuffer, int newLength) { if (java.util.Arrays.equals(newBuffer, oldBuffer)) - System.err.println ("PduRecorder warning: PDU newBuffer equals PDU oldBuffer"); // debug + System.err.println ("PduRecorder.receivePdu() warning: PDU newBuffer equals PDU oldBuffer"); // debug if(!isRunning()) return; - long packetReceivedNanoTime = System.nanoTime(); - if (startNanoTime == null) + DateTimeFormatter timeFormatterSeconds = DateTimeFormatter.ofPattern("HH:mm:ss"); + DateTimeFormatter timeFormatterMilliseconds = DateTimeFormatter.ofPattern("HH:mm:ss.SSS"); + LocalTime localTime = LocalTime.now(); + String localDateString = LocalDate.now().toString(); + String localTimeString = localTime.format(timeFormatterMilliseconds); + long packetReceivedNanoTime = localTime.toNanoOfDay(); // formerly System.nanoTime(); + if (startNanoTime == -1) startNanoTime = packetReceivedNanoTime; + sessionDuration = packetReceivedNanoTime - startNanoTime; // DIS timestamp is 8 bytes in length, converted from Java long time into byte array byte[] timeByteArray = Longs.toByteArray(packetReceivedNanoTime - startNanoTime); //System.out.println(TRACE_PREFIX + "wrote time "+(packetReceivedNanoTime - startNanoTime)); // debug - + byte[] byteBufferSized = Arrays.copyOf(newBuffer, newLength); DisPduType pduType; @@ -359,18 +370,22 @@ public class PduRecorder // implements PduReceiver break; case ENCODING_PLAINTEXT: - // by Tobias Brennenstuhl Spring 2020 + if (isReadableTimeStamp()) + { + sb.append(localDateString).append(",").append(localTimeString); + } // Remove square brackets to end up with pure CSV - sb.append(Arrays.toString(timeByteArray).replace(" ", "").replace("[","").replace("]","")); - sb.append(','); + else sb.append(Arrays.toString(timeByteArray).replace(" ", "").replace("[","").replace("]","")); + sb.append(","); sb.append(Arrays.toString(byteBufferSized).replace(" ", "").replace("[","").replace("]","")); - sb.append(" # "); + sb.append(" # "); // append comment showing pduType pduType = DisPduType.getEnumForValue(Byte.toUnsignedInt(byteBufferSized[2])); // 3rd byte sb.append(pduType); break; // TODO test reader still works without extra [square brackets] // TODO add option for TSV vice CSV + // TODO ENCODING_XML default: if (ENCODING_OPTIONS_LIST.contains(encodingPduLog)) @@ -807,4 +822,28 @@ public class PduRecorder // implements PduReceiver public Path getOutputDirectoryPath() { return outputDirectoryPath; } + + /** + * Whether to provide date/time in readable form, otherwise use byte array + * @return whether readableTimeStamp is used + */ + public boolean isReadableTimeStamp() { + return readableTimeStamp; + } + + /** + * Set whether to provide date/time in readable form, otherwise use byte array + * @param readableTimeStamp whether readableTimeStamp to true + */ + public void setReadableTimeStamp(boolean readableTimeStamp) { + this.readableTimeStamp = readableTimeStamp; + } + + /** + * get duration of the current session, measured from time of first PDU receipt + * @return the sessionDuration + */ + public long getSessionDuration() { + return sessionDuration; + } } -- GitLab