Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 13 additions & 12 deletions src/cab/out/ftdichip/FT245RBitbangControllerAutoConfigurator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -30,19 +30,20 @@ void FT245RBitbangControllerAutoConfigurator::AutoConfig(Cabinet* cabinet)
return;
}

for (uint32_t i = 0; i < amountDevices; i++)
// Fill one properly-sized buffer in a single call and index each device by i,
// like the C# OpenByIndex(i) loop. The previous code passed a 1-element buffer
// per iteration (GetDeviceInfoList writes one node per device -> overflow with
// 2+ boards) and never used i (so every controller got device[0]'s serial).
std::vector<FTDI::FT_DEVICE_INFO_NODE> devInfos(amountDevices);
uint32_t numDevs = amountDevices;
FTDI* connectFTDI = new FTDI();
status = connectFTDI->GetDeviceInfoList(devInfos.data(), numDevs);
delete connectFTDI;

if (status == FTDI::FT_OK)
{
FTDI* connectFTDI = new FTDI();

FTDI::FT_DEVICE_INFO_NODE devInfo;
uint32_t numDevs = 1;
status = connectFTDI->GetDeviceInfoList(&devInfo, numDevs);

if (status == FTDI::FT_OK && numDevs > 0)
{
deviceList.emplace_back(devInfo.SerialNumber, devInfo.Description);
}
delete connectFTDI;
for (uint32_t i = 0; i < numDevs && i < devInfos.size(); i++)
deviceList.emplace_back(devInfos[i].SerialNumber, devInfos[i].Description);
}

for (int deviceIndex = 0; deviceIndex < static_cast<int>(deviceList.size()); deviceIndex++)
Expand Down
5 changes: 3 additions & 2 deletions src/cab/out/ftdichip/FTDI.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -78,10 +78,11 @@ FTDI::FT_STATUS FTDI::GetDeviceInfoList(FT_DEVICE_INFO_NODE* devinfo, uint32_t&
return ConvertLibftdiError(result);
}

numdevs = static_cast<uint32_t>(result);
const uint32_t capacity = numdevs; // caller's buffer size (IN)
numdevs = static_cast<uint32_t>(result); // total devices found (OUT)

struct ftdi_device_list* curdev = devlist;
for (uint32_t i = 0; i < numdevs && curdev; ++i, curdev = curdev->next)
for (uint32_t i = 0; i < numdevs && i < capacity && curdev; ++i, curdev = curdev->next)
{
char manufacturer[256] = { 0 };
char description[256] = { 0 };
Expand Down
Loading