From 6fa8277f347349622fbd3eb311e7da4ffda018b5 Mon Sep 17 00:00:00 2001 From: dl2alf Date: Thu, 23 Dec 2021 16:18:53 +0100 Subject: [PATCH] V1.3.3.6 --- .../Properties/AssemblyInfo.cs | 4 +- AirScout.PlaneFeeds.Plugin.OpenSky/TLS.cs | 138 ++++++++++---- .../Properties/AssemblyInfo.cs | 4 +- .../TLS.cs | 138 ++++++++++---- .../VirtualRadarServer.cs | 4 +- AirScout.sln | 4 +- AirScout/AirScout.csproj | 10 ++ AirScout/CrossingHistoryDlg.Designer.cs | 90 +++++----- AirScout/DeleteSingleStationDlg.Designer.cs | 140 +++++++++++++++ AirScout/DeleteSingleStationDlg.cs | 71 ++++++++ AirScout/DeleteSingleStationDlg.resx | 124 +++++++++++++ AirScout/MapStationDlg.Designer.cs | 99 ++++++++-- AirScout/MapStationDlg.cs | 170 +++++++++++++++++- AirScout/MapStationDlg.resx | 6 + AirScout/OptionsDlg.Designer.cs | 15 ++ AirScout/OptionsDlg.cs | 6 + AirScout/Properties/AssemblyInfo.cs | 4 +- AirScout/Properties/Settings.Designer.cs | 12 ++ AirScout/Properties/Settings.settings | 3 + AirScout/Requirements.txt | 12 ++ AirScout/VersionHistory.txt | 16 +- AirScout/app.config | 3 + .../GMap.NET.WindowsForms/GMapControl.cs | 37 ++-- SQLiteDatabase/SQLiteDatabase/SQLiteEntry.cs | 32 ++-- .../ScoutBase.Elevation/ElevationDatabase.cs | 14 +- .../ScoutBase.Elevation/ElevationTile.cs | 4 +- .../PropagationDatabase.cs | 16 +- .../ScoutBase.Stations/StationDatabase.cs | 28 ++- 28 files changed, 1014 insertions(+), 190 deletions(-) create mode 100644 AirScout/DeleteSingleStationDlg.Designer.cs create mode 100644 AirScout/DeleteSingleStationDlg.cs create mode 100644 AirScout/DeleteSingleStationDlg.resx create mode 100644 AirScout/Requirements.txt diff --git a/AirScout.PlaneFeeds.Plugin.OpenSky/Properties/AssemblyInfo.cs b/AirScout.PlaneFeeds.Plugin.OpenSky/Properties/AssemblyInfo.cs index b85de67..0b00288 100644 --- a/AirScout.PlaneFeeds.Plugin.OpenSky/Properties/AssemblyInfo.cs +++ b/AirScout.PlaneFeeds.Plugin.OpenSky/Properties/AssemblyInfo.cs @@ -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")] diff --git a/AirScout.PlaneFeeds.Plugin.OpenSky/TLS.cs b/AirScout.PlaneFeeds.Plugin.OpenSky/TLS.cs index 240b510..71d6a93 100644 --- a/AirScout.PlaneFeeds.Plugin.OpenSky/TLS.cs +++ b/AirScout.PlaneFeeds.Plugin.OpenSky/TLS.cs @@ -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(); } diff --git a/AirScout.PlaneFeeds.Plugin.VirtualRadarServer/Properties/AssemblyInfo.cs b/AirScout.PlaneFeeds.Plugin.VirtualRadarServer/Properties/AssemblyInfo.cs index 2166a63..75276f8 100644 --- a/AirScout.PlaneFeeds.Plugin.VirtualRadarServer/Properties/AssemblyInfo.cs +++ b/AirScout.PlaneFeeds.Plugin.VirtualRadarServer/Properties/AssemblyInfo.cs @@ -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")] diff --git a/AirScout.PlaneFeeds.Plugin.VirtualRadarServer/TLS.cs b/AirScout.PlaneFeeds.Plugin.VirtualRadarServer/TLS.cs index 3881267..b3bf035 100644 --- a/AirScout.PlaneFeeds.Plugin.VirtualRadarServer/TLS.cs +++ b/AirScout.PlaneFeeds.Plugin.VirtualRadarServer/TLS.cs @@ -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(); } diff --git a/AirScout.PlaneFeeds.Plugin.VirtualRadarServer/VirtualRadarServer.cs b/AirScout.PlaneFeeds.Plugin.VirtualRadarServer/VirtualRadarServer.cs index e2916dd..afeaffc 100644 --- a/AirScout.PlaneFeeds.Plugin.VirtualRadarServer/VirtualRadarServer.cs +++ b/AirScout.PlaneFeeds.Plugin.VirtualRadarServer/VirtualRadarServer.cs @@ -368,7 +368,6 @@ namespace AirScout.PlaneFeeds.Plugin.VirtualRadarServer Console.WriteLine("[" + this.GetType().Name + "]: Analyzing data"); // JavaScriptSerializer js = new JavaScriptSerializer(); // dynamic root = js.Deserialize(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; diff --git a/AirScout.sln b/AirScout.sln index 984aec5..94678e8 100644 --- a/AirScout.sln +++ b/AirScout.sln @@ -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 diff --git a/AirScout/AirScout.csproj b/AirScout/AirScout.csproj index 931e65c..b2adca3 100644 --- a/AirScout/AirScout.csproj +++ b/AirScout/AirScout.csproj @@ -136,6 +136,12 @@ + + Form + + + DeleteSingleStationDlg.cs + Form @@ -314,6 +320,7 @@ + Always @@ -329,6 +336,9 @@ DatabaseMaintenanceDlg.cs + + DeleteSingleStationDlg.cs + ElevationCopyrightDlg.cs diff --git a/AirScout/CrossingHistoryDlg.Designer.cs b/AirScout/CrossingHistoryDlg.Designer.cs index e85bdd9..3e7bf84 100644 --- a/AirScout/CrossingHistoryDlg.Designer.cs +++ b/AirScout/CrossingHistoryDlg.Designer.cs @@ -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(); diff --git a/AirScout/DeleteSingleStationDlg.Designer.cs b/AirScout/DeleteSingleStationDlg.Designer.cs new file mode 100644 index 0000000..9f71800 --- /dev/null +++ b/AirScout/DeleteSingleStationDlg.Designer.cs @@ -0,0 +1,140 @@ +namespace AirScout +{ + partial class DeleteSingleStationDlg + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + 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; + } +} \ No newline at end of file diff --git a/AirScout/DeleteSingleStationDlg.cs b/AirScout/DeleteSingleStationDlg.cs new file mode 100644 index 0000000..425f14e --- /dev/null +++ b/AirScout/DeleteSingleStationDlg.cs @@ -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 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); + } + } + } + } + } +} diff --git a/AirScout/DeleteSingleStationDlg.resx b/AirScout/DeleteSingleStationDlg.resx new file mode 100644 index 0000000..3b49f55 --- /dev/null +++ b/AirScout/DeleteSingleStationDlg.resx @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 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. + + \ No newline at end of file diff --git a/AirScout/MapStationDlg.Designer.cs b/AirScout/MapStationDlg.Designer.cs index be4241c..1b9c7b1 100644 --- a/AirScout/MapStationDlg.Designer.cs +++ b/AirScout/MapStationDlg.Designer.cs @@ -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; } } \ No newline at end of file diff --git a/AirScout/MapStationDlg.cs b/AirScout/MapStationDlg.cs index 4d64b29..a5b837a 100644 --- a/AirScout/MapStationDlg.cs +++ b/AirScout/MapStationDlg.cs @@ -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 elvs = new List(); + 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 l = new List(); + 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 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; + } + + } diff --git a/AirScout/MapStationDlg.resx b/AirScout/MapStationDlg.resx index 55bd07d..6dc16e2 100644 --- a/AirScout/MapStationDlg.resx +++ b/AirScout/MapStationDlg.resx @@ -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. + + 17, 17 + + + 111, 17 + \ No newline at end of file diff --git a/AirScout/OptionsDlg.Designer.cs b/AirScout/OptionsDlg.Designer.cs index 5c23f23..853bf2f 100644 --- a/AirScout/OptionsDlg.Designer.cs +++ b/AirScout/OptionsDlg.Designer.cs @@ -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; } } \ No newline at end of file diff --git a/AirScout/OptionsDlg.cs b/AirScout/OptionsDlg.cs index 2dbdafb..c4ff8bf 100644 --- a/AirScout/OptionsDlg.cs +++ b/AirScout/OptionsDlg.cs @@ -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); diff --git a/AirScout/Properties/AssemblyInfo.cs b/AirScout/Properties/AssemblyInfo.cs index 5913caf..5ca38fb 100644 --- a/AirScout/Properties/AssemblyInfo.cs +++ b/AirScout/Properties/AssemblyInfo.cs @@ -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")] diff --git a/AirScout/Properties/Settings.Designer.cs b/AirScout/Properties/Settings.Designer.cs index 0215e6a..552b659 100644 --- a/AirScout/Properties/Settings.Designer.cs +++ b/AirScout/Properties/Settings.Designer.cs @@ -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; + } + } } } diff --git a/AirScout/Properties/Settings.settings b/AirScout/Properties/Settings.settings index 6f73e24..39add42 100644 --- a/AirScout/Properties/Settings.settings +++ b/AirScout/Properties/Settings.settings @@ -604,5 +604,8 @@ MEaSUREs data and products are available at no charge from the LP DAAC.See https 11 + + False + \ No newline at end of file diff --git a/AirScout/Requirements.txt b/AirScout/Requirements.txt new file mode 100644 index 0000000..bfcac3b --- /dev/null +++ b/AirScout/Requirements.txt @@ -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 + + + diff --git a/AirScout/VersionHistory.txt b/AirScout/VersionHistory.txt index 3322cf8..de2b5a3 100644 --- a/AirScout/VersionHistory.txt +++ b/AirScout/VersionHistory.txt @@ -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) diff --git a/AirScout/app.config b/AirScout/app.config index 0cd43f1..e6d5b26 100644 --- a/AirScout/app.config +++ b/AirScout/app.config @@ -603,6 +603,9 @@ MEaSUREs data and products are available at no charge from the LP DAAC.See https 11 + + False + diff --git a/GreatMaps/GMap.NET.WindowsForms/GMap.NET.WindowsForms/GMapControl.cs b/GreatMaps/GMap.NET.WindowsForms/GMap.NET.WindowsForms/GMapControl.cs index 2b3e71f..a862b73 100644 --- a/GreatMaps/GMap.NET.WindowsForms/GMap.NET.WindowsForms/GMapControl.cs +++ b/GreatMaps/GMap.NET.WindowsForms/GMap.NET.WindowsForms/GMapControl.cs @@ -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); } } } diff --git a/SQLiteDatabase/SQLiteDatabase/SQLiteEntry.cs b/SQLiteDatabase/SQLiteDatabase/SQLiteEntry.cs index 17d5975..cb4e42b 100644 --- a/SQLiteDatabase/SQLiteDatabase/SQLiteEntry.cs +++ b/SQLiteDatabase/SQLiteDatabase/SQLiteEntry.cs @@ -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); diff --git a/ScoutBase/ScoutBase.Elevation/ElevationDatabase.cs b/ScoutBase/ScoutBase.Elevation/ElevationDatabase.cs index d7b7742..e376005 100644 --- a/ScoutBase/ScoutBase.Elevation/ElevationDatabase.cs +++ b/ScoutBase/ScoutBase.Elevation/ElevationDatabase.cs @@ -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) diff --git a/ScoutBase/ScoutBase.Elevation/ElevationTile.cs b/ScoutBase/ScoutBase.Elevation/ElevationTile.cs index e647757..4376c05 100644 --- a/ScoutBase/ScoutBase.Elevation/ElevationTile.cs +++ b/ScoutBase/ScoutBase.Elevation/ElevationTile.cs @@ -162,8 +162,8 @@ namespace ScoutBase.Elevation /// The elevation. ElvMissingFlag if not found. 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]; diff --git a/ScoutBase/ScoutBase.Propagation/PropagationDatabase.cs b/ScoutBase/ScoutBase.Propagation/PropagationDatabase.cs index fe75075..305b3d2 100644 --- a/ScoutBase/ScoutBase.Propagation/PropagationDatabase.cs +++ b/ScoutBase/ScoutBase.Propagation/PropagationDatabase.cs @@ -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 diff --git a/ScoutBase/ScoutBase.Stations/StationDatabase.cs b/ScoutBase/ScoutBase.Stations/StationDatabase.cs index 1850bfc..e6660d7 100644 --- a/ScoutBase/ScoutBase.Stations/StationDatabase.cs +++ b/ScoutBase/ScoutBase.Stations/StationDatabase.cs @@ -211,8 +211,10 @@ namespace ScoutBase.Stations public List LocationFindAll(string call) { - LocationDesignator ld = new LocationDesignator(call); List l = new List(); + 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 LocationGetAll(string call) + { + List l = new List(); + 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 LocationGetAll(BackgroundWorker caller) { // gets all locations from database