public OpenByLocation ( |
||
location | Location of the device to open. | |
return | FT_STATUS |
public FT_STATUS OpenByLocation(UInt32 location)
{
// Initialise ftStatus to something other than FT_OK
FT_STATUS ftStatus = FT_STATUS.FT_OTHER_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_OpenEx != IntPtr.Zero) & (pFT_SetDataCharacteristics != IntPtr.Zero) & (pFT_SetFlowControl != IntPtr.Zero) & (pFT_SetBaudRate != IntPtr.Zero))
{
tFT_OpenExLoc FT_OpenEx = (tFT_OpenExLoc)Marshal.GetDelegateForFunctionPointer(pFT_OpenEx, typeof(tFT_OpenExLoc));
tFT_SetDataCharacteristics FT_SetDataCharacteristics = (tFT_SetDataCharacteristics)Marshal.GetDelegateForFunctionPointer(pFT_SetDataCharacteristics, typeof(tFT_SetDataCharacteristics));
tFT_SetFlowControl FT_SetFlowControl = (tFT_SetFlowControl)Marshal.GetDelegateForFunctionPointer(pFT_SetFlowControl, typeof(tFT_SetFlowControl));
tFT_SetBaudRate FT_SetBaudRate = (tFT_SetBaudRate)Marshal.GetDelegateForFunctionPointer(pFT_SetBaudRate, typeof(tFT_SetBaudRate));
// Call FT_OpenEx
ftStatus = FT_OpenEx(location, FT_OPEN_BY_LOCATION, ref ftHandle);
// Appears that the handle value can be non-NULL on a fail, so set it explicitly
if (ftStatus != FT_STATUS.FT_OK)
ftHandle = IntPtr.Zero;
if (ftHandle != IntPtr.Zero)
{
// Initialise port data characteristics
byte WordLength = FT_DATA_BITS.FT_BITS_8;
byte StopBits = FT_STOP_BITS.FT_STOP_BITS_1;
byte Parity = FT_PARITY.FT_PARITY_NONE;
ftStatus = FT_SetDataCharacteristics(ftHandle, WordLength, StopBits, Parity);
// Initialise to no flow control
UInt16 FlowControl = FT_FLOW_CONTROL.FT_FLOW_NONE;
byte Xon = 0x11;
byte Xoff = 0x13;
ftStatus = FT_SetFlowControl(ftHandle, FlowControl, Xon, Xoff);
// Initialise Baud rate
UInt32 BaudRate = 9600;
ftStatus = FT_SetBaudRate(ftHandle, BaudRate);
}
}
else
{
if (pFT_OpenEx == IntPtr.Zero)
{
LogB.Debug("FTD2XX: Failed to load function FT_OpenEx.");
}
if (pFT_SetDataCharacteristics == IntPtr.Zero)
{
LogB.Debug("FTD2XX: Failed to load function FT_SetDataCharacteristics.");
}
if (pFT_SetFlowControl == IntPtr.Zero)
{
LogB.Debug("FTD2XX: Failed to load function FT_SetFlowControl.");
}
if (pFT_SetBaudRate == IntPtr.Zero)
{
LogB.Debug("FTD2XX: Failed to load function FT_SetBaudRate.");
}
}
return ftStatus;
}
protected bool OpenFTDIDevice(FTDI.FT_DEVICE_INFO_NODE deviceToOpen) { bool connected = false; lock (mFTDIDevice) { if (IsFTDIDeviceOpen()) { CloseFTDIDevice(); } if (FTDI.IsFTD2XXDLLLoaded()) { if (deviceToOpen != null) { if (mFTDIDevice.OpenByLocation(deviceToOpen.LocId) == FTDI.FT_STATUS.FT_OK) { FTDI.FT_STATUS ftdiStatus = FTDI.FT_STATUS.FT_OK; ftdiStatus |= mFTDIDevice.ResetDevice(); //ftdiStatus |= mFTDIDevice.ResetPort(); ftdiStatus |= mFTDIDevice.Purge(FTDI.FT_PURGE.FT_PURGE_RX | FTDI.FT_PURGE.FT_PURGE_TX); if (ftdiStatus == FTDI.FT_STATUS.FT_OK) { DisplayStatusMessage("Opened FTDI device.", StatusMessageType.LOG); DisplayStatusMessage("FTDI device info - Description: " + deviceToOpen.Description + " Serial Number: " + deviceToOpen.SerialNumber + " Device Type: " + deviceToOpen.Type + " ID: 0x" + deviceToOpen.ID.ToString("X") + " Device Flags: 0x" + deviceToOpen.Flags.ToString("X"), StatusMessageType.LOG); if (FTDI.IsFTDChipIDDLLLoaded()) { DisplayStatusMessage("FTDI ChipID DLL is loaded, checking chip ID...", StatusMessageType.LOG); uint chipID = 0; if (mFTDIDevice.GetChipIDFromCurrentDevice(out chipID) == FTDI.FT_STATUS.FT_OK) { DisplayStatusMessage("FTDI device chip ID: 0x" + chipID.ToString("X"), StatusMessageType.LOG); } else { DisplayStatusMessage("Unable to read FTDI device chip ID", StatusMessageType.LOG); } } connected = true; } else { mFTDIDevice.Close(); } } else { DisplayStatusMessage("Could not open FTDI device", StatusMessageType.LOG); } } else { DisplayStatusMessage("No FTDI device selected", StatusMessageType.LOG); } } else { DisplayStatusMessage("FTDI FTD2XX device driver DLL could not be loaded.", StatusMessageType.USER); } } return(connected); }