X-Git-Url: https://sigrok.org/gitweb/?p=pulseview.git;a=blobdiff_plain;f=pv%2Fdata%2Fmathsignal.cpp;h=24df0e71985b3688aa3d1953e323e13084d24d32;hp=31424e394967af336b97b4312695d50699c8bf00;hb=bee54d9ec103a35c86fa9e80fbdd2a07f8fb762d;hpb=5eb9d1c43e387cb399b3582388cff1ab38973c70 diff --git a/pv/data/mathsignal.cpp b/pv/data/mathsignal.cpp index 31424e39..24df0e71 100644 --- a/pv/data/mathsignal.cpp +++ b/pv/data/mathsignal.cpp @@ -23,6 +23,7 @@ #include "mathsignal.hpp" +#include #include #include #include @@ -90,7 +91,9 @@ MathSignal::MathSignal(pv::Session &session) : exprtk_parser_(nullptr), fnc_sig_sample_(nullptr) { - set_name(QString(tr("Math%1")).arg(session_.get_next_signal_index(MathChannel))); + uint32_t sig_idx = session_.get_next_signal_index(MathChannel); + set_name(QString(tr("Math%1")).arg(sig_idx)); + set_color(AnalogSignalColors[(sig_idx - 1) % countof(AnalogSignalColors)]); set_data(std::make_shared()); @@ -98,8 +101,6 @@ MathSignal::MathSignal(pv::Session &session) : this, SLOT(on_capture_state_changed(int))); connect(&session_, SIGNAL(data_received()), this, SLOT(on_data_received())); - - expression_ = "sin(2 * pi * t) + cos(t / 2 * pi)"; } MathSignal::~MathSignal() @@ -179,10 +180,18 @@ uint64_t MathSignal::get_working_sample_count(uint32_t segment_id) const const shared_ptr& sb = input_signal.second.sb; shared_ptr a = sb->analog_data(); - const uint32_t last_segment = (a->analog_segments().size() - 1); - if (segment_id > last_segment) + auto analog_segments = a->analog_segments(); + + if (analog_segments.size() == 0) { + result = 0; + continue; + } + + const uint32_t highest_segment_id = (analog_segments.size() - 1); + if (segment_id > highest_segment_id) continue; - const shared_ptr segment = a->analog_segments()[segment_id]; + + const shared_ptr segment = analog_segments.at(segment_id); result = min(result, (int64_t)segment->get_sample_count()); } } else @@ -192,6 +201,38 @@ uint64_t MathSignal::get_working_sample_count(uint32_t segment_id) const return result; } +void MathSignal::update_completeness(uint32_t segment_id) +{ + bool output_complete = true; + + if (input_signals_.size() > 0) { + for (auto input_signal : input_signals_) { + const shared_ptr& sb = input_signal.second.sb; + + shared_ptr a = sb->analog_data(); + auto analog_segments = a->analog_segments(); + + if (analog_segments.size() == 0) { + output_complete = false; + continue; + } + + const uint32_t highest_segment_id = (analog_segments.size() - 1); + if (segment_id > highest_segment_id) { + output_complete = false; + continue; + } + + const shared_ptr segment = analog_segments.at(segment_id); + if (!segment->is_complete()) + output_complete = false; + } + } + + if (output_complete) + analog_data()->analog_segments().at(segment_id)->set_complete(); +} + void MathSignal::reset_generation() { if (gen_thread_.joinable()) { @@ -271,7 +312,7 @@ void MathSignal::begin_generation() signal_data* sig_data = signal_from_name(unknown); const shared_ptr signal = (sig_data) ? (sig_data->sb) : nullptr; if (!signal || (!signal->analog_data())) { - set_error_message(QString(tr("%1 isn't a valid signal")).arg( + set_error_message(QString(tr("%1 isn't a valid analog signal")).arg( QString::fromStdString(unknown))); } else sig_data->ref = &(exprtk_unknown_symbol_table_->variable_ref(unknown)); @@ -373,9 +414,9 @@ void MathSignal::generation_proc() } if (samples_to_process == 0) { - if (segment_id < session_.get_highest_segment_id()) { - analog->analog_segments().back()->set_complete(); + update_completeness(segment_id); + if (segment_id < session_.get_highest_segment_id()) { // Process next segment segment_id++; @@ -405,8 +446,15 @@ signal_data* MathSignal::signal_from_name(const std::string& name) const QString sig_name = QString::fromStdString(name); for (const shared_ptr& sb : signalbases) - if (sb->name() == sig_name) + if (sb->name() == sig_name) { + if (!sb->analog_data()) + continue; + + connect(sb->analog_data().get(), SIGNAL(segment_completed()), + this, SLOT(on_data_received())); + return &(input_signals_.insert({name, signal_data(sb)}).first->second); + } } return nullptr; @@ -443,8 +491,12 @@ void MathSignal::on_capture_state_changed(int state) begin_generation(); if (state == Session::Stopped) { - shared_ptr analog = analog_data(); - analog->analog_segments().back()->set_complete(); + // If we have input signals, we use those as the indicators + if (input_signals_.empty()) { + shared_ptr analog = analog_data(); + if (!analog->analog_segments().empty()) + analog->analog_segments().back()->set_complete(); + } } }