/// <summary> /// Shut Link to LiveTraffic down /// </summary> public void RemoveLink() { Logger.Instance.Log($"TrafficHandler-RemoveLink"); Valid = false; Error = ""; try { LTLink.LTEvent -= LTLink_LTEvent; LT_Traffic = null; LT_Weather = null; LTLink.Disconnect( ); m_userAcft = null; POOL = null; } catch (Exception e) { Error = $"Error: {e.Message}"; Logger.Instance.Log($"TrafficHandler: {Error}"); } }
// Asynch processing from receiving actual user position (Triggered by TCPclient) private void LTLink_LTEvent(object sender, LTEventArgs e) { long secSinceLastPing = (long)(DateTime.Now - m_lastUpdate).TotalSeconds; OnTraffic(secSinceLastPing); if (!Valid) { return; // catch out of bounds messages } m_userAcft.NewPos(e.LatLon); if (POOL == null) { // create the first subset with our AcftPos POOL = new VAcftPool(m_radius_nm, m_stepLen_sec) { NumAcft = m_numAcft, NumVFRcraft = m_numVFR }; POOL.CreateAwySelection(AWYDB.GetTable( ), RWYDB.GetTable( ), m_userAcft.LatLon); POOL.UpdateVFRscripts(CMDS); Logger.Instance.Log($"TrafficHandler: Create POOL with {m_numAcft} aircrafts where {m_numVFR} are VFR, one sim step is >= {m_stepLen_sec} seconds"); } // push an update only after 'StepLen_sec' secs if (secSinceLastPing >= POOL.StepLen_sec) { m_lastUpdate = DateTime.Now; // reset timer LT_Weather.SendMsg(RealTraffic.WeatherString( )); // send a 'generic' weather string // do POOL maintenance POOL.ReGenerate( ); POOL.Update( ); // send updates to LiveTraffic - TODO need to pace it ?? foreach (var vac in POOL.AircraftPoolRef) { string msg = RealTraffic.AITrafficString(vac); LT_Traffic.SendMsg(msg); } // recreates the airway selection if needed POOL.UpdateAwySelection(AWYDB.GetTable( ), RWYDB.GetTable( ), m_userAcft.LatLon); } }