public bool RunI2CTest(UnitI2CTest[] I2CTests)
        {
            string stdErr;
            int    hr;

            bool RetVal = true;

            if (!ConnectProgrammer())
            {
                TestStatusUpdate(MTKTestMessageType.Information, "Error!!!");
                Log.PrintLog(this, "Unable to connect to the programmer.", LogDetailLevel.LogRelevant);
                return(false);
            }

            hr = Programmer.SetProtocol(enumInterfaces.I2C, out stdErr);
            if (!IsSuccess(hr))
            {
                Log.PrintLog(this, "Failed to set I2C protocol: " + stdErr, LogDetailLevel.LogRelevant);
                RetVal = false;
            }

            hr = Programmer.I2C_SetSpeed(enumI2Cspeed.CLK_100K, out stdErr);
            if (!IsSuccess(hr))
            {
                Log.PrintLog(this, "Failed to set I2C bus clock speed: " + stdErr, LogDetailLevel.LogRelevant);
                RetVal = false;
            }

            hr = Programmer.I2C_ResetBus(out stdErr);
            if (!IsSuccess(hr))
            {
                Log.PrintLog(this, "Failed to reset I2C bus: " + stdErr, LogDetailLevel.LogRelevant);
                RetVal = false;
            }

            byte[] DevList = new byte[0];
            hr = Programmer.I2C_GetDeviceList(out DevList, out stdErr);
            if (!IsSuccess(hr))
            {
                Log.PrintLog(this, "Failed to get device list: " + stdErr, LogDetailLevel.LogRelevant);
                RetVal = false;
            }


            Log.PrintLog(this, "I2C Bus reinitialized successfully.", LogDetailLevel.LogEverything);

            for (int i = 0; i < I2CTests.Count(); i++)
            {
                bool DeviceFound = false;
                for (int j = 0; j < DevList.Count(); j++)
                {
                    if (DevList[j] == (byte)I2CTests[i].Address)
                    {
                        DeviceFound = true;
                        break;
                    }
                }

                if (DeviceFound)
                {
                    if (I2CTests[i].Action == MTKI2CTestType.Write)
                    {
                        hr = Programmer.I2C_SendData(I2CTests[i].Address, I2CTests[i].DataBuffer, out stdErr);
                        if (!IsSuccess(hr))
                        {
                            Log.PrintLog(this, "Failed I2C write: " + stdErr, LogDetailLevel.LogRelevant);
                            RetVal = false;
                        }
                    }
                    else if (I2CTests[i].Action == MTKI2CTestType.Read)
                    {
                        hr = Programmer.I2C_ReadData(I2CTests[i].Address, I2CTests[i].NumRxBytes, out I2CTests[i].RxDataBuffer, out stdErr);
                        if (!IsSuccess(hr))
                        {
                            Log.PrintLog(this, "Failed I2C read: " + stdErr, LogDetailLevel.LogRelevant);
                            RetVal = false;
                        }
                    }
                }
                else
                {
                    Log.PrintLog(this, "Cannot find I2C device with address: " + I2CTests[i].Address.ToString("x2").ToUpper(), LogDetailLevel.LogEverything);
                    RetVal = false;
                }
            }

            if (!DisconnectProgrammer())
            {
                TestStatusUpdate(MTKTestMessageType.Information, "Error!!!");
                Log.PrintLog(this, "Unable to disconnect from the programmer.", LogDetailLevel.LogRelevant);
                RetVal = false;
            }

            return(RetVal);
        }