QO100Tx_Rx/trxGui/Form1.cs
2025-10-20 20:11:21 +02:00

1763 lines
65 KiB
C#
Executable File

using System;
using System.Drawing;
using System.IO;
using System.Windows.Forms;
namespace trxGui
{
public partial class Form1 : Form
{
int window_width = 800;
int window_height = 480;
int spec_height = 88;
int wf_height = 70;
int button_size = 32;
Font bigfnt;
int lastsendtone = 0;
bool old_hwptt = false;
bool pttkey_pressed = false;
static public UdpQueue valq = new UdpQueue();
String screensafertime = "";
public Form1()
{
InitializeComponent();
try
{
String s = statics.RunExternalProgram("gsettings", "get org.gnome.desktop.session idle-delay");
screensafertime = s.Substring(7);
Console.WriteLine("disable screen saver. Time was:"+screensafertime);
statics.RunExternalProgram("gsettings", "set org.gnome.desktop.session idle-delay 0");
}
catch
{
screensafertime = "";
}
load_Setup();
panel_bigwf.MouseWheel += panel_bigwf_MouseWheel;
panel_bigspec.MouseWheel += panel_bigwf_MouseWheel;
panel_smallwf.MouseWheel += panel_smallwf_MouseWheel;
panel_smallspec.MouseWheel += panel_smallwf_MouseWheel;
// set the position of the GUI elements for various screen resolutions
scaleElements();
// center in screen, this makes it easy to use or adapt to screen sizes
CenterToScreen();
// test OS type
OperatingSystem osversion = System.Environment.OSVersion;
if (osversion.VersionString.Contains("indow"))
statics.ostype = 0; // Win$
else
statics.ostype = 1; // Linux
// if this program was started from another loacation
// set the working directory to the path of the .exe file
// so it can find trxdriver
try
{
String s = System.Reflection.Assembly.GetExecutingAssembly().Location;
s = Path.GetDirectoryName(s);
Directory.SetCurrentDirectory(s);
Console.WriteLine("working path: " + s);
}
catch (Exception e)
{
Console.WriteLine("cannot set working path: " + e.ToString());
}
Udp.InitUdp();
statics.StartQO100trx();
timer_draw.Start();
sendAndRefreshRXTXoffset();
}
// buttons left side, vertical row
int but_left_leftmargin = 5;
int but_left_topmargin = 4;
int but_left_width = 24;
int but_left_heigth = 36;
int but_left_spacing = 4;
void scaleElements()
{
int wsize = 0;
if (statics.windowsize == wsize++)
{
// sizes for screens 1920x1080 pixel
window_width = 1920;
window_height = 1080;
button_size = 64;
bigfnt = new Font("Verdana", 24.0f);
}
if (statics.windowsize == wsize++)
{
// sizes for screens 1600x1050 pixel
window_width = 1600;
window_height = 1050;
button_size = 64;
bigfnt = new Font("Verdana", 24.0f);
}
if (statics.windowsize == wsize++)
{
// sizes for screens 1200x720 pixel
window_width = 1155;
window_height = 720;
button_size = 48;
bigfnt = new Font("Verdana", 24.0f);
}
if (statics.windowsize == wsize++)
{
// sizes for screens 1200x480 pixel
window_width = 1155;
window_height = 480;
button_size = 32;
bigfnt = new Font("Verdana", 24.0f);
}
if (statics.windowsize == wsize++)
{
// sizes for screens 1024x768 pixel
window_width = 1024;
window_height = 768;
button_size = 40;
bigfnt = new Font("Verdana", 24.0f);
}
if (statics.windowsize == wsize++)
{
// sizes for screens 1024x600 pixel
window_width = 1024;
window_height = 600;
button_size = 32;
bigfnt = new Font("Verdana", 24.0f);
}
if (statics.windowsize == wsize++)
{
// sizes for screens 800x600 pixel
window_width = 800;
window_height = 600;
button_size = 32;
bigfnt = new Font("Verdana", 14.0f);
}
if (statics.windowsize == wsize++)
{
// sizes for screens 800x480 pixel
window_width = 800;
window_height = 480;
button_size = 32;
bigfnt = new Font("Verdana", 14.0f);
}
if (statics.windowsize == wsize++)
{
// sizes for screens 640x480 pixel
window_width = 640;
window_height = 480;
button_size = 32;
bigfnt = new Font("Verdana", 14.0f);
}
if (statics.windowsize == wsize++)
{
// sizes for screens 480x320 pixel
window_width = 480;
window_height = 320;
button_size = 20;
bigfnt = new Font("Verdana", 12.0f);
}
// size of complete window
this.Width = window_width;
this.Height = window_height;
panel_screen.Location = new Point(but_left_leftmargin, but_left_topmargin+40);
panel_screen.Width = but_left_width;
panel_screen.Height = but_left_heigth;
panel_sync.Location = new Point(but_left_leftmargin, panel_screen.Location.Y + panel_screen.Height + but_left_spacing);
panel_sync.Width = but_left_width;
panel_sync.Height = but_left_heigth;
panel_beaconlock.Location = new Point(but_left_leftmargin, panel_sync.Location.Y + panel_sync.Height + but_left_spacing);
panel_beaconlock.Width = but_left_width;
panel_beaconlock.Height = but_left_heigth;
panel_save.Location = new Point(but_left_leftmargin, panel_beaconlock.Location.Y + panel_beaconlock.Height + but_left_spacing);
panel_save.Width = but_left_width;
panel_save.Height = but_left_heigth;
panel_recall.Location = new Point(but_left_leftmargin, panel_save.Location.Y + panel_save.Height + but_left_spacing);
panel_recall.Width = but_left_width;
panel_recall.Height = but_left_heigth;
panel_testtone.Location = new Point(but_left_leftmargin, panel_recall.Location.Y + panel_recall.Height + but_left_spacing);
panel_testtone.Width = but_left_width;
panel_testtone.Height = but_left_heigth;
// main panels
int left = panel_screen.Location.X + panel_screen.Width + 4;
int panel_width = window_width - 15 - left;
int diagspacey = RectangleToScreen(ClientRectangle).Height - but_left_topmargin - 5 - 40 - 16 - 15 - 16 - 4 - button_size - 5;
spec_height = diagspacey / 4;
wf_height = diagspacey / 4;
panel_qrg.Location = new Point(left, but_left_topmargin);
panel_qrg.Width = panel_width;
panel_qrg.Height = 40;
panel_bigspec.Width = panel_width;
panel_bigspec.Height = spec_height;
panel_switchbandplan.Width = 16;
panel_switchbandplan.Height = 16;
panel_bandplan.Width = panel_width - panel_switchbandplan.Width;
panel_bandplan.Height = 16;
panel_bigwf.Width = panel_width;
panel_bigwf.Height = wf_height;
panel_rxline.Width = panel_width;
panel_rxline.Height = 15;
panel_smallspec.Width = panel_width;
panel_smallspec.Height = spec_height;
panel_smallqrg.Width = panel_width;
panel_smallqrg.Height = 16;
panel_smallwf.Width = panel_width;
panel_smallwf.Height = wf_height;
panel_bigspec.Location = new Point(left, panel_qrg.Location.Y + panel_qrg.Height + 5);
panel_bandplan.Location = new Point(left, panel_bigspec.Location.Y + panel_bigspec.Height);
panel_switchbandplan.Location = new Point(panel_bandplan.Location.X + panel_bandplan.Width, panel_bigspec.Location.Y + panel_bigspec.Height);
panel_bigwf.Location = new Point(left, panel_bandplan.Location.Y + panel_bandplan.Height);
panel_rxline.Location = new Point(left, panel_bigwf.Location.Y + panel_bigwf.Height);
panel_smallspec.Location = new Point(left, panel_rxline.Location.Y + panel_rxline.Height);
panel_smallqrg.Location = new Point(left, panel_smallspec.Location.Y + panel_smallspec.Height);
panel_smallwf.Location = new Point(left, panel_smallqrg.Location.Y + panel_smallqrg.Height);
// bottom buttons
int xspace = 4;
panel_pavucontrol.Size = panel_rxfilter.Size = panel_txfilter.Size = panel_rfloop.Size = panel_audioloop.Size = panel_comp.Size = panel_setup.Size = panel_info.Size = panel_rit.Size = panel_xit.Size = panel_copyRtoT.Size = panel_copyTtoR.Size = panel_agc.Size = panel_txmute.Size = new Size(button_size, button_size);
panel_rit.Location = new Point(left, panel_smallwf.Location.Y + panel_smallwf.Height + 4);
panel_xit.Location = new Point(panel_rit.Location.X + panel_rit.Width + xspace, panel_rit.Location.Y);
panel_copyRtoT.Location = new Point(panel_xit.Location.X + panel_xit.Width + xspace + 6, panel_rit.Location.Y);
panel_copyTtoR.Location = new Point(panel_copyRtoT.Location.X + panel_copyRtoT.Width + xspace, panel_rit.Location.Y);
panel_agc.Location = new Point(panel_copyTtoR.Location.X + panel_copyTtoR.Width + xspace + 6, panel_rit.Location.Y);
panel_txmute.Location = new Point(panel_agc.Location.X + panel_agc.Width + xspace, panel_rit.Location.Y);
panel_comp.Location = new Point(panel_txmute.Location.X + panel_txmute.Width + xspace, panel_rit.Location.Y);
panel_rxfilter.Location = new Point(panel_comp.Location.X + panel_comp.Width + xspace + 6, panel_rit.Location.Y);
panel_txfilter.Location = new Point(panel_rxfilter.Location.X + panel_rxfilter.Width + xspace, panel_rit.Location.Y);
panel_audioloop.Location = new Point(panel_txfilter.Location.X + panel_txfilter.Width + xspace + 6, panel_rit.Location.Y);
panel_rfloop.Location = new Point(panel_audioloop.Location.X + panel_audioloop.Width + xspace, panel_rit.Location.Y);
panel_info.Location = new Point(panel_bigspec.Location.X + panel_bigspec.Width - panel_info.Width, panel_rit.Location.Y);
panel_setup.Location = new Point(panel_info.Location.X - panel_setup.Width - 5, panel_rit.Location.Y);
panel_pavucontrol.Location = new Point(panel_setup.Location.X - panel_pavucontrol.Width - 5, panel_rit.Location.Y);
// PTT Panel
panel1.Location = new Point(panel_rfloop.Location.X + panel_rfloop.Width + xspace + 6, panel_rit.Location.Y);
panel1.Size = new Size(panel_pavucontrol.Location.X - panel1.Location.X - 6, panel_rfloop.Height);
statics.panel_bigspec_Width = panel_bigspec.Width;
statics.panel_bigspec_Height = panel_bigspec.Height;
statics.panel_bigwf_Width = panel_bigwf.Width;
statics.panel_bigwf_Height = panel_bigwf.Height;
statics.panel_smallspec_Width = panel_smallspec.Width;
statics.panel_smallspec_Height = panel_smallspec.Height;
statics.panel_smallwf_Width = panel_smallwf.Width;
statics.panel_smallwf_Height = panel_smallwf.Height;
}
DateTime dts = DateTime.UtcNow;
private void panel_bigspec_Paint(object sender, PaintEventArgs e)
{
Bitmap bm = Udp.getBigSpecBitmap();
if (bm != null)
{
e.Graphics.DrawImage(bm, 0, 0);
bm.Dispose();
}
}
bool pttstat = false;
private void timer_draw_Tick(object sender, EventArgs e)
{
timer_draw.Stop();
if (Udp.getBigSpecBitmap_avail())
{
panel_bigspec.Invalidate();
}
if (Udp.getSmallSpecBitmap_avail())
{
panel_smallspec.Invalidate();
}
if (Udp.getBigWFBitmap_avail())
{
panel_bigwf.Invalidate();
}
if (Udp.getSmallWFBitmap_avail())
{
panel_smallwf.Invalidate();
}
if (statics.pttmode == 0)
{
// PTT on/off
if (Control.ModifierKeys == Keys.Shift && pttstat == false)
{
// PTT pressed (shift key)
statics.ptt = !statics.ptt;
panel1.Invalidate();
setPTT(statics.ptt);
pttstat = true;
}
if (Control.ModifierKeys == Keys.None)
{
pttstat = false;
}
}
if (statics.pttmode == 1)
{
// Push to Talk
if (Control.ModifierKeys == Keys.Shift && !statics.ptt)
{
// PTT pressed (shift key)
statics.ptt = true;
pttkey_pressed = true;
panel1.Invalidate();
setPTT(statics.ptt);
}
if (Control.ModifierKeys == Keys.None && statics.ptt && pttkey_pressed)
{
// PTT released (shift key)
statics.ptt = false;
pttkey_pressed = false;
panel1.Invalidate();
setPTT(statics.ptt);
}
}
// change color of PTT button if ptt state changed in the driver
if(statics.hwptt != old_hwptt)
{
old_hwptt = statics.hwptt;
statics.ptt = statics.hwptt;
panel1.Invalidate();
}
if (statics.GotAudioDevices == 1)
{
// this is called once just after the trxdriver has started
// do all init jobs here which needs a running trxdriver
// just got the list of audio devices
statics.GotAudioDevices = 0;
// check if the current selected device is in the new device list
bool pbfound = false;
foreach(String s in statics.AudioPBdevs)
{
if(s == statics.AudioPBdev)
{
pbfound = true;
break;
}
}
bool capfound = false;
foreach (String s in statics.AudioCAPdevs)
{
if (s == statics.AudioCAPdev)
{
capfound = true;
break;
}
}
if(!pbfound)
{
Console.WriteLine("NO Playback Device found, using default");
if (statics.AudioPBdevs.Length == 0)
statics.AudioPBdev = "Default";
else
statics.AudioPBdev = statics.AudioPBdevs[0];
}
if (!capfound)
{
Console.WriteLine("NO Captur Device found, using default");
if (statics.AudioCAPdevs.Length == 0)
statics.AudioCAPdev = "Default";
else
statics.AudioCAPdev = statics.AudioCAPdevs[0];
}
statics.newaudiodevs = true;
sendAudioDevs();
statics.sendBaseQRG();
sendPlutoAddress();
panel_comp_Click(null, null); // send "compress"
panel_agc_Click(null, null); // send "AGC"
panel_txmute_Click(null, null);
panel_rxfilter_Click(null, null);
panel_txfilter_Click(null, null);
statics.sendReferenceOffset(statics.rfoffset);
sendCpuSpeed();
sendTXpower();
sendPTTmode();
this.Text += " GUI: " + formatSN(statics.gui_serno) + " Driver: " + formatSN(statics.driver_serno);
// check consistency
if(statics.gui_serno != statics.driver_serno)
{
MessageBox.Show("Warning!\nGUI and Driver have different serial numbers. Please re-install this software", "Version Number Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
// check for updates
try
{
using (StreamReader sr = new StreamReader("version.txt"))
{
int actver = ReadInt(sr);
Console.WriteLine("act version:" + actver);
if(actver > statics.gui_serno)
{
//MessageBox.Show("a new Version is avialable at Github:" + actver.ToString(), "NEW VERSION", MessageBoxButtons.OK, MessageBoxIcon.Information);
String nv = " (new:V" + ((double)actver / 100).ToString() + ")";
this.Text += nv.Replace(',', '.');
}
}
File.Delete("version.txt");
}
catch { }
panel_beaconlock.Invalidate();
}
if(statics.beaconoffset != oldbcnoffset)
{
oldbcnoffset = statics.beaconoffset;
panel_qrg.Invalidate();
}
int rsteps = Udp.GetRotary();
if(rsteps != 0)
{
int b = Math.Abs(rsteps);
int factor = 10000;
if (b == 1) factor = 25;
else if (b == 2) factor = 50;
else if (b == 3) factor = 100;
else if (b == 4) factor = 250;
else if (b == 5) factor = 500;
else if (b == 6) factor = 1000;
if (rsteps > 0) factor = -factor;
if (statics.rit)
statics.RXoffset += factor;
if (statics.xit)
statics.TXoffset += factor;
if (statics.rit || statics.xit)
sendAndRefreshRXTXoffset();
}
if (statics.corrfact != 0)
{
if (statics.corractive > 0)
{
if (statics.autosync)
{
Console.WriteLine("correct by corrfact: " + statics.corrfact);
statics.RXoffset -= statics.corrfact;
statics.TXoffset -= statics.corrfact;
sendAndRefreshRXTXoffset();
}
statics.corractive--;
}
statics.corrfact = 0;
}
if(lastsendtone != statics.sendtone)
{
panel_testtone.Invalidate();
lastsendtone = statics.sendtone;
}
if(valq.Count() > 0)
{
Byte[] tarr = valq.Getarr();
Udp.UdpSendData(tarr);
}
timer_draw.Start();
}
private String formatSN(int sn)
{
String s = "V";
s += (sn / 100).ToString();
s += ".";
s += (sn - (sn / 100) * 100).ToString();
return s;
}
int oldbcnoffset = -1;
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
statics.StartQO100trx(false);
save_Setup();
if (screensafertime.Length > 0)
{
try
{
Console.WriteLine("restore screen saver time:" + screensafertime);
statics.RunExternalProgram("gsettings", "set org.gnome.desktop.session idle-delay " + screensafertime);
}
catch {}
}
statics.running = false;
}
private void panel_smallspec_Paint(object sender, PaintEventArgs e)
{
Bitmap bm = Udp.getSmallSpecBitmap();
if (bm != null)
{
e.Graphics.DrawImage(bm, 0, 0);
bm.Dispose();
}
}
private void panel_bigwf_Paint(object sender, PaintEventArgs e)
{
Bitmap bm = Udp.getBigWFBitmap();
if (bm != null)
{
e.Graphics.DrawImage(bm, 0, 0);
bm.Dispose();
}
}
private void panel_smallwf_Paint(object sender, PaintEventArgs e)
{
Bitmap bm = Udp.getSmallWFBitmap();
if (bm != null)
{
e.Graphics.DrawImage(bm, 0, 0);
bm.Dispose();
}
}
private void panel_bigwf_MouseClick(object sender, MouseEventArgs e)
{
tuneBig(e);
statics.corractive = statics.corractiveanz;
}
private void panel_smallwf_MouseClick(object sender, MouseEventArgs e)
{
tuneSmall(e);
}
private void tuneBig(MouseEventArgs e)
{
int x = e.X;
x = x * 1120 / panel_bigspec.Width;
// left mouse button or touch panel click
if (e.Button == MouseButtons.Left)
{
if (statics.calmode == 0)
{
// normal operation
// if both, RX and TX, is selected, keep offset between RX and TX
if (statics.rit && statics.xit)
{
statics.RXTXoffset = statics.RXoffset - statics.TXoffset;
statics.RXoffset = x * 500;
statics.TXoffset = x * 500 - statics.RXTXoffset;
}
else if (statics.rit)
statics.RXoffset = x * 500;
else if (statics.xit)
statics.TXoffset = x * 500;
statics.RXTXoffset = statics.RXoffset - statics.TXoffset;
sendAndRefreshRXTXoffset();
}
else if (statics.calmode == 1)
{
// cal to BPSK beacon
int off = x * 500 - 280000;
//Console.WriteLine("Pluto offset: " + off + " Hz");
if(off > 0)
statics.calfreq += (UInt32)off;
else if (off < 0)
statics.calfreq -= (UInt32)(-off);
statics.sendBaseQRG(statics.calfreq);
}
else if (statics.calmode == 2)
{
int off = x * 500 - 280000;
//Console.WriteLine("offset: " + off);
statics.lnboffset += off;
statics.sendBaseQRG();
}
}
if (e.Button == MouseButtons.Right)
{
statics.RXoffset = x * 500;
statics.TXoffset = x * 500;
sendAndRefreshRXTXoffset();
}
}
private void sendAndRefreshRXTXoffset()
{
statics.sendRXTXoffset();
panel_qrg.Invalidate();
panel_rxline.Invalidate();
}
private void tuneSmall(MouseEventArgs e)
{
// small WF: 25Hz per pixel, with the tune qrg in the middle
int x = e.X;
x = x * 1120 / panel_smallwf.Width;
int hz = (x - 560) * 25;
if (e.Button == MouseButtons.Left)
{
if (statics.calmode == 0)
{
if(statics.rit)
statics.RXoffset += hz;
if (statics.xit)
statics.TXoffset += hz;
sendAndRefreshRXTXoffset();
}
else if (statics.calmode == 1)
{
//Console.WriteLine("Pluto offset: " + hz);
if (hz > 0)
statics.calfreq += (UInt32)hz;
else if (hz < 0)
statics.calfreq -= (UInt32)(-hz);
statics.sendBaseQRG(statics.calfreq);
//Console.WriteLine("calfreq: " + statics.calfreq);
}
else if (statics.calmode == 2)
{
Console.WriteLine("offset: " + hz);
statics.lnboffset += hz;
statics.sendBaseQRG();
}
}
if (e.Button == MouseButtons.Right)
{
statics.RXoffset += hz;
statics.TXoffset += hz;
sendAndRefreshRXTXoffset();
}
}
private void panel_bigwf_MouseWheel(object sender, MouseEventArgs e)
{
int factor = 100;
if (Control.ModifierKeys == Keys.Alt) factor = 1000;
if (Control.ModifierKeys == Keys.Control) factor = 10000;
if (statics.rit)
{
if (e.Delta > 0) //wheel direction
statics.RXoffset += factor;
else
statics.RXoffset -= factor;
}
if (statics.xit)
{
if (e.Delta > 0) //wheel direction
statics.TXoffset += factor;
else
statics.TXoffset -= factor;
}
if (statics.rit || statics.xit)
sendAndRefreshRXTXoffset();
}
private void panel_smallwf_MouseWheel(object sender, MouseEventArgs e)
{
if (statics.rit)
{
if (e.Delta > 0) //wheel direction
statics.RXoffset += 10;
else
statics.RXoffset -= 10;
}
if (statics.xit)
{
if (e.Delta > 0) //wheel direction
statics.TXoffset += 10;
else
statics.TXoffset -= 10;
}
if (statics.rit || statics.xit)
sendAndRefreshRXTXoffset();
}
private void panel_bigwf_MouseHover(object sender, EventArgs e)
{
panel_bigwf.Focus();
}
private void panel_bigwf_MouseMove(object sender, MouseEventArgs e)
{
panel_bigwf.Focus();
int x = e.X * 1120 / panel_bigspec.Width;
statics.rxmouse = x * 500;
panel_qrg.Invalidate();
}
private void panel_bigspec_MouseLeave(object sender, EventArgs e)
{
statics.rxmouse = -1;
panel_qrg.Invalidate();
}
private void panel_bigspec_MouseMove(object sender, MouseEventArgs e)
{
panel_bigspec.Focus();
int x = e.X * 1120 / panel_bigspec.Width;
statics.rxmouse = x * 500;
panel_qrg.Invalidate();
}
private void panel_smallspec_MouseLeave(object sender, EventArgs e)
{
statics.rxmouse = -1;
panel_qrg.Invalidate();
}
private void panel_smallspec_MouseMove(object sender, MouseEventArgs e)
{
panel_smallspec.Focus();
int x = e.X * 1120 / panel_bigspec.Width;
int hz = (x - 560) * 25;
statics.rxmouse = statics.RXoffset + hz;
panel_qrg.Invalidate();
}
private void panel_smallwf_MouseLeave(object sender, EventArgs e)
{
statics.rxmouse = -1;
panel_qrg.Invalidate();
}
private void panel_smallwf_MouseMove(object sender, MouseEventArgs e)
{
panel_smallwf.Focus();
int x = e.X * 1120 / panel_bigspec.Width;
int hz = (x - 560) * 25;
statics.rxmouse = statics.RXoffset + hz;
panel_qrg.Invalidate();
}
private void panel_bigwf_MouseLeave(object sender, EventArgs e)
{
statics.rxmouse = -1;
panel_qrg.Invalidate();
}
private void panel_bigspec_MouseHover(object sender, EventArgs e)
{
panel_bigspec.Focus();
}
private void panel_smallspec_MouseHover(object sender, EventArgs e)
{
panel_smallspec.Focus();
}
private void panel_smallwf_MouseHover(object sender, EventArgs e)
{
panel_smallwf.Focus();
}
Font smallfnt = new Font("Verdana", 8.0f);
private void panel_smallqrg_Paint(object sender, PaintEventArgs e)
{
using(Graphics gr = e.Graphics)
{
String s = "0 Hz";
int x = panel_smallqrg.Width / 2 - 10;
gr.DrawString(s, smallfnt, Brushes.Black, x, 0);
for(int i=120; i<500; i+=120)
{
s = (i * 25 / 1000).ToString() + "kHz";
x = i * panel_smallqrg.Width / 1120 + panel_smallqrg.Width / 2 - 10;
gr.DrawString(s, smallfnt, Brushes.Black, x, 0);
}
for (int i = -120; i > -500; i -= 120)
{
s = (i * 25 / 1000).ToString() + "kHz";
x = i * panel_smallqrg.Width / 1120 + panel_smallqrg.Width / 2 - 10;
gr.DrawString(s, smallfnt, Brushes.Black, x, 0);
}
}
}
int qrgToPixelpos(int qrg)
{
qrg -= 10489000; // rest is kHz
qrg -= 470;
qrg *= 2;
qrg = qrg * panel_bigspec.Width / 1120;
return qrg;
}
private void panel_bandplan_Paint(object sender, PaintEventArgs e)
{
Font qrgfnt = new Font("Verdana", 9.0f);
Font bpfnt;
if (panel_bigspec.Width > 1000)
bpfnt = new Font("Verdana", 9.0f);
else
bpfnt = new Font("Verdana", 8.0f);
Bandplan bp = new Bandplan();
using (Graphics gr = e.Graphics)
{
if (statics.bandplan_mode == 0)
{
gr.FillRectangle(new SolidBrush(Color.DarkBlue), 0, 0, panel_bandplan.Width, panel_bandplan.Height);
if(panel_bigspec.Width > 1000)
gr.DrawString("Bandplan", bpfnt, Brushes.White, 0, -1);
for (int i = 0; i < bp.be.Length - 1; i++)
{
int x = qrgToPixelpos(bp.be[i].from);
int w = qrgToPixelpos(bp.be[i + 1].from) - x;
Color col = bp.be[i].col;
gr.FillRectangle(new SolidBrush(col), x, 0, w, panel_bandplan.Height);
String s = bp.be[i].text;
int spos = qrgToPixelpos(bp.be[i].textpos);
gr.DrawString(s, bpfnt, Brushes.White, spos, -1);
}
}
else if (statics.bandplan_mode == 1)
{
// QO100 RX qrgs
gr.FillRectangle(new SolidBrush(Color.DarkBlue), 0, 0, panel_bandplan.Width, panel_bandplan.Height);
if (panel_bigspec.Width > 1000)
gr.DrawString("RX", qrgfnt, Brushes.White, 0, -1);
for (int qrg = 10489500; qrg <= 10490000; qrg += 50)
{
int spos = qrgToPixelpos(qrg);
if (qrg > 10489500)
{
String sqrg = (qrg - 10489000).ToString();
gr.DrawString(sqrg, qrgfnt, Brushes.White, spos - 12, 0);
}
else
{
String sqrg = String.Format("{0:0.000}", (double)qrg / 1000.0);
gr.DrawString(sqrg, qrgfnt, Brushes.White, spos - 30, 0);
}
}
}
else if (statics.bandplan_mode == 2)
{
// QO100 TX qrgs
gr.FillRectangle(new SolidBrush(Color.DarkBlue), 0, 0, panel_bandplan.Width, panel_bandplan.Height);
if (panel_bigspec.Width > 1000)
gr.DrawString("TX", qrgfnt, Brushes.White, 0, -1);
for (int qrg = 10489500; qrg <= 10490000; qrg += 50)
{
int spos = qrgToPixelpos(qrg);
if (qrg > 10489500)
{
String sqrg = (qrg - 2400000- 8089500).ToString();
gr.DrawString(sqrg, qrgfnt, Brushes.White, spos - 12, 0);
}
else
{
String sqrg = String.Format("{0:0.000}", (qrg - 8089500) / 1000.0);
gr.DrawString(sqrg, qrgfnt, Brushes.White, spos - 30, 0);
}
}
}
else if (statics.bandplan_mode == 3)
{
// Pluto RX qrgs
gr.FillRectangle(new SolidBrush(Color.DarkBlue), 0, 0, panel_bandplan.Width, panel_bandplan.Height);
if (panel_bigspec.Width > 1000)
gr.DrawString("RX", qrgfnt, Brushes.White, 0, -1);
for (int qrg = (int)statics.rxqrg - 250000; qrg <= (int)statics.rxqrg + 250000; qrg += 50000)
{
int spos = qrgToPixelpos(qrg/1000 + 10489000 - (qrg/1000000)*1000);
if (qrg > ((int)statics.rxqrg - 250000))
{
String sqrg = ((qrg - (((int)statics.rxqrg) / 1000000) * 1000000)/1000).ToString();
gr.DrawString(sqrg, qrgfnt, Brushes.White, spos - 12, 0);
}
else
{
String sqrg = String.Format("{0:0.000}", (double)qrg / 1000000.0);
gr.DrawString(sqrg, qrgfnt, Brushes.White, spos - 30, 0);
}
}
}
else if (statics.bandplan_mode == 4)
{
// Pluto TX qrgs
gr.FillRectangle(new SolidBrush(Color.DarkBlue), 0, 0, panel_bandplan.Width, panel_bandplan.Height);
if (panel_bigspec.Width > 1000)
gr.DrawString("TX", qrgfnt, Brushes.White, 0, -1);
for (Int64 qrg = (Int64)statics.txqrg - 250000; qrg <= (Int64)statics.txqrg + 250000; qrg += 50000)
{
int spos = qrgToPixelpos((int)(qrg / 1000 + 10489500 - (qrg / 1000000) * 1000));
if (qrg > ((Int64)statics.txqrg - 250000))
{
String sqrg = ((qrg - (((Int64)statics.txqrg) / 1000000) * 1000000) / 1000).ToString();
gr.DrawString(sqrg, qrgfnt, Brushes.White, spos - 12, 0);
}
else
{
String sqrg = String.Format("{0:0.000}", (double)qrg / 1000000.0);
gr.DrawString(sqrg, qrgfnt, Brushes.White, spos - 30, 0);
}
}
}
}
}
Font smlfnt = new Font("Verdana", 10.0f);
int titrightpos = 10;
int mouserightpos = 790;
int bigy = 2;
// insert a space betwenn each char:
// string.Join(" ", s.ToCharArray())
Brush brushrx = new SolidBrush(Color.FromArgb(0, 230, 100));
Brush brushtx = new SolidBrush(Color.FromArgb(160, 0, 0));
private void panel_qrg_Paint(object sender, PaintEventArgs e)
{
using (Graphics gr = e.Graphics)
{
if (panel_bigspec.Width > 900)
{
int mrp = mouserightpos;
if (panel_bigspec.Width > 1300)
mrp = 1300;
double val = (double)(statics.RXoffset + 10489470000) / 1e6;
String s = String.Format("RX:" + "{0:0.000000}" + " MHz", val);
gr.DrawString(s, bigfnt, brushrx, titrightpos, bigy);
val = (double)(statics.TXoffset + 10489470000) / 1e6 - 8089.5;
s = String.Format("TX:" + "{0:0.000000}" + " MHz", val);
gr.DrawString(s, bigfnt, brushtx, 420 + titrightpos, bigy);
if (statics.rxmouse != -1)
{
val = (double)(statics.rxmouse + 10489470000) / 1e6;
s = String.Format(language.GetText("Mouse:") + " {0:0.000000}", val);
gr.DrawString(s, smlfnt, Brushes.Blue, mrp + titrightpos, 0);
}
else
{
gr.FillRectangle(Brushes.Gray, mrp + titrightpos, 0, panel_qrg.Width - (mrp + titrightpos), panel_qrg.Height);
}
s = String.Format("Drift : {0:0}" + " Hz", statics.beaconoffset);
if (statics.beaconlock) s += " (corr)";
gr.DrawString(s, smlfnt, Brushes.Blue, mrp + titrightpos, 20);
}
else
{
double val = (double)(statics.RXoffset + 10489470000) / 1e6;
String s = String.Format("RX:" + "{0:0.000000}" + " MHz", val);
gr.DrawString(s, bigfnt, Brushes.Green, titrightpos, bigy-5);
val = (double)(statics.TXoffset + 10489470000) / 1e6 - 8089.5;
s = String.Format("TX:" + "{0:0.000000}" + " MHz", val);
gr.DrawString(s, bigfnt, Brushes.DarkRed, titrightpos, bigy+16);
int mrp = 420;
if (panel_bigspec.Width < 700) mrp = 390;
if (panel_bigspec.Width < 500) mrp = 250;
if (statics.rxmouse != -1)
{
val = (double)(statics.rxmouse + 10489470000) / 1e6;
s = String.Format(language.GetText("Mouse:") + " {0:0.000000}", val);
gr.DrawString(s, smlfnt, Brushes.Blue, mrp + titrightpos, 0);
}
else
{
gr.FillRectangle(Brushes.Gray, mrp + titrightpos, 0, panel_qrg.Width - (mrp + titrightpos), panel_qrg.Height);
}
s = String.Format("Drift : {0:0}" + " Hz", statics.beaconoffset);
if (statics.beaconlock) s += " (corr)";
gr.DrawString(s, smlfnt, Brushes.Blue, mrp + titrightpos, 20);
}
}
}
private void setPTT(bool onoff)
{
Byte[] txb = new Byte[2];
txb[0] = 4;
txb[1] = (Byte)(onoff ? 1 : 0);
Udp.UdpSendData(txb);
}
private void panel1_Paint(object sender, PaintEventArgs e)
{
using (Graphics gr = e.Graphics)
{
if (statics.ptt)
{
gr.FillRectangle(Brushes.Red, 0, 0, panel1.Width, panel1.Height);
using (Bitmap bm = new Bitmap(Properties.Resources.ptt_tx))
drawBitmap(gr, bm, panel1.Width / 2 - bm.Width / 2, 0,button_size*2);
}
else
{
gr.FillRectangle(Brushes.Green, 0, 0, panel1.Width, panel1.Height);
using (Bitmap bm = new Bitmap(Properties.Resources.ptt_rx))
drawBitmap(gr, bm, panel1.Width / 2 - bm.Width / 2, 0, button_size * 2);
}
}
}
private void panel1_MouseClick(object sender, MouseEventArgs e)
{
if (statics.pttmode == 0)
{
if (statics.ptt) statics.ptt = false;
else statics.ptt = true;
setPTT(statics.ptt);
panel1.Invalidate();
}
}
private void panel1_MouseDown(object sender, MouseEventArgs e)
{
if (statics.pttmode == 1 && !statics.ptt)
{
statics.ptt = true;
setPTT(statics.ptt);
panel1.Invalidate();
}
}
private void panel1_MouseUp(object sender, MouseEventArgs e)
{
if (statics.pttmode == 1 && statics.ptt)
{
statics.ptt = false;
setPTT(statics.ptt);
panel1.Invalidate();
}
}
private void butto_setup_click(object sender, EventArgs e)
{
int oldpluto = statics.plutousb;
String oldpladr = statics.plutoaddress;
Form_setup setupForm = new Form_setup();
// Show the settings form
var res = setupForm.ShowDialog();
if(res == DialogResult.OK)
{
sendAudioDevs();
statics.sendBaseQRG();
statics.sendReferenceOffset(statics.rfoffset);
sendCpuSpeed();
sendTXpower();
sendPTTmode();
save_Setup();
if (oldpluto != statics.plutousb || oldpladr != statics.plutoaddress)
{
// pluto setting has been changed, restart required
MessageBox.Show("Pluto settings changed. Press OK to close this software, then start it again", "RESTART REQUIRED", MessageBoxButtons.OK, MessageBoxIcon.Warning);
Close();
}
}
}
private void sendAudioDevs()
{
try
{
if (!statics.newaudiodevs) return;
statics.newaudiodevs = false;
//Console.WriteLine("<" + statics.AudioPBdev.Trim() + ">" + "<" + statics.AudioCAPdev + ">");
Byte[] pb = statics.StringToByteArrayUtf8(statics.AudioPBdev.Trim());
Byte[] cap = statics.StringToByteArrayUtf8(statics.AudioCAPdev.Trim());
if (pb.Length > 100 || cap.Length > 100) return;
Byte[] txb = new Byte[201];
for (int i = 0; i < txb.Length; i++) txb[i] = 0;
Array.Copy(pb, 0, txb, 1, pb.Length);
Array.Copy(cap, 0, txb, 101, cap.Length);
txb[0] = 7;
Udp.UdpSendData(txb);
}
catch
{
// no audio devs
}
}
private String ReadString(StreamReader sr)
{
try
{
String s = sr.ReadLine();
if (s != null)
{
return s;
}
}
catch { }
return " ";
}
private int ReadInt(StreamReader sr)
{
int v;
try
{
String s = sr.ReadLine();
if (s != null)
{
v = Convert.ToInt32(s);
return v;
}
}
catch { }
return 0;
}
private UInt32 ReadUInt32(StreamReader sr)
{
UInt32 v;
try
{
String s = sr.ReadLine();
if (s != null)
{
v = Convert.ToUInt32(s);
return v;
}
}
catch { }
return 0;
}
private double ReadMyDouble(StreamReader sr)
{
double v;
try
{
String s = sr.ReadLine();
if (s != null)
{
v = statics.MyToDouble(s);
return v;
}
}
catch { }
return 0;
}
void load_Setup()
{
try
{
String fn = statics.getHomePath("", "trx.cfg");
using (StreamReader sr = new StreamReader(fn))
{
statics.AudioPBdev = ReadString(sr);
statics.AudioCAPdev = ReadString(sr);
statics.RXTXoffset = ReadInt(sr); statics.TXoffset -= statics.RXTXoffset;
String dummy3 = ReadString(sr);
statics.plutousb = ReadInt(sr);
statics.plutoaddress = ReadString(sr);
String dummy1 = ReadString(sr);
bool dummy2 = ReadString(sr) == "1";
statics.compressor = ReadString(sr) == "1";
statics.rxfilter = ReadInt(sr);
statics.txfilter = ReadInt(sr);
statics.rxmute = ReadString(sr) == "1";
statics.rit = ReadString(sr) == "1";
statics.xit = ReadString(sr) == "1";
String dummy4 = ReadString(sr);
statics.beaconlock = ReadString(sr) == "1";
statics.rxqrg = ReadUInt32(sr);
statics.txqrg = ReadUInt32(sr);
statics.rfoffset = ReadInt(sr);
statics.lnboffset = ReadInt(sr);
statics.cpuspeed = ReadInt(sr);
statics.bandplan_mode = ReadInt(sr);
statics.language = ReadInt(sr);
statics.palette = ReadInt(sr);
statics.audioHighpass = ReadString(sr) == "1";
statics.txpower = ReadInt(sr);
statics.windowsize = ReadInt(sr);
statics.autosync = ReadString(sr) == "1";
statics.pttmode = ReadInt(sr);
statics.micboost = ReadInt(sr);
}
}
catch
{
}
}
void save_Setup()
{
try
{
using (StreamWriter sw = new StreamWriter(statics.getHomePath("", "trx.cfg")))
{
sw.WriteLine(statics.AudioPBdev);
sw.WriteLine(statics.AudioCAPdev);
sw.WriteLine(statics.RXTXoffset.ToString());
sw.WriteLine("");
sw.WriteLine(statics.plutousb.ToString());
sw.WriteLine(statics.plutoaddress);
sw.WriteLine("");
sw.WriteLine("");
sw.WriteLine(statics.compressor ? "1" : "0");
sw.WriteLine(statics.rxfilter.ToString());
sw.WriteLine(statics.txfilter.ToString());
sw.WriteLine(statics.rxmute ? "1" : "0");
sw.WriteLine(statics.rit ? "1" : "0");
sw.WriteLine(statics.xit ? "1" : "0");
sw.WriteLine("");
sw.WriteLine(statics.beaconlock ? "1" : "0");
sw.WriteLine(statics.rxqrg.ToString());
sw.WriteLine(statics.txqrg.ToString());
sw.WriteLine(statics.rfoffset.ToString());
sw.WriteLine(statics.lnboffset.ToString());
sw.WriteLine(statics.cpuspeed.ToString());
sw.WriteLine(statics.bandplan_mode.ToString());
sw.WriteLine(statics.language.ToString());
sw.WriteLine(statics.palette.ToString());
sw.WriteLine(statics.audioHighpass ? "1" : "0");
sw.WriteLine(statics.txpower.ToString());
sw.WriteLine(statics.windowsize.ToString());
sw.WriteLine(statics.autosync ? "1" : "0");
sw.WriteLine(statics.pttmode.ToString());
sw.WriteLine(statics.micboost.ToString());
}
}
catch { }
}
private void bt_info_click(object sender, EventArgs e)
{
Form_info fi = new Form_info();
// Show the settings form
var res = fi.ShowDialog();
if (res == DialogResult.OK)
{
}
}
private void sendPlutoAddress()
{
//Console.WriteLine("send pluto ID <" + statics.plutoaddress.Trim() + ">");
Byte[] iparr = statics.StringToByteArrayUtf8(statics.plutoaddress.Trim());
Byte[] txb = new Byte[iparr.Length + 2];
txb[0] = 10;
txb[1] = (Byte)statics.plutousb;
Array.Copy(iparr, 0, txb, 2, iparr.Length);
Udp.UdpSendData(txb);
}
private void panel_rit_Click(object sender, EventArgs e)
{
statics.rit = !statics.rit;
panel_rit.Invalidate();
}
private void panel_xit_Click(object sender, EventArgs e)
{
statics.xit = !statics.xit;
panel_xit.Invalidate();
}
private void drawBitmap(Graphics gr, Bitmap bm, int x=0, int y=0, int sizex=0)
{
Bitmap bm_resized;
if (sizex != 0)
bm_resized = new Bitmap(bm, sizex, button_size);
else
bm_resized = new Bitmap(bm, button_size, button_size);
gr.DrawImage(bm_resized, x, y);
}
private void drawButtonPanel(Graphics gr, bool state, Bitmap bm, Bitmap bminact)
{
if (state)
drawBitmap(gr, bm);
else
drawBitmap(gr, bminact);
}
private void panel_rit_Paint(object sender, PaintEventArgs e)
{
using (Bitmap bm = new Bitmap(Properties.Resources.rxqrg))
using (Bitmap bminact = new Bitmap(Properties.Resources.rxqrg_inact))
drawButtonPanel(e.Graphics, statics.rit, bm, bminact);
}
private void panel_xit_Paint(object sender, PaintEventArgs e)
{
using (Bitmap bm = new Bitmap(Properties.Resources.txqrg))
using (Bitmap bminact = new Bitmap(Properties.Resources.txqrg_inact))
drawButtonPanel(e.Graphics, statics.xit, bm, bminact);
}
private void panel_copyRtoT_Paint(object sender, PaintEventArgs e)
{
using (Bitmap bm = new Bitmap(Properties.Resources.rt_button))
using (Bitmap bminact = new Bitmap(Properties.Resources.rt_button_inact))
drawButtonPanel(e.Graphics,true, bm, bminact);
}
private void panel_copyTtoR_Paint(object sender, PaintEventArgs e)
{
using (Bitmap bm = new Bitmap(Properties.Resources.tr_button))
using (Bitmap bminact = new Bitmap(Properties.Resources.tr_button_inact))
drawButtonPanel(e.Graphics, true, bm, bminact);
}
private void panel_copyRtoT_Click(object sender, EventArgs e)
{
statics.TXoffset = statics.RXoffset;
statics.RXTXoffset = 0;
sendAndRefreshRXTXoffset();
panel_copyRtoT.Invalidate();
}
private void panel_agc_Paint(object sender, PaintEventArgs e)
{
using (Bitmap bm = new Bitmap(Properties.Resources.txaudio_button))
drawButtonPanel(e.Graphics, true, bm, null);
}
private void panel_txmute_Paint(object sender, PaintEventArgs e)
{
using (Bitmap bm = new Bitmap(Properties.Resources.mute))
using (Bitmap bminact = new Bitmap(Properties.Resources.mute_inact))
drawButtonPanel(e.Graphics, statics.rxmute, bm, bminact);
}
void sendCpuSpeed()
{
Byte[] txb = new Byte[2];
txb[0] = 17;
txb[1] = (Byte)statics.cpuspeed;
Udp.UdpSendData(txb);
}
void sendPTTmode()
{
Byte[] txb = new Byte[2];
txb[0] = 23;
txb[1] = (Byte)statics.pttmode;
Udp.UdpSendData(txb);
}
void sendTXpower()
{
Byte[] txb = new Byte[2];
txb[0] = 19;
txb[1] = (Byte)Math.Abs(statics.txpower); // send positive value
Udp.UdpSendData(txb);
}
private void panel_agc_Click(object sender, EventArgs e)
{
if (e != null)
{
// check if alraey open
foreach (Form frm in Application.OpenForms)
if (frm.Name == "Form2_agc") return;
Form2_agc frmagc = new Form2_agc(Location,valq);
frmagc.Show();
}
else
{
// init after program start
Byte[] txb = new Byte[3];
txb[0] = 11;
txb[1] = (Byte)(statics.audioHighpass ? 1 : 0);
txb[2] = (Byte)statics.micboost;
Udp.UdpSendData(txb);
}
}
private void panel_txmute_Click(object sender, EventArgs e)
{
if (e != null) statics.rxmute = !statics.rxmute;
Byte[] txb = new Byte[2];
txb[0] = 14;
txb[1] = (Byte)(statics.rxmute ? 1 : 0);
Udp.UdpSendData(txb);
panel_txmute.Invalidate();
}
private void panel_comp_Click(object sender, EventArgs e)
{
if (e != null) statics.compressor = !statics.compressor;
Byte[] txb = new Byte[2];
txb[0] = 9;
txb[1] = (Byte)(statics.compressor?1:0); // compression factor
Udp.UdpSendData(txb);
panel_comp.Invalidate();
}
private void panel_comp_Paint(object sender, PaintEventArgs e)
{
using (Bitmap bm = new Bitmap(Properties.Resources.comp_on))
using (Bitmap bminact = new Bitmap(Properties.Resources.comp_off))
drawButtonPanel(e.Graphics, statics.compressor, bm, bminact);
}
private void panel_copyTtoR_Click(object sender, EventArgs e)
{
statics.RXoffset = statics.TXoffset;
statics.RXTXoffset = 0;
sendAndRefreshRXTXoffset();
panel_copyTtoR.Invalidate();
}
private void panel_rxfilter_Paint(object sender, PaintEventArgs e)
{
switch (statics.rxfilter)
{
case 0:
using (Bitmap bm = new Bitmap(Properties.Resources.rx_filter_1))
drawBitmap(e.Graphics, bm);
break;
case 1:
using (Bitmap bm = new Bitmap(Properties.Resources.rx_filter_18))
drawBitmap(e.Graphics, bm);
break;
case 2:
using (Bitmap bm = new Bitmap(Properties.Resources.rx_filter_27))
drawBitmap(e.Graphics, bm);
break;
case 3:
using (Bitmap bm = new Bitmap(Properties.Resources.rx_filter_36))
drawBitmap(e.Graphics, bm);
break;
}
}
private void panel_txfilter_Paint(object sender, PaintEventArgs e)
{
switch (statics.txfilter)
{
case 0:
using (Bitmap bm = new Bitmap(Properties.Resources.tx_filter_1))
drawBitmap(e.Graphics, bm);
break;
case 1:
using (Bitmap bm = new Bitmap(Properties.Resources.tx_filter_18))
drawBitmap(e.Graphics, bm);
break;
case 2:
using (Bitmap bm = new Bitmap(Properties.Resources.tx_filter_22))
drawBitmap(e.Graphics, bm);
break;
case 3:
case 4:
using (Bitmap bm = new Bitmap(Properties.Resources.tx_filter_27))
drawBitmap(e.Graphics, bm);
break;
}
}
private void panel_rxfilter_Click(object sender, EventArgs e)
{
if (e != null) if (++statics.rxfilter > 3) statics.rxfilter = 0;
Byte[] txb = new Byte[2];
txb[0] = 12;
txb[1] = (Byte)statics.rxfilter;
Udp.UdpSendData(txb);
panel_rxfilter.Invalidate();
}
private void panel_txfilter_Click(object sender, EventArgs e)
{
if (e != null) if (++statics.txfilter > 3) statics.txfilter = 0;
Byte[] txb = new Byte[2];
txb[0] = 13;
txb[1] = (Byte)statics.txfilter;
Udp.UdpSendData(txb);
panel_txfilter.Invalidate();
}
private void panel_audioloop_Paint(object sender, PaintEventArgs e)
{
using (Bitmap bm = new Bitmap(Properties.Resources.audioloop))
using (Bitmap bminact = new Bitmap(Properties.Resources.audioloop_inact))
drawButtonPanel(e.Graphics, statics.audioloop, bm, bminact);
}
private void panel_rfloop_Paint(object sender, PaintEventArgs e)
{
using (Bitmap bm = new Bitmap(Properties.Resources.rfloop))
using (Bitmap bminact = new Bitmap(Properties.Resources.rfloop_inact))
drawButtonPanel(e.Graphics, statics.rfloop, bm, bminact);
}
private void panel_audioloop_Click(object sender, EventArgs e)
{
statics.audioloop = !statics.audioloop;
if (statics.audioloop && statics.rfloop)
{
panel_rfloop_Click(null, null);
}
Byte[] txb = new Byte[2];
txb[0] = 3;
txb[1] = (Byte)(statics.audioloop ? 1 : 0);
Udp.UdpSendData(txb);
panel_audioloop.Invalidate();
panel_rfloop.Invalidate();
}
private void panel_rfloop_Click(object sender, EventArgs e)
{
statics.rfloop = !statics.rfloop;
if (statics.audioloop && statics.rfloop)
{
panel_audioloop_Click(null, null);
}
statics.ptt = statics.rfloop;
panel1.Invalidate();
setPTT(statics.ptt);
Byte[] txb = new Byte[2];
txb[0] = 5;
txb[1] = (Byte)(statics.rfloop ? 1 : 0);
Udp.UdpSendData(txb);
panel_rfloop.Invalidate();
panel_audioloop.Invalidate();
}
private void panel_pavucontrol_Click(object sender, EventArgs e)
{
statics.StartMixer(true);
}
static Pen cline = new Pen(Brushes.Yellow, 2);
private void panel_rxline_Paint(object sender, PaintEventArgs e)
{
int x = statics.RXoffset / 500;
x = x * panel_rxline.Width / 1120;
//Console.WriteLine("pp " + x);
using (Graphics gr = e.Graphics)
{
gr.DrawLine(cline, panel_rxline.Width / 2, panel_rxline.Height, x, 0);
}
}
private void panel_sync_Paint(object sender, PaintEventArgs e)
{
// size 28 x 18 px
}
private void panel_beaconlock_Paint(object sender, PaintEventArgs e)
{
using (Graphics gr = e.Graphics)
{
if (statics.beaconlock)
{
using (Bitmap bm = new Bitmap(Properties.Resources._lock))
{
gr.FillRectangle(Brushes.Gray, 0, 0, panel_beaconlock.Width, panel_beaconlock.Height);
gr.DrawImage(bm, 0, 0);
}
}
else
{
using (Bitmap bm = new Bitmap(Properties.Resources.lock_open))
{
gr.FillRectangle(Brushes.Gray, 0, 0, panel_beaconlock.Width, panel_beaconlock.Height);
gr.DrawImage(bm, 0, 0);
}
}
}
Byte[] txb = new Byte[2];
txb[0] = 16;
txb[1] = (Byte)(statics.beaconlock ? 1 : 0);
Udp.UdpSendData(txb);
panel_qrg.Invalidate();
}
private void panel_beaconlock_Click(object sender, EventArgs e)
{
statics.beaconlock = !statics.beaconlock;
panel_beaconlock.Invalidate();
}
private void panel_sync_Click(object sender, EventArgs e)
{
Form_reference fr = new Form_reference();
fr.Show();
}
private void panel_switchbandplan_Click(object sender, EventArgs e)
{
if (++statics.bandplan_mode >= 5) statics.bandplan_mode = 0;
panel_bandplan.Invalidate();
}
private void panel_screen_Click(object sender, EventArgs e)
{
int ws = statics.windowsize;
Form_screen fs = new Form_screen();
fs.ShowDialog();
if(ws != statics.windowsize)
{
scaleElements();
Udp.UpdateSize();
}
}
private void panel_save_Click(object sender, EventArgs e)
{
statics.lastRXoffset = statics.RXoffset;
statics.lastTXoffset = statics.TXoffset;
}
private void panel_recall_Click(object sender, EventArgs e)
{
statics.RXoffset = statics.lastRXoffset;
statics.TXoffset = statics.lastTXoffset;
panel_qrg.Invalidate();
sendAndRefreshRXTXoffset();
}
private void panel_testtone_Click(object sender, EventArgs e)
{
Byte[] txb = new Byte[1];
txb[0] = 22;
Udp.UdpSendData(txb);
}
private void panel_testtone_Paint(object sender, PaintEventArgs e)
{
if(statics.sendtone == 1)
e.Graphics.DrawImage(Properties.Resources.waveactive,0,0);
else
e.Graphics.DrawImage(Properties.Resources.wave, 0, 0);
}
}
class DoubleBufferedPanel : Panel
{
public DoubleBufferedPanel() : base()
{
// double buffering crashes under windows
OperatingSystem osversion = System.Environment.OSVersion;
if (osversion.VersionString.Contains("indow"))
statics.ostype = 0; // Win$
else
{
statics.ostype = 1; // Linux
DoubleBuffered = true;
}
}
}
}