From 770023832198f5c109350165c040e4ddb538acd9 Mon Sep 17 00:00:00 2001 From: dreamsourcelabTAI Date: Thu, 18 May 2023 19:08:17 +0800 Subject: [PATCH 1/5] Apply the decoder setting from dialog after translate language --- DSView/pv/dialogs/decoderoptionsdlg.cpp | 2 +- DSView/pv/view/decodetrace.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/DSView/pv/dialogs/decoderoptionsdlg.cpp b/DSView/pv/dialogs/decoderoptionsdlg.cpp index a1642085..b8597b4d 100644 --- a/DSView/pv/dialogs/decoderoptionsdlg.cpp +++ b/DSView/pv/dialogs/decoderoptionsdlg.cpp @@ -517,7 +517,7 @@ void DecoderOptionsDlg::on_trans_pramas() AppConfig::Instance()._appOptions.transDecoderDlg = ck_box->isChecked(); AppConfig::Instance().SaveApp(); _is_reload_form = true; - this->close(); + this->accept(); } }//dialogs diff --git a/DSView/pv/view/decodetrace.cpp b/DSView/pv/view/decodetrace.cpp index a27c9b4a..90f44af4 100644 --- a/DSView/pv/view/decodetrace.cpp +++ b/DSView/pv/view/decodetrace.cpp @@ -697,7 +697,7 @@ bool DecodeTrace::create_popup(bool isnew) dlg.get_cursor_range(_decode_cursor1, _decode_cursor2); } - if (QDialog::Accepted == dlg_ret || dlg.is_reload_form() == false){ + if (QDialog::Rejected == dlg_ret || dlg.is_reload_form() == false){ break; } } From e26968d14bed6ed496e5ca0f7247208ebc14395d Mon Sep 17 00:00:00 2001 From: dreamsourcelabTAI Date: Fri, 19 May 2023 14:37:24 +0800 Subject: [PATCH 2/5] Replace the message box call type --- DSView/pv/dialogs/calibration.cpp | 12 ++-- DSView/pv/dialogs/deviceoptions.cpp | 25 +++----- DSView/pv/dock/dsotriggerdock.cpp | 56 +++++------------ DSView/pv/dock/measuredock.cpp | 17 ++---- DSView/pv/dock/searchdock.cpp | 53 +++++----------- DSView/pv/dock/triggerdock.cpp | 21 +++---- DSView/pv/interface/icallbacks.h | 4 +- DSView/pv/mainwindow.cpp | 94 +++++++++++++++++------------ DSView/pv/mainwindow.h | 16 ++--- DSView/pv/sigsession.cpp | 29 ++------- DSView/pv/sigsession.h | 10 ++- DSView/pv/toolbars/samplingbar.cpp | 22 ++----- DSView/pv/ui/msgbox.cpp | 47 ++++++++++++++- DSView/pv/ui/msgbox.h | 11 ++++ lang/cn/dlg.json | 10 +-- lang/cn/msg.json | 4 +- lang/en/dlg.json | 2 +- lang/en/msg.json | 4 +- libsigrok4DSL/hardware/demo/demo.c | 2 +- 19 files changed, 205 insertions(+), 234 deletions(-) diff --git a/DSView/pv/dialogs/calibration.cpp b/DSView/pv/dialogs/calibration.cpp index 41935b4a..e03c88f1 100644 --- a/DSView/pv/dialogs/calibration.cpp +++ b/DSView/pv/dialogs/calibration.cpp @@ -33,8 +33,8 @@ #include "../dsvdef.h" #include "../appcontrol.h" #include "../sigsession.h" - #include "../ui/langresource.h" +#include "../ui/msgbox.h" using namespace std; @@ -383,14 +383,10 @@ void Calibration::reload_value() void Calibration::on_reset() { + QString strMsg(L_S(STR_PAGE_MSG, S_ID(IDS_MSG_SET_DEF_CAL_SETTING), + "All calibration settings will become the defualt values!")); - dialogs::DSMessageBox msg(this); - msg.mBox()->setText(L_S(STR_PAGE_MSG, S_ID(IDS_MSG_ATTENTION), "Attention")); - msg.mBox()->setInformativeText(L_S(STR_PAGE_MSG, S_ID(IDS_MSG_SET_DEF_CAL_SETTING), "All calibration settings will become the defualt values!")); - msg.mBox()->addButton(L_S(STR_PAGE_MSG, S_ID(IDS_MSG_OK), "Ok"), QMessageBox::AcceptRole); - msg.mBox()->addButton(L_S(STR_PAGE_MSG, S_ID(IDS_MSG_CANCEL), "Cancel"), QMessageBox::RejectRole); - msg.mBox()->setIcon(QMessageBox::Warning); - if (msg.exec()) { + if (MsgBox::Confirm(strMsg)) { _device_agent->set_config(NULL, NULL, SR_CONF_ZERO_DEFAULT, g_variant_new_boolean(true)); reload_value(); diff --git a/DSView/pv/dialogs/deviceoptions.cpp b/DSView/pv/dialogs/deviceoptions.cpp index b94d075f..24d000da 100644 --- a/DSView/pv/dialogs/deviceoptions.cpp +++ b/DSView/pv/dialogs/deviceoptions.cpp @@ -212,12 +212,8 @@ void DeviceOptions::accept() QDialog::accept(); } else { - dialogs::DSMessageBox msg(this); - msg.mBox()->setText(L_S(STR_PAGE_MSG, S_ID(IDS_MSG_ATTENTION), "Attention")); - msg.mBox()->setInformativeText(L_S(STR_PAGE_MSG, S_ID(IDS_MSG_ALL_CHANNEL_DISABLE), "All channel disabled! Please enable at least one channel.")); - msg.mBox()->addButton(L_S(STR_PAGE_MSG, S_ID(IDS_MSG_OK), "Ok"), QMessageBox::AcceptRole); - msg.mBox()->setIcon(QMessageBox::Warning); - msg.exec(); + QString strMsg(L_S(STR_PAGE_MSG, S_ID(IDS_MSG_ALL_CHANNEL_DISABLE), "All channel disabled! Please enable at least one channel.")); + MsgBox::Show(strMsg); } } @@ -447,17 +443,14 @@ void DeviceOptions::zero_adj() using namespace Qt; QDialog::accept(); - dialogs::DSMessageBox msg(this); - msg.mBox()->setText(L_S(STR_PAGE_MSG, S_ID(IDS_MSG_INFORMATION), "Information")); - msg.mBox()->setInformativeText(L_S(STR_PAGE_MSG, S_ID(IDS_MSG_AUTO_CALIB_START), - "Auto Calibration program will be started. Don't connect any probes. It can take a while!")); - msg.mBox()->addButton(L_S(STR_PAGE_MSG, S_ID(IDS_MSG_OK), "Ok"), QMessageBox::AcceptRole); - msg.mBox()->addButton(L_S(STR_PAGE_MSG, S_ID(IDS_MSG_CANCEL), "Cancel") ,QMessageBox::RejectRole); - msg.mBox()->setIcon(QMessageBox::Information); + QString strMsg(L_S(STR_PAGE_MSG, S_ID(IDS_MSG_AUTO_CALIB_START), + "Auto Calibration program will be started. Don't connect any probes. \nIt can take a while!")); + bool bRet = MsgBox::Confirm(strMsg); - if (msg.exec()) { + if (bRet) { _device_agent->set_config(NULL, NULL, SR_CONF_ZERO, g_variant_new_boolean(true)); - } else { + } + else { _device_agent->set_config(NULL, NULL, SR_CONF_ZERO, g_variant_new_boolean(false)); } } @@ -580,7 +573,7 @@ void DeviceOptions::channel_checkbox_clicked(QCheckBox *sc) if (cur_ch_num > vld_ch_num) { QString msg_str(L_S(STR_PAGE_MSG, S_ID(IDS_MSG_MAX_CHANNEL_COUNT_WARNING), "max count of channels!")); msg_str = msg_str.replace("{0}", QString::number(vld_ch_num) ); - MsgBox::Show("", msg_str); + MsgBox::Show(msg_str); sc->setChecked(false); } diff --git a/DSView/pv/dock/dsotriggerdock.cpp b/DSView/pv/dock/dsotriggerdock.cpp index e58cb446..e6974e72 100644 --- a/DSView/pv/dock/dsotriggerdock.cpp +++ b/DSView/pv/dock/dsotriggerdock.cpp @@ -233,16 +233,12 @@ void DsoTriggerDock::pos_changed(int pos) ret = _session->get_device()->set_config(NULL, NULL, SR_CONF_HORIZ_TRIGGERPOS, g_variant_new_byte((uint8_t)pos)); - if (!ret) { - dialogs::DSMessageBox msg(this); - msg.mBox()->setText(L_S(STR_PAGE_MSG, S_ID(IDS_MSG_TRI_SET_ISSUE), "Trigger Setting Issue")); - msg.mBox()->setInformativeText(L_S(STR_PAGE_MSG, S_ID(IDS_MSG_CHANGE_HOR_TRI_POS_FAIL), - "Change horiz trigger position failed!")); - msg.mBox()->setStandardButtons(QMessageBox::Ok); - msg.mBox()->setIcon(QMessageBox::Warning); - + if (!ret) { if (_session->get_device()->is_hardware()){ - msg.exec(); + QString strMsg(L_S(STR_PAGE_MSG, S_ID(IDS_MSG_CHANGE_HOR_TRI_POS_FAIL), + "Change horiz trigger position failed!")); + + MsgBox::Show(strMsg); } return; @@ -267,13 +263,9 @@ void DsoTriggerDock::hold_changed(int hold) g_variant_new_uint64(holdoff)); if (!ret) { - dialogs::DSMessageBox msg(this); - msg.mBox()->setText(L_S(STR_PAGE_MSG, S_ID(IDS_MSG_TRI_SET_ISSUE), "Trigger Setting Issue")); - msg.mBox()->setInformativeText(L_S(STR_PAGE_MSG, S_ID(IDS_MSG_CHANGE_TRI_HOLDOFF_TIME_FAIL), + QString strMsg(L_S(STR_PAGE_MSG, S_ID(IDS_MSG_CHANGE_TRI_HOLDOFF_TIME_FAIL), "Change trigger hold off time failed!")); - msg.mBox()->setStandardButtons(QMessageBox::Ok); - msg.mBox()->setIcon(QMessageBox::Warning); - msg.exec(); + MsgBox::Show(strMsg); } } @@ -284,13 +276,9 @@ void DsoTriggerDock::margin_changed(int margin) SR_CONF_TRIGGER_MARGIN, g_variant_new_byte(margin)); if (!ret) { - dialogs::DSMessageBox msg(this); - msg.mBox()->setText((L_S(STR_PAGE_MSG, S_ID(IDS_MSG_TRI_SET_ISSUE), "Trigger Setting Issue"))); - msg.mBox()->setInformativeText(L_S(STR_PAGE_MSG, S_ID(IDS_MSG_CHANGE_SENSITIVITY_FAIL), + QString strMsg(L_S(STR_PAGE_MSG, S_ID(IDS_MSG_CHANGE_SENSITIVITY_FAIL), "Change trigger value sensitivity failed!")); - msg.mBox()->setStandardButtons(QMessageBox::Ok); - msg.mBox()->setIcon(QMessageBox::Warning); - msg.exec(); + MsgBox::Show(strMsg); } } @@ -303,7 +291,7 @@ void DsoTriggerDock::source_changed() _ch0o1_radioButton->setChecked(false); QString msg(L_S(STR_PAGE_MSG, S_ID(IDS_MSG_DISABLED_CHANNEL_TRIG), "Disabled channels cannot be used for triggering!")); - MsgBox::Show("", msg); + MsgBox::Show(msg); } int id = _source_group->checkedId(); @@ -315,13 +303,9 @@ void DsoTriggerDock::source_changed() SR_CONF_TRIGGER_SOURCE, g_variant_new_byte(id)); if (!ret) { - dialogs::DSMessageBox msg(this); - msg.mBox()->setText(L_S(STR_PAGE_MSG, S_ID(IDS_MSG_TRI_SET_ISSUE), "Trigger Setting Issue")); - msg.mBox()->setInformativeText(L_S(STR_PAGE_MSG, S_ID(IDS_MSG_CHANGE_SOURCE_FAIL), + QString strMsg(L_S(STR_PAGE_MSG, S_ID(IDS_MSG_CHANGE_SOURCE_FAIL), "Change trigger source failed!")); - msg.mBox()->setStandardButtons(QMessageBox::Ok); - msg.mBox()->setIcon(QMessageBox::Warning); - msg.exec(); + MsgBox::Show(strMsg); } } @@ -370,13 +354,9 @@ void DsoTriggerDock::channel_changed(int ch) SR_CONF_TRIGGER_CHANNEL, g_variant_new_byte(_channel_comboBox->currentData().toInt())); if (!ret) { - dialogs::DSMessageBox msg(this); - msg.mBox()->setText(L_S(STR_PAGE_MSG, S_ID(IDS_MSG_TRI_SET_ISSUE), "Trigger Setting Issue")); - msg.mBox()->setInformativeText(L_S(STR_PAGE_MSG, S_ID(IDS_MSG_CHANGE_CHANNEL_FAIL), + QString strMsg(L_S(STR_PAGE_MSG, S_ID(IDS_MSG_CHANGE_CHANNEL_FAIL), "Change trigger channel failed!")); - msg.mBox()->setStandardButtons(QMessageBox::Ok); - msg.mBox()->setIcon(QMessageBox::Warning); - msg.exec(); + MsgBox::Show(strMsg); } } @@ -389,13 +369,9 @@ void DsoTriggerDock::type_changed() SR_CONF_TRIGGER_SLOPE, g_variant_new_byte(id)); if (!ret) { - dialogs::DSMessageBox msg(this); - msg.mBox()->setText(L_S(STR_PAGE_MSG, S_ID(IDS_MSG_TRI_SET_ISSUE), "Trigger Setting Issue")); - msg.mBox()->setInformativeText(L_S(STR_PAGE_MSG, S_ID(IDS_MSG_CHANGE_TYPE_FAIL), + QString strMsg(L_S(STR_PAGE_MSG, S_ID(IDS_MSG_CHANGE_TYPE_FAIL), "Change trigger type failed!")); - msg.mBox()->setStandardButtons(QMessageBox::Ok); - msg.mBox()->setIcon(QMessageBox::Warning); - msg.exec(); + MsgBox::Show(strMsg); } } diff --git a/DSView/pv/dock/measuredock.cpp b/DSView/pv/dock/measuredock.cpp index 427067e0..51c4101c 100644 --- a/DSView/pv/dock/measuredock.cpp +++ b/DSView/pv/dock/measuredock.cpp @@ -33,13 +33,11 @@ #include "../data/snapshot.h" #include "../dialogs/dsdialog.h" #include "../dialogs/dsmessagebox.h" - +#include "../config/appconfig.h" +#include "../ui/langresource.h" +#include "../ui/msgbox.h" #include #include -#include -#include "../config/appconfig.h" - -#include "../ui/langresource.h" using namespace boost; @@ -477,14 +475,9 @@ void MeasureDock::show_all_coursor() auto &cursor_list = _view.get_cursorList(); if (cursor_list.empty()) { - dialogs::DSMessageBox msg(this); - msg.mBox()->setText(L_S(STR_PAGE_MSG, S_ID(IDS_MSG_INFORMATION), "Information")); - msg.mBox()->setInformativeText(L_S(STR_PAGE_MSG, S_ID(IDS_MSG_PLEASE_INSERT_CURSOR), + QString strMsg(L_S(STR_PAGE_MSG, S_ID(IDS_MSG_PLEASE_INSERT_CURSOR), "Please insert cursor before using cursor measure.")); - msg.mBox()->addButton(L_S(STR_PAGE_MSG, S_ID(IDS_MSG_OK), "Ok"), QMessageBox::AcceptRole); - msg.mBox()->setIcon(QMessageBox::Information); - msg.exec(); - + MsgBox::Show(strMsg); return; } diff --git a/DSView/pv/dock/searchdock.cpp b/DSView/pv/dock/searchdock.cpp index 2fea93fe..4be98f2f 100644 --- a/DSView/pv/dock/searchdock.cpp +++ b/DSView/pv/dock/searchdock.cpp @@ -39,8 +39,8 @@ #include #include #include "../config/appconfig.h" - #include "../ui/langresource.h" +#include "../ui/msgbox.h" namespace pv { namespace dock { @@ -131,12 +131,8 @@ void SearchDock::on_previous() const auto logic_snapshot = dynamic_cast(snapshot); if (logic_snapshot == NULL || logic_snapshot->empty()) { - dialogs::DSMessageBox msg(this); - msg.mBox()->setText(L_S(STR_PAGE_MSG, S_ID(IDS_MSG_SEARCH), "Search")); - msg.mBox()->setInformativeText(L_S(STR_PAGE_MSG, S_ID(IDS_MSG_NO_SAMPLE_DATA), "No Sample data!")); - msg.mBox()->setStandardButtons(QMessageBox::Ok); - msg.mBox()->setIcon(QMessageBox::Warning); - msg.exec(); + QString strMsg(L_S(STR_PAGE_MSG, S_ID(IDS_MSG_NO_SAMPLE_DATA), "No Sample data!")); + MsgBox::Show(strMsg); return; } @@ -144,14 +140,11 @@ void SearchDock::on_previous() last_pos = _view.get_search_pos(); last_hit = _view.get_search_hit(); if (last_pos == 0) { - dialogs::DSMessageBox msg(this); - msg.mBox()->setText(L_S(STR_PAGE_MSG, S_ID(IDS_MSG_SEARCH), "Search")); - msg.mBox()->setInformativeText(L_S(STR_PAGE_MSG, S_ID(IDS_MSG_SEARCH_AT_START), "Search cursor at the start position!")); - msg.mBox()->setStandardButtons(QMessageBox::Ok); - msg.mBox()->setIcon(QMessageBox::Warning); - msg.exec(); + QString strMsg(L_S(STR_PAGE_MSG, S_ID(IDS_MSG_SEARCH_AT_START), "Search cursor at the start position!")); + MsgBox::Show(strMsg); return; - } else { + } + else { QFuture future; future = QtConcurrent::run([&]{ last_pos -= last_hit; @@ -171,12 +164,8 @@ void SearchDock::on_previous() dlg.exec(); if (!ret) { - dialogs::DSMessageBox msg(this); - msg.mBox()->setText(L_S(STR_PAGE_MSG, S_ID(IDS_MSG_SEARCH), "Search")); - msg.mBox()->setInformativeText(L_S(STR_PAGE_MSG, S_ID(IDS_MSG_PATTERN_NOT_FOUND), "Pattern not found!")); - msg.mBox()->setStandardButtons(QMessageBox::Ok); - msg.mBox()->setIcon(QMessageBox::Warning); - msg.exec(); + QString strMsg(L_S(STR_PAGE_MSG, S_ID(IDS_MSG_PATTERN_NOT_FOUND), "Pattern not found!")); + MsgBox::Show(strMsg); return; } else { _view.set_search_pos(last_pos, true); @@ -193,24 +182,16 @@ void SearchDock::on_next() const auto logic_snapshot = dynamic_cast(snapshot); if (logic_snapshot == NULL || logic_snapshot->empty()) { - dialogs::DSMessageBox msg(this); - msg.mBox()->setText(L_S(STR_PAGE_MSG, S_ID(IDS_MSG_SEARCH), "Search")); - msg.mBox()->setInformativeText(L_S(STR_PAGE_MSG, S_ID(IDS_MSG_NO_SAMPLE_DATA), "No Sample data!")); - msg.mBox()->setStandardButtons(QMessageBox::Ok); - msg.mBox()->setIcon(QMessageBox::Warning); - msg.exec(); + QString strMsg(L_S(STR_PAGE_MSG, S_ID(IDS_MSG_NO_SAMPLE_DATA), "No Sample data!")); + MsgBox::Show(strMsg); return; } const int64_t end = logic_snapshot->get_sample_count() - 1; last_pos = _view.get_search_pos() + _view.get_search_hit(); if (last_pos >= end) { - dialogs::DSMessageBox msg(this); - msg.mBox()->setText(L_S(STR_PAGE_MSG, S_ID(IDS_MSG_SEARCH), "Search")); - msg.mBox()->setInformativeText(L_S(STR_PAGE_MSG, S_ID(IDS_MSG_SEARCH_AT_END), "Search cursor at the end position!")); - msg.mBox()->setStandardButtons(QMessageBox::Ok); - msg.mBox()->setIcon(QMessageBox::Warning); - msg.exec(); + QString strMsg(L_S(STR_PAGE_MSG, S_ID(IDS_MSG_SEARCH_AT_END), "Search cursor at the end position!")); + MsgBox::Show(strMsg); return; } else { QFuture future; @@ -231,12 +212,8 @@ void SearchDock::on_next() dlg.exec(); if (!ret) { - dialogs::DSMessageBox msg(this); - msg.mBox()->setText(L_S(STR_PAGE_MSG, S_ID(IDS_MSG_SEARCH), "Search")); - msg.mBox()->setInformativeText(L_S(STR_PAGE_MSG, S_ID(IDS_MSG_PATTERN_NOT_FOUND), "Pattern not found!")); - msg.mBox()->setStandardButtons(QMessageBox::Ok); - msg.mBox()->setIcon(QMessageBox::Warning); - msg.exec(); + QString strMsg(L_S(STR_PAGE_MSG, S_ID(IDS_MSG_PATTERN_NOT_FOUND), "Pattern not found!")); + MsgBox::Show(strMsg); return; } else { _view.set_search_pos(last_pos, true); diff --git a/DSView/pv/dock/triggerdock.cpp b/DSView/pv/dock/triggerdock.cpp index 85196388..c1e0a6f1 100644 --- a/DSView/pv/dock/triggerdock.cpp +++ b/DSView/pv/dock/triggerdock.cpp @@ -34,12 +34,13 @@ #include #include #include +#include +#include #include "../config/appconfig.h" #include "../deviceagent.h" #include "../view/logicsignal.h" #include "../ui/langresource.h" -#include -#include +#include "../ui/msgbox.h" namespace pv { namespace dock { @@ -199,13 +200,9 @@ void TriggerDock::adv_trigger() } if (stream) { - dialogs::DSMessageBox msg(this); - msg.mBox()->setText(L_S(STR_PAGE_MSG, S_ID(IDS_MSG_TRIGGER), "Trigger")); - msg.mBox()->setInformativeText(L_S(STR_PAGE_MSG, S_ID(IDS_MSG_STREAM_NO_AD_TRIGGER), + QString strMsg(L_S(STR_PAGE_MSG, S_ID(IDS_MSG_STREAM_NO_AD_TRIGGER), "Stream Mode Don't Support Advanced Trigger!")); - msg.mBox()->setStandardButtons(QMessageBox::Ok); - msg.mBox()->setIcon(QMessageBox::Warning); - msg.exec(); + MsgBox::Show(strMsg); _simple_radioButton->setChecked(true); } else { @@ -213,13 +210,9 @@ void TriggerDock::adv_trigger() } } else if (_session->get_device()->is_file() == false){ - dialogs::DSMessageBox msg(this); - msg.mBox()->setText(L_S(STR_PAGE_MSG, S_ID(IDS_MSG_TRIGGER), "Trigger")); - msg.mBox()->setInformativeText(L_S(STR_PAGE_MSG, S_ID(IDS_MSG_AD_TRIGGER_NEED_HARDWARE), + QString strMsg(L_S(STR_PAGE_MSG, S_ID(IDS_MSG_AD_TRIGGER_NEED_HARDWARE), "Advanced Trigger need DSLogic Hardware Support!")); - msg.mBox()->setStandardButtons(QMessageBox::Ok); - msg.mBox()->setIcon(QMessageBox::Warning); - msg.exec(); + MsgBox::Show(strMsg); _simple_radioButton->setChecked(true); } } diff --git a/DSView/pv/interface/icallbacks.h b/DSView/pv/interface/icallbacks.h index e6f4fd10..9bc0d655 100644 --- a/DSView/pv/interface/icallbacks.h +++ b/DSView/pv/interface/icallbacks.h @@ -26,8 +26,7 @@ class ISessionCallback { -public: - virtual void show_error(QString error)=0; +public: virtual void session_error()=0; virtual void session_save()=0; virtual void data_updated()=0; @@ -47,6 +46,7 @@ public: virtual void receive_header()=0; virtual void trigger_message(int msg)=0; + virtual void delay_prop_msg(QString strMsg)=0; }; class ISessionDataGetter diff --git a/DSView/pv/mainwindow.cpp b/DSView/pv/mainwindow.cpp index 64b54cf2..24127fa9 100644 --- a/DSView/pv/mainwindow.cpp +++ b/DSView/pv/mainwindow.cpp @@ -42,6 +42,7 @@ #include #include #include +#include #include @@ -97,6 +98,7 @@ #include "ui/langresource.h" #include "mainframe.h" #include "dsvdef.h" +#include namespace pv { @@ -283,6 +285,8 @@ namespace pv // connect(_dso_trigger_widget, SIGNAL(set_trig_pos(int)), _view, SLOT(set_trig_pos(int))); + _delay_prop_msg_timer.SetCallback(std::bind(&MainWindow::on_delay_prop_msg, this)); + _logo_bar->set_mainform_callback(this); // Try load from file. @@ -329,17 +333,14 @@ namespace pv _session->set_file(file_name); } catch (QString e) - { - show_error(L_S(STR_PAGE_MSG, S_ID(IDS_MSG_FAIL_TO_LOAD), "Failed to load ") + file_name); + { + QString strMsg(L_S(STR_PAGE_MSG, S_ID(IDS_MSG_FAIL_TO_LOAD), "Failed to load ")); + strMsg += file_name; + MsgBox::Show(strMsg); _session->set_default_device(); } } - void MainWindow::show_error(QString error) - { - MsgBox::Show(NULL, error.toStdString().c_str(), this); - } - void MainWindow::session_error() { _event.session_error(); @@ -387,21 +388,10 @@ namespace pv break; } - dialogs::DSMessageBox msg(this); - - connect(_session->device_event_object(), SIGNAL(device_updated()), &msg, SLOT(accept())); - - QFont font("Monaco"); - font.setStyleHint(QFont::Monospace); - font.setFixedPitch(true); - msg.mBox()->setFont(font); - - msg.mBox()->setText(title); - msg.mBox()->setInformativeText(details); - msg.mBox()->setStandardButtons(QMessageBox::Ok); - msg.mBox()->setIcon(QMessageBox::Warning); - msg.exec(); - + dialogs::DSMessageBox *box = NULL; + MsgBox::Show("", title, details, this, &box, false); + connect(_session->device_event_object(), SIGNAL(device_updated()), box, SLOT(accept())); + box->exec(); _session->clear_error(); } @@ -1483,9 +1473,11 @@ namespace pv dsv_info("The cable's USB port version: %d.0", cable_ver); - if (usb30_support && usb_speed == LIBUSB_SPEED_HIGH) - show_error(L_S(STR_PAGE_DLG, S_ID(IDS_DLG_CHECK_USB_SPEED_ERROR), - "Plug it into a USB 2.0 port will seriously affect its performance.\nPlease replug it into a USB 3.0 port.")); + if (usb30_support && usb_speed == LIBUSB_SPEED_HIGH){ + QString str_err(L_S(STR_PAGE_DLG, S_ID(IDS_DLG_CHECK_USB_SPEED_ERROR), + "Plug the device into a USB 2.0 port will seriously affect its performance.\nPlease replug it into a USB 3.0 port.")); + delay_prop_msg(str_err); + } } } } @@ -1558,8 +1550,9 @@ namespace pv g_variant_unref(gvar); if (version == 1) { - show_error(L_S(STR_PAGE_DLG, S_ID(IDS_DLG_CHECK_SESSION_FILE_VERSION_ERROR), + QString strMsg(L_S(STR_PAGE_DLG, S_ID(IDS_DLG_CHECK_SESSION_FILE_VERSION_ERROR), "Current loading file has an old format. \nThis will lead to a slow loading speed. \nPlease resave it after loaded.")); + MsgBox::Show(strMsg); } } } @@ -1723,18 +1716,17 @@ namespace pv break; case DSV_MSG_CURRENT_DEVICE_CHANGE_PREV: + if (_msg != NULL){ + _msg->close(); + _msg = NULL; + } + _protocol_widget->del_all_protocol(); _view->reload(); break; case DSV_MSG_CURRENT_DEVICE_CHANGED: { - if (_msg != NULL) - { - _msg->close(); - _msg = NULL; - } - reset_all_view(); load_device_config(); _sampling_bar->update_device_list(); @@ -1746,8 +1738,7 @@ namespace pv if (_device_agent->is_hardware()) { _session->on_load_config_end(); - } - + } if (_device_agent->get_work_mode() == LOGIC && _device_agent->is_file() == false) _view->auto_set_max_scale(); @@ -1853,6 +1844,11 @@ namespace pv case DSV_MSG_NEW_USB_DEVICE: { + if (_msg != NULL){ + _msg->close(); + _msg = NULL; + } + _sampling_bar->update_device_list(); if (_session->get_device()->is_demo() == false) @@ -1890,17 +1886,21 @@ namespace pv break; case DSV_MSG_CURRENT_DEVICE_DETACHED: + if (_msg != NULL){ + _msg->close(); + _msg = NULL; + } + // Save current config, and switch to the last device. _session->device_event_object()->device_updated(); session_save(); _view->hide_calibration(); - if (confirm_to_store_data()) - { + + if (confirm_to_store_data()){ _is_auto_switch_device = true; on_save(); } - else - { + else{ _session->set_default_device(); } break; @@ -1998,4 +1998,22 @@ namespace pv } } + void MainWindow::delay_prop_msg(QString strMsg) + { + _strMsg = strMsg; + if (_strMsg != ""){ + _delay_prop_msg_timer.Start(500); + } + } + + void MainWindow::on_delay_prop_msg() + { + _delay_prop_msg_timer.Stop(); + + if (_strMsg != ""){ + MsgBox::Show("", _strMsg, this, &_msg); + _msg = NULL; + } + } + } // namespace pv diff --git a/DSView/pv/mainwindow.h b/DSView/pv/mainwindow.h index be8780cf..411cd74e 100644 --- a/DSView/pv/mainwindow.h +++ b/DSView/pv/mainwindow.h @@ -32,6 +32,7 @@ #include "eventobject.h" #include #include +#include "dstimer.h" class QAction; class QMenuBar; @@ -120,6 +121,7 @@ private slots: void on_receive_data_len(quint64 len); void on_cur_snap_samplerate_changed(); void on_trigger_message(int msg); + void on_delay_prop_msg(); signals: void prgRate(int progress); @@ -146,28 +148,26 @@ private: QJsonDocument get_session_json_from_file(QString file); QJsonArray get_decoder_json_from_file(QString file); void calc_min_height(); + void session_save(); private: - //ISessionCallback - void show_error(QString error); + //ISessionCallback void session_error(); void data_updated(); void update_capture(); - void cur_snap_samplerate_changed(); - + void cur_snap_samplerate_changed(); void signals_changed(); void receive_trigger(quint64 trigger_pos); void frame_ended(); void frame_began(); void show_region(uint64_t start, uint64_t end, bool keep); - void show_wait_trigger(); void repeat_hold(int percent); void decode_done(); void receive_data_len(quint64 len); void receive_header(); - void trigger_message(int msg); - void session_save(); + void trigger_message(int msg); + void delay_prop_msg(QString strMsg); //ISessionDataGetter bool genSessionData(std::string &str); @@ -223,6 +223,8 @@ private: bool _is_save_confirm_msg; std::string _pattern_mode; QWidget *_frame; + DsTimer _delay_prop_msg_timer; + QString _strMsg; int _key_value; bool _key_vaild; diff --git a/DSView/pv/sigsession.cpp b/DSView/pv/sigsession.cpp index ac4c9398..4c6b499d 100644 --- a/DSView/pv/sigsession.cpp +++ b/DSView/pv/sigsession.cpp @@ -125,8 +125,7 @@ namespace pv _feed_timer.SetCallback(std::bind(&SigSession::feed_timeout, this)); _repeat_timer.SetCallback(std::bind(&SigSession::repeat_capture_wait_timeout, this)); _repeat_wait_prog_timer.SetCallback(std::bind(&SigSession::repeat_wait_prog_timeout, this)); - _refresh_rt_timer.SetCallback(std::bind(&SigSession::realtime_refresh_timeout, this)); - _delay_prop_msg_timer.SetCallback(std::bind(&SigSession::on_delay_prop_msg, this)); + _refresh_rt_timer.SetCallback(std::bind(&SigSession::realtime_refresh_timeout, this)); } SigSession::SigSession(SigSession &o) @@ -216,6 +215,8 @@ namespace pv assert(!_is_working); assert(_callback); + ds_device_handle old_dev = _device_agent.handle(); + set_operation_mode(OPT_SINGLE); _callback->trigger_message(DSV_MSG_CURRENT_DEVICE_CHANGE_PREV); @@ -225,8 +226,6 @@ namespace pv _device_status = ST_INIT; - ds_device_handle old_dev = _device_agent.handle(); - if (ds_active_device(dev_handle) != SR_OK) { dsv_err("%s", "Switch device error!"); @@ -259,13 +258,13 @@ namespace pv if (_device_agent.is_hardware() && _device_agent.check_firmware_version() == false) { QString strMsg = L_S(STR_PAGE_MSG, S_ID(IDS_MSG_TO_RECONNECT_FOR_FIRMWARE), "Please reconnect the device!"); - delay_prop_msg(strMsg); + _callback->delay_prop_msg(strMsg); } if (_device_agent.handle() != dev_handle && old_dev != NULL_HANDLE) { QString strMsg = L_S(STR_PAGE_MSG, S_ID(IDS_MSG_DEVICE_BUSY_SWITCH_FAILED), "Device is busy!"); - MsgBox::Show("",strMsg); + MsgBox::Show(strMsg); } return true; @@ -577,7 +576,7 @@ namespace pv if (_device_agent.have_enabled_channel() == false) { QString err_str(L_S(STR_PAGE_MSG, S_ID(IDS_MSG_NO_ENABLED_CHANNEL), "No channels enabled!")); - _callback->show_error(err_str); + MsgBox::Show(err_str); return false; } @@ -2288,20 +2287,4 @@ namespace pv set_cur_samplelimits(_device_agent.get_sample_limit()); } - void SigSession::delay_prop_msg(QString strMsg) - { - _strMsg = strMsg; - if (_strMsg != ""){ - _delay_prop_msg_timer.Start(1000); - } - } - - void SigSession::on_delay_prop_msg() - { - _delay_prop_msg_timer.Stop(); - - if (_strMsg != "") - MsgBox::Show("", _strMsg); - } - } // namespace pv diff --git a/DSView/pv/sigsession.h b/DSView/pv/sigsession.h index 24aa2edf..201fd06e 100644 --- a/DSView/pv/sigsession.h +++ b/DSView/pv/sigsession.h @@ -410,8 +410,7 @@ public: } void on_load_config_end(); - void init_signals(); - void delay_prop_msg(QString strMsg); + void init_signals(); inline bool is_doing_action(){ return _is_action; @@ -496,8 +495,7 @@ private: void repeat_wait_prog_timeout(); void realtime_refresh_timeout(); - void clear_signals(); - void on_delay_prop_msg(); + void clear_signals(); inline void data_lock(){ _data_lock = true; @@ -527,7 +525,7 @@ private: DsTimer _repeat_timer; DsTimer _repeat_wait_prog_timer; DsTimer _refresh_rt_timer; - DsTimer _delay_prop_msg_timer; + int _noData_cnt; bool _data_lock; bool _data_updated; @@ -562,7 +560,7 @@ private: uint64_t _rt_ck_refresh_time_id; COLLECT_OPT_MODE _opt_mode; bool _is_stream_mode; - QString _strMsg; + bool _is_action; uint64_t _dso_packet_count; diff --git a/DSView/pv/toolbars/samplingbar.cpp b/DSView/pv/toolbars/samplingbar.cpp index cc15e260..24677476 100644 --- a/DSView/pv/toolbars/samplingbar.cpp +++ b/DSView/pv/toolbars/samplingbar.cpp @@ -889,15 +889,11 @@ namespace pv if (zero) { - dialogs::DSMessageBox msg(this); - msg.mBox()->setText(L_S(STR_PAGE_MSG, S_ID(IDS_MSG_AUTO_CALIB), "Auto Calibration")); - msg.mBox()->setInformativeText(L_S(STR_PAGE_MSG, S_ID(IDS_MSG_ADJUST_SAVE), "Please adjust zero skew and save the result")); - // msg.setStandardButtons(QMessageBox::Ok); - msg.mBox()->addButton(L_S(STR_PAGE_MSG, S_ID(IDS_MSG_OK), "Ok"), QMessageBox::AcceptRole); - msg.mBox()->addButton(L_S(STR_PAGE_MSG, S_ID(IDS_MSG_SKIP), "Skip"), QMessageBox::RejectRole); - msg.mBox()->setIcon(QMessageBox::Warning); + QString str1(L_S(STR_PAGE_MSG, S_ID(IDS_MSG_AUTO_CALIB), "Auto Calibration")); + QString str2(L_S(STR_PAGE_MSG, S_ID(IDS_MSG_ADJUST_SAVE), "Please adjust zero skew and save the result")); + bool bRet = MsgBox::Confirm(str1, str2); - if (msg.exec()) + if (bRet) { zero_adj(); } @@ -960,15 +956,9 @@ namespace pv if (zero) { - dialogs::DSMessageBox msg(this); - msg.mBox()->setText(L_S(STR_PAGE_MSG,S_ID(IDS_MSG_AUTO_CALIB), "Auto Calibration")); - msg.mBox()->setInformativeText(L_S(STR_PAGE_MSG,S_ID(IDS_MSG_AUTO_CALIB_START), "Auto Calibration program will be started. Don't connect any probes. It can take a while!")); + QString strMsg(L_S(STR_PAGE_MSG,S_ID(IDS_MSG_AUTO_CALIB_START), "Auto Calibration program will be started. Don't connect any probes. \nIt can take a while!")); - msg.mBox()->addButton(L_S(STR_PAGE_MSG,S_ID(IDS_MSG_OK), "Ok"), QMessageBox::AcceptRole); - msg.mBox()->addButton(L_S(STR_PAGE_MSG,S_ID(IDS_MSG_SKIP), "Skip"), QMessageBox::RejectRole); - msg.mBox()->setIcon(QMessageBox::Warning); - - if (msg.exec()) + if (MsgBox::Confirm(strMsg)) { zero_adj(); } diff --git a/DSView/pv/ui/msgbox.cpp b/DSView/pv/ui/msgbox.cpp index c04468c1..3c3ef0d0 100644 --- a/DSView/pv/ui/msgbox.cpp +++ b/DSView/pv/ui/msgbox.cpp @@ -32,7 +32,27 @@ //QMessageBox::information(NULL, "Title", "Content"); //QMessageBox::information(NULL, "Title", "Content",QMessageBox::Yes|QMessageBox::No|QMessageBox::Abort); +void MsgBox::Show(const QString text) +{ + MsgBox::Show("", text, "", NULL, NULL, true); +} + void MsgBox::Show(const QString title, const QString text, QWidget *parent) +{ + MsgBox::Show(title, text, "", parent,NULL, true); +} + +void Show(const QString title, const QString text, const QString infoText) +{ + MsgBox::Show(title, text, infoText, NULL, NULL, true); +} + +void MsgBox::Show(const QString title, const QString text, QWidget *parent, pv::dialogs::DSMessageBox **box) +{ + MsgBox::Show(title, text, "", parent, box, true); +} + +void MsgBox::Show(const QString title, const QString text, const QString infoText, QWidget *parent, pv::dialogs::DSMessageBox **box, bool bExecute) { assert(!text.isEmpty()); @@ -45,14 +65,30 @@ void MsgBox::Show(const QString title, const QString text, QWidget *parent) } pv::dialogs::DSMessageBox msg(parent, title); - msg.mBox()->setText(str); - // msg.mBox()->setInformativeText(QString(text)); + + if (box != NULL){ + *box = &msg; + } + + msg.mBox()->setText(str); msg.mBox()->setStandardButtons(QMessageBox::Ok); msg.mBox()->setIcon(QMessageBox::Warning); - msg.exec(); + + if (infoText != ""){ + msg.mBox()->setInformativeText(infoText); + } + + if (bExecute){ + msg.exec(); + } } bool MsgBox::Confirm(const QString text, QWidget *parent) +{ + MsgBox::Confirm(text, "", parent); +} + +bool MsgBox::Confirm(const QString text, const QString infoText, QWidget *parent) { assert(!text.isEmpty()); @@ -69,6 +105,11 @@ bool MsgBox::Confirm(const QString text, QWidget *parent) msg.mBox()->setText(str); msg.mBox()->setStandardButtons(QMessageBox::Yes | QMessageBox::No); msg.mBox()->setIcon(QMessageBox::Question); + + if (infoText != ""){ + msg.mBox()->setInformativeText(infoText); + } + msg.exec(); return msg.IsYes(); } diff --git a/DSView/pv/ui/msgbox.h b/DSView/pv/ui/msgbox.h index 23a0ae7c..c3dd81b7 100644 --- a/DSView/pv/ui/msgbox.h +++ b/DSView/pv/ui/msgbox.h @@ -25,10 +25,21 @@ class QWidget; +namespace pv{ + namespace dialogs{ + class DSMessageBox; + } +} + class MsgBox { public: + static void Show(const QString text); static void Show(const QString title, const QString text, QWidget *parent=0); + static void Show(const QString title, const QString text, const QString infoText); + static void Show(const QString title, const QString text, QWidget *parent, pv::dialogs::DSMessageBox **box); + static void Show(const QString title, const QString text, const QString infoText, QWidget *parent, pv::dialogs::DSMessageBox **box, bool bExecute=true); static bool Confirm(const QString text, QWidget *parent=0); + static bool Confirm(const QString text, const QString infoText, QWidget *parent=0); }; \ No newline at end of file diff --git a/lang/cn/dlg.json b/lang/cn/dlg.json index 7629743e..a745246b 100644 --- a/lang/cn/dlg.json +++ b/lang/cn/dlg.json @@ -49,11 +49,11 @@ }, { "id": "IDS_DLG_CHECK_USB_SPEED_ERROR", - "text": " 将其插入USB 2.0端口将严重影响其性能.\n 请将其重新插入USB 3.0端口." + "text": "将该设备插入USB 2.0端口会严重影响其性能.\n请重新插入USB 3.0端口." }, { "id": "IDS_DLG_CHECK_SESSION_FILE_VERSION_ERROR", - "text": " 当前加载文件具有旧格式 . \n这将导致加载速度变慢. \n请在加载后重新保存." + "text": "当前加载文件具有旧格式 . \n这将导致加载速度变慢. \n请在加载后重新保存." }, { "id": "IDS_DLG_ABOUT", @@ -89,7 +89,7 @@ }, { "id": "IDS_DLG_SAVE_CALIBRATION_RESULTS", - "text": " 保存校准结果...可能需要一段时间." + "text": "保存校准结果...可能需要一段时间." }, { "id": "IDS_DLG_CANCEL", @@ -97,7 +97,7 @@ }, { "id": "IDS_DLG_RELOAD_CALIBRATION_RESULTS", - "text": " 重新加载上次校准...可能需要一段时间." + "text": "重新加载上次校准...可能需要一段时间." }, { "id": "IDS_DLG_DECODER_OPTIONS", @@ -253,7 +253,7 @@ }, { "id": "IDS_DLG_EXPORT_PROTOCOL_LIST_RESULT", - "text": " 导出协议列表结果...可能需要一段时间 ." + "text": "导出协议列表结果...可能需要一段时间 ." }, { "id": "IDS_DLG_FIT_TO_WINDOW", diff --git a/lang/cn/msg.json b/lang/cn/msg.json index cdbc9e70..78359aca 100644 --- a/lang/cn/msg.json +++ b/lang/cn/msg.json @@ -28,7 +28,7 @@ }, { "id": "IDS_MSG_AUTO_CALIB_START", - "text": "自动校准程序将启动。不要连接任何探针。这可能需要一段时间!" + "text": "自动校准程序将启动。不要连接任何探针。\n这可能需要一段时间!" }, { "id": "IDS_MSG_AUTO_CALIB", @@ -108,7 +108,7 @@ }, { "id": "IDS_MSG_MAX_CHANNEL_COUNT_WARNING", - "text": "当前模式仅支持最大 {0}\n通道数!" + "text": "当前模式仅支持最大 {0} 通道数!" }, { "id": "IDS_MSG_TRI_SET_ISSUE", diff --git a/lang/en/dlg.json b/lang/en/dlg.json index 0c225589..e7b3be81 100644 --- a/lang/en/dlg.json +++ b/lang/en/dlg.json @@ -49,7 +49,7 @@ }, { "id": "IDS_DLG_CHECK_USB_SPEED_ERROR", - "text": "Plug it into a USB 2.0 port will seriously affect its performance.\n Please replug it into a USB 3.0 port." + "text": "Plug the device into a USB 2.0 port will seriously affect its performance.\n Please replug it into a USB 3.0 port." }, { "id": "IDS_DLG_CHECK_SESSION_FILE_VERSION_ERROR", diff --git a/lang/en/msg.json b/lang/en/msg.json index 810a06c0..bcc6b084 100644 --- a/lang/en/msg.json +++ b/lang/en/msg.json @@ -29,7 +29,7 @@ }, { "id": "IDS_MSG_AUTO_CALIB_START", - "text": "Auto Calibration program will be started. Don't connect any probes. It can take a while!" + "text": "Auto Calibration program will be started. Don't connect any probes. \nIt can take a while!" }, { "id": "IDS_MSG_AUTO_CALIB", @@ -109,7 +109,7 @@ }, { "id": "IDS_MSG_MAX_CHANNEL_COUNT_WARNING", - "text": "Current mode only suppport max {0}\nchannels!" + "text": "Current mode only suppport max {0} channels!" }, { "id": "IDS_MSG_TRI_SET_ISSUE", diff --git a/libsigrok4DSL/hardware/demo/demo.c b/libsigrok4DSL/hardware/demo/demo.c index 7b6ec5f1..ddb53017 100644 --- a/libsigrok4DSL/hardware/demo/demo.c +++ b/libsigrok4DSL/hardware/demo/demo.c @@ -1985,7 +1985,7 @@ static int receive_data_dso(int fd, int revents, const struct sr_dev_inst *sdi) tem = DSO_MIN_VAL; else tem-= high_gate; - test[i] = tem; + // test[i] = tem; *((uint8_t*)pack_buffer->post_buf + i) = (uint8_t)tem; } } From 1879e7206d29ac2cd4dcadc4d793bcbc3974d6ec Mon Sep 17 00:00:00 2001 From: dreamsourcelabTAI Date: Fri, 19 May 2023 15:43:13 +0800 Subject: [PATCH 3/5] The data used for decoding does not require to be compressed --- DSView/pv/data/decoderstack.cpp | 10 ++-- DSView/pv/data/logicsnapshot.cpp | 85 +++++++++++--------------------- DSView/pv/data/logicsnapshot.h | 12 ++--- DSView/pv/sigsession.cpp | 15 ++++-- 4 files changed, 53 insertions(+), 69 deletions(-) diff --git a/DSView/pv/data/decoderstack.cpp b/DSView/pv/data/decoderstack.cpp index 63e298fb..54decf79 100644 --- a/DSView/pv/data/decoderstack.cpp +++ b/DSView/pv/data/decoderstack.cpp @@ -540,7 +540,7 @@ void DecoderStack::decode_data(const uint64_t decode_start, const uint64_t decod if (!bCheckEnd){ bCheckEnd = true; - uint64_t mipmap_sample_count = _snapshot->get_mipmap_sample_count(); + uint64_t mipmap_sample_count = _snapshot->get_ring_sample_count(); if (end_index >= mipmap_sample_count){ end_index = mipmap_sample_count - 1; @@ -548,14 +548,14 @@ void DecoderStack::decode_data(const uint64_t decode_start, const uint64_t decod } } } - else if (i >= _snapshot->get_mipmap_sample_count()) + else if (i >= _snapshot->get_ring_sample_count()) { // Wait the data is ready. std::this_thread::sleep_for(std::chrono::milliseconds(100)); continue; } - if (_is_capture_end && i == _snapshot->get_mipmap_sample_count()){ + if (_is_capture_end && i == _snapshot->get_ring_sample_count()){ break; } @@ -570,7 +570,7 @@ void DecoderStack::decode_data(const uint64_t decode_start, const uint64_t decod } else { if (_snapshot->has_data(sig_index)) { - auto data_ptr = _snapshot->get_decode_samples(i, chunk_end, sig_index); + auto data_ptr = _snapshot->get_samples(i, chunk_end, sig_index); chunk.push_back(data_ptr); chunk_const.push_back(_snapshot->get_sample(i, sig_index)); } @@ -663,7 +663,7 @@ void DecoderStack::execute_decode_stack() assert(session); // Get the intial sample count - _sample_count = _snapshot->get_mipmap_sample_count(); + _sample_count = _snapshot->get_ring_sample_count(); // Create the decoders for(auto dec : _stack) diff --git a/DSView/pv/data/logicsnapshot.cpp b/DSView/pv/data/logicsnapshot.cpp index 02fa9bff..e4b13118 100644 --- a/DSView/pv/data/logicsnapshot.cpp +++ b/DSView/pv/data/logicsnapshot.cpp @@ -55,6 +55,7 @@ LogicSnapshot::LogicSnapshot() : _total_sample_count = 0; _is_loop = false; _loop_offset = 0; + _able_free = true; } LogicSnapshot::~LogicSnapshot() @@ -77,6 +78,11 @@ void LogicSnapshot::free_data() } _ch_data.clear(); _sample_count = 0; + + for(void *p : _free_block_list){ + free(p); + } + _free_block_list.clear(); } void LogicSnapshot::init() @@ -94,8 +100,8 @@ void LogicSnapshot::init_all() _dest_ptr = NULL; _memory_failed = false; _last_ended = true; - _mipmap_sample_count = 0; _loop_offset = 0; + _able_free = true; } void LogicSnapshot::clear() @@ -106,10 +112,16 @@ void LogicSnapshot::clear() _have_data = false; } -void LogicSnapshot::first_payload(const sr_datafeed_logic &logic, uint64_t total_sample_count, GSList *channels) +void LogicSnapshot::first_payload(const sr_datafeed_logic &logic, uint64_t total_sample_count, GSList *channels, bool able_free) { bool channel_changed = false; uint16_t channel_num = 0; + _able_free = able_free; + + for(void *p : _free_block_list){ + free(p); + } + _free_block_list.clear(); for (const GSList *l = channels; l; l = l->next) { sr_channel *const probe = (sr_channel*)l->data; @@ -172,7 +184,6 @@ void LogicSnapshot::first_payload(const sr_datafeed_logic &logic, uint64_t total _sample_count = 0; _ring_sample_count = 0; - _mipmap_sample_count = 0; assert(logic.data); uint64_t *rd_data = (uint64_t*)logic.data; @@ -268,7 +279,6 @@ void LogicSnapshot::append_cross_payload(const sr_datafeed_logic &logic) if (_ring_sample_count % LeafBlockSamples == 0){ calc_mipmap(_channel_num - 1, index0, index1, LeafBlockSamples, true); - _mipmap_sample_count = _ring_sample_count - _loop_offset; } break; } @@ -327,9 +337,6 @@ void LogicSnapshot::append_cross_payload(const sr_datafeed_logic &logic) { calc_mipmap(fill_chan, index0, index1, LeafBlockSamples, true); - if (fill_chan + 1 == _channel_num) - _mipmap_sample_count = _ring_sample_count - _loop_offset; - chans_read_addr[fill_chan] = read_ptr; fill_chan = (fill_chan + 1) % _channel_num; @@ -428,8 +435,6 @@ void LogicSnapshot::capture_ended() Snapshot::capture_ended(); _sample_count = _ring_sample_count; - _mipmap_sample_count = _ring_sample_count; - _ring_sample_count += _loop_offset; uint64_t index0 = _ring_sample_count / LeafBlockSamples / RootScale; @@ -540,7 +545,12 @@ void LogicSnapshot::calc_mipmap(unsigned int order, uint8_t index0, uint8_t inde _ch_data[order][index0].tog |= 1ULL << index1; } else if (isEnd){ - free(_ch_data[order][index0].lbp[index1]); + + if (_able_free) + free(_ch_data[order][index0].lbp[index1]); + else + _free_block_list.push_back(_ch_data[order][index0].lbp[index1]); + _ch_data[order][index0].lbp[index1] = NULL; } @@ -587,43 +597,6 @@ const uint8_t *LogicSnapshot::get_samples(uint64_t start_sample, uint64_t &end_s return (uint8_t*)_ch_data[order][index0].lbp[index1] + offset; } -const uint8_t *LogicSnapshot::get_decode_samples(uint64_t start_sample, uint64_t &end_sample, int sig_index) -{ - std::lock_guard lock(_mutex); - - uint64_t sample_count = _mipmap_sample_count; - - assert(start_sample < sample_count); - - if (end_sample >= sample_count) - end_sample = sample_count - 1; - - assert(end_sample <= sample_count); - assert(start_sample <= end_sample); - - start_sample += _loop_offset; - _ring_sample_count += _loop_offset; - - int order = get_ch_order(sig_index); - uint64_t index0 = start_sample >> (LeafBlockPower + RootScalePower); - uint64_t index1 = (start_sample & RootMask) >> LeafBlockPower; - uint64_t offset = (start_sample & LeafMask) / 8; - - end_sample = (index0 << (LeafBlockPower + RootScalePower)) + - (index1 << LeafBlockPower) + - ~(~0ULL << LeafBlockPower); - - end_sample = min(end_sample + 1, sample_count); - - end_sample -= _loop_offset; - _ring_sample_count -= _loop_offset; - - if (order == -1 || _ch_data[order][index0].lbp[index1] == NULL) - return NULL; - else - return (uint8_t*)_ch_data[order][index0].lbp[index1] + offset; -} - bool LogicSnapshot::get_sample(uint64_t index, int sig_index) { index += _loop_offset; @@ -1073,8 +1046,6 @@ bool LogicSnapshot::pattern_search_self(int64_t start, int64_t end, int64_t &ind int count = 0; bool bEdgeFlag = false; - - int64_t to = isNext ? end + 1 : start - 1; int64_t step = isNext ? 1 : -1; @@ -1223,12 +1194,6 @@ int LogicSnapshot::get_ch_order(int sig_index) return -1; } -uint64_t LogicSnapshot::get_mipmap_sample_count() -{ - std::lock_guard lock(_mutex); - return _mipmap_sample_count; -} - void LogicSnapshot::move_first_node_to_last() { for (unsigned int i=0; i<_channel_num; i++) @@ -1251,5 +1216,15 @@ void LogicSnapshot::move_first_node_to_last() } } +void LogicSnapshot::decode_end() +{ + std::lock_guard lock(_mutex); + + for(void *p : _free_block_list){ + free(p); + } + _free_block_list.clear(); +} + } // namespace data } // namespace pv diff --git a/DSView/pv/data/logicsnapshot.h b/DSView/pv/data/logicsnapshot.h index 6c4dea72..5fa60544 100644 --- a/DSView/pv/data/logicsnapshot.h +++ b/DSView/pv/data/logicsnapshot.h @@ -90,14 +90,12 @@ public: void init(); - void first_payload(const sr_datafeed_logic &logic, uint64_t total_sample_count, GSList *channels); + void first_payload(const sr_datafeed_logic &logic, uint64_t total_sample_count, GSList *channels, bool able_free); void append_payload(const sr_datafeed_logic &logic); const uint8_t * get_samples(uint64_t start_sample, uint64_t& end_sample, int sig_index); - const uint8_t * get_decode_samples(uint64_t start_sample, uint64_t& end_sample, int sig_index); - bool get_sample(uint64_t index, int sig_index); void capture_ended(); @@ -122,8 +120,6 @@ public: bool pattern_search(int64_t start, int64_t end, int64_t& index, std::map &pattern, bool isNext); - uint64_t get_mipmap_sample_count(); - inline void set_loop(bool bLoop){ _is_loop = bLoop; } @@ -132,6 +128,8 @@ public: return _is_loop; } + void decode_end(); + private: bool get_sample_self(uint64_t index, int sig_index); bool get_nxt_edge_self(uint64_t &index, bool last_sample, uint64_t end, @@ -144,6 +142,7 @@ private: std::map &pattern, bool isNext); int get_ch_order(int sig_index); + void calc_mipmap(unsigned int order, uint8_t index0, uint8_t index1, uint64_t samples, bool isEnd); void append_cross_payload(const sr_datafeed_logic &logic); @@ -215,9 +214,10 @@ private: uint64_t _last_sample[CHANNEL_MAX_COUNT]; uint64_t _last_calc_count[CHANNEL_MAX_COUNT]; - uint64_t _mipmap_sample_count; bool _is_loop; uint64_t _loop_offset; + bool _able_free; + std::vector _free_block_list; friend class LogicSnapshotTest::Pow2; friend class LogicSnapshotTest::Basic; diff --git a/DSView/pv/sigsession.cpp b/DSView/pv/sigsession.cpp index 4c6b499d..7b9e9eae 100644 --- a/DSView/pv/sigsession.cpp +++ b/DSView/pv/sigsession.cpp @@ -1103,9 +1103,16 @@ namespace pv } if (_capture_data->get_logic()->last_ended()) - { + { _capture_data->get_logic()->set_loop(is_loop_mode()); - _capture_data->get_logic()->first_payload(o, _device_agent.get_sample_limit(), _device_agent.get_channels()); + + bool bNotFree = _is_decoding && _view_data == _capture_data; + + _capture_data->get_logic()->first_payload(o, + _device_agent.get_sample_limit(), + _device_agent.get_channels(), + !bNotFree); + // @todo Putting this here means that only listeners querying // for logic will be notified. Currently the only user of // frame_began is DecoderStack, but in future we need to signal @@ -1850,8 +1857,10 @@ namespace pv task = get_top_decode_task(); } + _view_data->get_logic()->decode_end(); + dsv_info("%s", "------->decode thread end"); - _is_decoding = false; + _is_decoding = false; } Snapshot *SigSession::get_signal_snapshot() From 256cb243803e3a668a96f456f5658bea48ca9c07 Mon Sep 17 00:00:00 2001 From: dreamsourcelabTAI Date: Fri, 19 May 2023 15:55:27 +0800 Subject: [PATCH 4/5] fix: Can't remove the decoder --- DSView/pv/dock/protocoldock.cpp | 11 +++++++---- DSView/pv/ui/msgbox.cpp | 2 +- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/DSView/pv/dock/protocoldock.cpp b/DSView/pv/dock/protocoldock.cpp index 23dcfcf8..93572c76 100644 --- a/DSView/pv/dock/protocoldock.cpp +++ b/DSView/pv/dock/protocoldock.cpp @@ -421,8 +421,9 @@ bool ProtocolDock::add_protocol_by_id(QString id, bool silent, std::list Date: Fri, 19 May 2023 19:51:57 +0800 Subject: [PATCH 5/5] fix: The thread object maybe crash when the program exit --- DSView/pv/appcontrol.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DSView/pv/appcontrol.cpp b/DSView/pv/appcontrol.cpp index dd1c0b91..8d48bb24 100644 --- a/DSView/pv/appcontrol.cpp +++ b/DSView/pv/appcontrol.cpp @@ -60,7 +60,7 @@ AppControl* AppControl::Instance() } void AppControl::Destroy(){ - delete this; + } bool AppControl::Init()