From 2add0e3cf3bbc5b65660f29663d04f8f2037cf25 Mon Sep 17 00:00:00 2001 From: DreamSourceLab Date: Sat, 20 May 2017 03:20:06 +0800 Subject: [PATCH 1/4] v0.97 initial update, compile pass, run error --- DSView/CMakeLists.txt | 6 +- DSView/DSView.desktop | 9 - DSView/DSView.qrc | 13 +- DSView/darkstyle/style.qss | 4 +- DSView/dsapplication.cpp | 6 +- DSView/icons/add.png | Bin 260 -> 399 bytes DSView/icons/del.png | Bin 624 -> 714 bytes DSView/main.cpp | 5 +- DSView/pv/data/analogsnapshot.cpp | 58 +- DSView/pv/data/analogsnapshot.h | 10 +- DSView/pv/data/decode/decoder.cpp | 41 +- DSView/pv/data/decode/decoder.h | 27 +- DSView/pv/data/decode/rowdata.cpp | 22 +- DSView/pv/data/decode/rowdata.h | 4 + DSView/pv/data/decoderstack.cpp | 199 +-- DSView/pv/data/decoderstack.h | 15 +- DSView/pv/data/dsosnapshot.cpp | 44 +- DSView/pv/data/dsosnapshot.h | 6 +- DSView/pv/data/logicsnapshot.cpp | 1320 +++++++++++------ DSView/pv/data/logicsnapshot.h | 155 +- DSView/pv/data/mathstack.cpp | 5 +- DSView/pv/data/signaldata.cpp | 8 +- DSView/pv/data/signaldata.h | 3 - DSView/pv/data/snapshot.cpp | 45 +- DSView/pv/data/snapshot.h | 9 +- DSView/pv/device/device.cpp | 3 +- DSView/pv/device/device.h | 2 +- DSView/pv/device/devinst.cpp | 8 +- DSView/pv/device/devinst.h | 3 + DSView/pv/device/file.cpp | 32 +- DSView/pv/device/file.h | 5 + DSView/pv/device/inputfile.cpp | 19 +- DSView/pv/device/sessionfile.cpp | 2 +- DSView/pv/dialogs/calibration.cpp | 14 +- DSView/pv/dialogs/deviceoptions.cpp | 118 +- DSView/pv/dialogs/deviceoptions.h | 2 + DSView/pv/dialogs/dsdialog.cpp | 3 +- DSView/pv/dialogs/dsmessagebox.cpp | 6 +- DSView/pv/dialogs/protocolexp.cpp | 7 +- DSView/pv/dialogs/protocollist.cpp | 11 +- DSView/pv/dialogs/protocollist.h | 1 + DSView/pv/dialogs/search.cpp | 87 +- DSView/pv/dialogs/search.h | 12 +- DSView/pv/dialogs/storeprogress.cpp | 104 +- DSView/pv/dialogs/storeprogress.h | 32 +- DSView/pv/dialogs/waitingdialog.cpp | 8 +- DSView/pv/dock/measuredock.cpp | 597 ++++++-- DSView/pv/dock/measuredock.h | 67 +- DSView/pv/dock/protocoldock.cpp | 103 +- DSView/pv/dock/protocoldock.h | 13 +- DSView/pv/dock/searchdock.cpp | 289 ++-- DSView/pv/dock/searchdock.h | 9 +- DSView/pv/dock/triggerdock.cpp | 195 +-- DSView/pv/dock/triggerdock.h | 9 +- DSView/pv/mainframe.cpp | 44 +- DSView/pv/mainframe.h | 3 +- DSView/pv/mainwindow.cpp | 368 +++-- DSView/pv/mainwindow.h | 28 +- DSView/pv/prop/binding/binding.cpp | 12 + DSView/pv/prop/binding/binding.h | 4 + .../pv/prop/binding/binding_deviceoptions.cpp | 1 + DSView/pv/prop/binding/decoderoptions.h | 6 +- DSView/pv/prop/bool.cpp | 7 + DSView/pv/prop/bool.h | 2 + DSView/pv/prop/property.cpp | 5 + DSView/pv/prop/property.h | 2 + DSView/pv/sigsession.cpp | 632 ++++---- DSView/pv/sigsession.h | 86 +- DSView/pv/storesession.cpp | 902 +++++++++-- DSView/pv/storesession.h | 43 +- DSView/pv/toolbars/filebar.cpp | 79 +- DSView/pv/toolbars/filebar.h | 8 +- DSView/pv/toolbars/samplingbar.cpp | 262 +++- DSView/pv/toolbars/samplingbar.h | 19 + DSView/pv/view/analogsignal.cpp | 29 +- DSView/pv/view/analogsignal.h | 18 +- DSView/pv/view/cursor.cpp | 60 +- DSView/pv/view/cursor.h | 4 +- DSView/pv/view/decodetrace.cpp | 121 +- DSView/pv/view/devmode.cpp | 2 +- DSView/pv/view/dsosignal.cpp | 221 ++- DSView/pv/view/dsosignal.h | 12 +- DSView/pv/view/groupsignal.cpp | 12 +- DSView/pv/view/groupsignal.h | 2 - DSView/pv/view/header.cpp | 9 - DSView/pv/view/header.h | 2 - DSView/pv/view/logicsignal.cpp | 243 +-- DSView/pv/view/logicsignal.h | 11 +- DSView/pv/view/ruler.cpp | 47 +- DSView/pv/view/signal.h | 2 - DSView/pv/view/timemarker.cpp | 20 +- DSView/pv/view/timemarker.h | 11 +- DSView/pv/view/view.cpp | 197 ++- DSView/pv/view/view.h | 82 +- DSView/pv/view/viewport.cpp | 234 +-- DSView/pv/view/viewport.h | 18 +- DSView/pv/widgets/border.cpp | 5 + DSView/pv/widgets/border.h | 1 + DSView/pv/widgets/viewstatus.cpp | 31 +- DSView/pv/widgets/viewstatus.h | 9 +- libsigrok4DSL/Makefile.am | 1 - libsigrok4DSL/filter.c | 170 --- libsigrok4DSL/hardware/DSL/command.c | 13 +- libsigrok4DSL/hardware/DSL/command.h | 8 +- libsigrok4DSL/hardware/DSL/dscope.c | 407 ++--- libsigrok4DSL/hardware/DSL/dsl.h | 138 +- libsigrok4DSL/hardware/DSL/dslogic.c | 963 ++++++------ libsigrok4DSL/hardware/common/ezusb.c | 2 +- libsigrok4DSL/hardware/demo/demo.c | 96 +- libsigrok4DSL/hwdriver.c | 6 +- libsigrok4DSL/input/in_binary.c | 1 + libsigrok4DSL/input/in_vcd.c | 1 + libsigrok4DSL/input/in_wav.c | 1 + libsigrok4DSL/libsigrok.h | 68 +- libsigrok4DSL/proto.h | 16 +- libsigrok4DSL/session.c | 15 +- libsigrok4DSL/session_driver.c | 345 ++++- libsigrok4DSL/session_file.c | 384 ++--- libsigrok4DSL/std.c | 2 + libsigrokdecode4DSL/NEWS | 232 +++ libsigrokdecode4DSL/README | 2 +- libsigrokdecode4DSL/decoder.c | 953 +++++++----- libsigrokdecode4DSL/exception.c | 179 ++- libsigrokdecode4DSL/instance.c | 50 +- .../libsigrokdecode-internal.h | 43 +- libsigrokdecode4DSL/libsigrokdecode.h | 14 +- libsigrokdecode4DSL/module_sigrokdecode.c | 69 +- libsigrokdecode4DSL/session.c | 31 +- libsigrokdecode4DSL/srd.c | 93 +- libsigrokdecode4DSL/type_decoder.c | 161 +- libsigrokdecode4DSL/type_logic.c | 88 +- libsigrokdecode4DSL/util.c | 290 ++-- 132 files changed, 7811 insertions(+), 4722 deletions(-) delete mode 100755 DSView/DSView.desktop mode change 100644 => 100755 DSView/icons/add.png mode change 100644 => 100755 DSView/icons/del.png delete mode 100644 libsigrok4DSL/filter.c diff --git a/DSView/CMakeLists.txt b/DSView/CMakeLists.txt index fad159d8..701c9e9a 100644 --- a/DSView/CMakeLists.txt +++ b/DSView/CMakeLists.txt @@ -62,6 +62,7 @@ endif() list(APPEND PKGDEPS "libsigrok4DSL >= 0.2.0" "libusb-1.0 >= 1.0.16" + "libzip >= 0.10" ) if(ENABLE_DECODE) list(APPEND PKGDEPS "libsigrokdecode>=0.3.0") @@ -93,6 +94,7 @@ find_package(Threads) find_package(Boost 1.42 COMPONENTS filesystem system thread REQUIRED) find_package(libusb-1.0 REQUIRED) +find_package(libzip REQUIRED) find_package(FFTW REQUIRED) #=============================================================================== @@ -104,7 +106,7 @@ set(DS_DESCRIPTION "A GUI for instruments of DreamSourceLab") set(DS_VERSION_MAJOR 0) set(DS_VERSION_MINOR 9) -set(DS_VERSION_MICRO 6) +set(DS_VERSION_MICRO 7) set(DS_VERSION_STRING ${DS_VERSION_MAJOR}.${DS_VERSION_MINOR}.${DS_VERSION_MICRO} ) @@ -202,6 +204,7 @@ set(DSView_SOURCES pv/dialogs/dsmessagebox.cpp pv/dialogs/shadow.cpp pv/dialogs/dsdialog.cpp + pv/dialogs/interval.cpp ) set(DSView_HEADERS @@ -257,6 +260,7 @@ set(DSView_HEADERS pv/dialogs/dsmessagebox.h pv/dialogs/shadow.h pv/dialogs/dsdialog.h + pv/dialogs/interval.h ) set(DSView_FORMS diff --git a/DSView/DSView.desktop b/DSView/DSView.desktop deleted file mode 100755 index fba3202a..00000000 --- a/DSView/DSView.desktop +++ /dev/null @@ -1,9 +0,0 @@ -[Desktop Entry] -Version=0.96 -Exec=/usr/local/bin/DSView -Name=DSView -Comment=GUI Program for DreamSourceLab USB-based Instruments -Icon=/usr/local/share/DSView/logo.png -Type=Application -Terminal=false -Categories=Development diff --git a/DSView/DSView.qrc b/DSView/DSView.qrc index f58808ff..f560529f 100644 --- a/DSView/DSView.qrc +++ b/DSView/DSView.qrc @@ -10,8 +10,6 @@ stylesheet.qss icons/down-arrow.png icons/slider-handle.png - icons/add.png - icons/del.png icons/trigger.png icons/measure.png icons/search-bar.png @@ -55,5 +53,16 @@ icons/maximize.png icons/minimize.png icons/restore.png + icons/nav.png + icons/oneloop.png + icons/repeat.png + icons/moder.png + icons/moder_dis.png + icons/modes.png + icons/modes_dis.png + icons/add.png + icons/del.png + icons/add_dis.png + icons/del_dis.png diff --git a/DSView/darkstyle/style.qss b/DSView/darkstyle/style.qss index 21455512..f23c1ea1 100755 --- a/DSView/darkstyle/style.qss +++ b/DSView/darkstyle/style.qss @@ -65,7 +65,7 @@ QWidget:item:selected QCheckBox { - spacing: 5px; + spacing: 0px; outline: none; color: #bbb; margin-bottom: 2px; @@ -635,7 +635,7 @@ QComboBox::drop-down { subcontrol-origin: padding; subcontrol-position: top right; - width: 15px; + width: 10px; border-left-width: 0px; border-left-color: darkgray; diff --git a/DSView/dsapplication.cpp b/DSView/dsapplication.cpp index 9facc855..98cb6897 100644 --- a/DSView/dsapplication.cpp +++ b/DSView/dsapplication.cpp @@ -34,15 +34,15 @@ bool DSApplication::notify(QObject *receiver_, QEvent *event_) return QApplication::notify(receiver_, event_); } catch ( std::exception& e ) { QMessageBox msg(NULL); - msg.setText("Application Error"); + msg.setText(tr("Application Error")); msg.setInformativeText(e.what()); msg.setStandardButtons(QMessageBox::Ok); msg.setIcon(QMessageBox::Warning); msg.exec(); } catch (...) { QMessageBox msg(NULL); - msg.setText("Application Error"); - msg.setInformativeText("An unexpected error occurred"); + msg.setText(tr("Application Error")); + msg.setInformativeText(tr("An unexpected error occurred")); msg.setStandardButtons(QMessageBox::Ok); msg.setIcon(QMessageBox::Warning); msg.exec(); diff --git a/DSView/icons/add.png b/DSView/icons/add.png old mode 100644 new mode 100755 index efe2e3871c21be61759b902b72a0cafb13607bde..24c818866fb5344e9532a2280f26fd396668363d GIT binary patch literal 399 zcmeAS@N?(olHy`uVBq!ia0vp^av;pX1|+Qw)-3{3oCO|{#X$M%Ak65bF}ngN$X?>< z>&pI+g_lWLE|8_^8(7FSqQtSZBqP6wVdc6r9zY?U5}=SvYH@N=WQ0!XYD{Sc8LDcqU2PDum780 z!<0Ga=jNv7l`woeGi^Umj18nLB(o$Zm0`uZOX@(8C{Gv15RcB}KmY&RA9i3^#<;Om zK{rh?^l-1V`G#Y?ZEbAIn$LRnERfq;aplp&bVKE$$llcj3&b4sQrzMK`lEcz4|rs8 rr)-Im0VxRVPHcF>)Do5Ogw>QGX`O_A%PnU=pe+oZu6{1-oD!M0Dy!50Qvv`0D$NK0Cg|`0P0`>06Lfe02gqa zx=}m;000JJOGiWi{{a60|De66lK=n!jY&j7R7l5TU>F6%9Waur;orZ1|FMZPF)@*3 z77OVX|0h)ol`Q^0Ko(QU-l62<5f{hQvKS-pef;vBO34Qm@L}_CqS%GuU_cAs+T|hu0000z+U3%>&pI+g_lW9=1{Hpe6WyfM2TZ* zNk)DV!^(AMJb*$xB|ssU)Z*l#%z~24{5%F>PDN#)I2TCVIlrK?C^J2ygkcT;87rVD zA6T>~H4&s#p(HammBI8oe?2EqiW4LioS#-wo>-L15L@scq@EjWdS-EQP9jik5ySQa zTl#^*93bKF#G<^+ymW>G($Cs~V(bw8rA5i93}62@zlJGu&d<$F%`0K}c4pdspcorS zSx9C{PAbEScbC)|7#OE|*1I@{cyzwKX6VK2D8lyOe{N5xl)i%4#FPyJYt~$H6$qC2 zpfTwQ2b;8ZzarPcL(Uy1-p!uE#y^2sqteVXqAWcfJg6p= z>+-if)^pO5Z?89O-4?qtWZul54!aeMzaM-2F*fr?)NQpzf(^AwQkey5?_BExO;|4Q zKJ>F_&0}T|eB1g#WLJmy`Gb)qg7WVink)F!79G}kb=dZWlDp@mH_xsWmFi{Z&hJ>) z6(%&%T<|4>1@{7B!Iu)rNup~GGWsySnc}#2gOGkJQ=^sHF&@{H4S6OU(+`Ad2vl5s z8IdjD`QnQ4)5#rrQoYBT(`>IQ9z3(Ro`H)Ydh^XUZnxu_H!Sj-ezC+tbPv}qtvC+t z3opwH)YmwuD_#2Z_M5=G+gH!jNV;AuWr&^DvutnJ>Z@UUR&D; zZ=AIm8I&H$7Rp?ADn7+ix<0P_-#h-l{!h78M6>%er95W>qm9AS)z4*}Q$iB}sQ43p delta 599 zcmV-d0;v7U1@HurB!3`dNK#Dz0D2|>0Dy!50Qvv`0D$NK0Cg|`0P0`>06Lfe02gqa zx=}m;000JJOGiWi{{a60|De66lK=n#`AI}UR7l6|l~GdDP!xv$I&F_(-kzsdz>mkrh_3NRA_UPb9{htYD{v|@_*n<|C#f0^Ce&YN$y-= zl~w*%M8p;mrzUHP$QKc5KT4W0+srJ?EE%(-Va<#=d|-ze^Kx>PW_FrpGCwNKoD$Yl zX%^<#p-QvGOAG*$yO|Bq%B$iMk@dX!EH1i8Rd?R}n$~Gv zDs62v;xd4APq?1kE!x~ABCFk6kE#ouDUq-z1>cs{7HV{Y#i+~%RpERW #include #include -#include +#include #include "dsapplication.h" #include "pv/devicemanager.h" @@ -143,9 +143,10 @@ int main(int argc, char *argv[]) a.setStyleSheet(qss.readAll()); qss.close(); w.show(); + w.readSettings(); // Run the application - ret = a.exec(); + ret = a.exec(); } catch(std::exception e) { qDebug() << e.what(); diff --git a/DSView/pv/data/analogsnapshot.cpp b/DSView/pv/data/analogsnapshot.cpp index 005885c7..8dbb8ed7 100644 --- a/DSView/pv/data/analogsnapshot.cpp +++ b/DSView/pv/data/analogsnapshot.cpp @@ -91,14 +91,20 @@ void AnalogSnapshot::clear() init(); } -void AnalogSnapshot::first_payload(const sr_datafeed_analog &analog, uint64_t total_sample_count, unsigned int channel_num) +void AnalogSnapshot::first_payload(const sr_datafeed_analog &analog, uint64_t total_sample_count, GSList *channels) { _total_sample_count = total_sample_count; - _channel_num = channel_num; - _unit_size = sizeof(uint16_t)*channel_num; + _channel_num = 0; + for (const GSList *l = channels; l; l = l->next) { + sr_channel *const probe = (sr_channel*)l->data; + assert(probe); + if (probe->type == SR_CHANNEL_ANALOG && probe->enabled) { + _channel_num ++; + } + } bool isOk = true; - uint64_t size = _total_sample_count * _unit_size + sizeof(uint64_t); + uint64_t size = _total_sample_count * _channel_num * BytesPerSample + sizeof(uint64_t); if (size != _capacity) { free_data(); _data = malloc(size); @@ -125,6 +131,13 @@ void AnalogSnapshot::first_payload(const sr_datafeed_analog &analog, uint64_t to } if (isOk) { + for (const GSList *l = channels; l; l = l->next) { + sr_channel *const probe = (sr_channel*)l->data; + assert(probe); + if (probe->type == SR_CHANNEL_ANALOG && probe->enabled) { + _ch_index.push_back(probe->index); + } + } _capacity = size; _memory_failed = false; append_payload(analog); @@ -132,7 +145,6 @@ void AnalogSnapshot::first_payload(const sr_datafeed_analog &analog, uint64_t to } else { free_data(); free_envelop(); - _capacity = 0; _memory_failed = true; } } @@ -147,6 +159,27 @@ void AnalogSnapshot::append_payload( append_payload_to_envelope_levels(); } +void AnalogSnapshot::append_data(void *data, uint64_t samples) +{ + int unit_bytes = BytesPerSample * _channel_num; + if (_sample_count + samples < _total_sample_count) + _sample_count += samples; + else + _sample_count = _total_sample_count; + + if (_ring_sample_count + samples > _total_sample_count) { + memcpy((uint8_t*)_data + _ring_sample_count * unit_bytes, + data, (_total_sample_count - _ring_sample_count) * unit_bytes); + _ring_sample_count = (samples + _ring_sample_count - _total_sample_count) % _total_sample_count; + memcpy((uint8_t*)_data, + data, _ring_sample_count * unit_bytes); + } else { + memcpy((uint8_t*)_data + _ring_sample_count * unit_bytes, + data, samples * unit_bytes); + _ring_sample_count += samples; + } +} + const uint16_t* AnalogSnapshot::get_samples( int64_t start_sample, int64_t end_sample) const { @@ -303,5 +336,20 @@ void AnalogSnapshot::append_payload_to_envelope_levels() } } +int AnalogSnapshot::get_ch_order(int sig_index) +{ + int order = 0; + for (auto& iter:_ch_index) { + if (iter == sig_index) + break; + order++; + } + + if (order >= _ch_index.size()) + return -1; + else + return order; +} + } // namespace data } // namespace pv diff --git a/DSView/pv/data/analogsnapshot.h b/DSView/pv/data/analogsnapshot.h index 3f2b015a..8767f6c3 100644 --- a/DSView/pv/data/analogsnapshot.h +++ b/DSView/pv/data/analogsnapshot.h @@ -68,6 +68,8 @@ private: static const float LogEnvelopeScaleFactor; static const uint64_t EnvelopeDataUnit; + static const int BytesPerSample = 2; + public: AnalogSnapshot(); @@ -76,7 +78,8 @@ public: void clear(); void init(); - void first_payload(const sr_datafeed_analog &analog, uint64_t total_sample_count, unsigned int channel_num); + void first_payload(const sr_datafeed_analog &analog, + uint64_t total_sample_count, GSList *channels); void append_payload(const sr_datafeed_analog &analog); @@ -86,11 +89,16 @@ public: void get_envelope_section(EnvelopeSection &s, uint64_t start, uint64_t end, float min_length, int probe_index) const; + int get_ch_order(int sig_index); + private: + void append_data(void *data, uint64_t samples); void free_envelop(); void reallocate_envelope(Envelope &l); void append_payload_to_envelope_levels(); + + private: struct Envelope _envelope_levels[2*DS_MAX_ANALOG_PROBES_NUM][ScaleStepCount]; diff --git a/DSView/pv/data/decode/decoder.cpp b/DSView/pv/data/decode/decoder.cpp index 8d54d7f6..00175959 100644 --- a/DSView/pv/data/decode/decoder.cpp +++ b/DSView/pv/data/decode/decoder.cpp @@ -24,8 +24,6 @@ #include "decoder.h" -#include - using boost::shared_ptr; using std::set; using std::map; @@ -44,10 +42,6 @@ Decoder::Decoder(const srd_decoder *const dec) : Decoder::~Decoder() { - for (map::const_iterator i = _options.begin(); - i != _options.end(); i++) - g_variant_unref((*i).second); - for (map::const_iterator i = _options_back.begin(); i != _options_back.end(); i++) g_variant_unref((*i).second); @@ -68,14 +62,13 @@ void Decoder::show(bool show) _shown = show; } -const map >& +const map& Decoder::channels() const { return _probes; } -void Decoder::set_probes(std::map > probes) +void Decoder::set_probes(std::map probes) { _probes_back = probes; _setted = true; @@ -89,6 +82,7 @@ const std::map& Decoder::options() const void Decoder::set_option(const char *id, GVariant *value) { assert(value); + g_variant_unref(_options_back[id]); g_variant_ref(value); _options_back[id] = value; _setted = true; @@ -139,24 +133,8 @@ bool Decoder::have_required_probes() const return true; } -set< shared_ptr > Decoder::get_data() +srd_decoder_inst* Decoder::create_decoder_inst(srd_session *session) const { - set< shared_ptr > data; - for(map >:: - const_iterator i = _probes.begin(); - i != _probes.end(); i++) - { - shared_ptr signal((*i).second); - assert(signal); - data.insert(signal->logic_data()); - } - - return data; -} - -srd_decoder_inst* Decoder::create_decoder_inst(srd_session *session, int unit_size) const -{ - (void)unit_size; GHashTable *const opt_hash = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, (GDestroyNotify)g_variant_unref); @@ -180,13 +158,11 @@ srd_decoder_inst* Decoder::create_decoder_inst(srd_session *session, int unit_si GHashTable *const probes = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, (GDestroyNotify)g_variant_unref); - for(map >:: + for(map:: const_iterator i = _probes.begin(); i != _probes.end(); i++) { - shared_ptr signal((*i).second); - GVariant *const gvar = g_variant_new_int32( - signal->probe()->index); + GVariant *const gvar = g_variant_new_int32((*i).second); g_variant_ref_sink(gvar); g_hash_table_insert(probes, (*i).first->id, gvar); } @@ -196,6 +172,11 @@ srd_decoder_inst* Decoder::create_decoder_inst(srd_session *session, int unit_si return decoder_inst; } +int Decoder::get_channel_type(const srd_channel *ch) +{ + return ch->type; +} + } // decode } // data } // pv diff --git a/DSView/pv/data/decode/decoder.h b/DSView/pv/data/decode/decoder.h index 40fde4e6..4f9d40ad 100644 --- a/DSView/pv/data/decode/decoder.h +++ b/DSView/pv/data/decode/decoder.h @@ -35,15 +35,7 @@ struct srd_channel; struct srd_session; namespace pv { - -namespace view { -class LogicSignal; -} - namespace data { - -class Logic; - namespace decode { class Decoder @@ -58,10 +50,8 @@ public: bool shown() const; void show(bool show = true); - const std::map >& channels() const; - void set_probes(std::map > probes); + const std::map& channels() const; + void set_probes(std::map probes); const std::map& options() const; @@ -69,10 +59,7 @@ public: bool have_required_probes() const; - srd_decoder_inst* create_decoder_inst( - srd_session *session, int unit_size) const; - - std::set< boost::shared_ptr > get_data(); + srd_decoder_inst* create_decoder_inst(srd_session *session) const; void set_decode_region(uint64_t start, uint64_t end); uint64_t decode_start() const; @@ -80,17 +67,17 @@ public: bool commit(); + int get_channel_type(const srd_channel* ch); + private: const srd_decoder *const _decoder; bool _shown; - std::map > - _probes; + std::map _probes; std::map _options; - std::map > - _probes_back; + std::map _probes_back; std::map _options_back; uint64_t _decode_start, _decode_end; diff --git a/DSView/pv/data/decode/rowdata.cpp b/DSView/pv/data/decode/rowdata.cpp index 8d3e41e0..c80cbfbd 100644 --- a/DSView/pv/data/decode/rowdata.cpp +++ b/DSView/pv/data/decode/rowdata.cpp @@ -38,6 +38,11 @@ RowData::RowData() : } RowData::~RowData() +{ + clear(); +} + +void RowData::clear() { _annotations.clear(); } @@ -56,7 +61,10 @@ uint64_t RowData::get_max_annotation() const uint64_t RowData::get_min_annotation() const { - return _min_annotation; + if (_min_annotation == UINT64_MAX) + return 10; + else + return _min_annotation; } void RowData::get_annotation_subset( @@ -70,6 +78,18 @@ void RowData::get_annotation_subset( dest.push_back(*i); } +uint64_t RowData::get_annotation_index(uint64_t start_sample) const +{ + uint64_t index = 0; + for (vector::const_iterator i = _annotations.begin(); + i != _annotations.end(); i++) { + if ((*i).start_sample() > start_sample) + break; + index++; + } + return index; +} + bool RowData::push_annotation(const Annotation &a) { try { diff --git a/DSView/pv/data/decode/rowdata.h b/DSView/pv/data/decode/rowdata.h index 40792cb7..72d33456 100644 --- a/DSView/pv/data/decode/rowdata.h +++ b/DSView/pv/data/decode/rowdata.h @@ -47,6 +47,8 @@ public: std::vector &dest, uint64_t start_sample, uint64_t end_sample) const; + uint64_t get_annotation_index(uint64_t start_sample) const; + bool push_annotation(const Annotation &a); uint64_t get_annotation_size() const; @@ -54,6 +56,8 @@ public: bool get_annotation(pv::data::decode::Annotation &ann, uint64_t index) const; + void clear(); + private: uint64_t _max_annotation; uint64_t _min_annotation; diff --git a/DSView/pv/data/decoderstack.cpp b/DSView/pv/data/decoderstack.cpp index 233dcc4d..8a95f0e8 100644 --- a/DSView/pv/data/decoderstack.cpp +++ b/DSView/pv/data/decoderstack.cpp @@ -35,19 +35,8 @@ #include #include -using boost::lock_guard; -using boost::mutex; -using boost::optional; -using boost::shared_ptr; -using boost::unique_lock; -using std::deque; -using std::make_pair; -using std::max; -using std::min; -using std::list; -using std::map; -using std::pair; -using std::vector; +using namespace boost; +using namespace std; using namespace pv::data::decode; @@ -70,7 +59,8 @@ DecoderStack::DecoderStack(pv::SigSession &session, _samples_decoded(0), _decode_state(Stopped), _options_changed(false), - _no_memory(false) + _no_memory(false), + _mark_index(-1) { connect(&_session, SIGNAL(frame_began()), this, SLOT(on_new_frame())); @@ -79,7 +69,7 @@ DecoderStack::DecoderStack(pv::SigSession &session, connect(&_session, SIGNAL(frame_ended()), this, SLOT(on_frame_ended())); - _stack.push_back(shared_ptr( + _stack.push_back(boost::shared_ptr( new decode::Decoder(dec))); build_row(); @@ -116,7 +106,7 @@ void DecoderStack::push(boost::shared_ptr decoder) void DecoderStack::remove(boost::shared_ptr &decoder) { // Find the decoder in the stack - list< shared_ptr >::iterator iter = _stack.begin(); + list< boost::shared_ptr >::iterator iter = _stack.begin(); for(unsigned int i = 0; i < _stack.size(); i++, iter++) if ((*iter) == decoder) break; @@ -133,7 +123,7 @@ void DecoderStack::build_row() { _rows.clear(); // Add classes - BOOST_FOREACH (const shared_ptr &dec, _stack) + BOOST_FOREACH (const boost::shared_ptr &dec, _stack) { assert(dec); const srd_decoder *const decc = dec->decoder(); @@ -206,6 +196,21 @@ void DecoderStack::get_annotation_subset( start_sample, end_sample); } + +uint64_t DecoderStack::get_annotation_index( + const Row &row, uint64_t start_sample) const +{ + //lock_guard lock(_output_mutex); + + uint64_t index = 0; + std::map::const_iterator iter = + _rows.find(row); + if (iter != _rows.end()) + index = (*iter).second.get_annotation_index(start_sample); + + return index; +} + uint64_t DecoderStack::get_max_annotation(const Row &row) { //lock_guard lock(_output_mutex); @@ -353,84 +358,77 @@ QString DecoderStack::error_message() void DecoderStack::clear() { - //lock_guard decode_lock(_output_mutex); - _sample_count = 0; - _frame_complete = false; - _samples_decoded = 0; - new_decode_data(); - _error_message = QString(); - for (map::iterator i = _rows.begin(); - i != _rows.end(); i++) - _rows[(*i).first] = decode::RowData(); -// _rows.clear(); -// _rows_gshow.clear(); -// _rows_lshow.clear(); -// _class_rows.clear(); - _no_memory = false; + init(); } void DecoderStack::init() { - clear(); + _sample_count = 0; + _frame_complete = false; + _samples_decoded = 0; + _error_message = QString(); + _no_memory = false; + for (map::iterator i = _rows.begin(); + i != _rows.end(); i++) { + //_rows[(*i).first] = decode::RowData(); + (*i).second.clear(); + } + set_mark_index(-1); } void DecoderStack::stop_decode() { //_snapshot.reset(); - - if(_decode_state == Stopped) { - clear(); - return; + if(_decode_state != Stopped) { + if (_decode_thread.get()) { + _decode_thread->interrupt(); + _decode_thread->join(); + _decode_state = Stopped; + } + _decode_thread.reset(); } - - if (_decode_thread.get()) { - _decode_thread->interrupt(); - _decode_thread->join(); - _decode_state = Stopped; - } - _decode_thread.reset(); - clear(); } void DecoderStack::begin_decode() { - shared_ptr logic_signal; - shared_ptr data; + boost::shared_ptr logic_signal; + boost::shared_ptr data; if (!_options_changed) return; _options_changed = false; -// if (_decode_thread.joinable()) { -// _decode_thread.interrupt(); -// _decode_thread.join(); -// } stop_decode(); + init(); // Check that all decoders have the required channels - BOOST_FOREACH(const shared_ptr &dec, _stack) + BOOST_FOREACH(const boost::shared_ptr &dec, _stack) if (!dec->have_required_probes()) { _error_message = tr("One or more required channels " "have not been specified"); return; } -// // Build rows -// build_row(); - // We get the logic data of the first channel in the list. // This works because we are currently assuming all // LogicSignals have the same data/snapshot - BOOST_FOREACH (const shared_ptr &dec, _stack) - if (dec && !dec->channels().empty() && - ((logic_signal = (*dec->channels().begin()).second)) && - ((data = logic_signal->logic_data()))) - break; + BOOST_FOREACH (const boost::shared_ptr &dec, _stack) { + if (dec && !dec->channels().empty()) { + BOOST_FOREACH(boost::shared_ptr sig, _session.get_signals()) { + if((sig->get_index() == (*dec->channels().begin()).second) && + (logic_signal = dynamic_pointer_cast(sig)) && + (data = logic_signal->logic_data())) + break; + } + if (data) + break; + } + } if (!data) return; // Check we have a snapshot of data - const deque< shared_ptr > &snapshots = + const deque< boost::shared_ptr > &snapshots = data->get_snapshots(); if (snapshots.empty()) return; @@ -438,8 +436,7 @@ void DecoderStack::begin_decode() if (_snapshot->empty()) return; - // Get the samplerate and start time - _start_time = data->get_start_time(); + // Get the samplerate _samplerate = data->samplerate(); if (_samplerate == 0.0) return; @@ -474,13 +471,11 @@ boost::optional DecoderStack::wait_for_data() const void DecoderStack::decode_data( const uint64_t decode_start, const uint64_t decode_end, - const unsigned int unit_size, srd_session *const session) + srd_session *const session) { - uint8_t *chunk = NULL; + //uint8_t *chunk = NULL; uint64_t last_cnt = 0; uint64_t notify_cnt = (decode_end - decode_start + 1)/100; - const uint64_t chunk_sample_count = - DecodeChunkLength / _snapshot->unit_size(); srd_decoder_inst *logic_di = NULL; // find the first level decoder instant for (GSList *d = session->di_list; d; d = d->next) { @@ -501,41 +496,63 @@ void DecoderStack::decode_data( i < decode_end && !_no_memory) { //lock_guard decode_lock(_global_decode_mutex); + std::vector chunk; + std::vector chunk_const; + uint64_t chunk_end = decode_end; + for (int j =0 ; j < logic_di->dec_num_channels; j++) { + int sig_index = logic_di->dec_channelmap[j]; + if (sig_index == -1) { + chunk.push_back(NULL); + } else { + if (_snapshot->has_data(sig_index)) { + chunk.push_back(_snapshot->get_samples(i, chunk_end, sig_index)); + chunk_const.push_back(_snapshot->get_sample(i, sig_index)); + } else { + _error_message = tr("At least one of selected channels are not enabled."); + return; + } + } + } + if (chunk_end - i > MaxChunkSize) + chunk_end = i + MaxChunkSize; - const uint64_t chunk_end = min( - i + chunk_sample_count, decode_end); - chunk = _snapshot->get_samples(i, chunk_end); - - if (srd_session_send(session, chunk_type, i, chunk_end, chunk, - (chunk_end - i) * unit_size, unit_size, &error) != SRD_OK) { + if (srd_session_send(session, chunk_type, i, chunk_end, + chunk.data(), chunk_const.data(), &error) != SRD_OK) { _error_message = QString::fromLocal8Bit(error); break; } - if (logic_di && logic_di->logic_mask != 0) { + if (logic_di && logic_di->logic_mask != 0 && logic_di->cur_pos < decode_end) { uint64_t cur_pos = logic_di->cur_pos; - assert(cur_pos < _snapshot->get_sample_count()); - uint64_t sample = _snapshot->get_sample(cur_pos) & logic_di->logic_mask; + uint64_t sample; if (logic_di->edge_index == -1) { std::vector pos_vector; cur_pos++; for (int j =0 ; j < logic_di->dec_num_channels; j++) { int index = logic_di->dec_channelmap[j]; - if (index != -1 && (logic_di->logic_mask & (1 << index))) { - bool last_sample = (sample & (1 << index)) ? 1 : 0; + if (index != -1 && (logic_di->logic_mask & (1 << j))) { + bool last_sample = _snapshot->get_sample(cur_pos - 1, index); pos_vector.push_back(cur_pos); _snapshot->get_nxt_edge(pos_vector.back(), last_sample, decode_end, 1, index); } } cur_pos = *std::min_element(pos_vector.begin(), pos_vector.end()); } else { - bool last_sample = (sample & (1 << logic_di->edge_index)) ? 1 : 0; + bool last_sample = _snapshot->get_sample(cur_pos, logic_di->edge_index); do { + sample = 0; cur_pos++; if (!_snapshot->get_nxt_edge(cur_pos, last_sample, decode_end, 1, logic_di->edge_index)) break; - sample = _snapshot->get_sample(cur_pos) & logic_di->logic_mask; - last_sample = (sample & (1 << logic_di->edge_index)) ? 1 : 0; + for (int j =0 ; j < logic_di->dec_num_channels; j++) { + if (logic_di->logic_mask & (1 << j)) { + int index = logic_di->dec_channelmap[j]; + bool index_sample = _snapshot->get_sample(cur_pos, index); + sample += index_sample << j; + if (index == logic_di->edge_index) + last_sample = index_sample; + } + } } while(sample != logic_di->exp_logic); } @@ -544,7 +561,7 @@ void DecoderStack::decode_data( i = decode_end; chunk_type = 0; } else { - i += chunk_sample_count; + i = chunk_end + 1; chunk_type = 1; } @@ -582,18 +599,16 @@ void DecoderStack::decode_proc() _decode_state = Running; - // Create the decoders - const unsigned int unit_size = _snapshot->unit_size(); - // Get the intial sample count { //unique_lock input_lock(_input_mutex); sample_count = _sample_count = _snapshot->get_sample_count(); } - BOOST_FOREACH(const shared_ptr &dec, _stack) + // Create the decoders + BOOST_FOREACH(const boost::shared_ptr &dec, _stack) { - srd_decoder_inst *const di = dec->create_decoder_inst(session, unit_size); + srd_decoder_inst *const di = dec->create_decoder_inst(session); if (!di) { @@ -619,7 +634,7 @@ void DecoderStack::decode_proc() char *error = NULL; if (srd_session_start(session, &error) == SRD_OK) - decode_data(decode_start, decode_end, unit_size, session); + decode_data(decode_start, decode_end, session); else _error_message = QString::fromLocal8Bit(error); @@ -747,5 +762,15 @@ bool DecoderStack::out_of_memory() const return _no_memory; } +void DecoderStack::set_mark_index(int64_t index) +{ + _mark_index = index; +} + +int64_t DecoderStack::get_mark_index() const +{ + return _mark_index; +} + } // namespace data } // namespace pv diff --git a/DSView/pv/data/decoderstack.h b/DSView/pv/data/decoderstack.h index 281a5428..7cd0bedf 100644 --- a/DSView/pv/data/decoderstack.h +++ b/DSView/pv/data/decoderstack.h @@ -68,6 +68,7 @@ private: static const double DecodeThreshold; static const int64_t DecodeChunkLength; static const unsigned int DecodeNotifyPeriod; + static const uint64_t MaxChunkSize = 1024 * 16; public: enum decode_state { @@ -96,6 +97,9 @@ public: const decode::Row &row, uint64_t start_sample, uint64_t end_sample) const; + uint64_t get_annotation_index( + const decode::Row &row, uint64_t start_sample) const; + uint64_t get_max_annotation(const decode::Row &row); uint64_t get_min_annotation(const decode::Row &row); // except instant(end=start) annotation @@ -137,14 +141,13 @@ public: bool out_of_memory() const; + void set_mark_index(int64_t index); + int64_t get_mark_index() const; + private: boost::optional wait_for_data() const; -// void decode_data(const uint64_t sample_count, -// const unsigned int unit_size, srd_session *const session); - - void decode_data(const uint64_t decode_start, const uint64_t decode_end, - const unsigned int unit_size, srd_session *const session); + void decode_data(const uint64_t decode_start, const uint64_t decode_end, srd_session *const session); void decode_proc(); @@ -199,6 +202,8 @@ private: bool _options_changed; bool _no_memory; + int64_t _mark_index; + friend class DecoderStackTest::TwoDecoderStack; }; diff --git a/DSView/pv/data/dsosnapshot.cpp b/DSView/pv/data/dsosnapshot.cpp index 665c0dbe..b3e06955 100644 --- a/DSView/pv/data/dsosnapshot.cpp +++ b/DSView/pv/data/dsosnapshot.cpp @@ -80,6 +80,7 @@ void DsoSnapshot::init() _memory_failed = false; _last_ended = true; _envelope_done = false; + _ch_enable.clear(); for (unsigned int i = 0; i < _channel_num; i++) { for (unsigned int level = 0; level < ScaleStepCount; level++) { _envelope_levels[i][level].length = 0; @@ -96,15 +97,29 @@ void DsoSnapshot::clear() init(); } -void DsoSnapshot::first_payload(const sr_datafeed_dso &dso, uint64_t total_sample_count, unsigned int channel_num, bool instant) +void DsoSnapshot::first_payload(const sr_datafeed_dso &dso, uint64_t total_sample_count, + std::map ch_enable, bool instant) { + bool re_alloc = false; + unsigned int channel_num = 0; + for (auto& iter:ch_enable) { + if (iter.second) + channel_num++; + } + assert(channel_num != 0); + + if (total_sample_count != _total_sample_count || + channel_num != _channel_num) + re_alloc = true; + _total_sample_count = total_sample_count; _channel_num = channel_num; _instant = instant; + _ch_enable = ch_enable; bool isOk = true; - uint64_t size = _total_sample_count * _unit_size + sizeof(uint64_t); - if (size != _capacity) { + uint64_t size = _total_sample_count * _channel_num + sizeof(uint64_t); + if (re_alloc || size != _capacity) { free_data(); _data = malloc(size); if (_data) { @@ -137,7 +152,6 @@ void DsoSnapshot::first_payload(const sr_datafeed_dso &dso, uint64_t total_sampl } else { free_data(); free_envelop(); - _capacity = 0; _memory_failed = true; } } @@ -147,7 +161,7 @@ void DsoSnapshot::append_payload(const sr_datafeed_dso &dso) boost::lock_guard lock(_mutex); if (_channel_num > 0 && dso.num_samples != 0) { - refill_data(dso.data, dso.num_samples, _instant); + append_data(dso.data, dso.num_samples, _instant); // Generate the first mip-map from the data if (_envelope_en) @@ -155,6 +169,18 @@ void DsoSnapshot::append_payload(const sr_datafeed_dso &dso) } } +void DsoSnapshot::append_data(void *data, uint64_t samples, bool instant) +{ + if (instant) { + memcpy((uint8_t*)_data + _sample_count * _channel_num, data, samples*_channel_num); + _sample_count = (_sample_count + samples) % (_total_sample_count + 1); + } else { + memcpy((uint8_t*)_data, data, samples*_channel_num); + _sample_count = samples; + } + +} + void DsoSnapshot::enable_envelope(bool enable) { boost::lock_guard lock(_mutex); @@ -382,5 +408,13 @@ double DsoSnapshot::cal_vmean(int index) const return vmean; } +bool DsoSnapshot::has_data(int index) +{ + if (_ch_enable.find(index) != _ch_enable.end()) + return _ch_enable[index]; + else + return false; +} + } // namespace data } // namespace pv diff --git a/DSView/pv/data/dsosnapshot.h b/DSView/pv/data/dsosnapshot.h index df6376e0..e34ca502 100644 --- a/DSView/pv/data/dsosnapshot.h +++ b/DSView/pv/data/dsosnapshot.h @@ -77,7 +77,7 @@ public: void clear(); void init(); - void first_payload(const sr_datafeed_dso &dso, uint64_t total_sample_count, unsigned int channel_num, bool instant); + void first_payload(const sr_datafeed_dso &dso, uint64_t total_sample_count, std::map ch_enable, bool instant); void append_payload(const sr_datafeed_dso &dso); @@ -92,7 +92,10 @@ public: double cal_vrms(double zero_off, int index) const; double cal_vmean(int index) const; + bool has_data(int index); + private: + void append_data(void *data, uint64_t samples, bool instant); void free_envelop(); void reallocate_envelope(Envelope &l); void append_payload_to_envelope_levels(bool header); @@ -102,6 +105,7 @@ private: bool _envelope_en; bool _envelope_done; bool _instant; + std::map _ch_enable; friend class DsoSnapshotTest::Basic; }; diff --git a/DSView/pv/data/logicsnapshot.cpp b/DSView/pv/data/logicsnapshot.cpp index 40ee3087..8201e6ea 100644 --- a/DSView/pv/data/logicsnapshot.cpp +++ b/DSView/pv/data/logicsnapshot.cpp @@ -40,30 +40,43 @@ using namespace std; namespace pv { namespace data { -const int LogicSnapshot::MipMapScalePower = 4; -const int LogicSnapshot::MipMapScaleFactor = 1 << MipMapScalePower; -const float LogicSnapshot::LogMipMapScaleFactor = logf(MipMapScaleFactor); -const uint64_t LogicSnapshot::MipMapDataUnit = 64*1024; // bytes +const uint64_t LogicSnapshot::LevelMask[LogicSnapshot::ScaleLevel] = { + ~(~0ULL << ScalePower) << 0 * ScalePower, + ~(~0ULL << ScalePower) << 1 * ScalePower, + ~(~0ULL << ScalePower) << 2 * ScalePower, + ~(~0ULL << ScalePower) << 3 * ScalePower, +}; +const uint64_t LogicSnapshot::LevelOffset[LogicSnapshot::ScaleLevel] = { + 0, + (uint64_t)pow(Scale, 3), + (uint64_t)pow(Scale, 3) + (uint64_t)pow(Scale, 2), + (uint64_t)pow(Scale, 3) + (uint64_t)pow(Scale, 2) + (uint64_t)pow(Scale, 1), +}; LogicSnapshot::LogicSnapshot() : - Snapshot(1, 1, 1), - _last_append_sample(0) + Snapshot(1, 0, 0), + _block_num(0) { - memset(_mip_map, 0, sizeof(_mip_map)); } LogicSnapshot::~LogicSnapshot() { - free_mipmap(); } -void LogicSnapshot::free_mipmap() +void LogicSnapshot::free_data() { - BOOST_FOREACH(MipMapLevel &l, _mip_map) { - if (l.data) - free(l.data); + Snapshot::free_data(); + for(auto& iter:_ch_data) { + for(auto& iter_rn:iter) { + for (unsigned int k = 0; k < Scale; k++) + if (iter_rn.lbp[k] != NULL) + free(iter_rn.lbp[k]); + } + std::vector void_vector; + iter.swap(void_vector); } - memset(_mip_map, 0, sizeof(_mip_map)); + _ch_data.clear(); + _sample_count = 0; } void LogicSnapshot::init() @@ -71,308 +84,594 @@ void LogicSnapshot::init() boost::lock_guard lock(_mutex); _sample_count = 0; _ring_sample_count = 0; + _block_num = 0; + _byte_fraction = 0; + _ch_fraction = 0; + _src_ptr = NULL; + _dest_ptr = NULL; + _data = NULL; _memory_failed = false; _last_ended = true; - for (unsigned int level = 0; level < ScaleStepCount; level++) { - _mip_map[level].length = 0; - _mip_map[level].data_length = 0; - } } void LogicSnapshot::clear() { boost::lock_guard lock(_mutex); free_data(); - free_mipmap(); init(); } -void LogicSnapshot::first_payload(const sr_datafeed_logic &logic, uint64_t total_sample_count, unsigned int channel_num) +void LogicSnapshot::capture_ended() { - _total_sample_count = total_sample_count; - _channel_num = channel_num; - _unit_size = logic.unitsize; + Snapshot::capture_ended(); - bool isOk = true; - uint64_t size = _total_sample_count * _unit_size + sizeof(uint64_t); - if (size != _capacity) { - free_data(); - _data = malloc(size); - if (_data) { - free_mipmap(); - uint64_t mipmap_count = _total_sample_count / MipMapScaleFactor; - for (unsigned int level = 0; level < ScaleStepCount; level++) { - mipmap_count = ((mipmap_count + MipMapDataUnit - 1) / - MipMapDataUnit) * MipMapDataUnit; - _mip_map[level].data = malloc(mipmap_count * _unit_size + sizeof(uint64_t)); - if (!_mip_map[level].data) { - isOk = false; - break; - } - mipmap_count = mipmap_count / MipMapScaleFactor; + //assert(_ch_fraction == 0); + //assert(_byte_fraction == 0); + uint64_t block_index = _ring_sample_count / LeafBlockSamples; + uint64_t block_offset = (_ring_sample_count % LeafBlockSamples) / Scale; + if (block_offset != 0) { + uint64_t index0 = block_index / RootScale; + uint64_t index1 = block_index % RootScale; + int order = 0; + for(auto& iter:_ch_data) { + const uint64_t *end_ptr = (uint64_t *)iter[index0].lbp[index1] + (LeafBlockSamples / Scale); + uint64_t *ptr = (uint64_t *)iter[index0].lbp[index1] + block_offset; + while (ptr < end_ptr) + *ptr++ = 0; + + // calc mipmap of current block + calc_mipmap(order, index0, index1, block_offset * Scale); + + // calc root of current block + if (*((uint64_t *)iter[index0].lbp[index1]) != 0) + iter[index0].value += 1ULL << index1; + if (*((uint64_t *)iter[index0].lbp[index1] + LeafBlockSpace / sizeof(uint64_t) - 1) != 0) { + iter[index0].tog += 1ULL << index1; + } else { + // trim leaf to free space + free(iter[index0].lbp[index1]); + iter[index0].lbp[index1] = NULL; + } + + order++; + } + } + _sample_count = _ring_sample_count; +} + +void LogicSnapshot::first_payload(const sr_datafeed_logic &logic, uint64_t total_sample_count, GSList *channels) +{ + bool channel_changed = false; + uint16_t channel_num = 0; + for (const GSList *l = channels; l; l = l->next) { + sr_channel *const probe = (sr_channel*)l->data; + assert(probe); + if (probe->type == SR_CHANNEL_LOGIC) { + channel_num += probe->enabled; + if (!channel_changed && probe->enabled) { + channel_changed = !has_data(probe->index); } - } else { - isOk = false; } } - if (isOk) { - _capacity = size; - _memory_failed = false; - append_payload(logic); - _last_ended = false; - } else { + if (total_sample_count != _total_sample_count || + channel_num != _channel_num || + channel_changed) { free_data(); - free_mipmap(); - _capacity = 0; - _memory_failed = true; + _total_sample_count = total_sample_count; + _channel_num = channel_num; + uint64_t rootnode_size = (_total_sample_count + RootNodeSamples - 1) / RootNodeSamples; + for (const GSList *l = channels; l; l = l->next) { + sr_channel *const probe = (sr_channel*)l->data; + if (probe->type == SR_CHANNEL_LOGIC && probe->enabled) { + std::vector root_vector; + for (int j = 0; j < rootnode_size; j++) { + struct RootNode rn; + rn.tog = 0; + rn.value = 0; + memset(rn.lbp, 0, sizeof(rn.lbp)); + root_vector.push_back(rn); + } + _ch_data.push_back(root_vector); + _ch_index.push_back(probe->index); + } + } + } else { + for(auto& iter:_ch_data) { + for(auto& iter_rn:iter) { + iter_rn.tog = 0; + iter_rn.value = 0; + } + } } + + _sample_count = 0; + _last_sample.clear(); + _sample_cnt.clear(); + _block_cnt.clear(); + _ring_sample_cnt.clear(); + for (unsigned int i = 0; i < _channel_num; i++) { + _last_sample.push_back(0); + _sample_cnt.push_back(0); + _block_cnt.push_back(0); + _ring_sample_cnt.push_back(0); + } + + append_payload(logic); + _last_ended = false; } void LogicSnapshot::append_payload( const sr_datafeed_logic &logic) { - assert(_unit_size == logic.unitsize); - assert((logic.length % _unit_size) == 0); - boost::lock_guard lock(_mutex); - append_data(logic.data, logic.length / _unit_size); - - // Generate the first mip-map from the data - append_payload_to_mipmap(); + if (logic.format == LA_CROSS_DATA) + append_cross_payload(logic); + else if (logic.format == LA_SPLIT_DATA) + append_split_payload(logic); } -uint8_t * LogicSnapshot::get_samples(int64_t start_sample, int64_t end_sample) const +void LogicSnapshot::append_cross_payload( + const sr_datafeed_logic &logic) +{ + assert(logic.format == LA_CROSS_DATA); + assert(logic.length >= ScaleSize * _channel_num); + + if (_sample_count >= _total_sample_count) + return; + + uint64_t samples = ceil(logic.length * 8.0 / _channel_num); + + if (_sample_count + samples < _total_sample_count) + _sample_count += samples; + else + _sample_count = _total_sample_count; + + while (_sample_count > _block_num * LeafBlockSamples) { + uint8_t index0 = _block_num / RootScale; + uint8_t index1 = _block_num % RootScale; + for(auto& iter:_ch_data) { + if (iter[index0].lbp[index1] == NULL) + iter[index0].lbp[index1] = malloc(LeafBlockSpace); + if (iter[index0].lbp[index1] == NULL) { + _memory_failed = true; + return; + } + uint64_t *mipmap_ptr = (uint64_t *)iter[index0].lbp[index1] + + (LeafBlockSamples / Scale); + memset(mipmap_ptr, 0, LeafBlockSpace - (LeafBlockSamples / 8)); + } + _block_num++; + } + + _src_ptr = logic.data; + uint64_t len = logic.length; + + // bit align + while (((_ch_fraction != 0) || (_byte_fraction != 0)) && (len != 0)) { + do { + *(uint8_t *)_dest_ptr++ = *(uint8_t *)_src_ptr++; + _byte_fraction = (_byte_fraction + 1) % ScaleSize; + len--; + } while ((_byte_fraction != 0) && (len != 0)); + if (_byte_fraction == 0) { + const uint64_t index0 = _ring_sample_count / RootNodeSamples; + const uint64_t index1 = (_ring_sample_count >> LeafBlockPower) % RootScale; + const uint64_t offset = (_ring_sample_count % LeafBlockSamples) / Scale; + +// _dest_ptr = (uint64_t *)_ch_data[i][index0].lbp[index1] + offset; +// uint64_t mipmap_index = offset / 8 / Scale; +// uint64_t mipmap_offset = (offset / 8) % Scale; +// uint64_t *l1_mipmap = (uint64_t *)_ch_data[i][index0].lbp[index1] + +// (LeafBlockSamples / Scale) + mipmap_index; +// *l1_mipmap += ((_last_sample[i] ^ *(uint64_t *)_dest_ptr) != 0 ? 1ULL : 0ULL) << mipmap_offset; +// _last_sample[i] = *(uint64_t *)_dest_ptr & (1ULL << (Scale - 1)) ? ~0ULL : 0ULL; + + _ch_fraction = (_ch_fraction + 1) % _channel_num; + if (_ch_fraction == 0) + _ring_sample_count += Scale; + _dest_ptr = (uint8_t *)_ch_data[_ch_fraction][index0].lbp[index1] + (offset * ScaleSize); + } + } + + // align data append + { + assert(_ch_fraction == 0); + assert(_byte_fraction == 0); + assert(_ring_sample_count % Scale == 0); + uint64_t pre_index0 = _ring_sample_count / RootNodeSamples; + uint64_t pre_index1 = (_ring_sample_count >> LeafBlockPower) % RootScale; + uint64_t pre_offset = (_ring_sample_count % LeafBlockSamples) / Scale; + uint64_t *src_ptr; + uint64_t *dest_ptr; + int order = 0; + const uint64_t align_size = len / ScaleSize / _channel_num; + _ring_sample_count += align_size * Scale; + +// uint64_t mipmap_index = pre_offset / Scale; +// uint64_t mipmap_offset = pre_offset % Scale; +// uint64_t *l1_mipmap; + for(auto& iter:_ch_data) { + uint64_t index0 = pre_index0; + uint64_t index1 = pre_index1; + src_ptr = (uint64_t *)_src_ptr + order; + _dest_ptr = iter[index0].lbp[index1]; + dest_ptr = (uint64_t *)_dest_ptr + pre_offset; +// l1_mipmap = (uint64_t *)_dest_ptr + (LeafBlockSamples / Scale) + mipmap_index; + while (src_ptr < (uint64_t *)_src_ptr + (align_size * _channel_num)) { + const uint64_t tmp_u64 = *src_ptr; + *dest_ptr++ = tmp_u64; +// *l1_mipmap += ((_last_sample[i] ^ tmp_u64) != 0 ? 1ULL : 0ULL) << mipmap_offset; +// mipmap_offset = (mipmap_offset + 1) % Scale; +// l1_mipmap += (mipmap_offset == 0); +// _last_sample[i] = tmp_u64 & (1ULL << (Scale - 1)) ? ~0ULL : 0ULL; + src_ptr += _channel_num; + //mipmap + if (dest_ptr == (uint64_t *)_dest_ptr + (LeafBlockSamples / Scale)) { + // calc mipmap of current block + calc_mipmap(order, index0, index1, LeafBlockSamples); + + // calc root of current block + if (*((uint64_t *)iter[index0].lbp[index1]) != 0) + iter[index0].value += 1ULL<< index1; + if (*((uint64_t *)iter[index0].lbp[index1] + LeafBlockSpace / sizeof(uint64_t) - 1) != 0) { + iter[index0].tog += 1ULL << index1; + } else { + // trim leaf to free space + free(iter[index0].lbp[index1]); + iter[index0].lbp[index1] = NULL; + } + + index1++; + if (index1 == RootScale) { + index0++; + index1 = 0; + } + _dest_ptr = iter[index0].lbp[index1]; + dest_ptr = (uint64_t *)_dest_ptr; + } + } + order++; + } + len -= align_size * _channel_num * ScaleSize; + _src_ptr = src_ptr - _channel_num + 1; + } + + // fraction data append + { + uint64_t index0 = _ring_sample_count / RootNodeSamples; + uint64_t index1 = (_ring_sample_count >> LeafBlockPower) % RootScale; + uint64_t offset = (_ring_sample_count % LeafBlockSamples) / 8; + _dest_ptr = (uint8_t *)_ch_data[_ch_fraction][index0].lbp[index1] + offset; + + while(len-- != 0) { + *(uint8_t *)_dest_ptr++ = *(uint8_t *)_src_ptr++; + if (++_byte_fraction == ScaleSize) { + _ch_fraction = (_ch_fraction + 1) % _channel_num; + _byte_fraction = 0; + _dest_ptr = (uint8_t *)_ch_data[_ch_fraction][index0].lbp[index1] + offset; + } + } + _dest_ptr = (uint8_t *)_dest_ptr + _byte_fraction; + } +} + +void LogicSnapshot::append_split_payload( + const sr_datafeed_logic &logic) +{ + assert(logic.format == LA_SPLIT_DATA); + + uint64_t samples = logic.length * 8; + int order = logic.order; + assert(order < _ch_data.size()); + + if (_sample_cnt[order] >= _total_sample_count) + return; + + if (_sample_cnt[order] + samples < _total_sample_count) + _sample_cnt[order] += samples; + else + _sample_cnt[order] = _total_sample_count; + + while (_sample_cnt[order] > _block_cnt[order] * LeafBlockSamples) { + uint8_t index0 = _block_cnt[order] / RootScale; + uint8_t index1 = _block_cnt[order] % RootScale; + if (_ch_data[order][index0].lbp[index1] == NULL) + _ch_data[order][index0].lbp[index1] = malloc(LeafBlockSpace); + if (_ch_data[order][index0].lbp[index1] == NULL) { + _memory_failed = true; + return; + } + memset(_ch_data[order][index0].lbp[index1], 0, LeafBlockSpace); + _block_cnt[order]++; + } + + while(samples > 0) { + const uint64_t index0 = _ring_sample_cnt[order] / RootNodeSamples; + const uint64_t index1 = (_ring_sample_cnt[order] >> LeafBlockPower) % RootScale; + const uint64_t offset = (_ring_sample_cnt[order] % LeafBlockSamples) / 8; + _dest_ptr = (uint8_t *)_ch_data[order][index0].lbp[index1] + offset; + + uint64_t bblank = (LeafBlockSamples - (_ring_sample_cnt[order] & LeafMask)); + if (samples >= bblank) { + memcpy((uint8_t*)_dest_ptr, (uint8_t *)logic.data, bblank/8); + _ring_sample_cnt[order] += bblank; + samples -= bblank; + + // calc mipmap of current block + calc_mipmap(order, index0, index1, LeafBlockSamples); + + // calc root of current block + if (*((uint64_t *)_ch_data[order][index0].lbp[index1]) != 0) + _ch_data[order][index0].value += 1ULL<< index1; + if (*((uint64_t *)_ch_data[order][index0].lbp[index1] + LeafBlockSpace / sizeof(uint64_t) - 1) != 0) { + _ch_data[order][index0].tog += 1ULL << index1; + } else { + // trim leaf to free space + free(_ch_data[order][index0].lbp[index1]); + _ch_data[order][index0].lbp[index1] = NULL; + } + } else { + memcpy((uint8_t*)_dest_ptr, (uint8_t *)logic.data, samples/8); + _ring_sample_cnt[order] += samples; + samples = 0; + } + } + + _sample_count = *min_element(_sample_cnt.begin(), _sample_cnt.end()); + _ring_sample_count = *min_element(_ring_sample_cnt.begin(), _ring_sample_cnt.end()); +} + +void LogicSnapshot::calc_mipmap(unsigned int order, uint8_t index0, uint8_t index1, uint64_t samples) +{ + uint8_t offset; + uint64_t *src_ptr; + uint64_t *dest_ptr; + unsigned int i; + + // level 1 + src_ptr = (uint64_t *)_ch_data[order][index0].lbp[index1]; + dest_ptr = src_ptr + (LeafBlockSamples / Scale) - 1; + const uint64_t mask = 1ULL << (Scale - 1); + for(i = 0; i < samples / Scale; i++) { + offset = i % Scale; + if (offset == 0) + dest_ptr++; + *dest_ptr += ((_last_sample[order] ^ *src_ptr) != 0 ? 1ULL : 0ULL) << offset; + _last_sample[order] = *src_ptr & mask ? ~0ULL : 0ULL; + src_ptr++; + } + + // level 2/3 + src_ptr = (uint64_t *)_ch_data[order][index0].lbp[index1] + (LeafBlockSamples / Scale); + dest_ptr = src_ptr + (LeafBlockSamples / Scale / Scale) - 1; + for(i = LeafBlockSamples / Scale; i < LeafBlockSpace / sizeof(uint64_t) - 1; i++) { + offset = i % Scale; + if (offset == 0) + dest_ptr++; + *dest_ptr += (*src_ptr != 0 ? 1ULL : 0ULL) << offset; + src_ptr++; + } +} + +const uint8_t *LogicSnapshot::get_samples(uint64_t start_sample, uint64_t &end_sample, + int sig_index) { //assert(data); assert(start_sample >= 0); - assert(start_sample <= (int64_t)get_sample_count()); + assert(start_sample < get_sample_count()); assert(end_sample >= 0); - assert(end_sample <= (int64_t)get_sample_count()); + assert(end_sample < get_sample_count()); assert(start_sample <= end_sample); - (void)end_sample; + int order = get_ch_order(sig_index); + uint64_t root_index = start_sample >> (LeafBlockPower + RootScalePower); + uint8_t root_pos = (start_sample & RootMask) >> LeafBlockPower; + uint64_t block_offset = (start_sample & LeafMask) / 8; + end_sample = (root_index << (LeafBlockPower + RootScalePower)) + + (root_pos << LeafBlockPower) + + ~(~0ULL << LeafBlockPower); + end_sample = min(end_sample, get_sample_count() - 1); - //const size_t size = (end_sample - start_sample) * _unit_size; - //memcpy(data, (const uint8_t*)_data + start_sample * _unit_size, size); - return (uint8_t*)_data + start_sample * _unit_size; + if (order == -1 || + _ch_data[order][root_index].lbp[root_pos] == NULL) + return NULL; + else + return (uint8_t *)_ch_data[order][root_index].lbp[root_pos] + block_offset; } -void LogicSnapshot::reallocate_mipmap_level(MipMapLevel &m) +bool LogicSnapshot::get_sample(uint64_t index, int sig_index) { - const uint64_t new_data_length = ((m.length + MipMapDataUnit - 1) / - MipMapDataUnit) * MipMapDataUnit; - if (new_data_length > m.data_length) - { - m.data_length = new_data_length; + int order = get_ch_order(sig_index); + assert(order != -1); + assert(_ch_data[order].size() != 0); + assert(index < get_sample_count()); - // Padding is added to allow for the uint64_t write word -// m.data = realloc(m.data, new_data_length * _unit_size + -// sizeof(uint64_t)); - } + uint64_t index_mask = 1ULL << (index & LevelMask[0]); + uint64_t root_index = index >> (LeafBlockPower + RootScalePower); + uint8_t root_pos = (index & RootMask) >> LeafBlockPower; + uint64_t root_pos_mask = 1ULL << root_pos; + + if ((_ch_data[order][root_index].tog & root_pos_mask) == 0) { + return (_ch_data[order][root_index].value & root_pos_mask) != 0; + } else { + uint64_t *lbp = (uint64_t *)_ch_data[order][root_index].lbp[root_pos]; + return *(lbp + ((index & LeafMask) >> ScalePower)) & index_mask; + } } -void LogicSnapshot::append_payload_to_mipmap() -{ - MipMapLevel &m0 = _mip_map[0]; - uint64_t prev_length; - const uint8_t *src_ptr; - uint8_t *dest_ptr; - uint64_t accumulator; - unsigned int diff_counter; - - // Expand the data buffer to fit the new samples - prev_length = m0.length; - m0.length = _sample_count / MipMapScaleFactor; - - // Break off if there are no new samples to compute - if (m0.length == prev_length) - return; - - reallocate_mipmap_level(m0); - - dest_ptr = (uint8_t*)m0.data + prev_length * _unit_size; - - // Iterate through the samples to populate the first level mipmap - const uint8_t *const end_src_ptr = (uint8_t*)_data + - m0.length * _unit_size * MipMapScaleFactor; - for (src_ptr = (uint8_t*)_data + - prev_length * _unit_size * MipMapScaleFactor; - src_ptr < end_src_ptr;) - { - // Accumulate transitions which have occurred in this sample - accumulator = 0; - diff_counter = MipMapScaleFactor; - while (diff_counter-- > 0) - { - const uint64_t sample = *(uint64_t*)src_ptr; - accumulator |= _last_append_sample ^ sample; - _last_append_sample = sample; - src_ptr += _unit_size; - } - - *(uint64_t*)dest_ptr = accumulator; - dest_ptr += _unit_size; - } - - // Compute higher level mipmaps - for (unsigned int level = 1; level < ScaleStepCount; level++) - { - MipMapLevel &m = _mip_map[level]; - const MipMapLevel &ml = _mip_map[level-1]; - - // Expand the data buffer to fit the new samples - prev_length = m.length; - m.length = ml.length / MipMapScaleFactor; - - // Break off if there are no more samples to computed - if (m.length == prev_length) - break; - - reallocate_mipmap_level(m); - - // Subsample the level lower level - src_ptr = (uint8_t*)ml.data + - _unit_size * prev_length * MipMapScaleFactor; - const uint8_t *const end_dest_ptr = - (uint8_t*)m.data + _unit_size * m.length; - for (dest_ptr = (uint8_t*)m.data + - _unit_size * prev_length; - dest_ptr < end_dest_ptr; - dest_ptr += _unit_size) - { - accumulator = 0; - diff_counter = MipMapScaleFactor; - while (diff_counter-- > 0) - { - accumulator |= *(uint64_t*)src_ptr; - src_ptr += _unit_size; - } - - *(uint64_t*)dest_ptr = accumulator; - } - } -} - -void LogicSnapshot::get_subsampled_edges( - std::vector &edges, - uint64_t start, uint64_t end, - float min_length, int sig_index) +bool LogicSnapshot::get_display_edges(std::vector > &edges, + std::vector > &togs, + uint64_t start, uint64_t end, uint16_t width, uint16_t max_togs, + double pixels_offset, double min_length, uint16_t sig_index) { if (!edges.empty()) edges.clear(); + if (!togs.empty()) + togs.clear(); if (get_sample_count() == 0) - return; + return false; assert(end < get_sample_count()); - assert(start <= end); - assert(min_length > 0); - assert(sig_index >= 0); - assert(sig_index < 64); + assert(start <= end); + assert(min_length > 0); uint64_t index = start; bool last_sample; - const uint64_t block_length = (uint64_t)max(min_length, 1.0f); - const uint64_t sig_mask = 1ULL << sig_index; + bool start_sample; - - // Store the initial state - last_sample = (get_sample(start) & sig_mask) != 0; - edges.push_back(pair(index++, last_sample)); - - while (index + block_length <= end) - { + // Get the initial state + start_sample = last_sample = get_sample(index++, sig_index); + togs.push_back(pair(0, last_sample)); + while(edges.size() < width) { // search next edge - get_nxt_edge(index, last_sample, end, min_length, sig_index); + bool has_edge = get_nxt_edge(index, last_sample, end, 0, sig_index); - //----- Store the edge -----// + // calc the edge position + int gap = (index / min_length) - pixels_offset; + index = max((uint64_t)ceil((floor(index/min_length) + 1) * min_length), index + 1); + while(gap > edges.size() && edges.size() < width) + edges.push_back(pair(false, last_sample)); - // Take the last sample of the quanization block - const int64_t final_index = index + block_length; - if (index + block_length > end) - break; + if (index > end) + last_sample = get_sample(end, sig_index); + else + last_sample = get_sample(index - 1, sig_index); - // Store the final state - const bool final_sample = - (get_sample(final_index - 1) & sig_mask) != 0; - edges.push_back(pair(index, final_sample)); + if (has_edge) { + edges.push_back(pair(true, last_sample)); + if (togs.size() < max_togs) + togs.push_back(pair(edges.size() - 1, last_sample)); + } - index = final_index; - last_sample = final_sample; - } + while(index > end && edges.size() < width) + edges.push_back(pair(false, last_sample)); + } - // Add the final state - const bool end_sample = ((get_sample(end) & sig_mask) != 0); - if ((end != get_sample_count() - 1) || - ((end == get_sample_count() - 1) && end_sample != last_sample)) - edges.push_back(pair(end, end_sample)); + if (togs.size() < max_togs) { + last_sample = get_sample(end, sig_index); + togs.push_back(pair(edges.size() - 1, last_sample)); + } - if (end == get_sample_count() - 1) - edges.push_back(pair(end + 1, ~last_sample)); + return start_sample; } bool LogicSnapshot::get_nxt_edge( uint64_t &index, bool last_sample, uint64_t end, - float min_length, int sig_index) + double min_length, int sig_index) { - unsigned int level; - bool fast_forward; - - //assert(index > 0); - - const unsigned int min_level = max((int)floorf(logf(min_length) / - LogMipMapScaleFactor) - 1, 0); - const uint64_t sig_mask = 1ULL << sig_index; - - if (index >= end) + if (index > end) return false; - //----- Continue to search -----// - level = min_level; + int order = get_ch_order(sig_index); + if (order == -1) + return false; - // We cannot fast-forward if there is no mip-map data at - // at the minimum level. - fast_forward = (_mip_map[level].data != NULL); + //const unsigned int min_level = max((int)floorf(logf(min_length) / logf(Scale)) - 1, 0); + const unsigned int min_level = max((int)(log2f(min_length) - 1) / ScalePower, 0); + uint64_t root_index = index >> (LeafBlockPower + RootScalePower); + uint8_t root_pos = (index & RootMask) >> LeafBlockPower; + bool edge_hit = false; - if (min_length < MipMapScaleFactor) + // linear search for the next transition on the root level + for (int64_t i = root_index; !edge_hit && (index <= end) && i < _ch_data[order].size(); i++) { + uint64_t cur_mask = (~0ULL << root_pos); + do { + uint64_t cur_tog = _ch_data[order][i].tog & cur_mask; + if (cur_tog != 0) { + uint64_t first_edge_pos = bsf_folded(cur_tog); + uint64_t *lbp = (uint64_t *)_ch_data[order][i].lbp[first_edge_pos]; + uint64_t blk_start = (i << (LeafBlockPower + RootScalePower)) + (first_edge_pos << LeafBlockPower); + index = max(blk_start, index); + if (min_level < ScaleLevel) { + uint64_t block_end = min(index | LeafMask, end); + edge_hit = block_nxt_edge(lbp, index, block_end, last_sample, min_level); + } else { + edge_hit = true; + } + if (first_edge_pos == RootScale - 1) + break; + cur_mask = (~0ULL << (first_edge_pos + 1)); + } else { + index = (index + (1 << (LeafBlockPower + RootScalePower))) & + (~0ULL << (LeafBlockPower + RootScalePower)); + break; + } + } while (!edge_hit && index < end); + root_pos = 0; + } + return edge_hit; +} + +bool LogicSnapshot::get_pre_edge(uint64_t &index, bool last_sample, + double min_length, int sig_index) +{ + assert(index < get_sample_count()); + + int order = get_ch_order(sig_index); + if (order == -1) + return false; + + //const unsigned int min_level = max((int)floorf(logf(min_length) / logf(Scale)) - 1, 1); + const unsigned int min_level = max((int)(log2f(min_length) - 1) / ScalePower, 0); + int root_index = index >> (LeafBlockPower + RootScalePower); + uint8_t root_pos = (index & RootMask) >> LeafBlockPower; + bool edge_hit = false; + + // linear search for the previous transition on the root level + for (int64_t i = root_index; !edge_hit && i >= 0; i--) { + uint64_t cur_mask = (~0ULL >> (RootScale - root_pos - 1)); + do { + uint64_t cur_tog = _ch_data[order][i].tog & cur_mask; + if (cur_tog != 0) { + uint64_t first_edge_pos = bsr64(cur_tog); + uint64_t *lbp = (uint64_t *)_ch_data[order][i].lbp[first_edge_pos]; + uint64_t blk_end = ((i << (LeafBlockPower + RootScalePower)) + + (first_edge_pos << LeafBlockPower)) | LeafMask; + index = min(blk_end, index); + if (min_level < ScaleLevel) { + edge_hit = block_pre_edge(lbp, index, last_sample, min_level, sig_index); + } else { + edge_hit = true; + } + if (first_edge_pos == 0) + break; + cur_mask = (~0ULL >> (RootScale - first_edge_pos)); + } else { + break; + } + } while (!edge_hit); + root_pos = RootScale - 1; + } + + return edge_hit; +} + +bool LogicSnapshot::block_nxt_edge(uint64_t *lbp, uint64_t &index, uint64_t block_end, bool last_sample, + unsigned int min_level) +{ + unsigned int level = min_level; + bool fast_forward = true; + const uint64_t last = last_sample ? ~0ULL : 0; + + //----- Search Next Edge Within Current LeafBlock -----// + if (level == 0) { // Search individual samples up to the beginning of // the next first level mip map block - const uint64_t final_index = min(end, - pow2_ceil(index, MipMapScalePower)); - - for (; index < final_index && - (index & ~(~0 << MipMapScalePower)) != 0; - index++) - { - const bool sample = - (get_sample(index) & sig_mask) != 0; - - // If there was a change we cannot fast forward - if (sample != last_sample) { - fast_forward = false; - break; - } - } - } - else - { - // If resolution is less than a mip map block, - // round up to the beginning of the mip-map block - // for this level of detail - const int min_level_scale_power = - (level + 1) * MipMapScalePower; - index = pow2_ceil(index, min_level_scale_power); - if (index >= end) - return false; - - // We can fast forward only if there was no change - const bool sample = - (get_sample(index) & sig_mask) != 0; - if (last_sample != sample) + const uint64_t offset = (index & ~(~0ULL << LeafBlockPower)) >> ScalePower; + const uint64_t mask = last_sample ? ~(~0ULL << (index & LevelMask[0])) : ~0ULL << (index & LevelMask[0]); + uint64_t sample = last_sample ? *(lbp + offset) | mask : *(lbp + offset) & mask; + if (sample ^ last) { + index = (index & ~LevelMask[0]) + bsf_folded(last_sample ? ~sample : sample); fast_forward = false; + } else { + index = ((index >> ScalePower) + 1) << ScalePower; + } + } else { + index = ((index >> level*ScalePower) + 1) << level*ScalePower; } if (fast_forward) { @@ -382,155 +681,95 @@ bool LogicSnapshot::get_nxt_edge( // zooming in on them to find the point where the edge // begins. - // Slide right and zoom out at the beginnings of mip-map + // Zoom out at the beginnings of mip-map // blocks until we encounter a change - while (1) { - const int level_scale_power = - (level + 1) * MipMapScalePower; - const uint64_t offset = - index >> level_scale_power; - - // Check if we reached the last block at this - // level, or if there was a change in this block - if (offset >= _mip_map[level].length || - (get_subsample(level, offset) & - sig_mask)) - break; - - if ((offset & ~(~0 << MipMapScalePower)) == 0) { - // If we are now at the beginning of a - // higher level mip-map block ascend one - // level - if (level + 1 >= ScaleStepCount || - !_mip_map[level + 1].data) - break; - + while (index <= block_end) { + // continue only within current block + if (level == 0) level++; - } else { - // Slide right to the beginning of the - // next mip map block - index = pow2_ceil(index + 1, - level_scale_power); - } - } - - // Zoom in, and slide right until we encounter a change, - // and repeat until we reach min_level - while (1) { - assert(_mip_map[level].data); - const int level_scale_power = - (level + 1) * MipMapScalePower; + (level + 1) * ScalePower; const uint64_t offset = - index >> level_scale_power; + (index & ~(~0ULL << LeafBlockPower)) >> level_scale_power; + const uint64_t mask = ~0ULL << ((index & LevelMask[level]) >> (level*ScalePower)); + uint64_t sample = *(lbp + LevelOffset[level] + offset) & mask; - // Check if we reached the last block at this - // level, or if there was a change in this block - if (offset >= _mip_map[level].length || - (get_subsample(level, offset) & - sig_mask)) { - // Zoom in unless we reached the minimum - // zoom - if (level == min_level) - break; - - level--; + // Check if there was a change in this block + if (sample) { + index = (index & (~0 << (level + 1)*ScalePower)) + (bsf_folded(sample) << level*ScalePower); + break; } else { - // Slide right to the beginning of the - // next mip map block - index = pow2_ceil(index + 1, - level_scale_power); + index = ((index >> (level + 1)*ScalePower) + 1) << (level + 1)*ScalePower; + ++level; } } - // If individual samples within the limit of resolution, - // do a linear search for the next transition within the - // block - if (min_length < MipMapScaleFactor) { - for (; index < end; index++) { - const bool sample = (get_sample(index) & - sig_mask) != 0; - if (sample != last_sample) + // Zoom in until we encounter a change, + // and repeat until we reach min_level + while ((index <= block_end) && (level > min_level)) { + // continue only within current block + level--; + const int level_scale_power = + (level + 1) * ScalePower; + const uint64_t offset = + (index & ~(~0ULL << LeafBlockPower)) >> level_scale_power; + const uint64_t mask = (level == 0 && last_sample) ? + ~(~0ULL << ((index & LevelMask[level]) >> (level*ScalePower))) : + ~0ULL << ((index & LevelMask[level]) >> (level*ScalePower)); + uint64_t sample = (level == 0 && last_sample) ? + *(lbp + LevelOffset[level] + offset) | mask : + *(lbp + LevelOffset[level] + offset) & mask; + + // Update the low level position of the change in this block + if (level == 0 ? sample ^ last : sample) { + index = (index & (~0 << (level + 1)*ScalePower)) + (bsf_folded(level == 0 ? sample ^ last : sample) << level*ScalePower); + if (level == min_level) break; } } } - if (index >= end) - return false; - else - return true; + return (index <= block_end); } -bool LogicSnapshot::get_pre_edge( - uint64_t &index, bool last_sample, - float min_length, int sig_index) +bool LogicSnapshot::block_pre_edge(uint64_t *lbp, uint64_t &index, bool last_sample, + unsigned int min_level, int sig_index) { - unsigned int level; - bool fast_forward; + assert(min_level == 0); - assert(index < get_sample_count()); + unsigned int level = min_level; + bool fast_forward = true; + bool within_block = true; + const uint64_t last = last_sample ? ~0ULL : 0; + uint64_t block_start = index & ~LeafMask; - const unsigned int min_level = max((int)floorf(logf(min_length) / - LogMipMapScaleFactor) - 1, 0); - const uint64_t sig_mask = 1ULL << sig_index; - - //----- Continue to search -----// - level = min_level; - - // We cannot fast-forward if there is no mip-map data at - // at the minimum level. - fast_forward = (_mip_map[level].data != NULL); - - if (min_length < MipMapScaleFactor) + //----- Search Next Edge Within Current LeafBlock -----// + if (level == 0) { - // Search individual samples down to the ending of + // Search individual samples down to the beginning of // the previous first level mip map block - uint64_t final_index; - if (index < (1 << MipMapScalePower)) - final_index = 0; - else - final_index = pow2_ceil(index + 1, MipMapScalePower) - (1 << MipMapScalePower) - 1; - - for (; index >= final_index; index--) - { - const bool sample = - (get_sample(index) & sig_mask) != 0; - - // If there was a change we cannot fast forward - if (sample != last_sample) { - fast_forward = false; - index++; - return true; - } - + const uint64_t offset = (index & ~(~0ULL << LeafBlockPower)) >> ScalePower; + const uint64_t mask = last_sample ? ~(~0ULL >> (Scale - (index & LevelMask[0]) - 1)) : ~0ULL >> (Scale - (index & LevelMask[0]) - 1); + uint64_t sample = last_sample ? *(lbp + offset) | mask : *(lbp + offset) & mask; + if (sample ^ last) { + index = (index & ~LevelMask[0]) + bsr64(last_sample ? ~sample : sample) + 1; + return true; + } else { + index &= ~LevelMask[0]; if (index == 0) return false; - } - } - else - { - // If resolution is less than a mip map block, - // round up to the beginning of the mip-map block - // for this level of detail - const unsigned int min_level_scale_power = - (level + 1) * MipMapScalePower; - if (index < (uint64_t)(1 << min_level_scale_power)) - index = 0; - else - index = pow2_ceil(index, min_level_scale_power) - (1 << min_level_scale_power) - 1; + else + index--; - // We can fast forward only if there was no change - const bool sample = - (get_sample(index) & sig_mask) != 0; - if (last_sample != sample) { - fast_forward = false; - index++; - return true; + // using get_sample() to avoid out of block case + bool sample = get_sample(index, sig_index); + if (sample ^ last_sample) { + index++; + return true; + } else if (index < block_start) { + return false; + } } - - if (index == 0) - return false; } if (fast_forward) { @@ -540,96 +779,305 @@ bool LogicSnapshot::get_pre_edge( // zooming in on them to find the point where the edge // begins. - // Slide left and zoom out at the endings of mip-map + // Zoom out at the beginnings of mip-map // blocks until we encounter a change - while (1) { - const int level_scale_power = - (level + 1) * MipMapScalePower; - const uint64_t offset = - index >> level_scale_power; - - // Check if we reached the first block at this - // level, or if there was a change in this block - if (offset == 0 || - (get_subsample(level, offset) & - sig_mask)) - break; - - if (((offset+1) & ~(~0 << MipMapScalePower)) == 0) { - // If we are now at the ending of a - // higher level mip-map block ascend one - // level - if (level + 1 >= ScaleStepCount || - !_mip_map[level + 1].data) - break; - + while (index > block_start) { + // continue only within current block + if (level == 0) level++; - } else { - // Slide left to the beginning of the - // previous mip map block - index = pow2_ceil(index + 1, - level_scale_power) - (1 << level_scale_power) - 1; - } - } - - // Zoom in, and slide left until we encounter a change, - // and repeat until we reach min_level - while (1) { - assert(_mip_map[level].data); - const int level_scale_power = - (level + 1) * MipMapScalePower; + (level + 1) * ScalePower; const uint64_t offset = - index >> level_scale_power; + (index & ~(~0ULL << LeafBlockPower)) >> level_scale_power; + const uint64_t mask = ~0ULL >> (Scale - ((index & LevelMask[level]) >> (level*ScalePower)) - 1); + uint64_t sample = *(lbp + LevelOffset[level] + offset) & mask; - // Check if we reached the first block at this - // level, or if there was a change in this block - if (offset == 0 || - (get_subsample(level, offset) & - sig_mask)) { - // Zoom in unless we reached the minimum - // zoom - if (level == min_level) - break; - - level--; + // Check if there was a change in this block + if (sample) { + index = (index & (~0 << (level + 1)*ScalePower)) + + (bsr64(sample) << level*ScalePower) + + ~(~0ULL << level*ScalePower); + break; } else { - // Slide left to the ending of the - // previous mip map block - index = pow2_ceil(index + 1, - level_scale_power) - (1 << level_scale_power) - 1; + index = (index >> (level + 1)*ScalePower) << (level + 1)*ScalePower; + if (index == 0) + return false; + else + index--; } } - // If individual samples within the limit of resolution, - // do a linear search for the next transition within the - // block - if (min_length < MipMapScaleFactor) { - for (; index > 0; index--) { - const bool sample = (get_sample(index) & - sig_mask) != 0; - if (sample != last_sample) { + // Zoom in until we encounter a change, + // and repeat until we reach min_level + while ((index >= block_start) && (level > min_level)) { + // continue only within current block + level--; + const int level_scale_power = + (level + 1) * ScalePower; + const uint64_t offset = + (index & ~(~0ULL << LeafBlockPower)) >> level_scale_power; + const uint64_t mask = (level == 0 && last_sample) ? + ~(~0ULL >> (Scale - ((index & LevelMask[level]) >> (level*ScalePower)) - 1)) : + ~0ULL >> (Scale - ((index & LevelMask[level]) >> (level*ScalePower)) - 1); + uint64_t sample = (level == 0 && last_sample) ? + *(lbp + LevelOffset[level] + offset) | mask : + *(lbp + LevelOffset[level] + offset) & mask; + + // Update the low level position of the change in this block + if (level == 0 ? sample ^ last : sample) { + index = (index & (~0 << (level + 1)*ScalePower)) + + (bsr64(level == 0 ? sample ^ last : sample) << level*ScalePower) + + ~(~0ULL << level*ScalePower); + if (level == min_level) { index++; - return true; + break; } + } else { + index = (index & (~0 << (level + 1)*ScalePower)); + } + } + } + + return (index >= block_start) && (index != 0); +} + +bool LogicSnapshot::pattern_search(int64_t start, int64_t end, bool nxt, int64_t &index, + std::map pattern) +{ + int start_match_pos = pattern.size() - 1; + int end_match_pos = 0; + if (pattern.empty()) { + return true; + } else { + for (auto& iter:pattern) { + int char_index = 0; + for (auto& iter_char:iter.second) { + if (iter_char != 'X') { + start_match_pos = min(start_match_pos, char_index); + end_match_pos = max(end_match_pos, char_index); + } + char_index++; + } + } + } + + if (start_match_pos > end_match_pos) + return true; + + std::map cur_sample; + std::map exp_sample; + std::map cur_edge; + std::map exp_edge; + int nxt_match_pos = nxt ? start_match_pos : end_match_pos; + int cur_match_pos = nxt ? nxt_match_pos - 1 : nxt_match_pos + 1; + std::vector exp_index; + bool find_edge; + typedef std::map::iterator it_type; + while(nxt ? index <= end : index >= start) { + // get expacted and current pattern + exp_index.clear(); + for(it_type iterator = pattern.begin(); + iterator != pattern.end(); iterator++) { + uint16_t ch_index = iterator->first; + if (!has_data(ch_index)) + continue; + exp_index.push_back(index); + cur_sample[ch_index] = get_sample(index, ch_index); + + if (iterator->second[nxt_match_pos] == '0') { + exp_sample[ch_index] = false; + } else if (iterator->second[nxt_match_pos] == '1') { + exp_sample[ch_index] = true; + } else if (iterator->second[nxt_match_pos] == 'X') { + exp_sample[ch_index] = cur_sample[ch_index]; + } else if (iterator->second[nxt_match_pos] == 'F') { + exp_sample[ch_index] = false; + exp_edge[ch_index] = true; + } else if (iterator->second[nxt_match_pos] == 'R') { + exp_sample[ch_index] = true; + exp_edge[ch_index] = true; + } else if (iterator->second[nxt_match_pos] == 'C') { + exp_sample[ch_index] = cur_sample[ch_index]; + exp_edge[ch_index] = true; + } + + if (exp_edge.find(ch_index) != exp_edge.end()) { + if (index > start) { + bool sample = get_sample(index - 1, ch_index); + if (sample != cur_sample[ch_index]) + cur_edge[ch_index] = true; + } + } + } + cur_match_pos = nxt_match_pos; + + // pattern compare + if (cur_edge == exp_edge && + cur_sample == exp_sample) + nxt_match_pos += nxt ? 1 : -1; + + if (nxt ? nxt_match_pos > end_match_pos : + nxt_match_pos < start_match_pos) { + // all matched + return true; + } else if (nxt ? nxt_match_pos > cur_match_pos : + nxt_match_pos < cur_match_pos) { + // one stage matched + int64_t sub_index = nxt ? index + 1 : index - 1; + while((nxt ? cur_match_pos++ < end_match_pos : cur_match_pos-- > start_match_pos) && + (nxt ? sub_index <= end : sub_index >= start)) { + // get expacted and current pattern + exp_index.clear(); + for(it_type iterator = pattern.begin(); + iterator != pattern.end(); iterator++) { + uint16_t ch_index = iterator->first; + if (!has_data(ch_index)) + continue; + exp_index.push_back(sub_index); + cur_sample[ch_index] = get_sample(sub_index, ch_index); + + if (iterator->second[cur_match_pos] == '0') { + exp_sample[ch_index] = false; + } else if (iterator->second[cur_match_pos] == '1') { + exp_sample[ch_index] = true; + } else if (iterator->second[cur_match_pos] == 'X') { + exp_sample[ch_index] = cur_sample[ch_index]; + } else if (iterator->second[cur_match_pos] == 'F') { + exp_sample[ch_index] = false; + exp_edge[ch_index] = true; + } else if (iterator->second[cur_match_pos] == 'R') { + exp_sample[ch_index] = true; + exp_edge[ch_index] = true; + } else if (iterator->second[cur_match_pos] == 'C') { + exp_sample[ch_index] = cur_sample[ch_index]; + exp_edge[ch_index] = true; + } + + if (exp_edge.find(ch_index) != exp_edge.end()) { + if (sub_index > start) { + bool sample = get_sample(sub_index - 1, ch_index); + if (sample != cur_sample[ch_index]) + cur_edge[ch_index] = true; + } + } + } + + // pattern compare + if (cur_edge != exp_edge || + cur_sample != exp_sample) { + cur_match_pos = nxt_match_pos - 1; + index += nxt ? 1 : -1; + break; + } else { + sub_index += nxt ? 1 : -1; + } + } + + if (nxt ? cur_match_pos > end_match_pos : + cur_match_pos < start_match_pos) { + index = nxt ? sub_index - 1 : index; + return true; + } else { + return false; + } + } else { + // not matched, find the next index for pattern compare + find_edge = true; + int seq = 0; + for(it_type iterator = pattern.begin(); + iterator != pattern.end(); iterator++) { + uint16_t ch_index = iterator->first; + if (!has_data(ch_index)) + continue; + if (exp_edge.find(ch_index) != exp_edge.end() || + cur_sample[ch_index] != exp_sample[ch_index]) { + do { + if (nxt) { + exp_index[seq] += 1; + find_edge = get_nxt_edge(exp_index[seq], cur_sample[ch_index], end, 1, ch_index); + } else { + exp_index[seq] -= 1; + cur_sample[ch_index] = get_sample(exp_index[seq], ch_index); + find_edge = get_pre_edge(exp_index[seq], cur_sample[ch_index], 1, ch_index); + } + if (find_edge) + cur_sample[ch_index] = get_sample(exp_index[seq], ch_index); + else + break; + }while(cur_sample[ch_index] != exp_sample[ch_index]); + } + seq++; + } + if (find_edge) { + if (nxt) + index = *max_element(exp_index.begin(), exp_index.end()); + else + index = *min_element(exp_index.begin(), exp_index.end()); + } else { + break; } } } return false; } -uint64_t LogicSnapshot::get_subsample(int level, uint64_t offset) const +bool LogicSnapshot::has_data(int sig_index) { - assert(level >= 0); - assert(_mip_map[level].data); - return *(uint64_t*)((uint8_t*)_mip_map[level].data + - _unit_size * offset); + return get_ch_order(sig_index) != -1; } -uint64_t LogicSnapshot::pow2_ceil(uint64_t x, unsigned int power) +int LogicSnapshot::get_block_num() { - const uint64_t p = 1 << power; - return (x + p - 1) / p * p; + return (_ring_sample_count >> LeafBlockPower) + + ((_ring_sample_count & LeafMask) != 0); +} + +uint64_t LogicSnapshot::get_block_size(int block_index) +{ + assert(block_index < get_block_num()); + + if (block_index < get_block_num() - 1) { + return LeafBlockSamples / 8; + } else { + if (_ring_sample_count % LeafBlockSamples == 0) + return LeafBlockSamples / 8; + else + return (_ring_sample_count % LeafBlockSamples) / 8; + } +} + +uint8_t *LogicSnapshot::get_block_buf(int block_index, int sig_index, bool &sample) +{ + assert(block_index < get_block_num()); + + int order = get_ch_order(sig_index); + if (order == -1) { + sample = 0; + return NULL; + } + uint64_t index = block_index / RootScale; + uint8_t pos = block_index % RootScale; + uint8_t *lbp = (uint8_t *)_ch_data[order][index].lbp[pos]; + + if (lbp == NULL) + sample = (_ch_data[order][index].value & 1ULL << pos) != 0; + + return lbp; +} + +int LogicSnapshot::get_ch_order(int sig_index) +{ + int order = 0; + for (auto& iter:_ch_index) { + if (iter == sig_index) + break; + order++; + } + + if (order >= _ch_index.size()) + return -1; + else + return order; } } // namespace data diff --git a/DSView/pv/data/logicsnapshot.h b/DSView/pv/data/logicsnapshot.h index d1f70635..10656051 100644 --- a/DSView/pv/data/logicsnapshot.h +++ b/DSView/pv/data/logicsnapshot.h @@ -26,6 +26,8 @@ #include "snapshot.h" +#include + #include #include @@ -43,19 +45,30 @@ namespace data { class LogicSnapshot : public Snapshot { private: - struct MipMapLevel - { - uint64_t length; - uint64_t data_length; - void *data; - }; + static const int ScaleLevel = 4; + static const int ScalePower = 6; + static const uint64_t Scale = 1 << ScalePower; + static const int ScaleSize = Scale / 8; + static const int RootScalePower = ScalePower; + static const uint64_t RootScale = 1 << RootScalePower; + static const uint64_t LeafBlockSpace = (Scale + Scale*Scale + + Scale*Scale*Scale + Scale*Scale*Scale*Scale) / 8; + static const uint64_t LeafBlockSamples = 1 << ScaleLevel*ScalePower; + static const uint64_t LeafBlockPower = ScaleLevel*ScalePower; + static const uint64_t RootNodeSamples = LeafBlockSamples*RootScale; + + static const uint64_t RootMask = ~(~0ULL << RootScalePower) << ScaleLevel*ScalePower; + static const uint64_t LeafMask = ~(~0ULL << ScaleLevel*ScalePower); + static const uint64_t LevelMask[ScaleLevel]; + static const uint64_t LevelOffset[ScaleLevel]; private: - static const unsigned int ScaleStepCount = 10; - static const int MipMapScalePower; - static const int MipMapScaleFactor; - static const float LogMipMapScaleFactor; - static const uint64_t MipMapDataUnit; + struct RootNode + { + uint64_t tog; + uint64_t value; + void *lbp[Scale]; + }; public: typedef std::pair EdgePair; @@ -64,50 +77,116 @@ public: LogicSnapshot(); virtual ~LogicSnapshot(); - + void free_data(); void clear(); void init(); - void first_payload(const sr_datafeed_logic &logic, uint64_t total_sample_count, unsigned int channel_num); + void first_payload(const sr_datafeed_logic &logic, uint64_t total_sample_count, GSList *channels); void append_payload(const sr_datafeed_logic &logic); - uint8_t * get_samples(int64_t start_sample, int64_t end_sample) const; + const uint8_t * get_samples(uint64_t start_sample, uint64_t& end_sample, int sig_index); -private: - void free_mipmap(); - void reallocate_mipmap_level(MipMapLevel &m); - void append_payload_to_mipmap(); + bool get_sample(uint64_t index, int sig_index); -public: - /** - * Parses a logic data snapshot to generate a list of transitions - * in a time interval to a given level of detail. - * @param[out] edges The vector to place the edges into. - * @param[in] start The start sample index. - * @param[in] end The end sample index. - * @param[in] min_length The minimum number of samples that - * can be resolved at this level of detail. - * @param[in] sig_index The index of the signal. - **/ - void get_subsampled_edges(std::vector &edges, - uint64_t start, uint64_t end, - float min_length, int sig_index); + void capture_ended(); + + bool get_display_edges(std::vector> &edges, + std::vector> &togs, + uint64_t start, uint64_t end, uint16_t width, + uint16_t max_togs, double pixels_offset, + double min_length, uint16_t sig_index); bool get_nxt_edge(uint64_t &index, bool last_sample, uint64_t end, - float min_length, int sig_index); + double min_length, int sig_index); bool get_pre_edge(uint64_t &index, bool last_sample, - float min_length, int sig_index); + double min_length, int sig_index); + + bool has_data(int sig_index); + int get_block_num(); + uint64_t get_block_size(int block_index); + uint8_t *get_block_buf(int block_index, int sig_index, bool &sample); + + bool pattern_search(int64_t start, int64_t end, bool nxt, int64_t& index, + std::map pattern); private: - uint64_t get_subsample(int level, uint64_t offset) const; + int get_ch_order(int sig_index); + void calc_mipmap(unsigned int order, uint8_t index0, uint8_t index1, uint64_t samples); - static uint64_t pow2_ceil(uint64_t x, unsigned int power); + void append_cross_payload(const sr_datafeed_logic &logic); + void append_split_payload(const sr_datafeed_logic &logic); + + bool block_nxt_edge(uint64_t *lbp, uint64_t &index, uint64_t block_end, bool last_sample, + unsigned int min_level); + + bool block_pre_edge(uint64_t *lbp, uint64_t &index, bool last_sample, + unsigned int min_level, int sig_index); + + inline uint64_t bsf_folded (uint64_t bb) + { + static const int lsb_64_table[64] = { + 63, 30, 3, 32, 59, 14, 11, 33, + 60, 24, 50, 9, 55, 19, 21, 34, + 61, 29, 2, 53, 51, 23, 41, 18, + 56, 28, 1, 43, 46, 27, 0, 35, + 62, 31, 58, 4, 5, 49, 54, 6, + 15, 52, 12, 40, 7, 42, 45, 16, + 25, 57, 48, 13, 10, 39, 8, 44, + 20, 47, 38, 22, 17, 37, 36, 26 + }; + unsigned int folded; + bb ^= bb - 1; + folded = (int) bb ^ (bb >> 32); + return lsb_64_table[folded * 0x78291ACF >> 26]; + } + + inline int bsr32(uint32_t bb) + { + static const char msb_256_table[256] = { + 0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, + 4, 4, 4, 4, 4, 4, 4, 4,4, 4, 4, 4,4, 4, 4, 4, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + }; + int result = 0; + + if (bb > 0xFFFF) { + bb >>= 16; + result += 16; + } + if (bb > 0xFF) { + bb >>= 8; + result += 8; + } + + return (result + msb_256_table[bb]); + } + + inline uint64_t bsr64(uint64_t bb) + { + const uint32_t hb = bb >> 32; + return hb ? 32 + bsr32((uint32_t)hb) : bsr32((uint32_t)bb); + } private: - struct MipMapLevel _mip_map[ScaleStepCount]; - uint64_t _last_append_sample; + std::vector> _ch_data; + uint64_t _block_num; + uint8_t _byte_fraction; + uint16_t _ch_fraction; + void *_src_ptr; + void *_dest_ptr; + + std::vector _sample_cnt; + std::vector _block_cnt; + std::vector _ring_sample_cnt; + std::vector _last_sample; friend class LogicSnapshotTest::Pow2; friend class LogicSnapshotTest::Basic; diff --git a/DSView/pv/data/mathstack.cpp b/DSView/pv/data/mathstack.cpp index 0bec7874..2faa9bae 100644 --- a/DSView/pv/data/mathstack.cpp +++ b/DSView/pv/data/mathstack.cpp @@ -193,14 +193,13 @@ void MathStack::calc_fft() if (_snapshot->get_sample_count() < _sample_num*_sample_interval) return; - // Get the samplerate and start time - _start_time = data->get_start_time(); + // Get the samplerate _samplerate = data->samplerate(); if (_samplerate == 0.0) _samplerate = 1.0; // prepare _xn data - const double offset = dsoSig->get_zero_value(); + const double offset = dsoSig->get_hw_offset(); const double vscale = dsoSig->get_vDialValue() * dsoSig->get_factor() * DS_CONF_DSO_VDIVS / (1000*255.0); const uint16_t step = _snapshot->get_channel_num() * _sample_interval; const uint8_t *const samples = _snapshot->get_samples(0, _sample_num*_sample_interval-1, _index); diff --git a/DSView/pv/data/signaldata.cpp b/DSView/pv/data/signaldata.cpp index 00c7e5ef..a4cd3af3 100644 --- a/DSView/pv/data/signaldata.cpp +++ b/DSView/pv/data/signaldata.cpp @@ -28,8 +28,7 @@ namespace pv { namespace data { SignalData::SignalData() : - _samplerate(0), - _start_time(0) + _samplerate(0) { } @@ -44,10 +43,5 @@ void SignalData::set_samplerate(double samplerate) _samplerate = samplerate; } -double SignalData::get_start_time() const -{ - return _start_time; -} - } // namespace data } // namespace pv diff --git a/DSView/pv/data/signaldata.h b/DSView/pv/data/signaldata.h index 7f96312e..c74898d1 100644 --- a/DSView/pv/data/signaldata.h +++ b/DSView/pv/data/signaldata.h @@ -42,11 +42,8 @@ public: virtual void init() = 0; - double get_start_time() const; - protected: double _samplerate; - double _start_time; }; } // namespace data diff --git a/DSView/pv/data/snapshot.cpp b/DSView/pv/data/snapshot.cpp index df2c8011..d49fac6e 100644 --- a/DSView/pv/data/snapshot.cpp +++ b/DSView/pv/data/snapshot.cpp @@ -59,7 +59,9 @@ void Snapshot::free_data() free(_data); _data = NULL; _capacity = 0; + _sample_count = 0; } + _ch_index.clear(); } bool Snapshot::memory_failed() const @@ -69,7 +71,7 @@ bool Snapshot::memory_failed() const bool Snapshot::empty() const { - if (get_sample_count() == 0 || _memory_failed || !_data) + if (get_sample_count() == 0) return true; else return false; @@ -106,46 +108,9 @@ unsigned int Snapshot::get_channel_num() const return _channel_num; } -uint64_t Snapshot::get_sample(uint64_t index) const +void Snapshot::capture_ended() { - assert(_data); - assert(index < get_sample_count()); - - return *(uint64_t*)((uint8_t*)_data + index * _unit_size); -} - -void Snapshot::append_data(void *data, uint64_t samples) -{ -// _data = realloc(_data, (_sample_count + samples) * _unit_size + -// sizeof(uint64_t)); - if (_sample_count + samples < _total_sample_count) - _sample_count += samples; - else - _sample_count = _total_sample_count; - - if (_ring_sample_count + samples > _total_sample_count) { - memcpy((uint8_t*)_data + _ring_sample_count * _unit_size, - data, (_total_sample_count - _ring_sample_count) * _unit_size); - _ring_sample_count = (samples + _ring_sample_count - _total_sample_count) % _total_sample_count; - memcpy((uint8_t*)_data, - data, _ring_sample_count * _unit_size); - } else { - memcpy((uint8_t*)_data + _ring_sample_count * _unit_size, - data, samples * _unit_size); - _ring_sample_count += samples; - } -} - -void Snapshot::refill_data(void *data, uint64_t samples, bool instant) -{ - if (instant) { - memcpy((uint8_t*)_data + _sample_count * _channel_num, data, samples*_channel_num); - _sample_count = (_sample_count + samples) % (_total_sample_count + 1); - } else { - memcpy((uint8_t*)_data, data, samples*_channel_num); - _sample_count = samples; - } - + set_last_ended(true); } } // namespace data diff --git a/DSView/pv/data/snapshot.h b/DSView/pv/data/snapshot.h index 5fa3e440..36b935af 100644 --- a/DSView/pv/data/snapshot.h +++ b/DSView/pv/data/snapshot.h @@ -55,17 +55,18 @@ public: unsigned int get_channel_num() const; - uint64_t get_sample(uint64_t index) const; + virtual void capture_ended(); protected: - void append_data(void *data, uint64_t samples); - void refill_data(void *data, uint64_t samples, bool instant); - void free_data(); + virtual void free_data(); protected: mutable boost::recursive_mutex _mutex; + //std::vector _data; void* _data; + std::vector _ch_index; + uint64_t _capacity; unsigned int _channel_num; uint64_t _sample_count; diff --git a/DSView/pv/device/device.cpp b/DSView/pv/device/device.cpp index 74b021f8..56870acf 100644 --- a/DSView/pv/device/device.cpp +++ b/DSView/pv/device/device.cpp @@ -32,7 +32,7 @@ namespace pv { namespace device { Device::Device(sr_dev_inst *sdi) : - _sdi(sdi) + _sdi(sdi) { assert(_sdi); } @@ -50,6 +50,7 @@ void Device::use(SigSession *owner) throw(QString) assert(_sdi); sr_dev_open(_sdi); + _usable = (_sdi->status == SR_ST_ACTIVE); if (sr_session_dev_add(_sdi) != SR_OK) throw QString(tr("Failed to use device.")); } diff --git a/DSView/pv/device/device.h b/DSView/pv/device/device.h index 435bb4bd..a98ffc0d 100644 --- a/DSView/pv/device/device.h +++ b/DSView/pv/device/device.h @@ -34,7 +34,7 @@ public: sr_dev_inst* dev_inst() const; - void use(SigSession *owner) throw(QString); + void use(SigSession *owner) throw(QString); void release(); diff --git a/DSView/pv/device/devinst.cpp b/DSView/pv/device/devinst.cpp index 347ce869..1874c847 100644 --- a/DSView/pv/device/devinst.cpp +++ b/DSView/pv/device/devinst.cpp @@ -33,7 +33,8 @@ namespace pv { namespace device { DevInst::DevInst() : - _owner(NULL) + _owner(NULL), + _usable(true) { _id = malloc(1); } @@ -206,5 +207,10 @@ void DevInst::run() sr_session_run(); } +bool DevInst::is_usable() const +{ + return _usable; +} + } // device } // pv diff --git a/DSView/pv/device/devinst.h b/DSView/pv/device/devinst.h index dec1b525..7f29687c 100644 --- a/DSView/pv/device/devinst.h +++ b/DSView/pv/device/devinst.h @@ -118,6 +118,8 @@ public: virtual bool is_trigger_enabled() const; + bool is_usable() const; + public: virtual void start(); @@ -132,6 +134,7 @@ signals: protected: SigSession *_owner; void *_id; + bool _usable; }; } // device diff --git a/DSView/pv/device/file.cpp b/DSView/pv/device/file.cpp index fdc1bd15..c10fa10d 100644 --- a/DSView/pv/device/file.cpp +++ b/DSView/pv/device/file.cpp @@ -25,6 +25,8 @@ #include +#include + #include #include @@ -63,7 +65,35 @@ File* File::create(QString name) } } - return new InputFile(name); + return new InputFile(name); +} + +QJsonArray File::get_decoders() +{ + struct zip *archive; + struct zip_file *zf; + struct zip_stat zs; + int ret; + char *dec_file; + QJsonArray dec_array; + QJsonParseError error; + + if (archive = zip_open(_path.toLocal8Bit().data(), 0, &ret)) { + /* read "decoders" */ + if (zip_stat(archive, "decoders", 0, &zs) != -1) { + if (dec_file = (char *)g_try_malloc(zs.size)) { + zf = zip_fopen_index(archive, zs.index, 0); + zip_fread(zf, dec_file, zs.size); + zip_fclose(zf); + + //QString sessionData = QString::fromUtf8(dec_file); + QJsonDocument sessionDoc = QJsonDocument::fromJson(QByteArray::fromRawData(dec_file, zs.size), &error); + dec_array = sessionDoc.array(); + } + } + } + + return dec_array; } } // device diff --git a/DSView/pv/device/file.h b/DSView/pv/device/file.h index 89a7ddf3..000b950b 100644 --- a/DSView/pv/device/file.h +++ b/DSView/pv/device/file.h @@ -24,6 +24,9 @@ #include +#include +#include + #include "devinst.h" namespace pv { @@ -37,6 +40,8 @@ protected: public: static File* create(QString name); + QJsonArray get_decoders(); + public: QString format_device_title() const; diff --git a/DSView/pv/device/inputfile.cpp b/DSView/pv/device/inputfile.cpp index 967d6f7b..3b7e29bf 100644 --- a/DSView/pv/device/inputfile.cpp +++ b/DSView/pv/device/inputfile.cpp @@ -50,13 +50,18 @@ void InputFile::use(SigSession *owner) throw(QString) { assert(!_input); - _input = load_input_file_format(_path, NULL); - File::use(owner); + // only *.dsl file is valid + // don't allow other types of file input + throw tr("Not a valid DSView data file."); + return; - sr_session_new(); +// _input = load_input_file_format(_path, NULL); +// File::use(owner); - if (sr_session_dev_add(_input->sdi) != SR_OK) - throw tr("Failed to add session device."); +// sr_session_new(); + +// if (sr_session_dev_add(_input->sdi) != SR_OK) +// throw tr("Failed to add session device."); } void InputFile::release() @@ -78,7 +83,7 @@ sr_input_format* InputFile::determine_input_file_format(const QString filename) /* If there are no input formats, return NULL right away. */ sr_input_format *const *const inputs = sr_input_list(); if (!inputs) { - g_critical("No supported input formats available."); + g_critical("No supported input formats available."); return NULL; } @@ -90,7 +95,7 @@ sr_input_format* InputFile::determine_input_file_format(const QString filename) /* Return NULL if no input module wanted to touch this. */ if (!inputs[i]) { - g_critical("Error: no matching input module found."); + g_critical("Error: no matching input module found."); return NULL; } diff --git a/DSView/pv/device/sessionfile.cpp b/DSView/pv/device/sessionfile.cpp index c1902c15..ada63fc3 100644 --- a/DSView/pv/device/sessionfile.cpp +++ b/DSView/pv/device/sessionfile.cpp @@ -21,7 +21,7 @@ #include "sessionfile.h" -#include +#include namespace pv { namespace device { diff --git a/DSView/pv/dialogs/calibration.cpp b/DSView/pv/dialogs/calibration.cpp index f9e7995e..32d754ad 100755 --- a/DSView/pv/dialogs/calibration.cpp +++ b/DSView/pv/dialogs/calibration.cpp @@ -45,6 +45,10 @@ const QString Calibration::VOFF = QT_TR_NOOP(" VOFF"); Calibration::Calibration(QWidget *parent) : DSDialog(parent) { +#ifdef Q_OS_OSX + Qt::WindowFlags flags = windowFlags(); + this->setWindowFlags(flags | Qt::Tool); +#endif this->setFixedSize(400, 250); this->setWindowOpacity(0.7); this->setModal(false); @@ -125,7 +129,7 @@ void Calibration::set_device(boost::shared_ptr dev_inst) gain_slider->setRange(-vgain_range/2, vgain_range/2); gain_slider->setValue(vgain - vgain_default); gain_slider->setObjectName(VGAIN+probe->index); - QString gain_string = "Channel" + QString::number(probe->index) + VGAIN; + QString gain_string = tr("Channel") + QString::number(probe->index) + VGAIN; QLabel *gain_label = new QLabel(gain_string, this); _flayout->addRow(gain_label, gain_slider); _slider_list.push_back(gain_slider); @@ -147,7 +151,7 @@ void Calibration::set_device(boost::shared_ptr dev_inst) off_slider->setRange(0, voff_range); off_slider->setValue(voff); off_slider->setObjectName(VOFF+probe->index); - QString off_string = "Channel" + QString::number(probe->index) + VOFF; + QString off_string = tr("Channel") + QString::number(probe->index) + VOFF; QLabel *off_label = new QLabel(off_string, this); _flayout->addRow(off_label, off_slider); _slider_list.push_back(off_slider); @@ -213,7 +217,8 @@ void Calibration::on_save() QProgressDialog dlg(tr("Save Calibration Result... It can take a while."), tr("Cancel"),0,0,this,flags); dlg.setWindowModality(Qt::WindowModal); - dlg.setWindowFlags(Qt::Dialog | Qt::FramelessWindowHint); + dlg.setWindowFlags(Qt::Dialog | Qt::FramelessWindowHint | Qt::WindowSystemMenuHint | + Qt::WindowMinimizeButtonHint | Qt::WindowMaximizeButtonHint); dlg.setCancelButton(NULL); QFutureWatcher watcher; @@ -239,7 +244,8 @@ void Calibration::on_reset() QProgressDialog dlg(tr("Reset Calibration Result... It can take a while."), tr("Cancel"),0,0,this,flags); dlg.setWindowModality(Qt::WindowModal); - dlg.setWindowFlags(Qt::Dialog | Qt::FramelessWindowHint); + dlg.setWindowFlags(Qt::Dialog | Qt::FramelessWindowHint | Qt::WindowSystemMenuHint | + Qt::WindowMinimizeButtonHint | Qt::WindowMaximizeButtonHint); dlg.setCancelButton(NULL); QFutureWatcher watcher; diff --git a/DSView/pv/dialogs/deviceoptions.cpp b/DSView/pv/dialogs/deviceoptions.cpp index 74f8f557..0824716d 100644 --- a/DSView/pv/dialogs/deviceoptions.cpp +++ b/DSView/pv/dialogs/deviceoptions.cpp @@ -54,7 +54,7 @@ DeviceOptions::DeviceOptions(QWidget *parent, boost::shared_ptrsetLayout(&_probes_box_layout); _layout.addWidget(_probes_box); } else if (_dev_inst->name().contains("DSCope")){ - _config_button = new QPushButton(tr("Zero Adjustment"), this); + _config_button = new QPushButton(tr("Auto Calibration"), this); _layout.addWidget(_config_button); connect(_config_button, SIGNAL(clicked()), this, SLOT(zero_adj())); @@ -86,8 +86,7 @@ DeviceOptions::DeviceOptions(QWidget *parent, boost::shared_ptr > &properties = @@ -103,10 +102,24 @@ void DeviceOptions::accept() for (const GSList *l = _dev_inst->dev_inst()->channels; l; l = l->next) { sr_channel *const probe = (sr_channel*)l->data; assert(probe); - probe->enabled = (_probes_checkBox_list.at(index)->checkState() == Qt::Checked); index++; + if (probe->enabled) + hasEnabled = true; } + } else { + hasEnabled = true; + } + + if (hasEnabled) { + QDialog::accept(); + } else { + dialogs::DSMessageBox msg(this); + msg.mBox()->setText(tr("Attention")); + msg.mBox()->setInformativeText(tr("All channel disabled! Please enable at least one channel.")); + msg.mBox()->addButton(tr("Ok"), QMessageBox::AcceptRole); + msg.mBox()->setIcon(QMessageBox::Warning); + msg.exec(); } } @@ -147,6 +160,8 @@ void DeviceOptions::setup_probes() int row0 = 0, row1 = 0, col = 0; int index = 0; QString ch_mode; + int vld_ch_num = 0; + int cur_ch_num = 0; while(_probes_box_layout.count() > 0) { @@ -182,10 +197,22 @@ void DeviceOptions::setup_probes() } } + GVariant *gvar = _dev_inst->get_config(NULL, NULL, SR_CONF_VLD_CH_NUM); + if (gvar != NULL) { + vld_ch_num = g_variant_get_int16(gvar); + g_variant_unref(gvar); + } + for (const GSList *l = _dev_inst->dev_inst()->channels; l; l = l->next) { sr_channel *const probe = (sr_channel*)l->data; assert(probe); + if (probe->enabled) + cur_ch_num++; + + if (cur_ch_num > vld_ch_num) + probe->enabled = false; + QLabel *probe_label = new QLabel(QString::number(probe->index), this); QCheckBox *probe_checkBox = new QCheckBox(this); probe_checkBox->setCheckState(probe->enabled ? Qt::Checked : Qt::Unchecked); @@ -197,6 +224,8 @@ void DeviceOptions::setup_probes() index++; col = index % 8; row1 = index / 8; + + connect(probe_checkBox, SIGNAL(released()), this, SLOT(channel_enable())); } QPushButton *_enable_all_probes = new QPushButton(tr("Enable All"), this); @@ -220,8 +249,45 @@ void DeviceOptions::set_all_probes(bool set) } } +void DeviceOptions::enable_max_probes() { + int cur_ch_num = 0; + QVector::iterator iter = _probes_checkBox_list.begin(); + while(iter != _probes_checkBox_list.end()) { + if ((*iter)->isChecked()) + cur_ch_num++; + iter++; + } + + GVariant* gvar = _dev_inst->get_config(NULL, NULL, SR_CONF_VLD_CH_NUM); + if (gvar == NULL) + return; + + int vld_ch_num = g_variant_get_int16(gvar); + g_variant_unref(gvar); + iter = _probes_checkBox_list.begin(); + while(cur_ch_num < vld_ch_num && + iter != _probes_checkBox_list.end()) { + if (!(*iter)->isChecked()) { + (*iter)->setChecked(true); + cur_ch_num++; + } + iter++; + } +} + void DeviceOptions::enable_all_probes() { + GVariant* gvar = _dev_inst->get_config(NULL, NULL, SR_CONF_STREAM); + if (gvar != NULL) { + bool stream_mode = g_variant_get_boolean(gvar); + g_variant_unref(gvar); + + if (stream_mode) { + enable_max_probes(); + return; + } + } + set_all_probes(true); } @@ -237,7 +303,7 @@ void DeviceOptions::zero_adj() dialogs::DSMessageBox msg(this); msg.mBox()->setText(tr("Information")); - msg.mBox()->setInformativeText(tr("Zero adjustment program will be started. Please keep all channels out of singal input. It can take a while!")); + msg.mBox()->setInformativeText(tr("Auto Calibration program will be started. Please keep all channels out of singal input. It can take a while!")); //msg.mBox()->setStandardButtons(QMessageBox::); msg.mBox()->addButton(tr("Ok"), QMessageBox::AcceptRole); msg.mBox()->addButton(tr("Cancel"), QMessageBox::RejectRole); @@ -293,5 +359,47 @@ void DeviceOptions::channel_check() setup_probes(); } +void DeviceOptions::channel_enable() +{ + QCheckBox* sc=dynamic_cast(sender()); + if (sc == NULL || !sc->isChecked()) + return; + + GVariant* gvar = _dev_inst->get_config(NULL, NULL, SR_CONF_STREAM); + if (gvar == NULL) + return; + + bool stream_mode = g_variant_get_boolean(gvar); + g_variant_unref(gvar); + + if (!stream_mode) + return; + + int cur_ch_num = 0; + QVector::iterator i = _probes_checkBox_list.begin(); + while(i != _probes_checkBox_list.end()) { + if ((*i)->isChecked()) + cur_ch_num++; + i++; + } + + gvar = _dev_inst->get_config(NULL, NULL, SR_CONF_VLD_CH_NUM); + if (gvar == NULL) + return; + + int vld_ch_num = g_variant_get_int16(gvar); + g_variant_unref(gvar); + if (cur_ch_num > vld_ch_num) { + dialogs::DSMessageBox msg(this); + msg.mBox()->setText(tr("Information")); + msg.mBox()->setInformativeText(tr("Current mode only suppport max ") + QString::number(vld_ch_num) + tr(" channels!")); + msg.mBox()->addButton(tr("Ok"), QMessageBox::AcceptRole); + msg.mBox()->setIcon(QMessageBox::Information); + msg.exec(); + + sc->setChecked(false); + } +} + } // namespace dialogs } // namespace pv diff --git a/DSView/pv/dialogs/deviceoptions.h b/DSView/pv/dialogs/deviceoptions.h index 6de30d94..52b314ae 100644 --- a/DSView/pv/dialogs/deviceoptions.h +++ b/DSView/pv/dialogs/deviceoptions.h @@ -66,6 +66,7 @@ private: void setup_probes(); void set_all_probes(bool set); + void enable_max_probes(); private slots: void enable_all_probes(); @@ -74,6 +75,7 @@ private slots: void mode_check(); void channel_check(); void on_calibration(); + void channel_enable(); private: boost::shared_ptr _dev_inst; diff --git a/DSView/pv/dialogs/dsdialog.cpp b/DSView/pv/dialogs/dsdialog.cpp index 01f4a685..29986d3a 100755 --- a/DSView/pv/dialogs/dsdialog.cpp +++ b/DSView/pv/dialogs/dsdialog.cpp @@ -36,7 +36,8 @@ DSDialog::DSDialog(QWidget *parent, bool hasClose) : QDialog(parent), _moving(false) { - setWindowFlags(Qt::FramelessWindowHint | Qt::Dialog); + setWindowFlags(Qt::FramelessWindowHint | Qt::Dialog | Qt::WindowSystemMenuHint | + Qt::WindowMinimizeButtonHint | Qt::WindowMaximizeButtonHint); setAttribute(Qt::WA_TranslucentBackground); build_main(hasClose); diff --git a/DSView/pv/dialogs/dsmessagebox.cpp b/DSView/pv/dialogs/dsmessagebox.cpp index 0491ba3d..4ef58fc5 100755 --- a/DSView/pv/dialogs/dsmessagebox.cpp +++ b/DSView/pv/dialogs/dsmessagebox.cpp @@ -36,7 +36,8 @@ DSMessageBox::DSMessageBox(QWidget *parent) : QDialog(parent), _moving(false) { - setWindowFlags(Qt::FramelessWindowHint | Qt::Dialog); + setWindowFlags(Qt::FramelessWindowHint | Qt::Dialog | Qt::WindowSystemMenuHint | + Qt::WindowMinimizeButtonHint | Qt::WindowMaximizeButtonHint); setAttribute(Qt::WA_TranslucentBackground); _main = new QWidget(this); QVBoxLayout *mlayout = new QVBoxLayout(_main); @@ -50,7 +51,8 @@ DSMessageBox::DSMessageBox(QWidget *parent) : _main->setGraphicsEffect(bodyShadow); _msg = new QMessageBox(this); - _msg->setWindowFlags(Qt::FramelessWindowHint | Qt::Widget); + _msg->setWindowFlags(Qt::FramelessWindowHint | Qt::Widget | Qt::WindowSystemMenuHint | + Qt::WindowMinimizeButtonHint | Qt::WindowMaximizeButtonHint); _titlebar = new toolbars::TitleBar(false, this); _titlebar->setTitle(tr("Message")); diff --git a/DSView/pv/dialogs/protocolexp.cpp b/DSView/pv/dialogs/protocolexp.cpp index 11f24355..860138e2 100644 --- a/DSView/pv/dialogs/protocolexp.cpp +++ b/DSView/pv/dialogs/protocolexp.cpp @@ -152,7 +152,7 @@ void ProtocolExp::accept() break; } } - out << QString("%1;%2;%3\n") + out << QString("%1,%2,%3\n") .arg("ID") .arg("Time[s]") .arg(title); @@ -180,7 +180,7 @@ void ProtocolExp::accept() 0, decoder_stack->sample_count()-1); if (!annotations.empty()) { BOOST_FOREACH(const Annotation &a, annotations) { - out << QString("%1;%2;%3\n") + out << QString("%1,%2,%3\n") .arg(QString::number(exported)) .arg(QString::number(a.start_sample()*time_pre_samples)) .arg(a.annotations().at(0)); @@ -195,7 +195,8 @@ void ProtocolExp::accept() QProgressDialog dlg(tr("Export Protocol List Result... It can take a while."), tr("Cancel"),0,100,this,flags); dlg.setWindowModality(Qt::WindowModal); - dlg.setWindowFlags(Qt::Dialog | Qt::FramelessWindowHint); + dlg.setWindowFlags(Qt::Dialog | Qt::FramelessWindowHint | Qt::WindowSystemMenuHint | + Qt::WindowMinimizeButtonHint | Qt::WindowMaximizeButtonHint); QFutureWatcher watcher; connect(&watcher,SIGNAL(finished()),&dlg,SLOT(cancel())); diff --git a/DSView/pv/dialogs/protocollist.cpp b/DSView/pv/dialogs/protocollist.cpp index fbc51379..78fa327c 100644 --- a/DSView/pv/dialogs/protocollist.cpp +++ b/DSView/pv/dialogs/protocollist.cpp @@ -47,6 +47,15 @@ ProtocolList::ProtocolList(QWidget *parent, SigSession &session) : { pv::data::DecoderModel* decoder_model = _session.get_decoder_model(); + _map_zoom_combobox = new QComboBox(this); + _map_zoom_combobox->addItem(tr("Fit to Window")); + _map_zoom_combobox->addItem(tr("Fixed")); + int cur_map_zoom = _session.get_map_zoom(); + if (cur_map_zoom >= _map_zoom_combobox->count()) + _map_zoom_combobox->setCurrentIndex(0); + else + _map_zoom_combobox->setCurrentIndex(cur_map_zoom); + connect(_map_zoom_combobox, SIGNAL(currentIndexChanged(int)), &_session, SLOT(set_map_zoom(int))); _protocol_combobox = new QComboBox(this); const std::vector< boost::shared_ptr > decode_sigs( @@ -67,6 +76,7 @@ ProtocolList::ProtocolList(QWidget *parent, SigSession &session) : _flayout->setFormAlignment(Qt::AlignLeft); _flayout->setLabelAlignment(Qt::AlignLeft); _flayout->setFieldGrowthPolicy(QFormLayout::AllNonFixedFieldsGrow); + _flayout->addRow(new QLabel(tr("Map Zoom: "), this), _map_zoom_combobox); _flayout->addRow(new QLabel(tr("Decoded Protocols: "), this), _protocol_combobox); _layout = new QVBoxLayout(); @@ -185,6 +195,5 @@ void ProtocolList::on_row_check(bool show) _session.get_decoder_model()->setDecoderStack(decoder_stack); } - } // namespace dialogs } // namespace pv diff --git a/DSView/pv/dialogs/protocollist.h b/DSView/pv/dialogs/protocollist.h index 8c4524fd..bc6a9891 100644 --- a/DSView/pv/dialogs/protocollist.h +++ b/DSView/pv/dialogs/protocollist.h @@ -62,6 +62,7 @@ private: SigSession &_session; toolbars::TitleBar *_titlebar; + QComboBox *_map_zoom_combobox; QComboBox *_protocol_combobox; std::list _show_checkbox_list; std::list _show_label_list; diff --git a/DSView/pv/dialogs/search.cpp b/DSView/pv/dialogs/search.cpp index 1469df78..cede9607 100644 --- a/DSView/pv/dialogs/search.cpp +++ b/DSView/pv/dialogs/search.cpp @@ -21,53 +21,73 @@ #include "search.h" +#include "../view/logicsignal.h" + #include #include +#include + namespace pv { namespace dialogs { -Search::Search(QWidget *parent, boost::shared_ptr dev_inst, QString pattern) : +Search::Search(QWidget *parent, SigSession &session, std::map pattern) : DSDialog(parent), - _dev_inst(dev_inst) + _session(session) { - assert(_dev_inst); QFont font("Monaco"); font.setStyleHint(QFont::Monospace); font.setFixedPitch(true); + //this->setMinimumWidth(350); - QRegExp value_rx("[10XRFCxrfc ]+"); + QRegExp value_rx("[10XRFCxrfc]+"); QValidator *value_validator = new QRegExpValidator(value_rx, this); - - search_lineEdit.setText(pattern); - search_lineEdit.setValidator(value_validator); - search_lineEdit.setMaxLength(16 * 2 - 1); - 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 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); search_buttonBox.addButton(QDialogButtonBox::Cancel); QGridLayout *search_layout = new QGridLayout(); - search_layout->setVerticalSpacing(5); - search_layout->addWidget(search_label, 1, 1); - search_layout->addWidget(new QLabel(tr("Search Value: ")), 2,0, Qt::AlignRight); - search_layout->addWidget(&search_lineEdit, 2, 1); - search_layout->addWidget(new QLabel(" "), 3,0); - search_layout->addWidget(new QLabel(tr("X: Don't care\n0: Low level\n1: High level\nR: Rising edge\nF: Falling edge\nC: Rising/Falling edge")), 4, 0); - search_layout->addWidget(&search_buttonBox, 5, 2); + search_layout->setVerticalSpacing(0); + + int index = 0; + BOOST_FOREACH(const boost::shared_ptr sig, + _session.get_signals()) { + assert(sig); + boost::shared_ptr logic_sig; + if (logic_sig = boost::dynamic_pointer_cast(sig)) { + QLineEdit *search_lineEdit = new QLineEdit(this); + if (pattern.find(index) != pattern.end()) + search_lineEdit->setText(pattern[index]); + else + search_lineEdit->setText("X"); + search_lineEdit->setValidator(value_validator); + search_lineEdit->setMaxLength(1); + search_lineEdit->setInputMask("X"); + search_lineEdit->setFont(font); + _search_lineEdit_vec.push_back(search_lineEdit); + + search_layout->addWidget(new QLabel(logic_sig->get_name()+":"), index, 0, Qt::AlignRight); + search_layout->addWidget(new QLabel(QString::number(logic_sig->get_index())), index, 1, Qt::AlignRight); + search_layout->addWidget(search_lineEdit, index, 2); + + connect(search_lineEdit, SIGNAL(editingFinished()), this, SLOT(format())); + + index++; + } + } + + search_layout->addWidget(new QLabel(" "), index,0); + search_layout->addWidget(new QLabel(tr("X: Don't care\n0: Low level\n1: High level\nR: Rising edge\nF: Falling edge\nC: Rising/Falling edge")), 0, 3, index, 1); + search_layout->addWidget(&search_buttonBox, index+1, 3); + search_layout->setColumnStretch(3, 100); layout()->addLayout(search_layout); setTitle(tr("Search Options")); connect(&search_buttonBox, SIGNAL(accepted()), this, SLOT(accept())); connect(&search_buttonBox, SIGNAL(rejected()), this, SLOT(reject())); - connect(_dev_inst.get(), SIGNAL(device_updated()), this, SLOT(reject())); + connect(_session.get_device().get(), SIGNAL(device_updated()), this, SLOT(reject())); } Search::~Search() @@ -81,10 +101,27 @@ void Search::accept() QDialog::accept(); } -QString Search::get_pattern() +void Search::format() { - QString pattern = search_lineEdit.text(); - //pattern.remove(QChar('/r'), Qt::CaseInsensitive); + QLineEdit *sc = qobject_cast(sender()); + sc->setText(sc->text().toUpper()); +} + +std::map Search::get_pattern() +{ + std::map pattern; + + int index = 0; + BOOST_FOREACH(const boost::shared_ptr sig, + _session.get_signals()) { + assert(sig); + boost::shared_ptr logic_sig; + if (logic_sig = boost::dynamic_pointer_cast(sig)) { + pattern[index] = _search_lineEdit_vec[index]->text(); + index++; + } + } + return pattern; } diff --git a/DSView/pv/dialogs/search.h b/DSView/pv/dialogs/search.h index 7a9d15ac..f4105fb6 100644 --- a/DSView/pv/dialogs/search.h +++ b/DSView/pv/dialogs/search.h @@ -45,23 +45,25 @@ class Search : public DSDialog public: - Search(QWidget *parent = 0, boost::shared_ptr dev_inst = 0, QString pattern = ""); + Search(QWidget *parent, SigSession &session, std::map pattern); ~Search(); - QString get_pattern(); + std::map get_pattern(); protected: void accept(); signals: -public slots: +private slots: + void format(); private: + SigSession &_session; + toolbars::TitleBar *_titlebar; - QLineEdit search_lineEdit; + QVector _search_lineEdit_vec; QDialogButtonBox search_buttonBox; - boost::shared_ptr _dev_inst; }; } // namespace decoder diff --git a/DSView/pv/dialogs/storeprogress.cpp b/DSView/pv/dialogs/storeprogress.cpp index cbd57200..aa2f2916 100644 --- a/DSView/pv/dialogs/storeprogress.cpp +++ b/DSView/pv/dialogs/storeprogress.cpp @@ -2,6 +2,7 @@ * This file is part of the PulseView project. * * Copyright (C) 2014 Joel Holdsworth + * Copyright (C) 2016 DreamSourceLab * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -21,62 +22,113 @@ #include "storeprogress.h" #include "dsmessagebox.h" +#include "QVBoxLayout" + namespace pv { namespace dialogs { -StoreProgress::StoreProgress(const QString &file_name, - SigSession &session, QWidget *parent) : - QProgressDialog(tr("Saving..."), tr("Cancel"), 0, 0, parent), - _session(file_name.toStdString(), session) +StoreProgress::StoreProgress(SigSession &session, QWidget *parent) : + DSDialog(parent), + _store_session(session), + _button_box(QDialogButtonBox::Cancel, Qt::Horizontal, this), + _done(false) { - connect(&_session, SIGNAL(progress_updated()), - this, SLOT(on_progress_updated())); + this->setModal(true); + + _info.setText("..."); + _progress.setValue(0); + _progress.setMaximum(0); + + QVBoxLayout* add_layout = new QVBoxLayout(this); + add_layout->addWidget(&_info, 0, Qt::AlignCenter); + add_layout->addWidget(&_progress); + add_layout->addWidget(&_button_box); + layout()->addLayout(add_layout); + + connect(&_button_box, SIGNAL(rejected()), this, SLOT(reject())); + connect(&_store_session, SIGNAL(progress_updated()), + this, SLOT(on_progress_updated()), Qt::QueuedConnection); } StoreProgress::~StoreProgress() { - _session.wait(); + _store_session.wait(); } -void StoreProgress::run() +void StoreProgress::reject() { - if (_session.start()) - show(); - else + using namespace Qt; + _store_session.cancel(); + QDialog::reject(); +} + +void StoreProgress::timeout() +{ + if (_done) + close(); + else + QTimer::singleShot(100, this, SLOT(timeout())); +} + +void StoreProgress::save_run() +{ + _info.setText("Saving..."); + if (_store_session.save_start()) + show(); + else show_error(); + + QTimer::singleShot(100, this, SLOT(timeout())); +} + +void StoreProgress::export_run() +{ + _info.setText("Exporting..."); + if (_store_session.export_start()) + show(); + else + show_error(); + + QTimer::singleShot(100, this, SLOT(timeout())); } void StoreProgress::show_error() { - dialogs::DSMessageBox msg(parentWidget()); - msg.mBox()->setText(tr("Failed to save session.")); - msg.mBox()->setInformativeText(_session.error()); - msg.mBox()->setStandardButtons(QMessageBox::Ok); - msg.mBox()->setIcon(QMessageBox::Warning); - msg.exec(); + if (!_store_session.error().isEmpty()) { + dialogs::DSMessageBox msg(parentWidget()); + msg.mBox()->setText(tr("Failed to save data.")); + msg.mBox()->setInformativeText(_store_session.error()); + msg.mBox()->setStandardButtons(QMessageBox::Ok); + msg.mBox()->setIcon(QMessageBox::Warning); + msg.exec(); + } } -void StoreProgress::closeEvent(QCloseEvent*) +void StoreProgress::closeEvent(QCloseEvent* e) { - _session.cancel(); + _store_session.cancel(); + DSDialog::closeEvent(e); } void StoreProgress::on_progress_updated() { - const std::pair p = _session.progress(); + const std::pair p = _store_session.progress(); assert(p.first <= p.second); - setValue(p.first); - setMaximum(p.second); + _progress.setValue(p.first); + _progress.setMaximum(p.second); - const QString err = _session.error(); + const QString err = _store_session.error(); if (!err.isEmpty()) { show_error(); - close(); + //close(); + _done = true; } - if (p.first == p.second) - close(); + if (p.first == p.second) { + //close(); + _done = true; + } } } // dialogs diff --git a/DSView/pv/dialogs/storeprogress.h b/DSView/pv/dialogs/storeprogress.h index c582e3e1..30cfc841 100644 --- a/DSView/pv/dialogs/storeprogress.h +++ b/DSView/pv/dialogs/storeprogress.h @@ -2,6 +2,7 @@ * This file is part of the PulseView project. * * Copyright (C) 2014 Joel Holdsworth + * Copyright (C) 2016 DreamSourceLab * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -25,9 +26,13 @@ #include -#include +#include +#include +#include +#include -#include +#include "../storesession.h" +#include "../dialogs/dsdialog.h" #include "../toolbars/titlebar.h" namespace pv { @@ -36,30 +41,43 @@ class SigSession; namespace dialogs { -class StoreProgress : public QProgressDialog +class StoreProgress : public DSDialog { Q_OBJECT public: - StoreProgress(const QString &file_name, SigSession &session, + StoreProgress(SigSession &session, QWidget *parent = 0); virtual ~StoreProgress(); - void run(); + + +protected: + void reject(); private: void show_error(); + void closeEvent(QCloseEvent* e); - void closeEvent(QCloseEvent*); +public slots: + void save_run(); + void export_run(); private slots: void on_progress_updated(); + void timeout(); private: - pv::StoreSession _session; + pv::StoreSession _store_session; + + QLabel _info; + QProgressBar _progress; + QDialogButtonBox _button_box; toolbars::TitleBar *_titlebar; + + bool _done; }; } // dialogs diff --git a/DSView/pv/dialogs/waitingdialog.cpp b/DSView/pv/dialogs/waitingdialog.cpp index c069c61f..bb8ddf36 100644 --- a/DSView/pv/dialogs/waitingdialog.cpp +++ b/DSView/pv/dialogs/waitingdialog.cpp @@ -79,7 +79,7 @@ WaitingDialog::WaitingDialog(QWidget *parent, boost::shared_ptraddWidget(&_button_box); layout()->addLayout(mlayout); - setTitle(tr("Zero Adjustment")); + setTitle(tr("Auto Calibration")); } void WaitingDialog::accept() @@ -100,7 +100,8 @@ void WaitingDialog::accept() QProgressDialog dlg(tr("Save Auto Zero Result... It can take a while."), tr("Cancel"),0,0,this,flags); dlg.setWindowModality(Qt::WindowModal); - dlg.setWindowFlags(Qt::Dialog | Qt::FramelessWindowHint); + dlg.setWindowFlags(Qt::Dialog | Qt::FramelessWindowHint | Qt::WindowSystemMenuHint | + Qt::WindowMinimizeButtonHint | Qt::WindowMaximizeButtonHint); dlg.setCancelButton(NULL); QFutureWatcher watcher; @@ -130,7 +131,8 @@ void WaitingDialog::reject() QProgressDialog dlg(tr("Load Current Setting... It can take a while."), tr("Cancel"),0,0,this,flags); dlg.setWindowModality(Qt::WindowModal); - dlg.setWindowFlags(Qt::Dialog | Qt::FramelessWindowHint); + dlg.setWindowFlags(Qt::Dialog | Qt::FramelessWindowHint | Qt::WindowSystemMenuHint | + Qt::WindowMinimizeButtonHint | Qt::WindowMaximizeButtonHint); dlg.setCancelButton(NULL); QFutureWatcher watcher; diff --git a/DSView/pv/dock/measuredock.cpp b/DSView/pv/dock/measuredock.cpp index 27fe3842..e211631e 100644 --- a/DSView/pv/dock/measuredock.cpp +++ b/DSView/pv/dock/measuredock.cpp @@ -34,14 +34,17 @@ #include "../devicemanager.h" #include "../device/device.h" #include "../device/file.h" +#include "../dialogs/dsdialog.h" +#include "../dialogs/dsmessagebox.h" #include #include #include +#include #include "libsigrok4DSL/libsigrok.h" -using boost::shared_ptr; +using namespace boost; namespace pv { namespace dock { @@ -51,7 +54,11 @@ using namespace pv::view; MeasureDock::MeasureDock(QWidget *parent, View &view, SigSession &session) : QScrollArea(parent), _session(session), - _view(view) + _view(view), + _icon_add(":/icons/add.png"), + _icon_add_dis(":/icons/add_dis.png"), + _icon_del(":/icons/del.png"), + _icon_del_dis(":/icons/del_dis.png") { _widget = new QWidget(this); @@ -67,76 +74,74 @@ MeasureDock::MeasureDock(QWidget *parent, View &view, SigSession &session) : _mouse_layout = new QGridLayout(); _mouse_layout->setVerticalSpacing(5); - _mouse_layout->addWidget(_fen_checkBox, 0, 0, 1, 4); + _mouse_layout->addWidget(_fen_checkBox, 0, 0, 1, 6); _mouse_layout->addWidget(new QLabel(tr("W: "), _widget), 1, 0); _mouse_layout->addWidget(_width_label, 1, 1); - _mouse_layout->addWidget(new QLabel(tr("P: "), _widget), 1, 2); - _mouse_layout->addWidget(_period_label, 1, 3); - _mouse_layout->addWidget(new QLabel(tr("F: "), _widget), 2, 2); - _mouse_layout->addWidget(_freq_label, 2, 3); + _mouse_layout->addWidget(new QLabel(tr("P: "), _widget), 1, 4); + _mouse_layout->addWidget(_period_label, 1, 5); + _mouse_layout->addWidget(new QLabel(tr("F: "), _widget), 2, 4); + _mouse_layout->addWidget(_freq_label, 2, 5); _mouse_layout->addWidget(new QLabel(tr("D: "), _widget), 2, 0); _mouse_layout->addWidget(_duty_label, 2, 1); - _mouse_layout->addWidget(new QLabel(_widget), 0, 4); - _mouse_layout->addWidget(new QLabel(_widget), 1, 4); - _mouse_layout->addWidget(new QLabel(_widget), 2, 4); + _mouse_layout->addWidget(new QLabel(_widget), 0, 6); + _mouse_layout->addWidget(new QLabel(_widget), 1, 6); + _mouse_layout->addWidget(new QLabel(_widget), 2, 6); _mouse_layout->setColumnStretch(5, 1); _mouse_groupBox->setLayout(_mouse_layout); + /* cursor distance group */ + _dist_groupBox = new QGroupBox(tr("Cursor Distance"), _widget); + _dist_groupBox->setMinimumWidth(300); + _dist_add_btn = new QToolButton(_widget); + _dist_add_btn->setIcon(_icon_add); + connect(_dist_add_btn, SIGNAL(clicked()), this, SLOT(add_dist_measure())); - _cursor_groupBox = new QGroupBox(tr("Cursor measurement"), _widget); - _t1_comboBox = new QComboBox(_widget); - _t2_comboBox = new QComboBox(_widget); - _t3_comboBox = new QComboBox(_widget); - _delta_label_t1t2 = new QLabel("##########/##########", _widget); - _delta_label_t2t3 = new QLabel("##########/##########", _widget); - _delta_label_t1t3 = new QLabel("##########/##########", _widget); - _t1_last_index = 0; - _t2_last_index = 0; - _t3_last_index = 0; - _t1_comboBox->setSizeAdjustPolicy(QComboBox::AdjustToContents); - _t2_comboBox->setSizeAdjustPolicy(QComboBox::AdjustToContents); - _t3_comboBox->setSizeAdjustPolicy(QComboBox::AdjustToContents); + _dist_layout = new QGridLayout(_widget); + _dist_layout->setVerticalSpacing(5); + _dist_layout->addWidget(_dist_add_btn, 0, 0); + _dist_layout->addWidget(new QLabel(_widget), 0, 1, 1, 3); + _dist_layout->addWidget(new QLabel(tr("Time/Samples"), _widget), 0, 4); + _dist_layout->addWidget(new QLabel(_widget), 0, 5, 1, 2); + _dist_layout->setColumnStretch(1, 50); + _dist_layout->setColumnStretch(6, 100); + add_dist_measure(); + _dist_groupBox->setLayout(_dist_layout); + /* cursor edges group */ + _edge_groupBox = new QGroupBox(tr("Edges"), _widget); + _edge_groupBox->setMinimumWidth(300); + _edge_add_btn = new QToolButton(_widget); + _edge_add_btn->setIcon(_icon_add); + connect(_edge_add_btn, SIGNAL(clicked()), this, SLOT(add_edge_measure())); + + _edge_layout = new QGridLayout(_widget); + _edge_layout->setVerticalSpacing(5); + _edge_layout->addWidget(_edge_add_btn, 0, 0); + _edge_layout->addWidget(new QLabel(_widget), 0, 1, 1, 4); + _edge_layout->addWidget(new QLabel(tr("Channel"), _widget), 0, 5); + _edge_layout->addWidget(new QLabel(tr("Rising/Falling/Edges"), _widget), 0, 6); + _edge_layout->setColumnStretch(1, 50); + //_edge_layout->setColumnStretch(6, 100); + //add_edge_measure(); + _edge_groupBox->setLayout(_edge_layout); + + /* cursors group */ + _cursor_groupBox = new QGroupBox(tr("Cursors"), _widget); _cursor_layout = new QGridLayout(_widget); - _cursor_layout->setVerticalSpacing(5); - _cursor_layout->addWidget(new QLabel(tr("T1: "), _widget), 0, 0); - _cursor_layout->addWidget(_t1_comboBox, 0, 1); - _cursor_layout->addWidget(new QLabel(tr("T2: "), _widget), 1, 0); - _cursor_layout->addWidget(_t2_comboBox, 1, 1); - _cursor_layout->addWidget(new QLabel(tr("T3: "), _widget), 2, 0); - _cursor_layout->addWidget(_t3_comboBox, 2, 1); - - _cursor_layout->addWidget(new QLabel(tr("Time/Samples"), _widget), 3, 1, 1, 2); - _cursor_layout->addWidget(new QLabel(tr("|T2 - T1|: "), _widget), 4, 0); - _cursor_layout->addWidget(_delta_label_t1t2, 4, 1, 1, 2); - - _cursor_layout->addWidget(new QLabel(tr("|T3 - T2|: "), _widget), 5, 0); - _cursor_layout->addWidget(_delta_label_t2t3, 5, 1, 1, 2); - - _cursor_layout->addWidget(new QLabel(tr("|T3 - T1|: "), _widget), 6, 0); - _cursor_layout->addWidget(_delta_label_t1t3, 6, 1, 1, 2); - - _cursor_layout->addWidget(new QLabel(_widget), 7, 0); - _cursor_layout->addWidget(new QLabel(tr("Cursors"), _widget), 8, 0); - _cursor_layout->addWidget(new QLabel(tr("Time/Samples"), _widget), 8, 1, 1, 2); - - _cursor_layout->addWidget(new QLabel(_widget), 0, 2); - _cursor_layout->addWidget(new QLabel(_widget), 1, 2); - _cursor_layout->addWidget(new QLabel(_widget), 2, 2); - _cursor_layout->setColumnStretch(2, 1); + _cursor_layout->addWidget(new QLabel(tr("Time/Samples"), _widget), 0, 2); + _cursor_layout->addWidget(new QLabel(_widget), 0, 3); + _cursor_layout->setColumnStretch(3, 1); _cursor_groupBox->setLayout(_cursor_layout); QVBoxLayout *layout = new QVBoxLayout(_widget); layout->addWidget(_mouse_groupBox); + layout->addWidget(_dist_groupBox); + layout->addWidget(_edge_groupBox); layout->addWidget(_cursor_groupBox); layout->addStretch(1); _widget->setLayout(layout); - connect(_t1_comboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(delta_update())); - connect(_t2_comboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(delta_update())); - connect(_t3_comboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(delta_update())); - connect(_fen_checkBox, SIGNAL(stateChanged(int)), &_view, SLOT(set_measure_en(int))); connect(&_view, SIGNAL(measure_updated()), this, SLOT(measure_updated())); @@ -157,73 +162,70 @@ void MeasureDock::paintEvent(QPaintEvent *) // style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this); } +void MeasureDock::refresh() +{ + +} + +void MeasureDock::reload() +{ + for (QVector ::const_iterator i = _edge_ch_cmb_vec.begin(); + i != _edge_ch_cmb_vec.end(); i++) { + update_probe_selector(*i); + } + reCalc(); +} + void MeasureDock::cursor_update() { using namespace pv::data; - int index = 1; - - disconnect(_t1_comboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(delta_update())); - disconnect(_t2_comboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(delta_update())); - disconnect(_t3_comboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(delta_update())); - _t1_comboBox->clear(); - _t2_comboBox->clear(); - _t3_comboBox->clear(); - if (!_cursor_pushButton_list.empty()) { + for (QVector ::const_iterator i = _cursor_del_btn_vec.begin(); + i != _cursor_del_btn_vec.end(); i++) + delete (*i); for (QVector::Iterator i = _cursor_pushButton_list.begin(); i != _cursor_pushButton_list.end(); i++) delete (*i); for (QVector::Iterator i = _curpos_label_list.begin(); i != _curpos_label_list.end(); i++) delete (*i); - for (QVector::Iterator i = _space_label_list.begin(); - i != _space_label_list.end(); i++) - delete (*i); + _cursor_del_btn_vec.clear(); _cursor_pushButton_list.clear(); _curpos_label_list.clear(); - _space_label_list.clear(); } + update_dist(); + update_edge(); + + int index = 1; for(std::list::iterator i = _view.get_cursorList().begin(); i != _view.get_cursorList().end(); i++) { - QString curCursor = tr("Cursor ")+QString::number(index); - _t1_comboBox->addItem(curCursor); - _t2_comboBox->addItem(curCursor); - _t3_comboBox->addItem(curCursor); + QString curCursor = QString::number(index); + QToolButton *del_btn = new QToolButton(_widget); + del_btn->setIcon(QIcon::fromTheme("measure", + QIcon(":/icons/del.png"))); + del_btn->setCheckable(true); QPushButton *_cursor_pushButton = new QPushButton(curCursor, _widget); + set_cursor_btn_color(_cursor_pushButton); QString _cur_text = _view.get_cm_time(index - 1) + "/" + QString::number(_view.get_cursor_samples(index - 1)); QLabel *_curpos_label = new QLabel(_cur_text, _widget); - QLabel *_space_label = new QLabel(_widget); + _cursor_del_btn_vec.push_back(del_btn); _cursor_pushButton_list.push_back(_cursor_pushButton); _curpos_label_list.push_back(_curpos_label); - _space_label_list.push_back(_space_label); - _cursor_layout->addWidget(_cursor_pushButton, 8 + index, 0); - _cursor_layout->addWidget(_curpos_label, 8 + index, 1, 1, 2); + _cursor_layout->addWidget(del_btn, 1+index, 0); + _cursor_layout->addWidget(_cursor_pushButton, 1 + index, 1); + _cursor_layout->addWidget(_curpos_label, 1 + index, 2); + connect(del_btn, SIGNAL(clicked()), this, SLOT(del_cursor())); connect(_cursor_pushButton, SIGNAL(clicked()), this, SLOT(goto_cursor())); index++; } - _t1_comboBox->setMinimumWidth(_t1_comboBox->sizeHint().width()+30); - _t2_comboBox->setMinimumWidth(_t2_comboBox->sizeHint().width()+30); - _t3_comboBox->setMinimumWidth(_t3_comboBox->sizeHint().width()+30); - if (_t1_last_index < _t1_comboBox->count()) - _t1_comboBox->setCurrentIndex(_t1_last_index); - if (_t2_last_index < _t2_comboBox->count()) - _t2_comboBox->setCurrentIndex(_t2_last_index); - if (_t3_last_index < _t3_comboBox->count()) - _t3_comboBox->setCurrentIndex(_t3_last_index); - - connect(_t1_comboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(delta_update())); - connect(_t2_comboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(delta_update())); - connect(_t3_comboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(delta_update())); - - delta_update(); update(); } @@ -235,7 +237,7 @@ void MeasureDock::measure_updated() _duty_label->setText(_view.get_measure("duty")); } -void MeasureDock::cursor_moved() +void MeasureDock::cursor_moving() { //TimeMarker* grabbed_marker = _view.get_ruler()->get_grabbed_cursor(); if (_view.cursors_shown()) { @@ -248,38 +250,13 @@ void MeasureDock::cursor_moved() index++; } } - delta_update(); + + update_dist(); } -void MeasureDock::delta_update() +void MeasureDock::reCalc() { - QString delta_text; - _t1_last_index = std::max(_t1_comboBox->currentIndex(), 0); - _t2_last_index = std::max(_t2_comboBox->currentIndex(), 0); - _t3_last_index = std::max(_t3_comboBox->currentIndex(), 0); - if (_t1_comboBox->count() != 0 && _t2_comboBox->count() != 0) { - uint64_t delta = abs(_view.get_cursor_samples(_t1_last_index) - - _view.get_cursor_samples(_t2_last_index)); - delta_text = _view.get_cm_delta(_t1_last_index, _t2_last_index) + - "/" + QString::number(delta); - _delta_label_t1t2->setText(delta_text); - } - - if (_t2_comboBox->count() != 0 && _t2_comboBox->count() != 0) { - uint64_t delta = abs(_view.get_cursor_samples(_t2_last_index) - - _view.get_cursor_samples(_t3_last_index)); - delta_text = _view.get_cm_delta(_t2_last_index, _t3_last_index) + - "/" + QString::number(delta); - _delta_label_t2t3->setText(delta_text); - } - - if (_t1_comboBox->count() != 0 && _t3_comboBox->count() != 0) { - uint64_t delta = abs(_view.get_cursor_samples(_t1_last_index) - - _view.get_cursor_samples(_t3_last_index)); - delta_text = _view.get_cm_delta(_t1_last_index, _t3_last_index) + - "/" + QString::number(delta); - _delta_label_t1t3->setText(delta_text); - } + update_edge(); } void MeasureDock::goto_cursor() @@ -297,5 +274,387 @@ void MeasureDock::goto_cursor() } } +void MeasureDock::add_dist_measure() +{ + if (_dist_row_widget_vec.size() > Max_Measure_Limits) + return; + + QWidget *row_widget = new QWidget(_widget); + row_widget->setContentsMargins(0,0,0,0); + QHBoxLayout *row_layout = new QHBoxLayout(row_widget); + row_layout->setContentsMargins(0,0,0,0); + row_layout->setSpacing(0); + row_widget->setLayout(row_layout); + _dist_row_widget_vec.push_back(row_widget); + + QToolButton *del_btn = new QToolButton(row_widget); + del_btn->setIcon(QIcon::fromTheme("measure", + QIcon(":/icons/del.png"))); + del_btn->setCheckable(true); + QPushButton *s_btn = new QPushButton(tr(" "), row_widget); + s_btn->setObjectName("dist"); + QPushButton *e_btn = new QPushButton(tr(" "), row_widget); + e_btn->setObjectName("dist"); + QLabel *r_label = new QLabel(row_widget); + QLabel *g_label = new QLabel(tr("-"), row_widget); + g_label->setContentsMargins(0,0,0,0); + _dist_del_btn_vec.push_back(del_btn); + _dist_s_btn_vec.push_back(s_btn); + _dist_e_btn_vec.push_back(e_btn); + _dist_r_label_vec.push_back(r_label); + + connect(del_btn, SIGNAL(clicked()), this, SLOT(del_dist_measure())); + connect(s_btn, SIGNAL(clicked()), this, SLOT(show_all_coursor())); + connect(e_btn, SIGNAL(clicked()), this, SLOT(show_all_coursor())); + + row_layout->addWidget(del_btn); + row_layout->addSpacing(5); + row_layout->addWidget(s_btn); + row_layout->addWidget(g_label); + row_layout->addWidget(e_btn); + row_layout->addSpacing(5); + row_layout->addWidget(r_label, 100); + + _dist_layout->addWidget(row_widget, _dist_row_widget_vec.size(), 0, 1, 7); + +} + +void MeasureDock::del_dist_measure() +{ + int del_index = 0; + for (QVector ::const_iterator i = _dist_del_btn_vec.begin(); + i != _dist_del_btn_vec.end(); i++) { + if ((*i)->isChecked()) { + _dist_layout->removeWidget(_dist_row_widget_vec.at(del_index)); + + delete _dist_del_btn_vec.at(del_index); + delete _dist_s_btn_vec.at(del_index); + delete _dist_e_btn_vec.at(del_index); + delete _dist_r_label_vec.at(del_index); + delete _dist_row_widget_vec.at(del_index); + + _dist_del_btn_vec.remove(del_index); + _dist_s_btn_vec.remove(del_index); + _dist_e_btn_vec.remove(del_index); + _dist_r_label_vec.remove(del_index); + _dist_row_widget_vec.remove(del_index); + + break; + } + del_index++; + } +} + +void MeasureDock::add_edge_measure() +{ + if (_edge_row_widget_vec.size() > Max_Measure_Limits) + return; + + QWidget *row_widget = new QWidget(_widget); + row_widget->setContentsMargins(0,0,0,0); + QHBoxLayout *row_layout = new QHBoxLayout(row_widget); + row_layout->setContentsMargins(0,0,0,0); + row_layout->setSpacing(0); + row_widget->setLayout(row_layout); + _edge_row_widget_vec.push_back(row_widget); + + QToolButton *del_btn = new QToolButton(row_widget); + del_btn->setIcon(QIcon::fromTheme("measure", + QIcon(":/icons/del.png"))); + del_btn->setCheckable(true); + QPushButton *s_btn = new QPushButton(tr(" "), row_widget); + s_btn->setObjectName("edge"); + QPushButton *e_btn = new QPushButton(tr(" "), row_widget); + e_btn->setObjectName("edge"); + QLabel *r_label = new QLabel(row_widget); + QLabel *g_label = new QLabel(tr("-"), row_widget); + g_label->setContentsMargins(0,0,0,0); + QLabel *a_label = new QLabel(tr("@"), row_widget); + a_label->setContentsMargins(0,0,0,0); + QComboBox *ch_cmb = create_probe_selector(row_widget); + _edge_del_btn_vec.push_back(del_btn); + _edge_s_btn_vec.push_back(s_btn); + _edge_e_btn_vec.push_back(e_btn); + _edge_ch_cmb_vec.push_back(ch_cmb); + _edge_r_label_vec.push_back(r_label); + + connect(del_btn, SIGNAL(clicked()), this, SLOT(del_edge_measure())); + connect(s_btn, SIGNAL(clicked()), this, SLOT(show_all_coursor())); + connect(e_btn, SIGNAL(clicked()), this, SLOT(show_all_coursor())); + connect(ch_cmb, SIGNAL(currentIndexChanged(int)), this, SLOT(update_edge())); + + row_layout->addWidget(del_btn); + row_layout->addSpacing(5); + row_layout->addWidget(s_btn); + row_layout->addWidget(g_label); + row_layout->addWidget(e_btn); + row_layout->addWidget(a_label); + row_layout->addWidget(ch_cmb); + row_layout->addSpacing(5); + row_layout->addWidget(r_label, 100); + + _edge_layout->addWidget(row_widget, _edge_row_widget_vec.size(), 0, 1, 7); + +} + +void MeasureDock::del_edge_measure() +{ + int del_index = 0; + for (QVector ::const_iterator i = _edge_del_btn_vec.begin(); + i != _edge_del_btn_vec.end(); i++) { + if ((*i)->isChecked()) { + _edge_layout->removeWidget(_edge_row_widget_vec.at(del_index)); + + delete _edge_del_btn_vec.at(del_index); + delete _edge_s_btn_vec.at(del_index); + delete _edge_e_btn_vec.at(del_index); + delete _edge_r_label_vec.at(del_index); + delete _edge_ch_cmb_vec.at(del_index); + delete _edge_row_widget_vec.at(del_index); + + _edge_del_btn_vec.remove(del_index); + _edge_s_btn_vec.remove(del_index); + _edge_e_btn_vec.remove(del_index); + _edge_r_label_vec.remove(del_index); + _edge_ch_cmb_vec.remove(del_index); + _edge_row_widget_vec.remove(del_index); + + break; + } + del_index++; + } +} + +void MeasureDock::show_all_coursor() +{ + if (_view.get_cursorList().empty()) { + dialogs::DSMessageBox msg(this); + msg.mBox()->setText(tr("Information")); + msg.mBox()->setInformativeText(tr("Please insert cursor before using cursor measure.")); + msg.mBox()->addButton(tr("Ok"), QMessageBox::AcceptRole); + msg.mBox()->setIcon(QMessageBox::Information); + msg.exec(); + + return; + } + + _sel_btn = qobject_cast(sender()); + + //dialogs::DSDialog cursor_dlg(_widget); + QDialog cursor_dlg(_widget); + cursor_dlg.setWindowFlags(Qt::FramelessWindowHint | Qt::Popup | Qt::WindowSystemMenuHint | + Qt::WindowMinimizeButtonHint | Qt::WindowMaximizeButtonHint); + int index = 0; + QHBoxLayout *hlayout; + QVBoxLayout *vlayout = new QVBoxLayout(&cursor_dlg); + for(std::list::iterator i = _view.get_cursorList().begin(); + i != _view.get_cursorList().end(); i++) { + QPushButton *cursor_btn = new QPushButton(QString::number(index+1), &cursor_dlg); + set_cursor_btn_color(cursor_btn); + if ((index % 4) == 0) { + hlayout = new QHBoxLayout(&cursor_dlg); + vlayout->addLayout(hlayout); + //cursor_dlg.layout()->addLayout(hlayout); + } + hlayout->addWidget(cursor_btn); + connect(cursor_btn, SIGNAL(clicked()), &cursor_dlg, SLOT(accept())); + connect(cursor_btn, SIGNAL(clicked()), this, SLOT(set_se_cursor())); + index++; + } + while((index++ % 4) != 0) + hlayout->addWidget(new QLabel(&cursor_dlg)); + + cursor_dlg.setLayout(vlayout); + QRect sel_btn_rect = _sel_btn->geometry(); + sel_btn_rect.moveTopLeft(_sel_btn->parentWidget()->mapToGlobal(sel_btn_rect.topLeft())); + cursor_dlg.setGeometry(sel_btn_rect.left(), sel_btn_rect.bottom()+10, + cursor_dlg.width(), cursor_dlg.height()); + cursor_dlg.exec(); +} + +void MeasureDock::set_se_cursor() +{ + QPushButton *sc = qobject_cast(sender()); + if (_sel_btn) + _sel_btn->setText(sc->text()); + + set_cursor_btn_color(_sel_btn); + + if (_sel_btn->objectName() == "dist") + update_dist(); + else if (_sel_btn->objectName() == "edge") + update_edge(); +} + +const view::Cursor* MeasureDock::find_cousor(int index) +{ + int cur_index = 1; + for(std::list::iterator i = _view.get_cursorList().begin(); + i != _view.get_cursorList().end(); i++) { + if (cur_index == index) { + return (*i); + } + } + + return NULL; +} + +void MeasureDock::update_dist() +{ + int dist_index = 0; + for (QVector::Iterator i = _dist_s_btn_vec.begin(); + i != _dist_s_btn_vec.end(); i++) { + bool start_ret, end_ret; + const unsigned int start = (*i)->text().toInt(&start_ret) - 1; + const unsigned int end = _dist_e_btn_vec[dist_index]->text().toInt(&end_ret) - 1; + + if (start_ret) { + if (start + 1 > _view.get_cursorList().size()) { + (*i)->setText(" "); + set_cursor_btn_color((*i)); + start_ret = false; + } + } + if (end_ret) { + if (end + 1 > _view.get_cursorList().size()) { + _dist_e_btn_vec[dist_index]->setText(" "); + set_cursor_btn_color(_dist_e_btn_vec[dist_index]); + end_ret = false; + } + } + + if (start_ret && end_ret) { + int64_t delta = _view.get_cursor_samples(start) - + _view.get_cursor_samples(end); + QString delta_text = _view.get_cm_delta(start, end) + + "/" + QString::number(delta); + if (delta < 0) + delta_text.replace('+', '-'); + _dist_r_label_vec[dist_index]->setText(delta_text); + } else { + _dist_r_label_vec[dist_index]->setText(" "); + } + + dist_index++; + } +} + +void MeasureDock::update_edge() +{ + int edge_index = 0; + for (QVector::Iterator i = _edge_s_btn_vec.begin(); + i != _edge_s_btn_vec.end(); i++) { + bool start_ret, end_ret; + const unsigned int start = (*i)->text().toInt(&start_ret) - 1; + const unsigned int end = _edge_e_btn_vec[edge_index]->text().toInt(&end_ret) - 1; + + if (start_ret) { + if (start + 1 > _view.get_cursorList().size()) { + (*i)->setText(" "); + set_cursor_btn_color((*i)); + start_ret = false; + } + } + if (end_ret) { + if (end + 1 > _view.get_cursorList().size()) { + _edge_e_btn_vec[edge_index]->setText(" "); + set_cursor_btn_color(_edge_e_btn_vec[edge_index]); + end_ret = false; + } + } + + bool mValid = false; + if (start_ret && end_ret) { + uint64_t rising_edges; + uint64_t falling_edges; + const std::vector< boost::shared_ptr > sigs(_session.get_signals()); + for(size_t i = 0; i < sigs.size(); i++) { + const boost::shared_ptr s(sigs[i]); + boost::shared_ptr logicSig; + assert(s); + if ((logicSig = dynamic_pointer_cast(s)) && + (logicSig->enabled()) && + (logicSig->get_index() == _edge_ch_cmb_vec[edge_index]->currentText().toInt())){ + if (logicSig->edges(_view.get_cursor_samples(end), _view.get_cursor_samples(start), rising_edges, falling_edges)) { + QString delta_text = QString::number(rising_edges) + "/" + + QString::number(falling_edges) + "/" + + QString::number(rising_edges + falling_edges); + _edge_r_label_vec[edge_index]->setText(delta_text); + mValid = true; + break; + } + } + } + } + + if (!mValid) + _edge_r_label_vec[edge_index]->setText("-/-/-"); + + edge_index++; + } +} + +void MeasureDock::set_cursor_btn_color(QPushButton *btn) +{ + bool ret; + const unsigned int start = btn->text().toInt(&ret) - 1; + QColor cursor_color = ret ? view::Ruler::CursorColor[start%8] : QColor("#302F2F"); + QString border_width = ret ? "0px" : "1px"; + QString normal = "{background-color:" + cursor_color.name() + + "; color:black" + "; border-width:" + border_width + ";}"; + QString hover = "{background-color:" + cursor_color.darker().name() + + "; color:black" + "; border-width:" + border_width + ";}"; + QString style = "QPushButton:hover" + hover + + "QPushButton" + normal; + btn->setStyleSheet(style); +} + +QComboBox* MeasureDock::create_probe_selector(QWidget *parent) +{ + QComboBox *selector = new QComboBox(parent); + update_probe_selector(selector); + return selector; +} + +void MeasureDock::update_probe_selector(QComboBox *selector) +{ + selector->clear(); + const std::vector< boost::shared_ptr > sigs(_session.get_signals()); + for(size_t i = 0; i < sigs.size(); i++) { + const boost::shared_ptr s(sigs[i]); + assert(s); + + if (dynamic_pointer_cast(s) && s->enabled()) + { + selector->addItem(QString::number(s->get_index())); + } + } +} + +void MeasureDock::del_cursor() +{ + int del_index = 0; + Cursor* cursor; + for (QVector ::const_iterator i = _cursor_del_btn_vec.begin(); + i != _cursor_del_btn_vec.end(); i++) { + if ((*i)->isChecked()) { + int cur_index = 0; + std::list::iterator ite = _view.get_cursorList().begin(); + while (cur_index++ != del_index) + ite++; + cursor = *ite; + break; + } + del_index++; + } + + _view.del_cursor(cursor); + if (_view.get_cursorList().empty()) + _view.show_cursors(false); + + cursor_update(); + _view.update(); +} + } // namespace dock } // namespace pv diff --git a/DSView/pv/dock/measuredock.h b/DSView/pv/dock/measuredock.h index bb941b0c..d049782d 100644 --- a/DSView/pv/dock/measuredock.h +++ b/DSView/pv/dock/measuredock.h @@ -50,6 +50,7 @@ namespace pv { class SigSession; namespace view { + class Cursor; class View; } @@ -59,21 +60,42 @@ class MeasureDock : public QScrollArea { Q_OBJECT +private: + static const int Max_Measure_Limits = 16; + public: MeasureDock(QWidget *parent, pv::view::View &view, SigSession &session); ~MeasureDock(); void paintEvent(QPaintEvent *); + void reload(); +private: + QComboBox* create_probe_selector(QWidget *parent); + void update_probe_selector(QComboBox *selector); + signals: private slots: - void delta_update(); void goto_cursor(); + void add_dist_measure(); + void del_dist_measure(); + void add_edge_measure(); + void del_edge_measure(); + void show_all_coursor(); + void set_se_cursor(); + const view::Cursor* find_cousor(int index); + void update_dist(); + void update_edge(); + void set_cursor_btn_color(QPushButton *btn); + void del_cursor(); + public slots: void cursor_update(); - void cursor_moved(); + void cursor_moving(); + void reCalc(); void measure_updated(); + void refresh(); private: SigSession &_session; @@ -88,24 +110,37 @@ private: QLabel *_freq_label; QLabel *_duty_label; + QGridLayout *_dist_layout; + QGroupBox *_dist_groupBox; + QToolButton *_dist_add_btn; + QVector _dist_row_widget_vec; + QVector _dist_del_btn_vec; + QVector _dist_s_btn_vec; + QVector _dist_e_btn_vec; + QVector _dist_r_label_vec; + + QGridLayout *_edge_layout; + QGroupBox *_edge_groupBox; + QToolButton *_edge_add_btn; + QVector _edge_row_widget_vec; + QVector _edge_del_btn_vec; + QVector _edge_s_btn_vec; + QVector _edge_e_btn_vec; + QVector _edge_ch_cmb_vec; + QVector _edge_r_label_vec; + + QPushButton *_sel_btn; + QGridLayout *_cursor_layout; QGroupBox *_cursor_groupBox; - QComboBox *_t1_comboBox; - QComboBox *_t2_comboBox; - QComboBox *_t3_comboBox; - QLabel *_delta_label_t1t2; - QLabel *_cnt_label_t1t2; - QLabel *_delta_label_t2t3; - QLabel *_cnt_label_t2t3; - QLabel *_delta_label_t1t3; - QLabel *_cnt_label_t1t3; - int _t1_last_index; - int _t2_last_index; - int _t3_last_index; - + QVector _cursor_del_btn_vec; QVector _cursor_pushButton_list; QVector _curpos_label_list; - QVector _space_label_list; + + QIcon _icon_add; + QIcon _icon_add_dis; + QIcon _icon_del; + QIcon _icon_del_dis; }; } // namespace dock diff --git a/DSView/pv/dock/protocoldock.cpp b/DSView/pv/dock/protocoldock.cpp index 7a32761b..0057c3e3 100644 --- a/DSView/pv/dock/protocoldock.cpp +++ b/DSView/pv/dock/protocoldock.cpp @@ -29,6 +29,7 @@ #include "../dialogs/protocollist.h" #include "../dialogs/protocolexp.h" #include "../dialogs/dsmessagebox.h" +#include "../view/view.h" #include #include @@ -52,12 +53,14 @@ namespace pv { namespace dock { -ProtocolDock::ProtocolDock(QWidget *parent, SigSession &session) : +ProtocolDock::ProtocolDock(QWidget *parent, view::View &view, SigSession &session) : QScrollArea(parent), _session(session), + _view(view), _cur_search_index(-1), _search_edited(false), - _searching(false) + _searching(false), + _add_silent(false) { _up_widget = new QWidget(this); @@ -125,11 +128,19 @@ ProtocolDock::ProtocolDock(QWidget *parent, SigSession &session) : connect(_dn_save_button, SIGNAL(clicked()), this, SLOT(export_table_view())); + _dn_nav_button = new QPushButton(_dn_widget); + _dn_nav_button->setFlat(true); + _dn_nav_button->setIcon(QIcon::fromTheme("protocol", + QIcon(":/icons/nav.png"))); + connect(_dn_nav_button, SIGNAL(clicked()), + this, SLOT(nav_table_view())); + QHBoxLayout *dn_title_layout = new QHBoxLayout(); dn_title_layout->addWidget(_dn_set_button, 0, Qt::AlignLeft); dn_title_layout->addWidget(_dn_save_button, 0, Qt::AlignLeft); dn_title_layout->addWidget(new QLabel(tr("Protocol List Viewer"), _dn_widget), 1, Qt::AlignLeft); - dn_title_layout->addStretch(1); + dn_title_layout->addWidget(_dn_nav_button, 0, Qt::AlignRight); + //dn_title_layout->addStretch(1); _table_view = new QTableView(_dn_widget); _table_view->setModel(_session.get_decoder_model()); @@ -237,7 +248,38 @@ int ProtocolDock::decoder_name_cmp(const void *a, const void *b) ((const srd_decoder*)b)->name); } +bool ProtocolDock::sel_protocol(QString id) +{ + QString name; + GSList *l = g_slist_sort(g_slist_copy( + (GSList*)srd_decoder_list()), decoder_name_cmp); + for(; l; l = l->next) + { + const srd_decoder *const d = (srd_decoder*)l->data; + assert(d); + + const bool have_probes = (d->channels || d->opt_channels) != 0; + if (true == have_probes && + QString::fromUtf8(d->id) == id) { + name = QString::fromUtf8(d->name); + break; + } + } + g_slist_free(l); + + _protocol_combobox->setCurrentText(name); + if (_protocol_combobox->currentText() == name) + return true; + else + return false; +} + void ProtocolDock::add_protocol() +{ + add_protocol(false); +} + +void ProtocolDock::add_protocol(bool silent) { if (_session.get_device()->dev_inst()->mode != LOGIC) { dialogs::DSMessageBox msg(this); @@ -249,7 +291,7 @@ void ProtocolDock::add_protocol() } else { srd_decoder *const decoder = (srd_decoder*)(_protocol_combobox->itemData(_protocol_combobox->currentIndex())).value(); - if (_session.add_decoder(decoder)) { + if (_session.add_decoder(decoder, silent)) { //std::list _sel_probes = dlg.get_sel_probes(); //QMap & _options = dlg.get_options(); //QMap _options_index = dlg.get_options_index(); @@ -442,6 +484,13 @@ void ProtocolDock::set_model() resize_table_view(_session.get_decoder_model()); _model_proxy.setSourceModel(_session.get_decoder_model()); search_done(); + + // clear mark_index of all DecoderStacks + const std::vector< boost::shared_ptr > decode_sigs( + _session.get_decode_signals()); + BOOST_FOREACH(boost::shared_ptr d, decode_sigs) { + d->decoder()->set_mark_index(-1); + } } void ProtocolDock::update_model() @@ -494,7 +543,13 @@ void ProtocolDock::item_clicked(const QModelIndex &index) if (decoder_stack) { pv::data::decode::Annotation ann; if (decoder_stack->list_annotation(ann, index.column(), index.row())) { - _session.show_region(ann.start_sample(), ann.end_sample()); + const std::vector< boost::shared_ptr > decode_sigs( + _session.get_decode_signals()); + BOOST_FOREACH(boost::shared_ptr d, decode_sigs) { + d->decoder()->set_mark_index(-1); + } + decoder_stack->set_mark_index((ann.start_sample()+ann.end_sample())/2); + _session.show_region(ann.start_sample(), ann.end_sample(), false); } } _table_view->resizeRowToContents(index.row()); @@ -558,6 +613,41 @@ void ProtocolDock::export_table_view() protocolexp_dlg->exec(); } +void ProtocolDock::nav_table_view() +{ + uint64_t row_index; + pv::data::DecoderModel *decoder_model = _session.get_decoder_model(); + boost::shared_ptr decoder_stack = decoder_model->getDecoderStack(); + if (decoder_stack) { + uint64_t offset = _view.offset() * (decoder_stack->samplerate() * _view.scale()); + std::map rows = decoder_stack->get_rows_lshow(); + int column = _model_proxy.filterKeyColumn(); + for (std::map::const_iterator i = rows.begin(); + i != rows.end(); i++) { + if ((*i).second && column-- == 0) { + row_index = decoder_stack->get_annotation_index((*i).first, offset); + break; + } + } + QModelIndex index = _model_proxy.mapToSource(_model_proxy.index(row_index, _model_proxy.filterKeyColumn())); + if(index.isValid()){ + _table_view->scrollTo(index); + _table_view->setCurrentIndex(index); + + pv::data::decode::Annotation ann; + decoder_stack->list_annotation(ann, index.column(), index.row()); + const std::vector< boost::shared_ptr > decode_sigs( + _session.get_decode_signals()); + BOOST_FOREACH(boost::shared_ptr d, decode_sigs) { + d->decoder()->set_mark_index(-1); + } + decoder_stack->set_mark_index((ann.start_sample()+ann.end_sample())/2); + _view.set_all_update(true); + _view.update(); + } + } +} + void ProtocolDock::search_pre() { search_update(); @@ -707,7 +797,8 @@ void ProtocolDock::search_update() QProgressDialog dlg(tr("Searching..."), tr("Cancel"),0,0,this,flags); dlg.setWindowModality(Qt::WindowModal); - dlg.setWindowFlags(Qt::Dialog | Qt::FramelessWindowHint); + dlg.setWindowFlags(Qt::Dialog | Qt::FramelessWindowHint | Qt::WindowSystemMenuHint | + Qt::WindowMinimizeButtonHint | Qt::WindowMaximizeButtonHint); dlg.setCancelButton(NULL); QFutureWatcher watcher; diff --git a/DSView/pv/dock/protocoldock.h b/DSView/pv/dock/protocoldock.h index 9a1616fd..1ccbbe34 100644 --- a/DSView/pv/dock/protocoldock.h +++ b/DSView/pv/dock/protocoldock.h @@ -52,6 +52,10 @@ namespace data { class DecoderModel; } +namespace view { +class View; +} + namespace dock { class ProtocolDock : public QScrollArea @@ -62,10 +66,12 @@ public: static const uint64_t ProgressRows = 100000; public: - ProtocolDock(QWidget *parent, SigSession &session); + ProtocolDock(QWidget *parent, view::View &view, SigSession &session); ~ProtocolDock(); void del_all_protocol(); + bool sel_protocol(QString name); + void add_protocol(bool silent); protected: void paintEvent(QPaintEvent *); @@ -82,6 +88,7 @@ private slots: void set_model(); void update_model(); void export_table_view(); + void nav_table_view(); void item_clicked(const QModelIndex &index); void column_resize(int index, int old_size, int new_size); void search_pre(); @@ -96,6 +103,7 @@ private: private: SigSession &_session; + view::View &_view; QSortFilterProxyModel _model_proxy; double _cur_search_index; QStringList _str_list; @@ -124,10 +132,13 @@ private: QPushButton *_dn_set_button; QPushButton *_dn_save_button; + QPushButton *_dn_nav_button; mutable boost::mutex _search_mutex; bool _search_edited; bool _searching; + + bool _add_silent; }; } // namespace dock diff --git a/DSView/pv/dock/searchdock.cpp b/DSView/pv/dock/searchdock.cpp index e523abaf..4f81f2ba 100644 --- a/DSView/pv/dock/searchdock.cpp +++ b/DSView/pv/dock/searchdock.cpp @@ -55,8 +55,6 @@ SearchDock::SearchDock(QWidget *parent, View &view, SigSession &session) : _session(session), _view(view) { - _pattern = "X X X X X X X X X X X X X X X X"; - connect(&_pre_button, SIGNAL(clicked()), this, SLOT(on_previous())); connect(&_nxt_button, SIGNAL(clicked()), @@ -113,14 +111,25 @@ void SearchDock::paintEvent(QPaintEvent *) void SearchDock::on_previous() { bool ret; - uint64_t last_pos; - uint8_t *data; - int unit_size; - uint64_t length; - QString value = _search_value->text(); - search_previous(value); + int64_t last_pos; + bool last_hit; + const boost::shared_ptr snapshot(_session.get_snapshot(SR_CHANNEL_LOGIC)); + assert(snapshot); + const boost::shared_ptr logic_snapshot = boost::dynamic_pointer_cast(snapshot); + if (!logic_snapshot || logic_snapshot->empty()) { + dialogs::DSMessageBox msg(this); + msg.mBox()->setText(tr("Search")); + msg.mBox()->setInformativeText(tr("No Sample data!")); + msg.mBox()->setStandardButtons(QMessageBox::Ok); + msg.mBox()->setIcon(QMessageBox::Warning); + msg.exec(); + return; + } + + const int64_t end = logic_snapshot->get_sample_count() - 1; last_pos = _view.get_search_pos(); + last_hit = _view.get_search_hit(); if (last_pos == 0) { dialogs::DSMessageBox msg(this); msg.mBox()->setText(tr("Search")); @@ -130,43 +139,34 @@ void SearchDock::on_previous() msg.exec(); return; } else { - data = (uint8_t*)_session.get_buf(unit_size, length); - if (data == NULL) { + QFuture future; + future = QtConcurrent::run([&]{ + last_pos -= last_hit; + ret = logic_snapshot->pattern_search(0, end, false, last_pos, _pattern); + }); + Qt::WindowFlags flags = Qt::CustomizeWindowHint; + QProgressDialog dlg(tr("Search Previous..."), + tr("Cancel"),0,0,this,flags); + dlg.setWindowModality(Qt::WindowModal); + dlg.setWindowFlags(Qt::Dialog | Qt::FramelessWindowHint | Qt::WindowSystemMenuHint | + Qt::WindowMinimizeButtonHint | Qt::WindowMaximizeButtonHint); + dlg.setCancelButton(NULL); + + QFutureWatcher watcher; + connect(&watcher,SIGNAL(finished()),&dlg,SLOT(cancel())); + watcher.setFuture(future); + dlg.exec(); + + if (!ret) { dialogs::DSMessageBox msg(this); msg.mBox()->setText(tr("Search")); - msg.mBox()->setInformativeText(tr("No Sample data!")); + msg.mBox()->setInformativeText(tr("Pattern not found!")); msg.mBox()->setStandardButtons(QMessageBox::Ok); msg.mBox()->setIcon(QMessageBox::Warning); msg.exec(); return; } else { - QFuture future; - future = QtConcurrent::run([&]{ - ret = search_value(data, unit_size, length, last_pos, 1, value); - }); - Qt::WindowFlags flags = Qt::CustomizeWindowHint; - QProgressDialog dlg(tr("Search Previous..."), - tr("Cancel"),0,0,this,flags); - dlg.setWindowModality(Qt::WindowModal); - dlg.setWindowFlags(Qt::Dialog | Qt::FramelessWindowHint); - dlg.setCancelButton(NULL); - - QFutureWatcher watcher; - connect(&watcher,SIGNAL(finished()),&dlg,SLOT(cancel())); - watcher.setFuture(future); - dlg.exec(); - - if (!ret) { - dialogs::DSMessageBox msg(this); - msg.mBox()->setText(tr("Search")); - msg.mBox()->setInformativeText(tr("Pattern ") + value + tr(" not found!")); - msg.mBox()->setStandardButtons(QMessageBox::Ok); - msg.mBox()->setIcon(QMessageBox::Warning); - msg.exec(); - return; - } else { - _view.set_search_pos(last_pos); - } + _view.set_search_pos(last_pos, true); } } } @@ -174,15 +174,24 @@ void SearchDock::on_previous() void SearchDock::on_next() { bool ret; - uint64_t last_pos; - int unit_size; - uint64_t length; - uint8_t *data = (uint8_t*)_session.get_buf(unit_size, length); - QString value = _search_value->text(); - search_previous(value); + int64_t last_pos; + const boost::shared_ptr snapshot(_session.get_snapshot(SR_CHANNEL_LOGIC)); + assert(snapshot); + const boost::shared_ptr logic_snapshot = boost::dynamic_pointer_cast(snapshot); - last_pos = _view.get_search_pos(); - if (last_pos == length - 1) { + if (!logic_snapshot || logic_snapshot->empty()) { + dialogs::DSMessageBox msg(this); + msg.mBox()->setText(tr("Search")); + msg.mBox()->setInformativeText(tr("No Sample data!")); + msg.mBox()->setStandardButtons(QMessageBox::Ok); + msg.mBox()->setIcon(QMessageBox::Warning); + msg.exec(); + return; + } + + const int64_t end = logic_snapshot->get_sample_count() - 1; + last_pos = _view.get_search_pos() + _view.get_search_hit(); + if (last_pos >= end) { dialogs::DSMessageBox msg(this); msg.mBox()->setText(tr("Search")); msg.mBox()->setInformativeText(tr("Search cursor at the end position!")); @@ -191,180 +200,58 @@ void SearchDock::on_next() msg.exec(); return; } else { - if (data == NULL) { + QFuture future; + future = QtConcurrent::run([&]{ + ret = logic_snapshot->pattern_search(0, end, true, last_pos, _pattern); + }); + Qt::WindowFlags flags = Qt::CustomizeWindowHint; + QProgressDialog dlg(tr("Search Next..."), + tr("Cancel"),0,0,this,flags); + dlg.setWindowModality(Qt::WindowModal); + dlg.setWindowFlags(Qt::Dialog | Qt::FramelessWindowHint | Qt::WindowSystemMenuHint | + Qt::WindowMinimizeButtonHint | Qt::WindowMaximizeButtonHint); + dlg.setCancelButton(NULL); + + QFutureWatcher watcher; + connect(&watcher,SIGNAL(finished()),&dlg,SLOT(cancel())); + watcher.setFuture(future); + dlg.exec(); + + if (!ret) { dialogs::DSMessageBox msg(this); msg.mBox()->setText(tr("Search")); - msg.mBox()->setInformativeText(tr("No Sample data!")); + msg.mBox()->setInformativeText(tr("Pattern not found!")); msg.mBox()->setStandardButtons(QMessageBox::Ok); msg.mBox()->setIcon(QMessageBox::Warning); msg.exec(); return; } else { - QFuture future; - future = QtConcurrent::run([&]{ - ret = search_value(data, unit_size, length, last_pos, 0, value); - }); - Qt::WindowFlags flags = Qt::CustomizeWindowHint; - QProgressDialog dlg(tr("Search Next..."), - tr("Cancel"),0,0,this,flags); - dlg.setWindowModality(Qt::WindowModal); - dlg.setWindowFlags(Qt::Dialog | Qt::FramelessWindowHint); - dlg.setCancelButton(NULL); - - QFutureWatcher watcher; - connect(&watcher,SIGNAL(finished()),&dlg,SLOT(cancel())); - watcher.setFuture(future); - dlg.exec(); - - if (!ret) { - dialogs::DSMessageBox msg(this); - msg.mBox()->setText(tr("Search")); - msg.mBox()->setInformativeText(tr("Pattern ") + value + tr(" not found!")); - msg.mBox()->setStandardButtons(QMessageBox::Ok); - msg.mBox()->setIcon(QMessageBox::Warning); - msg.exec(); - return; - } else { - _view.set_search_pos(last_pos); - } + _view.set_search_pos(last_pos, true); } } } void SearchDock::on_set() { - dialogs::Search dlg(this, _session.get_device(), _pattern); + dialogs::Search dlg(this, _session, _pattern); if (dlg.exec()) { _pattern = dlg.get_pattern(); - _pattern.remove(QChar(' '), Qt::CaseInsensitive); - _pattern = _pattern.toUpper(); - _search_value->setText(_pattern); - QFontMetrics fm = this->fontMetrics(); - _search_value->setFixedWidth(fm.width(_pattern)+_search_button->width()+20); - } -} - -bool SearchDock::search_value(const uint8_t *data, int unit_size, uint64_t length, uint64_t& pos, bool left, QString value) -{ - QByteArray pattern = value.toUtf8(); - int i = 0; - uint64_t match_pos = left ? pos - 1 : pos + 1; - bool part_match = false; - int match_bits = unit_size * 8 - 1; - bool unmatch = false; - - while(i <= match_bits) { - unmatch = false; - uint64_t pattern_mask = 1ULL << i; - - if (pattern[match_bits - i] == 'X') { - part_match = true; - } else if (pattern[match_bits - i] == '0') { - //while((match_pos >= 0 && left) || (match_pos < length && !left)) { - while(left || (match_pos < length && !left)) { - if (0 == ((*(uint64_t *)(data + match_pos * unit_size) & pattern_mask) != 0)) { - part_match = true; - break; - } else if ((match_pos == 0 && left) || (match_pos == length - 1 && !left)) { - unmatch = true; - part_match = false; - break; - } else if (part_match) { - unmatch = true; - match_pos = left ? match_pos - 1 : match_pos + 1; - i = 0; - break; - } else if (!part_match) { - match_pos = left ? match_pos - 1 : match_pos + 1; - } - } - } else if (pattern[match_bits - i] == '1') { - //while((match_pos >= 0 && left) || (match_pos < length && !left)) { - while(left || (match_pos < length && !left)) { - if (1 == ((*(uint64_t *)(data + match_pos * unit_size) & pattern_mask) != 0)) { - part_match = true; - break; - } else if ((match_pos == 0 && left) || (match_pos == length - 1 && !left)) { - unmatch = true; - part_match = false; - break; - } else if (part_match) { - unmatch = true; - match_pos = left ? match_pos - 1 : match_pos + 1; - i = 0; - break; - } else if (!part_match) { - match_pos = left ? match_pos - 1 : match_pos + 1; - } - } - }else if (pattern[match_bits - i] == 'R') { - while((match_pos > 0 && left) || (match_pos < length && !left)) { - if (1 == ((*(uint64_t *)(data + match_pos * unit_size) & pattern_mask) != 0) && - 0 == ((*(uint64_t *)(data + (match_pos - 1) * unit_size) & pattern_mask) != 0)) { - part_match = true; - break; - } else if ((match_pos == 1 && left) || (match_pos == length - 1 && !left)) { - unmatch = true; - part_match = false; - break; - } else if (part_match) { - unmatch = true; - match_pos = left ? match_pos - 1 : match_pos + 1; - i = 0; - break; - } else if (!part_match) { - match_pos = left ? match_pos - 1 : match_pos + 1; - } - } - } else if (pattern[match_bits - i] == 'F') { - while((match_pos > 0 && left) || (match_pos < length && !left)) { - if (0 == ((*(uint64_t *)(data + match_pos * unit_size) & pattern_mask) != 0) && - 1 == ((*(uint64_t *)(data + (match_pos - 1) * unit_size) & pattern_mask) != 0)) { - part_match = true; - break; - } else if ((match_pos == 1 && left) || (match_pos == length - 1 && !left)) { - unmatch = true; - part_match = false; - break; - } else if (part_match) { - unmatch = true; - match_pos = left ? match_pos - 1 : match_pos + 1; - i = 0; - break; - } else if (!part_match) { - match_pos = left ? match_pos - 1 : match_pos + 1; - } - } - } else if (pattern[match_bits - i] == 'C') { - while((match_pos > 0 && left) || (match_pos < length && !left)) { - if (((*(uint64_t *)(data + match_pos * unit_size) & pattern_mask) != 0) != - ((*(uint64_t *)(data + (match_pos - 1) * unit_size) & pattern_mask) != 0)) { - part_match = true; - break; - } else if ((match_pos == 1 && left) || (match_pos == length - 1 && !left)) { - unmatch = true; - part_match = false; - break; - } else if (part_match) { - unmatch = true; - match_pos = left ? match_pos - 1 : match_pos + 1; - i = 0; - break; - } else if (!part_match) { - match_pos = left ? match_pos - 1 : match_pos + 1; - } - } + QString search_label; + for (auto& iter:_pattern) { + iter.second.remove(QChar(' '), Qt::CaseInsensitive); + iter.second = iter.second.toUpper(); + search_label.push_back(iter.second); +// if (iter.second != "XXXXXXXXXXXXXXXX") { +// search_label.push_back(QString::number(iter.first)); +// search_label.push_back("/"); +// } } - if (unmatch && !part_match) - break; - else if ((!unmatch && part_match) || !part_match) - i++; + _search_value->setText(search_label); + QFontMetrics fm = this->fontMetrics(); + _search_value->setFixedWidth(fm.width(search_label)+_search_button->width()+20); } - - pos = match_pos; - return !unmatch; } } // namespace dock diff --git a/DSView/pv/dock/searchdock.h b/DSView/pv/dock/searchdock.h index e541cd6b..d99c9b17 100644 --- a/DSView/pv/dock/searchdock.h +++ b/DSView/pv/dock/searchdock.h @@ -70,22 +70,15 @@ public: void paintEvent(QPaintEvent *); -signals: - void search_previous(QString); - void search_next(QString); - public slots: void on_previous(); void on_next(); void on_set(); -private: - bool search_value(const uint8_t* data, int unit_size, uint64_t length, - uint64_t& pos, bool left, QString value); private: SigSession &_session; view::View &_view; - QString _pattern; + std::map _pattern; QPushButton _pre_button; QPushButton _nxt_button; diff --git a/DSView/pv/dock/triggerdock.cpp b/DSView/pv/dock/triggerdock.cpp index 0256df0c..cf5c654c 100644 --- a/DSView/pv/dock/triggerdock.cpp +++ b/DSView/pv/dock/triggerdock.cpp @@ -57,10 +57,10 @@ TriggerDock::TriggerDock(QWidget *parent, SigSession &session) : position_label = new QLabel(tr("Trigger Position: "), _widget); position_spinBox = new QSpinBox(_widget); - position_spinBox->setRange(MinTrigPosition, 99); + position_spinBox->setRange(MinTrigPosition, DS_MAX_TRIG_PERCENT); position_spinBox->setButtonSymbols(QAbstractSpinBox::NoButtons); position_slider = new QSlider(Qt::Horizontal, _widget); - position_slider->setRange(MinTrigPosition, 99); + position_slider->setRange(MinTrigPosition, DS_MAX_TRIG_PERCENT); connect(position_slider, SIGNAL(valueChanged(int)), position_spinBox, SLOT(setValue(int))); connect(position_spinBox, SIGNAL(valueChanged(int)), position_slider, SLOT(setValue(int))); @@ -93,10 +93,10 @@ TriggerDock::TriggerDock(QWidget *parent, SigSession &session) : _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 *_count0_spinBox = new QSpinBox(_widget); - _count0_spinBox->setRange(1, INT32_MAX); - _count0_spinBox->setButtonSymbols(QAbstractSpinBox::NoButtons); - _count0_spinBox_list.push_back(_count0_spinBox); + 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("!=")); @@ -109,33 +109,38 @@ TriggerDock::TriggerDock(QWidget *parent, SigSession &session) : _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); - QSpinBox *_count1_spinBox = new QSpinBox(_widget); - _count1_spinBox->setRange(1, INT32_MAX); - _count1_spinBox->setButtonSymbols(QAbstractSpinBox::NoButtons); - _count1_spinBox_list.push_back(_count1_spinBox); 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("Inv", _widget); - QLabel *count_exp_label = new QLabel("Counter", _widget); + QLabel *inv_exp_label = new QLabel(tr("Inv"), _widget); + QLabel *count_exp_label = new QLabel(tr("Counter"), _widget); 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(count_exp_label, 1, 2); stage_glayout->addWidget(_value0_lineEdit, 2, 0); stage_glayout->addWidget(_inv0_comboBox, 2, 1); - stage_glayout->addWidget(_count0_spinBox, 2, 2); - stage_glayout->addWidget(_logic_comboBox, 2, 3); + stage_glayout->addWidget(_logic_comboBox, 2, 2); stage_glayout->addWidget(_value1_lineEdit, 3, 0); stage_glayout->addWidget(_inv1_comboBox, 3, 1); - stage_glayout->addWidget(_count1_spinBox, 3, 2); + + stage_glayout->addWidget(new QLabel(_widget), 4, 0); + + stage_glayout->addWidget(new QLabel(tr("Contiguous")), 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); stage_layout->addWidget(new QLabel(tr("X: Don't care\n0: Low level\n1: High level\nR: Rising edge\nF: Falling edge\nC: Rising/Falling edge"))); @@ -189,9 +194,9 @@ TriggerDock::TriggerDock(QWidget *parent, SigSession &session) : _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_vcnt_spinBox = new QSpinBox(_widget); - _serial_vcnt_spinBox->setRange(1, INT32_MAX); - _serial_vcnt_spinBox->setButtonSymbols(QAbstractSpinBox::NoButtons); + _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); @@ -211,11 +216,11 @@ TriggerDock::TriggerDock(QWidget *parent, SigSession &session) : serial_glayout->addWidget(new QLabel(_widget), 5, 0, 1, 5); serial_glayout->addWidget(_serial_data_lable, 6, 0); serial_glayout->addWidget(_serial_data_comboBox, 6, 1); - serial_glayout->addWidget(new QLabel(tr("counter"), _widget), 6, 4); - serial_glayout->addWidget(_serial_value_lable, 7, 0); - serial_glayout->addWidget(_serial_value_lineEdit, 7, 1, 1, 3); - serial_glayout->addWidget(_serial_vcnt_spinBox, 7, 4); - serial_glayout->addWidget(new QLabel(_widget), 7, 5); + serial_glayout->addWidget(new QLabel(tr("Data Bits"), _widget), 7, 0); + serial_glayout->addWidget(_serial_bits_comboBox, 7, 1); + serial_glayout->addWidget(_serial_value_lable, 8, 0); + serial_glayout->addWidget(_serial_value_lineEdit, 8, 1, 1, 3); + serial_layout->addLayout(serial_glayout); serial_layout->addSpacing(20); serial_layout->addWidget(new QLabel(tr("X: Don't care\n0: Low level\n1: High level\nR: Rising edge\nF: Falling edge\nC: Rising/Falling edge"))); @@ -343,27 +348,18 @@ void TriggerDock::value_changed() sc->setText(sc->text().toUpper()); } -void TriggerDock::device_change() +void TriggerDock::device_updated() { - uint64_t max_hd_depth; + uint64_t hw_depth; bool stream = false; uint8_t maxRange; uint64_t sample_limits; - GVariant *gvar = _session.get_device()->get_config(NULL, NULL, SR_CONF_MAX_LOGIC_SAMPLELIMITS); + GVariant *gvar = _session.get_device()->get_config(NULL, NULL, SR_CONF_HW_DEPTH); if (gvar != NULL) { - max_hd_depth = g_variant_get_uint64(gvar); + hw_depth = g_variant_get_uint64(gvar); g_variant_unref(gvar); if (_session.get_device()->dev_inst()->mode == LOGIC) { - sample_limits = _session.get_device()->get_sample_limit(); - if (max_hd_depth >= sample_limits) - maxRange = 99; - else - maxRange = max_hd_depth*70 / sample_limits; - position_spinBox->setRange(MinTrigPosition, maxRange); - position_slider->setRange(MinTrigPosition, maxRange); - - gvar = _session.get_device()->get_config(NULL, NULL, SR_CONF_STREAM); if (gvar != NULL) { @@ -371,6 +367,16 @@ void TriggerDock::device_change() g_variant_unref(gvar); } + sample_limits = _session.get_device()->get_sample_limit(); + if (stream) + maxRange = 1; + else if (hw_depth >= sample_limits) + maxRange = DS_MAX_TRIG_PERCENT; + else + maxRange = ceil(hw_depth * DS_MAX_TRIG_PERCENT / sample_limits); + position_spinBox->setRange(MinTrigPosition, maxRange); + position_slider->setRange(MinTrigPosition, maxRange); + if (_session.get_device()->name().contains("virtual") || stream) { simple_radioButton->setChecked(true); @@ -397,7 +403,7 @@ bool TriggerDock::commit_trigger() ds_trigger_set_mode(SERIAL_TRIGGER); // trigger stage update - ds_trigger_set_stage(stages_comboBox->currentText().toInt()); + ds_trigger_set_stage(stages_comboBox->currentText().toInt() - 1); int i; // trigger value update @@ -410,36 +416,36 @@ bool TriggerDock::commit_trigger() } else if(_adv_tabWidget->currentIndex() == 1){ ds_trigger_stage_set_value(0, TriggerProbes, _serial_start_lineEdit->text().toLocal8Bit().data(), - _value1_lineEdit_list.at(0)->text().toLocal8Bit().data()); + _serial_stop_lineEdit->text().toLocal8Bit().data()); ds_trigger_stage_set_value(1, TriggerProbes, - _serial_stop_lineEdit->text().toLocal8Bit().data(), - _value1_lineEdit_list.at(1)->text().toLocal8Bit().data()); - ds_trigger_stage_set_value(2, TriggerProbes, _serial_edge_lineEdit->text().toLocal8Bit().data(), - _value1_lineEdit_list.at(2)->text().toLocal8Bit().data()); + _value1_lineEdit_list.at(1)->text().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] = '1'; - else if (i%2 == 0) channel[i] = '0'; + else if (i%2 == 0) + channel[i] = 'X'; else channel[i] = ' '; } - ds_trigger_stage_set_value(3, TriggerProbes, + ds_trigger_stage_set_value(2, TriggerProbes, channel, - _value1_lineEdit_list.at(3)->text().toLocal8Bit().data()); - ds_trigger_stage_set_value(4, TriggerProbes, + _value1_lineEdit_list.at(2)->text().toLocal8Bit().data()); + ds_trigger_stage_set_value(STriggerDataStage, TriggerProbes, _serial_value_lineEdit->text().toLocal8Bit().data(), - _value1_lineEdit_list.at(4)->text().toLocal8Bit().data()); + _value1_lineEdit_list.at(3)->text().toLocal8Bit().data()); } // trigger logic update for (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, - _logic_comboBox_list.at(i)->currentIndex()); + logic); } // trigger inv update @@ -453,12 +459,15 @@ bool TriggerDock::commit_trigger() if (_adv_tabWidget->currentIndex() == 0) { for (i = 0; i < stages_comboBox->currentText().toInt(); i++) { ds_trigger_stage_set_count(i, TriggerProbes, - _count0_spinBox_list.at(i)->value() - 1, - _count1_spinBox_list.at(i)->value() - 1); + _count_spinBox_list.at(i)->value(), + 0); } } else if(_adv_tabWidget->currentIndex() == 1){ - ds_trigger_stage_set_count(4, TriggerProbes, - _serial_vcnt_spinBox->value() - 1, + ds_trigger_stage_set_count(1, TriggerProbes, + 1, + 0); + ds_trigger_stage_set_count(3, TriggerProbes, + _serial_bits_comboBox->currentText().toInt() - 1, 0); } return 1; @@ -475,34 +484,37 @@ void TriggerDock::init() QJsonObject TriggerDock::get_session() { QJsonObject trigSes; - trigSes["triggerMode"] = adv_radioButton->isChecked() ? 1 : 0; + trigSes["advTriggerMode"] = adv_radioButton->isChecked(); trigSes["triggerPos"] = position_slider->value(); trigSes["triggerStages"] = stages_comboBox->currentIndex(); - trigSes["triggerSerial"] = _adv_tabWidget->currentIndex(); + trigSes["triggerTab"] = _adv_tabWidget->currentIndex(); for (int i = 0; i < stages_comboBox->count(); i++) { - QString value0_str = "triggerValue0" + QString::number(i); - QString inv0_str = "triggerInv0" + QString::number(i); - QString count0_str = "triggerCount0" + QString::number(i); - QString value1_str = "triggerValue1" + QString::number(i); - QString inv1_str = "triggerInv1" + QString::number(i); - QString count1_str = "triggerCount1" + QString::number(i); - QString logic_str = "triggerLogic" + QString::number(i); + QString value0_str = "stageTriggerValue0" + QString::number(i); + QString inv0_str = "stageTriggerInv0" + QString::number(i); + QString value1_str = "stageTriggerValue1" + QString::number(i); + QString inv1_str = "stageTriggerInv1" + QString::number(i); + + QString logic_str = "stageTriggerLogic" + QString::number(i); + QString count_str = "stageTriggerCount" + QString::number(i); + QString conti_str = "stageTriggerContiguous" + QString::number(i); + trigSes[value0_str] = _value0_lineEdit_list.at(i)->text(); trigSes[value1_str] = _value1_lineEdit_list.at(i)->text(); trigSes[inv0_str] = _inv0_comboBox_list.at(i)->currentIndex(); trigSes[inv1_str] = _inv1_comboBox_list.at(i)->currentIndex(); - trigSes[count0_str] = _count0_spinBox_list.at(i)->value(); - trigSes[count1_str] = _count1_spinBox_list.at(i)->value(); + 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(); } - trigSes["triggerStart"] = _serial_start_lineEdit->text(); - trigSes["triggerStop"] = _serial_stop_lineEdit->text(); - trigSes["triggerClock"] = _serial_edge_lineEdit->text(); - trigSes["triggerChannel"] = _serial_data_comboBox->currentIndex(); - trigSes["triggerData"] = _serial_value_lineEdit->text(); - trigSes["triggerVcnt"] = _serial_vcnt_spinBox->value(); + trigSes["serialTriggerStart"] = _serial_start_lineEdit->text(); + trigSes["serialTriggerStop"] = _serial_stop_lineEdit->text(); + trigSes["serialTriggerClock"] = _serial_edge_lineEdit->text(); + trigSes["serialTriggerChannel"] = _serial_data_comboBox->currentIndex(); + trigSes["serialTriggerData"] = _serial_value_lineEdit->text(); + trigSes["serialTriggerBits"] = _serial_bits_comboBox->currentIndex(); return trigSes; } @@ -511,35 +523,38 @@ void TriggerDock::set_session(QJsonObject ses) { position_slider->setValue(ses["triggerPos"].toDouble()); stages_comboBox->setCurrentIndex(ses["triggerStages"].toDouble()); - _adv_tabWidget->setCurrentIndex(ses["triggerSerial"].toDouble()); - if (ses["triggerMode"].toDouble() == 0) - simple_radioButton->click(); - else + _adv_tabWidget->setCurrentIndex(ses["triggerTab"].toDouble()); + if (ses["advTriggerMode"].toBool()) adv_radioButton->click(); + else + simple_radioButton->click(); for (int i = 0; i < stages_comboBox->count(); i++) { - QString value0_str = "triggerValue0" + QString::number(i); - QString inv0_str = "triggerInv0" + QString::number(i); - QString count0_str = "triggerCount0" + QString::number(i); - QString value1_str = "triggerValue1" + QString::number(i); - QString inv1_str = "triggerInv1" + QString::number(i); - QString count1_str = "triggerCount1" + QString::number(i); - QString logic_str = "triggerLogic" + QString::number(i); + QString value0_str = "stageTriggerValue0" + QString::number(i); + QString inv0_str = "stageTriggerInv0" + QString::number(i); + QString value1_str = "stageTriggerValue1" + QString::number(i); + QString inv1_str = "stageTriggerInv1" + QString::number(i); + + QString logic_str = "stageTriggerLogic" + QString::number(i); + QString count_str = "stageTriggerCount" + QString::number(i); + QString conti_str = "stageTriggerContiguous" + QString::number(i); + _value0_lineEdit_list.at(i)->setText(ses[value0_str].toString()); _value1_lineEdit_list.at(i)->setText(ses[value1_str].toString()); _inv0_comboBox_list.at(i)->setCurrentIndex(ses[inv0_str].toDouble()); _inv1_comboBox_list.at(i)->setCurrentIndex(ses[inv1_str].toDouble()); - _count0_spinBox_list.at(i)->setValue(ses[count0_str].toDouble()); - _count1_spinBox_list.at(i)->setValue(ses[count1_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()); } - _serial_start_lineEdit->setText(ses["triggerStart"].toString()); - _serial_stop_lineEdit->setText(ses["triggerStop"].toString()); - _serial_edge_lineEdit->setText(ses["triggerClock"].toString()); - _serial_data_comboBox->setCurrentIndex(ses["triggerChannel"].toDouble()); - _serial_value_lineEdit->setText(ses["triggerData"].toString()); - _serial_vcnt_spinBox->setValue(ses["triggerVcnt"].toDouble()); + _serial_start_lineEdit->setText(ses["serialTriggerStart"].toString()); + _serial_stop_lineEdit->setText(ses["serialTriggerStop"].toString()); + _serial_edge_lineEdit->setText(ses["serialTriggerClock"].toString()); + _serial_data_comboBox->setCurrentIndex(ses["serialTriggerChannel"].toDouble()); + _serial_value_lineEdit->setText(ses["serialTriggerData"].toString()); + _serial_bits_comboBox->setCurrentIndex(ses["serialTriggerBits"].toDouble()); } } // namespace dock diff --git a/DSView/pv/dock/triggerdock.h b/DSView/pv/dock/triggerdock.h index 6533b03e..9c88d3b4 100644 --- a/DSView/pv/dock/triggerdock.h +++ b/DSView/pv/dock/triggerdock.h @@ -32,6 +32,7 @@ #include #include #include +#include #include #include @@ -84,7 +85,7 @@ public slots: void value_changed(); - void device_change(); + void device_updated(); private: @@ -109,11 +110,11 @@ private: QVector _mu_label_list; QVector _logic_comboBox_list; QVector _value0_lineEdit_list; - QVector _count0_spinBox_list; + QVector _count_spinBox_list; QVector _inv0_comboBox_list; QVector _value1_lineEdit_list; - QVector _count1_spinBox_list; QVector _inv1_comboBox_list; + QVector _contiguous_checkbox_list; QTabWidget *_adv_tabWidget; QGroupBox *_serial_groupBox; @@ -128,7 +129,7 @@ private: QLabel *_serial_value_lable; QLineEdit *_serial_value_lineEdit; QLabel *_serial_vcnt_lable; - QSpinBox *_serial_vcnt_spinBox; + QComboBox *_serial_bits_comboBox; }; } // namespace dock diff --git a/DSView/pv/mainframe.cpp b/DSView/pv/mainframe.cpp index 777119eb..d5b44270 100644 --- a/DSView/pv/mainframe.cpp +++ b/DSView/pv/mainframe.cpp @@ -46,7 +46,8 @@ MainFrame::MainFrame(DeviceManager &device_manager, setAttribute(Qt::WA_TranslucentBackground); // Make this a borderless window which can't // be resized or moved via the window system - setWindowFlags(Qt::FramelessWindowHint); + setWindowFlags(Qt::FramelessWindowHint | Qt::WindowSystemMenuHint | + Qt::WindowMinimizeButtonHint | Qt::WindowMaximizeButtonHint); setMinimumHeight(680); setMinimumWidth(800); //resize(1024, 768); @@ -58,6 +59,7 @@ MainFrame::MainFrame(DeviceManager &device_manager, setWindowIcon(icon); _moving = false; + _draging = false; _startPos = None; _freezing = false; _minimized = false; @@ -118,24 +120,24 @@ MainFrame::MainFrame(DeviceManager &device_manager, _layout->addWidget(_bottom_right, 2, 2); connect(&_timer, SIGNAL(timeout()), this, SLOT(unfreezing())); - readSettings(); + connect(_mainWindow, SIGNAL(prgRate(int)), this, SLOT(setTaskbarProgress(int))); + //readSettings(); } void MainFrame::changeEvent(QEvent* event) { QFrame::changeEvent(event); - QWindowStateChangeEvent* win_event = static_cast< QWindowStateChangeEvent* >(event); - if(win_event->type() == QEvent::WindowStateChange) { - if (win_event->oldState() & Qt::WindowMinimized) { - if (_minimized) { - readSettings(); - _minimized = false; - } + QWindowStateChangeEvent* win_event = static_cast< QWindowStateChangeEvent* >(event); + if(win_event->type() == QEvent::WindowStateChange) { + if (win_event->oldState() & Qt::WindowMinimized) { + if (_minimized) { + readSettings(); + _minimized = false; } } + } } - void MainFrame::resizeEvent(QResizeEvent *event) { QFrame::resizeEvent(event); @@ -346,6 +348,7 @@ void MainFrame::writeSettings() QSettings settings; settings.beginGroup("MainFrame"); + settings.setValue("isMax", isMaximized()); settings.setValue("size", size()); settings.setValue("pos", pos() + QPoint(geometry().left() - frameGeometry().left(), frameGeometry().right() - geometry().right())); @@ -357,13 +360,28 @@ void MainFrame::readSettings() QSettings settings; QDesktopWidget* desktopWidget = QApplication::desktop(); QRect deskRect = desktopWidget->availableGeometry(); + QPoint default_upleft = QPoint((deskRect.width() - minWidth)/2, (deskRect.height() - minHeight)/2); + QSize default_size = QSize(minWidth, minHeight); settings.beginGroup("MainFrame"); - QSize size = settings.value("size", QSize(minWidth, minHeight)).toSize(); - QPoint pos = settings.value("pos", QPoint((deskRect.width() - minWidth)/2, (deskRect.height() - minHeight)/2)).toPoint(); + bool isMax = settings.value("isMax", false).toBool(); + QSize size = settings.value("size", default_size).toSize(); + QPoint pos = settings.value("pos", default_upleft).toPoint(); settings.endGroup(); - if (size == deskRect.size()) { + // check the restored position is vavlid or not + int i = 0; + for (; i < desktopWidget->screenCount(); i++) { + deskRect = desktopWidget->availableGeometry(i); + if (deskRect.contains(pos)) + break; + } + if (i >= desktopWidget->screenCount()) + pos = default_upleft; + + if (isMax) { + resize(default_size); + move(default_upleft); _titleBar->showMaxRestore(); } else { resize(size); diff --git a/DSView/pv/mainframe.h b/DSView/pv/mainframe.h index 65cab5a8..5d54ee58 100644 --- a/DSView/pv/mainframe.h +++ b/DSView/pv/mainframe.h @@ -64,7 +64,7 @@ public: MainFrame(DeviceManager &device_manager, const char *open_file_name = NULL); - void showMaxRestore(); + void readSettings(); protected: void changeEvent(QEvent* event); @@ -83,7 +83,6 @@ private: void show_border(); void writeSettings(); - void readSettings(); private: toolbars::TitleBar *_titleBar; diff --git a/DSView/pv/mainwindow.cpp b/DSView/pv/mainwindow.cpp index 4d4ba569..eac60cb2 100644 --- a/DSView/pv/mainwindow.cpp +++ b/DSView/pv/mainwindow.cpp @@ -106,9 +106,6 @@ MainWindow::MainWindow(DeviceManager &device_manager, Qt::QueuedConnection, Q_ARG(QString, s)); } - test_timer_linked = false; - test_timer.stop(); - test_timer.setSingleShot(true); } void MainWindow::setup_ui() @@ -140,8 +137,10 @@ void MainWindow::setup_ui() SLOT(on_search(bool))); connect(_file_bar, SIGNAL(load_file(QString)), this, SLOT(load_file(QString))); - connect(_file_bar, SIGNAL(save()), this, + connect(_file_bar, SIGNAL(on_save()), this, SLOT(on_save())); + connect(_file_bar, SIGNAL(on_export()), this, + SLOT(on_export())); connect(_file_bar, SIGNAL(on_screenShot()), this, SLOT(on_screenShot()), Qt::QueuedConnection); connect(_file_bar, SIGNAL(load_session(QString)), this, @@ -149,17 +148,6 @@ void MainWindow::setup_ui() connect(_file_bar, SIGNAL(store_session(QString)), this, SLOT(store_session(QString))); -#ifdef ENABLE_DECODE - // protocol dock - _protocol_dock=new QDockWidget(tr("Protocol"),this); - _protocol_dock->setFeatures(QDockWidget::DockWidgetMovable); - _protocol_dock->setAllowedAreas(Qt::RightDockWidgetArea); - _protocol_dock->setVisible(false); - //dock::ProtocolDock *_protocol_widget = new dock::ProtocolDock(_protocol_dock, _session); - _protocol_widget = new dock::ProtocolDock(_protocol_dock, _session); - _protocol_dock->setWidget(_protocol_widget); - qDebug() << "Protocol decoder enabled!\n"; -#endif // trigger dock _trigger_dock=new QDockWidget(tr("Trigger Setting..."),this); _trigger_dock->setFeatures(QDockWidget::DockWidgetMovable); @@ -189,14 +177,13 @@ void MainWindow::setup_ui() connect(_sampling_bar, SIGNAL(instant_stop()), this, SLOT(instant_stop())); connect(_sampling_bar, SIGNAL(sample_count_changed()), _trigger_widget, - SLOT(device_change())); + SLOT(device_updated())); connect(_sampling_bar, SIGNAL(show_calibration()), _view, SLOT(show_calibration())); connect(_sampling_bar, SIGNAL(hide_calibration()), _view, SLOT(hide_calibration())); connect(_dso_trigger_widget, SIGNAL(set_trig_pos(int)), _view, SLOT(set_trig_pos(int))); - connect(_protocol_widget, SIGNAL(protocol_updated()), _view, SLOT(signals_changed())); setIconSize(QSize(40,40)); addToolBar(_sampling_bar); @@ -205,6 +192,19 @@ void MainWindow::setup_ui() addToolBar(_logo_bar); // Setup the dockWidget +#ifdef ENABLE_DECODE + // protocol dock + _protocol_dock=new QDockWidget(tr("Protocol"),this); + _protocol_dock->setFeatures(QDockWidget::DockWidgetMovable); + _protocol_dock->setAllowedAreas(Qt::RightDockWidgetArea); + _protocol_dock->setVisible(false); + //dock::ProtocolDock *_protocol_widget = new dock::ProtocolDock(_protocol_dock, _session); + _protocol_widget = new dock::ProtocolDock(_protocol_dock, *_view, _session); + _protocol_dock->setWidget(_protocol_widget); + qDebug() << "Protocol decoder enabled!\n"; + + connect(_protocol_widget, SIGNAL(protocol_updated()), _view, SLOT(signals_changed())); +#endif // measure dock _measure_dock=new QDockWidget(tr("Measurement"),this); _measure_dock->setFeatures(QDockWidget::DockWidgetMovable); @@ -242,19 +242,24 @@ void MainWindow::setup_ui() SLOT(device_attach()), Qt::QueuedConnection); connect(&_session, SIGNAL(device_detach()), this, SLOT(device_detach()), Qt::QueuedConnection); - connect(&_session, SIGNAL(test_data_error()), this, - SLOT(test_data_error())); - connect(&_session, SIGNAL(malloc_error()), this, - SLOT(malloc_error())); - connect(&_session, SIGNAL(hardware_connect_failed()), this, - SLOT(hardware_connect_failed())); - connect(&_session, SIGNAL(on_mode_change()), this, + connect(&_session, SIGNAL(session_error()), this, + SLOT(show_error()), Qt::QueuedConnection); + connect(&_session, SIGNAL(session_save()), this, SLOT(session_save())); + connect(&_session, SIGNAL(data_updated()), _measure_widget, + SLOT(reCalc())); + connect(&_session, SIGNAL(repeat_resume()), this, + SLOT(repeat_resume())); connect(_view, SIGNAL(cursor_update()), _measure_widget, SLOT(cursor_update())); + connect(_view, SIGNAL(cursor_moving()), _measure_widget, + SLOT(cursor_moving())); connect(_view, SIGNAL(cursor_moved()), _measure_widget, - SLOT(cursor_moved())); + SLOT(reCalc())); + connect(_view, SIGNAL(prgRate(int)), this, SIGNAL(prgRate(int))); + connect(_view, SIGNAL(update_device_list()), + this, SLOT(update_device_list()), Qt::DirectConnection); // event filter _view->installEventFilter(this); @@ -272,10 +277,10 @@ void MainWindow::setup_ui() // Populate the device list and select the initially selected device _session.set_default_device(boost::bind(&MainWindow::session_error, this, - QString("Set Default Device failed"), _1)); + QString(tr("Set Default Device failed")), _1)); update_device_list(); _session.start_hotplug_proc(boost::bind(&MainWindow::session_error, this, - QString("Hotplug failed"), _1)); + QString(tr("Hotplug failed")), _1)); } void MainWindow::session_error( @@ -292,24 +297,45 @@ void MainWindow::update_device_list() _session.stop_capture(); _view->reload(); - _trigger_widget->device_change(); + _trigger_widget->device_updated(); #ifdef ENABLE_DECODE _protocol_widget->del_all_protocol(); #endif _trig_bar->reload(); - _sampling_bar->reload(); shared_ptr selected_device = _session.get_device(); _device_manager.add_device(selected_device); _sampling_bar->set_device_list(_device_manager.devices(), selected_device); _session.init_signals(); - if(dynamic_pointer_cast(selected_device)) { + shared_ptr file_dev; + if(file_dev = dynamic_pointer_cast(selected_device)) { + #ifdef ENABLE_DECODE + // load decoders + StoreSession ss(_session); + ss.load_decoders(_protocol_widget, file_dev->get_decoders()); + #endif + + // check version + if (selected_device->dev_inst()->mode == LOGIC) { + GVariant* gvar = selected_device->get_config(NULL, NULL, SR_CONF_FILE_VERSION); + if (gvar != NULL) { + int16_t version = g_variant_get_int16(gvar); + g_variant_unref(gvar); + if (version == 1) { + show_session_error(tr("Attension"), + tr("Current loading file has an old format. " + "This will lead to a slow loading speed. " + "Please resave it after loaded.")); + } + } + } + + // load data const QString errorMessage( - QString("Failed to capture file data!")); - const QString infoMessage; + QString(tr("Failed to capture file data!"))); _session.start_capture(true, boost::bind(&MainWindow::session_error, this, - errorMessage, infoMessage)); + errorMessage, _1)); } if (!selected_device->name().contains("virtual")) { @@ -332,31 +358,30 @@ void MainWindow::update_device_list() _file_bar->set_settings_en(false); _logo_bar->dsl_connected(false); } + _sampling_bar->reload(); _view->status_clear(); _trigger_widget->init(); _dso_trigger_widget->init(); + _measure_widget->reload(); } void MainWindow::reload() { - _trigger_widget->device_change(); + _trigger_widget->device_updated(); _session.reload(); -} - -void MainWindow::mode_changed() -{ - update_device_list(); + _measure_widget->reload(); } void MainWindow::load_file(QString file_name) { try { - //_session.set_file(file_name.toStdString()); + if (strncmp(_session.get_device()->name().toLocal8Bit(), "virtual", 7)) + session_save(); _session.set_file(file_name); } catch(QString e) { show_session_error(tr("Failed to load ") + file_name, e); _session.set_default_device(boost::bind(&MainWindow::session_error, this, - QString("Set Default Device failed"), _1)); + QString(tr("Set Default Device failed")), _1)); update_device_list(); return; } @@ -380,8 +405,10 @@ void MainWindow::device_attach() _session.get_device()->device_updated(); //_session.stop_hot_plug_proc(); - if (_session.get_capture_state() == SigSession::Running) - _session.stop_capture(); + _session.set_repeating(false); + _session.stop_capture(); + _sampling_bar->set_sampling(false); + _session.capture_state_changed(SigSession::Stopped); struct sr_dev_driver **const drivers = sr_driver_list(); struct sr_dev_driver **driver; @@ -390,8 +417,9 @@ void MainWindow::device_attach() _device_manager.driver_scan(*driver); _session.set_default_device(boost::bind(&MainWindow::session_error, this, - QString("Set Default Device failed"), _1)); + QString(tr("Set Default Device failed")), _1)); update_device_list(); + } void MainWindow::device_detach() @@ -399,8 +427,10 @@ void MainWindow::device_detach() _session.get_device()->device_updated(); //_session.stop_hot_plug_proc(); - if (_session.get_capture_state() == SigSession::Running) - _session.stop_capture(); + _session.set_repeating(false); + _session.stop_capture(); + _sampling_bar->set_sampling(false); + _session.capture_state_changed(SigSession::Stopped); session_save(); _view->hide_calibration(); @@ -412,120 +442,143 @@ void MainWindow::device_detach() _device_manager.driver_scan(*driver); _session.set_default_device(boost::bind(&MainWindow::session_error, this, - QString("Set Default Device failed"), _1)); + QString(tr("Set Default Device failed")), _1)); update_device_list(); } void MainWindow::run_stop() { -#ifdef TEST_MODE - if (!test_timer_linked) { - connect(&test_timer, SIGNAL(timeout()), - this, SLOT(run_stop())); - test_timer_linked = true; - } -#endif - switch(_session.get_capture_state()) { - case SigSession::Init: - case SigSession::Stopped: - if (_session.get_device()->dev_inst()->mode == DSO) - _view->show_trig_cursor(true); - else - _view->show_trig_cursor(false); - _view->update_sample(false); - commit_trigger(false); - _session.start_capture(false, - boost::bind(&MainWindow::session_error, this, - QString("Capture failed"), _1)); - break; - - case SigSession::Running: - _session.stop_capture(); - break; - } -} - -void MainWindow::instant_stop() -{ -#ifdef TEST_MODE - if (!test_timer_linked) { - connect(&test_timer, SIGNAL(timeout()), - this, SLOT(instant_stop())); - test_timer_linked = true; - } -#endif switch(_session.get_capture_state()) { case SigSession::Init: case SigSession::Stopped: - if (_session.get_device()->dev_inst()->mode == DSO) - _view->show_trig_cursor(true); - else - _view->show_trig_cursor(false); - _view->update_sample(true); - commit_trigger(true); - _session.start_capture(true, + _view->capture_init(false); + commit_trigger(false); + _session.start_capture(false, boost::bind(&MainWindow::session_error, this, - QString("Capture failed"), _1)); + QString(tr("Capture failed")), _1)); break; case SigSession::Running: _session.stop_capture(); break; } - } -void MainWindow::test_data_error() +void MainWindow::instant_stop() { + switch(_session.get_capture_state()) { + case SigSession::Init: + case SigSession::Stopped: + _view->capture_init(true); + commit_trigger(true); + _session.start_capture(true, + boost::bind(&MainWindow::session_error, this, + QString(tr("Capture failed")), _1)); + break; + + case SigSession::Running: + _session.stop_capture(); + break; + } +} + +void MainWindow::repeat_resume() +{ + while(_view->session().get_capture_state() == SigSession::Running) + QCoreApplication::processEvents(); + run_stop(); +} + +void MainWindow::show_error() +{ + QString title; + QString details; + QString ch_status = ""; + uint64_t error_pattern; + + switch(_session.get_error()) { + case SigSession::Hw_err: + _session.set_repeating(false); + _session.stop_capture(); + title = tr("Hardware Operation Failed"); + details = tr("Please replug device to refresh hardware configuration!"); + break; + case SigSession::Malloc_err: + _session.set_repeating(false); + _session.stop_capture(); + title = tr("Malloc Error"); + details = tr("Memory is not enough for this sample!\nPlease reduce the sample depth!"); + break; + case SigSession::Test_data_err: + _session.set_repeating(false); + _session.stop_capture(); + _sampling_bar->set_sampling(false); + _session.capture_state_changed(SigSession::Stopped); + title = tr("Data Error"); + error_pattern = _session.get_error_pattern(); + for(int i = 0; i < 16; i++) { + if (error_pattern & 0x01) + ch_status += "X "; + else + ch_status += " "; + ch_status += (i > 9 ? " " : ""); + error_pattern >>= 1; + } + details = tr("the received data are not consist with pre-defined test data!\n") + + tr("0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15\n") + ch_status; + break; + case SigSession::Pkt_data_err: + title = tr("Packet Error"); + details = tr("the content of received packet are not expected!"); + _session.refresh(0); + break; + case SigSession::Data_overflow: + _session.set_repeating(false); + _session.stop_capture(); + title = tr("Data Overflow"); + details = tr("USB bandwidth can not support current sample rate! \nPlease reduce the sample rate!"); + break; + default: + title = tr("Undefined Error"); + details = tr("Not expected error!"); + break; + } - _session.stop_capture(); dialogs::DSMessageBox msg(this); - msg.mBox()->setText(tr("Data Error")); - msg.mBox()->setInformativeText(tr("the receive data are not consist with pre-defined test data")); + connect(_session.get_device().get(), SIGNAL(device_updated()), &msg, SLOT(accept())); + QFont font("Monaco"); + font.setStyleHint(QFont::Monospace); + font.setFixedPitch(true); + msg.mBox()->setFont(font); + + msg.mBox()->setText(title); + msg.mBox()->setInformativeText(details); msg.mBox()->setStandardButtons(QMessageBox::Ok); msg.mBox()->setIcon(QMessageBox::Warning); msg.exec(); -} -void MainWindow::malloc_error() -{ - _session.stop_capture(); - dialogs::DSMessageBox msg(this); - msg.mBox()->setText(tr("Malloc Error")); - msg.mBox()->setInformativeText(tr("Memory is not enough for this sample!\nPlease reduce the sample depth!")); - msg.mBox()->setStandardButtons(QMessageBox::Ok); - msg.mBox()->setIcon(QMessageBox::Warning); - msg.exec(); -} - -void MainWindow::hardware_connect_failed() -{ - _session.stop_capture(); - dialogs::DSMessageBox msg(this); - msg.mBox()->setText(tr("Hardware Connect Failed")); - msg.mBox()->setInformativeText(tr("Please check hardware connection!")); - msg.mBox()->setStandardButtons(QMessageBox::Ok); - msg.mBox()->setIcon(QMessageBox::Warning); - msg.exec(); + _session.clear_error(); } void MainWindow::capture_state_changed(int state) { - _file_bar->enable_toggle(state != SigSession::Running); - _sampling_bar->set_sampling(state == SigSession::Running); - _view->on_state_changed(state != SigSession::Running); + if (!_session.repeat_check()) { + _file_bar->enable_toggle(state != SigSession::Running); + _sampling_bar->set_sampling(state == SigSession::Running); + _view->on_state_changed(state != SigSession::Running); - if (_session.get_device()->dev_inst()->mode != DSO) { - _sampling_bar->enable_toggle(state != SigSession::Running); - _trig_bar->enable_toggle(state != SigSession::Running); - _measure_dock->widget()->setEnabled(state != SigSession::Running); + if (_session.get_device()->dev_inst()->mode != DSO) { + _sampling_bar->enable_toggle(state != SigSession::Running); + _trig_bar->enable_toggle(state != SigSession::Running); + //_measure_dock->widget()->setEnabled(state != SigSession::Running); + _measure_widget->refresh(); + } } -#ifdef TEST_MODE if (state == SigSession::Stopped) { - test_timer.start(qrand()%1000); + prgRate(0); + _view->repeat_unshow(); } -#endif } void MainWindow::session_save() @@ -542,8 +595,9 @@ void MainWindow::session_save() QString mode_name = QString::number(_session.get_device()->dev_inst()->mode); QString file_name = dir.absolutePath() + "/" + driver_name + mode_name + ".dsc"; if (strncmp(driver_name.toLocal8Bit(), "virtual", 7) && - !file_name.isEmpty()) + !file_name.isEmpty()) { store_session(file_name); + } } } @@ -629,35 +683,21 @@ void MainWindow::on_screenShot() void MainWindow::on_save() { using pv::dialogs::StoreProgress; + StoreProgress *dlg = new StoreProgress(_session, this); + dlg->save_run(); +} - const QString DIR_KEY("SavePath"); - QSettings settings; - - // Stop any currently running capture session - _session.stop_capture(); - - // Show the dialog - const QString file_name = QFileDialog::getSaveFileName( - this, tr("Save File"), settings.value(DIR_KEY).toString(), tr("DSView Data (*.dsl)")); - - if (file_name.isEmpty()) - return; - QDir CurrentDir; - settings.setValue(DIR_KEY, CurrentDir.absoluteFilePath(file_name)); - StoreProgress *dlg = new StoreProgress(file_name, _session, this); - dlg->run(); +void MainWindow::on_export() +{ + using pv::dialogs::StoreProgress; + StoreProgress *dlg = new StoreProgress(_session, this); + dlg->export_run(); } bool MainWindow::load_session(QString name) { QFile sessionFile(name); if (!sessionFile.open(QIODevice::ReadOnly)) { -// dialogs::DSMessageBox msg(this); -// msg.mBox()->setText(tr("File Error")); -// msg.mBox()->setInformativeText(tr("Couldn't open session file!")); -// msg.mBox()->setStandardButtons(QMessageBox::Ok); -// msg.mBox()->setIcon(QMessageBox::Warning); -// msg.exec(); qDebug("Warning: Couldn't open session file!"); return false; } @@ -666,6 +706,11 @@ bool MainWindow::load_session(QString name) QJsonDocument sessionDoc = QJsonDocument::fromJson(sessionData.toUtf8()); QJsonObject sessionObj = sessionDoc.object(); + // check session file version + if (!sessionObj.contains("Version") || + sessionObj["Version"].toInt() != Session_Version) + return false; + // check device and mode const sr_dev_inst *const sdi = _session.get_device()->dev_inst(); if (strcmp(sdi->driver->name, sessionObj["Device"].toString().toLocal8Bit()) != 0 || @@ -729,6 +774,9 @@ bool MainWindow::load_session(QString name) if (!isEnabled) probe->enabled = false; } + _sampling_bar->update_record_length(); + _trigger_widget->device_updated(); + //_session.init_signals(); _session.reload(); @@ -749,7 +797,7 @@ bool MainWindow::load_session(QString name) boost::shared_ptr dsoSig; if (dsoSig = dynamic_pointer_cast(s)) { dsoSig->load_settings(); - dsoSig->set_zero_vrate(obj["zeroPos"].toDouble()); + dsoSig->set_zero_vrate(obj["zeroPos"].toDouble(), true); dsoSig->set_trig_vrate(obj["trigValue"].toDouble()); dsoSig->commit_settings(); } @@ -763,6 +811,14 @@ bool MainWindow::load_session(QString name) _trigger_widget->set_session(sessionObj["trigger"].toObject()); } on_trigger(false); + + #ifdef ENABLE_DECODE + // load decoders + if (sessionObj.contains("decoder")) { + StoreSession ss(_session); + ss.load_decoders(_protocol_widget, sessionObj["decoder"].toArray()); + } + #endif } bool MainWindow::store_session(QString name) @@ -787,8 +843,8 @@ bool MainWindow::store_session(QString name) gsize num_opts; const sr_dev_inst *const sdi = _session.get_device()->dev_inst(); QJsonObject sessionVar; - QJsonObject triggerVar; QJsonArray channelVar; + sessionVar["Version"]= QJsonValue::fromVariant(Session_Version); sessionVar["Device"] = QJsonValue::fromVariant(sdi->driver->name); sessionVar["DeviceMode"] = QJsonValue::fromVariant(sdi->mode); @@ -844,6 +900,10 @@ bool MainWindow::store_session(QString name) sessionVar["trigger"] = _trigger_widget->get_session(); } + #ifdef ENABLE_DECODE + StoreSession ss(_session); + sessionVar["decoder"] = ss.json_decoders(); + #endif QJsonDocument sessionDoc(sessionVar); //sessionFile.write(QString::fromUtf8(sessionDoc.toJson())); @@ -888,11 +948,11 @@ bool MainWindow::eventFilter(QObject *object, QEvent *event) break; case Qt::Key_PageUp: _view->set_scale_offset(_view->scale(), - _view->offset() - _view->scale()*_view->get_view_width()); + _view->offset() - _view->get_view_width()); break; case Qt::Key_PageDown: _view->set_scale_offset(_view->scale(), - _view->offset() + _view->scale()*_view->get_view_width()); + _view->offset() + _view->get_view_width()); break; case Qt::Key_Left: diff --git a/DSView/pv/mainwindow.h b/DSView/pv/mainwindow.h index a8e73564..9b3c3284 100644 --- a/DSView/pv/mainwindow.h +++ b/DSView/pv/mainwindow.h @@ -27,7 +27,6 @@ #include #include -#include #include "sigsession.h" @@ -59,10 +58,6 @@ class MeasureDock; class SearchDock; } -namespace dialogs{ -class Calibration; -} - namespace view { class View; } @@ -71,6 +66,9 @@ class MainWindow : public QMainWindow { Q_OBJECT +private: + static constexpr int Session_Version = 2; + public: explicit MainWindow(DeviceManager &device_manager, const char *open_file_name = NULL, @@ -100,8 +98,6 @@ private slots: */ void update_device_list(); - void mode_changed(); - void reload(); void show_session_error( @@ -111,10 +107,6 @@ private slots: void instant_stop(); - void test_data_error(); - - void malloc_error(); - void capture_state_changed(int state); void on_protocol(bool visible); @@ -131,9 +123,16 @@ private slots: void on_save(); + void on_export(); + bool load_session(QString name); bool store_session(QString name); + /* + * repeat + */ + void repeat_resume(); + /* * hotplug slot function */ @@ -143,7 +142,9 @@ private slots: /* * errors */ - void hardware_connect_failed(); + void show_error(); +signals: + void prgRate(int progress); private: DeviceManager &_device_manager; @@ -187,9 +188,6 @@ private: dock::MeasureDock *_measure_widget; QDockWidget *_search_dock; dock::SearchDock * _search_widget; - - QTimer test_timer; - bool test_timer_linked; }; } // namespace pv diff --git a/DSView/pv/prop/binding/binding.cpp b/DSView/pv/prop/binding/binding.cpp index 95fe443f..5faa1af2 100644 --- a/DSView/pv/prop/binding/binding.cpp +++ b/DSView/pv/prop/binding/binding.cpp @@ -79,6 +79,18 @@ QWidget* Binding::get_property_form(QWidget *parent, return form; } +std::map< boost::shared_ptr, + GVariant* >& Binding::get_property_value() const +{ + std::map < boost::shared_ptr, + GVariant* > pvalue; + BOOST_FOREACH(shared_ptr p, _properties) + { + assert(p); + pvalue[p] = p->get_value(); + } +} + QString Binding::print_gvariant(GVariant *const gvar) { QString s; diff --git a/DSView/pv/prop/binding/binding.h b/DSView/pv/prop/binding/binding.h index ca1462c2..653af2b4 100644 --- a/DSView/pv/prop/binding/binding.h +++ b/DSView/pv/prop/binding/binding.h @@ -27,6 +27,7 @@ #include #include +#include #include #include @@ -54,6 +55,9 @@ public: QWidget* get_property_form(QWidget *parent, bool auto_commit = false) const; + std::map< boost::shared_ptr, + GVariant* >& get_property_value() const; + static QString print_gvariant(GVariant *const gvar); protected: diff --git a/DSView/pv/prop/binding/binding_deviceoptions.cpp b/DSView/pv/prop/binding/binding_deviceoptions.cpp index ea9a3c99..7b254c17 100644 --- a/DSView/pv/prop/binding/binding_deviceoptions.cpp +++ b/DSView/pv/prop/binding/binding_deviceoptions.cpp @@ -87,6 +87,7 @@ DeviceOptions::DeviceOptions(struct sr_dev_inst *sdi) : case SR_CONF_COUPLING: case SR_CONF_EN_CH: case SR_CONF_OPERATION_MODE: + case SR_CONF_BUFFER_OPTIONS: case SR_CONF_THRESHOLD: case SR_CONF_ZERO: case SR_CONF_STREAM: diff --git a/DSView/pv/prop/binding/decoderoptions.h b/DSView/pv/prop/binding/decoderoptions.h index 18a9d67c..62d91ec3 100644 --- a/DSView/pv/prop/binding/decoderoptions.h +++ b/DSView/pv/prop/binding/decoderoptions.h @@ -45,14 +45,16 @@ public: DecoderOptions(boost::shared_ptr decoder_stack, boost::shared_ptr decoder); + GVariant* getter(const char *id); + + void setter(const char *id, GVariant *value); + private: static boost::shared_ptr bind_enum(const QString &name, const srd_decoder_option *option, Property::Getter getter, Property::Setter setter); - GVariant* getter(const char *id); - void setter(const char *id, GVariant *value); private: boost::shared_ptr _decoder_stack; diff --git a/DSView/pv/prop/bool.cpp b/DSView/pv/prop/bool.cpp index 2dd84890..f51fc4cb 100644 --- a/DSView/pv/prop/bool.cpp +++ b/DSView/pv/prop/bool.cpp @@ -69,6 +69,13 @@ bool Bool::labeled_widget() const return true; } +GVariant* Bool::get_value() const +{ + GVariant *const value = _getter ? _getter() : NULL; + + return value; +} + void Bool::commit() { assert(_setter); diff --git a/DSView/pv/prop/bool.h b/DSView/pv/prop/bool.h index a1b3e2f6..ec69217e 100644 --- a/DSView/pv/prop/bool.h +++ b/DSView/pv/prop/bool.h @@ -42,6 +42,8 @@ public: QWidget* get_widget(QWidget *parent, bool auto_commit); bool labeled_widget() const; + GVariant* get_value() const; + void commit(); private slots: diff --git a/DSView/pv/prop/property.cpp b/DSView/pv/prop/property.cpp index af793309..af37d644 100644 --- a/DSView/pv/prop/property.cpp +++ b/DSView/pv/prop/property.cpp @@ -42,5 +42,10 @@ bool Property::labeled_widget() const return false; } +GVariant* Property::get_value() const +{ + return NULL; +} + } // prop } // pv diff --git a/DSView/pv/prop/property.h b/DSView/pv/prop/property.h index 3a1b165f..117ba9a1 100644 --- a/DSView/pv/prop/property.h +++ b/DSView/pv/prop/property.h @@ -53,6 +53,8 @@ public: bool auto_commit = false) = 0; virtual bool labeled_widget() const; + virtual GVariant* get_value() const; + virtual void commit() = 0; protected: diff --git a/DSView/pv/sigsession.cpp b/DSView/pv/sigsession.cpp index a42b50e0..8ddde595 100644 --- a/DSView/pv/sigsession.cpp +++ b/DSView/pv/sigsession.cpp @@ -89,7 +89,13 @@ SigSession* SigSession::_session = NULL; SigSession::SigSession(DeviceManager &device_manager) : _device_manager(device_manager), _capture_state(Init), - _instant(false) + _instant(false), + _error(No_err), + _run_mode(Single), + _repeat_intvl(1), + _repeating(false), + _repeat_hold_prg(0), + _map_zoom(0) { // TODO: This should not be necessary _session = this; @@ -99,11 +105,11 @@ SigSession::SigSession(DeviceManager &device_manager) : register_hotplug_callback(); _view_timer.stop(); _noData_cnt = 0; - _refresh_timer.stop(); - _refresh_timer.setSingleShot(true); _data_lock = false; _data_updated = false; + #ifdef ENABLE_DECODE _decoder_model = new pv::data::DecoderModel(this); + #endif // Create snapshots & data containers _cur_logic_snapshot.reset(new data::LogicSnapshot()); @@ -119,12 +125,6 @@ SigSession::SigSession(DeviceManager &device_manager) : _group_cnt = 0; connect(&_view_timer, SIGNAL(timeout()), this, SLOT(check_update())); - connect(&_refresh_timer, SIGNAL(timeout()), this, SLOT(data_unlock())); - - #ifdef TEST_MODE - _test_timer.setSingleShot(true); - connect(&_test_timer, SIGNAL(timeout()), this, SLOT(stop_capture())); - #endif } SigSession::~SigSession() @@ -172,6 +172,11 @@ void SigSession::set_device(boost::shared_ptr dev_inst) throw(Q _dev_inst->use(this); _cur_samplerate = _dev_inst->get_sample_rate(); _cur_samplelimits = _dev_inst->get_sample_limit(); + + if (_dev_inst->dev_inst()->mode == DSO) + set_run_mode(Repetitive); + else + set_run_mode(Single); } catch(const QString e) { throw(e); return; @@ -200,222 +205,6 @@ void SigSession::set_file(QString name) throw(QString) } } -void SigSession::save_file(const QString name, QWidget* parent, int type){ - unsigned char* data; - int unit_size; - uint64_t sample_count; - if (type == ANALOG) { - const deque< boost::shared_ptr > &snapshots = - _analog_data->get_snapshots(); - if (snapshots.empty()) - return; - const boost::shared_ptr &snapshot = - snapshots.front(); - data = (unsigned char*)snapshot->get_data(); - unit_size = snapshot->unit_size(); - sample_count = snapshot->get_sample_count(); - } else if (type == DSO) { - const deque< boost::shared_ptr > &snapshots = - _dso_data->get_snapshots(); - if (snapshots.empty()) - return; - const boost::shared_ptr &snapshot = - snapshots.front(); - data = (unsigned char*)snapshot->get_data(); - // snapshot->unit_size() is not valid for dso, replaced by enabled channel number - unit_size = get_ch_num(SR_CHANNEL_DSO); - sample_count = snapshot->get_sample_count(); - } else { - const deque< boost::shared_ptr > &snapshots = - _logic_data->get_snapshots(); - if (snapshots.empty()) - return; - const boost::shared_ptr &snapshot = - snapshots.front(); - data = (unsigned char*)snapshot->get_data(); - unit_size = snapshot->unit_size(); - sample_count = snapshot->get_sample_count(); - } - - QFuture future; - future = QtConcurrent::run([&]{ - sr_session_save(name.toLocal8Bit().data(), _dev_inst->dev_inst(), - data, unit_size, sample_count, _trigger_time.toMSecsSinceEpoch(), _trigger_pos); - }); - Qt::WindowFlags flags = Qt::CustomizeWindowHint; - QProgressDialog dlg(tr("Save Capture to File... It can take a while."), - tr("Cancel"),0,0,parent,flags); - dlg.setWindowModality(Qt::WindowModal); - dlg.setWindowFlags(Qt::Dialog | Qt::FramelessWindowHint); - dlg.setCancelButton(NULL); - - QFutureWatcher watcher; - watcher.setFuture(future); - connect(&watcher,SIGNAL(finished()),&dlg,SLOT(cancel())); - - dlg.exec(); -} - -QList SigSession::getSuportedExportFormats(){ - const struct sr_output_module** supportedModules = sr_output_list(); - QList list; - while(*supportedModules){ - if(*supportedModules == NULL) - break; - if (_dev_inst->dev_inst()->mode == DSO && strcmp((*supportedModules)->id, "csv")) - break; - QString format((*supportedModules)->desc); - format.append(" (*."); - format.append((*supportedModules)->id); - format.append(")"); - list.append(format); - supportedModules++; - } - return list; -} - -void SigSession::cancelSaveFile(){ - saveFileThreadRunning = false; -} - -void SigSession::export_file(const QString name, QWidget* parent, const QString ext){ - boost::shared_ptr snapshot; - int channel_type; - - if (_dev_inst->dev_inst()->mode == LOGIC) { - const deque< boost::shared_ptr > &snapshots = - _logic_data->get_snapshots(); - if(snapshots.empty()) - return; - snapshot = snapshots.front(); - channel_type = SR_CHANNEL_LOGIC; - } else if (_dev_inst->dev_inst()->mode == DSO) { - const deque< boost::shared_ptr > &snapshots = - _dso_data->get_snapshots(); - if(snapshots.empty()) - return; - snapshot = snapshots.front(); - channel_type = SR_CHANNEL_DSO; - } else { - return; - } - - const struct sr_output_module** supportedModules = sr_output_list(); - const struct sr_output_module* outModule = NULL; - while(*supportedModules){ - if(*supportedModules == NULL) - break; - if(!strcmp((*supportedModules)->id, ext.toLocal8Bit().data())){ - outModule = *supportedModules; - break; - } - supportedModules++; - } - if(outModule == NULL) - return; - - - GHashTable *params = g_hash_table_new(g_str_hash, g_str_equal); - GVariant* filenameGVariant = g_variant_new_bytestring(name.toLocal8Bit().data()); - g_hash_table_insert(params, (char*)"filename", filenameGVariant); - GVariant* typeGVariant = g_variant_new_int16(channel_type); - g_hash_table_insert(params, (char*)"type", typeGVariant); - BOOST_FOREACH(const boost::shared_ptr s, _signals) { - boost::shared_ptr dsoSig; - if (dsoSig = dynamic_pointer_cast(s)) { - GVariant* timebaseGVariant = g_variant_new_uint64(dsoSig->get_hDialValue()); - g_hash_table_insert(params, (char*)"timebase", timebaseGVariant); - break; - } - } - - struct sr_output output; - output.module = (sr_output_module*) outModule; - output.sdi = _dev_inst->dev_inst(); - output.param = NULL; - if(outModule->init) - outModule->init(&output, params); - QFile file(name); - file.open(QIODevice::WriteOnly | QIODevice::Text); - QTextStream out(&file); - out.setCodec("UTF-8"); - out.setGenerateByteOrderMark(true); - QFuture future; - if (_dev_inst->dev_inst()->mode == LOGIC) { - future = QtConcurrent::run([&]{ - saveFileThreadRunning = true; - unsigned char* datat = (unsigned char*)snapshot->get_data(); - unsigned int numsamples = snapshot->get_sample_count()*snapshot->unit_size(); - GString *data_out; - unsigned int usize = 8192; - unsigned int size = usize; - struct sr_datafeed_logic lp; - struct sr_datafeed_packet p; - for(uint64_t i = 0; i < numsamples; i+=usize){ - if(numsamples - i < usize) - size = numsamples - i; - lp.data = &datat[i]; - lp.length = size; - lp.unitsize = snapshot->unit_size(); - p.type = SR_DF_LOGIC; - p.payload = &lp; - outModule->receive(&output, &p, &data_out); - if(data_out){ - out << QString::fromUtf8((char*) data_out->str); - g_string_free(data_out,TRUE); - } - emit progressSaveFileValueChanged(i*100/numsamples); - if(!saveFileThreadRunning) - break; - } - }); - } else if (_dev_inst->dev_inst()->mode == DSO) { - future = QtConcurrent::run([&]{ - saveFileThreadRunning = true; - unsigned char* datat = (unsigned char*)snapshot->get_data(); - unsigned int numsamples = snapshot->get_sample_count(); - GString *data_out; - unsigned int usize = 8192; - unsigned int size = usize; - struct sr_datafeed_dso dp; - struct sr_datafeed_packet p; - for(uint64_t i = 0; i < numsamples; i+=usize){ - if(numsamples - i < usize) - size = numsamples - i; - dp.data = &datat[i*snapshot->get_channel_num()]; - dp.num_samples = size; - p.type = SR_DF_DSO; - p.payload = &dp; - outModule->receive(&output, &p, &data_out); - if(data_out){ - out << (char*) data_out->str; - g_string_free(data_out,TRUE); - } - emit progressSaveFileValueChanged(i*100/numsamples); - if(!saveFileThreadRunning) - break; - } - }); - } - - QFutureWatcher watcher; - Qt::WindowFlags flags = Qt::CustomizeWindowHint; - QProgressDialog dlg(tr("Exporting data... It can take a while."), - tr("Cancel"),0,100,parent,flags); - dlg.setWindowModality(Qt::WindowModal); - watcher.setFuture(future); - connect(&watcher,SIGNAL(finished()),&dlg,SLOT(cancel())); - connect(this,SIGNAL(progressSaveFileValueChanged(int)),&dlg,SLOT(setValue(int))); - connect(&dlg,SIGNAL(canceled()),this,SLOT(cancelSaveFile())); - dlg.exec(); - future.waitForFinished(); - // optional, as QFile destructor will already do it: - file.close(); - outModule->cleanup(&output); - g_hash_table_destroy(params); - g_variant_unref(filenameGVariant); -} - void SigSession::set_default_device(boost::function error_handler) { boost::shared_ptr default_device; @@ -511,9 +300,13 @@ void SigSession::set_cur_samplelimits(uint64_t samplelimits) void SigSession::capture_init() { + if (!_instant) + set_repeating(get_run_mode() == Repetitive); _cur_samplerate = _dev_inst->get_sample_rate(); _cur_samplelimits = _dev_inst->get_sample_limit(); _data_updated = false; + _trigger_flag = false; + _hw_replied = false; if (_dev_inst->dev_inst()->mode != LOGIC) _view_timer.start(ViewTime); else @@ -522,11 +315,7 @@ void SigSession::capture_init() data_unlock(); // Init and Set sample rate for all SignalData - // Logic/Analog/Dso - if (_logic_data) { - _logic_data->init(); - _logic_data->set_samplerate(_cur_samplerate); - } + // Analog/Dso if (_analog_data) { _analog_data->init(); _analog_data->set_samplerate(_cur_samplerate); @@ -535,12 +324,42 @@ void SigSession::capture_init() _dso_data->init(); _dso_data->set_samplerate(_cur_samplerate); } + + // MathStack + BOOST_FOREACH(const boost::shared_ptr m, _math_traces) + { + assert(m); + m->get_math_stack()->init(); + m->get_math_stack()->set_samplerate(_cur_samplerate); + } + + // update current hw offset + BOOST_FOREACH(const boost::shared_ptr s, _signals) + { + assert(s); + boost::shared_ptr dsoSig; + if (dsoSig = dynamic_pointer_cast(s)) { + dsoSig->set_zero_vrate(dsoSig->get_zero_vrate(), true); + } + } +} + +void SigSession::logic_init() +{ + // Logic + if (_logic_data) { + _logic_data->init(); + _logic_data->set_samplerate(_cur_samplerate); + } // Group if (_group_data) { _group_data->init(); _group_data->set_samplerate(_cur_samplerate); } #ifdef ENABLE_DECODE + // DecoderModel + pv::data::DecoderModel *decoder_model = get_decoder_model(); + decoder_model->setDecoderStack(NULL); // DecoderStack BOOST_FOREACH(const boost::shared_ptr d, _decode_traces) { @@ -549,29 +368,36 @@ void SigSession::capture_init() d->decoder()->set_samplerate(_cur_samplerate); } #endif - // MathStack - BOOST_FOREACH(const boost::shared_ptr m, _math_traces) - { - assert(m); - m->get_math_stack()->init(); - m->get_math_stack()->set_samplerate(_cur_samplerate); - } } void SigSession::start_capture(bool instant, boost::function error_handler) { - stop_capture(); - capture_init(); - - // Check that a device instance has been selected. + // Check that a device instance has been selected. if (!_dev_inst) { - qDebug() << "No device selected"; - return; - } - + qDebug() << "No device selected"; + capture_state_changed(SigSession::Stopped); + return; + } assert(_dev_inst->dev_inst()); + if (!_dev_inst->is_usable()) { + _error = Hw_err; + session_error(); + capture_state_changed(SigSession::Stopped); + return; + } + + // stop previous capture + stop_capture(); + + // update setting + if (_dev_inst->name() != "virtual-session") + _instant = instant; + else + _instant = true; + capture_init(); + // Check that at least one probe is enabled const GSList *l; for (l = _dev_inst->dev_inst()->channels; l; l = l->next) { @@ -583,16 +409,11 @@ void SigSession::start_capture(bool instant, if (!l) { error_handler(tr("No probes enabled.")); data_updated(); + set_repeating(false); capture_state_changed(SigSession::Stopped); return; } - // update setting - if (_dev_inst->name() != "virtual-session") - _instant = instant; - else - _instant = true; - // Begin the session _sampling_thread.reset(new boost::thread( &SigSession::sample_thread_proc, this, _dev_inst, @@ -619,6 +440,30 @@ void SigSession::stop_capture() _sampling_thread.reset(); } +bool SigSession::get_capture_status(bool &triggered, int &progress) +{ + uint64_t sample_limits = cur_samplelimits(); + sr_status status; + if (sr_status_get(_dev_inst->dev_inst(), &status, SR_STATUS_TRIG_BEGIN, SR_STATUS_TRIG_END) == SR_OK){ + triggered = status.trig_hit & 0x01; + const bool captured_cnt_dec = status.trig_hit & 0x02; + uint64_t captured_cnt = status.trig_hit >> 2; + captured_cnt = ((uint64_t)status.captured_cnt0 + + ((uint64_t)status.captured_cnt1 << 8) + + ((uint64_t)status.captured_cnt2 << 16) + + ((uint64_t)status.captured_cnt3 << 24) + + (captured_cnt << 32)); + if (_dev_inst->dev_inst()->mode == DSO) + captured_cnt = captured_cnt * _signals.size() / get_ch_num(SR_CHANNEL_DSO); + if (captured_cnt_dec) + progress = (sample_limits - captured_cnt) * 100.0 / sample_limits; + else + progress = captured_cnt * 100.0 / sample_limits; + return true; + } + return false; +} + vector< boost::shared_ptr > SigSession::get_signals() { //boost::lock_guard lock(_signals_mutex); @@ -648,47 +493,6 @@ bool SigSession::get_instant() return _instant; } -const void* SigSession::get_buf(int& unit_size, uint64_t &length) -{ - if (_dev_inst->dev_inst()->mode == LOGIC) { - const deque< boost::shared_ptr > &snapshots = - _logic_data->get_snapshots(); - if (snapshots.empty()) - return NULL; - - const boost::shared_ptr &snapshot = - snapshots.front(); - - unit_size = snapshot->unit_size(); - length = snapshot->get_sample_count(); - return snapshot->get_data(); - } else if (_dev_inst->dev_inst()->mode == DSO) { - const deque< boost::shared_ptr > &snapshots = - _dso_data->get_snapshots(); - if (snapshots.empty()) - return NULL; - - const boost::shared_ptr &snapshot = - snapshots.front(); - - unit_size = snapshot->unit_size(); - length = snapshot->get_sample_count(); - return snapshot->get_data(); - } else { - const deque< boost::shared_ptr > &snapshots = - _analog_data->get_snapshots(); - if (snapshots.empty()) - return NULL; - - const boost::shared_ptr &snapshot = - snapshots.front(); - - unit_size = snapshot->unit_size(); - length = snapshot->get_sample_count(); - return snapshot->get_data(); - } -} - void SigSession::set_capture_state(capture_state state) { boost::lock_guard lock(_sampling_mutex); @@ -733,10 +537,6 @@ void SigSession::check_update() data_updated(); _data_updated = false; _noData_cnt = 0; - #ifdef TEST_MODE - if (!_test_timer.isActive()) - _test_timer.start(qrand()%5000); - #endif } else { if (++_noData_cnt >= (WaitShowTime/ViewTime)) nodata_timeout(); @@ -947,24 +747,26 @@ void SigSession::reload() } break; - case SR_CHANNEL_DSO: - signal = boost::shared_ptr( - new view::DsoSignal(_dev_inst,_dso_data, probe)); - break; +// case SR_CHANNEL_DSO: +// signal = boost::shared_ptr( +// new view::DsoSignal(_dev_inst,_dso_data, probe)); +// break; - case SR_CHANNEL_ANALOG: - if (probe->enabled) - signal = boost::shared_ptr( - new view::AnalogSignal(_dev_inst, _analog_data, probe)); - break; +// case SR_CHANNEL_ANALOG: +// if (probe->enabled) +// signal = boost::shared_ptr( +// new view::AnalogSignal(_dev_inst, _analog_data, probe)); +// break; } if (signal.get()) sigs.push_back(signal); } - _signals.clear(); - vector< boost::shared_ptr >().swap(_signals); - _signals = sigs; + if (!sigs.empty()) { + _signals.clear(); + vector< boost::shared_ptr >().swap(_signals); + _signals = sigs; + } } mathTraces_rebuild(); @@ -975,7 +777,7 @@ void SigSession::refresh(int holdtime) boost::lock_guard lock(_data_mutex); _data_lock = true; - _refresh_timer.start(holdtime); + QTimer::singleShot(holdtime, this, SLOT(data_unlock())); if (_logic_data) { _logic_data->init(); @@ -1057,9 +859,12 @@ void SigSession::feed_in_meta(const sr_dev_inst *sdi, void SigSession::feed_in_trigger(const ds_trigger_pos &trigger_pos) { + _hw_replied = true; if (_dev_inst->dev_inst()->mode != DSO) { - _trigger_pos = trigger_pos.real_pos; - receive_trigger(_trigger_pos); + if (_trigger_flag = (trigger_pos.status & 0x01)) { + _trigger_pos = trigger_pos.real_pos; + receive_trigger(_trigger_pos); + } if (_dev_inst->name() != "virtual-session") { const double time = trigger_pos.real_pos * 1.0 / _cur_samplerate; _trigger_time = QDateTime::currentDateTime(); @@ -1092,15 +897,14 @@ void SigSession::feed_in_logic(const sr_datafeed_logic &logic) } if (logic.data_error == 1) { - test_data_error(); + _error = Test_data_err; + _error_pattern = logic.error_pattern; + session_error(); } if (_cur_logic_snapshot->last_ended()) { - _cur_logic_snapshot->first_payload(logic, _dev_inst->get_sample_limit(), 1); - if (_cur_logic_snapshot->memory_failed()) { - malloc_error(); - return; - } + logic_init(); + _cur_logic_snapshot->first_payload(logic, _dev_inst->get_sample_limit(), _dev_inst->dev_inst()->channels); // @todo Putting this here means that only listeners querying // for logic will be notified. Currently the only user of // frame_began is DecoderStack, but in future we need to signal @@ -1111,7 +915,13 @@ void SigSession::feed_in_logic(const sr_datafeed_logic &logic) _cur_logic_snapshot->append_payload(logic); } - emit receive_data(logic.length/logic.unitsize); + if (_cur_logic_snapshot->memory_failed()) { + _error = Malloc_err; + session_error(); + return; + } + + emit receive_data(logic.length * 8 / get_ch_num(SR_CHANNEL_LOGIC)); data_received(); //data_updated(); _data_updated = true; @@ -1129,25 +939,30 @@ void SigSession::feed_in_dso(const sr_datafeed_dso &dso) if (_cur_dso_snapshot->last_ended()) { + std::map sig_enable; // reset scale of dso signal BOOST_FOREACH(const boost::shared_ptr s, _signals) { assert(s); boost::shared_ptr dsoSig; - if (dsoSig = dynamic_pointer_cast(s)) - dsoSig->set_scale(dsoSig->get_view_rect().height() / 256.0f); + if (dsoSig = dynamic_pointer_cast(s)) { + dsoSig->set_scale(dsoSig->get_view_rect().height()); + sig_enable[dsoSig->get_index()] = dsoSig->enabled(); + } } // first payload - _cur_dso_snapshot->first_payload(dso, _dev_inst->get_sample_limit(), get_ch_num(SR_CHANNEL_DSO), _instant); - if (_cur_dso_snapshot->memory_failed()) { - malloc_error(); - return; - } + _cur_dso_snapshot->first_payload(dso, _dev_inst->get_sample_limit(), sig_enable, _instant); } else { // Append to the existing data snapshot _cur_dso_snapshot->append_payload(dso); } + if (_cur_dso_snapshot->memory_failed()) { + _error = Malloc_err; + session_error(); + return; + } + // calculate related math results BOOST_FOREACH(const boost::shared_ptr m, _math_traces) { @@ -1175,16 +990,18 @@ void SigSession::feed_in_analog(const sr_datafeed_analog &analog) if (_cur_analog_snapshot->last_ended()) { // first payload - _cur_analog_snapshot->first_payload(analog, _dev_inst->get_sample_limit(), get_ch_num(SR_CHANNEL_ANALOG)); - if (_cur_analog_snapshot->memory_failed()) { - malloc_error(); - return; - } + _cur_analog_snapshot->first_payload(analog, _dev_inst->get_sample_limit(), _dev_inst->dev_inst()->channels); } else { // Append to the existing data snapshot _cur_analog_snapshot->append_payload(analog); } + if (_cur_analog_snapshot->memory_failed()) { + _error = Malloc_err; + session_error(); + return; + } + receive_data(analog.num_samples); //data_updated(); _data_updated = true; @@ -1200,6 +1017,12 @@ void SigSession::data_feed_in(const struct sr_dev_inst *sdi, if (_data_lock) return; + if (packet->type != SR_DF_END && + packet->status != SR_PKT_OK) { + _error = Pkt_data_err; + session_error(); + return; + } switch (packet->type) { case SR_DF_HEADER: @@ -1232,6 +1055,12 @@ void SigSession::data_feed_in(const struct sr_dev_inst *sdi, feed_in_analog(*(const sr_datafeed_analog*)packet->payload); break; + case SR_DF_OVERFLOW: + { + _error = Data_overflow; + session_error(); + break; + } case SR_DF_END: { { @@ -1247,14 +1076,22 @@ void SigSession::data_feed_in(const struct sr_dev_inst *sdi, _cur_group_snapshot.reset(); } } - _cur_logic_snapshot->set_last_ended(true); - _cur_dso_snapshot->set_last_ended(true); - _cur_analog_snapshot->set_last_ended(true); + if (!_cur_logic_snapshot->last_ended()) + _cur_logic_snapshot->capture_ended(); + else if (get_run_mode() != SigSession::Repetitive) + logic_init(); + _cur_dso_snapshot->capture_ended(); + _cur_analog_snapshot->capture_ended(); #ifdef ENABLE_DECODE BOOST_FOREACH(const boost::shared_ptr d, _decode_traces) d->frame_ended(); #endif } + + if (packet->status != SR_PKT_OK) { + _error = Pkt_data_err; + session_error(); + } frame_ended(); break; } @@ -1403,14 +1240,13 @@ uint16_t SigSession::get_ch_num(int type) } #ifdef ENABLE_DECODE -bool SigSession::add_decoder(srd_decoder *const dec) +bool SigSession::add_decoder(srd_decoder *const dec, bool silent) { bool ret = false; - map > probes; + map probes; boost::shared_ptr decoder_stack; - try - { + try { //lock_guard lock(_signals_mutex); // Create the decoder @@ -1440,13 +1276,14 @@ bool SigSession::add_decoder(srd_decoder *const dec) break; } } - if (d->create_popup()) { + if (silent) { + _decode_traces.push_back(d); + ret = true; + } else if (d->create_popup()) { _decode_traces.push_back(d); ret = true; } - } - catch(std::runtime_error e) - { + } catch(std::runtime_error e) { return false; } @@ -1604,4 +1441,117 @@ void SigSession::nodata_timeout() } } +boost::shared_ptr SigSession::get_snapshot(int type) +{ + if (type == SR_CHANNEL_LOGIC) + return _cur_logic_snapshot; + else if (type == SR_CHANNEL_ANALOG) + return _cur_analog_snapshot; + else if (type == SR_CHANNEL_DSO) + return _cur_dso_snapshot; + else + return NULL; +} + +SigSession::error_state SigSession::get_error() const +{ + return _error; +} + +void SigSession::set_error(error_state state) +{ + _error = state; +} + +void SigSession::clear_error() +{ + _error_pattern = 0; + _error = No_err; +} + +uint64_t SigSession::get_error_pattern() const +{ + return _error_pattern; +} + +SigSession::run_mode SigSession::get_run_mode() const +{ + return _run_mode; +} + +void SigSession::set_run_mode(run_mode mode) +{ + _run_mode = mode; +} + +int SigSession::get_repeat_intvl() const +{ + return _repeat_intvl; +} + +void SigSession::set_repeat_intvl(int interval) +{ + _repeat_intvl = interval; +} + +void SigSession::set_repeating(bool repeat) +{ + _repeating = repeat; + if (!_repeating) + _repeat_hold_prg = 0; +} + +bool SigSession::isRepeating() const +{ + return _repeating; +} + +bool SigSession::repeat_check() +{ + if (get_capture_state() != Stopped || + get_run_mode() != Repetitive || + !isRepeating()) { + return false; + } + + if (_dev_inst->dev_inst()->mode == LOGIC) { + _repeat_hold_prg = 100; + repeat_hold(_repeat_hold_prg); + QTimer::singleShot(_repeat_intvl*1000/RepeatHoldDiv, this, SLOT(repeat_update())); + return true; + } else { + return true; + } +} + +void SigSession::repeat_update() +{ + if (isRepeating()) { + _repeat_hold_prg -= 100/RepeatHoldDiv; + if (_repeat_hold_prg != 0) + QTimer::singleShot(_repeat_intvl*1000/RepeatHoldDiv, this, SLOT(repeat_update())); + repeat_hold(_repeat_hold_prg); + if (_repeat_hold_prg == 0) + repeat_resume(); + } +} + +int SigSession::get_repeat_hold() const +{ + if (isRepeating()) + return _repeat_hold_prg; + else + return 0; +} + +void SigSession::set_map_zoom(int index) +{ + _map_zoom = index; +} + +int SigSession::get_map_zoom() const +{ + return _map_zoom; +} + } // namespace pv diff --git a/DSView/pv/sigsession.h b/DSView/pv/sigsession.h index 59cf3327..6b9e33c0 100644 --- a/DSView/pv/sigsession.h +++ b/DSView/pv/sigsession.h @@ -59,6 +59,7 @@ class DeviceManager; namespace data { class SignalData; +class Snapshot; class Analog; class AnalogSnapshot; class Dso; @@ -93,7 +94,7 @@ class SigSession : public QObject private: static constexpr float Oversampling = 2.0f; static const int RefreshTime = 500; - bool saveFileThreadRunning = false; + static const int RepeatHoldDiv = 20; public: static const int ViewTime = 50; @@ -106,6 +107,21 @@ public: Running }; + enum run_mode { + Single, + Repetitive + }; + + enum error_state { + No_err, + Hw_err, + Malloc_err, + Test_data_err, + Test_timeout_err, + Pkt_data_err, + Data_overflow + }; + public: SigSession(DeviceManager &device_manager); @@ -122,10 +138,7 @@ public: void set_file(QString name) throw(QString); - void save_file(const QString name, QWidget* parent, int type); - void set_default_device(boost::function error_handler); - void export_file(const QString name, QWidget* parent, const QString ext); void release_device(device::DevInst *dev_inst); @@ -142,6 +155,8 @@ public: void start_capture(bool instant, boost::function error_handler); void capture_init(); + bool get_capture_status(bool &triggered, int &progress); + void logic_init(); std::set< boost::shared_ptr > get_data() const; @@ -150,10 +165,9 @@ public: std::vector< boost::shared_ptr > get_group_signals(); - QList getSuportedExportFormats(); #ifdef ENABLE_DECODE - bool add_decoder(srd_decoder *const dec); + bool add_decoder(srd_decoder *const dec, bool silent); std::vector< boost::shared_ptr > get_decode_signals() const; @@ -167,20 +181,17 @@ public: void rst_decoder(view::DecodeTrace *signal); pv::data::DecoderModel* get_decoder_model() const; +#endif std::vector< boost::shared_ptr > get_math_signals(); -#endif - void init_signals(); void add_group(); void del_group(); - const void* get_buf(int& unit_size, uint64_t& length); - void start_hotplug_proc(boost::function error_handler); void stop_hotplug_proc(); void register_hotplug_callback(); @@ -195,6 +206,23 @@ public: bool trigd() const; + boost::shared_ptr get_snapshot(int type); + + error_state get_error() const; + void set_error(error_state state); + void clear_error(); + uint64_t get_error_pattern() const; + + run_mode get_run_mode() const; + void set_run_mode(run_mode mode); + int get_repeat_intvl() const; + void set_repeat_intvl(int interval); + bool isRepeating() const; + bool repeat_check(); + int get_repeat_hold() const; + + int get_map_zoom() const; + private: void set_capture_state(capture_state state); @@ -278,17 +306,23 @@ private: QTimer _view_timer; int _noData_cnt; - QTimer _refresh_timer; bool _data_lock; bool _data_updated; - #ifdef TEST_MODE - QTimer _test_timer; - #endif - QDateTime _trigger_time; uint64_t _trigger_pos; bool _trigger_flag; + bool _hw_replied; + + error_state _error; + uint64_t _error_pattern; + + run_mode _run_mode; + int _repeat_intvl; + bool _repeating; + int _repeat_hold_prg; + + int _map_zoom; signals: void capture_state_changed(int state); @@ -297,15 +331,11 @@ signals: void data_updated(); - void start_timer(int); - void receive_data(quint64 length); void device_attach(); void device_detach(); - void test_data_error(); - void receive_trigger(quint64 trigger_pos); void receive_header(); @@ -320,31 +350,35 @@ signals: void device_setted(); - void malloc_error(); - void zero_adj(); void progressSaveFileValueChanged(int percent); void decode_done(); - void show_region(uint64_t start, uint64_t end); - - void hardware_connect_failed(); + void show_region(uint64_t start, uint64_t end, bool keep); void show_wait_trigger(); - void on_mode_change(); + void session_save(); + + void session_error(); + + void repeat_hold(int percent); + void repeat_resume(); public slots: void reload(); void refresh(int holdtime); void stop_capture(); + // repeat + void set_repeating(bool repeat); + void set_map_zoom(int index); private slots: - void cancelSaveFile(); void data_unlock(); void check_update(); void nodata_timeout(); + void repeat_update(); private: // TODO: This should not be necessary. Multiple concurrent diff --git a/DSView/pv/storesession.cpp b/DSView/pv/storesession.cpp index baac25c4..432b30c2 100644 --- a/DSView/pv/storesession.cpp +++ b/DSView/pv/storesession.cpp @@ -2,6 +2,7 @@ * This file is part of the PulseView project. * * Copyright (C) 2014 Joel Holdsworth + * Copyright (C) 2016 DreamSourceLab * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -23,10 +24,22 @@ #include #include #include +#include +#include +#include +#include +#include #include +#include +#include +#include +#include +#include #include +#include + using boost::dynamic_pointer_cast; using boost::mutex; using boost::shared_ptr; @@ -42,14 +55,12 @@ using std::vector; namespace pv { -const size_t StoreSession::BlockSize = 1024 * 1024; - -StoreSession::StoreSession(const std::string &file_name, - SigSession &session) : - _file_name(file_name), +StoreSession::StoreSession(SigSession &session) : _session(session), + _outModule(NULL), _units_stored(0), - _unit_count(0) + _unit_count(0), + _has_error(false) { } @@ -70,132 +81,791 @@ const QString& StoreSession::error() const return _error; } -bool StoreSession::start() -{ - const vector< shared_ptr > sigs(_session.get_signals()); - set< boost::shared_ptr > data_set; - BOOST_FOREACH(const boost::shared_ptr sig, sigs) { - assert(sig); - data_set.insert(sig->data()); - } - - // Check we have logic data - if (data_set.empty() || sigs.empty()) { - _error = tr("No data to save."); - return false; - } - - if (data_set.size() > 1) { - _error = tr("DSView currently only has support for " - "storing a single data stream."); - return false; - } - - // Get the logic data - //shared_ptr data; - if (!(data = dynamic_pointer_cast(*data_set.begin()))) { - _error = tr("DSView currently only has support for " - "storing a logic data."); - return false; - } - - // Get the snapshot - const deque< shared_ptr > &snapshots = - data->get_snapshots(); - - if (snapshots.empty()) { - _error = tr("No snapshots to save."); - return false; - } - - const shared_ptr snapshot(snapshots.front()); - assert(snapshot); - - // Make a list of probes - char **const probes = new char*[sigs.size() + 1]; - for (size_t i = 0; i < sigs.size(); i++) { - shared_ptr sig(sigs[i]); - assert(sig); - probes[i] = strdup(sig->get_name().toUtf8().constData()); - } - probes[sigs.size()] = NULL; - - // Begin storing - if (sr_session_save_init(_file_name.c_str(), - data->samplerate(), probes) != SR_OK) { - _error = tr("Error while saving."); - return false; - } - - // Delete the probes array - for (size_t i = 0; i <= sigs.size(); i++) - free(probes[i]); - delete[] probes; - - _thread = boost::thread(&StoreSession::store_proc, this, snapshot); - return true; -} - void StoreSession::wait() { - if (_thread.joinable()) - _thread.join(); + if (_thread.joinable()) + _thread.join(); } void StoreSession::cancel() { - _thread.interrupt(); + _thread.interrupt(); } -void StoreSession::store_proc(shared_ptr snapshot) +QList StoreSession::getSuportedExportFormats(){ + const struct sr_output_module** supportedModules = sr_output_list(); + QList list; + while(*supportedModules){ + if(*supportedModules == NULL) + break; + if (_session.get_device()->dev_inst()->mode == DSO && strcmp((*supportedModules)->id, "csv")) + break; + QString format((*supportedModules)->desc); + format.append(" (*."); + format.append((*supportedModules)->id); + format.append(")"); + list.append(format); + supportedModules++; + } + return list; +} + +bool StoreSession::save_start() +{ + std::set type_set; + BOOST_FOREACH(const boost::shared_ptr sig, _session.get_signals()) { + assert(sig); + type_set.insert(sig->get_type()); + } + + if (type_set.size() > 1) { + _error = tr("DSView does not currently support" + "file saving for multiple data types."); + return false; + } else if (type_set.size() == 0) { + _error = tr("No data to save."); + return false; + } + + const boost::shared_ptr snapshot(_session.get_snapshot(*type_set.begin())); + assert(snapshot); + // Check we have data + if (snapshot->empty()) { + _error = tr("No data to save."); + return false; + } + + const QString DIR_KEY("SavePath"); + QSettings settings; + + // Show the dialog + _file_name = QFileDialog::getSaveFileName( + NULL, tr("Save File"), settings.value(DIR_KEY).toString(), + tr("DSView Data (*.dsl)")); + + if (!_file_name.isEmpty()) { + QFileInfo f(_file_name); + if(f.suffix().compare("dsl")) + _file_name.append(tr(".dsl")); + QDir CurrentDir; + settings.setValue(DIR_KEY, CurrentDir.absoluteFilePath(_file_name)); + + QString meta_file = meta_gen(snapshot); + #ifdef ENABLE_DECODE + QString decoders_file = decoders_gen(); + #else + QString decoders_file = NULL; + #endif + if (meta_file == NULL) { + _error = tr("Generate temp file failed."); + return false; + } else { + sr_session_save_init(_file_name.toLocal8Bit().data(), + meta_file.toLocal8Bit().data(), + decoders_file.toLocal8Bit().data()); + _thread = boost::thread(&StoreSession::save_proc, this, snapshot); + return !_has_error; + } + } + + _error.clear(); + return false; +} + +void StoreSession::save_proc(shared_ptr snapshot) { assert(snapshot); - uint64_t start_sample = 0; + shared_ptr logic_snapshot; + shared_ptr analog_snapshot; + shared_ptr dso_snapshot; - /// TODO: Wrap this in a std::unique_ptr when we transition to C++11 - uint8_t *data = NULL; - //uint8_t *const data = new uint8_t[BlockSize]; - //assert(data); + if (logic_snapshot = boost::dynamic_pointer_cast(snapshot)) { + uint16_t to_save_probes = 0; + BOOST_FOREACH(const boost::shared_ptr s, _session.get_signals()) { + if (s->enabled() && logic_snapshot->has_data(s->get_index())) + to_save_probes++; + } + _unit_count = logic_snapshot->get_sample_count() / 8 * to_save_probes; + int num = logic_snapshot->get_block_num(); + bool sample; - const int unit_size = snapshot->unit_size(); - assert(unit_size != 0); - - { - //lock_guard lock(_mutex); - _unit_count = snapshot->get_sample_count(); - } - - const unsigned int samples_per_block = BlockSize / unit_size; - - while (!boost::this_thread::interruption_requested() && - start_sample < _unit_count) - { - progress_updated(); - - const uint64_t end_sample = min( - start_sample + samples_per_block, _unit_count); - data = snapshot->get_samples(start_sample, end_sample); - - if(sr_session_append(_file_name.c_str(), data, unit_size, - end_sample - start_sample) != SR_OK) - { - _error = tr("Error while saving."); - break; - } - - start_sample = end_sample; - - { - //lock_guard lock(_mutex); - _units_stored = start_sample; - } - } + BOOST_FOREACH(const boost::shared_ptr s, _session.get_signals()) { + int ch_type = s->get_type(); + if (ch_type == SR_CHANNEL_LOGIC) { + int ch_index = s->get_index(); + if (!s->enabled() || !logic_snapshot->has_data(ch_index)) + continue; + for (int i = 0; !boost::this_thread::interruption_requested() && i < num; i++) { + uint8_t *buf = logic_snapshot->get_block_buf(i, ch_index, sample); + uint64_t size = logic_snapshot->get_block_size(i); + bool need_malloc = (buf == NULL); + if (need_malloc) { + buf = (uint8_t *)malloc(size); + if (buf == NULL) { + _has_error = true; + _error = tr("Malloc failed."); + return; + } + memset(buf, sample ? 0xff : 0x0, size); + } + sr_session_append(_file_name.toLocal8Bit().data(), buf, size, + i, ch_index, ch_type, File_Version); + _units_stored += size; + if (need_malloc) + free(buf); + progress_updated(); + } + } + } + } else { + int ch_type; + BOOST_FOREACH(const boost::shared_ptr s, _session.get_signals()) { + ch_type = s->get_type(); + break; + } + uint64_t size = snapshot->get_sample_count() * snapshot->get_channel_num(); + uint8_t *buf = (uint8_t *)snapshot->get_data(); + sr_session_append(_file_name.toLocal8Bit().data(), buf, size, + 0, 0, ch_type, 1); + } progress_updated(); +} - //delete[] data; +QString StoreSession::meta_gen(boost::shared_ptr snapshot) +{ + GSList *l; + GVariant *gvar; + FILE *meta; + struct sr_channel *probe; + int probecnt; + char *s; + struct sr_status status; + QString metafile; + + /* init "metadata" */ + QDir dir; + #if QT_VERSION >= 0x050400 + QString path = QStandardPaths::writableLocation(QStandardPaths::AppDataLocation); + #else + QString path = QStandardPaths::writableLocation(QStandardPaths::DataLocation); + #endif + if(dir.mkpath(path)) { + dir.cd(path); + metafile = dir.absolutePath() + "/DSView-meta-XXXXXX"; + } else { + return NULL; + } + + const sr_dev_inst *sdi = _session.get_device()->dev_inst(); + meta = fopen(metafile.toLocal8Bit().data(), "wb"); + fprintf(meta, "[version]\n"); + if (sdi->mode == DSO) + fprintf(meta, "version = %d\n", 1); // should be updated in next version + else + fprintf(meta, "version = %d\n", File_Version); + + /* metadata */ + + fprintf(meta, "[header]\n"); + if (sdi->driver) { + fprintf(meta, "driver = %s\n", sdi->driver->name); + fprintf(meta, "device mode = %d\n", sdi->mode); + } + + /* metadata */ + fprintf(meta, "capturefile = data\n"); + fprintf(meta, "total samples = %llu\n", snapshot->get_sample_count()); + + if (sdi->mode == DSO) + fprintf(meta, "total probes = %d\n", g_slist_length(sdi->channels)); + + shared_ptr logic_snapshot; + if (logic_snapshot = dynamic_pointer_cast(snapshot)) { + uint16_t to_save_probes = 0; + for (l = sdi->channels; l; l = l->next) { + probe = (struct sr_channel *)l->data; + if (probe->enabled && logic_snapshot->has_data(probe->index)) + to_save_probes++; + } + fprintf(meta, "total probes = %d\n", to_save_probes); + fprintf(meta, "total blocks = %d\n", logic_snapshot->get_block_num()); + } + + s = sr_samplerate_string(_session.cur_samplerate()); + fprintf(meta, "samplerate = %s\n", s); + + if (sdi->mode == DSO) { + gvar = _session.get_device()->get_config(NULL, NULL, SR_CONF_TIMEBASE); + if (gvar != NULL) { + uint64_t tmp_u64 = g_variant_get_uint64(gvar); + fprintf(meta, "hDiv = %llu\n", tmp_u64); + g_variant_unref(gvar); + } + gvar = _session.get_device()->get_config(NULL, NULL, SR_CONF_DSO_BITS); + if (gvar != NULL) { + uint8_t tmp_u8 = g_variant_get_byte(gvar); + fprintf(meta, "bits = %d\n", tmp_u8); + g_variant_unref(gvar); + } + } else if (sdi->mode == LOGIC) { + fprintf(meta, "trigger time = %lld\n", _session.get_trigger_time().toMSecsSinceEpoch()); + } + fprintf(meta, "trigger pos = %llu\n", _session.get_trigger_pos()); + + probecnt = 1; + for (l = sdi->channels; l; l = l->next) { + probe = (struct sr_channel *)l->data; + if (probe->enabled || sdi->mode == DSO) { + if (probe->name) + fprintf(meta, "probe%d = %s\n", probe->index, probe->name); + if (probe->trigger) + fprintf(meta, " trigger%d = %s\n", probe->index, probe->trigger); + if (sdi->mode == DSO) { + fprintf(meta, " enable%d = %d\n", probe->index, probe->enabled); + fprintf(meta, " coupling%d = %d\n", probe->index, probe->coupling); + fprintf(meta, " vDiv%d = %d\n", probe->index, probe->vdiv); + fprintf(meta, " vFactor%d = %d\n", probe->index, probe->vfactor); + fprintf(meta, " vPos%d = %lf\n", probe->index, probe->vpos); + fprintf(meta, " vTrig%d = %d\n", probe->index, probe->trig_value); + if (sr_status_get(sdi, &status, 0, 0) == SR_OK) { + if (probe->index == 0) { + fprintf(meta, " period%d = %llu\n", probe->index, status.ch0_period); + fprintf(meta, " pcnt%d = %lu\n", probe->index, status.ch0_pcnt); + fprintf(meta, " max%d = %d\n", probe->index, status.ch0_max); + fprintf(meta, " min%d = %d\n", probe->index, status.ch0_min); + } else { + fprintf(meta, " period%d = %llu\n", probe->index, status.ch1_period); + fprintf(meta, " pcnt%d = %lu\n", probe->index, status.ch1_pcnt); + fprintf(meta, " max%d = %d\n", probe->index, status.ch1_max); + fprintf(meta, " min%d = %d\n", probe->index, status.ch1_min); + } + } + } + probecnt++; + } + } + + fclose(meta); + + return metafile; +} + +bool StoreSession::export_start() +{ + std::set type_set; + BOOST_FOREACH(const boost::shared_ptr sig, _session.get_signals()) { + assert(sig); + type_set.insert(sig->get_type()); + } + + if (type_set.size() > 1) { + _error = tr("DSView does not currently support" + "file export for multiple data types."); + return false; + } else if (type_set.size() == 0) { + _error = tr("No data to save."); + return false; + } + + const boost::shared_ptr snapshot(_session.get_snapshot(*type_set.begin())); + assert(snapshot); + // Check we have data + if (snapshot->empty()) { + _error = tr("No data to save."); + return false; + } + + const QString DIR_KEY("ExportPath"); + QSettings settings; + + // Show the dialog + QList supportedFormats = getSuportedExportFormats(); + QString filter; + for(int i = 0; i < supportedFormats.count();i++){ + filter.append(supportedFormats[i]); + if(i < supportedFormats.count() - 1) + filter.append(";;"); + } + _file_name = QFileDialog::getSaveFileName( + NULL, tr("Export Data"), settings.value(DIR_KEY).toString(),filter,&filter); + if (!_file_name.isEmpty()) { + QFileInfo f(_file_name); + QStringList list = filter.split('.').last().split(')'); + _suffix = list.first(); + if(f.suffix().compare(_suffix)) + _file_name += tr(".") + _suffix; + QDir CurrentDir; + settings.setValue(DIR_KEY, CurrentDir.absoluteFilePath(_file_name)); + + const struct sr_output_module** supportedModules = sr_output_list(); + while(*supportedModules){ + if(*supportedModules == NULL) + break; + if(!strcmp((*supportedModules)->id, _suffix.toLocal8Bit().data())){ + _outModule = *supportedModules; + break; + } + supportedModules++; + } + + if(_outModule == NULL) { + _error = tr("Invalid export format."); + } else { + _thread = boost::thread(&StoreSession::export_proc, this, snapshot); + return !_has_error; + } + } + + _error.clear(); + return false; +} + +void StoreSession::export_proc(shared_ptr snapshot) +{ + assert(snapshot); + + shared_ptr logic_snapshot; + shared_ptr analog_snapshot; + shared_ptr dso_snapshot; + int channel_type; + + if (logic_snapshot = boost::dynamic_pointer_cast(snapshot)) { + channel_type = SR_CHANNEL_LOGIC; + } else if (dso_snapshot = boost::dynamic_pointer_cast(snapshot)) { + channel_type = SR_CHANNEL_DSO; + } else { + _has_error = true; + _error = tr("data type don't support."); + return; + } + + GHashTable *params = g_hash_table_new(g_str_hash, g_str_equal); + GVariant* filenameGVariant = g_variant_new_bytestring(_file_name.toLocal8Bit().data()); + g_hash_table_insert(params, (char*)"filename", filenameGVariant); + GVariant* typeGVariant = g_variant_new_int16(channel_type); + g_hash_table_insert(params, (char*)"type", typeGVariant); + BOOST_FOREACH(const boost::shared_ptr s, _session.get_signals()) { + boost::shared_ptr dsoSig; + if (dsoSig = dynamic_pointer_cast(s)) { + GVariant* timebaseGVariant = g_variant_new_uint64(dsoSig->get_hDialValue()); + g_hash_table_insert(params, (char*)"timebase", timebaseGVariant); + break; + } + } + + struct sr_output output; + output.module = (sr_output_module*) _outModule; + output.sdi = _session.get_device()->dev_inst(); + output.param = NULL; + if(_outModule->init) + _outModule->init(&output, params); + QFile file(_file_name); + file.open(QIODevice::WriteOnly | QIODevice::Text); + QTextStream out(&file); + out.setCodec("UTF-8"); + out.setGenerateByteOrderMark(true); + + if (channel_type == SR_CHANNEL_LOGIC) { + _unit_count = logic_snapshot->get_sample_count(); + int blk_num = logic_snapshot->get_block_num(); + bool sample; + std::vector buf_vec; + std::vector buf_sample; + for (int blk = 0; !boost::this_thread::interruption_requested() && + blk < blk_num; blk++) { + uint64_t buf_sample_num = logic_snapshot->get_block_size(blk) * 8; + BOOST_FOREACH(const boost::shared_ptr s, _session.get_signals()) { + int ch_type = s->get_type(); + if (ch_type == SR_CHANNEL_LOGIC) { + int ch_index = s->get_index(); + if (!logic_snapshot->has_data(ch_index)) + continue; + uint8_t *buf = logic_snapshot->get_block_buf(blk, ch_index, sample); + buf_vec.push_back(buf); + buf_sample.push_back(sample); + } + } + + uint16_t unitsize = ceil(buf_vec.size() / 8.0); + GString *data_out; + unsigned int usize = 8192; + unsigned int size = usize; + struct sr_datafeed_logic lp; + struct sr_datafeed_packet p; + for(uint64_t i = 0; !boost::this_thread::interruption_requested() && + i < buf_sample_num; i+=usize){ + if(buf_sample_num - i < usize) + size = buf_sample_num - i; + uint8_t *xbuf = (uint8_t *)malloc(size * unitsize); + if (xbuf == NULL) { + _has_error = true; + _error = tr("xbuffer malloc failed."); + return; + } + memset(xbuf, 0, size * unitsize); + for (uint64_t j = 0; j < usize; j++) { + for (unsigned int k = 0; k < buf_vec.size(); k++) { + if (buf_vec[k] == NULL && buf_sample[k]) + xbuf[j*unitsize+k/8] += 1 << k%8; + else if (buf_vec[k] && (buf_vec[k][(i+j)/8] & (1 << j%8))) + xbuf[j*unitsize+k/8] += 1 << k%8; + } + } + lp.data = xbuf; + lp.length = size * unitsize; + lp.unitsize = unitsize; + p.type = SR_DF_LOGIC; + p.status = SR_PKT_OK; + p.payload = &lp; + _outModule->receive(&output, &p, &data_out); + if(data_out){ + out << QString::fromUtf8((char*) data_out->str); + g_string_free(data_out,TRUE); + } + + _units_stored += size; + if (xbuf) + free(xbuf); + progress_updated(); + } + } + } else if (channel_type = SR_CHANNEL_DSO) { + _unit_count = snapshot->get_sample_count(); + unsigned char* datat = (unsigned char*)snapshot->get_data(); + GString *data_out; + unsigned int usize = 8192; + unsigned int size = usize; + struct sr_datafeed_dso dp; + struct sr_datafeed_packet p; + for(uint64_t i = 0; !boost::this_thread::interruption_requested() && i < _unit_count; i+=usize){ + if(_unit_count - i < usize) + size = _unit_count - i; + dp.data = &datat[i*snapshot->get_channel_num()]; + dp.num_samples = size; + p.type = SR_DF_DSO; + p.status = SR_PKT_OK; + p.payload = &dp; + _outModule->receive(&output, &p, &data_out); + if(data_out){ + out << (char*) data_out->str; + g_string_free(data_out,TRUE); + } + + _units_stored += size; + progress_updated(); + } + } + + // optional, as QFile destructor will already do it: + file.close(); + _outModule->cleanup(&output); + g_hash_table_destroy(params); + g_variant_unref(filenameGVariant); + + progress_updated(); +} + +#ifdef ENABLE_DECODE +QString StoreSession::decoders_gen() +{ + QDir dir; + #if QT_VERSION >= 0x050400 + QString path = QStandardPaths::writableLocation(QStandardPaths::AppDataLocation); + #else + QString path = QStandardPaths::writableLocation(QStandardPaths::DataLocation); + #endif + if(dir.mkpath(path)) { + dir.cd(path); + + QString file_name = dir.absolutePath() + "/DSView-decoders-XXXXXX"; + QFile sessionFile(file_name); + if (!sessionFile.open(QIODevice::WriteOnly | QIODevice::Text)) { + qDebug("Warning: Couldn't open session file to write!"); + return NULL; + } + QTextStream outStream(&sessionFile); + outStream.setCodec("UTF-8"); + outStream.setGenerateByteOrderMark(true); + + QJsonArray dec_array = json_decoders(); + QJsonDocument sessionDoc(dec_array); + outStream << QString::fromUtf8(sessionDoc.toJson()); + sessionFile.close(); + + return file_name; + } else { + return NULL; + } + +} + +QJsonArray StoreSession::json_decoders() +{ + QJsonArray dec_array; + BOOST_FOREACH(boost::shared_ptr t, _session.get_decode_signals()) { + QJsonObject dec_obj; + QJsonArray stack_array; + QJsonObject show_obj; + const boost::shared_ptr& stack = t->decoder(); + const std::list< boost::shared_ptr >& decoder = stack->stack(); + BOOST_FOREACH(boost::shared_ptr dec, decoder) { + QJsonArray ch_array; + const srd_decoder *const d = dec->decoder();; + const bool have_probes = (d->channels || d->opt_channels) != 0; + if (have_probes) { + for(std::map::const_iterator i = dec->channels().begin(); + i != dec->channels().end(); i++) { + QJsonObject ch_obj; + ch_obj[(*i).first->id] = QJsonValue::fromVariant((*i).second); + ch_array.push_back(ch_obj); + } + } + + QJsonObject options_obj; + boost::shared_ptr dec_binding( + new prop::binding::DecoderOptions(stack, dec)); + for (GSList *l = d->options; l; l = l->next) + { + const srd_decoder_option *const opt = + (srd_decoder_option*)l->data; + + const std::map& options = dec->options(); + std::map::const_iterator iter = options.find(opt->id); + if (opt->values) { + for (GSList *vl = opt->values; vl; vl = vl->next) { + GVariant *const var = (GVariant*)vl->data; + assert(var); + if (iter == options.end()) { + options_obj[opt->id] = QJsonValue::fromVariant(dec_binding->print_gvariant(opt->def)); + break; + } else if (g_variant_compare((*iter).second, var) == 0) { + options_obj[opt->id] = QJsonValue::fromVariant(dec_binding->print_gvariant(var)); + break; + } + } + } else if (g_variant_is_of_type(opt->def, G_VARIANT_TYPE("d"))) { + GVariant *const var = dec_binding->getter(opt->id); + options_obj[opt->id] = QJsonValue::fromVariant(g_variant_get_double(var)); + g_variant_unref(var); + } else if (g_variant_is_of_type(opt->def, G_VARIANT_TYPE("x"))) { + GVariant *const var = dec_binding->getter(opt->id); + options_obj[opt->id] = QJsonValue::fromVariant(get_double(var)); + g_variant_unref(var); + } else if (g_variant_is_of_type(opt->def, G_VARIANT_TYPE("s"))) { + GVariant *const var = dec_binding->getter(opt->id); + options_obj[opt->id] = QJsonValue::fromVariant(g_variant_get_string(var, NULL)); + g_variant_unref(var); + }else { + continue; + } + } + + + if (have_probes) { + dec_obj["id"] = QJsonValue::fromVariant(d->id); + dec_obj["channel"] = ch_array; + dec_obj["options"] = options_obj; + } else { + QJsonObject stack_obj; + stack_obj["id"] = QJsonValue::fromVariant(d->id); + stack_obj["options"] = options_obj; + stack_array.push_back(stack_obj); + } + show_obj[d->id] = QJsonValue::fromVariant(dec->shown()); + } + dec_obj["stacked decoders"] = stack_array; + + + std::map rows = stack->get_rows_gshow(); + for (std::map::const_iterator i = rows.begin(); + i != rows.end(); i++) { + show_obj[(*i).first.title()] = QJsonValue::fromVariant((*i).second); + } + dec_obj["show"] = show_obj; + + dec_array.push_back(dec_obj); + } + return dec_array; +} + +void StoreSession::load_decoders(dock::ProtocolDock *widget, QJsonArray dec_array) +{ + if (_session.get_device()->dev_inst()->mode != LOGIC || + dec_array.empty()) + return; + + foreach (const QJsonValue &dec_value, dec_array) { + QJsonObject dec_obj = dec_value.toObject(); + const vector< boost::shared_ptr > pre_dsigs( + _session.get_decode_signals()); + if (widget->sel_protocol(dec_obj["id"].toString())) + widget->add_protocol(true); + const vector< boost::shared_ptr > aft_dsigs( + _session.get_decode_signals()); + + if (aft_dsigs.size() > pre_dsigs.size()) { + const GSList *l; + boost::shared_ptr new_dsig = aft_dsigs.back(); + const boost::shared_ptr& stack = new_dsig->decoder(); + + if (dec_obj.contains("stacked decoders")) { + foreach(const QJsonValue &value, dec_obj["stacked decoders"].toArray()) { + QJsonObject stacked_obj = value.toObject(); + + GSList *dl = g_slist_copy((GSList*)srd_decoder_list()); + for(; dl; dl = dl->next) { + const srd_decoder *const d = (srd_decoder*)dl->data; + assert(d); + + if (QString::fromUtf8(d->id) == stacked_obj["id"].toString()) { + stack->push(boost::shared_ptr( + new data::decode::Decoder(d))); + break; + } + } + g_slist_free(dl); + } + } + + const std::list< boost::shared_ptr >& decoder = stack->stack(); + BOOST_FOREACH(boost::shared_ptr dec, decoder) { + const srd_decoder *const d = dec->decoder(); + QJsonObject options_obj; + + if (dec == decoder.front()) { + std::map probe_map; + // Load the mandatory channels + for(l = d->channels; l; l = l->next) { + const struct srd_channel *const pdch = + (struct srd_channel *)l->data; + foreach (const QJsonValue &value, dec_obj["channel"].toArray()) { + QJsonObject ch_obj = value.toObject(); + if (ch_obj.contains(pdch->id)) { + probe_map[pdch] = ch_obj[pdch->id].toInt(); + break; + } + } + } + + // Load the optional channels + for(l = d->opt_channels; l; l = l->next) { + const struct srd_channel *const pdch = + (struct srd_channel *)l->data; + foreach (const QJsonValue &value, dec_obj["channel"].toArray()) { + QJsonObject ch_obj = value.toObject(); + if (ch_obj.contains(pdch->id)) { + probe_map[pdch] = ch_obj[pdch->id].toInt(); + break; + } + } + } + dec->set_probes(probe_map); + options_obj = dec_obj["options"].toObject(); + } else { + foreach(const QJsonValue &value, dec_obj["stacked decoders"].toArray()) { + QJsonObject stacked_obj = value.toObject(); + if (QString::fromUtf8(d->id) == stacked_obj["id"].toString()) { + options_obj = stacked_obj["options"].toObject(); + break; + } + } + } + + for (l = d->options; l; l = l->next) { + const srd_decoder_option *const opt = + (srd_decoder_option*)l->data; + if (options_obj.contains(opt->id)) { + if (opt->values) { + QString enum_option = options_obj[opt->id].toString(); + for (GSList *vl = opt->values; vl; vl = vl->next) { + GVariant *const var = (GVariant*)vl->data; + assert(var); + if (enum_option == QString::fromUtf8(g_variant_get_string(var, NULL))) { + dec->set_option(opt->id, var); + break; + } + } + } else if (g_variant_is_of_type(opt->def, G_VARIANT_TYPE("d"))) { + double d_option = options_obj[opt->id].toDouble(); + dec->set_option(opt->id, g_variant_new_double(d_option)); + } else if (g_variant_is_of_type(opt->def, G_VARIANT_TYPE("x"))) { + int64_t d_option = options_obj[opt->id].toDouble(); + GVariant *new_value = NULL; + const GVariantType *const type = g_variant_get_type(opt->def); + if (g_variant_type_equal(type, G_VARIANT_TYPE_BYTE)) + new_value = g_variant_new_byte(d_option); + else if (g_variant_type_equal(type, G_VARIANT_TYPE_INT16)) + new_value = g_variant_new_int16(d_option); + else if (g_variant_type_equal(type, G_VARIANT_TYPE_UINT16)) + new_value = g_variant_new_uint16(d_option); + else if (g_variant_type_equal(type, G_VARIANT_TYPE_INT32)) + new_value = g_variant_new_int32(d_option); + else if (g_variant_type_equal(type, G_VARIANT_TYPE_UINT32)) + new_value = g_variant_new_int32(d_option); + else if (g_variant_type_equal(type, G_VARIANT_TYPE_INT64)) + new_value = g_variant_new_int64(d_option); + else if (g_variant_type_equal(type, G_VARIANT_TYPE_UINT64)) + new_value = g_variant_new_uint64(d_option); + if (new_value != NULL) + dec->set_option(opt->id, new_value); + } else if (g_variant_is_of_type(opt->def, G_VARIANT_TYPE("s"))) { + QString s_option = options_obj[opt->id].toString(); + dec->set_option(opt->id, g_variant_new_string(s_option.toLocal8Bit().data())); + } + } + } + dec->commit(); + + if (dec_obj.contains("show")) { + QJsonObject show_obj = dec_obj["show"].toObject(); + if (show_obj.contains(d->id)) { + dec->show(show_obj[d->id].toBool()); + } + } + } + + if (dec_obj.contains("show")) { + QJsonObject show_obj = dec_obj["show"].toObject(); + std::map rows = stack->get_rows_gshow(); + for (std::map::const_iterator i = rows.begin(); + i != rows.end(); i++) { + if (show_obj.contains((*i).first.title())) { + stack->set_rows_gshow((*i).first, show_obj[(*i).first.title()].toBool()); + } + } + } + } + } + +} +#endif + +double StoreSession::get_double(GVariant *var) +{ + double val; + const GVariantType *const type = g_variant_get_type(var); + assert(type); + + if (g_variant_type_equal(type, G_VARIANT_TYPE_BYTE)) + val = g_variant_get_byte(var); + else if (g_variant_type_equal(type, G_VARIANT_TYPE_INT16)) + val = g_variant_get_int16(var); + else if (g_variant_type_equal(type, G_VARIANT_TYPE_UINT16)) + val = g_variant_get_uint16(var); + else if (g_variant_type_equal(type, G_VARIANT_TYPE_INT32)) + val = g_variant_get_int32(var); + else if (g_variant_type_equal(type, G_VARIANT_TYPE_UINT32)) + val = g_variant_get_uint32(var); + else if (g_variant_type_equal(type, G_VARIANT_TYPE_INT64)) + val = g_variant_get_int64(var); + else if (g_variant_type_equal(type, G_VARIANT_TYPE_UINT64)) + val = g_variant_get_uint64(var); + else + assert(0); + + return val; } } // pv diff --git a/DSView/pv/storesession.h b/DSView/pv/storesession.h index 0493ff84..8e432cf2 100644 --- a/DSView/pv/storesession.h +++ b/DSView/pv/storesession.h @@ -2,6 +2,7 @@ * This file is part of the PulseView project. * * Copyright (C) 2014 Joel Holdsworth + * Copyright (C) 2016 DreamSourceLab * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -22,19 +23,25 @@ #define DSVIEW_PV_STORESESSION_H #include - #include #include #include +#include +#include + namespace pv { class SigSession; namespace data { -class LogicSnapshot; +class Snapshot; +} + +namespace dock { +class ProtocolDock; } class StoreSession : public QObject @@ -42,11 +49,10 @@ class StoreSession : public QObject Q_OBJECT private: - static const size_t BlockSize; + const static int File_Version = 2; public: - StoreSession(const std::string &file_name, - SigSession &session); + StoreSession(SigSession &session); ~StoreSession(); @@ -54,27 +60,48 @@ public: const QString& error() const; - bool start(); + bool save_start(); + + bool export_start(); void wait(); void cancel(); private: - void store_proc(boost::shared_ptr snapshot); + void save_proc(boost::shared_ptr snapshot); + QString meta_gen(boost::shared_ptr snapshot); + void export_proc(boost::shared_ptr snapshot); + #ifdef ENABLE_DECODE + QString decoders_gen(); + #endif + +public: + #ifdef ENABLE_DECODE + QJsonArray json_decoders(); + void load_decoders(dock::ProtocolDock *widget, QJsonArray dec_array); + #endif + +private: + QList getSuportedExportFormats(); + double get_double(GVariant * var); signals: void progress_updated(); private: - const std::string _file_name; + QString _file_name; + QString _suffix; SigSession &_session; boost::thread _thread; + const struct sr_output_module* _outModule; + //mutable boost::mutex _mutex; uint64_t _units_stored; uint64_t _unit_count; + bool _has_error; QString _error; }; diff --git a/DSView/pv/toolbars/filebar.cpp b/DSView/pv/toolbars/filebar.cpp index e99929fd..ce070ea2 100644 --- a/DSView/pv/toolbars/filebar.cpp +++ b/DSView/pv/toolbars/filebar.cpp @@ -91,13 +91,13 @@ FileBar::FileBar(SigSession &session, QWidget *parent) : _action_save->setIcon(QIcon::fromTheme("file", QIcon(":/icons/save.png"))); _action_save->setObjectName(QString::fromUtf8("actionSave")); - connect(_action_save, SIGNAL(triggered()), this, SLOT(on_actionSave_triggered())); + connect(_action_save, SIGNAL(triggered()), this, SIGNAL(on_save())); _action_export = new QAction(this); _action_export->setText(QApplication::translate("File", "&Export...", 0)); _action_export->setIcon(QIcon::fromTheme("file",QIcon(":/icons/export.png"))); _action_export->setObjectName(QString::fromUtf8("actionExport")); - connect(_action_export, SIGNAL(triggered()), this, SLOT(on_actionExport_triggered())); + connect(_action_export, SIGNAL(triggered()), this, SIGNAL(on_export())); _action_capture = new QAction(this); @@ -119,9 +119,6 @@ FileBar::FileBar(SigSession &session, QWidget *parent) : _menu->addAction(_action_capture); _file_button.setMenu(_menu); addWidget(&_file_button); - - _screenshot_timer.setSingleShot(true); - connect(&_screenshot_timer, SIGNAL(timeout()), this, SIGNAL(on_screenShot())); } void FileBar::on_actionOpen_triggered() @@ -131,7 +128,7 @@ void FileBar::on_actionOpen_triggered() // Show the dialog const QString file_name = QFileDialog::getOpenFileName( this, tr("Open File"), settings.value(DIR_KEY).toString(), tr( - "DSView Data (*.dsl);;All Files (*.*)")); + "DSView Data (*.dsl)")); if (!file_name.isEmpty()) { QDir CurrentDir; settings.setValue(DIR_KEY, CurrentDir.absoluteFilePath(file_name)); @@ -158,74 +155,6 @@ void FileBar::show_session_error( msg.exec(); } -void FileBar::on_actionExport_triggered(){ - const QString DIR_KEY("ExportPath"); - QSettings settings; - int unit_size; - uint64_t length; - const void* buf = _session.get_buf(unit_size, length); - if (!buf) { - dialogs::DSMessageBox msg(this); - msg.mBox()->setText(tr("Data Export")); - msg.mBox()->setInformativeText(tr("No Data to Save!")); - msg.mBox()->setStandardButtons(QMessageBox::Ok); - msg.mBox()->setIcon(QMessageBox::Warning); - msg.exec(); - } else { - QList supportedFormats = _session.getSuportedExportFormats(); - QString filter; - for(int i = 0; i < supportedFormats.count();i++){ - filter.append(supportedFormats[i]); - if(i < supportedFormats.count() - 1) - filter.append(";;"); - } - QString file_name = QFileDialog::getSaveFileName( - this, tr("Export Data"), settings.value(DIR_KEY).toString(),filter,&filter); - if (!file_name.isEmpty()) { - QFileInfo f(file_name); - QStringList list = filter.split('.').last().split(')'); - QString ext = list.first(); - if(f.suffix().compare(ext)) - file_name+=tr(".")+ext; - QDir CurrentDir; - settings.setValue(DIR_KEY, CurrentDir.absoluteFilePath(file_name)); - _session.export_file(file_name, this, ext); - } - } -} - -void FileBar::on_actionSave_triggered() -{ - const QString DIR_KEY("SavePath"); - QSettings settings; - //save(); - int unit_size; - uint64_t length; - const void* buf = _session.get_buf(unit_size, length); - if (!buf) { - dialogs::DSMessageBox msg(this); - msg.mBox()->setText(tr("File Save")); - msg.mBox()->setInformativeText(tr("No Data to Save!")); - msg.mBox()->setStandardButtons(QMessageBox::Ok); - msg.mBox()->setIcon(QMessageBox::Warning); - msg.exec(); - } else { - QString file_name = QFileDialog::getSaveFileName( - this, tr("Save File"), settings.value(DIR_KEY).toString(), - tr("DSView Data (*.dsl)")); - - if (!file_name.isEmpty()) { - QFileInfo f(file_name); - if(f.suffix().compare("dsl")) - file_name.append(tr(".dsl")); - QDir CurrentDir; - settings.setValue(DIR_KEY, CurrentDir.absoluteFilePath(file_name)); - _session.save_file(file_name, this, _session.get_device()->dev_inst()->mode); - } - } -} - - void FileBar::on_actionLoad_triggered() { const QString DIR_KEY("SessionLoadPath"); @@ -282,7 +211,7 @@ void FileBar::on_actionCapture_triggered() { _file_button.close(); QCoreApplication::sendPostedEvents(); - _screenshot_timer.start(100); + QTimer::singleShot(100, this, SIGNAL(on_screenShot())); } void FileBar::enable_toggle(bool enable) diff --git a/DSView/pv/toolbars/filebar.h b/DSView/pv/toolbars/filebar.h index ea99ac66..0d85b578 100644 --- a/DSView/pv/toolbars/filebar.h +++ b/DSView/pv/toolbars/filebar.h @@ -53,7 +53,8 @@ private: signals: void load_file(QString); - void save(); + void on_save(); + void on_export(); void on_screenShot(); void load_session(QString); void store_session(QString); @@ -63,9 +64,7 @@ private slots: void on_actionStore_triggered(); void on_actionDefault_triggered(); void on_actionOpen_triggered(); - void on_actionSave_triggered(); void on_actionCapture_triggered(); - void on_actionExport_triggered(); private: bool _enable; @@ -84,9 +83,6 @@ private: QAction *_action_save; QAction *_action_export; QAction *_action_capture; - - QTimer _screenshot_timer; - }; } // namespace toolbars diff --git a/DSView/pv/toolbars/samplingbar.cpp b/DSView/pv/toolbars/samplingbar.cpp index 06b324c7..d87b117c 100644 --- a/DSView/pv/toolbars/samplingbar.cpp +++ b/DSView/pv/toolbars/samplingbar.cpp @@ -32,6 +32,7 @@ #include #include #include +#include #include "samplingbar.h" @@ -41,6 +42,7 @@ #include "../dialogs/waitingdialog.h" #include "../dialogs/dsmessagebox.h" #include "../view/dsosignal.h" +#include "../dialogs/interval.h" using namespace boost; using boost::shared_ptr; @@ -74,12 +76,15 @@ const uint64_t SamplingBar::RecordLengths[19] = { 40000000, }; +const QString SamplingBar::RLEString = "(RLE)"; + const uint64_t SamplingBar::DefaultRecordLength = 1000000; SamplingBar::SamplingBar(SigSession &session, QWidget *parent) : QToolBar("Sampling Bar", parent), _session(session), _enable(true), + _sampling(false), _device_selector(this), _updating_device_selector(false), _configure_button(this), @@ -94,6 +99,11 @@ SamplingBar::SamplingBar(SigSession &session, QWidget *parent) : _icon_instant_dis(":/icons/instant_dis.png"), _run_stop_button(this), _instant_button(this), + _mode_button(this), + _icon_repeat(":/icons/moder.png"), + _icon_single(":/icons/modes.png"), + _icon_repeat_dis(":/icons/moder_dis.png"), + _icon_single_dis(":/icons/modes_dis.png"), _instant(false) { setMovable(false); @@ -112,6 +122,8 @@ SamplingBar::SamplingBar(SigSession &session, QWidget *parent) : _configure_button.setIcon(QIcon::fromTheme("configure", QIcon(":/icons/params.png"))); + _mode_button.setPopupMode(QToolButton::InstantPopup); + _mode_button.setIcon(_session.get_run_mode() == pv::SigSession::Single ? _icon_single : _icon_repeat); _run_stop_button.setIcon(_icon_start); _instant_button.setIcon(_icon_instant); @@ -138,6 +150,25 @@ SamplingBar::SamplingBar(SigSession &session, QWidget *parent) : addWidget(&_sample_count); addWidget(new QLabel(tr(" @ "))); addWidget(&_sample_rate); + + _action_single = new QAction(this); + _action_single->setText(QApplication::translate("Sampling", "&Single", 0)); + _action_single->setIcon(QIcon::fromTheme("Sampling", + QIcon(":/icons/oneloop.png"))); + connect(_action_single, SIGNAL(triggered()), this, SLOT(on_mode())); + + _action_repeat = new QAction(this); + _action_repeat->setText(QApplication::translate("Sampling", "&Repetitive", 0)); + _action_repeat->setIcon(QIcon::fromTheme("Sampling", + QIcon(":/icons/repeat.png"))); + connect(_action_repeat, SIGNAL(triggered()), this, SLOT(on_mode())); + + _mode_menu = new QMenu(this); + _mode_menu->addAction(_action_single); + _mode_menu->addAction(_action_repeat); + _mode_button.setMenu(_mode_menu); + _mode_action = addWidget(&_mode_button); + _run_stop_action = addWidget(&_run_stop_button); _instant_action = addWidget(&_instant_button); } @@ -245,10 +276,8 @@ void SamplingBar::on_configure() if (test) { update_sample_count_selector_value(); update_sample_rate_selector_value(); - #ifndef TEST_MODE _sample_count.setDisabled(true); _sample_rate.setDisabled(true); - #endif } else if (dev_inst->dev_inst()->mode != DSO) { _sample_count.setDisabled(false); _sample_rate.setDisabled(false); @@ -277,7 +306,7 @@ void SamplingBar::zero_adj() } if (_session.get_capture_state() == pv::SigSession::Running) - run_stop(); + on_run_stop(); } uint64_t SamplingBar::get_record_length() const @@ -322,8 +351,20 @@ void SamplingBar::update_sample_rate() this, SLOT(on_samplerate_sel(int))); } +bool SamplingBar::get_sampling() const +{ + return _sampling; +} + +bool SamplingBar::get_instant() const +{ + return _instant; +} + void SamplingBar::set_sampling(bool sampling) { + lock_guard lock(_sampling_mutex); + _sampling = sampling; if (_instant) { _instant_button.setIcon(sampling ? _icon_stop : _icon_instant); _run_stop_button.setIcon(sampling ? _icon_start_dis : _icon_start); @@ -342,6 +383,9 @@ void SamplingBar::set_sampling(bool sampling) enable_run_stop(true); } + _mode_button.setEnabled(!sampling); + _mode_button.setIcon(sampling ? (_session.get_run_mode() == pv::SigSession::Single ? _icon_single_dis : _icon_repeat_dis) : + (_session.get_run_mode() == pv::SigSession::Single ? _icon_single : _icon_repeat)); _configure_button.setEnabled(!sampling); _configure_button.setIcon(sampling ? QIcon(":/icons/params_dis.png") : QIcon(":/icons/params.png")); @@ -482,7 +526,6 @@ void SamplingBar::on_samplecount_sel(int index) { uint64_t sample_count = 0; - qDebug() << "index: " << index; if (index >= 0) sample_count = _sample_count.itemData( index).value(); @@ -509,13 +552,13 @@ void SamplingBar::on_samplerate_sel(int index) sample_rate = _sample_rate.itemData( index).value(); - boost::shared_ptr _devInst = get_selected_device(); - assert(_devInst); + boost::shared_ptr dev_inst = get_selected_device(); + assert(dev_inst); // Get last samplerate //last_sample_rate = get_selected_device()->get_sample_rate(); - if (_devInst->name() == "DSLogic" && _devInst->dev_inst()->mode != DSO) { + if (dev_inst->name() == "DSLogic" && dev_inst->dev_inst()->mode != DSO) { // Set the samplerate get_selected_device()->set_config(NULL, NULL, SR_CONF_SAMPLERATE, @@ -529,7 +572,8 @@ void SamplingBar::update_sample_count_selector() const uint64_t *elements = NULL; gsize num_elements; bool stream_mode = false; - uint64_t max_sample_count = 0; + uint64_t hw_depth; + uint64_t sw_depth; if (_updating_sample_count) return; @@ -557,9 +601,9 @@ void SamplingBar::update_sample_count_selector() stream_mode = g_variant_get_boolean(gvar); g_variant_unref(gvar); } - gvar = dev_inst->get_config(NULL, NULL, SR_CONF_RLE_SAMPLELIMITS); + gvar = dev_inst->get_config(NULL, NULL, SR_CONF_HW_DEPTH); if (gvar != NULL) { - max_sample_count = g_variant_get_uint64(gvar); + hw_depth = g_variant_get_uint64(gvar); g_variant_unref(gvar); } @@ -570,11 +614,23 @@ void SamplingBar::update_sample_count_selector() gvar_list, &num_elements, sizeof(uint64_t)); _sample_count.clear(); + #if defined(__x86_64__) || defined(_M_X64) + sw_depth = elements[num_elements - 1]; + #elif defined(__i386) || defined(_M_IX86) + int ch_num = _session.get_ch_num(SR_CHANNEL_LOGIC); + if (ch_num <= 0) + sw_depth = SR_GB(8); + else + sw_depth = SR_GB(8) / ch_num; + #endif + for (unsigned int i = 0; i < num_elements; i++) { + if (elements[i] > sw_depth) + break; char *const s = sr_samplecount_string(elements[i]); - if (!stream_mode && (elements[i] > max_sample_count)) - _sample_count.addItem(QString(s)+"(RLE)", + if (!stream_mode && (elements[i] > hw_depth)) + _sample_count.addItem(QString(s)+RLEString, qVariantFromValue(elements[i])); else _sample_count.addItem(QString(s), @@ -647,81 +703,118 @@ void SamplingBar::commit_sample_count() g_variant_new_uint64(sample_count)); } + bool rle_mode = _sample_count.currentText().contains(RLEString); + get_selected_device()->set_config(NULL, NULL, + SR_CONF_RLE, + g_variant_new_boolean(rle_mode)); + _updating_sample_count = false; } void SamplingBar::on_run_stop() { - enable_run_stop(false); - enable_instant(false); - commit_sample_rate(); - commit_sample_count(); - _instant = false; - const shared_ptr dev_inst = get_selected_device(); - if (!dev_inst) - return; - if (dev_inst->dev_inst()->mode == DSO) { - GVariant* gvar = dev_inst->get_config(NULL, NULL, SR_CONF_ZERO); - if (gvar != NULL) { - bool zero = g_variant_get_boolean(gvar); - g_variant_unref(gvar); - if (zero) { - dialogs::DSMessageBox msg(this); - msg.mBox()->setText(tr("Zero Adjustment")); - msg.mBox()->setInformativeText(tr("Please adjust zero skew and save the result!")); - //msg.setStandardButtons(QMessageBox::Ok); - msg.mBox()->addButton(tr("Ok"), QMessageBox::AcceptRole); - msg.mBox()->addButton(tr("Skip"), QMessageBox::RejectRole); - msg.mBox()->setIcon(QMessageBox::Warning); - if (msg.exec()) { - zero_adj(); - } else { - dev_inst->set_config(NULL, NULL, SR_CONF_ZERO, g_variant_new_boolean(false)); - enable_run_stop(true); - enable_instant(true); - } - return; + if (get_sampling() || _session.isRepeating()) { + _session.set_repeating(false); + bool wait_upload = false; + if (_session.get_run_mode() != SigSession::Repetitive) { + GVariant *gvar = get_selected_device()->get_config(NULL, NULL, SR_CONF_WAIT_UPLOAD); + if (gvar != NULL) { + wait_upload = g_variant_get_boolean(gvar); + g_variant_unref(gvar); } } + if (!wait_upload) { + _session.stop_capture(); + _session.capture_state_changed(SigSession::Stopped); + } + } else { + enable_run_stop(false); + enable_instant(false); + commit_sample_rate(); + commit_sample_count(); + _instant = false; + const shared_ptr dev_inst = get_selected_device(); + if (!dev_inst) + return; + if (dev_inst->dev_inst()->mode == DSO) { + GVariant* gvar = dev_inst->get_config(NULL, NULL, SR_CONF_ZERO); + if (gvar != NULL) { + bool zero = g_variant_get_boolean(gvar); + g_variant_unref(gvar); + if (zero) { + dialogs::DSMessageBox msg(this); + msg.mBox()->setText(tr("Auto Calibration")); + msg.mBox()->setInformativeText(tr("Please adjust zero skew and save the result!")); + //msg.setStandardButtons(QMessageBox::Ok); + msg.mBox()->addButton(tr("Ok"), QMessageBox::AcceptRole); + msg.mBox()->addButton(tr("Skip"), QMessageBox::RejectRole); + msg.mBox()->setIcon(QMessageBox::Warning); + if (msg.exec()) { + zero_adj(); + } else { + dev_inst->set_config(NULL, NULL, SR_CONF_ZERO, g_variant_new_boolean(false)); + enable_run_stop(true); + enable_instant(true); + } + return; + } + } + } + run_stop(); } - run_stop(); } void SamplingBar::on_instant_stop() { - enable_run_stop(false); - enable_instant(false); - commit_sample_rate(); - commit_sample_count(); - _instant = true; - const shared_ptr dev_inst = get_selected_device(); - if (!dev_inst) - return; - if (dev_inst->dev_inst()->mode == DSO) { - GVariant* gvar = dev_inst->get_config(NULL, NULL, SR_CONF_ZERO); - if (gvar != NULL) { - bool zero = g_variant_get_boolean(gvar); - g_variant_unref(gvar); - if (zero) { - dialogs::DSMessageBox msg(this); - msg.mBox()->setText(tr("Zero Adjustment")); - msg.mBox()->setInformativeText(tr("Zero adjustment program will be started. Please keep all channels out of singal input. It can take a while!")); - //msg.mBox()->setStandardButtons(QMessageBox::Ok); - msg.mBox()->addButton(tr("Ok"), QMessageBox::AcceptRole); - msg.mBox()->addButton(tr("Skip"), QMessageBox::RejectRole); - msg.mBox()->setIcon(QMessageBox::Warning); - if (msg.exec()) { - zero_adj(); - } else { - dev_inst->set_config(NULL, NULL, SR_CONF_ZERO, g_variant_new_boolean(false)); - enable_run_stop(true); - enable_instant(true); - } - return; + if (get_sampling()) { + _session.set_repeating(false); + bool wait_upload = false; + if (_session.get_run_mode() != SigSession::Repetitive) { + GVariant *gvar = get_selected_device()->get_config(NULL, NULL, SR_CONF_WAIT_UPLOAD); + if (gvar != NULL) { + wait_upload = g_variant_get_boolean(gvar); + g_variant_unref(gvar); } } + if (!wait_upload) { + _session.stop_capture(); + _session.capture_state_changed(SigSession::Stopped); + } + } else { + enable_run_stop(false); + enable_instant(false); + commit_sample_rate(); + commit_sample_count(); + _instant = true; + const shared_ptr dev_inst = get_selected_device(); + if (!dev_inst) + return; + if (dev_inst->dev_inst()->mode == DSO) { + GVariant* gvar = dev_inst->get_config(NULL, NULL, SR_CONF_ZERO); + if (gvar != NULL) { + bool zero = g_variant_get_boolean(gvar); + g_variant_unref(gvar); + if (zero) { + dialogs::DSMessageBox msg(this); + msg.mBox()->setText(tr("Auto Calibration")); + msg.mBox()->setInformativeText(tr("Auto Calibration program will be started. Please keep all channels out of singal input. It can take a while!")); + //msg.mBox()->setStandardButtons(QMessageBox::Ok); + msg.mBox()->addButton(tr("Ok"), QMessageBox::AcceptRole); + msg.mBox()->addButton(tr("Skip"), QMessageBox::RejectRole); + msg.mBox()->setIcon(QMessageBox::Warning); + if (msg.exec()) { + zero_adj(); + } else { + dev_inst->set_config(NULL, NULL, SR_CONF_ZERO, g_variant_new_boolean(false)); + enable_run_stop(true); + enable_instant(true); + } + return; + } + } + } + instant_stop(); } - instant_stop(); } void SamplingBar::on_device_selected() @@ -757,6 +850,9 @@ void SamplingBar::enable_toggle(bool enable) if (!test) { _sample_count.setDisabled(!enable); _sample_rate.setDisabled(!enable); + } else { + _sample_count.setDisabled(true); + _sample_rate.setDisabled(true); } } @@ -787,10 +883,17 @@ void SamplingBar::reload() _icon_instant = QIcon(":/icons/instant.png"); _icon_instant_dis = QIcon(":/icons/instant_dis.png"); _instant_button.setIcon(_icon_instant); + if (_session.get_device()->name() == "virtual-session") { + _mode_action->setVisible(false); + } else { + _mode_button.setIcon(_session.get_run_mode() == pv::SigSession::Single ? _icon_single : _icon_repeat); + _mode_action->setVisible(true); + } _run_stop_action->setVisible(true); _instant_action->setVisible(true); enable_toggle(true); } else if (_session.get_device()->dev_inst()->mode == ANALOG) { + _mode_action->setVisible(false); _run_stop_action->setVisible(true); _instant_action->setVisible(false); enable_toggle(true); @@ -798,6 +901,7 @@ void SamplingBar::reload() _icon_instant = QIcon(":/icons/single.png"); _icon_instant_dis = QIcon(":/icons/single_dis.png"); _instant_button.setIcon(_icon_instant); + _mode_action->setVisible(false); _run_stop_action->setVisible(true); _instant_action->setVisible(true); enable_toggle(false); @@ -805,5 +909,19 @@ void SamplingBar::reload() update(); } +void SamplingBar::on_mode() +{ + QAction *act = qobject_cast(sender()); + if (act == _action_single) { + _mode_button.setIcon(_icon_single); + _session.set_run_mode(pv::SigSession::Single); + } else if (act == _action_repeat) { + _mode_button.setIcon(_icon_repeat); + pv::dialogs::Interval interval_dlg(_session, this); + interval_dlg.exec(); + _session.set_run_mode(pv::SigSession::Repetitive); + } +} + } // namespace toolbars } // namespace pv diff --git a/DSView/pv/toolbars/samplingbar.h b/DSView/pv/toolbars/samplingbar.h index 14e9aa94..8720bf20 100644 --- a/DSView/pv/toolbars/samplingbar.h +++ b/DSView/pv/toolbars/samplingbar.h @@ -33,6 +33,8 @@ #include #include #include +#include +#include #include @@ -64,6 +66,7 @@ private: static const uint64_t RecordLengths[19]; static const uint64_t DefaultRecordLength; static const int ComboBoxMaxWidth = 200; + static const QString RLEString; public: SamplingBar(SigSession &session, QWidget *parent); @@ -80,6 +83,8 @@ public: void update_sample_rate(); void set_sampling(bool sampling); + bool get_sampling() const; + bool get_instant() const; void enable_toggle(bool enable); @@ -110,6 +115,7 @@ private: void setting_adj(); private slots: + void on_mode(); void on_run_stop(); void on_instant_stop(); void on_device_selected(); @@ -127,7 +133,9 @@ public slots: private: SigSession &_session; + mutable boost::recursive_mutex _sampling_mutex; bool _enable; + bool _sampling; QComboBox _device_selector; std::map > @@ -151,6 +159,17 @@ private: QAction* _run_stop_action; QAction* _instant_action; + QAction* _mode_action; + QToolButton _mode_button; + QMenu *_mode_menu; + QAction *_action_repeat; + QAction *_action_single; + + QIcon _icon_repeat; + QIcon _icon_single; + QIcon _icon_repeat_dis; + QIcon _icon_single_dis; + bool _instant; }; diff --git a/DSView/pv/view/analogsignal.cpp b/DSView/pv/view/analogsignal.cpp index 08d38c2e..49755ab8 100644 --- a/DSView/pv/view/analogsignal.cpp +++ b/DSView/pv/view/analogsignal.cpp @@ -85,7 +85,7 @@ void AnalogSignal::paint_mid(QPainter &p, int left, int right) const int y = get_y() + _totalHeight * 0.5; const double scale = _view->scale(); assert(scale > 0); - const double offset = _view->offset(); + const int64_t offset = _view->offset(); const deque< boost::shared_ptr > &snapshots = _data->get_snapshots(); @@ -98,15 +98,15 @@ void AnalogSignal::paint_mid(QPainter &p, int left, int right) if (snapshot->empty()) return; - if (get_index() >= (int)snapshot->get_channel_num()) + const int order = snapshot->get_ch_order(get_index()); + if (order == -1) return; - const double pixels_offset = offset / scale; + const double pixels_offset = offset; const double samplerate = _data->samplerate(); - const double start_time = _data->get_start_time(); const int64_t last_sample = max((int64_t)(snapshot->get_sample_count() - 1), (int64_t)0); const double samples_per_pixel = samplerate * scale; - const double start = samplerate * (offset - start_time); + const double start = offset * samples_per_pixel; const double end = start + samples_per_pixel * (right - left); const int64_t start_sample = min(max((int64_t)floor(start), @@ -117,17 +117,18 @@ void AnalogSignal::paint_mid(QPainter &p, int left, int right) if (samples_per_pixel < EnvelopeThreshold) paint_trace(p, snapshot, y, left, start_sample, end_sample, - pixels_offset, samples_per_pixel); + pixels_offset, samples_per_pixel, order); else paint_envelope(p, snapshot, y, left, start_sample, end_sample, - pixels_offset, samples_per_pixel); + pixels_offset, samples_per_pixel, order); } void AnalogSignal::paint_trace(QPainter &p, const boost::shared_ptr &snapshot, int y, int left, const int64_t start, const int64_t end, - const double pixels_offset, const double samples_per_pixel) + const double pixels_offset, const double samples_per_pixel, + int order) { const int64_t sample_count = end - start; const int64_t channel_num = snapshot->get_channel_num(); @@ -145,7 +146,7 @@ void AnalogSignal::paint_trace(QPainter &p, const float x = (sample / samples_per_pixel - pixels_offset) + left; *point++ = QPointF(x, - y - samples[(sample - start) * channel_num + get_index()] * _scale); + y - samples[(sample - start) * channel_num + order] * _scale); } p.drawPolyline(points, point - points); @@ -157,13 +158,14 @@ void AnalogSignal::paint_trace(QPainter &p, void AnalogSignal::paint_envelope(QPainter &p, const boost::shared_ptr &snapshot, int y, int left, const int64_t start, const int64_t end, - const double pixels_offset, const double samples_per_pixel) + const double pixels_offset, const double samples_per_pixel, + int order) { using namespace Qt; using pv::data::AnalogSnapshot; AnalogSnapshot::EnvelopeSection e; - snapshot->get_envelope_section(e, start, end, samples_per_pixel, get_index()); + snapshot->get_envelope_section(e, start, end, samples_per_pixel, order); if (e.length < 2) return; @@ -201,10 +203,5 @@ void AnalogSignal::paint_envelope(QPainter &p, //delete[] e.samples; } -const std::vector< std::pair > AnalogSignal::cur_edges() const -{ - -} - } // namespace view } // namespace pv diff --git a/DSView/pv/view/analogsignal.h b/DSView/pv/view/analogsignal.h index 12523de7..6b8a407e 100644 --- a/DSView/pv/view/analogsignal.h +++ b/DSView/pv/view/analogsignal.h @@ -64,18 +64,16 @@ public: **/ void paint_mid(QPainter &p, int left, int right); - const std::vector< std::pair > cur_edges() const; - private: - void paint_trace(QPainter &p, - const boost::shared_ptr &snapshot, - int y, int left, const int64_t start, const int64_t end, - const double pixels_offset, const double samples_per_pixel); + void paint_trace(QPainter &p, + const boost::shared_ptr &snapshot, + int y, int left, const int64_t start, const int64_t end, + const double pixels_offset, const double samples_per_pixel, int order); - void paint_envelope(QPainter &p, - const boost::shared_ptr &snapshot, - int y, int left, const int64_t start, const int64_t end, - const double pixels_offset, const double samples_per_pixel); + void paint_envelope(QPainter &p, + const boost::shared_ptr &snapshot, + int y, int left, const int64_t start, const int64_t end, + const double pixels_offset, const double samples_per_pixel, int order); private: boost::shared_ptr _data; diff --git a/DSView/pv/view/cursor.cpp b/DSView/pv/view/cursor.cpp index aaa24582..6fc5ec2d 100644 --- a/DSView/pv/view/cursor.cpp +++ b/DSView/pv/view/cursor.cpp @@ -58,25 +58,31 @@ Cursor::Cursor(View &view, QColor color, uint64_t index) : { } -QRectF Cursor::get_label_rect(const QRect &rect) const +QRect Cursor::get_label_rect(const QRect &rect, bool &visible) const { const double samples_per_pixel = _view.session().cur_samplerate() * _view.scale(); - const double x = _index/samples_per_pixel - (_view.offset() / _view.scale()); + const double cur_offset = _index / samples_per_pixel; + if (cur_offset < _view.offset() || + cur_offset > (_view.offset() + _view.width())) { + visible = false; + return QRect(-1, -1, 0, 0); + } + const int64_t x = _index/samples_per_pixel - _view.offset(); - const QSizeF label_size( + const QSize label_size( _text_size.width() + View::LabelPadding.width() * 2, _text_size.height() + View::LabelPadding.height() * 2); - const float top = rect.height() - label_size.height() - + const int top = rect.height() - label_size.height() - Cursor::Offset - Cursor::ArrowSize - 0.5f; - const float height = label_size.height(); + const int height = label_size.height(); - return QRectF(x - label_size.width() / 2, top, label_size.width(), height); + visible = true; + return QRect(x - label_size.width() / 2, top, label_size.width(), height); } -QRectF Cursor::get_close_rect(const QRect &rect) const +QRect Cursor::get_close_rect(const QRect &rect) const { - const QRectF r(get_label_rect(rect)); - return QRectF(r.right() - CloseSize, r.top(), CloseSize, CloseSize); + return QRect(rect.right() - CloseSize, rect.top(), CloseSize, CloseSize); } void Cursor::paint_label(QPainter &p, const QRect &rect, @@ -85,10 +91,13 @@ void Cursor::paint_label(QPainter &p, const QRect &rect, assert(index > 0); using pv::view::Ruler; + bool visible; - compute_text_size(p, prefix); - const QRectF r(get_label_rect(rect)); - const QRectF close(get_close_rect(rect)); + compute_text_size(p, prefix); + const QRect r(get_label_rect(rect, visible)); + if (!visible) + return; + const QRect close(get_close_rect(r)); p.setPen(Qt::transparent); if (close.contains(QPoint(_view.hover_point().x(), _view.hover_point().y()))) @@ -99,10 +108,10 @@ void Cursor::paint_label(QPainter &p, const QRect &rect, p.setBrush(Ruler::CursorColor[(index - 1) % 8]); p.drawRect(r); - const QPointF points[] = { - QPointF(r.left() + r.width() / 2 - ArrowSize, r.bottom()), - QPointF(r.left() + r.width() / 2 + ArrowSize, r.bottom()), - QPointF(r.left() + r.width() / 2, rect.bottom()), + const QPoint points[] = { + QPoint(r.left() + r.width() / 2 - ArrowSize, r.bottom()), + QPoint(r.left() + r.width() / 2 + ArrowSize, r.bottom()), + QPoint(r.left() + r.width() / 2, rect.bottom()), }; p.drawPolygon(points, countof(points)); @@ -118,7 +127,7 @@ void Cursor::paint_label(QPainter &p, const QRect &rect, p.drawText(r, Qt::AlignCenter | Qt::AlignVCenter, Ruler::format_real_time(_index, _view.session().cur_samplerate())); - const QRectF arrowRect = QRectF(r.bottomLeft().x(), r.bottomLeft().y(), r.width(), ArrowSize); + const QRect arrowRect = QRect(r.bottomLeft().x(), r.bottomLeft().y(), r.width(), ArrowSize); p.drawText(arrowRect, Qt::AlignCenter | Qt::AlignVCenter, QString::number(index)); } @@ -126,18 +135,21 @@ void Cursor::paint_fix_label(QPainter &p, const QRect &rect, unsigned int prefix, QChar label, QColor color) { using pv::view::Ruler; + bool visible; compute_text_size(p, prefix); - const QRectF r(get_label_rect(rect)); + const QRect r(get_label_rect(rect, visible)); + if (!visible) + return; p.setPen(Qt::transparent); p.setBrush(color); p.drawRect(r); - const QPointF points[] = { - QPointF(r.left() + r.width() / 2 - ArrowSize, r.bottom()), - QPointF(r.left() + r.width() / 2 + ArrowSize, r.bottom()), - QPointF(r.left() + r.width() / 2, rect.bottom()), + const QPoint points[] = { + QPoint(r.left() + r.width() / 2 - ArrowSize, r.bottom()), + QPoint(r.left() + r.width() / 2 + ArrowSize, r.bottom()), + QPoint(r.left() + r.width() / 2, rect.bottom()), }; p.drawPolygon(points, countof(points)); @@ -145,14 +157,14 @@ void Cursor::paint_fix_label(QPainter &p, const QRect &rect, p.drawText(r, Qt::AlignCenter | Qt::AlignVCenter, Ruler::format_real_time(_index, _view.session().cur_samplerate())); - const QRectF arrowRect = QRectF(r.bottomLeft().x(), r.bottomLeft().y(), r.width(), ArrowSize); + const QRect arrowRect = QRect(r.bottomLeft().x(), r.bottomLeft().y(), r.width(), ArrowSize); p.drawText(arrowRect, Qt::AlignCenter | Qt::AlignVCenter, label); } void Cursor::compute_text_size(QPainter &p, unsigned int prefix) { (void)prefix; - _text_size = p.boundingRect(QRectF(), 0, + _text_size = p.boundingRect(QRect(), 0, Ruler::format_real_time(_index, _view.session().cur_samplerate())).size(); } diff --git a/DSView/pv/view/cursor.h b/DSView/pv/view/cursor.h index b1205874..72de30e5 100644 --- a/DSView/pv/view/cursor.h +++ b/DSView/pv/view/cursor.h @@ -64,9 +64,9 @@ public: * @param rect The rectangle of the ruler client area. * @return Returns the label rectangle. */ - QRectF get_label_rect(const QRect &rect) const; + QRect get_label_rect(const QRect &rect, bool &visible) const; - QRectF get_close_rect(const QRect &rect) const; + QRect get_close_rect(const QRect &rect) const; /** * Paints the cursor's label to the ruler. diff --git a/DSView/pv/view/decodetrace.cpp b/DSView/pv/view/decodetrace.cpp index d1bfe666..58c6dd04 100644 --- a/DSView/pv/view/decodetrace.cpp +++ b/DSView/pv/view/decodetrace.cpp @@ -179,8 +179,8 @@ void DecodeTrace::paint_back(QPainter &p, int left, int right) // --draw decode region control const double samples_per_pixel = _session.cur_samplerate() * _view->scale(); - const double startX = _decode_start/samples_per_pixel - (_view->offset() / _view->scale()); - const double endX = _decode_end/samples_per_pixel - (_view->offset() / _view->scale()); + const double startX = _decode_start/samples_per_pixel - _view->offset(); + const double endX = _decode_end/samples_per_pixel - _view->offset(); const double regionY = get_y() - _totalHeight*0.5 - ControlRectWidth; p.setBrush(Signal::dsBlue); @@ -245,41 +245,42 @@ void DecodeTrace::paint_mid(QPainter &p, int left, int right) if (!err.isEmpty()) { draw_error(p, err, left, right); - return; + //return; } - const double scale = _view->scale(); - assert(scale > 0); + const double scale = _view->scale(); + assert(scale > 0); - double samplerate = _decoder_stack->samplerate(); + double samplerate = _decoder_stack->samplerate(); - _cur_row_headings.clear(); + _cur_row_headings.clear(); - // Show sample rate as 1Hz when it is unknown - if (samplerate == 0.0) - samplerate = 1.0; + // Show sample rate as 1Hz when it is unknown + if (samplerate == 0.0) + samplerate = 1.0; - const double pixels_offset = (_view->offset() - - _decoder_stack->get_start_time()) / scale; - const double samples_per_pixel = samplerate * scale; + const int64_t pixels_offset = _view->offset(); + const double samples_per_pixel = samplerate * scale; - const uint64_t start_sample = (uint64_t)max((left + pixels_offset) * - samples_per_pixel, 0.0); + uint64_t start_sample = (uint64_t)max((left + pixels_offset) * + samples_per_pixel, 0.0); uint64_t end_sample = (uint64_t)max((right + pixels_offset) * - samples_per_pixel, 0.0); - const uint64_t samples_decoded = _decoder_stack->samples_decoded(); - if (samples_decoded < start_sample) + samples_per_pixel, 0.0); + BOOST_FOREACH(const boost::shared_ptr &dec, _decoder_stack->stack()) { + start_sample = max(dec->decode_start(), start_sample); + end_sample = min(dec->decode_end(), end_sample); + break; + } + if (end_sample < start_sample) return; - if (samples_decoded < end_sample) - end_sample = samples_decoded; const int annotation_height = _view->get_signalHeight(); - // Iterate through the rows - assert(_view); + // Iterate through the rows + assert(_view); int y = get_y() - (_totalHeight - annotation_height)*0.5; - assert(_decoder_stack); + assert(_decoder_stack); BOOST_FOREACH(boost::shared_ptr dec, _decoder_stack->stack()) { @@ -299,7 +300,8 @@ void DecodeTrace::paint_mid(QPainter &p, int left, int right) const uint64_t max_annotation = _decoder_stack->get_max_annotation(row); const double max_annWidth = max_annotation / samples_per_pixel; - if (max_annWidth > 5) { + if ((max_annWidth > 10 && min_annWidth > 1) || + (max_annWidth == 0 && samples_per_pixel < 10)) { vector annotations; _decoder_stack->get_annotation_subset(annotations, row, start_sample, end_sample); @@ -310,13 +312,11 @@ void DecodeTrace::paint_mid(QPainter &p, int left, int right) samples_per_pixel, pixels_offset, y, 0, min_annWidth); } - } else if (max_annWidth != 0){ + } else { draw_nodetail(p, annotation_height, left, right, y, 0); } - if (max_annWidth != 0) { - y += annotation_height; - _cur_row_headings.push_back(row.title()); - } + y += annotation_height; + _cur_row_headings.push_back(row.title()); } } } @@ -495,12 +495,50 @@ void DecodeTrace::draw_annotation(const pv::data::decode::Annotation &a, if (start > right + DrawPadding || end < left - DrawPadding) return; + if (_decoder_stack->get_mark_index() == (a.start_sample()+ a.end_sample())/2) { + p.setPen(Signal::dsBlue); + int xpos = (start+end)/2; + int ypos = get_y()+_totalHeight*0.5 + 1; + const QPoint triangle[] = { + QPoint(xpos, ypos), + QPoint(xpos-1, ypos + 1), + QPoint(xpos, ypos + 1), + QPoint(xpos+1, ypos + 1), + QPoint(xpos-2, ypos + 2), + QPoint(xpos-1, ypos + 2), + QPoint(xpos, ypos + 2), + QPoint(xpos+1, ypos + 2), + QPoint(xpos+2, ypos + 2), + }; + p.drawPoints(triangle, 9); + } + if (a.start_sample() == a.end_sample()) draw_instant(a, p, fill, outline, text_color, h, start, y, min_annWidth); - else + else { draw_range(a, p, fill, outline, text_color, h, start, end, y); + if ((a.type()/100 == 2) && (end - start > 20)) { + BOOST_FOREACH(boost::shared_ptr dec, + _decoder_stack->stack()) { + for (auto& iter: dec->channels()) { + int type = dec->get_channel_type(iter.first); + if ((type == SRD_CHANNEL_COMMON) || + ((type%100 != a.type()%100) && (type%100 != 0))) + continue; + boost::shared_ptr logic_sig; + BOOST_FOREACH(boost::shared_ptr sig, _session.get_signals()) { + if((sig->get_index() == iter.second) && + (logic_sig = dynamic_pointer_cast(sig))) { + logic_sig->paint_mark(p, start, end, type/100); + break; + } + } + } + } + } + } } void DecodeTrace::draw_nodetail(QPainter &p, @@ -723,13 +761,12 @@ QComboBox* DecodeTrace::create_probe_selector( const vector< boost::shared_ptr > sigs(_session.get_signals()); assert(_decoder_stack); - const map >::const_iterator probe_iter = + const map::const_iterator probe_iter = dec->channels().find(pdch); QComboBox *selector = new QComboBox(parent); - selector->addItem("-", qVariantFromValue((void*)NULL)); + selector->addItem("-", qVariantFromValue(-1)); if (probe_iter == dec->channels().end()) selector->setCurrentIndex(0); @@ -741,9 +778,9 @@ QComboBox* DecodeTrace::create_probe_selector( if (dynamic_pointer_cast(s) && s->enabled()) { selector->addItem(s->get_name(), - qVariantFromValue((void*)s.get())); + qVariantFromValue(s->get_index())); if (probe_iter != dec->channels().end()) { - if ((*probe_iter).second->get_index() == s->get_index()) + if ((*probe_iter).second == s->get_index()) selector->setCurrentIndex(i + 1); } } @@ -756,7 +793,7 @@ void DecodeTrace::commit_decoder_probes(boost::shared_ptr { assert(dec); - map > probe_map; + map probe_map; const vector< boost::shared_ptr > sigs(_session.get_signals()); _index_list.clear(); @@ -765,15 +802,13 @@ void DecodeTrace::commit_decoder_probes(boost::shared_ptr if(s._decoder != dec) break; - const LogicSignal *const selection = - (LogicSignal*)s._combo->itemData( - s._combo->currentIndex()).value(); + const int selection = s._combo->itemData( + s._combo->currentIndex()).value(); BOOST_FOREACH(boost::shared_ptr sig, sigs) - if(sig.get() == selection) { - probe_map[s._pdch] = - dynamic_pointer_cast(sig); - _index_list.push_back(sig->get_index()); + if(sig->get_index() == selection) { + probe_map[s._pdch] = selection; + _index_list.push_back(selection); break; } } diff --git a/DSView/pv/view/devmode.cpp b/DSView/pv/view/devmode.cpp index 6f81f27a..b13a2bff 100644 --- a/DSView/pv/view/devmode.cpp +++ b/DSView/pv/view/devmode.cpp @@ -117,7 +117,7 @@ void DevMode::on_mode_change() if ((*i).first == button) { if (dev_inst->dev_inst()->mode != (*i).second->mode) { _session.stop_capture(); - _session.on_mode_change(); + _session.session_save(); dev_inst->set_config(NULL, NULL, SR_CONF_DEVICE_MODE, g_variant_new_int16((*i).second->mode)); diff --git a/DSView/pv/view/dsosignal.cpp b/DSView/pv/view/dsosignal.cpp index 461aafc9..cb261db1 100644 --- a/DSView/pv/view/dsosignal.cpp +++ b/DSView/pv/view/dsosignal.cpp @@ -171,9 +171,9 @@ void DsoSignal::set_viewport(pv::view::Viewport *viewport) } -void DsoSignal::set_scale(float scale) +void DsoSignal::set_scale(int height) { - _scale = scale; + _scale = height * 1.0f / (1 << _bits); } float DsoSignal::get_scale() @@ -186,48 +186,38 @@ void DsoSignal::set_enable(bool enable) if (_dev_inst->name() == "DSLogic" && get_index() == 0) return; - _view->session().refresh(INT_MAX); - /* - * avoid race condition for en_ch_num - * data lock need to lock usb event - */ - _dev_inst->set_config(_probe, NULL, SR_CONF_DATALOCK, - g_variant_new_boolean(true)); - set_vDialActive(false); - _dev_inst->set_config(_probe, NULL, SR_CONF_EN_CH, - g_variant_new_boolean(enable)); - int ch_num = _view->session().get_ch_num(SR_CHANNEL_DSO); GVariant* gvar; - uint64_t max_sample_rate; - uint64_t max_sample_limit; - gvar = _dev_inst->get_config(NULL, NULL, SR_CONF_MAX_DSO_SAMPLERATE); + bool cur_enable; + gvar = _dev_inst->get_config(_probe, NULL, SR_CONF_EN_CH); if (gvar != NULL) { - max_sample_rate = g_variant_get_uint64(gvar); + cur_enable = g_variant_get_boolean(gvar); g_variant_unref(gvar); } else { qDebug() << "ERROR: config_get SR_CONF_MAX_DSO_SAMPLERATE failed."; return; } - gvar = _dev_inst->get_config(NULL, NULL, SR_CONF_MAX_DSO_SAMPLELIMITS); - if (gvar != NULL) { - max_sample_limit = g_variant_get_uint64(gvar); - g_variant_unref(gvar); - } else { - qDebug() << "ERROR: config_get SR_CONF_MAX_DSO_SAMPLELIMITS failed."; + if (cur_enable == enable) return; + + bool running = false; + if (_view->session().get_capture_state() == SigSession::Running) { + running = true; + _view->session().stop_capture(); + } + while(_view->session().get_capture_state() == SigSession::Running) + QCoreApplication::processEvents(); + + set_vDialActive(false); + _dev_inst->set_config(_probe, NULL, SR_CONF_EN_CH, + g_variant_new_boolean(enable)); + int ch_num = _view->session().get_ch_num(SR_CHANNEL_DSO); + + if (running) { + update_capture(); + _view->session().repeat_resume(); } - uint64_t sample_limit = (uint64_t)(max_sample_limit / (ch_num ? ch_num : 1)); - uint64_t sample_rate = min((uint64_t)(sample_limit * std::pow(10.0, 9.0) / (_hDial->get_value() * DS_CONF_DSO_HDIVS)), - (uint64_t)(max_sample_rate / (ch_num ? ch_num : 1))); - - _view->set_sample_rate(sample_rate, true); - _view->set_sample_limit(sample_limit, true); - - _dev_inst->set_config(_probe, NULL, SR_CONF_DATALOCK, - g_variant_new_boolean(false)); - _view->session().refresh(RefreshLong); _view->set_update(_viewport, true); _view->update(); } @@ -304,11 +294,11 @@ bool DsoSignal::go_hDialPre(bool setted) uint64_t sample_rate = _view->session().get_device()->get_sample_rate(); const uint64_t min_div = std::pow(10.0, 9.0) / sample_rate; if (_view->session().get_capture_state() != SigSession::Running && - !_data->get_snapshots().empty()) { + !_data->get_snapshots().front()->empty()) { if (_hDial->get_value() > min_div) _hDial->set_sel(_hDial->get_sel() - 1); } else if ((_view->session().get_capture_state() == SigSession::Running || - _data->get_snapshots().empty()) && + _data->get_snapshots().front()->empty()) && !_view->session().get_instant()) { _view->session().refresh(RefreshShort); _hDial->set_sel(_hDial->get_sel() - 1); @@ -346,17 +336,16 @@ bool DsoSignal::go_hDialPre(bool setted) } } -bool DsoSignal::go_hDialCur() +bool DsoSignal::update_capture() { int ch_num = _view->session().get_ch_num(SR_CHANNEL_DSO); if (ch_num == 0) return false; _view->session().refresh(RefreshShort); - uint64_t sample_limit = _view->session().get_device()->get_sample_limit(); - GVariant* gvar; uint64_t max_sample_rate; - gvar = _dev_inst->get_config(NULL, NULL, SR_CONF_MAX_DSO_SAMPLERATE); + uint64_t max_sample_limit; + GVariant *gvar = _dev_inst->get_config(NULL, NULL, SR_CONF_MAX_DSO_SAMPLERATE); if (gvar != NULL) { max_sample_rate = g_variant_get_uint64(gvar); g_variant_unref(gvar); @@ -364,11 +353,19 @@ bool DsoSignal::go_hDialCur() qDebug() << "ERROR: config_get SR_CONF_MAX_DSO_SAMPLERATE failed."; return false; } + gvar = _dev_inst->get_config(NULL, NULL, SR_CONF_MAX_DSO_SAMPLELIMITS); + if (gvar != NULL) { + max_sample_limit = g_variant_get_uint64(gvar); + g_variant_unref(gvar); + } else { + qDebug() << "ERROR: config_get SR_CONF_MAX_DSO_SAMPLELIMITS failed."; + return false; + } + uint64_t sample_limit = (uint64_t)(max_sample_limit / (ch_num ? ch_num : 1)); uint64_t sample_rate = min((uint64_t)(sample_limit * std::pow(10.0, 9.0) / (_hDial->get_value() * DS_CONF_DSO_HDIVS)), (uint64_t)(max_sample_rate / (ch_num ? ch_num : 1))); -// _dev_inst->set_config(NULL, NULL, SR_CONF_SAMPLERATE, -// g_variant_new_uint64(sample_rate)); + _view->set_sample_limit(sample_limit, true); _view->set_sample_rate(sample_rate, true); _dev_inst->set_config(_probe, NULL, SR_CONF_TIMEBASE, @@ -381,10 +378,10 @@ bool DsoSignal::go_hDialNext(bool setted) int ch_num = _view->session().get_ch_num(SR_CHANNEL_DSO); if (ch_num != 0 && !_hDial->isMax()) { if (_view->session().get_capture_state() != SigSession::Running && - !_data->get_snapshots().empty()) { + !_data->get_snapshots().front()->empty()) { _hDial->set_sel(_hDial->get_sel() + 1); } else if ((_view->session().get_capture_state() == SigSession::Running || - _data->get_snapshots().empty()) && + _data->get_snapshots().front()->empty()) && !_view->session().get_instant()) { _view->session().refresh(RefreshShort); _hDial->set_sel(_hDial->get_sel() + 1); @@ -428,15 +425,17 @@ bool DsoSignal::load_settings() GVariant* gvar; // -- enable - //bool enable; - //gvar = _dev_inst->get_config(_probe, NULL, SR_CONF_EN_CH); - //if (gvar != NULL) { - // enable = g_variant_get_boolean(gvar); - // g_variant_unref(gvar); - //} else { - // qDebug() << "ERROR: config_get SR_CONF_EN_CH failed."; - // return false; - //} + bool enable; + gvar = _dev_inst->get_config(_probe, NULL, SR_CONF_EN_CH); + if (gvar != NULL) { + enable = g_variant_get_boolean(gvar); + g_variant_unref(gvar); + } else { + qDebug() << "ERROR: config_get SR_CONF_EN_CH failed."; + return false; + } + + // dso channel bits gvar = _dev_inst->get_config(NULL, NULL, SR_CONF_DSO_BITS); if (gvar != NULL) { _bits = g_variant_get_byte(gvar); @@ -444,7 +443,8 @@ bool DsoSignal::load_settings() } else { _bits = DefaultBits; qDebug("Warning: config_get SR_CONF_DSO_BITS failed, set to %d(default).", DefaultBits); - return false; + if (strncmp(_dev_inst->name().toLocal8Bit(), "virtual", 7)) + return false; } // -- hdiv @@ -515,10 +515,8 @@ bool DsoSignal::load_settings() return false; } _zero_vrate = min(max((0.5 - vpos / (_vDial->get_value() * DS_CONF_DSO_VDIVS)), 0.0), 1.0); - if (_dev_inst->name() == "DSCope") - _zero_value = _zero_vrate * ((1 << _bits) - 1); - else - _zero_value = 0x80; + if (_dev_inst->name().contains("virtual")) + cur_hw_offset = _zero_vrate * ((1 << _bits) - 1); // -- trig_value gvar = _dev_inst->get_config(_probe, NULL, SR_CONF_TRIGGER_VALUE); @@ -528,7 +526,8 @@ bool DsoSignal::load_settings() g_variant_unref(gvar); } else { qDebug() << "ERROR: config_get SR_CONF_TRIGGER_VALUE failed."; - return false; + if (strncmp(_dev_inst->name().toLocal8Bit(), "virtual", 7)) + return false; } if (_view) { @@ -666,29 +665,33 @@ double DsoSignal::get_zero_vrate() return _zero_vrate; } -double DsoSignal::get_zero_value() +double DsoSignal::get_hw_offset() { - return _zero_value; + return cur_hw_offset; } void DsoSignal::set_zero_vpos(int pos) { if (enabled()) { double delta = _trig_delta* get_view_rect().height(); - _zero_vrate = min(max(pos - UpMargin, 0), get_view_rect().height()) * 1.0 / get_view_rect().height(); + set_zero_vrate(min(max(pos - UpMargin, 0), get_view_rect().height()) * 1.0 / get_view_rect().height(), false); set_trig_vpos(get_zero_vpos() + delta, false); - update_offset(); } } -void DsoSignal::set_zero_vrate(double rate) +void DsoSignal::set_zero_vrate(double rate, bool force_update) { _zero_vrate = rate; - if (_dev_inst->name() == "DSCope") - _zero_value = _zero_vrate * ((1 << _bits) - 1); - else - _zero_value = 0x80; update_offset(); + + if (!_dev_inst->name().contains("virtual") && + (force_update || + _view->session().get_capture_state() == SigSession::Running)) { + if (_dev_inst->name() == "DSLogic") + cur_hw_offset = 0x80; + else + cur_hw_offset = _zero_vrate * ((1 << _bits) - 1); + } } void DsoSignal::set_factor(uint64_t factor) @@ -818,8 +821,7 @@ void DsoSignal::paint_back(QPainter &p, int left, int right) const double samplerate = _dev_inst->get_sample_rate(); const double samples_per_pixel = samplerate * _view->scale(); const double shown_rate = min(samples_per_pixel * width * 1.0 / sample_len, 1.0); - const double start_time = _data->get_start_time(); - const double start = samplerate * (_view->offset() - start_time); + const double start = _view->offset() * samples_per_pixel; const double shown_offset = min(start / sample_len, 1.0) * width; const double shown_len = shown_rate * width; const QPointF left_edge[] = {QPoint(shown_offset + 3, UpMargin/2 - 6), @@ -875,7 +877,7 @@ void DsoSignal::paint_mid(QPainter &p, int left, int right) const int y = get_zero_vpos() + height * 0.5; const double scale = _view->scale(); assert(scale > 0); - const double offset = _view->offset(); + const int64_t offset = _view->offset(); const deque< boost::shared_ptr > &snapshots = _data->get_snapshots(); @@ -886,18 +888,16 @@ void DsoSignal::paint_mid(QPainter &p, int left, int right) if (snapshot->empty()) return; - const uint16_t number_channels = snapshot->get_channel_num(); - if (_dev_inst->name() == "DSLogic" && - (unsigned int)get_index() >= number_channels) + if (!snapshot->has_data(get_index())) return; - const double pixels_offset = offset / scale; + const uint16_t number_channels = snapshot->get_channel_num(); + const double pixels_offset = offset; //const double samplerate = _data->samplerate(); const double samplerate = _dev_inst->get_sample_rate(); - const double start_time = _data->get_start_time(); const int64_t last_sample = max((int64_t)(snapshot->get_sample_count() - 1), (int64_t)0); const double samples_per_pixel = samplerate * scale; - const double start = samplerate * (offset - start_time); + const double start = offset * samples_per_pixel; const double end = start + samples_per_pixel * width; const int64_t start_sample = min(max((int64_t)floor(start), @@ -923,6 +923,9 @@ void DsoSignal::paint_fore(QPainter &p, int left, int right) { assert(_view); + bool antialiasing = p.Antialiasing; + p.setRenderHint(QPainter::Antialiasing, false); + QPen pen(Signal::dsGray); pen.setStyle(Qt::DotLine); p.setPen(pen); @@ -967,6 +970,8 @@ void DsoSignal::paint_fore(QPainter &p, int left, int right) // Paint measure paint_measure(p); } + + p.setRenderHint(QPainter::Antialiasing, antialiasing); } QRectF DsoSignal::get_trig_rect(int left, int right) const @@ -1001,9 +1006,6 @@ void DsoSignal::paint_trace(QPainter &p, float top = get_view_rect().top(); float bottom = get_view_rect().bottom(); float zeroP = _zero_vrate * get_view_rect().height() + top;; - if (_dev_inst->name() == "DSCope" && - _view->session().get_capture_state() == SigSession::Running) - _zero_value = _zero_vrate * ((1 << _bits) - 1); float x = (start / samples_per_pixel - pixels_offset) + left; double pixels_per_sample = 1.0/samples_per_pixel; uint8_t offset; @@ -1014,7 +1016,7 @@ void DsoSignal::paint_trace(QPainter &p, //offset = samples[(sample - start)*num_channels]; offset = samples[sample]; - const float y = min(max(top, zeroP + (offset - _zero_value) * _scale), bottom); + const float y = min(max(top, zeroP + (offset - cur_hw_offset) * _scale), bottom); *point++ = QPointF(x, y); x += pixels_per_sample; //*point++ = QPointF(x, top + offset); @@ -1057,9 +1059,6 @@ void DsoSignal::paint_envelope(QPainter &p, float top = get_view_rect().top(); float bottom = get_view_rect().bottom(); float zeroP = _zero_vrate * get_view_rect().height() + top; - if (_dev_inst->name() == "DSCope" && - _view->session().get_capture_state() == SigSession::Running) - _zero_value = _zero_vrate * ((1 << _bits) - 1); for(uint64_t sample = 0; sample < e.length-1; sample++) { const float x = ((e.scale * sample + e.start) / samples_per_pixel - pixels_offset) + left; @@ -1068,8 +1067,8 @@ void DsoSignal::paint_envelope(QPainter &p, // We overlap this sample with the next so that vertical // gaps do not appear during steep rising or falling edges - const float b = min(max(top, ((max(s->max, (s+1)->min) - _zero_value) * _scale + zeroP)), bottom); - const float t = min(max(top, ((min(s->min, (s+1)->max) - _zero_value) * _scale + zeroP)), bottom); + const float b = min(max(top, ((max(s->max, (s+1)->min) - cur_hw_offset) * _scale + zeroP)), bottom); + const float t = min(max(top, ((min(s->min, (s+1)->max) - cur_hw_offset) * _scale + zeroP)), bottom); float h = b - t; if(h >= 0.0f && h <= 1.0f) @@ -1086,11 +1085,6 @@ void DsoSignal::paint_envelope(QPainter &p, //delete[] e.samples; } -const std::vector< std::pair > DsoSignal::cur_edges() const -{ - -} - void DsoSignal::paint_type_options(QPainter &p, int right, const QPoint pt) { int y = get_y(); @@ -1328,21 +1322,21 @@ void DsoSignal::paint_measure(QPainter &p) _min = (index == 0) ? status.ch0_min : status.ch1_min; const uint64_t period = (index == 0) ? status.ch0_period : status.ch1_period; const uint32_t count = (index == 0) ? status.ch0_pcnt : status.ch1_pcnt; - double value_max = (_zero_value - _min) * _scale * _vDial->get_value() * _vDial->get_factor() * DS_CONF_DSO_VDIVS / get_view_rect().height(); - double value_min = (_zero_value - _max) * _scale * _vDial->get_value() * _vDial->get_factor() * DS_CONF_DSO_VDIVS / get_view_rect().height(); + double value_max = (cur_hw_offset - _min) * _scale * _vDial->get_value() * _vDial->get_factor() * DS_CONF_DSO_VDIVS / get_view_rect().height(); + double value_min = (cur_hw_offset - _max) * _scale * _vDial->get_value() * _vDial->get_factor() * DS_CONF_DSO_VDIVS / get_view_rect().height(); double value_p2p = value_max - value_min; _period = (count == 0) ? period * 10.0 : period * 10.0 / count; const int channel_count = _view->session().get_ch_num(SR_CHANNEL_DSO); uint64_t sample_rate = _dev_inst->get_sample_rate(); _period = _period * 200.0 / (channel_count * sample_rate * 1.0 / SR_MHZ(1)); - _ms_string[DSO_MS_VMAX] = "Vmax: " + (abs(value_max) > 1000 ? QString::number(value_max/1000.0, 'f', 2) + "V" : QString::number(value_max, 'f', 2) + "mV"); - _ms_string[DSO_MS_VMIN] = "Vmin: " + (abs(value_min) > 1000 ? QString::number(value_min/1000.0, 'f', 2) + "V" : QString::number(value_min, 'f', 2) + "mV"); - _ms_string[DSO_MS_PERD] = "Perd: " + (abs(_period) > 1000000000 ? QString::number(_period/1000000000, 'f', 2) + "S" : + _ms_string[DSO_MS_VMAX] = tr("Vmax: ") + (abs(value_max) > 1000 ? QString::number(value_max/1000.0, 'f', 2) + "V" : QString::number(value_max, 'f', 2) + "mV"); + _ms_string[DSO_MS_VMIN] = tr("Vmin: ") + (abs(value_min) > 1000 ? QString::number(value_min/1000.0, 'f', 2) + "V" : QString::number(value_min, 'f', 2) + "mV"); + _ms_string[DSO_MS_PERD] = tr("Perd: ") + (abs(_period) > 1000000000 ? QString::number(_period/1000000000, 'f', 2) + "S" : abs(_period) > 1000000 ? QString::number(_period/1000000, 'f', 2) + "mS" : abs(_period) > 1000 ? QString::number(_period/1000, 'f', 2) + "uS" : QString::number(_period, 'f', 2) + "nS"); - _ms_string[DSO_MS_FREQ] = "Freq: " + (abs(_period) > 1000000 ? QString::number(1000000000/_period, 'f', 2) + "Hz" : + _ms_string[DSO_MS_FREQ] = tr("Freq: ") + (abs(_period) > 1000000 ? QString::number(1000000000/_period, 'f', 2) + "Hz" : abs(_period) > 1000 ? QString::number(1000000/_period, 'f', 2) + "kHz" : QString::number(1000/_period, 'f', 2) + "MHz"); - _ms_string[DSO_MS_VP2P] = "Vp-p: " + (abs(value_p2p) > 1000 ? QString::number(value_p2p/1000.0, 'f', 2) + "V" : QString::number(value_p2p, 'f', 2) + "mV"); + _ms_string[DSO_MS_VP2P] = tr("Vp-p: ") + (abs(value_p2p) > 1000 ? QString::number(value_p2p/1000.0, 'f', 2) + "V" : QString::number(value_p2p, 'f', 2) + "mV"); if (_probe->ms_show && _probe->ms_en[DSO_MS_VRMS]) { const deque< boost::shared_ptr > &snapshots = @@ -1350,9 +1344,9 @@ void DsoSignal::paint_measure(QPainter &p) if (!snapshots.empty()) { const boost::shared_ptr &snapshot = snapshots.front(); - const double vrms = snapshot->cal_vrms(_zero_value, get_index()); + const double vrms = snapshot->cal_vrms(cur_hw_offset, get_index()); const double value_vrms = vrms * _scale * _vDial->get_value() * _vDial->get_factor() * DS_CONF_DSO_VDIVS / get_view_rect().height(); - _ms_string[DSO_MS_VRMS] = "Vrms: " + (abs(value_vrms) > 1000 ? QString::number(value_vrms/1000.0, 'f', 2) + "V" : QString::number(value_vrms, 'f', 2) + "mV"); + _ms_string[DSO_MS_VRMS] = tr("Vrms: ") + (abs(value_vrms) > 1000 ? QString::number(value_vrms/1000.0, 'f', 2) + "V" : QString::number(value_vrms, 'f', 2) + "mV"); } } @@ -1363,18 +1357,18 @@ void DsoSignal::paint_measure(QPainter &p) const boost::shared_ptr &snapshot = snapshots.front(); const double vmean = snapshot->cal_vmean(get_index()); - const double value_vmean = (_zero_value - vmean) * _scale * _vDial->get_value() * _vDial->get_factor() * DS_CONF_DSO_VDIVS / get_view_rect().height(); - _ms_string[DSO_MS_VMEA] = "Vmean: " + (abs(value_vmean) > 1000 ? QString::number(value_vmean/1000.0, 'f', 2) + "V" : QString::number(value_vmean, 'f', 2) + "mV"); + const double value_vmean = (cur_hw_offset - vmean) * _scale * _vDial->get_value() * _vDial->get_factor() * DS_CONF_DSO_VDIVS / get_view_rect().height(); + _ms_string[DSO_MS_VMEA] = tr("Vmean: ") + (abs(value_vmean) > 1000 ? QString::number(value_vmean/1000.0, 'f', 2) + "V" : QString::number(value_vmean, 'f', 2) + "mV"); } } } else { - _ms_string[DSO_MS_VMAX] = "Vmax: #####"; - _ms_string[DSO_MS_VMIN] = "Vmin: #####"; - _ms_string[DSO_MS_PERD] = "Perd: #####"; - _ms_string[DSO_MS_FREQ] = "Freq: #####"; - _ms_string[DSO_MS_VP2P] = "Vp-p: #####"; - _ms_string[DSO_MS_VRMS] = "Vrms: #####"; - _ms_string[DSO_MS_VMEA] = "Vmean: #####"; + _ms_string[DSO_MS_VMAX] = tr("Vmax: #####"); + _ms_string[DSO_MS_VMIN] = tr("Vmin: #####"); + _ms_string[DSO_MS_PERD] = tr("Perd: #####"); + _ms_string[DSO_MS_FREQ] = tr("Freq: #####"); + _ms_string[DSO_MS_VP2P] = tr("Vp-p: #####"); + _ms_string[DSO_MS_VRMS] = tr("Vrms: #####"); + _ms_string[DSO_MS_VMEA] = tr("Vmean: #####"); } QColor measure_colour = _colour; @@ -1506,8 +1500,7 @@ bool DsoSignal::measure(const QPointF &p) const double scale = _view->scale(); assert(scale > 0); - const double offset = _view->offset(); - const double pixels_offset = offset / scale; + const int64_t pixels_offset = _view->offset(); const double samplerate = _dev_inst->get_sample_rate(); const double samples_per_pixel = samplerate * scale; @@ -1529,17 +1522,17 @@ bool DsoSignal::measure(const QPointF &p) const uint8_t cur_sample = *snapshot->get_samples(_hover_index, _hover_index, get_index()); const uint8_t nxt_sample = *snapshot->get_samples(nxt_index, nxt_index, get_index()); - _hover_value = (_zero_value - cur_sample) * _scale * _vDial->get_value() * _vDial->get_factor() * DS_CONF_DSO_VDIVS / get_view_rect().height(); + _hover_value = (cur_hw_offset - cur_sample) * _scale * _vDial->get_value() * _vDial->get_factor() * DS_CONF_DSO_VDIVS / get_view_rect().height(); float top = get_view_rect().top(); float bottom = get_view_rect().bottom(); float zeroP = _zero_vrate * get_view_rect().height() + top; float pre_x = (pre_index / samples_per_pixel - pixels_offset); - const float pre_y = min(max(top, zeroP + (pre_sample - _zero_value)* _scale), bottom); + const float pre_y = min(max(top, zeroP + (pre_sample - cur_hw_offset)* _scale), bottom); float x = (_hover_index / samples_per_pixel - pixels_offset); - const float y = min(max(top, zeroP + (cur_sample - _zero_value)* _scale), bottom); + const float y = min(max(top, zeroP + (cur_sample - cur_hw_offset)* _scale), bottom); float nxt_x = (nxt_index / samples_per_pixel - pixels_offset); - const float nxt_y = min(max(top, zeroP + (nxt_sample - _zero_value)* _scale), bottom); + const float nxt_y = min(max(top, zeroP + (nxt_sample - cur_hw_offset)* _scale), bottom); const QRectF slope_rect = QRectF(QPointF(pre_x - 10, pre_y - 10), QPointF(nxt_x + 10, nxt_y + 10)); if (abs(y-p.y()) < 20 || slope_rect.contains(p)) { _hover_point = QPointF(x, y); diff --git a/DSView/pv/view/dsosignal.h b/DSView/pv/view/dsosignal.h index 790bd61c..78d8522d 100644 --- a/DSView/pv/view/dsosignal.h +++ b/DSView/pv/view/dsosignal.h @@ -100,7 +100,7 @@ public: boost::shared_ptr dso_data() const; void set_viewport(pv::view::Viewport *viewport); - void set_scale(float scale); + void set_scale(int height); float get_scale(); /** @@ -115,7 +115,7 @@ public: bool go_vDialNext(); bool go_hDialPre(bool setted); bool go_hDialNext(bool setted); - bool go_hDialCur(); + bool update_capture(); uint64_t get_vDialValue() const; uint64_t get_hDialValue() const; uint16_t get_vDialSel() const; @@ -148,12 +148,12 @@ public: */ int get_zero_vpos(); double get_zero_vrate(); - double get_zero_value(); + double get_hw_offset(); /** * Sets the mid-Y position of this signal. */ void set_zero_vpos(int pos); - void set_zero_vrate(double rate); + void set_zero_vrate(double rate, bool force_update); void update_offset(); /** @@ -180,8 +180,6 @@ public: **/ void paint_fore(QPainter &p, int left, int right); - const std::vector< std::pair > cur_edges() const; - QRect get_view_rect() const; QRectF get_trig_rect(int left, int right) const; @@ -234,7 +232,7 @@ private: int _trig_value; double _trig_delta; double _zero_vrate; - float _zero_value; + float cur_hw_offset; uint8_t _max; uint8_t _min; diff --git a/DSView/pv/view/groupsignal.cpp b/DSView/pv/view/groupsignal.cpp index b48eefe5..0f60328e 100644 --- a/DSView/pv/view/groupsignal.cpp +++ b/DSView/pv/view/groupsignal.cpp @@ -81,7 +81,7 @@ void GroupSignal::paint_mid(QPainter &p, int left, int right) const int y = get_y() + _totalHeight * 0.5; const double scale = _view->scale(); assert(scale > 0); - const double offset = _view->offset(); + const int64_t offset = _view->offset(); _scale = _totalHeight * 1.0f / std::pow(2.0, static_cast(_index_list.size())); @@ -93,12 +93,11 @@ void GroupSignal::paint_mid(QPainter &p, int left, int right) const boost::shared_ptr &snapshot = snapshots.at(_sec_index); - const double pixels_offset = offset / scale; + const double pixels_offset = offset; const double samplerate = _data->samplerate(); - const double start_time = _data->get_start_time(); const int64_t last_sample = snapshot->get_sample_count() - 1; const double samples_per_pixel = samplerate * scale; - const double start = samplerate * (offset - start_time); + const double start = offset * samples_per_pixel; const double end = start + samples_per_pixel * (right - left); const int64_t start_sample = min(max((int64_t)floor(start), @@ -190,11 +189,6 @@ void GroupSignal::paint_envelope(QPainter &p, delete[] e.samples; } -const std::vector< std::pair > GroupSignal::cur_edges() const -{ - -} - void GroupSignal::paint_type_options(QPainter &p, int right, const QPoint pt) { (void)pt; diff --git a/DSView/pv/view/groupsignal.h b/DSView/pv/view/groupsignal.h index 711382ca..cae5aa8b 100644 --- a/DSView/pv/view/groupsignal.h +++ b/DSView/pv/view/groupsignal.h @@ -76,8 +76,6 @@ public: **/ void paint_mid(QPainter &p, int left, int right); - const std::vector< std::pair > cur_edges() const; - QRectF get_rect(GroupSetRegions type, int y, int right); protected: diff --git a/DSView/pv/view/header.cpp b/DSView/pv/view/header.cpp index 6e5e430e..d8aa85ca 100644 --- a/DSView/pv/view/header.cpp +++ b/DSView/pv/view/header.cpp @@ -75,9 +75,6 @@ Header::Header(View &parent) : connect(nameEdit, SIGNAL(editingFinished()), this, SLOT(on_action_set_name_triggered())); - - connect(&_view, SIGNAL(traces_moved()), - this, SLOT(on_traces_moved())); } @@ -322,7 +319,6 @@ void Header::mouseMoveEvent(QMouseEvent *event) } } } - //traces_moved(); } update(); } @@ -380,11 +376,6 @@ void Header::on_action_del_group_triggered() _view.session().del_group(); } -void Header::on_traces_moved() -{ - update(); -} - void Header::header_resize() { //if (nameEdit->isVisible()) { diff --git a/DSView/pv/view/header.h b/DSView/pv/view/header.h index 6d11b2fd..6bad7117 100644 --- a/DSView/pv/view/header.h +++ b/DSView/pv/view/header.h @@ -77,8 +77,6 @@ private slots: void on_action_del_group_triggered(); - void on_traces_moved(); - signals: void traces_moved(); void header_updated(); diff --git a/DSView/pv/view/logicsignal.cpp b/DSView/pv/view/logicsignal.cpp index e5d543b8..f0897c18 100644 --- a/DSView/pv/view/logicsignal.cpp +++ b/DSView/pv/view/logicsignal.cpp @@ -20,6 +20,7 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ +#include #include @@ -74,6 +75,7 @@ LogicSignal::LogicSignal(boost::shared_ptr s, LogicSignal::~LogicSignal() { _cur_edges.clear(); + _cur_pulses.clear(); } const sr_channel* LogicSignal::probe() const @@ -128,8 +130,6 @@ void LogicSignal::paint_mid(QPainter &p, int left, int right) { using pv::view::View; - QLineF *line; - assert(_data); assert(_view); assert(right >= left); @@ -137,10 +137,10 @@ void LogicSignal::paint_mid(QPainter &p, int left, int right) const int y = get_y() + _totalHeight * 0.5; const double scale = _view->scale(); assert(scale > 0); - const double offset = _view->offset(); + const int64_t offset = _view->offset(); - const float high_offset = y - _totalHeight + 0.5f; - const float low_offset = y + 0.5f; + const int high_offset = y - _totalHeight + 0.5f; + const int low_offset = y + 0.5f; const deque< boost::shared_ptr > &snapshots = _data->get_snapshots(); @@ -150,47 +150,60 @@ void LogicSignal::paint_mid(QPainter &p, int left, int right) const boost::shared_ptr &snapshot = snapshots.front(); - if (snapshot->empty()) + if (snapshot->empty() || !snapshot->has_data(_probe->index)) return; - const double pixels_offset = offset / scale; - const double start_time = _data->get_start_time(); const int64_t last_sample = snapshot->get_sample_count() - 1; const double samples_per_pixel = samplerate * scale; - const double start = samplerate * (offset - start_time); - const double end = start + samples_per_pixel * (right - left); - snapshot->get_subsampled_edges(_cur_edges, - min(max((int64_t)floor(start), (int64_t)0), last_sample), - min(max((int64_t)ceil(end), (int64_t)0), last_sample), - samples_per_pixel / Oversampling, _probe->index); - if (_cur_edges.size() < 2) + uint16_t width = right - left; + const double start = offset * samples_per_pixel; + const double end = (offset + width + 1) * samples_per_pixel; + const uint64_t end_index = min(max((int64_t)ceil(end), (int64_t)0), last_sample); + const uint64_t start_index = max((uint64_t)floor(start), (uint64_t)0); + if (start_index > end_index) return; + width = min(width, (uint16_t)ceil((end_index + 1)/samples_per_pixel - offset)); + const uint16_t max_togs = width / TogMaxScale; - // Paint the edges - const unsigned int edge_count = 2 * _cur_edges.size() - 3; - QLineF *const edge_lines = new QLineF[edge_count]; - line = edge_lines; + const bool first_sample = snapshot->get_display_edges(_cur_pulses, _cur_edges, + start_index, end_index, width, max_togs, + offset, + samples_per_pixel, _probe->index); + assert(_cur_pulses.size() >= width); - double preX = ((*(_cur_edges.begin())).first / samples_per_pixel - pixels_offset) + left; - double preY = (*(_cur_edges.begin())).second ? high_offset : low_offset; - vector::const_iterator i; - for ( i = _cur_edges.begin() + 1; i != _cur_edges.end() - 1; i++) { - const double x = ((*i).first / samples_per_pixel - - pixels_offset) + left; - const double y = (*i).second ? high_offset : low_offset; - *line++ = QLineF(preX, preY, x, preY); - *line++ = QLineF(x, high_offset, x, low_offset); - preX = x; - preY = y; + int preX = 0; + int preY = first_sample ? high_offset : low_offset; + int x = preX; + std::vector wave_lines; + if (_cur_edges.size() < max_togs) { + std::vector>::const_iterator i; + for (i = _cur_edges.begin() + 1; i != _cur_edges.end() - 1; i++) { + x = (*i).first; + wave_lines.push_back(QLine(preX, preY, x, preY)); + wave_lines.push_back(QLine(x, high_offset, x, low_offset)); + preX = x; + preY = (*i).second ? high_offset : low_offset; + } + x = (*i).first; + wave_lines.push_back(QLine(preX, preY, x, preY)); + } else { + std::vector>::const_iterator i = _cur_pulses.begin(); + while (i != _cur_pulses.end() - 1) { + if ((*i).first) { + wave_lines.push_back(QLine(preX, preY, x, preY)); + wave_lines.push_back(QLine(x, high_offset, x, low_offset)); + preX = x; + preY = (*i).second ? high_offset : low_offset; + } + x++; + i++; + } + wave_lines.push_back(QLine(preX, preY, x, preY)); } - const double x = ((*i).first / samples_per_pixel - - pixels_offset) + left; - *line++ = QLineF(preX, preY, x, preY); p.setPen(_colour); - p.drawLines(edge_lines, edge_count); - delete[] edge_lines; + p.drawLines(wave_lines.data(), wave_lines.size()); } void LogicSignal::paint_caps(QPainter &p, QLineF *const lines, @@ -216,11 +229,6 @@ void LogicSignal::paint_caps(QPainter &p, QLineF *const lines, p.drawLines(lines, line - lines); } -const std::vector< std::pair > LogicSignal::cur_edges() const -{ - return _cur_edges; -} - void LogicSignal::paint_type_options(QPainter &p, int right, const QPoint pt) { int y = get_y(); @@ -305,32 +313,43 @@ bool LogicSignal::measure(const QPointF &p, uint64_t &index0, uint64_t &index1, const boost::shared_ptr &snapshot = snapshots.front(); - if (snapshot->empty()) + if (snapshot->empty() || !snapshot->has_data(_probe->index)) return false; - uint64_t index = _data->samplerate() * (_view->offset() - _data->get_start_time() + p.x() * _view->scale()); - if (index == 0 || index >= (snapshot->get_sample_count() - 1)) + const uint64_t end = snapshot->get_sample_count() - 1; + uint64_t index = _data->samplerate() * _view->scale() * (_view->offset() + p.x()); + if (index > end) return false; - const uint64_t sig_mask = 1ULL << get_index(); - bool sample = snapshot->get_sample(index) & sig_mask; - index--; - if (!snapshot->get_pre_edge(index, sample, 1, get_index())) - return false; + bool sample = snapshot->get_sample(index, get_index()); + if (index == 0) + index0 = index; + else { + index--; + if (snapshot->get_pre_edge(index, sample, 1, get_index())) + index0 = index; + else + index0 = 0; + } - index0 = index; - sample = snapshot->get_sample(index) & sig_mask; + sample = snapshot->get_sample(index, get_index()); index++; - if (!snapshot->get_nxt_edge(index, sample, snapshot->get_sample_count(), 1, get_index())) - return false; - - index1 = index; - sample = snapshot->get_sample(index) & sig_mask; - index++; - if (!snapshot->get_nxt_edge(index, sample, snapshot->get_sample_count(), 1, get_index())) + if (snapshot->get_nxt_edge(index, sample, end, 1, get_index())) + index1 = index; + else { + if (index0 == 0) + return false; + index1 = end + 1; index2 = 0; - else + return true; + } + + sample = snapshot->get_sample(index, get_index()); + index++; + if (snapshot->get_nxt_edge(index, sample, end, 1, get_index())) index2 = index; + else + index2 = end + 1; return true; } @@ -343,44 +362,51 @@ bool LogicSignal::edges(const QPointF &p, uint64_t start, uint64_t &rising, uint uint64_t index, end; const float gap = abs(p.y() - get_y()); if (gap < get_totalHeight() * 0.5) { - const deque< boost::shared_ptr > &snapshots = - _data->get_snapshots(); - if (snapshots.empty()) - return false; - - const boost::shared_ptr &snapshot = - snapshots.front(); - if (snapshot->empty()) - return false; - - end = _data->samplerate() * (_view->offset() - _data->get_start_time() + p.x() * _view->scale()); - index = min(start, end); - end = max(start, end); - start = index; - if (end > (snapshot->get_sample_count() - 1)) - return false; - - const uint64_t sig_mask = 1ULL << get_index(); - bool sample = snapshot->get_sample(start) & sig_mask; - - rising = 0; - falling = 0; - do { - if (snapshot->get_nxt_edge(index, sample, snapshot->get_sample_count(), 1, get_index())) { - if (index > end) - break; - rising += !sample; - falling += sample; - sample = !sample; - } else { - break; - } - } while(index <= end); - return true; + end = _data->samplerate() * _view->scale() * (_view->offset() + p.x()); + return edges(end, start, rising, falling); } return false; } +bool LogicSignal::edges(uint64_t end, uint64_t start, uint64_t &rising, uint64_t &falling) const +{ + const deque< boost::shared_ptr > &snapshots = + _data->get_snapshots(); + if (snapshots.empty()) + return false; + + const boost::shared_ptr &snapshot = + snapshots.front(); + if (snapshot->empty() || !snapshot->has_data(_probe->index)) + return false; + + uint64_t index = min(start, end); + const uint64_t sample_count = snapshot->get_sample_count(); + end = max(start, end); + start = index; + if (end > (sample_count - 1)) + return false; + + const int ch_index = get_index(); + bool sample = snapshot->get_sample(start, ch_index); + + rising = 0; + falling = 0; + do { + if (snapshot->get_nxt_edge(index, sample, sample_count, 1, ch_index)) { + if (index > end) + break; + rising += !sample; + falling += sample; + sample = !sample; + } else { + break; + } + } while(index <= end); + + return true; +} + bool LogicSignal::mouse_press(int right, const QPoint pt) { int y = get_y(); @@ -439,5 +465,38 @@ QRectF LogicSignal::get_rect(LogicSetRegions type, int y, int right) return QRectF(0, 0, 0, 0); } + +void LogicSignal::paint_mark(QPainter &p, int xstart, int xend, int type) +{ + const int ypos = get_y(); + const int msize = 3; + p.setPen(p.brush().color()); + if (type == SRD_CHANNEL_SDATA) { + p.drawEllipse(QPoint(xstart, ypos), msize, msize); + } else if (type == SRD_CHANNEL_SCLK) { + const QPoint triangle[] = { + QPoint(xstart, ypos - 2), + QPoint(xstart-1, ypos - 1), + QPoint(xstart, ypos - 1), + QPoint(xstart+1, ypos - 1), + QPoint(xstart-2, ypos), + QPoint(xstart-1, ypos), + QPoint(xstart, ypos), + QPoint(xstart+1, ypos), + QPoint(xstart+2, ypos), + QPoint(xstart-3, ypos + 1), + QPoint(xstart-2, ypos + 1), + QPoint(xstart-1, ypos + 1), + QPoint(xstart, ypos + 1), + QPoint(xstart+1, ypos + 1), + QPoint(xstart+2, ypos + 1), + QPoint(xstart+3, ypos + 1), + }; + p.drawPoints(triangle, 16); + } else if (type == SRD_CHANNEL_ADATA) { + p.drawEllipse(QPoint((xstart+xend)/2, ypos), msize, msize); + } +} + } // namespace view } // namespace pv diff --git a/DSView/pv/view/logicsignal.h b/DSView/pv/view/logicsignal.h index 32f00683..b34f5646 100644 --- a/DSView/pv/view/logicsignal.h +++ b/DSView/pv/view/logicsignal.h @@ -53,6 +53,8 @@ private: static const int StateHeight; static const int StateRound; + static const int TogMaxScale = 10; + enum LogicSetRegions{ NONTRIG = 0, POSTRIG, @@ -94,16 +96,18 @@ public: **/ void paint_mid(QPainter &p, int left, int right); - const std::vector< std::pair > cur_edges() const; - bool measure(const QPointF &p, uint64_t &index0, uint64_t &index1, uint64_t &index2) const; bool edges(const QPointF &p, uint64_t start, uint64_t &rising, uint64_t &falling) const; + bool edges(uint64_t end, uint64_t start, uint64_t &rising, uint64_t &falling) const; + bool mouse_press(int right, const QPoint pt); QRectF get_rect(LogicSetRegions type, int y, int right); + void paint_mark(QPainter &p, int xstart, int xend, int type); + protected: void paint_type_options(QPainter &p, int right, const QPoint pt); @@ -116,7 +120,8 @@ private: private: boost::shared_ptr _data; - std::vector< std::pair > _cur_edges; + std::vector< std::pair > _cur_edges; + std::vector> _cur_pulses; LogicSetRegions _trig; }; diff --git a/DSView/pv/view/ruler.cpp b/DSView/pv/view/ruler.cpp index c14af957..89790e59 100644 --- a/DSView/pv/view/ruler.cpp +++ b/DSView/pv/view/ruler.cpp @@ -205,8 +205,9 @@ void Ruler::mouseMoveEvent(QMouseEvent *e) (void)e; if (_grabbed_marker) { - _grabbed_marker->set_index((_view.offset() + - _view.hover_point().x() * _view.scale()) * _view.session().cur_samplerate()); + _grabbed_marker->set_index((_view.offset() + _view.hover_point().x()) * + _view.scale() * _view.session().cur_samplerate()); + _view.cursor_moving(); } update(); @@ -228,6 +229,7 @@ void Ruler::mousePressEvent(QMouseEvent *e) void Ruler::mouseReleaseEvent(QMouseEvent *event) { bool addCursor = false; + bool visible; if (event->button() & Qt::LeftButton) { bool hitCursor = false; if (!_cursor_sel_visible & !_view.get_cursorList().empty()) { @@ -235,10 +237,12 @@ void Ruler::mouseReleaseEvent(QMouseEvent *event) if (_grabbed_marker) { rel_grabbed_cursor(); hitCursor = true; + _view.cursor_moved(); } else { list::iterator i = _view.get_cursorList().begin(); while (i != _view.get_cursorList().end()) { - if ((*i)->get_close_rect(rect()).contains(event->pos())) { + const QRect cursor_rect((*i)->get_label_rect(rect(), visible)); + if ((*i)->get_close_rect(cursor_rect).contains(event->pos())) { _view.del_cursor(*i); if (_view.get_cursorList().empty()) { _cursor_sel_visible = false; @@ -247,7 +251,7 @@ void Ruler::mouseReleaseEvent(QMouseEvent *event) hitCursor = true; break; } - if ((*i)->get_label_rect(rect()).contains(event->pos())) { + if (cursor_rect.contains(event->pos())) { set_grabbed_cursor(*i); _cursor_sel_visible = false; _cursor_go_visible = false; @@ -265,7 +269,7 @@ void Ruler::mouseReleaseEvent(QMouseEvent *event) _cursor_sel_visible = true; } else { int overCursor; - uint64_t index = (_view.offset() + (_cursor_sel_x + 0.5) * _view.scale()) * _view.session().cur_samplerate(); + uint64_t index = (_view.offset() + _cursor_sel_x + 0.5) * _view.scale() * _view.session().cur_samplerate(); overCursor = in_cursor_sel_rect(event->pos()); if (overCursor == 0) { _view.add_cursor(CursorColor[_view.get_cursorList().size() % 8], index); @@ -354,7 +358,7 @@ void Ruler::draw_tick_mark(QPainter &p) typical_width = p.boundingRect(0, 0, INT_MAX, INT_MAX, - AlignLeft | AlignTop, format_time(_view.offset(), + AlignLeft | AlignTop, format_time(_view.offset() * _view.scale(), prefix)).width() + MinValueSpacing; min_width += SpacingIncrement; @@ -369,9 +373,9 @@ void Ruler::draw_tick_mark(QPainter &p) const double minor_tick_period = tick_period / MinorTickSubdivision; const double first_major_division = - floor(_view.offset() / tick_period); + floor(_view.offset() * _view.scale() / tick_period); const double first_minor_division = - ceil(_view.offset() / minor_tick_period); + ceil(_view.offset() * _view.scale() / minor_tick_period); const double t0 = first_major_division * tick_period; int division = (int)round(first_minor_division - @@ -385,7 +389,7 @@ void Ruler::draw_tick_mark(QPainter &p) do { const double t = t0 + division * minor_tick_period; - x = (t - _view.offset()) / _view.scale(); + x = t / _view.scale() - _view.offset(); if (division % MinorTickSubdivision == 0) { @@ -432,7 +436,7 @@ void Ruler::draw_logic_tick_mark(QPainter &p) double typical_width; double tick_period = 0; double scale = _view.scale(); - double offset = _view.offset(); + int64_t offset = _view.offset(); const uint64_t cur_period_scale = ceil((scale * min_width) / abs_min_period); @@ -449,7 +453,7 @@ void Ruler::draw_logic_tick_mark(QPainter &p) _cur_prefix = prefix; assert(prefix < countof(SIPrefixes)); typical_width = p.boundingRect(0, 0, INT_MAX, INT_MAX, - AlignLeft | AlignTop, format_time(offset, + AlignLeft | AlignTop, format_time(offset * scale, prefix)).width() + MinValueSpacing; do { @@ -470,9 +474,9 @@ void Ruler::draw_logic_tick_mark(QPainter &p) assert(minor_prefix < countof(SIPrefixes)); const double first_major_division = - floor(offset / tick_period); + floor(offset * scale / tick_period); const double first_minor_division = - floor(offset / minor_tick_period + 1); + floor(offset * scale / minor_tick_period + 1); const double t0 = first_major_division * tick_period; int division = (int)round(first_minor_division - @@ -482,7 +486,7 @@ void Ruler::draw_logic_tick_mark(QPainter &p) const int tick_y2 = height(); const int minor_tick_y1 = (major_tick_y1 + tick_y2) / 2; - double x; + int x; const double inc_text_width = p.boundingRect(0, 0, INT_MAX, INT_MAX, AlignLeft | AlignTop, @@ -492,7 +496,7 @@ void Ruler::draw_logic_tick_mark(QPainter &p) const double t = t0 + division * minor_tick_period; const double major_t = t0 + floor(division / MinPeriodScale) * tick_period; - x = (t - offset) / scale; + x = t / scale - offset; if (division % MinPeriodScale == 0) { @@ -500,8 +504,8 @@ void Ruler::draw_logic_tick_mark(QPainter &p) p.drawText(x, 2 * ValueMargin, 0, text_height, AlignCenter | AlignTop | TextDontClip, format_time(t, prefix)); - p.drawLine(QPointF(x, major_tick_y1), - QPointF(x, tick_y2)); + p.drawLine(QPoint(x, major_tick_y1), + QPoint(x, tick_y2)); } else { @@ -516,8 +520,8 @@ void Ruler::draw_logic_tick_mark(QPainter &p) p.drawText(x, 2 * ValueMargin, 0, minor_tick_y1 + ValueMargin, AlignCenter | AlignTop | TextDontClip, format_time(t - major_t, minor_prefix)); - p.drawLine(QPointF(x, minor_tick_y1), - QPointF(x, tick_y2)); + p.drawLine(QPoint(x, minor_tick_y1), + QPoint(x, tick_y2)); } division++; @@ -533,13 +537,12 @@ void Ruler::draw_logic_tick_mark(QPainter &p) index++; i++; } - _view.on_cursor_moved(); } if (_view.trig_cursor_shown()) { - _view.get_trig_cursor()->paint_fix_label(p, rect(), prefix, 'T', Trace::dsLightRed); + _view.get_trig_cursor()->paint_fix_label(p, rect(), prefix, 'T', _view.get_trig_cursor()->colour()); } if (_view.search_cursor_shown()) { - _view.get_search_cursor()->paint_fix_label(p, rect(), prefix, 'S', Trace::dsLightBlue); + _view.get_search_cursor()->paint_fix_label(p, rect(), prefix, 'S', _view.get_search_cursor()->colour()); } } diff --git a/DSView/pv/view/signal.h b/DSView/pv/view/signal.h index 82e17e92..2d73549e 100644 --- a/DSView/pv/view/signal.h +++ b/DSView/pv/view/signal.h @@ -67,8 +67,6 @@ protected: public: virtual boost::shared_ptr data() const = 0; - virtual const std::vector< std::pair > cur_edges() const = 0; - /** * Returns true if the trace is visible and enabled. */ diff --git a/DSView/pv/view/timemarker.cpp b/DSView/pv/view/timemarker.cpp index d6eb74f9..2c8d8d73 100644 --- a/DSView/pv/view/timemarker.cpp +++ b/DSView/pv/view/timemarker.cpp @@ -24,6 +24,7 @@ #include "timemarker.h" #include "view.h" +#include "ruler.h" #include "../device/device.h" #include @@ -48,6 +49,16 @@ TimeMarker::TimeMarker(const TimeMarker &s) : { } +QColor TimeMarker::colour() const +{ + return _colour; +} + +void TimeMarker::set_colour(QColor color) +{ + _colour = color; +} + bool TimeMarker::grabbed() const { return _grabbed; @@ -68,14 +79,15 @@ void TimeMarker::set_index(uint64_t index) time_changed(); } -void TimeMarker::paint(QPainter &p, const QRect &rect, const bool highlight) +void TimeMarker::paint(QPainter &p, const QRect &rect, const bool highlight, int order) { const uint64_t sample_rate = _view.session().cur_samplerate(); const double scale = _view.scale(); const double samples_per_pixel = sample_rate * scale; - const double x = _index/samples_per_pixel - (_view.offset() / scale); - p.setPen((_grabbed | highlight) ? QPen(_colour.lighter(), 2, Qt::DashLine) : QPen(_colour, 1, Qt::DashLine)); - p.drawLine(QPointF(x, rect.top()), QPointF(x, rect.bottom())); + const int64_t x = _index/samples_per_pixel - _view.offset(); + QColor color = (order == -1) ? _colour : Ruler::CursorColor[order%8]; + p.setPen((_grabbed | highlight) ? QPen(color.lighter(), 2, Qt::DashLine) : QPen(color, 1, Qt::DashLine)); + p.drawLine(QPoint(x, rect.top()), QPoint(x, rect.bottom())); } } // namespace view diff --git a/DSView/pv/view/timemarker.h b/DSView/pv/view/timemarker.h index 71ee4cfe..5cd34450 100644 --- a/DSView/pv/view/timemarker.h +++ b/DSView/pv/view/timemarker.h @@ -68,6 +68,12 @@ public: */ void set_index(uint64_t index); + /** + * Gets/Sets colour of the marker + */ + QColor colour() const; + void set_colour(QColor color); + /* * */ @@ -79,14 +85,15 @@ public: * @param p The painter to draw with. * @param rect The rectangle of the viewport client area. */ - virtual void paint(QPainter &p, const QRect &rect, const bool highlight); + virtual void paint(QPainter &p, const QRect &rect, const bool highlight, int order); /** * Gets the marker label rectangle. * @param rect The rectangle of the ruler client area. + * @param visible is this marker in visible area * @return Returns the label rectangle. */ - virtual QRectF get_label_rect(const QRect &rect) const = 0; + virtual QRect get_label_rect(const QRect &rect, bool &visible) const = 0; /** * Paints the marker's label to the ruler. diff --git a/DSView/pv/view/view.cpp b/DSView/pv/view/view.cpp index 4a6f0d2e..24051c45 100644 --- a/DSView/pv/view/view.cpp +++ b/DSView/pv/view/view.cpp @@ -73,7 +73,7 @@ View::View(SigSession &session, pv::toolbars::SamplingBar *sampling_bar, QWidget QScrollArea(parent), _session(session), _sampling_bar(sampling_bar), - _scale(1e-5), + _scale(10), _preScale(1e-6), _maxscale(1e9), _minscale(1e-15), @@ -82,6 +82,7 @@ View::View(SigSession &session, pv::toolbars::SamplingBar *sampling_bar, QWidget _updating_scroll(false), _show_cursors(false), _hover_point(-1, -1), + _search_hit(false), _dso_auto(true) { setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOn); @@ -113,6 +114,7 @@ View::View(SigSession &session, pv::toolbars::SamplingBar *sampling_bar, QWidget _time_viewport->setMinimumHeight(100); connect(_time_viewport, SIGNAL(measure_updated()), this, SLOT(on_measure_updated())); + connect(_time_viewport, SIGNAL(prgRate(int)), this, SIGNAL(prgRate(int))); _fft_viewport = new Viewport(*this, FFT_VIEW); _fft_viewport->setVisible(false); _fft_viewport->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred); @@ -140,7 +142,7 @@ View::View(SigSession &session, pv::toolbars::SamplingBar *sampling_bar, QWidget layout->setContentsMargins(0,0,0,0); _viewcenter->setLayout(layout); layout->addWidget(_vsplitter, 0, 0); - _viewbottom = new widgets::ViewStatus(this); + _viewbottom = new widgets::ViewStatus(_session, this); _viewbottom->setFixedHeight(StatusHeight); layout->addWidget(_viewbottom, 1, 0); setViewport(_viewcenter); @@ -153,21 +155,21 @@ View::View(SigSession &session, pv::toolbars::SamplingBar *sampling_bar, QWidget this, SLOT(signals_changed()), Qt::DirectConnection); connect(&_session, SIGNAL(data_updated()), this, SLOT(data_updated())); - connect(&_session, SIGNAL(receive_header()), - this, SLOT(receive_header())); connect(&_session, SIGNAL(receive_trigger(quint64)), this, SLOT(receive_trigger(quint64))); connect(&_session, SIGNAL(frame_ended()), this, SLOT(receive_end())); connect(&_session, SIGNAL(frame_began()), this, SLOT(frame_began())); - connect(&_session, SIGNAL(show_region(uint64_t,uint64_t)), - this, SLOT(show_region(uint64_t, uint64_t))); + connect(&_session, SIGNAL(show_region(uint64_t, uint64_t, bool)), + this, SLOT(show_region(uint64_t, uint64_t, bool))); connect(&_session, SIGNAL(show_wait_trigger()), _time_viewport, SLOT(show_wait_trigger())); + connect(&_session, SIGNAL(repeat_hold(int)), + this, SLOT(repeat_show())); connect(_devmode, SIGNAL(mode_changed()), - parent, SLOT(mode_changed()), Qt::DirectConnection); + this, SLOT(mode_changed()), Qt::DirectConnection); connect(_header, SIGNAL(traces_moved()), this, SLOT(on_traces_moved())); @@ -188,7 +190,7 @@ View::View(SigSession &session, pv::toolbars::SamplingBar *sampling_bar, QWidget _trig_cursor = new Cursor(*this, Trace::dsLightRed, 0); _show_search_cursor = false; _search_pos = 0; - _search_cursor = new Cursor(*this, Trace::dsLightBlue, _search_pos); + _search_cursor = new Cursor(*this, Trace::dsGray, _search_pos); _cali = new pv::dialogs::Calibration(this); _cali->hide(); @@ -204,7 +206,7 @@ double View::scale() const return _scale; } -double View::offset() const +int64_t View::offset() const { return _offset; } @@ -219,6 +221,17 @@ double View::get_maxscale() const return _maxscale; } +void View::capture_init(bool instant) +{ + if (_session.get_device()->dev_inst()->mode == DSO) + show_trig_cursor(true); + else if (!_session.isRepeating()) + show_trig_cursor(false); + + update_sample(instant); + status_clear(); +} + void View::zoom(double steps) { zoom(steps, get_view_width() / 2); @@ -241,7 +254,7 @@ void View::update_sample(bool instant) BOOST_FOREACH(const boost::shared_ptr s, _session.get_signals()) { boost::shared_ptr dsoSig; if (dsoSig = dynamic_pointer_cast(s)) { - dsoSig->go_hDialCur(); + dsoSig->update_capture(); break; } } @@ -271,7 +284,6 @@ void View::zoom(double steps, int offset) _preScale = _scale; _preOffset = _offset; - const double cursor_offset = _offset + _scale * offset; if (_session.get_device()->dev_inst()->mode != DSO) { _scale *= std::pow(3.0/2.0, -steps); _scale = max(min(_scale, _maxscale), _minscale); @@ -292,7 +304,7 @@ void View::zoom(double steps, int offset) } } - _offset = cursor_offset - _scale * offset; + _offset = floor((_offset + offset) * (_preScale / _scale) - offset); _offset = max(min(_offset, get_max_offset()), get_min_offset()); if (_scale != _preScale || _offset != _preOffset) { @@ -305,14 +317,14 @@ void View::zoom(double steps, int offset) } -void View::set_scale_offset(double scale, double offset) +void View::set_scale_offset(double scale, int64_t offset) { //if (_session.get_capture_state() == SigSession::Stopped) { _preScale = _scale; _preOffset = _offset; _scale = max(min(scale, _maxscale), _minscale); - _offset = max(min(offset, get_max_offset()), get_min_offset()); + _offset = floor(max(min(offset, get_max_offset()), get_min_offset())); if (_scale != _preScale || _offset != _preOffset) { update_scroll(); @@ -419,15 +431,18 @@ void View::status_clear() _viewbottom->clear(); } -void View::receive_header() +void View::repeat_unshow() { - status_clear(); + _viewbottom->repeat_unshow(); } void View::frame_began() { if (_session.get_device()->dev_inst()->mode == LOGIC) _viewbottom->set_trig_time(_session.get_trigger_time()); + _search_hit = false; + _search_pos = 0; + set_search_pos(_search_pos, _search_hit); } void View::receive_end() @@ -460,7 +475,7 @@ void View::receive_trigger(quint64 trig_pos) _session.get_device()->name() == "virtual-session" || _session.get_device()->dev_inst()->mode == DSO) { _show_trig_cursor = true; - set_scale_offset(_scale, time - _scale * get_view_width() / 2); + set_scale_offset(_scale, (time / _scale) - (get_view_width() / 2)); } _ruler->update(); @@ -473,16 +488,21 @@ void View::set_trig_pos(int percent) receive_trigger(index); } -void View::set_search_pos(uint64_t search_pos) +void View::set_search_pos(uint64_t search_pos, bool hit) { //assert(search_pos >= 0); const double time = search_pos * 1.0 / _session.cur_samplerate(); _search_pos = search_pos; + _search_hit = hit; _search_cursor->set_index(search_pos); - set_scale_offset(_scale, time - _scale * get_view_width() / 2); - _ruler->update(); - viewport_update(); + _search_cursor->set_colour(hit ? Trace::dsLightBlue : Trace::dsGray); + + if (hit) { + set_scale_offset(_scale, (time / _scale) - (get_view_width() / 2)); + _ruler->update(); + viewport_update(); + } } uint64_t View::get_search_pos() @@ -490,6 +510,11 @@ uint64_t View::get_search_pos() return _search_pos; } +bool View::get_search_hit() +{ + return _search_hit; +} + const QPoint& View::hover_point() const { return _hover_point; @@ -522,14 +547,14 @@ int View::get_signalHeight() return _signalHeight; } -void View::get_scroll_layout(double &length, double &offset) const +void View::get_scroll_layout(int64_t &length, int64_t &offset) const { const set< boost::shared_ptr > data_set = _session.get_data(); if (data_set.empty()) return; - length = _session.get_device()->get_sample_time() / _scale; - offset = _offset / _scale; + length = ceil(_session.cur_sampletime() / _scale); + offset = _offset; } void View::update_scroll() @@ -539,9 +564,10 @@ void View::update_scroll() const QSize areaSize = _viewcenter->size(); // Set the horizontal scroll bar - double length = 0, offset = 0; + int64_t length = 0; + int64_t offset = 0; get_scroll_layout(length, offset); - length = max(length - areaSize.width(), 0.0); + length = max(length - areaSize.width(), (int64_t)0); horizontalScrollBar()->setPageStep(areaSize.width() / 2); @@ -553,7 +579,7 @@ void View::update_scroll() } else { horizontalScrollBar()->setRange(0, MaxScrollValue); horizontalScrollBar()->setSliderPosition( - _offset * MaxScrollValue / (_scale * length)); + _offset * MaxScrollValue / length); } _updating_scroll = false; @@ -569,7 +595,6 @@ void View::update_scale_offset() assert(sample_rate > 0); if (_session.get_device()->dev_inst()->mode != DSO) { - //_scale = (1.0 / sample_rate) / WellPixelsPerSample; _maxscale = _session.cur_sampletime() / (get_view_width() * MaxViewRate); _minscale = (1.0 / sample_rate) / MaxPixelsPerSample; } else { @@ -578,7 +603,6 @@ void View::update_scale_offset() _minscale = 1e-15; } - _scale = max(min(_scale, _maxscale), _minscale); _offset = max(min(_offset, get_max_offset()), get_min_offset()); @@ -591,6 +615,18 @@ void View::update_scale_offset() viewport_update(); } +void View::mode_changed() +{ + const uint64_t sample_rate = _session.cur_samplerate(); + assert(sample_rate > 0); + + if (_session.get_device()->name().contains("virtual")) + _scale = WellSamplesPerPixel * 1.0 / sample_rate; + _scale = max(min(_scale, _maxscale), _minscale); + + update_device_list(); +} + void View::signals_changed() { int total_rows = 0; @@ -624,7 +660,7 @@ void View::signals_changed() _fft_viewport->setVisible(false); _vsplitter->refresh(); - // Find the decoder in the stack + // Find the _fft_viewport in the stack std::list< Viewport *>::iterator iter = _viewport_list.begin(); for(unsigned int i = 0; i < _viewport_list.size(); i++, iter++) if ((*iter) == _fft_viewport) @@ -671,12 +707,7 @@ void View::signals_changed() boost::shared_ptr dsoSig; if (dsoSig = dynamic_pointer_cast(t)) { - GVariant *gvar = _session.get_device()->get_config(NULL, NULL, SR_CONF_DSO_BITS); - if (gvar != NULL) { - bits = g_variant_get_byte(gvar); - g_variant_unref(gvar); - } - dsoSig->set_scale(dsoSig->get_view_rect().height() * 1.0f / (1 << bits)); + dsoSig->set_scale(dsoSig->get_view_rect().height()); } } _time_viewport->clear_measure(); @@ -695,10 +726,11 @@ bool View::eventFilter(QObject *object, QEvent *event) const QMouseEvent *const mouse_event = (QMouseEvent*)event; if (object == _ruler || object == _time_viewport || object == _fft_viewport) { //_hover_point = QPoint(mouse_event->x(), 0); - double cur_periods = (mouse_event->pos().x() * _scale + _offset) / _ruler->get_min_period(); - int integer_x = (round(cur_periods) * _ruler->get_min_period() - _offset ) / _scale; + double cur_periods = (mouse_event->pos().x() + _offset) * _scale / _ruler->get_min_period(); + int integer_x = round(cur_periods) * _ruler->get_min_period() / _scale - _offset; double cur_deviate_x = qAbs(mouse_event->pos().x() - integer_x); - if (cur_deviate_x < 10) + if (_session.get_device()->dev_inst()->mode == LOGIC && + cur_deviate_x < 10) _hover_point = QPoint(integer_x, mouse_event->pos().y()); else _hover_point = mouse_event->pos(); @@ -789,11 +821,12 @@ void View::h_scroll_value_changed(int value) const int range = horizontalScrollBar()->maximum(); if (range < MaxScrollValue) - _offset = _scale * value; + _offset = value; else { - double length = 0, offset; + int64_t length = 0; + int64_t offset = 0; get_scroll_layout(length, offset); - _offset = _scale * length * value / MaxScrollValue; + _offset = floor(length * value / MaxScrollValue); } _offset = max(min(_offset, get_max_offset()), get_min_offset()); @@ -859,7 +892,6 @@ void View::on_traces_moved() update_scroll(); set_update(_time_viewport, true); viewport_update(); - //traces_moved(); } /* @@ -908,7 +940,7 @@ void View::set_cursor_middle(int index) list::iterator i = _cursorList.begin(); while (index-- != 0) i++; - set_scale_offset(_scale, (*i)->index() * 1.0 / _session.cur_samplerate() - _scale * get_view_width() / 2); + set_scale_offset(_scale, (*i)->index() / (_session.cur_samplerate() * _scale) - (get_view_width() / 2)); } void View::on_measure_updated() @@ -955,11 +987,6 @@ uint64_t View::get_cursor_samples(int index) } } -void View::on_cursor_moved() -{ - cursor_moved(); -} - void View::set_measure_en(int enable) { BOOST_FOREACH(Viewport *viewport, _viewport_list) @@ -1017,15 +1044,18 @@ int View::get_view_height() return view_height; } -double View::get_min_offset() +int64_t View::get_min_offset() { - return -(_scale * (get_view_width() * (1 - MaxViewRate))); + if (MaxViewRate > 1) + return floor(get_view_width() * (1 - MaxViewRate)); + else + return 0; } -double View::get_max_offset() +int64_t View::get_max_offset() { - return _session.get_device()->get_sample_time() - - _scale * (get_view_width() * MaxViewRate); + return ceil((_session.cur_sampletime() / _scale) - + (get_view_width() * MaxViewRate)); } // -- calibration dialog @@ -1047,13 +1077,22 @@ void View::update_calibration() } } -void View::show_region(uint64_t start, uint64_t end) +void View::show_region(uint64_t start, uint64_t end, bool keep) { assert(start <= end); - const double ideal_scale = (end-start) * 2.0 / _session.cur_samplerate() / get_view_width(); - const double new_scale = max(min(ideal_scale, _maxscale), _minscale); - const double new_off = (start + end) * 0.5 / _session.cur_samplerate() - new_scale * get_view_width() / 2; - set_scale_offset(new_scale, new_off); + if (keep) { + set_all_update(true); + update(); + } else if (_session.get_map_zoom() == 0) { + const double ideal_scale = (end-start) * 2.0 / _session.cur_samplerate() / get_view_width(); + const double new_scale = max(min(ideal_scale, _maxscale), _minscale); + const double new_off = (start + end) * 0.5 / (_session.cur_samplerate() * new_scale) - (get_view_width() / 2); + set_scale_offset(new_scale, new_off); + } else { + const double new_scale = scale(); + const double new_off = (start + end) * 0.5 / (_session.cur_samplerate() * new_scale) - (get_view_width() / 2); + set_scale_offset(new_scale, new_off); + } } void View::viewport_update() @@ -1082,8 +1121,48 @@ void View::reload() _viewbottom->setFixedHeight(StatusHeight); else _viewbottom->setFixedHeight(10); +} + +void View::repeat_show() +{ + _viewbottom->update(); +} + +bool View::get_capture_status(bool &triggered, int &progress) +{ + uint64_t sample_limits = _session.cur_samplelimits(); + sr_status status; + if (sr_status_get(_session.get_device()->dev_inst(), &status, SR_STATUS_TRIG_BEGIN, SR_STATUS_TRIG_END) == SR_OK){ + triggered = status.trig_hit & 0x01; + const bool captured_cnt_dec = status.trig_hit & 0x02; + uint64_t captured_cnt = status.trig_hit >> 2; + captured_cnt = ((uint64_t)status.captured_cnt0 + + ((uint64_t)status.captured_cnt1 << 8) + + ((uint64_t)status.captured_cnt2 << 16) + + ((uint64_t)status.captured_cnt3 << 24) + + (captured_cnt << 32)); + if (_session.get_device()->dev_inst()->mode == DSO) + captured_cnt = captured_cnt * _session.get_signals().size() / _session.get_ch_num(SR_CHANNEL_DSO); + if (captured_cnt_dec) + progress = (sample_limits - captured_cnt) * 100.0 / sample_limits; + else + progress = captured_cnt * 100.0 / sample_limits; + return true; + } + + return false; +} + +void View::set_capture_status() +{ + bool triggered; + int progress; + if (_session.get_capture_status(triggered, progress)) { + _viewbottom->set_capture_status(triggered, progress); + _viewbottom->update(); + } } } // namespace view diff --git a/DSView/pv/view/view.h b/DSView/pv/view/view.h index 4132257c..88d62b11 100644 --- a/DSView/pv/view/view.h +++ b/DSView/pv/view/view.h @@ -80,7 +80,7 @@ public: static const QSizeF LabelPadding; - static const int WellPixelsPerSample = 10; + static const int WellSamplesPerPixel = 2048; static constexpr double MaxViewRate = 1.0; static const int MaxPixelsPerSample = 100; @@ -97,14 +97,15 @@ public: double scale() const; /** - * Returns the time offset of the left edge of the view in - * seconds. + * Returns the pixels offset of the left edge of the view */ - double offset() const; + int64_t offset() const; int v_offset() const; - double get_min_offset(); - double get_max_offset(); + int64_t get_min_offset(); + int64_t get_max_offset(); + + void capture_init(bool instant); void zoom(double steps); void zoom(double steps, int offset); @@ -114,7 +115,7 @@ public: * @param scale The new view scale in seconds per pixel. * @param offset The view time offset in seconds. */ - void set_scale_offset(double scale, double offset); + void set_scale_offset(double scale, int64_t offset); void set_preScale_preOffset(); std::vector< boost::shared_ptr > get_traces(int type); @@ -157,8 +158,9 @@ public: Cursor* get_trig_cursor(); Cursor* get_search_cursor(); + bool get_search_hit(); - void set_search_pos(uint64_t search_pos); + void set_search_pos(uint64_t search_pos, bool hit); uint64_t get_search_pos(); @@ -175,8 +177,6 @@ public: QString get_cm_time(int index); QString get_cm_delta(int index1, int index2); - void on_cursor_moved(); - void on_state_changed(bool stop); QRect get_view_rect(); @@ -193,19 +193,25 @@ public: void viewport_update(); + bool get_capture_status(bool &triggered, int &progress); + void set_capture_status(); + signals: void hover_point_changed(); - void traces_moved(); - void cursor_update(); + void cursor_moving(); void cursor_moved(); void measure_updated(); + void prgRate(int progress); + + void update_device_list(); + private: - void get_scroll_layout(double &length, double &offset) const; + void get_scroll_layout(int64_t &length, int64_t &offset) const; void update_scroll(); @@ -228,11 +234,14 @@ public slots: void signals_changed(); void data_updated(); void update_scale_offset(); - void show_region(uint64_t start, uint64_t end); + void show_region(uint64_t start, uint64_t end, bool keep); // -- calibration void update_calibration(); void hide_calibration(); void status_clear(); + void repeat_unshow(); + // -- repeat + void repeat_show(); private slots: @@ -245,8 +254,6 @@ private slots: void header_updated(); - void receive_header(); - void receive_trigger(quint64 trig_pos); void set_trig_pos(int percent); @@ -260,6 +267,8 @@ private slots: void splitterMoved(int pos, int index); + void mode_changed(); + private: SigSession &_session; @@ -279,32 +288,29 @@ private: /// The view time scale in seconds per pixel. double _scale; - double _preScale; - double _maxscale; - double _minscale; + double _preScale; + double _maxscale; + double _minscale; - /// The view time offset in seconds. - double _offset; - double _preOffset; - - int _spanY; - int _signalHeight; - - bool _updating_scroll; + /// The pixels offset of the left edge of the view + int64_t _offset; + int64_t _preOffset; + int _spanY; + int _signalHeight; + bool _updating_scroll; bool _show_cursors; + std::list _cursorList; + Cursor *_trig_cursor; + bool _show_trig_cursor; + Cursor *_search_cursor; + bool _show_search_cursor; + uint64_t _search_pos; + bool _search_hit; - std::list _cursorList; - - Cursor *_trig_cursor; - bool _show_trig_cursor; - Cursor *_search_cursor; - bool _show_search_cursor; - uint64_t _search_pos; - - QPoint _hover_point; - dialogs::Calibration *_cali; - bool _dso_auto; + QPoint _hover_point; + dialogs::Calibration *_cali; + bool _dso_auto; }; } // namespace view diff --git a/DSView/pv/view/viewport.cpp b/DSView/pv/view/viewport.cpp index 92fdaae1..37d69fe7 100644 --- a/DSView/pv/view/viewport.cpp +++ b/DSView/pv/view/viewport.cpp @@ -57,7 +57,7 @@ Viewport::Viewport(View &parent, View_type type) : _view(parent), _type(type), _need_update(false), - _total_receive_len(0), + _sample_received(0), _action_type(NO_ACTION), _measure_type(NO_MEASURE), _cur_sample(0), @@ -81,15 +81,13 @@ Viewport::Viewport(View &parent, View_type type) : _mm_freq = "#####"; _mm_duty = "#####"; _measure_en = true; - triggered = false; + transfer_started = false; timer_cnt = 0; // drag inertial _drag_strength = 0; _drag_timer.setSingleShot(true); - connect(&_view, SIGNAL(traces_moved()), - this, SLOT(on_traces_moved())); connect(&trigger_timer, SIGNAL(timeout()), this, SLOT(on_trigger_timer())); connect(&_drag_timer, SIGNAL(timeout()), @@ -135,7 +133,7 @@ void Viewport::paintEvent(QPaintEvent *event) { assert(t); t->paint_back(p, 0, _view.get_view_width()); - if (t->enabled() && _view.session().get_device()->dev_inst()->mode == DSO) + if (_view.session().get_device()->dev_inst()->mode == DSO) break; } @@ -151,7 +149,12 @@ void Viewport::paintEvent(QPaintEvent *event) break; case SigSession::Running: - if (_type == TIME_VIEW) { + if (_view.session().isRepeating() && + !transfer_started) { + _view.set_capture_status(); + paintSignals(p); + } else if (_type == TIME_VIEW) { + _view.repeat_unshow(); p.setRenderHint(QPainter::Antialiasing); paintProgress(p); p.setRenderHint(QPainter::Antialiasing, false); @@ -205,27 +208,33 @@ void Viewport::paintSignals(QPainter &p) p.drawPixmap(0, 0, pixmap); // plot cursors + const double samples_per_pixel = _view.session().cur_samplerate() * _view.scale(); if (_view.cursors_shown() && _type == TIME_VIEW) { list::iterator i = _view.get_cursorList().begin(); - double cursorX; - const double samples_per_pixel = _view.session().cur_samplerate() * _view.scale(); + int index = 0; while (i != _view.get_cursorList().end()) { - cursorX = (*i)->index()/samples_per_pixel - (_view.offset() / _view.scale()); + const int64_t cursorX = (*i)->index()/samples_per_pixel - _view.offset(); if (rect().contains(_view.hover_point().x(), _view.hover_point().y()) && qAbs(cursorX - _view.hover_point().x()) <= HitCursorMargin) - (*i)->paint(p, rect(), 1); + (*i)->paint(p, rect(), 1, index); else - (*i)->paint(p, rect(), 0); + (*i)->paint(p, rect(), 0, index); i++; + index++; } } if (_type == TIME_VIEW) { if (_view.trig_cursor_shown()) { - _view.get_trig_cursor()->paint(p, rect(), 0); + _view.get_trig_cursor()->paint(p, rect(), 0, -1); } if (_view.search_cursor_shown()) { - _view.get_search_cursor()->paint(p, rect(), 0); + const int64_t searchX = _view.get_search_cursor()->index()/samples_per_pixel - _view.offset(); + if (rect().contains(_view.hover_point().x(), _view.hover_point().y()) && + qAbs(searchX - _view.hover_point().x()) <= HitCursorMargin) + _view.get_search_cursor()->paint(p, rect(), 1, -1); + else + _view.get_search_cursor()->paint(p, rect(), 0, -1); } // plot zoom rect @@ -276,9 +285,9 @@ void Viewport::paintProgress(QPainter &p) { using pv::view::Signal; - const uint64_t _total_sample_len = _view.session().cur_samplelimits(); + const uint64_t sample_limits = _view.session().cur_samplelimits(); - double progress = -(_total_receive_len * 1.0 / _total_sample_len * 360 * 16); + double progress = -(_sample_received * 1.0 / sample_limits * 360 * 16); int captured_progress = 0; p.setPen(Qt::gray); @@ -344,7 +353,7 @@ void Viewport::paintProgress(QPainter &p) p.drawEllipse(logoPoints[19].x() - 0.5 * logoRadius, logoPoints[19].y() - logoRadius, logoRadius, logoRadius); - if (!triggered) { + if (!transfer_started) { const int width = _view.get_view_width(); const QPoint cenLeftPos = QPoint(width / 2 - 0.05 * width, height() / 2); const QPoint cenRightPos = QPoint(width / 2 + 0.05 * width, height() / 2); @@ -359,37 +368,38 @@ void Viewport::paintProgress(QPainter &p) p.drawEllipse(cenRightPos, trigger_radius, trigger_radius); sr_status status; - if (sr_status_get(_view.session().get_device()->dev_inst(), &status, SR_STATUS_TRIG_BEGIN, SR_STATUS_TRIG_END) == SR_OK){ - const bool triggred = status.trig_hit & 0x01; - uint32_t captured_cnt = (status.captured_cnt0 + - (status.captured_cnt1 << 8) + - (status.captured_cnt2 << 16) + - (status.captured_cnt3 << 24)); - if (_view.session().get_device()->dev_inst()->mode == DSO) - captured_cnt = captured_cnt * _view.session().get_signals().size() / _view.session().get_ch_num(SR_CHANNEL_DSO); - if (triggred) - captured_progress = (_total_sample_len - captured_cnt) * 100.0 / _total_sample_len; - else - captured_progress = captured_cnt * 100.0 / _total_sample_len; - - + bool triggered; + if (_view.session().get_capture_status(triggered, captured_progress)){ p.setPen(Trace::dsLightBlue); QFont font=p.font(); font.setPointSize(10); font.setBold(true); p.setFont(font); QRect status_rect = QRect(cenPos.x() - radius, cenPos.y() + radius * 0.4, radius * 2, radius * 0.5); - if (triggred) + if (triggered) p.drawText(status_rect, Qt::AlignCenter | Qt::AlignVCenter, - "Triggered! " + QString::number(captured_progress)+"% Captured"); + tr("Triggered! ") + QString::number(captured_progress) + tr("% Captured")); else p.drawText(status_rect, Qt::AlignCenter | Qt::AlignVCenter, - "Waiting for Trigger! " + QString::number(captured_progress)+"% Captured"); + tr("Waiting for Trigger! ") + QString::number(captured_progress) + tr("% Captured")); + prgRate(captured_progress); } } else { + if (_view.session().get_error() == SigSession::No_err) { + GVariant *gvar = _view.session().get_device()->get_config(NULL, NULL, SR_CONF_HW_STATUS); + if (gvar != NULL) { + uint8_t hw_info = g_variant_get_byte(gvar); + g_variant_unref(gvar); + if (hw_info & 0x10) { + _view.session().set_error(SigSession::Data_overflow); + _view.session().session_error(); + } + } + } + const int progress100 = ceil(progress / -3.6 / 16); p.setPen(Trace::dsGreen); QFont font=p.font(); @@ -397,6 +407,7 @@ void Viewport::paintProgress(QPainter &p) font.setBold(true); p.setFont(font); p.drawText(rect(), Qt::AlignCenter | Qt::AlignVCenter, QString::number(progress100)+"%"); + prgRate(progress100); } p.setPen(QPen(Trace::dsLightBlue, 4, Qt::SolidLine)); @@ -444,7 +455,7 @@ void Viewport::mousePressEvent(QMouseEvent *event) _action_type = LOGIC_ZOOM; } else if (_view.session().get_device()->dev_inst()->mode == DSO) { if (_hover_hit) { - uint64_t index = (_view.offset() + (event->pos().x() + 0.5) * _view.scale()) * _view.session().cur_samplerate(); + const int64_t index = (_view.offset() + event->pos().x()) * _view.scale() * _view.session().cur_samplerate(); _view.add_cursor(view::Ruler::CursorColor[_view.get_cursorList().size() % 8], index); _view.show_cursors(true); } @@ -460,9 +471,7 @@ void Viewport::mouseMoveEvent(QMouseEvent *event) if (event->buttons() & Qt::LeftButton) { if (_type == TIME_VIEW) { _view.set_scale_offset(_view.scale(), - _mouse_down_offset + - (_mouse_down_point - event->pos()).x() * - _view.scale()); + _mouse_down_offset + (_mouse_down_point - event->pos()).x()); _drag_strength = (_mouse_down_point - event->pos()).x(); } else if (_type == FFT_VIEW) { BOOST_FOREACH(const boost::shared_ptr t, _view.session().get_math_signals()) { @@ -489,7 +498,7 @@ void Viewport::mouseMoveEvent(QMouseEvent *event) if (_action_type == CURS_MOVE) { uint64_t sample_rate = _view.session().cur_samplerate(); TimeMarker* grabbed_marker = _view.get_ruler()->get_grabbed_cursor(); - if (_view.cursors_shown() && grabbed_marker) { + if (grabbed_marker) { int curX = _view.hover_point().x(); uint64_t index0 = 0, index1 = 0, index2 = 0; bool logic = false; @@ -512,13 +521,12 @@ void Viewport::mouseMoveEvent(QMouseEvent *event) } } - const double cur_time = _view.offset() + curX * _view.scale(); + const double cur_time = (_view.offset() + curX) * _view.scale(); const double pos = cur_time * sample_rate; const double pos_delta = pos - (uint64_t)pos; const double samples_per_pixel = sample_rate * _view.scale(); - const double index_offset = _view.offset() / _view.scale(); - const double curP = index0 / samples_per_pixel - index_offset; - const double curN = index1 / samples_per_pixel - index_offset; + const double curP = index0 / samples_per_pixel - _view.offset(); + const double curN = index1 / samples_per_pixel - _view.offset(); if (logic && (curX - curP < SnapMinSpace || curN - curX < SnapMinSpace)) { if (curX - curP < curN - curX) grabbed_marker->set_index(index0); @@ -529,6 +537,12 @@ void Viewport::mouseMoveEvent(QMouseEvent *event) } else { grabbed_marker->set_index((uint64_t)ceil(pos)); } + + if (grabbed_marker == _view.get_search_cursor()) { + _view.set_search_pos(grabbed_marker->index(), false); + } + + _view.cursor_moving(); } } @@ -563,15 +577,23 @@ void Viewport::mouseReleaseEvent(QMouseEvent *event) assert(event); if (_type == TIME_VIEW) { + const double samples_per_pixel = _view.session().cur_samplerate() * _view.scale(); if ((_action_type == NO_ACTION) && (event->button() == Qt::LeftButton)) { // priority 0 + if (_action_type == NO_ACTION && _view.search_cursor_shown()) { + const int64_t searchX = _view.get_search_cursor()->index()/samples_per_pixel - _view.offset(); + if (_view.get_search_cursor()->grabbed()) { + _view.get_ruler()->rel_grabbed_cursor(); + } else if (qAbs(searchX - event->pos().x()) <= HitCursorMargin) { + _view.get_ruler()->set_grabbed_cursor(_view.get_search_cursor()); + _action_type = CURS_MOVE; + } + } if (_action_type == NO_ACTION && _view.cursors_shown()) { list::iterator i = _view.get_cursorList().begin(); - double cursorX; - const double samples_per_pixel = _view.session().cur_samplerate() * _view.scale(); while (i != _view.get_cursorList().end()) { - cursorX = (*i)->index()/samples_per_pixel - (_view.offset() / _view.scale()); + const int64_t cursorX = (*i)->index()/samples_per_pixel - _view.offset(); if ((*i)->grabbed()) { _view.get_ruler()->rel_grabbed_cursor(); } else if (qAbs(cursorX - event->pos().x()) <= HitCursorMargin) { @@ -609,7 +631,7 @@ void Viewport::mouseReleaseEvent(QMouseEvent *event) assert(s); if (abs(event->pos().y() - s->get_y()) < _view.get_signalHeight()) { _action_type = LOGIC_EDGE; - _edge_start = (_view.offset() + (event->pos().x() + 0.5) * _view.scale()) * _view.session().cur_samplerate(); + _edge_start = (_view.offset() + event->pos().x()) * _view.scale() * _view.session().cur_samplerate(); break; } } @@ -664,11 +686,7 @@ void Viewport::mouseReleaseEvent(QMouseEvent *event) } } else if (_action_type == DSO_XM_STEP1) { if (event->button() == Qt::LeftButton) { - const uint64_t sample_rate = _view.session().cur_samplerate(); - const double scale = _view.scale(); - const double samples_per_pixel = sample_rate * scale; - - _dso_xm_index[1] = event->pos().x() * samples_per_pixel + _view.offset() * sample_rate; + _dso_xm_index[1] = (event->pos().x() + _view.offset()) * samples_per_pixel; const uint64_t max_index = max(_dso_xm_index[0], _dso_xm_index[1]); _dso_xm_index[0] = min(_dso_xm_index[0], _dso_xm_index[1]); _dso_xm_index[1] = max_index; @@ -685,10 +703,7 @@ void Viewport::mouseReleaseEvent(QMouseEvent *event) } } else if (_action_type == DSO_XM_STEP2) { if (event->button() == Qt::LeftButton) { - const uint64_t sample_rate = _view.session().cur_samplerate(); - const double scale = _view.scale(); - const double samples_per_pixel = sample_rate * scale; - _dso_xm_index[2] = event->pos().x() * samples_per_pixel + _view.offset() * sample_rate; + _dso_xm_index[2] = (event->pos().x() + _view.offset()) * samples_per_pixel; uint64_t max_index = max(_dso_xm_index[1], _dso_xm_index[2]); _dso_xm_index[1] = min(_dso_xm_index[1], _dso_xm_index[2]); _dso_xm_index[2] = max_index; @@ -709,15 +724,18 @@ void Viewport::mouseReleaseEvent(QMouseEvent *event) } } else if (_action_type == CURS_MOVE) { _action_type = NO_ACTION; - if (_view.cursors_shown()) { - list::iterator i = _view.get_cursorList().begin(); - while (i != _view.get_cursorList().end()) { - if ((*i)->grabbed()) { - _view.get_ruler()->rel_grabbed_cursor(); - } - i++; - } - } + _view.get_ruler()->rel_grabbed_cursor(); + +// if (_view.cursors_shown()) { +// list::iterator i = _view.get_cursorList().begin(); +// while (i != _view.get_cursorList().end()) { +// if ((*i)->grabbed()) { +// _view.get_ruler()->rel_grabbed_cursor(); +// } +// i++; +// } +// } + _view.cursor_moved(); } else if (_action_type == LOGIC_EDGE) { _action_type = NO_ACTION; _edge_rising = 0; @@ -741,9 +759,10 @@ void Viewport::mouseReleaseEvent(QMouseEvent *event) } } else if (_action_type == LOGIC_ZOOM) { if (event->pos().x() != _mouse_down_point.x()) { - const double newOffset = _view.offset() + (min(event->pos().x(), _mouse_down_point.x()) + 0.5) * _view.scale(); + int64_t newOffset = _view.offset() + (min(event->pos().x(), _mouse_down_point.x())); const double newScale = max(min(_view.scale() * abs(event->pos().x() - _mouse_down_point.x()) / _view.get_view_width(), _view.get_maxscale()), _view.get_minscale()); + newOffset = floor(newOffset * (_view.scale() / newScale)); if (newScale != _view.scale()) _view.set_scale_offset(newScale, newOffset); } @@ -764,9 +783,37 @@ void Viewport::mouseDoubleClickEvent(QMouseEvent *event) if (_view.scale() == _view.get_maxscale()) _view.set_preScale_preOffset(); else - _view.set_scale_offset(_view.get_maxscale(), 0); + _view.set_scale_offset(_view.get_maxscale(), _view.get_min_offset()); } else if (event->button() == Qt::LeftButton) { - uint64_t index = (_view.offset() + (event->pos().x() + 0.5) * _view.scale()) * _view.session().cur_samplerate(); + bool logic = false; + uint64_t index; + uint64_t index0 = 0, index1 = 0, index2 = 0; + if (_view.session().get_device()->dev_inst()->mode == LOGIC) { + const vector< boost::shared_ptr > sigs(_view.session().get_signals()); + BOOST_FOREACH(const boost::shared_ptr s, sigs) { + assert(s); + boost::shared_ptr logicSig; + if ((logicSig = dynamic_pointer_cast(s))) { + if (logicSig->measure(event->pos(), index0, index1, index2)) { + logic = true; + break; + } + } + } + } + const uint64_t sample_rate = _view.session().cur_samplerate(); + const double curX = event->pos().x(); + const double samples_per_pixel = sample_rate * _view.scale(); + const double curP = index0 / samples_per_pixel - _view.offset(); + const double curN = index1 / samples_per_pixel - _view.offset(); + if (logic && (curX - curP < SnapMinSpace || curN - curX < SnapMinSpace)) { + if (curX - curP < curN - curX) + index = index0; + else + index = index1; + } else { + index = (_view.offset() + curX) * _view.scale() * sample_rate;; + } _view.add_cursor(view::Ruler::CursorColor[_view.get_cursorList().size() % 8], index); _view.show_cursors(true); } @@ -789,8 +836,7 @@ void Viewport::mouseDoubleClickEvent(QMouseEvent *event) uint64_t sample_rate = _view.session().cur_samplerate(); double scale = _view.scale(); const double samples_per_pixel = sample_rate * scale; - _dso_xm_index[0] = event->pos().x() * samples_per_pixel + - _view.offset() * sample_rate; + _dso_xm_index[0] = (event->pos().x() + _view.offset()) * samples_per_pixel; _dso_xm_y = event->pos().y(); _action_type = DSO_XM_STEP0; } @@ -815,13 +861,12 @@ void Viewport::wheelEvent(QWheelEvent *event) } else if (_type == TIME_VIEW){ if (event->orientation() == Qt::Vertical) { // Vertical scrolling is interpreted as zooming in/out - const double offset = event->x(); + const int offset = event->x(); _view.zoom(event->delta() / 80, offset); } else if (event->orientation() == Qt::Horizontal) { // Horizontal scrolling is interpreted as moving left/right _view.set_scale_offset(_view.scale(), - event->delta() * _view.scale() - + _view.offset()); + event->delta() + _view.offset()); } } @@ -857,22 +902,17 @@ void Viewport::leaveEvent(QEvent *) update(); } -void Viewport::on_traces_moved() -{ - update(); -} - void Viewport::set_receive_len(quint64 length) { if (length == 0) { - _total_receive_len = 0; + _sample_received = 0; start_trigger_timer(333); } else { stop_trigger_timer(); - if (_total_receive_len + length > _view.session().cur_samplelimits()) - _total_receive_len = _view.session().cur_samplelimits(); + if (_sample_received + length > _view.session().cur_samplelimits()) + _sample_received = _view.session().cur_samplelimits(); else - _total_receive_len += length; + _sample_received += length; } update(); } @@ -904,11 +944,10 @@ void Viewport::measure() _mm_period = _thd_sample != 0 ? _view.get_ruler()->format_real_time(_thd_sample - _cur_sample, sample_rate) : "#####"; _mm_freq = _thd_sample != 0 ? _view.get_ruler()->format_real_freq(_thd_sample - _cur_sample, sample_rate) : "#####"; - const double pixels_offset = _view.offset() / _view.scale(); const double samples_per_pixel = sample_rate * _view.scale(); - _cur_preX = _cur_sample / samples_per_pixel - pixels_offset; - _cur_aftX = _nxt_sample / samples_per_pixel - pixels_offset; - _cur_thdX = _thd_sample / samples_per_pixel - pixels_offset; + _cur_preX = _cur_sample / samples_per_pixel - _view.offset(); + _cur_aftX = _nxt_sample / samples_per_pixel - _view.offset(); + _cur_thdX = _thd_sample / samples_per_pixel - _view.offset(); _cur_midY = logicSig->get_y(); _mm_duty = _thd_sample != 0 ? QString::number((_nxt_sample - _cur_sample) * 100.0 / (_thd_sample - _cur_sample), 'f', 2)+"%" : @@ -923,9 +962,8 @@ void Viewport::measure() } } else if (_action_type == LOGIC_EDGE) { if (logicSig->edges(_view.hover_point(), _edge_start, _edge_rising, _edge_falling)) { - const double pixels_offset = _view.offset() / _view.scale(); const double samples_per_pixel = sample_rate * _view.scale(); - _cur_preX = _edge_start / samples_per_pixel - pixels_offset; + _cur_preX = _edge_start / samples_per_pixel - _view.offset(); _cur_aftX = _view.hover_point().x(); _cur_midY = logicSig->get_y() - logicSig->get_totalHeight()/2 - 5; @@ -1086,8 +1124,8 @@ void Viewport::paintMeasure(QPainter &p) const int text_height = p.boundingRect(0, 0, INT_MAX, INT_MAX, Qt::AlignLeft | Qt::AlignTop, "W").height(); const uint64_t sample_rate = _view.session().cur_samplerate(); - const double x = (_dso_ym_index / (sample_rate * _view.scale())) - - _view.offset() /_view.scale(); + const int64_t x = (_dso_ym_index / (sample_rate * _view.scale())) - + _view.offset(); p.drawLine(x-10, _dso_ym_start, x+10, _dso_ym_start); p.drawLine(x, _dso_ym_start, @@ -1135,7 +1173,7 @@ void Viewport::paintMeasure(QPainter &p) QLineF *line; QLineF *const measure_lines = new QLineF[measure_line_count]; line = measure_lines; - double x[DsoMeasureStages]; + int64_t x[DsoMeasureStages]; int dso_xm_stage = 0; if (_action_type == DSO_XM_STEP1) dso_xm_stage = 1; @@ -1146,18 +1184,18 @@ void Viewport::paintMeasure(QPainter &p) for (int i = 0; i < dso_xm_stage; i++) { x[i] = (_dso_xm_index[i] / (sample_rate * _view.scale())) - - _view.offset() /_view.scale(); + _view.offset(); } measure_line_count = 0; if (dso_xm_stage > 0) { - *line++ = QLineF(x[0], _dso_xm_y - 10, + *line++ = QLine(x[0], _dso_xm_y - 10, x[0], _dso_xm_y + 10); measure_line_count += 1; } if (dso_xm_stage > 1) { - *line++ = QLineF(x[1], _dso_xm_y - 10, + *line++ = QLine(x[1], _dso_xm_y - 10, x[1], _dso_xm_y + 10); - *line++ = QLineF(x[0], _dso_xm_y, + *line++ = QLine(x[0], _dso_xm_y, x[1], _dso_xm_y); _mm_width = _view.get_ruler()->format_real_time(_dso_xm_index[1] - _dso_xm_index[0], sample_rate); @@ -1274,14 +1312,14 @@ void Viewport::set_measure_en(int enable) void Viewport::start_trigger_timer(int msec) { assert(msec > 0); - triggered = false; + transfer_started = false; timer_cnt = 0; trigger_timer.start(msec); } void Viewport::stop_trigger_timer() { - triggered = true; + transfer_started = true; timer_cnt = 0; trigger_timer.stop(); } @@ -1294,13 +1332,13 @@ void Viewport::on_trigger_timer() void Viewport::on_drag_timer() { - const double offset = _view.offset(); + const int64_t offset = _view.offset(); const double scale = _view.scale(); if (_view.session().get_capture_state() == SigSession::Stopped && _drag_strength != 0 && offset < _view.get_max_offset() && offset > _view.get_min_offset()) { - _view.set_scale_offset(scale, offset + _drag_strength * scale); + _view.set_scale_offset(scale, offset + _drag_strength); _drag_strength /= DragDamping; if (_drag_strength != 0) _drag_timer.start(DragTimerInterval); diff --git a/DSView/pv/view/viewport.h b/DSView/pv/view/viewport.h index 588dbda0..b87994e3 100644 --- a/DSView/pv/view/viewport.h +++ b/DSView/pv/view/viewport.h @@ -119,7 +119,6 @@ private: void measure(); private slots: - void on_traces_moved(); void on_trigger_timer(); void on_drag_timer(); void set_receive_len(quint64 length); @@ -130,18 +129,19 @@ public slots: signals: void measure_updated(); + void prgRate(int progress); private: View &_view; View_type _type; bool _need_update; - uint64_t _total_receive_len; + uint64_t _sample_received; QPoint _mouse_point; QPoint _mouse_down_point; - double _mouse_down_offset; + int64_t _mouse_down_offset; double _curScale; - double _curOffset; + int64_t _curOffset; int _curSignalHeight; QPixmap pixmap; @@ -152,10 +152,10 @@ private: uint64_t _cur_sample; uint64_t _nxt_sample; uint64_t _thd_sample; - double _cur_preX; - double _cur_aftX; - double _cur_thdX; - double _cur_midY; + int64_t _cur_preX; + int64_t _cur_aftX; + int64_t _cur_thdX; + int _cur_midY; QString _mm_width; QString _mm_period; QString _mm_freq; @@ -169,7 +169,7 @@ private: QString _em_edges; QTimer trigger_timer; - bool triggered; + bool transfer_started; int timer_cnt; boost::shared_ptr _drag_sig; diff --git a/DSView/pv/widgets/border.cpp b/DSView/pv/widgets/border.cpp index 3196d188..42fc3bd5 100644 --- a/DSView/pv/widgets/border.cpp +++ b/DSView/pv/widgets/border.cpp @@ -103,5 +103,10 @@ void Border::paintEvent(QPaintEvent *) } } +void Border::leaveEvent(QEvent*) +{ + //setCursor(Qt::ArrowCursor); +} + } // namespace widgets } // namespace pv diff --git a/DSView/pv/widgets/border.h b/DSView/pv/widgets/border.h index 970ac42f..6e850a85 100644 --- a/DSView/pv/widgets/border.h +++ b/DSView/pv/widgets/border.h @@ -35,6 +35,7 @@ public: protected: void paintEvent(QPaintEvent *); + void leaveEvent(QEvent *); private: int _type; diff --git a/DSView/pv/widgets/viewstatus.cpp b/DSView/pv/widgets/viewstatus.cpp index 2b57a6c9..11dbb6c5 100644 --- a/DSView/pv/widgets/viewstatus.cpp +++ b/DSView/pv/widgets/viewstatus.cpp @@ -26,11 +26,14 @@ #include #include "../view/trace.h" +#include "../sigsession.h" namespace pv { namespace widgets { -ViewStatus::ViewStatus(QWidget *parent) : QWidget(parent) +ViewStatus::ViewStatus(SigSession &session, QWidget *parent) : + _session(session), + QWidget(parent) { } @@ -44,12 +47,28 @@ void ViewStatus::paintEvent(QPaintEvent *) p.setPen(pv::view::Trace::DARK_FORE); p.drawText(this->rect(), Qt::AlignLeft | Qt::AlignVCenter, _rle_depth); p.drawText(this->rect(), Qt::AlignRight | Qt::AlignVCenter, _trig_time); + + p.setPen(Qt::NoPen); + p.setBrush(pv::view::Trace::dsLightBlue); + p.drawRect(this->rect().left(), this->rect().bottom() - 3, + _session.get_repeat_hold() * this->rect().width() / 100, 3); + + p.setPen(pv::view::Trace::dsLightBlue); + p.drawText(this->rect(), Qt::AlignCenter | Qt::AlignVCenter, _capture_status); } void ViewStatus::clear() { _trig_time.clear(); _rle_depth.clear(); + _capture_status.clear(); + update(); +} + +void ViewStatus::repeat_unshow() +{ + _capture_status.clear(); + update(); } void ViewStatus::set_trig_time(QDateTime time) @@ -59,7 +78,15 @@ void ViewStatus::set_trig_time(QDateTime time) void ViewStatus::set_rle_depth(uint64_t depth) { - _rle_depth = tr("RLE FULL: ") + QString::number(depth) + tr(" Samples Captured!"); + _rle_depth = QString::number(depth) + tr(" Samples Captured!"); +} + +void ViewStatus::set_capture_status(bool triggered, int progess) +{ + if (triggered) + _capture_status = tr("Triggered! ") + QString::number(progess) + tr("% Captured"); + else + _capture_status = tr("Waiting for Trigger! ") + QString::number(progess) + tr("% Captured"); } } // namespace widgets diff --git a/DSView/pv/widgets/viewstatus.h b/DSView/pv/widgets/viewstatus.h index 58078d0d..a41f9d31 100644 --- a/DSView/pv/widgets/viewstatus.h +++ b/DSView/pv/widgets/viewstatus.h @@ -24,7 +24,7 @@ #include #include -#include "QDateTime" +#include namespace pv { @@ -36,7 +36,7 @@ class ViewStatus : public QWidget { Q_OBJECT public: - explicit ViewStatus(QWidget *parent = 0); + explicit ViewStatus(SigSession &session, QWidget *parent = 0); void paintEvent(QPaintEvent *); @@ -44,12 +44,17 @@ signals: public slots: void clear(); + void repeat_unshow(); void set_trig_time(QDateTime time); void set_rle_depth(uint64_t depth); + void set_capture_status(bool triggered, int progess); private: + SigSession &_session; + QString _trig_time; QString _rle_depth; + QString _capture_status; }; } // namespace widgets diff --git a/libsigrok4DSL/Makefile.am b/libsigrok4DSL/Makefile.am index e77f42f4..a22b7522 100644 --- a/libsigrok4DSL/Makefile.am +++ b/libsigrok4DSL/Makefile.am @@ -33,7 +33,6 @@ libsigrok4DSL_la_SOURCES = \ session_file.c \ session_driver.c \ hwdriver.c \ - filter.c \ strutil.c \ log.c \ trigger.c \ diff --git a/libsigrok4DSL/filter.c b/libsigrok4DSL/filter.c deleted file mode 100644 index 11cad5c3..00000000 --- a/libsigrok4DSL/filter.c +++ /dev/null @@ -1,170 +0,0 @@ -/* - * This file is part of the libsigrok project. - * - * Copyright (C) 2010-2012 Bert Vermeulen - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#include -#include -#include -#include -#include "libsigrok.h" -#include "libsigrok-internal.h" - -/* Message logging helpers with subsystem-specific prefix string. */ -#define LOG_PREFIX "filter: " -#define sr_log(l, s, args...) sr_log(l, LOG_PREFIX s, ## args) -#define sr_spew(s, args...) sr_spew(LOG_PREFIX s, ## args) -#define sr_dbg(s, args...) sr_dbg(LOG_PREFIX s, ## args) -#define sr_info(s, args...) sr_info(LOG_PREFIX s, ## args) -#define sr_warn(s, args...) sr_warn(LOG_PREFIX s, ## args) -#define sr_err(s, args...) sr_err(LOG_PREFIX s, ## args) - -/** - * @file - * - * Helper functions to filter out unused probes from samples. - */ - -/** - * @defgroup grp_filter Probe filter - * - * Helper functions to filter out unused probes from samples. - * - * @{ - */ - -/** - * Remove unused probes from samples. - * - * Convert sample from maximum probes -- the way the hardware driver sent - * it -- to a sample taking up only as much space as required, with - * unused probes removed. - * - * The "unit size" is the number of bytes used to store probe values. - * For example, a unit size of 1 means one byte is used (which can store - * 8 probe values, each of them is 1 bit). A unit size of 2 means we can - * store 16 probe values, 3 means we can store 24 probe values, and so on. - * - * If the data coming from the logic analyzer has a unit size of 4 for - * example (as the device has 32 probes), but only 2 of them are actually - * used in an acquisition, this function can convert the samples to only - * use up 1 byte per sample (unit size = 1) instead of 4 bytes per sample. - * - * The output will contain the probe values in the order specified via the - * probelist. For example, if in_unitsize = 4, probelist = [5, 16, 30], and - * out_unitsize = 1, then the output samples (each of them one byte in size) - * will have the following format: bit 0 = value of probe 5, bit 1 = value - * of probe 16, bit 2 = value of probe 30. Unused bit(s) in the output byte(s) - * are zero. - * - * The caller must make sure that length_in is not bigger than the memory - * actually allocated for the input data (data_in), as this function does - * not check that. - * - * @param in_unitsize The unit size (>= 1) of the input (data_in). - * @param out_unitsize The unit size (>= 1) the output shall have (data_out). - * The requested unit size must be big enough to hold as - * much data as is specified by the number of enabled - * probes in 'probelist'. - * @param probe_array Pointer to a list of probe numbers, numbered starting - * from 0. The list is terminated with -1. - * @param data_in Pointer to the input data buffer. Must not be NULL. - * @param length_in The input data length (>= 1), in number of bytes. - * @param data_out Variable which will point to the newly allocated buffer - * of output data. The caller is responsible for g_free()'ing - * the buffer when it's no longer needed. Must not be NULL. - * @param length_out Pointer to the variable which will contain the output - * data length (in number of bytes) when the function - * returns SR_OK. Must not be NULL. - * - * @return SR_OK upon success, SR_ERR_MALLOC upon memory allocation errors, - * or SR_ERR_ARG upon invalid arguments. - * If something other than SR_OK is returned, the values of - * out_unitsize, data_out, and length_out are undefined. - * - * @since 0.1.0 (but the API changed in 0.2.0) - */ -SR_API int sr_filter_probes(unsigned int in_unitsize, unsigned int out_unitsize, - const GArray *probe_array, const uint8_t *data_in, - uint64_t length_in, uint8_t **data_out, - uint64_t *length_out) -{ - unsigned int in_offset, out_offset; - int *probelist, out_bit; - unsigned int i; - uint64_t sample_in, sample_out; - - if (!probe_array) { - sr_err("%s: probe_array was NULL", __func__); - return SR_ERR_ARG; - } - probelist = (int *)probe_array->data; - - if (!data_in) { - sr_err("%s: data_in was NULL", __func__); - return SR_ERR_ARG; - } - - if (!data_out) { - sr_err("%s: data_out was NULL", __func__); - return SR_ERR_ARG; - } - - if (!length_out) { - sr_err("%s: length_out was NULL", __func__); - return SR_ERR_ARG; - } - - /* Are there more probes than the target unit size supports? */ - if (probe_array->len > out_unitsize * 8) { - sr_err("%s: too many probes (%d) for the target unit " - "size (%d)", __func__, probe_array->len, out_unitsize); - return SR_ERR_ARG; - } - - if (!(*data_out = g_try_malloc(length_in))) { - sr_err("%s: data_out malloc failed", __func__); - return SR_ERR_MALLOC; - } - - if (probe_array->len == in_unitsize * 8) { - /* All probes are used -- no need to compress anything. */ - memcpy(*data_out, data_in, length_in); - *length_out = length_in; - return SR_OK; - } - - /* If we reached this point, not all probes are used, so "compress". */ - in_offset = out_offset = 0; - while (in_offset <= length_in - in_unitsize) { - memcpy(&sample_in, data_in + in_offset, in_unitsize); - sample_out = out_bit = 0; - for (i = 0; i < probe_array->len; i++) { - if (sample_in & (1 << (probelist[i]))) - sample_out |= (1 << out_bit); - out_bit++; - } - memcpy((*data_out) + out_offset, &sample_out, out_unitsize); - in_offset += in_unitsize; - out_offset += out_unitsize; - } - *length_out = out_offset; - - return SR_OK; -} - -/** @} */ diff --git a/libsigrok4DSL/hardware/DSL/command.c b/libsigrok4DSL/hardware/DSL/command.c index b23e852e..654824e8 100644 --- a/libsigrok4DSL/hardware/DSL/command.c +++ b/libsigrok4DSL/hardware/DSL/command.c @@ -271,7 +271,7 @@ SR_PRIV int command_wr_nvm(libusb_device_handle *devhdl, unsigned char *ctx, uin return SR_OK; } -SR_PRIV int command_rd_nvm(libusb_device_handle *devhdl, unsigned char *ctx, uint8_t addr, uint8_t len) +SR_PRIV int command_rd_nvm(libusb_device_handle *devhdl, unsigned char *ctx, uint16_t addr, uint8_t len) { int ret; @@ -285,7 +285,7 @@ SR_PRIV int command_rd_nvm(libusb_device_handle *devhdl, unsigned char *ctx, uin LIBUSB_ENDPOINT_OUT, CMD_RD_NVM_PRE, 0x0000, 0x0000, (unsigned char *)&nvm_info, sizeof(struct cmd_nvm_info), 3000); if (ret < 0) { - sr_err("Unable to send CMD_ZERO_RD_PRE command: %s.", + sr_err("Unable to send CMD_RD_NVM_PRE command: %s.", libusb_error_name(ret)); return SR_ERR; } @@ -306,17 +306,16 @@ SR_PRIV int command_rd_nvm(libusb_device_handle *devhdl, unsigned char *ctx, uin return SR_OK; } -SR_PRIV int command_get_fpga_done(libusb_device_handle *devhdl, - uint8_t *fpga_done) +SR_PRIV int command_get_hw_info(libusb_device_handle *devhdl, uint8_t *info) { int ret; ret = libusb_control_transfer(devhdl, LIBUSB_REQUEST_TYPE_VENDOR | - LIBUSB_ENDPOINT_IN, CMD_FPGA_DONE, 0x0000, 0x0000, - fpga_done, 1, 3000); + LIBUSB_ENDPOINT_IN, CMD_GET_HW_INFO, 0x0000, 0x0000, + info, 1, 3000); if (ret < 0) { - sr_err("Unable to get fpga done info: %s.", + sr_err("Unable to get hardware info: %s.", libusb_error_name(ret)); return SR_ERR; } diff --git a/libsigrok4DSL/hardware/DSL/command.h b/libsigrok4DSL/hardware/DSL/command.h index 352fafb2..36272c1c 100644 --- a/libsigrok4DSL/hardware/DSL/command.h +++ b/libsigrok4DSL/hardware/DSL/command.h @@ -37,7 +37,7 @@ #define CMD_WR_NVM 0xb9 #define CMD_RD_NVM 0xba #define CMD_RD_NVM_PRE 0xbb -#define CMD_FPGA_DONE 0xbc +#define CMD_GET_HW_INFO 0xbc #define CMD_START_FLAGS_MODE_POS 4 #define CMD_START_FLAGS_WIDE_POS 5 @@ -138,7 +138,7 @@ struct cmd_vga_info { }; struct cmd_nvm_info { - uint8_t addr; + uint16_t addr; uint8_t len; }; @@ -164,8 +164,8 @@ SR_PRIV int command_get_status(libusb_device_handle *devhdl, SR_PRIV int command_wr_reg(libusb_device_handle *devhdl, uint8_t value, uint8_t addr); SR_PRIV int command_wr_nvm(libusb_device_handle *devhdl, unsigned char *ctx, uint8_t len); -SR_PRIV int command_rd_nvm(libusb_device_handle *devhdl, unsigned char *ctx, uint8_t addr, uint8_t len); +SR_PRIV int command_rd_nvm(libusb_device_handle *devhdl, unsigned char *ctx, uint16_t addr, uint8_t len); -SR_PRIV int command_get_fpga_done(libusb_device_handle *devhdl, +SR_PRIV int command_get_hw_info(libusb_device_handle *devhdl, uint8_t *fpga_done); #endif diff --git a/libsigrok4DSL/hardware/DSL/dscope.c b/libsigrok4DSL/hardware/DSL/dscope.c index bd7481ae..a6fc2b57 100644 --- a/libsigrok4DSL/hardware/DSL/dscope.c +++ b/libsigrok4DSL/hardware/DSL/dscope.c @@ -52,8 +52,6 @@ static const char *opmodes[] = { "DRAM Loopback Test", }; -static uint16_t opmodes_show_count = 2; - static const char *thresholds[] = { "1.8/2.5/3.3V Level", "5.0V Level", @@ -141,6 +139,7 @@ static const uint64_t samplecounts[] = { SR_MB(32), }; +static uint16_t opmodes_show_count = 2; static const uint8_t zero_base_addr = 0x40; SR_PRIV struct sr_dev_driver DSCope_driver_info; @@ -264,6 +263,9 @@ static int fpga_setting(const struct sr_dev_inst *sdi) int transferred; int result; int i; + GSList *l; + uint32_t tmp_u32; + uint64_t tmp_u64; devc = sdi->priv; usb = sdi->conn; @@ -271,51 +273,65 @@ static int fpga_setting(const struct sr_dev_inst *sdi) setting.sync = 0xf5a5f5a5; setting.mode_header = 0x0001; - setting.divider_header = 0x0102ffff; - setting.count_header = 0x0302ffff; - setting.trig_pos_header = 0x0502ffff; + setting.divider_header = 0x0102; + setting.count_header = 0x0302; + setting.trig_pos_header = 0x0502; setting.trig_glb_header = 0x0701; - setting.trig_adp_header = 0x0a02ffff; - setting.trig_sda_header = 0x0c02ffff; - setting.trig_mask0_header = 0x1010ffff; - setting.trig_mask1_header = 0x1110ffff; - //setting.trig_mask2_header = 0x1210ffff; - //setting.trig_mask3_header = 0x1310ffff; - setting.trig_value0_header = 0x1410ffff; - setting.trig_value1_header = 0x1510ffff; - //setting.trig_value2_header = 0x1610ffff; - //setting.trig_value3_header = 0x1710ffff; - setting.trig_edge0_header = 0x1810ffff; - setting.trig_edge1_header = 0x1910ffff; - //setting.trig_edge2_header = 0x1a10ffff; - //setting.trig_edge3_header = 0x1b10ffff; - setting.trig_count0_header = 0x1c20ffff; - setting.trig_count1_header = 0x1d20ffff; - //setting.trig_count2_header = 0x1e10ffff; - //setting.trig_count3_header = 0x1f10ffff; - setting.trig_logic0_header = 0x2010ffff; - setting.trig_logic1_header = 0x2110ffff; - //setting.trig_logic2_header = 0x2210ffff; - //setting.trig_logic3_header = 0x2310ffff; + setting.ch_en_header = 0x0801; + setting.trig_header = 0x40a0; setting.end_sync = 0xfa5afa5a; //setting.mode = (test_mode ? 0x8000 : 0x0000) + trigger->trigger_en + (sdi->mode << 4); - setting.mode = ((devc->op_mode == SR_OP_INTERNAL_TEST) << 15) + - ((devc->op_mode == SR_OP_EXTERNAL_TEST) << 14) + - ((devc->op_mode == SR_OP_LOOPBACK_TEST) << 13) + - trigger->trigger_en + - ((sdi->mode == DSO) << 4) + (devc->clock_type << 1) + (devc->clock_edge << 2) + - (((devc->cur_samplerate == SR_MHZ(200) && sdi->mode != DSO) || (sdi->mode == ANALOG)) << 5) + - ((devc->cur_samplerate == SR_MHZ(400)) << 6) + - ((sdi->mode == ANALOG) << 7) + - ((devc->filter == SR_FILTER_1T) << 8) + - (devc->instant << 9); - setting.divider = (uint32_t)ceil(DSCOPE_MAX_SAMPLERATE * 1.0 / devc->cur_samplerate / en_ch_num(sdi)); - setting.count = (uint32_t)(devc->limit_samples / (g_slist_length(sdi->channels) / en_ch_num(sdi))); - setting.trig_pos = (uint32_t)(trigger->trigger_pos / 100.0 * devc->limit_samples); - setting.trig_glb = trigger->trigger_stages; - setting.trig_adp = setting.count - setting.trig_pos - 1; - setting.trig_sda = 0x0; + setting.mode = (trigger->trigger_en << TRIG_EN_BIT) + + (devc->clock_type << CLK_TYPE_BIT) + + (devc->clock_edge << CLK_EDGE_BIT) + + ((sdi->mode == DSO) << DSO_MODE_BIT) + + ((((devc->cur_samplerate == (2 * DSLOGIC_MAX_LOGIC_SAMPLERATE)) && sdi->mode != DSO) || (sdi->mode == ANALOG)) << HALF_MODE_BIT) + + ((devc->cur_samplerate == (4 * DSLOGIC_MAX_LOGIC_SAMPLERATE)) << QUAR_MODE_BIT) + + ((sdi->mode == ANALOG) << ANALOG_MODE_BIT) + + ((devc->filter == SR_FILTER_1T) << FILTER_BIT) + + (devc->instant << INSTANT_BIT) + + ((devc->op_mode == SR_OP_LOOPBACK_TEST) << LPB_TEST_BIT) + + ((devc->op_mode == SR_OP_EXTERNAL_TEST) << EXT_TEST_BIT) + + ((devc->op_mode == SR_OP_INTERNAL_TEST) << INT_TEST_BIT); + + // sample rate divider + tmp_u32 = (sdi->mode == DSO) ? (uint32_t)ceil(DSLOGIC_MAX_DSO_SAMPLERATE * 1.0 / devc->cur_samplerate / en_ch_num(sdi)) : + (uint32_t)ceil(DSLOGIC_MAX_LOGIC_SAMPLERATE * 1.0 / devc->cur_samplerate); + setting.div_l = tmp_u32 & 0x0000ffff; + setting.div_h = tmp_u32 >> 16; + + // capture counter + // analog: 16bits, but sample with half mode(0-7 valid only) + tmp_u64 = (sdi->mode == DSO) ? (devc->limit_samples / (g_slist_length(sdi->channels) / en_ch_num(sdi))) : + (sdi->mode == ANALOG) ? (devc->limit_samples * g_slist_length(sdi->channels) * 4) : + (devc->limit_samples); + tmp_u64 >>= 4; // hardware minimum unit 64 + setting.cnt_l = tmp_u64 & 0x0000ffff; + setting.cnt_h = tmp_u64 >> 16; + + // trigger position + tmp_u32 = (uint32_t)(trigger->trigger_pos / 100.0 * devc->limit_samples); + if (setting.mode & (1 << QUAR_MODE_BIT)) + setting.tpos_l = tmp_u32 & 0x0000fffc; + else if (setting.mode & (1 << HALF_MODE_BIT)) + setting.tpos_l = tmp_u32 & 0x0000fffe; + else + setting.tpos_l = tmp_u32 & 0x0000ffff; + setting.tpos_h = tmp_u32 >> 16; + + // trigger global settings + setting.trig_glb = ((en_ch_num(sdi) & 0xf) << 4) + + trigger->trigger_stages; + + // channel enable mapping + setting.ch_en = 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; + } + + // 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); @@ -326,15 +342,54 @@ static int fpga_setting(const struct sr_dev_inst *sdi) setting.trig_edge0[0] = ds_trigger_get_edge0(TriggerStages); setting.trig_edge1[0] = ds_trigger_get_edge1(TriggerStages); - setting.trig_count0[0] = trigger->trigger0_count[TriggerStages]; - setting.trig_count1[0] = trigger->trigger1_count[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.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]; + setting.trig_count[0] = trigger->trigger0_count[TriggerStages]; + for (i = 1; i < NUM_TRIGGER_STAGES; i++) { - setting.trig_mask0[i] = 0xff; - setting.trig_mask1[i] = 0xff; + setting.trig_mask0[i] = 0xffff; + setting.trig_mask1[i] = 0xffff; setting.trig_value0[i] = 0; setting.trig_value1[i] = 0; @@ -342,11 +397,10 @@ static int fpga_setting(const struct sr_dev_inst *sdi) setting.trig_edge0[i] = 0; setting.trig_edge1[i] = 0; - setting.trig_count0[i] = 0; - setting.trig_count1[i] = 0; - setting.trig_logic0[i] = 2; setting.trig_logic1[i] = 2; + + setting.trig_count[i] = 0; } } else { for (i = 0; i < NUM_TRIGGER_STAGES; i++) { @@ -359,11 +413,54 @@ static int fpga_setting(const struct sr_dev_inst *sdi) setting.trig_edge0[i] = ds_trigger_get_edge0(i); setting.trig_edge1[i] = ds_trigger_get_edge1(i); - setting.trig_count0[i] = trigger->trigger0_count[i]; - setting.trig_count1[i] = trigger->trigger1_count[i]; + if (setting.mode & (1 << STRIG_MODE_BIT) && i == STriggerDataStage) { + // serial trigger, data mask/value should not be duplicated + } 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); + } + } 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]; + + setting.trig_count[i] = trigger->trigger0_count[i]; } } @@ -529,19 +626,20 @@ static int DSCope_dev_open(struct sr_dev_inst *sdi) break; } - /* - * Changes in major version mean incompatible/API changes, so - * bail out if we encounter an incompatible version. - * Different minor versions are OK, they should be compatible. - */ - if (vi.major != DSL_REQUIRED_VERSION_MAJOR) { - sr_err("Expected firmware version %d.x, " - "got %d.%d.", DSL_REQUIRED_VERSION_MAJOR, + /* + * Different versions may have incompatible issue, + * Mark for up level process + */ + if (vi.major != DSL_REQUIRED_VERSION_MAJOR || + vi.minor != DSL_REQUIRED_VERSION_MINOR) { + sr_err("Expected firmware version %d.%d, " + "got %d.%d.", DSL_REQUIRED_VERSION_MAJOR, DSL_REQUIRED_VERSION_MINOR, vi.major, vi.minor); - break; + sdi->status = SR_ST_INCOMPATIBLE; + } else { + sdi->status = SR_ST_ACTIVE; } - sdi->status = SR_ST_ACTIVE; sr_info("Opened device %d on %d.%d, " "interface %d, firmware %d.%d.", sdi->index, usb->bus, usb->address, @@ -554,7 +652,8 @@ static int DSCope_dev_open(struct sr_dev_inst *sdi) } libusb_free_device_list(devlist, 1); - if (sdi->status != SR_ST_ACTIVE) + if ((sdi->status != SR_ST_ACTIVE) && + (sdi->status != SR_ST_INCOMPATIBLE)) return SR_ERR; return SR_OK; @@ -601,15 +700,6 @@ static int configure_probes(const struct sr_dev_inst *sdi) } } - if (stage == -1) - /* - * We didn't configure any triggers, make sure acquisition - * doesn't wait for any. - */ - devc->trigger_stage = TRIGGER_FIRED; - else - devc->trigger_stage = 0; - return SR_OK; } @@ -645,6 +735,7 @@ static struct DSL_context *DSCope_dev_new(void) devc->dso_bits = 8; devc->trigger_margin = 8; devc->trigger_channel = 0; + devc->rle_mode = FALSE; return devc; } @@ -1119,6 +1210,8 @@ static int config_get(int id, GVariant **data, const struct sr_dev_inst *sdi, char str[128]; int i; struct DSL_vga *vga_ptr; + uint8_t tmp_u8; + int ret; (void)cg; @@ -1297,20 +1390,10 @@ static int config_get(int id, GVariant **data, const struct sr_dev_inst *sdi, return SR_ERR; *data = g_variant_new_uint64(DSCOPE_MAX_DEPTH); break; - case SR_CONF_MAX_LOGIC_SAMPLERATE: + case SR_CONF_HW_DEPTH: if (!sdi) return SR_ERR; - *data = g_variant_new_uint64(DSCOPE_MAX_SAMPLERATE); - break; - case SR_CONF_MAX_LOGIC_SAMPLELIMITS: - if (!sdi) - return SR_ERR; - *data = g_variant_new_uint64(DSCOPE_MAX_DEPTH); - break; - case SR_CONF_RLE_SAMPLELIMITS: - if (!sdi) - return SR_ERR; - *data = g_variant_new_uint64(DSCOPE_MAX_DEPTH); + *data = g_variant_new_uint64(DSCOPE_INSTANT_DEPTH); break; case SR_CONF_VGAIN: if (!sdi || !ch) @@ -1369,6 +1452,16 @@ static int config_get(int id, GVariant **data, const struct sr_dev_inst *sdi, devc = sdi->priv; *data = g_variant_new_byte(devc->dso_bits); break; + case SR_CONF_HW_STATUS: + if (!sdi) + return SR_ERR; + usb = sdi->conn; + ret = command_get_hw_info(usb->devhdl, &tmp_u8); + if (ret == SR_OK) + *data = g_variant_new_byte(tmp_u8); + else + *data = g_variant_new_byte(0); + break; default: return SR_ERR_NA; } @@ -1689,13 +1782,13 @@ static int config_set(int id, GVariant *data, struct sr_dev_inst *sdi, for (i=0; vga_ptr && (vga_ptr+i)->key; i++){ *(vgain_ptr+i) = ((probe->index == 0) ? (vga_ptr+i)->vgain0 : (vga_ptr+i)->vgain1) >> 8; } - ret = command_wr_reg(usb->devhdl, 0, EEWP_ADDR); + ret = command_wr_reg(usb->devhdl, bmEEWP, EEWP_ADDR); if (ret == SR_OK) ret = command_wr_nvm(usb->devhdl, (unsigned char *)&zero_info, sizeof(struct cmd_zero_info)); if (ret == SR_OK) ret = command_wr_nvm(usb->devhdl, (unsigned char *)&vga_info, sizeof(struct cmd_vga_info)); if (ret == SR_OK) - ret = command_wr_reg(usb->devhdl, 1, EEWP_ADDR); + ret = command_wr_reg(usb->devhdl, bmZERO, EEWP_ADDR); if (ret != SR_OK) sr_err("DSO channel %d Set Zero command failed!", probe->index); @@ -1916,7 +2009,7 @@ static int dso_zero(struct sr_dev_inst *sdi, struct sr_status mstatus) } if (devc->zero_stage == -1) { - // initialize before zero adjustment + // initialize before Auto Calibration if (dso_init(sdi) == SR_OK) devc->zero_stage = 0; } else if ((vga_ptr+devc->zero_stage)->key == 0) { @@ -2060,9 +2153,10 @@ static int dev_open(struct sr_dev_inst *sdi) struct DSL_context *devc; int ret; int64_t timediff_us, timediff_ms; - uint8_t fpga_done; + uint8_t hw_info; GSList *l; gboolean zeroed; + gboolean fpga_done; devc = sdi->priv; usb = sdi->conn; @@ -2103,13 +2197,14 @@ static int dev_open(struct sr_dev_inst *sdi) return SR_ERR; } - ret = command_get_fpga_done(usb->devhdl, &fpga_done); + ret = command_get_hw_info(usb->devhdl, &hw_info); if (ret != SR_OK) { - sr_err("Failed to get fpga done infos."); + sr_err("Failed to get hardware infos."); return SR_ERR; } + fpga_done = (hw_info & 0x80) != 0; - if (fpga_done == 0) { + if (sdi->status == SR_ST_ACTIVE && !fpga_done) { if ((ret = command_fpga_config(usb->devhdl)) != SR_OK) { sr_err("%s: Send FPGA configure command failed!", __func__); } else { @@ -2140,7 +2235,7 @@ static int dev_open(struct sr_dev_inst *sdi) config_set(SR_CONF_ZERO, g_variant_new_boolean(TRUE), sdi, NULL, NULL); sr_info("Zero have not been setted!"); } - if (fpga_done == 0) + if (!fpga_done) dso_init(sdi); } @@ -2198,6 +2293,7 @@ static void finish_acquisition(struct DSL_context *devc) sr_err("%s: send SR_DF_END packet", __func__); /* Terminate session. */ packet.type = SR_DF_END; + packet.status = SR_PKT_OK; sr_session_send(devc->cb_data, &packet); if (devc->num_transfers != 0) { @@ -2261,20 +2357,17 @@ static struct sr_config * new_config(int key, GVariant *data) static void receive_transfer(struct libusb_transfer *transfer) { - gboolean packet_has_error = FALSE; struct sr_datafeed_packet packet; struct sr_datafeed_logic logic; struct sr_datafeed_dso dso; struct sr_datafeed_analog analog; - int trigger_offset, i; - int trigger_offset_bytes; - const uint8_t *cur_buf = transfer->buffer; struct DSL_context *devc = transfer->user_data; struct sr_dev_inst *sdi = devc->cb_data; const int sample_width = 2; int cur_sample_count = transfer->actual_length / sample_width; + int i; if (devc->data_lock) { resubmit_transfer(transfer); @@ -2288,97 +2381,24 @@ static void receive_transfer(struct libusb_transfer *transfer) transfer->status, transfer->timeout, transfer->actual_length); switch (transfer->status) { - case LIBUSB_TRANSFER_NO_DEVICE: - case LIBUSB_TRANSFER_CANCELLED: - devc->status = DSL_ERROR; - break; case LIBUSB_TRANSFER_COMPLETED: case LIBUSB_TRANSFER_TIMED_OUT: /* We may have received some data though. */ break; default: - packet_has_error = TRUE; + devc->status = DSL_ERROR; break; } + packet.status = SR_PKT_OK; if (devc->status == DSL_DATA && - (transfer->actual_length == 0 || - packet_has_error)) { - devc->empty_transfer_count++; - if (devc->empty_transfer_count > MAX_EMPTY_TRANSFERS) { - devc->status = DSL_ERROR; - } - } else { - devc->empty_transfer_count = 0; - } - - trigger_offset = 0; - if (devc->status == DSL_DATA && devc->trigger_stage >= 0) { - for (i = 0; i < cur_sample_count; i++) { - const uint16_t cur_sample = devc->sample_wide ? - *((const uint16_t*)cur_buf + i) : - *((const uint8_t*)cur_buf + i); - - if ((cur_sample & devc->trigger_mask[devc->trigger_stage]) == - devc->trigger_value[devc->trigger_stage]) { - /* Match on this trigger stage. */ - devc->trigger_buffer[devc->trigger_stage] = cur_sample; - devc->trigger_stage++; - - if (devc->trigger_stage == NUM_TRIGGER_STAGES || - devc->trigger_mask[devc->trigger_stage] == 0) { - /* Match on all trigger stages, we're done. */ - trigger_offset = i + 1; - - /* - * TODO: Send pre-trigger buffer to session bus. - * Tell the frontend we hit the trigger here. - */ - packet.type = SR_DF_TRIGGER; - packet.payload = NULL; - sr_session_send(sdi, &packet); - - /* - * Send the samples that triggered it, - * since we're skipping past them. - */ - packet.type = SR_DF_LOGIC; - packet.payload = &logic; - logic.unitsize = sizeof(*devc->trigger_buffer); - logic.length = devc->trigger_stage * logic.unitsize; - logic.data = devc->trigger_buffer; - sr_session_send(sdi, &packet); - - devc->trigger_stage = TRIGGER_FIRED; - break; - } - } else if (devc->trigger_stage > 0) { - /* - * We had a match before, but not in the next sample. However, we may - * have a match on this stage in the next bit -- trigger on 0001 will - * fail on seeing 00001, so we need to go back to stage 0 -- but at - * the next sample from the one that matched originally, which the - * counter increment at the end of the loop takes care of. - */ - i -= devc->trigger_stage; - if (i < -1) - i = -1; /* Oops, went back past this buffer. */ - /* Reset trigger stage. */ - devc->trigger_stage = 0; - } - } - } - - if (devc->status == DSL_DATA && devc->trigger_stage == TRIGGER_FIRED) { - /* Send the incoming transfer to the session bus. */ - trigger_offset_bytes = trigger_offset * sample_width; + transfer->actual_length != 0) { // check packet type if (sdi->mode == LOGIC) { packet.type = SR_DF_LOGIC; packet.payload = &logic; - logic.length = transfer->actual_length - trigger_offset_bytes; - logic.unitsize = sample_width; + logic.length = transfer->actual_length; logic.data_error = 0; - logic.data = cur_buf + trigger_offset_bytes; + logic.data = cur_buf; } else if (sdi->mode == DSO) { if (!devc->instant) { const uint32_t mstatus_offset = devc->limit_samples / (g_slist_length(sdi->channels)/en_ch_num(sdi)); @@ -2409,7 +2429,7 @@ static void receive_transfer(struct libusb_transfer *transfer) mstatus.vlen <= (transfer->actual_length - 512) / sample_width) || devc->instant) { devc->roll = (mstatus.stream_mode != 0); - devc->mstatus_valid = TRUE; + devc->mstatus_valid = devc->instant ? FALSE : TRUE; packet.type = SR_DF_DSO; packet.payload = &dso; dso.probes = sdi->channels; @@ -2421,9 +2441,10 @@ static void receive_transfer(struct libusb_transfer *transfer) dso.mqflags = SR_MQFLAG_AC; dso.samplerate_tog = (mstatus.sample_divider_tog != 0); dso.trig_flag = (mstatus.trig_flag != 0); - dso.data = cur_buf + trigger_offset_bytes; + dso.data = cur_buf; } else { - packet.type = SR_DF_ABANDON; + packet.type = SR_DF_DSO; + packet.status = SR_PKT_DATA_ERROR; devc->mstatus_valid = FALSE; } } else { @@ -2434,7 +2455,7 @@ static void receive_transfer(struct libusb_transfer *transfer) analog.mq = SR_MQ_VOLTAGE; analog.unit = SR_UNIT_VOLT; analog.mqflags = SR_MQFLAG_AC; - analog.data = cur_buf + trigger_offset_bytes; + analog.data = cur_buf; } if (devc->limit_samples) { @@ -2479,14 +2500,14 @@ static void receive_transfer(struct libusb_transfer *transfer) } /* send data to session bus */ - if (packet.type != SR_DF_ABANDON) + if (packet.status != SR_PKT_DATA_ERROR) sr_session_send(sdi, &packet); } devc->num_samples += cur_sample_count; if ((sdi->mode == LOGIC || devc->instant) && devc->limit_samples && - (unsigned int)devc->num_samples >= devc->limit_samples) { + devc->num_samples >= devc->limit_samples) { devc->status = DSL_STOP; } } @@ -2663,6 +2684,7 @@ static void receive_trigger_pos(struct libusb_transfer *transfer) const struct sr_dev_inst *sdi; int ret; + packet.status = SR_PKT_OK; devc = transfer->user_data; sdi = devc->cb_data; trigger_pos = (struct ds_trigger_pos *)transfer->buffer; @@ -2753,7 +2775,7 @@ static int dev_acquisition_start(const struct sr_dev_inst *sdi, void *cb_data) } if (devc->zero && devc->zero_stage == -1) { - // initialize before zero adjustment + // initialize before Auto Calibration if ((ret = dso_init(sdi)) == SR_OK) { devc->zero_stage = 0; } else { @@ -2845,32 +2867,12 @@ static int dev_acquisition_stop(struct sr_dev_inst *sdi, void *cb_data) if (!devc->abort) { devc->abort = TRUE; - command_wr_reg(usb->devhdl, 3, EEWP_ADDR); + command_wr_reg(usb->devhdl, bmFORCE_RDY, EEWP_ADDR); } return SR_OK; } -static int dev_test(struct sr_dev_inst *sdi) -{ - if (sdi) { - struct sr_usb_dev_inst *usb; - struct version_info vi; - int ret; - - usb = sdi->conn; - ret = command_get_fw_version(usb->devhdl, &vi); - if (ret != SR_OK) { - sr_err("Device don't exist!"); - return SR_ERR; - } else { - return SR_OK; - } - } else { - return SR_ERR; - } -} - static int dev_status_get(struct sr_dev_inst *sdi, struct sr_status *status, int begin, int end) { int ret = SR_ERR; @@ -2906,7 +2908,6 @@ SR_PRIV struct sr_dev_driver DSCope_driver_info = { .config_list = config_list, .dev_open = dev_open, .dev_close = dev_close, - .dev_test = dev_test, .dev_status_get = dev_status_get, .dev_acquisition_start = dev_acquisition_start, .dev_acquisition_stop = dev_acquisition_stop, diff --git a/libsigrok4DSL/hardware/DSL/dsl.h b/libsigrok4DSL/hardware/DSL/dsl.h index 4916367f..62d78ff5 100644 --- a/libsigrok4DSL/hardware/DSL/dsl.h +++ b/libsigrok4DSL/hardware/DSL/dsl.h @@ -44,6 +44,7 @@ #define MAX_EMPTY_TRANSFERS (NUM_SIMUL_TRANSFERS * 2) #define DSL_REQUIRED_VERSION_MAJOR 1 +#define DSL_REQUIRED_VERSION_MINOR 1 #define MAX_8BIT_SAMPLE_RATE DS_MHZ(24) #define MAX_16BIT_SAMPLE_RATE DS_MHZ(12) @@ -51,9 +52,6 @@ /* 6 delay states of up to 256 clock ticks */ #define MAX_SAMPLE_DELAY (6 * 256) -/* Software trigger implementation: positive values indicate trigger stage. */ -#define TRIGGER_FIRED -1 - #define DEV_CAPS_16BIT_POS 0 #define DEV_CAPS_16BIT (1 << DEV_CAPS_16BIT_POS) @@ -67,6 +65,11 @@ #define VPOS_MINISTEP 0.083 #define VPOS_STEP 26.0 +#define DSLOGIC_ATOMIC_BITS 6 +#define DSLOGIC_ATOMIC_SAMPLES (1 << DSLOGIC_ATOMIC_BITS) +#define DSLOGIC_ATOMIC_SIZE (1 << (DSLOGIC_ATOMIC_BITS - 3)) +#define DSLOGIC_ATOMIC_MASK (0xFFFF << DSLOGIC_ATOMIC_BITS) + #define DSLOGIC_MAX_DSO_DEPTH SR_MB(2) //#define DSLOGIC_MAX_DSO_DEPTH SR_KB(2) #define DSLOGIC_MAX_DSO_SAMPLERATE SR_MHZ(200) @@ -78,6 +81,40 @@ #define DSCOPE_MAX_SAMPLERATE SR_MHZ(200) #define DSCOPE_INSTANT_DEPTH SR_MB(32) +/* + * for basic configuration + */ +#define TRIG_EN_BIT 0 +#define CLK_TYPE_BIT 1 +#define CLK_EDGE_BIT 2 +#define RLE_MODE_BIT 3 +#define DSO_MODE_BIT 4 +#define HALF_MODE_BIT 5 +#define QUAR_MODE_BIT 6 +#define ANALOG_MODE_BIT 7 +#define FILTER_BIT 8 +#define INSTANT_BIT 9 +#define STRIG_MODE_BIT 11 +#define STREAM_MODE_BIT 12 +#define LPB_TEST_BIT 13 +#define EXT_TEST_BIT 14 +#define INT_TEST_BIT 15 + +#define bmZERO 0x00 +#define bmEEWP 0x01 +#define bmFORCE_RDY 0x02 +#define bmFORCE_STOP 0x04 +#define bmSCOPE_SET 0x08 +#define bmSCOPE_CLR 0x08 + +/* + * for DSLogic device + * + */ +#define MAX_LOGIC_PROBES 16 +#define DSLOGIC_BASIC_MEM_DEPTH SR_KB(256) +#define DSLOGIC_MEM_DEPTH SR_MB(256) + /* * for DSCope device * trans: x << 8 + y @@ -123,7 +160,7 @@ #define DSO_AUTOTRIG_THRESHOLD 16 -#define TRIG_CHECKID 0xa500005a +#define TRIG_CHECKID 0x55555555 #define DSO_PKTID 0xa500 struct DSL_profile { @@ -142,7 +179,7 @@ struct DSL_profile { uint32_t dev_caps; }; -static const struct DSL_profile supported_DSLogic[3] = { +static const struct DSL_profile supported_DSLogic[] = { /* * DSLogic */ @@ -158,10 +195,29 @@ static const struct DSL_profile supported_DSLogic[3] = { "DSLogicPro.bin", DEV_CAPS_16BIT}, + {0x2A0E, 0x0005, NULL, "DSMso", NULL, + "DSMso.fw", + "DSMso.bin", + "DSMso.bin", + DEV_CAPS_16BIT}, + + {0x2A0E, 0x0020, NULL, "DSLogic PLus", NULL, + "DSLogicPlus.fw", + "DSLogicPlus.bin", + "DSLogicPlus.bin", + DEV_CAPS_16BIT}, + + {0x2A0E, 0x0021, NULL, "DSLogic Basic", NULL, + "DSLogicBasic.fw", + "DSLogicBasic.bin", + "DSLogicBasic.bin", + DEV_CAPS_16BIT}, + + { 0, 0, 0, 0, 0, 0, 0, 0, 0 } }; -static const struct DSL_profile supported_DSCope[3] = { +static const struct DSL_profile supported_DSCope[] = { /* * DSCope */ @@ -200,7 +256,8 @@ enum { DSL_TRIGGERED = 3, DSL_DATA = 4, DSL_STOP = 5, - DSL_FINISH = 6, + DSL_FINISH = 7, + DSL_ABORT = 8, }; struct DSL_context { @@ -217,6 +274,7 @@ struct DSL_context { uint64_t cur_samplerate; uint64_t limit_samples; uint64_t actual_samples; + uint64_t actual_bytes; /* Operational settings */ gboolean sample_wide; @@ -225,6 +283,7 @@ struct DSL_context { gboolean rle_mode; gboolean instant; uint16_t op_mode; + uint16_t buf_options; uint16_t ch_mode; uint16_t samplerates_size; uint16_t samplecounts_size; @@ -254,7 +313,8 @@ struct DSL_context { gboolean data_lock; uint8_t dso_bits; - int num_samples; + uint64_t num_samples; + uint64_t num_bytes; int submitted_transfers; int empty_transfer_count; @@ -269,64 +329,42 @@ struct DSL_context { int status; gboolean mstatus_valid; gboolean abort; + gboolean overflow; }; +/* + * hardware setting for each capture + */ struct DSL_setting { uint32_t sync; + uint16_t mode_header; // 0 uint16_t mode; - uint32_t divider_header; // 1-2 - uint32_t divider; - uint32_t count_header; // 3-4 - uint32_t count; - uint32_t trig_pos_header; // 5-6 - uint32_t trig_pos; + uint16_t divider_header; // 1-2 + uint16_t div_l; + uint16_t div_h; + uint16_t count_header; // 3-4 + uint16_t cnt_l; + uint16_t cnt_h; + uint16_t trig_pos_header; // 5-6 + uint16_t tpos_l; + uint16_t tpos_h; uint16_t trig_glb_header; // 7 uint16_t trig_glb; - uint32_t trig_adp_header; // 10-11 - uint32_t trig_adp; - uint32_t trig_sda_header; // 12-13 - uint32_t trig_sda; - uint32_t trig_mask0_header; // 16 + uint16_t ch_en_header; // 8 + uint16_t ch_en; + + uint16_t trig_header; // 64 uint16_t trig_mask0[NUM_TRIGGER_STAGES]; - uint32_t trig_mask1_header; // 17 uint16_t trig_mask1[NUM_TRIGGER_STAGES]; - //uint32_t trig_mask2_header; // 18 - //uint16_t trig_mask2[NUM_TRIGGER_STAGES]; - //uint32_t trig_mask3_header; // 19 - //uint16_t trig_mask3[NUM_TRIGGER_STAGES]; - uint32_t trig_value0_header; // 20 uint16_t trig_value0[NUM_TRIGGER_STAGES]; - uint32_t trig_value1_header; // 21 uint16_t trig_value1[NUM_TRIGGER_STAGES]; - //uint32_t trig_value2_header; // 22 - //uint16_t trig_value2[NUM_TRIGGER_STAGES]; - //uint32_t trig_value3_header; // 23 - //uint16_t trig_value3[NUM_TRIGGER_STAGES]; - uint32_t trig_edge0_header; // 24 uint16_t trig_edge0[NUM_TRIGGER_STAGES]; - uint32_t trig_edge1_header; // 25 uint16_t trig_edge1[NUM_TRIGGER_STAGES]; - //uint32_t trig_edge2_header; // 26 - //uint16_t trig_edge2[NUM_TRIGGER_STAGES]; - //uint32_t trig_edge3_header; // 27 - //uint16_t trig_edge3[NUM_TRIGGER_STAGES]; - uint32_t trig_count0_header; // 28 - uint32_t trig_count0[NUM_TRIGGER_STAGES]; - uint32_t trig_count1_header; // 29 - uint32_t trig_count1[NUM_TRIGGER_STAGES]; - //uint32_t trig_count2_header; // 30 - //uint16_t trig_count2[NUM_TRIGGER_STAGES]; - //uint32_t trig_count3_header; // 31 - //uint16_t trig_count3[NUM_TRIGGER_STAGES]; - uint32_t trig_logic0_header; // 32 uint16_t trig_logic0[NUM_TRIGGER_STAGES]; - uint32_t trig_logic1_header; // 33 uint16_t trig_logic1[NUM_TRIGGER_STAGES]; - //uint32_t trig_logic2_header; // 34 - //uint16_t trig_logic2[NUM_TRIGGER_STAGES]; - //uint32_t trig_logic3_header; // 35 - //uint16_t trig_logic3[NUM_TRIGGER_STAGES]; + uint32_t trig_count[NUM_TRIGGER_STAGES]; + uint32_t end_sync; }; diff --git a/libsigrok4DSL/hardware/DSL/dslogic.c b/libsigrok4DSL/hardware/DSL/dslogic.c index 973a2667..ec0956c3 100644 --- a/libsigrok4DSL/hardware/DSL/dslogic.c +++ b/libsigrok4DSL/hardware/DSL/dslogic.c @@ -33,10 +33,11 @@ #undef min #define min(a,b) ((a)<(b)?(a):(b)) +#undef max +#define max(a,b) ((a)>(b)?(a):(b)) static const int single_buffer_time = 20; static const int total_buffer_time = 200; -static const int buffer_size = 1024 * 1024; static const int instant_buffer_size = 1024 * 1024; static const int cons_buffer_size = 128; static const int buffer_cnt = 4; @@ -59,16 +60,23 @@ static const char *opmodes[] = { "DRAM Loopback Test", }; -static uint16_t opmodes_show_count = 3; +static const char *bufoptions[] = { + "Stop immediately", + "Upload captured data", +}; static const char *stream_ch_modes[] = { - "Use Channels 0~15 (Max 10MHz)", - "Use Channels 0~7 (Max 25MHz)", + "Use 16 Channels (Max 20MHz)", + "Use 12 Channels (Max 25MHz)", + "Use 6 Channels (Max 50MHz)", + "Use 3 Channels (Max 100MHz)", }; static const uint16_t stream_ch_num[] = { 16, - 8, + 12, + 6, + 3, }; static const char *buffer_ch_modes[] = { @@ -78,9 +86,9 @@ static const char *buffer_ch_modes[] = { }; static const uint16_t buffer_ch_num[] = { - 16, - 8, - 4, + MAX_LOGIC_PROBES, + MAX_LOGIC_PROBES / 2, + MAX_LOGIC_PROBES / 4, }; static const char *thresholds[] = { @@ -117,6 +125,7 @@ static const int32_t hwcaps[] = { static const int32_t hwoptions[] = { SR_CONF_OPERATION_MODE, + SR_CONF_BUFFER_OPTIONS, SR_CONF_THRESHOLD, SR_CONF_FILTER, SR_CONF_MAX_HEIGHT, @@ -126,6 +135,7 @@ static const int32_t hwoptions[] = { static const int32_t hwoptions_pro[] = { SR_CONF_OPERATION_MODE, + SR_CONF_BUFFER_OPTIONS, SR_CONF_VTH, SR_CONF_FILTER, SR_CONF_MAX_HEIGHT, @@ -134,7 +144,9 @@ static const int32_t hwoptions_pro[] = { }; static const int32_t sessions[] = { + SR_CONF_MAX_HEIGHT, SR_CONF_OPERATION_MODE, + SR_CONF_BUFFER_OPTIONS, SR_CONF_CHANNEL_MODE, SR_CONF_SAMPLERATE, SR_CONF_LIMIT_SAMPLES, @@ -150,7 +162,9 @@ static const int32_t sessions[] = { }; static const int32_t sessions_pro[] = { + SR_CONF_MAX_HEIGHT, SR_CONF_OPERATION_MODE, + SR_CONF_BUFFER_OPTIONS, SR_CONF_CHANNEL_MODE, SR_CONF_SAMPLERATE, SR_CONF_LIMIT_SAMPLES, @@ -236,8 +250,14 @@ static const uint64_t samplecounts[] = { SR_MB(128), SR_MB(256), SR_MB(512), + SR_GB(1), + SR_GB(2), + SR_GB(4), + SR_GB(8), + SR_GB(16), }; +static uint16_t opmodes_show_count = 3; static const uint8_t zero_base_addr = 0x80; SR_PRIV struct sr_dev_driver DSLogic_driver_info; @@ -305,6 +325,32 @@ static int en_ch_num(const struct sr_dev_inst *sdi) return channel_en_cnt; } +static int counts_size(const struct sr_dev_inst *sdi) +{ + struct DSL_context *devc = sdi->priv; + if (strcmp(sdi->model, "DSLogic Basic") == 0) + if (sdi->mode == ANALOG) + return 5; + else if (!devc || devc->op_mode == SR_OP_STREAM) + return ARRAY_SIZE(samplecounts); + else + return 15; + else + if (sdi->mode == ANALOG) + return 15; + else + return ARRAY_SIZE(samplecounts); +} + +static uint64_t channel_depth(const struct sr_dev_inst *sdi) +{ + int ch_num = en_ch_num(sdi); + if (strcmp(sdi->model, "DSLogic Basic") == 0) + return DSLOGIC_BASIC_MEM_DEPTH / (ch_num ? ch_num : 1); + else + return DSLOGIC_MEM_DEPTH / (ch_num ? ch_num : 1); +} + static int fpga_setting(const struct sr_dev_inst *sdi) { struct DSL_context *devc; @@ -315,9 +361,10 @@ static int fpga_setting(const struct sr_dev_inst *sdi) int transferred; int result; int i; - int channel_en_cnt = 0; - int channel_cnt = 0; GSList *l; + uint32_t tmp_u32; + uint64_t tmp_u64; + const int ch_num = en_ch_num(sdi); devc = sdi->priv; usb = sdi->conn; @@ -325,66 +372,68 @@ static int fpga_setting(const struct sr_dev_inst *sdi) setting.sync = 0xf5a5f5a5; setting.mode_header = 0x0001; - setting.divider_header = 0x0102ffff; - setting.count_header = 0x0302ffff; - setting.trig_pos_header = 0x0502ffff; + setting.divider_header = 0x0102; + setting.count_header = 0x0302; + setting.trig_pos_header = 0x0502; setting.trig_glb_header = 0x0701; - setting.trig_adp_header = 0x0a02ffff; - setting.trig_sda_header = 0x0c02ffff; - setting.trig_mask0_header = 0x1010ffff; - setting.trig_mask1_header = 0x1110ffff; - //setting.trig_mask2_header = 0x1210ffff; - //setting.trig_mask3_header = 0x1310ffff; - setting.trig_value0_header = 0x1410ffff; - setting.trig_value1_header = 0x1510ffff; - //setting.trig_value2_header = 0x1610ffff; - //setting.trig_value3_header = 0x1710ffff; - setting.trig_edge0_header = 0x1810ffff; - setting.trig_edge1_header = 0x1910ffff; - //setting.trig_edge2_header = 0x1a10ffff; - //setting.trig_edge3_header = 0x1b10ffff; - setting.trig_count0_header = 0x1c20ffff; - setting.trig_count1_header = 0x1d20ffff; - //setting.trig_count2_header = 0x1e10ffff; - //setting.trig_count3_header = 0x1f10ffff; - setting.trig_logic0_header = 0x2010ffff; - setting.trig_logic1_header = 0x2110ffff; - //setting.trig_logic2_header = 0x2210ffff; - //setting.trig_logic3_header = 0x2310ffff; + setting.ch_en_header = 0x0801; + setting.trig_header = 0x40a0; setting.end_sync = 0xfa5afa5a; - devc->rle_mode = FALSE; - if (sdi->mode == LOGIC && - !devc->stream && - devc->limit_samples > DSLOGIC_MAX_LOGIC_DEPTH*ceil(devc->cur_samplerate * 1.0 / DSLOGIC_MAX_LOGIC_SAMPLERATE)) - devc->rle_mode = TRUE; + // basic configuration + setting.mode = (trigger->trigger_en << TRIG_EN_BIT) + + (devc->clock_type << CLK_TYPE_BIT) + + (devc->clock_edge << CLK_EDGE_BIT) + + (devc->rle_mode << RLE_MODE_BIT) + + ((sdi->mode == DSO) << DSO_MODE_BIT) + + ((((devc->cur_samplerate == (2 * DSLOGIC_MAX_LOGIC_SAMPLERATE)) && sdi->mode != DSO) || (sdi->mode == ANALOG)) << HALF_MODE_BIT) + + ((devc->cur_samplerate == (4 * DSLOGIC_MAX_LOGIC_SAMPLERATE)) << QUAR_MODE_BIT) + + ((sdi->mode == ANALOG) << ANALOG_MODE_BIT) + + ((devc->filter == SR_FILTER_1T) << FILTER_BIT) + + (devc->instant << INSTANT_BIT) + + ((trigger->trigger_mode == SERIAL_TRIGGER) << STRIG_MODE_BIT) + + ((devc->stream) << STREAM_MODE_BIT) + + ((devc->op_mode == SR_OP_LOOPBACK_TEST) << LPB_TEST_BIT) + + ((devc->op_mode == SR_OP_EXTERNAL_TEST) << EXT_TEST_BIT) + + ((devc->op_mode == SR_OP_INTERNAL_TEST) << INT_TEST_BIT); - //setting.mode = (test_mode ? 0x8000 : 0x0000) + trigger->trigger_en + (sdi->mode << 4); - setting.mode = ((devc->op_mode == SR_OP_INTERNAL_TEST) << 15) + - ((devc->op_mode == SR_OP_EXTERNAL_TEST) << 14) + - ((devc->op_mode == SR_OP_LOOPBACK_TEST) << 13) + - ((devc->stream) << 12) + - ((trigger->trigger_mode == SERIAL_TRIGGER) << 11) + - trigger->trigger_en + - ((sdi->mode == DSO) << 4) + (devc->clock_type << 1) + (devc->clock_edge << 2) + - (devc->rle_mode << 3) + - ((((devc->cur_samplerate == (2 * DSLOGIC_MAX_LOGIC_SAMPLERATE)) && sdi->mode != DSO) || (sdi->mode == ANALOG)) << 5) + - ((devc->cur_samplerate == (4 * DSLOGIC_MAX_LOGIC_SAMPLERATE)) << 6) + - ((sdi->mode == ANALOG) << 7) + - ((devc->filter == SR_FILTER_1T) << 8) + - (devc->instant << 9); - - setting.divider = (sdi->mode == DSO) ? (uint32_t)ceil(DSLOGIC_MAX_DSO_SAMPLERATE * 1.0 / devc->cur_samplerate / en_ch_num(sdi)) : - (uint32_t)ceil(DSLOGIC_MAX_LOGIC_SAMPLERATE * 1.0 / devc->cur_samplerate); + // sample rate divider + tmp_u32 = (sdi->mode == DSO) ? (uint32_t)ceil(DSLOGIC_MAX_DSO_SAMPLERATE * 1.0 / devc->cur_samplerate / ch_num) : + (uint32_t)ceil(DSLOGIC_MAX_LOGIC_SAMPLERATE * 1.0 / devc->cur_samplerate); + setting.div_l = tmp_u32 & 0x0000ffff; + setting.div_h = tmp_u32 >> 16; + // capture counter // analog: 16bits, but sample with half mode(0-7 valid only) - setting.count = (sdi->mode == DSO) ? (uint32_t)(devc->limit_samples / (g_slist_length(sdi->channels) / en_ch_num(sdi))) : - (sdi->mode == ANALOG) ? (uint32_t)(devc->limit_samples * g_slist_length(sdi->channels) * 4) : - (uint32_t)(devc->limit_samples); - setting.trig_pos = (uint32_t)(trigger->trigger_pos / 100.0 * devc->limit_samples); - setting.trig_glb = trigger->trigger_stages; - setting.trig_adp = setting.count - setting.trig_pos - 1; - setting.trig_sda = 0x0; + tmp_u64 = (sdi->mode == DSO) ? (devc->limit_samples / (g_slist_length(sdi->channels) / ch_num)) : + (sdi->mode == ANALOG) ? (devc->limit_samples * g_slist_length(sdi->channels) * 4) : + (devc->limit_samples); + tmp_u64 >>= 4; // hardware minimum unit 64 + setting.cnt_l = tmp_u64 & 0x0000ffff; + setting.cnt_h = tmp_u64 >> 16; + + // trigger position + // must be align to minimum parallel bits + tmp_u32 = max((uint32_t)(trigger->trigger_pos / 100.0 * devc->limit_samples), DSLOGIC_ATOMIC_SAMPLES); + if (devc->stream) + tmp_u32 = min(tmp_u32, channel_depth(sdi) * 10 / 100); + else + tmp_u32 = min(tmp_u32, channel_depth(sdi) * DS_MAX_TRIG_PERCENT / 100); + setting.tpos_l = tmp_u32 & DSLOGIC_ATOMIC_MASK; + setting.tpos_h = tmp_u32 >> 16; + + // trigger global settings + setting.trig_glb = ((ch_num & 0xf) << 4) + + trigger->trigger_stages; + + // channel enable mapping + setting.ch_en = 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; + } + + // 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); @@ -395,12 +444,51 @@ static int fpga_setting(const struct sr_dev_inst *sdi) setting.trig_edge0[0] = ds_trigger_get_edge0(TriggerStages); setting.trig_edge1[0] = ds_trigger_get_edge1(TriggerStages); - setting.trig_count0[0] = trigger->trigger0_count[TriggerStages]; - setting.trig_count1[0] = trigger->trigger1_count[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.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]; + setting.trig_count[0] = trigger->trigger0_count[TriggerStages]; + for (i = 1; i < NUM_TRIGGER_STAGES; i++) { setting.trig_mask0[i] = 0xffff; setting.trig_mask1[i] = 0xffff; @@ -411,11 +499,10 @@ static int fpga_setting(const struct sr_dev_inst *sdi) setting.trig_edge0[i] = 0; setting.trig_edge1[i] = 0; - setting.trig_count0[i] = 0; - setting.trig_count1[i] = 0; - setting.trig_logic0[i] = 2; setting.trig_logic1[i] = 2; + + setting.trig_count[i] = 0; } } else { for (i = 0; i < NUM_TRIGGER_STAGES; i++) { @@ -428,11 +515,54 @@ static int fpga_setting(const struct sr_dev_inst *sdi) setting.trig_edge0[i] = ds_trigger_get_edge0(i); setting.trig_edge1[i] = ds_trigger_get_edge1(i); - setting.trig_count0[i] = trigger->trigger0_count[i]; - setting.trig_count1[i] = trigger->trigger1_count[i]; + if (setting.mode & (1 << STRIG_MODE_BIT) && i == STriggerDataStage) { + // serial trigger, data mask/value should not be duplicated + } 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); + } + } 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]; + + setting.trig_count[i] = trigger->trigger0_count[i]; } } @@ -490,11 +620,9 @@ static int fpga_config(struct libusb_device_handle *hdl, const char *filename) if (chunksize == 0) break; - //do { - ret = libusb_bulk_transfer(hdl, 2 | LIBUSB_ENDPOINT_OUT, - buf, chunksize, - &transferred, 1000); - //} while(ret == LIBUSB_ERROR_TIMEOUT); + ret = libusb_bulk_transfer(hdl, 2 | LIBUSB_ENDPOINT_OUT, + buf, chunksize, + &transferred, 1000); if (ret < 0) { sr_err("Unable to configure FPGA of DSLogic: %s.", @@ -599,18 +727,19 @@ static int DSLogic_dev_open(struct sr_dev_inst *sdi) } /* - * Changes in major version mean incompatible/API changes, so - * bail out if we encounter an incompatible version. - * Different minor versions are OK, they should be compatible. + * Different versions may have incompatible issue, + * Mark for up level process */ - if (vi.major != DSL_REQUIRED_VERSION_MAJOR) { - sr_err("Expected firmware version %d.x, " - "got %d.%d.", DSL_REQUIRED_VERSION_MAJOR, + if (vi.major != DSL_REQUIRED_VERSION_MAJOR || + vi.minor != DSL_REQUIRED_VERSION_MINOR) { + sr_err("Expected firmware version %d.%d, " + "got %d.%d.", DSL_REQUIRED_VERSION_MAJOR, DSL_REQUIRED_VERSION_MINOR, vi.major, vi.minor); - break; + sdi->status = SR_ST_INCOMPATIBLE; + } else { + sdi->status = SR_ST_ACTIVE; } - sdi->status = SR_ST_ACTIVE; sr_info("Opened device %d on %d.%d, " "interface %d, firmware %d.%d.", sdi->index, usb->bus, usb->address, @@ -623,7 +752,8 @@ static int DSLogic_dev_open(struct sr_dev_inst *sdi) } libusb_free_device_list(devlist, 1); - if (sdi->status != SR_ST_ACTIVE) + if ((sdi->status != SR_ST_ACTIVE) && + (sdi->status != SR_ST_INCOMPATIBLE)) return SR_ERR; return SR_OK; @@ -664,19 +794,10 @@ static int configure_probes(const struct sr_dev_inst *sdi) } } - if (stage == -1) - /* - * We didn't configure any triggers, make sure acquisition - * doesn't wait for any. - */ - devc->trigger_stage = TRIGGER_FIRED; - else - devc->trigger_stage = 0; - return SR_OK; } -static struct DSL_context *DSLogic_dev_new(void) +static struct DSL_context *DSLogic_dev_new(const struct sr_dev_inst *sdi) { struct DSL_context *devc; @@ -694,10 +815,11 @@ static struct DSL_context *DSLogic_dev_new(void) devc->clock_edge = FALSE; devc->rle_mode = FALSE; devc->instant = FALSE; - devc->op_mode = SR_OP_BUFFER; + devc->op_mode = SR_OP_STREAM; + devc->buf_options = SR_BUF_UPLOAD; devc->ch_mode = 0; - devc->samplerates_size = 14; - devc->samplecounts_size = ARRAY_SIZE(samplecounts); + devc->samplerates_size = 11; + devc->samplecounts_size = counts_size(sdi); devc->th_level = SR_TH_3V3; devc->vth = 1.0; devc->filter = SR_FILTER_NONE; @@ -708,7 +830,7 @@ static struct DSL_context *DSLogic_dev_new(void) devc->trigger_hrate = 0; devc->trigger_holdoff = 0; devc->zero = FALSE; - devc->stream = FALSE; + devc->stream = (devc->op_mode == SR_OP_STREAM); devc->mstatus_valid = FALSE; devc->data_lock = FALSE; devc->max_height = 0; @@ -766,9 +888,7 @@ static int set_probes(struct sr_dev_inst *sdi, int num_probes) static int adjust_probes(struct sr_dev_inst *sdi, int num_probes) { uint16_t j; - GSList *l; struct sr_channel *probe; - GSList *p; assert(num_probes > 0); @@ -867,7 +987,7 @@ static GSList *scan(GSList *options) if (set_probes(sdi, num_logic_probes) != SR_OK) return NULL; - devc = DSLogic_dev_new(); + devc = DSLogic_dev_new(sdi); devc->profile = prof; sdi->priv = devc; drvc->instances = g_slist_append(drvc->instances, sdi); @@ -919,14 +1039,14 @@ static GSList *dev_mode_list(const struct sr_dev_inst *sdi) GSList *l = NULL; int i; - if (strcmp(sdi->model, "DSLogic Pro") == 0) { - for(i = 0; i < ARRAY_SIZE(pro_mode_list); i++) { - l = g_slist_append(l, &pro_mode_list[i]); - } - } else { + if (strcmp(sdi->model, "DSLogic") == 0) { for(i = 0; i < ARRAY_SIZE(mode_list); i++) { l = g_slist_append(l, &mode_list[i]); } + } else { + for(i = 0; i < ARRAY_SIZE(pro_mode_list); i++) { + l = g_slist_append(l, &pro_mode_list[i]); + } } return l; } @@ -1116,6 +1236,8 @@ static int config_get(int id, GVariant **data, const struct sr_dev_inst *sdi, struct DSL_context *devc; struct sr_usb_dev_inst *usb; char str[128]; + uint8_t tmp_u8; + int ret; (void)cg; @@ -1167,6 +1289,20 @@ static int config_get(int id, GVariant **data, const struct sr_dev_inst *sdi, devc = sdi->priv; *data = g_variant_new_boolean(devc->rle_mode); break; + case SR_CONF_WAIT_UPLOAD: + if (!sdi) + return SR_ERR; + devc = sdi->priv; + usb = sdi->conn; + if (devc->buf_options == SR_BUF_UPLOAD && + devc->status == DSL_START) { + devc->status = DSL_ABORT; + command_wr_reg(usb->devhdl, bmFORCE_STOP, EEWP_ADDR); + *data = g_variant_new_boolean(TRUE); + } else { + *data = g_variant_new_boolean(FALSE); + } + break; case SR_CONF_INSTANT: if (!sdi) return SR_ERR; @@ -1179,6 +1315,12 @@ static int config_get(int id, GVariant **data, const struct sr_dev_inst *sdi, devc = sdi->priv; *data = g_variant_new_string(opmodes[devc->op_mode]); break; + case SR_CONF_BUFFER_OPTIONS: + if (!sdi) + return SR_ERR; + devc = sdi->priv; + *data = g_variant_new_string(bufoptions[devc->buf_options]); + break; case SR_CONF_CHANNEL_MODE: if (!sdi) return SR_ERR; @@ -1338,22 +1480,11 @@ static int config_get(int id, GVariant **data, const struct sr_dev_inst *sdi, return SR_ERR; *data = g_variant_new_uint64(DSLOGIC_MAX_DSO_DEPTH); break; - case SR_CONF_MAX_LOGIC_SAMPLERATE: - if (!sdi) - return SR_ERR; - *data = g_variant_new_uint64(DSLOGIC_MAX_LOGIC_SAMPLERATE); - break; - case SR_CONF_MAX_LOGIC_SAMPLELIMITS: + case SR_CONF_HW_DEPTH: if (!sdi) return SR_ERR; devc = sdi->priv; - *data = g_variant_new_uint64(DSLOGIC_MAX_LOGIC_DEPTH*ceil(devc->cur_samplerate * 1.0 / DSLOGIC_MAX_LOGIC_SAMPLERATE)); - break; - case SR_CONF_RLE_SAMPLELIMITS: - if (!sdi) - return SR_ERR; - devc = sdi->priv; - *data = g_variant_new_uint64(DSLOGIC_MAX_LOGIC_DEPTH*ceil(samplerates[devc->samplerates_size-1] * 1.0 / DSLOGIC_MAX_LOGIC_SAMPLERATE)); + *data = g_variant_new_uint64(channel_depth(sdi)); break; case SR_CONF_DSO_BITS: if (!sdi) @@ -1361,6 +1492,28 @@ static int config_get(int id, GVariant **data, const struct sr_dev_inst *sdi, devc = sdi->priv; *data = g_variant_new_byte(devc->dso_bits); break; + case SR_CONF_HW_STATUS: + if (!sdi) + return SR_ERR; + devc = sdi->priv; + usb = sdi->conn; + ret = command_get_hw_info(usb->devhdl, &tmp_u8); + if (ret == SR_OK) { + devc->overflow = tmp_u8 & 0x10; + *data = g_variant_new_byte(tmp_u8); + } else { + *data = g_variant_new_byte(0); + } + break; + case SR_CONF_VLD_CH_NUM: + if (!sdi) + return SR_ERR; + devc = sdi->priv; + if (devc->stream) + *data = g_variant_new_int16(stream_ch_num[devc->ch_mode]); + else + *data = g_variant_new_int16(buffer_ch_num[devc->ch_mode]); + break; default: return SR_ERR_NA; } @@ -1390,12 +1543,15 @@ static int config_set(int id, GVariant *data, struct sr_dev_inst *sdi, ret = SR_OK; if (id == SR_CONF_SAMPLERATE) { - devc->cur_samplerate = g_variant_get_uint64(data); - if(sdi->mode == DSO) { - devc->sample_wide = (devc->cur_samplerate <= DSLOGIC_MAX_DSO_SAMPLERATE); - ret = command_dso_ctrl(usb->devhdl, dso_cmd_gen(sdi, 0, SR_CONF_SAMPLERATE)); - } else { - devc->sample_wide = (devc->cur_samplerate <= DSLOGIC_MAX_LOGIC_SAMPLERATE); + if ((devc->op_mode != SR_OP_INTERNAL_TEST) && + (devc->op_mode != SR_OP_EXTERNAL_TEST)) { + devc->cur_samplerate = g_variant_get_uint64(data); + if(sdi->mode == DSO) { + devc->sample_wide = (devc->cur_samplerate <= DSLOGIC_MAX_DSO_SAMPLERATE); + ret = command_dso_ctrl(usb->devhdl, dso_cmd_gen(sdi, 0, SR_CONF_SAMPLERATE)); + } else { + devc->sample_wide = (devc->cur_samplerate <= DSLOGIC_MAX_LOGIC_SAMPLERATE); + } } } else if (id == SR_CONF_CLOCK_TYPE) { devc->clock_type = g_variant_get_boolean(data); @@ -1418,9 +1574,10 @@ static int config_set(int id, GVariant *data, struct sr_dev_inst *sdi, } else if (id == SR_CONF_DEVICE_MODE) { sdi->mode = g_variant_get_int16(data); if (sdi->mode == LOGIC) { + command_wr_reg(usb->devhdl, bmSCOPE_CLR, EEWP_ADDR); num_probes = devc->profile->dev_caps & DEV_CAPS_16BIT ? 16 : 8; - devc->samplecounts_size = ARRAY_SIZE(samplecounts); } else if (sdi->mode == DSO) { + command_wr_reg(usb->devhdl, bmSCOPE_SET, EEWP_ADDR); num_probes = devc->profile->dev_caps & DEV_CAPS_16BIT ? MAX_DSO_PROBES_NUM : 1; ret = command_dso_ctrl(usb->devhdl, dso_cmd_gen(sdi, NULL, SR_CONF_DSO_SYNC)); if (ret != SR_OK) @@ -1428,14 +1585,14 @@ static int config_set(int id, GVariant *data, struct sr_dev_inst *sdi, devc->cur_samplerate = DSLOGIC_MAX_DSO_SAMPLERATE / num_probes; devc->limit_samples = DSLOGIC_MAX_DSO_DEPTH / num_probes; devc->samplerates_size = 15; - devc->samplecounts_size = ARRAY_SIZE(samplecounts); } else if (sdi->mode == ANALOG){ + command_wr_reg(usb->devhdl, bmSCOPE_CLR, EEWP_ADDR); num_probes = devc->profile->dev_caps & DEV_CAPS_16BIT ? MAX_ANALOG_PROBES_NUM : 1; devc->op_mode = SR_OP_STREAM; devc->stream = TRUE; devc->samplerates_size = 10; - devc->samplecounts_size = 15; } + devc->samplecounts_size = counts_size(sdi); sr_dev_probes_free(sdi); set_probes(sdi, num_probes); sr_dbg("%s: setting mode to %d", __func__, sdi->mode); @@ -1450,28 +1607,38 @@ static int config_set(int id, GVariant *data, struct sr_dev_inst *sdi, devc->stream = FALSE; devc->ch_mode = 0; devc->samplerates_size = 14; - adjust_probes(sdi, buffer_ch_num[0]); + adjust_probes(sdi, MAX_LOGIC_PROBES); } else if (!strcmp(stropt, opmodes[SR_OP_STREAM]) && (devc->op_mode != SR_OP_STREAM)) { devc->op_mode = SR_OP_STREAM; devc->stream = TRUE; devc->ch_mode = 0; - devc->samplerates_size = 10; - adjust_probes(sdi, stream_ch_num[0]); + devc->samplerates_size = 11; + adjust_probes(sdi, MAX_LOGIC_PROBES); } else if (!strcmp(stropt, opmodes[SR_OP_INTERNAL_TEST]) && (devc->op_mode != SR_OP_INTERNAL_TEST)) { devc->op_mode = SR_OP_INTERNAL_TEST; - devc->stream = FALSE; + if (strcmp(sdi->model, "DSLogic Basic") == 0) { + devc->stream = TRUE; + devc->samplerates_size = 11; + } else { + devc->stream = FALSE; + devc->samplerates_size = 14; + } devc->ch_mode = 0; - devc->samplerates_size = 14; - adjust_probes(sdi, buffer_ch_num[0]); + adjust_probes(sdi, MAX_LOGIC_PROBES); devc->limit_samples = DSLOGIC_MAX_LOGIC_DEPTH; 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)) { devc->op_mode = SR_OP_EXTERNAL_TEST; - devc->stream = FALSE; + if (strcmp(sdi->model, "DSLogic Basic") == 0) { + devc->stream = TRUE; + devc->samplerates_size = 11; + } else { + devc->stream = FALSE; + devc->samplerates_size = 14; + } devc->ch_mode = 0; - devc->samplerates_size = 14; - adjust_probes(sdi, buffer_ch_num[0]); + adjust_probes(sdi, MAX_LOGIC_PROBES); devc->limit_samples = DSLOGIC_MAX_LOGIC_DEPTH; devc->cur_samplerate = DSLOGIC_MAX_LOGIC_SAMPLERATE; devc->sample_wide = TRUE; @@ -1480,7 +1647,7 @@ static int config_set(int id, GVariant *data, struct sr_dev_inst *sdi, devc->stream = FALSE; devc->ch_mode = 0; devc->samplerates_size = 14; - adjust_probes(sdi, buffer_ch_num[0]); + adjust_probes(sdi, MAX_LOGIC_PROBES); devc->limit_samples = DSLOGIC_MAX_LOGIC_DEPTH; devc->cur_samplerate = DSLOGIC_MAX_LOGIC_SAMPLERATE; devc->sample_wide = TRUE; @@ -1495,10 +1662,18 @@ static int config_set(int id, GVariant *data, struct sr_dev_inst *sdi, devc->op_mode = SR_OP_STREAM; devc->stream = TRUE; devc->samplerates_size = 10; - devc->samplecounts_size = 15; } + devc->samplecounts_size = counts_size(sdi); sr_dbg("%s: setting pattern to %d", __func__, devc->op_mode); + } else if (id == SR_CONF_BUFFER_OPTIONS) { + stropt = g_variant_get_string(data, NULL); + if (sdi->mode == LOGIC) { + if (!strcmp(stropt, bufoptions[SR_BUF_STOP])) + devc->buf_options = SR_BUF_STOP; + else if (!strcmp(stropt, bufoptions[SR_BUF_UPLOAD])) + devc->buf_options = SR_BUF_UPLOAD; + } } else if (id == SR_CONF_CHANNEL_MODE) { stropt = g_variant_get_string(data, NULL); if (sdi->mode == LOGIC) { @@ -1506,8 +1681,8 @@ static int config_set(int id, GVariant *data, struct sr_dev_inst *sdi, for (i = 0; i < ARRAY_SIZE(stream_ch_modes); i++) if (!strcmp(stropt, stream_ch_modes[i])) { devc->ch_mode = i; - devc->samplerates_size = 10 + i * 2; - adjust_probes(sdi, stream_ch_num[i]); + devc->samplerates_size = 11 + i; + adjust_probes(sdi, MAX_LOGIC_PROBES); break; } } else { @@ -1762,20 +1937,20 @@ static int config_list(int key, GVariant **data, const struct sr_dev_inst *sdi, case SR_CONF_DEVICE_CONFIGS: // *data = g_variant_new_fixed_array(G_VARIANT_TYPE_INT32, // hwcaps, ARRAY_SIZE(hwcaps), sizeof(int32_t)); - if (strcmp(sdi->model, "DSLogic Pro") == 0) - *data = g_variant_new_from_data(G_VARIANT_TYPE("ai"), - hwoptions_pro, ARRAY_SIZE(hwoptions_pro)*sizeof(int32_t), TRUE, NULL, NULL); - else + if (strcmp(sdi->model, "DSLogic") == 0) *data = g_variant_new_from_data(G_VARIANT_TYPE("ai"), hwoptions, ARRAY_SIZE(hwoptions)*sizeof(int32_t), TRUE, NULL, NULL); - break; - case SR_CONF_DEVICE_SESSIONS: - if (strcmp(sdi->model, "DSLogic Pro") == 0) - *data = g_variant_new_from_data(G_VARIANT_TYPE("ai"), - sessions_pro, ARRAY_SIZE(sessions_pro)*sizeof(int32_t), TRUE, NULL, NULL); else + *data = g_variant_new_from_data(G_VARIANT_TYPE("ai"), + hwoptions_pro, ARRAY_SIZE(hwoptions_pro)*sizeof(int32_t), TRUE, NULL, NULL); + break; + case SR_CONF_DEVICE_SESSIONS: + if (strcmp(sdi->model, "DSLogic") == 0) *data = g_variant_new_from_data(G_VARIANT_TYPE("ai"), sessions, ARRAY_SIZE(sessions)*sizeof(int32_t), TRUE, NULL, NULL); + else + *data = g_variant_new_from_data(G_VARIANT_TYPE("ai"), + sessions_pro, ARRAY_SIZE(sessions_pro)*sizeof(int32_t), TRUE, NULL, NULL); break; case SR_CONF_SAMPLERATE: g_variant_builder_init(&gvb, G_VARIANT_TYPE("a{sv}")); @@ -1799,6 +1974,9 @@ static int config_list(int key, GVariant **data, const struct sr_dev_inst *sdi, case SR_CONF_OPERATION_MODE: *data = g_variant_new_strv(opmodes, opmodes_show_count); break; + case SR_CONF_BUFFER_OPTIONS: + *data = g_variant_new_strv(bufoptions, ARRAY_SIZE(bufoptions)); + break; case SR_CONF_CHANNEL_MODE: if (devc->stream) *data = g_variant_new_strv(stream_ch_modes, ARRAY_SIZE(stream_ch_modes)); @@ -1830,7 +2008,8 @@ static int dev_open(struct sr_dev_inst *sdi) GSList *l; int ret; int64_t timediff_us, timediff_ms; - uint8_t fpga_done; + uint8_t hw_info; + gboolean fpga_done; devc = sdi->priv; usb = sdi->conn; @@ -1871,13 +2050,14 @@ static int dev_open(struct sr_dev_inst *sdi) return SR_ERR; } - ret = command_get_fpga_done(usb->devhdl, &fpga_done); + ret = command_get_hw_info(usb->devhdl, &hw_info); if (ret != SR_OK) { - sr_err("Failed to get fpga done infos."); + sr_err("Failed to get hardware infos."); return SR_ERR; } + fpga_done = (hw_info & 0x80) != 0; - if (fpga_done == 0) { + if (sdi->status == SR_ST_ACTIVE && !fpga_done) { if ((ret = command_fpga_config(usb->devhdl)) != SR_OK) { sr_err("%s: Send FPGA configure command failed!", __func__); } else { @@ -1971,6 +2151,7 @@ static void finish_acquisition(struct DSL_context *devc) sr_err("%s: send SR_DF_END packet", __func__); /* Terminate session. */ packet.type = SR_DF_END; + packet.status = SR_PKT_OK; sr_session_send(devc->cb_data, &packet); if (devc->num_transfers != 0) { @@ -1984,23 +2165,23 @@ static void finish_acquisition(struct DSL_context *devc) static void free_transfer(struct libusb_transfer *transfer) { struct DSL_context *devc; - unsigned int i; + unsigned int i; devc = transfer->user_data; - g_free(transfer->buffer); - transfer->buffer = NULL; - libusb_free_transfer(transfer); + g_free(transfer->buffer); + transfer->buffer = NULL; + libusb_free_transfer(transfer); - for (i = 0; i < devc->num_transfers; i++) { - if (devc->transfers[i] == transfer) { - devc->transfers[i] = NULL; - break; - } - } + for (i = 0; i < devc->num_transfers; i++) { + if (devc->transfers[i] == transfer) { + devc->transfers[i] = NULL; + break; + } + } - devc->submitted_transfers--; - if (devc->submitted_transfers == 0 && devc->status != DSL_TRIGGERED) + devc->submitted_transfers--; + if (devc->submitted_transfers == 0) finish_acquisition(devc); } @@ -2020,21 +2201,20 @@ static void resubmit_transfer(struct libusb_transfer *transfer) static void receive_transfer(struct libusb_transfer *transfer) { - gboolean packet_has_error = FALSE; struct sr_datafeed_packet packet; struct sr_datafeed_logic logic; struct sr_datafeed_dso dso; struct sr_datafeed_analog analog; - - int trigger_offset, i; - int trigger_offset_bytes; + uint64_t cur_sample_count; + int i, j, k; const uint8_t *cur_buf = transfer->buffer; struct DSL_context *devc = transfer->user_data; struct sr_dev_inst *sdi = devc->cb_data; const int sample_width = (devc->sample_wide) ? 2 : 1; - int cur_sample_count = transfer->actual_length / sample_width; - + + if (devc->status == DSL_START) + devc->status = DSL_DATA; if (devc->data_lock) { resubmit_transfer(transfer); return; @@ -2043,101 +2223,31 @@ static void receive_transfer(struct libusb_transfer *transfer) if (devc->abort) devc->status = DSL_STOP; - sr_info("receive_transfer(): status %d; timeout %d; received %d bytes.", - transfer->status, transfer->timeout, transfer->actual_length); + sr_info("%" PRIu64 ": receive_transfer(): status %d; timeout %d; received %d bytes.", + g_get_monotonic_time(), transfer->status, transfer->timeout, transfer->actual_length); switch (transfer->status) { - case LIBUSB_TRANSFER_NO_DEVICE: - case LIBUSB_TRANSFER_CANCELLED: - devc->status = DSL_ERROR; - break; case LIBUSB_TRANSFER_COMPLETED: case LIBUSB_TRANSFER_TIMED_OUT: /* We may have received some data though. */ break; default: - packet_has_error = TRUE; + devc->status = DSL_ERROR; break; } + packet.status = SR_PKT_OK; if (devc->status == DSL_DATA && - (transfer->actual_length == 0 || - packet_has_error)) { - devc->empty_transfer_count++; - if (devc->empty_transfer_count > MAX_EMPTY_TRANSFERS) { - devc->status = DSL_ERROR; - } - } else { - devc->empty_transfer_count = 0; - } - - trigger_offset = 0; - if (devc->status == DSL_DATA && devc->trigger_stage >= 0) { - for (i = 0; i < cur_sample_count; i++) { - const uint16_t cur_sample = devc->sample_wide ? - *((const uint16_t*)cur_buf + i) : - *((const uint8_t*)cur_buf + i); - - if ((cur_sample & devc->trigger_mask[devc->trigger_stage]) == - devc->trigger_value[devc->trigger_stage]) { - /* Match on this trigger stage. */ - devc->trigger_buffer[devc->trigger_stage] = cur_sample; - devc->trigger_stage++; - - if (devc->trigger_stage == NUM_TRIGGER_STAGES || - devc->trigger_mask[devc->trigger_stage] == 0) { - /* Match on all trigger stages, we're done. */ - trigger_offset = i + 1; - - /* - * TODO: Send pre-trigger buffer to session bus. - * Tell the frontend we hit the trigger here. - */ - packet.type = SR_DF_TRIGGER; - packet.payload = NULL; - sr_session_send(sdi, &packet); - - /* - * Send the samples that triggered it, - * since we're skipping past them. - */ - packet.type = SR_DF_LOGIC; - packet.payload = &logic; - logic.unitsize = sizeof(*devc->trigger_buffer); - logic.length = devc->trigger_stage * logic.unitsize; - logic.data = devc->trigger_buffer; - sr_session_send(sdi, &packet); - - devc->trigger_stage = TRIGGER_FIRED; - break; - } - } else if (devc->trigger_stage > 0) { - /* - * We had a match before, but not in the next sample. However, we may - * have a match on this stage in the next bit -- trigger on 0001 will - * fail on seeing 00001, so we need to go back to stage 0 -- but at - * the next sample from the one that matched originally, which the - * counter increment at the end of the loop takes care of. - */ - i -= devc->trigger_stage; - if (i < -1) - i = -1; /* Oops, went back past this buffer. */ - /* Reset trigger stage. */ - devc->trigger_stage = 0; - } - } - } - - if (devc->status == DSL_DATA && devc->trigger_stage == TRIGGER_FIRED) { + transfer->actual_length != 0) { /* Send the incoming transfer to the session bus. */ - trigger_offset_bytes = trigger_offset * sample_width; // check packet type if (sdi->mode == LOGIC) { packet.type = SR_DF_LOGIC; packet.payload = &logic; - logic.length = transfer->actual_length - trigger_offset_bytes; - logic.unitsize = sample_width; + cur_sample_count = transfer->actual_length * 8 / en_ch_num(sdi) ; + logic.length = transfer->actual_length; + logic.format = LA_CROSS_DATA; logic.data_error = 0; - logic.data = cur_buf + trigger_offset_bytes; + logic.data = cur_buf; } else if (sdi->mode == DSO) { if (!devc->instant) { const uint32_t mstatus_offset = devc->limit_samples / (g_slist_length(sdi->channels)/en_ch_num(sdi)); @@ -2180,9 +2290,10 @@ static void receive_transfer(struct libusb_transfer *transfer) dso.mqflags = SR_MQFLAG_AC; dso.samplerate_tog = (mstatus.sample_divider_tog != 0); dso.trig_flag = (mstatus.trig_flag != 0); - dso.data = cur_buf + trigger_offset_bytes; + dso.data = cur_buf; } else { - packet.type = SR_DF_ABANDON; + packet.type = SR_DF_DSO; + packet.status = SR_PKT_DATA_ERROR; devc->mstatus_valid = FALSE; } } else { @@ -2194,60 +2305,28 @@ static void receive_transfer(struct libusb_transfer *transfer) analog.mq = SR_MQ_VOLTAGE; analog.unit = SR_UNIT_VOLT; analog.mqflags = SR_MQFLAG_AC; - analog.data = cur_buf + trigger_offset_bytes; + analog.data = cur_buf; } - if ((devc->limit_samples && devc->num_samples < devc->actual_samples) || - (*(struct sr_dev_inst *)(devc->cb_data)).mode != LOGIC ) { - const uint64_t remain_length= (devc->actual_samples - devc->num_samples) * sample_width; + if ((devc->limit_samples && devc->num_bytes < devc->actual_bytes) || + sdi->mode != LOGIC ) { + const uint64_t remain_length= devc->actual_bytes - devc->num_bytes; logic.length = min(logic.length, remain_length); - /* in test mode, check data content*/ - if (devc->op_mode == SR_OP_INTERNAL_TEST) { - //for (i = 0; i < logic.length / sample_width; i++) { - for (i = 0; i < logic.length / 2; i++) { -// const uint16_t cur_sample = devc->sample_wide ? -// *((const uint16_t*)cur_buf + i) : -// *((const uint8_t*)cur_buf + i); - const uint16_t cur_sample = *((const uint16_t*)cur_buf + i); - if (test_init == 1) { - test_sample_value = cur_sample; - test_init = 0; - } - if (cur_sample != test_sample_value) { - logic.data_error = 1; - sr_err("exp: %d; act: %d", test_sample_value, cur_sample); - break; - } - test_sample_value++; - } - } - if (devc->op_mode == SR_OP_EXTERNAL_TEST) { - for (i = 0; i < logic.length / 2; i++) { - const uint16_t cur_sample = *((const uint16_t*)cur_buf + i); - if (test_init == 1) { - test_sample_value = cur_sample; - test_init = 0; - } - if (cur_sample != test_sample_value) { - logic.data_error = 1; - sr_err("exp: %d; act: %d", test_sample_value, cur_sample); - break; - } - test_sample_value = (test_sample_value + 1) % 65001; - //test_sample_value = test_sample_value + 1; - } - } - /* send data to session bus */ - if (packet.type != SR_DF_ABANDON) + if (!devc->overflow) sr_session_send(sdi, &packet); } devc->num_samples += cur_sample_count; - if ((sdi->mode != DSO || devc->instant) && + devc->num_bytes += logic.length; + if (sdi->mode == LOGIC && devc->limit_samples && - (unsigned int)devc->num_samples >= devc->actual_samples) { + devc->num_bytes >= devc->actual_bytes) { + devc->status = DSL_STOP; + } else if ((sdi->mode != DSO || devc->instant) && + devc->limit_samples && + devc->num_samples >= devc->actual_samples) { devc->status = DSL_STOP; } } @@ -2260,10 +2339,11 @@ static void receive_transfer(struct libusb_transfer *transfer) static unsigned int to_bytes_per_ms(struct DSL_context *devc) { + struct sr_dev_inst *sdi = devc->cb_data; if (devc->cur_samplerate > SR_MHZ(100)) - return SR_MHZ(100) / 1000 * (devc->sample_wide ? 2 : 1); + return SR_MHZ(100) / 1000 * en_ch_num(sdi) / 8; else - return devc->cur_samplerate / 1000 * (devc->sample_wide ? 2 : 1) ; + return devc->cur_samplerate / 1000 * en_ch_num(sdi) / 8; } static size_t get_buffer_size(struct DSL_context *devc) @@ -2299,10 +2379,104 @@ static unsigned int get_timeout(struct DSL_context *devc) total_size = get_buffer_size(devc) * get_number_of_transfers(devc); timeout = total_size / to_bytes_per_ms(devc); //return timeout + timeout / 4; /* Leave a headroom of 25% percent. */ - return 1000; + if (devc->op_mode == SR_OP_STREAM) + return timeout + timeout / 4; /* Leave a headroom of 25% percent. */ + else + return 1000; } -static int dev_transfer_start(const struct sr_dev_inst *sdi) +static int receive_data(int fd, int revents, const struct sr_dev_inst *sdi) +{ + int completed = 0; + struct timeval tv; + struct drv_context *drvc; + struct DSL_context *devc; + struct sr_usb_dev_inst *usb; + unsigned int i; + int ret; + + (void)fd; + (void)revents; + + drvc = di->priv; + devc = sdi->priv; + usb = sdi->conn; + + tv.tv_sec = tv.tv_usec = 0; + libusb_handle_events_timeout_completed(drvc->sr_ctx->libusb_ctx, &tv, &completed); + + if (devc->status == DSL_FINISH) { + if (libusb_try_lock_events(drvc->sr_ctx->libusb_ctx) == 0) { + if (libusb_event_handling_ok(drvc->sr_ctx->libusb_ctx)) { + usb = ((struct sr_dev_inst *)devc->cb_data)->conn; + + /* Stop GPIF acquisition */ + if ((ret = command_stop_acquisition (usb->devhdl)) != SR_OK) + sr_err("%s: Sent acquisition stop command failed!", __func__); + else + sr_info("%s: Sent acquisition stop command!", __func__); + + /* Remove polling */ + remove_sources(devc); + } + libusb_unlock_events(drvc->sr_ctx->libusb_ctx); + } + } + + return TRUE; +} + +static void receive_trigger_pos(struct libusb_transfer *transfer) +{ + struct DSL_context *devc; + struct sr_datafeed_packet packet; + struct ds_trigger_pos *trigger_pos; + const struct sr_dev_inst *sdi; + int ret; + uint64_t remain_cnt; + + packet.status = SR_PKT_OK; + devc = transfer->user_data; + sdi = devc->cb_data; + trigger_pos = (struct ds_trigger_pos *)transfer->buffer; + if (devc->status != DSL_ABORT) + devc->status = DSL_ERROR; + if (!devc->abort && transfer->status == LIBUSB_TRANSFER_COMPLETED && + trigger_pos->check_id == TRIG_CHECKID) { + sr_info("%" PRIu64 ": receive_trigger_pos(): status %d; timeout %d; received %d bytes.", + g_get_monotonic_time(), transfer->status, transfer->timeout, transfer->actual_length); + remain_cnt = trigger_pos->remain_cnt_h; + remain_cnt = (remain_cnt << 32) + trigger_pos->remain_cnt_l; + if (transfer->actual_length == sizeof(struct ds_trigger_pos)) { + if (sdi->mode != LOGIC || + devc->stream || + remain_cnt < devc->limit_samples) { + if (sdi->mode == LOGIC && (!devc->stream || (devc->status == DSL_ABORT))) { + devc->actual_samples = devc->limit_samples - remain_cnt; + devc->actual_bytes = devc->actual_samples / DSLOGIC_ATOMIC_SAMPLES * en_ch_num(sdi) * DSLOGIC_ATOMIC_SIZE; + devc->actual_samples = devc->actual_bytes / en_ch_num(sdi) * 8; + } + + packet.type = SR_DF_TRIGGER; + packet.payload = trigger_pos; + sr_session_send(sdi, &packet); + + devc->status = DSL_DATA; + } + } + } else if (!devc->abort) { + sr_err("%s: trigger packet data error.", __func__); + packet.type = SR_DF_TRIGGER; + packet.payload = trigger_pos; + packet.status = SR_PKT_DATA_ERROR; + sr_session_send(sdi, &packet); + } + + free_transfer(transfer); +} + + +static int start_transfers(const struct sr_dev_inst *sdi) { struct DSL_context *devc; struct sr_usb_dev_inst *usb; @@ -2312,6 +2486,7 @@ static int dev_transfer_start(const struct sr_dev_inst *sdi) unsigned char *buf; size_t size; int dso_buffer_size; + struct ds_trigger_pos *trigger_pos; devc = sdi->priv; usb = sdi->conn; @@ -2321,19 +2496,40 @@ static int dev_transfer_start(const struct sr_dev_inst *sdi) else dso_buffer_size = devc->limit_samples * en_ch_num(sdi) + 512; - num_transfers = 1; + num_transfers = (devc->stream) ? get_number_of_transfers(devc) : 1; size = (sdi->mode == DSO) ? dso_buffer_size : - (devc->op_mode == SR_OP_STREAM) ? get_buffer_size(devc) : instant_buffer_size; + (devc->stream) ? get_buffer_size(devc) : instant_buffer_size; - devc->submitted_transfers = 0; - devc->transfers = g_try_malloc0(sizeof(*devc->transfers) * num_transfers); - if (!devc->transfers) { - sr_err("%s: USB transfers malloc failed.", __func__); + /* trigger packet transfer */ + if (!(trigger_pos = g_try_malloc0(sizeof(struct ds_trigger_pos)))) { + sr_err("%s: USB trigger_pos buffer malloc failed.", __func__); return SR_ERR_MALLOC; } + devc->transfers = g_try_malloc0(sizeof(*devc->transfers) * (num_transfers + 1)); + if (!devc->transfers) { + sr_err("%s: USB transfer malloc failed.", __func__); + return SR_ERR_MALLOC; + } + transfer = libusb_alloc_transfer(0); + libusb_fill_bulk_transfer(transfer, usb->devhdl, + 6 | LIBUSB_ENDPOINT_IN, trigger_pos, sizeof(struct ds_trigger_pos), + receive_trigger_pos, devc, 0); + if ((ret = libusb_submit_transfer(transfer)) != 0) { + sr_err("%s: Failed to submit trigger_pos transfer: %s.", + __func__, libusb_error_name(ret)); + libusb_free_transfer(transfer); + g_free(trigger_pos); + devc->status = DSL_ERROR; + return SR_ERR; + } else { + devc->num_transfers++; + devc->transfers[0] = transfer; + devc->submitted_transfers++; + } - for (i = 0; i < num_transfers; i++) { + /* data packet transfer */ + for (i = 1; i <= num_transfers; i++) { if (!(buf = g_try_malloc(size))) { sr_err("%s: USB transfer buffer malloc failed.", __func__); return SR_ERR_MALLOC; @@ -2356,108 +2552,18 @@ static int dev_transfer_start(const struct sr_dev_inst *sdi) devc->num_transfers++; } - devc->status = DSL_DATA; - return SR_OK; } - -static int receive_data(int fd, int revents, const struct sr_dev_inst *sdi) -{ - int completed = 0; - struct timeval tv; - struct drv_context *drvc; - struct DSL_context *devc; - struct sr_usb_dev_inst *usb; - int i; - int ret; - - (void)fd; - (void)revents; - - drvc = di->priv; - devc = sdi->priv; - usb = sdi->conn; - - tv.tv_sec = tv.tv_usec = 0; - libusb_handle_events_timeout_completed(drvc->sr_ctx->libusb_ctx, &tv, &completed); - - if (devc->status == DSL_FINISH) { - if (libusb_try_lock_events(drvc->sr_ctx->libusb_ctx) == 0) { - if (libusb_event_handling_ok(drvc->sr_ctx->libusb_ctx)) { - /* Stop GPIF acquisition */ - usb = ((struct sr_dev_inst *)devc->cb_data)->conn; - if ((ret = command_stop_acquisition (usb->devhdl)) != SR_OK) - sr_err("%s: Sent acquisition stop command failed!", __func__); - else - sr_info("%s: Sent acquisition stop command!", __func__); - - remove_sources(devc); - } - libusb_unlock_events(drvc->sr_ctx->libusb_ctx); - } - } - - return TRUE; -} - -static void receive_trigger_pos(struct libusb_transfer *transfer) -{ - struct DSL_context *devc; - struct sr_datafeed_packet packet; - struct ds_trigger_pos *trigger_pos; - const struct sr_dev_inst *sdi; - int ret; - - devc = transfer->user_data; - sdi = devc->cb_data; - trigger_pos = (struct ds_trigger_pos *)transfer->buffer; - devc->status = DSL_ERROR; - if (transfer->status == LIBUSB_TRANSFER_COMPLETED && - trigger_pos->check_id == TRIG_CHECKID) { - sr_info("receive_trigger_pos(): status %d; timeout %d; received %d bytes.", - transfer->status, transfer->timeout, transfer->actual_length); - if (transfer->actual_length == sizeof(struct ds_trigger_pos)) { - if (sdi->mode != LOGIC || devc->stream || trigger_pos->remain_cnt < devc->limit_samples) { - if (sdi->mode == LOGIC && !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.payload = trigger_pos; - sr_session_send(sdi, &packet); - - devc->status = DSL_TRIGGERED; - devc->num_transfers = 0; - devc->empty_transfer_count = 0; - } - } - } - - if (devc->status == DSL_TRIGGERED) { - // successfull - free_transfer(transfer); - if ((ret = dev_transfer_start(devc->cb_data)) != SR_OK) { - sr_err("%s: could not start data transfer" - "(%d)%d", __func__, ret, errno); - } - } else { - // failed - free_transfer(transfer); - } -} - static int dev_acquisition_start(const struct sr_dev_inst *sdi, void *cb_data) { struct DSL_context *devc; struct drv_context *drvc; struct sr_usb_dev_inst *usb; struct libusb_transfer *transfer; - struct ds_trigger_pos *trigger_pos; const struct libusb_pollfd **lupfd; unsigned int i; int ret; - int transferred; - struct sr_datafeed_packet packet; - int header_transferred; test_init = 1; @@ -2471,13 +2577,17 @@ static int dev_acquisition_start(const struct sr_dev_inst *sdi, void *cb_data) //devc->cb_data = cb_data; devc->cb_data = sdi; devc->num_samples = 0; + devc->num_bytes = 0; devc->empty_transfer_count = 0; devc->status = DSL_INIT; devc->num_transfers = 0; devc->submitted_transfers = 0; devc->actual_samples = devc->limit_samples; + devc->actual_bytes = devc->actual_samples / DSLOGIC_ATOMIC_SAMPLES * en_ch_num(sdi) * DSLOGIC_ATOMIC_SIZE; test_sample_value = 0; devc->abort = FALSE; + devc->mstatus_valid = FALSE; + devc->overflow = FALSE; /* Configures devc->trigger_* and devc->sample_wide */ if (configure_probes(sdi) != SR_OK) { @@ -2516,37 +2626,18 @@ static int dev_acquisition_start(const struct sr_dev_inst *sdi, void *cb_data) __func__, devc->trigger_hpos); } - /* poll trigger status transfer*/ - if (!(trigger_pos = g_try_malloc0(sizeof(struct ds_trigger_pos)))) { - sr_err("%s: USB trigger_pos buffer malloc failed.", __func__); - return SR_ERR_MALLOC; - } - devc->transfers = g_try_malloc0(sizeof(*devc->transfers)); - if (!devc->transfers) { - sr_err("%s: USB trigger_pos transfer malloc failed.", __func__); - return SR_ERR_MALLOC; - } - transfer = libusb_alloc_transfer(0); - libusb_fill_bulk_transfer(transfer, usb->devhdl, - 6 | LIBUSB_ENDPOINT_IN, trigger_pos, sizeof(struct ds_trigger_pos), - receive_trigger_pos, devc, 0); - if ((ret = libusb_submit_transfer(transfer)) != 0) { - sr_err("%s: Failed to submit trigger_pos transfer: %s.", - __func__, libusb_error_name(ret)); - libusb_free_transfer(transfer); - g_free(trigger_pos); - return SR_ERR; - } else { - devc->num_transfers++; - devc->transfers[0] = transfer; - devc->submitted_transfers++; + /* setup and submit usb transfer */ + if ((ret = start_transfers(devc->cb_data)) != SR_OK) { + sr_err("%s: Could not submit usb transfer" + "(%d)%d", __func__, ret, errno); + return ret; } /* setup callback function for data transfer */ lupfd = libusb_get_pollfds(drvc->sr_ctx->libusb_ctx); for (i = 0; lupfd[i]; i++); if (!(devc->usbfd = g_try_malloc(sizeof(struct libusb_pollfd) * (i + 1)))) - return SR_ERR; + return SR_ERR; for (i = 0; lupfd[i]; i++) { sr_source_add(lupfd[i]->fd, lupfd[i]->events, get_timeout(devc), receive_data, sdi); @@ -2555,14 +2646,13 @@ static int dev_acquisition_start(const struct sr_dev_inst *sdi, void *cb_data) devc->usbfd[i] = -1; free(lupfd); - devc->status = DSL_START; - devc->mstatus_valid = FALSE; if ((ret = command_start_acquisition (usb->devhdl, devc->cur_samplerate, devc->sample_wide, (sdi->mode == LOGIC))) != SR_OK) { devc->status = DSL_ERROR; devc->abort = TRUE; return ret; } + devc->status = DSL_START; /* Send header packet to the session bus. */ //std_session_send_df_header(cb_data, LOG_PREFIX); @@ -2583,30 +2673,12 @@ static int dev_acquisition_stop(struct sr_dev_inst *sdi, void *cb_data) if (!devc->abort) { devc->abort = TRUE; - command_wr_reg(usb->devhdl, 3, EEWP_ADDR); + command_wr_reg(usb->devhdl, bmFORCE_RDY, EEWP_ADDR); } return SR_OK; } -static int dev_test(struct sr_dev_inst *sdi) -{ - if (sdi) { - struct sr_usb_dev_inst *usb; - struct version_info vi; - int ret = SR_ERR; - - usb = sdi->conn; - ret = command_get_fw_version(usb->devhdl, &vi); - if (ret != SR_OK) - sr_err("Device don't exist!"); - - return ret; - } else { - return SR_ERR; - } -} - static int dev_status_get(struct sr_dev_inst *sdi, struct sr_status *status, int begin, int end) { int ret = SR_ERR; @@ -2642,7 +2714,6 @@ SR_PRIV struct sr_dev_driver DSLogic_driver_info = { .config_list = config_list, .dev_open = dev_open, .dev_close = dev_close, - .dev_test = dev_test, .dev_status_get = dev_status_get, .dev_acquisition_start = dev_acquisition_start, .dev_acquisition_stop = dev_acquisition_stop, diff --git a/libsigrok4DSL/hardware/common/ezusb.c b/libsigrok4DSL/hardware/common/ezusb.c index 97d5d63a..b664a16b 100644 --- a/libsigrok4DSL/hardware/common/ezusb.c +++ b/libsigrok4DSL/hardware/common/ezusb.c @@ -64,7 +64,7 @@ SR_PRIV int ezusb_install_firmware(libusb_device_handle *hdl, unsigned char buf[4096]; sr_info("Uploading firmware at %s", filename); - if ((fw = g_fopen(filename, "rb")) == NULL) { + if ((fw = fopen(filename, "rb")) == NULL) { sr_err("Unable to open firmware file %s for reading: %s", filename, strerror(errno)); return SR_ERR; diff --git a/libsigrok4DSL/hardware/demo/demo.c b/libsigrok4DSL/hardware/demo/demo.c index 03e8d2cf..0363fc0a 100644 --- a/libsigrok4DSL/hardware/demo/demo.c +++ b/libsigrok4DSL/hardware/demo/demo.c @@ -112,6 +112,7 @@ struct dev_context { gboolean data_lock; uint8_t max_height; uint8_t dso_bits; + uint64_t samples_not_sent; uint16_t *buf; uint64_t pre_index; @@ -540,7 +541,7 @@ static int config_get(int id, GVariant **data, const struct sr_dev_inst *sdi, *data = g_variant_new_byte(ch->trig_value); break; case SR_CONF_EN_CH: - *data = g_variant_new_uint64(ch->enabled); + *data = g_variant_new_boolean(ch->enabled); break; case SR_CONF_DATALOCK: *data = g_variant_new_boolean(devc->data_lock); @@ -551,18 +552,18 @@ static int config_get(int id, GVariant **data, const struct sr_dev_inst *sdi, case SR_CONF_MAX_DSO_SAMPLELIMITS: *data = g_variant_new_uint64(DEMO_MAX_DSO_DEPTH); break; - case SR_CONF_MAX_LOGIC_SAMPLERATE: - *data = g_variant_new_uint64(DEMO_MAX_LOGIC_SAMPLERATE); - break; - case SR_CONF_MAX_LOGIC_SAMPLELIMITS: - *data = g_variant_new_uint64(DEMO_MAX_LOGIC_DEPTH); - break; - case SR_CONF_RLE_SAMPLELIMITS: + case SR_CONF_HW_DEPTH: *data = g_variant_new_uint64(DEMO_MAX_LOGIC_DEPTH); break; case SR_CONF_DSO_BITS: *data = g_variant_new_byte(devc->dso_bits); break; + case SR_CONF_HW_STATUS: + *data = g_variant_new_byte(0); + break; + case SR_CONF_VLD_CH_NUM: + *data = g_variant_new_int16(NUM_PROBES); + break; default: return SR_ERR_NA; } @@ -829,6 +830,8 @@ static void samples_generator(uint16_t *buf, uint64_t size, const uint64_t span = DEMO_MAX_DSO_SAMPLERATE / devc->cur_samplerate; const uint64_t len = ARRAY_SIZE(sinx) - 1; int *pre_buf; + uint16_t tmp_u16 = 0; + int ch_num = en_ch_num(sdi); switch (devc->sample_generator) { case PATTERN_SINE: /* Sine */ @@ -855,11 +858,30 @@ static void samples_generator(uint16_t *buf, uint64_t size, size != devc->limit_samples) { for (i = 0; i < devc->limit_samples; i++) *(buf + i) = *(buf + ((i + size)%devc->limit_samples)); - } else if (sdi->mode != DSO) { - start_rand = rand()%len; + } else if (sdi->mode == LOGIC) { for (i = 0; i < size; i++) { - index = (i/10/g_slist_length(sdi->channels)+start_rand)%len; - *(buf + i) = (uint16_t)(((const_dc+pre_buf[index]) << 8) + (const_dc+pre_buf[index])); + //index = (i/10/g_slist_length(sdi->channels)+start_rand)%len; + //*(buf + i) = (uint16_t)(((const_dc+pre_buf[index]) << 8) + (const_dc+pre_buf[index])); + tmp_u16 = 0; + if (i < ch_num*4) + *(buf + i) = tmp_u16; + else if (i % 4 == 0) { + start_rand = rand() % (ch_num * 4); + if (start_rand == (i/4 % ch_num)) + tmp_u16 = 0xffff; + *(buf + i) = tmp_u16 ? ~*(buf + i - ch_num*4) : *(buf + i - ch_num*4); + } else { + *(buf + i) = *(buf + i - 1); + } + } + } else if (sdi->mode == ANALOG) { + for (i = 0; i < size; i++) { + if (rand() % (devc->limit_samples / 100) == 0) + *(buf + i) = 0x4000 + rand() % 0x8000; + else if (rand() % (devc->limit_samples / 1000) == 0) + *(buf + i) = 0x7000 + rand() % 0x2000; + else + *(buf + i) = 0x8000; } } else { if (devc->pre_index == 0) { @@ -876,8 +898,8 @@ static void samples_generator(uint16_t *buf, uint64_t size, for (l = sdi->channels; l; l = l->next) { start_rand = devc->pre_index == 0 ? rand()%len : 0; probe = (struct sr_channel *)l->data; - //offset = ceil((0.5 - (probe->vpos/probe->vdiv/10.0)) * 255); - offset = 128; + offset = ceil((0.5 - (probe->vpos/probe->vdiv/10.0)) * 255); + //offset = 128; pre0_i = devc->pre_index; pre1_i = devc->pre_index; for (i = devc->pre_index; i < devc->pre_index + size; i++) { @@ -932,7 +954,8 @@ static int receive_data(int fd, int revents, const struct sr_dev_inst *sdi) struct sr_datafeed_logic logic; struct sr_datafeed_dso dso; struct sr_datafeed_analog analog; - static uint64_t samples_to_send = 0, expected_samplenum, sending_now; + double samples_elaspsed; + uint64_t samples_to_send = 0, expected_samplenum, sending_now; int64_t time, elapsed; static uint16_t last_sample = 0; uint16_t cur_sample; @@ -941,26 +964,36 @@ static int receive_data(int fd, int revents, const struct sr_dev_inst *sdi) (void)fd; (void)revents; + packet.status = SR_PKT_OK; /* How many "virtual" samples should we have collected by now? */ time = g_get_monotonic_time(); elapsed = time - devc->starttime; devc->starttime = time; //expected_samplenum = ceil(elapsed / 1000000.0 * devc->cur_samplerate); /* Of those, how many do we still have to send? */ - //samples_to_send = (expected_samplenum - devc->samples_counter) / CONST_LEN * CONST_LEN; - //samples_to_send = expected_samplenum / CONST_LEN * CONST_LEN; - samples_to_send += ceil(elapsed / 1000000.0 * devc->cur_samplerate); + samples_elaspsed = elapsed / 1000000.0 * devc->cur_samplerate; if (devc->limit_samples) { - if (sdi->mode == DSO && !devc->instant) + if (sdi->mode == DSO && !devc->instant) { + samples_to_send = ceil(samples_elaspsed); samples_to_send = MIN(samples_to_send, devc->limit_samples - devc->pre_index); - else if (sdi->mode == ANALOG) - samples_to_send = MIN(samples_to_send * g_slist_length(sdi->channels), - devc->limit_samples - devc->pre_index); - else + } else if (sdi->mode == ANALOG) { + samples_to_send = ceil(samples_elaspsed * g_slist_length(sdi->channels)); + samples_to_send = MIN(samples_to_send, + devc->limit_samples * g_slist_length(sdi->channels) - devc->pre_index); + } else { + samples_to_send = ceil(samples_elaspsed); + samples_to_send += devc->samples_not_sent; + if (samples_to_send < 64) { + devc->samples_not_sent = samples_to_send; + return TRUE; + } else + devc->samples_not_sent = samples_to_send & 63; + samples_to_send = samples_to_send & ~63; samples_to_send = MIN(samples_to_send, devc->limit_samples - devc->samples_counter); + } } if (samples_to_send > 0 && !devc->stop) { @@ -1007,12 +1040,12 @@ static int receive_data(int fd, int revents, const struct sr_dev_inst *sdi) devc->samples_counter = devc->limit_samples; if (devc->trigger_stage == 0){ - samples_to_send -= sending_now; + //samples_to_send -= sending_now; if (sdi->mode == LOGIC) { packet.type = SR_DF_LOGIC; packet.payload = &logic; logic.length = sending_now * (NUM_PROBES >> 3); - logic.unitsize = (NUM_PROBES >> 3); + logic.format = LA_CROSS_DATA; logic.data = devc->buf; } else if (sdi->mode == DSO) { packet.type = SR_DF_DSO; @@ -1083,6 +1116,7 @@ static int hw_dev_acquisition_start(const struct sr_dev_inst *sdi, devc->mstatus.captured_cnt2 = 0; devc->mstatus.captured_cnt3 = 0; devc->stop = FALSE; + devc->samples_not_sent = 0; /* * trigger setting @@ -1108,7 +1142,7 @@ static int hw_dev_acquisition_start(const struct sr_dev_inst *sdi, */ sr_session_source_add_channel(devc->channel, G_IO_IN | G_IO_ERR, - (sdi->mode == DSO) ? 50 : 10, receive_data, sdi); + 50, receive_data, sdi); /* Send header packet to the session bus. */ //std_session_send_df_header(cb_data, LOG_PREFIX); @@ -1144,19 +1178,12 @@ static int hw_dev_acquisition_stop(struct sr_dev_inst *sdi, void *cb_data) /* Send last packet. */ packet.type = SR_DF_END; + packet.status = SR_PKT_OK; sr_session_send(sdi, &packet); return SR_OK; } -static int hw_dev_test(struct sr_dev_inst *sdi) -{ - if (sdi) - return SR_OK; - else - return SR_ERR; -} - static int hw_dev_status_get(struct sr_dev_inst *sdi, struct sr_status *status, int begin, int end) { (void)begin; @@ -1185,7 +1212,6 @@ SR_PRIV struct sr_dev_driver demo_driver_info = { .config_list = config_list, .dev_open = hw_dev_open, .dev_close = hw_dev_close, - .dev_test = hw_dev_test, .dev_status_get = hw_dev_status_get, .dev_acquisition_start = hw_dev_acquisition_start, .dev_acquisition_stop = hw_dev_acquisition_stop, diff --git a/libsigrok4DSL/hwdriver.c b/libsigrok4DSL/hwdriver.c index 15f3eb4f..58ffe720 100644 --- a/libsigrok4DSL/hwdriver.c +++ b/libsigrok4DSL/hwdriver.c @@ -63,7 +63,7 @@ static struct sr_config_info sr_config_info_data[] = { {SR_CONF_CLOCK_TYPE, SR_T_BOOL, "clocktype", "Using External Clock", "Using External Clock", NULL}, {SR_CONF_CLOCK_EDGE, SR_T_BOOL, "clockedge", - "Using Clock Negedge", "Using Clock Negedge", NULL}, + "Using Clock Negedge", "Using Clock Negedge", NULL}, {SR_CONF_CAPTURE_RATIO, SR_T_UINT64, "captureratio", "Pre-trigger capture ratio", "Pre-trigger capture ratio", NULL}, {SR_CONF_PATTERN_MODE, SR_T_CHAR, "pattern", @@ -72,6 +72,8 @@ static struct sr_config_info sr_config_info_data[] = { "Trigger types", "Trigger types", NULL}, {SR_CONF_RLE, SR_T_BOOL, "rle", "Run Length Encoding", "Run Length Encoding", NULL}, + {SR_CONF_WAIT_UPLOAD, SR_T_BOOL, "buf_upload", + "Wait Buffer Upload", "Wait Buffer Upload", NULL}, {SR_CONF_TRIGGER_SLOPE, SR_T_UINT8, "triggerslope", "Trigger slope", "Trigger slope", NULL}, {SR_CONF_TRIGGER_SOURCE, SR_T_UINT8, "triggersource", @@ -104,6 +106,8 @@ static struct sr_config_info sr_config_info_data[] = { "Datalog", "Datalog", NULL}, {SR_CONF_OPERATION_MODE, SR_T_CHAR, "operation", "Operation Mode", "Operation Mode", NULL}, + {SR_CONF_BUFFER_OPTIONS, SR_T_CHAR, "stopoptions", + "Stop Options", "Stop Options", NULL}, {SR_CONF_CHANNEL_MODE, SR_T_CHAR, "channel", "Channel Mode", "Channel Mode", NULL}, {SR_CONF_THRESHOLD, SR_T_CHAR, "threshold", diff --git a/libsigrok4DSL/input/in_binary.c b/libsigrok4DSL/input/in_binary.c index 00b954a8..ad4d0c9b 100644 --- a/libsigrok4DSL/input/in_binary.c +++ b/libsigrok4DSL/input/in_binary.c @@ -109,6 +109,7 @@ static int loadfile(struct sr_input *in, const char *filename) struct context *ctx; ctx = in->internal; + packet.status = SR_PKT_OK; if ((fd = open(filename, O_RDONLY)) == -1) return SR_ERR; diff --git a/libsigrok4DSL/input/in_vcd.c b/libsigrok4DSL/input/in_vcd.c index 61e72d7d..3bd4f9c6 100644 --- a/libsigrok4DSL/input/in_vcd.c +++ b/libsigrok4DSL/input/in_vcd.c @@ -563,6 +563,7 @@ static int loadfile(struct sr_input *in, const char *filename) uint64_t samplerate; ctx = in->internal; + packet.status = SR_PKT_OK; if ((file = g_fopen(filename, "r")) == NULL) return SR_ERR; diff --git a/libsigrok4DSL/input/in_wav.c b/libsigrok4DSL/input/in_wav.c index 500dc09a..f8d87ed3 100644 --- a/libsigrok4DSL/input/in_wav.c +++ b/libsigrok4DSL/input/in_wav.c @@ -142,6 +142,7 @@ static int loadfile(struct sr_input *in, const char *filename) char buf[CHUNK_SIZE]; ctx = in->sdi->priv; + packet.status = SR_PKT_OK; /* Send header packet to the session bus. */ std_session_send_df_header(in->sdi, LOG_PREFIX); diff --git a/libsigrok4DSL/libsigrok.h b/libsigrok4DSL/libsigrok.h index c40428bb..e8e516d4 100644 --- a/libsigrok4DSL/libsigrok.h +++ b/libsigrok4DSL/libsigrok.h @@ -107,10 +107,13 @@ enum { #define TriggerStages 16 #define TriggerProbes 16 #define TriggerCountBits 16 +#define STriggerDataStage 3 #define DS_CONF_DSO_HDIVS 10 #define DS_CONF_DSO_VDIVS 10 +#define DS_MAX_TRIG_PERCENT 90 + #define DS_RES_PATH "/usr/local/share/DSView/res/" /** libsigrok loglevels. */ @@ -178,7 +181,7 @@ enum { SR_DF_ANALOG, SR_DF_FRAME_BEGIN, SR_DF_FRAME_END, - SR_DF_ABANDON, + SR_DF_OVERFLOW, }; /** Values for sr_datafeed_analog.mq. */ @@ -300,10 +303,17 @@ enum DSO_MEASURE_TYPE { DSO_MS_END, }; +enum { + SR_PKT_OK, + SR_PKT_SOURCE_ERROR, + SR_PKT_DATA_ERROR, +}; + struct sr_context; struct sr_datafeed_packet { uint16_t type; + uint16_t status; const void *payload; }; @@ -316,10 +326,21 @@ struct sr_datafeed_meta { GSList *config; }; +enum LA_DATA_FORMAT { + LA_CROSS_DATA, + LA_SPLIT_DATA, +}; + struct sr_datafeed_logic { uint64_t length; + /** data format */ + int format; + /** for LA_SPLIT_DATA, indicate the channel index */ + uint16_t index; + uint16_t order; uint16_t unitsize; uint16_t data_error; + uint64_t error_pattern; void *data; }; @@ -731,6 +752,9 @@ enum { /** The device supports Run Length Encoding. */ SR_CONF_RLE, + /** Need wait to uplad captured data */ + SR_CONF_WAIT_UPLOAD, + /** The device supports setting trigger slope. */ SR_CONF_TRIGGER_SLOPE, @@ -764,9 +788,12 @@ enum { /** DSO configure sync */ SR_CONF_DSO_SYNC, - /** DSO vertical resolution*/ + /** DSO vertical resolution */ SR_CONF_DSO_BITS, + /** Valid channel number */ + SR_CONF_VLD_CH_NUM, + /** Zero */ SR_CONF_ZERO_SET, SR_CONF_ZERO_LOAD, @@ -790,6 +817,7 @@ enum { /** Test */ SR_CONF_TEST, + SR_CONF_EEPROM, /** Volts/div for dso channel. */ SR_CONF_VDIV, @@ -840,6 +868,9 @@ enum { /** Device operation mode */ SR_CONF_OPERATION_MODE, + /** Device buffer options */ + SR_CONF_BUFFER_OPTIONS, + /** Device channel mode */ SR_CONF_CHANNEL_MODE, @@ -851,12 +882,13 @@ enum { SR_CONF_THRESHOLD, SR_CONF_VTH, - /** Device capacity **/ + /** Hardware capacity **/ SR_CONF_MAX_DSO_SAMPLERATE, SR_CONF_MAX_DSO_SAMPLELIMITS, - SR_CONF_MAX_LOGIC_SAMPLERATE, - SR_CONF_MAX_LOGIC_SAMPLELIMITS, - SR_CONF_RLE_SAMPLELIMITS, + SR_CONF_HW_DEPTH, + + /** Hardware status */ + SR_CONF_HW_STATUS, /*--- Special stuff -------------------------------------------------*/ @@ -876,12 +908,15 @@ enum { /** The device supports specifying a capturefile to inject. */ SR_CONF_CAPTUREFILE, - /** The device supports specifying the capturefile unit size. */ - SR_CONF_CAPTURE_UNITSIZE, + /** Session file version */ + SR_CONF_FILE_VERSION, /** The device supports setting the number of probes. */ SR_CONF_CAPTURE_NUM_PROBES, + /** The device supports setting the number of data blocks. */ + SR_CONF_NUM_BLOCKS, + /*--- Acquisition modes ---------------------------------------------*/ /** @@ -972,6 +1007,8 @@ enum { SR_ST_INITIALIZING, /** The device instance is live, but not in use. */ SR_ST_INACTIVE, + /** The device instance has an imcompatible firmware */ + SR_ST_INCOMPATIBLE, /** The device instance is actively in use in a session. */ SR_ST_ACTIVE, /** The device is winding down its session. */ @@ -991,6 +1028,14 @@ enum { SR_OP_LOOPBACK_TEST = 4, }; +/** Device buffer mode */ +enum { + /** Stop immediately */ + SR_BUF_STOP = 0, + /** Upload captured data */ + SR_BUF_UPLOAD = 1, +}; + /** Device threshold level. */ enum { /** 1.8/2.5/3.3 level */ @@ -1049,7 +1094,6 @@ struct sr_dev_driver { /* Device-specific */ int (*dev_open) (struct sr_dev_inst *sdi); int (*dev_close) (struct sr_dev_inst *sdi); - int (*dev_test) (struct sr_dev_inst *sdi); int (*dev_status_get) (struct sr_dev_inst *sdi, struct sr_status *status, int begin, int end); @@ -1127,8 +1171,10 @@ struct ds_trigger_pos { uint32_t check_id; uint32_t real_pos; uint32_t ram_saddr; - uint32_t remain_cnt; - unsigned char first_block[496]; + uint32_t remain_cnt_l; + uint32_t remain_cnt_h; + uint32_t status; + unsigned char first_block[488]; }; #include "proto.h" diff --git a/libsigrok4DSL/proto.h b/libsigrok4DSL/proto.h index 223f1ec0..b91bb9c3 100644 --- a/libsigrok4DSL/proto.h +++ b/libsigrok4DSL/proto.h @@ -58,13 +58,6 @@ SR_API int sr_dev_clear(const struct sr_dev_driver *driver); SR_API int sr_dev_open(struct sr_dev_inst *sdi); SR_API int sr_dev_close(struct sr_dev_inst *sdi); -/*--- filter.c --------------------------------------------------------------*/ - -SR_API int sr_filter_probes(unsigned int in_unitsize, unsigned int out_unitsize, - const GArray *probe_array, const uint8_t *data_in, - uint64_t length_in, uint8_t **data_out, - uint64_t *length_out); - /*--- hwdriver.c ------------------------------------------------------------*/ SR_API struct sr_dev_driver **sr_driver_list(void); @@ -110,12 +103,9 @@ SR_API int sr_session_datafeed_callback_add(sr_datafeed_callback_t cb, SR_API int sr_session_start(void); SR_API int sr_session_run(void); SR_API int sr_session_stop(void); -SR_API int sr_session_save(const char *filename, const struct sr_dev_inst *sdi, - unsigned char *buf, int unitsize, uint64_t samples, int64_t trig_time, uint64_t trig_pos); -SR_API int sr_session_save_init(const char *filename, uint64_t samplerate, - char **channels); -SR_API int sr_session_append(const char *filename, unsigned char *buf, - int unitsize, int units); +SR_API int sr_session_save_init(const char *filename, const char *metafile, const char *decfile); +SR_API int sr_session_append(const char *filename, const unsigned char *buf, + uint64_t size, int chunk_num, int index, int type, int version); SR_API int sr_session_source_add(int fd, int events, int timeout, sr_receive_data_callback_t cb, const struct sr_dev_inst *sdi); SR_API int sr_session_source_add_pollfd(GPollFD *pollfd, int timeout, diff --git a/libsigrok4DSL/session.c b/libsigrok4DSL/session.c index 87746adb..750f1894 100644 --- a/libsigrok4DSL/session.c +++ b/libsigrok4DSL/session.c @@ -406,8 +406,14 @@ SR_API int sr_session_run(void) /* Do we have real sources? */ if (session->num_sources == 1 && session->pollfds[0].fd == -1) { /* Dummy source, freewheel over it. */ - while (session->num_sources) - session->sources[0].cb(-1, 0, session->sources[0].cb_data); + while (session->num_sources) { + if (session->abort_session) { + session->sources[0].cb(-1, -1, session->sources[0].cb_data); + break; + } else { + session->sources[0].cb(-1, 0, session->sources[0].cb_data); + } + } } else { /* Real sources, use g_poll() main loop. */ while (session->num_sources) @@ -528,7 +534,10 @@ static void datafeed_dump(const struct sr_datafeed_packet *packet) case SR_DF_FRAME_END: sr_dbg("bus: Received SR_DF_FRAME_END packet."); break; - default: + case SR_DF_OVERFLOW: + sr_dbg("bus: Received SR_DF_OVERFLOW packet."); + break; + default: sr_dbg("bus: Received unknown packet type: %d.", packet->type); break; } diff --git a/libsigrok4DSL/session_driver.c b/libsigrok4DSL/session_driver.c index d61435ff..6ddff054 100644 --- a/libsigrok4DSL/session_driver.c +++ b/libsigrok4DSL/session_driver.c @@ -23,6 +23,7 @@ #include #include #include +#include #include "libsigrok.h" #include "libsigrok-internal.h" @@ -38,35 +39,88 @@ /* size of payloads sent across the session bus */ /** @cond PRIVATE */ #define CHUNKSIZE (512 * 1024) +#define UNITLEN 64 /** @endcond */ static uint64_t samplerates[1]; static uint64_t samplecounts[1]; +static const char *maxHeights[] = { + "1X", + "2X", + "3X", + "4X", + "5X", +}; + struct session_vdev { + int version; char *sessionfile; char *capturefile; struct zip *archive; struct zip_file *capfile; void *buf; + void *logic_buf; int bytes_read; + int cur_channel; + int cur_block; + int num_blocks; + gboolean file_opened; uint64_t samplerate; uint64_t total_samples; int64_t trig_time; uint64_t trig_pos; - int unitsize; int num_probes; + int enabled_probes; uint64_t timebase; + uint8_t bits; + uint8_t max_height; struct sr_status mstatus; }; static GSList *dev_insts = NULL; static const int hwcaps[] = { SR_CONF_CAPTUREFILE, - SR_CONF_CAPTURE_UNITSIZE, - 0, }; +static const int hwoptions[] = { + SR_CONF_MAX_HEIGHT, +}; + +static int trans_data(struct sr_dev_inst *sdi) +{ + // translate for old format + struct session_vdev *vdev = sdi->priv; + GList *l; + struct sr_channel *probe; + + assert(vdev->buf != NULL); + assert(vdev->logic_buf != NULL); + assert(CHUNKSIZE % UNITLEN == 0); + + //int bytes = ceil(vdev->num_probes / 8.0); + int bytes = 2; + uint8_t *src_ptr = (uint8_t *)vdev->buf; + uint64_t *dest_ptr = (uint64_t *)vdev->logic_buf; + for (int k = 0; k < CHUNKSIZE / (UNITLEN * bytes); k++) { + src_ptr = (uint8_t *)vdev->buf + (k * bytes * UNITLEN); + for (l = sdi->channels; l; l = l->next) { + probe = l->data; + if (!probe->enabled) + continue; + uint64_t mask = 1ULL << probe->index; + uint64_t result = 0; + for (int j = 0; j < UNITLEN; j++) { + if (*(uint64_t *)(src_ptr + j * bytes) & mask) + result += 1ULL << j; + } + *dest_ptr++ = result; + } + } + + return SR_OK; +} + static int receive_data(int fd, int revents, const struct sr_dev_inst *cb_sdi) { struct sr_dev_inst *sdi; @@ -76,13 +130,19 @@ static int receive_data(int fd, int revents, const struct sr_dev_inst *cb_sdi) struct sr_datafeed_dso dso; struct sr_datafeed_analog analog; GSList *l; - int ret, got_data; + int ret; + char file_name[32]; + struct sr_channel *probe; + GSList *pl; + int channel; + (void)fd; - (void)revents; + //(void)revents; sr_dbg("Feed chunk."); - got_data = FALSE; + ret = 0; + packet.status = SR_PKT_OK; for (l = dev_insts; l; l = l->next) { sdi = l->data; vdev = sdi->priv; @@ -90,46 +150,100 @@ static int receive_data(int fd, int revents, const struct sr_dev_inst *cb_sdi) /* already done with this instance */ continue; - ret = zip_fread(vdev->capfile, vdev->buf, CHUNKSIZE); - if (ret > 0) { - got_data = TRUE; - if (sdi->mode == DSO) { - packet.type = SR_DF_DSO; - packet.payload = &dso; - dso.num_samples = ret / vdev->unitsize; - dso.data = vdev->buf; - dso.probes = sdi->channels; - dso.mq = SR_MQ_VOLTAGE; - dso.unit = SR_UNIT_VOLT; - dso.mqflags = SR_MQFLAG_AC; - } else if (sdi->mode == ANALOG){ - packet.type = SR_DF_ANALOG; - packet.payload = &analog; - analog.probes = sdi->channels; - analog.num_samples = ret / vdev->unitsize; - analog.mq = SR_MQ_VOLTAGE; - analog.unit = SR_UNIT_VOLT; - analog.mqflags = SR_MQFLAG_AC; - analog.data = vdev->buf; - } else { - packet.type = SR_DF_LOGIC; - packet.payload = &logic; - logic.length = ret; - logic.unitsize = vdev->unitsize; - logic.data = vdev->buf; + assert(vdev->cur_channel >= 0); + if (vdev->cur_channel < vdev->num_probes) { + if (vdev->version == 1) { + ret = zip_fread(vdev->capfile, vdev->buf, CHUNKSIZE); + } else if (vdev->version == 2) { + channel = vdev->cur_channel; + pl = sdi->channels; + while (channel--) + pl = pl->next; + probe = (struct sr_channel *)pl->data; + + if (!vdev->file_opened) { + char *type_name = (probe->type == SR_CHANNEL_LOGIC) ? "L" : + (probe->type == SR_CHANNEL_DSO) ? "O" : + (probe->type == SR_CHANNEL_ANALOG) ? "A" : "U"; + snprintf(file_name, 31, "%s-%d/%d", type_name, + probe->index, vdev->cur_block); + if (!(vdev->capfile = zip_fopen(vdev->archive, file_name, 0))) { + sr_err("Failed to open capture file '%s' in " + "session file '%s'.", file_name, vdev->sessionfile); + } else { + vdev->file_opened = TRUE; + } + } + if (vdev->file_opened) + ret = zip_fread(vdev->capfile, vdev->buf, CHUNKSIZE); } - vdev->bytes_read += ret; - sr_session_send(cb_sdi, &packet); - } else { - /* done with this capture file */ - zip_fclose(vdev->capfile); - //g_free(vdev->capturefile); - //g_free(vdev); - //sdi->priv = NULL; - } + + if (!vdev->file_opened) { + packet.type = SR_DF_END; + packet.status = SR_PKT_SOURCE_ERROR; + sr_session_send(cb_sdi, &packet); + sr_session_source_remove(-1); + return FALSE; + } + + if (ret > 0) { + if (sdi->mode == DSO) { + packet.type = SR_DF_DSO; + packet.payload = &dso; + dso.num_samples = ret / vdev->enabled_probes; + dso.data = vdev->buf; + dso.probes = sdi->channels; + dso.mq = SR_MQ_VOLTAGE; + dso.unit = SR_UNIT_VOLT; + dso.mqflags = SR_MQFLAG_AC; + } else if (sdi->mode == ANALOG){ + packet.type = SR_DF_ANALOG; + packet.payload = &analog; + analog.probes = sdi->channels; + analog.num_samples = ret / vdev->num_probes; + analog.mq = SR_MQ_VOLTAGE; + analog.unit = SR_UNIT_VOLT; + analog.mqflags = SR_MQFLAG_AC; + analog.data = vdev->buf; + } else { + packet.type = SR_DF_LOGIC; + packet.payload = &logic; + logic.length = ret; + logic.format = (vdev->version == 2) ? LA_SPLIT_DATA : LA_CROSS_DATA; + logic.index = probe->index; + logic.order = vdev->cur_channel; + + if (vdev->version == 1) { + logic.length = ret / 16 * vdev->enabled_probes; + logic.data = vdev->logic_buf; + trans_data(sdi); + } else if (vdev->version == 2) { + logic.length = ret; + logic.data = vdev->buf; + } + } + vdev->bytes_read += ret; + sr_session_send(cb_sdi, &packet); + } else { + /* done with this capture file */ + zip_fclose(vdev->capfile); + + if (vdev->version == 1) { + vdev->cur_channel++; + } else if (vdev->version == 2) { + vdev->file_opened = FALSE; + vdev->cur_block++; + if (vdev->cur_block == vdev->num_blocks) { + vdev->cur_block = 0; + vdev->cur_channel++; + } + } + } + } } - if (!got_data) { + if (vdev->cur_channel >= vdev->num_probes || + revents == -1) { packet.type = SR_DF_END; sr_session_send(cb_sdi, &packet); sr_session_source_remove(-1); @@ -169,12 +283,18 @@ static int dev_open(struct sr_dev_inst *sdi) struct session_vdev *vdev; vdev = sdi->priv; - if (!(vdev->buf = g_try_malloc(CHUNKSIZE))) { + if (!(vdev->buf = g_try_malloc(CHUNKSIZE + sizeof(uint64_t)))) { sr_err("%s: vdev->buf malloc failed", __func__); return SR_ERR_MALLOC; } vdev->trig_pos = 0; vdev->trig_time = 0; + vdev->cur_block = 0; + vdev->cur_channel = 0; + vdev->file_opened = FALSE; + vdev->num_blocks = 0; + vdev->bits = 8; + vdev->max_height = 0; dev_insts = g_slist_append(dev_insts, sdi); @@ -187,6 +307,8 @@ static int dev_close(struct sr_dev_inst *sdi) g_free(vdev->sessionfile); g_free(vdev->capturefile); g_free(vdev->buf); + if (vdev->logic_buf) + g_free(vdev->logic_buf); g_free(sdi->priv); sdi->priv = NULL; @@ -229,6 +351,13 @@ static int config_get(int id, GVariant **data, const struct sr_dev_inst *sdi, } else return SR_ERR; break; + case SR_CONF_DSO_BITS: + if (sdi) { + vdev = sdi->priv; + *data = g_variant_new_byte(vdev->bits); + } else + return SR_ERR; + break; case SR_CONF_EN_CH: if (sdi && ch) { *data = g_variant_new_boolean(ch->enabled); @@ -259,18 +388,53 @@ static int config_get(int id, GVariant **data, const struct sr_dev_inst *sdi, } else return SR_ERR; break; + case SR_CONF_TRIGGER_VALUE: + if (sdi && ch) { + *data = g_variant_new_byte(ch->trig_value); + } else + return SR_ERR; + break; case SR_CONF_MAX_DSO_SAMPLERATE: if (!sdi) return SR_ERR; + vdev = sdi->priv; *data = g_variant_new_uint64(vdev->samplerate); break; case SR_CONF_MAX_DSO_SAMPLELIMITS: if (!sdi) return SR_ERR; + vdev = sdi->priv; *data = g_variant_new_uint64(vdev->total_samples); break; - case SR_CONF_RLE_SAMPLELIMITS: - *data = g_variant_new_uint64(UINT64_MAX); + case SR_CONF_HW_DEPTH: + if (!sdi) + return SR_ERR; + vdev = sdi->priv; + *data = g_variant_new_uint64(vdev->total_samples); + break; + case SR_CONF_MAX_HEIGHT: + if (!sdi) + return SR_ERR; + vdev = sdi->priv; + *data = g_variant_new_string(maxHeights[vdev->max_height]); + break; + case SR_CONF_MAX_HEIGHT_VALUE: + if (!sdi) + return SR_ERR; + vdev = sdi->priv; + *data = g_variant_new_byte(vdev->max_height); + break; + case SR_CONF_VLD_CH_NUM: + if (!sdi) + return SR_ERR; + vdev = sdi->priv; + *data = g_variant_new_int16(vdev->num_probes); + break; + case SR_CONF_FILE_VERSION: + if (!sdi) + return SR_ERR; + vdev = sdi->priv; + *data = g_variant_new_int16(vdev->version); break; default: return SR_ERR_ARG; @@ -284,6 +448,8 @@ static int config_set(int id, GVariant *data, const struct sr_dev_inst *sdi, const struct sr_channel_group *cg) { struct session_vdev *vdev; + const char *stropt; + int i; vdev = sdi->priv; @@ -297,6 +463,10 @@ static int config_set(int id, GVariant *data, const struct sr_dev_inst *sdi, vdev->timebase = g_variant_get_uint64(data); sr_info("Setting timebase to %" PRIu64 ".", vdev->timebase); break; + case SR_CONF_DSO_BITS: + vdev->bits = g_variant_get_byte(data); + sr_info("Setting DSO bits to %d.", vdev->bits); + break; case SR_CONF_SESSIONFILE: vdev->sessionfile = g_strdup(g_variant_get_bytestring(data)); sr_info("Setting sessionfile to '%s'.", vdev->sessionfile); @@ -305,9 +475,10 @@ static int config_set(int id, GVariant *data, const struct sr_dev_inst *sdi, vdev->capturefile = g_strdup(g_variant_get_bytestring(data)); sr_info("Setting capturefile to '%s'.", vdev->capturefile); break; - case SR_CONF_CAPTURE_UNITSIZE: - vdev->unitsize = g_variant_get_uint64(data); - break; + case SR_CONF_FILE_VERSION: + vdev->version = g_variant_get_int16(data); + sr_info("Setting file version to '%d'.", vdev->version); + break; case SR_CONF_LIMIT_SAMPLES: vdev->total_samples = g_variant_get_uint64(data); samplecounts[0] = vdev->total_samples; @@ -321,8 +492,17 @@ static int config_set(int id, GVariant *data, const struct sr_dev_inst *sdi, vdev->trig_pos = g_variant_get_uint64(data); sr_info("Setting trigger position to %" PRIu64 ".", vdev->trig_pos); break; + case SR_CONF_NUM_BLOCKS: + vdev->num_blocks = g_variant_get_uint64(data); + sr_info("Setting block number to %" PRIu64 ".", vdev->num_blocks); + break; case SR_CONF_CAPTURE_NUM_PROBES: vdev->num_probes = g_variant_get_uint64(data); + if (sdi->mode == LOGIC) { + if (!(vdev->logic_buf = g_try_malloc(CHUNKSIZE/16*vdev->num_probes))) { + sr_err("%s: vdev->logic_buf malloc failed", __func__); + } + } break; case SR_CONF_EN_CH: ch->enabled = g_variant_get_boolean(data); @@ -339,6 +519,9 @@ static int config_set(int id, GVariant *data, const struct sr_dev_inst *sdi, case SR_CONF_VPOS: ch->vpos = g_variant_get_double(data); break; + case SR_CONF_TRIGGER_VALUE: + ch->trig_value = g_variant_get_byte(data); + break; case SR_CONF_STATUS_PERIOD: if (ch->index == 0) vdev->mstatus.ch0_period = g_variant_get_uint64(data); @@ -363,6 +546,17 @@ static int config_set(int id, GVariant *data, const struct sr_dev_inst *sdi, else vdev->mstatus.ch1_min = g_variant_get_uint64(data); break; + case SR_CONF_MAX_HEIGHT: + stropt = g_variant_get_string(data, NULL); + for (i = 0; i < ARRAY_SIZE(maxHeights); i++) { + if (!strcmp(stropt, maxHeights[i])) { + vdev->max_height = i; + break; + } + } + sr_dbg("%s: setting Signal Max Height to %d", + __func__, vdev->max_height); + break; default: sr_err("Unknown capability: %d.", id); return SR_ERR; @@ -385,6 +579,12 @@ static int config_list(int key, GVariant **data, const struct sr_dev_inst *sdi) *data = g_variant_new_from_data(G_VARIANT_TYPE("ai"), hwcaps, ARRAY_SIZE(hwcaps)*sizeof(int32_t), TRUE, NULL, NULL); break; + case SR_CONF_DEVICE_CONFIGS: +// *data = g_variant_new_fixed_array(G_VARIANT_TYPE_INT32, +// hwcaps, ARRAY_SIZE(hwcaps), sizeof(int32_t)); + *data = g_variant_new_from_data(G_VARIANT_TYPE("ai"), + hwoptions, ARRAY_SIZE(hwoptions)*sizeof(int32_t), TRUE, NULL, NULL); + break; case SR_CONF_SAMPLERATE: g_variant_builder_init(&gvb, G_VARIANT_TYPE("a{sv}")); // gvar = g_variant_new_fixed_array(G_VARIANT_TYPE("t"), samplerates, @@ -401,7 +601,10 @@ static int config_list(int key, GVariant **data, const struct sr_dev_inst *sdi) g_variant_builder_add(&gvb, "{sv}", "samplecounts", gvar); *data = g_variant_builder_end(&gvb); break; - default: + case SR_CONF_MAX_HEIGHT: + *data = g_variant_new_strv(maxHeights, ARRAY_SIZE(maxHeights)); + break; + default: return SR_ERR_ARG; } @@ -431,8 +634,12 @@ static int dev_acquisition_start(const struct sr_dev_inst *sdi, struct session_vdev *vdev; struct sr_datafeed_packet packet; int ret; + GList *l; + struct sr_channel *probe; vdev = sdi->priv; + vdev->enabled_probes = 0; + packet.status = SR_PKT_OK; sr_info("Opening archive %s file %s", vdev->sessionfile, vdev->capturefile); @@ -443,17 +650,29 @@ static int dev_acquisition_start(const struct sr_dev_inst *sdi, return SR_ERR; } - if (zip_stat(vdev->archive, vdev->capturefile, 0, &zs) == -1) { - sr_err("Failed to check capture file '%s' in " - "session file '%s'.", vdev->capturefile, vdev->sessionfile); - return SR_ERR; - } + if (vdev->version == 1) { + if (zip_stat(vdev->archive, vdev->capturefile, 0, &zs) == -1) { + sr_err("Failed to check capture file '%s' in " + "session file '%s'.", vdev->capturefile, vdev->sessionfile); + return SR_ERR; + } - if (!(vdev->capfile = zip_fopen(vdev->archive, vdev->capturefile, 0))) { - sr_err("Failed to open capture file '%s' in " - "session file '%s'.", vdev->capturefile, vdev->sessionfile); - return SR_ERR; - } + if (!(vdev->capfile = zip_fopen(vdev->archive, vdev->capturefile, 0))) { + sr_err("Failed to open capture file '%s' in " + "session file '%s'.", vdev->capturefile, vdev->sessionfile); + return SR_ERR; + } + vdev->file_opened = TRUE; + vdev->cur_channel = vdev->num_probes - 1; + } else { + vdev->cur_channel = 0; + } + + for (l = sdi->channels; l; l = l->next) { + probe = l->data; + if (probe->enabled) + vdev->enabled_probes++; + } /* Send header packet to the session bus. */ std_session_send_df_header(sdi, LOG_PREFIX); @@ -461,7 +680,10 @@ static int dev_acquisition_start(const struct sr_dev_inst *sdi, /* Send trigger packet to the session bus */ if (vdev->trig_pos != 0) { struct ds_trigger_pos session_trigger; - session_trigger.real_pos = vdev->trig_pos; + if (sdi->mode == DSO) + session_trigger.real_pos = vdev->trig_pos * vdev->enabled_probes / vdev->num_probes; + else + session_trigger.real_pos = vdev->trig_pos; packet.type = SR_DF_TRIGGER; packet.payload = &session_trigger; sr_session_send(sdi, &packet); @@ -489,7 +711,6 @@ SR_PRIV struct sr_dev_driver session_driver = { .config_list = config_list, .dev_open = dev_open, .dev_close = dev_close, - .dev_test = NULL, .dev_status_get = dev_status_get, .dev_acquisition_start = dev_acquisition_start, .dev_acquisition_stop = NULL, diff --git a/libsigrok4DSL/session_file.c b/libsigrok4DSL/session_file.c index bf5b27c5..886170dc 100644 --- a/libsigrok4DSL/session_file.c +++ b/libsigrok4DSL/session_file.c @@ -131,6 +131,7 @@ SR_API int sr_session_load(const char *filename) int mode = LOGIC; int channel_type = SR_CHANNEL_LOGIC; double tmp_double; + int version = 1; if (!filename) { sr_err("%s: filename was NULL", __func__); @@ -169,9 +170,15 @@ SR_API int sr_session_load(const char *filename) capturefiles = g_ptr_array_new_with_free_func(g_free); sections = g_key_file_get_groups(kf, NULL); for (i = 0; sections[i]; i++) { - if (!strcmp(sections[i], "version")) - /* nothing really interesting in here yet */ - continue; + if (!strcmp(sections[i], "version")) { + keys = g_key_file_get_keys(kf, sections[i], NULL, NULL); + for (j = 0; keys[j]; j++) { + val = g_key_file_get_string(kf, sections[i], keys[j], NULL); + if (!strcmp(keys[j], "version")) { + version = strtoull(val, NULL, 10); + } + } + } if (!strncmp(sections[i], "header", 6)) { /* device section */ sdi = NULL; @@ -194,14 +201,12 @@ SR_API int sr_session_load(const char *filename) sdi->driver->config_set(SR_CONF_CAPTUREFILE, g_variant_new_bytestring(val), sdi, NULL, NULL); g_ptr_array_add(capturefiles, val); + sdi->driver->config_set(SR_CONF_FILE_VERSION, + g_variant_new_int16(version), sdi, NULL, NULL); } else if (!strcmp(keys[j], "samplerate")) { sr_parse_sizestring(val, &tmp_u64); sdi->driver->config_set(SR_CONF_SAMPLERATE, g_variant_new_uint64(tmp_u64), sdi, NULL, NULL); - } else if (!strcmp(keys[j], "unitsize")) { - tmp_u64 = strtoull(val, NULL, 10); - sdi->driver->config_set(SR_CONF_CAPTURE_UNITSIZE, - g_variant_new_uint64(tmp_u64), sdi, NULL, NULL); } else if (!strcmp(keys[j], "total samples")) { tmp_u64 = strtoull(val, NULL, 10); sdi->driver->config_set(SR_CONF_LIMIT_SAMPLES, @@ -210,6 +215,10 @@ SR_API int sr_session_load(const char *filename) tmp_u64 = strtoull(val, NULL, 10); sdi->driver->config_set(SR_CONF_TIMEBASE, g_variant_new_uint64(tmp_u64), sdi, NULL, NULL); + } else if (!strcmp(keys[j], "bits")) { + tmp_u64 = strtoull(val, NULL, 10); + sdi->driver->config_set(SR_CONF_DSO_BITS, + g_variant_new_byte(tmp_u64), sdi, NULL, NULL); } else if (!strcmp(keys[j], "trigger time")) { tmp_64 = strtoll(val, NULL, 10); sdi->driver->config_set(SR_CONF_TRIGGER_TIME, @@ -218,27 +227,42 @@ SR_API int sr_session_load(const char *filename) tmp_u64 = strtoull(val, NULL, 10); sdi->driver->config_set(SR_CONF_TRIGGER_POS, g_variant_new_uint64(tmp_u64), sdi, NULL, NULL); + } else if (!strcmp(keys[j], "total blocks")) { + tmp_u64 = strtoull(val, NULL, 10); + sdi->driver->config_set(SR_CONF_NUM_BLOCKS, + g_variant_new_uint64(tmp_u64), sdi, NULL, NULL); } else if (!strcmp(keys[j], "total probes")) { total_probes = strtoull(val, NULL, 10); sdi->driver->config_set(SR_CONF_CAPTURE_NUM_PROBES, g_variant_new_uint64(total_probes), sdi, NULL, NULL); - channel_type = (mode == DSO) ? SR_CHANNEL_DSO : - (mode == ANALOG) ? SR_CHANNEL_ANALOG : SR_CHANNEL_LOGIC; - for (p = 0; p < total_probes; p++) { - snprintf(probename, SR_MAX_PROBENAME_LEN, "%" PRIu64, p); - if (!(probe = sr_channel_new(p, channel_type, FALSE, - probename))) - return SR_ERR; - sdi->channels = g_slist_append(sdi->channels, probe); - } + if (version == 1) { + channel_type = (mode == DSO) ? SR_CHANNEL_DSO : + (mode == ANALOG) ? SR_CHANNEL_ANALOG : SR_CHANNEL_LOGIC; + for (p = 0; p < total_probes; p++) { + snprintf(probename, SR_MAX_PROBENAME_LEN, "%" PRIu64, p); + if (!(probe = sr_channel_new(p, channel_type, FALSE, + probename))) + return SR_ERR; + sdi->channels = g_slist_append(sdi->channels, probe); + } + } } else if (!strncmp(keys[j], "probe", 5)) { if (!sdi) continue; enabled_probes++; tmp_u64 = strtoul(keys[j]+5, NULL, 10); /* sr_session_save() */ - sr_dev_probe_name_set(sdi, tmp_u64, val); - sr_dev_probe_enable(sdi, tmp_u64, TRUE); + if (version == 1) { + sr_dev_probe_name_set(sdi, tmp_u64, val); + sr_dev_probe_enable(sdi, tmp_u64, TRUE); + } else if (version == 2) { + channel_type = (mode == DSO) ? SR_CHANNEL_DSO : + (mode == ANALOG) ? SR_CHANNEL_ANALOG : SR_CHANNEL_LOGIC; + if (!(probe = sr_channel_new(tmp_u64, channel_type, TRUE, + val))) + return SR_ERR; + sdi->channels = g_slist_append(sdi->channels, probe); + } } else if (!strncmp(keys[j], "trigger", 7)) { probenum = strtoul(keys[j]+7, NULL, 10); sr_dev_trigger_set(sdi, probenum, val); @@ -282,6 +306,14 @@ SR_API int sr_session_load(const char *filename) sdi->driver->config_set(SR_CONF_VPOS, g_variant_new_double(tmp_double), sdi, probe, NULL); } + } else if (!strncmp(keys[j], "vTrig", 5)) { + probenum = strtoul(keys[j]+5, NULL, 10); + tmp_u64 = strtod(val, NULL); + if (probenum < g_slist_length(sdi->channels)) { + probe = g_slist_nth(sdi->channels, probenum)->data; + sdi->driver->config_set(SR_CONF_TRIGGER_VALUE, + g_variant_new_byte(tmp_u64), sdi, probe, NULL); + } } else if (!strncmp(keys[j], "period", 6)) { probenum = strtoul(keys[j]+6, NULL, 10); tmp_u64 = strtoull(val, NULL, 10); @@ -326,137 +358,6 @@ SR_API int sr_session_load(const char *filename) return SR_OK; } -/** - * Save the current session to the specified file. - * - * @param filename The name of the filename to save the current session as. - * Must not be NULL. - * @param sdi The device instance from which the data was captured. - * @param buf The data to be saved. - * @param unitsize The number of bytes per sample. - * @param units The number of samples. - * - * @return SR_OK upon success, SR_ERR_ARG upon invalid arguments, or SR_ERR - * upon other errors. - */ -SR_API int sr_session_save(const char *filename, const struct sr_dev_inst *sdi, - unsigned char *buf, int unitsize, uint64_t samples, int64_t trig_time, uint64_t trig_pos) -{ - GSList *l; - GVariant *gvar; - FILE *meta; - struct sr_channel *probe; - struct zip *zipfile; - struct zip_source *versrc, *metasrc, *logicsrc; - int tmpfile, ret, probecnt; - uint64_t samplerate, timeBase, tmp_u64; - char rawname[16], metafile[32], *s; - struct sr_status status; - - if (!filename) { - sr_err("%s: filename was NULL", __func__); - return SR_ERR_ARG; - } - - /* Quietly delete it first, libzip wants replace ops otherwise. */ - unlink(filename); - if (!(zipfile = zip_open(filename, ZIP_CREATE, &ret))) - return SR_ERR; - - /* init "metadata" */ - strcpy(metafile, "DSView-meta-XXXXXX"); - if ((tmpfile = g_mkstemp(metafile)) == -1) - return SR_ERR; - close(tmpfile); - meta = g_fopen(metafile, "wb"); - fprintf(meta, "[version]\n"); - fprintf(meta, "DSView version = %s\n", PACKAGE_VERSION); - - /* metadata */ - fprintf(meta, "[header]\n"); - if (sdi->driver) { - fprintf(meta, "driver = %s\n", sdi->driver->name); - fprintf(meta, "device mode = %d\n", sdi->mode); - } - - /* metadata */ - fprintf(meta, "capturefile = data\n"); - fprintf(meta, "unitsize = %d\n", unitsize); - fprintf(meta, "total samples = %llu\n", samples); - fprintf(meta, "total probes = %d\n", g_slist_length(sdi->channels)); - if (sr_config_get(sdi->driver, sdi, NULL, NULL, SR_CONF_SAMPLERATE, - &gvar) == SR_OK) { - samplerate = g_variant_get_uint64(gvar); - s = sr_samplerate_string(samplerate); - fprintf(meta, "samplerate = %s\n", s); - g_free(s); - g_variant_unref(gvar); - } - if (sdi->mode == DSO && - sr_config_get(sdi->driver, sdi, NULL, NULL, SR_CONF_TIMEBASE, &gvar) == SR_OK) { - timeBase = g_variant_get_uint64(gvar); - fprintf(meta, "hDiv = %llu\n", timeBase); - g_variant_unref(gvar); - } else if (sdi->mode == LOGIC) { - fprintf(meta, "trigger time = %lld\n", trig_time); - } - fprintf(meta, "trigger pos = %llu\n", trig_pos); - - probecnt = 1; - for (l = sdi->channels; l; l = l->next) { - probe = l->data; - if (probe->enabled || sdi->mode == DSO) { - if (probe->name) - fprintf(meta, "probe%d = %s\n", probe->index, probe->name); - if (probe->trigger) - fprintf(meta, " trigger%d = %s\n", probe->index, probe->trigger); - if (sdi->mode == DSO) { - fprintf(meta, " enable%d = %d\n", probe->index, probe->enabled); - fprintf(meta, " coupling%d = %d\n", probe->index, probe->coupling); - fprintf(meta, " vDiv%d = %d\n", probe->index, probe->vdiv); - fprintf(meta, " vFactor%d = %d\n", probe->index, probe->vfactor); - fprintf(meta, " vPos%d = %lf\n", probe->index, probe->vpos); - if (sr_status_get(sdi, &status, 0, 0) == SR_OK) { - if (probe->index == 0) { - fprintf(meta, " period%d = %llu\n", probe->index, status.ch0_period); - fprintf(meta, " pcnt%d = %lu\n", probe->index, status.ch0_pcnt); - fprintf(meta, " max%d = %d\n", probe->index, status.ch0_max); - fprintf(meta, " min%d = %d\n", probe->index, status.ch0_min); - } else { - fprintf(meta, " period%d = %llu\n", probe->index, status.ch1_period); - fprintf(meta, " pcnt%d = %lu\n", probe->index, status.ch1_pcnt); - fprintf(meta, " max%d = %d\n", probe->index, status.ch1_max); - fprintf(meta, " min%d = %d\n", probe->index, status.ch1_min); - } - } - } - probecnt++; - } - } - - if (!(logicsrc = zip_source_buffer(zipfile, buf, - samples * unitsize, FALSE))) - return SR_ERR; - snprintf(rawname, 15, "data"); - if (zip_add(zipfile, rawname, logicsrc) == -1) - return SR_ERR; - fclose(meta); - - if (!(metasrc = zip_source_file(zipfile, metafile, 0, -1))) - return SR_ERR; - if (zip_add(zipfile, "header", metasrc) == -1) - return SR_ERR; - - if ((ret = zip_close(zipfile)) == -1) { - sr_info("error saving zipfile: %s", zip_strerror(zipfile)); - return SR_ERR; - } - - unlink(metafile); - - return SR_OK; -} - /** * Initialize a saved session file. * @@ -472,14 +373,11 @@ SR_API int sr_session_save(const char *filename, const struct sr_dev_inst *sdi, * * @since 0.3.0 */ -SR_API int sr_session_save_init(const char *filename, uint64_t samplerate, - char **channels) +SR_API int sr_session_save_init(const char *filename, const char *metafile, const char *decfile) { - FILE *meta; struct zip *zipfile; - struct zip_source *versrc, *metasrc; - int tmpfile, cnt, ret, i; - char version[1], metafile[32], *s; + struct zip_source *metasrc; + int ret; if (!filename) { sr_err("%s: filename was NULL", __func__); @@ -491,59 +389,41 @@ SR_API int sr_session_save_init(const char *filename, uint64_t samplerate, if (!(zipfile = zip_open(filename, ZIP_CREATE, &ret))) return SR_ERR; - /* "version" */ - version[0] = '2'; - if (!(versrc = zip_source_buffer(zipfile, version, 1, 0))) - return SR_ERR; - if (zip_add(zipfile, "version", versrc) == -1) { - sr_info("error saving version into zipfile: %s", - zip_strerror(zipfile)); - return SR_ERR; - } - - /* init "metadata" */ - strcpy(metafile, "sigrok-meta-XXXXXX"); - if ((tmpfile = g_mkstemp(metafile)) == -1) - return SR_ERR; - close(tmpfile); - meta = g_fopen(metafile, "wb"); - fprintf(meta, "[global]\n"); - fprintf(meta, "sigrok version = %s\n", PACKAGE_VERSION); - - /* metadata */ - fprintf(meta, "[device 1]\n"); - - /* metadata */ - fprintf(meta, "capturefile = logic-1\n"); - cnt = 0; - for (i = 0; channels[i]; i++) - cnt++; - fprintf(meta, "total probes = %d\n", cnt); - s = sr_samplerate_string(samplerate); - fprintf(meta, "samplerate = %s\n", s); - g_free(s); - - for (i = 0; channels[i]; i++) - fprintf(meta, "probe%d = %s\n", i + 1, channels[i]); - - fclose(meta); - + // meta file if (!(metasrc = zip_source_file(zipfile, metafile, 0, -1))) { unlink(metafile); return SR_ERR; } - if (zip_add(zipfile, "metadata", metasrc) == -1) { + + if (zip_add(zipfile, "header", metasrc) == -1) { unlink(metafile); return SR_ERR; } + // decoders file + if (decfile != NULL) { + if (!(metasrc = zip_source_file(zipfile, decfile, 0, -1))) { + unlink(decfile); + return SR_ERR; + } + + if (zip_add(zipfile, "decoders", metasrc) == -1) { + unlink(decfile); + return SR_ERR; + } + } + if ((ret = zip_close(zipfile)) == -1) { sr_info("error saving zipfile: %s", zip_strerror(zipfile)); unlink(metafile); + if (decfile != NULL) + unlink(decfile); return SR_ERR; } unlink(metafile); + if (decfile != NULL) + unlink(decfile); return SR_OK; } @@ -556,8 +436,10 @@ SR_API int sr_session_save_init(const char *filename, uint64_t samplerate, * * @param filename The name of the filename to append to. Must not be NULL. * @param buf The data to be appended. - * @param unitsize The number of bytes per sample. - * @param samples The number of samples. + * @param size Buffer size. + * @param chunk_num chunk number + * @param index channel index + * @param type channel type * * @retval SR_OK Success * @retval SR_ERR_ARG Invalid arguments @@ -565,119 +447,39 @@ SR_API int sr_session_save_init(const char *filename, uint64_t samplerate, * * @since 0.3.0 */ -SR_API int sr_session_append(const char *filename, unsigned char *buf, - int unitsize, int units) +SR_API int sr_session_append(const char *filename, const unsigned char *buf, + uint64_t size, int chunk_num, int index, int type, int version) { struct zip *archive; struct zip_source *logicsrc; - zip_int64_t num_files; - struct zip_file *zf; - struct zip_stat zs; - struct zip_source *metasrc; - GKeyFile *kf; - GError *error; - gsize len; - int chunk_num, next_chunk_num, tmpfile, ret, i; - const char *entry_name; - char *metafile, tmpname[32], chunkname[16]; + int ret; + char chunk_name[16], *type_name; - if ((ret = sr_sessionfile_check(filename)) != SR_OK) - return ret; +// if ((ret = sr_sessionfile_check(filename)) != SR_OK) +// return ret; if (!(archive = zip_open(filename, 0, &ret))) return SR_ERR; - if (zip_stat(archive, "metadata", 0, &zs) == -1) - return SR_ERR; + if (version == 2) { + type_name = (type == SR_CHANNEL_LOGIC) ? "L" : + (type == SR_CHANNEL_DSO) ? "O" : + (type == SR_CHANNEL_ANALOG) ? "A" : "U"; + snprintf(chunk_name, 15, "%s-%d/%d", type_name, index, chunk_num); + } else { + snprintf(chunk_name, 15, "data"); + } - metafile = g_malloc(zs.size); - zf = zip_fopen_index(archive, zs.index, 0); - zip_fread(zf, metafile, zs.size); - zip_fclose(zf); - - /* - * If the file was only initialized but doesn't yet have any - * data it in, it won't have a unitsize field in metadata yet. - */ - error = NULL; - kf = g_key_file_new(); - if (!g_key_file_load_from_data(kf, metafile, zs.size, 0, &error)) { - sr_err("Failed to parse metadata: %s.", error->message); + if (!(logicsrc = zip_source_buffer(archive, buf, size, FALSE))) { return SR_ERR; } - g_free(metafile); - tmpname[0] = '\0'; - if (!g_key_file_has_key(kf, "device 1", "unitsize", &error)) { - if (error && error->code != G_KEY_FILE_ERROR_KEY_NOT_FOUND) { - sr_err("Failed to check unitsize key: %s", error ? error->message : "?"); - return SR_ERR; - } - /* Add unitsize field. */ - g_key_file_set_integer(kf, "device 1", "unitsize", unitsize); - metafile = g_key_file_to_data(kf, &len, &error); - strcpy(tmpname, "sigrok-meta-XXXXXX"); - if ((tmpfile = g_mkstemp(tmpname)) == -1) - return SR_ERR; - if (write(tmpfile, metafile, len) < 0) { - sr_dbg("Failed to create new metadata: %s", strerror(errno)); - g_free(metafile); - unlink(tmpname); - return SR_ERR; - } - close(tmpfile); - if (!(metasrc = zip_source_file(archive, tmpname, 0, -1))) { - sr_err("Failed to create zip source for metadata."); - g_free(metafile); - unlink(tmpname); - return SR_ERR; - } - if (zip_replace(archive, zs.index, metasrc) == -1) { - sr_err("Failed to replace metadata file."); - g_free(metafile); - unlink(tmpname); - return SR_ERR; - } - g_free(metafile); - } - g_key_file_free(kf); - - next_chunk_num = 1; - num_files = zip_get_num_entries(archive, 0); - for (i = 0; i < num_files; i++) { - entry_name = zip_get_name(archive, i, 0); - if (strncmp(entry_name, "logic-1", 7)) - continue; - if (strlen(entry_name) == 7) { - /* This file has no extra chunks, just a single "logic-1". - * Rename it to "logic-1-1" * and continue with chunk 2. */ - if (zip_rename(archive, i, "logic-1-1") == -1) { - sr_err("Failed to rename 'logic-1' to 'logic-1-1'."); - unlink(tmpname); - return SR_ERR; - } - next_chunk_num = 2; - break; - } else if (strlen(entry_name) > 8 && entry_name[7] == '-') { - chunk_num = strtoull(entry_name + 8, NULL, 10); - if (chunk_num >= next_chunk_num) - next_chunk_num = chunk_num + 1; - } - } - snprintf(chunkname, 15, "logic-1-%d", next_chunk_num); - if (!(logicsrc = zip_source_buffer(archive, buf, units * unitsize, FALSE))) { - unlink(tmpname); - return SR_ERR; - } - if (zip_add(archive, chunkname, logicsrc) == -1) { - unlink(tmpname); + if (zip_file_add(archive, chunk_name, logicsrc, ZIP_FL_OVERWRITE) == -1) { return SR_ERR; } if ((ret = zip_close(archive)) == -1) { sr_info("error saving session file: %s", zip_strerror(archive)); - unlink(tmpname); return SR_ERR; } - unlink(tmpname); return SR_OK; } diff --git a/libsigrok4DSL/std.c b/libsigrok4DSL/std.c index cfe031d9..7ade9755 100644 --- a/libsigrok4DSL/std.c +++ b/libsigrok4DSL/std.c @@ -89,6 +89,7 @@ SR_PRIV int std_session_send_df_header(const struct sr_dev_inst *sdi, /* Send header packet to the session bus. */ sr_dbg("%sSending SR_DF_HEADER packet.", prefix); packet.type = SR_DF_HEADER; + packet.status = SR_PKT_OK; packet.payload = (uint8_t *)&header; header.feed_version = 1; gettimeofday(&header.starttime, NULL); @@ -152,6 +153,7 @@ SR_PRIV int std_hw_dev_acquisition_stop_serial(struct sr_dev_inst *sdi, /* Send SR_DF_END packet to the session bus. */ sr_dbg("%sSending SR_DF_END packet.", prefix); packet.type = SR_DF_END; + packet.status = SR_PKT_OK; packet.payload = NULL; if ((ret = sr_session_send(cb_data, &packet)) < 0) { sr_err("%sFailed to send SR_DF_END packet: %d.", prefix, ret); diff --git a/libsigrokdecode4DSL/NEWS b/libsigrokdecode4DSL/NEWS index ec40143b..a98c7fb9 100644 --- a/libsigrokdecode4DSL/NEWS +++ b/libsigrokdecode4DSL/NEWS @@ -1,3 +1,235 @@ +0.4.1 (2016-12-27) +------------------ + +Note: This release does NOT change the libsigrokdecode public C API. This +means existing libsigrokdecode frontends should not require any changes. +However, individual PDs and their output changed, which may require +some adaptations on the user's side in some cases. + + * New supported protocol decoders: + - aud Renesas/Hitachi Advanced User Debugger (AUD) protocol + - avr_pdi Atmel proprietary interface for the ATxmega MCU + - dmx512 Professional lighting control protocol + - em4305 EM4205/EM4305 100-150kHz RFID protocol + - gpib IEEE-488 GPIB / HPIB protocol + - ps2 PS/2 keyboard/mouse interface + - rgb_led_ws281x RGB LED string protocol (WS281x) + - ssi32 Synchronous Serial Interface (32bit) protocol + - t55xx T55xx 100-150kHz RFID protocol + - wiegand Wiegand interface for electronic entry systems + * Introduce a decoders/common facility for code shared between PDs (bug #804). + * Supply metadata to all stacked decoders, not just low-level ones (bug #664). + * Various Doxygen/documentation improvements. + * Factor out a srd_decoder_apiver() internal helper function. + * srd_inst_decode(): Return SRD_ERR_ARG if unitsize is 0. + * Print error messages when decoders fail load time checks (bug #704). + * Fix multiple valgrind warnings (memory leaks and such). + * Build system: Sort PD list alphabetically in "make install". + * mdio: + - Replace PD with a new implementation that also supports Clause 22 and 45. + - Improve annotations slightly. + * xfp: + - Move various constants to common/plugtrx for reusability purposes. + * sdcard_{sd,spi}: + - Move various constants to common/sdcard for reusability purposes. + * usb_request: + - Drop hardcoded samplerate (workaround for the fixed bug #664). + * spiflash: + - Handle CS# transitions, allow variable-length transfers. + - Handle "Fast Read Dual I/O" commands. + - Add a "format" decoder option. + - Implement Release Power-down / Device ID (0xAB) command (bug #845). + - Remove hardcoded Macronix references. + - Add initial FIDELIX FM25Q32 metadata/support. + - Implement WRSR, RDSR2 commands. + - Various annotation improvements. + * timing: + - Add frequency and averaging support. + * midi: + - Decode note names and percussion names (e.g. 'G2', 'Tambourine'). + - Decode instrument names and drum_kit names (e.g. 'GS Orchestra Kit'). + - Handle Polyphonic Pressure / Aftertouch (message 0xAn). + - Handle Program Change (message 0xCn). + - Handle Channel Pressure / Aftertouch (message 0xDn). + - Handle Channel Mode (message 0xBn mm where mm is 120 through 127). + - Handle System Common messages (message 0xF1 through 0xF6), including + full time code decoding. + - SysEx decoding now decodes the 1-3 byte manufacturer field, payload + is now displayed as hex. + - 'undefined' fields now display the value (e.g. 'undefined 0xf4'). + - Add 'MSB' and 'LSB' to many control_functions entries. + - Fix "trapped in state X" bug with handle_channel_msg_generic(), + though this might be dead code. + - Fix bug in sysex_manufacturer_ids; 1-byte manufacturers were not + tuples due to missing comma. + - Fix bug in SysEx state machine; 0xF7 now sent to handle_sysex_msg(). + - Annotations: Provide multiple string versions (shorter and longer ones). + - chromatic_notes in list.py was off by 1 octave. + - Handle "Running Status" where status byte can be omitted. + - SysEx message can be terminated by status byte, not just EOX. + - Handle SysReal messages that interrupt in-progress message transmission. + - Identify and print garbage / truncated data. + - Add 2 new annotations: text-sysreal-verbose and text-error. + * usb_power_delivery: + - Drop problematic exception in us2samples() function (bug #758). + * uart: + - Fix a bug in the output for stacked PDs (when there's RX/TX overlap). + - Various output formatting improvements (e.g. for ASCII and octal). + - Skip frames with invalid start bits. + - Emit 2 bytes for 9-bit UART binary output (bug #708). + - Default to hex format datavalue annotations. + * spi: + - Fix binary output for wordsizes > 8 (bug #686). + * Various decoders: + - Fix some incorrect PD license metadata fields. + - Fix typos, whitespace issues and random other cosmetics in some PDs. + - Use consistent __init__() format across all PDs. + - Move some duplicated code snippets/lists to decoders/common. + +0.4.0 (2016-01-29) +------------------ + +Note: This release DOES change the libsigrokdecode public C API. This +means it is NOT backwards-compatible and frontends will need updates. + + * New supported protocol decoders: + - adns5020 Bidirectional command and data over an SPI-like protocol + - am230x Aosong AM230x/DHTxx/RHTxx humidity/temperature sensor + - arm_etmv3 Decode ETM instruction trace packets + - arm_itm Trace data from Cortex-M / ARMv7m ITM module + - arm_tpiu Filter TPIU formatted trace data into separate streams + - eeprom24xx 24xx series I²C EEPROM protocol + - em4100 EM4100 100-150kHz RFID protocol + - jitter Retrieves the timing jitter between two digital signals + - max7219 8-digit LED display driver + - mdio Half-duplex sync serial bus for MII management (MAC/PHY) + - modbus Modbus RTU protocol for industrial applications + - mrf24j40 IEEE 802.15.4 2.4 GHz RF tranceiver chip + - nrf24l01 2.4GHz transceiver chip + - pwm Analog level encoded in duty cycle percentage + - qi Async serial protocol for Qi charger receivers + - rfm12 HopeRF RFM12 wireless transceiver control protocol + - sdcard_sd Secure Digital card (SD mode) low-level protocol + - spdif Serial bus for connecting digital audio devices + - stepper_motor Absolute position and movement speed from step/dir + - swd Two-wire protocol for debug access to ARM CPUs + - tca6408a Texas Instruments TCA6408A 8-bit I²C I/O expander + - timing Calculate time between edges + - usb_power_delivery USB Power Delivery protocol + - usb_request USB (low-speed and full-speed) transaction/request protocol + * The 'mx25lxx05d' decoder was renamed to 'spiflash' and made more generic. + * arm_itm: + - Use objdump instead of addr2line (bug #564). + * can: + - Emit bit value annotations. + - Improve stuff bit annotation placement. + * ds1307: + - Emit per-bit annotations for registers. + - Add more annotation classes (and annotation rows). + - Handle register 0x07 (control register). + - Handle SRAM register accesses. + - Correctly handle address wrap-around. + - Warn about (and ignore) non-DS1307 traffic. + * edid: + - Handle more EDID structure sections. + - Add annotation rows. + * jitter: + - Avoid Unicode string literals (bug #569). + * jtag: + - Fix/enable OUT_PYTHON output. + - Add more annotations, fix a SHIFT-IR/-DR issue. + * jtag_stm32: + - Fix incorrect handling of registers. + - Decode more fields, improve IDCODE handling. + - Decode IDCODE contents as strings (not just hex values). + * midi: + - Fix two incorrect sample numbers. + - Update for a change (emit databyte/bits at the same time) in the uart PD. + * mrf24j40: + - Fix a register address typo. + * nunchuk: + - Fix inverted button press logic. + * pan1321: + - Update for a change (emit databyte/bits at the same time) in the uart PD. + * onewire_link: + - Fix a bug when the samplerate is too low for the PD (bug #357). + * parallel: + - Enforce that at least one pin must be provided. + * pwm: + - Avoid Unicode string literals (bug #569). + * spi: + - OUT_PYTHON docs: Fix order of MISO/MOSI data items. + - Tell stacked decoders about missing CS# signal. + - Add binary output facilities for MISO/MOSI (bug #424). + - Don't decode data lines if CS# isn't asserted (bug #559). + - Add a 'TRANSFER' output type. + * spiflash: + - Implement FAST READ command. + - Add a 'chip' option in preparation for supporting more devices. + - Fix incorrect 'inputs' field. + * tlc5620: + - Fix incorrect DAC selection decode, add more annotations. + - Only decode the last 11 bits, ignore the rest. + - Properly handle LOAD and LDAC based operations. + - Handle the case of less than 11 bits in a command. + - Add options for per-DAC Vref, show voltages. + * uart: + - Add signal inversion options 'invert_tx' and 'invert_rx'. + - Emit databyte and bits list at the same time to simplify stacked PDs. + - Improve sample positions at high data rates. + - Handle framing errors better. + - Performance-optimize handling of samples when TX and RX are both idle. + * usb_packet: + - Fix incorrect DATA*/MDATA handling (bug #623). + - Handle invalid packets more gracefully (bug #186). + - Calculate and check CRC5/CRC16. + - Handle errors from usb_signalling. + - Handle PREamble transmissions. + * usb_request: + - Handle transmission timeouts. + - Handle PREamble transmissions. + * usb_signalling: + - Track USB symbol width to compensate frequency errors. + - Detect bit stuffing errors. + - Handle symbol errors in EOP state. + - Use explicit positions for packet start/end (avoids glitches). + - Decode RESET and Keep-Alive signalling conditions. + - Add option to automatically set signalling speed. + - Fix SOP detection after an error condition. + - Add signalling states needed after LS PREamble PID. + - Detect PREamble PID. + * Drop the PD testing framework. It's in the 'sigrok-test' repository now + (and is not meant for "end users" or distro packages anyway; it's a pure + developer tool/system). This also fixes some PD test related build issues. + * Makefile.am: Use libtool's -no-undefined option (fixes MinGW shared build). + * Support loading decoders stored in ZIP files. + * Updated build requirements: + - libglib >= 2.28.0 + - Drop obsolete (optional) dependencies: python3-coverage, libsigrok. + * README: Use clearer descriptions for the dependencies. + * Remove all references to the obsolete sigrok-commits mailing list. + * Fix incorrect doxygen comment for srd_decoder_list() function (bug #378). + * configure.ac: + - Fix a shell portability issue ("==" vs. "="). + - Use AM_CFLAGS instead of CFLAGS. + - Only link the 'check' library into the unit tests (not the lib). + * Unit tests: + - Fix out-of-tree build. + * libsigrokdecode.pc (pkg-config) file: + - Fix an issue related to the Python lib dependencies. + - Publish decodersdir variable. + * Add "-git-" suffix to development version numbers. + * Pass unitsize per sample chunk (bug #352). + * Modernize the whole autotools setup. + * Build with _POSIX_C_SOURCE=200112L per default. + * Build: Show CC and CFLAGS in configuration summary. + * Also look for decoders in XDG data directories. + * Restrict Python code to stable ABI subset (PEP 384). + * Fix various memory leaks. + * Fix an issue with PDs not being properly removed upon unload. + * Don't let Python override signal handlers (bug #461). + * configure: Also check for Python 3.5 (bug #739). + 0.3.0 (2014-05-06) ------------------ diff --git a/libsigrokdecode4DSL/README b/libsigrokdecode4DSL/README index 302c653e..686efeff 100644 --- a/libsigrokdecode4DSL/README +++ b/libsigrokdecode4DSL/README @@ -34,7 +34,7 @@ Requirements - automake >= 1.11 (only needed when building from git) - libtool (only needed when building from git) - pkg-config >= 0.22 - - libglib >= 2.24.0 + - libglib >= 2.28.0 - Python >= 3.2 - check >= 0.9.4 (optional, only needed to run unit tests) - doxygen (optional, only needed for the C API docs) diff --git a/libsigrokdecode4DSL/decoder.c b/libsigrokdecode4DSL/decoder.c index 98463168..b3c16da4 100644 --- a/libsigrokdecode4DSL/decoder.c +++ b/libsigrokdecode4DSL/decoder.c @@ -40,7 +40,7 @@ /** @cond PRIVATE */ -/* The list of protocol decoders. */ +/* The list of loaded protocol decoders. */ static GSList *pd_list = NULL; /* srd.c */ @@ -65,7 +65,7 @@ static gboolean srd_check_init(void) } /** - * Returns the list of supported/loaded protocol decoders. + * Returns the list of loaded protocol decoders. * * This is a GSList of pointers to struct srd_decoder items. * @@ -101,197 +101,530 @@ SRD_API struct srd_decoder *srd_decoder_get_by_id(const char *id) return NULL; } +static void channel_free(void *data) +{ + struct srd_channel *ch = data; + + if (!ch) + return; + + g_free(ch->desc); + g_free(ch->name); + g_free(ch->id); + g_free(ch); +} + +static void variant_free(void *data) +{ + GVariant *var = data; + + if (!var) + return; + + g_variant_unref(var); +} + +static void annotation_row_free(void *data) +{ + struct srd_decoder_annotation_row *row = data; + + if (!row) + return; + + g_slist_free(row->ann_classes); + g_free(row->desc); + g_free(row->id); + g_free(row); +} + +static void decoder_option_free(void *data) +{ + struct srd_decoder_option *opt = data; + + if (!opt) + return; + + g_slist_free_full(opt->values, &variant_free); + variant_free(opt->def); + g_free(opt->desc); + g_free(opt->id); + g_free(opt); +} + +static void decoder_free(struct srd_decoder *dec) +{ + if (!dec) + return; + + Py_XDECREF(dec->py_dec); + Py_XDECREF(dec->py_mod); + + g_slist_free_full(dec->options, &decoder_option_free); + g_slist_free_full(dec->binary, (GDestroyNotify)&g_strfreev); + g_slist_free_full(dec->annotation_rows, &annotation_row_free); + g_slist_free_full(dec->annotations, (GDestroyNotify)&g_strfreev); + g_slist_free_full(dec->opt_channels, &channel_free); + g_slist_free_full(dec->channels, &channel_free); + + g_free(dec->license); + g_free(dec->desc); + g_free(dec->longname); + g_free(dec->name); + g_free(dec->id); + + g_free(dec); +} + static int get_channels(const struct srd_decoder *d, const char *attr, - GSList **pdchl) + GSList **out_pdchl, int offset) { PyObject *py_channellist, *py_entry; struct srd_channel *pdch; - int ret, num_channels, i; + GSList *pdchl; + ssize_t i; if (!PyObject_HasAttrString(d->py_dec, attr)) /* No channels of this type specified. */ return SRD_OK; + pdchl = NULL; + py_channellist = PyObject_GetAttrString(d->py_dec, attr); + if (!py_channellist) + goto except_out; + if (!PyTuple_Check(py_channellist)) { srd_err("Protocol decoder %s %s attribute is not a tuple.", - d->name, attr); - return SRD_ERR_PYTHON; + d->name, attr); + goto err_out; } - if ((num_channels = PyTuple_Size(py_channellist)) == 0) - /* Empty channellist. */ - return SRD_OK; - - ret = SRD_OK; - for (i = 0; i < num_channels; i++) { + for (i = PyTuple_Size(py_channellist) - 1; i >= 0; i--) { py_entry = PyTuple_GetItem(py_channellist, i); + if (!py_entry) + goto except_out; + if (!PyDict_Check(py_entry)) { srd_err("Protocol decoder %s %s attribute is not " - "a list with dict elements.", d->name, attr); - ret = SRD_ERR_PYTHON; - break; + "a list of dict elements.", d->name, attr); + goto err_out; } + pdch = g_malloc0(sizeof(struct srd_channel)); + /* Add to list right away so it doesn't get lost. */ + pdchl = g_slist_prepend(pdchl, pdch); - pdch = g_malloc(sizeof(struct srd_channel)); + if (py_dictitem_as_str(py_entry, "id", &pdch->id) != SRD_OK) + goto err_out; + if (py_dictitem_as_str(py_entry, "name", &pdch->name) != SRD_OK) + goto err_out; + if (py_dictitem_as_str(py_entry, "desc", &pdch->desc) != SRD_OK) + goto err_out; - if ((py_dictitem_as_str(py_entry, "id", &pdch->id)) != SRD_OK) { - ret = SRD_ERR_PYTHON; - break; - } - if ((py_dictitem_as_str(py_entry, "name", &pdch->name)) != SRD_OK) { - ret = SRD_ERR_PYTHON; - break; - } - if ((py_dictitem_as_str(py_entry, "desc", &pdch->desc)) != SRD_OK) { - ret = SRD_ERR_PYTHON; - break; - } - pdch->order = i; - - *pdchl = g_slist_append(*pdchl, pdch); + pdch->type = py_dictitem_to_int(py_entry, "type"); + if (pdch->type < 0) + pdch->type = SRD_CHANNEL_COMMON; + pdch->order = offset + i; } - Py_DecRef(py_channellist); + Py_DECREF(py_channellist); + *out_pdchl = pdchl; - return ret; + return SRD_OK; + +except_out: + srd_exception_catch(NULL, "Failed to get %s list of %s decoder", + attr, d->name); +err_out: + g_slist_free_full(pdchl, &channel_free); + Py_XDECREF(py_channellist); + + return SRD_ERR_PYTHON; } static int get_options(struct srd_decoder *d) { - PyObject *py_opts, *py_opt, *py_val, *py_default, *py_item; - Py_ssize_t opt, i; + PyObject *py_opts, *py_opt, *py_str, *py_values, *py_default, *py_item; + GSList *options; struct srd_decoder_option *o; GVariant *gvar; - gint64 lval; - double dval; - int overflow; - char *sval; + ssize_t opt, i; if (!PyObject_HasAttrString(d->py_dec, "options")) /* No options, that's fine. */ return SRD_OK; + options = NULL; + /* If present, options must be a tuple. */ py_opts = PyObject_GetAttrString(d->py_dec, "options"); + if (!py_opts) + goto except_out; + if (!PyTuple_Check(py_opts)) { srd_err("Protocol decoder %s: options attribute is not " "a tuple.", d->id); - return SRD_ERR_PYTHON; + goto err_out; } - for (opt = 0; opt < PyTuple_Size(py_opts); opt++) { + for (opt = PyTuple_Size(py_opts) - 1; opt >= 0; opt--) { py_opt = PyTuple_GetItem(py_opts, opt); + if (!py_opt) + goto except_out; + if (!PyDict_Check(py_opt)) { srd_err("Protocol decoder %s options: each option " "must consist of a dictionary.", d->name); - return SRD_ERR_PYTHON; - } - if (!(py_val = PyDict_GetItemString(py_opt, "id"))) { - srd_err("Protocol decoder %s option %zd has no " - "id.", d->name, opt); - return SRD_ERR_PYTHON; + goto err_out; } + o = g_malloc0(sizeof(struct srd_decoder_option)); - py_str_as_str(py_val, &o->id); + /* Add to list right away so it doesn't get lost. */ + options = g_slist_prepend(options, o); - if ((py_val = PyDict_GetItemString(py_opt, "desc"))) - py_str_as_str(py_val, &o->desc); + py_str = PyDict_GetItemString(py_opt, "id"); + if (!py_str) { + srd_err("Protocol decoder %s option %zd has no id.", + d->name, opt); + goto err_out; + } + if (py_str_as_str(py_str, &o->id) != SRD_OK) + goto err_out; - if ((py_default = PyDict_GetItemString(py_opt, "default"))) { - if (PyUnicode_Check(py_default)) { - /* UTF-8 string */ - py_str_as_str(py_default, &sval); - o->def = g_variant_new_string(sval); - g_free(sval); - } else if (PyLong_Check(py_default)) { - /* Long */ - lval = PyLong_AsLongAndOverflow(py_default, &overflow); - if (overflow) { - /* Value is < LONG_MIN or > LONG_MAX */ - PyErr_Clear(); - srd_err("Protocol decoder %s option 'default' has " - "invalid default value.", d->name); - return SRD_ERR_PYTHON; - } - o->def = g_variant_new_int64(lval); - } else if (PyFloat_Check(py_default)) { - /* Float */ - if ((dval = PyFloat_AsDouble(py_default)) == -1.0) { - PyErr_Clear(); - srd_err("Protocol decoder %s option 'default' has " - "invalid default value.", d->name); - return SRD_ERR_PYTHON; - } - o->def = g_variant_new_double(dval); - } else { - srd_err("Protocol decoder %s option 'default' has " - "value of unsupported type '%s'.", d->name, - Py_TYPE(py_default)->tp_name); - return SRD_ERR_PYTHON; - } - g_variant_ref_sink(o->def); + py_str = PyDict_GetItemString(py_opt, "desc"); + if (py_str) { + if (py_str_as_str(py_str, &o->desc) != SRD_OK) + goto err_out; } - if ((py_val = PyDict_GetItemString(py_opt, "values"))) { + py_default = PyDict_GetItemString(py_opt, "default"); + if (py_default) { + gvar = py_obj_to_variant(py_default); + if (!gvar) { + srd_err("Protocol decoder %s option 'default' has " + "invalid default value.", d->name); + goto err_out; + } + o->def = g_variant_ref_sink(gvar); + } + + py_values = PyDict_GetItemString(py_opt, "values"); + if (py_values) { /* A default is required if a list of values is * given, since it's used to verify their type. */ if (!o->def) { - srd_err("No default for option '%s'", o->id); - return SRD_ERR_PYTHON; + srd_err("No default for option '%s'.", o->id); + goto err_out; } - if (!PyTuple_Check(py_val)) { + if (!PyTuple_Check(py_values)) { srd_err("Option '%s' values should be a tuple.", o->id); - return SRD_ERR_PYTHON; + goto err_out; } - for (i = 0; i < PyTuple_Size(py_val); i++) { - py_item = PyTuple_GetItem(py_val, i); + + for (i = PyTuple_Size(py_values) - 1; i >= 0; i--) { + py_item = PyTuple_GetItem(py_values, i); + if (!py_item) + goto except_out; + if (Py_TYPE(py_default) != Py_TYPE(py_item)) { srd_err("All values for option '%s' must be " - "of the same type as the default.", - o->id); - return SRD_ERR_PYTHON; + "of the same type as the default.", + o->id); + goto err_out; } - if (PyUnicode_Check(py_item)) { - /* UTF-8 string */ - py_str_as_str(py_item, &sval); - gvar = g_variant_new_string(sval); - g_variant_ref_sink(gvar); - g_free(sval); - o->values = g_slist_append(o->values, gvar); - } else if (PyLong_Check(py_item)) { - /* Long */ - lval = PyLong_AsLongAndOverflow(py_item, &overflow); - if (overflow) { - /* Value is < LONG_MIN or > LONG_MAX */ - PyErr_Clear(); - srd_err("Protocol decoder %s option 'values' " - "has invalid value.", d->name); - return SRD_ERR_PYTHON; - } - gvar = g_variant_new_int64(lval); - g_variant_ref_sink(gvar); - o->values = g_slist_append(o->values, gvar); - } else if (PyFloat_Check(py_item)) { - /* Float */ - if ((dval = PyFloat_AsDouble(py_item)) == -1.0) { - PyErr_Clear(); - srd_err("Protocol decoder %s option 'default' has " - "invalid default value.", d->name); - return SRD_ERR_PYTHON; - } - gvar = g_variant_new_double(dval); - g_variant_ref_sink(gvar); - o->values = g_slist_append(o->values, gvar); + gvar = py_obj_to_variant(py_item); + if (!gvar) { + srd_err("Protocol decoder %s option 'values' " + "contains invalid value.", d->name); + goto err_out; } + o->values = g_slist_prepend(o->values, + g_variant_ref_sink(gvar)); } } - d->options = g_slist_append(d->options, o); + } + d->options = options; + Py_DECREF(py_opts); + + return SRD_OK; + +except_out: + srd_exception_catch(NULL, "Failed to get %s decoder options", d->name); +err_out: + g_slist_free_full(options, &decoder_option_free); + Py_XDECREF(py_opts); + + return SRD_ERR_PYTHON; +} + +/* Convert annotation class attribute to GSList of char **. + */ +static int get_annotations(struct srd_decoder *dec) +{ + PyObject *py_annlist, *py_ann; + GSList *annotations; + char **annpair; + ssize_t i; + int ann_type = 7; + int j; + + if (!PyObject_HasAttrString(dec->py_dec, "annotations")) + return SRD_OK; + + annotations = NULL; + + py_annlist = PyObject_GetAttrString(dec->py_dec, "annotations"); + if (!py_annlist) + goto except_out; + + if (!PyTuple_Check(py_annlist)) { + srd_err("Protocol decoder %s annotations should " + "be a tuple.", dec->name); + goto err_out; + } + + for (i = 0; i < PyTuple_Size(py_annlist); i++) { + py_ann = PyTuple_GetItem(py_annlist, i); + if (!py_ann) + goto except_out; + + if (!PyTuple_Check(py_ann) || (PyTuple_Size(py_ann) != 3 && PyTuple_Size(py_ann) != 2)) { + srd_err("Protocol decoder %s annotation %zd should " + "be a tuple with two or three elements.", + dec->name, i); + goto err_out; + } + if (py_strseq_to_char(py_ann, &annpair) != SRD_OK) + goto err_out; + + annotations = g_slist_prepend(annotations, annpair); + + if (PyTuple_Size(py_ann) == 3) { + ann_type = 0; + for (j = 0; j < strlen(annpair[0]); j++) + ann_type = ann_type * 10 + (annpair[0][j] - '0'); + dec->ann_types = g_slist_append(dec->ann_types, GINT_TO_POINTER(ann_type)); + } else if (PyTuple_Size(py_ann) == 2) { + dec->ann_types = g_slist_append(dec->ann_types, GINT_TO_POINTER(ann_type)); + ann_type++; + } + } + dec->annotations = annotations; + Py_DECREF(py_annlist); + + return SRD_OK; + +except_out: + srd_exception_catch(NULL, "Failed to get %s decoder annotations", dec->name); +err_out: + g_slist_free_full(annotations, (GDestroyNotify)&g_strfreev); + Py_XDECREF(py_annlist); + + return SRD_ERR_PYTHON; +} + +/* Convert annotation_rows to GSList of 'struct srd_decoder_annotation_row'. + */ +static int get_annotation_rows(struct srd_decoder *dec) +{ + PyObject *py_ann_rows, *py_ann_row, *py_ann_classes, *py_item; + GSList *annotation_rows; + struct srd_decoder_annotation_row *ann_row; + ssize_t i, k; + size_t class_idx; + + if (!PyObject_HasAttrString(dec->py_dec, "annotation_rows")) + return SRD_OK; + + annotation_rows = NULL; + + py_ann_rows = PyObject_GetAttrString(dec->py_dec, "annotation_rows"); + if (!py_ann_rows) + goto except_out; + + if (!PyTuple_Check(py_ann_rows)) { + srd_err("Protocol decoder %s annotation_rows " + "must be a tuple.", dec->name); + goto err_out; + } + + for (i = PyTuple_Size(py_ann_rows) - 1; i >= 0; i--) { + py_ann_row = PyTuple_GetItem(py_ann_rows, i); + if (!py_ann_row) + goto except_out; + + if (!PyTuple_Check(py_ann_row) || PyTuple_Size(py_ann_row) != 3) { + srd_err("Protocol decoder %s annotation_rows " + "must contain only tuples of 3 elements.", + dec->name); + goto err_out; + } + ann_row = g_malloc0(sizeof(struct srd_decoder_annotation_row)); + /* Add to list right away so it doesn't get lost. */ + annotation_rows = g_slist_prepend(annotation_rows, ann_row); + + py_item = PyTuple_GetItem(py_ann_row, 0); + if (!py_item) + goto except_out; + if (py_str_as_str(py_item, &ann_row->id) != SRD_OK) + goto err_out; + + py_item = PyTuple_GetItem(py_ann_row, 1); + if (!py_item) + goto except_out; + if (py_str_as_str(py_item, &ann_row->desc) != SRD_OK) + goto err_out; + + py_ann_classes = PyTuple_GetItem(py_ann_row, 2); + if (!py_ann_classes) + goto except_out; + + if (!PyTuple_Check(py_ann_classes)) { + srd_err("Protocol decoder %s annotation_rows tuples " + "must have a tuple of numbers as 3rd element.", + dec->name); + goto err_out; + } + + for (k = PyTuple_Size(py_ann_classes) - 1; k >= 0; k--) { + py_item = PyTuple_GetItem(py_ann_classes, k); + if (!py_item) + goto except_out; + + if (!PyLong_Check(py_item)) { + srd_err("Protocol decoder %s annotation row " + "class tuple must only contain numbers.", + dec->name); + goto err_out; + } + class_idx = PyLong_AsSize_t(py_item); + if (PyErr_Occurred()) + goto except_out; + + ann_row->ann_classes = g_slist_prepend(ann_row->ann_classes, + GSIZE_TO_POINTER(class_idx)); + } + } + dec->annotation_rows = annotation_rows; + Py_DECREF(py_ann_rows); + + return SRD_OK; + +except_out: + srd_exception_catch(NULL, "Failed to get %s decoder annotation rows", + dec->name); +err_out: + g_slist_free_full(annotation_rows, &annotation_row_free); + Py_XDECREF(py_ann_rows); + + return SRD_ERR_PYTHON; +} + +/* Convert binary classes to GSList of char **. + */ +static int get_binary_classes(struct srd_decoder *dec) +{ + PyObject *py_bin_classes, *py_bin_class; + GSList *bin_classes; + char **bin; + ssize_t i; + + if (!PyObject_HasAttrString(dec->py_dec, "binary")) + return SRD_OK; + + bin_classes = NULL; + + py_bin_classes = PyObject_GetAttrString(dec->py_dec, "binary"); + if (!py_bin_classes) + goto except_out; + + if (!PyTuple_Check(py_bin_classes)) { + srd_err("Protocol decoder %s binary classes should " + "be a tuple.", dec->name); + goto err_out; + } + + for (i = PyTuple_Size(py_bin_classes) - 1; i >= 0; i--) { + py_bin_class = PyTuple_GetItem(py_bin_classes, i); + if (!py_bin_class) + goto except_out; + + if (!PyTuple_Check(py_bin_class) + || PyTuple_Size(py_bin_class) != 2) { + srd_err("Protocol decoder %s binary classes should " + "consist only of tuples of 2 elements.", + dec->name); + goto err_out; + } + if (py_strseq_to_char(py_bin_class, &bin) != SRD_OK) + goto err_out; + + bin_classes = g_slist_prepend(bin_classes, bin); + } + dec->binary = bin_classes; + Py_DECREF(py_bin_classes); + + return SRD_OK; + +except_out: + srd_exception_catch(NULL, "Failed to get %s decoder binary classes", + dec->name); +err_out: + g_slist_free_full(bin_classes, (GDestroyNotify)&g_strfreev); + Py_XDECREF(py_bin_classes); + + return SRD_ERR_PYTHON; +} + +/* Check whether the Decoder class defines the named method. + */ +static int check_method(PyObject *py_dec, const char *mod_name, + const char *method_name) +{ + PyObject *py_method; + int is_callable; + + py_method = PyObject_GetAttrString(py_dec, method_name); + if (!py_method) { + srd_exception_catch(NULL, "Protocol decoder %s Decoder class " + "has no %s() method", mod_name, method_name); + return SRD_ERR_PYTHON; + } + + is_callable = PyCallable_Check(py_method); + Py_DECREF(py_method); + + if (!is_callable) { + srd_err("Protocol decoder %s Decoder class attribute '%s' " + "is not a method.", mod_name, method_name); + return SRD_ERR_PYTHON; } return SRD_OK; } +/** + * Get the API version of the specified decoder. + * + * @param d The decoder to use. Must not be NULL. + * + * @return The API version of the decoder, or 0 upon errors. + */ +SRD_PRIV long srd_decoder_apiver(const struct srd_decoder *d) +{ + PyObject *py_apiver; + long apiver; + + if (!d) + return 0; + + py_apiver = PyObject_GetAttrString(d->py_dec, "api_version"); + apiver = (py_apiver && PyLong_Check(py_apiver)) + ? PyLong_AsLong(py_apiver) : 0; + Py_XDECREF(py_apiver); + + return apiver; +} + /** * Load a protocol decoder module into the embedded Python interpreter. * @@ -307,6 +640,9 @@ SRD_API int srd_decoder_load(const char *module_name) PyObject *py_bin_classes, *py_bin_class, *py_ann_rows, *py_ann_row; PyObject *py_ann_classes, *py_long; struct srd_decoder *d; + long apiver; + int is_subclass; + const char *fail_txt; int ret, i, j; char **ann, **bin, *ann_row_id, *ann_row_desc; struct srd_channel *pdch; @@ -314,7 +650,7 @@ SRD_API int srd_decoder_load(const char *module_name) struct srd_decoder_annotation_row *ann_row; int ann_type = 7; int ann_len; - + if (!srd_check_init()) return SRD_ERR; @@ -328,251 +664,147 @@ SRD_API int srd_decoder_load(const char *module_name) srd_dbg("Loading protocol decoder '%s'.", module_name); - py_basedec = py_method = py_attr = NULL; - d = g_malloc0(sizeof(struct srd_decoder)); + fail_txt = NULL; - ret = SRD_ERR_PYTHON; + d->py_mod = py_import_by_name(module_name); + if (!d->py_mod) { + fail_txt = "import by name failed"; + goto except_out; + } - /* Import the Python module. */ - if (!(d->py_mod = PyImport_ImportModule(module_name))) { - srd_exception_catch("Import of '%s' failed.", NULL, module_name); + if (!mod_sigrokdecode) { + srd_err("sigrokdecode module not loaded."); + fail_txt = "sigrokdecode(3) not loaded"; goto err_out; } /* Get the 'Decoder' class as Python object. */ - if (!(d->py_dec = PyObject_GetAttrString(d->py_mod, "Decoder"))) { - /* This generated an AttributeError exception. */ - PyErr_Clear(); - srd_err("Decoder class not found in protocol decoder %s.", - module_name); - goto err_out; + d->py_dec = PyObject_GetAttrString(d->py_mod, "Decoder"); + if (!d->py_dec) { + fail_txt = "no 'Decoder' attribute in imported module"; + goto except_out; } - if (!(py_basedec = PyObject_GetAttrString(mod_sigrokdecode, "Decoder"))) { - srd_dbg("sigrokdecode module not loaded."); - goto err_out; + py_basedec = PyObject_GetAttrString(mod_sigrokdecode, "Decoder"); + if (!py_basedec) { + fail_txt = "no 'Decoder' attribute in sigrokdecode(3)"; + goto except_out; } - if (!PyObject_IsSubclass(d->py_dec, py_basedec)) { + is_subclass = PyObject_IsSubclass(d->py_dec, py_basedec); + Py_DECREF(py_basedec); + + if (!is_subclass) { srd_err("Decoder class in protocol decoder module %s is not " "a subclass of sigrokdecode.Decoder.", module_name); + fail_txt = "not a subclass of sigrokdecode.Decoder"; goto err_out; } - Py_CLEAR(py_basedec); /* * Check that this decoder has the correct PD API version. * PDs of different API versions are incompatible and cannot work. */ - py_long = PyObject_GetAttrString(d->py_dec, "api_version"); - if (PyLong_AsLong(py_long) != 2) { - srd_err("Only PDs of API version 2 are supported."); + apiver = srd_decoder_apiver(d); + if (apiver != 2) { + srd_exception_catch(NULL, "Only PD API version 2 is supported, " + "decoder %s has version %ld", module_name, apiver); + fail_txt = "API version mismatch"; goto err_out; } - Py_CLEAR(py_long); - /* Check for a proper start() method. */ - if (!PyObject_HasAttrString(d->py_dec, "start")) { - srd_err("Protocol decoder %s has no start() method Decoder " - "class.", module_name); + /* Check Decoder class for required methods. + */ + if (check_method(d->py_dec, module_name, "start") != SRD_OK) { + fail_txt = "no 'start()' method"; goto err_out; } - py_method = PyObject_GetAttrString(d->py_dec, "start"); - if (!PyFunction_Check(py_method)) { - srd_err("Protocol decoder %s Decoder class attribute 'start' " - "is not a method.", module_name); - goto err_out; - } - Py_CLEAR(py_method); - /* Check for a proper decode() method. */ - if (!PyObject_HasAttrString(d->py_dec, "decode")) { - srd_err("Protocol decoder %s has no decode() method Decoder " - "class.", module_name); + if (check_method(d->py_dec, module_name, "decode") != SRD_OK) { + fail_txt = "no 'decode()' method"; goto err_out; } - py_method = PyObject_GetAttrString(d->py_dec, "decode"); - if (!PyFunction_Check(py_method)) { - srd_err("Protocol decoder %s Decoder class attribute 'decode' " - "is not a method.", module_name); - goto err_out; - } - Py_CLEAR(py_method); /* Store required fields in newly allocated strings. */ - if (py_attr_as_str(d->py_dec, "id", &(d->id)) != SRD_OK) + if (py_attr_as_str(d->py_dec, "id", &(d->id)) != SRD_OK) { + fail_txt = "no 'id' attribute"; goto err_out; + } - if (py_attr_as_str(d->py_dec, "name", &(d->name)) != SRD_OK) + if (py_attr_as_str(d->py_dec, "name", &(d->name)) != SRD_OK) { + fail_txt = "no 'name' attribute"; goto err_out; + } - if (py_attr_as_str(d->py_dec, "longname", &(d->longname)) != SRD_OK) + if (py_attr_as_str(d->py_dec, "longname", &(d->longname)) != SRD_OK) { + fail_txt = "no 'longname' attribute"; goto err_out; + } - if (py_attr_as_str(d->py_dec, "desc", &(d->desc)) != SRD_OK) + if (py_attr_as_str(d->py_dec, "desc", &(d->desc)) != SRD_OK) { + fail_txt = "no 'desc' attribute"; goto err_out; + } - if (py_attr_as_str(d->py_dec, "license", &(d->license)) != SRD_OK) + if (py_attr_as_str(d->py_dec, "license", &(d->license)) != SRD_OK) { + fail_txt = "no 'license' attribute"; goto err_out; + } /* All options and their default values. */ - if (get_options(d) != SRD_OK) + if (get_options(d) != SRD_OK) { + fail_txt = "cannot get options"; goto err_out; + } /* Check and import required channels. */ - if (get_channels(d, "channels", &d->channels) != SRD_OK) + if (get_channels(d, "channels", &d->channels, 0) != SRD_OK) { + fail_txt = "cannot get channels"; goto err_out; + } /* Check and import optional channels. */ - if (get_channels(d, "optional_channels", &d->opt_channels) != SRD_OK) + if (get_channels(d, "optional_channels", &d->opt_channels, + g_slist_length(d->channels)) != SRD_OK) { + fail_txt = "cannot get optional channels"; goto err_out; - - /* - * Fix order numbers for the optional channels. - * - * Example: - * Required channels: r1, r2, r3. Optional: o1, o2, o3, o4. - * 'order' fields in the d->channels list = 0, 1, 2. - * 'order' fields in the d->opt_channels list = 3, 4, 5, 6. - */ - for (l = d->opt_channels; l; l = l->next) { - pdch = l->data; - pdch->order += g_slist_length(d->channels); } - /* Convert annotation class attribute to GSList of char **. */ - d->annotations = NULL; - if (PyObject_HasAttrString(d->py_dec, "annotations")) { - py_annlist = PyObject_GetAttrString(d->py_dec, "annotations"); - if (!PyTuple_Check(py_annlist)) { - srd_err("Protocol decoder %s annotations should " - "be a tuple.", module_name); - goto err_out; - } - for (i = 0; i < PyTuple_Size(py_annlist); i++) { - py_ann = PyTuple_GetItem(py_annlist, i); - if (!PyTuple_Check(py_ann) || (PyTuple_Size(py_ann) != 3 && PyTuple_Size(py_ann) != 2)) { - srd_err("Protocol decoder %s annotation %d should " - "be a tuple with two elements.", module_name, i + 1); - goto err_out; - } - if (py_strseq_to_char(py_ann, &ann) != SRD_OK) { - goto err_out; - } - d->annotations = g_slist_append(d->annotations, ann); - if (PyTuple_Size(py_ann) == 3) { - ann_type = 0; - ann_len = strlen(ann[0]); - for (j = 0; j < ann_len; j++) - ann_type = ann_type * 10 + (ann[0][j] - '0'); - d->ann_types = g_slist_append(d->ann_types, GINT_TO_POINTER(ann_type)); - } else if (PyTuple_Size(py_ann) == 2) { - d->ann_types = g_slist_append(d->ann_types, GINT_TO_POINTER(ann_type)); - ann_type++; - } - } + if (get_annotations(d) != SRD_OK) { + fail_txt = "cannot get annotations"; + goto err_out; } - /* Convert annotation_rows to GSList of 'struct srd_decoder_annotation_row'. */ - d->annotation_rows = NULL; - if (PyObject_HasAttrString(d->py_dec, "annotation_rows")) { - py_ann_rows = PyObject_GetAttrString(d->py_dec, "annotation_rows"); - if (!PyTuple_Check(py_ann_rows)) { - srd_err("Protocol decoder %s annotation row list " - "must be a tuple.", module_name); - goto err_out; - } - for (i = 0; i < PyTuple_Size(py_ann_rows); i++) { - py_ann_row = PyTuple_GetItem(py_ann_rows, i); - if (!PyTuple_Check(py_ann_row)) { - srd_err("Protocol decoder %s annotation rows " - "must be tuples.", module_name); - goto err_out; - } - if (PyTuple_Size(py_ann_row) != 3 - || !PyUnicode_Check(PyTuple_GetItem(py_ann_row, 0)) - || !PyUnicode_Check(PyTuple_GetItem(py_ann_row, 1)) - || !PyTuple_Check(PyTuple_GetItem(py_ann_row, 2))) { - srd_err("Protocol decoder %s annotation rows " - "must contain tuples containing two " - "strings and a tuple.", module_name); - goto err_out; - } - - if (py_str_as_str(PyTuple_GetItem(py_ann_row, 0), &ann_row_id) != SRD_OK) - goto err_out; - - if (py_str_as_str(PyTuple_GetItem(py_ann_row, 1), &ann_row_desc) != SRD_OK) - goto err_out; - - py_ann_classes = PyTuple_GetItem(py_ann_row, 2); - ann_classes = NULL; - for (j = 0; j < PyTuple_Size(py_ann_classes); j++) { - py_long = PyTuple_GetItem(py_ann_classes, j); - if (!PyLong_Check(py_long)) { - srd_err("Protocol decoder %s annotation row class " - "list must only contain numbers.", module_name); - goto err_out; - } - ann_classes = g_slist_append(ann_classes, - GINT_TO_POINTER(PyLong_AsLong(py_long))); - } - - ann_row = g_malloc0(sizeof(struct srd_decoder_annotation_row)); - ann_row->id = ann_row_id; - ann_row->desc = ann_row_desc; - ann_row->ann_classes = ann_classes; - d->annotation_rows = g_slist_append(d->annotation_rows, ann_row); - } + if (get_annotation_rows(d) != SRD_OK) { + fail_txt = "cannot get annotation rows"; + goto err_out; } - /* Convert binary class to GSList of char *. */ - d->binary = NULL; - if (PyObject_HasAttrString(d->py_dec, "binary")) { - py_bin_classes = PyObject_GetAttrString(d->py_dec, "binary"); - if (!PyTuple_Check(py_bin_classes)) { - srd_err("Protocol decoder %s binary classes should " - "be a tuple.", module_name); - goto err_out; - } - for (i = 0; i < PyTuple_Size(py_bin_classes); i++) { - py_bin_class = PyTuple_GetItem(py_bin_classes, i); - if (!PyTuple_Check(py_bin_class)) { - srd_err("Protocol decoder %s binary classes " - "should consist of tuples.", module_name); - goto err_out; - } - if (PyTuple_Size(py_bin_class) != 2 - || !PyUnicode_Check(PyTuple_GetItem(py_bin_class, 0)) - || !PyUnicode_Check(PyTuple_GetItem(py_bin_class, 1))) { - srd_err("Protocol decoder %s binary classes should " - "contain tuples with two strings.", module_name); - goto err_out; - } - - if (py_strseq_to_char(py_bin_class, &bin) != SRD_OK) { - goto err_out; - } - d->binary = g_slist_append(d->binary, bin); - } + if (get_binary_classes(d) != SRD_OK) { + fail_txt = "cannot get binary classes"; + goto err_out; } - - /* Append it to the list of supported/loaded decoders. */ + + /* Append it to the list of loaded decoders. */ pd_list = g_slist_append(pd_list, d); - ret = SRD_OK; + return SRD_OK; -err_out: - if (ret != SRD_OK) { - Py_XDECREF(py_method); - Py_XDECREF(py_basedec); - Py_XDECREF(d->py_dec); - Py_XDECREF(d->py_mod); - g_free(d); +except_out: + if (fail_txt) { + srd_exception_catch(NULL, "Failed to load decoder %s: %s", + module_name, fail_txt); + fail_txt = NULL; + } else { + srd_exception_catch(NULL, "Failed to load decoder %s", module_name); } +err_out: + if (fail_txt) + srd_err("Failed to load decoder %s: %s", module_name, fail_txt); + decoder_free(d); - return ret; + return SRD_ERR_PYTHON; } /** @@ -600,36 +832,18 @@ SRD_API char *srd_decoder_doc_get(const struct srd_decoder *dec) return NULL; if (!(py_str = PyObject_GetAttrString(dec->py_mod, "__doc__"))) { - srd_exception_catch("", NULL); + srd_exception_catch(NULL, "Failed to get docstring"); return NULL; } doc = NULL; if (py_str != Py_None) py_str_as_str(py_str, &doc); - Py_DecRef(py_str); + Py_DECREF(py_str); return doc; } -static void free_channels(GSList *channellist) -{ - GSList *l; - struct srd_channel *pdch; - - if (channellist == NULL) - return; - - for (l = channellist; l; l = l->next) { - pdch = l->data; - g_free(pdch->id); - g_free(pdch->name); - g_free(pdch->desc); - g_free(pdch); - } - g_slist_free(channellist); -} - /** * Unload the specified protocol decoder. * @@ -641,8 +855,6 @@ static void free_channels(GSList *channellist) */ SRD_API int srd_decoder_unload(struct srd_decoder *dec) { - struct srd_decoder_option *o; - struct srd_decoder_annotation_row *row; struct srd_session *sess; GSList *l; @@ -665,44 +877,10 @@ SRD_API int srd_decoder_unload(struct srd_decoder *dec) srd_inst_free_all(sess, NULL); } - for (l = dec->options; l; l = l->next) { - o = l->data; - g_free(o->id); - g_free(o->desc); - g_variant_unref(o->def); - g_free(o); - } - g_slist_free(dec->options); + /* Remove the PD from the list of loaded decoders. */ + pd_list = g_slist_remove(pd_list, dec); - g_slist_foreach(dec->annotations, (GFunc)g_free, NULL); - g_slist_free(dec->annotations); - - for (l = dec->annotation_rows; l; l = l->next) { - row = l->data; - g_free(row->id); - g_free(row->desc); - g_slist_free(row->ann_classes); - g_free(row); - } - g_slist_free(dec->annotation_rows); - - g_slist_foreach(dec->binary, (GFunc)g_free, NULL); - g_slist_free(dec->binary); - - free_channels(dec->channels); - free_channels(dec->opt_channels); - g_free(dec->id); - g_free(dec->name); - g_free(dec->longname); - g_free(dec->desc); - g_free(dec->license); - - /* The module's Decoder class. */ - Py_XDECREF(dec->py_dec); - /* The module itself. */ - Py_XDECREF(dec->py_mod); - - g_free(dec); + decoder_free(dec); return SRD_OK; } @@ -717,7 +895,7 @@ static void srd_decoder_load_all_zip_path(char *path) set = files = prefix_obj = zipimporter = zipimporter_class = NULL; - zipimport_mod = PyImport_ImportModule("zipimport"); + zipimport_mod = py_import_by_name("zipimport"); if (zipimport_mod == NULL) goto err_out; @@ -734,7 +912,7 @@ static void srd_decoder_load_all_zip_path(char *path) goto err_out; files = PyObject_GetAttrString(zipimporter, "_files"); - if (files == NULL) + if (files == NULL || !PyDict_Check(files)) goto err_out; set = PySet_New(NULL); @@ -749,33 +927,32 @@ static void srd_decoder_load_all_zip_path(char *path) while (PyDict_Next(files, &pos, &key, &value)) { char *path, *slash; if (py_str_as_str(key, &path) == SRD_OK) { - if (strlen(path) > prefix_len && - !memcmp(path, prefix, prefix_len) && - (slash = strchr(path+prefix_len, '/'))) { - modname = - PyUnicode_FromStringAndSize(path+prefix_len, - slash-(path+prefix_len)); + if (strlen(path) > prefix_len + && memcmp(path, prefix, prefix_len) == 0 + && (slash = strchr(path + prefix_len, '/'))) { + + modname = PyUnicode_FromStringAndSize(path + prefix_len, + slash - (path + prefix_len)); if (modname == NULL) { PyErr_Clear(); } else { PySet_Add(set, modname); - Py_XDECREF(modname); + Py_DECREF(modname); } } - free(path); + g_free(path); } } - - free(prefix); + g_free(prefix); while ((modname = PySet_Pop(set))) { char *modname_str; if (py_str_as_str(modname, &modname_str) == SRD_OK) { /* The directory name is the module name (e.g. "i2c"). */ srd_decoder_load(modname_str); - free(modname_str); + g_free(modname_str); } - Py_XDECREF(modname); + Py_DECREF(modname); } err_out: @@ -840,13 +1017,7 @@ SRD_API int srd_decoder_load_all(void) */ SRD_API int srd_decoder_unload_all(void) { - GSList *l; - struct srd_decoder *dec; - - for (l = pd_list; l; l = l->next) { - dec = l->data; - srd_decoder_unload(dec); - } + g_slist_foreach(pd_list, (GFunc)srd_decoder_unload, NULL); g_slist_free(pd_list); pd_list = NULL; diff --git a/libsigrokdecode4DSL/exception.c b/libsigrokdecode4DSL/exception.c index 9662ed50..ca1b96f9 100644 --- a/libsigrokdecode4DSL/exception.c +++ b/libsigrokdecode4DSL/exception.c @@ -22,71 +22,142 @@ #include "libsigrokdecode.h" #include #include -#include /* Python header not pulled in by default. */ +#include + +static char *py_stringify(PyObject *py_obj) +{ + PyObject *py_str, *py_bytes; + char *str = NULL; + + if (!py_obj) + return NULL; + + py_str = PyObject_Str(py_obj); + if (!py_str || !PyUnicode_Check(py_str)) + goto cleanup; + + py_bytes = PyUnicode_AsUTF8String(py_str); + if (!py_bytes) + goto cleanup; + + str = g_strdup(PyBytes_AsString(py_bytes)); + Py_DECREF(py_bytes); + +cleanup: + Py_XDECREF(py_str); + if (!str) { + PyErr_Clear(); + srd_dbg("Failed to stringify object."); + } + return str; +} + +static char *py_get_string_attr(PyObject *py_obj, const char *attr) +{ + PyObject *py_str, *py_bytes; + char *str = NULL; + + if (!py_obj) + return NULL; + + py_str = PyObject_GetAttrString(py_obj, attr); + if (!py_str || !PyUnicode_Check(py_str)) + goto cleanup; + + py_bytes = PyUnicode_AsUTF8String(py_str); + if (!py_bytes) + goto cleanup; + + str = g_strdup(PyBytes_AsString(py_bytes)); + Py_DECREF(py_bytes); + +cleanup: + Py_XDECREF(py_str); + if (!str) { + PyErr_Clear(); + srd_dbg("Failed to get object attribute %s.", attr); + } + return str; +} /** @private */ -SRD_PRIV void srd_exception_catch(const char *format, char **error, ...) +SRD_PRIV void srd_exception_catch(char **error, const char *format, ...) { - PyObject *etype, *evalue, *etb, *py_str; - PyTracebackObject *py_tb; - GString *msg; va_list args; - char *ename, *str, *tracestr; + PyObject *py_etype, *py_evalue, *py_etraceback; + PyObject *py_mod, *py_func, *py_tracefmt; + char *msg, *etype_name, *evalue_str, *tracefmt_str; + const char *etype_name_fallback; + char *final_msg; - if (!PyErr_Occurred()) - /* Nothing is wrong. */ - return; + py_etype = py_evalue = py_etraceback = py_mod = py_func = NULL; - PyErr_Fetch(&etype, &evalue, &etb); - PyErr_NormalizeException(&etype, &evalue, &etb); - - if (!(py_str = PyObject_Str(evalue))) { - /* Shouldn't happen. */ - srd_dbg("Failed to convert exception value to string."); - return; - } - - /* Send the exception error message(s) to srd_err(). */ - if (evalue) - ename = (char *)Py_TYPE(evalue)->tp_name; - else - /* Can be NULL. */ - ename = "(unknown exception)"; - - msg = g_string_sized_new(128); - g_string_append(msg, ename); - g_string_append(msg, ": "); - va_start(args, error); - g_string_append_vprintf(msg, format, args); + va_start(args, error); + msg = g_strdup_vprintf(format, args); va_end(args); - py_str_as_str(py_str, &str); - g_string_append(msg, str); - Py_DecRef(py_str); - srd_err("%s", msg->str); - /* Send a more precise error location to srd_dbg(), if we have it. */ - if (etb && etb != Py_None) { - tracestr = NULL; - py_tb = (PyTracebackObject *)etb; - py_str = PyUnicode_FromFormat("%U:%d in %U", - py_tb->tb_frame->f_code->co_filename, - py_tb->tb_frame->f_lineno, - py_tb->tb_frame->f_code->co_name); - py_str_as_str(py_str, &tracestr); - Py_DecRef(py_str); - g_string_printf(msg, "%s in %s: %s", ename, tracestr, str); - srd_dbg("%s", msg->str); - g_free(tracestr); + PyErr_Fetch(&py_etype, &py_evalue, &py_etraceback); + if (!py_etype) { + /* No current exception, so just print the message. */ + final_msg = g_strjoin(":", msg, "unknown error", NULL); + srd_err("%s.", final_msg); + goto cleanup; } - if (error) - *error = g_strdup(str); - g_free(str); - g_string_free(msg, TRUE); + PyErr_NormalizeException(&py_etype, &py_evalue, &py_etraceback); - Py_XDECREF(etype); - Py_XDECREF(evalue); - Py_XDECREF(etb); + etype_name = py_get_string_attr(py_etype, "__name__"); + evalue_str = py_stringify(py_evalue); + etype_name_fallback = (etype_name) ? etype_name : "(unknown exception)"; + + if (evalue_str) + final_msg = g_strjoin(":", msg, etype_name_fallback, evalue_str, NULL); + else + final_msg = g_strjoin(":", msg, etype_name_fallback, NULL); + + srd_err("%s.", final_msg); + + g_free(evalue_str); + g_free(etype_name); + + /* If there is no traceback object, we are done. */ + if (!py_etraceback) + goto cleanup; + + py_mod = py_import_by_name("traceback"); + if (!py_mod) + goto cleanup; + + py_func = PyObject_GetAttrString(py_mod, "format_exception"); + if (!py_func || !PyCallable_Check(py_func)) + goto cleanup; + + /* Call into Python to format the stack trace. */ + py_tracefmt = PyObject_CallFunctionObjArgs(py_func, + py_etype, py_evalue, py_etraceback, NULL); + if (!py_tracefmt) + goto cleanup; + + tracefmt_str = py_stringify(py_tracefmt); + Py_DECREF(py_tracefmt); + + /* Log the detailed stack trace. */ + if (tracefmt_str) { + srd_dbg("%s", tracefmt_str); + g_free(tracefmt_str); + } + +cleanup: + if (error) + *error = g_strdup(final_msg); + Py_XDECREF(py_func); + Py_XDECREF(py_mod); + Py_XDECREF(py_etraceback); + Py_XDECREF(py_evalue); + Py_XDECREF(py_etype); /* Just in case. */ PyErr_Clear(); + + g_free(msg); + g_free(final_msg); } diff --git a/libsigrokdecode4DSL/instance.c b/libsigrokdecode4DSL/instance.c index 8413dca9..60c52e23 100644 --- a/libsigrokdecode4DSL/instance.c +++ b/libsigrokdecode4DSL/instance.c @@ -31,8 +31,8 @@ extern SRD_PRIV GSList *sessions; -/* type_logic.c */ -extern SRD_PRIV PyTypeObject srd_logic_type; +/* module_sigrokdecode.c */ +extern SRD_PRIV PyObject *srd_logic_type; /** @endcond */ @@ -164,7 +164,7 @@ SRD_API int srd_inst_option_set(struct srd_decoder_inst *di, err_out: Py_XDECREF(py_optval); if (PyErr_Occurred()) { - srd_exception_catch("Stray exception in srd_inst_option_set().", NULL); + srd_exception_catch(NULL, "Stray exception in srd_inst_option_set()."); ret = SRD_ERR_PYTHON; } @@ -342,7 +342,7 @@ SRD_API struct srd_decoder_inst *srd_inst_new(struct srd_session *sess, /* Create a new instance of this decoder class. */ if (!(di->py_inst = PyObject_CallObject(dec->py_dec, NULL))) { if (PyErr_Occurred()) - srd_exception_catch("failed to create %s instance: ", NULL, + srd_exception_catch(NULL, "Failed to create %s instance: ", decoder_id); g_free(di->dec_channelmap); g_free(di); @@ -507,15 +507,16 @@ SRD_PRIV int srd_inst_start(struct srd_decoder_inst *di, char **error) di->inst_id); if (!(py_res = PyObject_CallMethod(di->py_inst, "start", NULL))) { - srd_exception_catch("Protocol decoder instance %s: ", error, + srd_exception_catch(error, "Decoder %s", di->inst_id); return SRD_ERR_PYTHON; } Py_DecRef(py_res); if ((di->decoder->channels || di->decoder->opt_channels) != 0 ) { - logic = PyObject_New(srd_logic, &srd_logic_type); - //Py_INCREF(logic); + //logic = PyObject_New(srd_logic, &srd_logic_type); + logic = PyObject_New(srd_logic, (PyTypeObject *)srd_logic_type); + Py_INCREF(logic); logic->di = (struct srd_decoder_inst *)di; logic->sample = PyList_New(2); //Py_INCREF(logic->sample); @@ -542,7 +543,6 @@ SRD_PRIV int srd_inst_start(struct srd_decoder_inst *di, char **error) * set, relative to the start of capture. * @param inbuf The buffer to decode. Must not be NULL. * @param inbuflen Length of the buffer. Must be > 0. - * @param unitsize The number of bytes per sample. * * @return SRD_OK upon success, a (negative) error code otherwise. * @@ -552,32 +552,25 @@ SRD_PRIV int srd_inst_start(struct srd_decoder_inst *di, char **error) */ SRD_PRIV int srd_inst_decode(const struct srd_decoder_inst *di, uint8_t chunk_type, uint64_t start_samplenum, uint64_t end_samplenum, - const uint8_t *inbuf, uint64_t inbuflen, uint64_t unitsize, char **error) + const uint8_t **inbuf, const uint8_t *inbuf_const, char **error) { PyObject *py_res; srd_logic *logic; /* Return an error upon unusable input. */ if (!di) { - srd_dbg("empty decoder instance"); + *error = g_strdup("Empty decoder instance"); return SRD_ERR_ARG; } - if (!inbuf) { - srd_dbg("NULL buffer pointer"); + if (end_samplenum < start_samplenum) { + *error = g_strdup("Invalid start/end index couple"); return SRD_ERR_ARG; } - if (inbuflen == 0) { - srd_dbg("empty buffer"); - return SRD_ERR_ARG; - } - - ((struct srd_decoder_inst *)di)->data_unitsize = unitsize; srd_dbg("Calling decode(), start sample %" PRIu64 ", end sample %" - PRIu64 " (%" PRIu64 " samples, %" PRIu64 " bytes, unitsize = " - "%d), instance %s.", start_samplenum, end_samplenum, - end_samplenum - start_samplenum, inbuflen, di->data_unitsize, - di->inst_id); + PRIu64 " (%" PRIu64 " samples, instance %s.", + start_samplenum, end_samplenum, + end_samplenum - start_samplenum + 1, di->inst_id); /* * Create new srd_logic object. Each iteration around the PD's loop @@ -586,24 +579,25 @@ SRD_PRIV int srd_inst_decode(const struct srd_decoder_inst *di, uint8_t chunk_ty logic = di->py_logic; logic->start_samplenum = start_samplenum; if (chunk_type == 0) { - logic->itercnt = 0; + logic->itercnt = 0; // *inbuf is a byte pointer, 8bit align logic->logic_mask = 0; } - logic->inbuf = (uint8_t *)inbuf; - logic->inbuflen = inbuflen; + logic->inbuf = (uint8_t **)inbuf; + logic->inbuf_const = inbuf_const; + logic->samplenum = end_samplenum - start_samplenum + 1; Py_INCREF(logic); //Py_IncRef(di->py_inst); if (!(py_res = PyObject_CallMethod(di->py_inst, "decode", "KKO", start_samplenum, end_samplenum, logic))) { - srd_exception_catch("Protocol decoder instance %s: ", error, + srd_exception_catch(error, "Decoder %s", di->inst_id); return SRD_ERR_PYTHON; } Py_DecRef(py_res); if (logic->logic_mask == 0) - logic->itercnt -= logic->inbuflen / logic->di->data_unitsize; + logic->itercnt -= logic->samplenum; return SRD_OK; } @@ -627,7 +621,7 @@ SRD_PRIV void srd_inst_free(struct srd_decoder_inst *di) Py_DecRef(di->py_inst); g_free(di->inst_id); g_free(di->dec_channelmap); - g_free(di->channel_samples); + g_free(di->channel_samples); g_slist_free(di->next_di); for (l = di->pd_output; l; l = l->next) { pdo = l->data; diff --git a/libsigrokdecode4DSL/libsigrokdecode-internal.h b/libsigrokdecode4DSL/libsigrokdecode-internal.h index 4bfcc68b..7d47b7fd 100644 --- a/libsigrokdecode4DSL/libsigrokdecode-internal.h +++ b/libsigrokdecode4DSL/libsigrokdecode-internal.h @@ -22,6 +22,9 @@ #ifndef LIBSIGROKDECODE_LIBSIGROKDECODE_INTERNAL_H #define LIBSIGROKDECODE_LIBSIGROKDECODE_INTERNAL_H +/* Use the stable ABI subset as per PEP 384. */ +#define Py_LIMITED_API 0x03020000 + #include /* First, so we avoid a _POSIX_C_SOURCE warning. */ #include "libsigrokdecode.h" #include @@ -33,8 +36,9 @@ typedef struct { struct srd_decoder_inst *di; uint64_t start_samplenum; float itercnt; - uint8_t *inbuf; - uint64_t inbuflen; + uint8_t **inbuf; + uint8_t *inbuf_const; + uint64_t samplenum; PyObject *sample; uint64_t exp_logic; @@ -57,7 +61,7 @@ SRD_PRIV struct srd_decoder_inst *srd_inst_find_by_obj( const GSList *stack, SRD_PRIV int srd_inst_start(struct srd_decoder_inst *di, char **error); SRD_PRIV int srd_inst_decode(const struct srd_decoder_inst *di, uint8_t chunk_type, uint64_t start_samplenum, uint64_t end_samplenum, - const uint8_t *inbuf, uint64_t inbuflen, uint64_t unitsize, char **error); + const uint8_t **inbuf, const uint8_t *inbuf_const, char **error); SRD_PRIV void srd_inst_free(struct srd_decoder_inst *di); SRD_PRIV void srd_inst_free_all(struct srd_session *sess, GSList *stack); @@ -79,18 +83,37 @@ SRD_PRIV int srd_log(int loglevel, const char *format, ...) G_GNUC_PRINTF(2, 3); #define srd_warn(...) srd_log(SRD_LOG_WARN, __VA_ARGS__) #define srd_err(...) srd_log(SRD_LOG_ERR, __VA_ARGS__) +/* decoder.c */ +SRD_PRIV long srd_decoder_apiver(const struct srd_decoder *d); + +/* type_decoder.c */ +SRD_PRIV PyObject *srd_Decoder_type_new(void); + +/* type_logic.c */ +SRD_PRIV PyObject *srd_logic_type_new(void); + /* module_sigrokdecode.c */ PyMODINIT_FUNC PyInit_sigrokdecode(void); /* util.c */ -SRD_PRIV int py_attr_as_str(const PyObject *py_obj, const char *attr, - char **outstr); -SRD_PRIV int py_dictitem_as_str(const PyObject *py_obj, const char *key, - char **outstr); -SRD_PRIV int py_str_as_str(const PyObject *py_str, char **outstr); -SRD_PRIV int py_strseq_to_char(const PyObject *py_strseq, char ***outstr); +SRD_PRIV PyObject *py_import_by_name(const char *name); +SRD_PRIV int py_attr_as_str(PyObject *py_obj, const char *attr, char **outstr); +SRD_PRIV int py_dictitem_as_str(PyObject *py_obj, const char *key, char **outstr); +SRD_PRIV int py_dictitem_to_int(PyObject *py_obj, const char *key); +SRD_PRIV int py_str_as_str(PyObject *py_str, char **outstr); +SRD_PRIV int py_strseq_to_char(PyObject *py_strseq, char ***out_strv); +SRD_PRIV GVariant *py_obj_to_variant(PyObject *py_obj); /* exception.c */ -SRD_PRIV void srd_exception_catch(const char *format, char **error, ...); +#if defined(G_OS_WIN32) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 4)) +/* + * On MinGW, we need to specify the gnu_printf format flavor or GCC + * will assume non-standard Microsoft printf syntax. + */ +SRD_PRIV void srd_exception_catch(char **error, const char *format, ...) + __attribute__((__format__ (__gnu_printf__, 2, 3))); +#else +SRD_PRIV void srd_exception_catch(char **error, const char *format, ...) G_GNUC_PRINTF(2, 3); +#endif #endif diff --git a/libsigrokdecode4DSL/libsigrokdecode.h b/libsigrokdecode4DSL/libsigrokdecode.h index 162e57b6..1412e1d8 100644 --- a/libsigrokdecode4DSL/libsigrokdecode.h +++ b/libsigrokdecode4DSL/libsigrokdecode.h @@ -146,6 +146,15 @@ enum srd_configkey { SRD_CONF_SAMPLERATE = 10000, }; +enum srd_channel_type { + SRD_CHANNEL_COMMON = -1, + SRD_CHANNEL_SCLK, + SRD_CHANNEL_SDATA, + SRD_CHANNEL_ADATA, +}; + +extern char decoders_path[256]; + struct srd_decoder { /** The decoder ID. Must be non-NULL and unique for all decoders. */ char *id; @@ -213,6 +222,8 @@ struct srd_channel { char *desc; /** The index of the channel, i.e. its order in the list of channels. */ int order; + /** The type of the channel, such us: sclk/sdata/.../others */ + int type; }; struct srd_decoder_option { @@ -237,7 +248,6 @@ struct srd_decoder_inst { GSList *pd_output; int dec_num_channels; int *dec_channelmap; - int data_unitsize; uint8_t *channel_samples; GSList *next_di; uint64_t cur_pos; @@ -294,7 +304,7 @@ SRD_API int srd_session_metadata_set(struct srd_session *sess, int key, GVariant *data); SRD_API int srd_session_send(struct srd_session *sess, uint8_t chunk_type, uint64_t start_samplenum, uint64_t end_samplenum, - const uint8_t *inbuf, uint64_t inbuflen, uint64_t unitsize, char **error); + const uint8_t **inbuf, const uint8_t *inbuf_const, char **error); SRD_API int srd_session_destroy(struct srd_session *sess); SRD_API int srd_pd_output_callback_add(struct srd_session *sess, int output_type, srd_pd_output_callback cb, void *cb_data); diff --git a/libsigrokdecode4DSL/module_sigrokdecode.c b/libsigrokdecode4DSL/module_sigrokdecode.c index 99fa27fc..54b5573b 100644 --- a/libsigrokdecode4DSL/module_sigrokdecode.c +++ b/libsigrokdecode4DSL/module_sigrokdecode.c @@ -17,17 +17,13 @@ * along with this program. If not, see . */ +#include "libsigrokdecode.h" /* First, so we avoid a _POSIX_C_SOURCE warning. */ +#include "libsigrokdecode-internal.h" #include "config.h" -#include "libsigrokdecode-internal.h" /* First, so we avoid a _POSIX_C_SOURCE warning. */ -#include "libsigrokdecode.h" /** @cond PRIVATE */ -/* type_decoder.c */ -extern SRD_PRIV PyTypeObject srd_Decoder_type; - -/* type_logic.c */ -extern SRD_PRIV PyTypeObject srd_logic_type; +SRD_PRIV PyObject *srd_logic_type = NULL; /* * When initialized, a reference to this module inside the Python interpreter @@ -47,42 +43,45 @@ static struct PyModuleDef sigrokdecode_module = { /** @cond PRIVATE */ PyMODINIT_FUNC PyInit_sigrokdecode(void) { - PyObject *mod; - - /* tp_new needs to be assigned here for compiler portability. */ - srd_Decoder_type.tp_new = PyType_GenericNew; - if (PyType_Ready(&srd_Decoder_type) < 0) - return NULL; - - srd_logic_type.tp_new = PyType_GenericNew; - if (PyType_Ready(&srd_logic_type) < 0) - return NULL; + PyObject *mod, *Decoder_type, *logic_type; mod = PyModule_Create(&sigrokdecode_module); - Py_INCREF(&srd_Decoder_type); - if (PyModule_AddObject(mod, "Decoder", - (PyObject *)&srd_Decoder_type) == -1) - return NULL; - Py_INCREF(&srd_logic_type); - if (PyModule_AddObject(mod, "srd_logic", - (PyObject *)&srd_logic_type) == -1) - return NULL; + if (!mod) + goto err_out; + + Decoder_type = srd_Decoder_type_new(); + if (!Decoder_type) + goto err_out; + if (PyModule_AddObject(mod, "Decoder", Decoder_type) < 0) + goto err_out; + + logic_type = srd_logic_type_new(); + if (!logic_type) + goto err_out; + if (PyModule_AddObject(mod, "srd_logic", logic_type) < 0) + goto err_out; /* Expose output types as symbols in the sigrokdecode module */ - if (PyModule_AddIntConstant(mod, "OUTPUT_ANN", SRD_OUTPUT_ANN) == -1) - return NULL; - if (PyModule_AddIntConstant(mod, "OUTPUT_PYTHON", SRD_OUTPUT_PYTHON) == -1) - return NULL; - if (PyModule_AddIntConstant(mod, "OUTPUT_BINARY", SRD_OUTPUT_BINARY) == -1) - return NULL; - if (PyModule_AddIntConstant(mod, "OUTPUT_META", SRD_OUTPUT_META) == -1) - return NULL; + if (PyModule_AddIntConstant(mod, "OUTPUT_ANN", SRD_OUTPUT_ANN) < 0) + goto err_out; + if (PyModule_AddIntConstant(mod, "OUTPUT_PYTHON", SRD_OUTPUT_PYTHON) < 0) + goto err_out; + if (PyModule_AddIntConstant(mod, "OUTPUT_BINARY", SRD_OUTPUT_BINARY) < 0) + goto err_out; + if (PyModule_AddIntConstant(mod, "OUTPUT_META", SRD_OUTPUT_META) < 0) + goto err_out; /* Expose meta input symbols. */ - if (PyModule_AddIntConstant(mod, "SRD_CONF_SAMPLERATE", SRD_CONF_SAMPLERATE) == -1) - return NULL; + if (PyModule_AddIntConstant(mod, "SRD_CONF_SAMPLERATE", SRD_CONF_SAMPLERATE) < 0) + goto err_out; + srd_logic_type = logic_type; mod_sigrokdecode = mod; return mod; +err_out: + Py_XDECREF(mod); + srd_exception_catch(NULL, "Failed to initialize module"); + + return NULL; } /** @endcond */ diff --git a/libsigrokdecode4DSL/session.c b/libsigrokdecode4DSL/session.c index 676c54bb..67954e30 100644 --- a/libsigrokdecode4DSL/session.c +++ b/libsigrokdecode4DSL/session.c @@ -128,19 +128,27 @@ static int srd_inst_send_meta(struct srd_decoder_inst *di, int key, GVariant *data) { PyObject *py_ret; + GSList *l; + struct srd_decoder_inst *next_di; + int ret; if (key != SRD_CONF_SAMPLERATE) /* This is the only key we pass on to the decoder for now. */ return SRD_OK; - if (!PyObject_HasAttrString(di->py_inst, "metadata")) - /* This decoder doesn't want metadata, that's fine. */ - return SRD_OK; + if (PyObject_HasAttrString(di->py_inst, "metadata")) { + py_ret = PyObject_CallMethod(di->py_inst, "metadata", "lK", + (long)SRD_CONF_SAMPLERATE, + (unsigned long long)g_variant_get_uint64(data)); + Py_XDECREF(py_ret); + } - py_ret = PyObject_CallMethod(di->py_inst, "metadata", "lK", - (long)SRD_CONF_SAMPLERATE, - (unsigned long long)g_variant_get_uint64(data)); - Py_XDECREF(py_ret); + /* Push metadata to all the PDs stacked on top of this one. */ + for (l = di->next_di; l; l = l->next) { + next_di = l->data; + if ((ret = srd_inst_send_meta(next_di, key, data)) != SRD_OK) + return ret; + } return SRD_OK; } @@ -212,16 +220,11 @@ SRD_API int srd_session_metadata_set(struct srd_session *sess, int key, * in channel order, in the least amount of space possible. The default * channel set consists of all required channels + all optional channels. * - * The size of a sample in inbuf is 'unitsize' bytes. If no channel map - * has been configured, it is the minimum number of bytes needed to store - * the default channels. - * * @param sess The session to use. * @param start_samplenum The sample number of the first sample in this chunk. * @param end_samplenum The sample number of the last sample in this chunk. * @param inbuf Pointer to sample data. * @param inbuflen Length in bytes of the buffer. - * @param unitsize The number of bytes per sample. * * @return SRD_OK upon success, a (negative) error code otherwise. * @@ -229,7 +232,7 @@ SRD_API int srd_session_metadata_set(struct srd_session *sess, int key, */ SRD_API int srd_session_send(struct srd_session *sess, uint8_t chunk_type, uint64_t start_samplenum, uint64_t end_samplenum, - const uint8_t *inbuf, uint64_t inbuflen, uint64_t unitsize, char **error) + const uint8_t **inbuf, const uint8_t *inbuf_const, char **error) { GSList *d; int ret; @@ -241,7 +244,7 @@ SRD_API int srd_session_send(struct srd_session *sess, uint8_t chunk_type, for (d = sess->di_list; d; d = d->next) { if ((ret = srd_inst_decode(d->data, chunk_type, start_samplenum, - end_samplenum, inbuf, inbuflen, unitsize, error)) != SRD_OK) + end_samplenum, inbuf, inbuf_const, error)) != SRD_OK) return ret; } diff --git a/libsigrokdecode4DSL/srd.c b/libsigrokdecode4DSL/srd.c index 2226816e..a827e57f 100644 --- a/libsigrokdecode4DSL/srd.c +++ b/libsigrokdecode4DSL/srd.c @@ -18,7 +18,7 @@ * along with this program. If not, see . */ -#include "config.h" +#include #include "libsigrokdecode-internal.h" /* First, so we avoid a _POSIX_C_SOURCE warning. */ #include "libsigrokdecode.h" #include @@ -95,6 +95,23 @@ extern SRD_PRIV int max_session_id; * @{ */ +static int searchpath_add_xdg_dir(const char *datadir) +{ + char *decdir; + int ret; + + decdir = g_build_filename(datadir, PACKAGE_TARNAME, "decoders", NULL); + + if (g_file_test(decdir, G_FILE_TEST_IS_DIR)) + ret = srd_decoder_searchpath_add(decdir); + else + ret = SRD_OK; /* just ignore non-existing directory */ + + g_free(decdir); + + return ret; +} + /** * Initialize libsigrokdecode. * @@ -124,8 +141,10 @@ extern SRD_PRIV int max_session_id; */ SRD_API int srd_init(const char *path) { + const char *const *sys_datadirs; + const char *env_path; + size_t i; int ret; - char *env_path; if (max_session_id != -1) { srd_err("libsigrokdecode is already initialized."); @@ -138,10 +157,27 @@ SRD_API int srd_init(const char *path) PyImport_AppendInittab("sigrokdecode", PyInit_sigrokdecode); /* Initialize the Python interpreter. */ - Py_Initialize(); + Py_InitializeEx(0); - /* Installed decoders. */ - if ((ret = srd_decoder_searchpath_add(DECODERS_DIR)) != SRD_OK) { + /* Locations relative to the XDG system data directories. */ + sys_datadirs = g_get_system_data_dirs(); + for (i = g_strv_length((char **)sys_datadirs); i > 0; i--) { + ret = searchpath_add_xdg_dir(sys_datadirs[i-1]); + if (ret != SRD_OK) { + Py_Finalize(); + return ret; + } + } +#ifdef DECODERS_DIR + /* Hardcoded decoders install location, if defined. */ + if ((ret = srd_decoder_searchpath_add(DECODERS_DIR)) != SRD_OK) { + Py_Finalize(); + return ret; + } +#endif + /* Location relative to the XDG user data directory. */ + ret = searchpath_add_xdg_dir(g_get_user_data_dir()); + if (ret != SRD_OK) { Py_Finalize(); return ret; } @@ -155,7 +191,7 @@ SRD_API int srd_init(const char *path) } /* Environment variable overrides everything, for debugging. */ - if ((env_path = getenv("SIGROKDECODE_DIR"))) { + if ((env_path = g_getenv("SIGROKDECODE_DIR"))) { if ((ret = srd_decoder_searchpath_add(env_path)) != SRD_OK) { Py_Finalize(); return ret; @@ -183,12 +219,9 @@ SRD_API int srd_init(const char *path) */ SRD_API int srd_exit(void) { - GSList *l; - srd_dbg("Exiting libsigrokdecode."); - for (l = sessions; l; l = l->next) - srd_session_destroy((struct srd_session *)l->data); + g_slist_foreach(sessions, (GFunc)srd_session_destroy, NULL); srd_decoder_unload_all(); g_slist_free_full(searchpaths, g_free); @@ -224,36 +257,26 @@ SRD_API int srd_exit(void) SRD_PRIV int srd_decoder_searchpath_add(const char *path) { PyObject *py_cur_path, *py_item; - GString *new_path; - int wc_len, i; - wchar_t *wc_new_path; - char *item; srd_dbg("Adding '%s' to module path.", path); - new_path = g_string_sized_new(256); - g_string_assign(new_path, path); py_cur_path = PySys_GetObject("path"); - for (i = 0; i < PyList_Size(py_cur_path); i++) { - g_string_append(new_path, G_SEARCHPATH_SEPARATOR_S); - py_item = PyList_GetItem(py_cur_path, i); - if (!PyUnicode_Check(py_item)) - /* Shouldn't happen. */ - continue; - if (py_str_as_str(py_item, &item) != SRD_OK) - continue; - g_string_append(new_path, item); - g_free(item); - } + if (!py_cur_path) + return SRD_ERR_PYTHON; - /* Convert to wide chars. */ - wc_len = sizeof(wchar_t) * (new_path->len + 1); - wc_new_path = g_malloc(wc_len); - mbstowcs(wc_new_path, new_path->str, wc_len); - PySys_SetPath(wc_new_path); - g_string_free(new_path, TRUE); - g_free(wc_new_path); - searchpaths = g_slist_append(searchpaths, g_strdup(path)); + py_item = PyUnicode_FromString(path); + if (!py_item) { + srd_exception_catch(NULL, "Failed to create Unicode object"); + return SRD_ERR_PYTHON; + } + if (PyList_Insert(py_cur_path, 0, py_item) < 0) { + srd_exception_catch(NULL, "Failed to insert path element"); + Py_DECREF(py_item); + return SRD_ERR_PYTHON; + } + Py_DECREF(py_item); + + searchpaths = g_slist_prepend(searchpaths, g_strdup(path)); return SRD_OK; } diff --git a/libsigrokdecode4DSL/type_decoder.c b/libsigrokdecode4DSL/type_decoder.c index b922d8a9..907b0d8c 100644 --- a/libsigrokdecode4DSL/type_decoder.c +++ b/libsigrokdecode4DSL/type_decoder.c @@ -22,18 +22,25 @@ #include "libsigrokdecode-internal.h" /* First, so we avoid a _POSIX_C_SOURCE warning. */ #include "libsigrokdecode.h" #include +#include typedef struct { PyObject_HEAD } srd_Decoder; -/* This is only used for nicer srd_dbg() output. */ -static const char *OUTPUT_TYPES[] = { - "OUTPUT_ANN", - "OUTPUT_PYTHON", - "OUTPUT_BINARY", - "OUTPUT_META", -}; +/* This is only used for nicer srd_dbg() output. + */ +static const char *output_type_name(unsigned int idx) +{ + static const char names[][16] = { + "OUTPUT_ANN", + "OUTPUT_PYTHON", + "OUTPUT_BINARY", + "OUTPUT_META", + "(invalid)" + }; + return names[MIN(idx, G_N_ELEMENTS(names) - 1)]; +} static int convert_annotation(struct srd_decoder_inst *di, PyObject *obj, struct srd_proto_data *pdata) @@ -45,9 +52,9 @@ static int convert_annotation(struct srd_decoder_inst *di, PyObject *obj, gpointer ann_type_ptr; /* Should be a list of [annotation class, [string, ...]]. */ - if (!PyList_Check(obj) && !PyTuple_Check(obj)) { - srd_err("Protocol decoder %s submitted %s instead of list.", - di->decoder->name, obj->ob_type->tp_name); + if (!PyList_Check(obj)) { + srd_err("Protocol decoder %s submitted an annotation that" + " is not a list", di->decoder->name); return SRD_ERR_PYTHON; } @@ -63,8 +70,8 @@ static int convert_annotation(struct srd_decoder_inst *di, PyObject *obj, * The first element should be an integer matching a previously * registered annotation class. */ - py_tmp = PyList_GetItem(obj, 0); - if (!PyLong_Check(py_tmp)) { + py_tmp = PyList_GetItem(obj, 0); + if (!PyLong_Check(py_tmp)) { srd_err("Protocol decoder %s submitted annotation list, but " "first element was not an integer.", di->decoder->name); return SRD_ERR_PYTHON; @@ -83,13 +90,13 @@ static int convert_annotation(struct srd_decoder_inst *di, PyObject *obj, ann_type_ptr = g_slist_nth_data(di->decoder->ann_types, ann_class); /* Second element must be a list. */ - py_tmp = PyList_GetItem(obj, 1); - if (!PyList_Check(py_tmp)) { + py_tmp = PyList_GetItem(obj, 1); + if (!PyList_Check(py_tmp)) { srd_err("Protocol decoder %s submitted annotation list, but " "second element was not a list.", di->decoder->name); return SRD_ERR_PYTHON; } - if (py_strseq_to_char(py_tmp, &ann_text) != SRD_OK) { + if (py_strseq_to_char(py_tmp, &ann_text) != SRD_OK) { srd_err("Protocol decoder %s submitted annotation list, but " "second element was malformed.", di->decoder->name); return SRD_ERR_PYTHON; @@ -101,8 +108,6 @@ static int convert_annotation(struct srd_decoder_inst *di, PyObject *obj, pda->ann_text = ann_text; pdata->data = pda; - //Py_DECREF(py_tmp); - return SRD_OK; } @@ -115,26 +120,25 @@ static int convert_binary(struct srd_decoder_inst *di, PyObject *obj, int bin_class; char *class_name, *buf; - /* Should be a tuple of (binary class, bytes). */ - if (!PyTuple_Check(obj)) { - srd_err("Protocol decoder %s submitted SRD_OUTPUT_BINARY with " - "%s instead of tuple.", di->decoder->name, - obj->ob_type->tp_name); + /* Should be a list of [binary class, bytes]. */ + if (!PyList_Check(obj)) { + srd_err("Protocol decoder %s submitted non-list for SRD_OUTPUT_BINARY.", + di->decoder->name); return SRD_ERR_PYTHON; } /* Should have 2 elements. */ - if (PyTuple_Size(obj) != 2) { - srd_err("Protocol decoder %s submitted SRD_OUTPUT_BINARY tuple " + if (PyList_Size(obj) != 2) { + srd_err("Protocol decoder %s submitted SRD_OUTPUT_BINARY list " "with %zd elements instead of 2", di->decoder->name, PyList_Size(obj)); return SRD_ERR_PYTHON; } /* The first element should be an integer. */ - py_tmp = PyTuple_GetItem(obj, 0); + py_tmp = PyList_GetItem(obj, 0); if (!PyLong_Check(py_tmp)) { - srd_err("Protocol decoder %s submitted SRD_OUTPUT_BINARY tuple, " + srd_err("Protocol decoder %s submitted SRD_OUTPUT_BINARY list, " "but first element was not an integer.", di->decoder->name); return SRD_ERR_PYTHON; } @@ -146,9 +150,9 @@ static int convert_binary(struct srd_decoder_inst *di, PyObject *obj, } /* Second element should be bytes. */ - py_tmp = PyTuple_GetItem(obj, 1); + py_tmp = PyList_GetItem(obj, 1); if (!PyBytes_Check(py_tmp)) { - srd_err("Protocol decoder %s submitted SRD_OUTPUT_BINARY tuple, " + srd_err("Protocol decoder %s submitted SRD_OUTPUT_BINARY list, " "but second element was not bytes.", di->decoder->name); return SRD_ERR_PYTHON; } @@ -170,8 +174,6 @@ static int convert_binary(struct srd_decoder_inst *di, PyObject *obj, memcpy((void *)pdb->data, (const void *)buf, pdb->size); pdata->data = pdb; - //Py_DECREF(py_tmp); - return SRD_OK; } @@ -183,7 +185,7 @@ static int convert_meta(struct srd_proto_data *pdata, PyObject *obj) if (pdata->pdo->meta_type == G_VARIANT_TYPE_INT64) { if (!PyLong_Check(obj)) { PyErr_Format(PyExc_TypeError, "This output was registered " - "as 'int', but '%s' was passed.", obj->ob_type->tp_name); + "as 'int', but something else was passed."); return SRD_ERR_PYTHON; } intvalue = PyLong_AsLongLong(obj); @@ -193,7 +195,7 @@ static int convert_meta(struct srd_proto_data *pdata, PyObject *obj) } else if (pdata->pdo->meta_type == G_VARIANT_TYPE_DOUBLE) { if (!PyFloat_Check(obj)) { PyErr_Format(PyExc_TypeError, "This output was registered " - "as 'float', but '%s' was passed.", obj->ob_type->tp_name); + "as 'float', but something else was passed."); return SRD_ERR_PYTHON; } dvalue = PyFloat_AsDouble(obj); @@ -219,37 +221,37 @@ static PyObject *Decoder_put(PyObject *self, PyObject *args) struct srd_proto_data_annotation *pda; char **annotations; - if (!(di = srd_inst_find_by_obj(NULL, self))) { - /* Shouldn't happen. */ - srd_dbg("put(): self instance not found."); - return NULL; - } + if (!(di = srd_inst_find_by_obj(NULL, self))) { + /* Shouldn't happen. */ + srd_dbg("put(): self instance not found."); + return NULL; + } - if (!PyArg_ParseTuple(args, "KKiO", &start_sample, &end_sample, - &output_id, &py_data)) { - /* - * This throws an exception, but by returning NULL here we let - * Python raise it. This results in a much better trace in - * controller.c on the decode() method call. - */ - return NULL; - } + if (!PyArg_ParseTuple(args, "KKiO", &start_sample, &end_sample, + &output_id, &py_data)) { + /* + * This throws an exception, but by returning NULL here we let + * Python raise it. This results in a much better trace in + * controller.c on the decode() method call. + */ + return NULL; + } - if (!(l = g_slist_nth(di->pd_output, output_id))) { - srd_err("Protocol decoder %s submitted invalid output ID %d.", - di->decoder->name, output_id); - return NULL; - } - pdo = l->data; + if (!(l = g_slist_nth(di->pd_output, output_id))) { + srd_err("Protocol decoder %s submitted invalid output ID %d.", + di->decoder->name, output_id); + return NULL; + } + pdo = l->data; - srd_spew("Instance %s put %" PRIu64 "-%" PRIu64 " %s on oid %d.", - di->inst_id, start_sample, end_sample, - OUTPUT_TYPES[pdo->output_type], output_id); + srd_spew("Instance %s put %" PRIu64 "-%" PRIu64 " %s on oid %d.", + di->inst_id, start_sample, end_sample, + output_type_name(pdo->output_type), output_id); - pdata = g_malloc0(sizeof(struct srd_proto_data)); - pdata->start_sample = start_sample; - pdata->end_sample = end_sample; - pdata->pdo = pdo; + pdata = g_malloc0(sizeof(struct srd_proto_data)); + pdata->start_sample = start_sample; + pdata->end_sample = end_sample; + pdata->pdo = pdo; switch (pdo->output_type) { case SRD_OUTPUT_ANN: @@ -279,7 +281,7 @@ static PyObject *Decoder_put(PyObject *self, PyObject *args) if (!(py_res = PyObject_CallMethod( next_di->py_inst, "decode", "KKO", start_sample, end_sample, py_data))) { - srd_exception_catch("Calling %s decode(): ", NULL, + srd_exception_catch(NULL, "Calling %s decode() failed", next_di->inst_id); } Py_XDECREF(py_res); @@ -320,10 +322,9 @@ static PyObject *Decoder_put(PyObject *self, PyObject *args) break; } - g_free(pdata); - //Py_XDECREF(py_data); + g_free(pdata); - Py_RETURN_NONE; + Py_RETURN_NONE; } static PyObject *Decoder_register(PyObject *self, PyObject *args, @@ -363,8 +364,7 @@ static PyObject *Decoder_register(PyObject *self, PyObject *args, else if (meta_type_py == &PyFloat_Type) meta_type_gv = G_VARIANT_TYPE_DOUBLE; else { - PyErr_Format(PyExc_TypeError, "Unsupported type '%s'.", - meta_type_py->tp_name); + PyErr_Format(PyExc_TypeError, "Unsupported type."); return NULL; } } @@ -400,13 +400,24 @@ static PyMethodDef Decoder_methods[] = { {NULL, NULL, 0, NULL} }; -/** @cond PRIVATE */ -SRD_PRIV PyTypeObject srd_Decoder_type = { - PyVarObject_HEAD_INIT(NULL, 0) - .tp_name = "sigrokdecode.Decoder", - .tp_basicsize = sizeof(srd_Decoder), - .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, - .tp_doc = "sigrok Decoder base class", - .tp_methods = Decoder_methods, -}; -/** @endcond */ +/** Create the sigrokdecode.Decoder type. + * @return The new type object. + * @private + */ +SRD_PRIV PyObject *srd_Decoder_type_new(void) +{ + PyType_Spec spec; + PyType_Slot slots[] = { + { Py_tp_doc, "sigrok Decoder base class" }, + { Py_tp_methods, Decoder_methods }, + { Py_tp_new, (void *)&PyType_GenericNew }, + { 0, NULL } + }; + spec.name = "sigrokdecode.Decoder"; + spec.basicsize = sizeof(srd_Decoder); + spec.itemsize = 0; + spec.flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE; + spec.slots = slots; + + return PyType_FromSpec(&spec); +} diff --git a/libsigrokdecode4DSL/type_logic.c b/libsigrokdecode4DSL/type_logic.c index 5724d738..6f934059 100644 --- a/libsigrokdecode4DSL/type_logic.c +++ b/libsigrokdecode4DSL/type_logic.c @@ -33,28 +33,18 @@ static PyObject *srd_logic_iternext(PyObject *self) { srd_logic *logic; PyObject *py_samplenum, *py_samples; - uint8_t *sample_pos, sample; - int byte_offset, bit_offset, i; + int i; logic = (srd_logic *)self; uint64_t offset = floor(logic->itercnt); logic->di->cur_pos = logic->cur_pos; - logic->di->logic_mask = 0; - logic->di->exp_logic = 0; - if (logic->logic_mask != 0) { - if (logic->edge_index == -1) - logic->di->edge_index = -1; - else - logic->di->edge_index = logic->di->dec_channelmap[logic->edge_index]; - for (i = 0; i < logic->di->dec_num_channels; i++) { - int index = logic->di->dec_channelmap[i]; - if ((logic->logic_mask & (0x01 << i)) && index != -1) { - logic->di->logic_mask += 0x01 << index; - logic->di->exp_logic += ((logic->exp_logic & (0x01 << i)) >> i) << index; - } - } - } - if (offset >= logic->inbuflen / logic->di->data_unitsize || logic->logic_mask != 0) { + logic->di->logic_mask = logic->logic_mask; + logic->di->exp_logic = logic->exp_logic; + logic->di->edge_index = -1; + if (logic->logic_mask != 0 && logic->edge_index != -1) + logic->di->edge_index = logic->di->dec_channelmap[logic->edge_index]; + + if (offset > logic->samplenum || logic->logic_mask != 0) { /* End iteration loop. */ return NULL; } @@ -63,17 +53,19 @@ static PyObject *srd_logic_iternext(PyObject *self) * Convert the bit-packed sample to an array of bytes, with only 0x01 * and 0x00 values, so the PD doesn't need to do any bitshifting. */ - sample_pos = logic->inbuf + offset * logic->di->data_unitsize; for (i = 0; i < logic->di->dec_num_channels; i++) { /* A channelmap value of -1 means "unused optional channel". */ if (logic->di->dec_channelmap[i] == -1) { /* Value of unused channel is 0xff, instead of 0 or 1. */ logic->di->channel_samples[i] = 0xff; } else { - byte_offset = logic->di->dec_channelmap[i] / 8; - bit_offset = logic->di->dec_channelmap[i] % 8; - sample = *(sample_pos + byte_offset) & (1 << bit_offset) ? 1 : 0; - logic->di->channel_samples[i] = sample; + if (*(logic->inbuf + i) == NULL) { + logic->di->channel_samples[i] = *(logic->inbuf_const + i) ? 1 : 0; + } else { + uint64_t inbuf_offset = (offset + (logic->start_samplenum % 8)); + uint8_t *ptr = *(logic->inbuf + i) + (inbuf_offset / 8); + logic->di->channel_samples[i] = *ptr & (1 << (inbuf_offset % 8)) ? 1 : 0; + } } } @@ -102,15 +94,41 @@ static PyMemberDef srd_logic_members[] = { {NULL} /* Sentinel */ }; -/** @cond PRIVATE */ -SRD_PRIV PyTypeObject srd_logic_type = { - PyVarObject_HEAD_INIT(NULL, 0) - .tp_name = "srd_logic", - .tp_basicsize = sizeof(srd_logic), - .tp_flags = Py_TPFLAGS_DEFAULT, - .tp_doc = "Sigrokdecode logic sample object", - .tp_members = srd_logic_members, - .tp_iter = srd_logic_iter, - .tp_iternext = srd_logic_iternext, -}; -/** @endcond */ +//static PyMemberDef srd_logic_members[] = { +//// {"itercnt", T_FLOAT, offsetof(srd_logic, itercnt), 0, +//// "next expacted samples offset"}, +// {"logic_mask", T_ULONGLONG, offsetof(srd_logic, logic_mask), 0, +// "next expacted logic value mask"}, +//// {"exp_logic", T_ULONGLONG, offsetof(srd_logic, exp_logic), 0, +//// "next expacted logic value"}, +//// {"edge_index", T_INT, offsetof(srd_logic, edge_index), 0, +//// "channel index of next expacted edge"}, +//// {"cur_pos", T_ULONGLONG, offsetof(srd_logic, cur_pos), 0, +//// "current sample position"}, +// {NULL} /* Sentinel */ +//}; + + +/** Create the srd_logic type. + * @return The new type object. + * @private + */ +SRD_PRIV PyObject *srd_logic_type_new(void) +{ + PyType_Spec spec; + PyType_Slot slots[] = { + { Py_tp_doc, "sigrokdecode logic sample object" }, + { Py_tp_iter, (void *)&srd_logic_iter }, + { Py_tp_iternext, (void *)&srd_logic_iternext }, + { Py_tp_new, (void *)&PyType_GenericNew }, + { Py_tp_members, srd_logic_members }, + { 0, NULL } + }; + spec.name = "srd_logic"; + spec.basicsize = sizeof(srd_logic); + spec.itemsize = 0; + spec.flags = Py_TPFLAGS_DEFAULT; + spec.slots = slots; + + return PyType_FromSpec(&spec); +} diff --git a/libsigrokdecode4DSL/util.c b/libsigrokdecode4DSL/util.c index 93e953eb..b47af552 100644 --- a/libsigrokdecode4DSL/util.c +++ b/libsigrokdecode4DSL/util.c @@ -21,46 +21,63 @@ #include "config.h" #include "libsigrokdecode-internal.h" /* First, so we avoid a _POSIX_C_SOURCE warning. */ #include "libsigrokdecode.h" +#include "config.h" +/** + * Import a Python module by name. + * + * This function is implemented in terms of PyImport_Import() rather than + * PyImport_ImportModule(), so that the import hooks are not bypassed. + * + * @param[in] name The name of the module to load as UTF-8 string. + * @return The Python module object, or NULL if an exception occurred. The + * caller is responsible for evaluating and clearing the Python error state. + * + * @private + */ +SRD_PRIV PyObject *py_import_by_name(const char *name) +{ + PyObject *py_mod, *py_modname; + + py_modname = PyUnicode_FromString(name); + if (!py_modname) + return NULL; + + py_mod = PyImport_Import(py_modname); + Py_DECREF(py_modname); + + return py_mod; +} /** * Get the value of a Python object's attribute, returned as a newly * allocated char *. * - * @param py_obj The object to probe. - * @param attr Name of the attribute to retrieve. - * @param outstr ptr to char * storage to be filled in. + * @param[in] py_obj The object to probe. + * @param[in] attr Name of the attribute to retrieve. + * @param[out] outstr ptr to char * storage to be filled in. * * @return SRD_OK upon success, a (negative) error code otherwise. - * The 'outstr' argument points to a malloc()ed string upon success. + * The 'outstr' argument points to a g_malloc()ed string upon success. * * @private */ -SRD_PRIV int py_attr_as_str(const PyObject *py_obj, const char *attr, - char **outstr) +SRD_PRIV int py_attr_as_str(PyObject *py_obj, const char *attr, char **outstr) { PyObject *py_str; int ret; - if (!PyObject_HasAttrString((PyObject *)py_obj, attr)) { - srd_dbg("%s object has no attribute '%s'.", - Py_TYPE(py_obj)->tp_name, attr); + if (!PyObject_HasAttrString(py_obj, attr)) { + srd_dbg("Object has no attribute '%s'.", attr); return SRD_ERR_PYTHON; } - if (!(py_str = PyObject_GetAttrString((PyObject *)py_obj, attr))) { - srd_exception_catch("", NULL); - return SRD_ERR_PYTHON; - } - - if (!PyUnicode_Check(py_str)) { - srd_dbg("%s attribute should be a string, but is a %s.", - attr, Py_TYPE(py_str)->tp_name); - Py_DecRef(py_str); + if (!(py_str = PyObject_GetAttrString(py_obj, attr))) { + srd_exception_catch(NULL, "Failed to get attribute '%s'", attr); return SRD_ERR_PYTHON; } ret = py_str_as_str(py_str, outstr); - Py_DecRef(py_str); + Py_DECREF(py_str); return ret; } @@ -69,136 +86,213 @@ SRD_PRIV int py_attr_as_str(const PyObject *py_obj, const char *attr, * Get the value of a Python dictionary item, returned as a newly * allocated char *. * - * @param py_obj The dictionary to probe. - * @param key Key of the item to retrieve. - * @param outstr Pointer to char * storage to be filled in. + * @param[in] py_obj The dictionary to probe. + * @param[in] key Key of the item to retrieve. + * @param[out] outstr Pointer to char * storage to be filled in. * * @return SRD_OK upon success, a (negative) error code otherwise. - * The 'outstr' argument points to a malloc()ed string upon success. + * The 'outstr' argument points to a g_malloc()ed string upon success. * * @private */ -SRD_PRIV int py_dictitem_as_str(const PyObject *py_obj, const char *key, +SRD_PRIV int py_dictitem_as_str(PyObject *py_obj, const char *key, char **outstr) { PyObject *py_value; - int ret; - if (!PyDict_Check((PyObject *)py_obj)) { - srd_dbg("Object is a %s, not a dictionary.", - Py_TYPE((PyObject *)py_obj)->tp_name); + if (!PyDict_Check(py_obj)) { + srd_dbg("Object is not a dictionary."); return SRD_ERR_PYTHON; } - if (!(py_value = PyDict_GetItemString((PyObject *)py_obj, key))) { + if (!(py_value = PyDict_GetItemString(py_obj, key))) { srd_dbg("Dictionary has no attribute '%s'.", key); return SRD_ERR_PYTHON; } - if (!PyUnicode_Check(py_value)) { - srd_dbg("Dictionary value for %s should be a string, but is " - "a %s.", key, Py_TYPE(py_value)->tp_name); - return SRD_ERR_PYTHON; - } + return py_str_as_str(py_value, outstr); +} - ret = py_str_as_str(py_value, outstr); +/** + * Get the value of a Python dictionary item, returned as a int. + * + * @param[in] py_obj The dictionary to probe. + * @param[in] key Key of the item to retrieve. + * + * @return -1 upon failed + * + * @private + */ +SRD_PRIV int py_dictitem_to_int(PyObject *py_obj, const char *key) +{ + PyObject *py_value; + PyObject *py_long; - return ret; + if (!PyDict_Check(py_obj)) { + srd_dbg("Object is not a dictionary."); + return -1; + } + + if (!(py_value = PyDict_GetItemString(py_obj, key))) { + srd_dbg("Dictionary has no attribute '%s'.", key); + return -1; + } + py_long = PyLong_FromUnicodeObject(py_value, 10); + return PyLong_AsLong(py_long); } /** * Get the value of a Python unicode string object, returned as a newly * allocated char *. * - * @param py_str The unicode string object. - * @param outstr ptr to char * storage to be filled in. + * @param[in] py_str The unicode string object. + * @param[out] outstr ptr to char * storage to be filled in. * * @return SRD_OK upon success, a (negative) error code otherwise. - * The 'outstr' argument points to a malloc()ed string upon success. + * The 'outstr' argument points to a g_malloc()ed string upon success. * * @private */ -SRD_PRIV int py_str_as_str(const PyObject *py_str, char **outstr) +SRD_PRIV int py_str_as_str(PyObject *py_str, char **outstr) { - PyObject *py_encstr; - int ret; + PyObject *py_bytes; char *str; - py_encstr = NULL; - str = NULL; - ret = SRD_OK; - - if (!PyUnicode_Check((PyObject *)py_str)) { - srd_dbg("Object is a %s, not a string object.", - Py_TYPE((PyObject *)py_str)->tp_name); - ret = SRD_ERR_PYTHON; - goto err_out; + if (!PyUnicode_Check(py_str)) { + srd_dbg("Object is not a string object."); + return SRD_ERR_PYTHON; } - if (!(py_encstr = PyUnicode_AsEncodedString((PyObject *)py_str, - "utf-8", NULL))) { - ret = SRD_ERR_PYTHON; - goto err_out; - } - if (!(str = PyBytes_AS_STRING(py_encstr))) { - ret = SRD_ERR_PYTHON; - goto err_out; + py_bytes = PyUnicode_AsUTF8String(py_str); + if (py_bytes) { + str = g_strdup(PyBytes_AsString(py_bytes)); + Py_DECREF(py_bytes); + if (str) { + *outstr = str; + return SRD_OK; + } } + srd_exception_catch(NULL, "Failed to extract string"); - *outstr = g_strdup(str); - -err_out: - if (py_encstr) - Py_XDECREF(py_encstr); - - if (PyErr_Occurred()) { - srd_exception_catch("string conversion failed", NULL); - } - - return ret; + return SRD_ERR_PYTHON; } /** - * Convert a Python list of unicode strings to a NULL-terminated UTF8-encoded - * char * array. The caller must g_free() each string when finished. + * Convert a Python list of unicode strings to a C string vector. + * On success, a pointer to a newly allocated NULL-terminated array of + * allocated C strings is written to @a out_strv. The caller must g_free() + * each string and the array itself. * - * @param py_strlist The list object. - * @param outstr ptr to char ** storage to be filled in. + * @param[in] py_strseq The sequence object. + * @param[out] out_strv Address of string vector to be filled in. * * @return SRD_OK upon success, a (negative) error code otherwise. - * The 'outstr' argument points to a g_malloc()ed char** upon success. * * @private */ -SRD_PRIV int py_strseq_to_char(const PyObject *py_strseq, char ***outstr) +SRD_PRIV int py_strseq_to_char(PyObject *py_strseq, char ***out_strv) { - PyObject *py_seq, *py_str; - int list_len, i; - char **out, *str; + PyObject *py_item, *py_bytes; + char **strv, *str; + ssize_t seq_len, i; - list_len = PySequence_Size((PyObject *)py_strseq); - if (!(out = g_try_malloc(sizeof(char *) * (list_len + 1)))) { - srd_err("Failed to g_malloc() 'out'."); + if (!PySequence_Check(py_strseq)) { + srd_err("Object does not provide sequence protocol."); + return SRD_ERR_PYTHON; + } + + seq_len = PySequence_Size(py_strseq); + if (seq_len < 0) { + srd_exception_catch(NULL, "Failed to obtain sequence size"); + return SRD_ERR_PYTHON; + } + + strv = g_try_new0(char *, seq_len + 1); + if (!strv) { + srd_err("Failed to allocate result string vector."); return SRD_ERR_MALLOC; } - for (i = 0; i < list_len; i++) { -// if (!(py_str = PyUnicode_AsEncodedString( -// PySequence_GetItem((PyObject *)py_strseq, i), "utf-8", NULL))) -// return SRD_ERR_PYTHON; -// if (!(str = PyBytes_AS_STRING(py_str))) -// return SRD_ERR_PYTHON; - py_seq = PySequence_GetItem((PyObject *)py_strseq, i); - if (!(py_str = PyUnicode_AsEncodedString(py_seq, "utf-8", NULL))) - return SRD_ERR_PYTHON; - if (!(str = PyBytes_AS_STRING(py_str))) - return SRD_ERR_PYTHON; - out[i] = g_strdup(str); - Py_XDECREF(py_seq); - Py_XDECREF(py_str); + for (i = 0; i < seq_len; i++) { + py_item = PySequence_GetItem(py_strseq, i); + if (!py_item) + goto err_out; + + if (!PyUnicode_Check(py_item)) { + Py_DECREF(py_item); + goto err_out; + } + py_bytes = PyUnicode_AsUTF8String(py_item); + Py_DECREF(py_item); + if (!py_bytes) + goto err_out; + + str = g_strdup(PyBytes_AsString(py_bytes)); + Py_DECREF(py_bytes); + if (!str) + goto err_out; + + strv[i] = str; } - out[i] = NULL; - *outstr = out; + *out_strv = strv; return SRD_OK; + +err_out: + g_strfreev(strv); + srd_exception_catch(NULL, "Failed to obtain string item"); + + return SRD_ERR_PYTHON; +} + +/** + * Convert a Python scalar object to a GLib variant. + * Supported variant types are string, int64 and double. + * + * @param[in] py_obj The Python object. Must not be NULL. + * @return A floating reference to a new variant, or NULL on failure. + * + * @private + */ +SRD_PRIV GVariant *py_obj_to_variant(PyObject *py_obj) +{ + GVariant *var = NULL; + + if (PyUnicode_Check(py_obj)) { /* string */ + PyObject *py_bytes; + const char *str; + + py_bytes = PyUnicode_AsUTF8String(py_obj); + if (py_bytes) { + str = PyBytes_AsString(py_bytes); + if (str) + var = g_variant_new_string(str); + Py_DECREF(py_bytes); + } + if (!var) + srd_exception_catch(NULL, "Failed to extract string value"); + + } else if (PyLong_Check(py_obj)) { /* integer */ + int64_t val; + + val = PyLong_AsLongLong(py_obj); + if (!PyErr_Occurred()) + var = g_variant_new_int64(val); + else + srd_exception_catch(NULL, "Failed to extract integer value"); + + } else if (PyFloat_Check(py_obj)) { /* float */ + double val; + + val = PyFloat_AsDouble(py_obj); + if (!PyErr_Occurred()) + var = g_variant_new_double(val); + else + srd_exception_catch(NULL, "Failed to extract float value"); + + } else { + srd_err("Failed to extract value of unsupported type."); + } + + return var; } From 233f8f84956cb1a74318ee4ae0be2c933094415b Mon Sep 17 00:00:00 2001 From: DreamSourceLab Date: Sat, 20 May 2017 03:22:36 +0800 Subject: [PATCH 2/4] add new icon for v0.97 --- DSView/icons/add_dis.png | Bin 0 -> 399 bytes DSView/icons/arrow-loop.png | Bin 0 -> 8485 bytes DSView/icons/del_dis.png | Bin 0 -> 785 bytes DSView/icons/logo.svg | 11 +++++ DSView/icons/logo_128.png | Bin 0 -> 7379 bytes DSView/icons/logo_16.png | Bin 0 -> 763 bytes DSView/icons/logo_256.png | Bin 0 -> 15979 bytes DSView/icons/logo_32.png | Bin 0 -> 1609 bytes DSView/icons/logo_48.png | Bin 0 -> 2498 bytes DSView/icons/logo_64.png | Bin 0 -> 3455 bytes DSView/icons/moder.png | Bin 0 -> 2783 bytes DSView/icons/moder_dis.png | Bin 0 -> 2785 bytes DSView/icons/modes.png | Bin 0 -> 2369 bytes DSView/icons/modes_dis.png | Bin 0 -> 2373 bytes DSView/icons/nav.png | Bin 0 -> 660 bytes DSView/icons/oneloop.png | Bin 0 -> 1093 bytes DSView/icons/repeat.png | Bin 0 -> 1129 bytes DSView/pv/dialogs/interval.cpp | 75 +++++++++++++++++++++++++++++++++ DSView/pv/dialogs/interval.h | 62 +++++++++++++++++++++++++++ 19 files changed, 148 insertions(+) create mode 100755 DSView/icons/add_dis.png create mode 100755 DSView/icons/arrow-loop.png create mode 100755 DSView/icons/del_dis.png create mode 100755 DSView/icons/logo.svg create mode 100755 DSView/icons/logo_128.png create mode 100755 DSView/icons/logo_16.png create mode 100755 DSView/icons/logo_256.png create mode 100755 DSView/icons/logo_32.png create mode 100755 DSView/icons/logo_48.png create mode 100755 DSView/icons/logo_64.png create mode 100755 DSView/icons/moder.png create mode 100755 DSView/icons/moder_dis.png create mode 100755 DSView/icons/modes.png create mode 100755 DSView/icons/modes_dis.png create mode 100755 DSView/icons/nav.png create mode 100755 DSView/icons/oneloop.png create mode 100755 DSView/icons/repeat.png create mode 100755 DSView/pv/dialogs/interval.cpp create mode 100755 DSView/pv/dialogs/interval.h diff --git a/DSView/icons/add_dis.png b/DSView/icons/add_dis.png new file mode 100755 index 0000000000000000000000000000000000000000..b0349001446dd2c939e26bacb484377b56703652 GIT binary patch literal 399 zcmeAS@N?(olHy`uVBq!ia0vp^av;pX1|+Qw)-3{3oCO|{#X$M%Ak65bF}ngN$X?>< z>&pI+g_p@f>t@^Dn_wZ=h!V%rl8pQ!hL!8icmRcXN`OKxsl~}fnFS@8`FRY&oQldo zaW0U!bACZ(QD%BZ3BwxxGgd%RKCoy}Y9dIfLP=(BDud~FeomkaCrBnZKdq!Zu_%=x zw%|WVIXBqw%;MynM4-|lhV2Ko^aF)CK*HgPMR}Qd=?n*?pS1(U*dh8$i;`0rzW#51 z4O8ZvpPQSSSHke^%(VSLF*cC0kj#>tRE8DrE~x`WqC8z3Lp(Z@|NQ@Nf7pRx8RN!M z1>H2oQ0E{grfWN9ZckuT)_m5pXMx<-iYt#ErW-03MfR>PSRm%0m*N%|&>!Vve!wG( sJ7r6h3`jv>cVfd6rk1FLC#V!Z literal 0 HcmV?d00001 diff --git a/DSView/icons/arrow-loop.png b/DSView/icons/arrow-loop.png new file mode 100755 index 0000000000000000000000000000000000000000..d3df3243d4e4cc3a43f4d6547bd8a15580dcea38 GIT binary patch literal 8485 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 c+1hy6i@;wwrf$oy5< z>&pI+g_p@f?SjF_PhcU}h!V%rl8pQ!hL!8icmRcXN`OKxsl~}fnFS@8`FRY&oQldo zaW0U!bACZ(QD%BZ3BwxxGgd%RKCoy}Y9dIfLP=(BDud~FeomkaCrBnZKdq!Zu_%=x zw%|WVIXBqw%;MynM4-|lhV2Ko^aF)CK*HgPMR}Qd=?n*?pS1(U*dh8$i;`0rzW#51 z4O8ZvpPQSSSHke^%(VSLF*cC0kj#>tRE8DrE~zsxFy8TWaSZY3e0yzgmb9Y)!-JU` zUQgBZ1!6ds9A#`?9r7-PBP`MRm-Bmp_ivTo%#B%cD)|SyPnV60ft&T>b7qwc*ZrE* zdQ*?Q%qw4VVG`u3SS?`LhT6S&w`=B%`7 z^2sL}Gc}a9c6a?rnS3 z5|3K$<@aq5K6rY;=|{Znkf9+k>!o<11*E%v@dM+b)eszX!PR~z0rDiR;Y(C!|rSFzpfBp8lU0@2+ z&BSN%<(H3$3hwpyRdAVd-dExH#yeM3H!?HCGbZ?7W_w>ZS@}`>F|T0J^VceD;=G@( m*>q*^uZ53)@_p$St!KR6Zo*+AT-64Qc?M5cKbLh*2~7Y6YDriC literal 0 HcmV?d00001 diff --git a/DSView/icons/logo.svg b/DSView/icons/logo.svg new file mode 100755 index 00000000..b713c304 --- /dev/null +++ b/DSView/icons/logo.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/DSView/icons/logo_128.png b/DSView/icons/logo_128.png new file mode 100755 index 0000000000000000000000000000000000000000..0d46a075e34e2644f08d9387589d41dad485f5a8 GIT binary patch literal 7379 zcmV;^94zCBP)31iFr&Ig`mhFIDkV%QN*E&)z(tA zTHAW9)?3@#+pqm>@Aui>_G_)$YHjO%v`(!vDy1qaiV7+!5D0^S2w_SBnUgcT>-=ru?qNAVLpU(PA#F`ojXaYkOC|Thj5l@2UN=#Q0iRLmmKZK0cSjGLd z`bmTJ{&@9?fe$-M89GE1p63mHrZjo|l5NRrSM0P#RXSm#F>a#ag6E6Gx}ilUUa=Navii|2Vmo?ma>_`-(RjcaO* zkvr=w@N6{cW_x)j;7M?WhNox@&(oQZXKuYJs9QeVU*r|LFf-B^b0(Ev}@X= z0Bg$4Z~o|w*!MrKRHt~!CRC*@S7kXA#{<)qSdJv92?jusz6gf5dzoqEvxN8Ws}Rs zeGZ%U*}T2oWaVy~$|es*Ku~Wvo}vhWv|_xxQ6px050+M1V&cFfPYzqP0I`@i^s?uw zpZ{>TJYC1mj`wMjbR%!n|mkKX(niR_?x zvuK_KG@33CeG=z^6)|?!J46lTu#W0U2!wOEZ3-X!?40PA6-C*1(7jrEzzgeQ-}}ju z*zd|4oscfFv;DT5cuww?ZMY3hWPK< zxeUqC=*S-5>hqh22Gfz;y}Xfomp2i!B_aJ_(I#EN*@c?*q<(&o7a*ln z?|HxRPb(^vBGogqD>!YybS0W1_{F(7{QHb3nj(P9E1yj^OwD z<1=JR2|`FN85d+gqz~U&Sj)z}&VD5jfbG~U+T_kT@H+9u4W#mmH)~(H?-Tbz#j~=V z|0tM_BtN9^;3fHdxj4kJGWkct9}xsws%@@)zLr(xHqiqtfvW^~>6*y-vqprLK(hsq zQmQ-abtQ(gc6HG@mPqL!COyZx2#R#`V*Ad|p0RKU2fD zI+vg((1fJ4R-awnq=AIDbuJdwfuV7L_0pFr*t+Cm#*I`$KOP{bpQJ%udgA8&5O7q7uf1U({ zlzd}ygdGhocfH++t~>0G>%+I#np3scHd&KnN?tf_RuED%|57~}(~*oUP`P(*9wA+6 zm#dfR@l|n`7dIq%Zhf3j_c_!gBr($?pbMggpfFG6(s3cKIXT4m{yIXC@pC00ko@S( z97@V_3AR== zu&obgY2i@tx|-U(U(DmDZ`AYTnmDe6h;jIuz9Rg; zx*`bag32b3yOuVxbeqY2bMu%q$UtN`BuELP`{>La8{}VW8wdybT`%T8S0kTW7bkRt z1cTm8(veIYsPoEoed!xgGw%ID2)0x^+`O=srQ0l`hDa;cA|*6g9!2>o_suQfl5s&Y zofilJYbtDJJ+hDS{SCxP_gBcWItNv>o@&(F@S5}Up1P_JbH)bSCH%D&7B{?DOG&v+ zUNG~qHf~Gu0)l(z=JWNFo88ciltA#?Wexm%Nh8|s1{W>c^$#QANWMEQ!kn=|GM$18 zAtHW72KTyodJfN&Ceh>pnW$NOELSor zU*$(Lqd;aOzYv1m4KCk$v6l6f4!OaOY2=_LNIH_+U#VkYRAFXeAZ-PeQj!}G{O-bB zw5;$C$CGgTj3|W}&iaM$Cy%!-s-vXBCZ~ghpCY6Qs$w4B`)3^suIbCDKIy-wl#*Ga zf=AB^?rkI-$=O8)-2d%_)6cPyOf(`p@ZhxhYr?2iy#K>Tz zk}|6R2O=dHs^Et+bBG$527CkyHY9jpMH3Od<&52qB4Q}KzBS2j-fiHn^YhZ44@lau zFQ7M(a3q(G3o>g|`r|72@Y6-`VZW^mc~P}=XERe)wZ z2|0$~jttYfgaFr*{Nk-f%IXeI$LdT}1riSYd`SbR4mB8*lU}?cs{qX;Y{}&lL!3T5 zlfe`~@XWe6&##Z~Prf)-gfzkWy$*LTZ){$vY&%&6pt<)41UH`+MTks#zo5L);WzI# zf;c{Ib=VL*S`z2-;t*#R1={=_vI>A7^1W<)km*D9jDtRZ_@IeT_c=rZ$H%W$1;k9r zZ{BNU!7u|uZQEDr^$H-R?^1ndS`;#iOg^gpSd;ewF13b0sKS> zm_I3)*@g}wSYBrG%9bR-7B*)d4+5%SU8Tb#tK$4{W)4SF>Rzn?wksLePh;-b^w;_Y z;7Z9~Ry5IQ%46pCwFO;;M^?r8#-uOL!Lscpi$6CH z+lP0&(N)3L8iyy>9Nh}^S_SYV42-H=bz)|{Um|&AWo-X;@UDigz!N2LuAdyHU*yPE zpw}vZX-m#44ltrXOW*Yqf>nDg-q>mq=%OvCtAfqd4vRLMd~?c?J%TR!`kjlEU}$i~ z1b+{ICZ7M3B?+qIUY8pCTjI$zF|Ix-NLUvw>UpnJ07pv3_0>3MM1Zu-zkpr!4vRJ= zFuHi_1ysRDJ1ySbW-;dkKacQGy7*V<94r?u9T&=M@`vDs4GDHNx`euj>vtrC09(Ri zC2`Ih9cXcNvezkqD<$~>!9`;OXk+C;b6LKjf|=-|3an<+z#!xX;PDS+d` z#GyKq2d5wT1Hn7nP1f(T539q|RZ#@gn;tKJYBFVraoF#Bp8|Mr>9`<>+2Pcy6u|ai@*th!{+WDj!NN~XDq~)ki~Jo8fp7UNZXnHLE%uM|FHP8B#9R4 z?{-Io0w3(OnLWl|2hm)Q9$y&JlQ4Z~z~7#orumOq9`BWzJ*IeuuE3jHlgu6yKmb}u z6PT{-v0KC?{sBzqjSlSpciRzcuC^(yaJud6|4=kV@b)&7gzd*Ow5unEc<`eb(H82} z^aNZ_QkbuD@<6|Yd%C>!xkZyD3HAW&Xv)z}X`Lh%`4(3nAEE z=dilm>h`n$Ls3=uc(?BkYB>Rw=|c@_5=k779yJVj5~7A+MqwuIAFM97sBH3DJdmk7 z6I2E3_u5o8Ildcsc2R)!`)syWJ19M5vIBnn{*)m)qx-0&GybPq;LWW`|3uFohOP+8 z>RdkBW%~+nMxjpWUW1MM9P}PkE>;55hZ;oEt@a^cZe?{5@_JZ z$j>Ya@K{Nlo>DbT;%mCU_Ma|-jr%ON*7O|r?@)3A3a@T%E)%D#f|-Q|gQ6;xO>U1U z9p-wH!aR*hgENc%y<29Ibb3bg??`wDt_2Ls)i`yi!HXLc-G0#nz;@y6kp=@I>6J_o z!mkd#Y`fVbEMaRXV!r}Ngb>Uc6=1=}#PNNr4nX2twK-!mGyj{aEI#c4i$86_R{;N1 z0cI8&42-DMCcJLFK9Dm1Glpl9`72pnZnL)=rha9De`plG>vKXsjp;*m{?5K12 zWVhXIHh#31L-GM6XBPz+mZMS;bGzjj=t{}(JdHDpGTZp^{!WXsdbdZei?qbS3Ls%r zfy$}F3>Iuipm)Q0faSv669V)}^MHrc#*f!FC%eockjH|950A!Q1i9+OAPYZDbi1IC z*L)1iyy6UI{{nW_yL_1?R7yHzC2b|t3{3ovbH`rE!i zu&m5tSA*NFzH@syOaY{Xeqn{ni-W9PYGZVh-XNR*&YKWKS2Nl7=jZ;p-OTE>mm?;H zURLa93N>1?Tf_uX`~EH(o7uj<-SsZZ%dBpr@Et{q3LvFqe1DBuqXIm)Awj4ccmw|A zFGNvBr+f%r-~t8%zdWPm*H@uALN0`&uFVwDIRRB=9^C zSqqRta#o?i)FB2dc3EB8FE$;RJvzXt!!jxLE+{EC`Dmww-i5zoXK_RYkP^a%!Zj1a ze7Ms(mhY4ne#I}rbyLD985Da4Sg;{UgC&Xdg4q9|9A#&aWZsD({`zqfo2t8Ja)jkd zrVTYRI_5ociZ<*Glzeq!i2qp`XLA<|44JNE>R^M*i_>@gQj@>GukAT$aG7va1&|W@gjBwB zN|=9twZ2Q4N-5#n)57FuSnqH7jwH*=tR9#4oepi>9W43!q%e<_Bv@N%5$FO|AZbgc z57iGVdel~=ghyA!NjTlR=tFyHlLANyxdDampAq3(FIxK(NRAg$`a7C`cxDcH8T9_t zq0X;;W_D@!_E^yN`T$ZguQ~<(&NcGmw&aT9AQvB@{%u?M`+B zBoNRP{`0IHKGvte&RS1z%a?XeVUppzx z!z<&*<%qPTBl+RXC{tUgd)qbykCntJt8<7L-C&iglgX$=%+Jor;e(wPo2#8;I))}3 z$8a#Pyb`-lFgmuAx&(6)z z?elr?qu4P$+qbKeVUZ}w<;5Xxo*v=e_nXKGbgn6t(l`CTI4g&9M+P%I*&EjHwRx&E z-er$@IUZ>K0Z8eQik$uQoE$#hZL@rbMUEjdoR1%!xGkA`LXbOVMj@>-4?d~Be%}X8 z?2Bb*{s$tYPi7Z4`_uFOQO)k=6Er$n3F5Y-xWC5BU++g@etMa{2fpW$&y!sB^syVV zx(i~-)`XnZTs}P$JxDd~{AX)uuw;iSf$2yJLJH4)tq*4mZ~KYZ2frW0EV%ONYL;#@ zv%UWi#OZ&nluK{yPaw?_s{3yMAOz2r#<}^Qb(pT~kWjJZN(@!-$Q1=#UL4AJ(kF!A zPb-@E(c*f7n&@fup4x>cLEBp6^1zB1-xYFUS5FKRvn4-xrJkhIzKUbX z=J@Of1xL%a8L7t?^@cx&IXTY*6lk8+lAtO z8rrFaVP0O@#KWs%TsSt!+zjLEDJ7UcDa_y;l^-vzV|BSrNEdAix>&9xZcC;QHMnO^ z9y5#l%^jI<(-J&g8fU?VM0VV7fu!v*Wmp8QDQ^BPe^A~HiDaCgzERIf12hUVO0E7v z31*E7uyB4qez&}lzpsf?o$v^#z9Jkr1NWpac+-*eji}r>HN;QO%3(;Z3No{v4_}!6 zJC`&7*;#*!s463KyMHNYzeX}7SLNP| z^7+byFpsW|@%A>8oeeIQEmNm26VL@ib5$-F6X3eZ5zZKHG~Xk0KO%L!%a0e=v!mYa zm5H85!|`Cu&_39%`8yG_eU*i3)4pxc#mFUT&qP4 zv2y-%Rps?bb!1gNimnRodZ&@1e2ptl3?bT~1SxAE1dJ%q4iNNVpX{J5*@9{@>-6y$`NI>h}%2ocu+zCAVP9mj5*{$Yi3foCNNX@b2m zkMF!($3LzrV0?eQUE}hhbcXOtD{Q{Iu$G#**P}|icLsw)PQxW*L%$b7NDUxAq`dKd zSwb$@?3}Z)QUrA27f4*c&*s_}YI*wVK8)^@nP<@12qD;1<#7Fi8n)E9S%3d1I3COx z?ChC1SYHMQEC-)a7+f-KVB)P!HO57_CIAs#u%^Q1x)*AA;>tdZ>OxA83PEqHb-3}x z8cHi2a*jiWQg_1>8rMt=Jq3Op?1NhD)s2Y@fAnVKOJ#LVP*=VXbdx2SG)U)fR}^s4 zK)>|r@zjIVY=7l$i|;P1Wo@O?smswl1;>M;0lAcZCpuUNQ2~b}gv=QqeB16<7M_>76)0=f`K}aLvh~=FfDjBBTUwyOPIC z;@tCoBb%xmqK1-<@3#>NIOxnjNqzS(m-V?`2(kUZ-yg9VJdkH^j zXhMsd3%~e5P26S4=O#~-#Cf;OB5wN$BH3P_9;VcoS*Y`?FNJQMK0NrK5aO^ddDJFd zwmo*+&zG8i{9va|KsZN?ue%ZwmPAotWP!@8Q2}NQ4=`bX#@Id@Azd7y0=Xn^Np>{2 zlvX&ry)DUmW&Uw3w(F1c-JwifS0m|ZOd6!gJI@T>a&d9wFGu=ZoBGtNpT@p-|0mW1 zOUrBw>{c&It??%viJ=JkgarelD#LO$21fk;O1*ijy%-b=iA)Gt9K`E{q=J5?pL5s2%S=0TTejgiKpsyPfS-335S_IQf#<$X6TQ_gN(nn<+`-{o9B5Wf3qz1`zK0b zU)~Wj6vgQohfH->TnUa6WK2JUubv=3`sq12R|z3@wDtOo4eo+&pV~Xp6g-U)T$SDKdP2Zdv`P-G_jmH&5DNpA61#8FX7l2; zwE?}l(L}fwnj*6~_?>_R98Vxso!qd&#C+SjU`$})9Wx?7P!wfXCim#`C=Xe=A9R<@GJeb3dzf&xsQrP-m%B)z+a&7emX=^4r3J>GFBGQHJ%65Or$p z8N-aSQGK;P|J(G)6N;kj>xgG{nm9bq%YAlT^3s2-jpY~SsXy7(B!-pjNm7^avdNmQ zASL7l6($VOnL5NEr14nsK>dR`ql2G>bxMU09a^~g{{z!PCFXuUGL!%S002ovPDHLk FV1g&ygiQbd literal 0 HcmV?d00001 diff --git a/DSView/icons/logo_16.png b/DSView/icons/logo_16.png new file mode 100755 index 0000000000000000000000000000000000000000..67042eb351714c83d8f85a59b47251a47faef19b GIT binary patch literal 763 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 Hu0mjf9IqP9 literal 0 HcmV?d00001 diff --git a/DSView/icons/logo_48.png b/DSView/icons/logo_48.png new file mode 100755 index 0000000000000000000000000000000000000000..eb8b41628fe9ef3f10ff36a826e8e56b29de5ef6 GIT binary patch literal 2498 zcmV;z2|f0SP)~=^}F}I_y3=J?)jg4UJC{>DW&teSCTV!^<*zkWwNu{6LNGkWuu9~ z?ie1E3jA&dwI1y|k7>L)CMaH9d6|E`rfHdS^UK0n_#IJ=J>7Xzg#0UKU(FaBdMIrIh3R$GRTdp7bq9`1Z=M=~%&COXkj z6$LGTtb}MKD9SO-t`z+S)%J6x+jj0Q~)wP@+h<*IdqR=!U zM7)T=w12ig^=Yhnfl73gkE`JXFCcCyGy%Uj%gf?(d`t)#W#=Ys$*Rv%{Aojs)-Ids z@F-64b-%dr#!*-F6Il3s$F=MB`=3liyN`+Id()C}L7j(Ns<~i-D?gxA**E7ySkM;F zaqDZnyzp6yy82Pf92vdoiMcfo38j>I+OoD?UngAkj$HDXfIq3$!7B@DIKJ8#6nH6- zd|dqMwH}szsF)bC_k6jyw!yezb!2*ns;)P(U4!JL;R7GD6vtN^ymn0u((&)LP06$O-fFwbMVHsHH--iTs6VpHYE{(yY{I{3T#g1 zg=*uCVWx~WOF;Z_LzFw-j1chYC1r{Lx|5P~$C<2M7{+75fNg_ON$`TaP~CF2w=DSe zt!aM$b`-z26g+?eLLQCxc4xSKZG@$Bf_+yD&w%pkF-&GlsP<_5_FR9_bs->@k=(W> zf~E-^8iS@%1q3`g%Rh+IGReh^39h0|T~PwDwB)8HFXKZ4Q>Ng)O)>u0W)br0htvUG zfF=ZYtdBD7I42JMKqys=fK=cy1vmfDTXbCr*dNQWd~*V?>+p160e+`o^S2gHf0|^` zWG{s^s~CZJMl!R(#Tj)b#Q`FC=)(kU(HtS~krghcL$GXff(55}`d6W11acCtKGh9S zls2Oo$%?H>+)i=CRhQQke7w(M&5krJliYx+3;`>r7#r02NrP*^h~TAdNm{$IRC~0e zd$@o{KTgsz$&H{wE0C}hb5C|M!h1kL3p)Aq*3^(x-*0Mc*qvs3r_G5Y9F-v;fH^0Y zdVgDo&89sTUh^ou59k{7Bor@gOLO~q4h*Rn)`Pm0Q`A@KOdIDc8GH516tR?~+I#c_ z02~fjvpvo2=lL;oEuZp+i$ls*%$#5n_8myp`S4M^^;HIA7}nh5(AcuyVs}p#WA;QB zD?d$A&JgcurzD1%8)c z`f+B-*t=g_^d#lcXP*IP=z^EFr7+GOYZ7#848_v6Vsf2>#;}8e{|lkHzBN6p zEgHX5u(maWQD0?nMxBFyf0MyK#4xh5isl9@VdhS-q8C}}I2#yFTfdSLAX zuWnD1lS74D-VCJ_4I>;}Fy6`PZ7G6B=_T7%Ty=^EO^71(O<0okt(oBupFZo)%GXWy zu=iX+zqE2pRn=v;ZSd%#Hk)U~rad(@6Ol=Tr%G&i_7v)*KDn~m=Xyd{7{T5;o< zZbtbJs(t##pW0g4W|;wb!F1??+kWKbn&*1p2ng5`0v?TDHWeRS5P}_@HtSk5_=iyY z9Lf$7cEwevdRVqO!AJXS{LVv@5I`)I<2O_NG>mYRblM*NZ<0uA_{6I$1}SC#TZIs; z+nJ{M$xf=A+98X)l&z@sX?%2ZE#aclSeeQA35Y$BEX_}JvaLN!(5oRh=&MR1 z$GkHo9hs%VfA*TGJE%DU65uQmS^b!(#qgifxxtBFN z($J@*PE&A8lb3s%1I0B@-#yQKmSq03-2`1)MZd3EIha_Z=fsKkwXLeH310Q~)n-w{ zr~nAy_3bG(?9Sja1TBqj&aBUu3j^ow?6R5qNC(l3!evypUvC>e&K;FmD}Me$_a%?* zbicfCVvS=^+tWOlF** z{15#7{dPK%lBKf))Od6TuEs#%0H5r)xqfvwTlU+>1iVz>4FotX9Qi{yti|%jZKcHd zk9_~?C&|$4p7#Ar8tLH9=~Y~DvU^Yw>PqH#@WTZ6ycZ{$kp!HT2d|Vu_-Z-b-}|q3 zt`9d0A+r7GdV6JP&g$s8FQVQlvF>)VQZc#CWLATdvqqcL`SZulZzDP0-(&H{jx?=Z zS$s}`sULZp@JLN6(0pM|@Wi&Pm>-(iSS31P!0z0;H&U};oqBY8+;d4h9>dC{uxy2< zfy)p`Ad}69mB%4)Ryfl@J}YK5C*G<6C;1X@-+!Stzp=imvoKy3!PU=4e*Jle{9Rkd zIm*iB$faWFNQ4l_iXXNV{v!j$+&|M zoqa;#ASLLk;EEoqZ<^sZOEhoe=zhvOKbTQgbH01eJN*~;Sff|$wC~z`##-3uM|!7i ziIqvBNe4~o2GTb}O0YbM7AnCEg@||w`o^?BjIYw4czkZ;c|}n&x$es=fs|6aV{QDO z->;Pq9M71&tZWL^v*<=Lw?a1mJ6jt)RL~=oh6E!kysfv6H15A`LS$?Edvl88`+juZ zs>BmJ&uF(crZQ-r)h$%L1ro4aN!FD}AA|xz2z*}xpehj71-c^e5C|j2Wihv5-Z1T+ zhiAlAp8c#2V)?!woBeeB#cijQYdtH4ir+O-bpjGd*%H^6R9C2s?`tr=uTI~XilGWp zw&b&Vm+i-GcGNo5rF|m0z|_DICIiY177yqChp#RBQOh&i5a9cMc*csRCwJEAH~X15 zB2ccPLlD?^+L27`uXD$QD07F07*ML^yxy0Rk7^xO?aZ)pXPV;)k1|u>3WL5eMSgO3 zk7$ceXhXo#)eYZ$>$vfqbiA=!*?Q9UDGw=pb4rXmuZ~h0Qkq9(%U>%#H`U%`a!t zKobBdJExfe8G(q8ZcVamV;skq45$dpTSgl*{(X9ElLqjEcN4QV?6>bfZE0Z@yC8yG z2;!Dx>R^N4F7CmgG7XS)Qg(pmYb8R!Hzt=bs7&R~mm4_km58;w<9`VR1Z+BB|I;V+ z-gF$R5OQ1)lD1^>Af0D!s-$mBJ?E;os(m|iXn~X27kOiIZcPa+LNNK)r`Q!QVd)4tPuqJ& zU2wwI4BtzkUMdML0C*O{gK#bqYBma#?n502Y>YeN&8 z58Jq&3lo?9Mb3`s&;_IYx&dDJ8j+ z=`M!t!aq)oo+I819^De>okJF-rqbyhiU2~o!o!;rOuyV@Y*kzBl2CjCoaUX~?c*cl zN@Ii&?5wr<$$Lp67vQLM1)8#wWp5`~y`&Pg-CK%IfbGK4aS?h&b9ie4TmAm#1dUlq ziE&{D8`T9H_GekUC&QvE!)=^FQ3>#T=p9wKbxfF?NvsfTKA7dzeHKyu!o5|CqyO=i z1lJ8U37_Tpib_D%lPnn?rn*AUyZS$`Nnv^Nq6h#8X@c#?9oFv2a`TvQs}dBA011Rt zSTZV-`vM_&|ESGd2dp+Lb}xhxlMLo1oS_hb)7^f;W@3K>C{iBa zODHo1bBBk>z50T6d$XKK_?K+;TVSfNW_PBUfFfyt?MeQuzro1fdWSI~g52PR-5JyZ z?9Wt1@XFpS-}-Wlim)gS0iJ}JSA@_Mkt6dH>^NbwZLQXcTnU!8$y8P z`n+`@i&nt$grdT(lMVpd;4+oNO)f@()U7>SAEpd4a(aIde0Z$p7;)%n%`-9r`$TN1v=%va{Afn^qm7JetII zWx?N3C0MO$3OUf~P;qpqZNBx*;JBH+meXchL*%3uazng2)~IYK}UbPI+D8 zk90+FGU)|ja9Xv=$ERIBIpd-i=y1UEp;uIC4u82r&ZdJ|Tpx@sIG~UOZ8aK5M)cB{ zGtA_v4^ss*1KX2aJ;0>8ykpE20^(Vptw(ISx;n2(35pO*8E8;lp>eRGaAq)nc&Pcr zru~SZ=BUMI^)6Z$h2s{qW`gBml{v#gJi0Y`$<4s^B?HP-t{akX^8>H#&tiEH?P?7O zJ_5!6+Ndy3ZcF1xc}W{2EEm2y#H1=m)mI2eWPLUsu)19Rp_u?FgG0k{eRaNknZfJ( zvzIIp@d*w)ZyA%P@`K==!&yG-f(VogttKD|e8FwwB5e3Hd&yp4Ig*)Im`oaIbaZ~r zpU>~g;P@0Q0-X!(c7u}ZhMG+5uk*n%2lFCpagspA@3<<8k}LKLI8g7h@qksZt?&8J zh5#vpjl$j6lyLi+hKqi9)|E^eXmI_o{FR^QcBMI;y7ZNw&Z1*IKuQ*TDa_=-DYhQA zFW47I2?{}Pj;VHBeIcMeivP0dfxt!JD6Ex#_ujyiSIxrmWA>u@ROpszAw+_6i|5mGYSOn=|~WvFj>P`Jk=a zo8g8L!Qo^F9;9T}kPttbUCQ0-n~(@hHNVC*W_-RS#nM8bxsA=>O1U0;&0f(EA*i+j)`M^6p} zt6y`(=2zR2MRj}tzAq_@=!mPIs6VPI^#A6h5I2qt=b1Qw;HBLezOymjT2WO5_&!8U z!P2o29-di7Wh9^QkaA$oQ)j3-Y8Rb=vl#^RCTps$bIjm#|sKJ<1ITmNJeGmGDuWJXHqQ!ZW> z55Cnj=Xd**^#{&mnbJ@4(k+!a8w^{}wmtRi^2xc|Qs3K@X>r8_(`43fER({>y41c?(0lP>Wp7wBs zPIVb)e!aBk2u%o)yl+F|`;D2b+h|8;ul_iRrob<6s32zMC*gc2NiD*!-IL)T)-{s# zBq6PP{02pYVpK%ZZ(LKR)M)_!Jv+AXp|=xCZ7MrUdYZE8k7*jRK99{Sr@G>c_35{$ zJiuc$Ngn)t9Ltl0yNU21>8aa{uQHauL%aItU#)KV`R@-ace$A)Ny}$QrN*)ur7Rg8 zY4d>GJ-oC&?$dgg?`?|n%tygSr`XBP*>HuyoFUq8pZi+H-#|M8q&!(NXQlDRdndI? zekM-V4J5sOXox$miZZR*pv1_Zyzj4bcz#!gCqGDYu)(D)q!iuZoedX_K4l^H-&NW} z2+;sJD&YTDD=+`{>kVr^YzU3=QbA21Zb=LkM)lFTW`NGNbgmuf{mYXJEB~uyDCaEqp2$?+_m=&O9rgO`WHN~^ zZG0)nI1<|nv_e;d5}NCS=Sh_2A1ihzbqDaJK$<1=kND|%L&UNl&My1m+2eU<>-&Cq z=?jSmx7T|2opeGGFOx!%cIyqzKhi{SVfBJSLQ07*6r>g=8qyh3>Tg>-OnLAdQ%W|p zzxKRSfBe1p)K?G4d-k4oX2pq=TegRjO<)Mw?F4r{i7Rx>NC`2`qi@vTJE4!V;_% literal 0 HcmV?d00001 diff --git a/DSView/icons/moder.png b/DSView/icons/moder.png new file mode 100755 index 0000000000000000000000000000000000000000..d94f826a75321345566e1513bba0eb6e17b7eed8 GIT binary patch literal 2783 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 O0WOa2=o$z7<$nW_0wnza literal 0 HcmV?d00001 diff --git a/DSView/icons/moder_dis.png b/DSView/icons/moder_dis.png new file mode 100755 index 0000000000000000000000000000000000000000..8bc447215db1bf8ff2b8d4614f61ca88f38acb07 GIT binary patch literal 2785 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 Gx%^*FatVz9 literal 0 HcmV?d00001 diff --git a/DSView/icons/modes.png b/DSView/icons/modes.png new file mode 100755 index 0000000000000000000000000000000000000000..c8e465ceb7b8e1864e096e8bdd45d9aa09ec062b GIT binary patch literal 2369 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 literal 0 HcmV?d00001 diff --git a/DSView/icons/nav.png b/DSView/icons/nav.png new file mode 100755 index 0000000000000000000000000000000000000000..03f1f605b1eb9438f31ce52b8a04812c5bc58a65 GIT binary patch literal 660 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE0wix1Z>k4UEa{HEjtmSN`?>!lvVtU&J%W50 z7^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+@+{-GzZ+Rj;xUkjGiz z5m^kh={g8AI%&+V01C2~c>21sKj2~IV;5wxM4zvgaM~pQ){cQ z%f-}*5@|;7PtHo(QE<&JUGIC}Lb-%6;lQgFmG2sEYkX3O4#}Lzt=+%rwDtcx$t@Ev z%UnKk#;KsPi@R<^kdl~->5S)G>SBMNvaotte133wzF=9!(Ybr3&w13rzo%l!dEa?Y z=IH;4D4Mo>=acKKB{&~p8jDfw6LVJ(EC7@N32rfE=m0_?R*nflrxzrzYw~fyZ2l}aqIp3jhE`) zOV7W^v})3lHorSuO{_9IzJ9;oY`MVk(q5$#EbVSPxbtT!9NQLN|B~Nqkt~PGlNS%G|oWRD45bDP46hOx7_4S6Fo+k-*%fF5lweBoc6VW5Sk<@TEc(r-9v+e^L$1LpW;uw-~@9lJd50OBba*57YH$1#=%d&oaPLv?m+LPqYI%w@4KHcfp#`8<3qimc*7wI**vxRM8pSt2m z-;z&eb<^JE_x%$I59NDa(R=)5(Ai6Vb|SatnEVLcS=nSR5hfTGx&3B}L+H;ruDf2& z+9{J=dVWS@#D1fF;el+ALV0iH$C`(l?w_n8J|p{7)0x{^L5JOrE?D%TvoWOlruU>A zlVk>lA3+DDSPn3)<8-}zCtqXYk=H$+=4LXt@6@<(ErMa2hE1&D#5MEc&&=q$Q1g4$%!1d65_eX|?#D_Pvo&P*?H%>}$ zsnDDBQ0&mt9tjTa^Ldh+og$_QGApHqxp{E#{=2K|wWKA*hbwVv)o;)JFNDfM5`w~X zI%Ps`+x^RW!f}z~Mex75Z};W|guS(~3rO+^ypp)Ok&ji|g_FTrwDq*+`L)+Rh<0v1 z(q?7e_1R*v#ys==XQd9A7sVZ%nHaZc)!eMFFXwk|W7SWJ7g{Xa5qtK9ll{3>zg#|W z9+o&J(G$0F%M(Y{tbpcKOPXJ1&zZicbGPF6hs=Gq3_n`^YO~6Wv-EsACt;b%!J@U_ zLuPD~PRQcj7?8iRLgK;>*=50kY}+i3ZJcs92AIyzV8G8 zIXWpw>SlAZ1%tMAipb?3y1G#(9-IKB&^OoYKi^SEe;3|g3(PU9C9V-ADTyViR>?)F zK#IZ0z|c(B&`8(FAjHtv%EZ{p&`8_B(8|Cd^yus>C>nC}Q!>*kacfYSp_~EKAPKS| sI6tkVJh3R1p}f3YFEcN@I61K(RWH9NefB#WDWD<-Pgg&ebxsLQ07XK@o&W#< literal 0 HcmV?d00001 diff --git a/DSView/icons/repeat.png b/DSView/icons/repeat.png new file mode 100755 index 0000000000000000000000000000000000000000..d68d4edb1cd20170da31a2c2f3097fd0d026d33a GIT binary patch literal 1129 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I0wfs{c7_5;mUKs7M+SzC{oH>NS%G|oWRD45bDP46hOx7_4S6Fo+k-*%fF5lweBoc6VW5Sk<@TEcy*ZM|FBvyFff~Yx;Tbp+qU*apaai-KDum+O#djzI$#@`TU(Tuij1j_iA48dE5W>@9tO^yKxCBxpW99{$pJ6 zT*~;A`~JTEJsR?V1CKQveyX^BA%BBl)@jH4XB0GJIOi=jN`KX1rm?6atH|frm8UAI z-(F2htKPT%jpm6-0X~M$yM04Lw|wqV`8gqB=Mf)0qgtK|zQu{Z!t8t}KACgGX%XX# zV2`3^*PmJYGbbkOb;(coCE|8-x^H}XWa#80I#pd$7}5)SoI6&>tvwm^)%T;$eg2b@ zR~_fQ*t4o>ey!}~@=~u!%AO@JQ*M2cy&D#iFUvJ&y6CQ@s`Cn6zH?u4y|PFwH)!!p z2kW{2u4EYQ?>#G-v^`ev%Ek992eloq{qk(-Cn_R-RO9+t)Y3O_cV|9K_!$oJ{%R#v?0S6cU~c5#aJg7AMUE?#ZP zpR#VX^k;X`bsu-dMjA1m{&R7{>KXZK^kz1M{?mB&syE*yB4KtT*R2&>de22fuU)$D zV_c4L-qYCEDthu2NA5T=;-R6o-iZ|EYHhSIhdf}oj zDRUL&$ts!MdKKTS-xkG*E0k>s(Y>`&HuGKH^C@bXmTQf_NzY{7f8|-sRF!A19k1mq z-t_&&zHL^X&dTZCc_!5}R4=B8N}v6B<9u&^u%}bslBre?Z`zlh*s1sM z)s&0ze_WjmkAAsvvV3(@qjp?sbMT*{fARsRIT&iMh|JgRXgGX8!u_<9p68wi%CAqk z+c#%l5udLPO2AGn6aFzcgv*(C_ErERK(!v>gTe~DWM4f8`auy literal 0 HcmV?d00001 diff --git a/DSView/pv/dialogs/interval.cpp b/DSView/pv/dialogs/interval.cpp new file mode 100755 index 00000000..4425f8ef --- /dev/null +++ b/DSView/pv/dialogs/interval.cpp @@ -0,0 +1,75 @@ +/* + * This file is part of the DSView project. + * DSView is based on PulseView. + * + * Copyright (C) 2016 DreamSourceLab + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "interval.h" + +#include + +namespace pv { +namespace dialogs { + +Interval::Interval(SigSession &session, QWidget *parent) : + _session(session), + DSDialog(parent), + _button_box(QDialogButtonBox::Ok, + Qt::Horizontal, this) +{ + setMinimumWidth(300); + _interval_label = new QLabel(tr("Interval(s): "), this); + _interval_spinBox = new QSpinBox(this); + _interval_spinBox->setRange(1, 10); + _interval_spinBox->setButtonSymbols(QAbstractSpinBox::NoButtons); + _interval_slider = new QSlider(Qt::Horizontal, this); + _interval_slider->setRange(1, 10); + connect(_interval_slider, SIGNAL(valueChanged(int)), _interval_spinBox, SLOT(setValue(int))); + connect(_interval_spinBox, SIGNAL(valueChanged(int)), _interval_slider, SLOT(setValue(int))); + + _interval_slider->setValue(_session.get_repeat_intvl()); + + QGridLayout *glayout = new QGridLayout(this); + glayout->addWidget(_interval_label, 0, 0); + glayout->addWidget(_interval_spinBox, 0, 1); + glayout->addWidget(_interval_slider, 1, 0, 1, 3); + glayout->addWidget(&_button_box, 2, 2); + + layout()->addLayout(glayout); + setTitle(tr("Repetitive Interval")); + + connect(&_button_box, SIGNAL(accepted()), this, SLOT(accept())); +} + +void Interval::accept() +{ + using namespace Qt; + _session.set_repeat_intvl(_interval_slider->value()); + QDialog::accept(); +} + +void Interval::reject() +{ + using namespace Qt; + + QDialog::reject(); +} + + +} // namespace dialogs +} // namespace pv diff --git a/DSView/pv/dialogs/interval.h b/DSView/pv/dialogs/interval.h new file mode 100755 index 00000000..86e42ade --- /dev/null +++ b/DSView/pv/dialogs/interval.h @@ -0,0 +1,62 @@ +/* + * This file is part of the DSView project. + * DSView is based on PulseView. + * + * Copyright (C) 2016 DreamSourceLab + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + +#ifndef DSVIEW_PV_INTERVAL_H +#define DSVIEW_PV_INTERVAL_H + +#include +#include +#include +#include + +#include "../sigsession.h" +#include "../toolbars/titlebar.h" +#include "dsdialog.h" + +namespace pv { +namespace dialogs { + +class Interval : public DSDialog +{ + Q_OBJECT + +public: + Interval(SigSession &session, QWidget *parent); + +protected: + void accept(); + void reject(); + +private: + SigSession &_session; + + QLabel *_interval_label; + QSpinBox *_interval_spinBox; + QSlider *_interval_slider; + + QDialogButtonBox _button_box; +}; + +} // namespace dialogs +} // namespace pv + +#endif // DSVIEW_PV_INTERVAL_H From 83d77b03a5f293ad4a90be9235861d09bd028ad9 Mon Sep 17 00:00:00 2001 From: DreamSourceLab Date: Tue, 23 May 2017 22:39:00 +0800 Subject: [PATCH 3/4] warnings fix --- libsigrok4DSL/backend.c | 2 +- libsigrok4DSL/configure.ac | 6 ++ libsigrok4DSL/hardware/DSL/command.h | 2 +- libsigrok4DSL/hardware/DSL/dscope.c | 106 +++++++++++---------------- libsigrok4DSL/hardware/DSL/dsl.h | 5 +- libsigrok4DSL/hardware/DSL/dslogic.c | 64 ++++++++-------- libsigrok4DSL/hardware/demo/demo.c | 34 ++++----- libsigrok4DSL/hwdriver.c | 6 +- libsigrok4DSL/input/in_vcd.c | 4 +- libsigrok4DSL/libsigrok.h | 22 +++--- libsigrok4DSL/output/csv.c | 2 +- libsigrok4DSL/proto.h | 14 +++- libsigrok4DSL/session.c | 4 +- libsigrok4DSL/session_driver.c | 34 ++++++--- libsigrok4DSL/session_file.c | 6 +- libsigrok4DSL/trigger.c | 17 ++--- 16 files changed, 161 insertions(+), 167 deletions(-) diff --git a/libsigrok4DSL/backend.c b/libsigrok4DSL/backend.c index 8acddbc4..22750784 100644 --- a/libsigrok4DSL/backend.c +++ b/libsigrok4DSL/backend.c @@ -261,7 +261,7 @@ static int sanity_check_all_input_modules(void) static int sanity_check_all_output_modules(void) { int i, errors, ret = SR_OK; - struct sr_output_module **outputs; + const struct sr_output_module **outputs; const char *d; sr_spew("Sanity-checking all output modules."); diff --git a/libsigrok4DSL/configure.ac b/libsigrok4DSL/configure.ac index 44d958ea..1b00cca8 100644 --- a/libsigrok4DSL/configure.ac +++ b/libsigrok4DSL/configure.ac @@ -52,6 +52,12 @@ AC_PROG_CPP AC_PROG_INSTALL AC_PROG_LN_S +# https://github.com/rsyslog/rsyslog/issues/1179 +# Seems libtool doesn't honors ARFLAGS, but statically set AR_FLAGS=cru +# This causes a few warnings on build: +# "ar u modifier ignored since D is the default (see U)" +m4_divert_text([DEFAULTS], [: "${ARFLAGS=cr} ${AR_FLAGS=cr}"]) + # Required for per-target flags or subdir-objects with C sources. AM_PROG_CC_C_O diff --git a/libsigrok4DSL/hardware/DSL/command.h b/libsigrok4DSL/hardware/DSL/command.h index 36272c1c..071ef312 100644 --- a/libsigrok4DSL/hardware/DSL/command.h +++ b/libsigrok4DSL/hardware/DSL/command.h @@ -150,7 +150,7 @@ SR_PRIV int command_get_revid_version(libusb_device_handle *devhdl, uint8_t *revid); SR_PRIV int command_start_acquisition(libusb_device_handle *devhdl, uint64_t samplerate, gboolean samplewide, gboolean la_mode); -SR_PRIV int command_stop_acquistition(libusb_device_handle *devhdl); +SR_PRIV int command_stop_acquisition(libusb_device_handle *devhdl); SR_PRIV int command_fpga_config(libusb_device_handle *devhdl); SR_PRIV int command_fpga_setting(libusb_device_handle *devhdl, uint32_t setting_count); diff --git a/libsigrok4DSL/hardware/DSL/dscope.c b/libsigrok4DSL/hardware/DSL/dscope.c index a6fc2b57..a6998ae5 100644 --- a/libsigrok4DSL/hardware/DSL/dscope.c +++ b/libsigrok4DSL/hardware/DSL/dscope.c @@ -181,7 +181,7 @@ struct DSL_vga DSCope_vga[] = { {500, DSCOPE_DEFAULT_VGAIN5, DSCOPE_DEFAULT_VGAIN5, DSCOPE_DEFAULT_VOFF, DSCOPE_DEFAULT_VOFF}, {1000,DSCOPE_DEFAULT_VGAIN6, DSCOPE_DEFAULT_VGAIN6, DSCOPE_DEFAULT_VOFF, DSCOPE_DEFAULT_VOFF}, {2000,DSCOPE_DEFAULT_VGAIN7, DSCOPE_DEFAULT_VGAIN7, DSCOPE_DEFAULT_VOFF, DSCOPE_DEFAULT_VOFF}, - {0, 0, 0, 0}, + {0, 0, 0, 0, 0}, }; struct DSL_vga DSCope20_vga[] = { {10, DSCOPE20_DEFAULT_VGAIN0, DSCOPE20_DEFAULT_VGAIN0, DSCOPE20_DEFAULT_VOFF, CALI_VOFF_RANGE-DSCOPE20_DEFAULT_VOFF}, @@ -192,7 +192,7 @@ struct DSL_vga DSCope20_vga[] = { {500, DSCOPE20_DEFAULT_VGAIN5, DSCOPE20_DEFAULT_VGAIN5, DSCOPE20_DEFAULT_VOFF, CALI_VOFF_RANGE-DSCOPE20_DEFAULT_VOFF}, {1000,DSCOPE20_DEFAULT_VGAIN6, DSCOPE20_DEFAULT_VGAIN6, DSCOPE20_DEFAULT_VOFF, CALI_VOFF_RANGE-DSCOPE20_DEFAULT_VOFF}, {2000,DSCOPE20_DEFAULT_VGAIN7, DSCOPE20_DEFAULT_VGAIN7, DSCOPE20_DEFAULT_VOFF, CALI_VOFF_RANGE-DSCOPE20_DEFAULT_VOFF}, - {0, 0, 0, 0}, + {0, 0, 0, 0, 0}, }; /** @@ -466,7 +466,7 @@ static int fpga_setting(const struct sr_dev_inst *sdi) result = SR_OK; ret = libusb_bulk_transfer(hdl, 2 | LIBUSB_ENDPOINT_OUT, - &setting, sizeof(struct DSL_setting), + (unsigned char*)&setting, sizeof(struct DSL_setting), &transferred, 1000); if (ret < 0) { @@ -751,7 +751,7 @@ static int init(struct sr_context *sr_ctx) } -static struct DSL_vga* get_vga_ptr(struct sr_dev_inst *sdi) +static struct DSL_vga* get_vga_ptr(const struct sr_dev_inst *sdi) { struct DSL_vga *vga_ptr = NULL; if (strcmp(sdi->model, "DSCope") == 0) @@ -762,7 +762,7 @@ static struct DSL_vga* get_vga_ptr(struct sr_dev_inst *sdi) return vga_ptr; } -static uint16_t get_default_trans(struct sr_dev_inst *sdi) +static uint16_t get_default_trans(const struct sr_dev_inst *sdi) { uint16_t trans = 1; if (strcmp(sdi->model, "DSCope") == 0) @@ -773,21 +773,22 @@ static uint16_t get_default_trans(struct sr_dev_inst *sdi) return trans; } -static uint16_t get_default_voff(struct sr_dev_inst *sdi, int ch_index) +static uint16_t get_default_voff(const struct sr_dev_inst *sdi, int ch_index) { uint16_t voff = 0; - if (strcmp(sdi->model, "DSCope") == 0) + if (strcmp(sdi->model, "DSCope") == 0) { voff = DSCOPE_DEFAULT_VOFF; - else if (strcmp(sdi->model, "DSCope20") == 0) + } else if (strcmp(sdi->model, "DSCope20") == 0) { if (ch_index == 1) voff = CALI_VOFF_RANGE - DSCOPE20_DEFAULT_VOFF; else voff = DSCOPE20_DEFAULT_VOFF; + } return voff; } -static uint64_t get_default_vgain(struct sr_dev_inst *sdi, int num) +static uint64_t get_default_vgain(const struct sr_dev_inst *sdi, unsigned int num) { uint64_t vgain = 0; if (strcmp(sdi->model, "DSCope") == 0) { @@ -802,10 +803,10 @@ static uint64_t get_default_vgain(struct sr_dev_inst *sdi, int num) return vgain; } -static int probe_init(struct sr_dev_inst *sdi) +static void probe_init(struct sr_dev_inst *sdi) { int i; - GList *l; + GSList *l; for (l = sdi->channels; l; l = l->next) { struct sr_channel *probe = (struct sr_channel *)l->data; if (sdi->mode == DSO) { @@ -840,9 +841,7 @@ static int set_probes(struct sr_dev_inst *sdi, int num_probes) static int adjust_probes(struct sr_dev_inst *sdi, int num_probes) { uint16_t j; - GSList *l; struct sr_channel *probe; - GSList *p; assert(num_probes > 0); @@ -856,7 +855,7 @@ static int adjust_probes(struct sr_dev_inst *sdi, int num_probes) } while(j > num_probes) { - g_slist_delete_link(sdi->channels, g_slist_last(sdi->channels)); + sdi->channels = g_slist_delete_link(sdi->channels, g_slist_last(sdi->channels)); j--; } @@ -989,7 +988,7 @@ static GSList *dev_mode_list(const struct sr_dev_inst *sdi) { (void)sdi; GSList *l = NULL; - int i; + unsigned int i; for(i = 0; i < ARRAY_SIZE(mode_list); i++) { l = g_slist_append(l, &mode_list[i]); @@ -998,7 +997,7 @@ static GSList *dev_mode_list(const struct sr_dev_inst *sdi) return l; } -static uint64_t dso_vga(struct sr_dev_inst *sdi, struct sr_channel* ch) +static uint64_t dso_vga(const struct sr_dev_inst *sdi, const struct sr_channel* ch) { int i; struct DSL_vga *vga_ptr = get_vga_ptr(sdi); @@ -1010,7 +1009,7 @@ static uint64_t dso_vga(struct sr_dev_inst *sdi, struct sr_channel* ch) return 0; } -static uint64_t dso_voff(struct sr_dev_inst *sdi, struct sr_channel* ch) +static uint64_t dso_voff(const struct sr_dev_inst *sdi, const struct sr_channel* ch) { int i; struct DSL_vga *vga_ptr = get_vga_ptr(sdi); @@ -1021,7 +1020,7 @@ static uint64_t dso_voff(struct sr_dev_inst *sdi, struct sr_channel* ch) return 0; } -static uint64_t dso_vpos(struct sr_dev_inst *sdi, struct sr_channel* ch) +static uint64_t dso_vpos(const struct sr_dev_inst *sdi, const struct sr_channel* ch) { uint64_t vpos; int vpos_coarse, vpos_fine; @@ -1052,7 +1051,7 @@ static uint64_t dso_vpos(struct sr_dev_inst *sdi, struct sr_channel* ch) return 0; } -static uint64_t dso_cmd_gen(struct sr_dev_inst *sdi, struct sr_channel* ch, int id) +static uint64_t dso_cmd_gen(const struct sr_dev_inst *sdi, struct sr_channel* ch, int id) { struct DSL_context *devc; uint64_t cmd = 0; @@ -1208,7 +1207,7 @@ static int config_get(int id, GVariant **data, const struct sr_dev_inst *sdi, struct DSL_context *devc; struct sr_usb_dev_inst *usb; char str[128]; - int i; + unsigned int i; struct DSL_vga *vga_ptr; uint8_t tmp_u8; int ret; @@ -1471,7 +1470,7 @@ static int config_get(int id, GVariant **data, const struct sr_dev_inst *sdi, static int config_set(int id, GVariant *data, struct sr_dev_inst *sdi, struct sr_channel *ch, - const struct sr_channel_group *cg ) + struct sr_channel_group *cg ) { struct DSL_context *devc; const char *stropt; @@ -1531,7 +1530,7 @@ static int config_set(int id, GVariant *data, struct sr_dev_inst *sdi, sr_dbg("%s: Initial setting for DSO mode failed", __func__); devc->cur_samplerate = DSCOPE_MAX_SAMPLERATE / num_probes; devc->limit_samples = DSCOPE_MAX_DEPTH / num_probes; - } else if (sdi->mode == ANALOG){ + } else { num_probes = devc->profile->dev_caps & DEV_CAPS_16BIT ? MAX_ANALOG_PROBES_NUM : 1; } sr_dev_probes_free(sdi); @@ -1696,7 +1695,7 @@ static int config_set(int id, GVariant *data, struct sr_dev_inst *sdi, * because the samplelimits may changed */ devc->trigger_hpos = devc->trigger_hrate * en_ch_num(sdi) * devc->limit_samples / 200.0; - if ((ret = command_dso_ctrl(usb->devhdl, dso_cmd_gen(sdi, 1, SR_CONF_HORIZ_TRIGGERPOS))) == SR_OK) + if ((ret = command_dso_ctrl(usb->devhdl, dso_cmd_gen(sdi, NULL, SR_CONF_HORIZ_TRIGGERPOS))) == SR_OK) sr_dbg("%s: setting DSO Horiz Trigger Position to %d", __func__, devc->trigger_hpos); else @@ -1730,8 +1729,8 @@ static int config_set(int id, GVariant *data, struct sr_dev_inst *sdi, devc->zero_stage = -1; devc->zero_pcnt = 0; devc->zero_comb = -1; - GList *l; - int i; + GSList *l; + unsigned int i; struct DSL_vga *vga_ptr = get_vga_ptr(sdi); for(l = sdi->channels; l; l = l->next) { struct sr_channel *probe = (struct sr_channel *)l->data; @@ -1810,11 +1809,12 @@ static int config_set(int id, GVariant *data, struct sr_dev_inst *sdi, int i; struct DSL_vga *vga_ptr = get_vga_ptr(sdi); for (i = 0; vga_ptr && (vga_ptr+i)->key; i++) { - if ((vga_ptr+i)->key == ch->vdiv) + if ((vga_ptr+i)->key == ch->vdiv) { if (ch->index == 0) (vga_ptr+i)->vgain0 = vgain; else if (ch->index == 1) (vga_ptr+i)->vgain1 = vgain; + } } ret = command_dso_ctrl(usb->devhdl, dso_cmd_gen(sdi, ch, SR_CONF_VDIV)); if (ret == SR_OK) @@ -1840,11 +1840,12 @@ static int config_set(int id, GVariant *data, struct sr_dev_inst *sdi, int i; struct DSL_vga *vga_ptr = get_vga_ptr(sdi); for (i = 0; vga_ptr && (vga_ptr+i)->key; i++) { - if ((vga_ptr+i)->key == ch->vdiv) + if ((vga_ptr+i)->key == ch->vdiv) { if (ch->index == 0) (vga_ptr+i)->voff0 = voff; else if (ch->index == 1) (vga_ptr+i)->voff1 = voff; + } } ret = command_dso_ctrl(usb->devhdl, dso_cmd_gen(sdi, ch, SR_CONF_VPOS)); if (ret == SR_OK) @@ -1929,7 +1930,7 @@ static int config_list(int key, GVariant **data, const struct sr_dev_inst *sdi, static int dso_init(const struct sr_dev_inst *sdi) { - int ret, i; + int ret; GSList *l; struct sr_usb_dev_inst *usb = sdi->conn; @@ -1990,16 +1991,16 @@ static int dso_init(const struct sr_dev_inst *sdi) return ret; } -static int dso_zero(struct sr_dev_inst *sdi, struct sr_status mstatus) +static int dso_zero(const struct sr_dev_inst *sdi, struct sr_status mstatus) { struct DSL_context *devc = sdi->priv; struct sr_usb_dev_inst *usb = sdi->conn; GSList *l; - int ret, i; + int ret; static double vpos_back[2]; static uint64_t vdiv_back[2]; struct DSL_vga *vga_ptr = get_vga_ptr(sdi); - struct sr_channel *probe0, *probe1; + struct sr_channel *probe0 = NULL, *probe1 = NULL; for(l = sdi->channels; l; l = l->next) { struct sr_channel *probe = (struct sr_channel *)l->data; if (probe->index == 0) @@ -2152,7 +2153,6 @@ static int dev_open(struct sr_dev_inst *sdi) struct sr_usb_dev_inst *usb; struct DSL_context *devc; int ret; - int64_t timediff_us, timediff_ms; uint8_t hw_info; GSList *l; gboolean zeroed; @@ -2340,21 +2340,6 @@ static void resubmit_transfer(struct libusb_transfer *transfer) sr_err("%s: %s", __func__, libusb_error_name(ret)); } -static struct sr_config * new_config(int key, GVariant *data) -{ - struct sr_config *config; - - if (!(config = g_try_malloc0(sizeof(struct sr_config)))) { - sr_err("META config malloc failed."); - return NULL; - } - - config->key = key; - config->data = data; - - return config; -} - static void receive_transfer(struct libusb_transfer *transfer) { struct sr_datafeed_packet packet; @@ -2362,12 +2347,12 @@ static void receive_transfer(struct libusb_transfer *transfer) struct sr_datafeed_dso dso; struct sr_datafeed_analog analog; - const uint8_t *cur_buf = transfer->buffer; + uint8_t *cur_buf = transfer->buffer; struct DSL_context *devc = transfer->user_data; struct sr_dev_inst *sdi = devc->cb_data; const int sample_width = 2; int cur_sample_count = transfer->actual_length / sample_width; - int i; + unsigned int i; if (devc->data_lock) { resubmit_transfer(transfer); @@ -2455,7 +2440,7 @@ static void receive_transfer(struct libusb_transfer *transfer) analog.mq = SR_MQ_VOLTAGE; analog.unit = SR_UNIT_VOLT; analog.mqflags = SR_MQFLAG_AC; - analog.data = cur_buf; + analog.data = (float *)cur_buf; } if (devc->limit_samples) { @@ -2572,7 +2557,7 @@ static int dev_transfer_start(const struct sr_dev_inst *sdi) struct DSL_context *devc; struct sr_usb_dev_inst *usb; struct libusb_transfer *transfer; - unsigned int i, timeout, num_transfers; + unsigned int i, num_transfers; int ret; unsigned char *buf; size_t size; @@ -2581,10 +2566,6 @@ static int dev_transfer_start(const struct sr_dev_inst *sdi) devc = sdi->priv; usb = sdi->conn; -// timeout = get_timeout(devc); -// num_transfers = get_number_of_transfers(devc); -// size = get_buffer_size(devc); - timeout = 500; #ifndef _WIN32 num_transfers = 1; #else @@ -2640,7 +2621,6 @@ static int receive_data(int fd, int revents, const struct sr_dev_inst *sdi) struct drv_context *drvc; struct DSL_context *devc; struct sr_usb_dev_inst *usb; - int i; int ret; (void)fd; @@ -2720,8 +2700,10 @@ static void receive_trigger_pos(struct libusb_transfer *transfer) } } -static int dev_acquisition_start(const struct sr_dev_inst *sdi, void *cb_data) +static int dev_acquisition_start(struct sr_dev_inst *sdi, void *cb_data) { + (void)cb_data; + struct DSL_context *devc; struct drv_context *drvc; struct sr_usb_dev_inst *usb; @@ -2790,7 +2772,7 @@ static int dev_acquisition_start(const struct sr_dev_inst *sdi, void *cb_data) */ if (sdi->mode == DSO) { devc->trigger_hpos = devc->trigger_hrate * en_ch_num(sdi) * devc->limit_samples / 200.0; - if ((ret = command_dso_ctrl(usb->devhdl, dso_cmd_gen(sdi, 1, SR_CONF_HORIZ_TRIGGERPOS))) == SR_OK) + if ((ret = command_dso_ctrl(usb->devhdl, dso_cmd_gen(sdi, NULL, SR_CONF_HORIZ_TRIGGERPOS))) == SR_OK) sr_dbg("%s: setting DSO Horiz Trigger Position to %d", __func__, devc->trigger_hpos); else @@ -2810,7 +2792,7 @@ static int dev_acquisition_start(const struct sr_dev_inst *sdi, void *cb_data) } transfer = libusb_alloc_transfer(0); libusb_fill_bulk_transfer(transfer, usb->devhdl, - 6 | LIBUSB_ENDPOINT_IN, trigger_pos, sizeof(struct ds_trigger_pos), + 6 | LIBUSB_ENDPOINT_IN, (unsigned char*)trigger_pos, sizeof(struct ds_trigger_pos), receive_trigger_pos, devc, 0); if ((ret = libusb_submit_transfer(transfer)) != 0) { sr_err("%s: Failed to submit trigger_pos transfer: %s.", @@ -2853,15 +2835,13 @@ static int dev_acquisition_start(const struct sr_dev_inst *sdi, void *cb_data) return SR_OK; } -static int dev_acquisition_stop(struct sr_dev_inst *sdi, void *cb_data) +static int dev_acquisition_stop(const struct sr_dev_inst *sdi, void *cb_data) { (void)cb_data; - struct drv_context *drvc; struct DSL_context *devc; struct sr_usb_dev_inst *usb; - drvc = di->priv; devc = sdi->priv; usb = sdi->conn; @@ -2873,7 +2853,7 @@ static int dev_acquisition_stop(struct sr_dev_inst *sdi, void *cb_data) return SR_OK; } -static int dev_status_get(struct sr_dev_inst *sdi, struct sr_status *status, int begin, int end) +static int dev_status_get(const struct sr_dev_inst *sdi, struct sr_status *status, int begin, int end) { int ret = SR_ERR; if (sdi) { diff --git a/libsigrok4DSL/hardware/DSL/dsl.h b/libsigrok4DSL/hardware/DSL/dsl.h index 62d78ff5..85fce25c 100644 --- a/libsigrok4DSL/hardware/DSL/dsl.h +++ b/libsigrok4DSL/hardware/DSL/dsl.h @@ -236,7 +236,7 @@ static const struct DSL_profile supported_DSCope[] = { { 0, 0, 0, 0, 0, 0, 0, 0, 0 } }; -static const gboolean default_ms_en[DSO_MS_END - DSO_MS_BEGIN] = { +static const gboolean default_ms_en[] = { FALSE, /* DSO_MS_BEGIN */ TRUE, /* DSO_MS_FREQ */ FALSE, /* DSO_MS_PERD */ @@ -245,7 +245,6 @@ static const gboolean default_ms_en[DSO_MS_END - DSO_MS_BEGIN] = { FALSE, /* DSO_MS_VRMS */ FALSE, /* DSO_MS_VMEA */ FALSE, /* DSO_MS_VP2P */ - FALSE, /* DSO_MS_END */ }; enum { @@ -369,7 +368,7 @@ struct DSL_setting { }; struct DSL_vga { - int key; + uint64_t key; uint64_t vgain0; uint64_t vgain1; uint16_t voff0; diff --git a/libsigrok4DSL/hardware/DSL/dslogic.c b/libsigrok4DSL/hardware/DSL/dslogic.c index ec0956c3..8221f663 100644 --- a/libsigrok4DSL/hardware/DSL/dslogic.c +++ b/libsigrok4DSL/hardware/DSL/dslogic.c @@ -36,11 +36,11 @@ #undef max #define max(a,b) ((a)>(b)?(a):(b)) -static const int single_buffer_time = 20; -static const int total_buffer_time = 200; -static const int instant_buffer_size = 1024 * 1024; -static const int cons_buffer_size = 128; -static const int buffer_cnt = 4; +static const unsigned int single_buffer_time = 20; +static const unsigned int total_buffer_time = 200; +static const unsigned int instant_buffer_size = 1024 * 1024; +static const unsigned int cons_buffer_size = 128; +static const unsigned int buffer_cnt = 4; static struct sr_dev_mode mode_list[] = { {"LA", LOGIC}, @@ -568,7 +568,8 @@ static int fpga_setting(const struct sr_dev_inst *sdi) result = SR_OK; ret = libusb_bulk_transfer(hdl, 2 | LIBUSB_ENDPOINT_OUT, - &setting, sizeof(struct DSL_setting), + (unsigned char *)&setting, + sizeof(struct DSL_setting), &transferred, 1000); if (ret < 0) { @@ -851,10 +852,10 @@ static int init(struct sr_context *sr_ctx) return std_hw_init(sr_ctx, di, LOG_PREFIX); } -static int probe_init(struct sr_dev_inst *sdi) +static void probe_init(struct sr_dev_inst *sdi) { int i; - GList *l; + GSList *l; for (l = sdi->channels; l; l = l->next) { struct sr_channel *probe = (struct sr_channel *)l->data; if (sdi->mode == DSO) { @@ -902,7 +903,7 @@ static int adjust_probes(struct sr_dev_inst *sdi, int num_probes) } while(j > num_probes) { - g_slist_delete_link(sdi->channels, g_slist_last(sdi->channels)); + sdi->channels = g_slist_delete_link(sdi->channels, g_slist_last(sdi->channels)); j--; } @@ -1037,7 +1038,7 @@ static GSList *dev_list(void) static GSList *dev_mode_list(const struct sr_dev_inst *sdi) { GSList *l = NULL; - int i; + unsigned int i; if (strcmp(sdi->model, "DSLogic") == 0) { for(i = 0; i < ARRAY_SIZE(mode_list); i++) { @@ -1170,12 +1171,11 @@ static uint64_t dso_cmd_gen(const struct sr_dev_inst *sdi, struct sr_channel* ch return cmd; } -static int dso_init(const struct sr_dev_inst *sdi, gboolean from_eep) +static int dso_init(const struct sr_dev_inst *sdi) { - int ret, i; + int ret; GSList *l; struct sr_usb_dev_inst *usb = sdi->conn; - gboolean zeroed = FALSE; for(l = sdi->channels; l; l = l->next) { struct sr_channel *probe = (struct sr_channel *)l->data; @@ -1523,13 +1523,13 @@ static int config_get(int id, GVariant **data, const struct sr_dev_inst *sdi, static int config_set(int id, GVariant *data, struct sr_dev_inst *sdi, struct sr_channel *ch, - const struct sr_channel_group *cg ) + struct sr_channel_group *cg ) { struct DSL_context *devc; const char *stropt; int ret, num_probes; struct sr_usb_dev_inst *usb; - int i; + unsigned int i; struct drv_context *drvc; (void)cg; @@ -1585,7 +1585,7 @@ static int config_set(int id, GVariant *data, struct sr_dev_inst *sdi, devc->cur_samplerate = DSLOGIC_MAX_DSO_SAMPLERATE / num_probes; devc->limit_samples = DSLOGIC_MAX_DSO_DEPTH / num_probes; devc->samplerates_size = 15; - } else if (sdi->mode == ANALOG){ + } else { command_wr_reg(usb->devhdl, bmSCOPE_CLR, EEWP_ADDR); num_probes = devc->profile->dev_caps & DEV_CAPS_16BIT ? MAX_ANALOG_PROBES_NUM : 1; devc->op_mode = SR_OP_STREAM; @@ -1597,7 +1597,7 @@ static int config_set(int id, GVariant *data, struct sr_dev_inst *sdi, set_probes(sdi, num_probes); sr_dbg("%s: setting mode to %d", __func__, sdi->mode); if (sdi->mode == DSO) { - dso_init(sdi, 0); + dso_init(sdi); } } else if (id == SR_CONF_OPERATION_MODE) { stropt = g_variant_get_string(data, NULL); @@ -1870,7 +1870,7 @@ static int config_set(int id, GVariant *data, struct sr_dev_inst *sdi, * because the samplelimits may changed */ devc->trigger_hpos = devc->trigger_hrate * en_ch_num(sdi) * devc->limit_samples / 200.0; - if ((ret = command_dso_ctrl(usb->devhdl, dso_cmd_gen(sdi, 1, SR_CONF_HORIZ_TRIGGERPOS))) == SR_OK) + if ((ret = command_dso_ctrl(usb->devhdl, dso_cmd_gen(sdi, NULL, SR_CONF_HORIZ_TRIGGERPOS))) == SR_OK) sr_dbg("%s: setting DSO Horiz Trigger Position to %d", __func__, devc->trigger_hpos); else @@ -2005,9 +2005,7 @@ static int dev_open(struct sr_dev_inst *sdi) { struct sr_usb_dev_inst *usb; struct DSL_context *devc; - GSList *l; int ret; - int64_t timediff_us, timediff_ms; uint8_t hw_info; gboolean fpga_done; @@ -2101,12 +2099,10 @@ static int dev_open(struct sr_dev_inst *sdi) static int dev_close(struct sr_dev_inst *sdi) { struct sr_usb_dev_inst *usb; - struct DSL_context *devc; usb = sdi->conn; if (usb->devhdl == NULL) return SR_ERR; - devc = sdi->priv; sr_info("DSLogic: Closing device %d on %d.%d interface %d.", sdi->index, usb->bus, usb->address, USB_INTERFACE); @@ -2205,10 +2201,9 @@ static void receive_transfer(struct libusb_transfer *transfer) struct sr_datafeed_logic logic; struct sr_datafeed_dso dso; struct sr_datafeed_analog analog; - uint64_t cur_sample_count; - int i, j, k; + uint64_t cur_sample_count = 0; - const uint8_t *cur_buf = transfer->buffer; + uint8_t *cur_buf = transfer->buffer; struct DSL_context *devc = transfer->user_data; struct sr_dev_inst *sdi = devc->cb_data; const int sample_width = (devc->sample_wide) ? 2 : 1; @@ -2305,7 +2300,7 @@ static void receive_transfer(struct libusb_transfer *transfer) analog.mq = SR_MQ_VOLTAGE; analog.unit = SR_UNIT_VOLT; analog.mqflags = SR_MQFLAG_AC; - analog.data = cur_buf; + analog.data = (float *)cur_buf; } if ((devc->limit_samples && devc->num_bytes < devc->actual_bytes) || @@ -2392,7 +2387,6 @@ static int receive_data(int fd, int revents, const struct sr_dev_inst *sdi) struct drv_context *drvc; struct DSL_context *devc; struct sr_usb_dev_inst *usb; - unsigned int i; int ret; (void)fd; @@ -2432,7 +2426,6 @@ static void receive_trigger_pos(struct libusb_transfer *transfer) struct sr_datafeed_packet packet; struct ds_trigger_pos *trigger_pos; const struct sr_dev_inst *sdi; - int ret; uint64_t remain_cnt; packet.status = SR_PKT_OK; @@ -2485,7 +2478,7 @@ static int start_transfers(const struct sr_dev_inst *sdi) int ret; unsigned char *buf; size_t size; - int dso_buffer_size; + unsigned int dso_buffer_size; struct ds_trigger_pos *trigger_pos; devc = sdi->priv; @@ -2513,7 +2506,7 @@ static int start_transfers(const struct sr_dev_inst *sdi) } transfer = libusb_alloc_transfer(0); libusb_fill_bulk_transfer(transfer, usb->devhdl, - 6 | LIBUSB_ENDPOINT_IN, trigger_pos, sizeof(struct ds_trigger_pos), + 6 | LIBUSB_ENDPOINT_IN, (unsigned char *)trigger_pos, sizeof(struct ds_trigger_pos), receive_trigger_pos, devc, 0); if ((ret = libusb_submit_transfer(transfer)) != 0) { sr_err("%s: Failed to submit trigger_pos transfer: %s.", @@ -2555,12 +2548,13 @@ static int start_transfers(const struct sr_dev_inst *sdi) return SR_OK; } -static int dev_acquisition_start(const struct sr_dev_inst *sdi, void *cb_data) +static int dev_acquisition_start(struct sr_dev_inst *sdi, void *cb_data) { + (void)cb_data; + struct DSL_context *devc; struct drv_context *drvc; struct sr_usb_dev_inst *usb; - struct libusb_transfer *transfer; const struct libusb_pollfd **lupfd; unsigned int i; int ret; @@ -2618,7 +2612,7 @@ static int dev_acquisition_start(const struct sr_dev_inst *sdi, void *cb_data) */ if (sdi->mode == DSO) { devc->trigger_hpos = devc->trigger_hrate * en_ch_num(sdi) * devc->limit_samples / 200.0; - if ((ret = command_dso_ctrl(usb->devhdl, dso_cmd_gen(sdi, 1, SR_CONF_HORIZ_TRIGGERPOS))) == SR_OK) + if ((ret = command_dso_ctrl(usb->devhdl, dso_cmd_gen(sdi, NULL, SR_CONF_HORIZ_TRIGGERPOS))) == SR_OK) sr_dbg("%s: setting DSO Horiz Trigger Position to %d", __func__, devc->trigger_hpos); else @@ -2661,7 +2655,7 @@ static int dev_acquisition_start(const struct sr_dev_inst *sdi, void *cb_data) return SR_OK; } -static int dev_acquisition_stop(struct sr_dev_inst *sdi, void *cb_data) +static int dev_acquisition_stop(const struct sr_dev_inst *sdi, void *cb_data) { (void)cb_data; @@ -2679,7 +2673,7 @@ static int dev_acquisition_stop(struct sr_dev_inst *sdi, void *cb_data) return SR_OK; } -static int dev_status_get(struct sr_dev_inst *sdi, struct sr_status *status, int begin, int end) +static int dev_status_get(const struct sr_dev_inst *sdi, struct sr_status *status, int begin, int end) { int ret = SR_ERR; if (sdi) { diff --git a/libsigrok4DSL/hardware/demo/demo.c b/libsigrok4DSL/hardware/demo/demo.c index 0363fc0a..ea766c7b 100644 --- a/libsigrok4DSL/hardware/demo/demo.c +++ b/libsigrok4DSL/hardware/demo/demo.c @@ -287,7 +287,7 @@ static const char *probe_names[NUM_PROBES + 1] = { }; -static const gboolean default_ms_en[DSO_MS_END - DSO_MS_BEGIN] = { +static const gboolean default_ms_en[] = { FALSE, /* DSO_MS_BEGIN */ TRUE, /* DSO_MS_FREQ */ FALSE, /* DSO_MS_PERD */ @@ -296,7 +296,6 @@ static const gboolean default_ms_en[DSO_MS_END - DSO_MS_BEGIN] = { FALSE, /* DSO_MS_VRMS */ FALSE, /* DSO_MS_VMEA */ FALSE, /* DSO_MS_VP2P */ - FALSE, /* DSO_MS_END */ }; /* Private, per-device-instance driver context. */ @@ -308,7 +307,7 @@ static struct sr_dev_driver *di = &demo_driver_info; extern struct ds_trigger *trigger; -static int hw_dev_acquisition_stop(struct sr_dev_inst *sdi, void *cb_data); +static int hw_dev_acquisition_stop(const struct sr_dev_inst *sdi, void *cb_data); static int clear_instances(void) { @@ -400,7 +399,7 @@ static GSList *hw_dev_mode_list(const struct sr_dev_inst *sdi) { (void)sdi; GSList *l = NULL; - int i; + unsigned int i; for(i = 0; i < ARRAY_SIZE(mode_list); i++) { l = g_slist_append(l, &mode_list[i]); @@ -472,16 +471,15 @@ static int hw_cleanup(void) return ret; } -static int en_ch_num(const struct sr_dev_inst *sdi) +static unsigned int en_ch_num(const struct sr_dev_inst *sdi) { GSList *l; - int channel_en_cnt = 0; + unsigned int channel_en_cnt = 0; for (l = sdi->channels; l; l = l->next) { struct sr_channel *probe = (struct sr_channel *)l->data; channel_en_cnt += probe->enabled; } - channel_en_cnt += (channel_en_cnt == 0); return channel_en_cnt; } @@ -573,7 +571,7 @@ static int config_get(int id, GVariant **data, const struct sr_dev_inst *sdi, static int config_set(int id, GVariant *data, struct sr_dev_inst *sdi, struct sr_channel *ch, - const struct sr_channel_group *cg) + struct sr_channel_group *cg) { uint16_t i, j; int ret; @@ -822,16 +820,16 @@ static void samples_generator(uint16_t *buf, uint64_t size, const struct sr_dev_inst *sdi, struct dev_context *devc) { - uint64_t i, pre0_i, pre1_i, index; + uint64_t i, pre0_i, pre1_i; GSList *l; struct sr_channel *probe; int offset; - int start_rand; + unsigned int start_rand; const uint64_t span = DEMO_MAX_DSO_SAMPLERATE / devc->cur_samplerate; const uint64_t len = ARRAY_SIZE(sinx) - 1; - int *pre_buf; + const int *pre_buf; uint16_t tmp_u16 = 0; - int ch_num = en_ch_num(sdi); + unsigned int ch_num = en_ch_num(sdi) ? en_ch_num(sdi) : 1; switch (devc->sample_generator) { case PATTERN_SINE: /* Sine */ @@ -955,11 +953,11 @@ static int receive_data(int fd, int revents, const struct sr_dev_inst *sdi) struct sr_datafeed_dso dso; struct sr_datafeed_analog analog; double samples_elaspsed; - uint64_t samples_to_send = 0, expected_samplenum, sending_now; + uint64_t samples_to_send = 0, sending_now; int64_t time, elapsed; static uint16_t last_sample = 0; uint16_t cur_sample; - int i; + uint64_t i; (void)fd; (void)revents; @@ -1069,7 +1067,7 @@ static int receive_data(int fd, int revents, const struct sr_dev_inst *sdi) analog.mq = SR_MQ_VOLTAGE; analog.unit = SR_UNIT_VOLT; analog.mqflags = SR_MQFLAG_AC; - analog.data = devc->buf; + analog.data = (float *)devc->buf; } if (sdi->mode == DSO && !devc->instant) { @@ -1098,7 +1096,7 @@ static int receive_data(int fd, int revents, const struct sr_dev_inst *sdi) return TRUE; } -static int hw_dev_acquisition_start(const struct sr_dev_inst *sdi, +static int hw_dev_acquisition_start(struct sr_dev_inst *sdi, void *cb_data) { struct dev_context *const devc = sdi->priv; @@ -1159,7 +1157,7 @@ static int hw_dev_acquisition_start(const struct sr_dev_inst *sdi, return SR_OK; } -static int hw_dev_acquisition_stop(struct sr_dev_inst *sdi, void *cb_data) +static int hw_dev_acquisition_stop(const struct sr_dev_inst *sdi, void *cb_data) { (void)cb_data; @@ -1184,7 +1182,7 @@ static int hw_dev_acquisition_stop(struct sr_dev_inst *sdi, void *cb_data) return SR_OK; } -static int hw_dev_status_get(struct sr_dev_inst *sdi, struct sr_status *status, int begin, int end) +static int hw_dev_status_get(const struct sr_dev_inst *sdi, struct sr_status *status, int begin, int end) { (void)begin; (void)end; diff --git a/libsigrok4DSL/hwdriver.c b/libsigrok4DSL/hwdriver.c index 58ffe720..be319b5f 100644 --- a/libsigrok4DSL/hwdriver.c +++ b/libsigrok4DSL/hwdriver.c @@ -326,9 +326,9 @@ SR_API int sr_config_get(const struct sr_dev_driver *driver, * but this is not to be flagged as an error by the caller; merely * as an indication that it's not applicable. */ -SR_API int sr_config_set(const struct sr_dev_inst *sdi, - const struct sr_channel *ch, - const struct sr_channel_group *cg, +SR_API int sr_config_set(struct sr_dev_inst *sdi, + struct sr_channel *ch, + struct sr_channel_group *cg, int key, GVariant *data) { int ret; diff --git a/libsigrok4DSL/input/in_vcd.c b/libsigrok4DSL/input/in_vcd.c index 3bd4f9c6..c69c55bf 100644 --- a/libsigrok4DSL/input/in_vcd.c +++ b/libsigrok4DSL/input/in_vcd.c @@ -299,7 +299,7 @@ static int format_match(const char *filename) gchar *name = NULL, *contents = NULL; gboolean status; - file = g_fopen(filename, "r"); + file = fopen(filename, "r"); if (file == NULL) return FALSE; @@ -565,7 +565,7 @@ static int loadfile(struct sr_input *in, const char *filename) ctx = in->internal; packet.status = SR_PKT_OK; - if ((file = g_fopen(filename, "r")) == NULL) + if ((file = fopen(filename, "r")) == NULL) return SR_ERR; if (!parse_header(file, ctx)) diff --git a/libsigrok4DSL/libsigrok.h b/libsigrok4DSL/libsigrok.h index e8e516d4..79afa461 100644 --- a/libsigrok4DSL/libsigrok.h +++ b/libsigrok4DSL/libsigrok.h @@ -156,8 +156,6 @@ enum { #define SR_PRIV #endif -typedef int (*sr_receive_data_callback_t)(int fd, int revents, const struct sr_dev_inst *sdi); - /** Data types used by sr_config_info(). */ enum { SR_T_UINT64 = 10000, @@ -456,13 +454,13 @@ struct sr_output { * A pointer to this output format's 'struct sr_output_format'. * The frontend can use this to call the module's callbacks. */ - struct sr_output_module *module; + const struct sr_output_module *module; /** * The device for which this output module is creating output. This * can be used by the module to find out probe names and numbers. */ - struct sr_dev_inst *sdi; + const struct sr_dev_inst *sdi; /** * An optional parameter which the frontend can pass in to the @@ -665,7 +663,7 @@ struct sr_status { uint64_t ch1_period; uint32_t ch1_pcnt; - uint32_t vlen; + int vlen; gboolean stream_mode; uint32_t sample_divider; gboolean sample_divider_tog; @@ -1084,9 +1082,9 @@ struct sr_dev_driver { const struct sr_channel *ch, const struct sr_channel_group *cg); int (*config_set) (int id, GVariant *data, - const struct sr_dev_inst *sdi, - const struct sr_channel *ch, - const struct sr_channel_group *cg); + struct sr_dev_inst *sdi, + struct sr_channel *ch, + struct sr_channel_group *cg); int (*config_list) (int info_id, GVariant **data, const struct sr_dev_inst *sdi, const struct sr_channel_group *cg); @@ -1094,12 +1092,12 @@ struct sr_dev_driver { /* Device-specific */ int (*dev_open) (struct sr_dev_inst *sdi); int (*dev_close) (struct sr_dev_inst *sdi); - int (*dev_status_get) (struct sr_dev_inst *sdi, + int (*dev_status_get) (const struct sr_dev_inst *sdi, struct sr_status *status, int begin, int end); - int (*dev_acquisition_start) (const struct sr_dev_inst *sdi, + int (*dev_acquisition_start) (struct sr_dev_inst *sdi, void *cb_data); - int (*dev_acquisition_stop) (struct sr_dev_inst *sdi, + int (*dev_acquisition_stop) (const struct sr_dev_inst *sdi, void *cb_data); /* Dynamic */ @@ -1177,6 +1175,8 @@ struct ds_trigger_pos { unsigned char first_block[488]; }; +typedef int (*sr_receive_data_callback_t)(int fd, int revents, const struct sr_dev_inst *sdi); + #include "proto.h" #include "version.h" diff --git a/libsigrok4DSL/output/csv.c b/libsigrok4DSL/output/csv.c index 3617b61f..9befc92f 100644 --- a/libsigrok4DSL/output/csv.c +++ b/libsigrok4DSL/output/csv.c @@ -236,7 +236,7 @@ static int receive(const struct sr_output *o, const struct sr_datafeed_packet *p *out = g_string_sized_new(512); } - for (i = 0; i < dso->num_samples; i++) { + for (i = 0; i < (uint64_t)dso->num_samples; i++) { for (j = 0; j < ctx->num_enabled_channels; j++) { idx = ctx->channel_index[j]; p = dso->data + i * ctx->num_enabled_channels + idx * ((ctx->num_enabled_channels > 1) ? 1 : 0); diff --git a/libsigrok4DSL/proto.h b/libsigrok4DSL/proto.h index b91bb9c3..547f7742 100644 --- a/libsigrok4DSL/proto.h +++ b/libsigrok4DSL/proto.h @@ -69,9 +69,9 @@ SR_API int sr_config_get(const struct sr_dev_driver *driver, const struct sr_channel *ch, const struct sr_channel_group *cg, int key, GVariant **data); -SR_API int sr_config_set(const struct sr_dev_inst *sdi, - const struct sr_channel *ch, - const struct sr_channel_group *cg, +SR_API int sr_config_set(struct sr_dev_inst *sdi, + struct sr_channel *ch, + struct sr_channel_group *cg, int key, GVariant *data); SR_API int sr_config_list(const struct sr_dev_driver *driver, const struct sr_dev_inst *sdi, @@ -91,7 +91,7 @@ SR_API int sr_session_load(const char *filename); SR_API struct sr_session *sr_session_new(void); SR_API int sr_session_destroy(void); SR_API int sr_session_dev_remove_all(void); -SR_API int sr_session_dev_add(const struct sr_dev_inst *sdi); +SR_API int sr_session_dev_add(struct sr_dev_inst *sdi); SR_API int sr_session_dev_list(GSList **devlist); /* Datafeed setup */ @@ -174,4 +174,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); #endif diff --git a/libsigrok4DSL/session.c b/libsigrok4DSL/session.c index 750f1894..83baa4c3 100644 --- a/libsigrok4DSL/session.c +++ b/libsigrok4DSL/session.c @@ -51,7 +51,7 @@ struct source { int timeout; sr_receive_data_callback_t cb; - void *cb_data; + const void *cb_data; /* This is used to keep track of the object (fd, pollfd or channel) which is * being polled and will be used to match the source when removing it again. @@ -187,7 +187,7 @@ SR_API int sr_session_dev_remove_all(void) * * @return SR_OK upon success, SR_ERR_ARG upon invalid arguments. */ -SR_API int sr_session_dev_add(const struct sr_dev_inst *sdi) +SR_API int sr_session_dev_add(struct sr_dev_inst *sdi) { int ret; diff --git a/libsigrok4DSL/session_driver.c b/libsigrok4DSL/session_driver.c index 6ddff054..1288ad12 100644 --- a/libsigrok4DSL/session_driver.c +++ b/libsigrok4DSL/session_driver.c @@ -24,6 +24,7 @@ #include #include #include +#include #include "libsigrok.h" #include "libsigrok-internal.h" @@ -91,7 +92,7 @@ static int trans_data(struct sr_dev_inst *sdi) { // translate for old format struct session_vdev *vdev = sdi->priv; - GList *l; + GSList *l; struct sr_channel *probe; assert(vdev->buf != NULL); @@ -124,7 +125,7 @@ static int trans_data(struct sr_dev_inst *sdi) static int receive_data(int fd, int revents, const struct sr_dev_inst *cb_sdi) { struct sr_dev_inst *sdi; - struct session_vdev *vdev; + struct session_vdev *vdev = NULL; struct sr_datafeed_packet packet; struct sr_datafeed_logic logic; struct sr_datafeed_dso dso; @@ -132,7 +133,7 @@ static int receive_data(int fd, int revents, const struct sr_dev_inst *cb_sdi) GSList *l; int ret; char file_name[32]; - struct sr_channel *probe; + struct sr_channel *probe = NULL; GSList *pl; int channel; @@ -242,7 +243,8 @@ static int receive_data(int fd, int revents, const struct sr_dev_inst *cb_sdi) } } - if (vdev->cur_channel >= vdev->num_probes || + if (!vdev || + vdev->cur_channel >= vdev->num_probes || revents == -1) { packet.type = SR_DF_END; sr_session_send(cb_sdi, &packet); @@ -320,6 +322,8 @@ static int config_get(int id, GVariant **data, const struct sr_dev_inst *sdi, const struct sr_channel *ch, const struct sr_channel_group *cg) { + (void)cg; + struct session_vdev *vdev; switch (id) { @@ -443,13 +447,15 @@ static int config_get(int id, GVariant **data, const struct sr_dev_inst *sdi, return SR_OK; } -static int config_set(int id, GVariant *data, const struct sr_dev_inst *sdi, +static int config_set(int id, GVariant *data, struct sr_dev_inst *sdi, struct sr_channel *ch, - const struct sr_channel_group *cg) + struct sr_channel_group *cg) { + (void)cg; + struct session_vdev *vdev; const char *stropt; - int i; + unsigned int i; vdev = sdi->priv; @@ -565,8 +571,12 @@ static int config_set(int id, GVariant *data, const struct sr_dev_inst *sdi, return SR_OK; } -static int config_list(int key, GVariant **data, const struct sr_dev_inst *sdi) +static int config_list(int key, GVariant **data, + const struct sr_dev_inst *sdi, + const struct sr_channel_group *cg) { + (void)cg; + GVariant *gvar; GVariantBuilder gvb; @@ -611,7 +621,7 @@ static int config_list(int key, GVariant **data, const struct sr_dev_inst *sdi) return SR_OK; } -static int dev_status_get(struct sr_dev_inst *sdi, struct sr_status *status, int begin, int end) +static int dev_status_get(const struct sr_dev_inst *sdi, struct sr_status *status, int begin, int end) { (void)begin; (void)end; @@ -627,14 +637,16 @@ static int dev_status_get(struct sr_dev_inst *sdi, struct sr_status *status, int } } -static int dev_acquisition_start(const struct sr_dev_inst *sdi, +static int dev_acquisition_start(struct sr_dev_inst *sdi, void *cb_data) { + (void)cb_data; + struct zip_stat zs; struct session_vdev *vdev; struct sr_datafeed_packet packet; int ret; - GList *l; + GSList *l; struct sr_channel *probe; vdev = sdi->priv; diff --git a/libsigrok4DSL/session_file.c b/libsigrok4DSL/session_file.c index 886170dc..5b03ddba 100644 --- a/libsigrok4DSL/session_file.c +++ b/libsigrok4DSL/session_file.c @@ -121,12 +121,12 @@ SR_API int sr_session_load(const char *filename) struct zip_stat zs; struct sr_dev_inst *sdi; struct sr_channel *probe; - int ret, devcnt, i, j, k; + int ret, devcnt, i, j; uint16_t probenum; uint64_t tmp_u64, total_probes, enabled_probes; uint16_t p; int64_t tmp_64; - char **sections, **keys, *metafile, *val, s[11]; + char **sections, **keys, *metafile, *val; char probename[SR_MAX_PROBENAME_LEN + 1]; int mode = LOGIC; int channel_type = SR_CHANNEL_LOGIC; @@ -239,7 +239,7 @@ SR_API int sr_session_load(const char *filename) channel_type = (mode == DSO) ? SR_CHANNEL_DSO : (mode == ANALOG) ? SR_CHANNEL_ANALOG : SR_CHANNEL_LOGIC; for (p = 0; p < total_probes; p++) { - snprintf(probename, SR_MAX_PROBENAME_LEN, "%" PRIu64, p); + snprintf(probename, SR_MAX_PROBENAME_LEN, "%u", p); if (!(probe = sr_channel_new(p, channel_type, FALSE, probename))) return SR_ERR; diff --git a/libsigrok4DSL/trigger.c b/libsigrok4DSL/trigger.c index 0f572640..f9d80956 100644 --- a/libsigrok4DSL/trigger.c +++ b/libsigrok4DSL/trigger.c @@ -177,7 +177,6 @@ SR_API int ds_trigger_set_stage(uint16_t stages) SR_API int ds_trigger_set_pos(uint16_t position) { assert(position <= 100); - assert(position >= 0); trigger->trigger_pos = position; @@ -245,7 +244,7 @@ SR_PRIV uint64_t ds_trigger_get_mask0(uint16_t stage) for (i = TriggerProbes - 1; i >= 0 ; i--) { mask = (mask << 1); - mask += (trigger->trigger0[stage][i] == 'X' | trigger->trigger0[stage][i] == 'C'); + mask += (trigger->trigger0[stage][i] == 'X' || trigger->trigger0[stage][i] == 'C'); } return mask; @@ -259,7 +258,7 @@ SR_PRIV uint64_t ds_trigger_get_mask1(uint16_t stage) for (i = TriggerProbes - 1; i >= 0 ; i--) { mask = (mask << 1); - mask += (trigger->trigger1[stage][i] == 'X' | trigger->trigger1[stage][i] == 'C'); + mask += ((trigger->trigger1[stage][i] == 'X') | (trigger->trigger1[stage][i] == 'C')); } return mask; @@ -273,7 +272,7 @@ SR_PRIV uint64_t ds_trigger_get_value0(uint16_t stage) for (i = TriggerProbes - 1; i >= 0 ; i--) { value = (value << 1); - value += (trigger->trigger0[stage][i] == '1' | trigger->trigger0[stage][i] == 'R'); + value += ((trigger->trigger0[stage][i] == '1') | (trigger->trigger0[stage][i] == 'R')); } return value; @@ -287,7 +286,7 @@ SR_PRIV uint64_t ds_trigger_get_value1(uint16_t stage) for (i = TriggerProbes - 1; i >= 0 ; i--) { value = (value << 1); - value += (trigger->trigger1[stage][i] == '1' | trigger->trigger1[stage][i] == 'R'); + value += ((trigger->trigger1[stage][i] == '1') | (trigger->trigger1[stage][i] == 'R')); } return value; @@ -301,8 +300,8 @@ SR_PRIV uint64_t ds_trigger_get_edge0(uint16_t stage) for (i = TriggerProbes - 1; i >= 0 ; i--) { edge = (edge << 1); - edge += (trigger->trigger0[stage][i] == 'R' | trigger->trigger0[stage][i] == 'F' | - trigger->trigger0[stage][i] == 'C'); + edge += ((trigger->trigger0[stage][i] == 'R') | (trigger->trigger0[stage][i] == 'F') | + (trigger->trigger0[stage][i] == 'C')); } return edge; @@ -316,8 +315,8 @@ SR_PRIV uint64_t ds_trigger_get_edge1(uint16_t stage) for (i = TriggerProbes - 1; i >= 0 ; i--) { edge = (edge << 1); - edge += (trigger->trigger1[stage][i] == 'R' | trigger->trigger1[stage][i] == 'F' | - trigger->trigger1[stage][i] == 'C'); + edge += ((trigger->trigger1[stage][i] == 'R') | (trigger->trigger1[stage][i] == 'F') | + (trigger->trigger1[stage][i] == 'C')); } return edge; From 886b847c21c606df3138ce7ad8f8e8c363ee758b Mon Sep 17 00:00:00 2001 From: DreamSourceLab Date: Thu, 25 May 2017 20:23:52 +0800 Subject: [PATCH 4/4] Warnings fix --- .gitignore | 1 + DSView/CMakeLists.txt | 11 +- DSView/DSView.desktop | 9 + DSView/main.cpp | 2 +- DSView/pv/data/analogsnapshot.cpp | 2 +- DSView/pv/data/decode/annotation.cpp | 2 +- DSView/pv/data/decode/decoder.cpp | 2 +- DSView/pv/data/decode/row.cpp | 2 +- DSView/pv/data/decodermodel.cpp | 2 +- DSView/pv/data/decoderstack.cpp | 12 - DSView/pv/data/decoderstack.h | 4 +- DSView/pv/data/logicsnapshot.cpp | 35 +- DSView/pv/data/mathstack.cpp | 9 +- DSView/pv/data/mathstack.h | 2 +- DSView/pv/device/devinst.cpp | 2 +- DSView/pv/device/devinst.h | 2 +- DSView/pv/device/file.cpp | 6 +- DSView/pv/device/inputfile.cpp | 1 + DSView/pv/dialogs/fftoptions.cpp | 2 +- DSView/pv/dialogs/interval.cpp | 2 +- DSView/pv/dock/measuredock.cpp | 7 +- DSView/pv/dock/protocoldock.cpp | 2 +- DSView/pv/dock/protocoldock.h | 2 +- DSView/pv/mainframe.cpp | 1 - DSView/pv/mainwindow.cpp | 4 +- DSView/pv/prop/binding/binding.cpp | 4 +- DSView/pv/prop/binding/binding.h | 2 +- DSView/pv/prop/binding/decoderoptions.cpp | 2 +- ...ng_deviceoptions.cpp => deviceoptions.cpp} | 2 +- DSView/pv/prop/binding/deviceoptions.h | 2 +- DSView/pv/sigsession.cpp | 5 +- DSView/pv/storesession.cpp | 32 +- DSView/pv/storesession.h | 2 +- DSView/pv/toolbars/samplingbar.cpp | 2 +- DSView/pv/view/decodetrace.cpp | 4 +- DSView/pv/view/dsldial.cpp | 2 +- DSView/pv/view/dsldial.h | 2 +- DSView/pv/view/dsosignal.cpp | 19 +- DSView/pv/view/logicsignal.cpp | 4 +- DSView/pv/view/mathtrace.cpp | 2 +- DSView/pv/view/mathtrace.h | 2 +- DSView/pv/view/ruler.cpp | 2 +- DSView/pv/view/ruler.h | 2 +- DSView/pv/view/view.cpp | 12 +- DSView/pv/view/viewport.cpp | 1 - DSView/pv/widgets/decodergroupbox.cpp | 2 +- DSView/pv/widgets/decodermenu.cpp | 2 +- DSView/pv/widgets/viewstatus.cpp | 4 +- DSView/res/DSCope.bin | Bin 341160 -> 341436 bytes DSView/res/DSCope.fw | Bin 8120 -> 8120 bytes DSView/res/DSCope1.def.dsc | 0 DSView/res/DSCope20.bin | Bin 341160 -> 341436 bytes DSView/res/DSCope20.fw | Bin 8120 -> 8120 bytes DSView/res/DSCopeTest.dsc | 43 +++ DSView/res/DSLogic.fw | Bin 8120 -> 8120 bytes DSView/res/DSLogic0.def.dsc | 2 +- DSView/res/DSLogic1.def.dsc | 0 DSView/res/DSLogic2.def.dsc | 0 DSView/res/DSLogic33.bin | Bin 340884 -> 341160 bytes DSView/res/DSLogic50.bin | Bin 340884 -> 341160 bytes DSView/res/DSLogicBasic.bin | Bin 0 -> 341160 bytes DSView/res/DSLogicBasic.fw | Bin 0 -> 8120 bytes DSView/res/DSLogicPlus.bin | Bin 0 -> 341160 bytes DSView/res/DSLogicPlus.fw | Bin 0 -> 8120 bytes DSView/res/DSLogicPro.bin | Bin 340884 -> 341436 bytes DSView/res/DSLogicPro.fw | Bin 8120 -> 8120 bytes DSView/res/license.txt | 20 ++ libsigrok4DSL/session_driver.c | 5 +- libsigrokdecode4DSL/Makefile.am | 12 +- libsigrokdecode4DSL/configure.ac | 8 +- libsigrokdecode4DSL/decoder.c | 39 +- libsigrokdecode4DSL/decoders/0-spi/.pd.py.swo | Bin 16384 -> 0 bytes libsigrokdecode4DSL/decoders/0-spi/.pd.py.swp | Bin 24576 -> 0 bytes .../decoders/0-uart/.pd.py.swo | Bin 32768 -> 0 bytes .../decoders/0-uart/.pd.py.swp | Bin 40960 -> 0 bytes libsigrokdecode4DSL/decoders/1-i2c/.pd.py.swo | Bin 28672 -> 0 bytes libsigrokdecode4DSL/decoders/1-i2c/.pd.py.swp | Bin 36864 -> 0 bytes libsigrokdecode4DSL/decoders/1-i2c/pd.py | 6 +- libsigrokdecode4DSL/decoders/1-spi/.pd.py.swn | Bin 24576 -> 0 bytes libsigrokdecode4DSL/decoders/1-spi/.pd.py.swo | Bin 16384 -> 0 bytes libsigrokdecode4DSL/decoders/1-spi/.pd.py.swp | Bin 24576 -> 0 bytes libsigrokdecode4DSL/decoders/1-spi/pd.py | 12 +- .../decoders/1-uart/.pd.py.swo | Bin 32768 -> 0 bytes .../decoders/1-uart/.pd.py.swp | Bin 40960 -> 0 bytes libsigrokdecode4DSL/decoders/1-uart/pd.py | 4 +- libsigrokdecode4DSL/decoders/jtag/pd.py | 128 ++++--- libsigrokdecode4DSL/decoders/lpc/pd.py | 175 +++++---- .../decoders/onewire_link/pd.py.back | 289 --------------- libsigrokdecode4DSL/decoders/spi/__init__.py | 32 -- libsigrokdecode4DSL/decoders/spi/pd.py | 334 ------------------ libsigrokdecode4DSL/exception.c | 2 +- libsigrokdecode4DSL/instance.c | 1 + .../libsigrokdecode-internal.h | 2 +- libsigrokdecode4DSL/libsigrokdecode.h | 2 +- libsigrokdecode4DSL/libsigrokdecode.pc.in | 18 - libsigrokdecode4DSL/srd.c | 2 +- libsigrokdecode4DSL/util.c | 8 +- 97 files changed, 444 insertions(+), 939 deletions(-) create mode 100644 DSView/DSView.desktop rename DSView/pv/prop/binding/{binding_deviceoptions.cpp => deviceoptions.cpp} (99%) mode change 100755 => 100644 DSView/res/DSCope.bin mode change 100755 => 100644 DSView/res/DSCope.fw mode change 100755 => 100644 DSView/res/DSCope1.def.dsc mode change 100755 => 100644 DSView/res/DSCope20.bin mode change 100755 => 100644 DSView/res/DSCope20.fw create mode 100644 DSView/res/DSCopeTest.dsc mode change 100755 => 100644 DSView/res/DSLogic.fw mode change 100755 => 100644 DSView/res/DSLogic0.def.dsc mode change 100755 => 100644 DSView/res/DSLogic1.def.dsc mode change 100755 => 100644 DSView/res/DSLogic2.def.dsc mode change 100755 => 100644 DSView/res/DSLogic33.bin mode change 100755 => 100644 DSView/res/DSLogic50.bin create mode 100644 DSView/res/DSLogicBasic.bin create mode 100644 DSView/res/DSLogicBasic.fw create mode 100644 DSView/res/DSLogicPlus.bin create mode 100644 DSView/res/DSLogicPlus.fw mode change 100755 => 100644 DSView/res/DSLogicPro.bin mode change 100755 => 100644 DSView/res/DSLogicPro.fw create mode 100644 DSView/res/license.txt delete mode 100755 libsigrokdecode4DSL/decoders/0-spi/.pd.py.swo delete mode 100755 libsigrokdecode4DSL/decoders/0-spi/.pd.py.swp delete mode 100755 libsigrokdecode4DSL/decoders/0-uart/.pd.py.swo delete mode 100755 libsigrokdecode4DSL/decoders/0-uart/.pd.py.swp delete mode 100755 libsigrokdecode4DSL/decoders/1-i2c/.pd.py.swo delete mode 100755 libsigrokdecode4DSL/decoders/1-i2c/.pd.py.swp delete mode 100755 libsigrokdecode4DSL/decoders/1-spi/.pd.py.swn delete mode 100755 libsigrokdecode4DSL/decoders/1-spi/.pd.py.swo delete mode 100755 libsigrokdecode4DSL/decoders/1-spi/.pd.py.swp delete mode 100755 libsigrokdecode4DSL/decoders/1-uart/.pd.py.swo delete mode 100755 libsigrokdecode4DSL/decoders/1-uart/.pd.py.swp delete mode 100755 libsigrokdecode4DSL/decoders/onewire_link/pd.py.back delete mode 100755 libsigrokdecode4DSL/decoders/spi/__init__.py delete mode 100755 libsigrokdecode4DSL/decoders/spi/pd.py delete mode 100644 libsigrokdecode4DSL/libsigrokdecode.pc.in diff --git a/.gitignore b/.gitignore index 2b0f916e..c889fc34 100644 --- a/.gitignore +++ b/.gitignore @@ -36,6 +36,7 @@ DSView/ui_*.h DSView/DSView DSView/install_manifest.txt DSView/qrc_DSView.cpp +DSView/qrc_style.cpp moc_*.cpp moc_*.cpp_parameters diff --git a/DSView/CMakeLists.txt b/DSView/CMakeLists.txt index 701c9e9a..a52c36c8 100644 --- a/DSView/CMakeLists.txt +++ b/DSView/CMakeLists.txt @@ -34,7 +34,7 @@ project(DSView) option(DISABLE_WERROR "Build without -Werror" TRUE) option(ENABLE_SIGNALS "Build with UNIX signals" TRUE) -option(ENABLE_DECODE "Build with libsigrokdecode" TRUE) +option(ENABLE_DECODE "Build with libsigrokdecode4DSL" TRUE) option(ENABLE_COTIRE "Enable cotire" FALSE) option(ENABLE_TESTS "Enable unit tests" FALSE) option(STATIC_PKGDEPS_LIBS "Statically link to (pkg-config) libraries" FALSE) @@ -65,7 +65,7 @@ list(APPEND PKGDEPS "libzip >= 0.10" ) if(ENABLE_DECODE) - list(APPEND PKGDEPS "libsigrokdecode>=0.3.0") + list(APPEND PKGDEPS "libsigrokdecode4DSL>=0.4.0") endif() find_package(PkgConfig) @@ -148,7 +148,7 @@ set(DSView_SOURCES pv/view/header.cpp pv/view/cursor.cpp pv/view/analogsignal.cpp - pv/prop/binding/binding_deviceoptions.cpp + pv/prop/binding/deviceoptions.cpp pv/toolbars/trigbar.cpp pv/toolbars/filebar.cpp pv/dock/protocoldock.cpp @@ -267,10 +267,10 @@ set(DSView_FORMS ) set(DSView_RESOURCES - DSView.qrc + DSView.qrc + darkstyle/style.qrc ) - if(ENABLE_DECODE) list(APPEND DSView_SOURCES pv/dock/protocoldock.cpp @@ -399,7 +399,6 @@ set_target_properties(${PROJECT_NAME} PROPERTIES INSTALL_RPATH "/usr/local/lib") # Install the executable. install(TARGETS ${PROJECT_NAME} DESTINATION bin/) install(DIRECTORY res DESTINATION share/${PROJECT_NAME}) -install(DIRECTORY ../libsigrokdecode4DSL/decoders DESTINATION share/${PROJECT_NAME}) install(FILES icons/logo.png DESTINATION share/${PROJECT_NAME} RENAME logo.png) install(FILES DreamSourceLab.rules DESTINATION /etc/udev/rules.d/) install(FILES DSView.desktop DESTINATION /usr/share/applications/) diff --git a/DSView/DSView.desktop b/DSView/DSView.desktop new file mode 100644 index 00000000..fba3202a --- /dev/null +++ b/DSView/DSView.desktop @@ -0,0 +1,9 @@ +[Desktop Entry] +Version=0.96 +Exec=/usr/local/bin/DSView +Name=DSView +Comment=GUI Program for DreamSourceLab USB-based Instruments +Icon=/usr/local/share/DSView/logo.png +Type=Application +Terminal=false +Categories=Development diff --git a/DSView/main.cpp b/DSView/main.cpp index f78fc4e7..ba9f38d0 100644 --- a/DSView/main.cpp +++ b/DSView/main.cpp @@ -22,7 +22,7 @@ #ifdef ENABLE_DECODE -#include /* First, so we avoid a _POSIX_C_SOURCE warning. */ +#include /* First, so we avoid a _POSIX_C_SOURCE warning. */ #endif #include diff --git a/DSView/pv/data/analogsnapshot.cpp b/DSView/pv/data/analogsnapshot.cpp index 8dbb8ed7..cfc22080 100644 --- a/DSView/pv/data/analogsnapshot.cpp +++ b/DSView/pv/data/analogsnapshot.cpp @@ -338,7 +338,7 @@ void AnalogSnapshot::append_payload_to_envelope_levels() int AnalogSnapshot::get_ch_order(int sig_index) { - int order = 0; + uint16_t order = 0; for (auto& iter:_ch_index) { if (iter == sig_index) break; diff --git a/DSView/pv/data/decode/annotation.cpp b/DSView/pv/data/decode/annotation.cpp index f2d30df5..3581817d 100644 --- a/DSView/pv/data/decode/annotation.cpp +++ b/DSView/pv/data/decode/annotation.cpp @@ -20,7 +20,7 @@ */ extern "C" { -#include +#include } #include diff --git a/DSView/pv/data/decode/decoder.cpp b/DSView/pv/data/decode/decoder.cpp index 00175959..1c8d2a9d 100644 --- a/DSView/pv/data/decode/decoder.cpp +++ b/DSView/pv/data/decode/decoder.cpp @@ -20,7 +20,7 @@ */ #include -#include +#include #include "decoder.h" diff --git a/DSView/pv/data/decode/row.cpp b/DSView/pv/data/decode/row.cpp index 46fb337f..fd798eb7 100644 --- a/DSView/pv/data/decode/row.cpp +++ b/DSView/pv/data/decode/row.cpp @@ -20,7 +20,7 @@ #include "row.h" -#include +#include namespace pv { namespace data { diff --git a/DSView/pv/data/decodermodel.cpp b/DSView/pv/data/decodermodel.cpp index 078111a4..614f67ff 100644 --- a/DSView/pv/data/decodermodel.cpp +++ b/DSView/pv/data/decodermodel.cpp @@ -18,7 +18,7 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ -#include +#include #include #include diff --git a/DSView/pv/data/decoderstack.cpp b/DSView/pv/data/decoderstack.cpp index 8a95f0e8..2ad6a532 100644 --- a/DSView/pv/data/decoderstack.cpp +++ b/DSView/pv/data/decoderstack.cpp @@ -457,18 +457,6 @@ uint64_t DecoderStack::get_max_sample_count() const return max_sample_count; } -boost::optional DecoderStack::wait_for_data() const -{ - //unique_lock input_lock(_input_mutex); - while(!boost::this_thread::interruption_requested() && - !_frame_complete && (uint64_t)_samples_decoded >= _sample_count) - //_input_cond.wait(input_lock); - return boost::make_optional( - !boost::this_thread::interruption_requested() && - ((uint64_t)_samples_decoded < _sample_count || !_frame_complete), - _sample_count); -} - void DecoderStack::decode_data( const uint64_t decode_start, const uint64_t decode_end, srd_session *const session) diff --git a/DSView/pv/data/decoderstack.h b/DSView/pv/data/decoderstack.h index 7cd0bedf..c7baf7cc 100644 --- a/DSView/pv/data/decoderstack.h +++ b/DSView/pv/data/decoderstack.h @@ -21,7 +21,7 @@ #ifndef DSVIEW_PV_DATA_DECODERSTACK_H #define DSVIEW_PV_DATA_DECODERSTACK_H -#include +#include #include @@ -145,8 +145,6 @@ public: int64_t get_mark_index() const; private: - boost::optional wait_for_data() const; - void decode_data(const uint64_t decode_start, const uint64_t decode_end, srd_session *const session); void decode_proc(); diff --git a/DSView/pv/data/logicsnapshot.cpp b/DSView/pv/data/logicsnapshot.cpp index 8201e6ea..199f47bc 100644 --- a/DSView/pv/data/logicsnapshot.cpp +++ b/DSView/pv/data/logicsnapshot.cpp @@ -165,7 +165,7 @@ void LogicSnapshot::first_payload(const sr_datafeed_logic &logic, uint64_t total sr_channel *const probe = (sr_channel*)l->data; if (probe->type == SR_CHANNEL_LOGIC && probe->enabled) { std::vector root_vector; - for (int j = 0; j < rootnode_size; j++) { + for (uint64_t j = 0; j < rootnode_size; j++) { struct RootNode rn; rn.tog = 0; rn.value = 0; @@ -250,11 +250,16 @@ void LogicSnapshot::append_cross_payload( // bit align while (((_ch_fraction != 0) || (_byte_fraction != 0)) && (len != 0)) { + uint8_t *dp_tmp = (uint8_t *)_dest_ptr; + uint8_t *sp_tmp = (uint8_t *)_src_ptr; do { - *(uint8_t *)_dest_ptr++ = *(uint8_t *)_src_ptr++; + //*(uint8_t *)_dest_ptr++ = *(uint8_t *)_src_ptr++; + *dp_tmp++ = *sp_tmp++; _byte_fraction = (_byte_fraction + 1) % ScaleSize; len--; } while ((_byte_fraction != 0) && (len != 0)); + _dest_ptr = dp_tmp; + _src_ptr = sp_tmp; if (_byte_fraction == 0) { const uint64_t index0 = _ring_sample_count / RootNodeSamples; const uint64_t index1 = (_ring_sample_count >> LeafBlockPower) % RootScale; @@ -283,7 +288,7 @@ void LogicSnapshot::append_cross_payload( uint64_t pre_index0 = _ring_sample_count / RootNodeSamples; uint64_t pre_index1 = (_ring_sample_count >> LeafBlockPower) % RootScale; uint64_t pre_offset = (_ring_sample_count % LeafBlockSamples) / Scale; - uint64_t *src_ptr; + uint64_t *src_ptr = NULL; uint64_t *dest_ptr; int order = 0; const uint64_t align_size = len / ScaleSize / _channel_num; @@ -345,15 +350,20 @@ void LogicSnapshot::append_cross_payload( uint64_t offset = (_ring_sample_count % LeafBlockSamples) / 8; _dest_ptr = (uint8_t *)_ch_data[_ch_fraction][index0].lbp[index1] + offset; + uint8_t *dp_tmp = (uint8_t *)_dest_ptr; + uint8_t *sp_tmp = (uint8_t *)_src_ptr; while(len-- != 0) { - *(uint8_t *)_dest_ptr++ = *(uint8_t *)_src_ptr++; + //*(uint8_t *)_dest_ptr++ = *(uint8_t *)_src_ptr++; + *dp_tmp++ = *sp_tmp++; if (++_byte_fraction == ScaleSize) { _ch_fraction = (_ch_fraction + 1) % _channel_num; _byte_fraction = 0; - _dest_ptr = (uint8_t *)_ch_data[_ch_fraction][index0].lbp[index1] + offset; + //_dest_ptr = (uint8_t *)_ch_data[_ch_fraction][index0].lbp[index1] + offset; + dp_tmp = (uint8_t *)_ch_data[_ch_fraction][index0].lbp[index1] + offset; } } - _dest_ptr = (uint8_t *)_dest_ptr + _byte_fraction; + //_dest_ptr = (uint8_t *)_dest_ptr + _byte_fraction; + _dest_ptr = dp_tmp + _byte_fraction; } } @@ -363,7 +373,7 @@ void LogicSnapshot::append_split_payload( assert(logic.format == LA_SPLIT_DATA); uint64_t samples = logic.length * 8; - int order = logic.order; + uint16_t order = logic.order; assert(order < _ch_data.size()); if (_sample_cnt[order] >= _total_sample_count) @@ -459,9 +469,7 @@ const uint8_t *LogicSnapshot::get_samples(uint64_t start_sample, uint64_t &end_s int sig_index) { //assert(data); - assert(start_sample >= 0); assert(start_sample < get_sample_count()); - assert(end_sample >= 0); assert(end_sample < get_sample_count()); assert(start_sample <= end_sample); @@ -530,9 +538,9 @@ bool LogicSnapshot::get_display_edges(std::vector > &edges bool has_edge = get_nxt_edge(index, last_sample, end, 0, sig_index); // calc the edge position - int gap = (index / min_length) - pixels_offset; + int64_t gap = (index / min_length) - pixels_offset; index = max((uint64_t)ceil((floor(index/min_length) + 1) * min_length), index + 1); - while(gap > edges.size() && edges.size() < width) + while(gap > (int64_t)edges.size() && edges.size() < width) edges.push_back(pair(false, last_sample)); if (index > end) @@ -576,7 +584,7 @@ bool LogicSnapshot::get_nxt_edge( bool edge_hit = false; // linear search for the next transition on the root level - for (int64_t i = root_index; !edge_hit && (index <= end) && i < _ch_data[order].size(); i++) { + for (int64_t i = root_index; !edge_hit && (index <= end) && i < (int64_t)_ch_data[order].size(); i++) { uint64_t cur_mask = (~0ULL << root_pos); do { uint64_t cur_tog = _ch_data[order][i].tog & cur_mask; @@ -739,7 +747,6 @@ bool LogicSnapshot::block_pre_edge(uint64_t *lbp, uint64_t &index, bool last_sam unsigned int level = min_level; bool fast_forward = true; - bool within_block = true; const uint64_t last = last_sample ? ~0ULL : 0; uint64_t block_start = index & ~LeafMask; @@ -1067,7 +1074,7 @@ uint8_t *LogicSnapshot::get_block_buf(int block_index, int sig_index, bool &samp int LogicSnapshot::get_ch_order(int sig_index) { - int order = 0; + uint16_t order = 0; for (auto& iter:_ch_index) { if (iter == sig_index) break; diff --git a/DSView/pv/data/mathstack.cpp b/DSView/pv/data/mathstack.cpp index 2faa9bae..9f76cb8a 100644 --- a/DSView/pv/data/mathstack.cpp +++ b/DSView/pv/data/mathstack.cpp @@ -157,12 +157,13 @@ const std::vector MathStack::get_fft_spectrum() const return empty; } -const double MathStack::get_fft_spectrum(uint64_t index) const +double MathStack::get_fft_spectrum(uint64_t index) { + double ret = -1; if (_math_state == Stopped && index < _power_spectrum.size()) - return _power_spectrum[index]; - else - return -1; + ret = _power_spectrum[index]; + + return ret; } void MathStack::calc_fft() diff --git a/DSView/pv/data/mathstack.h b/DSView/pv/data/mathstack.h index d9e32423..88c5fca3 100644 --- a/DSView/pv/data/mathstack.h +++ b/DSView/pv/data/mathstack.h @@ -86,7 +86,7 @@ public: void set_sample_interval(int interval); const std::vector get_fft_spectrum() const; - const double get_fft_spectrum(uint64_t index) const; + double get_fft_spectrum(uint64_t index); void calc_fft(); diff --git a/DSView/pv/device/devinst.cpp b/DSView/pv/device/devinst.cpp index 1874c847..652c548e 100644 --- a/DSView/pv/device/devinst.cpp +++ b/DSView/pv/device/devinst.cpp @@ -83,7 +83,7 @@ GVariant* DevInst::get_config(const sr_channel *ch, const sr_channel_group *grou return data; } -bool DevInst::set_config(const sr_channel *ch, const sr_channel_group *group, int key, GVariant *data) +bool DevInst::set_config(sr_channel *ch, sr_channel_group *group, int key, GVariant *data) { assert(_owner); sr_dev_inst *const sdi = dev_inst(); diff --git a/DSView/pv/device/devinst.h b/DSView/pv/device/devinst.h index 7f29687c..b45f515e 100644 --- a/DSView/pv/device/devinst.h +++ b/DSView/pv/device/devinst.h @@ -63,7 +63,7 @@ public: GVariant* get_config(const sr_channel *ch, const sr_channel_group *group, int key); - bool set_config(const sr_channel *ch, const sr_channel_group *group, int key, GVariant *data); + bool set_config(sr_channel *ch, sr_channel_group *group, int key, GVariant *data); GVariant* list_config(const sr_channel_group *group, int key); diff --git a/DSView/pv/device/file.cpp b/DSView/pv/device/file.cpp index c10fa10d..d0de5e0c 100644 --- a/DSView/pv/device/file.cpp +++ b/DSView/pv/device/file.cpp @@ -78,10 +78,12 @@ QJsonArray File::get_decoders() QJsonArray dec_array; QJsonParseError error; - if (archive = zip_open(_path.toLocal8Bit().data(), 0, &ret)) { + archive = zip_open(_path.toLocal8Bit().data(), 0, &ret); + if (archive) { /* read "decoders" */ if (zip_stat(archive, "decoders", 0, &zs) != -1) { - if (dec_file = (char *)g_try_malloc(zs.size)) { + dec_file = (char *)g_try_malloc(zs.size); + if (dec_file) { zf = zip_fopen_index(archive, zs.index, 0); zip_fread(zf, dec_file, zs.size); zip_fclose(zf); diff --git a/DSView/pv/device/inputfile.cpp b/DSView/pv/device/inputfile.cpp index 3b7e29bf..69de8f80 100644 --- a/DSView/pv/device/inputfile.cpp +++ b/DSView/pv/device/inputfile.cpp @@ -48,6 +48,7 @@ sr_dev_inst* InputFile::dev_inst() const void InputFile::use(SigSession *owner) throw(QString) { + (void)owner; assert(!_input); // only *.dsl file is valid diff --git a/DSView/pv/dialogs/fftoptions.cpp b/DSView/pv/dialogs/fftoptions.cpp index d1df974f..6c928a0f 100644 --- a/DSView/pv/dialogs/fftoptions.cpp +++ b/DSView/pv/dialogs/fftoptions.cpp @@ -224,7 +224,7 @@ void FftOptions::accept() mathTrace->get_math_stack()->set_sample_num(_len_combobox->currentData().toULongLong()); mathTrace->get_math_stack()->set_sample_interval(_interval_combobox->currentData().toInt()); mathTrace->get_math_stack()->set_windows_index(_window_combobox->currentData().toInt()); - mathTrace->set_view_mode(_view_combobox->currentData().toInt()); + mathTrace->set_view_mode(_view_combobox->currentData().toUInt()); //mathTrace->init_zoom(); mathTrace->set_dbv_range(_dbv_combobox->currentData().toInt()); mathTrace->set_enable(_en_checkbox->isChecked()); diff --git a/DSView/pv/dialogs/interval.cpp b/DSView/pv/dialogs/interval.cpp index 4425f8ef..e2ff752b 100755 --- a/DSView/pv/dialogs/interval.cpp +++ b/DSView/pv/dialogs/interval.cpp @@ -27,8 +27,8 @@ namespace pv { namespace dialogs { Interval::Interval(SigSession &session, QWidget *parent) : - _session(session), DSDialog(parent), + _session(session), _button_box(QDialogButtonBox::Ok, Qt::Horizontal, this) { diff --git a/DSView/pv/dock/measuredock.cpp b/DSView/pv/dock/measuredock.cpp index e211631e..fb116eea 100644 --- a/DSView/pv/dock/measuredock.cpp +++ b/DSView/pv/dock/measuredock.cpp @@ -445,7 +445,7 @@ void MeasureDock::show_all_coursor() cursor_dlg.setWindowFlags(Qt::FramelessWindowHint | Qt::Popup | Qt::WindowSystemMenuHint | Qt::WindowMinimizeButtonHint | Qt::WindowMaximizeButtonHint); int index = 0; - QHBoxLayout *hlayout; + QHBoxLayout *hlayout = NULL; QVBoxLayout *vlayout = new QVBoxLayout(&cursor_dlg); for(std::list::iterator i = _view.get_cursorList().begin(); i != _view.get_cursorList().end(); i++) { @@ -634,7 +634,7 @@ void MeasureDock::update_probe_selector(QComboBox *selector) void MeasureDock::del_cursor() { int del_index = 0; - Cursor* cursor; + Cursor* cursor = NULL; for (QVector ::const_iterator i = _cursor_del_btn_vec.begin(); i != _cursor_del_btn_vec.end(); i++) { if ((*i)->isChecked()) { @@ -648,7 +648,8 @@ void MeasureDock::del_cursor() del_index++; } - _view.del_cursor(cursor); + if (cursor) + _view.del_cursor(cursor); if (_view.get_cursorList().empty()) _view.show_cursors(false); diff --git a/DSView/pv/dock/protocoldock.cpp b/DSView/pv/dock/protocoldock.cpp index 0057c3e3..8311c5a5 100644 --- a/DSView/pv/dock/protocoldock.cpp +++ b/DSView/pv/dock/protocoldock.cpp @@ -615,7 +615,7 @@ void ProtocolDock::export_table_view() void ProtocolDock::nav_table_view() { - uint64_t row_index; + uint64_t row_index = 0; pv::data::DecoderModel *decoder_model = _session.get_decoder_model(); boost::shared_ptr decoder_stack = decoder_model->getDecoderStack(); if (decoder_stack) { diff --git a/DSView/pv/dock/protocoldock.h b/DSView/pv/dock/protocoldock.h index 1ccbbe34..ec56170d 100644 --- a/DSView/pv/dock/protocoldock.h +++ b/DSView/pv/dock/protocoldock.h @@ -23,7 +23,7 @@ #ifndef DSVIEW_PV_PROTOCOLDOCK_H #define DSVIEW_PV_PROTOCOLDOCK_H -#include +#include #include #include diff --git a/DSView/pv/mainframe.cpp b/DSView/pv/mainframe.cpp index d5b44270..1c612b66 100644 --- a/DSView/pv/mainframe.cpp +++ b/DSView/pv/mainframe.cpp @@ -120,7 +120,6 @@ MainFrame::MainFrame(DeviceManager &device_manager, _layout->addWidget(_bottom_right, 2, 2); connect(&_timer, SIGNAL(timeout()), this, SLOT(unfreezing())); - connect(_mainWindow, SIGNAL(prgRate(int)), this, SLOT(setTaskbarProgress(int))); //readSettings(); } diff --git a/DSView/pv/mainwindow.cpp b/DSView/pv/mainwindow.cpp index eac60cb2..7a6f0bf2 100644 --- a/DSView/pv/mainwindow.cpp +++ b/DSView/pv/mainwindow.cpp @@ -22,7 +22,7 @@ #ifdef ENABLE_DECODE -#include +#include #include "dock/protocoldock.h" #endif @@ -819,6 +819,8 @@ bool MainWindow::load_session(QString name) ss.load_decoders(_protocol_widget, sessionObj["decoder"].toArray()); } #endif + + return true; } bool MainWindow::store_session(QString name) diff --git a/DSView/pv/prop/binding/binding.cpp b/DSView/pv/prop/binding/binding.cpp index 5faa1af2..d778fd5f 100644 --- a/DSView/pv/prop/binding/binding.cpp +++ b/DSView/pv/prop/binding/binding.cpp @@ -80,7 +80,7 @@ QWidget* Binding::get_property_form(QWidget *parent, } std::map< boost::shared_ptr, - GVariant* >& Binding::get_property_value() const + GVariant* > Binding::get_property_value() const { std::map < boost::shared_ptr, GVariant* > pvalue; @@ -89,6 +89,8 @@ std::map< boost::shared_ptr, assert(p); pvalue[p] = p->get_value(); } + + return pvalue; } QString Binding::print_gvariant(GVariant *const gvar) diff --git a/DSView/pv/prop/binding/binding.h b/DSView/pv/prop/binding/binding.h index 653af2b4..8b413e05 100644 --- a/DSView/pv/prop/binding/binding.h +++ b/DSView/pv/prop/binding/binding.h @@ -56,7 +56,7 @@ public: bool auto_commit = false) const; std::map< boost::shared_ptr, - GVariant* >& get_property_value() const; + GVariant* > get_property_value() const; static QString print_gvariant(GVariant *const gvar); diff --git a/DSView/pv/prop/binding/decoderoptions.cpp b/DSView/pv/prop/binding/decoderoptions.cpp index c9005bb4..66870403 100644 --- a/DSView/pv/prop/binding/decoderoptions.cpp +++ b/DSView/pv/prop/binding/decoderoptions.cpp @@ -18,7 +18,7 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ -#include +#include #include "decoderoptions.h" diff --git a/DSView/pv/prop/binding/binding_deviceoptions.cpp b/DSView/pv/prop/binding/deviceoptions.cpp similarity index 99% rename from DSView/pv/prop/binding/binding_deviceoptions.cpp rename to DSView/pv/prop/binding/deviceoptions.cpp index 7b254c17..9e7e2585 100644 --- a/DSView/pv/prop/binding/binding_deviceoptions.cpp +++ b/DSView/pv/prop/binding/deviceoptions.cpp @@ -142,7 +142,7 @@ GVariant* DeviceOptions::config_getter( } void DeviceOptions::config_setter( - const struct sr_dev_inst *sdi, int key, GVariant* value) + struct sr_dev_inst *sdi, int key, GVariant* value) { if (sr_config_set(sdi, NULL, NULL, key, value) != SR_OK) qDebug() << "WARNING: Failed to set value of sample rate"; diff --git a/DSView/pv/prop/binding/deviceoptions.h b/DSView/pv/prop/binding/deviceoptions.h index f9f8d42b..709baf05 100644 --- a/DSView/pv/prop/binding/deviceoptions.h +++ b/DSView/pv/prop/binding/deviceoptions.h @@ -47,7 +47,7 @@ private: static GVariant* config_getter( const struct sr_dev_inst *sdi, int key); static void config_setter( - const struct sr_dev_inst *sdi, int key, GVariant* value); + struct sr_dev_inst *sdi, int key, GVariant* value); void bind_bool(const QString &name, int key); void bind_enum(const QString &name, int key, diff --git a/DSView/pv/sigsession.cpp b/DSView/pv/sigsession.cpp index 8ddde595..067bb72f 100644 --- a/DSView/pv/sigsession.cpp +++ b/DSView/pv/sigsession.cpp @@ -21,7 +21,7 @@ */ #ifdef ENABLE_DECODE -#include +#include #endif #include "sigsession.h" @@ -861,7 +861,8 @@ void SigSession::feed_in_trigger(const ds_trigger_pos &trigger_pos) { _hw_replied = true; if (_dev_inst->dev_inst()->mode != DSO) { - if (_trigger_flag = (trigger_pos.status & 0x01)) { + _trigger_flag = (trigger_pos.status & 0x01); + if (_trigger_flag) { _trigger_pos = trigger_pos.real_pos; receive_trigger(_trigger_pos); } diff --git a/DSView/pv/storesession.cpp b/DSView/pv/storesession.cpp index 432b30c2..4f79f1bd 100644 --- a/DSView/pv/storesession.cpp +++ b/DSView/pv/storesession.cpp @@ -219,15 +219,17 @@ void StoreSession::save_proc(shared_ptr snapshot) } } } else { - int ch_type; + int ch_type = -1; BOOST_FOREACH(const boost::shared_ptr s, _session.get_signals()) { ch_type = s->get_type(); break; } - uint64_t size = snapshot->get_sample_count() * snapshot->get_channel_num(); - uint8_t *buf = (uint8_t *)snapshot->get_data(); - sr_session_append(_file_name.toLocal8Bit().data(), buf, size, - 0, 0, ch_type, 1); + if (ch_type != -1) { + uint64_t size = snapshot->get_sample_count() * snapshot->get_channel_num(); + uint8_t *buf = (uint8_t *)snapshot->get_data(); + sr_session_append(_file_name.toLocal8Bit().data(), buf, size, + 0, 0, ch_type, 1); + } } progress_updated(); @@ -276,7 +278,7 @@ QString StoreSession::meta_gen(boost::shared_ptr snapshot) /* metadata */ fprintf(meta, "capturefile = data\n"); - fprintf(meta, "total samples = %llu\n", snapshot->get_sample_count()); + fprintf(meta, "total samples = %" PRIu64 "\n", snapshot->get_sample_count()); if (sdi->mode == DSO) fprintf(meta, "total probes = %d\n", g_slist_length(sdi->channels)); @@ -300,7 +302,7 @@ QString StoreSession::meta_gen(boost::shared_ptr snapshot) gvar = _session.get_device()->get_config(NULL, NULL, SR_CONF_TIMEBASE); if (gvar != NULL) { uint64_t tmp_u64 = g_variant_get_uint64(gvar); - fprintf(meta, "hDiv = %llu\n", tmp_u64); + fprintf(meta, "hDiv = %" PRIu64 "\n", tmp_u64); g_variant_unref(gvar); } gvar = _session.get_device()->get_config(NULL, NULL, SR_CONF_DSO_BITS); @@ -312,7 +314,7 @@ QString StoreSession::meta_gen(boost::shared_ptr snapshot) } else if (sdi->mode == LOGIC) { fprintf(meta, "trigger time = %lld\n", _session.get_trigger_time().toMSecsSinceEpoch()); } - fprintf(meta, "trigger pos = %llu\n", _session.get_trigger_pos()); + fprintf(meta, "trigger pos = %" PRIu64 "\n", _session.get_trigger_pos()); probecnt = 1; for (l = sdi->channels; l; l = l->next) { @@ -325,19 +327,19 @@ QString StoreSession::meta_gen(boost::shared_ptr snapshot) if (sdi->mode == DSO) { fprintf(meta, " enable%d = %d\n", probe->index, probe->enabled); fprintf(meta, " coupling%d = %d\n", probe->index, probe->coupling); - fprintf(meta, " vDiv%d = %d\n", probe->index, probe->vdiv); + fprintf(meta, " vDiv%d = %" PRIu64 "\n", probe->index, probe->vdiv); fprintf(meta, " vFactor%d = %d\n", probe->index, probe->vfactor); fprintf(meta, " vPos%d = %lf\n", probe->index, probe->vpos); fprintf(meta, " vTrig%d = %d\n", probe->index, probe->trig_value); if (sr_status_get(sdi, &status, 0, 0) == SR_OK) { if (probe->index == 0) { - fprintf(meta, " period%d = %llu\n", probe->index, status.ch0_period); - fprintf(meta, " pcnt%d = %lu\n", probe->index, status.ch0_pcnt); + fprintf(meta, " period%d = %" PRIu64 "\n", probe->index, status.ch0_period); + fprintf(meta, " pcnt%d = %" PRIu32 "\n", probe->index, status.ch0_pcnt); fprintf(meta, " max%d = %d\n", probe->index, status.ch0_max); fprintf(meta, " min%d = %d\n", probe->index, status.ch0_min); } else { - fprintf(meta, " period%d = %llu\n", probe->index, status.ch1_period); - fprintf(meta, " pcnt%d = %lu\n", probe->index, status.ch1_pcnt); + fprintf(meta, " period%d = %" PRIu64 "\n", probe->index, status.ch1_period); + fprintf(meta, " pcnt%d = %" PRIu32 "\n", probe->index, status.ch1_pcnt); fprintf(meta, " max%d = %d\n", probe->index, status.ch1_max); fprintf(meta, " min%d = %d\n", probe->index, status.ch1_min); } @@ -531,7 +533,7 @@ void StoreSession::export_proc(shared_ptr snapshot) progress_updated(); } } - } else if (channel_type = SR_CHANNEL_DSO) { + } else if (channel_type == SR_CHANNEL_DSO) { _unit_count = snapshot->get_sample_count(); unsigned char* datat = (unsigned char*)snapshot->get_data(); GString *data_out; @@ -844,7 +846,7 @@ void StoreSession::load_decoders(dock::ProtocolDock *widget, QJsonArray dec_arra double StoreSession::get_double(GVariant *var) { - double val; + double val = 0; const GVariantType *const type = g_variant_get_type(var); assert(type); diff --git a/DSView/pv/storesession.h b/DSView/pv/storesession.h index 8e432cf2..04911dd6 100644 --- a/DSView/pv/storesession.h +++ b/DSView/pv/storesession.h @@ -30,7 +30,7 @@ #include #include -#include +#include namespace pv { diff --git a/DSView/pv/toolbars/samplingbar.cpp b/DSView/pv/toolbars/samplingbar.cpp index d87b117c..5d19bcb8 100644 --- a/DSView/pv/toolbars/samplingbar.cpp +++ b/DSView/pv/toolbars/samplingbar.cpp @@ -572,7 +572,7 @@ void SamplingBar::update_sample_count_selector() const uint64_t *elements = NULL; gsize num_elements; bool stream_mode = false; - uint64_t hw_depth; + uint64_t hw_depth = 0; uint64_t sw_depth; if (_updating_sample_count) diff --git a/DSView/pv/view/decodetrace.cpp b/DSView/pv/view/decodetrace.cpp index 58c6dd04..0f3c2d49 100644 --- a/DSView/pv/view/decodetrace.cpp +++ b/DSView/pv/view/decodetrace.cpp @@ -19,7 +19,7 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ extern "C" { -#include +#include } #include @@ -495,7 +495,7 @@ void DecodeTrace::draw_annotation(const pv::data::decode::Annotation &a, if (start > right + DrawPadding || end < left - DrawPadding) return; - if (_decoder_stack->get_mark_index() == (a.start_sample()+ a.end_sample())/2) { + if (_decoder_stack->get_mark_index() == (int64_t)(a.start_sample()+ a.end_sample())/2) { p.setPen(Signal::dsBlue); int xpos = (start+end)/2; int ypos = get_y()+_totalHeight*0.5 + 1; diff --git a/DSView/pv/view/dsldial.cpp b/DSView/pv/view/dsldial.cpp index 6153964b..7d5191f5 100644 --- a/DSView/pv/view/dsldial.cpp +++ b/DSView/pv/view/dsldial.cpp @@ -137,7 +137,7 @@ uint64_t dslDial::get_value() return _value[_sel]; } -bool dslDial::set_value(uint64_t value) +void dslDial::set_value(uint64_t value) { assert(_value.contains(value)); _sel = _value.indexOf(value, 0); diff --git a/DSView/pv/view/dsldial.h b/DSView/pv/view/dsldial.h index 392cf89e..e878bb0f 100644 --- a/DSView/pv/view/dsldial.h +++ b/DSView/pv/view/dsldial.h @@ -53,7 +53,7 @@ public: // get current value uint64_t get_value(); - bool set_value(uint64_t value); + void set_value(uint64_t value); // set/get factor void set_factor(uint64_t factor); diff --git a/DSView/pv/view/dsosignal.cpp b/DSView/pv/view/dsosignal.cpp index cb261db1..26a1233b 100644 --- a/DSView/pv/view/dsosignal.cpp +++ b/DSView/pv/view/dsosignal.cpp @@ -211,7 +211,6 @@ void DsoSignal::set_enable(bool enable) set_vDialActive(false); _dev_inst->set_config(_probe, NULL, SR_CONF_EN_CH, g_variant_new_boolean(enable)); - int ch_num = _view->session().get_ch_num(SR_CHANNEL_DSO); if (running) { update_capture(); @@ -425,15 +424,15 @@ bool DsoSignal::load_settings() GVariant* gvar; // -- enable - bool enable; - gvar = _dev_inst->get_config(_probe, NULL, SR_CONF_EN_CH); - if (gvar != NULL) { - enable = g_variant_get_boolean(gvar); - g_variant_unref(gvar); - } else { - qDebug() << "ERROR: config_get SR_CONF_EN_CH failed."; - return false; - } +// bool enable; +// gvar = _dev_inst->get_config(_probe, NULL, SR_CONF_EN_CH); +// if (gvar != NULL) { +// enable = g_variant_get_boolean(gvar); +// g_variant_unref(gvar); +// } else { +// qDebug() << "ERROR: config_get SR_CONF_EN_CH failed."; +// return false; +// } // dso channel bits gvar = _dev_inst->get_config(NULL, NULL, SR_CONF_DSO_BITS); diff --git a/DSView/pv/view/logicsignal.cpp b/DSView/pv/view/logicsignal.cpp index f0897c18..093781f5 100644 --- a/DSView/pv/view/logicsignal.cpp +++ b/DSView/pv/view/logicsignal.cpp @@ -20,7 +20,7 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ -#include +#include #include @@ -359,7 +359,7 @@ bool LogicSignal::measure(const QPointF &p, uint64_t &index0, uint64_t &index1, bool LogicSignal::edges(const QPointF &p, uint64_t start, uint64_t &rising, uint64_t &falling) const { - uint64_t index, end; + uint64_t end; const float gap = abs(p.y() - get_y()); if (gap < get_totalHeight() * 0.5) { end = _data->samplerate() * _view->scale() * (_view->offset() + p.x()); diff --git a/DSView/pv/view/mathtrace.cpp b/DSView/pv/view/mathtrace.cpp index 0b6b6f4c..d388e1b5 100644 --- a/DSView/pv/view/mathtrace.cpp +++ b/DSView/pv/view/mathtrace.cpp @@ -108,7 +108,7 @@ int MathTrace::view_mode() const return _view_mode; } -void MathTrace::set_view_mode(int mode) +void MathTrace::set_view_mode(unsigned int mode) { assert(mode < sizeof(FFT_ViewMode)/sizeof(FFT_ViewMode[0])); _view_mode = mode; diff --git a/DSView/pv/view/mathtrace.h b/DSView/pv/view/mathtrace.h index 7bb39783..99786f44 100644 --- a/DSView/pv/view/mathtrace.h +++ b/DSView/pv/view/mathtrace.h @@ -88,7 +88,7 @@ public: std::vector get_dbv_ranges(); int view_mode() const; - void set_view_mode(int mode); + void set_view_mode(unsigned int mode); std::vector get_view_modes_support(); const boost::shared_ptr& get_math_stack() const; diff --git a/DSView/pv/view/ruler.cpp b/DSView/pv/view/ruler.cpp index 89790e59..3da9e04f 100644 --- a/DSView/pv/view/ruler.cpp +++ b/DSView/pv/view/ruler.cpp @@ -646,7 +646,7 @@ void Ruler::hover_point_changed() update(); } -const double Ruler::get_min_period() const +double Ruler::get_min_period() const { return _min_period / MinPeriodScale; } diff --git a/DSView/pv/view/ruler.h b/DSView/pv/view/ruler.h index 41f415a6..32be2440 100644 --- a/DSView/pv/view/ruler.h +++ b/DSView/pv/view/ruler.h @@ -75,7 +75,7 @@ public: void set_grabbed_cursor(TimeMarker* grabbed_marker); void rel_grabbed_cursor(); - const double get_min_period() const; + double get_min_period() const; private: void paintEvent(QPaintEvent *event); diff --git a/DSView/pv/view/view.cpp b/DSView/pv/view/view.cpp index 24051c45..f2778e84 100644 --- a/DSView/pv/view/view.cpp +++ b/DSView/pv/view/view.cpp @@ -81,8 +81,8 @@ View::View(SigSession &session, pv::toolbars::SamplingBar *sampling_bar, QWidget _preOffset(0), _updating_scroll(false), _show_cursors(false), - _hover_point(-1, -1), _search_hit(false), + _hover_point(-1, -1), _dso_auto(true) { setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOn); @@ -633,7 +633,6 @@ void View::signals_changed() uint8_t max_height = MaxHeightUnit; vector< boost::shared_ptr > time_traces; vector< boost::shared_ptr > fft_traces; - int bits = 8; BOOST_FOREACH(const boost::shared_ptr t, get_traces(ALL_VIEW)) { if (_trace_view_map[t->get_type()] == TIME_VIEW) @@ -977,14 +976,17 @@ uint64_t View::get_cursor_samples(int index) { assert(index < (int)_cursorList.size()); + uint64_t ret = 0; int curIndex = 0; for (list::iterator i = _cursorList.begin(); i != _cursorList.end(); i++) { if (index == curIndex) { - return (*i)->index(); + ret = (*i)->index(); } curIndex++; } + + return ret; } void View::set_measure_en(int enable) @@ -1009,9 +1011,9 @@ QRect View::get_view_rect() BOOST_FOREACH(const boost::shared_ptr s, sigs) { return s->get_view_rect(); } - } else { - return _viewcenter->rect(); } + + return _viewcenter->rect(); } int View::get_view_width() diff --git a/DSView/pv/view/viewport.cpp b/DSView/pv/view/viewport.cpp index 37d69fe7..a7dcee52 100644 --- a/DSView/pv/view/viewport.cpp +++ b/DSView/pv/view/viewport.cpp @@ -367,7 +367,6 @@ void Viewport::paintProgress(QPainter &p) p.setBrush((timer_cnt % 3) == 2 ? Trace::dsLightBlue : Trace::dsGray); p.drawEllipse(cenRightPos, trigger_radius, trigger_radius); - sr_status status; bool triggered; if (_view.session().get_capture_status(triggered, captured_progress)){ p.setPen(Trace::dsLightBlue); diff --git a/DSView/pv/widgets/decodergroupbox.cpp b/DSView/pv/widgets/decodergroupbox.cpp index 1b802e38..86433eba 100644 --- a/DSView/pv/widgets/decodergroupbox.cpp +++ b/DSView/pv/widgets/decodergroupbox.cpp @@ -19,7 +19,7 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ extern "C" { -#include +#include } #include "decodergroupbox.h" diff --git a/DSView/pv/widgets/decodermenu.cpp b/DSView/pv/widgets/decodermenu.cpp index e3eac36c..158cdecb 100644 --- a/DSView/pv/widgets/decodermenu.cpp +++ b/DSView/pv/widgets/decodermenu.cpp @@ -19,7 +19,7 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ -#include +#include #include "decodermenu.h" #include diff --git a/DSView/pv/widgets/viewstatus.cpp b/DSView/pv/widgets/viewstatus.cpp index 11dbb6c5..05c79a27 100644 --- a/DSView/pv/widgets/viewstatus.cpp +++ b/DSView/pv/widgets/viewstatus.cpp @@ -32,8 +32,8 @@ namespace pv { namespace widgets { ViewStatus::ViewStatus(SigSession &session, QWidget *parent) : - _session(session), - QWidget(parent) + QWidget(parent), + _session(session) { } diff --git a/DSView/res/DSCope.bin b/DSView/res/DSCope.bin old mode 100755 new mode 100644 index e56e9a428676b98dcfe53c88cee0975d24bef7fa..da90491ce5c8ce8a48712162efd9a179b0881f00 GIT binary patch literal 341436 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"+AvIhpqB&QnnRnnT6eg@PxIVk)SR zd7n?}ZnE-y&!Kc7AhqLT%7FviPLM?7vX19cUlMvqz4%bq1-(J@=C~vVN)rg|Hqvv@ zSy<91*NG`UtGq}BNL<^xqW+(q_cLSwc#8a9uDh+Bd|3!b^)7;xQf7+{jP6 z?2UMt=GtR0L4Zy+hO&4p{C|Otw{xm}`xT%469*HG+%IquJg za5l|pGf^$xyt;Yyx};@r8J+I*lwI^pU)A3BbSMO35jRU>h{H6CcUva_za0<2M;8k+s zr378?x*R9_Ob^hGmJ24iNDN=VN|a}yygUGYz!;Nj^kzml1+>NKxmc3(sBmjTzUD2B zmRgctgkpOHHTBNGoAq2q3TlZ8$B24K$80(kN|q40!NR&6*mx~&kc2@h#jQgY%UKvu z=Z)NNU32G^UuoaPyh9oR##(Fu9;Q+8_R;vM>UZ9U}`a~!KB|8F5VgqClI?K0mD+=l`_wA7e*p;&Z!f27% zrN=%!FRBq->1?o0-i)j2=8K2Qz$o6#+tM*S4hLvzHG7vw5?@Tr?b>ZgzL^Q$A6K(% zT)#XFobc2v7bnZy3CAY#F6#4TedH!5OmM+HspISA;7#z)=^Z#p@ht0bqAI-vXAlSTtu@%2ap0g? z9(n2Q&2qU`nr+v=wMnPgmxpxQs2)r+>OjAw^_IyUde>wwAEfhEa*|JqSew-Am~-+y z^BXIew3Q zx*sA6|M2?;+wS;2n7rqPKH_JsAH5=ViD1IzLUOAQPEA9@3E$~PW7qEY-RxWLiFcgs zThK}#L$>-Hdj+frrYn7wv-=|1I^%;jzeT;4MKPvWrKRf86KEC`5J$Hh^aPl(y-5T* zibGxECX204M)S@W9T9fUgB?_^HA55n3DI&5Er|lE!~)$1M5IBA9#2okJMJgg@h`X- z3QAB}^ED!tic_wf7fEV&yGEi4F6I%85{X>LTmb!^>V-Wf6y4CK&p^G1czLx;dS7Uq zD4m+6#*J6mI!`qCc#mDcNR%g>Ut6&h)-y~;Z{8Yi=DQfkVBH1M_u?U{C6|hjdmd;X z_UdAsmh3i8FMlXPkWR!YQHsOS;Yz4{if2ogqr$4bbX+4y98MQdD$IH+(a{CYT;k06 z2)?C}sr(Yw+t`-+)z+{ECgUKr;wh}!2!YVDdzE;sjd+*Xy4i!N5I=E~3<@KDb&Wmc62Ykp>9&(2Hup{z{ z;1ZDi!5$1z5!kdCb1k?-0Z2y|aJ-kX?=$8}X6Q&OLgZHA z>#XR?G6tG#Z7inXm4BdhUDNU?b-49%(8x9FmhfB*^1z=dRbA^L@EXkUm1l&N#9+CL z(yrR3Y1?8^G<3A{V8pJN2Kndnb=05=2T(arBdW`zCtwk~-p(y1MqplX%gA{VNy}iu zAlH1+EIN{~mgWJOrO^x9dP-y4ccmvOv@jB3=c6P{Nj&TO?T{jw)t z*@^r!2DRpE-Zs1%vVcFo0SayHtl!e{pfTP`G0U0riacUWBjk%!72HwBQM4JMR+Htt z4z5_ym3HDBL)<6bY<{qqc884298?-~nzHw}cA1~958#Wbp{x2t-

NIAAV4wLmfP zSB(A2x%Qa3x*cv08>H^#JtwEDHKSpg&z-G%%5R1`NsM`RvI+;&W4-ED{j8hEN_%*R z8d2)htD5%&?)eE-ZOOLcu&J|znJ9q!u)rU|(R7~rf~XbIn$Pk0?QAm^l%y@OLCg ztts*%axfhJa*K|aX+K*TX6o6MydZYhMd~P1pbuS)Je!R>(io(#dl!$QJ3PUKJ2GC$ zfR#=PZmfqcJ7h=lBkd4QWoQpQXIN`p!z?>q)!n);R%Krj`!vhe$HcEfK-^$z;y`+Y zM4ZIQfb{B+w;xA&t%64V7GZwGarcX?UC+C`UmVw%oQ+rXh>;2&5Fqn(sn{zjmCK2@ zJ17XxF?dV*U+V0z=Z!}Puf8MWvt~k|bN5JzNrxJDa(lbU z{zx};k8_Rwgt~Jv#4EeMGv91}_8A8HP8o8#^H2Y&c4R(1)oEXHe+@`@`BDUBdi(f6A!Gj=P@&jWaxogE5}JDAUgFdW!kak83=H(tQR_Fh{q0 z1-J6IoBSm=Nn-2Irp}4N5ew%s-LtuhUgNDA1NuCmvA>-i`~cxT_sr*>k-zYkm{VAb zk*LIhI2qlF-{`~v{_gZXf8)SX6$j9o-6;i)51r>gyNPOlfAh!e-~En#hWA8RpH7gRLE(PYJwMppOOyy4?068} z^WFcl*>Z5%IJgM|yv52N`;X#4p+qTokb})D=Q*IP;ptDNZkH_lzwgZH*G~a;|5ex3 zJJ0UC^PNTUQ*bbN=%wY}d-LkEGRuGc#9ijH-i86o(np`&VH&M!Bmaj2g}c$b<-PQH z8_n&1ar<8|vdW2Qj(yTcxP1BD^LM}d?-||g+aGlwJ;xev>7PnMEXyaJfPsH;^X5(C z;OFW)ywU}a;=t|g?3B@wY@H4M;E?9p`DFB3<0By;9_Pb_lqERH0FuX+1A}Vz6I6%~;$}-0s!4!uWToZXc(Nrva8;QWnUoxc~L@Xi7 ze@cuVPrC(IwEcYLl~#`8I&e^l%ZWAd0z3X39- zA*ankbqjbFF4RpiovJ$_ct@+32?<3<*_DJKlY!xKn+5G*vPbdHl?!R-5oMiK|fT;!^Xkd%OveUB*YmF}^RG)c5C`ArW(im-v*m#ttb}xU=Nvj@ z?%m`da?bEn?-ozI+2XJbhlE@73+lZOM{Qelxa*E{tx4g;O?;0#%d&=OsH+F6Xn{%r zWc)K!O<7fuaCh7a-1&q9lzS;fll-VB$7th~!c5xsxJNp^K?!9->HMgl`}%O2&DJDI z^Xk~;>$Jd8uYV59W`^!zwmNF_ay{$l-)K*c@+oijX4&%A=yPJr3bbe56;oC30yY{R zWBNm>p9hHqRz00I;k0rNPk(#SJj0(&a&WgdO?V>r=-bqvn;2Tz9WbHgm36_nH*E12zHslh@gWD zzJc>%O^L0KSwGzC%>z|X!>4c=D{9(`uhDE(Q1{ox!E~Ol+pt(vO}BDBPzRI`I+Rqw z-0JW!^W=9r?GItAYnsD$#S5y(Z_TBmuU2iF(MupVkO%eBtc&BLx$9Ou?p`cR`y&^4 z+mUTw%)RTU%NB0uE-n{*rQ+;l>3y8fb#NQCfa0GY6p`rYfpof5t|a1`g0Kw;b%=NqT5^8_f;M ztC-ST`ERv@Q2^rgn|Hr?XY;Mw-?F!(X*{Q=`}^Mj?)5Lcpj6dc@p*uBrE?(wX+Qh> zI?+k)+qY$tew${~iUTEgo&&kXw(!U9zI?B58YUWl*@n6jBTI6bvl$dt++@;Kw5Khv2%@cwiL_NXJHLw|VE|7Oyuzw*_SZ@&MFAO0|! z@$Y4QVv(s*}*k^y!J)+}-GuZA2g; zBq)Tj1H1;r{*{k?tiN;Z+Wt?Lye*Iht3tC)w%Nb=yPN&%``16VUzDG`_Q^Xve%X`R zli~oqb@S>w#XuU-4twZeV> z_j8u@?Y-No8RCEf-4Wh9-)(;5G%Bwf3LnmHDz;zz`Y(PRV^{WIdAu{mSkyetoKE-r(vtIQMIS&6UkdckhaW6ybZ^dqyv-weSRNQNNA^uEW{O?rJ%7 zTI}i>-g0p7@(wjp(---G63oul49U(26`0EKG=@eY@X6I9U@f0*LT48Fo`bnV%KA(L z^k2(RoSr+EAHE+@38u+-ox8mVjV26~elTC#Q2r8}*&Hm5uCsVYI!v24c+P#^s<+}B zWBFVtlf*gq1*_+yN%I3v0(&71QZd}3a~)o}aDhwenXN^^RvCpC5)cI+MFZKr*|e9& z_yaNI)lvwF#ygq_ZdDEoEooRO;M%T6R*PBYN;ldfuLTykqSi=@l*YGB6O2H0jFpWr zFJN$^=iM%pwa`FSwi*Wxa}fvzVo;M7?pjz-miQA1icO6jwWc?$)L$SNyNn4i%2DH{ z%_d-~B+TWKoaO}Mnj-J1GB2G-5-Ec2*au;Huo}e#s)i6nsa=*lt(>(bljLRox+yV( zp&LV-j1Wfodoc6B!xzqF6I>E;=wzE~c4-p%nl_oI&NWpMFWgKD4^b*X3|e2@yW!`M zfeN0%749jH#OqKR0b;MKa6NKf6%+(TktCk-I^;e%Al2yn)`5G>sp!&VU_;9BT3{J4 zf-PMb=!IAzu4&#*d(FAF9gtj=(``f>53<(6%o*h&739&`2+%sT6bKaN+smrHC32=x z>f~gJodI*&*SOkRGkDR-eNjS3Rb8P=Q{ak095zNxAdA>zs#4)QD^&BybHGiNqE17v zAOk>yl3wx5X|cS0ds_l;OWfOoL(x~`yfKA_*)Y2Q;8u~__haiX7Eqx}lD0_-IRetoP#l3LZ#>jZ=d|^E}nvMzQ#6D>~>+C`=H9T zMce0=W@qG+9*^;;xvcpyhKPoE=&cyA1+jG4lUsK_^9dMx8?6IoFlr+%q0syNbOpW{lPmU8k}YkROU8qqoyPet?+%G{Ijmgqu+ z{f45;nLlaGPJBq3VU~F-HY2~53rNlM0^1yUhmhPsZffq|?(?VCYUQtqAZD9d|(bh}0c#F5OnKmjMN_2#$3d>{Co66UI$9 z$YK_gf1p#})0kus#rpt}pZOX+>csoDb~yscgAcKw`NmLBO&|qSm%lG+E-x4J-efYd zkb8|OAZ%-vbjzegB}jDiks^CAblI|n44tS2HK+BxD-Qg+E%Q}|UNfO}yjWHTdADA) zJfs?8^>lc{s72PBT2D0)C!tR`I=A6Q9pZx24M6GSWW_ML>0zFF^-M2_YSp!r4l%%W z?Min*GF9F46f;~~aQ9NyfSULsIV)QBhLE^arU2GfnPGs&{OUYAzngevN9dIA{Xh?v)1R>rQIv z>R?WZmh_-YCMC?|G{Fz?A#|ua*aP2sv0I=D3a@Up{*-|H5whL8Ph;B>b-}ExIpcMxM!V@U}b%s?QJa+~q z`jPjeij$y@=d`6+Hxr)UU&d_sFoom=-F!DIc z%n3ut$t=c`*i$r`mEUUyZLDJikBR?sRuK<)#J(UQFh@r&KRH>=>KHT#I_dbXQItzU zMenq|jl%$=i38r1CzF6f^A8-Q$;g)mD4FkyAo0=6+1!WOG(zM0s2Q=c9)KssN_sbV zX3FArE`|n7%-wMv<#rXNM8aklB{qdLjD4TWlEI%C502UN2X-3XKr?rA%nsqKT>T~K`86=nqg@BBhQ?U-mMI9XVmglnTJ02~CgOb+= zT?xJOsZR+UqifS|+pB&HnmWt$$W>rB#43H8Q;AP*r%;i;C{rJJHIJcCI zD7jfonB!Pmlg8MD5ZoH^LyF^!*Kvj{-TXFeq2Bm$_Nlt?H6Qkw0VlWo(@??~!)EW* zS6>0}VEj(w1vbWGv1w$)#*8oxkDo^4Gmp;#W=c!OXGo~uYCUE;F-tCwX!Msk;^-~=iK1W``@^6=Klh>G zgaOE$#X6WO2OC9HN*bSHHy`c)sl9V71%-hF$=Ns<+zNBv-{KI5_}|BYLa-(5V}E3p z2RIP+jDuUhAP&;lWdGIv1KSy~7iY|#8}+*|lXi=Le`hmgzuJH7{oRKr-E-GI)qTm8 zm>=kV`6EA`pJrbB;Ig;R&s^9S_p5yJK0DLs-!IpnRnOuF_V%B>t{If`&E4-@$JBt> zAIcm-d(6mwcaIS!;NE98H)U?#w|SpNX*ZkG(?7Hj*EZJ~2V~Uksm)XO`j=n6u5l*d z`lXw>OrX4b_nY6`d+OPno1M+2a`WWoio3Gs*h~gLW}Bct*7k4 zySrCfe0@0muzcWv`}C4=KzRzav$=Zp<(K!K+Jl3uS1(-}IJkb(coxZj`cIU`&i?fc zyU3R1lZ?3$?8>HK0Pp$z>p#Dx6CRlB=HKhzD|6)VSwQanA2;v$o!|aGrn(68;Ynbm z+ihOBlJfHX-~ZA}!td-{R~`-i_B+1)e=vr>^K+Y@gX=V6x!K>4xxMGzrIgZ0i^+Eu zxTI0(vr?c?Oji5#6|nR9Z^Oa&nUw2IO=_p7FUSL6q|6q(Q0tV%JqcaUhHb%>D~@@nQ}iI{OH%|vkhdC8y77pe#iPy+ApI8!j(3X zfrQlcffayGv8>9K++H`nZ)4mKrf!&MWEOh(_@r3o9uF?D%?}-r=|B7w=q##$YYTB} z8!Sdwp2sF8m8XY;bfHK2`E8Iyk+|p*mX9t~Y9Oh%l+kRWl=kkqYY^v{90c>x&8i}1 zWx-V!Xwu8WKsM>=g2id@B#uY>D+z#dX;UN(W+Kr}%7GzNW! zft>3sMI5!{z#1Ukfxr)nhzj9dS5XtxCTqz>0%FNZkwBy{QiRqlz*&P&oZDi`jJB2% z%cIe-j@QOjG|Fd>3fqrb?K4)q)x=0l2@Yg7!a^nX2kU)?f?ohnbjZTH33q-2u!SqSs(NbB@oP_4 zjuxx3z*Xa09wdd+uy4l-`gxAOnvr-kxOExSa1yZ5L`?|Ydjg!JK_AH=TX@h$bu6O5 zdx29#$T4xa);zLGKCE5igJ5~4q;tJMtSHDj?-n(2smWIM^jzRAcLSALz2;K#bK*## zu-+FfZvw-q_5?j=Y9P_W}8 zGeU6%wl^YD3J)Z&Q9}hVyyM6hAYW`gxfzJ{2T{AT%x8_}Q5aahQ>KWDhO;1x!+2mF zdc+})6U1Z`jx8_^cr-_dvNUBU!wMi-bU)s@v%-4^uNR<(4HodW!S*-@Q~iv!SVz;WoiqJ^DcNgOjwR_fClPuFa6R*^$(Oa zf|vEeNAIhXE;<+V%tpnZA3FuSh~LO1hds-GTIs(Z1ec-Q6B$FuSuBSKCts=DO0>wN7G zAmugM_99>-Yh{W;j4T=j5%`U;a&5ORa>w(^QUh%p$1khJebzExzMO-^>g1$26-O7`C^%_O1^x=WjPY+htOrQloF zUJZ`+w{*O3{nn-5+CeW-m~<-p(GHhPB+mneKqbxP!)~^|d1;4knse zyI&3*&_Lf@+Vpq!_n&f48EsJ{t>|07^{wA>n``I7kMV5H%cn1@s%r>^<*pBMKzknA zZ48@xo8P$0oXbDlc(?fu&l8}ya^`+8rAAOe$KAWP)v=Mx-rgVo@n-Y<^If<36ZhK#2R-k^ ziDuq@6xh5Z4qp7j*o%V)(@mJ2ckH}l^Kx_Zn-97Zv+V5e{AatnyC3?{hn|vqXD8{(_34K{EVtyejHj-=eE-@` z`JM+R4yQS^srJ!hkYpygum<>EGwe2e`Of7#=fmy6!BbD|?y}45M0h;|=HKMGOrG@3 z?|l7qQ^JDbA9+h0?77{i(w@8{2X6ECHt5EC`N#oJ+XzolSzp|Lk(IG8Q5$~EwD#MM z#}3$e@%nX{cb~X>H`SN@KYn%dnP-26x+eUiVfu+*`ObOYYXDmPRr(6fqp?rD9+wyQ zFYk{lkwvhbhTLDfCimSZ%JTN+_8r~_r(Zb@^~KmlaX&na1M6oiHxH{p_XjsO9pga! ziiI0t+S98) zh#J1g0L)mBu_sb%r|`lQcz(JM zP_A7z+RvMjR|8k_^JhM2c`S?z!dqJN3@RLhb|y7MU*W__pZxId!6sN2rlJ*@K6+ew z3Lg|0NS}UcDk|gK%x6Uwv!+z)(HedQ4Qw2lHke^~68AYik@g9pwqvj<71QW5kFQq& zM@WDssF6Suh7Wqnd!Pl^Qz4+RA=boS!v+>3r)z8QDJ-YmMH;;PCa~C+Q&Y?oQn84h zrni~4HW#;=iXQP%E&D3SMVpRRc1^{t`kZ!YwD&G2Nwg>Uh68Rzspt$wNmPnOps_0# z``D~R4lH^$mI-F%#`v|1<_O$NuE<4>YmCALezLVH3dZt807x1rnG%13FqrBzn72iL z;@X+GN4-38C9@*iLC;ryM^OHAz7)q?DFYdpJ{76!(k5gg(zv=rQ3P(DBEjfQ6)t=( z9mm6QidT#YGY@L>MO>M-wWDn!xZ-!T>>N?-Y;co!PhHCf3W92E1qKtF?f5FIhlGQ|;$w;q>z2f*-J5hD1WBrij^NbR1knt2w7_kvyL=-?dIvbNNvufO z;=&FO1^LQ5Iu1OdoEKgNQFJKFEmf%l*$2kSHzANF)49aOP7bzV!>HZ zSW6PQ0MjnwF6KN}kf`?K4k_>QNf0q=v+53E5+|AjRdJ!N0%`-LJN0y9glQcPO^6rS zRrojwOv9fL3uAzFoK?6$-rzedc%5Mc#$Bc73nZ$z>*z1H_U$SNx$srYvVhvyp z87h}qus*V&tBFYfp&;&vJB77Uwpb!(r&5@lhN8p+6CeV~&1*KrbCK3btmx8k-7)V5 zSD^cw5G*AA`YpXHNNnO_AaSN;s0I{sF}rYes3Lnm(dn?525Ln<2~aM15^VH-8xIlj zm$)UHL+&#qyC$`ktm{eRw5ot_`hyXqvRf^znDC1DLvWI@F83&-IYVZt2~9RUR;m>u z$SkkoaRkm$?sbNd{2*|3R$(nL>5Iv{^X4NVA7JabMkp*uL$G5|kglRe#W zBpn1 zPyOsuJHzfqM)|WpoAhS4Q~Yq>C)$4poQnplbO%%-(=^We{L#k!(R7+d^R{?Ynyvku z5b$&-bp)6`xy~~ z`THC9`+s%%WgAc2dY#`mXN&x^S-zr5U9~@b7J9^t=IGNT$}qYgYN8|w*t%)MXzAW> zXm6*#0_C7QJ@vWC=geOy(OrON0LR+R3rIQkzVxM=H-GqtAHZKg40`-cIy-)8XQ%(a z{%<9)S-amkbv$zpyvR47JAEw<{=PVH57dLb&6mEUJ&-OW_<&>ElR*CgD`RU(t6b~ z%$9>qZqk1g2bYKXF@`%cKlTPV=Ub-hwfcK8)cP zeD+WZhMG;|v6D~U>yF13py+UnivAgXuqgsR*fkbDK(5vrzsj>SB2#Q}4Rmp!pan{y zoqb3KwCL`GIJlM6Ij}i&gZsWvUP&v-LLTE~$tgfobE$|WRv6HztbVH?J68fv!(6`I z;Fck`0HH<!!QZU7oFrOE)$<(7U*7?ZCEVfMp;RF>NvuY>A;aO562lDQ6nj6ow292MFZBm z^-<`cb46!4&iM2SR(4lH`pE^2H4A8;#nyTAmmdx1@#oQnNN4VXsRNL-wD&pjmL;ZB zE$u9dNfC<@2~G2f*Skx8YR(g%MAxa&GC-e9j#zY&If+{8o5u3NOCaI@WAFWAB|EM= zzq+??kGsdCoo-@`^#-z4SI{2=L$O8?*NBa0PhHB6?tVl+VX^KP8v+#gkNaqNu^9y>VJHD2$kc65V!^Nh+AuaW7Dz~7jd)=$z-N=A zALK}#&-c{5-Ti*da7gQi*UQs=Z&jT-b?VfQTenVC-Ksz#NXsp(2%(~DpK=QMB^13{ zCYY*O1$C6xMbE#;`o32VoM)*d)5002fa1#%%dB7QhTRH!-y>U;SQq%sJi=KKA|@P^ z-&r-`9=MXcjVxX_1CgMhK&(`m3lV(bjbrAKlpIAAy#xxe5-doEkA7AlthQJKeEK0~ zf85U`CQ5gvsTi#ZP30~^Vf3Eh1_gGr^;uf2+A`}k$dJ3h+D;T~wA7kFSpm}g(M-rM zGM`k^_0%h0RZluDtSG3e#>oQkl3wiuMLs7-E2gKG4I<85!75x67s)Z%A7SLEiWgyQCv&T+C*@Nj`}vQ66#p%)2-V2Sms~1EYMC zNU*9GS@Ldr!W?ITOyV|^5K1sPpr^|)W;WPsXc~SsKOpmz8crAatR#Y90YHI~iqSar zr8Mg2*%q5+AJFi$^a{f9Z2BU)nmpkA=)|$s>K&dQ6;=Dtk|Ia6gf#5{{|=-L1UegG zpSd~KUZ7;{GaT1vHFAF(s%ek?jmP8^c(RXM?sl<7o-uY15{!p=l*t~(e$40rU>*UD zMY-RLbBhjz!|+IzKCJEqsvxSmbZ9HrbAepa=z-M7tR5}u{Gdj-d4G%|2i1f; z%?3rz4n#BrqindZlOxs$hsOGLxOk zQUX-uwtChBW=?BAoDHdO`gXckEZ9a1s*3EdqKg4~D&k-oqGf>YQ4KdL+T8XRqa>nI zuMA2f#`f&;;&uBJs6fxMV%4x^%1bJDK4^Noy}9$g?l<|c*Y`10`(w8|Zgv%CpE)3} zGPc^<_#6o$d{~X2QxkX``}uInzzqEHK`fCwj4@BQqTH`|w;E<1O@u%zBSfkWWJo=j zn(|%mPtb_b_t`N@U;GRfliKLoIx{P@R_nmc)ClC};~7Sx_y+qSS3^J3xc&qSz*}uO z^A)5`wmZk5kY@8T$kZO`j$#4Y8nnO_C?7s%>-l}E^2CpNA%nz@6@W0nU0f50Uk5xy zDp_E})y&vuoVw{|LC;`Nl@^|mMih8EiFOSmv~J57Xv&}_Jb0D?xxL=rvY<7q$WhYS z60uCMpo-C=palBH`C}VVa$ew5=Cnl3KMupe<|%^QX1Ou=9aUiOICX7{j29z=T;tY z7v1+?JJ0ym;Jxo%t@6*f54jJ$cB>^^8>^Lei%#>Qhth36dGlr0yY<|fK#eM(RrI<` z3xbTb^89e%6pH@_&aK{&B=~;!>=W;LNAV*+@`W!Dzx&YYL#x+puJYWPSb>uSnkSS5 z2(UtcBOFEENuUT%li-!ZG)Ay<@%&k7k*~b+(n}9gV;*~Kb?eJt{^LKsbm^tZ)2sww z*4D-k#8cX>;?&O)p(MHbwVl=DkAKhih+-QglKgek_X5fd?Xs*5p0#_`S_1o;Kx@ly z-u&9fCBZGXT!wJx&Px+E_CbVuNg($1Yi{Rzz9+2?mIN#vkg>_;yGY>vW$|iuNP(R( z-PzS=e&*GKOY|20<=Gd7Klo4NuKTrn?}eIIQ~l%>=H3TC#vW5IYQJXM1GA07!IM8@ zS~e8d(YAN9cGkZ6-NxJ8`;*P}OADucuP|8&FZVO;e1c2R>5Uh69^d(7e%8IV`pVZV zkM8tRa#}jqo`b5==upYL^VnmTWDCnb{_^eHS8f~D+r7PYXV50I-|h(AQLqrjI7)(- zKlAj>*H-`FqxX{F+7rhmcCds zn${ml?#EB$LC3H9qd$87srXcs`<2zLSHAz^v)`ZmvhOf+aPhs#ee|vwe#0D-031)r z7MxxEzFhZ~;PpR${m(_!+;YuEf}earI0RTfS#ldJ?B4dyH1}n#7;SC$3P@z$jC8kl zUhd4b2ye!py65VjFMHCF`KqBzw`zvEQ=Hge%z+;+=Os0}WiLV7xfBTAD_=$5y;h@z#b7xnR&(NW>Ei zd{Z{Dpf^SUgAV(zl*C-DT8uS$O7x=*LK z9vv{>+4L9kSrnW_GqAMb@`#UNfcl>Xgp^8SUa6k~AYTz(G*ug?=Tgd$hmN%-D1eN~ zr6oV}0n@M~tf^fcW}b;x@8ux{je^+Idh4v7jPwO$kRD8p-dmZj2=uS-_-y|NVbmyt0OM4EBN z2%|V90U;z6bCSje$+ld#Bz?`IhHdQ_>Iewg&t2i!jBiqiJOS!g|9}M}{oRZmals)D z!dkL|O#%@n@Xc~VMN^c3c(Kw!Ys|IkgC`))SkUV@P^KTV5k((oan=hlCOYgepwZeyL#f2^7S)Zf4Fxgr{;an`7 znpwsUn%t8OLp%A%<(|UH8{}0*s|O41YE?S0tnuF^<9)+;Nsv;@?{m$a zr#6(p+9-~uj6e;!D(GYgR80HW1#N3ES+L8(#y88b>+&ohXF5jmpQ|~ z-tWzF4tFBYSmwOXmoIptuymmlk1;ti)Buph+@KYESHO%2)X1fgg<-arv)QoP#uQcS zZ~HZeR=I$70q?m4sYd<&qFjy^qjHX7#pHE=G2XBCHDAlrtJ1lL%suD_jK%fF#Q@!F zw8#S94GfmfQ!!>%*)&7i@8@yMjstirmzgXM@Syp!P2HylX)y>HOEM^@=%)wd>yqW? zlOE@Lk$ZkPo`rhYXza-^JXCWo^iR%sBG@7ZG>;g@LqF!>4SZ;%W#ACQZBX-_@*r}u z5l?RmJ(?}&cl9*WazxEn>%GH0>c`(cj|#g9Yu~g6bOy(GViK zNmJt(N~?Ff3cN2r)>e?>z_~+1Ulgn+XM63MlbrNcOL;;5A<%GAjRU7FF`$4n4D!v% zTjuK7 zfcmtbQE4)YVY(PicQZ!&0+byf124j6kj(?M4b{L+!W>cN^YMO|H_p=n4~xOPf&X;h z*Sz@VnNq5%sLR2x8e}3^&ky_X+N<{WcZ&lG-S0Eitz5T2JeXJrN5RK3Myj83S}mgP zk$Nzs7^K$nm#(aT2WRCJ`g zy@6GFEWgcHsPg)dJb<74$#-bx)&1Ec?|DR~Kwl_J7w%Ile$=w_7d|-5{?p+v4AD@( zm+t%J#1b1le5sZS_4EJu9ZL5ap1aj^e<%Ap83xMG6Y+^i9&N#&eJD9jlR$iJo^&mO zbmMotL-+IFOX;?W5?#`j#p`Qd`T2h=vx5~P*g0voi+YFsc9~k6-rTukx{+jfw-mkRyvPojZ5uV?)!?mHX1o(_Y)3{`4bO zeqVK~uPWr%f9}8cGXL<^KYUfD;GdcVfBL7%<=iJev5|&Hrb+m2t#*=N{BG3)zEzO` zNDzN#=e;{IF=7?Ks^~K>;nScN9_o$6j8{i4#Hw!njwI1isoqz7-(aSGuXYSj})#|0y z?>~p~y88NSqS|q{uiRW+G@X}EGZF{Z;s4I$cP8#|^vos3K%PGP^wSpy7wLUwJV!JM zzdwDsi|OjkJ9nOlDOl`~n5)-G_sTyZlq6WO?n)BW5yS;o{0Mn<&b@=eSnb@tLi{&H zxwCU^EkVxAL?^-7vrnHrJ0N#y?giTt9R9{l+xI*9Z0<_SPw;?snAHn3{?As=zVzaE zx^s7mS6B5lcjelDb&c^Jw|b1Rf4<}1g5P)RGzy!4XOFMD>76p!E%)F1seki=Oo1f$ zwN7hKD7&w|mbar|2`PyrffdZk-Cq5xCoW#S`cpr}x_Y+VKL6Y=ABmBccl!Bve*T># z;i|&_^2^Vy3M!Ga{oIl0?|t&$$R)_R%*)JVYu#Fb3`E@w)ED$-OLwz&H&seUhg^4l z$Dk%4-Ogf;Pvhlj^mdm9y9U3unI-BTbh}UBeM{@BKG+F}Con=JIgWc}$RsA|*Cl6h zlq}+m{I&qfn7K0H;zT}?{v(FvrAvByr>V7}XL9z-qi>Kq`Q~3bj%&|i|WS-iV|NgsPQDM*w)A)?NVQ(Gf%*EfX}F( zQ$&rmfDRf-G~@0mnm{N;O6MhNPJ5T`LxMprl4jOWA8M|=2$4Qnp}B6lEO1auCz%Be zu?b4>GZ><-^J6%G%i-R|M`HUL4a`0~okrOOsW z5;B}v{OYH8sMPZ#VTJ4yUug2i&-~OkAX4d5p00>R>_??}6#Kr$&y(_uyR@+o$VSZ^ zc_u-~GisoO&NE;5k#Hz*SPL@WDUUKdNfN&)D!RGjY^E~kXS+n(&)CaHcL!g(fu8b@ zzRqhHQ+~xl;T`>7K9eMn$I*{-*Ke@UFC#C5*<9u|WT45GGM2kpRO-mdoIprhz&OAi z19Z_ZVPE^ba$ZDgUg37F(_X38AV}qvCQkaBdHjf>!RaI)_d#^Aj*d<%q;TywffkEs zM(GRn2`Y4O2X5Kd%7Yo~^lsDk7BxL`@fh@$xn?8}N)%Fm;HMTV0|s#HU`nh^ev(5m zD-Egovn&p{9Lo^wpdKK7eRG%oe%dYj!;w6~J~e98Gp}P~M}))GS?qFZE|cDx_>> z{TWk|=x)(1e1F0eGD!m;oR0zQp0Ax`X7-KL@A4E*ikT;(au0JjC_E*vybu#t5D9lG zQBg8FF>9Zhz&chJ`}+$%KhASiNtZjHN9RS2JZ@1btk*IE!W5N@XkXD+WH$cmXNF=T zgupYMBvbVSgI<1WU+kkMiW`8x3%!x=1s@=Tr9z|!iuAE)w$z$xD&3F+dq(47Mf}pU z7?WWXhfxyFMKaTQj<|J2ocCZN&5-C)ycjKH88NmO**uz)X;~nj*h9`|@^ub8_il2L z#lkrCZ_JnGGtu=%SqPkKw(tC2V8;!7c{y>`QojfVlJi8u*is^a4F<%}z)JORFq&nP z%&~n}Ht^GhQoN@JSEM6J681+K8^twqnktP*EeN=;X?lu2>$4Sl7P2DWV+Hr_Y_u%Z zzRxrWKr6ZH*>%o&WSEN+HdmIIV-zg1x0jQrxr@6j#NhjNx1m)yh=jb^V`&H@TYNILOHM?>aM3dHCnT*En-tWPZYapG zP>rJt6IKlLX*GFf$QhQ5vs#2e^PC5RQPh6!qiTbG&7vXihMZ_du4D|oATH14aN1B? zvLJNL5q1|#a+;^Rs0&63Xpb^h@{b40dJm59UZCE4 zc6-|klo|-y=fq-8sEz~^KlT}Lf!7Al@nRY3j4xCuGYVIHTsGO?V@o^I?6MNKqtGi= z6UG^uJj|UZ$$DJ{H}!)>&D)D$64vz_&$^;8%JddgH7Gy^t6-7ZM@Ss14a(iTkj}ox zU`r&k@_`>lulmCCx<4+lJ^?`&YRk^ol>T}T3OFNZ6atrtmR;wBcjT* zq=v*Qvf#zJhmtORqdh(8M!WR9byv9g8;y)sSMSVfjX86LzPM37P`NYuUL8NQ_Y~5C zcK)WwSF;rKp(~iCW1Civu1%Mi?(nBR#hjP)udQD6{70D>?)k$1&Weql-%PW_ZFz`O`tJYs;g|p79p~S1{?_u=a>v#6 zl|TBU+Z)dRj(mA~=VpFUlJ{$}|=mGa>6)#F<-+KFW6zxI*U z)wA2Veu@ONtaT^NQL{Yiw2VE9I^im$78%rb_jcECy#ZY~dl4kp(Yw7ij-pO;`O}bF zxVUBCSfe`~zoEE)TjuD%@P5>fcW)cedPZ-+WM=;AXxk*v0(x?0IlxS% zThTvhi=#mi34|&Tq!1td_Xm8A?Hbf2dx>!2D72NZFRviWe(;Dq_n2|kdWKJfQ#R_qi^F#38|}ff;Kd* zO)&y9HYhU7s72riBg#_0ei+q5P97jXNjGaeOtdf?HmV)Muy2?7%hsPM?1G0yzA6Ky zmpgdrf+gjv@=p;vOnUZE2+;7!*p%{#h2u;vWwq3bYNl4Mf`%+sBmhDU0%p){KK3q@ zc#@Nh6a)*2i>1FzT1vqQD#n8OTKw5TL4Jm9Fqu&of(Y~ZU~YDkpp&y#4{N4$(Kf@v z)1C$*_r-vp^JVZBnbnt|615+qjNt@_qK%9Qlwy3DN$;pgoAK+OF(W$tHgydBRLVfk z!kzRY?tZVLx6SAbYyf=99*R8bP!6FWB8F}TPzL$C$aHB!;i%UB33b=|WXgo$^nk@S z6Lytr_6Mv=a9LJ_%rBZu!6y5Y+EvYDk~LaqZUD{tp_6~M#Gfx4TK_^kPCk?=?6Et8 zKUxRjCX)kN&1OV>aC-UWIy0Q`Ev$cO4;x0z+ z6rsU%$tUq1H#i_hGgKSVER80%BAEw8J`|;wKcC(J(`|q1#3*r+*WH2QY9*Kueo1~z zrYW6G!vKasm@c)Fz|ER$i;+B&dj<#jPo~@cJVV*Gdn@R+b=qSj#S^%oDomT{bed(9 zu%j*^zlMQE{cJK_k9bOCoLWiR%#Nr^v!rl_&06`E}Pjs70Dd|JfHi=c@8 zX`JRw=xN;pMG%Xgs~JyXE4Iop&KQZI*_1;yDZB%AdwEf=&|MxU(hx=#0 z3J{vK2tE{GM?B{)hQz;vMOh#~@nrPaAlh$rYy z%i1cjC5HYw>)GCP!5cKt@d+FK%bS#vfu4tJ2xoTnD71hyBs}*GL|MDO4!yUdKP4+A zjd?GAC5wU*uxw~X*5u>JssL-{4L^t6x!5RjgKwHtP1G%(>b6JCXHFsn8z=(y zdgI0x%%v~g&Bj+-p_mm2!^j#8+BD{PQl2CVY=S24LL>XAp7~whU_;AM-&-9H|P=yz%gokjeKMAM?h*wzHEWW5Mfe=EbUOh_DM{d&%BH z7G*(Vi3kMUHV`Qa8<4b%(L>BEZ`w1U9M3!wDtO1!YC|PWKnW0TQ7>EY~IW%f=$tCro`2DnTgnij2km- zEN+|`ohkw=C+eKu^a56SEp(A(4U9zG0g2vru3d9Ft>gmkMIvpf7SkCMgQ^vi1zw?s z%DgmF41edTgjfSDR-j$Tvs$mNJco#ynu~aEuk;qiL(c|x<`p5A#XK-wzE726HSbpR z@TTQaw0v6VF*$~5Hp_j}ET)=YBuAtp_seMdgsKb~raTp}*Ehp5CDUSVxi_T*d5Br- z72Ie#s2yCedSf& zSVXIA+yULWC_8ai)KlkEL^ac=y#ppf4J37IK?DA^|3gP|hi-*&?SJHu(>O}JtWZAtwrv`k2=S{1Ff0U(Ef=_QFQpuj;TGQ6jrGFmEgLSeUf01jpCfr7LNpX zlR&IuGq7>e@NsYX0wb?%gge zl?8Kn_}S0uo-Tc(D7%urZFc_J^Ek~QL1MF-k36zsc6B4c;o)%!hG$ajlET_LRwpAkrvg_G{BRz}70c}(LBv0~!#B$!#!NTSn>nuK; zBJ5KowYGNwy(pM@Q9*w^{vw~A9*=)@ZoSrfBi0HL9>2h(F`#+h&gbU;yn5l$NB_yAFI{+9 zS!Zx|_1G0r9nFJ3_=698VCNRMKTs}ch47<*0$jamk5vkM&->pRoVPl=O|&|^x%2dM z*Dk+clag&}b~LqpcL`JmlHgN-c-_AQUw9v15gZ33xN@m(B*1EwN`Wc!!{cP9xYK(> z9=sn;f%+8O8pWC*f-y4Qy`sE%+1oI#ss3t~v>5hoJQP*tOfB_B6YU-(68~=w@bD3- zy=m_w0#P3Y)zfudJ?dqyH}X$O%TEc}p^kEY#p+0 z36YH=Y4%ur5oye@yafoy!_ca=os;7}>dmyGH&PAR5X;DhA^6!}rPr0Q&g z+-)~u8-2pAVh|^FGG~tdyYrdHw0>~MGb>#La}=b>-UG^e_;p@Z&K;MGY$!=Rm)BEq z1bDi)(;LjQaLKgHqqADo=2k)kwO-A@Bs8w0l-{}yW*KiOOTzY`1K9pXnmRGEh}839 ztpd53RjJY^(j;GbM9!$d$K)1@wu!IH$_!POhcoH}Ku2~B_uuuq9$p3AWT5*nZ$?ZYLiI=F&aO>wIfK8P~y z=r7wAM9B(tW^!?F@kiW-i-t<~weQB_v8Lwy2#07CK4T)#rRiit5OI&BP}!rNF*DKi zkGX9)PW~!ICOmw;pZl_9aMGBzU;Fjgc{=iRpuT#2_Z(5XaA!vZqw~AmozMB6aRI*)^5M(?dB|u^(jjfSc@v^6FG!OQmaswpl>K8sa=KhSypENQF&A-IH8%# zEnb2>RD8DRYeFWjOD2Qqzu|U!wcBS2sN6Y+MkjjRapw(_Q5KwA!7|N)Vg~QftSA93 zu9))q0G~(Xy?sUu(d`e2l38KDB+CN|dQZ#04QwVIjY~yWsHvM^%AHJeN8E{CMWL7& znCYkR&P6P795MCVqb#M?O;wVvjME{7aM0(=SeKiB^vqk4ONk1&#oQkFD9c z*Zwxw77(GYNIHm}#Y8ZNoe<^Vya&g|m0`EHltiM)C<+h6`ZjYOk>Z zVJ!8-6wbn?)**9Vp#{kYnG)pFN)?WC!dbq} z8-g(dXc)3^)VRiZvOh0+zNNCrp|ZnV00GLIm@Ta&IO4OEOzGqs*l zm%e9(gyU{L`N`*=>o{(k@)t>WX_@B_?(F>94}9zgJ|;Q~j|gWe2f7th|j)vOM`>$@&rM#6_X_tlCGmpF~zC56&SPp_v+22#Bv)3+MIDGN&#q<61*EU>|?VVsk zs4A)77cPuO7p`hS_QMaGI)0UB`KhO#l0?VCy>evju=~(+y$^|E^$V-7KK}S?SG2DC zYcGH8<>m60mHO&`ph^y2cTZy+^iv=G=-Q6u zx#vD)68yq1eD$jrFTQp~Cx7MaQ2KBG?Mt^rCjle@y(5>JZ*_JB8`GRy?$iBKn9aTI zj-|l5r-qxCQL?t5&UXItZ7Dj`H_PO?Y2R1}$D#{y0us zvd+A}P~S+ZF6PesM)H1}*V{Qj4urRJ;f-_Pfe*Vg*CFf7HxBVPk7Dqj|F4iCIov8Zhx zyfcrAAT|0wb~u_NZ^ab|^yBfZg#3nuu^RRbxkEzbZp1*CWF2O^6(bI{PhWPbZq2XBiHOLL^E&0n3=}Tj&TXc+<$|eUjlgHy}@B>7)=OjoDhgq&>$r8#ESt=r!(t8l-BC+ONi z*4UZdcvdjlHuf&$-OT&r7ew}!y6|1dyP0Bq zpYYau7+uJ_nfEEcDP&#m=M=BIpcKNl(~0f-`cz8IGu{vPwwG}#kJFI~(XBas^P#tS z#%+h}*6~QGI;FO(Bl8k~wTJvlLS+tw!J49VfbRxT@JyB`am`LP;*rWF-@V!fV1 zI8d-u6)6ykMoZ-Z)u6yt;a6t4D^&?H5O;+vZhK|UyDSAR#a>$kWo|lR6WJCz`dsdm z(qIwzL?8*|Zal2Cb=@uw&$WSit5gu)<1@<12%Xfcy~dRU)q_wtE%;U1`$kpa+MTfj zw`lMivkAH_iwIDSx^Gq3(A+9PWk~X%7EKB6Zjj-TGE)?CZA0fyrXIf}bCZbbWZ)Z< z?fAV5e;jY_RE64#)Ecg~x|~Xsbk=^xvPV}P^k)jg*BJF~X4@Qunsgl)j*Z_CJ~?Nm{pRPd?ZkR0Ga==IaAPV|rOI+chM;J@a9EXi9@8V+27#46G9`11Lb8 z*vrXQokVOFao-;hsc)(ZZOow-of&@bQ~uLl=d|OW;Azj z)V&^Css|{wmAJl{SXT!Np-|cjFt|L7VOF|H%_#sZm|S~{hf<}HKQnt81V!F7u$ARvXn$y*I5VZ7( zFC;M8lCi;Bt9m8~$!IDLOUOnIU&Ble*!!gQJz@0r3Jyo;#WoxDF-jB>dkRF1waNDh zbwR#@4CF(@K3hM4Wm3GN+_x}q`p>2Y!WBR!u%iNs|V=3(TVm{U?!Ar6tu!#uvvkxMb6!| zZQC%(-Pc5LPxv5k`SNBj!PAI|Hc9X_$AuF8p`Y$LVU`7%>5qBBq?QB8*o5yi-AC*U#A8uu|GzkH$ zcFvyPS?Rlnqww{=e0K8EOZXqYcK8$SCysg^bA4aC3wk()KPf>+uzF$RhXihC^>

}U;w|GybEE+G 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 literal 341160 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%0A2H{MHGr(~RM6r{czU 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 Az5oCK diff --git a/DSView/res/DSCope.fw b/DSView/res/DSCope.fw old mode 100755 new mode 100644 index 030486b2600ba28a5d16913c13d9952b96123103..2de2f3fb83397da8eeace7f98f8219478c98cefb GIT binary patch literal 8120 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 literal 8120 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 diff --git a/DSView/res/DSCope1.def.dsc b/DSView/res/DSCope1.def.dsc old mode 100755 new mode 100644 diff --git a/DSView/res/DSCope20.bin b/DSView/res/DSCope20.bin old mode 100755 new mode 100644 index ffd960cbf2f8f0fddbf87d8e0ab0df9d30b5f1c9..f4ae400cbd8544029ede6854bceb869743b96758 GIT binary patch literal 341436 zcmeFaf2<|Rb>CP0YkcqM8Sh?Z1W^&?RBzVE#G$Q6tQ647P+L8sBGPt}A;PgO!NiUd zX#fd=BnWHAK)Bv|eeWIKClkSajzoC#L+NLkf;0)t4WR(EAdr1Iu$UiQse zh>(#I@IgyS^lHhQ&$p`k{&+uTe~`q+z@GQIew;dW>eQ*~?mAV~byurhxc$uiyL&V9 zLT)}hYm*PxzhyprZ}Fdf_y?^S{4aYSGB55;%wcX`>F>G28~@se4@ZY@pBnR5y!q;f zKeSpsH#N<3wXx56Z~n?X@P}M8t_jzNjCpSM&wlv1A2fit@4Z_gB=J|T826q3lVaZ( zyoc<%-Z-$%82iQ*Psx9e%YPFj__MEyhc`nD;egBjo3ARzn?!GF;7tvD3pLPw3wi&m z#X5h8xbsWX?4>DhCYa_Gbf6c(tAeVhijCB)IX8X6oBkWBf#eM>U4_5uzVwDm`lbMH zYT!)`yfGU1@EcR?o29;y8nAC<;eFX@A9#cO%ihpAGZ1zy(Jv4~^M$U91u3arP8;4Qvrb-fZ;`$`l_uL9ACDXs`MZ;UsV zs|jP81!$i~DuTJkQD^Gu30?|5xio1jK_x_J`vAV>lHJpADI_YDxmXXrg+B{!gP;Ok z#BY$VCG5^xtflnTkHG$*h;NqkZj&7ev~^|Bb{6jjqLyNtd?g4(n`&b?0Q zEF;s#M2n}(s4@Y3?xVo5f)RP%EznpFI-i@i9OP}@n7kYf5NTk>O_k@CQf#QqJcCZ5 zIPxAKx$z?-tTRJgg>>(XND)n?_!{gwbUu*uC?B2-9$k1EM_ByeDtr#0XwM;iuH0tL z^Blo>M6n3Cm?b$GWiyjz4GN!9Crg^m(z468G>c?nCT)xs!K=`V1dV^vQW|bqzX*4c zXkrNjMtR7xc63S-+$g@hV-XJWRqa?t*yj0Z37oha`sV-uP+i z%xLJd(U?|V3^J2vh-k90IDy9%XO9o~@E?N08%uCPe=3gV#@rWF13!8K9gb zX_LgE S*ezB-SGn%nWXc}_TD*~X*)U?f@r5~6zUv3( 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 literal 341160 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 diff --git a/DSView/res/DSCope20.fw b/DSView/res/DSCope20.fw old mode 100755 new mode 100644 index 5071e7855b6e9ed8b3b5e7c4ea27ade36c039174..193c8504002ad9345e31a9848a7134f772580115 GIT binary patch literal 8120 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 diff --git a/DSView/res/DSCopeTest.dsc b/DSView/res/DSCopeTest.dsc new file mode 100644 index 00000000..9919789f --- /dev/null +++ b/DSView/res/DSCopeTest.dsc @@ -0,0 +1,43 @@ +{ + "Device": "DSCope", + "DeviceMode": 1, + "Horizontal trigger position": "0", + "Operation Mode": "Normal", + "Sample count": "1048576", + "Sample rate": "100000000", + "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.50196078431372548, + "type": 10001, + "vdiv": 1000, + "vfactor": 1, + "zeroPos": 0.4 + }, + { + "colour": "#009925", + "coupling": 0, + "enabled": true, + "index": 1, + "name": "1", + "trigValue": 0.50196078431372548, + "type": 10001, + "vdiv": 1000, + "vfactor": 1, + "zeroPos": 0.6 + } + ], + "decoder": [ + ] +} diff --git a/DSView/res/DSLogic.fw b/DSView/res/DSLogic.fw old mode 100755 new mode 100644 index f32f92a7d6484476f7b1cc144221386724d66a8a..6f048773d5211db816485aadb7d1818b5b8181f2 GIT binary patch literal 8120 zcmeG>TW}l4k+XxvgKrWf1n?n>hQYc-iDFuja=FMS(WD}odXW-H$&%%evK+~FY>OA~ zCVG;aMd3=~1Hjp4)m?IN`6AiYMIxEIm?>Mb14PWld0h-EKh8bsAO!%$_sY>)1Rucl z%nm?G1QS*2zOKBe-k#~{?&<02?ViPA?(Nk`yZ&5^SKOOC&hk)3ob|efvzs(*9cJ`* z7~RP5E)Cl(3@>BY%5aH>t)r~ZPq*&2TQm`3##G&d{)R1e=}|ztw8Cy&RES zbeQ|mF===sYAHR=`D}lGloMYp3%~TyS<_nx>tFoct^fE)d@&I|n)vv`xufU?@MRuD zgyjzzAI=`-2qF6z=PN^D*O!&6fW#o7IxBG#WN+m zkg`uOC22`((pY*`;22lZRA1DQT5V-g@;W1l|C%RC$bJQhc5sUXc4gKpKK*~0Z7a0y z?PkRnML-{F-k7gM(A68h=u^-&0b6uGG;qBF_X>K?r+2Pix!P~WN3rQr70QU%TlMC` z^H-3tqtafj!={#q-LbKOHFhK%nJ!hHbmY2JSNMhNmW#Vvx+*_v`M!?l^(OK&`l7Ff z5>?kYaCv7a;n$V>hN^)uWP*)0XLLxpT0g84@8`@JJ76Ked8Y`LbeKPH&L}nGmA>c| zuy+QQg*duO(&g)!({6$0(3CIwLDEsdlt16sNRbOwp&9WqjpWGXs-YRu0=;GvIE08_ zE2xz?r=)87YbBGUb4s(sENG{*Ouvhor3wjVgiR>WT4bSM3+p^gIziT{A)WV`zz3xB zAnOD}p%yG~WLRs(C+dCCDo22hr%Z-*T&K3*y_WQrn##o;)nffnSZz=@tBK1jY zxXq+)7v=lR*}K!Y9q$zDs>Lls;#MSX=E5MfP2H~UQ0vtOO~y9_OKL-8|K?7j$-(a? zCjK!la1W@B;q_`0Av+ui@9wTW;-l3>BIms{vsiZeqDR5);lG%ljan);kZHw7khskv zZbzcL6U@ZM*J-$T9~1W@vAJ4o84?d5@o|gz72s$v=QR)x8fXRgpt#^qDlS;8*iOQc z%tFmxOTFOTsG0R;v2LTd1&Ld$#T_-^Zn_9e7g4czu8rxqwI!PkZ-6aq;6tvSVi0rZ>Pa<5Dfo^KP}jy&HHzZ>?x(uTkb(G#ILU-YDs`(woA4Nkl)O+G2TEL9Id zYU700A=8j-;fwwu47Wjmp8#BeQsIjRgj;aG6;|$M6)J!}NCeU_JEgf=34_RMkPYJ` z=O@#V+4L;U888_PvEoKD8Kh5ht0-f0VRx;>{}yBkgH*3L!BZ@^5+zjHDcuG|geiTw zOBK0f-c3{578l`u+5ZCsr6hA^(oxHBL!4HW2}c2~C|`0aa6Jw156W*c7hdpOKyHUf zg2i?aw{${H6lGFpGD9$!BJ-4bYDF6wcT}tL#F`=1HSTc4hLmodhhP3~f-4{0*82OD zmI}(>yQvM)v3nAVY+_U23N>P#t}zf7HZ)0}TWp3G%H4=h@5EQNu$@=XX`KS zmOU=75;j}M$Udwga zwU4N~L?@=l%gF~4fT5^TkCVhTBS>47&`j0!Y#+)D7~wn-G)n*JiyoT<*TQf`$f!x& zyj!s1`kNZZwRM`J>aChcRWyxA#91`c>1@@hvVDFcoPFdtI)Mg9dUlTX?1H0J&a2Sg zJlgX}!?Kaex~b8%TVfZto|ezJx)ihRo3qmLk-?tLQ!pO8QMqGkcx`>GuYnAE=rCA4 zret11Toy4XzNG2#s_QzKnle>ggIO_YCWLAdPNbxz7C_>1sj&tA(834^VFf%~YvcrO zpwUz`(8LRz#D(JvSWlu;kQ*2HJ)gQGU?84{h>(7JZ@#}sl~i0S)08dtJu!WvB|{so zAX{@R6jt}D`vk6X?^Jm0zS!W6p2p#xriNz-Pi#qV#fZ0ZelK7qc4MG1XLz8AYK{pN zb;|j@|GZDXH$1Qx>-SyU+q>^Z~8mSd)&`I>XqR{8IkFbw)7IW ztJJMPP;jAHVRpX)cf1Yuo|LigTQAry7I(;<+S3HpP7%13Q{i>7E+g3_@U88e@a8b6 z2zcdOcwM~9sAXdylaedw7E`Y%f_^bIpa_PQ)8Tb9smZ3Hpet}*=q>3h^%%Y1ZbRMV ztl)V?J1NA;Ng>ZKq3WBy=-+^?D&&^0YsI+sM-q8K@kM`{tgQb=YTeHO-UIkKz%KxP z3Ggd`UjzKRV(*pvT>VPKDk>T0W>>|+>!-cCGja!sM6#NnDJPJ?eKr5_Dk^8Qe(dYe=RlkYeg`Ab{2d&wrXy4eSE== zz$!1wy{+v55^RGpWN^A>VY_(Bu*&s z&=k8}C2pmZos@2dW=|k@vFt8!xl5HXc<9cK!YyKTBxWMEHHq2dr~@5CkV34(J+_AD zso039;B%G5Q<0LjO02)M@7+^Ki>q-WKLNMXWoMRq%TvJ?KMR|Y=-^JF;Q^g#e1PYB z{Sxl|aW|pV7{+Ui?lRfE+~qD;i1gV>xMgDVTl40gL|vE`5bG$IQBBPl)69qwGo~+; zrgoi92Jx-jP*SuQA(Fgsb6Clieh7yFssdi8)yv6__p+T-RA2P%P@?5?ehy0;{5mW( z_zhS(;5T9E34aEb1b?Ou7d`6Fg1g6m8t%QgXw+;uNdF+R!0x~sy#W6#U<+rqDCwxn z)~BV85Q(gl{W6@TNLAL3dOT6&i(U$;vN=miBj}616H18Ie9?x);%Z10nF&Z0*$eFe zg^~QbHG&jXYXy<4G7xD_iAar9sh=mAi-#0J4Y#|-$2XlzlfMYi}9FFI4$89(WTbd`>DL99og1`7seY3N9PxE7zh`BP9h!oTqHCGQkOfpSJa`<7gdRUhwi#$Uf-m9Oer@5C@rqFCvh#e!- z3eyu8Nz&Aq7QG+;rBpy1o$zyd_^(fTP&;f~3bmHpF;8gDsgIMTjVn@)#zVY|Gv@Bl z_KZ}jX~S4LJg=9N_NDaJ-l3P-PBe$+YW18p1>In$F^}Lz>8JNMu7KR^dVrm_(-_b% zU*+=q@fB{eC08sgqyJYv1pik`*$e-@{2upWKdk&RSuK`|{b1y$$wTyczd?tsm;FY# z2eI{k;MFk|QP8CEWbZG65Svu`3bn2lox;R`wcynGwsH>-qhqi~Z;mVWllxDVw@D{Z zC(arfuwtpE3w3iIOg4y~5kEB*{;Sw&{*1oEK-2$UPkW3c8PM7ndmAh=kP})P8r$At z7>roI(=Y(79Fj!A0+<65Xew~+ZRUAvp~fa|;}9|$je0%Y(1tG{Wdqv4eZZ};T;+_&h&Z?-18*=8 zK+mI$FMMO+IOaG#Lj2w1pcpRgivbjPkfs+Y_Hb>`&?om#Jn)GJKJmc+Uk{i$gcFHG zb?!Y9LBgH}QN0D1xFPofG`2TA+|Bmk!fQeTChfXuq>z_|%E zq6bkG{7$1!kxk)vu$o=mp1K`P&YEQR-Z1$nO+H9t_!y1hLp08M2iit}T?pHX04xB@ z0IUEdz%vRM#^EC~wq+s=AD1=0mq5k|&GEcVlw5&=@aW|O_11989t=mF7vHe?yxq~^9(y`^}4N%;kOtcGi+eksAI=whQ~0R#&8D1c7{_JPG>li zVF$yT7-sezCRXPdwlbV(*Uah`hHVTpKkZ$_{Ehf%1@EW}$>j!u-`Fno6r%EpJFw5; z+lIx*Cn-;Sx7YF}BBsZ`KK0Fa;^T2;Tm1A_!`skNkh5(^ROEZ>S3}z{C8TV}zDY^;z)>Bo>y5=}6>}nDJ{dGe@*f5*<0vj4x~yB$YZtOJt;EPLvc@$Q~&OX^b=> zL7E^e)JRTWm=~U7+)N?JO6kG4P`!p#(neP@Mpx{kE6KewG9yM|#6Q83pe4LX;%UC{ z4wJfO#J|G=X0(L+zOZW~0(l8*U5q6DWt=D>X9p6U5Go0LwH2v8(?5AfmR>!xM)ide z(7V?Zrl}!x_^2;@A5<+M7G4DfQl!E?SG%WacU+_%ZsAEK;qvp5HRRl4;(1dC5|-sT z3k<~kMabzYEM|peahJ^))x;w{pA;{4MwBMOn+uy__<&_{|JU* zs13&34LQE<0w8o-VElP5Dy8am#UNgRdG15#2uPlt*w)5O$JelqbcYwcx&@F_u zUecI*Z}mft-{XBpV#x%IvtGSHdMy zM7KXzvPgy!X^6T7E{H0q6pzw!rv=!>jZcQpaZg#FYFg6?UbTk zC<=KIWGOR=urGYrsFp~>b0q?LiRrG*UT6gtAWNilg}|~*`&5((pMGqvWc)kGQvs<6 z^am4bmRiuXOQbWrxr+)VPpu;fHL;$Pq|u8Lev91xCj=?VdQZP=F2lt!EmQTm(zQ(W zYDXDdUjbOkZnRjeaA`NI6($Yj445!97Bv91kZVPm<}X_in3PIcwMLD)Yf2UBbrnS9 zzU#Up?p~KG+O5_b8jO<<#c|H@C0o8thzq%zeAB!tr15@~QfMA)`cyDhVkXdh-v#Y^ z!LM3HlM-d*49W3wBP}##HD|Ysua_I#URB}k3heQtbs zRKw5t&3=>L=r{O@AN!F%AO>LBAwKhSrj(`z0s$1j0TM6-i~&=?9N;wLY9JVxI>Y}% zrtmpax&PkO47gh4(Bi!Lk>b#jnYTo4)y^>eSI5QM2o!^ZiGXek7D^DpZNb6(t`r}# z`8n930-W@XFTA~9XXFMsUFGBjnuEDruW72eN3Pd!A)RT|R5*#oKW@_o`CJ>s_T>&# zi8_xp79VfC753>A1C-|)5&e#`3!i(6lC$f5bq>z$Usa7-zo6 zneXxPlXOa6f<*(tCape!fS{-l-nkqWaBGQ0X)QGhSi(w-iVo|o??k&G4~~v_nidVe znZ_I@gLL@EMSUN&GMIa0qJ}SyI`zD-9Cm(?D$Ip3*&b9PWs#Kv&MO;GX0D8O9&Ie? zX)Gd|jjKZI8&|`uN-fx-MLnLcn0Meh&U<$aXX|&}9j!IL zY-YvgbuH^n>y*}Y#I(LI@2*(?%r)_*@&?)KuBUVBOwD|{kuJDfT!_R)1s7evzWU7#rqo{7=IH(nFB=y=?0YBo8|qUZh+&jY2N2bX&`uJCNS-7CXUCM0Vt+K5M<;Bim%sFPqX4VDh6!9oIq zPIs(7X6?(~KfXq;)z=VgY^s2#4JfmsbsQZYh^wOl4xgQ>K&A~Vvto6eo_~Q%w^hM# zF||V#OczuAs$iaWR+%+8(%4zpv{g70G)-up*uZ(8szUYjJRm;Hjsr1z92nOwp@NgX z@I&CN_&S_2ABLqUsdL|u=pok^emAj;{*`WE?*Y6I@BzSwl<*P2#{i!Id>Xcps{Q@lw2xAXt~;eGDPH6z>yN;I0~iaGsbxeEg=^s6qKub?%p&+|6pdfp`tI z*cbj=k9IPzgm8U!Oe;dDIXJ!d>&N%-=O)v+cQx;0c&pWakz!DT=BtB_I2^09jFFvN02_UdK$BfH*0FgM3uadH+~>A zVWt{wnb>@27t*IzFV*jZ+wMtwCVO*6=38tp3`V>L??OGT21{?N(b&{3k*2rnDP@ki zcMj*7Bzq>iJvl1X-rEm18%ejHb9X1IBihc9bsXF%(A+qoyAh>soZUBZWYo3BV2Z0p z)e%~h5@}jE*`uaNufYjGGXW1}k+wv|+vcR(s4sjV7UIci_=|gnSeG?wKB_d5}f0Rh3cDX{j z4t$5@-aVVT4?xei(y9=j7mSC}=Wu$Q&OiQ2H`305`x%qz)bA_OvL$Ua7|Rc`<6crl zBi%k}TGbpWH?@-+q;wjjcsn-1iy!G4{bX=3xMjk5Z3Kr)OflL*uPTkzWoQ72W#f6) zHcGH>Q)`4sumLCRVrkWg-FfHP9qs$@Tocxt(8jKW8%J@e^zId2(jMG|32ktLV6*DGjudjX$udk$((J!-}$B(x_-`i+^i8P+Nd1bqSNY}QT4aDBs z&cXd7V*eT*>vFvCuH>~ol@@*B*CC^{WCEdIZO+iERjYR8R7?5{t3FH=gwx=~~s!ebEEZwz&%Jf^DO3X}P&Gl=XCR zE0o6490zUbEot)-tIjI^oL5j}UO9BHU`kUb6SAHt$$li6!HXj!IHv ztTokT)o0tYggAu2o*l}Xm%Zg=&f9T31;$r_)^g8e=AX{gUE#vID_znVa5)11-x1(3BJp^@FNJ@%sK@l zE6Igj7D+R#@L`flA3Ez>)BPr(rUs+yg^@rJ4GKuvQ!CeSUU z>-8&*^siK6U-4dkb|C6_g!=9##PF>%aBi_mW^;%Qovz;9O0eRYQT3y{k zFim9gkeF|Fu>WQwd^`B2Zzs`zNNL{oAkG+dne=~*wi(mv{PdRabrZa0?lJNk8yDXU z3f=~hZ;`~mMckiKR8P5?R2ND=n|a4Z(^LR2;XXJ&$ndp~qLZmDAMcUFXn! z%lT)z1^%R7IDe)a@mrPqRtx+YYXLXbXIDIskN+8~<+rNy7A;`kBJNKt>H-7)iIux8 zXtPA`w*FmvD=(`(x<`7q;pbEDhQ;T0E|T-fz5(~!7AHa(k^J$}Ka4OV)6LRSYnZJt z3z>pkpRtHjlbt9{#AC5y6XLh2#*HeCe;7QN875J&$q?+srloW&Yi)R}PvyX%PYgq#9dwxHtcu=VWN4dHPp!-W)DqVbv)zVW%5gotm|1dKGk z^TFwzx5Q{_O{JjJoWVxA@`TtBs;;*HzlrnWvyIzsf&vkvn;6{{RIp0GsZT>5436L^ zMA=~O8oAavKrACaXHgcgmXdBW60aShkB{_EWtS|XD@bC1LJE^c^cw}0rX*TB4D^L~t%E++=wH)FIW^)aQ=(PmiSVR_ND>d&TmRTt zVnfh_jXZX}#7WF}$P-Cnb<-!Vu+kcv+gv71Ab`@GB51|-l8@aGmmx?CnMe_mmC#&T zClhThajlV5Rt&8~DSODytJdor__Lu!j6WZe}!bPIhzE5Q#gX`i>8Y*pFS1gFOp7cpqbZ|lh z7g^0iyV{~Hae3ku2hgdpg$g9ov8%lfKItlOY3x~RPzrwHAO>f{pOLaA1^5PK%!UNc zJE9#OC0-0M9R2Bg^@6vRX`}UbXXj(Mr3@CsR#7P@vS(^otxSW6EEI z9)bkgTILa5(4~S&tE>h}r_JYW67^BmEmuhtD~f)I;z+s`sRHyHTPD*vBgsv2X(w)& zOfV=cWS;AUCW*;oSc5LW zU*MlYyQTx*1)#IqIStX$S@SHbosZ|Ut{a@#$-L_dI!`9HCgZ|2xuNVq?2voVvh;5g5 z`HBI_L_3*IDrTjKbWBp2F~h1&JJZt%ZDis&Zs`P~`qipk#<7Xvn^iURvBvKf&pg$1 zX(eqOEz?;mWm`|%zK!y1v79z}G(?dbM`aatbmlaRI_Nn=0wbi8IdfmvttKmFn=T2= z(sxlm=?54v>9y~NZna#(55vw}ponsxt(+Mcjb&*}R?VlgMV53j$$K-&^GPDEv?i7= zi|13<(;05a=;AX->bb|~lX{|z=@T7_YRgT}pEeN>tegEg}=jDgizw+(>&weQRl~-Q*-QSmd9e)i9{Q8bQ-~WC8nZ17P`ZcBC zeeb*UO{CzIls{F6cEa`H`mnw&&+h}F-L*^Bw{NRkXqju*uKoA=ck=H}UbpKX(oi`7 z)Yd*zm)f^)@A|jlqrF}~|Geh72y2PIcE>}(Ps(EdWdFbWp8YSK{OC*CBe!qAxsF6` zNv;&g?eO7Ed|D<74g zqu5W$Pemt2`nxxu`o%8$L6Kkh!V@1~HXr&y>~3R^{x3e!ESsnQ$}fCT-`rQ z;C*#`(;b#i67u@$^_BO1|Aaj8M0Pp5eB7^T$>ZuPUwPt*k9|x&b|t@(lg#pV!x~{j z!QT4b`kow$d%eGUHBFU*lY_mzkpfBgFDnIRn@P;RIxkS5Bmh-)e5@2)J-&LZ{^RPn zQd=oFym@$2ochk@v~_>j%j5fxYv`Tzo%L6){oe1ry#9{wcyk?}_Or%Wo^9RLuW)!6 z_*9-{8C#aV>W>c(%kqjGNU4+6brGdxrR|7A?Zd;HH$&EQ#&IvF6nxM6Nhr8_RSq^3 z>>V&8oxzh(c;?$u@GKPEym@#SD4^g&M$zG+99}<1!4rT|P?pY}$FOy4>-v0YYnCgB zZ20s^X(@e1kxp1mZq}Kb_;Y;{(j#aPv+dwQ-Dhyt?Pp;-E+d)OM-gb^F~jH@L&oG= zL|c0Yi4DHd+=;+*M()KJ{6!DK74a=usSV=5MKp3j!5*-TXA&4?Ga3ZWb3f_M?Nqy>N897-J(rH0bQ1}$rxUBa^ zVnQj>nG##OM?yNa*?ZWunh&A9`l3k`GDHpb4uncLaV+>vLw!NsYiD>}88swzfhH@B z?P(}SNF~F@rLiOEQd=u3A)@KX4n6&EAyblMHQuoftEH^pJ+BBLD z%YJIoG;8vytQ2LUxlLiREVC?pv>oc$(E<*)7Bc>Ax`q&VDDN->)a0cz6EUgMqHVGZ zo+kJ4DmUUatIEqxYddJpOr`e`NEiN0@Y-Pdjp;MpR`EoQA$jGelWk57rHk4S=aD!s zK-pMIicJ>7Zr1ju(hY^ua2a;=cyXD_sP4G@uRUx4B<-XK_GDtkO2ycfR4YRtXtbEbu>+vBnW|L5*3iWH zGO->;bfl;fr15lQ2F*dAjaHbh@YQ9Fh{W7AkSLP2%qQ?c*Vf%E*Pe=Ik=Cb;D3o}l zJ3TaziJ$kwpmLN(51NGTA-}BH3&^7-LRJ=Xra|u4_#H4U;VYT1w6o`Vy)xMVr$S9K8&&W75p(xlDN(hzeky^z+a_-q%4QFMO>sIgoV5iHRw5QZA&j@T|{F zCNr9!jB|>oPxAx`)GS?|%zTHq45i3!I<-uurByr%n?CSyOoKtYhB1rOVshi=S)+dB zJi@)7PrSw}*Cm54AbJqaByKCK;Zus~d^YLgxl5-3lk>i3MrAL;doR-|?IDc#l)2mE zJO@TQZ3^YJxN4ZqrS2ti;yNeR*=$NU-O|wwV#8li>;Bm+E5%9G%)&l*pXb$*jhG4D z-p%WQStRP)T01`)I^7~lrO$eJX2p!6ow)#v}3{9o;$tWICqXWID6f>o+d1Ss||xEyCJ+Z~gB#vAQn4@Tg>{aBUCc zlXSwR;FaswuiugNA?xFfgfRw7`+@cY>fA@Zxbm*OYj>W#^Xw+-)Y_$h0-?Z>y7$u2qF>gh|%P*65`-E1ABF!C&-`XHjzou3D>J^bk9@(@+ zC`7}LPu4+_)&N~@9vpmSSikw^n<4KXsuSPE+ zJAYyL>buAApMAFw|MKvRbfxeA&EI;&z4Wxm7r>)3wMx}{@VjJp%~z9OmK3S_qf4Cw z{-YoNa^x8Zpa1aR{l!1{$M4MUUjAsra_}NR)tX^6oScli5gM<17a`pf>%H|G+P}}P z_x9vtw2ubctH*!gSa&@H{)IPw7w&lVTF7x70a%mJ@8$2WU)1Q}@9pIgjRn?$a2tOTp7mU-`XFhG0GWwKEFb7!emN$Q7o8g|*q1 z?eOSedI0Qj(S;OV(>pc(xS&|8hh*wyr%X~^^q*zS&zw81v6Xj%9^gqCN+H-`+TePi zaepb>-g#j1F;LqyK!K^x10ge(x0zBgCP8Gu{~+{ZmJ5K>LE9f4=@I{Yp` z*6R92`l+KA8+FpsXxj#ONGk(h@w`n)tgF~} zvZYO%)Czk7t}!eKK{p`FNR}7W1qnd=pbgb#l`3{@EiwpCX3=cnM6lC(Z;J0MnhWTw zctWhEa6DEqodbgk!GK@o!!+JRlvSJ;Ik1!TEZ0cDng2f5X_4n*9ux*Sv62LxdeC7A z1mvu%)lqH2*@)mRG~k2IEnMhPBrHNUMYzyC+mzTnOC+p^bWOmj9MEXOkr`u`!juom zpos$2!4V8yiUB9-9keB;A(EDngqp^5 z8ygg2vlPM|KGJ2evNQ{JW03c%shM_@ctYN!mu53Ql%7C`mQXvx?zR8~C^-HuKx1PY!+(Q@7jcMHKG06lHnGb1fg`ki z1|9|4C&0Gw?ZgnfF??g1up@f9-l|Ix&^lx;amU1ZBI&H)@w)BFq(?2}Z`IxG%;;3F#6`SHwG{%rM95Fec?qP0kt67yrg<`O$7zX9V`eAu? z!Ygg!I*XM8{Gh*XNVdnb7cdfY$;TR+@AN1DF$@uM2E` z)v8&iH+Gt=CnWm1xivu~wyq5`PL-aNwQ+@9 zuNaEcOhJA>^*z)P*ZS^~UOPi-e@a1GTJ49o0dbvsFsLA1OXYPq2AI^wZJckzddH1v zkeT0cV>j_d|8DGg9~e}_Ef;fK^qY_G-^IMW(=-kK|G#~@yqRAA6I@wT?a zm=HMz5EsCnGsloKQ|D9R#fWXxH3GhVQ@q`VG5K^>Py8AGHrmUdW>d%L8%_0}0_57@ z>DBaVoPqOmtG=G1$3+5!S~A!WtWhI)0nZ4h3jnXPW#&`S0-`d+l5-QU8UY0wDq$Ys zP+#yS0gt+MIl`{Bu~CRPZQ?|A82q(k@YY1^=b#jjv9iNbw^J-WZj=zh3xe1;-{6zT z;|K6JV;r826L(H#yqIH|THOT|>x4R>KnWz`BnVBE#RfAmfs%4;fo#I5M#4?mjunEj zoR2lqB2ciaOpa2sDfGcqqmasmb!r3sBw*8&4NlGHLagovr_^BsjTilk@oGDrfjx5u zm(lGIBy%5pqZynV1G+{~G`f+?YoN!;*6*aRC{pQVfb_jJjV9JjcGIUh^`&&n!vQ$8 z5T}&H5!h3eI5hOQwJWmBD8WjAtRg*jr;&_C$W3V*Dsw)`k*n;;iv6R^;jk$`4V*9+$s9eea z9E{i-P|>chwAXcupO&%lh7S@;LIpd@mnA7^#ZI?E&;vSbQWhL~T1DP`JPDvV;K&EkxPvf>~IU}y%L8e1ItlsZh(Vhnc#z!`L) zMvaq}mJn;Flr%UeJ2_C!iOC2KHeRK`3*b>DnZiS4GJ^?e?8N(UiZAhKF~N@x&w0=> z#Jy_w>S^Mc#a!*D955w?Bn5+^;3%mVXQrmA7gIYe(d>B95tN|YVP?wfY%-1Wvbacr zDcUA7T9MTlHOV*rA^7L2##J?|R+JDnSLSAt74@9zXn>E20T>z`iO>Vqi$1ENCGU_; z1TrnXs;7Jd_k_?*q%xnLeUxNimm{;XnrBf@@>x(O<~jNwCheGGyUfD|Wn;jBwgz=k zUiGeqg;8k1M<^?0WjN*A#j?!xv~MO$SvCmJ(ITIrs#0mR9hzn&KsJQqGvd9}6Yqkp z>QX=zssJZ&X@8mddgkz!%({u=p&Q8PXHw6U4@!^Z$#GxWy{i4f;IHa-n#baNo8-v; zGh}kzZQ`%m4lfIi5eQwu$dm^Si8vf^1vY*}klgo{RdkLj+|rp^{E~-Fgh_3cR2VJh zM6WgnM`TttlRC$WeXT7|Kh;cGZ8P9cnc_GeFqWzvxPjQ_R*$YbQuiEjhr9ZGQ0~SWRx(Uw8S8DN1 zK|CRa57~WQFDg^VB!O3$0S(PPtrqNoc$D}nK0RPi%f!<)!)(@9ANF%CEx+3WC#+Xq)p^%W1upJv^;n9&}LTVfsF3Dxp0@@L2$bV{}hG2JJ z_x|-!UDEkSlUoet|z+-~K+ezY*{{jBMj{X&-p?8$lNGQteIqtNr}*sCzi8duEeJ z+wEx)SX&;s5i((%$lkSE(%r&2$YUS;;MJ>LclD|<-}}At@^I~6{VQzXHXtvnHgUcF z?N6*fp|*yf2MyA2;2{)j2tbD<@~$nf$-QgI@b6Ca?DnvJOfFq2%YXV$%kn3GaylKp zlI#sbIC3CQol@|{K!KiqJzu)I<1a9tfA&KT`<67pcF{i`{n5{suK$>Y?%|DpP|1-BY5l5TPb>)_Q_U+k}6 zf90m^yKTwi? z)5js()>Z;T02HmSugM=M)gW`n-m&|r6UPjk{RPy$e*Lnn_YZF~!wc@*=gMTbntLAqj zgU@0jhLs&=PiYiUs7Yg5R(ph%+2{{}vY84y8s48&0J;vEC8Tv*2>@0uVJ%1Wh_oEEBDc4wyR1YZE+Sf=9Wd0DM~o*8N(#Vhr>JdZ?#V5Yk6c2i z#wc4ZPtgzw4EzCJ?T&TZ_`(mmAxHki4r#DG>4TZxpY z(~QsyJq!fG#lwbb19UUox~@FRq5$gcfdTZYd$9SFp+G3F?wO*l=9U%w`va7-|dmy@EL zq(tpPR_T6S8BKCMG%K91MM9;HHg8NH**-FeOW=)$8S$pClc|GQ;E;J}4ByY2nZfNA zQOQE$T^Q!%yp5ID8^5~1!$vmF>hzgSt?V_@{WUBUACB68n_T}TMlL_``e=@#9{+q>6~s8_MMh}0ZPfUjM0~? zURjUf!(zq6Clp_%^SP2OGPD}v2-6e_^FizCQ%5tc>M8Um)1JPIlQBLd8jY$HH|3Og zG&OyY+Oxdrvth!p&WnLDl1CFx*v_L#Rxw#nsf=%c`8v2`gDBPgMtEk`Puir{gLgU? zIR?tCNJtUuhqGelwJc!nlnzr27l6+MV8hH&AdJ=a^{k5*(hXH)jTLKQC#_AkYNyqb zV=>7*sdTrElebJsFpre0#f&l3vTM>a3uc`1?a85syVd5rdJKc3*ycsaPRgKR=Yc&M z%hs(9*3?@#0h+C0LoN18Um$|(_8#q-EHWR{vvt*Y{E~PRx&v42oY9y?BOW`^P0VeI zDOvfL7hdsR*<&++LxPQQ6lCsq+!*Z;h?9(j;}F$D9wC~JCvR`a4ovU3b?H{Xcq`;NXFP&1$e!v*wtV0N5}xrp*2BZ!($%=Gn{_3u zkIG!?S6iQP4ZV%s#;Co`8P@ab^`VBb!k*34J`Y-VAG>G_Z1|ueCOcoMDaEbiPlAZF7nSO*dNl9tiAM4=nJL8CBr}G%@2&pzgZ z&3CaMVtyg!Utb$TzWVO&uO-6=hi4ueb3F6dwf85K@FU4Tksv!Kzj9jcspEK{jlW0s zDHfUeanv*$me|^xl#e5K^0xVPl^eHG+{-VooN^auOixbMC$Aqodn#EIrWx1k@4qVL zRdwoYAJVGlKA;Ictrgya9~~QuAwBw`AccSzzHK8%YWV@Ho`PPV^aoeB6#T%3g8ltd z3dF#aKe6`{Th`F50aU6tKdAL!|0W%62I1jJ=<%^8`EMQ^XgXnkM|TA7gk-W`@%gRD z_h0>^t8(}Q?^}Q7GoQJ>{*KM)8*>iHwY~M5>(6}jqaO_=YtC)STU&R!l!6zv4WQr+ zK;xi*mKke*^ClU4wifuZ_IH2x-k|aN74b;H`YK<>9;TO-f<#6NgfC__)s}*rpiuvV zC}29)D6tzmczC63q1-wiYQu~QHkkJtT92;_EFUSddN>xH(Kn=ww6UH3aIE&>QEw5` z?8dzX{@sLIU%z!+u-(S5WBY+nZW~XBih@-mG@KfzEy!#4BG_%4jlFmpZ50O-`xfrc zxs4fZt!y`qOO_;|naA|OjKvYD&lW-oJcgTmrkll(uHBUr5cNYcN2~)U=f8tr*Vnpm znuu0%3=0vb24AmfW~Z`qdg%eDpV(T>t~EIYigTx)a}GV*2VsD!B+noQN7#lw z3p(%8Vl4q$i>wHlt;0QnB5G|#loEq4SG~5|_OlB#TOCIODMK+RQF>AUBqyh}>eJ6k zv;|^~cpwCxE8Hfo+ol;a?6d$;pz5^)_zNi^90)ycgA>DT9An%z^g;GeXgy8Hk-45C zA;y|f>o@Jkz0YYpjdf>9ve1)!Uh2q%du;SjHG~s^Q;1N6Nhi)?OAiSll~exFko&>8 zyr-!tJ40JvlAsv*0hhgyeA^nK$uv&M9n-kcx?onP{Quy1lJ{(~@JIQeW8tp5NezwI z#QFhnOHa2_IYN{)F$M*@9L?YgEk%ZR?qRYk9v9$#0!}H~Wj*oYrku#lL1&TGHYf(;=csSFZ?>S}N+*kA@DV!i2nNBhtj zPWLY;z&he^_2Q)nA)yuvpWvUesMC-7>y$3Br1KKMd8LOO;Vd!hN?c>Judu-y9tnvw zW(y|rEWNVMO6{~eOwRct9@CJb88acWIM4F20EuqZqErH*kJx+#pAB6|?FO&JPBrVXp|BDRc|6{>V-ZO<9LDJp@%KpOfI8op!!EWHh4kGqcm4o1?jRna>aG-^%R(~mLt zY^c&O=HwaY1G!)+h$b@Qpkd@&Q|7f>!8I$b6Ow#CF=d0&B{8M2$Q3&aVpiJ5nSLLc ztq`J?tjD!@Xy1j#SXTFrK#(a|Tpm@I6)&F7i3bgHOBGC&jjWN#iH#gQ95;HTO~~m3 zYTfM)J{Kk#b)$|z$3*vFgTl&#phpzzr;+WGp2NV>3@gh$F;o!s&rEp(didZbD=Wvr z(P-*YJ)ousbUAehI1o44ViB3?YGt^mspS&o5K>8 z9OHS}0T<0rLqt5gFo3z0nNwC7%#1U+eUr7b!O~ndUk!Sw5>4}}rPYn8^EsF6F0wjH zwE^1HD$AuPC@Vf!okV3^mJtM_b}r_a3%)ZOWEoLNkMf1I^VM$o_!wwt#+;5;Y)?Pa z1+@=XL+Kny_?$5-))PUzMK6XXhVm0W0RtauERQzE5RMwF?vp%W8mI>bvv6KAOVTXn z`-gPyv~X_Vxd6UYwx;*c=uigp2P^~^z(L+}OO49Dg(nv%(S^(=J!f>8VI~U)#$Bjd-as9xTa)+QFrl^RKr<23*@dx% zG)W)ZE@^w-8C<*DrA2BcuC}WtNtSKOOw(0aw(~CGf}m+rQU&clfRpgjG*K51rD1yRA!rw@@gYF($5BWe-Oaz^ zRwtYQRIaX#_$l3>8~_h$bMrTdXXa?)VqqDA#MCH3HANjO^8?;ny0K6s-qSB$1JA=d zZm4Rdly{(F(Qu4lkIplHQH?q`6mO)zaf?*g3YWuuH$_thOqWp8j4`-K@s1mpf-a8R zZpR#D$h2dOXH!-AFrG^tZB!Njv(v%<^*i^+kp3f|dsM^s zHj&rl>I0JPQb0k0k_Sgx3~6L z=55H<4l$9jXDJ@+8c)V*BXdMBG`8B>A8K!(G5*25aP)ljoCO|?e+>Ny$Av|1-8|ri z)QjnMOWsoQFbXc_R{xFL!^wlf&xifwNWrZK_2Mu5^Cv#AIT`CN*k6**o}HZig;%4e zqR&3z-g);g{OkAsioAgRmzY9cpd4=Gi8u*M$YDn_vA!&Kb#F zc_#T8>CaQ9?&IS@Q1YcHi(pgkX!RoLx237Z{lv5D_0>J)-r$eE^K(y93B4yrHD9mN zDSP)s-i)~e$;iLg`n`U54`rukh8sb7H^9D}T%x63-h@Bcx~9R*|CpINd9`s&_G%bE z>Ejykou8Bbjmz(S@8SNTo&<*iHQwZIaU#RbN9iFad(Xk0P(1e{DFuW-h=TP?>zDLg zszT8Ay=R@J=-jqw*6&%rN7j!A|C8(Q4kuXMojZ4qkF_oKzgy&sJhivK1$3~t4Dm~F+%)?g3AI0XgA#*=Qxq8_whi% zh@IYfuUy{hLbnvi!FW>-B;U~zRb#96E@Y84G<=t-USkB8;B>qq`^i8TCxm)2J&oOK z0;h%o`P3-X60x{>Hc$qeH!3_Bk;rZ%9$>TJ)sBzGD9!09sf_qERBwzNAr!{@uG{z@ zV0psyDZ*nhmGlV{qmd!R;5`Mmb#X2g>d~BVu7!2brl1fTu^#CWmsl8V=!nKP2pC5M zcC>=2*9))eWqc4~gUkysbN)&lvOR^ioMS>1QtcgI} zi}8>{_E_IbN^{2oRjnp);goGiEIFxE2NmwB*(&nATf*WAuiwU4vQ` z6zm&rVHUtENtOOO!7Wh=M26H zoRtwX0)K_!XCSz-7S7=C8$w&th>L4BP#~cVH<_8xij9WAH_DNu)lW%9W`l?>hEo*T zv9npi`8Hye#e^0hB|tTTea_%gR?EkdPJ@sf8@0t{jyifhK1x#(z-67f8N$LZB#0{- zwsLLRBe7_(k^pKGmvDy3+|<@i{L=R&55-&QOOm*rl;hLm9br~;E&Fr$*I?bldz^R5e#isd2iT<$!S7K|5GhQ?BWaI6pauPusX=`)$Qp#$=mwgFpsr zEAgv(mZf}x>F2X4zpIi>`(f74nB{8y$dpaYgdYy-C2g3Wr4hJHn^%Dyj9_DUj-4-K zmCpTy&fo`xQZ{ASbz?H~aou|;nCZ_1?SdEQy#!@wcj%(7jPl`e6mD{Mcl z__-cVLr?jg8@Qq1oA1`UT{P;WpoQmqSK>N;lW6cTC=4+hoY=&qtt3xxy;f;`!v!{PvW?lwTt)y8pi8Tq*3^(vl=enS<|#MdEnRIo{;(#!Nhwb-v_{%R%KqDlaCC zD1U!WIikZ5ea2gBkHT-!+_+hV6S7A#z2Sru(cS)!^2Jk>3g`A=cYQEjDk zO?Cw88>76>S=>{3|1?W*e6Z{;9fmtvcf6Dw~z|`ru`?_qpIQWdY5PM1-|6$;`!^O2M;NsxpN8v4gQ>q(B|l zuI=w%dCjcN8iH1w+BiQ;u$J1JdcUZ3sDd&wJjZ5`vzo{oicY{rGrvcPFz_ zFq!2#TQkys_suUa{ohd;`x#U;`NfR->nF-_;ZE7WdfL-S zfd_J}zkG8n2^so)zR=v~1A_aPURd9Ib^o<+ID7BaXP-Srfd8H!4K)m{qKOU$UlsOLbG{1S}@X8f|3pViV;hn8h?K|4p_rWi{kjUQtl|zl#d$lZ&Y0?b^ zoRwB0!tTI@oDsLv{@(Ac4-fQIIN!wX@5tUN>AnnT+!hY5AHTSjL$_h0{RUk7gYSIx zy87NY`Gdf-k3T+2uAl#W`FRb8^e?I%z>U_uLC?946v&1GKSrs!H=h3;L)1LDcHBRh zf*0k*7hk>pgYP7fmK5r`rJyXwHrR%1ny&|$*A)KO#DDMXhWvx%15Wb4mGL?K&;QIT ze@_1DSr45<^q{%=T=YYnBdh6~Zj{ntN-++FjM&H$rZKuMg&H+59e<-+-^g3=q*PzB z32@3>faZUjz|vQtHRSPHL}YbIWq6rI_>@8gOIU;%V6rI&j|t&pu$nCJ0-U87{SPqv z5Vk2_-DIr{FL-K*(^Czk5xeBYW+MxK>jO2YJ##jSqFA7vFheymWdLPXI@XZ3y>3%QZ8G$Qwrc&$$B ztyd}EddmXAT6|R>u#6KGNrdx>u^aiRAx~FV!Ut^Vki_P;=iwtF-&hjbz-d8B64m#_ z%7;j(DqKlqk#D>R*f9slF)^nbMM>4FK^Jc2Dub`#0XEH|vOkcONb0Jb9sR7zbCh^8 zi?r1xDu&8|qmhLlY{Oy)BnV(ZhS%?)WJqIDB;5NUDc^{uO>NK)HRzj-7cb z2s+ri05zTNg6JPhPAQ?a%Pdkb$Q>tCd%o|?S)sKyXDdHas$Ei=UeSzWb?^x?-^9dr zpgQfu`ayJIxN0&q`V|$N6$Wd&8#Az!aj548Tc?2oi!v0}Qe8 z*!SWz;6X5Tv|`7NTMT|$-e^kS8R-iYXL(QeERhp)+wp~>FK7J7qhkfm8oZ^}U14d@ zzC=}C&MH?eRgTZvqAkROC+R%XSx#VwE?C$Y3v_far~YlBR7a0E7QSOHaq*=l(@m=) zys|5NfHYM)g!0U_O)*n4^|xK5&umI9RcY%PrEcnK(nnHF86O_WrOdM-j^@Y`wxYx**9X-i6qHL$=K%-=ocX*QCrzrWX_lZjo#`#;hPJgG# zH=B1rraxKVwiDZds0L%r$@hf}p0SHOq;8;#9Ign_h})@X zDg7)Fi?c3<8HvvxD+VZEz_Q_9WOF+=O!&+L+$c2+I67uRO%4iM_i=CK+)6< zV`KssC?QqK`H+~)l{y!#?2^x-R~$Ow>FOw}r)iCTHcFOJgjPJOhk3r>{-97pirxTc zSlFYfW9N$ndqzw&eF2F@J#e4_%{i?r;`y#pLMNCZYxz;rx@lwMr{$uD3t&37h9~^s z@5<2pXk%ySTqi?|{GK8AwH%u8HEMX@d)2)!(S$mt-q`=O{`kQ<`~!sG3jsa)aBm2R&2~bo5b|sGgnx z(YKiXq7@xxRmx6fX6bf%n=|fa5zS>re+_hK&UctVFg8S#6DlQk4%<29uy|nClo`Ly zr*73OCfwjn2`*-TT`$N&qn(>%l}9sv0G1z*?Ws=3pg< z_m#=W0|idVMvlf!JuRIvUvLR!Vr$p(RRA2Im=YH^#&cxMlXeG=z^?%q!A2fG((hW| zaZ7dWm&y`x{3bOdkpB=F?D2b7&H0WaR~&JWY)rv#(S%#6q%1~x|5kO=5q0Cnk*Ixi zOS5RcEqveuNpj`Nzx}t5+_)iW|8H+-cpCn{N`%- z)!6^(e^sknxLD&5P2HDmhY;^9~rTCd> zMEI%8&**Q=ei9w~@+Fzcr}myn{)k@x)JLDv9fx;*>MuO={{Pp!zz)PM{GLqAUuR&0 z^T#nyPF{KJ`P)JO8s+cj_gqiz9lU>3H!%m?LPf~Qv%niK{u*zo5ng#k zDcDb*etJw#-u;6;rQoHPzWv)ZO>!*`Nww9+JR=Q<2Zw=zF>Ew@%0unT=!|KqFmE{C zOuPdWGGa#;>y{8Q8l|%xuJMg92AP5si4?<_&S<>8H7|hM`gvL7bQ}o{n62MNs6A$@ zi0Q?ij|lDxv-cs5hd}kI5%8!TfmQ7Q=gAHMrzDMe{g`ZHQRUEi8feu3D{W)3?T{L5 zb5>*@`IyxtC1@CN0kYgnaonLyAPRY>KhJGzb zGF_68-Romn{)PeycF}zxiDKLqJsB;Jg3-<`aVR#;s}ybCzrhs~mPV+hJ@SbkNQQJy zk8cE=)RL-~mA5;2w}Vfz)n z78^mHHaqhu&7q^AToU2Ho8{&{-a|p=! zqcFg0%P7QZXjc&c*}37^1w}Yz0QxD1D0Ltyk|9bHBs4_bnvW)zND!4Bi1gYHan4T1 zeCT3Uyn|x2xeO8wRLar9<=}<;On7Vfu>Myb9E+9Mx@gjxo*L7T3CH*iTX}{aN6Mq| zk!LBTbajbXJd2?&Hb|464zD)8v%{2~70(%e#!@qD(*=~Y)=bRIP~uAOmR0Z#1wpKbblA>!a6{OZ zXl&tZA1)+WB!h z3D<2^l!IcM!uT>n(k3p_j*X#C_e=mMMoHlx^7=xS&{=}2Fl-XdYPhO_FCkFz&@E+L z!fa``FtfxD+!i}9cFas5$6Dc}MZ@>jQZB9WJtvSe(i?}6>1T9+iV_e4g?20*pLp?3 zZIF8bH6&T~PtdgM7LD`p?+npI;&Nr(auVCPbfi|Y)gC7&ZB`40BKB$FGW7qmlpChG zMZM&%F-{UYDTgWjIQ2!#>G{&8?1M~@ro1TICjk@O&bcRQFD9Bns6=>RWc=|k7j_{8 z!I_Jl32qtansNg^qWp}ogf7qtXCbR71xKmX4X9N7UqYi(G@zc6JtDmcDA2HiBBHOm zh+PhLb7Sfku}wJ$Vxtzto#*$6>^ebmcXe((d@vN&3Y{GjThx|0kJy9;A3)Q^ z^f$LqaY{h)l^)WM-E2}%o4hv5q;-W`7R74G>^&G)an68Q#I{sl2JrD4XWHcm#)!4j zu!pPrRt+t$+d0DKPRz~>H)C;$wVuYWO&&P}U?h0TX0HL0DLK+P#4%h~#T;bIh|8Fb zc65@Ykrgg}&Z|uCyDH?e$%)%^q>k2maw+iB@|2BGt^btI2#x z|4atxWHO)}08KnhMN*}s)(|MrhUKp4l5o1I(2fGd(zXMFe6`Ro=2P8KYWoJpg7vgS zlC*5ZsOk7)+7{!@!jIU*&wYh9exTYtb3c^(!1BxzHgR!EMqo3~(N75_BHO!UDNv^` zCAy9)${ZgswA@0TGVdmS0a_pE=B34N*;I|FRBex%qhfO#)l`nq!5@j-V*b8-lR`?8 zVBaKA!--MpUW9!Ahq+0vT8$N8T{q;-YZ3RynX@c3;BYJ zU3K;Q%-xAnEdSNGpsJNbQ{KU~N1`*vLT{^8onmsndr`JLbSq~;TL2clmKjyKkj z`Jc=BY3wzQ;|k$eA0u6~pg&L6&c1tIIESWOE2 z?|QNBo9j3J;qXtAmtgSq`lAQGdRmw9&ZxeJF9^FrdZpm_7+GjaB2!C8 zI@QL1HTq@v{;qr(+ed2uiunHS-*{%(G5j`K`~FjZ;y)ch5 z7Xe(ueE8fyJpR-*9iY$ce?r6d_U_$V$6v!v5`HT7jVC!`py6Ctr6nWcYBvRVQ65#B zUu%8!@c6ms#$Fcru^+qnW0vs4!~K2L%|CuPVmQ0W=^uR}cf6TGn#03?c=)O3_H;-q zPXd7gZNF>7AbUD0uW7JSFgi{tcoC-5n2&u-J{BlY55UQgA5$Co6ABV}{4ivUwl_Jg z*Pqzbb>zvfan-b@x0%(sPTu)jP~0cKsBVSV4mUSIy?pW&^~Vy3SLglk&ijLQLX_#` z;C*sg?L9#44|5~6+CKK7XWsc+bjdjiuKaN*P((Cl*f$U#JnG*Sok!VQC0_mGoy;6J zmaQ4kaXAAeftWD+>2ENFiI-RnH6jiR+p1+PzesB}l;yj}@D;|u!$cTthbvO=E_8S; zkJ_LN*@9DySK`Ca4*`lh0-3@hn4>Y~%>22a@X88ZY5Q}*q_pR}Tc_TE17-Qvuf?1% zz>N_m2#t1=ir1WycLoj4ve5Tss3+U#=2@P0h`-k2g8n) z2K87=^|l~4Wa`h7Ih<9mRNA=E7o){}P zP_dpDa2%%15zP?wRp=S&_S@c;ARY>{1c4u(m83YcrPaRfnR;rl~Pw zTT_KCpkIj9-AGsP5rs6xKu^~aWd-aOCF*0v$)Ae7He=;RuNkM|sb%p?PR{u9u&^-7 zhp|s)%VomGzIbWT)3Gv1Z8Ef(MK=+Z+mg4oL#1aUOB*QYxIi+8s5r~Ap5L->^;lx+ zqjYRm6!3jF>lUq>m}1ZY1Oxeg)m04?W)0F&&$yw1Xu+ug;0w#cpOr|LHy43GLAv!C zb2`I#dcZF|(w{H*1!$>kJoGwR9H|SjQ(HEclbk&S3z`dRZ=C7j4R0wsE6}vFrjF-P zRnQ|-5{N;1bTqfF9yj%+NFWU#WuuINx|Bz&6_P|~zxe|%+6$crtV^j{Y0HJtf|f?l zKbByyMn94VciA|{59UAvaZyLXX`j(GHNPQZ3YPGuR#vMh;v65aj!SyiCyIjGm6Czz zK?eP3I+kn|uH1%l^s-B0LL0`B2cKny9k-UM3Zf3&F!U8arox)Mc|#L z)3h`Aphf#)s+e`BP+HM}Ps>8y;!@XezJg-|8pd75L{2;M<6D-+tgDbfVd8Ej4sozo zwu^0I$5GqU%34$3G?|}O$)a1%29~-tB6ydr7@YCaRNi?Qx}sS?>S%*)PdKDGvC8pn+TW$weyfMP!d-URS2q5~X)X7V}Ua2!a!?=s;pzMw>i_7qc@PyT%Ar9 zE8UT4Yq#XgMX5?z&9O?H;cHuCpiM^>qF=&CyEQt~fbXn`(G}6;y+nvTRYXmIF!>@; zrbxdT@`d3m@;tH?^3bYt^Qc!AkY&;|%dUeIPMEK3f%F&k{0$7Of!+nGwo18Ow@*3l zoDM0nIb%|r>mo4wAWG?g6{F)=C+Whlqa=&CUd`daRA(ri@_;PjGkF`KBxMvcRp_*p zW|N|hQw}n%x@0yay>a!jDI+V3w#p|+lu54#!k1u40v58J1O2AE)@=qs!>PZeL!AED zQIg_MXh1&Tu8TaI^pnZ7Sc0FFnT}lSQuy+NqZTpRZoY=6v6mbmV*XBQ_MJ#I)HRzS zwRVxAJCVvkAD=6pwnA-QNX-EVF6sG1p6Y=GPPo4f77|5^p^mK7(Tq`|G+J)Y z(2KDboRFGFOM$|;ttQ!!*Bn=&K^@cfbegNy-Rl;GDazWUOoT~Q21d%3Y+vR5uxM*L zuV?dFKaC^m6@lv_=+2gw+4I1b@F4?mpxx&k8y>EVA~!eXJZ~I7Jk6){y>f0_MNEVN z6`$f~t&K7^D$0%{EUxDAbQsxGNx#sORY{X}bGU>)Xrr!l7YU&JDPf+zx12)pUc5e> zaiGum9j=5f;4iU0pH0mo41d~_&~g^)!$E}w@-erI_aP-W<8xfbaiy~(W9jLPT53sL zQfYkMT%_RWNRE!2VCa9)cpqt^OSjZ7H(8=%U)o5zmq(e}l8!7$tfVZ1OOLrb#Adls zAc|vGW6rV}?Hji)g%U27Kl&d#_-}6?ynOKT&)@!=w>1QDb$3a-$#(npQ^AFd9nPn3 zg0Xz~AN{IpzWqD5|5Nq7{PN%Vp)vHW&4Yv6fr96M{`tSDDIZ9IkxRF4KN1i<`Q-Y^ zAo%&Fw;&7vxLPOCM6yUl1SpCxV8%M8lol zz5G?A_Z~U_XP0wH&*{vcdH?g~g$Gf??orUys+9d`_N(s;A4;RIR*9bNk2fDbeEqPz zGM&c$duf7S|Mg@)IZ-_0SIx(tK7R2!w;3nL$@(9Zci)M2`xYk{H~!^g zF|x<5#nsdApf8fK9x3>R>JMK#*jrzx9}ZMsjf!?dL3&ET$@=?HMTO zud!njMJaXJ0e>&Y#u*a`V$!i;$FBUJt=n6frH4d@sYfwS>`o9c%=sS0= zuYdT5&+;7}A0B`H%~8kAckk>GeaGQzfrI4IZ~Ti*I=;>y;f*(5eDU6gKYVWt-;{8M zEV!P0ay(&wk%F5tQsA5nKm5aE5t`u$*lO8XRPajrj>GY*0r`#J_?H{xm)`r{>(^9u z{+?fZwBAx+4EF?FfIj6_TqslP>tSSW_)#2x3JsG@6I>xaxVA>I6`{!xhrmR5Z3Xbl z(cXB$AMd^v2^qmQOzcQ{7B5(Aw+Y{h&n#3oFF`FsQ=Nz2ZheYy7(HRJ8Qak_zChu` zv2r7!8l|g%5k^`deoV3r-q`lkzs=EaYe`I4t7!_?tI6bS#fB*wQ*8?7KY*3Ut7Ah_ z2n&WWEXgL7#iNg^83BX?wL)P=TyUQm_RQ(WBD5Mk>j&d0R@)L&ZNiHY3n6Y>35`30 zV$dSdrMAnKhJfM{KMNm8F;`>D1e6GXjftgSiD}~6Rn$D_vC#$=W)?@nLNueul=ZuJ zWWk+BNu!jYfg*iYvBIJa^lY=ZEe$=cK6td=NED9(?& zm2|}dxs_G;aqrSgAKA$AD;F_TB9Tq0E?220C;fIiTsoV54#nHI~+7<^kCmb#G)xvXFKsE31ez|usU zQBi7fL3QR+>t=ZPT7Mk$xKE*EwxN!FOqr;b49hF(>z#`EN<~S*`KnC*Kla`~)|R6_ z@T~5xHhmrsZXfGKuv$W@BQ)|vK|Ew8a0&9SFmBV z7?=C>F@4z4q>qNN7HPE9@x&;(L9vtdABas%HCG9n;b|WVJK_(d!BL`3w5*29K0m`e zKYaG{tv=`ec>aYI0vpA3@9Fyet#5s+s=L1R{Z^G@f4ggHLacQpQa<;BjL<@uc-|^~ zjf7{`rb9KWIo66(vyx&_tdwCrWyPwF^ajZw3k4?(1ysrf=Et6R?HXg2K^sT?Xa?de zPup;MT4OBqBz%=di8x?H?i?}`RBGl-m^qESvb9PBTr$}tb;`+mhNsRQIV)gAEP^eW#QHkv}BrzS~Ei6@lrD=(oPueIx>gKFg7)#USurg|)40<1| zXcbUYWtR04sYaVt7OY+8SO{a($-q;}@^@rV24H<^MHh$^q6{)Q=JFd1i z23eJ&=R8eqQNWc4Q%{!JGM}c#%(IG0*SVs~rJ2-KmBTMh>!JvmmkrT%TCs`4*X*|D zjIdnS122ru$#{=uYvbXR0G?iZVZTu{mo*Jxv}5JC*2iY(!w=JC(NBD0bOIYfq=7(@ z-w&em?j<=~drHPSsT34R(2>w78pe}E6f4LF5gE9J zheV6Sng(g4Vb#dO?k{Ic7L#TLs`AB9&)B(=*HtbD)EQY6plhPuz&7d3c$Jy~Ts!4C zMQ)a7RbEs*3qWjvZqb@zC2Cc;*{Ra;c=FK<9UZb{DGr?y^wn8=fV#xe(x~I; zz8U5$hgcf5R|1CwUJ})is_wX@i^k-(E_{4M0_#q`TiKx@UMI5VHCV8yn-!WB zXDVvEj{Si3GFdrOEMe4LPSYqemo@a+QV)4nx`tO)Q`SzU$h)g;L1S_9d}!pU@4a;^ zzm7rNg&etd0`W__W@A^;<^(uI+!7wWF~u#L7(P!i2Al9ZH?s2TC3l?*jHbTroY*(k zhjC6_?ab$8sYE>`s0z8S#3qkXw4l@@=s%?_b_8FaEQC_SW5zU;;}Z-)y$wY?N2G-FEfr zwTsuTNt!4TCsI=%{?~s56@H1ug`fBjV`*=|E$;)KlxH90CMs^X*?ArQQY6Z6-96mj z*?-R-m)Bh93@gmls~cIVcup7*j*C|?coLU)I~J;zNr zn|}&6zY#H@U=Gs)0>8bFfWbR(d{a{Yqk}{EzK`sE-m5bk41WLoe=CqrnkdOeJ`KhpZ8HuCKB7n7%xcg2(2o=)Thw|{urujF>*F-Gk1cI46j2?=K`J$&~6 zSuOlyKzvfT@)tGFJfnUlJ)@F?WbcsO_m4k*W~13KrWXEBT-0s-%}ZBywi57TSX|rt z%`DXQ`kwpmxpCvS?pAkx;~Qr#rFV@dxUnGir`P}V`QLf|cK{$71MU9$H`5T|#aJtkxdp>>p&f`0eUVZfH zxpU`YfBC@fjS-{MVDMeqJ#!#|(iPT+_uu=*r`{M>CT@G+>x~3G^}tgP#7yb7!qKOk zH7xk@em%nA{O89Q-VvNi_x2sRx%knmKlM{TwZY)@*>u~qyoz=&9bs^|zW4qoo_Zo; zaOTpbGtXm~{MU9&euP40#(?7)!#2S1E<$V>qXj=3U9~cNYQ#vG7){88-;0=&fm`?1 zKAHT*!eYFQaNCn}zg$>Pe5J)FWHyQEHE=1wH8vFJ>f()NYhPYGsuL z6#+d~q`@WgGLkS&GE9{t??!nI^(1yf$|fhp(b0k_F+K5O%UnmQV|ZGA$0law)}g7e z6vERQiQ`BxZRMQ>=fe}Q7^|!iJMc@bJViba4n&__T- zOG&3qaoQVw^{FtXnkW3Abp%e_BYB}4sjBD~l8-sYz9E4i(8tIZJbFVDqzJ`KfcNcF zCYs7mJfPYLUQUsdmhTOm#|V(87qppy#v);Bdn+|-X@8DY%Q(}I{=$~aX-GTRYt~|_ z5!VfhWCrSKWAL&FBY~UxTh8DYO45O1utbS>OGIiUi(u0KOoJPcCt?XFMrzHVjS(?K z=}i;Z(JRl=AUlJ91_;Of8|r5ZZM`64LKRq&mQ$$t z*szR5=VU7~_q(bv@tnJFNiDovs<}262r)OAUNf&z;57=oMuFET@EQgFmQbKHs!il` ztdo{SHQD!5^HJyH21})s^WrcvkH$DQqKO^9<9vc$;zWkQYAZ|b5+Q#6Fq`RtI5EKA ze&n~4ffz0iipovQq>ZGMv|Drhp?6~eS|w&1DF_;{5^8r9fhk^Pcu=;Y#B|#C^T`0xrbQba)Tybm26l6rFI={2*~Qr} z5jf1sI+P|)m!_<;S}ken06}SNrDOS0?NpgWCj=Q@zex!Rg$~de>`9h*e?W92=9eE5t z$X+{WTa;DWXsS~1Q%I}090+nM9U@Jqc#Y}w?mCG z3>{_R7XY=@#3N49Z2nAVNTOG&!avC2OJ%i?gSw|F`opADyd1?6lbgoRi-mWAqnuss zOJE!RY`rvbup`H%?Yy7^RwG>2K2To_?dUzPq+u^=jBFEUTaY?f6SCsoa8 z4v4NrhnL2vvT8QPrb|WR7|79hmU<8{ax8eAn?N^bo4J~))Db&#&Z)F6CpD_W>>@{v zV#dDi6~|f0hh)*UJY721jbVSZskr0|6dcE5iP|tbUo$WL0OTtC4qJNDSnhUQLjx4; z(M%{fek&xImEE&*zIthDm1TQy1Gyn%##ka<$?kuu%9h$CI~b5}5$mKIsCu>Z5Sb>J ziEcLCVxcnxkyXi^Qt33Gc9UZ1qh9ieL2QfYY|OAUs%9&yU$Emj68)e0s+F&h z;%+g{$)8R$hONt~keqA=$vXxm8M9u7BERX((*!ipaoMBmp@*Vot-3Wz`_8CaH&VWO zV~@L5Z)vKS?#_$1jOjPJy8>g($+~*XaZB686lnF1DUWu>*7wGe?j6fLesUu5!H0hK z*>_3Ehj%`#*7sfh#hcN*aQ@eRP2xE;CpO<7sz3Zg@sD272xZ&hhsKas|9s@!Bh82I zdiG0_^TX>8@7%Zk#mhHC*wEkE~j2wm**D`D zrC3J2?Mu(T>)G}CS!#0r{CynzCFbdW@s}UJkAsq)eRgO4E5G`yzl!STh5l>(*Y2g$ z9-C*`{`rTyPriiQ=Q!O;#Q~!OmU-!llgIjJv4Get4&RMVWD0f5`Hxap`SI(=8=TNPj`Ij zU4z7Vue|t`v>j8fXtwrF9wnU3{wGFR>%Q7&A@|j1T-8nj?D(2#m=Zb9Da$6R=#<$wOBL=xj-dDeGoA$_N zMuP?soem?s^7d~`a5Rr_qhDF&XvVD(?p};h)y5S)G0a64i5J-BP0Ckh{EM;l?a|m% zB|5-w|HgQ?Nkzu#Gs8tGuE7TXT05zSn2`pwvZi4K5oeg@nBGX_i_sdMy3(}Q zocY?+z|%NdQmH|D3cvu7$mC0LKr2e0gc4%P8Nfr+Dq|H0D;L-|62~Cw){ZnWsD>uS`>asI3|ZpP_4LK%*d0viZLva9GR0~+X#ghZiKMOrz%)5 zDkhZ@WBF}+&&EbSIh1XqGMJCdJ8d-e)-F&~!wfwdu0oaajgbPq(yq*`@-@|WgR+rs zTGJ-rzz#T+o#)(d+d{9zY1sh?UGiM=O7#SP&+o|O^8~iHQc6ZHM3C3W9973iHt9%g zIcAAKAt-b7gDOylsia&o`O+}QuU3+)s-{3`l@5yKr4>0dWlT_7?&F=x4pnw^qnJyg zz@!&!qw)0rX`3dgRkluLC#AAVQTp6z>pNqc7H5|BWr zGt(=B57{#pD=Eim;|9rJ)2S+lVXO@`XE*_qM7ZQs9UPJyV~H>@g3%axI!bdSRihceAPHE4@nQ+``jyYtJG{ETbn$c!LXgbaxeu5U%NbF(GorMoa4K7jp3Q2n$_Z zahajZYppsx)6!_DLJnhVqhYFz(k7859RYRP*xF}{$vmk!(I~Iyi_Ua|Wh0c(D@m== zWo3=6)WW33=ay+)r7BzZv=E06L|C4*Ju42rRZE?LO=efDCU78Gq62i$Ug@59hCweL zWzkLB#jNsR|LjnNMFt}{3t=%+&SgyrudO)QjOq`LQfD)!c3y>gl{Uo!net4bH%!mX zM;ufIf3Kzvo6XItb#s)SE0*59S^vV1fs7abrAp;cA!)9|ZZ(^rd%hD`@PAcbJKIx|^3kigy z48W5+x#z{E&)4->zEaJi%Q?7i(NwmYF3?0~%`aJ0sbzVmW&Hx8EfYh}@M&GNhL1#> zw}Y*8rB*CvEP<2KbyoN}dpocg!o*<&XofnC!xHF#jjsm8N<5y8jd3*Ya=?UyuN-Hz3RG^!O2*eT`+d|INQXEI8q{E4k z^>OLZW4u>2VM$DD<4Bb>m__D&u&mt74J&~`O$OsY)e+T7YCW@UYBX!yHl68}b8~qU z%g|FbM^}?9Zqdfhg6655M6mcKOVE{)8na)WdMI#~PZ;s?6KgaNMIO7l6ZI9Gx88Yc zF~#V0%PmCIp)?oEm8GxJW0ng1*v1RS6_PY+ymu<>gosK z|9)$Iwz%-1`rs$yocO}o3unKx{?2#yuYc>ge-f{Ic;g$kIj>wfIM{jo@i?20Gib>X zfB$;=ucxpSW5UaugOE1aIPCUt3t?+tw0jTi?y{HfQ8pl+RUh2FZTA7L)j7hTUejw2 z58_EY+dKvuN)Z>n_{9qnb{d19pZ@&x{Dmt)VlH1k!C^=M%uamMowyb2@VV!nd;Ugw z{=)j*+(7inE5G|&Pu&)aC;5e+yzrAKI^IADR&rx5el=QJ7#21h!_#akPH;>^5G>yA zXZp|dlJbA!C#Oci{-F80W+)g|Efx8X%^`u;4=*0xaoc(Ih4V^%?sIa6)M$S4>`$Iu zudhFUBRs|2F`B10QF?>H$6ttn)Ow47q`q+easT_j|5Wo=e{~}maM(aNvckjRnawFw zC+s^j|JjRoui&NC!|5~06O2sR|M~>k9=Z6N!b@*>?KuPUj|IZ}vhZcGYhH=!Zb|8% zy7+7V?(jF~X#YL~By@GpJT0eJ9TmNCplv;p@9XPtLBi<1cJ0!oF&g4wK6&MnSFT_C z(x5)W9~WJH;R_=lEgHIGI?ortmqWrGA-XgYAH(?+_`|7dt=hw8?sG%!%bUi2-aC}+BxmF_va^jlA zziDrLNreMj<26eC-Y-eGnCCzC{Kxh_@W98uvi{0f-uU`)5Pj#noEr{XyzR$Z+I;do zSFY4@W7fg`x5nJ3p9j0|zz}9ZG2$2wWGP{H_v`BGBTpbN`iQ}qGdouv|MoWjv3<`y-}pFM!tdaXskRun#_!9W z)L&I!{i>wA?SZ$y-KOEz<6QAAeZq^gKkXG?brfVy`Hq554=*8d{2j+1x$Kea$K`N8 zu7YE^2~Xh|Udoh2z?>dMkFL}Hmx~|A*2xrAgf%|Jd2_A4{w|* zlg3Y8BB6YoNBF=p@D_{{2{~yRJPi|$HWHwXQ74}=Y65@J0H8H=%$gtCxWtS&po59f z78sj!F|ou8WHBYLgD{Iu7oUn88zY?g*658xCfj4JPAa%cq}ikxE!jFH<`{;d9x^+T zsfggtL#p@+rhkR_A6@j=W{IY{kgk+;z8hWzr z4l!)|7z2qu?l;nW1dp4HakHsVX=6C1cI+QLy~)VxLiAfK!|(JYag#KLzsg6qO>e~! zAL4kSd8vW=!jwOvka0-yeL|)1^(@)fc=51@c*CJ{|}7v4?7`@G;im> z+orhVbBS^%XmI)ibt2+#%K6?V-1^?EKFKTmO%?UhaJ6~qxYuHSR1`Q`h5AtycvCrv z_}xu`KUy!xS)g5Tvyrudzw72^n!I{{?Out)eDyG2T@FnTlNtGs(HMA}A93+_s1+st zHz!N|mnS{1)*X4=O{VSl8wTw~%_~#;IK@f0$H0!`kHb#7UOd;y6n_J5BQRl8M{~rC zZ3F&V_6W^xV3d(>G%o@XC0f)Q#-)Z@;+svPu(7esu`{|#WjFRs5l2gZW2KJQm0s9c z4Oxvcn-!ET`Tcew=6Gf0R1v4(z?6=)+~$5U7S^81|KsquS6yg0UXma$gM&pXsjKMm z5EqT#*e5A+><*jQ(MnGFUeV(vMSa}t(wMS0Ny7c+iStE_e?i#T5l+9XB&>*VUXc8z z0JD9~9oKA=f{n>z+mHTN8s4&+rZ%+OKbx?Zvcge>KXUyL9klc~bCK#6 zUVNBX_m_Gzj!AgNyhpyjj>Dvzwvler(hoMEp|NbC5}(J-ClJ-2kO#eOoaRMJ^_wtH zqL*m%6U)daA#8fii@^Mm1ofLzw)PLN(3Ac4<)DT*Y>T52|8i+xUEC{@mPU_eGcer7 z`$Moc3yD7<#BI;o+CKyYHXvS+1ee_JSEM?}-DJ$io_&mTU- z9|l&h!FWjunB)Bn$)@pMGVQC2*g}5!T$Vy*AH&vu`P8o__6LV}w5#NYE*9HDeg(X> zGR)CLcD#(TM8gzzRA6gG$cb_MWN*5dak4hLV*n2m|E3#Te9)AK8 z>?P@qHhP&Xr-`;M3k1|~u@3scNN5y<$r-dTY&8^h+8UR_wQ0lFaz_g6Btix_=>@Ws zLy$$8#u0}}465e_G}sb=lRxyf(fr3%nlkA#Ie1DtX5dzyEg3EOmujIDc5r12V%Q#E zN}P0tz;kq=7mQnscvk{Y_8xepOspi2R^wvt{q> znzfRGu|q{=q$PwX^t1pvlSSy1>%f977?!RwSvcZlbG^`ae3d))9Z-ebbXm&wmfA?T zlZ}T`AyQh4`t&4b!Dg|KyPP5f;@P%NGCNyNNN-hUCo}mJ6TWmrERqE$SGVM4gEo5r zX8m05GDkZn(J?(bHJ)P<*nQBGMkgL1iP(uDJMT#vKM>-RG?5w?^JV}Pa5)O1;~;&` zeU@;&;Mnnie}LGQhF#4Tfs%{|>~cN;iZc&r{bXSC17~YXt|rO&s&QyN?+EUG3*C_D zW?l|~rl%znmO`;DX>G#zW;1>=2XCKDCkZOteYarOg-<-^5Uk|Px^~)42YJu110*Ry zCntUd2uh@SDsyhZvre6xal3d;8?ci+Cx#|jxF7^%fO1rZ%RKZ^ao0kScyUR{%5v8j z=Si+iwvca271-BcCr;vp%qxMcon1+K;$wOcphY=1-dbM!MmgvDg_{XnP!*e_3BXR% zri*&a^^mB`36aC2x|P#%hw3^fF}`6hw>dmCWR& zh%J$LYda8j8IVmTw9>f^12P0)Z5SgF6m^Y#ljfovv+IU=v6QO&$MLb*E}Bsykb3 zjuB|oH2PI5l(|UChZ+gLRXxO(2AT0yTn$EF6~m4OT<@K3LKp-9#XJ9@UoD>&FN`%Q$@7o$QLn$Sq3H;Ocn(^`HIOdi~~a ztk+`8dDssDf- z;{VIP95E2Llq&WX195LL5LiEUgC_Z|3ODYQy$Bl;#JwK4M_Z^0-D#KlHn5e(xSun{ zIcfYGw4prL>ra1r{E7Q!|EEdwnSN{=i4%=@Nl&@71JEJ{YWD}lAR+(^A?q;)k;pM* z#Nec#!XgG^4m`2>1cG4jr7sW9yz|Ms?&3^xc1jdksKck;sW$r|&PV&h=bxzU>OcPd zzlb-3#T&xjKkl38e~Eq>*g0{2+(Gf-cRoGlcxNB&bLZU#!fF4Lw~v18_X9yXpTokq zc;^+{T^^9u;Ewo%1J0fQ9EZGQSJhQ@p4PgszOd2%Cu6+BO)_qc+;dLdB=^PVxuc#P zI^vcx*3XqV*X1|AciU~Zac1~WiLD-t@mEe_@Uf4r1q0b>ff+HNzf=BI^$+s%vM=B$ zISHf&Cybnv4+76ikYFGs<4p3$X&`a(IEBHO7m)Sl<)ZR8zEO5OTq1*v$I$@uhPd|j zM$Fb%*Kv1Itm`Jt#$qdo7%MJg9jrDaXZt_SN`|c7j(hh zC-nw=o)1AR!$t3jhs?vrzZm#}c&)Ame)tg1;)mNwyF0|D=qa+XYDn3}59 zSb6W;&Ln0vSI&39t~|9$oRJe5bLdi`wjZhI3l8)lz$p2zR%uqLdIci`EWWJyG*7ix zmF_9IQeCeIhu7v>m?Bv*7Z7A?z2ZrBQaE@ow^CfCs;UYE44^Cd5m_bLta4pdUL~Yt zYpYUYE(_k4qv9b=EGyvC z#8PR(bUgh~V~;*@$;?Xrq`|0B^pkY1Fv4o6#xao<0IE^oN>p%=+O_b-23qK<@Dw;G zn}Tmj0?-ooP*l`b&XZm-MN+LZDl|;LxZXCblryDrp$`tec;JrYrnP=S5e-#u9J3UT z#_ED~OdFeSGUa$SliIYISywbRMI)a{oNlb4a;_`#l6n}Wj4Nk}RWt?Y30E**(Y*AM zI>~79A*lnWn9ph2yiAxRs=BF~c4lUSb+Wf#4Y{LVxzjX!vnFJ4AOVPe2wM6U8blU4mY26BYqsib~_#Y4BNhi}& zW1OJ`Q)+L-sN5Q;NwcRpOukYnwP$1mjw9pjJLcwXtxQ_Nv9Ug3$&f0Om8AtyLn|0) z5G-|IW*kf~9LGJtnsWth2IrM#dPa984{gk9Kw8^O8Qut*tU0d+!=IvNijh{!lOCT0 zP7hP7N`OXV;YSA=i>bbv4_U}NuWjmhhZ!oUr1y-b&ET8{DGo@su`y!Mb#TPfRG3oB zfKa)H7#!>8)udvNeK~21uCnk^B?oi1DRpMDuIv(uF6vhBC^S#a8$*y2eq2V#oGs*C zN}CiNu^p9RIt^ihFfdXYZHEObB@pTVz~Zi9`hzka^xKk4@tl{G1sk%Jlm3{%9@8aM zPw*65aj+q+3{82v(Ho33SDq*ZH5BoI{m-P5DLHUD4pV2aVv|aYiw*%MZhT-HU-v6j zxWVGJh6fBBTe79Z+E=uOwR4txlyRM&Px>^aqcrRtAF_cX>;?m=ly=&%KnvSIeaI=S z1y>%xuT6wTDhmr*jJw4kz?2r5m6L*(pMv?cQ;WZt=z)w`u^1MtPffJ+K(kuX0SeVE z>%kMhqMbO_7E0FboI}*6mA6I4GFV`ne*?8t;%N%(Ak31OeA(h9&yX)Tg41WLm*Hm_ zW5U^OboB)b-CZJE{pp^p=jWDN&ydEsrI`MS!6l$*v%PSm92 zTCC?MT23H3`0ljF1QXmO^ouB z*=pMJxhbZ+-2&B+!|lS-ra3#rUE2?JzVu~lSDagD2F@<9xh=aa>o|L^=#6uw(azGk z88ncE6q2h0QqFfuWpb zhO;SE!`T8EFRv!l^Fgt&Q`K_@PNj!AcfS?oLeIIkinl6lE0@1>MgR~P5%j1T?~{qJ zg-ZOidfGVU#Lrq0?56k&`2Nfo`lC!OxCp(=Ib^Y)>0+)|%2z9TtcM5odd^u0zDT=P zfuK!IQ_gAoB;ifUn}aVCnkJ?wQe9?A zYN5G|K{~>+wh%mR=Dy>kNzNYWY8KhJbG=(kS-rPew`hu_>%``p(JvRPSxBbIqFZ_N zUtkcd+;izBnRkO3l;Icbyq~MK7)pAbTCj}hmEncqt*pz=9p5}h>GIVEi)^K*uAaNa z#HGQ)oiBrv6J2I=-B|I@T0Us_7p;?*dB$NGjMaMPwc{(`XiIvmQcdLI?-cKNYFD(+ zy!WApB#INwBKLj^E;&v>@h|qBVvRYPhI_sxrD{hm9Z(NN|Gi?9GWw$}g++)lK5}ge zo`Ds+2jX6DEq56)xqS{!Ss-S@%m2o2?Ce})hAROo@Hd*vV#z&Y{Vi9oW*N75!K)v_ zGh98-Z{xpyapV=nFMR#C>M{OXa5o3!k9(X21GT|GZ7>+Q9f<&gH@snICl?IBM}-h1 zl+y*`Q;76R7znQ@7{Ice!eG7Y_hDqK7OKK@@4pE5yc&GEmFK+p9n^m+WjbI=q z+54UK75wMVUyY={^npv4uKk(+v-OEn8_p=fV11Zn2Qc8g31l?HXH7dCF~n3<+yb2n z$KTEV2W0R1CQbNqfH%G?gLjq_`W*Jt$rAv6`0TyO=apMM%qax_v&ymm&ws~h1lWfj z+yC+8P;GD7zBlRjgqwcXJK?5*c*IMeKg~0by!1bm5+hF?Pc5Kzv;X(`tFg@w4-da< zD12)Ut{i-Mz4z_+sB;(Ze(t%ieNEkcZy0PVs)g`XL9@ENN(Voij)Kax0qt0`G zngS^I$Wdtp+ejOXW?KsH^z8Sa`d`23sQ%%155F73rMK~&IanWj{R<_{bnfoE@3@0$ zp1N@(d@I}*X-f()h{;vLs5$=thw|;7e}FNte*VF+5O`>MhBTPs(l_;O!!a0wL5wFb zNqOA3arP|Ndecz*=g-Q5z*s9Se0a{7Ja=yI;?CJiZ~5r@qx)CXH)E0O^%pmF9}xil zT9ApWU#DUOk?*g09Z9QypGuDCFqn2PNZi@o4?eJdN}W4%M)C><9DA|8_@@GQ_i%ST zVvuu)AsFm^R9$(`OJTsN7$XM$l3m~{W^z`31~6g-2Qfk3%119eoQ_{KVPoH9IeFR29Atwmw)jniI6{?=xXhrD zH{6u@$SYIat?^q2y(=|!^cChPFgpBc?@RgO%R*JjCZ2vQW&`pF87G0lFUur45*FeY zL1-jW;}%L8TtfWONFxYYV^bW3a~v6NS<P|Jq_oSS_#oW zG}vZph2`?9%v*xmiF5%!#ZF$)Fepp z%xw(at%c`e{v)-`L%ss-UKS*3Z~e5Cxw#O(*0rgqBFMrY%B9JXMih^nuH}|jdADc| z9E&m}g9x$9n@J-$*9zGHc;!qe5EsR+wC$zJXf?H?4<~}1*vrYa?S)eKB#xx9kz^7m z&8bX1+Cun7(sR+Ut*y`i8IUm)2f29^VA@bCF}^5}$-}&6FssxX>LAvLT^3hsmG+V> zBE+o*WLHyfc{1H5H$Ny{k2Yf^laUIYB^2~J>D}}fX$=et$u-$%mskKHO&zEWgUSQ} zmbbAaT$m1#JE6JHEiinfn}kEyNtn<#s1+t_b6dB>26_^?GT1RelS=~RNlCHRFix`k z5EM*0%$v|aP}37zNlz|9Vhu;&HGnQ_juI@&NtcG4Hm7Gaf&qqNa-Fx*C?ZId>m%gV zX06ng6RG~DIfZ`gK8LzwN2xI7G`*qB0Q(26tL zz|cmgcrh~tS2Q?)aj?J79R6um3vh1E7~>TaZt>T|OZs9HKa9X5gxXP0AXqtKoz)Zk zM*Q0nw((hnU`{}2W(@gR)-*}e)XR_*L&L`_N%13UhGI>l+Sy*A>11}N+sbDmMI7U)zLk8YWbh0gkn4+Sowj~U3wp8m>JT1!M zgkl=B4mf7;$lpR$y2O#c;YGcK=*_0Q7AlI76e9)==l=PaVuU!RU=ix5gcpgQ(N~fM z#j`5X%)$()NkV@54X{g&PTa)nq^Tr6rR}JN^s6KZlsv1FCgwTVBbBwA zONwr?g%DG$KsvSLP#Xwy;!i=4xLfa(r`Vj(cLoXfk$)S$wJYS?FN{A0AaAOe4sT;@o9=YB9%o);!-`!VKisWm+TRwGg_-KuH(_FxubFT{us@iI&COL z{)BB6_L4ZdMroJ@!5y_s$J;;}rgv1CkCMp)pJir_ zRqnl4<;rNE(1&%OD78?|JLL>a8pOmP%hF;C6N5pyQ!HBslBlU4fWWMfiW?;woQ6na zMT1ukORtPH2y=CUr5Ed|sZ3rKS_7=;k-_CkX0FNueGWvb$&(Q6So!uuC>HN|V5-Ck zwOVm=wl>7B%32W2B}Bq)h)7bqB~XfnV$-}YwDgA-Hl)@D9LP~qq>MB=MnkK3u6&{q zEBwNr0zRT))CxC-`c3k*Ff;4%1w$&!bS|&Vv{|}xWgVnYwzkaJy`E}6SYf~b$M+tl zlhBb_@2&7R3>8>k%22uj9SoX&76u@?wWB}@Y`Zz#G3zSv5JGGsnF54Ws`s!`N?UCV zbydc-!X893_ba85jWu+(AY+62#I8_Fmk$hzyc`2<&PLO<%4*5yNA@D}3 zPQ9|W%hfC`2gX+Db(cHMR54gRG1Bt9VRNS(4LWaqwxXhQmGOo%NG<>@<0Bdox6paS zjesL$Ss5~=NzI|*^g*F?#MR0xi6PHmrwjwFiq1LDQEJJe!l$sHf z!OT0|Iqblw;kv0+Srm@TrWoOTQk2W=3RlhP(Up^XLuRFIB`R|j)Nv~7o55kvxI8b~ zt&a`FvD=`gG&JHD6za8sY86!_cR5w*DlZZl&#Y?XR^fR@bvfV5<oN4yp;WiLxz44aO8AiWt0@ZUyso%Qy9Zq19e1!fUa?XDX1TPabYMpj zPMIdP0l!i7jM3JTlJ6?&3)d_8iv)-h6%TYt#p^P{dG;Uj&@3X(x|wE zgJ_X90h*#;!ZEVJf)$;ntc*pU0Tp3LDMNKy(}a*|VWmHGYP$6J5tWA2riykFB9^p^ z3rbnOR<)a}obb>&<@73YXnAZdJ~>O;ospP}#COIrl*@4qH9e31FL%hm5xmJ-{El3agw$XM z3Cew3Rwa6aySwpbFm>Oj$2gHH5FS%V{1_{KfgXh$0!!BT`H3t>U~g>++hP#YgN;ZU z1OrJY7>M*^=a75KC=sFD&cVTb_n~7NF_1XXVH6A`g-FH5Sn)?3A|9tPpwNhc*n&YU z?8p58-@|)B;sQ4A-Sf~t*8INvq)rE1CbokuHAWV8$dzt{i!FZ1BPpbnb~d4(zE9}4 zX@Xcysp(i{kw!|@xBggpd`B1%AQ(t%NU74UTMS~4pb%PsaIr~4yNwt~D+vY?`sw?m z4~-a5UMz8IZ!y^V*XvMoM)~<;>0gLvmfw{<`f&BG`cuVwZ+*CWrhf92{o(pt^k0;4 z#=^tZhmTU8$dP_IVPw4DKKg$oe~~=-K8yce^_$VQ$q5??*FF+CWN`cE55IGG4LRB@ zzA&M~>#1RhJq+Lf{#re+*Ox9_z)laZ3l+C!cmMFZ3fHLR z$f~mo;(q*Rch2svbuL}%uDj|32@^vv8XXQg9Gp2bh9Jm%hhXF+#rM=#IRO5_m~xZ+ z#tqR77%7KP8ks4D-nKqpBPkaQlsbt)6sxPp)ebRQKll3QUJozUNU>i!_!5zv!7s*n zb>>e-46a|?VjvM*DRy{~i`CZVn|SoM2}(8?AcJ*keU3t<*};HHONEkPc#ZQi=R0Ef zpc2G)5WBLj;9E>w!6b+&gZu@F$EKSZY>b`qW4_MIUU+l3bG#z@5mrq;%S`7~3%&Um z040NG7w#UP9mAN8I$X8nKQe@n+L>rexKR|jF|F8E^w>@sNhKjnttltnM5W{uA2TtD zqu*^~@VYTaOlrjI3nw7Z>H!p={TO4bglvo}hDA%5g!YmeM*?Z&DPe}c3L95$2ve~} ze99dY9+5sdp3XzBXmaC75sff&aTaM1p=m>yg=m{dPbS<@aARDw@y9}}&=F@K#Q@jh zV{B0K)OdxC6Bua|F{$7pXga`>7Y3Y3FH57+Of~RXFd7va2(iVTA@agQ#Hf%GC}<{4^?sNCsMdMOn1giCygaC&^wII?&y z%0f`;LP0r>zp8<+GQ1tQs}wS(&Q|1|^ksrY$7S&W%#|6C7*#4qIHYU^yKOq7jE0Rw znTmUS(Rl=*RE=s=8+h9)I8}RL)tOwC3^f=)FLV=O9$uTZmEbAbWXy;)`e0L`OkBM{ znN~Vh^f6~9v#d)^`OW#2<8@N$O14L)mQ)?jK#b+jkd}fhpsmsloS>TcVk2<(@q`=} za?l9Tc^kMHrfR&322q3hiZXY z*+M%|ox;f}ZLLMTEz3PCkgX8Ym2|S48q8GXVLV`_1sX{9YHn7At`h;M5?D6aNqE@7 zDAS@HDHUxbDyK-o=w~flf|*!bPc_9Tx?)S0klS)aEweOfxukIv+a!^pmS`broe)FUorAtf^saSuz9(c|GS#n3$lu z5~Wl~IV%e;Q#QeeDSL%g<;n~tU7#-~jLb!jPH#S`s+zm8^V-sdI%wyUr62*49U7Uu z98;JnPi=}-Qqz0%ARn9#mJ!^oN)k2)=CK-~T%u8cssQ?tAvCHOmgO*Cs66S|{hP9* zGNE5W7SyrZgmscMsGys^08C+MFCp8)WExw^NNAG4o1;o$=Q~mbvbKSNuoC2KpXwx( zsWNH64t@mYT%t1e$oY06Zy)N9(jTNDfFo6{)^Mr`a|WU$f>VLSVi z*$`d>D9h(8M+q=Av007j!r<~r8H(w0GO=Zu_mi11nMc1P_$)JBHRILT^fPCmF@(y> zoPJO(Gx~yAXq1mxk1MzY+%m*EF(AZ%nepCtwrMThkZlpgJYR&saG0YX>y$;Gq{=$$ z+9o*1mwzG30H%Mf^N9fO;@I?jImoMm74d3Tp`D1 z*J75aDNu_B&HHT5S{AFRHeqeT=!Q>DnkFF9!QXRpT%%ZJp?i6#LmN#^V!DM59C{FV zv&ovC1)F6;kLOivS&(7ubGimwXiG@4qCyED(&=PD@99_|q_20V36_`K%o-I~W}Hm5vlG^?tVJ$eqDtPote%3GWTUTjD3h~P6!<_f zKrM~JnoHnvwZIgQ+ujN%-G*xPmLWAq&xdcQS@^0OS_rDn)WEsrUSZIi_sXMI4{iK# z-w%mj)#J|FMp14<^18k=J#!HU97~i?Huv5db#`y5nLhJhOXNdxYcY=)gw206_;0;) z48QeG3Aum~n>~Lrb5%FiAA2wya=X&b8g4ym((XU{*{fIcJpcQLJBR<}!IyUL;ErNu z;+HQ=`oGw@p8xxQaQN8H&hyEa-hCN!&7ZkM>T93f`|RGgm=LS;I~NYVeDEc99B$y*G!+TAhd5C6;o<)NwZm&LMr-xe*B$PB@;&=|e{%o*_kYTJzrVL#!T8)i z^_QO7uepzT=iqzad)@1H5B#OyzW=xHzme@8JoecA_e=cY{?6WeKC-uWmePKjhI|`n z{4_0kFMU_c2lp;T40hSW2?je610?8&hr8UD3_tw9`eR&Rw*Ck({zzCsSR%n-T)~hM z&Z%#~sO)eV^mo5282p>Pf3p`ZsP$uy?d?Sjh!YI1M80W*!v+Qa@Wp35y0_|K^{K>x z&ckPak-3hN@YNXpWYQ`1=)X#SC20$rKAb$Ae5$awws6cN@BFWXH{QgYws~2c3b)B` zmiCs1sX8xwN_;wdqEK9~26L>gt)cAMvuEL)*9Tv@qSSNmfA0O?|Nid!`r$r{0qAtT zfBk-VW3~PQw_VekXQ9?_5hcCo!8Ltsy}$qMXs_2_V5{k)>v!+ov8(L*K}my2_V=X? zxOF?`ikC$LhuySa``AU{DYqE>fdeDV7s}_}KMd;N2m|_xl=~jVAcz?7?vQZ_21cIm z-rpZ>ZquS4a{C>I&MKuO{5IySdj5B#Q?9F){jlsQ{oLms5EW{M!*(p}T{`y`NwxF% z&f`i2r{d<-_kh7@c11H6F8lmiMlp~KI_9kCe0P20#*IG^`%Q0plW@gOw1dYySNyEI0xA76ukg>>A}2JI3V6qwzpnX8WO1N)|E zxqsmB(6EAW_AO$A!JCBsJ3DXPVDOb}&Dz5j11Der=y>qW<7J%EXCz1#L&e0`M0A<> zl(_@KFBv;g9Aa^aEH8d9uyONhF-%0|TfwhkCa5Z7c*RR>OzTr(D&WO3D3Yib7#k7U zM))xv(HIz25!n~ycwqol;zNrJu++)}&&DKDpqNG+b#zL-#YhGTqJ}SO3?K|KeEv*0 zk%AFA=9Rf({B0v8W^2OMaZFW0B**p%CBQ@$yM=WuDJ$L~jSty6sRS?i!S{lRgi3C) z#f)jq=<|iPu`vrHaVo8-G2+W6Rv-qA54a6m<1~~lTs!5*>Nf&-L{3^N2fVZ&lWh^B zV$iarHA=RIQ8aR+_&y~o>lKZFkzQg+g+!AlGEqVZr-FhmG-#o9kUp2k5G6BXe#p(( zI%g}s)soycX_t4jpL942{%NTR*O^b5sYZCc9XAzf)lWKrc-CL271J!Ps5Yt0k8NjE z(N3+QPr|Ax_}LU*DS!kD0uwm}s>xflGXit$EP$XGX$eC;PU!V^d#fSN*OFw zu|fb=c$u*mM%k323^k1UxzKQmimUty=P12Knu@|DyKqM>y~Z1hoBh~4#Rx5#a0~5d zYOCbW)sLZ;5N4>+ z)I2vx+d4&V)=Lkeb&4Rpo;s07UK~)u!YzAsU54( zY0bUBfZbGStV@Ui^3oF%i9EhL>liQ+Ck6*V#V|$P?!%Xc zAGWN^^9)S2;^&KLRnjs;F?`OM2(hw*))L1Iq>4j1YUIw_<^ z1SFgaFo7f?sx;!3@3m7#!dP`3Cj=6DWSq>%sDEzAlsKx8k8u?_!5eVZ7{FSz(W_1t zw1XxH*`i39pq4YrEKN&YiJj=A^(rwknMP?%pvJ1e2~jVr1a1YwCPKw#7H0t_9Dz~V z7}8Y{yrgi%MDCywUq9~>1EyA~Rn^x^r8zKhUM4IjDwn#<@U+?_DRp4}reu}Wk(#A7 zIEK~*DF@swIIG4oL1M|Cb3Mv5P@l4FSj6Q+VN0K)PKJC&+Gjye6~d-c0aliCN2n!_%#^1bh)9phT{>rp z*%9a{oavZq6DI@_!G`peTBT&cZVkkj@{2iE3zaaME?qY+L6!)rnv~_dBD@2fOW0)T zrHS)NpUeUW2g7u5jEA+#u7WhQl^Gw3U&@m+z*5c8YI49b^vpyVmFI#*Y@NK%;vfNr z& zBW4jSSkM;);jWnGm0PuSUB$V%bh=RaGUR4ZS*T1^4pU>1*P)$TO4WtRVhlBe1hLNA z(iiBqPKL~A0g=J-xpRrly269jdS*A`EyFUSw z(wrEV_N>*7<(9mA%(Tswqu`nh1J40OBo|Fj)A95;3@BPF`01`>Z9BkPdFT;Asz5|p z%2^DaCg%&!14O{?1fL`SdZe$;#Elu|``ACeQ zLTj911pu{6l-|(FL_!5tLz+f}p--ZYj7yAi$Y(@x64t8h5qt)OMFq_?Wu4!`F}oD* zc>-g|XmH)6QSf$VDxDrFo<>8om<%c8z@M75;V6{_q;Qa>T1>OtW((U`TPKy*g zWVKW!r83i@OQx{EaD>ZYriyYknR_~PX*s5|NW4Xk0_jrr-6bMSSdb4tU34)cmfZ%( zhoq0-S1Zo54GpK^EGLO+YUHsCJ{(2Ml0vRK-G+o-OrvmobiylyzFwn$oD5B8=W~NN zr`CDpm#s1=%C6L)C$j~EqpNFK1%T}j!>kFuEheiBB2$MJfmPBWx~X%t5Ao;8EHSnW zO}bFVuet_F9LfNB9wux$Toe<-n=zTS8E5<|P&b}@Y3@s6>-e!o#tg6tF&8%{k_vf^pO^a-$%2kGNuA;llrfG|xZ4y@ge8wq6t}ok} z*PPkhhaQ0`p98a?4oJG_4N{v0t2yg^$^phfmP*h>E*2_Th8b$NWiqidv~P*&mU_M@ zR_H5)q2nZD;s?fN&5JtGK25B=+J{7J=&sRo<$xXg~aS41HO)eBK6*fq6CfDO-QY96F8Lz z|F=l{j?RtUkb{7W5{@mhIkDgS7S{1)1zvt{V|`uL*u}loUuC`i-;zhE+t;@bU;c$V zroaB7$)6nj-0t-D5ABGbGB>WTzWyEW__L3`^{rx0fBoZcj`r;z-~H3Wx9@!V_WO1v z=jBHpdBps^`|dk9xMz3${Z#$qoj2?V1}MSBpI~tQ{OI0daQ5to!R?qke&HAHxc&B> zouA+Rx!qsCeX=8drM9kT-tqd^i$15=x8FY6zkd6hcmL7O+jqn-IWHq8yBBrd+i%~$ zEV7Sd`2(fCoT*y-a?yY7xC^3d3KVcU(pMG#hX}gw_pbilRVm@@jq7I)pS|3P-9P)E zj%?cP@SYus+5PCjC%y^+KKjwOe&TTVk%Qg)E`M6=U;DLx`>$_#_WGH}^2e@;d`|5i ztV0MlaIKN?$Qdw#ffPbp9AO}SFi`6EuAcwz#NOS#=bpp<@_&l<;pNL)`$Wt~ci;Ne zXP)^g4RLUI_{bx>yO%GI_AWZk_uO;O^?T&p73vvfPq@q%#T}w%?EBzl8vT5%>cqv6gXG?rV(b5M^0XQ?WTXA)Cz8YD z$vf@pmW%(wKcQrf;u0R{n%*XLyuN>ZA9?N5{0={I?LjbAdKalw{{OM}{xO#&<(=Pi z&Z*Pf+kVY^@2DMHSz_0*CRWG6&;)Eb@oTzH56ELh&Nj)kRvv|&mP1-%RPyY4-wepfy9)Q?k7)l*L~`E1}ZKK`(_{n*p{0$XZV;my?c=!MgY zdleJXY-z(EmHgY2C-?R+AAc;yxMzD8UIOK$0>9_09owZBKJ=lkJNwk*Y~7tde^n{j z00FF>cHA9*=IX)KjqiRu?cCX>*py77b3t$w2;%1Pt86I?0)@XF0>Sc)AfSUW4+cs* zt+xMzs)Msnoqb9WFhl?WisW8;i8^AR8{1j`j_#Pb*Y&6W`sVS?!FBUL?jOHiU#~X@ zFCSdL-uJ`;3}ge@Bc$8+*JT-6Gn(uhw&xJ}vj_9fk389(Vl*GU_3G!Y9zU{qWV0rZ z&GCAD{yf`{BmNk$r4;J zpUFtlNsTen_V`hGTem?IkSOk2VGfSrrmsxQEAnU!Q#Z$acphK_G8;wZBl;}^4i8_T zi`m+kuPcQmeoahiF+;#&=6MFwppWEenaZebCw?%pSZhq2$X|&ok-*dNq@+MsMusq? zrPM^y@u5ywTrL4GW^sv+h%$0=L-x=%%&{weN2I27Nrq6K_lUP_+H@lXdqHyRNVmgY zJL8Q@$86h>(#ec(+B-K&SFl{rY+@V}ssQav1L=lrhZRh)fxezmdHZQ|49;%9%6O)8mxElPJt*1z`m8V%T zTjK?iWwy-BFN61{-((sxwwl_y&E*HG1x(rJEyNWJku4~3A^1*V@q>_A*5n3@q;;)l zPP$k%Sy@AF_MBNJg}JfFgFc~FR4*1ADw{+FLjnM(Ipr2`%H-g(JX?2VtLZhNgEhWU zJEGR9`b9M_CNw#^mp1M+2bIdr$AV2V?{i)`Xn~S5TE^Hl#=;KuLGEEP_OKVXN~~rw ztrh@m0pPl-Cu?{L<0MX(6??uNK&A#!g|aWK_6Ss(uGw?-3l8&zzMc57XJ$&W&=6EM z>jIr>r*`DkxV$#kvgi=93P9*GbPtsmCQ2IxPzxrpwq)L~nxOL0(N`SA;w~lHU)cfz z?Xe`1f$wHceai9c7?80-S3; z4|#CTL3%&|ELkn`O%N`n!qBQ^OiPoUOt&j&6UtnItC;0So-$!0b;V5e9m+OZxia&N z(AJd{f`oY{o(I+ku&_K7t1!5&K~%|@2?-e^#X-$!t)q^LfbtE~Nk^ezJA}BK6|1@~ zO7k@Ef_r&pf;W)~XD+4@Du0_H*WJA)lTSuKvTqU;vF zu~mI|G>5Vp6-ziH8-}Ec^+LK?QCq%ZbSn>AS~jB^pA&${8qr)x9PL@O)M5#1u+-MN zhqcqzHp^1>Tr4%I7r|FG?d=vNPdc}CEOj;`pXUXf+i=lCtmo^ls#d+v4-X-F5B~ zQ|+T74@jap9I`;XT*rRhR9#ymWTz~U-(1XAOVAPu&njXEHP6LEvFT=2ga%~olokE<&*iEe&3I-mXSPLvKGU=l#gda<188 zdQtfKvYT_Fd^zcmm)t?(7jw_q0+t}GgMFkpq>}P{y&TbVS@9?q^>WQ=<#`xq&U%Pr zhSNnqDM#zFqdMT)hS8Mc^*)5#v&WV#N2_k_vxc#wMuJ4cmo=-ytO4EYqFgt*b?bI@ z)WJ;4LJU>CEJnRw`9)q@=KYAOr6I!a>#Z@jSdV*Ss9nrBTpQRuhY)TVz+h7L!d@WD zJJhPyg2;G+9NQyUXBWlM)cdSrNxLud%sKB%uEp^jST4$5chxM%uBYCpNGhGgkg^l$ zV>9Zc%0WM1=mV_t2UVc}tS1-IXaP$v+g&R6T232BZ(Z<3-Bfi4FYFpl+29aV(5%dr z^L9Eetm_v!D@NvPYFq?#QzPm9vKjw#3sBf7aV$yS*%>Y%ywBN*Ry6oI1<}y5RiCj3 z>^{!3;`1O;N%Y*gA;tU7kqk5P`_2*lGW5Tq;+0-WACf?pCQ5VlM=tnL|HU(VCr{pg zfB(f|?=>ec-wzMyDf#ao>@zne+|zpBshE*}CDDRgkNeH;2kti^XT(X@j9odrl^jlg zWO?G5>!(i@|NY`kL+}BD$2l4I_*-MnoWFR@YbeO|{)`|vZAoS<^v1!#g$qanP4E&k zY%|+wockO-8?mWy!a?GQ^>C!vn-a~Ca(FD}f&k3dI|w}C2TC59vi;Nhucz5dzyJQp zmr#Nr+q}G2Fgm<`(@Vd6`CaeolYMXRLr{Ak=EUN`!PTqx zfB>>AK|lh6A?6`*B%5tv5Cr64fN-ileN7P92Tq>suAG0*3jTk)!eVIrd9zPimo1b2 znPmSt`%L!4Tf{m0C=_owy5e5Qp4g6uJMahn%E{-F9NbU*;tK``tX*ODaVF`cz*6)7 z{O>*2J@Izs@R=kJ_mhkl$i=;Oa8)&+PBZBKWyc} ziw7UiKb{}Z2B4ieoA@K5yzWpU_-OSfzj`uJqoEsuc^8-`?vi%d($U z&t%fik_#NNg5WE!u!C2d{ml3M%=d}VSK2iYJkO!jEwP@mOGkAR4Sj3wgZbD_UnTAt zep?8%Vj-MRF}V_^<>^7N=}@6Nyd%IALQ6>^@~#k+m)?IMaDVyg4>UxdJVstgVRAz_G%QAj zGDOAq5ny@nx?N?1)f*!?q+;c_J$}N@PojNNar@dL#g34H6lml!zuLx|OYbJuMKX-} z%0t1XZ(H7>3tzUOS3 zva7_7Y3a*Ul-@Ebt1oJHAOL-~Mx!qZ{V#G|Xmv1S*T ziK_yG1!|!NZDoURaC0V!i=1Kr4OqxSWFluhZF9iTD0V=uGLaheafi8s+p;3IqCw{^ zSo4SA^Y|EjV1mYsnV;YQnx01IIWXF?`O{iU#I`{nF;~Pt3yQa{Cgae+A7EMVL zF*_k(fgRKmY|s<>L>mF@#OIRX#0?B=sRv)KDxjbSC-cT@-ft~5N#>5$%oJ;dKVkx^ zAOLNoZ&{8GRY#8_pUm|xvqa!4z!U-QBA9QepyduL!-%;nWi^it8jxRPmK!I__0n~8 zl;{@b#?dU~gsLpj1gdCbJ8Lx<)Gei)%C5u!r{M7u?=wI1m7lX;OsAnB1R6uujXNX` zkMe+ai+EP+r4?vuoc_GV2`BHnvattU;zkQ6HIZhK^E0 zll6ma(AegV|AM^LbAl)dz{0vajqUD>uSI`Eusk^vQQ zEKnBZl#`qYzA9trpsZEXOY5NaT*(>EHH-zE%0qQrLR-=FQI*;|%;<^JA5v}MY12K6 zH+dY5E6_OhY{rg?I3fjFazq>`lnGY?an-B`@Jy*VcCKY8*%L0;Oz<)dMMi*z95|O( z_^vK8pzK-3AkwU97k$3M+GQfRXecY=P%HP7uG=FDIweI)os|+n3%ZJ|$yNXgE>cd) z?=a<#pg?FbVRUV4L!tii%G(Xa&Z=mIdEIZ5>z4yyGSxn}z zEKGZZs4frSj0Yo~jX7R{n*v!btAek!UJbs4hN5iAAEY+AxFwPtCX1gN;mWXA|D*<|ToU?2`!!@`jj$DXU?U!pGB3G);$I!VU#=^}lvK+*rV%aTH6IZPrEyA$W|vIc|X=m?-+0DFQlK^w75Av{`UGGlC30X%>pb zXpuYQZpE5)5%TWIeNNAad@flvPw}HwB+H2m7msFn&v**qxm?D@sF|^(XPgEOGuCh; z_=&zk7Ge+i*u%(&)G4}Zhh(``Hk%Zo<+E7R0Ot%Z4#>DvCS$8$Or(s4C8ToI5)k;F zoMF?LO<>*UOJy)S7$TbaI2~p+^goh{n`(qSc~+u23;jxqJcOgq@;#-2FAwW6-vtI6 znoR%-zD29D$PU9|+)~9$E`n|Aj@qZsFmqsMKMYNFQp1?Sy)vx8wtS1SmSX~kM;+%` zn|X(fK(~McfOeU&n7iz0)$Hc43Tyb{ENJm9++{Q-{F}pux}unj?qG*@dNf*A?5#^$ zBvnYKA$JcNf}~-lC=g3Dl#z&Btz--XN}iq)xub?V zgGSYoL(lM&jp?;{@AD8ZC+giaT(}zYeP?HAZfZM+i)d~vi3Y!H6*8zU6a2(E=_fJW zSKH;*+v0L#M3&uOZlznYpQ~G?aNmQ}EBd(yo6B-1J^cA|u8(;=mfiDr|L$b+%KVN0 zfy1phCbQK~~&=$C9@EEv37wfK&iMdU5kExdpR0B)~r8yZd*)wEWV$-@RKU`2wNK^2CWDz`1jO zd`{SW?}g35rT5wOTXPPZfMhP@UEP1_x$7_}{K|>VC9RFHReI*4ow!H}w?pvK+0Dg^ z?|K*RA@GtqapFr~I@g~Af*<;!BrEH~`~Scv_ZkmdD(Z#GzCZi^Yl47t=7QkbH9^1~vOvI{$;a2O zoj?EL`4p7Z4xbEyW^;XK-Z~`+w&qg$S-||s%}?%^FWF17Lx!gkoO~p;zx_wloww?} zSO4YlFs!`)YaBm5sS~k4^T__@%YV2IPrdr7SIaI@zmJ}O^t{S?9VIuZ5Pt6Gq#vK+ zNct^G5O8bmehK43a^{4s^plTJ*0Xl@5oEOOf^Q)J2l4aG^CyvNCDom0)#jP&^&3ZT zOe2!qUVQY$M+Je*=F^+kwwXV6{8$y(1=A;(`KaDZyDicZ8H@PjLTt)Oy?Rt-fk4TH z`e4S6BlA@hVPx|z^S&WO#SWvs3Gxzhq4#CxbL1?x%pxadkvSFKnpZ~oDIA|w8BspH zZ|I6B<#{3x%BT14rFcBC^9JcTxb|qB`RL7CPult<3tlqEWq33v%9#3(DAvgNj(qeB zcz3i?=S%NAL8F&*Qn<%Vrl?n%pC*G|LLj({OhaTPN(z~>!y4r#<$0F8T}u#Wt;<%` zkuCYKi;sQD77x1{%t+Ya$@-&ZR@uVwW)XzBrwZVNmXqG`p zD7mCV-w>_#L*As(2n|z<N0(;AvPK)H#6Vskk{yHc_y2Li#%yG1rkU<%yV+VAEltQfUDc-7#cEL00WRprr$DDr5;Fc}fLhdl92Vi!P zY^sKqfTu8r3RwHXd#HLk#pPT}TO;l32w5OHO!ikTFwqOO??i$;#ECqe6U7K&{Y>$iD$Uy(a-c2+o7}bWN-4 zeLGZR(G!!IK4M!v^tl3Pu%R$Dzba$a7?!LBF$OVhH(N}cTe{vr1|*dwl_>_&ktfl- z!X1v-#bpG^sh}D*!H*}p{9&E`B9RNY5XDtrlPc$G2FCD+0%eX z7U<|X?AzC!>(xgVaQlNhtGg*>^tzr2W>n#cI4VKG&M~|K^cCJTayHVJj;b_2uX^vx zK;TKX3VFt)T?3rs{-o9up3cx3l?#wdjt)0e3bxwA^51jLoMuaxWE_I!81iS?7L#?k z_M(x=w`w~UOA2H#86`5c1ku~B6eBy^t~0o23+Kx9pyv zKPa81urVo>7L}so4M^6`p*GgAjx>8$Fpa9esGz*x~OVgwkN8}f3znp>?P zv|x*HG_!UjdK1qj?LWpI3!MuLMvXa)QvyPd+?NHTMhVX^jK3O+L*b_jc&!z3)e~&C zVAue{&}&t-@UCUkg&NOuS{IkY!coB(L}em6s<+OR7_Mk#FQO%D`@;SV=vqh*yFuyNR9QK!_qt((RrXS zR0_lvywTj^N;_DB;v?4Y77VaQ4tjnC@v}%XJ!M3E*2ee&GQEL#nAfgXbwIJ=49*7X zJz52gZIEx{IQA1NG?$D6A60uC?B@Xb;hLHQ6i{LLy6PjD_EbgQ!!tqzMu8H3f1^f< zNGNcMa08;0)Y7P&5%UN{vOuFz+l&om1__1a*b?uEROX^WXDu&|xMKlYeI2=owRg4z zMTc<-uLymE$fvUYddPXzp(t z_P~$Pv9ja$+D{L&bLPkeD1Afn*uHRsf+G(5z{tRniRi@!5lHB~5EZq5{Xn9J%ufF_ za)RW)|LiNId;gl(*hlQ81_@Gf9-iAFa8NI{mDhXf+No=ILm(=22LUtx1VMp(>Td)A zS)NwT&%PoB!{q%(xU)09|MOqF1%w3p1$*oiJjwhwAN|m8bstnbseG88|G3PQkZhEH z$_@HXa+S5W__%DYI*Dwq4&@3eR=fd zp>l}vzyo4m7}S^T%l7)$5A9{=rW;{zg8+{`dzJXf6MoAdc=2D@<3NJ`%2zsi?B2e88S0PLr3S`|-4+7+&2121m;d8uAA_WZT0J<6jH!XcL+;sA zLwuPxFKoEk^^Hhc|LRHht(h+l3aU7NXlq8|8mT zC$NTG*d4eLnW!%d0?B2LX3^+1#o7GvQ`?yK8ExOc0ozyEfM3_a@c7TBc$7r?4L{lR+o{2nDd)kcpfPI) z|0PX1eQ?U;N&d3cY2KzWD@!IHFjB>YhT{LFR0f&r- ziHY+O0|X{-1?NjTvJSoC@yuHYmjJ+u&(_k*CM7D^BB7#1X00hVg~E;0DTd-E-z=-L z^&tn<{3u&hfWbGExj29<(KWv(q*A+~I@~#^?5QeP*p!eaiOg2jnNzWt)8k4zamzfg z_to{956F#=k&6UsDF=4%eDIEgo3H~kh-Ab^zmaPR+xGmOXFD1SkNWf!JN@eQXf|Fs zQS+m+AtV(}ib7jPIL_7q3c~UxP2>4!_ujfmO__a1=>i}9In3VXvNDhy*H?&pcTz4H%c*{J8={?jUQ+Vb?Bwj^o%+tVQB|=eq zx6VWPH43jG&hsP%mZXn`y9~oJ4S-pyaJ--p`8gV>lSe41J~MV2csmM5vRTKBzeaN0LTdZ(Tu7LxaS@U zdzJ^sED|eKm$56J#jz`5?CL!4L3-zdIV!=Khf~**YWzB=1+|pZr$*^PKFk;9Qpu)n zmBNvygG_~BrKHw)#sY8FMYvK|&X)8w0oc_fMswq+=VUPt<~^0dDv^>98Hu=L7G7eI zi5~p@NYU6y&BDOo`aCS)DLAw+;s{JwHZ_IUV1nYvvnRIAf*|C6raZ2r z?6I!UEZK`>B5TxwP6gRkBSp+ljw-sMDKY3LQdDayV&0S3A=}@5fO481xs|VjTdfv# zXH5@%Qp4067KH8mkkcY#L1v>oGJshgU1U{5)z=(eCV77N149fXlNY|MX0_VzWHzQi zR$CdALae_*N0?=eK@f$U8Sdk_zv1O=TA_{$B0fw1=+-Lck1~w)9f|a3_W!Ypl>qqdU zjaM9Qn4}XlBnCM=qF+YR=ODQ>W4V<2p29s+;!gcypA(c2yaEr4drjqQysBy8*7^{! zfNn-hn8vTA2BFqJY`Xwk>6w?6oZXaa>q)UOG`H#*WK5Yg*~s{}7{U8mgW^7k4QR{sc^fI>85>TaH9=UAhFte5~|#YDaYJ=t|A+ zHP7AIlR41@GNsx7-if^)(F#o4nQ1oz1xs=Rg*#9xPd{B0`}@D};m>|{^drjmfK$tY zK(`Iq6XuWKapoQ04g^Ek8xUaKL12KeE5qFo{PTbR{`0yDS@cA?>~g)KGc?{X zf7cC{((Om!0CoN2w`M2mM%dLOb1Kue5_a~10!l=ReeDmv_BCT?RcYvsoLvm9WXSao z|M2I2MHJenKDGa;5C8t>KKq+z|JE1npKg9?fZ%=a`(?uP-xLC+nG_+nIq!5OJb+=F zuM;NU!JzPhK+t^bV<&#@tB(kRfAFbuzwkpp_?!LT+WRR$xbHWs=jsC{6AjJYL-MOoa}=-OR!|(@})n)FK~oa z#X;?TsQcyr;@ZpRUwY|pWX=EZci71``+k`9r9bk>nX}ify{K*K^P-&v0YpBM2KHV$ zhLqiV=~W-IFUXD#bGhOO0<(|P+3mdSgSs7pKe-@O^vfAO#EalUC_j3A- zrCDJ%I6*^Gf}N5nZhzf2udQFV)w7hSpm%bKDdX5!7Do|kDmjj}$%+ayC_m$2JH3EpPVL1;e(gDz8O<}TUNw2QS^`e+gpYy@WJ`fiW@p6p1yAW= z?dwFv2mCAiBflC$^p;`~DD?`kKcPpYoh^c8`|<;Ox2;hSp+CBkjWV<3L+!vwUWd= zsNza;f^7CKFL72TTpQb4UCt`9fi(c`1V<^5-XtXWn&w9PnvrEnyy%r^Xn6Is8+GSp z@FAG3u_Wc8Vr6KM=15>|sWAC05&mtp7ww~|sIQ@~vn6+%^w3NkM5Rf(JP;B!EX7uo zn&ZFN0igAiir*3vbXiekRIh}1@ga(EI2XZMtsz=BGoRJCSGH^ww4gwhwd`$CwRA!c zi+fdq%4P2R7Chw6ElUbKJ*3TMTpoQi@+IZvaBb$Z(3G$g z?;zjvqY6A&GZdLY7Z|hRBWe>Lt%ia8mR;|Ww}5v>j2xCz%T!xRYDA*M_mmW?C!7)r z>8%>BJVw-dq3vPc@@h@P3n{3bNU4IN3^$eE8iQp~(|4*f(&Js?h>4hI>lihD6wylX z9gD){gp9>p2vwZgO20Z>m202-b;F`ABmIK1Z&QZO_pYd1WQ8LDfvA;4MHCT4s1moO z!AK6Y#8{KE^&znJU$PzBkF+<~l~jmFCfvAQcfoq@MlM!4+yjVfuqNwSD(;U~$g-Q+ z9Kl$3(WxIqzme4qEzg2}%{tcJIHnFUT%jOU`z+pM3t-sXK)^D${?o{TRV=@J;!@!Tw1=iJz~q#1GQIa_pf zslD_*Oi9Ob7=!4RlazNaaGQoB1EY3cG;0-uTXvdA-=xcVfy?%Dj6_@^iHvHGrLVfk zP-W$8%?3Q5C8|upG~PuhWe?#yV_aIzjZ-6Iajq9jbzmN9qFhloe9IJxs(?=jdKdDw zh*j0jHI~Fk;4+#|0jA@eR)Fgmj~UAZc?bVV(Oc`ot}2ycZGm<;nRL-dpeohqJy|w%9{AS~?mc9BcWCj~7=< zANF>*$h?}o)RaL=b(?ts1kc1=tITXtXY#etnlBc^Ym;o)Gmi;!e%`u?%fh&r^`Hjy z=RI$b*7Bx$XL*Qnheoe!Us;(qhYWF%Pu`lfg{ZbrSw)B$Euy4wY8$2V)SP+xcN{8- zZju@e_JY7vPaqtPGa`+zpCWSu&`74T6G=}5cyg*~FbZjx4S1|YOZF;lX;boa##{lK z!L-{e*I}f~mlcPLw2=gtpQ{LaoPz7%dMT8n3Q*X?e=&YvG3AbsZL`immD6@t&d|H1z=o4x$5 zMAs5ZFzn1*#H0dfUy&rQe(fuN@PB{c18`+419Yh&^;2c`Da!hrKwz3kQujae)897|1Oj0Tz#R}Eev6C(O#M7**Wv-sdeyRNU{ z1?#Syf7gl~a863J)vIduz}XAu7UZ-8{=(|_>;wHL`ip18Eq;Za@FymP?5~?7`^DFt zVZs9KoRKn8<7i9lxq_d`vx!3*d1+m@?l+s_`U4M8u4C0`u#hG}$NzHk3}=|PWmTEp zr;D|DWLCY1%V2YMf1uiM+xwzzPQOMx-D(9to%UXT>Yu*&;#1+Nz|J$56+!>eMxJ`@ z6W*SlJWH_u$oq~JWcm{yP{~UZ1hx9t8j=#W^xGjA^4G1>>_3y>=HSssZvud@1R!_~ zeC6`rLGX$Huq>YnY7|4QsHeUBl~-!ZJUKQwpDvWdr(I)D|A$Zgu;Ra=28b_@Hg@~2 z^3@BM-Y4mbior4(mm>XueT8%UvcLM^^sA)<{xi}(`0@u|md@KbpowknyKIV=ZzZhq^b56_(n6rr|0 ze2^IZNin6J;(I^tQ;=I;{uXmG4vF06>aE;b?84%ZN(lAB^d(1X4>F+~T0|zG>Pz-4g0XAQ|$l?OveV8hC<*i5Bnb23$;ofJ#(! zqNKg{-4lA5mJjd_;}j=fu@7ojEz)n6Xh>ZE$t2}@wDo|?a>$o6-pR93;w8_v0D@tw z;?9sI!^D`0V9GS}+p2(Zfw`Amw1il}Z&%gUS~l+1eBgoQ&}is)nNJfY5M$LMQrzIg zP_!HQI2U9mqpB_4q(nr`kSTK+G6;fMfdzflR_MbN0w=JE5|BwvTc7qI*rLQ9CO)|~ zlub;pxFkC-C8<0_^>W^p0D1B(Q$}g#pz?H~8PKcHc~Ck8++rl*D-~iOe{kO_wxL5>&o)=#C?h_>GH<0KOQHnG=VMO$zmjhV2QQrF^%AXt44o$6g*h z%tZCRq3}wr3;qcYrQipTdgqUKmCPZ%p>u`MgbPl2;x^$J=DLa@cF_YyhSLqy?y6Fm z17s>U{@89&VC#0(rM}!F^t{J|-7jihCas7ta*@o0#FQE%3@#Z&8&sT_CtAwDjeR#WnPoJfTpp7_7PN3giIxd5=42uk{vkHS`qf(wYbHDglueq zM%qI)j{;?{hZP2PwP{KCDg_bDNnsXHxT_K%msEl=K|J~m6^x$?bfnOh+SpzMv(7um z0!7FP>_R)rL-0D9p#swmsKu?6tUBZ*7gK5!!G{pcfe&b+9!EU_%W57kgCbL9!kDE~ ztfAjkdh))0;e$lN;XL z&e1BiIQWicd3$2)em30r46)1nem3vB88qW`ofS>Z;cDoxzX%m=T}O*;gtaJ+Iqz=8 zy2!bu!6f_syRUMK>pZNL(JVh)t6$FYm>QY3!~X(Q#wmUTm6KCHTTj+B?`Ad&`o85= zYU;Jvz!J1(C1Tb!T|aARg)_4-V?fN(zQK1HgnU-T#>XY2(2O?eIEzxSs$m@` zD{>#}?{fAxlD|)q)~d^P-?_`_toMEA2Cs8l{YJpQGJIDs@H>Aq`zGoBy?1^S&+m}e ziNDwD6MzbT{}qG5&g@)@AHKMC`g3UdT6*F$TjAM#%=I1Qm$%8Uwm^UYV~{e^)X&Lq zLk0P}XqG+_eu&Ei$P>%s=F>OdD-usK#ndMoDM{Ht7g0RMd4)EZ?#x_E% zJYFeV+5*A2nzd{P8cRMMO)DC!n#x1lX{`9vDQ>?@A&Xm+4F#4>X(rSU`(I;k%m>Zm zTH+Nw*-w~!n5}RE8A})4k|UBHZadHBE0fLiiByU;W{FE#Vg_ZYu=-SwNoi2&jO&m& zna0#03rvo*jEDY_75rSTp4P#@=w`Hl=&6Lxk#14(+3_>aY271Q^N}}{DvnTyAx-9~ zD~BxP417~s`Gi|k6YeG{yyq(}^g7?io;E+?DS4*go$cQ|u+F|-!TLxNBX-&fhh!xt zL)5-XRT=O&BD#DQ%8m)DcPp0_%-L0o7jU{6S)fqf&s!C$ZCsg5xq=E%c z+g4jjO;Pzdq?#(kc;WnTx;L9sb1?%WK|aE7BW#2IDyssNeLm&BAIgJgiPx}+h-j7t z>)AptZb^|f0Bn|pRi z%2sTVnC`jas2_WQ;)AC%D+32JdP|y|$@RU9{6=Lt^_kG3fTp)$)=24OUUET>xFbSd zx-xWR&?`@yM5$J+E;0YDpGD6Ji(v3UCKw zPr0{<&k7;!WdgTKD5^M)h(FWbSw#LawKwbGMh!7%&n^!Ecg`|0DUIxx7FaQ(&}K&y zzh-ZAbVOwib7c-G;umM^yGj;Kd-odxV-Kj!=~v04r^eLAY%z1wY?fuCDU=@TK-|}q0x*{J z+!vP{Lq>{{(YED-MU_ZF@{q&ENm03g3V5^Ld}fGoGA<~F#A`=xvTA#Pf!n)H@fPzo zK)~hG1%)9`(pqz=mYN_&$E#zNfx4a`^?J!}AbU?`-gA0j!97BL;YNPUj-a=RFD;hc z8rIi!H4QC@T+m**}JPpZ1@z5DeWg7&SLDrHv3|1MHRWHa=IP} z)~c3-|3Y|~WAxG3^^wkrPPTw%$)BxV0z!f!8j1ijYP*Yk7a$2zgiafc{dCQC6X&6k zpiW&EZ5&U1%8j*#mXrV} zw4^|UNvmDvw(Wwiicwz9xaF${cBEESfh=2Uz2hE0b^>9Zpt-Ht!1pYr^6i~v$aSW#%_X3NgE9DisUI5fEW85w8Ef5ztncM91u*o_v`F00gnXa>R05dyN=A0mvGJ5H*p(QIvs5@+4YV#WS%WUwPd5uMGZIy7v>iq5h+s%%wO zV1^c1;0IC~bI~{gtCx0;$HC`$G%2`xQ%|KTX0#)#sPQAb9LbF=CcPq@bFr?iL3Y%6 zXppLfSq{eC2HmDxDOB+AR_C$bXLeZ>3(?rNW4G<1ojh;#EvCzakPj(bZtdK~%W(Hz z2FgK~k5T|}gMRVyxnyU@;?kwWDa&4%%sQ?4zDwGlIyiXWrG0KzVi%14JeQJS2dQD# zq!{-22ARy-|B&aK=-h*k_Wrcrq8*LfbuIDBU3%L2Lf_xNbV=O8IyEXYJ6}LxoLk*N z0RL)Ak-#WHaHdxp#9{vh-&-J%k9PG2{>K3Vf+R?!D`%-&AsAe~#W%J2omaxTb^}xC z;bI-^+I{3AC+!s;OMm#`A!l*O?wwIXiy!-V+OOF`q&=4DkHV0BKP42Nzrmx}au*5) zU2k03Clmzo7X-4aj)dX?0<#?i!fw%<{pgS03xdl(w1eqxT{$ErD5TOx54(i#VYe{c z$3cAN|@}pM9x+{`tha3ko-zuWjT$^abtq-MZhX6i%NyeM&mb z8uijaT^Gd{&piM9V~-VQiUakPM-#nEd=r%AYfnr2W0-( z8@~R|9S&rF{`42WnE#C*e_ZCh-~P{ElKyMY{@SyTKOQ65^5@Hv`~}koKJf6vo6Ut6 zo2$)LFRz=5f#h?$`e#S{kt z`|O)Ze27Pu3R8~^XN6(6E@oBcWE<2P~#Gsht`cNe+NaZJy+@VzcQvAw#~0CCR^rYyTvYt!P}ls8C>*6ALmge9~r zRux%yzNlgf5sV}fZW$Jm4l!bF!zua<%nCi4JB|p%M3< zqZL};L&MV|wJ}NK(cL)gEl^vXn>6NnYvwDb*52i~hRjwWMB)KO2PRAKy9lG;Xn|ey zp~|bG(@j}rR<4XpbIu6YHR;j3{SkY}4Tl34V<*_C8qnZn8dL6aLbEhprFiKI9ebWx?$TN(y;^^Llt@wFoY|S16&hzq@(Hj+YTBVaYPZu*KtH5 z7=c}6$J-(+J0s*zbB3_a8$b6Mep#hghM5Nk_@(7Q$d;EwN-&s)a5l9d#oQ2le8V+-P`POY%z___M zYL#}@i`_f$;}|e2MFj5@?Qk)lhm5`AY!*m_CkskVNd6N0ulzW^O&3YCQi8!+h*&LA9c~7)`j^vLktp{6>DR4uhjY%q2b|0@ODGA z8TmuiTNTHi#T`T^-JrMRAxj5=~iZm`3*J7V;PMK837~tkHlDgohUf-AA6} zhdi>fETI2d@1y(zr6micPmBN&zG8i#J#u~=w7X9ffna&vj74zL43t0J7bcgnt|+#y z0|bIhRl>cbmYBTtdXYWZFHz=sNCpK zIq=W2B4}TuaSa1-%P=(aOBM_GPn1qC1ONo>OcfA8U0UH6T0>5!WEkhB zFExi~!8BF{=K)uI_H<~F>6UexdI6?fG}V)u#YGf8X8k&Hwp|D0t*fvr4aP@g7I^w0 zl~z@*nbh~yBDd}0<;#hdmIP=B_D1(T$sKxK?&lKquJi}{)J~qW>N35DK{V0%_&~Lb zp0Ce|YBz&AM<@Bg-tKg`d~rX~8iBMPFvvL?I7tVZec&yMt4o6qpkpp@gOO-)$xPBCN>H4+Q29w0m3Z~)o9(R|f9CAt zawq@9%R12PqV7by-wA>Ea|Z~1@fY3K1_(r7O5F{CN@g3unoiFp)6PY-)`bgie)C)3 zdivntG374m?CJ%Y33)9NO#4(E&H%dx+~}3u%(PGi*L~>)%RrYPZA_plT#nCEBT|@6P8lQ zo`eb?sBuxAj~PJN@E|<$w1RAClXLP&>+a$B`=> zh;}}E=Br=bo{uDCcxu3wVo4qRgx*|hbiF8Ex%bLF*`T41ivn(A?mHUv!S&_M%hw`C z(ZYLsPXj^M-2%bBa^7*{O5f4WXV0A6-dLT|5nx+&c5`M60nD*5`no;0w|{c~5wji$ z$lFe{(kFdT;`V;!@BGcQBIDmV(8@bq*!k4!KlOUSAdXxvDu4Tqa#dZbRqfKbsb7!R zqm8b95FDJ*?a9}#7uSb--oEnbq3kd9MZqfKR$ZmPxPSc63$pHV-s!hOAdcKyAyCiR ztvBq_8uSP30UIEAnx@FzZ#WO@5`sWwKi=YE8&7Qsbe_N}=x&(2Jh{5&5k zFH^S*s~DJ)WWauB4O3P^|izq!d&9C>v@yXnxS{dJpa?>J7hb zloWOFzu~ntxOk__cg3EiREPJUC4-?BhBqV5UFufzXwpj0lNCZ)(c;>NhZ zuy39RYKXU{p|X2vCO@f3vWKm!rn)t*YU?%cT{(xgzq2JM7hW`tmFOPbb~?s?6OF7VSKJAWjoY}WWi~0RJnaX=6;6l=v@G8SV&~+kGSRwthWV;w>aN!ytmKo;l4%N?4IH7<#R9hyAtZQF8N(Pw>jK9y?goG z%l&4u3A;3yq~EB|oBrQ@)2`5A$SQu@Iez;wzF`){*7f#2`wfHsWp)hrC_Gf{J$$-* zxPRxJEAFx2FRy#~+{^u5>HKAO z_Xx!ZAYiB83m4yiFAuwy&%NAlPe_^Pkq)udZ}+`vOCL|d-L3BBb1(P1Qdqukm(-mdkFt5^-mUd->eU{r31;L;1_DZpX-<#rE?=s{bqzzhiMU$Jg_{RZt{UY-0F_f+?{*lmOh8;DYR@8D)jF}Z#FuiHEH?Y6XHmXZwHgm*fV@#NAA z0@iEjNyQN4&J+gM|Np$dSv&q_e&1pVZ>`G|CDrgfBiG$f$2UV^!cDa=_Lp69H~r=J zms5rBU9qzv>+c~1yN2++!@>6)1>ftU|5g5fg@J!#Fc1bvhWXjQF;M*#Am0NF{OeY# zzS|&$0G;qXZiqUjd{1?+Z>KkZSDYIzK_wFZ#Z5K1+_cN2S@CX?&XyK7o=K88H0)d| z&^;9#gm?Mfbh&A|HPAP5z3C>?P1`nJkFLV{8&rhYM!2hl_iZZT5QBJ5B0uvysE8gb z3z4$n;yc+r9$CVW3hf>5u8%Mk`>rEg0}CT~A0&(s07WEzJ*JAM!z`wl$X+y73wn_d ziSl^fm9MdT9LJs%9VW-IcSqO)7hf%LScWEKD^i?fJv^brtwTnwWRaZD}+LkVH9szi@zGgl92qOT*S&C)(1puQI-~)TS2dLwKTObL^RZT5RrZ60GPxg{y z{M=+#rzT9q`GAVLj`J&=>fs1-br5_07fc5p5&@k=R^$y zGk&ni^3$bA0EE5u9MP@Yfh4E2m~z)3?x61THs>-XYkXh3*u$M1%FaUQV2%i|Z&CM= zwG-c4-}N0OP$~4jp<)&-Cflv=J43l`tRc*hPIM{SEKDpd@MQRD9xAGiVK8V#V zTFc^`HjCm!iBCxl$I5Ug3S6w(H4DNx=;i{PS$;~ z^ld#E>6$$Krmz>SB1a?G*lQQT!J9#!Bo~s?NgGc?@fc-ax`<)f@RDlg@MM-_WD?}m zH>^UzYExSfxRzC6;wzUfNw+#lFrXxP=_%+Ko^3*=#@h$NkMe3&A{D#zk+ULHk*y>5 z5Q)QFw`~VBi*ac^*W53b-RKBedH8D?EDhtN$=y)nQRMtKy_v!gh1;W$M$Pf{+1UCu z7i|_LH=B`J5vMgVi%BuVFoMUOmc?CS#klUP0ycd(;Yn~&FXusw;@~~)GOA70P zx?V00JuE<7opCYK@(3Z)NG+ez+$jagAkHJ@$Bkh}qpX=s4yTU$!dQhoT#vGhv#8@$ zmvM=EHlHrLBY{Dr7CF&10?n2a&fJHiLpbNhTt+ru*1@>udD+=I^YE~7;G#Gj&D*2w z2-$0gT-&$|hnxgAw+4kEkO~9E2t3fip2I_KCXfAkDV~11c`;sc;revSK@pgLR*v%v zgy&>Ah!2bnpmc136k0 zl!{~^j$p`-)A2OSXpy4@r&kyQCUqG5g29p#8bt_XeMruT>7I^B(=i6FJK`@eAkd+7 z(+>3WRU32pIoLK1hfIrX+K)=En4szqB|ko*1e1Q1EtcbMzHo;vCm*`7Ku8AcP@~Z2 z*(#fc>AJ0oFj*XOh$>_?0u|qD`|{AT54TE+>ZwJjf60 z#gT+sj2CMpRV*fmKOgbyXdXQ=8t{&F$w`Ld@Q}+0CjH?wbbz-gY}qZ_#prOvMQ66k z`-MZi+Ik_GOtaN|i8O-H5r%uqBG@oV8<2|FY!V~KX_h@1s7G^{!-~F5-r}_dsS$Y; zF;9q0E+a>cI_ijSS|WPDH~|3~rblWxbg7wr^VZp4k)%eZ+qkfGyT`y*WFY9+Z%uECC(ZDFLLAg63?Ye@Pwmth47Y5TPFx)BVh6o zBeO#8;eP3&LKU<+@8RM9>?`+o9OMK*UDxXyL7?pL_@8F~cD{o^BBYh>#fwAE%JUdI zvIx%H0)c=--3fu*fZ%>zdbv~L$4(IJ9R9-eW&#vd8+I8EDA36f75w!tM=$P)Fbd!I0S2MG&MjC>L?wL6A;Q00FJ-E(nz6e*bL$_g@#^ zUZDR!uY2NeGqN$z(=*E}(k=F%=pQ|!`@TMTLx1RX-Ay~6rqA{dz3z!$PzY`cPd+=H zm=AD6*j~uqXI*#Y)sJ>h*atX+anYV2Ug+QRI{W#8HoW&h{Q#$ObXG)?yubWq)dJ@| z97bpJESRIB zIS0j4&YNe=U*H7IV~?Hw2}$*k`=9>lpMG8X)oagh9y|TmX`MEa{p0<|dt|IXHkrH@ zENwRb@gwhe9DuJ;a83_>?sLzd&VE)cTqkJ`4uq2#cuwL}EFzpAoNV6lj#uWd%{5O5_rd2QbD_?ffPi?f2@ zG!RfGdrHVkWf25}ij0(kAO!552Nly>uVG?WVw&?HXNMm(m3|d2n#d0|(4s2@!!Alk z>@@H4$!yt?d9W?JPwr_n3QC9Ao$eFAU4`4N$tKLDL~hZQ(@xdNkZt!&hlh%+`<``IIoGWdE-r0c~rb<$CPXtfmCG5f<1tWtr~DNgld(h znLi>lW$xV&DvL)ESN=;76-cMbJo9y?bL8Li!#gSQhU;=!q+^+NLzQ5XEfv(u(D>j} z3{U9M4b&@xN>qlM>H;UuqcgEP63mrh_qb#BQP4Nmp_7Q-mhoNfi5|!j_b7-uQVyg~ z3lQlWIb zd!~pj&5@}S`Az&J?}xnWJXi^p%NzWU*Gx1*Buo{Uds&j3?n^{WmrH9a&sk;?VDcHP z_n2y5lM{^W=$1uZJfwmeao?;Dc`(-& zL}0R2QohLXYR5O5A8KNhH;kJ+2O2+Gau^uDDTF3oZD?sZAqK8xb1WMy1VJ7uH*Sv- z^mzl!y)h-OJIkOmnrY{PH~tc(Hkml{RaZbgxgdNb;*u2Vg1{<%2w()Dss;J?Q%gYH(8T#KxP_so>x;os{F_Xiotg}+)~b#YT7O3?u)kTD3&E5 z10xb7Bv{S^28(T*xi*0Nd~6L4YoF$p9JpZBf?Lnby2=*_D^PL~XkE)HMbD7X9fgz< z<)^nJv4G!VGO6kNIeo#mdFvLjGgWRkLS_fj=n!r15Z2tL^U7Joj}nyu+Qc&wLtvtO zhQLCKA2G-DR_%7!P?T7B*(#km7Vh+J!caE%|FQSBv6dX?f!^EQ)#E;wSGs+eai}00 ztJ>DW14Xi~B8pik*PiOJwUM(SGzxaGabSnDfWbfu17;jK&?X+Trn?Vw&IZW#aTFm6 zHgO%Oeh7JU!FS-0mBTB)FZy5><(ad*h`^?iXu$m?V%Mw&~ zKAY%1aHufr%L!-kLFQ$ZVUA{P&6P$>pe(nf%#5dhNz1xOk9fjXfQjB|3OZ?owt$ylQq`el+Nkn_aQ+A|oj zv!v6=3>r8h>%{R|r7J=p#2Z~>`Mfzjt`25WQNa%@+;mXBB2`Hh6XQe;fZSSfoc&N_t&?=& zUE^kYmArTsb;l@lbz61ZuvfTD8!Vau>ReV6?ucfPGyf*Tw5C6y=IJMOL$=vy)1Y+C zq=cQ3L**;AZ!I?E^J_f`iqf|XkxC%%wc|RUdZroITQ9ts+eKEvkeG02-Lx(!Hp@$9 z0~U?3baUY3+&U^jS5aZ?vRSCR=$b`8=y?V8qUXp~@!Z13`0~;$0>#c7?qr@X%7GqT zK=}_0-5DIKxhVo2L4IpGcit39nhbf_ItGPd=?~17xHXEEurAJI}!@)4mRL%CzHvb6>Y+!Ikaa z_G{Q;kniGiNwH`FYiwrwMekWu2lz8gd;T(bK1{|YTfwek7PeXK`>KTQC!w<57V7Uk zGYsVQ0)(72HIrmCOi2@H%&6V9I5vX#1<@9vEcEpuKi;F9apa8*A+7+HhA{odEtZ1H^7`h!QU2T zeAlp8Rk?NRAu#8hrc^pRV%KlB!N2vsrbF=MBW!&?Aihw_NU^>Ng5umch2Xt+At181 zuzeUSK6Qz{;{^mdQg5Ao=Inv)TxJ2d%viC$NZ%v!o=cbR+|k&YR^*SvCYNPd3nva`X5r(OW?PhSHhjstEsg?u@6SZSKg$%@zX9 z;$8^Utq`cKB`YZRLZI&SISxGHrm)XHmwan`GuUPBzz*`X{7e!^^Yq?t!8emL@#H=l zBibc4rxWzz`G!0#zbMa$-m1N$nIGO#*E{#le)xlWbJ$%f{4*c&N;_+<^&YvAa((8o zJX9+8%B9=4FI~L!^GE;S=pRIWf>;RD&B?iQ3?~S?*Z&AgF5UbsG@Y_8T#l;n8VGlYC~&NNXo0AcG4C z{sIV;R@5|iA<$5u9S7Z&2tgbJM@N6<=&{GfQv(0wt2z0~d zgeHIac-rtaOnTn{|( zz=682ZN3~&E8ql%=XIH&qcL2#w$Yr9507mepFBS-A7-Y%!r2o9K0|nZ`!)^!5zfEK zIUtm*ptGNmXFmMl{I=$C{kqQT5dx*s&+grbneQMV$Y?lseaCsQgJN?|^AHT@Fl}4$Y z5t1EgMIb1Y#!30&(A)7(s}Q@$H0fX)1J%IyR8tn5g9R#%i))_LT?|mn`lmUn$Tc{= zkGvbw#BVEQmNt<8j81c7VZ<)2gqrT){A$ob)6j5W5YSQZ=8;lpUHG(D!YS2dI&e)> zL*+8l zEv~Im8vCwcDIK(%!l_rz8{lJd66(8lcFI$n<#>GXCPP^^>*16XdBFisOR!3FH`g9m zdl0p4V{;ffeH8O*@^NQ=47wL!kXS9N~tnzb2Qm#8cF*8+0gg40<3H?-UZOxIjG30R4Hs*DA*zLqUciyGd$8ggF3f2OTqa zyi|;dY~ZDsG!&=Z5vWEW2E?9se!x#hCHLFEcvLUCH_zMQ|T{K2Bv9yeZJ0&?kvfw!d*{o9+sIyXPVA4R5itjR;shfjy zbR@`%jv2$(9=A`kka_$I5N~xO(NjYTa@fXLMxBB@#_(RNb$@thHHUO8!8a7tw6sjS zrkYJN$!1BYsdfV6gqyV2Bp<`8rb(KnUJgmYwb+nNxI3j?sL&XrK8@jsL6oxLO60f6 zVY}G}CHF*mG-L65*5PT+yy&F!xZP85H0b2o{VJ9^HeK8tCjCG8` zvGm+AruTU7O2}dk1t-^yIZ*dD(T?>B0Zr_o5dF~RYr-vkNwe0A`@+EsITdlK>79nB zG`+ts#!O>yR|Q7^mMAwMlCSTEH(pk<%-R55yM`e`iQ0M8qUEOs-pE>jY3Ck1p7(~Y zxhc%v4Q~j>+#5r4pzC)zGz#E-;qJb0Mg$#3KWZD$oY-+Z?A+zh-ygnW4l-W0;T^54 z=H48Z_vJtgrvCQ`r{}qMfQe6AGic$c4lV9@6Bv9T_#Ap8!#3PO?Q6J>jyP@v=FXrk zb{Zpjn;6_D@Rx@JU74pX6I-W@H;e(_rh|<)fq8tY6ar}%F3zVKzA9ok%}XFPmb)>E zF-Eu>qe@x3PIK6X52xWwN*^d2^WcS@eYKY6;yv!2|IQ|S@1AfSXVKi3!@V)SU--7< zZM6TNT3`OZzgNZo>tFqT;UeEJ#`g<9^XXv=!dq_w6K(?gU;eZ275>luuE_U`@%_SM z@l4vdaOnCmh+`T^XBq6)TO0Jl+Bp-9Wu3HUsyG4qe0-Tw%Ul-%9crLz4qMCIv=iA_~tXc^LH+z$Jb~9CE{DoO)7kT@iHk(g^XVPDLF$d?_@M z5IwdJ@9uTQchZvem{wZ}UM)+1EC%0zkK%U<^3E6^Q{Ws=JyU;+bRh?N2avjC^UE`_ ziPgN-#Lqpp@jTSjqs7zWTbhbK(%9ftw&vaSj#_4>it%cmj?gL3nr|Uz%YrAN2L_CT z?fTRvHjt6j6ECLIelj#qs&JQ+^=bwNCk_&!F}8%8)lFrk(VbBVP!9x)N*eIb*7?#q zk~(he>5TJBfO7D?rhFNVCLugfb|=OvfyxC;w#*r1@NFe%dBmdmCN%%VqJzx9%fY2> zVpWP_vwSA0jflNwN0Te2D;OSWrA=UKtFkb~LyK9R(h4em(g49=DIJ%`cAk_V85Tss zYmj0CG|j!ns3Xyb=LaUoQw_Q3-!{ba4zGYveFBnI$aFY>Dr-DK@Y0{*X*&ylm)DvO zKzvao0xC{81%Uhw`c`PCw(pksgqsL4I&isUDrr7JmghX6CH*%0IzZ>y$vo=T_RB4b(7##<;(=KALPD_)8 zq-0L!aM0DqQW0ZyoLWk)OdvlBCORf5U9WZHi(4{Ei`A~734wqh76JrXhn6V=x_YT& za5(a_I<1gT(Gqk9kWgl36e)1Hk-GQ>i{?i>I8Z^YBn_AfD5mk$kf9$^xH5E}wLNa~ zimibg7u0o$G#K(Ckr@k3GaV|urn;*n?=svLsYE$Us0LjUG6_xDG3?d7q!LV5s#}pI z1CXZ7$WqNjTa`cUQ9=y&GDMZte2BpcyVl95)u&E@!eLBp;{Xg)Bg9;+tQ=tu3MI$Z zSx4lwX5>_<6A8JX2WcGXXsQaGQQvY)`GCX+*5>A?EZFYPL^CCZosIW3X}IYav(mYP9O8cwxu`HBU!&*x#yXh{$d<Ur0nxrR`{zbEhI{m?rDxaO}E1B31^;6oSznxx@@hleV+UE zn$JSLD%-NpJXcmBK}(wn!lAOS{j_qeq*j$Hked4WV&xb;jDmI152R?)2_WdoVtUt> zC2ooWmmr6sWkh)94Jpzd=@{X64tf& z1zR!2=*BkCfaPS>sYa?KO#FOBiUu8JB)Xb%HJv7_Vv>Y(0knCtnpUhL1A~6W8ZiZn zsTeUVWlc6ICy=PUEMV~@V*6Et8V7?5Nv&I?bIXK4+f{ETgegI0Fh{t~j$_c1q~;nk z>f53)u|NZNF<%sxf!CUHHbefK%_l*Z6O_tVd;^-6JHs+@jvC<460oR4l`ty2@p{R7 z=GOqn)S|6Q9aGBU@U+y_!~UY#D-YOALdSQG3qv{WoK;cR0gX|5dY+u9pl|83m}1H5 zPM#S$ygieX@u#{H9yk8DDPeG4X_KZVpV3A&cW#^dYISuhi<8lw>X%}V4$;W`Pvy*I zwJ(sehW&Ea2R?f@x*r^+dE1!N%gyNiSQW!rdSgy?bELOZp-`tk81nICY(06KGq>eE zkE{G;)Pw!SUzAg~`W+prbOiuTW1R4=`m-9UDR*vV^Y3(d@s2X5GsOE1-XF&!-j8*R z%}*hSCu0-7gWyn0!o7n)-703e3&AeNu0(a;3jrD5g@6*(y@Nm$q<`gRGI>YBG3|(6 z^o;U@cw^hxQraZP)MuyptSzS6u`14s@0SVZM~yT@-?l0KQui;Df+o;#%~^9gKK|}^ zU;pzF0@NWR1W|5FUMe=d7Xm$V{uBa&wahm`uuX9a!JFL*0V(f;K)!h9Kl;TFHbwS( zPygd@elSG)7eDyxXaBVU>EVaAnzwJZw;H*BQ>BN@c;ts4L~e*Z$`x-84{x=5cXGy^ z9p#Is@wV|dhtJ2Gwl?Q(A-m(?@v}!qd)MUJG19T4!=s~DR(@!Y`dW!iLf{j9exLD8b*SPzZ2g1RV_`yXdcPno+ntPrr1i+07 zFA!jed;kO#vAJ|~<>;IY=gH;TwdU5r!QtUc=RS-f4*Be#C*W)Z(O^vIT=od&C8cQD)QoRe0;9h9DMC-U;S!+ z{r&IPnECae{MzOXum>ca>PCcp>G4k(=VDd{L+Cn9okKT0hj=;ZOK+`(j??aMLcgfQ%QKkj{h2@A(iFxDQS(%1WLs~&GF#` zqty?A#zEHv1d6O$%Ts+YsKoH}zm>NJk}jB(W_8<4)8q1G{U=dR+5mz7pU3_nN*{?x=L4sAm9v*O5` z#?ZElMr~~$i@&}%;uCxtA6=F@l|f2us1!@ibxZ~R8tn)h%>f1oc9_`Gc2EtLP^G;s zz*wO+whLiUR*t#}^eAF_El>LiU)>pkScuN>6>+#%Nm7T?r(k3n%aYbAt)%J6Rgnkj zO0r_S7-%ODg)DfR&QOekWc2tmu&7PVdpe&^%Q~x6b9XBlOjTDYbu$_Cf?pc6f$~yH zjIlS*3qPL>l+hK|1D5ZW^OOxw0-|gYi3nP1T61*M08)w;g{%mfIz0_o)F9iI(uW8) zYp!h^Q8YG&7I7Wv0M4pAK6{3nVo%nIv$R#7dP3@M=w~CPPZgEi5b{_RMNNbZ;}Hprwgs zIvJ=^R}JC<*E^>xWNxU|^=T~*+?W^|XB=~EG^I*SirQK2uoXpi&Q!s+wyKC|QT1^v z9Z4X6c~E{63a$KVLi|h;#r7+pbM(0~ZV0EvDq6Kv^#)iqjAWCiQ_B{ zDs|4{B*^JFupRAy_62%|bf)gBV;Y)T8B(Py=<^h1Tp$7q1DHU=7$zw(^KP$<=%FsTL!33W!H7crM%$$*nIP3x{tpxxM6TTF(g zv3VCHlvT(VOXI55YE=%&qN?Wu!^zPpSx!dS(AXHnh18irj{h7Ik=GHYXYrGfF zeRdRym}?>QrH2cuBh&keK&W?`HTuJ)(Mf=TVlI{p8)lJ$TKI9kd+8Pn&pqFK_d8;G zZ%l`>Z|ZAnVcNiU7@DFhR<u} zfp)4;X+>uOU%4BlJgFON zW-xBjB#4Ej0`1#(D;RM)XI;9^78W*MxsD^CaP@>6&%i!c)zZvaUg2*s4vNNA9bkxs zhd5^}7={G%+#sdSnqgk?;b|AZz=Ubh>gDrg8rTRkSQ6dD@_AeLhKitw61u*a!E~6j z*;yMFb$DoXM|0EE(QWAt!JQee?v{?lc!c{5eBwLWzcij#&48|G*KK4`w)A4h*QGUF z6i3j?aY0(TLigO4)nsn#EL6Uk`?*V5oCakFH8r)`yQuaVxvJk~#vt{?<`X@SLHMYf zUK5RSK?eu_xV9+fa~rj6KKogb&th&uc*^DrUx?WEsXfMhKes%QcK`5jv)TLo4SNmG z#tg#dt6z<~5#IuVg0(AM?YDLpw~B~x(fl>otC_VWLLV{_d=kxj5R%lVF!VhtRXuH zpwJ*SZ^+T!(Y142oVD?+GclF!B;C}X|0kb#&-N~C?!5llkEYM@A^ptHI&7Exmg?|+ z;^a3+f84c8pH40(&+hAeV4rf_EXKO@w8o4#gncUB&)rmKHRQpjI&{yLACqSPJ@SnF zF#BEKlk^n*^!|&@+?a}GvTCJNK_tSC{cEQPp`_=STwU2D}=%=In_+p?J&Y%Ah z1lvKTb>p_QpTG3;Uo5^@n3vCGaqYu6Io!|ex`bvF8lW3%K z@ZN52o_iI#_{K@|5GE=YqaFOU_9v6~%lkJsZfwp&;vQ^XJAUnfm)^bkquZBa6wN`~ z`L9v?FJnIX(O>=5C!TmhuD|rsOPAzUeR%2c5<}_e#>KOz`&o5I_P_Vn9w_uSwFm+H z2i*gFb93_*zRov>M(-TIjj!sN19tX)Ow-)V&YnGcaPWXU@PNGgEE?FiqAK(5x4bAgQZAaGb_`7hVJWpnkX`XMWuqZJooy7HdZ0yA)l$QDM#t!z3bfIDY15GP>DcPNf4%*LuhmCi}G`H zWIH-!Yy-xD%Nbj21|xE=!!15t&^WoHc5XVaXyjaM5NCDdDyH10fm{XYYD7diW2r0{ zxVj@r$CKsY9rEon_9H38(ICOMl(ltX%{2@!HK!FEd-kq#4BkFR@8MoQOZD(BD~Ink znc3wUBeJiSnh!3{2I^Pj-2|0xWXD4tkkf6Gp%kqq6h)(=|X2QBb}7WhF6{GbKyZ-LCgW}Rkh3EZfe zcs^9{^5E8an3vv4BJe*=1?CtmUp5aTvnze&`79N|sCwU8Dvi4&TaJCeCl&8nT!zj6 zvZ^gQXMD@a$-#?P{{TL@MIdpCc<{l7&mBf(ZU7LO&X%awi}F*qh%dNPrQcWnEFolx z?vh2ptg{*yBxm9aI9(#v>JB_B0Qo4+)-* z;5GFQmSEw*-nw*QCj&@Hm^8Vi|7Y+KiQg@jbtv@W^Q?1WX_~bwr&A6+Smv#`SprZQ zVkJkRgJ~RWzO-WiIGEuO3qED{gqI=lG_)mh&<4*b9gG_6DPi=9B@g~BM+_mr5{!;0 zAwIjls2uVYn#?8?L35UcrNNLdY64kWM@>x!RiFGRW^^XmYe`g?{cDbca{edy{#IRILM^H*-Jwx9j zdeeU3HPvpVoSbNCEDho4xzTME_um?%N=k*~oWqdgt?FV6T*LM+x07;RuZaT&UH8>` zF4;hT&!@JWPctRm$#Yd|<623OqI0fAnWk=Dk;Zfm@fh%Qln%e$1wa`VRv|=$;%bYK zz`0(WUsq1g4FUB|v<)g)$d-C%34lAFTiQV@Vai3$7Rw~K$xuzgw77W2^66$!5fn!`EOJ*cjWFguGhEsg?oz$dq4ALU3u@cwdXI*LM z2G9xY`4J#E7)uOeH7jnN}D3ZTxaZfZ$V_{Lfqxwpn!0BWerz@kX< zXm|Jp(KEE5pt{bZn_F@&RTEZb@}XDvegKWNRYsG_993R%bo+F%(MuVohos zqp7j@rIL6AD9BZTL@8yw0plKHH8m~6l2TU)XLFemx+e2AbmCwJw;-Pd<18Ucd73&{ zz#E1fp1w*@(z@r67CsM?^@6&fd_BRxGy|Ds#lmR8aB2#R-I~SBVe{rko!XYeKzh2M zm5D+lXvlguhUyA$3{cO zKubrUj4Ug}6g4qmppq-)qSC94gLsI8g<*K0=~_|guxia}y&{OO6SX2HXQeJ!1Id7- z$hWFuy<`PM8V_KuO4f;SYX;7O{+_Jifz=DsFDE9=IS`0bZYHuCINe6=B44j5WRQH3 zCM{Z#fG9~4^-h_X=tKgvekM^4O=QT?kjHIs_-o9(u3{f=XL6G|-5J9z^g&gGV1_rE|#KXm^h6@@+krU}=8u@z+V$vW5X8qAcXG@RbN4cXavY6`im_AZBd8?QokaP#IUw?LkO9Ln%{{~1=Evp{9iBH0{| zTADk()Mz9BQmN00<~wSvZhdwdv8t!4F?Md%^VD-@RX0j_jL7e{h6{j^R!$}o?x*2wz%XOW|f{jJL)|@;rU#qz&m)C8cjb?5tc`s0 zo1gro=T-Gtks9rzExVDkpSXlB>k+50Qlq`SgM*tlvn(KeJ9`$<7Nh;zwY|M_9FRj+ z+0oJ0uK&H_g-S}3aOtu6@pjd2|maJ?}0$WMhNyE+j~qQP`LCQTnv4CI(rbA%wK(FYp04?OUW;vMg}xrIPW^45dNcG@AeIH)L)Q^jpSn9u;y zwIA${zl!9n;i=)pCYl+Dzg63WiW=I|^j@lFf?7=_RWLoMCm}kqI6E-Ot>(fXM?1Do ztkSTs5L&L2qTDbpYch+{buh{E6|D6sGhtqNyY>JFz|%F z5I-SKLY^vRONTL*D&Yi*wbmw!wU}H1YF4l&~74@;{&SmkrYesxo zNNV?YqodKIa`OSZI~5fp4z43|byUg(Kx4 z5a-f)174^)#foHVX&R=;0Z0TzqZOAa5|VmSpa!&BQ9xnsAe|~6qw!k$#-)_x8cjnE zNDUFcfW^%^$8q`$6y7TXbw}S#jouA1YgMM_a1Y{AYO>71jvPdL4l(IOQee=`*j#83 zGUg?%X{b54Ifbz;Nd{1c+-jD@hD?&2VBW!GZ0hdz9Nyx=49bKThn}49r|(-sc&D)` zZ6Fr78a})+uEsyp&~=RklcFpL0y5D&i4VTc9L7Zp;f{YXXAM`_F+~8W-$Dc903QI+ z@ewq1XX-#cnq{H99(}7s!Y&l5GDVxTAXQpXdqRjxjLr(9>zdb7aa!|ijRd!y< zsW>+B60O(@`h=5n%0N!eG8*|&vJP+zyZ$Cw!e~fmjLwQdSk7-=1BHVekomfCr(Epk$d>>abap@s11Aiz2&Hpw}Xm(d_rvKc9%18t%sqKkQ0 z;AsGh-MP|`T+wjlULe~>%Q&_Pna6IX?uymMo}a+W(mIxd_G?XJLPVIFLi7zerXhBK zuT!$%balx(h)f)C2P-yEpI~S~j;b67rzD=S;I`v|BGga|kEK7D2iTqxse!toR3yX~ zWP{OeYWmpgB31xCVMe{jFa zGOq;_kABC)`$^FRZINi8(6(==z3M9@c{WQ|PHHyg)pfTx?%^SB|r!@9x*5bBrD}f|a zQzqc~*z-uOQ~zo`Ftz(>jap`wm_@x@ASHL9=JQd*Rpnzc%q=OQJ zY<(Ukss+wkGG|*Q`(uT}ZR|Gvu(jz1N$iAy*N3(3!_cNSA8b{$>p;z5MKmk+R&(TO zM_s#6#xK{Hcnb9nEk<3iGbN)iG>p@KY`SxRMw8s*&vC%?CWBBNqZxKD&Q?QJWQHqb z#5S#8rj3V$R)tK!YXdJeCkgx5e(UTsou?Brio|w>_q+;`v}o;N-}0>a;m?TV+W^%* z_rr8I4v4lhfCitB6lsN)Noc7Vqk)|0aagJ?WGAY+1FBc6T-L*CmoBA5G)^@Q5o-@Cij2#|9oLO_~FE`zU)jWeXXPttYujgTxdhW;8hKb_40bku0C8?Lz;lN~8 zpRs$qXQVI`3U9IBV!|TNjCFZ7H`zLMOmpz8v=$CSCSmGJZ`QNC>DTSbH>>(I{e#fn zS8-j1O6OG`q*-wBr?&Q>zTP#X|ApvrSz~X_gHn;A#zhKJHuafp4(gBh)#(LkF7oo= z1=YPJbZZo)2d4$O-TiiMwG}tM*S$r;IX!fj{;r)Q$vf2LoLoKkkNPu5lI=q#LOf*9 zIg$8K0tCeV|ACOWn{IsDm9Dm$ojqdbcilS(jl7odDF&W3VQ4q<-tovUfulgAE8AUTYk*q?I6$)Em42>LZInXcay_Y z-v)x%vWbX7AYZt6aX))Sd3nb>2p$Cj@?@Xku5Yy*kRTerolZM?ad@ ziBAlgvOD{^_$NPiIq82^?5O!r^v?cD2 z#d{zi;LQ*)M)*VJ`Jbvvs8V@4jv$}k1_IsVsvT$fQ{L1I2S9M?=;+orZb|*|9VwZe zr*Jm6-i1J+heqY8nx~^bBl6n*KBRwk^JWbHImXWO5aO>r7vVoR*n6k?ztwPV?REA2 z!#`wDV}A2D55{Fh88xFx)!LQBx7;fKXa~Vl1Vp|X(?WRw8GWTj$Byz16arfJ1TPZ< z-twRZI(&hElbJEU`J0>LzlVM4))9RWO-d7S%I(OY7`@*9$(Io0zb^hqXHNe6ANv_6 z<ii=~i&{;lkV!#dzgbQi3)_hepR2{Z3p%@}EF~&-~H97?FDu`I| zq2!ASN(7JHjmi1gMU%!BG#381rn$!?_quN ziN^A-f09IJx3zJ2_0U<*&ugNn3CM?-m(s7NgCCGBS!3pT$cd;GAQLzig8|vq)L?;P z=iX|IL2jrs8QY@>6cFR2LLCVL^GPh0<B8NMh$9*jT(*a#-p3%xNB}*V#h-rSs5r21`q6Bqrlscs!B{l z0tU|vU*+4YXuC&_uiZl{m;h@*<1@^-%b*vo_HFzzR>Lf?-yIvJl(-S{K!{Hfe~h1bOBHeF~W^7TVQjA$2upVWlNo&TQO_j-o;~=nSOY z=ncxvxR4bPIuRhF&XP3rma)NBsY_h0{#nqTMGDCi==lvA+YtuRtMC9(M|P6cP90lg zp_uhm87W!A z8r#|43Wx1<+~|N%p8QJCVi+^TVdHNe>e9|qwp?bz+Ehjf5CBmzF2GR#HIvCQP%Yko zMl)a-+i(d03&NK|@IkeL0!`gWPkqRgZm`5BjCN@%h>5x;gS1v=naTng1?ix(5AWI~ zvD$`VAIMQb=mrKb+_m1ql;ZQ?9Ubb1IhV5LMyaofUrr`ojIwK{o*d)mO7UdQ$Z0uZ zuOpc9QI3bhBW-Ak8TP;+Cy`QkX3(wP!`Nqf?v>|{J|r`;lgz?=o43mvdHn)9NqyNR z*w2zlvW9M(g+;6O9@o|&`}nxSR_dtG@MVyAcIP4_0|(fTx+Yu zEtr#G!4;s8UBepCOH1s8JPnBzw56bD0vL@9dWYz80edxDG%By3&$oG#t{o(>ZPX^H zx%2Dj#HL(wEv*iRg-n`7!DY^>Ou~w!`!Zmq8~Nwsx~rO1J|{*U#rE z9k!U%9`DqSgVWEMaCqxZPk{APZhd83X{%cl0X$!~qEZmlblw>(y@SSMBPP~zuru+_ zJNCoY&bV~wo5Xh9Vmxn>Mgk;rL;0r97pw$uOcEMgNAeQxjmWT?vfiWG$C?N0vM_yM zRO=>Dm@J$nJ{i^x!d&{;v6;7l5T7^GDo0oroU&s$2VtHyC>4S4&)8qRN+4~GYbtt> zLy);pYu>o^&`vqzELj)Hd;u~rpAU@9z!-qn#L_$riK9j|L%UoA__usm)&+MAv8Q+f z?*#T2pC9H^Qj|1Exmr%=0e%$IeBRDiE=bC#TR3K439lPwU!nIRA?SC0IZZt`&q}j& zi$V91dmX8bk8MYh?Bn*}8hjn;631jzVFI@JtXtE6*}P@q(FrIgdh++gu)blqn2d8F zXi;vQ^?XMm|FLONdad$f|6UcjdKo|L221T}_h1x~M_T*pRcS6?W$+Vl8i^PDx6w7^ z!WoiZl?xYkDFtd>V~p+w<(ko5@om5BzbD^5IiuLOyzoCiH&gqUk0wWt^Y@zhJAVhv zJL2BDuXEhV3Zk#behhg0aotI&Y2Mzv@pXjhNYIov&}`oP(^LbJx^M5F+1K~~^soGN zqqaf-g~dKbEg=FRI|#;-WAVH`{`gM%r|I5mekz5?!chKGZ!Uez_pNFEzxjNc` zBhgPGIDY(?QnUl_hd}dE2-IJxyRB^azVdPW%FSPSTps6+Q2#$FoqIn7F)}$H93=7e z*=Lc->l+hw-$t*|4Vtm{nZz?zo*o|l;4_ixfB1uZ*VtG4Vxs$Mh5fX@#pLJi*}cnp zV=T6Zgf z$U93;th)Hb?bk0}dhF8ix#KIE@Y&7TjqVOTmUB0TSH@GS-n%FA7k@$izb`LeITynI zeuMxyJh$Wk!T$bT2q^#PDZhgtR{$>kB#eafhaqVBwBi01g1=zh{RT*DdHk&i0fXS> zmyOXXAPt9;bnb>653k5Y?tY38G!1oVb#L&=Nq$@Nx_Dr}h z>aS)Ppt+6SFeP&F&hha}=Q!8u($RK3*f;M0ICyUSF-kXkdq1(q7Vm>sH-#zm zD2nFn%)NM)z1<4bPyEF7pSX4a1Y#)d^^>PY2$J^}?~Uv54g$@MWhh8uDNh$9BUZfn zL}Q8=%DZ)=PpKApEcs@Pv03LygJEb-$;Ko+a6-X=WK2_QI%^gosWcpXMhPs{oYx^l z95I$}FBm|~nHMz?NcFvIs^CY*GDfsx9ELgB?hJfyfcIh*Ws6309TIQx%PoaP0}#=K z(c;_c2M0QV?y;h_$XU2#zMoh!neoF-LK`E;Z27eHEan)6v!ev9Nnux@$Pla1OVjZ; zg;$>Vv0zrs1@SqwlP3+RWs%scY}FK1QW;Pgd{@R*Rx0GFODSj_{+1U189&A23DkBQ zO$&BCm4E}(bX|C}=2Zc#Vk8JiOY>Viqv1FhG*EqPY^T*Azo`|0a<utX^{l8>eQM6&<9=uFeH0bM2)ZFlmZ%r3Vx@oOuL- zm8B*nhsL-XHF2NLILjdyzUBzN`V<1ng`J9Na$-6MiKw$9hb=X02C;7_bF+_ zIc^T3ZqNt;B$^KGs8Ul4N62MH*=K1PmO+{shqA89Y@n({;ET~~gK{;YU0F{p8#1Fq zD(AArN;TWTXuD>xrPZFZHMP*=e|VNAcn2*sP&;S3G<7M=q|^>j9R^QHtp_3qH|||k zoo#VhQYom?bYcKeoM_v?(E$WWL9PdvrZ#$mEGO`)Xs(pNbb=!6(k>`LLDS-CckpVL zyEV0OW(ZgM*kUEl3EHIGynVg;JQDEx<0U`&nbq2hJt~QtPg> zu7K2Zs-V)9mXsWE!)B+P{VLT^SHAIvS=3B=Cl(CevEDe^EnV1-Wta|jx?({ORE2~| zY7^TKPXstTW0b-N)~~*X=v^^1T8_i5xk;#5))QOXCCb&dE|%-Oo>550Wv^LY=YuM` z4;09KAS$CxvwSvR)HM}_s92+ZJ&0Q<>9CN@J1vd`8p@Kzn#FMN9GgRv_;u!|R+mUW zS+Io3qV2P!fplq^Y)w)x+NEn(5=>xr6|#nqQbKu#iZ*|Vlx;Ry_0kUxN=Jdhr-vq| zw0@0DQ(PLEKV+RqtT=?V9T>^wLbzEJ9%I#XNh-{?VWtrlY_wR^?UEfK5Zm*9ZH9i4 zAc^G`uOuX#RJAS&z>)+d9)!SVGFz}seuf?|TS&BSMKaV2=>D1et>WKVi*5 zmUIAJ3jNPw1USxn&l~|1yd|GuC2vSvGXRS|y$38e5j! z(6=e4Ni}@iV6A4BC6~`eC}$Ad@WDDRd2JUA;aV?OD#?D}jH$K{sQbgLNfNSe*=W$n zWI)wDv0`0YuV)NR2G4>_6fJ2uj2w!6C>GqAOGpc5#6mDnlx?Hmw3Rim9f~RYD;y07 zmkRtLag3{Bg)$A&{$*3JS*Nz`0K=nQ!o@>fC1;s&d72H&g{$+x{PPoUX}6Tm9TyPI zSRI{MPnOH2sk62Bz3~*eYRiBx%}w-Z!!=R6%|Zl$!^~=NP8!CAs#6ej6+)a9OYLaX zEtQU!t($(sN8Od2xhzdB!jP1!*lOb29$NMzRjx92sQ4|_zSERHbNN9^(CBJ+g!4~4 z4AkGHgQLxr?8^D`^?8oS*?<1$e_oFOIy%}vdF-(#e(k?_O8sI~@NN~k#rFda$GLLE zIXSzNY7qsKMy15iDI;C47&^a*sc+w*8#d_2Z$9}+%>{!Ln6rQmj-<}&^I4r;scVG* zf}InB_D?QebpPQ`e_Z`E@|Df6oh0#oZ5$&6PwCr82MNN_w}(K}DkM9|MhLw6;&=Y= z&Yf2dZ`@GY>(1W!^E+xZ9xkl1+vAUX>VC*))jP8g6=T%iJm(xK)_MM zS{4Aj0SR_aPdqx1Qwa9MzJ~q_LGU}rzoR-3*Yxb-Ed$h(0Kd<(9ax=MNB8`mw z#_Mmqt`wlQ>7xh#-NEf}<%-4^dFAk>mv$+hf0U+x5|#bew1K(J_?1z9_IuIz`s3$j%MrmZNqC)VxLhw6s=|4aI%JFR!B zy0wN%OY1wcYVX-+(K%QC)U%hK9oyhbU)mhpxRGDyOsE0vg;@N>ix(p`esuQev@SYN zbPamv!8`XvKJ_V%0^_`_@;Sn8Z!h_w>;PO?#EE{` zbR?F1a`@DE5GwqYc8&&N1h(a0eGF@)69)z`hAXCHtQSuVyOdDlX776Zo0gD;I=QTV zRcnSdqD%gKf>V^Zi|eviS2P6Z-qffi! z&sg51^44Qn{RoVKtoI^;pQAkxLFHOuepSZ@k2dm>I*(jpD!#UfUkx>(;`xX1OcDpjMyr}GZ@%Ncd?xy?)}7MZA} zW}xPX>r(@HQKXforrrX!gFG-bd6%1|(MxDG7rda#D3_{ZX|X_|e@Ji{7huECm$XUe zgO}W*7h83#ktt~_w?Y?n<*ZE|k`ktbO4DbAsdOk!K+C{+ds>z@pw1T3MatFMK!&Gt z1C0X+N?<{GKWUq*~HYQ(+eNlsz749!O^` z(J4!fnKJSs-L)pSHB}zy0>y;IXe--KqjSE{EVWUwkCUS4Ll~)>>;pnu1f(*3G>vO`H*RgAh?&5B05OcJR86@ zDTTi083!Q@7sxBbw8)_G9h#b%fy8K4u5yk`b{bFXBNOBG74{29ONSgm5P6h2XBF7m zqQ1b0vxu{;_6ZfWXa(6y)v=NI8|j>t-ZaM2TI51@K+jRM9UfxDc5ays!hocMEc3dX z56hfvO)vn=H0zxn$%_fg1n>ZU#qgtpMC%S!*yt7mT~?7+Liz%Wn9R5o?g<-oxjJTz zb~+=EK{uZ^HS-i+kky&5nbd6Fw{wW`nvvL{KA$pyENzna&XXT4U}~PQVmJ}b&Zhyv zIvwR`#4_=EdKpXxPrC<;3``I z32RD{6n&BR3_tqDl~CGr)r!GrO-rLq>yl%n2RB(4c3C-?J_Dx|^o$BC&041oq!WW( z3HQFBwbZHHz z8gRilVs<+WDV<>A83+Z^f$e~WsfE2*qY)_eehX(vU(KpYajL7G(_^ox)-wFFzhFUwX; z#-X4Mi+aU5FBR9Tvu5~d$XPKepSOm?VgQWt_;f+ObFurB#&*D=%u~N!qDNw~DU*?J zXqs^%OkL!TjwxX(fE)~STA>!2Fb+oD`QOncoQR-zb%njF0yOkg{J%iM>+1!4?ll!i zs$6Av?!~JyJ`^!-ewU*+FLIejbCq~?^wJPDmAWW_6*cC(r^&R$?!nq!y+~o3Upn|D zr3YXB=O1|A%OCjTAKU!+%^&~vx6hn;@S@yjkP?AyixGMyAbNZKid#jxLtv>%^Ii5NBw$g$Zp7^`}Y zpL|j^7P#=|@h@OLiP1JuxAutIN|`_Y`0??X{crDYph?Sr<6nQbLh!D4DFl}>3IQAe z)FI^Hkw?^i7NgSB@4V|f-`SPNsJ);Nz`xiUbj(jKfA?MQ`u-5a8@djl(!ZHK!+Ps*2C4Q^V>|aiZ5q*9gpQraF@#2w@ zqie4+@&sfDEEIS089j?Sfy&4J?dn_gxAs4#fIsvQXA_4TH`G@5xhvPNtDV7CQd`H( zjk9;|)UcYa!+X$nK$(8v{-*QrP{R51CDP~^lZWz2^6Q+7er?R{BOgJhLp2&s&1r|7 za%CQRNN(PSc2`@Yox76fYG>zbCa%t}OP6k(y?C*{l4Y=Y(0kBx*T3+6ggB}At-rJ=7GpPA% z+4);&{llqvbgTtuZ=cpsw_{M5s{2PXlmku9|sfjE>fmg?hYdA`$D6RVU+XQ`#2x_{5j8a4W0$B~1tQsu1!YRo)7I_jzD~sQrsYCI^Ik`Yvj$&WyH5poq0}CP3y`l=EN@ zf?^MzV)(KKVkFcv!EU-n^eYSxfdJQZy*TRvt!5n+FvdZ|Q-~$4RSi5yAX?ZU3^W44 zGDuq2zLF(SDr9AEh3#*=XOMuoLoXijlg+s^q^gLsJ;)qH5-dBh4736@ZIIVe8Val- zkDQ(ZBqrp67KLV4jn=eEW)77D6?`Ya+aTqx%Nh71_kDnkI&uO#%T3}yU4S$Z3^a)m zS2xlO;-I>M$~9@@Wm%hPvM8baK%{buLg)hZ;Rd;unB1{&fvy<`Q_3M)ncCKgrFv$t zwH0S*PHP;XO{pg$nZj5zn+#qoCnhC`?3Oi!=vXlPMl*q5L#IF_LuC&TzZBsZ3Q$r+ zh%Ru%=%9bBb`wJ-HwdFEn$@5U0P(WGPy1J;pLCxlP4H}aHei109y}v}@c@AE70|VG z-lC&i`Gj7R*%~sA{o;kv=ZFpITj=~YW0Pl54<@Z`1bE2FsqSFBSx+is zEKTD|*OiI3RmVK(1Be-;htWMa(Zyr{B@JBO3fc*$$qD)#Wjer&kfbV*Ru2WeRTmdx>cdfe zQuJl2FkvcwL~`hO?+pDf2w7zyTMFhFE3fHLoXt?eV9Z-|j%JPPAQLfca}aSAL&4GAN* zt*5AxFOe4q!pD`DaP->YJN46r9nd97YLY?j*K>M-w9H>g=L?6S`?#{^9^)} zu}fkO6Pvk_Ob^4(O&ablnnz7r*kYElFKW?KS4B3mELPcQS+kixX(CHM9nKRwZnEX1 zF%&?JG&iHwIGu3FeVl4Xyh&zF)}$OMh|8kn!fTf_ZC#DCwn&P6noyhC{SFmqCUhWp z_QX*W6wSm4lUpAf);6t0OaTA5@+=;C?b=(-jEpcu}B41B!Lql7tG%gT9fH{YR-1_-S`_;z##ws31 z;kC}n|I*WIjGuYq6O(ekF+1Ky&8X&1BHmvuy~rin5vSqX1@aM*H5G6BxSiKXyHCgC zqHYVjfC6MmV$^0%)dv{=QOwvH4d$F3AGA$ni`KSjvakpnS-x4+N7b}3;MRd>#fBC)??`)*>a-GB8OnjgfSp#=8Xs%b%~;5yCFgs4wjI^X%qSI?Opy1ca17THlZ*5g+F-9*Dhb)IzR{% z(R8FvAH4kF_3LLZGr3>yJa^$a@x1RbhW{x)G3Jt~mO?7#!tgWf#DyD@#M|Hp4}iGo zC2?_z*QH=TSqv#Z-9e-KU*8NUOnY+qSKjn5I58~>%zePw^OxCMJbM{VWxbPK$V36% zZo0`IJ}F?{P{54bJjNYO(uXGsxEtvh1u6$8w+|`!?E158opU}JOx%pOO-g&g+3nAoXP@2K37Wj1;NYNb5!gMi9dV`S0CrD-xZ|y@3ukxE z@;MqANbs?XIts)^i4I&~RX)lYbojj-1t#5c#Dr%KyfZxW)&V?pc5FwSiI2&+W$DAw z6DDui=Wa4y-|*Pc6MS;bqrVyb>qtEE&lLZ<{Q2|R**;g+K?huKMxTm0-q}ZW?&9Bz zeAJy|$NhfgPFI1eItJ>2`_#YslsMyqgNv6x**oCApF}uxBYW`PSjMY{hop~r`vz(t3UPCXP?_?-ur9rA$Fp7%pMX8 zcWuWPxsYmWtEc9J=3@Eo)s2IL>(!C;x5(+Zb=@$f9q_Q1Z;X?_hOMN^pLr&^@Z=}2 zSC=noZ~wdBz4YDfY!_ZvvK1T`|Hj@oRCe*uU)%mA&B8pxqd=$9XKJ1ocS?H#mSLMaNq?OI;cfTjj%EgQgu%J7CYxeZP|Qe*iUQ}8Fi zWI0$to~DjK$EFqbBvfD) zG2bAX5~sC;kVaTcTi~HXcmk#- zo5sp(?R_WAijcS@1w5RXYa%eq!_?ls#a!3u81uxP;NtabfJqtA0rDPQGD?~f)eS$J|$a)pvd6-I0VhkBZ}?9V4`$Q z>|)Zf9oA4~!VofK=GvC?JdI6J;RlS=U9~7eF<3T$99+z~Q)Xi+R&fCYa+;JyG76i* zDkIStn>qV@b7WK4GG)@;LEfY-w#GmP8p+_5K^`gq-=Z zX-MCL`doos7%^Mc5aufq#Ky;!l3Av%b4P>H(rTmyR8{@~NdZu5E>%`+OlHfk-A0hRNK8|51 zlP0{Z5-|9L?CguCIt-}T#can*IHIZ=W^DSwkVH{r=Fz~d4r9HPrNdAJ48@|2=J4FY z08bvTqL)e;!pOd&8pvMr`nD>@P&8geCAuWQGksYEw1E=_c6QKt0uiUpBp`5rqLG_E60+dvpz7J;IT`3c5lyi#B3 z-5~yf-~@)L3jfM5M5Y>#!;7M#H>@ZP?vQgESMCQPAz%m*tMOvAqFFW=Tw1+6g7KJ1 z(NZJIRLQtiFFz z?nl1ZtXyDl{Q9J!w4RTSp%@C2l^CRzsh1;!o7mKhf#*#!BJ5^>>ZIyU+xz$8CW+LW~ z5E~#ZHWp0cYr~)eOG4Q^W{O$LVX}xl8zVOgr&vifQ5mOE4&5x_GcAmb1bWHR1^V!mIxpDJ&iA|_Y@OEU(Gz!t>0!LJmbwOve z@P~-zp#?`0uj8(#d1&z!^sG!vU&zy%UHz7V#ipVZwnSQSRhO0+g1T_3>#Ql6_e!px@zhVr zbC59%Flp@`+F*L(&MC%O#o}BkDHC&^(ruj88ba+4{4Gz1lWJq>(sK9tO-B78LF)?2lF~kU5;dYi}>^? z<5D5pHmvQdzRFf4$E|O9Cn7fpo6f7onH0Ht=h)v<*}1d_J{NgEy(kRzM<=8Kh8C$@ zYwFs!9;Vh*ep;_A{L`TD#ljYd3nKJ~#wYG4Dmcz+C$mLUq8qxIj1hT_8|un&Lc5?m zNioc9$^M`jT8_WQl`m|QEq!ZTvC5jEbMsN>huD0f! zYr_0+p)TPdGia+C8>>+h(O}c6oDiPL-{tTDQ9~?2Aq8zw6wSshCuXBbInHbPL^{Z9 zVXZ;I?<|>TY*aOh9g+9Mq7?~&@x@&I0-e+i$0IpJnamQ?C>TTqC(=2nYgXeD#>>*M48Vd^333MvQy8Fz z4of3(Za-)fC>=5Y2`~1_PuKzFvK})U`k9?97Ga6dd%7w$+B9Qduq-&u$3BmnX5z-n z6?HXQ(F0qpunf4`YY?xH*BqlbDlVsEt^gcy&LCTjSEWrjQ%zJMD(@>3o6mFj|()GIsrnbguKSrm(9y3ZLjP5|AB(F~uxrd|&5-Mao;FWRq`| zR#Dux>_5Wor*=kH8Pf+M)3CgQ*t1P1DZ71;msBXnY8g`1aHg$bMt}W+}Q7}M^V~BX+cchArWfL=?3V4TF&yQjrBqRLp)ws7TYpgIrZ*AqsT&D zS~qqG|K?MNPtz<$j$t$OD>k(CLMv@yET4!lBO(4|v~;XB`FvsPX26Sym&klH_SVJo zOs`Qx7+=>?CuA23xAcfq47s6-qKm0}n`g_JIf1`yapX@#J9ZBOm!1YHq*#AAINMNx_-c zr?)=-arsIr_ah$}4u9*ne)sOL->nm)Yzop+>A>dN6A?zqi9Wsa^wVMYk6pGPtBb$n zbQKOg4;)vYd~jxqi=`fTKoZ0cJg{xKrST)FZO&6auUb^kQge#q6UPjB6OuY6_y z-MfGH?lWgZL6Y3KA)N1FOW1i)z}DLOSFb+1^~lwo9Z?YEh!y203Ln|}$bks>qkr{p zz9m!Isw9Q^;g9`4-&iziTssF*kOvJ{HLlb{+S(uWVfj6xe_7 zXW6xa0<=|WkIen8)&D6ss>Gg`tgfMdoOyl=HAJ8Khtg_gzaod>q?A&|r z&a?L-w<|f_GiRXS?t{C@|BwK+z=i@TiPpX(^s_s(Wx_YZW9oCdk=ad+69qwg6bWOgTvzpC4rY##obSDGhGM*QzYj~f5z z!;F3QCHuWJPSoDKDQ#7xG-oes7u*MpP2IkuS$q69`;QyB)e9FcURL}LbUsxtNP+ZR zu@&~&x4(UR`;Y(lZEySDt?%8^{+sp$f#}8_Tfgm-{x6!pxbFATQtk3eTUCg0sd-Lj zhQ_9D-%+DVyLH|E<3?_EXJTE@T&;ljd*a0xrq@+;dw8+8LJ?E1f=OXD^gxbK+fb=(C&z zS1qzzzIX1Kr=PyHPD9Uo)T|%r*{LY~hNR@CMXZN@L}m%MN%l3nuQ)hAXu&r;WUChem10GPIgi zZcZOSVfCr&u!b>jM3}amY=gCjc`*5o10j|kLf8ErdUt_x9)k_qV_to{4vWTK2OIaD zQXEg+Rfo6}%b!evZ18PVeFuS84pzz;K=EWRd$WrX2fq*@*euU3#Rd~$eZ6Mjmk%B;R-FUyzv9*DLgBKa6g$?A5FleHwH^IZJeT7*)j2IK+D}N@QOLC zVT+5#F*FNJYm<6DvBe}CXZb2kyeXG;K}(|*y7i*4)lEvw-|~Vdl_x)P^+D>GnyTeZ zuB%L~IIz4gTFS&<-A!#hIrn36f z0_fT1sxkywgR6=w=JWGZTnM*3B@P}<6t%H)^a+PZWw1Z5po9 zcI;v{Lk_udYBsbmL{oz{wuyBdm~7~N)KNQiiHjA~fhfe5$VI6vM%T^`8_=pRc*6YD zP&-YCjZLuwgp{_khiBw5^s~YWw}28R;Dm>c4T5%Shi8XFEy5_hnm_PCJOAaz=_oJwWe+VYEL;K`&i z7`fD_oHID8c}%F@&(v9CvX;GGzFng%M|KyY8bh1Sjce!8cvP~`qs0U&GHT&4;nC1A zJWj?lsH*98@cUV@L?X6Kk<~@$(nM4Z3t=s0+h`3YWu-8Qv%*^Lfo@FUm9ytBp%RM3 z!bBp0J~NAEf-C|YV3Cbj_{df(7mugSpe*gATCpCMR5ALPCKFa^3hBE_vcysuWonyM zI-ZOMSvhu7INe6$Y)&~Sp<2_&-p?zFh1jM4QM5;HcAQHj`eRRrBs48*FP zmr)#{jW1c1G}uUrp!BLrSieRCg)?37J|}NeHm?FD7uQ898qRgR@|IIG#ONI z&Y^{y&&Rfq0`;j|IO`yPJYzK$QDG$08JN!13rPa=Rbjw1#?cDaYdLQ|9wF~MF?O6L zHW5(+mIE?W_p~Vo8#tAL3P5@qoom$at||Pu8IP)%RTDEo$NI!H)cvX~eN!~H$-xjL zd5AwjZ67^CA9X`d0L3+a7kkqbdP{VGKdt~}Z=Ns+zjh_~U>orhDzsH~$u=14;u_NP zguU@zaqUHKo<$d&A?RN7jz9Tpfj@i>Azb13=->O;Lo#8f)|by+zHSgVJ$L=wb*W354?~`2R#mjK)2oc`5f8SdAt)zqMFTCXszGeeT-5-3< zJrZTqc~7RXt2g|w3eFJ1mFeF7i+@9==F?}-o#o8qPyck5J^uL4g&oe@iGssZ zcUl2S} z!E+(B_`iMoOEQ1`=C5D8UR|$lUcY!9eL#B$fB22|g)jWUe|!De>pRj=b?bNj)4RkO zNQ2VNn+W`V7Ujf2r`3b&^LywE+JEwkpZpC@WHv8+@Av;10-on|@c2W(4M38OlH3&+ z_xu0s^@Fo#p`h7nl=Hjp`pdCQQ6L%Kn<&fu{O2zjQSe{=!Uyu|*=k1`s=o6-d@zMC zqZP#OA@BVcTOW@c*O_ahki7flt|Ue$;umR>0P?-zEI7ke2{y5fvu+>d{F%4CVr=z zN|LL3-HHpB1gmsKEB5ts(j8qsxO1?+RPB8erg44CmwP8#;?RhVrmk)sVWSiJ;NWrmww`|W zo6nx##N6iut;)Wgy&)}s>H6o?^Ta#x2378TSwUFgx=bEypeXfop0_OQed{j3EF6V`JuO5|J?P@>5MQ6xuY-^)Fq*S zH-OPBK%iN#_+vfwVmorl-TBK_l19+Q3sz(4iX)z#Un(~s9DGbVz)W!p!{({4cn7XG zPa1djRh$mX$=E8(9YgXyp6$&)jfOZz(WxP&itEhHXzyH`a)c;{kM4cYg&mKfk26!A z9&Qg00d^C9n|T}+fybQikX4A@Jr7fE+Varjn1!8B+S)?UreF$$yhh*PfV|5=T(+VN z`u7~%d_dE`^{^M45cn&cEvZ{^{(=NnKWVYlpcQjoccH{+6FQ)PZ747Zf1d~Ow5LeW zQFSSz_Mz@7@PpyBzN*-MA>IBqFx33SD!DzM*)b+UtOghvX-c zmYxzg?%-|*dB2QdxMmjKe1ITsMqd)yBA_QbEDRlgMG>SPdJ1gU8~V2pvc27Vr}OQ| zDMKJ4v`QLYh)y;##8en;x~$IR*0`aTC0vNh);pnpUcmpv3mW$n%zt8(Y$({6KRQC( z%b~Je1mBHB<6kcRk1JfmQ1J5aj4s}f{u%w~QEo80jpa4-C2OGSd*Q}>$;f{e10CP8 z$nzoS%|DA}eEBk+N$nNI+L$k&;uO#uCi2U!I zOz;l#mswQ&&rf>3=K9lI1NKidaX&`dUKzKxVa$Jw1pV8Onn~yXUtoX0jHajJ9l7<= zK5})@e)RnFsqBA9XZu5@*J9_76q*y*e(3i9$$rL9l;uyOBkG8Kr_I<V`4f?OjE3Jl2$`>Gjs8sdbzXAa z0i4HEzdJ*R<<4QfucG*1PYW6JUWAWRx=_ilib4>NHnOfOx++IMwT|bv0Uz;an$)QK zg>-%sBy-gHrN{k(-Ga+vtFoxUAlpeG0r}muP7~L{l(htK>9mi67(pP8ctGLw?7<3j zL-Gb?5f`TD1IyrBp6<+ge{}iVNHL3?W6`u%mKO8P$)h2H-6->tci)$@Hg$-?J7f^j z5`lMPRU2u;1E7pff2pL54d`2>zN~467FUaWi_8ng8I;$t6 zDaY)F<&1*{TupDHnS;0m!sR-hFq$GKPHoKca;!rH9n2${PG?1RmVbyY0iMll!EJNg z2ZbA9ni2PaMNwUI`86UmW3&?_C2hlbgwY}(07*o=x^8FV26R&hm{DzHQ!=c0mk%P! zjbuG~;5px5rgILv_s}=0S7%d2nb;cy$%Y=ErSwLpGRMOhNivQFKpycpE?~Ul3UMxs zMvJ0J5!W9{aiwX;xM-Myif4?{1Sqh?^k7U^)gB#O{?CY5a5fz4dL7YCt zKi9bSrHLI1E(%9Hj+8CTK%K_;f@m@7G%JqkbBc$Oc8jA@P)H8wJpdySAzG$)x@G%z zaE8%EtadsH;!h2F8x|;hY^OtR216$Yr$l1Tr=X@_Ma9xX2b|DYAPGN@9E!E0wrO-v zH#MFBkQSq(BA?KB$9P|h%$mS~B0P@`M6IT$#lBTm79x&!XF zla`@Vuo)o9H1$*)M@iBUBdO#zp0@z%C#c^Pg^i8~9G>D5&@fOz$niv^-BQlDas6NH zr6V-lc0kIpPl@jRxK6#yg!{raKo1dA!MxI&2s=uH_~?rCrvbhHwQD+saE;iex+s4+ z&&t-BXB37C1NsO4*DU^JXO?wm7M;7?xE1#}bTZA7U%vAX-?h#FNc8!awjaA{%>AGK z^!=zA-jhteFg?a^i~jYswdL@GbX|j!P1P6uZQ4Pm53ye~_dpeoF9V`LcTC+*fk@bC zH<4 zul{QKLXZ*<4IusIYKYs-JCyY$DNydp6S}x@?9-n{tM$ewpy~-Q=g&(k!4F8mW=IB} ztNp$9V>|QrC+$;Q!_}D|dk4312Y16Mz=sWI*2wH(&SgBx0GI7Ok>{QL@Wl@==fC)O z%wN~3%Mak6eoFrBzifZw9sd5L{aX7#Z*JVd1OpK1VSAH93mjX(i)stdoi};%$tNFQ zKh8yKk6h)twJt zE&Fi@6yU)%)Zt{ohJp*I=ulpw!ZznaSVw_;gkk%2N+k*|?cEjM6^9oCH)Hn{-1^e` zsi!z}65O}m^`+Rn2nCleUA`=QTqGB2!F}{UdT9N^`sRB5x^3nEp~oKk(7}QECRd;l zuG}{iDAoG1X;32nfKG-zjyucJlv5l59=!D6CEi!tpT7>Z+3Tar=D|MXqyYsF;lnwH zO*?>>+w)$x-BIuu^$rE+ch_%+f-e7~b_r=j0dJ*DXlT!H7zJxjfjRePW9~|+oK8W< z$?Q+KroGGaF*pK?RWGoUvph#@cW~UFGmpLRt1~uRpZ!a#M?#@O-`z~$I`1Rbk*$mO zO7m_*0)NM3^6f%=U_Or`dDji7&L_2e{qzfUg1#x!0m)T)mGF1nIpw>}~q4Ajva^NtXU z-YmsP%b9bUgNhhuB>nD~SPUDgfSyMTCJL0YHpaH8nY6XBu5hjV9We|sTFJ{})_Gl2 zcsb`ZXOA5S?+9^fIi}x#Fnx$c!2r~QwRNe}vnDG_i%-{2gSJfOi}R&%#H?u@<3inx zsI@d4swkazc$-ibg0ZfsM_^NlviCqGMc()jObSe)WWJoVSQ}NJX*f!20&EaCT0W(o zIsyW6f^4UhQZZvahMG=o=f`G{)J%*u}Ojsb#bn($uaUwhb+0 zQcHC^wAmTsIW#++LNv#xXxk+yoaS(4z)Mcj5`mX4$8(gaa#@>LbXc^Mq)4JJTL0{i zV5J3pG%mAc0_(I|WvYhJoP%HZV@JJK+OV>L)Tw(J(3D2|EJ$BsIdH_-?dd&T;zjAT7N7jrYL}ho)pZ0nq?8w%~^y zDw*pzme9~aK=&Lw4sM%OMDCHJ38Gr*)VZU$vrVU*CxveHctA3 z6*IiRV3pA^fm^14mOBkPCdmP$F-5hj2??DUdbb#(TcFJ5tgE2^vT|*nPfe@AWFUjA zTD30Rq#N+Tpx=;%HN(yfZjnG0&>QSr{mT&U8f>@iK&ZbN-_AWX->U{=s761NSgVawI7$m z&6eoE9gyTU3Tl?0TGjJx2J4@)FyLk@8k-9jSVn4`9ko%5e^k;xBceDcXy`mBr=b05 z;n92=Sz~SCY-~;JSOaBkXwVL$>6}iE5{lWRHO}4nyKJb+(PBZ-#%&s#%(L7zSj`94 zj9r_evz44wB9G?hQEs&^gUz6ccH|)omkOmy)=@QD#}ZR7WlOUJO#_x5;zFnE!b6fu zcz}~8Yad7cl{s@oZq(7%F8E)YnrjzBvTHrJ-f{16>l=4xUc}8m=zIU7Gl|~$2PDTH z7uFZn&pmf=AkAcgKi>P}y@%HSV0(S*>|HQwA*Rk>KXUccpAIMa@i}vbcl0?0Dh7NB ziV4JH$bQ^B?k{^6PIam3Rc*oCP@t=a9wO3SPXT%cb`?eNhOLY_`u+EBD45SF;rUlh zfk{(qg|{=wbp6e5u5X0GV1M$$Ll@*{Zk+vnnIc4I_m$%AyY;+>UlST+k5vqD3v2W) zbf)ZwKVi}Dws2uN0;1eHM!}P!;Hm5e5x6<*=K2ePf~~#lT7yzk0+4W)P6rnlC;&sC zK<04>x%VETa05zt9HNJfl@0+k9=(Zi?%{wfD{nq~`0Ouo4T?DBpG_Lm49;AyO>_uDh;(8aUz>t=-+-+4%x`A&q+2)4RJr z`!O&IQho`3-wLi%j}Lw5epWjuvxyWE%xBhLfdUil9+(}q*!tqdiyZ~~P*DDjk3j(; zPl$pI&rZCC`}BZrHH)jnItl_>^x1_97q6_l#=hjfy8A z1aH{+?|l#66_C~fg$o|JdOvF@g7q(>GZPIQ?N__7?d>-QX4QvKDgxzs=7M=A8Xx!9 z2kV3LfvxWYZ!;o_94IhvgM?5$Z!m8-e;$Pu>n}pV6FckQH$SgrjL1U@?|j6!dkZ6fXzG@d&)!UJ6dcZC^B|ebEpCHgBGniu1#UwXXod@MYuL zmyDr0DGYJksc3lpC_#hn6y%5QBio@D7RT?-A;)6{yRdgT=+$SLNb?IJn}_Yg6L~P1 z53k7HZxbh&n&@}^NSsLcV4eua5%aUW3<04#>=HE}W?kfj-w<0zeb+!q%cMROMpI%( za#t5BVXD;Px5I23Q!X`0rwoBObE(^V#SpUX%5fsCJ>hx@M~!;0I&KXr=M0L^UIOe< zm}+JN$L%(FwwoZ+1Y3BzV5KFf2-QsoVqOD)rNpAs_$T0We>&|x5&4AUu(?k79&>aN zXspm)HJLj??XeiWH6A)^t<>l>_%yUV2J0zvOWPJCq(oB(Wsbh0d83{gJ&}0R5XvKz zt995mYe-z^rogEbYpLYW14DegcI1CY;GPBiQD%Pxnw@uW%r}&bPI>}#*V+a;8__}> z5z_E$`JDm<9U*Q)sNAwKE$=&y=nv&rxcYYocpYXb4na_`Cd3G{4!iVy$d{QuI^VI7 z7q#&kyjBCR)xc{t@LCPLRs;VQ)PVD+iFDnkP9L`0!ua+Duo6)n@+~w@pHA2L9zL7Y z9@?=q#~ruXy}ixr$fM8i$iqaP-3Q`)aPSPiMHi%JiQk>!bx08R8Q`dn zFx1_oM1{4?7MM&6MkbCdONO#%3II|FQ>eFcbr95b*{QjZfr5PSu4`%4j-9RXVo!yIL`$4n+NMpzpR%ywsp@qp@zSoq1RMcNrM5hD zTG_0U61gM;P|7EmJb{Aj)sO>69O}-87=`h~@=#LZM;yTSKiT^!Vu%~un}^5Z4M=SG zD|j03e1u^rAJ489EOn4ZR!*X5jav!Isimv1(K#SnB@m%g{?O2DBb!+~YVb?YuApY= z25Pty;P7?ES>tQZuOYgLy>-VUfm}_HMfSKa_DmUSFE=$tBu>aL#7Rx#8_T9=h(suH z&^}(Ue^TN&2B@5m$UOKAEerw^kr2~jLSxw}BNjC>;NGW!i%5O~(loRDOy$X-gY+;Xx%0S5+q4e~ z1pt5J^|L$yC~dV7+TG|J`V4MoN-L6mo{5{)^-65rnhBn#VBGl8s$^ThbDtN0ge^2< z`oM0PWXT4}F*jR9ZYGa7b8*Q{%869bmBv)g)aZgPytHP=1>3f>VX=TxuH9lWf(;0t zjshyBJ_5IxwvoCGvc7W-jHr!5MMd3qT#I?!jWocDMSx20ExiM4gGO@Q9)(tC+JQn? zbffb_wwAjIcs)+pNFsKTM#yt^r8>%9wlP04MW~j@WtNX=)Op6D1KR6tiS+&gge!M$NQTmu&g|5z#LJKFtg^QMWN ziBc9mCbJ><8k#2b;=|mrjHa{_*=A8Xbq2BH;Q+~6w)m!zCAiI|B1UG(=3|Q&7s}E9 z=5|i+Xh1s2>2{GbV`u3Dt%(-w5}Jb0l1x|V@z<4h16!9P2w)%M6pVe-45+VRs2y6| z(d?v5#;GT&PsVjf!BFy{0nE6qiO;_uh2cB(d8{R}v73ikTat{KO7Jyzj*XLnA2Ytk z1+yWP8;5M6ca_U?O;-Q8iu z|L3}l-t(SLo)?rz{pyCOlMpBnl2=T@BPNI_nyY8b8Bw5J1_VXT&rkzND_55j-7Js* z0q7pToq{gbPx855f8-;Ntbg}+p@CYEEUrwo#c}t>KbV9BxloLcef-w$)#smoewW=C zBxy<6G^AudaQdF^UM|`1y_;9e8E$Gr@w;SgPr~;0tEb?Fj)JStUqyQJA+ugUL6&uU zq8kbzz+C$oW9C<&=#CVGd%xIkY=5uy@9;rJ_ew9Td*z;;&b^Zd)9%>!GwRx>TC+1R zCB=JX`M>Zg!PL%v##oCCJCaZFo$wzp>|~}!JCsl1KmUMadGD6s$jKTA6{@SuByDTH zNX5&(SMBxD)IT$G`SSMq;EVeWI?^u~b94U-JKIlhuYYHc4e{;W3&gS8`}f?#&fo6- z_C5DJp+NIpc+aB!~9??ODw;tlL9d&;HX8pDG&2QgSe=rvSQLz2^ z_T}9#nr3@j?mYtqShW{@cKclyjO{4cMQr{w1=|<4FC5SPXwUQn1rUrJD}P)4_<8iv zig(Bn{K}f1WYZgj|DXd+{qFj2w^~?-bC} zobTFwm)>rH0!jOdf-ir$lXDK~?)XTvbB!hp)NhsbVhn11Tz;^_xEOXx>@n{&vl zX&iWp)GBxbLKDS~5l>gAAn^UM@&F2096XH=0kKTe2T_?I#@W?sUZ+tZ7u%l9@w80R zp%a<>!Aua589Z@_7vf?)0u>9XPYVGN1?LBp)QlZKh0+LNW2P)x)xzFQHCLu1!g}g# zfN#$IM8Z(OGH@X;K6UJ4UwT&wb1OCiQ&CR=s||+A_jr>mvmv;O92r#n8rlzltM(C; zbln``skH8p`7|WpVf!D3a2i*5>uu#c6=NI2%7ALEtRUnxcw+Z{Dsx=7tVq)VN zqu91<0NkW& zQj&(;p`o|G?pii z0vvaMG~#rzBMYY%D-GysUt8rpAv$~y_9YAy4xk|mF}RrAVuhF zzgl@&i66``5-fX-{tjI+nR`FUJZCB4C`#?ztEtOm+zyt55}C%^@vyiVAJq0?z$z@KXIjFhHY%)g#lPi_#A^g{}S+=UlQDeCfY+iH9bA`JV zPZ?1cT)r5M@t`)QgLcj#V7;R=L|^mq2)SQ&)0flIF`JlH*~;WA%T?82JPDKBr(=^$ z62z6^yjUzyIJa@fEmkU=eu*gRY^cv;0n6CJV|q5#jrTFl!XZ*PXPZn%p3BrZS-`FD zgOP0$dUnpTOgbsNr(VVrUf5Jh&jc!y9_RudWVC5n(oxh4YQue7BSw-LE>tmG1!h(w zvGp@?#|dy#G_&9@$Pi;wCW`d1jNc^}`~wOBQpe zw3AQ`kXUY}Gi0Y7cYpKx0Dt8Wpl(-gsY}?V1#}k-CC+?vvzS`a!kBU+IJV`gM{ON(eYBn!$KAzV%8;9rYED^8izoYfoU10DQk+CO!M!?UY=GGmd0qv7pv z8Ly0)jvXEL_Krxu@qw)IU=`kah{3PMh~v^RTbj?%MEb&**(hV-1Sd@tr>x+x;^P>9 z)?}V5*GHwF=8G~(b?m_M7Pj0Fj_~p*^DfSZtxdT|ZOTdZe#Alh1{lXxkjXW?x%idA zyk@S!Ys=r<8~iT5u``vdw{=`O{ihOF&b442hOiERG;QG8uNh9_22A(rd{eo+$A!FbH%X8UZ%d#7P`^Mj1UofrY6%W3j z#7vdB^=Wr~`SQ*MO}KTxmoYnAG{$>mI}Tm0WZsD*VjfY@oPG2YM{(he^e3+Bg%%P5 z0m$rTz>WKF+>cQ04UXjY6l6Dl>6grnix;_hdfm2{?h~Gtk#;8vz${5me$PJJ{gjLD zNP9QkK_H&wyF~fsH@kbwjJa~9liaZ6y+QrF{cNsJ?NXRulyvf&#h! zL7?Dl$WLt?x)&Xxqxd8RkN(~VzSB$EUg;%mZS?tfJM-{aom%zu&kvg?FwdAzMImYS zu=$S3;fen`9|d^i=HUnYb?j<{ML9`+Rgx@;YdNx__eeQFTR@F^bB-y_)?!uwKZ*4s&Z{6?} z@*rftqoB*bI|(ZaJVBBp#<;lV6nakqPGfFxM3oY3Fa*E;5#88DQa8Zsd*1aH-0aO4 zIK+Hj)QC*P+ArN)|CKPRjuJm|RW)&AmxHh$lCKKfho;z~Pv3uu%e&WK#4inZ-uHZV zA7^7gf!1D*L+HiE1`3`(q#*0omySie`p7Pbk0^NP7zH$XbZPIg5A_t7j)Kh!+c6|3 ztaR4^#R=aRcl7b~MQ>QNmdU40KSFS&^020n@giVf#9!X}@VrWB@0hN+qwg#5)EwXh z*h8PLE|Q~ACu`?hU@Hz|%KsHWhhosBa2TOhF;&wH*B_{sNY3Uw31t2-Fh5M}u=P}7 zgGUHo)esyunmPj2Cn&jUpeM8rQEYggd~}sJB!XmY3ov$NSF94cEvDla^Xot(N9D4_ z)`{Cu!;~#`ni{a>HEc|i+meh2j?AmHf?_A!tO3B(9f#0&g9niUsBE&gOnUVPPo$Fc zu!*&CtNhyMuAt6=U!|-9&0Wmy=?HVy<&MypzZZd^Td3#)wOj#oHO+jrbFe?c9%HDA z?1-o?MMrk9E2;KhH&ANoYlF+e;8LqU7*wE9sXAzbLAFf74&m^=E7idXaD9tGJnceI z6Kb=Iv%%SQk>E$g6qHl6J6aV;Estc%dDA|6#$=Yj9x{=UTL^;1oinFp7t~IJ$rO=! zsvh&A%9MS>CT5zzyD*srTXsai1|1ra4y}ijTC%&nqL1R;ZaeBxgcW_bm3dr#mu}hz zoixy9V-m5Btme?iEupda6~KmRs%!yRga}YpF4$bC?mjMqkF<_@u^|%syp~$Z8e@?Y zXomSHFS-1=3w!PPS`EBb1FzM?9d2VJZ#@OCvefJqRe1R?X z7AaZ)YN)q$x@9)Az4U0})`#~-S41Te6~;8-PqqyrtX}rR$%S8H-((bdxHGS|I|M5m zE8=BJTY*&xEpY-L$MY1NtmL>&jWc$lNThWb%A9p+tTi6|Vuxx#Hj`{dHZ1tsJZ*^+ z*=4ifL0Mkg^gI2Ez*=Fd21pm zm@Ql6o``^^OJc0b)kr3wX}z^8+fp>dj#S?T-mI+?&R!kE2raSHz7HMJ=3*;O0MR33 zJ*4{JAJ=52N-UbXNlV+rHsX&NZe}GD8go9;#O55>pk!d#iP%O4A;>cPUxkNYuseRF3&7?hP==C%bVB>N#nyi z02{y-LNKXnAa^tvW~&|^VTtFFX4xhk8tTVojP+6KRs6_=<{6MVn*#J0DJr!@r6&Xv z;|OSNrr97DQ^rORNn)FnX&sM}3O%wDvtSfJSi`nWn9h@+hWSWsHV(WC0j=<5spT!o z1ii}*24#>Ah*3nQ0m*z$I;#czQ=pwawSvmoWH^TDFl(ww)}##?Hi6;fyra;oJW6hf zYG!$Do7A;wMlG~inxvCSjxVD zVrQ1L;Jj?LlV;fTip1-UsGulahld`ZL%hA+2)F~s%_gvf-Mv0*-Xg_pOG_zrzESA&CG%4C@S?^%`c7WirIRyz7T^MVl zX4=q=vc)v5ooSk4*t$7eekEIuscDvD-mZgrYiP1^9@9lzcA=<-wwj>OnFd+a!!)HU zr)XGaTOjNsV{xAsC|;7X~!TF!MkQk7n81~)4(=Jg%m4) zbZr0!|JS-5GFw)XZ@q^9#x$msk0VXkbE~Fhkccg{lSWELBYSV9Iio$fYjO*-ayT0> z$>$`n^36_!b}!I#aaHT{orI|t>E)KcBsOJs>*5=iV#sG>%Jm=L_z=5o|NP6Vcj3Lh z@>@6l`He6C)?3cJPExgDqwMRucc08Z>(OR81fMsjB7Q?a^#(o0w`zWA6V?9$~-ZAbIS+ zf8>$v?JxgksC6E`{R&ux@9I@a2);BWqCjvwciFp~kC}%)Ar$J?Yf+$FHxz8|Uuc!$ zPo8~2w3~On^ZxtqNWsI#NA>%pSH~vk)p_)(57f*0{qKGB8JYLLFStL2``sT%m+AZ8 zYYaXgmJRcZ+9!PUX{M5&D&22C+}^#@43hTY_QUUZ0+X-wj=48T)J9Lx)DNeBU*??w zBKOVy1xnKOl)b%e_K1yn+uQWqGQWZh=$F5|y^oGz`swyIC10-}H0RCZ7m>m2Bw^R< z&5kSu2ljXO)(<|o#V&RS`|EF3duP{=3*&J(FyF`d)k6xl-k{J=oZSxQ-rJflHVwOg zCn$Ie6okE6wZ(cP3A-EoWS{&hF2@m)v&G@BZwQ7oaLo z(DlePpx98b&sMA`xOh>u)xkqxf&wJCMSvwAhuR9EhYt<_88L)i zvb5*|B4d2z^)wk3Xj21r2WbRXMO%;ry_e39iZ)bCiU%||M$;EpBOaw9G!S5r+{@#3 zk_^*4E$|NI1l2KUOw-!n)?7v!SsX9w6dQFhDJ`tAWg2frwRFEyuZr7{ArbS`x)P*w zOX0xn;372Z(jGXxSiYnX0YoQ>RixWNxo#p32(FUGt(mewz*Ly&sw-h# zSO~Jl(isy3w`kLn>8RS@8GL0}YR_6Tu=IX>%G9KVL#C@n6-@4|Zbsm}k#iY`EAo_N z@Cr*W0#8FA)CJ#JKwhuFuhRP3<6%|jA!i*OZ)FFD#%FmkiP%bYsvq^wF1F$Iv?PY) zJzbW!P@N;DW)j!{n>K`W(DvQf%y4_ow-t3<`x@!qx=i8D$vGaxmj0|Wb`=#!6{-%9 z8w6si+omx*F%;B}I--hVr?H~N3nYo?OQTr@@7(f^q4Sbj7%VYPf!aQ0!N!3)jn!6- z&;4MA%%SIIni6bq^(_T~`B2UD5LIR|_f=?Ls@tv7B^3j-DjQOGwrUU`R9$%b6qp6z zIs_MN<9U`PO|evmM^cvFH_I(=#?@e1Hgz%>G{dx*Cac3_N0urXPgkQsnWtulNu|k%^`$ zSBI2QF^gBLWC=TVJCte6J8F@^8tZkm80g&?8I+^e(b5d2m^9WZuLgBg7&{m?Q!k>jZU^bKP0E=q)A7nQO$lz0pMYr;$Ebc?@dhxfW?b^Z zL?U^NP-sG9u4svB29LQw-Bi>RRg?_tn$~JJ4e2^;J~tD;9N49rvtX%cI*e22(}aG; zI$1JbR&!pa(}w8kFx_i0Sdzh{^7CWC#=0`pr+tZk$dXUd2@Ys$@sH=Fq1P^5A zt9E4z*F+AlVj`@kpqWqGDxKGnSaz7-hV1S*O)f zJ;oVVm9r^AuTaMzjpz!l$RKT#{Lpm6Je%1$12uSA7K0dz-WTJ9x6#;xi-WA*A0{}o zj8|2$N=nYL4jj@Je!Q3tib?B}v`8%9lIdtZTnz_hUL?g}lxf=1X2bA0sLBpYFss0O zpRLarx)U5X5B~XsH@{|zE7#z;an&RViMyog&mH&9ASR`uY;U}mVlzJ%rtmL*{xIIP zi(um4T#?^#U{bq&6N*d)vdfJ0Fy?Uf|I3~G)bre>R($5ZF>^9~&wI9aFRiz>eg#fP zl9=buz4^_1>nFbOkDomM_FsR{=wuvsY9JoC4r9uLOk)f4A#&aADUcoC4F%Y&oaTQH zPabY#=}b`|PE!<2r%+(F025?KtMbinHka~$_ov<>3U;^o1MUNOXQ$Q*LuZ}^I(*_( zpc1&w$;6$VgKyYA;A=f)y|Xv=_rLuoZ+&Yg1N>GNXZFy2EBBQv#>hN)eCzS`=XO7L z@QwBx>;1jm_5P*(n-AVRe-aBP6wTQfS;zoA1raJm_qx)-lkfh&LD2JbI@mlwXRce` z*rH&cRB}s-R^~yo)!g`;2^0{xyGM&%eDLCJ6flOr!(fv3+AGmNNs)WiJufE1te2kN z_b?K&{`UMiK>YB%+?@glX#! z!9*W9snzyr;L@eP^($QhlOm;R*8j))K)mDL+uruJwq+!S-qFW6W@Kjv-};&Lg{^x! zKJg2C*VoT&lf$J;&pfmB^o58UbLT`s(`;>RC}8$Rwhxip zX-r5y_y@g6XMVTi=JhS;E6s*9@$<@=TjQPy^GoRT;vRUxlb0!l7 z^y{7i>YX|`cP_cGzpqhfw!i$D{if4W{a^gOf&1wF>EAUb`QZQk!Q`1+H@{L}sQ>q` zyl>#nxjg#By`yt>d!D>;#z*mP$gWw}g-vtm9P}$;XYU(NXoV`Kt zwq|Ntw~Aexh=So$z*gfv0V=ued|EQjTG=^`7`!ILr(4B|>YTdofSUvLZdKVPbU5b3 zytK%fUB#NMAb51nG?9^$ivGa!Fg*!5!}ABT!_z<6W6cXVO)yqTUNb-SEp-vW_nVYV ztX<|!o{ntp;el&WmZvo{ktnUw%unbvWNVFekO~J3L1@7l7*BZ&d|=KpjL%~&f2A-6 zHERJ!PzEb3V)$B^jQKPxVyqn@x2vTD`Li^T4u^x$Jj!fYX4Il-=4|ZJ(!*kC2YKF9 zSv^@5SsH6eK5s)@Gd6k(Z=M&Vo)_Ku1z%d0daw zvyGjPLkrjWEcBzaDq}bCv=;;4!n)d~NSkt$HEMUpH8Lt`MJwhBeQ9od4MIu}Qx^|l z5&QhrAL!5Bb7|H3aW2lP$XE{=w1l$`kqx+|WuDNKY@8Rl4HTF`o%4<`D?gpgC+U1L z8_+GPxTb_m$~hT0ovmp2CRYWQSvqtj=u{7rBrBVc>#@gd%I&c8s%?|W5-mu^X|0Hp z(U}gnmcwk^HltZK%>Bw+>XbV4sBWTF7sPV(I=7gQ=R+=BAcu>W6s?;mr?b>8=#nK`qXySdUkSJ^~#V900W zMYRdU`fb8c2J_nQnN|K!TdUp}T{H+}?E6QtkWs=b*oncQTJr47T=rhWh~@^UYX*Tl z7lDglOM3~L25Q4x&Gjl!P`h0NF3J=rDxxAl!Zg5bDU$N~HE%!9nR|EN-KDr($&L#2 zocF!+Lc2->_V=J4QlN#m?BLnSLUd}~Inx_PvqW;M+! zBF0p)IZ-w_avQN8P_Zp>X89^k1XS~Su|il58$C*+N)`UGw-0b@#73g3XUitmD;bTL zB}RGAS75T)6pe-15=`018OO_3Y)3`&2%aA$gla{DjZlTi*b-T<+Ni8%Nxfppt(x=L zM)lpIFI(738qA0l*gngae4UpeuHAA`&$G1eb7AR5-D*l_k0)f+ zZPh1k(~!${*>cflD?OUd=SgL$>=7%miUkdH-f6>&8v9_hCD*vAqg!BTse)aUMiIN( zv0=KI&H19NQ@p`O%WUqd`KYc(3@oZ%*0dhJHr2O@Wh=2=NzQjVB<3~SnNd98<6>!% zMg&JG`(9~RbN;ftUjS-Kd&2eKBvwJrq=nDeENtELui|MeD+56ZT$b2=nJ1V_92u2;&ti0GXUA4=td< z#F~7-Mx~l&#Ndp$J+AsmM{8OkbDvFlT{J9Vu(;Km+RS3?RPkja778QD;ZC<$Zv55I5&@8dN%@%G})_TEe;3DaZYu{9)CsNOz& z8$KDHf9D1~@7~`2h5ZAW_Y2pxzyIXvxA))P-QR!p};C-)@&t0%8tmo%(( z$vZ|V&IkJkyFb3Szjx3M6kND)a3B;UJ>ihB&-XsQ{VQL{zLISzI88|;^w{AsPr>83 zHJSpu7j_SXzmxCICdrehkL@4ZO_Ennjz&;$?UO$Kt0#rKmxr?zT4|kGx%+;*1He

T$T{v>PZ;KO+=8)ILNy;W;mzmb3{-@_XT#7jE1DeX=-zesAwl_2|x5_tpmz z^z?YiVZC>DNBqyOclNf=9?lL5 zjK|kg&?~pQyQQG(1`2lh=#5a&bs|L;3WgM03M3~9`JG?Wb&^mEdRxZZZPn-}LJbfPuE=v?AeZ|sLG)HkVGKg#VWA4pW zVU$|>0gD@)M9}_Mth5v|k=>Utwq-;D znSjY3{lOn452mGD%S2P$@I=qG_!ts*NH@?bcQHR=JGmBTeR`h6j3z0>N7S36LgqRf zR}i~#96Ime{80`fXHEUxKz+isP%hLUe=$xCNu1`2**lNI%p{lGEP8A*Po@;MG|K9c zW3XcC&>LRd#2QE^BbkjuF1d;HQ=TTTcV)P^!%3(hpnW~~2`6oYd z&H@Cx?aP)y71~<42c3d1Y{_#Cab(`E5=8ZIwak<7!EKT&=Wk*fz_gT0C8J5M3{%UB zNR5kW8p3l9Npjaq99LD^ha{M_m{A($>^gF$WD29Xp{qa**mla z)0*~_vjULA3@iCV&70$bvp7Mbv~2ioM*m>5gCjX*rfS$;(723ufTpe_38g&9+Jz9bp2{ASs$DjhP8kdfrP>lz(kNUB(Mwhq!LU0kxonU;heePUSX=_nq($y5l} z^NAi&gBYiUu!4O8v>!)We44o(O$7Env587n4Hd~3QzsRch3dLqI4n|iGU^mbnSff& zAWF*4a!%+C$s#M$G_GcJz9diDeg?dGT*EEeB(1BGE<~42q%B~;$1}?`f(QUWoSNrOM<3AiTzti{PSw(T zqY*;yrUT$O5`#-%&Lb@kre?DFtXk27Xx$Oxz|@YSQIsuhm+N|^B35hQ6Ima^*K`AjM)_E@r)jEsmW&pKSs31y48o&!k;ImM zKg(-+=SnrM#stEmr`A%#hL-6{zEHeqr>jL~CSB3d+3lzW%S1+J8UYwY{4eIJvy*B$ zn=CE89d6&6W<-0OM@`eW=*NSJnZld1m?8`_wL_m6!8VR}6bFs9gyxcx3ruJmcEhmtzfwzCOO`5mYZXjR0U(N zj&Ug6u}cp>43mM%Yr>Z$)jE4ec}e;4^h00&^gH|ea@c;Z{e=eK~S^S#( ze&S0%`P2{o(Esrb=I_kJMS>}&cFvtUMGE<{X)^xMr@#Kr)vM>$Dc`5Pe!aZ-*Z#X7 z`|3aZ_D}!$nZt93*FLuX*dw3*);pj3+_m+?539?!DG+YEV^N_yqrdjZw~|CCps4Vr z(ds|?zlBrT5TNWAKlAhXU;V>BVmM$XUS3R+&*6?A7Ye#Fl0rZ7wQrp`AruJrQ(lbf zzxh98|N6tfer9}btUk8)G5w*heI3hHo=1Blm%04ExGaU+?S~xR_>&*`)F(bMAaI5< z{n_99_K!;V$&*U`0q3v&=I=fy@_XUS__F8T^Uq5Rq5kg>DmcCI%|CfrF5mrM{-57d zXH@>x-~4j@?nl0*4{wfd{_-ya80yyRvt4J1BiiLcfutKJ1B%~#`G<{2%mo3-_xJzG zzs)54(j^i=!k6n`a&L8Sb&{Gd$*Sj{ml#5;kU&KBBR~8p!zusqkNoXeR#JZVxnFXg zg5%@kLct3-v5lM_i(iNw5wSJpCFR01BRTK>8JzHMzxD;sLvyd1@ypQx{LlfulHl)&VOST*?S~0^!N-N+3~uxi~w?PIZDb`{?-3Te9p;lyNA~5 z8%8V@Ns#bgJL_`-$@=Pvn>SCqbp86jknfoia_*eyu>Xx8diGgPtP)*YzqH=@r0|LV zJu!B6{?5*ge@ATyBz$-m`%R=$&bM8s)RvDtJWStu;f1xA#mf`nc6lhK!S10TdiUyy zGiOe`G#-=vWu@1DHc+s$^X#)XU@H~I%%A`Vr|KyXdt?Iz>5r+s1K8cUJxA!>M32*!s z?(neh|7>HoN>cBkpe|*GRlfYzTf6&j?!NxI+)Gl!P8B)7+{+P{AEBTdcM$Nn{h@n9auY*F&0tNHT~OE^byzHt6ZVy`6D5x?P@7b*GZcpJAo6324Q>)36>xK$8~ zpH|ESa1o{JISy{MIp2GdDHBdpUJ;d10w^?<$4Is{IwTn_b54RgnXhwYggK$#wXmzi z@GE4UBO@m~GeM3ZV9I?c>3ph)<9j$u67QUx4bNo`tBe~onOU<3b*+-3TR~)EIz}#M zoKL~csP0I^Oqa=%$oyO9= z)$l5osj?+l+z6w;T9-+#jW)CZ-7t?Y5k1ae-l)SEig9h$AWUIiAlc?TL&4%I?HY$X zBkl!#77(XOGe@R`Oo5ojB~?C|v0k%;Yt%ZWS{(9cS@p<$J|vRr6Bi>RlJ<{GFmj^1 z4Lhx={VXmGV&7~kK0LIdsyn!s9)wg>7-N{%wv*nqmiG#?X}noF;0fi#7}PwWoB5H{ zWlK9Xk_r}X7ISfrb28Cu<3(&@Cc4Hv3g-86LFrct)3(M>Rl zFI-V=jWU`-)4sX7MF7Zcohb^(2X0DwG{Z`S6t_vKaC8%tGPG?)+BS_kgs`1L8i^K& zHIM|@C9S=*#O(z=n!U)Ew^9;eH_ummCpHMphy5Uc|JzL+rpn?aE}u zqS7dC*|*S++$>(sW+pF6)v21tE#uju?%Xmd9kT40rZR0SS71CkT{JOz_5F0&F7Bp) z(Kj8<+%$=?7u+Lb?_A#%MZ)8ybJh&G?66*yi8TwXI@1nf=rgRY#>P~(aMCL}J$H_k zNJOoDZ(Y2gCDgW5Q#a`s3?^tvbTTBRac}OSfQpNv<;+GY-@EEY^BAM~3wA9~DLQUf zbwsCM!nz}r?jl3a0MiaWR#q{hg65r4jXeWy70IF)HlQOzXIN!5hPg4djl|nlWi68N z1@Sr=?Cx}JF`IUgWy?i8CF#6c&fC1#tZBsbO-5Ojvc{5jRfpyC2o_XT1^WsVh6N&J zA-|`Q!HU!1CalV0&7qp0L#1q-6^t&tAL9iefM>;+44|9le47dpU^63eNjsnPwoK-e z<%lA&r5}ZVUS@jI+ETail$Dt!Lk{EbWHFzj>=h^3$XfccatvI~p-N&4UAT_zRJ?^) z(#TAK()(i3P!5b;Cq1K!HMgHVTn)UmYG~8dB~^V^!4~r(;RL!k1`vOi`%+yx@Ts^N zQYdw)`e-R3xHF_Q`0yqujYN@5RI@qHxFM%P{O@slpGRK#C`NDh*5}{(`nSGzef;XH zBHKQBS}Bo3Km73enMZNrFLU}Gb$;jk&XW&){NsmjA0CtJWLEvuKmCO-zIt+hU!>eS z>+?S48^8bS^LM`W^{?%n-{A{Hqmd|&-}87pWETGDqdOvrJOAkqJ)*CVPo4xa|D`2F z@4F8_%y*YCi7Wm?Y*gL%go5$gV^4u7(Erd6{Pq0RlSv{{ZYV!5Qv9F&Pd=4>`jHQ5 zC{Qn+eDNfNoqsP1zQ2B=vn_n1$f`v`DC-cswolOlKB3g9@}VamdUEkczx9sDw+}8H z9>THohle-L-#FiI&O-l>z4)ikz|x=Z4_|%tmAzN|uIXJA5VCK7G8{ajp^68ipPed_lcg9Gd851VniIDWB~Xz;nF|z+h)4q-rW%{ z{(yM*IQfy=1`dyX(qixV$^UQ<-dtT4|Kz3pmt>#94eXN3 zP6!d!e(t69*(aXZ+e^KCSTyB@TOTy$V>sm@o~%8|%E!(T4S7i~PM+^6*m;&ap}^~? z$9|tQ_4$ua3I&&;;MA$)#6GKBUW&VOi-HrEk>|=srbIq0n)1S}Z#CwX#A6hbwI^w1 z;{0Qe9Hcz!cVtbCezx8@d-2p;Zy};Tdu6}d7g_ydkF9r($N$ssNjOUg`-3ceeRfZH zZN`SdmOI;2&dR-T?Q;HGKmK1mCEUBj^ZOBGiwW-R&RL&MuD4DoU}`l`poD_1V_-OY zWw+ZES^Z;=-C&o;@z}>d!QcwoNb|Q8Y^=#|DG;t*V#a^{GyjEf?-I}R|62;s0@ywo zXuPu=g^^-P*RiLNQ8UG7N|O@p%_8T9Ny;`h(Uk2}WFi@^VHMOsS_!X)i)DY}CN8sG zaopvqV}bQn7T%jfw7HP8%&@$V+eWjV4tyN}^4mHm96os(e%?hwa9Z&YajicJZ9P|; z+?W}5cjn?_Ie*+7gaGek8fhgZUz6CpZ;Uf|!YioUae*r|2=EgpOeyL(*BJcBugT}B!^+SzouQRd*a6YZQVd=Y<25Q49j35Q!<&ihy!FU z)5i^;KT)PNOb0tvj7(3tg&$$LLFyIegqJ@HG?}qR8S4=fGF0NJ$(gmur%s5~I76Sg{?UPn*tEth&S`S=^Wk zAv?P@vcAkITF1V|F4oAQGK*D&jms@bxt3)_S*lR6V`D8lYthswr+j$?&DvB~&2lnZ zz)+2{*5pQ+P7$Bw0F~I7jS|?PBNM573T(+il}b?K4U62CTp8LRffiA+U7IG*EjE=; zkhBBh0;B;(upqH!ZVg_5NL6&YiL2i9V1t03%{qxjyTd{>B1qU+LuCLKt0Jw=9a3-2 z(v<^jnmesZ7Z!aA)&v^WvHV~WU=f` zTUloO-nWtHI8(4LkT#4Sg_W`>qvqbATB7M1#z;KKm&RM51c7Itvg~HK-#7_U&Uj8I z7c*9-bjfUCbi=1?Y8X_q3eg)tRg?8ch<&h8#UFCIzETPo2;u?sC1qpGC05NgWxbXUVcjVS%XGK4%!RHRDmQ zvO@Nf`>!LLYBFhO5n3KLwJE%R)KJza>gqm@3ROnD6XZ=p9mJ7|XeE_@2({F!g1Xo^ zo+(Z~KHaG*A{PB;RJT<$wef6Kk_7~y;~gvdT%;N1a-^7~r&05bs;ahKlJ*oV@8Qp~ zDl)3EHYpYz%nTA_6x2uc$gDcn&`=ENQ!yc?SGtqOiu0ov=gEjc6$K3o#0Zgry6+Q= z?3pZe%SnyYn7FINIh)A+RQ1MAR@JJTp^C&C*f7x4*brZ$qR@4El}uv2$kINaWRq?c zr){!~o4yz&e3M6K^L$0$IOf+l>83n7Ajoa8Nxb_*FU_p8R5#dEk$GvS7+6nCq*MFkmbY3 zR1`#)5$#jWOOv#y1mi zy?^SF17N2`%%1Uyo}z26=9so976u9+zJRMoV2^nRg^olk!gxB(Y^6<7(ku1MXkL-5 zC1UME&FzW-YUZ#ZLGPbqCI%5X{cyT0Cd<^gzGiD%p1LCsugc*@&JCBBXj z@SW(iI#zAwO1F9Op?fvQhO^q9$%Sr*4BemUmc#kXM-L>2(`N?%;gLs=Z|%Od4==(D zw_^D&&d{P4s1-+1nKL?S*$)U7_h z^Lcd{DL>NR@tMOjl3pmdlV3Qd%>lE2I1^bFI0b?Sqe0@`k>Y@`aRN`GuAw`w{62E= zXHWWxt0&fHUwGl-DY&4^up5uvc^kyLwn1 zuHpT}SMoUOgfqEB3phcw2?Zk07JUNQJHFcw6bK0-6&HWui@NTz+ET!7{>Ri~lJjfV zUQ@@9@9)C?J$rbF<}#%gUU7V7++FRfUSy4)2R-_DuDhql2iL2%gJwYZpNses1E;w$a(*RsFw5iOH0RF z>FKed8y|7)GZYi<7t3azyvs;yap7S@%H{eE?iPy?p$#R`0$g_SeSa4Fxc<1E;!er!-2+fqF@~qfVWIf_TmM%J%m3 zBPULXuEOr$-G>6vKRDtd%W&<```+0R?i|(c%ObOvZ&Bg?V5=MMzY9e&(GD0i=cVJ^OcS*C7v_=@Q1(rWma`AU;E}aeDAwR&lFyIu)rWGZoAtQ zD0bXK!N&O!0d4Zjv|n+e9WZFl0|pd~$8T1uDU7-L?6LE9~R&_2b^Mii9 z;FPD})TuL{Kj&9Ie4Nc8-kc}Bw2EQsX8n~v7~upg6^44^tTS|3-g5;<>wlI8jLF?z z>6l?vw;i(wjZfUM%&I45n2pLaG&4y~k={-VxEY+?Uih;N&f<(e_FTkjsUq$Zj<6Bl zUxr%*Xq#(^ZMl{(Ufdi9ClBn2cZY-059DrV-a14dn>2SP?uVz+IVHp@<0`HtO%i)BY*Wd;^`U5wJ0_k!n&vwoT{xJA4@A z_!+r)FPD-4j>!iVk}*F7Kll_tUiKrH5thtnk~u!&DDU73vAgfNWr)KFE+Q{-qX4kK zmc5SDO+1g8jj37RFs0q5+n%jl@Un*=B5Nxz)wGd^*j`yU5~f-uYI1ghxRXf<0ca#sDqUgu(VZ0hq)Rg(#+`DtT+^t5P1l$QpTS- z;Nxp6p21B?VSB;bap5QqPu9i&3d9nUbICo^TjJnP>I_cM8aCllded<9PWuN~t_cMV z!S}Y4*2=tqKc8_b&mlp{k*clu&Ex_BdX(ZP^=SDqL4ydX=U5VQL{tutX{5S>pHv^S zsz#!vh68I3lTI=pVtb#X2g%sG-XB>dh%2rP8KZYk&Gux)lr4*ejKT3a>0VgVvLV|B zs$q>w?h2bCdVx#rU|ykKl$BS$?%4qkm8f?|+dQOj0w}sAzUbUD<)em60hBr}T1$yX zCExdi-(a00g7@ZusxhJ!0rN@?&&m#tIBS~~?P1bF5M{T7+cxP;hlwmZi95F9nzY~> zP2klDGDn=ia@%e0j8e8q`jLs{fwVz`1!ZFeM1rVqsQ}%eF0C?S=;9+5XpEKR8k&OA zGgMs-LMxO7sIZPKq^KysA`#UIF{sa5z{9Y_7PzfsiqkN;Kn}d1Lo2gzXchXxum(Q7 z9%3m?g)~4#tP)L#xd1AzZKc8_f5;&Z;l49u3WIb!%L?OBs8O2Ik?2pKHm4)J`e-!s;^PMiJHEw z`$#V<6-Ai0h&t0BiGidus;YFcO1ouc)HGuIZPTqHI+4#|B{?+9x>?%QkVB4avM2mL z4rYw~E@T7zs_Of!uDD-;XHp3dO$dzK5Cfm8uL`v5i4oP=oJdhqW!oGGubZZ?D+#Be zm#~4+2LQo2$zM6`ly%OaE-dM5)le}&+bhC`7%^w(Yz-$?uZ&Rz_hq5nHV0CaRDTVZ zOAfNsMGlhw{T54UpAE|nan>`0Mt980wy zpe0JokDitz=QBkqobRpsjsKAtr!Rr>y)ka3IJk8By~2n5!|}Zl_>KSbz5NH@|N5UO zb-x(*3xB`-CG6u*^qVO5mp-()+Le|mF8TNq_m6SE9Q2Tvf3L}9A6exht4*Xd-OUo- zYvUq#3l^18_F!-%L|#KmGYHE2j*nh&l;z+RFK-ECH&n)ZN!iFK)hRY)S&m(=wvHJe z@wmS|RgH$QqSR4ob>tYyh9CZsGw29L%T`5{K6k3Ylixx*qYShvg;;UqYJ5k7J}af# zqU9uXxT)k)5_-3J?)LWm&pD;h4kR4Ikb*!Q@Bd!T+Z@y3)`{QN^|$EoJ`ONQJ&+@e z*9UhbWn5w@kg?SI^7^z)KbXS%OAzqqoSDrLXIWOfb(=F&FJ#u~!859Jw}OTXL)oOF zdu}zevy??_-D$P7yz}J=7}b#0plBkEZsek|SncUW57jzm97qYdXYqPc#E#;!jV{MP z4$7)MwpiM!jDu;3LC=PiQPFMTldQxs*7J)XQyOBVl<~Wiy{}Ol@?>&QMsDO%pFCo! z2nRz!4Ubimh)Rlz#>!sDM6>u!E*-y;+Dffd*{qu+PCMrI1Q3dX@xsr(^*`&Pb#q={10kSOcfl))WDdq2hEY^l8Vcr^iN6PT$(6?QY z*KKFFmjxG6gT~U+c!Z8%M=~B0tI|+$2B~2d$D>qrAYUfn! zG5seQl`O0CzD^DORV1&tp3USCC!G}~O31$Dqd3yQ?O z>J4pZrepG&!g*4eQaer38_F=6I-0CyJd&c{>)8KkLEf59tzv{68I3M485 zPT8R;-Snh~n8xMoJzTnyNzp_bG9+%#shF|_TAX$9`4hVU#|xG#ug<_=|JWN92s!?I>kOvgqn63@GKJtk*V2cXu(W z&19DJZ5H>I&6dki$>J0gRL&Ot()4`5NQ*LP%-B%GF%qD80iTGesiLqtwFU}uGfGTs z!8n~M!{ZZqsyO41iWigg!H9O@2Lr?{b`~SRTSkjTA?mWaN<>1lU>EC%`5$D!@@e&7orkb@Y*^pUTOkvGd zR?lsTn5tXMBV=t%J|{)pjsFJTFEI z`KnPrNimpZ`+ix|b(<6+y77;8pzjG_L`rCVeeFbOjUa1e3v0_IpL9x*%}nY!rrXnu zt)#QMbaU=$6j+;DeXUh!Ku9Utp(< zw=jckq3n_ch`6rvYB`D7H*4u}ovNeG_IyRDX6WFHOC$EN#)g#eDoab=ZC6D_J7Pm_ z9WCK6*%Qm?P(^(*iX?ntYT#c*##9^dZ=F`?=oUm5sUx0cRW?~4WpO=c!*Dz=s&Z=C zE`mlhJ6@s%-I-mo#Lp^YtY*B5@yKY9l*8vhbB#P!eNVQ(RD@1Hj`!=LqWwlot4STk|k(6NtrM?3@A9I z=dmqH7J!y)CNQ#d)=m;=(^N8!|aY9+J~B3FIs*-s11=QgLSS5lxsS~nw&)A*UOl^bs}fB)@c{~1o|A#zG> z&!VHNJOw9D9*z$Vb}*3iaBolqu|6ffVi)S#`saR5v3L20zxg9? zNDPtZf$DI^YSlwe{^_5h%e-#ie(^;qr3i5DF74^lyKhQfURRf`iDOKFf&Y!I?(V^b z-Cd-V>qj3|JLi>9ps3%iuiE>$pA%bQ=H*ZQiI0J{FK295amH%ZLr)$Y?492`-@bj) zw;S~gO+*b+zU>(u-ItjN=3ZC#|5AQGY=lm3CeuAesqWaBf4qE-d!?1!O9@aJ9;vQ- z`X7C1`KMZRbG_Wr=k)w0Cvp^jauWHYKQEs?^QEQVtE&vJ6iY__EHX8f4;G%O4l&8S z7I~xW85K?2HBz|!{Sz;FTT^F6>s)L#UA>xOh3RmdAT=i^wLQyD+vlHOU;FsEbLYPL z<=_3K@%Z|65e-X@QbTe4)Kk2EDT|{+3}-J>^O8lSHWVnas{{p9IhwXmkR(EZXr~So zh~?(=O4kVmj2F1=S$5h!|NNdh{+}K{{+so4ZhU<#6!;uP0xU8(iGPn9KK-Oly>85! z-Mu1PUGF^hn8+7J-gxcWTD|t#`kJ?XMYDbEG0{JkTx37HoF%50bAN8_rF~L%@t0OA zryK0ymGdosxjE{#6r3{VhI;l{k*(fPk3A;x#jU*Ywb#%c;Oksu>O%$!WIwxPBr#PVIm>J7vYxKs6!c$ z8{9<6D?-DMO(FvaGh_ZEJdEaugo?9Ksxz!3GI8Ke{)i%y1Q?1VuJG50Fd+ih@*}3h zu92KG<{k>IIDDCFK?7Ho8=faGb#{?4spcKblT*SZhQ#aS=^JO=h6V9`2v5h~U#`o| zHvgee(u22d@Y(ureIN8Zlx15Y#JjgL;N=I(1K%zS{=?W&Q09UVabV3KK;G#bG&v>c z!Y;BiwkKHlUB`AIH8BNM)AJ`&;!5Yt>8K=vvB}X>1*&nZox_zYlkx!<-sCO&aar?# zMptFZ<&|ajH&tA#vXhmN+cc}eNp{8)F}Iatu-gci(FsK?!(^u*9xNqI3^FLC(lE|5 zG)8F&N?Wwz;+`2!geGUo7{@nKkjel+Zqf+uvvew%!bGpwBvnc?Taw=`C*)Xu%(@My zjq|<2%JjlOFc(T|Cy$1|*Bqs#i}a>|AT2-sl<){R?c+-vR8JZ6V9bayILU$8+ve`} zNg_lno^5innc>X5GC>ou46hTD9in(yGl5*a6x6YQ{9Hz~&Wlf(sycii!=|jdxTWr-_aXenS~9JGJ4h{%RM-_thW zD#h-yxIQYW4!eYpVb`bWoyiRw-cUtLgs{k3X_z#}2qx3SJsXy%h9wn*pVFwC)aN1x zHjo3J6wu18ZD@tYQBf14E86VL#=5d`Or$u5Ye6HOiLOx5+7|RWC3eGeZD=sG_Y|QZ z>lLhR#uagTmAT3=24)^N;!Z~~#1$+P-0R$JFDT+p024p%ytB|cIDD*xH^Z&-am5Qq zsym!fkvrmR7~p~Xjwt>nn;Dc3%4~`PDAt|}>=~z7T&`AKgPl2e*?J~c%6kK!J}E6Z zSfkJxPm_AtTOC_FsabZJnU(8j(~?&~tz3%DAij~!x)OVDXMG1dF6#qqFHDkhLxT+M zgOlb6{kmQ?dc_J9EKXvhDJ*7DP9iq6R^%Er(PltU!g{HKG;r}#V45###t>9R`OMa7fW*GJ-suN-m4ALUS~Y)&iGsxffzJO|^*?4wPh%F2G)KB`kp z5-;e1bMnWrs@A9yilS;c)72tHzMK-Pj{3gvdvvEgq)3OQ9kT=$jna(e2RtgZMA9Ug z9B~$E+GS#9%2D}AS&t@VIc;Wbl1%btSFbEmcoVvV4LxQ62#FPmdtu?%QO{?Im zfHnz;Vagc3v2qN;(cv$ENTn(ZJ#ce*qH86RH;*^lymY4XSHJbuu6D4 zjV5sOwbC8Nq7sWr@`!$Ym+Pq+rIriT%zA83)e##(7A!i{d}GVol-Q9d4dN<3(tTfgznx<`;r>>?wEGBUCeDjOtJY@gO*pgD7U-_e4 ziMur11JZ!gz?;jce2M?l5~D5(?53^~b$a7f+FcSdO)y`Qpzrv|SXtR-%t6Tm(9S*Ss|5iaNO zwg0uh_}0bl=FKx_u5?#Aw0Xb%`~UX!Q-|o2o;oF8e3BiPZ|+{bD)zR8qq}+L<{3#T zJdf}@SA@GFx5LAm$GttH+r{@+yC~~Q!w_9uA>n`fz5m>vcU(*TeDO(kT)w$mRnOwY`tB1r;Sq)B@nvAw@$08v$4=1AF|ug@vm>kgW^VwGxRgV+cUE!?5-&^*FBSTfHA zQrGav!V_P;di>nYn}=hs<;(8SO`hr{w!{k8y}SR`Te53(YpH1yZe%92jZ4e$TEPPa zJ3AX2#KOhH4SEW0Mg5%m+;#=znx_EkQ^(I8KYlnCEnmMoREmf@!IoIzx_9@}RQ$J= zntY%wP@8|{!q&|g&*H5udz$(C1c0J2_f$+@3y20HU$cn<2XO^BPG1JXH zSLvs(6?sOA0ForW4zdZJ4R)ZA0*(a_|fc4UEBs>w$w9(iJ|ARs})g zKk(7p9JXg4X>*7;%VgrHvqx_>js6ZVZiW=M)AhF_+$R6F-@nHzd-t;hrU!LHbAG>6 z@g0G;%Pc9kKZ$a8PEx(MV{bBXoAY~~DtSfHb^1+cCuc{_Oe{B!yQA*NGhu)FRKhkW zq}@Ff`IMVrui^)%lla$cAwdlj01mVCPP9~d@nJiQA5bzk%4`f(EHiIZvAI#m| z7d}`jiN(V`G5##q-@CiF3qTg7%W6FR&vJI63;gnra$-CRtnZ;cYV#K|6MUu2%_ z&$Ge*dpP!6xVPsaukTPaANWDqW&OY;ZBxK0`?TBp2hM1d;K9>xQ^1n_g;4O_QogP2 z?>c=*`2Ph2q(Ao$NQiyF`0pRx5iGy&r#pQKwzqj83O@STAqCv9Pl@g42h8Dt9{2Ad za`vOoMh{jK+Z1=7zguEITlF9PY*Mln_=CD_io4GrH2r(T)8;)q-`8uK;_mbNCJKS? zi@=B9H}t&%w<+#EzgOJ*`}v86yMMgfF}5l0KHrY{igW9Jf6Ff-bh@`LC^Qg|L*X+^WTQw?f*gP+NS@@ zI^RRrT{zw6xp8zmLLB9)+?H$G&bQ~S|Ly1>>}s{4=es@M{gf>|+w53{U`TJfB*3BJ0xq>{_itd$r*nA ewuNo(yYYXc*5g`T8e8?s(+=O~wlUu8{Qm+*mR7U? literal 340884 zcmeFaf2b|Vec<=)?&_yLPfvP%lo6SQwNz~;?8_pOCo~%zaiv#1vSK@|(Ub8->>x3- zUC|IpLa>(giU93xPljTulvqB=^nh$|xv#sN!cM}7RjX5#?~OqhTn8jxWZ z&4Qma)>s}t>E!dRK7H@GKi+6$dp8?)zW1K``K_vNeXF{MQ9U};ZudOl7$xk5UhLdq zR2RqIKXkvN3|P5Sdop;`w1e}Qn8CYmo^Rv*-f+H%{j~oe-%3S8*@zm8iRQQ zPQl**fqtPOqdA0%gfWD8kzNgve6Wtq`XnFCFC0hUj-7cwWH0g!=f5)!yhg+SJ1g^a z#$(Sq9r}jv4Gz4)f&Z8};D*Ydc~5`(KW3Kv$5wayA3}xCbijY_B<jOK{YxCJMpLeJD)oa)%rLj@!?Oy2O3&j!4FGu zDm?`z>6S3>6FUYbOVWImMwf6AXzPI(#fjwU&r2IvHtpGnOwri!)}&!4)JL6+7Wt@@>kX&M*P zCbA|-3$juXqUTb^u zhi`I{Aok-}BgIotOrRHwsWD!|)NL%-zE$^GFlPfq)@xb&`I?-}+K|YK4gAQ=m&Ll# z$Dxfi%~D6^tYNSFjmWsB`qnFsZ&!DS&CSb71n6`0gW_`P@u!@#CR-tyo>Y$-(oR7^NCF$dkRXVUuam( zO-;}594ux&t_9An_|*uX4%)N6`A#Y zIyG5K)-i`!wwlzFtZcGkBF0WuRC@wJ-YHe*p;=DzJWY(-HLE1lW!1=(iV)OGG9!S% zSu+*5v|LJ3Ea1{AozD|lNxy7Xtt_PWQvcZveX>;rJD5xFp=qGxy*P3 z3fb^HcW}3+!o_+zo2)5)wvl8pCzE_(CgheR`4X#0nzqc%n))r1SvQ>}()A0ek|Zh9 zJPAoshh#RHO<~=vpDu}4=%cAd7+qcJ>X2nq9YZQg{B*V06qKOv$z<({JWKM#gju02maLNv{7Tl#nWHuJ`8W%C zO5BPuaFOKX07lJ&*44>`HqCi13SPm9EM{{lW;|nwTh=mNE*3>PEfYGAZG zew(CE=0cLBNR$>yx`f_KrsoTf#AIe+yELEFt*Ivy3zzJahRZUSRYjNAexl43nb9dH zuqTs{)#;)GC-;i(`>CDvvk8c_Bm)$Wb2gclW#&!ls$!b0(p6E?!8{eX;DLOb$nBf* z$RpE7S_5=l8tlbgC1dQg9Wxhyo2g0QR$g0uZq$8AS5-F~+E@e{BkWPp6O5 z#p5IXXutk&7jr1=*_8LoVZ=LUKlI02YPG$47dCD```P38gwCh1J-BoC?!e3FJ;&{X zI|p|zYNqY>nP=|a{lcRf_gNt3c99V&c;bn>ceO2*!#kJ=ZIA~I-KXH{)dLw?VnkGo zizpCL3LgCel_1}}oX3Pui|2U_a!Eds5cWke4<$^Ea6X>=*MvWP`PY)bL-w@!g#2?` zisJt(W(iL}dUO4(%wsk-VO${Q6UnpqFUgBTN_kwqD&dQl%&%#V;c5A`V(lO{nc=S z!IRHu$esAF6r3V}lJ_WZikYer;m5DKo5}C=8_e=-xBjvD+SVf*j+YC}%Q#^16rx#(79fUdT4FyBH4*``y%%c4(hE z5?Mz&2HAQ@qOk)86M!8j$T9v6{^IzJ?1v<$&BUuj&67Rk(&?*~gsqRvXz*mP>?-xxTq?sK z&Z^gV$mnK-Pa$(!N=yDtPI;BAdz}P%WE+xqzQY|yOix;+0wM{CF7@p}Q;Hae=qz+;kHC!)wMv*879GSXT?rji=z2PDN6tqM^! zwx96Koq~(sS2NVjUM-ZHnJh02k0YZl}}?Tl^5;`^P$gd%5Mreuwxp}7-&Lu=6sV%0Q- zcCTQ&O;g*5Cn^x+o%WQNJ-jz$QH$*|r&aLOdj@W4y(?wac*IA-0#Caoi38;rh|)3u zWmFswmh>CCGX9>BT!W=jKjnE*$(~{rdtmNpYOscaB`Rqd57&J3W!4J+fY%((!ZfY3 zEG<)Sv(!1Qus#q|nybg~vo?y}lIfHm$d;2{?O8VQUL6{;iMEOh>fhNjH)2d!?;w{b zGenfr#xl-W7D+<|_?I@Cb;6<;-o; zlF~O^D$Bm95zq55nbNjC=Qq!g#*KCa0I8kkm15#!`drs~AjwZW;o>VL85fVN#(0)O zmx{3&FyP{(%yLP6%_4*!${$TbgW_H<8~S}K^F+mWhI?7`hK2LI&iiiR+)DF@ttv$~ zG}o%H^#v4?g+3Syr1E80YX^{N;4PQ9q}E==6kIXDg^i@84PvW~rSI%z64X_6EKEqz zo33zLD(G{HEM_a-GvXSS4I0qgY?1doEh$-(PASj@1;~+PnK;G3CI(4$l+OJMSx-vOUN_X&6Z^R>&d-Z0^Y+7WsENOW7?UBVb*v}f{H6-(`dV4T6hOlg5 zFf}E9LUtHl(m9=iM)4lqfcF}?50_NtCdo8P>5n{eJKD8O8k!zqaoF_qT_qf8`VF&igMu zZT=+rZ7F-#Km2a_rL6yh{?Fe1?9T3@{hROZe~B(W#QgGUi~;jE-|at`$usg$;zJ&u zzWJMLZ_ZNyHOORJi(M22@*;5kFaI*y7_1W@OAnH^_q494Oen0*YgkjJ(G z5m}}39XQ80sI}C34g`$l51}zi9%3*VC1YHX0orY5wkZ_g)H=t7(oe5BL zzvLJwxwZGiw+3`mFZ8Xbes}IQL>1BaZEX=wq)s+$rDd z@sy{KEWZ70?@#EE%njDRBhxY$(LV(n%`=8h`F~o_rev6az4eeZav;;5u^8rL%yAaR z>C{DW6)VG4!1kih&vbM7e;7t=NVhHQqq){+@#oVZ>z zI~u`)egU+*Drl7EIJDixJ?Cubu!KpPT@M(ZkD>9$It_LusRQp6*pqH@QrV%1DEpj3 zKJS?hg>YY9>jiLe(OUtRE_mrVRv)EHXqo*Cvk%@O16&+DdpP6)rGiGR` z|D+4-qVI1xsNy$3%zk1dKx0|M2d3;i7u1FIqnal`8r5~hrif)sm16Ko9wgxI`D^hJ zO9w{uax7)kX}z$TngtwI9!@&sqS{r6xHsSp4!psEH#qPH2j1Yof5;ptq-Oip@P^en z8m~!x?E!Z8<2~08@vPkJFg0GWs^~anxKq9p&;7z9Mk2`x=CMn|PQrKZ*5lawI{bZO z&PCK>S(P7xbs99luzam^0A0srm)H6mgoYlqe9Bw%$=+$1X!hHZ5q7>n&6;9b{@W<{PK`Mr^Q5wpd!# z^hKq_1Nl--g+U4!+@q#5AwQqY9c)4= zKmboQP=C~nP7Fq?}7I#F@`>%+de(nx+$AA^C^2P zmy4>fg`Z7PHNYa2Jh2AZq+ZtS+NE|m8^lrju^wF1nN6uKYMt1vl(Izz0nPCH%SBJqRDF`6v$UdJGyxUK9CLtUUS!?O zXL&}d+9>rCPk(a->lC&QvspnCxXhz{r^c$wD}3$I;2`GD_(Ox{o$od_>#Sz%{bb$~ z%9|{o^5jexD0nH3{zrlSr|g(E(7{_JLilGF{D3?M;%5#@^^2*wvbro+fRxksz(i7=-*fPiDzx zStspcxuii1dVFd1oesw*dBViUCf3+VY=E&Dj$1=#J8Ys!r*uCJG?c(&C3WJI={OhJ zf_~6Jmu@33c3MBx%sTKBs;X*#^n%(ARrN?%t}#hPH%u6Wtm@|-rLqo! z)^9q=Dv$=q7@pG##rAn_T>fW>i3p>Li>{M=_hcf1Q!_vk+J%xR^{Y3#xG#4Ar6Q}BO2zugvP;u-FOoP+IFDbUi{ z%NjF&%aylWIgPfz4^{W*KKbNNrXc2ETX#Aqk#VQ(@0B#1ZU5of_`z>TcXqGt#h52K zo{hh^+v+%k*VlNstuLKDi--2{>UOL96ZMy62dC00_8$W(su?$P}T@U(nfo)sVd*PDN` zp8w|}PqWkZ*_bBoxPAN6fA?oA#3KbckTQKJd6AXIr*Hn* z`dP_GjV1n1s6XOPBw&wPzAnLY1bpM_H=^G8<(CH@5)2QHj&#qc?iN2h9QN3LQ&ncb zQ*c3Tti6tQaO29{`zSOMoM%L(zI8u>2^eaQ&D9! zufrbiOG0@&J24!P0eeS66!r9dENOyS@y9akPEmayg=h8{ttU3==19hf%FI<_t|^=oZ2`?* z8>2m43jX%wKyY;?Qiqd1U!?5ATr`W+IFAmfL$w2E+@?Xsf^LgYz*H4agO>?n+&LIq zpX};gmN_-xrG`2-O>9TLOnH!X6OGQ*$RfYg#mGEZm`uMSKp89+?djs}5Qe+QCq9Xl zV%i_IlM@FH|G;1>)>v=P)G$r8SWY);JUt{rtJuo3vrxhTeeznS=tgY=sZ14Nb8YG% zP&FevV`FhF(BwQ5`AoB^m^i4d5bGEV71l3U-O^SU!*YZ^R1g!?KT;gsJ0n<%sF+(< zXxcm{77>S}Y>{~&Ju7ot&Y6P@Oiwabv8mdN?JXh`HHXZ;j~t+!O0(Q#h*E2*=4;hi zCI}6zhw)1yk4it1-0#Y#C5=~4C%W6%HIlWgoM-~a24YvadJ|EZDbYK7jzI<(+4-^v zY&ew4!71IftMmr8LG~O2HR&9`_Mn_?#m)v3I5X=&ArnR10cjN$-7u;wHrk&N-z3>k zJsTs{AO)Rfo5@X2W^Q*pC!B6*g|}s<^;kG@$iD$!WybPEaI_eXwZG(MDy& z4jmavQ>OS8mKr=bqklA1AG=vBd1NMipw~~jJ}kP#X+O$h4`&>vtRid}bm<3D%tdCK zz-Cc;LM*XQHYU@&6J0Q9lGR+7oz}W@BLzd-W&?==ft!KsvGi!e7gi6s?$3#rS>D4k zI&jdqJo3+NTy5!)%9hAqFgSCJXD#}$d0dsZx{DVda(-Gm_JJeVFTD3v#?D)U^vE;Y zKvU%DvyhU|+RQl-hoH?^%RW!4uZ6XK<>>|W#94+J-V6B1VX~|@l#8&gPYNzVHnsOC z%$IeoegsUPIkxV?V#E3bqk1oNGh40b>t_H4C&{{^DUB4iMu6|7W)d4{hOlTHQaca% z8k(TMF)$abgD10vr3o_j4a*|1J9eH;i9pU@vuRWxp2dQV*Xv{+mb`a)u4i>mGbG7M zTk8~TmeXpIOj-Ylqi4lh&03^ypjg3@tkO2rTqO}ZTk)*%!sh&JAlMSv#pR-ukhLO8 zp~r5apiAa>T}&AhlV0P`K-RQ%uz>>z#xrrDtW%k?`9Hs&JDvknlY_)E8k9P38WV@_vC*lzD3d8kaT^5D_YU>^%2=GLw4 zt@7K$Tsqrkah|>v&U-4p&gkXdy)0AL5OVeISOCZ1*m!twFV8)&rxzXMM1cE5e4!RnABW2 zOQ@WOEfAHj!gAAi$ zgGzChMQDVP!>f0%-qmxE&pa7-4jT{(FZ9NRC^1;DKSo?3c3d_Crp$wja|5 ziSU6tAGmXP_}F97b9LB{-e1r5Wa1s-&N@wj96dn(^{qO}-XjIFlbMwQO*T@HeX0NM zkj<^_uSW{>-LX%>*eb6@!H~mXUb**Mzjbi%TSxETzCY%7`1eNHc!$Lb%Ju6Z=>B01 z>AySjVEeN_`?EWoXl>1waf%V+v5$UqKm2}fzl*qX@5&XWK;Hx!be4i^KO897q09BJ zeeL?-{#i&EL)HFiDX8cm14P1cs$YMjpV>o1NO|ii7_mD$S{OR^*6LZPfoY@t+J+-q zfA@uvuKOZfkiL5j#&b|z@-x0+|hq8NM zy4pjds0)Y%Y5^KrY76$!t#vRX=4d+t6?Bzct!QFcbwn9T9ValRD>X>dhuUR9I2g5@$_J=ElT?obO()h8 zSM46TDn!Z$wjySs17U&_p@2XQKV7nh3=16%9PJ>nQ|53#4bvoL;3&exJnm!IUHD?K zN4}r#X~d0qJM>6uuO9BSiD05lxaP#DpiI-sy#`nit&_GoE|nSe3ZCs7QD0q9@&DPkO65JrseFXZqd*G*(qbfR@m!V}OA;673v>#&M5nW~$eo9o>qW~}dzBbZ1Ce+SUO|6G|8<$QD)rnmbj7AaPfHyes1_$2Yz#ANR zg9AU21O61o=~o!rLU==sOTsy>0bA#aQ>W$`sPVfqVL#D(y37$>rvfY?@mkgeDAum{ z)5WY4?8c9{dv+iR;b92UH}g-TXi%LD_)I7K@MmM8TA*eJ#Bk@WShg9(5R85(z>I#i z^%6mQGAmLH(prywU-0`e6rq0}Lz!R)-H|$MWj$r_!vr+?WbP1yYBdR)VQK@h-A_Yw zDYV4y)pH(Fhn9d#63MbR%ek+fpRdNXJS+>OjS~WBaErb+skO>ap z3zk#WQN{pdb3-v?*fQ-TtZB$IwxW|^N=m0#C|I^$5z{#J6Xbf;-w z3tB7g88T8~^XQV1#&58r=8T@Hu0hS3)nOWHyU2p|c9Ul`z(jZAqJz61WFc>uvh=)bY6Cy90lftWoe<<;^Vc`rnByES?8eTm4Mn!GsVyNv zC?S1~e$Z`D5>L%)m<6C0O;LL;dGd5oWNKG*`z&d#?j@jO=vI6nfe}vfWEEf#udGdx zFLF|GqnFF8oC|qr+>{1mFitvp0e45Qd4zg$Ph$>y2Hh~7HfU|BEGjY*#STdKiyg37 zPE6a0Q(as`vI0CFR|fh;R1>G@GndnKE`1=xK?4Ig_g-(RhKrVKsCQ`Z*zL#r;y#eg zb?-ARWwMlqvF6A^?E2{5G=pZ+oT!mUq#+|X3cKclAtUc^^m2=_8A-f&1yPTvRb5#5GsF*uX zz_}1z*4L$bwN+uGztOL@uJ=E&3yVwqF?PgI?7uFI6lgyC6sUhF@qQGHDb)UHAnt^% z+J89ijQwfSUW_~DbZqm2;QjUwFUGzw^sdO`j}xQpz^%XN-?`O){W{^WXs4eVF-Q?( zi2Q58n4e~X`?V<8m9v-Pr>7wQ7ndJT{=x*bc`qj1LEHa+|B3eu+P^=$KHRT!*8a`w ze$WbPyy(q54~!x29`?}2oW>l-y|(xtSAF4GxVOD`kE@}SB zcgLPw4W)rl5X*S=E3bYfK7PAICH6iAk3fQ!@ZN)Wj1)ZhpiP> zUyk=1p}4>G-IxCEwZF%XKnJ;O8}^8o78)u3h^{6zGd)Dh(yfcp+-t;kAoZ9>@^=Fo6nzCdn~vQekR)utP@8 ziy&MO=yqYFy@#UJ%N)0^kZ2#SO7T}bG;r&10DG5AqRG1T=$Ks-f@dnjN!U_1qlG>VDwLvq&RoMbm`Z0|QNY*&= zRfC&XU9ZJbNfYnBaedGXUlUp3A-YPIrlR-mU{thKGx0wAE$LR8)0V&PmuOGc`s(=BBx!^Do^ zDXBCFp%%*ObWY-BTjy#Ii$I_OHkx||*Ae>CGAGpRQ|4++Pc^!l>p8U~b5=JkAe}~* zD5v_6>Xupw@lSC%T4zhKzVI!-#8a1cZsBcVf~0MQYuEy=$md`teNwlfHWUpTld>(v zPc2Ch&|A~1%%0Qg-ZtVX1}T^3_f`pxWI#a1iAQ#qHl*!~#0J_wHYrLvr&6(R5KXDU z4hHeoj9yTXuCg|9!LC*4vF*e(FsxTa%=KO0R zjZ0MB=6GCrv&QTG8s%J;bM9Thp>=(!fME#eq~* zPy@=WGIY6~y|q0(M5r<5q}O#nRxFSW%*yF5ODFNjE*R-DUl-UHLaU*(%)xwpAieO6 zk!fD9`oJ^AJwyD#WU;BIN2EQHcJC9fk6HsJ{jusag(TLnOBUwUGdJl$PEOEkP zk^1;hN8f3~beXGJkP&VmEp47qpLqpYb(-25_S3;r{Sj^o%dkbRoC>yZfMSQkr+jCF z)lKE0j-FNvurQ{96Ktb{HLF;rO70g(?_|Sa#C6k4nTv;&+%2U0Glfe~IeJ

4tHc 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 St3Ldn|F`(Qw2pBn`~L-=T`y+< literal 340884 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

_$MF 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ŊXiF@v{r^q0BrbuGLu7s0J0}l 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 literal 0 HcmV?d00001 diff --git a/DSView/res/DSLogicPlus.fw b/DSView/res/DSLogicPlus.fw new file mode 100644 index 0000000000000000000000000000000000000000..69096b44721be68a12dbfca0dffd22bc99d3439c GIT binary patch literal 8120 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 literal 340884 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 vo;v_p2ANc? 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 %D4zz2ZK~{T&I7EkS{;-`W78n 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 diff --git a/DSView/res/DSLogicPro.fw b/DSView/res/DSLogicPro.fw old mode 100755 new mode 100644 index 22924c2b53dfb6deb0b087c9f019ba3f155ad999..dcf0543a67e242c79a249923ef4324071813ca6d GIT binary patch literal 8120 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 diff --git a/DSView/res/license.txt b/DSView/res/license.txt new file mode 100644 index 00000000..8ccdad02 --- /dev/null +++ b/DSView/res/license.txt @@ -0,0 +1,20 @@ +Copyright (c) 2017 DreamSourceLab + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/libsigrok4DSL/session_driver.c b/libsigrok4DSL/session_driver.c index 1288ad12..31d2da5c 100644 --- a/libsigrok4DSL/session_driver.c +++ b/libsigrok4DSL/session_driver.c @@ -211,7 +211,10 @@ static int receive_data(int fd, int revents, const struct sr_dev_inst *cb_sdi) packet.payload = &logic; logic.length = ret; logic.format = (vdev->version == 2) ? LA_SPLIT_DATA : LA_CROSS_DATA; - logic.index = probe->index; + if (probe) + logic.index = probe->index; + else + logic.index = 0; logic.order = vdev->cur_channel; if (vdev->version == 1) { diff --git a/libsigrokdecode4DSL/Makefile.am b/libsigrokdecode4DSL/Makefile.am index 02f76d9e..3141f2f3 100644 --- a/libsigrokdecode4DSL/Makefile.am +++ b/libsigrokdecode4DSL/Makefile.am @@ -28,9 +28,9 @@ AM_CPPFLAGS = -DDECODERS_DIR='"$(DECODERS_DIR)"' # The tests CFLAGS are a superset of the libsigrokdecode CFLAGS. AM_CFLAGS = $(SRD_EXTRA_CFLAGS) $(SRD_WFLAGS) $(TESTS_CFLAGS) -lib_LTLIBRARIES = libsigrokdecode.la +lib_LTLIBRARIES = libsigrokdecode4DSL.la -libsigrokdecode_la_SOURCES = \ +libsigrokdecode4DSL_la_SOURCES = \ srd.c \ session.c \ decoder.c \ @@ -44,15 +44,15 @@ libsigrokdecode_la_SOURCES = \ error.c \ version.c -libsigrokdecode_la_LIBADD = $(SRD_EXTRA_LIBS) $(LIBSIGROKDECODE_LIBS) -libsigrokdecode_la_LDFLAGS = -version-info $(SRD_LIB_VERSION) -no-undefined +libsigrokdecode4DSL_la_LIBADD = $(SRD_EXTRA_LIBS) $(LIBSIGROKDECODE_LIBS) +libsigrokdecode4DSL_la_LDFLAGS = -version-info $(SRD_LIB_VERSION) -no-undefined pkginclude_HEADERS = libsigrokdecode.h nodist_pkginclude_HEADERS = version.h noinst_HEADERS = libsigrokdecode-internal.h pkgconfigdir = $(libdir)/pkgconfig -pkgconfig_DATA = libsigrokdecode.pc +pkgconfig_DATA = libsigrokdecode4DSL.pc EXTRA_DIST = Doxyfile HACKING contrib/sigrok-logo-notext.png @@ -71,7 +71,7 @@ tests_main_SOURCES = \ tests/session.c tests_main_CPPFLAGS = -DDECODERS_DIR='"$(abs_top_srcdir)/decoders"' -tests_main_LDADD = libsigrokdecode.la $(SRD_EXTRA_LIBS) $(TESTS_LIBS) +tests_main_LDADD = libsigrokdecode4DSL.la $(SRD_EXTRA_LIBS) $(TESTS_LIBS) MAINTAINERCLEANFILES = ChangeLog diff --git a/libsigrokdecode4DSL/configure.ac b/libsigrokdecode4DSL/configure.ac index 53e8bc1a..02b2f3a6 100644 --- a/libsigrokdecode4DSL/configure.ac +++ b/libsigrokdecode4DSL/configure.ac @@ -21,9 +21,9 @@ AC_PREREQ([2.63]) # libsigrokdecode package version number (NOT the same as shared lib version!). -AC_INIT([libsigrokdecode], [0.4.0], - [sigrok-devel@lists.sourceforge.net], [libsigrokdecode], - [http://www.sigrok.org]) +AC_INIT([libsigrokdecode4DSL], [0.4.0], + [support@dreamsourcelab.com], [libsigrokdecode4DSL], + [http://www.dreamsourcelab.com]) AC_CONFIG_MACRO_DIR([m4]) AC_CONFIG_AUX_DIR([autostuff]) AC_CONFIG_HEADERS([config.h version.h]) @@ -133,7 +133,7 @@ PKG_CHECK_MODULES([TESTS], [$SRD_PKGLIBS_TESTS glib-2.0 $SRD_PKGLIBS]) srd_glib_version=`$PKG_CONFIG --modversion glib-2.0 2>&AS_MESSAGE_LOG_FD` -AC_CONFIG_FILES([Makefile libsigrokdecode.pc]) +AC_CONFIG_FILES([Makefile libsigrokdecode4DSL.pc]) AC_OUTPUT diff --git a/libsigrokdecode4DSL/decoder.c b/libsigrokdecode4DSL/decoder.c index b3c16da4..27dcbed0 100644 --- a/libsigrokdecode4DSL/decoder.c +++ b/libsigrokdecode4DSL/decoder.c @@ -156,21 +156,21 @@ static void decoder_free(struct srd_decoder *dec) if (!dec) return; - Py_XDECREF(dec->py_dec); - Py_XDECREF(dec->py_mod); + Py_XDECREF(dec->py_dec); + Py_XDECREF(dec->py_mod); - g_slist_free_full(dec->options, &decoder_option_free); - g_slist_free_full(dec->binary, (GDestroyNotify)&g_strfreev); - g_slist_free_full(dec->annotation_rows, &annotation_row_free); - g_slist_free_full(dec->annotations, (GDestroyNotify)&g_strfreev); - g_slist_free_full(dec->opt_channels, &channel_free); - g_slist_free_full(dec->channels, &channel_free); + g_slist_free_full(dec->options, &decoder_option_free); + g_slist_free_full(dec->binary, (GDestroyNotify)&g_strfreev); + g_slist_free_full(dec->annotation_rows, &annotation_row_free); + g_slist_free_full(dec->annotations, (GDestroyNotify)&g_strfreev); + g_slist_free_full(dec->opt_channels, &channel_free); + g_slist_free_full(dec->channels, &channel_free); - g_free(dec->license); - g_free(dec->desc); - g_free(dec->longname); - g_free(dec->name); - g_free(dec->id); + g_free(dec->license); + g_free(dec->desc); + g_free(dec->longname); + g_free(dec->name); + g_free(dec->id); g_free(dec); } @@ -365,7 +365,7 @@ static int get_annotations(struct srd_decoder *dec) char **annpair; ssize_t i; int ann_type = 7; - int j; + unsigned int j; if (!PyObject_HasAttrString(dec->py_dec, "annotations")) return SRD_OK; @@ -636,20 +636,11 @@ SRD_PRIV long srd_decoder_apiver(const struct srd_decoder *d) */ SRD_API int srd_decoder_load(const char *module_name) { - PyObject *py_basedec, *py_method, *py_attr, *py_annlist, *py_ann; - PyObject *py_bin_classes, *py_bin_class, *py_ann_rows, *py_ann_row; - PyObject *py_ann_classes, *py_long; + PyObject *py_basedec; struct srd_decoder *d; long apiver; int is_subclass; const char *fail_txt; - int ret, i, j; - char **ann, **bin, *ann_row_id, *ann_row_desc; - struct srd_channel *pdch; - GSList *l, *ann_classes; - struct srd_decoder_annotation_row *ann_row; - int ann_type = 7; - int ann_len; if (!srd_check_init()) return SRD_ERR; diff --git a/libsigrokdecode4DSL/decoders/0-spi/.pd.py.swo b/libsigrokdecode4DSL/decoders/0-spi/.pd.py.swo deleted file mode 100755 index ee5f13a0770b244b7b9a92ec32397a7e3e2ad6aa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16384 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 diff --git a/libsigrokdecode4DSL/decoders/0-uart/.pd.py.swo b/libsigrokdecode4DSL/decoders/0-uart/.pd.py.swo deleted file mode 100755 index b503d0a555ad0806da09dc0c41b550b261491b42..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32768 zcmeI5d5~mDUB@5CvdAeQf`no&!%|gjP4%${%Uny(O!rR9PIuE?vok}}Hq}+HyKASq zUh&?m>1n`FSU_0`-DQ!GKW3E>BOm}3HN+(X+?C)8l}p&*k_A){6(Kwp3BdL9%Y6Bc zy877V2(1_M?K(2^m%sewFOT0Ze_69KdgJs-^_lNP}Y1CJO`kL>ZtGQLL=8l*bKNx9O{BSv_ zH`f~ONUK(AZEa6{m}4k`p#=I%pdGI6zxJ`tmE&Wh`<`)`deRe5_0Ky@8A@O%fuRJ3 z5*SKgD1o5_h7uS`U?_qAlM)D9k8tj%We){6f`>$SIImZOmFV*&ygnb?8GU{PuO;vV z3P_ntK^{CJ`us57KMho)&%7NzLkSEeFqFVh0z(N5B`}o0Py#~<3?(p>z)%812@ECh zBa%R+<~Vm_qwg1ko%4V30et`Qj`Lyg0q|Pz8gK;M_c+IS7q|udDmV@v3hsWawz;w1S?@OJP9a5Fdnt^&^lUqYrAK^usC@59OR z4)A91+h7Yk4;%xBz}4V8^o8`tpM!yq>Udt3tJiV|RIXL=>*3aNxYcrVMU|_$K~=t< z(_gFPYg>G`eoMfKdmFC~oH`kL*H9Mh^$45saHoR6?_nLt^tnylZ1^rj#VVUzU zgcpRTW@W<_Vb7l#DW6F*d1_+5tU|xi461JZysH{@dLtrVU9U8oZX==ZwZm3Bl+TMf zi3Z9o=?d%3_}hlJRhEYV?3+ zTys)s)t7}XG9+o-sWvJ>ppNUXCqEzfwNmuHaKO<8TBJw07AhO9hAaIu>HD6apS)0Y zb#K_bipO`uw%=5FG(1q3tMP(5d{~WYQf{NZs#4Q}q~zT5ZZmg4r}r&BrjvUV_G(Nu zI&q&mw(eHXsa4Ncd^;j!qq<6_A)2AXC}%S-s#_>kJ)*_(xv^Y9U18ZmbuBqbRVez3 z3&mA6rt<6cwe^D5ZdGrpaNSixNaZWdn*L;(CK(jN!fmWxR*33OwJd7CWTN?|WjzHW zQ$&|svZak!d&uRbuJ6TyIRSqSSGkp7OI0fY-LhKugHYwu{06Gh*sN>?v=a%A3gb05 z?k(?Jlvz*b#gw#)S_VZCR5Bx=5Bs7?PSpdo-1Nd_=r_Dgx27tA(ld?js>~`;qEtI* zlW|L3tL0p<>QwgIuA-qL^oVT;S3Tc%t6@=1RT>OBk5qrN9=Jj%X}% z_FKbku7&H;$u^BCaQ|~P2SrF-&q!>liX|!2sR}(+)e4tK+lormt*AuoMMcLIy6beD zTrP(u?pNj6djjHe7z=JrDqCR7_HXTeH8>F3`R4> z1PDqVX7x2!t@_@E8WknGdTg8t#`La% zrcO~XE5<`D8FEL`qVwHAhKj7-hg#B#BN6|sT8mNsqD@+I<|@^5Zb;hfsq);Z^77o- z@`>3QnSnMce62^OmN_5SRehu7p>(Sa&-06l^|s+eU!{YDWg=s}bew(r_@|~=FJOdq zwWy|>)l!kJlR@4*$M!-k$Rt%?h4_@Ademc_koDw*QlsNzW25`Wt{fdxrxqrJSVeXM z(MT16w0v)k`Qo5VflQ`FwaMOEPeLN6Dc^O~g0~uO63Z;b&w6bYtb6T7O|4fD5tF2B zbeMaYGFw}Arn`RTl)Bz+vZ6QCTziGRi@L$=U!pek&!8vo4bNu@bWw%|>Px*RC+Cly zn3yR~9G$*FrXhyf)O2}fa$!MD&CaU{#egeMA3Jr!#Jrk2H9t4IFj-P+0q$vr5Lju4 z>hv^ybE>Q+X3nb96Z7-XJ9|*ef~}aIX!RJQM;djSM4J(ED2);dT7M#OiSE`Iihdos zWQ`W>bx-E+^@)<5ujEj9Dmr;TR^+95MShrfp`SLqT76aM2&rQziO*(-J;Jeq8Xp}S+s~h?)TvEZoq$8O$m&pg z(|sQ8lMnlOU#huBqT;#_R_m-aqPjAFM@vITn7yd=O^jlZr6czLA7N`3vA@Osmoxi& zvGu(TfsSS6F3Q;2JXS`e=E2EPJo{VU&ZeKQ*bkw0}A{bbiV=K1#Sg5gIOT; z{VaGG_!{-U4ZIkPf`7%{7u&xK7QpZsN?<5~p#+8!7)oF$fuRJ368Q0!fEd*2M|^T6 zuTjGeUlcF#QabU$c;8*YVJvfex(%lvd0nJm;ts#xL$y1kyiK-L#dwo@v~-_Z5CgQ@ z#!-hmb^c76U}x#xY3XnKyw@K15*D#vrIIVGTh->qXwK`pTE4q%bK!i=6vJm}^UG`I zLnotM9op4QP8=eKgtnB$v}?K-LgkB>poB%z@#q@XT<#jG@ ztcwI8Myd9rUq4yazB+|FYa!)0wiU%S7!Q`zv6m_$2c!0xIhMA4jq4DP%${2z-luI_ zLBqM3y~jpqKb2I`Pfn}ioTV?QW4A(@nx8m1Nl(ZbOje~tN?Jmjm3p|0@5xkP8j;LQ zoD1n0qi4^f${qcFdSbe)y(|41g>Gsk*{D?4Iq2%8e7ZgcFs`Mj@~r;bTBEbK#az9K z8-$}Ut$AB=XqZ)LD>M#&RIA<$vZ-d=>A%YxmEatiMz#Ha6KCV|oSTdNFERgO_iut1 zfX9G)vF+aos^I6rm$Bor-Sct*8g4b4&Z|`;52wN_yp(r?*@McUI?BFzRg+wec&Qk1P8(Goadhd zQ{YM9A2_>zFSrOoZ~{CHTmt@?v-}T$SAti7?2{SAfj;ZQH?2FTN0J-^k~YJUfg{Os zTD06FUpI*zWn!T=EZE%9*x8mZo8JtR!L8VF-W_DrS+=Qk2V_zd{9R_34zW*)%-%a- zN5phT*_=Px*8z>zj15RnCG}El+pbi$Zn4HH+l#{TGAAbC^0MBDq|eJE(gP@)90M|> zl6qDB17tq1w4+riJ=|GEd17Os<|zu@$WtzNU@Z<&~hWJ@1NED&p{DYq56dgB=tgO2{_Nc)5- zs*UI@uaH+yC=tcfE^MzHwzk4`IhT|j`~%_8(D^}d$a&KPXAdH~;Vsj>UA@{zW^s@9 z>Om_XvBFR;PIN_Aw(rNmob-~-KsK}-2Jw*SKt5*!>vTY!s9Vf?c1Z6?8d>DFYblMg!H$F@j#%JLq!BgJ(-C-%DVW20VzECFL|?z&pXp<2+UdAo# z-7v*WVDWM3!t~d1^-&Fu)NG%0TN}a3ejWcL{ zCc4t3c6P7UmA>_vSZ9@!SWV=s<2`xRA&R_8n4`2=&i}uU{i&%_24!jaRFC?&tdc53}(PdFan+oehPdOyZ?jW z4sa370l6RWaPS%Y0C#{ja11;Z$Q^-C;RE;`@XO%EK!GQMf5#8-A@D))8t`f$GJ6@m zfK@O93gCWZ`5qv?0R_H}{eK5o1moZ<*#8&1d;nRGK=Mh{_Q86@AtjMR+eOET_ie-_ zur9Xw3B@JQ$mw8YTY5JCwi$8LN?2ZxiXQ|LoxJaon;$&~+jYb)8$c_kYj~EWeb#H7;d*GJw?kL z?!?Y%SuLejajXaUs0oNI45|&rUNnH2BS+HAbh*Nl9f9$NCyRcGnZykX&}*?UN^?wNCZi*o#mtkDR*2f)G#rs7hEeq$10t zlTw!r8;b`8lk+?|&x+i$NISYAu}L(bNs_j$xNA86O;od(t#Y^(_ex~*WDh!eSg-xH zk3IilZb4>hk)&)a^auSWCz>dNkSEdP4wEaR%t`1n+p);<)9Nv@YgS*BC_h@kjk(GSd@6dxyQz zbzh)ouUKaHS%tSfrY=K7iLOgjF#0OWBAU6;rsahEj+WH44W|})=%8;RWVLyg8hN&h zOzF%qw^eLSJ3h!me=;X{DaG#6A2WBsmeC76S*Z~f5pU1A4gL$16g^e z4}mp3QItN%zQlpYl?>1v;mUSbq$`KT=U6cgr0BFve5VEUCzTMdi}8)i)a)o!&G696 zx&&&=9Uy%c{`oarq>CzaG_?@SUO7Rh5h>NbYIXhb((yI7YDk5*~ygse%5 z{eLU=@QbjQ<@}!s*m*xT{wu*N!1KWWJkD`G5B>nW5_q5q4uL0uOTg!`@BbLw0$vM_ zfWzRC;G5X^ZwC_le-k(io(aB!ZT}JQo8UY+1P+470I~PK0PY5Nf!o1Z@C4^HGRtSFT!PBgKsp{zC{$7I$A1+7&MV zTux=*S&*4aGm~rsq>x|XdMK+|_9AmG`9dlPJ&&@RI&#ZKuGz_x0Tzb1vrD;Tiio!# zFSsz;0|kRY86PPRYN42 zROPJ61zI*;(~_Jm+5H~3J3IFo&+ced)-Sol*~B7_c-fbmE1+guZXD$0%wDkPK5%a} zvUN8%RMUGzGm&-g+*2EJ)3|tb>}U%cG2F5R6*ZZeZ{Wtg*OZ*;=iZxev7^l9Tg~#` z+yoZ2U@-9L$voXBW_Gu{AnM)j!LwusT13ene1Ld`OL4b^qG^B2h{QQ#>SSpQC=!Vcb9dOQ|+ENKLufLwU6|;wVv8ccDs4D z7lWQ{qGlt;LTw$k$?A&OG?S|ZrOZ3QSzuN66qKPSL(e&nWZ5$(<|YO~7EQfn&o8blG0L{fj)N+bJJ_ zrCiNz>umaL8XN$GPLz;7T1U5U|g#Gq-s8 z==hl>ahR_-QdS-c8L^u~>ZBfNfgYk?OFqJ`WGF{ zRNjlCRaa3yNAty>z0Vf93Pxzhv?7FcQf3ZF-6(J*hdh1Of=oHt_C<4tDU>+AV*y2@ zR{sE&anI}1=#)cFikhD+ax4{j-D%q;Z})7uUHdcs+RSwoYf5BtbQ%+~Rh1q~9dIOi zvyY#M(!anY-uNOvEzofJfhR8RR~o)sscq3(`(qIN@_~@i@gu1nNTMLjv84*buUX44 zTBlvWoW5RZtkS)xBkCP}NKIRq7txnifm7C5k4--A&VoMwe+f46<=Dw$|L1wRADjQZ zU<*78d>Z@yL*RAbS>U7C^nU~74!}#mbASWx$EN=hxEH(yyb8!Y|4(DjzZv{45Ig^J z@M&!KPk}1YX5*SKgD1o5_ zh7yP+AiJY&AHCg3-^@*y=tvxpB$i@k*XE=%ckj{ufBK%2eWFOGk2ieid^U%nJ8*aJ z%K2=so^S7E+RpjhtTrT`#u%1(TyJ8|oR?J4xasC$u Cl*JJM diff --git a/libsigrokdecode4DSL/decoders/0-uart/.pd.py.swp b/libsigrokdecode4DSL/decoders/0-uart/.pd.py.swp deleted file mode 100755 index 2c1323a8a9a0c497311b18c82b36a2e81a923379..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40960 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 I79A)54{5bCQUCw| diff --git a/libsigrokdecode4DSL/decoders/1-i2c/pd.py b/libsigrokdecode4DSL/decoders/1-i2c/pd.py index 88991edb..dc8c77f8 100755 --- a/libsigrokdecode4DSL/decoders/1-i2c/pd.py +++ b/libsigrokdecode4DSL/decoders/1-i2c/pd.py @@ -79,8 +79,8 @@ class Decoder(srd.Decoder): inputs = ['logic'] outputs = ['i2c'] channels = ( - {'id': 'scl', 'name': 'SCL', 'desc': 'Serial clock line'}, - {'id': 'sda', 'name': 'SDA', 'desc': 'Serial data line'}, + {'id': 'scl', 'type': 8, 'name': 'SCL', 'desc': 'Serial clock line'}, + {'id': 'sda', 'type': 108, 'name': 'SDA', 'desc': 'Serial data line'}, ) options = ( {'id': 'address_format', 'desc': 'Displayed slave address format', @@ -94,7 +94,7 @@ class Decoder(srd.Decoder): ('0', 'nack', 'NACK'), ('12', 'read', 'Read'), ('11', 'write', 'Write'), - ('108', 'bit', 'Data/address bit'), + ('208', 'bit', 'Data/address bit'), ('112', 'address-read', 'Address read'), ('111', 'address-write', 'Address write'), ('110', 'data-read', 'Data read'), diff --git a/libsigrokdecode4DSL/decoders/1-spi/.pd.py.swn b/libsigrokdecode4DSL/decoders/1-spi/.pd.py.swn deleted file mode 100755 index ed1c9a6243c966998561ad16698de37b6ea80c71..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24576 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 P8N48yd-hl{uCxCIl4*4| diff --git a/libsigrokdecode4DSL/decoders/1-spi/.pd.py.swo b/libsigrokdecode4DSL/decoders/1-spi/.pd.py.swo deleted file mode 100755 index ee5f13a0770b244b7b9a92ec32397a7e3e2ad6aa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16384 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 diff --git a/libsigrokdecode4DSL/decoders/1-spi/pd.py b/libsigrokdecode4DSL/decoders/1-spi/pd.py index ec1f29e1..f6dba532 100755 --- a/libsigrokdecode4DSL/decoders/1-spi/pd.py +++ b/libsigrokdecode4DSL/decoders/1-spi/pd.py @@ -88,12 +88,12 @@ class Decoder(srd.Decoder): inputs = ['logic'] outputs = ['spi'] channels = ( - {'id': 'clk', 'name': 'CLK', 'desc': 'Clock'}, + {'id': 'clk', 'type': 0, 'name': 'CLK', 'desc': 'Clock'}, ) optional_channels = ( - {'id': 'miso', 'name': 'MISO', 'desc': 'Master in, slave out'}, - {'id': 'mosi', 'name': 'MOSI', 'desc': 'Master out, slave in'}, - {'id': 'cs', 'name': 'CS#', 'desc': 'Chip-select'}, + {'id': 'miso', 'type': 107, 'name': 'MISO', 'desc': 'Master in, slave out'}, + {'id': 'mosi', 'type': 109, 'name': 'MOSI', 'desc': 'Master out, slave in'}, + {'id': 'cs', 'type': -1, 'name': 'CS#', 'desc': 'Chip-select'}, ) options = ( {'id': 'cs_polarity', 'desc': 'CS# polarity', 'default': 'active-low', @@ -109,8 +109,8 @@ class Decoder(srd.Decoder): annotations = ( ('106', 'miso-data', 'MISO data'), ('108', 'mosi-data', 'MOSI data'), - ('107', 'miso-bits', 'MISO bits'), - ('109', 'mosi-bits', 'MOSI bits'), + ('207', 'miso-bits', 'MISO bits'), + ('209', 'mosi-bits', 'MOSI bits'), ('1000', 'warnings', 'Human-readable warnings'), ) annotation_rows = ( diff --git a/libsigrokdecode4DSL/decoders/1-uart/.pd.py.swo b/libsigrokdecode4DSL/decoders/1-uart/.pd.py.swo deleted file mode 100755 index b503d0a555ad0806da09dc0c41b550b261491b42..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32768 zcmeI5d5~mDUB@5CvdAeQf`no&!%|gjP4%${%Uny(O!rR9PIuE?vok}}Hq}+HyKASq zUh&?m>1n`FSU_0`-DQ!GKW3E>BOm}3HN+(X+?C)8l}p&*k_A){6(Kwp3BdL9%Y6Bc zy877V2(1_M?K(2^m%sewFOT0Ze_69KdgJs-^_lNP}Y1CJO`kL>ZtGQLL=8l*bKNx9O{BSv_ zH`f~ONUK(AZEa6{m}4k`p#=I%pdGI6zxJ`tmE&Wh`<`)`deRe5_0Ky@8A@O%fuRJ3 z5*SKgD1o5_h7uS`U?_qAlM)D9k8tj%We){6f`>$SIImZOmFV*&ygnb?8GU{PuO;vV z3P_ntK^{CJ`us57KMho)&%7NzLkSEeFqFVh0z(N5B`}o0Py#~<3?(p>z)%812@ECh zBa%R+<~Vm_qwg1ko%4V30et`Qj`Lyg0q|Pz8gK;M_c+IS7q|udDmV@v3hsWawz;w1S?@OJP9a5Fdnt^&^lUqYrAK^usC@59OR z4)A91+h7Yk4;%xBz}4V8^o8`tpM!yq>Udt3tJiV|RIXL=>*3aNxYcrVMU|_$K~=t< z(_gFPYg>G`eoMfKdmFC~oH`kL*H9Mh^$45saHoR6?_nLt^tnylZ1^rj#VVUzU zgcpRTW@W<_Vb7l#DW6F*d1_+5tU|xi461JZysH{@dLtrVU9U8oZX==ZwZm3Bl+TMf zi3Z9o=?d%3_}hlJRhEYV?3+ zTys)s)t7}XG9+o-sWvJ>ppNUXCqEzfwNmuHaKO<8TBJw07AhO9hAaIu>HD6apS)0Y zb#K_bipO`uw%=5FG(1q3tMP(5d{~WYQf{NZs#4Q}q~zT5ZZmg4r}r&BrjvUV_G(Nu zI&q&mw(eHXsa4Ncd^;j!qq<6_A)2AXC}%S-s#_>kJ)*_(xv^Y9U18ZmbuBqbRVez3 z3&mA6rt<6cwe^D5ZdGrpaNSixNaZWdn*L;(CK(jN!fmWxR*33OwJd7CWTN?|WjzHW zQ$&|svZak!d&uRbuJ6TyIRSqSSGkp7OI0fY-LhKugHYwu{06Gh*sN>?v=a%A3gb05 z?k(?Jlvz*b#gw#)S_VZCR5Bx=5Bs7?PSpdo-1Nd_=r_Dgx27tA(ld?js>~`;qEtI* zlW|L3tL0p<>QwgIuA-qL^oVT;S3Tc%t6@=1RT>OBk5qrN9=Jj%X}% z_FKbku7&H;$u^BCaQ|~P2SrF-&q!>liX|!2sR}(+)e4tK+lormt*AuoMMcLIy6beD zTrP(u?pNj6djjHe7z=JrDqCR7_HXTeH8>F3`R4> z1PDqVX7x2!t@_@E8WknGdTg8t#`La% zrcO~XE5<`D8FEL`qVwHAhKj7-hg#B#BN6|sT8mNsqD@+I<|@^5Zb;hfsq);Z^77o- z@`>3QnSnMce62^OmN_5SRehu7p>(Sa&-06l^|s+eU!{YDWg=s}bew(r_@|~=FJOdq zwWy|>)l!kJlR@4*$M!-k$Rt%?h4_@Ademc_koDw*QlsNzW25`Wt{fdxrxqrJSVeXM z(MT16w0v)k`Qo5VflQ`FwaMOEPeLN6Dc^O~g0~uO63Z;b&w6bYtb6T7O|4fD5tF2B zbeMaYGFw}Arn`RTl)Bz+vZ6QCTziGRi@L$=U!pek&!8vo4bNu@bWw%|>Px*RC+Cly zn3yR~9G$*FrXhyf)O2}fa$!MD&CaU{#egeMA3Jr!#Jrk2H9t4IFj-P+0q$vr5Lju4 z>hv^ybE>Q+X3nb96Z7-XJ9|*ef~}aIX!RJQM;djSM4J(ED2);dT7M#OiSE`Iihdos zWQ`W>bx-E+^@)<5ujEj9Dmr;TR^+95MShrfp`SLqT76aM2&rQziO*(-J;Jeq8Xp}S+s~h?)TvEZoq$8O$m&pg z(|sQ8lMnlOU#huBqT;#_R_m-aqPjAFM@vITn7yd=O^jlZr6czLA7N`3vA@Osmoxi& zvGu(TfsSS6F3Q;2JXS`e=E2EPJo{VU&ZeKQ*bkw0}A{bbiV=K1#Sg5gIOT; z{VaGG_!{-U4ZIkPf`7%{7u&xK7QpZsN?<5~p#+8!7)oF$fuRJ368Q0!fEd*2M|^T6 zuTjGeUlcF#QabU$c;8*YVJvfex(%lvd0nJm;ts#xL$y1kyiK-L#dwo@v~-_Z5CgQ@ z#!-hmb^c76U}x#xY3XnKyw@K15*D#vrIIVGTh->qXwK`pTE4q%bK!i=6vJm}^UG`I zLnotM9op4QP8=eKgtnB$v}?K-LgkB>poB%z@#q@XT<#jG@ ztcwI8Myd9rUq4yazB+|FYa!)0wiU%S7!Q`zv6m_$2c!0xIhMA4jq4DP%${2z-luI_ zLBqM3y~jpqKb2I`Pfn}ioTV?QW4A(@nx8m1Nl(ZbOje~tN?Jmjm3p|0@5xkP8j;LQ zoD1n0qi4^f${qcFdSbe)y(|41g>Gsk*{D?4Iq2%8e7ZgcFs`Mj@~r;bTBEbK#az9K z8-$}Ut$AB=XqZ)LD>M#&RIA<$vZ-d=>A%YxmEatiMz#Ha6KCV|oSTdNFERgO_iut1 zfX9G)vF+aos^I6rm$Bor-Sct*8g4b4&Z|`;52wN_yp(r?*@McUI?BFzRg+wec&Qk1P8(Goadhd zQ{YM9A2_>zFSrOoZ~{CHTmt@?v-}T$SAti7?2{SAfj;ZQH?2FTN0J-^k~YJUfg{Os zTD06FUpI*zWn!T=EZE%9*x8mZo8JtR!L8VF-W_DrS+=Qk2V_zd{9R_34zW*)%-%a- zN5phT*_=Px*8z>zj15RnCG}El+pbi$Zn4HH+l#{TGAAbC^0MBDq|eJE(gP@)90M|> zl6qDB17tq1w4+riJ=|GEd17Os<|zu@$WtzNU@Z<&~hWJ@1NED&p{DYq56dgB=tgO2{_Nc)5- zs*UI@uaH+yC=tcfE^MzHwzk4`IhT|j`~%_8(D^}d$a&KPXAdH~;Vsj>UA@{zW^s@9 z>Om_XvBFR;PIN_Aw(rNmob-~-KsK}-2Jw*SKt5*!>vTY!s9Vf?c1Z6?8d>DFYblMg!H$F@j#%JLq!BgJ(-C-%DVW20VzECFL|?z&pXp<2+UdAo# z-7v*WVDWM3!t~d1^-&Fu)NG%0TN}a3ejWcL{ zCc4t3c6P7UmA>_vSZ9@!SWV=s<2`xRA&R_8n4`2=&i}uU{i&%_24!jaRFC?&tdc53}(PdFan+oehPdOyZ?jW z4sa370l6RWaPS%Y0C#{ja11;Z$Q^-C;RE;`@XO%EK!GQMf5#8-A@D))8t`f$GJ6@m zfK@O93gCWZ`5qv?0R_H}{eK5o1moZ<*#8&1d;nRGK=Mh{_Q86@AtjMR+eOET_ie-_ zur9Xw3B@JQ$mw8YTY5JCwi$8LN?2ZxiXQ|LoxJaon;$&~+jYb)8$c_kYj~EWeb#H7;d*GJw?kL z?!?Y%SuLejajXaUs0oNI45|&rUNnH2BS+HAbh*Nl9f9$NCyRcGnZykX&}*?UN^?wNCZi*o#mtkDR*2f)G#rs7hEeq$10t zlTw!r8;b`8lk+?|&x+i$NISYAu}L(bNs_j$xNA86O;od(t#Y^(_ex~*WDh!eSg-xH zk3IilZb4>hk)&)a^auSWCz>dNkSEdP4wEaR%t`1n+p);<)9Nv@YgS*BC_h@kjk(GSd@6dxyQz zbzh)ouUKaHS%tSfrY=K7iLOgjF#0OWBAU6;rsahEj+WH44W|})=%8;RWVLyg8hN&h zOzF%qw^eLSJ3h!me=;X{DaG#6A2WBsmeC76S*Z~f5pU1A4gL$16g^e z4}mp3QItN%zQlpYl?>1v;mUSbq$`KT=U6cgr0BFve5VEUCzTMdi}8)i)a)o!&G696 zx&&&=9Uy%c{`oarq>CzaG_?@SUO7Rh5h>NbYIXhb((yI7YDk5*~ygse%5 z{eLU=@QbjQ<@}!s*m*xT{wu*N!1KWWJkD`G5B>nW5_q5q4uL0uOTg!`@BbLw0$vM_ zfWzRC;G5X^ZwC_le-k(io(aB!ZT}JQo8UY+1P+470I~PK0PY5Nf!o1Z@C4^HGRtSFT!PBgKsp{zC{$7I$A1+7&MV zTux=*S&*4aGm~rsq>x|XdMK+|_9AmG`9dlPJ&&@RI&#ZKuGz_x0Tzb1vrD;Tiio!# zFSsz;0|kRY86PPRYN42 zROPJ61zI*;(~_Jm+5H~3J3IFo&+ced)-Sol*~B7_c-fbmE1+guZXD$0%wDkPK5%a} zvUN8%RMUGzGm&-g+*2EJ)3|tb>}U%cG2F5R6*ZZeZ{Wtg*OZ*;=iZxev7^l9Tg~#` z+yoZ2U@-9L$voXBW_Gu{AnM)j!LwusT13ene1Ld`OL4b^qG^B2h{QQ#>SSpQC=!Vcb9dOQ|+ENKLufLwU6|;wVv8ccDs4D z7lWQ{qGlt;LTw$k$?A&OG?S|ZrOZ3QSzuN66qKPSL(e&nWZ5$(<|YO~7EQfn&o8blG0L{fj)N+bJJ_ zrCiNz>umaL8XN$GPLz;7T1U5U|g#Gq-s8 z==hl>ahR_-QdS-c8L^u~>ZBfNfgYk?OFqJ`WGF{ zRNjlCRaa3yNAty>z0Vf93Pxzhv?7FcQf3ZF-6(J*hdh1Of=oHt_C<4tDU>+AV*y2@ zR{sE&anI}1=#)cFikhD+ax4{j-D%q;Z})7uUHdcs+RSwoYf5BtbQ%+~Rh1q~9dIOi zvyY#M(!anY-uNOvEzofJfhR8RR~o)sscq3(`(qIN@_~@i@gu1nNTMLjv84*buUX44 zTBlvWoW5RZtkS)xBkCP}NKIRq7txnifm7C5k4--A&VoMwe+f46<=Dw$|L1wRADjQZ zU<*78d>Z@yL*RAbS>U7C^nU~74!}#mbASWx$EN=hxEH(yyb8!Y|4(DjzZv{45Ig^J z@M&!KPk}1YX5*SKgD1o5_ zh7yP+AiJY&AHCg3-^@*y=tvxpB$i@k*XE=%ckj{ufBK%2eWFOGk2ieid^U%nJ8*aJ z%K2=so^S7E+RpjhtTrT`#u%1(TyJ8|oR?J4xasC$u Cl*JJM diff --git a/libsigrokdecode4DSL/decoders/1-uart/.pd.py.swp b/libsigrokdecode4DSL/decoders/1-uart/.pd.py.swp deleted file mode 100755 index 2c1323a8a9a0c497311b18c82b36a2e81a923379..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40960 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 ## +## Version: +## Modified by Shiqiu Nie(369614718@qq.com) +## Date: 2017-01-11 +## Descript: +## 1. 2017-01-10 Fixed TDI/TDO data decode, when JTAG TAP run into +## SHIFT-IR/SHIFT-DR status,the first bit is not a valid bit. +## 2. 2017-01-11 Fixed decode when shift only one bit. +## ## This program is free software; you can redistribute it and/or modify ## it under the terms of the GNU General Public License as published by ## the Free Software Foundation; either version 2 of the License, or @@ -22,10 +30,8 @@ import sigrokdecode as srd ''' OUTPUT_PYTHON format: - Packet: [, ] - : - 'NEW STATE': is the new state of the JTAG state machine. Valid values: 'TEST-LOGIC-RESET', 'RUN-TEST/IDLE', 'SELECT-DR-SCAN', @@ -36,7 +42,6 @@ Packet: - 'IR TDO': Bitstring that was clocked out of the IR register. - 'DR TDI': Bitstring that was clocked into the DR register. - 'DR TDO': Bitstring that was clocked out of the DR register. - All bitstrings are a list consisting of two items. The first is a sequence of '1' and '0' characters (the right-most character is the LSB. Example: '01110001', where 1 is the LSB). The second item is a list of ss/es values @@ -104,6 +109,8 @@ class Decoder(srd.Decoder): self.saved_item = None self.first = True self.first_bit = True + self.bits_cnt = 0 + self.data_ready = False def start(self): self.out_python = self.register(srd.OUTPUT_PYTHON) @@ -179,55 +186,96 @@ class Decoder(srd.Decoder): # Upon SHIFT-IR/SHIFT-DR collect the current TDI/TDO values. if self.state.startswith('SHIFT-'): - if self.first_bit: - self.ss_bitstring = self.samplenum - self.first_bit = False - else: - self.putx([16, [str(self.bits_tdi[0])]]) - self.putx([17, [str(self.bits_tdo[0])]]) - # Use self.samplenum as ES of the previous bit. - self.bits_samplenums_tdi[0][1] = self.samplenum - self.bits_samplenums_tdo[0][1] = self.samplenum - - self.bits_tdi.insert(0, tdi) - self.bits_tdo.insert(0, tdo) + #if self.first_bit: + #self.ss_bitstring = self.samplenum + # self.first_bit = False + + #else: + if self.bits_cnt > 0: + if self.bits_cnt == 1: + self.ss_bitstring = self.samplenum + if self.bits_cnt > 1: + self.putx([16, [str(self.bits_tdi[0])]]) + self.putx([17, [str(self.bits_tdo[0])]]) + # Use self.samplenum as ES of the previous bit. + self.bits_samplenums_tdi[0][1] = self.samplenum + self.bits_samplenums_tdo[0][1] = self.samplenum + + self.bits_tdi.insert(0, tdi) + self.bits_tdo.insert(0, tdo) + # Use self.samplenum as SS of the current bit. self.bits_samplenums_tdi.insert(0, [self.samplenum, -1]) self.bits_samplenums_tdo.insert(0, [self.samplenum, -1]) + + self.bits_cnt = self.bits_cnt + 1 # Output all TDI/TDO bits if we just switched from SHIFT-* to EXIT1-*. if self.oldstate.startswith('SHIFT-') and \ self.state.startswith('EXIT1-'): - - self.es_bitstring = self.samplenum - - t = self.state[-2:] + ' TDI' - b = ''.join(map(str, self.bits_tdi)) - h = ' (0x%x' % int('0b' + b, 2) + ')' - s = t + ': ' + b + h + ', ' + str(len(self.bits_tdi)) + ' bits' - self.putx_bs([18, [s]]) - self.bits_samplenums_tdi[0][1] = self.samplenum # ES of last bit. - self.putp_bs([t, [b, self.bits_samplenums_tdi]]) - self.putx([16, [str(self.bits_tdi[0])]]) # Last bit. - self.bits_tdi = [] - self.bits_samplenums_tdi = [] - - t = self.state[-2:] + ' TDO' - b = ''.join(map(str, self.bits_tdo)) - h = ' (0x%x' % int('0b' + b, 2) + ')' - s = t + ': ' + b + h + ', ' + str(len(self.bits_tdo)) + ' bits' - self.putx_bs([19, [s]]) - self.bits_samplenums_tdo[0][1] = self.samplenum # ES of last bit. - self.putp_bs([t, [b, self.bits_samplenums_tdo]]) - self.putx([17, [str(self.bits_tdo[0])]]) # Last bit. - self.bits_tdo = [] - self.bits_samplenums_tdo = [] + + #self.es_bitstring = self.samplenum + if self.bits_cnt > 0: + if self.bits_cnt == 1: # Only shift one bit + self.ss_bitstring = self.samplenum + self.bits_tdi.insert(0, tdi) + self.bits_tdo.insert(0, tdo) + ## Use self.samplenum as SS of the current bit. + self.bits_samplenums_tdi.insert(0, [self.samplenum, -1]) + self.bits_samplenums_tdo.insert(0, [self.samplenum, -1]) + else: + ### ---------------------------------------------------------------- + self.putx([16, [str(self.bits_tdi[0])]]) + self.putx([17, [str(self.bits_tdo[0])]]) + ### Use self.samplenum as ES of the previous bit. + self.bits_samplenums_tdi[0][1] = self.samplenum + self.bits_samplenums_tdo[0][1] = self.samplenum + + self.bits_tdi.insert(0, tdi) + self.bits_tdo.insert(0, tdo) + + ## Use self.samplenum as SS of the current bit. + self.bits_samplenums_tdi.insert(0, [self.samplenum, -1]) + self.bits_samplenums_tdo.insert(0, [self.samplenum, -1]) + ## ---------------------------------------------------------------- + + self.data_ready = True self.first_bit = True + self.bits_cnt = 0 + if self.oldstate.startswith('EXIT'):# and \ + #self.state.startswith('PAUSE-'): + if self.data_ready: + self.data_ready = False + self.es_bitstring = self.samplenum + t = self.state[-2:] + ' TDI' + b = ''.join(map(str, self.bits_tdi)) + h = ' (0x%X' % int('0b' + b, 2) + ')' + s = t + ': ' + h + ', ' + str(len(self.bits_tdi)) + ' bits' #b + + self.putx_bs([18, [s]]) + self.bits_samplenums_tdi[0][1] = self.samplenum # ES of last bit. + self.putp_bs([t, [b, self.bits_samplenums_tdi]]) + self.putx([16, [str(self.bits_tdi[0])]]) # Last bit. + self.bits_tdi = [] + self.bits_samplenums_tdi = [] - self.ss_bitstring = self.samplenum + t = self.state[-2:] + ' TDO' + b = ''.join(map(str, self.bits_tdo)) + h = ' (0x%X' % int('0b' + b, 2) + ')' + s = t + ': ' + h + ', ' + str(len(self.bits_tdo)) + ' bits' #+ b + self.putx_bs([19, [s]]) + self.bits_samplenums_tdo[0][1] = self.samplenum # ES of last bit. + self.putp_bs([t, [b, self.bits_samplenums_tdo]]) + self.putx([17, [str(self.bits_tdo[0])]]) # Last bit. + self.bits_tdo = [] + self.bits_samplenums_tdo = [] + #self.first_bit = True + #self.bits_cnt = 0 + + #self.ss_bitstring = self.samplenum + self.ss_item = self.samplenum def decode(self, ss, es, data): diff --git a/libsigrokdecode4DSL/decoders/lpc/pd.py b/libsigrokdecode4DSL/decoders/lpc/pd.py index 0f055ce5..7bb2fdd8 100755 --- a/libsigrokdecode4DSL/decoders/lpc/pd.py +++ b/libsigrokdecode4DSL/decoders/lpc/pd.py @@ -46,13 +46,21 @@ fields = { # Neither host nor peripheral are allowed to drive 0b11x0. 'CT_DR': { 0b0000: 'I/O read', + 0b0001: 'I/O read', 0b0010: 'I/O write', + 0b0011: 'I/O write', 0b0100: 'Memory read', + 0b0101: 'Memory read', 0b0110: 'Memory write', + 0b0111: 'Memory write', 0b1000: 'DMA read', + 0b1001: 'DMA read', 0b1010: 'DMA write', + 0b1011: 'DMA write', 0b1100: 'Reserved / not allowed', + 0b1101: 'Reserved / not allowed', 0b1110: 'Reserved / not allowed', + 0b1111: 'Reserved / not allowed', }, # SIZE field (determines how many bytes are to be transferred) # Bits[3:2] are reserved, must be driven to 0b00. @@ -128,26 +136,32 @@ class Decoder(srd.Decoder): ('addr', 'Address'), ('tar1', 'Turn-around cycle 1'), ('sync', 'Sync'), + ('timeout', 'Time Out'), ('data', 'Data'), ('tar2', 'Turn-around cycle 2'), ) annotation_rows = ( - ('data', 'Data', (1, 2, 3, 4, 5, 6, 7)), + ('data', 'Data', (1, 2, 3, 4, 5, 6, 7, 8)), ('warnings', 'Warnings', (0,)), ) def __init__(self): self.state = 'IDLE' self.oldlclk = -1 + self.oldlframe = -1 + self.oldlad = -1 + self.oldlad_bits = -1 self.samplenum = 0 self.clocknum = 0 self.lad = -1 self.addr = 0 self.cur_nibble = 0 + self.start_type = -1 self.cycle_type = -1 self.databyte = 0 self.tarcount = 0 self.synccount = 0 + self.timeoutcount = 0 self.oldpins = None self.ss_block = self.es_block = None @@ -157,38 +171,42 @@ class Decoder(srd.Decoder): def putb(self, data): self.put(self.ss_block, self.es_block, self.out_ann, data) - def handle_get_start(self, lad, lad_bits, lframe): + def handle_get_start(self, lframe): # LAD[3:0]: START field (1 clock cycle). + self.start_type = fields['START'][self.oldlad] # The last value of LAD[3:0] before LFRAME# gets de-asserted is what # the peripherals must use. However, the host can keep LFRAME# asserted # multiple clocks, and we output all START fields that occur, even # though the peripherals are supposed to ignore all but the last one. self.es_block = self.samplenum - self.putb([1, [fields['START'][lad], 'START', 'St', 'S']]) + self.putb([1, [self.start_type, 'START', 'St', 'S']]) self.ss_block = self.samplenum # Output a warning if LAD[3:0] changes while LFRAME# is low. # TODO - if (self.lad != -1 and self.lad != lad): - self.putb([0, ['LAD[3:0] changed while LFRAME# was asserted']]) + #if (self.lad != -1 and self.lad != lad): + # self.putb([0, ['LAD[3:0] changed while LFRAME# was asserted']]) # LFRAME# is asserted (low). Wait until it gets de-asserted again # (the host is allowed to keep it asserted multiple clocks). if lframe != 1: return - self.start_field = self.lad - self.state = 'GET CT/DR' + if (self.oldlad == 0b0000): + self.start_field = self.oldlad + self.state = 'GET CT/DR' + else: + self.state = 'IDLE' - def handle_get_ct_dr(self, lad, lad_bits): + def handle_get_ct_dr(self): # LAD[3:0]: Cycle type / direction field (1 clock cycle). - self.cycle_type = fields['CT_DR'][lad] + self.cycle_type = fields['CT_DR'][self.oldlad] # TODO: Warning/error on invalid cycle types. if self.cycle_type == 'Reserved': - self.putb([0, ['Invalid cycle type (%s)' % lad_bits]]) + self.putb([0, ['Invalid cycle type (%s)' % self.oldlad_bits]]) self.es_block = self.samplenum self.putb([2, ['Cycle type: %s' % self.cycle_type]]) @@ -198,7 +216,7 @@ class Decoder(srd.Decoder): self.addr = 0 self.cur_nibble = 0 - def handle_get_addr(self, lad, lad_bits): + def handle_get_addr(self): # LAD[3:0]: ADDR field (4/8/0 clock cycles). # I/O cycles: 4 ADDR clocks. Memory cycles: 8 ADDR clocks. @@ -212,7 +230,7 @@ class Decoder(srd.Decoder): # Addresses are driven MSN-first. offset = ((addr_nibbles - 1) - self.cur_nibble) * 4 - self.addr |= (lad << offset) + self.addr |= (self.oldlad << offset) # Continue if we haven't seen all ADDR cycles, yet. if (self.cur_nibble < addr_nibbles - 1): @@ -227,20 +245,20 @@ class Decoder(srd.Decoder): self.state = 'GET TAR' self.tar_count = 0 - def handle_get_tar(self, lad, lad_bits): + def handle_get_tar(self): # LAD[3:0]: First TAR (turn-around) field (2 clock cycles). self.es_block = self.samplenum - self.putb([4, ['TAR, cycle %d: %s' % (self.tarcount, lad_bits)]]) - self.ss_block = self.samplenum + self.putb([4, ['TAR, cycle %d: %s' % (self.tarcount, self.oldlad_bits)]]) # On the first TAR clock cycle LAD[3:0] is driven to 1111 by # either the host or peripheral. On the second clock cycle, # the host or peripheral tri-states LAD[3:0], but its value # should still be 1111, due to pull-ups on the LAD lines. - if lad_bits != '1111': + if self.oldlad_bits != '1111': self.putb([0, ['TAR, cycle %d: %s (expected 1111)' % \ - (self.tarcount, lad_bits)]]) + (self.tarcount, self.oldlad_bits)]]) + self.ss_block = self.samplenum if (self.tarcount != 1): self.tarcount += 1 @@ -249,34 +267,57 @@ class Decoder(srd.Decoder): self.tarcount = 0 self.state = 'GET SYNC' - def handle_get_sync(self, lad, lad_bits): + def handle_get_sync(self, lframe): # LAD[3:0]: SYNC field (1-n clock cycles). - self.sync_val = lad_bits - self.cycle_type = fields['SYNC'][lad] + self.sync_val = self.oldlad_bits + self.cycle_type = fields['SYNC'][self.oldlad] + self.es_block = self.samplenum # TODO: Warnings if reserved value are seen? if self.cycle_type == 'Reserved': self.putb([0, ['SYNC, cycle %d: %s (reserved value)' % \ (self.synccount, self.sync_val)]]) - self.es_block = self.samplenum self.putb([5, ['SYNC, cycle %d: %s' % (self.synccount, self.sync_val)]]) self.ss_block = self.samplenum # TODO self.cycle_count = 0 - self.state = 'GET DATA' + if (lframe == 0): + self.state = 'GET TIMEOUT' + else: + self.state = 'GET DATA' - def handle_get_data(self, lad, lad_bits): + def handle_get_timeout(self): + # LFRAME#: tie low (4 clock cycles). + + if (self.oldlframe != 0): + self.putb([0, ['TIMEOUT cycle, LFRAME# must be low for 4 LCLk cycles']]) + self.timeoutcount = 0 + self.state = 'IDLE' + return + + self.es_block = self.samplenum + self.putb([6, ['Timeout %d' % self.timeoutcount]]) + self.ss_block = self.samplenum + + if (self.timeoutcount != 3): + self.timeoutcount += 1 + return + + self.timeoutcount = 0 + self.state = 'IDLE' + + def handle_get_data(self): # LAD[3:0]: DATA field (2 clock cycles). # Data is driven LSN-first. if (self.cycle_count == 0): - self.databyte = lad + self.databyte = self.oldlad elif (self.cycle_count == 1): - self.databyte |= (lad << 4) + self.databyte |= (self.oldlad << 4) else: raise Exception('Invalid cycle_count: %d' % self.cycle_count) @@ -285,26 +326,26 @@ class Decoder(srd.Decoder): return self.es_block = self.samplenum - self.putb([6, ['DATA: 0x%02x' % self.databyte]]) + self.putb([7, ['DATA: 0x%02x' % self.databyte]]) self.ss_block = self.samplenum self.cycle_count = 0 self.state = 'GET TAR2' - def handle_get_tar2(self, lad, lad_bits): + def handle_get_tar2(self): # LAD[3:0]: Second TAR field (2 clock cycles). self.es_block = self.samplenum - self.putb([7, ['TAR, cycle %d: %s' % (self.tarcount, lad_bits)]]) + self.putb([8, ['TAR, cycle %d: %s' % (self.tarcount, self.oldlad_bits)]]) self.ss_block = self.samplenum # On the first TAR clock cycle LAD[3:0] is driven to 1111 by # either the host or peripheral. On the second clock cycle, # the host or peripheral tri-states LAD[3:0], but its value # should still be 1111, due to pull-ups on the LAD lines. - if lad_bits != '1111': + if self.oldlad_bits != '1111': self.putb([0, ['Warning: TAR, cycle %d: %s (expected 1111)' - % (self.tarcount, lad_bits)]]) + % (self.tarcount, self.oldlad_bits)]]) if (self.tarcount != 1): self.tarcount += 1 @@ -313,15 +354,8 @@ class Decoder(srd.Decoder): self.tarcount = 0 self.state = 'IDLE' - def decode(self, ss, es, data): - for (self.samplenum, pins) in data: - data.itercnt += 1 - # If none of the pins changed, there's nothing to do. - if self.oldpins == pins: - continue - - # Store current pin values for the next round. - self.oldpins = pins + def decode(self, ss, es, logic): + for (self.samplenum, pins) in logic: # Get individual pin values into local variables. (lframe, lclk, lad0, lad1, lad2, lad3) = pins[:6] @@ -329,40 +363,63 @@ class Decoder(srd.Decoder): # Only look at the signals upon rising LCLK edges. The LPC clock # is the same as the PCI clock (which is sampled at rising edges). - if not (self.oldlclk == 0 and lclk == 1): - self.oldlclk = lclk - continue + logic.logic_mask = 0b0000000000010 + logic.exp_logic = 0b0000000000010 + logic.edge_index = 1 + logic.cur_pos = self.samplenum + #if not (self.oldlclk == 0 and lclk == 1): + # continue # Store LAD[3:0] bit values (one nibble) in local variables. # Most (but not all) states need this. - if self.state != 'IDLE': - lad = (lad3 << 3) | (lad2 << 2) | (lad1 << 1) | lad0 - lad_bits = bin(lad)[2:].zfill(4) - # self.putb([0, ['LAD: %s' % lad_bits]]) + lad = (lad3 << 3) | (lad2 << 2) | (lad1 << 1) | lad0 + lad_bits = bin(lad)[2:].zfill(4) + # self.putb([0, ['LAD: %s' % lad_bits]]) # TODO: Only memory read/write is currently supported/tested. # State machine if self.state == 'IDLE': # A valid LPC cycle starts with LFRAME# being asserted (low). - if lframe != 0: - continue - self.ss_block = self.samplenum - self.state = 'GET START' - self.lad = -1 - # self.clocknum = 0 + #if lframe != 0: + # continue + if (lframe == 0): + if (self.oldlclk == 0 and lclk == 1): + self.ss_block = self.samplenum + self.state = 'GET START' + self.lad = -1 + # self.clocknum = 0 + else: + logic.logic_mask = 0b0000000000001 + logic.exp_logic = 0b0000000000000 + logic.edge_index = 0 elif self.state == 'GET START': - self.handle_get_start(lad, lad_bits, lframe) + self.handle_get_start(lframe) elif self.state == 'GET CT/DR': - self.handle_get_ct_dr(lad, lad_bits) + self.handle_get_ct_dr() elif self.state == 'GET ADDR': - self.handle_get_addr(lad, lad_bits) + self.handle_get_addr() elif self.state == 'GET TAR': - self.handle_get_tar(lad, lad_bits) + self.handle_get_tar() elif self.state == 'GET SYNC': - self.handle_get_sync(lad, lad_bits) + self.handle_get_sync(lframe) + elif self.state == 'GET TIMEOUT': + self.handle_get_timeout() elif self.state == 'GET DATA': - self.handle_get_data(lad, lad_bits) + self.handle_get_data() elif self.state == 'GET TAR2': - self.handle_get_tar2(lad, lad_bits) + self.handle_get_tar2() + + # Store current pin values for the next round. + self.oldpins = pins + if (logic.edge_index == 1): + self.oldlclk = 0 + else: + self.oldlclk = -1 + if (logic.edge_index == 0): + self.oldlframe = 1 + else: + self.oldlframe = lframe + self.oldlad = lad + self.oldlad_bits = lad_bits diff --git a/libsigrokdecode4DSL/decoders/onewire_link/pd.py.back b/libsigrokdecode4DSL/decoders/onewire_link/pd.py.back deleted file mode 100755 index 03818b7c..00000000 --- a/libsigrokdecode4DSL/decoders/onewire_link/pd.py.back +++ /dev/null @@ -1,289 +0,0 @@ -## -## This file is part of the libsigrokdecode project. -## -## Copyright (C) 2012 Iztok Jeras -## -## This program is free software; you can redistribute it and/or modify -## it under the terms of the GNU General Public License as published by -## the Free Software Foundation; either version 2 of the License, or -## (at your option) any later version. -## -## This program is distributed in the hope that it will be useful, -## but WITHOUT ANY WARRANTY; without even the implied warranty of -## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -## GNU General Public License for more details. -## -## You should have received a copy of the GNU General Public License -## along with this program; if not, write to the Free Software -## Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -## - -import sigrokdecode as srd - -class SamplerateError(Exception): - pass - -class Decoder(srd.Decoder): - api_version = 2 - id = 'onewire_link' - name = 'One-Wire link layer' - longname = 'One-Wire serial communication bus (link layer)' - desc = 'Bidirectional, half-duplex, asynchronous serial bus.' - license = 'gplv2+' - inputs = ['logic'] - outputs = ['onewire_link'] - channels = ( - {'id': 'owr', 'name': 'OWR', 'desc': '1-Wire signal line'}, - ) - optional_channels = ( - {'id': 'pwr', 'name': 'PWR', 'desc': '1-Wire power supply pin'}, - ) - options = ( - {'id': 'overdrive', - 'desc': 'Overdrive mode', 'default': 'no', 'values': ('yes', 'no')}, - # Time options (specified in microseconds): - {'id': 'cnt_normal_bit', - 'desc': 'Normal mode sample bit time (μs)', 'default': 15}, - {'id': 'cnt_normal_slot', - 'desc': 'Normal mode data slot time (μs)', 'default': 60}, - {'id': 'cnt_normal_presence', - 'desc': 'Normal mode sample presence time (μs)', 'default': 75}, - {'id': 'cnt_normal_reset', - 'desc': 'Normal mode reset time (μs)', 'default': 480}, - {'id': 'cnt_overdrive_bit', - 'desc': 'Overdrive mode sample bit time (μs)', 'default': 2}, - {'id': 'cnt_overdrive_slot', - 'desc': 'Overdrive mode data slot time (μs)', 'default': 7.3}, - {'id': 'cnt_overdrive_presence', - 'desc': 'Overdrive mode sample presence time (μs)', 'default': 10}, - {'id': 'cnt_overdrive_reset', - 'desc': 'Overdrive mode reset time (μs)', 'default': 48}, - ) - annotations = ( - ('bit', 'Bit'), - ('warnings', 'Warnings'), - ('reset', 'Reset'), - ('presence', 'Presence'), - ('overdrive', 'Overdrive mode notifications'), - ) - annotation_rows = ( - ('bits', 'Bits', (0, 2, 3)), - ('info', 'Info', (4,)), - ('warnings', 'Warnings', (1,)), - ) - - def putm(self, data): - self.put(0, 0, self.out_ann, data) - - def putpb(self, data): - self.put(self.fall, self.samplenum, self.out_python, data) - - def putb(self, data): - self.put(self.fall, self.samplenum, self.out_ann, data) - - def putx(self, data): - self.put(self.fall, self.cnt_bit[self.overdrive], self.out_ann, data) - - def putfr(self, data): - self.put(self.fall, self.rise, self.out_ann, data) - - def putprs(self, data): - self.put(self.rise, self.samplenum, self.out_python, data) - - def putrs(self, data): - self.put(self.rise, self.samplenum, self.out_ann, data) - - def __init__(self): - self.samplerate = None - self.samplenum = 0 - self.state = 'WAIT FOR FALLING EDGE' - self.present = 0 - self.bit = 0 - self.bit_cnt = 0 - self.command = 0 - self.overdrive = 0 - self.fall = 0 - self.rise = 0 - - def start(self): - self.out_python = self.register(srd.OUTPUT_PYTHON) - self.out_ann = self.register(srd.OUTPUT_ANN) - - def checks(self): - # Check if samplerate is appropriate. - if self.options['overdrive'] == 'yes': - if self.samplerate < 2000000: - self.putm([1, ['Sampling rate is too low. Must be above ' + - '2MHz for proper overdrive mode decoding.']]) - elif self.samplerate < 5000000: - self.putm([1, ['Sampling rate is suggested to be above 5MHz ' + - 'for proper overdrive mode decoding.']]) - else: - if self.samplerate < 400000: - self.putm([1, ['Sampling rate is too low. Must be above ' + - '400kHz for proper normal mode decoding.']]) - elif self.samplerate < 1000000: - self.putm([1, ['Sampling rate is suggested to be above ' + - '1MHz for proper normal mode decoding.']]) - - # Check if sample times are in the allowed range. - - time_min = float(self.cnt_normal_bit) / self.samplerate - time_max = float(self.cnt_normal_bit + 1) / self.samplerate - if (time_min < 0.000005) or (time_max > 0.000015): - self.putm([1, ['The normal mode data sample time interval ' + - '(%2.1fus-%2.1fus) should be inside (5.0us, 15.0us).' - % (time_min * 1000000, time_max * 1000000)]]) - - time_min = float(self.cnt_normal_presence) / self.samplerate - time_max = float(self.cnt_normal_presence + 1) / self.samplerate - if (time_min < 0.0000681) or (time_max > 0.000075): - self.putm([1, ['The normal mode presence sample time interval ' + - '(%2.1fus-%2.1fus) should be inside (68.1us, 75.0us).' - % (time_min * 1000000, time_max * 1000000)]]) - - time_min = float(self.cnt_overdrive_bit) / self.samplerate - time_max = float(self.cnt_overdrive_bit + 1) / self.samplerate - if (time_min < 0.000001) or (time_max > 0.000002): - self.putm([1, ['The overdrive mode data sample time interval ' + - '(%2.1fus-%2.1fus) should be inside (1.0us, 2.0us).' - % (time_min * 1000000, time_max * 1000000)]]) - - time_min = float(self.cnt_overdrive_presence) / self.samplerate - time_max = float(self.cnt_overdrive_presence + 1) / self.samplerate - if (time_min < 0.0000073) or (time_max > 0.000010): - self.putm([1, ['The overdrive mode presence sample time interval ' + - '(%2.1fus-%2.1fus) should be inside (7.3us, 10.0us).' - % (time_min * 1000000, time_max * 1000000)]]) - - - def metadata(self, key, value): - if key != srd.SRD_CONF_SAMPLERATE: - return - self.samplerate = value - - # The default 1-Wire time base is 30us. This is used to calculate - # sampling times. - samplerate = float(self.samplerate) - - x = float(self.options['cnt_normal_bit']) / 1000000.0 - self.cnt_normal_bit = int(samplerate * x) - 1 - x = float(self.options['cnt_normal_slot']) / 1000000.0 - self.cnt_normal_slot = int(samplerate * x) - 1 - x = float(self.options['cnt_normal_presence']) / 1000000.0 - self.cnt_normal_presence = int(samplerate * x) - 1 - x = float(self.options['cnt_normal_reset']) / 1000000.0 - self.cnt_normal_reset = int(samplerate * x) - 1 - x = float(self.options['cnt_overdrive_bit']) / 1000000.0 - self.cnt_overdrive_bit = int(samplerate * x) - 1 - x = float(self.options['cnt_overdrive_slot']) / 1000000.0 - self.cnt_overdrive_slot = int(samplerate * x) - 1 - x = float(self.options['cnt_overdrive_presence']) / 1000000.0 - self.cnt_overdrive_presence = int(samplerate * x) - 1 - x = float(self.options['cnt_overdrive_reset']) / 1000000.0 - self.cnt_overdrive_reset = int(samplerate * x) - 1 - - # Organize values into lists. - self.cnt_bit = [self.cnt_normal_bit, self.cnt_overdrive_bit] - self.cnt_presence = [self.cnt_normal_presence, self.cnt_overdrive_presence] - self.cnt_reset = [self.cnt_normal_reset, self.cnt_overdrive_reset] - self.cnt_slot = [self.cnt_normal_slot, self.cnt_overdrive_slot] - - def decode(self, ss, es, data): - if not self.samplerate: - raise SamplerateError('Cannot decode without samplerate.') - for (self.samplenum, (owr, pwr)) in data: - data.itercnt += 1 - if self.samplenum == 0: - self.checks() - # State machine. - if self.state == 'WAIT FOR FALLING EDGE': - # The start of a cycle is a falling edge. - if owr != 0: - continue - # Save the sample number for the falling edge. - self.fall = self.samplenum - # Go to waiting for sample time. - self.state = 'WAIT FOR DATA SAMPLE' - elif self.state == 'WAIT FOR DATA SAMPLE': - # Sample data bit. - t = self.samplenum - self.fall - if t == self.cnt_bit[self.overdrive]: - self.bit = owr - self.state = 'WAIT FOR DATA SLOT END' - elif self.state == 'WAIT FOR DATA SLOT END': - # A data slot ends in a recovery period, otherwise, this is - # probably a reset. - t = self.samplenum - self.fall - if t != self.cnt_slot[self.overdrive]: - continue - - if owr == 0: - # This seems to be a reset slot, wait for its end. - self.state = 'WAIT FOR RISING EDGE' - continue - - self.putb([0, ['Bit: %d' % self.bit, '%d' % self.bit]]) - self.putpb(['BIT', self.bit]) - - # Checking the first command to see if overdrive mode - # should be entered. - if self.bit_cnt <= 8: - self.command |= (self.bit << self.bit_cnt) - elif self.bit_cnt == 8 and self.command in [0x3c, 0x69]: - self.putx([4, ['Entering overdrive mode', 'Overdrive on']]) - # Increment the bit counter. - self.bit_cnt += 1 - # Wait for next slot. - self.state = 'WAIT FOR FALLING EDGE' - elif self.state == 'WAIT FOR RISING EDGE': - # The end of a cycle is a rising edge. - if owr != 1: - continue - - # Check if this was a reset cycle. - t = self.samplenum - self.fall - if t > self.cnt_normal_reset: - # Save the sample number for the rising edge. - self.rise = self.samplenum - self.putfr([2, ['Reset', 'Rst', 'R']]) - self.state = 'WAIT FOR PRESENCE DETECT' - # Exit overdrive mode. - if self.overdrive: - self.putx([4, ['Exiting overdrive mode', 'Overdrive off']]) - self.overdrive = 0 - # Clear command bit counter and data register. - self.bit_cnt = 0 - self.command = 0 - elif (t > self.cnt_overdrive_reset) and self.overdrive: - # Save the sample number for the rising edge. - self.rise = self.samplenum - self.putfr([2, ['Reset', 'Rst', 'R']]) - self.state = 'WAIT FOR PRESENCE DETECT' - # Otherwise this is assumed to be a data bit. - else: - self.state = 'WAIT FOR FALLING EDGE' - elif self.state == 'WAIT FOR PRESENCE DETECT': - # Sample presence status. - t = self.samplenum - self.rise - if t == self.cnt_presence[self.overdrive]: - self.present = owr - self.state = 'WAIT FOR RESET SLOT END' - elif self.state == 'WAIT FOR RESET SLOT END': - # A reset slot ends in a long recovery period. - t = self.samplenum - self.rise - if t != self.cnt_reset[self.overdrive]: - continue - - if owr == 0: - # This seems to be a reset slot, wait for its end. - self.state = 'WAIT FOR RISING EDGE' - continue - - p = 'false' if self.present else 'true' - self.putrs([3, ['Presence: %s' % p, 'Presence', 'Pres', 'P']]) - self.putprs(['RESET/PRESENCE', not self.present]) - - # Wait for next slot. - self.state = 'WAIT FOR FALLING EDGE' - diff --git a/libsigrokdecode4DSL/decoders/spi/__init__.py b/libsigrokdecode4DSL/decoders/spi/__init__.py deleted file mode 100755 index f76bb064..00000000 --- a/libsigrokdecode4DSL/decoders/spi/__init__.py +++ /dev/null @@ -1,32 +0,0 @@ -## -## This file is part of the libsigrokdecode project. -## -## Copyright (C) 2012 Uwe Hermann -## -## This program is free software; you can redistribute it and/or modify -## it under the terms of the GNU General Public License as published by -## the Free Software Foundation; either version 2 of the License, or -## (at your option) any later version. -## -## This program is distributed in the hope that it will be useful, -## but WITHOUT ANY WARRANTY; without even the implied warranty of -## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -## GNU General Public License for more details. -## -## You should have received a copy of the GNU General Public License -## along with this program; if not, write to the Free Software -## Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -## - -''' -The SPI (Serial Peripheral Interface) protocol decoder supports synchronous -SPI(-like) protocols with a clock line, a MISO and MOSI line for data -transfer in two directions, and an optional CS# pin. -Either MISO or MOSI (but not both) can be optional. - -If CS# is supplied, data is only decoded when CS# is asserted (clock -transitions where CS# is not asserted are ignored). If CS# is not supplied, -data is decoded on every clock transition (depending on SPI mode). -''' - -from .pd import Decoder diff --git a/libsigrokdecode4DSL/decoders/spi/pd.py b/libsigrokdecode4DSL/decoders/spi/pd.py deleted file mode 100755 index af390b84..00000000 --- a/libsigrokdecode4DSL/decoders/spi/pd.py +++ /dev/null @@ -1,334 +0,0 @@ -## -## This file is part of the libsigrokdecode project. -## -## Copyright (C) 2011 Gareth McMullin -## Copyright (C) 2012-2014 Uwe Hermann -## -## This program is free software; you can redistribute it and/or modify -## it under the terms of the GNU General Public License as published by -## the Free Software Foundation; either version 2 of the License, or -## (at your option) any later version. -## -## This program is distributed in the hope that it will be useful, -## but WITHOUT ANY WARRANTY; without even the implied warranty of -## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -## GNU General Public License for more details. -## -## You should have received a copy of the GNU General Public License -## along with this program; if not, write to the Free Software -## Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -## - -import sigrokdecode as srd -from collections import namedtuple - -Data = namedtuple('Data', ['ss', 'es', 'val']) - -''' -OUTPUT_PYTHON format: - -Packet: -[, , ] - -: - - 'DATA': contains the MOSI data, contains the MISO data. - The data is _usually_ 8 bits (but can also be fewer or more bits). - Both data items are Python numbers (not strings), or None if the respective - channel was not supplied. - - 'BITS': / contain a list of bit values in this MOSI/MISO data - item, and for each of those also their respective start-/endsample numbers. - - 'CS-CHANGE': is the old CS# pin value, is the new value. - Both data items are Python numbers (0/1), not strings. At the beginning of - the decoding a packet is generated with = None and being the - initial state of the CS# pin or None if the chip select pin is not supplied. - - 'TRANSFER': / contain a list of Data() namedtuples for each - byte transferred during this block of CS# asserted time. Each Data() has - fields ss, es, and val. - -Examples: - ['CS-CHANGE', None, 1] - ['CS-CHANGE', 1, 0] - ['DATA', 0xff, 0x3a] - ['BITS', [[1, 80, 82], [1, 83, 84], [1, 85, 86], [1, 87, 88], - [1, 89, 90], [1, 91, 92], [1, 93, 94], [1, 95, 96]], - [[0, 80, 82], [1, 83, 84], [0, 85, 86], [1, 87, 88], - [1, 89, 90], [1, 91, 92], [0, 93, 94], [0, 95, 96]]] - ['DATA', 0x65, 0x00] - ['DATA', 0xa8, None] - ['DATA', None, 0x55] - ['CS-CHANGE', 0, 1] - ['TRANSFER', [Data(ss=80, es=96, val=0xff), ...], - [Data(ss=80, es=96, val=0x3a), ...]] -''' - -# Key: (CPOL, CPHA). Value: SPI mode. -# Clock polarity (CPOL) = 0/1: Clock is low/high when inactive. -# Clock phase (CPHA) = 0/1: Data is valid on the leading/trailing clock edge. -spi_mode = { - (0, 0): 0, # Mode 0 - (0, 1): 1, # Mode 1 - (1, 0): 2, # Mode 2 - (1, 1): 3, # Mode 3 -} - -class SamplerateError(Exception): - pass - -class ChannelError(Exception): - pass - -class Decoder(srd.Decoder): - api_version = 2 - id = 'spi' - name = 'SPI' - longname = 'Serial Peripheral Interface' - desc = 'Full-duplex, synchronous, serial bus.' - license = 'gplv2+' - inputs = ['logic'] - outputs = ['spi'] - channels = ( - {'id': 'clk', 'name': 'CLK', 'desc': 'Clock'}, - ) - optional_channels = ( - {'id': 'miso', 'name': 'MISO', 'desc': 'Master in, slave out'}, - {'id': 'mosi', 'name': 'MOSI', 'desc': 'Master out, slave in'}, - {'id': 'cs', 'name': 'CS#', 'desc': 'Chip-select'}, - ) - options = ( - {'id': 'cs_polarity', 'desc': 'CS# polarity', 'default': 'active-low', - 'values': ('active-low', 'active-high')}, - {'id': 'cpol', 'desc': 'Clock polarity', 'default': 0, - 'values': (0, 1)}, - {'id': 'cpha', 'desc': 'Clock phase', 'default': 0, - 'values': (0, 1)}, - {'id': 'bitorder', 'desc': 'Bit order', - 'default': 'msb-first', 'values': ('msb-first', 'lsb-first')}, - {'id': 'wordsize', 'desc': 'Word size', 'default': 8}, - ) - annotations = ( - ('miso-data', 'MISO data'), - ('mosi-data', 'MOSI data'), - ('miso-bits', 'MISO bits'), - ('mosi-bits', 'MOSI bits'), - ('warnings', 'Human-readable warnings'), - ) - annotation_rows = ( - ('miso-data', 'MISO data', (0,)), - ('miso-bits', 'MISO bits', (2,)), - ('mosi-data', 'MOSI data', (1,)), - ('mosi-bits', 'MOSI bits', (3,)), - ('other', 'Other', (4,)), - ) - binary = ( - ('miso', 'MISO'), - ('mosi', 'MOSI'), - ) - - def __init__(self): - self.samplerate = None - self.oldclk = -1 - self.bitcount = 0 - self.misodata = self.mosidata = 0 - self.misobits = [] - self.mosibits = [] - self.misobytes = [] - self.mosibytes = [] - self.ss_block = -1 - self.samplenum = -1 - self.ss_transfer = -1 - self.cs_was_deasserted = False - self.oldcs = None - self.oldpins = None - self.have_cs = self.have_miso = self.have_mosi = None - self.no_cs_notification = False - - def metadata(self, key, value): - if key == srd.SRD_CONF_SAMPLERATE: - self.samplerate = value - - def start(self): - self.out_python = self.register(srd.OUTPUT_PYTHON) - self.out_ann = self.register(srd.OUTPUT_ANN) - self.out_bin = self.register(srd.OUTPUT_BINARY) - self.out_bitrate = self.register(srd.OUTPUT_META, - meta=(int, 'Bitrate', 'Bitrate during transfers')) - - def putw(self, data): - self.put(self.ss_block, self.samplenum, self.out_ann, data) - - def putdata(self): - # Pass MISO and MOSI bits and then data to the next PD up the stack. - so = self.misodata if self.have_miso else None - si = self.mosidata if self.have_mosi else None - so_bits = self.misobits if self.have_miso else None - si_bits = self.mosibits if self.have_mosi else None - - if self.have_miso: - ss, es = self.misobits[-1][1], self.misobits[0][2] - #self.put(ss, es, self.out_bin, (0, bytes([so]))) - if self.have_mosi: - ss, es = self.mosibits[-1][1], self.mosibits[0][2] - #self.put(ss, es, self.out_bin, (1, bytes([si]))) - - self.put(ss, es, self.out_python, ['BITS', si_bits, so_bits]) - self.put(ss, es, self.out_python, ['DATA', si, so]) - - if self.have_miso: - self.misobytes.append(Data(ss=ss, es=es, val=so)) - if self.have_mosi: - self.mosibytes.append(Data(ss=ss, es=es, val=si)) - - # Bit annotations. - if self.have_miso: - for bit in self.misobits: - self.put(bit[1], bit[2], self.out_ann, [2, ['%d' % bit[0]]]) - if self.have_mosi: - for bit in self.mosibits: - self.put(bit[1], bit[2], self.out_ann, [3, ['%d' % bit[0]]]) - - # Dataword annotations. - if self.have_miso: - self.put(ss, es, self.out_ann, [0, ['%02X' % self.misodata]]) - if self.have_mosi: - self.put(ss, es, self.out_ann, [1, ['%02X' % self.mosidata]]) - - def reset_decoder_state(self): - self.misodata = 0 if self.have_miso else None - self.mosidata = 0 if self.have_mosi else None - self.misobits = [] if self.have_miso else None - self.mosibits = [] if self.have_mosi else None - self.bitcount = 0 - - def cs_asserted(self, cs): - active_low = (self.options['cs_polarity'] == 'active-low') - return (cs == 0) if active_low else (cs == 1) - - def handle_bit(self, miso, mosi, clk, cs): - # If this is the first bit of a dataword, save its sample number. - if self.bitcount == 0: - self.ss_block = self.samplenum - self.cs_was_deasserted = \ - not self.cs_asserted(cs) if self.have_cs else False - - ws = self.options['wordsize'] - - # Receive MISO bit into our shift register. - if self.have_miso: - if self.options['bitorder'] == 'msb-first': - self.misodata |= miso << (ws - 1 - self.bitcount) - else: - self.misodata |= miso << self.bitcount - - # Receive MOSI bit into our shift register. - if self.have_mosi: - if self.options['bitorder'] == 'msb-first': - self.mosidata |= mosi << (ws - 1 - self.bitcount) - else: - self.mosidata |= mosi << self.bitcount - - # Guesstimate the endsample for this bit (can be overridden below). - es = self.samplenum - if self.bitcount > 0: - if self.have_miso: - es += self.samplenum - self.misobits[0][1] - elif self.have_mosi: - es += self.samplenum - self.mosibits[0][1] - - if self.have_miso: - self.misobits.insert(0, [miso, self.samplenum, es]) - if self.have_mosi: - self.mosibits.insert(0, [mosi, self.samplenum, es]) - - if self.bitcount > 0 and self.have_miso: - self.misobits[1][2] = self.samplenum - if self.bitcount > 0 and self.have_mosi: - self.mosibits[1][2] = self.samplenum - - self.bitcount += 1 - - # Continue to receive if not enough bits were received, yet. - if self.bitcount != ws: - return - - self.putdata() - - # Meta bitrate. - elapsed = 1 / float(self.samplerate) - elapsed *= (self.samplenum - self.ss_block + 1) - bitrate = int(1 / elapsed * self.options['wordsize']) - self.put(self.ss_block, self.samplenum, self.out_bitrate, bitrate) - - if self.have_cs and self.cs_was_deasserted: - self.putw([4, ['CS# was deasserted during this data word!']]) - - self.reset_decoder_state() - - def find_clk_edge(self, miso, mosi, clk, cs): - if self.have_cs and self.oldcs != cs: - # Send all CS# pin value changes. - self.put(self.samplenum, self.samplenum, self.out_python, - ['CS-CHANGE', self.oldcs, cs]) - self.oldcs = cs - - if self.cs_asserted(cs): - self.ss_transfer = self.samplenum - self.misobytes = [] - self.mosibytes = [] - else: - self.put(self.ss_transfer, self.samplenum, self.out_python, - ['TRANSFER', self.mosibytes, self.misobytes]) - - # Reset decoder state when CS# changes (and the CS# pin is used). - self.reset_decoder_state() - - # We only care about samples if CS# is asserted. - if self.have_cs and not self.cs_asserted(cs): - return - - # Ignore sample if the clock pin hasn't changed. - if clk == self.oldclk: - return - - self.oldclk = clk - - # Sample data on rising/falling clock edge (depends on mode). - mode = spi_mode[self.options['cpol'], self.options['cpha']] - if mode == 0 and clk == 0: # Sample on rising clock edge - return - elif mode == 1 and clk == 1: # Sample on falling clock edge - return - elif mode == 2 and clk == 1: # Sample on falling clock edge - return - elif mode == 3 and clk == 0: # Sample on rising clock edge - return - - # Found the correct clock edge, now get the SPI bit(s). - self.handle_bit(miso, mosi, clk, cs) - - def decode(self, ss, es, data): - if not self.samplerate: - raise SamplerateError('Cannot decode without samplerate.') - # Either MISO or MOSI can be omitted (but not both). CS# is optional. - for (self.samplenum, pins) in data: - data.itercnt += 1 - # Ignore identical samples early on (for performance reasons). - if self.oldpins == pins: - continue - (clk, miso, mosi, cs) = pins - if self.oldpins == None: - self.oldclk = clk - self.oldpins = pins - self.have_miso = (miso in (0, 1)) - self.have_mosi = (mosi in (0, 1)) - self.have_cs = (cs in (0, 1)) - - # Either MISO or MOSI (but not both) can be omitted. - if not (self.have_miso or self.have_mosi): - raise ChannelError('Either MISO or MOSI (or both) pins required.') - - # Tell stacked decoders that we don't have a CS# signal. - if not self.no_cs_notification and not self.have_cs: - self.put(0, 0, self.out_python, ['CS-CHANGE', None, None]) - self.no_cs_notification = True - - self.find_clk_edge(miso, mosi, clk, cs) diff --git a/libsigrokdecode4DSL/exception.c b/libsigrokdecode4DSL/exception.c index ca1b96f9..d389af31 100644 --- a/libsigrokdecode4DSL/exception.c +++ b/libsigrokdecode4DSL/exception.c @@ -92,7 +92,7 @@ SRD_PRIV void srd_exception_catch(char **error, const char *format, ...) py_etype = py_evalue = py_etraceback = py_mod = py_func = NULL; - va_start(args, error); + va_start(args, format); msg = g_strdup_vprintf(format, args); va_end(args); diff --git a/libsigrokdecode4DSL/instance.c b/libsigrokdecode4DSL/instance.c index 60c52e23..4041b8c5 100644 --- a/libsigrokdecode4DSL/instance.c +++ b/libsigrokdecode4DSL/instance.c @@ -156,6 +156,7 @@ SRD_API int srd_inst_option_set(struct srd_decoder_inst *di, /* Not harmful even if we used the default. */ g_hash_table_remove(options, sdo->id); } + Py_DECREF(py_di_options); if (g_hash_table_size(options) != 0) srd_warn("Unknown options specified for '%s'", di->inst_id); diff --git a/libsigrokdecode4DSL/libsigrokdecode-internal.h b/libsigrokdecode4DSL/libsigrokdecode-internal.h index 7d47b7fd..0131907c 100644 --- a/libsigrokdecode4DSL/libsigrokdecode-internal.h +++ b/libsigrokdecode4DSL/libsigrokdecode-internal.h @@ -37,7 +37,7 @@ typedef struct { uint64_t start_samplenum; float itercnt; uint8_t **inbuf; - uint8_t *inbuf_const; + const uint8_t *inbuf_const; uint64_t samplenum; PyObject *sample; diff --git a/libsigrokdecode4DSL/libsigrokdecode.h b/libsigrokdecode4DSL/libsigrokdecode.h index 1412e1d8..14bdd6a2 100644 --- a/libsigrokdecode4DSL/libsigrokdecode.h +++ b/libsigrokdecode4DSL/libsigrokdecode.h @@ -43,7 +43,7 @@ extern "C" { * The correct way to get/use the libsigrokdecode API functions is: * * @code{.c} - * #include + * #include * @endcode */ diff --git a/libsigrokdecode4DSL/libsigrokdecode.pc.in b/libsigrokdecode4DSL/libsigrokdecode.pc.in deleted file mode 100644 index 3051145d..00000000 --- a/libsigrokdecode4DSL/libsigrokdecode.pc.in +++ /dev/null @@ -1,18 +0,0 @@ -prefix=@prefix@ -exec_prefix=@exec_prefix@ -libdir=@libdir@ -includedir=@includedir@ -datarootdir=@datarootdir@ -datadir=@datadir@ -pkgdatadir=${datadir}/@PACKAGE_TARNAME@ -decodersdir=${pkgdatadir}/decoders - -Name: libsigrokdecode -Description: Protocol decoder library of the sigrok logic analyzer software -URL: http://www.sigrok.org -Requires: glib-2.0 -Requires.private: @SRD_PKGLIBS@ -Version: @SRD_PACKAGE_VERSION@ -Libs: -L${libdir} -lsigrokdecode -Libs.private: @SRD_EXTRA_LIBS@ -Cflags: -I${includedir} diff --git a/libsigrokdecode4DSL/srd.c b/libsigrokdecode4DSL/srd.c index a827e57f..5933f881 100644 --- a/libsigrokdecode4DSL/srd.c +++ b/libsigrokdecode4DSL/srd.c @@ -18,7 +18,7 @@ * along with this program. If not, see . */ -#include +#include "config.h" #include "libsigrokdecode-internal.h" /* First, so we avoid a _POSIX_C_SOURCE warning. */ #include "libsigrokdecode.h" #include diff --git a/libsigrokdecode4DSL/util.c b/libsigrokdecode4DSL/util.c index b47af552..6e9bb22b 100644 --- a/libsigrokdecode4DSL/util.c +++ b/libsigrokdecode4DSL/util.c @@ -126,7 +126,7 @@ SRD_PRIV int py_dictitem_as_str(PyObject *py_obj, const char *key, SRD_PRIV int py_dictitem_to_int(PyObject *py_obj, const char *key) { PyObject *py_value; - PyObject *py_long; + long type; if (!PyDict_Check(py_obj)) { srd_dbg("Object is not a dictionary."); @@ -137,8 +137,10 @@ SRD_PRIV int py_dictitem_to_int(PyObject *py_obj, const char *key) srd_dbg("Dictionary has no attribute '%s'.", key); return -1; } - py_long = PyLong_FromUnicodeObject(py_value, 10); - return PyLong_AsLong(py_long); + + type = PyLong_Check(py_value) ? PyLong_AsLong(py_value) : -1; + + return type; } /**