diff --git a/.gitignore b/.gitignore index 0f0f603..6326f45 100644 --- a/.gitignore +++ b/.gitignore @@ -243,4 +243,5 @@ paket-files/ # JetBrains Rider .idea/ *.sln.iml -Todo.txt \ No newline at end of file +Todo.txt +Thumbs.db \ No newline at end of file diff --git a/AudioRecordings/MCB_Radio_NL_20190922_102658Z_747000Hz.mp3 b/AudioRecordings/MCB_Radio_NL_20190922_102658Z_747000Hz.mp3 new file mode 100644 index 0000000..6d6f327 Binary files /dev/null and b/AudioRecordings/MCB_Radio_NL_20190922_102658Z_747000Hz.mp3 differ diff --git a/Docs/ASCII G Protocol.md b/Docs/ASCII G Protocol.md new file mode 100644 index 0000000..5457bb6 --- /dev/null +++ b/Docs/ASCII G Protocol.md @@ -0,0 +1,29 @@ +RDS data is provided by the RDS encoder in ASCII representation in this format: +```"G:"+#13+#10+"AAAABBBBCCCCDDDD"+#13+#10+#13+#10``` +where +AAAA is PI, +BBBB is block 2, +CCCC is block 3, +DDDD is block 4 of the RDS group. + +lets decipher this a bit +#13 is ASCII character for CR (Clear Line (\r)) +#10 is ASCII character for LF (Line Feed (\n)) + +so in human readable format this would look like: +``` +G: +AAAABBBBCCCCDDDD + + +``` +or in computer form +```G:CRLFAAAABBBBCCCCDDDDCRLF``` + +in C# you would write it +```csharp +Console.WriteLine("G:"); +Console.WriteLine("AAAABBBBCCCCDDDD"); +Console.WriteLine(); +Console.WriteLine(); +``` diff --git a/SDRSharp.XDR/Protocol.cs b/Docs/XDR-Protocol.cs similarity index 100% rename from SDRSharp.XDR/Protocol.cs rename to Docs/XDR-Protocol.cs diff --git a/Recievers-I-Use.txt b/Recievers-I-Use.txt new file mode 100644 index 0000000..53cc1f4 --- /dev/null +++ b/Recievers-I-Use.txt @@ -0,0 +1,3 @@ +sdr://188.25.106.73:5555/ - Romania - Stations from Romania and Bulgaria receivable on 100.5 Rock FM in IBOC, It can also be seen in the README +sdr://212.139.208.227:5555/ - UK (Kent) - Stations from UK and France stations receivable +sdr://212.187.114.164:5556/ - UK (someLW and MW only) --- 747khz MCB Radio from The Netherlands is good choice for listening at daytime :) \ No newline at end of file diff --git a/SDRSharp.XDR/AdvancedRDSWindow.Designer.cs b/SDRSharp.XDR/AdvancedRDSWindow.Designer.cs index 32456aa..3695ad6 100644 --- a/SDRSharp.XDR/AdvancedRDSWindow.Designer.cs +++ b/SDRSharp.XDR/AdvancedRDSWindow.Designer.cs @@ -16,6 +16,7 @@ protected override void Dispose(bool disposing) if (disposing && (components != null)) { components.Dispose(); + toolTip1.Dispose(); } base.Dispose(disposing); } @@ -28,12 +29,112 @@ protected override void Dispose(bool disposing) /// private void InitializeComponent() { - this.components = new System.ComponentModel.Container(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(AdvancedRDSWindow)); + this.ipLabel = new System.Windows.Forms.Label(); + this.PortLabel = new System.Windows.Forms.Label(); + this.textBox1 = new System.Windows.Forms.TextBox(); + this.textBox2 = new System.Windows.Forms.TextBox(); + this.rdsspy = new System.Windows.Forms.RadioButton(); + this.internalrds = new System.Windows.Forms.RadioButton(); + this.UDPListen = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // ipLabel + // + this.ipLabel.AutoSize = true; + this.ipLabel.Location = new System.Drawing.Point(12, 43); + this.ipLabel.Name = "ipLabel"; + this.ipLabel.Size = new System.Drawing.Size(23, 13); + this.ipLabel.TabIndex = 0; + this.ipLabel.Text = "IP: "; + // + // PortLabel + // + this.PortLabel.AutoSize = true; + this.PortLabel.Location = new System.Drawing.Point(147, 43); + this.PortLabel.Name = "PortLabel"; + this.PortLabel.Size = new System.Drawing.Size(32, 13); + this.PortLabel.TabIndex = 1; + this.PortLabel.Text = "Port: "; + // + // textBox1 + // + this.textBox1.Location = new System.Drawing.Point(41, 40); + this.textBox1.Name = "textBox1"; + this.textBox1.Size = new System.Drawing.Size(100, 20); + this.textBox1.TabIndex = 2; + this.textBox1.Text = "localhost"; + // + // textBox2 + // + this.textBox2.Location = new System.Drawing.Point(180, 40); + this.textBox2.Name = "textBox2"; + this.textBox2.Size = new System.Drawing.Size(100, 20); + this.textBox2.TabIndex = 2; + this.textBox2.Text = "8888"; + // + // rdsspy + // + this.rdsspy.AutoSize = true; + this.rdsspy.Location = new System.Drawing.Point(12, 12); + this.rdsspy.Name = "rdsspy"; + this.rdsspy.Size = new System.Drawing.Size(133, 17); + this.rdsspy.TabIndex = 3; + this.rdsspy.TabStop = true; + this.rdsspy.Text = "External RDS Decoder"; + this.rdsspy.UseVisualStyleBackColor = true; + this.rdsspy.CheckedChanged += new System.EventHandler(this.rdsspy_CheckedChanged); + // + // internalrds + // + this.internalrds.AutoSize = true; + this.internalrds.Location = new System.Drawing.Point(150, 12); + this.internalrds.Name = "internalrds"; + this.internalrds.Size = new System.Drawing.Size(130, 17); + this.internalrds.TabIndex = 4; + this.internalrds.TabStop = true; + this.internalrds.Text = "Internal RDS Decoder"; + this.internalrds.UseVisualStyleBackColor = true; + this.internalrds.CheckedChanged += new System.EventHandler(this.internalrds_CheckedChanged); + // + // UDPListen + // + this.UDPListen.Location = new System.Drawing.Point(12, 66); + this.UDPListen.Name = "UDPListen"; + this.UDPListen.Size = new System.Drawing.Size(268, 23); + this.UDPListen.TabIndex = 5; + this.UDPListen.Text = "Listen für RDS "; + this.UDPListen.UseVisualStyleBackColor = true; + this.UDPListen.Click += new System.EventHandler(this.UDPListen_Click); + // + // AdvancedRDSWindow + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(800, 450); + this.ClientSize = new System.Drawing.Size(289, 200); + this.Controls.Add(this.UDPListen); + this.Controls.Add(this.internalrds); + this.Controls.Add(this.rdsspy); + this.Controls.Add(this.textBox2); + this.Controls.Add(this.textBox1); + this.Controls.Add(this.PortLabel); + this.Controls.Add(this.ipLabel); + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.Name = "AdvancedRDSWindow"; this.Text = "AdvancedRDSWindow"; + this.ResumeLayout(false); + this.PerformLayout(); + } #endregion + + private System.Windows.Forms.Label ipLabel; + private System.Windows.Forms.Label PortLabel; + private System.Windows.Forms.TextBox textBox1; + private System.Windows.Forms.TextBox textBox2; + private System.Windows.Forms.RadioButton rdsspy; + private System.Windows.Forms.RadioButton internalrds; + private System.Windows.Forms.Button UDPListen; } } \ No newline at end of file diff --git a/SDRSharp.XDR/AdvancedRDSWindow.cs b/SDRSharp.XDR/AdvancedRDSWindow.cs index 1040a49..6f9df79 100644 --- a/SDRSharp.XDR/AdvancedRDSWindow.cs +++ b/SDRSharp.XDR/AdvancedRDSWindow.cs @@ -7,14 +7,67 @@ using System.Text; using System.Threading.Tasks; using System.Windows.Forms; +using System.Threading; +using SDRSharp.XDR.Tools; namespace SDRSharp.XDR { public partial class AdvancedRDSWindow : Form { - public AdvancedRDSWindow() + private static AdvancedRDSWindow form2; + ToolTip toolTip1 = new CustomToolTip(); + private AdvancedRDSWindow() { InitializeComponent(); } + + public static AdvancedRDSWindow Instance + { + //singleton design pattern to return always the same instance of a form + get + { + if (form2 == null || form2.IsDisposed) + { + form2 = new AdvancedRDSWindow(); + form2.Text = "Advanced RDS Settings"; + form2.NonClientMouseHover += form2.TitleHoveredEvent; //Hook into TitleHover event + if (!XDRPlugin.ExternalRDS) + form2.internalrds.Checked = true; + else + form2.rdsspy.Checked = true; + } + return form2; + + } + } + private void TitleHoveredEvent(object sender, EventArgs e) + { + toolTip1.Show("You found the easter egg", this, 0, -100, 10000); //I have to write something as text otherwise tooltip won't appear + } + private void rdsspy_CheckedChanged(object sender, EventArgs e) + { + //Enable adress,port control if we are using External RDS Source + UDPListen.Enabled = true; + textBox1.Enabled = true; + textBox2.Enabled = true; + XDRPlugin.ExternalRDS = true; + } + private void internalrds_CheckedChanged(object sender, EventArgs e) + { + //Disable adress,port control if we are using Internal RDS Source + UDPListen.Enabled = false; + textBox1.Enabled = false; + textBox2.Enabled = false; + XDRPlugin.ExternalRDS = false; + } + + + private void UDPListen_Click(object sender, EventArgs e) + { + UDPServer.listenPort = Convert.ToInt32(textBox2.Text); + Thread RecieveUDP = new Thread(UDPServer.Serve); + RecieveUDP.Start(); + RecieveUDP.IsBackground = true; //if this is not true we won't be able to close the SDR# because this will keep running and we don't want that + } } } diff --git a/SDRSharp.XDR/AdvancedRDSWindow.resx b/SDRSharp.XDR/AdvancedRDSWindow.resx new file mode 100644 index 0000000..9296fc4 --- /dev/null +++ b/SDRSharp.XDR/AdvancedRDSWindow.resx @@ -0,0 +1,984 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + + AAABAAUAEBAAAAEAIABoBAAAVgAAABgYAAABACAAiAkAAL4EAAAgIAAAAQAgAKgQAABGDgAAMDAAAAEA + IACoJQAA7h4AAAAAAAABACAAoYQAAJZEAAAoAAAAEAAAACAAAAABACAAAAAAAAAEAAATCwAAEwsAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAvKypAP///wBIPz4MFRISHhIPDx41LS0N/+/pAP///wBBOTgNHBgYIBIQ + EB40LSwL////AIh5dwAAAAAAPjY1AE5EQwwlIB9pDgwMwgMDA+ADAgLgCQgIwhYTE20TEBBrCggIwgQE + BOEDAgLfCAcHvhIQD2IqJCMLIBwcAEM6OgwTERGSBAQD+gAAAP8BAQH7AQEB+wAAAP8CAgL8AgIC/AAA + AP8BAAD6AQEB+wAAAP8CAgL5EA4OkUc+PQ0XFBRwAwMD+AEBAfsODAy/FRISihUSEokODAy5AgIC+gAA + AP8IBwfWFBERiBUSEooNCwu+AgEB/AMDA/gYFRVyBwYG0wAAAP8LCgq9LScmeikjI30mISB7LigoexAO + DrgAAAD/CAcH4CUgH4UkHx55KSQjeBEPDsAAAAD/CQgI1gMDA/sBAQH+EQ8PzxYTE8MvKChgMCkpViUg + IHsYFRWIAQEB+AUFBfUpJCNlKCMiWxIPD78PDQ3NAQEB/QMDA/wTEBDLEA4OwAQEBO8CAgL8FxQUeR0Z + GG0XFBSJHBgYfQICAu0DAwP6HBkYcRoWFngDAgL8BAMD8BIQEMMUERHOIh0dgCMeHnUPDQ29AAAA/wIC + AvoDAgL8EQ8OsiwmJXkNCwvDAAAA/wMCAvoDAgL6AAAA/wwKCrslICB3IRwcgCAbG1UkHx59KiUkhA8N + Db8CAgLqAgEB6w8NDcInIiF/Ix4egQ4MDMMCAgLrAwIC6xAODcAsJiWFLicngyYhIVgoIyMNKCIiZjIr + K4ctJyd+HBgYexkWFXkpJCOGIx8eoSciIoMoIyJ6GBQUeRkWFXonIiF6LScmgzMsK21DOjkQNC0tADcw + Lw0qJCROIh0dciAcHHgkHx96NS0tfTQtLF02Ly5bMCkpeyIdHXkhHRx5LCYmeDIrK1I+NjUOMSoqAAAA + AAAuJycAPzU2ASQfHw0XFBQdHxsbH0pAQBJvYF8BjHt5AVdLShMnIiEgIh0dH0xCQRCHdXQBcWJhAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAP//AAD//wAA4YcAAIABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAB + AADAAwAA//8AAP//AAAoAAAAGAAAADAAAAABACAAAAAAAAAJAAATCwAAEwsAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC9p6QA99zYAl1RTx8qJSRVEhAQewQDA4QQDQ19HhoaVj01 + NB+3oJ0Bo4yNATEqKh0nISFZGRYWggMDA4QRDg56HhoaUTQtLBngxcABf29sAAAAAAAAAAAA////AFlN + TABqXFsPMisqdxQREdsFBAT7AQEB/wAAAP8BAQH/AwMD+wwKCtofGhp8GxcXeQkICNcDAwP7AQEB/wAA + AP8BAQH/AwMD+goJCNIZFhVrOzQzDCslJQD///8ANS4tAEg/PhIcGBifBgUF/AAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8DAgL9AgIC/QAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8DAgL6ExERm01D + QhM9NTQAlYKBBh0ZGYwDAgL9AAAA/wAAAP8CAgL8BgUF4AYFBckGBQXcAgIC+gAAAP8AAAD/AAAA/wAA + AP8CAQH5BQQE2wUFBMgGBQXfAgEB+wAAAP8AAAD/AwMC/h0aGY+SgH4GKCIiSgcGBu0AAAD/AAAA/wcG + BuggHBuFJiEgZh4aGmolICBnIBsbfAsJCeIAAAD/AAAA/wEBAf8WExOnIh0dYx4aGWolICBmHhoagwkH + B+gAAAD/AAAA/wcGBu4rJSVNDw0NqQEAAP8AAAD/AwIC8B8bG24qJCSIJSAfgCAcG2wiHR17KCMijTIs + K28HBgbrAAAA/wAAAP8MCwvXJSAgfiMfHm4gHBt9JB8fhC4oJ3UHBgbzAAAA/wEBAf8UERGvCAcH5wAA + AP8AAAD/ExAQsygjIoQwKimDMCopiikjI5AqJCSMNS4tdSUgH30UERGeAAAA/wAAAP8HBgbqKSMjoCQf + H4wlIB+DJB8feygiIoUYFBS1AAAA/wAAAP8JCAjrAwMD/gAAAP8BAQH/FBER3AkICO0TEBDZLScmbfPS + zwQtJydeIh4ddh0ZGYQbGBd3AgEB/gAAAP8GBQX7MSsqZf/o5AMpJCNpDw0N1QgHB+sPDQ3XAQEB/wAA + AP8DAwP+Eg8P4wgHB+oRDw/SBAMD9wAAAP8DAwP+JB8fcf///wIsJiViFhMSiBoXFnwgHBxvAgIC+QAA + AP8FBQT7MCkpYv///wIqJCRwBAMD/gAAAP8EAwP4ExEQ1QoJCOwSDw/lIRwcoCIdHYQjHx5uCQgI1wAA + AP8AAAD/CAcH6xQREbkKCQnqEQ4OriQfHnkmISFoBgUF4QAAAP8AAAD/CgkJ5xQREbkJCAjrAAAA/wAA + AP8HBgbXKCIicSYhIIgjHh2hHRkZjiUgIGgeGhqCIR0cjAMDAv4AAAD/AAAA/wAAAP8AAAD/CQgI3zAp + KWstJiaGGxcXlwICAv8AAAD/AAAA/wAAAP8AAAD/AAAA/wICAv0XFBSIIR0chCIdHWYaFhaNIRwcSB4a + GYMiHR18MSoqdhsXF6AEAwP3AAAA/wAAAP8AAAD/BAMD+iEdHIgoIiKFKyUlbBQSEqgEAwP6AAAA/wAA + AP8AAAD/BQQE+BoWFqA1Li53MSophiMeHoUlICBLVkpKBSAcG3gqJSR1LygojS8pKX4sJiV0DQsLmwQE + BK0MCgqeJB8fex0ZGLcmISBtIx4eiiwmJXcrJSR4Dw0NoAUEBK0RDw+fLScndi4oJ30tJyeNMywsei4n + J4J1ZmYHKSMjADEqKhIlICCHNzAvhjMsK3goIiKNJSAffxoXFnEgGxt7KCMjjS0nJ4QgHBy+JyIieykk + JHYiHR2JHRkYeRgVFXAdGRl6IR0ciSYhIHEwKimAMCopkFdLShdJPz4A////AEA3NwBNQkIPKiQkZyMe + HpEiHR13JiEgbigjIm8oIiJvMywsfzQtLJsyKyp4MisreDApKZkmISF4IBwcayYhIW4iHR1sKCMjeygi + IpQyKyttTURDDzYuLQD///8AAAAAAAAAAAA6MzIAVUpIACokJBofGxpNGhcXahMREHAiHR1wPjU1X01D + QiaLfHoCwqypA1tPTilEOzlhKiQjdBIQEHAlICBwPDQzWVJHRiK7paQBjn18AAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAA////AP///wD///8A////AOAABwDAAAMAgAABAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAEAwAADAPAABwD///8A////AP///wD///8AKAAAACAA + AABAAAAAAQAgAAAAAAAAEAAAEwsAABMLAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPLu7gD///8Ahnd1CUE3NxoSDw8iDQsLIjoy + MhxjV1YK////ANzR0AAAAAAAAAAAANHCwgD///8Ajnx6DVhMSyEMCwsiEQ8PIjw0MxpqXVwI////AOji + 4QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALyjogDpzMsDbmBeMjUuLX8ZFRW8CwoK2gMD + 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 + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////// + //////////////4H4H/wAAAP4AAAB8AAAAOAAAABgAAAAQAAAAAAAAAAAAAAAAAAAAAAYAYAAGAGAAAA + AAAAAAAAAAAAAAAAAACAAAABgAAAAcAAAAPgAAAH8AAAD/4DwD///////////////////////////ygA + AAAwAAAAYAAAAAEAIAAAAAAAACQAABMLAAATCwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////AMOv + rQdpWloVPzU1IwoJCCQFBAQkNS0tJGFTUxiOfn4G////APfy8gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAD59PQAAAAAAMqwrg6RfXwjNi4uJAUFBSQKCAgkPTU0I2JUUxSmk5IFAAAAAP///wAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AAAAAANW/ + vQx6amc8RDs6fCciIbMUERHRDAoK4wICAuQBAQHkCgkJ5BIPD9YZFhWyNCwsgU5DQjugjowMAAAAAP// + /wD///8AaVxbAI99fAlFPDs3KiQkeiciIr0gHBvkCgkJ5AEBAeQCAgLkCwoK4xIPD9AcGBirMisqclBF + RC96amoEZlhYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL+m + pADjxsQGfGtqTEQ7ObgZFhXxBgUF/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/BAMD/w0M + C+8qJCS3Rz49S66YlwiaiocGQTg3RiAbG6wNCwvuAwIC/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/BQQE/g4MDOYgHBucUUdEO6yWkwKAcG0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAD///8AhnNwAKSOjBxPRUSVGRYV8QICAv8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8BAQH/DQsL8jIrK6ItJyabDAoK8AEBAf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8CAgL/Dw0M6CciIXxjVlURNiwsAP///wAAAAAAAAAAAAAA + AAAAAAAAAAAAAPPk5AAJAwIAfGxqKS4oJ7YJCAj/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wMCAv8DAgL/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wUEBPweGhmsTEJBIAAA + AADt4uEAAAAAAAAAAAAAAAAA6MrHADQtLABZTUwgJiEhwgQDA/8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8CAQH/Ix4ewnNkYylaTk0AzbO0AAAAAAAAAAAAgnBvAJeDgRcqJSSxAgIC/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + 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 + FKUTEBDLFBER3Q8NDd4ODAzeFBER3xsYGNgwKinGVElImm1eXUW3oaANTzMyAP///wD///8A////Acy2 + tBJ+bWtNUUZFljszMtAoIyLlFBER3g4MDN4ODAzeFhMT3yEdHNkxKim8WEtLjHdnZjrPtbQJtJmXAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAD///8AGxASAJaDggNYTU0QRTs6IgwKCiQFBAQkPjU1JHNkYxnNtbUM////Av719QAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAD/+fcA////AeHFwBSfiockPjU1JAUEBCQKCQkkTUNCJJB9exrUv70I////Af// + /wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAD///////8AAP///////wAA////////AAD///////8AAP///////wAA//////// + AAD///////8AAP///////wAA/+Af+Af/AAD/AAPAAP8AAPwAAAAAPwAA+AAAAAAfAADwAAAAAA8AAOAA + AAAABwAAwAAAAAADAACAAAAAAAEAAIAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAADAADAAAAAAAeAAeAAAAAAB4AB4AAAAAADAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAQAAgAAAAAABAADAAAAAAAMAAOAAAAAABwAA8AAAAAAP + AAD4AAAAAB8AAPwAAAAAPwAA/wADgAD/AAD/4A/wA/8AAP///////wAA////////AAD///////8AAP// + /////wAA////////AAD///////8AAP///////wAA////////AACJUE5HDQoaCgAAAA1JSERSAAABAAAA + AQAIBgAAAFxyqGYAAIAASURBVHja7Z1ndBPH97DvqhfbsixLluTee7dxAduAwfTeQ6ghEFqAkEASEiAJ + ISEkhITQe++9u+JucO+9917lIkua9wPJ/w1Ykm2aTX77nHMPB2v3zszdndkpd+4A4ODg4ODg4ODg4ODg + 4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg + 4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg + 4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODgvLdgA52B + wUh8Qq15XnERrb6yEsrKCqGsrBDKyyugoiIDOjslUFtbBm1tbT3uYzAYoKWlA0wmC4RCIQgERqCrawA8 + oS7weNpgpGcAHG2e1FgbSxvoMg4kIdliIksmsyYSiRiZTAISCYBCBiCIAerqmqCwrADKy8qhpqIQSkuL + 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 + lxRlU5KTn1kWFWbrZGUmQ2VFGdTWVoL4PQhIQqMxQFNTC7hcXbCwtAZ1ruCJt/vobgMD/SuFZfln580c + Jv77KLZBA0IIu/komXL+1H4YN3r2l+npT4fGxoYyxWKxZ1VVGdTVVUN7e9tAZ7NXaHQGaLA1QUtLB4RC + vUahUCfOy3cCqGtofN1YWZvq7e0rMzR8x4dwvkX+Mw2APHKyu6d0ITQ2OyMewkP92YChObn5GVBSVABV + lWVQV1cDAAM/b0ChUIDN5gKPJwBdPRNgqqilqzJZ4WPGzAQbG7tmKyvaVgzD3rt+dXY24mRmJm/z979O + bm1t8mppabQuKcmD6upyqKqqBJls4HtmGIYBl8sHTU0+6OgYgUjc9kBfx6Rk4vhZYG3tnGBvr3p0oPP4 + Vss/0Bl4VyCEmPlFsDQ9L5kU+OAucDX5K9pams0ryvOhpqYCqqoqoKysEBoaGuBtNgoEAgYaGpqgpaUP + AoE2aGnpQElJ3lGZTJI5xHU4+PpNA3N766em2ljUQNvsTVJaijxzcnLcAgPvQElJgZaursnm0vJiqKkp + g6qKIigvL4WmxjqQvdWJRCKoq7NAINADPl8PeEJtUFdRr01NfbrL3t5dNnr0FBjtO+SSKgurHGh7vSv+ + ZxqAlymrR85t9TJBbnYiZGQkQlJSPDx7FgJTpizdJpF02tfX10JTUyM0NNRAa2sjtHY0QWuTCCTdYmhv + lz+vQCJRgMFgApVKAiZTHRgMFrDZ6qCuzgM2mw0aGprA4Wi1BQffXsPl6rU4OrqCtbUbTJxoF0EiYU0D + bZN3BUKIkpEj/aKtrWVba2sTtDbXQ31dDVTVVUJNeSU0NNRCa2sDNDTUQXNzPbS2NkNbWytIJJ0gEolA + LO7ZGSKRSMBgsIBEwoCpqg4qqmrAVlUHtgYX1NXVgcURAI1ESr5+/eR3jo5Dwd7eE6ycXMDcwLLZwZ4Z + PtA2GSj+ZxsARaSndxsWFKSrFRUVQkVFGZSV5UNNTRnUNldCXWU9dHV2QGNjpdyXkEJhAJutAUwmBTQ0 + hMBi8UFXVwhCoQno6GiDjo4hGBiYS+3smGkDXc6BJrkQ0SlSmRmZTAAaBQBkAPVtnVCcUwClJflQW1sG + paWFUFVVBDU11VBfXwNicSs0NDRCe3vPubfnwygBUKkYsDW1gcPlgTbvuc2FQgEIDCzA0sikxdpaDXdn + xMHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHB + wcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHB + wcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHB + wcHBwcHB+W/w/wDeZyycJNLgxAAAAABJRU5ErkJggg== + + + \ No newline at end of file diff --git a/SDRSharp.XDR/NO-DOESNOTWORK/SettingsPanel.cs b/SDRSharp.XDR/NO-DOESNOTWORK/SettingsPanel.cs deleted file mode 100644 index c1b774b..0000000 --- a/SDRSharp.XDR/NO-DOESNOTWORK/SettingsPanel.cs +++ /dev/null @@ -1,482 +0,0 @@ -using System; -using System.ComponentModel; -using System.Drawing; -using System.Windows.Forms; -using System.IO.Ports; - -using SDRSharp.Radio; -using SDRSharp.Common; - -namespace SDRSharp.XDR -{ - public partial class SettingsPanel : UserControl - { - //When SettingsPanel starts it will call this - public void InitializeComponent() - { - this.components = new System.ComponentModel.Container(); - this.enableXdrCheckBox = new System.Windows.Forms.CheckBox(); - this.mainTableLayoutPanel = new System.Windows.Forms.TableLayoutPanel(); - this.comPortsBox = new System.Windows.Forms.ComboBox(); - this.BaudrateBox = new System.Windows.Forms.ComboBox(); - this.label1 = new System.Windows.Forms.Label(); - this.label2 = new System.Windows.Forms.Label(); - this.sourceComboBox = new System.Windows.Forms.ComboBox(); - this.label3 = new System.Windows.Forms.Label(); - this.label5 = new System.Windows.Forms.Label(); - this.referenceTextBox = new System.Windows.Forms.TextBox(); - this.acquireButton = new System.Windows.Forms.Button(); - this.rebuildButton = new System.Windows.Forms.Button(); - this.resetButton = new System.Windows.Forms.Button(); - this.averageTextBox = new System.Windows.Forms.TextBox(); - this.label4 = new System.Windows.Forms.Label(); - this.label6 = new System.Windows.Forms.Label(); - this.enableCheckBox = new System.Windows.Forms.CheckBox(); - this.refreshTimer = new System.Windows.Forms.Timer(this.components); - this.mainTableLayoutPanel.SuspendLayout(); - - //integrationNumericUpDown - this.integrationNumericUpDown = new NumericUpDown(); - ((System.ComponentModel.ISupportInitialize)(this.integrationNumericUpDown)).BeginInit(); - // - // enableXdrCheckBox - // - this.enableXdrCheckBox.Anchor = System.Windows.Forms.AnchorStyles.Left; - this.enableXdrCheckBox.AutoSize = true; - this.enableXdrCheckBox.Location = new System.Drawing.Point(3, 6); - this.enableXdrCheckBox.Name = "enableXdrCheckBox"; - this.enableXdrCheckBox.Size = new System.Drawing.Size(85, 17); - this.enableXdrCheckBox.TabIndex = 0; - this.enableXdrCheckBox.Text = "Enable XDR"; - this.enableXdrCheckBox.UseVisualStyleBackColor = true; - this.enableXdrCheckBox.CheckedChanged += new System.EventHandler(this.enableXdrCheckBox_CheckedChanged); - // - // mainTableLayoutPanel - // - this.mainTableLayoutPanel.ColumnCount = 3; - this.mainTableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); - this.mainTableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 54.90196F)); - this.mainTableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 45.09804F)); - this.mainTableLayoutPanel.Controls.Add(this.enableXdrCheckBox, 0, 0); - this.mainTableLayoutPanel.Controls.Add(this.comPortsBox, 0, 2); - this.mainTableLayoutPanel.Controls.Add(this.BaudrateBox, 1, 2); - this.mainTableLayoutPanel.Controls.Add(this.label1, 0, 1); - this.mainTableLayoutPanel.Controls.Add(this.label2, 1, 1); - this.mainTableLayoutPanel.Controls.Add(this.sourceComboBox, 1, 3); - this.mainTableLayoutPanel.Controls.Add(this.label3, 0, 3); - this.mainTableLayoutPanel.Controls.Add(this.label5, 0, 5); - this.mainTableLayoutPanel.Controls.Add(this.referenceTextBox, 1, 4); - this.mainTableLayoutPanel.Controls.Add(this.acquireButton, 2, 4); - this.mainTableLayoutPanel.Controls.Add(this.integrationNumericUpDown, 1, 5); - this.mainTableLayoutPanel.Controls.Add(this.rebuildButton, 2, 5); - this.mainTableLayoutPanel.Controls.Add(this.resetButton, 1, 0); - this.mainTableLayoutPanel.Controls.Add(this.averageTextBox, 1, 6); - this.mainTableLayoutPanel.Controls.Add(this.label4, 0, 4); - this.mainTableLayoutPanel.Controls.Add(this.label6, 0, 6); - this.mainTableLayoutPanel.Dock = System.Windows.Forms.DockStyle.Fill; - this.mainTableLayoutPanel.Location = new System.Drawing.Point(0, 0); - this.mainTableLayoutPanel.Name = "mainTableLayoutPanel"; - this.mainTableLayoutPanel.RowCount = 4; - this.mainTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 30F)); - this.mainTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 17F)); - this.mainTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 27F)); - this.mainTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 28F)); - this.mainTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 31F)); - this.mainTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 30F)); - this.mainTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 26F)); - this.mainTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 8F)); - this.mainTableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F)); - this.mainTableLayoutPanel.Size = new System.Drawing.Size(206, 217); - this.mainTableLayoutPanel.TabIndex = 1; - // - // comPortsBox - // - this.comPortsBox.Anchor = System.Windows.Forms.AnchorStyles.Top; - this.comPortsBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.comPortsBox.FormattingEnabled = true; - this.comPortsBox.Location = new System.Drawing.Point(3, 50); - this.comPortsBox.Name = "comPortsBox"; - this.comPortsBox.Size = new System.Drawing.Size(96, 21); - this.comPortsBox.TabIndex = 2; - this.comPortsBox.SelectedIndexChanged += new System.EventHandler(this.XdrComPortChanged_CheckedChanged); - // - // BaudrateBox - // - this.BaudrateBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right))); - this.mainTableLayoutPanel.SetColumnSpan(this.BaudrateBox, 2); - this.BaudrateBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.BaudrateBox.FormattingEnabled = true; - this.BaudrateBox.Location = new System.Drawing.Point(105, 50); - this.BaudrateBox.Name = "BaudrateBox"; - this.BaudrateBox.Size = new System.Drawing.Size(98, 21); - this.BaudrateBox.TabIndex = 3; - this.BaudrateBox.SelectedIndexChanged += new System.EventHandler(this.BaudrateBox_SelectedIndexChanged); - // - // label1 - // - this.label1.Anchor = System.Windows.Forms.AnchorStyles.None; - this.label1.AutoSize = true; - this.label1.Location = new System.Drawing.Point(24, 32); - this.label1.Name = "label1"; - this.label1.Size = new System.Drawing.Size(53, 13); - this.label1.TabIndex = 4; - this.label1.Text = "COM Port"; - this.label1.TextAlign = System.Drawing.ContentAlignment.MiddleRight; - // - // label2 - // - this.label2.Anchor = System.Windows.Forms.AnchorStyles.None; - this.label2.AutoSize = true; - this.label2.Location = new System.Drawing.Point(105, 32); - this.label2.Name = "label2"; - this.label2.Size = new System.Drawing.Size(50, 13); - this.label2.TabIndex = 5; - this.label2.Text = "Baudrate"; - this.label2.TextAlign = System.Drawing.ContentAlignment.MiddleRight; - // - // sourceComboBox - // - this.sourceComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right))); - this.mainTableLayoutPanel.SetColumnSpan(this.sourceComboBox, 2); - this.sourceComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.sourceComboBox.FormattingEnabled = true; - this.sourceComboBox.Items.AddRange(new object[] { - "Filtered IF", - "Full IQ", - "Demodulator"}); - this.sourceComboBox.Location = new System.Drawing.Point(105, 77); - this.sourceComboBox.Name = "sourceComboBox"; - this.sourceComboBox.Size = new System.Drawing.Size(98, 21); - this.sourceComboBox.TabIndex = 7; - this.sourceComboBox.SelectedIndexChanged += this.sourceComboBox_SelectedIndexChanged; - // - // label3 - // - this.label3.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right))); - this.label3.AutoSize = true; - this.label3.Location = new System.Drawing.Point(3, 81); - this.label3.Name = "label3"; - this.label3.Size = new System.Drawing.Size(96, 13); - this.label3.TabIndex = 6; - this.label3.Text = "Source"; - // - // label5 - // - this.label5.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right))); - this.label5.AutoSize = true; - this.label5.Location = new System.Drawing.Point(3, 141); - this.label5.Name = "label5"; - this.label5.Size = new System.Drawing.Size(96, 13); - this.label5.TabIndex = 12; - this.label5.Text = "Integration (sec)"; - // - // referenceTextBox - // - this.referenceTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right))); - this.referenceTextBox.Location = new System.Drawing.Point(105, 107); - this.referenceTextBox.Name = "referenceTextBox"; - this.referenceTextBox.ReadOnly = true; - this.referenceTextBox.Size = new System.Drawing.Size(51, 20); - this.referenceTextBox.TabIndex = 11; - this.referenceTextBox.Text = "0.00 dB"; - this.referenceTextBox.TextAlign = System.Windows.Forms.HorizontalAlignment.Right; - // - // acquireButton - // - this.acquireButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right))); - this.acquireButton.Location = new System.Drawing.Point(162, 106); - this.acquireButton.Name = "acquireButton"; - this.acquireButton.Size = new System.Drawing.Size(41, 22); - this.acquireButton.TabIndex = 10; - this.acquireButton.Text = "Acquire"; - this.acquireButton.UseVisualStyleBackColor = true; - this.acquireButton.Click += this.acquireButton_Click; - // - // integrationNumericUpDown - // - this.integrationNumericUpDown.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right))); - this.integrationNumericUpDown.Location = new System.Drawing.Point(105, 138); - NumericUpDown numericUpDown = this.integrationNumericUpDown; - //numericUpDown.Maximum = 300; - - this.integrationNumericUpDown.Name = "integrationNumericUpDown"; - this.integrationNumericUpDown.Size = new System.Drawing.Size(51, 20); - this.integrationNumericUpDown.TabIndex = 13; - this.integrationNumericUpDown.TextAlign = System.Windows.Forms.HorizontalAlignment.Right; - //NumericUpDown numericUpDown = this.integrationNumericUpDown; - //int[] array = new int[4]; - //array[0] = 300; - //numericUpDown.Maximum = new decimal(array); - - - //NumericUpDown numericUpDown2 = this.integrationNumericUpDown; - //int[] array2 = new int[4]; - //array2[0] = 1; - //numericUpDown2.Minimum = new decimal(array2); - //NumericUpDown numericUpDown3 = this.integrationNumericUpDown; - //int[] array3 = new int[4]; - //array3[0] = 30; - //numericUpDown3.Value = new decimal(array3); - //this.integrationNumericUpDown.ValueChanged += this.integrationNumericUpDown_ValueChanged; - - ((ISupportInitialize)this.integrationNumericUpDown).EndInit(); - - // rebuildButton - // - this.rebuildButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right))); - this.rebuildButton.Location = new System.Drawing.Point(162, 138); - this.rebuildButton.Name = "rebuildButton"; - this.rebuildButton.Size = new System.Drawing.Size(41, 20); - this.rebuildButton.TabIndex = 17; - this.rebuildButton.Text = "Rebuild"; - this.rebuildButton.UseVisualStyleBackColor = true; - this.rebuildButton.Click += this.rebuildButton_Click; - // - // resetButton - // - this.resetButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right))); - this.mainTableLayoutPanel.SetColumnSpan(this.resetButton, 2); - this.resetButton.Location = new System.Drawing.Point(105, 4); - this.resetButton.Name = "resetButton"; - this.resetButton.Size = new System.Drawing.Size(98, 22); - this.resetButton.TabIndex = 16; - this.resetButton.Text = "Reset"; - this.resetButton.UseVisualStyleBackColor = true; - this.resetButton.Click += this.resetButton_Click; - // - // averageTextBox - // - this.averageTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right))); - this.averageTextBox.BackColor = System.Drawing.SystemColors.Control; - this.averageTextBox.BorderStyle = System.Windows.Forms.BorderStyle.None; - this.mainTableLayoutPanel.SetColumnSpan(this.averageTextBox, 2); - this.averageTextBox.Font = new System.Drawing.Font("Microsoft Sans Serif", 16F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.averageTextBox.Location = new System.Drawing.Point(105, 177); - this.averageTextBox.Name = "averageTextBox"; - this.averageTextBox.RightToLeft = System.Windows.Forms.RightToLeft.No; - this.averageTextBox.Size = new System.Drawing.Size(98, 25); - this.averageTextBox.TabIndex = 14; - this.averageTextBox.Text = "0.00 dB"; - this.averageTextBox.TextAlign = System.Windows.Forms.HorizontalAlignment.Center; - // - // label4 - // - this.label4.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right))); - this.label4.AutoSize = true; - this.label4.Location = new System.Drawing.Point(3, 111); - this.label4.Name = "label4"; - this.label4.Size = new System.Drawing.Size(96, 13); - this.label4.TabIndex = 8; - this.label4.Text = "Reference"; - // - // label6 - // - this.label6.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right))); - this.label6.AutoSize = true; - this.label6.Location = new System.Drawing.Point(3, 183); - this.label6.Name = "label6"; - this.label6.Size = new System.Drawing.Size(96, 13); - this.label6.TabIndex = 15; - this.label6.Text = "Power:"; - // - // enableCheckBox - // - this.enableCheckBox.Anchor = System.Windows.Forms.AnchorStyles.Left; - this.enableCheckBox.AutoSize = true; - this.enableCheckBox.Location = new System.Drawing.Point(3, 5); - this.enableCheckBox.Name = "enableCheckBox"; - this.enableCheckBox.Size = new System.Drawing.Size(65, 17); - this.enableCheckBox.TabIndex = 0; - this.enableCheckBox.Text = "Enabled"; - this.enableCheckBox.UseVisualStyleBackColor = true; - // - // refreshTimer - // - this.refreshTimer.Interval = 500; - this.refreshTimer.Tick += this.refreshTimer_Tick; - // - // SettingsPanel - // - this.Controls.Add(this.mainTableLayoutPanel); - this.Name = "SettingsPanel"; - this.Size = new System.Drawing.Size(206, 217); - this.mainTableLayoutPanel.ResumeLayout(false); - this.mainTableLayoutPanel.PerformLayout(); - this.ResumeLayout(false); - - } - // Comport - public int comIndex; - public int BaudIndex; - public string[] myPort; - public string[] myBaud; - public ComboBox comPortsBox; - - // Plugin stuff - private XDRPlugin _plugin; - - // SD# Exposes that interface - private IContainer components; - - // Main Checkbox - public CheckBox enableXdrCheckBox; - public bool XdrEnabled; - - // Main Panel - private TableLayoutPanel mainTableLayoutPanel; - - - - //Another UserControl squshed inhere - private ISharpControl _control; - private AmplitudeProcessor _processor; - private float _reference; - private TableLayoutPanel tableLayoutPanel1; - private ComboBox sourceComboBox; - private Label label3; - private Button acquireButton; - private TextBox referenceTextBox; - private Label label5; - private Label label6; - public NumericUpDown integrationNumericUpDown; - private Timer refreshTimer; - private Button resetButton; - - - private Button rebuildButton; - private Label label1; - private Label label2; - public ComboBox BaudrateBox; - private TextBox averageTextBox; - private Label label4; - private CheckBox enableCheckBox; - - public SettingsPanel(XDRPlugin plugin, AmplitudeProcessor processor, ISharpControl control) - { - this._plugin = plugin; - this._processor = processor; - this._control = control; - //this.sourceComboBox.SelectedIndex = 0; - this.comIndex = 0; - this.BaudIndex = 0; - this.XdrEnabled = false; - this.InitializeComponent(); - this.XdrEnabled = Utils.GetBooleanSetting("enableXdr", false); - this.enableXdrCheckBox.Enabled = true; - this.comPortsBox.Enabled = this.XdrEnabled; - this.BaudrateBox.Enabled = this.XdrEnabled; - this.comPortsBox.Items.Add("None"); - this.BaudrateBox.Items.Add("None"); - this.myPort = SerialPort.GetPortNames(); - this.myBaud = new string[] { "300", "600", "1200", "2400", "4800", "9600", "19200", "38400", "57600", "115200", "230400", "460800", "921600" }; //Baudrate is here - ComboBox.ObjectCollection items = this.comPortsBox.Items; - ComboBox.ObjectCollection Bitems = this.BaudrateBox.Items; - object[] items2 = this.myPort; - object[] Bitems2 = this.myBaud; - items.AddRange(items2); - Bitems.AddRange(Bitems2); - this.comIndex = Utils.GetIntSetting("comIndex", 0); - this.BaudIndex = Utils.GetIntSetting("BaudIndex", 6); - if (this.comIndex > this.myPort.Length) - { - this.comIndex = 0; - } - if (this.BaudIndex > this.myBaud.Length) - { - this.BaudIndex = 6; - } - this.integrationNumericUpDown_ValueChanged(null, null); - } - - // XDREnabled Button - private void enableXdrCheckBox_CheckedChanged(object sender, EventArgs e) - { - this.comPortsBox.Enabled = (this.XdrEnabled = this.enableXdrCheckBox.Checked); - this.BaudrateBox.Enabled = (this.XdrEnabled = this.enableXdrCheckBox.Checked); - this._plugin.PopulateComPort(); - - this._processor.Enabled = this.enableCheckBox.Checked; - this.refreshTimer.Enabled = this.enableCheckBox.Checked; - } - - // Comport dropdown - private void XdrComPortChanged_CheckedChanged(object sender, EventArgs e) - { - Utils.SaveSetting("comIndex", this.comPortsBox.SelectedIndex); - this.comIndex = this.comPortsBox.SelectedIndex; - this._plugin.PopulateComPort(); - } - // Baudrate dropdown - private void BaudrateBox_SelectedIndexChanged(object sender, EventArgs e) - { - Utils.SaveSetting("BaudIndex", this.BaudrateBox.SelectedIndex); - this.BaudIndex = this.BaudrateBox.SelectedIndex; - this._plugin.PopulateComPort(); - } - protected override void Dispose(bool disposing) - { - if (disposing && this.components != null) - { - this.components.Dispose(); - } - base.Dispose(disposing); - } - - //for custom Signal Meter - - private void refreshTimer_Tick(object sender, EventArgs e) - { - //TODO - if (this._processor.Enabled && !this.averageTextBox.Focused) - { - if (this._processor.Average < -500f) - { - this.averageTextBox.Text = "-"; - return; - } - this.averageTextBox.Text = (this._processor.Average - this._reference).ToString("#0.00") + " dB"; - } - } - - private void acquireButton_Click(object sender, EventArgs e) - { - this._reference = this._processor.Average; - this.referenceTextBox.Text = this._processor.Average.ToString("#0.00") + " dB"; - } - - private void sourceComboBox_SelectedIndexChanged(object sender, EventArgs e) - { - this._control.UnregisterStreamHook(this._processor); - switch (this.sourceComboBox.SelectedIndex) - { - case 0: - this._control.RegisterStreamHook(this._processor, ProcessorType.DecimatedAndFilteredIQ); - break; - case 1: - this._control.RegisterStreamHook(this._processor, ProcessorType.RawIQ); - break; - case 2: - this._control.RegisterStreamHook(this._processor, ProcessorType.DemodulatorOutput); - break; - } - this.resetButton_Click(null, null); - } - - private void integrationNumericUpDown_ValueChanged(object sender, EventArgs e) - { - this._processor.Integration = (double)this.integrationNumericUpDown.Value; - } - - private void resetButton_Click(object sender, EventArgs e) - { - this._reference = 0f; - this.referenceTextBox.Text = "0.00 dB"; - this._processor.Rebuild(); - } - - private void rebuildButton_Click(object sender, EventArgs e) - { - this._processor.Rebuild(); - } - } -} diff --git a/SDRSharp.XDR/NO-DOESNOTWORK/UserControl1.cs b/SDRSharp.XDR/NO-DOESNOTWORK/UserControl1.cs deleted file mode 100644 index 33403e7..0000000 --- a/SDRSharp.XDR/NO-DOESNOTWORK/UserControl1.cs +++ /dev/null @@ -1,249 +0,0 @@ -using System; -using System.ComponentModel; -using System.Drawing; -using System.Windows.Forms; -using SDRSharp.Common; -using SDRSharp.Radio; - -namespace SDRSharp.Diagnostics -{ - // Token: 0x02000004 RID: 4 - public class ProcessorPanel : UserControl - { - // Token: 0x06000011 RID: 17 RVA: 0x0000227B File Offset: 0x0000047B - public ProcessorPanel(ISharpControl control) - { - this._control = control; - this.InitializeComponent(); - this.sourceComboBox.SelectedIndex = 0; - } - - // Token: 0x06000019 RID: 25 RVA: 0x0000247B File Offset: 0x0000067B - protected override void Dispose(bool disposing) - { - if (disposing && this.components != null) - { - this.components.Dispose(); - } - base.Dispose(disposing); - } - - // Token: 0x0600001A RID: 26 RVA: 0x0000249C File Offset: 0x0000069C - private void InitializeComponent() - { - this.components = new System.ComponentModel.Container(); - this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel(); - this.label4 = new System.Windows.Forms.Label(); - this.enableCheckBox = new System.Windows.Forms.CheckBox(); - this.sourceComboBox = new System.Windows.Forms.ComboBox(); - this.label3 = new System.Windows.Forms.Label(); - this.label5 = new System.Windows.Forms.Label(); - this.referenceTextBox = new System.Windows.Forms.TextBox(); - this.acquireButton = new System.Windows.Forms.Button(); - this.integrationNumericUpDown = new System.Windows.Forms.NumericUpDown(); - this.rebuildButton = new System.Windows.Forms.Button(); - this.resetButton = new System.Windows.Forms.Button(); - this.refreshTimer = new System.Windows.Forms.Timer(this.components); - this.tableLayoutPanel1.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.integrationNumericUpDown)).BeginInit(); - this.SuspendLayout(); - // - // tableLayoutPanel1 - // - this.tableLayoutPanel1.AutoSize = true; - this.tableLayoutPanel1.ColumnCount = 3; - this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); - this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 47.82609F)); - this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 52.17391F)); - this.tableLayoutPanel1.Controls.Add(this.label4, 0, 2); - this.tableLayoutPanel1.Controls.Add(this.enableCheckBox, 0, 0); - this.tableLayoutPanel1.Controls.Add(this.sourceComboBox, 1, 1); - this.tableLayoutPanel1.Controls.Add(this.label3, 0, 1); - this.tableLayoutPanel1.Controls.Add(this.label5, 0, 3); - this.tableLayoutPanel1.Controls.Add(this.referenceTextBox, 1, 2); - this.tableLayoutPanel1.Controls.Add(this.acquireButton, 2, 2); - this.tableLayoutPanel1.Controls.Add(this.integrationNumericUpDown, 1, 3); - this.tableLayoutPanel1.Controls.Add(this.rebuildButton, 2, 3); - this.tableLayoutPanel1.Controls.Add(this.resetButton, 1, 0); - this.tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill; - this.tableLayoutPanel1.Location = new System.Drawing.Point(0, 0); - this.tableLayoutPanel1.Name = "tableLayoutPanel1"; - this.tableLayoutPanel1.RowCount = 4; - this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle()); - this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle()); - this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle()); - this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F)); - this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F)); - this.tableLayoutPanel1.Size = new System.Drawing.Size(204, 121); - this.tableLayoutPanel1.TabIndex = 10; - // - // label4 - // - this.label4.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right))); - this.label4.AutoSize = true; - this.label4.Location = new System.Drawing.Point(3, 62); - this.label4.Name = "label4"; - this.label4.Size = new System.Drawing.Size(83, 13); - this.label4.TabIndex = 8; - this.label4.Text = "Reference"; - // - // enableCheckBox - // - this.enableCheckBox.Anchor = System.Windows.Forms.AnchorStyles.Left; - this.enableCheckBox.AutoSize = true; - this.enableCheckBox.Location = new System.Drawing.Point(3, 5); - this.enableCheckBox.Name = "enableCheckBox"; - this.enableCheckBox.Size = new System.Drawing.Size(65, 17); - this.enableCheckBox.TabIndex = 0; - this.enableCheckBox.Text = "Enabled"; - this.enableCheckBox.UseVisualStyleBackColor = true; - // - // sourceComboBox - // - this.sourceComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right))); - this.tableLayoutPanel1.SetColumnSpan(this.sourceComboBox, 2); - this.sourceComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.sourceComboBox.FormattingEnabled = true; - this.sourceComboBox.Items.AddRange(new object[] { - "Filtered IF", - "Full IQ", - "Demodulator"}); - this.sourceComboBox.Location = new System.Drawing.Point(92, 31); - this.sourceComboBox.Name = "sourceComboBox"; - this.sourceComboBox.Size = new System.Drawing.Size(109, 21); - this.sourceComboBox.TabIndex = 7; - // - // label3 - // - this.label3.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right))); - this.label3.AutoSize = true; - this.label3.Location = new System.Drawing.Point(3, 35); - this.label3.Name = "label3"; - this.label3.Size = new System.Drawing.Size(83, 13); - this.label3.TabIndex = 6; - this.label3.Text = "Source"; - // - // label5 - // - this.label5.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right))); - this.label5.AutoSize = true; - this.label5.Location = new System.Drawing.Point(3, 95); - this.label5.Name = "label5"; - this.label5.Size = new System.Drawing.Size(83, 13); - this.label5.TabIndex = 12; - this.label5.Text = "Integration (sec)"; - // - // referenceTextBox - // - this.referenceTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right))); - this.referenceTextBox.Location = new System.Drawing.Point(92, 59); - this.referenceTextBox.Name = "referenceTextBox"; - this.referenceTextBox.ReadOnly = true; - this.referenceTextBox.Size = new System.Drawing.Size(49, 20); - this.referenceTextBox.TabIndex = 11; - this.referenceTextBox.Text = "0.00 dB"; - this.referenceTextBox.TextAlign = System.Windows.Forms.HorizontalAlignment.Right; - // - // acquireButton - // - this.acquireButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right))); - this.acquireButton.Location = new System.Drawing.Point(147, 58); - this.acquireButton.Name = "acquireButton"; - this.acquireButton.Size = new System.Drawing.Size(54, 22); - this.acquireButton.TabIndex = 10; - this.acquireButton.Text = "Acquire"; - this.acquireButton.UseVisualStyleBackColor = true; - // - // integrationNumericUpDown - // - this.integrationNumericUpDown.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right))); - this.integrationNumericUpDown.Location = new System.Drawing.Point(92, 92); - this.integrationNumericUpDown.Name = "integrationNumericUpDown"; - this.integrationNumericUpDown.Size = new System.Drawing.Size(49, 20); - this.integrationNumericUpDown.TabIndex = 13; - this.integrationNumericUpDown.TextAlign = System.Windows.Forms.HorizontalAlignment.Right; - // - // rebuildButton - // - this.rebuildButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right))); - this.rebuildButton.Location = new System.Drawing.Point(147, 90); - this.rebuildButton.Name = "rebuildButton"; - this.rebuildButton.Size = new System.Drawing.Size(54, 23); - this.rebuildButton.TabIndex = 17; - this.rebuildButton.Text = "Rebuild"; - this.rebuildButton.UseVisualStyleBackColor = true; - // - // resetButton - // - this.resetButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right))); - this.tableLayoutPanel1.SetColumnSpan(this.resetButton, 2); - this.resetButton.Location = new System.Drawing.Point(92, 3); - this.resetButton.Name = "resetButton"; - this.resetButton.Size = new System.Drawing.Size(109, 22); - this.resetButton.TabIndex = 16; - this.resetButton.Text = "Reset"; - this.resetButton.UseVisualStyleBackColor = true; - // - // refreshTimer - // - this.refreshTimer.Interval = 500; - // - // ProcessorPanel - // - this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi; - this.Controls.Add(this.tableLayoutPanel1); - this.Name = "ProcessorPanel"; - this.Size = new System.Drawing.Size(204, 121); - this.tableLayoutPanel1.ResumeLayout(false); - this.tableLayoutPanel1.PerformLayout(); - ((System.ComponentModel.ISupportInitialize)(this.integrationNumericUpDown)).EndInit(); - this.ResumeLayout(false); - this.PerformLayout(); - - } - - // Token: 0x0400000D RID: 13 - private float _reference; - - // Token: 0x0400000E RID: 14 - private ISharpControl _control; - - // Token: 0x04000010 RID: 16 - private IContainer components; - - // Token: 0x04000011 RID: 17 - private TableLayoutPanel tableLayoutPanel1; - - // Token: 0x04000012 RID: 18 - private Label label4; - - // Token: 0x04000014 RID: 20 - private ComboBox sourceComboBox; - - // Token: 0x04000015 RID: 21 - private Label label3; - - // Token: 0x04000016 RID: 22 - private Button acquireButton; - - // Token: 0x04000017 RID: 23 - private TextBox referenceTextBox; - - // Token: 0x04000018 RID: 24 - private Label label5; - - // Token: 0x04000019 RID: 25 - private NumericUpDown integrationNumericUpDown; - - // Token: 0x0400001B RID: 27 - private Timer refreshTimer; - - // Token: 0x0400001D RID: 29 - private Button resetButton; - - // Token: 0x0400001E RID: 30 - private Button rebuildButton; - private CheckBox enableCheckBox; - } -} \ No newline at end of file diff --git a/SDRSharp.XDR/NO-DOESNOTWORK/UserControl1.resx b/SDRSharp.XDR/NO-DOESNOTWORK/UserControl1.resx deleted file mode 100644 index c7ebc73..0000000 --- a/SDRSharp.XDR/NO-DOESNOTWORK/UserControl1.resx +++ /dev/null @@ -1,126 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 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 - - - 17, 17 - - - 78 - - \ No newline at end of file diff --git a/SDRSharp.XDR/NO-DOESNOTWORK/XDRPlugin.cs b/SDRSharp.XDR/NO-DOESNOTWORK/XDRPlugin.cs deleted file mode 100644 index 919fcc0..0000000 --- a/SDRSharp.XDR/NO-DOESNOTWORK/XDRPlugin.cs +++ /dev/null @@ -1,98 +0,0 @@ -using System; -using System.Diagnostics; -using System.IO.Ports; -using System.Threading; -using System.Windows.Forms; - -using SDRSharp.Common; -using SDRSharp.Radio; -using SDRSharp.PanView; //For Signal Meter, Spectrum, etc - -namespace SDRSharp.XDR -{ - public partial class XDRPlugin : ISharpPlugin - { - //Plugin Display Name - public string DisplayName - { - get - { - return "XDR-GTK Server"; - } - } - - //Which class should it load for GUI - public UserControl Gui - { - get - { - return this._controlPanel; - } - } - - // When the plugin starts it will call this - public void Initialize(ISharpControl control) - { - XDRPlugin._sdr = control; - XDRPlugin._continue = false; - XDRPlugin._waiting = false; - - this._comThread = new Thread(new ThreadStart(SerialCommands.ComThreadEngine)); - this._processor = new AmplitudeProcessor(); - this._controlPanel = new SettingsPanel(this, this._processor, XDRPlugin._sdr); - this._controlPanel.enableXdrCheckBox.Checked = this._controlPanel.XdrEnabled; - this._controlPanel.comPortsBox.SelectedIndex = this._controlPanel.comIndex; - this._controlPanel.BaudrateBox.SelectedIndex = this._controlPanel.BaudIndex; - - //For Signal meter - this.spectrumAnalyzer = new SpectrumAnalyzer(); - this.spectrumAnalyzer.EnableSNR = true; - - //Hook into RDS stream - XDRPlugin._sdr.RegisterStreamHook(new RDSHandle(), ProcessorType.RDSBitStream); - } - - // When you close SDR# it calls this - public void Close() - { - Utils.SaveSetting("enableXdr", this._controlPanel.XdrEnabled); - Utils.SaveSetting("XdrComIndex", this._controlPanel.comIndex); - Utils.SaveSetting("BaudIndex", this._controlPanel.BaudIndex); - if (XDRPlugin._continue) - { - XDRPlugin._waiting = true; - while (XDRPlugin._waiting) - { - Thread.Sleep(10); - } - XDRPlugin._serialPort.Close(); - XDRPlugin._serialPort = null; - this._comThread.Join(); - } - } - - //For signal meter - private SpectrumAnalyzer spectrumAnalyzer; - - //For GUI - private SettingsPanel _controlPanel; - - //For custom Signal Meter - private AmplitudeProcessor _processor; - - //For Communication - private Thread _comThread; - public static SerialPort _serialPort; - public static bool _continue; - public static bool _waiting; - - - //Main controls are here (set frequency, start radio, stop radio, etx) - public static ISharpControl _sdr; - - //for RDS - public static ushort PI_Code; - public static string RDS_Group = null; - public static bool RDSDetected; - } -} diff --git a/SDRSharp.XDR/Properties/Resources.Designer.cs b/SDRSharp.XDR/Properties/Resources.Designer.cs new file mode 100644 index 0000000..d8cbacc --- /dev/null +++ b/SDRSharp.XDR/Properties/Resources.Designer.cs @@ -0,0 +1,73 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace SDRSharp.XDR.Properties { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "15.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + public class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + public static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("SDRSharp.XDR.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + public static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + public static System.Drawing.Bitmap Wolf { + get { + object obj = ResourceManager.GetObject("Wolf", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + } +} diff --git a/SDRSharp.XDR/NO-DOESNOTWORK/SettingsPanel.resx b/SDRSharp.XDR/Properties/Resources.resx similarity index 93% rename from SDRSharp.XDR/NO-DOESNOTWORK/SettingsPanel.resx rename to SDRSharp.XDR/Properties/Resources.resx index ef18fa4..8b461f1 100644 --- a/SDRSharp.XDR/NO-DOESNOTWORK/SettingsPanel.resx +++ b/SDRSharp.XDR/Properties/Resources.resx @@ -117,7 +117,8 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 17, 17 - + + + ..\Resources\Wolf.jpg;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + \ No newline at end of file diff --git a/SDRSharp.XDR/RDS/RDSFunctions.cs b/SDRSharp.XDR/RDS/RDSFunctions.cs index 878c67c..86c8b9f 100644 --- a/SDRSharp.XDR/RDS/RDSFunctions.cs +++ b/SDRSharp.XDR/RDS/RDSFunctions.cs @@ -68,5 +68,17 @@ private enum groupType : byte RDS_TYPE_15A = 0x001E, RDS_TYPE_15B = 0x001F } + public static void ParseData(string data) + { + //We are parsing ASCII G Protocol + string[] DataArr = data.Split(new char[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries); + if (DataArr[0] == "G:") //just check if we are not sending garbage or someone else is trying to poison our message :) + { + string RDSGroup = DataArr[1]; + ushort PI = ushort.Parse(RDSGroup.Substring(0, 4)); //Short is 4 bytes long so it should never fail + XDRPlugin.RDS_PI = PI; + XDRPlugin.RDS_Group = RDSGroup; + } + } } } diff --git a/SDRSharp.XDR/RDS/RDSHandle.cs b/SDRSharp.XDR/RDS/RDSHandle.cs index c6cb31c..d89d7e6 100644 --- a/SDRSharp.XDR/RDS/RDSHandle.cs +++ b/SDRSharp.XDR/RDS/RDSHandle.cs @@ -22,7 +22,7 @@ public bool Enabled public void Process(ref RdsFrame _rdsFrame) { string text = string.Format("{0:X}", _rdsFrame.GroupA); - if (text.Length == 4) + if (text.Length == 4 && (!XDRPlugin.ExternalRDS)) { XDRPlugin.RDS_Group = _rdsFrame.GroupB.ToString("X4") + _rdsFrame.GroupC.ToString("X4") + _rdsFrame.GroupD.ToString("X4"); } diff --git a/SDRSharp.XDR/Resources/Wolf.jpg b/SDRSharp.XDR/Resources/Wolf.jpg new file mode 100644 index 0000000..8b66a4b Binary files /dev/null and b/SDRSharp.XDR/Resources/Wolf.jpg differ diff --git a/SDRSharp.XDR/SDRSharp.XDR.csproj b/SDRSharp.XDR/SDRSharp.XDR.csproj index 88ee5cc..bb279a6 100644 --- a/SDRSharp.XDR/SDRSharp.XDR.csproj +++ b/SDRSharp.XDR/SDRSharp.XDR.csproj @@ -81,6 +81,11 @@ AdvancedRDSWindow.cs + + True + True + Resources.resx + @@ -91,15 +96,29 @@ SettingsPanel.cs + + Component + + + Form + + + + AdvancedRDSWindow.cs + + + PublicResXFileCodeGenerator + Resources.Designer.cs + SettingsPanel.cs - + \ No newline at end of file diff --git a/SDRSharp.XDR/SerialCommands.cs b/SDRSharp.XDR/SerialCommands.cs index c52fe18..559f9fd 100644 --- a/SDRSharp.XDR/SerialCommands.cs +++ b/SDRSharp.XDR/SerialCommands.cs @@ -213,19 +213,33 @@ public static void ComThreadEngine() SP.Write((XDRPlugin._sdr.FmPilotIsDetected) ? "S" : "M"); //M = Forced Mono, m = normal Mono } serial_signal(XDRPlugin._sdr.VisualSNR, 2); //Signal - SP.Write("\n"); + SP.Write("\r\n"); //RDS - if (XDRPlugin._sdr.RdsPICode != 0) + if (!XDRPlugin.ExternalRDS) //We are using SDR# Internal RDS so do its mumbo-jumbo { - serial_pi(XDRPlugin._sdr.RdsPICode, PI_CORRECT); - SP.Write("R"); - SP.Write(XDRPlugin.RDS_Group + "00"); //00 at the end are error correction: 0 - no errors 1 - max 2-bit correction 2 - max 5-bit correction - SP.Write("\n"); + if (XDRPlugin._sdr.RdsPICode != 0) + { + serial_pi(XDRPlugin._sdr.RdsPICode, PI_CORRECT); + SP.Write("R"); + SP.Write(XDRPlugin.RDS_Group + "00"); //00 at the end are error correction: 0 - no errors 1 - max 2-bit correction 2 - max 5-bit correction + SP.Write("\r\n"); + } + XDRPlugin.RDS_Group = null; + } + else //We are using RDSSpy as RDS Decoder + { + if (XDRPlugin.RDSDetected) + { + serial_pi(XDRPlugin.RDS_PI, PI_CORRECT); + SP.Write("R"); + SP.Write(XDRPlugin.RDS_Group + "00"); //00 at the end are error correction: 0 - no errors 1 - max 2-bit correction 2 - max 5-bit correction + SP.Write("\r\n"); + } + //XDRPlugin._sdr.RdsPICode = 0; + XDRPlugin.RDS_Group = null; } - //XDRPlugin._sdr.RdsPICode = 0; - XDRPlugin.RDS_Group = null; } } XDRPlugin._waiting = false; diff --git a/SDRSharp.XDR/SettingsPanel.Designer.cs b/SDRSharp.XDR/SettingsPanel.Designer.cs index c07fff5..268ec8d 100644 --- a/SDRSharp.XDR/SettingsPanel.Designer.cs +++ b/SDRSharp.XDR/SettingsPanel.Designer.cs @@ -54,9 +54,9 @@ public void InitializeComponent() this.mainTableLayoutPanel.Controls.Add(this.enableXdrCheckBox, 0, 0); this.mainTableLayoutPanel.Controls.Add(this.label1, 0, 1); this.mainTableLayoutPanel.Controls.Add(this.label2, 1, 1); - this.mainTableLayoutPanel.Controls.Add(this.comPortsBox, 1, 2); - this.mainTableLayoutPanel.Controls.Add(this.BaudrateBox, 0, 2); this.mainTableLayoutPanel.Controls.Add(this.AdvancedRDS, 0, 3); + this.mainTableLayoutPanel.Controls.Add(this.BaudrateBox, 1, 2); + this.mainTableLayoutPanel.Controls.Add(this.comPortsBox, 0, 2); this.mainTableLayoutPanel.Dock = System.Windows.Forms.DockStyle.Fill; this.mainTableLayoutPanel.Location = new System.Drawing.Point(0, 0); this.mainTableLayoutPanel.Name = "mainTableLayoutPanel"; @@ -96,7 +96,7 @@ public void InitializeComponent() this.comPortsBox.Anchor = System.Windows.Forms.AnchorStyles.Top; this.comPortsBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; this.comPortsBox.FormattingEnabled = true; - this.comPortsBox.Location = new System.Drawing.Point(105, 39); + this.comPortsBox.Location = new System.Drawing.Point(3, 39); this.comPortsBox.Name = "comPortsBox"; this.comPortsBox.Size = new System.Drawing.Size(96, 21); this.comPortsBox.TabIndex = 2; @@ -107,7 +107,7 @@ public void InitializeComponent() this.BaudrateBox.Anchor = System.Windows.Forms.AnchorStyles.Top; this.BaudrateBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; this.BaudrateBox.FormattingEnabled = true; - this.BaudrateBox.Location = new System.Drawing.Point(3, 39); + this.BaudrateBox.Location = new System.Drawing.Point(105, 39); this.BaudrateBox.Name = "BaudrateBox"; this.BaudrateBox.Size = new System.Drawing.Size(96, 21); this.BaudrateBox.TabIndex = 3; @@ -122,6 +122,7 @@ public void InitializeComponent() this.AdvancedRDS.TabIndex = 2; this.AdvancedRDS.Text = "Advanced RDS"; this.AdvancedRDS.UseVisualStyleBackColor = true; + this.AdvancedRDS.Click += new System.EventHandler(this.AdvancedRDS_Click); // // SettingsPanel // @@ -131,6 +132,7 @@ public void InitializeComponent() this.mainTableLayoutPanel.ResumeLayout(false); this.mainTableLayoutPanel.PerformLayout(); this.ResumeLayout(false); + } #endregion diff --git a/SDRSharp.XDR/SettingsPanel.cs b/SDRSharp.XDR/SettingsPanel.cs index 7d868a0..f6f17c9 100644 --- a/SDRSharp.XDR/SettingsPanel.cs +++ b/SDRSharp.XDR/SettingsPanel.cs @@ -90,5 +90,10 @@ private void BaudrateBox_SelectedIndexChanged(object sender, EventArgs e) this.BaudIndex = this.BaudrateBox.SelectedIndex; this._plugin.PopulateComPort(); } + //We will open another windows when we click + private void AdvancedRDS_Click(object sender, EventArgs e) + { + AdvancedRDSWindow.Instance.Show(); + } } } diff --git a/SDRSharp.XDR/Tools/CustomTooltip.cs b/SDRSharp.XDR/Tools/CustomTooltip.cs new file mode 100644 index 0000000..f97accc --- /dev/null +++ b/SDRSharp.XDR/Tools/CustomTooltip.cs @@ -0,0 +1,39 @@ +using System; +using System.Drawing; +using System.Windows.Forms; + +namespace SDRSharp.XDR.Tools +{ + class CustomToolTip : ToolTip + { + Image img; + public CustomToolTip() + { + this.LoadImage(SDRSharp.XDR.Properties.Resources.ResourceManager.GetObject("Wolf")); + this.OwnerDraw = true; + this.Popup += new PopupEventHandler(this.OnPopup); + this.Draw += new DrawToolTipEventHandler(this.OnDraw); + } + + public void LoadImage(object ImageResource) + { + this.img = (Image)ImageResource; + } + public Image LoadImage() + { + return this.img; + } + + private void OnPopup(object sender, PopupEventArgs e) + { + e.ToolTipSize = new Size(LoadImage().Width, LoadImage().Height); + } + + private void OnDraw(object sender, DrawToolTipEventArgs e) + { + + + e.Graphics.DrawImage(img, 0, 0); + } + } +} diff --git a/SDRSharp.XDR/Tools/WinformTools.cs b/SDRSharp.XDR/Tools/WinformTools.cs new file mode 100644 index 0000000..5616df7 --- /dev/null +++ b/SDRSharp.XDR/Tools/WinformTools.cs @@ -0,0 +1,45 @@ +using System; +using System.Runtime.InteropServices; +using System.Windows.Forms; + +namespace SDRSharp.XDR +{ + public partial class AdvancedRDSWindow : Form //Hook into Title hover event https://stackoverflow.com/a/40683532/3368585 + { + [DllImport("user32.dll")] + private static extern int TrackMouseEvent(ref TRACK_MOUSE_EVENT lpEventTrack); + [StructLayout(LayoutKind.Sequential)] + private struct TRACK_MOUSE_EVENT + { + public uint cbSize; + public uint dwFlags; + public IntPtr hwndTrack; + public uint dwHoverTime; + public static readonly TRACK_MOUSE_EVENT Empty; + } + private TRACK_MOUSE_EVENT track = TRACK_MOUSE_EVENT.Empty; + const int WM_NCMOUSEMOVE = 0xA0; + const int WM_NCMOUSEHOVER = 0x2A0; + const int TME_HOVER = 0x1; + const int TME_NONCLIENT = 0x10; + public event EventHandler NonClientMouseHover; + protected override void WndProc(ref Message m) + { + base.WndProc(ref m); + if (m.Msg == WM_NCMOUSEMOVE) + { + track.hwndTrack = this.Handle; + track.cbSize = (uint)Marshal.SizeOf(track); + track.dwFlags = TME_HOVER | TME_NONCLIENT; + track.dwHoverTime = 500; + TrackMouseEvent(ref track); + } + if (m.Msg == WM_NCMOUSEHOVER) + { + var handler = NonClientMouseHover; + if (handler != null) + NonClientMouseHover(this, EventArgs.Empty); + } + } + } +} diff --git a/SDRSharp.XDR/UDP.cs b/SDRSharp.XDR/UDP.cs new file mode 100644 index 0000000..5fb0eef --- /dev/null +++ b/SDRSharp.XDR/UDP.cs @@ -0,0 +1,132 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Net; +using System.Net.Sockets; +using System.Text; +using System.Threading.Tasks; + +namespace SDRSharp.XDR +{ + class UDPServer + { + public static int listenPort = 8888; + public static void Serve() + { + bool done = false; + UdpClient listener = new UdpClient(listenPort); + IPEndPoint groupEP = new IPEndPoint(IPAddress.Any, listenPort); + byte[] receive_byte_array; + try + + { + while (!done) + { + Debug.WriteLine("Waiting for broadcast"); + + receive_byte_array = listener.Receive(ref groupEP); + if (groupEP != null) //If we have any data on UDP we have RDS + { + XDRPlugin.RDSDetected = true; + SerialCommands.ParseData(Encoding.ASCII.GetString(receive_byte_array, 0, receive_byte_array.Length)); + } + else + { + XDRPlugin.RDSDetected = false; + } + } + } + catch (Exception e) + { + Debug.WriteLine(e.ToString()); + } + listener.Close(); + } + } + class UDPClient + { + class Program + + { + static void test(string[] args) + { + Boolean done = false; + Boolean exception_thrown = false; + + Socket sending_socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, + ProtocolType.Udp); + + IPAddress send_to_address = IPAddress.Parse("192.168.2.255"); + + IPEndPoint sending_end_point = new IPEndPoint(send_to_address, 11000); + + #region comments + // The below three lines of code will not work. They appear to load + + // the variable broadcast_string witha broadcast address. But that + + // address causes an exception when performing the send. + + // + + //string broadcast_string = IPAddress.Broadcast.ToString(); + + //Console.WriteLine("broadcast_string contains {0}", broadcast_string); + + //send_to_address = IPAddress.Parse(broadcast_string); + + #endregion + + Console.WriteLine("Enter text to broadcast via UDP."); + Console.WriteLine("Enter a blank line to exit the program."); + while (!done) + { + Console.WriteLine("Enter text to send, blank line to quit"); + string text_to_send = Console.ReadLine(); + if (text_to_send.Length == 0) + { + done = true; + } + else + + { + // the socket object must have an array of bytes to send. + + // this loads the string entered by the user into an array of bytes. + + byte[] send_buffer = Encoding.ASCII.GetBytes(text_to_send); + + // Remind the user of where this is going. + + Console.WriteLine("sending to address: {0} port: {1}", + sending_end_point.Address, + sending_end_point.Port); + try + + { + sending_socket.SendTo(send_buffer, sending_end_point); + } + catch (Exception send_exception) + { + exception_thrown = true; + Console.WriteLine(" Exception {0}", send_exception.Message); + } + if (exception_thrown == false) + { + Console.WriteLine("Message has been sent to the broadcast address"); + } + else + + { + exception_thrown = false; + Console.WriteLine("The exception indicates the message was not sent."); + } + } + } // end of while (!done) + + } // end of main() + + } // end of class Program + } +} diff --git a/SDRSharp.XDR/XDRPlugin.cs b/SDRSharp.XDR/XDRPlugin.cs index f94c1f4..f6f8ac1 100644 --- a/SDRSharp.XDR/XDRPlugin.cs +++ b/SDRSharp.XDR/XDRPlugin.cs @@ -87,7 +87,11 @@ public void Close() public static ISharpControl _sdr; //for RDS + public static ushort RDS_PI; public static string RDS_Group = null; - public static bool RDSDetected; + public static bool RDSDetected = false; + + //For AdvancedRDSWindow + public static bool ExternalRDS = false; } }