//OK
        public override bool calibLOS(bosainfo _bosainfo, testinginfo _testinfo, FVA3150 FVA, variables VAR, ref bool _flag)
        {
            string result1_LOS       = "";
            string Reg_value_LOS     = "";
            string Reg_value_bin_LOS = "";
            string LOS_bit           = "";
            string LOS_Level         = "";
            //string LOS_Level_Hex = "";
            string LOS_SLEEP_CTRL          = "";
            bool   Tuning_LOS_Level_Result = false;
            bool   Check_LOS_Result        = false;
            bool   Check_SD_Result         = false;
            string attenuation_level       = (-36 - double.Parse(VAR.OLT_Power)).ToString();

            _testinfo.CALIBLOSRESULT = Parameters.testStatus.Wait.ToString();
            _testinfo.SYSTEMLOG     += "Đã thiết lập xong máy suy hao.\r\n";

            FVA.set_attenuation_level(attenuation_level);
            _testinfo.SYSTEMLOG += "Đang thiết lập mức suy hao = " + attenuation_level + "\r\n";
            Thread.Sleep(2000);
            //ONT.Read();
            //base.WriteLine("laser msg --set bc 1 1c");
            base.WriteLine("laser msg --set bc 1 15"); //06.07.2018 đổi từ 1c sang 15 => nhầm code
            Thread.Sleep(100);
            base.WriteLine("laser msg --set 6e 1 44");
            Thread.Sleep(100);
            base.WriteLine("laser msg --set 6e 1 04");
            Thread.Sleep(100);

            base.Read();
            base.WriteLine("laser msg --get bc 1");
            Thread.Sleep(100);
            result1_LOS = base.Read();

            _testinfo.SYSTEMLOG += "result1_LOS: " + result1_LOS + "\r\n";
            //Hien_Thi.Hienthi.SetText(rtb, result1_LOS);

            for (int i = 0; i < result1_LOS.Split('\n').Length; i++)
            {
                if (result1_LOS.Split('\n')[i].Contains("I2C"))
                {
                    Reg_value_LOS     = result1_LOS.Split('\n')[i].Split(':')[1].Trim();
                    Reg_value_bin_LOS = hex2bin(Reg_value_LOS);
                }
            }
            LOS_SLEEP_CTRL = Reg_value_bin_LOS.Substring(0, 1);
            LOS_Level      = Reg_value_bin_LOS.Substring(1, 7);
            //Hien_Thi.Hienthi.SetText(rtb, "LOS_Level_bin = " + LOS_Level);
            base.Read();
            base.WriteLine("laser msg --get 6e 1");
            Thread.Sleep(100);
            result1_LOS = base.Read();
            //Hien_Thi.Hienthi.SetText(rtb, result1_LOS);

            for (int i = 0; i < result1_LOS.Split('\n').Length; i++)
            {
                if (result1_LOS.Split('\n')[i].Contains("I2C"))
                {
                    Reg_value_LOS     = result1_LOS.Split('\n')[i].Split(':')[1].Trim();
                    Reg_value_bin_LOS = hex2bin(Reg_value_LOS);
                }
            }
            LOS_bit = Reg_value_bin_LOS.Substring(6, 1);
            //Hien_Thi.Hienthi.SetText(rtb, "LOS_bit = " + LOS_bit);

            if (LOS_bit == "1")
            {
                for (int m = 0; m < 78; m++)
                {
                    _testinfo.SYSTEMLOG += "...\r\n";
                    _testinfo.SYSTEMLOG += "Điều chỉnh giảm LOS Level\r\n";
                    LOS_Level            = (Convert.ToInt32((LOS_Level), 2) - Convert.ToInt32("1", 2)).ToString("X");
                    _testinfo.SYSTEMLOG += "LOS_Level_new = " + LOS_Level + "\r\n";
                    base.WriteLine("laser msg --set bc 1 " + LOS_Level);
                    Thread.Sleep(100);
                    base.Read();
                    base.WriteLine("laser msg --get bc 1");
                    Thread.Sleep(100);
                    result1_LOS = base.Read();
                    //Hien_Thi.Hienthi.SetText(rtb, result1_LOS);

                    for (int i = 0; i < result1_LOS.Split('\n').Length; i++)
                    {
                        if (result1_LOS.Split('\n')[i].Contains("I2C"))
                        {
                            Reg_value_LOS     = result1_LOS.Split('\n')[i].Split(':')[1].Trim();
                            Reg_value_bin_LOS = hex2bin(Reg_value_LOS);
                        }
                    }
                    LOS_SLEEP_CTRL = Reg_value_bin_LOS.Substring(0, 1);
                    LOS_Level      = Reg_value_bin_LOS.Substring(1, 7);
                    //Hien_Thi.Hienthi.SetText(rtb, "LOS_Level_bin = " + LOS_Level);

                    base.Read();
                    base.WriteLine("laser msg --get 6e 1");
                    Thread.Sleep(100);
                    result1_LOS = base.Read();
                    //Hien_Thi.Hienthi.SetText(rtb, result1_LOS);

                    for (int i = 0; i < result1_LOS.Split('\n').Length; i++)
                    {
                        if (result1_LOS.Split('\n')[i].Contains("I2C"))
                        {
                            Reg_value_LOS     = result1_LOS.Split('\n')[i].Split(':')[1].Trim();
                            Reg_value_bin_LOS = hex2bin(Reg_value_LOS);
                        }
                    }
                    LOS_bit              = Reg_value_bin_LOS.Substring(6, 1);
                    _testinfo.SYSTEMLOG += "LOS_bit = " + LOS_bit + "\r\n";

                    if (LOS_bit == "0")
                    {
                        _testinfo.SYSTEMLOG += "Phát hiện SD. Tiếp tục điều chỉnh tăng LOS Level\r\n";
                        for (int n = 0; n < 58; n++)
                        {
                            _testinfo.SYSTEMLOG += "...\r\n";
                            _testinfo.SYSTEMLOG += "Tiếp tục điều chỉnh tăng LOS Level\r\n";
                            LOS_Level            = (Convert.ToInt32((LOS_Level), 2) + Convert.ToInt32("1", 2)).ToString("X");
                            _testinfo.SYSTEMLOG += "LOS_Level_new = " + LOS_Level + "\r\n";
                            base.WriteLine("laser msg --set bc 1 " + LOS_Level);
                            Thread.Sleep(100);

                            base.Read();
                            base.WriteLine("laser msg --get bc 1");
                            Thread.Sleep(100);
                            result1_LOS = base.Read();
                            //Hien_Thi.Hienthi.SetText(rtb, result1_LOS);

                            for (int i = 0; i < result1_LOS.Split('\n').Length; i++)
                            {
                                if (result1_LOS.Split('\n')[i].Contains("I2C"))
                                {
                                    Reg_value_LOS     = result1_LOS.Split('\n')[i].Split(':')[1].Trim();
                                    Reg_value_bin_LOS = hex2bin(Reg_value_LOS);
                                }
                            }
                            LOS_SLEEP_CTRL = Reg_value_bin_LOS.Substring(0, 1);
                            LOS_Level      = Reg_value_bin_LOS.Substring(1, 7);
                            //Hien_Thi.Hienthi.SetText(rtb, "LOS_Level_bin = " + LOS_Level);

                            base.Read();
                            base.WriteLine("laser msg --get 6e 1");
                            Thread.Sleep(100);
                            result1_LOS = base.Read();
                            //Hien_Thi.Hienthi.SetText(rtb, result1_LOS);

                            for (int i = 0; i < result1_LOS.Split('\n').Length; i++)
                            {
                                if (result1_LOS.Split('\n')[i].Contains("I2C"))
                                {
                                    Reg_value_LOS     = result1_LOS.Split('\n')[i].Split(':')[1].Trim();
                                    Reg_value_bin_LOS = hex2bin(Reg_value_LOS);
                                }
                            }
                            LOS_bit              = Reg_value_bin_LOS.Substring(6, 1);
                            _testinfo.SYSTEMLOG += "LOS_bit = " + LOS_bit + "\r\n";

                            if (LOS_bit == "1")
                            {
                                _testinfo.SYSTEMLOG    += "[OK] Hoàn thành Tuning LOS Level.\r\n";
                                Tuning_LOS_Level_Result = true;
                                break;
                            }
                        }
                        break;
                    }
                }
            }
            else if (LOS_bit == "0")
            {
                for (int m = 0; m < 78; m++)
                {
                    _testinfo.SYSTEMLOG += "...\r\n";
                    _testinfo.SYSTEMLOG += "Điều chỉnh tăng LOS Level\r\n";
                    LOS_Level            = (Convert.ToInt32((LOS_Level), 2) + Convert.ToInt32("1", 2)).ToString("X");
                    _testinfo.SYSTEMLOG += "LOS_Level_new = " + LOS_Level + "\r\n";
                    base.WriteLine("laser msg --set bc 1 " + LOS_Level);
                    Thread.Sleep(100);

                    base.Read();
                    base.WriteLine("laser msg --get bc 1");
                    Thread.Sleep(100);
                    result1_LOS = base.Read();
                    //Hien_Thi.Hienthi.SetText(rtb, result1_LOS);

                    for (int i = 0; i < result1_LOS.Split('\n').Length; i++)
                    {
                        if (result1_LOS.Split('\n')[i].Contains("I2C"))
                        {
                            Reg_value_LOS     = result1_LOS.Split('\n')[i].Split(':')[1].Trim();
                            Reg_value_bin_LOS = hex2bin(Reg_value_LOS);
                        }
                    }
                    LOS_SLEEP_CTRL = Reg_value_bin_LOS.Substring(0, 1);
                    LOS_Level      = Reg_value_bin_LOS.Substring(1, 7);
                    //Hien_Thi.Hienthi.SetText(rtb, "LOS_Level_bin = " + LOS_Level);

                    base.Read();
                    base.WriteLine("laser msg --get 6e 1");
                    Thread.Sleep(100);
                    result1_LOS = base.Read();
                    //Hien_Thi.Hienthi.SetText(rtb, result1_LOS);

                    for (int i = 0; i < result1_LOS.Split('\n').Length; i++)
                    {
                        if (result1_LOS.Split('\n')[i].Contains("I2C"))
                        {
                            Reg_value_LOS     = result1_LOS.Split('\n')[i].Split(':')[1].Trim();
                            Reg_value_bin_LOS = hex2bin(Reg_value_LOS);
                        }
                    }
                    LOS_bit              = Reg_value_bin_LOS.Substring(6, 1);
                    _testinfo.SYSTEMLOG += "LOS_bit = " + LOS_bit + "\r\n";

                    if (LOS_bit == "1")
                    {
                        _testinfo.SYSTEMLOG    += "[OK] Hoàn thành Tuning LOS Level.\r\n";
                        Tuning_LOS_Level_Result = true;
                        break;
                    }
                }
            }


            _testinfo.SYSTEMLOG += string.Format("- Check LOS: -36dBm\r\n");
            FVA.set_attenuation_level((-36 - double.Parse(VAR.OLT_Power)).ToString());
            Thread.Sleep(1000);
            base.Read();
            base.WriteLine("laser msg --get 6e 1");
            Thread.Sleep(100);
            result1_LOS = base.Read();
            for (int i = 0; i < result1_LOS.Split('\n').Length; i++)
            {
                if (result1_LOS.Split('\n')[i].Contains("I2C"))
                {
                    Reg_value_LOS     = result1_LOS.Split('\n')[i].Split(':')[1].Trim();
                    Reg_value_bin_LOS = hex2bin(Reg_value_LOS);
                }
            }
            LOS_bit              = Reg_value_bin_LOS.Substring(6, 1);
            _testinfo.SYSTEMLOG += "LOS_bit = " + LOS_bit + "\r\n";

            if (LOS_bit == "1")
            {
                _testinfo.SYSTEMLOG += "Check LOS: PASS\r\n";
                Check_LOS_Result     = true;
            }

            _testinfo.SYSTEMLOG += "- Check LOS: -33dBm\r\n";
            FVA.set_attenuation_level((-33 - double.Parse(VAR.OLT_Power)).ToString());
            Thread.Sleep(1000);
            base.Read();
            base.WriteLine("laser msg --get 6e 1");
            Thread.Sleep(100);
            result1_LOS = base.Read();
            for (int i = 0; i < result1_LOS.Split('\n').Length; i++)
            {
                if (result1_LOS.Split('\n')[i].Contains("I2C"))
                {
                    Reg_value_LOS     = result1_LOS.Split('\n')[i].Split(':')[1].Trim();
                    Reg_value_bin_LOS = hex2bin(Reg_value_LOS);
                }
            }
            LOS_bit              = Reg_value_bin_LOS.Substring(6, 1);
            _testinfo.SYSTEMLOG += "LOS_bit = " + LOS_bit + "\r\n";

            if (LOS_bit == "0")
            {
                _testinfo.SYSTEMLOG += "Check SD: PASS\r\n";
                Check_SD_Result      = true;
            }

            bool ret = Tuning_LOS_Level_Result && Check_LOS_Result && Check_SD_Result;

            _testinfo.CALIBLOSRESULT = ret == true?Parameters.testStatus.PASS.ToString() : Parameters.testStatus.FAIL.ToString();

            return(ret);
        }
        //OK
        public override bool calibDDMI(bosainfo _bosainfo, testinginfo _testinfo, FVA3150 FVA, variables VAR)
        {
            double ADC_RX_Point1 = 0;
            double ADC_RX_Point2 = 0;
            double ADC_RX_Point3 = 0;

            double RX_Power1 = 0.5;
            double RX_Power2 = 1;
            double RX_Power3 = 100;

            string Slope_P2 = "";
            string Slope_P1 = "";
            string Offset   = "";

            string value                 = "";
            string value_register        = "";
            bool   Calibration_RX_Result = false;
            string Power_DDMI            = "";

            string attenuation_level_1 = (-33 - double.Parse(VAR.OLT_Power)).ToString();
            string attenuation_level_2 = (-30 - double.Parse(VAR.OLT_Power)).ToString();
            string attenuation_level_3 = (-10 - double.Parse(VAR.OLT_Power)).ToString();

            _testinfo.CALIBDDMIRESULT = Parameters.testStatus.Wait.ToString();

            value = base.Read();
            try {
                for (int i = 0; i < 3; i++)
                {
                    _testinfo.SYSTEMLOG += "Đã thiết lập xong máy suy hao.\r\n";
                    _testinfo.SYSTEMLOG += "OLT phát công suất = -33dBm ~ 0.5uW\r\n";
                    // Thiết lập suy hao mức 1 cho máy điều chỉnh suy hao
                    FVA.set_attenuation_level(attenuation_level_1);
                    _testinfo.SYSTEMLOG += string.Format("Đang thiết lập mức suy hao = {0}\r\n", attenuation_level_1);
                    Thread.Sleep(3000);
                    // Đọc giá trị thanh ghi ADC RX Power:F0-F1
                    // Đổi Hexa -> Decimal, lưu vào biến ADC_RX_Point1
                    //ADC_RX_Point1 = double.Parse(Read_ADC_value_RX("F0"));
                    //MessageBox.Show("Đọc ADC_RX 1");

                    base.Read();
                    base.WriteLine("laser msg --get F0 2");
                    Thread.Sleep(100);
                    value = base.Read();
                    _testinfo.SYSTEMLOG += value + "\r\n";
                    for (int j = 0; j < value.Split('\n').Length; j++)
                    {
                        if (value.Split('\n')[j].Contains("I2C"))
                        {
                            value_register       = value.Split('\n')[j].Split(':')[1].Trim();
                            ADC_RX_Point1        = Convert.ToDouble(HexToDec(value_register).ToString());
                            _testinfo.SYSTEMLOG += "ADC_RX_Point1 = " + ADC_RX_Point1 + "\r\n";
                        }
                    }
                    _testinfo.SYSTEMLOG += "OLT phát công suất = -30dBm ~ 1uW\r\n";
                    // Thiết lập suy hao mức 2 cho máy điều chỉnh suy hao
                    FVA.set_attenuation_level(attenuation_level_2);
                    _testinfo.SYSTEMLOG += "Đang thiết lập mức suy hao = " + attenuation_level_2 + "\r\n";
                    Thread.Sleep(3000);
                    // Đọc giá trị thanh ghi ADC RX Power:F0-F1
                    // Đổi Hexa -> Decimal, lưu vào biến ADC_RX_Point2
                    //ADC_RX_Point2 = double.Parse(Read_ADC_value_RX("F0"));
                    //MessageBox.Show("Đọc ADC_RX 2");
                    base.Read();
                    base.WriteLine("laser msg --get F0 2");
                    Thread.Sleep(100);
                    value = base.Read();
                    _testinfo.SYSTEMLOG += value + "\r\n";
                    for (int j = 0; j < value.Split('\n').Length; j++)
                    {
                        if (value.Split('\n')[j].Contains("I2C"))
                        {
                            value_register       = value.Split('\n')[j].Split(':')[1].Trim();
                            ADC_RX_Point2        = Convert.ToDouble(HexToDec(value_register).ToString());
                            _testinfo.SYSTEMLOG += "ADC_RX_Point2 = " + ADC_RX_Point2 + "\r\n";
                        }
                    }

                    _testinfo.SYSTEMLOG += "OLT phát công suất = -10dBm ~ 100uW\r\n";
                    // Thiết lập suy hao mức 3 cho máy điều chỉnh suy hao
                    FVA.set_attenuation_level(attenuation_level_3);
                    _testinfo.SYSTEMLOG += "Đang thiết lập mức suy hao = " + attenuation_level_3 + "\r\n";
                    Thread.Sleep(3000);
                    // Đọc giá trị thanh ghi ADC RX Power:F0-F1
                    // Đổi Hexa -> Decimal, lưu vào biến ADC_RX_Point3
                    //ADC_RX_Point3 = double.Parse(Read_ADC_value_RX("F0"));
                    //MessageBox.Show("Đọc ADC_RX 3");

                    base.Read();
                    base.WriteLine("laser msg --get F0 2");
                    Thread.Sleep(100);
                    value = base.Read();
                    _testinfo.SYSTEMLOG += value + "\r\n";
                    for (int j = 0; j < value.Split('\n').Length; j++)
                    {
                        if (value.Split('\n')[j].Contains("I2C"))
                        {
                            value_register       = value.Split('\n')[j].Split(':')[1].Trim();
                            ADC_RX_Point3        = Convert.ToDouble(HexToDec(value_register).ToString());
                            _testinfo.SYSTEMLOG += "ADC_RX_Point3 = " + ADC_RX_Point3 + "\r\n";
                        }
                    }

                    //Tính Slope-P2; Slope-P1; Offset
                    Slope_P2             = Calculate_Slope_Offset_Polynomial(2, ADC_RX_Point1, ADC_RX_Point2, ADC_RX_Point3, RX_Power1, RX_Power2, RX_Power3);
                    _testinfo.SYSTEMLOG += "Slope_2 DEC =" + Slope_P2 + "\r\n";
                    Slope_P2             = Convert_SlopeP2_RxToHex(float.Parse(Slope_P2));

                    Slope_P1             = Calculate_Slope_Offset_Polynomial(1, ADC_RX_Point1, ADC_RX_Point2, ADC_RX_Point3, RX_Power1, RX_Power2, RX_Power3);
                    _testinfo.SYSTEMLOG += "Slope_1 DEC =" + Slope_P1 + "\r\n";
                    Slope_P1             = Convert_SlopeP1_RxToHex(float.Parse(Slope_P1));

                    Offset = Calculate_Slope_Offset_Polynomial(0, ADC_RX_Point1, ADC_RX_Point2, ADC_RX_Point3, RX_Power1, RX_Power2, RX_Power3);
                    _testinfo.SYSTEMLOG += "Offset DEC =" + Offset + "\r\n";
                    Offset = Convert_Offset_RxToHex(float.Parse(Offset));
                    _testinfo.SYSTEMLOG += "--\r\n";
                    _testinfo.SYSTEMLOG += "Slope_2 =" + Slope_P2 + "\r\n";
                    _testinfo.SYSTEMLOG += "Slope_1 =" + Slope_P1 + "\r\n";
                    _testinfo.SYSTEMLOG += "Offset =" + Offset + "\r\n";

                    if (Slope_P2 != "NONE" && Slope_P1 != "NONE" && Offset != "NONE")
                    {
                        // Code Write Slope, Offset đến GN25L98
                        _testinfo.SYSTEMLOG += "Thực hiện Write Slope & Offset to EEPROM\r\n";
                        //MessageBox.Show(Slope_P2.Substring(0, 2));
                        Write_To_Register_COM("e2", Slope_P2.Substring(0, 2));
                        Thread.Sleep(delay);
                        //MessageBox.Show(Slope_P2.Substring(2, 2));
                        Write_To_Register_COM("e3", Slope_P2.Substring(2, 2));
                        Thread.Sleep(delay);
                        //MessageBox.Show(Offset.Substring(0, 2));
                        Write_To_Register_COM("e4", Slope_P1.Substring(0, 2));
                        Thread.Sleep(delay);
                        //MessageBox.Show(Offset.Substring(2, 2));
                        Write_To_Register_COM("e5", Slope_P1.Substring(2, 2));
                        Thread.Sleep(delay);
                        //MessageBox.Show(Slope_P2.Substring(0, 2));
                        Write_To_Register_COM("e6", Offset.Substring(0, 2));
                        Thread.Sleep(delay);
                        //MessageBox.Show(Offset.Substring(2, 2));
                        Write_To_Register_COM("e7", Offset.Substring(2, 2));
                        Thread.Sleep(delay);
                        base.Read();
                        base.WriteLine("laser power --rxread");
                        Thread.Sleep(100);
                        Power_DDMI           = base.Read().Split('=')[2].Trim().Substring(0, 5);
                        _testinfo.SYSTEMLOG += "Power_DDMI = " + Power_DDMI + "\r\n";
                        if (Convert.ToDouble(Power_DDMI) > -11 && Convert.ToDouble(Power_DDMI) < -9)
                        {
                            _testinfo.SYSTEMLOG      += "[OK] Hoàn thành Calibration RX Power.\r\n";
                            Calibration_RX_Result     = true;
                            _testinfo.CALIBDDMIRESULT = Parameters.testStatus.PASS.ToString();
                        }
                        else
                        {
                            _testinfo.SYSTEMLOG      += "[FAIL] Lỗi Calibration RX Power.\r\n";
                            Calibration_RX_Result     = false;
                            _testinfo.CALIBDDMIRESULT = Parameters.testStatus.FAIL.ToString();
                        }
                        break;
                    }
                    else
                    {
                        continue;
                    }
                }
            }
            catch (Exception ex) {
                _testinfo.SYSTEMLOG += ex.ToString() + "\r\n";
                _testinfo.SYSTEMLOG += "[ERROR] Lỗi trong quá trình RX Calibration.\r\n";
                //MessageBox.Show(Ex.ToString());
                Calibration_RX_Result     = false;
                _testinfo.CALIBDDMIRESULT = Parameters.testStatus.FAIL.ToString();
            }
            return(Calibration_RX_Result);
        }