//PES 09182009 Added to work with Mobile /// <summary> /// Used to unmarshal data back into the correct PDU type. /// </summary> /// <param name="pdu_type">PDU type</param> /// <param name="ds">Datastream which contains the raw packet and Endian Type</param> /// <returns></returns> public static DIS1998net.Pdu UnMarshalRawPDU(DISnet.Utilities.PDUTypes.PDUType1998 pdu_type, DataInputStream ds) { DIS1998net.Pdu pdu = new DIS1998net.Pdu(); switch (pdu_type) { case PDUTypes.PDUType1998.PDU_ENTITY_STATE: DIS1998net.EntityStatePdu EntityStatePdu = new DIS1998net.EntityStatePdu(); EntityStatePdu.unmarshal(ds); pdu = (DIS1998net.Pdu)EntityStatePdu; break; case PDUTypes.PDUType1998.PDU_FIRE: DIS1998net.FirePdu FirePdu = new DIS1998net.FirePdu(); FirePdu.unmarshal(ds); pdu = (DIS1998net.Pdu)FirePdu; break; case PDUTypes.PDUType1998.PDU_DETONATION: DIS1998net.DetonationPdu DetonationPdu = new DIS1998net.DetonationPdu(); DetonationPdu.unmarshal(ds); pdu = (DIS1998net.Pdu)DetonationPdu; break; case PDUTypes.PDUType1998.PDU_COLLISION: DIS1998net.CollisionPdu CollisionPdu = new DIS1998net.CollisionPdu(); CollisionPdu.unmarshal(ds); pdu = (DIS1998net.Pdu)CollisionPdu; break; case PDUTypes.PDUType1998.PDU_SERVICE_REQUEST: DIS1998net.ServiceRequestPdu ServiceRequestPdu = new DIS1998net.ServiceRequestPdu(); ServiceRequestPdu.unmarshal(ds); pdu = (DIS1998net.Pdu)ServiceRequestPdu; break; case PDUTypes.PDUType1998.PDU_RESUPPLY_OFFER: DIS1998net.ResupplyOfferPdu ResupplyOfferPdu = new DIS1998net.ResupplyOfferPdu(); ResupplyOfferPdu.unmarshal(ds); pdu = (DIS1998net.Pdu)ResupplyOfferPdu; break; case PDUTypes.PDUType1998.PDU_RESUPPLY_RECEIVED: DIS1998net.ResupplyReceivedPdu ResupplyReceivedPdu = new DIS1998net.ResupplyReceivedPdu(); ResupplyReceivedPdu.unmarshal(ds); pdu = (DIS1998net.Pdu)ResupplyReceivedPdu; break; case PDUTypes.PDUType1998.PDU_RESUPPLY_CANCEL: DIS1998net.ResupplyCancelPdu ResupplyCancelPdu = new DIS1998net.ResupplyCancelPdu(); ResupplyCancelPdu.unmarshal(ds); pdu = (DIS1998net.Pdu)ResupplyCancelPdu; break; case PDUTypes.PDUType1998.PDU_REPAIR_COMPLETE: DIS1998net.RepairCompletePdu RepairCompletePdu = new DIS1998net.RepairCompletePdu(); RepairCompletePdu.unmarshal(ds); pdu = (DIS1998net.Pdu)RepairCompletePdu; break; case PDUTypes.PDUType1998.PDU_REPAIR_RESPONSE: DIS1998net.RepairResponsePdu RepairResponsePdu = new DIS1998net.RepairResponsePdu(); RepairResponsePdu.unmarshal(ds); pdu = (DIS1998net.Pdu)RepairResponsePdu; break; case PDUTypes.PDUType1998.PDU_CREATE_ENTITY: DIS1998net.CreateEntityPdu CreateEntityPdu = new DIS1998net.CreateEntityPdu(); CreateEntityPdu.unmarshal(ds); pdu = (DIS1998net.Pdu)CreateEntityPdu; break; case PDUTypes.PDUType1998.PDU_REMOVE_ENTITY: DIS1998net.RemoveEntityPdu RemoveEntityPdu = new DIS1998net.RemoveEntityPdu(); RemoveEntityPdu.unmarshal(ds); pdu = (DIS1998net.Pdu)RemoveEntityPdu; break; case PDUTypes.PDUType1998.PDU_START_RESUME: DIS1998net.StartResumePdu StartResumePdu = new DIS1998net.StartResumePdu(); StartResumePdu.unmarshal(ds); pdu = (DIS1998net.Pdu)StartResumePdu; break; case PDUTypes.PDUType1998.PDU_ACKNOWLEDGE: DIS1998net.AcknowledgePdu AcknowledgePdu = new DIS1998net.AcknowledgePdu(); AcknowledgePdu.unmarshal(ds); pdu = (DIS1998net.Pdu)AcknowledgePdu; break; case PDUTypes.PDUType1998.PDU_ACTION_REQUEST: DIS1998net.ActionRequestPdu ActionRequestPdu = new DIS1998net.ActionRequestPdu(); ActionRequestPdu.unmarshal(ds); pdu = (DIS1998net.Pdu)ActionRequestPdu; break; case PDUTypes.PDUType1998.PDU_ACTION_RESPONSE: DIS1998net.ActionResponsePdu ActionResponsePdu = new DIS1998net.ActionResponsePdu(); ActionResponsePdu.unmarshal(ds); pdu = (DIS1998net.Pdu)ActionResponsePdu; break; case PDUTypes.PDUType1998.PDU_DATA_QUERY: DIS1998net.DataQueryPdu DataQueryPdu = new DIS1998net.DataQueryPdu(); DataQueryPdu.unmarshal(ds); pdu = (DIS1998net.Pdu)DataQueryPdu; break; case PDUTypes.PDUType1998.PDU_SET_DATA: DIS1998net.SetDataPdu SetDataPdu = new DIS1998net.SetDataPdu(); SetDataPdu.unmarshal(ds); pdu = (DIS1998net.Pdu)SetDataPdu; break; case PDUTypes.PDUType1998.PDU_EVENT_REPORT: DIS1998net.EventReportPdu EventReportPdu = new DIS1998net.EventReportPdu(); EventReportPdu.unmarshal(ds); pdu = (DIS1998net.Pdu)EventReportPdu; break; case PDUTypes.PDUType1998.PDU_COMMENT: DIS1998net.CommentPdu CommentPdu = new DIS1998net.CommentPdu(); CommentPdu.unmarshal(ds); pdu = (DIS1998net.Pdu)CommentPdu; break; case PDUTypes.PDUType1998.PDU_STOP_FREEZE: DIS1998net.StopFreezePdu StopFreezePdu = new DIS1998net.StopFreezePdu(); StopFreezePdu.unmarshal(ds); pdu = (DIS1998net.Pdu)StopFreezePdu; break; case PDUTypes.PDUType1998.PDU_SIGNAL: DIS1998net.SignalPdu SignalPdu = new DIS1998net.SignalPdu(); SignalPdu.unmarshal(ds); pdu = (DIS1998net.Pdu)SignalPdu; break; case PDUTypes.PDUType1998.PDU_TRANSMITTER: DIS1998net.TransmitterPdu transmitterPdu = new DIS1998net.TransmitterPdu(); transmitterPdu.unmarshal(ds); pdu = (DIS1998net.Pdu)transmitterPdu; break; } return pdu; }
//PES 09182009 Added to work with Mobile /// <summary> /// Used to unmarshal data back into the correct PDU type. /// </summary> /// <param name="pdu_type">PDU type</param> /// <param name="ds">Datastream which contains the raw packet and Endian Type</param> /// <returns></returns> public static DIS1998net.Pdu UnMarshalRawPDU(DISnet.Utilities.PDUTypes.PDUType1998 pdu_type, DataInputStream ds) { DIS1998net.Pdu pdu = new DIS1998net.Pdu(); switch (pdu_type) { case PDUTypes.PDUType1998.PDU_ENTITY_STATE: DIS1998net.EntityStatePdu EntityStatePdu = new DIS1998net.EntityStatePdu(); EntityStatePdu.unmarshal(ds); pdu = (DIS1998net.Pdu)EntityStatePdu; break; case PDUTypes.PDUType1998.PDU_FIRE: DIS1998net.FirePdu FirePdu = new DIS1998net.FirePdu(); FirePdu.unmarshal(ds); pdu = (DIS1998net.Pdu)FirePdu; break; case PDUTypes.PDUType1998.PDU_DETONATION: DIS1998net.DetonationPdu DetonationPdu = new DIS1998net.DetonationPdu(); DetonationPdu.unmarshal(ds); pdu = (DIS1998net.Pdu)DetonationPdu; break; case PDUTypes.PDUType1998.PDU_COLLISION: DIS1998net.CollisionPdu CollisionPdu = new DIS1998net.CollisionPdu(); CollisionPdu.unmarshal(ds); pdu = (DIS1998net.Pdu)CollisionPdu; break; case PDUTypes.PDUType1998.PDU_SERVICE_REQUEST: DIS1998net.ServiceRequestPdu ServiceRequestPdu = new DIS1998net.ServiceRequestPdu(); ServiceRequestPdu.unmarshal(ds); pdu = (DIS1998net.Pdu)ServiceRequestPdu; break; case PDUTypes.PDUType1998.PDU_RESUPPLY_OFFER: DIS1998net.ResupplyOfferPdu ResupplyOfferPdu = new DIS1998net.ResupplyOfferPdu(); ResupplyOfferPdu.unmarshal(ds); pdu = (DIS1998net.Pdu)ResupplyOfferPdu; break; case PDUTypes.PDUType1998.PDU_RESUPPLY_RECEIVED: DIS1998net.ResupplyReceivedPdu ResupplyReceivedPdu = new DIS1998net.ResupplyReceivedPdu(); ResupplyReceivedPdu.unmarshal(ds); pdu = (DIS1998net.Pdu)ResupplyReceivedPdu; break; case PDUTypes.PDUType1998.PDU_RESUPPLY_CANCEL: DIS1998net.ResupplyCancelPdu ResupplyCancelPdu = new DIS1998net.ResupplyCancelPdu(); ResupplyCancelPdu.unmarshal(ds); pdu = (DIS1998net.Pdu)ResupplyCancelPdu; break; case PDUTypes.PDUType1998.PDU_REPAIR_COMPLETE: DIS1998net.RepairCompletePdu RepairCompletePdu = new DIS1998net.RepairCompletePdu(); RepairCompletePdu.unmarshal(ds); pdu = (DIS1998net.Pdu)RepairCompletePdu; break; case PDUTypes.PDUType1998.PDU_REPAIR_RESPONSE: DIS1998net.RepairResponsePdu RepairResponsePdu = new DIS1998net.RepairResponsePdu(); RepairResponsePdu.unmarshal(ds); pdu = (DIS1998net.Pdu)RepairResponsePdu; break; case PDUTypes.PDUType1998.PDU_CREATE_ENTITY: DIS1998net.CreateEntityPdu CreateEntityPdu = new DIS1998net.CreateEntityPdu(); CreateEntityPdu.unmarshal(ds); pdu = (DIS1998net.Pdu)CreateEntityPdu; break; case PDUTypes.PDUType1998.PDU_REMOVE_ENTITY: DIS1998net.RemoveEntityPdu RemoveEntityPdu = new DIS1998net.RemoveEntityPdu(); RemoveEntityPdu.unmarshal(ds); pdu = (DIS1998net.Pdu)RemoveEntityPdu; break; case PDUTypes.PDUType1998.PDU_START_RESUME: DIS1998net.StartResumePdu StartResumePdu = new DIS1998net.StartResumePdu(); StartResumePdu.unmarshal(ds); pdu = (DIS1998net.Pdu)StartResumePdu; break; case PDUTypes.PDUType1998.PDU_ACKNOWLEDGE: DIS1998net.AcknowledgePdu AcknowledgePdu = new DIS1998net.AcknowledgePdu(); AcknowledgePdu.unmarshal(ds); pdu = (DIS1998net.Pdu)AcknowledgePdu; break; case PDUTypes.PDUType1998.PDU_ACTION_REQUEST: DIS1998net.ActionRequestPdu ActionRequestPdu = new DIS1998net.ActionRequestPdu(); ActionRequestPdu.unmarshal(ds); pdu = (DIS1998net.Pdu)ActionRequestPdu; break; case PDUTypes.PDUType1998.PDU_ACTION_RESPONSE: DIS1998net.ActionResponsePdu ActionResponsePdu = new DIS1998net.ActionResponsePdu(); ActionResponsePdu.unmarshal(ds); pdu = (DIS1998net.Pdu)ActionResponsePdu; break; case PDUTypes.PDUType1998.PDU_DATA_QUERY: DIS1998net.DataQueryPdu DataQueryPdu = new DIS1998net.DataQueryPdu(); DataQueryPdu.unmarshal(ds); pdu = (DIS1998net.Pdu)DataQueryPdu; break; case PDUTypes.PDUType1998.PDU_SET_DATA: DIS1998net.SetDataPdu SetDataPdu = new DIS1998net.SetDataPdu(); SetDataPdu.unmarshal(ds); pdu = (DIS1998net.Pdu)SetDataPdu; break; case PDUTypes.PDUType1998.PDU_EVENT_REPORT: DIS1998net.EventReportPdu EventReportPdu = new DIS1998net.EventReportPdu(); EventReportPdu.unmarshal(ds); pdu = (DIS1998net.Pdu)EventReportPdu; break; case PDUTypes.PDUType1998.PDU_COMMENT: DIS1998net.CommentPdu CommentPdu = new DIS1998net.CommentPdu(); CommentPdu.unmarshal(ds); pdu = (DIS1998net.Pdu)CommentPdu; break; case PDUTypes.PDUType1998.PDU_STOP_FREEZE: DIS1998net.StopFreezePdu StopFreezePdu = new DIS1998net.StopFreezePdu(); StopFreezePdu.unmarshal(ds); pdu = (DIS1998net.Pdu)StopFreezePdu; break; case PDUTypes.PDUType1998.PDU_SIGNAL: DIS1998net.SignalPdu SignalPdu = new DIS1998net.SignalPdu(); SignalPdu.unmarshal(ds); pdu = (DIS1998net.Pdu)SignalPdu; break; case PDUTypes.PDUType1998.PDU_TRANSMITTER: DIS1998net.TransmitterPdu transmitterPdu = new DIS1998net.TransmitterPdu(); transmitterPdu.unmarshal(ds); pdu = (DIS1998net.Pdu)transmitterPdu; break; } return(pdu); }
/// <summary> /// Threaded method that will continue to poll socket for data /// </summary> private void RetreiveDataFromSocket() { byte pdu_type; byte pdu_version; //Continue to process data received until false while (continueReceivingSocketData == true) { //Using queued collection to determine if data has arrived if (receiveBroadCast.pduQueue.Count > 0) { //Process any PDUs (note that a collection was used as multiple pdu's can be sent in one packet) List <byte[]> pdus = pduReceive.ProcessRawPDU(receiveBroadCast.pduQueue.Dequeue(), endianType); int countPDU = 0; int pduCount = pdus.Count; while (countPDU < pduCount && continueReceivingSocketData == true) { byte[] objPdu = pdus[countPDU]; pdu_type = objPdu[PDU_TYPE_POSITION]; //get pdu type pdu_version = objPdu[PDU_VERSION_POSITION]; //what version (currently not processing anything but DIS 1998) //Cast as radio pdu, as receive socket method will throw out all other types of PDUs DIS1998net.RadioCommunicationsFamilyPdu pduReceived = pduReceive.ConvertByteArrayToPDU1998(pdu_type, objPdu, endianType) as DIS1998net.RadioCommunicationsFamilyPdu; SiteHostEntityRadioFrequency siteHostEntityRadioFrequency = new SiteHostEntityRadioFrequency(pduReceived.EntityId.Site, pduReceived.EntityId.Application, pduReceived.EntityId.Entity, pduReceived.RadioId, 0); if (pduReceived.EntityId != entityID || (pduReceived.EntityId == entityID && this.isLoopBackAudioEnabled == true)) { //Transmitter which contains the frequency of the signal pdu if (pdu_type == 25) { //Update transmitter packets received UpdatedTransmitterPacketsReceived(); DIS1998net.TransmitterPdu transmitterPDU_Received = (DIS1998net.TransmitterPdu)pduReceived; //Assign the frequency from the Transmitter PDU just received. siteHostEntityRadioFrequency.frequency = transmitterPDU_Received.Frequency; //Remove the frequency from the collection as it will be added back later if it is transmitting siteHostEntityRadioFrequencyCollection.Remove(siteHostEntityRadioFrequencyCollection.Find(i => i.application == siteHostEntityRadioFrequency.application && i.entity == siteHostEntityRadioFrequency.entity && i.radioID == siteHostEntityRadioFrequency.radioID && i.site == siteHostEntityRadioFrequency.site)); //If transmitter is transmitting then add to collection if (transmitterPDU_Received.TransmitStateEnumeration == DIS1998net.TransmitterPdu.TransmitStateEnum.TransmitterOnTransmitting) { siteHostEntityRadioFrequencyCollection.Add(siteHostEntityRadioFrequency); } foreach (FrequencySpeakerLocationTransmitterReceiverActiveClass item in FrequencySpeakerLocationTransmitterReceiverActive) { if (siteHostEntityRadioFrequencyCollection.Exists(i => i.frequency == item.Frequency) == true) { ChangeRadioRecievingColorIndicator(item.UniqueID, true); } else { ChangeRadioRecievingColorIndicator(item.UniqueID, false); } } } //is it a signal PDU? if (pdu_type == 26) { //Update signal packets received UpdatedSignalPacketsReceived(); DIS1998net.SignalPdu signalPDU = (DIS1998net.SignalPdu)pduReceived; //Does the current signal pdu match one in the transmitter collection if (siteHostEntityRadioFrequencyCollection.Exists(i => i.application == siteHostEntityRadioFrequency.application && i.entity == siteHostEntityRadioFrequency.entity && i.radioID == siteHostEntityRadioFrequency.radioID && i.site == siteHostEntityRadioFrequency.site) == true) { //Retrieve the saved frequency SiteHostEntityRadioFrequency storedSitehostEntityRadioFrequency = siteHostEntityRadioFrequencyCollection.Find(i => i.application == siteHostEntityRadioFrequency.application && i.entity == siteHostEntityRadioFrequency.entity && i.radioID == siteHostEntityRadioFrequency.radioID && i.site == siteHostEntityRadioFrequency.site); //Transmitter was transmitting at this frequency, need to check to see if it is one that we will playback siteHostEntityRadioFrequency.frequency = storedSitehostEntityRadioFrequency.frequency; if (FrequencyOnPlayBackList(storedSitehostEntityRadioFrequency.frequency) == true) { //Need to retrieve the speaker location that matches the frequency FrequencySpeakerLocationTransmitterReceiverActiveClass retrievedFreqSpeakerTransmitterReceiver = FrequencySpeakerLocationTransmitterReceiverActive.Find(i => i.Frequency == storedSitehostEntityRadioFrequency.frequency); //Decode the data, only implemented uLaw byte[] unEncodedData = uLaw.Decode(((DIS1998net.SignalPdu)pduReceived).Data, 0, ((DIS1998net.SignalPdu)pduReceived).Data.Length); //Used to save to a stream //ms.Seek(ms.Length, SeekOrigin.Begin); //ms.Write(encodedData, 0, encodedData.Length); //Play back unencoded data playAudio.PlayBackAudio(unEncodedData, ALFormat.Mono16, (int)signalPDU.SampleRate, retrievedFreqSpeakerTransmitterReceiver.SpeakerLocation); } } } } countPDU++; //Give GUI time to do things Thread.Sleep(1); } } //Give GUI time to do things Thread.Sleep(1); } }