kopia lustrzana https://github.com/dl2alf/AirScout
290 wiersze
10 KiB
C#
290 wiersze
10 KiB
C#
|
using System;
|
|||
|
using System.Collections.Generic;
|
|||
|
using System.ComponentModel;
|
|||
|
using System.Data.OleDb;
|
|||
|
using System.Globalization;
|
|||
|
using System.Linq;
|
|||
|
using System.Security.Policy;
|
|||
|
using System.Text;
|
|||
|
using System.Threading;
|
|||
|
using ScoutBase.CAT;
|
|||
|
|
|||
|
namespace AirScout.CAT
|
|||
|
{
|
|||
|
|
|||
|
public class CATWorkerStartOptions
|
|||
|
{
|
|||
|
public string Name;
|
|||
|
public string RigType = "";
|
|||
|
public string PortName = "";
|
|||
|
public int Baudrate = 9600;
|
|||
|
public int DataBits = 8;
|
|||
|
public PARITY Parity = PARITY.NONE;
|
|||
|
public STOPBITS StopBits = STOPBITS.ONE;
|
|||
|
public FLOWCONTROL RTS = FLOWCONTROL.LOW;
|
|||
|
public FLOWCONTROL DTR = FLOWCONTROL.LOW;
|
|||
|
public int Poll = 100;
|
|||
|
public int Timeout = 500;
|
|||
|
}
|
|||
|
|
|||
|
public class CATWorker : BackgroundWorker
|
|||
|
{
|
|||
|
|
|||
|
public CATWorkerStartOptions StartOptions;
|
|||
|
public IRig Rig = null;
|
|||
|
|
|||
|
// doppler tracking
|
|||
|
public DOPPLERSTRATEGY DopplerStrategy = DOPPLERSTRATEGY.DOPPLER_NONE;
|
|||
|
public long RxFrequency = 0;
|
|||
|
public long TxFrequency = 0;
|
|||
|
|
|||
|
public CATWorker()
|
|||
|
{
|
|||
|
this.WorkerReportsProgress = true;
|
|||
|
this.WorkerSupportsCancellation = true;
|
|||
|
}
|
|||
|
|
|||
|
#region OmniRig
|
|||
|
|
|||
|
#endregion
|
|||
|
|
|||
|
// provides a list of supported rigs
|
|||
|
public static List<SupportedRig> SupportedRigs()
|
|||
|
{
|
|||
|
List<SupportedRig> rigs = new List<SupportedRig>();
|
|||
|
// try to get external OmniRig supported rigs
|
|||
|
try
|
|||
|
{
|
|||
|
List<SupportedRig> omnirigs = OmniRigX.SupportedRigs();
|
|||
|
foreach (SupportedRig omnirig in omnirigs)
|
|||
|
{
|
|||
|
rigs.Add(omnirig);
|
|||
|
}
|
|||
|
}
|
|||
|
catch (Exception ex)
|
|||
|
{
|
|||
|
// add nothing if something goes wrong
|
|||
|
}
|
|||
|
|
|||
|
// try to get ScoutBase OmniRig supported rigs
|
|||
|
try
|
|||
|
{
|
|||
|
List<SupportedRig> scoutbaserigs = ScoutBaseRig.SupportedRigs();
|
|||
|
foreach (SupportedRig scoutbaserig in scoutbaserigs)
|
|||
|
{
|
|||
|
rigs.Add(scoutbaserig);
|
|||
|
}
|
|||
|
}
|
|||
|
catch (Exception ex)
|
|||
|
{
|
|||
|
// add nothing if something goes wrong
|
|||
|
}
|
|||
|
|
|||
|
// try to collect other rigs from other CAT interfaces here
|
|||
|
|
|||
|
// return supported rigs
|
|||
|
return rigs;
|
|||
|
}
|
|||
|
|
|||
|
protected override void OnDoWork(DoWorkEventArgs e)
|
|||
|
{
|
|||
|
StartOptions = (CATWorkerStartOptions)e.Argument;
|
|||
|
this.ReportProgress(0, StartOptions.Name + " started.");
|
|||
|
// name the thread for debugging
|
|||
|
if (String.IsNullOrEmpty(Thread.CurrentThread.Name))
|
|||
|
Thread.CurrentThread.Name = StartOptions.Name + "_" + this.GetType().Name;
|
|||
|
|
|||
|
// check if any CAT is working by getting all supported rigs
|
|||
|
// handle exceptions
|
|||
|
List<SupportedRig> rigs = new List<SupportedRig>();
|
|||
|
try
|
|||
|
{
|
|||
|
rigs = CATWorker.SupportedRigs();
|
|||
|
}
|
|||
|
catch (Exception ex)
|
|||
|
{
|
|||
|
this.ReportProgress(-1, "Error while getting supported rigs from CAT: " + ex.Message);
|
|||
|
this.ReportProgress(1, RIGSTATUS.NOCAT);
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
// check if any rig is found
|
|||
|
if (rigs.Count == 0)
|
|||
|
{
|
|||
|
this.ReportProgress(-1, "Error while getting supported rigs from CAT: No available CAT found!");
|
|||
|
this.ReportProgress(1, RIGSTATUS.NORIG);
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
// check if the rig is among the currently supported rigs --> get a new IRig object
|
|||
|
// be careful with ActiveX objects an handle exceptions
|
|||
|
Rig = null;
|
|||
|
try
|
|||
|
{
|
|||
|
foreach (SupportedRig rig in rigs)
|
|||
|
{
|
|||
|
if (rig.Type == StartOptions.RigType)
|
|||
|
{
|
|||
|
switch (rig.CATEngine)
|
|||
|
{
|
|||
|
case CATENGINE.OMNIRIGX: Rig = new OmniRigX(); break;
|
|||
|
case CATENGINE.SCOUTBASE: Rig = new ScoutBaseRig(); break;
|
|||
|
}
|
|||
|
|
|||
|
// OK, we have a valid CAT and rig --> complete and download settings
|
|||
|
RigSettings settings = new RigSettings();
|
|||
|
settings.Type = rig.Type;
|
|||
|
settings.Model = rig.Model;
|
|||
|
settings.PortName = StartOptions.PortName;
|
|||
|
settings.Baudrate = StartOptions.Baudrate;
|
|||
|
settings.DataBits = StartOptions.DataBits;
|
|||
|
settings.Parity = StartOptions.Parity;
|
|||
|
settings.StopBits = StartOptions.StopBits;
|
|||
|
settings.RtsMode = StartOptions.RTS;
|
|||
|
settings.DtrMode = StartOptions.DTR;
|
|||
|
settings.PollMs = StartOptions.Poll;
|
|||
|
settings.TimeoutMs = StartOptions.Timeout;
|
|||
|
Rig.Settings = settings;
|
|||
|
|
|||
|
// stop search
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
catch (Exception ex)
|
|||
|
{
|
|||
|
this.ReportProgress(-1, "Error while trying to get a rig object from CAT: " + ex.ToString());
|
|||
|
}
|
|||
|
|
|||
|
// report error if rig is still null
|
|||
|
if (Rig == null)
|
|||
|
{
|
|||
|
this.ReportProgress(-1, "Rig is not supported by any available CAT!");
|
|||
|
this.ReportProgress(1, RIGSTATUS.NORIG);
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
this.ReportProgress(0, "Opening CAT: Success!");
|
|||
|
this.ReportProgress(2, Rig);
|
|||
|
|
|||
|
// old values for check changes
|
|||
|
DOPPLERSTRATEGY olddoppler = DOPPLERSTRATEGY.DOPPLER_NONE;
|
|||
|
RIGSTATUS oldrigstat = RIGSTATUS.NONE;
|
|||
|
RIGMODE oldrigmode = RIGMODE.NONE;
|
|||
|
RIGSPLIT oldrigsplit = RIGSPLIT.NONE;
|
|||
|
RIGRIT oldrigrit = RIGRIT.NONE;
|
|||
|
long oldrxfreq = -1;
|
|||
|
long oldtxfreq = -1;
|
|||
|
|
|||
|
// run polling loop
|
|||
|
while (!this.CancellationPending)
|
|||
|
{
|
|||
|
try
|
|||
|
{
|
|||
|
RIGSTATUS rigstatus = Rig.GetStatus();
|
|||
|
if (oldrigstat != rigstatus)
|
|||
|
{
|
|||
|
oldrigstat = rigstatus;
|
|||
|
this.ReportProgress(1, rigstatus);
|
|||
|
}
|
|||
|
|
|||
|
// get rig infos when rig is online
|
|||
|
if (rigstatus == RIGSTATUS.ONLINE)
|
|||
|
{
|
|||
|
// get mode
|
|||
|
RIGMODE rigmode = Rig.GetMode();
|
|||
|
if ( oldrigmode != rigmode)
|
|||
|
{
|
|||
|
lock (Rig)
|
|||
|
{
|
|||
|
oldrigmode = rigmode;
|
|||
|
this.ReportProgress(2, Rig);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// get split
|
|||
|
RIGSPLIT rigsplit = Rig.GetSplit();
|
|||
|
if (oldrigsplit != rigsplit)
|
|||
|
{
|
|||
|
lock (Rig)
|
|||
|
{
|
|||
|
oldrigsplit = rigsplit;
|
|||
|
this.ReportProgress(2, Rig);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// get rit
|
|||
|
RIGRIT rigrit = Rig.GetRit();
|
|||
|
if (oldrigrit != rigrit)
|
|||
|
{
|
|||
|
lock (Rig)
|
|||
|
{
|
|||
|
oldrigrit = rigrit;
|
|||
|
this.ReportProgress(2, Rig);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// get RX frequency
|
|||
|
long rxfreq = Rig.GetRxFrequency();
|
|||
|
if (oldrxfreq != rxfreq)
|
|||
|
{
|
|||
|
lock (Rig)
|
|||
|
{
|
|||
|
oldrxfreq = rxfreq;
|
|||
|
this.ReportProgress(2, Rig);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// get TX frequency
|
|||
|
long txfreq = Rig.GetTxFrequency();
|
|||
|
if (oldtxfreq != txfreq)
|
|||
|
{
|
|||
|
lock (Rig)
|
|||
|
{
|
|||
|
oldtxfreq = txfreq;
|
|||
|
this.ReportProgress(2, Rig);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
// check for Doppler settings changes
|
|||
|
if (olddoppler != DopplerStrategy)
|
|||
|
{
|
|||
|
olddoppler = DopplerStrategy;
|
|||
|
// check for Doppler tracking enabled
|
|||
|
if ((DopplerStrategy == DOPPLERSTRATEGY.DOPPLER_A) || (DopplerStrategy == DOPPLERSTRATEGY.DOPPLER_B) || (DopplerStrategy == DOPPLERSTRATEGY.DOPPLER_C) || (DopplerStrategy == DOPPLERSTRATEGY.DOPPLER_D))
|
|||
|
{
|
|||
|
// enter doppler tracking
|
|||
|
Rig.SetDopplerStrategy(DopplerStrategy);
|
|||
|
Rig.EnterDoppler();
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
// leave doppler tracking
|
|||
|
Rig.SetDopplerStrategy(DOPPLERSTRATEGY.DOPPLER_NONE);
|
|||
|
Rig.LeaveDoppler();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// Doppler tracking
|
|||
|
if ((DopplerStrategy == DOPPLERSTRATEGY.DOPPLER_A) || (DopplerStrategy == DOPPLERSTRATEGY.DOPPLER_B) || (DopplerStrategy == DOPPLERSTRATEGY.DOPPLER_C) || (DopplerStrategy == DOPPLERSTRATEGY.DOPPLER_D))
|
|||
|
{
|
|||
|
Rig.SetSplitMode(RxFrequency, TxFrequency);
|
|||
|
}
|
|||
|
}
|
|||
|
catch (Exception ex)
|
|||
|
{
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
Thread.Sleep(Properties.Settings.Default.CAT_Update);
|
|||
|
}
|
|||
|
|
|||
|
// reset status
|
|||
|
this.ReportProgress(1, RIGSTATUS.NONE);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|