/// <summary>
        /// Initialize Camera config string
        /// </summary>
        private void InitializeCameraDevice()
        {
            CoreComponent component     = null;
            string        cameraDevices = "";

            //get camera friendly names from
            try
            {
                component     = new CoreComponent();
                cameraDevices = component.GetCameraDevice();
            }
            catch (Exception ex)
            {
                Log.LogError("Cannot get Camera devices: " + ex.ToString());
            }
            finally
            {
                if (component != null)
                {
                    component.Dispose();
                    component = null;
                }
            }
            CameraConfig.Text = cameraDevices;
        }
        /// <summary>
        /// Initializes strings from SystemFunctionTestClass resources
        /// </summary>
        /// <param name="BTPara">BT device names list will need to be scaned.
        /// If users configure the BT devices list and scan time on SFTConfig.xml, this test will be auto-judge pass/fail.</param>
        private void BTScan(string[] BTPara)
        {
            string        BTInfo;
            bool          bFlag     = false;
            CoreComponent component = null;

            try
            {
                component = new CoreComponent();
                BTInfo    = component.TestBT(TestDuration);
            }
            finally
            {
                if (component != null)
                {
                    component.Dispose();
                    component = null;
                }
            }

            char[]   tok   = new Char[] { '\n' };
            string[] split = BTInfo.Split(tok, StringSplitOptions.RemoveEmptyEntries);

            for (int i = 0; i < split.Length; i++)
            {
                this.BTInFoList.Items.Add(split[i]);
                this.BTInFoList.Items.Add("\n");
                Log.LogComment(DllLog.Log.LogLevel.Info, "Scaned BT device: " + split[i]);
            }

            if (BTPara != null) // If BTlist para is not empty, test item will auto-judge pass/fail
            {
                for (int i = 0; i < BTPara.Length; i++)
                {
                    if (BTInfo.IndexOf(BTPara[i], StringComparison.Ordinal) >= 0)
                    {
                        bFlag = true;
                    }
                    else
                    {
                        bFlag = false;
                        break;
                    }
                }
                if (bFlag)
                {
                    Program.ExitApplication(0);
                }
                else
                {
                    Program.ExitApplication(255);
                }
            }
        }
        /// <summary>
        /// Form load event. On load register touch window and DisableTouch
        /// </summary>
        /// <param name="sender">Event sender.</param>
        /// <param name="e">The <see cref="object"/> instance containing the event data.</param>
        private void OnLoadHandler(Object sender, EventArgs e)
        {
            try
            {
                // Registering the window for multi-touch, using the default settings.
                // p/invoking into user32.dll
                if (!NativeMethods.RegisterTouchWindow(this.Handle, 0))
                {
                    Log.LogError("Could not register window for multi-touch");
                }
            }
            catch (Exception exception)
            {
                Log.LogError("RegisterTouchWindow API not available");
                Log.LogError(exception.ToString());
                MessageBox.Show("RegisterTouchWindow API not available", "MTScratchpadWMTouch ERROR",
                                MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1, 0);
                Log.LogError("RegisterTouchWindow API not available");
            }

            CoreComponent component = null;

            try
            {
                component = new CoreComponent();
                component.DisableTouch(NativeMethods.GetActiveWindow());
            }
            catch (Exception ex)
            {
                Log.LogError("Cannot disable edge UI " + ex.ToString());
            }
            finally
            {
                if (component != null)
                {
                    component.Dispose();
                    component = null;
                }
            }
        }
        /// <summary>
        /// A thread function for brightness and it will call the function in the DllComponent.
        /// </summary>
        private void _ThreadFunction()
        {
            System.Threading.Thread.Sleep(500);
            Int32         hr;
            CoreComponent component = null;

            try
            {
                component = new CoreComponent();
                hr        = component.TestBrightness();
            }
            finally
            {
                if (component != null)
                {
                    component.Dispose();
                    component = null;
                }
            }
            PassBtn.Visible  = true;
            FailBtn.Visible  = true;
            RetryBtn.Visible = true;
        }
        /// <summary>
        /// Initializes strings from SystemFunctionTestClass resources
        /// </summary>
        /// <param name="APList">WiFi AP list will need to be researched and signal strength SPEC.
        /// If users configure the WiFi AP list and signal strength SPEC on SFTConfig.xml, this test will be auto-judge pass/fail.</param>
        public void WifiInformation(string[] APList, int iIfConnection)
        {
            string        WiFiInfo;
            string        ConnectAPSSID;
            bool          bFlag        = false;
            int           APCheckCount = 0;
            CoreComponent component    = null;

            try
            {
                component = new CoreComponent();
                if (APList == null)
                {
                    ConnectAPSSID = null;
                }
                else
                {
                    ConnectAPSSID = APList[0];
                }

                Log.LogComment(DllLog.Log.LogLevel.Info, "The SSID for wifi connection:" + ConnectAPSSID);
                WiFiInfo = component.TestWiFi(ConnectAPSSID, iIfConnection);
                if (WiFiInfo.IndexOf("WiFi_Connect_Fail", StringComparison.Ordinal) >= 0)
                {
                    APCheckCount = 999;
                    Log.LogComment(DllLog.Log.LogLevel.Error, "The SSID for wifi connection status : Fail");
                }
            }
            finally
            {
                if (component != null)
                {
                    component.Dispose();
                    component = null;
                }
            }

            char[]   tok   = new Char[] { '\n', ',' };
            string[] split = WiFiInfo.Split(tok, StringSplitOptions.RemoveEmptyEntries); // Query WiFi informarion from Dll.
            // Parser the scaned AP and signal into array
            for (int i = 0; i < split.Length; i++)
            {
                APScan[iWiFiCount] = split[i];
                i++;
                WifiListSignal[iWiFiCount] = Int32.Parse(split[i].ToString(), CultureInfo.InvariantCulture);
                iWiFiCount++;
            }
            // Add wifi signal amd SSID into dataview object
            for (int i = 0; i < iWiFiCount; i++)
            {
                DataGridViewRowCollection rows = WifiInfoGrid.Rows;
                rows.Add(new Object[] { WifiListSignal[i], APScan[i] });
                Log.LogComment(DllLog.Log.LogLevel.Info, "Signal = " + WifiListSignal[i] + " , SSID = " + APScan[i]);
            }

            if (APList != null)
            {
                for (int k = 0; k < APList.Length; k++)
                {
                    for (int i = 0; i < iWiFiCount; i++)
                    {
                        if (APScan[i].IndexOf(APList[k], StringComparison.Ordinal) >= 0 && WifiListSignal[i] > iSignalSpec)
                        {
                            APCheckCount++;
                            bFlag = true;
                            break;
                        }
                    }
                }
                if (bFlag && APCheckCount == APList.Length)  // All listed AP need to be searched.
                {
                    Program.ExitApplication(0);
                }
                else
                {
                    Program.ExitApplication(255);
                }
            }
        }