From 48ab8049cfe6299e955bebc2fc84bd623244b72b Mon Sep 17 00:00:00 2001 From: DreamSourceLab Date: Mon, 28 Sep 2015 16:31:19 +0800 Subject: [PATCH] Fix display issue, add signal height limit --- DSView/pv/data/decode/annotation.cpp | 2 +- DSView/pv/dialogs/search.cpp | 2 +- DSView/pv/mainwindow.cpp | 1 + .../pv/prop/binding/binding_deviceoptions.cpp | 2 + DSView/pv/view/devmode.cpp | 2 +- DSView/pv/view/view.cpp | 13 ++++++- DSView/pv/view/view.h | 1 + libsigrok4DSL/hardware/DSL/dsl.h | 1 + libsigrok4DSL/hardware/DSL/dslogic.c | 38 +++++++++++++++++++ libsigrok4DSL/hardware/demo/demo.c | 32 ++++++++++++++++ libsigrok4DSL/hwdriver.c | 4 ++ libsigrok4DSL/libsigrok.h | 4 ++ 12 files changed, 98 insertions(+), 4 deletions(-) diff --git a/DSView/pv/data/decode/annotation.cpp b/DSView/pv/data/decode/annotation.cpp index 8e89b1d..a474dd9 100644 --- a/DSView/pv/data/decode/annotation.cpp +++ b/DSView/pv/data/decode/annotation.cpp @@ -40,7 +40,7 @@ Annotation::Annotation(const srd_proto_data *const pdata) : (const srd_proto_data_annotation*)pdata->data; assert(pda); - _format = pda->ann_format; + _format = pda->ann_class; const char *const *annotations = (char**)pda->ann_text; while(*annotations) { diff --git a/DSView/pv/dialogs/search.cpp b/DSView/pv/dialogs/search.cpp index 13dd3d7..aeaeb46 100644 --- a/DSView/pv/dialogs/search.cpp +++ b/DSView/pv/dialogs/search.cpp @@ -48,7 +48,7 @@ Search::Search(QWidget *parent, struct sr_dev_inst *sdi, QString pattern) : search_lineEdit.setInputMask("X X X X X X X X X X X X X X X X"); search_lineEdit.setFont(font); - QLabel *search_label = new QLabel("1 1 1 1 1\n5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0"); + QLabel *search_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"); search_label->setFont(font); search_buttonBox.addButton(QDialogButtonBox::Ok); diff --git a/DSView/pv/mainwindow.cpp b/DSView/pv/mainwindow.cpp index f8234d4..a8fb8d3 100644 --- a/DSView/pv/mainwindow.cpp +++ b/DSView/pv/mainwindow.cpp @@ -284,6 +284,7 @@ void MainWindow::update_device_list() { assert(_sampling_bar); + _session.stop_capture(); _view->show_trig_cursor(false); _trigger_widget->device_change(); #ifdef ENABLE_DECODE diff --git a/DSView/pv/prop/binding/binding_deviceoptions.cpp b/DSView/pv/prop/binding/binding_deviceoptions.cpp index 8b227ff..c8c1e9a 100644 --- a/DSView/pv/prop/binding/binding_deviceoptions.cpp +++ b/DSView/pv/prop/binding/binding_deviceoptions.cpp @@ -82,6 +82,8 @@ DeviceOptions::DeviceOptions(struct sr_dev_inst *sdi) : case SR_CONF_BUFFERSIZE: case SR_CONF_TRIGGER_SOURCE: case SR_CONF_FILTER: + case SR_CONF_MAX_HEIGHT: + case SR_CONF_MAX_HEIGHT_VALUE: case SR_CONF_COUPLING: case SR_CONF_EN_CH: case SR_CONF_OPERATION_MODE: diff --git a/DSView/pv/view/devmode.cpp b/DSView/pv/view/devmode.cpp index 295f8b0..f48c453 100644 --- a/DSView/pv/view/devmode.cpp +++ b/DSView/pv/view/devmode.cpp @@ -122,10 +122,10 @@ void DevMode::on_mode_change() i != _mode_button_list.end(); i++) { if ((*i).first.get() == button) { if (dev_inst->dev_inst()->mode != (*i).second->mode) { + _view.session().stop_capture(); dev_inst->set_config(NULL, NULL, SR_CONF_DEVICE_MODE, g_variant_new_int16((*i).second->mode)); - mode_changed(); } } diff --git a/DSView/pv/view/view.cpp b/DSView/pv/view/view.cpp index eb7f815..77e9d19 100644 --- a/DSView/pv/view/view.cpp +++ b/DSView/pv/view/view.cpp @@ -57,6 +57,7 @@ const int View::LabelMarginWidth = 70; const int View::RulerHeight = 50; const int View::MaxScrollValue = INT_MAX / 2; +const int View::MaxHeightUnit = 20; //const int View::SignalHeight = 30;s const int View::SignalMargin = 10; @@ -470,6 +471,7 @@ void View::update_scale() void View::signals_changed() { int total_rows = 0; + uint8_t max_height = MaxHeightUnit; const vector< boost::shared_ptr > traces(get_traces()); BOOST_FOREACH(const boost::shared_ptr t, traces) { @@ -483,7 +485,16 @@ void View::signals_changed() - horizontalScrollBar()->height() - 2 * SignalMargin * traces.size()) * 1.0 / total_rows; - _signalHeight = (int)((height <= 0) ? 1 : height); + if (_session.get_device()->dev_inst()->mode == LOGIC) { + GVariant* gvar = _session.get_device()->get_config(NULL, NULL, SR_CONF_MAX_HEIGHT_VALUE); + if (gvar != NULL) { + max_height = (g_variant_get_byte(gvar) + 1) * MaxHeightUnit; + g_variant_unref(gvar); + } + _signalHeight = (int)((height <= 0) ? 1 : (height >= max_height) ? max_height : height); + } else { + _signalHeight = (int)((height <= 0) ? 1 : height); + } _spanY = _signalHeight + 2 * SignalMargin; int next_v_offset = SignalMargin; BOOST_FOREACH(boost::shared_ptr t, traces) { diff --git a/DSView/pv/view/view.h b/DSView/pv/view/view.h index 92ba5c0..c3f6ac7 100644 --- a/DSView/pv/view/view.h +++ b/DSView/pv/view/view.h @@ -64,6 +64,7 @@ private: static const int RulerHeight; static const int MaxScrollValue; + static const int MaxHeightUnit; public: //static const int SignalHeight; diff --git a/libsigrok4DSL/hardware/DSL/dsl.h b/libsigrok4DSL/hardware/DSL/dsl.h index 4f5d022..9f1bbf7 100644 --- a/libsigrok4DSL/hardware/DSL/dsl.h +++ b/libsigrok4DSL/hardware/DSL/dsl.h @@ -169,6 +169,7 @@ struct DSL_context { int trigger_stage; uint16_t trigger_buffer[NUM_TRIGGER_STAGES]; uint64_t timebase; + uint8_t max_height; uint8_t trigger_slope; uint8_t trigger_source; uint8_t trigger_hrate; diff --git a/libsigrok4DSL/hardware/DSL/dslogic.c b/libsigrok4DSL/hardware/DSL/dslogic.c index 75aa014..6269e28 100644 --- a/libsigrok4DSL/hardware/DSL/dslogic.c +++ b/libsigrok4DSL/hardware/DSL/dslogic.c @@ -89,6 +89,14 @@ static const char *filters[] = { "1 Sample Clock", }; +static const char *maxHeights[] = { + "1X", + "2X", + "3X", + "4X", + "5X", +}; + static const int32_t hwopts[] = { SR_CONF_CONN, }; @@ -99,6 +107,7 @@ static const int32_t hwcaps[] = { SR_CONF_SAMPLERATE, /* These are really implemented in the driver, not the hardware. */ + SR_CONF_MAX_HEIGHT, SR_CONF_LIMIT_SAMPLES, SR_CONF_CONTINUOUS, }; @@ -107,6 +116,7 @@ static const int32_t hwoptions[] = { SR_CONF_OPERATION_MODE, SR_CONF_THRESHOLD, SR_CONF_FILTER, + SR_CONF_MAX_HEIGHT, SR_CONF_CLOCK_TYPE, SR_CONF_CLOCK_EDGE, }; @@ -115,6 +125,7 @@ static const int32_t hwoptions_pro[] = { SR_CONF_OPERATION_MODE, SR_CONF_VTH, SR_CONF_FILTER, + SR_CONF_MAX_HEIGHT, SR_CONF_CLOCK_TYPE, SR_CONF_CLOCK_EDGE, }; @@ -682,6 +693,7 @@ static struct DSL_context *DSLogic_dev_new(void) devc->stream = FALSE; devc->mstatus_valid = FALSE; devc->data_lock = FALSE; + devc->max_height = 1; return devc; } @@ -1238,6 +1250,18 @@ static int config_get(int id, GVariant **data, const struct sr_dev_inst *sdi, devc = sdi->priv; *data = g_variant_new_string(filters[devc->filter]); break; + case SR_CONF_MAX_HEIGHT: + if (!sdi) + return SR_ERR; + devc = sdi->priv; + *data = g_variant_new_string(maxHeights[devc->max_height]); + break; + case SR_CONF_MAX_HEIGHT_VALUE: + if (!sdi) + return SR_ERR; + devc = sdi->priv; + *data = g_variant_new_byte(devc->max_height); + break; case SR_CONF_THRESHOLD: if (!sdi) return SR_ERR; @@ -1650,6 +1674,17 @@ static int config_set(int id, GVariant *data, struct sr_dev_inst *sdi, } sr_dbg("%s: setting threshold to %d", __func__, devc->th_level); + } else if (id == SR_CONF_MAX_HEIGHT) { + stropt = g_variant_get_string(data, NULL); + ret = SR_OK; + for (i = 0; i < ARRAY_SIZE(maxHeights); i++) { + if (!strcmp(stropt, maxHeights[i])) { + devc->max_height = i; + break; + } + } + sr_dbg("%s: setting Signal Max Height to %d", + __func__, devc->max_height); } else if (id == SR_CONF_EN_CH) { ch->enabled = g_variant_get_boolean(data); if (sdi->mode == DSO) { @@ -1879,6 +1914,9 @@ static int config_list(int key, GVariant **data, const struct sr_dev_inst *sdi, case SR_CONF_FILTER: *data = g_variant_new_strv(filters, ARRAY_SIZE(filters)); break; + case SR_CONF_MAX_HEIGHT: + *data = g_variant_new_strv(maxHeights, ARRAY_SIZE(maxHeights)); + break; default: return SR_ERR_NA; } diff --git a/libsigrok4DSL/hardware/demo/demo.c b/libsigrok4DSL/hardware/demo/demo.c index eedd6c8..0a2f28e 100644 --- a/libsigrok4DSL/hardware/demo/demo.c +++ b/libsigrok4DSL/hardware/demo/demo.c @@ -78,6 +78,14 @@ static const char *pattern_strings[] = { "Random", }; +static const char *maxHeights[] = { + "1X", + "2X", + "3X", + "4X", + "5X", +}; + static struct sr_dev_mode mode_list[] = { {"LA", LOGIC}, {"DAQ", ANALOG}, @@ -100,6 +108,7 @@ struct dev_context { uint64_t timebase; gboolean instant; gboolean data_lock; + uint8_t max_height; int trigger_stage; uint16_t trigger_mask; @@ -112,6 +121,7 @@ static const int hwcaps[] = { SR_CONF_DEMO_DEV, SR_CONF_SAMPLERATE, SR_CONF_PATTERN_MODE, + SR_CONF_MAX_HEIGHT, SR_CONF_LIMIT_SAMPLES, SR_CONF_LIMIT_MSEC, SR_CONF_CONTINUOUS, @@ -119,6 +129,7 @@ static const int hwcaps[] = { static const int hwoptions[] = { SR_CONF_PATTERN_MODE, + SR_CONF_MAX_HEIGHT, }; static const int32_t sessions[] = { @@ -234,6 +245,7 @@ static GSList *hw_scan(GSList *options) devc->sample_generator = PATTERN_SINE; devc->timebase = 10000; devc->data_lock = FALSE; + devc->max_height = 1; sdi->priv = devc; @@ -355,6 +367,12 @@ static int config_get(int id, GVariant **data, const struct sr_dev_inst *sdi, case SR_CONF_PATTERN_MODE: *data = g_variant_new_string(pattern_strings[devc->sample_generator]); break; + case SR_CONF_MAX_HEIGHT: + *data = g_variant_new_string(maxHeights[devc->max_height]); + break; + case SR_CONF_MAX_HEIGHT_VALUE: + *data = g_variant_new_byte(devc->max_height); + break; case SR_CONF_VDIV: *data = g_variant_new_uint64(ch->vdiv); break; @@ -484,6 +502,17 @@ static int config_set(int id, GVariant *data, struct sr_dev_inst *sdi, } sr_dbg("%s: setting pattern to %d", __func__, devc->sample_generator); + } else if (id == SR_CONF_MAX_HEIGHT) { + stropt = g_variant_get_string(data, NULL); + ret = SR_OK; + for (i = 0; i < ARRAY_SIZE(maxHeights); i++) { + if (!strcmp(stropt, maxHeights[i])) { + devc->max_height = i; + break; + } + } + sr_dbg("%s: setting Signal Max Height to %d", + __func__, devc->max_height); } else if (id == SR_CONF_INSTANT) { devc->instant = g_variant_get_boolean(data); sr_dbg("%s: setting INSTANT mode to %d", __func__, @@ -575,6 +604,9 @@ static int config_list(int key, GVariant **data, const struct sr_dev_inst *sdi, case SR_CONF_PATTERN_MODE: *data = g_variant_new_strv(pattern_strings, ARRAY_SIZE(pattern_strings)); break; + case SR_CONF_MAX_HEIGHT: + *data = g_variant_new_strv(maxHeights, ARRAY_SIZE(maxHeights)); + break; default: return SR_ERR_NA; } diff --git a/libsigrok4DSL/hwdriver.c b/libsigrok4DSL/hwdriver.c index 25b7dbf..6bbd005 100644 --- a/libsigrok4DSL/hwdriver.c +++ b/libsigrok4DSL/hwdriver.c @@ -83,6 +83,10 @@ static struct sr_config_info sr_config_info_data[] = { "Buffer size", "Buffer size", NULL}, {SR_CONF_TIMEBASE, SR_T_UINT64, "timebase", "Time base", "Time base", NULL}, + {SR_CONF_MAX_HEIGHT, SR_T_CHAR, "height", + "Max Height", "Max Height", NULL}, + {SR_CONF_MAX_HEIGHT_VALUE, SR_T_UINT8, "height", + "Max Height", "Max Height", NULL}, {SR_CONF_FILTER, SR_T_CHAR, "filter", "Filter Targets", "Filter Targets", NULL}, {SR_CONF_VDIV, SR_T_RATIONAL_VOLT, "vdiv", diff --git a/libsigrok4DSL/libsigrok.h b/libsigrok4DSL/libsigrok.h index abe72ff..be9b1d7 100644 --- a/libsigrok4DSL/libsigrok.h +++ b/libsigrok4DSL/libsigrok.h @@ -804,6 +804,10 @@ enum { /** Device channel mode */ SR_CONF_CHANNEL_MODE, + /** Signal max height **/ + SR_CONF_MAX_HEIGHT, + SR_CONF_MAX_HEIGHT_VALUE, + /** Device sample threshold */ SR_CONF_THRESHOLD, SR_CONF_VTH, -- 2.30.2