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.
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()
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);
break;
}
+ session_->remove_devices(); // Remove instance from previous run
session_->add_device(device_);
need_device = false;
}
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_;
};