]> sigrok.org Git - pulseview.git/commitdiff
InputFile: Don't try to create device twice
authorSoeren Apel <redacted>
Fri, 8 Apr 2016 21:32:54 +0000 (23:32 +0200)
committerSoeren Apel <redacted>
Fri, 8 Apr 2016 21:34:45 +0000 (23:34 +0200)
The InputFile currently only keeps track of the
need for a device instance local to run().
This means that when calling run() a second time
(e.g. by clicking the "Run" button after loading
a file), the function will try to create the
device instance and add it to the session.
This fails as the first created instance is
still assigned to the session and thus the
session will reject adding another device.

Furthermore, simply clearing the session
devices isn't enough for proper operation.
The issue is that once a file's content has
been sent to an input module, the module is
not going to accept another file. It needs
to be reset to its initial state. To do this,
we create the input module instance every time
we want to read the file.

pv/devices/inputfile.cpp
pv/devices/inputfile.hpp

index 22c9b1c8297e4e3d8d71eb73d925c122fc67c8f9..935b0c47bdf6e41714bf889a530af61513ccb420 100644 (file)
@@ -36,19 +36,18 @@ InputFile::InputFile(const std::shared_ptr<sigrok::Context> &context,
        const std::map<std::string, Glib::VariantBase> &options) :
        File(file_name),
        context_(context),
-       input_(format->create_input(options)),
+       format_(format),
+       options_(options),
        interrupt_(false)
 {
-       if (!input_)
-               throw QString("Failed to create input");
 }
 
 void InputFile::open()
 {
        if (session_)
                close();
-
-       session_ = context_->create_session();
+       else
+               session_ = context_->create_session();
 }
 
 void InputFile::close()
@@ -67,7 +66,11 @@ void InputFile::run()
        bool need_device = true;
 
        assert(session_);
-       assert(input_);
+
+       input_ = format_->create_input(options_);
+
+       if (!input_)
+               throw QString("Failed to create input");
 
        interrupt_ = false;
        std::ifstream f(file_name_, std::ios::binary);
@@ -86,6 +89,7 @@ void InputFile::run()
                                break;
                        }
 
+                       session_->remove_devices(); // Remove instance from previous run
                        session_->add_device(device_);
                        need_device = false;
                }
index 9b9aee88dcbad288f12642397a6b6921d9e83a29..02d4417c99e8af4bb95260e082e543b354bdccdb 100644 (file)
@@ -53,7 +53,9 @@ public:
 
 private:
        const std::shared_ptr<sigrok::Context> context_;
-       const std::shared_ptr<sigrok::Input> input_;
+       const std::shared_ptr<sigrok::InputFormat> format_;
+       const std::map<std::string, Glib::VariantBase> options_;
+       std::shared_ptr<sigrok::Input> input_;
 
        std::atomic<bool> interrupt_;
 };