From 97592c303b24e9d87891cc7440ad48a5e8b485b7 Mon Sep 17 00:00:00 2001 From: Andrew Zonenberg Date: Tue, 5 Dec 2023 18:57:31 -0800 Subject: [PATCH] WaveformArea: implemented secondary trigger level arrow. Fixes #658. --- lib | 2 +- src/ngscopeclient/WaveformArea.cpp | 91 ++++++++++++++++++++++++++++-- src/ngscopeclient/WaveformArea.h | 1 + 3 files changed, 88 insertions(+), 6 deletions(-) diff --git a/lib b/lib index e68e00044..14640ce92 160000 --- a/lib +++ b/lib @@ -1 +1 @@ -Subproject commit e68e00044fcc5499704a7837cf93c7445fdb570e +Subproject commit 14640ce92f3493eaa2964864490670e61c73b423 diff --git a/src/ngscopeclient/WaveformArea.cpp b/src/ngscopeclient/WaveformArea.cpp index 3e6e3bd76..ee8e5c8ff 100644 --- a/src/ngscopeclient/WaveformArea.cpp +++ b/src/ngscopeclient/WaveformArea.cpp @@ -2576,13 +2576,41 @@ void WaveformArea::RenderTriggerLevelArrows(ImVec2 start, ImVec2 /*size*/) } } - //TODO: second level + //Second level auto sl = dynamic_cast(trig); if(sl) - LogWarning("Two-level triggers not implemented\n"); + { + //Draw the arrow + //If currently dragging, show at mouse position rather than actual hardware trigger level + level = sl->GetLowerBound(); + y = YAxisUnitsToYPosition(level); + if( (m_dragState == DRAG_STATE_TRIGGER_SECONDARY_LEVEL) && (trig == m_triggerDuringDrag) ) + y = mouse.y; + arrowtop = y - arrowsize/2; + arrowbot = y + arrowsize/2; + draw_list->AddTriangleFilled( + ImVec2(start.x, y), ImVec2(arrowright, arrowtop), ImVec2(arrowright, arrowbot), color); + + //Check mouse position + //Use slightly expanded hitbox to make it easier to capture + caparrowtop = y - caparrowsize/2; + caparrowbot = y + caparrowsize/2; + if( (mouse.x >= start.x) && (mouse.x <= caparrowright) && (mouse.y >= caparrowtop) && (mouse.y <= caparrowbot) ) + { + ImGui::SetMouseCursor(ImGuiMouseCursor_ResizeNS); + m_mouseOverTriggerArrow = true; + + if(ImGui::IsMouseClicked(ImGuiMouseButton_Left)) + { + LogTrace("Start dragging secondary trigger level\n"); + m_dragState = DRAG_STATE_TRIGGER_SECONDARY_LEVEL; + m_triggerDuringDrag = trig; + } + } + } //Handle dragging - if(m_dragState == DRAG_STATE_TRIGGER_LEVEL) + if( (m_dragState == DRAG_STATE_TRIGGER_LEVEL) || (m_dragState == DRAG_STATE_TRIGGER_SECONDARY_LEVEL) ) m_triggerLevelDuringDrag = YPositionToYAxisUnits(mouse.y); } } @@ -3354,8 +3382,61 @@ void WaveformArea::OnMouseUp() Unit volts(Unit::UNIT_VOLTS); LogTrace("End dragging trigger level (at %s)\n", volts.PrettyPrint(m_triggerLevelDuringDrag).c_str()); - m_triggerDuringDrag->SetLevel(m_triggerLevelDuringDrag); - m_triggerDuringDrag->GetScope()->PushTrigger(); + //If two-level trigger, make sure we have the levels in the right order + auto tlt = dynamic_cast(m_triggerDuringDrag); + if(tlt) + { + //We're dragging the primary level, which should always be higher than the secondary + auto sec = tlt->GetLowerBound(); + if(m_triggerLevelDuringDrag >= sec) + { + tlt->SetUpperBound(m_triggerLevelDuringDrag); + tlt->GetScope()->PushTrigger(); + } + + //But if we dragged past the secondary level, invert (otherwise we'll never trigger) + else + { + tlt->SetUpperBound(sec); + tlt->SetLowerBound(m_triggerLevelDuringDrag); + tlt->GetScope()->PushTrigger(); + } + } + + else + { + m_triggerDuringDrag->SetLevel(m_triggerLevelDuringDrag); + m_triggerDuringDrag->GetScope()->PushTrigger(); + } + } + break; + + case DRAG_STATE_TRIGGER_SECONDARY_LEVEL: + { + Unit volts(Unit::UNIT_VOLTS); + LogTrace("End dragging secondary trigger level (at %s)\n", + volts.PrettyPrint(m_triggerLevelDuringDrag).c_str()); + + //If two-level trigger, make sure we have the levels in the right order + auto tlt = dynamic_cast(m_triggerDuringDrag); + if(tlt) + { + //We're dragging the secondary level, which should always be lower than the secondary + auto prim = tlt->GetUpperBound(); + if(m_triggerLevelDuringDrag < prim) + { + tlt->SetLowerBound(m_triggerLevelDuringDrag); + tlt->GetScope()->PushTrigger(); + } + + //But if we dragged past the secondary level, invert (otherwise we'll never trigger) + else + { + tlt->SetUpperBound(m_triggerLevelDuringDrag); + tlt->SetLowerBound(prim); + tlt->GetScope()->PushTrigger(); + } + } } break; diff --git a/src/ngscopeclient/WaveformArea.h b/src/ngscopeclient/WaveformArea.h index 715ac47c4..23866be06 100644 --- a/src/ngscopeclient/WaveformArea.h +++ b/src/ngscopeclient/WaveformArea.h @@ -566,6 +566,7 @@ class WaveformArea DRAG_STATE_CHANNEL_LAST, DRAG_STATE_Y_AXIS, DRAG_STATE_TRIGGER_LEVEL, + DRAG_STATE_TRIGGER_SECONDARY_LEVEL, DRAG_STATE_BER_LEVEL, DRAG_STATE_BER_BOTH, DRAG_STATE_PEAK_MARKER