kopia lustrzana https://github.com/dl2alf/AirScout
113 wiersze
4.4 KiB
C#
113 wiersze
4.4 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.ComponentModel;
|
|
using System.Data;
|
|
using System.Data.SQLite;
|
|
using System.Drawing;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
using System.Windows.Forms;
|
|
using System.IO;
|
|
using ScoutBase.Core;
|
|
using ScoutBase.Elevation;
|
|
using ScoutBase.Stations;
|
|
using ScoutBase.Propagation;
|
|
using System.Diagnostics;
|
|
|
|
namespace HorizonGenerator
|
|
{
|
|
public partial class MainDlg : Form
|
|
{
|
|
public MainDlg()
|
|
{
|
|
InitializeComponent();
|
|
}
|
|
|
|
private void Say(string text)
|
|
{
|
|
if (tsl_Status.Text != text)
|
|
{
|
|
tsl_Status.Text = text;
|
|
ss_Main.Refresh();
|
|
}
|
|
}
|
|
|
|
private void CalculateHorizons()
|
|
{
|
|
List<LocationDesignator> lds = StationData.Database.LocationGetAll();
|
|
foreach (LocationDesignator ld in lds)
|
|
{
|
|
Stopwatch st = new Stopwatch();
|
|
try
|
|
{
|
|
// short max = ElevationModel.Database.ElevationTilesMaxElevation(ELEVATIONMODEL.SRTM1, Properties.Settings.Default.MinLat, Properties.Settings.Default.MinLon, Properties.Settings.Default.MaxLat, Properties.Settings.Default.MaxLon);
|
|
short max = 4797;
|
|
ELEVATIONMODEL model = ELEVATIONMODEL.SRTM1;
|
|
BAND band = BAND.B1_2G;
|
|
short antenna_height = 40;
|
|
short h1 = (short)(ElevationData.Database[ld.Lat, ld.Lon, model] + antenna_height);
|
|
double dist = 500.0;
|
|
double stepwidth = ElevationData.Database.GetDefaultStepWidth(model);
|
|
int count = (int)(dist / stepwidth / 1000.0);
|
|
HorizonPoint hp = new HorizonPoint();
|
|
st.Start();
|
|
List<HorizonPoint>[] l = new List<HorizonPoint>[360];
|
|
for (int j = 0; j < 360; j++)
|
|
{
|
|
Say("Calculation horizon of " + ld.Call + ": " + j + " of 360...");
|
|
l[j] = new List<HorizonPoint>();
|
|
ElevationPathDesignator path = new ElevationPathDesignator();
|
|
path = ElevationData.Database.ElevationPathCreateFromBearing(this, ld.Lat, ld.Lon, j, dist, stepwidth, model);
|
|
short[] elv = path.Path;
|
|
// iterate through frequencies
|
|
foreach (int f in Enum.GetValues(typeof(BAND)))
|
|
{
|
|
double f1_clearance = 0.6;
|
|
if (f <= 144)
|
|
f1_clearance = 0.2;
|
|
else if (f <= 432)
|
|
f1_clearance = 0.4;
|
|
hp = PropagationHorizonDesignator.EpsilonMaxFromPath(h1, ref elv, dist, stepwidth, f / 1000.0, f1_clearance, max, LatLon.Earth.Radius * 1.33);
|
|
l[j].Add(hp);
|
|
}
|
|
hp = l[j].ElementAt(0);
|
|
Application.DoEvents();
|
|
}
|
|
st.Stop();
|
|
using (StreamWriter sw = new StreamWriter("Horizon.csv"))
|
|
{
|
|
sw.WriteLine("bearing[deg];eps_50M[deg];eps_70M[deg];eps[144M[deg];eps_432M[deg];eps_1.2G[deg];eps_2.3G[deg];eps_3.4G[deg];eps_5.7G[deg];eps_10G[deg];eps_24G[deg];eps_47G[deg];eps_76G[deg]");
|
|
for (int j = 0; j < l.Length; j++)
|
|
{
|
|
sw.Write(j + ";");
|
|
for (int k = 0; k < l[0].Count; k++)
|
|
{
|
|
sw.Write((l[j].ElementAt(k).Epsmin / Math.PI * 180.0).ToString("F8"));
|
|
if (k < l[0].Count - 1)
|
|
sw.Write(";");
|
|
}
|
|
|
|
sw.WriteLine();
|
|
}
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
|
|
}
|
|
}
|
|
}
|
|
|
|
private void btn_Start_Click(object sender, EventArgs e)
|
|
{
|
|
CalculateHorizons();
|
|
}
|
|
|
|
private void btn_Stop_Click(object sender, EventArgs e)
|
|
{
|
|
this.Close();
|
|
}
|
|
}
|
|
}
|