Example #1
0
 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();
        }
Example #3
0
        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); }
            }
        }
Example #4
0
        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); }
            }
        }
Example #5
0
        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);
            }
        }
Example #6
0
        /// <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();
        }
Example #7
0
        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); }
            }
        }
Example #8
0
        /// <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();
        }