diff --git a/DSView/pv/sigsession.cpp b/DSView/pv/sigsession.cpp index c4e34f2d..0138374e 100644 --- a/DSView/pv/sigsession.cpp +++ b/DSView/pv/sigsession.cpp @@ -455,15 +455,14 @@ namespace pv int run_dex = 0; clear_all_decode_task(run_dex); - _view_data->clear(); - // If switch the data buffer if (_view_data != _capture_data){ _capture_data->clear(); _capture_data = _view_data; } + _view_data->clear(); - init_signals(); + update_view(); // update setting if (_device_agent.is_file()) @@ -743,8 +742,9 @@ namespace pv break; } } + + clear_signals(); - RELEASE_ARRAY(_signals); std::vector().swap(_signals); _signals = sigs; @@ -837,8 +837,8 @@ namespace pv } if (!sigs.empty()) - { - RELEASE_ARRAY(_signals); + { + clear_signals(); std::vector().swap(_signals); _signals = sigs; } @@ -2048,4 +2048,27 @@ namespace pv } } + void SigSession::clear_signals() + { + for (int i=0; i< (int)_signals.size(); i++) + { + auto *p = _signals[i]; + p->sig_released(p); + + DESTROY_QT_LATER(p); + } + _signals.clear(); + } + + view::Signal* SigSession::get_signal_by_index(int index) + { + for (int i=0; i< (int)_signals.size(); i++) + { + auto *p = _signals[i]; + if (p->get_index() == index) + return p; + } + return NULL; + } + } // namespace pv diff --git a/DSView/pv/sigsession.h b/DSView/pv/sigsession.h index 2a62d51b..d5128382 100644 --- a/DSView/pv/sigsession.h +++ b/DSView/pv/sigsession.h @@ -381,6 +381,10 @@ public: return _view_data == _capture_data; } + inline void update_view(){ + _callback->data_updated(); + } + void auto_end(); bool have_hardware_data(); struct ds_device_base_info* get_device_list(int &out_count, int &actived_index); @@ -391,6 +395,7 @@ public: void set_decoder_row_label(int index, QString label); view::DecodeTrace* get_decoder_trace(int index); + view::Signal* get_signal_by_index(int index); private: void set_cur_samplelimits(uint64_t samplelimits); @@ -463,6 +468,8 @@ private: void repeat_capture_wait_timeout(); void repeat_wait_prog_timeout(); void realtime_refresh_timeout(); + + void clear_signals(); private: mutable std::mutex _sampling_mutex; diff --git a/DSView/pv/view/dsosignal.cpp b/DSView/pv/view/dsosignal.cpp index b24885da..867a92d9 100644 --- a/DSView/pv/view/dsosignal.cpp +++ b/DSView/pv/view/dsosignal.cpp @@ -79,6 +79,7 @@ DsoSignal::DsoSignal(data::DsoSnapshot *data, } _signal_type = DSO_SIGNAL; + _vDial = NULL; GVariant *gvar_list, *gvar_list_vdivs; @@ -106,8 +107,19 @@ DsoSignal::DsoSignal(data::DsoSnapshot *data, load_settings(); } +DsoSignal::DsoSignal(const DsoSignal &o) +:Signal(NULL) +{ +} + +DsoSignal::DsoSignal(DsoSignal &o) +:Signal(NULL) +{ +} + DsoSignal::~DsoSignal() { + DESTROY_OBJECT(_vDial); } void DsoSignal::set_scale(int height) @@ -1495,6 +1507,15 @@ double DsoSignal::get_voltage(uint64_t index) QString DsoSignal::get_voltage(double v, int p, bool scaled) { + // if (_vDial == NULL) + // return ""; + + this->_hover_en = this->_hover_en; + + if (_vDial == NULL){ + assert(false); + } + if (scaled) v = v * _vDial->get_value() * _vDial->get_factor() * DS_CONF_DSO_VDIVS / get_view_rect().height(); else diff --git a/DSView/pv/view/dsosignal.h b/DSView/pv/view/dsosignal.h index 9d516dfa..2aedb72d 100644 --- a/DSView/pv/view/dsosignal.h +++ b/DSView/pv/view/dsosignal.h @@ -81,6 +81,9 @@ private: static const uint16_t MS_RectMargin = 10; static const uint16_t MS_RectHeight = 25; + DsoSignal(const DsoSignal &o); + DsoSignal(DsoSignal &o); + public: DsoSignal(pv::data::DsoSnapshot *data, sr_channel *probe); diff --git a/DSView/pv/view/signal.h b/DSView/pv/view/signal.h index 607754cc..ee0ba95a 100644 --- a/DSView/pv/view/signal.h +++ b/DSView/pv/view/signal.h @@ -60,6 +60,9 @@ class Signal : public Trace { Q_OBJECT +signals: + void sig_released(void *o); + protected: Signal(sr_channel * const probe); @@ -68,9 +71,7 @@ protected: */ Signal(const Signal &s, sr_channel * const probe); -public: - // virtual pv::data::SignalData* data() = 0; - +public: /** * Returns true if the trace is visible and enabled. */ diff --git a/DSView/pv/view/viewport.cpp b/DSView/pv/view/viewport.cpp index 9f44028b..2a58a8de 100644 --- a/DSView/pv/view/viewport.cpp +++ b/DSView/pv/view/viewport.cpp @@ -607,10 +607,12 @@ void Viewport::mousePressEvent(QMouseEvent *event) if (_action_type == NO_ACTION && _view.xcursors_shown()) { auto i = _view.get_xcursorList().begin(); const QRect xrect = _view.get_view_rect(); + while (i != _view.get_xcursorList().end()) { const double cursorX = xrect.left() + (*i)->value(XCursor::XCur_Y)*xrect.width(); const double cursorY0 = xrect.top() + (*i)->value(XCursor::XCur_X0)*xrect.height(); const double cursorY1 = xrect.top() + (*i)->value(XCursor::XCur_X1)*xrect.height(); + if ((*i)->get_close_rect(xrect).contains(_view.hover_point())) { _view.del_xcursor(*i); if (_view.get_xcursorList().empty()) diff --git a/DSView/pv/view/xcursor.cpp b/DSView/pv/view/xcursor.cpp index 016bdccb..e4d6ea09 100644 --- a/DSView/pv/view/xcursor.cpp +++ b/DSView/pv/view/xcursor.cpp @@ -43,6 +43,7 @@ XCursor::XCursor(View &view, QColor &colour, _colour(colour) { _dsoSig = NULL; + _sig_index = -1; for(auto s : _view.session().get_signals()) { if (s->signal_type() == DSO_SIGNAL){ @@ -53,18 +54,29 @@ XCursor::XCursor(View &view, QColor &colour, } } } + + if (_dsoSig != NULL){ + connect(_dsoSig, SIGNAL(sig_released(void*)), this, SLOT(on_signal_deleted(void*))); + _sig_index = _dsoSig->get_index(); + } } XCursor::XCursor(const XCursor &x) : QObject(), - _view(x._view), - _dsoSig(x._dsoSig), - _yvalue(x._yvalue), - _value0(x._value0), - _value1(x._value1), - _grabbed(XCur_None), - _colour(x._colour) + _view(x._view) { + _dsoSig = x._dsoSig; + _yvalue = x._yvalue; + _value0 = x._value0; + _value1 = x._value1; + _grabbed = XCur_None; + _colour = x._colour; + _sig_index = -1; + + if (_dsoSig != NULL){ + connect(_dsoSig, SIGNAL(sig_released(void*)), this, SLOT(on_signal_deleted(void*))); + _sig_index = _dsoSig->get_index(); + } } QColor XCursor::colour() @@ -84,15 +96,29 @@ DsoSignal* XCursor::channel() { return _dsoSig; } + void XCursor::set_channel(DsoSignal *sig) { _dsoSig = sig; + + if (_dsoSig != NULL){ + connect(_dsoSig, SIGNAL(sig_released(void*)), this, SLOT(on_signal_deleted(void*))); + _sig_index = _dsoSig->get_index(); + } +} + +void XCursor::on_signal_deleted(void *o) +{ + if (o == _dsoSig){ + _dsoSig = NULL; + } } enum XCursor::XCur_type XCursor::grabbed() { return _grabbed; } + void XCursor::set_grabbed(XCur_type type, bool grabbed) { if (_grabbed == XCur_None && grabbed) @@ -100,6 +126,7 @@ void XCursor::set_grabbed(XCur_type type, bool grabbed) else if (_grabbed == type && !grabbed) _grabbed = XCur_None; } + void XCursor::rel_grabbed() { _grabbed = XCur_None; @@ -129,7 +156,15 @@ void XCursor::set_value(XCur_type type, double value) } void XCursor::paint(QPainter &p, const QRect &rect, XCur_type highlight, int order) -{ +{ + // Attach the channel + if (_dsoSig == NULL && _sig_index != -1){ + auto sig = _view.session().get_signal_by_index(_sig_index); + if (sig != NULL){ + _dsoSig = dynamic_cast(sig); + } + } + const int arrow = 3; const int x = rect.left() + _yvalue * rect.width(); const int y0 = rect.top() + _value0 * rect.height(); @@ -216,10 +251,14 @@ void XCursor::paint_label(QPainter &p, const QRect &rect) QRect close = get_close_rect(rect); p.setPen(Qt::NoPen); + if (close.contains(QPoint(_view.hover_point().x(), _view.hover_point().y()))) p.setBrush(View::Red); - else + else if (_dsoSig != NULL) p.setBrush(_dsoSig->get_colour()); + else + p.setBrush(View::Blue); + p.drawRect(close); p.setPen(Qt::black); p.drawLine(close.left() + 2, close.top() + 2, close.right() - 2, close.bottom() - 2); diff --git a/DSView/pv/view/xcursor.h b/DSView/pv/view/xcursor.h index 7a95bf1c..96f2b892 100644 --- a/DSView/pv/view/xcursor.h +++ b/DSView/pv/view/xcursor.h @@ -124,9 +124,13 @@ public: signals: void value_changed(); +private slots: + void on_signal_deleted(void *o); + protected: View &_view; DsoSignal *_dsoSig; + int _sig_index; double _yvalue; double _value0; diff --git a/DSView/res/DSCope1.def.dsc b/DSView/res/DSCope1.def.dsc new file mode 100644 index 00000000..3fcb5e4c --- /dev/null +++ b/DSView/res/DSCope1.def.dsc @@ -0,0 +1,74 @@ +{ + "Device": "DSCope", + "DeviceMode": 1, + "Horizontal trigger position": "50", + "Language": 31, + "Operation Mode": "Normal", + "Time base": "10000", + "Trigger channel": "0", + "Trigger hold off": "0", + "Trigger margin": "8", + "Trigger slope": "0", + "Trigger source": "0", + "Version": 2, + "channel": [ + { + "colour": "#eeb211", + "coupling": 0, + "enabled": true, + "index": 0, + "name": "0", + "trigValue": 0.40157480314960631, + "type": 10001, + "vdiv": 1000, + "vfactor": 1, + "zeroPos": 0.40157480314960631 + }, + { + "colour": "#009925", + "coupling": 0, + "enabled": true, + "index": 1, + "name": "1", + "trigValue": 0.59842519685039375, + "type": 10001, + "vdiv": 1000, + "vfactor": 1, + "zeroPos": 0.59842519685039375 + } + ], + "decoder": [ + ], + "measure": [ + { + "index": 0, + "site": 0, + "type": 1 + }, + { + "index": 0, + "site": 1, + "type": 17 + }, + { + "index": 0, + "site": 2, + "type": 18 + }, + { + "index": 1, + "site": 5, + "type": 1 + }, + { + "index": 1, + "site": 6, + "type": 17 + }, + { + "index": 1, + "site": 7, + "type": 18 + } + ] +} diff --git a/DSView/res/DSCope2.def.dsc b/DSView/res/DSCope2.def.dsc new file mode 100644 index 00000000..48be72cf --- /dev/null +++ b/DSView/res/DSCope2.def.dsc @@ -0,0 +1,48 @@ +{ + "Device": "DSCope", + "DeviceMode": 2, + "Horizontal trigger position": "0", + "Language": 31, + "Operation Mode": "Normal", + "Sample count": "10000000", + "Sample rate": "10000000", + "Time base": "10000", + "Trigger channel": "0", + "Trigger hold off": "0", + "Trigger margin": "8", + "Trigger slope": "0", + "Trigger source": "0", + "Version": 2, + "channel": [ + { + "colour": "#eeb211", + "coupling": 0, + "enabled": true, + "index": 0, + "mapMax": 5, + "mapMin": -5, + "mapUnit": "V", + "name": "0", + "type": 10002, + "vdiv": 1000, + "vfactor": 1, + "zeroPos": 0.5 + }, + { + "colour": "#009925", + "coupling": 0, + "enabled": true, + "index": 1, + "mapMax": 5, + "mapMin": -5, + "mapUnit": "V", + "name": "1", + "type": 10002, + "vdiv": 1000, + "vfactor": 1, + "zeroPos": 0.5 + } + ], + "decoder": [ + ] +} diff --git a/DSView/res/DSLogic0.def.dsc b/DSView/res/DSLogic0.def.dsc new file mode 100644 index 00000000..71acd77b --- /dev/null +++ b/DSView/res/DSLogic0.def.dsc @@ -0,0 +1,279 @@ +{ + "Channel Mode": "Use 16 Channels (Max 20MHz)", + "Device": "DSLogic", + "DeviceMode": 0, + "Enable RLE Compress": 0, + "Filter Targets": "None", + "Horizontal trigger position": "0", + "Language": 31, + "Max Height": "1X", + "Operation Mode": "Stream Mode", + "Sample count": "1000000", + "Sample rate": "1000000", + "Stop Options": "Upload captured data", + "Threshold Level": 1, + "Trigger channel": "0", + "Trigger hold off": "0", + "Trigger margin": "8", + "Trigger slope": "0", + "Trigger source": "0", + "Using Clock Negedge": 0, + "Using External Clock": 0, + "Version": 2, + "channel": [ + { + "colour": "default", + "enabled": true, + "index": 0, + "name": "0", + "strigger": 0, + "type": 10000 + }, + { + "colour": "default", + "enabled": true, + "index": 1, + "name": "1", + "strigger": 0, + "type": 10000 + }, + { + "colour": "default", + "enabled": true, + "index": 2, + "name": "2", + "strigger": 0, + "type": 10000 + }, + { + "colour": "default", + "enabled": true, + "index": 3, + "name": "3", + "strigger": 0, + "type": 10000 + }, + { + "colour": "default", + "enabled": true, + "index": 4, + "name": "4", + "strigger": 0, + "type": 10000 + }, + { + "colour": "default", + "enabled": true, + "index": 5, + "name": "5", + "strigger": 0, + "type": 10000 + }, + { + "colour": "default", + "enabled": true, + "index": 6, + "name": "6", + "strigger": 0, + "type": 10000 + }, + { + "colour": "default", + "enabled": true, + "index": 7, + "name": "7", + "strigger": 0, + "type": 10000 + }, + { + "colour": "default", + "enabled": true, + "index": 8, + "name": "8", + "strigger": 0, + "type": 10000 + }, + { + "colour": "default", + "enabled": true, + "index": 9, + "name": "9", + "strigger": 0, + "type": 10000 + }, + { + "colour": "default", + "enabled": true, + "index": 10, + "name": "10", + "strigger": 0, + "type": 10000 + }, + { + "colour": "default", + "enabled": true, + "index": 11, + "name": "11", + "strigger": 0, + "type": 10000 + }, + { + "colour": "default", + "enabled": true, + "index": 12, + "name": "12", + "strigger": 0, + "type": 10000 + }, + { + "colour": "default", + "enabled": true, + "index": 13, + "name": "13", + "strigger": 0, + "type": 10000 + }, + { + "colour": "default", + "enabled": true, + "index": 14, + "name": "14", + "strigger": 0, + "type": 10000 + }, + { + "colour": "default", + "enabled": true, + "index": 15, + "name": "15", + "strigger": 0, + "type": 10000 + } + ], + "decoder": [ + ], + "trigger": { + "advTriggerMode": false, + "serialTriggerBits": 0, + "serialTriggerChannel": 0, + "serialTriggerClock": "X X X X X X X X X X X X X X X X", + "serialTriggerData": "X X X X X X X X X X X X X X X X", + "serialTriggerStart": "X X X X X X X X X X X X X X X X", + "serialTriggerStop": "X X X X X X X X X X X X X X X X", + "stageTriggerContiguous0": false, + "stageTriggerContiguous1": false, + "stageTriggerContiguous10": false, + "stageTriggerContiguous11": false, + "stageTriggerContiguous12": false, + "stageTriggerContiguous13": false, + "stageTriggerContiguous14": false, + "stageTriggerContiguous15": false, + "stageTriggerContiguous2": false, + "stageTriggerContiguous3": false, + "stageTriggerContiguous4": false, + "stageTriggerContiguous5": false, + "stageTriggerContiguous6": false, + "stageTriggerContiguous7": false, + "stageTriggerContiguous8": false, + "stageTriggerContiguous9": false, + "stageTriggerCount0": 1, + "stageTriggerCount1": 1, + "stageTriggerCount10": 1, + "stageTriggerCount11": 1, + "stageTriggerCount12": 1, + "stageTriggerCount13": 1, + "stageTriggerCount14": 1, + "stageTriggerCount15": 1, + "stageTriggerCount2": 1, + "stageTriggerCount3": 1, + "stageTriggerCount4": 1, + "stageTriggerCount5": 1, + "stageTriggerCount6": 1, + "stageTriggerCount7": 1, + "stageTriggerCount8": 1, + "stageTriggerCount9": 1, + "stageTriggerInv00": 0, + "stageTriggerInv01": 0, + "stageTriggerInv010": 0, + "stageTriggerInv011": 0, + "stageTriggerInv012": 0, + "stageTriggerInv013": 0, + "stageTriggerInv014": 0, + "stageTriggerInv015": 0, + "stageTriggerInv02": 0, + "stageTriggerInv03": 0, + "stageTriggerInv04": 0, + "stageTriggerInv05": 0, + "stageTriggerInv06": 0, + "stageTriggerInv07": 0, + "stageTriggerInv08": 0, + "stageTriggerInv09": 0, + "stageTriggerInv10": 0, + "stageTriggerInv11": 0, + "stageTriggerInv110": 0, + "stageTriggerInv111": 0, + "stageTriggerInv112": 0, + "stageTriggerInv113": 0, + "stageTriggerInv114": 0, + "stageTriggerInv115": 0, + "stageTriggerInv12": 0, + "stageTriggerInv13": 0, + "stageTriggerInv14": 0, + "stageTriggerInv15": 0, + "stageTriggerInv16": 0, + "stageTriggerInv17": 0, + "stageTriggerInv18": 0, + "stageTriggerInv19": 0, + "stageTriggerLogic0": 1, + "stageTriggerLogic1": 1, + "stageTriggerLogic10": 1, + "stageTriggerLogic11": 1, + "stageTriggerLogic12": 1, + "stageTriggerLogic13": 1, + "stageTriggerLogic14": 1, + "stageTriggerLogic15": 1, + "stageTriggerLogic2": 1, + "stageTriggerLogic3": 1, + "stageTriggerLogic4": 1, + "stageTriggerLogic5": 1, + "stageTriggerLogic6": 1, + "stageTriggerLogic7": 1, + "stageTriggerLogic8": 1, + "stageTriggerLogic9": 1, + "stageTriggerValue00": "X X X X X X X X X X X X X X X X", + "stageTriggerValue01": "X X X X X X X X X X X X X X X X", + "stageTriggerValue010": "X X X X X X X X X X X X X X X X", + "stageTriggerValue011": "X X X X X X X X X X X X X X X X", + "stageTriggerValue012": "X X X X X X X X X X X X X X X X", + "stageTriggerValue013": "X X X X X X X X X X X X X X X X", + "stageTriggerValue014": "X X X X X X X X X X X X X X X X", + "stageTriggerValue015": "X X X X X X X X X X X X X X X X", + "stageTriggerValue02": "X X X X X X X X X X X X X X X X", + "stageTriggerValue03": "X X X X X X X X X X X X X X X X", + "stageTriggerValue04": "X X X X X X X X X X X X X X X X", + "stageTriggerValue05": "X X X X X X X X X X X X X X X X", + "stageTriggerValue06": "X X X X X X X X X X X X X X X X", + "stageTriggerValue07": "X X X X X X X X X X X X X X X X", + "stageTriggerValue08": "X X X X X X X X X X X X X X X X", + "stageTriggerValue09": "X X X X X X X X X X X X X X X X", + "stageTriggerValue10": "X X X X X X X X X X X X X X X X", + "stageTriggerValue11": "X X X X X X X X X X X X X X X X", + "stageTriggerValue110": "X X X X X X X X X X X X X X X X", + "stageTriggerValue111": "X X X X X X X X X X X X X X X X", + "stageTriggerValue112": "X X X X X X X X X X X X X X X X", + "stageTriggerValue113": "X X X X X X X X X X X X X X X X", + "stageTriggerValue114": "X X X X X X X X X X X X X X X X", + "stageTriggerValue115": "X X X X X X X X X X X X X X X X", + "stageTriggerValue12": "X X X X X X X X X X X X X X X X", + "stageTriggerValue13": "X X X X X X X X X X X X X X X X", + "stageTriggerValue14": "X X X X X X X X X X X X X X X X", + "stageTriggerValue15": "X X X X X X X X X X X X X X X X", + "stageTriggerValue16": "X X X X X X X X X X X X X X X X", + "stageTriggerValue17": "X X X X X X X X X X X X X X X X", + "stageTriggerValue18": "X X X X X X X X X X X X X X X X", + "stageTriggerValue19": "X X X X X X X X X X X X X X X X", + "triggerPos": 1, + "triggerStages": 0, + "triggerTab": 0 + } +} diff --git a/DSView/res/DSLogic1.def.dsc b/DSView/res/DSLogic1.def.dsc new file mode 100644 index 00000000..6e5fdc1a --- /dev/null +++ b/DSView/res/DSLogic1.def.dsc @@ -0,0 +1,82 @@ +{ + "Channel Mode": "Use Channels 0~1 (Max 200MHz)", + "Device": "DSLogic", + "DeviceMode": 1, + "Enable RLE Compress": 1, + "Filter Targets": "None", + "Horizontal trigger position": "50", + "Language": 31, + "Max Height": "1X", + "Operation Mode": "Stream Mode", + "Sample count": "1000000", + "Sample rate": "100000000", + "Stop Options": "Upload captured data", + "Threshold Level": "1.8/2.5/3.3V Level", + "Trigger hold off": "0", + "Trigger margin": "8", + "Trigger slope": "0", + "Trigger source": "0", + "Using Clock Negedge": 0, + "Using External Clock": 0, + "Version": 2, + "channel": [ + { + "colour": "#eeb211", + "coupling": 0, + "enabled": true, + "index": 0, + "name": "0", + "trigValue": 0.40157480314960631, + "type": 10001, + "vdiv": 1000, + "vfactor": 1, + "zeroPos": 0.40157480314960631 + }, + { + "colour": "#009925", + "coupling": 0, + "enabled": true, + "index": 1, + "name": "1", + "trigValue": 0.59842519685039375, + "type": 10001, + "vdiv": 1000, + "vfactor": 1, + "zeroPos": 0.59842519685039375 + } + ], + "decoder": [ + ], + "measure": [ + { + "index": 0, + "site": 0, + "type": 1 + }, + { + "index": 0, + "site": 1, + "type": 17 + }, + { + "index": 0, + "site": 2, + "type": 18 + }, + { + "index": 1, + "site": 5, + "type": 1 + }, + { + "index": 1, + "site": 6, + "type": 17 + }, + { + "index": 1, + "site": 7, + "type": 18 + } + ] +} diff --git a/DSView/res/DSLogic2.def.dsc b/DSView/res/DSLogic2.def.dsc new file mode 100644 index 00000000..672b2be3 --- /dev/null +++ b/DSView/res/DSLogic2.def.dsc @@ -0,0 +1,52 @@ +{ + "Channel Mode": "Use Channels 0~1 (Max 10MHz)", + "Device": "DSLogic", + "DeviceMode": 2, + "Enable RLE Compress": 1, + "Filter Targets": "None", + "Horizontal trigger position": "0", + "Language": 31, + "Max Height": "1X", + "Operation Mode": "Stream Mode", + "Sample count": "1000000", + "Sample rate": "1000000", + "Stop Options": "Upload captured data", + "Threshold Level": "1.8/2.5/3.3V Level", + "Trigger hold off": "0", + "Trigger margin": "8", + "Trigger slope": "0", + "Trigger source": "0", + "Using Clock Negedge": 0, + "Using External Clock": 0, + "Version": 2, + "channel": [ + { + "colour": "#eeb211", + "coupling": 0, + "enabled": true, + "index": 0, + "mapMax": 5, + "mapMin": -5, + "mapUnit": "V", + "name": "0", + "type": 10002, + "vdiv": 1000, + "zeroPos": 0.5 + }, + { + "colour": "#009925", + "coupling": 0, + "enabled": true, + "index": 1, + "mapMax": 5, + "mapMin": -5, + "mapUnit": "V", + "name": "1", + "type": 10002, + "vdiv": 1000, + "zeroPos": 0.5 + } + ], + "decoder": [ + ] +}