]> sigrok.org Git - pulseview.git/blobdiff - pv/data/decodesignal.cpp
Apply option changes immediately, not on decode stack rebuild
[pulseview.git] / pv / data / decodesignal.cpp
index 95ea45a4e0a707f62fd2b8e6ba259dc4ebd5fc52..1e0053910a9f3a68e3e948c70a817127f5c553a0 100644 (file)
@@ -65,7 +65,7 @@ DecodeSignal::DecodeSignal(pv::Session &session) :
 
 DecodeSignal::~DecodeSignal()
 {
-       reset_decode();
+       reset_decode(true);
 }
 
 const vector< shared_ptr<Decoder> >& DecodeSignal::decoder_stack() const
@@ -130,9 +130,9 @@ bool DecodeSignal::toggle_decoder_visibility(int index)
        return state;
 }
 
-void DecodeSignal::reset_decode()
+void DecodeSignal::reset_decode(bool shutting_down)
 {
-       if (stack_config_changed_)
+       if (stack_config_changed_ || shutting_down)
                stop_srd_session();
        else
                terminate_srd_session();
@@ -156,7 +156,10 @@ void DecodeSignal::reset_decode()
        logic_mux_data_.reset();
        logic_mux_data_invalid_ = true;
 
-       error_message_ = QString();
+       if (!error_message_.isEmpty()) {
+               error_message_ = QString();
+               qDebug().noquote().nospace() << name() << ": Error cleared";
+       }
 
        decode_reset();
 }
@@ -178,14 +181,14 @@ void DecodeSignal::begin_decode()
        reset_decode();
 
        if (stack_.size() == 0) {
-               error_message_ = tr("No decoders");
+               set_error_message(tr("No decoders"));
                return;
        }
 
        assert(channels_.size() > 0);
 
        if (get_assigned_signal_count() == 0) {
-               error_message_ = tr("There are no channels assigned to this decoder");
+               set_error_message(tr("There are no channels assigned to this decoder"));
                return;
        }
 
@@ -199,8 +202,8 @@ void DecodeSignal::begin_decode()
        // Check that all decoders have the required channels
        for (const shared_ptr<decode::Decoder> &dec : stack_)
                if (!dec->have_required_channels()) {
-                       error_message_ = tr("One or more required channels "
-                               "have not been specified");
+                       set_error_message(tr("One or more required channels "
+                               "have not been specified"));
                        return;
                }
 
@@ -238,7 +241,7 @@ void DecodeSignal::begin_decode()
        connect_input_notifiers();
 
        if (get_input_segment_count() == 0) {
-               error_message_ = tr("No input data");
+               set_error_message(tr("No input data"));
                return;
        }
 
@@ -582,6 +585,12 @@ void DecodeSignal::restore_settings(QSettings &settings)
        begin_decode();
 }
 
+void DecodeSignal::set_error_message(QString msg)
+{
+       error_message_ = msg;
+       qDebug().noquote().nospace() << name() << ": " << msg;
+}
+
 uint32_t DecodeSignal::get_input_segment_count() const
 {
        uint64_t count = std::numeric_limits<uint64_t>::max();
@@ -895,7 +904,7 @@ void DecodeSignal::decode_data(
 
                if (srd_session_send(srd_session_, i, chunk_end, chunk,
                                data_size, unit_size) != SRD_OK) {
-                       error_message_ = tr("Decoder reported an error");
+                       set_error_message(tr("Decoder reported an error"));
                        delete[] chunk;
                        break;
                }
@@ -994,6 +1003,8 @@ void DecodeSignal::start_srd_session()
 {
        uint64_t samplerate;
 
+       // If there were stack changes, the session has been destroyed by now, so if
+       // it hasn't been destroyed, we can just reset and re-use it
        if (srd_session_) {
                // When a decoder stack was created before, re-use it
                // for the next stream of input data, after terminating
@@ -1022,7 +1033,7 @@ void DecodeSignal::start_srd_session()
                srd_decoder_inst *const di = dec->create_decoder_inst(srd_session_);
 
                if (!di) {
-                       error_message_ = tr("Failed to create decoder instance");
+                       set_error_message(tr("Failed to create decoder instance"));
                        srd_session_destroy(srd_session_);
                        srd_session_ = nullptr;
                        return;
@@ -1066,6 +1077,10 @@ void DecodeSignal::stop_srd_session()
                // Destroy the session
                srd_session_destroy(srd_session_);
                srd_session_ = nullptr;
+
+               // Mark the decoder instances as non-existant since they were deleted
+               for (const shared_ptr<decode::Decoder> &dec : stack_)
+                       dec->invalidate_decoder_inst();
        }
 }