diff --git a/lib b/lib index 439b54952..a7725f27b 160000 --- a/lib +++ b/lib @@ -1 +1 @@ -Subproject commit 439b5495237a2364f534b669901f9a0dd7df18da +Subproject commit a7725f27b88b9db7cabcd8e958b6efb665ef53c8 diff --git a/src/ngscopeclient/BERTDialog.cpp b/src/ngscopeclient/BERTDialog.cpp index c3ec01f25..b13ec7fd4 100644 --- a/src/ngscopeclient/BERTDialog.cpp +++ b/src/ngscopeclient/BERTDialog.cpp @@ -120,7 +120,10 @@ bool BERTDialog::DoRender() } HelpMarker(to_string(m_bert->GetCustomPatternLength()) + - " -bit pattern sent by all channels in custom-pattern mode"); + " -bit pattern sent by all channels in custom-pattern mode.\n" + "\n" + "Note that this includes the reference clock output on the ML4039, if\n" + "configured in SERDES mode."); } } @@ -137,10 +140,17 @@ bool BERTDialog::DoRender() m_txPattern = m_bert->GetGlobalCustomPattern(); m_txPatternText = to_string_hex(m_txPattern); } + HelpMarker("Select which clock to output from the reference clock output port"); ImGui::SetNextItemWidth(width); if(Dialog::Combo("Data Rate", m_dataRateNames, m_dataRateIndex)) + { m_bert->SetDataRate(m_dataRates[m_dataRateIndex]); + + //Reload refclk mux setting names + m_refclkNames = m_bert->GetRefclkOutMuxNames(); + } + HelpMarker("PHY signaling rate for all transmit and receive ports"); } return true; diff --git a/src/ngscopeclient/BERTInputChannelDialog.cpp b/src/ngscopeclient/BERTInputChannelDialog.cpp index 5a328b8fe..c7aaa2599 100644 --- a/src/ngscopeclient/BERTInputChannelDialog.cpp +++ b/src/ngscopeclient/BERTInputChannelDialog.cpp @@ -143,6 +143,7 @@ bool BERTInputChannelDialog::DoRender() ImGui::SetNextItemWidth(width); if(ImGui::Checkbox("Invert", &m_invert)) m_channel->SetInvert(m_invert); + HelpMarker("Inverts the polarity of the input"); } if(ImGui::CollapsingHeader("CDR", defaultOpenFlags)) @@ -151,6 +152,9 @@ bool BERTInputChannelDialog::DoRender() auto lock = m_channel->GetCdrLockState(); ImGui::Checkbox("Lock", &lock); ImGui::EndDisabled(); + HelpMarker( + "Indicates whether the clock recovery loop and PRBS checker are locked to incoming data.\n" + "If not locked, no measurements can be made."); } if(ImGui::CollapsingHeader("Pattern Checker", defaultOpenFlags)) @@ -158,6 +162,8 @@ bool BERTInputChannelDialog::DoRender() ImGui::SetNextItemWidth(width); if(Dialog::Combo("Pattern", m_patternNames, m_patternIndex)) m_channel->SetPattern(m_patternValues[m_patternIndex]); + + HelpMarker("Expected PRBS pattern"); } if(ImGui::CollapsingHeader("Measurements", defaultOpenFlags)) @@ -172,6 +178,7 @@ bool BERTInputChannelDialog::DoRender() auto state = m_parent->GetSession().GetBERTState(m_channel->GetBERT()); state->m_horzBathtubScanPending[m_channel->GetIndex()] = true; } + HelpMarker("Acquire a single horizontal bathtub measurement"); if(ImGui::Button("Eye")) { @@ -182,6 +189,7 @@ bool BERTInputChannelDialog::DoRender() auto state = m_parent->GetSession().GetBERTState(m_channel->GetBERT()); state->m_eyeScanPending[m_channel->GetIndex()] = true; } + HelpMarker("Acquire a single eye pattern measurement"); } return true; diff --git a/src/ngscopeclient/BERTOutputChannelDialog.cpp b/src/ngscopeclient/BERTOutputChannelDialog.cpp index 2e02f3a03..3d4d7e8c5 100644 --- a/src/ngscopeclient/BERTOutputChannelDialog.cpp +++ b/src/ngscopeclient/BERTOutputChannelDialog.cpp @@ -158,6 +158,11 @@ bool BERTOutputChannelDialog::DoRender() ImGui::SetNextItemWidth(width); if(Dialog::Combo("Pattern", m_patternNames, m_patternIndex)) m_channel->SetPattern(m_patternValues[m_patternIndex]); + + if(!m_channel->GetBERT()->IsCustomPatternPerChannel()) + HelpMarker("Pattern to drive out this port.\nNote that all ports in \"custom\" mode share a single pattern generator"); + else + HelpMarker("Pattern to drive out this port."); } if(ImGui::CollapsingHeader("PHY Control", defaultOpenFlags)) @@ -165,20 +170,25 @@ bool BERTOutputChannelDialog::DoRender() ImGui::SetNextItemWidth(width); if(ImGui::Checkbox("Enable", &m_enable)) m_channel->Enable(m_enable); + HelpMarker("Enable the output driver"); ImGui::SetNextItemWidth(width); if(ImGui::Checkbox("Invert", &m_invert)) m_channel->SetInvert(m_invert); + HelpMarker("Invert polarity of the output"); ImGui::SetNextItemWidth(width); if(Dialog::Combo("Swing", m_driveNames, m_driveIndex)) m_channel->SetDriveStrength(m_driveValues[m_driveIndex]); + HelpMarker("Peak-to-peak swing of the output (with no emphasis)"); if(ImGui::SliderFloat("Pre-cursor", &m_precursor, 0.0, 1.0, "%.2f", ImGuiSliderFlags_AlwaysClamp)) m_channel->SetPreCursor(m_precursor); + HelpMarker("Pre-cursor FFE tap value"); if(ImGui::SliderFloat("Post-cursor", &m_postcursor, 0.0, 1.0, "%.2f", ImGuiSliderFlags_AlwaysClamp)) m_channel->SetPostCursor(m_postcursor); + HelpMarker("Post-cursor FFE tap value"); }