예제 #1
0
 public DateTime PropagationPathFindLastUpdated(PropagationPathDesignator path, ELEVATIONMODEL model)
 {
     System.Data.SQLite.SQLiteDatabase db = GetPropagationDatabase(model);
     lock (db.DBCommand)
     {
         db.DBCommand.CommandText = "SELECT LastUpdated FROM " + PropagationPathDesignator.TableName + " WHERE Lat1 = @Lat1 AND Lon1 = @Lon1 AND h1 = @h1 AND Lat2 = @Lat2 AND Lon2 = @Lon2 AND h2 = @h2 AND QRG = @QRG AND Radius = @Radius AND F1_Clearance = @F1_Clearance AND StepWidth = @StepWidth";
         db.DBCommand.Parameters.Clear();
         db.DBCommand.Parameters.Add(path.AsDouble("Lat1"));
         db.DBCommand.Parameters.Add(path.AsDouble("Lon1"));
         db.DBCommand.Parameters.Add(path.AsDouble("h1"));
         db.DBCommand.Parameters.Add(path.AsDouble("Lat2"));
         db.DBCommand.Parameters.Add(path.AsDouble("Lon2"));
         db.DBCommand.Parameters.Add(path.AsDouble("h2"));
         db.DBCommand.Parameters.Add(path.AsDouble("QRG"));
         db.DBCommand.Parameters.Add(path.AsDouble("Radius"));
         db.DBCommand.Parameters.Add(path.AsDouble("F1_Clearance"));
         db.DBCommand.Parameters.Add(path.AsDouble("StepWidth"));
         object result = db.ExecuteScalar(db.DBCommand);
         if (result != null)
         {
             return(SQLiteEntry.UNIXTimeToDateTime((int)result));
         }
     }
     return(DateTime.MinValue);
 }
예제 #2
0
        public PropagationPathDesignator PropagationPathFind(PropagationPathDesignator path, ELEVATIONMODEL model)
        {
            System.Data.SQLite.SQLiteDatabase db = GetPropagationDatabase(model);
            // save localobstruction
            double obstr = path.LocalObstruction;

            lock (db.DBCommand)
            {
                db.DBCommand.CommandText = "SELECT * FROM " + PropagationPathDesignator.TableName + " WHERE Lat1 = @Lat1 AND Lon1 = @Lon1 AND h1 = @h1 AND Lat2 = @Lat2 AND Lon2 = @Lon2 AND h2 = @h2 AND QRG = @QRG AND Radius = @Radius AND F1_Clearance = @F1_Clearance AND StepWidth = @StepWidth";
                db.DBCommand.Parameters.Clear();
                db.DBCommand.Parameters.Add(path.AsDouble("Lat1"));
                db.DBCommand.Parameters.Add(path.AsDouble("Lon1"));
                db.DBCommand.Parameters.Add(path.AsDouble("h1"));
                db.DBCommand.Parameters.Add(path.AsDouble("Lat2"));
                db.DBCommand.Parameters.Add(path.AsDouble("Lon2"));
                db.DBCommand.Parameters.Add(path.AsDouble("h2"));
                db.DBCommand.Parameters.Add(path.AsDouble("QRG"));
                db.DBCommand.Parameters.Add(path.AsDouble("Radius"));
                db.DBCommand.Parameters.Add(path.AsDouble("F1_Clearance"));
                db.DBCommand.Parameters.Add(path.AsDouble("StepWidth"));
                DataTable Result = db.Select(db.DBCommand);
                if ((Result != null) && (Result.Rows.Count > 0))
                {
                    return(new PropagationPathDesignator(Result.Rows[0], obstr));
                }
            }
            return(null);
        }
예제 #3
0
 public bool PropagationPathExists(PropagationPathDesignator path, ELEVATIONMODEL model)
 {
     System.Data.SQLite.SQLiteDatabase db = GetPropagationDatabase(model);
     lock (db.DBCommand)
     {
         db.DBCommand.CommandText = "SELECT EXISTS (SELECT LastUpdated FROM " + PropagationPathDesignator.TableName + " WHERE Lat1 = @Lat1 AND Lon1 = @Lon1 AND h1 = @h1 AND Lat2 = @Lat2 AND Lon2 = @Lon2 AND h2 = @h2 AND QRG = @QRG AND Radius = @Radius AND F1_Clearance = @F1_Clearance AND StepWidth = @StepWidth)";
         db.DBCommand.Parameters.Clear();
         db.DBCommand.Parameters.Add(path.AsDouble("Lat1"));
         db.DBCommand.Parameters.Add(path.AsDouble("Lon1"));
         db.DBCommand.Parameters.Add(path.AsDouble("h1"));
         db.DBCommand.Parameters.Add(path.AsDouble("Lat2"));
         db.DBCommand.Parameters.Add(path.AsDouble("Lon2"));
         db.DBCommand.Parameters.Add(path.AsDouble("h2"));
         db.DBCommand.Parameters.Add(path.AsDouble("QRG"));
         db.DBCommand.Parameters.Add(path.AsDouble("Radius"));
         db.DBCommand.Parameters.Add(path.AsDouble("F1_Clearance"));
         db.DBCommand.Parameters.Add(path.AsDouble("StepWidth"));
         long result = (long)db.DBCommand.ExecuteScalar();
         if (result > 0)
         {
             return(true);
         }
     }
     return(false);
 }
예제 #4
0
        public PropagationPathDesignator PropagationPathFindOrCreateFromLatLon(BackgroundWorker caller, double lat1, double lon1, double h1, double lat2, double lon2, double h2, double qrg, double radius, double f1_clearance, double stepwidth, ELEVATIONMODEL model, double localobstruction, bool savetodatabase = true)
        {
            PropagationPathDesignator pp = this.PropagationPathFind(lat1, lon1, h1, lat2, lon2, h2, qrg, radius, f1_clearance, stepwidth, model, localobstruction);

            if (pp == null)
            {
                pp = this.PropagationPathCreateFromLatLon(caller, lat1, lon1, h1, lat2, lon2, h2, qrg, radius, f1_clearance, stepwidth, model, localobstruction, savetodatabase);
            }
            return(pp);
        }
예제 #5
0
        public void PropagationPathInsertOrUpdateIfNewer(PropagationPathDesignator path, ELEVATIONMODEL model)
        {
            System.Data.SQLite.SQLiteDatabase db = GetPropagationDatabase(model);
            DateTime dt = this.PropagationPathFindLastUpdated(path, model);

            if (dt == DateTime.MinValue)
            {
                this.PropagationPathInsert(path, model);
            }
            else if (dt < path.LastUpdated)
            {
                this.PropagationPathUpdate(path, model);
            }
        }
예제 #6
0
 public int PropagationPathDelete(PropagationPathDesignator path, ELEVATIONMODEL model)
 {
     System.Data.SQLite.SQLiteDatabase db = GetPropagationDatabase(model);
     lock (db.DBCommand)
     {
         db.DBCommand.CommandText = "DELETE FROM " + PropagationPathDesignator.TableName + " WHERE Lat1 = @Lat1 AND Lon1 = @Lon1 AND h1 = @h1 AND Lat2 = @Lat2 AND Lon2 = @Lon2 AND h2 = @h2 AND QRG = @QRG AND Radius = @Radius AND F1_Clearance = @F1_Clearance AND StepWidth = @StepWidth";
         db.DBCommand.Parameters.Clear();
         db.DBCommand.Parameters.Add(path.AsDouble("Lat1"));
         db.DBCommand.Parameters.Add(path.AsDouble("Lon1"));
         db.DBCommand.Parameters.Add(path.AsDouble("h1"));
         db.DBCommand.Parameters.Add(path.AsDouble("Lat2"));
         db.DBCommand.Parameters.Add(path.AsDouble("Lon2"));
         db.DBCommand.Parameters.Add(path.AsDouble("h2"));
         db.DBCommand.Parameters.Add(path.AsDouble("QRG"));
         db.DBCommand.Parameters.Add(path.AsDouble("Radius"));
         db.DBCommand.Parameters.Add(path.AsDouble("F1_Clearance"));
         db.DBCommand.Parameters.Add(path.AsDouble("StepWidth"));
         return(db.ExecuteNonQuery(db.DBCommand));
     }
 }
예제 #7
0
 public int PropagationPathUpdate(PropagationPathDesignator path, ELEVATIONMODEL model)
 {
     System.Data.SQLite.SQLiteDatabase db = GetPropagationDatabase(model);
     lock (db.DBCommand)
     {
         db.DBCommand.CommandText = "UPDATE " + PropagationPathDesignator.TableName + " SET Lat1 = @Lat1, Lon1 = @Lon1, h1 = @h1, Lat2 = @Lat2, Lon2 = @Lon2, h2 = @h2, QRG = @QRG, Radius = @Radius, F1_Clearance = @F1_Clearance, @StepWidth = @StepWidth, Eps1_Min = @Eps1_Min, Eps2_Min = @Eps2_Min, LastUpdated = @LastUpdated WHERE Lat1 = @Lat1 AND Lon1 = @Lon1 AND h1 = @h1 AND Lat2 = @Lat2 AND Lon2 = @Lon2 AND h2 = @h2 AND QRG = @QRG AND Radius = @Radius AND F1_Clearance = @F1_Clearance AND StepWidth = @StepWidth";
         db.DBCommand.Parameters.Clear();
         db.DBCommand.Parameters.Add(path.AsDouble("Lat1"));
         db.DBCommand.Parameters.Add(path.AsDouble("Lon1"));
         db.DBCommand.Parameters.Add(path.AsDouble("h1"));
         db.DBCommand.Parameters.Add(path.AsDouble("Lat2"));
         db.DBCommand.Parameters.Add(path.AsDouble("Lon2"));
         db.DBCommand.Parameters.Add(path.AsDouble("h2"));
         db.DBCommand.Parameters.Add(path.AsDouble("QRG"));
         db.DBCommand.Parameters.Add(path.AsDouble("Radius"));
         db.DBCommand.Parameters.Add(path.AsDouble("F1_Clearance"));
         db.DBCommand.Parameters.Add(path.AsDouble("StepWidth"));
         db.DBCommand.Parameters.Add(path.AsDouble("Eps1_Min"));
         db.DBCommand.Parameters.Add(path.AsDouble("Eps2_Min"));
         db.DBCommand.Parameters.Add(path.AsUNIXTime("LastUpdated"));
         return(db.ExecuteNonQuery(db.DBCommand));
     }
 }
예제 #8
0
 public int PropagationPathInsert(PropagationPathDesignator path, ELEVATIONMODEL model)
 {
     System.Data.SQLite.SQLiteDatabase db = GetPropagationDatabase(model);
     lock (db.DBCommand)
     {
         db.DBCommand.CommandText = "INSERT INTO " + PropagationPathDesignator.TableName + " (Lat1, Lon1, h1, Lat2, Lon2, h2, QRG, Radius, F1_Clearance, StepWidth, Eps1_Min, Eps2_Min, LastUpdated) VALUES (@Lat1, @Lon1, @h1, @Lat2, @Lon2, @h2, @QRG, @Radius, @F1_Clearance, @StepWidth, @Eps1_Min, @Eps2_Min, @LastUpdated)";
         db.DBCommand.Parameters.Clear();
         db.DBCommand.Parameters.Add(path.AsDouble("Lat1"));
         db.DBCommand.Parameters.Add(path.AsDouble("Lon1"));
         db.DBCommand.Parameters.Add(path.AsDouble("h1"));
         db.DBCommand.Parameters.Add(path.AsDouble("Lat2"));
         db.DBCommand.Parameters.Add(path.AsDouble("Lon2"));
         db.DBCommand.Parameters.Add(path.AsDouble("h2"));
         db.DBCommand.Parameters.Add(path.AsDouble("QRG"));
         db.DBCommand.Parameters.Add(path.AsDouble("Radius"));
         db.DBCommand.Parameters.Add(path.AsDouble("F1_Clearance"));
         db.DBCommand.Parameters.Add(path.AsDouble("StepWidth"));
         db.DBCommand.Parameters.Add(path.AsDouble("Eps1_Min"));
         db.DBCommand.Parameters.Add(path.AsDouble("Eps2_Min"));
         db.DBCommand.Parameters.Add(path.AsUNIXTime("LastUpdated"));
         return(db.ExecuteNonQuery(db.DBCommand));
     }
 }
예제 #9
0
        public PropagationPathDesignator PropagationPathCreateFromLatLon(BackgroundWorker caller, double lat1, double lon1, double h1, double lat2, double lon2, double h2, double qrg, double radius, double f1_clearance, double stepwidth, ELEVATIONMODEL model, double localobstruction, bool savetodatabase = true)
        {
            // calculates a propagation path, a elevation path is calculated before if needed
            // supports cancellation if calld from a background thread
            double eps1_min = double.MinValue;
            double eps2_min = double.MinValue;
            // find or create an elevation path
            ElevationPathDesignator ep = ElevationData.Database.ElevationPathFindOrCreateFromLatLon(caller, lat1, lon1, lat2, lon2, stepwidth, model, savetodatabase);

            // return null if elevation path is null for whatever reason
            if (ep == null)
            {
                return(null);
            }
            for (int i = 0; i < ep.Count; i++)
            {
                double dist1 = i * stepwidth / 1000.0;
                double dist2 = (ep.Count - i - 1) * stepwidth / 1000.0;
                double f1c1  = ScoutBase.Core.Propagation.F1Radius(qrg, dist1, dist2) * f1_clearance;
                double f1c2  = ScoutBase.Core.Propagation.F1Radius(qrg, dist2, dist1) * f1_clearance;
                double nf    = NearFieldSuppression / 1000.0;
                double eps1;
                double eps2;
                if (dist1 > nf)
                {
                    eps1 = ScoutBase.Core.Propagation.EpsilonFromHeights(h1, dist1, ep.Path[i] + f1c1, radius);
                }
                else
                {
                    eps1 = ScoutBase.Core.Propagation.EpsilonFromHeights(h1, nf, ep.Path[i] + f1c1, radius);
                }
                if (eps1 > eps1_min)
                {
                    eps1_min = eps1;
                }
                if (dist2 > nf)
                {
                    eps2 = ScoutBase.Core.Propagation.EpsilonFromHeights(h2, dist2, ep.Path[i] + f1c2, radius);
                }
                else
                {
                    eps2 = ScoutBase.Core.Propagation.EpsilonFromHeights(h2, nf, ep.Path[i] + f1c2, radius);
                }
                if (eps2 > eps2_min)
                {
                    eps2_min = eps2;
                }
                if (caller != null)
                {
                    // abort calculation if cancellation pending
                    if (caller.WorkerSupportsCancellation && caller.CancellationPending)
                    {
                        return(null);
                    }
                }
            }
            PropagationPathDesignator pp = new PropagationPathDesignator(lat1, lon1, h1, lat2, lon2, h2, qrg, radius, f1_clearance, stepwidth, eps1_min, eps2_min, localobstruction);

            // take status from elevation path
            pp.Valid = ep.Valid;
            // store in database if valid
            if ((pp != null) && pp.Valid && savetodatabase)
            {
                this.PropagationPathInsertOrUpdateIfNewer(pp, model);
            }
            return(pp);
        }
예제 #10
0
        public DateTime PropagationPathFindLastUpdated(double lat1, double lon1, double h1, double lat2, double lon2, double h2, double qrg, double radius, double f1_clearance, double stepwidth, ELEVATIONMODEL model)
        {
            PropagationPathDesignator path = new PropagationPathDesignator(lat1, lon1, h1, lat2, lon2, h2, qrg, radius, f1_clearance, stepwidth, 0, 0, double.MinValue);

            return(this.PropagationPathFindLastUpdated(path, model));
        }
예제 #11
0
        public PropagationPathDesignator PropagationPathFind(double lat1, double lon1, double h1, double lat2, double lon2, double h2, double qrg, double radius, double f1_clearance, double stepwidth, ELEVATIONMODEL model, double localobstruction)
        {
            PropagationPathDesignator path = new PropagationPathDesignator(lat1, lon1, h1, lat2, lon2, h2, qrg, radius, f1_clearance, stepwidth, 0, 0, localobstruction);

            return(this.PropagationPathFind(path, model));
        }