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.
522 lines
16 KiB
522 lines
16 KiB
using System; |
|
using System.Collections.Generic; |
|
using System.ComponentModel; |
|
using System.Data; |
|
using System.Drawing; |
|
using System.Linq; |
|
using System.Text; |
|
using System.Windows.Forms; |
|
using System.Net; |
|
using System.IO; |
|
|
|
namespace ArdupilotMega |
|
{ |
|
public partial class _3DRradio : Form |
|
{ |
|
public delegate void LogEventHandler(string message, int level = 0); |
|
|
|
public delegate void ProgressEventHandler(double completed); |
|
|
|
string firmwarefile = Path.GetDirectoryName(Application.ExecutablePath) + Path.DirectorySeparatorChar + "radio.hm_trp.hex"; |
|
|
|
public _3DRradio() |
|
{ |
|
InitializeComponent(); |
|
} |
|
|
|
bool getFirmware() |
|
{ |
|
//https://raw.github.com/tridge/SiK/master/Firmware/dst/radio.hm_trp.hex |
|
|
|
return Common.getFilefromNet("https://raw.github.com/tridge/SiK/master/Firmware/dst/radio.hm_trp.hex", firmwarefile); |
|
} |
|
|
|
void Sleep(int mstimeout) |
|
{ |
|
DateTime endtime = DateTime.Now.AddMilliseconds(mstimeout); |
|
|
|
while (DateTime.Now < endtime) |
|
{ |
|
System.Threading.Thread.Sleep(1); |
|
Application.DoEvents(); |
|
} |
|
} |
|
|
|
private void BUT_upload_Click(object sender, EventArgs e) |
|
{ |
|
ArduinoSTK comPort = new ArduinoSTK(); |
|
|
|
string version = ""; |
|
|
|
uploader.Uploader uploader = new uploader.Uploader(); |
|
|
|
comPort.PortName = MainV2.comPort.BaseStream.PortName; |
|
comPort.BaudRate = 115200; |
|
|
|
comPort.Open(); |
|
|
|
bool bootloadermode = false; |
|
|
|
try |
|
{ |
|
uploader_ProgressEvent(0); |
|
uploader_LogEvent("Trying Bootloader Mode"); |
|
uploader.port = comPort; |
|
uploader.connect_and_sync(); |
|
uploader_LogEvent("In Bootloader Mode"); |
|
bootloadermode = true; |
|
} |
|
catch { uploader_LogEvent("Trying Firmware Mode"); bootloadermode = false; } |
|
|
|
uploader.ProgressEvent += new ProgressEventHandler(uploader_ProgressEvent); |
|
uploader.LogEvent += new LogEventHandler(uploader_LogEvent); |
|
|
|
if (!bootloadermode) |
|
{ |
|
comPort.BaudRate = 57600; |
|
// clear buffer |
|
comPort.DiscardInBuffer(); |
|
// setup a known enviroment |
|
comPort.Write("\r\n"); |
|
// wait |
|
Sleep(1000); |
|
// send config string |
|
comPort.Write("+++"); |
|
// wait |
|
Sleep(1100); |
|
// check for config responce "OK" |
|
if (comPort.ReadExisting().Contains("OK")) |
|
{ |
|
|
|
} |
|
|
|
comPort.Write("\r\nATI\r\n"); |
|
|
|
Sleep(100); |
|
|
|
version = comPort.ReadExisting(); |
|
} |
|
|
|
|
|
if (version.Contains("on HM-TRP") || bootloadermode) |
|
{ |
|
if (getFirmware()) |
|
{ |
|
uploader.IHex iHex = new uploader.IHex(); |
|
|
|
iHex.LogEvent += new LogEventHandler(iHex_LogEvent); |
|
|
|
iHex.ProgressEvent += new ProgressEventHandler(iHex_ProgressEvent); |
|
|
|
try |
|
{ |
|
iHex.load(firmwarefile); |
|
} |
|
catch { MessageBox.Show("Bad Firmware File"); goto exit; } |
|
|
|
if (!bootloadermode) |
|
{ |
|
|
|
comPort.Write("AT&UPDATE\r\n"); |
|
string left = comPort.ReadExisting(); |
|
Console.WriteLine(left); |
|
Sleep(700); |
|
comPort.BaudRate = 115200; |
|
|
|
} |
|
|
|
try |
|
{ |
|
uploader.upload(comPort, iHex); |
|
} |
|
catch (Exception ex) { MessageBox.Show("Upload Failed " + ex.Message); goto exit; } |
|
} |
|
else |
|
{ |
|
MessageBox.Show("Failed to download new firmware"); |
|
} |
|
} |
|
else |
|
{ |
|
MessageBox.Show("Failed to identify Radio"); |
|
} |
|
|
|
exit: |
|
if (comPort.IsOpen) |
|
comPort.Close(); |
|
} |
|
|
|
void iHex_ProgressEvent(double completed) |
|
{ |
|
try |
|
{ |
|
Progressbar.Value = (int)(completed * 100); |
|
Application.DoEvents(); |
|
} |
|
catch { } |
|
} |
|
|
|
void uploader_LogEvent(string message, int level = 0) |
|
{ |
|
try |
|
{ |
|
if (level == 0) |
|
{ |
|
Console.Write(message); |
|
lbl_status.Text = message; |
|
Application.DoEvents(); |
|
} |
|
} |
|
catch { } |
|
} |
|
|
|
void iHex_LogEvent(string message, int level = 0) |
|
{ |
|
try |
|
{ |
|
if (level == 0) |
|
{ |
|
lbl_status.Text = message; |
|
Console.WriteLine(message); |
|
Application.DoEvents(); |
|
} |
|
} |
|
catch { } |
|
} |
|
|
|
void uploader_ProgressEvent(double completed) |
|
{ |
|
try |
|
{ |
|
Progressbar.Value = (int)(completed * 100); |
|
Application.DoEvents(); |
|
} |
|
catch { } |
|
} |
|
|
|
private void BUT_getcurrent_Click(object sender, EventArgs e) |
|
{ |
|
SerialPort comPort = new SerialPort(); |
|
|
|
comPort.PortName = MainV2.comPort.BaseStream.PortName; |
|
comPort.BaudRate = 57600; |
|
|
|
comPort.ReadTimeout = 4000; |
|
|
|
comPort.Open(); |
|
|
|
lbl_status.Text = "Connecting"; |
|
|
|
if (doConnect(comPort)) |
|
{ |
|
comPort.DiscardInBuffer(); |
|
|
|
lbl_status.Text = "Doing Command ATI & RTI"; |
|
|
|
ATI.Text = doCommand(comPort, "ATI1"); |
|
|
|
RTI.Text = doCommand(comPort, "RTI1"); |
|
|
|
RSSI.Text = doCommand(comPort, "ATI7"); |
|
|
|
lbl_status.Text = "Doing Command ATI5"; |
|
|
|
string answer = doCommand(comPort, "ATI5"); |
|
|
|
Console.Write("Local\n" + answer); |
|
|
|
string[] items = answer.Split('\n'); |
|
|
|
foreach (string item in items) |
|
{ |
|
if (item.StartsWith("S")) |
|
{ |
|
string[] values = item.Split(':', '='); |
|
|
|
if (values.Length == 3) |
|
{ |
|
Control[] controls = this.Controls.Find(values[0].Trim(), false); |
|
|
|
if (controls.Length > 0) |
|
{ |
|
if (controls[0].GetType() == typeof(CheckBox)) |
|
{ |
|
((CheckBox)controls[0]).Checked = values[2].Trim() == "1"; |
|
} |
|
else |
|
{ |
|
controls[0].Text = values[2].Trim(); |
|
} |
|
} |
|
} |
|
} |
|
} |
|
|
|
// remote |
|
|
|
comPort.DiscardInBuffer(); |
|
|
|
lbl_status.Text = "Doing Command RTI5"; |
|
|
|
answer = doCommand(comPort, "RTI5"); |
|
|
|
Console.Write("Remote\n" + answer); |
|
|
|
items = answer.Split('\n'); |
|
|
|
foreach (string item in items) |
|
{ |
|
if (item.StartsWith("S")) |
|
{ |
|
string[] values = item.Split(':', '='); |
|
|
|
if (values.Length == 3) |
|
{ |
|
Control[] controls = this.Controls.Find("R"+values[0].Trim(), false); |
|
|
|
if (controls[0].GetType() == typeof(CheckBox)) |
|
{ |
|
((CheckBox)controls[0]).Checked = values[2].Trim() == "1"; |
|
} |
|
else |
|
{ |
|
controls[0].Text = values[2].Trim(); |
|
} |
|
} |
|
} |
|
} |
|
|
|
lbl_status.Text = "Done"; |
|
} |
|
else |
|
{ |
|
lbl_status.Text = "Fail"; |
|
MessageBox.Show("Failed to enter command mode"); |
|
} |
|
|
|
comPort.WriteLine("ATZ"); |
|
|
|
comPort.Close(); |
|
|
|
} |
|
|
|
string doCommand(SerialPort comPort, string cmd) |
|
{ |
|
Sleep(100); |
|
comPort.DiscardInBuffer(); |
|
comPort.Write(cmd + "\r\n"); |
|
string temp = comPort.ReadLine(); // echo |
|
Sleep(500); |
|
string ans = ""; |
|
while (comPort.BytesToRead > 0) |
|
{ |
|
ans = ans + comPort.ReadLine() + "\n"; |
|
Sleep(50); |
|
|
|
if (ans.Length > 500) |
|
return ""; |
|
} |
|
|
|
return ans; |
|
} |
|
|
|
bool doConnect(SerialPort comPort) |
|
{ |
|
// clear buffer |
|
comPort.DiscardOutBuffer(); |
|
comPort.DiscardInBuffer(); |
|
// setup a known enviroment |
|
comPort.Write("\r\n"); |
|
// wait |
|
Sleep(1100); |
|
// send config string |
|
comPort.Write("+++"); |
|
// wait |
|
Sleep(1100); |
|
// check for config responce "OK" |
|
if (comPort.ReadExisting().Contains("OK")) |
|
{ |
|
//return true; |
|
} |
|
else |
|
{ |
|
// cleanup incase we are already in cmd mode |
|
comPort.Write("\r\n"); |
|
} |
|
|
|
string version = doCommand(comPort, "ATI"); |
|
|
|
Console.Write("Connect Version: "+version); |
|
|
|
if (version.Contains("on HM-TRP")) |
|
{ |
|
return true; |
|
} |
|
|
|
return false; |
|
} |
|
|
|
private void BUT_savesettings_Click(object sender, EventArgs e) |
|
{ |
|
SerialPort comPort = new SerialPort(); |
|
|
|
comPort.PortName = MainV2.comPort.BaseStream.PortName; |
|
comPort.BaudRate = 57600; |
|
|
|
comPort.ReadTimeout = 4000; |
|
|
|
comPort.Open(); |
|
|
|
lbl_status.Text = "Connecting"; |
|
|
|
if (doConnect(comPort)) |
|
{ |
|
comPort.DiscardInBuffer(); |
|
|
|
lbl_status.Text = "Doing Command"; |
|
|
|
// remote |
|
string answer = doCommand(comPort, "RTI5"); |
|
|
|
Console.Write("Remote\n"+answer); |
|
|
|
string[] items = answer.Split('\n'); |
|
|
|
foreach (string item in items) |
|
{ |
|
if (item.StartsWith("S")) |
|
{ |
|
string[] values = item.Split(':', '='); |
|
|
|
if (values.Length == 3) |
|
{ |
|
Control[] controls = this.Controls.Find("R"+values[0].Trim(), false); |
|
|
|
if (controls.Length > 0) |
|
{ |
|
if (controls[0].GetType() == typeof(CheckBox)) |
|
{ |
|
string value = ((CheckBox)controls[0]).Checked ? "1" : "0"; |
|
|
|
if (value != values[2].Trim()) |
|
{ |
|
string cmdanswer = doCommand(comPort, "RT" + values[0].Trim() + "=" + value + "\r"); |
|
|
|
if (cmdanswer.Contains("OK")) |
|
{ |
|
|
|
} |
|
else |
|
{ |
|
MessageBox.Show("Set Command error"); |
|
} |
|
} |
|
} |
|
else |
|
{ |
|
if (controls[0].Text != values[2].Trim()) |
|
{ |
|
string cmdanswer = doCommand(comPort, "RT" + values[0].Trim() + "=" + controls[0].Text + "\r"); |
|
|
|
if (cmdanswer.Contains("OK")) |
|
{ |
|
|
|
} |
|
else |
|
{ |
|
MessageBox.Show("Set Command error"); |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} |
|
|
|
// write it |
|
doCommand(comPort, "RT&W"); |
|
|
|
// return to normal mode |
|
comPort.WriteLine("RTZ"); |
|
|
|
comPort.Write("\r\n"); |
|
|
|
Sleep(100); |
|
|
|
comPort.DiscardInBuffer(); |
|
//local |
|
answer = doCommand(comPort, "ATI5"); |
|
|
|
Console.Write("Local\n" + answer); |
|
|
|
items = answer.Split('\n'); |
|
|
|
foreach (string item in items) |
|
{ |
|
if (item.StartsWith("S")) |
|
{ |
|
string[] values = item.Split(':', '='); |
|
|
|
if (values.Length == 3) |
|
{ |
|
Control[] controls = this.Controls.Find(values[0].Trim(), false); |
|
|
|
if (controls.Length > 0) |
|
{ |
|
if (controls[0].GetType() == typeof(CheckBox)) |
|
{ |
|
string value = ((CheckBox)controls[0]).Checked ? "1" : "0"; |
|
|
|
if (value != values[2].Trim()) |
|
{ |
|
string cmdanswer = doCommand(comPort, "AT" + values[0].Trim() + "=" + value + "\r"); |
|
|
|
if (cmdanswer.Contains("OK")) |
|
{ |
|
|
|
} |
|
else |
|
{ |
|
MessageBox.Show("Set Command error"); |
|
} |
|
} |
|
} |
|
else |
|
{ |
|
if (controls[0].Text != values[2].Trim()) |
|
{ |
|
string cmdanswer = doCommand(comPort, "AT" + values[0].Trim() + "=" + controls[0].Text + "\r"); |
|
|
|
if (cmdanswer.Contains("OK")) |
|
{ |
|
|
|
} |
|
else |
|
{ |
|
MessageBox.Show("Set Command error"); |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} |
|
|
|
// write it |
|
doCommand(comPort, "AT&W"); |
|
|
|
lbl_status.Text = "Done"; |
|
} |
|
else |
|
{ |
|
lbl_status.Text = "Fail"; |
|
MessageBox.Show("Failed to enter command mode"); |
|
} |
|
|
|
// return to normal mode |
|
comPort.WriteLine("ATZ"); |
|
|
|
comPort.Close(); |
|
} |
|
} |
|
} |