From 4050bd7b6fcb69a8a05fb54478c68c6115464d4e Mon Sep 17 00:00:00 2001 From: dreamsourcelabTAI Date: Mon, 13 Mar 2023 18:49:00 +0800 Subject: [PATCH] fix: When a new device is connected, the current acquisition task is forced to end --- DSView/pv/mainwindow.cpp | 13 ++++++++++++- DSView/pv/sigsession.cpp | 18 +++++++++++------- libsigrok4DSL/libsigrok.h | 8 ++++---- 3 files changed, 27 insertions(+), 12 deletions(-) diff --git a/DSView/pv/mainwindow.cpp b/DSView/pv/mainwindow.cpp index df009756..7c629c39 100644 --- a/DSView/pv/mainwindow.cpp +++ b/DSView/pv/mainwindow.cpp @@ -554,6 +554,11 @@ namespace pv return; } + if (_session->is_working()){ + dsv_info("Save data: stop the current device."); + _session->stop_capture(); + } + _session->set_saving(true); StoreProgress *dlg = new StoreProgress(_session, this); @@ -564,6 +569,11 @@ namespace pv { using pv::dialogs::StoreProgress; + if (_session->is_working()){ + dsv_info("Export data: stop the current device."); + _session->stop_capture(); + } + StoreProgress *dlg = new StoreProgress(_session, this); dlg->export_run(); } @@ -1112,7 +1122,7 @@ namespace pv case Qt::Key_S: _sampling_bar->run_or_stop(); break; - + case Qt::Key_I: _sampling_bar->run_or_stop_instant(); break; @@ -1683,6 +1693,7 @@ namespace pv if (_session->get_device()->is_demo() == false) { QString msgText = L_S(STR_PAGE_MSG, S_ID(IDS_MSG_TO_SWITCH_DEVICE), "To switch the new device?"); + if (MsgBox::Confirm(msgText) == false){ _sampling_bar->update_device_list(); // Update the list only. return; diff --git a/DSView/pv/sigsession.cpp b/DSView/pv/sigsession.cpp index 0138374e..29f3ce39 100644 --- a/DSView/pv/sigsession.cpp +++ b/DSView/pv/sigsession.cpp @@ -169,7 +169,11 @@ namespace pv bool SigSession::set_default_device() { assert(!_is_saving); - assert(!_is_working); + + if (_is_working){ + dsv_info("The current device is working, now to stop it."); + stop_capture(); + } struct ds_device_base_info *array = NULL; int count = 0; @@ -1772,7 +1776,7 @@ namespace pv if (_capture_data->get_analog()->last_ended() == false) dsv_err("%s", "The collected data is error!"); - // trigger next collect + // trig next collect if (!_is_instant && is_repeat_mode() && _is_working && event == DS_EV_COLLECT_TASK_END) { _callback->trigger_message(DSV_MSG_TRIG_NEXT_COLLECT); @@ -1787,16 +1791,16 @@ namespace pv break; case DS_EV_NEW_DEVICE_ATTACH: + _callback->trigger_message(DSV_MSG_NEW_USB_DEVICE); + break; + case DS_EV_CURRENT_DEVICE_DETACH: { if (_is_working) stop_capture(); - if (DS_EV_NEW_DEVICE_ATTACH == event) - _callback->trigger_message(DSV_MSG_NEW_USB_DEVICE); - else - _callback->trigger_message(DSV_MSG_CURRENT_DEVICE_DETACHED); - } + _callback->trigger_message(DSV_MSG_CURRENT_DEVICE_DETACHED); + } break; case DS_EV_INACTIVE_DEVICE_DETACH: diff --git a/libsigrok4DSL/libsigrok.h b/libsigrok4DSL/libsigrok.h index b76bbbce..f347cd00 100644 --- a/libsigrok4DSL/libsigrok.h +++ b/libsigrok4DSL/libsigrok.h @@ -1285,11 +1285,11 @@ SR_API void ds_log_level(int level); #define DS_EV_COLLECT_TASK_END_BY_ERROR 106 -enum bbbb +enum DS_DEVICE_EVENT_TYPE { - DS_EV_NEW_DEVICE_ATTACH = 1, - DS_EV_CURRENT_DEVICE_DETACH = 2, - DS_EV_INACTIVE_DEVICE_DETACH = 3, + DS_EV_NEW_DEVICE_ATTACH = 1, + DS_EV_CURRENT_DEVICE_DETACH = 2, + DS_EV_INACTIVE_DEVICE_DETACH = 3, };