diff --git a/src/ngscopeclient/AddInstrumentDialog.cpp b/src/ngscopeclient/AddInstrumentDialog.cpp index 6df15147..b2893deb 100644 --- a/src/ngscopeclient/AddInstrumentDialog.cpp +++ b/src/ngscopeclient/AddInstrumentDialog.cpp @@ -54,15 +54,21 @@ AddInstrumentDialog::AddInstrumentDialog( : Dialog( title, string("AddInstrument") + to_string_hex(reinterpret_cast(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()) @@ -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()) { @@ -93,6 +100,8 @@ AddInstrumentDialog::AddInstrumentDialog( i++; } } + // Update again to setup path and nickenae + UpdateCombos(); } AddInstrumentDialog::~AddInstrumentDialog() @@ -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" @@ -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" @@ -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): :: (e.g.: 2e3c:af01)" } @@ -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 = ""; + } +} diff --git a/src/ngscopeclient/AddInstrumentDialog.h b/src/ngscopeclient/AddInstrumentDialog.h index 4702e224..10cddc6a 100644 --- a/src/ngscopeclient/AddInstrumentDialog.h +++ b/src/ngscopeclient/AddInstrumentDialog.h @@ -37,6 +37,7 @@ #include "Dialog.h" #include "Session.h" +#include class AddInstrumentDialog : public Dialog { @@ -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 m_drivers; int m_selectedTransport; std::vector m_transports; + int m_selectedModel; + std::vector m_models; + std::unordered_set m_supportedTransports; std::string m_path; + std::string m_defaultPath; + bool m_pathEdited; }; #endif