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.
373 lines
14 KiB
373 lines
14 KiB
using System; |
|
using System.Collections.Generic; |
|
using System.ComponentModel; |
|
using System.Drawing; |
|
using System.Data; |
|
using System.Globalization; |
|
using System.Linq; |
|
using System.Runtime.InteropServices; |
|
using System.Text; |
|
using System.Windows.Forms; |
|
using DirectShowLib; |
|
using ArdupilotMega.Controls.BackstageView; |
|
|
|
namespace ArdupilotMega.GCSViews.ConfigurationView |
|
{ |
|
public partial class ConfigPlanner : BackStageViewContentPanel |
|
{ |
|
// AR todo: replicate this functionality |
|
private bool startup = false; |
|
|
|
public ConfigPlanner() |
|
{ |
|
InitializeComponent(); |
|
} |
|
|
|
|
|
private void BUT_videostart_Click(object sender, EventArgs e) |
|
{ |
|
// stop first |
|
BUT_videostop_Click(sender, e); |
|
|
|
var bmp = (GCSViews.Configuration.GCSBitmapInfo)CMB_videoresolutions.SelectedItem; |
|
|
|
try |
|
{ |
|
MainV2.cam = new WebCamService.Capture(CMB_videosources.SelectedIndex, bmp.Media); |
|
|
|
MainV2.cam.showhud = CHK_hudshow.Checked; |
|
|
|
MainV2.cam.Start(); |
|
|
|
MainV2.config["video_options"] = CMB_videoresolutions.SelectedIndex; |
|
|
|
BUT_videostart.Enabled = false; |
|
} |
|
catch (Exception ex) { CustomMessageBox.Show("Camera Fail: " + ex.Message); } |
|
|
|
} |
|
|
|
private void BUT_videostop_Click(object sender, EventArgs e) |
|
{ |
|
BUT_videostart.Enabled = true; |
|
if (MainV2.cam != null) |
|
{ |
|
MainV2.cam.Dispose(); |
|
MainV2.cam = null; |
|
} |
|
} |
|
|
|
private void CMB_videosources_MouseClick(object sender, MouseEventArgs e) |
|
{ |
|
// the reason why i dont populate this list is because on linux/mac this call will fail. |
|
WebCamService.Capture capt = new WebCamService.Capture(); |
|
|
|
List<string> devices = WebCamService.Capture.getDevices(); |
|
|
|
CMB_videosources.DataSource = devices; |
|
|
|
capt.Dispose(); |
|
} |
|
|
|
private void CMB_videosources_SelectedIndexChanged(object sender, EventArgs e) |
|
{ |
|
int hr; |
|
int count; |
|
int size; |
|
object o; |
|
IBaseFilter capFilter = null; |
|
ICaptureGraphBuilder2 capGraph = null; |
|
AMMediaType media = null; |
|
VideoInfoHeader v; |
|
VideoStreamConfigCaps c; |
|
List<GCSViews.Configuration.GCSBitmapInfo> modes = new List<GCSViews.Configuration.GCSBitmapInfo>(); |
|
|
|
// Get the ICaptureGraphBuilder2 |
|
capGraph = (ICaptureGraphBuilder2)new CaptureGraphBuilder2(); |
|
IFilterGraph2 m_FilterGraph = (IFilterGraph2)new FilterGraph(); |
|
|
|
DsDevice[] capDevices; |
|
capDevices = DsDevice.GetDevicesOfCat(FilterCategory.VideoInputDevice); |
|
|
|
// Add the video device |
|
hr = m_FilterGraph.AddSourceFilterForMoniker(capDevices[CMB_videosources.SelectedIndex].Mon, null, "Video input", out capFilter); |
|
try |
|
{ |
|
DsError.ThrowExceptionForHR(hr); |
|
} |
|
catch (Exception ex) |
|
{ |
|
CustomMessageBox.Show("Can not add video source\n" + ex.ToString()); |
|
return; |
|
} |
|
|
|
// Find the stream config interface |
|
hr = capGraph.FindInterface(PinCategory.Capture, MediaType.Video, capFilter, typeof(IAMStreamConfig).GUID, out o); |
|
DsError.ThrowExceptionForHR(hr); |
|
|
|
IAMStreamConfig videoStreamConfig = o as IAMStreamConfig; |
|
if (videoStreamConfig == null) |
|
{ |
|
throw new Exception("Failed to get IAMStreamConfig"); |
|
} |
|
|
|
hr = videoStreamConfig.GetNumberOfCapabilities(out count, out size); |
|
DsError.ThrowExceptionForHR(hr); |
|
IntPtr TaskMemPointer = Marshal.AllocCoTaskMem(size); |
|
for (int i = 0; i < count; i++) |
|
{ |
|
IntPtr ptr = IntPtr.Zero; |
|
|
|
hr = videoStreamConfig.GetStreamCaps(i, out media, TaskMemPointer); |
|
v = (VideoInfoHeader)Marshal.PtrToStructure(media.formatPtr, typeof(VideoInfoHeader)); |
|
c = (VideoStreamConfigCaps)Marshal.PtrToStructure(TaskMemPointer, typeof(VideoStreamConfigCaps)); |
|
modes.Add(new GCSViews.Configuration.GCSBitmapInfo(v.BmiHeader.Width, v.BmiHeader.Height, c.MaxFrameInterval, c.VideoStandard.ToString(), media)); |
|
} |
|
Marshal.FreeCoTaskMem(TaskMemPointer); |
|
DsUtils.FreeAMMediaType(media); |
|
|
|
CMB_videoresolutions.DataSource = modes; |
|
|
|
if (MainV2.getConfig("video_options") != "" && CMB_videosources.Text != "") |
|
{ |
|
CMB_videoresolutions.SelectedIndex = int.Parse(MainV2.getConfig("video_options")); |
|
} |
|
} |
|
|
|
private void CHK_hudshow_CheckedChanged(object sender, EventArgs e) |
|
{ |
|
GCSViews.FlightData.myhud.hudon = CHK_hudshow.Checked; |
|
} |
|
|
|
private void CHK_enablespeech_CheckedChanged(object sender, EventArgs e) |
|
{ |
|
MainV2.speechEnable = CHK_enablespeech.Checked; |
|
MainV2.config["speechenable"] = CHK_enablespeech.Checked; |
|
if (MainV2.speechEngine != null) |
|
MainV2.speechEngine.SpeakAsyncCancelAll(); |
|
} |
|
|
|
private void CMB_language_SelectedIndexChanged(object sender, EventArgs e) |
|
{ |
|
MainV2.instance.changelanguage((CultureInfo)CMB_language.SelectedItem); |
|
|
|
#if !DEBUG |
|
MessageBox.Show("Please Restart the Planner"); |
|
|
|
Application.Exit(); |
|
#endif |
|
} |
|
|
|
private void CMB_osdcolor_SelectedIndexChanged(object sender, EventArgs e) |
|
{ |
|
if (startup) |
|
return; |
|
if (CMB_osdcolor.Text != "") |
|
{ |
|
MainV2.config["hudcolor"] = CMB_osdcolor.Text; |
|
GCSViews.FlightData.myhud.hudcolor = Color.FromKnownColor((KnownColor)Enum.Parse(typeof(KnownColor), CMB_osdcolor.Text)); |
|
} |
|
} |
|
|
|
private void CHK_speechwaypoint_CheckedChanged(object sender, EventArgs e) |
|
{ |
|
if (startup) |
|
return; |
|
MainV2.config["speechwaypointenabled"] = ((CheckBox)sender).Checked.ToString(); |
|
|
|
if (((CheckBox)sender).Checked) |
|
{ |
|
string speechstring = "Heading to Waypoint {wpn}"; |
|
if (MainV2.config["speechwaypoint"] != null) |
|
speechstring = MainV2.config["speechwaypoint"].ToString(); |
|
Common.InputBox("Notification", "What do you want it to say?", ref speechstring); |
|
MainV2.config["speechwaypoint"] = speechstring; |
|
} |
|
} |
|
|
|
private void CHK_speechmode_CheckedChanged(object sender, EventArgs e) |
|
{ |
|
if (startup) |
|
return; |
|
MainV2.config["speechmodeenabled"] = ((CheckBox)sender).Checked.ToString(); |
|
|
|
if (((CheckBox)sender).Checked) |
|
{ |
|
string speechstring = "Mode changed to {mode}"; |
|
if (MainV2.config["speechmode"] != null) |
|
speechstring = MainV2.config["speechmode"].ToString(); |
|
Common.InputBox("Notification", "What do you want it to say?", ref speechstring); |
|
MainV2.config["speechmode"] = speechstring; |
|
} |
|
} |
|
|
|
private void CHK_speechcustom_CheckedChanged(object sender, EventArgs e) |
|
{ |
|
if (startup) |
|
return; |
|
MainV2.config["speechcustomenabled"] = ((CheckBox)sender).Checked.ToString(); |
|
|
|
if (((CheckBox)sender).Checked) |
|
{ |
|
string speechstring = "Heading to Waypoint {wpn}, altitude is {alt}, Ground speed is {gsp} "; |
|
if (MainV2.config["speechcustom"] != null) |
|
speechstring = MainV2.config["speechcustom"].ToString(); |
|
Common.InputBox("Notification", "What do you want it to say?", ref speechstring); |
|
MainV2.config["speechcustom"] = speechstring; |
|
} |
|
} |
|
|
|
private void BUT_rerequestparams_Click(object sender, EventArgs e) |
|
{ |
|
if (!MainV2.comPort.BaseStream.IsOpen) |
|
return; |
|
((MyButton)sender).Enabled = false; |
|
try |
|
{ |
|
|
|
MainV2.comPort.getParamList(); |
|
|
|
|
|
|
|
|
|
} |
|
catch { CustomMessageBox.Show("Error: getting param list"); } |
|
|
|
|
|
((MyButton)sender).Enabled = true; |
|
startup = true; |
|
|
|
// AR todo: fix this up |
|
//Configuration_Load(null, null); |
|
} |
|
|
|
private void CHK_speechbattery_CheckedChanged(object sender, EventArgs e) |
|
{ |
|
if (startup) |
|
return; |
|
MainV2.config["speechbatteryenabled"] = ((CheckBox)sender).Checked.ToString(); |
|
|
|
if (((CheckBox)sender).Checked) |
|
{ |
|
string speechstring = "WARNING, Battery at {batv} Volt"; |
|
if (MainV2.config["speechbattery"] != null) |
|
speechstring = MainV2.config["speechbattery"].ToString(); |
|
Common.InputBox("Notification", "What do you want it to say?", ref speechstring); |
|
MainV2.config["speechbattery"] = speechstring; |
|
|
|
speechstring = "9.6"; |
|
if (MainV2.config["speechbatteryvolt"] != null) |
|
speechstring = MainV2.config["speechbatteryvolt"].ToString(); |
|
Common.InputBox("Battery Level", "What Voltage do you want to warn at?", ref speechstring); |
|
MainV2.config["speechbatteryvolt"] = speechstring; |
|
|
|
} |
|
} |
|
|
|
private void BUT_Joystick_Click(object sender, EventArgs e) |
|
{ |
|
Form joy = new JoystickSetup(); |
|
ThemeManager.ApplyThemeTo(joy); |
|
joy.Show(); |
|
} |
|
|
|
private void CMB_distunits_SelectedIndexChanged(object sender, EventArgs e) |
|
{ |
|
if (startup) |
|
return; |
|
MainV2.config["distunits"] = CMB_distunits.Text; |
|
MainV2.instance.changeunits(); |
|
} |
|
|
|
private void CMB_speedunits_SelectedIndexChanged(object sender, EventArgs e) |
|
{ |
|
if (startup) |
|
return; |
|
MainV2.config["speedunits"] = CMB_speedunits.Text; |
|
MainV2.instance.changeunits(); |
|
} |
|
|
|
private void CMB_rateattitude_SelectedIndexChanged(object sender, EventArgs e) |
|
{ |
|
MainV2.config[((ComboBox)sender).Name] = ((ComboBox)sender).Text; |
|
MainV2.cs.rateattitude = byte.Parse(((ComboBox)sender).Text); |
|
} |
|
|
|
private void CMB_rateposition_SelectedIndexChanged(object sender, EventArgs e) |
|
{ |
|
MainV2.config[((ComboBox)sender).Name] = ((ComboBox)sender).Text; |
|
MainV2.cs.rateposition = byte.Parse(((ComboBox)sender).Text); |
|
} |
|
|
|
private void CMB_ratestatus_SelectedIndexChanged(object sender, EventArgs e) |
|
{ |
|
MainV2.config[((ComboBox)sender).Name] = ((ComboBox)sender).Text; |
|
MainV2.cs.ratestatus = byte.Parse(((ComboBox)sender).Text); |
|
} |
|
|
|
private void CMB_raterc_SelectedIndexChanged(object sender, EventArgs e) |
|
{ |
|
MainV2.config[((ComboBox)sender).Name] = ((ComboBox)sender).Text; |
|
MainV2.cs.raterc = byte.Parse(((ComboBox)sender).Text); |
|
} |
|
|
|
private void CMB_ratesensors_SelectedIndexChanged(object sender, EventArgs e) |
|
{ |
|
MainV2.config[((ComboBox)sender).Name] = ((ComboBox)sender).Text; |
|
MainV2.cs.ratesensors = byte.Parse(((ComboBox)sender).Text); |
|
} |
|
|
|
private void CHK_mavdebug_CheckedChanged(object sender, EventArgs e) |
|
{ |
|
MainV2.comPort.debugmavlink = CHK_mavdebug.Checked; |
|
} |
|
|
|
private void CHK_resetapmonconnect_CheckedChanged(object sender, EventArgs e) |
|
{ |
|
MainV2.config[((CheckBox)sender).Name] = ((CheckBox)sender).Checked.ToString(); |
|
} |
|
|
|
private void CHK_speechaltwarning_CheckedChanged(object sender, EventArgs e) |
|
{ |
|
if (startup) |
|
return; |
|
MainV2.config["speechaltenabled"] = ((CheckBox)sender).Checked.ToString(); |
|
|
|
if (((CheckBox)sender).Checked) |
|
{ |
|
string speechstring = "WARNING, low altitude {alt}"; |
|
if (MainV2.config["speechalt"] != null) |
|
speechstring = MainV2.config["speechalt"].ToString(); |
|
Common.InputBox("Notification", "What do you want it to say?", ref speechstring); |
|
MainV2.config["speechalt"] = speechstring; |
|
|
|
speechstring = "2"; |
|
if (MainV2.config["speechaltheight"] != null) |
|
speechstring = MainV2.config["speechaltheight"].ToString(); |
|
Common.InputBox("Min Alt", "What altitude do you want to warn at? (relative to home)", ref speechstring); |
|
MainV2.config["speechaltheight"] = (double.Parse(speechstring) / MainV2.cs.multiplierdist).ToString(); // save as m |
|
|
|
} |
|
} |
|
|
|
private void NUM_tracklength_ValueChanged(object sender, EventArgs e) |
|
{ |
|
MainV2.config["NUM_tracklength"] = NUM_tracklength.Value.ToString(); |
|
|
|
} |
|
|
|
private void CHK_loadwponconnect_CheckedChanged(object sender, EventArgs e) |
|
{ |
|
MainV2.config["loadwpsonconnect"] = CHK_loadwponconnect.Checked.ToString(); |
|
} |
|
|
|
private void CHK_GDIPlus_CheckedChanged(object sender, EventArgs e) |
|
{ |
|
if (startup) |
|
return; |
|
CustomMessageBox.Show("You need to restart the planner for this to take effect"); |
|
MainV2.config["CHK_GDIPlus"] = CHK_GDIPlus.Checked.ToString(); |
|
} |
|
|
|
} |
|
}
|
|
|