You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
299 lines
10 KiB
299 lines
10 KiB
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 ArdupilotMega; |
|
using System.IO.Ports; |
|
|
|
namespace ArdupilotMega.GCSViews |
|
{ |
|
public partial class Terminal : MyUserControl |
|
{ |
|
ICommsSerial comPort = MainV2.comPort.BaseStream; |
|
Object thisLock = new Object(); |
|
public static bool threadrun = false; |
|
bool inlogview = false; |
|
List<string> cmdHistory = new List<string>(); |
|
int history = 0; |
|
int inputStartPos = 0; |
|
|
|
public Terminal() |
|
{ |
|
while (threadrun == true) |
|
threadrun = false; |
|
|
|
InitializeComponent(); |
|
} |
|
|
|
void comPort_DataReceived(object sender, SerialDataReceivedEventArgs e) |
|
{ |
|
if (!comPort.IsOpen) |
|
return; |
|
try |
|
{ |
|
lock (thisLock) |
|
{ |
|
string data = comPort.ReadExisting(); |
|
//Console.Write(data); |
|
|
|
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; |
|
} |
|
inputStartPos = TXT_terminal.SelectionStart; |
|
}); |
|
} |
|
|
|
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 |
|
}*/ |
|
lock (thisLock) |
|
{ |
|
switch (e.KeyData) |
|
{ |
|
case Keys.Up: |
|
if (history > 0) |
|
{ |
|
TXT_terminal.Select(inputStartPos, TXT_terminal.Text.Length - inputStartPos); |
|
TXT_terminal.SelectedText = ""; |
|
TXT_terminal.AppendText(cmdHistory[--history]); |
|
} |
|
e.Handled = true; |
|
break; |
|
case Keys.Down: |
|
if (history < cmdHistory.Count - 1) |
|
{ |
|
TXT_terminal.Select(inputStartPos, TXT_terminal.Text.Length - inputStartPos); |
|
TXT_terminal.SelectedText = ""; |
|
TXT_terminal.AppendText(cmdHistory[++history]); |
|
} |
|
e.Handled = true; |
|
break; |
|
case Keys.Left: |
|
case Keys.Back: |
|
if (TXT_terminal.SelectionStart <= inputStartPos) |
|
e.Handled = true; |
|
break; |
|
|
|
//case Keys.Right: |
|
// break; |
|
} |
|
} |
|
} |
|
|
|
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 |
|
{ |
|
string cmd = ""; |
|
lock (thisLock) |
|
{ |
|
cmd = TXT_terminal.Text.Substring(inputStartPos, TXT_terminal.Text.Length - inputStartPos - 1); |
|
TXT_terminal.Select(inputStartPos, TXT_terminal.Text.Length - inputStartPos); |
|
TXT_terminal.SelectedText = ""; |
|
if (cmd.Length > 0 && (cmdHistory.Count == 0 || cmdHistory.Last() != cmd)) |
|
{ |
|
cmdHistory.Add(cmd); |
|
history = cmdHistory.Count; |
|
} |
|
} |
|
// do not change this \r is correct - no \n |
|
comPort.Write(Encoding.ASCII.GetBytes(cmd + "\r"), 0, cmd.Length + 1); |
|
} |
|
catch { MessageBox.Show("Error writing to com port"); } |
|
} |
|
} |
|
/* |
|
if (comPort.IsOpen) |
|
{ |
|
try |
|
{ |
|
comPort.Write(new byte[] { (byte)e.KeyChar }, 0, 1); |
|
} |
|
catch { MessageBox.Show("Error writing to com port"); } |
|
} |
|
e.Handled = true;*/ |
|
} |
|
|
|
private void Terminal_Load(object sender, EventArgs e) |
|
{ |
|
try |
|
{ |
|
MainV2.givecomport = true; |
|
|
|
if (comPort.IsOpen) |
|
comPort.Close(); |
|
|
|
comPort.DtrEnable = true; |
|
|
|
comPort.ReadBufferSize = 1024 * 1024; |
|
|
|
comPort.PortName = MainV2.comportname; |
|
|
|
comPort.Open(); |
|
|
|
System.Threading.Thread t11 = new System.Threading.Thread(delegate() |
|
{ |
|
threadrun = true; |
|
|
|
DateTime start = DateTime.Now; |
|
|
|
while ((DateTime.Now - start).TotalMilliseconds < 2000) |
|
{ |
|
if (comPort.BytesToRead > 0) |
|
{ |
|
comPort_DataReceived((object)null, (SerialDataReceivedEventArgs)null); |
|
} |
|
} |
|
|
|
comPort.Write("\n\n\n"); |
|
|
|
while (threadrun) |
|
{ |
|
try |
|
{ |
|
System.Threading.Thread.Sleep(10); |
|
if (inlogview) |
|
continue; |
|
if (!comPort.IsOpen) |
|
break; |
|
if (comPort.BytesToRead > 0) |
|
{ |
|
comPort_DataReceived((object)null, (SerialDataReceivedEventArgs)null); |
|
} |
|
} |
|
catch { } |
|
} |
|
|
|
comPort.DtrEnable = false; |
|
|
|
if (threadrun == false) |
|
{ |
|
comPort.Close(); |
|
} |
|
Console.WriteLine("Comport thread close"); |
|
}); |
|
t11.IsBackground = true; |
|
t11.Name = "Terminal serial thread"; |
|
t11.Start(); |
|
MainV2.threads.Add(t11); |
|
|
|
// doesnt seem to work on mac |
|
//comPort.DataReceived += new SerialDataReceivedEventHandler(comPort_DataReceived); |
|
|
|
TXT_terminal.AppendText("Opened com port\r\n"); |
|
inputStartPos = TXT_terminal.SelectionStart; |
|
} |
|
catch (Exception) { TXT_terminal.AppendText("Cant open serial port\r\n"); return; } |
|
} |
|
|
|
private void BUTsetupshow_Click(object sender, EventArgs e) |
|
{ |
|
if (comPort.IsOpen) |
|
{ |
|
try |
|
{ |
|
System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding(); |
|
byte[] data = encoding.GetBytes("exit\rsetup\rshow\r"); |
|
comPort.Write(data, 0, data.Length); |
|
} |
|
catch { } |
|
} |
|
TXT_terminal.Focus(); |
|
} |
|
|
|
private void BUTradiosetup_Click(object sender, EventArgs e) |
|
{ |
|
if (comPort.IsOpen) |
|
{ |
|
try |
|
{ |
|
System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding(); |
|
byte[] data = encoding.GetBytes("exit\rsetup\r\nradio\r"); |
|
comPort.Write(data, 0, data.Length); |
|
} |
|
catch { } |
|
} |
|
TXT_terminal.Focus(); |
|
} |
|
|
|
private void BUTtests_Click(object sender, EventArgs e) |
|
{ |
|
if (comPort.IsOpen) |
|
{ |
|
try |
|
{ |
|
System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding(); |
|
byte[] data = encoding.GetBytes("exit\rtest\r?\r\n"); |
|
comPort.Write(data, 0, data.Length); |
|
} |
|
catch { } |
|
} |
|
TXT_terminal.Focus(); |
|
} |
|
|
|
private void Logs_Click(object sender, EventArgs e) |
|
{ |
|
Form Log = new Log(); |
|
MainV2.fixtheme(Log); |
|
inlogview = true; |
|
Log.ShowDialog(); |
|
inlogview = false; |
|
} |
|
|
|
private void BUT_logbrowse_Click(object sender, EventArgs e) |
|
{ |
|
Form logbrowse = new LogBrowse(); |
|
MainV2.fixtheme(logbrowse); |
|
logbrowse.ShowDialog(); |
|
} |
|
} |
|
} |