483 lines
16 KiB
C#
Executable File
483 lines
16 KiB
C#
Executable File
using System;
|
|
using System.Collections.Generic;
|
|
using System.Diagnostics;
|
|
using System.Drawing;
|
|
using System.IO;
|
|
using System.Linq.Expressions;
|
|
using System.Net;
|
|
using System.Net.Sockets;
|
|
using System.Threading;
|
|
using System.Windows.Forms;
|
|
|
|
namespace oscardata
|
|
{
|
|
// static variables for use anywhere in the program
|
|
public static class statics
|
|
{
|
|
// frame types
|
|
// the values 0..15 are sent over the air
|
|
public static Byte noTX = 0;
|
|
public static Byte BERtest = 1;
|
|
public static Byte Image = 2;
|
|
public static Byte AsciiFile = 3;
|
|
public static Byte HTMLFile = 4;
|
|
public static Byte BinaryFile = 5;
|
|
public static Byte Audio = 6;
|
|
public static Byte Userinfo = 7;
|
|
|
|
// the upper values are for internal use
|
|
public static Byte ResamplingRate = 16;
|
|
public static Byte AutosendFile = 17;
|
|
public static Byte AutosendFolder = 18;
|
|
public static Byte Modem_shutdown = 19;
|
|
public static Byte ResetModem = 20;
|
|
public static Byte SetPBvolume = 21;
|
|
public static Byte SetCAPvolume = 22;
|
|
public static Byte SetLSvolume = 23;
|
|
public static Byte SetMICvolume = 24;
|
|
public static Byte SetVoiceMode = 25;
|
|
public static Byte terminate = 26;
|
|
public static Byte tuning = 27;
|
|
public static Byte marker = 28;
|
|
public static Byte setfreq = 29;
|
|
public static Byte rttykey = 30;
|
|
public static Byte rttystring = 31;
|
|
public static Byte txonoff = 32;
|
|
public static Byte rtty_stopTX = 33;
|
|
|
|
// frame sequence, modem needs that for i.e. sending a preamble
|
|
public static Byte FirstFrame = 0;
|
|
public static Byte NextFrame = 1;
|
|
public static Byte LastFrame = 2;
|
|
public static Byte SingleFrame = 3;
|
|
|
|
// udp messages from modem
|
|
public static Byte udp_payload = 1;
|
|
public static Byte udp_bc = 3;
|
|
public static Byte udp_fft = 4;
|
|
public static Byte udp_iq = 5;
|
|
public static Byte udp_rtty_rx = 6;
|
|
|
|
// global static variables
|
|
public static bool running = true;
|
|
public static String ModemIP = "1.2.3.4";
|
|
public static String MyIP = "1.2.3.4";
|
|
public static int UdpBCport_AppToModem = 40131; // broadcast port for modem search
|
|
public static int UdpTXport = 40132; // to modem
|
|
public static int UdpRXport = 40133; // from modem
|
|
|
|
public static int FecLen = 32; // must be same value as in qo100modem software !!!
|
|
public static int UdpBlocklen = 258; // length of a data block (UDP)
|
|
public static int PayloadLen = UdpBlocklen - FecLen - 3 - 2 - 2;
|
|
public static int real_datarate = 6000; // speed in bit/s
|
|
public static String jpg_tempfilename = "rxdata.jpg";
|
|
public static String zip_TXtempfilename = "TXtemp.zip";
|
|
public static String zip_RXtempfilename = "RXtemp.zip";
|
|
public static String DataStorage = "oscardata";
|
|
public static String RXimageStorage = "RXimages";
|
|
public static String OSversion = "";
|
|
public static int ostype = 0; // 0=Windows, 1=Linux
|
|
public static int GotAudioDevices = 0;
|
|
public static String[] AudioPBdevs;
|
|
public static String[] AudioCAPdevs;
|
|
public static int PBfifousage = 0;
|
|
public static int CAPfifousage = 0;
|
|
public static int initAudioStatus;
|
|
public static int initVoiceStatus;
|
|
public static int RXlevelDetected = 0;
|
|
public static int RXinSync = 0;
|
|
public static int maxRXlevel = 0;
|
|
public static int maxTXlevel = 0;
|
|
public static Color WindowBackColor;
|
|
public static String[] langstr;
|
|
public static int tuning_active = 0;
|
|
public static int tune_frequency = 1500;
|
|
|
|
public static String[] getOwnIPs()
|
|
{
|
|
try
|
|
{
|
|
IPHostEntry ipEntry = Dns.GetHostEntry(Dns.GetHostName());
|
|
IPAddress[] addr = ipEntry.AddressList;
|
|
//Console.WriteLine("1:len: " + addr.Length.ToString());
|
|
int anz = 0;
|
|
for (int i = 0; i < addr.Length; i++)
|
|
{
|
|
if (addr[i].AddressFamily == AddressFamily.InterNetwork)
|
|
anz++;
|
|
}
|
|
|
|
if (anz > 0)
|
|
{
|
|
String[] iparr = new String[anz];
|
|
int num = 0;
|
|
for (int i = 0; i < addr.Length; i++)
|
|
{
|
|
if (addr[i].AddressFamily == AddressFamily.InterNetwork)
|
|
{
|
|
iparr[num] = addr[i].ToString();
|
|
//Console.WriteLine("1:found my ip " + iparr[num]);
|
|
num++;
|
|
}
|
|
}
|
|
|
|
return iparr;
|
|
}
|
|
}
|
|
catch
|
|
{ }
|
|
|
|
try
|
|
{
|
|
List<IPAddress> ipList = new List<IPAddress>();
|
|
foreach (var ni in System.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces())
|
|
{
|
|
foreach (var ua in ni.GetIPProperties().UnicastAddresses)
|
|
{
|
|
if (ua.Address.AddressFamily == AddressFamily.InterNetwork)
|
|
{
|
|
//Console.WriteLine("2:found my ip " + ua.Address.ToString());
|
|
ipList.Add(ua.Address);
|
|
}
|
|
}
|
|
}
|
|
|
|
if (ipList.Count > 0)
|
|
{
|
|
String[] iparr = new String[ipList.Count];
|
|
int i = 0;
|
|
foreach (IPAddress v in ipList)
|
|
{
|
|
iparr[i++] = v.ToString();
|
|
}
|
|
return iparr;
|
|
}
|
|
}
|
|
catch { }
|
|
Console.WriteLine("not found");
|
|
return null;
|
|
}
|
|
|
|
public static byte[] StringToByteArray(string str)
|
|
{
|
|
System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();
|
|
return enc.GetBytes(str);
|
|
}
|
|
|
|
public static byte[] StringToByteArrayUtf8(string str)
|
|
{
|
|
System.Text.UTF8Encoding enc = new System.Text.UTF8Encoding();
|
|
return enc.GetBytes(str);
|
|
}
|
|
|
|
public static string ByteArrayToString(byte[] arr, int offset = 0)
|
|
{
|
|
Byte[] ba = new byte[arr.Length];
|
|
int dst = 0;
|
|
for (int i = offset; i < arr.Length; i++)
|
|
{
|
|
if (arr[i] != 0) ba[dst++] = arr[i];
|
|
}
|
|
Byte[] ban = new byte[dst];
|
|
Array.Copy(ba, ban, dst);
|
|
|
|
System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();
|
|
|
|
return enc.GetString(ban);
|
|
}
|
|
|
|
public static string ByteArrayToString(byte[] arr, int offset, int length)
|
|
{
|
|
Byte[] ba = new byte[arr.Length];
|
|
int dst = 0;
|
|
for (int i = 0; i < length; i++)
|
|
{
|
|
if (i >= arr.Length) break;
|
|
if (arr[i+ offset] != 0) ba[dst++] = arr[i+ offset];
|
|
}
|
|
Byte[] ban = new byte[dst];
|
|
Array.Copy(ba, ban, dst);
|
|
|
|
System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();
|
|
|
|
return enc.GetString(ban);
|
|
}
|
|
|
|
public static string ByteArrayToStringUtf8(byte[] arr, int offset = 0)
|
|
{
|
|
Byte[] ba = new byte[arr.Length];
|
|
int dst = 0;
|
|
for (int i = offset; i < arr.Length; i++)
|
|
{
|
|
if (arr[i] != 0) ba[dst++] = arr[i];
|
|
}
|
|
Byte[] ban = new byte[dst];
|
|
Array.Copy(ba, ban, dst);
|
|
|
|
System.Text.UTF8Encoding enc = new System.Text.UTF8Encoding();
|
|
|
|
return enc.GetString(ban);
|
|
}
|
|
|
|
public static String addTmpPath(String fn)
|
|
{
|
|
if (statics.ostype == 0)
|
|
{
|
|
// Windows
|
|
return Application.UserAppDataPath + "\\" + fn;
|
|
}
|
|
else
|
|
{
|
|
// Linux
|
|
return "/tmp/" + fn;
|
|
}
|
|
}
|
|
|
|
public static String getHomePath(String subpath, String filename)
|
|
{
|
|
String deli = "/";
|
|
if (statics.ostype == 0)deli = "\\";
|
|
|
|
//String home = Application.UserAppDataPath;
|
|
String home = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile);
|
|
|
|
home = home + deli + DataStorage + deli;
|
|
try { Directory.CreateDirectory(home); } catch { }
|
|
|
|
// if not exists, create subfolder "oscardata"
|
|
if (subpath.Length > 0)
|
|
try {
|
|
home += subpath + deli;
|
|
Directory.CreateDirectory(home);
|
|
} catch { }
|
|
|
|
return home + filename;
|
|
}
|
|
|
|
public static void CreateAllDirs()
|
|
{
|
|
String home = Application.UserAppDataPath;
|
|
String deli = "/";
|
|
|
|
if (statics.ostype == 0)
|
|
deli = "\\";
|
|
|
|
// create home directory
|
|
try
|
|
{
|
|
Directory.CreateDirectory(home);
|
|
}
|
|
catch { }
|
|
|
|
// create application path
|
|
home += deli + DataStorage;
|
|
try
|
|
{
|
|
Directory.CreateDirectory(home);
|
|
}
|
|
catch { }
|
|
|
|
// create image path
|
|
home += deli + RXimageStorage;
|
|
try
|
|
{
|
|
Directory.CreateDirectory(home);
|
|
}
|
|
catch { }
|
|
}
|
|
|
|
// Returns the file's size.
|
|
public static long GetFileSize(string file_name)
|
|
{
|
|
return new FileInfo(file_name).Length;
|
|
}
|
|
|
|
// returns the filename of a path+filename string
|
|
public static String pureFilename(String fullfn)
|
|
{
|
|
// extract just the filename without a path
|
|
String fn;
|
|
int idx = fullfn.LastIndexOf('/');
|
|
if (idx == -1) idx = fullfn.LastIndexOf('\\');
|
|
if (idx == -1)
|
|
{
|
|
// fullfn does not contain a path
|
|
return fullfn;
|
|
}
|
|
else
|
|
{
|
|
// just the filename
|
|
try { fn = fullfn.Substring(idx + 1); }
|
|
catch { fn = fullfn; }
|
|
return fn;
|
|
}
|
|
}
|
|
|
|
// returns only the path of a Path+Filename string
|
|
public static String purePath(String fullfn)
|
|
{
|
|
int idx = fullfn.LastIndexOf('/');
|
|
if (idx == -1) idx = fullfn.LastIndexOf('\\');
|
|
if (idx == -1)
|
|
return ".";
|
|
else
|
|
return fullfn.Substring(0, idx);
|
|
}
|
|
|
|
// check if an image is a valid image
|
|
public static bool checkImage(String imgfn)
|
|
{
|
|
try
|
|
{
|
|
using (Image dummy = new Bitmap(imgfn))
|
|
{
|
|
// valid image
|
|
}
|
|
return true;
|
|
}
|
|
catch
|
|
{
|
|
// invalid image
|
|
return false;
|
|
}
|
|
}
|
|
|
|
// add a file extension or replace an existing one
|
|
public static String AddReplaceFileExtension(String fn, String ext)
|
|
{
|
|
int idx = fn.IndexOf('.');
|
|
if(idx == -1)
|
|
{
|
|
// filename has no '.'
|
|
return fn + "." + ext;
|
|
}
|
|
|
|
// filename has a '.'
|
|
// if the '.' is the first char, then the filename is invalid
|
|
if (idx == 0) return fn;
|
|
|
|
return fn.Substring(0, idx) + "." + ext;
|
|
}
|
|
|
|
static Process cmd = null;
|
|
public static bool StartHSmodem(bool start = true)
|
|
{
|
|
// kill old processes already running
|
|
killall("hsmodem");
|
|
killall("hsmodem.exe");
|
|
|
|
if (start == true)
|
|
{
|
|
// starte Prozesse
|
|
try
|
|
{
|
|
if (ostype == 0)
|
|
{
|
|
if (!File.Exists("hsmodem.exe")) return false;
|
|
cmd = new Process();
|
|
cmd.StartInfo.FileName = "hsmodem.exe";
|
|
}
|
|
else
|
|
{
|
|
if (!File.Exists("hsmodem")) return false;
|
|
cmd = new Process();
|
|
cmd.StartInfo.FileName = "hsmodem";
|
|
}
|
|
|
|
if (cmd != null)
|
|
{
|
|
cmd.StartInfo.WindowStyle = ProcessWindowStyle.Normal;// .Hidden;
|
|
cmd.StartInfo.Arguments = "";
|
|
cmd.Start();
|
|
Console.WriteLine("hsmodem started");
|
|
}
|
|
}
|
|
catch { return false; }
|
|
}
|
|
return true;
|
|
}
|
|
|
|
// checks if a process is running
|
|
static public bool isProcRunning(String s)
|
|
{
|
|
bool running = false;
|
|
|
|
if (ostype == 0)
|
|
{
|
|
foreach (var process in Process.GetProcessesByName(s))
|
|
{
|
|
running = true;
|
|
break;
|
|
}
|
|
}
|
|
|
|
return running;
|
|
}
|
|
|
|
static public void killall(String s)
|
|
{
|
|
if (ostype == 0)
|
|
{
|
|
// kill a Windows process
|
|
try
|
|
{
|
|
foreach (var process in Process.GetProcessesByName(s))
|
|
process.Kill();
|
|
}
|
|
catch { }
|
|
}
|
|
else
|
|
{
|
|
// kill a Linux process
|
|
try
|
|
{
|
|
if (cmd != null)
|
|
cmd.Kill();
|
|
cmd = null;
|
|
|
|
Process proc = new Process();
|
|
proc.EnableRaisingEvents = false;
|
|
proc.StartInfo.FileName = "killall";
|
|
proc.StartInfo.UseShellExecute = false;
|
|
proc.StartInfo.RedirectStandardOutput = true;
|
|
proc.OutputDataReceived += (sender, args) => { }; // schreibe Output ins nichts
|
|
proc.StartInfo.RedirectStandardError = true;
|
|
proc.ErrorDataReceived += (sender, args) => { }; // schreibe Output ins nichts
|
|
proc.StartInfo.Arguments = s;
|
|
proc.Start();
|
|
proc.WaitForExit();
|
|
}
|
|
catch { }
|
|
}
|
|
}
|
|
|
|
public static void FileDelete(String fn)
|
|
{
|
|
try
|
|
{
|
|
File.Delete(fn);
|
|
}
|
|
catch { }
|
|
}
|
|
|
|
// Culture invariant conversion
|
|
|
|
public static double MyToDouble(String s)
|
|
|
|
{
|
|
double r = 0;
|
|
|
|
try
|
|
{
|
|
s = s.Replace(',', '.');
|
|
r = Convert.ToDouble(s, System.Globalization.CultureInfo.InvariantCulture);
|
|
}
|
|
catch
|
|
{
|
|
}
|
|
return r;
|
|
|
|
}
|
|
}
|
|
}
|