Skip to content
Snippets Groups Projects
Commit ce2ae781 authored by ctsfi's avatar ctsfi
Browse files

Project Progress

parent 1d8177fa
No related branches found
No related tags found
No related merge requests found
package MV3500Cohort2020JulySeptember.homework4.White;
import java.net.*;
import java.io.*;
import edu.nps.moves.dis7.pdus.*;
import edu.nps.moves.dis7.enumerations.*;
import edu.nps.moves.dis7.utilities.PduFactory;
import java.util.ArrayList;
public class AllPduReceiver
{
public static final String DEFAULT_MULTICAST_ADDRESS = AllPduSender.DEFAULT_MULTICAST_ADDRESS;
public static final int DEFAULT_MULTICAST_PORT = AllPduSender.DEFAULT_MULTICAST_PORT;
public static final boolean USE_FAST_ESPDU = false;
public static void main(String args[])
{
PduFactory factory;
MulticastSocket socket;
InetAddress address;
DatagramPacket packet;
try {
System.out.println("OpenDis7Examples.AllPduReceiver started...");
if (args.length == 2) {
address = InetAddress.getByName(args[0]);
socket = new MulticastSocket(Integer.parseInt(args[1]));
}
else {
System.out.println("Usage: AllPduReceiver <multicast group> <port>");
System.out.println("Default: AllPduReceiver " + DEFAULT_MULTICAST_ADDRESS + " " + DEFAULT_MULTICAST_PORT);
socket = new MulticastSocket(DEFAULT_MULTICAST_PORT);
address = InetAddress.getByName(DEFAULT_MULTICAST_ADDRESS);
}
socket.joinGroup(address);
factory = new PduFactory();
while (true) // Loop infinitely, receiving datagrams
{
byte buffer[] = new byte[1500]; // typical MTU size
packet = new DatagramPacket(buffer, buffer.length); // reset
socket.receive(packet);
Pdu pdu = factory.createPdu(packet.getData()); // packet.getData() returns byte[] array data buffer
if (pdu != null)
{
DISPDUType currentPduType = pdu.getPduType(); //short currentPduType = pdu.getPduType();
String currentPduTypeName = pdu.getClass().getName();
DISProtocolFamily currentProtocolFamilyID = pdu.getProtocolFamily(); //short currentProtocolFamilyID = pdu.getProtocolFamily();
String currentPduFamilyName = pdu.getClass().getSuperclass().getSimpleName();
StringBuilder message = new StringBuilder();
message.append(DisTime.timeStampToString(pdu.getTimestamp()) + " ");
message.append("received DIS PDU ");
String currentPduTypePadded = String.format("%-34s", currentPduType); // - indicates right padding of whitespace
message.append(" " ).append(currentPduTypePadded);
if (currentPduType.getValue() < 10)
message.append(" "); // column spacing
// String currentPduTypeNamePadded = String.format("%-49s", currentPduTypeName); // - indicates right padding of whitespace
// message.append(" of type ").append(currentPduTypeNamePadded); // package.class name
message.append(" (").append(currentProtocolFamilyID);
// message.append(" ").append(currentPduFamilyName); // class name is also available
message.append(")");
System.out.println(message.toString());
if (currentPduType == DISPDUType.FIRE){
FirePdu firePdu = new FirePdu();
firePdu = (FirePdu) pdu;
if(firePdu.getFiringEntityID().getEntityID()!= 0){
System.out.println("Entity#" + firePdu.getFiringEntityID().getEntityID() + " is firing Muition [" + firePdu.getDescriptor().getMunitionType().getDomain() + "."+firePdu.getDescriptor().getMunitionType().getCountry() + "." + firePdu.getDescriptor().getMunitionType().getCategory() + "."+ firePdu.getDescriptor().getMunitionType().getSubCategory() + "." + firePdu.getDescriptor().getMunitionType().getSpecific() + "]"+ " at Entity#"+ firePdu.getTargetEntityID().getEntityID());
}
}
switch (currentPduType) // using enumeration values from edu.​nps.​moves.​dis7.​enumerations.​DISPDUType
{
case COMMENT:
CommentPdu commentPdu = (CommentPdu)pdu; // cast to precise type
ArrayList<VariableDatum> payloadList = (ArrayList)commentPdu.getVariableDatums();
if (!payloadList.isEmpty())
System.out.print (" messages: ");
for (VariableDatum variableDatum : payloadList)
{
String nextComment = new String(variableDatum.getVariableDatumValue()); // convert byte[] to String
System.out.print (" \"" + nextComment + "\"");
}
System.out.println();
}
}
else
System.out.println("received packet but pdu is null, packet.getData().length=" + packet.getData().length + ", error...");
}
}
catch (IOException e) {
System.out.println("Problem with OpenDis7Examples.AllPduReceiver, see exception trace:");
System.out.println(e);
}
finally {
System.out.println("OpenDis7Examples.AllPduReceiver complete.");
}
}
}
package MV3500Cohort2020JulySeptember.homework4.White;
import java.io.*;
import java.net.*;
import java.util.*;
import edu.nps.moves.dis7.pdus.*;
import edu.nps.moves.dis7.enumerations.*;
import edu.nps.moves.dis7.utilities.*;
/**
* This is an application example that sends all types of PDUs. Useful for testing standards
* compliance or getting a full set of PDUs. It also writes the generated PDUs to an XML file.
* Adapted from OpenDIS library example package edu.nps.moves.examples
*
* @author DMcG
* @version $Id:$
*/
public class AllPduSender
{
/** Default multicast group address we send on. */
public static final String DEFAULT_MULTICAST_ADDRESS = "239.1.2.3"; // PduRecorder "225.4.5.6"; //
/** Default multicast port used, matches Wireshark DIS capture default */
public static final int DEFAULT_MULTICAST_PORT = 3000;
/** Duration in milliseconds, set to 0 to avoid pausing between PDU sends */
private long THREAD_SLEEP_INTERVAL = 0;
/** Number of complete loops to perform */
private int SEND_LOOPS_TO_PERFORM = 1;
private static InetAddress multicastAddress;
private static int port;
public AllPduSender(String newMulticastAddress, int newMulticastPort) {
this.port = DEFAULT_MULTICAST_PORT;
try
{
multicastAddress = InetAddress.getByName(newMulticastAddress);
if (!multicastAddress.isMulticastAddress())
{
System.out.println("Not a multicast address: " + newMulticastAddress);
}
this.port = newMulticastPort;
}
catch (UnknownHostException e) {
System.out.println("Unable to open socket: " + e);
}
}
@SuppressWarnings("SleepWhileInLoop")
public int run()
{
System.out.println("OpenDis7Examples.AllPduSender started...");
if (SEND_LOOPS_TO_PERFORM != 1)
{
float waitIntervalSeconds = ((float)THREAD_SLEEP_INTERVAL / 1000);
float loopIntervalSeconds = ((float)THREAD_SLEEP_INTERVAL / 1000) * 72; // 72 PDUs
float totalDurationSeconds = loopIntervalSeconds * SEND_LOOPS_TO_PERFORM ;
System.out.println("... THREAD_SLEEP_INTERVAL = " + THREAD_SLEEP_INTERVAL + " milliseconds = " + waitIntervalSeconds + " seconds");
System.out.print ("... running for ");
if (SEND_LOOPS_TO_PERFORM > 1)
System.out.print (SEND_LOOPS_TO_PERFORM + " loops, ");
if (THREAD_SLEEP_INTERVAL > 0)
System.out.println("expected loop interval = " + loopIntervalSeconds + " seconds, total duration = " +
totalDurationSeconds + " seconds = " + (totalDurationSeconds/60.0) + " minutes");
}
System.out.println("Generate list of all PDU types and note issues, if any...");
List<Pdu> generatedPdusList = new ArrayList<>();
for (int i = 0; i < SEND_LOOPS_TO_PERFORM; i++) {
try {
// Loop through all the enumerated PDU types, create a PDU for each type,
// add that PDU to generatedPdusList, then send each one
for (DISPDUType pdu : DISPDUType.values())
{
// System.out.println("PDU " + pdu.getValue() + " " + pdu.name() + " " + pdu.getDescription()); // diagnostic
Pdu aPdu = null; // edu.​nps.​moves7.​dis.PDU superclass for all PDUs, in preparation for custom assignment
try {
switch (pdu) // using enumeration values from edu.​nps.​moves.​dis7.​enumerations.​DISPDUType
{
// each case value is DISPDUType
case OTHER: // 0
System.out.println ("*** Note: DISPDUType." + pdu.name() + "=" + pdu.getValue() + " not supported"); // TODO why was this received?
break; // nothing to send
case ENTITY_STATE: // 1
aPdu = new EntityStatePdu();
EntityStatePdu espdu = (EntityStatePdu) aPdu;
EntityMarking entityMarking = new EntityMarking ();
entityMarking.setCharacters("AllPduSender".getBytes()); //entityMarking.setCharacters(Byte.valueOf("0")); // 11 characters max?
espdu.setMarking(entityMarking);
EntityID lavID = new EntityID();
lavID.setSiteID(1);
lavID.setApplicationID(13);
lavID.setEntityID(25);
espdu.setEntityID(lavID);
EntityType lavType = new EntityType(); //1.1.225.2.41.3 Platform,Ground,USA,ArmoredFightingVehicle,LAV,LAV25A2
lavType.setEntityKind(EntityKind.PLATFORM);
lavType.setDomain(Domain.inst(PlatformDomain.LAND));
lavType.setCountry(Country.UNITED_STATES_OF_AMERICA_USA);
lavType.setCategory(2);
lavType.setSubCategory(41);
lavType.setSpecific(3);
espdu.setEntityType(lavType);
Vector3Double eloc1 = new Vector3Double();
double[] loc1 = CoordinateConversions.getXYZfromLatLonDegrees(36.599831, -121.878842, 0);
eloc1.setX(loc1[0]);
eloc1.setY(loc1[1]);
eloc1.setZ(loc1[2]);
espdu.setEntityLocation(eloc1);
EulerAngles orient1 = new EulerAngles();
orient1.setPhi((float) 0.0);
orient1.setPsi((float) 0.0);
orient1.setTheta((float) 0.0);
espdu.setEntityOrientation(orient1);
// it is important to identify questions as you think of them
// TODO how to set azimuth, i.e. course direction over ground?
break;
case FIRE: // 2
aPdu = new FirePdu();
FirePdu firePdu = (FirePdu) aPdu;
EntityID fireID = new EntityID();
fireID.setSiteID(1);
fireID.setApplicationID(13);
fireID.setEntityID(25);
EntityID targetID = new EntityID();
targetID.setSiteID(1);
targetID.setApplicationID(13);
targetID.setEntityID(2);
firePdu.setFiringEntityID(fireID);
firePdu.setTargetEntityID(targetID);
EntityType HEType = new EntityType(); //2.9.225.2.2.1
HEType.setEntityKind(EntityKind.MUNITION);
HEType.setDomain(Domain.inst(PlatformDomain.AIR));
HEType.setCountry(Country.UNITED_STATES_OF_AMERICA_USA);
HEType.setCategory(2);
HEType.setSubCategory(2);
HEType.setSpecific(1);
MunitionDescriptor HEIT = new MunitionDescriptor();
HEIT.setMunitionType(HEType);
firePdu.setDescriptor(HEIT);
EntityID HEID = new EntityID();
HEID.setEntityID(1);
firePdu.setMunitionExpendibleID(HEID);
break;
case DETONATION: // 3
aPdu = new DetonationPdu();
break;
case COLLISION: // 4
aPdu = new CollisionPdu();
break;
case SERVICE_REQUEST: // 5
aPdu = new ServiceRequestPdu();
break;
case RESUPPLY_OFFER: // 6
aPdu = new ResupplyOfferPdu();
break;
case RESUPPLY_RECEIVED: // 7
aPdu = new ResupplyReceivedPdu();
break;
case RESUPPLY_CANCEL: //8
aPdu = new ResupplyCancelPdu();
break;
case REPAIR_COMPLETE: // 9
aPdu = new RepairCompletePdu();
break;
case REPAIR_RESPONSE: // 10
aPdu = new RepairResponsePdu();
break;
case CREATE_ENTITY: // 11
aPdu = new CreateEntityPdu();
break;
case REMOVE_ENTITY: // 12
aPdu = new RemoveEntityPdu();
break;
case START_RESUME: // 13
aPdu = new StartResumePdu();
break;
case STOP_FREEZE: // 14
aPdu = new StopFreezePdu();
break;
case ACKNOWLEDGE: // 15
aPdu = new AcknowledgePdu();
break;
case ACTION_REQUEST: // 16
aPdu = new ActionRequestPdu();
break;
case ACTION_RESPONSE: // 17
aPdu = new ActionResponsePdu();
break;
case DATA_QUERY: // 18
aPdu = new DataQueryPdu();
break;
case SET_DATA: // 19
aPdu = new SetDataPdu();
break;
case DATA: // 20
aPdu = new DataPdu();
break;
case EVENT_REPORT: // 21
aPdu = new EventReportPdu();
break;
case ELECTROMAGNETIC_EMISSION: // 23
aPdu = new ElectromagneticEmissionPdu();
break;
case DESIGNATOR: // 24
aPdu = new DesignatorPdu();
break;
case TRANSMITTER: // 25
aPdu = new TransmitterPdu();
break;
case SIGNAL: // 26
aPdu = new SignalPdu();
break;
case RECEIVER: // 27
aPdu = new ReceiverPdu();
break;
case IDENTIFICATION_FRIEND_OR_FOE: // 28
aPdu = new IdentificationFriendOrFoePdu();
break;
case UNDERWATER_ACOUSTIC: // 29
aPdu = new UnderwaterAcousticPdu();
break;
case SUPPLEMENTAL_EMISSION_ENTITY_STATE: // 30
aPdu = new SupplementalEmissionEntityStatePdu();
break;
case INTERCOM_SIGNAL: // 31
aPdu = new IntercomSignalPdu();
break;
case INTERCOM_CONTROL: // 32
aPdu = new IntercomControlPdu();
break;
case AGGREGATE_STATE: // 33
aPdu = new AggregateStatePdu();
break;
case ISGROUPOF: // 34
aPdu = new IsGroupOfPdu();
break;
case TRANSFER_OWNERSHIP: // 35
aPdu = new TransferOwnershipPdu();
break;
case ISPARTOF: // 36
aPdu = new IsPartOfPdu();
break;
case MINEFIELD_STATE: // 37
aPdu = new MinefieldStatePdu();
break;
case MINEFIELD_QUERY: // 38
aPdu = new MinefieldQueryPdu();
break;
case MINEFIELD_DATA: // 39
aPdu = new MinefieldDataPdu();
break;
case MINEFIELD_RESPONSE_NACK: // 40
aPdu = new MinefieldResponseNACKPdu();
break;
case ENVIRONMENTAL_PROCESS: // 41
aPdu = new EnvironmentalProcessPdu();
break;
case GRIDDED_DATA: // 42
aPdu = new GriddedDataPdu();
break;
case POINT_OBJECT_STATE: // 43
aPdu = new PointObjectStatePdu();
break;
case LINEAR_OBJECT_STATE: // 44
aPdu = new LinearObjectStatePdu();
break;
case AREAL_OBJECT_STATE: // 45
aPdu = new ArealObjectStatePdu();
break;
case TIME_SPACE_POSITION_INFORMATION: // 46
aPdu = new TimeSpacePositionInformationPdu();
break;
case APPEARANCE: // 47
aPdu = new AppearancePdu();
break;
case ARTICULATED_PARTS: // 48
aPdu = new ArticulatedPartsPdu();
break;
case LIVE_ENTITY_FIRE: // 49
aPdu = new LiveEntityFirePdu();
break;
case LIVE_ENTITY_DETONATION: // 50
aPdu = new LiveEntityDetonationPdu();
break;
case CREATE_ENTITY_RELIABLE: // 51
aPdu = new CreateEntityReliablePdu();
break;
case REMOVE_ENTITY_RELIABLE: // 52
aPdu = new RemoveEntityReliablePdu();
break;
case START_RESUME_RELIABLE: // 53
aPdu = new StartResumeReliablePdu();
break;
case STOP_FREEZE_RELIABLE: // 54
aPdu = new StopFreezeReliablePdu();
break;
case ACKNOWLEDGE_RELIABLE: // 55
aPdu = new AcknowledgeReliablePdu();
break;
case ACTION_REQUEST_RELIABLE: // 56
aPdu = new ActionRequestReliablePdu();
break;
case ACTION_RESPONSE_RELIABLE: // 57
aPdu = new ActionResponseReliablePdu();
break;
case DATA_QUERY_RELIABLE: // 58
aPdu = new DataQueryReliablePdu();
break;
case SET_DATA_RELIABLE: // 59
aPdu = new SetDataReliablePdu();
break;
case DATA_RELIABLE: // 60
aPdu = new DataReliablePdu();
break;
case EVENT_REPORT_RELIABLE: // 61
aPdu = new EventReportReliablePdu();
break;
case COMMENT_RELIABLE: // 62
aPdu = new CommentReliablePdu();
break;
case RECORD_RELIABLE: // 63
aPdu = new RecordReliablePdu();
break;
case SET_RECORD_RELIABLE: // 64
aPdu = new SetRecordReliablePdu();
break;
case RECORD_QUERY_RELIABLE: // 65
aPdu = new RecordQueryReliablePdu();
break;
case COLLISION_ELASTIC: // 66
aPdu = new CollisionElasticPdu();
break;
case ENTITY_STATE_UPDATE: // 67
aPdu = new EntityStateUpdatePdu();
break;
case DIRECTED_ENERGY_FIRE: // 68
aPdu = new DirectedEnergyFirePdu();
break;
case ENTITY_DAMAGE_STATUS: // 69
aPdu = new EntityDamageStatusPdu();
break;
case INFORMATION_OPERATIONS_ACTION: // 70
aPdu = new InformationOperationsActionPdu();
break;
case INFORMATION_OPERATIONS_REPORT: // 71
aPdu = new InformationOperationsReportPdu();
break;
case ATTRIBUTE: // 72
aPdu = new AttributePdu();
break;
case COMMENT:
// aPdu = new CommentPdu(); // default for this switch logic
// see Garrett Loffelman and Pete Severson's code for OpenDis version 4 example
// https://gitlab.nps.edu/Savage/NetworkedGraphicsMV3500/tree/master/assignments/src/MV3500Cohort2018JulySeptember/projects/LoeffelmanSeverson
CommentPdu newCommentPdu = new CommentPdu();
ArrayList<VariableDatum> payloadList = new ArrayList<>();
ArrayList<String> commentsList = new ArrayList<>();
commentsList.add("Hello CommentPDU");
commentsList.add("Here is a second line of text in this comment.");
if (!commentsList.isEmpty())
System.out.println("Preparing CommentPDU:");
for (String comment : commentsList)
{
VariableDatum newVariableDatum = new VariableDatum();
newVariableDatum.setVariableDatumValue (comment.getBytes()); // conversion
newVariableDatum.setVariableDatumLengthInBytes(comment.getBytes().length); // also available in bits, see spec and javadoc
// alternatively, you do not need to set this and the marshaller will figure it out from the byte array
// (see javadoc for VariableDatum.setVariableDatumLength())
payloadList.add(newVariableDatum);
System.out.println(" \"" + comment + "\"");
}
newCommentPdu.setVariableDatums(payloadList);
aPdu = newCommentPdu; // hand off for sending
break;
default:
System.out.println("*** Warning: PDU " + pdu.getValue() + " " + pdu + " not supported, created or sent ");
// code generation block for this class follows:
// System.out.println(" case " + pdu + ": // " + pdu.getValue());
// System.out.println(" aPdu = new " + pdu.getDescription().replace(" ","").replace("-","").replace("/","") +
// "Pdu();");
// System.out.println(" break;");
// System.out.println();
}
if (aPdu != null)
{
generatedPdusList.add(aPdu);
}
}
catch (Exception e)
{
System.out.print("Exception thrown for PDU " + pdu.getValue() + " " + pdu);
System.out.print(Arrays.toString(e.getStackTrace()));
// continue looping
}
}
if (generatedPdusList.size() != 72) // TODO create an enumeration DISType.TOTAL_PDU_TYPES
System.out.println("Error: " + generatedPdusList.size() + " PDUs generated but 72 PDUs expected.");
// Send the PDUs we created
System.out.println("Send the " + generatedPdusList.size() + " PDUs we created...");
InetAddress localMulticastAddress = InetAddress.getByName(DEFAULT_MULTICAST_ADDRESS);
MulticastSocket multicastSocket = new MulticastSocket(DEFAULT_MULTICAST_PORT);
multicastSocket.joinGroup(localMulticastAddress);
// keep object instantiations outside of loops for best performance
ByteArrayOutputStream baos = new ByteArrayOutputStream();
DataOutputStream dos = new DataOutputStream(baos);
byte[] buffer;
Pdu aPdu;
DatagramPacket packet;
for (int idx = 0; idx < generatedPdusList.size(); idx++)
{
aPdu = generatedPdusList.get(idx);
try
{
aPdu.marshal(dos);
buffer = baos.toByteArray();
packet = new DatagramPacket(buffer, buffer.length, localMulticastAddress, DEFAULT_MULTICAST_PORT);
multicastSocket.send(packet);
String currentPduTypeValuePadded = String.format("%2s", aPdu.getPduType().getValue());
String currentPduTypePadded = String.format("%-50s", aPdu.getPduType().toString()); // - indicates right padding of whitespace
System.out.print ("Sent DIS PDU " + currentPduTypeValuePadded + " " + currentPduTypePadded );
System.out.println(" of type " + aPdu.getClass().getName());
if (THREAD_SLEEP_INTERVAL > 0)
Thread.sleep(THREAD_SLEEP_INTERVAL); // pause for debugging
}
catch (Exception ex) {
System.out.println("Marshaling error" + ex);
}
}
}
catch (IOException e)
{
System.out.println(e);
return -1;
}
} // end repetion loop
// write the PDUs out to an XML file.
//PduContainer container = new PduContainer();
//container.setPdus(generatedPdus);
//container.marshallToXml("examplePdus.xml");
return generatedPdusList.size();
}
public static void main(String args[])
{
AllPduSender allPduSender;
int totalSentPdus;
if (args.length == 2)
{
allPduSender = new AllPduSender(args[0], Integer.parseInt(args[1]));
System.out.println("Usage: AllPduSender <multicast group> <port>");
System.out.println("Actual: AllPduSender " + multicastAddress.getHostAddress() + " " + port);
totalSentPdus = allPduSender.run();
}
else
{
System.out.println("Usage: AllPduSender <multicast group> <port>");
System.out.println("Default: AllPduSender " + DEFAULT_MULTICAST_ADDRESS + " " + DEFAULT_MULTICAST_PORT);
allPduSender = new AllPduSender(DEFAULT_MULTICAST_ADDRESS, DEFAULT_MULTICAST_PORT);
totalSentPdus = allPduSender.run();
}
System.out.println("OpenDis7Examples.AllPduSender complete, sent " + totalSentPdus + " PDUs total.");
}
}
/**
* Copyright (c) 2008-2020, MOVES Institute, Naval Postgraduate School (NPS). All rights reserved.
* This work is provided under a BSD open-source license, see project license.html and license.txt
*/
package MV3500Cohort2020JulySeptember.homework4.White;
import edu.nps.moves.dis7.enumerations.*;
import edu.nps.moves.dis7.pdus.*;
import edu.nps.moves.dis7.utilities.*;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
public class ExampleSimulationProgram
{
// class variables
PduFactory pduFactory = new PduFactory();
DisThreadedNetworkInterface disNetworkInterface;
DisThreadedNetworkInterface.PduListener pduListener;
Pdu receivedPdu;
private String networkAddress = "239.1.2.3";
private int networkPort = 3000;
/**
* Constructor design goal: additional built-in initialization conveniences can go here
* to keep student efforts focused on the runSimulation() method.
*/
public ExampleSimulationProgram()
{
// Under consideration. Constructor is not currently needed.
}
/**
* Utility Constructor
* @param address network address to use
* @param port corresponding network port to use
*/
public ExampleSimulationProgram(String address, int port)
{
setNetworkAddress(address);
setNetworkPort(port);
}
/**
* @return the networkAddress
*/
public String getNetworkAddress()
{
return networkAddress;
}
/**
* @param networkAddress the networkAddress to set
*/
public final void setNetworkAddress(String networkAddress)
{
this.networkAddress = networkAddress;
}
/**
* @return the networkPort
*/
public int getNetworkPort()
{
return networkPort;
}
/**
* @param networkPort the networkPort to set
*/
public final void setNetworkPort(int networkPort)
{
this.networkPort = networkPort;
}
/**
* Initialize network interface, choosing best available network interface
*/
public void setUpNetworkInterface()
{
disNetworkInterface = new DisThreadedNetworkInterface(getNetworkAddress(), getNetworkPort());
System.out.println("Network confirmation: address=" + disNetworkInterface.getMcastGroup() + " port=" + disNetworkInterface.getDisPort());
pduListener = new DisThreadedNetworkInterface.PduListener()
{
/** Callback handler for listener */
@Override
public void incomingPdu(Pdu newPdu)
{
receivedPdu = newPdu;
}
};
disNetworkInterface.addListener(pduListener);
}
/** All done, release network resources */
public void tearDownNetworkInterface()
{
disNetworkInterface.removeListener(pduListener);
disNetworkInterface.kill();
disNetworkInterface = null;
}
/**
* Send a single Protocol Data Unit (PDU) of any type
* @param pdu the pdu to send
*/
private void sendSinglePdu(Pdu pdu)
{
try
{
disNetworkInterface.send(pdu);
Thread.sleep(100); // TODO consider refactoring the wait logic and moving externally
}
catch (InterruptedException ex)
{
System.err.println(this.getClass().getName() + " Error sending PDU: " + ex.getLocalizedMessage());
System.exit(1);
}
}
/**
* Send EntityState, Fire, Comment PDUs
* @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
* @param entityStatePdu the ESPDU to send, if any
* @param firePdu the FirePDU to send, if any
* @param commentType enumeration value describing the narrative comment
* @param comments String array of narrative comments
*/
public void sendAllPdus(EntityStatePdu entityStatePdu,
FirePdu firePdu,
VariableRecordType commentType,
// vararg... variable length string
String... comments)
{
if (entityStatePdu != null)
sendSinglePdu(entityStatePdu);
if (firePdu != null)
sendSinglePdu(firePdu); // bang
if ((comments != null) && (comments.length > 0))
{
ArrayList<String> newCommentsList = new ArrayList<>();
for (int i = 0; i < comments.length; i++)
{
if (!comments[i].isEmpty())
newCommentsList.add(comments[i]); // OK found something to send
}
if (!newCommentsList.isEmpty())
{
if (commentType == null)
commentType = VariableRecordType.OTHER;
CommentPdu commentPdu = pduFactory.makeCommentPdu(commentType, newCommentsList.toArray(new String[0])); // comments);
sendSinglePdu(commentPdu);
}
}
}
/**
* Main method is first executed when a program instance is loaded.
* @see <a href="https://docs.oracle.com/javase/tutorial/getStarted/application/index.html">Java Tutorials: A Closer Look at the "Hello World!" Application</a>
* @param args command-line arguments are an array of optional String parameters that are passed from execution environment during invocation
*/
public static void main(String[] args)
{
ExampleSimulationProgram thisProgram = new ExampleSimulationProgram(); // creates instance
// initial execution: can handle args array of initialization arguments here
if (args.length == 2)
{
if ((args[0] != null) && !args[0].isEmpty())
thisProgram.setNetworkAddress(args[0]);
if ((args[1] != null) && !args[1].isEmpty())
thisProgram.setNetworkPort(Integer.parseInt(args[1]));
}
else if (args.length != 0)
{
System.err.println("Usage: " + thisProgram.getClass().getName() + " [address port]");
System.exit(-1);
}
// OK here we go...
thisProgram.setUpNetworkInterface();
thisProgram.runSimulation (); // customization code goes in there
thisProgram.tearDownNetworkInterface();
}
/**
* Programmer-modifiable method for defining and running a new simulation of interest.
* Support include DIS EntityStatePdu, FirePdu and CommentPdu all available for
* modification and sending in a simulation loop.
*/
@SuppressWarnings("SleepWhileInLoop")
public void runSimulation ()
{
try
{
final double LOOP_DURATION_SECONDS = 1.0; // seconds
final int MAX_LOOP_COUNT = 10;
int loopCount = 0;
VariableRecordType narrativeType = VariableRecordType.OTHER; // of potential use
boolean simulationComplete = false; // sentinel variable as termination condition
// TODO reset clock to zero each time for consistent outputs.
// your model setup: who's who in this zoo?
// create PDU objects and set their values
Vector3Double eloc3 = new Vector3Double();
double[] loc3 = CoordinateConversions.getXYZfromLatLonDegrees(36.600757, -121.869309, 0 );//NPS Corner by lake
EntityID entityID_1 = new EntityID();
entityID_1.setSiteID(1).setApplicationID(2).setEntityID(3); // made-up example ID
EntityStatePdu entityStatePdu = pduFactory.makeEntityStatePdu();
entityStatePdu.setEntityID(entityID_1);
EntityID lavID = new EntityID();
lavID.setSiteID(1);
lavID.setApplicationID(13);
lavID.setEntityID(25);
entityStatePdu.setEntityID(lavID);
EntityType lavType = new EntityType(); //1.1.225.2.41.3 Platform,Ground,USA,ArmoredFightingVehicle,LAV,LAV25A2
lavType.setEntityKind(EntityKind.PLATFORM);
lavType.setDomain(Domain.inst(PlatformDomain.LAND));
lavType.setCountry(Country.UNITED_STATES_OF_AMERICA_USA);
lavType.setCategory(2);
lavType.setSubCategory(41);
lavType.setSpecific(3);
entityStatePdu.setEntityType(lavType);
Vector3Double eloc2 = new Vector3Double();
double[] loc2 = CoordinateConversions.getXYZfromLatLonDegrees(36.599831, -121.878842, 0); //sloat delmonte intersection
eloc2.setX(loc2[0]);
eloc2.setY(loc2[1]);
eloc2.setZ(loc2[2]);
entityStatePdu.setEntityLocation(eloc2);
EulerAngles orient2 = new EulerAngles();
orient2.setPhi((float) 0.0);
orient2.setPsi((float) 0.0);
orient2.setTheta((float) 0.0);
entityStatePdu.setEntityOrientation(orient2);
EntityStatePdu entityStatePdu2 = pduFactory.makeEntityStatePdu();
EntityID bmpID = new EntityID();
bmpID.setSiteID(1);
bmpID.setApplicationID(13);
bmpID.setEntityID(2);
entityStatePdu2.setEntityID(bmpID);
EntityType bmpType = new EntityType(); //1.1.222.2.2.1 Platform,Ground,Russia,ArmoredFightingVehicle,BMP2,BMP2
bmpType.setEntityKind(EntityKind.PLATFORM);
bmpType.setDomain(Domain.inst(PlatformDomain.LAND));
bmpType.setCountry(Country.RUSSIA);
bmpType.setCategory(2);
bmpType.setSubCategory(41);
bmpType.setSpecific(3);
entityStatePdu2.setEntityType(bmpType);
Vector3Double eloc1 = new Vector3Double();
double[] loc1 = CoordinateConversions.getXYZfromLatLonDegrees(36.594116, -121.877463, 0); //NPS Main Gate
eloc1.setX(loc1[0]);
eloc1.setY(loc1[1]);
eloc1.setZ(loc1[2]);
entityStatePdu2.setEntityLocation(eloc1);
EulerAngles orient1 = new EulerAngles();
orient1.setPhi((float) 0.0);
orient1.setPsi((float) 0.0);
orient1.setTheta((float) 0.0);
entityStatePdu2.setEntityOrientation(orient1);
int BMPHitsReceived = 0;
System.out.println(eloc2.toString());
System.out.println(eloc1.toString());
FirePdu firePduNull = new FirePdu();
FirePdu firePdu = pduFactory.makeFirePdu();
EntityID fireID = new EntityID();
fireID.setSiteID(1);
fireID.setApplicationID(13);
fireID.setEntityID(25);
EntityID targetID = new EntityID();
targetID.setSiteID(1);
targetID.setApplicationID(13);
targetID.setEntityID(2);
firePdu.setFiringEntityID(fireID);
firePdu.setTargetEntityID(targetID);
EntityType HEType = new EntityType(); //2.9.225.2.2.1
HEType.setEntityKind(EntityKind.MUNITION);
HEType.setDomain(Domain.inst(PlatformDomain.AIR));
HEType.setCountry(Country.UNITED_STATES_OF_AMERICA_USA);
HEType.setCategory(2);
HEType.setSubCategory(2);
HEType.setSpecific(1);
MunitionDescriptor HEIT = new MunitionDescriptor();
HEIT.setMunitionType(HEType);
HEIT.setQuantity(3);
HEIT.setFuse(MunitionDescriptorFuse.CONTACT_GRAZE);
HEIT.setRate(200);
firePdu.setDescriptor(HEIT);
EntityID HEID = new EntityID();
HEID.setEntityID(1);
firePdu.setMunitionExpendibleID(HEID);
//if(eloc1.getX())
// should we customize this munition? what is it for your simulation?
while (loopCount < MAX_LOOP_COUNT) // loop the simulation while allowed, can set additional conditions to break
{
String narrativeMessage1, narrativeMessage2, narrativeMessage3, narrativeMessage4;
narrativeMessage4 = "";
// initialize loop variables
loopCount++;
// =============================================================================================
// your own simulation code starts here!
// compute a track, update an ESPDU, whatever it is that your model is doing...
// Where is my entity?
entityStatePdu.getEntityLocation().setX(entityStatePdu.getEntityLocation().getX() - 20); // 1m per timestep
entityStatePdu.getEntityLocation().setY(entityStatePdu.getEntityLocation().getY() - 75);
// decide whether to fire, and then update the firePdu. Hmmm, you might want a target to shoort at!
Double dx = eloc2.getX() - eloc1.getX();
Double dy = eloc2.getY() - eloc1.getY();
Double dz = eloc2.getZ() - eloc1.getZ();
Double range = Math.sqrt(dx*dx + dy*dy);
System.out.println(range + " " +dx + " "+ dy);
// etc. etc. your code goes here
if(range < 100){
firePduNull = firePdu;
System.out.println("Entity#" + firePdu.getFiringEntityID().getEntityID() + " is firing " + firePdu.getDescriptor().getMunitionType().getDomain() + "."+firePdu.getDescriptor().getMunitionType().getCountry() + "." + firePdu.getDescriptor().getMunitionType().getCategory() + "."+ firePdu.getDescriptor().getMunitionType().getSubCategory() + "." + firePdu.getDescriptor().getMunitionType().getSpecific() + "."+ " at Entity#"+ firePdu.getTargetEntityID().getEntityID());
}
if(firePduNull.getTargetEntityID().getEntityID() == 2){
BMPHitsReceived += 1;
if (BMPHitsReceived > 1) {
//DESTROY THE BMP!
System.out.println("BMP Destroyed after "+ BMPHitsReceived + " hits from 25mm HEI-T");
narrativeMessage4 = "Destroyed BMP2";
}
}
// make your reports: narrative code for CommentPdu here (set all to empty strings to avoid sending)
narrativeMessage1 = "MV3500 ExampleSimulationProgram";
narrativeMessage2 = "runSimulation() loop " + loopCount;
narrativeMessage3 = "LAV-25A2"; // intentionally blank for testing
if (narrativeMessage4.isEmpty()){
narrativeMessage4 = "BMP2";
}
// your loop termination condition goes here
if (loopCount > 4) // for example
{
simulationComplete = true;
}
// your own simulation code is finished here!
// =============================================================================================
// keep track of timestep: wait duration for elapsed time in this loop
// Thread.sleep needs a (long) parameter for milliseconds, which are clumsy to use sometimes
Thread.sleep((long)(LOOP_DURATION_SECONDS * 1000)); // seconds * (1000 msec/sec) = milliseconds
System.out.println ("... Pausing for " + LOOP_DURATION_SECONDS + " seconds");
// send the status PDUs for this loop and continue
System.out.println ("sending PDUs for simulation step " + loopCount + ", monitor loopback to confirm sent");
sendAllPdus(entityStatePdu, firePduNull, null, narrativeMessage1, narrativeMessage2, narrativeMessage3);
sendAllPdus(entityStatePdu2, null, null, narrativeMessage1, narrativeMessage2, narrativeMessage4);
System.out.println ("... PDUs successfully sent");
// ===============================
// loop now finished, thus terminate if simulation complete, otherwise send latest PDUs and continue
if (simulationComplete || (loopCount > 10000)) // for example; including fail-safe condition is good
{
System.out.println ("... Termination condition met, simulationComplete=" + simulationComplete);
break;
}
} // end of while loop
}
catch (Exception ex) // handle any exception that your code might choose to provoke!
{
Logger.getLogger(ExampleSimulationProgram.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment