private void btnConnect_Click(object sender, EventArgs e)
        {
            Cursor.Current = Cursors.WaitCursor;

            if (btnConnect.Text == "Connect")
            {
                lblStatus.Text = "Connecting...";
                lblStatus.Update();

                _profile.ComPort  = (string)ComboBoxComPort.SelectedItem;
                _profile.BaudRate = Convert.ToInt64(comboBoxBaudRate.SelectedItem);
                SharedResources.WriteProfile(GetProfileData());

                txtLat.Text       = _profile.Latitude.ToString();
                txtLong.Text      = _profile.Longitude.ToString();
                txtElevation.Text = _profile.Elevation.ToString();

                try
                {
                    this._oat.Connected = true;
                    string fwVersion = this._oat.Action("Serial:PassThroughCommand", ":GVN#,#");
                    if (string.IsNullOrEmpty(fwVersion))
                    {
                        MessageBox.Show("Unable to communicate with OAT, even though it says we're connected. Exit the app and use Task Manager to kill the ASCOM.OpenAstroTracker process. Then try again.");
                        return;
                    }

                    var versionNumbers = fwVersion.Substring(1).Split(".".ToCharArray());
                    FirmwareVersion = long.Parse(versionNumbers[0]) * 10000L + long.Parse(versionNumbers[1]) * 100L + long.Parse(versionNumbers[2]);

                    lblFirmware.Text = fwVersion;
                    string hardware = this._oat.Action("Serial:PassThroughCommand", ":XGM#,#");
                    var    hwParts  = hardware.Split(',');
                    lblBoard.Text = hwParts[0];
                    string scopeDisplay = "";
                    for (int i = 3; i < hwParts.Length; i++)
                    {
                        if (hwParts[i] == "GPS")
                        {
                            scopeFeatures.Add("GPS");
                        }
                        else if (hwParts[i] == "AUTO_AZ_ALT")
                        {
                            scopeFeatures.Add("AutoPA");
                        }
                        else if (hwParts[i] == "AUTO_ALT")
                        {
                            scopeFeatures.Add("MotorALT");
                        }
                        else if (hwParts[i] == "AUTO_AZ")
                        {
                            scopeFeatures.Add("MotorAZ");
                        }
                        else if (hwParts[i] == "GYRO")
                        {
                            scopeFeatures.Add("Digital Level");
                        }
                        else if (hwParts[i] == "LCD_KEYPAD")
                        {
                            scopeDisplay = "16x2 LCD (w/ buttons) ";
                        }
                        else if (hwParts[i] == "LCD_I2C_MCP23008")
                        {
                            scopeDisplay = "LCD (I2C MCP23008) ";
                        }
                        else if (hwParts[i] == "LCD_I2C_MCP23017")
                        {
                            scopeDisplay = "LCD (I2C MCP23017)";
                        }
                        else if (hwParts[i] == "LCD_JOY_I2C_SSD1306")
                        {
                            scopeDisplay = "Pixel OLED (SSD1306)";
                        }
                        else if (hwParts[i] == "FOC")
                        {
                            scopeFeatures.Add("Focuser");
                        }
                        else if (hwParts[i] == "HSAH")
                        {
                            scopeFeatures.Add("AutoHomeRA");
                        }
                    }

                    if (!scopeFeatures.Any())
                    {
                        lblAddons.Text = "No addons";
                    }
                    else
                    {
                        lblAddons.Text = string.Join(", ", scopeFeatures);
                    }

                    if (string.IsNullOrEmpty(scopeDisplay))
                    {
                        scopeDisplay = "No display";
                    }

                    lblDisplay.Text = scopeDisplay;

                    string steps = _oat.Action("Serial:PassThroughCommand", ":XGR#,#");
                    numRASteps.Value = (Decimal)Math.Max(1, float.Parse(steps, _oatCulture));

                    steps             = _oat.Action("Serial:PassThroughCommand", ":XGD#,#");
                    numDECSteps.Value = (Decimal)Math.Max(1, float.Parse(steps, _oatCulture));

                    string speedFactor = _oat.Action("Serial:PassThroughCommand", ":XGS#,#");
                    numSpeedFactor.Value = (Decimal)float.Parse(speedFactor, _oatCulture);

                    string lst = _oat.Action("Serial:PassThroughCommand", ":XGL#,#");
                    if (lst.Length == 6)
                    {
                        lst = $"{lst.Substring(0, 2)}:{lst.Substring(2, 2)}:{lst.Substring(4)}";
                    }
                    lblLST.Text = lst;

                    string lon = _oat.Action("Serial:PassThroughCommand", ":Gg#,#");
                    double longitude;
                    if (TryParseDec(lon, out longitude))
                    {
                        if (FirmwareVersion < 11105)
                        {
                            longitude = 180 - longitude;
                        }
                        else
                        {
                            longitude = -longitude;
                        }
                    }
                    txtLong.Text       = longitude.ToString("0.00");
                    _profile.Longitude = longitude;

                    string lat = _oat.Action("Serial:PassThroughCommand", ":Gt#,#");
                    double latitude;
                    TryParseDec(lat, out latitude);
                    txtLat.Text       = latitude.ToString("0.00");
                    _profile.Latitude = latitude;

                    btnConnect.Text     = "Disconnect";
                    btnUpdate.Enabled   = false;
                    rdoRateFour.Checked = true;
                    SlewRate            = 4;
                    lblStatus.Text      = "Connected";
                    lblStatus.Update();
                    timerMountUpdate.Start();
                }
                catch (Exception ex)
                {
                    scopeFeatures.Clear();
                    this._oat.Connected = false;
                    btnConnect.Text     = "Connect";
                    lblStatus.Text      = "Connection failed";
                    lblStatus.Update();
                    MessageBox.Show("OATControl was unable to connect to OAT.\n\nMessage: " + ex.Message + "\n\nIf this was the first connection attempt after connecting, please try again.", "Connection failed!", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
            else
            {
                timerMountUpdate.Stop();
                this._oat.Connected = false;
                lblFirmware.Text    = "-";
                btnConnect.Text     = "Connect";
                lblStatus.Text      = "Disconnected";
            }

            EnableAccordingToConnectState();

            Cursor.Current = Cursors.Arrow;
        }