diff --git a/src/edu/nps/moves/dis7/examples/EspduSender.java b/src/edu/nps/moves/dis7/examples/EspduSender.java index 4492cc7be4b7984f6cdda59e293ef07387625639..9cce76cbb75fc570c505890232f184821b406a16 100644 --- a/src/edu/nps/moves/dis7/examples/EspduSender.java +++ b/src/edu/nps/moves/dis7/examples/EspduSender.java @@ -8,6 +8,8 @@ package edu.nps.moves.dis7.examples; import edu.nps.moves.dis7.pdus.*; import edu.nps.moves.dis7.utilities.CoordinateConversions; import edu.nps.moves.dis7.utilities.DisThreadedNetworkInterface; +import edu.nps.moves.dis7.utilities.PduFactory; + import java.io.*; import java.net.*; import java.util.*; @@ -115,27 +117,14 @@ public class EspduSender System.exit(-1); } - EntityStatePdu espdu = new EntityStatePdu(); - DisTime disTime = new DisTime(); + // Factory with default absolute time + PduFactory pduFac = new PduFactory(); + EntityStatePdu espdu = pduFac.makeEntityStatePdu(); // ICBM coordinates for my office double lat = 36.595517; double lon = -121.877000; - // 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); - - // 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(); - entityID.setSiteID((short) 1); // 0 is apparently not a valid site number, per the spec - entityID.setApplicationID((short) 1); - entityID.setEntityID((short) 2); - // 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 @@ -155,10 +144,23 @@ public class EspduSender // Using entitytype jar espdu.setEntityType(new edu.nps.moves.dis7.entities.usa.platform.land.M1A2()); - Set<InetAddress> broadcastAddresses; + Set<InetAddress> broadcastAddresses = getBroadcastAddresses(); + // Loop through sending N ESPDUs try { System.out.println("Sending " + NUMBER_TO_SEND + " ESPDU packets to " + destinationIp.toString()); + int timestamp; + double direction; + double disCoordinates[]; + Vector3Double location; + FirePdu fire; + byte[] fireArray; + byte[] data; + DatagramPacket packet; + + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + DataOutputStream dos = new DataOutputStream(baos); + for (int idx = 0; idx < NUMBER_TO_SEND; idx++) { // DIS time is a pain in the ass. DIS time units are 2^31-1 units per // hour, and time is set to DIS time units from the top of the hour. @@ -180,7 +182,7 @@ public class EspduSender // 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(); + timestamp = pduFac.getTimestamp(); espdu.setTimestamp(timestamp); // Set the position of the entity in the world. DIS uses a cartesian @@ -200,17 +202,17 @@ public class EspduSender // 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, idx); + direction = Math.pow(-1.0, idx); lon = lon + (direction * 0.00006); - System.out.println(lon); +// System.out.println(lon); - double disCoordinates[] = CoordinateConversions.getXYZfromLatLonDegrees(lat, lon, 1.0); - Vector3Double location = espdu.getEntityLocation(); + disCoordinates = CoordinateConversions.getXYZfromLatLonDegrees(lat, lon, 1.0); + location = espdu.getEntityLocation(); location.setX(disCoordinates[0]); location.setY(disCoordinates[1]); location.setZ(disCoordinates[2]); - System.out.println("lat, lon:" + lat + ", " + lon); - System.out.println("DIS coord:" + disCoordinates[0] + ", " + disCoordinates[1] + ", " + disCoordinates[2]); +// System.out.println("lat, lon: (" + lat + ", " + lon + ")"); +// System.out.println("DIS coord: (" + disCoordinates[0] + ", " + disCoordinates[1] + ", " + disCoordinates[2] + ")"); // Optionally, we can do some rotation of the entity /* @@ -220,28 +222,25 @@ public class EspduSender 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. - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - DataOutputStream dos = new DataOutputStream(baos); espdu.marshal(dos); - FirePdu fire = new FirePdu(); - byte[] fireArray = fire.marshal(); - // The byte array here is the packet in DIS format. We put that into a // datagram and send it. - byte[] data = baos.toByteArray(); - - broadcastAddresses = getBroadcastAddresses(); - DatagramPacket packet; + data = baos.toByteArray(); + fire = pduFac.makeFirePdu(); + fireArray = fire.marshal(); + for (InetAddress broadcast : broadcastAddresses) { - System.out.println("Sending broadcast datagram packet to " + broadcast); + System.out.println("Sending broadcast datagram packets to " + broadcast); packet = new DatagramPacket(data, data.length, broadcast, port); socket.send(packet); + // TODO experiment with these! 8) packet = new DatagramPacket(fireArray, fireArray.length, broadcast, port); // alternate socket.send(packet); @@ -250,13 +249,15 @@ public class EspduSender // Send every 1 sec. Otherwise this will be all over in a fraction of a second. Thread.sleep(1000L); - location = espdu.getEntityLocation(); + baos.reset(); - System.out.println("Espdu #" + idx + " EID=[" + entityID.getSiteID() + "," + entityID.getApplicationID() + "," + entityID.getEntityID() + "]"); - System.out.println(" DIS coordinates location=[" + location.getX() + "," + location.getY() + "," + location.getZ() + "]"); + System.out.println("Espdu #" + idx + " EID=[" + espdu.getEntityID().getSiteID() + ", " + espdu.getEntityID().getApplicationID() + ", " + espdu.getEntityID().getEntityID() + "]"); + System.out.println(" DIS coordinates location=[" + location.getX() + ", " + location.getY() + ", " + location.getZ() + "]"); // double c[] = {location.getX(), location.getY(), location.getZ()}; // double lla[] = CoordinateConversions.xyzToLatLonDegrees(c); // System.out.println(" Location (lat/lon/alt): [" + lla[0] + ", " + lla[1] + ", " + lla[2] + "]"); + + System.out.println("FirePdu #" + idx + " EID=[" + fire.getFiringEntityID().getSiteID() + ", " + fire.getFiringEntityID().getApplicationID() + ", " + fire.getFiringEntityID().getEntityID() + "]"); } } catch (Exception ex) {