using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.IO; using System.IO.Ports; namespace CPFTrack { public partial class Form1 : Form { public delegate void IUSBLUpdateHandler(object sender, IUSBLData e); public event IUSBLUpdateHandler OnIUSBLUpdate; public Form1() { InitializeComponent(); } private SerialPort iusblSerialPort = new SerialPort(); private static byte[] iusblMsgBuffer; private void Form1_Load(object sender, EventArgs e) { formStripChart = new FormStripChart(this); formStripChart.FormClosed += formStripChart_FormClosed; formStripChart.Show(); iusblSerialPort.BaudRate = 9600; iusblSerialPort.DataBits = 8; iusblSerialPort.Handshake = Handshake.None; iusblSerialPort.Parity = Parity.None; iusblSerialPort.PortName = "COM5"; iusblSerialPort.StopBits = StopBits.One; iusblMsgBuffer = new byte[iusblSerialPort.ReadBufferSize]; iusblSerialPort.DataReceived += new SerialDataReceivedEventHandler(iusblSerialPort_DataReceived); iusblSerialPort.Open(); timerIUSBL.Enabled = true; } private static double depthValue = 0.0; private static Random randomValue = new Random(); private void UpdateStatus(IUSBLData args) { // Make sure someone is listening to event if (OnIUSBLUpdate == null) return; //ProgressEventArgs args = new ProgressEventArgs(status); OnIUSBLUpdate(this, args); } public class IUSBLData : EventArgs { public double rangeValue = double.NaN; public double xValue = double.NaN; public double yValue = double.NaN; public double zValue = double.NaN; public DateTime timeStamp = new DateTime(); } private static IUSBLData iusblData = new IUSBLData(); FormStripChart formStripChart; private void newStripChartToolStripMenuItem_Click(object sender, EventArgs e) { if (formStripChart == null) { formStripChart = new FormStripChart(this); formStripChart.FormClosed += formStripChart_FormClosed; formStripChart.Show(); } else formStripChart.Activate(); } void formStripChart_FormClosed(object sender, FormClosedEventArgs e) { formStripChart = null; } private void exitToolStripMenuItem_Click(object sender, EventArgs e) { Application.Exit(); } private string inString = string.Empty; private StringBuilder inSB = new StringBuilder(256); delegate void SetTextCallback(String msgString); private void iusblSerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e) { //There is no accurate method for checking how many bytes are read //unless you check the return from the Read method int bytesRead = iusblSerialPort.Read(iusblMsgBuffer, 0, iusblMsgBuffer.Length); //For the example assume the data we are received is ASCII data. inString += Encoding.ASCII.GetString(iusblMsgBuffer, 0, bytesRead); if (inString.Contains("\n")) { this.BeginInvoke(new SetTextCallback(parseIUSBL), new object[] { inString }); inString = String.Empty; } } private static string[] inFields; private void parseIUSBL(String inString) { Console.WriteLine("Received: " + inString); inFields = inString.Split(',', 'R', 'X', 'Y', 'Z'); iusblData.rangeValue = double.Parse(inFields[2]); if(inFields.Length > 5) { iusblData.xValue = double.Parse(inFields[4]); iusblData.yValue = double.Parse(inFields[6]); iusblData.zValue = double.Parse(inFields[8]); } } private void simIUSBL(StringBuilder inSB) { Console.WriteLine(inSB.ToString()); depthValue = depthValue - randomValue.NextDouble(); iusblData.xValue = 0.0; iusblData.yValue = 0.0; iusblData.zValue = depthValue; iusblData.timeStamp = DateTime.Now; //ProgressEventArgs args = new ProgressEventArgs("test status"); tbIUSBLDepth.Text = iusblData.zValue.ToString("f1"); tbIUSBLNorthing.Text = iusblData.yValue.ToString("f1"); tbIUSBLEasting.Text = iusblData.xValue.ToString("f1"); UpdateStatus(iusblData); // writeKML(iusblData); } private static StreamWriter kmlFile = new StreamWriter("usblTrack.kml"); private static StringBuilder sbTemp = new StringBuilder(128); private void writeKML(IUSBLData iusblData) { kmlFile.WriteLine(@""); kmlFile.WriteLine(@""); kmlFile.WriteLine(""); kmlFile.WriteLine(" "); kmlFile.WriteLine(" "); kmlFile.WriteLine(" absolute"); for (int i = 1; i > -100; i--) { sbTemp.Clear(); sbTemp.Append(" -121.80 36.805 "); sbTemp.Append(i.ToString()); sbTemp.Append(""); kmlFile.WriteLine(sbTemp.ToString()); } kmlFile.WriteLine(" "); kmlFile.WriteLine(" "); kmlFile.WriteLine(""); kmlFile.WriteLine(""); kmlFile.Close(); } // kmlFile.WriteLine(@" \n'); // kmlFile.WriteLine(@" Paragon\n'); // kmlFile.WriteLine(@" \n'); // kmlFile.WriteLine(@" \n'); // kmlFile.WriteLine(@" %3.9f\n', lon(end)); // kmlFile.WriteLine(@" %3.9f\n', lat(end)); // kmlFile.WriteLine(@" 0\n'); // kmlFile.WriteLine(@" \n'); // kmlFile.WriteLine(@" \n'); // kmlFile.WriteLine(@" %f\n', mod(heading + 180, 360)); // kmlFile.WriteLine(@" 0\n'); // kmlFile.WriteLine(@" 0\n'); // kmlFile.WriteLine(@" \n'); // kmlFile.WriteLine(@" \n'); // kmlFile.WriteLine(@" 1\n'); // kmlFile.WriteLine(@" 1\n'); // kmlFile.WriteLine(@" 1\n'); // kmlFile.WriteLine(@" \n'); // kmlFile.WriteLine(@" \n'); // kmlFile.WriteLine(@" Paragon.dae\n'); // kmlFile.WriteLine(@" \n'); // kmlFile.WriteLine(@" \n'); // kmlFile.WriteLine(@" \n\n'); // // kmlFile.WriteLine(@" \n'); // kmlFile.WriteLine(@" %3.9f\n', lon(end)); // kmlFile.WriteLine(@" %3.9f\n', lat(end)); // kmlFile.WriteLine(@" %f\n', GEZoom); // % kmlFile.WriteLine(@" 0\n'); // % kmlFile.WriteLine(@" 0\n'); // kmlFile.WriteLine(@" relativeToGround\n'); // kmlFile.WriteLine(@" \n\n'); // // kmlFile.WriteLine(@"\n'); // kmlFile.WriteLine(@"\n'); // // fclose(fid); //end private void Form1_FormClosing(object sender, FormClosingEventArgs e) { if (iusblSerialPort.IsOpen) iusblSerialPort.Close(); } private static String outString = "POS V6,4 R100.00,X80.00,Y10.00,Z"; private static double depth = 0.0; private void timerIUSBL_Tick(object sender, EventArgs e) { depth = depth - 1.0; Console.Write("Sending: " + outString + depth.ToString() + "\r\n"); iusblSerialPort.Write(outString + depth.ToString() + "\r\n"); } } }