//use this for initialisation private void Start() { //set the NPC agent and its destination agent = GetComponent <NavMeshAgent>(); int d = UnityEngine.Random.Range(0, wps.Length); crossingMask = 1 << NavMesh.GetAreaFromName("Crossing"); agent.SetDestination(wps[d].transform.position); prev_location = this.agent.transform.position; change = new float[2]; change[0] = 0; change[1] = 0; // Setting espdu's settings espdu = new EntityStatePdu(); espdu.ExerciseID = 1; // Setting EntityID settings for this Bird EntityID eid = espdu.EntityID; eid.Site = 0; eid.Application = 1; eid.Entity = 2; EntityType entityType = espdu.EntityType; entityType.EntityKind = 3; // 3 means "lifeform" (as opposed to platform, environment etc) entityType.Country = 13; // These are Aussies entityType.Domain = 1; // Land (vs air, surface, subsurface, space) entityType.Category = 130; // Civilian (Entity Kind) // Setting the Espdu sender's target IP sender = new Sender(IPAddress.Parse("192.168.1.117"), 62040, 62040); // Configure to target IP address/ports in .json? Sender.StartBroadcast(); }
public void Demonstrate() { //start the background listener _connector.StartListening(); Console.WriteLine("[RECEIVER - INFO] Started receiving example"); //ever ongoing loop for the sake of this example while (true) { foreach (Pdu pdu in _connector.GetEnqueuedPDUs()) { Console.WriteLine("[RECEIVER - INFO] Received PDU with timestamp {0}", pdu.Timestamp); //do with it whatever you want, but it usually requires casting to the appropiate PDU type if (pdu is EntityStatePdu) { Console.WriteLine("[RECEIVER - INFO] Received PDU is of type EntityState."); EntityStatePdu espdu = (EntityStatePdu)pdu; Console.WriteLine( "[RECEIVER - INFO] Entity ID:{0} Location: (x:{1}, y:{2}, z:{3})", espdu.EntityID, espdu.EntityLocation.X, espdu.EntityLocation.Y, espdu.EntityLocation.Z ); } else if (pdu is DetonationPdu) { DetonationPdu dpdu = (DetonationPdu)pdu; Console.WriteLine("[RECEIVER - INFO] Received PDU is of type Detonation."); } } } }
public float threshold = 5.0f; // The threshold of position change above which an Espdu is sent // Start is called before the first frame update void Start() { this.GetComponent <Rigidbody2D>().velocity = new Vector2(1, 1); location = new Vector2(this.gameObject.transform.position.x, this.gameObject.transform.position.y); detectDistance = 5.0f; prev_location = this.location; // This will be reset if the DeadReckoning threshold is passed and the Espdu is sent // Setting espdu's settings espdu = new EntityStatePdu(); espdu.ExerciseID = 1; // Setting EntityID settings for this Bird EntityID eid = espdu.EntityID; eid.Site = 0; eid.Application = 1; eid.Entity = 2; EntityType entityType = espdu.EntityType; entityType.EntityKind = 3; // 3 means "lifeform" (as opposed to platform, environment etc) entityType.Country = 13; // These are Aussie birds ;) entityType.Domain = 2; // Air (vs land, surface, subsurface, space) entityType.Category = 0; // Other (it's a bird) }
static public DIS1998net.Pdu GetPDU(DISnet.Utilities.PDUTypes.PDUType1998 pdu_type) { DIS1998net.Pdu pdu = null; switch (pdu_type) { case PDUTypes.PDUType1998.PDU_ENTITY_STATE: pdu = new EntityStatePdu(); break; case PDUTypes.PDUType1998.PDU_FIRE: pdu = new FirePdu(); break; case PDUTypes.PDUType1998.PDU_DETONATION: pdu = new DetonationPdu(); break; case PDUTypes.PDUType1998.PDU_COLLISION: pdu = new CollisionPdu(); break; case PDUTypes.PDUType1998.PDU_SERVICE_REQUEST: pdu = new ServiceRequestPdu(); break; case PDUTypes.PDUType1998.PDU_RESUPPLY_OFFER: pdu = new ResupplyOfferPdu(); break; case PDUTypes.PDUType1998.PDU_RESUPPLY_RECEIVED: pdu = new ResupplyReceivedPdu(); break; case PDUTypes.PDUType1998.PDU_RESUPPLY_CANCEL: pdu = new ResupplyCancelPdu(); break; case PDUTypes.PDUType1998.PDU_REPAIR_COMPLETE: pdu = new RepairCompletePdu(); break; case PDUTypes.PDUType1998.PDU_REPAIR_RESPONSE: pdu = new RepairResponsePdu(); break; case PDUTypes.PDUType1998.PDU_CREATE_ENTITY: pdu = new CreateEntityPdu(); break; case PDUTypes.PDUType1998.PDU_REMOVE_ENTITY: pdu = new RemoveEntityPdu(); break; case PDUTypes.PDUType1998.PDU_START_RESUME: pdu = new StartResumePdu(); break; case PDUTypes.PDUType1998.PDU_ACKNOWLEDGE: pdu = new AcknowledgePdu(); break; case PDUTypes.PDUType1998.PDU_ACTION_REQUEST: pdu = new ActionRequestPdu(); break; case PDUTypes.PDUType1998.PDU_ACTION_RESPONSE: pdu = new ActionResponsePdu(); break; case PDUTypes.PDUType1998.PDU_DATA_QUERY: pdu = new DataQueryPdu(); break; case PDUTypes.PDUType1998.PDU_SET_DATA: pdu = new SetDataPdu(); break; case PDUTypes.PDUType1998.PDU_EVENT_REPORT: pdu = new EventReportPdu(); break; case PDUTypes.PDUType1998.PDU_COMMENT: pdu = new CommentPdu(); break; case PDUTypes.PDUType1998.PDU_STOP_FREEZE: pdu = new StopFreezePdu(); break; case PDUTypes.PDUType1998.PDU_SIGNAL: pdu = new SignalPdu(); break; case PDUTypes.PDUType1998.PDU_TRANSMITTER: pdu = new TransmitterPdu(); break; } return(pdu); }
public void Update() { if (pduQueue.Count > 0) { lock (((ICollection)pduQueue).SyncRoot) { while (pduQueue.Count > 0) { Pdu pdu = this.pduQueue.Dequeue(); switch ((PduType)pdu.PduType) { case PduType.EntityState: EntityStatePdu entityStatePdu = (EntityStatePdu)pdu; if (stevec % 500 == 0) { Debug.Log("\tPREMIKANJE: EntityID: " + entityStatePdu.EntityID + " EntityState: " + stevec + " Queue: " + pduQueue.Count); } ChangeEntityState(entityStatePdu); break; case PduType.Fire: FirePdu firePdu = (FirePdu)pdu; SendDisEvent(firePdu); break; case PduType.Detonation: DetonationPdu detonationPdu = (DetonationPdu)pdu; SendDisEvent(detonationPdu); break; case PduType.Collision: CollisionPdu collisionPdu = (CollisionPdu)pdu; Debug.Log("\tCollision: " + collisionPdu.PduType + " " + stevec); break; case PduType.IFF_ATC_NAVAIDS: Debug.Log("\tIFF_ATC_NAVAIDS"); break; default: //Debug.Log("\tOTHER: " + newPdu.PduType + " " + stevec+" Queue: "+queue.Count); //Debug.Log ("\t\t"+newPdu.Length); break; } } } } }
public void Demonstrate() { Console.WriteLine("[SENDER - INFO] Started sending example"); //Marnehuizen double lat = 53.3889139; double lon = 6.263677777777778; EntityStatePdu espdu = new EntityStatePdu(); espdu.ExerciseID = 1; EntityID eid = espdu.EntityID; eid.Site = 0; eid.Application = 1; eid.Entity = 2; EntityType entityType = espdu.EntityType; entityType.Country = (ushort)Country.Netherlands; // NL entityType.EntityKind = (byte)EntityKind.LifeForm; // Life form (vs platform, munition, sensor, etc.) entityType.Domain = (byte)Platform.Land; // Land (vs air, surface, subsurface, space) entityType.Category = 0; //empty entityType.Subcategory = 1; // Dismounted entityType.Specific = 5; //carrying an assault rifle entityType.Extra = 1; //Moving alone while (true) { lat += (1d / 11132000); lon += (1d / 40075) * Math.Cos(lat) / 360d; double[] disCoordinates = CoordinateConversions.getXYZfromLatLonDegrees(lat, lon, 0.0); Console.WriteLine("[SENDER - INFO] Entity is now at (lat:{0}, long:{1}", lat, lon); Vector3Double location = espdu.EntityLocation; location.X = disCoordinates[0]; location.Y = disCoordinates[1]; location.Z = disCoordinates[2]; espdu.Timestamp = DisTime.DisRelativeTimestamp; //send the constructed PDU to the specified multicast group _connector.sendPDU(espdu, MulticastGroup.Parse("224.5.5.5")); Console.WriteLine("[SENDER - INFO] PDU broadcasted"); Thread.Sleep(15000); } }
private void ChangeEntityState(EntityStatePdu entityStatePdu) { int entityID = entityStatePdu.EntityID.Entity; int entityDamage = (entityStatePdu.EntityAppearance & 24) >> 3; Vector3D geographicalCoordinates = CalculationUtil.ConvertToGeographicalCoordinates( new Vector3D(entityStatePdu.EntityLocation.X, entityStatePdu.EntityLocation.Y, entityStatePdu.EntityLocation.Z)); Vector3 worldCoordinates = CalculationUtil.ConvertToWorldCoordinates(geographicalCoordinates, entityStatePdu.EntityType.Domain, layerMask_terrain); // calculating velocity and setting movement Vector3D velocityVec3D = new Vector3D(entityStatePdu.EntityLinearVelocity.X, entityStatePdu.EntityLinearVelocity.Y, entityStatePdu.EntityLinearVelocity.Z); if (velocityVec3D.x != 0 || velocityVec3D.y != 0 || velocityVec3D.z != 0) { Vector3D velocityCoordinates = CalculationUtil.ConvertToGeographicalCoordinates(new Vector3D( entityStatePdu.EntityLocation.X + entityStatePdu.EntityLinearVelocity.X, entityStatePdu.EntityLocation.Y + entityStatePdu.EntityLinearVelocity.Y, entityStatePdu.EntityLocation.Z + entityStatePdu.EntityLinearVelocity.Z)); Vector3 worldCoordinatesVelocity = CalculationUtil.ConvertToWorldCoordinates(velocityCoordinates, entityStatePdu.EntityType.Domain, layerMask_terrain); Vector3 lookAtVector = (new Vector3(worldCoordinatesVelocity.x, 0, worldCoordinatesVelocity.z) - new Vector3(worldCoordinates.x, 0, worldCoordinates.z)).normalized; float distance = Vector3.Distance( new Vector3(worldCoordinates.x, 0, worldCoordinates.z), new Vector3(worldCoordinatesVelocity.x, 0, worldCoordinatesVelocity.z)); this.entityHandlerScript.SetEntityMovementAndDamage(entityID, true, lookAtVector, distance, entityDamage, geographicalCoordinates, worldCoordinates, entityStatePdu.EntityType.Domain); } // else rotate entity based on previous location else { this.entityHandlerScript.SetEntityMovementAndDamage(entityID, false, Vector3.zero, 0, entityDamage, geographicalCoordinates, worldCoordinates, entityStatePdu.EntityType.Domain); } }
/// <summary> /// Used to unmarshal data back into the correct PDU type. /// </summary> /// <param name="pduType">PDU type</param> /// <param name="ds">Datastream which contains the raw packet and Endian Type</param> /// <remarks>Added by PES to work with Mobile.</remarks> /// <returns>The PDU instance.</returns> public static Pdu UnmarshalRawPdu(PduType pduType, DataInputStream ds) { var pdu = new Pdu(); switch (pduType) { case PduType.EntityState: pdu = new EntityStatePdu(); pdu.Unmarshal(ds); break; case PduType.Fire: pdu = new FirePdu(); pdu.Unmarshal(ds); break; case PduType.Detonation: pdu = new DetonationPdu(); pdu.Unmarshal(ds); break; case PduType.Collision: pdu = new CollisionPdu(); pdu.Unmarshal(ds); break; case PduType.ServiceRequest: pdu = new ServiceRequestPdu(); pdu.Unmarshal(ds); break; case PduType.ResupplyOffer: pdu = new ResupplyOfferPdu(); pdu.Unmarshal(ds); break; case PduType.ResupplyReceived: pdu = new ResupplyReceivedPdu(); pdu.Unmarshal(ds); break; case PduType.ResupplyCancel: pdu = new ResupplyCancelPdu(); pdu.Unmarshal(ds); break; case PduType.RepairComplete: pdu = new RepairCompletePdu(); pdu.Unmarshal(ds); break; case PduType.RepairResponse: pdu = new RepairResponsePdu(); pdu.Unmarshal(ds); break; case PduType.CreateEntity: pdu = new CreateEntityPdu(); pdu.Unmarshal(ds); break; case PduType.RemoveEntity: pdu = new RemoveEntityPdu(); pdu.Unmarshal(ds); break; case PduType.StartResume: pdu = new StartResumePdu(); pdu.Unmarshal(ds); break; case PduType.Acknowledge: pdu = new AcknowledgePdu(); pdu.Unmarshal(ds); break; case PduType.ActionRequest: pdu = new ActionRequestPdu(); pdu.Unmarshal(ds); break; case PduType.ActionResponse: pdu = new ActionResponsePdu(); pdu.Unmarshal(ds); break; case PduType.DataQuery: pdu = new DataQueryPdu(); pdu.Unmarshal(ds); break; case PduType.SetData: pdu = new SetDataPdu(); pdu.Unmarshal(ds); break; case PduType.EventReport: pdu = new EventReportPdu(); pdu.Unmarshal(ds); break; case PduType.Comment: pdu = new CommentPdu(); pdu.Unmarshal(ds); break; case PduType.StopFreeze: pdu = new StopFreezePdu(); pdu.Unmarshal(ds); break; case PduType.Signal: pdu = new SignalPdu(); pdu.Unmarshal(ds); break; case PduType.Transmitter: pdu = new TransmitterPdu(); pdu.Unmarshal(ds); break; case PduType.ElectromagneticEmission: pdu = new ElectronicEmissionsPdu(); pdu.Unmarshal(ds); break; case PduType.Designator: pdu = new DesignatorPdu(); pdu.Unmarshal(ds); break; case PduType.Receiver: pdu = new ReceiverPdu(); pdu.Unmarshal(ds); break; case PduType.IFF_ATC_NAVAIDS: pdu = new IffAtcNavAidsLayer1Pdu(); pdu.Unmarshal(ds); break; case PduType.UnderwaterAcoustic: pdu = new UaPdu(); pdu.Unmarshal(ds); break; case PduType.SupplementalEmissionEntityState: pdu = new SeesPdu(); pdu.Unmarshal(ds); break; case PduType.IntercomSignal: pdu = new IntercomSignalPdu(); pdu.Unmarshal(ds); break; case PduType.IntercomControl: pdu = new IntercomControlPdu(); pdu.Unmarshal(ds); break; case PduType.AggregateState: pdu = new AggregateStatePdu(); pdu.Unmarshal(ds); break; case PduType.IsGroupOf: pdu = new IsGroupOfPdu(); pdu.Unmarshal(ds); break; case PduType.TransferControl: pdu = new TransferControlRequestPdu(); pdu.Unmarshal(ds); break; case PduType.IsPartOf: pdu = new IsPartOfPdu(); pdu.Unmarshal(ds); break; case PduType.MinefieldState: pdu = new MinefieldStatePdu(); pdu.Unmarshal(ds); break; case PduType.MinefieldQuery: pdu = new MinefieldQueryPdu(); pdu.Unmarshal(ds); break; case PduType.MinefieldData: pdu = new MinefieldDataPdu(); pdu.Unmarshal(ds); break; case PduType.MinefieldResponseNAK: pdu = new MinefieldResponseNackPdu(); pdu.Unmarshal(ds); break; case PduType.EnvironmentalProcess: pdu = new EnvironmentalProcessPdu(); pdu.Unmarshal(ds); break; case PduType.GriddedData: pdu = new GriddedDataPdu(); pdu.Unmarshal(ds); break; case PduType.PointObjectState: pdu = new PointObjectStatePdu(); pdu.Unmarshal(ds); break; case PduType.LinearObjectState: pdu = new LinearObjectStatePdu(); pdu.Unmarshal(ds); break; case PduType.ArealObjectState: pdu = new ArealObjectStatePdu(); pdu.Unmarshal(ds); break; case PduType.TSPI: throw new NotSupportedException(); case PduType.Appearance: throw new NotSupportedException(); case PduType.ArticulatedParts: throw new NotSupportedException(); case PduType.LEFire: throw new NotSupportedException(); case PduType.LEDetonation: throw new NotSupportedException(); case PduType.CreateEntityR: pdu = new CreateEntityReliablePdu(); pdu.Unmarshal(ds); break; case PduType.RemoveEntityR: pdu = new RemoveEntityReliablePdu(); pdu.Unmarshal(ds); break; case PduType.StartResumeR: pdu = new StartResumeReliablePdu(); pdu.Unmarshal(ds); break; case PduType.StopFreezeR: pdu = new StopFreezeReliablePdu(); pdu.Unmarshal(ds); break; case PduType.AcknowledgeR: pdu = new AcknowledgeReliablePdu(); pdu.Unmarshal(ds); break; case PduType.ActionRequestR: pdu = new ActionRequestReliablePdu(); pdu.Unmarshal(ds); break; case PduType.ActionResponseR: pdu = new ActionResponseReliablePdu(); pdu.Unmarshal(ds); break; case PduType.DataQueryR: pdu = new DataQueryReliablePdu(); pdu.Unmarshal(ds); break; case PduType.SetDataR: pdu = new SetDataReliablePdu(); pdu.Unmarshal(ds); break; case PduType.DataR: pdu = new DataReliablePdu(); pdu.Unmarshal(ds); break; case PduType.EventReportR: pdu = new EventReportReliablePdu(); pdu.Unmarshal(ds); break; case PduType.CommentR: pdu = new CommentReliablePdu(); pdu.Unmarshal(ds); break; case PduType.RecordR: pdu = new RecordQueryReliablePdu(); pdu.Unmarshal(ds); break; case PduType.SetRecordR: pdu = new SetRecordReliablePdu(); pdu.Unmarshal(ds); break; case PduType.RecordQueryR: pdu = new RecordQueryReliablePdu(); pdu.Unmarshal(ds); break; case PduType.CollisionElastic: pdu = new CollisionElasticPdu(); pdu.Unmarshal(ds); break; case PduType.EntityStateUpdate: pdu = new EntityStateUpdatePdu(); pdu.Unmarshal(ds); break; } return(pdu); }
/// <summary> /// Used to unmarshal data back into the correct PDU type. /// </summary> /// <param name="pduType">PDU type</param> /// <param name="ds">Datastream which contains the raw packet and Endian Type</param> /// <remarks>Added by PES to work with Mobile.</remarks> /// <returns>The PDU instance.</returns> public static Pdu UnmarshalRawPdu(PduType pduType, DataInputStream ds) { Pdu pdu = new Pdu(); switch (pduType) { case PduType.EntityState: EntityStatePdu entityStatePdu = new EntityStatePdu(); entityStatePdu.Unmarshal(ds); pdu = (Pdu)entityStatePdu; break; case PduType.Fire: FirePdu firePdu = new FirePdu(); firePdu.Unmarshal(ds); pdu = (Pdu)firePdu; break; case PduType.Detonation: DetonationPdu detonationPdu = new DetonationPdu(); detonationPdu.Unmarshal(ds); pdu = (Pdu)detonationPdu; break; case PduType.Collision: CollisionPdu collisionPdu = new CollisionPdu(); collisionPdu.Unmarshal(ds); pdu = (Pdu)collisionPdu; break; case PduType.ServiceRequest: ServiceRequestPdu serviceRequestPdu = new ServiceRequestPdu(); serviceRequestPdu.Unmarshal(ds); pdu = (Pdu)serviceRequestPdu; break; case PduType.ResupplyOffer: ResupplyOfferPdu resupplyOfferPdu = new ResupplyOfferPdu(); resupplyOfferPdu.Unmarshal(ds); pdu = (Pdu)resupplyOfferPdu; break; case PduType.ResupplyReceived: ResupplyReceivedPdu resupplyReceivedPdu = new ResupplyReceivedPdu(); resupplyReceivedPdu.Unmarshal(ds); pdu = (Pdu)resupplyReceivedPdu; break; case PduType.ResupplyCancel: ResupplyCancelPdu resupplyCancelPdu = new ResupplyCancelPdu(); resupplyCancelPdu.Unmarshal(ds); pdu = (Pdu)resupplyCancelPdu; break; case PduType.RepairComplete: RepairCompletePdu repairCompletePdu = new RepairCompletePdu(); repairCompletePdu.Unmarshal(ds); pdu = (Pdu)repairCompletePdu; break; case PduType.RepairResponse: RepairResponsePdu repairResponsePdu = new RepairResponsePdu(); repairResponsePdu.Unmarshal(ds); pdu = (Pdu)repairResponsePdu; break; case PduType.CreateEntity: CreateEntityPdu createEntityPdu = new CreateEntityPdu(); createEntityPdu.Unmarshal(ds); pdu = (Pdu)createEntityPdu; break; case PduType.RemoveEntity: RemoveEntityPdu removeEntityPdu = new RemoveEntityPdu(); removeEntityPdu.Unmarshal(ds); pdu = (Pdu)removeEntityPdu; break; case PduType.StartResume: StartResumePdu startResumePdu = new StartResumePdu(); startResumePdu.Unmarshal(ds); pdu = (Pdu)startResumePdu; break; case PduType.Acknowledge: AcknowledgePdu acknowledgePdu = new AcknowledgePdu(); acknowledgePdu.Unmarshal(ds); pdu = (Pdu)acknowledgePdu; break; case PduType.ActionRequest: ActionRequestPdu actionRequestPdu = new ActionRequestPdu(); actionRequestPdu.Unmarshal(ds); pdu = (Pdu)actionRequestPdu; break; case PduType.ActionResponse: ActionResponsePdu actionResponsePdu = new ActionResponsePdu(); actionResponsePdu.Unmarshal(ds); pdu = (Pdu)actionResponsePdu; break; case PduType.DataQuery: DataQueryPdu dataQueryPdu = new DataQueryPdu(); dataQueryPdu.Unmarshal(ds); pdu = (Pdu)dataQueryPdu; break; case PduType.SetData: SetDataPdu setDataPdu = new SetDataPdu(); setDataPdu.Unmarshal(ds); pdu = (Pdu)setDataPdu; break; case PduType.EventReport: EventReportPdu eventReportPdu = new EventReportPdu(); eventReportPdu.Unmarshal(ds); pdu = (Pdu)eventReportPdu; break; case PduType.Comment: CommentPdu commentPdu = new CommentPdu(); commentPdu.Unmarshal(ds); pdu = (Pdu)commentPdu; break; case PduType.StopFreeze: StopFreezePdu stopFreezePdu = new StopFreezePdu(); stopFreezePdu.Unmarshal(ds); pdu = (Pdu)stopFreezePdu; break; case PduType.Signal: SignalPdu signalPdu = new SignalPdu(); signalPdu.Unmarshal(ds); pdu = (Pdu)signalPdu; break; case PduType.Transmitter: TransmitterPdu transmitterPdu = new TransmitterPdu(); transmitterPdu.Unmarshal(ds); pdu = (Pdu)transmitterPdu; break; } return(pdu); }
/// <summary> /// Used to unmarshal data back into the correct PDU type. /// </summary> /// <param name="pduType">PDU type</param> /// <param name="ds">Datastream which contains the raw packet and Endian Type</param> /// <remarks>Added by PES to work with Mobile.</remarks> /// <returns>The PDU instance.</returns> public static Pdu UnmarshalRawPdu(PduType pduType, DataInputStream ds) { Pdu pdu = new Pdu(); switch (pduType) { case PduType.EntityState: EntityStatePdu entityStatePdu = new EntityStatePdu(); entityStatePdu.Unmarshal(ds); pdu = (Pdu)entityStatePdu; break; case PduType.Fire: FirePdu firePdu = new FirePdu(); firePdu.Unmarshal(ds); pdu = (Pdu)firePdu; break; case PduType.Detonation: DetonationPdu detonationPdu = new DetonationPdu(); detonationPdu.Unmarshal(ds); pdu = (Pdu)detonationPdu; break; case PduType.Collision: CollisionPdu collisionPdu = new CollisionPdu(); collisionPdu.Unmarshal(ds); pdu = (Pdu)collisionPdu; break; case PduType.ServiceRequest: ServiceRequestPdu serviceRequestPdu = new ServiceRequestPdu(); serviceRequestPdu.Unmarshal(ds); pdu = (Pdu)serviceRequestPdu; break; case PduType.ResupplyOffer: ResupplyOfferPdu resupplyOfferPdu = new ResupplyOfferPdu(); resupplyOfferPdu.Unmarshal(ds); pdu = (Pdu)resupplyOfferPdu; break; case PduType.ResupplyReceived: ResupplyReceivedPdu resupplyReceivedPdu = new ResupplyReceivedPdu(); resupplyReceivedPdu.Unmarshal(ds); pdu = (Pdu)resupplyReceivedPdu; break; case PduType.ResupplyCancel: ResupplyCancelPdu resupplyCancelPdu = new ResupplyCancelPdu(); resupplyCancelPdu.Unmarshal(ds); pdu = (Pdu)resupplyCancelPdu; break; case PduType.RepairComplete: RepairCompletePdu repairCompletePdu = new RepairCompletePdu(); repairCompletePdu.Unmarshal(ds); pdu = (Pdu)repairCompletePdu; break; case PduType.RepairResponse: RepairResponsePdu repairResponsePdu = new RepairResponsePdu(); repairResponsePdu.Unmarshal(ds); pdu = (Pdu)repairResponsePdu; break; case PduType.CreateEntity: CreateEntityPdu createEntityPdu = new CreateEntityPdu(); createEntityPdu.Unmarshal(ds); pdu = (Pdu)createEntityPdu; break; case PduType.RemoveEntity: RemoveEntityPdu removeEntityPdu = new RemoveEntityPdu(); removeEntityPdu.Unmarshal(ds); pdu = (Pdu)removeEntityPdu; break; case PduType.StartResume: StartResumePdu startResumePdu = new StartResumePdu(); startResumePdu.Unmarshal(ds); pdu = (Pdu)startResumePdu; break; case PduType.Acknowledge: AcknowledgePdu acknowledgePdu = new AcknowledgePdu(); acknowledgePdu.Unmarshal(ds); pdu = (Pdu)acknowledgePdu; break; case PduType.ActionRequest: ActionRequestPdu actionRequestPdu = new ActionRequestPdu(); actionRequestPdu.Unmarshal(ds); pdu = (Pdu)actionRequestPdu; break; case PduType.ActionResponse: ActionResponsePdu actionResponsePdu = new ActionResponsePdu(); actionResponsePdu.Unmarshal(ds); pdu = (Pdu)actionResponsePdu; break; case PduType.DataQuery: DataQueryPdu dataQueryPdu = new DataQueryPdu(); dataQueryPdu.Unmarshal(ds); pdu = (Pdu)dataQueryPdu; break; case PduType.SetData: SetDataPdu setDataPdu = new SetDataPdu(); setDataPdu.Unmarshal(ds); pdu = (Pdu)setDataPdu; break; case PduType.EventReport: EventReportPdu eventReportPdu = new EventReportPdu(); eventReportPdu.Unmarshal(ds); pdu = (Pdu)eventReportPdu; break; case PduType.Comment: CommentPdu commentPdu = new CommentPdu(); commentPdu.Unmarshal(ds); pdu = (Pdu)commentPdu; break; case PduType.StopFreeze: StopFreezePdu stopFreezePdu = new StopFreezePdu(); stopFreezePdu.Unmarshal(ds); pdu = (Pdu)stopFreezePdu; break; case PduType.Signal: SignalPdu signalPdu = new SignalPdu(); signalPdu.Unmarshal(ds); pdu = (Pdu)signalPdu; break; case PduType.Transmitter: TransmitterPdu transmitterPdu = new TransmitterPdu(); transmitterPdu.Unmarshal(ds); pdu = (Pdu)transmitterPdu; break; } return pdu; }
/// <summary> /// Creates the PDU. /// </summary> /// <param name="type">The type of PDU to be created.</param> /// <returns>Returns the corresponding PDU instance or null if PduType.Other is specified.</returns> /// <exception cref="NotImplementedException">if the PDU type specified in parameter is not supported.</exception> public static IPdu CreatePdu(PduType type) { IPdu pdu = null; switch (type) { case PduType.Other: pdu = new Pdu(); break; case PduType.EntityState: pdu = new EntityStatePdu(); break; case PduType.Fire: pdu = new FirePdu(); break; case PduType.Detonation: pdu = new DetonationPdu(); break; case PduType.Collision: pdu = new CollisionPdu(); break; case PduType.ServiceRequest: pdu = new ServiceRequestPdu(); break; case PduType.ResupplyOffer: pdu = new ResupplyOfferPdu(); break; case PduType.ResupplyReceived: pdu = new ResupplyReceivedPdu(); break; case PduType.ResupplyCancel: pdu = new ResupplyCancelPdu(); break; case PduType.RepairComplete: pdu = new RepairCompletePdu(); break; case PduType.RepairResponse: pdu = new RepairResponsePdu(); break; case PduType.CreateEntity: pdu = new CreateEntityPdu(); break; case PduType.RemoveEntity: pdu = new RemoveEntityPdu(); break; case PduType.StartResume: pdu = new StartResumePdu(); break; case PduType.StopFreeze: pdu = new StopFreezePdu(); break; case PduType.Acknowledge: pdu = new AcknowledgePdu(); break; case PduType.ActionRequest: pdu = new ActionRequestPdu(); break; case PduType.ActionResponse: pdu = new ActionResponsePdu(); break; case PduType.DataQuery: pdu = new DataQueryPdu(); break; case PduType.SetData: pdu = new SetDataPdu(); break; case PduType.Data: pdu = new DataPdu(); break; case PduType.EventReport: pdu = new EventReportPdu(); break; case PduType.Comment: pdu = new CommentPdu(); break; case PduType.ElectromagneticEmission: throw new NotImplementedException(); case PduType.Designator: pdu = new DesignatorPdu(); break; case PduType.Transmitter: pdu = new TransmitterPdu(); break; case PduType.Signal: pdu = new SignalPdu(); break; case PduType.Receiver: pdu = new ReceiverPdu(); break; default: throw new NotImplementedException(); } return pdu; }
public static void Main(string[] args) { mcastAddress = IPAddress.Parse("239.1.2.3"); mcastPort = 62040; broadcastPort = 62040; //3000 for DisMapper default var espdu = new EntityStatePdu(); //Could use factory but easier this way //Alcatraz const double lat = 37.827; double lon = -122.425; // Configure socket. //JoinMulticast(); //Used to talk to C# receiver. No need to connect as we are just sending multicast //StartMulticast(); //Least preffered StartBroadcast(); //Used for DisMapper //Setup EntityState PDU espdu.ExerciseID = 1; var eid = espdu.EntityID; eid.Site = 0; eid.Application = 1; eid.Entity = 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 // separate project elsehwhere in this project that implements DIS // enumerations in C++ and Java, but to keep things simple we just use // numbers here. var entityType = espdu.EntityType; entityType.EntityKind = 1; // Platform (vs lifeform, munition, sensor, etc.) entityType.Country = 255; // USA entityType.Domain = 1; // Land (vs air, surface, subsurface, space) entityType.Category = 1; // Tank entityType.Subcategory = 1; // M1 Abrams entityType.Specific = 3; // M1A2 Abrams for (int i = 0; i < 100; i++) { lon += (i / 1000.0); double[] disCoordinates = CoordinateConversions.getXYZfromLatLonDegrees(lat, lon, 0.0); var location = espdu.EntityLocation; location.X = disCoordinates[0]; location.Y = disCoordinates[1]; location.Z = disCoordinates[2]; espdu.Timestamp = DisTime.DisRelativeTimestamp; //Prepare output var dos = new DataOutputStream(Endian.Big); espdu.MarshalAutoLengthSet(dos); // Transmit broadcast messages SendMessages(dos.ConvertToBytes()); Console.Write("Message sent with TimeStamp [{0}] Time Of[{1}]", espdu.Timestamp, espdu.Timestamp >> 1); //Thread.Sleep(1000); Console.Write("Hit Enter for Next PDU. Ctrl-C to Exit"); Console.ReadLine(); } mcastSocket.Close(); }
/// <summary> /// Decodes a PDU instance to a JSON string. /// </summary> /// <param name="pdu"><see cref="DIS.Dis1998.Pdu"/> instance to be decoded</param> /// <param name="detailed">Whether or not to add a details field where possible.</param> /// <returns></returns> public static string Decode(Pdu pdu, bool detailed) { if (pdu is EntityStatePdu && detailed) { EntityStatePdu espdu = (EntityStatePdu)pdu; EntityID eid = espdu.EntityID; EntityType et = espdu.EntityType; EntityType altet = espdu.AlternativeEntityType; return(JsonConvert.SerializeObject(new { EntityID = espdu.EntityID, ForceID = espdu.ForceId, NumberOfArticulationParameters = espdu.NumberOfArticulationParameters, EntityType = new { EntityKind = new { Value = et.EntityKind, Details = Enumerations.GetPlatform(et.EntityKind) }, Domain = new { Value = et.Domain, Details = Enumerations.GetDomain(et.Domain) }, Country = new { Value = et.Country, Details = Enumerations.GetCountry(et.Country), }, Category = new { Value = et.Category, Details = Enumerations.GetCategory(et.EntityKind, et.Domain, et.Category), }, Subcategory = new { Value = et.Subcategory, //Details = Enumerations.GetSubcategory(et.Subcategory, et.Domain, et.Category), }, Specific = new { Value = et.Subcategory, //Details = Enumerations.GetSpecific(et.Specific, et.Domain, et.Category), }, Extra = new { Value = et.Extra, //Details = Enumerations.GetExtra(et.Extra, et.Domain, et.Category), }, }, AlternativeEntityType = new { EntityKind = new { Value = et.EntityKind, Details = Enumerations.GetPlatform(altet.EntityKind) }, Domain = new { Value = et.Domain, Details = Enumerations.GetDomain(altet.Domain) }, Country = new { Value = et.Country, Details = Enumerations.GetCountry(altet.Country), }, Category = new { Value = et.Category, Details = Enumerations.GetCategory(altet.EntityKind, altet.Domain, altet.Category), }, Subcategory = new { Value = et.Subcategory, //Details = Enumerations.GetSubcategory(altet.Subcategory, altet.Domain, altet.Category), }, Specific = new { Value = et.Subcategory, //Details = Enumerations.GetSpecific(altet.Specific, altet.Domain, altet.Category), }, Extra = new { Value = et.Extra, //Details = Enumerations.GetExtra(altet.Extra, altet.Domain, altet.Category), }, }, EntityLinearVelocity = espdu.EntityLinearVelocity, EntityLocation = espdu.EntityLocation, EntityOrientation = espdu.EntityOrientation, EntityAppearance = espdu.EntityAppearance, DeadReckoningParameters = espdu.DeadReckoningParameters, Marking = espdu.Marking, Capabilities = espdu.Capabilities, ArticulationParameters = espdu.ArticulationParameters, ProtocolVersion = espdu.ProtocolVersion, ExerciseID = espdu.ExerciseID, PduType = espdu.PduType, ProtocolFamily = espdu.ProtocolFamily, Timestamp = espdu.Timestamp, Length = espdu.Length, Padding = espdu.Padding }, Formatting.Indented)); } else { return(JsonConvert.SerializeObject(pdu, Formatting.Indented)); } }
/// <summary> /// Creates the PDU. /// </summary> /// <param name="type">The type of PDU to be created.</param> /// <returns>Returns the corresponding PDU instance or null if PduType.Other is specified.</returns> /// <exception cref="NotImplementedException">if the PDU type specified in parameter is not supported.</exception> public static IPdu CreatePdu(PduType type) { IPdu pdu = null; switch (type) { case PduType.Other: pdu = new Pdu(); break; case PduType.EntityState: pdu = new EntityStatePdu(); break; case PduType.Fire: pdu = new FirePdu(); break; case PduType.Detonation: pdu = new DetonationPdu(); break; case PduType.Collision: pdu = new CollisionPdu(); break; case PduType.ServiceRequest: pdu = new ServiceRequestPdu(); break; case PduType.ResupplyOffer: pdu = new ResupplyOfferPdu(); break; case PduType.ResupplyReceived: pdu = new ResupplyReceivedPdu(); break; case PduType.ResupplyCancel: pdu = new ResupplyCancelPdu(); break; case PduType.RepairComplete: pdu = new RepairCompletePdu(); break; case PduType.RepairResponse: pdu = new RepairResponsePdu(); break; case PduType.CreateEntity: pdu = new CreateEntityPdu(); break; case PduType.RemoveEntity: pdu = new RemoveEntityPdu(); break; case PduType.StartResume: pdu = new StartResumePdu(); break; case PduType.StopFreeze: pdu = new StopFreezePdu(); break; case PduType.Acknowledge: pdu = new AcknowledgePdu(); break; case PduType.ActionRequest: pdu = new ActionRequestPdu(); break; case PduType.ActionResponse: pdu = new ActionResponsePdu(); break; case PduType.DataQuery: pdu = new DataQueryPdu(); break; case PduType.SetData: pdu = new SetDataPdu(); break; case PduType.Data: pdu = new DataPdu(); break; case PduType.EventReport: pdu = new EventReportPdu(); break; case PduType.Comment: pdu = new CommentPdu(); break; case PduType.ElectromagneticEmission: pdu = new ElectronicEmissionsPdu(); break; case PduType.Designator: pdu = new DesignatorPdu(); break; case PduType.Transmitter: pdu = new TransmitterPdu(); break; case PduType.Signal: pdu = new SignalPdu(); break; case PduType.Receiver: pdu = new ReceiverPdu(); break; case PduType.IFF_ATC_NAVAIDS: pdu = new IffAtcNavAidsLayer1Pdu(); break; case PduType.UnderwaterAcoustic: pdu = new UaPdu(); break; case PduType.SupplementalEmissionEntityState: pdu = new SeesPdu(); break; case PduType.IntercomSignal: pdu = new IntercomSignalPdu(); break; case PduType.IntercomControl: pdu = new IntercomControlPdu(); break; case PduType.AggregateState: pdu = new AggregateStatePdu(); break; case PduType.IsGroupOf: pdu = new IsGroupOfPdu(); break; case PduType.TransferControl: pdu = new TransferControlRequestPdu(); break; case PduType.IsPartOf: pdu = new IsPartOfPdu(); break; case PduType.MinefieldState: pdu = new MinefieldStatePdu(); break; case PduType.MinefieldQuery: pdu = new MinefieldQueryPdu(); break; case PduType.MinefieldData: pdu = new MinefieldDataPdu(); break; case PduType.MinefieldResponseNAK: pdu = new MinefieldResponseNackPdu(); break; case PduType.EnvironmentalProcess: pdu = new EnvironmentalProcessPdu(); break; case PduType.GriddedData: pdu = new GriddedDataPdu(); break; case PduType.PointObjectState: pdu = new PointObjectStatePdu(); break; case PduType.LinearObjectState: pdu = new LinearObjectStatePdu(); break; case PduType.ArealObjectState: pdu = new ArealObjectStatePdu(); break; case PduType.TSPI: throw new NotImplementedException(); case PduType.Appearance: throw new NotImplementedException(); case PduType.ArticulatedParts: throw new NotImplementedException(); case PduType.LEFire: throw new NotImplementedException(); case PduType.LEDetonation: throw new NotImplementedException(); case PduType.CreateEntityR: pdu = new CreateEntityReliablePdu(); break; case PduType.RemoveEntityR: pdu = new RemoveEntityReliablePdu(); break; case PduType.StartResumeR: pdu = new StartResumeReliablePdu(); break; case PduType.StopFreezeR: pdu = new StopFreezeReliablePdu(); break; case PduType.AcknowledgeR: pdu = new AcknowledgeReliablePdu(); break; case PduType.ActionRequestR: pdu = new ActionRequestReliablePdu(); break; case PduType.ActionResponseR: pdu = new ActionResponseReliablePdu(); break; case PduType.DataQueryR: pdu = new DataQueryReliablePdu(); break; case PduType.SetDataR: pdu = new SetDataReliablePdu(); break; case PduType.DataR: pdu = new DataReliablePdu(); break; case PduType.EventReportR: pdu = new EventReportReliablePdu(); break; case PduType.CommentR: pdu = new CommentReliablePdu(); break; case PduType.RecordR: pdu = new RecordQueryReliablePdu(); break; case PduType.SetRecordR: pdu = new SetRecordReliablePdu(); break; case PduType.RecordQueryR: pdu = new RecordQueryReliablePdu(); break; case PduType.CollisionElastic: pdu = new CollisionElasticPdu(); break; case PduType.EntityStateUpdate: pdu = new EntityStateUpdatePdu(); break; default: pdu = null; break; } return pdu; }