pull/2/head
dl2alf 2021-12-23 16:18:53 +01:00
rodzic f46e8efd92
commit 6fa8277f34
28 zmienionych plików z 1014 dodań i 190 usunięć

Wyświetl plik

@ -32,5 +32,5 @@ using System.Runtime.InteropServices;
// Sie können alle Werte angeben oder Standardwerte für die Build- und Revisionsnummern verwenden,
// indem Sie "*" wie unten gezeigt eingeben:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.3.3.0")]
[assembly: AssemblyFileVersion("1.3.3.0")]
[assembly: AssemblyVersion("1.3.3.1")]
[assembly: AssemblyFileVersion("1.3.3.1")]

Wyświetl plik

@ -43,7 +43,98 @@ namespace System.Net
return clientExtensions;
}
public static string DownloadFile (string url, int timeout)
private static bool ReadContent(Stream stream, int contentlength, int timeout, ref string response)
{
// set stop watch as timout
Stopwatch st = new Stopwatch();
st.Start();
string resp = "";
int count = 0;
// assign buffer
byte[] buff = new byte[1];
int bytesread = 0;
// read content bytewise
while (bytesread < contentlength)
{
bytesread += stream.Read(buff, 0, buff.Length);
// add it to response
resp += Encoding.ASCII.GetString(buff, 0, buff.Length);
if (st.ElapsedMilliseconds > timeout)
throw new TimeoutException("Connection timed out.");
}
string trailer = "";
// reassign buffer
buff = new byte[1];
// read stream bytewise until CRLFCRLF is detected, should be the next two bytes
do
{
count = stream.Read(buff, 0, buff.Length);
trailer += Encoding.ASCII.GetString(buff, 0, buff.Length);
if (st.ElapsedMilliseconds > timeout)
throw new TimeoutException("Connection timed out.");
}
while (!trailer.Contains("\r\n"));
Console.WriteLine("Reading content [" + contentlength.ToString() + " bytes]: " + resp);
response += resp;
return true;
}
private static bool ReadChunkedContent(Stream stream, int timeout, ref string response)
{
// set stop watch as timout
Stopwatch st = new Stopwatch();
st.Start();
string resp = "";
byte[] buff = new byte[1];
int count = 0;
string strcontentlength = "";
int contentlength = 0;
// chunked transfer, first line should contain content length
// read stream bytewise until CRLF is detected
do
{
count = stream.Read(buff, 0, buff.Length);
strcontentlength += Encoding.ASCII.GetString(buff, 0, buff.Length);
if (st.ElapsedMilliseconds > timeout)
throw new TimeoutException("Connection timed out.");
}
while (!strcontentlength.Contains("\r\n"));
strcontentlength = strcontentlength.Replace("\r\n", "");
contentlength = int.Parse(strcontentlength, System.Globalization.NumberStyles.HexNumber);
// finished reading all chunks
if (contentlength == 0)
{
Console.WriteLine("Reading chunked content finished");
return true;
}
int bytesread = 0;
// read content bytewise
while (bytesread < contentlength)
{
bytesread += stream.Read(buff, 0, buff.Length);
// add it to response
resp += Encoding.ASCII.GetString(buff, 0, buff.Length);
if (st.ElapsedMilliseconds > timeout)
throw new TimeoutException("Connection timed out.");
}
string trailer = "";
// reassign buffer
buff = new byte[1];
// read stream bytewise until CRLFCRLF is detected, should be the next two bytes
do
{
count = stream.Read(buff, 0, buff.Length);
trailer += Encoding.ASCII.GetString(buff, 0, buff.Length);
if (st.ElapsedMilliseconds > timeout)
throw new TimeoutException("Connection timed out.");
}
while (!trailer.Contains("\r\n"));
Console.WriteLine("Reading chunked content [" + contentlength.ToString() + " bytes]: " + resp);
response += resp;
return false;
}
public static string DownloadFile(string url, int timeout)
{
string response = "";
Uri uri = null;
@ -76,13 +167,15 @@ namespace System.Net
var dataToSend = Encoding.ASCII.GetBytes(hdr.ToString());
stream.Write(dataToSend, 0, dataToSend.Length);
byte[] buff;
// set stop watch as timout
Stopwatch st = new Stopwatch();
st.Start();
//read header bytewise
string header = "";
int totalRead = 0;
byte[] buff = new byte[1];
buff = new byte[1];
do
{
totalRead = stream.Read(buff, 0, buff.Length);
@ -91,47 +184,20 @@ namespace System.Net
throw new TimeoutException("Connection to " + url + " timed out.");
}
while (!header.Contains("\r\n\r\n"));
Console.Write(header);
int contentlength = 0;
if (header.Contains("Transfer-Encoding: chunked"))
{
// chunked transfer, first line should contain content length
string strcontentlength = "";
do
{
totalRead = stream.Read(buff, 0, buff.Length);
strcontentlength += Encoding.ASCII.GetString(buff, 0, buff.Length);
if (st.ElapsedMilliseconds > timeout)
throw new TimeoutException("Connection to " + url + " timed out.");
}
while (!strcontentlength.Contains("\r\n"));
strcontentlength = strcontentlength.Replace("\r\n", "");
contentlength = int.Parse(strcontentlength, System.Globalization.NumberStyles.HexNumber);
// chunked transfer, read all chunks until complete
while (!ReadChunkedContent(stream, timeout, ref response))
{ }
}
else
{
// get content length from header
Regex strcontentlength = new Regex("(?<=Content-Length:\\s)\\d+", RegexOptions.IgnoreCase);
contentlength = int.Parse(strcontentlength.Match(header).Value);
}
// re-assign buffer
// read response
buff = new byte[1000];
totalRead = 0;
do
{
int bytesRead = stream.Read(buff, 0, buff.Length);
string part = Encoding.UTF8.GetString(buff, 0, bytesRead);
Console.WriteLine(part);
response += part;
totalRead += bytesRead;
if (st.ElapsedMilliseconds > timeout)
throw new TimeoutException("Connection to " + url + " timed out.");
}
while (totalRead < contentlength);
// cut response at the end
if (response.Contains("\r\n"))
{
response = response.Substring(0, response.IndexOf("\r\n"));
Regex rcontentlength = new Regex("(?<=Content-Length:\\s)\\d+", RegexOptions.IgnoreCase);
contentlength = int.Parse(rcontentlength.Match(header).Value);
ReadContent(stream, contentlength, timeout, ref response);
}
st.Stop();
}

Wyświetl plik

@ -32,5 +32,5 @@ using System.Runtime.InteropServices;
// Sie können alle Werte angeben oder Standardwerte für die Build- und Revisionsnummern verwenden,
// indem Sie "*" wie unten gezeigt eingeben:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.3.3.0")]
[assembly: AssemblyFileVersion("1.3.3.0")]
[assembly: AssemblyVersion("1.3.3.1")]
[assembly: AssemblyFileVersion("1.3.3.1")]

Wyświetl plik

@ -4,11 +4,13 @@ using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Net.Sockets;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
namespace System.Net
{
@ -41,6 +43,97 @@ namespace System.Net
return clientExtensions;
}
private static bool ReadContent(Stream stream, int contentlength, int timeout, ref string response)
{
// set stop watch as timout
Stopwatch st = new Stopwatch();
st.Start();
string resp = "";
int count = 0;
// assign buffer
byte[] buff = new byte[1];
int bytesread = 0;
// read content bytewise
while (bytesread < contentlength)
{
bytesread += stream.Read(buff, 0, buff.Length);
// add it to response
resp += Encoding.ASCII.GetString(buff, 0, buff.Length);
if (st.ElapsedMilliseconds > timeout)
throw new TimeoutException("Connection timed out.");
}
string trailer = "";
// reassign buffer
buff = new byte[1];
// read stream bytewise until CRLFCRLF is detected, should be the next two bytes
do
{
count = stream.Read(buff, 0, buff.Length);
trailer += Encoding.ASCII.GetString(buff, 0, buff.Length);
if (st.ElapsedMilliseconds > timeout)
throw new TimeoutException("Connection timed out.");
}
while (!trailer.Contains("\r\n"));
Console.WriteLine("Reading content [" + contentlength.ToString() + " bytes]: " + resp);
response += resp;
return true;
}
private static bool ReadChunkedContent(Stream stream, int timeout, ref string response)
{
// set stop watch as timout
Stopwatch st = new Stopwatch();
st.Start();
string resp = "";
byte[] buff = new byte[1];
int count = 0;
string strcontentlength = "";
int contentlength = 0;
// chunked transfer, first line should contain content length
// read stream bytewise until CRLF is detected
do
{
count = stream.Read(buff, 0, buff.Length);
strcontentlength += Encoding.ASCII.GetString(buff, 0, buff.Length);
if (st.ElapsedMilliseconds > timeout)
throw new TimeoutException("Connection timed out.");
}
while (!strcontentlength.Contains("\r\n"));
strcontentlength = strcontentlength.Replace("\r\n", "");
contentlength = int.Parse(strcontentlength, System.Globalization.NumberStyles.HexNumber);
// finished reading all chunks
if (contentlength == 0)
{
Console.WriteLine("Reading chunked content finished");
return true;
}
int bytesread = 0;
// read content bytewise
while (bytesread < contentlength)
{
bytesread += stream.Read(buff, 0, buff.Length);
// add it to response
resp += Encoding.ASCII.GetString(buff, 0, buff.Length);
if (st.ElapsedMilliseconds > timeout)
throw new TimeoutException("Connection timed out.");
}
string trailer = "";
// reassign buffer
buff = new byte[1];
// read stream bytewise until CRLFCRLF is detected, should be the next two bytes
do
{
count = stream.Read(buff, 0, buff.Length);
trailer += Encoding.ASCII.GetString(buff, 0, buff.Length);
if (st.ElapsedMilliseconds > timeout)
throw new TimeoutException("Connection timed out.");
}
while (!trailer.Contains("\r\n"));
Console.WriteLine("Reading chunked content [" + contentlength.ToString() + " bytes]: " + resp);
response += resp;
return false;
}
public static string DownloadFile (string url, int timeout, string apikey)
{
string response = "";
@ -75,13 +168,15 @@ namespace System.Net
var dataToSend = Encoding.ASCII.GetBytes(hdr.ToString());
stream.Write(dataToSend, 0, dataToSend.Length);
byte[] buff;
// set stop watch as timout
Stopwatch st = new Stopwatch();
st.Start();
//read header bytewise
string header = "";
int totalRead = 0;
byte[] buff = new byte[1];
buff = new byte[1];
do
{
totalRead = stream.Read(buff, 0, buff.Length);
@ -90,47 +185,20 @@ namespace System.Net
throw new TimeoutException("Connection to " + url + " timed out.");
}
while (!header.Contains("\r\n\r\n"));
Console.Write(header);
int contentlength = 0;
if (header.Contains("Transfer-Encoding: chunked"))
{
// chunked transfer, first line should contain content length
string strcontentlength = "";
do
{
totalRead = stream.Read(buff, 0, buff.Length);
strcontentlength += Encoding.ASCII.GetString(buff, 0, buff.Length);
if (st.ElapsedMilliseconds > timeout)
throw new TimeoutException("Connection to " + url + " timed out.");
}
while (!strcontentlength.Contains("\r\n"));
strcontentlength = strcontentlength.Replace("\r\n", "");
contentlength = int.Parse(strcontentlength, System.Globalization.NumberStyles.HexNumber);
// chunked transfer, read all chunks until complete
while (!ReadChunkedContent(stream, timeout, ref response))
{ }
}
else
{
// get content length from header
Regex strcontentlength = new Regex("(?<=Content-Length:\\s)\\d+", RegexOptions.IgnoreCase);
contentlength = int.Parse(strcontentlength.Match(header).Value);
}
// re-assign buffer
// read response
buff = new byte[1000];
totalRead = 0;
do
{
int bytesRead = stream.Read(buff, 0, buff.Length);
string part = Encoding.UTF8.GetString(buff, 0, bytesRead);
Console.WriteLine(part);
response += part;
totalRead += bytesRead;
if (st.ElapsedMilliseconds > timeout)
throw new TimeoutException("Connection to " + url + " timed out.");
}
while (totalRead < contentlength);
// cut response at the end
if (response.Contains("\r\n"))
{
response = response.Substring(0, response.IndexOf("\r\n"));
Regex rcontentlength = new Regex("(?<=Content-Length:\\s)\\d+", RegexOptions.IgnoreCase);
contentlength = int.Parse(rcontentlength.Match(header).Value);
ReadContent(stream, contentlength, timeout, ref response);
}
st.Stop();
}

Wyświetl plik

@ -368,7 +368,6 @@ namespace AirScout.PlaneFeeds.Plugin.VirtualRadarServer
Console.WriteLine("[" + this.GetType().Name + "]: Analyzing data");
// JavaScriptSerializer js = new JavaScriptSerializer();
// dynamic root = js.Deserialize<dynamic>(json);
dynamic root = JsonConvert.DeserializeObject(json);
// 2017-07-23: workaround for "jumping planes" due to incorrect time stamps
// try to get the server time to adjust the time stamps in plane positions
// --> compare server time with local time and calculate offset
@ -376,6 +375,9 @@ namespace AirScout.PlaneFeeds.Plugin.VirtualRadarServer
long toffset = 0;
try
{
// deserialize JSON
dynamic root = JsonConvert.DeserializeObject(json);
// get local time of request in milliseconds
DateTime lt = DateTime.UtcNow;
long ltime = (long)(lt - new DateTime(1970, 1, 1)).TotalMilliseconds;

Wyświetl plik

@ -1,7 +1,7 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16
VisualStudioVersion = 16.0.29609.76
# Visual Studio Version 17
VisualStudioVersion = 17.0.31903.59
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AirScout", "AirScout\AirScout.csproj", "{17498590-2CFF-4D24-BFB8-549D14BD2545}"
EndProject

Wyświetl plik

@ -136,6 +136,12 @@
<Reference Include="WindowsBase" />
</ItemGroup>
<ItemGroup>
<Compile Include="DeleteSingleStationDlg.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="DeleteSingleStationDlg.Designer.cs">
<DependentUpon>DeleteSingleStationDlg.cs</DependentUpon>
</Compile>
<Compile Include="MapPreloader.cs">
<SubType>Form</SubType>
</Compile>
@ -314,6 +320,7 @@
<None Include="Resources\AirScout_Marker.png" />
<None Include="Resources\AirScout_Watchlist.png" />
<None Include="Resources\Settings.png" />
<Content Include="Requirements.txt" />
<Content Include="VersionHistory.txt">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
@ -329,6 +336,9 @@
<EmbeddedResource Include="DatabaseMaintenanceDlg.resx">
<DependentUpon>DatabaseMaintenanceDlg.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="DeleteSingleStationDlg.resx">
<DependentUpon>DeleteSingleStationDlg.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="ElevationCopyrightDlg.resx">
<DependentUpon>ElevationCopyrightDlg.cs</DependentUpon>
</EmbeddedResource>

Wyświetl plik

@ -36,19 +36,19 @@
this.ss_Main = new System.Windows.Forms.StatusStrip();
this.tsl_Main = new System.Windows.Forms.ToolStripStatusLabel();
this.panel1 = new System.Windows.Forms.Panel();
this.label2 = new System.Windows.Forms.Label();
this.label1 = new System.Windows.Forms.Label();
this.ud_Analysis_AmbiguousGap = new System.Windows.Forms.NumericUpDown();
this.cb_Analysis_CrossingHistory_WithSignlaLevel = new System.Windows.Forms.CheckBox();
this.btn_History_Export = new System.Windows.Forms.Button();
this.btn_History_Cancel = new System.Windows.Forms.Button();
this.btn_History_Calculate = new System.Windows.Forms.Button();
this.tt_Crossing_History = new System.Windows.Forms.ToolTip(this.components);
this.ch_Crossing_History = new System.Windows.Forms.DataVisualization.Charting.Chart();
this.cb_Analysis_CrossingHistory_WithSignlaLevel = new System.Windows.Forms.CheckBox();
this.ud_Analysis_AmbiguousGap = new System.Windows.Forms.NumericUpDown();
this.label1 = new System.Windows.Forms.Label();
this.label2 = new System.Windows.Forms.Label();
this.ss_Main.SuspendLayout();
this.panel1.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.ch_Crossing_History)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.ud_Analysis_AmbiguousGap)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.ch_Crossing_History)).BeginInit();
this.SuspendLayout();
//
// bw_History
@ -90,6 +90,45 @@
this.panel1.Size = new System.Drawing.Size(893, 100);
this.panel1.TabIndex = 2;
//
// label2
//
this.label2.AutoSize = true;
this.label2.Location = new System.Drawing.Point(393, 51);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(32, 13);
this.label2.TabIndex = 6;
this.label2.Text = "secs.";
//
// label1
//
this.label1.AutoSize = true;
this.label1.Location = new System.Drawing.Point(9, 51);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(276, 13);
this.label1.TabIndex = 5;
this.label1.Text = "Timespan within two crossings considered as ambiguous:";
//
// ud_Analysis_AmbiguousGap
//
this.ud_Analysis_AmbiguousGap.DataBindings.Add(new System.Windows.Forms.Binding("Value", global::AirScout.Properties.Settings.Default, "Analysis_CrossingHistory_AmbigousGap", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
this.ud_Analysis_AmbiguousGap.Location = new System.Drawing.Point(318, 49);
this.ud_Analysis_AmbiguousGap.Name = "ud_Analysis_AmbiguousGap";
this.ud_Analysis_AmbiguousGap.Size = new System.Drawing.Size(60, 20);
this.ud_Analysis_AmbiguousGap.TabIndex = 4;
this.ud_Analysis_AmbiguousGap.Value = global::AirScout.Properties.Settings.Default.Analysis_CrossingHistory_AmbigousGap;
//
// cb_Analysis_CrossingHistory_WithSignlaLevel
//
this.cb_Analysis_CrossingHistory_WithSignlaLevel.AutoSize = true;
this.cb_Analysis_CrossingHistory_WithSignlaLevel.Checked = global::AirScout.Properties.Settings.Default.Analysis_CrossingHistory_WithSignalLevel;
this.cb_Analysis_CrossingHistory_WithSignlaLevel.DataBindings.Add(new System.Windows.Forms.Binding("Checked", global::AirScout.Properties.Settings.Default, "Analysis_CrossingHistory_WithSignalLevel", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
this.cb_Analysis_CrossingHistory_WithSignlaLevel.Location = new System.Drawing.Point(12, 21);
this.cb_Analysis_CrossingHistory_WithSignlaLevel.Name = "cb_Analysis_CrossingHistory_WithSignlaLevel";
this.cb_Analysis_CrossingHistory_WithSignlaLevel.Size = new System.Drawing.Size(258, 17);
this.cb_Analysis_CrossingHistory_WithSignlaLevel.TabIndex = 3;
this.cb_Analysis_CrossingHistory_WithSignlaLevel.Text = "Consider crossings with recorded signal level only";
this.cb_Analysis_CrossingHistory_WithSignlaLevel.UseVisualStyleBackColor = true;
//
// btn_History_Export
//
this.btn_History_Export.Location = new System.Drawing.Point(697, 41);
@ -151,45 +190,6 @@
this.ch_Crossing_History.TabIndex = 5;
this.ch_Crossing_History.Text = "History";
//
// cb_Analysis_CrossingHistory_WithSignlaLevel
//
this.cb_Analysis_CrossingHistory_WithSignlaLevel.AutoSize = true;
this.cb_Analysis_CrossingHistory_WithSignlaLevel.Checked = global::AirScout.Properties.Settings.Default.Analysis_CrossingHistory_WithSignalLevel;
this.cb_Analysis_CrossingHistory_WithSignlaLevel.DataBindings.Add(new System.Windows.Forms.Binding("Checked", global::AirScout.Properties.Settings.Default, "Analysis_CrossingHistory_WithSignalLevel", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
this.cb_Analysis_CrossingHistory_WithSignlaLevel.Location = new System.Drawing.Point(12, 21);
this.cb_Analysis_CrossingHistory_WithSignlaLevel.Name = "cb_Analysis_CrossingHistory_WithSignlaLevel";
this.cb_Analysis_CrossingHistory_WithSignlaLevel.Size = new System.Drawing.Size(258, 17);
this.cb_Analysis_CrossingHistory_WithSignlaLevel.TabIndex = 3;
this.cb_Analysis_CrossingHistory_WithSignlaLevel.Text = "Consider crossings with recorded signal level only";
this.cb_Analysis_CrossingHistory_WithSignlaLevel.UseVisualStyleBackColor = true;
//
// ud_Analysis_AmbiguousGap
//
this.ud_Analysis_AmbiguousGap.DataBindings.Add(new System.Windows.Forms.Binding("Value", global::AirScout.Properties.Settings.Default, "Analysis_CrossingHistory_AmbiguousGap", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
this.ud_Analysis_AmbiguousGap.Location = new System.Drawing.Point(318, 49);
this.ud_Analysis_AmbiguousGap.Name = "ud_Analysis_AmbiguousGap";
this.ud_Analysis_AmbiguousGap.Size = new System.Drawing.Size(60, 20);
this.ud_Analysis_AmbiguousGap.TabIndex = 4;
this.ud_Analysis_AmbiguousGap.Value = global::AirScout.Properties.Settings.Default.Analysis_CrossingHistory_AmbigousGap;
//
// label1
//
this.label1.AutoSize = true;
this.label1.Location = new System.Drawing.Point(9, 51);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(276, 13);
this.label1.TabIndex = 5;
this.label1.Text = "Timespan within two crossings considered as ambiguous:";
//
// label2
//
this.label2.AutoSize = true;
this.label2.Location = new System.Drawing.Point(393, 51);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(32, 13);
this.label2.TabIndex = 6;
this.label2.Text = "secs.";
//
// CrossingHistoryDlg
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
@ -206,8 +206,8 @@
this.ss_Main.PerformLayout();
this.panel1.ResumeLayout(false);
this.panel1.PerformLayout();
((System.ComponentModel.ISupportInitialize)(this.ch_Crossing_History)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.ud_Analysis_AmbiguousGap)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.ch_Crossing_History)).EndInit();
this.ResumeLayout(false);
this.PerformLayout();

Wyświetl plik

@ -0,0 +1,140 @@
namespace AirScout
{
partial class DeleteSingleStationDlg
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(DeleteSingleStationDlg));
this.label1 = new System.Windows.Forms.Label();
this.cb_Call = new System.Windows.Forms.ComboBox();
this.cb_Locator = new System.Windows.Forms.ComboBox();
this.label2 = new System.Windows.Forms.Label();
this.label3 = new System.Windows.Forms.Label();
this.btn_Delete = new System.Windows.Forms.Button();
this.btn_Cancel = new System.Windows.Forms.Button();
this.SuspendLayout();
//
// label1
//
this.label1.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Italic, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.label1.Location = new System.Drawing.Point(12, 19);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(464, 92);
this.label1.TabIndex = 0;
this.label1.Text = resources.GetString("label1.Text");
//
// cb_Call
//
this.cb_Call.FormattingEnabled = true;
this.cb_Call.Location = new System.Drawing.Point(55, 132);
this.cb_Call.Name = "cb_Call";
this.cb_Call.Size = new System.Drawing.Size(121, 21);
this.cb_Call.TabIndex = 1;
this.cb_Call.DropDown += new System.EventHandler(this.cb_Call_DropDown);
this.cb_Call.SelectedIndexChanged += new System.EventHandler(this.cb_Call_SelectedIndexChanged);
this.cb_Call.TextChanged += new System.EventHandler(this.cb_Call_TextChanged);
this.cb_Call.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.cb_Call_KeyPress);
//
// cb_Locator
//
this.cb_Locator.FormattingEnabled = true;
this.cb_Locator.Location = new System.Drawing.Point(279, 132);
this.cb_Locator.Name = "cb_Locator";
this.cb_Locator.Size = new System.Drawing.Size(121, 21);
this.cb_Locator.TabIndex = 2;
//
// label2
//
this.label2.AutoSize = true;
this.label2.Location = new System.Drawing.Point(22, 135);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(27, 13);
this.label2.TabIndex = 3;
this.label2.Text = "Call:";
//
// label3
//
this.label3.AutoSize = true;
this.label3.Location = new System.Drawing.Point(223, 135);
this.label3.Name = "label3";
this.label3.Size = new System.Drawing.Size(46, 13);
this.label3.TabIndex = 4;
this.label3.Text = "Locator:";
//
// btn_Delete
//
this.btn_Delete.BackColor = System.Drawing.Color.Tomato;
this.btn_Delete.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.btn_Delete.ForeColor = System.Drawing.Color.White;
this.btn_Delete.Location = new System.Drawing.Point(55, 173);
this.btn_Delete.Name = "btn_Delete";
this.btn_Delete.Size = new System.Drawing.Size(121, 35);
this.btn_Delete.TabIndex = 5;
this.btn_Delete.Text = "Delete";
this.btn_Delete.UseVisualStyleBackColor = false;
//
// btn_Cancel
//
this.btn_Cancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
this.btn_Cancel.Location = new System.Drawing.Point(279, 173);
this.btn_Cancel.Name = "btn_Cancel";
this.btn_Cancel.Size = new System.Drawing.Size(121, 35);
this.btn_Cancel.TabIndex = 6;
this.btn_Cancel.Text = "Cancel";
this.btn_Cancel.UseVisualStyleBackColor = true;
//
// DeleteSingleStationDlg
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.CancelButton = this.btn_Cancel;
this.ClientSize = new System.Drawing.Size(485, 220);
this.Controls.Add(this.btn_Cancel);
this.Controls.Add(this.btn_Delete);
this.Controls.Add(this.label3);
this.Controls.Add(this.label2);
this.Controls.Add(this.cb_Locator);
this.Controls.Add(this.cb_Call);
this.Controls.Add(this.label1);
this.Name = "DeleteSingleStationDlg";
this.Text = "Delete Single Station";
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.Label label1;
private System.Windows.Forms.ComboBox cb_Call;
private System.Windows.Forms.ComboBox cb_Locator;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.Label label3;
private System.Windows.Forms.Button btn_Delete;
private System.Windows.Forms.Button btn_Cancel;
}
}

Wyświetl plik

@ -0,0 +1,71 @@
using ScoutBase.Stations;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace AirScout
{
public partial class DeleteSingleStationDlg : Form
{
bool SelectionChanged = false;
public DeleteSingleStationDlg()
{
InitializeComponent();
}
private void cb_Call_TextChanged(object sender, EventArgs e)
{
if (!SelectionChanged)
{
int start = cb_Call.SelectionStart;
int len = cb_Call.SelectionLength;
string text = cb_Call.Text.ToUpper().Trim();
if (cb_Call.Text != text)
cb_Call.Text = text;
cb_Call.SelectionStart = start;
cb_Call.SelectionLength = len;
}
SelectionChanged = false;
}
private void cb_Call_SelectedIndexChanged(object sender, EventArgs e)
{
// suppress handling on text input
if (!cb_Call.DroppedDown)
return;
if (cb_Call.SelectedItem != null)
{
SelectionChanged = true;
cb_Call.Text = (string)cb_Call.SelectedItem;
}
}
private void cb_Call_KeyPress(object sender, KeyPressEventArgs e)
{
}
private void cb_Call_DropDown(object sender, EventArgs e)
{
if (!cb_Call.DroppedDown && (cb_Call.Text.Length >= 2))
{
List<LocationDesignator> l = StationData.Database.LocationGetAll("%" + cb_Call.Text + "%");
if (l != null)
{
cb_Call.Items.Clear();
cb_Locator.Items.Clear();
foreach (LocationDesignator ld in l)
{
cb_Call.Items.Add(ld.Call);
cb_Locator.Items.Add(ld.Loc);
}
}
}
}
}
}

Wyświetl plik

@ -0,0 +1,124 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="label1.Text" xml:space="preserve">
<value>Use this dialog to find and remove a single station/locator combination from the local station database.
CAUTION: You can only remove own entries permanently. If a station/locator combination is part of the global database it would be re-inserted on next update.</value>
</data>
</root>

Wyświetl plik

@ -40,7 +40,6 @@
this.label8 = new System.Windows.Forms.Label();
this.gm_Callsign = new GMap.NET.WindowsForms.GMapControl();
this.tb_Callsign = new ScoutBase.Core.CallsignTextBox();
this.tb_Locator = new ScoutBase.Core.LocatorTextBox();
this.tb_Longitude = new ScoutBase.Core.DoubleTextBox();
this.tb_Latitude = new ScoutBase.Core.DoubleTextBox();
this.btn_Cancel = new System.Windows.Forms.Button();
@ -48,6 +47,13 @@
this.label1 = new System.Windows.Forms.Label();
this.tb_Elevation = new ScoutBase.Core.DoubleTextBox();
this.label2 = new System.Windows.Forms.Label();
this.ss_Main = new System.Windows.Forms.StatusStrip();
this.tsl_Status = new System.Windows.Forms.ToolStripStatusLabel();
this.bw_Elevationgrid = new System.ComponentModel.BackgroundWorker();
this.tb_Locator = new ScoutBase.Core.LocatorTextBox();
this.cb_Options_StationsMap_OverlayElevation = new System.Windows.Forms.CheckBox();
this.label3 = new System.Windows.Forms.Label();
this.ss_Main.SuspendLayout();
this.SuspendLayout();
//
// label19
@ -153,7 +159,7 @@
this.gm_Callsign.RoutesEnabled = true;
this.gm_Callsign.SelectedAreaFillColor = System.Drawing.Color.FromArgb(((int)(((byte)(33)))), ((int)(((byte)(65)))), ((int)(((byte)(105)))), ((int)(((byte)(225)))));
this.gm_Callsign.ShowTileGridLines = false;
this.gm_Callsign.Size = new System.Drawing.Size(760, 621);
this.gm_Callsign.Size = new System.Drawing.Size(760, 617);
this.gm_Callsign.TabIndex = 29;
this.gm_Callsign.Zoom = 0D;
this.gm_Callsign.OnMarkerEnter += new GMap.NET.WindowsForms.MarkerEnter(this.gm_Callsign_OnMarkerEnter);
@ -176,19 +182,6 @@
this.tb_Callsign.Size = new System.Drawing.Size(107, 21);
this.tb_Callsign.TabIndex = 30;
//
// tb_Locator
//
this.tb_Locator.DataBindings.Add(new System.Windows.Forms.Binding("SmallLettersForSubsquares", global::AirScout.Properties.Settings.Default, "Locator_SmallLettersForSubsquares", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
this.tb_Locator.ErrorBackColor = System.Drawing.Color.Red;
this.tb_Locator.ErrorForeColor = System.Drawing.Color.White;
this.tb_Locator.Font = new System.Drawing.Font("Courier New", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.tb_Locator.Location = new System.Drawing.Point(875, 140);
this.tb_Locator.Name = "tb_Locator";
this.tb_Locator.Size = new System.Drawing.Size(107, 21);
this.tb_Locator.SmallLettersForSubsquares = global::AirScout.Properties.Settings.Default.Locator_SmallLettersForSubsquares;
this.tb_Locator.TabIndex = 35;
this.tb_Locator.TextChanged += new System.EventHandler(this.tb_Locator_TextChanged);
//
// tb_Longitude
//
this.tb_Longitude.Font = new System.Drawing.Font("Courier New", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
@ -199,7 +192,7 @@
this.tb_Longitude.Name = "tb_Longitude";
this.tb_Longitude.Size = new System.Drawing.Size(107, 21);
this.tb_Longitude.TabIndex = 33;
this.tb_Longitude.Text = "10.68327000";
this.tb_Longitude.Text = "10.68327";
this.tb_Longitude.Value = 10.68327D;
this.tb_Longitude.TextChanged += new System.EventHandler(this.tb_Longitude_TextChanged);
//
@ -213,14 +206,14 @@
this.tb_Latitude.Name = "tb_Latitude";
this.tb_Latitude.Size = new System.Drawing.Size(107, 21);
this.tb_Latitude.TabIndex = 32;
this.tb_Latitude.Text = "50.93706700";
this.tb_Latitude.Text = "50.937067";
this.tb_Latitude.Value = 50.937067D;
this.tb_Latitude.TextChanged += new System.EventHandler(this.tb_Latitude_TextChanged);
//
// btn_Cancel
//
this.btn_Cancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
this.btn_Cancel.Location = new System.Drawing.Point(806, 685);
this.btn_Cancel.Location = new System.Drawing.Point(804, 665);
this.btn_Cancel.Name = "btn_Cancel";
this.btn_Cancel.Size = new System.Drawing.Size(75, 23);
this.btn_Cancel.TabIndex = 44;
@ -231,7 +224,7 @@
// btn_OK
//
this.btn_OK.DialogResult = System.Windows.Forms.DialogResult.OK;
this.btn_OK.Location = new System.Drawing.Point(907, 685);
this.btn_OK.Location = new System.Drawing.Point(907, 665);
this.btn_OK.Name = "btn_OK";
this.btn_OK.Size = new System.Drawing.Size(75, 23);
this.btn_OK.TabIndex = 45;
@ -271,6 +264,63 @@
this.label2.TabIndex = 49;
this.label2.Text = "m asl";
//
// ss_Main
//
this.ss_Main.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.tsl_Status});
this.ss_Main.Location = new System.Drawing.Point(0, 707);
this.ss_Main.Name = "ss_Main";
this.ss_Main.Size = new System.Drawing.Size(1008, 22);
this.ss_Main.TabIndex = 50;
this.ss_Main.Text = "statusStrip1";
//
// tsl_Status
//
this.tsl_Status.Name = "tsl_Status";
this.tsl_Status.Size = new System.Drawing.Size(39, 17);
this.tsl_Status.Text = "Status";
//
// bw_Elevationgrid
//
this.bw_Elevationgrid.WorkerReportsProgress = true;
this.bw_Elevationgrid.WorkerSupportsCancellation = true;
this.bw_Elevationgrid.DoWork += new System.ComponentModel.DoWorkEventHandler(this.bw_Elevationgrid_DoWork);
this.bw_Elevationgrid.ProgressChanged += new System.ComponentModel.ProgressChangedEventHandler(this.bw_Elevationgrid_ProgressChanged);
this.bw_Elevationgrid.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(this.bw_Elevationgrid_RunWorkerCompleted);
//
// tb_Locator
//
this.tb_Locator.DataBindings.Add(new System.Windows.Forms.Binding("SmallLettersForSubsquares", global::AirScout.Properties.Settings.Default, "Locator_SmallLettersForSubsquares", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
this.tb_Locator.ErrorBackColor = System.Drawing.Color.Red;
this.tb_Locator.ErrorForeColor = System.Drawing.Color.White;
this.tb_Locator.Font = new System.Drawing.Font("Courier New", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.tb_Locator.Location = new System.Drawing.Point(875, 140);
this.tb_Locator.Name = "tb_Locator";
this.tb_Locator.Size = new System.Drawing.Size(107, 21);
this.tb_Locator.SmallLettersForSubsquares = global::AirScout.Properties.Settings.Default.Locator_SmallLettersForSubsquares;
this.tb_Locator.TabIndex = 35;
this.tb_Locator.TextChanged += new System.EventHandler(this.tb_Locator_TextChanged);
//
// cb_Options_StationsMap_OverlayElevation
//
this.cb_Options_StationsMap_OverlayElevation.CheckAlign = System.Drawing.ContentAlignment.MiddleRight;
this.cb_Options_StationsMap_OverlayElevation.Checked = global::AirScout.Properties.Settings.Default.StationsMap_OverlayElevation;
this.cb_Options_StationsMap_OverlayElevation.Location = new System.Drawing.Point(804, 267);
this.cb_Options_StationsMap_OverlayElevation.Name = "cb_Options_StationsMap_OverlayElevation";
this.cb_Options_StationsMap_OverlayElevation.Size = new System.Drawing.Size(178, 46);
this.cb_Options_StationsMap_OverlayElevation.TabIndex = 51;
this.cb_Options_StationsMap_OverlayElevation.Text = "Overlay Elevation Grid \r\n(on zom levels >= 17)";
this.cb_Options_StationsMap_OverlayElevation.UseVisualStyleBackColor = true;
this.cb_Options_StationsMap_OverlayElevation.CheckedChanged += new System.EventHandler(this.cb_Options_StationsMap_OverlayElevation_CheckedChanged);
//
// label3
//
this.label3.AutoSize = true;
this.label3.Location = new System.Drawing.Point(813, 434);
this.label3.Name = "label3";
this.label3.Size = new System.Drawing.Size(0, 13);
this.label3.TabIndex = 52;
//
// MapStationDlg
//
this.AcceptButton = this.btn_OK;
@ -278,6 +328,9 @@
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.CancelButton = this.btn_Cancel;
this.ClientSize = new System.Drawing.Size(1008, 729);
this.Controls.Add(this.label3);
this.Controls.Add(this.cb_Options_StationsMap_OverlayElevation);
this.Controls.Add(this.ss_Main);
this.Controls.Add(this.label2);
this.Controls.Add(this.tb_Elevation);
this.Controls.Add(this.label1);
@ -302,6 +355,9 @@
this.MinimizeBox = false;
this.Name = "MapStationDlg";
this.Text = "MapStationDlg";
this.Load += new System.EventHandler(this.MapStationDlg_Load);
this.ss_Main.ResumeLayout(false);
this.ss_Main.PerformLayout();
this.ResumeLayout(false);
this.PerformLayout();
@ -328,5 +384,10 @@
private System.Windows.Forms.Label label1;
private ScoutBase.Core.DoubleTextBox tb_Elevation;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.StatusStrip ss_Main;
private System.Windows.Forms.ToolStripStatusLabel tsl_Status;
private System.ComponentModel.BackgroundWorker bw_Elevationgrid;
private System.Windows.Forms.CheckBox cb_Options_StationsMap_OverlayElevation;
private System.Windows.Forms.Label label3;
}
}

Wyświetl plik

@ -21,6 +21,7 @@ namespace AirScout
GMapOverlay Callsignpolygons = new GMapOverlay("Callsignpolygons");
GMapOverlay Callsignspositions = new GMapOverlay("Callsignpositions");
GMapOverlay Elevationgrid = new GMapOverlay("Elevationgrid");
GMarkerGoogle UserPos = new GMarkerGoogle(new PointLatLng(0.0, 0.0), GMarkerGoogleType.red_dot);
@ -48,6 +49,7 @@ namespace AirScout
gm_Callsign.MapScaleInfoEnabled = true;
gm_Callsign.Overlays.Add(Callsignpolygons);
gm_Callsign.Overlays.Add(Callsignspositions);
gm_Callsign.Overlays.Add(Elevationgrid);
Callsignspositions.Markers.Add(UserPos);
// initially set textboxes
tb_Callsign.SilentText = StationLocation.Call;
@ -56,11 +58,15 @@ namespace AirScout
tb_Locator.SilentText = MaidenheadLocator.LocFromLatLon(StationLocation.Lat, StationLocation.Lon, Properties.Settings.Default.Locator_SmallLettersForSubsquares, (int)Properties.Settings.Default.Locator_MaxLength / 2, Properties.Settings.Default.Locator_AutoLength);
tb_Elevation.SilentValue = GetElevation(StationLocation.Lat, StationLocation.Lon);
ValidateDetails();
// show initial zoom level in text box
gm_Callsign_OnMapZoomChanged();
}
private void MapStationDlg_Load(object sender, EventArgs e)
{
// initialen Zoomlevel anzeigen
gm_Callsign_OnMapZoomChanged();
}
private void btn_Cancel_Click(object sender, EventArgs e)
{
@ -264,6 +270,166 @@ namespace AirScout
{
// maintain zoom level
tb_Zoom.Text = gm_Callsign.Zoom.ToString();
ShowElevationGrid();
}
private void ShowElevationGrid()
{
while (bw_Elevationgrid.IsBusy)
{
bw_Elevationgrid.CancelAsync();
Application.DoEvents();
}
Elevationgrid.Polygons.Clear();
if (cb_Options_StationsMap_OverlayElevation.Checked && (gm_Callsign.Zoom >= 17))
{
bw_Elevationgrid.RunWorkerAsync();
}
}
private void bw_Elevationgrid_DoWork(object sender, DoWorkEventArgs e)
{
// fill elevation grid
bw_Elevationgrid.ReportProgress(0, "Calculating elevation grid...");
Elevationgrid.Polygons.Clear();
// convert view bounds to the beginning/end of Maidenhead locators
string loc = MaidenheadLocator.LocFromLatLon(gm_Callsign.ViewArea.Lat - gm_Callsign.ViewArea.HeightLat, gm_Callsign.ViewArea.Lng,false,3);
double minlat = MaidenheadLocator.LatFromLoc(loc, PositionInRectangle.BottomLeft);
double minlon = MaidenheadLocator.LonFromLoc(loc, PositionInRectangle.BottomLeft);
loc = MaidenheadLocator.LocFromLatLon(gm_Callsign.ViewArea.Lat, gm_Callsign.ViewArea.Lng + gm_Callsign.ViewArea.WidthLng, false, 3);
double maxlat = MaidenheadLocator.LatFromLoc(loc, PositionInRectangle.TopRight);
double maxlon = MaidenheadLocator.LonFromLoc(loc, PositionInRectangle.TopRight);
double lat = minlat;
double lon = minlon;
double stepwidthlat = 5.5555555555555555555555555555556e-4 / 2;
double stepwidthlon = 5.5555555555555555555555555555556e-4;
List<ElevationTile> elvs = new List<ElevationTile>();
double elvmin = short.MaxValue;
double elvmax = short.MinValue;
while (!bw_Elevationgrid.CancellationPending && (lat < maxlat))
{
lon = minlon;
while (!bw_Elevationgrid.CancellationPending && (lon < maxlon))
{
double elv = 0;
if ((lat + stepwidthlat >= gm_Callsign.ViewArea.Lat - gm_Callsign.ViewArea.HeightLat) &&
(lat <= gm_Callsign.ViewArea.Lat) &&
(lon + stepwidthlon >= gm_Callsign.ViewArea.Lng) &&
(lon <= gm_Callsign.ViewArea.Lng + gm_Callsign.ViewArea.WidthLng))
{
elv = ElevationData.Database[lat, lon, Properties.Settings.Default.ElevationModel];
ElevationTile t = new ElevationTile();
t.Lat = lat;
t.Lon = lon;
t.Elv = elv;
elvs.Add(t);
if (elv < elvmin)
elvmin = elv;
if (elv > elvmax)
elvmax = elv;
}
else
{
}
lon += stepwidthlon;
}
lat += stepwidthlat;
}
foreach (ElevationTile t in elvs)
{
List<PointLatLng> l = new List<PointLatLng>();
l.Add(new PointLatLng((decimal)t.Lat, (decimal)t.Lon));
l.Add(new PointLatLng((decimal)(t.Lat + stepwidthlat), (decimal)t.Lon));
l.Add(new PointLatLng((decimal)(t.Lat + stepwidthlat), (decimal)(t.Lon + stepwidthlon)));
l.Add(new PointLatLng((decimal)t.Lat, (decimal)(t.Lon + stepwidthlon)));
GMapTextPolygon p = new GMapTextPolygon(l, t.Elv + " m");
Color c = Color.FromArgb(100, ElevationData.Database.GetElevationColor((t.Elv - elvmin) / (elvmax - elvmin) * 10000.0));
p.Stroke = new Pen(c);
p.Fill = new SolidBrush(c);
Font f = new Font("Courier New", 8, GraphicsUnit.Pixel);
bw_Elevationgrid.ReportProgress(1, p);
if (bw_Elevationgrid.CancellationPending)
break;
}
bw_Elevationgrid.ReportProgress(100, "Calculating elevation grid finished.");
}
private void bw_Elevationgrid_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
if (e.ProgressPercentage < 0)
{
tsl_Status.Text = (string)e.UserState;
ss_Main.Refresh();
}
if (e.ProgressPercentage == 0)
{
Elevationgrid.Polygons.Clear();
tsl_Status.Text = (string)e.UserState;
ss_Main.Refresh();
}
else if (e.ProgressPercentage == 1)
{
GMapPolygon p = (GMapPolygon)e.UserState;
Elevationgrid.Polygons.Add(p);
tsl_Status.Text = "Adding elevation tile " + p.Name;
ss_Main.Refresh();
}
else if (e.ProgressPercentage == 100)
{
tsl_Status.Text = (string)e.UserState;
ss_Main.Refresh();
}
}
private void bw_Elevationgrid_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
}
private void cb_Options_StationsMap_OverlayElevation_CheckedChanged(object sender, EventArgs e)
{
ShowElevationGrid();
}
}
public class GMapTextPolygon : GMapPolygon
{
public GMapTextPolygon(List<PointLatLng> points, string name) : base(points, name)
{
}
public override void OnRender(Graphics g)
{
base.OnRender(g);
StringFormat format = new StringFormat();
format.LineAlignment = StringAlignment.Center;
format.Alignment = StringAlignment.Center;
long minx = long.MaxValue;
long maxx = long.MinValue;
long miny = long.MaxValue;
long maxy = long.MinValue;
for (int i = 0; i < this.LocalPoints.Count; i++)
{
if (this.LocalPoints[i].X < minx)
minx = this.LocalPoints[i].X;
if (this.LocalPoints[i].X > maxx)
maxx = this.LocalPoints[i].X;
if (this.LocalPoints[i].Y < miny)
miny = this.LocalPoints[i].Y;
if (this.LocalPoints[i].Y > maxy)
maxy = this.LocalPoints[i].Y;
}
RectangleF f = new RectangleF(minx, miny, maxx - minx, maxy - miny);
g.DrawString(this.Name, SystemFonts.DefaultFont, Brushes.Black, f, format);
}
}
public class ElevationTile
{
public double Lat = 0;
public double Lon = 0;
public double Elv = 0;
}
}

Wyświetl plik

@ -122,4 +122,10 @@
Use the lat/lon textboxes for numeric input or enter a valid Maidenhead Locator.
Drag the needle on the map for exact location. Use mouse wheel or +/- buttons to zoom in and out.</value>
</data>
<metadata name="ss_Main.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
<metadata name="bw_Elevationgrid.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>111, 17</value>
</metadata>
</root>

Wyświetl plik

@ -451,6 +451,7 @@
this.bw_SRTM1_MapUpdater = new System.ComponentModel.BackgroundWorker();
this.bw_GLOBE_MapUpdater = new System.ComponentModel.BackgroundWorker();
this.bw_StationDataUpdater = new System.ComponentModel.BackgroundWorker();
this.btn_DeleteSingleStation = new System.Windows.Forms.Button();
((System.ComponentModel.ISupportInitialize)(this.pb_Donate)).BeginInit();
this.tab_Options_Planes.SuspendLayout();
this.groupBox48.SuspendLayout();
@ -3644,6 +3645,7 @@
//
// groupBox47
//
this.groupBox47.Controls.Add(this.btn_DeleteSingleStation);
this.groupBox47.Controls.Add(this.btn_DeleteAllMapTiles);
this.groupBox47.Controls.Add(this.btn_Options_DeleteAllPropagationPaths);
this.groupBox47.Controls.Add(this.btn_Options_DeleteAllElevationPaths);
@ -5757,6 +5759,18 @@
this.bw_StationDataUpdater.ProgressChanged += new System.ComponentModel.ProgressChangedEventHandler(this.bw_StationDataUpdater_ProgressChanged);
this.bw_StationDataUpdater.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(this.bw_StationDataUpdater_RunWorkerCompleted);
//
// btn_DeleteSingleStation
//
this.btn_DeleteSingleStation.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.btn_DeleteSingleStation.Location = new System.Drawing.Point(165, 48);
this.btn_DeleteSingleStation.Name = "btn_DeleteSingleStation";
this.btn_DeleteSingleStation.Size = new System.Drawing.Size(122, 23);
this.btn_DeleteSingleStation.TabIndex = 3;
this.btn_DeleteSingleStation.Text = "Delete Single Station";
this.tt_Options.SetToolTip(this.btn_DeleteSingleStation, "Deletes all cached map tiles from database");
this.btn_DeleteSingleStation.UseVisualStyleBackColor = true;
this.btn_DeleteSingleStation.Click += new System.EventHandler(this.btn_DeleteSingleStation_Click);
//
// OptionsDlg
//
this.AcceptButton = this.btn_Options_OK;
@ -6329,5 +6343,6 @@
private System.Windows.Forms.Label label105;
private System.Windows.Forms.Label label145;
private System.Windows.Forms.Button btn_Options_Path_Export;
private System.Windows.Forms.Button btn_DeleteSingleStation;
}
}

Wyświetl plik

@ -359,6 +359,12 @@ namespace AirScout
MapData.Database.TileDeleteAll();
}
private void btn_DeleteSingleStation_Click(object sender, EventArgs e)
{
DeleteSingleStationDlg Dlg = new DeleteSingleStationDlg();
Dlg.ShowDialog();
}
private void btn_Options_ScoutBase_Database_Maintenance_Click(object sender, EventArgs e)
{
DatabaseMaintenanceDlg Dlg = new DatabaseMaintenanceDlg(StationData.Database);

Wyświetl plik

@ -32,5 +32,5 @@ using System.Runtime.InteropServices;
// Sie können alle Werte angeben oder die standardmäßigen Build- und Revisionsnummern
// übernehmen, indem Sie "*" eingeben:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.3.3.4")]
[assembly: AssemblyFileVersion("1.3.3.4")]
[assembly: AssemblyVersion("1.3.3.6")]
[assembly: AssemblyFileVersion("1.3.3.6")]

Wyświetl plik

@ -2304,5 +2304,17 @@ Digital data base on the World Wide Web (URL: http://www.ngdc.noaa.gov/mgg/topo/
this["Map_Preloader_MaxZoom"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("False")]
public bool StationsMap_OverlayElevation {
get {
return ((bool)(this["StationsMap_OverlayElevation"]));
}
set {
this["StationsMap_OverlayElevation"] = value;
}
}
}
}

Wyświetl plik

@ -604,5 +604,8 @@ MEaSUREs data and products are available at no charge from the LP DAAC.See https
<Setting Name="Map_Preloader_MaxZoom" Type="System.Decimal" Scope="User">
<Value Profile="(Default)">11</Value>
</Setting>
<Setting Name="StationsMap_OverlayElevation" Type="System.Boolean" Scope="User">
<Value Profile="(Default)">False</Value>
</Setting>
</Settings>
</SettingsFile>

Wyświetl plik

@ -0,0 +1,12 @@
***************** AirScout Requirements **************************
- GreatCircle, distance and locator layer on map (DJ5AR)
- Snooze button for alarm on main window, clickable in PLAY mode ()
- Calculate Doppler
* watch list
- Add/remove call sign from Multi View tab over UDP command
- add stations to watchlist based on DXCC, Loc, QTF range from QTF1 to QTF2

Wyświetl plik

@ -1,4 +1,18 @@
2020-04-25: V1.3.3.4
2021-12-23: V1.3.3.6
====================
- Feature: Elevation grid overlay on "Optionms/Stations/Map" to better understand elevation resolution issues and local situation (for zoom levels >= 17)
- Bugfix: AirScout crashes when opening Crossing History Dialog window --> fixed (tnx PU34HAG)
- Bugfix: Near field suppression did not work correctly, showing strange local obstructions under some circumstances --> fixed
- Bugfix: No more planes visible (Exception messages shown in status bar and log file) with some language settings (at least Turkish) --> fixed (tnx TA2NC)
2020-04-25: V1.3.3.5
====================
- Bugfix: Chunked transport of web content failed while fetching plane feeds (OpenSky, Virtual Radar Server) --> fixed
- Bugfix: Drawing map throws an exception under some circumstances --> fixed, added some error handling (tnx SM7LCB)
2020-04-25: V1.3.3.4
====================
- Bugfix: AirScout always reverts to default call signs (DL2ALF <> GB3MHZ) when area of interest is set outside Europe --> fixed (tnx VK3VG)

Wyświetl plik

@ -603,6 +603,9 @@ MEaSUREs data and products are available at no charge from the LP DAAC.See https
<setting name="Map_Preloader_MaxZoom" serializeAs="String">
<value>11</value>
</setting>
<setting name="StationsMap_OverlayElevation" serializeAs="String">
<value>False</value>
</setting>
</AirScout.Properties.Settings>
</userSettings>
<startup>

Wyświetl plik

@ -657,29 +657,36 @@ namespace GMap.NET.WindowsForms
{
foreach(WindowsFormsImage img in t.Overlays)
{
if(img != null && img.Img != null)
try
{
if(!found)
found = true;
if (img != null && img.Img != null)
{
if (!found)
found = true;
if(!img.IsParent)
{
if (!img.IsParent)
{
#if !PocketPC
g.DrawImage(img.Img, Core.tileRect.X, Core.tileRect.Y, Core.tileRectBearing.Width, Core.tileRectBearing.Height);
g.DrawImage(img.Img, Core.tileRect.X, Core.tileRect.Y, Core.tileRectBearing.Width, Core.tileRectBearing.Height);
#else
g.DrawImage(img.Img, (int) Core.tileRect.X, (int) Core.tileRect.Y);
g.DrawImage(img.Img, (int) Core.tileRect.X, (int) Core.tileRect.Y);
#endif
}
}
#if !PocketPC
else
{
// TODO: move calculations to loader thread
System.Drawing.RectangleF srcRect = new System.Drawing.RectangleF((float)(img.Xoff * (img.Img.Width / img.Ix)), (float)(img.Yoff * (img.Img.Height / img.Ix)), (img.Img.Width / img.Ix), (img.Img.Height / img.Ix));
System.Drawing.Rectangle dst = new System.Drawing.Rectangle((int)Core.tileRect.X, (int)Core.tileRect.Y, (int)Core.tileRect.Width, (int)Core.tileRect.Height);
else
{
// TODO: move calculations to loader thread
System.Drawing.RectangleF srcRect = new System.Drawing.RectangleF((float)(img.Xoff * (img.Img.Width / img.Ix)), (float)(img.Yoff * (img.Img.Height / img.Ix)), (img.Img.Width / img.Ix), (img.Img.Height / img.Ix));
System.Drawing.Rectangle dst = new System.Drawing.Rectangle((int)Core.tileRect.X, (int)Core.tileRect.Y, (int)Core.tileRect.Width, (int)Core.tileRect.Height);
g.DrawImage(img.Img, dst, srcRect.X, srcRect.Y, srcRect.Width, srcRect.Height, GraphicsUnit.Pixel, TileFlipXYAttributes);
}
g.DrawImage(img.Img, dst, srcRect.X, srcRect.Y, srcRect.Width, srcRect.Height, GraphicsUnit.Pixel, TileFlipXYAttributes);
}
#endif
}
}
catch (Exception ex)
{
Console.WriteLine("GMapControl: Error while drwing Image: " + ex.Message);
}
}
}

Wyświetl plik

@ -102,13 +102,13 @@ namespace System.Data.SQLite
if (index < 0)
index = i;
// Console.WriteLine("[" + T.Name + ".FillFromRow] DataColumn not found: " + p.Name);
if (p.PropertyType.Name.ToUpper() == "STRING")
p.SetValue(this, (row[index].GetType().Name != "DBNull") ? row[index] : null, null);
else if ((p.PropertyType.Name.ToUpper() == "FLOAT") || (p.PropertyType.Name.ToUpper() == "DOUBLE"))
p.SetValue(this, (row[index].GetType().Name != "DBNull") ? row[index] : null, null);
else if (p.PropertyType.Name.ToUpper() == "INT32")
p.SetValue(this, (row[index].GetType().Name != "DBNull") ? row[index] : null, null);
else if (p.PropertyType.Name.ToUpper() == "DATETIME")
if (p.PropertyType == typeof(string))
p.SetValue(this, (row[index].GetType() != typeof(DBNull)) ? row[index] : null, null);
else if ((p.PropertyType == typeof(float)) || (p.PropertyType == typeof(double)))
p.SetValue(this, (row[index].GetType() !=typeof(DBNull)) ? row[index] : null, null);
else if (p.PropertyType == typeof(int))
p.SetValue(this, (row[index].GetType() != typeof(DBNull)) ? row[index] : null, null);
else if (p.PropertyType == typeof(DateTime))
{
if ((row[index].GetType() == typeof(int)) || (row[index].GetType() == typeof(long)))
@ -118,7 +118,7 @@ namespace System.Data.SQLite
else
p.SetValue(this, row[index], null);
}
else if (p.PropertyType.BaseType.Name.ToUpper() == "ENUM")
else if (p.PropertyType.BaseType == typeof(Enum))
p.SetValue(this, System.Convert.ToInt32(row[index]), null);
else
p.SetValue(this, ByteArrayToObject((byte[])row[index]), null);
@ -154,13 +154,13 @@ namespace System.Data.SQLite
if (index < 0)
index = i;
// Console.WriteLine("[" + T.Name + ".FillFromRow] DataColumn not found: " + p.Name);
if (p.PropertyType.Name.ToUpper() == "STRING")
p.SetValue(this, (record[index].GetType().Name != "DBNull") ? record[index] : null, null);
else if ((p.PropertyType.Name.ToUpper() == "FLOAT") || (p.PropertyType.Name.ToUpper() == "DOUBLE"))
p.SetValue(this, (record[index].GetType().Name != "DBNull") ? record[index] : null, null);
else if (p.PropertyType.Name.ToUpper() == "INT32")
p.SetValue(this, (record[index].GetType().Name != "DBNull") ? record[index] : null, null);
else if (p.PropertyType.Name.ToUpper() == "DATETIME")
if (p.PropertyType == typeof(string))
p.SetValue(this, (record[index].GetType() != typeof (DBNull)) ? record[index] : null, null);
else if ((p.PropertyType == typeof(float)) || (p.PropertyType == typeof(double)))
p.SetValue(this, (record[index].GetType() != typeof(DBNull)) ? record[index] : null, null);
else if (p.PropertyType == typeof(int))
p.SetValue(this, (record[index].GetType() != typeof(DBNull)) ? record[index] : null, null);
else if (p.PropertyType == typeof(DateTime))
{
if ((record[index].GetType() == typeof(int)) || (record[index].GetType() == typeof(long)))
@ -170,7 +170,7 @@ namespace System.Data.SQLite
else
p.SetValue(this, record[index], null);
}
else if (p.PropertyType.BaseType.Name.ToUpper() == "ENUM")
else if (p.PropertyType.BaseType == typeof(Enum))
p.SetValue(this, System.Convert.ToInt32(record[index]), null);
else
p.SetValue(this, ByteArrayToObject((byte[])record[index]), null);

Wyświetl plik

@ -428,6 +428,18 @@ namespace ScoutBase.Elevation
}
return 0;
}
public Color GetElevationColor(double elv)
{
DEMColorPalette palette = new DEMColorPalette();
double e = (double)(elv) / 100.0;
if (e < 0)
e = 0;
if (e > 100)
e = 100;
return palette.GetColor(e);
}
public Bitmap DrawElevationBitmap(double minlat, double minlon, double maxlat, double maxlon, int width, int height, ELEVATIONMODEL model)
{
int minelv = 0;
@ -1714,7 +1726,7 @@ namespace ScoutBase.Elevation
for (int j = 0; j < bm.Height; j++)
bm.SetPixel(i, j, c);
}
bm.Save("DEMPalette.bmp");
// bm.Save("DEMPalette.bmp");
}
public Color GetColor(double percentage)

Wyświetl plik

@ -162,8 +162,8 @@ namespace ScoutBase.Elevation
/// <returns>The elevation. ElvMissingFlag if not found.</returns>
public short GetElevation (double lat, double lon)
{
int i = (int)((lat - BaseLat) / StepWidthLat);
int j = (int)((lon - BaseLon) / StepWidthLon);
int i = (int)(((lat - BaseLat) / StepWidthLat));
int j = (int)(((lon - BaseLon) / StepWidthLon));
try
{
return Elv[j,i];

Wyświetl plik

@ -470,17 +470,17 @@ namespace ScoutBase.Propagation
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 (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 (eps2 > eps2_min)
eps2_min = eps2;
}
if (caller != null)
{
// abort calculation if cancellation pending

Wyświetl plik

@ -211,8 +211,10 @@ namespace ScoutBase.Stations
public List<LocationDesignator> LocationFindAll(string call)
{
LocationDesignator ld = new LocationDesignator(call);
List<LocationDesignator> l = new List<LocationDesignator>();
if (String.IsNullOrEmpty(call))
return l;
LocationDesignator ld = new LocationDesignator(call);
lock (db.DBCommand)
{
// Loc is empty --> search for last recent location for this call
@ -235,6 +237,8 @@ namespace ScoutBase.Stations
public LocationDesignator LocationFindLastRecent(string call)
{
LocationDesignator ld = new LocationDesignator(call);
if (String.IsNullOrEmpty(call))
return null;
lock (db.DBCommand)
{
// Loc is empty --> search for last recent location for this call
@ -251,6 +255,8 @@ namespace ScoutBase.Stations
public LocationDesignator LocationFindMostHit(string call)
{
LocationDesignator ld = new LocationDesignator(call);
if (String.IsNullOrEmpty(call))
return null;
lock (db.DBCommand)
{
// Loc is empty --> search for last recent location for this call
@ -266,11 +272,15 @@ namespace ScoutBase.Stations
public LocationDesignator LocationFind(string call)
{
if (String.IsNullOrEmpty(call))
return null;
return LocationFindLastRecent(call);
}
public LocationDesignator LocationFind(string call, string loc)
{
if (String.IsNullOrEmpty(call) || String.IsNullOrEmpty(loc))
return null;
LocationDesignator ld = new LocationDesignator(call, loc);
return LocationFind(ld);
}
@ -300,6 +310,8 @@ namespace ScoutBase.Stations
public LocationDesignator LocationFindOrUpdateOrCreate(string call, double lat, double lon)
{
if (String.IsNullOrEmpty(call))
return null;
LocationDesignator ld = new LocationDesignator(call, MaidenheadLocator.LocFromLatLon(lat, lon, false, 3));
// try to find entry with call & loc matching
ld = LocationFind(ld);
@ -326,6 +338,8 @@ namespace ScoutBase.Stations
public LocationDesignator LocationFindOrCreate(string call, string loc)
{
if (String.IsNullOrEmpty(call) || String.IsNullOrEmpty(loc))
return null;
LocationDesignator ld = this.LocationFind(call, loc);
if (ld == null)
{
@ -539,6 +553,18 @@ namespace ScoutBase.Stations
}
public List<LocationDesignator> LocationGetAll(string call)
{
List<LocationDesignator> l = new List<LocationDesignator>();
DataTable Result = db.Select("SELECT * FROM " + LocationDesignator.TableName + " WHERE CALL LIKE '" + call + "' ORDER BY Call ASC");
if ((Result == null) || (Result.Rows.Count == 0))
return l;
foreach (DataRow row in Result.Rows)
l.Add(new LocationDesignator(row));
return l;
}
public List<LocationDesignator> LocationGetAll(BackgroundWorker caller)
{
// gets all locations from database