static async Task <bool> TestGyro()
        {
            Console.Clear();
            ConsoleOutput.Logo();
            Console.WriteLine("Press ESC to stop");
            int outputStart = Console.CursorTop + 1;

            do
            {
                var result = await SendCommand(":XL1#,#");

                while (!Console.KeyAvailable)
                {
                    Console.CursorTop  = outputStart;
                    Console.CursorLeft = 0;
                    Console.WriteLine("********* GYRO TEST **************");
                    ConsoleOutput.ClearRestOfScreen();
                    Console.CursorTop = outputStart;
                    await SendCommand(":XLGC#,#");

                    await Task.Delay(250);
                }
            } while (Console.ReadKey(true).Key != ConsoleKey.Escape);

            await SendCommand(":XL0#,#");

            _commHandler.Disconnect();
            _commHandler = null;
            await Task.Delay(250);

            return(true);
        }
        static async Task Settings()
        {
            while (true)
            {
                int userChoice;
                do
                {
                    Console.Clear();
                    ConsoleOutput.Logo();
                    Console.ForegroundColor = ConsoleOutput.menuColor;
                    Console.WriteLine("---------------------------\r");
                    Console.WriteLine("  OAT Communication Test\r");
                    Console.WriteLine("       Settings\r");
                    Console.WriteLine("---------------------------\r");
                    Console.WriteLine("Choose one of the following options:\r");

                    Console.WriteLine("[ 1 ] Device Port ({0})", _comPort);
                    Console.WriteLine("[ 2 ] Baud Rate ({0})", _baudRate);
                    Console.WriteLine("[ 3 ] Read Timeout ({0})", _readTimeout);
                    Console.WriteLine("[ 4 ] Write Timeout ({0})", _writeTimeout);
                    Console.WriteLine("[ 0 ] Return\n");
                    Console.ResetColor();
                } while (!int.TryParse(Console.ReadLine(), out userChoice) || userChoice < 0 || userChoice > 4);

                switch (userChoice)
                {
                case 1:
                    await Connect();

                    break;

                case 2:
                    Console.WriteLine("Set BaudRate({0}):", _baudRate);
                    int newVal = Convert.ToInt32(Console.ReadLine());
                    _baudRate = newVal;
                    break;

                case 3:
                    Console.WriteLine("Set Read Timeout({0}ms):", _readTimeout);
                    newVal       = Convert.ToInt32(Console.ReadLine());
                    _readTimeout = newVal;
                    break;

                case 4:
                    Console.WriteLine("Set Write Timeout({0}ms):", _writeTimeout);
                    newVal        = Convert.ToInt32(Console.ReadLine());
                    _writeTimeout = newVal;
                    break;

                case 0:
                    return;

                default:
                    Console.WriteLine("Try again!!");
                    break;
                }
            }
        }
        static async Task <bool> TestGPS()
        {
            Console.Clear();
            ConsoleOutput.Logo();
            Console.WriteLine("********* GPS TEST ***************\r");
            Console.WriteLine("* Battery may need to be charged *\r");
            Console.WriteLine("* first time GPS is used ~30min  *\r");
            Console.WriteLine("* 0 = No satelites found         *\r");
            Console.WriteLine("* 1 = Satelites found            *\r");
            Console.WriteLine("**********************************\r");
            Console.WriteLine("Press ESC to stop");
            int outputStart = Console.CursorTop + 1;

            do
            {
                while (!Console.KeyAvailable)
                {
                    Console.CursorTop  = outputStart;
                    Console.CursorLeft = 0;
                    ConsoleOutput.ClearRestOfScreen();
                    var result = await SendCommand(":gT100#,n");

                    if (result.Data == "1")
                    {
                        result = await SendCommand(":Gt#,#");

                        var   latitudeArray = result.Data.Split('*');
                        float latitude      = float.Parse(latitudeArray[0], _oatCulture) + (float.Parse(latitudeArray[1], _oatCulture) / 60.0f);
                        await Task.Delay(250);

                        result = await SendCommand(":Gg#,#");

                        var   longitudeArray = result.Data.Split('*');
                        float longitude      = float.Parse(longitudeArray[0], _oatCulture) + (float.Parse(longitudeArray[1], _oatCulture) / 60.0f);
                        if (longitude > 180)
                        {
                            longitude -= 360;
                        }
                        await Task.Delay(250);

                        ConsoleOutput.Error(string.Format("Lat: {0}", latitude));
                        ConsoleOutput.Error(string.Format("Lon: {0}", longitude));
                    }

                    //Console.WriteLine("ESC - Exit\n");
                    await Task.Delay(1000);
                }
            } while (Console.ReadKey(true).Key != ConsoleKey.Escape);


            _commHandler.Disconnect();
            _commHandler = null;

            Console.ReadKey();
            return(true);
        }
        static async Task MainAsync()
        {
            while (true)
            {
                int userChoice;
                do
                {
                    Console.Clear();
                    ConsoleOutput.Logo();
                    Console.ForegroundColor = ConsoleOutput.menuColor;
                    Console.WriteLine("---------------------------\r");
                    Console.WriteLine("  OAT Communication Test\r");
                    Console.WriteLine("        Main Menu\r");
                    Console.WriteLine("---------------------------\r");
                    Console.WriteLine("Choose one of the following options:\r");

                    Console.WriteLine("[ 1 ] COM Settings");
                    Console.WriteLine("[ 2 ] Manual Command Test");
                    Console.WriteLine("[ 3 ] Test Gyro");
                    Console.WriteLine("[ 4 ] Test GPS");
                    Console.WriteLine("[ 5 ] Run Test/Compile Info");
                    Console.WriteLine("[ 0 ] Quit application\n");
                    Console.ResetColor();
                } while (!int.TryParse(Console.ReadLine(), out userChoice) || userChoice < 0 || userChoice > 5);

                switch (userChoice)
                {
                case 1:
                    await Settings();

                    break;

                case 2:
                    var result = await Connect();

                    if (result)
                    {
                        await CustomCommand();
                    }
                    break;

                case 3:
                    result = await Connect();

                    if (result)
                    {
                        await TestGyro();
                    }
                    break;

                case 4:
                    result = await Connect();

                    if (result)
                    {
                        await TestGPS();
                    }
                    break;

                case 5:
                    result = await Connect();

                    if (result)
                    {
                        await StartTest();
                    }
                    break;

                case 0:
                    Environment.Exit(0);
                    break;

                default:
                    Console.WriteLine("Try again!!");
                    break;
                }
            }
        }
        static async Task <bool> Connect()
        {
            while (true)
            {
                // List available COM devices
                var devices = DiscoverDevices();
                if (!devices.Contains(_comPort))
                {
                    int userChoice;
                    do
                    {
                        Console.Clear();
                        ConsoleOutput.Logo();
                        // ListComDetails();
                        ConsoleOutput.PreTestInfo();
                        Console.ForegroundColor = ConsoleOutput.menuColor;
                        Console.WriteLine("---------------------------\r");
                        Console.WriteLine("  OAT Communication Test\r");
                        Console.WriteLine("         Connect\r");
                        Console.WriteLine("---------------------------\r");
                        Console.WriteLine("Select Serial Port:\r");

                        int cnt = 1;
                        foreach (var dev in devices)
                        {
                            Console.Write("[ {0} ] {1}\n", cnt, dev);
                            cnt++;
                        }
                        Console.WriteLine("[ 0 ] Return\n");
                        Console.ResetColor();
                    } while (!int.TryParse(Console.ReadLine(), out userChoice) || userChoice < 0 || userChoice > devices.Count);

                    if (userChoice == 0)
                    {
                        return(false);
                    }
                    else if (userChoice >= 0 && userChoice <= devices.Count)
                    {
                        _comPort = devices[userChoice - 1];
                    }
                    else
                    {
                        Console.WriteLine("Try again!!");
                    }
                }

                if (!string.IsNullOrEmpty(_comPort))
                {
                    var connectResult = await CreateCommHandler(_comPort);

                    if (connectResult)
                    {
                        return(true);
                    }
                    else
                    {
                        return(false);
                    }
                }
            }
        }