ardupilot/Tools/ArdupilotMegaPlanner/temp.cs
Michael Oborne d1139761c0 APM Planner 1.1.85
work on opengltest
fix last missing param
fix com port selection on connecting to bad comport
add convert to csv. entire log
add log caching to image georef. for tlog and logs
add srtm data caching
2012-05-13 18:56:42 +08:00

921 lines
33 KiB
C#

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Text.RegularExpressions;
using System.IO.Ports;
using System.IO;
using System.Runtime.InteropServices;
using System.Net;
using GMap.NET.WindowsForms;
using GMap.NET.CacheProviders;
using log4net;
using System.Security.Permissions;
using ArdupilotMega.Arduino;
using ArdupilotMega.Utilities;
namespace ArdupilotMega
{
public partial class temp : Form
{
[DllImport("DIFXApi.dll", CharSet = CharSet.Unicode)]
public static extern Int32 DriverPackagePreinstall(string DriverPackageInfPath, Int32 Flags);
private static readonly ILog log =
LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
public temp()
{
InitializeComponent();
if (System.Diagnostics.Debugger.IsAttached) {
ArdupilotMega.Controls.OpenGLtest ogl = new Controls.OpenGLtest();
this.Controls.Add(ogl);
ogl.Dock = DockStyle.Fill;
}
}
private void temp_Load(object sender, EventArgs e)
{
}
public static byte[] Swap(params object[] list)
{
// The copy is made becuase SetValue won't work on a struct.
// Boxing was used because SetValue works on classes/objects.
// Unfortunately, it results in 2 copy operations.
object thisBoxed = list[0]; // Why make a copy?
Type test = thisBoxed.GetType();
int offset = 0;
byte[] data = new byte[Marshal.SizeOf(thisBoxed)];
// System.Net.IPAddress.NetworkToHostOrder is used to perform byte swapping.
// To convert unsigned to signed, 'unchecked()' was used.
// See http://stackoverflow.com/questions/1131843/how-do-i-convert-uint-to-int-in-c
// Enumerate each structure field using reflection.
foreach (var field in test.GetFields())
{
// field.Name has the field's name.
object fieldValue = field.GetValue(thisBoxed); // Get value
// Get the TypeCode enumeration. Multiple types get mapped to a common typecode.
TypeCode typeCode = Type.GetTypeCode(fieldValue.GetType());
switch (typeCode)
{
case TypeCode.Single: // float
{
Array.Copy(BitConverter.GetBytes((Single)fieldValue), data, offset);
break;
}
case TypeCode.Int32:
{
Array.Copy(BitConverter.GetBytes((Int32)fieldValue), data, offset);
break;
}
case TypeCode.UInt32:
{
Array.Copy(BitConverter.GetBytes((UInt32)fieldValue), data, offset);
break;
}
case TypeCode.Int16:
{
Array.Copy(BitConverter.GetBytes((Int16)fieldValue), data, offset);
break;
}
case TypeCode.UInt16:
{
Array.Copy(BitConverter.GetBytes((UInt16)fieldValue), data, offset);
break;
}
case TypeCode.Int64:
{
Array.Copy(BitConverter.GetBytes((Int64)fieldValue), data, offset);
break;
}
case TypeCode.UInt64:
{
Array.Copy(BitConverter.GetBytes((UInt64)fieldValue), data, offset);
break;
}
case TypeCode.Double:
{
Array.Copy(BitConverter.GetBytes((Double)fieldValue), data, offset);
break;
}
default:
{
// System.Diagnostics.Debug.Fail("No conversion provided for this type");
break;
}
}; // switch
offset += Marshal.SizeOf(fieldValue);
} // foreach
return data;
} // Swap
private void button1_Click(object sender, EventArgs e)
{
OpenFileDialog openFileDialog1 = new OpenFileDialog();
openFileDialog1.Filter = "EEPROM.bin|*.bin";
openFileDialog1.FilterIndex = 2;
openFileDialog1.RestoreDirectory = true;
openFileDialog1.InitialDirectory = Path.GetDirectoryName(Application.ExecutablePath);
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
try
{
StreamReader sr = new StreamReader(openFileDialog1.FileName);
BinaryReader br = new BinaryReader(sr.BaseStream);
byte[] EEPROM = br.ReadBytes(1024 * 4);
br.Close();
sr.Close();
ArduinoComms port = new ArduinoSTK();
if (DialogResult.Yes == CustomMessageBox.Show("is this a 1280?", "", MessageBoxButtons.YesNo))
{
port = new ArduinoSTK();
port.BaudRate = 57600;
}
else
{
port = new ArduinoSTKv2();
port.BaudRate = 115200;
}
port.DataBits = 8;
port.StopBits = StopBits.One;
port.Parity = Parity.None;
port.DtrEnable = true;
port.PortName = ArdupilotMega.MainV2.comPortName;
try
{
port.Open();
if (port.connectAP())
{
// waypoints
int start = 0;
int end = 1024*4;
log.Info(start + " to " + end);
port.upload(EEPROM, (short)start, (short)(end - start), (short)start);
if (port.keepalive())
{
// Config
if (port.keepalive())
{
System.Threading.Thread.Sleep(2000);
//MessageBox.Show("Upload Completed");
}
else
{
CustomMessageBox.Show("Communication Error - WPs wrote but no config");
}
}
else
{
CustomMessageBox.Show("Communication Error - Bad data");
}
}
else
{
CustomMessageBox.Show("Communication Error - no connection");
}
port.Close();
}
catch (Exception ex) { CustomMessageBox.Show("Port in use? " + ex.ToString()); port.Close(); }
}
catch (Exception) { CustomMessageBox.Show("Error reading file"); }
}
}
private void BUT_wipeeeprom_Click(object sender, EventArgs e)
{
byte[] EEPROM = new byte[4*1024];
for (int i = 0; i < EEPROM.Length;i++)
{
EEPROM[i] = 0xff;
}
ArduinoComms port = new ArduinoSTK();
if (DialogResult.Yes == CustomMessageBox.Show("is this a 1280?", "", MessageBoxButtons.YesNo))
{
port = new ArduinoSTK();
port.BaudRate = 57600;
}
else
{
port = new ArduinoSTKv2();
port.BaudRate = 115200;
}
port.DataBits = 8;
port.StopBits = StopBits.One;
port.Parity = Parity.None;
port.DtrEnable = true;
port.PortName = ArdupilotMega.MainV2.comPortName;
try
{
port.Open();
if (port.connectAP())
{
// waypoints
int start = 0;
int end = 1024*4;
log.Info(start + " to " + end);
port.upload(EEPROM, (short)start, (short)(end - start), (short)start);
if (port.keepalive())
{
// Config
if (port.keepalive())
{
System.Threading.Thread.Sleep(2000);
//MessageBox.Show("Upload Completed");
}
else
{
CustomMessageBox.Show("Communication Error - WPs wrote but no config");
}
}
else
{
CustomMessageBox.Show("Communication Error - Bad data");
}
}
else
{
CustomMessageBox.Show("Communication Error - no connection");
}
port.Close();
}
catch (Exception ex) { CustomMessageBox.Show("Port in use? " + ex.ToString()); port.Close(); }
}
private void BUT_flashdl_Click(object sender, EventArgs e)
{
byte[] FLASH = new byte[256 * 1024];
ArduinoComms port = new ArduinoSTK();
if (DialogResult.Yes == CustomMessageBox.Show("is this a 1280?", "", MessageBoxButtons.YesNo))
{
port = new ArduinoSTK();
port.BaudRate = 57600;
}
else
{
port = new ArduinoSTKv2();
port.BaudRate = 115200;
}
port.DataBits = 8;
port.StopBits = StopBits.One;
port.Parity = Parity.None;
port.DtrEnable = true;
port.PortName = ArdupilotMega.MainV2.comPortName;
try
{
port.Open();
System.Threading.Thread.Sleep(100);
if (port.connectAP())
{
// waypoints
int start = 0;
short length = 0x100;
log.Info(start + " to " + FLASH.Length);
while (start < FLASH.Length)
{
log.Info("Doing " + length + " at " + start);
port.setaddress(start);
port.downloadflash(length).CopyTo(FLASH, start);
start += length;
}
StreamWriter sw = new StreamWriter(Path.GetDirectoryName(Application.ExecutablePath) + Path.DirectorySeparatorChar + @"flash.bin", false);
BinaryWriter bw = new BinaryWriter(sw.BaseStream);
bw.Write(FLASH, 0, FLASH.Length);
bw.Close();
sw = new StreamWriter(Path.GetDirectoryName(Application.ExecutablePath) + Path.DirectorySeparatorChar + @"flash.hex", false);
for (int i = 0; i < FLASH.Length; i += 16)
{
string add = string.Format("{0:X4}", i);
if (i % (0x1000 << 4) == 0)
{
if (i != 0)
sw.WriteLine(":02000002{0:X4}{1:X2}", ((i >> 4) & 0xf000), 0x100 - (2 + 2 + (((i >> 4) & 0xf000) >> 8) & 0xff));
}
if (add.Length == 5)
{
add = add.Substring(1);
}
sw.Write(":{0:X2}{1}00", 16, add);
byte ck = (byte)(16 + (i & 0xff) + ((i >> 8) & 0xff));
for (int a = 0; a < 16; a++)
{
ck += FLASH[i + a];
sw.Write("{0:X2}", FLASH[i + a]);
}
sw.WriteLine("{0:X2}", (byte)(0x100 - ck));
}
sw.Close();
log.Info("Downloaded");
}
else
{
CustomMessageBox.Show("Communication Error - no connection");
}
port.Close();
}
catch (Exception ex) { CustomMessageBox.Show("Port in use? " + ex.ToString()); port.Close(); }
}
public int swapend(int value)
{
int len = Marshal.SizeOf(value);
byte[] temp = BitConverter.GetBytes(value);
Array.Reverse(temp);
return BitConverter.ToInt32(temp, 0);
}
private void BUT_flashup_Click(object sender, EventArgs e)
{
byte[] FLASH = new byte[1];
try
{
StreamReader sr = new StreamReader(Path.GetDirectoryName(Application.ExecutablePath) + Path.DirectorySeparatorChar + @"firmware.hex");
FLASH = readIntelHEXv2(sr);
sr.Close();
}
catch (Exception ex) { CustomMessageBox.Show("Failed to read firmware.hex : " + ex.Message); }
ArduinoComms port = new ArduinoSTK();
if (DialogResult.Yes == CustomMessageBox.Show("is this a 1280?", "", MessageBoxButtons.YesNo))
{
port = new ArduinoSTK();
port.BaudRate = 57600;
}
else
{
port = new ArduinoSTKv2();
port.BaudRate = 115200;
}
port.DataBits = 8;
port.StopBits = StopBits.One;
port.Parity = Parity.None;
port.DtrEnable = true;
try
{
port.PortName = ArdupilotMega.MainV2.comPortName;
port.Open();
if (port.connectAP())
{
log.Info("starting");
port.uploadflash(FLASH, 0, FLASH.Length, 0);
log.Info("Uploaded");
}
else
{
CustomMessageBox.Show("Communication Error - no connection");
}
port.Close();
}
catch (Exception ex) { CustomMessageBox.Show("Check port settings or Port in use? " + ex.ToString()); port.Close(); }
}
byte[] readIntelHEX(StreamReader sr)
{
byte[] FLASH = new byte[sr.BaseStream.Length / 2];
int optionoffset = 0;
int total = 0;
while (!sr.EndOfStream)
{
string line = sr.ReadLine();
Regex regex = new Regex(@"^:(..)(....)(..)(.*)(..)$"); // length - address - option - data - checksum
Match match = regex.Match(line);
int length = Convert.ToInt32(match.Groups[1].Value.ToString(), 16);
int address = Convert.ToInt32(match.Groups[2].Value.ToString(), 16);
int option = Convert.ToInt32(match.Groups[3].Value.ToString(), 16);
log.InfoFormat("len {0} add {1} opt {2}", length, address, option);
if (option == 0)
{
string data = match.Groups[4].Value.ToString();
for (int i = 0; i < length; i++)
{
byte byte1 = Convert.ToByte(data.Substring(i * 2, 2), 16);
FLASH[optionoffset + address] = byte1;
address++;
if ((optionoffset + address) > total)
total = optionoffset + address;
}
}
else if (option == 2)
{
optionoffset += (int)Convert.ToUInt16(match.Groups[4].Value.ToString(), 16) << 4;
}
int checksum = Convert.ToInt32(match.Groups[5].Value.ToString(), 16);
}
Array.Resize<byte>(ref FLASH, total);
return FLASH;
}
byte[] readIntelHEXv2(StreamReader sr)
{
byte[] FLASH = new byte[sr.BaseStream.Length / 2];
int optionoffset = 0;
int total = 0;
while (!sr.EndOfStream)
{
string line = sr.ReadLine();
if (line.StartsWith(":"))
{
int length = Convert.ToInt32(line.Substring(1, 2), 16);
int address = Convert.ToInt32(line.Substring(3, 4), 16);
int option = Convert.ToInt32(line.Substring(7, 2), 16);
log.InfoFormat("len {0} add {1} opt {2}", length, address, option);
if (option == 0)
{
string data = line.Substring(9, length * 2);
for (int i = 0; i < length; i++)
{
byte byte1 = Convert.ToByte(data.Substring(i * 2, 2), 16);
FLASH[optionoffset + address] = byte1;
address++;
if ((optionoffset + address) > total)
total = optionoffset + address;
}
}
else if (option == 2)
{
optionoffset += (int)Convert.ToUInt16(line.Substring(9, 4), 16) << 4;
}
int checksum = Convert.ToInt32(line.Substring(line.Length - 2, 2), 16);
}
//Regex regex = new Regex(@"^:(..)(....)(..)(.*)(..)$"); // length - address - option - data - checksum
}
Array.Resize<byte>(ref FLASH, total);
return FLASH;
}
private void BUT_dleeprom_Click(object sender, EventArgs e)
{
ArduinoComms port = new ArduinoSTK();
if (DialogResult.Yes == CustomMessageBox.Show("is this a 1280?", "", MessageBoxButtons.YesNo))
{
port = new ArduinoSTK();
port.BaudRate = 57600;
}
else
{
port = new ArduinoSTKv2();
port.BaudRate = 115200;
}
port.DataBits = 8;
port.StopBits = StopBits.One;
port.Parity = Parity.None;
port.DtrEnable = true;
try
{
port.PortName = ArdupilotMega.MainV2.comPortName;
log.Info("Open Port");
port.Open();
log.Info("Connect AP");
if (port.connectAP())
{
log.Info("Download AP");
byte[] EEPROM = new byte[1024*4];
for (int a = 0; a < 4 * 1024; a += 0x100)
{
port.setaddress(a);
port.download(0x100).CopyTo(EEPROM,a);
}
log.Info("Verify State");
if (port.keepalive())
{
StreamWriter sw = new StreamWriter(Path.GetDirectoryName(Application.ExecutablePath) + Path.DirectorySeparatorChar + @"EEPROM.bin");
BinaryWriter bw = new BinaryWriter(sw.BaseStream);
bw.Write(EEPROM, 0, 1024 * 4);
bw.Close();
}
else
{
CustomMessageBox.Show("Communication Error - Bad data");
}
}
else
{
CustomMessageBox.Show("Communication Error - no connection");
}
port.Close();
}
catch (Exception ex) { CustomMessageBox.Show("Port Error? " + ex.ToString()); if (port != null && port.IsOpen) { port.Close(); } }
}
private void BUT_copy1280_Click(object sender, EventArgs e)
{
ArduinoSTK port = new ArduinoSTK();
port.BaudRate = 57600;
port.DataBits = 8;
port.StopBits = StopBits.One;
port.Parity = Parity.None;
port.DtrEnable = true;
try
{
port.PortName = ArdupilotMega.MainV2.comPortName;
log.Info("Open Port");
port.Open();
log.Info("Connect AP");
if (port.connectAP())
{
log.Info("Download AP");
byte[] EEPROM = new byte[1024 * 4];
for (int a = 0; a < 4 * 1024; a += 0x100)
{
port.setaddress(a);
port.download(0x100).CopyTo(EEPROM, a);
}
log.Info("Verify State");
if (port.keepalive())
{
StreamWriter sw = new StreamWriter(Path.GetDirectoryName(Application.ExecutablePath) + Path.DirectorySeparatorChar + @"EEPROM1280.bin");
BinaryWriter bw = new BinaryWriter(sw.BaseStream);
bw.Write(EEPROM, 0, EEPROM.Length);
bw.Close();
log.Info("Download AP");
byte[] FLASH = new byte[1024 * 128];
for (int a = 0; a < FLASH.Length; a += 0x100)
{
port.setaddress(a);
port.downloadflash(0x100).CopyTo(FLASH, a);
}
sw = new StreamWriter(Path.GetDirectoryName(Application.ExecutablePath) + Path.DirectorySeparatorChar + @"FLASH1280.bin");
bw = new BinaryWriter(sw.BaseStream);
bw.Write(FLASH, 0, FLASH.Length);
bw.Close();
}
else
{
CustomMessageBox.Show("Communication Error - Bad data");
}
}
else
{
CustomMessageBox.Show("Communication Error - no connection");
}
port.Close();
}
catch (Exception ex) { CustomMessageBox.Show("Port Error? " + ex.ToString()); if (port != null && port.IsOpen) { port.Close(); } }
}
private void BUT_copy2560_Click(object sender, EventArgs e)
{
ArduinoSTKv2 port = new ArduinoSTKv2();
port.BaudRate = 115200;
port.DataBits = 8;
port.StopBits = StopBits.One;
port.Parity = Parity.None;
port.DtrEnable = true;
try
{
port.PortName = ArdupilotMega.MainV2.comPortName;
log.Info("Open Port");
port.Open();
log.Info("Connect AP");
if (port.connectAP())
{
log.Info("Download AP");
byte[] EEPROM = new byte[1024 * 4];
for (int a = 0; a < EEPROM.Length; a += 0x100)
{
port.setaddress(a);
port.download(0x100).CopyTo(EEPROM, a);
}
log.Info("Verify State");
if (port.keepalive())
{
StreamWriter sw = new StreamWriter(Path.GetDirectoryName(Application.ExecutablePath) + Path.DirectorySeparatorChar + @"EEPROM2560.bin");
BinaryWriter bw = new BinaryWriter(sw.BaseStream);
bw.Write(EEPROM, 0, EEPROM.Length);
bw.Close();
log.Info("Download AP");
byte[] FLASH = new byte[1024 * 256];
for (int a = 0; a < FLASH.Length; a += 0x100)
{
port.setaddress(a);
port.downloadflash(0x100).CopyTo(FLASH, a);
}
sw = new StreamWriter(Path.GetDirectoryName(Application.ExecutablePath) + Path.DirectorySeparatorChar + @"FLASH2560.bin");
bw = new BinaryWriter(sw.BaseStream);
bw.Write(FLASH, 0, FLASH.Length);
bw.Close();
}
else
{
CustomMessageBox.Show("Communication Error - Bad data");
}
}
else
{
CustomMessageBox.Show("Communication Error - no connection");
}
port.Close();
}
catch (Exception ex) { CustomMessageBox.Show("Port Error? " + ex.ToString()); if (port != null && port.IsOpen) { port.Close(); } }
}
private void BUT_copyto1280_Click(object sender, EventArgs e)
{
ArduinoComms port = new ArduinoSTK();
port.BaudRate = 57600;
port.DataBits = 8;
port.StopBits = StopBits.One;
port.Parity = Parity.None;
port.DtrEnable = true;
StreamReader sr = new StreamReader(Path.GetDirectoryName(Application.ExecutablePath) + Path.DirectorySeparatorChar + @"EEPROM1280.bin");
BinaryReader br = new BinaryReader(sr.BaseStream);
byte[] EEPROM = br.ReadBytes(1024 * 4);
br.Close();
sr.Close();
sr = new StreamReader(Path.GetDirectoryName(Application.ExecutablePath) + Path.DirectorySeparatorChar + @"FLASH1280.bin");
br = new BinaryReader(sr.BaseStream);
byte[] FLASH = br.ReadBytes(1024 * 128);
br.Close();
sr.Close();
try
{
port.PortName = ArdupilotMega.MainV2.comPortName;
port.Open();
if (port.connectAP())
{
log.Info("starting");
port.uploadflash(FLASH, 0, FLASH.Length, 0);
port.upload(EEPROM, 0, (short)EEPROM.Length, 0);
log.Info("Uploaded");
}
else
{
CustomMessageBox.Show("Communication Error - no connection");
}
port.Close();
}
catch (Exception ex) { CustomMessageBox.Show("Check port settings or Port in use? " + ex.ToString()); port.Close(); }
}
private void button2_Click(object sender, EventArgs e)
{
byte[] FLASH = new byte[1];
try
{
StreamReader sr = new StreamReader(Path.GetDirectoryName(Application.ExecutablePath) + Path.DirectorySeparatorChar + @"firmware.hex");
FLASH = readIntelHEXv2(sr);
sr.Close();
}
catch (Exception ex) { CustomMessageBox.Show("Failed to read firmware.hex : " + ex.Message); }
StreamWriter sw = new StreamWriter(Path.GetDirectoryName(Application.ExecutablePath) + Path.DirectorySeparatorChar + @"firmware.bin");
BinaryWriter bw = new BinaryWriter(sw.BaseStream);
bw.Write(FLASH, 0, FLASH.Length);
bw.Close();
}
private void BUT_geinjection_Click(object sender, EventArgs e)
{
GMapControl MainMap = new GMapControl();
MainMap.MapType = GMap.NET.MapType.GoogleSatellite;
MainMap.CacheLocation = Path.GetDirectoryName(Application.ExecutablePath) + "/gmapcache/";
FolderBrowserDialog fbd = new FolderBrowserDialog();
try
{
fbd.SelectedPath = @"C:\Users\hog\Documents\albany 2011\New folder";
}
catch { }
fbd.ShowDialog();
if (fbd.SelectedPath != "") {
string[] files = Directory.GetFiles(fbd.SelectedPath,"*.jpg",SearchOption.AllDirectories);
foreach (string file in files)
{
log.Info(DateTime.Now.Millisecond + " Doing "+ file);
Regex reg = new Regex(@"Z([0-9]+)\\([0-9]+)\\([0-9]+)");
Match mat = reg.Match(file);
int temp = 1 << int.Parse(mat.Groups[1].Value);
GMap.NET.GPoint pnt = new GMap.NET.GPoint(int.Parse(mat.Groups[3].Value), int.Parse(mat.Groups[2].Value));
BUT_geinjection.Text = file;
BUT_geinjection.Refresh();
//MainMap.Projection.
MemoryStream tile = new MemoryStream();
Image Img = Image.FromFile(file);
Img.Save(tile,System.Drawing.Imaging.ImageFormat.Jpeg);
tile.Seek(0, SeekOrigin.Begin);
log.Info(pnt.X + " " + pnt.Y);
Application.DoEvents();
MainMap.Manager.ImageCacheLocal.PutImageToCache(tile, GMap.NET.MapType.Custom, pnt, int.Parse(mat.Groups[1].Value));
Application.DoEvents();
}
}
}
private string getfilepath(int x, int y, int zoom)
{
var tileRange = 1 << zoom;
if (x < 0 || x >= tileRange)
{
x = (x % tileRange + tileRange) % tileRange;
}
return ("Z" + zoom + "/" + y + "/" + x + ".png");
//return new GMap.NET.GPoint(x, y);
}
private void BUT_clearcustommaps_Click(object sender, EventArgs e)
{
GMapControl MainMap = new GMapControl();
MainMap.MapType = GMap.NET.MapType.GoogleSatellite;
MainMap.CacheLocation = Path.GetDirectoryName(Application.ExecutablePath) + "/gmapcache/";
int removed = ((GMap.NET.CacheProviders.SQLitePureImageCache)MainMap.Manager.ImageCacheLocal).DeleteOlderThan(DateTime.Now, GMap.NET.MapType.Custom);
CustomMessageBox.Show("Removed "+removed + " images\nshrinking file next");
GMap.NET.CacheProviders.SQLitePureImageCache.VacuumDb(MainMap.CacheLocation + @"\TileDBv3\en\Data.gmdb");
log.InfoFormat("Removed {0} images", removed);
}
private void BUT_lang_edit_Click(object sender, EventArgs e)
{
new resedit.Form1().Show();
}
private void BUT_georefimage_Click(object sender, EventArgs e)
{
new Georefimage().Show();
}
private void BUT_follow_me_Click(object sender, EventArgs e)
{
SerialInput si = new SerialInput();
ThemeManager.ApplyThemeTo((Form)si);
si.Show();
}
private void BUT_ant_track_Click(object sender, EventArgs e)
{
new Antenna.Tracker().Show();
}
private void BUT_magcalib_Click(object sender, EventArgs e)
{
MagCalib.ProcessLog();
}
void driverinstall()
{
int result = DriverPackagePreinstall(@"\Driver\XYZ.inf", 0);
if (result != 0)
MessageBox.Show("Driver installation failed.");
}
}
}