├── CMakeLists.txt ├── LICENSE ├── README.md ├── images ├── capture-icons.png ├── channel-infobox.png ├── channel-properties.png ├── clear-button.png ├── connection-dialog.png ├── dim-waveform.png ├── empty-window.png ├── eye-gradient-crt.png ├── eye-gradient-grayscale.png ├── eye-gradient-ironbow.png ├── eye-gradient-krain.png ├── eye-gradient-rainbow.png ├── eye-gradient-reverse-rainbow.png ├── eye-gradient-viridis.png ├── filters │ ├── absolute-area.png │ ├── base.png │ ├── burst-width.png │ ├── cdrpll.png │ ├── cdruart.png │ ├── channel-emulation.png │ ├── full-width-half-max.png │ ├── per-cycle-absolute-area.png │ ├── phase-nonlinearity.png │ ├── pulse-width.png │ ├── swd.png │ ├── time-outside-level.png │ ├── true-area.png │ └── unwrapped-phase.png ├── fullscreen-button.png ├── graded-waveform.png ├── graph-editor.png ├── history-button.png ├── history-view.png ├── horizontal-cursor.png ├── multiple-groups.png ├── opacity-slider.png ├── overlays.png ├── overview.png ├── proto-analyzer.png ├── proto-filter.png ├── refresh-button.png ├── siglent-samples.png ├── sparse-waveform.png ├── stats.png ├── timebase-properties-freq.png ├── timebase-properties.png ├── timeline.png ├── toolbar.png ├── trigger-properties.png ├── vertical-cursor.png ├── washedout-waveform.png ├── waveform-graph.png └── y-axis.png ├── ng-images ├── channel-properties1.png ├── channel-properties2.png ├── channel-properties3.png ├── channel-tooltip.png ├── complex-ui.png ├── dialog-labnotes.png ├── dialog-logviewer.png ├── dialog-perfmetrics.png ├── dialog-preferences.png ├── dialog-speedbump.png ├── dialog-timebase.png ├── docking.png ├── empty-window.png ├── filters │ ├── 128b130b.png │ ├── 64b66b.png │ ├── 8b10b.png │ ├── accouple.png │ ├── acrms.png │ ├── add.png │ ├── autocorrelation.png │ ├── average.png │ ├── bandwidth.png │ ├── baset1-training.png │ ├── bus-heatmap.png │ ├── can.png │ ├── eye.png │ ├── graph-1000basex.png │ ├── graph-10gbe.png │ ├── graph-accouple.png │ ├── graph-acrms.png │ ├── graph-add.png │ ├── graph-autocorrelation.png │ ├── graph-average.png │ ├── graph-bandwidth.png │ ├── graph-baset1-training.png │ ├── graph-bus-heatmap.png │ ├── graph-can.png │ ├── graph-eye.png │ ├── graph-pcie-gen3.png │ ├── graph-tmds.png │ ├── packet-can.png │ └── tmds.png ├── graded-waveform.png ├── graph-editor-addinput.png ├── graph-editor-create.png ├── graph-editor-group1.png ├── graph-editor-group2.png ├── graph-editor-properties.png ├── graph-editor.png ├── history.png ├── marker-multiview.png ├── markers.png ├── overview.png ├── split-overlays.png ├── split-right.png ├── tooltip-help.png ├── tutorials │ └── basics │ │ ├── connect-example.png │ │ ├── connected.png │ │ ├── first-waveform.png │ │ ├── moved-waveform.png │ │ └── zoomed-waveform.png ├── vertical-cursor-x2.png ├── vertical-cursor.png ├── workspace.png ├── workspace2.png ├── workspace3.png ├── y-axis.png └── y-divs.png ├── ngscopeclient-manual.tex ├── section-bert-drivers.tex ├── section-copyright.tex ├── section-decodes.tex ├── section-dialogs.tex ├── section-funcgen-drivers.tex ├── section-gettingstarted.tex ├── section-grapheditor.tex ├── section-history.tex ├── section-internals.tex ├── section-intro.tex ├── section-legal.tex ├── section-load-drivers.tex ├── section-mainwindow.tex ├── section-meter-drivers.tex ├── section-misc-drivers.tex ├── section-powersupply-drivers.tex ├── section-protoanalyzer.tex ├── section-rfgen-drivers.tex ├── section-scope-drivers.tex ├── section-sdr-drivers.tex ├── section-spectrometer-drivers.tex ├── section-streambrowser.tex ├── section-timeline.tex ├── section-transports.tex ├── section-triggers.tex ├── section-tutorials.tex ├── section-vna-drivers.tex ├── section-waveformgroups.tex ├── section-waveformviews.tex └── section-workspaces.tex /CMakeLists.txt: -------------------------------------------------------------------------------- 1 | # Not all CMake Generators support file globbing, so build our tex dependency list manually 2 | # We could get CMake to do the glob, but there's not many files to deal with 3 | set(NGDOC_LIST 4 | ngscopeclient-manual.tex 5 | section-copyright.tex 6 | section-intro.tex 7 | section-legal.tex 8 | section-gettingstarted.tex 9 | section-mainwindow.tex 10 | section-dialogs.tex 11 | section-waveformgroups.tex 12 | section-waveformviews.tex 13 | section-history.tex 14 | section-grapheditor.tex 15 | section-transports.tex 16 | section-tutorials.tex 17 | section-bert-drivers.tex 18 | section-funcgen-drivers.tex 19 | section-load-drivers.tex 20 | section-meter-drivers.tex 21 | section-misc-drivers.tex 22 | section-powersupply-drivers.tex 23 | section-rfgen-drivers.tex 24 | section-scope-drivers.tex 25 | section-spectrometer-drivers.tex 26 | section-streambrowser.tex 27 | section-triggers.tex 28 | section-decodes.tex 29 | section-workspaces.tex 30 | 31 | # section-internals.tex 32 | # section-protoanalyzer.tex 33 | # section-timeline.tex 34 | ) 35 | # Save ourselves from having to manually paste this in front of every filename 36 | list(TRANSFORM NGDOC_LIST PREPEND ${CMAKE_CURRENT_SOURCE_DIR}/) 37 | 38 | add_custom_command( 39 | OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/ngscopeclient-manual.pdf 40 | COMMAND pdflatex -halt-on-error -interaction batchmode 41 | --output-directory ${CMAKE_CURRENT_BINARY_DIR} 42 | ${CMAKE_CURRENT_SOURCE_DIR}/ngscopeclient-manual.tex > ${CMAKE_CURRENT_BINARY_DIR}/run1.log 2>&1 43 | COMMAND pdflatex -halt-on-error -interaction batchmode 44 | --output-directory ${CMAKE_CURRENT_BINARY_DIR} 45 | ${CMAKE_CURRENT_SOURCE_DIR}/ngscopeclient-manual.tex > ${CMAKE_CURRENT_BINARY_DIR}/run2.log 2>&1 46 | DEPENDS ${NGDOC_LIST} 47 | WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} 48 | VERBATIM) 49 | 50 | # Copy source to build directory 51 | add_custom_command( 52 | OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/htmlbuild/ngscopeclient-manual.tex 53 | 54 | # Copy entire source directory and subfolders to build directory 55 | COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR}/htmlbuild 56 | 57 | DEPENDS ${NGDOC_LIST} 58 | VERBATIM) 59 | 60 | 61 | # Make the HTML output 62 | add_custom_command( 63 | OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/html/ngscopeclient-manual.html 64 | 65 | # Copy entire source directory and subfolders to build directory 66 | COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR}/htmlbuild 67 | 68 | # Get bounding box data for images 69 | # this is ugly and might not work on non-Linux but is better than nothing for now? 70 | COMMAND sh -c "ebb -x images/*.png images/filters/*.png ng-images/*.png" 71 | 72 | # Actual building 73 | COMMAND make4ht -uf html5 --output-dir ${CMAKE_CURRENT_BINARY_DIR}/html 74 | ngscopeclient-manual.tex "2,sec-filename,fn-in,mathjax" > makehtml.log 2>&1 75 | 76 | DEPENDS ${NGDOC_LIST} ${CMAKE_CURRENT_BINARY_DIR}/htmlbuild/ngscopeclient-manual.tex 77 | WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/htmlbuild 78 | VERBATIM) 79 | 80 | add_custom_target(doc ALL 81 | DEPENDS 82 | ${CMAKE_CURRENT_BINARY_DIR}/ngscopeclient-manual.pdf 83 | ${CMAKE_CURRENT_BINARY_DIR}/html/ngscopeclient-manual.html) 84 | 85 | install(FILES ${CMAKE_CURRENT_BINARY_DIR}/ngscopeclient-manual.pdf 86 | DESTINATION share/doc/ngscopeclient OPTIONAL) 87 | install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/html 88 | DESTINATION share/doc/ngscopeclient OPTIONAL) 89 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | BSD 3-Clause License 2 | 3 | Copyright (c) 2020, Andrew Zonenberg 4 | All rights reserved. 5 | 6 | Redistribution and use in source and binary forms, with or without 7 | modification, are permitted provided that the following conditions are met: 8 | 9 | 1. Redistributions of source code must retain the above copyright notice, this 10 | list of conditions and the following disclaimer. 11 | 12 | 2. Redistributions in binary form must reproduce the above copyright notice, 13 | this list of conditions and the following disclaimer in the documentation 14 | and/or other materials provided with the distribution. 15 | 16 | 3. Neither the name of the copyright holder nor the names of its 17 | contributors may be used to endorse or promote products derived from 18 | this software without specific prior written permission. 19 | 20 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 21 | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 22 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 23 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE 24 | FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 25 | DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 26 | SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 27 | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 28 | OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29 | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # scopehal-docs 2 | End user documentation for libscopehal 3 | -------------------------------------------------------------------------------- /images/capture-icons.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngscopeclient/scopehal-docs/b44802c1542c8d79584818e641d405764eb1c636/images/capture-icons.png -------------------------------------------------------------------------------- /images/channel-infobox.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngscopeclient/scopehal-docs/b44802c1542c8d79584818e641d405764eb1c636/images/channel-infobox.png -------------------------------------------------------------------------------- /images/channel-properties.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngscopeclient/scopehal-docs/b44802c1542c8d79584818e641d405764eb1c636/images/channel-properties.png -------------------------------------------------------------------------------- /images/clear-button.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngscopeclient/scopehal-docs/b44802c1542c8d79584818e641d405764eb1c636/images/clear-button.png -------------------------------------------------------------------------------- /images/connection-dialog.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngscopeclient/scopehal-docs/b44802c1542c8d79584818e641d405764eb1c636/images/connection-dialog.png -------------------------------------------------------------------------------- /images/dim-waveform.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngscopeclient/scopehal-docs/b44802c1542c8d79584818e641d405764eb1c636/images/dim-waveform.png -------------------------------------------------------------------------------- /images/empty-window.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngscopeclient/scopehal-docs/b44802c1542c8d79584818e641d405764eb1c636/images/empty-window.png -------------------------------------------------------------------------------- /images/eye-gradient-crt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngscopeclient/scopehal-docs/b44802c1542c8d79584818e641d405764eb1c636/images/eye-gradient-crt.png -------------------------------------------------------------------------------- /images/eye-gradient-grayscale.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngscopeclient/scopehal-docs/b44802c1542c8d79584818e641d405764eb1c636/images/eye-gradient-grayscale.png -------------------------------------------------------------------------------- /images/eye-gradient-ironbow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngscopeclient/scopehal-docs/b44802c1542c8d79584818e641d405764eb1c636/images/eye-gradient-ironbow.png -------------------------------------------------------------------------------- /images/eye-gradient-krain.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngscopeclient/scopehal-docs/b44802c1542c8d79584818e641d405764eb1c636/images/eye-gradient-krain.png -------------------------------------------------------------------------------- /images/eye-gradient-rainbow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngscopeclient/scopehal-docs/b44802c1542c8d79584818e641d405764eb1c636/images/eye-gradient-rainbow.png -------------------------------------------------------------------------------- /images/eye-gradient-reverse-rainbow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngscopeclient/scopehal-docs/b44802c1542c8d79584818e641d405764eb1c636/images/eye-gradient-reverse-rainbow.png -------------------------------------------------------------------------------- /images/eye-gradient-viridis.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngscopeclient/scopehal-docs/b44802c1542c8d79584818e641d405764eb1c636/images/eye-gradient-viridis.png -------------------------------------------------------------------------------- /images/filters/absolute-area.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngscopeclient/scopehal-docs/b44802c1542c8d79584818e641d405764eb1c636/images/filters/absolute-area.png -------------------------------------------------------------------------------- /images/filters/base.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngscopeclient/scopehal-docs/b44802c1542c8d79584818e641d405764eb1c636/images/filters/base.png -------------------------------------------------------------------------------- /images/filters/burst-width.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngscopeclient/scopehal-docs/b44802c1542c8d79584818e641d405764eb1c636/images/filters/burst-width.png -------------------------------------------------------------------------------- /images/filters/cdrpll.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngscopeclient/scopehal-docs/b44802c1542c8d79584818e641d405764eb1c636/images/filters/cdrpll.png -------------------------------------------------------------------------------- /images/filters/cdruart.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngscopeclient/scopehal-docs/b44802c1542c8d79584818e641d405764eb1c636/images/filters/cdruart.png -------------------------------------------------------------------------------- /images/filters/channel-emulation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngscopeclient/scopehal-docs/b44802c1542c8d79584818e641d405764eb1c636/images/filters/channel-emulation.png -------------------------------------------------------------------------------- /images/filters/full-width-half-max.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngscopeclient/scopehal-docs/b44802c1542c8d79584818e641d405764eb1c636/images/filters/full-width-half-max.png -------------------------------------------------------------------------------- /images/filters/per-cycle-absolute-area.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngscopeclient/scopehal-docs/b44802c1542c8d79584818e641d405764eb1c636/images/filters/per-cycle-absolute-area.png -------------------------------------------------------------------------------- /images/filters/phase-nonlinearity.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngscopeclient/scopehal-docs/b44802c1542c8d79584818e641d405764eb1c636/images/filters/phase-nonlinearity.png -------------------------------------------------------------------------------- /images/filters/pulse-width.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngscopeclient/scopehal-docs/b44802c1542c8d79584818e641d405764eb1c636/images/filters/pulse-width.png -------------------------------------------------------------------------------- /images/filters/swd.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngscopeclient/scopehal-docs/b44802c1542c8d79584818e641d405764eb1c636/images/filters/swd.png -------------------------------------------------------------------------------- /images/filters/time-outside-level.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngscopeclient/scopehal-docs/b44802c1542c8d79584818e641d405764eb1c636/images/filters/time-outside-level.png -------------------------------------------------------------------------------- /images/filters/true-area.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngscopeclient/scopehal-docs/b44802c1542c8d79584818e641d405764eb1c636/images/filters/true-area.png -------------------------------------------------------------------------------- /images/filters/unwrapped-phase.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngscopeclient/scopehal-docs/b44802c1542c8d79584818e641d405764eb1c636/images/filters/unwrapped-phase.png -------------------------------------------------------------------------------- /images/fullscreen-button.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngscopeclient/scopehal-docs/b44802c1542c8d79584818e641d405764eb1c636/images/fullscreen-button.png -------------------------------------------------------------------------------- /images/graded-waveform.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngscopeclient/scopehal-docs/b44802c1542c8d79584818e641d405764eb1c636/images/graded-waveform.png -------------------------------------------------------------------------------- /images/graph-editor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngscopeclient/scopehal-docs/b44802c1542c8d79584818e641d405764eb1c636/images/graph-editor.png -------------------------------------------------------------------------------- /images/history-button.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngscopeclient/scopehal-docs/b44802c1542c8d79584818e641d405764eb1c636/images/history-button.png -------------------------------------------------------------------------------- /images/history-view.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngscopeclient/scopehal-docs/b44802c1542c8d79584818e641d405764eb1c636/images/history-view.png -------------------------------------------------------------------------------- /images/horizontal-cursor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngscopeclient/scopehal-docs/b44802c1542c8d79584818e641d405764eb1c636/images/horizontal-cursor.png -------------------------------------------------------------------------------- /images/multiple-groups.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngscopeclient/scopehal-docs/b44802c1542c8d79584818e641d405764eb1c636/images/multiple-groups.png -------------------------------------------------------------------------------- /images/opacity-slider.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngscopeclient/scopehal-docs/b44802c1542c8d79584818e641d405764eb1c636/images/opacity-slider.png -------------------------------------------------------------------------------- /images/overlays.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngscopeclient/scopehal-docs/b44802c1542c8d79584818e641d405764eb1c636/images/overlays.png -------------------------------------------------------------------------------- /images/overview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngscopeclient/scopehal-docs/b44802c1542c8d79584818e641d405764eb1c636/images/overview.png -------------------------------------------------------------------------------- /images/proto-analyzer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngscopeclient/scopehal-docs/b44802c1542c8d79584818e641d405764eb1c636/images/proto-analyzer.png -------------------------------------------------------------------------------- /images/proto-filter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngscopeclient/scopehal-docs/b44802c1542c8d79584818e641d405764eb1c636/images/proto-filter.png -------------------------------------------------------------------------------- /images/refresh-button.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngscopeclient/scopehal-docs/b44802c1542c8d79584818e641d405764eb1c636/images/refresh-button.png -------------------------------------------------------------------------------- /images/siglent-samples.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngscopeclient/scopehal-docs/b44802c1542c8d79584818e641d405764eb1c636/images/siglent-samples.png -------------------------------------------------------------------------------- /images/sparse-waveform.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngscopeclient/scopehal-docs/b44802c1542c8d79584818e641d405764eb1c636/images/sparse-waveform.png -------------------------------------------------------------------------------- /images/stats.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngscopeclient/scopehal-docs/b44802c1542c8d79584818e641d405764eb1c636/images/stats.png -------------------------------------------------------------------------------- /images/timebase-properties-freq.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngscopeclient/scopehal-docs/b44802c1542c8d79584818e641d405764eb1c636/images/timebase-properties-freq.png -------------------------------------------------------------------------------- /images/timebase-properties.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngscopeclient/scopehal-docs/b44802c1542c8d79584818e641d405764eb1c636/images/timebase-properties.png -------------------------------------------------------------------------------- /images/timeline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngscopeclient/scopehal-docs/b44802c1542c8d79584818e641d405764eb1c636/images/timeline.png -------------------------------------------------------------------------------- /images/toolbar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngscopeclient/scopehal-docs/b44802c1542c8d79584818e641d405764eb1c636/images/toolbar.png -------------------------------------------------------------------------------- /images/trigger-properties.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngscopeclient/scopehal-docs/b44802c1542c8d79584818e641d405764eb1c636/images/trigger-properties.png -------------------------------------------------------------------------------- /images/vertical-cursor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngscopeclient/scopehal-docs/b44802c1542c8d79584818e641d405764eb1c636/images/vertical-cursor.png -------------------------------------------------------------------------------- /images/washedout-waveform.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngscopeclient/scopehal-docs/b44802c1542c8d79584818e641d405764eb1c636/images/washedout-waveform.png -------------------------------------------------------------------------------- /images/waveform-graph.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngscopeclient/scopehal-docs/b44802c1542c8d79584818e641d405764eb1c636/images/waveform-graph.png -------------------------------------------------------------------------------- /images/y-axis.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngscopeclient/scopehal-docs/b44802c1542c8d79584818e641d405764eb1c636/images/y-axis.png -------------------------------------------------------------------------------- /ng-images/channel-properties1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngscopeclient/scopehal-docs/b44802c1542c8d79584818e641d405764eb1c636/ng-images/channel-properties1.png -------------------------------------------------------------------------------- /ng-images/channel-properties2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngscopeclient/scopehal-docs/b44802c1542c8d79584818e641d405764eb1c636/ng-images/channel-properties2.png -------------------------------------------------------------------------------- /ng-images/channel-properties3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngscopeclient/scopehal-docs/b44802c1542c8d79584818e641d405764eb1c636/ng-images/channel-properties3.png -------------------------------------------------------------------------------- /ng-images/channel-tooltip.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngscopeclient/scopehal-docs/b44802c1542c8d79584818e641d405764eb1c636/ng-images/channel-tooltip.png -------------------------------------------------------------------------------- /ng-images/complex-ui.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngscopeclient/scopehal-docs/b44802c1542c8d79584818e641d405764eb1c636/ng-images/complex-ui.png -------------------------------------------------------------------------------- /ng-images/dialog-labnotes.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngscopeclient/scopehal-docs/b44802c1542c8d79584818e641d405764eb1c636/ng-images/dialog-labnotes.png -------------------------------------------------------------------------------- /ng-images/dialog-logviewer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngscopeclient/scopehal-docs/b44802c1542c8d79584818e641d405764eb1c636/ng-images/dialog-logviewer.png -------------------------------------------------------------------------------- /ng-images/dialog-perfmetrics.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngscopeclient/scopehal-docs/b44802c1542c8d79584818e641d405764eb1c636/ng-images/dialog-perfmetrics.png -------------------------------------------------------------------------------- /ng-images/dialog-preferences.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngscopeclient/scopehal-docs/b44802c1542c8d79584818e641d405764eb1c636/ng-images/dialog-preferences.png -------------------------------------------------------------------------------- /ng-images/dialog-speedbump.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngscopeclient/scopehal-docs/b44802c1542c8d79584818e641d405764eb1c636/ng-images/dialog-speedbump.png -------------------------------------------------------------------------------- /ng-images/dialog-timebase.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngscopeclient/scopehal-docs/b44802c1542c8d79584818e641d405764eb1c636/ng-images/dialog-timebase.png -------------------------------------------------------------------------------- /ng-images/docking.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngscopeclient/scopehal-docs/b44802c1542c8d79584818e641d405764eb1c636/ng-images/docking.png -------------------------------------------------------------------------------- /ng-images/empty-window.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngscopeclient/scopehal-docs/b44802c1542c8d79584818e641d405764eb1c636/ng-images/empty-window.png -------------------------------------------------------------------------------- /ng-images/filters/128b130b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngscopeclient/scopehal-docs/b44802c1542c8d79584818e641d405764eb1c636/ng-images/filters/128b130b.png -------------------------------------------------------------------------------- /ng-images/filters/64b66b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngscopeclient/scopehal-docs/b44802c1542c8d79584818e641d405764eb1c636/ng-images/filters/64b66b.png -------------------------------------------------------------------------------- /ng-images/filters/8b10b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngscopeclient/scopehal-docs/b44802c1542c8d79584818e641d405764eb1c636/ng-images/filters/8b10b.png -------------------------------------------------------------------------------- /ng-images/filters/accouple.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngscopeclient/scopehal-docs/b44802c1542c8d79584818e641d405764eb1c636/ng-images/filters/accouple.png -------------------------------------------------------------------------------- /ng-images/filters/acrms.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngscopeclient/scopehal-docs/b44802c1542c8d79584818e641d405764eb1c636/ng-images/filters/acrms.png -------------------------------------------------------------------------------- /ng-images/filters/add.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngscopeclient/scopehal-docs/b44802c1542c8d79584818e641d405764eb1c636/ng-images/filters/add.png -------------------------------------------------------------------------------- /ng-images/filters/autocorrelation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngscopeclient/scopehal-docs/b44802c1542c8d79584818e641d405764eb1c636/ng-images/filters/autocorrelation.png -------------------------------------------------------------------------------- /ng-images/filters/average.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngscopeclient/scopehal-docs/b44802c1542c8d79584818e641d405764eb1c636/ng-images/filters/average.png -------------------------------------------------------------------------------- /ng-images/filters/bandwidth.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngscopeclient/scopehal-docs/b44802c1542c8d79584818e641d405764eb1c636/ng-images/filters/bandwidth.png -------------------------------------------------------------------------------- /ng-images/filters/baset1-training.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngscopeclient/scopehal-docs/b44802c1542c8d79584818e641d405764eb1c636/ng-images/filters/baset1-training.png -------------------------------------------------------------------------------- /ng-images/filters/bus-heatmap.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngscopeclient/scopehal-docs/b44802c1542c8d79584818e641d405764eb1c636/ng-images/filters/bus-heatmap.png -------------------------------------------------------------------------------- /ng-images/filters/can.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngscopeclient/scopehal-docs/b44802c1542c8d79584818e641d405764eb1c636/ng-images/filters/can.png -------------------------------------------------------------------------------- /ng-images/filters/eye.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngscopeclient/scopehal-docs/b44802c1542c8d79584818e641d405764eb1c636/ng-images/filters/eye.png -------------------------------------------------------------------------------- /ng-images/filters/graph-1000basex.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngscopeclient/scopehal-docs/b44802c1542c8d79584818e641d405764eb1c636/ng-images/filters/graph-1000basex.png -------------------------------------------------------------------------------- /ng-images/filters/graph-10gbe.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngscopeclient/scopehal-docs/b44802c1542c8d79584818e641d405764eb1c636/ng-images/filters/graph-10gbe.png -------------------------------------------------------------------------------- /ng-images/filters/graph-accouple.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngscopeclient/scopehal-docs/b44802c1542c8d79584818e641d405764eb1c636/ng-images/filters/graph-accouple.png -------------------------------------------------------------------------------- /ng-images/filters/graph-acrms.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngscopeclient/scopehal-docs/b44802c1542c8d79584818e641d405764eb1c636/ng-images/filters/graph-acrms.png -------------------------------------------------------------------------------- /ng-images/filters/graph-add.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngscopeclient/scopehal-docs/b44802c1542c8d79584818e641d405764eb1c636/ng-images/filters/graph-add.png -------------------------------------------------------------------------------- /ng-images/filters/graph-autocorrelation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngscopeclient/scopehal-docs/b44802c1542c8d79584818e641d405764eb1c636/ng-images/filters/graph-autocorrelation.png -------------------------------------------------------------------------------- /ng-images/filters/graph-average.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngscopeclient/scopehal-docs/b44802c1542c8d79584818e641d405764eb1c636/ng-images/filters/graph-average.png -------------------------------------------------------------------------------- /ng-images/filters/graph-bandwidth.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngscopeclient/scopehal-docs/b44802c1542c8d79584818e641d405764eb1c636/ng-images/filters/graph-bandwidth.png -------------------------------------------------------------------------------- /ng-images/filters/graph-baset1-training.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngscopeclient/scopehal-docs/b44802c1542c8d79584818e641d405764eb1c636/ng-images/filters/graph-baset1-training.png -------------------------------------------------------------------------------- /ng-images/filters/graph-bus-heatmap.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngscopeclient/scopehal-docs/b44802c1542c8d79584818e641d405764eb1c636/ng-images/filters/graph-bus-heatmap.png -------------------------------------------------------------------------------- /ng-images/filters/graph-can.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngscopeclient/scopehal-docs/b44802c1542c8d79584818e641d405764eb1c636/ng-images/filters/graph-can.png -------------------------------------------------------------------------------- /ng-images/filters/graph-eye.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngscopeclient/scopehal-docs/b44802c1542c8d79584818e641d405764eb1c636/ng-images/filters/graph-eye.png -------------------------------------------------------------------------------- /ng-images/filters/graph-pcie-gen3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngscopeclient/scopehal-docs/b44802c1542c8d79584818e641d405764eb1c636/ng-images/filters/graph-pcie-gen3.png -------------------------------------------------------------------------------- /ng-images/filters/graph-tmds.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngscopeclient/scopehal-docs/b44802c1542c8d79584818e641d405764eb1c636/ng-images/filters/graph-tmds.png -------------------------------------------------------------------------------- /ng-images/filters/packet-can.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngscopeclient/scopehal-docs/b44802c1542c8d79584818e641d405764eb1c636/ng-images/filters/packet-can.png -------------------------------------------------------------------------------- /ng-images/filters/tmds.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngscopeclient/scopehal-docs/b44802c1542c8d79584818e641d405764eb1c636/ng-images/filters/tmds.png -------------------------------------------------------------------------------- /ng-images/graded-waveform.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngscopeclient/scopehal-docs/b44802c1542c8d79584818e641d405764eb1c636/ng-images/graded-waveform.png -------------------------------------------------------------------------------- /ng-images/graph-editor-addinput.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngscopeclient/scopehal-docs/b44802c1542c8d79584818e641d405764eb1c636/ng-images/graph-editor-addinput.png -------------------------------------------------------------------------------- /ng-images/graph-editor-create.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngscopeclient/scopehal-docs/b44802c1542c8d79584818e641d405764eb1c636/ng-images/graph-editor-create.png -------------------------------------------------------------------------------- /ng-images/graph-editor-group1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngscopeclient/scopehal-docs/b44802c1542c8d79584818e641d405764eb1c636/ng-images/graph-editor-group1.png -------------------------------------------------------------------------------- /ng-images/graph-editor-group2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngscopeclient/scopehal-docs/b44802c1542c8d79584818e641d405764eb1c636/ng-images/graph-editor-group2.png -------------------------------------------------------------------------------- /ng-images/graph-editor-properties.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngscopeclient/scopehal-docs/b44802c1542c8d79584818e641d405764eb1c636/ng-images/graph-editor-properties.png -------------------------------------------------------------------------------- /ng-images/graph-editor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngscopeclient/scopehal-docs/b44802c1542c8d79584818e641d405764eb1c636/ng-images/graph-editor.png -------------------------------------------------------------------------------- /ng-images/history.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngscopeclient/scopehal-docs/b44802c1542c8d79584818e641d405764eb1c636/ng-images/history.png -------------------------------------------------------------------------------- /ng-images/marker-multiview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngscopeclient/scopehal-docs/b44802c1542c8d79584818e641d405764eb1c636/ng-images/marker-multiview.png -------------------------------------------------------------------------------- /ng-images/markers.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngscopeclient/scopehal-docs/b44802c1542c8d79584818e641d405764eb1c636/ng-images/markers.png -------------------------------------------------------------------------------- /ng-images/overview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngscopeclient/scopehal-docs/b44802c1542c8d79584818e641d405764eb1c636/ng-images/overview.png -------------------------------------------------------------------------------- /ng-images/split-overlays.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngscopeclient/scopehal-docs/b44802c1542c8d79584818e641d405764eb1c636/ng-images/split-overlays.png -------------------------------------------------------------------------------- /ng-images/split-right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngscopeclient/scopehal-docs/b44802c1542c8d79584818e641d405764eb1c636/ng-images/split-right.png -------------------------------------------------------------------------------- /ng-images/tooltip-help.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngscopeclient/scopehal-docs/b44802c1542c8d79584818e641d405764eb1c636/ng-images/tooltip-help.png -------------------------------------------------------------------------------- /ng-images/tutorials/basics/connect-example.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngscopeclient/scopehal-docs/b44802c1542c8d79584818e641d405764eb1c636/ng-images/tutorials/basics/connect-example.png -------------------------------------------------------------------------------- /ng-images/tutorials/basics/connected.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngscopeclient/scopehal-docs/b44802c1542c8d79584818e641d405764eb1c636/ng-images/tutorials/basics/connected.png -------------------------------------------------------------------------------- /ng-images/tutorials/basics/first-waveform.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngscopeclient/scopehal-docs/b44802c1542c8d79584818e641d405764eb1c636/ng-images/tutorials/basics/first-waveform.png -------------------------------------------------------------------------------- /ng-images/tutorials/basics/moved-waveform.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngscopeclient/scopehal-docs/b44802c1542c8d79584818e641d405764eb1c636/ng-images/tutorials/basics/moved-waveform.png -------------------------------------------------------------------------------- /ng-images/tutorials/basics/zoomed-waveform.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngscopeclient/scopehal-docs/b44802c1542c8d79584818e641d405764eb1c636/ng-images/tutorials/basics/zoomed-waveform.png -------------------------------------------------------------------------------- /ng-images/vertical-cursor-x2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngscopeclient/scopehal-docs/b44802c1542c8d79584818e641d405764eb1c636/ng-images/vertical-cursor-x2.png -------------------------------------------------------------------------------- /ng-images/vertical-cursor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngscopeclient/scopehal-docs/b44802c1542c8d79584818e641d405764eb1c636/ng-images/vertical-cursor.png -------------------------------------------------------------------------------- /ng-images/workspace.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngscopeclient/scopehal-docs/b44802c1542c8d79584818e641d405764eb1c636/ng-images/workspace.png -------------------------------------------------------------------------------- /ng-images/workspace2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngscopeclient/scopehal-docs/b44802c1542c8d79584818e641d405764eb1c636/ng-images/workspace2.png -------------------------------------------------------------------------------- /ng-images/workspace3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngscopeclient/scopehal-docs/b44802c1542c8d79584818e641d405764eb1c636/ng-images/workspace3.png -------------------------------------------------------------------------------- /ng-images/y-axis.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngscopeclient/scopehal-docs/b44802c1542c8d79584818e641d405764eb1c636/ng-images/y-axis.png -------------------------------------------------------------------------------- /ng-images/y-divs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ngscopeclient/scopehal-docs/b44802c1542c8d79584818e641d405764eb1c636/ng-images/y-divs.png -------------------------------------------------------------------------------- /ngscopeclient-manual.tex: -------------------------------------------------------------------------------- 1 | \documentclass[11pt,letterpaper]{book} 2 | \usepackage[T1]{fontenc} 3 | \usepackage[margin=1in,top=0.6in,bottom=0.6in]{geometry} 4 | \usepackage[bookmarks,colorlinks=true,linkcolor=blue,urlcolor=blue]{hyperref} 5 | \usepackage{url} 6 | \usepackage{tabularx} 7 | \usepackage{graphicx} 8 | \usepackage{placeins} 9 | \usepackage{paralist} 10 | \usepackage{makecell} 11 | \usepackage{colortbl} 12 | \usepackage{zi4} 13 | \usepackage{float} 14 | \usepackage{textcomp} 15 | \usepackage{tocloft} 16 | \usepackage{gensymb} 17 | \usepackage{verbatim} 18 | \usepackage[libertine,cmbraces]{newtxmath} 19 | \usepackage{booktabs} 20 | 21 | \setlength{\parskip}{2mm} 22 | 23 | % configuration of source code examples 24 | \usepackage{listings} 25 | \lstset{language=c++} 26 | \lstset{numbers=left} 27 | \lstset{xleftmargin=2em} 28 | \lstset{framexleftmargin=2em} 29 | \lstset{belowskip=0em} 30 | \lstset{belowcaptionskip=0em} 31 | \lstset{tabsize=4} 32 | \lstset{frame=single} 33 | \lstset{breaklines=true} 34 | \lstset{showspaces=false} 35 | \lstset{showstringspaces=false} 36 | \lstset{showtabs=false} 37 | \lstset{breakatwhitespace=false} 38 | \lstset{basicstyle=\small\ttfamily} 39 | \lstset{columns=fullflexible} 40 | \lstset{prebreak=\textbackslash} 41 | \lstset{breakindent=0em} 42 | 43 | 44 | % standard colors for protocol decodes 45 | \usepackage{xcolor} 46 | \definecolor{control}{HTML}{c000a0} 47 | \definecolor{data}{HTML}{336699} 48 | \definecolor{address}{HTML}{ffff00} 49 | \definecolor{preamble}{HTML}{808080} 50 | \definecolor{checksumok}{HTML}{00ff00} 51 | \definecolor{checksumbad}{HTML}{ff0000} 52 | \definecolor{error}{HTML}{ff0000} 53 | \definecolor{idle}{HTML}{404040} 54 | 55 | \definecolor{protocmd}{HTML}{600050} 56 | \definecolor{protoctl}{HTML}{808000} 57 | \definecolor{protoread}{HTML}{336699} 58 | \definecolor{protowrite}{HTML}{339966} 59 | \definecolor{protoerror}{HTML}{800000} 60 | \definecolor{protostatus}{HTML}{000080} 61 | 62 | % table lines 63 | \setlength{\heavyrulewidth}{0.12em} 64 | \setlength{\lightrulewidth}{0.04em} 65 | \newcommand{\thickhline}{\toprule[\heavyrulewidth]} 66 | \newcommand{\thinhline}{\midrule[\lightrulewidth]} 67 | 68 | % fonts for formatting commands 69 | \newcommand{\menustyle}[1]{\texttt{#1}} 70 | \newcommand{\codestyle}[1]{\texttt{#1}} 71 | 72 | % table of contents configuration 73 | \setcounter{tocdepth}{2} 74 | \setlength{\cftsecnumwidth}{1.5cm} 75 | \setlength{\cftsubsecnumwidth}{1.5cm} 76 | 77 | % urls to issue trackers 78 | \newcommand{\issue}[2]{\href{https://github.com/ngscopeclient/#1/issues/#2}{#1:#2}} 79 | 80 | % helper for largeish images 81 | \usepackage{ifpdf} 82 | \ifpdf 83 | \newcommand{\bigimage}[1]{\includegraphics[width=16cm]{#1}} 84 | \else 85 | \newcommand{\bigimage}[1]{\includegraphics[width=1024px]{#1}} 86 | \fi 87 | 88 | \begin{document} 89 | 90 | \title{ngscopeclient Operator Manual} 91 | \author{Andrew D. Zonenberg} 92 | \date{\today} 93 | 94 | \maketitle 95 | 96 | \include{section-copyright} 97 | \frontmatter 98 | 99 | \mainmatter 100 | \tableofcontents 101 | 102 | \raggedbottom 103 | 104 | \include{section-intro} 105 | \include{section-legal} 106 | \include{section-gettingstarted} 107 | \include{section-tutorials} 108 | \include{section-mainwindow} 109 | \include{section-dialogs} 110 | \include{section-workspaces} 111 | \include{section-waveformgroups} 112 | \include{section-waveformviews} 113 | \include{section-history} 114 | \include{section-streambrowser} 115 | \include{section-grapheditor} 116 | \include{section-transports} 117 | \include{section-bert-drivers} 118 | \include{section-funcgen-drivers} 119 | \include{section-load-drivers} 120 | \include{section-meter-drivers} 121 | \include{section-misc-drivers} 122 | \include{section-scope-drivers} 123 | \include{section-sdr-drivers} 124 | \include{section-spectrometer-drivers} 125 | \include{section-powersupply-drivers} 126 | \include{section-rfgen-drivers} 127 | \include{section-vna-drivers} 128 | \include{section-triggers} 129 | \include{section-decodes} 130 | 131 | %\FloatBarrier 132 | %\include{section-timeline} 133 | %\include{section-protoanalyzer} 134 | %\include{section-exports} 135 | %\include{section-internals} 136 | 137 | \end{document} 138 | -------------------------------------------------------------------------------- /section-bert-drivers.tex: -------------------------------------------------------------------------------- 1 | \chapter{BERT Drivers} 2 | \label{sec:bert-drivers} 3 | 4 | This chapter describes all of the available drivers for bit error rate testers (BERTs) 5 | 6 | \section{Antikernel Labs} 7 | 8 | \begin{tabularx}{16cm}{lllX} 9 | \thickhline 10 | \textbf{Device Family} & \textbf{Driver} & \textbf{Transport} & \textbf{Notes} \\ 11 | \thickhline 12 | AKL-TXB1 & akl.crossbar & lan & \\ 13 | \thickhline 14 | \end{tabularx} 15 | 16 | \subsection{akl.crossbar} 17 | 18 | This is the driver for the \href{https://github.com/azonenberg/triggercrossbar}{AKL-TXB1} trigger crossbar and CDR 19 | trigger system. The front panel transceiver ports can also be used as a BERT. 20 | 21 | \section{MultiLANE} 22 | 23 | \begin{tabularx}{16cm}{lllX} 24 | \thickhline 25 | \textbf{Device Family} & \textbf{Driver} & \textbf{Transport} & \textbf{Notes} \\ 26 | \thickhline 27 | ML4039-BTP & mlbert & lan & Use \href{https://github.com/ngscopeclient/scopehal-mlbert-bridge}{scopehal-mlbert-bridge} \\ 28 | \thickhline 29 | \end{tabularx} 30 | 31 | \subsection{mlbert} 32 | 33 | This driver is intended to connect via the 34 | \href{https://github.com/ngscopeclient/scopehal-mlbert-bridge}{scopehal-mlbert-bridge} server for network transparency 35 | and does not directly link to the MultiLANE SDK or talk directly to the instrument. The bridge requires a Windows PC 36 | since MultiLANE's SDK is Windows only, however the libscopehal clientside driver can run on any supported OS. 37 | 38 | It was developed using a ML4039-BTP but may work with other similar models as well. 39 | -------------------------------------------------------------------------------- /section-copyright.tex: -------------------------------------------------------------------------------- 1 | Copyright \textcopyright 2012-\the\year{} Andrew D. Zonenberg and contributors. All rights reserved. \\ 2 | 3 | This document may be freely distributed and modified under the terms of the Creative Commons Attribution-ShareAlike 3.0 4 | Unported license (CC BY-SA 3.0). 5 | -------------------------------------------------------------------------------- /section-dialogs.tex: -------------------------------------------------------------------------------- 1 | \chapter{Dialogs} 2 | \label{sec:dialogs} 3 | 4 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 5 | 6 | \section{Lab Notes} 7 | \label{dlg:labnotes} 8 | 9 | The Lab Notes dialog allows you to take notes on your experimental setup. It contains two tabs: ``setup notes" 10 | and "general notes". 11 | 12 | The contents of the Setup Notes tab are displayed on the \hyperref[dlg:speedbump]{Speed Bump} dialog when loading a 13 | session file. The General Notes are only displayed within the Lab Notes dialog and are intended purely as a place for 14 | recording interesting observations made during the experiment. 15 | 16 | Minimal Markdown syntax (headings and bullets) is currently supported.\footnote{Images and links are supported by the 17 | Markdown renderer library but the integration to properly use them is not yet finished; tables are not supported but 18 | this will likely be added in the future.} 19 | 20 | Lab notes are saved as Markdown files in the data directory for the session and can be opened in any 21 | text editor or Markdown viewer. Note that they are overwritten each time the session is saved, so you should not modify 22 | them using an external tool while the session is open in ngscopeclient or your changes may be lost. 23 | 24 | \begin{figure}[H] 25 | \centering 26 | \bigimage{ng-images/dialog-labnotes.png} 27 | \caption{Lab notes dialog} 28 | \label{fig:labnotes} 29 | \end{figure} 30 | 31 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 32 | 33 | \section{Log Viewer} 34 | \label{dlg:logviewer} 35 | 36 | The Log Viewer dialog provides an alternate way to view log messages sent to stdout / stderr, which may be useful for 37 | debugging if the application was launched from a desktop icon or similar and there is no access to the console. 38 | 39 | It can be found under the \menustyle{Window | Log Viewer} menu. 40 | 41 | \begin{figure}[H] 42 | \centering 43 | \bigimage{ng-images/dialog-logviewer.png} 44 | \caption{Log Viewer dialog} 45 | \label{fig:logviewer} 46 | \end{figure} 47 | 48 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 49 | 50 | \section{Performance Metrics} 51 | \label{dlg:perfmetrics} 52 | 53 | The Performance Metrics dialog displays statistics on performance of rendering, waveform acquisition, and signal 54 | processing. This data is primarily intended for developers comparing before/after performance of optimizations and code 55 | changes. 56 | 57 | It can be found under the \menustyle{Window | Performance Metrics} menu. 58 | 59 | \begin{figure}[H] 60 | \centering 61 | \includegraphics[width=7cm]{ng-images/dialog-perfmetrics.png} 62 | \caption{Performance Metrics dialog} 63 | \label{fig:perfmetrics} 64 | \end{figure} 65 | 66 | \subsection{Rendering} 67 | 68 | Displays render loop framerate, monitor refresh rate, total time spent last frame in the rasterization and tone 69 | mapping shaders, and the number of vertices and indices drawn as Vulkan geometry. Note that waveforms are drawn by a 70 | compute shader and do not contribute towards the vertex/index totals, other than a single textured rectangle used for 71 | displaying the shader output. 72 | 73 | \subsection{Filter graph} 74 | Number of filter blocks in the current graph, and run time for the most recent evaluation of the 75 | filter graph. 76 | 77 | \subsection{Acquisition} 78 | 79 | Displays the acquisition rate, in waveforms per second. This data is collected using a rather simple mechanism and 80 | may not be usefully accurate if multiple trigger groups are in use. 81 | 82 | Additionally, this section displays the number of pending waveforms for each instrument (waveforms which have been 83 | acquired but not yet passed to the filter graph). This number should normally be flickering between zero and one if 84 | acquisition is active and zero otherwise; larger values indicate that the instrument is supplying data faster than 85 | ngscopeclient can process it. 86 | 87 | \subsection{Memory} 88 | 89 | Displays the total amount of available pinned memory (CPU-side memory eligible to be shared with the GPU) and local 90 | memory (memory attached to the GPU), as well as the amount of each currently in use. 91 | 92 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 93 | 94 | \section{Preferences} 95 | \label{dlg:preferences} 96 | 97 | The Preferences dialog allows you to configure various application settings which are not specific to a particular 98 | experimental setup. It can be found under the \menustyle{Setup | Preferences} menu. 99 | 100 | \begin{figure}[H] 101 | \centering 102 | \includegraphics[width=7cm]{ng-images/dialog-preferences.png} 103 | \caption{Preferences dialog} 104 | \label{prefs} 105 | \end{figure} 106 | 107 | \subsection{Appearance} 108 | 109 | This section allows you to configure fonts, colors, and other display settings for the application. 110 | 111 | % TODO: document all of these preferences once the list has stabilized a bit 112 | 113 | \subsection{Drivers} 114 | 115 | This section allows you to configure default configurations for various instrument drivers. 116 | 117 | \subsubsection{General} 118 | 119 | \begin{itemize} 120 | \item \emph{Headless scope default state}: When connecting to a headless oscilloscope (one without a front panel 121 | display), specify the set of channels which should be shown after connecting. 122 | \end{itemize} 123 | 124 | \subsubsection{Rigol DHO} 125 | 126 | \begin{itemize} 127 | \item \emph{Data Width} (default on): Specifies whether to use 8 bit or 16 bit transfer format when downloading samples 128 | from the instrument, or automatically decide based on hardware configuration. 129 | \end{itemize} 130 | 131 | \subsubsection{Siglent SDS HD} 132 | 133 | \begin{itemize} 134 | \item \emph{Data Width} (default on): Specifies whether to use 8 bit or 16 bit transfer format when downloading samples 135 | from the instrument, or automatically decide based on hardware configuration. 136 | \end{itemize} 137 | 138 | \subsubsection{Teledyne LeCroy} 139 | 140 | \begin{itemize} 141 | \item \emph{Force 16 bit mode} (default on): Always use 16-bit format for downloading data from the instrument, even if 142 | it only has an 8-bit ADC. This doubles the amount of network bandwidth required and may reduce waveforms-per-second 143 | performance, but provides smoother waveforms since the instrument performs DSP flatness correction leading to >256 144 | possible output values in a given waveform. 145 | \end{itemize} 146 | 147 | \subsection{Files} 148 | 149 | \begin{itemize} 150 | \item \emph{Max recent files}: Specify the number of files to display under the \menustyle{File | Recent Files} menu. 151 | \end{itemize} 152 | 153 | \subsection{Miscellaneous} 154 | 155 | \subsubsection{Menus} 156 | 157 | \begin{itemize} 158 | \item \emph{Recent instrument count}: Specify the number of recently used instruments to remember 159 | \end{itemize} 160 | 161 | \subsection{Power} 162 | 163 | \subsubsection{Events} 164 | 165 | This section provides settings allowing power vs performance tradeoffs. The default settings are appropriate for a 166 | desktop or laptop running on AC power; if running on a laptop with battery power you may wish to tune these to extend 167 | battery lifespan. 168 | 169 | \begin{itemize} 170 | \item \emph{Event loop mode}: Controls the operating mode for the main application event loop. 171 | \begin{itemize} 172 | \item In Performance mode, run at the screen refresh rate. This allows for the highest possible waveform processing rate 173 | and the smoothest interactivity, but may waste energy if you are spending a lot of time looking at the screen without 174 | actively acquiring or processing waveforms. 175 | \item In Power mode, run at a greatly reduced frequency (default 4 Hz but configurable by the Polling Timeout setting) 176 | unless a redraw is triggered by mouse movement or keyboard input. This will limit the rate of waveform acquisition and 177 | lead to a slightly jerkier user interface, but saves power. 178 | \end{itemize} 179 | \item \emph{Polling timeout}: If the event loop is in Power mode, specifies the timeout before the event loop will run 180 | if there is no user input. 181 | \end{itemize} 182 | 183 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 184 | 185 | \section{Speed Bump} 186 | \label{dlg:speedbump} 187 | 188 | The Speed Bump dialog is displayed when loading a session file online (reconnecting to and reconfiguring hardware), 189 | prior to committing changes to the instrument, if: 190 | 191 | \begin{itemize} 192 | \item The session file contains any user-created notes on the lab setup 193 | \item Any of the instrument settings in the session file do not match the current configuration of the corresponding 194 | instrument, and the direction of the change has potential to cause damage to the instrument or DUT (increasing output 195 | voltage, removing input attenuation, etc). 196 | \end{itemize} 197 | 198 | This is intended as a safeguard to prevent damaging hardware by accidentally loading the wrong session file. It also 199 | provides an opportunity to confirm that you have re-created the original experimental setup exactly if you are 200 | switching a lab bench between multiple projects and using saved sessions to restore instrument state. 201 | 202 | Pressing the Abort button cancels loading of the session without applying any of the potentially dangerous changes. 203 | The instruments may be partially reconfigured in this state, as some changes (such as sample rate or memory depth 204 | configuration) are always safe to make and thus may execute prior to the warning being displayed. 205 | 206 | Pressing the Proceed button allows ngscopeclient to proceed with loading the session and reconfiguring hardware. You 207 | must check the ``I have reviewed the instrument configuration" box in order to enable the Proceed button. 208 | 209 | \begin{figure}[H] 210 | \centering 211 | \bigimage{ng-images/dialog-speedbump.png} 212 | \caption{Speed Bump dialog} 213 | \label{speedbump} 214 | \end{figure} 215 | 216 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 217 | 218 | \section{Timebase} 219 | \label{dlg:timebase} 220 | 221 | The Timebase dialog allows you to configure sample rate and record length for oscilloscopes. It also provides control 222 | over functionally similar ``what to look at" settings for other instruments, such as center frequency and span for 223 | spectrum analyzers or sweep range and point count for vector network analyzers. 224 | 225 | It can be found under the \menustyle{Setup | Timebase} menu. 226 | 227 | \begin{figure}[H] 228 | \centering 229 | \includegraphics[width=7cm]{ng-images/dialog-timebase.png} 230 | \caption{Timebase dialog} 231 | \label{timebase} 232 | \end{figure} 233 | -------------------------------------------------------------------------------- /section-funcgen-drivers.tex: -------------------------------------------------------------------------------- 1 | \chapter{Function Generator Drivers} 2 | \label{sec:funcgen-drivers} 3 | 4 | This chapter describes all of the available drivers for standalone function generators. 5 | 6 | Function generators which are part of an oscilloscope are described in the \hyperref[sec:scope-drivers]{Oscilloscope 7 | Drivers} section. 8 | 9 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 10 | 11 | \section{Owon} 12 | 13 | \begin{tabularx}{16cm}{lllX} 14 | \thickhline 15 | \textbf{Device Family} & \textbf{Driver} & \textbf{Transport} & \textbf{Notes} \\ 16 | \thickhline 17 | XDG 2000/3000 series & owon\_xdg & lan/usbtmc & Only tested via lan transport, but USBTMC is available too.\\ 18 | \thickhline 19 | \end{tabularx} 20 | 21 | \subsection{owon\_xdg} 22 | 23 | This driver supports all XDG 2000/3000 series function / arbitrary waveform generators. 24 | 25 | It has been tested on an Owon XDG 2035. 26 | 27 | The default communication port for lan is 3000. 28 | 29 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 30 | 31 | \section{Rigol} 32 | 33 | \begin{tabularx}{16cm}{lllX} 34 | \thickhline 35 | \textbf{Device Family} & \textbf{Driver} & \textbf{Transport} & \textbf{Notes} \\ 36 | \thickhline 37 | DG4000 series & rigol\_awg & lan & Only tested via lan transport, but USBTMC and serial are available too\\ 38 | \thickhline 39 | \end{tabularx} 40 | 41 | \subsection{rigol\_awg} 42 | 43 | This driver supports all DG4000 series function / arbitrary waveform generators. 44 | 45 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 46 | 47 | \section{Siglent} 48 | 49 | \begin{tabularx}{16cm}{lllX} 50 | \thickhline 51 | \textbf{Device Family} & \textbf{Driver} & \textbf{Transport} & \textbf{Notes} \\ 52 | \thickhline 53 | SDG2000X series & siglent\_awg & lan & Only tested via lan transport, but USBTMC is available too\\ 54 | \thickhline 55 | \end{tabularx} 56 | 57 | \subsection{siglent\_sdg} 58 | 59 | This driver supports the SDG2000X series and possibly higher end models as well. 60 | -------------------------------------------------------------------------------- /section-gettingstarted.tex: -------------------------------------------------------------------------------- 1 | \chapter{Getting Started} 2 | 3 | \section{Host System Requirements} 4 | 5 | The majority of development is performed on Linux operating systems (primarily Debian) so this is the most well 6 | tested platform, however Windows and Mac OS are also supported. 7 | 8 | Any 64-bit Intel or AMD processor, or Apple Silicon Mac, should be able to run ngscopeclient. If AVX2 and/or AVX512F 9 | support is present ngscopeclient will use special optimized versions of some signal processing functions, however 10 | neither instruction set is required. Other (non Apple Silicon) ARM64 platforms may work if a compatible GPU is 11 | available, but have not been tested. We don't actively test on 32-bit platforms due to the significant RAM 12 | requirements, but we won't stop you from trying and would love to hear if you get it working. 13 | 14 | A mouse with scroll wheel, or touchpad with scroll gesture support, is mandatory to enable full use of the UI. We may 15 | explore alternative input methods for some UI elements in the future. 16 | 17 | Any GPU with Vulkan support should be able to run ngscopeclient, however Vulkan 1.2 will deliver better performance. 18 | The minimum supported GPUs are: 19 | \begin{itemize} 20 | \item NVIDIA: Maxwell architecture (GeForce GTX 700 series and newer, February 2014) 21 | \item AMD: GCN based (Radeon HD 7000 and newer, January 2012) 22 | \item Intel: Iris Plus 540 or HD Graphics 520 (Skylake, August 2015) 23 | \item Apple: all Apple Silicon devices (M1 and newer). Newer Intel devices with Metal support should work but have not 24 | been tested. 25 | \end{itemize} 26 | 27 | Note that many virtual machine graphics stacks (e.g. VMWare) do not provide Vulkan unless a PCIe passthrough GPU is 28 | being used. 29 | 30 | The minimum RAM requirement to launch ngscopeclient is relatively small; however, actual memory consumption is 31 | heavily dependent on workload and can easily reach into the tens of gigabytes when doing complex analysis on many 32 | channels with deep history. 33 | 34 | Typical RAM consumption examples: 35 | \begin{itemize} 36 | \item Default configuration with demo scope (4 channels 100K points, 10 waveforms of history, no analysis): 250 MB 37 | \item 4M point live streaming with 10 waveforms of history, eye pattern, 8B/10B decode, and jitter histogram: 650 MB 38 | \item Single 512M point waveform, no analysis or history: 2.1 GB 39 | \item 512M point P/N channel waveforms with CDR and eye pattern, no history: 8.3 GB 40 | \end{itemize} 41 | 42 | Large amounts of GPU RAM are required for working with deep waveforms, especially if you intend to perform 43 | complex analysis on them. Analog waveforms are stored in 32-bit floating point format internally, so a single 256 44 | megapoint waveform will consume 1GB of GPU memory. Intermediate results in multi-step filter pipelines require GPU 45 | memory as well, even if not displayed. 46 | 47 | The maximum supported waveform size depends on your Vulkan implementation but is typically $2^32$ bytes (4 GB). This 48 | translates to one gigapoint analog or four gigapoints digital. 49 | 50 | \section{Instrument Support} 51 | 52 | ngscopeclient uses the libscopehal library to communicate with instruments, so any libscopehal-compatible hardware 53 | should work with ngscopeclient. See the \hyperref[sec:scope-drivers]{Oscilloscope Drivers} section for more details on 54 | which hardware is supported and how to configure specific drivers. 55 | 56 | \section{Installation} 57 | 58 | \subsection{Official Releases} 59 | 60 | Prebuilt binary packages are available for some of our supported platforms. 61 | 62 | The latest released binaries can be downloaded from GitHub at (FIXME url here). 63 | 64 | \subsection{Development Builds} 65 | 66 | If you are feeling adventurous and want to try bleeding-edge code, or are testing a fix at a developer's request, 67 | packages for a limited set of platforms (currently Ubuntu 20.04, 22.04, 24.04, and Windows) are automatically built 68 | each commit as part of the GitHub CI pipeline. 69 | 70 | To access development packages, log into GitHub (sorry, development binaries are not available to 71 | anonymous users - this is on GitHub's end and not under our control) and go to 72 | \url{https://github.com/ngscopeclient/scopehal-apps/actions}. Select build-ubuntu or build-windows as appropriate, 73 | click the commit you wish to test, and download the appropriate .msi or .deb package. 74 | 75 | \section{Compilation} 76 | 77 | ngscopeclient can be compiled on Linux, macOS, and Windows. While the compilation process is generally similar, various 78 | steps differ among platform and distro. 79 | 80 | \subsection{Linux} 81 | \begin{enumerate} 82 | 83 | \item Install dependencies. 84 | 85 | \subsubsection{Debian} 86 | 87 | Basic requirements: 88 | \begin{lstlisting}[language=sh, numbers=none] 89 | sudo apt-get install build-essential git cmake pkgconf libgtkmm-3.0-dev \ 90 | libsigc++-2.0-dev libyaml-cpp-dev catch2 libglfw3-dev curl xzip libhidapi-dev 91 | \end{lstlisting} 92 | 93 | On Debian bookworm and later, you can use system-provided Vulkan packages. Skip this on Debian bullseye, or if you 94 | choose to use the Vulkan SDK instead: 95 | \begin{lstlisting}[language=sh, numbers=none] 96 | sudo apt-get install libvulkan-dev glslang-dev glslang-tools spirv-tools glslc 97 | \end{lstlisting} 98 | 99 | On Debian bullseye, you will need cmake from backports: 100 | \begin{lstlisting}[language=sh, numbers=none] 101 | sudo bash -c 'echo "deb http://deb.debian.org/debian bullseye-backports main" >> \ 102 | /etc/apt/sources.list.d/bullseye-backports.list' 103 | sudo apt-get update 104 | sudo apt-get install cmake/bullseye-backports 105 | \end{lstlisting} 106 | 107 | To build the LXI component (needed if you have LXI- or VXI-11-based instruments): 108 | \begin{lstlisting}[language=sh, numbers=none] 109 | sudo apt install liblxi-dev libtirpc-dev 110 | \end{lstlisting} 111 | 112 | For GPIB, you will need to install Linux-GPIB; instructions for this are out of scope here. 113 | 114 | To build the documentation, you will also need LaTeX packages: 115 | \begin{lstlisting}[language=sh, numbers=none] 116 | sudo apt install texlive texlive-fonts-extra texlive-extra-utils 117 | \end{lstlisting} 118 | 119 | \subsubsection{Ubuntu} 120 | 121 | Basic requirements: 122 | \begin{lstlisting}[language=sh, numbers=none] 123 | sudo apt install build-essential git cmake pkgconf libgtkmm-3.0-dev \ 124 | libsigc++-2.0-dev libyaml-cpp-dev catch2 libglfw3-dev curl xzip libhidapi-dev 125 | \end{lstlisting} 126 | 127 | On Ubuntu 22.10 and earlier (including 20.04 and 22.04), you will need to use the Vulkan SDK. 128 | Instructions for installing this are in a later step. On Ubuntu 23.04 and later, you can instead 129 | use system-provided Vulkan packages: 130 | \begin{lstlisting}[language=sh, numbers=none] 131 | sudo apt-get install libvulkan-dev glslang-dev glslang-tools spirv-tools glslc 132 | \end{lstlisting} 133 | 134 | 135 | To build the LXI component (needed if you have LXI- or VXI-11-based instruments): 136 | \begin{lstlisting}[language=sh, numbers=none] 137 | sudo apt install liblxi-dev libtirpc-dev 138 | \end{lstlisting} 139 | 140 | For GPIB, you will need to install Linux-GPIB; instructions for this are out of scope here. 141 | 142 | To build the documentation, you will also need LaTeX packages: 143 | \begin{lstlisting}[language=sh, numbers=none] 144 | sudo apt install texlive texlive-fonts-extra texlive-extra-utils 145 | \end{lstlisting} 146 | 147 | 148 | \subsubsection{Fedora} 149 | Basic requirements: 150 | \begin{lstlisting}[language=sh, numbers=none] 151 | sudo dnf install git gcc g++ cmake make pkgconf gtk3-devel \ 152 | libsigc++30-devel yaml-cpp-devel catch-devel glfw-devel hidapi-devel 153 | \end{lstlisting} 154 | 155 | System-provided Vulkan packages. Skip these if you choose to use the Vulkan SDK instead: 156 | \begin{lstlisting}[language=sh, numbers=none] 157 | sudo dnf install vulkan-headers vulkan-loader-devel glslang-devel glslc \ 158 | libshaderc-devel spirv-tools-devel 159 | \end{lstlisting} 160 | 161 | To build the LXI component (needed if you have LXI- or VXI-11-based instruments): 162 | \begin{lstlisting}[language=sh, numbers=none] 163 | sudo dnf install liblxi-devel libtirpc-devel 164 | \end{lstlisting} 165 | 166 | For GPIB, you will need to install Linux-GPIB; instructions for this are out of scope here. 167 | 168 | To build the documentation, you will also need LaTeX packages: 169 | \begin{lstlisting}[language=sh, numbers=none] 170 | sudo dnf install texlive 171 | \end{lstlisting} 172 | 173 | \subsubsection{Alpine Linux} 174 | 175 | As Alpine Linux uses musl libc, you will need to use system-provided Vulkan packages, and not the Vulkan SDK. 176 | \begin{lstlisting}[language=sh, numbers=none] 177 | apk add git gcc g++ cmake make pkgconf gtk+3.0-dev libsigc++-dev \ 178 | yaml-cpp-dev catch2-3 vulkan-loader-dev glslang-dev glslang-static glfw-dev \ 179 | shaderc-dev spirv-tools-dev libhidapi-dev 180 | \end{lstlisting} 181 | 182 | If you are using an older stable release (such as CentOS 7), you may need to install some dependencies from source. 183 | 184 | \item Install Vulkan SDK: 185 | 186 | In many cases, you can install the SDK components from distro-provided repositories, which is covered above. When 187 | possible, this is preferred over installing the Vulkan SDK. If you choose not to, or are running a Linux distro that 188 | does not provide these packages (for instance, Debian Bullseye, Ubuntu versions prior to 23.04, or other stable 189 | distros), the following instructions cover installing and loading the Vulkan SDK. 190 | 191 | The latest tested SDK at the time of documentation update is version 1.3.275.0. Newer SDKs are supported, but breaking 192 | changes sometimes take place. 193 | If you are using a newer SDK and run into problems, please file a bug report. 194 | 195 | If you are using Ubuntu 20.04 or 22.04, you may install the 196 | \href{https://packages.lunarg.com}{.deb packaged SDK release} instead of following the instructions below. This may 197 | work for Debian as well but is not supported. 198 | 199 | Alternatively, to use the tarball packaged SDK, download and unpack the tarball. 200 | \href{https://vulkan.lunarg.com/sdk/home}{You can manually download the SDK}, or do the following: 201 | \begin{lstlisting}[language=sh, numbers=none] 202 | cd ~ 203 | mkdir VulkanSDK 204 | cd VulkanSDK 205 | curl -LO 'https://vulkan.lunarg.com/sdk/download/1.3.275.0/linux/vulkansdk-linux-x86_64-1.3.275.0.tar.xz' 206 | tar xfv vulkansdk-linux-x86_64-1.3.275.0.tar.xz 207 | \end{lstlisting} 208 | 209 | And then source the `setup-env.sh` file: 210 | \begin{lstlisting}[language=sh, numbers=none] 211 | source "$HOME/VulkanSDK/1.3.275.0/setup-env.sh" 212 | \end{lstlisting} 213 | 214 | When using the tarball-packaged SDK, you will need to source the `setup-env.sh` file any time you want to compile 215 | or run ngscopeclient. For convenience, you can add this to your `.bash\_profile` or equivalent: 216 | \begin{lstlisting}[language=sh, numbers=none] 217 | echo "source \"$HOME/VulkanSDK/1.3.275.0/setup-env.sh\"" >> ~/.bash_profile 218 | \end{lstlisting} 219 | 220 | \item Build scopehal and scopehal-apps: 221 | 222 | \begin{lstlisting}[language=sh, numbers=none] 223 | cd ~ 224 | git clone --recursive https://github.com/ngscopeclient/scopehal-apps.git 225 | cd scopehal-apps 226 | mkdir build 227 | cd build 228 | cmake .. -DCMAKE_BUILD_TYPE=Release 229 | make -j4 230 | \end{lstlisting} 231 | 232 | \end{enumerate} 233 | 234 | \subsection{macOS} 235 | \begin{enumerate} 236 | 237 | \item Install dependencies. 238 | 239 | You will need Xcode (either from the App Store or the Apple developer site); after installing, run it once for it 240 | to install system components. This provides gcc, g++, make, and similar required packages. 241 | 242 | With Homebrew (\href{https://brew.sh}{brew.sh}): 243 | 244 | \item Basic requirements: 245 | \begin{lstlisting}[language=sh, numbers=none] 246 | brew install pkg-config libsigc++ glfw cmake yaml-cpp glew catch2 libomp hidapi libpng 247 | \end{lstlisting} 248 | 249 | \item Vulkan SDK components (skip if using the Vulkan SDK): 250 | \begin{lstlisting}[language=sh, numbers=none] 251 | brew install vulkan-headers vulkan-loader glslang shaderc spirv-tools molten-vk 252 | \end{lstlisting} 253 | 254 | \item Alternatively, install the Vulkan SDK: 255 | 256 | \href{https://vulkan.lunarg.com/sdk/home}{Download and install the Vulkan SDK.}. 257 | The latest tested SDK at the time of documentation update is version 1.3.275.0. Newer SDKs are supported, but breaking 258 | changes sometimes take place. 259 | If you are using a newer SDK and run into problems, please file a bug report. 260 | 261 | And then source the `setup-env.sh` file: 262 | \begin{lstlisting}[language=sh, numbers=none] 263 | source "$HOME/VulkanSDK/1.3.275.0/setup-env.sh" 264 | \end{lstlisting} 265 | 266 | When using the SDK, you will need to source the `setup-env.sh` file any time you want to compile or run ngscopeclient. 267 | For convenience, you can add this to your `.zprofile` or equivalent: 268 | \begin{lstlisting}[language=sh, numbers=none] 269 | echo "source \"$HOME/VulkanSDK/1.3.275.0/setup-env.sh\"" >> ~/.zprofile 270 | \end{lstlisting} 271 | 272 | \item Build scopehal and scopehal-apps: 273 | 274 | \begin{lstlisting}[language=sh, numbers=none] 275 | cd ~ 276 | git clone --recursive https://github.com/ngscopeclient/scopehal-apps.git 277 | cd scopehal-apps 278 | mkdir build 279 | cd build 280 | cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_PREFIX_PATH="$(brew --prefix);$(brew --prefix)/opt/libomp" 281 | make -j4 282 | \end{lstlisting} 283 | 284 | \end{enumerate} 285 | 286 | \subsection{Windows} 287 | 288 | On Windows, we make use of the MSYS2 development environment, which gives us access to the MingGW-w64 toolchain. 289 | Since this toolchain allows ngscopeclient to be compiled as a native Windows application, the project might be run 290 | outside of MSYS2. 291 | 292 | \subsubsection{Building from source} 293 | 294 | \begin{enumerate} 295 | 296 | \item Download and install MSYS2. You can download it from \href{https://www.msys2.org/}{msys2.org} or 297 | \href{https://github.com/msys2/msys2-installer/releases}{github.com/msys2/msys2-installer/releases}\\ 298 | 299 | 300 | The following steps can be done in any MSYS-provided shell. 301 | 302 | % \item If you would like to build the installer package, install WIX Toolset from https://wixtoolset.org/docs/wix3/ 303 | 304 | \item Install git and the toolchain: 305 | \begin{lstlisting}[language=sh, numbers=none] 306 | pacman -S git wget mingw-w64-ucrt-x86\_64-cmake mingw-w64-ucrt-x86\_64-toolchain 307 | \end{lstlisting} 308 | 309 | \item Install general dependencies: 310 | \begin{lstlisting}[language=sh, numbers=none] 311 | pacman -S mingw-w64-ucrt-x86\_64-libsigc++ mingw-w64-ucrt-x86\_64-yaml-cpp mingw-w64-ucrt-x86\_64-glfw mingw-w64-ucrt-x86\_64-catch mingw-w64-ucrt-x86\_64-hidapi mingw-w64-ucrt-x86\_64-libpng 312 | \end{lstlisting} 313 | 314 | \item Install Vulkan dependencies: 315 | \begin{lstlisting}[language=sh, numbers=none] 316 | pacman -S mingw-w64-ucrt-x86\_64-vulkan-headers mingw-w64-ucrt-x86\_64-vulkan-loader mingw-w64-ucrt-x86\_64-shaderc \ 317 | mingw-w64-ucrt-x86\_64-glslang mingw-w64-ucrt-x86\_64-spirv-tools 318 | \end{lstlisting} 319 | 320 | \item Install FFTS: 321 | \begin{lstlisting}[language=sh, numbers=none] 322 | pacman -S mingw-w64-ucrt-x86\_64-ffts 323 | \end{lstlisting} 324 | 325 | 326 | \item Check out the code 327 | 328 | \begin{lstlisting}[language=sh, numbers=none] 329 | cd ~ 330 | git clone --recursive https://github.com/ngscopeclient/scopehal-apps 331 | \end{lstlisting} 332 | 333 | All following steps are to be done in a UCRT64 shell. 334 | 335 | \item Build manually: 336 | \begin{lstlisting}[language=sh, numbers=none] 337 | cd scopehal-apps 338 | mkdir build 339 | cd build 340 | cmake .. 341 | ninja -j4 342 | \end{lstlisting} 343 | 344 | \item Optional, to build MSI installer: 345 | 346 | Download and install WiX Toolset.\\ 347 | You can download it from \href{https://github.com/wixtoolset/wix3/releases}{https://github.com/wixtoolset/wix3/releases}\\ 348 | If you install it to the path \texttt{"C:\textbackslash Program Files (x86)\textbackslash WiX Toolset v3.14"} run the following cmake command instead of \texttt{cmake ..} mentioned earlier: 349 | 350 | \begin{lstlisting}[language=sh, numbers=none] 351 | cmake .. -DWIXPATH="C:\Program Files (x86)\WiX Toolset v3.14\bin" 352 | \end{lstlisting} 353 | 354 | \texttt{ninja} compilation will now generate the installer after binaries. 355 | 356 | % \item Alternatively, Execute makepkg-mingw in subdir MSYS2: 357 | 358 | % \begin{lstlisting}[language=sh, numbers=none] 359 | % cd ~/scopehal-apps/msys2 360 | 361 | % MINGW\_ARCH=mingw64 makepkg-mingw --noconfirm --noprogressbar -sCLf 362 | % \end{lstlisting} 363 | 364 | % !and remove the -DBUILD\_TESTING=OFF flag from the PKGBUILD recipe in subdir 365 | % msys2. 366 | 367 | % \item Installing, copying binaries and running ngscopeclient. 368 | 369 | % Since ngscopeclient is built using the MinGW toolchain, it depends on a rather large number of dynamic libraries. 370 | % The recommended procedure is to install the package generated by makepkg-mingw on a MinGW64 shell: 371 | 372 | % MSVC build 373 | 374 | % Install vcpkg 375 | % Integrate vcpkg - vcpkg integrate install 376 | 377 | % run cmake (replace VCPKG_ROOT with the install path of vcpkg): 378 | % cmake -B build -S . -DCMAKE_TOOLCHAIN_FILE=VCPKG_ROOT\scripts\buildsystems\vcpkg.cmake 379 | 380 | % Open Visual Studio and build the software. 381 | 382 | % \begin{lstlisting}[language=sh, numbers=none] 383 | % cd ~ 384 | % cd msys2 385 | % pacman -U *.zst 386 | % \end{lstlisting} 387 | 388 | % This is equivalent to the package installed through \lstinline{pacman -S}, but it's built from the checked out commit, 389 | % instead of the pinned version available from MSYS2 repositories. 390 | 391 | % The \lstinline{*.zst} package includes metadata about the dependencies. 392 | % Therefore, when installed through \lstinline{pacman}, those will be installed automatically. 393 | % However, some users might want to use ngscopeclient outside of MSYS2. 394 | % In those cases, it needs to be installed first, and then a tarball/zipfile can be created by collecting all the dependencies. 395 | % This last approach is not officially supported yet. 396 | 397 | \item Run scopehal and scopehal-apps: 398 | 399 | Building scopehal and scopehal-apps with MSYS2 will install requierd dependencies in MSYS2's libpath, that's why ngscopeclient has to be launched from a MSYS2 shell (use MSI installer to generate a standalone package). 400 | 401 | The binaries can be found in the build directory, such as ngscopeclient in \$HOME/scopehal-apps/build/src/ngscopeclient. 402 | 403 | Use the following commands to run ngscopeclient: 404 | \begin{lstlisting}[language=sh, numbers=none] 405 | cd src/ngscopeclient/ 406 | ./ngscopeclient.exe 407 | \end{lstlisting} 408 | 409 | Or with some debug options: 410 | \begin{lstlisting}[language=sh, numbers=none] 411 | ./ngscopeclient.exe --debug --trace SCPISocketTransport 412 | \end{lstlisting} 413 | 414 | 415 | 416 | \end{enumerate} 417 | 418 | \section{Running ngscopeclient} 419 | 420 | When running ngscopeclient with no arguments, an empty session (Fig. \ref{empty-window}) is created. To perform useful 421 | work, you can: 422 | \begin{itemize} 423 | \item Open a saved session and reconnect to the instruments (\menustyle{File | Open Online}) 424 | \item Open a saved session without reconnecting to the instruments (\menustyle{File | Open Offline}) 425 | \item Open a recently used session (\menustyle{File | Recent Files}) 426 | \item Import waveforms from a third party file format(\menustyle{Add | Import}) 427 | \item Connect to an instrument (\menustyle{Add | Oscilloscope}, \menustyle{Add | Multimeter}, etc.) 428 | \item Generate a synthetic waveform (\menustyle{Add | Generate}) 429 | \end{itemize} 430 | 431 | \begin{figure}[h] 432 | \centering 433 | \includegraphics[width=12cm]{ng-images/empty-window.png} 434 | \caption{Empty ngscopeclient session} 435 | \label{empty-window} 436 | \end{figure} 437 | 438 | % TODO: add this section once these are implemented 439 | \begin{comment} 440 | 441 | \subsection{Configuration arguments} 442 | 443 | Most of these arguments are intended for developers, but they can help troubleshoot unusual bugs. 444 | 445 | \begin{itemize} 446 | 447 | \item \texttt{-{}-noavx2}\\ 448 | Do not use AVX2 vector optimizations even if the CPU supports it. 449 | 450 | \item \texttt{-{}-noavx512f}\\ 451 | Do not use AVX512F vector optimizations even if the CPU supports it. 452 | 453 | \item \texttt{-{}-noglint64}\\ 454 | Do not use \texttt{GL\_ARB\_gpu\_shader\_int64} even if the GPU supports it. 455 | 456 | \item \texttt{-{}-nogpufilter}\\ 457 | Do not use Vulkan (GPU accelerated) implementations of filter blocks, revert to software fallback. 458 | 459 | \end{itemize} 460 | 461 | \end{comment} 462 | 463 | \subsection{Console verbosity arguments} 464 | 465 | ngscopeclient takes standard liblogtools arguments for controlling console debug verbosity. 466 | 467 | If no verbosity level is specified, the default is ``notice" (3). (We suggest using \texttt{-{}-debug} for routine use 468 | until the v1.0 release to aid in troubleshooting.) 469 | 470 | \begin{itemize} 471 | 472 | \item \texttt{-{}-debug}\\ 473 | Sets the verbosity level to ``debug" (5). 474 | 475 | \item \texttt{-l [file]}, \texttt{-{}-logfile [file]}\\ 476 | Writes a copy of all log messages to \texttt{file}. This is preferred over simply redirecting output with pipes, as 477 | console escape sequences are stripped from the file log output. 478 | 479 | \item \texttt{-L [file]}, \texttt{-{}-logfile-lines [file]}\\ 480 | Same as \texttt{-{}-logfile} except line buffering is turned on. 481 | 482 | \item \texttt{-q}, \texttt{-{}-quiet}\\ 483 | Reduces the verbosity level by one. Can be specified more than once to lower verbosity by several steps. 484 | 485 | \item \texttt{-{}-trace [class]}, \texttt{-{}-trace [class::function]} \\ 486 | Enables extra debug output from the class \texttt{class} or the function \texttt{class::function}. Has no effect unless 487 | \texttt{-{}-debug} is also specified. 488 | 489 | \item \texttt{-{}-stdout-only}\\ 490 | Sends all logging output to stdout. By default, error (level 1) and warning (level 2) messages go to stderr. 491 | 492 | \item \texttt{-{}-verbose}\\ 493 | Sets the verbosity level to ``verbose" (4). 494 | 495 | \end{itemize} 496 | 497 | % TODO: add this section once these are implemented 498 | \begin{comment} 499 | \subsection{File arguments} 500 | \label{import} 501 | 502 | The file extension is used to determine the format. File extensions are case sensitive and must be lowercase to be 503 | correctly interpreted. 504 | 505 | \begin{itemize} 506 | \item \texttt{[file.scopesession]} 507 | Loads a saved session. 508 | 509 | \item \texttt{[file.bin]} \\ 510 | Imports waveform data from the binary format used by Agilent, Keysight, and Rigol oscilloscopes. 511 | 512 | \item \texttt{[file.complex]} \\ 513 | Imports complex I/Q data from a file. The file must contain interleaved (I, Q) pairs in either 8-bit signed/unsigned 514 | integer, 16-bit signed integer, 32-bit normalized floating point, or 64-bit normalized floating point format. 515 | 516 | The default format is 8 bit signed integer and may be changed from the filter graph editor or channel properties dialog 517 | once the file is loaded. There is currently no way to specify other formats on the command line. 518 | 519 | \item \texttt{[file.csv]} \\ 520 | Imports sample data from a CSV (comma-separated-value) file. More than one CSV file can be loaded at once (displayed as 521 | separate points in history) by specifying multiple file names as long as they have identical column schemas. 522 | 523 | Lines starting with a '\#' character are treated as comments and generally ignored by the parser. (If the comment format 524 | matches that used by Digilent's WaveForms utility, timestamps and other metadata are extracted from the comments.) 525 | 526 | If the first row of the CSV contains non-numeric characters, it is treated as a header row. Header content in the 527 | timestamp column is ignored; headers in other columns are used as channel names in the imported waveform. 528 | 529 | The first column of the CSV must contain sample timestamps, in seconds. Scientific notation is supported. Timestamps 530 | must be monotonic (each row must have a timestamp strictly greater than that of the previous row). 531 | 532 | ngscopeclient uses a heuristic to detect uniformly sampled waveforms, which enabled certain optimizations for display 533 | and signal processing. If the standard deviation of intervals between samples is less than 1\% of the average sample 534 | interval, the waveform is assumed to be uniformly sampled and timestamps are rounded to the nearest multiple of the 535 | average interval. If the deviation is greater, the waveform is assumed to be sparsely sampled and timestamps are not 536 | modified. 537 | 538 | \item \texttt{[file.trc]} \\ 539 | Imports waveform data from a Teledyne LeCroy .trc binary waveform file. 540 | 541 | \item \texttt{[file.vcd]} \\ 542 | Imports digital waveform data from a VCD (value change dump) file, typically created by a logic analyzer or HDL 543 | simulator. 544 | 545 | \item \texttt{[file.wav]} \\ 546 | Imports sample data from a WAV file. 547 | 548 | \item \texttt{[file.wfm]} \\ 549 | Imports sample data from a Tektronix .wfm file. This import filter is still experimental and may not support all 550 | features of the .wfm file format yet. If you have trouble importing some .wfm files please file a ticket on GitHub. 551 | 552 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 553 | 554 | \item \texttt{-{}-nodata}\\ 555 | When loading a .scopesession file, load settings only and not saved waveform data. 556 | 557 | \item \texttt{-{}-reconnect}\\ 558 | When loading a .scopesession file, reconnect to the instrument and resume remote control. Current instrument settings 559 | are overwritten with the configuration from the saved session. 560 | 561 | \item \texttt{-{}-retrigger}\\ 562 | When loading a .scopesession file, arm the trigger immediately. has no effect unless \texttt{-{}-reconnect} is also 563 | specified. 564 | 565 | \end{itemize} 566 | 567 | \subsection{Instrument arguments} 568 | 569 | Example: 570 | \begin{lstlisting}[language=sh, numbers=none] 571 | ./ngscopeclient --debug \ 572 | mylecroy:lecroy:vicp:myscope.example.com:1234 \ 573 | myrigol:rigol:lan:rigol.example.com 574 | \end{lstlisting} 575 | 576 | \begin{itemize} 577 | \item \texttt{[connection string]} \\ 578 | Connects to the specified instrument. By default, all channels are enabled and displayed. 579 | 580 | \end{itemize} 581 | 582 | Each instrument is described by a ``connection string" containing four colon-separated fields. 583 | 584 | \begin{itemize} 585 | \item Nickname. This can be any text string not containing spaces or colons. If you have only one instrument it's 586 | largely ignored, but when multiple instruments are present channel names in the UI are prefixed with the nickname to 587 | avoid ambiguity. 588 | \item Driver name. This is a string identifying the command protocol the scope uses. Note that not all 589 | scopes from the same vendor will use the same command set or driver! 590 | \item Transport. This is is a string describing how the driver connects to the scope (e.g. RS232 or Ethernet) 591 | \item Arguments for the driver identifying the device to connect to, separated by colons. This varies by driver but is 592 | typically a hostname:port combination, TTY device path, or similar. 593 | \end{itemize} 594 | 595 | \end{comment} 596 | -------------------------------------------------------------------------------- /section-grapheditor.tex: -------------------------------------------------------------------------------- 1 | \chapter{Filter Graph Editor} 2 | \label{grapheditor} 3 | 4 | \section{Introduction} 5 | 6 | The filter graph editor allows complex signal processing pipelines to be developed in a graphical fashion. It may be 7 | accessed from the \menustyle{Window | Filter Graph} menu item. 8 | 9 | The graph editor view (Fig. \ref{graph-editor}) shows nodes for every instrument channel, trigger, and filter block 10 | used in the current session. Additional nodes for inactive channels appear 11 | 12 | Nodes cannot overlap and will automatically move out of the way if 13 | another node is dragged on top of them. 14 | 15 | \begin{figure}[H] 16 | \centering 17 | \bigimage{ng-images/graph-editor.png} 18 | \caption{Filter graph editor showing instrument channels and several processing blocks} 19 | \label{graph-editor} 20 | \end{figure} 21 | 22 | \section{Interaction} 23 | 24 | The view may be zoomed with the mouse wheel, or panned by dragging with the right mouse button, to navigate large 25 | filter graphs which do not fit on a single screen at a reasonable zoom level. Right clicking on a node opens a pop-up 26 | properties view (Fig. \ref{graph-editor-properties}). 27 | 28 | \begin{figure}[H] 29 | \centering 30 | \includegraphics[width=8cm]{ng-images/graph-editor-properties.png} 31 | \caption{Filter graph editor showing properties popup} 32 | \label{graph-editor-properties} 33 | \end{figure} 34 | 35 | Nodes display inputs at left and outputs at right. To connect two existing nodes, click on an input or output port and 36 | drag to the port you wish to connect it to. An input can only connect to one output at a time; if the destination 37 | already is connected to a different signal the previous connection will be removed and replaced with the new one. 38 | 39 | A tooltip with a green plus sign is displayed during dragging if the proposed connection is valid. If the tooltip 40 | displays a red X instead, the connection is invalid (connecting two inputs, two outputs, or an input and output of 41 | incompatible data types). 42 | 43 | To create a new node, click on an input or output port and drag to an empty area of the canvas (Fig. 44 | \ref{graph-editor-create}, Fig. \ref{graph-editor-addinput}). A context menu will appear, presenting a list of filters 45 | which can accept (if dragging from an output) or produce (if dragging from an input) the desired data type. If dragging 46 | from an input, the context menu will also include any currently unused instrument channels. 47 | 48 | \begin{figure}[H] 49 | \centering 50 | \bigimage{ng-images/graph-editor-create.png} 51 | \caption{Filter graph editor dragging from an output to an empty area of the canvas} 52 | \label{graph-editor-create} 53 | \end{figure} 54 | 55 | \begin{figure}[H] 56 | \centering 57 | \includegraphics[width=10cm]{ng-images/graph-editor-addinput.png} 58 | \caption{Filter graph editor dragging from an input to an empty area of the canvas} 59 | \label{graph-editor-addinput} 60 | \end{figure} 61 | 62 | When a new node is added to the filter graph, each output channel will be automatically added to an existing waveform 63 | view if a compatible one is present. If no compatible view is available, a new view and/or group will be created. 64 | 65 | Node title bars are color-coded to match the display color of the waveform trace, allowing easy navigation between 66 | waveform views and the graph editor. 67 | 68 | Each node also includes a caption stating the type of node (``hardware input", ``hardware output", or the name of the 69 | filter block) and, in most cases, an icon depicting the functionality of the block.\footnote{Not all filters currently 70 | have icons. We are working with multiple artists to create more filter icons and welcome additional contributions.} 71 | 72 | \section{Grouping} 73 | 74 | In order to better organize complex experimental setups, nodes may be organized in groups. Groups cannot be nested. 75 | 76 | To create a group, right click an unused area of the graph editor canvas and select ``New Group" from the context menu. 77 | This will spawn a new, empty group near the mouse cursor position. 78 | 79 | The group will have an automatically generated name (Fig. \ref{graph-editor-group1}) by default. This name may be 80 | changed by right clicking on the group's title bar and typing a new name in the pop-up. 81 | 82 | \begin{figure}[H] 83 | \centering 84 | \bigimage{ng-images/graph-editor-group1.png} 85 | \caption{Newly created node group} 86 | \label{graph-editor-group1} 87 | \end{figure} 88 | 89 | To add a node to a group, simply drag the node by its title bar and move it into the group (Fig. 90 | \ref{graph-editor-group2}). All paths from the node to the remainder of the filter graph will be routed through 91 | ``hierarchical ports" at the left and right edges of the group, reducing clutter. Nodes may be freely moved around 92 | within the group to organize them, or dragged out of the group to remove them from the group. 93 | 94 | A group (together with its contents) may be moved by dragging the group's title bar with the left mouse button, or 95 | resized by dragging any of its corners. When a group is moved, it will push other nodes or groups out of the way to 96 | prevent overlapping. 97 | 98 | If not needed, a group can be deleted by selecting it with the left mouse button and pressing the ``delete" key. 99 | Deleting a group does not remove any nodes contained within it. 100 | 101 | \begin{figure}[H] 102 | \centering 103 | \bigimage{ng-images/graph-editor-group2.png} 104 | \caption{Groups containing several nodes with hierarchical ports} 105 | \label{graph-editor-group2} 106 | \end{figure} 107 | -------------------------------------------------------------------------------- /section-history.tex: -------------------------------------------------------------------------------- 1 | \chapter{History} 2 | \label{sec:history} 3 | 4 | ngscopeclient saves a rolling buffer of previous waveforms in memory, allowing you to go back in time and see previous 5 | state of the system being debugged. This buffer is included in saved sessions, allowing a full snapshot of system 6 | behavior to be loaded for future analysis. History is always captured up to the configured depth, regardless of whether 7 | the history view window is displayed or not. 8 | 9 | Clicking on a timestamp in the history view (Fig. \ref{historyview}) pauses acquisition and loads the historical 10 | waveform data for analysis. 11 | 12 | \begin{figure}[H] 13 | \centering 14 | \includegraphics[width=7cm]{ng-images/history.png} 15 | \caption{Waveform history view} 16 | \label{historyview} 17 | \end{figure} 18 | 19 | The history depth defaults to 10 waveforms, but can be set arbitrarily within the limits of available RAM. All history 20 | must fit in system RAM in the current software version; spilling to disk is planned for the future 21 | (\issue{scopehal-apps}{311}). Older waveforms beyond the history limit are deleted automatically as new waveforms are 22 | acquired. Any single waveform in history may also be deleted by right clicking on the line and selecting ``delete" from 23 | the menu. 24 | 25 | %The status bar at the bottom of the history view displays the total number of waveforms in the history, as well as an 26 | %estimate of the amount of RAM used by the history. 27 | 28 | \section{Pinning} 29 | 30 | Interesting waveforms may be ``pinned" in the history by checking the box in the ``pin" column of the history view. 31 | Pinned waveforms are retained in the history buffer even when new waveforms arrive; only unpinned waveforms 32 | are eligible for automatic deletion to make space for incoming data. 33 | 34 | If a waveform contains markers (\ref{sec:markers}), it is automatically pinned and cannot be unpinned unless the marker 35 | (or entire waveform) is manually deleted. This prevents accidental loss of an important waveform: if the event was 36 | important enough to mark and name, it is probably worth keeping around. 37 | 38 | \section{Labeling} 39 | 40 | Arbitrary text names may be assigned to a waveform by clicking the corresponding cell in the ``label" column. As with 41 | waveforms containing markers, waveforms with a label are automatically pinned since assigning a label implies the 42 | waveform is important. 43 | 44 | \begin{comment} 45 | 46 | \section{Estimating Waveform Memory Usage} 47 | 48 | When selecting a maximum depth for the history, it is important to pick a reasonable limit to avoid running out of RAM! 49 | ngscopeclient will happily fill tens or hundreds of gigabytes of memory with deep waveforms if given a chance. Memory 50 | usage of waveform data can be roughly estimated as 16 + sizeof(sample type) bytes per point, since each sample contains a 51 | 64-bit timestamp and duration plus the sample data. 52 | 53 | For example, an analog sample takes 20 bytes of RAM (16 of time plus a 32-bit floating point voltage measurement) per 54 | sample. Thus, a 1M point analog waveform takes approximately 20 MB of RAM per channel, or 80 MB per capture on a 55 | four-channel oscilloscope with all channels enabled. 56 | 57 | On the larger side, a 10M point four channel capture would use 800 MB and a 64M point deep-memory capture would use 5 58 | GB. A deep history setting, such as 100 waveforms, is thus wildly inappropriate for such deep captures! A future 59 | software release may support spilling waveform data to a temporary directory on disk, permitting effectively unlimited 60 | history depth given sufficient disk space. 61 | 62 | Digital waveforms use one byte per sample for the actual measurement, so 17 MB per channel for a 1M point waveform. 63 | Most logic analyzer or MSO drivers for libscopehal will perform automatic de-duplication when a waveform goes several 64 | clock cycles with no toggles, so the actual memory usage is likely to be significantly less than this. 65 | 66 | Filter memory usage varies depending on the specific filter in question, however it is typically not a large 67 | contributor to the overall ngscopeclient RAM footprint when using history mode because filters are evaluated 68 | dynamically each time a waveform is pulled from history rather than having output cached for every historical waveform. 69 | Thus, at most one copy of each filter's output is present in memory regardless of history depth. 70 | \end{comment} 71 | -------------------------------------------------------------------------------- /section-internals.tex: -------------------------------------------------------------------------------- 1 | \chapter{Internals} 2 | 3 | \section{Introduction} 4 | 5 | This chapter provides a high level overview of libscopehal and ngscopeclient internals. It is intended for developers 6 | to gain an understanding of the overall project architecture and how key pieces fit together, but is not a substitute 7 | for the low level API documentation (Doxygen). 8 | 9 | Many of the entities described below use a dynamic discovery / registration system. This allows all such classes to be 10 | enumerated (and associated with human-readable names), and allows for objects of any registered type - including those 11 | provided by plugins - to be created at run time by a factory method given the human-readable class name. 12 | 13 | \section{Instruments} 14 | \label{sec:instruments} 15 | 16 | An instrument is an instance of a class derived from \codestyle{Instrument}, which represents an arbitrary piece of 17 | laboratory equipment. As of this writing, an instrument may be an oscilloscope, multimeter, power supply, baseband 18 | signal generator, or RF signal generator - or an arbitrary combination of these (for example an oscilloscope with 19 | integrated function generator is both an oscilloscope and baseband signal generator). 20 | 21 | The type of an instrument is defined by a bit field and may be queried by calling \codestyle{GetInstrumentTypes()}. Do 22 | \emph{not} rely on C++ RTTI to determine the type of an instrument, for example it is incorrect to 23 | \codestyle{dynamic\_cast} a \codestyle{Instrument*} pointer to \codestyle{Oscilloscope*} to check if the instrument is 24 | an oscilloscope. This is because the C++ type of an object is fixed when the driver class is compiled, and the driver 25 | may be used with many different instruments with various sets of software and hardware options. In other words, the 26 | fact that a given driver supports \emph{some} device that contains multimeter functionality does not in any way imply 27 | that the \emph{particular} device you are talking to is a multimeter. 28 | 29 | The Instrument class provides no functionality other than describing the device (querying make/model/serial number, 30 | assigning display nicknames, and querying feature set). To do any useful work, the object is normally casted to a 31 | derived type to gain access to that device class's API. 32 | 33 | \section{SCPI Devices} 34 | \label{sec:scpidevices} 35 | 36 | A SCPI device is an instance of a class derived from \codestyle{SCPIDevice}, which represents a device which speaks 37 | some variant of SCPI. The vast majority of instrument driver classes derive from both \codestyle{SCPIDevice} and one or 38 | more \codestyle{Instrument} derived classes. 39 | 40 | A SCPI device object uses a \hyperref[sec:transports]{transport} to communicate with the associated instrument, which 41 | avoids the need for the driver class to concern itself with the specifics of how the SCPI commands are transferred to 42 | the device. 43 | 44 | \section{Transports} 45 | \label{sec:transports} 46 | 47 | A transport is an instance of a class derived from \codestyle{SCPITransport}, which provides a means of sending SCPI 48 | commands and/or raw byte string data to or from a physical instrument. 49 | 50 | Most transports use a single stream in the underlying protocol layer (such as a single TCP socket) to transport both 51 | control plane content (SCPI commands) and data plane content (waveform data), however some specialized protocols have 52 | multiple physical streams (for example the \codestyle{SCPITwinLanTransport} transport). For these instruments, the 53 | command/reply APIs and raw data APIs may not go to the same place. 54 | 55 | All transports must be registered in order to be used by ngscopeclient. To register a transport class, add the macro 56 | \codestyle{TRANSPORT\_INITPROC(FooTransport)} to your class declaration and call 57 | \codestyle{AddTransportClass(FooTransport)} in either the \texttt{TransportStaticInit} function within libscopehal or 58 | the \codestyle{PluginInit} function of a plugin, as appropriate. 59 | 60 | The special class \codestyle{SCPINullTransport} serves as a \texttt{/dev/null} equivalent: it discards anything written 61 | to it, and never returns read data. It is primarily intended to be used by the ``demo" driver, which does not connect 62 | to a real instrument. 63 | 64 | While it is in principle possible to create a driver class that talks directly to a device via e.g. a USB API and 65 | bypasses the transport model, this is strongly discouraged for user experience and flexibility reasons. Most drivers 66 | for such devices (for example the Digilent and Pico drivers) instead consist of two components: a bridge server that 67 | converts the instrument API to SCPI commands on one socket and a raw sample data on a second socket, and a 68 | libscopehal-side driver that converts this to the relevant instrument API. 69 | 70 | \section{Oscilloscopes} 71 | \label{sec:oscilloscopes} 72 | 73 | An Oscilloscope is an instance of a class derived from \codestyle{Oscilloscope}, which represents a device for 74 | acquiring sampled digital data. All actual oscilloscopes use this API, as do some other instruments such as spectrum 75 | analyzers. Most oscilloscope driver classes derive from \codestyle{SCPIOscilloscope} rather than directly from 76 | \codestyle{Oscilloscope}, as they use SCPI to communicate with the hardware. 77 | 78 | An oscilloscope may have zero or more \hyperref[sec:channels]{channels}. \footnote{All currently extant implementations 79 | have at least one channel, however it is plausible that a zero-channel instrument might exist in the future (for 80 | example, some sort of external trigger controller that exposes the same trigger API as a conventional oscilloscope) so 81 | the API allows for this.} 82 | 83 | At any given time, an oscilloscope has exactly one \hyperref[sec:triggers]{trigger} associated with it. A trigger has 84 | inputs and properties just like a \hyperref[sec:filters]{filter}, since both are derived from 85 | \codestyle{FlowGraphNode}. Most triggers take at least one input, however zero-input triggers are possible (for 86 | example, triggering on AC mains zero crossings). 87 | 88 | Every oscilloscope driver class must contain a public static method \codestyle{GetDriverNameInternal()}, which returns a 89 | \codestyle{std::string} containing a short, human readable name for the driver (for example ``agilent" or ``pico"). By 90 | convention, the driver name should consist of lowercase letters and numbers only - no spaces, punctuation, or capital 91 | letters. 92 | 93 | Just like transports, every oscilloscope driver class must be registered in the dynamic creation table by invoking 94 | \codestyle{OSCILLOSCOPE\_INITPROC(MyOscilloscope)} in the class declaration and 95 | \codestyle{AddDriverClass(MyOscilloscope)} in \texttt{DriverStaticInit} or \texttt{PluginInit}. 96 | 97 | \section{Channels} 98 | \label{sec:channels} 99 | 100 | A channel is an instance of a class derived from \codestyle{OscilloscopeChannel}, which represents a single source of 101 | data and associated controls. A channel may be associated with an \hyperref[sec:oscilloscopes]{oscilloscope}, or it may 102 | be a \hyperref[sec:filters]{filter} which is not associated with any particular physical instrument. 103 | 104 | Channels of an oscilloscope generally map 1:1 to analog front ends. Most commonly they are also 1:1 with instrument front 105 | panel connectors, however there are some notable exceptions. Some high end oscilloscopes (such as the Teledyne LeCroy 106 | WaveMaster family) have multiple inputs with a multiplexer feeding a single front end; this ensemble is considered to 107 | be a single channel by libscopehal. Network analyzers have separate channels for receive and reflected power, for 108 | example $S_{11}$ and $S_{12}$ of a VNA are measured at the same physical port on the instrument but separate channels 109 | in libscopehal. 110 | 111 | A channel normally has one or more output \hyperref[sec:streams]{streams}, however in some less common situations (such 112 | as dedicated trigger inputs) there may be zero streams. 113 | 114 | Channels are reference counted: when at least one filter or waveform view is consuming the output of a channel it will 115 | be automatically enabled. When the last user of a channel is removed, the channel will be disabled and, if a filter, 116 | deleted. 117 | 118 | Various properties can be configured on channels, such as gain/offset and bandwidth limiters. Depending on whether the 119 | channel is a filter or not, or what kind of oscillocope it is connected to, not all of these settings may be available. 120 | 121 | \section{Streams} 122 | \label{sec:streams} 123 | 124 | A stream is an output from a \hyperref[sec:channels]{channel}. Most channels of physical oscilloscopes have only a 125 | single stream, however some have multiple (for example I and Q from a realtime spectrum analyzer, or magnitude and 126 | angle from a VNA). Many filters have multiple output streams, for example each channel of an imported WAV file is a 127 | separate stream of the import filter. 128 | 129 | All streams of a channel must have the same X axis unit, however they may have independent Y axis units. 130 | 131 | The set of streams provided by a filter may change at run time, most commonly if an import filter is pointed to a new 132 | file. When a filter changes its set of output streams, it must emit the \codestyle{m\_outputsChangedSignal} signal so 133 | that other code can handle the change appropriately. 134 | 135 | \section{Triggers} 136 | \label{sec:triggers} 137 | 138 | TODO: write this section 139 | 140 | \section{Waveforms} 141 | \label{sec:waveforms} 142 | 143 | A waveform is a class derived from \codestyle{WaveformBase} which stores a vector of sampled data. The 144 | \codestyle{AnalogWaveform} and \codestyle{DigitalWaveform} classes store 32-bit floating point and Boolean data 145 | respectively. Additional waveform classes are defined by many protocol decodes to store data of arbitrary class type. 146 | 147 | The units for X and Y axis are not specified in the waveform, but are properties of the channel / stream that the 148 | waveform came from. Most commonly, for analog oscilloscope waveforms, the X axis unit is femtoseconds and the Y axis 149 | unit is volts - but other units may be encountered, for example the output of a FFT has X axis units in Hz and Y axis 150 | in dBm.\footnote{Some variables and methods throughout the project (especially in older code) use ``time" or 151 | ``voltage" terminology to refer to the current X or Y axis units. This will likely be changed through refactoring over 152 | the long term.} 153 | 154 | Waveforms store timestamp / header metadata as well as three vectors of data: 155 | 156 | \begin{itemize} 157 | \item \codestyle{m\_offsets}: start time of each sample 158 | \item \codestyle{m\_durations}: length of each sample 159 | \item \codestyle{m\_samples}: actual sample data 160 | \end{itemize} 161 | 162 | All three vectors must always be the same length. (The struct-of-arrays memory format allows for better cache locality 163 | and is more SIMD-friendly than an array-of-structs format.) 164 | 165 | Sample offsets and durations are measured in time base units (defined by \codestyle{m\_timescale}). This is commonly 166 | the sample rate of the ADC or logic analyzer that acquired the data, however for upsampled or interpolated data smaller 167 | time scale values - as low as 1 - may be used. A static offset, the ``trigger phase" (\codestyle{m\_triggerPhase}), 168 | measured in raw X axis units and not scaled by \codestyle{m\_timescale}, is added to the timestamp of every signal 169 | after scaling by the time base unit. This is commonly used to apply a sub-sample offset to a waveform for trigger 170 | interpolation or de-skewing. 171 | 172 | The final timestamp of sample \emph{i}, in X axis units, is thus \codestyle{m\_offsets[i]}*\codestyle{m\_timescale} + 173 | \codestyle{m\_triggerPhase}. 174 | 175 | Note that the offset/duration allows samples to have arbitrary length and spacing; i.e. waveforms are inherently 176 | sparse. This is necessary to support protocol events, irregularly sampled data, etc. Sample timestamps must increase 177 | monotonically: sample \emph{i+1} must start at or after the end of sample \emph{i}. 178 | 179 | The majority of waveforms (such as those coming directly off an oscilloscope) will be uniformly sampled, which renders 180 | the sparse storage format inefficient. A waveform of N samples which has a duration of 1 for every sample, and offsets 181 | ranging from 0 to \emph{N-1}, is considered to be ``dense packed" and should have the \codestyle{m\_densePacked} flag 182 | set to enable various processing optimizations. The dense pack flag must NOT be set on a waveform which does not meet 183 | these criteria as this can lead to incorrect output. 184 | 185 | Filters presented with input marked as dense packed are free to ignore the timestamp and duration flags at their input. 186 | Filters generating densely packed output should set the dense pack flag, however they must still fill the timestamp and 187 | duration vectors for use by filters which do not have an optimized special case for dense packed inputs. 188 | 189 | \section{Filters} 190 | \label{sec:filters} 191 | 192 | TODO: write this section 193 | 194 | \section{Plugins} 195 | 196 | A plugin is a shared library which may contain transports, drivers, filters, and export wizards. All of these must be 197 | registered in a function called \codestyle{PluginInit} exported with extern "C" linkage. 198 | 199 | Plugins are automatically loaded at startup by ngscopeclient, however standalone applications using libscopehal must 200 | explicitly call \codestyle{InitializePlugins()} to load them. 201 | 202 | \subsection{Linux} 203 | 204 | On Linux, plugins are loaded from the following directories: 205 | 206 | \begin{itemize} 207 | \item \codestyle{/usr/lib/scopehal/plugins} 208 | \item \codestyle{/usr/local/lib/scopehal/plugins} 209 | \item \codestyle{~/.scopehal/plugins} 210 | \item Executable directory, if not under \codestyle{/usr} 211 | \end{itemize} 212 | 213 | \subsection{Windows} 214 | 215 | On Windows, plugins are loaded from the following directories: 216 | 217 | \begin{itemize} 218 | \item \codestyle{(Executable directory) \textbackslash plugins} 219 | \end{itemize} 220 | -------------------------------------------------------------------------------- /section-intro.tex: -------------------------------------------------------------------------------- 1 | \chapter{Introduction} 2 | 3 | \section{Introduction} 4 | 5 | ngscopeclient is a high performance, GPU accelerated remote user interface, signal processing, protocol analysis, and 6 | automation tool for test and measurement equipment. It runs on all major operating systems and can interoperate with a 7 | broad and continuously growing range of T\&M products from many vendors. 8 | 9 | This is free software: you are free to change and redistribute it. 10 | There is NO WARRANTY, to the extent permitted by law. 11 | 12 | \section{Documentation Conventions} 13 | 14 | Numbers are decimal unless explicitly specified otherwise. Binary or hexadecimal values use SystemVerilog notation, for 15 | example 'b10 means the binary value 10 (2) with no length specified, and 8'h41 means the 8-bit hexadecimal value 41 16 | (decimal 65) 17 | 18 | When referring to colors, HTML-style \#RRGGBB or \#RRGGBBAA notation is used. For example \#ff0000 means pure red with 19 | unspecified alpha (assumed fully opaque) and \#ff000080 means pure red with 50\% opacity. 20 | 21 | Printf-style format codes are used when describing output of protocol decodes. For example, ``\%02x" means data is 22 | formatted as hexadecimal bytes with leading zeroes. 23 | 24 | Items to be selected from a menu are displayed in \menustyle{monospace font}. 25 | 26 | Multilevel menu paths are separated by a / character. For example, \menustyle{Attenuation / 1x} means to open the 27 | \menustyle{Attenuation} submenu and select the \menustyle{1x} item. 28 | 29 | If there are multiple options for a menu or configuration option, they are displayed in square brackets and separated 30 | by a | character. For example, \menustyle{Move waveform to / Waveform Group [1|2]} means to select either 31 | \menustyle{Waveform Group 1} or \menustyle{Waveform Group 2} from the \menustyle{Move waveform to} 32 | menu. 33 | 34 | This project is under active development and is not anywhere near feature complete! As a result, this document is 35 | likely to refer to active bug or feature request tickets on the GitHub issue trackers. Issues are referenced as 36 | repository:ticket, for example \issue{scopehal-apps}{3}. 37 | 38 | \section{Key Concepts} 39 | 40 | \subsection{User Interface} 41 | 42 | Most UI elements can be interacted with by left clicking (select), left dragging (move), using the scroll wheel (zoom), 43 | double clicking (open properties dialog), or right clicking (context menu). 44 | 45 | Hovering the mouse over a main window UI element displays a series of icons in the status bar explaining how to 46 | interact with the element in question. 47 | 48 | Hovering some UI elements, or a (?) help marker in a dialog box, displays a tooltip with additional information such as 49 | the full name of an object, metadata about a waveform, etc. 50 | 51 | \begin{figure}[h] 52 | \centering 53 | \includegraphics[width=15cm]{ng-images/tooltip-help.png} 54 | \caption{Tooltip and help message in status bar} 55 | \label{tooltip-help} 56 | \end{figure} 57 | 58 | %If you have a multi-button gaming mouse, button 8 stops the trigger and button 9 starts. These bindings are not 59 | %currently configurable. 60 | 61 | Most text fields allow SI prefixes for scaling values (mV, $\mu s$, GHz, etc). Lowercase `u' is interpreted as 62 | ``micro", equivalent to the Greek letter $\mu$. The unit is automatically added if not specified, for example typing 63 | ``2.4G" in a frequency input field will be interpreted as meaning 2.4 GHz. 64 | 65 | \subsection{Design Philosophy} 66 | 67 | Users familiar with conventional benchtop oscilloscopes will notice some important distinctions between ngscopeclient 68 | and classical DSO user interfaces. While there is an initial learning curve getting used to the different ways of doing 69 | things, these changes allow for greater productivity and more complex analysis. 70 | 71 | Legacy DSO user interfaces largely still imitate the front panel controls of analog CRT instruments dating back to the 72 | mid 1940s. A single view of each waveform shows the entire acquisition on a grid with a fixed number of divisions 73 | (emulating an etched graticule on a CRT) and both time and voltage scales are defined in terms of these divisions. 74 | While more recent DSOs do allow math functions, protocol decodes, zooms, and so on, this archaic concept has remained. 75 | 76 | In ngscopeclient, the acquisition record length is completely decoupled from the X axis scale of the viewport, and 77 | there is no concept of a ``zoom" waveform or measuring time in ``divisions". Arbitrarily many views of a channel may be 78 | created, and each may be scaled and zoomed independently. Acquisition record length and duration are controlled 79 | separately, from the timebase properties dialog. 80 | 81 | Similarly, vertical scale for waveforms is defined in terms of full-scale range, a far more intuitive and useful metric 82 | than arbitrary ``divisions". While horizontal grid lines are still displayed in waveform views for convenience, their 83 | number, spacing, and locations may change. Tall plots will have more scale divisions than short ones, and the divisions 84 | are always located at round numbers even if this requires the grid to not be centered in the plot (Fig. \ref{y-divs}) 85 | 86 | \begin{figure}[h] 87 | \centering 88 | \includegraphics[width=13cm]{ng-images/y-divs.png} 89 | \caption{Example waveform showing off-center grid and round-numbered grid lines} 90 | \label{y-divs} 91 | \end{figure} 92 | 93 | Rather than optimizing for a touch screen (as is common for benchtop oscilloscopes), ngscopeclient's UI is 94 | heavily mouse driven and context based. Space used by always-visible buttons, sliders, etc is kept to a minimum in 95 | order to keep as much screen real estate as possible usable for waveform display. Additional controls are displayed in 96 | menus or pop-up dialogs which can be closed, moved out of view, or docked as needed. 97 | 98 | \subsection{Terminology} 99 | 100 | The overall software package consists of \emph{ngscopeclient} (graphical user interface frontend), \emph{libscopehal} 101 | (C++ library for core APIs and instrument drivers), and \emph{libscopeprotocols} (filter graph blocks). End users will 102 | normally use ngscopeclient, however it is possible to interface with libscopehal and libscopeprotocols directly from 103 | C++ code for writing low level test automation tools or even a fully custom application-specific user interface. 104 | 105 | Data consists of two fundamental types: \emph{scalars} and \emph{waveforms}. A scalar is a single numeric value with an 106 | associated unit, for example ``500 mV". A waveform is a sequence of \emph{samples} plotted against another quantity, for 107 | example voltage versus time for an oscilloscope waveform or amplitude versus frequency for a spectrum analyzer 108 | waveform. 109 | 110 | Samples may be of arbitrary type (analog value, digital bit, SPI bus event, etc.), but all samples in a 111 | single waveform must be of the same data type. Waveforms may be either \emph{uniform} (sampled at constant rate with no 112 | gaps between samples) or \emph{sparse} (sampled at arbitrary intervals, possibly with gaps between samples). 113 | 114 | An \emph{instrument} is a physical piece of hardware \footnote{Or a simulated mock-up of one, such as the ``demo" 115 | oscilloscope driver used for testing} which can be remote controlled and interacted with. The connection between 116 | ngscopeclient and an instrument is provided by a \emph{transport}, such as a USBTMC interface, a GPIB data stream, or a 117 | TCP socket. A \emph{driver} is a software component, either supplied as part of the libscopehal core or a third party 118 | plugin, which controls an instrument. 119 | 120 | Each instrument has one or more\footnote{Zero channels is legal in the API, however such an instrument would be of 121 | little practical use!} \emph{channels}. A channel corresponds to a single logical ``piece" of an instrument and may 122 | consist of one or more physical connectors: a typical oscilloscope channel has a single BNC input while a typical power 123 | supply output has two banana jacks. 124 | 125 | Each channel may provide features associated with one or more instrument \emph{types}, and not all channels on an 126 | instrument are guaranteed to be the same type(s). For example, an oscilloscope may consist of several channels 127 | providing both waveform acquisition (oscilloscope) and scalar acquisition (multimeter) capabilities, one channel 128 | providing only trigger input capability, and one channel providing function generator output capability. 129 | 130 | All channels, triggers, and math / protocol decode blocks are considered \emph{nodes} within the \emph{filter graph}. 131 | The filter graph is a directed acyclic graph (a set of nodes and connections between them, with no loops permitted) 132 | connecting all of the various data inputs and outputs of the experimental setup together. 133 | 134 | Each node may have zero or more \emph{inputs}, of either scalar or waveform type, and zero or more output 135 | \emph{streams}. A stream is a data source which may or may not have an associated scalar or waveform value; for example 136 | a math block with missing inputs or an instrument which has not yet triggered do not have a meaningful value. A typical 137 | oscilloscope channel might have one waveform output stream, while a typical power supply channel might have two scalar 138 | output streams for measured current and voltage. A sink block for writing a waveform to a CSV file would have one input 139 | for each column in the generated file. 140 | 141 | Instrument hardware limitations or the particular math/decode block's design will impose various restrictions on legal 142 | connections in the filter graph. For example, a trigger can normally only accept signals from hardware input channels 143 | on the same instrument. An FFT filter can only accept uniformly sampled analog waveforms. A UART protocol decode can 144 | only accept digital waveforms, so analog waveforms must be converted to digital by a thresholding filter before they 145 | can be decoded. 146 | 147 | \section{Stability Notes} 148 | 149 | The v0.x series of ngscopeclient and libscopehal is under active development. There is no expectation of API or ABI 150 | stability for the backend libraries; method signatures and memory layouts may change at any time. 151 | 152 | The .scopesession file format is intended to be strictly upward compatibile; any potential crashes or parsing errors 153 | when opening older datasets in a newer version are due to bugs and should be reported as such. 154 | 155 | There is no expectation of downward compatibility. Note that filters may occasionally change port or parameter 156 | configurations during refactoring, which may require some manual reconfiguration of older sessions in order to work 157 | properly. 158 | 159 | \section{Revision History} 160 | \begin{itemize} 161 | \item \today: [in progress] Initial draft 162 | \end{itemize} 163 | -------------------------------------------------------------------------------- /section-legal.tex: -------------------------------------------------------------------------------- 1 | \chapter{Legal Notices} 2 | 3 | \section{Introduction} 4 | 5 | ngscopeclient, libscopehal, and the remainder of the project are all released under the 3-clause BSD license 6 | (reproduced below). This is a permissive license, explicitly chosen to encourage integration with third-party open 7 | source and commercial projects. 8 | 9 | \section{License Agreement} 10 | 11 | Copyright (c) 2012-2024 Andrew D. Zonenberg and contributors. 12 | All rights reserved. 13 | 14 | Redistribution and use in source and binary forms, with or without modification, are permitted provided that the 15 | following conditions are met: 16 | \begin{itemize} 17 | \item Redistributions of source code must retain the above copyright notice, this list of conditions, and the 18 | following disclaimer. 19 | \item Redistributions in binary form must reproduce the above copyright notice, this list of conditions, and the 20 | following disclaimer in the documentation and/or other materials provided with the distribution. 21 | \item Neither the name of the author nor the names of any contributors may be used to endorse or promote products 22 | derived from this software without specific prior written permission. 23 | \end{itemize} 24 | 25 | THIS SOFTWARE IS PROVIDED BY THE AUTHORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 26 | TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL 27 | THE AUTHORS BE HELD LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 28 | (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 29 | BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 30 | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 31 | POSSIBILITY OF SUCH DAMAGE. 32 | 33 | \section{Trademarks} 34 | 35 | This document frequently mentions the names of various test equipment vendors and products in order to discuss 36 | ngscopeclient's compatibility with said products. The reader should assume that these are all trademarks of their 37 | respective owners. 38 | 39 | \section{Third Party Licenses} 40 | 41 | TODO: go through full dependency list and update this 42 | \begin{itemize} 43 | \item Dear ImGui (static, MIT license) 44 | \item FFTS (shared, BSD-3) 45 | \item imgui-node-editor (static, MIT license) 46 | \item liblxi (shared, BSD-3/EPICS) 47 | \item vkFFT (static, MIT license) 48 | \item yaml-cpp (shared, MIT license) 49 | \end{itemize} 50 | 51 | \subsection{avx\_mathfun.h (zlib license)} 52 | 53 | AVX implementation of sin, cos, sincos, exp and log 54 | 55 | Based on "sse\_mathfun.h", by Julien Pommier 56 | http://gruntthepeon.free.fr/ssemath/ 57 | 58 | Copyright (C) 2012 Giovanni Garberoglio 59 | Interdisciplinary Laboratory for Computational Science (LISC) 60 | Fondazione Bruno Kessler and University of Trento 61 | via Sommarive, 18 62 | I-38123 Trento (Italy) 63 | 64 | This software is provided 'as-is', without any express or implied 65 | warranty. In no event will the authors be held liable for any damages 66 | arising from the use of this software. 67 | 68 | Permission is granted to anyone to use this software for any purpose, 69 | including commercial applications, and to alter it and redistribute it 70 | freely, subject to the following restrictions: 71 | 72 | \begin{enumerate} 73 | \item The origin of this software must not be misrepresented; you must not 74 | claim that you wrote the original software. If you use this software 75 | in a product, an acknowledgment in the product documentation would be 76 | appreciated but is not required. 77 | \item Altered source versions must be plainly marked as such, and must not be 78 | misrepresented as being the original software. 79 | \item This notice may not be removed or altered from any source distribution. 80 | \end{enumerate} 81 | -------------------------------------------------------------------------------- /section-load-drivers.tex: -------------------------------------------------------------------------------- 1 | \chapter{Electronic Load Drivers} 2 | \label{sec:load-drivers} 3 | 4 | This chapter describes all of the available drivers for electronic loads. 5 | 6 | \section{Siglent} 7 | 8 | \begin{tabularx}{16cm}{lllX} 9 | \thickhline 10 | \textbf{Device Family} & \textbf{Driver} & \textbf{Transport} & \textbf{Notes} \\ 11 | \thickhline 12 | SDL1000X/X-E series & siglent\_load & lan & Only tested via lan transport, but USBTMC and serial are available too\\ 13 | \thickhline 14 | \end{tabularx} 15 | 16 | \subsection{siglent\_load} 17 | 18 | This driver supports all SDL1000 family loads (SDL1020X-E, SDL1020X, SDL1030X-E, SDL1030X). 19 | -------------------------------------------------------------------------------- /section-mainwindow.tex: -------------------------------------------------------------------------------- 1 | \chapter{Main Window} 2 | 3 | The only fixed UI elements in ngscopeclient are the main menu and toolbar at the top of the window. All remaining space 4 | may be filled with waveform plots, properties dialogs, protocol analyzers, and other dockable windows as required for a 5 | given experimental setup. This flexibility allows almost the entire screen to be dedicated to waveform views, or more 6 | space allocated to controls and protocol decodes. 7 | 8 | \section{Menu} 9 | 10 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 11 | \subsection{File} 12 | 13 | This menu contains commands for saving and loading session files. 14 | 15 | \begin{itemize} 16 | 17 | \item \menustyle{Open Online...}\\ 18 | Loads a session file and reconnects to the instrument(s) to continue existing work. Settings from the saved 19 | session will be applied and overwrite the current channel and timebase configuration of the instrument, if different. 20 | 21 | \item \menustyle{Open Offline...}\\ 22 | Loads a session file in offline mode, allowing you to work with saved waveform data without connecting to the 23 | instrument(s) the data was captured from. 24 | 25 | \item \menustyle{Recent Files}\\ 26 | Displays a list of recently accessed session files and allows them to be opened online or offline. 27 | 28 | \item \menustyle{Save}\\ 29 | Saves UI configuration and waveform data (including history) to a session file for future use. 30 | 31 | A session consists of a YAML file called \emph{filename}.scopesession containing instrument and UI configuration, as 32 | well as a directory called \emph{filename}\_data which contains waveform metadata and sample values for all enabled 33 | instrument channels, including history. 34 | 35 | Note that both the .scopesession and the \_data directory must be copied if moving the session to a new location in 36 | order to preserve waveform data. If you only wish to restore the filter graph and UI configuration without waveform 37 | content, the \_data directory is not required. 38 | 39 | \item \menustyle{Save As...}\\ 40 | Saves the session to a new file, rather than the current one. 41 | 42 | \item \menustyle{Close}\\ 43 | Close the current session without exiting ngscopeclient. 44 | 45 | \item \menustyle{Quit}\\ 46 | Exits the application 47 | 48 | \end{itemize} 49 | 50 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 51 | \subsection{View} 52 | 53 | \begin{itemize} 54 | 55 | \item \menustyle{Fullscreen}\\ 56 | Toggles full-screen mode 57 | 58 | \item \menustyle{Persistence Setup}\\ 59 | Opens the Persistence Setup dialog, allowing you to control the decay coefficient for persistence maps. 60 | 61 | \end{itemize} 62 | 63 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 64 | \subsection{Add} 65 | 66 | This menu allows new waveforms views or instrument connections to be created. 67 | 68 | \begin{itemize} 69 | 70 | \item \menustyle{BERT}\\ 71 | Connect to a new, or recently used, bit error rate tester 72 | 73 | \item \menustyle{Function Generator}\\ 74 | Connect to a new, or recently used, function generator 75 | 76 | \item \menustyle{Load}\\ 77 | Connect to a new, or recently used, electronic load 78 | 79 | \item \menustyle{Misc}\\ 80 | Connect to a new, or recently used, miscellaneous instrument 81 | 82 | \item \menustyle{Multimeter}\\ 83 | Connect to a new, or recently used, multimeter 84 | 85 | \item \menustyle{Oscilloscope}\\ 86 | Connect to a new, or recently used, oscilloscope 87 | 88 | \item \menustyle{Power Supply}\\ 89 | Connect to a new, or recently used, power supply 90 | 91 | \item \menustyle{RF Generator}\\ 92 | Connect to a new, or recently used, RF signal generator 93 | 94 | \item \menustyle{SDR}\\ 95 | Connect to a new, or recently used, software-defined radio 96 | 97 | \item \menustyle{Spectrometer}\\ 98 | Connect to a new, or recently used, optical spectrometer 99 | 100 | \item \menustyle{VNA}\\ 101 | Connect to a new, or recently used, vector network analyzer 102 | 103 | \item \menustyle{Channels}\\ 104 | Displays a list of filters and instrument channels which can be opened in a new waveform view 105 | 106 | \item \menustyle{Generate}\\ 107 | Allows synthetic waveforms to be generated for testing, simulation, and channel design applications 108 | 109 | \item \menustyle{Import}\\ 110 | Allows waveforms to be loaded from external data files in various interchange formats 111 | 112 | \end{itemize} 113 | 114 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 115 | \subsection{Setup} 116 | 117 | \begin{itemize} 118 | 119 | \item \menustyle{Manage Instruments...}\\ 120 | Opens the Manage Instruments dialog, which allows control over synchronization, deskewing, and cross-triggering of 121 | multiple instruments. 122 | 123 | \item \menustyle{Timebase...}\\ 124 | Opens the \hyperref[dlg:timebase]{Timebase Properties} dialog, allowing sample rate and memory depth of each connected 125 | instrument to be adjusted. 126 | 127 | \item \menustyle{Trigger...}\\ 128 | Opens the Trigger dialog, allowing configuration of trigger settings. 129 | 130 | \item \menustyle{Preferences...}\\ 131 | Opens the \hyperref[dlg:preferences]{Preferences} dialog. 132 | 133 | \end{itemize} 134 | 135 | \begin{comment} 136 | 137 | \begin{tabularx}{16cm}{llX} 138 | \thickhline 139 | \textbf{Name} & \textbf{Colors} & \textbf{Notes} \\ 140 | \thickhline 141 | CRT & \includegraphics[width=5cm]{images/eye-gradient-crt.png} & Similar to a major vendor's color scheme.\\ 142 | Grayscale & \includegraphics[width=5cm]{images/eye-gradient-grayscale.png} & Common monochrome palette.\\ 143 | Ironbow & \includegraphics[width=5cm]{images/eye-gradient-ironbow.png} & Common "hot metal" palette. \\ 144 | KRain & \includegraphics[width=5cm]{images/eye-gradient-krain.png} & Similar to a major vendor's color scheme.\\ 145 | Rainbow & \includegraphics[width=5cm]{images/eye-gradient-rainbow.png} & Common HSV rainbow palette. \\ 146 | Reverse Rainbow & \includegraphics[width=5cm]{images/eye-gradient-reverse-rainbow.png} & Common HSV rainbow palette. \\ 147 | Viridis & \includegraphics[width=5cm]{images/eye-gradient-viridis.png} & Perceptually uniform palette from matplotlib. \\ 148 | \thickhline 149 | \end{tabularx} 150 | 151 | \end{comment} 152 | 153 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 154 | \subsection{Window} 155 | 156 | This menu provides access to various utility windows. 157 | 158 | \begin{itemize} 159 | 160 | \item \menustyle{Analyzer}\\ 161 | Opens protocol analyzer dialogs for active protocol decodes 162 | 163 | \item \menustyle{Generator}\\ 164 | Opens the properties dialog for a currently connected function generator 165 | 166 | \item \menustyle{Multimeter}\\ 167 | Opens the properties dialog for a currently connected multimeter 168 | 169 | \item \menustyle{Power Supply}\\ 170 | Opens the properties dialog for a currently connected power supply 171 | 172 | \item \menustyle{Lab Notes}\\ 173 | Opens the \hyperref[dlg:labnotes]{Lab Notes} dialog, allowing you to take notes on your experiment. 174 | 175 | \item \menustyle{Log Viewer}\\ 176 | Opens the \hyperref[dlg:logviewer]{Log Viewer dialog,}, allowing you to see debug log messages generated by the 177 | application. This is the same log stream which is normally written to stdout, but this dialog allows it to be accessed 178 | even when the application was not launched from a shell session and stdout is thus inaccessible. 179 | 180 | \item \menustyle{Measurements}\\ 181 | Opens the Measurements window, displaying scalar-valued measurements coming from instrument channels or filter blocks. 182 | 183 | \item \menustyle{Performance Metrics}\\ 184 | Opens the \hyperref[dlg:perfemetrics]{Performance Metrics} window, which provides access to debug information which can 185 | be helpful when debugging slow application performance, optimizing the code, or benchmarking instruments. 186 | 187 | \item \menustyle{History}\\ 188 | Opens the History dialog (see Chapter \ref{sec:history}), which allows access to a rolling buffer of recently acquired 189 | waveforms. 190 | 191 | \item \menustyle{Filter Graph}\\ 192 | Reopens the filter graph editor if it had been closed. 193 | 194 | \item \menustyle{Stream Browser}\\ 195 | Reopens the stream browser if it had been closed. 196 | 197 | \item \menustyle{Filter Palette}\\ 198 | Reopens the filter palette if it had been closed. 199 | 200 | \item \menustyle{New Workspace}\\ 201 | Create a new workspace to organize other windows in. 202 | 203 | \end{itemize} 204 | 205 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 206 | 207 | \subsection{Debug} 208 | 209 | Provides access to GUI toolkit test dialogs and other features intended only for developers. 210 | 211 | \begin{itemize} 212 | 213 | \item \menustyle{SCPI Console}\\ 214 | Opens a console window allowing you to send raw SCPI commands to a currently connected instrument. 215 | 216 | This is a low level debug tool primarily intended for use by driver developers. The console is interlocked with 217 | background threads polling the instrument, so that replies to commands typed in the console will not be mixed with 218 | replies which the instrument driver is expecting to its own commands. However, commands sent in the console will bypass 219 | any caching in the driver and can easily lead to the driver and instrument firmware states becoming mutually 220 | inconsistent. 221 | 222 | \item \menustyle{ImGui Demo}\\ 223 | 224 | Launches a GUI library demo window allowing you to test out various widgets and features 225 | 226 | \item \menustyle{Memory Leaker}\\ 227 | 228 | Allows you to allocate a large block of memory (up to 4GB per dialog instance, but multiple dialogs may be spawned) in 229 | order to induce video or system memory pressure. 230 | 231 | \end{itemize} 232 | 233 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 234 | 235 | \subsection{Help} 236 | 237 | \textbf{About}: Displays program version and copyright information 238 | 239 | \begin{comment} 240 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 241 | \section{Toolbar} 242 | 243 | The toolbar contains buttons and controls for the most frequently used actions. 244 | 245 | \begin{figure}[h] 246 | \centering 247 | \includegraphics[width=16cm]{images/toolbar.png} 248 | \caption{ngscopeclient toolbar} 249 | \label{toolbar} 250 | \end{figure} 251 | 252 | \subsection{Capture buttons} 253 | 254 | The capture button group (Fig. \ref{capturebuttons}) contains three buttons. From left to right these are ``arm 255 | normal trigger", ``arm one-shot trigger" and ``stop trigger". 256 | 257 | Note that the ``normal" trigger mode still uses one-shot capture internally so that all waveform data can be downloaded 258 | before the next trigger event. 259 | 260 | \begin{figure}[h] 261 | \centering 262 | \includegraphics[height=1cm]{images/capture-icons.png} 263 | \caption{Capture control buttons} 264 | \label{capturebuttons} 265 | \end{figure} 266 | 267 | \subsection{History} 268 | 269 | The history button (Fig. \ref{historybutton}) toggles display of the \hyperref[sec:history]{waveform history view}. 270 | 271 | \begin{figure}[h] 272 | \centering 273 | \includegraphics[height=1cm]{images/history-button.png} 274 | \caption{History button} 275 | \label{historybutton} 276 | \end{figure} 277 | 278 | \subsection{Refresh Settings} 279 | 280 | In order to improve performance, ngscopeclient caches many instrument settings locally rather than constantly querying 281 | the instrument for the current timebase, trigger configuration, etc. If settings are changed via the instrument front 282 | panel while ngscopeclient is running, ngscopeclient may not be aware of these changes. 283 | 284 | The Refresh Settings button (Fig. \ref{refreshbutton}) clears all cached instrument configuration and updates 285 | ngscopeclient with the current instrument settings. For most ``headless" instruments, such as Pico Technology devices, 286 | this button has no effect. 287 | 288 | \begin{figure}[h] 289 | \centering 290 | \includegraphics[height=1cm]{images/refresh-button.png} 291 | \caption{Refresh Settings button} 292 | \label{refreshbutton} 293 | \end{figure} 294 | 295 | \subsection{Clear Sweeps} 296 | 297 | The Clear Sweeps button (Fig. \ref{clearbutton}) clears all persistence waveforms, accumulated eye pattern / waterfall 298 | data, and statistics. Waveforms saved in history are not deleted. 299 | 300 | \begin{figure}[h] 301 | \centering 302 | \includegraphics[height=1cm]{images/clear-button.png} 303 | \caption{Clear Sweeps button} 304 | \label{clearbutton} 305 | \end{figure} 306 | 307 | \subsection{Fullscreen} 308 | 309 | The Fullscreen button (Fig. \ref{fullscreenbutton}) switches ngscopeclient between normal and full-screen mode. 310 | 311 | \begin{figure}[h] 312 | \centering 313 | \includegraphics[height=1cm]{images/fullscreen-button.png} 314 | \caption{Fullscreen button} 315 | \label{fullscreenbutton} 316 | \end{figure} 317 | 318 | \subsection{Opacity slider} 319 | 320 | The opacity slider (Fig. \ref{opacityslider}) controls the alpha/opacity used to display intensity-graded waveforms. 321 | Higher opacity values lead to better display of sparse waveforms (compare the crisp lines of Fig. \ref{sparse-waveform} 322 | to the barely visible trace in Fig. \ref{dim-waveform}) but can lead to a washed-out appearance if too many sample 323 | points are shoved into a small area. 324 | 325 | \begin{figure}[H] 326 | \centering 327 | \includegraphics[height=1cm]{images/opacity-slider.png} 328 | \caption{Trace opacity slider} 329 | \label{opacityslider} 330 | \end{figure} 331 | 332 | \begin{figure}[H] 333 | \centering 334 | \includegraphics[width=10cm]{images/sparse-waveform.png} 335 | \caption{Sparse waveform at a high zoom level} 336 | \label{sparse-waveform} 337 | \end{figure} 338 | 339 | \begin{figure}[H] 340 | \centering 341 | \includegraphics[width=10cm]{images/dim-waveform.png} 342 | \caption{Dim waveform showing difficulty of seeing waveform at low opacity} 343 | \label{dim-waveform} 344 | \end{figure} 345 | 346 | For example, the DVI waveform in Fig. \ref{washedout-waveform} looks like a solid white blob with a vaguely visible 347 | outline. No fine detail can be observed other than the increased over/undershoot and random-looking edges on the 348 | scanlines, compared to the flat appearance of the blanking period between scanlines and at the end of the frame. 349 | 350 | When the opacity is reduced in this example, many more nuances of the signal become apparent. The high/low voltage 351 | levels of the signal compared to the transitions between them are obvious, and the H/V sync pulses within the blanking 352 | period show up as a slightly darker region. 353 | 354 | \begin{figure}[H] 355 | \centering 356 | \includegraphics[width=10cm]{images/washedout-waveform.png} 357 | \caption{Intensity-graded waveform showing washed-out appearance at high opacity} 358 | \label{washedout-waveform} 359 | \end{figure} 360 | 361 | \begin{figure}[H] 362 | \centering 363 | \includegraphics[width=10cm]{images/graded-waveform.png} 364 | \caption{Intensity-graded waveform at lower opacity level} 365 | \label{graded-waveform} 366 | \end{figure} 367 | 368 | As of this writing, the opacity setting is global for the entire application. Should this be changed to per waveform 369 | group? If so, how should the group be selected and should there still be an option to make changes globally? 370 | \end{comment} 371 | -------------------------------------------------------------------------------- /section-meter-drivers.tex: -------------------------------------------------------------------------------- 1 | \chapter{Multimeter Drivers} 2 | \label{sec:meter-drivers} 3 | 4 | This chapter describes all of the available drivers for multimeters. 5 | 6 | Multimeters which are part of an oscilloscope are described in the \hyperref[sec:scope-drivers]{Oscilloscope 7 | Drivers} section. 8 | 9 | \section{Owon} 10 | 11 | \begin{tabularx}{16cm}{lllX} 12 | \thickhline 13 | \textbf{Device Family} & \textbf{Driver} & \textbf{Transport} & \textbf{Notes} \\ 14 | \thickhline 15 | Owon XDM1041/1241 & owon\_xdm & uart & Driver developed and tested on this meter\\ 16 | \thinhline 17 | Owon XDM2041 & owon\_xdm & uart & Not tested but should work\\ 18 | \thickhline 19 | \end{tabularx} 20 | 21 | \subsection{owon\_xdm} 22 | 23 | This driver supports Owon XDM 1000 and 2000 series multimeters. 24 | 25 | \section{Rohde \& Schwarz} 26 | 27 | \begin{tabularx}{16cm}{lllX} 28 | \thickhline 29 | \textbf{Device Family} & \textbf{Driver} & \textbf{Transport} & \textbf{Notes} \\ 30 | \thickhline 31 | HMC8012 & rs\_hmc8012 & lan & Only tested via lan transport, but USBTMC and serial are available too\\ 32 | \thickhline 33 | \end{tabularx} 34 | 35 | \subsection{rs\_hmc8012} 36 | 37 | This driver supports the HMC8012 multimeter, which is the only device in the family. 38 | -------------------------------------------------------------------------------- /section-misc-drivers.tex: -------------------------------------------------------------------------------- 1 | \chapter{Miscellaneous Drivers} 2 | \label{sec:misc-drivers} 3 | 4 | This chapter describes all of the available drivers for miscellaneous instruments which do not fit in any other 5 | category. 6 | 7 | \section{Generic} 8 | 9 | \begin{tabularx}{16cm}{lllX} 10 | \thickhline 11 | \textbf{Device Family} & \textbf{Driver} & \textbf{Transport} & \textbf{Notes} \\ 12 | \thickhline 13 | N/A & csvstream & Any & \\ 14 | \thickhline 15 | \end{tabularx} 16 | 17 | \subsection{csvstream} 18 | 19 | This driver exposes the most recent line from a stream of comma-separated value (CSV) data as a series of analog scalar 20 | channels. 21 | 22 | It is primarily intended for extracting low rate I2C sensor readings and ADC values from an embedded DUT, so that that 23 | these values may be plotted alongside multimeter/power supply readings or other data coming from more conventional 24 | instrumentation. 25 | 26 | The data may come from any supported transport, however it is expected that the most likely scenario is either direct 27 | connection to a local serial port (``uart" transport), or a TCP socket connected to either a remote UART using socat or 28 | an embedded TCP server (``lan" transport). 29 | 30 | Data must be generally line oriented and UTF-8 or 7-bit ASCII encoded. 31 | 32 | In order to enable csvstream data to share a UART also used by other traffic such as a debug console or syslog, all 33 | lines must contain one of three magic prefixes as shown below. Any content in the line before the prefix (such as a 34 | timestamp) is ignored. 35 | 36 | Upon initial connection, the driver will have a single channel called ``CH1". At any time, if the number of fields in a 37 | received CSV line exceeds the current channel count, a new channel will be created. If a partial line is received, the 38 | values in the missing columns are unchanged but the channel will not be deleted. 39 | 40 | \begin{itemize} 41 | \item \textbf{CSV-NAME}: Contains channel name data. Example:\\ 42 | CSV-NAME,Temperature,3V3,RxLevel 43 | 44 | \item \textbf{CSV-UNIT}: Contains channel unit data (using the text encodings used by the libscopehal Unit class). Example:\\ 45 | CSV-UNIT,°C,V,dBm 46 | 47 | \item \textbf{CSV-DATA}: Contains channel value data. Example:\\ 48 | CSV-DATA,31.41,3.291,-59.1 49 | 50 | \end{itemize} 51 | -------------------------------------------------------------------------------- /section-powersupply-drivers.tex: -------------------------------------------------------------------------------- 1 | \chapter{Power Supply Drivers} 2 | \label{sec:powersupply-drivers} 3 | 4 | This chapter describes all of the available drivers for power supplies. 5 | 6 | % TODO: demo driver 7 | 8 | \section{Alientek} 9 | 10 | \begin{tabularx}{16cm}{lllX} 11 | \thickhline 12 | \textbf{Device Family} & \textbf{Driver} & \textbf{Transport} & \textbf{Notes} \\ 13 | \thickhline 14 | DP100 & alientek\_dp & hid & \\ 15 | \thickhline 16 | \end{tabularx} 17 | 18 | \subsection{alientek\_dp} 19 | 20 | This driver works on Alientek DP100 mini Digital Power Supply. 21 | 22 | Path for connection (vendorId:productId) is: 2e3c:af01. 23 | 24 | \section{GW Instek} 25 | 26 | \begin{tabularx}{16cm}{lllX} 27 | \thickhline 28 | \textbf{Device Family} & \textbf{Driver} & \textbf{Transport} & \textbf{Notes} \\ 29 | \thickhline 30 | GPD-X303S series & gwinstek\_gpdx303s & uart & 9600 Baud default. Tested with GPD-3303S. No support for tracking modes yet.\\ 31 | \thickhline 32 | \end{tabularx} 33 | 34 | \subsection{gwinstek\_gpdx303s} 35 | 36 | Supported models should include GPD-2303S, GPD-3303S, GPD-4303S, and GPD-3303D. 37 | 38 | \section{Kuaiqu} 39 | 40 | \begin{tabularx}{16cm}{lllX} 41 | \thickhline 42 | \textbf{Device Family} & \textbf{Driver} & \textbf{Transport} & \textbf{Notes} \\ 43 | \thickhline 44 | Kuaiqu SSPS-S series & kuaiqu\_psu & uart & \\ 45 | Kuaiqu SPPS*D series & kuaiqu\_psu & uart & \\ 46 | Kuaiqu SPPS-D series & kuaiqu\_psu & uart & Tested on a Kuaiqu SPPS-D3010-232\\ 47 | Kuaiqu R-SPPS series & kuaiqu\_psu & uart & \\ 48 | \thickhline 49 | \end{tabularx} 50 | 51 | \subsection{kuaiqu\_psu} 52 | 53 | This driver supports all Kuaiqu programmable PSUs, including SSPS-S, SPPS*D, SPPS-D and R-SPPS series. 54 | 55 | It has been tested on a Kuaiqu SPPS-D3010-232. 56 | 57 | \section{Riden} 58 | 59 | \begin{tabularx}{16cm}{lllX} 60 | \thickhline 61 | \textbf{Device Family} & \textbf{Driver} & \textbf{Transport} & \textbf{Notes} \\ 62 | \thickhline 63 | Riden RD series & riden\_rd & uart & Tested on a Riden RD6006\\ 64 | \thickhline 65 | \end{tabularx} 66 | 67 | \subsection{kuaiqu\_psu} 68 | 69 | This driver supports all Riden RD series DC Power Supplies. 70 | 71 | It has been tested on a Riden RD6006. 72 | 73 | \section{Rigol} 74 | 75 | \begin{tabularx}{16cm}{lllX} 76 | \thickhline 77 | \textbf{Device Family} & \textbf{Driver} & \textbf{Transport} & \textbf{Notes} \\ 78 | \thickhline 79 | DP832, DP832A & rigol\_dp8xx & uart, usbtmc, lan & No support for tracking modes yet.\\ 80 | \thickhline 81 | \end{tabularx} 82 | 83 | \subsection{rigol\_dp8xx} 84 | 85 | This driver supports the DP832 and DP832A. 86 | 87 | \section{Rohde \& Schwarz} 88 | 89 | \begin{tabularx}{16cm}{lllX} 90 | \thickhline 91 | \textbf{Device Family} & \textbf{Driver} & \textbf{Transport} & \textbf{Notes} \\ 92 | \thickhline 93 | HMC804x series & rs\_hmc804x & uart, usbtmc, lan & No support for tracking modes yet.\\ 94 | \thickhline 95 | \end{tabularx} 96 | 97 | \subsection{rs\_hmc804x} 98 | 99 | This driver should support the HMC8041, HMC8042, and HMC8043 but has only been tested on the HMC8042. 100 | 101 | \section{Siglent} 102 | 103 | \begin{tabularx}{16cm}{lllX} 104 | \thickhline 105 | \textbf{Device Family} & \textbf{Driver} & \textbf{Transport} & \textbf{Notes} \\ 106 | \thickhline 107 | SPD3303X series & siglent\_spd & lan & Tested with SPD3303X-E\\ 108 | \thickhline 109 | \end{tabularx} 110 | 111 | \subsection{siglent\_spd} 112 | 113 | Supported models should include SPD3303X, SPD3303X-E. 114 | 115 | NOTE: Channel 3 of the SPD3303x series does not support software voltage/current adjustment. It has a fixed current 116 | limit of 3.2A, and output voltage selectable to 2.5, 3.3, or 5V via a mechanical switch. While channel 3 can be turned 117 | on and off under software control, there is no readback capability whatsoever for channel 3 in the SCPI API. 118 | 119 | As a result - regardless of actual hardware state - the driver will report channel 3 as being in constant voltage mode. 120 | Additionally, the driver will report channel 3 as being off until it is turned on by software. Once the output has been 121 | turned on, the driver will track the state and report a correct on/off state as long as no front panel control buttons 122 | are touched. 123 | -------------------------------------------------------------------------------- /section-protoanalyzer.tex: -------------------------------------------------------------------------------- 1 | \chapter{Protocol Analyzer View} 2 | \label{chapter:protoanalyzer} 3 | 4 | Some filters for decoding packet-oriented data provide an alternate means of visualizing the decoded traffic. 5 | 6 | The protocol analyzer view (Fig. \ref{proto-analyzer}) displays each packet in the history as a row in a list view. The 7 | first column is always the timestamp of the packet; remaining columns vary depending on the particular filter in 8 | question. 9 | 10 | \begin{figure}[H] 11 | \centering 12 | \includegraphics[width=14cm]{images/proto-analyzer.png} 13 | \caption{Protocol analyzer view} 14 | \label{proto-analyzer} 15 | \end{figure} 16 | 17 | If closed, the protocol analyzer view may be reopened by selecting the protocol of interest from the 18 | \menustyle{Window / Analyzer} menu. 19 | 20 | Many filters group related packets (request and reply, escape sequences, polling loops, etc) under a single heading to 21 | enable easier navigation of large datasets. The tree expansion button at the left of the timestamp column may be used 22 | to expand the event into its constituent packets. 23 | 24 | \section{Cursor Interaction} 25 | 26 | Clicking on a packet pauses acquisition, loads the relevant waveform from history if the packet is not in the current 27 | waveform, and scrolls the waveform view containing the protocol decode to show the packet. If the packet fits entirely 28 | within the view at the current zoom setting it is centered in the view; otherwise the beginning of the packet is placed 29 | near the left edge of the viewport and the packet continues off the right edge. 30 | 31 | If a vertical cursor (Sec. \ref{sec:cursors}) is active in the waveform area displaying the protocol decode, clicking 32 | on a packet in the analyzer view moves the cursor to the start of the packet. Placing the cursor on a packet highlights 33 | the corresponding row in the protocol analyzer. 34 | 35 | \section{Packet Coloring} 36 | 37 | Protocol packets are color coded according to the high-level function of the packet. The colors are configurable in 38 | preferences; defaults are shown in the table below. 39 | 40 | \begin{tabularx}{16cm}{llX} 41 | \thickhline 42 | \textbf{Color name} & \textbf{Use case} & \textbf{Default Color} \\ 43 | \thickhline 44 | Command & Executing commands & \cellcolor{protocmd}\textcolor{white}{\#600050} \\ 45 | \thinhline 46 | Control & Changing configuration & \cellcolor{protoctl}\textcolor{white}{\#808000} \\ 47 | \thinhline 48 | Data read & Reading data & \cellcolor{protoread}\textcolor{white}{\#336699} \\ 49 | \thinhline 50 | Data write & Writing data & \cellcolor{protowrite}\textcolor{white}{\#339966} \\ 51 | \thinhline 52 | Error & Malformed, bad checksum & \cellcolor{protoerror}\textcolor{white}{\#ff0000} \\ 53 | \thinhline 54 | Status & Status updates, flow control & \cellcolor{protostatus}\textcolor{white}{\#000080} \\ 55 | \thickhline 56 | \end{tabularx} 57 | 58 | \section{Filtering} 59 | 60 | To ease analysis of large packet datasets, filters may be applied to the analyzer view by typing a filter expression 61 | into the filter bar at the top of the window (Fig. \ref{proto-filter}), then pressing the ``Apply" button. A filter can 62 | be removed by deleting the contents of the filter bar and pressing ``Apply". 63 | 64 | \begin{figure}[H] 65 | \centering 66 | \includegraphics[width=14cm]{images/proto-filter.png} 67 | \caption{Filtering protocol analyzer view} 68 | \label{proto-filter} 69 | \end{figure} 70 | 71 | The basic format of a filter is (expression) (operator) (expression). 72 | 73 | \subsection{Expressions} 74 | 75 | An expression can be: 76 | \begin{itemize} 77 | \item A quoted string 78 | \item A decimal number 79 | \item A field identifier (such as \texttt{PHY} or \texttt{Reg}). Identifiers are case sensitive. 80 | \item data[x], where x is an arbitrary numeric expression 81 | \item A filter expression in parentheses. This expression must evaluate to boolean true or false. The unary ! operator 82 | can be used to negate a parenthetical expression. 83 | \end{itemize} 84 | 85 | \subsection{Operators} 86 | 87 | An operator can be: 88 | \begin{itemize} 89 | \item \texttt{==}: returns true if the left and right expression are equal 90 | \item \texttt{!=}: returns true if the left and right expression are not equal 91 | \item \texttt{||}: returns true if at least one of the left or right expression is true 92 | \item \texttt{\&\&}: returns true if both the left and right expression is true 93 | \item \texttt{startswith}: returns true if the right expression is a string which starts with the left expression 94 | \item \texttt{contains}: returns true if the right expression is a string which contains the left expression 95 | \end{itemize} 96 | 97 | \subsection{Examples of filters} 98 | 99 | \begin{lstlisting}[language=C] 100 | Op == "Read" 101 | Reg == "0f" 102 | (Clause == 22) && (Info startswith "Basic Status") 103 | \end{lstlisting} 104 | -------------------------------------------------------------------------------- /section-rfgen-drivers.tex: -------------------------------------------------------------------------------- 1 | \chapter{RF Generator Drivers} 2 | \label{sec:rfgen-drivers} 3 | 4 | This chapter describes all of the available drivers for RF synthesizers, vector signal generators, and similar devices. 5 | 6 | \section{Siglent} 7 | 8 | \begin{tabularx}{16cm}{lllX} 9 | \thickhline 10 | \textbf{Device Family} & \textbf{Driver} & \textbf{Transport} & \textbf{Notes} \\ 11 | \thickhline 12 | SSG3000X & Unknown & Unknown & May be compatible with the siglent\_ssg driver, but not tested\\ 13 | \thinhline 14 | SSG5000A & Unknown & Unknown & May be compatible with the siglent\_ssg driver, but not tested\\ 15 | \thinhline 16 | SSG5000X & siglent\_ssg & lan & Only tested via lan transport, but USBTMC and serial are available too\\ 17 | \thickhline 18 | \end{tabularx} 19 | 20 | \subsection{siglent\_ssg} 21 | 22 | This driver was developed on a SSG5060X-V and should support the other models in the SSG5000X family (SSG5040X, 23 | SSG5060X, and SSG5040X-V). It is unknown whether it will function at all with the SSG3000X or 5000A families in its 24 | current state; additional development will likely be needed for full support. 25 | -------------------------------------------------------------------------------- /section-scope-drivers.tex: -------------------------------------------------------------------------------- 1 | \chapter{Oscilloscope Drivers} 2 | \label{sec:scope-drivers} 3 | 4 | This chapter describes all of the available drivers for oscilloscopes and logic analyzers. 5 | 6 | \section{Agilent} 7 | 8 | Agilent devices support a similar similar SCPI command set across most device families. 9 | 10 | Please see the table below for details of current hardware support: 11 | 12 | \begin{tabularx}{16cm}{lllX} 13 | \thickhline 14 | \textbf{Device Family} & \textbf{Driver} & \textbf{Transport} & \textbf{Notes} \\ 15 | \thickhline 16 | DSO5000 series & agilent & lan & Not recently tested, but should work.\\ 17 | \thinhline 18 | DSO6000 \& MSO6000 series & agilent & lan & Working. No support for digital channels yet.\\ 19 | \thinhline 20 | DSO7000 \& MSO7000 series & agilent & lan & Untested, but should work. No support for digital channels yet.\\ 21 | \thinhline 22 | EDUX1000 series & agilent & lan & Untested but should be identical to DSOX1200 but with lower sample memory. \\ 23 | \thinhline 24 | DSOX1200 series & agilent & lan & Working. No support for wavegen yet. \\ 25 | \thinhline 26 | MSOX-2000 series & agilent & lan \\ 27 | \thinhline 28 | MSOX-3000 series & agilent & lan \\ 29 | \thickhline 30 | \end{tabularx} 31 | 32 | \subsection{agilent} 33 | 34 | \subsubsection{Typical Performance (MSO6034A, LAN)} 35 | 36 | Interestingly, performance sometimes gets better with more channels or deeper memory. Not sure why. 37 | 38 | \begin{tabularx}{16cm}{llX} 39 | \thickhline 40 | \textbf{Channels} & \textbf{Memory depth} & \textbf{WFM/s}\\ 41 | \thickhline 42 | 1 & 1K & 66 \\ 43 | \thinhline 44 | 4 & 1K & 33 \\ 45 | \thinhline 46 | 4 & 4K & 33 \\ 47 | \thinhline 48 | 1 & 40K & 33 \\ 49 | \thinhline 50 | 1 & 4K & 22 \\ 51 | \thinhline 52 | 1 & 20K & 22 \\ 53 | \thinhline 54 | 4 & 20K & 22 \\ 55 | \thinhline 56 | 1 & 100K & 22 \\ 57 | \thinhline 58 | 4 & 10K & 17 \\ 59 | \thinhline 60 | 4 & 40K & 12 \\ 61 | \thinhline 62 | 1 & 200K & 11 \\ 63 | \thinhline 64 | 1 & 400K & 8 \\ 65 | \thinhline 66 | 4 & 100K & 6.5 \\ 67 | \thinhline 68 | 4 & 200K & 4 \\ 69 | \thinhline 70 | 1 & 1M & 3.7 \\ 71 | \thinhline 72 | 4 & 400K & 2.3 \\ 73 | \thinhline 74 | 1 & 1M & 1 \\ 75 | \thinhline 76 | 4 & 1M & 1 \\ 77 | \thinhline 78 | 4 & 4M & 0.2 \\ 79 | \thickhline 80 | \end{tabularx} 81 | 82 | \subsubsection{Typical Performance (MSOX3104T, LAN)} 83 | 84 | \begin{tabularx}{16cm}{llX} 85 | \thickhline 86 | \textbf{Channels} & \textbf{Memory depth} & \textbf{WFM/s}\\ 87 | \thickhline 88 | 1 & 2.5K & 3.3 \\ 89 | \thinhline 90 | 4 & 2.5K & 2.5 \\ 91 | \thinhline 92 | 1 & 2.5M & 1.0 \\ 93 | \thinhline 94 | 4 & 2.0M & 0.5 \\ 95 | \thickhline 96 | \end{tabularx} 97 | 98 | \section{Antikernel Labs} 99 | 100 | \begin{tabularx}{16cm}{llX} 101 | \thickhline 102 | \textbf{Device Family} & \textbf{Driver} & \textbf{Notes} \\ 103 | \thickhline 104 | Internal Logic Analyzer IP & akila & \\ 105 | \thickhline 106 | BLONDEL Oscilloscope Prototype & aklabs & \\ 107 | \thickhline 108 | \end{tabularx} 109 | 110 | \subsection{akila} 111 | 112 | This driver uses a raw binary protocol, not SCPI. 113 | 114 | Under-development internal logic analyzer analyzer core for FPGA design debug. The ILA uses a UART interface to a host 115 | system. Since there's no UART support in scopehal yet, socat must be used to bridge the UART to a TCP socket using 116 | the ``lan" transport. 117 | 118 | \subsection{aklabs} 119 | 120 | This driver uses two TCP sockets. Port 5025 is used for SCPI control plane traffic, and port 50101 is used for waveform 121 | data using a raw binary protocol. 122 | 123 | \section{Demo} 124 | 125 | The ``demo" driver is a simulation-only driver for development and training purposes, and does not connect to real 126 | hardware. 127 | 128 | It ignores any transport provided, and is normally used with the ``null" transport. 129 | 130 | The demo instrument is intended to illustrate the usage of ngscopeclient for various types of analysis and to aid in 131 | automated testing on computers which do not have a connection to a real oscilloscope, and is not intended to accurately 132 | model the response or characteristics of real world scope frontends or signals. 133 | 134 | It supports memory depths of 10K, 100K, 1M, and 10M points per waveform at rates of 1, 5, 10, 25, 50, and 100 Gsps. 135 | Four test signals are provided, each with 10 mV of Gaussian noise and a 5 GHz low-pass filter added (although this can 136 | be disabled under the channel properties) 137 | 138 | Test signals: 139 | \begin{itemize} 140 | \item 1.000 GHz tone 141 | \item 1.000 GHz tone mixed with a second tone, which sweeps from 1.100 to 1.500 GHz 142 | \item 10.3125 Gbps PRBS-31 143 | \item 1.25 Gbps repeating two 8B/10B symbols (K28.5 D16.2) 144 | \end{itemize} 145 | 146 | \begin{tabularx}{16cm}{lllX} 147 | \thickhline 148 | \textbf{Device Family} & \textbf{Driver} & \textbf{Transport} & \textbf{Notes} \\ 149 | \thickhline 150 | Simulator & demo & null & \\ 151 | \thickhline 152 | \end{tabularx} 153 | 154 | \section{Digilent} 155 | 156 | Digilent oscilloscopes using the WaveForms SDK are all supported using the ``digilent" driver in libscopehal. This 157 | driver connects using the ``twinlan" transport to a \href{https://github.com/ngscopeclient/scopehal-waveforms-bridge} 158 | {socket server} which links against the Digilent WaveForms SDK. This provides network transparency, and allows the 159 | Digilent bridge server to be packaged separately for distribution and only installed by users who require it. 160 | 161 | As of 2022-03-09, analog input channels on the Analog Discovery Pro and Analog Discovery 2 have been tested and are 162 | functional, however only basic edge triggering is implemented so far. Analog inputs on other devices likely work, 163 | however only these two have been tested to date. 164 | 165 | Analog outputs, digital inputs, and digital outputs are currently unimplemented, but are planned to be added in the 166 | future. 167 | 168 | \subsection{digilent} 169 | 170 | \begin{tabularx}{16cm}{lllX} 171 | \thickhline 172 | \textbf{Device Family} & \textbf{Driver} & \textbf{Transport} & \textbf{Notes} \\ 173 | \thickhline 174 | Electronics Explorer & digilent & twinlan & Not tested, but probably works\\ 175 | \thinhline 176 | Analog Discovery & digilent & twinlan & Not tested, but probably works\\ 177 | \thinhline 178 | Analog Discovery 2 & digilent & twinlan & No digital channel support \newline No analog output support\\ 179 | \thinhline 180 | Analog Discovery Pro & digilent & twinlan & No digital channel support \newline No analog output support \\ 181 | \thinhline 182 | Digital Discovery & digilent & twinlan & No digital channel support,\newline so pretty useless for now\\ 183 | \thickhline 184 | \end{tabularx} 185 | 186 | \subsubsection{Typical Performance (ADP3450, USB -> LAN)} 187 | 188 | \begin{tabularx}{16cm}{llX} 189 | \thickhline 190 | \textbf{Channels} & \textbf{Memory depth} & \textbf{WFM/s}\\ 191 | \thickhline 192 | 4 & 64K & 25.8 \\ 193 | \thinhline 194 | 2 & 64K & 32.3 \\ 195 | \thinhline 196 | 1 & 64K & 33.0 \\ 197 | \thickhline 198 | \end{tabularx} 199 | 200 | \section{DreamSource Lab} 201 | 202 | DreamSourceLabs oscilloscopes and logic analyzers supported in their fork of sigrok (``libsigrok4DSL'' distributed as part of 203 | their ``DSView'' software package) are supported through the ``dslabs'' driver in libscopehal. This driver connects using 204 | the ``twinlan'' transport to a \href{https://github.com/ngscopeclient/scopehal-sigrok-bridge}{socket server} which links 205 | against libsigrok4DSL. This provides network transparency, and allows the DSLabs bridge server to be packaged separately for 206 | distribution and only installed by users who require it. 207 | 208 | As of 2022-03-22, a DSCope U3P100 and a DSLogic U3Pro16has been tested and works adequately. Other products may work 209 | also, but are untested. 210 | 211 | On DSCope: Only edge triggers are supported. `Any' edge is not supported. ``Ch0 \&\& Ch1'' and ``Ch0 || Ch1'' trigger modes 212 | are not supported. 213 | 214 | On DSLogic: Only edge triggers are supported. All edges are supported. There is currently no way to configure a trigger on more 215 | than one channel. Serial / multi-stage triggers are not supported. 216 | 217 | Known issues pending fixes/refactoring: 218 | \begin{itemize} 219 | \item Interleaved sample rates are not correctly reported in the timebase dialog (but are in the waveform display) 220 | \item Trigger position is quantized to multiples of 1\% of total capture 221 | \item Non-localhost performance, and responsiveness in general may suffer as a result of hacky flow control on waveform capture 222 | \item DSLogic depth configuration is confusing and performance could be improved (currently only buffered more is supported) 223 | \item DSLogic devices trigger even if pre-trigger buffer has not been filled, leading to a small pre-trigger waveform in some cases 224 | \end{itemize} 225 | 226 | \subsection{dslabs} 227 | 228 | \begin{tabularx}{16cm}{lllX} 229 | \thickhline 230 | \textbf{Family / Device} & \textbf{Driver} & \textbf{Transport} & \textbf{Notes} \\ 231 | \thickhline 232 | DScope U3P100 & dslabs & twinlan & Tested, works\\ 233 | \thinhline 234 | DSLogic U3P16 & dslabs & twinlan & Tested, works\\ 235 | \thinhline 236 | DSCope (others) & dslabs & twinlan & Not tested, but probably works\\ 237 | \thinhline 238 | DSLogic (others) & dslabs & twinlan & Not tested, but probably works\\ 239 | \thickhline 240 | \end{tabularx} 241 | 242 | \subsubsection{Typical DSCope Performance (DSCope U3P100, USB3, localhost)} 243 | 244 | \begin{tabularx}{16cm}{lllXX} 245 | \thickhline 246 | \textbf{Channels} & \textbf{Memory depth} & \textbf{Sample Rate} & \textbf{WFM/s} & \textbf{UI-unconstrained WFM/s}\\ 247 | \thickhline 248 | 2 & 1M & 100MS/s & 14 & 50\\ 249 | \thinhline 250 | 2 & 5M & 500MS/s & 4.5 & 14\\ 251 | \thinhline 252 | 1 & 5M & 1GS/s & 8.3 & 32\\ 253 | \thickhline 254 | \end{tabularx} 255 | 256 | \subsubsection{Typical DSLogic Performance (DSLogic U3Pro16, USB3, localhost)} 257 | 258 | \begin{tabularx}{16cm}{lllXX} 259 | \thickhline 260 | \textbf{Channels} & \textbf{Memory depth} & \textbf{Sample Rate} & \textbf{WFM/s} & \textbf{UI-unconstrained WFM/s}\\ 261 | \thickhline 262 | 16 & 500k & 100MS/s & 16 & 44\\ 263 | \thinhline 264 | 16 & 500k & 500MS/s & 16 & 55\\ 265 | \thickhline 266 | \end{tabularx} 267 | 268 | \section{EEVengers} 269 | 270 | \subsection{thunderscope} 271 | 272 | This driver connects to the TS.NET application to control a ThunderScope. 273 | 274 | It supports full-rate 1 Gsps streaming given suitably fast hardware. 275 | 276 | \begin{tabularx}{16cm}{llX} 277 | \thickhline 278 | \textbf{Device Family} & \textbf{Driver} & \textbf{Notes} \\ 279 | \thickhline 280 | ThunderScope & thunderscope & Use twinlan transport to TS.NET \\ 281 | \thickhline 282 | \end{tabularx} 283 | 284 | \section{Enjoy Digital} 285 | TODO (\issue{scopehal}{79}) 286 | 287 | \section{Generic} 288 | 289 | Drivers in this section are not specific to a particular manufacturer's products and support a wide variety of similar 290 | devices. 291 | 292 | \subsection{socketcan} 293 | 294 | This driver exposes the Linux SocketCAN API as a stream of CAN messages which can be displayed as-is or used as input 295 | to other filter graph blocks. When paired with the ``socketcan" transport and a suitable CAN peripheral, it allows 296 | ngscopeclient to be used as a CAN bus protocol analyzer. Since SocketCAN is a Linux-only API, this driver is not 297 | available on other platforms. 298 | 299 | \section{Hantek} 300 | TODO (\issue{scopehal}{26}) 301 | 302 | \section{Keysight} 303 | 304 | Keysight devices support a similar similar SCPI command set across most device families. Many Keysight devices were 305 | previously sold under the Agilent brand and use the same SCPI command set, so they are supported by the ``agilent" 306 | driver. 307 | 308 | Please see the table below for details of current hardware support: 309 | 310 | \subsection{agilent} 311 | 312 | \begin{tabularx}{16cm}{llX} 313 | \thickhline 314 | \textbf{Device Family} & \textbf{Driver} & \textbf{Notes} \\ 315 | \thickhline 316 | MSOX-2000 series & agilent & \\ 317 | \thinhline 318 | MSOX-3000 series & agilent & \\ 319 | \thinhline 320 | MSOX-3000T series & agilent & \\ 321 | \thickhline 322 | \end{tabularx} 323 | 324 | \subsection{keysightdca} 325 | 326 | A driver for the Keysight/Agilent/HP DCA series of equivalent-time sampling oscilloscopes. 327 | 328 | \begin{tabularx}{16cm}{llX} 329 | \thickhline 330 | \textbf{Device Family} & \textbf{Driver} & \textbf{Notes} \\ 331 | \thickhline 332 | 86100A & keysightdca & \\ 333 | \thickhline 334 | \end{tabularx} 335 | 336 | \section{Pico Technologies} 337 | 338 | Pico oscilloscopes all have slightly different command sets, but are supported using the ``pico" driver in libscopehal. 339 | This driver connects via a TCP socket to a socket server 340 | \href{https://github.com/ngscopeclient/scopehal-pico-bridge}{scopehal-pico-bridge} which connects to the appropriate 341 | instrument using Pico's binary SDK. 342 | 343 | \begin{tabularx}{16cm}{llX} 344 | \thickhline 345 | \textbf{Device Family} & \textbf{Driver} & \textbf{Notes} \\ 346 | \thickhline 347 | 3000D series & pico & Early development, incomplete\\ 348 | \thinhline 349 | 6000E series & pico & \\ 350 | \thickhline 351 | \end{tabularx} 352 | 353 | \subsection{pico} 354 | 355 | \subsubsection{Typical Performance (6824E, LAN)} 356 | 357 | \begin{tabularx}{16cm}{llX} 358 | \thickhline 359 | \textbf{Channels} & \textbf{Memory depth} & \textbf{WFM/s}\\ 360 | \thickhline 361 | 8 & 1M & 15.2 \\ 362 | \thinhline 363 | 4 & 1M & 30.5 \\ 364 | \thinhline 365 | 2 & 1M & 64.4 \\ 366 | \thinhline 367 | 1 & 10M & 12.2 \\ 368 | \thinhline 369 | 1 & 50M & 3.03 \\ 370 | \thickhline 371 | \end{tabularx} 372 | 373 | \section{Rigol} 374 | 375 | Rigol oscilloscopes have subtle differences in SCPI command set, but this is implemented with quirks handling in the 376 | driver rather than needing different drivers for each scope family. 377 | 378 | NOTE: DS1054Z firmware 00.04.02.SP4 is known to have problems with SCPI remote control 379 | (https://github.com/ngscopeclient/scopehal-apps/issues/790); it is unclear what other models and firmware versions may 380 | be affected by this bug. If you encounter problems, please ensure your scope is running the latest firmware release 381 | from Rigol before opening a support ticket. 382 | 383 | \begin{tabularx}{16cm}{llX} 384 | \thickhline 385 | \textbf{Device Family} & \textbf{Driver} & \textbf{Notes} \\ 386 | \thickhline 387 | DS1100D/E & rigol & \\ 388 | \thinhline 389 | DS1000Z & rigol & \\ 390 | \thinhline 391 | MSO5000 & rigol & \\ 392 | \thinhline 393 | DHO800 & rigol & \\ 394 | \thinhline 395 | DHO900 & rigol & (no digital channels)\\ 396 | \thinhline 397 | DHO1000 & rigol & (untested)\\ 398 | \thinhline 399 | DHO4000 & rigol & (untested)\\ 400 | \thickhline 401 | \end{tabularx} 402 | 403 | \subsection{rigol} 404 | 405 | \subsubsection{Typical Performance (MSO5000 series, LAN)} 406 | 407 | \begin{tabularx}{16cm}{llX} 408 | \thickhline 409 | \textbf{Channels} & \textbf{Memory depth} & \textbf{WFM/s}\\ 410 | \thickhline 411 | 4 & 10K & 0.96 \\ 412 | \thinhline 413 | 4 & 100K & 0.91 \\ 414 | \thinhline 415 | 4 & 1M & 0.59\\ 416 | \thinhline 417 | 4 & 10M & 0.13\\ 418 | \thinhline 419 | 1 & 100M & 0.0601\\ 420 | \thinhline 421 | 4 & 25M & 0.0568\\ 422 | \thinhline 423 | 2 & 50M & 0.0568\\ 424 | \thickhline 425 | \end{tabularx} 426 | 427 | \subsubsection{Typical Performance (DHO800/900 series, LAN)} 428 | 429 | \begin{tabularx}{16cm}{llX} 430 | \thickhline 431 | \textbf{Channels} & \textbf{Memory depth} & \textbf{WFM/s}\\ 432 | \thickhline 433 | 1 & 1K & 11.9 (live mode available for 1Kpt/single channel)\\ 434 | \thinhline 435 | 2 & 1K & 3.4 \\ 436 | \thinhline 437 | 4 & 1K & 1.66 \\ 438 | \thinhline 439 | 1 & 10K & 3.31 \\ 440 | \thinhline 441 | 2 & 10K & 2.90 \\ 442 | \thinhline 443 | 4 & 10K & 1.65 \\ 444 | \thinhline 445 | 1 & 100K & 3.30 \\ 446 | \thinhline 447 | 4 & 100K & 1.64 \\ 448 | \thinhline 449 | 1 & 1M & 1.63 \\ 450 | \thinhline 451 | 4 & 1M & 0.57 \\ 452 | \thinhline 453 | 1 & 10M & 0.30 \\ 454 | \thinhline 455 | 4 & 10M & 0.07 \\ 456 | \thickhline 457 | \end{tabularx} 458 | 459 | \section{Rohde \& Schwarz} 460 | 461 | \subsection{rs} 462 | 463 | There is partial support for RTM3000 (and possibly others, untested) however it appears to have bitrotted. 464 | 465 | TODO (\issue{scopehal}{59}) 466 | 467 | \subsection{rs\_rto6} 468 | 469 | This driver supports the newer RTO6 family scopes (and possibly others, untested). 470 | 471 | \section{Saleae} 472 | TODO (\issue{scopehal}{16}) 473 | 474 | \section{Siglent} 475 | 476 | A driver for SDS2000X+/HD is available in the codebase which has been developed according to Siglent offical documentation 477 | (Programming Guide PG01-E11A). This driver should be functional across the 'next generation' SDS800X HD, SDS1000X HD, SDS2000X+, 478 | SDS2000X HD, SDS5000X, SDS6000A/L/Pro and SDS7000A scopes. It has been primarily developed using the SDS2000X+ and SDS2000X HD. 479 | Some older generation scopes are supported as well. 480 | 481 | Digital channels are not supported on any scope yet, due to lack of an MSO probe to test with. Many trigger types are 482 | not yet supported. 483 | 484 | \begin{tabularx}{16cm}{lllX} 485 | \thickhline 486 | \textbf{Device Family} & \textbf{Driver} & \textbf{Transport} & \textbf{Notes} \\ 487 | \thickhline 488 | SDS1000X-E series & siglent & lan & Initialises, triggers and downloads waveforms. More testing needed \\ 489 | \thinhline 490 | SDS2000X-E series & siglent & lan & Initialises, triggers and downloads waveforms. More testing needed \\ 491 | \thickhline 492 | SDS800X HD series & siglent & lan & Basic functionality complete/tested. \\ 493 | \thinhline 494 | SDS1000X HD series & siglent & lan & Basic functionality complete, needs testing. \\ 495 | \thinhline 496 | SDS2000X+ series & siglent & lan & Basic functionality complete. \\ 497 | \thinhline 498 | SDS2000X HD series & siglent & lan & Tested and works well on SDS2354x HD. \\ 499 | \thinhline 500 | SDS3000X HD series & siglent & lan & Basic functionality complete, needs testing. \\ 501 | \thinhline 502 | SDS5000X series & siglent & lan & Initialises, triggers and downloads waveforms. More testing needed \\ 503 | \thinhline 504 | SDS6000A/L/Pro series & siglent & lan & Tested and works well on SDS6204A. 10/12 bit models NOT supported, but unavailable for dev (not sold in western markets). \\ 505 | \thinhline 506 | SDS7000A series & siglent & lan & Basic functionality complete, needs testing. \\ 507 | \thickhline 508 | \end{tabularx} 509 | 510 | \subsubsection{Typical Performance (SDS2104X+, LAN)} 511 | 512 | \begin{figure}[h] 513 | \centering 514 | \includegraphics[width=16cm]{images/siglent-samples.png} 515 | \caption{Siglent sample speed for various combinations of depth and channels} 516 | \label{siglent_sample} 517 | \end{figure} 518 | 519 | 520 | \begin{tabularx}{16cm}{llX} 521 | \thickhline 522 | \textbf{Channels} & \textbf{Memory depth} & \textbf{WFM/s}\\ 523 | \thickhline 524 | 1 & 5-100K & 2.3 \\ 525 | \thinhline 526 | 2 & 5-100K & 1.6 \\ 527 | \thinhline 528 | 3 & 5-100K & 1.2 \\ 529 | \thinhline 530 | 4 & 5-100K & 1 \\ 531 | \thinhline 532 | 1 & 10M & 0.5 \\ 533 | \thinhline 534 | 2-4 & 10M & 0.15 \\ 535 | \thickhline 536 | \end{tabularx} 537 | 538 | These figures were obtained from a SDS2104X+ running firmware version 1.3.7R5. Different scopes and software 539 | revisions may vary. 540 | 541 | \subsubsection{Typical Performance (SDS2104X HD, LAN)} 542 | 543 | \begin{tabularx}{16cm}{llX} 544 | \thickhline 545 | \textbf{Channels} & \textbf{Memory depth} & \textbf{WFM/s}\\ 546 | \thickhline 547 | 1 & 10K & 8.2 \\ 548 | \thinhline 549 | 2 & 10K & 7.7 \\ 550 | \thinhline 551 | 4 & 10K & 5.4 \\ 552 | \thinhline 553 | 1 & 100K & 7.1 \\ 554 | \thinhline 555 | 4 & 100K & 4.2 \\ 556 | \thinhline 557 | 1 & 5M & 0.72 \\ 558 | \thinhline 559 | 4 & 5M & 0.09 \\ 560 | \thickhline 561 | \end{tabularx} 562 | 563 | These figures were obtained from a SDS2104X HD running firmware version 1.2.2.9. 564 | 565 | \section{Teledyne LeCroy / LeCroy} 566 | 567 | Teledyne LeCroy (and older LeCroy) devices use the same driver, but two different transports for LAN connections. 568 | 569 | While all Teledyne LeCroy / LeCroy devices use almost identical SCPI command sets, Windows based devices running 570 | XStream or MAUI use a custom framing protocol (``vicp") around the SCPI data while the lower end RTOS based devices use 571 | raw SCPI over TCP (``lan"). 572 | 573 | Please see the table below for details on which configuration to use with your hardware. 574 | 575 | \begin{tabularx}{16cm}{lllX} 576 | \thickhline 577 | \textbf{Device Family} & \textbf{Driver} & \textbf{Transport} & \textbf{Notes} \\ 578 | \thickhline 579 | DDA & lecroy & vicp & Tested on DDA5000A series \\ 580 | \thinhline 581 | HDO & lecroy & vicp & Tested on HDO9000 series \\ 582 | \thinhline 583 | LabMaster & lecroy & vicp & Untested, but should work for 4-channel setups\\ 584 | \thinhline 585 | MDA & lecroy & vicp & Untested, but should work\\ 586 | \thinhline 587 | SDA & lecroy & vicp & Tested on SDA 8Zi and 8Zi-A series\\ 588 | \thinhline 589 | T3DSO & ??? & ??? & Untested\\ 590 | \thinhline 591 | WaveAce & ??? & ??? & Untested\\ 592 | \thinhline 593 | WaveJet & ??? & ??? & Untested\\ 594 | \thinhline 595 | WaveMaster & lecroy & vicp & Same hardware as SDA/DDA\\ 596 | \thinhline 597 | WaveRunner & lecroy & vicp & Tested on WaveRunner Xi, 8000, and 9000 series\\ 598 | \thinhline 599 | WaveSurfer & lecroy & vicp & Tested on WaveSurfer 3000 series \\ 600 | \thickhline 601 | \end{tabularx} 602 | 603 | \subsection{lecroy} 604 | 605 | This is the primary driver for MAUI based Teledyne LeCroy / LeCroy devices. 606 | 607 | This driver has been tested on a wide range of Teledyne LeCroy / LeCroy hardware. It should be compatible with any 608 | Teledyne LeCroy or LeCroy oscilloscope running Windows XP or newer and the MAUI or XStream software. 609 | 610 | \subsubsection{Typical Performance (HDO9204, VICP)} 611 | 612 | \begin{tabularx}{16cm}{llX} 613 | \thickhline 614 | \textbf{Channels} & \textbf{Memory depth} & \textbf{WFM/s}\\ 615 | \thickhline 616 | 1 & 100K & >50 \\ 617 | \thinhline 618 | 1 & 400K & 29 - 35 \\ 619 | \thinhline 620 | 2 & 100K & 30 - 40 \\ 621 | \thinhline 622 | 4 & 100K & 17 - 21 \\ 623 | \thinhline 624 | 1 & 2M & 9 - 11 \\ 625 | \thinhline 626 | 1 & 10M & 2.2 - 2.6 \\ 627 | \thinhline 628 | 4 & 1M & 5.2 - 6.5 \\ 629 | \thinhline 630 | 1 & 64M & 0.41 - 0.42 \\ 631 | \thinhline 632 | 2 & 64M & 0.21 - 0.23 \\ 633 | \thinhline 634 | 4 & 64M & 0.12 - 0.13 \\ 635 | \thickhline 636 | \end{tabularx} 637 | 638 | \subsubsection{Typical Performance (WaveRunner 8404M-MS, VICP)} 639 | 640 | \begin{tabularx}{16cm}{llX} 641 | \thickhline 642 | \textbf{Channels} & \textbf{Memory depth} & \textbf{WFM/s}\\ 643 | \thickhline 644 | 1 & 80K & 35 - 45 \\ 645 | \thinhline 646 | 2 & 80K & 35 - 45 \\ 647 | \thinhline 648 | 2 & 800K & 16 - 17 \\ 649 | \thinhline 650 | 2 & 8M & 3.1 - 3.2 \\ 651 | \thickhline 652 | \end{tabularx} 653 | 654 | \subsection{lecroy\_fwp} 655 | 656 | This is a special performance-enhanced extension of the base ``lecroy" driver which takes advantage of the FastWavePort 657 | feature of the instrument to gain high speed access to waveform data via shared memory. Waveforms are pulled from 658 | shared memory when a synchronization event fires, then pushed to the client via a separate TCP socket on port 1862. 659 | 660 | On low latency LANs, typical performance increases observed with SDA 8Zi series instruments are on the order of 2x 661 | throughput vs using the base driver downloading waveforms via SCPI. On higher latency connections such as VPNs, the 662 | performance increase is likely to be even higher because the push-based model eliminates the need for polling (which 663 | performs increasingly poorly as latency increases). 664 | 665 | To use this driver, your instrument must have the XDEV software option installed and the 666 | \href{https://github.com/ngscopeclient/scopehal-fwp-bridge}{scopehal-fwp-bridge} server application running. If the 667 | bridge or option are not detected, the driver falls back to SCPI waveform download and will behave identically to the 668 | base ``lecroy" driver. 669 | 670 | There are some limitations to be aware of with this driver: 671 | \begin{itemize} 672 | 673 | \item Maxmimum memory depth is limited to no more than 40M samples per channel, regardless of installed instrument 674 | memory. This is an architectural limitation of the FastWavePort API; the next generation FastMultiWavePort API eliminates 675 | this restriction however scopehal-fwp-bridge does not yet support it due to poor documentation. 676 | 677 | \item MSO channels are not supported, because neither FastWavePort nor FastMultiWavePort provide shared memory access to 678 | digital channel data. There is no known workaround for this given current instrument APIs. 679 | 680 | \item A maximum of four analog channels are supported even if the instrument actually has eight. There are no major 681 | technical blockers to fixing this under FastWavePort however no 8-channel instruments are available to the developers as 682 | of this writing, so there is no way to test potential fixes. FastMultiWavePort has a limit of four channels per instance, 683 | but it may be possible to instantiate multiple copies of the FastMultiWavePort block to work around this. 684 | 685 | \item Math functions F9-F12 are used by the FastWavePort blocks and cannot be used for other math functions. 686 | 687 | \end{itemize} 688 | 689 | \section{Tektronix} 690 | 691 | This driver is being primarily developed on a MSO64. It supports SCPI over LXI VXI-11 or TCP sockets. 692 | 693 | The hardware supports USBTMC, however waveform download via USBTMC does not work with libscopehal for unknown reasons. 694 | 695 | \begin{tabularx}{16cm}{lllX} 696 | \thickhline 697 | \textbf{Device Family} & \textbf{Driver} & \textbf{Transport} & \textbf{Notes} \\ 698 | \thickhline 699 | MSO5 series & tektronix & lan, lxi & \\ 700 | \thinhline 701 | MSO6 series & tektronix & lan, lxi & \\ 702 | \thickhline 703 | \end{tabularx} 704 | 705 | \subsection{Note regarding ``lan" transport on MSO5/6} 706 | 707 | The default settings for raw SCPI access on the MSO6 series use a full terminal emulator rather than raw SCPI 708 | commands. To remove the prompts and help text, go to Utility | I/O, then under the Socket Server panel select protocol 709 | ``None" rather than the default of ``Terminal". 710 | 711 | \subsubsection{Typical Performance (MSO64, LXI, embedded OS)} 712 | 713 | \begin{tabularx}{16cm}{llX} 714 | \thickhline 715 | \textbf{Channels} & \textbf{Memory depth} & \textbf{WFM/s}\\ 716 | \thickhline 717 | 1 & 50K & 10.3 - 11.4 \\ 718 | \thinhline 719 | 2 & 50K & 6.7 - 7.2 \\ 720 | \thinhline 721 | 4 & 50K & 5.1 - 5.3 \\ 722 | \thinhline 723 | 1 & 500K & 8.7 - 9.5 \\ 724 | \thinhline 725 | 4 & 500K & 3.8 - 3.9 \\ 726 | \thickhline 727 | \end{tabularx} 728 | 729 | \section{tinySA} 730 | 731 | This driver is meant to be used with tinySA and tinySA ULTRA spectrum analyzers. 732 | 733 | It has been developed and tested on a tinySA ULTRA. 734 | 735 | The communication with the device is made with UART transport layer. 736 | 737 | \begin{tabularx}{16cm}{lllX} 738 | \thickhline 739 | \textbf{Device Family} & \textbf{Driver} & \textbf{Transport} & \textbf{Notes} \\ 740 | \thickhline 741 | tinySA & tiny\_sa & uart & Not tested but should work \\ 742 | \thinhline 743 | tinySA ULTRA & tiny\_sa & uart & Driver tested on this device \\ 744 | \thickhline 745 | \end{tabularx} 746 | 747 | \section{Xilinx} 748 | TODO (\issue{scopehal}{40}) 749 | -------------------------------------------------------------------------------- /section-sdr-drivers.tex: -------------------------------------------------------------------------------- 1 | \chapter{SDR Drivers} 2 | \label{sec:sdr-drivers} 3 | 4 | This chapter describes all of the available drivers for software-defined radios. 5 | 6 | \section{Ettus Research} 7 | 8 | \begin{tabularx}{16cm}{lllX} 9 | \thickhline 10 | \textbf{Device Family} & \textbf{Driver} & \textbf{Transport} & \textbf{Notes} \\ 11 | \thickhline 12 | USRP & uhd & twinlan & \\ 13 | \thickhline 14 | \end{tabularx} 15 | 16 | \subsection{uhd} 17 | 18 | This driver connects via a TCP socket to a socket server 19 | \href{https://github.com/ngscopeclient/scopehal-uhd-bridge}{scopehal-uhd-bridge} which connects to the appropriate 20 | instrument using the UHD API. 21 | 22 | This provides network transparency for USB-attached instruments, as well as a license boundary between the BSD-licensed 23 | libscopehal core and the GPL-licensed UHD API. 24 | 25 | \section{Microphase} 26 | 27 | The AntSDR running antsdr\_uhd firmware is supported by the ``uhd" driver for Ettus Research SDRs. There is currently no 28 | support for the IIO firmware. 29 | -------------------------------------------------------------------------------- /section-spectrometer-drivers.tex: -------------------------------------------------------------------------------- 1 | \chapter{Spectrometer Drivers} 2 | \label{sec:spec-drivers} 3 | 4 | This chapter describes all of the available drivers for optical (UV/VIS/IR) spectrometers. 5 | 6 | \section{ASEQ Instruments} 7 | 8 | \begin{tabularx}{16cm}{lllX} 9 | \thickhline 10 | \textbf{Device Family} & \textbf{Driver} & \textbf{Transport} & \textbf{Notes} \\ 11 | \thickhline 12 | LR1 & aseq & twinlan & \\ 13 | \thickhline 14 | \end{tabularx} 15 | 16 | \subsection{aseq} 17 | 18 | TODO: write stuff here 19 | -------------------------------------------------------------------------------- /section-streambrowser.tex: -------------------------------------------------------------------------------- 1 | \chapter{Stream Browser} 2 | \label{streambrowser} 3 | 4 | \section{Introduction} 5 | 6 | The stream browser 7 | -------------------------------------------------------------------------------- /section-timeline.tex: -------------------------------------------------------------------------------- 1 | \chapter{Timeline} 2 | 3 | The timeline is displayed at the top of each waveform group and shows the X axis scale for the group. The timeline (and 4 | all accompanying waveform views in the group) may be zoomed by scrolling with the mouse wheel, or panned by dragging 5 | with the left mouse button. 6 | 7 | Unlike classical oscilloscope user interfaces, there is \emph{no relationship} between the timeline scale or position 8 | and the duration of the acquisition. It is possible to zoom or scroll beyond the end of the acquisition (displaying 9 | empty background with no signal) or have a deep capture in which nearly all acquired data is offscreen. 10 | 11 | Note that the timeline may occasionally show units other than time. For example, an ``eye width" measurement has X axis 12 | units of voltage and Y axis units of time, and a spectrum analyzer channel has X axis units of frequency. 13 | 14 | 15 | \begin{figure}[h] 16 | \centering 17 | \includegraphics[width=14cm]{images/timeline.png} 18 | \caption{The timeline} 19 | \label{timeline} 20 | \end{figure} 21 | 22 | The position of the trigger event is marked by a downward-pointing arrow on the timeline, color coded to match the 23 | channel selected as the primary trigger source. The trigger arrow cannot be interacted with currently, but in the future 24 | (scopehal-apps:173) it will be draggable to adjust the trigger position. 25 | 26 | Double-clicking on the timeline brings up the timebase properties dialog (Fig. \ref{timebase-properties}), which allows 27 | the sample rate and memory depth to be configured. If multiple instruments are connected, a separate tab appears in the 28 | dialog for each instrument. 29 | 30 | \begin{figure}[h] 31 | \centering 32 | \includegraphics[width=9cm]{images/timebase-properties.png} 33 | \caption{Timebase properties (time domain)} 34 | \label{timebase-properties} 35 | \end{figure} 36 | 37 | If the instrument is a spectrum analyzer, or has frequency-domain analysis capability (such as the Tektronix MSO5 and 38 | MSO6 oscilloscopes), the timebase properties dialog will have a second page (Fig. \ref{timebase-properties-freq}) for 39 | setting the span and resolution bandwidth for frequency-domain channels. Center frequency is often a per-channel 40 | adjustment on multichannel instruments, so it is configured from the channel properties dialog rather than timebase 41 | properties. 42 | 43 | \begin{figure}[h] 44 | \centering 45 | \includegraphics[width=9cm]{images/timebase-properties-freq.png} 46 | \caption{Timebase properties (frequency domain)} 47 | \label{timebase-properties-freq} 48 | \end{figure} 49 | -------------------------------------------------------------------------------- /section-transports.tex: -------------------------------------------------------------------------------- 1 | \chapter{Transports} 2 | \label{sec:transports} 3 | 4 | Libscopehal uses a ``transport" object in order to pass commands and data to instruments, in order to decouple the 5 | specifics of LXI, USBTMC, etc. from individual instrument drivers. This section describes the supported transports and 6 | their usage and limitations. 7 | 8 | Not all transports are possible to use with any given driver due to hardware limitations or software/firmware quirks. 9 | For details on which transport(s) are usable with a particular instrument, consult the documentation for that device's 10 | driver. 11 | 12 | \section{gpib} 13 | 14 | SCPI over GPIB. 15 | 16 | This transport takes up to four arguments: GPIB board index, primary address, secondary address, and timeout value. 17 | Only board index and primary address are required. We currently support using a single GPIB device per GPIB board 18 | (interface) in a ngscopeclient session. You cannot currently access multiple devices in the same or across instances. 19 | Better support for multiple instrument on a single board is planned. 20 | 21 | NOTE: The current implementation of this driver only works on Linux, using the linux-gpib library. 22 | 23 | Example: 24 | \begin{lstlisting}[language=sh, numbers=none] 25 | ngscopeclient myscope:keysightdca:gpib:0:7 26 | \end{lstlisting} 27 | 28 | \section{lan} 29 | 30 | SCPI over TCP with no further encapsulation. 31 | 32 | This transport takes two arguments: hostname/IP and port number. 33 | 34 | If port number is not specified, uses TCP port 5025 (IANA assigned) by default. Note that Rigol oscilloscopes use the 35 | non-standard port 5555, not 5025, so the port number must always be specified when using a Rigol instrument. 36 | 37 | Example: 38 | \begin{lstlisting}[language=sh, numbers=none] 39 | ngscopeclient myscope:rigol:lan:192.0.2.9:5555 40 | \end{lstlisting} 41 | 42 | \section{lxi} 43 | 44 | SCPI over LXI VXI-11. 45 | 46 | Note that due to the remote procedure call paradigm used by LXI, it is not possible to batch multiple outstanding 47 | requests to an instrument when using this transport. Some instruments may experience reduced performance when using LXI 48 | as the transport. Drivers which require command batching may not be able to use LXI VXI-11 as the transport even if the 49 | instrument supports it. 50 | 51 | Example: 52 | \begin{lstlisting}[language=sh, numbers=none] 53 | ngscopeclient myscope:tektronix:lxi:192.0.2.9 54 | \end{lstlisting} 55 | 56 | \section{null} 57 | 58 | This transport does nothing, and is used as a placeholder for development simulations or non-SCPI instruments. 59 | 60 | NOTE: Due to limitations of the current command line argument parsing code, an argument must be provided to all 61 | transports, including this one, when connecting via the command line. Since the argument is ignored, any non-empty 62 | string may be used. 63 | 64 | Example: 65 | \begin{lstlisting}[language=sh, numbers=none] 66 | ngscopeclient sim:demo:null:blah 67 | \end{lstlisting} 68 | 69 | \section{socketcan} 70 | 71 | This transport provides a bridge for accessing the native Linux SocketCAN API from the scopehal driver layer. When 72 | paired with the ``socketcan" oscilloscope driver and a suitable CAN peripheral, it allows ngscopeclient to be used as a 73 | CAN bus protocol analyzer. Since SocketCAN is a Linux-only API, this transport is not available on other platforms. 74 | 75 | This transport takes one argument: the device name (e.g. ``can0") 76 | 77 | \section{twinlan} 78 | 79 | This transport is used by some Antikernel Labs oscilloscopes, as well as most of the bridge servers used for interfacing 80 | libscopehal with USB oscilloscopes' SDKs. It takes three arguments: hostname/IP and two port numbers. 81 | 82 | It uses two TCP sockets on different ports. The first carries SCPI text (as in the ``lan" transport), and the second is 83 | for binary waveform data. 84 | 85 | If port numbers are not specified, the SCPI port defaults to the IANA standard of 5025, and the data port defaults to 86 | 5026. If the SCPI port but not the data port is specified, the data port defaults to the SCPI port plus one. 87 | 88 | \section{uart} 89 | 90 | SCPI over RS-232 or USB-UART. 91 | 92 | This transport takes 3 arguments: device path (required), baud rate (optional), and flags (optional). If baud rate is not specified, it 93 | defaults to 115200. 94 | 95 | Example: 96 | \begin{lstlisting}[language=sh, numbers=none] 97 | ngscopeclient myscope:rigol:uart:/dev/ttyUSB0:115200 98 | \end{lstlisting} 99 | 100 | Some devices, like the NanoVNA, need to activate the DTR line to communicate. This can be achieved by adding the DTR flag to the connection string. 101 | 102 | Example: 103 | \begin{lstlisting}[language=sh, numbers=none] 104 | ngscopeclient NanoVNA-F:nanovna:uart:COM6:115200:DTR 105 | \end{lstlisting} 106 | 107 | 108 | \section{usbtmc} 109 | 110 | SCPI over USB Test \& Measurement Class protocol. 111 | 112 | This transport takes two arguments: the path to the usbtmc kernel device object and the TMC transfer size (optional). As Workaround for Siglent SDS1x04x-E set size to 48. 113 | 114 | NOTE: The current implementation of this driver only works on Linux. There is currently no support for USBTMC on 115 | Windows (\issue{scopehal}{301}) 116 | 117 | Example: 118 | \begin{lstlisting}[language=sh, numbers=none] 119 | ngscopeclient myscope:siglent:usbtmc:/dev/usbtmc0:48 120 | \end{lstlisting} 121 | 122 | \section{vicp} 123 | 124 | SCPI over Teledyne LeCroy Virtual Instrument Control Protocol. 125 | 126 | This transport takes two arguments: hostname/IP and port number. 127 | 128 | If port number is not specified, uses TCP port 1861 (IANA assigned) by default. 129 | 130 | Example: 131 | \begin{lstlisting}[language=sh, numbers=none] 132 | ngscopeclient myscope:lecroy:vicp:192.0.2.9 133 | \end{lstlisting} 134 | 135 | \section{hid} 136 | 137 | This transport layer is usually used by binary drivers to communicate with Test \& Measurement equiment over USB. 138 | 139 | This transport takes two arguments: vendor ID (hex) and product ID (hex). 140 | 141 | Optionally a third argument can be added with the instrument's serial number. 142 | If not provided, the instrument's serial number is automatically pulled at first connection and stored in the connection string. 143 | 144 | Example: 145 | \begin{lstlisting}[language=sh, numbers=none] 146 | ngscopeclient AlientekDP100:alientek_dp:hid:2e3c:af01 147 | \end{lstlisting} 148 | -------------------------------------------------------------------------------- /section-triggers.tex: -------------------------------------------------------------------------------- 1 | \chapter{Triggers} 2 | 3 | \section{Trigger Properties} 4 | 5 | The \menustyle{Setup / Trigger} menu opens the trigger properties dialog (Fig. \ref{trigger-properties}). 6 | 7 | The Trigger Type box allows the type of trigger to be chosen. The list of available triggers depends on the instrument 8 | model and installed software options. 9 | 10 | The Trigger Offset field specifies the time from the \emph{start} of the waveform to the trigger point. Positive values 11 | move the trigger later into the waveform, negative values introduce a delay between the trigger and the start of the 12 | waveform. \footnote{This is a different convention than most oscilloscopes, which typically measure the trigger 13 | position from the \emph{midpoint} of the waveform. Since ngscopeclient decouples the acquisition length from the UI 14 | zoom setting, measuring from the midpoint makes little sense as there are no obvious visual cues to the midpoint's 15 | location.} 16 | 17 | \begin{figure}[h] 18 | \centering 19 | \includegraphics[width=9cm]{images/trigger-properties.png} 20 | \caption{Trigger properties dialog} 21 | \label{trigger-properties} 22 | \end{figure} 23 | 24 | The remaining settings in the trigger properties dialog depend on the specific trigger type chosen. 25 | 26 | \section{Serial Pattern Triggers} 27 | 28 | All serial pattern triggers take one or two pattern fields, a radix, and a condition. 29 | 30 | For conditions like ``between" or ``not between" both patterns are used, and no wildcards are allowed. For other 31 | conditions, only the first pattern is used. 32 | 33 | Patterns may be specified as ASCII text, hex, or binary. ``Don't care" nibbles/bits may be specified in hex/binary 34 | patterns as ``X", for example ``3fx8" or ``1100010xxx1". 35 | 36 | \pagebreak 37 | 38 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 39 | \section{Dropout} 40 | 41 | Triggers when a signal stops toggling for a specified amount of time. 42 | 43 | \subsection{Inputs} 44 | 45 | \begin{tabularx}{16cm}{llX} 46 | \thickhline 47 | \textbf{Signal name} & \textbf{Type} & \textbf{Description} \\ 48 | \thickhline 49 | din & Analog or digital & Input signal \\ 50 | \end{tabularx} 51 | 52 | \subsection{Parameters} 53 | 54 | \begin{tabularx}{16cm}{llX} 55 | \thickhline 56 | \textbf{Parameter name} & \textbf{Type} & \textbf{Description} \\ 57 | \thickhline 58 | Edge & Enum & Specifies the polarity of edge to look for (rising or falling) \\ 59 | \thinhline 60 | Dropout Time & Int & Dropout time needed to trigger \\ 61 | \thinhline 62 | Level & Float & Voltage threshold\\ 63 | \thinhline 64 | Reset Mode & Enum & Specifies whether to reset the timer on the opposite edge \\ 65 | \thickhline 66 | \end{tabularx} 67 | 68 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 69 | \section{Edge} 70 | 71 | Triggers on edges in the signal. 72 | 73 | Edge types ``rising" and ``falling" are self-explanatory. ``Any" triggers on either rising or falling edges. 74 | ``Alternating" is a unique trigger mode only found on certain Agilent/Keysight oscilloscopes, which alternates each 75 | waveform between rising and falling edge triggers. 76 | 77 | \subsection{Inputs} 78 | 79 | \begin{tabularx}{16cm}{llX} 80 | \thickhline 81 | \textbf{Signal name} & \textbf{Type} & \textbf{Description} \\ 82 | \thickhline 83 | din & Analog or digital & Input signal \\ 84 | \end{tabularx} 85 | 86 | \subsection{Parameters} 87 | 88 | \begin{tabularx}{16cm}{llX} 89 | \thickhline 90 | \textbf{Parameter name} & \textbf{Type} & \textbf{Description} \\ 91 | \thickhline 92 | Edge & Enum & Specifies the polarity of edge to look for\\ 93 | \thinhline 94 | Level & Float & Voltage threshold\\ 95 | \thickhline 96 | \end{tabularx} 97 | 98 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 99 | \section{Glitch} 100 | 101 | TODO: This is supported on at least LeCroy hardware, but it's not clear how it differs from pulse width. 102 | 103 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 104 | 105 | \section{Pulse Width} 106 | 107 | Triggers when a high or low pulse meeting specified width criteria is seen. 108 | 109 | \begin{tabularx}{16cm}{llX} 110 | \thickhline 111 | \textbf{Signal name} & \textbf{Type} & \textbf{Description} \\ 112 | \thickhline 113 | din & Analog or digital & Input signal \\ 114 | \thickhline 115 | \end{tabularx} 116 | 117 | \subsection{Parameters} 118 | 119 | \begin{tabularx}{16cm}{llX} 120 | \thickhline 121 | \textbf{Parameter name} & \textbf{Type} & \textbf{Description} \\ 122 | \thickhline 123 | Condition & Enum & Match condition (greater, less, between, or not between) \\ 124 | \thinhline 125 | Edge & Enum & Specifies the polarity of edge to look for\\ 126 | \thinhline 127 | Level & Float & Voltage threshold\\ 128 | \thinhline 129 | Lower Bound & Int & Lower width threshold\\ 130 | \thinhline 131 | Upper Bound & Int & Upper width threshold\\ 132 | \thickhline 133 | \end{tabularx} 134 | 135 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 136 | \section{Runt} 137 | 138 | Triggers when a pulse of specified width crosses one threshold, but not a second. 139 | 140 | \begin{tabularx}{16cm}{llX} 141 | \thickhline 142 | \textbf{Signal name} & \textbf{Type} & \textbf{Description} \\ 143 | \thickhline 144 | din & Analog & Input signal \\ 145 | \thickhline 146 | \end{tabularx} 147 | 148 | \subsection{Parameters} 149 | 150 | \begin{tabularx}{16cm}{llX} 151 | \thickhline 152 | \textbf{Parameter name} & \textbf{Type} & \textbf{Description} \\ 153 | \thickhline 154 | Condition & Enum & Match condition (greater, less, between, or not between) \\ 155 | \thinhline 156 | Edge Slope & Enum & Specifies the polarity of edge to look for\\ 157 | \thinhline 158 | Lower Interval & Int & Lower width threshold\\ 159 | \thinhline 160 | Lower Level & Float & Lower voltage threshold\\ 161 | \thinhline 162 | Upper Interval & Int & Upper width threshold\\ 163 | \thinhline 164 | Upper Level & Float & Upper voltage threshold\\ 165 | \thickhline 166 | \end{tabularx} 167 | 168 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 169 | \section{Slew Rate} 170 | 171 | Triggers when an edge is faster or slower than a specified rate. 172 | 173 | \begin{tabularx}{16cm}{llX} 174 | \thickhline 175 | \textbf{Signal name} & \textbf{Type} & \textbf{Description} \\ 176 | \thickhline 177 | din & Analog & Input signal \\ 178 | \thickhline 179 | \end{tabularx} 180 | 181 | \subsection{Parameters} 182 | 183 | \begin{tabularx}{16cm}{llX} 184 | \thickhline 185 | \textbf{Parameter name} & \textbf{Type} & \textbf{Description} \\ 186 | \thickhline 187 | Condition & Enum & Match condition (greater, less, between, or not between) \\ 188 | \thinhline 189 | Edge Slope & Enum & Specifies the polarity of edge to look for\\ 190 | \thinhline 191 | Lower Interval & Int & Lower width threshold\\ 192 | \thinhline 193 | Lower Level & Float & Lower voltage threshold\\ 194 | \thinhline 195 | Upper Interval & Int & Upper width threshold\\ 196 | \thinhline 197 | Upper Level & Float & Upper voltage threshold\\ 198 | \thickhline 199 | \end{tabularx} 200 | 201 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 202 | \section{UART} 203 | 204 | Triggers when a byte or byte sequence is seen on a UART. 205 | 206 | \subsection{Inputs} 207 | 208 | \begin{tabularx}{16cm}{llX} 209 | \thickhline 210 | \textbf{Signal name} & \textbf{Type} & \textbf{Description} \\ 211 | \thickhline 212 | din & Analog or digital & Input signal \\ 213 | \thickhline 214 | \end{tabularx} 215 | 216 | \subsection{Parameters} 217 | 218 | \begin{tabularx}{16cm}{llX} 219 | \thickhline 220 | \textbf{Parameter name} & \textbf{Type} & \textbf{Description} \\ 221 | \thickhline 222 | Bit Rate & Int & Baud rate \\ 223 | \thinhline 224 | Condition & Enum & Match condition \\ 225 | \thinhline 226 | Level & Float & Voltage threshold\\ 227 | \thinhline 228 | Parity Mode & Enum & Odd, even, or no parity \\ 229 | \thinhline 230 | Pattern & String & First match pattern\\ 231 | \thinhline 232 | Pattern 2 & String & Second match pattern \\ 233 | \thinhline 234 | Polarity & Enum & Idle high (normal UART) or idle low (RS232)\\ 235 | \thinhline 236 | Radix & Enum & Radix for the patterns\\ 237 | \thinhline 238 | Stop Bits & Float & Number of stop bits\\ 239 | \thinhline 240 | Trigger Type & Enum & Match data pattern or parity error\\ 241 | \thickhline 242 | \end{tabularx} 243 | 244 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 245 | 246 | \section{Window} 247 | 248 | Triggers when a signal goes above or below specified thresholds. 249 | 250 | The available configuration settings for this trigger vary from instrument to instrument. 251 | 252 | \begin{tabularx}{16cm}{llX} 253 | \thickhline 254 | \textbf{Signal name} & \textbf{Type} & \textbf{Description} \\ 255 | \thickhline 256 | din & Analog & Input signal \\ 257 | \thickhline 258 | \end{tabularx} 259 | 260 | \subsection{Parameters} 261 | 262 | \begin{tabularx}{16cm}{llX} 263 | \thickhline 264 | \textbf{Parameter name} & \textbf{Type} & \textbf{Description} \\ 265 | \thickhline 266 | Condition & Enum & Specifies whether to trigger on entry or exit from the window, and whether to trigger immediately or 267 | after a time limit.\\ 268 | \thinhline 269 | Edge & Enum & Specifies which edge of the window to trigger on\\ 270 | \thinhline 271 | Lower Level & Float & Lower voltage threshold\\ 272 | \thinhline 273 | Upper Level & Float & Upper voltage threshold\\ 274 | \thickhline 275 | \end{tabularx} 276 | 277 | -------------------------------------------------------------------------------- /section-tutorials.tex: -------------------------------------------------------------------------------- 1 | \chapter{Tutorials} 2 | 3 | This section contains step-by-step examples to help you familiar yourself with the basics of using ngscopeclient. 4 | 5 | Many of them can be done offline using the built-in demo oscilloscope or saved example waveform datasets - no lab 6 | access required! 7 | 8 | \section{The Basics} 9 | 10 | \begin{itemize} 11 | \item \textbf{Lab requirements:} None, can be performed offline 12 | \item \textbf{Learning goals:} Navigating the ngscopeclient UI and performing common operations 13 | \end{itemize} 14 | 15 | \subsection{Connecting to an Oscilloscope} 16 | 17 | We need to be connected to an instrument to do much of anything useful. Let's use the built-in demo scope for that. 18 | 19 | \begin{enumerate} 20 | \item Start with a new, empty ngscopeclient session 21 | \item Select \menustyle{Add / Oscilloscope / Connect...} from the top menu. 22 | \item Select the ``demo" driver and ``null" transport. Leave the path blank, since the demo scope doesn't need any 23 | connection information. 24 | \item Give the demo scope a nickname of your choice. This will be used to disambiguate scope channels and properties 25 | dialogs if you have more than one instrument connected, as well as to let you reconnect to the instrument quickly in 26 | the future. 27 | 28 | \begin{figure}[h] 29 | \centering 30 | \bigimage{ng-images/tutorials/basics/connect-example.png} 31 | \caption{Connection dialog} 32 | \label{basic-connect} 33 | \end{figure} 34 | 35 | \item Click the ``add" button. You should be presented with an oscilloscope view showing four empty channels stacked on 36 | top of each other. 37 | 38 | \begin{figure}[h] 39 | \centering 40 | \bigimage{ng-images/tutorials/basics/connected.png} 41 | \caption{Application window after connecting to demo scope} 42 | \label{basic-connected} 43 | \end{figure} 44 | 45 | \end{enumerate} 46 | 47 | \FloatBarrier 48 | 49 | \subsection{Acquiring Waveforms} 50 | 51 | Looks pretty boring! Let's grab some waveforms so we have something to look at. 52 | 53 | Note: The current demo scope is a simplistic instrument that doesn't implement realistic trigger semantics, so most of 54 | the usual trigger settings you might expect from real scopes (adjusting trigger level, horizontal position, selecting 55 | type of edge or condition) aren't available. It will always trigger immediately when armed and return waveforms at the 56 | same horizontal position. 57 | 58 | \begin{enumerate} 59 | \item Press the ``single trigger" button (second from left on the toolbar). You should see waveforms appear in each 60 | channel. 61 | 62 | \begin{figure}[h] 63 | \centering 64 | \bigimage{ng-images/tutorials/basics/first-waveform.png} 65 | \caption{Our first waveforms} 66 | \label{basic-first} 67 | \end{figure} 68 | 69 | \item Press the ``normal trigger" button (leftmost on the toolbar). You should see the waveform display begin updating 70 | live. 71 | 72 | \item Press the ``stop" button (fourth from left on the toolbar) to stop acquiring waveforms. 73 | 74 | \end{enumerate} 75 | 76 | \subsection{Navigating the Y Axis} 77 | 78 | All of the waveforms in the demo scope are centered around zero volts and just the right amplitude to fill the view. 79 | But in real life we're usually not that lucky. Let's try moving one of the waveforms around. 80 | 81 | \begin{enumerate} 82 | \item Move the mouse over the Y axis at the right side of one of the plots. 83 | \item Click and drag with the left button to move the waveform vertically (adjusting frontend offset). 84 | \item Scroll with the mouse wheel to scale the waveform vertically (adjusting frontend gain). 85 | 86 | \begin{figure}[h] 87 | \centering 88 | \bigimage{ng-images/tutorials/basics/moved-waveform.png} 89 | \caption{Demo channel after making some gain and offset tweaks} 90 | \label{basic-moved} 91 | \end{figure} 92 | 93 | \subsection{Navigating the X Axis} 94 | 95 | The timebase in ngscopeclient is decoupled from the viewport, so you can zoom and pan arbitrarily in the X axis without 96 | changing timebase settings. 97 | 98 | Although we've only been looking at a $25 ns$ wide window of the waveform so far, the default settings for the demo scope 99 | are 100K points at 50 Gsps ($2 \mu s$ record length). Let's explore the rest of the waveform. 100 | 101 | \begin{enumerate} 102 | \item Move the mouse over the main plot area and scroll with the mouse wheel to zoom in or out, centering at the mouse 103 | cursor position. 104 | \item Move the mouse over the timeline at the top of the viewport and drag with the left button to move the waveform 105 | side to side without changing zoom. 106 | 107 | \begin{figure}[h] 108 | \centering 109 | \bigimage{ng-images/tutorials/basics/zoomed-waveform.png} 110 | \caption{Demo session after zooming out to show entire waveform} 111 | \label{basic-zoomed} 112 | \end{figure} 113 | 114 | \end{enumerate} 115 | 116 | \end{enumerate} 117 | 118 | -------------------------------------------------------------------------------- /section-vna-drivers.tex: -------------------------------------------------------------------------------- 1 | \chapter{VNA Drivers} 2 | \label{sec:vna-drivers} 3 | 4 | This chapter describes all of the available drivers for vector network analyzers. 5 | 6 | \section{Copper Mountain} 7 | 8 | \begin{tabularx}{16cm}{lllX} 9 | \thickhline 10 | \textbf{Device Family} & \textbf{Driver} & \textbf{Transport} & \textbf{Notes} \\ 11 | \thickhline 12 | Planar & coppermt & lan & Not tested, but docs say same command set \\ 13 | \thinhline 14 | S5xxx & coppermt & lan & Tested on S5180B \\ 15 | \thinhline 16 | S7530 & coppermt & lan & Not tested, but docs say same command set \\ 17 | \thinhline 18 | SC50xx & coppermt & lan & Not tested, but docs say same command set \\ 19 | \thinhline 20 | C1xxx & coppermt & lan & Not tested, but docs say same command set \\ 21 | \thinhline 22 | C2xxx & coppermt & lan & Not tested, but docs say same command set \\ 23 | \thinhline 24 | C4xxx & coppermt & lan & Not tested, but docs say same command set \\ 25 | \thinhline 26 | M5xxx & coppermt & lan & Not tested, but docs say same command set \\ 27 | \thickhline 28 | \end{tabularx} 29 | 30 | \subsection{coppermt} 31 | 32 | This driver supports the S2VNA and S4VNA software from Copper Mountain. 33 | 34 | As of this writing, only 2-port VNAs are supported. 4-port VNAs will probably work using only the first two ports, 35 | but this has not been tested. 36 | 37 | \section{NanoVNA} 38 | 39 | \begin{tabularx}{16cm}{lllX} 40 | \thickhline 41 | \textbf{Device Family} & \textbf{Driver} & \textbf{Transport} & \textbf{Notes} \\ 42 | \thickhline 43 | NanoVNA & nanovna & uart & Not tested but should work\\ 44 | \thinhline 45 | NanoVNA-D & nanovna & uart & Not tested but should work\\ 46 | \thinhline 47 | NanoVNA-F & nanovna & uart & Not tested but should work\\ 48 | \thinhline 49 | DeepVNA 101 & nanovna & uart & Development and tests made on this device (a.k.a. NanoVNA-F Deepelec)\\ 50 | \thinhline 51 | NanoVNA-F\_V2 & nanovna & uart & Not tested but should work\\ 52 | \thinhline 53 | NanoVNA-H & nanovna & uart & Not tested but should work\\ 54 | \thinhline 55 | NanoVNA-H4 & nanovna & uart & Not tested but should work\\ 56 | \thickhline 57 | \end{tabularx} 58 | 59 | \subsection{nanovna} 60 | 61 | This driver supports the NanoVNA with different variants of the original design and firmware (see above). 62 | 63 | Communication with the device uses UART transport layer with a connection string looking like this (DTR flag is required): 64 | \begin{lstlisting}[language=sh, numbers=none] 65 | COM6:115200:DTR 66 | \end{lstlisting} 67 | 68 | Paginated sweep has been implemented to achieve memory depths greater then the device's internal limit. 69 | 70 | Pagination is also used at low RBW to prevent the connection from timing out during sweep. 71 | 72 | NanoVNA V2 (with binary protocol) is NOT supported. 73 | 74 | \section{Pico Technology} 75 | 76 | \begin{tabularx}{16cm}{lllX} 77 | \thickhline 78 | \textbf{Device Family} & \textbf{Driver} & \textbf{Transport} & \textbf{Notes} \\ 79 | \thickhline 80 | PicoVNA 106 & picovna & lan & \\ 81 | \thinhline 82 | PicoVNA 108 & picovna & lan & \\ 83 | \thickhline 84 | \end{tabularx} 85 | 86 | \subsection{picovna} 87 | 88 | This driver supports the PicoVNA 5 software from Pico Technology. The older PicoVNA 3 software does not provides a SCPI 89 | interface and is not compatible with this driver. 90 | -------------------------------------------------------------------------------- /section-waveformgroups.tex: -------------------------------------------------------------------------------- 1 | \chapter{Waveform Groups} 2 | 3 | A waveform group is a collection of one or more waveform views stacked vertically under a common timeline. All waveform 4 | views within a group are equally sized and share the same timeline and vertical cursor(s), but may have independent 5 | vertical range and offset settings. 6 | 7 | When a new oscilloscope is added to an empty ngscopeclient session, all enabled channels on the attached instrument(s) 8 | are displayed in a single waveform group (Figure \ref{single-group}). If no channels are enabled at connection time, 9 | the first channel will be enabled and displayed. 10 | 11 | \begin{figure}[h] 12 | \centering 13 | \bigimage{ng-images/overview.png} 14 | \caption{Top level ngscopeclient window with a single waveform group} 15 | \label{single-group} 16 | \end{figure} 17 | 18 | As you add protocol decodes or look at different parts of a waveform, it may be helpful to create additional waveform 19 | groups. Typical reasons for creating additional groups include: 20 | 21 | \begin{itemize} 22 | \item Zooming into one set of signals to see detail on short time scales while maintaining a high level overview of 23 | others 24 | \item Viewing signals with incompatible horizontal units. For example, a FFT has horizontal units of frequency while an 25 | analog waveform has horizontal units of time. Eye patterns also have horizontal units of time, but are always displayed 26 | as two UIs wide and cannot be zoomed. 27 | \end{itemize} 28 | 29 | \section{Managing Groups} 30 | 31 | New waveform groups are automatically created when adding a channel which is not compatible with any existing group. 32 | For example, if your session has a single group containing time-domain waveforms, adding a FFT filter block will result 33 | in a new waveform group being created to contain the FFT. Additional frequency-domain waveforms will then be added to 34 | this group by default. 35 | 36 | A new group may also be created at any time by clicking on a channel name and dragging it to the top, bottom, left, or 37 | right edge of an existing group. An overlay (Fig. \ref{split-overlays}) will be displayed showing the resulting split. 38 | For example, dropping the channel on the right side of the window produces the layout shown in Fig. \ref{split-right}. 39 | 40 | \begin{figure}[h] 41 | \centering 42 | \bigimage{ng-images/split-overlays.png} 43 | \caption{Overlays showing drag-and-drop locations for splitting waveform groups} 44 | \label{split-overlays} 45 | \end{figure} 46 | 47 | \begin{figure}[h] 48 | \centering 49 | \bigimage{ng-images/split-right.png} 50 | \caption{Result of dropping a waveform to the right side split area} 51 | \label{split-right} 52 | \end{figure} 53 | 54 | Waveform groups may be resized arbitrarily by dragging the separator between them. The title bar of a group may also be 55 | dragged, allowing the entire group to be undocked as a floating window. Floating windows can be re-docked by dragging 56 | the title bar back into the main ngscopeclient window (or another floating window), creating new tabs or splitting 57 | existing groups as desired (Fig. \ref{complex-ui}). 58 | 59 | \begin{figure}[h] 60 | \centering 61 | \bigimage{ng-images/complex-ui.png} 62 | \caption{Example of complex window layout with multiple tabs, splitters between docked waveform groups, and a group in 63 | a floating window} 64 | \label{complex-ui} 65 | \end{figure} 66 | -------------------------------------------------------------------------------- /section-waveformviews.tex: -------------------------------------------------------------------------------- 1 | \chapter{Waveform Views} 2 | 3 | A waveform view is a 2D graph of signal and/or protocol decode data within a waveform group. 4 | 5 | Arbitrarily many channels of data may be displayed within a single view, however all analog channels within a single 6 | view share the same Y axis unit, gain, and offset. Digital channels and protocol decodes can be overlaid on analog 7 | waveforms or displayed in their own dedicated views. 8 | 9 | 2D density plots, such as eye patterns, spectrograms, and waterfall plots, cannot share a waveform view 10 | with any other channel. 11 | 12 | \section{Navigation} 13 | 14 | Scrolling with the mouse wheel adjusts the horizontal scale of the current waveform group, zooming in or out centered 15 | on the position of the mouse cursor. 16 | 17 | %Pressing SHIFT while scrolling moves the view left and right without adjusting zoom. If your mouse has a horizontal 18 | %scroll feature, this may also be used to pan without zooming. 19 | 20 | %Pressing the middle mouse button auto-scales the active waveform group so that the entire waveform is visible. 21 | 22 | \section{Plot Area} 23 | 24 | The plot area shows the waveform being displayed. The horizontal grid lines line up with the voltage scale markings on 25 | the Y axis. If the plot area includes Y=0, the grid line for zero is slightly brighter. 26 | 27 | The waveform is drawn as a semi-transparent line so that when zoomed out, the density of voltage at various points in 28 | the graph may be seen as lighter or darker areas. This is referred to as ``intensity grading". 29 | 30 | \begin{figure}[H] 31 | \centering 32 | \bigimage{ng-images/graded-waveform.png} 33 | \caption{Intensity-graded waveform} 34 | \label{graded-waveform2} 35 | \end{figure} 36 | 37 | \section{Y Axis Scale} 38 | 39 | Each waveform view has its own Y axis scale, which is locked to the ADC range of the instrument. 40 | 41 | Channel gain may be configured by scrolling with the mouse wheel, and offset may be adjusted by dragging the scale with 42 | the left mouse button. Pressing the middle mouse button on the Y axis will auto-scale the vertical gain and offset to 43 | show the full span of all channels in the view with 5\% of vertical margin. 44 | 45 | If a left-pointing arrow (as seen in Fig. \ref{y-axis}) is visible, one of the channels in the view is selected as a 46 | trigger source. Click on the arrow and drag up or down to select the trigger level. Some trigger types, such as window 47 | triggers, have two arrows for upper and lower levels. 48 | 49 | \begin{figure}[H] 50 | \centering 51 | \includegraphics[height=3cm]{ng-images/y-axis.png} 52 | \caption{Waveform view showing trigger arrow on Y axis} 53 | \label{y-axis} 54 | \end{figure} 55 | 56 | \section{Channel Label} 57 | 58 | The top left corner of each waveform view contains a legend with a label for each channel being displayed in the view. 59 | 60 | Mousing over the channel name displays a tooltip (Fig. \ref{channel-tooltip}) with some helpful information about the 61 | waveform. The exact information displayed in the tooltip depends on the type of data being displayed, for example 62 | analog waveforms display sample rate and record length while eye patterns display the number of integrated UIs. 63 | 64 | \begin{figure}[H] 65 | \centering 66 | \includegraphics[height=3cm]{ng-images/channel-tooltip.png} 67 | \caption{Example tooltip on channel label} 68 | \label{channel-tooltip} 69 | \end{figure} 70 | 71 | The label may be dragged with the left mouse button to move the waveform to a different location. Dragging to the left 72 | or right edge of a waveform view, or the top or bottom edge of the topmost or bottommost waveform in a group, will 73 | split the group. Dragging to the left half of another waveform view, whether in the same group or a different group, 74 | moves the channel to that view. Dragging to the right half of the view adds a new view within the same group containing 75 | only the dragged waveform. 76 | 77 | Double-clicking the label opens the channel properties dialog (Fig. \ref{channel-properties}). As with all dialogs in 78 | ngscopeclient, the properties dialog may be left in the default floating state or docked. 79 | 80 | \begin{figure}[H] 81 | \centering 82 | \includegraphics[height=5cm]{ng-images/channel-properties1.png} 83 | \includegraphics[height=5cm]{ng-images/channel-properties2.png} 84 | \includegraphics[height=5cm]{ng-images/channel-properties3.png} 85 | \caption{Example of properties dialogs for three different channels} 86 | \label{channel-properties} 87 | \end{figure} 88 | 89 | The properties dialog will always contain an editable nickname for the channel, a color chooser, and some basic 90 | information about the instrument channel or filter block sourcing the data. Additional settings may be available but 91 | will vary depending on the type of instrument or filter. In Fig. \ref{channel-properties}, the left dialog shows a 92 | direct coaxial input to a Pico PicoScope 6824E, which has variable ADC resolution. The center dialog shows an active 93 | differential probe with auto-zero capability, connected to a Teledyne LeCroy SDA816Zi-A which has a mux for selecting 94 | between two input connectors for each channel. The right dialog shows a FIR filter with several configurable settings. 95 | 96 | Right clicking on the label opens a context menu. The context menu allows setting of persistence mode, deleting the 97 | waveform, and creating new filter blocks or protocol decodes with the selected waveform as an input. 98 | 99 | \section{Cursors and Markers} 100 | \label{sec:cursors} 101 | 102 | Cursors are movable annotations which can be used to temporarily mark points of interest in a waveform and examine data 103 | values. Markers are similar to cursors but intended for long-term marking of specific points in a single acquisition 104 | and do not provide readout functionality. 105 | 106 | \subsection{Vertical Cursors} 107 | 108 | A vertical cursor describes a point in time \emph{relative to the start of the acquisition}. When new waveforms are 109 | acquired, the cursor remains at the same offset in the new waveform. When the view is panned horizontally, the cursor 110 | scrolls with the waveform and remains at the same point in the waveform. 111 | 112 | To add a vertical cursor (Fig. \ref{vertical-cursor}), right click in the view and select a single or double cursor 113 | from the \menustyle{Cursors | X Axis} menu. 114 | 115 | Vertical cursors are attached to a waveform group and will span all views within the group. Multiple groups may have 116 | independent vertical cursors active simultaneously. 117 | 118 | \begin{figure}[H] 119 | \centering 120 | \bigimage{ng-images/vertical-cursor.png} 121 | \caption{Single vertical cursor} 122 | \label{vertical-cursor} 123 | \end{figure} 124 | 125 | \begin{figure}[H] 126 | \centering 127 | \bigimage{ng-images/vertical-cursor-x2.png} 128 | \caption{Double vertical cursor} 129 | \label{vertical-cursor-x2} 130 | \end{figure} 131 | 132 | To place a single cursor, click on the waveform at the desired location. To place double cursors, click at the starting 133 | location to place the first cursor then drag to the ending location and release the mouse to place the second cursor. 134 | Once placed, either cursor can be moved by clicking on it and dragging to the new location. 135 | 136 | %Cursors will snap to transitions in digital signals or protocol decode overlays if the mouse is within a few pixels of 137 | %the location. No snapping is applied when the mouse is over an analog waveform. 138 | 139 | In the timeline each cursor will display its X-axis position. If both cursors are active, the delta between them 140 | is shown. If the X axis uses time units, the frequency with period equal to the cursor spacing is also shown. 141 | 142 | When a cursor is active, a dockable pop-up dialog appears displaying the value of each waveform in the group at the 143 | cursor location. If two cursors are active, both values as well as the difference between them is shown (Fig. 144 | \ref{vertical-cursor-x2}) 145 | 146 | %In FFT / spectrum analyzer plots, the integrated in-band power between both cursors is also shown. 147 | 148 | \begin{comment} 149 | 150 | If a protocol analyzer view (Chap. \ref{chapter:protoanalyzer}) is active, moving a single cursor over a packet will 151 | scroll to and highlight that packet. 152 | 153 | \end{comment} 154 | 155 | \subsection{Markers} 156 | \label{sec:markers} 157 | 158 | A marker is a named location in \emph{absolute} time intended for marking specific events (such as protocol packets or 159 | glitches) which may need to be re-examined in the future. When new waveforms are acquired, the marker remains attached 160 | to the same point in the old waveform and will disappear from view until the old waveform is re-loaded from the history 161 | window. In Fig. \ref{markers}, two of the three markers are visible while the third is in a different waveform. 162 | 163 | Unlike vertical cursors, which are local to a single waveform group, cursors are global and will appear at the same 164 | timestamp in all waveform groups. This allows an event of interest to be examined in detail in one view, while a 165 | different view provides a global overview of the entire acquisition or examines another event (Fig. 166 | \ref{marker-multiview}). 167 | 168 | Creating a marker automatically pins the active waveform so it will not be removed from history as new data is 169 | acquired. The waveform cannot be un-pinned unless all markers are deleted first, or the waveform itself is manually 170 | deleted. 171 | 172 | Newly created markers will have default numeric names such as M1, M2, etc. This name can be changed from the history 173 | window. 174 | 175 | \begin{figure}[H] 176 | \centering 177 | \bigimage{ng-images/markers.png} 178 | \caption{Session with three markers, two on the currently displayed waveform and one on a future waveform} 179 | \label{markers} 180 | \end{figure} 181 | 182 | \begin{figure}[H] 183 | \centering 184 | \bigimage{ng-images/marker-multiview.png} 185 | \caption{A single marker seen at multiple time scales in different views} 186 | \label{marker-multiview} 187 | \end{figure} 188 | 189 | 190 | \begin{comment} 191 | 192 | \subsection{Horizontal Cursors} 193 | 194 | To add a horizontal cursor (Fig. \ref{horizontal-cursor}), right click on the waveform and select \menustyle{Cursor | 195 | Horizontal (single)} or \menustyle{Cursor | Horizontal (dual)} as appropriate. 196 | 197 | \begin{figure}[H] 198 | \centering 199 | \includegraphics[width=8cm]{images/horizontal-cursor.png} 200 | \caption{Horizontal cursor} 201 | \label{horizontal-cursor} 202 | \end{figure} 203 | 204 | To place a single cursor, click on the waveform at the desired location. To place double cursors, click at the starting 205 | location to place the first cursor then drag to the ending location and release the mouse to place the second cursor. 206 | Once placed, either cursor can be moved by clicking on it and dragging to the new location. 207 | 208 | At the right side of the plot, each cursor will display its Y-axis location. If both cursors are active, the delta 209 | between them is also shown. 210 | 211 | All waveform areas in a group share the same Y axis cursor positions. 212 | \end{comment} 213 | -------------------------------------------------------------------------------- /section-workspaces.tex: -------------------------------------------------------------------------------- 1 | \chapter{Workspaces and Window Management} 2 | 3 | All dialog boxes, waveform groups, and other GUI elements in ngscopeclient may be used docked or free-floating as 4 | needed. 5 | 6 | To dock a window, drag the title bar (if floating) or tab title (if docked) to the desired location (Fig. 7 | \ref{w-docking}). 8 | 9 | \begin{figure}[h] 10 | \centering 11 | \bigimage{ng-images/docking.png} 12 | \caption{Docking a floating window} 13 | \label{w-docking} 14 | \end{figure} 15 | 16 | To create more complex windowing layouts, you may find it helpful to create \emph{workspaces}. 17 | 18 | A workspace is a window which has no function of its own, and simply serves as a container for docking other windows 19 | into. The workspace can itself be docked into another workspace or the main application window, allowing creation of 20 | complex multi-window or multi-tab layouts to suit your experimental needs (Fig. \ref{w-workspace}, \ref{w-workspace2}, 21 | \ref{w-workspace3}). 22 | 23 | In the default ngscopeclient window layout, for example, the "Filter Graph" tab is a workspace which contains both the 24 | filter graph editor and the filter palette. 25 | 26 | To rename a workspace, right click on the window title (if floating) or tab title (if docked) and enter the desired 27 | name. 28 | 29 | \begin{figure}[h] 30 | \centering 31 | \bigimage{ng-images/workspace.png} 32 | \caption{A docked workspace containing a waveform group and two protocol analyzer tabs} 33 | \label{w-workspace} 34 | \end{figure} 35 | 36 | \begin{figure}[h] 37 | \centering 38 | \bigimage{ng-images/workspace2.png} 39 | \caption{Switching from the waveform workspace to the filter graph editor workspace} 40 | \label{w-workspace2} 41 | \end{figure} 42 | 43 | \begin{figure}[h] 44 | \centering 45 | \bigimage{ng-images/workspace3.png} 46 | \caption{Free-floating workspace not docked to the main application window} 47 | \label{w-workspace3} 48 | \end{figure} 49 | --------------------------------------------------------------------------------