/// <summary>
        /// Triggered when Internet availabilrt is changed or change in internet strength
        /// </summary>
        /// <param name="internetSpeed"></param>
        private async void AvailabilityChanged(InternetSpeed internetSpeed)
        {
            //ToDo:find alternative for InternetSpeed.Unknown
            if (internetSpeed == InternetSpeed.Unknown)
            {
                return;
            }

            if (isTaskRunning && InternetSpeedDetected != internetSpeed && internetSpeed != InternetSpeed.NoInternet)
            {
                //Do not hide message if No Internet is the status
                //Make sure UI thread is causing property changed event
                await Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow
                .Dispatcher
                .RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
                {
                    InternetConnectivityMessageVisible = false;
                });

                isTaskRunning = false;
            }
            else if (isTaskRunning || InternetSpeedDetected == internetSpeed && InternetSpeedDetected == InternetSpeed.NoInternet)
            {
                //Make sure UI thread is causing property changed event
                await Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow
                .Dispatcher
                .RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
                {
                    InternetConnectivityMessageVisible = true;
                });

                return;
            }

            //Make sure UI thread is causing property changed event
            await Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow
            .Dispatcher
            .RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
            {
                switch (internetSpeed)
                {
                case InternetSpeed.NoInternet:
                    InternetSpeedDetected = InternetSpeed.NoInternet;
                    break;

                case InternetSpeed.VeryPoorInternet:
                    InternetSpeedDetected = InternetSpeed.VeryPoorInternet;
                    break;

                case InternetSpeed.SlowInternet:
                    InternetSpeedDetected = InternetSpeed.SlowInternet;
                    break;

                case InternetSpeed.AverageInternet:
                    InternetSpeedDetected = InternetSpeed.AverageInternet;
                    break;

                case InternetSpeed.VeryGoodInternet:
                    InternetSpeedDetected = InternetSpeed.VeryGoodInternet;
                    break;

                default:
                    InternetSpeedDetected = InternetSpeed.Unknown;
                    break;
                }
                ;
            });
        }
        private void timer1_Tick(object sender, EventArgs e)
        {
            var ListDisk          = new List <diskDrive>();
            var dataCpu           = new Processor();
            var dataGpu           = new Graphic();
            var dataRam           = new Ram();
            var dataInternetSpeed = new InternetSpeed();

            foreach (var hardware in thisComputer.Hardware)
            {
                hardware.Update();
                /*---------------------------------CPU---------------------------------*/
                if (hardware.HardwareType == HardwareType.Cpu)
                {
                    dataCpu.Name = hardware.Name;
                    foreach (var sensor in hardware.Sensors)
                    {
                        if (sensor.SensorType == SensorType.Load && sensor.Name == "CPU Total")
                        {
                            dataCpu.Load = Convert.ToInt32(sensor.Value.Value);
                        }

                        if (sensor.SensorType == SensorType.Temperature && sensor.Name == "CPU Package")
                        {
                            dataCpu.Temp = Convert.ToInt32(sensor.Value.Value);
                        }
                    }
                }
                /*---------------------------------GPU---------------------------------*/
                if (hardware.HardwareType == HardwareType.GpuAmd || hardware.HardwareType == HardwareType.GpuNvidia)
                {
                    dataGpu.Name = hardware.Name;
                    foreach (var sensor in hardware.Sensors)
                    {
                        if (sensor.SensorType == SensorType.Load && sensor.Name == "GPU Core")
                        {
                            dataGpu.Load = Convert.ToInt32(sensor.Value.Value);
                        }
                        if (sensor.SensorType == SensorType.Temperature && sensor.Name == "GPU Core")
                        {
                            dataGpu.Temp = Convert.ToInt32(sensor.Value.Value);
                        }
                        if (sensor.SensorType == SensorType.Fan && sensor.Name == "GPU Fan")
                        {
                            dataGpu.Fan = Convert.ToInt32(sensor.Value.Value);
                        }
                        if (sensor.SensorType == SensorType.Control && sensor.Name == "GPU Fan")
                        {
                            dataGpu.FanLoad = Convert.ToInt32(sensor.Value.Value);
                        }
                    }
                }
                /*---------------------------------RAM---------------------------------*/
                if (hardware.HardwareType == HardwareType.Memory)
                {
                    foreach (var sensor in hardware.Sensors)
                    {
                        if (sensor.SensorType == SensorType.Load && sensor.Name == "Memory")
                        {
                            dataRam.RamLoad = Convert.ToInt32(sensor.Value.Value);
                        }
                        if (sensor.SensorType == SensorType.Data && sensor.Name == "Memory Used")
                        {
                            dataRam.RamUse = Convert.ToInt32(sensor.Value.Value);
                        }
                        if (sensor.SensorType == SensorType.Data && sensor.Name == "Memory Available")
                        {
                            int ramAva = Convert.ToInt32(sensor.Value.Value);
                            dataRam.RamTotal = ramAva + dataRam.RamUse;
                        }
                    }
                }
                /*---------------------------------Connection---------------------------------*/
                if (hardware.HardwareType == HardwareType.Network)
                {
                    foreach (var sensor in hardware.Sensors)
                    {
                        if (sensor.SensorType == SensorType.Throughput && sensor.Name == "Upload Speed")
                        {
                            dataInternetSpeed.UpSpeed = Math.Round(sensor.Value.Value, 1) / 1048576;
                        }
                        if (sensor.SensorType == SensorType.Throughput && sensor.Name == "Download Speed")
                        {
                            dataInternetSpeed.DownloadSpeed = Math.Round(sensor.Value.Value, 1) / 1048576;
                        }
                    }
                }
                /*---------------------------------DISK---------------------------------*/
                if (hardware.HardwareType == HardwareType.Storage)
                {
                    int use = 0, load = 0, temp = 0;
                    foreach (ISensor sensor in hardware.Sensors)
                    {
                        if (sensor.SensorType == SensorType.Load && sensor.Name == "Used Space")
                        {
                            use = Convert.ToInt32(sensor.Value.GetValueOrDefault());
                        }
                        if (sensor.SensorType == SensorType.Load && sensor.Name == "Total Activity")
                        {
                            load = Convert.ToInt32(sensor.Value.GetValueOrDefault());
                        }
                        if (sensor.SensorType == SensorType.Temperature && sensor.Name == "Temperature")
                        {
                            temp = Convert.ToInt32(sensor.Value.GetValueOrDefault());
                        }
                    }
                    var disk = new diskDrive();
                    disk.Name = hardware.Name;
                    disk.Use  = use;
                    disk.Load = load;
                    disk.Temp = temp;
                    ListDisk.Add(disk);
                }
                /*---------------------------------Display---------------------------------*/
                grCPU.Text      = dataCpu.Name;
                txtLoadCPU.Text = dataCpu.Load.ToString() + " %";
                txtTempCPU.Text = dataCpu.Temp.ToString() + " °C";

                grGPU.Text      = dataGpu.Name;
                txtLoadGPU.Text = dataGpu.Load.ToString() + " %";
                txtTempGPU.Text = dataGpu.Temp.ToString() + " °C";
                txtFanGPU.Text  = dataGpu.Fan.ToString() + " RPM";

                txtTotalRam.Text = dataRam.RamTotal.ToString() + " GB";
                txtRamUse.Text   = dataRam.RamUse.ToString() + " GB";
                txtRamLoad.Text  = dataRam.RamLoad.ToString() + " %";

                txtDown.Text = dataInternetSpeed.DownloadSpeed.ToString("F1") + " MB/s";
                txtUp.Text   = dataInternetSpeed.UpSpeed.ToString("F1") + " MB/s";
                //int i = 1;
                //foreach(var item in ListDisk)
                //{
                //    i++;
                //    int Index = KiemTraTonTai(tabControl2, item[i].Name);
                //    if (Index >= 0)
                //    {
                //        break;
                //    }
                //    else
                //    {
                //        TabPage TabPage = new TabPage { Text = item.Name };
                //        tabControl2.TabPages.Add(TabPage);
                //      //  tabControl2.SelectedTab = TabPage;
                //    }
                //}
                for (int i = 0; i < ListDisk.Count; i++)
                {
                    bool Index = KiemTraTonTai(tabControl2, ListDisk[i].Name);
                    if (Index)
                    {
                        // break;
                    }
                    else
                    {
                        TabPage TabPageDisk = new TabPage {
                            Text = ListDisk[i].Name
                        };
                        Label diskName = new Label();
                        diskName.Width = 200;
                        // diskName.BackColor(Color.Red);
                        diskName.Text = ListDisk[i].Name;
                        TabPageDisk.Controls.Add(diskName);

                        tabControl2.TabPages.Add(TabPageDisk);
                        //  tabControl2.SelectedTab = TabPage;
                        //tabControl2.Dock = DockStyle.;
                    }
                }
                /*---------------------------------Send DATA---------------------------------*/
            }
            Infomation info = new Infomation
            {
                CPU   = dataCpu,
                GPU   = dataGpu,
                RAM   = dataRam,
                Speed = dataInternetSpeed,
                disk  = ListDisk
            };
            string obj = JsonConvert.SerializeObject(info);

            if (lblWIFIStatus.Text == "Connected")
            {
                try
                {
                    NetworkStream stream = client.GetStream();
                    byte[]        data   = Encoding.ASCII.GetBytes(obj + "\r\n");
                    stream.Write(data, 0, data.Length);
                }
                catch (Exception)
                {
                    AppIcon.ShowBalloonTip(5000, "Mất kêt nối", "Kiểm tra lại server", ToolTipIcon.Warning);
                    txtIP.Enabled           = true;
                    timer1.Enabled          = false;
                    btnConnectWIFI.Text     = "Connect";
                    lblWIFIStatus.Text      = "Disconnected";
                    lblWIFIStatus.ForeColor = Color.Red;
                    client.Close();
                    client = new TcpClient();
                }
            }
            if (lblStatusWired.Text == "Connected")
            {
                //a = dataCPU.Name + "," + dataCPU.Load + "," + dataCPU.Temp + "," + dataGPU.Name + "," + dataGPU.Load + "," + dataGPU.Temp + "," + dataRam.Use + "," + dataNet.Speed + "*";
                serialPort1.Write(a);
                serialPort1.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(Data);
            }
        }
        /// <summary>
        /// Async Thread to check internet speed and notify user based on internet speed
        /// </summary>
        private async void CheckInternetStregthPeriodically()
        {
            try
            {
                if (await IsInternetAvailable() || NetworkStrengthChanged != null)
                {
                    var currentInternetStrength = InternetSpeed.Unknown;
                    //check internet speed
                    var internetSpeedbySocket = await CheckInternetSpeedSocketAsync();

                    var internetSpeedbasedOnSignal = await CheckInternetSpeedSignalAsync();

                    switch (internetSpeedbasedOnSignal)
                    {
                    case InternetSpeed.VeryGoodInternet:
                        if (internetSpeedbySocket == InternetSpeed.VeryGoodInternet || internetSpeedbySocket == InternetSpeed.AverageInternet)
                        {
                            currentInternetStrength = InternetSpeed.VeryGoodInternet;
                        }
                        else if (internetSpeedbySocket == InternetSpeed.SlowInternet || internetSpeedbySocket == InternetSpeed.VeryPoorInternet)
                        {
                            currentInternetStrength = InternetSpeed.SlowInternet;
                        }
                        else if (internetSpeedbySocket == InternetSpeed.NoInternet)
                        {
                            currentInternetStrength = InternetSpeed.VeryPoorInternet;
                        }

                        break;

                    case InternetSpeed.AverageInternet:
                        if (internetSpeedbySocket == InternetSpeed.VeryGoodInternet || internetSpeedbySocket == InternetSpeed.AverageInternet)
                        {
                            currentInternetStrength = InternetSpeed.AverageInternet;
                        }
                        else if (internetSpeedbySocket == InternetSpeed.SlowInternet)
                        {
                            currentInternetStrength = InternetSpeed.SlowInternet;
                        }
                        else if (internetSpeedbySocket == InternetSpeed.VeryPoorInternet || internetSpeedbySocket == InternetSpeed.NoInternet)
                        {
                            currentInternetStrength = InternetSpeed.VeryPoorInternet;
                        }

                        break;

                    case InternetSpeed.SlowInternet:
                        if (internetSpeedbySocket == InternetSpeed.VeryGoodInternet || internetSpeedbySocket == InternetSpeed.AverageInternet)
                        {
                            currentInternetStrength = InternetSpeed.AverageInternet;
                        }
                        else if (internetSpeedbySocket == InternetSpeed.SlowInternet)
                        {
                            currentInternetStrength = InternetSpeed.SlowInternet;
                        }
                        else if (internetSpeedbySocket == InternetSpeed.VeryPoorInternet || internetSpeedbySocket == InternetSpeed.NoInternet)
                        {
                            currentInternetStrength = InternetSpeed.VeryPoorInternet;
                        }
                        break;

                    case InternetSpeed.VeryPoorInternet:
                        if (internetSpeedbySocket == InternetSpeed.VeryGoodInternet || internetSpeedbySocket == InternetSpeed.AverageInternet || internetSpeedbySocket == InternetSpeed.SlowInternet)
                        {
                            currentInternetStrength = InternetSpeed.SlowInternet;
                        }
                        else if (internetSpeedbySocket == InternetSpeed.VeryPoorInternet || internetSpeedbySocket == InternetSpeed.NoInternet)
                        {
                            currentInternetStrength = InternetSpeed.VeryPoorInternet;
                        }

                        break;

                    case InternetSpeed.NoInternet:
                        if (internetSpeedbySocket == InternetSpeed.VeryGoodInternet || internetSpeedbySocket == InternetSpeed.AverageInternet || internetSpeedbySocket == InternetSpeed.SlowInternet)
                        {
                            currentInternetStrength = InternetSpeed.VeryPoorInternet;
                        }
                        else if (internetSpeedbySocket == InternetSpeed.VeryPoorInternet || internetSpeedbySocket == InternetSpeed.NoInternet)
                        {
                            currentInternetStrength = InternetSpeed.NoInternet;
                        }

                        break;
                    }
                    ;
                    if (previousNetworkStrength != currentInternetStrength)
                    {
                        try {
                            NetworkStrengthChanged?.Invoke(currentInternetStrength);
                            previousNetworkStrength = currentInternetStrength;
                        } catch { }
                    }
                }
                else
                {
                    stopPeriodicThread = true;
                }
            }
            catch (Exception exception)
            {
                Debug.WriteLine("Exception in CheckInternetStrengthPeriodically: " + exception.Message);
            }
        }