private void button1_Click(object sender, EventArgs e) { if (radioButton1.Checked == true) { serialThread = false; comPort.Close(); timer1.Stop(); about_blank(); disconnect(); } else { if (textBox1.Text == "" || textBox2.Text == "" || textBox3.Text == "") { MessageBox.Show("IP 또는 Port가 입력되지 않았습니다."); } else { String IP = textBox1.Text; int port = Convert.ToInt32(textBox2.Text); int ser2port = Convert.ToInt32(textBox3.Text); Connection(IP, port); } } }
private void Lbl_bootloaderupdate_Click(object sender, EventArgs e) { // connect to mavlink var mav = new MAVLinkInterface(); MainV2.instance.doConnect(mav, MainV2._connectionControl.CMB_serialport.Text, MainV2._connectionControl.CMB_baudrate.Text, false); if (mav.BaseStream == null || !mav.BaseStream.IsOpen) { return; } if (CustomMessageBox.Show("Are you sure you want to upgrade the bootloader? This can brick your board", "BL Update", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == (int)DialogResult.Yes) { if (CustomMessageBox.Show("Are you sure you want to upgrade the bootloader? This can brick your board, Please allow 5 mins for this process", "BL Update", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == (int)DialogResult.Yes) { if (mav.doCommand(MAVLink.MAV_CMD.FLASH_BOOTLOADER, 0, 0, 0, 0, 290876, 0, 0)) { CustomMessageBox.Show("Upgraded bootloader"); } else { CustomMessageBox.Show("Failed to upgrade bootloader"); } } } mav?.Close(); }
public static void doUpload(string file) { if (!validcred) { doUserAndPassword(); } string droneshareusername = MainV2.getConfig("droneshareusername"); string dronesharepassword = MainV2.getConfig("dronesharepassword"); if (dronesharepassword != "") { try { // fail on bad entry var crypto = new Crypto(); dronesharepassword = crypto.DecryptString(dronesharepassword); } catch { } } MAVLinkInterface mav = new MAVLinkInterface(); mav.BaseStream = new Comms.CommsFile(); mav.BaseStream.PortName = file; mav.BaseStream.Open(); if (mav.getHeartBeat().Length == 0) { CustomMessageBox.Show("Invalid log"); return; } mav.Close(); string viewurl = Utilities.DroneApi.droneshare.doUpload(file, droneshareusername, dronesharepassword, mav.MAV.Guid, Utilities.DroneApi.APIConstants.apiKey); if (viewurl != "") { try { validcred = true; System.Diagnostics.Process.Start(viewurl); } catch (Exception ex) { log.Error(ex); CustomMessageBox.Show("Failed to open url " + viewurl); } } }
public static void doUpload(string file) { doUserAndPassword(); string droneshareusername = MainV2.getConfig("droneshareusername"); string dronesharepassword = MainV2.getConfig("dronesharepassword"); if (dronesharepassword != "") { try { // fail on bad entry var crypto = new Crypto(); dronesharepassword = crypto.DecryptString(dronesharepassword); } catch { } } MAVLinkInterface mav = new MAVLinkInterface(); mav.BaseStream = new Comms.CommsFile(); mav.BaseStream.PortName = file; mav.getHeartBeat(); mav.Close(); string viewurl = Utilities.DroneApi.droneshare.doUpload(file, droneshareusername, dronesharepassword, mav.MAV.Guid , Utilities.DroneApi.APIConstants.apiKey); if (viewurl != "") { try { System.Diagnostics.Process.Start(viewurl); } catch (Exception ex) { log.Error(ex); CustomMessageBox.Show("Failed to open url " + viewurl); } } }
private void FWUpload(object?a) { try { Tuple <int, string> passin = (Tuple <int, string>)a; var index = passin.Item1; var portname = passin.Item2; var tryupload = true; lock (ports) if (ports.Contains(portname)) { tryupload = false; } if (tryupload) { var fw = Firmware.ProcessFirmware(_args[0]); Uploader up = null; try { up = new px4uploader.Uploader(new SerialPort(portname, 115200)); } catch { } if (up != null) { up.ProgressEvent += completed => { /* this.BeginInvoke(new Action(() => * { * textBox1.AppendText(portname + " " + (int)completed + "\r\n"); * }));*/ }; bool flashit = false; bool validcomms = false; try { up.identify(); validcomms = true; up.currentChecksum(fw); flashit = true; } catch (Exception ex) { AppendLine(ex.Message); } if (flashit) { this.BeginInvoke(new Action(() => { textBox1.AppendText(portname + " Flashing fw\r\n"); })); up.upload(fw); } else { this.BeginInvoke(new Action(() => { textBox1.AppendText(portname + " reboot\r\n"); })); up.__reboot(); } lock (ports) ports.Add(portname); up.close(); this.BeginInvoke(new Action(() => { textBox1.AppendText(portname + " Done fw\r\n"); })); if (validcomms) { return; } } } var mav = new MAVLinkInterface(); mav.BaseStream = new SerialPort((string)portname, 115200); var bldone = false; mav.OnPacketReceived += (sender, message) => { if (message.msgid == (ulong)MAVLink.MAVLINK_MSG_ID.STATUSTEXT) { if (ASCIIEncoding.ASCII.GetString(message.ToStructure <MAVLink.mavlink_statustext_t>().text).Trim().Contains("Bootloader up-to-date") || ASCIIEncoding.ASCII.GetString(message.ToStructure <MAVLink.mavlink_statustext_t>().text).Trim().Contains("Flash OK")) { bldone = true; } DisplayText(message); } }; try { mav.BaseStream.Open(); mav.getHeartBeat(); mav.doCommand(MAVLink.MAV_CMD.FLASH_BOOTLOADER, 0, 0, 0, 0, 290876, 0, 0, false); mav.getHeartBeat(); if (!bldone) { mav.getHeartBeat(); } if (!bldone) { mav.getHeartBeat(); } if (!bldone) { mav.getHeartBeat(); } if (!bldone) { mav.getHeartBeat(); } if (!bldone) { mav.getHeartBeat(); } if (!bldone) { mav.getHeartBeat(); } if (!bldone) { mav.getHeartBeat(); } if (!bldone) { mav.getHeartBeat(); } mav.Close(); this.BeginInvoke(new Action(() => { textBox1.AppendText(portname + " Done bl " + (bldone ? "OK" : "FAIL") + "\r\n"); })); } catch (Exception ex) { AppendLine(ex.Message); } } catch (Exception ex) { AppendLine(ex.Message); } }
/// <summary> /// main serial reader thread /// controls /// serial reading /// link quality stats /// speech voltage - custom - alt warning - data lost /// heartbeat packet sending /// /// and can't fall out /// </summary> internal void SerialReader() { if (serialThread == true) { return; } serialThread = true; SerialThreadrunner.Reset(); int minbytes = 10; int altwarningmax = 0; bool armedstatus = false; string lastmessagehigh = ""; DateTime speechcustomtime = DateTime.Now; DateTime speechlowspeedtime = DateTime.Now; DateTime linkqualitytime = DateTime.Now; while (serialThread) { try { Thread.Sleep(1); // was 5 // update connect/disconnect button and info stats try { //UpdateConnectIcon(); } catch (Exception ex) { log.Error(ex); } // 30 seconds interval speech options if (speechEnable && speechEngine != null && (DateTime.Now - speechcustomtime).TotalSeconds > 30 && (MainV2.comPort.logreadmode || comPort.BaseStream.IsOpen)) { if (MainV2.speechEngine.IsReady) { if (Settings.Instance.GetBoolean("speechcustomenabled")) { MainV2.speechEngine.SpeakAsync(ArduPilot.Common.speechConversion(comPort.MAV, "" + Settings.Instance["speechcustom"])); } speechcustomtime = DateTime.Now; } // speech for battery alerts //speechbatteryvolt float warnvolt = Settings.Instance.GetFloat("speechbatteryvolt"); float warnpercent = Settings.Instance.GetFloat("speechbatterypercent"); if (Settings.Instance.GetBoolean("speechbatteryenabled") == true && MainV2.comPort.MAV.cs.battery_voltage <= warnvolt && MainV2.comPort.MAV.cs.battery_voltage >= 5.0) { if (MainV2.speechEngine.IsReady) { MainV2.speechEngine.SpeakAsync(ArduPilot.Common.speechConversion(comPort.MAV, "" + Settings.Instance["speechbattery"])); } } else if (Settings.Instance.GetBoolean("speechbatteryenabled") == true && (MainV2.comPort.MAV.cs.battery_remaining) < warnpercent && MainV2.comPort.MAV.cs.battery_voltage >= 5.0 && MainV2.comPort.MAV.cs.battery_remaining != 0.0) { if (MainV2.speechEngine.IsReady) { MainV2.speechEngine.SpeakAsync( ArduPilot.Common.speechConversion(comPort.MAV, "" + Settings.Instance["speechbattery"])); } } } // speech for airspeed alerts if (speechEnable && speechEngine != null && (DateTime.Now - speechlowspeedtime).TotalSeconds > 10 && (MainV2.comPort.logreadmode || comPort.BaseStream.IsOpen)) { if (Settings.Instance.GetBoolean("speechlowspeedenabled") == true && MainV2.comPort.MAV.cs.armed) { float warngroundspeed = Settings.Instance.GetFloat("speechlowgroundspeedtrigger"); float warnairspeed = Settings.Instance.GetFloat("speechlowairspeedtrigger"); if (MainV2.comPort.MAV.cs.airspeed < warnairspeed) { if (MainV2.speechEngine.IsReady) { MainV2.speechEngine.SpeakAsync( ArduPilot.Common.speechConversion(comPort.MAV, "" + Settings.Instance["speechlowairspeed"])); speechlowspeedtime = DateTime.Now; } } else if (MainV2.comPort.MAV.cs.groundspeed < warngroundspeed) { if (MainV2.speechEngine.IsReady) { MainV2.speechEngine.SpeakAsync( ArduPilot.Common.speechConversion(comPort.MAV, "" + Settings.Instance["speechlowgroundspeed"])); speechlowspeedtime = DateTime.Now; } } else { speechlowspeedtime = DateTime.Now; } } } // speech altitude warning - message high warning if (speechEnable && speechEngine != null && (MainV2.comPort.logreadmode || comPort.BaseStream.IsOpen)) { float warnalt = float.MaxValue; if (Settings.Instance.ContainsKey("speechaltheight")) { warnalt = Settings.Instance.GetFloat("speechaltheight"); } try { altwarningmax = (int)Math.Max(MainV2.comPort.MAV.cs.alt, altwarningmax); if (Settings.Instance.GetBoolean("speechaltenabled") == true && MainV2.comPort.MAV.cs.alt != 0.00 && (MainV2.comPort.MAV.cs.alt <= warnalt) && MainV2.comPort.MAV.cs.armed) { if (altwarningmax > warnalt) { if (MainV2.speechEngine.IsReady) { MainV2.speechEngine.SpeakAsync( ArduPilot.Common.speechConversion(comPort.MAV, "" + Settings.Instance["speechalt"])); } } } } catch { } // silent fail try { // say the latest high priority message if (MainV2.speechEngine.IsReady && lastmessagehigh != MainV2.comPort.MAV.cs.messageHigh && MainV2.comPort.MAV.cs.messageHigh != null) { if (!MainV2.comPort.MAV.cs.messageHigh.StartsWith("PX4v2 ")) { MainV2.speechEngine.SpeakAsync(MainV2.comPort.MAV.cs.messageHigh); lastmessagehigh = MainV2.comPort.MAV.cs.messageHigh; } } } catch { } } // not doing anything if (!MainV2.comPort.logreadmode && !comPort.BaseStream.IsOpen) { altwarningmax = 0; } // attenuate the link qualty over time if ((DateTime.Now - MainV2.comPort.MAV.lastvalidpacket).TotalSeconds >= 1) { if (linkqualitytime.Second != DateTime.Now.Second) { MainV2.comPort.MAV.cs.linkqualitygcs = (ushort)(MainV2.comPort.MAV.cs.linkqualitygcs * 0.8f); linkqualitytime = DateTime.Now; // force redraw if there are no other packets are being read } } // data loss warning - wait min of 10 seconds, ignore first 30 seconds of connect, repeat at 5 seconds interval if ((DateTime.Now - MainV2.comPort.MAV.lastvalidpacket).TotalSeconds > 10 && (DateTime.Now - connecttime).TotalSeconds > 30 && (DateTime.Now - nodatawarning).TotalSeconds > 5 && (MainV2.comPort.logreadmode || comPort.BaseStream.IsOpen) && MainV2.comPort.MAV.cs.armed) { if (speechEnable && speechEngine != null) { if (MainV2.speechEngine.IsReady) { MainV2.speechEngine.SpeakAsync("WARNING No Data for " + (int) (DateTime.Now - MainV2.comPort.MAV.lastvalidpacket) .TotalSeconds + " Seconds"); nodatawarning = DateTime.Now; } } } // get home point on armed status change. if (armedstatus != MainV2.comPort.MAV.cs.armed && comPort.BaseStream.IsOpen) { armedstatus = MainV2.comPort.MAV.cs.armed; // status just changed to armed if (MainV2.comPort.MAV.cs.armed == true && MainV2.comPort.MAV.apname != MAVLink.MAV_AUTOPILOT.INVALID && MainV2.comPort.MAV.aptype != MAVLink.MAV_TYPE.GIMBAL) { System.Threading.ThreadPool.QueueUserWorkItem(state => { Thread.CurrentThread.Name = "Arm State change"; try { while (comPort.giveComport == true) { Thread.Sleep(100); } MainV2.comPort.MAV.cs.HomeLocation = new PointLatLngAlt(MainV2.comPort.getWP(0)); } catch { // dont hang this loop } }); } if (speechEnable && speechEngine != null) { if (Settings.Instance.GetBoolean("speecharmenabled")) { string speech = armedstatus ? Settings.Instance["speecharm"] : Settings.Instance["speechdisarm"]; if (!string.IsNullOrEmpty(speech)) { MainV2.speechEngine.SpeakAsync(ArduPilot.Common.speechConversion(comPort.MAV, speech)); } } } } // send a hb every seconds from gcs to ap if (heatbeatSend.Second != DateTime.Now.Second) { MAVLink.mavlink_heartbeat_t htb = new MAVLink.mavlink_heartbeat_t() { type = (byte)MAVLink.MAV_TYPE.GCS, autopilot = (byte)MAVLink.MAV_AUTOPILOT.INVALID, mavlink_version = 3 // MAVLink.MAVLINK_VERSION }; // enumerate each link foreach (var port in Comports.ToArray()) { if (!port.BaseStream.IsOpen) { continue; } // poll for params at heartbeat interval - primary mav on this port only if (!port.giveComport) { try { // poll only when not armed if (!port.MAV.cs.armed) { port.getParamPoll(); port.getParamPoll(); } } catch { } } // there are 3 hb types we can send, mavlink1, mavlink2 signed and unsigned bool sentsigned = false; bool sentmavlink1 = false; bool sentmavlink2 = false; // enumerate each mav foreach (var MAV in port.MAVlist) { try { // poll for version if we dont have it - every mav every port if (!port.giveComport && !MAV.cs.armed && (DateTime.Now.Second % 20) == 0 && MAV.cs.version < new Version(0, 1)) { port.getVersion(MAV.sysid, MAV.compid, false); } // are we talking to a mavlink2 device if (MAV.mavlinkv2) { // is signing enabled if (MAV.signing) { // check if we have already sent if (sentsigned) { continue; } sentsigned = true; } else { // check if we have already sent if (sentmavlink2) { continue; } sentmavlink2 = true; } } else { // check if we have already sent if (sentmavlink1) { continue; } sentmavlink1 = true; } port.sendPacket(htb, MAV.sysid, MAV.compid); } catch (Exception ex) { log.Error(ex); // close the bad port try { port.Close(); } catch { } // refresh the screen if needed if (port == MainV2.comPort) { // refresh config window if needed } } } } heatbeatSend = DateTime.Now; } // if not connected or busy, sleep and loop if (!comPort.BaseStream.IsOpen || comPort.giveComport == true) { if (!comPort.BaseStream.IsOpen) { // check if other ports are still open foreach (var port in Comports) { if (port.BaseStream.IsOpen) { Console.WriteLine("Main comport shut, swapping to other mav"); comPort = port; break; } } } System.Threading.Thread.Sleep(100); } // read the interfaces foreach (var port in Comports.ToArray()) { if (!port.BaseStream.IsOpen) { // skip primary interface if (port == comPort) { continue; } // modify array and drop out Comports.Remove(port); port.Dispose(); break; } DateTime startread = DateTime.Now; // must be open, we have bytes, we are not yielding the port, // the thread is meant to be running and we only spend 1 seconds max in this read loop while (port.BaseStream.IsOpen && port.BaseStream.BytesToRead > minbytes && port.giveComport == false && serialThread && startread.AddSeconds(1) > DateTime.Now) { try { port.readPacket(); } catch (Exception ex) { log.Error(ex); } } // update currentstate of sysids on the port foreach (var MAV in port.MAVlist) { try { MAV.cs.UpdateCurrentSettings(null, false, port, MAV); } catch (Exception ex) { log.Error(ex); } } } } catch (Exception e) { log.Error("Serial Reader fail :" + e.ToString()); try { comPort.Close(); } catch (Exception ex) { log.Error(ex); } } } Console.WriteLine("SerialReader Done"); SerialThreadrunner.Set(); }
public static void doUpload(string file) { doUserAndPassword(); string droneshareusername = MainV2.getConfig("droneshareusername"); string dronesharepassword = MainV2.getConfig("dronesharepassword"); if (dronesharepassword != "") { try { // fail on bad entry var crypto = new Crypto(); dronesharepassword = crypto.DecryptString(dronesharepassword); } catch { } } MAVLinkInterface mav = new MAVLinkInterface(); mav.BaseStream = new Comms.CommsFile(); mav.BaseStream.PortName = file; mav.getHeartBeat(); mav.Close(); string guid = Guid.NewGuid().ToString(); switch (mav.MAV.cs.firmware) { case MainV2.Firmwares.ArduCopter2: guid = MainV2.config["copter_guid"].ToString(); break; case MainV2.Firmwares.ArduPlane: guid = MainV2.config["plane_guid"].ToString(); break; case MainV2.Firmwares.ArduRover: guid = MainV2.config["rover_guid"].ToString(); break; } string viewurl = Utilities.droneshare.doUpload(file, droneshareusername, dronesharepassword, guid, Utilities.droneshare.APIConstants.apiKey); if (viewurl != "") { try { System.Diagnostics.Process.Start(viewurl); } catch (Exception ex) { CustomMessageBox.Show("Failed to open url "+ viewurl); } } }
/// <summary> /// main serial reader thread /// controls /// serial reading /// link quality stats /// speech voltage - custom - alt warning - data lost /// heartbeat packet sending /// /// and can't fall out /// </summary> private void SerialReader() { if (serialThread == true) { return; } serialThread = true; SerialThreadrunner.Reset(); int minbytes = 0; int altwarningmax = 0; bool armedstatus = false; string lastmessagehigh = ""; DateTime speechcustomtime = DateTime.Now; DateTime speechbatterytime = DateTime.Now; DateTime speechlowspeedtime = DateTime.Now; DateTime linkqualitytime = DateTime.Now; while (serialThread) { try { Thread.Sleep(1); // was 5 //// get home point on armed status change. //if (armedstatus != Form1.comPort.MAV.cs.armed && comPort.BaseStream.IsOpen) //{ // armedstatus = Form1.comPort.MAV.cs.armed; // // status just changed to armed // if (Form1.comPort.MAV.cs.armed == true) // { // try // { // //Form1.comPort.MAV.cs.HomeLocation = new PointLatLngAlt(Form1.comPort.getWP(0)); // //if (MyView.current != null && MyView.current.Name == "FlightPlanner") // //{ // // // update home if we are on flight data tab // // FlightPlanner.updateHome(); // //} // } // catch // { // // dont hang this loop // this.BeginInvoke((MethodInvoker)delegate { MessageBox.Show("Failed to update home location"); }); // } // } //} // send a hb every seconds from gcs to ap if (heatbeatSend.Second != DateTime.Now.Second) { MAVLink.mavlink_heartbeat_t htb = new MAVLink.mavlink_heartbeat_t() { type = (byte)MAVLink.MAV_TYPE.GCS, autopilot = (byte)MAVLink.MAV_AUTOPILOT.INVALID, mavlink_version = 3, }; foreach (var port in Form1.Comports) { try { port.sendPacket(htb); } catch { } } heatbeatSend = DateTime.Now; } // if not connected or busy, sleep and loop if (!comPort.BaseStream.IsOpen || comPort.giveComport == true) { if (!comPort.BaseStream.IsOpen) { // check if other ports are still open foreach (var port in Comports) { if (port.BaseStream.IsOpen) { Console.WriteLine("Main comport shut, swapping to other mav"); comPort = port; break; } } } System.Threading.Thread.Sleep(100); //continue; } // actualy read the packets while (comPort.BaseStream.IsOpen && comPort.BaseStream.BytesToRead > minbytes && comPort.giveComport == false) { try { comPort.readPacket(); } catch { } } // update currentstate of sysids on main port foreach (var sysid in comPort.sysidseen) { try { comPort.MAVlist[sysid].cs.UpdateCurrentSettings(null, false, comPort, comPort.MAVlist[sysid]); } catch { } } //C_Log.writeLog(comPort.MAV.cs.pitch + " " + comPort.MAV.cs.roll + " " + comPort.MAV.cs.yaw + "\n\r"); this.Invoke((MethodInvoker) delegate { //update teks //lbl_test.Visible = true; //lbl_test.Text = "YAW :" + comPort.MAV.cs.yaw.ToString() + "\nAltitude :" + comPort.MAV.cs.alt.ToString(); //lbl_test.Text = "YAW :" + loop1.ToString() + "\nAltitude :" + loop2.ToString(); label1.Text = comPort.MAV.cs.yaw.ToString(); label2.Text = comPort.MAV.cs.pitch.ToString(); label3.Text = comPort.MAV.cs.roll.ToString(); }); ////Ngirim Data //if (USock != null) //{ // if (USock.isConnected()) // { // this.Invoke(sdtc); // } //} //// read the other interfaces //foreach (var port in Comports) //{ // // skip primary interface // if (port == comPort) // continue; // if (!port.BaseStream.IsOpen) // { // // modify array and drop out // Comports.Remove(port); // break; // } // while (port.BaseStream.IsOpen && port.BaseStream.BytesToRead > minbytes) // { // try // { // port.readPacket(); // } // catch { } // } // // update currentstate of sysids on the port // foreach (var sysid in port.sysidseen) // { // try // { // port.MAVlist[sysid].cs.UpdateCurrentSettings(null, false, port, port.MAVlist[sysid]); // } // catch { } // } //} //UPDATE JOYSTICK OUTPUT FROM SERIAL //updateProgressJoystickInputSERIAL(); //COMPARE DELAY //JoystickDelayCalculation(); } catch (Exception e) { log.Error("Serial Reader fail :" + e.ToString()); MessageBox.Show(e.ToString()); try { comPort.Close(); } catch { } } } Console.WriteLine("SerialReader Done"); SerialThreadrunner.Set(); }
private void FWUpload(object a) { Tuple <int, string> passin = (Tuple <int, string>)a; var index = passin.Item1; var portname = passin.Item2; Console.WriteLine("Thread start for " + portname); try { if (!portstatus.ContainsKey(portname)) { portstatus[portname] = ""; } { Uploader up = null; try { up = new px4uploader.Uploader(new SerialPort(portname, 115200)); } catch { } if (up != null) { up.ProgressEvent += completed => { /* this.BeginInvoke(new Action(() => * { * textBox1.AppendText(portname + " " + (int)completed + "\r\n"); * }));*/ }; bool flashit = false; bool validcomms = false; Firmware fw = null; try { up.identify(); validcomms = true; portstatus[portname] += "BL "; UpdateTextBox(); fw = Firmware.ProcessFirmware(_args[0]); up.currentChecksum(fw); fw.board_id = up.board_type; flashit = true; portstatus[portname] += "CS "; UpdateTextBox(); } catch (Exception ex) { if (ex.Message.Contains("Same Firmware")) { portstatus[portname] += "BLUPD OK "; } else { portstatus[portname] += "BLEX "; } UpdateTextBox(); } if (flashit) { DateTime ts = DateTime.Now; up.ProgressEvent += completed => { if (ts.Second != DateTime.Now.Second) { Console.WriteLine("{0}: {1}", portname, completed); ts = DateTime.Now; } }; up.upload(fw); portstatus[portname] += "BLUPD OK "; UpdateTextBox(); } else { up.__reboot(); UpdateTextBox(); } up.close(); if (validcomms) { return; } } } var ports = getPortByVPidInt(txt_vid.Text, txt_pid.Text, txt_int.Text); if (!ports.Contains(portname)) { portstatus[portname] += "NOTML OK "; UpdateTextBox(); return; } var mav = new MAVLinkInterface(); mav.BaseStream = new SerialPort((string)portname, 115200); var bldone = false; mav.OnPacketReceived += (sender, message) => { if (message.msgid == (ulong)MAVLink.MAVLINK_MSG_ID.STATUSTEXT) { if (ASCIIEncoding.ASCII.GetString(message.ToStructure <MAVLink.mavlink_statustext_t>().text).Trim().Contains("Bootloader up-to-date") || ASCIIEncoding.ASCII.GetString(message.ToStructure <MAVLink.mavlink_statustext_t>().text).Trim().Contains("Flash OK")) { bldone = true; portstatus[portname] += ASCIIEncoding.ASCII .GetString(message.ToStructure <MAVLink.mavlink_statustext_t>().text).Trim() .TrimEnd(new char[] { '\0', '\r', '\n' }); UpdateTextBox(); } //DisplayText(message); } }; try { mav.BaseStream.Open(); mav.getHeartBeat(); mav.doCommand(MAVLink.MAV_CMD.FLASH_BOOTLOADER, 0, 0, 0, 0, 290876, 0, 0, false); mav.getHeartBeat(); if (!bldone) { mav.getHeartBeat(); } if (!bldone) { mav.getHeartBeat(); } if (!bldone) { mav.getHeartBeat(); } if (!bldone) { mav.getHeartBeat(); } if (!bldone) { mav.getHeartBeat(); } if (!bldone) { mav.getHeartBeat(); } if (!bldone) { mav.getHeartBeat(); } if (!bldone) { mav.getHeartBeat(); } mav.Close(); if (bldone) { portstatus[portname] += "MLBLUPD OK"; } UpdateTextBox(); } catch (Exception ex) { portstatus[portname] += "MLEX "; UpdateTextBox(); } } catch (Exception ex) { portstatus[portname] += "EX!! "; UpdateTextBox(); } UpdateTextBox(); }