- const shared_ptr<sigrok::Session> session =
- device_manager_.context()->load_session(name);
- set_device(session->devices()[0]);
+ assert(device);
+
+ // Ensure we are not capturing before setting the device
+ stop_capture();
+
+ if (device_)
+ device_->close();
+
+ device_.reset();
+
+ // Revert name back to default name (e.g. "Untitled-1") as the data is gone
+ name_ = default_name_;
+ name_changed();
+
+ // Remove all stored data
+ for (std::shared_ptr<pv::view::View> view : views_) {
+ view->clear_signals();
+#ifdef ENABLE_DECODE
+ view->clear_decode_traces();
+#endif
+ }
+ for (const shared_ptr<data::SignalData> d : all_signal_data_)
+ d->clear();
+ all_signal_data_.clear();
+ signalbases_.clear();
+ cur_logic_segment_.reset();
+
+ for (auto entry : cur_analog_segments_) {
+ shared_ptr<sigrok::Channel>(entry.first).reset();
+ shared_ptr<data::AnalogSegment>(entry.second).reset();
+ }
+
+ logic_data_.reset();
+
+ signals_changed();
+
+ device_ = std::move(device);
+
+ try {
+ device_->open();
+ } catch (const QString &e) {
+ device_.reset();
+ device_changed();
+ throw;
+ }
+
+ device_->session()->add_datafeed_callback([=]
+ (shared_ptr<sigrok::Device> device, shared_ptr<Packet> packet) {
+ data_feed_in(device, packet);
+ });
+
+ update_signals();
+ device_changed();