ardupilot/Tools/ArdupilotMegaPlanner/3DRRadio/Terminal.cs
Michael Oborne 6d24f5efb2 APM Planner 1.1.87
add popouts in config/setup
add more text to hud heading nw,ne,sw,se
add 5 m filter to antenna tracker
add refresh param buttons
remove the word old, as people still want it.
modify telem playback interface with slider bars
add posible fix to bad grid spacing
move mavlink code.
2012-05-20 14:47:20 +08:00

220 lines
6.7 KiB
C#

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO.Ports;
using ArdupilotMega;
using ArdupilotMega.Comms;
using System.IO;
namespace _3DRRadio
{
public partial class Terminal : UserControl
{
ICommsSerial comPort = MainV2.comPort.BaseStream;
Object thisLock = new Object();
public static bool threadrun = false;
StringBuilder cmd = new StringBuilder();
internal static StreamWriter sw;
public Terminal()
{
InitializeComponent();
if (sw == null)
sw = new StreamWriter("Terminal-" + DateTime.Now.ToString("yyyy-MM-dd HH-mm-ss") + ".txt");
}
void comPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
if (!comPort.IsOpen)
return;
try
{
lock (thisLock)
{
string data = comPort.ReadExisting();
//Console.Write(data);
if (sw != null)
{
sw.Write(data);
sw.Flush();
}
addText(data);
}
}
catch (Exception) { if (!threadrun) return; TXT_terminal.AppendText("Error reading com port\r\n"); }
}
void addText(string data)
{
this.Invoke((System.Windows.Forms.MethodInvoker)delegate()
{
TXT_terminal.SelectionStart = TXT_terminal.Text.Length;
data = data.TrimEnd('\r'); // else added \n all by itself
data = data.Replace("\0", " ");
TXT_terminal.AppendText(data);
if (data.Contains("\b"))
{
TXT_terminal.Text = TXT_terminal.Text.Remove(TXT_terminal.Text.IndexOf('\b'));
TXT_terminal.SelectionStart = TXT_terminal.Text.Length;
}
});
}
private void Terminal_Load(object sender, EventArgs e)
{
try
{
if (comPort.IsOpen)
comPort.Close();
comPort.ReadBufferSize = 1024 * 1024;
comPort.PortName = MainV2.comPort.BaseStream.PortName;
comPort.Open();
comPort.toggleDTR();
System.Threading.Thread t11 = new System.Threading.Thread(delegate()
{
threadrun = true;
DateTime start = DateTime.Now;
while ((DateTime.Now - start).TotalMilliseconds < 2000)
{
try
{
if (comPort.BytesToRead > 0)
{
comPort_DataReceived((object)null, (SerialDataReceivedEventArgs)null);
}
}
catch { return; }
}
try
{
comPort.Write("\n\n\n");
}
catch { return; }
while (threadrun)
{
try
{
System.Threading.Thread.Sleep(10);
if (!comPort.IsOpen)
break;
if (comPort.BytesToRead > 0)
{
comPort_DataReceived((object)null, (SerialDataReceivedEventArgs)null);
}
}
catch { }
}
comPort.DtrEnable = false;
try
{
//if (sw != null)
// sw.Close();
}
catch { }
if (threadrun == false)
{
comPort.Close();
}
Console.WriteLine("Comport thread close");
});
t11.IsBackground = true;
t11.Name = "Terminal serial thread";
t11.Start();
// doesnt seem to work on mac
//comPort.DataReceived += new SerialDataReceivedEventHandler(comPort_DataReceived);
TXT_terminal.AppendText("Opened com port\r\n");
}
catch (Exception) { TXT_terminal.AppendText("Cant open serial port\r\n"); return; }
TXT_terminal.Focus();
}
private void TXT_terminal_Click(object sender, EventArgs e)
{
// auto scroll
TXT_terminal.SelectionStart = TXT_terminal.Text.Length;
TXT_terminal.ScrollToCaret();
TXT_terminal.Refresh();
}
private void TXT_terminal_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyData == Keys.Up || e.KeyData == Keys.Down || e.KeyData == Keys.Left || e.KeyData == Keys.Right)
{
e.Handled = true; // ignore it
}
}
private void Terminal_FormClosing(object sender, FormClosingEventArgs e)
{
threadrun = false;
if (comPort.IsOpen)
{
comPort.Close();
}
System.Threading.Thread.Sleep(400);
}
private void TXT_terminal_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == '\r')
{
if (comPort.IsOpen)
{
try
{
// do not change this \r is correct - no \n
string temp = cmd.ToString();
if (cmd.ToString() == "+++")
{
comPort.Write(Encoding.ASCII.GetBytes(cmd.ToString()), 0, cmd.Length);
}
else
{
comPort.Write(Encoding.ASCII.GetBytes(cmd.ToString() + "\r"), 0, cmd.Length + 1);
}
if (sw != null)
{
sw.WriteLine(cmd.ToString());
sw.Flush();
}
}
catch { CustomMessageBox.Show("Error writing to com port"); }
}
cmd = new StringBuilder();
}
else
{
cmd.Append(e.KeyChar);
}
}
}
}