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> StartTest()
        {
            Dictionary <string, string> keyValuePairs = new Dictionary <string, string>();

            keyValuePairs.Add("GVP#,#", "Product name");
            keyValuePairs.Add("GVN#,#", "Firmware version");
            keyValuePairs.Add("XGM#,#", "Mount configuration");
            keyValuePairs.Add("Gt#,#", "Site Latitude");
            keyValuePairs.Add("Gg#,#", "Site Longitude");
            keyValuePairs.Add("XGR#,#", "RA Steps");
            keyValuePairs.Add("XGD#,#", "DEC Steps");
            if (_firmwareVersion >= 10869)
            {
                keyValuePairs.Add("XGDL#,#", "DEC Limits");
            }
            keyValuePairs.Add("XGT#,#", "Tracking speed");
            keyValuePairs.Add("XGH#,#", "HA");
            keyValuePairs.Add("XGL#,#", "LST");
            keyValuePairs.Add("GC#,#", "Local date");
            keyValuePairs.Add("GL#,#", "Local time");
            keyValuePairs.Add("GG#,#", "UTC Offset");
            keyValuePairs.Add("XGN#,#", "Network settings");

            List <CommandResponse> replys = new List <CommandResponse>();

            foreach (var cmd in keyValuePairs)
            {
                Console.ForegroundColor = ConsoleColor.Magenta;
                Console.WriteLine("----- {0} -----\r", cmd.Value);
                Console.ResetColor();
                var result = await SendCommand(cmd.Key);

                if (!result.Success)
                {
                    Console.WriteLine("Press any key to return...");
                    Console.ReadKey();
                    return(false);
                }
                replys.Add(result);
            }

            // Disconnect
            _commHandler.Disconnect();
            _commHandler = null;

            // Print summery
            int cnt = 0;

            ConsoleOutput.Info("--------------------------------------- SUMMARY -----------------------------------------------------------\r");
            foreach (var cmd in keyValuePairs)
            {
                ConsoleOutput.Info(string.Format("| {0} | {1} |\r", cmd.Value.PadLeft(30), replys[cnt].Data.PadRight(70)));
                cnt++;
            }
            ConsoleOutput.Info("-----------------------------------------------------------------------------------------------------------\r");

            ConsoleOutput.Info("Press any key to return...");
            Console.ReadKey();

            return(true);
        }
        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);
                    }
                }
            }
        }