Skip to content
Snippets Groups Projects
Commit 54f1961a authored by Brittokki's avatar Brittokki
Browse files

Merge origin/master

Conflicts:
	assignments/src/MV3500Cohort2020JulySeptember/homework4/WeissenbergerGoericke/TCPReceiverVPNBridge.java
	assignments/src/MV3500Cohort2020JulySeptember/homework4/WeissenbergerGoericke/TcpServerForFinal.java
	examples/src/HttpServletExamples/HttpWebPageSource.java
	examples/src/OpenDis7Examples/ExampleSimulationProgram.java
	examples/src/UdpMulticastExamples/UdpSender.java
	nbproject/nbjdk.properties
parent 7200f500
No related branches found
No related tags found
No related merge requests found
package OpenDis7Examples;
import java.io.*;
import java.net.*;
import java.util.*;
import edu.nps.moves.dis7.pdus.*;
import edu.nps.moves.dis7.enumerations.Country;
import edu.nps.moves.dis7.enumerations.EntityKind;
import edu.nps.moves.dis7.enumerations.PlatformDomain;
import edu.nps.moves.dis7.utilities.*;
import edu.nps.moves.dis7.entities.usa.platform.land.M1A2;
import edu.nps.moves.dis7.entities.usa.platform.land.MTVRMK25Cargo;
/**
* Creates and sends ESPDUs in IEEE binary format. Adapted from OpenDIS library
* example package edu.nps.moves.examples
*
* @author Don McGregor
* @author Don Brutzman
*/
public class EspduSender
{
/**
* Putting any upper limit on # packets sent avoids possibility of non-terminating infinite loops that continue sending packets.
*/
public static final int NUMBER_OF_LOOPS = 2; // 5
/**
* Default multicast group address we send on.
*/
public static final String DEFAULT_MULTICAST_ADDRESS = "239.1.2.3";
/**
* Default multicast port used, matches Wireshark DIS capture default
*/
public static final int DEFAULT_MULTICAST_PORT = 3000;
public enum NetworkMode {
UNICAST, MULTICAST, BROADCAST
};
/**
* Output prefix to identify this class, helps with logging
*/
private final static String TRACE_PREFIX = "[" + EspduSender.class.getName() + "] ";
/**
* Possible system properties, passed in via -Dattr=val networkMode:
* unicast, broadcast, multicast destinationIp: where to send the packet. If
* in multicast mode, this can be multicast. To determine broadcast
* destination IP, use an online broadcast address calculator, for example
* http://www.remotemonitoringsystems.ca/broadcast.php If in multicast mode,
* a join() will be done on the multicast address. port: port used for both
* source and destination.
*
* @param args
*/
@SuppressWarnings("SleepWhileInLoop") // allows Thread.sleep(value) without warning in code
public static void main(String args[])
{
System.out.println(TRACE_PREFIX + " started...");
// Default settings. These are used if no system properties are set.
// If system properties are passed in, these are overridden later.
NetworkMode networkMode = NetworkMode.MULTICAST;
InetAddress address = null; // must be initialized, even if null
int port = DEFAULT_MULTICAST_PORT;
MulticastSocket socket = null; // must be initialized to avoid later error, even if null;
EntityStatePdu espdu = new EntityStatePdu();
DisTime disTime = new DisTime();
// ICBM coordinates for my office
double latitude = 36.639222;
double longitude = -121.803415;
try
{
address = InetAddress.getByName(DEFAULT_MULTICAST_ADDRESS);
}
catch (UnknownHostException e)
{
System.out.println(TRACE_PREFIX + e + " Cannot create multicast address");
System.exit(0);
}
// All system properties, passed in on the command line via -Dattribute=value
Properties systemProperties = System.getProperties();
// IP address we send to
String destinationIpString = systemProperties.getProperty("destinationIp");
// Port we send to, and local port we open the socket on
String portString = systemProperties.getProperty("port");
// Network mode: unicast, multicast, broadcast
String networkModeString = systemProperties.getProperty("networkMode"); // unicast or multicast or broadcast
// Set up socket to send information
try
{
if (portString != null) // Update port we send to, if provided
{
port = Integer.parseInt(portString);
}
socket = new MulticastSocket(port);
// Where we send packets to, the destination IP address
if (destinationIpString != null)
{
address = InetAddress.getByName(destinationIpString);
}
// Type of transport: unicast, broadcast, or multicast
if (networkModeString != null)
{
if (networkModeString.equalsIgnoreCase("unicast"))
{
networkMode = NetworkMode.UNICAST;
}
else if (networkModeString.equalsIgnoreCase("broadcast"))
{
networkMode = NetworkMode.BROADCAST;
}
else if (networkModeString.equalsIgnoreCase("multicast"))
{
networkMode = NetworkMode.MULTICAST;
if (!address.isMulticastAddress())
{
throw new RuntimeException("*** Error: sending to multicast address, but destination address " + address.toString() + "is not multicast");
}
socket.joinGroup(address); // TODO select correct NetworkInterface
}
} // end networkModeString
else if (networkMode == NetworkMode.MULTICAST)
{
networkModeString = "multicast";
}
else if (networkMode == NetworkMode.UNICAST)
{
networkModeString = "unicast";
}
else if (networkMode == NetworkMode.BROADCAST)
{
networkModeString = "broadcast";
}
}
catch (IOException | RuntimeException e)
{
System.out.println(TRACE_PREFIX + "Unable to initialize network correctly, exiting.");
System.out.println(e);
System.exit(-1); // outta here
}
System.out.println(TRACE_PREFIX + " sending " + networkModeString + " ESPDU packets to " +
address.getHostAddress() + " port " + port);
// Initialize values in the Entity State PDU object. The exercise ID is
// a way to differentiate between different virtual worlds on one network.
// Note that some values (such as the PDU type and PDU family) are set
// automatically when you create the ESPDU.
espdu.setExerciseID((byte)1); //(short) 1);
// The EID is the unique identifier for objects in the world. This
// EID should match up with the ID for the object specified in the
// VMRL/x3d/virtual world.
EntityID entityID = espdu.getEntityID(); // initialize, reset, override
// TODO check: 0 is apparently not a valid site number, per DIS specification
entityID.setSiteID ((short)1); // TODO utility method to allow int values
entityID.setApplicationID((short)2);
entityID.setEntityID ((short)3);
espdu.setEntityID(entityID); // TODO utility method to allow setting all three at once
// Set the entity type. SISO has a big list of enumerations, so that by
// specifying various numbers we can say this is an M1A2 American tank,
// the USS Enterprise, and so on. We'll make this a tank. There is a
// separate project elsehwhere in this project that implements DIS
// enumerations in C++ and Java, but to keep things simple we just use
// numbers here.
// Manual way to override platform information:
EntityType entityType = espdu.getEntityType()
.setEntityKind (EntityKind.PLATFORM).setEntityKind (EntityKind.PLATFORM) //(short) 1); // Platform (vs lifeform, munition, sensor, etc.); //(short) 1); // Platform (vs lifeform, munition, sensor, etc.)
.setCountry (Country.UNITED_STATES_OF_AMERICA_USA) // 225 USA
.setDomain (Domain.inst(PlatformDomain.LAND)) // Land (vs air, surface, subsurface, space)
.setCategory ((byte) 7) // Large vic
.setSubCategory((byte) 39) // MTVR
.setSpecific ((byte) 2); // MTVR
// New way using entity jar(s)
espdu.setEntityType(new edu.nps.moves.dis7.entities.usa.platform.land.MTVRMK25Cargo());
// or simply use an enumeration by name, with accompanying import statement above
espdu.setEntityType(new MTVRMK25Cargo());
// Inspecting an enumeration
System.out.println("===============");
System.out.println("espdu entityType information:");
System.out.println(" EntityKind =" + espdu.getEntityType().getEntityKind());
System.out.println(" Country =" + espdu.getEntityType().getCountry());
System.out.println(" Domain =" + espdu.getEntityType().getDomain());
System.out.println(" Category =" + espdu.getEntityType().getCategory());
System.out.println(" SubCategory=" + espdu.getEntityType().getSubCategory());
System.out.println(" Specific =" + espdu.getEntityType().getCountry());
System.out.println("I am an MTVRMK25 Cargo Truck");
// TODO round trip lookup
Set<InetAddress> localNetworkAddresses;
try // Loop through sending N ESPDUs
{
System.out.println(TRACE_PREFIX + "sending " + NUMBER_OF_LOOPS + " sets of packets:"); // + address.toString()
for (int index = 0; index < NUMBER_OF_LOOPS; index++)
{
// DIS time is a pain in the uh, neck. DIS time units are 2^31-1 units per
// hour, and time is set to DIS time units from the top of the hour.
// This means that if you start sending just before the top of the hour
// the time units can roll over to zero as you are sending. The receivers
// (escpecially homegrown ones) are often not able to detect rollover
// and may start discarding packets as dupes or out of order. We use
// an NPS timestamp here, hundredths of a second since the start of the
// year. The DIS standard for time is often ignored in the wild; I've seen
// people use Unix time (seconds since 1970) and more. Or you can
// just stuff idx into the timestamp field to get something that is monotonically
// increasing.
// Note that timestamp is used to detect duplicate and out of order packets.
// That means if you DON'T change the timestamp, many implementations will simply
// discard subsequent packets that have an identical timestamp. Also, if they
// receive a PDU with an timestamp lower than the last one they received, they
// may discard it as an earlier, out-of-order PDU. So it is a good idea to
// update the timestamp on ALL packets sent.
// An alterative approach: actually follow the standard. It's a crazy concept,
// but it might just work.
int timestamp = disTime.getDisAbsoluteTimestamp();
espdu.setTimestamp(timestamp);
// Set the position of the entity in the world. DIS uses a cartesian
// coordinate system with the origin at the center of the earth, the x
// axis out at the equator and prime meridian, y out at the equator and
// 90 deg east, and z up and out the north pole. To place an object on
// the earth's surface you also need a model for the shape of the earth
// (it's not a sphere.) All the fancy math necessary to do this is in
// the SEDRIS SRM package. There are also some one-off formulas for
// doing conversions from, for example, lat/lon/altitude to DIS coordinates.
// Here we use those one-off formulas.
// Modify the position of the object. This will send the object a little
// due east by adding some to the longitude every iteration. Since we
// are on the Pacific coast, this sends the object east. Assume we are
// at zero altitude. In other worlds you'd use DTED to determine the
// local ground altitude at that lat/lon, or you'd just use ground clamping.
// The x and y values will change, but the z value should not.
//lon = lon + (double)((double)idx / 100000.0);
//System.out.println("lla=" + lat + "," + lon + ", 0.0");
double direction = Math.pow(-1.0, index);
longitude = longitude + (direction * 0.00006);
double disCoordinates[] = CoordinateConversions.getXYZfromLatLonDegrees(latitude, longitude, 1.0);
Vector3Double location = espdu.getEntityLocation();
location.setX(disCoordinates[0]);
location.setY(disCoordinates[1]);
location.setZ(disCoordinates[2]);
System.out.println("===============");
System.out.println("Create new PDUs");
System.out.println(" latitude, longitude: [" + latitude + ", " + longitude + "]");
System.out.println(" coordinate conversion: [" + disCoordinates[0] + ", " + disCoordinates[1] + ", " + disCoordinates[2] + "]");
location = espdu.getEntityLocation();
System.out.println("Espdu #" + index + " entityID=[" + entityID.getSiteID()+ "," + entityID.getApplicationID()+ "," + entityID.getEntityID()+ "]");
double c[] = {location.getX(), location.getY(), location.getZ()};
double lla[] = CoordinateConversions.xyzToLatLonDegrees(c);
// System.out.println(" DIS entityLocation: [" + location.getX() + "," + location.getY() + "," + location.getZ() + "]");
String debugString = " Location (latitude/longitude/altitude): [" + lla[0] + ", " + lla[1] + ", " + lla[2] + "]";
// System.out.println(debugString);
// Optionally, we can do some rotation of the entity
/*
Orientation orientation = espdu.getEntityOrientation();
float psi = orientation.getPsi();
psi = psi + idx;
orientation.setPsi(psi);
orientation.setTheta((float)(orientation.getTheta() + idx /2.0));
*/
// You can set other ESPDU values here, such as the velocity, acceleration,
// and so on.
// Marshal out the espdu object to a byte array, then send a datagram
// packet with that data in it.
double[] locOr = {location.getX(),location.getY(),location.getZ(), 5,6,1, 1,2,1, 0,0,0, 0,0,0};
ByteArrayOutputStream baos = new ByteArrayOutputStream();
DataOutputStream dos = new DataOutputStream(baos);
DatagramPacket packet;
// The byte array here is the packet in DIS format. We put that into a
// datagram and send it.
espdu.marshal(dos);
byte[] espduArray = baos.toByteArray();
FirePdu firePdu = new FirePdu();
firePdu.setLocationInWorldCoordinates(espdu.getEntityLocation());
byte[] fireArray = firePdu.marshal();
// 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);
// byte[] commentArray = newCommentPdu.marshal();
localNetworkAddresses = getBroadcastAddresses();
for (InetAddress networkAddress : localNetworkAddresses) {
if (espduArray.length > 0)
{
System.out.println(TRACE_PREFIX + "sending datagram packet [" + espdu.getPduType().toString() + "] to " +
String.format("%-15s", networkAddress.getHostAddress()) + " port " + port);
packet = new DatagramPacket(espduArray, espduArray.length, networkAddress, port);
socket.send(packet);
}
// TODO experiment with these! 8)
if (fireArray.length > 0)
{
System.out.println(TRACE_PREFIX + "sending datagram packet [" + firePdu.getPduType().toString() + " ] to " +
String.format("%-15s", networkAddress.getHostAddress()) + " port " + port);
packet = new DatagramPacket(fireArray, fireArray.length, networkAddress, port); // alternate
socket.send(packet);
}
// // TODO experiment with these! 8)
// if (newCommentPdu != null)
// {
// System.out.println(TRACE_PREFIX + "sending datagram packet [" + newCommentPdu.getPduType().toString() + " ] to " +
// String.format("%-15s", networkAddress.getHostAddress()) + " port " + port);
// packet = new DatagramPacket(commentArray, commentArray.length, networkAddress, port); // alternate
// socket.send(packet);
// }
}
// Send every 1 second within loop. Otherwise all this will be all over in a fraction of a second.
Thread.sleep(1000); // msec
}
}
catch (Exception e)
{
System.out.println(TRACE_PREFIX + "Problem with " + e + ", see exception trace:");
System.out.println(e);
}
System.out.println("===============");
System.out.println(TRACE_PREFIX + "complete.");
}
/**
* A number of sites get all snippy about using 255.255.255.255 for a
* broadcast address; it trips their security software and they kick you off
* their network. (Comcast, NPS, etc.) This determines the broadcast address for
* all connected interfaces, based on the IP and subnet mask. If you have a
* dual-homed host it will return a broadcast address for both. If you have
* some VMs running on your host this will pick up the addresses for those
* as well--e.g. running VMWare on your laptop with a local IP this will also
* pick up a 192.168 address assigned to the VM by the host OS.
*
* @return set of all broadcast addresses
*/
public static Set<InetAddress> getBroadcastAddresses()
{
Set<InetAddress> broadcastAddresses = new HashSet<>();
Enumeration interfaces;
try {
interfaces = NetworkInterface.getNetworkInterfaces();
while (interfaces.hasMoreElements())
{
NetworkInterface anInterface = (NetworkInterface) interfaces.nextElement();
if (anInterface.isUp())
{
for (InterfaceAddress anAddress : anInterface.getInterfaceAddresses()) {
if ((anAddress == null || anAddress.getAddress().isLinkLocalAddress()))
{
continue;
}
//System.out.println("Getting broadcast address for " + anAddress);
InetAddress broadcastAddress = anAddress.getBroadcast();
if (broadcastAddress != null)
{
broadcastAddresses.add(broadcastAddress);
}
}
}
}
}
catch (SocketException e)
{
System.out.println(TRACE_PREFIX + "Problem with .getBroadcastAddresses(), see exception trace:" + e);
System.out.println(e);
}
return broadcastAddresses;
}
}
/**
* 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.Britt;
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 M49ID = new EntityID();
M49ID.setSiteID(1);
M49ID.setApplicationID(13);
M49ID.setEntityID(26);
entityStatePdu.setEntityID(M49ID);
EntityType M49Type = new EntityType(); //1.1.225.7.1.11 Platform,Ground,USA,M49
M49Type.setEntityKind(EntityKind.PLATFORM);
M49Type.setDomain(Domain.inst(PlatformDomain.LAND));
M49Type.setCountry(Country.UNITED_STATES_OF_AMERICA_USA);
M49Type.setCategory(7);
M49Type.setSubCategory(1);
M49Type.setSpecific(11);
entityStatePdu.setEntityType(M49Type);
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 NPSID = new EntityID();
NPSID.setSiteID(1);
NPSID.setApplicationID(13);
NPSID.setEntityID(27);
entityStatePdu2.setEntityID(NPSID);
EntityType NPSType = new EntityType(); //5.1.0.14.1.3 NPS Building not sure if this is the right info but its the enumeration of a building in the siso doc
NPSType.setEntityKind(EntityKind.CULTURAL_FEATURE);
NPSType.setDomain(Domain.inst(PlatformDomain.LAND));
NPSType.setCountry(Country.UNITED_STATES_OF_AMERICA_USA);
NPSType.setCategory(14);
NPSType.setSubCategory(1);
NPSType.setSpecific(3);
entityStatePdu2.setEntityType(NPSType);
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(26);
EntityID targetID = new EntityID();
targetID.setSiteID(1);
targetID.setApplicationID(13);
targetID.setEntityID(27);
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() - 10); // 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