diff --git a/src/Gui/GuiSwoControl.cpp b/src/Gui/GuiSwoControl.cpp index 2155c4f8..a096126e 100644 --- a/src/Gui/GuiSwoControl.cpp +++ b/src/Gui/GuiSwoControl.cpp @@ -55,11 +55,27 @@ void Gui::drawSettingsSwo() {settings.coreFrequency = std::stoi(str); tracePlotHandler->setSettings(settings); }); - ImGui::Text("Trace prescaler "); + ImGui::Text("trace prescaler "); ImGui::SameLine(); drawInputText("prescaler", settings.tracePrescaler, [&](std::string str) {settings.tracePrescaler = std::stoi(str); tracePlotHandler->setSettings(settings); }); + + const char* triggers[] = {"OFF", "CH0", "CH1", "CH2", "CH3", "CH4", "CH5", "CH6", "CH7", "CH8", "CH9"}; + int32_t trigerCombo = settings.tracePrescaler + 1; + ImGui::Text("trigger channel "); + ImGui::SameLine(); + if (ImGui::Combo("##combo", &trigerCombo, triggers, IM_ARRAYSIZE(triggers))) + { + settings.triggerChannel = trigerCombo - 1; + tracePlotHandler->setSettings(settings); + } + + ImGui::Text("trigger level "); + ImGui::SameLine(); + drawInputText("level", settings.triggerLevel, [&](std::string str) + {settings.triggerLevel = std::stod(str); + tracePlotHandler->setSettings(settings); }); } void Gui::drawIndicatorsSwo() { diff --git a/src/PlotHandler/TracePlotHandler.cpp b/src/PlotHandler/TracePlotHandler.cpp index 4d8d229c..2b0a5e38 100644 --- a/src/PlotHandler/TracePlotHandler.cpp +++ b/src/PlotHandler/TracePlotHandler.cpp @@ -54,8 +54,20 @@ std::string TracePlotHandler::getLastReaderError() const return traceReader->getLastErrorMsg(); } +void TracePlotHandler::setTriggerChannel(int32_t triggerChannel) +{ + traceSettings.triggerChannel = triggerChannel; +} + +int32_t TracePlotHandler::getTriggerChannel() const +{ + return traceSettings.triggerChannel; +} + void TracePlotHandler::dataHandler() { + uint32_t cnt = 0; + while (!done) { if (viewerState == state::RUN) @@ -94,6 +106,14 @@ void TracePlotHandler::dataHandler() else if (plot->getDomain() == Plot::Domain::ANALOG) newPoint = *(float*)&traces[i]; + if (traceTriggered == false && i == traceSettings.triggerChannel && newPoint > traceSettings.triggerLevel) + { + logger->warn("Trigger!"); + traceTriggered = true; + timestamp = 0; + cnt = 0; + } + /* thread-safe part */ std::lock_guard lock(*mtx); @@ -101,6 +121,12 @@ void TracePlotHandler::dataHandler() plot->addTimePoint(time); i++; } + if (traceTriggered && cnt++ >= (traceSettings.maxPoints * 0.9)) + { + logger->warn("After-trigger trace collcted. Stopping."); + viewerState.store(state::STOP); + stateChangeOrdered.store(true); + } } else std::this_thread::sleep_for(std::chrono::milliseconds(20)); @@ -121,7 +147,10 @@ void TracePlotHandler::dataHandler() viewerState = state::STOP; } else + { traceReader->stopAcqusition(); + traceTriggered = false; + } stateChangeOrdered = false; } } diff --git a/src/PlotHandler/TracePlotHandler.hpp b/src/PlotHandler/TracePlotHandler.hpp index c2c539e5..3ee3b83b 100644 --- a/src/PlotHandler/TracePlotHandler.hpp +++ b/src/PlotHandler/TracePlotHandler.hpp @@ -18,6 +18,8 @@ class TracePlotHandler : public PlotHandlerBase uint32_t tracePrescaler = 10; uint32_t maxPoints = 10000; uint32_t maxViewportPoints = 5000; + int32_t triggerChannel = -1; + double triggerLevel = 0.9; } Settings; TracePlotHandler(std::atomic& done, std::mutex* mtx, std::shared_ptr logger); @@ -30,6 +32,9 @@ class TracePlotHandler : public PlotHandlerBase std::string getLastReaderError() const; + void setTriggerChannel(int32_t triggerChannel); + int32_t getTriggerChannel() const; + std::map> traceVars; private: @@ -39,6 +44,7 @@ class TracePlotHandler : public PlotHandlerBase Settings traceSettings{}; std::shared_ptr traceDevice; std::unique_ptr traceReader; + bool traceTriggered = false; static constexpr uint32_t channels = 10; double time = 0.0; };