diff --git a/DSView/pv/dock/triggerdock.cpp b/DSView/pv/dock/triggerdock.cpp index 2cae1272..07f6eddf 100644 --- a/DSView/pv/dock/triggerdock.cpp +++ b/DSView/pv/dock/triggerdock.cpp @@ -70,7 +70,7 @@ TriggerDock::TriggerDock(QWidget *parent, SigSession &session) : stage_tabWidget = new QTabWidget(this); stage_tabWidget->setTabPosition(QTabWidget::East); - stage_tabWidget->setDisabled(true); + //stage_tabWidget->setDisabled(true); QRegExp value_rx("[10XRFCxrfc ]+"); QValidator *value_validator = new QRegExpValidator(value_rx, this); @@ -151,10 +151,88 @@ TriggerDock::TriggerDock(QWidget *parent, SigSession &session) : connect(_count1_spinBox, SIGNAL(editingFinished()), this, SLOT(count_changed())); } + _serial_start_label = new QLabel(tr("Start Flag: "), this); + _serial_start_lineEdit = new QLineEdit("X X X X X X X X X X X X X X X X", this); + _serial_start_lineEdit->setFont(font); + _serial_start_lineEdit->setValidator(value_validator); + _serial_start_lineEdit->setMaxLength(TriggerProbes * 2 - 1); + _serial_start_lineEdit->setInputMask("X X X X X X X X X X X X X X X X"); + _serial_start_lineEdit->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred); + + _serial_stop_label = new QLabel(tr("Stop Flag: "), this); + _serial_stop_lineEdit = new QLineEdit("X X X X X X X X X X X X X X X X", this); + _serial_stop_lineEdit->setFont(font); + _serial_stop_lineEdit->setValidator(value_validator); + _serial_stop_lineEdit->setMaxLength(TriggerProbes * 2 - 1); + _serial_stop_lineEdit->setInputMask("X X X X X X X X X X X X X X X X"); + _serial_stop_lineEdit->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred); + + _serial_edge_label = new QLabel(tr("Clock Flag: "), this); + _serial_edge_lineEdit = new QLineEdit("X X X X X X X X X X X X X X X X", this); + _serial_edge_lineEdit->setFont(font); + _serial_edge_lineEdit->setValidator(value_validator); + _serial_edge_lineEdit->setMaxLength(TriggerProbes * 2 - 1); + _serial_edge_lineEdit->setInputMask("X X X X X X X X X X X X X X X X"); + _serial_edge_lineEdit->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred); + + _serial_data_lable = new QLabel(tr("Data Channel: "), this); + _serial_data_comboBox = new QComboBox(this); + for(i = 0; i < TriggerProbes; i++) + _serial_data_comboBox->addItem(QString::number(i)); + + _serial_value_lable = new QLabel(tr("Data Value: "), this); + _serial_value_lineEdit = new QLineEdit("X X X X X X X X X X X X X X X X", this); + _serial_value_lineEdit->setFont(font); + _serial_value_lineEdit->setValidator(value_validator); + _serial_value_lineEdit->setMaxLength(TriggerProbes * 2 - 1); + _serial_value_lineEdit->setInputMask("X X X X X X X X X X X X X X X X"); + _serial_value_lineEdit->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred); + + QLabel *serial_value_exp_label = new QLabel("1 1 1 1 1 1\n5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0", this); + serial_value_exp_label->setFont(font); + + QVBoxLayout *serial_layout = new QVBoxLayout(); + QGridLayout *serial_glayout = new QGridLayout(); + serial_glayout->addWidget(serial_value_exp_label, 1, 1, 1, 4); + serial_glayout->addWidget(_serial_start_label, 2, 0); + serial_glayout->addWidget(_serial_start_lineEdit, 2, 1, 1, 4); + serial_glayout->addWidget(new QLabel(this), 2, 2); + serial_glayout->addWidget(_serial_stop_label, 3, 0); + serial_glayout->addWidget(_serial_stop_lineEdit, 3, 1, 1, 4); + serial_glayout->addWidget(_serial_edge_label, 4, 0); + serial_glayout->addWidget(_serial_edge_lineEdit, 4, 1, 1, 4); + serial_glayout->addWidget(_serial_data_lable, 5, 0); + serial_glayout->addWidget(_serial_data_comboBox, 5, 1); + serial_glayout->addWidget(_serial_value_lable, 6, 0); + serial_glayout->addWidget(_serial_value_lineEdit, 6, 1, 1, 4); + serial_layout->addLayout(serial_glayout); + serial_layout->addSpacing(20); + serial_layout->addWidget(new QLabel(tr("X: Don't care\n0: Low level\n1: High level\nR: Rising edge\nF: Falling edge\nC: Rising/Falling edge"))); + serial_layout->addStretch(1); + + _serial_groupBox = new QGroupBox(tr("Serial Trigger"), this); + _serial_groupBox->setFlat(true); + _serial_groupBox->setLayout(serial_layout); + //_serial_groupBox->setDisabled(true); + + connect(_serial_start_lineEdit, SIGNAL(editingFinished()), this, SLOT(value_changed())); + connect(_serial_stop_lineEdit, SIGNAL(editingFinished()), this, SLOT(value_changed())); + connect(_serial_edge_lineEdit, SIGNAL(editingFinished()), this, SLOT(value_changed())); + connect(_serial_data_comboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(serial_channel_changed(int))); + connect(_serial_value_lineEdit, SIGNAL(editingFinished()), this, SLOT(value_changed())); + + + _adv_tabWidget = new QTabWidget(this); + _adv_tabWidget->setTabPosition(QTabWidget::North); + _adv_tabWidget->setDisabled(true); + _adv_tabWidget->addTab((QWidget *)stage_tabWidget, tr("Stage Trigger")); + _adv_tabWidget->addTab((QWidget *)_serial_groupBox, tr("Serial Trigger")); + connect(simple_radioButton, SIGNAL(clicked()), this, SLOT(simple_trigger())); connect(adv_radioButton, SIGNAL(clicked()), this, SLOT(adv_trigger())); connect(stages_comboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(trigger_stages_changed(int))); connect(position_slider, SIGNAL(valueChanged(int)), this, SLOT(pos_changed(int))); + connect(_adv_tabWidget, SIGNAL(currentChanged(int)), this, SLOT(adv_tog(int))); QVBoxLayout *layout = new QVBoxLayout(this); QGridLayout *gLayout = new QGridLayout(); @@ -170,7 +248,7 @@ TriggerDock::TriggerDock(QWidget *parent, SigSession &session) : gLayout->setColumnStretch(2, 1); layout->addLayout(gLayout); - layout->addWidget(stage_tabWidget); + layout->addWidget(_adv_tabWidget); layout->addStretch(1); setLayout(layout); } @@ -192,7 +270,7 @@ void TriggerDock::simple_trigger() int i; stages_label->setDisabled(true); stages_comboBox->setDisabled(true); - stage_tabWidget->setDisabled(true); + _adv_tabWidget->setDisabled(true); for (i = 0; i < TriggerStages; i++) { stage_tabWidget->setTabEnabled(i, true); // _mu_label_list.at(i)->setDisabled(true); @@ -229,7 +307,10 @@ void TriggerDock::adv_trigger() simple_radioButton->setChecked(true); } else { widget_enable(); - ds_trigger_set_mode(ADV_TRIGGER); + if (_adv_tabWidget->currentIndex() == 0) + ds_trigger_set_mode(ADV_TRIGGER); + else if (_adv_tabWidget->currentIndex() == 1) + ds_trigger_set_mode(SERIAL_TRIGGER); _session.set_adv_trigger(true); } } else { @@ -260,7 +341,7 @@ void TriggerDock::widget_enable() stages_label->setDisabled(false); stages_comboBox->setVisible(true); stages_comboBox->setDisabled(false); - stage_tabWidget->setDisabled(false); + _adv_tabWidget->setDisabled(false); enable_stages = stages_comboBox->currentText().toInt(); for (i = 0; i < enable_stages; i++) { stage_tabWidget->setTabEnabled(i, true); @@ -302,21 +383,60 @@ void TriggerDock::value_changed() { int i; - for (i = 0; i < stages_comboBox->currentText().toInt(); i++) { - _value0_lineEdit_list.at(i)->setText(_value0_lineEdit_list.at(i)->text().toUpper()); - while(_value0_lineEdit_list.at(i)->text().length() < TriggerProbes) - _value0_lineEdit_list.at(i)->setText("X" + _value0_lineEdit_list.at(i)->text()); + if (_adv_tabWidget->currentIndex() == 0) { + for (i = 0; i < stages_comboBox->currentText().toInt(); i++) { + _value0_lineEdit_list.at(i)->setText(_value0_lineEdit_list.at(i)->text().toUpper()); + while(_value0_lineEdit_list.at(i)->text().length() < TriggerProbes) + _value0_lineEdit_list.at(i)->setText("X" + _value0_lineEdit_list.at(i)->text()); - _value1_lineEdit_list.at(i)->setText(_value1_lineEdit_list.at(i)->text().toUpper()); - while(_value1_lineEdit_list.at(i)->text().length() < TriggerProbes) - _value1_lineEdit_list.at(i)->setText("X" + _value1_lineEdit_list.at(i)->text()); + _value1_lineEdit_list.at(i)->setText(_value1_lineEdit_list.at(i)->text().toUpper()); + while(_value1_lineEdit_list.at(i)->text().length() < TriggerProbes) + _value1_lineEdit_list.at(i)->setText("X" + _value1_lineEdit_list.at(i)->text()); - ds_trigger_stage_set_value(i, TriggerProbes, - _value0_lineEdit_list.at(i)->text().toLocal8Bit().data(), - _value1_lineEdit_list.at(i)->text().toLocal8Bit().data()); + ds_trigger_stage_set_value(i, TriggerProbes, + _value0_lineEdit_list.at(i)->text().toLocal8Bit().data(), + _value1_lineEdit_list.at(i)->text().toLocal8Bit().data()); + } + } else if(_adv_tabWidget->currentIndex() == 1){ + _serial_start_lineEdit->setText(_serial_start_lineEdit->text().toUpper()); + ds_trigger_stage_set_value(0, TriggerProbes, + _serial_start_lineEdit->text().toLocal8Bit().data(), + _value1_lineEdit_list.at(0)->text().toLocal8Bit().data()); + _serial_stop_lineEdit->setText(_serial_stop_lineEdit->text().toUpper()); + ds_trigger_stage_set_value(1, TriggerProbes, + _serial_stop_lineEdit->text().toLocal8Bit().data(), + _value1_lineEdit_list.at(1)->text().toLocal8Bit().data()); + _serial_edge_lineEdit->setText(_serial_edge_lineEdit->text().toUpper()); + ds_trigger_stage_set_value(2, TriggerProbes, + _serial_edge_lineEdit->text().toLocal8Bit().data(), + _value1_lineEdit_list.at(2)->text().toLocal8Bit().data()); + //_serial_data_comboBox + const int data_channel = _serial_data_comboBox->currentText().toInt(); + char channel[31]; + for(i = 0; i < 31; i++){ + if (i == (30 - 2*data_channel)) + channel[i] = '1'; + else if (i%2 == 0) + channel[i] = '0'; + else + channel[i] = ' '; + } + ds_trigger_stage_set_value(3, TriggerProbes, + channel, + _value1_lineEdit_list.at(3)->text().toLocal8Bit().data()); + _serial_value_lineEdit->setText(_serial_value_lineEdit->text().toUpper()); + ds_trigger_stage_set_value(4, TriggerProbes, + _serial_value_lineEdit->text().toLocal8Bit().data(), + _value1_lineEdit_list.at(4)->text().toLocal8Bit().data()); } } +void TriggerDock::serial_channel_changed(int index) +{ + (void)index; + value_changed(); +} + void TriggerDock::logic_changed(int index) { (void)index; @@ -378,6 +498,23 @@ void TriggerDock::device_change() } } +void TriggerDock::adv_tog(int index) +{ + if(index == 0) { + stages_label->setDisabled(false); + stages_comboBox->setDisabled(false); + ds_trigger_set_mode(ADV_TRIGGER); + } else if (index == 1) { + stages_label->setDisabled(true); + stages_comboBox->setDisabled(true); + ds_trigger_set_mode(SERIAL_TRIGGER); + } + value_changed(); + logic_changed(0); + inv_changed(0); + count_changed(); +} + void TriggerDock::init() { // TRIGGERPOS diff --git a/DSView/pv/dock/triggerdock.h b/DSView/pv/dock/triggerdock.h index 03a84b0d..5cdfa3b7 100644 --- a/DSView/pv/dock/triggerdock.h +++ b/DSView/pv/dock/triggerdock.h @@ -78,6 +78,9 @@ private slots: void pos_changed(int pos); + void adv_tog(int index); + void serial_channel_changed(int index); + private: private: @@ -104,6 +107,19 @@ private: QVector _value1_lineEdit_list; QVector _count1_spinBox_list; QVector _inv1_comboBox_list; + + QTabWidget *_adv_tabWidget; + QGroupBox *_serial_groupBox; + QLabel *_serial_start_label; + QLineEdit *_serial_start_lineEdit; + QLabel *_serial_stop_label; + QLineEdit *_serial_stop_lineEdit; + QLabel *_serial_edge_label; + QLineEdit *_serial_edge_lineEdit; + QLabel *_serial_data_lable; + QComboBox *_serial_data_comboBox; + QLabel *_serial_value_lable; + QLineEdit *_serial_value_lineEdit; }; } // namespace dock diff --git a/DSView/res/DSLogicPro.bin b/DSView/res/DSLogicPro.bin index e81b3f12..b73066fa 100644 Binary files a/DSView/res/DSLogicPro.bin and b/DSView/res/DSLogicPro.bin differ diff --git a/DSView/stylesheet.qss b/DSView/stylesheet.qss index c3465a9f..8d3713b0 100644 --- a/DSView/stylesheet.qss +++ b/DSView/stylesheet.qss @@ -170,43 +170,18 @@ QDockWidget > QWidget > QTabWidget::pane{ margin: 0px; background-color: rgb(17, 133, 209, 255); border: 1px solid rgb(255, 255, 255); - border-right-color: rgb(17, 133, 209, 255); /* same as the pane color */ padding: 0px; } QDockWidget > QWidget > QTabWidget::pane:disabled{ border: 1px solid rgb(200, 200, 200, 255); - border-right-color: rgb(17, 133, 209, 255); /* same as the pane color */ } -QDockWidget > QWidget > QTabWidget > QTabBar::tab -{ - background: transparent; - color: white; - border: 2px solid rgb(238, 178, 17, 255); - border-left-color: rgb(17, 133, 209, 255); /* same as the pane color */ - border-bottom-right-radius: 4px; - border-top-right-radius: 4px; - min-height: 8ex; - padding: 2px; -} -QDockWidget > QWidget > QTabWidget > QTabBar::tab:hover -{ - border: 3px solid rgb(238, 178, 17, 255); - border-left-color: rgb(17, 133, 209, 255); /* same as the pane color */ -} -QDockWidget > QWidget > QTabWidget > QTabBar::tab:selected -{ - color: white; - background: rgb(238, 178, 17, 255); - border-left-color: rgb(17, 133, 209, 255); /* same as the pane color */ -} -QDockWidget > QWidget > QTabWidget > QTabBar::tab:disabled -{ - color: rgb(200, 200, 200, 50); - border: 1px solid rgb(232, 232, 230, 255); - background: transparent; - border-left-color: rgb(17, 133, 209, 255); /* same as the pane color */ +QTabWidget::pane{ + margin: 0px; + background-color: rgb(17, 133, 209, 255); + border: 0px solid rgb(255, 255, 255); + padding: 0px; } QCheckBox, diff --git a/libsigrok4DSL/hardware/DSL/dslogic.c b/libsigrok4DSL/hardware/DSL/dslogic.c index ded0c501..020769bb 100644 --- a/libsigrok4DSL/hardware/DSL/dslogic.c +++ b/libsigrok4DSL/hardware/DSL/dslogic.c @@ -280,6 +280,7 @@ static int fpga_setting(const struct sr_dev_inst *sdi) ((devc->op_mode == SR_OP_EXTERNAL_TEST) << 14) + ((devc->op_mode == SR_OP_LOOPBACK_TEST) << 13) + ((devc->stream) << 12) + + ((trigger->trigger_mode == SERIAL_TRIGGER) << 11) + trigger->trigger_en + ((sdi->mode > 0) << 4) + (devc->clock_type << 1) + (devc->clock_edge << 1) + (((channel_cnt == 8 && sdi->mode != DSO) || (sdi->mode == ANALOG)) << 5) + diff --git a/libsigrok4DSL/libsigrok.h b/libsigrok4DSL/libsigrok.h index f3b60b6e..c4827412 100644 --- a/libsigrok4DSL/libsigrok.h +++ b/libsigrok4DSL/libsigrok.h @@ -1020,6 +1020,7 @@ struct sr_session { enum { SIMPLE_TRIGGER = 0, ADV_TRIGGER, + SERIAL_TRIGGER, }; enum {