diff --git a/src/edu/nps/moves/dis7/utilities/DisChannel.java b/src/edu/nps/moves/dis7/utilities/DisChannel.java index 16a366781b10475310a8d42fc9f24a7c45ce5866..aa30ee2336257251c95c7c888206ef5051201303 100644 --- a/src/edu/nps/moves/dis7/utilities/DisChannel.java +++ b/src/edu/nps/moves/dis7/utilities/DisChannel.java @@ -272,25 +272,26 @@ public class DisChannel } /** - * Send a single Protocol Data Unit (PDU) of any type after setting given timestamp - * @param disTimeStamp timestamp for this PDU + * Send a single Protocol Data Unit (PDU) of any type, after setting the PDU with given timestamp in milliseconds + * @param disTimeStamp timestamp for this PDU, milliseconds since epoch * @param pdu the pdu to send */ public void sendSinglePdu(int disTimeStamp, Pdu pdu) { - if (getDisNetworkInterface() == null) - setUpNetworkInterface(); // ensure connected - try - { - pdu.setTimestamp(disTimeStamp); - getDisNetworkInterface().send(pdu); - Thread.sleep(100); // TODO consider refactoring the wait logic and moving externally - } - catch (InterruptedException ex) - { - System.err.println(this.getClass().getSimpleName() + " Error sending PDU: " + ex.getLocalizedMessage()); - System.exit(1); - } + pdu.setTimestamp(disTimeStamp); + sendSinglePdu(pdu); + } + + /** + * Send a single Protocol Data Unit (PDU) of any type, after setting the PDU with given timestamp in seconds + * @param timeSeconds timestamp for this PDU, seconds since epoch + * @param pdu the pdu to send + */ + public void sendSinglePdu(double timeSeconds, Pdu pdu) + { + int timeMilliseconds = (int)(timeSeconds * 1000.0); + pdu.setTimestamp(timeMilliseconds); + sendSinglePdu(pdu); } /** * Send a single Protocol Data Unit (PDU) of any type following a real-time delay @@ -322,15 +323,17 @@ public class DisChannel long delayTimemilliseconds = (long)(delayTimeSeconds * 1000); sendSinglePduDelayed(pdu, delayTimemilliseconds); } + /** * Send Comment PDU using given DIS timestamp - * @param disTimeStamp timestamp for this PDU + * @param disTimeStamp timestamp for this PDU, milliseconds since epoch * @param commentType enumeration value describing purpose of the narrative comment * @param comments String array of narrative comments + * @return constructed CommentPdu if sent, null otherwise * @see VariableRecordType for other potential CommentPdu type enumerations. * @see <a href="https://docs.oracle.com/javase/tutorial/java/javaOO/arguments.html">Passing Information to a Method or a Constructor</a> Arbitrary Number of Arguments */ - public void sendCommentPdu(int disTimeStamp, + public CommentPdu sendCommentPdu(int disTimeStamp, VariableRecordType commentType, // vararg... variable-length set of String comments can optionally follow String... comments) @@ -340,11 +343,15 @@ public class DisChannel ArrayList<String> newCommentsList = new ArrayList<>(); for (String comment : comments) { - if (!comment.isEmpty()) + if ((comment != null) && !comment.isEmpty()) { newCommentsList.add(comment); // OK found something to send } } + if (newCommentsList.isEmpty() && (commentType != null)) + { + return null; // no CommentPdu sent + } if (!newCommentsList.isEmpty()) { if (getDisNetworkInterface() == null) @@ -362,21 +369,45 @@ public class DisChannel printlnTRACE("*** [CommentPdu " + commentType.name() + "] " + newCommentsList.toString()); System.out.flush(); } + return commentPdu; } } + return null; } + + /** + * Send Comment PDU using given DIS time in seconds + * @param timeSeconds timestamp for this PDU, seconds since epoch + * @param commentType enumeration value describing purpose of the narrative comment + * @param comments String array of narrative comments + * @return constructed CommentPdu if sent, null otherwise + * @see VariableRecordType for other potential CommentPdu type enumerations. + * @see <a href="https://docs.oracle.com/javase/tutorial/java/javaOO/arguments.html">Passing Information to a Method or a Constructor</a> Arbitrary Number of Arguments + */ + public CommentPdu sendCommentPdu(double timeSeconds, + VariableRecordType commentType, + // vararg... variable-length set of String comments can optionally follow + String... comments) + { + int timeMilliseconds = (int)(timeSeconds * 1000.0); + return sendCommentPdu(timeMilliseconds, + commentType, + comments); + } + /** * Send Comment PDU using current DIS timestamp * @param commentType enumeration value describing purpose of the narrative comment * @param comments String array of narrative comments + * @return constructed CommentPdu if sent, null otherwise * @see VariableRecordType for other potential CommentPdu type enumerations. * @see <a href="https://docs.oracle.com/javase/tutorial/java/javaOO/arguments.html">Passing Information to a Method or a Constructor</a> Arbitrary Number of Arguments */ - public void sendCommentPdu(VariableRecordType commentType, + public CommentPdu sendCommentPdu(VariableRecordType commentType, // vararg... variable-length set of String comments can optionally follow String... comments) { - sendCommentPdu (DisTime.getCurrentDisTimestamp(), commentType, comments); + return sendCommentPdu (DisTime.getCurrentDisTimestamp(), commentType, comments); } /**