private void HandleLotATCUpdate(LotATCMessageWrapper.LotATCPosition controller) { _clientStateSingleton.LotATCLastReceived = DateTime.Now.Ticks; //TODO only update position if player isnt in aircraft if (_clientStateSingleton.ShouldUseLotATCPosition()) { _clientStateSingleton.UpdatePlayerPosition(new DcsPosition(), new DCSLatLngPosition(controller.latitude, controller.longitude, controller.altitude)); long diff = DateTime.Now.Ticks - _lastSent; if (diff > UPDATE_SYNC_RATE) // There are 10,000 ticks in a millisecond, or 10 million ticks in a second. Update ever 5 seconds { _lastSent = DateTime.Now.Ticks; _clientSideUpdate(); } } }
private void HandleLotATCUpdate(LotATCMessageWrapper.LotATCPosition controller) { _clientStateSingleton.LotATCLastReceived = DateTime.Now.Ticks; //only send update if position and line of sight are enabled var shouldUpdate = _serverSettings.GetSettingAsBool(ServerSettingsKeys.DISTANCE_ENABLED) || _serverSettings.GetSettingAsBool(ServerSettingsKeys.LOS_ENABLED); if (_clientStateSingleton.ShouldUseLotATCPosition()) { _clientStateSingleton.UpdatePlayerPosition(new DCSLatLngPosition() { lat = controller.latitude, lng = controller.longitude, alt = controller.altitude + _heightOffset }); long diff = DateTime.Now.Ticks - _lastSent; if (diff > UPDATE_SYNC_RATE && shouldUpdate) // There are 10,000 ticks in a millisecond, or 10 million ticks in a second. Update ever 5 seconds { _lastSent = DateTime.Now.Ticks; _clientSideUpdate(); } } }
private bool UpdateRadio(DCSPlayerRadioInfo message) { var expansion = _serverSettings.GetSettingAsBool(ServerSettingsKeys.RADIO_EXPANSION); var playerRadioInfo = _clientStateSingleton.DcsPlayerRadioInfo; //copy and compare to look for changes var beforeUpdate = playerRadioInfo.DeepClone(); //update common parts playerRadioInfo.name = message.name; playerRadioInfo.inAircraft = message.inAircraft; playerRadioInfo.intercomHotMic = message.intercomHotMic; playerRadioInfo.capabilities = message.capabilities; if (_globalSettings.ProfileSettingsStore.GetClientSettingBool(ProfileSettingsKeys.AlwaysAllowHotasControls)) { message.control = DCSPlayerRadioInfo.RadioSwitchControls.HOTAS; playerRadioInfo.control = DCSPlayerRadioInfo.RadioSwitchControls.HOTAS; } else { playerRadioInfo.control = message.control; } playerRadioInfo.simultaneousTransmissionControl = message.simultaneousTransmissionControl; playerRadioInfo.unit = message.unit; if (!_clientStateSingleton.ShouldUseLotATCPosition()) { _clientStateSingleton.UpdatePlayerPosition(message.latLng); } var overrideFreqAndVol = false; var newAircraft = playerRadioInfo.unitId != message.unitId || !playerRadioInfo.IsCurrent(); overrideFreqAndVol = playerRadioInfo.unitId != message.unitId; //save unit id playerRadioInfo.unitId = message.unitId; if (newAircraft) { if (_globalSettings.GetClientSettingBool(GlobalSettingsKeys.AutoSelectSettingsProfile)) { _newAircraftCallback(message.unit); } playerRadioInfo.iff = message.iff; } if (overrideFreqAndVol) { playerRadioInfo.selected = message.selected; } if (playerRadioInfo.control == DCSPlayerRadioInfo.RadioSwitchControls.IN_COCKPIT) { playerRadioInfo.selected = message.selected; } bool simul = false; //copy over radio names, min + max for (var i = 0; i < playerRadioInfo.radios.Length; i++) { var clientRadio = playerRadioInfo.radios[i]; //if we have more radios than the message has if (i >= message.radios.Length) { clientRadio.freq = 1; clientRadio.freqMin = 1; clientRadio.freqMax = 1; clientRadio.secFreq = 0; clientRadio.retransmit = false; clientRadio.modulation = RadioInformation.Modulation.DISABLED; clientRadio.name = "No Radio"; clientRadio.rtMode = RadioInformation.RetransmitMode.DISABLED; clientRadio.retransmit = false; clientRadio.freqMode = RadioInformation.FreqMode.COCKPIT; clientRadio.guardFreqMode = RadioInformation.FreqMode.COCKPIT; clientRadio.encMode = RadioInformation.EncryptionMode.NO_ENCRYPTION; clientRadio.volMode = RadioInformation.VolumeMode.COCKPIT; continue; } var updateRadio = message.radios[i]; if ((updateRadio.expansion && !expansion) || (updateRadio.modulation == RadioInformation.Modulation.DISABLED)) { //expansion radio, not allowed clientRadio.freq = 1; clientRadio.freqMin = 1; clientRadio.freqMax = 1; clientRadio.secFreq = 0; clientRadio.retransmit = false; clientRadio.modulation = RadioInformation.Modulation.DISABLED; clientRadio.name = "No Radio"; clientRadio.rtMode = RadioInformation.RetransmitMode.DISABLED; clientRadio.retransmit = false; clientRadio.freqMode = RadioInformation.FreqMode.COCKPIT; clientRadio.guardFreqMode = RadioInformation.FreqMode.COCKPIT; clientRadio.encMode = RadioInformation.EncryptionMode.NO_ENCRYPTION; clientRadio.volMode = RadioInformation.VolumeMode.COCKPIT; } else { //update common parts clientRadio.freqMin = updateRadio.freqMin; clientRadio.freqMax = updateRadio.freqMax; if (playerRadioInfo.simultaneousTransmissionControl == DCSPlayerRadioInfo.SimultaneousTransmissionControl.EXTERNAL_DCS_CONTROL) { clientRadio.simul = updateRadio.simul; } if (updateRadio.simul) { simul = true; } clientRadio.name = updateRadio.name; clientRadio.modulation = updateRadio.modulation; //update modes clientRadio.freqMode = updateRadio.freqMode; clientRadio.guardFreqMode = updateRadio.guardFreqMode; clientRadio.rtMode = updateRadio.rtMode; if (_serverSettings.GetSettingAsBool(ServerSettingsKeys.ALLOW_RADIO_ENCRYPTION)) { clientRadio.encMode = updateRadio.encMode; } else { clientRadio.encMode = RadioInformation.EncryptionMode.NO_ENCRYPTION; } clientRadio.volMode = updateRadio.volMode; if ((updateRadio.freqMode == RadioInformation.FreqMode.COCKPIT) || overrideFreqAndVol) { clientRadio.freq = updateRadio.freq; if (newAircraft && updateRadio.guardFreqMode == RadioInformation.FreqMode.OVERLAY) { //default guard to off clientRadio.secFreq = 0; } else { if (clientRadio.secFreq != 0 && updateRadio.guardFreqMode == RadioInformation.FreqMode.OVERLAY) { //put back clientRadio.secFreq = updateRadio.secFreq; } else if (clientRadio.secFreq == 0 && updateRadio.guardFreqMode == RadioInformation.FreqMode.OVERLAY) { clientRadio.secFreq = 0; } else { clientRadio.secFreq = updateRadio.secFreq; } } clientRadio.channel = updateRadio.channel; } else { if (clientRadio.secFreq != 0) { //put back clientRadio.secFreq = updateRadio.secFreq; } //check we're not over a limit if (clientRadio.freq > clientRadio.freqMax) { clientRadio.freq = clientRadio.freqMax; } else if (clientRadio.freq < clientRadio.freqMin) { clientRadio.freq = clientRadio.freqMin; } } //reset encryption if (overrideFreqAndVol) { clientRadio.enc = false; clientRadio.encKey = 0; } //Handle Encryption if (updateRadio.encMode == RadioInformation.EncryptionMode.ENCRYPTION_JUST_OVERLAY) { if (clientRadio.encKey == 0) { clientRadio.encKey = 1; } } else if (clientRadio.encMode == RadioInformation.EncryptionMode.ENCRYPTION_COCKPIT_TOGGLE_OVERLAY_CODE) { clientRadio.enc = updateRadio.enc; if (clientRadio.encKey == 0) { clientRadio.encKey = 1; } } else if (clientRadio.encMode == RadioInformation.EncryptionMode.ENCRYPTION_FULL) { clientRadio.enc = updateRadio.enc; clientRadio.encKey = updateRadio.encKey; } else { clientRadio.enc = false; clientRadio.encKey = 0; } //handle volume if ((updateRadio.volMode == RadioInformation.VolumeMode.COCKPIT) || overrideFreqAndVol) { clientRadio.volume = updateRadio.volume; } //handle Retransmit mode if ((updateRadio.rtMode == RadioInformation.RetransmitMode.COCKPIT)) { clientRadio.rtMode = updateRadio.rtMode; clientRadio.retransmit = updateRadio.retransmit; } else if (updateRadio.rtMode == RadioInformation.RetransmitMode.DISABLED) { clientRadio.rtMode = updateRadio.rtMode; clientRadio.retransmit = false; } //handle Channels load for radios if (newAircraft && i > 0) { if (clientRadio.freqMode == RadioInformation.FreqMode.OVERLAY) { var channelModel = _clientStateSingleton.FixedChannels[i - 1]; channelModel.Max = clientRadio.freqMax; channelModel.Min = clientRadio.freqMin; channelModel.Reload(); clientRadio.channel = -1; //reset channel if (_globalSettings.ProfileSettingsStore.GetClientSettingBool(ProfileSettingsKeys.AutoSelectPresetChannel)) { RadioHelper.RadioChannelUp(i); } } else { _clientStateSingleton.FixedChannels[i - 1].Clear(); //clear } } } } if (playerRadioInfo.simultaneousTransmissionControl == DCSPlayerRadioInfo.SimultaneousTransmissionControl.EXTERNAL_DCS_CONTROL) { playerRadioInfo.simultaneousTransmission = simul; } //change PTT last if (!_globalSettings.ProfileSettingsStore.GetClientSettingBool(ProfileSettingsKeys.AllowDCSPTT)) { playerRadioInfo.ptt = false; } else { playerRadioInfo.ptt = message.ptt; } //HANDLE IFF/TRANSPONDER UPDATE //TODO tidy up the IFF/Transponder handling and this giant function in general as its silly big :( if (_globalSettings.ProfileSettingsStore.GetClientSettingBool(ProfileSettingsKeys .AlwaysAllowTransponderOverlay)) { if (message.iff.control != Transponder.IFFControlMode.DISABLED) { playerRadioInfo.iff.control = Transponder.IFFControlMode.OVERLAY; message.iff.control = Transponder.IFFControlMode.OVERLAY; } } if (message.iff.control == Transponder.IFFControlMode.COCKPIT) { playerRadioInfo.iff = message.iff; } //HANDLE MIC IDENT if (!playerRadioInfo.ptt && playerRadioInfo.iff.mic > 0 && _clientStateSingleton.RadioSendingState.IsSending) { if (_clientStateSingleton.RadioSendingState.SendingOn == playerRadioInfo.iff.mic) { playerRadioInfo.iff.status = Transponder.IFFStatus.IDENT; } } //Handle IDENT only lasting for 40 seconds at most - need to toggle it if (playerRadioInfo.iff.status == Transponder.IFFStatus.IDENT) { if (_identStart == 0) { _identStart = DateTime.Now.Ticks; } if (TimeSpan.FromTicks(DateTime.Now.Ticks - _identStart).TotalSeconds > 40) { playerRadioInfo.iff.status = Transponder.IFFStatus.NORMAL; } } else { _identStart = 0; } // } // } //update playerRadioInfo.LastUpdate = DateTime.Now.Ticks; return(!beforeUpdate.Equals(playerRadioInfo)); }
private bool UpdateRadio(DCSPlayerRadioInfo message) { var changed = false; var expansion = _serverSettings.GetSettingAsBool(ServerSettingsKeys.RADIO_EXPANSION); var playerRadioInfo = _clientStateSingleton.DcsPlayerRadioInfo; //update common parts playerRadioInfo.name = message.name; playerRadioInfo.inAircraft = message.inAircraft; if (_settings.GetClientSetting(SettingsKeys.AlwaysAllowHotasControls).BoolValue) { message.control = DCSPlayerRadioInfo.RadioSwitchControls.HOTAS; playerRadioInfo.control = DCSPlayerRadioInfo.RadioSwitchControls.HOTAS; } else { playerRadioInfo.control = message.control; } playerRadioInfo.unit = message.unit; if (!_clientStateSingleton.ShouldUseLotATCPosition()) { _clientStateSingleton.UpdatePlayerPosition(message.pos, message.latLng); } var overrideFreqAndVol = false; var newAircraft = playerRadioInfo.unitId != message.unitId || !playerRadioInfo.IsCurrent(); if (message.unitId >= DCSPlayerRadioInfo.UnitIdOffset && playerRadioInfo.unitId >= DCSPlayerRadioInfo.UnitIdOffset) { //overriden so leave as is } else { overrideFreqAndVol = playerRadioInfo.unitId != message.unitId; playerRadioInfo.unitId = message.unitId; } if (newAircraft) { if (_settings.GetClientSetting(SettingsKeys.AutoSelectInputProfile).BoolValue) { _newAircraftCallback(message.unit); } } if (overrideFreqAndVol) { playerRadioInfo.selected = message.selected; changed = true; } if (playerRadioInfo.control == DCSPlayerRadioInfo.RadioSwitchControls.IN_COCKPIT) { playerRadioInfo.selected = message.selected; } //copy over radio names, min + max for (var i = 0; i < playerRadioInfo.radios.Length; i++) { var clientRadio = playerRadioInfo.radios[i]; //if awacs NOT open - disable radios over 3 if (i >= message.radios.Length || (RadioOverlayWindow.AwacsActive == false && (i > 3 || i == 0) // disable intercom and all radios over 3 if awacs panel isnt open and we're a spectator given by the UnitId && playerRadioInfo.unitId >= DCSPlayerRadioInfo.UnitIdOffset)) { clientRadio.freq = 1; clientRadio.freqMin = 1; clientRadio.freqMax = 1; clientRadio.secFreq = 0; clientRadio.modulation = RadioInformation.Modulation.DISABLED; clientRadio.name = "No Radio"; clientRadio.freqMode = RadioInformation.FreqMode.COCKPIT; clientRadio.guardFreqMode = RadioInformation.FreqMode.COCKPIT; clientRadio.encMode = RadioInformation.EncryptionMode.NO_ENCRYPTION; clientRadio.volMode = RadioInformation.VolumeMode.COCKPIT; continue; } var updateRadio = message.radios[i]; if ((updateRadio.expansion && !expansion) || (updateRadio.modulation == RadioInformation.Modulation.DISABLED)) { //expansion radio, not allowed clientRadio.freq = 1; clientRadio.freqMin = 1; clientRadio.freqMax = 1; clientRadio.secFreq = 0; clientRadio.modulation = RadioInformation.Modulation.DISABLED; clientRadio.name = "No Radio"; clientRadio.freqMode = RadioInformation.FreqMode.COCKPIT; clientRadio.guardFreqMode = RadioInformation.FreqMode.COCKPIT; clientRadio.encMode = RadioInformation.EncryptionMode.NO_ENCRYPTION; clientRadio.volMode = RadioInformation.VolumeMode.COCKPIT; } else { //update common parts clientRadio.freqMin = updateRadio.freqMin; clientRadio.freqMax = updateRadio.freqMax; clientRadio.name = updateRadio.name; clientRadio.modulation = updateRadio.modulation; //update modes clientRadio.freqMode = updateRadio.freqMode; clientRadio.guardFreqMode = updateRadio.guardFreqMode; if (_serverSettings.GetSettingAsBool(ServerSettingsKeys.ALLOW_RADIO_ENCRYPTION)) { clientRadio.encMode = updateRadio.encMode; } else { clientRadio.encMode = RadioInformation.EncryptionMode.NO_ENCRYPTION; } clientRadio.volMode = updateRadio.volMode; if ((updateRadio.freqMode == RadioInformation.FreqMode.COCKPIT) || overrideFreqAndVol) { if (clientRadio.freq != updateRadio.freq) { changed = true; } if (clientRadio.secFreq != updateRadio.secFreq) { changed = true; } clientRadio.freq = updateRadio.freq; if (newAircraft && updateRadio.guardFreqMode == RadioInformation.FreqMode.OVERLAY) { //default guard to off clientRadio.secFreq = 0; } else { if (clientRadio.secFreq != 0 && updateRadio.guardFreqMode == RadioInformation.FreqMode.OVERLAY) { //put back clientRadio.secFreq = updateRadio.secFreq; } else if (clientRadio.secFreq == 0 && updateRadio.guardFreqMode == RadioInformation.FreqMode.OVERLAY) { clientRadio.secFreq = 0; } else { clientRadio.secFreq = updateRadio.secFreq; } } clientRadio.channel = updateRadio.channel; } else { if (clientRadio.secFreq != 0) { //put back clientRadio.secFreq = updateRadio.secFreq; } //check we're not over a limit if (clientRadio.freq > clientRadio.freqMax) { clientRadio.freq = clientRadio.freqMax; } else if (clientRadio.freq < clientRadio.freqMin) { clientRadio.freq = clientRadio.freqMin; } } //reset encryption if (overrideFreqAndVol) { clientRadio.enc = false; clientRadio.encKey = 0; } //Handle Encryption if (updateRadio.encMode == RadioInformation.EncryptionMode.ENCRYPTION_JUST_OVERLAY) { if (clientRadio.encKey == 0) { clientRadio.encKey = 1; } } else if (clientRadio.encMode == RadioInformation.EncryptionMode.ENCRYPTION_COCKPIT_TOGGLE_OVERLAY_CODE) { clientRadio.enc = updateRadio.enc; if (clientRadio.encKey == 0) { clientRadio.encKey = 1; } } else if (clientRadio.encMode == RadioInformation.EncryptionMode.ENCRYPTION_FULL) { clientRadio.enc = updateRadio.enc; clientRadio.encKey = updateRadio.encKey; } else { clientRadio.enc = false; clientRadio.encKey = 0; } //handle volume if ((updateRadio.volMode == RadioInformation.VolumeMode.COCKPIT) || overrideFreqAndVol) { clientRadio.volume = updateRadio.volume; } //handle Channels load for radios if (newAircraft && i > 0) { if (clientRadio.freqMode == RadioInformation.FreqMode.OVERLAY) { var channelModel = _clientStateSingleton.FixedChannels[i - 1]; channelModel.Max = clientRadio.freqMax; channelModel.Min = clientRadio.freqMin; channelModel.Reload(); clientRadio.channel = -1; //reset channel if (_settings.GetClientSetting(SettingsKeys.AutoSelectPresetChannel).BoolValue) { RadioHelper.RadioChannelUp(i); } } else { _clientStateSingleton.FixedChannels[i - 1].Clear(); //clear } } } } //change PTT last if (!_settings.GetClientSetting(SettingsKeys.AllowDCSPTT).BoolValue) { playerRadioInfo.ptt = false; } else { playerRadioInfo.ptt = message.ptt; } // } // } //update playerRadioInfo.LastUpdate = DateTime.Now.Ticks; return(changed); }