2
0
forked from Ivasoft/DSView

Add 32 channels trigger support

This commit is contained in:
DreamSourceLab
2020-01-08 10:49:11 +08:00
parent caad239315
commit 7328b0b2cc
20 changed files with 777 additions and 367 deletions

View File

@@ -23,6 +23,7 @@
#include "../sigsession.h"
#include "../device/devinst.h"
#include "../dialogs/dsmessagebox.h"
#include "../view/view.h"
#include <QObject>
#include <QGridLayout>
@@ -30,6 +31,7 @@
#include <QPainter>
#include <QRegExpValidator>
#include <QSplitter>
#include <QInputMethodEvent>
#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<QLineEdit*>(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<QInputMethodEvent::Attribute> 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

View File

@@ -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 <QLabel *> _mu_label_list;
QVector <QComboBox *> _logic_comboBox_list;
QVector <QLineEdit *> _value0_lineEdit_list;
QVector <QLineEdit *> _value0_ext32_lineEdit_list;
QVector <QSpinBox *> _count_spinBox_list;
QVector <QComboBox *> _inv0_comboBox_list;
QVector <QLineEdit *> _value1_lineEdit_list;
QVector <QLineEdit *> _value1_ext32_lineEdit_list;
QVector <QComboBox *> _inv1_comboBox_list;
QVector <QCheckBox *> _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;

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;
}

View File

@@ -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];
};

View File

@@ -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

View File

@@ -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;
}