2
0
forked from Ivasoft/DSView

Fix RLE trigger issue @LA mode

This commit is contained in:
DreamSourceLab
2015-12-02 20:31:38 +08:00
parent cc6c663a96
commit c4a6870be6
6 changed files with 79 additions and 54 deletions

View File

@@ -225,6 +225,7 @@ void SamplingBar::on_configure()
if (ret == QDialog::Accepted) { if (ret == QDialog::Accepted) {
device_updated(); device_updated();
update_sample_rate_selector(); update_sample_rate_selector();
commit_sample_rate();
} }
GVariant* gvar = dev_inst->get_config(NULL, NULL, SR_CONF_ZERO); GVariant* gvar = dev_inst->get_config(NULL, NULL, SR_CONF_ZERO);
@@ -294,7 +295,7 @@ void SamplingBar::update_record_length()
disconnect(&_sample_count, SIGNAL(currentIndexChanged(int)), disconnect(&_sample_count, SIGNAL(currentIndexChanged(int)),
this, SLOT(on_samplecount_sel(int))); this, SLOT(on_samplecount_sel(int)));
update_sample_count_selector_value(); update_sample_count_selector();
connect(&_sample_count, SIGNAL(currentIndexChanged(int)), connect(&_sample_count, SIGNAL(currentIndexChanged(int)),
this, SLOT(on_samplecount_sel(int))); this, SLOT(on_samplecount_sel(int)));
@@ -305,7 +306,7 @@ void SamplingBar::update_sample_rate()
disconnect(&_sample_rate, SIGNAL(currentIndexChanged(int)), disconnect(&_sample_rate, SIGNAL(currentIndexChanged(int)),
this, SLOT(on_samplerate_sel(int))); this, SLOT(on_samplerate_sel(int)));
update_sample_rate_selector_value(); update_sample_rate_selector();
connect(&_sample_rate, SIGNAL(currentIndexChanged(int)), connect(&_sample_rate, SIGNAL(currentIndexChanged(int)),
this, SLOT(on_samplerate_sel(int))); this, SLOT(on_samplerate_sel(int)));
@@ -452,7 +453,7 @@ void SamplingBar::update_sample_rate_selector_value()
break; break;
} }
} }
update_scale();
_updating_sample_rate = false; _updating_sample_rate = false;
} }
@@ -511,27 +512,27 @@ void SamplingBar::on_samplecount_sel(int index)
g_variant_new_uint64(sample_count)); g_variant_new_uint64(sample_count));
GVariant* gvar = _devInst->get_config(NULL, NULL, SR_CONF_STREAM); // GVariant* gvar = _devInst->get_config(NULL, NULL, SR_CONF_STREAM);
if (gvar != NULL) { // if (gvar != NULL) {
stream_mode = g_variant_get_boolean(gvar); // stream_mode = g_variant_get_boolean(gvar);
g_variant_unref(gvar); // g_variant_unref(gvar);
} // }
gvar = _devInst->get_config(NULL, NULL, SR_CONF_MAX_LOGIC_SAMPLELIMITS); // gvar = _devInst->get_config(NULL, NULL, SR_CONF_MAX_LOGIC_SAMPLELIMITS);
if (gvar != NULL) { // if (gvar != NULL) {
max_sample_count = g_variant_get_uint64(gvar); // max_sample_count = g_variant_get_uint64(gvar);
g_variant_unref(gvar); // g_variant_unref(gvar);
} // }
if (!stream_mode) { // if (!stream_mode) {
if (sample_count > max_sample_count) { // if (sample_count > max_sample_count) {
_devInst->set_config(NULL, NULL, // _devInst->set_config(NULL, NULL,
SR_CONF_RLE, // SR_CONF_RLE,
g_variant_new_boolean(true)); // g_variant_new_boolean(true));
} else { // } else {
_devInst->set_config(NULL, NULL, // _devInst->set_config(NULL, NULL,
SR_CONF_RLE, // SR_CONF_RLE,
g_variant_new_boolean(false)); // g_variant_new_boolean(false));
} // }
} // }
sample_count_changed(); sample_count_changed();
update_scale(); update_scale();
@@ -562,32 +563,32 @@ void SamplingBar::on_samplerate_sel(int index)
SR_CONF_SAMPLERATE, SR_CONF_SAMPLERATE,
g_variant_new_uint64(sample_rate)); g_variant_new_uint64(sample_rate));
GVariant* gvar = _devInst->get_config(NULL, NULL, SR_CONF_STREAM); // GVariant* gvar = _devInst->get_config(NULL, NULL, SR_CONF_STREAM);
if (gvar != NULL) { // if (gvar != NULL) {
stream_mode = g_variant_get_boolean(gvar); // stream_mode = g_variant_get_boolean(gvar);
g_variant_unref(gvar); // g_variant_unref(gvar);
} // }
gvar = _devInst->get_config(NULL, NULL, SR_CONF_LIMIT_SAMPLES); // gvar = _devInst->get_config(NULL, NULL, SR_CONF_LIMIT_SAMPLES);
if (gvar != NULL) { // if (gvar != NULL) {
sample_count = g_variant_get_uint64(gvar); // sample_count = g_variant_get_uint64(gvar);
g_variant_unref(gvar); // g_variant_unref(gvar);
} // }
gvar = _devInst->get_config(NULL, NULL, SR_CONF_MAX_LOGIC_SAMPLELIMITS); // gvar = _devInst->get_config(NULL, NULL, SR_CONF_MAX_LOGIC_SAMPLELIMITS);
if (gvar != NULL) { // if (gvar != NULL) {
max_sample_count = g_variant_get_uint64(gvar); // max_sample_count = g_variant_get_uint64(gvar);
g_variant_unref(gvar); // g_variant_unref(gvar);
} // }
if (!stream_mode) { // if (!stream_mode) {
if (sample_count > max_sample_count) { // if (sample_count > max_sample_count) {
_devInst->set_config(NULL, NULL, // _devInst->set_config(NULL, NULL,
SR_CONF_RLE, // SR_CONF_RLE,
g_variant_new_boolean(true)); // g_variant_new_boolean(true));
} else { // } else {
_devInst->set_config(NULL, NULL, // _devInst->set_config(NULL, NULL,
SR_CONF_RLE, // SR_CONF_RLE,
g_variant_new_boolean(false)); // g_variant_new_boolean(false));
} // }
} // }
update_scale(); update_scale();
} }
@@ -664,6 +665,7 @@ void SamplingBar::update_sample_count_selector_value()
_updating_sample_count = false; _updating_sample_count = false;
sample_count_changed(); sample_count_changed();
update_scale();
} }
void SamplingBar::commit_sample_count() void SamplingBar::commit_sample_count()

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -1429,6 +1429,12 @@ static int config_set(int id, GVariant *data, struct sr_dev_inst *sdi,
ret = command_dso_ctrl(usb->devhdl, dso_cmd_gen(sdi, 0, SR_CONF_SAMPLERATE)); ret = command_dso_ctrl(usb->devhdl, dso_cmd_gen(sdi, 0, SR_CONF_SAMPLERATE));
} else { } else {
devc->sample_wide = (devc->cur_samplerate <= DSLOGIC_MAX_LOGIC_SAMPLERATE); devc->sample_wide = (devc->cur_samplerate <= DSLOGIC_MAX_LOGIC_SAMPLERATE);
if (!devc->stream) {
if (devc->limit_samples > DSLOGIC_MAX_LOGIC_DEPTH*ceil(devc->cur_samplerate * 1.0 / DSLOGIC_MAX_LOGIC_SAMPLERATE))
devc->rle_mode = TRUE;
else
devc->rle_mode = FALSE;
}
ret = SR_OK; ret = SR_OK;
} }
} else if (id == SR_CONF_CLOCK_TYPE) { } else if (id == SR_CONF_CLOCK_TYPE) {
@@ -1459,6 +1465,14 @@ static int config_set(int id, GVariant *data, struct sr_dev_inst *sdi,
ret = SR_OK; ret = SR_OK;
} else if (id == SR_CONF_LIMIT_SAMPLES) { } else if (id == SR_CONF_LIMIT_SAMPLES) {
devc->limit_samples = g_variant_get_uint64(data); devc->limit_samples = g_variant_get_uint64(data);
if(sdi->mode == LOGIC) {
if (!devc->stream) {
if (devc->limit_samples > DSLOGIC_MAX_LOGIC_DEPTH*ceil(devc->cur_samplerate * 1.0 / DSLOGIC_MAX_LOGIC_SAMPLERATE))
devc->rle_mode = TRUE;
else
devc->rle_mode = FALSE;
}
}
ret = SR_OK; ret = SR_OK;
} else if (id == SR_CONF_DEVICE_MODE) { } else if (id == SR_CONF_DEVICE_MODE) {
sdi->mode = g_variant_get_int16(data); sdi->mode = g_variant_get_int16(data);
@@ -1574,6 +1588,7 @@ static int config_set(int id, GVariant *data, struct sr_dev_inst *sdi,
} else if (!strcmp(stropt, opmodes[SR_OP_STREAM]) && (devc->op_mode != SR_OP_STREAM)) { } else if (!strcmp(stropt, opmodes[SR_OP_STREAM]) && (devc->op_mode != SR_OP_STREAM)) {
devc->op_mode = SR_OP_STREAM; devc->op_mode = SR_OP_STREAM;
devc->stream = TRUE; devc->stream = TRUE;
devc->rle_mode = FALSE;
devc->ch_mode = 0; devc->ch_mode = 0;
devc->samplerates_size = 10; devc->samplerates_size = 10;
adjust_probes(sdi, stream_ch_num[0]); adjust_probes(sdi, stream_ch_num[0]);
@@ -1585,6 +1600,7 @@ static int config_set(int id, GVariant *data, struct sr_dev_inst *sdi,
adjust_probes(sdi, buffer_ch_num[0]); adjust_probes(sdi, buffer_ch_num[0]);
devc->limit_samples = DSLOGIC_MAX_LOGIC_DEPTH; devc->limit_samples = DSLOGIC_MAX_LOGIC_DEPTH;
devc->cur_samplerate = DSLOGIC_MAX_LOGIC_SAMPLERATE; devc->cur_samplerate = DSLOGIC_MAX_LOGIC_SAMPLERATE;
devc->sample_wide = TRUE;
} else if (!strcmp(stropt, opmodes[SR_OP_EXTERNAL_TEST]) && (devc->op_mode != SR_OP_EXTERNAL_TEST)) { } else if (!strcmp(stropt, opmodes[SR_OP_EXTERNAL_TEST]) && (devc->op_mode != SR_OP_EXTERNAL_TEST)) {
devc->op_mode = SR_OP_EXTERNAL_TEST; devc->op_mode = SR_OP_EXTERNAL_TEST;
devc->stream = FALSE; devc->stream = FALSE;
@@ -1593,6 +1609,7 @@ static int config_set(int id, GVariant *data, struct sr_dev_inst *sdi,
adjust_probes(sdi, buffer_ch_num[0]); adjust_probes(sdi, buffer_ch_num[0]);
devc->limit_samples = DSLOGIC_MAX_LOGIC_DEPTH; devc->limit_samples = DSLOGIC_MAX_LOGIC_DEPTH;
devc->cur_samplerate = DSLOGIC_MAX_LOGIC_SAMPLERATE; devc->cur_samplerate = DSLOGIC_MAX_LOGIC_SAMPLERATE;
devc->sample_wide = TRUE;
} else if (!strcmp(stropt, opmodes[SR_OP_LOOPBACK_TEST]) && (devc->op_mode != SR_OP_LOOPBACK_TEST)) { } else if (!strcmp(stropt, opmodes[SR_OP_LOOPBACK_TEST]) && (devc->op_mode != SR_OP_LOOPBACK_TEST)) {
devc->op_mode = SR_OP_LOOPBACK_TEST; devc->op_mode = SR_OP_LOOPBACK_TEST;
devc->stream = FALSE; devc->stream = FALSE;
@@ -1601,11 +1618,14 @@ static int config_set(int id, GVariant *data, struct sr_dev_inst *sdi,
adjust_probes(sdi, buffer_ch_num[0]); adjust_probes(sdi, buffer_ch_num[0]);
devc->limit_samples = DSLOGIC_MAX_LOGIC_DEPTH; devc->limit_samples = DSLOGIC_MAX_LOGIC_DEPTH;
devc->cur_samplerate = DSLOGIC_MAX_LOGIC_SAMPLERATE; devc->cur_samplerate = DSLOGIC_MAX_LOGIC_SAMPLERATE;
devc->sample_wide = TRUE;
} else { } else {
ret = SR_ERR; ret = SR_ERR;
} }
if (devc->cur_samplerate > samplerates[devc->samplerates_size-1]) if (devc->cur_samplerate > samplerates[devc->samplerates_size-1]) {
devc->cur_samplerate = samplerates[devc->samplerates_size-1]; devc->cur_samplerate = samplerates[devc->samplerates_size-1];
devc->sample_wide = (devc->cur_samplerate <= DSLOGIC_MAX_DSO_SAMPLERATE);
}
} }
sr_dbg("%s: setting pattern to %d", sr_dbg("%s: setting pattern to %d",
__func__, devc->op_mode); __func__, devc->op_mode);
@@ -1630,8 +1650,10 @@ static int config_set(int id, GVariant *data, struct sr_dev_inst *sdi,
break; break;
} }
} }
if (devc->cur_samplerate > samplerates[devc->samplerates_size-1]) if (devc->cur_samplerate > samplerates[devc->samplerates_size-1]) {
devc->cur_samplerate = samplerates[devc->samplerates_size-1]; devc->cur_samplerate = samplerates[devc->samplerates_size-1];
devc->sample_wide = (devc->cur_samplerate <= DSLOGIC_MAX_DSO_SAMPLERATE);
}
} }
sr_dbg("%s: setting channel mode to %d", sr_dbg("%s: setting channel mode to %d",
__func__, devc->ch_mode); __func__, devc->ch_mode);
@@ -2468,8 +2490,9 @@ static void receive_trigger_pos(struct libusb_transfer *transfer)
switch (transfer->status) { switch (transfer->status) {
case LIBUSB_TRANSFER_COMPLETED: case LIBUSB_TRANSFER_COMPLETED:
if (transfer->actual_length == sizeof(struct ds_trigger_pos)) { if (transfer->actual_length == sizeof(struct ds_trigger_pos)) {
if (trigger_pos->remain_cnt < devc->limit_samples) { if (devc->stream || trigger_pos->remain_cnt < devc->limit_samples) {
devc->actual_samples = (devc->limit_samples - ceil(devc->cur_samplerate * 1.0 / DSLOGIC_MAX_LOGIC_SAMPLERATE) * (trigger_pos->remain_cnt + devc->rle_mode)); if (!devc->stream)
devc->actual_samples = (devc->limit_samples - ceil(devc->cur_samplerate * 1.0 / DSLOGIC_MAX_LOGIC_SAMPLERATE) * (trigger_pos->remain_cnt));
packet.type = SR_DF_TRIGGER; packet.type = SR_DF_TRIGGER;
packet.payload = trigger_pos; packet.payload = trigger_pos;