Skip to content
Merged
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
106 changes: 99 additions & 7 deletions src/ngscopeclient/AddInstrumentDialog.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -54,15 +54,21 @@ AddInstrumentDialog::AddInstrumentDialog(
: Dialog(
title,
string("AddInstrument") + to_string_hex(reinterpret_cast<uintptr_t>(this)),
ImVec2(600, 150),
ImVec2(600, 180),
session,
parent)
, m_nickname(nickname)
, m_selectedDriver(0)
, m_selectedTransport(0)
, m_selectedModel(0)
, m_path(path)
{
SCPITransport::EnumTransports(m_transports);
m_supportedTransports.insert(m_transports.begin(), m_transports.end());
m_pathEdited = false;
m_defaultNickname = nickname;
m_originalNickname = nickname;
m_nicknameEdited = false;

m_drivers = session->GetDriverNamesForType(driverType);
if(!driver.empty())
Expand All @@ -78,7 +84,8 @@ AddInstrumentDialog::AddInstrumentDialog(
i++;
}
}

// Update combo now to have the right list of transports according to the selected driver
UpdateCombos();

if(!transport.empty())
{
Expand All @@ -93,6 +100,8 @@ AddInstrumentDialog::AddInstrumentDialog(
i++;
}
}
// Update again to setup path and nickenae
UpdateCombos();
}

AddInstrumentDialog::~AddInstrumentDialog()
Expand All @@ -115,14 +124,20 @@ bool AddInstrumentDialog::DoRender()
if(tutorial && (tutorial->GetCurrentStep() != TutorialWizard::TUTORIAL_02_CONNECT) )
tutorial = nullptr;

ImGui::InputText("Nickname", &m_nickname);
if(ImGui::InputText("Nickname", &m_nickname))
m_nicknameEdited = !(m_nickname.empty() || (m_nickname == m_defaultNickname));
HelpMarker(
"Text nickname for this instrument so you can distinguish between multiple similar devices.\n"
"\n"
"This is shown on the list of recent instruments, to disambiguate channel names in multi-instrument setups, etc.");

bool dropdownOpen = false;
Combo("Driver", m_drivers, m_selectedDriver, &dropdownOpen);
if(Combo("Driver", m_drivers, m_selectedDriver,&dropdownOpen))
{
m_selectedModel = 0;
m_selectedTransport = 0;
UpdateCombos();
}
HelpMarker(
"Select the instrument driver to use.\n"
"\n"
Expand All @@ -144,7 +159,20 @@ bool AddInstrumentDialog::DoRender()
else if(dropdownOpen) //suppress further bubbles if dropdown is active
showedBubble = true;

Combo("Transport", m_transports, m_selectedTransport, &dropdownOpen);
if(m_models.size() > 1)
{ // Only show model combo if there is more than one model
if(Combo("Model", m_models, m_selectedModel))
UpdateCombos();
HelpMarker(
"Select the model of your instrument.\n"
"\n"
"The selected driver supports several models from the manufacturer,"
"Selecting the model will adapt the instrument nickname and connection string.");
}

if(Combo("Transport", m_transports, m_selectedTransport, &dropdownOpen))
UpdateCombos();

HelpMarker(
"Select the SCPI transport for the connection between your computer and the instrument.\n"
"\n"
Expand All @@ -171,14 +199,15 @@ bool AddInstrumentDialog::DoRender()
else if(dropdownOpen) //suppress further bubbles if dropdown is active
showedBubble = true;

ImGui::InputText("Path", &m_path);
if(ImGui::InputText("Path", &m_path))
m_pathEdited = !(m_path.empty() || (m_path == m_defaultPath));
HelpMarker(
"Transport-specific description of how to connect to the instrument.\n",
{
"GPIB: board index and primary address (0:7)",
"TCP/IP transports: IP or hostname : port (localhost:5025).\n"
"Note that for twinlan, two port numbers are required (localhost:5025:5026) for SCPI and data ports respectively.",
"UART: device path and baud rate (/dev/ttyUSB0:9600, COM1). Default id 115200 if not specified. ",
"UART: device path and baud rate (/dev/ttyUSB0:9600, COM1). Default is 115200 if not specified. ",
"USBTMC: Linux device path (/dev/usbtmcX)",
"USB-HID: Device vendor id, product id (and optionnaly serial number): <vendorId(hex)>:<productId(hex)>:<serialNumber> (e.g.: 2e3c:af01)"
}
Expand Down Expand Up @@ -252,3 +281,66 @@ bool AddInstrumentDialog::DoConnect(SCPITransport* transport)
{
return m_session->CreateAndAddInstrument(m_drivers[m_selectedDriver], transport, m_nickname);
}

void AddInstrumentDialog::UpdateCombos()
{
// Update transoport list according to selected driver an connection string according to transport
string driver = m_drivers[m_selectedDriver];
auto supportedModels = SCPIInstrument::GetSupportedModels(driver);
if(!supportedModels.empty())
{
m_models.clear();
m_transports.clear();
int modelIndex = 0;
auto selectedModel = supportedModels[0];
// Model list
for(auto model : supportedModels)
{
m_models.push_back(model.modelName);
if(modelIndex == m_selectedModel)
{
selectedModel = model;
}
modelIndex++;
}
// Nick name
if(!m_nicknameEdited)
{
m_nickname = selectedModel.modelName;
m_defaultNickname = m_nickname;
}

// Transport list
int transportIndex = 0;
for(auto transport : selectedModel.supportedTransports)
{
string transportName = to_string(transport.transportType);
if(m_supportedTransports.find(transportName) != m_supportedTransports.end())
{
m_transports.push_back(transportName);
if(transportIndex == m_selectedTransport && !m_pathEdited)
{
m_path = transport.connectionString;
m_defaultPath = m_path;
}
transportIndex++;
}
}
if(m_selectedTransport >= (int)m_transports.size())
{
m_selectedTransport = 0;
if(!m_pathEdited)
m_path = "";
}
}
else
{ // Supported transports not provided => add all transports
m_transports.clear();
m_models.clear();
if(!m_nicknameEdited)
m_nickname = m_originalNickname;
SCPITransport::EnumTransports(m_transports);
if(!m_pathEdited)
m_path = "";
}
}
10 changes: 10 additions & 0 deletions src/ngscopeclient/AddInstrumentDialog.h
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@

#include "Dialog.h"
#include "Session.h"
#include <unordered_set>

class AddInstrumentDialog : public Dialog
{
Expand All @@ -59,13 +60,22 @@ class AddInstrumentDialog : public Dialog

virtual bool DoConnect(SCPITransport* transport);

void UpdateCombos();
//GUI widget values
std::string m_nickname;
std::string m_originalNickname;
std::string m_defaultNickname;
bool m_nicknameEdited;
int m_selectedDriver;
std::vector<std::string> m_drivers;
int m_selectedTransport;
std::vector<std::string> m_transports;
int m_selectedModel;
std::vector<std::string> m_models;
std::unordered_set<std::string> m_supportedTransports;
std::string m_path;
std::string m_defaultPath;
bool m_pathEdited;
};

#endif
Loading