FTD2XX_NET.FTDI.ReadXSeriesEEPROM C# (CSharp) Method

ReadXSeriesEEPROM() public method

Reads the EEPROM contents of an X-Series device.
Thrown when the current device does not match the type required by this method.
public ReadXSeriesEEPROM ( FT_XSERIES_EEPROM_STRUCTURE eeX ) : FT_STATUS
eeX FT_XSERIES_EEPROM_STRUCTURE An FT_XSERIES_EEPROM_STRUCTURE which contains only the relevant information for an X-Series device.
return FT_STATUS
        public FT_STATUS ReadXSeriesEEPROM(FT_XSERIES_EEPROM_STRUCTURE eeX)
        {
            // Initialise ftStatus to something other than FT_OK
            FT_STATUS ftStatus = FT_STATUS.FT_OTHER_ERROR;
            FT_ERROR ftErrorCondition = FT_ERROR.FT_NO_ERROR;

            // If the DLL hasn't been loaded, just return here
            if (hFTD2XXDLL == IntPtr.Zero)
                return ftStatus;

            // Check for our required function pointers being set up
            if (pFT_EEPROM_Read != IntPtr.Zero)
            {
                tFT_EEPROM_Read FT_EEPROM_Read = (tFT_EEPROM_Read)Marshal.GetDelegateForFunctionPointer(pFT_EEPROM_Read, typeof(tFT_EEPROM_Read));

                if (ftHandle != IntPtr.Zero)
                {
                    FT_DEVICE DeviceType = FT_DEVICE.FT_DEVICE_UNKNOWN;
                    // Check that it is an FT232H that we are trying to read
                    GetDeviceType(ref DeviceType);
                    if (DeviceType != FT_DEVICE.FT_DEVICE_X_SERIES)
                    {
                        // If it is not, throw an exception
                        ftErrorCondition = FT_ERROR.FT_INCORRECT_DEVICE;
                        ErrorHandler(ftStatus, ftErrorCondition);
                    }

                    FT_XSERIES_DATA eeData = new FT_XSERIES_DATA();
                    FT_EEPROM_HEADER eeHeader = new FT_EEPROM_HEADER();

                    byte[] manufacturer = new byte[32];
                    byte[] manufacturerID = new byte[16];
                    byte[] description = new byte[64];
                    byte[] serialNumber = new byte[16];

                    eeHeader.deviceType = (uint)FT_DEVICE.FT_DEVICE_X_SERIES;
                    eeData.common = eeHeader;

                    // Calculate the size of our data structure...
                    int size = Marshal.SizeOf(eeData);

                    // Allocate space for our pointer...
                    IntPtr eeDataMarshal = Marshal.AllocHGlobal(size);
                    Marshal.StructureToPtr(eeData, eeDataMarshal, false);

                    // Call FT_EEPROM_Read
                    ftStatus = FT_EEPROM_Read(ftHandle, eeDataMarshal, (uint)size, manufacturer, manufacturerID, description, serialNumber);

                    if (ftStatus == FT_STATUS.FT_OK)
                    {
                        // Get the data back from the pointer...
                        eeData = (FT_XSERIES_DATA)Marshal.PtrToStructure(eeDataMarshal, typeof(FT_XSERIES_DATA));

                        // Retrieve string values
                        System.Text.UTF8Encoding enc = new System.Text.UTF8Encoding();
                        eeX.Manufacturer = enc.GetString(manufacturer);
                        eeX.ManufacturerID = enc.GetString(manufacturerID);
                        eeX.Description = enc.GetString(description);
                        eeX.SerialNumber = enc.GetString(serialNumber);
                        // Map non-string elements to structure to be returned
                        // Standard elements
                        eeX.VendorID = eeData.common.VendorId;
                        eeX.ProductID = eeData.common.ProductId;
                        eeX.MaxPower = eeData.common.MaxPower;
                        eeX.SelfPowered = Convert.ToBoolean(eeData.common.SelfPowered);
                        eeX.RemoteWakeup = Convert.ToBoolean(eeData.common.RemoteWakeup);
                        eeX.SerNumEnable = Convert.ToBoolean(eeData.common.SerNumEnable);
                        eeX.PullDownEnable = Convert.ToBoolean(eeData.common.PullDownEnable);
                        // X-Series specific fields
                        // CBUS
                        eeX.Cbus0 = eeData.Cbus0;
                        eeX.Cbus1 = eeData.Cbus1;
                        eeX.Cbus2 = eeData.Cbus2;
                        eeX.Cbus3 = eeData.Cbus3;
                        eeX.Cbus4 = eeData.Cbus4;
                        eeX.Cbus5 = eeData.Cbus5;
                        eeX.Cbus6 = eeData.Cbus6;
                        // Drive Options
                        eeX.ACDriveCurrent = eeData.ACDriveCurrent;
                        eeX.ACSchmittInput = eeData.ACSchmittInput;
                        eeX.ACSlowSlew = eeData.ACSlowSlew;
                        eeX.ADDriveCurrent = eeData.ADDriveCurrent;
                        eeX.ADSchmittInput = eeData.ADSchmittInput;
                        eeX.ADSlowSlew = eeData.ADSlowSlew;
                        // BCD
                        eeX.BCDDisableSleep = eeData.BCDDisableSleep;
                        eeX.BCDEnable = eeData.BCDEnable;
                        eeX.BCDForceCbusPWREN = eeData.BCDForceCbusPWREN;
                        // FT1248
                        eeX.FT1248Cpol = eeData.FT1248Cpol;
                        eeX.FT1248FlowControl = eeData.FT1248FlowControl;
                        eeX.FT1248Lsb = eeData.FT1248Lsb;
                        // I2C
                        eeX.I2CDeviceId = eeData.I2CDeviceId;
                        eeX.I2CDisableSchmitt = eeData.I2CDisableSchmitt;
                        eeX.I2CSlaveAddress = eeData.I2CSlaveAddress;
                        // RS232 Signals
                        eeX.InvertCTS = eeData.InvertCTS;
                        eeX.InvertDCD = eeData.InvertDCD;
                        eeX.InvertDSR = eeData.InvertDSR;
                        eeX.InvertDTR = eeData.InvertDTR;
                        eeX.InvertRI = eeData.InvertRI;
                        eeX.InvertRTS = eeData.InvertRTS;
                        eeX.InvertRXD = eeData.InvertRXD;
                        eeX.InvertTXD = eeData.InvertTXD;
                        // Hardware Options
                        eeX.PowerSaveEnable = eeData.PowerSaveEnable;
                        eeX.RS485EchoSuppress = eeData.RS485EchoSuppress;
                        // Driver Option
                        eeX.IsVCP = eeData.DriverType;
                    }
                }
            }
            else
            {
                if (pFT_EE_Read == IntPtr.Zero)
                {
                    LogB.Debug("FTD2XX: Failed to load function FT_EE_Read.");
                }
            }
            return ftStatus;
        }