diff --git a/DSView/pv/dock/triggerdock.cpp b/DSView/pv/dock/triggerdock.cpp index 80c08d97..6c727e85 100755 --- a/DSView/pv/dock/triggerdock.cpp +++ b/DSView/pv/dock/triggerdock.cpp @@ -23,6 +23,7 @@ #include "../sigsession.h" #include "../device/devinst.h" #include "../dialogs/dsmessagebox.h" +#include "../view/view.h" #include #include @@ -30,6 +31,7 @@ #include #include #include +#include #include "libsigrok4DSL/libsigrok.h" @@ -42,14 +44,16 @@ TriggerDock::TriggerDock(QWidget *parent, SigSession &session) : QScrollArea(parent), _session(session) { - int i; + _cur_ch_num = 16; + if (_session.get_device()) { + GVariant *gvar = _session.get_device()->get_config(NULL, NULL, SR_CONF_TOTAL_CH_NUM); + if (gvar != NULL) { + _cur_ch_num = g_variant_get_int16(gvar); + g_variant_unref(gvar); + } + } _widget = new QWidget(this); - - QFont font("Monaco"); - font.setStyleHint(QFont::Monospace); - font.setFixedPitch(true); - _simple_radioButton = new QRadioButton(_widget); _simple_radioButton->setChecked(true); _adv_radioButton = new QRadioButton(_widget); @@ -66,189 +70,15 @@ TriggerDock::TriggerDock(QWidget *parent, SigSession &session) : _stages_label = new QLabel(_widget); _stages_label->setDisabled(true); stages_comboBox = new QComboBox(_widget); - for (i = 1; i <= TriggerStages; i++) + for (int i = 1; i <= TriggerStages; i++) stages_comboBox->addItem(QString::number(i)); //stages_comboBox->setCurrentIndex(stages_comboBox->count() - 1); stages_comboBox->setDisabled(true); - _stage_tabWidget = new QTabWidget(_widget); - _stage_tabWidget->setTabPosition(QTabWidget::East); - //_stage_tabWidget->setDisabled(true); - _stage_tabWidget->setUsesScrollButtons(false); - - QRegExp value_rx("[10XRFCxrfc ]+"); - QValidator *value_validator = new QRegExpValidator(value_rx, _widget); - for (i = 0; i < TriggerStages; i++) { - QComboBox *_logic_comboBox = new QComboBox(_widget); - _logic_comboBox->addItem(tr("Or")); - _logic_comboBox->addItem(tr("And")); - _logic_comboBox->setCurrentIndex(1); - _logic_comboBox_list.push_back(_logic_comboBox); - - QLineEdit *_value0_lineEdit = new QLineEdit("X X X X X X X X X X X X X X X X", _widget); - _value0_lineEdit->setFont(font); - _value0_lineEdit->setValidator(value_validator); - _value0_lineEdit->setMaxLength(TriggerProbes * 2 - 1); - _value0_lineEdit->setInputMask("X X X X X X X X X X X X X X X X"); - _value0_lineEdit->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred); - _value0_lineEdit_list.push_back(_value0_lineEdit); - QSpinBox *_count_spinBox = new QSpinBox(_widget); - _count_spinBox->setRange(1, INT32_MAX); - _count_spinBox->setButtonSymbols(QAbstractSpinBox::NoButtons); - _count_spinBox_list.push_back(_count_spinBox); - QComboBox *_inv0_comboBox = new QComboBox(_widget); - _inv0_comboBox->addItem(tr("==")); - _inv0_comboBox->addItem(tr("!=")); - _inv0_comboBox_list.push_back(_inv0_comboBox); - - QLineEdit *_value1_lineEdit = new QLineEdit("X X X X X X X X X X X X X X X X", _widget); - _value1_lineEdit->setFont(font); - _value1_lineEdit->setValidator(value_validator); - _value1_lineEdit->setMaxLength(TriggerProbes * 2 - 1); - _value1_lineEdit->setInputMask("X X X X X X X X X X X X X X X X"); - _value1_lineEdit->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred); - _value1_lineEdit_list.push_back(_value1_lineEdit); - QComboBox *_inv1_comboBox = new QComboBox(_widget); - _inv1_comboBox->addItem(tr("==")); - _inv1_comboBox->addItem(tr("!=")); - _inv1_comboBox_list.push_back(_inv1_comboBox); - - QCheckBox *_contiguous_checkbox = new QCheckBox(_widget); - _contiguous_checkbox_list.push_back(_contiguous_checkbox); - - QLabel *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 ", _widget); - QLabel *inv_exp_label = new QLabel(_widget); - _inv_exp_label_list.push_back(inv_exp_label); - QLabel *count_exp_label = new QLabel(_widget); - _count_exp_label_list.push_back(count_exp_label); - value_exp_label->setFont(font); - - QVBoxLayout *stage_layout = new QVBoxLayout(); - QGridLayout *stage_glayout = new QGridLayout(); - stage_glayout->setVerticalSpacing(5); - - stage_glayout->addWidget(value_exp_label, 1, 0); - stage_glayout->addWidget(inv_exp_label, 1, 1); - stage_glayout->addWidget(_value0_lineEdit, 2, 0); - stage_glayout->addWidget(_inv0_comboBox, 2, 1); - stage_glayout->addWidget(_logic_comboBox, 2, 2); - stage_glayout->addWidget(_value1_lineEdit, 3, 0); - stage_glayout->addWidget(_inv1_comboBox, 3, 1); - - stage_glayout->addWidget(new QLabel(_widget), 4, 0); - - QLabel *contiguous_label = new QLabel(_widget); - _contiguous_label_list.push_back(contiguous_label); - stage_glayout->addWidget(contiguous_label, 5, 1, 1, 2); - stage_glayout->addWidget(_contiguous_checkbox, 5, 0, 1, 1, Qt::AlignRight); - stage_glayout->addWidget(count_exp_label, 6, 1, 1, 2); - stage_glayout->addWidget(_count_spinBox, 6, 0); - - stage_layout->addLayout(stage_glayout); - stage_layout->addSpacing(20); - QLabel *stage_note_label = new QLabel(_widget); - _stage_note_label_list.push_back(stage_note_label); - stage_layout->addWidget(stage_note_label); - stage_layout->addStretch(1); - - QGroupBox *stage_groupBox = new QGroupBox(_widget); - stage_groupBox->setFlat(true); - stage_groupBox->setLayout(stage_layout); - _stage_groupBox_list.push_back(stage_groupBox); - - _stage_tabWidget->addTab((QWidget *)stage_groupBox, QString::number(i)); - - connect(_value0_lineEdit, SIGNAL(editingFinished()), this, SLOT(value_changed())); - connect(_value1_lineEdit, SIGNAL(editingFinished()), this, SLOT(value_changed())); - } - - _serial_start_label = new QLabel(_widget); - _serial_start_lineEdit = new QLineEdit("X X X X X X X X X X X X X X X X", _widget); - _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(_widget); - _serial_stop_lineEdit = new QLineEdit("X X X X X X X X X X X X X X X X", _widget); - _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(_widget); - _serial_edge_lineEdit = new QLineEdit("X X X X X X X X X X X X X X X X", _widget); - _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_label = new QLabel(_widget); - _serial_data_comboBox = new QComboBox(_widget); - for(i = 0; i < TriggerProbes; i++) - _serial_data_comboBox->addItem(QString::number(i)); - - _serial_value_label = new QLabel(_widget); - _serial_value_lineEdit = new QLineEdit("X X X X X X X X X X X X X X X X", _widget); - _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); - - _serial_bits_comboBox = new QComboBox(_widget); - for(i = 1; i <= 16; i++) - _serial_bits_comboBox->addItem(QString::number(i)); - - 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", _widget); - serial_value_exp_label->setFont(font); - - QVBoxLayout *serial_layout = new QVBoxLayout(); - QGridLayout *serial_glayout = new QGridLayout(); - serial_glayout->setVerticalSpacing(5); - serial_glayout->addWidget(serial_value_exp_label, 1, 1, 1, 3); - serial_glayout->addWidget(_serial_start_label, 2, 0); - serial_glayout->addWidget(_serial_start_lineEdit, 2, 1, 1, 3); - serial_glayout->addWidget(new QLabel(_widget), 2, 4); - serial_glayout->addWidget(_serial_stop_label, 3, 0); - serial_glayout->addWidget(_serial_stop_lineEdit, 3, 1, 1, 3); - serial_glayout->addWidget(_serial_edge_label, 4, 0); - serial_glayout->addWidget(_serial_edge_lineEdit, 4, 1, 1, 3); - - serial_glayout->addWidget(new QLabel(_widget), 5, 0, 1, 5); - serial_glayout->addWidget(_serial_data_label, 6, 0); - serial_glayout->addWidget(_serial_data_comboBox, 6, 1); - _data_bits_label = new QLabel(_widget); - serial_glayout->addWidget(_data_bits_label, 7, 0); - serial_glayout->addWidget(_serial_bits_comboBox, 7, 1); - serial_glayout->addWidget(_serial_value_label, 8, 0); - serial_glayout->addWidget(_serial_value_lineEdit, 8, 1, 1, 3); - - _serial_note_label = new QLabel(_widget); - serial_layout->addLayout(serial_glayout); - serial_layout->addSpacing(20); - serial_layout->addWidget(_serial_note_label); - serial_layout->addStretch(1); - - _serial_groupBox = new QGroupBox(_widget); - _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_value_lineEdit, SIGNAL(editingFinished()), this, SLOT(value_changed())); - - _adv_tabWidget = new QTabWidget(_widget); _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")); + setup_adv_tab(); connect(_simple_radioButton, SIGNAL(clicked()), this, SLOT(simple_trigger())); connect(_adv_radioButton, SIGNAL(clicked()), this, SLOT(adv_trigger())); @@ -383,17 +213,16 @@ void TriggerDock::widget_enable(int index) { (void) index; - int i; int enable_stages; _stages_label->setDisabled(false); stages_comboBox->setVisible(true); stages_comboBox->setDisabled(false); _adv_tabWidget->setDisabled(false); enable_stages = stages_comboBox->currentText().toInt(); - for (i = 0; i < enable_stages; i++) { + for (int i = 0; i < enable_stages; i++) { _stage_tabWidget->setTabEnabled(i, true); } - for (i = enable_stages; i < TriggerStages; i++) { + for (int i = enable_stages; i < TriggerStages; i++) { _stage_tabWidget->setTabEnabled(i, false); } } @@ -401,8 +230,16 @@ void TriggerDock::widget_enable(int index) void TriggerDock::value_changed() { QLineEdit* sc=dynamic_cast(sender()); - if(sc != NULL) + if(sc != NULL) { + for (int i = 0; i < TriggerProbes*2-1; i++) { + if ((i >= sc->text().size()) || (i % 2 == 0 && sc->text().at(i) == ' ')) { + sc->setText(sc->text().insert(i, 'X')); + i++; + } + } sc->setText(sc->text().toUpper()); + lineEdit_highlight(sc); + } } void TriggerDock::device_updated() @@ -441,6 +278,18 @@ void TriggerDock::device_updated() } } } + + gvar = _session.get_device()->get_config(NULL, NULL, SR_CONF_TOTAL_CH_NUM); + if (gvar != NULL) { + int ch_num = g_variant_get_int16(gvar); + g_variant_unref(gvar); + + if (ch_num != _cur_ch_num) { + _cur_ch_num = ch_num; + setup_adv_tab(); + retranslateUi(); + } + } } bool TriggerDock::commit_trigger() @@ -462,43 +311,60 @@ bool TriggerDock::commit_trigger() // trigger stage update ds_trigger_set_stage(stages_comboBox->currentText().toInt() - 1); - int i; // trigger value update if (_adv_tabWidget->currentIndex() == 0) { - for (i = 0; i < stages_comboBox->currentText().toInt(); i++) { - ds_trigger_stage_set_value(i, TriggerProbes, - _value0_lineEdit_list.at(i)->text().toLocal8Bit().data(), - _value1_lineEdit_list.at(i)->text().toLocal8Bit().data()); + for (int i = 0; i < stages_comboBox->currentText().toInt(); i++) { + QString value0_str, value1_str; + if (_cur_ch_num == 32) { + value0_str = _value0_ext32_lineEdit_list.at(i)->text() + " " + _value0_lineEdit_list.at(i)->text(); + value1_str = _value1_ext32_lineEdit_list.at(i)->text() + " " + _value1_lineEdit_list.at(i)->text(); + } else { + value0_str = _value0_lineEdit_list.at(i)->text(); + value1_str = _value1_lineEdit_list.at(i)->text(); + } + ds_trigger_stage_set_value(i, _cur_ch_num, value0_str.toLocal8Bit().data(), + value1_str.toLocal8Bit().data()); } } else if(_adv_tabWidget->currentIndex() == 1){ - ds_trigger_stage_set_value(0, TriggerProbes, - _serial_start_lineEdit->text().toLocal8Bit().data(), - _serial_stop_lineEdit->text().toLocal8Bit().data()); - ds_trigger_stage_set_value(1, TriggerProbes, - _serial_edge_lineEdit->text().toLocal8Bit().data(), - _value1_lineEdit_list.at(1)->text().toLocal8Bit().data()); + QString start_str, stop_str, edge_str, comp_str; + if (_cur_ch_num == 32) { + start_str = _serial_start_ext32_lineEdit->text() + " " + _serial_start_lineEdit->text(); + stop_str = _serial_stop_ext32_lineEdit->text() + " " + _serial_stop_lineEdit->text(); + edge_str = _serial_edge_ext32_lineEdit->text() + " " + _serial_edge_lineEdit->text(); + comp_str = _value1_ext32_lineEdit_list.at(1)->text() + " " + _value1_lineEdit_list.at(1)->text(); + } else { + start_str = _serial_start_lineEdit->text(); + stop_str = _serial_stop_lineEdit->text(); + edge_str = _serial_edge_lineEdit->text(); + comp_str = _value1_lineEdit_list.at(1)->text(); + } + ds_trigger_stage_set_value(0, _cur_ch_num, start_str.toLocal8Bit().data(), + stop_str.toLocal8Bit().data()); + ds_trigger_stage_set_value(1, _cur_ch_num, edge_str.toLocal8Bit().data(), + comp_str.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] = '0'; - else if (i%2 == 0) - channel[i] = 'X'; + QString channel = "X X X X X X X X X X X X X X X X"; + QString channel_ext32 = "X X X X X X X X X X X X X X X X"; + if (_cur_ch_num == 32) { + if (data_channel < 16) + channel.replace(30 - 2*data_channel, 1, '0'); else - channel[i] = ' '; + channel_ext32.replace(30 - 2*(data_channel - 16), 1, '0'); + } else { + channel.replace(30 - 2*data_channel, 1, '0'); } ds_trigger_stage_set_value(2, TriggerProbes, - channel, - _value1_lineEdit_list.at(2)->text().toLocal8Bit().data()); + channel.toLocal8Bit().data(), + channel_ext32.toLocal8Bit().data()); ds_trigger_stage_set_value(STriggerDataStage, TriggerProbes, _serial_value_lineEdit->text().toLocal8Bit().data(), _value1_lineEdit_list.at(3)->text().toLocal8Bit().data()); } // trigger logic update - for (i = 0; i < stages_comboBox->currentText().toInt(); i++) { + for (int i = 0; i < stages_comboBox->currentText().toInt(); i++) { const char logic = (_contiguous_checkbox_list.at(i)->isChecked() << 1) + _logic_comboBox_list.at(i)->currentIndex(); ds_trigger_stage_set_logic(i, TriggerProbes, @@ -506,7 +372,7 @@ bool TriggerDock::commit_trigger() } // trigger inv update - for (i = 0; i < stages_comboBox->currentText().toInt(); i++) { + for (int i = 0; i < stages_comboBox->currentText().toInt(); i++) { ds_trigger_stage_set_inv(i, TriggerProbes, _inv0_comboBox_list.at(i)->currentIndex(), _inv1_comboBox_list.at(i)->currentIndex()); @@ -514,7 +380,7 @@ bool TriggerDock::commit_trigger() // trigger count update if (_adv_tabWidget->currentIndex() == 0) { - for (i = 0; i < stages_comboBox->currentText().toInt(); i++) { + for (int i = 0; i < stages_comboBox->currentText().toInt(); i++) { ds_trigger_stage_set_count(i, TriggerProbes, _count_spinBox_list.at(i)->value(), 0); @@ -564,6 +430,14 @@ QJsonObject TriggerDock::get_session() trigSes[logic_str] = _logic_comboBox_list.at(i)->currentIndex(); trigSes[count_str] = _count_spinBox_list.at(i)->value(); trigSes[conti_str] = _contiguous_checkbox_list.at(i)->isChecked(); + + if (_cur_ch_num == 32) { + QString value0_ext32_str = "stageTriggerExt32Value0" + QString::number(i); + QString value1_ext32_str = "stageTriggerExt32Value1" + QString::number(i); + + trigSes[value0_ext32_str] = _value0_ext32_lineEdit_list.at(i)->text(); + trigSes[value1_ext32_str] = _value1_ext32_lineEdit_list.at(i)->text(); + } } trigSes["serialTriggerStart"] = _serial_start_lineEdit->text(); @@ -573,6 +447,12 @@ QJsonObject TriggerDock::get_session() trigSes["serialTriggerData"] = _serial_value_lineEdit->text(); trigSes["serialTriggerBits"] = _serial_bits_comboBox->currentIndex(); + if (_cur_ch_num == 32) { + trigSes["serialTriggerExt32Start"] = _serial_start_ext32_lineEdit->text(); + trigSes["serialTriggerExt32Stop"] = _serial_stop_ext32_lineEdit->text(); + trigSes["serialTriggerExt32Clock"] = _serial_edge_ext32_lineEdit->text(); + } + return trigSes; } @@ -597,21 +477,408 @@ void TriggerDock::set_session(QJsonObject ses) QString conti_str = "stageTriggerContiguous" + QString::number(i); _value0_lineEdit_list.at(i)->setText(ses[value0_str].toString()); + lineEdit_highlight(_value0_lineEdit_list.at(i)); _value1_lineEdit_list.at(i)->setText(ses[value1_str].toString()); + lineEdit_highlight(_value1_lineEdit_list.at(i)); _inv0_comboBox_list.at(i)->setCurrentIndex(ses[inv0_str].toDouble()); _inv1_comboBox_list.at(i)->setCurrentIndex(ses[inv1_str].toDouble()); _logic_comboBox_list.at(i)->setCurrentIndex(ses[logic_str].toDouble()); _count_spinBox_list.at(i)->setValue(ses[count_str].toDouble()); _contiguous_checkbox_list.at(i)->setChecked(ses[conti_str].toBool()); + + if (_cur_ch_num == 32) { + QString value0_ext32_str = "stageTriggerExt32Value0" + QString::number(i); + QString value1_ext32_str = "stageTriggerExt32Value1" + QString::number(i); + + if (ses.contains(value0_ext32_str)) { + _value0_ext32_lineEdit_list.at(i)->setText(ses[value0_ext32_str].toString()); + lineEdit_highlight(_value0_ext32_lineEdit_list.at(i)); + } + if (ses.contains(value1_ext32_str)) { + _value1_ext32_lineEdit_list.at(i)->setText(ses[value1_ext32_str].toString()); + lineEdit_highlight(_value1_ext32_lineEdit_list.at(i)); + } + } } _serial_start_lineEdit->setText(ses["serialTriggerStart"].toString()); + lineEdit_highlight(_serial_start_lineEdit); _serial_stop_lineEdit->setText(ses["serialTriggerStop"].toString()); + lineEdit_highlight(_serial_stop_lineEdit); _serial_edge_lineEdit->setText(ses["serialTriggerClock"].toString()); + lineEdit_highlight(_serial_edge_lineEdit); _serial_data_comboBox->setCurrentIndex(ses["serialTriggerChannel"].toDouble()); _serial_value_lineEdit->setText(ses["serialTriggerData"].toString()); + lineEdit_highlight(_serial_value_lineEdit); _serial_bits_comboBox->setCurrentIndex(ses["serialTriggerBits"].toDouble()); + + if (_cur_ch_num == 32) { + if (ses.contains("serialTriggerExt32Start")) { + _serial_start_ext32_lineEdit->setText(ses["serialTriggerExt32Start"].toString()); + lineEdit_highlight(_serial_start_ext32_lineEdit); + } + if (ses.contains("serialTriggerExt32Stop")) { + _serial_stop_ext32_lineEdit->setText(ses["serialTriggerExt32Stop"].toString()); + lineEdit_highlight(_serial_stop_ext32_lineEdit); + } + if (ses.contains("serialTriggerExt32Clock")) { + _serial_edge_ext32_lineEdit->setText(ses["serialTriggerExt32Clock"].toString()); + lineEdit_highlight(_serial_edge_ext32_lineEdit); + } + } +} + +void TriggerDock::setup_adv_tab() +{ + int row; + + for (int i = _adv_tabWidget->count(); i > 0; i--) + { + _adv_tabWidget->widget(i-1)->deleteLater(); + _adv_tabWidget->removeTab(i-1); + } + _logic_comboBox_list.clear(); + _value0_lineEdit_list.clear(); + _count_spinBox_list.clear(); + _inv0_comboBox_list.clear(); + _value1_lineEdit_list.clear(); + _inv1_comboBox_list.clear(); + _contiguous_checkbox_list.clear(); + _inv_exp_label_list.clear(); + _count_exp_label_list.clear(); + _contiguous_label_list.clear(); + _stage_note_label_list.clear(); + _stage_groupBox_list.clear(); + + _value0_ext32_lineEdit_list.clear(); + _value1_ext32_lineEdit_list.clear(); + + QFont font("Monaco"); + font.setStyleHint(QFont::Monospace); + font.setFixedPitch(true); + + _stage_tabWidget = new QTabWidget(_widget); + _stage_tabWidget->setTabPosition(QTabWidget::East); + //_stage_tabWidget->setDisabled(true); + _stage_tabWidget->setUsesScrollButtons(false); + + const QString mask = "N N N N N N N N N N N N N N N N"; + QRegExp value_rx("[10XRFCxrfc ]+"); + QValidator *value_validator = new QRegExpValidator(value_rx, _stage_tabWidget); + for (int i = 0; i < TriggerStages; i++) { + QComboBox *_logic_comboBox = new QComboBox(_stage_tabWidget); + _logic_comboBox->addItem(tr("Or")); + _logic_comboBox->addItem(tr("And")); + _logic_comboBox->setCurrentIndex(1); + _logic_comboBox_list.push_back(_logic_comboBox); + + QLineEdit *_value0_lineEdit = new QLineEdit("X X X X X X X X X X X X X X X X", _stage_tabWidget); + _value0_lineEdit->setFont(font); + _value0_lineEdit->setValidator(value_validator); + _value0_lineEdit->setMaxLength(TriggerProbes * 2 - 1); + _value0_lineEdit->setInputMask(mask); + _value0_lineEdit->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred); + _value0_lineEdit_list.push_back(_value0_lineEdit); + QSpinBox *_count_spinBox = new QSpinBox(_stage_tabWidget); + _count_spinBox->setRange(1, INT32_MAX); + _count_spinBox->setButtonSymbols(QAbstractSpinBox::NoButtons); + _count_spinBox_list.push_back(_count_spinBox); + QComboBox *_inv0_comboBox = new QComboBox(_stage_tabWidget); + _inv0_comboBox->addItem(tr("==")); + _inv0_comboBox->addItem(tr("!=")); + _inv0_comboBox_list.push_back(_inv0_comboBox); + + QLineEdit *_value1_lineEdit = new QLineEdit("X X X X X X X X X X X X X X X X", _stage_tabWidget); + _value1_lineEdit->setFont(font); + _value1_lineEdit->setValidator(value_validator); + _value1_lineEdit->setMaxLength(TriggerProbes * 2 - 1); + _value1_lineEdit->setInputMask(mask); + _value1_lineEdit->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred); + _value1_lineEdit_list.push_back(_value1_lineEdit); + QComboBox *_inv1_comboBox = new QComboBox(_stage_tabWidget); + _inv1_comboBox->addItem(tr("==")); + _inv1_comboBox->addItem(tr("!=")); + _inv1_comboBox_list.push_back(_inv1_comboBox); + + connect(_value0_lineEdit, SIGNAL(editingFinished()), this, SLOT(value_changed())); + connect(_value1_lineEdit, SIGNAL(editingFinished()), this, SLOT(value_changed())); + + QCheckBox *_contiguous_checkbox = new QCheckBox(_stage_tabWidget); + _contiguous_checkbox_list.push_back(_contiguous_checkbox); + + QLabel *value0_exp_label = new QLabel("15 ---------- 8 7 ----------- 0 ", _stage_tabWidget); + value0_exp_label->setFont(font); + QLabel *inv0_exp_label = new QLabel(_stage_tabWidget); + _inv_exp_label_list.push_back(inv0_exp_label); + QLabel *value1_exp_label = new QLabel("15 ---------- 8 7 ----------- 0 ", _stage_tabWidget); + value1_exp_label->setFont(font); + QLabel *inv1_exp_label = new QLabel(_stage_tabWidget); + _inv_exp_label_list.push_back(inv1_exp_label); + + QLabel *count_exp_label = new QLabel(_stage_tabWidget); + _count_exp_label_list.push_back(count_exp_label); + + QVBoxLayout *stage_layout = new QVBoxLayout(); + QGridLayout *stage_glayout = new QGridLayout(); + stage_glayout->setVerticalSpacing(5); + + row = 1; + if (_cur_ch_num == 32) { + QLineEdit *_value0_ext32_lineEdit = new QLineEdit("X X X X X X X X X X X X X X X X", _stage_tabWidget); + _value0_ext32_lineEdit->setFont(font); + _value0_ext32_lineEdit->setValidator(value_validator); + _value0_ext32_lineEdit->setMaxLength(TriggerProbes * 2 - 1); + _value0_ext32_lineEdit->setInputMask(mask); + _value0_ext32_lineEdit->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred); + _value0_ext32_lineEdit_list.push_back(_value0_ext32_lineEdit); + + QLineEdit *_value1_ext32_lineEdit = new QLineEdit("X X X X X X X X X X X X X X X X", _stage_tabWidget); + _value1_ext32_lineEdit->setFont(font); + _value1_ext32_lineEdit->setValidator(value_validator); + _value1_ext32_lineEdit->setMaxLength(TriggerProbes * 2 - 1); + _value1_ext32_lineEdit->setInputMask(mask); + _value1_ext32_lineEdit->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred); + _value1_ext32_lineEdit_list.push_back(_value1_ext32_lineEdit); + + QLabel *value0_ext32_exp_label = new QLabel("31 --------- 24 23 ---------- 16", _stage_tabWidget); + value0_ext32_exp_label->setFont(font); + QLabel *value1_ext32_exp_label = new QLabel("31 --------- 24 23 ---------- 16", _stage_tabWidget); + value1_ext32_exp_label->setFont(font); + + stage_glayout->addWidget(value0_ext32_exp_label, row++, 0); + stage_glayout->addWidget(_value0_ext32_lineEdit, row++, 0); + stage_glayout->addWidget(value0_exp_label, row, 0); + stage_glayout->addWidget(inv0_exp_label, row++, 1); + stage_glayout->addWidget(_value0_lineEdit, row, 0); + stage_glayout->addWidget(_inv0_comboBox, row, 1); + stage_glayout->addWidget(_logic_comboBox, row++, 2); + + stage_glayout->addWidget(new QLabel(_stage_tabWidget), row++, 0); + + stage_glayout->addWidget(value1_ext32_exp_label, row++, 0); + stage_glayout->addWidget(_value1_ext32_lineEdit, row++, 0); + stage_glayout->addWidget(value1_exp_label, row, 0); + stage_glayout->addWidget(inv1_exp_label, row++, 1); + stage_glayout->addWidget(_value1_lineEdit, row, 0); + stage_glayout->addWidget(_inv1_comboBox, row++, 1); + + connect(_value0_ext32_lineEdit, SIGNAL(editingFinished()), this, SLOT(value_changed())); + connect(_value1_ext32_lineEdit, SIGNAL(editingFinished()), this, SLOT(value_changed())); + } else { + stage_glayout->addWidget(value0_exp_label, row, 0); + stage_glayout->addWidget(inv0_exp_label, row++, 1); + stage_glayout->addWidget(_value0_lineEdit, row, 0); + stage_glayout->addWidget(_inv0_comboBox, row, 1); + stage_glayout->addWidget(_logic_comboBox, row++, 2); + + stage_glayout->addWidget(new QLabel(_stage_tabWidget), row++, 0); + + stage_glayout->addWidget(value1_exp_label, row, 0); + stage_glayout->addWidget(inv1_exp_label, row++, 1); + stage_glayout->addWidget(_value1_lineEdit, row, 0); + stage_glayout->addWidget(_inv1_comboBox, row++, 1); + } + + stage_glayout->addWidget(new QLabel(_stage_tabWidget), row++, 0); + + QLabel *contiguous_label = new QLabel(_stage_tabWidget); + _contiguous_label_list.push_back(contiguous_label); + stage_glayout->addWidget(contiguous_label, row, 1, 1, 2); + stage_glayout->addWidget(_contiguous_checkbox, row++, 0, 1, 1, Qt::AlignRight); + stage_glayout->addWidget(count_exp_label, row, 1, 1, 2); + stage_glayout->addWidget(_count_spinBox, row++, 0); + + stage_layout->addLayout(stage_glayout); + stage_layout->addSpacing(20); + QLabel *stage_note_label = new QLabel(_stage_tabWidget); + _stage_note_label_list.push_back(stage_note_label); + stage_layout->addWidget(stage_note_label); + stage_layout->addStretch(1); + + QGroupBox *stage_groupBox = new QGroupBox(_stage_tabWidget); + stage_groupBox->setFlat(true); + stage_groupBox->setLayout(stage_layout); + _stage_groupBox_list.push_back(stage_groupBox); + + _stage_tabWidget->addTab((QWidget *)stage_groupBox, QString::number(i)); + } + + _serial_groupBox = new QGroupBox(_widget); + _serial_groupBox->setFlat(true); + + _serial_start_label = new QLabel(_serial_groupBox); + _serial_start_lineEdit = new QLineEdit("X X X X X X X X X X X X X X X X", _serial_groupBox); + _serial_start_lineEdit->setFont(font); + _serial_start_lineEdit->setValidator(value_validator); + _serial_start_lineEdit->setMaxLength(TriggerProbes * 2 - 1); + _serial_start_lineEdit->setInputMask(mask); + _serial_start_lineEdit->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred); + + _serial_stop_label = new QLabel(_serial_groupBox); + _serial_stop_lineEdit = new QLineEdit("X X X X X X X X X X X X X X X X", _serial_groupBox); + _serial_stop_lineEdit->setFont(font); + _serial_stop_lineEdit->setValidator(value_validator); + _serial_stop_lineEdit->setMaxLength(TriggerProbes * 2 - 1); + _serial_stop_lineEdit->setInputMask(mask); + _serial_stop_lineEdit->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred); + + _serial_edge_label = new QLabel(_serial_groupBox); + _serial_edge_lineEdit = new QLineEdit("X X X X X X X X X X X X X X X X", _serial_groupBox); + _serial_edge_lineEdit->setFont(font); + _serial_edge_lineEdit->setValidator(value_validator); + _serial_edge_lineEdit->setMaxLength(TriggerProbes * 2 - 1); + _serial_edge_lineEdit->setInputMask(mask); + _serial_edge_lineEdit->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred); + + _serial_data_label = new QLabel(_serial_groupBox); + _serial_data_comboBox = new QComboBox(_serial_groupBox); + for(int i = 0; i < _cur_ch_num; i++) + _serial_data_comboBox->addItem(QString::number(i)); + + _serial_value_label = new QLabel(_serial_groupBox); + _serial_value_lineEdit = new QLineEdit("X X X X X X X X X X X X X X X X", _serial_groupBox); + _serial_value_lineEdit->setFont(font); + _serial_value_lineEdit->setValidator(value_validator); + _serial_value_lineEdit->setMaxLength(TriggerProbes * 2 - 1); + _serial_value_lineEdit->setInputMask(mask); + _serial_value_lineEdit->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred); + + _serial_bits_comboBox = new QComboBox(_serial_groupBox); + for(int i = 1; i <= 16; i++) + _serial_bits_comboBox->addItem(QString::number(i)); + + + QVBoxLayout *serial_layout = new QVBoxLayout(); + QGridLayout *serial_glayout = new QGridLayout(); + serial_glayout->setVerticalSpacing(5); + + row = 1; + if (_cur_ch_num == 32) { + _serial_start_ext32_lineEdit = new QLineEdit("X X X X X X X X X X X X X X X X", _serial_groupBox); + _serial_start_ext32_lineEdit->setFont(font); + _serial_start_ext32_lineEdit->setValidator(value_validator); + _serial_start_ext32_lineEdit->setMaxLength(TriggerProbes * 2 - 1); + _serial_start_ext32_lineEdit->setInputMask(mask); + _serial_start_ext32_lineEdit->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred); + + _serial_stop_ext32_lineEdit = new QLineEdit("X X X X X X X X X X X X X X X X", _serial_groupBox); + _serial_stop_ext32_lineEdit->setFont(font); + _serial_stop_ext32_lineEdit->setValidator(value_validator); + _serial_stop_ext32_lineEdit->setMaxLength(TriggerProbes * 2 - 1); + _serial_stop_ext32_lineEdit->setInputMask(mask); + _serial_stop_ext32_lineEdit->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred); + + _serial_edge_ext32_lineEdit = new QLineEdit("X X X X X X X X X X X X X X X X", _serial_groupBox); + _serial_edge_ext32_lineEdit->setFont(font); + _serial_edge_ext32_lineEdit->setValidator(value_validator); + _serial_edge_ext32_lineEdit->setMaxLength(TriggerProbes * 2 - 1); + _serial_edge_ext32_lineEdit->setInputMask(mask); + _serial_edge_ext32_lineEdit->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred); + + connect(_serial_start_ext32_lineEdit, SIGNAL(editingFinished()), this, SLOT(value_changed())); + connect(_serial_stop_ext32_lineEdit, SIGNAL(editingFinished()), this, SLOT(value_changed())); + connect(_serial_edge_ext32_lineEdit, SIGNAL(editingFinished()), this, SLOT(value_changed())); + + QLabel *serial0_value_exp_label = new QLabel("31 --------- 24 23 ---------- 16", _serial_groupBox); + serial0_value_exp_label->setFont(font); + serial_glayout->addWidget(serial0_value_exp_label, row++, 1, 1, 3); + serial_glayout->addWidget(_serial_start_ext32_lineEdit, row, 1, 1, 3); + serial_glayout->addWidget(new QLabel(_serial_groupBox), row++, 4); + QLabel *serial1_value_exp_label = new QLabel("15 ---------- 8 7 ----------- 0 ", _serial_groupBox); + serial1_value_exp_label->setFont(font); + serial_glayout->addWidget(serial1_value_exp_label, row++, 1, 1, 3); + serial_glayout->addWidget(_serial_start_label, row, 0); + serial_glayout->addWidget(_serial_start_lineEdit, row, 1, 1, 3); + serial_glayout->addWidget(new QLabel(_serial_groupBox), row++, 4); + + serial_glayout->addWidget(new QLabel(_stage_tabWidget), row++, 0); + + QLabel *serial2_value_exp_label = new QLabel("31 --------- 24 23 ---------- 16", _serial_groupBox); + serial2_value_exp_label->setFont(font); + serial_glayout->addWidget(serial2_value_exp_label, row++, 1, 1, 3); + serial_glayout->addWidget(_serial_stop_ext32_lineEdit, row++, 1, 1, 3); + QLabel *serial3_value_exp_label = new QLabel("15 ---------- 8 7 ----------- 0 ", _serial_groupBox); + serial3_value_exp_label->setFont(font); + serial_glayout->addWidget(serial3_value_exp_label, row++, 1, 1, 3); + serial_glayout->addWidget(_serial_stop_label, row, 0); + serial_glayout->addWidget(_serial_stop_lineEdit, row++, 1, 1, 3); + + serial_glayout->addWidget(new QLabel(_stage_tabWidget), row++, 0); + + QLabel *serial4_value_exp_label = new QLabel("31 --------- 24 23 ---------- 16", _serial_groupBox); + serial4_value_exp_label->setFont(font); + serial_glayout->addWidget(serial4_value_exp_label, row++, 1, 1, 3); + serial_glayout->addWidget(_serial_edge_ext32_lineEdit, row++, 1, 1, 3); + QLabel *serial5_value_exp_label = new QLabel("15 ---------- 8 7 ----------- 0 ", _serial_groupBox); + serial5_value_exp_label->setFont(font); + serial_glayout->addWidget(serial5_value_exp_label, row++, 1, 1, 3); + serial_glayout->addWidget(_serial_edge_label, row, 0); + serial_glayout->addWidget(_serial_edge_lineEdit, row++, 1, 1, 3); + } else { + QLabel *serial0_value_exp_label = new QLabel("15 ---------- 8 7 ----------- 0 ", _serial_groupBox); + serial0_value_exp_label->setFont(font); + serial_glayout->addWidget(serial0_value_exp_label, row++, 1, 1, 3); + serial_glayout->addWidget(_serial_start_label, row, 0); + serial_glayout->addWidget(_serial_start_lineEdit, row, 1, 1, 3); + serial_glayout->addWidget(new QLabel(_serial_groupBox), row++, 4); + + serial_glayout->addWidget(new QLabel(_stage_tabWidget), row++, 0); + + QLabel *serial1_value_exp_label = new QLabel("15 ---------- 8 7 ----------- 0 ", _serial_groupBox); + serial1_value_exp_label->setFont(font); + serial_glayout->addWidget(serial1_value_exp_label, row++, 1, 1, 3); + serial_glayout->addWidget(_serial_stop_label, row, 0); + serial_glayout->addWidget(_serial_stop_lineEdit, row++, 1, 1, 3); + + serial_glayout->addWidget(new QLabel(_stage_tabWidget), row++, 0); + + QLabel *serial2_value_exp_label = new QLabel("15 ---------- 8 7 ----------- 0 ", _serial_groupBox); + serial2_value_exp_label->setFont(font); + serial_glayout->addWidget(serial2_value_exp_label, row++, 1, 1, 3); + serial_glayout->addWidget(_serial_edge_label, row, 0); + serial_glayout->addWidget(_serial_edge_lineEdit, row++, 1, 1, 3); + } + + serial_glayout->addWidget(new QLabel(_serial_groupBox), row++, 0, 1, 5); + serial_glayout->addWidget(_serial_data_label, row, 0); + serial_glayout->addWidget(_serial_data_comboBox, row++, 1); + _data_bits_label = new QLabel(_serial_groupBox); + serial_glayout->addWidget(_data_bits_label, row, 0); + serial_glayout->addWidget(_serial_bits_comboBox, row++, 1); + serial_glayout->addWidget(_serial_value_label, row, 0); + serial_glayout->addWidget(_serial_value_lineEdit, row++, 1, 1, 3); + + _serial_note_label = new QLabel(_serial_groupBox); + serial_layout->addLayout(serial_glayout); + serial_layout->addSpacing(20); + serial_layout->addWidget(_serial_note_label); + serial_layout->addStretch(1); + + _serial_groupBox->setLayout(serial_layout); + + 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_value_lineEdit, SIGNAL(editingFinished()), this, SLOT(value_changed())); + + _adv_tabWidget->addTab((QWidget *)_stage_tabWidget, tr("Stage Trigger")); + _adv_tabWidget->addTab((QWidget *)_serial_groupBox, tr("Serial Trigger")); +} + +void TriggerDock::lineEdit_highlight(QLineEdit *dst) { + if (dst == NULL) + return; + + QTextCharFormat fmt; + fmt.setForeground(view::View::Red); + QList attributes; + for (int i = 0; i < dst->text().size(); i++) { + if (dst->text().at(i) != 'X' && dst->text().at(i) != ' ') + attributes.append(QInputMethodEvent::Attribute(QInputMethodEvent::TextFormat, i-dst->cursorPosition(), 1, fmt)); + } + QInputMethodEvent event(QString(), attributes); + QCoreApplication::sendEvent(dst, &event); } } // namespace dock diff --git a/DSView/pv/dock/triggerdock.h b/DSView/pv/dock/triggerdock.h index d4338976..3dd19e68 100755 --- a/DSView/pv/dock/triggerdock.h +++ b/DSView/pv/dock/triggerdock.h @@ -78,6 +78,9 @@ private: void retranslateUi(); void reStyle(); + void setup_adv_tab(); + void lineEdit_highlight(QLineEdit *dst); + signals: public slots: @@ -94,6 +97,7 @@ private: private: SigSession &_session; + int _cur_ch_num; QWidget *_widget; QRadioButton *_simple_radioButton; @@ -112,9 +116,11 @@ private: QVector _mu_label_list; QVector _logic_comboBox_list; QVector _value0_lineEdit_list; + QVector _value0_ext32_lineEdit_list; QVector _count_spinBox_list; QVector _inv0_comboBox_list; QVector _value1_lineEdit_list; + QVector _value1_ext32_lineEdit_list; QVector _inv1_comboBox_list; QVector _contiguous_checkbox_list; @@ -122,10 +128,13 @@ private: QGroupBox *_serial_groupBox; QLabel *_serial_start_label; QLineEdit *_serial_start_lineEdit; + QLineEdit *_serial_start_ext32_lineEdit; QLabel *_serial_stop_label; QLineEdit *_serial_stop_lineEdit; + QLineEdit *_serial_stop_ext32_lineEdit; QLabel *_serial_edge_label; QLineEdit *_serial_edge_lineEdit; + QLineEdit *_serial_edge_ext32_lineEdit; QLabel *_serial_data_label; QComboBox *_serial_data_comboBox; QLabel *_serial_value_label; diff --git a/DSView/res/DSCope.bin b/DSView/res/DSCope.bin index 1133e1f7..9a4f539b 100755 Binary files a/DSView/res/DSCope.bin and b/DSView/res/DSCope.bin differ diff --git a/DSView/res/DSCope20.bin b/DSView/res/DSCope20.bin index 71bf1b28..fb765d75 100755 Binary files a/DSView/res/DSCope20.bin and b/DSView/res/DSCope20.bin differ diff --git a/DSView/res/DSCopeC20B.bin b/DSView/res/DSCopeC20B.bin index 9af97408..645da0d4 100755 Binary files a/DSView/res/DSCopeC20B.bin and b/DSView/res/DSCopeC20B.bin differ diff --git a/DSView/res/DSCopeC20P.bin b/DSView/res/DSCopeC20P.bin index 9c884cfa..1886b2f4 100755 Binary files a/DSView/res/DSCopeC20P.bin and b/DSView/res/DSCopeC20P.bin differ diff --git a/DSView/res/DSCopeU2B20.bin b/DSView/res/DSCopeU2B20.bin index 0f68bb41..752a313f 100755 Binary files a/DSView/res/DSCopeU2B20.bin and b/DSView/res/DSCopeU2B20.bin differ diff --git a/DSView/res/DSCopeU2P20.bin b/DSView/res/DSCopeU2P20.bin index aabc2891..c20e1f8a 100755 Binary files a/DSView/res/DSCopeU2P20.bin and b/DSView/res/DSCopeU2P20.bin differ diff --git a/DSView/res/DSLogic33.bin b/DSView/res/DSLogic33.bin index 1b608b53..ea7b87a3 100755 Binary files a/DSView/res/DSLogic33.bin and b/DSView/res/DSLogic33.bin differ diff --git a/DSView/res/DSLogic50.bin b/DSView/res/DSLogic50.bin index 9729be0a..b4d8cf72 100755 Binary files a/DSView/res/DSLogic50.bin and b/DSView/res/DSLogic50.bin differ diff --git a/DSView/res/DSLogicBasic.bin b/DSView/res/DSLogicBasic.bin index 33c145ce..d232d140 100755 Binary files a/DSView/res/DSLogicBasic.bin and b/DSView/res/DSLogicBasic.bin differ diff --git a/DSView/res/DSLogicPlus.bin b/DSView/res/DSLogicPlus.bin index ca4e447b..0c420e70 100755 Binary files a/DSView/res/DSLogicPlus.bin and b/DSView/res/DSLogicPlus.bin differ diff --git a/DSView/res/DSLogicPro.bin b/DSView/res/DSLogicPro.bin index 411c586b..7b2a18d1 100755 Binary files a/DSView/res/DSLogicPro.bin and b/DSView/res/DSLogicPro.bin differ diff --git a/DSView/res/DSLogicU2Basic.bin b/DSView/res/DSLogicU2Basic.bin index 39ce2e4b..b04ed19d 100755 Binary files a/DSView/res/DSLogicU2Basic.bin and b/DSView/res/DSLogicU2Basic.bin differ diff --git a/libsigrok4DSL/hardware/DSL/dsl.c b/libsigrok4DSL/hardware/DSL/dsl.c index 4a312709..035ac50c 100755 --- a/libsigrok4DSL/hardware/DSL/dsl.c +++ b/libsigrok4DSL/hardware/DSL/dsl.c @@ -63,7 +63,9 @@ const char *probeMapUnits[] = { static const char *probe_names[] = { "0", "1", "2", "3", "4", "5", "6", "7", - "8", "9", "10", "11", "12", "13", "14", "15", + "8", "9", "10", "11", "12", "13", "14", "15", + "16", "17", "18", "19", "20", "21", "22", "23", + "24", "25", "26", "27", "28", "29", "30", "31", NULL, }; @@ -701,6 +703,7 @@ SR_PRIV int dsl_fpga_arm(const struct sr_dev_inst *sdi) struct sr_usb_dev_inst *usb; struct libusb_device_handle *hdl; struct DSL_setting setting; + struct DSL_setting_ext32 setting_ext32; int ret; int transferred; int i; @@ -712,6 +715,8 @@ SR_PRIV int dsl_fpga_arm(const struct sr_dev_inst *sdi) struct ctl_wr_cmd wr_cmd; struct ctl_rd_cmd rd_cmd; uint8_t rd_cmd_data; + gboolean qutr_trig; + gboolean half_trig; devc = sdi->priv; usb = sdi->conn; @@ -727,7 +732,11 @@ SR_PRIV int dsl_fpga_arm(const struct sr_dev_inst *sdi) setting.dso_count_header = 0x0902; setting.trig_header = 0x40a0; setting.end_sync = 0xfa5afa5a; - setting.misc_align = 0xffff; + + setting_ext32.sync = 0xf5a5f5a5; + setting_ext32.trig_header = 0x6060; + setting_ext32.align_bytes = 0xffff; + setting_ext32.end_sync = 0xfa5afa5a; // basic configuration setting.mode = (trigger->trigger_en << TRIG_EN_BIT) + @@ -735,8 +744,8 @@ SR_PRIV int dsl_fpga_arm(const struct sr_dev_inst *sdi) (devc->clock_edge << CLK_EDGE_BIT) + (devc->rle_mode << RLE_MODE_BIT) + ((sdi->mode == DSO) << DSO_MODE_BIT) + - (((devc->cur_samplerate == (2 * channel_modes[devc->ch_mode].hw_max_samplerate)) && sdi->mode != DSO) << HALF_MODE_BIT) + - ((devc->cur_samplerate == (4 * channel_modes[devc->ch_mode].hw_max_samplerate)) << QUAR_MODE_BIT) + + ((devc->cur_samplerate == devc->profile->dev_caps.half_samplerate) << HALF_MODE_BIT) + + ((devc->cur_samplerate == devc->profile->dev_caps.quarter_samplerate) << QUAR_MODE_BIT) + ((sdi->mode == ANALOG) << ANALOG_MODE_BIT) + ((devc->filter == SR_FILTER_1T) << FILTER_BIT) + (devc->instant << INSTANT_BIT) + @@ -778,66 +787,39 @@ SR_PRIV int dsl_fpga_arm(const struct sr_dev_inst *sdi) setting.tpos_h = tmp_u32 >> 16; // trigger global settings - setting.trig_glb = ((ch_num & 0xf) << 4) + - trigger->trigger_stages; + setting.trig_glb = ((ch_num & 0x1f) << 8) + + (trigger->trigger_stages & 0x00ff); // channel enable mapping - setting.ch_en = 0; + setting.ch_en_l = 0; + setting.ch_en_h = 0; for (l = sdi->channels; l; l = l->next) { struct sr_channel *probe = (struct sr_channel *)l->data; - setting.ch_en += probe->enabled << probe->index; + if (probe->index < 16) + setting.ch_en_l += probe->enabled << probe->index; + else + setting.ch_en_h += probe->enabled << (probe->index - 16); } // trigger advanced configuration if (trigger->trigger_mode == SIMPLE_TRIGGER) { - setting.trig_mask0[0] = ds_trigger_get_mask0(TriggerStages); - setting.trig_mask1[0] = ds_trigger_get_mask1(TriggerStages); + qutr_trig = !(devc->profile->dev_caps.feature_caps & CAPS_FEATURE_USB30) && (setting.mode & (1 << QUAR_MODE_BIT)); + half_trig = (!(devc->profile->dev_caps.feature_caps & CAPS_FEATURE_USB30) && setting.mode & (1 << HALF_MODE_BIT)) || + ((devc->profile->dev_caps.feature_caps & CAPS_FEATURE_USB30) && setting.mode & (1 << QUAR_MODE_BIT)); - setting.trig_value0[0] = ds_trigger_get_value0(TriggerStages); - setting.trig_value1[0] = ds_trigger_get_value1(TriggerStages); + setting.trig_mask0[0] = ds_trigger_get_mask0(TriggerStages, TriggerProbes-1, 0, qutr_trig, half_trig); + setting.trig_mask1[0] = ds_trigger_get_mask1(TriggerStages, TriggerProbes-1, 0, qutr_trig, half_trig); + setting.trig_value0[0] = ds_trigger_get_value0(TriggerStages, TriggerProbes-1, 0, qutr_trig, half_trig); + setting.trig_value1[0] = ds_trigger_get_value1(TriggerStages, TriggerProbes-1, 0, qutr_trig, half_trig); + setting.trig_edge0[0] = ds_trigger_get_edge0(TriggerStages, TriggerProbes-1, 0, qutr_trig, half_trig); + setting.trig_edge1[0] = ds_trigger_get_edge1(TriggerStages, TriggerProbes-1, 0, qutr_trig, half_trig); - setting.trig_edge0[0] = ds_trigger_get_edge0(TriggerStages); - setting.trig_edge1[0] = ds_trigger_get_edge1(TriggerStages); - - if (setting.mode & (1 << QUAR_MODE_BIT)) { - setting.trig_mask0[0] = ((setting.trig_mask0[0] & 0x0f) << 12) + - ((setting.trig_mask0[0] & 0x0f) << 8) + - ((setting.trig_mask0[0] & 0x0f) << 4) + - ((setting.trig_mask0[0] & 0x0f) << 0); - setting.trig_mask1[0] = ((setting.trig_mask1[0] & 0x0f) << 12) + - ((setting.trig_mask1[0] & 0x0f) << 8) + - ((setting.trig_mask1[0] & 0x0f) << 4) + - ((setting.trig_mask1[0] & 0x0f) << 0); - setting.trig_value0[0] = ((setting.trig_value0[0] & 0x0f) << 12) + - ((setting.trig_value0[0] & 0x0f) << 8) + - ((setting.trig_value0[0] & 0x0f) << 4) + - ((setting.trig_value0[0] & 0x0f) << 0); - setting.trig_value1[0] = ((setting.trig_value1[0] & 0x0f) << 12) + - ((setting.trig_value1[0] & 0x0f) << 8) + - ((setting.trig_value1[0] & 0x0f) << 4) + - ((setting.trig_value1[0] & 0x0f) << 0); - setting.trig_edge0[0] = ((setting.trig_edge0[0] & 0x0f) << 12) + - ((setting.trig_edge0[0] & 0x0f) << 8) + - ((setting.trig_edge0[0] & 0x0f) << 4) + - ((setting.trig_edge0[0] & 0x0f) << 0); - setting.trig_edge1[0] = ((setting.trig_edge1[0] & 0x0f) << 12) + - ((setting.trig_edge1[0] & 0x0f) << 8) + - ((setting.trig_edge1[0] & 0x0f) << 4) + - ((setting.trig_edge1[0] & 0x0f) << 0); - } else if (setting.mode & (1 << HALF_MODE_BIT)) { - setting.trig_mask0[0] = ((setting.trig_mask0[0] & 0xff) << 8) + - ((setting.trig_mask0[0] & 0xff) << 0); - setting.trig_mask1[0] = ((setting.trig_mask1[0] & 0xff) << 8) + - ((setting.trig_mask1[0] & 0xff) << 0); - setting.trig_value0[0] = ((setting.trig_value0[0] & 0xff) << 8) + - ((setting.trig_value0[0] & 0xff) << 0); - setting.trig_value1[0] = ((setting.trig_value1[0] & 0xff) << 8) + - ((setting.trig_value1[0] & 0xff) << 0); - setting.trig_edge0[0] = ((setting.trig_edge0[0] & 0xff) << 8) + - ((setting.trig_edge0[0] & 0xff) << 0); - setting.trig_edge1[0] = ((setting.trig_edge1[0] & 0xff) << 8) + - ((setting.trig_edge1[0] & 0xff) << 0); - } + setting_ext32.trig_mask0[0] = ds_trigger_get_mask0(TriggerStages, 2*TriggerProbes-1, TriggerProbes, qutr_trig, half_trig); + setting_ext32.trig_mask1[0] = ds_trigger_get_mask1(TriggerStages, 2*TriggerProbes-1, TriggerProbes, qutr_trig, half_trig); + setting_ext32.trig_value0[0] = ds_trigger_get_value0(TriggerStages, 2*TriggerProbes-1, TriggerProbes, qutr_trig, half_trig); + setting_ext32.trig_value1[0] = ds_trigger_get_value1(TriggerStages, 2*TriggerProbes-1, TriggerProbes, qutr_trig, half_trig); + setting_ext32.trig_edge0[0] = ds_trigger_get_edge0(TriggerStages, 2*TriggerProbes-1, TriggerProbes, qutr_trig, half_trig); + setting_ext32.trig_edge1[0] = ds_trigger_get_edge1(TriggerStages, 2*TriggerProbes-1, TriggerProbes, qutr_trig, half_trig); setting.trig_logic0[0] = (trigger->trigger_logic[TriggerStages] << 1) + trigger->trigger0_inv[TriggerStages]; setting.trig_logic1[0] = (trigger->trigger_logic[TriggerStages] << 1) + trigger->trigger1_inv[TriggerStages]; @@ -847,13 +829,18 @@ SR_PRIV int dsl_fpga_arm(const struct sr_dev_inst *sdi) for (i = 1; i < NUM_TRIGGER_STAGES; i++) { setting.trig_mask0[i] = 0xffff; setting.trig_mask1[i] = 0xffff; - setting.trig_value0[i] = 0; setting.trig_value1[i] = 0; - setting.trig_edge0[i] = 0; setting.trig_edge1[i] = 0; + setting_ext32.trig_mask0[i] = 0xffff; + setting_ext32.trig_mask1[i] = 0xffff; + setting_ext32.trig_value0[i] = 0; + setting_ext32.trig_value1[i] = 0; + setting_ext32.trig_edge0[i] = 0; + setting_ext32.trig_edge1[i] = 0; + setting.trig_logic0[i] = 2; setting.trig_logic1[i] = 2; @@ -861,59 +848,29 @@ SR_PRIV int dsl_fpga_arm(const struct sr_dev_inst *sdi) } } else { for (i = 0; i < NUM_TRIGGER_STAGES; i++) { - setting.trig_mask0[i] = ds_trigger_get_mask0(i); - setting.trig_mask1[i] = ds_trigger_get_mask1(i); - - setting.trig_value0[i] = ds_trigger_get_value0(i); - setting.trig_value1[i] = ds_trigger_get_value1(i); - - setting.trig_edge0[i] = ds_trigger_get_edge0(i); - setting.trig_edge1[i] = ds_trigger_get_edge1(i); - if (setting.mode & (1 << STRIG_MODE_BIT) && i == STriggerDataStage) { - // serial trigger, data mask/value should not be duplicated + qutr_trig = FALSE; + half_trig = FALSE; } else { - if (setting.mode & (1 << QUAR_MODE_BIT)) { - setting.trig_mask0[i] = ((setting.trig_mask0[i] & 0x0f) << 12) + - ((setting.trig_mask0[i] & 0x0f) << 8) + - ((setting.trig_mask0[i] & 0x0f) << 4) + - ((setting.trig_mask0[i] & 0x0f) << 0); - setting.trig_mask1[i] = ((setting.trig_mask1[i] & 0x0f) << 12) + - ((setting.trig_mask1[i] & 0x0f) << 8) + - ((setting.trig_mask1[i] & 0x0f) << 4) + - ((setting.trig_mask1[i] & 0x0f) << 0); - setting.trig_value0[i] = ((setting.trig_value0[i] & 0x0f) << 12) + - ((setting.trig_value0[i] & 0x0f) << 8) + - ((setting.trig_value0[i] & 0x0f) << 4) + - ((setting.trig_value0[i] & 0x0f) << 0); - setting.trig_value1[i] = ((setting.trig_value1[i] & 0x0f) << 12) + - ((setting.trig_value1[i] & 0x0f) << 8) + - ((setting.trig_value1[i] & 0x0f) << 4) + - ((setting.trig_value1[i] & 0x0f) << 0); - setting.trig_edge0[i] = ((setting.trig_edge0[i] & 0x0f) << 12) + - ((setting.trig_edge0[i] & 0x0f) << 8) + - ((setting.trig_edge0[i] & 0x0f) << 4) + - ((setting.trig_edge0[i] & 0x0f) << 0); - setting.trig_edge1[i] = ((setting.trig_edge1[i] & 0x0f) << 12) + - ((setting.trig_edge1[i] & 0x0f) << 8) + - ((setting.trig_edge1[i] & 0x0f) << 4) + - ((setting.trig_edge1[i] & 0x0f) << 0); - } else if (setting.mode & (1 << HALF_MODE_BIT)) { - setting.trig_mask0[i] = ((setting.trig_mask0[i] & 0xff) << 8) + - ((setting.trig_mask0[i] & 0xff) << 0); - setting.trig_mask1[i] = ((setting.trig_mask1[i] & 0xff) << 8) + - ((setting.trig_mask1[i] & 0xff) << 0); - setting.trig_value0[i] = ((setting.trig_value0[i] & 0xff) << 8) + - ((setting.trig_value0[i] & 0xff) << 0); - setting.trig_value1[i] = ((setting.trig_value1[i] & 0xff) << 8) + - ((setting.trig_value1[i] & 0xff) << 0); - setting.trig_edge0[i] = ((setting.trig_edge0[i] & 0xff) << 8) + - ((setting.trig_edge0[i] & 0xff) << 0); - setting.trig_edge1[i] = ((setting.trig_edge1[i] & 0xff) << 8) + - ((setting.trig_edge1[i] & 0xff) << 0); - } + qutr_trig = !(devc->profile->dev_caps.feature_caps & CAPS_FEATURE_USB30) && (setting.mode & (1 << QUAR_MODE_BIT)); + half_trig = (!(devc->profile->dev_caps.feature_caps & CAPS_FEATURE_USB30) && setting.mode & (1 << HALF_MODE_BIT)) || + ((devc->profile->dev_caps.feature_caps & CAPS_FEATURE_USB30) && setting.mode & (1 << QUAR_MODE_BIT)); } + setting.trig_mask0[i] = ds_trigger_get_mask0(i, TriggerProbes-1 , 0, qutr_trig, half_trig); + setting.trig_mask1[i] = ds_trigger_get_mask1(i, TriggerProbes-1, 0, qutr_trig, half_trig); + setting.trig_value0[i] = ds_trigger_get_value0(i, TriggerProbes-1, 0, qutr_trig, half_trig); + setting.trig_value1[i] = ds_trigger_get_value1(i, TriggerProbes-1, 0, qutr_trig, half_trig); + setting.trig_edge0[i] = ds_trigger_get_edge0(i, TriggerProbes-1, 0, qutr_trig, half_trig); + setting.trig_edge1[i] = ds_trigger_get_edge1(i, TriggerProbes-1, 0, qutr_trig, half_trig); + + setting_ext32.trig_mask0[i] = ds_trigger_get_mask0(i, 2*TriggerProbes-1, TriggerProbes, qutr_trig, half_trig); + setting_ext32.trig_mask1[i] = ds_trigger_get_mask1(i, 2*TriggerProbes-1, TriggerProbes, qutr_trig, half_trig); + setting_ext32.trig_value0[i] = ds_trigger_get_value0(i, 2*TriggerProbes-1, TriggerProbes, qutr_trig, half_trig); + setting_ext32.trig_value1[i] = ds_trigger_get_value1(i, 2*TriggerProbes-1, TriggerProbes, qutr_trig, half_trig); + setting_ext32.trig_edge0[i] = ds_trigger_get_edge0(i, 2*TriggerProbes-1, TriggerProbes, qutr_trig, half_trig); + setting_ext32.trig_edge1[i] = ds_trigger_get_edge1(i, 2*TriggerProbes-1, TriggerProbes, qutr_trig, half_trig); + setting.trig_logic0[i] = (trigger->trigger_logic[i] << 1) + trigger->trigger0_inv[i]; setting.trig_logic1[i] = (trigger->trigger_logic[i] << 1) + trigger->trigger1_inv[i]; @@ -956,6 +913,7 @@ SR_PRIV int dsl_fpga_arm(const struct sr_dev_inst *sdi) } // send bulk data + // setting ret = libusb_bulk_transfer(hdl, 2 | LIBUSB_ENDPOINT_OUT, (unsigned char *)&setting, sizeof(struct DSL_setting), @@ -969,6 +927,22 @@ SR_PRIV int dsl_fpga_arm(const struct sr_dev_inst *sdi) sizeof(struct DSL_setting), transferred); return SR_ERR; } + // setting_ext32 + if (devc->profile->dev_caps.feature_caps & CAPS_FEATURE_LA_CH32) { + ret = libusb_bulk_transfer(hdl, 2 | LIBUSB_ENDPOINT_OUT, + (unsigned char *)&setting_ext32, + sizeof(struct DSL_setting_ext32), + &transferred, 1000); + if (ret < 0) { + sr_err("Unable to arm FPGA(setting_ext32) of dsl device: %s.", + libusb_error_name(ret)); + return SR_ERR; + } else if (transferred != sizeof(struct DSL_setting_ext32)) { + sr_err("Arm FPGA(setting_ext32) error: expacted transfer size %d; actually %d", + sizeof(struct DSL_setting_ext32), transferred); + return SR_ERR; + } + } // assert INTRDY high (indicate data end) wr_cmd.header.dest = DSL_CTL_INTRDY; @@ -1363,7 +1337,12 @@ SR_PRIV int dsl_config_get(int id, GVariant **data, const struct sr_dev_inst *sd case SR_CONF_BANDWIDTH: if (!sdi) return SR_ERR; - *data = g_variant_new_boolean(devc->profile->dev_caps.feature_caps & CAPS_FEATURE_20M); + *data = g_variant_new_boolean((devc->profile->dev_caps.feature_caps & CAPS_FEATURE_20M) != 0); + break; + case SR_CONF_LA_CH32: + if (!sdi) + return SR_ERR; + *data = g_variant_new_boolean((devc->profile->dev_caps.feature_caps & CAPS_FEATURE_LA_CH32) != 0); break; default: return SR_ERR_NA; diff --git a/libsigrok4DSL/hardware/DSL/dsl.h b/libsigrok4DSL/hardware/DSL/dsl.h index 9b2376ac..23767842 100755 --- a/libsigrok4DSL/hardware/DSL/dsl.h +++ b/libsigrok4DSL/hardware/DSL/dsl.h @@ -83,7 +83,13 @@ // use ADF4360-7 vco chip #define CAPS_FEATURE_ADF4360 (1 << 8) // 20M bandwidth limitation -#define CAPS_FEATURE_20M (1 << 8) +#define CAPS_FEATURE_20M (1 << 9) +// use startup flash (fx3) +#define CAPS_FEATURE_FLASH (1 << 10) +// 32 channels +#define CAPS_FEATURE_LA_CH32 (1 << 11) +// auto tunning vgain +#define CAPS_FEATURE_AUTO_VGAIN (1 << 12) /* end */ @@ -156,6 +162,7 @@ struct DSL_caps { uint64_t mode_caps; uint64_t feature_caps; uint64_t channels; + uint64_t total_ch_num; uint64_t hw_depth; uint64_t dso_depth; uint8_t intest_channel; @@ -170,6 +177,8 @@ struct DSL_caps { uint32_t ref_min; uint32_t ref_max; uint16_t default_comb_comp; + uint64_t half_samplerate; + uint64_t quarter_samplerate; }; struct DSL_profile { @@ -442,6 +451,7 @@ static const struct DSL_profile supported_DSLogic[] = { (1 << DSL_BUFFER100x16) | (1 << DSL_BUFFER200x8) | (1 << DSL_BUFFER400x4) | (1 << DSL_ANALOG10x2) | (1 << DSL_DSO200x2), + 16, SR_MB(256), SR_Mn(2), DSL_BUFFER100x16, @@ -455,7 +465,9 @@ static const struct DSL_profile supported_DSLogic[] = { 0, 0, 0, - 0} + 0, + SR_MHZ(200), + SR_MHZ(400)} }, {0x2A0E, 0x0003, LIBUSB_SPEED_HIGH, "DreamSourceLab", "DSLogic Pro", NULL, @@ -466,6 +478,7 @@ static const struct DSL_profile supported_DSLogic[] = { CAPS_FEATURE_SEEP | CAPS_FEATURE_VTH | CAPS_FEATURE_BUF, (1 << DSL_STREAM20x16) | (1 << DSL_STREAM25x12) | (1 << DSL_STREAM50x6) | (1 << DSL_STREAM100x3) | (1 << DSL_BUFFER100x16) | (1 << DSL_BUFFER200x8) | (1 << DSL_BUFFER400x4), + 16, SR_MB(256), 0, DSL_BUFFER100x16, @@ -479,7 +492,9 @@ static const struct DSL_profile supported_DSLogic[] = { 0, 0, 0, - 0} + 0, + SR_MHZ(200), + SR_MHZ(400)} }, {0x2A0E, 0x0020, LIBUSB_SPEED_HIGH, "DreamSourceLab", "DSLogic PLus", NULL, @@ -490,6 +505,7 @@ static const struct DSL_profile supported_DSLogic[] = { CAPS_FEATURE_VTH | CAPS_FEATURE_BUF, (1 << DSL_STREAM20x16) | (1 << DSL_STREAM25x12) | (1 << DSL_STREAM50x6) | (1 << DSL_STREAM100x3) | (1 << DSL_BUFFER100x16) | (1 << DSL_BUFFER200x8) | (1 << DSL_BUFFER400x4), + 16, SR_MB(256), 0, DSL_BUFFER100x16, @@ -503,7 +519,9 @@ static const struct DSL_profile supported_DSLogic[] = { 0, 0, 0, - 0} + 0, + SR_MHZ(200), + SR_MHZ(400)} }, {0x2A0E, 0x0021, LIBUSB_SPEED_HIGH, "DreamSourceLab", "DSLogic Basic", NULL, @@ -514,6 +532,7 @@ static const struct DSL_profile supported_DSLogic[] = { CAPS_FEATURE_VTH, (1 << DSL_STREAM20x16) | (1 << DSL_STREAM25x12) | (1 << DSL_STREAM50x6) | (1 << DSL_STREAM100x3) | (1 << DSL_BUFFER100x16) | (1 << DSL_BUFFER200x8) | (1 << DSL_BUFFER400x4), + 16, SR_KB(256), 0, DSL_STREAM20x16, @@ -527,7 +546,9 @@ static const struct DSL_profile supported_DSLogic[] = { 0, 0, 0, - 0} + 0, + SR_MHZ(200), + SR_MHZ(400)} }, {0x2A0E, 0x0029, LIBUSB_SPEED_HIGH, "DreamSourceLab", "DSLogic U2Basic", NULL, @@ -538,6 +559,7 @@ static const struct DSL_profile supported_DSLogic[] = { CAPS_FEATURE_VTH | CAPS_FEATURE_BUF, (1 << DSL_STREAM20x16) | (1 << DSL_STREAM25x12) | (1 << DSL_STREAM50x6) | (1 << DSL_STREAM100x3) | (1 << DSL_BUFFER100x16), + 16, SR_MB(64), 0, DSL_BUFFER100x16, @@ -551,10 +573,12 @@ static const struct DSL_profile supported_DSLogic[] = { 0, 0, 0, - 0} + 0, + SR_MHZ(200), + SR_MHZ(400)} }, - { 0, 0, 0, 0, 0, 0, 0, 0, 0, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}} + { 0, 0, 0, 0, 0, 0, 0, 0, 0, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}} }; static const struct DSL_profile supported_DSCope[] = { @@ -569,6 +593,7 @@ static const struct DSL_profile supported_DSCope[] = { CAPS_FEATURE_ZERO | CAPS_FEATURE_PREOFF | CAPS_FEATURE_SEEP | CAPS_FEATURE_BUF, (1 << DSL_ANALOG10x2) | (1 << DSL_DSO200x2), + 2, SR_MB(256), SR_Mn(2), 0, @@ -582,7 +607,9 @@ static const struct DSL_profile supported_DSCope[] = { 1024-920, 1, 255, - 0} + 0, + SR_HZ(0), + SR_HZ(0)} }, {0x2A0E, 0x0004, LIBUSB_SPEED_HIGH, "DreamSourceLab", "DSCope20", NULL, @@ -593,6 +620,7 @@ static const struct DSL_profile supported_DSCope[] = { CAPS_FEATURE_ZERO | CAPS_FEATURE_SEEP | CAPS_FEATURE_BUF, (1 << DSL_ANALOG10x2) | (1 << DSL_DSO200x2), + 2, SR_MB(256), SR_Mn(2), 0, @@ -606,7 +634,9 @@ static const struct DSL_profile supported_DSCope[] = { 1024-920, 1, 255, - 0} + 0, + SR_HZ(0), + SR_HZ(0)} }, {0x2A0E, 0x0022, LIBUSB_SPEED_HIGH, "DreamSourceLab", "DSCope B20", NULL, @@ -617,6 +647,7 @@ static const struct DSL_profile supported_DSCope[] = { CAPS_FEATURE_ZERO | CAPS_FEATURE_BUF, (1 << DSL_ANALOG10x2) | (1 << DSL_DSO200x2), + 2, SR_MB(256), SR_Mn(2), 0, @@ -630,7 +661,9 @@ static const struct DSL_profile supported_DSCope[] = { 1024-920, 1, 255, - 0} + 0, + SR_HZ(0), + SR_HZ(0)} }, {0x2A0E, 0x0023, LIBUSB_SPEED_HIGH, "DreamSourceLab", "DSCope C20", NULL, @@ -641,6 +674,7 @@ static const struct DSL_profile supported_DSCope[] = { CAPS_FEATURE_ZERO | CAPS_FEATURE_BUF, (1 << DSL_ANALOG10x2) | (1 << DSL_DSO200x2), + 2, SR_MB(256), SR_Mn(2), 0, @@ -654,7 +688,9 @@ static const struct DSL_profile supported_DSCope[] = { 1024-920, 1, 255, - 0} + 0, + SR_HZ(0), + SR_HZ(0)} }, @@ -666,6 +702,7 @@ static const struct DSL_profile supported_DSCope[] = { CAPS_FEATURE_ZERO | CAPS_FEATURE_BUF | CAPS_FEATURE_POGOPIN, (1 << DSL_ANALOG10x2) | (1 << DSL_DSO200x2), + 2, SR_MB(256), SR_Mn(2), 0, @@ -679,7 +716,9 @@ static const struct DSL_profile supported_DSCope[] = { 1024-920, 1, 255, - 0} + 0, + SR_HZ(0), + SR_HZ(0)} }, {0x2A0E, 0x0025, LIBUSB_SPEED_HIGH, "DreamSourceLab", "DSCope C20", NULL, @@ -690,6 +729,7 @@ static const struct DSL_profile supported_DSCope[] = { CAPS_FEATURE_ZERO, (1 << DSL_ANALOG10x2) | (1 << DSL_DSO200x2), + 2, SR_KB(256), SR_Kn(20), 0, @@ -703,7 +743,9 @@ static const struct DSL_profile supported_DSCope[] = { 1024-920, 1, 255, - 0} + 0, + SR_HZ(0), + SR_HZ(0)} }, {0x2A0E, 0x0026, LIBUSB_SPEED_HIGH, "DreamSourceLab", "DSCope U2B20", NULL, @@ -714,6 +756,7 @@ static const struct DSL_profile supported_DSCope[] = { CAPS_FEATURE_ZERO, (1 << DSL_ANALOG10x2) | (1 << DSL_DSO200x2), + 2, SR_KB(256), SR_Kn(20), 0, @@ -727,7 +770,9 @@ static const struct DSL_profile supported_DSCope[] = { 1024-945, 10, 245, - 22} + 22, + SR_HZ(0), + SR_HZ(0)} }, {0x2A0E, 0x0027, LIBUSB_SPEED_HIGH, "DreamSourceLab", "DSCope U2P20", NULL, @@ -738,6 +783,7 @@ static const struct DSL_profile supported_DSCope[] = { CAPS_FEATURE_ZERO | CAPS_FEATURE_BUF | CAPS_FEATURE_POGOPIN, (1 << DSL_ANALOG10x2) | (1 << DSL_DSO200x2), + 2, SR_MB(256), SR_Mn(2), 0, @@ -751,11 +797,13 @@ static const struct DSL_profile supported_DSCope[] = { 1024-945, 10, 245, - 22} + 22, + SR_HZ(0), + SR_HZ(0)} }, - { 0, 0, 0, 0, 0, 0, 0, 0, 0, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}} + { 0, 0, 0, 0, 0, 0, 0, 0, 0, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}} }; static const gboolean default_ms_en[] = { @@ -883,12 +931,14 @@ struct DSL_setting { uint16_t tpos_h; uint16_t trig_glb_header; // 7 uint16_t trig_glb; - uint16_t ch_en_header; // 8 - uint16_t ch_en; - uint16_t dso_count_header; // 9-10 + uint16_t dso_count_header; // 8-9 uint16_t dso_cnt_l; uint16_t dso_cnt_h; - uint16_t misc_align; + uint16_t ch_en_header; // 10-11 + uint16_t ch_en_l; + uint16_t ch_en_h; + uint16_t fgain_header; // 12 + uint16_t fgain; uint16_t trig_header; // 64 uint16_t trig_mask0[NUM_TRIGGER_STAGES]; @@ -904,6 +954,21 @@ struct DSL_setting { uint32_t end_sync; }; +struct DSL_setting_ext32 { + uint32_t sync; + + uint16_t trig_header; // 96 + uint16_t trig_mask0[NUM_TRIGGER_STAGES]; + uint16_t trig_mask1[NUM_TRIGGER_STAGES]; + uint16_t trig_value0[NUM_TRIGGER_STAGES]; + uint16_t trig_value1[NUM_TRIGGER_STAGES]; + uint16_t trig_edge0[NUM_TRIGGER_STAGES]; + uint16_t trig_edge1[NUM_TRIGGER_STAGES]; + + uint16_t align_bytes; + uint32_t end_sync; +}; + struct DSL_adc_config { uint8_t dest; uint8_t cnt; diff --git a/libsigrok4DSL/hardware/DSL/dslogic.c b/libsigrok4DSL/hardware/DSL/dslogic.c index b786abae..f174cfd9 100755 --- a/libsigrok4DSL/hardware/DSL/dslogic.c +++ b/libsigrok4DSL/hardware/DSL/dslogic.c @@ -662,6 +662,11 @@ static int config_get(int id, GVariant **data, const struct sr_dev_inst *sdi, return SR_ERR; *data = g_variant_new_int16(channel_modes[devc->ch_mode].vld_num); break; + case SR_CONF_TOTAL_CH_NUM: + if (!sdi) + return SR_ERR; + *data = g_variant_new_int16(devc->profile->dev_caps.total_ch_num); + break; default: return SR_ERR_NA; } diff --git a/libsigrok4DSL/libsigrok.h b/libsigrok4DSL/libsigrok.h index 6999fc6a..ad015d94 100755 --- a/libsigrok4DSL/libsigrok.h +++ b/libsigrok4DSL/libsigrok.h @@ -118,6 +118,7 @@ enum { #define DS_MAX_DSO_PROBES_NUM 2 #define TriggerStages 16 #define TriggerProbes 16 +#define MaxTriggerProbes 32 #define TriggerCountBits 16 #define STriggerDataStage 3 @@ -857,9 +858,15 @@ enum { SR_CONF_REF_MIN, SR_CONF_REF_MAX, + /** Valid channel number */ + SR_CONF_TOTAL_CH_NUM, + /** Valid channel number */ SR_CONF_VLD_CH_NUM, + /** 32 channel support */ + SR_CONF_LA_CH32, + /** Zero */ SR_CONF_HAVE_ZERO, SR_CONF_ZERO, @@ -1254,8 +1261,8 @@ struct ds_trigger { unsigned char trigger_logic[TriggerStages+1]; unsigned char trigger0_inv[TriggerStages+1]; unsigned char trigger1_inv[TriggerStages+1]; - char trigger0[TriggerStages+1][TriggerProbes]; - char trigger1[TriggerStages+1][TriggerProbes]; + char trigger0[TriggerStages+1][MaxTriggerProbes]; + char trigger1[TriggerStages+1][MaxTriggerProbes]; uint32_t trigger0_count[TriggerStages+1]; uint32_t trigger1_count[TriggerStages+1]; }; diff --git a/libsigrok4DSL/proto.h b/libsigrok4DSL/proto.h index ca375db9..84ffaae2 100755 --- a/libsigrok4DSL/proto.h +++ b/libsigrok4DSL/proto.h @@ -173,10 +173,10 @@ SR_API int ds_trigger_set_en(uint16_t enable); SR_API uint16_t ds_trigger_get_en(); SR_API int ds_trigger_set_mode(uint16_t mode); -SR_PRIV uint64_t ds_trigger_get_mask0(uint16_t stage); -SR_PRIV uint64_t ds_trigger_get_value0(uint16_t stage); -SR_PRIV uint64_t ds_trigger_get_edge0(uint16_t stage); -SR_PRIV uint64_t ds_trigger_get_mask1(uint16_t stage); -SR_PRIV uint64_t ds_trigger_get_value1(uint16_t stage); -SR_PRIV uint64_t ds_trigger_get_edge1(uint16_t stage); +SR_PRIV uint16_t ds_trigger_get_mask0(uint16_t stage, uint16_t msc, uint16_t lsc, gboolean qutr_mode, gboolean half_mode); +SR_PRIV uint16_t ds_trigger_get_value0(uint16_t stage, uint16_t msc, uint16_t lsc, gboolean qutr_mode, gboolean half_mode); +SR_PRIV uint16_t ds_trigger_get_edge0(uint16_t stage, uint16_t msc, uint16_t lsc, gboolean qutr_mode, gboolean half_mode); +SR_PRIV uint16_t ds_trigger_get_mask1(uint16_t stage, uint16_t msc, uint16_t lsc, gboolean qutr_mode, gboolean half_mode); +SR_PRIV uint16_t ds_trigger_get_value1(uint16_t stage, uint16_t msc, uint16_t lsc, gboolean qutr_mode, gboolean half_mode); +SR_PRIV uint16_t ds_trigger_get_edge1(uint16_t stage, uint16_t msc, uint16_t lsc, gboolean qutr_mode, gboolean half_mode); #endif diff --git a/libsigrok4DSL/trigger.c b/libsigrok4DSL/trigger.c index 6171ec46..c9d08c45 100755 --- a/libsigrok4DSL/trigger.c +++ b/libsigrok4DSL/trigger.c @@ -58,7 +58,7 @@ SR_API int ds_trigger_init(void) trigger->trigger_stages = 0; for (i = 0; i <= TriggerStages; i++) { - for (j = 0; j < TriggerProbes; j++) { + for (j = 0; j < MaxTriggerProbes; j++) { trigger->trigger0[i][j] = 'X'; trigger->trigger1[i][j] = 'X'; } @@ -99,7 +99,7 @@ SR_API struct ds_trigger *ds_trigger_get(void) SR_API int ds_trigger_stage_set_value(uint16_t stage, uint16_t probes, char *trigger0, char *trigger1) { assert(stage < TriggerStages); - assert(probes <= TriggerProbes); + assert(probes <= MaxTriggerProbes); int j; @@ -113,7 +113,7 @@ SR_API int ds_trigger_stage_set_value(uint16_t stage, uint16_t probes, char *tri SR_API int ds_trigger_stage_set_logic(uint16_t stage, uint16_t probes, unsigned char trigger_logic) { assert(stage < TriggerStages); - assert(probes <= TriggerProbes); + assert(probes <= MaxTriggerProbes); trigger->trigger_logic[stage] = trigger_logic; @@ -122,7 +122,7 @@ SR_API int ds_trigger_stage_set_logic(uint16_t stage, uint16_t probes, unsigned SR_API int ds_trigger_stage_set_inv(uint16_t stage, uint16_t probes, unsigned char trigger0_inv, unsigned char trigger1_inv) { assert(stage < TriggerStages); - assert(probes <= TriggerProbes); + assert(probes <= MaxTriggerProbes); trigger->trigger0_inv[stage] = trigger0_inv; trigger->trigger1_inv[stage] = trigger1_inv; @@ -132,7 +132,7 @@ SR_API int ds_trigger_stage_set_inv(uint16_t stage, uint16_t probes, unsigned ch SR_API int ds_trigger_stage_set_count(uint16_t stage, uint16_t probes, uint32_t trigger0_count, uint32_t trigger1_count) { assert(stage < TriggerStages); - assert(probes <= TriggerProbes); + assert(probes <= MaxTriggerProbes); trigger->trigger0_count[stage] = trigger0_count; trigger->trigger1_count[stage] = trigger1_count; @@ -147,7 +147,7 @@ SR_API int ds_trigger_stage_set_count(uint16_t stage, uint16_t probes, uint32_t */ SR_API int ds_trigger_probe_set(uint16_t probe, unsigned char trigger0, unsigned char trigger1) { - assert(probe < TriggerProbes); + assert(probe < MaxTriggerProbes); trigger->trigger0[TriggerStages][probe] = trigger0; trigger->trigger1[TriggerStages][probe] = trigger1; @@ -235,90 +235,168 @@ SR_API int ds_trigger_set_mode(uint16_t mode) /* * */ -SR_PRIV uint64_t ds_trigger_get_mask0(uint16_t stage) +SR_PRIV uint16_t ds_trigger_get_mask0(uint16_t stage, uint16_t msc, uint16_t lsc, gboolean qutr_mode, gboolean half_mode) { assert(stage <= TriggerStages); + assert(lsc <= msc); + assert(msc < MaxTriggerProbes); - uint64_t mask = 0; + uint16_t mask = 0; + const uint16_t qutr_mask = (0xffff >> (TriggerProbes - TriggerProbes/4)); + const uint16_t half_mask = (0xffff >> (TriggerProbes - TriggerProbes/2)); int i; - for (i = TriggerProbes - 1; i >= 0 ; i--) { + for (i = msc; i >= lsc ; i--) { mask = (mask << 1); mask += ((trigger->trigger0[stage][i] == 'X') | (trigger->trigger0[stage][i] == 'C')); } + if (qutr_mode) + mask = ((mask & qutr_mask) << (TriggerProbes/4*3)) + + ((mask & qutr_mask) << (TriggerProbes/4*2)) + + ((mask & qutr_mask) << (TriggerProbes/4*1)) + + ((mask & qutr_mask) << (TriggerProbes/4*0)); + else if (half_mode) + mask = ((mask & half_mask) << (TriggerProbes/2*1)) + + ((mask & half_mask) << (TriggerProbes/2*0)); + return mask; } -SR_PRIV uint64_t ds_trigger_get_mask1(uint16_t stage) +SR_PRIV uint16_t ds_trigger_get_mask1(uint16_t stage, uint16_t msc, uint16_t lsc, gboolean qutr_mode, gboolean half_mode) { assert(stage <= TriggerStages); + assert(lsc <= msc); + assert(msc < MaxTriggerProbes); - uint64_t mask = 0; + uint16_t mask = 0; + const uint16_t qutr_mask = (0xffff >> (TriggerProbes - TriggerProbes/4)); + const uint16_t half_mask = (0xffff >> (TriggerProbes - TriggerProbes/2)); int i; - for (i = TriggerProbes - 1; i >= 0 ; i--) { + for (i = msc; i >= lsc ; i--) { mask = (mask << 1); mask += ((trigger->trigger1[stage][i] == 'X') | (trigger->trigger1[stage][i] == 'C')); } + if (qutr_mode) + mask = ((mask & qutr_mask) << (TriggerProbes/4*3)) + + ((mask & qutr_mask) << (TriggerProbes/4*2)) + + ((mask & qutr_mask) << (TriggerProbes/4*1)) + + ((mask & qutr_mask) << (TriggerProbes/4*0)); + else if (half_mode) + mask = ((mask & half_mask) << (TriggerProbes/2*1)) + + ((mask & half_mask) << (TriggerProbes/2*0)); + return mask; } -SR_PRIV uint64_t ds_trigger_get_value0(uint16_t stage) +SR_PRIV uint16_t ds_trigger_get_value0(uint16_t stage, uint16_t msc, uint16_t lsc, gboolean qutr_mode, gboolean half_mode) { assert(stage <= TriggerStages); + assert(lsc <= msc); + assert(msc < MaxTriggerProbes); - uint64_t value = 0; + uint16_t value = 0; + const uint16_t qutr_mask = (0xffff >> (TriggerProbes - TriggerProbes/4)); + const uint16_t half_mask = (0xffff >> (TriggerProbes - TriggerProbes/2)); int i; - for (i = TriggerProbes - 1; i >= 0 ; i--) { + for (i = msc; i >= lsc ; i--) { value = (value << 1); value += ((trigger->trigger0[stage][i] == '1') | (trigger->trigger0[stage][i] == 'R')); } + if (qutr_mode) + value = ((value & qutr_mask) << (TriggerProbes/4*3)) + + ((value & qutr_mask) << (TriggerProbes/4*2)) + + ((value & qutr_mask) << (TriggerProbes/4*1)) + + ((value & qutr_mask) << (TriggerProbes/4*0)); + else if (half_mode) + value = ((value & half_mask) << (TriggerProbes/2*1)) + + ((value & half_mask) << (TriggerProbes/2*0)); + return value; } -SR_PRIV uint64_t ds_trigger_get_value1(uint16_t stage) +SR_PRIV uint16_t ds_trigger_get_value1(uint16_t stage, uint16_t msc, uint16_t lsc, gboolean qutr_mode, gboolean half_mode) { assert(stage <= TriggerStages); + assert(lsc <= msc); + assert(msc < MaxTriggerProbes); - uint64_t value = 0; + uint16_t value = 0; + const uint16_t qutr_mask = (0xffff >> (TriggerProbes - TriggerProbes/4)); + const uint16_t half_mask = (0xffff >> (TriggerProbes - TriggerProbes/2)); int i; - for (i = TriggerProbes - 1; i >= 0 ; i--) { + for (i = msc; i >= lsc ; i--) { value = (value << 1); value += ((trigger->trigger1[stage][i] == '1') | (trigger->trigger1[stage][i] == 'R')); } + if (qutr_mode) + value = ((value & qutr_mask) << (TriggerProbes/4*3)) + + ((value & qutr_mask) << (TriggerProbes/4*2)) + + ((value & qutr_mask) << (TriggerProbes/4*1)) + + ((value & qutr_mask) << (TriggerProbes/4*0)); + else if (half_mode) + value = ((value & half_mask) << (TriggerProbes/2*1)) + + ((value & half_mask) << (TriggerProbes/2*0)); + return value; } -SR_PRIV uint64_t ds_trigger_get_edge0(uint16_t stage) +SR_PRIV uint16_t ds_trigger_get_edge0(uint16_t stage, uint16_t msc, uint16_t lsc, gboolean qutr_mode, gboolean half_mode) { assert(stage <= TriggerStages); + assert(lsc <= msc); + assert(msc < MaxTriggerProbes); - uint64_t edge = 0; + uint16_t edge = 0; + const uint16_t qutr_mask = (0xffff >> (TriggerProbes - TriggerProbes/4)); + const uint16_t half_mask = (0xffff >> (TriggerProbes - TriggerProbes/2)); int i; - for (i = TriggerProbes - 1; i >= 0 ; i--) { + for (i = msc; i >= lsc ; i--) { edge = (edge << 1); edge += ((trigger->trigger0[stage][i] == 'R') | (trigger->trigger0[stage][i] == 'F') | (trigger->trigger0[stage][i] == 'C')); } + if (qutr_mode) + edge = ((edge & qutr_mask) << (TriggerProbes/4*3)) + + ((edge & qutr_mask) << (TriggerProbes/4*2)) + + ((edge & qutr_mask) << (TriggerProbes/4*1)) + + ((edge & qutr_mask) << (TriggerProbes/4*0)); + else if (half_mode) + edge = ((edge & half_mask) << (TriggerProbes/2*1)) + + ((edge & half_mask) << (TriggerProbes/2*0)); + return edge; } -SR_PRIV uint64_t ds_trigger_get_edge1(uint16_t stage) +SR_PRIV uint16_t ds_trigger_get_edge1(uint16_t stage, uint16_t msc, uint16_t lsc, gboolean qutr_mode, gboolean half_mode) { assert(stage <= TriggerStages); + assert(lsc <= msc); + assert(msc < MaxTriggerProbes); - uint64_t edge = 0; + uint16_t edge = 0; + const uint16_t qutr_mask = (0xffff >> (TriggerProbes - TriggerProbes/4)); + const uint16_t half_mask = (0xffff >> (TriggerProbes - TriggerProbes/2)); int i; - for (i = TriggerProbes - 1; i >= 0 ; i--) { + for (i = msc; i >= lsc ; i--) { edge = (edge << 1); edge += ((trigger->trigger1[stage][i] == 'R') | (trigger->trigger1[stage][i] == 'F') | (trigger->trigger1[stage][i] == 'C')); } + if (qutr_mode) + edge = ((edge & qutr_mask) << (TriggerProbes/4*3)) + + ((edge & qutr_mask) << (TriggerProbes/4*2)) + + ((edge & qutr_mask) << (TriggerProbes/4*1)) + + ((edge & qutr_mask) << (TriggerProbes/4*0)); + else if (half_mode) + edge = ((edge & half_mask) << (TriggerProbes/2*1)) + + ((edge & half_mask) << (TriggerProbes/2*0)); + return edge; }