hi there!

I bought a Saleae logic pro 16 and followed all steps depicted in [1] to
obtain the FPGA firmware.
pulseview worked afterwards, but only for one capture. whenever I was
starting a secondary capture the device would blink red (3-7?-3) and
pulseview would get timed out with a LIBUSB error (see attached).
in order to recover I had to restart pulseview and plug in/out the logic
analyzer.

the attached patch fixes this behavior. please note that my code is just a
proof-of-concept, I'm willing to shape it to better fit your code.

best regards,
peter

[1] https://www.sigrok.org/wiki/Saleae_Logic_Pro_16
sr: [17:47.751296] session: Creating our own main context.
sr: [17:47.751325] session: Starting.
sr: [17:47.751330] hwdriver: saleae-logic-pro: Starting acquisition.
sr: [17:47.751335] saleae-logic-pro: 16 channels enabled (0xffff)
sr: [17:47.860859] saleae-logic-pro: random: 0x10 0xbf 0xab 0x44
sr: [17:47.969276] saleae-logic-pro: nonce: 0xc1 0xc1 0xc3 0x2f
sr: [17:48.077698] saleae-logic-pro: nonce: 0xd6 0x9e 0x15 0xce
sr: [17:48.187028] saleae-logic-pro: sig: 0x34 0x48 0xed 0xe7
sr: [17:48.187046] saleae-logic-pro: sig crc: 0x93 0x09
sr: [17:48.187051] saleae-logic-pro: Authenticate 0x9c42ebf5 -> 0x1d9f86c2
sr: [17:49.187500] saleae-logic-pro: Failed to receive response to request 
0x80: LIBUSB_ERROR_TIMEOUT.
sr: [17:50.187974] saleae-logic-pro: Failed to send request 0x80: 
LIBUSB_ERROR_TIMEOUT.
sr: [17:51.188450] saleae-logic-pro: Failed to send request 0x80: 
LIBUSB_ERROR_TIMEOUT.
sr: [17:52.188919] saleae-logic-pro: Failed to send request 0x01: 
LIBUSB_ERROR_TIMEOUT.
sr: [17:52.190356] saleae-logic-pro: Failed to submit transfer: 
LIBUSB_ERROR_NO_MEM.
sr: [17:52.320578] session: Could not start saleae-logic-pro device usb/2-2 
acquisition.
sr: [17:52.320597] hwdriver: saleae-logic-pro: Stopping acquisition.
sr: [17:53.321018] saleae-logic-pro: Failed to send request 0x80: 
LIBUSB_ERROR_TIMEOUT.
sr: [17:54.321461] saleae-logic-pro: Failed to send request 0x02: 
LIBUSB_ERROR_TIMEOUT.
sr: [17:55.321907] saleae-logic-pro: Failed to send request 0x81: 
LIBUSB_ERROR_TIMEOUT.
sr: [17:55.321936] session: bus: Received SR_DF_END packet.
sr: [17:55.321948] session: Cannot remove non-existing event source 
0x55714059d6d0.
Notifying user of session error: "generic/unspecified error"
sr: [19:58.143143] device: saleae-logic-pro: Closing device instance.
sr: [19:58.145089] usb: Closed USB device 2.3.
srd: Exiting libsigrokdecode.
sr: [19:58.176818] hwdriver: Cleaning up all drivers.
sr: [19:58.176846] usb: Closed USB device 2.3.

diff -upr pulseview-0.4.2.orig/pv/mainwindow.cpp pulseview-0.4.2/pv/mainwindow.cpp
--- pulseview-0.4.2.orig/pv/mainwindow.cpp	2020-03-31 23:41:18.000000000 +0300
+++ pulseview-0.4.2/pv/mainwindow.cpp	2022-08-10 22:18:30.200077311 +0300
@@ -721,6 +721,7 @@ void MainWindow::on_run_stop_clicked()
 	case Session::AwaitingTrigger:
 	case Session::Running:
 		session->stop_capture();
+		session->reselect_device(session->device());
 		break;
 	}
 }
diff -upr pulseview-0.4.2.orig/pv/session.cpp pulseview-0.4.2/pv/session.cpp
--- pulseview-0.4.2.orig/pv/session.cpp	2020-03-31 23:41:18.000000000 +0300
+++ pulseview-0.4.2/pv/session.cpp	2022-08-10 22:05:35.463871097 +0300
@@ -542,6 +542,78 @@ void Session::set_device(shared_ptr<devi
 	device_changed();
 }
 
+void Session::reselect_device(shared_ptr<devices::Device> device)
+{
+	try {
+		if (device)
+			reset_device(device);
+		else
+			set_default_device();
+	} catch (const QString &e) {
+		MainWindow::show_session_error(tr("Failed to select device"), e);
+	}
+}
+
+void Session::reset_device(shared_ptr<devices::Device> device)
+{
+	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. "Session 1") as the data is gone
+	name_ = default_name_;
+	name_changed();
+
+	// Remove all stored data and reset all views
+//	for (shared_ptr<views::ViewBase> view : views_) {
+//		view->clear_signals();
+#ifdef ENABLE_DECODE
+//		view->clear_decode_signals();
+#endif
+//		view->reset_view_state();
+//	}
+//	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_ = move(device);
+
+	try {
+		device_->open();
+	} catch (const QString &e) {
+		device_.reset();
+		MainWindow::show_session_error(tr("Failed to open device"), e);
+	}
+
+	if (device_) {
+		device_->session()->add_datafeed_callback([=]
+			(shared_ptr<sigrok::Device> device, shared_ptr<Packet> packet) {
+				data_feed_in(device, packet);
+			});
+
+		update_signals();
+	}
+
+	device_changed();
+}
+
 void Session::set_default_device()
 {
 	const list< shared_ptr<devices::HardwareDevice> > &devices =
diff -upr pulseview-0.4.2.orig/pv/session.hpp pulseview-0.4.2/pv/session.hpp
--- pulseview-0.4.2.orig/pv/session.hpp	2020-03-31 23:41:18.000000000 +0300
+++ pulseview-0.4.2/pv/session.hpp	2022-08-10 22:05:00.716424002 +0300
@@ -163,11 +163,13 @@ public:
 	 * Attempts to set device instance, may fall back to demo if needed
 	 */
 	void select_device(shared_ptr<devices::Device> device);
+	void reselect_device(shared_ptr<devices::Device> device);
 
 	/**
 	 * Sets device instance that will be used in the next capture session.
 	 */
 	void set_device(shared_ptr<devices::Device> device);
+	void reset_device(shared_ptr<devices::Device> device);
 
 	void set_default_device();
 
_______________________________________________
sigrok-devel mailing list
sigrok-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/sigrok-devel

Reply via email to