From 153d1f9ebd55e9825b7ae96c1dfeb4467c6c2021 Mon Sep 17 00:00:00 2001 From: DreamSourceLab Date: Fri, 17 Apr 2015 00:21:14 +0800 Subject: [PATCH] rename project for upgrade --- DSView/CMakeLists.txt | 72 +- DSView/DSView.qrc | 1 + DSView/INSTALL | 6 +- DSView/README | 6 +- DSView/cmake_clear | 6 + DSView/config.h.in | 6 +- DSView/extdef.h | 10 +- DSView/icons/load.gif | Bin 0 -> 6494 bytes DSView/icons/wait.gif | Bin 0 -> 10766 bytes DSView/main.cpp | 8 +- DSView/pv/data/analog.cpp | 14 +- DSView/pv/data/analog.h | 15 +- DSView/pv/data/analogsnapshot.cpp | 4 +- DSView/pv/data/analogsnapshot.h | 10 +- DSView/pv/data/decode/annotation.h | 6 +- DSView/pv/data/decode/decoder.cpp | 15 +- DSView/pv/data/decode/decoder.h | 11 +- DSView/pv/data/decode/row.h | 6 +- DSView/pv/data/decode/rowdata.h | 6 +- DSView/pv/data/decoderstack.h | 6 +- DSView/pv/data/dso.cpp | 8 +- DSView/pv/data/dso.h | 12 +- DSView/pv/data/dsosnapshot.cpp | 42 +- DSView/pv/data/dsosnapshot.h | 17 +- DSView/pv/data/group.cpp | 4 +- DSView/pv/data/group.h | 10 +- DSView/pv/data/groupsnapshot.cpp | 4 +- DSView/pv/data/groupsnapshot.h | 10 +- DSView/pv/data/logic.cpp | 8 +- DSView/pv/data/logic.h | 14 +- DSView/pv/data/logicsnapshot.cpp | 4 +- DSView/pv/data/logicsnapshot.h | 10 +- DSView/pv/data/signaldata.cpp | 21 +- DSView/pv/data/signaldata.h | 17 +- DSView/pv/data/snapshot.cpp | 24 +- DSView/pv/data/snapshot.h | 13 +- DSView/pv/device/device.cpp | 6 +- DSView/pv/device/device.h | 10 +- DSView/pv/device/devinst.cpp | 6 +- DSView/pv/device/devinst.h | 10 +- DSView/pv/device/file.cpp | 6 +- DSView/pv/device/file.h | 10 +- DSView/pv/device/inputfile.cpp | 6 +- DSView/pv/device/inputfile.h | 10 +- DSView/pv/device/sessionfile.cpp | 6 +- DSView/pv/device/sessionfile.h | 10 +- DSView/pv/devicemanager.cpp | 10 +- DSView/pv/devicemanager.h | 10 +- DSView/pv/dialogs/about.cpp | 14 +- DSView/pv/dialogs/about.h | 13 +- DSView/pv/dialogs/about.ui | 11 +- DSView/pv/dialogs/deviceoptions.cpp | 65 +- DSView/pv/dialogs/deviceoptions.h | 23 +- DSView/pv/dialogs/search.cpp | 4 +- DSView/pv/dialogs/search.h | 12 +- DSView/pv/dialogs/storeprogress.h | 4 +- DSView/pv/dialogs/streamoptions.cpp | 107 + DSView/pv/dialogs/streamoptions.h | 76 + DSView/pv/dialogs/waitingdialog.cpp | 132 + DSView/pv/dialogs/waitingdialog.h | 77 + DSView/pv/dock/dsotriggerdock.cpp | 34 +- DSView/pv/dock/dsotriggerdock.h | 14 +- DSView/pv/dock/measuredock.cpp | 8 +- DSView/pv/dock/measuredock.h | 12 +- DSView/pv/dock/protocoldock.cpp | 4 +- DSView/pv/dock/protocoldock.h | 12 +- DSView/pv/dock/searchdock.cpp | 4 +- DSView/pv/dock/searchdock.h | 12 +- DSView/pv/dock/triggerdock.cpp | 53 +- DSView/pv/dock/triggerdock.h | 14 +- DSView/pv/mainwindow.cpp | 151 +- DSView/pv/mainwindow.h | 16 +- DSView/pv/prop/binding/binding.cpp | 4 +- DSView/pv/prop/binding/binding.h | 10 +- .../pv/prop/binding/binding_deviceoptions.cpp | 22 +- DSView/pv/prop/binding/decoderoptions.h | 6 +- DSView/pv/prop/binding/deviceoptions.h | 16 +- DSView/pv/prop/bool.cpp | 4 +- DSView/pv/prop/bool.h | 10 +- DSView/pv/prop/double.cpp | 4 +- DSView/pv/prop/double.h | 10 +- DSView/pv/prop/enum.cpp | 4 +- DSView/pv/prop/enum.h | 10 +- DSView/pv/prop/int.cpp | 4 +- DSView/pv/prop/int.h | 10 +- DSView/pv/prop/property.cpp | 4 +- DSView/pv/prop/property.h | 10 +- DSView/pv/prop/string.h | 6 +- DSView/pv/sigsession.cpp | 188 +- DSView/pv/sigsession.h | 36 +- DSView/pv/storesession.cpp | 4 +- DSView/pv/storesession.h | 6 +- DSView/pv/toolbars/filebar.cpp | 10 +- DSView/pv/toolbars/filebar.h | 10 +- DSView/pv/toolbars/logobar.cpp | 6 +- DSView/pv/toolbars/logobar.h | 12 +- DSView/pv/toolbars/samplingbar.cpp | 319 ++- DSView/pv/toolbars/samplingbar.h | 23 +- DSView/pv/toolbars/trigbar.cpp | 11 +- DSView/pv/toolbars/trigbar.h | 12 +- DSView/pv/view/analogsignal.cpp | 4 +- DSView/pv/view/analogsignal.h | 10 +- DSView/pv/view/cursor.cpp | 4 +- DSView/pv/view/cursor.h | 10 +- DSView/pv/view/decodetrace.cpp | 1 - DSView/pv/view/decodetrace.h | 6 +- DSView/pv/view/devmode.cpp | 37 +- DSView/pv/view/devmode.h | 12 +- DSView/pv/view/dsldial.h | 6 +- DSView/pv/view/dsosignal.cpp | 413 ++- DSView/pv/view/dsosignal.h | 43 +- DSView/pv/view/groupsignal.cpp | 8 +- DSView/pv/view/groupsignal.h | 10 +- DSView/pv/view/header.cpp | 55 +- DSView/pv/view/header.h | 11 +- DSView/pv/view/logicsignal.cpp | 4 +- DSView/pv/view/logicsignal.h | 10 +- DSView/pv/view/ruler.cpp | 20 +- DSView/pv/view/ruler.h | 10 +- DSView/pv/view/selectableitem.cpp | 4 +- DSView/pv/view/selectableitem.h | 10 +- DSView/pv/view/signal.cpp | 4 +- DSView/pv/view/signal.h | 12 +- DSView/pv/view/timemarker.cpp | 4 +- DSView/pv/view/timemarker.h | 10 +- DSView/pv/view/trace.cpp | 6 +- DSView/pv/view/trace.h | 10 +- DSView/pv/view/view.cpp | 87 +- DSView/pv/view/view.h | 26 +- DSView/pv/view/viewport.cpp | 49 +- DSView/pv/view/viewport.h | 10 +- DSView/pv/widgets/decodergroupbox.h | 6 +- DSView/pv/widgets/decodermenu.cpp | 4 +- DSView/pv/widgets/decodermenu.h | 10 +- DSView/pv/widgets/fakelineedit.cpp | 4 +- DSView/pv/widgets/fakelineedit.h | 10 +- DSView/res/DSCope.bin | Bin 0 -> 340884 bytes DSView/res/DSCope.fw | Bin 0 -> 8120 bytes DSView/res/DSLogic.fw | Bin 8120 -> 8120 bytes DSView/res/DSLogic33.bin | Bin 340604 -> 340884 bytes DSView/res/DSLogic50.bin | Bin 340604 -> 340884 bytes DSView/res/DSLogicPro.bin | Bin 0 -> 340884 bytes DSView/res/DSLogicPro.fw | Bin 0 -> 8120 bytes DSView/test/CMakeLists.txt | 250 +- INSTALL | 14 +- NEWS | 10 + README | 10 +- libsigrok4DSL/Makefile.am | 22 +- libsigrok4DSL/README | 12 +- libsigrok4DSL/configure.ac | 26 +- libsigrok4DSL/dsdevice.c | 1 + libsigrok4DSL/hardware/DSL/Makefile.am | 9 +- libsigrok4DSL/hardware/DSL/command.c | 113 +- libsigrok4DSL/hardware/DSL/command.h | 56 +- libsigrok4DSL/hardware/DSL/dscope.c | 2391 +++++++++++++++++ libsigrok4DSL/hardware/DSL/dsl.h | 76 +- libsigrok4DSL/hardware/DSL/dslogic.c | 1115 +++++--- libsigrok4DSL/hardware/Makefile.am | 14 +- libsigrok4DSL/hardware/common/Makefile.am | 6 +- libsigrok4DSL/hardware/common/ezusb.c | 6 +- libsigrok4DSL/hardware/common/usb.c | 2 +- libsigrok4DSL/hardware/demo/Makefile.am | 6 +- libsigrok4DSL/hardware/demo/demo.c | 109 +- libsigrok4DSL/hwdriver.c | 13 +- libsigrok4DSL/input/Makefile.am | 6 +- libsigrok4DSL/libsigrok-internal.h | 2 +- libsigrok4DSL/libsigrok.h | 94 +- libsigrok4DSL/libsigrok4DSL.pc.in | 6 +- libsigrok4DSL/output/Makefile.am | 10 +- libsigrok4DSL/output/text/Makefile.am | 6 +- libsigrok4DSL/proto.h | 3 +- libsigrok4DSL/session.c | 7 +- libsigrok4DSL/tests/Makefile.am | 2 +- libsigrok4DSL/trigger.c | 10 + 174 files changed, 5986 insertions(+), 1530 deletions(-) create mode 100755 DSView/cmake_clear create mode 100644 DSView/icons/load.gif create mode 100644 DSView/icons/wait.gif create mode 100644 DSView/pv/dialogs/streamoptions.cpp create mode 100644 DSView/pv/dialogs/streamoptions.h create mode 100644 DSView/pv/dialogs/waitingdialog.cpp create mode 100644 DSView/pv/dialogs/waitingdialog.h create mode 100644 DSView/res/DSCope.bin create mode 100644 DSView/res/DSCope.fw create mode 100644 DSView/res/DSLogicPro.bin create mode 100644 DSView/res/DSLogicPro.fw create mode 100644 libsigrok4DSL/hardware/DSL/dscope.c diff --git a/DSView/CMakeLists.txt b/DSView/CMakeLists.txt index 32a56b48..2b48a7b6 100644 --- a/DSView/CMakeLists.txt +++ b/DSView/CMakeLists.txt @@ -1,5 +1,5 @@ ## -## This file is part of the PulseView project. +## This file is part of the DSView project. ## ## Copyright (C) 2012 Joel Holdsworth ## Copyright (C) 2012-2013 Alexandru Gagniuc @@ -26,7 +26,7 @@ include(GNUInstallDirs) set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/CMake") -project(DSLogic) +project(DSView) #=============================================================================== #= User Options @@ -60,7 +60,7 @@ endif() #------------------------------------------------------------------------------- list(APPEND PKGDEPS - "libsigrok4DSLogic >= 0.2.0" + "libsigrok4DSL >= 0.2.0" "libusb-1.0 >= 1.0.16" ) if(ENABLE_DECODE) @@ -98,12 +98,12 @@ find_package(libusb-1.0 REQUIRED) #= Config Header #------------------------------------------------------------------------------- -set(DS_TITLE DSLogic) -set(DS_DESCRIPTION "A GUI for DSLogic") +set(DS_TITLE DSView) +set(DS_DESCRIPTION "A GUI for instruments of DreamSourceLab") set(DS_VERSION_MAJOR 0) -set(DS_VERSION_MINOR 4) -set(DS_VERSION_MICRO 0) +set(DS_VERSION_MINOR 9) +set(DS_VERSION_MICRO 2) set(DS_VERSION_STRING ${DS_VERSION_MAJOR}.${DS_VERSION_MINOR}.${DS_VERSION_MICRO} ) @@ -117,7 +117,7 @@ configure_file ( #= Sources #------------------------------------------------------------------------------- -set(DSLogic_SOURCES +set(DSView_SOURCES main.cpp pv/devicemanager.cpp pv/mainwindow.cpp @@ -142,6 +142,8 @@ set(DSLogic_SOURCES pv/dialogs/deviceoptions.cpp pv/dialogs/search.cpp pv/dialogs/storeprogress.cpp + pv/dialogs/streamoptions.cpp + pv/dialogs/waitingdialog.cpp pv/dock/dsotriggerdock.cpp pv/dock/measuredock.cpp pv/dock/searchdock.cpp @@ -153,7 +155,7 @@ set(DSLogic_SOURCES pv/prop/property.cpp pv/prop/string.cpp pv/prop/binding/binding.cpp - pv/prop/binding/deviceoptions.cpp + pv/prop/binding/binding_deviceoptions.cpp pv/toolbars/filebar.cpp pv/toolbars/logobar.cpp pv/toolbars/samplingbar.cpp @@ -176,7 +178,7 @@ set(DSLogic_SOURCES pv/widgets/fakelineedit.cpp ) -set(DSLogic_HEADERS +set(DSView_HEADERS pv/mainwindow.h pv/sigsession.h pv/storesession.h @@ -185,6 +187,8 @@ set(DSLogic_HEADERS pv/dialogs/deviceoptions.h pv/dialogs/search.h pv/dialogs/storeprogress.h + pv/dialogs/streamoptions.h + pv/dialogs/waitingdialog.h pv/dock/dsotriggerdock.h pv/dock/measuredock.h pv/dock/searchdock.h @@ -211,17 +215,17 @@ set(DSLogic_HEADERS pv/widgets/fakelineedit.h ) -set(DSLogic_FORMS +set(DSView_FORMS pv/dialogs/about.ui ) -set(DSLogic_RESOURCES - DSLogic.qrc +set(DSView_RESOURCES + DSView.qrc ) if(ENABLE_DECODE) - list(APPEND DSLogic_SOURCES + list(APPEND DSView_SOURCES pv/dock/protocoldock.cpp pv/data/decoderstack.cpp pv/data/decode/annotation.cpp @@ -234,7 +238,7 @@ if(ENABLE_DECODE) pv/widgets/decodermenu.cpp ) - list(APPEND DSLogic_HEADERS + list(APPEND DSView_HEADERS pv/dock/protocoldock.h pv/data/decoderstack.h pv/view/decodetrace.h @@ -244,20 +248,20 @@ if(ENABLE_DECODE) endif() if(WIN32) - # Use the DSLogic icon for the DSLogic.exe executable. + # Use the DSView icon for the DSView.exe executable. set(CMAKE_RC_COMPILE_OBJECT "${CMAKE_RC_COMPILER} -O coff -I${CMAKE_CURRENT_SOURCE_DIR} ") enable_language(RC) - list(APPEND DSLogic_SOURCES DSLogic.rc) + list(APPEND DSView_SOURCES DSView.rc) endif() if(Qt5Core_FOUND) - qt5_wrap_cpp(DSLogic_HEADERS_MOC ${DSLogic_HEADERS}) - qt5_wrap_ui(DSLogic_FORMS_HEADERS ${DSLogic_FORMS}) - qt5_add_resources(DSLogic_RESOURCES_RCC ${DSLogic_RESOURCES}) + qt5_wrap_cpp(DSView_HEADERS_MOC ${DSView_HEADERS}) + qt5_wrap_ui(DSView_FORMS_HEADERS ${DSView_FORMS}) + qt5_add_resources(DSView_RESOURCES_RCC ${DSView_RESOURCES}) else() - qt4_wrap_cpp(DSLogic_HEADERS_MOC ${DSLogic_HEADERS}) - qt4_wrap_ui(DSLogic_FORMS_HEADERS ${DSLogic_FORMS}) - qt4_add_resources(DSLogic_RESOURCES_RCC ${DSLogic_RESOURCES}) + qt4_wrap_cpp(DSView_HEADERS_MOC ${DSView_HEADERS}) + qt4_wrap_ui(DSView_FORMS_HEADERS ${DSView_FORMS}) + qt4_add_resources(DSView_RESOURCES_RCC ${DSView_RESOURCES}) include(${QT_USE_FILE}) endif() @@ -299,7 +303,7 @@ endif() link_directories(${Boost_LIBRARY_DIRS}) -set(DSLOGIC_LINK_LIBS +set(DSVIEW_LINK_LIBS ${Boost_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT} ${QT_LIBRARIES} @@ -308,25 +312,25 @@ set(DSLOGIC_LINK_LIBS if(STATIC_PKGDEPS_LIBS) link_directories(${PKGDEPS_STATIC_LIBRARY_DIRS}) - list(APPEND DSLOGIC_LINK_LIBS ${PKGDEPS_STATIC_LIBRARIES}) + list(APPEND DSVIEW_LINK_LIBS ${PKGDEPS_STATIC_LIBRARIES}) if(WIN32) # Workaround for a MinGW linking issue. list(APPEND PULSEVIEW_LINK_LIBS "-llzma -llcms2") endif() else() link_directories(${PKGDEPS_LIBRARY_DIRS}) - list(APPEND DSLOGIC_LINK_LIBS ${PKGDEPS_LIBRARIES}) + list(APPEND DSVIEW_LINK_LIBS ${PKGDEPS_LIBRARIES}) endif() add_executable(${PROJECT_NAME} - ${DSLogic_SOURCES} - ${DSLogic_HEADERS_MOC} - ${DSLogic_FORMS_HEADERS} - ${DSLogic_RESOURCES_RCC} + ${DSView_SOURCES} + ${DSView_HEADERS_MOC} + ${DSView_FORMS_HEADERS} + ${DSView_RESOURCES_RCC} ) -target_link_libraries(${PROJECT_NAME} ${DSLOGIC_LINK_LIBS}) +target_link_libraries(${PROJECT_NAME} ${DSVIEW_LINK_LIBS}) if(WIN32) # Pass -mwindows so that no "DOS box" will open when PulseView is started. @@ -349,6 +353,10 @@ install(TARGETS ${PROJECT_NAME} DESTINATION bin/) install(FILES res/DSLogic.fw DESTINATION bin/res/) install(FILES res/DSLogic33.bin DESTINATION bin/res/) install(FILES res/DSLogic50.bin DESTINATION bin/res/) +install(FILES res/DSLogicPro.fw DESTINATION bin/res/) +install(FILES res/DSLogicPro.bin DESTINATION bin/res/) +install(FILES res/DSCope.fw DESTINATION bin/res/) +install(FILES res/DSCope.bin DESTINATION bin/res/) #=============================================================================== #= Packaging (handled by CPack) @@ -373,5 +381,5 @@ include(CPack) if(ENABLE_TESTS) add_subdirectory(test) enable_testing() - add_test(test ${CMAKE_CURRENT_BINARY_DIR}/test/DSLogic-test) + add_test(test ${CMAKE_CURRENT_BINARY_DIR}/test/DSView-test) endif(ENABLE_TESTS) diff --git a/DSView/DSView.qrc b/DSView/DSView.qrc index 1efbf6b5..bf8d2d0c 100644 --- a/DSView/DSView.qrc +++ b/DSView/DSView.qrc @@ -35,5 +35,6 @@ icons/params_dis.png icons/gear.png icons/wiki.png + icons/wait.gif diff --git a/DSView/INSTALL b/DSView/INSTALL index 126579be..9b20e3a5 100644 --- a/DSView/INSTALL +++ b/DSView/INSTALL @@ -16,15 +16,15 @@ Requirements - libboost >= 1.42 (including the following libs): - libboost-system - libboost-thread - - libsigrok4DSLogic >= 0.2.0 + - libsigrok4DSL >= 0.2.0 Building and installing ----------------------- -Get the DSLogic-gui source code from: www.dreamsourcelab.com/download.html +Get the DSView source code from: www.dreamsourcelab.com/download.html In order to build it, run: - $ cd DSLogic-gui + $ cd DSView $ cmake . $ make diff --git a/DSView/README b/DSView/README index 7452797b..f66dd3b4 100644 --- a/DSView/README +++ b/DSView/README @@ -1,7 +1,7 @@ ------------------------------------------------------------------------------- README ------------------------------------------------------------------------------- -DSLogic-gui is GUI for DSLogic software, it's based on PulseView +DSView is a GUI for instruments of DreamSourceLab, it's based on PulseView from the sigrok project. The sigrok project aims at creating a portable, cross-platform, @@ -14,7 +14,7 @@ PulseView is a Qt-based LA/scope/MSO GUI for sigrok. Status ------ -DSLogic-gui is in a usable state and has had official tarball releases. +DSView is in a usable state and has had official tarball releases. However, it is still work in progress. Some basic functionality is available and working, but other things are still on the TODO list. @@ -23,7 +23,7 @@ is available and working, but other things are still on the TODO list. Copyright and license --------------------- -DSLogic-gui is licensed under the terms of the GNU General Public License +DSView is licensed under the terms of the GNU General Public License (GPL), version 3 or later. While some individual source code files are licensed under the GPLv2+, and diff --git a/DSView/cmake_clear b/DSView/cmake_clear new file mode 100755 index 00000000..6a573ce0 --- /dev/null +++ b/DSView/cmake_clear @@ -0,0 +1,6 @@ +echo "rm cmake cache begin..." +rm ./cmake_install.cmake +rm -r ./CMakeFiles +rm ./Makefile +rm ./CMakeCache.txt +echo "rm cmake cache end..." diff --git a/DSView/config.h.in b/DSView/config.h.in index 89868e31..b86b6634 100644 --- a/DSView/config.h.in +++ b/DSView/config.h.in @@ -17,15 +17,15 @@ * along with this program. If not, see . */ -#ifndef _DSLOGIC_CONFIG_H -#define _DSLOGIC_CONFIG_H +#ifndef _DSVIEW_CONFIG_H +#define _DSVIEW_CONFIG_H /* Application details */ #define DS_TITLE "@DS_TITLE@" #define DS_DESCRIPTION "@DS_DESCRIPTION@" #define DS_BIN_NAME "@PROJECT_NAME@" -/* DSLogic version information */ +/* DSView version information */ #define DS_VERSION_MAJOR @DS_VERSION_MAJOR@ #define DS_VERSION_MINOR @DS_VERSION_MINOR@ #define DS_VERSION_MICRO @DS_VERSION_MICRO@ diff --git a/DSView/extdef.h b/DSView/extdef.h index 467b5615..549c0629 100644 --- a/DSView/extdef.h +++ b/DSView/extdef.h @@ -1,6 +1,6 @@ /* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. + * This file is part of the DSView project. + * DSView is based on PulseView. * * Copyright (C) 2012 Joel Holdsworth * Copyright (C) 2013 DreamSourceLab @@ -21,12 +21,12 @@ */ -#ifndef DSLOGIC_EXTDEF_H -#define DSLOGIC_EXTDEF_H +#ifndef DSVIEW_EXTDEF_H +#define DSVIEW_EXTDEF_H #define countof(x) (sizeof(x)/sizeof(x[0])) #define begin_element(x) (&x[0]) #define end_element(x) (&x[countof(x)]) -#endif // DSLOGIC_EXTDEF_H +#endif // DSVIEW_EXTDEF_H diff --git a/DSView/icons/load.gif b/DSView/icons/load.gif new file mode 100644 index 0000000000000000000000000000000000000000..ffcb5622b8c2d86b3eaf3d840a881edb8434e3d4 GIT binary patch literal 6494 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 WhyDwH9&2X-jsQmUkAFS>eEc6*E2)D3 literal 0 HcmV?d00001 diff --git a/DSView/icons/wait.gif b/DSView/icons/wait.gif new file mode 100644 index 0000000000000000000000000000000000000000..4d6150180aa2444951de4bf3cedd6053c72cca95 GIT binary patch literal 10766 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 dLvv(u=kv|BqP!bcYMZR^G&D6EFLf%L{{ * Copyright (C) 2013 DreamSourceLab @@ -26,7 +26,7 @@ #endif #include -#include +#include #include @@ -65,7 +65,7 @@ int main(int argc, char *argv[]) // Set some application metadata QApplication::setApplicationVersion(DS_VERSION_STRING); - QApplication::setApplicationName("DSLogic(Beta)"); + QApplication::setApplicationName("DSView(Beta)"); QApplication::setOrganizationDomain("http://www.DreamSourceLab.com"); // Parse arguments diff --git a/DSView/pv/data/analog.cpp b/DSView/pv/data/analog.cpp index 0d55909d..ad0c052f 100644 --- a/DSView/pv/data/analog.cpp +++ b/DSView/pv/data/analog.cpp @@ -1,6 +1,6 @@ /* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. + * This file is part of the DSView project. + * DSView is based on PulseView. * * Copyright (C) 2012 Joel Holdsworth * Copyright (C) 2013 DreamSourceLab @@ -30,17 +30,11 @@ using namespace std; namespace pv { namespace data { -Analog::Analog(unsigned int num_probes) : - SignalData(), - _num_probes(num_probes) +Analog::Analog() : + SignalData() { } -int Analog::get_num_probes() const -{ - return _num_probes; -} - void Analog::push_snapshot(boost::shared_ptr &snapshot) { _snapshots.push_front(snapshot); diff --git a/DSView/pv/data/analog.h b/DSView/pv/data/analog.h index 1009d011..b53aff6e 100644 --- a/DSView/pv/data/analog.h +++ b/DSView/pv/data/analog.h @@ -1,6 +1,6 @@ /* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. + * This file is part of the DSView project. + * DSView is based on PulseView. * * Copyright (C) 2012 Joel Holdsworth * Copyright (C) 2013 DreamSourceLab @@ -21,8 +21,8 @@ */ -#ifndef DSLOGIC_PV_DATA_ANALOG_H -#define DSLOGIC_PV_DATA_ANALOG_H +#ifndef DSVIEW_PV_DATA_ANALOG_H +#define DSVIEW_PV_DATA_ANALOG_H #include "signaldata.h" @@ -37,9 +37,7 @@ class AnalogSnapshot; class Analog : public SignalData { public: - Analog(unsigned int num_probes); - - int get_num_probes() const; + Analog(); void push_snapshot( boost::shared_ptr &snapshot); @@ -50,11 +48,10 @@ public: void clear(); private: - const unsigned int _num_probes; std::deque< boost::shared_ptr > _snapshots; }; } // namespace data } // namespace pv -#endif // DSLOGIC_PV_DATA_ANALOG_H +#endif // DSVIEW_PV_DATA_ANALOG_H diff --git a/DSView/pv/data/analogsnapshot.cpp b/DSView/pv/data/analogsnapshot.cpp index d5260157..981dc0f9 100644 --- a/DSView/pv/data/analogsnapshot.cpp +++ b/DSView/pv/data/analogsnapshot.cpp @@ -1,6 +1,6 @@ /* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. + * This file is part of the DSView project. + * DSView is based on PulseView. * * Copyright (C) 2012 Joel Holdsworth * Copyright (C) 2013 DreamSourceLab diff --git a/DSView/pv/data/analogsnapshot.h b/DSView/pv/data/analogsnapshot.h index c004f88a..3282f257 100644 --- a/DSView/pv/data/analogsnapshot.h +++ b/DSView/pv/data/analogsnapshot.h @@ -1,6 +1,6 @@ /* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. + * This file is part of the DSView project. + * DSView is based on PulseView. * * Copyright (C) 2012 Joel Holdsworth * Copyright (C) 2013 DreamSourceLab @@ -21,8 +21,8 @@ */ -#ifndef DSLOGIC_PV_DATA_ANALOGSNAPSHOT_H -#define DSLOGIC_PV_DATA_ANALOGSNAPSHOT_H +#ifndef DSVIEW_PV_DATA_ANALOGSNAPSHOT_H +#define DSVIEW_PV_DATA_ANALOGSNAPSHOT_H #include "snapshot.h" @@ -95,4 +95,4 @@ private: } // namespace data } // namespace pv -#endif // DSLOGIC_PV_DATA_ANALOGSNAPSHOT_H +#endif // DSVIEW_PV_DATA_ANALOGSNAPSHOT_H diff --git a/DSView/pv/data/decode/annotation.h b/DSView/pv/data/decode/annotation.h index 2ca15d78..dcbdd5cd 100644 --- a/DSView/pv/data/decode/annotation.h +++ b/DSView/pv/data/decode/annotation.h @@ -18,8 +18,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifndef DSLOGIC_PV_VIEW_DECODE_ANNOTATION_H -#define DSLOGIC_PV_VIEW_DECODE_ANNOTATION_H +#ifndef DSVIEW_PV_VIEW_DECODE_ANNOTATION_H +#define DSVIEW_PV_VIEW_DECODE_ANNOTATION_H #include @@ -52,4 +52,4 @@ private: } // namespace data } // namespace pv -#endif // DSLOGIC_PV_VIEW_DECODE_ANNOTATION_H +#endif // DSVIEW_PV_VIEW_DECODE_ANNOTATION_H diff --git a/DSView/pv/data/decode/decoder.cpp b/DSView/pv/data/decode/decoder.cpp index 8ae072fc..da17fb48 100644 --- a/DSView/pv/data/decode/decoder.cpp +++ b/DSView/pv/data/decode/decoder.cpp @@ -18,7 +18,7 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ -#include +#include #include #include "decoder.h" @@ -37,8 +37,6 @@ namespace decode { Decoder::Decoder(const srd_decoder *const dec) : _decoder(dec), _shown(true), - _shown_back(true), - _shown_setted(false), _setted(true) { } @@ -62,16 +60,7 @@ bool Decoder::shown() const void Decoder::show(bool show) { - _shown_back = show; - _shown_setted = true; -} - -void Decoder::commit_show() -{ - if (_shown_setted) { - _shown = _shown_back; - _shown_setted = false; - } + _shown = show; } const map >& diff --git a/DSView/pv/data/decode/decoder.h b/DSView/pv/data/decode/decoder.h index f1b4b085..ae51c1d3 100644 --- a/DSView/pv/data/decode/decoder.h +++ b/DSView/pv/data/decode/decoder.h @@ -18,8 +18,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifndef DSLOGIC_PV_DATA_DECODE_DECODER_H -#define DSLOGIC_PV_DATA_DECODE_DECODER_H +#ifndef DSVIEW_PV_DATA_DECODE_DECODER_H +#define DSVIEW_PV_DATA_DECODE_DECODER_H #include #include @@ -56,7 +56,6 @@ public: bool shown() const; void show(bool show = true); - void commit_show(); const std::map >& channels() const; @@ -80,10 +79,8 @@ private: const srd_decoder *const _decoder; bool _shown; - bool _shown_back; - bool _shown_setted; - std::map > + std::map > _probes; std::map _options; @@ -98,4 +95,4 @@ private: } // namespace data } // namespace pv -#endif // DSLOGIC_PV_DATA_DECODE_DECODER_H +#endif // DSVIEW_PV_DATA_DECODE_DECODER_H diff --git a/DSView/pv/data/decode/row.h b/DSView/pv/data/decode/row.h index 6d73c419..71ee071e 100644 --- a/DSView/pv/data/decode/row.h +++ b/DSView/pv/data/decode/row.h @@ -18,8 +18,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifndef DSLOGIC_PV_DATA_DECODE_ROW_H -#define DSLOGIC_PV_DATA_DECODE_ROW_H +#ifndef DSVIEW_PV_DATA_DECODE_ROW_H +#define DSVIEW_PV_DATA_DECODE_ROW_H #include @@ -56,4 +56,4 @@ private: } // data } // pv -#endif // DSLOGIC_PV_DATA_DECODE_ROW_H +#endif // DSVIEW_PV_DATA_DECODE_ROW_H diff --git a/DSView/pv/data/decode/rowdata.h b/DSView/pv/data/decode/rowdata.h index 5fddd95f..ddcdfe24 100644 --- a/DSView/pv/data/decode/rowdata.h +++ b/DSView/pv/data/decode/rowdata.h @@ -18,8 +18,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifndef DSLOGIC_PV_DATA_DECODE_ROWDATA_H -#define DSLOGIC_PV_DATA_DECODE_ROWDATA_H +#ifndef DSVIEW_PV_DATA_DECODE_ROWDATA_H +#define DSVIEW_PV_DATA_DECODE_ROWDATA_H #include @@ -56,4 +56,4 @@ private: } // data } // pv -#endif // DSLOGIC_PV_DATA_DECODE_ROWDATA_H +#endif // DSVIEW_PV_DATA_DECODE_ROWDATA_H diff --git a/DSView/pv/data/decoderstack.h b/DSView/pv/data/decoderstack.h index 8ea1d26c..955230a8 100644 --- a/DSView/pv/data/decoderstack.h +++ b/DSView/pv/data/decoderstack.h @@ -18,8 +18,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifndef DSLOGIC_PV_DATA_DECODERSTACK_H -#define DSLOGIC_PV_DATA_DECODERSTACK_H +#ifndef DSVIEW_PV_DATA_DECODERSTACK_H +#define DSVIEW_PV_DATA_DECODERSTACK_H #include "signaldata.h" @@ -182,4 +182,4 @@ private: } // namespace data } // namespace pv -#endif // DSLOGIC_PV_DATA_DECODERSTACK_H +#endif // DSVIEW_PV_DATA_DECODERSTACK_H diff --git a/DSView/pv/data/dso.cpp b/DSView/pv/data/dso.cpp index a72f3b28..43663737 100644 --- a/DSView/pv/data/dso.cpp +++ b/DSView/pv/data/dso.cpp @@ -1,6 +1,6 @@ /* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. + * This file is part of the DSView project. + * DSView is based on PulseView. * * Copyright (C) 2013 DreamSourceLab * @@ -29,8 +29,8 @@ using namespace std; namespace pv { namespace data { -Dso::Dso(int num_probes) : - SignalData(num_probes) +Dso::Dso() : + SignalData() { } diff --git a/DSView/pv/data/dso.h b/DSView/pv/data/dso.h index 8ab51378..be987821 100644 --- a/DSView/pv/data/dso.h +++ b/DSView/pv/data/dso.h @@ -1,6 +1,6 @@ /* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. + * This file is part of the DSView project. + * DSView is based on PulseView. * * Copyright (C) 2013 DreamSourceLab * @@ -20,8 +20,8 @@ */ -#ifndef DSLOGIC_PV_DATA_DSO_H -#define DSLOGIC_PV_DATA_DSO_H +#ifndef DSVIEW_PV_DATA_DSO_H +#define DSVIEW_PV_DATA_DSO_H #include "signaldata.h" @@ -36,7 +36,7 @@ class DsoSnapshot; class Dso : public SignalData { public: - Dso(int num_probes); + Dso(); void push_snapshot( boost::shared_ptr &snapshot); @@ -53,4 +53,4 @@ private: } // namespace data } // namespace pv -#endif // DSLOGIC_PV_DATA_DSO_H +#endif // DSVIEW_PV_DATA_DSO_H diff --git a/DSView/pv/data/dsosnapshot.cpp b/DSView/pv/data/dsosnapshot.cpp index f5f46fb6..af1ae6dc 100644 --- a/DSView/pv/data/dsosnapshot.cpp +++ b/DSView/pv/data/dsosnapshot.cpp @@ -1,6 +1,6 @@ /* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. + * This file is part of the DSView project. + * DSView is based on PulseView. * * Copyright (C) 2013 DreamSourceLab * @@ -39,18 +39,21 @@ using namespace std; namespace pv { namespace data { -const int DsoSnapshot::EnvelopeScalePower = 4; +const int DsoSnapshot::EnvelopeScalePower = 8; const int DsoSnapshot::EnvelopeScaleFactor = 1 << EnvelopeScalePower; const float DsoSnapshot::LogEnvelopeScaleFactor = logf(EnvelopeScaleFactor); -const uint64_t DsoSnapshot::EnvelopeDataUnit = 64*1024; // bytes +const uint64_t DsoSnapshot::EnvelopeDataUnit = 4*1024; // bytes -DsoSnapshot::DsoSnapshot(const sr_datafeed_dso &dso, uint64_t _total_sample_len, unsigned int channel_num) : - Snapshot(sizeof(uint16_t), _total_sample_len, channel_num) +DsoSnapshot::DsoSnapshot(const sr_datafeed_dso &dso, uint64_t _total_sample_len, unsigned int channel_num, bool instant) : + Snapshot(sizeof(uint16_t), _total_sample_len, channel_num), + _envelope_en(false), + _envelope_done(false), + _instant(instant) { boost::lock_guard lock(_mutex); memset(_envelope_levels, 0, sizeof(_envelope_levels)); - init(_total_sample_len * channel_num); + init(_total_sample_len); append_payload(dso); } @@ -64,10 +67,21 @@ DsoSnapshot::~DsoSnapshot() void DsoSnapshot::append_payload(const sr_datafeed_dso &dso) { boost::lock_guard lock(_mutex); - append_data(dso.data, dso.num_samples); - // Generate the first mip-map from the data - append_payload_to_envelope_levels(); + if (_channel_num > 0) { + refill_data(dso.data, dso.num_samples, _instant); + + // Generate the first mip-map from the data + if (_envelope_en) + append_payload_to_envelope_levels(); + } +} + +void DsoSnapshot::enable_envelope(bool enable) +{ + if (!_envelope_done & enable) + append_payload_to_envelope_levels(); + _envelope_en = enable; } const uint8_t *DsoSnapshot::get_samples( @@ -87,7 +101,7 @@ const uint8_t *DsoSnapshot::get_samples( // memcpy(data, (uint16_t*)_data + start_sample, sizeof(uint16_t) * // (end_sample - start_sample)); // return data; - return (uint8_t*)_data + start_sample * _channel_num + index; + return (uint8_t*)_data + start_sample * _channel_num + index * (_channel_num != 1); } void DsoSnapshot::get_envelope_section(EnvelopeSection &s, @@ -108,7 +122,10 @@ void DsoSnapshot::get_envelope_section(EnvelopeSection &s, s.start = start << scale_power; s.scale = 1 << scale_power; - s.length = end - start; + //if (_envelope_levels[probe_index][min_level].length < get_sample_count() / EnvelopeScaleFactor) + // s.length = 0; + //else + s.length = end - start; // s.samples = new EnvelopeSample[s.length]; // memcpy(s.samples, _envelope_levels[min_level].samples + start, // s.length * sizeof(EnvelopeSample)); @@ -228,6 +245,7 @@ void DsoSnapshot::append_payload_to_envelope_levels() } } } + _envelope_done = true; } } // namespace data diff --git a/DSView/pv/data/dsosnapshot.h b/DSView/pv/data/dsosnapshot.h index 155dd722..88b678b8 100644 --- a/DSView/pv/data/dsosnapshot.h +++ b/DSView/pv/data/dsosnapshot.h @@ -1,6 +1,6 @@ /* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. + * This file is part of the DSView project. + * DSView is based on PulseView. * * Copyright (C) 2013 DreamSourceLab * @@ -20,8 +20,8 @@ */ -#ifndef DSLOGIC_PV_DATA_DSOSNAPSHOT_H -#define DSLOGIC_PV_DATA_DSOSNAPSHOT_H +#ifndef DSVIEW_PV_DATA_DSOSNAPSHOT_H +#define DSVIEW_PV_DATA_DSOSNAPSHOT_H #include "snapshot.h" @@ -68,7 +68,7 @@ private: static const uint64_t EnvelopeDataUnit; public: - DsoSnapshot(const sr_datafeed_dso &dso, uint64_t _total_sample_len, unsigned int channel_num); + DsoSnapshot(const sr_datafeed_dso &dso, uint64_t _total_sample_len, unsigned int channel_num, bool instant); virtual ~DsoSnapshot(); @@ -80,6 +80,8 @@ public: void get_envelope_section(EnvelopeSection &s, uint64_t start, uint64_t end, float min_length, int probe_index) const; + void enable_envelope(bool enable); + private: void reallocate_envelope(Envelope &l); @@ -87,6 +89,9 @@ private: private: struct Envelope _envelope_levels[2*DS_MAX_DSO_PROBES_NUM][ScaleStepCount]; + bool _envelope_en; + bool _envelope_done; + bool _instant; friend class DsoSnapshotTest::Basic; }; @@ -94,4 +99,4 @@ private: } // namespace data } // namespace pv -#endif // DSLOGIC_PV_DATA_DSOSNAPSHOT_H +#endif // DSVIEW_PV_DATA_DSOSNAPSHOT_H diff --git a/DSView/pv/data/group.cpp b/DSView/pv/data/group.cpp index 362d595f..e0aab57f 100644 --- a/DSView/pv/data/group.cpp +++ b/DSView/pv/data/group.cpp @@ -1,6 +1,6 @@ /* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. + * This file is part of the DSView project. + * DSView is based on PulseView. * * Copyright (C) 2012 Joel Holdsworth * Copyright (C) 2013 DreamSourceLab diff --git a/DSView/pv/data/group.h b/DSView/pv/data/group.h index 0ee105fe..25f9fb29 100644 --- a/DSView/pv/data/group.h +++ b/DSView/pv/data/group.h @@ -1,6 +1,6 @@ /* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. + * This file is part of the DSView project. + * DSView is based on PulseView. * * Copyright (C) 2012 Joel Holdsworth * Copyright (C) 2013 DreamSourceLab @@ -21,8 +21,8 @@ */ -#ifndef DSLOGIC_PV_DATA_GROUP_H -#define DSLOGIC_PV_DATA_GROUP_H +#ifndef DSVIEW_PV_DATA_GROUP_H +#define DSVIEW_PV_DATA_GROUP_H #include "signaldata.h" @@ -54,4 +54,4 @@ private: } // namespace data } // namespace pv -#endif // DSLOGIC_PV_DATA_GROUP_H +#endif // DSVIEW_PV_DATA_GROUP_H diff --git a/DSView/pv/data/groupsnapshot.cpp b/DSView/pv/data/groupsnapshot.cpp index 085f6971..8a1c4c8c 100644 --- a/DSView/pv/data/groupsnapshot.cpp +++ b/DSView/pv/data/groupsnapshot.cpp @@ -1,6 +1,6 @@ /* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. + * This file is part of the DSView project. + * DSView is based on PulseView. * * Copyright (C) 2012 Joel Holdsworth * Copyright (C) 2013 DreamSourceLab diff --git a/DSView/pv/data/groupsnapshot.h b/DSView/pv/data/groupsnapshot.h index 083e08e0..0b66bf00 100644 --- a/DSView/pv/data/groupsnapshot.h +++ b/DSView/pv/data/groupsnapshot.h @@ -1,6 +1,6 @@ /* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. + * This file is part of the DSView project. + * DSView is based on PulseView. * * Copyright (C) 2012 Joel Holdsworth * Copyright (C) 2013 DreamSourceLab @@ -21,8 +21,8 @@ */ -#ifndef DSLOGIC_PV_DATA_GROUPSNAPSHOT_H -#define DSLOGIC_PV_DATA_GROUPSNAPSHOT_H +#ifndef DSVIEW_PV_DATA_GROUPSNAPSHOT_H +#define DSVIEW_PV_DATA_GROUPSNAPSHOT_H #include #include @@ -110,4 +110,4 @@ private: } // namespace data } // namespace pv -#endif // DSLOGIC_PV_DATA_GROUPSNAPSHOT_H +#endif // DSVIEW_PV_DATA_GROUPSNAPSHOT_H diff --git a/DSView/pv/data/logic.cpp b/DSView/pv/data/logic.cpp index f45aac6d..4116942a 100644 --- a/DSView/pv/data/logic.cpp +++ b/DSView/pv/data/logic.cpp @@ -1,6 +1,6 @@ /* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. + * This file is part of the DSView project. + * DSView is based on PulseView. * * Copyright (C) 2012 Joel Holdsworth * Copyright (C) 2013 DreamSourceLab @@ -30,8 +30,8 @@ using namespace std; namespace pv { namespace data { -Logic::Logic(int num_probes) : - SignalData(num_probes) +Logic::Logic() : + SignalData() { } diff --git a/DSView/pv/data/logic.h b/DSView/pv/data/logic.h index b6b958b7..c7a97158 100644 --- a/DSView/pv/data/logic.h +++ b/DSView/pv/data/logic.h @@ -1,6 +1,6 @@ /* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. + * This file is part of the DSView project. + * DSView is based on PulseView. * * Copyright (C) 2012 Joel Holdsworth * Copyright (C) 2013 DreamSourceLab @@ -21,8 +21,8 @@ */ -#ifndef DSLOGIC_PV_DATA_LOGIC_H -#define DSLOGIC_PV_DATA_LOGIC_H +#ifndef DSVIEW_PV_DATA_LOGIC_H +#define DSVIEW_PV_DATA_LOGIC_H #include "signaldata.h" @@ -37,9 +37,7 @@ class LogicSnapshot; class Logic : public SignalData { public: - Logic(int num_probes); - - int get_num_probes() const; + Logic(); void push_snapshot( boost::shared_ptr &snapshot); @@ -56,4 +54,4 @@ private: } // namespace data } // namespace pv -#endif // DSLOGIC_PV_DATA_LOGIC_H +#endif // DSVIEW_PV_DATA_LOGIC_H diff --git a/DSView/pv/data/logicsnapshot.cpp b/DSView/pv/data/logicsnapshot.cpp index 621b4aaa..4b18551e 100644 --- a/DSView/pv/data/logicsnapshot.cpp +++ b/DSView/pv/data/logicsnapshot.cpp @@ -1,6 +1,6 @@ /* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. + * This file is part of the DSView project. + * DSView is based on PulseView. * * Copyright (C) 2012 Joel Holdsworth * Copyright (C) 2013 DreamSourceLab diff --git a/DSView/pv/data/logicsnapshot.h b/DSView/pv/data/logicsnapshot.h index f618c10f..3914a2ed 100644 --- a/DSView/pv/data/logicsnapshot.h +++ b/DSView/pv/data/logicsnapshot.h @@ -1,6 +1,6 @@ /* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. + * This file is part of the DSView project. + * DSView is based on PulseView. * * Copyright (C) 2012 Joel Holdsworth * Copyright (C) 2013 DreamSourceLab @@ -21,8 +21,8 @@ */ -#ifndef DSLOGIC_PV_DATA_LOGICSNAPSHOT_H -#define DSLOGIC_PV_DATA_LOGICSNAPSHOT_H +#ifndef DSVIEW_PV_DATA_LOGICSNAPSHOT_H +#define DSVIEW_PV_DATA_LOGICSNAPSHOT_H #include "snapshot.h" @@ -119,4 +119,4 @@ private: } // namespace data } // namespace pv -#endif // DSLOGIC_PV_DATA_LOGICSNAPSHOT_H +#endif // DSVIEW_PV_DATA_LOGICSNAPSHOT_H diff --git a/DSView/pv/data/signaldata.cpp b/DSView/pv/data/signaldata.cpp index 0dede45f..b97e026a 100644 --- a/DSView/pv/data/signaldata.cpp +++ b/DSView/pv/data/signaldata.cpp @@ -1,6 +1,6 @@ /* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. + * This file is part of the DSView project. + * DSView is based on PulseView. * * Copyright (C) 2012 Joel Holdsworth * Copyright (C) 2013 DreamSourceLab @@ -27,12 +27,10 @@ namespace pv { namespace data { -SignalData::SignalData(int num_probes) : +SignalData::SignalData() : _samplerate(0), - _start_time(0), - _num_probes(num_probes) + _start_time(0) { - assert(num_probes >= 0); } double SignalData::samplerate() const @@ -52,16 +50,5 @@ double SignalData::get_start_time() const return _start_time; } -int SignalData::get_num_probes() const -{ - return _num_probes; -} - -void SignalData::set_num_probes(int num) -{ - assert(num >= 0); - _num_probes = num; -} - } // namespace data } // namespace pv diff --git a/DSView/pv/data/signaldata.h b/DSView/pv/data/signaldata.h index 0d8fdd7a..86279376 100644 --- a/DSView/pv/data/signaldata.h +++ b/DSView/pv/data/signaldata.h @@ -1,6 +1,6 @@ /* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. + * This file is part of the DSView project. + * DSView is based on PulseView. * * Copyright (C) 2012 Joel Holdsworth * Copyright (C) 2013 DreamSourceLab @@ -21,8 +21,8 @@ */ -#ifndef DSLOGIC_PV_DATA_SIGNALDATA_H -#define DSLOGIC_PV_DATA_SIGNALDATA_H +#ifndef DSVIEW_PV_DATA_SIGNALDATA_H +#define DSVIEW_PV_DATA_SIGNALDATA_H #include @@ -32,7 +32,7 @@ namespace data { class SignalData { public: - SignalData(int num_probes = 1); + SignalData(); public: double samplerate() const; @@ -42,17 +42,12 @@ public: double get_start_time() const; - int get_num_probes() const; - - void set_num_probes(int num); - protected: double _samplerate; double _start_time; - int _num_probes; }; } // namespace data } // namespace pv -#endif // DSLOGIC_PV_DATA_SIGNALDATA_H +#endif // DSVIEW_PV_DATA_SIGNALDATA_H diff --git a/DSView/pv/data/snapshot.cpp b/DSView/pv/data/snapshot.cpp index 6c2480d5..57be15e7 100644 --- a/DSView/pv/data/snapshot.cpp +++ b/DSView/pv/data/snapshot.cpp @@ -1,6 +1,6 @@ /* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. + * This file is part of the DSView project. + * DSView is based on PulseView. * * Copyright (C) 2012 Joel Holdsworth * Copyright (C) 2013 DreamSourceLab @@ -36,7 +36,7 @@ Snapshot::Snapshot(int unit_size, uint64_t total_sample_count, unsigned int chan _data(NULL), _channel_num(channel_num), _sample_count(0), - _total_sample_count(total_sample_count * channel_num), + _total_sample_count(total_sample_count), _ring_sample_count(0), _unit_size(unit_size) { @@ -75,7 +75,7 @@ bool Snapshot::buf_null() const uint64_t Snapshot::get_sample_count() const { boost::lock_guard lock(_mutex); - return _sample_count / _channel_num; + return _sample_count; } void* Snapshot::get_data() const @@ -108,7 +108,7 @@ uint64_t Snapshot::get_sample(uint64_t index) const void Snapshot::append_data(void *data, uint64_t samples) { -// boost::lock_guard lock(_mutex); + boost::lock_guard lock(_mutex); // _data = realloc(_data, (_sample_count + samples) * _unit_size + // sizeof(uint64_t)); if (_sample_count + samples < _total_sample_count) @@ -129,5 +129,19 @@ void Snapshot::append_data(void *data, uint64_t samples) } } +void Snapshot::refill_data(void *data, uint64_t samples, bool instant) +{ + boost::lock_guard lock(_mutex); + + if (instant) { + memcpy((uint8_t*)_data + _sample_count * _channel_num, data, samples*_channel_num); + _sample_count = (_sample_count + samples) % (_total_sample_count + 1); + } else { + memcpy((uint8_t*)_data, data, samples*_channel_num); + _sample_count = samples; + } + +} + } // namespace data } // namespace pv diff --git a/DSView/pv/data/snapshot.h b/DSView/pv/data/snapshot.h index 784f3338..b128a83c 100644 --- a/DSView/pv/data/snapshot.h +++ b/DSView/pv/data/snapshot.h @@ -1,6 +1,6 @@ /* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. + * This file is part of the DSView project. + * DSView is based on PulseView. * * Copyright (C) 2012 Joel Holdsworth * Copyright (C) 2013 DreamSourceLab @@ -21,10 +21,10 @@ */ -#ifndef DSLOGIC_PV_DATA_SNAPSHOT_H -#define DSLOGIC_PV_DATA_SNAPSHOT_H +#ifndef DSVIEW_PV_DATA_SNAPSHOT_H +#define DSVIEW_PV_DATA_SNAPSHOT_H -#include +#include #include @@ -54,6 +54,7 @@ public: protected: void append_data(void *data, uint64_t samples); + void refill_data(void *data, uint64_t samples, bool instant); protected: mutable boost::recursive_mutex _mutex; @@ -68,4 +69,4 @@ protected: } // namespace data } // namespace pv -#endif // DSLOGIC_PV_DATA_SNAPSHOT_H +#endif // DSVIEW_PV_DATA_SNAPSHOT_H diff --git a/DSView/pv/device/device.cpp b/DSView/pv/device/device.cpp index 6b1063c3..6c0e17c3 100644 --- a/DSView/pv/device/device.cpp +++ b/DSView/pv/device/device.cpp @@ -1,6 +1,6 @@ /* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. + * This file is part of the DSView project. + * DSView is based on PulseView. * * Copyright (C) 2014 Joel Holdsworth * @@ -21,7 +21,7 @@ #include -#include +#include #include "device.h" diff --git a/DSView/pv/device/device.h b/DSView/pv/device/device.h index a5aa5f46..ad6499ab 100644 --- a/DSView/pv/device/device.h +++ b/DSView/pv/device/device.h @@ -1,6 +1,6 @@ /* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. + * This file is part of the DSView project. + * DSView is based on PulseView. * * Copyright (C) 2014 Joel Holdsworth * @@ -19,8 +19,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifndef DSLOGIC_PV_DEVICE_DEVICE_H -#define DSLOGIC_PV_DEVICE_DEVICE_H +#ifndef DSVIEW_PV_DEVICE_DEVICE_H +#define DSVIEW_PV_DEVICE_DEVICE_H #include "devinst.h" @@ -49,4 +49,4 @@ private: } // device } // pv -#endif // DSLOGIC_PV_DEVICE_DEVICE_H +#endif // DSVIEW_PV_DEVICE_DEVICE_H diff --git a/DSView/pv/device/devinst.cpp b/DSView/pv/device/devinst.cpp index c0ba0874..b02c3551 100644 --- a/DSView/pv/device/devinst.cpp +++ b/DSView/pv/device/devinst.cpp @@ -1,6 +1,6 @@ /* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. + * This file is part of the DSView project. + * DSView is based on PulseView. * * Copyright (C) 2014 Joel Holdsworth * @@ -23,7 +23,7 @@ #include -#include +#include #include "devinst.h" diff --git a/DSView/pv/device/devinst.h b/DSView/pv/device/devinst.h index aab7d570..50821939 100644 --- a/DSView/pv/device/devinst.h +++ b/DSView/pv/device/devinst.h @@ -1,6 +1,6 @@ /* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. + * This file is part of the DSView project. + * DSView is based on PulseView. * * Copyright (C) 2014 Joel Holdsworth * @@ -19,8 +19,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifndef DSLOGIC_PV_DEVICE_DEVINST_H -#define DSLOGIC_PV_DEVICE_DEVINST_H +#ifndef DSVIEW_PV_DEVICE_DEVINST_H +#define DSVIEW_PV_DEVICE_DEVINST_H #include @@ -129,4 +129,4 @@ protected: } // device } // pv -#endif // DSLOGIC_PV_DEVICE_DEVINST_H +#endif // DSVIEW_PV_DEVICE_DEVINST_H diff --git a/DSView/pv/device/file.cpp b/DSView/pv/device/file.cpp index 1e864b02..2f67c46c 100644 --- a/DSView/pv/device/file.cpp +++ b/DSView/pv/device/file.cpp @@ -1,6 +1,6 @@ /* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. + * This file is part of the DSView project. + * DSView is based on PulseView. * * Copyright (C) 2014 Joel Holdsworth * @@ -25,7 +25,7 @@ #include -#include +#include using std::string; diff --git a/DSView/pv/device/file.h b/DSView/pv/device/file.h index e4d57968..027314d2 100644 --- a/DSView/pv/device/file.h +++ b/DSView/pv/device/file.h @@ -1,6 +1,6 @@ /* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. + * This file is part of the DSView project. + * DSView is based on PulseView. * * Copyright (C) 2014 Joel Holdsworth * @@ -19,8 +19,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifndef DSLOGIC_PV_DEVICE_FILE_H -#define DSLOGIC_PV_DEVICE_FILE_H +#ifndef DSVIEW_PV_DEVICE_FILE_H +#define DSVIEW_PV_DEVICE_FILE_H #include @@ -47,4 +47,4 @@ protected: } // device } // pv -#endif // DSLOGIC_PV_DEVICE_FILE_H +#endif // DSVIEW_PV_DEVICE_FILE_H diff --git a/DSView/pv/device/inputfile.cpp b/DSView/pv/device/inputfile.cpp index 13a3d181..549c3d3a 100644 --- a/DSView/pv/device/inputfile.cpp +++ b/DSView/pv/device/inputfile.cpp @@ -1,6 +1,6 @@ /* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. + * This file is part of the DSView project. + * DSView is based on PulseView. * * Copyright (C) 2014 Joel Holdsworth * @@ -27,7 +27,7 @@ #include "inputfile.h" -#include +#include using std::string; diff --git a/DSView/pv/device/inputfile.h b/DSView/pv/device/inputfile.h index 1ad3b34f..a4d970fa 100644 --- a/DSView/pv/device/inputfile.h +++ b/DSView/pv/device/inputfile.h @@ -1,6 +1,6 @@ /* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. + * This file is part of the DSView project. + * DSView is based on PulseView. * * Copyright (C) 2014 Joel Holdsworth * @@ -19,8 +19,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifndef DSLOGIC_PV_DEVICE_INPUTFILE_H -#define DSLOGIC_PV_DEVICE_INPUTFILE_H +#ifndef DSVIEW_PV_DEVICE_INPUTFILE_H +#define DSVIEW_PV_DEVICE_INPUTFILE_H #include "file.h" @@ -66,4 +66,4 @@ private: } // device } // pv -#endif // DSLOGIC_PV_DEVICE_INPUTFILE_H +#endif // DSVIEW_PV_DEVICE_INPUTFILE_H diff --git a/DSView/pv/device/sessionfile.cpp b/DSView/pv/device/sessionfile.cpp index c996436a..0ce7daf5 100644 --- a/DSView/pv/device/sessionfile.cpp +++ b/DSView/pv/device/sessionfile.cpp @@ -1,6 +1,6 @@ /* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. + * This file is part of the DSView project. + * DSView is based on PulseView. * * Copyright (C) 2014 Joel Holdsworth * @@ -21,7 +21,7 @@ #include "sessionfile.h" -#include +#include namespace pv { namespace device { diff --git a/DSView/pv/device/sessionfile.h b/DSView/pv/device/sessionfile.h index ef1845eb..5a89a036 100644 --- a/DSView/pv/device/sessionfile.h +++ b/DSView/pv/device/sessionfile.h @@ -1,6 +1,6 @@ /* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. + * This file is part of the DSView project. + * DSView is based on PulseView. * * Copyright (C) 2014 Joel Holdsworth * @@ -19,8 +19,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifndef DSLOGIC_PV_DEVICE_SESSIONFILE_H -#define DSLOGIC_PV_DEVICE_SESSIONFILE_H +#ifndef DSVIEW_PV_DEVICE_SESSIONFILE_H +#define DSVIEW_PV_DEVICE_SESSIONFILE_H #include "file.h" @@ -45,4 +45,4 @@ private: } // device } // pv -#endif // DSLOGIC_PV_DEVICE_SESSIONFILE_H +#endif // DSVIEW_PV_DEVICE_SESSIONFILE_H diff --git a/DSView/pv/devicemanager.cpp b/DSView/pv/devicemanager.cpp index a6c1f1bc..6bee8b71 100644 --- a/DSView/pv/devicemanager.cpp +++ b/DSView/pv/devicemanager.cpp @@ -1,6 +1,6 @@ /* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. + * This file is part of the DSView project. + * DSView is based on PulseView. * * Copyright (C) 2012 Joel Holdsworth * Copyright (C) 2013 DreamSourceLab @@ -38,7 +38,7 @@ #include -#include +#include using boost::shared_ptr; using std::list; @@ -101,8 +101,8 @@ std::list > DeviceManager::driver_scan( sr_dev_clear(driver); //release_driver(driver); - // Check If DSLogic driver - if (strcmp(driver->name, "DSLogic") == 0) { + // Check If DSL hardware driver + if (strcmp(driver->name, "demo") != 0) { QDir dir(QCoreApplication::applicationDirPath()); if (!dir.cd("res")) return driver_devices; diff --git a/DSView/pv/devicemanager.h b/DSView/pv/devicemanager.h index 94bd8962..fde8ad1e 100644 --- a/DSView/pv/devicemanager.h +++ b/DSView/pv/devicemanager.h @@ -1,6 +1,6 @@ /* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. + * This file is part of the DSView project. + * DSView is based on PulseView. * * Copyright (C) 2012 Joel Holdsworth * Copyright (C) 2013 DreamSourceLab @@ -21,8 +21,8 @@ */ -#ifndef DSLOGIC_PV_DEVICEMANAGER_H -#define DSLOGIC_PV_DEVICEMANAGER_H +#ifndef DSVIEW_PV_DEVICEMANAGER_H +#define DSVIEW_PV_DEVICEMANAGER_H #include @@ -85,4 +85,4 @@ private: } // namespace pv -#endif // DSLOGIC_PV_DEVICEMANAGER_H +#endif // DSVIEW_PV_DEVICEMANAGER_H diff --git a/DSView/pv/dialogs/about.cpp b/DSView/pv/dialogs/about.cpp index a46b24bf..6809fd70 100644 --- a/DSView/pv/dialogs/about.cpp +++ b/DSView/pv/dialogs/about.cpp @@ -1,6 +1,6 @@ /* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. + * This file is part of the DSView project. + * DSView is based on PulseView. * * Copyright (C) 2012 Joel Holdsworth * Copyright (C) 2013 DreamSourceLab @@ -29,7 +29,7 @@ /* __STDC_FORMAT_MACROS is required for PRIu64 and friends (in C++). */ #define __STDC_FORMAT_MACROS #include -#include +#include namespace pv { @@ -47,6 +47,8 @@ About::About(QWidget *parent) : .arg(QApplication::applicationVersion()) .arg(QApplication::organizationDomain())); ui->versionInfo->setOpenExternalLinks(true); + + connect(ui->buttonBox, SIGNAL(accepted()), this, SLOT(accept())); } About::~About() @@ -54,5 +56,11 @@ About::~About() delete ui; } +void About::accept() +{ + using namespace Qt; + QDialog::accept(); +} + } // namespace dialogs } // namespace pv diff --git a/DSView/pv/dialogs/about.h b/DSView/pv/dialogs/about.h index 49b5fbdc..6d140472 100644 --- a/DSView/pv/dialogs/about.h +++ b/DSView/pv/dialogs/about.h @@ -1,6 +1,6 @@ /* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. + * This file is part of the DSView project. + * DSView is based on PulseView. * * Copyright (C) 2012 Joel Holdsworth * Copyright (C) 2013 DreamSourceLab @@ -21,8 +21,8 @@ */ -#ifndef DSLOGIC_PV_ABOUT_H -#define DSLOGIC_PV_ABOUT_H +#ifndef DSVIEW_PV_ABOUT_H +#define DSVIEW_PV_ABOUT_H #include @@ -43,6 +43,9 @@ public: explicit About(QWidget *parent = 0); ~About(); +protected: + void accept(); + private: Ui::About *ui; }; @@ -50,4 +53,4 @@ private: } // namespace dialogs } // namespace pv -#endif // DSLOGIC_PV_ABOUT_H +#endif // DSVIEW_PV_ABOUT_H diff --git a/DSView/pv/dialogs/about.ui b/DSView/pv/dialogs/about.ui index 5c1c7adb..d4fef85d 100644 --- a/DSView/pv/dialogs/about.ui +++ b/DSView/pv/dialogs/about.ui @@ -34,7 +34,7 @@ - :/icons/dsl_logo.png + :/icons/dsl_logo.png Qt::AlignCenter @@ -51,12 +51,19 @@ + + + + QDialogButtonBox::Ok + + + - + diff --git a/DSView/pv/dialogs/deviceoptions.cpp b/DSView/pv/dialogs/deviceoptions.cpp index a09dca2e..b2c7da57 100644 --- a/DSView/pv/dialogs/deviceoptions.cpp +++ b/DSView/pv/dialogs/deviceoptions.cpp @@ -1,6 +1,6 @@ /* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. + * This file is part of the DSView project. + * DSView is based on PulseView. * * Copyright (C) 2012 Joel Holdsworth * Copyright (C) 2013 DreamSourceLab @@ -27,6 +27,7 @@ #include #include +#include #include @@ -36,27 +37,33 @@ using namespace std; namespace pv { namespace dialogs { -DeviceOptions::DeviceOptions(QWidget *parent, struct sr_dev_inst *sdi) : +DeviceOptions::DeviceOptions(QWidget *parent, shared_ptr dev_inst) : QDialog(parent), - _sdi(sdi), + _dev_inst(dev_inst), _layout(this), - _probes_box(tr("Channels"), this), - _props_box(tr("Mode"), this), _button_box(QDialogButtonBox::Ok | QDialogButtonBox::Cancel, Qt::Horizontal, this), - _device_options_binding(sdi) + _device_options_binding(_dev_inst->dev_inst()) { setWindowTitle(tr("Configure Device")); setLayout(&_layout); - _props_box.setLayout(&_props_box_layout); + _props_box = new QGroupBox(tr("Mode"), this); + _props_box->setLayout(&_props_box_layout); _props_box_layout.addWidget(get_property_form()); - _layout.addWidget(&_props_box); + _layout.addWidget(_props_box); - setup_probes(); - _probes_box.setLayout(&_probes_box_layout); + if (_dev_inst->dev_inst()->mode != DSO) { + _probes_box = new QGroupBox(tr("Channels"), this); + setup_probes(); + _probes_box->setLayout(&_probes_box_layout); + _layout.addWidget(_probes_box); + } else { + _config_button = new QPushButton(tr("Zero Adjustment"), this); + _layout.addWidget(_config_button); + connect(_config_button, SIGNAL(clicked()), this, SLOT(zero_adj())); + } - _layout.addWidget(&_probes_box); _layout.addStretch(1); _layout.addWidget(&_button_box); @@ -79,13 +86,15 @@ void DeviceOptions::accept() } // Commit the probes - int index = 0; - for (const GSList *l = _sdi->channels; l; l = l->next) { - sr_channel *const probe = (sr_channel*)l->data; - assert(probe); + if (_dev_inst->dev_inst()->mode != DSO) { + int index = 0; + for (const GSList *l = _dev_inst->dev_inst()->channels; l; l = l->next) { + sr_channel *const probe = (sr_channel*)l->data; + assert(probe); - probe->enabled = (_probes_checkBox_list.at(index)->checkState() == Qt::Checked); - index++; + probe->enabled = (_probes_checkBox_list.at(index)->checkState() == Qt::Checked); + index++; + } } } @@ -131,7 +140,7 @@ void DeviceOptions::setup_probes() _probes_label_list.clear(); _probes_checkBox_list.clear(); - for (const GSList *l = _sdi->channels; l; l = l->next) { + for (const GSList *l = _dev_inst->dev_inst()->channels; l; l = l->next) { sr_channel *const probe = (sr_channel*)l->data; assert(probe); @@ -179,5 +188,23 @@ void DeviceOptions::disable_all_probes() set_all_probes(false); } +void DeviceOptions::zero_adj() +{ + using namespace Qt; + QDialog::reject(); + + QMessageBox msg(this); + msg.setText("Information"); + msg.setInformativeText("Zero adjustment program will be started. This may take a few minutes!"); + //msg.setStandardButtons(QMessageBox::); + msg.addButton(tr("Ok"), QMessageBox::AcceptRole); + msg.addButton(tr("Cancel"), QMessageBox::RejectRole); + msg.setIcon(QMessageBox::Information); + int ret = msg.exec(); + if ( ret == QMessageBox::AcceptRole) { + _dev_inst->set_config(NULL, NULL, SR_CONF_ZERO, g_variant_new_boolean(true)); + } +} + } // namespace dialogs } // namespace pv diff --git a/DSView/pv/dialogs/deviceoptions.h b/DSView/pv/dialogs/deviceoptions.h index 3db2e92d..14b1e5ce 100644 --- a/DSView/pv/dialogs/deviceoptions.h +++ b/DSView/pv/dialogs/deviceoptions.h @@ -1,6 +1,6 @@ /* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. + * This file is part of the DSView project. + * DSView is based on PulseView. * * Copyright (C) 2012 Joel Holdsworth * Copyright (C) 2013 DreamSourceLab @@ -21,8 +21,8 @@ */ -#ifndef DSLOGIC_PV_DEVICEOPTIONS_H -#define DSLOGIC_PV_DEVICEOPTIONS_H +#ifndef DSVIEW_PV_DEVICEOPTIONS_H +#define DSVIEW_PV_DEVICEOPTIONS_H #include #include @@ -37,6 +37,9 @@ #include #include +#include + +#include #include namespace pv { @@ -47,7 +50,7 @@ class DeviceOptions : public QDialog Q_OBJECT public: - DeviceOptions(QWidget *parent, struct sr_dev_inst *sdi); + DeviceOptions(QWidget *parent, boost::shared_ptr dev_inst); protected: void accept(); @@ -64,19 +67,21 @@ private: private slots: void enable_all_probes(); void disable_all_probes(); + void zero_adj(); private: - struct sr_dev_inst *const _sdi; + boost::shared_ptr _dev_inst; QVBoxLayout _layout; - QGroupBox _probes_box; + QGroupBox *_probes_box; QGridLayout _probes_box_layout; QVector _probes_label_list; QVector _probes_checkBox_list; - QGroupBox _props_box; + QGroupBox *_props_box; QVBoxLayout _props_box_layout; + QPushButton *_config_button; QDialogButtonBox _button_box; pv::prop::binding::DeviceOptions _device_options_binding; @@ -85,4 +90,4 @@ private: } // namespace dialogs } // namespace pv -#endif // DSLOGIC_PV_DEVICEOPTIONS_H +#endif // DSVIEW_PV_DEVICEOPTIONS_H diff --git a/DSView/pv/dialogs/search.cpp b/DSView/pv/dialogs/search.cpp index 59454913..6bdc5dc8 100644 --- a/DSView/pv/dialogs/search.cpp +++ b/DSView/pv/dialogs/search.cpp @@ -1,6 +1,6 @@ /* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. + * This file is part of the DSView project. + * DSView is based on PulseView. * * Copyright (C) 2012 Joel Holdsworth * Copyright (C) 2013 DreamSourceLab diff --git a/DSView/pv/dialogs/search.h b/DSView/pv/dialogs/search.h index 07c3312b..79c7533a 100644 --- a/DSView/pv/dialogs/search.h +++ b/DSView/pv/dialogs/search.h @@ -1,6 +1,6 @@ /* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. + * This file is part of the DSView project. + * DSView is based on PulseView. * * Copyright (C) 2012 Joel Holdsworth * Copyright (C) 2013 DreamSourceLab @@ -21,8 +21,8 @@ */ -#ifndef DSLOGIC_PV_SEARCH_H -#define DSLOGIC_PV_SEARCH_H +#ifndef DSVIEW_PV_SEARCH_H +#define DSVIEW_PV_SEARCH_H #include #include @@ -31,7 +31,7 @@ #include #include #include "../sigsession.h" -#include +#include namespace pv { namespace dialogs { @@ -63,4 +63,4 @@ private: } // namespace decoder } // namespace pv -#endif // DSLOGIC_PV_SEARCH_H +#endif // DSVIEW_PV_SEARCH_H diff --git a/DSView/pv/dialogs/storeprogress.h b/DSView/pv/dialogs/storeprogress.h index dde071cc..25c77ab0 100644 --- a/DSView/pv/dialogs/storeprogress.h +++ b/DSView/pv/dialogs/storeprogress.h @@ -18,8 +18,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifndef DSLOGIC_PV_DIALOGS_SAVEPROGRESS_H -#define DSLOGIC_PV_DIALOGS_SAVEPROGRESS_H +#ifndef DSVIEW_PV_DIALOGS_SAVEPROGRESS_H +#define DSVIEW_PV_DIALOGS_SAVEPROGRESS_H #include diff --git a/DSView/pv/dialogs/streamoptions.cpp b/DSView/pv/dialogs/streamoptions.cpp new file mode 100644 index 00000000..2c50d3f5 --- /dev/null +++ b/DSView/pv/dialogs/streamoptions.cpp @@ -0,0 +1,107 @@ +/* + * This file is part of the DSView project. + * DSView is based on PulseView. + * + * Copyright (C) 2012 Joel Holdsworth + * Copyright (C) 2013 DreamSourceLab + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + +#include "streamoptions.h" + +#include + +#include +#include +#include + +#include + +using namespace boost; +using namespace std; + +namespace pv { +namespace dialogs { + +StreamOptions::StreamOptions(QWidget *parent, shared_ptr dev_inst, + uint64_t sample_count, bool stream) : + QDialog(parent), + _dev_inst(dev_inst), + _sample_count(sample_count), + _layout(this), + _stream(stream), + _button_box(QDialogButtonBox::Ok, + Qt::Horizontal, this) +{ + setWindowTitle(tr("Stream Mode Options")); + setLayout(&_layout); + + QLabel *_info = new QLabel(this); + if (_stream) + _info->setText("Stream Mode Active!"); + else + _info->setText("Buffer Mode Active!"); + + _layout.addWidget(_info); + + if (_stream) { + _op0 = new QRadioButton(this); + _op1 = new QRadioButton(this); + _op0->setText("16 Channels, Max 10MHz sample rate"); + _op1->setText(" 8 Channels, Max 25MHz sample rate"); + _layout.addWidget(_op0); + _layout.addWidget(_op1); + + if (_sample_count >= SR_GB(1)) { + _op0->setDisabled(true); + _op1->setChecked(true); + }else{ + _op0->setChecked(true); + } + } + + _layout.addWidget(&_button_box); + + connect(&_button_box, SIGNAL(accepted()), this, SLOT(accept())); + connect(&_button_box, SIGNAL(rejected()), this, SLOT(accept())); +} + +void StreamOptions::accept() +{ + using namespace Qt; + + uint64_t sample_rate = _dev_inst->get_sample_rate(); + if (_stream) { + if (_op0->isChecked()) + sample_rate = (sample_rate <= SR_MHZ(10)) ? sample_rate : SR_MHZ(10); + else if (_op1->isChecked()) + sample_rate = (sample_rate > SR_MHZ(10) && sample_rate <= SR_MHZ(25)) ? sample_rate : SR_MHZ(25); + } + _dev_inst->set_config(NULL, NULL, + SR_CONF_SAMPLERATE, + g_variant_new_uint64(sample_rate)); + + QDialog::accept(); +} + +void StreamOptions::reject() +{ + accept(); +} + +} // namespace dialogs +} // namespace pv diff --git a/DSView/pv/dialogs/streamoptions.h b/DSView/pv/dialogs/streamoptions.h new file mode 100644 index 00000000..03fdcc5b --- /dev/null +++ b/DSView/pv/dialogs/streamoptions.h @@ -0,0 +1,76 @@ +/* + * This file is part of the DSView project. + * DSView is based on PulseView. + * + * Copyright (C) 2012 Joel Holdsworth + * Copyright (C) 2013 DreamSourceLab + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + +#ifndef DSVIEW_PV_STREAMOPTIONS_H +#define DSVIEW_PV_STREAMOPTIONS_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include + +namespace pv { +namespace dialogs { + +class StreamOptions : public QDialog +{ + Q_OBJECT + +public: + StreamOptions(QWidget *parent, boost::shared_ptr dev_inst, + uint64_t sample_count, bool stream); + +protected: + void accept(); + void reject(); + +private: + boost::shared_ptr _dev_inst; + uint64_t _sample_count; + QVBoxLayout _layout; + + QRadioButton * _op0; + QRadioButton * _op1; + + bool _stream; + + QDialogButtonBox _button_box; +}; + +} // namespace dialogs +} // namespace pv + +#endif // DSVIEW_PV_STREAMOPTIONS_H diff --git a/DSView/pv/dialogs/waitingdialog.cpp b/DSView/pv/dialogs/waitingdialog.cpp new file mode 100644 index 00000000..6bd0e769 --- /dev/null +++ b/DSView/pv/dialogs/waitingdialog.cpp @@ -0,0 +1,132 @@ +/* + * This file is part of the DSView project. + * DSView is based on PulseView. + * + * Copyright (C) 2012 Joel Holdsworth + * Copyright (C) 2013 DreamSourceLab + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + +#include "waitingdialog.h" + +#include + +#include +#include + +#include "libsigrok4DSL/libsigrok.h" +#include "../view/trace.h" + +using namespace boost; +using namespace std; + +namespace pv { +namespace dialogs { + +const QString WaitingDialog::TIPS_INFO = "Waiting"; + +WaitingDialog::WaitingDialog(QWidget *parent, shared_ptr dev_inst) : + QDialog(parent), + _dev_inst(dev_inst), + _button_box(QDialogButtonBox::Save | QDialogButtonBox::Abort, + Qt::Horizontal, this) +{ + this->setFixedSize((GIF_SIZE+TIP_WIDTH)*2, (GIF_SIZE+TIP_HEIGHT)*2); + int midx = this->width() / 2; + int midy = this->height() / 2; + this->setWindowOpacity(0.6); + this->setStyleSheet("background-color: rgb(255, 255, 255);"); + this->setWindowFlags(Qt::Dialog | Qt::FramelessWindowHint); + + label = new QLabel(this); + label->setStyleSheet("background-color: transparent;"); + label->setGeometry(midx-GIF_SIZE/2, midy-GIF_SIZE/2, GIF_SIZE, GIF_SIZE); + movie = new QMovie(":/icons/wait.gif"); + label->setMovie(movie); + + tips = new QLabel(this); + tips->setText(TIPS_INFO); + tips->setStyleSheet("color: rgb(17, 133, 209); background-color: transparent;"); + QFont font; + font.setPointSize(10); + font.setBold(true); + tips->setFont(font); + tips->setGeometry(midx-TIP_WIDTH/2, midy+GIF_SIZE/2, TIP_WIDTH, TIP_HEIGHT); + + index = 0; + timer = new QTimer(); + connect(timer, SIGNAL(timeout()), this, SLOT(changeText())); + + QString styleSheet = "* {color: rgb(255, 255, 255); background-color: rgb(17, 133, 209);} *:hover {background-color: rgb(238, 178, 17);}"; + _button_box.setStyleSheet(styleSheet); + _button_box.setGeometry(width()-_button_box.width()-30, height()-_button_box.height()-15, + _button_box.width(), _button_box.height()); + connect(&_button_box, SIGNAL(accepted()), this, SLOT(accept())); + connect(&_button_box, SIGNAL(rejected()), this, SLOT(reject())); + _button_box.buttons().front()->setVisible(false); +} + +void WaitingDialog::accept() +{ + using namespace Qt; + + movie->stop(); + timer->stop(); + + _dev_inst->set_config(NULL, NULL, SR_CONF_ZERO_SET, g_variant_new_boolean(true)); + QDialog::accept(); +} + +void WaitingDialog::reject() +{ + using namespace Qt; + + movie->stop(); + timer->stop(); + QDialog::reject(); +} + +void WaitingDialog::start() +{ + movie->start(); + timer->start(300); + this->exec(); +} + +void WaitingDialog::changeText() +{ + sr_status status; + index++; + if(index == WPOINTS_NUM + 1) + { + tips->setText(TIPS_INFO); + index = 0; + sr_status_get(_dev_inst->dev_inst(), &status, 0, 0); + if (!status.zeroing) { + movie->stop(); + movie->jumpToFrame(0); + timer->stop(); + tips->setText(""); + _button_box.buttons().front()->setVisible(true); + } + } else { + tips->setText(tips->text()+"."); + } +} + +} // namespace dialogs +} // namespace pv diff --git a/DSView/pv/dialogs/waitingdialog.h b/DSView/pv/dialogs/waitingdialog.h new file mode 100644 index 00000000..a214b45d --- /dev/null +++ b/DSView/pv/dialogs/waitingdialog.h @@ -0,0 +1,77 @@ +/* + * This file is part of the DSView project. + * DSView is based on PulseView. + * + * Copyright (C) 2012 Joel Holdsworth + * Copyright (C) 2013 DreamSourceLab + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + +#ifndef DSVIEW_PV_WAITINGDIALOG_H +#define DSVIEW_PV_WAITINGDIALOG_H + +#include +#include +#include +#include +#include + +#include + +#include + +namespace pv { +namespace dialogs { + +class WaitingDialog : public QDialog +{ + Q_OBJECT + +private: + static const int GIF_SIZE = 80; + static const int TIP_WIDTH = 100; + static const int TIP_HEIGHT = 40; + static const int WPOINTS_NUM = 6; + static const QString TIPS_INFO; + +public: + WaitingDialog(QWidget *parent, boost::shared_ptr dev_inst); + void start(); + +protected: + void accept(); + void reject(); + +private slots: + void changeText(); + +private: + boost::shared_ptr _dev_inst; + + QDialogButtonBox _button_box; + + int index; + QLabel *label; + QMovie *movie; + QTimer *timer; + QLabel *tips; +}; + +} // namespace dialogs +} // namespace pv + +#endif // DSVIEW_PV_WAITINGDIALOG_H diff --git a/DSView/pv/dock/dsotriggerdock.cpp b/DSView/pv/dock/dsotriggerdock.cpp index b2b22e85..d123691f 100644 --- a/DSView/pv/dock/dsotriggerdock.cpp +++ b/DSView/pv/dock/dsotriggerdock.cpp @@ -1,6 +1,6 @@ /* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. + * This file is part of the DSView project. + * DSView is based on PulseView. * * Copyright (C) 2012 Joel Holdsworth * Copyright (C) 2013 DreamSourceLab @@ -36,7 +36,7 @@ #include #include -#include "libsigrok4DSLogic/libsigrok.h" +#include "libsigrok4DSL/libsigrok.h" namespace pv { namespace dock { @@ -200,5 +200,33 @@ void DsoTriggerDock::device_change() } } +void DsoTriggerDock::init() +{ + // TRIGGERPOS + GVariant* gvar = _session.get_device()->get_config(NULL, NULL, + SR_CONF_HORIZ_TRIGGERPOS); + if (gvar != NULL) { + uint16_t pos = g_variant_get_uint16(gvar); + g_variant_unref(gvar); + position_slider->setValue(pos); + } + + gvar = _session.get_device()->get_config(NULL, NULL, + SR_CONF_TRIGGER_SOURCE); + if (gvar != NULL) { + uint8_t src = g_variant_get_byte(gvar); + g_variant_unref(gvar); + source_group->button(src)->setChecked(true); + } + + gvar = _session.get_device()->get_config(NULL, NULL, + SR_CONF_TRIGGER_SLOPE); + if (gvar != NULL) { + uint8_t slope = g_variant_get_uint16(gvar); + g_variant_unref(gvar); + type_group->button(slope)->setChecked(true); + } +} + } // namespace dock } // namespace pv diff --git a/DSView/pv/dock/dsotriggerdock.h b/DSView/pv/dock/dsotriggerdock.h index 72095d0e..ba997bb1 100644 --- a/DSView/pv/dock/dsotriggerdock.h +++ b/DSView/pv/dock/dsotriggerdock.h @@ -1,6 +1,6 @@ /* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. + * This file is part of the DSView project. + * DSView is based on PulseView. * * Copyright (C) 2012 Joel Holdsworth * Copyright (C) 2013 DreamSourceLab @@ -21,8 +21,8 @@ */ -#ifndef DSLOGIC_PV_DSOTRIGGERDOCK_H -#define DSLOGIC_PV_DSOTRIGGERDOCK_H +#ifndef DSVIEW_PV_DSOTRIGGERDOCK_H +#define DSVIEW_PV_DSOTRIGGERDOCK_H #include #include @@ -31,7 +31,7 @@ #include -#include +#include namespace pv { @@ -51,6 +51,8 @@ public: void device_change(); + void init(); + signals: void set_trig_pos(quint64 trig_pos); @@ -74,4 +76,4 @@ private: } // namespace dock } // namespace pv -#endif // DSLOGIC_PV_DSOTRIGGERDOCK_H +#endif // DSVIEW_PV_DSOTRIGGERDOCK_H diff --git a/DSView/pv/dock/measuredock.cpp b/DSView/pv/dock/measuredock.cpp index 26dcd6f8..f782ee3a 100644 --- a/DSView/pv/dock/measuredock.cpp +++ b/DSView/pv/dock/measuredock.cpp @@ -1,6 +1,6 @@ /* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. + * This file is part of the DSView project. + * DSView is based on PulseView. * * Copyright (C) 2012 Joel Holdsworth * Copyright (C) 2013 DreamSourceLab @@ -36,7 +36,7 @@ #include #include -#include "libsigrok4DSLogic/libsigrok.h" +#include "libsigrok4DSL/libsigrok.h" using boost::shared_ptr; @@ -64,7 +64,7 @@ MeasureDock::MeasureDock(QWidget *parent, View &view, SigSession &session) : _mouse_layout->addWidget(_width_label, 1, 1); _mouse_layout->addWidget(new QLabel("Period: ", this), 2, 0); _mouse_layout->addWidget(_period_label, 2, 1); - _mouse_layout->addWidget(new QLabel("Freqency: ", this), 3, 0); + _mouse_layout->addWidget(new QLabel("Frequency: ", this), 3, 0); _mouse_layout->addWidget(_freq_label, 3, 1); _mouse_layout->addWidget(new QLabel(this), 0, 2); _mouse_layout->addWidget(new QLabel(this), 1, 2); diff --git a/DSView/pv/dock/measuredock.h b/DSView/pv/dock/measuredock.h index e3607747..500ec66e 100644 --- a/DSView/pv/dock/measuredock.h +++ b/DSView/pv/dock/measuredock.h @@ -1,6 +1,6 @@ /* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. + * This file is part of the DSView project. + * DSView is based on PulseView. * * Copyright (C) 2012 Joel Holdsworth * Copyright (C) 2013 DreamSourceLab @@ -21,8 +21,8 @@ */ -#ifndef DSLOGIC_PV_MEASUREDOCK_H -#define DSLOGIC_PV_MEASUREDOCK_H +#ifndef DSVIEW_PV_MEASUREDOCK_H +#define DSVIEW_PV_MEASUREDOCK_H #include #include @@ -43,7 +43,7 @@ #include -#include +#include namespace pv { @@ -110,4 +110,4 @@ private: } // namespace dock } // namespace pv -#endif // DSLOGIC_PV_MEASUREDOCK_H +#endif // DSVIEW_PV_MEASUREDOCK_H diff --git a/DSView/pv/dock/protocoldock.cpp b/DSView/pv/dock/protocoldock.cpp index 3b05627d..083f2568 100644 --- a/DSView/pv/dock/protocoldock.cpp +++ b/DSView/pv/dock/protocoldock.cpp @@ -1,6 +1,6 @@ /* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. + * This file is part of the DSView project. + * DSView is based on PulseView. * * Copyright (C) 2012 Joel Holdsworth * Copyright (C) 2013 DreamSourceLab diff --git a/DSView/pv/dock/protocoldock.h b/DSView/pv/dock/protocoldock.h index c60e6cdd..00f677f8 100644 --- a/DSView/pv/dock/protocoldock.h +++ b/DSView/pv/dock/protocoldock.h @@ -1,6 +1,6 @@ /* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. + * This file is part of the DSView project. + * DSView is based on PulseView. * * Copyright (C) 2012 Joel Holdsworth * Copyright (C) 2013 DreamSourceLab @@ -21,8 +21,8 @@ */ -#ifndef DSLOGIC_PV_PROTOCOLDOCK_H -#define DSLOGIC_PV_PROTOCOLDOCK_H +#ifndef DSVIEW_PV_PROTOCOLDOCK_H +#define DSVIEW_PV_PROTOCOLDOCK_H #include @@ -36,7 +36,7 @@ #include -#include +#include namespace pv { @@ -83,4 +83,4 @@ private: } // namespace dock } // namespace pv -#endif // DSLOGIC_PV_PROTOCOLDOCK_H +#endif // DSVIEW_PV_PROTOCOLDOCK_H diff --git a/DSView/pv/dock/searchdock.cpp b/DSView/pv/dock/searchdock.cpp index 04b91918..7fe6e768 100644 --- a/DSView/pv/dock/searchdock.cpp +++ b/DSView/pv/dock/searchdock.cpp @@ -1,6 +1,6 @@ /* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. + * This file is part of the DSView project. + * DSView is based on PulseView. * * Copyright (C) 2012 Joel Holdsworth * Copyright (C) 2013 DreamSourceLab diff --git a/DSView/pv/dock/searchdock.h b/DSView/pv/dock/searchdock.h index 7d748fc2..2477dcb4 100644 --- a/DSView/pv/dock/searchdock.h +++ b/DSView/pv/dock/searchdock.h @@ -1,6 +1,6 @@ /* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. + * This file is part of the DSView project. + * DSView is based on PulseView. * * Copyright (C) 2012 Joel Holdsworth * Copyright (C) 2013 DreamSourceLab @@ -21,8 +21,8 @@ */ -#ifndef DSLOGIC_PV_SEARCHDOCK_H -#define DSLOGIC_PV_SEARCHDOCK_H +#ifndef DSVIEW_PV_SEARCHDOCK_H +#define DSVIEW_PV_SEARCHDOCK_H #include #include @@ -43,7 +43,7 @@ #include -#include +#include #include "../widgets/fakelineedit.h" @@ -96,4 +96,4 @@ private: } // namespace dock } // namespace pv -#endif // DSLOGIC_PV_SEARCHDOCK_H +#endif // DSVIEW_PV_SEARCHDOCK_H diff --git a/DSView/pv/dock/triggerdock.cpp b/DSView/pv/dock/triggerdock.cpp index 4d5e78cb..1e382b91 100644 --- a/DSView/pv/dock/triggerdock.cpp +++ b/DSView/pv/dock/triggerdock.cpp @@ -1,6 +1,6 @@ /* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. + * This file is part of the DSView project. + * DSView is based on PulseView. * * Copyright (C) 2012 Joel Holdsworth * Copyright (C) 2013 DreamSourceLab @@ -32,7 +32,7 @@ #include #include -#include "libsigrok4DSLogic/libsigrok.h" +#include "libsigrok4DSL/libsigrok.h" namespace pv { namespace dock { @@ -53,10 +53,10 @@ TriggerDock::TriggerDock(QWidget *parent, SigSession &session) : position_label = new QLabel("Trigger Position: ", this); position_spinBox = new QSpinBox(this); - position_spinBox->setRange(0, 100); + position_spinBox->setRange(0, 99); position_spinBox->setButtonSymbols(QAbstractSpinBox::NoButtons); position_slider = new QSlider(Qt::Horizontal, this); - position_slider->setRange(0, 100); + position_slider->setRange(0, 99); connect(position_slider, SIGNAL(valueChanged(int)), position_spinBox, SLOT(setValue(int))); connect(position_spinBox, SIGNAL(valueChanged(int)), position_slider, SLOT(setValue(int))); @@ -86,6 +86,7 @@ TriggerDock::TriggerDock(QWidget *parent, SigSession &session) : _value0_lineEdit->setValidator(value_validator); _value0_lineEdit->setMaxLength(TriggerProbes * 2 - 1); _value0_lineEdit->setInputMask("X X X X X X X X X X X X X X X X"); + _value0_lineEdit->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred); _value0_lineEdit_list.push_back(_value0_lineEdit); QSpinBox *_count0_spinBox = new QSpinBox(this); _count0_spinBox->setRange(1, 1 << TriggerCountBits); @@ -101,6 +102,7 @@ TriggerDock::TriggerDock(QWidget *parent, SigSession &session) : _value1_lineEdit->setValidator(value_validator); _value1_lineEdit->setMaxLength(TriggerProbes * 2 - 1); _value1_lineEdit->setInputMask("X X X X X X X X X X X X X X X X"); + _value1_lineEdit->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred); _value1_lineEdit_list.push_back(_value1_lineEdit); QSpinBox *_count1_spinBox = new QSpinBox(this); _count1_spinBox->setRange(1, 1 << TriggerCountBits); @@ -129,7 +131,7 @@ TriggerDock::TriggerDock(QWidget *parent, SigSession &session) : stage_glayout->addWidget(_inv1_comboBox, 3, 1); stage_glayout->addWidget(_count1_spinBox, 3, 2); stage_layout->addLayout(stage_glayout); - stage_layout->addSpacing(160); + stage_layout->addSpacing(100); stage_layout->addWidget(new QLabel("X: Don't care\n0: Low level\n1: High level\nR: Rising edge\nF: Falling edge\nC: Rising/Falling edge")); stage_layout->addStretch(1); @@ -211,9 +213,25 @@ void TriggerDock::simple_trigger() void TriggerDock::adv_trigger() { if (strcmp(_session.get_device()->dev_inst()->driver->name, "DSLogic") == 0) { - widget_enable(); - ds_trigger_set_mode(ADV_TRIGGER); - _session.set_adv_trigger(true); + bool stream = false; + GVariant *gvar = _session.get_device()->get_config(NULL, NULL, SR_CONF_STREAM); + if (gvar != NULL) { + stream = g_variant_get_boolean(gvar); + g_variant_unref(gvar); + } + if (stream) { + QMessageBox msg(this); + msg.setText("Trigger"); + msg.setInformativeText("Stram Mode Don't Support Advanced Trigger!"); + msg.setStandardButtons(QMessageBox::Ok); + msg.setIcon(QMessageBox::Warning); + msg.exec(); + simple_radioButton->setChecked(true); + } else { + widget_enable(); + ds_trigger_set_mode(ADV_TRIGGER); + _session.set_adv_trigger(true); + } } else { QMessageBox msg(this); msg.setText("Trigger"); @@ -342,7 +360,15 @@ void TriggerDock::pos_changed(int pos) void TriggerDock::device_change() { - if (strcmp(_session.get_device()->dev_inst()->driver->name, "DSLogic") != 0) { + bool stream = false; + GVariant *gvar = _session.get_device()->get_config(NULL, NULL, SR_CONF_STREAM); + if (gvar != NULL) { + stream = g_variant_get_boolean(gvar); + g_variant_unref(gvar); + } + + if (stream || + strcmp(_session.get_device()->dev_inst()->driver->name, "DSLogic") != 0) { position_spinBox->setDisabled(true); position_slider->setDisabled(true); } else { @@ -351,5 +377,12 @@ void TriggerDock::device_change() } } +void TriggerDock::init() +{ + // TRIGGERPOS + //uint16_t pos = ds_trigger_get_pos(); + //position_slider->setValue(pos); +} + } // namespace dock } // namespace pv diff --git a/DSView/pv/dock/triggerdock.h b/DSView/pv/dock/triggerdock.h index a2915db2..03a84b0d 100644 --- a/DSView/pv/dock/triggerdock.h +++ b/DSView/pv/dock/triggerdock.h @@ -1,6 +1,6 @@ /* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. + * This file is part of the DSView project. + * DSView is based on PulseView. * * Copyright (C) 2012 Joel Holdsworth * Copyright (C) 2013 DreamSourceLab @@ -21,8 +21,8 @@ */ -#ifndef DSLOGIC_PV_TRIGGERDOCK_H -#define DSLOGIC_PV_TRIGGERDOCK_H +#ifndef DSVIEW_PV_TRIGGERDOCK_H +#define DSVIEW_PV_TRIGGERDOCK_H #include #include @@ -41,7 +41,7 @@ #include -#include +#include namespace pv { @@ -61,6 +61,8 @@ public: void device_change(); + void init(); + signals: private slots: @@ -107,4 +109,4 @@ private: } // namespace dock } // namespace pv -#endif // DSLOGIC_PV_TRIGGERDOCK_H +#endif // DSVIEW_PV_TRIGGERDOCK_H diff --git a/DSView/pv/mainwindow.cpp b/DSView/pv/mainwindow.cpp index 6292cca7..7a0c9407 100644 --- a/DSView/pv/mainwindow.cpp +++ b/DSView/pv/mainwindow.cpp @@ -1,6 +1,6 @@ /* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. + * This file is part of the DSView project. + * DSView is based on PulseView. * * Copyright (C) 2012 Joel Holdsworth * Copyright (C) 2013 DreamSourceLab @@ -53,7 +53,9 @@ #include "device/file.h" #include "dialogs/about.h" +#include "dialogs/deviceoptions.h" #include "dialogs/storeprogress.h" +#include "dialogs/waitingdialog.h" #include "toolbars/samplingbar.h" #include "toolbars/trigbar.h" @@ -77,7 +79,7 @@ #include #include #include -#include +#include using boost::shared_ptr; using boost::dynamic_pointer_cast; @@ -100,6 +102,9 @@ MainWindow::MainWindow(DeviceManager &device_manager, Qt::QueuedConnection, Q_ARG(QString, s)); } + test_timer_linked = false; + test_timer.stop(); + test_timer.setSingleShot(true); } void MainWindow::setup_ui() @@ -170,7 +175,7 @@ void MainWindow::setup_ui() // Setup _view widget - _view = new pv::view::View(_session, this); + _view = new pv::view::View(_session, _sampling_bar, this); _vertical_layout->addWidget(_view); connect(_sampling_bar, SIGNAL(device_selected()), this, @@ -182,7 +187,7 @@ void MainWindow::setup_ui() connect(_sampling_bar, SIGNAL(instant_stop()), this, SLOT(instant_stop())); connect(_sampling_bar, SIGNAL(update_scale()), _view, - SLOT(update_scale())); + SLOT(update_scale()), Qt::DirectConnection); connect(_dso_trigger_widget, SIGNAL(set_trig_pos(quint64)), _view, SLOT(set_trig_pos(quint64))); @@ -218,7 +223,9 @@ void MainWindow::setup_ui() addDockWidget(Qt::BottomDockWidgetArea, _search_dock); // Set the title - setWindowTitle(QApplication::translate("MainWindow", "DSLogic(Beta)", 0, + QString title = QApplication::applicationName()+" v"+QApplication::applicationVersion(); + std::string std_title = title.toStdString(); + setWindowTitle(QApplication::translate("MainWindow", std_title.c_str(), 0, QApplication::UnicodeUTF8)); // Setup _session events @@ -230,8 +237,8 @@ void MainWindow::setup_ui() SLOT(device_detach())); connect(&_session, SIGNAL(test_data_error()), this, SLOT(test_data_error())); - connect(&_session, SIGNAL(sample_rate_changed(uint64_t)), _sampling_bar, - SLOT(set_sample_rate(uint64_t))); + connect(&_session, SIGNAL(malloc_error()), this, + SLOT(malloc_error())); connect(_view, SIGNAL(cursor_update()), _measure_widget, SLOT(cursor_update())); @@ -257,7 +264,8 @@ void MainWindow::setup_ui() _search_dock->installEventFilter(this); // Populate the device list and select the initially selected device - _session.set_default_device(); + _session.set_default_device(boost::bind(&MainWindow::session_error, this, + QString("Set Default Device failed"), _1)); update_device_list(); _session.start_hotplug_proc(boost::bind(&MainWindow::session_error, this, QString("Hotplug failed"), _1)); @@ -282,7 +290,11 @@ void MainWindow::update_device_list() #endif _trig_bar->close_all(); - + if (_session.get_device()->dev_inst()->mode == LOGIC) { + _trig_bar->enable_protocol(true); + } else { + _trig_bar->enable_protocol(false); + } if (_session.get_device()->dev_inst()->mode == DSO) { _sampling_bar->enable_toggle(false); } else { @@ -302,10 +314,10 @@ void MainWindow::update_device_list() errorMessage, infoMessage)); } - if (strcmp(selected_device->dev_inst()->driver->name, "DSLogic") == 0) - _logo_bar->dslogic_connected(true); + if (strcmp(selected_device->dev_inst()->driver->name, "demo") != 0) + _logo_bar->dsl_connected(true); else - _logo_bar->dslogic_connected(false); + _logo_bar->dsl_connected(false); } void MainWindow::load_file(QString file_name) @@ -314,7 +326,8 @@ void MainWindow::load_file(QString file_name) _session.set_file(file_name.toStdString()); } catch(QString e) { show_session_error(tr("Failed to load ") + file_name, e); - _session.set_default_device(); + _session.set_default_device(boost::bind(&MainWindow::session_error, this, + QString("Set Default Device failed"), _1)); update_device_list(); return; } @@ -342,12 +355,12 @@ void MainWindow::device_attach() struct sr_dev_driver **const drivers = sr_driver_list(); struct sr_dev_driver **driver; - for (driver = drivers; strcmp(((struct sr_dev_driver *)*driver)->name, "DSLogic") != 0 && *driver; driver++); + for (driver = drivers; *driver; driver++) + if (*driver) + _device_manager.driver_scan(*driver); - if (*driver) - _device_manager.driver_scan(*driver); - - _session.set_default_device(); + _session.set_default_device(boost::bind(&MainWindow::session_error, this, + QString("Set Default Device failed"), _1)); update_device_list(); } @@ -360,44 +373,52 @@ void MainWindow::device_detach() struct sr_dev_driver **const drivers = sr_driver_list(); struct sr_dev_driver **driver; - for (driver = drivers; strcmp(((struct sr_dev_driver *)*driver)->name, "DSLogic") != 0 && *driver; driver++); + for (driver = drivers; *driver; driver++) + if (*driver) + _device_manager.driver_scan(*driver); - if (*driver) - _device_manager.driver_scan(*driver); - - _session.set_default_device(); + _session.set_default_device(boost::bind(&MainWindow::session_error, this, + QString("Set Default Device failed"), _1)); update_device_list(); } void MainWindow::run_stop() { - _sampling_bar->enable_run_stop(false); - _sampling_bar->enable_instant(false); +#ifdef TEST_MODE + if (!test_timer_linked) { + connect(&test_timer, SIGNAL(timeout()), + this, SLOT(run_stop())); + test_timer_linked = true; + } +#endif switch(_session.get_capture_state()) { case SigSession::Init: case SigSession::Stopped: _view->show_trig_cursor(false); + _view->update_sample(false); _session.start_capture(false, boost::bind(&MainWindow::session_error, this, QString("Capture failed"), _1)); - break; + break; case SigSession::Running: _session.stop_capture(); break; } - g_usleep(1000); - _sampling_bar->enable_run_stop(true); } void MainWindow::instant_stop() { - _sampling_bar->enable_instant(false); - _sampling_bar->enable_run_stop(false); +#ifdef TEST_MODE + disconnect(&test_timer, SIGNAL(timeout()), + this, SLOT(run_stop())); + test_timer_linked = false; +#else switch(_session.get_capture_state()) { case SigSession::Init: case SigSession::Stopped: _view->show_trig_cursor(false); + _view->update_sample(true); _session.start_capture(true, boost::bind(&MainWindow::session_error, this, QString("Capture failed"), _1)); @@ -407,12 +428,16 @@ void MainWindow::instant_stop() _session.stop_capture(); break; } - g_usleep(1000); - _sampling_bar->enable_instant(true); +#endif } void MainWindow::test_data_error() { +#ifdef TEST_MODE + disconnect(&test_timer, SIGNAL(timeout()), + this, SLOT(run_stop())); + test_timer_linked = false; +#endif _session.stop_capture(); QMessageBox msg(this); msg.setText("Data Error"); @@ -422,31 +447,51 @@ void MainWindow::test_data_error() msg.exec(); } +void MainWindow::malloc_error() +{ + _session.stop_capture(); + QMessageBox msg(this); + msg.setText("Malloc Error"); + msg.setInformativeText("Memory is not enough for this sample!\nPlease reduce the sample depth!"); + msg.setStandardButtons(QMessageBox::Ok); + msg.setIcon(QMessageBox::Warning); + msg.exec(); +} + void MainWindow::capture_state_changed(int state) { + _file_bar->enable_toggle(state != SigSession::Running); + _sampling_bar->set_sampling(state == SigSession::Running); + _view->on_state_changed(state != SigSession::Running); + if (_session.get_device()->dev_inst()->mode != DSO) { _sampling_bar->enable_toggle(state != SigSession::Running); _trig_bar->enable_toggle(state != SigSession::Running); _measure_dock->widget()->setEnabled(state != SigSession::Running); +#ifdef TEST_MODE + if (state == SigSession::Stopped) { + test_timer.start(100); + } +#endif } - _file_bar->enable_toggle(state != SigSession::Running); - _sampling_bar->set_sampling(state == SigSession::Running); - _view->on_state_changed(state != SigSession::Running); } void MainWindow::on_protocol(bool visible) { #ifdef ENABLE_DECODE - _protocol_dock->setVisible(visible); + if (_session.get_device()->dev_inst()->mode == LOGIC) + _protocol_dock->setVisible(visible); #endif } void MainWindow::on_trigger(bool visible) { if (_session.get_device()->dev_inst()->mode != DSO) { + _trigger_widget->init(); _trigger_dock->setVisible(visible); _dso_trigger_dock->setVisible(false); } else { + _dso_trigger_widget->init(); _trigger_dock->setVisible(false); _dso_trigger_dock->setVisible(visible); } @@ -489,7 +534,7 @@ void MainWindow::on_save() // Show the dialog const QString file_name = QFileDialog::getSaveFileName( - this, tr("Save File"), "", tr("DSLogic Sessions (*.dsl)")); + this, tr("Save File"), "", tr("DSView Sessions (*.dsl)")); if (file_name.isEmpty()) return; @@ -537,11 +582,11 @@ bool MainWindow::eventFilter(QObject *object, QEvent *event) break; case Qt::Key_PageUp: _view->set_scale_offset(_view->scale(), - _view->offset() - _view->scale()*_view->viewport()->width()); + _view->offset() - _view->scale()*_view->get_view_width()); break; case Qt::Key_PageDown: _view->set_scale_offset(_view->scale(), - _view->offset() + _view->scale()*_view->viewport()->width()); + _view->offset() + _view->scale()*_view->get_view_width()); break; case Qt::Key_Left: @@ -550,6 +595,32 @@ bool MainWindow::eventFilter(QObject *object, QEvent *event) case Qt::Key_Right: _view->zoom(-1); break; + case Qt::Key_0: + BOOST_FOREACH(const shared_ptr s, sigs) { + shared_ptr dsoSig; + if (dsoSig = dynamic_pointer_cast(s)) { + if (dsoSig->get_index() == 0) + dsoSig->set_vDialActive(!dsoSig->get_vDialActive()); + else + dsoSig->set_vDialActive(false); + } + } + _view->setFocus(); + update(); + break; + case Qt::Key_1: + BOOST_FOREACH(const shared_ptr s, sigs) { + shared_ptr dsoSig; + if (dsoSig = dynamic_pointer_cast(s)) { + if (dsoSig->get_index() == 1) + dsoSig->set_vDialActive(!dsoSig->get_vDialActive()); + else + dsoSig->set_vDialActive(false); + } + } + _view->setFocus(); + update(); + break; case Qt::Key_Up: BOOST_FOREACH(const shared_ptr s, sigs) { shared_ptr dsoSig; diff --git a/DSView/pv/mainwindow.h b/DSView/pv/mainwindow.h index c1bd1cc6..a52e901c 100644 --- a/DSView/pv/mainwindow.h +++ b/DSView/pv/mainwindow.h @@ -1,6 +1,6 @@ /* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. + * This file is part of the DSView project. + * DSView is based on PulseView. * * Copyright (C) 2012 Joel Holdsworth * Copyright (C) 2013 DreamSourceLab @@ -21,12 +21,13 @@ */ -#ifndef DSLOGIC_PV_MAINWINDOW_H -#define DSLOGIC_PV_MAINWINDOW_H +#ifndef DSVIEW_PV_MAINWINDOW_H +#define DSVIEW_PV_MAINWINDOW_H #include #include +#include #include "sigsession.h" @@ -98,6 +99,8 @@ private slots: void test_data_error(); + void malloc_error(); + void capture_state_changed(int state); void on_protocol(bool visible); @@ -159,8 +162,11 @@ private: QDockWidget *_measure_dock; QDockWidget *_search_dock; dock::SearchDock * _search_widget; + + QTimer test_timer; + bool test_timer_linked; }; } // namespace pv -#endif // DSLOGIC_PV_MAINWINDOW_H +#endif // DSVIEW_PV_MAINWINDOW_H diff --git a/DSView/pv/prop/binding/binding.cpp b/DSView/pv/prop/binding/binding.cpp index 6fcacf8d..95c9ca3b 100644 --- a/DSView/pv/prop/binding/binding.cpp +++ b/DSView/pv/prop/binding/binding.cpp @@ -1,6 +1,6 @@ /* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. + * This file is part of the DSView project. + * DSView is based on PulseView. * * Copyright (C) 2012 Joel Holdsworth * Copyright (C) 2013 DreamSourceLab diff --git a/DSView/pv/prop/binding/binding.h b/DSView/pv/prop/binding/binding.h index dd521711..ab7758b5 100644 --- a/DSView/pv/prop/binding/binding.h +++ b/DSView/pv/prop/binding/binding.h @@ -1,6 +1,6 @@ /* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. + * This file is part of the DSView project. + * DSView is based on PulseView. * * Copyright (C) 2012 Joel Holdsworth * Copyright (C) 2013 DreamSourceLab @@ -21,8 +21,8 @@ */ -#ifndef DSLOGIC_PV_PROP_BINDING_BINDING_H -#define DSLOGIC_PV_PROP_BINDING_BINDING_H +#ifndef DSVIEW_PV_PROP_BINDING_BINDING_H +#define DSVIEW_PV_PROP_BINDING_BINDING_H #include @@ -66,4 +66,4 @@ protected: } // prop } // pv -#endif // DSLOGIC_PV_PROP_BINDING_BINDING_H +#endif // DSVIEW_PV_PROP_BINDING_BINDING_H diff --git a/DSView/pv/prop/binding/binding_deviceoptions.cpp b/DSView/pv/prop/binding/binding_deviceoptions.cpp index 8ffc1f7b..8c8d9e48 100644 --- a/DSView/pv/prop/binding/binding_deviceoptions.cpp +++ b/DSView/pv/prop/binding/binding_deviceoptions.cpp @@ -1,6 +1,6 @@ /* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. + * This file is part of the DSView project. + * DSView is based on PulseView. * * Copyright (C) 2012 Joel Holdsworth * Copyright (C) 2013 DreamSourceLab @@ -87,15 +87,23 @@ DeviceOptions::DeviceOptions(struct sr_dev_inst *sdi) : case SR_CONF_OPERATION_MODE: case SR_CONF_THRESHOLD: case SR_CONF_ZERO: + case SR_CONF_STREAM: + case SR_CONF_TEST: + case SR_CONF_STATUS: bind_enum(name, key, gvar_list); break; + case SR_CONF_VTH: + bind_double(name, key, "V", pair(0.0, 5.0), 1, 0.1); + break; + case SR_CONF_RLE: bind_bool(name, key); break; case SR_CONF_CLOCK_TYPE: case SR_CONF_CLOCK_EDGE: + case SR_CONF_INSTANT: bind_bool(name, key); break; @@ -170,6 +178,16 @@ void DeviceOptions::bind_int(const QString &name, int key, QString suffix, bind(config_setter, _sdi, key, _1)))); } +void DeviceOptions::bind_double(const QString &name, int key, QString suffix, + optional< std::pair > range, + int decimals, boost::optional step) +{ + _properties.push_back(boost::shared_ptr( + new Double(name, decimals, suffix, range, step, + bind(config_getter, _sdi, key), + bind(config_setter, _sdi, key, _1)))); +} + QString DeviceOptions::print_gvariant(GVariant *const gvar) { QString s; diff --git a/DSView/pv/prop/binding/decoderoptions.h b/DSView/pv/prop/binding/decoderoptions.h index eaae51dc..18a9d67c 100644 --- a/DSView/pv/prop/binding/decoderoptions.h +++ b/DSView/pv/prop/binding/decoderoptions.h @@ -18,8 +18,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifndef DSLOGIC_PV_PROP_BINDING_DECODEROPTIONS_H -#define DSLOGIC_PV_PROP_BINDING_DECODEROPTIONS_H +#ifndef DSVIEW_PV_PROP_BINDING_DECODEROPTIONS_H +#define DSVIEW_PV_PROP_BINDING_DECODEROPTIONS_H #include "binding.h" @@ -63,4 +63,4 @@ private: } // prop } // pv -#endif // DSLOGIC_PV_PROP_BINDING_DECODEROPTIONS_H +#endif // DSVIEW_PV_PROP_BINDING_DECODEROPTIONS_H diff --git a/DSView/pv/prop/binding/deviceoptions.h b/DSView/pv/prop/binding/deviceoptions.h index 7d9f1f83..a4b99744 100644 --- a/DSView/pv/prop/binding/deviceoptions.h +++ b/DSView/pv/prop/binding/deviceoptions.h @@ -1,6 +1,6 @@ /* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. + * This file is part of the DSView project. + * DSView is based on PulseView. * * Copyright (C) 2012 Joel Holdsworth * Copyright (C) 2013 DreamSourceLab @@ -21,15 +21,15 @@ */ -#ifndef DSLOGIC_PV_PROP_BINDING_DEVICEOPTIONS_H -#define DSLOGIC_PV_PROP_BINDING_DEVICEOPTIONS_H +#ifndef DSVIEW_PV_PROP_BINDING_DEVICEOPTIONS_H +#define DSVIEW_PV_PROP_BINDING_DEVICEOPTIONS_H #include #include #include -#include +#include #include "binding.h" @@ -56,6 +56,10 @@ private: void bind_int(const QString &name, int key, QString suffix, boost::optional< std::pair > range); + void bind_double(const QString &name, int key, QString suffix, + boost::optional > range, + int decimals, boost::optional step); + static QString print_gvariant(GVariant *const gvar); void bind_samplerate(const QString &name, @@ -77,4 +81,4 @@ protected: } // prop } // pv -#endif // DSLOGIC_PV_PROP_BINDING_DEVICEOPTIONS_H +#endif // DSVIEW_PV_PROP_BINDING_DEVICEOPTIONS_H diff --git a/DSView/pv/prop/bool.cpp b/DSView/pv/prop/bool.cpp index 12f2f45c..9d7e4961 100644 --- a/DSView/pv/prop/bool.cpp +++ b/DSView/pv/prop/bool.cpp @@ -1,6 +1,6 @@ /* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. + * This file is part of the DSView project. + * DSView is based on PulseView. * * Copyright (C) 2012 Joel Holdsworth * Copyright (C) 2013 DreamSourceLab diff --git a/DSView/pv/prop/bool.h b/DSView/pv/prop/bool.h index 7c65608d..3976606d 100644 --- a/DSView/pv/prop/bool.h +++ b/DSView/pv/prop/bool.h @@ -1,6 +1,6 @@ /* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. + * This file is part of the DSView project. + * DSView is based on PulseView. * * Copyright (C) 2012 Joel Holdsworth * Copyright (C) 2013 DreamSourceLab @@ -21,8 +21,8 @@ */ -#ifndef DSLOGIC_PV_PROP_BOOL_H -#define DSLOGIC_PV_PROP_BOOL_H +#ifndef DSVIEW_PV_PROP_BOOL_H +#define DSVIEW_PV_PROP_BOOL_H #include "property.h" @@ -55,4 +55,4 @@ private: } // prop } // pv -#endif // DSLOGIC_PV_PROP_BOOL_H +#endif // DSVIEW_PV_PROP_BOOL_H diff --git a/DSView/pv/prop/double.cpp b/DSView/pv/prop/double.cpp index ebc1ba13..2bd4a9ff 100644 --- a/DSView/pv/prop/double.cpp +++ b/DSView/pv/prop/double.cpp @@ -1,6 +1,6 @@ /* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. + * This file is part of the DSView project. + * DSView is based on PulseView. * * Copyright (C) 2012 Joel Holdsworth * Copyright (C) 2013 DreamSourceLab diff --git a/DSView/pv/prop/double.h b/DSView/pv/prop/double.h index 79b11007..e26d5d04 100644 --- a/DSView/pv/prop/double.h +++ b/DSView/pv/prop/double.h @@ -1,6 +1,6 @@ /* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. + * This file is part of the DSView project. + * DSView is based on PulseView. * * Copyright (C) 2012 Joel Holdsworth * Copyright (C) 2013 DreamSourceLab @@ -21,8 +21,8 @@ */ -#ifndef DSLOGIC_PV_PROP_DOUBLE_H -#define DSLOGIC_PV_PROP_DOUBLE_H +#ifndef DSVIEW_PV_PROP_DOUBLE_H +#define DSVIEW_PV_PROP_DOUBLE_H #include @@ -67,4 +67,4 @@ private: } // prop } // pv -#endif // DSLOGIC_PV_PROP_DOUBLE_H +#endif // DSVIEW_PV_PROP_DOUBLE_H diff --git a/DSView/pv/prop/enum.cpp b/DSView/pv/prop/enum.cpp index 8e96c5ec..8c51f554 100644 --- a/DSView/pv/prop/enum.cpp +++ b/DSView/pv/prop/enum.cpp @@ -1,6 +1,6 @@ /* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. + * This file is part of the DSView project. + * DSView is based on PulseView. * * Copyright (C) 2012 Joel Holdsworth * Copyright (C) 2013 DreamSourceLab diff --git a/DSView/pv/prop/enum.h b/DSView/pv/prop/enum.h index 0e14a1d8..dbeb1cf2 100644 --- a/DSView/pv/prop/enum.h +++ b/DSView/pv/prop/enum.h @@ -1,6 +1,6 @@ /* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. + * This file is part of the DSView project. + * DSView is based on PulseView. * * Copyright (C) 2012 Joel Holdsworth * Copyright (C) 2013 DreamSourceLab @@ -21,8 +21,8 @@ */ -#ifndef DSLOGIC_PV_PROP_ENUM_H -#define DSLOGIC_PV_PROP_ENUM_H +#ifndef DSVIEW_PV_PROP_ENUM_H +#define DSVIEW_PV_PROP_ENUM_H #include #include @@ -60,4 +60,4 @@ private: } // prop } // pv -#endif // DSLOGIC_PV_PROP_ENUM_H +#endif // DSVIEW_PV_PROP_ENUM_H diff --git a/DSView/pv/prop/int.cpp b/DSView/pv/prop/int.cpp index cf5fd5bc..5c0dc7d7 100644 --- a/DSView/pv/prop/int.cpp +++ b/DSView/pv/prop/int.cpp @@ -1,6 +1,6 @@ /* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. + * This file is part of the DSView project. + * DSView is based on PulseView. * * Copyright (C) 2012 Joel Holdsworth * Copyright (C) 2013 DreamSourceLab diff --git a/DSView/pv/prop/int.h b/DSView/pv/prop/int.h index 81ea7dd0..776b4f98 100644 --- a/DSView/pv/prop/int.h +++ b/DSView/pv/prop/int.h @@ -1,6 +1,6 @@ /* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. + * This file is part of the DSView project. + * DSView is based on PulseView. * * Copyright (C) 2012 Joel Holdsworth * Copyright (C) 2013 DreamSourceLab @@ -21,8 +21,8 @@ */ -#ifndef DSLOGIC_PV_PROP_INT_H -#define DSLOGIC_PV_PROP_INT_H +#ifndef DSVIEW_PV_PROP_INT_H +#define DSVIEW_PV_PROP_INT_H #include @@ -64,4 +64,4 @@ private: } // prop } // pv -#endif // DSLOGIC_PV_PROP_INT_H +#endif // DSVIEW_PV_PROP_INT_H diff --git a/DSView/pv/prop/property.cpp b/DSView/pv/prop/property.cpp index 907278b5..d0ab15ea 100644 --- a/DSView/pv/prop/property.cpp +++ b/DSView/pv/prop/property.cpp @@ -1,6 +1,6 @@ /* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. + * This file is part of the DSView project. + * DSView is based on PulseView. * * Copyright (C) 2012 Joel Holdsworth * Copyright (C) 2013 DreamSourceLab diff --git a/DSView/pv/prop/property.h b/DSView/pv/prop/property.h index d1f3e51e..d02bd510 100644 --- a/DSView/pv/prop/property.h +++ b/DSView/pv/prop/property.h @@ -1,6 +1,6 @@ /* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. + * This file is part of the DSView project. + * DSView is based on PulseView. * * Copyright (C) 2012 Joel Holdsworth * Copyright (C) 2013 DreamSourceLab @@ -21,8 +21,8 @@ */ -#ifndef DSLOGIC_PV_PROP_PROPERTY_H -#define DSLOGIC_PV_PROP_PROPERTY_H +#ifndef DSVIEW_PV_PROP_PROPERTY_H +#define DSVIEW_PV_PROP_PROPERTY_H #include @@ -67,4 +67,4 @@ private: } // prop } // pv -#endif // DSLOGIC_PV_PROP_PROPERTY_H +#endif // DSVIEW_PV_PROP_PROPERTY_H diff --git a/DSView/pv/prop/string.h b/DSView/pv/prop/string.h index 0caf565d..7be058d2 100644 --- a/DSView/pv/prop/string.h +++ b/DSView/pv/prop/string.h @@ -18,8 +18,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifndef DSLOGIC_PV_PROP_STRING_H -#define DSLOGIC_PV_PROP_STRING_H +#ifndef DSVIEW_PV_PROP_STRING_H +#define DSVIEW_PV_PROP_STRING_H #include "property.h" @@ -49,4 +49,4 @@ private: } // prop } // pv -#endif // DSLOGIC_PV_PROP_STRING_H +#endif // DSVIEW_PV_PROP_STRING_H diff --git a/DSView/pv/sigsession.cpp b/DSView/pv/sigsession.cpp index 8a848617..9e51799a 100644 --- a/DSView/pv/sigsession.cpp +++ b/DSView/pv/sigsession.cpp @@ -1,6 +1,6 @@ /* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. + * This file is part of the DSView project. + * DSView is based on PulseView. * * Copyright (C) 2012 Joel Holdsworth * Copyright (C) 2013 DreamSourceLab @@ -72,15 +72,13 @@ using std::min; namespace pv { -const float SigSession::Oversampling = 2.0f; - // TODO: This should not be necessary SigSession* SigSession::_session = NULL; SigSession::SigSession(DeviceManager &device_manager) : _device_manager(device_manager), _capture_state(Init), - _instant(false) + _instant(false) { // TODO: This should not be necessary _session = this; @@ -89,16 +87,21 @@ SigSession::SigSession(DeviceManager &device_manager) : _adv_trigger = false; _group_cnt = 0; ds_trigger_init(); - register_hotplug_callback(); + register_hotplug_callback(); + _view_timer.stop(); + _view_timer.setSingleShot(true); + connect(this, SIGNAL(start_timer(int)), &_view_timer, SLOT(start(int))); + connect(&_view_timer, SIGNAL(timeout()), this, SLOT(refresh())); } SigSession::~SigSession() { - stop_capture(); + stop_capture(); if (_hotplug_handle) { stop_hotplug_proc(); deregister_hotplug_callback(); } + ds_trigger_destroy(); _dev_inst->release(); @@ -131,7 +134,12 @@ void SigSession::set_device(shared_ptr dev_inst) throw(QString) _group_traces.clear(); if (_dev_inst) { - _dev_inst->use(this); + try { + _dev_inst->use(this); + } catch(const QString e) { + throw(e); + return; + } sr_session_datafeed_callback_add(data_feed_in_proc, NULL); device_setted(); } @@ -142,8 +150,18 @@ void SigSession::set_file(const string &name) throw(QString) { // Deslect the old device, because file type detection in File::create // destorys the old session inside libsigrok. - set_device(shared_ptr()); - set_device(shared_ptr(device::File::create(name))); + try { + set_device(shared_ptr()); + } catch(const QString e) { + throw(e); + return; + } + try { + set_device(shared_ptr(device::File::create(name))); + } catch(const QString e) { + throw(e); + return; + } } void SigSession::save_file(const std::string &name){ @@ -161,7 +179,7 @@ void SigSession::save_file(const std::string &name){ snapshot->get_sample_count()); } -void SigSession::set_default_device() +void SigSession::set_default_device(boost::function error_handler) { shared_ptr default_device; const list< shared_ptr > &devices = @@ -171,15 +189,20 @@ void SigSession::set_default_device() // Fall back to the first device in the list. default_device = devices.front(); - // Try and find the DSLogic device and select that by default + // Try and find the DreamSourceLab device and select that by default BOOST_FOREACH (shared_ptr dev, devices) if (dev->dev_inst() && strcmp(dev->dev_inst()->driver->name, - "DSLogic") == 0) { + "demo") != 0) { default_device = dev; break; } - set_device(default_device); + try { + set_device(default_device); + } catch(const QString e) { + error_handler(e); + return; + } } } @@ -222,11 +245,17 @@ void SigSession::start_capture(bool instant, } if (!l) { error_handler(tr("No probes enabled.")); + capture_state_changed(_capture_state); return; } - // Begin the session + // update setting _instant = instant; + if (~_instant) + _view_timer.blockSignals(false); + + // Begin the session + _sampling_thread.reset(new boost::thread( &SigSession::sample_thread_proc, this, _dev_inst, error_handler)); @@ -237,6 +266,7 @@ void SigSession::stop_capture() if (get_capture_state() != Running) return; sr_session_stop(); + _view_timer.blockSignals(true); // Check that sampling stopped if (_sampling_thread.get()) @@ -268,6 +298,11 @@ set< shared_ptr > SigSession::get_data() const return data; } +bool SigSession::get_instant() +{ + return _instant; +} + void* SigSession::get_buf(int& unit_size, uint64_t &length) { if (_dev_inst->dev_inst()->mode == LOGIC) { @@ -309,12 +344,6 @@ void* SigSession::get_buf(int& unit_size, uint64_t &length) } } -void SigSession::set_sample_rate(uint64_t sample_rate) -{ - if (_capture_state != Stopped) - sample_rate_changed(sample_rate); -} - void SigSession::set_capture_state(capture_state state) { boost::lock_guard lock(_sampling_mutex); @@ -511,7 +540,7 @@ void SigSession::init_signals() // Create data containers for the coming data snapshots { if (logic_probe_count != 0) { - _logic_data.reset(new data::Logic(logic_probe_count)); + _logic_data.reset(new data::Logic()); assert(_logic_data); _group_data.reset(new data::Group()); @@ -520,12 +549,12 @@ void SigSession::init_signals() } if (dso_probe_count != 0) { - _dso_data.reset(new data::Dso(dso_probe_count)); + _dso_data.reset(new data::Dso()); assert(_dso_data); } if (analog_probe_count != 0) { - _analog_data.reset(new data::Analog(analog_probe_count)); + _analog_data.reset(new data::Analog()); assert(_analog_data); } } @@ -609,6 +638,23 @@ void SigSession::reload() signals_changed(); } +void SigSession::refresh() +{ + if (_logic_data) { + _logic_data->clear(); + _cur_logic_snapshot.reset(); + } + if (_dso_data) { + _dso_data->clear(); + _cur_dso_snapshot.reset(); + } + if (_analog_data) { + _analog_data->clear(); + _cur_analog_snapshot.reset(); + } + data_updated(); +} + void SigSession::feed_in_meta(const sr_dev_inst *sdi, const sr_datafeed_meta &meta) { @@ -654,7 +700,8 @@ void SigSession::feed_in_logic(const sr_datafeed_logic &logic) new data::LogicSnapshot(logic, _dev_inst->get_sample_limit(), 1)); if (_cur_logic_snapshot->buf_null()) { - stop_capture(); + malloc_error(); + return; } else { _logic_data->push_snapshot(_cur_logic_snapshot); } @@ -664,12 +711,12 @@ void SigSession::feed_in_logic(const sr_datafeed_logic &logic) // frame_began is DecoderStack, but in future we need to signal // this after both analog and logic sweeps have begun. frame_began(); - } - else - { + } else if(!_cur_logic_snapshot->buf_null()) { // Append to the existing data snapshot _cur_logic_snapshot->append_payload(logic); - } + } else { + return; + } receive_data(logic.length/logic.unitsize); data_received(); @@ -690,20 +737,25 @@ void SigSession::feed_in_dso(const sr_datafeed_dso &dso) { // Create a new data snapshot _cur_dso_snapshot = boost::shared_ptr( - new data::DsoSnapshot(dso, _dev_inst->get_sample_limit(), _dso_data->get_num_probes())); + new data::DsoSnapshot(dso, _dev_inst->get_sample_limit(), get_ch_num(SR_CHANNEL_DSO), _instant)); if (_cur_dso_snapshot->buf_null()) - stop_capture(); - else + { + malloc_error(); + return; + } else { _dso_data->push_snapshot(_cur_dso_snapshot); - } - else - { + } + } else if(!_cur_dso_snapshot->buf_null()) { // Append to the existing data snapshot _cur_dso_snapshot->append_payload(dso); + } else { + return; } receive_data(dso.num_samples); data_updated(); + if (!_instant) + start_timer(ViewTime); } void SigSession::feed_in_analog(const sr_datafeed_analog &analog) @@ -720,17 +772,19 @@ void SigSession::feed_in_analog(const sr_datafeed_analog &analog) { // Create a new data snapshot _cur_analog_snapshot = boost::shared_ptr( - new data::AnalogSnapshot(analog, _dev_inst->get_sample_limit(), _analog_data->get_num_probes())); + new data::AnalogSnapshot(analog, _dev_inst->get_sample_limit(), get_ch_num(SR_CHANNEL_ANALOG))); if (_cur_analog_snapshot->buf_null()) - stop_capture(); - else + { + return; + } else if(!_cur_analog_snapshot->buf_null()) { _analog_data->push_snapshot(_cur_analog_snapshot); - } - else - { + } + } else if(!_cur_analog_snapshot->buf_null()) { // Append to the existing data snapshot _cur_analog_snapshot->append_payload(analog); - } + } else { + return; + } receive_data(analog.num_samples); data_updated(); @@ -822,10 +876,10 @@ int SigSession::hotplug_callback(struct libusb_context *ctx, struct libusb_devic if (LIBUSB_HOTPLUG_EVENT_DEVICE_ARRIVED == event) { _session->_hot_attach = true; - qDebug("DSLogic attaced!\n"); + qDebug("DreamSourceLab Hardware Attaced!\n"); }else if (LIBUSB_HOTPLUG_EVENT_DEVICE_LEFT == event) { _session->_hot_detach = true; - qDebug("DSLogic dettaced!\n"); + qDebug("DreamSourceLab Hardware Dettaced!\n"); }else{ qDebug("Unhandled event %d\n", event); } @@ -847,12 +901,12 @@ void SigSession::hotplug_proc(boost::function error_handle while(_session) { libusb_handle_events_timeout(NULL, &tv); if (_hot_attach) { - qDebug("DSLogic hardware attached!"); + qDebug("DreamSourceLab hardware attached!"); device_attach(); _hot_attach = false; } if (_hot_detach) { - qDebug("DSLogic hardware detached!"); + qDebug("DreamSourceLab hardware detached!"); device_detach(); _logic_data.reset(); _dso_data.reset(); @@ -873,7 +927,7 @@ void SigSession::register_hotplug_callback() ret = libusb_hotplug_register_callback(NULL, (libusb_hotplug_event)(LIBUSB_HOTPLUG_EVENT_DEVICE_ARRIVED | LIBUSB_HOTPLUG_EVENT_DEVICE_LEFT), - (libusb_hotplug_flag)LIBUSB_HOTPLUG_ENUMERATE, 0x2A0E, 0x0001, + (libusb_hotplug_flag)LIBUSB_HOTPLUG_ENUMERATE, 0x2A0E, LIBUSB_HOTPLUG_MATCH_ANY, LIBUSB_HOTPLUG_MATCH_ANY, hotplug_callback, NULL, &_hotplug_handle); if (LIBUSB_SUCCESS != ret){ @@ -907,7 +961,6 @@ void SigSession::stop_hotplug_proc() _hotplug.reset(); } - /* * Tigger */ @@ -917,17 +970,42 @@ void SigSession::set_adv_trigger(bool adv_trigger) } -uint16_t SigSession::get_dso_ch_num() +uint16_t SigSession::get_ch_num(int type) { uint16_t num_channels = 0; - BOOST_FOREACH(const shared_ptr s, _signals) - { - assert(s); - //if (dynamic_pointer_cast(s) && s->enabled()) { - if (dynamic_pointer_cast(s)) { - num_channels++; + uint16_t logic_ch_num = 0; + uint16_t dso_ch_num = 0; + uint16_t analog_ch_num = 0; + if (_dev_inst->dev_inst()) { + BOOST_FOREACH(const shared_ptr s, _signals) + { + assert(s); + if (dynamic_pointer_cast(s) && s->enabled()) { + //if (dynamic_pointer_cast(s)) { + logic_ch_num++; + } + if (dynamic_pointer_cast(s) && s->enabled()) { + //if (dynamic_pointer_cast(s)) { + dso_ch_num++; + } + if (dynamic_pointer_cast(s) && s->enabled()) { + //if (dynamic_pointer_cast(s)) { + analog_ch_num++; + } } } + + switch(type) { + case SR_CHANNEL_LOGIC: + num_channels = logic_ch_num; break; + case SR_CHANNEL_DSO: + num_channels = dso_ch_num; break; + case SR_CHANNEL_ANALOG: + num_channels = analog_ch_num; break; + default: + num_channels = logic_ch_num+dso_ch_num+analog_ch_num; break; + } + return num_channels; } diff --git a/DSView/pv/sigsession.h b/DSView/pv/sigsession.h index edd22f5a..cf4674dd 100644 --- a/DSView/pv/sigsession.h +++ b/DSView/pv/sigsession.h @@ -1,6 +1,6 @@ /* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. + * This file is part of the DSView project. + * DSView is based on PulseView. * * Copyright (C) 2012 Joel Holdsworth * Copyright (C) 2013 DreamSourceLab @@ -21,8 +21,8 @@ */ -#ifndef DSLOGIC_PV_SIGSESSION_H -#define DSLOGIC_PV_SIGSESSION_H +#ifndef DSVIEW_PV_SIGSESSION_H +#define DSVIEW_PV_SIGSESSION_H #include #include @@ -42,8 +42,9 @@ #include #include #include +#include -#include +#include #include struct srd_decoder; @@ -85,7 +86,8 @@ class SigSession : public QObject Q_OBJECT private: - static const float Oversampling; + static const float Oversampling = 2.0f; + static const int ViewTime = 800; public: enum capture_state { @@ -112,7 +114,7 @@ public: void save_file(const std::string &name); - void set_default_device(); + void set_default_device(boost::function error_handler); void release_device(device::DevInst *dev_inst); @@ -157,14 +159,14 @@ public: void start_hotplug_proc(boost::function error_handler); void stop_hotplug_proc(); - void register_hotplug_callback(); + void register_hotplug_callback(); void deregister_hotplug_callback(); void set_adv_trigger(bool adv_trigger); - uint16_t get_dso_ch_num(); + uint16_t get_ch_num(int type); - void set_sample_rate(uint64_t sample_rate); + bool get_instant(); private: void set_capture_state(capture_state state); @@ -203,6 +205,7 @@ private: static void data_feed_in_proc(const struct sr_dev_inst *sdi, const struct sr_datafeed_packet *packet, void *cb_data); + // thread for hotplug void hotplug_proc(boost::function error_handler); static int hotplug_callback(struct libusb_context *ctx, struct libusb_device *dev, libusb_hotplug_event event, void *user_data); @@ -239,13 +242,15 @@ private: std::auto_ptr _sampling_thread; - libusb_hotplug_callback_handle _hotplug_handle; + libusb_hotplug_callback_handle _hotplug_handle; std::auto_ptr _hotplug; bool _hot_attach; bool _hot_detach; bool _adv_trigger; + QTimer _view_timer; + signals: void capture_state_changed(int state); @@ -253,7 +258,7 @@ signals: void data_updated(); - void sample_rate_changed(uint64_t sample_rate); + void start_timer(int); void receive_data(quint64 length); @@ -274,8 +279,13 @@ signals: void device_setted(); + void malloc_error(); + + void zero_adj(); + public slots: void reload(); + void refresh(); private: // TODO: This should not be necessary. Multiple concurrent @@ -286,4 +296,4 @@ private: } // namespace pv -#endif // DSLOGIC_PV_SIGSESSION_H +#endif // DSVIEW_PV_SIGSESSION_H diff --git a/DSView/pv/storesession.cpp b/DSView/pv/storesession.cpp index 2270ae5d..a687a0b0 100644 --- a/DSView/pv/storesession.cpp +++ b/DSView/pv/storesession.cpp @@ -81,7 +81,7 @@ bool StoreSession::start() } if (data_set.size() > 1) { - _error = tr("DSLogic currently only has support for " + _error = tr("DSView currently only has support for " "storing a single data stream."); return false; } @@ -90,7 +90,7 @@ bool StoreSession::start() //shared_ptr data; if (!(data = dynamic_pointer_cast(*data_set.begin()))) { - _error = tr("DSLogic currently only has support for " + _error = tr("DSView currently only has support for " "storing a logic data."); return false; } diff --git a/DSView/pv/storesession.h b/DSView/pv/storesession.h index c8937603..63f8003e 100644 --- a/DSView/pv/storesession.h +++ b/DSView/pv/storesession.h @@ -18,8 +18,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifndef DSLOGIC_PV_STORESESSION_H -#define DSLOGIC_PV_STORESESSION_H +#ifndef DSVIEW_PV_STORESESSION_H +#define DSVIEW_PV_STORESESSION_H #include @@ -80,4 +80,4 @@ private: } // pv -#endif // DSLOGIC_PV_STORESESSION_H +#endif // DSVIEW_PV_STORESESSION_H diff --git a/DSView/pv/toolbars/filebar.cpp b/DSView/pv/toolbars/filebar.cpp index 80ff5b77..736b57b8 100644 --- a/DSView/pv/toolbars/filebar.cpp +++ b/DSView/pv/toolbars/filebar.cpp @@ -1,6 +1,6 @@ /* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. + * This file is part of the DSView project. + * DSView is based on PulseView. * * Copyright (C) 2012 Joel Holdsworth * Copyright (C) 2013 DreamSourceLab @@ -84,7 +84,7 @@ void FileBar::on_actionOpen_triggered() // Show the dialog const QString file_name = QFileDialog::getOpenFileName( this, tr("Open File"), "", tr( - "DSLogic Sessions (*.dsl)")); + "DSView Sessions (*.dsl)")); if (!file_name.isEmpty()) load_file(file_name); } @@ -124,14 +124,14 @@ void FileBar::on_actionSave_triggered() } else if (_session.get_device()->dev_inst()->mode != LOGIC) { QMessageBox msg(this); msg.setText("File Save"); - msg.setInformativeText("DSLogic currently only support saving logic data to file!"); + msg.setInformativeText("DSView currently only support saving logic data to file!"); msg.setStandardButtons(QMessageBox::Ok); msg.setIcon(QMessageBox::Warning); msg.exec(); }else { const QString file_name = QFileDialog::getSaveFileName( this, tr("Save File"), "", - tr("DSLogic Session (*.dsl)")); + tr("DSView Session (*.dsl)")); if (!file_name.isEmpty()) { _session.save_file(file_name.toStdString()); } diff --git a/DSView/pv/toolbars/filebar.h b/DSView/pv/toolbars/filebar.h index 67567b3e..1ac54feb 100644 --- a/DSView/pv/toolbars/filebar.h +++ b/DSView/pv/toolbars/filebar.h @@ -1,6 +1,6 @@ /* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. + * This file is part of the DSView project. + * DSView is based on PulseView. * * Copyright (C) 2012 Joel Holdsworth * Copyright (C) 2013 DreamSourceLab @@ -21,8 +21,8 @@ */ -#ifndef DSLOGIC_PV_TOOLBARS_FILEBAR_H -#define DSLOGIC_PV_TOOLBARS_FILEBAR_H +#ifndef DSVIEW_PV_TOOLBARS_FILEBAR_H +#define DSVIEW_PV_TOOLBARS_FILEBAR_H #include #include @@ -74,4 +74,4 @@ private: } // namespace toolbars } // namespace pv -#endif // DSLOGIC_PV_TOOLBARS_FILEBAR_H +#endif // DSVIEW_PV_TOOLBARS_FILEBAR_H diff --git a/DSView/pv/toolbars/logobar.cpp b/DSView/pv/toolbars/logobar.cpp index 9954e500..842a74ed 100644 --- a/DSView/pv/toolbars/logobar.cpp +++ b/DSView/pv/toolbars/logobar.cpp @@ -1,6 +1,6 @@ /* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. + * This file is part of the DSView project. + * DSView is based on PulseView. * * Copyright (C) 2012 Joel Holdsworth * Copyright (C) 2013 DreamSourceLab @@ -75,7 +75,7 @@ LogoBar::LogoBar(SigSession &session, QWidget *parent) : addWidget(margin); } -void LogoBar::dslogic_connected(bool conn) +void LogoBar::dsl_connected(bool conn) { if (conn) _logo_button.setIcon(QIcon(":/icons/logo_color.png")); diff --git a/DSView/pv/toolbars/logobar.h b/DSView/pv/toolbars/logobar.h index 06132719..7e8ac9bc 100644 --- a/DSView/pv/toolbars/logobar.h +++ b/DSView/pv/toolbars/logobar.h @@ -1,6 +1,6 @@ /* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. + * This file is part of the DSView project. + * DSView is based on PulseView. * * Copyright (C) 2012 Joel Holdsworth * Copyright (C) 2013 DreamSourceLab @@ -21,8 +21,8 @@ */ -#ifndef DSLOGIC_PV_TOOLBARS_LOGOBAR_H -#define DSLOGIC_PV_TOOLBARS_LOGOBAR_H +#ifndef DSVIEW_PV_TOOLBARS_LOGOBAR_H +#define DSVIEW_PV_TOOLBARS_LOGOBAR_H #include #include @@ -42,7 +42,7 @@ public: void enable_toggle(bool enable); - void dslogic_connected(bool conn); + void dsl_connected(bool conn); private: void session_error( @@ -70,4 +70,4 @@ private: } // namespace toolbars } // namespace pv -#endif // DSLOGIC_PV_TOOLBARS_LOGOBAR_H +#endif // DSVIEW_PV_TOOLBARS_LOGOBAR_H diff --git a/DSView/pv/toolbars/samplingbar.cpp b/DSView/pv/toolbars/samplingbar.cpp index dd29b0d0..b7414547 100644 --- a/DSView/pv/toolbars/samplingbar.cpp +++ b/DSView/pv/toolbars/samplingbar.cpp @@ -1,6 +1,6 @@ /* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. + * This file is part of the DSView project. + * DSView is based on PulseView. * * Copyright (C) 2012 Joel Holdsworth * Copyright (C) 2013 DreamSourceLab @@ -27,18 +27,23 @@ #include -#include +#include #include #include #include +#include #include "samplingbar.h" #include "../devicemanager.h" #include "../device/devinst.h" #include "../dialogs/deviceoptions.h" +#include "../dialogs/waitingdialog.h" +#include "../dialogs/streamoptions.h" +#include "../view/dsosignal.h" +using namespace boost; using boost::shared_ptr; using std::map; using std::max; @@ -72,26 +77,6 @@ const uint64_t SamplingBar::RecordLengths[19] = { const uint64_t SamplingBar::DefaultRecordLength = 1000000; -const uint64_t SamplingBar::DSLogic_RecordLengths[15] = { - 1024, - 2048, - 4096, - 8192, - 16384, - 32768, - 65536, - 131072, - 262144, - 524288, - 1048576, - 2097152, - 4194304, - 8388608, - 16777216, -}; - -const uint64_t SamplingBar::DSLogic_DefaultRecordLength = 16777216; - SamplingBar::SamplingBar(SigSession &session, QWidget *parent) : QToolBar("Sampling Bar", parent), _session(session), @@ -139,6 +124,8 @@ SamplingBar::SamplingBar(SigSession &session, QWidget *parent) : // } _sample_count.setSizeAdjustPolicy(QComboBox::AdjustToContents); set_sampling(false); + connect(&_sample_count, SIGNAL(currentIndexChanged(int)), + this, SLOT(on_samplecount_sel(int))); //_run_stop_button.setToolButtonStyle(Qt::ToolButtonTextBesideIcon); _run_stop_button.setObjectName(tr("run_stop_button")); @@ -218,10 +205,51 @@ void SamplingBar::on_configure() shared_ptr dev_inst = get_selected_device(); assert(dev_inst); - pv::dialogs::DeviceOptions dlg(this, dev_inst->dev_inst()); + pv::dialogs::DeviceOptions dlg(this, dev_inst); ret = dlg.exec(); if (ret == QDialog::Accepted) device_updated(); + + GVariant* gvar = dev_inst->get_config(NULL, NULL, SR_CONF_ZERO); + if (gvar != NULL) { + bool zero = g_variant_get_boolean(gvar); + g_variant_unref(gvar); + if (zero) + zero_adj(); + } + + gvar = dev_inst->get_config(NULL, NULL, SR_CONF_TEST); + if (gvar != NULL) { + bool test = g_variant_get_boolean(gvar); + g_variant_unref(gvar); + if (test) { + update_sample_count_selector_value(); + update_sample_rate_selector_value(); + #ifndef TEST_MODE + _sample_count.setDisabled(true); + _sample_rate.setDisabled(true); + #endif + } else if (dev_inst->dev_inst()->mode != DSO) { + _sample_count.setDisabled(false); + _sample_rate.setDisabled(false); + } + } +} + +void SamplingBar::zero_adj() +{ + boost::shared_ptr dsoSig; + BOOST_FOREACH(const boost::shared_ptr s, _session.get_signals()) + { + if (dsoSig = dynamic_pointer_cast(s)) + dsoSig->set_enable(true); + } + run_stop(); + + pv::dialogs::WaitingDialog wait(this, get_selected_device()); + wait.start(); + + run_stop(); } uint64_t SamplingBar::get_record_length() const @@ -244,6 +272,16 @@ void SamplingBar::set_record_length(uint64_t length) } } +void SamplingBar::update_record_length() +{ + update_sample_count_selector_value(); +} + +void SamplingBar::update_sample_rate() +{ + update_sample_rate_selector_value(); +} + void SamplingBar::set_sampling(bool sampling) { if (_instant) @@ -252,9 +290,31 @@ void SamplingBar::set_sampling(bool sampling) _run_stop_button.setIcon(sampling ? _icon_stop : _icon_start); if (!sampling) { + g_usleep(100000); _run_stop_button.setEnabled(true); _instant_button.setEnabled(true); + } else { +// bool running = false; +// boost::shared_ptr dev_inst = get_selected_device(); +// assert(dev_inst); +// while (!running) { +// GVariant* gvar = dev_inst->get_config(NULL, NULL, SR_CONF_STATUS); +// if (gvar != NULL) { +// running = g_variant_get_boolean(gvar); +// g_variant_unref(gvar); +// } +// g_usleep(10000); +// } + g_usleep(100000); + if (_instant) + _instant_button.setEnabled(true); + else + _run_stop_button.setEnabled(true); } + + _configure_button.setEnabled(!sampling); + _configure_button.setIcon(sampling ? QIcon(":/icons/params_dis.png") : + QIcon(":/icons/params.png")); } void SamplingBar::set_sample_rate(uint64_t sample_rate) @@ -294,6 +354,8 @@ void SamplingBar::update_sample_rate_selector() if (_updating_sample_rate) return; + disconnect(&_sample_rate, SIGNAL(currentIndexChanged(int)), + this, SLOT(on_samplerate_sel(int))); const shared_ptr dev_inst = get_selected_device(); if (!dev_inst) return; @@ -328,8 +390,10 @@ void SamplingBar::update_sample_rate_selector() g_variant_unref(gvar_list); } _updating_sample_rate = false; - g_variant_unref(gvar_dict); + + connect(&_sample_rate, SIGNAL(currentIndexChanged(int)), + this, SLOT(on_samplerate_sel(int))); update_sample_rate_selector_value(); } @@ -343,10 +407,14 @@ void SamplingBar::update_sample_rate_selector_value() assert(!_updating_sample_rate); _updating_sample_rate = true; - for (int i = 0; i < _sample_rate.count(); i++) - if (samplerate == _sample_rate.itemData( - i).value()) + //for (int i = 0; i < _sample_rate.count(); i++) + for (int i = _sample_rate.count() - 1; i >= 0; i--) { + if (samplerate >= _sample_rate.itemData( + i).value()) { _sample_rate.setCurrentIndex(i); + break; + } + } _updating_sample_rate = false; } @@ -373,21 +441,94 @@ void SamplingBar::commit_sample_rate() // Get last samplerate last_sample_rate = get_selected_device()->get_sample_rate(); - // Set the samplerate - get_selected_device()->set_config(NULL, NULL, - SR_CONF_SAMPLERATE, - g_variant_new_uint64(sample_rate)); - - if (last_sample_rate != sample_rate) + if (last_sample_rate != sample_rate) { + // Set the samplerate + get_selected_device()->set_config(NULL, NULL, + SR_CONF_SAMPLERATE, + g_variant_new_uint64(sample_rate)); update_scale(); + } _updating_sample_rate = false; } +void SamplingBar::on_samplecount_sel(int index) +{ + uint64_t sample_count = 0; + uint64_t max_sample_count = 0; + uint64_t last_sample_count = 0; + bool stream_mode = false; + bool buffer2stream = false; + bool stream2buffer = false; + + if (index >= 0) + sample_count = _sample_count.itemData( + index).value(); + + boost::shared_ptr _devInst = get_selected_device(); + assert(_devInst); + + if (strcmp(_devInst->dev_inst()->driver->name, "DSLogic") == 0 && _devInst->dev_inst()->mode != DSO) { + GVariant* gvar = _devInst->get_config(NULL, NULL, SR_CONF_LIMIT_SAMPLES); + if (gvar != NULL) { + last_sample_count = g_variant_get_uint64(gvar); + g_variant_unref(gvar); + } + gvar = _devInst->get_config(NULL, NULL, SR_CONF_MAX_LOGIC_SAMPLELIMITS); + if (gvar != NULL) { + max_sample_count = g_variant_get_uint64(gvar); + g_variant_unref(gvar); + } + gvar = _devInst->get_config(NULL, NULL, SR_CONF_STREAM); + if (gvar != NULL) { + stream_mode = g_variant_get_boolean(gvar); + g_variant_unref(gvar); + } + + if (((!stream_mode || (last_sample_count >= SR_GB(1))) && sample_count > max_sample_count) || + (sample_count >= SR_GB(1) && _devInst->get_sample_rate() <= SR_MHZ(10))) { + stream_mode = sample_count > max_sample_count; + buffer2stream = true; + } else if (stream_mode && sample_count <= max_sample_count) { + stream_mode = sample_count > max_sample_count; + stream2buffer = true; + } + + // Set the sample count + _devInst->set_config(NULL, NULL, + SR_CONF_LIMIT_SAMPLES, + g_variant_new_uint64(sample_count)); + + + + if (buffer2stream) { + pv::dialogs::StreamOptions stream(this, _devInst, sample_count, stream_mode); + stream.setFixedSize(300, 150); + stream.exec(); + update_sample_rate_selector_value(); + update_sample_count_selector_value(); + _devInst->set_config(NULL, NULL, + SR_CONF_STREAM, + g_variant_new_boolean(true)); + } else if (stream2buffer) { + QMessageBox msg(this); + pv::dialogs::StreamOptions stream(this, _devInst, sample_count, stream_mode); + stream.setFixedSize(300, 100); + stream.exec(); + _devInst->set_config(NULL, NULL, + SR_CONF_STREAM, + g_variant_new_boolean(false)); + } + + device_updated(); + update_scale(); + } +} + void SamplingBar::on_samplerate_sel(int index) { uint64_t sample_rate = 0; - uint64_t last_sample_rate = 0; + //uint64_t last_sample_rate = 0; if (index >= 0) sample_rate = _sample_rate.itemData( @@ -397,21 +538,16 @@ void SamplingBar::on_samplerate_sel(int index) assert(_sdi); // Get last samplerate - last_sample_rate = get_selected_device()->get_sample_rate(); + //last_sample_rate = get_selected_device()->get_sample_rate(); if (strcmp(_sdi->driver->name, "DSLogic") == 0 && _sdi->mode != DSO) { - if ((last_sample_rate == SR_MHZ(200)&& sample_rate != SR_MHZ(200)) || - (last_sample_rate != SR_MHZ(200) && sample_rate == SR_MHZ(200)) || - (last_sample_rate == SR_MHZ(400)&& sample_rate != SR_MHZ(400)) || - (last_sample_rate != SR_MHZ(400) && sample_rate == SR_MHZ(400))) { - // Set the samplerate get_selected_device()->set_config(NULL, NULL, SR_CONF_SAMPLERATE, g_variant_new_uint64(sample_rate)); + update_sample_count_selector_value(); device_updated(); update_scale(); - } } } @@ -424,6 +560,9 @@ void SamplingBar::update_sample_count_selector() if (_updating_sample_count) return; + disconnect(&_sample_count, SIGNAL(currentIndexChanged(int)), + this, SLOT(on_samplecount_sel(int))); + const shared_ptr dev_inst = get_selected_device(); if (!dev_inst) return; @@ -459,8 +598,10 @@ void SamplingBar::update_sample_count_selector() } _updating_sample_count = false; - g_variant_unref(gvar_dict); + + connect(&_sample_count, SIGNAL(currentIndexChanged(int)), + this, SLOT(on_samplecount_sel(int))); update_sample_count_selector_value(); } @@ -505,30 +646,73 @@ void SamplingBar::commit_sample_count() // Get last samplecount last_sample_count = get_selected_device()->get_sample_limit(); - // Set the samplecount - get_selected_device()->set_config(NULL, NULL, - SR_CONF_LIMIT_SAMPLES, - g_variant_new_uint64(sample_count)); + if (last_sample_count != sample_count) { + // Set the samplecount + get_selected_device()->set_config(NULL, NULL, + SR_CONF_LIMIT_SAMPLES, + g_variant_new_uint64(sample_count)); + update_scale(); + } _updating_sample_count = false; - - if (sample_count != last_sample_count) - update_scale(); } void SamplingBar::on_run_stop() { + enable_run_stop(false); + enable_instant(false); commit_sample_rate(); commit_sample_count(); _instant = false; - run_stop(); + const shared_ptr dev_inst = get_selected_device(); + if (!dev_inst) + return; + GVariant* gvar = dev_inst->get_config(NULL, NULL, SR_CONF_ZERO); + if (gvar != NULL) { + bool zero = g_variant_get_boolean(gvar); + g_variant_unref(gvar); + if (zero) { + QMessageBox msg(this); + msg.setText("Zero Adjustment"); + msg.setInformativeText("Please adjust zero skew and save the result!"); + msg.setStandardButtons(QMessageBox::Ok); + msg.setIcon(QMessageBox::Warning); + msg.exec(); + zero_adj(); + return; + } + } + run_stop(); } void SamplingBar::on_instant_stop() { + enable_run_stop(false); + enable_instant(false); commit_sample_rate(); commit_sample_count(); _instant = true; + const shared_ptr dev_inst = get_selected_device(); + if (!dev_inst) + return; + GVariant* gvar = dev_inst->get_config(NULL, NULL, SR_CONF_ZERO); + if (gvar != NULL) { + bool zero = g_variant_get_boolean(gvar); + g_variant_unref(gvar); + if (zero) { + QMessageBox msg(this); + msg.setText("Zero Adjustment"); + if(strcmp(dev_inst->dev_inst()->driver->name, "DSLogic") == 0) + msg.setInformativeText("Please adjust zero skew and save the result!\nPlease left both of channels unconnect for zero adjustment!"); + else + msg.setInformativeText("Please adjust zero skew and save the result!"); + msg.setStandardButtons(QMessageBox::Ok); + msg.setIcon(QMessageBox::Warning); + msg.exec(); + zero_adj(); + return; + } + } instant_stop(); } @@ -541,15 +725,29 @@ void SamplingBar::on_device_selected() if (!dev_inst) return; - _session.set_device(dev_inst); - + try { + _session.set_device(dev_inst); + } catch(QString e) { + show_session_error(tr("Failed to Select ") + dev_inst->dev_inst()->model, e); + } device_selected(); } void SamplingBar::enable_toggle(bool enable) { - _sample_count.setDisabled(!enable); - _sample_rate.setDisabled(!enable); + bool test = false; + const shared_ptr dev_inst = get_selected_device(); + if (dev_inst && dev_inst->owner()) { + GVariant *gvar = dev_inst->get_config(NULL, NULL, SR_CONF_TEST); + if (gvar != NULL) { + test = g_variant_get_boolean(gvar); + g_variant_unref(gvar); + } + } + if (!test) { + _sample_count.setDisabled(!enable); + _sample_rate.setDisabled(!enable); + } } void SamplingBar::enable_run_stop(bool enable) @@ -562,5 +760,16 @@ void SamplingBar::enable_instant(bool enable) _instant_button.setDisabled(!enable); } +void SamplingBar::show_session_error( + const QString text, const QString info_text) +{ + QMessageBox msg(this); + msg.setText(text); + msg.setInformativeText(info_text); + msg.setStandardButtons(QMessageBox::Ok); + msg.setIcon(QMessageBox::Warning); + msg.exec(); +} + } // namespace toolbars } // namespace pv diff --git a/DSView/pv/toolbars/samplingbar.h b/DSView/pv/toolbars/samplingbar.h index 8718d2db..52d9f748 100644 --- a/DSView/pv/toolbars/samplingbar.h +++ b/DSView/pv/toolbars/samplingbar.h @@ -1,6 +1,6 @@ /* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. + * This file is part of the DSView project. + * DSView is based on PulseView. * * Copyright (C) 2012 Joel Holdsworth * Copyright (C) 2013 DreamSourceLab @@ -21,8 +21,8 @@ */ -#ifndef DSLOGIC_PV_TOOLBARS_SAMPLINGBAR_H -#define DSLOGIC_PV_TOOLBARS_SAMPLINGBAR_H +#ifndef DSVIEW_PV_TOOLBARS_SAMPLINGBAR_H +#define DSVIEW_PV_TOOLBARS_SAMPLINGBAR_H #include @@ -35,7 +35,7 @@ #include #include -#include +#include #include "../sigsession.h" @@ -63,8 +63,6 @@ class SamplingBar : public QToolBar private: static const uint64_t RecordLengths[19]; static const uint64_t DefaultRecordLength; - static const uint64_t DSLogic_RecordLengths[15]; - static const uint64_t DSLogic_DefaultRecordLength; public: SamplingBar(SigSession &session, QWidget *parent); @@ -76,6 +74,9 @@ public: uint64_t get_record_length() const; void set_record_length(uint64_t length); + void update_record_length(); + + void update_sample_rate(); void set_sampling(bool sampling); @@ -103,15 +104,21 @@ private: void update_sample_count_selector_value(); void commit_sample_rate(); void commit_sample_count(); + void setting_adj(); private slots: void on_run_stop(); void on_instant_stop(); void on_device_selected(); void on_samplerate_sel(int index); + void on_samplecount_sel(int index); + + void show_session_error( + const QString text, const QString info_text); public slots: void on_configure(); + void zero_adj(); private: SigSession &_session; @@ -142,4 +149,4 @@ private: } // namespace toolbars } // namespace pv -#endif // DSLOGIC_PV_TOOLBARS_SAMPLINGBAR_H +#endif // DSVIEW_PV_TOOLBARS_SAMPLINGBAR_H diff --git a/DSView/pv/toolbars/trigbar.cpp b/DSView/pv/toolbars/trigbar.cpp index b0078e8f..9be5bf5e 100644 --- a/DSView/pv/toolbars/trigbar.cpp +++ b/DSView/pv/toolbars/trigbar.cpp @@ -1,6 +1,6 @@ /* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. + * This file is part of the DSView project. + * DSView is based on PulseView. * * Copyright (C) 2012 Joel Holdsworth * Copyright (C) 2013 DreamSourceLab @@ -103,6 +103,13 @@ void TrigBar::enable_toggle(bool enable) QIcon::fromTheme("trig", QIcon(":/icons/search-bar_dis.png"))); } +void TrigBar::enable_protocol(bool enable) +{ + _protocol_button.setDisabled(!enable); + _protocol_button.setIcon(enable ? QIcon::fromTheme("trig", QIcon(":/icons/protocol.png")) : + QIcon::fromTheme("trig", QIcon(":/icons/protocol_dis.png"))); +} + void TrigBar::close_all() { if (_trig_button.isChecked()) { diff --git a/DSView/pv/toolbars/trigbar.h b/DSView/pv/toolbars/trigbar.h index ae3cac81..81e72ef2 100644 --- a/DSView/pv/toolbars/trigbar.h +++ b/DSView/pv/toolbars/trigbar.h @@ -1,6 +1,6 @@ /* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. + * This file is part of the DSView project. + * DSView is based on PulseView. * * Copyright (C) 2012 Joel Holdsworth * Copyright (C) 2013 DreamSourceLab @@ -21,8 +21,8 @@ */ -#ifndef DSLOGIC_PV_TOOLBARS_TRIGBAR_H -#define DSLOGIC_PV_TOOLBARS_TRIGBAR_H +#ifndef DSVIEW_PV_TOOLBARS_TRIGBAR_H +#define DSVIEW_PV_TOOLBARS_TRIGBAR_H #include #include @@ -37,7 +37,7 @@ public: explicit TrigBar(QWidget *parent = 0); void enable_toggle(bool enable); - + void enable_protocol(bool enable); void close_all(); signals: @@ -64,4 +64,4 @@ private: } // namespace toolbars } // namespace pv -#endif // DSLOGIC_PV_TOOLBARS_TRIGBAR_H +#endif // DSVIEW_PV_TOOLBARS_TRIGBAR_H diff --git a/DSView/pv/view/analogsignal.cpp b/DSView/pv/view/analogsignal.cpp index ec251ac3..ea44c0c9 100644 --- a/DSView/pv/view/analogsignal.cpp +++ b/DSView/pv/view/analogsignal.cpp @@ -1,6 +1,6 @@ /* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. + * This file is part of the DSView project. + * DSView is based on PulseView. * * Copyright (C) 2012 Joel Holdsworth * Copyright (C) 2013 DreamSourceLab diff --git a/DSView/pv/view/analogsignal.h b/DSView/pv/view/analogsignal.h index 33d0bed9..b241e848 100644 --- a/DSView/pv/view/analogsignal.h +++ b/DSView/pv/view/analogsignal.h @@ -1,6 +1,6 @@ /* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. + * This file is part of the DSView project. + * DSView is based on PulseView. * * Copyright (C) 2012 Joel Holdsworth * Copyright (C) 2013 DreamSourceLab @@ -21,8 +21,8 @@ */ -#ifndef DSLOGIC_PV_ANALOGSIGNAL_H -#define DSLOGIC_PV_ANALOGSIGNAL_H +#ifndef DSVIEW_PV_ANALOGSIGNAL_H +#define DSVIEW_PV_ANALOGSIGNAL_H #include "signal.h" @@ -86,4 +86,4 @@ private: } // namespace view } // namespace pv -#endif // DSLOGIC_PV_ANALOGSIGNAL_H +#endif // DSVIEW_PV_ANALOGSIGNAL_H diff --git a/DSView/pv/view/cursor.cpp b/DSView/pv/view/cursor.cpp index 8c9712c2..0945a6e8 100644 --- a/DSView/pv/view/cursor.cpp +++ b/DSView/pv/view/cursor.cpp @@ -1,6 +1,6 @@ /* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. + * This file is part of the DSView project. + * DSView is based on PulseView. * * Copyright (C) 2012 Joel Holdsworth * Copyright (C) 2013 DreamSourceLab diff --git a/DSView/pv/view/cursor.h b/DSView/pv/view/cursor.h index 87364c94..d06c4186 100644 --- a/DSView/pv/view/cursor.h +++ b/DSView/pv/view/cursor.h @@ -1,6 +1,6 @@ /* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. + * This file is part of the DSView project. + * DSView is based on PulseView. * * Copyright (C) 2012 Joel Holdsworth * Copyright (C) 2013 DreamSourceLab @@ -21,8 +21,8 @@ */ -#ifndef DSLOGIC_PV_VIEW_CURSOR_H -#define DSLOGIC_PV_VIEW_CURSOR_H +#ifndef DSVIEW_PV_VIEW_CURSOR_H +#define DSVIEW_PV_VIEW_CURSOR_H #include "timemarker.h" @@ -91,4 +91,4 @@ private: } // namespace view } // namespace pv -#endif // DSLOGIC_PV_VIEW_CURSOR_H +#endif // DSVIEW_PV_VIEW_CURSOR_H diff --git a/DSView/pv/view/decodetrace.cpp b/DSView/pv/view/decodetrace.cpp index 0be37778..6a4b080c 100644 --- a/DSView/pv/view/decodetrace.cpp +++ b/DSView/pv/view/decodetrace.cpp @@ -316,7 +316,6 @@ bool DecodeTrace::create_popup() BOOST_FOREACH(shared_ptr dec, _decoder_stack->stack()) { - dec->commit_show(); if (dec->commit()) { _decoder_stack->options_changed(true); ret = true; diff --git a/DSView/pv/view/decodetrace.h b/DSView/pv/view/decodetrace.h index fe0f5f72..fa1c3db3 100644 --- a/DSView/pv/view/decodetrace.h +++ b/DSView/pv/view/decodetrace.h @@ -18,8 +18,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifndef DSLOGIC_PV_VIEW_DECODETRACE_H -#define DSLOGIC_PV_VIEW_DECODETRACE_H +#ifndef DSVIEW_PV_VIEW_DECODETRACE_H +#define DSVIEW_PV_VIEW_DECODETRACE_H #include "trace.h" @@ -201,4 +201,4 @@ private: } // namespace view } // namespace pv -#endif // DSLOGIC_PV_VIEW_DECODETRACE_H +#endif // DSVIEW_PV_VIEW_DECODETRACE_H diff --git a/DSView/pv/view/devmode.cpp b/DSView/pv/view/devmode.cpp index fb97a0c2..b4efbb55 100644 --- a/DSView/pv/view/devmode.cpp +++ b/DSView/pv/view/devmode.cpp @@ -1,6 +1,6 @@ /* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. + * This file is part of the DSView project. + * DSView is based on PulseView. * * Copyright (C) 2014 DreamSourceLab * @@ -127,39 +127,6 @@ void DevMode::on_mode_change() g_variant_new_int16((*i).second->mode)); mode_changed(); - - if (dev_inst->dev_inst()->mode == DSO && - strcmp(dev_inst->dev_inst()->driver->name, "DSLogic") == 0) { - bool zero_adjusted = false; - GVariant *gvar = dev_inst->get_config(NULL, NULL, SR_CONF_ZERO); - if (gvar != NULL) { - zero_adjusted = g_variant_get_boolean(gvar); - g_variant_unref(gvar); - } else { - qDebug() << "ERROR: config_get SR_CONF_ZERO failed."; - } - - if (!zero_adjusted) { - QMessageBox msg(this); - msg.setText("Zero Adjustment"); - msg.setInformativeText("Please left both of channels unconnect for zero adjustment!"); - msg.setStandardButtons(QMessageBox::Ok); - msg.setIcon(QMessageBox::Warning); - msg.exec(); - - int ret = dev_inst->set_config(NULL, NULL, - SR_CONF_ZERO, - g_variant_new_boolean(TRUE)); - if (!ret) { - QMessageBox msg(this); - msg.setText("Zero Adjustment Issue"); - msg.setInformativeText("Can't send out the command of zero adjustment!"); - msg.setStandardButtons(QMessageBox::Ok); - msg.setIcon(QMessageBox::Warning); - msg.exec(); - } - } - } } } } diff --git a/DSView/pv/view/devmode.h b/DSView/pv/view/devmode.h index 7e15a507..27488805 100644 --- a/DSView/pv/view/devmode.h +++ b/DSView/pv/view/devmode.h @@ -1,6 +1,6 @@ /* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. + * This file is part of the DSView project. + * DSView is based on PulseView. * * Copyright (C) 2014 DreamSourceLab * @@ -20,8 +20,8 @@ */ -#ifndef DSLOGIC_PV_VIEW_DEVMODE_H -#define DSLOGIC_PV_VIEW_DEVMODE_H +#ifndef DSVIEW_PV_VIEW_DEVMODE_H +#define DSVIEW_PV_VIEW_DEVMODE_H #include #include @@ -36,7 +36,7 @@ #include #include -#include +#include namespace pv { @@ -87,4 +87,4 @@ private: } // namespace view } // namespace pv -#endif // DSLOGIC_PV_VIEW_DEVMODE_H +#endif // DSVIEW_PV_VIEW_DEVMODE_H diff --git a/DSView/pv/view/dsldial.h b/DSView/pv/view/dsldial.h index bf5872c4..a0034cf8 100644 --- a/DSView/pv/view/dsldial.h +++ b/DSView/pv/view/dsldial.h @@ -1,5 +1,5 @@ -#ifndef DSLOGIC_PV_VIEW_DSLDIAL_H -#define DSLOGIC_PV_VIEW_DSLDIAL_H +#ifndef DSVIEW_PV_VIEW_DSLDIAL_H +#define DSVIEW_PV_VIEW_DSLDIAL_H #include #include @@ -45,4 +45,4 @@ private: } // namespace view } // namespace pv -#endif // DSLOGIC_PV_VIEW_DSLDIAL_H +#endif // DSVIEW_PV_VIEW_DSLDIAL_H diff --git a/DSView/pv/view/dsosignal.cpp b/DSView/pv/view/dsosignal.cpp index 42e3ae1b..b08c409f 100644 --- a/DSView/pv/view/dsosignal.cpp +++ b/DSView/pv/view/dsosignal.cpp @@ -1,6 +1,6 @@ /* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. + * This file is part of the DSView project. + * DSView is based on PulseView. * * Copyright (C) 2013 DreamSourceLab * @@ -31,6 +31,8 @@ #include "../sigsession.h" #include "../device/devinst.h" +#include + #include using namespace boost; @@ -40,7 +42,6 @@ namespace pv { namespace view { const uint64_t DsoSignal::vDialValue[DsoSignal::vDialValueCount] = { - 5, 10, 20, 50, @@ -49,7 +50,6 @@ const uint64_t DsoSignal::vDialValue[DsoSignal::vDialValueCount] = { 500, 1000, 2000, - 5000, }; const QString DsoSignal::vDialUnit[DsoSignal::vDialUnitCount] = { "mv", @@ -79,6 +79,12 @@ const uint64_t DsoSignal::hDialValue[DsoSignal::hDialValueCount] = { 20000000, 50000000, 100000000, + 200000000, + 500000000, + 1000000000, + 2000000000, + 5000000000, + 10000000000, }; const QString DsoSignal::hDialUnit[DsoSignal::hDialUnitCount] = { @@ -110,8 +116,12 @@ DsoSignal::DsoSignal(boost::shared_ptr dev_inst, _scale(0), _vDialActive(false), _hDialActive(false), - _trig_vpos(probe->index * 0.5 + 0.25), - _zeroPos(probe->index * 0.5 + 0.25) + //_trig_vpos(probe->index * 0.5 + 0.25), + //_zeroPos(probe->index * 0.5 + 0.25) + _trig_vpos(0.5), + _zeroPos(0.5), + _autoV(false), + _autoH(false) { QVector vValue; QVector vUnit; @@ -152,7 +162,7 @@ DsoSignal::DsoSignal(boost::shared_ptr dev_inst, gvar = dev_inst->get_config(probe, NULL, SR_CONF_COUPLING); if (gvar != NULL) { - _acCoupling = g_variant_get_boolean(gvar); + _acCoupling = g_variant_get_byte(gvar); g_variant_unref(gvar); } else { qDebug() << "ERROR: config_get SR_CONF_COUPLING failed."; @@ -168,6 +178,12 @@ shared_ptr DsoSignal::data() const return _data; } +void DsoSignal::set_view(pv::view::View *view) +{ + Trace::set_view(view); + update_zeroPos(); +} + void DsoSignal::set_scale(float scale) { _scale = scale; @@ -175,8 +191,41 @@ void DsoSignal::set_scale(float scale) void DsoSignal::set_enable(bool enable) { + if ((strcmp(_dev_inst->dev_inst()->driver->name, "DSLogic") == 0) && + get_index() == 0) + return; + _view->session().refresh(); + set_vDialActive(false); _dev_inst->set_config(_probe, NULL, SR_CONF_EN_CH, g_variant_new_boolean(enable)); + int ch_num = _view->session().get_ch_num(SR_CHANNEL_DSO); + + GVariant* gvar; + uint64_t max_sample_rate; + uint64_t max_sample_limit; + gvar = _dev_inst->get_config(NULL, NULL, SR_CONF_MAX_DSO_SAMPLERATE); + if (gvar != NULL) { + max_sample_rate = g_variant_get_uint64(gvar); + g_variant_unref(gvar); + } else { + qDebug() << "ERROR: config_get SR_CONF_MAX_DSO_SAMPLERATE failed."; + return; + } + gvar = _dev_inst->get_config(NULL, NULL, SR_CONF_MAX_DSO_SAMPLELIMITS); + if (gvar != NULL) { + max_sample_limit = g_variant_get_uint64(gvar); + g_variant_unref(gvar); + } else { + qDebug() << "ERROR: config_get SR_CONF_MAX_DSO_SAMPLELIMITS failed."; + return; + } + + uint64_t sample_limit = (uint64_t)(max_sample_limit / (ch_num ? ch_num : 1)); + uint64_t sample_rate = min((uint64_t)(sample_limit * std::pow(10.0, 9.0) / (_hDial->get_value() * DS_CONF_DSO_HDIVS)), + (uint64_t)(max_sample_rate / (ch_num ? ch_num : 1))); + + _view->set_sample_rate(sample_rate, true); + _view->set_sample_limit(sample_limit, true); _view->set_need_update(true); _view->update(); } @@ -198,8 +247,10 @@ bool DsoSignal::go_vDialPre() _vDial->set_sel(_vDial->get_sel() - 1); _dev_inst->set_config(_probe, NULL, SR_CONF_VDIV, g_variant_new_uint64(_vDial->get_value())); + update_zeroPos(); return true; } else { + _autoV = false; return false; } } @@ -210,8 +261,10 @@ bool DsoSignal::go_vDialNext() _vDial->set_sel(_vDial->get_sel() + 1); _dev_inst->set_config(_probe, NULL, SR_CONF_VDIV, g_variant_new_uint64(_vDial->get_value())); + update_zeroPos(); return true; } else { + _autoV = false; return false; } } @@ -223,44 +276,130 @@ bool DsoSignal::get_hDialActive() const void DsoSignal::set_hDialActive(bool active) { - if (enabled()) - _hDialActive = active; + _hDialActive = active; } -bool DsoSignal::go_hDialPre() +bool DsoSignal::go_hDialPre(bool setted) { if (!_hDial->isMin()) { - _hDial->set_sel(_hDial->get_sel() - 1); - int ch_num = _view->session().get_dso_ch_num(); - uint64_t sample_limit = _view->session().get_device()->get_sample_limit(); - uint64_t sample_rate = min((uint64_t)(sample_limit * pow(10, 9) / (_hDial->get_value() * DS_CONF_DSO_HDIVS)), - (uint64_t)(DS_MAX_DSO_SAMPLERATE / ch_num)); - _view->session().set_sample_rate(sample_rate); - const double scale = _hDial->get_value() * pow(10, -9) * DS_CONF_DSO_HDIVS / get_view_rect().width(); - _view->set_scale_offset(scale, _view->offset()); - _dev_inst->set_config(_probe, NULL, SR_CONF_TIMEBASE, - g_variant_new_uint64(_hDial->get_value())); + uint64_t sample_rate = _view->session().get_device()->get_sample_rate(); + const uint64_t min_div = std::pow(10.0, 9.0) / sample_rate; + if (_view->session().get_capture_state() != SigSession::Running && + !_data->get_snapshots().empty()) { + if (_hDial->get_value() > min_div) + _hDial->set_sel(_hDial->get_sel() - 1); + } else if ((_view->session().get_capture_state() == SigSession::Running || + _data->get_snapshots().empty()) && + !_view->session().get_instant()) { + _view->session().refresh(); + _hDial->set_sel(_hDial->get_sel() - 1); + + if (!setted) { + int ch_num = _view->session().get_ch_num(SR_CHANNEL_DSO); + uint64_t sample_limit = _view->session().get_device()->get_sample_limit(); + GVariant* gvar; + uint64_t max_sample_rate; + gvar = _dev_inst->get_config(NULL, NULL, SR_CONF_MAX_DSO_SAMPLERATE); + if (gvar != NULL) { + max_sample_rate = g_variant_get_uint64(gvar); + g_variant_unref(gvar); + } else { + qDebug() << "ERROR: config_get SR_CONF_MAX_DSO_SAMPLERATE failed."; + return false; + } + + sample_rate = min((uint64_t)(sample_limit * std::pow(10.0, 9.0) / (_hDial->get_value() * DS_CONF_DSO_HDIVS)), + (uint64_t)(max_sample_rate / (ch_num ? ch_num : 1))); + _view->set_sample_rate(sample_rate, true); + } + } else { + return true; + } + if (!setted) { + const double scale = _hDial->get_value() * std::pow(10.0, -9.0) * DS_CONF_DSO_HDIVS / get_view_rect().width(); + _view->set_scale_offset(scale, _view->offset()); + _dev_inst->set_config(_probe, NULL, SR_CONF_TIMEBASE, + g_variant_new_uint64(_hDial->get_value())); + } return true; } else { + _autoH = false; return false; } } -bool DsoSignal::go_hDialNext() +bool DsoSignal::go_hDialCur() +{ + _view->session().refresh(); + + int ch_num = _view->session().get_ch_num(SR_CHANNEL_DSO); + uint64_t sample_limit = _view->session().get_device()->get_sample_limit(); + GVariant* gvar; + uint64_t max_sample_rate; + gvar = _dev_inst->get_config(NULL, NULL, SR_CONF_MAX_DSO_SAMPLERATE); + if (gvar != NULL) { + max_sample_rate = g_variant_get_uint64(gvar); + g_variant_unref(gvar); + } else { + qDebug() << "ERROR: config_get SR_CONF_MAX_DSO_SAMPLERATE failed."; + return false; + } + + uint64_t sample_rate = min((uint64_t)(sample_limit * std::pow(10.0, 9.0) / (_hDial->get_value() * DS_CONF_DSO_HDIVS)), + (uint64_t)(max_sample_rate / (ch_num ? ch_num : 1))); +// _dev_inst->set_config(NULL, NULL, SR_CONF_SAMPLERATE, +// g_variant_new_uint64(sample_rate)); + _view->set_sample_limit(sample_limit, true); + _view->set_sample_rate(sample_rate, true); + _dev_inst->set_config(_probe, NULL, SR_CONF_TIMEBASE, + g_variant_new_uint64(_hDial->get_value())); + return true; +} + +bool DsoSignal::go_hDialNext(bool setted) { if (!_hDial->isMax()) { - _hDial->set_sel(_hDial->get_sel() + 1); - int ch_num = _view->session().get_dso_ch_num(); - uint64_t sample_limit = _view->session().get_device()->get_sample_limit(); - uint64_t sample_rate = min((uint64_t)(sample_limit * pow(10, 9) / (_hDial->get_value() * DS_CONF_DSO_HDIVS)), - (uint64_t)(DS_MAX_DSO_SAMPLERATE / ch_num)); - _view->session().set_sample_rate(sample_rate); - const double scale = _hDial->get_value() * pow(10, -9) * DS_CONF_DSO_HDIVS / get_view_rect().width(); - _view->set_scale_offset(scale, _view->offset()); - _dev_inst->set_config(_probe, NULL, SR_CONF_TIMEBASE, - g_variant_new_uint64(_hDial->get_value())); + if (_view->session().get_capture_state() != SigSession::Running && + !_data->get_snapshots().empty()) { + _hDial->set_sel(_hDial->get_sel() + 1); + } else if ((_view->session().get_capture_state() == SigSession::Running || + _data->get_snapshots().empty()) && + !_view->session().get_instant()) { + _view->session().refresh(); + _hDial->set_sel(_hDial->get_sel() + 1); + + if (!setted) { + int ch_num = _view->session().get_ch_num(SR_CHANNEL_DSO); + + uint64_t sample_limit = _view->session().get_device()->get_sample_limit(); + + GVariant* gvar; + uint64_t max_sample_rate; + gvar = _dev_inst->get_config(NULL, NULL, SR_CONF_MAX_DSO_SAMPLERATE); + if (gvar != NULL) { + max_sample_rate = g_variant_get_uint64(gvar); + g_variant_unref(gvar); + } else { + qDebug() << "ERROR: config_get SR_CONF_MAX_DSO_SAMPLERATE failed."; + return false; + } + + uint64_t sample_rate = min((uint64_t)(sample_limit * std::pow(10.0, 9.0) / (_hDial->get_value() * DS_CONF_DSO_HDIVS)), + (uint64_t)(max_sample_rate / (ch_num ? ch_num : 1))); + _view->set_sample_rate(sample_rate, true); + } + } else { + return true; + } + if (!setted) { + const double scale = _hDial->get_value() * std::pow(10.0, -9.0) * DS_CONF_DSO_HDIVS / get_view_rect().width(); + _view->set_scale_offset(scale, _view->offset()); + _dev_inst->set_config(_probe, NULL, SR_CONF_TIMEBASE, + g_variant_new_uint64(_hDial->get_value())); + } return true; } else { + _autoH = false; return false; } } @@ -285,17 +424,17 @@ uint16_t DsoSignal::get_hDialSel() const return _hDial->get_sel(); } -bool DsoSignal::get_acCoupling() const +uint8_t DsoSignal::get_acCoupling() const { return _acCoupling; } -void DsoSignal::set_acCoupling(bool coupling) +void DsoSignal::set_acCoupling(uint8_t coupling) { if (enabled()) { _acCoupling = coupling; _dev_inst->set_config(_probe, NULL, SR_CONF_COUPLING, - g_variant_new_boolean(_acCoupling)); + g_variant_new_byte(_acCoupling)); } } @@ -307,14 +446,20 @@ int DsoSignal::get_trig_vpos() const void DsoSignal::set_trig_vpos(int pos) { assert(_view); + int trig_value; if (enabled()) { - double delta = min((double)max(pos - UpMargin, 0), get_view_rect().height()) * 1.0f / get_view_rect().height() - _zeroPos; - delta = min(delta, 0.5); - delta = max(delta, -0.5); - _trig_vpos = _zeroPos + delta; - - int trig_value = (-delta * 255.0f + 0x80); - + double delta = min((double)max(pos - UpMargin, 0), get_view_rect().height()) * 1.0f / get_view_rect().height(); + bool isDSCope = (strcmp(_dev_inst->dev_inst()->driver->name, "DSCope") == 0); + if (isDSCope) { + _trig_vpos = delta; + trig_value = delta * 255; + } else { + delta = delta - _zeroPos; + delta = min(delta, 0.5); + delta = max(delta, -0.5); + _trig_vpos = _zeroPos + delta; + trig_value = (delta * 255.0f + 0x80); + } _dev_inst->set_config(_probe, NULL, SR_CONF_TRIGGER_VALUE, g_variant_new_uint16(trig_value)); } @@ -329,8 +474,21 @@ void DsoSignal::set_zeroPos(int pos) { if (enabled()) { double delta = _trig_vpos - _zeroPos; + set_trig_vpos(get_trig_vpos() + pos - get_zeroPos()); _zeroPos = min((double)max(pos - UpMargin, 0), get_view_rect().height()) * 1.0f / get_view_rect().height(); _trig_vpos = min(max(_zeroPos + delta, 0.0), 1.0); + + update_zeroPos(); + } +} + +void DsoSignal::update_zeroPos() +{ + if (strcmp(_dev_inst->dev_inst()->driver->name, "DSCope") == 0) { + //double vpos_off = (0.5 - _zeroPos) * _vDial->get_value() * DS_CONF_DSO_VDIVS; + double vpos_off = (0.5 - (get_zeroPos() - UpMargin) * 1.0f/get_view_rect().height()) * _vDial->get_value() * DS_CONF_DSO_VDIVS; + _dev_inst->set_config(_probe, NULL, SR_CONF_VPOS, + g_variant_new_double(vpos_off)); } } @@ -348,7 +506,7 @@ void DsoSignal::paint_back(QPainter &p, int left, int right) int i, j; const int height = _view->viewport()->height() - UpMargin - DownMargin; - const int width = right - left - RightMargin; + const int width = right - left; p.setPen(Qt::NoPen); p.setBrush(Trace::dsBack); @@ -380,25 +538,25 @@ void DsoSignal::paint_back(QPainter &p, int left, int right) QPen pen(Signal::dsFore); pen.setStyle(Qt::DotLine); p.setPen(pen); - const double spanY =height * 1.0f / 10; + const double spanY =height * 1.0f / DS_CONF_DSO_VDIVS; for (i = 1; i <= DS_CONF_DSO_VDIVS; i++) { const double posY = spanY * i + UpMargin; - p.drawLine(left, posY, right - RightMargin, posY); + p.drawLine(left, posY, right, posY); const double miniSpanY = spanY / 5; for (j = 1; j < 5; j++) { - p.drawLine(width / 2.0f - 10, posY - miniSpanY * j, - width / 2.0f + 10, posY - miniSpanY * j); + p.drawLine(width / 2.0f - 5, posY - miniSpanY * j, + width / 2.0f + 5, posY - miniSpanY * j); } } - const double spanX = width * 1.0f / 10; + const double spanX = width * 1.0f / DS_CONF_DSO_HDIVS; for (i = 1; i <= DS_CONF_DSO_HDIVS; i++) { const double posX = spanX * i; p.drawLine(posX, UpMargin, posX, height + UpMargin); const double miniSpanX = spanX / 5; for (j = 1; j < 5; j++) { - p.drawLine(posX - miniSpanX * j, height / 2.0f + UpMargin - 10, - posX - miniSpanX * j, height / 2.0f + UpMargin + 10); + p.drawLine(posX - miniSpanX * j, height / 2.0f + UpMargin - 5, + posX - miniSpanX * j, height / 2.0f + UpMargin + 5); } } } @@ -411,7 +569,7 @@ void DsoSignal::paint_mid(QPainter &p, int left, int right) if (enabled()) { const int height = _view->viewport()->height() - UpMargin - DownMargin; - const int width = right - left - RightMargin; + const int width = right - left; const int y = get_zeroPos() + height * 0.5; const double scale = _view->scale(); @@ -428,7 +586,8 @@ void DsoSignal::paint_mid(QPainter &p, int left, int right) snapshots.front(); const uint16_t number_channels = snapshot->get_channel_num(); - if ((unsigned int)get_index() >= number_channels) + if ((strcmp(_dev_inst->dev_inst()->driver->name, "DSLogic") == 0) && + (unsigned int)get_index() >= number_channels) return; const double pixels_offset = offset / scale; @@ -445,14 +604,19 @@ void DsoSignal::paint_mid(QPainter &p, int left, int right) const int64_t end_sample = min(max((int64_t)ceil(end) + 1, (int64_t)0), last_sample); - if (samples_per_pixel < EnvelopeThreshold) + if (samples_per_pixel < EnvelopeThreshold) { + snapshot->enable_envelope(false); paint_trace(p, snapshot, y, left, start_sample, end_sample, pixels_offset, samples_per_pixel, number_channels); - else + } else { + snapshot->enable_envelope(true); paint_envelope(p, snapshot, y, left, start_sample, end_sample, - pixels_offset, samples_per_pixel); + pixels_offset, samples_per_pixel, number_channels); + } + + paint_measure(p); } } @@ -463,7 +627,7 @@ void DsoSignal::paint_fore(QPainter &p, int left, int right) QPen pen(Signal::dsGray); pen.setStyle(Qt::DotLine); p.setPen(pen); - p.drawLine(left, get_zeroPos(), right - RightMargin, get_zeroPos()); + p.drawLine(left, get_zeroPos(), right, get_zeroPos()); if(enabled()) { const QPointF mouse_point = _view->hover_point(); @@ -472,7 +636,7 @@ void DsoSignal::paint_fore(QPainter &p, int left, int right) // Paint the trig line const QPointF points[] = { - QPointF(right - label_rect.width()*1.5, get_trig_vpos()), + QPointF(right, get_trig_vpos()), label_rect.topLeft(), label_rect.topRight(), label_rect.bottomRight(), @@ -484,7 +648,7 @@ void DsoSignal::paint_fore(QPainter &p, int left, int right) p.drawPolygon(points, countof(points)); // paint the _trig_vpos line - p.setPen(QPen(_colour, 1, Qt::DashLine)); + p.setPen(QPen(_colour, 1, Qt::DotLine)); p.drawLine(left, get_trig_vpos(), right - label_rect.width()*1.5, get_trig_vpos()); // Paint the text @@ -497,7 +661,7 @@ QRectF DsoSignal::get_trig_rect(int left, int right) const { (void)left; - return QRectF(right - SquareWidth, + return QRectF(right + SquareWidth / 2, get_trig_vpos() - SquareWidth / 2, SquareWidth, SquareWidth); } @@ -507,7 +671,9 @@ void DsoSignal::paint_trace(QPainter &p, int y, int left, const int64_t start, const int64_t end, const double pixels_offset, const double samples_per_pixel, uint64_t num_channels) { - const int64_t sample_count = end - start; + (void)y; + + const int64_t sample_count = end - start + 1; if (sample_count > 0) { const uint8_t *const samples = snapshot->get_samples(start, end, get_index()); @@ -521,13 +687,23 @@ void DsoSignal::paint_trace(QPainter &p, float top = get_view_rect().top(); float bottom = get_view_rect().bottom(); - for (int64_t sample = start; sample < end; sample++) { - const float x = (sample / samples_per_pixel - pixels_offset) + left; - uint8_t offset = samples[(sample - start)*num_channels]; - if (offset >0 && offset < 0xff) { - const float yp = min(bottom, max(top, y - offset * _scale)); - *point++ = QPointF(x, yp); - } + float zeroP = 0; + if (strcmp(_dev_inst->dev_inst()->driver->name, "DSLogic") == 0) + zeroP = (_zeroPos - 0.5) * get_view_rect().height(); + float x = (start / samples_per_pixel - pixels_offset) + left; + double pixels_per_sample = 1.0/samples_per_pixel; + uint8_t offset; + int64_t sample_end = sample_count*num_channels; + for (int64_t sample = 0; sample < sample_end; sample+=num_channels) { + //const float x = (sample / samples_per_pixel - pixels_offset) + left; + //uint8_t offset = samples[(sample - start)*num_channels]; + + //offset = samples[(sample - start)*num_channels]; + offset = samples[sample]; + const float y = min(max(top, top + offset * _scale + zeroP), bottom); + *point++ = QPointF(x, y); + x += pixels_per_sample; + //*point++ = QPointF(x, top + offset); } p.drawPolyline(points, point - points); @@ -539,14 +715,17 @@ void DsoSignal::paint_trace(QPainter &p, void DsoSignal::paint_envelope(QPainter &p, const boost::shared_ptr &snapshot, - int y, int left, const int64_t start, const int64_t end, - const double pixels_offset, const double samples_per_pixel) + int y, int left, const int64_t start, const int64_t end, + const double pixels_offset, const double samples_per_pixel, uint64_t num_channels) { using namespace Qt; using pv::data::DsoSnapshot; + (void)y; + DsoSnapshot::EnvelopeSection e; - snapshot->get_envelope_section(e, start, end, samples_per_pixel, get_index()); + const uint16_t index = get_index() % num_channels; + snapshot->get_envelope_section(e, start, end, samples_per_pixel, index); if (e.length < 2) return; @@ -557,8 +736,12 @@ void DsoSignal::paint_envelope(QPainter &p, QRectF *const rects = new QRectF[e.length]; QRectF *rect = rects; - - for(uint64_t sample = 0; sample < e.length-1; sample++) { + float top = get_view_rect().top(); + float bottom = get_view_rect().bottom(); + float zeroP = 0; + if (strcmp(_dev_inst->dev_inst()->driver->name, "DSLogic") == 0) + zeroP = (_zeroPos - 0.5) * get_view_rect().height(); + for(uint64_t sample = 0; sample < e.length-1; sample++) { const float x = ((e.scale * sample + e.start) / samples_per_pixel - pixels_offset) + left; const DsoSnapshot::EnvelopeSample *const s = @@ -566,8 +749,8 @@ void DsoSignal::paint_envelope(QPainter &p, // We overlap this sample with the next so that vertical // gaps do not appear during steep rising or falling edges - const float b = y - max(s->max, (s+1)->min) * _scale; - const float t = y - min(s->min, (s+1)->max) * _scale; + const float b = min(max(top, (top + max(s->max, (s+1)->min) * _scale + zeroP)), bottom); + const float t = min(max(top, (top + min(s->min, (s+1)->max) * _scale + zeroP)), bottom); float h = b - t; if(h >= 0.0f && h <= 1.0f) @@ -612,7 +795,89 @@ void DsoSignal::paint_type_options(QPainter &p, int right, bool hover, int actio p.setBrush(enabled() ? ((hover && action == ACDC) ? _colour.darker() : _colour) : dsDisable); p.drawRect(acdc_rect); p.setPen(Qt::white); - p.drawText(acdc_rect, Qt::AlignCenter | Qt::AlignVCenter, _acCoupling ? "AC" : "DC"); + p.drawText(acdc_rect, Qt::AlignCenter | Qt::AlignVCenter, (_acCoupling == SR_GND_COUPLING) ? "GND" : + (_acCoupling == SR_DC_COUPLING) ? "DC" : "AC"); +} + +void DsoSignal::paint_measure(QPainter &p) +{ + sr_status status; + int index = get_index(); + const int st_begin = (index == 0) ? SR_STATUS_CH0_BEGIN : SR_STATUS_CH1_BEGIN; + const int st_end = (index == 0) ? SR_STATUS_CH0_END : SR_STATUS_CH1_END; + if (sr_status_get(_dev_inst->dev_inst(), &status, st_begin, st_end) == SR_OK) { + _max = (index == 0) ? status.ch0_max : status.ch1_max; + _min = (index == 0) ? status.ch0_min : status.ch1_min; + const uint32_t period = (index == 0) ? status.ch0_period : status.ch1_period; + const uint32_t count = (index == 0) ? status.ch0_pcnt : status.ch1_pcnt; + double value_max = ((0xff - _min - (1-_zeroPos)*0xff) * _vDial->get_value() * DS_CONF_DSO_VDIVS) / 0xff; + double value_min = ((0xff - _max - (1-_zeroPos)*0xff) * _vDial->get_value() * DS_CONF_DSO_VDIVS) / 0xff; + _period = (count == 0) ? period * 10 : period * 10.0f / count; + const int channel_count = _view->session().get_ch_num(SR_CHANNEL_DSO); + uint64_t sample_rate = _dev_inst->get_sample_rate(); + _period = _period * 200 / (channel_count * sample_rate * 1.0f/ SR_MHZ(1)); + QString max_string = abs(value_max) > 1000 ? QString::number(value_max/1000.0) + "V" : QString::number(value_max) + "mV"; + QString min_string = abs(value_min) > 1000 ? QString::number(value_min/1000.0) + "V" : QString::number(value_min) + "mV"; + QString period_string = abs(_period) > 1000000000 ? QString::number(_period/1000000000) + "S" : + abs(_period) > 1000000 ? QString::number(_period/1000000) + "mS" : + abs(_period) > 1000 ? QString::number(_period/1000) + "uS" : QString::number(_period) + "nS"; + QString freq_string = abs(_period) > 1000000 ? QString::number(1000000000/_period) + "Hz" : + abs(_period) > 1000 ? QString::number(1000000/_period) + "kHz" : QString::number(1000/_period) + "MHz"; + p.setPen(_colour); + p.drawText(QRectF(0, 100*index + UpMargin, get_view_rect().width(), 20), Qt::AlignRight | Qt::AlignVCenter, "Max: "+max_string+" "); + p.drawText(QRectF(0, 100*index + UpMargin + 20, get_view_rect().width(), 20), Qt::AlignRight | Qt::AlignVCenter, "Min: "+min_string+" "); + p.drawText(QRectF(0, 100*index + UpMargin + 40, get_view_rect().width(), 20), Qt::AlignRight | Qt::AlignVCenter, "Period: "+period_string+" "); + p.drawText(QRectF(0, 100*index + UpMargin + 60, get_view_rect().width(), 20), Qt::AlignRight | Qt::AlignVCenter, "Frequency: "+freq_string+" "); + + if (_autoV) { + const uint8_t vscale = abs(_max - _min); + if (_max == 0xff || _min == 0x00 || vscale > 0xCC) { + go_vDialNext(); + } else if (vscale > 0x33) { + _autoV = false; + } else { + go_vDialPre(); + } + } + + bool setted = false; + if (_autoH) { + const vector< boost::shared_ptr > traces(_view->get_traces()); + const double upPeriod = get_hDialValue() * DS_CONF_DSO_HDIVS * 0.8; + const double dnPeriod = get_hDialValue() * DS_CONF_DSO_HDIVS * 0.2; + if (_period > upPeriod) { + shared_ptr dsoSig; + BOOST_FOREACH(const shared_ptr t, traces) { + if (dsoSig = dynamic_pointer_cast(t)) { + dsoSig->go_hDialNext(setted); + setted = true; + } + } + } else if (_period > dnPeriod) { + _autoH = false; + } else { + shared_ptr dsoSig; + BOOST_FOREACH(const shared_ptr t, traces) { + if (dsoSig = dynamic_pointer_cast(t)) { + dsoSig->go_hDialPre(setted); + setted = true; + } + } + } + } + } + _view->update(); +} + +void DsoSignal::auto_set() +{ + if (_autoV | _autoH) { + _autoV = false; + _autoH = false; + } else { + _autoV = true; + _autoH = true; + } } } // namespace view diff --git a/DSView/pv/view/dsosignal.h b/DSView/pv/view/dsosignal.h index 588c7416..f030f973 100644 --- a/DSView/pv/view/dsosignal.h +++ b/DSView/pv/view/dsosignal.h @@ -1,6 +1,6 @@ /* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. + * This file is part of the DSView project. + * DSView is based on PulseView. * * Copyright (C) 2013 DreamSourceLab * @@ -20,8 +20,8 @@ */ -#ifndef DSLOGIC_PV_DSOSIGNAL_H -#define DSLOGIC_PV_DSOSIGNAL_H +#ifndef DSVIEW_PV_DSOSIGNAL_H +#define DSVIEW_PV_DSOSIGNAL_H #include "signal.h" @@ -45,10 +45,10 @@ private: static const float EnvelopeThreshold; static const int HitCursorMargin = 3; - static const quint64 vDialValueCount = 10; + static const quint64 vDialValueCount = 8; static const quint64 vDialValueStep = 1000; static const uint64_t vDialUnitCount = 2; - static const uint64_t hDialValueCount = 22; + static const uint64_t hDialValueCount = 28; static const uint64_t hDialValueStep = 1000; static const uint64_t hDialUnitCount = 4; static const uint64_t vDialValue[vDialValueCount]; @@ -69,6 +69,7 @@ public: virtual ~DsoSignal(); boost::shared_ptr data() const; + void set_view(pv::view::View *view); void set_scale(float scale); @@ -82,17 +83,23 @@ public: void set_hDialActive(bool active); bool go_vDialPre(); bool go_vDialNext(); - bool go_hDialPre(); - bool go_hDialNext(); + bool go_hDialPre(bool setted); + bool go_hDialNext(bool setted); + bool go_hDialCur(); uint64_t get_vDialValue() const; uint64_t get_hDialValue() const; uint16_t get_vDialSel() const; uint16_t get_hDialSel() const; - bool get_acCoupling() const; - void set_acCoupling(bool coupling); + uint8_t get_acCoupling() const; + void set_acCoupling(uint8_t coupling); void set_trig_vpos(int pos); int get_trig_vpos() const; + /** + * auto set the vertical and Horizontal scale + */ + void auto_set(); + /** * Gets the mid-Y position of this signal. */ @@ -102,6 +109,7 @@ public: * Sets the mid-Y position of this signal. */ void set_zeroPos(int pos); + void update_zeroPos(); /** * Paints the background layer of the trace with a QPainter @@ -146,7 +154,10 @@ private: void paint_envelope(QPainter &p, const boost::shared_ptr &snapshot, int y, int left, const int64_t start, const int64_t end, - const double pixels_offset, const double samples_per_pixel); + const double pixels_offset, const double samples_per_pixel, + uint64_t num_channels); + + void paint_measure(QPainter &p); private: boost::shared_ptr _data; @@ -156,13 +167,19 @@ private: dslDial *_hDial; bool _vDialActive; bool _hDialActive; - bool _acCoupling; + uint8_t _acCoupling; double _trig_vpos; double _zeroPos; + + uint8_t _max; + uint8_t _min; + double _period; + bool _autoV; + bool _autoH; }; } // namespace view } // namespace pv -#endif // DSLOGIC_PV_DSOSIGNAL_H +#endif // DSVIEW_PV_DSOSIGNAL_H diff --git a/DSView/pv/view/groupsignal.cpp b/DSView/pv/view/groupsignal.cpp index 1ba1bfec..09ec31ad 100644 --- a/DSView/pv/view/groupsignal.cpp +++ b/DSView/pv/view/groupsignal.cpp @@ -1,6 +1,6 @@ /* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. + * This file is part of the DSView project. + * DSView is based on PulseView. * * Copyright (C) 2012 Joel Holdsworth * Copyright (C) 2013 DreamSourceLab @@ -51,7 +51,7 @@ GroupSignal::GroupSignal(QString name, boost::shared_ptr data, _data(data) { _colour = SignalColours[probe_index_list.front() % countof(SignalColours)]; - _scale = _signalHeight * 1.0f / pow(2, probe_index_list.size()); + _scale = _signalHeight * 1.0f / std::pow(2.0, static_cast(probe_index_list.size())); } GroupSignal::~GroupSignal() @@ -84,7 +84,7 @@ void GroupSignal::paint_mid(QPainter &p, int left, int right) assert(scale > 0); const double offset = _view->offset(); - _scale = _signalHeight * 1.0f / pow(2, _index_list.size()); + _scale = _signalHeight * 1.0f / std::pow(2.0, static_cast(_index_list.size())); const deque< boost::shared_ptr > &snapshots = _data->get_snapshots(); diff --git a/DSView/pv/view/groupsignal.h b/DSView/pv/view/groupsignal.h index 04c1bba2..b4fe21f1 100644 --- a/DSView/pv/view/groupsignal.h +++ b/DSView/pv/view/groupsignal.h @@ -1,6 +1,6 @@ /* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. + * This file is part of the DSView project. + * DSView is based on PulseView. * * Copyright (C) 2012 Joel Holdsworth * Copyright (C) 2013 DreamSourceLab @@ -21,8 +21,8 @@ */ -#ifndef DSLOGIC_SV_GROUPSIGNAL_H -#define DSLOGIC_SV_GROUPSIGNAL_H +#ifndef DSVIEW_SV_GROUPSIGNAL_H +#define DSVIEW_SV_GROUPSIGNAL_H #include "signal.h" #include "../data/groupsnapshot.h" @@ -96,4 +96,4 @@ private: } // namespace view } // namespace pv -#endif // DSLOGIC_PV_GROUPSIGNAL_H +#endif // DSVIEW_PV_GROUPSIGNAL_H diff --git a/DSView/pv/view/header.cpp b/DSView/pv/view/header.cpp index 8301fb3e..9df5918c 100644 --- a/DSView/pv/view/header.cpp +++ b/DSView/pv/view/header.cpp @@ -1,6 +1,6 @@ /* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. + * This file is part of the DSView project. + * DSView is based on PulseView. * * Copyright (C) 2012 Joel Holdsworth * Copyright (C) 2013 DreamSourceLab @@ -139,6 +139,36 @@ void Header::paintEvent(QPaintEvent*) painter.end(); } +void Header::mouseDoubleClickEvent(QMouseEvent *event) +{ + assert(event); + + const vector< boost::shared_ptr > traces( + _view.get_traces()); + int action; + + if (event->button() & Qt::LeftButton) { + _mouse_down_point = event->pos(); + + // Save the offsets of any Traces which will be dragged + BOOST_FOREACH(const boost::shared_ptr t, traces) + if (t->selected()) + _drag_traces.push_back( + make_pair(t, t->get_v_offset())); + + // Select the Trace if it has been clicked + const boost::shared_ptr mTrace = + get_mTrace(action, event->pos()); + if (action == Trace::LABEL && mTrace) { + shared_ptr dsoSig; + if (dsoSig = dynamic_pointer_cast(mTrace)) { + dsoSig->auto_set(); + } + } + } + +} + void Header::mousePressEvent(QMouseEvent *event) { assert(event); @@ -146,6 +176,9 @@ void Header::mousePressEvent(QMouseEvent *event) const vector< boost::shared_ptr > traces( _view.get_traces()); int action; + const bool instant = _view.session().get_instant(); + if (instant && _view.session().get_capture_state() == SigSession::Running) + return; if (event->button() & Qt::LeftButton) { _mouse_down_point = event->pos(); @@ -243,8 +276,12 @@ void Header::mousePressEvent(QMouseEvent *event) } } else if (action == Trace::ACDC && mTrace) { shared_ptr dsoSig; - if (dsoSig = dynamic_pointer_cast(mTrace)) - dsoSig->set_acCoupling(!dsoSig->get_acCoupling()); + if (dsoSig = dynamic_pointer_cast(mTrace)) { + if (strcmp(_view.session().get_device()->dev_inst()->driver->name, "DSLogic") == 0) + dsoSig->set_acCoupling((dsoSig->get_acCoupling()+1)%2); + else + dsoSig->set_acCoupling((dsoSig->get_acCoupling()+1)%3); + } } if (~QApplication::keyboardModifiers() & Qt::ControlModifier) { @@ -297,6 +334,7 @@ void Header::wheelEvent(QWheelEvent *event) _view.get_traces()); // Vertical scrolling double shift = event->delta() / 20.0; + bool setted = false; BOOST_FOREACH(const shared_ptr t, traces) { shared_ptr dsoSig; if (dsoSig = dynamic_pointer_cast(t)) { @@ -306,11 +344,14 @@ void Header::wheelEvent(QWheelEvent *event) else if (shift < -1.0) dsoSig->go_vDialPre(); break; - } else if (dsoSig->get_hDialActive()) { + } else if (dsoSig->get_hDialActive()){ if (shift > 1.0) - dsoSig->go_hDialNext(); + dsoSig->go_hDialNext(setted); else if (shift < -1.0) - dsoSig->go_hDialPre(); + dsoSig->go_hDialPre(setted); + else + break; + setted = true; } } } diff --git a/DSView/pv/view/header.h b/DSView/pv/view/header.h index 4c76f60e..89d637ef 100644 --- a/DSView/pv/view/header.h +++ b/DSView/pv/view/header.h @@ -1,6 +1,6 @@ /* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. + * This file is part of the DSView project. + * DSView is based on PulseView. * * Copyright (C) 2012 Joel Holdsworth * Copyright (C) 2013 DreamSourceLab @@ -21,8 +21,8 @@ */ -#ifndef DSLOGIC_PV_VIEW_HEADER_H -#define DSLOGIC_PV_VIEW_HEADER_H +#ifndef DSVIEW_PV_VIEW_HEADER_H +#define DSVIEW_PV_VIEW_HEADER_H #include #include @@ -58,6 +58,7 @@ private: void mousePressEvent(QMouseEvent * event); void mouseReleaseEvent(QMouseEvent *event); void mouseMoveEvent(QMouseEvent *event); + void mouseDoubleClickEvent(QMouseEvent *event); void leaveEvent(QEvent *event); void wheelEvent(QWheelEvent *event); void contextMenuEvent(QContextMenuEvent *event); @@ -109,4 +110,4 @@ private: } // namespace view } // namespace pv -#endif // DSLOGIC_PV_VIEW_HEADER_H +#endif // DSVIEW_PV_VIEW_HEADER_H diff --git a/DSView/pv/view/logicsignal.cpp b/DSView/pv/view/logicsignal.cpp index 52a454e2..df0bbb4e 100644 --- a/DSView/pv/view/logicsignal.cpp +++ b/DSView/pv/view/logicsignal.cpp @@ -1,6 +1,6 @@ /* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. + * This file is part of the DSView project. + * DSView is based on PulseView. * * Copyright (C) 2012 Joel Holdsworth * Copyright (C) 2013 DreamSourceLab diff --git a/DSView/pv/view/logicsignal.h b/DSView/pv/view/logicsignal.h index b1e8721a..47b46431 100644 --- a/DSView/pv/view/logicsignal.h +++ b/DSView/pv/view/logicsignal.h @@ -1,6 +1,6 @@ /* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. + * This file is part of the DSView project. + * DSView is based on PulseView. * * Copyright (C) 2012 Joel Holdsworth * Copyright (C) 2013 DreamSourceLab @@ -21,8 +21,8 @@ */ -#ifndef DSLOGIC_PV_LOGICSIGNAL_H -#define DSLOGIC_PV_LOGICSIGNAL_H +#ifndef DSVIEW_PV_LOGICSIGNAL_H +#define DSVIEW_PV_LOGICSIGNAL_H #include "signal.h" @@ -94,4 +94,4 @@ private: } // namespace view } // namespace pv -#endif // DSLOGIC_PV_LOGICSIGNAL_H +#endif // DSVIEW_PV_LOGICSIGNAL_H diff --git a/DSView/pv/view/ruler.cpp b/DSView/pv/view/ruler.cpp index 43f40137..a96a8561 100644 --- a/DSView/pv/view/ruler.cpp +++ b/DSView/pv/view/ruler.cpp @@ -1,6 +1,6 @@ /* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. + * This file is part of the DSView project. + * DSView is based on PulseView. * * Copyright (C) 2012 Joel Holdsworth * Copyright (C) 2013 DreamSourceLab @@ -119,12 +119,12 @@ QString Ruler::format_time(double t, unsigned int prefix, unsigned int precision) { const double multiplier = pow(10.0, - static_cast(- prefix * 3 - FirstSIPrefixPower)); + static_cast(- prefix * 3 - FirstSIPrefixPower + 6)); QString s; QTextStream ts(&s); ts.setRealNumberPrecision(precision); - ts << fixed << forcesign << (t * multiplier) << + ts << fixed << forcesign << (t * multiplier) / 1000000.0 << SIPrefixes[prefix] << "s"; return s; } @@ -309,7 +309,7 @@ void Ruler::draw_tick_mark(QPainter &p) const double SpacingIncrement = 32.0f; const double MinValueSpacing = 16.0f; - const int ValueMargin = 5; + const int ValueMargin = 15; double min_width = SpacingIncrement, typical_width; double tick_period; @@ -388,7 +388,7 @@ void Ruler::draw_tick_mark(QPainter &p) division++; - } while (x < width()); + } while (x < _view.get_view_width()); // Draw the cursors if (!_view.get_cursorList().empty()) { @@ -421,11 +421,11 @@ void Ruler::draw_logic_tick_mark(QPainter &p) // Find tick spacing, and number formatting that does not cause // value to collide. if (_view.session().get_device()->dev_inst()->mode == DSO) { - _min_period = _view.session().get_device()->get_time_base() * pow(10, -9); + _min_period = _view.session().get_device()->get_time_base() * std::pow(10.0, -9.0); } else { _min_period = cur_period_scale * abs_min_period; } - const int order = (int)floorf(log10f(_min_period)); + const int order = (int)floorf(log10f(_view.scale() * _view.get_view_width())); //const double order_decimal = pow(10, order); const unsigned int prefix = (order - FirstSIPrefixPower) / 3; _cur_prefix = prefix; @@ -489,7 +489,7 @@ void Ruler::draw_logic_tick_mark(QPainter &p) { // Draw a minor tick if (minor_tick_period / _view.scale() > 2 * typical_width || - tick_period / _view.scale() > width()) + tick_period / _view.scale() > _view.get_view_width()) p.drawText(x, 2 * ValueMargin, 0, text_height, AlignCenter | AlignTop | TextDontClip, format_time(t, prefix)); @@ -504,7 +504,7 @@ void Ruler::draw_logic_tick_mark(QPainter &p) division++; - } while (x < _view.get_max_width()); + } while (x < _view.get_view_width()); // Draw the cursors if (!_view.get_cursorList().empty()) { diff --git a/DSView/pv/view/ruler.h b/DSView/pv/view/ruler.h index 8d9bc83d..114ff9ff 100644 --- a/DSView/pv/view/ruler.h +++ b/DSView/pv/view/ruler.h @@ -1,6 +1,6 @@ /* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. + * This file is part of the DSView project. + * DSView is based on PulseView. * * Copyright (C) 2012 Joel Holdsworth * Copyright (C) 2013 DreamSourceLab @@ -21,8 +21,8 @@ */ -#ifndef DSLOGIC_PV_VIEW_RULER_H -#define DSLOGIC_PV_VIEW_RULER_H +#ifndef DSVIEW_PV_VIEW_RULER_H +#define DSVIEW_PV_VIEW_RULER_H #include @@ -115,4 +115,4 @@ private: } // namespace view } // namespace pv -#endif // DSLOGIC_PV_VIEW_RULER_H +#endif // DSVIEW_PV_VIEW_RULER_H diff --git a/DSView/pv/view/selectableitem.cpp b/DSView/pv/view/selectableitem.cpp index e849dba9..2b4b4059 100644 --- a/DSView/pv/view/selectableitem.cpp +++ b/DSView/pv/view/selectableitem.cpp @@ -1,6 +1,6 @@ /* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. + * This file is part of the DSView project. + * DSView is based on PulseView. * * Copyright (C) 2013 Joel Holdsworth * Copyright (C) 2014 DreamSourceLab diff --git a/DSView/pv/view/selectableitem.h b/DSView/pv/view/selectableitem.h index f952f828..28004a2d 100644 --- a/DSView/pv/view/selectableitem.h +++ b/DSView/pv/view/selectableitem.h @@ -1,6 +1,6 @@ /* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. + * This file is part of the DSView project. + * DSView is based on PulseView. * * Copyright (C) 2013 Joel Holdsworth * Copyright (C) 2014 DreamSourceLab @@ -20,8 +20,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifndef DSLOGIC_PV_SELECTABLEITEM_H -#define DSLOGIC_PV_SELECTABLEITEM_H +#ifndef DSVIEW_PV_SELECTABLEITEM_H +#define DSVIEW_PV_SELECTABLEITEM_H #include @@ -66,4 +66,4 @@ private: } // namespace view } // namespace pv -#endif // DSLOGIC_PV_SELECTABLEITEM_H +#endif // DSVIEW_PV_SELECTABLEITEM_H diff --git a/DSView/pv/view/signal.cpp b/DSView/pv/view/signal.cpp index 828e7fc4..4c9c09a5 100644 --- a/DSView/pv/view/signal.cpp +++ b/DSView/pv/view/signal.cpp @@ -1,6 +1,6 @@ /* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. + * This file is part of the DSView project. + * DSView is based on PulseView. * * Copyright (C) 2012 Joel Holdsworth * Copyright (C) 2013 DreamSourceLab diff --git a/DSView/pv/view/signal.h b/DSView/pv/view/signal.h index 9f7cd981..b599a07c 100644 --- a/DSView/pv/view/signal.h +++ b/DSView/pv/view/signal.h @@ -1,6 +1,6 @@ /* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. + * This file is part of the DSView project. + * DSView is based on PulseView. * * Copyright (C) 2012 Joel Holdsworth * Copyright (C) 2013 DreamSourceLab @@ -21,8 +21,8 @@ */ -#ifndef DSLOGIC_PV_SIGNAL_H -#define DSLOGIC_PV_SIGNAL_H +#ifndef DSVIEW_PV_SIGNAL_H +#define DSVIEW_PV_SIGNAL_H #include @@ -35,7 +35,7 @@ #include #include -#include "libsigrok4DSLogic/libsigrok.h" +#include "libsigrok4DSL/libsigrok.h" #include "trace.h" namespace pv { @@ -98,4 +98,4 @@ protected: } // namespace view } // namespace pv -#endif // DSLOGIC_PV_SIGNAL_H +#endif // DSVIEW_PV_SIGNAL_H diff --git a/DSView/pv/view/timemarker.cpp b/DSView/pv/view/timemarker.cpp index 74b833d9..13856d9c 100644 --- a/DSView/pv/view/timemarker.cpp +++ b/DSView/pv/view/timemarker.cpp @@ -1,6 +1,6 @@ /* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. + * This file is part of the DSView project. + * DSView is based on PulseView. * * Copyright (C) 2012 Joel Holdsworth * Copyright (C) 2013 DreamSourceLab diff --git a/DSView/pv/view/timemarker.h b/DSView/pv/view/timemarker.h index 9b25d73f..ad0ca7e6 100644 --- a/DSView/pv/view/timemarker.h +++ b/DSView/pv/view/timemarker.h @@ -1,6 +1,6 @@ /* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. + * This file is part of the DSView project. + * DSView is based on PulseView. * * Copyright (C) 2012 Joel Holdsworth * Copyright (C) 2013 DreamSourceLab @@ -21,8 +21,8 @@ */ -#ifndef DSLOGIC_PV_VIEW_MARKER_H -#define DSLOGIC_PV_VIEW_MARKER_H +#ifndef DSVIEW_PV_VIEW_MARKER_H +#define DSVIEW_PV_VIEW_MARKER_H #include #include @@ -115,4 +115,4 @@ private: } // namespace view } // namespace pv -#endif // DSLOGIC_PV_VIEW_MARKER_H +#endif // DSVIEW_PV_VIEW_MARKER_H diff --git a/DSView/pv/view/trace.cpp b/DSView/pv/view/trace.cpp index 5175f048..515932d4 100644 --- a/DSView/pv/view/trace.cpp +++ b/DSView/pv/view/trace.cpp @@ -1,6 +1,6 @@ /* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. + * This file is part of the DSView project. + * DSView is based on PulseView. * * Copyright (C) 2013 Joel Holdsworth * Copyright (C) 2014 DreamSourceLab @@ -42,7 +42,7 @@ const QColor Trace::dsYellow = QColor(238, 178, 17, 255); const QColor Trace::dsRed = QColor(213, 15, 37, 255); const QColor Trace::dsGreen = QColor(0, 153, 37, 200); const QColor Trace::dsGray = QColor(0x88, 0x8A, 0x85, 60); -const QColor Trace::dsFore = QColor(0xff, 0xff, 0xff, 255); +const QColor Trace::dsFore = QColor(0xff, 0xff, 0xff, 100); const QColor Trace::dsBack = QColor(0x16, 0x18, 0x23, 255); const QColor Trace::dsDisable = QColor(0x88, 0x8A, 0x85, 200); const QColor Trace::dsActive = QColor(17, 133, 209, 255); diff --git a/DSView/pv/view/trace.h b/DSView/pv/view/trace.h index b31ca181..597818dc 100644 --- a/DSView/pv/view/trace.h +++ b/DSView/pv/view/trace.h @@ -1,6 +1,6 @@ /* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. + * This file is part of the DSView project. + * DSView is based on PulseView. * * Copyright (C) 2013 Joel Holdsworth * Copyright (C) 2014 DreamSourceLab @@ -20,8 +20,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifndef DSLOGIC_PV_VIEW_TRACE_H -#define DSLOGIC_PV_VIEW_TRACE_H +#ifndef DSVIEW_PV_VIEW_TRACE_H +#define DSVIEW_PV_VIEW_TRACE_H #include #include @@ -311,4 +311,4 @@ protected: } // namespace view } // namespace pv -#endif // DSLOGIC_PV_VIEW_TRACE_H +#endif // DSVIEW_PV_VIEW_TRACE_H diff --git a/DSView/pv/view/view.cpp b/DSView/pv/view/view.cpp index 30c3f3d3..1a912d40 100644 --- a/DSView/pv/view/view.cpp +++ b/DSView/pv/view/view.cpp @@ -1,6 +1,6 @@ /* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. + * This file is part of the DSView project. + * DSView is based on PulseView. * * Copyright (C) 2012 Joel Holdsworth * Copyright (C) 2013 DreamSourceLab @@ -65,9 +65,10 @@ const QColor View::CursorAreaColour(220, 231, 243); const QSizeF View::LabelPadding(4, 4); -View::View(SigSession &session, QWidget *parent) : +View::View(SigSession &session, pv::toolbars::SamplingBar *sampling_bar, QWidget *parent) : QAbstractScrollArea(parent), _session(session), + _sampling_bar(sampling_bar), _viewport(new Viewport(*this)), _ruler(new Ruler(*this)), _header(new Header(*this)), @@ -162,7 +163,7 @@ double View::get_maxscale() const void View::zoom(double steps) { - zoom(steps, (width() - headerWidth()) / 2); + zoom(steps, get_view_width() / 2); } void View::set_need_update(bool need_update) @@ -175,6 +176,30 @@ bool View::need_update() const return _need_update; } +void View::update_sample(bool instant) +{ + _session.get_device()->set_config(NULL, NULL, SR_CONF_INSTANT, g_variant_new_boolean(instant)); + BOOST_FOREACH(const boost::shared_ptr s, _session.get_signals()) { + boost::shared_ptr dsoSig; + if (dsoSig = dynamic_pointer_cast(s)) { + dsoSig->go_hDialCur(); + break; + } + } +} + +void View::set_sample_rate(uint64_t sample_rate, bool force) +{ + if (_session.get_capture_state() != pv::SigSession::Stopped || force) + _sampling_bar->set_sample_rate(sample_rate); +} + +void View::set_sample_limit(uint64_t sample_limit, bool force) +{ + if (_session.get_capture_state() != pv::SigSession::Stopped || force) + _sampling_bar->set_sample_limit(sample_limit); +} + void View::zoom(double steps, int offset) { //if (_session.get_capture_state() == SigSession::Stopped) { @@ -183,24 +208,28 @@ void View::zoom(double steps, int offset) const double cursor_offset = _offset + _scale * offset; if (_session.get_device()->dev_inst()->mode != DSO) { - _scale *= pow(3.0/2.0, -steps); + _scale *= std::pow(3.0/2.0, -steps); _scale = max(min(_scale, _maxscale), _minscale); }else { const vector< shared_ptr > sigs(_session.get_signals()); + bool setted = false; BOOST_FOREACH(const shared_ptr s, sigs) { shared_ptr dsoSig; if (dsoSig = dynamic_pointer_cast(s)) { if(steps > 0.5) - dsoSig->go_hDialPre(); + dsoSig->go_hDialPre(setted); else if (steps < -0.5) - dsoSig->go_hDialNext(); + dsoSig->go_hDialNext(setted); + else + break; + setted = true; } } } _offset = cursor_offset - _scale * offset; - const double MinOffset = -(_scale * (_viewport->width() * (1 - MaxViewRate))); + const double MinOffset = -(_scale * (get_view_width() * (1 - MaxViewRate))); const double MaxOffset = _session.get_device()->get_sample_time() - - _scale * (_viewport->width() * MaxViewRate); + _scale * (get_view_width() * MaxViewRate); _offset = max(min(_offset, MaxOffset), MinOffset); if (_scale != _preScale || _offset != _preOffset) { @@ -221,9 +250,9 @@ void View::set_scale_offset(double scale, double offset) _scale = max(min(scale, _maxscale), _minscale); - const double MinOffset = -(_scale * (_viewport->width() * (1 - MaxViewRate))); + const double MinOffset = -(_scale * (get_view_width() * (1 - MaxViewRate))); const double MaxOffset = _session.get_device()->get_sample_time() - - _scale * (_viewport->width() * MaxViewRate); + - _scale * (get_view_width() * MaxViewRate); _offset = max(min(offset, MaxOffset), MinOffset); if (_scale != _preScale || _offset != _preOffset) { @@ -316,7 +345,7 @@ void View::set_trig_pos(quint64 trig_pos) _trig_pos = trig_pos; _trig_cursor->set_time(time); _show_trig_cursor = true; - set_scale_offset(_scale, time - _scale * _viewport->width() / 2); + set_scale_offset(_scale, time - _scale * get_view_width() / 2); _ruler->update(); _viewport->update(); } @@ -328,7 +357,7 @@ void View::set_search_pos(uint64_t search_pos) const double time = search_pos * 1.0f / _session.get_device()->get_sample_rate(); _search_pos = search_pos; _search_cursor->set_time(time); - set_scale_offset(_scale, time - _scale * _viewport->width() / 2); + set_scale_offset(_scale, time - _scale * get_view_width() / 2); _ruler->update(); _viewport->update(); } @@ -424,9 +453,9 @@ void View::update_scale() if (_session.get_device()->dev_inst()->mode != DSO) { _scale = (1.0f / sample_rate) / WellPixelsPerSample; - _maxscale = _session.get_device()->get_sample_time() / (get_max_width() * MaxViewRate); + _maxscale = _session.get_device()->get_sample_time() / (get_view_width() * MaxViewRate); } else { - _scale = _session.get_device()->get_time_base() * 10.0f / get_max_width() * pow(10, -9); + _scale = _session.get_device()->get_time_base() * 10.0f / get_view_width() * std::pow(10.0, -9.0); _maxscale = 1e9; } @@ -550,9 +579,9 @@ void View::resizeEvent(QResizeEvent*) update_margins(); update_scroll(); if (_session.get_device()->dev_inst()->mode == DSO) - _scale = _session.get_device()->get_time_base() * pow(10, -9) * DS_CONF_DSO_HDIVS / get_max_width(); + _scale = _session.get_device()->get_time_base() * std::pow(10.0, -9.0) * DS_CONF_DSO_HDIVS / get_view_width(); - _maxscale = _session.get_device()->get_sample_time() / (get_max_width() * MaxViewRate); + _maxscale = _session.get_device()->get_sample_time() / (get_view_width() * MaxViewRate); _scale = min(_scale, _maxscale); signals_changed(); @@ -568,9 +597,9 @@ void View::h_scroll_value_changed(int value) _preOffset = _offset; - const double MinOffset = -(_scale * (_viewport->width() * (1 - MaxViewRate))); + const double MinOffset = -(_scale * (get_view_width() * (1 - MaxViewRate))); const double MaxOffset = _session.get_device()->get_sample_time() - - _scale * (_viewport->width() * MaxViewRate); + - _scale * (get_view_width() * MaxViewRate); const int range = horizontalScrollBar()->maximum(); if (range < MaxScrollValue) @@ -612,7 +641,7 @@ void View::data_updated() void View::update_margins() { _ruler->setGeometry(_viewport->x(), 0, - _viewport->width(), _viewport->y()); + get_view_width(), _viewport->y()); _header->setGeometry(0, _viewport->y(), _viewport->x(), _viewport->height()); _devmode->setGeometry(0, 0, @@ -691,7 +720,7 @@ void View::set_cursor_middle(int index) list::iterator i = _cursorList.begin(); while (index-- != 0) i++; - set_scale_offset(_scale, (*i)->time() - _scale * _viewport->width() / 2); + set_scale_offset(_scale, (*i)->time() - _scale * get_view_width() / 2); } void View::receive_data(quint64 length) @@ -771,15 +800,19 @@ void View::on_state_changed(bool stop) _viewport->stop_trigger_timer(); } -int View::get_max_width() +int View::get_view_width() { - int max_width = 0; - const vector< shared_ptr > sigs(_session.get_signals()); - BOOST_FOREACH(const shared_ptr s, sigs) { - max_width = max((double)max_width, s->get_view_rect().width()); + int view_width = 0; + if (_session.get_device()->dev_inst()->mode == DSO) { + const vector< shared_ptr > sigs(_session.get_signals()); + BOOST_FOREACH(const shared_ptr s, sigs) { + view_width = max((double)view_width, s->get_view_rect().width()); + } + } else { + view_width = _viewport->width(); } - return max_width; + return view_width; } } // namespace view diff --git a/DSView/pv/view/view.h b/DSView/pv/view/view.h index b268792d..2f82a01e 100644 --- a/DSView/pv/view/view.h +++ b/DSView/pv/view/view.h @@ -1,6 +1,6 @@ /* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. + * This file is part of the DSView project. + * DSView is based on PulseView. * * Copyright (C) 2012 Joel Holdsworth * Copyright (C) 2013 DreamSourceLab @@ -21,8 +21,8 @@ */ -#ifndef DSLOGIC_PV_VIEW_VIEW_H -#define DSLOGIC_PV_VIEW_VIEW_H +#ifndef DSVIEW_PV_VIEW_VIEW_H +#define DSVIEW_PV_VIEW_VIEW_H #include @@ -35,12 +35,17 @@ #include #include +#include "../toolbars/samplingbar.h" #include "../data/signaldata.h" #include "cursor.h" #include "signal.h" namespace pv { +namespace toolbars { + class SamplingBar; +} + class SigSession; namespace view { @@ -74,7 +79,7 @@ public: static const int MaxPixelsPerSample = 100.0f; public: - explicit View(SigSession &session, QWidget *parent = 0); + explicit View(SigSession &session, pv::toolbars::SamplingBar *sampling_bar, QWidget *parent = 0); SigSession& session(); @@ -169,7 +174,13 @@ public: void on_state_changed(bool stop); - int get_max_width(); + int get_view_width(); + + void update_sample(bool instant); + + void set_sample_rate(uint64_t sample_rate, bool force = false); + + void set_sample_limit(uint64_t sample_limit, bool force = false); signals: void hover_point_changed(); @@ -227,6 +238,7 @@ private slots: private: SigSession &_session; + pv::toolbars::SamplingBar *_sampling_bar; Viewport *_viewport; Ruler *_ruler; @@ -268,4 +280,4 @@ private: } // namespace view } // namespace pv -#endif // DSLOGIC_PV_VIEW_VIEW_H +#endif // DSVIEW_PV_VIEW_VIEW_H diff --git a/DSView/pv/view/viewport.cpp b/DSView/pv/view/viewport.cpp index c4eaed0d..c8aa4299 100644 --- a/DSView/pv/view/viewport.cpp +++ b/DSView/pv/view/viewport.cpp @@ -1,6 +1,6 @@ /* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. + * This file is part of the DSView project. + * DSView is based on PulseView. * * Copyright (C) 2012 Joel Holdsworth * Copyright (C) 2013 DreamSourceLab @@ -107,11 +107,12 @@ void Viewport::paintEvent(QPaintEvent *event) BOOST_FOREACH(const shared_ptr t, traces) { assert(t); - t->paint_back(p, 0, width()); + t->paint_back(p, 0, _view.get_view_width()); } p.setRenderHint(QPainter::Antialiasing); - if (_view.session().get_device()->dev_inst()->mode == LOGIC) { + if (_view.session().get_device()->dev_inst()->mode == LOGIC || + _view.session().get_instant()) { switch(_view.session().get_capture_state()) { case SigSession::Init: break; @@ -133,7 +134,7 @@ void Viewport::paintEvent(QPaintEvent *event) { assert(t); if (t->enabled()) - t->paint_fore(p, 0, width()); + t->paint_fore(p, 0, _view.get_view_width()); } p.setRenderHint(QPainter::Antialiasing, false); @@ -163,7 +164,7 @@ void Viewport::paintSignals(QPainter &p) { assert(t); if (t->enabled()) - t->paint_mid(dbp, 0, width()); + t->paint_mid(dbp, 0, _view.get_view_width()); } _view.set_need_update(false); @@ -213,8 +214,9 @@ void Viewport::paintProgress(QPainter &p) int captured_progress = 0; p.setPen(Qt::gray); - const QPoint cenPos = QPoint(width() / 2, height() / 2); - const int radius = min(0.3 * width(), 0.3 * height()); + p.setBrush(Qt::NoBrush); + const QPoint cenPos = QPoint(_view.get_view_width() / 2, height() / 2); + const int radius = min(0.3 * _view.get_view_width(), 0.3 * height()); p.drawEllipse(cenPos, radius - 2, radius - 2); p.setPen(QPen(Trace::dsGreen, 4, Qt::SolidLine)); p.drawArc(cenPos.x() - radius, cenPos.y() - radius, 2* radius, 2 * radius, 180 * 16, progress); @@ -275,10 +277,10 @@ void Viewport::paintProgress(QPainter &p) logoRadius, logoRadius); if (!triggered) { - - const QPoint cenLeftPos = QPoint(width() / 2 - 0.05 * width(), height() / 2); - const QPoint cenRightPos = QPoint(width() / 2 + 0.05 * width(), height() / 2); - const int trigger_radius = min(0.02 * width(), 0.02 * height()); + const int width = _view.get_view_width(); + const QPoint cenLeftPos = QPoint(width / 2 - 0.05 * width, height() / 2); + const QPoint cenRightPos = QPoint(width / 2 + 0.05 * width, height() / 2); + const int trigger_radius = min(0.02 * width, 0.02 * height()); p.setPen(Qt::NoPen); p.setBrush((timer_cnt % 3) == 0 ? Trace::dsLightBlue : Trace::dsGray); @@ -289,7 +291,7 @@ void Viewport::paintProgress(QPainter &p) p.drawEllipse(cenRightPos, trigger_radius, trigger_radius); sr_status status; - if (sr_status_get(_view.session().get_device()->dev_inst(), &status) == SR_OK){ + if (sr_status_get(_view.session().get_device()->dev_inst(), &status, SR_STATUS_TRIG_BEGIN, SR_STATUS_TRIG_END) == SR_OK){ const bool triggred = status.trig_hit & 0x01; const uint32_t captured_cnt = (status.captured_cnt0 + (status.captured_cnt1 << 8) + @@ -362,7 +364,7 @@ void Viewport::mousePressEvent(QMouseEvent *event) assert(s); shared_ptr dsoSig; if ((dsoSig = dynamic_pointer_cast(s)) && - dsoSig->get_trig_rect(0, width()).contains(_mouse_point)) { + dsoSig->get_trig_rect(0, _view.get_view_width()).contains(_mouse_point)) { _drag_sig = s; break; } @@ -422,7 +424,7 @@ void Viewport::mouseReleaseEvent(QMouseEvent *event) if (_zoom_rect_visible) { _zoom_rect_visible = false; const double newOffset = _view.offset() + (min(event->pos().x(), _mouse_down_point.x()) + 0.5) * _view.scale(); - const double newScale = max(min(_view.scale() * (event->pos().x() - _mouse_down_point.x()) / width(), + const double newScale = max(min(_view.scale() * (event->pos().x() - _mouse_down_point.x()) / _view.get_view_width(), _view.get_maxscale()), _view.get_minscale()); if (newScale != _view.scale()) _view.set_scale_offset(newScale, newOffset); @@ -439,12 +441,14 @@ void Viewport::mouseDoubleClickEvent(QMouseEvent *event) assert (event); (void)event; - if (_view.scale() == _view.get_maxscale()) - _view.set_preScale_preOffset(); - else - _view.set_scale_offset(_view.get_maxscale(), 0); + if (_view.session().get_device()->dev_inst()->mode == LOGIC) { + if (_view.scale() == _view.get_maxscale()) + _view.set_preScale_preOffset(); + else + _view.set_scale_offset(_view.get_maxscale(), 0); - update(); + update(); + } } void Viewport::wheelEvent(QWheelEvent *event) @@ -453,7 +457,8 @@ void Viewport::wheelEvent(QWheelEvent *event) if (event->orientation() == Qt::Vertical) { // Vertical scrolling is interpreted as zooming in/out - _view.zoom(event->delta() / 80, event->x()); + const double offset = (_view.session().get_capture_state() == SigSession::Running) ? 0 : event->x(); + _view.zoom(event->delta() / 80, offset); } else if (event->orientation() == Qt::Horizontal) { // Horizontal scrolling is interpreted as moving left/right _view.set_scale_offset(_view.scale(), @@ -510,7 +515,7 @@ void Viewport::measure() const double pixels_offset = _view.offset() / _view.scale(); const double samples_per_pixel = sample_rate * _view.scale(); - uint64_t findIndex = curX / width() * s->cur_edges().size(); + uint64_t findIndex = curX / _view.get_view_width() * s->cur_edges().size(); uint64_t left_findIndex = 0; uint64_t right_findIndex = s->cur_edges().size() - 1; int times = 0; diff --git a/DSView/pv/view/viewport.h b/DSView/pv/view/viewport.h index 0d89e9e0..1f8157a9 100644 --- a/DSView/pv/view/viewport.h +++ b/DSView/pv/view/viewport.h @@ -1,6 +1,6 @@ /* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. + * This file is part of the DSView project. + * DSView is based on PulseView. * * Copyright (C) 2012 Joel Holdsworth * Copyright (C) 2013 DreamSourceLab @@ -21,8 +21,8 @@ */ -#ifndef DSLOGIC_PV_VIEW_VIEWPORT_H -#define DSLOGIC_PV_VIEW_VIEWPORT_H +#ifndef DSVIEW_PV_VIEW_VIEWPORT_H +#define DSVIEW_PV_VIEW_VIEWPORT_H #include #include @@ -127,4 +127,4 @@ private: } // namespace view } // namespace pv -#endif // DSLOGIC_PV_VIEW_VIEWPORT_H +#endif // DSVIEW_PV_VIEW_VIEWPORT_H diff --git a/DSView/pv/widgets/decodergroupbox.h b/DSView/pv/widgets/decodergroupbox.h index c63d6b9b..07878ae2 100644 --- a/DSView/pv/widgets/decodergroupbox.h +++ b/DSView/pv/widgets/decodergroupbox.h @@ -18,8 +18,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifndef DSLOGIC_PV_WIDGETS_DECODERGROUPBOX_H -#define DSLOGIC_PV_WIDGETS_DECODERGROUPBOX_H +#ifndef DSVIEW_PV_WIDGETS_DECODERGROUPBOX_H +#define DSVIEW_PV_WIDGETS_DECODERGROUPBOX_H #include @@ -51,4 +51,4 @@ private: } // widgets } // pv -#endif // DSLOGIC_PV_WIDGETS_DECODERGROUPBOX_H +#endif // DSVIEW_PV_WIDGETS_DECODERGROUPBOX_H diff --git a/DSView/pv/widgets/decodermenu.cpp b/DSView/pv/widgets/decodermenu.cpp index 94bdd14b..e3eac36c 100644 --- a/DSView/pv/widgets/decodermenu.cpp +++ b/DSView/pv/widgets/decodermenu.cpp @@ -1,6 +1,6 @@ /* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. + * This file is part of the DSView project. + * DSView is based on PulseView. * * Copyright (C) 2013 Joel Holdsworth * diff --git a/DSView/pv/widgets/decodermenu.h b/DSView/pv/widgets/decodermenu.h index a4aca66a..ca8b532e 100644 --- a/DSView/pv/widgets/decodermenu.h +++ b/DSView/pv/widgets/decodermenu.h @@ -1,6 +1,6 @@ /* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. + * This file is part of the DSView project. + * DSView is based on PulseView. * * Copyright (C) 2013 Joel Holdsworth * @@ -19,8 +19,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifndef DSLOGIC_PV_WIDGETS_DECODERMENU_H -#define DSLOGIC_PV_WIDGETS_DECODERMENU_H +#ifndef DSVIEW_PV_WIDGETS_DECODERMENU_H +#define DSVIEW_PV_WIDGETS_DECODERMENU_H #include #include @@ -55,4 +55,4 @@ private: } // widgets } // pv -#endif // DSLOGIC_PV_WIDGETS_DECODERMENU_H +#endif // DSVIEW_PV_WIDGETS_DECODERMENU_H diff --git a/DSView/pv/widgets/fakelineedit.cpp b/DSView/pv/widgets/fakelineedit.cpp index 7423b443..84e0c278 100644 --- a/DSView/pv/widgets/fakelineedit.cpp +++ b/DSView/pv/widgets/fakelineedit.cpp @@ -1,6 +1,6 @@ /* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. + * This file is part of the DSView project. + * DSView is based on PulseView. * * Copyright (C) 2012 Joel Holdsworth * Copyright (C) 2013 DreamSourceLab diff --git a/DSView/pv/widgets/fakelineedit.h b/DSView/pv/widgets/fakelineedit.h index d6b34046..a274f990 100644 --- a/DSView/pv/widgets/fakelineedit.h +++ b/DSView/pv/widgets/fakelineedit.h @@ -1,6 +1,6 @@ /* - * This file is part of the DSLogic-gui project. - * DSLogic-gui is based on PulseView. + * This file is part of the DSView project. + * DSView is based on PulseView. * * Copyright (C) 2012 Joel Holdsworth * Copyright (C) 2013 DreamSourceLab @@ -20,8 +20,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifndef DSLOGIC_PV_WIDGETS_FAKELINEEDIT_H -#define DSLOGIC_PV_WIDGETS_FAKELINEEDIT_H +#ifndef DSVIEW_PV_WIDGETS_FAKELINEEDIT_H +#define DSVIEW_PV_WIDGETS_FAKELINEEDIT_H #include @@ -50,4 +50,4 @@ public slots: } // namespace widgets } // namespace pv -#endif // DSLOGIC_PV_WIDGETS_FAKELINEEDIT_H +#endif // DSVIEW_PV_WIDGETS_FAKELINEEDIT_H diff --git a/DSView/res/DSCope.bin b/DSView/res/DSCope.bin new file mode 100644 index 0000000000000000000000000000000000000000..c79028f488688609779c96902795bc9770db54de GIT binary patch literal 340884 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 t8Uq>!$}%-b$iQF%C1;#Y|~Ftho+TEB2+au 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

Nt)2WVHVJXy9ohCrz zh5;EM9(Zoe)LC!XI38nS?{}%v%xP?;E9ii0F+TKG4xqx(uQj@mDDyH~Ms?76s*o_WBlkXGZsQw5T?inJCUrdG7~!|^VITIAb6oHP(3nRa~TPvDx8HDlh>rAg;#_R zmipP9iVT9BY2ZWzpdp_pUMJGka<;8rJT(S~ZcROqL|+XosjiVGD1q=}2~~DF&sxq> z>?D4@1Az+G_{c-OObbk604fge$`Yy#>FNMDBywSUb?+z0Ole5B(%!4i1Xh9xSv@xk z{1t&t)u^E2u_Z}v?3zhC41XWcNfwj`fNe&S<>6lXM8Sqx1aPC)87 zxqu7TL@*5XWQ7J+PD#;jxG1FSBoj9R1R%Y>ViU>B8=vwp|f*s`4oFgSzT0M z%(*{J4TR1Lq(IYz&58kwURu@bsc5K)r!~!#qK4I|Wuibv@qm#tZ;hYj2`7A7laJ?l z4pXLsnZafPn+wV4s4X2PW1o47xFRe(7@i+xgxl(+29Ddpv11eknwPL9A;%a@8QIud zGaL;$VC51=4d~Q?UQI8BFI%|Z3u7mXzmVQx2$g5s$Ayg@r%Fz@(bX-(nFPYST~Pv; zzBX}0qA!^{p!G+r7{Km#b|LpYcF7Ft{a>$ZAANVT)3!?xDI{fVKUic%^|AbjG5jyx zafcyR+`O}S?}RyywEG?kzPIzF_vQ|%ZT*CTZH!YfZ>TVzMG0#Y3)wQgMBL&NrzEVE zZkt0#MwP+*g}9TIM7eJ0lI>RdX%|r?SyfR7nYEYm9;+U!?nJ)0gD915#q?$~GH*8K z%^&>WdaZP4NgU;gi)41uX$nNWD7cw^+U12Pptzy#px~KHiizkMr!u2|^`&7QH8gyW zm<#4JL2n?VKbbFc+~?(^`rWtGjrqhj#=p28vveWk&l}Txarl*}i{S$Oi7rM41h4%1 zum3u%LULXsZ@%a7>(voscA5Bo?JZmgy>rh_Eb;Ps{mlBznb++hZkmlrScAb?s_B(0 zSFir~kGFqft~`}JMN~*{>n|%~PGsl4Xews2zrTOqedq7*C^$TPjsqr;a795Y0=k$F z53kqHfYnpbo6a7njnHLdk5S9cpBDwBrK5n8B2085JDYVBP9uC63Ld<6{>XfFH{6}B zGI!b@zb4!ZCn>i(^ON%_VD_0$pZPS$ ze(Vc=*dN*P;Q90C#e>0FP6k08^k-r`j8fTA-D7-=&cyn8orRF5X-5I4S?-dsK!J2o z(A!TaIM_X4l;td9`qO~|^9l0_yKnce>|S9!@qT3#6bA~T!P!pKKX_{wuPBgvP@Fd1 zo9OX%J)2{DzA=U394rY3zDRU4df>E}EjzX*AapLq*v^*F?_@i;3%h?UeVPvZGTzfI zKilRlaBoa{o#ZG``Izdp1Do3@zF`80kEBAX8h4)^YlK zR*=pHcRk%20b?6XEum)}&nyw3=p%s>c!<8G@*J_w#>g0!WAa*KOG~mn=@$^=2MZElk`lms!ura&y=rG%R1sU3h{w4;2Oa~xi)gPNQU*w2S;j%}md z#&8q;7iuPAJ~k(mR~Ia)B4Tst4w61kYP0#=<55;eMLqI^*AIV6qd zC)EEY6myN5RI2)vt5?;l9C(!juX5m34!p{Nzg`>|IlDzr|E03w+X}qga+7iMCG&0P zFtVMlcTKON;e*W2)+S+TmIum7u>6vw&iQf%*%6&FD`K!Q0qWL@NZxzZoBhUqE8T4z z{KmjX*B3rDmM$13Lbd!1kB;4nG{ULRwd0#C<+q*=H4>OUNhE(ZA{dm1YUoxl`b7yn z0H4w~)EQ1DiMk#J-9@Gr=%`yp$SQ@gaHCaWM~wW@d0?2LXnmQD3f5n7RB>Lmg@a0h z1%p9MLLT#20Ajk0ib%FVYLX9&0QV5%acj6Qs=?g|KeF^N=Jcg%RHC~cw; zy@4&E3*OMFYZ}%As+STM1idsxQqUPfF$Y->Yo#q?ZE=?PBp#7VboNQR=K9pp4}B`$ z%FvEB&P{bo({ywiCti3sOn{c(98=>f65If(s+dvFsNzJ#vE!0j+*XxedTS=uBEdEh zltz}fDOSc?PfCZf=?UqOexiIZI%D~rD9nLk*Zc5B&K;E0RFu6mjp~kklUatC71P)g zx3NWOO~GVnYQs9p(xydP7%3axBt@i90w}iu1doQ;)p14`GjXf?h3NFr?=B6eQ%AkO z40jtl@2msjGTiku@N7axpc4)vS(7(N7q-?xw4UB3+-=0TFe;DMl{yod#Me-aJsneG zB9#G6=;7JMP^hnqHi2kKDPrqi3cPx zX$qaYJ4+^YQy^veHmQm#Ng~LK_@TP=#4-|t=cl)nYT&l&(ugZ~tsH{?fB~daURr?9 zROn@@6|mN}8y2k%tzc!uG#Dbyys1akpdD0Yqa}ZS&is>7-@?xZZ*^KR?w=<$0qAE* zvnB4z6KKr3+*0MAaSEnrxMvEJB^J0rt;=HMFryzKS&jU+kfK@Q)-<{^i}0qcO%t4D zM)0(wB*70dEFqMDO%zIvOh&0sD=#Bamt?(xrFCR60%vOvIB9t}%~*cQL_?Bs6V`ykipzXiroPTx&IMw|I@Wah@ql7J zhzH|>Tf+uvyfRDVVoP~uDPde>jYl+O%2X^@PTH)h@_aRDm=ei~DR*Y&aHAY%GiH>M zEMs}&FrH`GYA{Mz6&e*ygjW@al$qHXJaw$WEF-Ii$dMS%rB8=tw44`n4SCF0IfuC0 zsAN{pwFu@>tT{H-Tq&_CnpNCZ6~)sksq;bP5}ia&3{x^dWgyGyde)kB6pfh6D+*eK z4D)Kl)G>oaSGM<-OvYB!`{?b)6!V5cOZE?;)*_O)TqLx$g3l=+%GFv2O zx}cVaQJZ8s9gSwl=F=#t@}(A~vKVBj2n|`Cakh?X){5ZF$*fk zNomJ0V~{q*ATARM9vP0DYBgtsxO ziUaDKmbw%V7cR(HCPxABMWkthrfvjt8In zIr*IzwJ%2{9g326#M2;C*qyQbC@I$3L28)YYjf5+PdpzivNHD+7FHd{CgW>dyF8vZ z%c;#4rd*Dwi_VPFI$5~Jm&_*(Xc-w>tu))$>E`?;Djq9p&!O|b{ghr}hsH}M?!~!) z7BFvTHV=cmq01!9;$58{;DlWD?mNeDt_7Yq7tda9KlR)E z4nFnC-MfDNv+K8+|FHYIpa1w(V&AOM)tX&V!18WyM1n~hnJqJ;it9ve(*P;lrDB@P zsM8eOb#&K{|8G|hu3o(Srmy5*ySRV($%A`8dG)vN{q3vo`N$JT=56c$@WGG#$YGGyTrbknLzPC=ElI}W5t|oY3@|2Vp^m(Jx2Of8-;(NALK}=y{!5{+j5U z&tJZ{d-R?sK0+RZHM&r+hJs(=^EP^O|cKKr$KlZW9AAi{YSO4$pUZ?W#&M#cPc=g~Lf0ljk)dOhx`MW;b zeyRNzT62s3zz@#fIr!Bt{=}SEH5=%A{VS2OAlQv&4NtrGE{qpHqP4o&U`sdqzO(NO zep`FtX70~$#Z<~1>xs(uzvp|thjpl|_dFA(sm#vq&d!(3@56n|CE@R{M}D~&6wwZ^PTT3uWG(c zyxL=?j+=Bv!}AaG%J=hqP}g_geXzHib`*T?_wMW*1`59UO@#v`f2Q|a-+Cv3pFcW( z{{83Q&+I(vAiifq!MDQfGjpk}D9GOw+`}C9Jux4SO7m@6lY8)mFMPo~cksO2S**Q& z@Zh|8-}~OTZmDGJc>NZ^4-V{|zpr`1=gpPFZ^$kv&B)jP>}i^xx9otm{`Z2t=}m76 zX$|h{*f4Loer)fGdG^`vjxu<5MQ--P4d=xle9ky(K+`mvFh#+&gQLznyxu5c%zj^K z{4^ANRM^=YJ{wXfjGZexJ5WGTp=Xlkff7Rt_HBjmyjeeY{)$P{{e8J}Ye7$eIS&P- zWc@e|J1+F<^yYU{)q$t<(&wN=#u{~2yWhrJLajvnqm!AYJkt3kAW2~=wS$oduk;hW z$)cJMc4Fy)5b3E#_ohS~13fX1AX~p>+ya*==2--jj~Z%Gc%mlq^u|5!`NC(ub5DI_ zQ%?>#9upOWV0onG!xl3@sy`3Pl0b1Mkp*RW8d(BhL2HDo7GDMkRX8YXY@rKZ=}l%@ z3uGn3^r|Gmm5D0j$ue(wTU^FOPK(P=J%0StQPhLrU~E)?u^^2I6quN6p(8np_;%xN zB0$(ICP{bn+XKY}r+D?|=fSdst@)Nlu|c7+EdR0#-c4Kk${}!hK1Octn`DY)Qjk~O zZ?1Uc2fuX8dFTRIQ4(XOgTcEp*4DVITRm5%CUZ5_%%oUT(__nP7h7-Hf?Au!vNA0} z+9~oKK3t1btu3i39$mf~InpvRt0poNPwsiBXA2jv6^{$C61$+mEr&(fdY6(I zEKY_vtRYJBtRX^JYhkyOxPxNRRj;%^j&*a;hhV5*o~uMLh?KZ;zGUZiMZqHkeP#Hx z;X0U<^bZNUF$5b_s;DeR8{R$ujhSG}?a)G6wCwp%;-;WBO1vOvXzNU5BR8=m#6qZk zGY2?RC(c$DtYKS{msV4hB+oIxQR8*$TcSs{PA%z+NT$i-G!79pA@l}7oHT?`W2el( zHC7;WYFM*75uOW@wD7HV6fSgKLp>}DKdR^t`z*1H)YxIoD#m6t8aFHMs)aFDETNxD z${E&~FKiA;jY|F^uv+Q!gobi@>CIBuPzuA_5q)dGuw)D5lVnS27HT@r=Y*Tsj1hx` z8*`@MFs4POWep9Kb47}LN(rvxCPp%eS>Wf*yh-vHi9D&3n0Q(fD=^PxKUMB(Q-yAL z?V4DE7TM?;Wr=HDgR5?vZdzt(i)qq8C^A18U6T#g$Zi=nX-Z4^LtY$2v?yG+r1pgU zgHai+7$~$6xvGGPMsdv5X|$~K(cJ1wUWWnh1cJC*-$jd0%2ckP(#|vE5rPx~LWUjAi-s!{ z#9NBoz%JOSnI*Lw*|KEoBA0#-bFLXHkjA)2$`8Fu66$O_ONX|c*C~l|rW?dFa#n{$kJ>W<7r6L5 z=k6+kfNt8@6v=C~``c`l%yr#a$x zKANVZ?XJ1g{fIafql18m~081!X%Os8LR{DT%7+4p^!K-%DJTh#7@GqFqYnG>6eN zr>1FeBrh!qo%*z8hzlkp<2he~sUNzmv;?kvV+k?MPe~I7#G53uo*?JL0YzkDiUFq_ zIEGNzE?>qp(F4An~BmjX7sJJxJZyJ6T&! zf@`0wK$y+WIZ5}ZPCrk!1k*V|g#9isklqQg(={}J&mH*$ew!KfI@@ot?_8k6`bm>~ zi<^Ld{65y^ea+ml{^P^<9e&{O#}Ds2Jbd2=5Gmfsx=Pe<;^Y77zdt<7%(+(5lv6aV{UKRo=v`=H?OE6H(u z=I8g%@1I|<&#teh;L0bzk$vI=is6^8{?Y-FKJoFZPh5TUd~^TRj~_t6l`CKT;tzdM z6#l29{}d?r+IzqD-mm_B2swN0;D27f*{q*>YW;Uum-sciHXi~k^QR8(JCOeN-#R?( z>H%b2F;~8C?@zyaef z@L&Jyr$2kIpgqeT%Jn-Qf5+pyS9cGedH&gT{77^m`W$O=Pjnyg#m0WDFa0~s zCm%U~)O^OI?IZ1{esCTn;{R!XUuOfHf^@R;|JTdN$9j;RA8E1YgZ7KkLkK}9$z*-@ zlorowt?q;84`?>>^*uY>@V;~Q9+?5yu6XU?cJt*@OuNZ+x0_UzeDeJXwS?QfTVF0l*3@PRpd=DD5ccFOXhheEhS z|1f1hT)lR5pnaq3$F4{`WzTGfKwfp~&h?!g1+S%TIi`R;#2v=Yp(wa^ctAmES)%lg z^d0;ATNJP&R^gmIqbtIwSokBWLtYC`x&MJ@j*#ac+W+W12Ro2F_#f8(VH(+!J-=6u zu3U2uZr{SaUVr+^>v|sSy{=!2ODPH=-hcMtqlbv8U!TlfXMs}6Ptebveb0M-{pX;7 z`rlLV8u37jd>=cYm>=%m-+5Je?GzMH9=9n#q`tDrg}vAH+itl@FNAn__MxLYk4T%! zEMM}piy5Orj0S`Eyhm^ZFH?4g?%i%#Z0MNS9&%hQwlF%QdJLx(xWyJk{Yq064g1g< z!7Z+uHw<+Vn^YU#FZe27(Di1HM5|A#RCD~Ul<1&rr)|G0J_aBJm51~zggNd1HrAHe z9mjA23{k=ZdjdK!wKqvBAHMLRRgWKU%$MmWS=s{cY@(T6IM`?dcuRFeX-ZwL-9x-2 zfH#WCnpV0-9FRf6Z)8$JD1a*b4pXrlD~EF#f*#E22ji)81*IXVzR%pDCtb$P)qxaQ zCU(3Mc$m-+)`Tm$%v*v>=+-;jgrQf1Y%TYxEO^lsv@Gg2xhreBj!Y@Zp{$u)3n(GA zjTU}8wuv!T&}gx5#{*Vdk{ZTrcr(YBun{RK!OL7)l|+&y^quA@Z^*=-<_JlDW|Bb* zH)A3a6EtObT0yC}q(_Po5sNl-N>i@_nO%~A*ie2frnwRoaI6i|Agr|f=FVYi5@WTV zTOhigfaqq1!cpKyIVw_^I_6!5P?QurY zNf)kjC5Rqzah!M=U@+NmtSqKB&=ed)ZU)Cx+}R-3$0oVOJY)>2>HVJ2Dd?684tWFp zj;9^Ag^L|_WqDCI}A=L9}2~CX~O_8)lJ8l>p=LIhdyN z82^K0#7rqu+D+cXxD60_k(v$N`l+#&FqL$bO9vy7?h#@D!FYzNF$C4;evNcoZD7P| zG3$|P!kaE?(8DX#5Eb=K$;BPpEQz6}BTSLXmRgQbqlG*4eH##41|JZ?V0KL!@({dm zVRCoFZlP7z!t9mW4JimG8rMn98Ow1jLTPb(L!Npu2@J7Z=U9oOfFF*JRz_|V8V=LA^3U>XeW)V%v(byllyeWSUx(D#Y@ zk6Ckq9)<5+@ann%`lvVI0o)K185_(IGz4cKTzupS*Yn%*(}fk@H6hG!lB-oeK#Fm- z>lDtm2U&e*6(H{(pNOroUQY{{IVpY-re0Z#L65%w#)skEU;|2OqoMUmh}Qdb!~P@B zL<6e(?88W$3$vu(8k@q*nOV~GBqPy@O)PkpaJ})2IVv0I+lU8pp`$L9!3BeVDNinW z(b07mG)1#Y=$+%8MIJqL+RGG~mm zTO1kt5Hq_xTTtoYS-5LSJ6;l}^@26wH^I$j6I0uwuHh$xdfxGFOlF-+a8EfhlE_hb zt>_nZN_yl;E6M0e9sn>j4K(zaleopzgwzP7VYuA0cu8(>GD3?KZW-*vgfNj>dSv5C zGR2KR!CAulBxdZqv_kB%f}Xp@7&+UbIWf~%W)m&Cu}uW=)B-=P7$_B}5}03Nd8eZ| zW!7pn2{M=U6K}~UGtE4BzA?ydbX==}Lr#J($nL2pn;BBAyOf5&eCg?G+MzG7Muq~L zu{6;{B?&268pUeF!lYC#MC)wQ)rm9irYyIr)IwU+r=CNkthB{3!u zC8mO>PNr}V#eBG-lio7xaop2wn$oE=ZZjk>12Z7Oaz==0LWUSG7Rs|Rjn~p)y1S50 zUYW$!Od}|jwWpWLoMc@k)x=lKJDF9@Y!f;mHnuW}<~pRLiK8c~kWqESL>7}FO64sS zcLUflAZB0;@tS0g?n#@%Vfu&m!b2{=KoPpwZP9^*H!l~k(`llb5K|IT2l;Ulms#1Y z3TtT-EqMn|n30~FnN1p1z&SBAp2J5HWL3K2OTtPJd|Olc7F)wah{4~|PfWXN7@60s zL=%@jF{?!j&WOd0jb9L^H5DNx4M8x_j@K4e8ph5E5<{IZ1D-KIn%dHuHd*;%(JofD zF&bo$Afz-0FCJaICo6NBXh!Krd1CV_Ro%6D0*lf*spg3tF>wOK8p~UxW2(%6BE{xU zKW1rVoR49TjUB8+gaV0y0Y5B=zz;GY=sXUvAA1*81|!+HAqO(C=+O@)0%e0%OYln8 z#twA^ETf)7&m;nQI&>~$vW@e1N+i31wFFeMb~)yZ(xn?Nnd69B)=dtk)2PXqDVj}9 z%oIcv5v!#@DAAQb(#Hvl8x8D*22^BD-QN$rT0I&~Nv5kr-vYe31_Xl?qMJ%^m zhPROAkMnDjX`HrWism$5wiQ07@nXdXj%;pXIB6DUJRz@5WSRbpR%YSG%$N|sTtPHZ zY-YUaT9{%y z@P?B{;d5(JvdJX1PgUz#N$b7z;UG>%%eM5R zLL`=hcT_<5P8s8wC!Z1=lWZm?!^b&uU=$VE4RfUf=KCmV*qOe<_ZYW1Q$ZS{VnwXO z&WW;WB4-?X4;B3yxGh`WTpHtKL^f3D7SZ~Tl(nkxp-x!^D zJE72wBPPaR3KL~@HJg}W#PoLLnv@;^4H8Q{l!}5>F0OKl znr`k5H%*gO&?c-)6d0KR-OdkBdYjwBT-rI!q2Y2aOx&T@*emp^3Ug~TErg&D6;jZd z*h8Q0?Y-d*Pnajo9k2h5*Pj_2aAGYp02)wdE=a2_HL9**@XezjPOD$Jja7P-y0d^^ z`&wgu?8l7xZ{Vy3*Z-IYtGNhaI@j_^%))yc&s(iAcQ6-HRm_t-v3~O0rS;|gcK@0v z2m~;@@tsjXbuoNogAxT7G2Ou<3ZxTRc!al20oLza6}1bVqNLNm^ANUteCR`W-nl+& z?rNVlcRkIcc{}j|4usXqpl&ii({sl@|H(hOLka2B5vkOi%FpsV&4WFdrT;n4#tpms zFy9*<^H1T}PZ|z{`Fnq_EFr)=&H1uVw|ALs3W)qTcKn>8Aj`HWAO`W-aB{KP=TVI0 ze9$Q+fui1iJp~som@m<$_;>4!S@hC;@sa4`tS)l5KSJ|U)98M&y}LiF_L=?9lsco< zYSzy@vh$VbGlag4@&3EI(`_Hv@6NydTz?MkGkpjTZ1nvNUh~dDn9bw#+Rw7WIQfRr zbmTf=Wu@TZRGRJ#)kJYgZO)mI`OckiW|8=G_0F#f5@xX4mR3V^)Svs@nJ2r9)9jwy z&+LBSe(9_x4H7TvIH&j*tz2!7>g(G>CX4yGecKtZCXbL_A zw)@b7(sj0Rus6n@9sKP(gSmg5x$i1!10j%y*WX-!^X+ec`?G=_eLb8QWe(O4g%Ebn z-v6-R3Qs&>o{^dSp9^!%Jx{(Nw{BipnAcGNmk-Qo3e5TIC|H|snj0xN^HAWy!9h3I zO6ymdh%BbJAcd(7Z)Jg0%fPuwnqcO|cjkERtJna0UG{FCpmP}!nx6;9Fi&=DbI2el z)(-|97Le%1b(XF7^$~121*5+n(AgWb4f$O+_5?2@O5A-9vAy0gy|?`T?7e@iCC7E= zSJk(gzLz`5+$&5X|6xegS|%6>67(F&Nf11Fsz)*+Wg}=5c(AcxfwO^@h=2v;1tdT~ zOtYqMU;4gme%zM?LYRf&e##0kW&x2f^oJctR9_Dw0XBhIz-thJft9>#fQI;oo=sA+ zX^J(r@JKf1e4)v2m@5JtJtL4+9y0Bb|HRuIXDz?u%PAaV@M89mMf7jav1m8coI}E8-s2=le0w? zaIqXsy)YP463k?V4#7&?oWOL|mqoiMJv6G|YgSzy^bvN5G^JDQ6DDPXJ!Pd{(=${Z zou;oomoxFR%aDsNw{hW^poAN+fu2h>B9jpS&mH{{`hYx$DX;M!zBuL7BL(wht)Y-7X zhY~6S2IVBs9o0PaU+KDU%BDc*n{`xabLcpJqo72!KH zOn|5qZ8N7G1AHnX@;dLL7)dF4YqYJd$ffe&&Z`$P30a;M7kOOQsbQ;W2LM$#&tn>< zZ4oqvR#Tl4^nzjhFid9NV zQK8XT)S)Qj@@QR9&4=E!ev4pQ`(i~(tIC(5ijb(v;8QH!BEqQhm|(=0%yoQOa~1s~~_;Arh_A13sys@^q)^~Lg#7HIp9_ZT825qe@%W(;1X zxI@GZ0VNua7Qt_8Y8!Z3>NQI(O=YE$t4U%zL;u$)K zxXn?I5+wp8de?sAoMAa6)gHPUt?i}pZP_iyc$k4#RhF%hxMmI?22@b3og<$2Q$`gK z6_?UGh$uI1g7JK8sPYl|(ZZNr)i-tJO*Caah4r>RiW7bjg$m9vDVF4MnMUVHkwO_D z=$$}DqiIe|5PZ~|jv;I@R8A)d&)cx#WmL>r;Y!defQ>H#TEf&hn^`yO)!Z{P-4LS= zHGHc9O?+Qd1eBaVN|_LO3Lm9rqgPtV@Q9w=6<^pK{yTkecEe zo8=pH#DEQhL7H!G853Ljb=9+5F`NqR9?+J7qAAUa*Q2w+H;&?iSvaC)+oG!awq;a~ z@dQyAYoTW_WXa1a@-Rldv?e_t+h8JE8})obU6d?aHjENC>vs}<_lG|4)89?AxdVehH=+8mY3IO$nHJ1yf#<7Sf1`O@7~y#vVB$;5ioRPqER zK{jqG{A%*Jk)-z=_$I|}2GPB#r38CQb0Cm0v;T=5i+c4Jktg7Lr8)wpM_A&dUX z9_pqEV8DojpZ|FZvPYHnLO(Ib{RER#Gwj1lcZ-rxDUkLRyj3bYzcVkt{Njt(Z+H8D z@9%w)<1DW1-GBe5Kdo5oeEM5C_SyUHOS|2Lix=*Hp?jg*?cX+gz1i#TH{IJ7e-u7p zE50V4;;C>%ccp!bT#cB}Vji@OdE%!T_^ z{?A^1_VR_v@k`grTQ7)m(T!zC5#+A`)AMonL-~KIOrZv9HjN1EWCt+yhW_z z1e;e<89AW2@1vA^{qe`8^_=n8CwKp)V>l>B4(y+wr*J|saV)7_;rsjV`T5`8`)yjS zbJxv_FFyF-g_q99JL}rLv^&0tPWkR7^U^Q#8%s|(4?mpuj-_2CX?)a_<*n%x4R#ey z=5S+|;N%u3&poH7RU;Q#&-=YNNGpSn_l|eR=J>)(7vMmwXOi{x4?idy%{iCK{)IE| zgN$?ceH!Hxf6v6Xt%CXA{_gvOng7z1fujHOe|_qw%zv41lv0Ybv(%K*@C(x*dH zNeR3Om|oaQBW2i=Hnx+eRknZ+WHTtOlv+%wAY`aLC?uP8FvVGdYix=`NDJ+leqG9mr~k-YBy~^=4|=K3mF)Cun9&i}5-Cnv zr1iLaF8Y4l2e6S|q^W$6XHTDolBw2}_kHgn5Mb;u(ns;w3uT~7s~548Cd55V5kxev znM+`TP2E6aYcBMEDV4%{LTX}=mjPsp-UJVkyufJ6k@myRBNL_fHZ=nN~_#2Rc)OPUnZRzqYVd9(mLGooyZayYeBu?cNW zy)kt~fovViy|zcIqsgRWC8w!L3DIp1QQ~4kO{qF<(TmR%cdepkwu}e9pnuPx0p*|q z0wf039wI|+)KksG@dlb!Q%Bt*hY_Nt%0Pl5Ad3WAoG-kFs04IfDL$%WfF&kLT1tu^ zDW|%{QgHziu?!EJ!ZWi3;0m|~fN4Q_h$nR&Jqo=Q{dsr|^ss#(1L(r44R>k3_8##` z`R*Og7QZm|f-BpRIirXqA3j zdL)NFdZUd*`ZT9r8a98@SR&$$=FnBex=X=arb(}xWI4IbhmhQ6n7|~SWN_jGC_tp} z^<;+pW(vbAu!dA=drFfxcXQY>7g~_P0tpR+RfamlB$T}kTe#}^u|v2m+O;pj78l>f z%!s!P)U0jYFQLdl58P^cHx!3O*&;A@Yj!H61=7x~O^R5~G58?ispCyOTTPD|d%&RH zLD7^xQjP5CM(a7~%k4zUPV?n*sJh4~4y0mQ6%A45P*nkuI*Wz(v12?TqVEF_VH09x zgQs}F!q28zRy;J(%_iYs(K=pt93fjy`i?_u4T@B*mmIy=L!XI?K8kmQI#!6HXD&mH(T<3T?c`tPHp0Amn zJcfJBq06Z|>KXMnumdfjl7x=X&G)CX>w{+2^|RHwT6SiFJl-`GLo0O){CAH#ctl z#&76S?_Rz0#~%C5`(C>6ZOzphI{#Omdk%?_iCE17Ybsp3K*^oLfAcqgQ>K>avDXkY zanC&Srw_#4WTI0sK8yeR)lLBCwZ~Cs-VZyM;A`~%@|XXoFaOnFIj8HBH^jj|qBk!N z?z>O%#DO?_H4gUg;=nxc%rg(b0aDldIFkex#*~U+qZwH^!^4-q{2RZal>TPn_#qS? z9?%KC-}=@Az}|De_G^FjS3j*;^b=6+kTFhoRV_XA5LTSr9~z}SEwFvy%MW~cfA_#M zY4+A=ghJQmMlv}7hc6^`;rwM|E=SElh{CtO^BvY6?pWje*lzz@@A!`r2UoA&xN)8X z&1IhDU`!X0JGBSqRN)};b^C#5UfzEh=~AOKx@OepD63m@m*P)`46cWi%~hwf2>v=7pw=HtUU*)!%`bMR^9tuU^AoJOXW{vO3B z6*GQ7v-&se=DO+r)h~U#+mQ1|O=mR_`KbAZd4gV`yLOFeB{9t)DMH(~#;TmPQsm3POF zcW-}ts=kyOggn%fB+Hs~`F(BoN)9IAK>aH@V$yE87YC0d4sMy^?-zeRalk5W@j3xm zNDBuKBQ`(Yee;_m2aJ&m1`cF}#Lj%<8{d#!qj}j(m1Q2>J(wbbvX}kyojwPJE4cXh zTfZW+zW8vCDP@`wkQx$o+`EUbyf=BXuhgyM{oUh_pPui!dwIuL$;iPNIdgE4_kw(& z^V}FB^OOVA&DCbka4`RRt_M8f=@FtT{DcGSaKOr2aj-N;ro~4GB=UL3?u^G3cz2bU z1!3YOq`NWEM4Hnn1gv?HXU0n*qkOM!D+3>V zzS2|5-E%oK3>AYSqSMq@O#E%=uP9df(R(JG(2BcYPColtnEQzEIDAdJNRJ{1d)ujJ z)(I6h#MfHZ*dh{`Xk&*%lY|{1Bjl)>STZNIP46jHTMKp*j!22k!%P+X*fOl+Hzq{y zI>>dE3K2ei$^@m6%a3kKF(e@Rbug(l(1XI2QuM>yt&_N*-^P@57zhTKy=sYtZQ{rr z{kugUn2Dmq=F=)L3k3rl=S$HdX?juh)_ddWHF+f!-Nu)AZZ@SkYUk!C90djx{E`k| zBAjzg0(3{%kwwf>e^7|fz+oABvG|Ii)OmAeQAHdTSK$fqE*3=S0{yvu8BJJt=5Ck% zaMrdf69YdDph1J*iZY)R2`Qo==cU#h0xP+cD_e~1+5Auc=h{`_D$=0((R9$nUrCeKZ~STmlb#OCN! zgHC5(BwDgf8_+IFY$8R&EAT8FI|eViigSH<0(uk01k9-48ai$?&B?4p@^) zf=OStt1g5{I@r`d| z6I!hU2A3{-3tN5LE+7;6sHtrij_maaFrKWgsk0tTS8?`kjh3tDoxMqZJX8(Idd_ zrU69Jo1ymHqNd%1eyWX=7{fSNwr(94hlH}%?c9{!5VI~FaaO5CM1q!FCKi-5z#Azh zvzlx}@QcZ2R@DKay|kVQ^BUa+f~~cIXVSv$ltnGZQD%vrYp5MKW%kvOJA1I?^xF-O zR?v$QB+9l|`C{#LGpd*llkN6f6(0ZeQZlxKGi#0*F0dd#BK z*u|i2q?CI^dETWgT9`!q-Qs{(LKhE8$ayZ_e5%Z7A`abI9!0>!Y)a2mIjaH!bMGA< zF`3KISHT}H%NSQw0qoVte^Z_=-lV);%etsazpUdXJr-M7K#klpLdf>xruLrZ15}ap z^ywG?WRgzR$>`C1>F3iW0~m|hcD3wy(b|=E6XaB76cFZHQ`)vF*@SSuX0Wk`2GiD5 z(uU`XZ*pyqY$(}qy5s4azyVUbrGnMico*5go%XS&ICuaz!Ardk%1vfwYKYH!@sKT4 zmEz%&7@GSxXpXeJSjlf$NWGv~@s>e>fQH#A?rJ(^)ZgO4=$_paoQQnj&8Da3*z}sG zo?!+Wu0hGI=Cx=$agu=jC1?wVzd%+!f{Mp*v_)sDHIvfQfcSMCjXnB0xXz#m!h0a< z5i3iooDXUp*z3#q=v11U3F;gsiV~}1R@8dbClN|C4iU?N*(fj!*XF?Qat|GGw<34jA1D4l7 zVtn9!nSjE%lvstKp1J1U4YJn7a_@@z*+nBMoz5|#n*H6s{T=t6@9e+y-tU5Ew%^@; zSH72?zKv^Fnp+p{ygz!un~n(Rt4l)u+zmZ~9}Kja+t!;TeY+d!;YhNxFt2HrUf_;& zf7JY`m0Pm&@6r`19Pf%0gG>kryKIiXo^ANiJlN4pQ3ZKi0^SMvWlie7^y2*&IfT}* zBiQct^`{@+m1Td2k-y!p|K>N*Hcv9KzD3t>9Uot3%cx8z-}iTK-KiFye)_^4`FwZx zu?N`&3ORH~$t%@JIy@do-ebI5$nmmYzkU7oFEf>Xfqkx+L{1!#SabQ-3orC{UNG#( zmN*z^-HCB84))*rR@K6#OPPb5s@gzKZ`{pn^kFyfU0vV*V1Mn-gBimzFMo??aM))H z&m6aYxTbZf6^+t2_G9gX_3n4e{}M|3GDmp&>B$w@Ng$eExeR(HH*GMwk&(m4(;U7B3sJ!}fghLeW5UAiEx@f}Tv z$Xta_Hre&zaY)Uz@g{Z(N8UN%r&c zXkFIgh~>g$gl=;z;)slYXIehk&eCyQ7=Ic9N|(@_2Mhn2i^8g0Vl@SE>$u1gg#^TO z*Uj_yWY{}@M8Bd%zMWfFwvKN)pSkFG+wut`nm&agu*s-5-LhlB;G`ohNGLR!^an_i z7!6k-Aa=1+k`^ALl)cEslo-_yzEOv6$44-v!aAHj0-|9EItrQ=&_Yz=5?y#lch$4Z+2K+FQb`rJEHsZC?9lGqA$Dq_5S3w;)q~CYIfzv(Bf&F~znvB`qPj0)05vU(e}%u`g-WQ;nf5 zy#c40Z)@;s5;EI$y`EaFoJC+Yp4@7_7O8?H7}Mbxl^VnvpVV3@O0hiiwZ{zP7L9S{ zdXH$xq_A}z5_E59yR^yHOt%dAbS=bZG={Qf3M(?rRk>ww@ZZ2)AE3v&Q%ag>2+$hY z+fKJ;>dAMsUX+1}=0agO6$I{zvZVkl<aE;b_9RkR;@zP~z zsL;8qyf?n~N-YgxCAqd{kb-BkEIgBCYwFykszFzulbu)xEDfWgrKJR(GnMjufm~d7 zU=;{U(YGxPwk7X9lhGRCpchLCG-VQ)Ny|9|c6!|HhF0F2gH4NI2KgTTAcEx22!mlh znOj9oBlRl46UB7Yg&MzA)sD|tpI`p8NFG%7fHSMI32_q+OWf?3z{F@D7TvUF(1gu^ z*LCff7i9oxx>_z5Mdy8lT9FzX(lsUIecjDg<=O||DU8f6`a|YuT^~J6fD)Fmn{SHk zBx->(?D$wMD+(BiH}Htpreod#JnQ)}kynP5T~c@?#Er$_X3{Mz0^Mpmt@J*SFA$jL zHWrH%V+y3oUzpN0`3`kuDA5$4-b}pdZd<6tzf}2JY){raz0%Zi_k0of!23q zkJgP@>a(>*i5=|2wZ&b~y`y#ZUGLcs_z?TrAm(@<%6{%UA2<%Hi%TB-xQVOCvDni5 zKWsUlCo;S?)rQsRPa8xj@UGwJ{@}Oh^&s)4W03HiX2NP3fL}?m3?EXf@aBcW7jC?^A_Fu z-dOU*8vYr_>KQ*(bLx4WHnyYv`p!@o6{m*rs@xQt1ALnzKykx%-}Vqm+lV3_+QESA zl&(9}cF*vu4+JndaIq|nA*sl?1|L@fmTuwK&@vrMN;nRZg(j2|BgPS#+d*y>BOg(< zWH^|2G0vz8x8n0mp#aH$Rjz0}RPUT5sHPP$JT4#+*2okBV$>3ZMX64vPm9v!HVd|KCJG6gg#M=FzF)NQ zziN&N6XZQ|vt9SE(}n-di=Vyk<(FQ1NqJST`S$Gx9$=!CeG#62Uen*2?>6Q!W?oT| zCH#>O8_!RGDY^R-pM}h0`&xy}x^`neFN?qh3!%sc%%mbRGR|Reb4*e zhjjj_?sv>;q1EKb*0_W1AoS>kZI7}&{wurm6PSq z7k~dhzyI0GFTJEuBI%-Qu6F+x+94>s8>1QT@}0l_II9|V-(j8fbuidF;Pz8bG4ir| zh<2zF(kKSyvwQ5Z&wpOyDS8e_`{8{gUE!;OfSB&A!r0r}+8Ul4YSH^058bnu`(7My zCepFyYT>{zZ=N{d>>)UK_A(r}-G#Fpun)ss96a>UM?d=c&x@0k*7XY?lc~De<7d!K zPyS|~F_}AejQKs@O2)jIwE#~(`P|<1>lazc@#2dYcX`+BT+70kT*)o)m?PgV(x$*X ze(K${LiT1)PrJ(C^ZV$>Q!>|&(W{{x5-8QgLAE59Zg9}td78x!T;kx;rKWjqPo=1} zB<47CAc_hX2iZK{i33r*c>Hc^!R$0{K=S-QPc3L1A#*@EB-ld$^G3T&d8(jI)leDN z=1|=ojjie?`UU~PbX@xNF1nsOEo$Liq=$J(Z2fYZ8t1~#wlGiF2;FF*e}H_NT%I?# z$L7zq%G9UE*CrgEX>9sc`m%7xXJeyhw#pNaUn#^+w*-DLlTn{KN(1u=FG3_Lpn$AR z-q|g`4ElVJ5Jn3opE&`2tkW1adF5MXb#~(8BUW9W>l7Hm&tW&romd+e+lW_$g6Z*J z5u(d$Z~@r`c?egZhCdp+U@N2!j{+S+heCG@h0{cF;a%T1-bDjgZ@i=F!?s})BLm0! zy9$1onxt(}&W;2T-?-D=W(|oF2WeAxMxq@5Lt}W!J8*am$Zr+sMtiLj2n@n3B3;vk z3eb`aiAG7`y^=80pY8&3PF_@D5nG23&?2jW;e|zsVXtsu0py-XG!&zq1%^|6%mZwx zG!hnKXN9EAGhU~LR}&+cNfkTZHgu;E=dqFUI#OMWBgn6DNxVjKfVHA*L}oB&?P6PpBKH28%Mi09io8a)8%=ZQ;DQ}kcBNd_8i4)J;C$BAC~n0iw#Qh9D&Ml zqaNK%=5nXOlaz-l00Vuf0^3DNvBOe|b4Pn{p2{(mP3@>(ZVYL}+6N>qK~JsFft3jx zZcSeoy#=%J4u8Wm7__uC<2K9#o0^eIG@hO~QE3H4BVtjKJsubu3%Ah4tj?-7Vtqf^ zxJIW-Ne+izU;#Z@mmsio(XC*c{I*(FKvtluccBUj2&%ocYK@2v4{a(r^vdz-@ew!) zsR=BVrU5pZZm)XkMGml-757p$y}Gs-p0--M);oq`oJU6ENaNXxhQHeS&V|WD?b6RZ zs1%Mln6Ahiqj~7fR-Cfr3pP`jd$6>Of$U+cCzD`IjL`%H30S3Mfx$djHm-|@J(yuu zmuRl@AQFrw*9^S~aP=$zRK$caiH?>-xb5+BaK5%%N1^r-##FWw+Yv&|QeFW|uwG?F zxvjNfz1pNz3j{D_AYdQ5%^^k69Z^2XPcga_Zmm)wFXoV=d3YFUJ^b_#(pP3e)09uA?E$F+=)@^vsz;f$3Cl*Gr3_#tWs!i%f=vE$y;B^vj;nfg*IJ zU2k|9Z^(`5m^0m`Y{_MThVx=QU-iK^o$>1}y*^~Rqis#W z)s(w~8Y4jy5F@jV`s%H(dRnw~$g_+$n?T`~Y5>M|+<@BDoZNR%Rd8^`a7qJZ2QRIv!5-OdlksSG zld3FvOX?ByB0)|a_caG;ixLM>TOR(c=XKXBjU3VF;Z6;a=cY0q-zggJ-T>CqDseA; zvGyDYZddTYTNBEjPz3s{tU>E+z_ZisD(G=7BAY*GR5DV6-0Nj)}>X~Trg^jc|;BIe!?>(Flm9+FVf35jw$;{#{&o-Yc0DSBE$x8;M z?*7iZ{B0&v#dnI8=BAYiF_0jP91QYw;y`K?nS(Ny!3E>s;F_|c`D@WiGBYIZ&B3$J zUb>|5j>G}y3B4Kz-J{piOm~{`{#~;&%uCxRXr;)^*&N;G#kiF<0!9v0-{QcWaBw~0>L_Ey zzkN%(`vV6f!E6#K&5d8r0~(LOf&%Wvf!Q-1LA+8NSxi112%%9qoitF)4Al;qYBOU8e6)Y zIuAgSyD;Z+2z@CqKra!8>k;bCx|80w7O6VAn_2qnD% zO@0>Y9LLK*AP6PhVmdLfmS(274;Zu;!8rBKH=DW6d%#J1NvVLK_%Z!xR4GDKeFsx? zNXl*5RU+L(xvhvy;vxapO0aIZb=f|_1XO^pge=74KQu-aV|NB^%A{t1x|R+Ksi4?r zKKN{3_!)9n?a0-}lfDlKE)9raraR=aEjjObJIj?P8#9CuD3R%0HIZ0Zn9OdE(ecc9 z=e;*Urt?Km>Z$;I`Y*3XTJd!VbXo+@$jyp4Rq(XP5N)8pzDflF*2uRkJoDlAtpkg zpi7s-4A@ZBJ16It#o_ zTr?=X8B;~oI+`dGMitZ)OcA1(`VqrTq;7U8|W^hLpU;WC))FT>w2@4|vpKPD)RSrJ+ zg!{pt)((P8NWlkekxOp*XCRgIZ9hy-OX$%U#OE2rDN9h!!wEu|oDhnj@YxgibRTa@ z&1OfGP2;$7`|LM%EQB_~21^^cd9DPCFkXY#U{vRwr>;nhXd>6Eg9gWeoc1eZN*@Hzy>3FLIXeM9D};4TVp|7u-g$( z=X@z|^2M#za#GWp@$xwBGQe8GP^e(B4%@@zchcD}0;PoxXGVZ0pL2nVAH~nCTo;sJ zPe)GAnJhQ>7U#}kp2bo#pO9`KquTbxsG+;K$&!k7zfVy*K?BADfv)c=sMx)o|EqJ7Y^*7wS-i5RhxhF=#XoIyYTtjYk6QadphHcwEMD&8NOM zhS{_*D+^mmX_v`IzpPi@PY7UuU;~P;eX-F}IunYH677oKS6=a$tt-+DnJsB3k$KXH zIEl6_3V5|u<6<4#yqpAhN$o&YXW9D4MKK6OlFc9)GvYq(3 z75)S#gg2~PJz&{;!2^v>De1+cC}Us&H9Tm}!4Q!O2V|vgmRpp^InrrqsQiLwIp|+z zP6|+%ex3DxI%U#`IeWUL065eND#lau32*1;a=k=)%s^30 zIFgU%@3#wQk7!yvSX8gGEJ9}px0ufCs$j~EDln~P?MRgLXC3p);b>DG7TWx&HAUxC zm!X4Iau`U7_Ph!lnP9tSx#`=U!>f|7XoXauYRZ8vx0uAM)<^!x_Gu~~tWDeN3sW?$ zn|9bdIVEB0ATnsk`C4`3eVA+)v!j5Hm8UQbPZ)R9wYx@uEzwBOi(tF&c z9Nv{YPVE4lK|K5|fGZRNTF(i-&3QVHm>XuyTsp6bor`X3rE01SrW|j4@*>)=k3II8 z{N(PDhXCP4E@=g;X46_(QQF(xMp+aJ7cc(wPe1d_z=6<#kpsi)&HwHb zPxyDe;~nz9n*%0JGcQd4^l7E-`zELJix-|po#gZ8QA*->O&nL;7LVE+=8L?ZzG}Vw z-%oXRA+MFQzr%CIepbAjH7he>wE@?0Ce`){84`2K+b8Zi6k8iM)limJ@E?&R*Cx7xM?0Nl}&)m6l>FE?e zq2#sRDnEr(Md{qDh(2F@F6&0b`34z3m5L@;E_`f%$MTMOy2zFD@sWmNaI%= zBt_QYO*wM#?5<9nKfM3lFA4wR?#`X>LJOt&m*h@d%fiy@7d6ewzUP{CzP@|sJLS!5 zaq{@%GB5qhHxH#^+{2tvb!phO>e3hA@}$bZzx~sXJp7q=US*Ouc1IsLKofvH zqf|C`?)=sn4%qWL;a}KYfCDjgg+gbp_twb4bI*+&T>6)yAo$E>y%BOPhy%2%_eTzH z-yUZuGp^KCPT4a^)VE3s`f!(TC8GFcczixEu}AV-623 zzJ81*6d4TgCh_f9r?rEMU zdQX%$+*9Az+|Q9sU+=RZZNL$#WXX3~2l;vUexBkf?5rynXih_6a&yIo)Fh@_B})-{ zZ!rbylR9X!2RKlSbUz~45qzHmHi^_cy^jbrxJ?T65Cq2fN(V;i9d-E9VdYMXqmx>L z2&zTN%tY%kacL#!Q1Lk{>WSdxO&ff`EKh4yanpbT_i=h$p(935QVMT97Uh$)TiaYepB&9xzo+7xu|)a!L($n^LJE`d*X(aVLbh{`~&48;{4-Kij}d0AoRXA28- za|H;W9&}2VB#eo=34{Tp5ShIv)gmN1xXIT5ImzT6^Li#UBZbWngRbM?ljHY;)5W%p z-r1PhG<6D|xMcd$)d_EoG^#2SQcdSB4O1`ik;e&;OFl)ZLM=!C*u0<9gzyuzAY@T8 z9a(0FnYdWm%J^uVtJQXq#^{J$A2x33!>voPRW$+VL;(FI=PZmw{9t3e#7n2Y@^MOQdJhkLmZRcqbO+Z|u zRy&XgW#T%Jw=Opga^AYarNx|-1IttwTMr}B`JS{n{|LCIl~{*%yJvN>&*dofP6ICB zB3?kiEm6=IA8|$#F>#&1&`1V%#O!m6x5nWb+JiR`;7ZWwUZ1otaD;c#F4WtfEj^wn z2TqXUQ6$i5%`BciU@x%jo)cawZ4Nr)p3V+dyi}t|j|b@9!fqOYz_Nrw#2nnqvYpj| zioze?{7MiwnfT-<=){uK+}~69<#ScxDyaaUeets8DGAfqCEJg>=DKD zFr!0iTcMj&{Z%^UHkcFlJyz2|HPak^$(KbbgQg#emOU0r88Msq9fEKzPI)+$LpY>dOu&n=B3!7V?%#u+@(`e#t62IIZ4N1Yn` z#;(>36ZO77LZT;_*2Y%kl-r87!q5k=EnZ316GBu9ANqC2j`$>FJ!3$)X%k75Cp0%K zr3g^n$xODOM;IR!v^hG^IA1?&C_JzO z#auC}hg47TZ+(Z!=4fb9D~SZ7X0B@0855Jq9kX{4!%VjL6TvN61spt8id+8CMU04I zeU#;9BTd`;uozRzouv8u2D6q%Z9{m?`dHd1NaU7#`sODS)oN1>KFO@Eow$jd5UUiY zO;UVIGD(`R>nz11J@3;WN9RtxUG;3`zRt@=`hM!sj_zCW7e1YLy@9NH_v3YH8-321 z_Pxum3_5x8hiZy>#vC~y1nt<<6eZWIlYYX%SBNPZg0pFycbyGM_Iq$33gSSJ1ju77 zSGXk4D$?EVTX=r+o40OR!)d<*8;Ll$-#d9iSq*q)Pr9{=F=kvT=u$3~Yo&YzQ=a#7 zOAqy1-@0{cYyRLha)8*gyK-f3Zyd20Gp^KiiG%*!E>%g>cHFhX!$j|(2Oq70gZ&L?i8XLj;YX7NGmp7R;=QjHfrgxeoS7@6%0K%&v zNpDvMZF0Xu-}wxD2aprIJ15@xQIqeJ=JKeQDpLDT?tgK<_jM@9mGPx9%WBh)9y10Z zpOFJrhwflTLTl#Wy?Hm}_Y7xP<=E`EHc;97`mSpaZUwT322qbhxcJyB}Jv4v^x0;LD!HUfDu$zB{puHR-U2)mcQdo>Q;tZ;~&(97;D5q~cZa?|F1a7aW+W1Dd=uu0KUN<14G1>s}e3K5ViJ#xj+VbM(+(+*=DittwH&6Wl_;+kE^0X}i*fg&?(v+0^(r*@1SODp zDx%ke@4bvM#=XK${W67=fgxqp{Q0TDVa^E8SzLV3H97<5KxDDB{ka5SjX6s#_t$G zZc}ovFcFp<271-pwLcX`dRxgYu2X%vI+=;bfM>&%;O=~8-_%~fImtCi_#8Cc!#UTF zks}Uy9nBwo)^kHU{UrSeIj}h`H8?>?_c!wPeJT2!S{w=?X6KLo?uR7x2>v?<;orF& z{ctkW3~$fT{NbeXx0q_64`d@Rg2DV-%<2!3wfmgEA@Za7Lrm%?q+h)RJd<02;L&__ z%pXpO5-%bT#9;n#Qu&@#H;?7s`DmU;mSq0p4(Chc^|)%f9>aV8^+bQ8;(XwZBJ_Ic zoX7^Rm%wX{_cKKJ56(yWS@R#8-!lL0dC#A?eo_M8zXbgEM|u4igLI;Sm?V#zG!u0y zPQQN2KkhN1vjDuM9BBK$W(_w|qRj4|&v|2D`GucavU z5XILL;RJV#c`x$>>Hi-V=e&P?oQ^SHX}&&sKi09RgW;?4T8m+f`D*5CrT2#7zozb@ zHd%drFvh&wWc$xI3WhK4tB^a@#}LAK+`@Q%CS7BgXKqt|0-x@0?9HAdht4U#v4!QZ zQ}^h9E($BnO-9aIz^F*lhipS!_DYCBSkUQLEx zc*N#Sf^E86%G<8%W>mtKr-rUGw8v(M0l~mtWOrC)? zb}c~9UPSfA`)R0gW8+?XgyK}YT2kUuK57#jI@DZ&T@9+DR%{k$7ZrEy{4ACm5qGgU}!M^t{mdw6HP1$ zME@@6yypc8mha7BQ3cAF!=#srv{9c;E80fPC_oRjZp;l@|8QyPY{in>^s z6G6c==7<-^3Vrr&+p366H;gk81k~9u6|aj{?hX$9$qS11AcUx!5$T32Idlurl)a7w zUWL&&vN!UE_d#I)HFg##f`L;q6IfO-=MXouN*>(qg2<_4d}2^-PcO$|6#}RK&b%;j z!@HvQ3$JX!)XzKz_|4hEZR*=No4F9oGR&sadCg*ZmO>j&CYsLby5_{@ z;($}E&VN)O+@$v_xngN2) zhC{ffb~azGt;}+{DS2JOQ9sk6+U0hA0A->i*krPX@9EYYGzaCB4q)YBAI(n}g;ggmA(QmB`A zP%DYi#C#~(9K4>2XNAAn_S^ZISB(x@WD&=#^)YBXl^CpFfYrFfU9df;+){Yr!MY3d z9qHKiWYcU|YD7)-9Qs9DC|K3M(wYOzqYVoy*bTAkIi#M}&3lJ64%&!eI%%2-DQ+9> zkTYY80p9TN!_jF}L*OWFQQDG+nLTXh-R$HEJYi!)^kAo9(XIpavF0!k7C`lGc`!la zzGI7vx}(ORJYBQXM9(S!mj85A<78df+J-qR9@H-Lx)n8pDa{+udIlQkW~oQhF2WXy z>>3dib`G=z(ctOb-J78jCs}Ekh?M21R=S>z*BfPd2lf?Zkh;M zf@C&nCmM5=!c3I&3W=-3Zsu20oLZ-FgN->veWfAYVyPFW-M2AiKX;w%V=Uj2zbkxr zKgqtIlwCn35ODS4RaOPxzJ1{iv#PA3{+X}ucAE{fZ*$>JCdHXRX3W++2m1qaKuR6| zsil`97U02$dAx6TpOmp#HO_9^ki0!`aGTWk(Ds)5r~g1GxpDMR5?Z=p{68fa~A@MUEv0Cq=k; zF~{aKHJ-n}{7c<|wDY@4DIwi;I~E62$lGCopmOA(81QzxFMQ$gi`@^%fnoP~Ma&$q zyF=c*U5(Egm-kcGXYy{~CiukkYkA~Gh=XP1&*#R(2UFh!-Z$xIdi9~` z(&2L!PU)QWm7QI%l2__*;Tl_MrpH_O1Zef=zz(d8aWVy=;1j!Zxc7EM8aDiIHk7~! z(Rd^vbtu^5hf)xz7zL3$#=%b!y_2ujnFQoG;=eu< z;P4^3z^i7uWX(4>!-pQCQZ=TVf#-7wy~C)aT;?_)Ey5w3lMxuxM$1R%lF891EF$SH zHb$UB7}a}{0g?HlZE@;$i)*}SJ1 z3bt|rq3njHq6A4~fQI#wteA|B6j&bb)jC4OudLY<3<(OUt79Vqer4}nrTv^qw<5>o zJT04tP-WQNitClYWFa|GN1S98ELOei9a(CI-biqMPAC_-C_-e@12GJcpz9pH@+vu9 zr30=UpX&_=II~2yZm5K&u3L2xYhyw}yZc7(S{tvC=cpjZqh#YOs#UwxhochJyiz!L zkg?ol%hiX=4=zrGK8RE)Ju<>3(+y?`w>dcVy;C%9vtEq@vBUO`6Tvu{%XrliU0tuW z@&Kiv?I9+t@{JvdRs`Y`{M2J+@GT8+#$6w&iQ}9xQ<8U9a8u;z*VOA8+q|0+D!xv^ zW5uWNb!UoLLS3B}y1h|*A_8&6BfF>Bb5!~w zGKkPQzpeCGBIGSJA51%#8&7Yap@vRb_V{J!vyq!AiTA0MwrsKn|1%p*6oQiMF<}Ut zwSgtmN*om6Lx?ZiUbam;YXWq@3kVA-h)R})Y>_9~&H};|$Ar^q2}C;N6s{#@ z5Wzs;3mEIAHzs1iKg$y9_qOjqUne$@^IG=m>$Mwc*VR2+6t>QneM1)d>EW99quCY`BP+M&aIs(x zon(JxE#q7{9jjre<;ZdIaqB23vbYH>(^n})3QR|p7#`o`CLCC)9{OaZXk*aBy&RtO zWps4}pit}Gvn;3;xR?+>L}WKJFT6p(%h5${1Y~S>l|V3#=DGKL+gW@Na zDx{WJ-^TtO3^{ZMhmD*a9JEz(Qzm_}=GB6QC%ik@nuakEwt(R~T1*{o>f9dDTzX?` zS^;j2Bhgyu&#dp$xh1hQGr zg<)0}dENxSI&d23G0UT)va=j@&ykJ28ftq85q3eLet~8g*dD>yKDo}^*2Wi;=`?b> zH>KODm}9JH0YgJMaTk%tRWPA4^dVUW)hQ2Q!%gmjvYB_0*34)c`-HY`vRE(O zs%!Jv{<*yiyFK&Nr|0YUPyWgJ{pn>J;X6OAG`_~$BulU>RZ2ZTX9-IM#21No)B zzlPB4mMk%H@L<_po9v!4_0yka$$dY80dv9uZw2oaC!7Bq2>~gA^M_wfLWm@WlrJzO z$DFv8S4BJVQRs-FINHzb$tQQa?iw#Djw62C+oscwQ;Fa9wmUk7XE~5i^kApm26wyr%i|ZXm5<+AEWYrCYi0N1 zVi5v$a%(pG*Z+Dl8R=(=>HesBhaLiZpZUh5{eaH-Vr=w-;d5X6$jAS$_oQ>bl6&;$ zbu(aKdc&T6pSwdBrDa(4QTHjk`M?cRt9SK5j%qeH%oBH;A5o%r&y-UC>7*|Br!^cm z$L{>>`spX7`1c%<-L`0h;ScGCbzc_~VII;d2%oJJsztrp@f`f8hnrYvYW$z5R|2 zATDzv_wLs9>mSp`78L1}#fyJOB>eDw8qDq+0|)t(E~ua3pn#Y3BmMLv{@?=# zzraR&zdBUT{aq&xLgIiSm4Sng3>=v6NO0fnp3RL3G9x_BK7{VVg$t@d+V?K*qEfo7 z@MH7m_2~Y?KjeM0)7fSh-$fqwc6+xtsJkr7pG#8p$wnLI-)H&%6^$_@c8asBL^=dI$s}C6wdMP&rdkIeH)JyJ8^(@XtH}(F7AfG6&p{OvQ&nk?6u-!fIyf zCD0W<4|F%Gb@oDTB6$%X24S$}=9dYck9gwhumzIqQY%De;ulO2LP^r(c%%6lnCTX- z>Z)$i<%ud{oq_RNo=X!-KKLA*+xCbWhH{lVaCz<;szB5ryFL9cQBs}>)jSEV0m!-6 zN0>J{9iqYWRSYBwa*>cyVHcsRdecEZLzj$#yF>vc+2~Q5HPtzG#jFw>3w<=r=EO$m z_XeMHd?w!~_#Rt0agD7a6`_I>oK1*Lu1!4#oHs+j?Y!|+RAJO2W==__WY=n#MM#8u zJaZm9Y^kYMLuo49Q{XT%4Z@y!da1L*x0FGna-dyNRZM|wJbUsXpNYgh;M5;RPJ!~K zgPh#w{NG=uxzFCvNHCbEDGmM*ro_k6)|-<;A*@TSN?GVbLybFp*7BvD z6hZz8Z`$PT0yzzPLyV?`5~12@{cLVMB3#4Vpy>Yueo_KIDS@Aqz)woxCnfN=z68Q{ zWHHF%+u;M+sjH~3Z5%EP!T2G~E`1}dteEMJqym8&S4@7M&V%Qxs&M`80dbg_%1PY= zL0|SW$;R_2Nc&zsR-?<@N3eXyHOwm?OQ$Vgr{P0B39Zu=!A~$PQkNNfIO!gyZ$5{U zq|!)Or-X(teoWrF=Sz3`uL4UJvry!XPd@j&`NXS&sxdr{7EJ7#U`Zu0=T5gSLpLPj zlT&w3=6uFXei}3yy3R4NmwZoe3)9$+7#=V5dAi*5Hzwj4&5s5mMO`NwKX0P#YvxVX-K$8m$dbTBwiN4)LB6)ra=a?L26NZr- z=-|=kt$ZSQ+V!hdMkesDONZgX26Xdv@6(fzN`NVa+Rwd57@V7Ey{hOgP_8RUJ>{}W z?Up{Jr|4Yg%B9(Mw(QNMU%T7}$|1IRb;g3Hxj1iZb>P~nr?5@e&lx1ww&x{unC0qY z7fowAW>vkt$H=z&zCrD3!-Uw{ADNDLP$x6#ZQwhaR+!?Nnp#1$mVmt@|9%}g9h%YY zfB>orL+^}{-Imi!=XD@e2u%WKj4d=1p=fbVyb*{nf{n6SR|FE8TiJ&z*&+@AKM6=t z_QYc}pr?zf3Zw9ZPZ!BMp+VUCIq+)&j9ZK&=5l3lX%}s2!kKBc@s*#FYg1CO&V#X8 zwt7Ec_mCJKDm~s6EERa^L^vhI)e@m2wQ1G*4tt9)SGV4DenpA4%wBAXdKcKvibY+O zTa>seLmP~)qJ`DeacK#qxVzNcJPt36p6R5vr8=UY@LJ`v!tnDCo?r|Q^r+K3-HW`m4;?GsSlQOIGDA| zNyXV?lX}ALEKFWm3wF7dp7#OUF{ei%*d9$w zG%{@`J{az`wy;>%hYK6DS9ofLrZmk_sMSiVWp~7!;lUAuyNWU4g^&sk9o|FgYH}DB z6|;#Oq7$5Ogg1f|DmMqKrnjrjVtTk_CvwgxFApg`e_-nJfWl<9ZqwVqEL2alVET<` zwwz~pS(Vk13b8DXmOYxDvvO9aWZ?V2tiut?yG)}xw!S_@?hHqV<#tT@#0-@10UL!E zHMKoC*zj~6G2vQ;qgY}3(wh*M<(8AIR*^jQs@%4yW2o9`;g^#+;^@(Y?c9sr{D17d zf2?H3b?0~PFS>hnq<32xX9YyI>KX(xP$X*vN`Y)VYwFT#m`1Y5Xu*j9LB`A`S|UO= zv4Ti}fso6Z+qda%BZ&JUf?y(x=(Zdg#;l=X0s`v@5_z8ok^Wc#l;Z>pU?AjXjg2Ax zp=bUuZE3{L=Ucb?y?$?ow1t&+|IvA`Z~d-1b?V2hQ|DCOii_jb)v7Y1hvVkkVr4!F z6}Os?a@^_Ny1INSt{9CFGL7izi=Hon(Y-ON$|@W8nG*_JdR;neyTi~}KvSGn8_y2< z(DqG9ieNLee7(2e7nyPhOd4``UMYo=!h3GCzlW}FQnrhBVh3Hvpj$1b$%+v(ThzFb zS&r4hyabqPlCC)H=3qeim7&$!6y>NJPl{wbZ;FC4sdO^SYEmF{MNa6MTPA!a@F3@7 zW>$3&H#uaR^$hTtFX`Zx2la}{tV<^cV_Hw&O5}51=B)DE&Oi5zFB_wU0Y1XezBb9QZNo#!%QVJj9glx ztGmcGU!x9?Tg%tpa3foagpGx_knFUipN_-(x7(|_1?84y59k+CLhg^Ob&p%|oM??MZ|EuQp z!urAg1oX+~k?Xwtj`S5V9G6ebC?VknZZvcqAxQcD;xF7IPO%~kI=QMo-~5Vt($dYn z4M}!&bWhydbX!w$G!bwI0|g0#jR{h6Bgm0O@St7#Z+0`RcLxRLtpfo7>Q%&hAOsC${JIZrdAo-nfHyHyXIku7Q5>3%8ynM(%m&p7xs; zZeGBj{&)WTo%5EhGeliSd(eis$#c)`?Y&OgcVET_c<-%Sw?u=F{_54MpIu+N^x+SG zc>Qb;jqdJ=>vZVG3`!QS4rh=Fb(mz4Puz5EEgi{iQ8 z+S_~W`(3!OZL6t9Eh16i5&%+aqkGEQzWUX5R}||)m|vrWedN!MULhcl*!GxfB!P(c zwl#S9jZb@t>WP%^ch(`W{De}V@w`bZSIlAk=#_mtZ-eYrISnBv&#n^&zp%mJh3A9; z$VT8}W5S*9=LihW|LU(QT<#&>J)bW1 z@@JHLmI%NEOU0^YA_p+260L~A^d2Wjy+aTV2Zv+mXHK_CA_W7N7+Ek1vCcOtW<3}Qj02P6EL2~SKVmtOav2Ypl zfT2nlz+>dyQjUD-c)&o7;ExhJ^z!s9W?Ia-nUfnVx@ewxNRJHI7Vml67AyiA5-T~A z73tI!Sic3iV|IDJs$~x}1P3c)>J|*NM$mRe<`oLy$6~>;f@Hs!?xxWg@vyf+G zJE;qQc8$`c!pW<)(gAk9w$7n#R~F0K!LRW{*|)4amKvRd9E=DuQMoLJ>w3{tC2DY4 z$7v_B$i>8nSdBMh4R!l;GZi3%Q>4lt>x8Vrd;G5NEFK8LMb_{R?&BXi_vJ~qN}JeWsZ{6Dpp{_ zs>*>l!aL_SC8;GE8Tf)&&uX33Y*_`DPRfdDfj&bgISY(! zO#qOvE0(G%;3M`_4oX<04Z$30Tef&9Ob6^%)_3C>=MP(9!&jQoa4tR6^PtcFLRHa3 z)zD*v635_3O4wOYhl4z;KyRoz*JLv@H*1zNdYWH0dD^FtZm9X#f$e-bk7zUcQaWy( zACmPU{E$y`_Do8bmYL@o_tLYMLS>S2UMigrWQ^raz~w3<*3k3JHFan}xdqqurF%1~9GSMz@5x~v<~If94X}uU~8wNxG%s##EQ@=KNu|x|1N2V$mrS*mTa1)Og!v#Eh_Ui zVX`ce9JYsJrS!9df2*LJ>738o9~RcNP$l){$sv+>&s7Y6Dx>&~Du541!6ss`h%WHMe$=hz!S+MCLQ)O0# zv|B-FNL5YS*1KsM+;p5SvbzZv0c3&V&XPAb%1KS0zY63ft77lte^5@f4x9qcUKxb(u zV-$0G7(~C(~t`Q-_9;H%|QF2u+YQ$>w9uUaXoT>8Tf= zUpEHCX-MW$0cLk@xmuFMP3MQ6nVoa7yv{&k;>YaW_;fKRPwk*tllr7VE1_DXkcCaO zq$A6GKCNNE6R6Dg*6JToWz1gFc_uq(%R z*_7vugU?M%5}IS`LNiH&X*R6Wl)llSYUEc8Q#9{$&nfWHva4P2{Uqd7g${L=c4&lq z*N;?!}pq~Vnj>N4{8)8w%Wc@wT z-Is5sZ|uh)F5uIj9xATN>i5Mj4yKm&3ctKHWr;k={-gVk-F#;6{cKdMe}*=5ycM}p zB$r*dDCO_(e`5d7U^!lY!HvGU|E~Q{$-aI;L8oDZfto^r`UwM>B8C(pFK?qBX;L}9*EehiI|4&L4kMb@)V2$<2F;}039?tiHfy4da1Kq$gZ%(Oh zIpWW3IAKn&@&z$LVCuIo{rCANlRx+mua{rA^2u&_Q7^+TQ3+4jpC(UTDZcnb@|mO^ zdA`>jHl|Dd=aG*&>^|<;oonxY{PMHtI{)-DZ-4v6o3CD3udl!-{*zm(Zx^~wozIa* zwGwq`nfYSc_WqD&zG>2q9bot}{hpmWr*BE)m+)A> zL@eyrqx<>tt=e<1fg z5RiAofISItzz#))LG&Nygu#09+_z&4_zKzc+kmgW3k-(Fu?rUl475u4?#&}bi5Miw z_cteQx2a@mCe#b(H2COL*m!<6l->pmPb_i9qt)Uc?p}coYGvlI4nLlGWfkrn@PoZI z^ZY1k^TX)*odDDB*5S97zqy%iqJmP+?+1W0_?}HU$72~iw?&+dLCtu(oUXT0-4ot4 z;B0I!kCWI=P64l<9jK4(!`c`|mOnvc=#E1-7F8jQtu<7}VRs`XP_w8H4AhX#^E&~A z)ubFkoL^Pk!?ye)h_j0Dzo-X&oqq7Yi%LyR)r)xFc6e71Sb_tIPFnT^}42}f?deVF@N<=qbdGr*i=%53aG!0d)X)g zkb59RevFuXqN5jhLF$(xXeA-j0Dh{uW+`FUt1Eu;&>S1Z! z(pk~xZI#xkG?sr1Kc>KsDez+o{FnkirodlAfnedUi4lW4VkH*i4)NRQ&FX_AMUptU z=#DQp;_-^!xCbMTM&?g>4i3-4=H$(I%y`@#lRVt8NMVDG;2}{3TKYQ${@A7Ek$%S> zZ(&iUz`f#z7{bFH|D5c3mv@#_sx2?*xOh_dy3yAhG29JE#1Aj+^nU8^D>b2Bdvs~j88Xjr-4P{1-)?WE|TR)WJ^gJy8o92?p!AOM%l(#1 zzf4P4I&)ToPL3R)f-LN{JIbi|ZGkq-C;UAUcFewmO_I zd;0v;A;idwNz}E?la9txeO+-lJ2*(Hte$xf8R$|c-AWm4z$H_(N)Kc4DrQb=EVzAV zZYyMJ5EBVQVh1yJYavDDL#X0Z%NsJtH|FH;b+ z;?x?{UT668au|0Z^WJ$H7pW|wvoJyjbJOxB(WXk58zPGd~QDLoSn0v=gU2SlBx za25#494$p3i6y9%6IdS3X0C?xeX@u*|Dw7|NyW%b(z5F2X>qW~59u0e+y!$*n)qbK z{YypTSG_L|nCF`5WV$Fww*-R*iCsslmRss@3fF`fw)?nY%?;e|h-Pg! zZt(9WgWGNVcg(we>Wvic9apTWePxohkqO1i+{)nMvHoVa;H~}ArKnc9eg!GPZSJDY zFrQ?*|2oo{+daGO+!1?(TQ|d6+^vJ;MOldfn5cGSV=G)=z!`U02Lkpt;C=ky#JkFd*}V@qw|;Suk2H2;|~}p_gxIs>bn>yTz9h$7$B-S7?l0B{?%=a4?Ojsq7aaOjv1niH}hcH6Y2fQQ!<%5W(?$SV1{3j`C_7* zdd|R_$?hs*TyBMD_@H>X#~=5|MEjo~{kf9`SfArB`bO9K#iQuWLpSkA`nM*BTetR~ zL80^I3-*(`;Kr{0-K$r>w^oN(uOHoiucU%^fzn+?Lsb|ALZdY7rX;OOr9sUkB>O20 z%)sE{5F!jD{ae5E(o5XP8!=E9e4M-_dyaS``IanBxt)dR`&IkuS^tps+1ly$8zD2u z@OI*?FI8u3S;BTMRTKMQZXYl9n$RJgjiwuJIY3-7=whXc$S!SJDe5P zoCI45Np#~&_H@lw{ywdO%+nzH#=<&^?)ae0r_esWzyHjMh(o+!Y7b(#ihy6eX7N*Lq50>@TyVf5%b_J&7;t{OrJanITcf=g>p2F&D0SBa%I6MRSMc*UN(6(>qtimZyw|dbG9;@#epgR9e`hmryi!n z35*rAP=kjMv+;~}WPqj)cG2ym*jS4Yf(szS_D(q-jX6}A`^sw6`^Fi%)MSeSGc?Nr zQg0IJG6la$ylc>XRmFY^f=eu5-qgm~z$9zXY1FN-8yf7Ul08j*;t3o0e#T$T;IM?# zeusF{oeXvxo(Lbea=9yQt}X!PzlnLoBMBN4ShYj(!lp&yrh+f#wr zJR22>2QQkG2t_yVDsztPR=7J-oq~|k9Z^=FTE|#~7Y9dg>{}O$I+QLj*!tkZsWcl0 z2eWBdo6RhrRwy^uCa0lm8{{5ofR`JnsyvYjg!|AAMVK1oFRxiCbeT@Y|TDF;L;+ z)z`Yp^P(`25Bj3FNfDbTn!Ar&j&l)%xUSz~fbSLqo$cGf!1CNVr5emZk5t7BR1g=f z)1i0n934H1_xHd5*kemYe+$^(zx5sXHEMh5XwYgEF1JY0VctA9_`kMspUo)NQ4c_s zKgQszN8O{KVBfdLcssrcl=$Dd)AtJA#lU_548HjFV}P{^`vr(-=-R zcin1xbA3x!(5n9XYH_|TwEz6=*W=mb+h5=Rxo__MyI(p}{Kgr+9lnhQ?Ap2Y`dht6 zX?6Y5r8{WPa+zz4a%B6ThVRQaEF3L-8GomFVr!oJTYG!ADE%x3SM4<##q8@}|2Z)D zCMvP_g5P^1e7oZsUB{4l{gppITEDV>Wq%D0>(72R#@}FI-y;IB!Qif}%6%0Es_WP2 zE?{))%B^PIH0l}Cf8)E~YA?6{$G09D`3vaW|K@{}3$FC}I~G37 z|NZ&@az6X#Hzv!V^rvC@sXr@!LSCg^KOORey1Y6?>=@gWerwq^S#In)#h~tjj!a1r zQ2x9TY|F1}{jZ5$JQ+8;un@ZkIQ;ZG1`ZzG4O`wZoDR~AAUKWBNtKX}5Q=O##$v#4 z%oD>=ct>9WTts(MQ;=}cFQ!qAwkVKG!x~ssGxL^uSC*LzZfI%N#dCRcqXet`7^gR0 zwPNLhvb+lg5qEg^`4HpB9usY$Cuy`1XZYK?cu@`^t%W48NC;_&aUn%T`GTFI$}}_Q z@sVUY2A+DzYeU=pg2QlBH~(AB>@_Jd+SjGN&xoCj{+)JE0K1F^B@0wHx9J_@G2SbdC7* z(UYZ$!@|uRR4ed^Q1R5yB`y6RP&Ohe^32#uAf~#HDK8pTHsYo}wa_w#9iQ@>IXA8> zIVkeJ9H)s(QwUx7nN1H<7e)<&>MA`XrH8JZh-Rm#^AmMMj$d{(k{=`!P& zuJWv(P$9BSO2jNIsX>}L41fx696@vu5ObDw!#U2}dAJM6A|SD9kv86}rvQnA%%}R* zBcG=rM8;{^9HhQM{FL$mQTj;kA!Dl5Dqm$JDf5G$xVRsXQrcZW{Q|3F{ISudJY&f? zw9vG~B}kfanNy730#^NI3FpmHpTLPo0U}N5LlAt#xT_VeT#AlO17*$^9-Ki{ayW)6 z_Jay{Nc829dT9WjvJTG(;kjK_E8gQMx5OPyn}2N^(>bwTDL`D91=bWuN=jA~ke88_7M9Ohvqv(B+@*XS=28#`hf+octG zV!InshhKIuL7~GV;H?X|b`%fN8V!O`hS;!%ic_w7GQMBKI2m=5fRCCt4xtQjFsFpF zDU8n46$Pw|Co)&YjY+9a+_hjpmm81LPCmOZ=bGvyK~o48i+Uz`$7h_2Wv))EddpKo zAz74B3JMM8EA0S_8%G4|2puJk2p;}@f|$Om`7%tF_@!shi1VKLk`s!(<%f$_mp^UW zV2cFp>{U)le*)2I(j3gVAddH3a@g~s9khC9K1FL`7L)&EOrmjaToPCO%%1z2c z-s;Oye$b5aSvk)7#M)*y%E++m$`OGj_~f=qaz0&4f^F$C_0<<9o^0X#JXk)RqTmk26w&^YynG{&jV-u ztGMX(3(hjH!gT6$zG)h==_H%DY|f2H$idSXlplLPc^m`O9IZxZdFWfP z)0!=gyhQmZ$HjTq5uXf#Xk4UKj`~p}-)Ct7G=l8nlg{)^!^s&>m=;lAB^T4 zw$;8G^EEnYeK&9G*{n;aDeW|av}d5@9BV^cbCPzUZa3xLGj?>4sKXK`9NB}ABw4OT zZ02dY31d28JMTsZF7^?t@hsC+t1BULD&yHkh zYE8Ly8x??+O&mFfNb#-@90s>A;}}R)1xIGT$nOvNK{Wf;JGPQ@dV&ak+6_0)Tc3Dl z5891rnmuGUay)L3g5MdFbFTEg+UhGe9^xHFIQWzEeRd;q@7#iQ7eto8?&pJ|=OfOS zh_SZ&coWFIw|8{($dh|}pZ`1pcO>FU&Xa%Svi9U7Pd;)sLp}zwz7J5mD7`!)5B~1E z?+age@WHP=sraLy2S1quGh+`@olCtLn+cS%w(HBmeHw!pUswmyhh%fBiRp z<81r^0}zN9{LIgQ!LRWGE9m{b5YTDi0RwTCaWCZ<1M!o0W1tcuz8ee%u9HNU)_d=K zXT%^G`m~hM%zp2Qhd;PlKJ*V5A=eZ8s7*d^e`nSFXa4|6xl6)F?Tb%TpQ)c7J@k$z zs(1Oed5mL?di1Zk=egx zf4sIg^0&QB?Qt3$PB4J#H*YfPj)Z|q{?z9|08CkioXD*!IVDM0;m;>k}E_Y0^3kA^ERQk5= zTMVvUTd#lTce-vb9^3u)&2QiQP2*n)0GT(BHiua^?xJ}9dC}lq?^^Ti+3(&~9Krc_ zogemA2Iukf1Os|qEPtr`7L#k&u3mlicfJY+S07`>*yGJFKp3^wP((*c9u zQ%56?`mbY-S$i;emp3nOL9&^WuxS+}V4i1@M@ZtMn^!ZlN50`(cr8`TCS3FaB${!R z$H3F((Wwcz!Y5eA(|i@p9KTVg2&__+xl#)7iWMQ|7A?HA0(0iJu_iG^HKee-!{VYN zKIh7IfFMJH0f8GLF|WGlR$&RYWLu)q@phryb%3To348#foL9HViQUGVgca{=oC7%2 zWxZZN1B4h-#rOz72Twi#n~N23{QdPXyuwAE0BRu#Py|a%+HI3>5Kxup))A*0A~c&K z2B(uI070O$I&itOLtg87h}e-bLTIB=1~TEtRzOR5^lcOpSmtANK@NJ!@XX`O1(G(z z?PjFNSuV|4sZ1N9&thbH5E`4FAaNCPP?3`dXF1Hn2_#KKR1b#2z`1ZaFfJdF{M|L0pzi)$#&t3-7z7ujgeq z?xuO0FY{o42WQWpAW*(=p~njcOkhrVslsS(N4;5!3Z1SMP0JZC!$Ar@W#t;{E4Ff^ zwjSVIG+!P`8m%PEHt$|Qg-mmvx2v`!B#Nh_upO-2x%#pfK>&1j$A z=F5Ca{X9;e&T_7W8CBrlr?qjW77he9nUkcn^s>ySDIvroto11zSDSV8kk!6zMb=v0R`%zN)>Fh{UDF^z9N&QP_U9bO8C3I|D8I&N1-1G>vOlbfl- zEV+$|ugZew3^_A39?`v0FtPTa3)aq%7GO!8?8j$y<} z4w)W0?yiA^_)QHYT0i8RZydd<4JELY(jc9iajl(@&7hc{u#1aVR)kkui_M zjQ-y=qg85s(#?h|$`G6;uxUK>uYCCHu$0LxS>YZXwu>TDpowJ$nUc@~9-sbMBl1U%f8Ugl)2! z@j=wpXgP1k{WL*!JYSTHDQswh?Ea9qm1N>DgiI_Wc8P%1WQqybFmW!xQgt@1p??*O zt~++9KC}yN*)yi`;2j-%g#^{r;lLbfC(y`O+M$8&7P2~c?PTdrX}zwdg`s{RcSvhj zO6Q)2f#YMVuAcO`Q<`~v;4`uh7J55a<^=-@y$Nd=$RC3~m)G+YGG2W^HNB=fok z;gqeNW$F>J&x)#al+$!8FY&t{*bcFVp<=@Z&~ zS#sk!jCfkm$7-L=M)j0#PgHeXk|d72F{f4Pxnnv_IvRofCME;V6gFRU;{zCPqeP*f zF51}=?V&mCao{VxT579IWHvrGtoe6T_uVvD7Ch8}badIujBnXi2oSiXDva0>!W-(7 zpLU^bJjn|~8f43gmZuTD&-ps8nRbn`y!Tw3C%qwFtp$UW3Df7{M&zN%1E~3J-RG`Y z!yVI`o1&ZJaEsi16=m|s*YTHh{s!LK&EL&olT*FT(QXVSY|VkIzio>otqPJ^s>DeBA^XRCt%kmQ6#oAo*P~Cr{lu9MJ?;!IPS1Ad% z+~Vdovi3pte(a7Ie0=}s-uAY)Z7@)dr!jb3rA1UOUq1TN0RxqG_0rW#TMWc8-oAYr zgRP8RNwtdKVi5h0-H!(eVB-z7FDaLs=o;UouKTyeVaor62C{GA%Wr)7%a3vM4&3Ym zLQs6Po;Ppa!cY8f)HJ|;dE=J9Wba$IDuq*ggI$d>(RIW?Epn5Lg@N!Piml(!6JWdv zZeG0U@>la*n#sZdFSsl1p(uq)Qr5yirKrSR+56Tlswn;FK6^F!qDia#x;-5^;7@LN z9jej|%l9_#OI+Ib+0!CtPvb>v{{@(~;%#XtP;yC2Wr#%Fdfy>cn)g73e4 zbcdrHv6AGlx8{qf%IW6%_DdHBEeg4%tNpE~u3V}gJN!OvC6ef87k=`>Ps)6D@H_77 zctI7j-+F;QFWcrmtcbz8^ZX9yMqatZEmeH!HDW+Y#XpO|OBc8P7y07rx0YAR`my8} zUi$ZVLekMuUSUL(XCW1^#7^*n<1Zp)Tj|T)D!@5&Fm5)a=IP%8X32pZ@8ej@li3wKk?>T&YtZ!(A9` zLIw;jUOaaVJ^7e&n~urg3g&0;0iGy6y72-d?`d zCJeLO4cw#{880IyUYwBbz!1{(l6Wwo=6zr_p}!pF!ol-QyzAS%eDcAd z!j8X6aSsjFL3w%SJulsomwnyxsv7$w@WMIVbPaJN(na>k$Ry~f71+Ek&QD-SX{!%wI?QWDEd%(_5 z?V5TXnwB7$V?pm|P?*P*-G01Verb@6v4c6yyL=IR>3HcE5Q1;g_=dJG;cFzA@jZ9% zrv6acmDdtErwmhO{7M0SS&O+4`JiR@ZllTiBaHmBhjcPA!(A#)>NA6Tpia4d5`e{t6X!#J@6ifs{3|S?Kez>xcl022a&n;vmBqF?RsfUNeCO z?mBg7Tyn83=Z}fob8xn#?VZTbC9PYm@D)`2Vw#@2Ts;Dq+}g}w%X-FIZ+T~RQgDxT z0R{DW9XQvNl{;zrd9V=@(ovfuZw^d1!66BAXt*v%CBmeo)jk=e#mGajqN`Y_Yre81 z)OjUpodzFRQcKJg7;2%R!mVF)Eh#wi+ByoO0SQP&;qm^ zl~F&Wb$no|Nbx=kXd;(fs0-tPqDl`HlOfh((MkIqnClUr&`W@(d94|F%GDao65{g{ zyhlkVBdPMaHiDNO47XaiTet}d3I}skqAR680~Fpa=ZL1w)3$ZDq(1OJpwhJ-f7f_J z!0Ym^hp9WDQ!R6vyPOs!7xf<0Q~01m`dY;XMLRj@s;Z*ee1(p^y~Abar-{{7pENVC zmt@xzcg+Vu7zISrMS$#6Ipo$8H`EM)HW`mYuF*#AdMg4|SuRK8;HrLF9dI>WV_EI8 z+1$ZXbNt+9%#R*BBfFU7bdgn8*}|!W85y4j%Ah5)NeBla(BA^%K&Z$+^wc@cQR)l< zf_v1W@tx&?iUwDd(%oyTq1UWkk(Alb? zeZu4*jzlRM$UERqVZu5DBG+?3+1%qcg&z(Xh4C9&xWD_GxyMmdG*^4w&&$flj z4zsjqJsTrRJhDK@DYyaqtbcLD3aB^c;2(MG8#nBncx?U!NVIR{nDD|kZaAAO<`ANM z9=s01(aEF1y^(}lOQfb|DQBxv}nwKBXP;+qIrE|;{Q?KKhb~Y15b@IOnCI1L5f8CFUI2g z|EKEJ`f2x2_r#U!tEcQsNWQNd5^#G0KL05T=-j`Exw&)N><_*zP}2wOU8Qr*wyF{dwBWs|go=ZlhicgFk-Zz3=7YMw?PET=?4; zI7CmnuqhzjEhyU8x2`Z+_xIfplFNACn!zOhPwam}?#IL9LFU!hl-K3U=g(hxjeWNL z*PgDQKjEeo!~2IlagJ`TpM6$tHnhaWv%j-}IO}a4gBeS@8n>v91Kwxvvt10Xb=Nut zevDJ>0|uAw?9&DRd6zx6?b~&vx?&NBT|dPHeqxJ3*G2aZ2E)oH`feVq?xQVi%oBPY z?nYxVBxj6!oJnrZ@;>Z8VjoE=Qidh0>*&Z ziCZ?srIa1d#L}?iR197bn;0x@$v42>?M8|AU_-L)Ga?>C9M2(rXhJ8KZQ{BE^Mebi z4K{7I2YJ}w8mv5>lQlA+)`g`UcY^~r!SOTFSU$<-Cp@-v8EODi85F}=9xI@jLx}w4 z+CadrfWWVEL(cUk?8K0eacElk(HW#g2{=7QZg^)mqJ|sCVm!I=g$u{rWATSUnC3J#m`r0||Cky|c1&qG3dGO9mZj zi;y6*>4R&XOBzo+_@4+u2Ze?l8GA!vIlXL3{wy(Tbn|Ha>RnOvb z>a3a$S={3p@Cyz!mE|0}b+iC=CRMOJ>j-bPTmy7OqO_nrUgzVg%JN`<1cz)M$fkTk zkF8avX5Pjw#gE#af}UuJ&G;qb!#rVecxXx6Sy310XRgSmnlqwTj#Qq_GFQk3B8yc; zUfQiIS_4Zr9}}Pk$enf8>v(aP7Cz^$YwkCK0yc9~=Snm}iMR_@&c2I&<`Sia=7m<- z9UKl^x#KS+DDx)&$h(h&!$Y4>B!5SgkU!^Ia2u~FjYN#gRJjYB3Cb;qWG z_fJtx_q|!q09hTPy$%JqDU9#rx@6Ri?9ioMR;?HgmK52t)m;FSQa#8mT;jUIy0n|s zU^)PUNf1CD%1$RigDXt=(y@);+DE}chTB^RIltPnkXkr65aZ`LVZ31Y1&Gr*a>-kM zlV!J@_iScaKAMAq1(dbfTcv`U9i{&=8SP*|IzZWgBPd`}L=P`+ybAlQKzRmK@Mr5F z4|o@7wiAn<652XL#?C}KhMNyd*MeLq#!T0)pQf~YN(Tt+xRw392rJXk_<~~cY8oi) zG&pU-&j5?bp)Euq`eO)$7{;pwM;dBXyp!oWU+F!&X|r~?M%wGXRx^|9B!|I(km^wRmO=daeBqs99e z1AVT^U1x9LNP5D}XI3cT8QCIrx6)LzgZ+dgW10(0eM?Zh` z^9IiXtMCTro?kIqUw~Adl!N)kx7RPpz6-k;$bXQ14>6>Fpptddl}urU9P~q9xwOx{ zac42GpSPc13xnJ1KLi8fmUM#C7(DE+(lt)Q7a#m+zRG{)m%jLokA7~|o-+S5dAj!f z@4_=5ofq%?!Al|15Z>50kB$!#?hRM{lx3Z?#s9#NnGZa3_r%|e?(T{Aex^fNk95JA;5my3*oEh}7!a^;++B8z!P_nxqVx505rdEZ>XmCTp&p56 zJ`1MZnFk)&J6d14g(s-eH&v>le75}TrZauw6S|t<;@(A#TzjqC-#-^~`q<;~B)vWL z2C{D;`NptWMK&BXe|8H9ofm3Ol}CseY)ibhDf#@JPYkUSqiC+Y2ei)V{AYxo z#fv5l-beQUW)y*A+THNI3R>>)J89 z9sAb0tvZo!_iS^#TC*jcs@iwrrssC@r zz$Rcr|82axOkup6V))REh=cU;uGnwsQ7cJnUB#VTfi^6Y7#(E;K2tYmEy~jGB+DWO z>Xoe?AZc>NpU0&OgCil~GX|i0+zndIX~kMbf>vIOCz#FyR0umu>XAz#hui53xe#4T zpLEjI9XaXOpgAdYQC{bss#Kj(%hRlPb6t(ZsoK_-b@qn$O z4AG^?=VOX(1>{iGb>?nlo!bs8?&Zc~HYPr^Esh7W2#RFzarG6j;9VXlhsblkWIPVQZ8>X8;xmcj{tl%H0 znV$*~RZ;qelr+>dmj`iTGerB{4-xClAf`u+gm5WuP{alzIwEabfw}9d9LB{%Zgf8b zgB13Zk2S)|!pzcuqij@lpqo3wP{-}ce8f2gQ0p_~sk%c>IsslZQM}VYJc9hDco9k! zm3TKIG~)jGc_;##IX-1~!4cT-(>xjF+_HLHY&2k`15xCuw%@ooGYjD8V?*rLRRMz3 z^AHe~Jpq>06^K-@Y@?+V^SN6f9c5|GnPGB*=u0*j*qspZYje$sJegkP9T^RU#|;%~ z?eWkL>0~~V`PMKsxV2iSgqly&!cL)>EO)S3`qoK*IHAq7;rg~iYm%lpsCvE`%x+x5 z5$+^y`s9aG##`n>@f@3`v6~g^{l0NiFcLys*^b_~f6K%_q`(lsz{AHv^$?n=69!ps z4u2XWPz;^wM+h|abkp1ve5fI@b^i!U-OW0&W=bmn4OJHTaWiQ%P-vfj4WQE1+Ks0x zO#A6{N;kx>i>2ogl^-n{>C{{5RYn@vtC*&Jow2(W+uup?`(G2l7f0Z>^u}(~;;=XF z!Tj;_M@xY(|37b)|9|`0w+j8?gx&Y+{U#&--~GhKb}8LhvY)=bvHdF;?Ivw}VQ%wD z0=AB)OaXHr6W__y7ef?_7lR}03^YQKWe~ps*$lUA{Nnh{lWIuP=iPQ0QVc%BGk2IZ z?^4!W$Dp0qEeIPn$5qUZ?>2NW6`#L)a5d35&cP4v(nrvjZn(TbEbt(N27 z@`ikhZbJi=m-nh7h@mrvse%S*A^5EPBtqou5#HVp^cvO3w4#6LBn!KSn?jk$L8KkUZvPD*u#R?tWnJ9za z@)8LTgC|E*yiG|r?$N8xSBw^K3OC|1?wS_U#nk}{A7H*Q5uFY; zZu^pjyBOMNiY;XH+NfKk3lFzG;sPeG4#C++P9ncTFy-b)##Af9P;e7{>1&60j=F@V=5!;Mhc{7@*z+Mg2$7`Sl!%V$aFI57 zIftj~rwIWRQYHRi-d4+l$&%bMUnR@@fOERsu)gejR9NZJ88WH`@qrM9rxAsbRU#mE z_I;u`Ww1>ZhbCRsp_m}~<1VUTK3M1I(6uIhG&AYst1x9K)(q$ASTpttwPz#361Qd~ zkBJbGBM6*(W#o9wSgbOS;Hfew6gI^cOogn*9jA4tqk}AHmm*LWcYXy!9Uti*ag4GF z;la&F-cPaBD9umD3+|Zq0XOGeBMN0-_o@_qg&hYDzV@7RRb_!>Fpf>Xz{fGD8ZeS> zt&WE>+c@8Nw>-#DLOU4e849xqu)1`Kw2>E4(j+}6x8W!K47uPaStXv8JueXMx0>>f zVsWe1$>JBtTbFeA;#PD%4p!zW)vj|PkXwvg%y{%Y-1s%AD;qy4!IHF5 z2Uyvc({A46jAHJ(?o`8~t2(_Al8!iZV0>}k8|G;S0j#W~W8LI!<_yZlQ4(lWBYr@!-GOeD_Jo&TXZ8jlaP%LBTP{!31$QO|2L<{>|y|`!FQ^x-Y`H^AQiZ%Z1_KJBeJoWNU={77TNrHIv8`|m zF@?)LNcoPuba5&O521hbQ|~B_HjVr=PvH;f9Iuta`VwE{>u8F ztnyg$d{~68Pg^{aV z(ji(=KVczAJD7HYhLmlYhei1>TwSv=TY+EzFwmpwWFCuOg>9 z(HX%qpUoWp9{G_u)Jc!u z9WbrKarkCcEqAghJBfkAGx~c{aR{2fAYXoI72|9OBYTL5ri8{GdR#??b$S3KbV;!G z5T>G^=55jzhb$axr&_@oK=&@GJ9E=MG7^%BqI=EyKR?XJ3`j=(aN|xB2Lh+y4E{D) z=iG|8E$u6Q*V;ZW>IA}`1!RGVs7s)yHM~6BIgd6 zlS|ZdC)2!elnYZ=241bxLmiq$SJ1`>+*-ClVHmVH5>;uAvFHy`%{-W^%b@s+f2?d` zEB@&6&7$RaVQ=OdW`f=-KV8jMS<)9Y9i1!b!N{g?Tm))zSSBqh{4MNkmmQ{XQY${u zt5cZDKX%!{l6Vp~J&(C9jB~TFj??AzkoM|yv7=A;(vRb7)r7-}5K&z(@6$ZD)x1ik z%dBtv)T8H)s%4){`>IP_wd#4zrPg&*HsF{!(ke;0_;{ICvp9j-2}HqoSfQsO5>qY6 z4g(C03Ue(7tFvV>n-xor%tF709vg~T9n5uy-dUYabAl#;dzsM8oKK5+w?yBzET&G= zcR&HwGDLP<9c?|y#N9{mgTZsOtShVPgM4x@o~{m7BnpQX0(vBATGS|uA~EkdQcFjq z{6G@6R_4U053LLNWSTDO%C7=lfDaoHyP7-4hC|J$nsIp&JaiKlof`KrjG}p5c(f#0 z!UT2zv0!;ui^frfMYGHaWGgm5Ahbf)wb5*qcFRVsz=zB_-!M<<(&Z_t8H_*A7S5>e zJNW#Hjxbv-tRrf%nzFT+&ssDWI>uz1Q*Dkp2jE>Hmg~FNae7$5? z^bJ>fp>V*SLR$AZyAgicb?wN&#IfH%Yfs%Fgd$Qz(um2Q<;{WT!_Ma2p=(@cTrO}I zgo0XH;CcueAcTcM23F`H_g45~?5eD*IStJa9UwRqw}~;WtD+rs%o*Hm%>r#%bE08X zgvyDZ=Uo)I@;&9AvtZUa#yD=59x9Wj9zk`4aJvuwF3p;?_95t2^4cH0wvBiigL5b0?ss3-j)87;h8Nh_ZtmaQf6wJ_uW!F%z4z=N=t$qA>vdPE3f>~%P+rtv@Q1pgLCJBl7-2@RVwxlJaO)mpw9^68_AZJ-1vO|DsbcTH{hY4`Y5MV&wsKjZPq{0 zf9?Ze!#l$(Ge!_%!_ zoa1~PZQHf_#I|R`(b?<&*GIit_tT$#`Q^)8rEKQJ=3$%YkKY$+bCMJDj-29i{xTWuvqYC@VE6?e?s+rqx?*kGW4AzWrG^DvxedliJ z4f|Pq$*w)dx!P-2uaN#(`$)vVU3~w=;#P4>+4w_$xciM`ZrB2oxNj0Mcz*ABF!o4_m`_sDZ~1_=G`_V+0iIf0b7K zwsdxdLEo1TU%e`ycRyP`rI^BiGru=c^BpiK$>2K>;2szZ)3}}ku-4#y zsbhPzh%XqR!f4}<_Y*KYnf+r7@fWfWKfOf7K?sKMlYFA*=8<3y%b{K0d)n#k0+ql* zDB5{_MpF-WY`d4`twZmX;@_y>Nt3)88h6LoHpiQ#_@Vj-CY=))Ts((nA>cTaWu@#z za}xV4ZPiI=!~1_1Scs_US%B#&hpW^d>9o<+AZ}@VU&s#*Ma5QF^vrlh=r`uw#?Y_w z*r62N??mARbq0#=ngEfz3dUjsaiJmJn;Sh z+p~MzCW0scz-tpBKt@6-s9kV~G)NAjNXa2M08ONnODqIs3g~kH3Xb4NDJVGx4QB|m z_C7h9nB5&aAxL}^#cyZky_xZsmExbr)8_qU+HgEg_rY?oxgXMjRxMr6n*3RMg_>Hr zY`#5j+Rb}wIb8Cv$di-bEwp*@8d1@F;n}q4FFRX2l-Ebayw#2V7Mt%@GTp6Q^*RuzYzRxy3kUAV%~o&Hwdql2%bvcE)B z-iGONBnKTf0HB4bnh4P(-@^8f$< literal 340604 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

Do9$p#c0>{-3YbHGUS!u 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 Ba9;ob diff --git a/DSView/res/DSLogic50.bin b/DSView/res/DSLogic50.bin index 421c3bf0037aede8fe7218b142017468b6e2bf24..8174bef5b9c4d46a0cc98dc2c75a3c3ed806d85e 100644 GIT binary patch literal 340884 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 Sxz9U&x43*uwco`SRr%kq!Tg5+ literal 340604 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 diff --git a/DSView/res/DSLogicPro.bin b/DSView/res/DSLogicPro.bin new file mode 100644 index 0000000000000000000000000000000000000000..6b1184c6256fe41d61ace26d9f3eed4d5aaa9dea GIT binary patch literal 340884 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

EUw0s=mcYisfFxqN=ommO)NCX! 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 literal 0 HcmV?d00001 diff --git a/DSView/res/DSLogicPro.fw b/DSView/res/DSLogicPro.fw new file mode 100644 index 0000000000000000000000000000000000000000..145a8cb5c8286a96505f0419b404f6ee55c0eb25 GIT binary patch literal 8120 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 QgD~;w02ctjw(k`BBav!hfB*mh literal 0 HcmV?d00001 diff --git a/DSView/test/CMakeLists.txt b/DSView/test/CMakeLists.txt index 539ab0df..2b48a7b6 100644 --- a/DSView/test/CMakeLists.txt +++ b/DSView/test/CMakeLists.txt @@ -1,5 +1,5 @@ ## -## This file is part of the PulseView project. +## This file is part of the DSView project. ## ## Copyright (C) 2012 Joel Holdsworth ## Copyright (C) 2012-2013 Alexandru Gagniuc @@ -19,11 +19,14 @@ ## along with this program. If not, see . ## -cmake_minimum_required(VERSION 2.6) +cmake_minimum_required(VERSION 2.8.6) + include(FindPkgConfig) include(GNUInstallDirs) -project(DSLogic) +set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/CMake") + +project(DSView) #=============================================================================== #= User Options @@ -31,62 +34,76 @@ project(DSLogic) option(DISABLE_WERROR "Build without -Werror" TRUE) option(ENABLE_SIGNALS "Build with UNIX signals" TRUE) +option(ENABLE_DECODE "Build with libsigrokdecode" TRUE) +option(ENABLE_COTIRE "Enable cotire" FALSE) option(ENABLE_TESTS "Enable unit tests" FALSE) -option(STATIC_PKGDEPS_LIBS "Statically link to (pkgconfig) libraries" FALSE) +option(STATIC_PKGDEPS_LIBS "Statically link to (pkg-config) libraries" FALSE) +option(FORCE_QT4 "Force use of Qt4 even if Qt5 is available" FALSE) if(WIN32) # On Windows/MinGW we need to statically link to libraries. # This option is user configurable, but enable it by default on win32. set(STATIC_PKGDEPS_LIBS TRUE) - # For boost-thread we need two additional settings on win32: - set(Boost_USE_STATIC_LIBS on) - add_definitions(-DBOOST_THREAD_USE_LIB) - - # Windsws does not support UNIX signals + # Windows does not support UNIX signals. set(ENABLE_SIGNALS FALSE) endif() +if(NOT CMAKE_BUILD_TYPE) + set(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING + "Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel." + FORCE) +endif() + #=============================================================================== #= Dependencies #------------------------------------------------------------------------------- list(APPEND PKGDEPS - libsigrok4DSLogic>=0.2.0 - libusb-1.0>=1.0.16 + "libsigrok4DSL >= 0.2.0" + "libusb-1.0 >= 1.0.16" ) +if(ENABLE_DECODE) + list(APPEND PKGDEPS "libsigrokdecode>=0.3.0") +endif() -set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/cmake_modules/") - find_package(PkgConfig) pkg_check_modules(PKGDEPS REQUIRED ${PKGDEPS}) -find_package(Qt4 REQUIRED) - -# Find the platform's thread library (needed for boost-thread). -# This will set ${CMAKE_THREAD_LIBS_INIT} to the correct, OS-specific value. -find_package(Threads) - -if(WIN32) -# On Windows/MinGW the we need to use 'thread_win32' instead of 'thread'. -# The library is named libboost_thread_win32* (not libboost_thread*). -find_package(Boost 1.42 COMPONENTS system thread_win32 REQUIRED) +if(FORCE_QT4) + set(Qt5Core_FOUND FALSE) else() -find_package(Boost 1.42 COMPONENTS system thread REQUIRED) + find_package(Qt5Core QUIET) endif() +if(Qt5Core_FOUND) + message("-- Using Qt5") + find_package(Qt5Widgets REQUIRED) + find_package(Qt5Gui REQUIRED) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${Qt5Widgets_EXECUTABLE_COMPILE_FLAGS}") + set(QT_INCLUDE_DIRS ${Qt5Gui_INCLUDE_DIRS} ${Qt5Widgets_INCLUDE_DIRS}) + set(QT_LIBRARIES Qt5::Gui Qt5::Widgets) + add_definitions(${Qt5Gui_DEFINITIONS} ${Qt5Widgets_DEFINITIONS}) +else() + find_program(QT_QMAKE_EXECUTABLE NAMES qmake4 qmake-qt4 qmake-mac) + find_package(Qt4 REQUIRED) +endif() + +find_package(Threads) + +find_package(Boost 1.42 COMPONENTS filesystem system thread REQUIRED) find_package(libusb-1.0 REQUIRED) #=============================================================================== #= Config Header #------------------------------------------------------------------------------- -set(DS_TITLE DSLogic) -set(DS_DESCRIPTION "A GUI for DSLogic") +set(DS_TITLE DSView) +set(DS_DESCRIPTION "A GUI for instruments of DreamSourceLab") set(DS_VERSION_MAJOR 0) -set(DS_VERSION_MINOR 3) -set(DS_VERSION_MICRO 0) +set(DS_VERSION_MINOR 9) +set(DS_VERSION_MICRO 2) set(DS_VERSION_STRING ${DS_VERSION_MAJOR}.${DS_VERSION_MINOR}.${DS_VERSION_MICRO} ) @@ -100,36 +117,35 @@ configure_file ( #= Sources #------------------------------------------------------------------------------- -set(DSLogic_SOURCES +set(DSView_SOURCES main.cpp pv/devicemanager.cpp pv/mainwindow.cpp pv/sigsession.cpp + pv/storesession.cpp pv/data/analog.cpp pv/data/analogsnapshot.cpp + pv/data/dso.cpp + pv/data/dsosnapshot.cpp pv/data/group.cpp pv/data/groupsnapshot.cpp pv/data/logic.cpp pv/data/logicsnapshot.cpp pv/data/signaldata.cpp pv/data/snapshot.cpp - pv/data/dso.cpp - pv/data/dsosnapshot.cpp - pv/decoder/decoder.cpp - pv/decoder/decoderfactory.cpp - pv/decoder/democonfig.cpp - pv/decoder/ds1wire.cpp - pv/decoder/dsdmx512.cpp - pv/decoder/dsi2c.cpp - pv/decoder/dsserial.cpp - pv/decoder/dsspi.cpp + pv/device/devinst.cpp + pv/device/device.cpp + pv/device/file.cpp + pv/device/inputfile.cpp + pv/device/sessionfile.cpp pv/dialogs/about.cpp - pv/dialogs/connect.cpp pv/dialogs/deviceoptions.cpp pv/dialogs/search.cpp - pv/dock/fakelineedit.cpp + pv/dialogs/storeprogress.cpp + pv/dialogs/streamoptions.cpp + pv/dialogs/waitingdialog.cpp + pv/dock/dsotriggerdock.cpp pv/dock/measuredock.cpp - pv/dock/protocoldock.cpp pv/dock/searchdock.cpp pv/dock/triggerdock.cpp pv/prop/bool.cpp @@ -137,80 +153,117 @@ set(DSLogic_SOURCES pv/prop/enum.cpp pv/prop/int.cpp pv/prop/property.cpp + pv/prop/string.cpp pv/prop/binding/binding.cpp pv/prop/binding/binding_deviceoptions.cpp - pv/toolbars/devicebar.cpp pv/toolbars/filebar.cpp pv/toolbars/logobar.cpp pv/toolbars/samplingbar.cpp pv/toolbars/trigbar.cpp pv/view/analogsignal.cpp pv/view/cursor.cpp + pv/view/devmode.cpp + pv/view/dsldial.cpp + pv/view/dsosignal.cpp pv/view/groupsignal.cpp pv/view/header.cpp pv/view/logicsignal.cpp - pv/view/protocolsignal.cpp pv/view/ruler.cpp + pv/view/selectableitem.cpp pv/view/signal.cpp pv/view/timemarker.cpp + pv/view/trace.cpp pv/view/view.cpp pv/view/viewport.cpp - pv/view/dsosignal.cpp - pv/view/dsldial.cpp - pv/dock/dsotriggerdock.cpp + pv/widgets/fakelineedit.cpp ) -set(DSLogic_HEADERS - pv/sigsession.h +set(DSView_HEADERS pv/mainwindow.h - pv/decoder/democonfig.h - pv/dock/fakelineedit.h - pv/dock/measuredock.h - pv/dock/protocoldock.h - pv/dock/searchdock.h - pv/dock/triggerdock.h + pv/sigsession.h + pv/storesession.h + pv/device/devinst.h pv/dialogs/about.h - pv/dialogs/connect.h pv/dialogs/deviceoptions.h pv/dialogs/search.h - pv/toolbars/samplingbar.h - pv/toolbars/devicebar.h + pv/dialogs/storeprogress.h + pv/dialogs/streamoptions.h + pv/dialogs/waitingdialog.h + pv/dock/dsotriggerdock.h + pv/dock/measuredock.h + pv/dock/searchdock.h + pv/dock/triggerdock.h + pv/prop/bool.h + pv/prop/double.h + pv/prop/enum.h + pv/prop/int.h + pv/prop/property.h + pv/prop/string.h pv/toolbars/filebar.h pv/toolbars/logobar.h + pv/toolbars/samplingbar.h pv/toolbars/trigbar.h - pv/data/dso.h - pv/data/dsosnapshot.h pv/view/cursor.h + pv/view/devmode.h pv/view/header.h pv/view/ruler.h + pv/view/selectableitem.h pv/view/timemarker.h - pv/view/groupsignal.h - pv/view/protocolsignal.h + pv/view/trace.h pv/view/view.h - pv/view/dsosignal.h pv/view/viewport.h - pv/view/dsldial.h - pv/dock/dsotriggerdock.h + pv/widgets/fakelineedit.h ) -set(DSLogic_FORMS +set(DSView_FORMS pv/dialogs/about.ui - pv/decoder/dmx512config.ui - pv/decoder/i2cconfig.ui - pv/decoder/serialconfig.ui - pv/decoder/spiconfig.ui - pv/decoder/wire1config.ui ) -set(DSLogic_RESOURCES - DSLogic.qrc +set(DSView_RESOURCES + DSView.qrc ) -qt4_wrap_cpp(DSLogic_HEADERS_MOC ${DSLogic_HEADERS}) -qt4_wrap_ui(DSLogic_FORMS_HEADERS ${DSLogic_FORMS}) -qt4_add_resources(DSLogic_RESOURCES_RCC ${DSLogic_RESOURCES}) -include(${QT_USE_FILE}) +if(ENABLE_DECODE) + list(APPEND DSView_SOURCES + pv/dock/protocoldock.cpp + pv/data/decoderstack.cpp + pv/data/decode/annotation.cpp + pv/data/decode/decoder.cpp + pv/data/decode/row.cpp + pv/data/decode/rowdata.cpp + pv/prop/binding/decoderoptions.cpp + pv/view/decodetrace.cpp + pv/widgets/decodergroupbox.cpp + pv/widgets/decodermenu.cpp + ) + + list(APPEND DSView_HEADERS + pv/dock/protocoldock.h + pv/data/decoderstack.h + pv/view/decodetrace.h + pv/widgets/decodergroupbox.h + pv/widgets/decodermenu.h + ) +endif() + +if(WIN32) + # Use the DSView icon for the DSView.exe executable. + set(CMAKE_RC_COMPILE_OBJECT "${CMAKE_RC_COMPILER} -O coff -I${CMAKE_CURRENT_SOURCE_DIR} ") + enable_language(RC) + list(APPEND DSView_SOURCES DSView.rc) +endif() + +if(Qt5Core_FOUND) + qt5_wrap_cpp(DSView_HEADERS_MOC ${DSView_HEADERS}) + qt5_wrap_ui(DSView_FORMS_HEADERS ${DSView_FORMS}) + qt5_add_resources(DSView_RESOURCES_RCC ${DSView_RESOURCES}) +else() + qt4_wrap_cpp(DSView_HEADERS_MOC ${DSView_HEADERS}) + qt4_wrap_ui(DSView_FORMS_HEADERS ${DSView_FORMS}) + qt4_add_resources(DSView_RESOURCES_RCC ${DSView_RESOURCES}) + include(${QT_USE_FILE}) +endif() #=============================================================================== #= Global Definitions @@ -219,8 +272,12 @@ include(${QT_USE_FILE}) add_definitions(${QT_DEFINITIONS}) add_definitions(-Wall -Wextra -Wno-return-type -Wno-ignored-qualifiers) +if(ENABLE_DECODE) + add_definitions(-DENABLE_DECODE) +endif() + if(NOT DISABLE_WERROR) - add_definitions(-Werror) + add_definitions(-Werror) endif() #=============================================================================== @@ -231,6 +288,7 @@ include_directories( ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR} ${Boost_INCLUDE_DIRS} + ${QT_INCLUDE_DIRS} ) if(STATIC_PKGDEPS_LIBS) @@ -245,7 +303,7 @@ endif() link_directories(${Boost_LIBRARY_DIRS}) -set(DSLOGIC_LINK_LIBS +set(DSVIEW_LINK_LIBS ${Boost_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT} ${QT_LIBRARIES} @@ -254,25 +312,36 @@ set(DSLOGIC_LINK_LIBS if(STATIC_PKGDEPS_LIBS) link_directories(${PKGDEPS_STATIC_LIBRARY_DIRS}) - list(APPEND DSLOGIC_LINK_LIBS ${PKGDEPS_STATIC_LIBRARIES}) + list(APPEND DSVIEW_LINK_LIBS ${PKGDEPS_STATIC_LIBRARIES}) +if(WIN32) + # Workaround for a MinGW linking issue. + list(APPEND PULSEVIEW_LINK_LIBS "-llzma -llcms2") +endif() else() link_directories(${PKGDEPS_LIBRARY_DIRS}) - list(APPEND DSLOGIC_LINK_LIBS ${PKGDEPS_LIBRARIES}) + list(APPEND DSVIEW_LINK_LIBS ${PKGDEPS_LIBRARIES}) endif() + add_executable(${PROJECT_NAME} - ${DSLogic_SOURCES} - ${DSLogic_HEADERS_MOC} - ${DSLogic_FORMS_HEADERS} - ${DSLogic_RESOURCES_RCC} + ${DSView_SOURCES} + ${DSView_HEADERS_MOC} + ${DSView_FORMS_HEADERS} + ${DSView_RESOURCES_RCC} ) -target_link_libraries(${PROJECT_NAME} ${DSLOGIC_LINK_LIBS}) +target_link_libraries(${PROJECT_NAME} ${DSVIEW_LINK_LIBS}) if(WIN32) # Pass -mwindows so that no "DOS box" will open when PulseView is started. set_target_properties(${PROJECT_NAME} PROPERTIES LINK_FLAGS "-mwindows") endif() + + +if(ENABLE_COTIRE) + include(cotire) + cotire(${PROJECT_NAME}) +endif() set_target_properties(${PROJECT_NAME} PROPERTIES INSTALL_RPATH "/usr/local/lib") #=============================================================================== @@ -282,7 +351,12 @@ set_target_properties(${PROJECT_NAME} PROPERTIES INSTALL_RPATH "/usr/local/lib") # Install the executable. install(TARGETS ${PROJECT_NAME} DESTINATION bin/) install(FILES res/DSLogic.fw DESTINATION bin/res/) -install(FILES res/DSLogic.bin DESTINATION bin/res/) +install(FILES res/DSLogic33.bin DESTINATION bin/res/) +install(FILES res/DSLogic50.bin DESTINATION bin/res/) +install(FILES res/DSLogicPro.fw DESTINATION bin/res/) +install(FILES res/DSLogicPro.bin DESTINATION bin/res/) +install(FILES res/DSCope.fw DESTINATION bin/res/) +install(FILES res/DSCope.bin DESTINATION bin/res/) #=============================================================================== #= Packaging (handled by CPack) @@ -307,5 +381,5 @@ include(CPack) if(ENABLE_TESTS) add_subdirectory(test) enable_testing() - add_test(test ${CMAKE_CURRENT_BINARY_DIR}/test/DSLogic-test) + add_test(test ${CMAKE_CURRENT_BINARY_DIR}/test/DSView-test) endif(ENABLE_TESTS) diff --git a/INSTALL b/INSTALL index df6a9a4d..5a2a2a2e 100644 --- a/INSTALL +++ b/INSTALL @@ -5,7 +5,7 @@ INSTALL Requirements ------------ -libsigrok4DSLoigc +libsigrok4DSL - gcc (>= 4.0) - make - autoconf >= 2.63 @@ -32,11 +32,11 @@ DSLgoic-gui - libboost >= 1.42 (including the following libs): - libboost-system - libboost-thread - - libsigrok4DSLogic >= 0.2.0 + - libsigrok4DSL >= 0.2.0 Building and installing ----------------------- -Get the DSLogic source code from: www.dreamsourcelab.com/download.html +Get the DSView source code from: www.dreamsourcelab.com/download.html @@ -51,7 +51,7 @@ Building: -Step2: Build libsigrok4DSLogic +Step2: Build libsigrok4DSL Installing the requirements: @@ -69,7 +69,7 @@ OpenSuSE (12.2): Building: - $ cd libsigrok4DSLogic + $ cd libsigrok4DSL $ ./autogen.sh $ ./configure $ make @@ -98,7 +98,7 @@ $ make $ sudo make install -Step4: Build DSLogic-gui +Step4: Build DSView Installing the requirements: @@ -112,7 +112,7 @@ $ sudo yum install git gcc cmake libtool pkgconfig glib2-devel \ Building: -$ cd DSLogic-gui +$ cd DSView $ cmake . $ make $ sudo make install diff --git a/NEWS b/NEWS index c45e943a..55c50d60 100644 --- a/NEWS +++ b/NEWS @@ -1,3 +1,13 @@ +0.92 (2015-04-15) +----------------- + * Add DSLogic Pro and DSCope support + * Add Stream mode to DSLogic & DSLogic Pro + * Support up to 1G samples @ LA mode + * Add zero adjustment @ Oscilloscope mode + * Support zero skew parameters restore + * Enhance stbility + * Fix other bugs + 0.4 (2014-09-24) ----------------- * Add protocol decoders (38) support diff --git a/README b/README index 9084f2ea..6ca65b32 100644 --- a/README +++ b/README @@ -1,9 +1,9 @@ ------------------------------------------------------------------------------- README ------------------------------------------------------------------------------- -DSLogic is an open source multi-function instrument for everyone. -DSLogic software is based on sigrok project. -You can find DSLogic on: +DSView is an GUI programe for supporting various instruments from DreamSourceLab, including logic analyzer, oscilloscope, etc. +DSView is based on sigrok project. +You can find DreamSourceLab on: www.dreamsourcelab.com www.kickstarter.com/projects/dreamsourcelab/dslogic-multifunction-instruments-for-everyone @@ -14,7 +14,7 @@ device types (such as logic analyzers, oscilloscopes, multimeters, and more). Status ------ -DSLogic software is in a usable state and has had official tarball releases. +DSView software is in a usable state and has had official tarball releases. However, it is still work in progress. Some basic functionality is available and working, but other things are still on the TODO list. @@ -23,7 +23,7 @@ is available and working, but other things are still on the TODO list. Copyright and license --------------------- -DSLogic software is licensed under the terms of the GNU General Public License +DSView software is licensed under the terms of the GNU General Public License (GPL), version 3 or later. While some individual source code files are licensed under the GPLv2+, and diff --git a/libsigrok4DSL/Makefile.am b/libsigrok4DSL/Makefile.am index 52c9f0e4..e77f42f4 100644 --- a/libsigrok4DSL/Makefile.am +++ b/libsigrok4DSL/Makefile.am @@ -1,5 +1,5 @@ ## -## This file is part of the libsigrok4DSLogic project. +## This file is part of the libsigrok4DSL project. ## ## Copyright (C) 2010-2012 Bert Vermeulen ## Copyright (C) 2012 Alexandru Gagniuc @@ -24,11 +24,11 @@ AM_CPPFLAGS = -I$(top_srcdir) SUBDIRS = hardware input output tests -lib_LTLIBRARIES = libsigrok4DSLogic.la +lib_LTLIBRARIES = libsigrok4DSL.la -libsigrok4DSLogic_la_SOURCES = \ +libsigrok4DSL_la_SOURCES = \ backend.c \ - device.c \ + dsdevice.c \ session.c \ session_file.c \ session_driver.c \ @@ -41,20 +41,20 @@ libsigrok4DSLogic_la_SOURCES = \ error.c \ std.c -libsigrok4DSLogic_la_LIBADD = \ +libsigrok4DSL_la_LIBADD = \ $(LIBOBJS) \ - hardware/libsigrok4DSLogichardware.la \ - input/libsigrok4DSLogicinput.la \ - output/libsigrok4DSLogicoutput.la + hardware/libsigrok4DSLhardware.la \ + input/libsigrok4DSLinput.la \ + output/libsigrok4DSLoutput.la -libsigrok4DSLogic_la_LDFLAGS = $(SR_LIB_LDFLAGS) +libsigrok4DSL_la_LDFLAGS = $(SR_LIB_LDFLAGS) -library_includedir = $(includedir)/libsigrok4DSLogic +library_includedir = $(includedir)/libsigrok4DSL library_include_HEADERS = libsigrok.h proto.h version.h noinst_HEADERS = libsigrok-internal.h pkgconfigdir = $(libdir)/pkgconfig -pkgconfig_DATA = libsigrok4DSLogic.pc +pkgconfig_DATA = libsigrok4DSL.pc EXTRA_DIST = Doxyfile README.devices diff --git a/libsigrok4DSL/README b/libsigrok4DSL/README index 437294c4..2c01015b 100644 --- a/libsigrok4DSL/README +++ b/libsigrok4DSL/README @@ -1,9 +1,9 @@ ------------------------------------------------------------------------------- README ------------------------------------------------------------------------------- -libsigrok4DSLogic is a shared library which provides the basic API -for DSLogic hardware. -libsigrok4DSLogic is based on libsigrok, a shared library from the sigrok project. +libsigrok4DSL is a shared library which provides the basic API +for DreamSourceLab hardware. +libsigrok4DSL is based on libsigrok, a shared library from the sigrok project. The sigrok project aims at creating a portable, cross-platform, Free/Libre/Open-Source signal analysis software suite that supports various @@ -47,7 +47,7 @@ Requirements Building and installing ----------------------- -Get the libsigrok4DSLogic source code from: www.dreamsourcelab.com/download.html +Get the libsigrok4DSL source code from: www.dreamsourcelab.com/download.html In order to build it, run: $ cd libsigrok @@ -55,7 +55,7 @@ In order to build it, run: $ ./configure $ make -For installing libsigrok4DSLogic: +For installing libsigrok4DSL: $ make install @@ -67,7 +67,7 @@ See INSTALL or the following wiki page for more (OS-specific) instructions: Copyright and license --------------------- -libsigrok4DSLogic is licensed under the terms of the GNU General Public License +libsigrok4DSL is licensed under the terms of the GNU General Public License (GPL), version 3 or later. While some individual source code files are licensed under the GPLv2+, and diff --git a/libsigrok4DSL/configure.ac b/libsigrok4DSL/configure.ac index 55d314f4..0e1bb392 100644 --- a/libsigrok4DSL/configure.ac +++ b/libsigrok4DSL/configure.ac @@ -27,8 +27,8 @@ m4_define([sr_package_version_minor], [2]) m4_define([sr_package_version_micro], [0]) m4_define([sr_package_version], [sr_package_version_major.sr_package_version_minor.sr_package_version_micro]) -AC_INIT([libsigrok4DSLogic], [sr_package_version], [support@dreamsourcelab.com], - [libsigrok4DSLogic], [http://www.dreamsourcelab.com]) +AC_INIT([libsigrok4DSL], [sr_package_version], [support@dreamsourcelab.com], + [libsigrok4DSL], [http://www.dreamsourcelab.com]) AC_CONFIG_HEADER([config.h]) AC_CONFIG_MACRO_DIR([autostuff]) AC_CONFIG_AUX_DIR([autostuff]) @@ -86,10 +86,10 @@ AC_ARG_ENABLE(demo, AC_HELP_STRING([--enable-demo], [enable demo driver support [default=yes]]), [HW_DEMO="$enableval"], [HW_DEMO=$HW_ENABLED_DEFAULT]) -AC_ARG_ENABLE(DSLogic, AC_HELP_STRING([--enable-DSLogic], - [enable DSLogic support [default=yes]]), - [HW_DSLOGIC="$enableval"], - [HW_DSLOGIC=$HW_ENABLED_DEFAULT]) +AC_ARG_ENABLE(DSL, AC_HELP_STRING([--enable-DSL], + [enable DreamSourceLab hardware support [default=yes]]), + [HW_DSL="$enableval"], + [HW_DSL=$HW_ENABLED_DEFAULT]) # Checks for libraries. case "$host" in @@ -100,7 +100,7 @@ esac # This variable collects the pkg-config names of all detected libs. # It is then used to construct the "Requires.private:" field in the -# libsigrok4DSLogic.pc file. +# libsigrok4DSL.pc file. SR_PKGLIBS="" # libm (the standard math library) is always needed. @@ -182,9 +182,9 @@ if test "x$HW_DEMO" = "xyes"; then AC_DEFINE(HAVE_LA_DEMO, 1, [Demo driver support]) fi -AM_CONDITIONAL(HW_DSLOGIC, test x$HW_DSLOGIC = xyes) -if test "x$HW_DSLOGIC" = "xyes"; then - AC_DEFINE(HAVE_LA_DSLOGIC, 1, [DSLogic driver support]) +AM_CONDITIONAL(HW_DSL, test x$HW_DSL = xyes) +if test "x$HW_DSL" = "xyes"; then + AC_DEFINE(HAVE_DSL_DEVICE, 1, [DreamSourceLab hardware driver support]) fi # Checks for header files. @@ -224,11 +224,11 @@ AC_SUBST(SR_PACKAGE_VERSION) AC_CONFIG_FILES([Makefile version.h hardware/Makefile hardware/demo/Makefile hardware/common/Makefile - hardware/DSLogic/Makefile + hardware/DSL/Makefile input/Makefile output/Makefile output/text/Makefile - libsigrok4DSLogic.pc + libsigrok4DSL.pc tests/Makefile ]) @@ -259,6 +259,6 @@ done echo -e "\nEnabled hardware drivers:\n" echo " - demo............................ $HW_DEMO" -echo " - DSLogic......................... $HW_DSLOGIC" +echo " - DreamSourceLab.................. $HW_DSL" echo diff --git a/libsigrok4DSL/dsdevice.c b/libsigrok4DSL/dsdevice.c index 39f81250..fc324d11 100644 --- a/libsigrok4DSL/dsdevice.c +++ b/libsigrok4DSL/dsdevice.c @@ -259,6 +259,7 @@ SR_PRIV void sr_dev_probes_free(struct sr_dev_inst *sdi) for (l = sdi->channels; l; l = l->next) { probe = l->data; g_free(probe->name); + g_free(probe->trigger); g_free(probe); } diff --git a/libsigrok4DSL/hardware/DSL/Makefile.am b/libsigrok4DSL/hardware/DSL/Makefile.am index c121d230..0d025752 100644 --- a/libsigrok4DSL/hardware/DSL/Makefile.am +++ b/libsigrok4DSL/hardware/DSL/Makefile.am @@ -19,13 +19,14 @@ # Local lib, this is NOT meant to be installed! -noinst_LTLIBRARIES = libsigrok4DSLogic_hw_dslogic.la +noinst_LTLIBRARIES = libsigrok4DSL_hw_dsl.la -libsigrok4DSLogic_hw_dslogic_la_SOURCES = \ +libsigrok4DSL_hw_dsl_la_SOURCES = \ command.c \ - dslogic.c + dslogic.c \ + dscope.c -libsigrok4DSLogic_hw_dslogic_la_CFLAGS = \ +libsigrok4DSL_hw_dsl_la_CFLAGS = \ -I$(top_srcdir) diff --git a/libsigrok4DSL/hardware/DSL/command.c b/libsigrok4DSL/hardware/DSL/command.c index dbdb06a2..accf2f15 100644 --- a/libsigrok4DSL/hardware/DSL/command.c +++ b/libsigrok4DSL/hardware/DSL/command.c @@ -17,11 +17,11 @@ * along with this program. If not, see . */ -#include +//#include #include "command.h" //#include "libsigrok.h" -#include "libsigrok-internal.h" -#include "dslogic.h" +#include "dsl.h" +#include SR_PRIV int command_get_fw_version(libusb_device_handle *devhdl, struct version_info *vi) @@ -30,7 +30,7 @@ SR_PRIV int command_get_fw_version(libusb_device_handle *devhdl, ret = libusb_control_transfer(devhdl, LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_ENDPOINT_IN, CMD_GET_FW_VERSION, 0x0000, 0x0000, - (unsigned char *)vi, sizeof(struct version_info), 100); + (unsigned char *)vi, sizeof(struct version_info), 3000); if (ret < 0) { sr_err("Unable to get version info: %s.", @@ -48,7 +48,7 @@ SR_PRIV int command_get_revid_version(libusb_device_handle *devhdl, ret = libusb_control_transfer(devhdl, LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_ENDPOINT_IN, CMD_GET_REVID_VERSION, 0x0000, 0x0000, - revid, 1, 100); + revid, 1, 3000); if (ret < 0) { sr_err("Unable to get REVID: %s.", libusb_error_name(ret)); @@ -168,7 +168,7 @@ SR_PRIV int command_fpga_setting(libusb_device_handle *devhdl, uint32_t setting_ return SR_OK; } -SR_PRIV int command_dso_ctrl(libusb_device_handle *devhdl, uint32_t command) +SR_PRIV int command_dso_ctrl(libusb_device_handle *devhdl, uint64_t command) { struct cmd_control cmd; int ret; @@ -178,6 +178,10 @@ SR_PRIV int command_dso_ctrl(libusb_device_handle *devhdl, uint32_t command) cmd.byte1 = (uint8_t)(command >> 8); cmd.byte2 = (uint8_t)(command >> 16); cmd.byte3 = (uint8_t)(command >> 24); + cmd.byte4 = (uint8_t)(command >> 32); + cmd.byte5 = (uint8_t)(command >> 40); + cmd.byte6 = (uint8_t)(command >> 48); + cmd.byte7 = (uint8_t)(command >> 56); /* Send the control command. */ @@ -194,16 +198,107 @@ SR_PRIV int command_dso_ctrl(libusb_device_handle *devhdl, uint32_t command) } SR_PRIV int command_get_status(libusb_device_handle *devhdl, - struct sr_status *status) + unsigned char *status, int begin, int end) { + struct cmd_status_info cmd; int ret; + /* status acquisition command */ + assert(begin >= 0); + assert(end >= 0); + cmd.begin = begin; + cmd.end = end; + + /* Send the control message. */ + ret = libusb_control_transfer(devhdl, LIBUSB_REQUEST_TYPE_VENDOR | + LIBUSB_ENDPOINT_OUT, CMD_STATUS_INFO, 0x0000, 0x0000, + (unsigned char *)&cmd, sizeof(cmd), 3000); + if (ret < 0) { + sr_err("Unable to send status info: %s.", + libusb_error_name(ret)); + return SR_ERR; + } + + g_usleep(10*1000); + ret = libusb_control_transfer(devhdl, LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_ENDPOINT_IN, CMD_STATUS, 0x0000, 0x0000, - (unsigned char *)status, sizeof(struct sr_status), 3000); + (unsigned char *)status, CMD_STATUS_CNT, 3000); if (ret < 0) { - sr_err("Unable to get version info: %s.", + sr_err("Unable to get status info: %s.", + libusb_error_name(ret)); + return SR_ERR; + } + + return SR_OK; +} + +SR_PRIV int command_vth(libusb_device_handle *devhdl, double vth) +{ + int ret; + uint8_t cmd; + + cmd = vth/5.0 * 255; + /* Send the control command. */ + ret = libusb_control_transfer(devhdl, LIBUSB_REQUEST_TYPE_VENDOR | + LIBUSB_ENDPOINT_OUT, CMD_VTH, 0x0000, 0x0000, + (unsigned char *)&cmd, sizeof(cmd), 3000); + if (ret < 0) { + sr_err("Unable to send VTH command: %s.", + libusb_error_name(ret)); + return SR_ERR; + } + + return SR_OK; +} + +SR_PRIV int command_wr_nvm(libusb_device_handle *devhdl, unsigned char *ctx, uint8_t len) +{ + int ret; + + /* Send the control message. */ + ret = libusb_control_transfer(devhdl, LIBUSB_REQUEST_TYPE_VENDOR | + LIBUSB_ENDPOINT_OUT, CMD_WR_NVM, 0x0000, 0x0000, + (unsigned char *)ctx, len, 3000); + + if (ret < 0) { + sr_err("Unable to get status info: %s.", + libusb_error_name(ret)); + return SR_ERR; + } + + return SR_OK; +} + +SR_PRIV int command_rd_nvm(libusb_device_handle *devhdl, unsigned char *ctx, uint8_t addr, uint8_t len) +{ + int ret; + + struct cmd_nvm_info nvm_info; + assert(len <= 8); + nvm_info.addr = addr; + nvm_info.len = len; + + /* Send the control message. */ + ret = libusb_control_transfer(devhdl, LIBUSB_REQUEST_TYPE_VENDOR | + LIBUSB_ENDPOINT_OUT, CMD_RD_NVM_PRE, 0x0000, 0x0000, + (unsigned char *)&nvm_info, sizeof(struct cmd_nvm_info), 3000); + if (ret < 0) { + sr_err("Unable to send CMD_ZERO_RD_PRE command: %s.", + libusb_error_name(ret)); + return SR_ERR; + } + + g_usleep(10*1000); + + /* Send the control message. */ + ret = libusb_control_transfer(devhdl, LIBUSB_REQUEST_TYPE_VENDOR | + LIBUSB_ENDPOINT_IN, CMD_RD_NVM, 0x0000, 0x0000, + (unsigned char *)ctx, len, 3000); + + if (ret < 0) { + sr_err("Unable to get zero info: %s.", libusb_error_name(ret)); return SR_ERR; } diff --git a/libsigrok4DSL/hardware/DSL/command.h b/libsigrok4DSL/hardware/DSL/command.h index e1390144..5f9735a0 100644 --- a/libsigrok4DSL/hardware/DSL/command.h +++ b/libsigrok4DSL/hardware/DSL/command.h @@ -17,11 +17,12 @@ * along with this program. If not, see . */ -#ifndef LIBDSLOGIC_HARDWARE_COMMAND_H -#define LIBDSLOGIC_HARDWARE_COMMAND_H +#ifndef LIBDSL_HARDWARE_COMMAND_H +#define LIBDSL_HARDWARE_COMMAND_H #include #include "libsigrok.h" +#include "libsigrok-internal.h" /* Protocol commands */ #define CMD_GET_FW_VERSION 0xb0 @@ -31,6 +32,11 @@ #define CMD_SETTING 0xb4 #define CMD_CONTROL 0xb5 #define CMD_STATUS 0xb6 +#define CMD_STATUS_INFO 0xb7 +#define CMD_VTH 0xb8 +#define CMD_WR_NVM 0xb9 +#define CMD_RD_NVM 0xba +#define CMD_RD_NVM_PRE 0xbb #define CMD_START_FLAGS_MODE_POS 4 #define CMD_START_FLAGS_WIDE_POS 5 @@ -47,6 +53,8 @@ #define CMD_START_FLAGS_STOP (1 << CMD_START_FLAGS_STOP_POS) +#define CMD_STATUS_CNT 32 + #pragma pack(push, 1) struct version_info { @@ -77,6 +85,40 @@ struct cmd_control { uint8_t byte1; uint8_t byte2; uint8_t byte3; + uint8_t byte4; + uint8_t byte5; + uint8_t byte6; + uint8_t byte7; +}; + +struct cmd_status_info { + uint8_t begin; + uint8_t end; +}; + +struct cmd_zero_info { + uint8_t zero_addr; + uint8_t vpos_l; + uint8_t vpos_h; + uint8_t voff_l; + uint8_t voff_h; + uint8_t vcntr_l; + uint8_t vcntr_h; + uint8_t adc_off; +}; + +struct cmd_comb_info { + uint8_t comb_addr; + uint8_t comb0_low_off; + uint8_t comb0_hig_off; + uint8_t comb1_low_off; + uint8_t comb1_hig_off; + uint8_t comb_sign; +}; + +struct cmd_nvm_info { + uint8_t addr; + uint8_t len; }; #pragma pack(pop) @@ -92,9 +134,15 @@ SR_PRIV int command_stop_acquistition(libusb_device_handle *devhdl); SR_PRIV int command_fpga_config(libusb_device_handle *devhdl); SR_PRIV int command_fpga_setting(libusb_device_handle *devhdl, uint32_t setting_count); -SR_PRIV int command_dso_ctrl(libusb_device_handle *devhdl, uint32_t command); +SR_PRIV int command_dso_ctrl(libusb_device_handle *devhdl, uint64_t command); SR_PRIV int command_get_status(libusb_device_handle *devhdl, - struct sr_status *status); + unsigned char *status, + int begin, int end); + +SR_PRIV int command_vth(libusb_device_handle *devhdl, double vth); + +SR_PRIV int command_wr_nvm(libusb_device_handle *devhdl, unsigned char *ctx, uint8_t len); +SR_PRIV int command_rd_nvm(libusb_device_handle *devhdl, unsigned char *ctx, uint8_t addr, uint8_t len); #endif diff --git a/libsigrok4DSL/hardware/DSL/dscope.c b/libsigrok4DSL/hardware/DSL/dscope.c new file mode 100644 index 00000000..7b99c2f0 --- /dev/null +++ b/libsigrok4DSL/hardware/DSL/dscope.c @@ -0,0 +1,2391 @@ +/* + * This file is part of the libsigrok project. + * + * Copyright (C) 2013 Bert Vermeulen + * Copyright (C) 2013 DreamSourceLab + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include +#include +#include +#include +#include +#include + +#include +#include +//#include +#include "dsl.h" +#include "command.h" + +#undef min +#define min(a,b) ((a)<(b)?(a):(b)) + +static const int single_buffer_time = 20; +static const int total_buffer_time = 200; +static const int buffer_size = 1024 * 1024; +static const int instant_buffer_size = 1024 * 1024; +static const int cons_buffer_size = 128; +static const int buffer_cnt = 4; + +static struct sr_dev_mode mode_list[] = { + {"OSC", DSO}, +}; + +static const char *opmodes[] = { + "Normal", + "Internal Test", + "External Test", + "DRAM Loopback Test", +}; + +static const char *thresholds[] = { + "1.8/2.5/3.3V Level", + "5.0V Level", +}; + +static const char *filters[] = { + "None", + "1 Sample Clock", +}; + +static const int32_t hwopts[] = { + SR_CONF_CONN, +}; + +static const int32_t hwcaps[] = { + SR_CONF_LOGIC_ANALYZER, + SR_CONF_TRIGGER_TYPE, + SR_CONF_SAMPLERATE, + + /* These are really implemented in the driver, not the hardware. */ + SR_CONF_LIMIT_SAMPLES, + SR_CONF_CONTINUOUS, +}; + +static const int32_t hwoptions[] = { + SR_CONF_OPERATION_MODE, +}; + +static const char *probe_names[] = { + "0", "1", "2", "3", "4", "5", "6", "7", + "8", "9", "10", "11", "12", "13", "14", "15", + NULL, +}; + +static uint16_t test_sample_value; +static uint16_t test_init = 1; + +static const uint64_t samplerates[] = { + SR_KHZ(10), + SR_KHZ(20), + SR_KHZ(50), + SR_KHZ(100), + SR_KHZ(200), + SR_KHZ(500), + SR_MHZ(1), + SR_MHZ(2), + SR_MHZ(5), + SR_MHZ(10), + SR_MHZ(20), + SR_MHZ(25), + SR_MHZ(50), + SR_MHZ(100), + SR_MHZ(200), +}; + +static const uint64_t samplecounts[] = { + SR_KB(1), + SR_KB(2), + SR_KB(4), + SR_KB(8), + SR_KB(16), + SR_KB(32), + SR_KB(64), + SR_KB(128), + SR_KB(256), + SR_KB(512), + SR_MB(1), + SR_MB(2), + SR_MB(4), + SR_MB(8), + SR_MB(16), + SR_MB(32), +}; + +static const uint8_t zero_base_addr = 0x80; +static const uint8_t comb_base_addr = 0xB0; + +SR_PRIV struct sr_dev_driver DSCope_driver_info; +static struct sr_dev_driver *di = &DSCope_driver_info; + +extern struct ds_trigger *trigger; + +gboolean mstatus_valid = FALSE; +struct sr_status mstatus; +struct cmd_zero_info zero_info; +struct cmd_comb_info comb_info; + +/** + * Check the USB configuration to determine if this is an DSCope device. + * + * @return TRUE if the device's configuration profile match DSCope + * configuration, FALSE otherwise. + */ +static gboolean check_conf_profile(libusb_device *dev) +{ + struct libusb_device_descriptor des; + struct libusb_device_handle *hdl; + gboolean ret; + unsigned char strdesc[64]; + + hdl = NULL; + ret = FALSE; + while (!ret) { + /* Assume the FW has not been loaded, unless proven wrong. */ + if (libusb_get_device_descriptor(dev, &des) != 0) + break; + + if (libusb_open(dev, &hdl) != 0) + break; + + if (libusb_get_string_descriptor_ascii(hdl, + des.iManufacturer, strdesc, sizeof(strdesc)) < 0) + break; + if (strncmp((const char *)strdesc, "DreamSourceLab", 14)) + break; + + if (libusb_get_string_descriptor_ascii(hdl, + des.iProduct, strdesc, sizeof(strdesc)) < 0) + break; + if (strncmp((const char *)strdesc, "DSCope", 6)) + break; + + /* If we made it here, it must be an DSCope. */ + ret = TRUE; + } + if (hdl) + libusb_close(hdl); + + return ret; +} + +static int fpga_setting(const struct sr_dev_inst *sdi) +{ + struct DSL_context *devc; + struct sr_usb_dev_inst *usb; + struct libusb_device_handle *hdl; + struct DSL_setting setting; + int ret; + int transferred; + int result; + int i; + int channel_en_cnt = 0; + int channel_cnt = 0; + GSList *l; + + devc = sdi->priv; + usb = sdi->conn; + hdl = usb->devhdl; + + setting.sync = 0xf5a5f5a5; + setting.mode_header = 0x0001; + setting.divider_header = 0x0102ffff; + setting.count_header = 0x0302ffff; + setting.trig_pos_header = 0x0502ffff; + setting.trig_glb_header = 0x0701; + setting.trig_adp_header = 0x0a02ffff; + setting.trig_sda_header = 0x0c02ffff; + setting.trig_mask0_header = 0x1010ffff; + setting.trig_mask1_header = 0x1110ffff; + //setting.trig_mask2_header = 0x1210ffff; + //setting.trig_mask3_header = 0x1310ffff; + setting.trig_value0_header = 0x1410ffff; + setting.trig_value1_header = 0x1510ffff; + //setting.trig_value2_header = 0x1610ffff; + //setting.trig_value3_header = 0x1710ffff; + setting.trig_edge0_header = 0x1810ffff; + setting.trig_edge1_header = 0x1910ffff; + //setting.trig_edge2_header = 0x1a10ffff; + //setting.trig_edge3_header = 0x1b10ffff; + setting.trig_count0_header = 0x1c10ffff; + setting.trig_count1_header = 0x1d10ffff; + //setting.trig_count2_header = 0x1e10ffff; + //setting.trig_count3_header = 0x1f10ffff; + setting.trig_logic0_header = 0x2010ffff; + setting.trig_logic1_header = 0x2110ffff; + //setting.trig_logic2_header = 0x2210ffff; + //setting.trig_logic3_header = 0x2310ffff; + setting.end_sync = 0xfa5afa5a; + + for (l = sdi->channels; l; l = l->next) { + struct sr_channel *probe = (struct sr_channel *)l->data; + channel_en_cnt += probe->enabled; + channel_cnt++; + } + if (channel_en_cnt == 0) + channel_en_cnt = 1; + //setting.mode = (test_mode ? 0x8000 : 0x0000) + trigger->trigger_en + (sdi->mode << 4); + setting.mode = ((devc->op_mode == SR_OP_INTERNAL_TEST) << 15) + + ((devc->op_mode == SR_OP_EXTERNAL_TEST) << 14) + + ((devc->op_mode == SR_OP_LOOPBACK_TEST) << 13) + + trigger->trigger_en + + ((sdi->mode > 0) << 4) + (devc->clock_type << 1) + (devc->clock_edge << 1) + + (((devc->cur_samplerate == SR_MHZ(200) && sdi->mode != DSO) || (sdi->mode == ANALOG)) << 5) + + ((devc->cur_samplerate == SR_MHZ(400)) << 6) + + ((sdi->mode == ANALOG) << 7) + + ((devc->filter == SR_FILTER_1T) << 8) + + (devc->instant << 9) + (devc->zero << 10); + setting.divider = devc->zero ? 0x1 : (uint32_t)ceil(SR_MHZ(100) * 1.0 / devc->cur_samplerate); + setting.count = (uint32_t)(devc->limit_samples / (channel_cnt / channel_en_cnt)); + setting.trig_pos = (uint32_t)(trigger->trigger_pos / 100.0f * devc->limit_samples); + setting.trig_glb = trigger->trigger_stages; + setting.trig_adp = setting.count - setting.trig_pos - 1; + setting.trig_sda = 0x0; + if (trigger->trigger_mode == SIMPLE_TRIGGER) { + setting.trig_mask0[0] = ds_trigger_get_mask0(TriggerStages); + setting.trig_mask1[0] = ds_trigger_get_mask1(TriggerStages); + + setting.trig_value0[0] = ds_trigger_get_value0(TriggerStages); + setting.trig_value1[0] = ds_trigger_get_value1(TriggerStages); + + setting.trig_edge0[0] = ds_trigger_get_edge0(TriggerStages); + setting.trig_edge1[0] = ds_trigger_get_edge1(TriggerStages); + + setting.trig_count0[0] = trigger->trigger0_count[TriggerStages]; + setting.trig_count1[0] = trigger->trigger1_count[TriggerStages]; + + setting.trig_logic0[0] = (trigger->trigger_logic[TriggerStages] << 1) + trigger->trigger0_inv[TriggerStages]; + setting.trig_logic1[0] = (trigger->trigger_logic[TriggerStages] << 1) + trigger->trigger1_inv[TriggerStages]; + + for (i = 1; i < NUM_TRIGGER_STAGES; i++) { + setting.trig_mask0[i] = 0xff; + setting.trig_mask1[i] = 0xff; + + setting.trig_value0[i] = 0; + setting.trig_value1[i] = 0; + + setting.trig_edge0[i] = 0; + setting.trig_edge1[i] = 0; + + setting.trig_count0[i] = 0; + setting.trig_count1[i] = 0; + + setting.trig_logic0[i] = 2; + setting.trig_logic1[i] = 2; + } + } else { + for (i = 0; i < NUM_TRIGGER_STAGES; i++) { + setting.trig_mask0[i] = ds_trigger_get_mask0(i); + setting.trig_mask1[i] = ds_trigger_get_mask1(i); + + setting.trig_value0[i] = ds_trigger_get_value0(i); + setting.trig_value1[i] = ds_trigger_get_value1(i); + + setting.trig_edge0[i] = ds_trigger_get_edge0(i); + setting.trig_edge1[i] = ds_trigger_get_edge1(i); + + setting.trig_count0[i] = trigger->trigger0_count[i]; + setting.trig_count1[i] = trigger->trigger1_count[i]; + + setting.trig_logic0[i] = (trigger->trigger_logic[i] << 1) + trigger->trigger0_inv[i]; + setting.trig_logic1[i] = (trigger->trigger_logic[i] << 1) + trigger->trigger1_inv[i]; + } + } + + result = SR_OK; + ret = libusb_bulk_transfer(hdl, 2 | LIBUSB_ENDPOINT_OUT, + &setting, sizeof(struct DSL_setting), + &transferred, 1000); + + if (ret < 0) { + sr_err("Unable to setting FPGA of DSCope: %s.", + libusb_error_name(ret)); + result = SR_ERR; + } else if (transferred != sizeof(struct DSL_setting)) { + sr_err("Setting FPGA error: expacted transfer size %d; actually %d", + sizeof(struct DSL_setting), transferred); + result = SR_ERR; + } + + if (result == SR_OK) + sr_info("FPGA setting done"); + + return result; +} + +static int fpga_config(struct libusb_device_handle *hdl, const char *filename) +{ + FILE *fw; + int offset, chunksize, ret, result; + unsigned char *buf; + int transferred; + uint64_t filesize; + struct stat f_stat; + + sr_info("Configure FPGA using %s", filename); + if ((fw = fopen(filename, "rb")) == NULL) { + sr_err("Unable to open FPGA bit file %s for reading: %s", + filename, strerror(errno)); + return SR_ERR; + } + + if (stat(filename, &f_stat) == -1) + return SR_ERR; + + filesize = (uint64_t)f_stat.st_size; + + if (!(buf = g_try_malloc(filesize))) { + sr_err("FPGA configure bit malloc failed."); + return SR_ERR; + } + + result = SR_OK; + offset = 0; + while (1) { + chunksize = fread(buf, 1, filesize, fw); + if (chunksize == 0) + break; + + //do { + ret = libusb_bulk_transfer(hdl, 2 | LIBUSB_ENDPOINT_OUT, + buf, chunksize, + &transferred, 1000); + //} while(ret == LIBUSB_ERROR_TIMEOUT); + + if (ret < 0) { + sr_err("Unable to configure FPGA of DSCope: %s.", + libusb_error_name(ret)); + result = SR_ERR; + break; + } else if (transferred != chunksize) { + sr_err("Configure FPGA error: expacted transfer size %d; actually %d", + chunksize, transferred); + result = SR_ERR; + break; + } + sr_info("Configure %d bytes", chunksize); + offset += chunksize; + } + fclose(fw); + if (result == SR_OK) + sr_info("FPGA configure done"); + + return result; +} + +static int DSCope_dev_open(struct sr_dev_inst *sdi) +{ + libusb_device **devlist; + struct sr_usb_dev_inst *usb; + struct libusb_device_descriptor des; + struct DSL_context *devc; + struct drv_context *drvc; + struct version_info vi; + int ret, skip, i, device_count; + uint8_t revid; + + drvc = di->priv; + devc = sdi->priv; + usb = sdi->conn; + + if (sdi->status == SR_ST_ACTIVE) + /* Device is already in use. */ + return SR_ERR; + + skip = 0; + device_count = libusb_get_device_list(drvc->sr_ctx->libusb_ctx, &devlist); + if (device_count < 0) { + sr_err("Failed to get device list: %s.", + libusb_error_name(device_count)); + return SR_ERR; + } + + for (i = 0; i < device_count; i++) { + if ((ret = libusb_get_device_descriptor(devlist[i], &des))) { + sr_err("Failed to get device descriptor: %s.", + libusb_error_name(ret)); + continue; + } + + if (des.idVendor != devc->profile->vid + || des.idProduct != devc->profile->pid) + continue; + + if (sdi->status == SR_ST_INITIALIZING) { + if (skip != sdi->index) { + /* Skip devices of this type that aren't the one we want. */ + skip += 1; + continue; + } + } else if (sdi->status == SR_ST_INACTIVE) { + /* + * This device is fully enumerated, so we need to find + * this device by vendor, product, bus and address. + */ + if (libusb_get_bus_number(devlist[i]) != usb->bus + || libusb_get_device_address(devlist[i]) != usb->address) + /* This is not the one. */ + continue; + } + + if (!(ret = libusb_open(devlist[i], &usb->devhdl))) { + if (usb->address == 0xff) + /* + * First time we touch this device after FW + * upload, so we don't know the address yet. + */ + usb->address = libusb_get_device_address(devlist[i]); + } else { + sr_err("Failed to open device: %s.", + libusb_error_name(ret)); + break; + } + + ret = command_get_fw_version(usb->devhdl, &vi); + if (ret != SR_OK) { + sr_err("Failed to get firmware version."); + break; + } + + ret = command_get_revid_version(usb->devhdl, &revid); + if (ret != SR_OK) { + sr_err("Failed to get REVID."); + break; + } + + /* + * Changes in major version mean incompatible/API changes, so + * bail out if we encounter an incompatible version. + * Different minor versions are OK, they should be compatible. + */ + if (vi.major != DSL_REQUIRED_VERSION_MAJOR) { + sr_err("Expected firmware version %d.x, " + "got %d.%d.", DSL_REQUIRED_VERSION_MAJOR, + vi.major, vi.minor); + break; + } + + sdi->status = SR_ST_ACTIVE; + sr_info("Opened device %d on %d.%d, " + "interface %d, firmware %d.%d.", + sdi->index, usb->bus, usb->address, + USB_INTERFACE, vi.major, vi.minor); + + sr_info("Detected REVID=%d, it's a Cypress CY7C68013%s.", + revid, (revid != 1) ? " (FX2)" : "A (FX2LP)"); + + break; + } + libusb_free_device_list(devlist, 1); + + if (sdi->status != SR_ST_ACTIVE) + return SR_ERR; + + return SR_OK; +} + +static int configure_probes(const struct sr_dev_inst *sdi) +{ + struct DSL_context *devc; + struct sr_channel *probe; + GSList *l; + int probe_bit, stage, i; + char *tc; + + devc = sdi->priv; + for (i = 0; i < NUM_TRIGGER_STAGES; i++) { + devc->trigger_mask[i] = 0; + devc->trigger_value[i] = 0; + } + + stage = -1; + for (l = sdi->channels; l; l = l->next) { + probe = (struct sr_channel *)l->data; + if (probe->enabled == FALSE) + continue; + + if ((probe->index > 7 && probe->type == SR_CHANNEL_LOGIC) || + (probe->type == SR_CHANNEL_ANALOG || probe->type == SR_CHANNEL_DSO)) + devc->sample_wide = TRUE; + else + devc->sample_wide = FALSE; + + probe_bit = 1 << (probe->index); + if (!(probe->trigger)) + continue; + + stage = 0; + for (tc = probe->trigger; *tc; tc++) { + devc->trigger_mask[stage] |= probe_bit; + if (*tc == '1') + devc->trigger_value[stage] |= probe_bit; + stage++; + if (stage > NUM_TRIGGER_STAGES) + return SR_ERR; + } + } + + if (stage == -1) + /* + * We didn't configure any triggers, make sure acquisition + * doesn't wait for any. + */ + devc->trigger_stage = TRIGGER_FIRED; + else + devc->trigger_stage = 0; + + return SR_OK; +} + +static struct DSL_context *DSCope_dev_new(void) +{ + struct DSL_context *devc; + + if (!(devc = g_try_malloc(sizeof(struct DSL_context)))) { + sr_err("Device context malloc failed."); + return NULL; + } + + devc->profile = NULL; + devc->fw_updated = 0; + devc->cur_samplerate = DSCOPE_MAX_SAMPLERATE / MAX_DSO_PROBES_NUM; + devc->limit_samples = DSCOPE_MAX_DEPTH / MAX_DSO_PROBES_NUM; + devc->sample_wide = 0; + devc->clock_type = FALSE; + devc->clock_edge = FALSE; + devc->instant = FALSE; + devc->op_mode = SR_OP_NORMAL; + devc->th_level = SR_TH_3V3; + devc->filter = SR_FILTER_NONE; + devc->timebase = 10000; + devc->trigger_slope = DSO_TRIGGER_RISING; + devc->trigger_source = DSO_TRIGGER_AUTO; + devc->trigger_hpos = 0x0; + devc->zero = FALSE; + + return devc; +} + +static int dev_clear(void) +{ + return std_dev_clear(di, NULL); +} + +static int init(struct sr_context *sr_ctx) +{ + return std_hw_init(sr_ctx, di, LOG_PREFIX); +} + +static int set_probes(struct sr_dev_inst *sdi, int num_probes) +{ + int j; + struct sr_channel *probe; + + for (j = 0; j < num_probes; j++) { + if (!(probe = sr_channel_new(j, (sdi->mode == LOGIC) ? SR_CHANNEL_LOGIC : ((sdi->mode == DSO) ? SR_CHANNEL_DSO : SR_CHANNEL_ANALOG), + TRUE, probe_names[j]))) + return SR_ERR; + if (sdi->mode == DSO) { + probe->vdiv = 1000; + probe->vpos = 0; + probe->coupling = SR_DC_COUPLING; + probe->trig_value = 0x80; + } + sdi->channels = g_slist_append(sdi->channels, probe); + } + return SR_OK; +} + +static int adjust_probes(struct sr_dev_inst *sdi, int num_probes) +{ + int j; + GSList *l; + struct sr_channel *probe; + GSList *p; + + assert(num_probes > 0); + + j = g_slist_length(sdi->channels); + while(j < num_probes) { + if (!(probe = sr_channel_new(j, (sdi->mode == LOGIC) ? SR_CHANNEL_LOGIC : ((sdi->mode == DSO) ? SR_CHANNEL_DSO : SR_CHANNEL_ANALOG), + TRUE, probe_names[j]))) + return SR_ERR; + sdi->channels = g_slist_append(sdi->channels, probe); + j++; + } + + while(j > num_probes) { + g_slist_delete_link(sdi->channels, g_slist_last(sdi->channels)); + j--; + } + + return SR_OK; +} + +static GSList *scan(GSList *options) +{ + struct drv_context *drvc; + struct DSL_context *devc; + struct sr_dev_inst *sdi; + struct sr_usb_dev_inst *usb; + struct sr_config *src; + const struct DSL_profile *prof; + GSList *l, *devices, *conn_devices; + struct libusb_device_descriptor des; + libusb_device **devlist; + int devcnt, ret, i, j; + const char *conn; + + drvc = di->priv; + + conn = NULL; + for (l = options; l; l = l->next) { + src = l->data; + switch (src->key) { + case SR_CONF_CONN: + conn = g_variant_get_string(src->data, NULL); + break; + } + } + if (conn) + conn_devices = sr_usb_find(drvc->sr_ctx->libusb_ctx, conn); + else + conn_devices = NULL; + + /* Find all DSCope compatible devices and upload firmware to them. */ + devices = NULL; + libusb_get_device_list(drvc->sr_ctx->libusb_ctx, &devlist); + for (i = 0; devlist[i]; i++) { + if (conn) { + usb = NULL; + for (l = conn_devices; l; l = l->next) { + usb = l->data; + if (usb->bus == libusb_get_bus_number(devlist[i]) + && usb->address == libusb_get_device_address(devlist[i])) + break; + } + if (!l) + /* This device matched none of the ones that + * matched the conn specification. */ + continue; + } + + if ((ret = libusb_get_device_descriptor( devlist[i], &des)) != 0) { + sr_warn("Failed to get device descriptor: %s.", + libusb_error_name(ret)); + continue; + } + + prof = NULL; + for (j = 0; supported_DSCope[j].vid; j++) { + if (des.idVendor == supported_DSCope[j].vid && + des.idProduct == supported_DSCope[j].pid) { + prof = &supported_DSCope[j]; + } + } + + /* Skip if the device was not found. */ + if (!prof) + continue; + + devcnt = g_slist_length(drvc->instances); + sdi = sr_dev_inst_new(DSO, devcnt, SR_ST_INITIALIZING, + prof->vendor, prof->model, prof->model_version); + if (!sdi) + return NULL; + sdi->driver = di; + + /* Fill in probelist according to this device's profile. */ + if (set_probes(sdi, 2) != SR_OK) + return NULL; + + devc = DSCope_dev_new(); + devc->profile = prof; + sdi->priv = devc; + drvc->instances = g_slist_append(drvc->instances, sdi); + devices = g_slist_append(devices, sdi); + + if (check_conf_profile(devlist[i])) { + /* Already has the firmware, so fix the new address. */ + sr_dbg("Found an DSCope device."); + sdi->status = SR_ST_INACTIVE; + sdi->inst_type = SR_INST_USB; + sdi->conn = sr_usb_dev_inst_new(libusb_get_bus_number(devlist[i]), + libusb_get_device_address(devlist[i]), NULL); + } else { + char filename[256]; + sprintf(filename,"%s%s",config_path,prof->firmware); + const char *firmware = filename; + if (ezusb_upload_firmware(devlist[i], USB_CONFIGURATION, + firmware) == SR_OK) + /* Store when this device's FW was updated. */ + devc->fw_updated = g_get_monotonic_time(); + else + sr_err("Firmware upload failed for " + "device %d.", devcnt); + sdi->inst_type = SR_INST_USB; + sdi->conn = sr_usb_dev_inst_new (libusb_get_bus_number(devlist[i]), + 0xff, NULL); + } + } + libusb_free_device_list(devlist, 1); + g_slist_free_full(conn_devices, (GDestroyNotify)sr_usb_dev_inst_free); + + return devices; +} + +static GSList *dev_list(void) +{ + return ((struct drv_context *)(di->priv))->instances; +} + +static GSList *dev_mode_list(void) +{ + GSList *l = NULL; + int i; + + for(i = 0; i < ARRAY_SIZE(mode_list); i++) { + l = g_slist_append(l, &mode_list[i]); + } + + return l; +} + +static uint64_t dso_cmd_gen(struct sr_dev_inst *sdi, struct sr_channel* ch, int id) +{ + struct DSL_context *devc; + uint64_t cmd = 0; + int channel_cnt = 0; + uint16_t vpos_coarse; + uint16_t vpos_fine; + gboolean vpos_coarse_neg; + gboolean vpos_fine_neg; + GSList *l; + const int ch_bit = 7; + + devc = sdi->priv; + + switch (id) { + case SR_CONF_EN_CH: + case SR_CONF_COUPLING: + for (l = sdi->channels; l; l = l->next) { + struct sr_channel *probe = (struct sr_channel *)l->data; + channel_cnt += probe->enabled; + } + if (channel_cnt == 1) { + if (((ch->index == 0) && ch->enabled) || ((ch->index == 1) && !ch->enabled)) + cmd += 0x1600; + else if (((ch->index == 1) && ch->enabled) || ((ch->index == 0) && !ch->enabled)) + cmd += 0x1A00; + } else if (channel_cnt == 2) { + cmd += 0x0E00; + //cmd += 0x000; + } else { + return 0x0; + } + + cmd += ch->index << ch_bit; + if (ch->coupling == SR_GND_COUPLING) + cmd &= 0xFFFFFDFF; + else if (ch->coupling == SR_DC_COUPLING) + cmd += 0x100; + break; + case SR_CONF_VDIV: + case SR_CONF_TIMEBASE: + cmd += 0x8; + cmd += ch->index << ch_bit; + // --VDBS + switch(ch->vdiv){ + case 5: cmd += 0x170000; break; + case 10: cmd += 0x162800; break; + case 20: cmd += 0x14D000; break; + case 50: cmd += 0x12E800; break; + case 100: cmd += 0x118000; break; + case 200: cmd += 0x101800; break; + case 500: cmd += 0x2E800; break; + case 1000: cmd += 0x18000; break; + case 2000: cmd += 0x01800; break; + case 5000: cmd += 0x00000; break; + default: cmd += 0x0; break; + } + break; + case SR_CONF_VPOS: + cmd += 0x10; + cmd += ch->index << ch_bit; + if (ch->vdiv < 500) { + vpos_coarse_neg = (ch->vpos < 0); + vpos_coarse = (uint16_t)(abs(ch->vpos)/(2*VPOS_STEP) + 0.5) * 4; + vpos_fine_neg = vpos_coarse_neg ^ ((abs(ch->vpos) < vpos_coarse*0.5*VPOS_STEP)); + vpos_fine = (uint16_t)(abs((abs(ch->vpos) - vpos_coarse*0.5*VPOS_STEP))/(2*VPOS_MINISTEP) + 0.5); + } else { + vpos_coarse_neg = (ch->vpos < 0); + vpos_coarse = (uint16_t)(abs(ch->vpos)/(20*VPOS_STEP) + 0.5) * 4; + vpos_fine_neg = vpos_coarse_neg ^ ((abs(ch->vpos) < vpos_coarse*5*VPOS_STEP)); + vpos_fine = (uint16_t)(abs((abs(ch->vpos) - vpos_coarse*5*VPOS_STEP))/(20*VPOS_MINISTEP) + 0.5); + } + cmd += (vpos_fine_neg << 31) + (vpos_fine << 20) + + (vpos_coarse_neg << 19) + (vpos_coarse << 8); + break; + case SR_CONF_SAMPLERATE: + for (l = sdi->channels; l; l = l->next) { + struct sr_channel *probe = (struct sr_channel *)l->data; + channel_cnt += probe->enabled; + } + cmd += 0x18; + uint32_t divider = devc->zero ? 0x1 : (uint32_t)ceil(SR_MHZ(100) * 1.0 / devc->cur_samplerate); + cmd += divider << 8; + break; + case SR_CONF_HORIZ_TRIGGERPOS: + cmd += 0x20; + cmd += devc->trigger_hpos << 8; + break; + case SR_CONF_TRIGGER_SLOPE: + cmd += 0x28; + cmd += devc->trigger_slope << 8; + break; + case SR_CONF_TRIGGER_SOURCE: + cmd += 0x30; + cmd += devc->trigger_source << 8; + break; + case SR_CONF_TRIGGER_VALUE: + cmd += 0x38; + for (l = sdi->channels; l; l = l->next) { + struct sr_channel *probe = (struct sr_channel *)l->data; + cmd += probe->trig_value << (8 * (probe->index + 1)); + } + break; + case SR_CONF_ZERO_SET: + cmd += 0x40; + cmd += ch->index << ch_bit; + cmd += ((uint64_t)zero_info.vpos_l << 8); + cmd += ((uint64_t)(zero_info.vpos_h & 0x3) << 16); + cmd += ((uint64_t)zero_info.voff_l << 24); + cmd += ((uint64_t)(zero_info.voff_h & 0x3) << 32); + cmd += ((uint64_t)zero_info.vcntr_l << 40); + cmd += ((uint64_t)(zero_info.vcntr_h & 0x3) << 48); + cmd += ((uint64_t)zero_info.adc_off << 56); + break; + case SR_CONF_COMB_SET: + cmd += 0x48; + cmd += ((uint64_t)comb_info.comb0_low_off << 8); + cmd += ((uint64_t)comb_info.comb0_hig_off << 16); + cmd += ((uint64_t)comb_info.comb1_low_off << 24); + cmd += ((uint64_t)comb_info.comb1_hig_off << 32); + cmd += ((uint64_t)comb_info.comb_sign << 40); + break; + case SR_CONF_ZERO_OVER: + cmd += 0x50; + break; + case SR_CONF_DSO_SYNC: + cmd = 0xa5a5a500; + break; + default: + cmd = 0x00000000; + } + + return cmd; +} + +static int dev_open(struct sr_dev_inst *sdi) +{ + struct sr_usb_dev_inst *usb; + struct DSL_context *devc; + int ret; + int64_t timediff_us, timediff_ms; + + devc = sdi->priv; + usb = sdi->conn; + + /* + * If the firmware was recently uploaded, wait up to MAX_RENUM_DELAY_MS + * milliseconds for the FX2 to renumerate. + */ + ret = SR_ERR; + if (devc->fw_updated > 0) { + sr_info("Waiting for device to reset."); + /* Takes >= 300ms for the FX2 to be gone from the USB bus. */ + g_usleep(300 * 1000); + timediff_ms = 0; + while (timediff_ms < MAX_RENUM_DELAY_MS) { + if ((ret = DSCope_dev_open(sdi)) == SR_OK) + break; + g_usleep(100 * 1000); + + timediff_us = g_get_monotonic_time() - devc->fw_updated; + timediff_ms = timediff_us / 1000; + sr_spew("Waited %" PRIi64 "ms.", timediff_ms); + } + if (ret != SR_OK) { + sr_err("Device failed to renumerate."); + return SR_ERR; + } + sr_info("Device came back after %" PRIi64 "ms.", timediff_ms); + } else { + sr_info("Firmware upload was not needed."); + ret = DSCope_dev_open(sdi); + } + + if (ret != SR_OK) { + sr_err("Unable to open device."); + return SR_ERR; + } + + ret = libusb_claim_interface(usb->devhdl, USB_INTERFACE); + if (ret != 0) { + switch(ret) { + case LIBUSB_ERROR_BUSY: + sr_err("Unable to claim USB interface. Another " + "program or driver has already claimed it."); + break; + case LIBUSB_ERROR_NO_DEVICE: + sr_err("Device has been disconnected."); + break; + default: + sr_err("Unable to claim interface: %s.", + libusb_error_name(ret)); + break; + } + + return SR_ERR; + } + + if ((ret = command_fpga_config(usb->devhdl)) != SR_OK) { + sr_err("Send FPGA configure command failed!"); + } else { + /* Takes >= 10ms for the FX2 to be ready for FPGA configure. */ + g_usleep(10 * 1000); + char filename[256]; + sprintf(filename,"%s%s",config_path,devc->profile->fpga_bit33); + + const char *fpga_bit = filename; + ret = fpga_config(usb->devhdl, fpga_bit); + if (ret != SR_OK) { + sr_err("Configure FPGA failed!"); + } + } + + if (sdi->mode == DSO) { + GSList *l; + for(l = sdi->channels; l; l = l->next) { + struct sr_channel *probe = (struct sr_channel *)l->data; + ret = command_dso_ctrl(usb->devhdl, dso_cmd_gen(sdi, probe, SR_CONF_COUPLING)); + if (ret != SR_OK) { + sr_err("DSO set coupling of channel %d command failed!", probe->index); + return ret; + } + ret = command_dso_ctrl(usb->devhdl, dso_cmd_gen(sdi, probe, SR_CONF_VDIV)); + if (ret != SR_OK) { + sr_err("Set VDIV of channel %d command failed!", probe->index); + return ret; + } + ret = command_dso_ctrl(usb->devhdl, dso_cmd_gen(sdi, probe, SR_CONF_VPOS)); + if (ret != SR_OK) { + sr_err("Set VDIV of channel %d command failed!", probe->index); + return ret; + } + } + ret = command_dso_ctrl(usb->devhdl, dso_cmd_gen(sdi, 0, SR_CONF_SAMPLERATE)); + if (ret != SR_OK) { + sr_err("Set Sample Rate command failed!"); + return ret; + } + ret = command_dso_ctrl(usb->devhdl, dso_cmd_gen(sdi, NULL, SR_CONF_HORIZ_TRIGGERPOS)); + if (ret != SR_OK) { + sr_err("Set Horiz Trigger Position command failed!"); + return ret; + } + ret = command_dso_ctrl(usb->devhdl, dso_cmd_gen(sdi, NULL, SR_CONF_TRIGGER_SLOPE)); + if (ret != SR_OK) { + sr_err("Set Trigger Slope command failed!"); + return ret; + } + ret = command_dso_ctrl(usb->devhdl, dso_cmd_gen(sdi, NULL, SR_CONF_TRIGGER_SOURCE)); + if (ret != SR_OK) { + sr_err("Set Trigger Source command failed!"); + return ret; + } + ret = command_dso_ctrl(usb->devhdl, dso_cmd_gen(sdi, NULL, SR_CONF_TRIGGER_VALUE)); + if (ret != SR_OK) { + sr_err("Set Trigger Value command failed!"); + return ret; + } + } + + GSList *l; + for(l = sdi->channels; l; l = l->next) { + struct sr_channel *probe = (struct sr_channel *)l->data; + zero_info.zero_addr = (zero_base_addr + probe->index * sizeof(struct cmd_zero_info)); + if ((ret = command_rd_nvm(usb->devhdl, (unsigned char *)&zero_info, zero_info.zero_addr, sizeof(struct cmd_zero_info))) != SR_OK) { + sr_err("Send Get Zero command failed!"); + } else { + if (zero_info.zero_addr == (zero_base_addr + probe->index * sizeof(struct cmd_zero_info))) { + ret = command_dso_ctrl(usb->devhdl, dso_cmd_gen(sdi, probe, SR_CONF_ZERO_SET)); + if (ret != SR_OK) { + sr_err("Set Zero command failed!"); + return ret; + } + } else { + devc->zero = TRUE; + sr_info("Zero have not been setted!"); + } + } + } + + comb_info.comb_addr = comb_base_addr; + if ((ret = command_rd_nvm(usb->devhdl, (unsigned char *)&comb_info, comb_info.comb_addr, sizeof(struct cmd_comb_info))) != SR_OK) { + sr_err("Send Get Comb Command Failed!"); + } else { + if (comb_info.comb_addr == comb_base_addr) { + ret = command_dso_ctrl(usb->devhdl, dso_cmd_gen(sdi, NULL, SR_CONF_COMB_SET)); + if (ret != SR_OK) { + sr_err("Set Comb command failed!"); + return ret; + } + } else { + devc->zero = TRUE; + sr_info("Comb have not been setted!"); + } + } + + return SR_OK; +} + +static int dev_close(struct sr_dev_inst *sdi) +{ + struct sr_usb_dev_inst *usb; + + usb = sdi->conn; + if (usb->devhdl == NULL) + return SR_ERR; + + sr_info("DSCope: Closing device %d on %d.%d interface %d.", + sdi->index, usb->bus, usb->address, USB_INTERFACE); + libusb_release_interface(usb->devhdl, USB_INTERFACE); + libusb_close(usb->devhdl); + usb->devhdl = NULL; + sdi->status = SR_ST_INACTIVE; + + return SR_OK; +} + +static int cleanup(void) +{ + int ret; + struct drv_context *drvc; + + if (!(drvc = di->priv)) + return SR_OK; + + ret = dev_clear(); + + g_free(drvc); + di->priv = NULL; + + return ret; +} + +static int config_get(int id, GVariant **data, const struct sr_dev_inst *sdi, + const struct sr_channel *ch, + const struct sr_channel_group *cg) +{ + struct DSL_context *devc; + struct sr_usb_dev_inst *usb; + char str[128]; + + (void)cg; + + switch (id) { + case SR_CONF_CONN: + if (!sdi || !sdi->conn) + return SR_ERR_ARG; + usb = sdi->conn; + if (usb->address == 255) + /* Device still needs to re-enumerate after firmware + * upload, so we don't know its (future) address. */ + return SR_ERR; + snprintf(str, 128, "%d.%d", usb->bus, usb->address); + *data = g_variant_new_string(str); + break; + case SR_CONF_LIMIT_SAMPLES: + if (!sdi) + return SR_ERR; + devc = sdi->priv; + *data = g_variant_new_uint64(devc->limit_samples); + break; + case SR_CONF_SAMPLERATE: + if (!sdi) + return SR_ERR; + devc = sdi->priv; + *data = g_variant_new_uint64(devc->cur_samplerate); + break; + case SR_CONF_CLOCK_TYPE: + if (!sdi) + return SR_ERR; + devc = sdi->priv; + *data = g_variant_new_boolean(devc->clock_type); + break; + case SR_CONF_CLOCK_EDGE: + if (!sdi) + return SR_ERR; + devc = sdi->priv; + *data = g_variant_new_boolean(devc->clock_edge); + break; + case SR_CONF_INSTANT: + if (!sdi) + return SR_ERR; + devc = sdi->priv; + *data = g_variant_new_boolean(devc->instant); + break; + case SR_CONF_OPERATION_MODE: + if (!sdi) + return SR_ERR; + devc = sdi->priv; + *data = g_variant_new_string(opmodes[devc->op_mode]); + break; + case SR_CONF_FILTER: + if (!sdi) + return SR_ERR; + devc = sdi->priv; + *data = g_variant_new_string(filters[devc->filter]); + break; + case SR_CONF_THRESHOLD: + if (!sdi) + return SR_ERR; + devc = sdi->priv; + *data = g_variant_new_string(thresholds[devc->th_level]); + break; + case SR_CONF_VDIV: + if (!ch) + return SR_ERR; + *data = g_variant_new_uint64(ch->vdiv); + break; + case SR_CONF_VPOS: + if (!ch) + return SR_ERR; + *data = g_variant_new_double(ch->vpos); + break; + case SR_CONF_TIMEBASE: + if (!sdi) + return SR_ERR; + devc = sdi->priv; + *data = g_variant_new_uint64(devc->timebase); + break; + case SR_CONF_COUPLING: + if (!ch) + return SR_ERR; + *data = g_variant_new_byte(ch->coupling); + break; + case SR_CONF_EN_CH: + if (!ch) + return SR_ERR; + *data = g_variant_new_boolean(ch->enabled); + break; + case SR_CONF_TRIGGER_SLOPE: + if (!sdi) + return SR_ERR; + devc = sdi->priv; + *data = g_variant_new_byte(devc->trigger_slope); + break; + case SR_CONF_TRIGGER_SOURCE: + if (!sdi) + return SR_ERR; + devc = sdi->priv; + *data = g_variant_new_byte(devc->trigger_source); + break; + case SR_CONF_TRIGGER_VALUE: + if (!ch) + return SR_ERR; + *data = g_variant_new_uint16(ch->trig_value); + break; + case SR_CONF_HORIZ_TRIGGERPOS: + if (!sdi) + return SR_ERR; + devc = sdi->priv; + uint16_t channel_cnt = 0; + GSList *l; + for (l = sdi->channels; l; l = l->next) { + struct sr_channel *probe = (struct sr_channel *)l->data; + channel_cnt += probe->enabled; + } + uint16_t pos = devc->trigger_hpos * channel_cnt * 100 / devc->limit_samples; + *data = g_variant_new_uint16(pos); + break; + case SR_CONF_ZERO: + if (!sdi) + return SR_ERR; + devc = sdi->priv; + *data = g_variant_new_boolean(devc->zero); + break; + case SR_CONF_STREAM: + if (!sdi) + return SR_ERR; + *data = g_variant_new_boolean(FALSE); + break; + case SR_CONF_TEST: + if (!sdi) + return SR_ERR; + *data = g_variant_new_boolean(FALSE); + break; + case SR_CONF_MAX_DSO_SAMPLERATE: + if (!sdi) + return SR_ERR; + *data = g_variant_new_uint64(DSCOPE_MAX_SAMPLERATE); + break; + case SR_CONF_MAX_DSO_SAMPLELIMITS: + if (!sdi) + return SR_ERR; + *data = g_variant_new_uint64(DSCOPE_MAX_DEPTH); + break; + case SR_CONF_MAX_LOGIC_SAMPLERATE: + if (!sdi) + return SR_ERR; + *data = g_variant_new_uint64(DSCOPE_MAX_SAMPLERATE); + break; + case SR_CONF_MAX_LOGIC_SAMPLELIMITS: + if (!sdi) + return SR_ERR; + *data = g_variant_new_uint64(DSCOPE_MAX_DEPTH); + break; + default: + return SR_ERR_NA; + } + + return SR_OK; +} + +static int config_set(int id, GVariant *data, struct sr_dev_inst *sdi, + struct sr_channel *ch, + const struct sr_channel_group *cg ) +{ + struct DSL_context *devc; + const char *stropt; + int ret, num_probes; + struct sr_usb_dev_inst *usb; + + (void)cg; + + if (sdi->status != SR_ST_ACTIVE) + return SR_ERR; + + devc = sdi->priv; + usb = sdi->conn; + + if (id == SR_CONF_SAMPLERATE) { + devc->cur_samplerate = g_variant_get_uint64(data); + if (sdi->mode == LOGIC) { + if (devc->cur_samplerate >= SR_MHZ(200)) { + adjust_probes(sdi, SR_MHZ(1600)/devc->cur_samplerate); + } else { + adjust_probes(sdi, 16); + } + ret = SR_OK; + } else if(sdi->mode == DSO) { + ret = command_dso_ctrl(usb->devhdl, dso_cmd_gen(sdi, 0, SR_CONF_SAMPLERATE)); + } + + } else if (id == SR_CONF_CLOCK_TYPE) { + devc->clock_type = g_variant_get_boolean(data); + ret = SR_OK; + } else if (id == SR_CONF_CLOCK_EDGE) { + devc->clock_edge = g_variant_get_boolean(data); + ret = SR_OK; + } else if (id == SR_CONF_INSTANT) { + devc->instant = g_variant_get_boolean(data); + int num_probes = 0; + GSList *l; + for (l = sdi->channels; l; l = l->next) { + struct sr_channel *probe = (struct sr_channel *)l->data; + num_probes += probe->enabled; + } + if (num_probes != 0) { + if (devc->instant) + devc->limit_samples = DSCOPE_INSTANT_DEPTH / num_probes; + else + devc->limit_samples = DSCOPE_MAX_DEPTH / num_probes; + } + ret = SR_OK; + } else if (id == SR_CONF_LIMIT_SAMPLES) { + devc->limit_samples = g_variant_get_uint64(data); + ret = SR_OK; + } else if (id == SR_CONF_DEVICE_MODE) { + sdi->mode = g_variant_get_int16(data); + ret = SR_OK; + if (sdi->mode == LOGIC) { + num_probes = devc->profile->dev_caps & DEV_CAPS_16BIT ? 16 : 8; + } else if (sdi->mode == DSO) { + sdi->mode = DSO; + num_probes = devc->profile->dev_caps & DEV_CAPS_16BIT ? MAX_DSO_PROBES_NUM : 1; + ret = command_dso_ctrl(usb->devhdl, dso_cmd_gen(sdi, NULL, SR_CONF_DSO_SYNC)); + if (ret != SR_OK) + sr_dbg("%s: DSO configuration sync failed", __func__); + ret = command_dso_ctrl(usb->devhdl, dso_cmd_gen(sdi, sdi->channels->data, SR_CONF_VDIV)); + if (ret == SR_OK) + sr_dbg("%s: Initial setting for DSO mode", __func__); + else + sr_dbg("%s: Initial setting for DSO mode failed", __func__); + devc->cur_samplerate = DSCOPE_MAX_SAMPLERATE / num_probes; + devc->limit_samples = DSCOPE_MAX_DEPTH / num_probes; + } else if (sdi->mode == ANALOG){ + num_probes = devc->profile->dev_caps & DEV_CAPS_16BIT ? MAX_ANALOG_PROBES_NUM : 1; + } + sr_dev_probes_free(sdi); + set_probes(sdi, num_probes); + sr_dbg("%s: setting mode to %d", __func__, sdi->mode); + } else if (id == SR_CONF_OPERATION_MODE) { + stropt = g_variant_get_string(data, NULL); + ret = SR_OK; + if (!strcmp(stropt, opmodes[SR_OP_NORMAL])) { + devc->op_mode = SR_OP_NORMAL; + } else if (!strcmp(stropt, opmodes[SR_OP_INTERNAL_TEST])) { + devc->op_mode = SR_OP_INTERNAL_TEST; + } else if (!strcmp(stropt, opmodes[SR_OP_EXTERNAL_TEST])) { + devc->op_mode = SR_OP_EXTERNAL_TEST; + } else if (!strcmp(stropt, opmodes[SR_OP_LOOPBACK_TEST])) { + devc->op_mode = SR_OP_LOOPBACK_TEST; + } else { + ret = SR_ERR; + } + sr_dbg("%s: setting pattern to %d", + __func__, devc->op_mode); + } else if (id == SR_CONF_THRESHOLD) { + stropt = g_variant_get_string(data, NULL); + ret = SR_OK; + if (!strcmp(stropt, thresholds[SR_TH_3V3])) { + devc->th_level = SR_TH_3V3; + } else if (!strcmp(stropt, thresholds[SR_TH_5V0])) { + devc->th_level = SR_TH_5V0; + } else { + ret = SR_ERR; + } + if ((ret = command_fpga_config(usb->devhdl)) != SR_OK) { + sr_err("Send FPGA configure command failed!"); + } else { + /* Takes >= 10ms for the FX2 to be ready for FPGA configure. */ + g_usleep(10 * 1000); + char filename[256]; + sprintf(filename,"%s%s",config_path,devc->profile->fpga_bit33); + const char *fpga_bit = filename; + ret = fpga_config(usb->devhdl, fpga_bit); + if (ret != SR_OK) { + sr_err("Configure FPGA failed!"); + } + } + sr_dbg("%s: setting threshold to %d", + __func__, devc->th_level); + } else if (id == SR_CONF_FILTER) { + stropt = g_variant_get_string(data, NULL); + ret = SR_OK; + if (!strcmp(stropt, filters[SR_FILTER_NONE])) { + devc->filter = SR_FILTER_NONE; + } else if (!strcmp(stropt, filters[SR_FILTER_1T])) { + devc->filter = SR_FILTER_1T; + } else { + ret = SR_ERR; + } + sr_dbg("%s: setting threshold to %d", + __func__, devc->th_level); + } else if (id == SR_CONF_EN_CH) { + ch->enabled = g_variant_get_boolean(data); + + if (sdi->mode == DSO) { + ret = command_dso_ctrl(usb->devhdl, dso_cmd_gen(sdi, ch, SR_CONF_EN_CH)); + } + if (ret == SR_OK) + sr_dbg("%s: setting ENABLE of channel %d to %d", + __func__, ch->index, ch->enabled); + else + sr_dbg("%s: setting ENABLE of channel %d to %d", + __func__, ch->index, ch->enabled); + } else if (id == SR_CONF_VDIV) { + ch->vdiv = g_variant_get_uint64(data); + if (sdi->mode == DSO) { + ret = command_dso_ctrl(usb->devhdl, dso_cmd_gen(sdi, ch, SR_CONF_VDIV)); + } + if (ret == SR_OK) + sr_dbg("%s: setting VDIV of channel %d to %d mv", + __func__, ch->index, ch->vdiv); + else + sr_dbg("%s: setting VDIV of channel %d to %d mv failed", + __func__, ch->index, ch->vdiv); + } else if (id == SR_CONF_VPOS) { + ch->vpos = g_variant_get_double(data); + if (sdi->mode == DSO) { + ret = command_dso_ctrl(usb->devhdl, dso_cmd_gen(sdi, ch, SR_CONF_VPOS)); + } + if (ret == SR_OK) + sr_dbg("%s: setting VPOS of channel %d to %d mv", + __func__, ch->index, ch->vpos); + else + sr_dbg("%s: setting VPOS of channel %d to %d mv failed", + __func__, ch->index, ch->vpos); + } else if (id == SR_CONF_TIMEBASE) { + devc->timebase = g_variant_get_uint64(data); + } else if (id == SR_CONF_COUPLING) { + ch->coupling = g_variant_get_byte(data); + if (sdi->mode == DSO) { + ret = command_dso_ctrl(usb->devhdl, dso_cmd_gen(sdi, ch, SR_CONF_COUPLING)); + } + if (ret == SR_OK) + sr_dbg("%s: setting AC COUPLING of channel %d to %d", + __func__, ch->index, ch->coupling); + else + sr_dbg("%s: setting AC COUPLING of channel %d to %d failed", + __func__, ch->index, ch->coupling); + } else if (id == SR_CONF_TRIGGER_SLOPE) { + devc->trigger_slope = g_variant_get_byte(data); + if (sdi->mode == DSO) { + ret = command_dso_ctrl(usb->devhdl, dso_cmd_gen(sdi, NULL, SR_CONF_TRIGGER_SLOPE)); + } + if (ret == SR_OK) + sr_dbg("%s: setting DSO Trigger Slope to %d", + __func__, devc->trigger_slope); + else + sr_dbg("%s: setting DSO Trigger Slope to %d failed", + __func__, devc->trigger_slope); + } else if (id == SR_CONF_TRIGGER_SOURCE) { + devc->trigger_source = g_variant_get_byte(data); + if (sdi->mode == DSO) { + ret = command_dso_ctrl(usb->devhdl, dso_cmd_gen(sdi, NULL, SR_CONF_TRIGGER_SOURCE)); + } + if (ret == SR_OK) + sr_dbg("%s: setting DSO Trigger Source to %d", + __func__, devc->trigger_source); + else + sr_dbg("%s: setting DSO Trigger Source to %d failed", + __func__, devc->trigger_source); + } else if (id == SR_CONF_TRIGGER_VALUE) { + ch->trig_value = g_variant_get_uint16(data); + if (sdi->mode == DSO) { + ret = command_dso_ctrl(usb->devhdl, dso_cmd_gen(sdi, ch, SR_CONF_TRIGGER_VALUE)); + } + if (ret == SR_OK) + sr_dbg("%s: setting channel %d Trigger Value to %d", + __func__, ch->index, ch->trig_value); + else + sr_dbg("%s: setting DSO Trigger Value to %d failed", + __func__, ch->index, ch->trig_value); + } else if (id == SR_CONF_HORIZ_TRIGGERPOS) { + uint16_t channel_cnt = 0; + GSList *l; + for (l = sdi->channels; l; l = l->next) { + struct sr_channel *probe = (struct sr_channel *)l->data; + channel_cnt += probe->enabled; + } + devc->trigger_hpos = g_variant_get_uint16(data) * channel_cnt * devc->limit_samples / 200.0f; + if (sdi->mode == DSO) { + ret = command_dso_ctrl(usb->devhdl, dso_cmd_gen(sdi, 1, SR_CONF_HORIZ_TRIGGERPOS)); + } + if (ret == SR_OK) + sr_dbg("%s: setting DSO Horiz Trigger Position to %d", + __func__, devc->trigger_hpos); + else + sr_dbg("%s: setting DSO Horiz Trigger Position to %d failed", + __func__, devc->trigger_hpos); + } else if (id == SR_CONF_ZERO) { + devc->zero = g_variant_get_boolean(data); + } else if (id == SR_CONF_ZERO_SET) { + GSList *l; + for(l = sdi->channels; l; l = l->next) { + struct sr_channel *probe = (struct sr_channel *)l->data; + zero_info.zero_addr = zero_base_addr + probe->index * sizeof(struct cmd_zero_info); + zero_info.vpos_l = (probe->index == 0) ? mstatus.ch0_vpos_mid : mstatus.ch1_vpos_mid; + zero_info.vpos_h = (probe->index == 0) ? mstatus.ch0_vpos_mid >> 8 : mstatus.ch1_vpos_mid >> 8; + zero_info.voff_l = (probe->index == 0) ? mstatus.ch0_voff_mid : mstatus.ch1_voff_mid; + zero_info.voff_h = (probe->index == 0) ? mstatus.ch0_voff_mid >> 8 : mstatus.ch1_voff_mid >> 8; + zero_info.vcntr_l = (probe->index == 0) ? mstatus.ch0_vcntr : mstatus.ch1_vcntr; + zero_info.vcntr_h = (probe->index == 0) ? mstatus.ch0_vcntr >> 8 : mstatus.ch1_vcntr >> 8; + zero_info.adc_off = (probe->index == 0) ? mstatus.ch0_adc_off + (mstatus.ch0_adc_sign << 7) : mstatus.ch1_adc_off + (mstatus.ch1_adc_sign << 7); + ret = command_wr_nvm(usb->devhdl, (unsigned char *)&zero_info, sizeof(struct cmd_zero_info)); + if (ret != SR_OK) + sr_err("DSO channel %d Set Zero command failed!", probe->index); + } + comb_info.comb_addr = comb_base_addr; + comb_info.comb0_low_off = mstatus.comb0_off; + comb_info.comb0_hig_off = mstatus.comb0_off >> 8; + comb_info.comb1_low_off = mstatus.comb1_off; + comb_info.comb1_hig_off = mstatus.comb1_off >> 8; + comb_info.comb_sign = mstatus.comb_sign; + ret = command_wr_nvm(usb->devhdl, (unsigned char *)&comb_info, sizeof(struct cmd_comb_info)); + if (ret != SR_OK) + sr_err("DSO Set Comb command failed!"); + else + devc->zero = FALSE; + } else { + ret = SR_ERR_NA; + } + + return ret; +} + +static int config_list(int key, GVariant **data, const struct sr_dev_inst *sdi, + const struct sr_channel_group *cg) +{ + GVariant *gvar; + GVariantBuilder gvb; + + (void)sdi; + (void)cg; + + switch (key) { + case SR_CONF_SCAN_OPTIONS: +// *data = g_variant_new_fixed_array(G_VARIANT_TYPE_INT32, +// hwopts, ARRAY_SIZE(hwopts), sizeof(int32_t)); + *data = g_variant_new_from_data(G_VARIANT_TYPE("ai"), + hwopts, ARRAY_SIZE(hwopts)*sizeof(int32_t), TRUE, NULL, NULL); + break; + case SR_CONF_DEVICE_OPTIONS: +// *data = g_variant_new_fixed_array(G_VARIANT_TYPE_INT32, +// hwcaps, ARRAY_SIZE(hwcaps), sizeof(int32_t)); + *data = g_variant_new_from_data(G_VARIANT_TYPE("ai"), + hwcaps, ARRAY_SIZE(hwcaps)*sizeof(int32_t), TRUE, NULL, NULL); + break; + case SR_CONF_DEVICE_CONFIGS: +// *data = g_variant_new_fixed_array(G_VARIANT_TYPE_INT32, +// hwcaps, ARRAY_SIZE(hwcaps), sizeof(int32_t)); + *data = g_variant_new_from_data(G_VARIANT_TYPE("ai"), + hwoptions, ARRAY_SIZE(hwoptions)*sizeof(int32_t), TRUE, NULL, NULL); + break; + case SR_CONF_SAMPLERATE: + g_variant_builder_init(&gvb, G_VARIANT_TYPE("a{sv}")); +// gvar = g_variant_new_fixed_array(G_VARIANT_TYPE("t"), samplerates, +// ARRAY_SIZE(samplerates), sizeof(uint64_t)); + gvar = g_variant_new_from_data(G_VARIANT_TYPE("at"), + samplerates, ARRAY_SIZE(samplerates)*sizeof(uint64_t), TRUE, NULL, NULL); + g_variant_builder_add(&gvb, "{sv}", "samplerates", gvar); + *data = g_variant_builder_end(&gvb); + break; + case SR_CONF_LIMIT_SAMPLES: + g_variant_builder_init(&gvb, G_VARIANT_TYPE("a{sv}")); + gvar = g_variant_new_from_data(G_VARIANT_TYPE("at"), + samplecounts, ARRAY_SIZE(samplecounts)*sizeof(uint64_t), TRUE, NULL, NULL); + g_variant_builder_add(&gvb, "{sv}", "samplecounts", gvar); + *data = g_variant_builder_end(&gvb); + break; + case SR_CONF_TRIGGER_TYPE: + *data = g_variant_new_string(TRIGGER_TYPE); + break; + case SR_CONF_OPERATION_MODE: + *data = g_variant_new_strv(opmodes, ARRAY_SIZE(opmodes)); + break; + case SR_CONF_THRESHOLD: + *data = g_variant_new_strv(thresholds, ARRAY_SIZE(thresholds)); + break; + case SR_CONF_FILTER: + *data = g_variant_new_strv(filters, ARRAY_SIZE(filters)); + break; + default: + return SR_ERR_NA; + } + + return SR_OK; +} + +static void abort_acquisition(struct DSL_context *devc) +{ + int i; + int ret; + struct sr_usb_dev_inst *usb; + + devc->num_samples = -1; + + sr_info("%s: Stopping", __func__); + + /* Stop GPIF acquisition */ + usb = ((struct sr_dev_inst *)devc->cb_data)->conn; + if ((ret = command_stop_acquisition (usb->devhdl)) != SR_OK) + sr_err("Stop DSCope acquisition failed!"); + else + sr_info("Stop DSCope acquisition!"); + + ret = command_dso_ctrl(usb->devhdl, dso_cmd_gen((struct sr_dev_inst *)devc->cb_data, NULL, SR_CONF_ZERO_OVER)); + if (ret != SR_OK) + sr_err("DSO zero over command failed!"); + + /* Cancel exist transfers */ + if (devc->num_transfers) + for (i = devc->num_transfers - 1; i >= 0; i--) { + if (devc->transfers[i]) + libusb_cancel_transfer(devc->transfers[i]); + } +} + +static void finish_acquisition(struct DSL_context *devc) +{ + struct sr_datafeed_packet packet; + int i, ret; + struct sr_usb_dev_inst *usb; + + sr_err("finish acquisition: send SR_DF_END packet"); + /* Terminate session. */ + packet.type = SR_DF_END; + sr_session_send(devc->cb_data, &packet); + + sr_err("finish acquisition: remove fds from polling"); + /* Remove fds from polling. */ + for (i = 0; devc->usbfd[i] != -1; i++) + sr_source_remove(devc->usbfd[i]); + g_free(devc->usbfd); + + if (devc->num_transfers != 0) { + devc->num_transfers = 0; + g_free(devc->transfers); + } +} + +static void free_transfer(struct libusb_transfer *transfer) +{ + struct DSL_context *devc; + unsigned int i; + + devc = transfer->user_data; + + g_free(transfer->buffer); + transfer->buffer = NULL; + libusb_free_transfer(transfer); + + for (i = 0; i < devc->num_transfers; i++) { + if (devc->transfers[i] == transfer) { + devc->transfers[i] = NULL; + break; + } + } + + devc->submitted_transfers--; + if (devc->submitted_transfers == 0 && devc->status != DSL_TRIGGERED) + finish_acquisition(devc); +} + +static void resubmit_transfer(struct libusb_transfer *transfer) +{ + int ret; + + if ((ret = libusb_submit_transfer(transfer)) == LIBUSB_SUCCESS) + return; + + free_transfer(transfer); + /* TODO: Stop session? */ + + sr_err("%s: %s", __func__, libusb_error_name(ret)); +} + +static struct sr_config * new_config(int key, GVariant *data) +{ + struct sr_config *config; + + if (!(config = g_try_malloc0(sizeof(struct sr_config)))) { + sr_err("META config malloc failed."); + return NULL; + } + + config->key = key; + config->data = data; + + return config; +} + +static void receive_transfer(struct libusb_transfer *transfer) +{ + gboolean packet_has_error = FALSE; + struct sr_datafeed_packet packet; + struct sr_datafeed_logic logic; + struct sr_datafeed_dso dso; + struct sr_datafeed_analog analog; + struct sr_datafeed_meta meta; + struct DSL_context *devc; + int trigger_offset, i, sample_width, cur_sample_count; + int trigger_offset_bytes; + uint8_t *cur_buf; + //GTimeVal cur_time; + + //g_get_current_time(&cur_time); + //sr_info("receive_transfer: current time %d sec %d usec", cur_time.tv_sec, cur_time.tv_usec); + + + devc = transfer->user_data; + + /* + * If acquisition has already ended, just free any queued up + * transfer that come in. + */ + if (devc->num_samples == -1) { + free_transfer(transfer); + return; + } + + sr_info("receive_transfer(): status %d; timeout %d; received %d bytes.", + transfer->status, transfer->timeout, transfer->actual_length); + + /* Save incoming transfer before reusing the transfer struct. */ + cur_buf = transfer->buffer; + sample_width = 2; + cur_sample_count = transfer->actual_length / sample_width; + + switch (transfer->status) { + case LIBUSB_TRANSFER_NO_DEVICE: + //abort_acquisition(devc); + free_transfer(transfer); + devc->status = DSL_ERROR; + return; + case LIBUSB_TRANSFER_COMPLETED: + case LIBUSB_TRANSFER_TIMED_OUT: /* We may have received some data though. */ + break; + default: + packet_has_error = TRUE; + break; + } + + if (transfer->actual_length == 0 || packet_has_error) { + devc->empty_transfer_count++; + if (devc->empty_transfer_count > MAX_EMPTY_TRANSFERS) { + /* + * The FX2 gave up. End the acquisition, the frontend + * will work out that the samplecount is short. + */ + //abort_acquisition(devc); + free_transfer(transfer); + devc->status = DSL_ERROR; + } else { + resubmit_transfer(transfer); + } + return; + } else { + devc->empty_transfer_count = 0; + } + + trigger_offset = 0; + if (devc->trigger_stage >= 0) { + for (i = 0; i < cur_sample_count; i++) { + + const uint16_t cur_sample = devc->sample_wide ? + *((const uint16_t*)cur_buf + i) : + *((const uint8_t*)cur_buf + i); + + if ((cur_sample & devc->trigger_mask[devc->trigger_stage]) == + devc->trigger_value[devc->trigger_stage]) { + /* Match on this trigger stage. */ + devc->trigger_buffer[devc->trigger_stage] = cur_sample; + devc->trigger_stage++; + + if (devc->trigger_stage == NUM_TRIGGER_STAGES || + devc->trigger_mask[devc->trigger_stage] == 0) { + /* Match on all trigger stages, we're done. */ + trigger_offset = i + 1; + + /* + * TODO: Send pre-trigger buffer to session bus. + * Tell the frontend we hit the trigger here. + */ + packet.type = SR_DF_TRIGGER; + packet.payload = NULL; + sr_session_send(devc->cb_data, &packet); + + /* + * Send the samples that triggered it, + * since we're skipping past them. + */ + packet.type = SR_DF_LOGIC; + packet.payload = &logic; + logic.unitsize = sizeof(*devc->trigger_buffer); + logic.length = devc->trigger_stage * logic.unitsize; + logic.data = devc->trigger_buffer; + sr_session_send(devc->cb_data, &packet); + + devc->trigger_stage = TRIGGER_FIRED; + break; + } + } else if (devc->trigger_stage > 0) { + /* + * We had a match before, but not in the next sample. However, we may + * have a match on this stage in the next bit -- trigger on 0001 will + * fail on seeing 00001, so we need to go back to stage 0 -- but at + * the next sample from the one that matched originally, which the + * counter increment at the end of the loop takes care of. + */ + i -= devc->trigger_stage; + if (i < -1) + i = -1; /* Oops, went back past this buffer. */ + /* Reset trigger stage. */ + devc->trigger_stage = 0; + } + } + } + + if (devc->trigger_stage == TRIGGER_FIRED) { + /* Send the incoming transfer to the session bus. */ + trigger_offset_bytes = trigger_offset * sample_width; + // check packet type + if ((*(struct sr_dev_inst *)(devc->cb_data)).mode == LOGIC) { + packet.type = SR_DF_LOGIC; + packet.payload = &logic; + logic.length = transfer->actual_length - trigger_offset_bytes; + logic.unitsize = sample_width; + logic.data_error = 0; + logic.data = cur_buf + trigger_offset_bytes; + } else if ((*(struct sr_dev_inst *)(devc->cb_data)).mode == DSO) { + uint16_t channel_cnt = 0; + uint16_t channel_en_cnt = 0; + GSList *l; + struct sr_dev_inst *sdi = devc->cb_data; + for (l = sdi->channels; l; l = l->next) { + struct sr_channel *probe = (struct sr_channel *)l->data; + channel_cnt ++; + channel_en_cnt += probe->enabled; + } + if (channel_en_cnt == 0) + channel_en_cnt = 1; + + if (!devc->instant) { + const uint32_t mstatus_offset = devc->limit_samples / (channel_cnt/channel_en_cnt); + mstatus.ch0_max = *((const uint8_t*)cur_buf + mstatus_offset*2 + 1*2); + mstatus.ch0_min = *((const uint8_t*)cur_buf + mstatus_offset*2 + 3); + mstatus.ch0_period = *((const uint32_t*)cur_buf + mstatus_offset/2 + 2/2); + mstatus.ch0_pcnt = *((const uint32_t*)cur_buf + mstatus_offset/2 + 4/2); + mstatus.ch1_max = *((const uint8_t*)cur_buf + mstatus_offset*2 + 7*2); + mstatus.ch1_min = *((const uint8_t*)cur_buf + mstatus_offset*2 + 15); + mstatus.ch1_period = *((const uint32_t*)cur_buf + mstatus_offset/2 + 8/2); + mstatus.ch1_pcnt = *((const uint32_t*)cur_buf + mstatus_offset/2 + 10/2); + mstatus.vlen = *((const uint32_t*)cur_buf + mstatus_offset/2 + 16/2) & 0x7fffffff; + mstatus.stream_mode = *((const uint32_t*)cur_buf + mstatus_offset/2 + 16/2) & 0x80000000; + mstatus.sample_divider = *((const uint32_t*)cur_buf + mstatus_offset/2 + 18/2); + mstatus.zeroing = (*((const uint16_t*)cur_buf + mstatus_offset + 128) & 0x8000) != 0; + mstatus.ch0_vpos_mid = *((const uint16_t*)cur_buf + mstatus_offset + 128) & 0x7fff; + mstatus.ch0_voff_mid = *((const uint16_t*)cur_buf + mstatus_offset + 129); + mstatus.ch0_vcntr = *((const uint16_t*)cur_buf + mstatus_offset + 130); + mstatus.ch0_adc_off = *((const uint8_t*)cur_buf + mstatus_offset*2 + 131*2); + mstatus.ch0_adc_sign = *((const uint8_t*)cur_buf + mstatus_offset*2 + 131*2+1); + mstatus.ch1_vpos_mid = *((const uint16_t*)cur_buf + mstatus_offset + 132); + mstatus.ch1_voff_mid = *((const uint16_t*)cur_buf + mstatus_offset + 133); + mstatus.ch1_vcntr = *((const uint16_t*)cur_buf + mstatus_offset + 134); + mstatus.ch1_adc_off = *((const uint8_t*)cur_buf + mstatus_offset*2 + 135*2); + mstatus.ch1_adc_sign = *((const uint8_t*)cur_buf + mstatus_offset*2 + 135*2+1); + mstatus.comb0_off = *((const uint16_t*)cur_buf + mstatus_offset + 136); + mstatus.comb1_off = *((const uint16_t*)cur_buf + mstatus_offset + 137); + mstatus.comb_sign = *((const uint8_t*)cur_buf + mstatus_offset*2 + 138*2); + } else { + mstatus.vlen = instant_buffer_size; + } + + const uint32_t divider = devc->zero ? 0x1 : (uint32_t)ceil(SR_MHZ(100) * 1.0 / devc->cur_samplerate); + if ((mstatus.sample_divider == divider && + mstatus.vlen != 0 && + mstatus.vlen <= (transfer->actual_length - 512) / sample_width) || + devc->instant) { + mstatus_valid = devc->instant ? FALSE : TRUE; + packet.type = SR_DF_DSO; + packet.payload = &dso; + dso.probes = (*(struct sr_dev_inst *)(devc->cb_data)).channels; + //dso.num_samples = (transfer->actual_length - 512) / sample_width; + cur_sample_count = 2 * mstatus.vlen / channel_en_cnt ; + dso.num_samples = cur_sample_count; + dso.mq = SR_MQ_VOLTAGE; + dso.unit = SR_UNIT_VOLT; + dso.mqflags = SR_MQFLAG_AC; + dso.data = cur_buf + trigger_offset_bytes; + } else { + mstatus_valid = FALSE; + } + } else { + packet.type = SR_DF_ANALOG; + packet.payload = &analog; + analog.probes = (*(struct sr_dev_inst *)(devc->cb_data)).channels; + analog.num_samples = transfer->actual_length / sample_width; + analog.mq = SR_MQ_VOLTAGE; + analog.unit = SR_UNIT_VOLT; + analog.mqflags = SR_MQFLAG_AC; + analog.data = cur_buf + trigger_offset_bytes; + } + + if (devc->limit_samples) { + const uint64_t remain_length= (devc->limit_samples - devc->num_samples) * sample_width; + logic.length = min(logic.length, remain_length); + + /* in test mode, check data content*/ + if (devc->op_mode == SR_OP_INTERNAL_TEST) { + //for (i = 0; i < logic.length / sample_width; i++) { + for (i = 0; i < logic.length / 2; i++) { +// const uint16_t cur_sample = devc->sample_wide ? +// *((const uint16_t*)cur_buf + i) : +// *((const uint8_t*)cur_buf + i); + const uint16_t cur_sample = *((const uint16_t*)cur_buf + i); + if (test_init == 1) { + test_sample_value = cur_sample; + test_init = 0; + } + if (cur_sample != test_sample_value) { + logic.data_error = 1; + break; + } + test_sample_value++; + } + } + if (devc->op_mode == SR_OP_EXTERNAL_TEST) { + for (i = 0; i < logic.length / 2; i++) { + const uint16_t cur_sample = *((const uint16_t*)cur_buf + i); + if (test_init == 1) { + test_sample_value = cur_sample; + test_init = 0; + } + if (cur_sample != test_sample_value) { + logic.data_error = 1; + sr_err("exp: %d; act: %d", test_sample_value, cur_sample); + break; + } + test_sample_value = (test_sample_value + 1) % 65001; + //test_sample_value = test_sample_value + 1; + } + } + + /* send data to session bus */ + sr_session_send(devc->cb_data, &packet); + } + + devc->num_samples += cur_sample_count; + if (((*(struct sr_dev_inst *)(devc->cb_data)).mode == LOGIC || devc->instant) && + devc->limit_samples && + (unsigned int)devc->num_samples >= devc->limit_samples) { + //abort_acquisition(devc); + free_transfer(transfer); + devc->status = DSL_STOP; + return; + } + } else { + /* + * TODO: Buffer pre-trigger data in capture + * ratio-sized buffer. + */ + } + + resubmit_transfer(transfer); +} + +static unsigned int to_bytes_per_ms(struct DSL_context *devc) +{ + if (devc->cur_samplerate > SR_MHZ(100)) + return SR_MHZ(100) / 1000 * (devc->sample_wide ? 2 : 1); + else + return devc->cur_samplerate / 1000 * (devc->sample_wide ? 2 : 1); +} + +static size_t get_buffer_size(struct DSL_context *devc) +{ + size_t s; + + /* + * The buffer should be large enough to hold 10ms of data and + * a multiple of 512. + */ + s = single_buffer_time * to_bytes_per_ms(devc); + //s = to_bytes_per_ms(devc->cur_samplerate); + return (s + 511) & ~511; +} + +static unsigned int get_number_of_transfers(struct DSL_context *devc) +{ + unsigned int n; + size_t total_size; + total_size = min(devc->limit_samples * (devc->sample_wide ? 2 : 1), + total_buffer_time * to_bytes_per_ms(devc)); + /* Total buffer size should be able to hold about 500ms of data. */ + //n = 500 * to_bytes_per_ms(devc) / get_buffer_size(devc); + n = ceil(total_size * 1.0f / get_buffer_size(devc)); + + if (n > NUM_SIMUL_TRANSFERS) + return NUM_SIMUL_TRANSFERS; + + return n; + //return 1; +} + +static unsigned int get_timeout(struct DSL_context *devc) +{ + size_t total_size; + unsigned int timeout; + + total_size = get_buffer_size(devc) * get_number_of_transfers(devc); + timeout = total_size / to_bytes_per_ms(devc); + //return timeout + timeout / 4; /* Leave a headroom of 25% percent. */ + return timeout * 4; +} + +static int dev_transfer_start(const struct sr_dev_inst *sdi) +{ + struct DSL_context *devc; + struct sr_usb_dev_inst *usb; + struct libusb_transfer *transfer; + unsigned int i, timeout, num_transfers; + int ret; + unsigned char *buf; + size_t size; + int dso_buffer_size; + + devc = sdi->priv; + usb = sdi->conn; + +// timeout = get_timeout(devc); +// num_transfers = get_number_of_transfers(devc); +// size = get_buffer_size(devc); + timeout = 500; + num_transfers = buffer_cnt; + uint16_t channel_en_cnt = 0; + uint16_t channel_cnt = 0; + GSList *l; + for (l = sdi->channels; l; l = l->next) { + struct sr_channel *probe = (struct sr_channel *)l->data; + channel_en_cnt += probe->enabled; + channel_cnt++; + } + if (devc->instant) + dso_buffer_size = instant_buffer_size * channel_cnt; + else + dso_buffer_size = devc->limit_samples * channel_en_cnt + 512; + size = (sdi->mode == ANALOG) ? cons_buffer_size : ((sdi->mode == DSO) ? dso_buffer_size : buffer_size); + devc->submitted_transfers = 0; + + devc->transfers = g_try_malloc0(sizeof(*devc->transfers) * num_transfers); + if (!devc->transfers) { + sr_err("USB transfers malloc failed."); + return SR_ERR_MALLOC; + } + + devc->num_transfers = num_transfers; + for (i = 0; i < num_transfers; i++) { + if (!(buf = g_try_malloc(size))) { + sr_err("USB transfer buffer malloc failed."); + return SR_ERR_MALLOC; + } + transfer = libusb_alloc_transfer(0); + libusb_fill_bulk_transfer(transfer, usb->devhdl, + 6 | LIBUSB_ENDPOINT_IN, buf, size, + receive_transfer, devc, 0); + if ((ret = libusb_submit_transfer(transfer)) != 0) { + sr_err("Failed to submit transfer: %s.", + libusb_error_name(ret)); + libusb_free_transfer(transfer); + g_free(buf); + abort_acquisition(devc); + return SR_ERR; + } + devc->transfers[i] = transfer; + devc->submitted_transfers++; + } + + devc->status = DSL_DATA; + + return SR_OK; +} + + +static int receive_data(int fd, int revents, const struct sr_dev_inst *sdi) +{ + int completed = 0; + struct timeval tv; + struct drv_context *drvc; + struct DSL_context *devc; + + (void)fd; + (void)revents; + + drvc = di->priv; + devc = sdi->priv; + + if (devc->num_samples != -1 && + (devc->status == DSL_STOP || devc->status == DSL_ERROR)) { + sr_info("%s: Stopping", __func__); + abort_acquisition(devc); + } + + tv.tv_sec = tv.tv_usec = 0; + libusb_handle_events_timeout_completed(drvc->sr_ctx->libusb_ctx, &tv, &completed); + + return TRUE; +} + +static void receive_trigger_pos(struct libusb_transfer *transfer) +{ + struct DSL_context *devc; + struct sr_datafeed_packet packet; + struct sr_datafeed_logic logic; + struct sr_datafeed_dso dso; + struct sr_datafeed_analog analog; + struct ds_trigger_pos *trigger_pos; + int ret; + + devc = transfer->user_data; + sr_info("receive_trigger_pos(): status %d; timeout %d; received %d bytes.", + transfer->status, transfer->timeout, transfer->actual_length); + + if (devc->num_samples == -1) { + free_transfer(transfer); + return; + } + + trigger_pos = (struct ds_trigger_pos *)transfer->buffer; + switch (transfer->status) { + case LIBUSB_TRANSFER_COMPLETED: + if (transfer->actual_length == sizeof(struct ds_trigger_pos)) { + packet.type = SR_DF_TRIGGER; + packet.payload = trigger_pos; + sr_session_send(devc->cb_data, &packet); + + devc->status = DSL_TRIGGERED; + free_transfer(transfer); + devc->num_transfers = 0; + devc->empty_transfer_count = 0; + } else { + free_transfer(transfer); + devc->status = DSL_ERROR; + } + break; + case LIBUSB_TRANSFER_TIMED_OUT: + devc->empty_transfer_count++; + if (devc->empty_transfer_count > MAX_EMPTY_TRANSFERS) { + /* + * The FX2 gave up. End the acquisition, the frontend + * will work out that the samplecount is short. + */ + //abort_acquisition(devc); + free_transfer(transfer); + devc->status = DSL_ERROR; + } else { + resubmit_transfer(transfer); + } + break; + case LIBUSB_TRANSFER_CANCELLED: + resubmit_transfer(transfer); + break; + default: + //abort_acquisition(devc); + free_transfer(transfer); + devc->status = DSL_ERROR; + break; + } + + if (devc->status == DSL_TRIGGERED) { + if ((ret = dev_transfer_start(devc->cb_data)) != SR_OK) { + sr_err("%s: could not start data transfer" + "(%d)%d", __func__, ret, errno); + } + } +} + +static int dev_acquisition_start(const struct sr_dev_inst *sdi, void *cb_data) +{ + struct DSL_context *devc; + struct drv_context *drvc; + struct sr_usb_dev_inst *usb; + struct libusb_transfer *transfer; + struct ds_trigger_pos *trigger_pos; + const struct libusb_pollfd **lupfd; + unsigned int i; + int ret; + int transferred; + struct sr_datafeed_packet packet; + int header_transferred; + + test_init = 1; + + if (sdi->status != SR_ST_ACTIVE) + return SR_ERR_DEV_CLOSED; + + drvc = di->priv; + devc = sdi->priv; + usb = sdi->conn; + + //devc->cb_data = cb_data; + devc->cb_data = sdi; + devc->num_samples = 0; + devc->empty_transfer_count = 0; + devc->status = DSL_INIT; + devc->num_transfers = 0; + devc->submitted_transfers = 0; + + /* Configures devc->trigger_* and devc->sample_wide */ + if (configure_probes(sdi) != SR_OK) { + sr_err("Failed to configure probes."); + return SR_ERR; + } + + /* Stop Previous GPIF acquisition */ + if ((ret = command_stop_acquisition (usb->devhdl)) != SR_OK) { + sr_err("Stop DSCope acquisition failed!"); + abort_acquisition(devc); + return ret; + } else { + sr_info("Stop Previous DSCope acquisition!"); + } + + /* Setting FPGA before acquisition start*/ + if ((ret = command_fpga_setting(usb->devhdl, sizeof(struct DSL_setting) / sizeof(uint16_t))) != SR_OK) { + sr_err("Send FPGA setting command failed!"); + } else { + if ((ret = fpga_setting(sdi)) != SR_OK) { + sr_err("Configure FPGA failed!"); + abort_acquisition(devc); + return ret; + } + } + +// if (sdi->mode == DSO) { +// GSList *l; +// for(l = sdi->channels; l; l = l->next) { +// struct sr_channel *probe = (struct sr_channel *)l->data; +// ret = command_dso_ctrl(usb->devhdl, dso_cmd_gen(sdi, probe, SR_CONF_COUPLING)); +// if (ret != SR_OK) { +// sr_err("Set COUPLING of channel %d command failed!", probe->index); +// return ret; +// } +// ret = command_dso_ctrl(usb->devhdl, dso_cmd_gen(sdi, probe, SR_CONF_VPOS)); +// if (ret != SR_OK) { +// sr_err("Set VDIV of channel %d command failed!", probe->index); +// return ret; +// } +// } +// } + + if ((ret = command_start_acquisition (usb->devhdl, + devc->cur_samplerate, devc->sample_wide, (sdi->mode == LOGIC))) != SR_OK) { + abort_acquisition(devc); + return ret; + } + + test_sample_value = 0; + + /* setup callback function for data transfer */ + lupfd = libusb_get_pollfds(drvc->sr_ctx->libusb_ctx); + for (i = 0; lupfd[i]; i++); + if (!(devc->usbfd = g_try_malloc(sizeof(struct libusb_pollfd) * (i + 1)))) + return SR_ERR; + for (i = 0; lupfd[i]; i++) { + sr_source_add(lupfd[i]->fd, lupfd[i]->events, + get_timeout(devc), receive_data, sdi); + devc->usbfd[i] = lupfd[i]->fd; + } + devc->usbfd[i] = -1; + free(lupfd); + + /* poll trigger status transfer*/ + if (!(trigger_pos = g_try_malloc0(sizeof(struct ds_trigger_pos)))) { + sr_err("USB trigger_pos buffer malloc failed."); + return SR_ERR_MALLOC; + } + devc->transfers = g_try_malloc0(sizeof(*devc->transfers)); + if (!devc->transfers) { + sr_err("USB trigger_pos transfer malloc failed."); + return SR_ERR_MALLOC; + } + devc->num_transfers = 1; + transfer = libusb_alloc_transfer(0); + libusb_fill_bulk_transfer(transfer, usb->devhdl, + 6 | LIBUSB_ENDPOINT_IN, trigger_pos, sizeof(struct ds_trigger_pos), + receive_trigger_pos, devc, 0); + if ((ret = libusb_submit_transfer(transfer)) != 0) { + sr_err("Failed to submit trigger_pos transfer: %s.", + libusb_error_name(ret)); + libusb_free_transfer(transfer); + g_free(trigger_pos); + abort_acquisition(devc); + return SR_ERR; + } + devc->transfers[0] = transfer; + devc->submitted_transfers++; + + devc->status = DSL_START; + mstatus_valid = FALSE; + mstatus.zeroing = devc->zero; + /* Send header packet to the session bus. */ + //std_session_send_df_header(cb_data, LOG_PREFIX); + std_session_send_df_header(sdi, LOG_PREFIX); + + return SR_OK; +} + +static int dev_acquisition_stop(struct sr_dev_inst *sdi, void *cb_data) +{ + (void)cb_data; + + struct DSL_context *devc; + + devc = sdi->priv; + devc->status = DSL_STOP; + + //abort_acquisition(sdi->priv); + + return SR_OK; +} + +static int dev_test(struct sr_dev_inst *sdi) +{ + if (sdi) { + struct sr_usb_dev_inst *usb; + struct version_info vi; + int ret; + + usb = sdi->conn; + ret = command_get_fw_version(usb->devhdl, &vi); + if (ret != SR_OK) { + sr_err("Device don't exist!"); + return SR_ERR; + } else { + return SR_OK; + } + } else { + return SR_ERR; + } +} + +static int dev_status_get(struct sr_dev_inst *sdi, struct sr_status *status, int begin, int end) +{ + (void)begin; + (void)end; + if (sdi) { + struct DSL_context *devc; + devc = sdi->priv; + if (mstatus_valid) { + *status = mstatus; + if (devc->zero) + return SR_ERR; + else + return SR_OK; + } else { + return SR_ERR; + } + } else { + return SR_ERR; + } +} + +SR_PRIV struct sr_dev_driver DSCope_driver_info = { + .name = "DSCope", + .longname = "DSCope (generic driver for DScope oscilloscope)", + .api_version = 1, + .init = init, + .cleanup = cleanup, + .scan = scan, + .dev_list = dev_list, + .dev_mode_list = dev_mode_list, + .dev_clear = dev_clear, + .config_get = config_get, + .config_set = config_set, + .config_list = config_list, + .dev_open = dev_open, + .dev_close = dev_close, + .dev_test = dev_test, + .dev_status_get = dev_status_get, + .dev_acquisition_start = dev_acquisition_start, + .dev_acquisition_stop = dev_acquisition_stop, + .priv = NULL, +}; diff --git a/libsigrok4DSL/hardware/DSL/dsl.h b/libsigrok4DSL/hardware/DSL/dsl.h index 1066c8d6..33907ace 100644 --- a/libsigrok4DSL/hardware/DSL/dsl.h +++ b/libsigrok4DSL/hardware/DSL/dsl.h @@ -18,13 +18,15 @@ * along with this program. If not, see . */ -#ifndef LIBDSLOGIC_HARDWARE_DSLOGIC_H -#define LIBDSLOGIC_HARDWARE_DSLOGIC_H +#ifndef LIBDSL_HARDWARE_DSL_H +#define LIBDSL_HARDWARE_DSL_H #include +#include "libsigrok.h" +#include "libsigrok-internal.h" /* Message logging helpers with subsystem-specific prefix string. */ -#define LOG_PREFIX "DSLogic Hardware: " +#define LOG_PREFIX "DSL Hardware: " #define ds_log(l, s, args...) ds_log(l, LOG_PREFIX s, ## args) #define ds_spew(s, args...) ds_spew(LOG_PREFIX s, ## args) #define ds_dbg(s, args...) ds_dbg(LOG_PREFIX s, ## args) @@ -41,7 +43,7 @@ #define NUM_SIMUL_TRANSFERS 64 #define MAX_EMPTY_TRANSFERS (NUM_SIMUL_TRANSFERS * 2) -#define DSLOGIC_REQUIRED_VERSION_MAJOR 1 +#define DSL_REQUIRED_VERSION_MAJOR 1 #define MAX_8BIT_SAMPLE_RATE DS_MHZ(24) #define MAX_16BIT_SAMPLE_RATE DS_MHZ(12) @@ -62,7 +64,21 @@ #define DEFAULT_SAMPLERATE SR_MHZ(100) #define DEFAULT_SAMPLELIMIT SR_MB(16) -struct DSLogic_profile { +#define VPOS_MINISTEP 0.083 +#define VPOS_STEP 26.0 + +#define DSLOGIC_MAX_DSO_DEPTH SR_MB(2) +//#define DSLOGIC_MAX_DSO_DEPTH SR_KB(2) +#define DSLOGIC_MAX_DSO_SAMPLERATE SR_MHZ(200) +#define DSLOGIC_INSTANT_DEPTH SR_MB(32) +#define DSLOGIC_MAX_LOGIC_DEPTH SR_MB(16) +#define DSLOGIC_MAX_LOGIC_SAMPLERATE SR_MHZ(100) +#define DSCOPE_MAX_DEPTH SR_MB(2) +//#define DSCOPE_MAX_DEPTH SR_KB(512) +#define DSCOPE_MAX_SAMPLERATE SR_MHZ(200) +#define DSCOPE_INSTANT_DEPTH SR_MB(32) + +struct DSL_profile { uint16_t vid; uint16_t pid; @@ -78,7 +94,7 @@ struct DSLogic_profile { uint32_t dev_caps; }; -static const struct DSLogic_profile supported_fx2[3] = { +static const struct DSL_profile supported_DSLogic[3] = { /* * DSLogic */ @@ -88,22 +104,43 @@ static const struct DSLogic_profile supported_fx2[3] = { "DSLogic50.bin", DEV_CAPS_16BIT}, + {0x2A0E, 0x0003, NULL, "DSLogic Pro", NULL, + "DSLogicPro.fw", + "DSLogicPro.bin", + "DSLogicPro.bin", + DEV_CAPS_16BIT}, + { 0, 0, 0, 0, 0, 0, 0, 0, 0 } }; -enum { - DSLOGIC_ERROR = -1, - DSLOGIC_INIT = 0, - DSLOGIC_START = 1, - DSLOGIC_TRIGGERED = 2, - DSLOGIC_DATA = 3, - DSLOGIC_STOP = 4, +static const struct DSL_profile supported_DSCope[2] = { + /* + * DSCope + */ + {0x2A0E, 0x0002, NULL, "DSCope", NULL, + "DSCope.fw", + "DSCope.bin", + "DSCope.bin", + DEV_CAPS_16BIT}, + + { 0, 0, 0, 0, 0, 0, 0, 0, 0 } }; -struct dev_context { - const struct DSLogic_profile *profile; + +enum { + DSL_ERROR = -1, + DSL_INIT = 0, + DSL_START = 1, + DSL_READY = 2, + DSL_TRIGGERED = 3, + DSL_DATA = 4, + DSL_STOP = 5, +}; + +struct DSL_context { + const struct DSL_profile *profile; /* - * Since we can't keep track of an DSLogic device after upgrading + * Since we can't keep track of an DSL device after upgrading * the firmware (it renumerates into a different device address * after the upgrade) this is like a global lock. No device will open * until a proper delay after the last device was upgraded. @@ -118,8 +155,10 @@ struct dev_context { gboolean sample_wide; gboolean clock_type; gboolean clock_edge; + gboolean instant; uint16_t op_mode; uint16_t th_level; + double vth; uint16_t filter; uint16_t trigger_mask[NUM_TRIGGER_STAGES]; uint16_t trigger_value[NUM_TRIGGER_STAGES]; @@ -130,6 +169,8 @@ struct dev_context { uint8_t trigger_source; uint32_t trigger_hpos; gboolean zero; + gboolean stream; + gboolean lock; int num_samples; int submitted_transfers; @@ -144,9 +185,10 @@ struct dev_context { GIOChannel *channel; int status; + gboolean mstatus_valid; }; -struct DSLogic_setting { +struct DSL_setting { uint32_t sync; uint16_t mode_header; // 0 uint16_t mode; diff --git a/libsigrok4DSL/hardware/DSL/dslogic.c b/libsigrok4DSL/hardware/DSL/dslogic.c index fb5d5120..95ee508c 100644 --- a/libsigrok4DSL/hardware/DSL/dslogic.c +++ b/libsigrok4DSL/hardware/DSL/dslogic.c @@ -20,26 +20,27 @@ #include #include -#include #include #include #include #include +#include #include -#include -#include "libsigrok.h" -#include "libsigrok-internal.h" -#include "dslogic.h" +//#include +#include "dsl.h" #include "command.h" -#ifndef _WIN32 #undef min #define min(a,b) ((a)<(b)?(a):(b)) -#endif -static const int cons_buffer_size = 1024 * 16; -static const int dso_buffer_size = SR_KB(32); +static const int single_buffer_time = 20; +static const int total_buffer_time = 200; +static const int buffer_size = 1024 * 1024; +static const int instant_buffer_size = 1024 * 1024; +static const int cons_buffer_size = 128; +static const int buffer_cnt = 4; + static struct sr_dev_mode mode_list[] = { {"LA", LOGIC}, {"DAQ", ANALOG}, @@ -85,6 +86,14 @@ static const int32_t hwoptions[] = { SR_CONF_CLOCK_EDGE, }; +static const int32_t hwoptions_pro[] = { + SR_CONF_OPERATION_MODE, + SR_CONF_VTH, + SR_CONF_FILTER, + SR_CONF_CLOCK_TYPE, + SR_CONF_CLOCK_EDGE, +}; + static const char *probe_names[] = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", @@ -133,7 +142,7 @@ static const uint64_t samplerates[] = { static const uint64_t samplecounts[] = { SR_KB(1), SR_KB(2), - SR_KB(8), + SR_KB(4), SR_KB(8), SR_KB(16), SR_KB(32), @@ -146,13 +155,26 @@ static const uint64_t samplecounts[] = { SR_MB(4), SR_MB(8), SR_MB(16), + SR_MB(32), + SR_MB(64), + SR_MB(128), + SR_MB(256), + SR_MB(512), + SR_GB(1), }; +static const uint8_t zero_base_addr = 0x80; +static const uint8_t comb_base_addr = 0xB0; + SR_PRIV struct sr_dev_driver DSLogic_driver_info; static struct sr_dev_driver *di = &DSLogic_driver_info; extern struct ds_trigger *trigger; +struct sr_status mstatus; +struct cmd_zero_info zero_info; +struct cmd_comb_info comb_info; + /** * Check the USB configuration to determine if this is an DSLogic device. * @@ -199,14 +221,17 @@ static gboolean check_conf_profile(libusb_device *dev) static int fpga_setting(const struct sr_dev_inst *sdi) { - struct dev_context *devc; + struct DSL_context *devc; struct sr_usb_dev_inst *usb; struct libusb_device_handle *hdl; - struct DSLogic_setting setting; + struct DSL_setting setting; int ret; int transferred; int result; int i; + int channel_en_cnt = 0; + int channel_cnt = 0; + GSList *l; devc = sdi->priv; usb = sdi->conn; @@ -242,18 +267,28 @@ static int fpga_setting(const struct sr_dev_inst *sdi) //setting.trig_logic3_header = 0x2310ffff; setting.end_sync = 0xfa5afa5a; + for (l = sdi->channels; l; l = l->next) { + struct sr_channel *probe = (struct sr_channel *)l->data; + channel_en_cnt += probe->enabled; + channel_cnt++; + } + if (channel_en_cnt == 0) + channel_en_cnt = 1; + //setting.mode = (test_mode ? 0x8000 : 0x0000) + trigger->trigger_en + (sdi->mode << 4); setting.mode = ((devc->op_mode == SR_OP_INTERNAL_TEST) << 15) + ((devc->op_mode == SR_OP_EXTERNAL_TEST) << 14) + ((devc->op_mode == SR_OP_LOOPBACK_TEST) << 13) + + ((devc->stream) << 12) + trigger->trigger_en + ((sdi->mode > 0) << 4) + (devc->clock_type << 1) + (devc->clock_edge << 1) + - (((devc->cur_samplerate == SR_MHZ(200) && sdi->mode != DSO) || (sdi->mode == ANALOG)) << 5) + - ((devc->cur_samplerate == SR_MHZ(400)) << 6) + + (((channel_cnt == 8 && sdi->mode != DSO) || (sdi->mode == ANALOG)) << 5) + + ((channel_cnt == 4) << 6) + ((sdi->mode == ANALOG) << 7) + - ((devc->filter == SR_FILTER_1T) << 8); - setting.divider = (uint32_t)ceil(SR_MHZ(100) * 1.0 / devc->cur_samplerate); - setting.count = (uint32_t)(devc->limit_samples); + ((devc->filter == SR_FILTER_1T) << 8) + + (devc->instant << 9) + (devc->zero << 10); + setting.divider = devc->zero ? 0x1 : (uint32_t)ceil(SR_MHZ(100) * 1.0 / devc->cur_samplerate); + setting.count = (sdi->mode == DSO) ? (uint32_t)(devc->limit_samples / (channel_cnt / channel_en_cnt)) : (uint32_t)(devc->limit_samples); setting.trig_pos = (uint32_t)(trigger->trigger_pos / 100.0f * devc->limit_samples); setting.trig_glb = trigger->trigger_stages; setting.trig_adp = setting.count - setting.trig_pos - 1; @@ -311,16 +346,16 @@ static int fpga_setting(const struct sr_dev_inst *sdi) result = SR_OK; ret = libusb_bulk_transfer(hdl, 2 | LIBUSB_ENDPOINT_OUT, - &setting, sizeof(struct DSLogic_setting), - &transferred, 1000); + &setting, sizeof(struct DSL_setting), + &transferred, 3000); if (ret < 0) { sr_err("Unable to setting FPGA of DSLogic: %s.", libusb_error_name(ret)); result = SR_ERR; - } else if (transferred != sizeof(struct DSLogic_setting)) { + } else if (transferred != sizeof(struct DSL_setting)) { sr_err("Setting FPGA error: expacted transfer size %d; actually %d", - sizeof(struct DSLogic_setting), transferred); + sizeof(struct DSL_setting), transferred); result = SR_ERR; } @@ -337,18 +372,20 @@ static int fpga_config(struct libusb_device_handle *hdl, const char *filename) unsigned char *buf; int transferred; uint64_t filesize; - struct stat f_stat; + struct stat f_stat; sr_info("Configure FPGA using %s", filename); - if ((fw = g_fopen(filename, "rb")) == NULL) { + if ((fw = fopen(filename, "rb")) == NULL) { sr_err("Unable to open FPGA bit file %s for reading: %s", filename, strerror(errno)); return SR_ERR; } + if (stat(filename, &f_stat) == -1) return SR_ERR; filesize = (uint64_t)f_stat.st_size; + if (!(buf = g_try_malloc(filesize))) { sr_err("FPGA configure bit malloc failed."); return SR_ERR; @@ -393,7 +430,7 @@ static int DSLogic_dev_open(struct sr_dev_inst *sdi) libusb_device **devlist; struct sr_usb_dev_inst *usb; struct libusb_device_descriptor des; - struct dev_context *devc; + struct DSL_context *devc; struct drv_context *drvc; struct version_info vi; int ret, skip, i, device_count; @@ -473,9 +510,9 @@ static int DSLogic_dev_open(struct sr_dev_inst *sdi) * bail out if we encounter an incompatible version. * Different minor versions are OK, they should be compatible. */ - if (vi.major != DSLOGIC_REQUIRED_VERSION_MAJOR) { + if (vi.major != DSL_REQUIRED_VERSION_MAJOR) { sr_err("Expected firmware version %d.x, " - "got %d.%d.", DSLOGIC_REQUIRED_VERSION_MAJOR, + "got %d.%d.", DSL_REQUIRED_VERSION_MAJOR, vi.major, vi.minor); break; } @@ -501,7 +538,7 @@ static int DSLogic_dev_open(struct sr_dev_inst *sdi) static int configure_probes(const struct sr_dev_inst *sdi) { - struct dev_context *devc; + struct DSL_context *devc; struct sr_channel *probe; GSList *l; int probe_bit, stage, i; @@ -552,11 +589,11 @@ static int configure_probes(const struct sr_dev_inst *sdi) return SR_OK; } -static struct dev_context *DSLogic_dev_new(void) +static struct DSL_context *DSLogic_dev_new(void) { - struct dev_context *devc; + struct DSL_context *devc; - if (!(devc = g_try_malloc(sizeof(struct dev_context)))) { + if (!(devc = g_try_malloc(sizeof(struct DSL_context)))) { sr_err("Device context malloc failed."); return NULL; } @@ -568,14 +605,18 @@ static struct dev_context *DSLogic_dev_new(void) devc->sample_wide = 0; devc->clock_type = FALSE; devc->clock_edge = FALSE; + devc->instant = FALSE; devc->op_mode = SR_OP_NORMAL; devc->th_level = SR_TH_3V3; + devc->vth = 1.0; devc->filter = SR_FILTER_NONE; devc->timebase = 10000; devc->trigger_slope = DSO_TRIGGER_RISING; devc->trigger_source = DSO_TRIGGER_AUTO; devc->trigger_hpos = 0x0; devc->zero = FALSE; + devc->stream = FALSE; + devc->mstatus_valid = FALSE; return devc; } @@ -601,7 +642,7 @@ static int set_probes(struct sr_dev_inst *sdi, int num_probes) return SR_ERR; if (sdi->mode == DSO) { probe->vdiv = 1000; - probe->coupling = FALSE; + probe->coupling = SR_DC_COUPLING; probe->trig_value = 0x80; } sdi->channels = g_slist_append(sdi->channels, probe); @@ -638,11 +679,11 @@ static int adjust_probes(struct sr_dev_inst *sdi, int num_probes) static GSList *scan(GSList *options) { struct drv_context *drvc; - struct dev_context *devc; + struct DSL_context *devc; struct sr_dev_inst *sdi; struct sr_usb_dev_inst *usb; struct sr_config *src; - const struct DSLogic_profile *prof; + const struct DSL_profile *prof; GSList *l, *devices, *conn_devices; struct libusb_device_descriptor des; libusb_device **devlist; @@ -690,10 +731,10 @@ static GSList *scan(GSList *options) } prof = NULL; - for (j = 0; supported_fx2[j].vid; j++) { - if (des.idVendor == supported_fx2[j].vid && - des.idProduct == supported_fx2[j].pid) { - prof = &supported_fx2[j]; + for (j = 0; supported_DSLogic[j].vid; j++) { + if (des.idVendor == supported_DSLogic[j].vid && + des.idProduct == supported_DSLogic[j].pid) { + prof = &supported_DSLogic[j]; } } @@ -719,7 +760,7 @@ static GSList *scan(GSList *options) drvc->instances = g_slist_append(drvc->instances, sdi); devices = g_slist_append(devices, sdi); - if (check_conf_profile(devlist[i])) { + if (check_conf_profile(devlist[i])) { /* Already has the firmware, so fix the new address. */ sr_dbg("Found an DSLogic device."); sdi->status = SR_ST_INACTIVE; @@ -765,10 +806,140 @@ static GSList *dev_mode_list(void) return l; } +static uint64_t dso_cmd_gen(struct sr_dev_inst *sdi, struct sr_channel* ch, int id) +{ + struct DSL_context *devc; + uint64_t cmd = 0; + int channel_cnt = 0; + GSList *l; + const int ch_bit = 7; + + devc = sdi->priv; + + switch (id) { + case SR_CONF_VDIV: + case SR_CONF_EN_CH: + case SR_CONF_TIMEBASE: + case SR_CONF_COUPLING: + for (l = sdi->channels; l; l = l->next) { + struct sr_channel *probe = (struct sr_channel *)l->data; + if (probe->enabled) + channel_cnt += probe->index + 0x1; + } + if (channel_cnt == 0) + return 0x0; + + // --VDBS + switch(ch->vdiv){ + case 5: cmd += 0x247000; break; + case 10: cmd += 0x23D000; break; + case 20: cmd += 0x22F000; break; + case 50: cmd += 0x21C800; break; + case 100: cmd += 0x20E800; break; + case 200: cmd += 0x200800; break; + case 500: cmd += 0x2F000; break; + case 1000: cmd += 0x21100; break; + case 2000: cmd += 0x13000; break; + case 5000: cmd += 0x00800; break; + default: cmd += 0x21100; break; + } + // --DC/AC + if (channel_cnt == 1) { + for (l = sdi->channels; l; l = l->next) { + struct sr_channel *probe = (struct sr_channel *)l->data; + if (probe->coupling == SR_AC_COUPLING) + cmd += 0x100000; + break; + } + } else { + if(ch->coupling == SR_AC_COUPLING) + cmd += 0x100000; + } + + // --Channel + if(channel_cnt == 1) + cmd += 0xC00000; + else if(ch->index == 0) + cmd += 0x400000; + else if(ch->index == 1) + cmd += 0x800000; + else + cmd += 0x000000; +// if(ch->index == 0) +// cmd += 0x400000; +// else if(ch->index == 1) +// cmd += 0x800000; +// else +// cmd += 0x000000; + + // --Header + cmd += 0x55000000; + break; + case SR_CONF_SAMPLERATE: + for (l = sdi->channels; l; l = l->next) { + struct sr_channel *probe = (struct sr_channel *)l->data; + channel_cnt += probe->enabled; + } + cmd += 0x18; + uint32_t divider = devc->zero ? 0x1 : (uint32_t)ceil(SR_MHZ(100) * 1.0 / devc->cur_samplerate); + cmd += divider << 8; + break; + case SR_CONF_HORIZ_TRIGGERPOS: + cmd += 0x20; + cmd += devc->trigger_hpos << 8; + break; + case SR_CONF_TRIGGER_SLOPE: + cmd += 0x28; + cmd += devc->trigger_slope << 8; + break; + case SR_CONF_TRIGGER_SOURCE: + cmd += 0x30; + cmd += devc->trigger_source << 8; + break; + case SR_CONF_TRIGGER_VALUE: + cmd += 0x38; + for (l = sdi->channels; l; l = l->next) { + struct sr_channel *probe = (struct sr_channel *)l->data; + cmd += probe->trig_value << (8 * (probe->index + 1)); + } + break; + case SR_CONF_ZERO_SET: + cmd += 0x40; + cmd += ch->index << ch_bit; + cmd += ((uint64_t)zero_info.vpos_l << 8); + cmd += ((uint64_t)(zero_info.vpos_h & 0x3) << 16); + cmd += ((uint64_t)zero_info.voff_l << 24); + cmd += ((uint64_t)(zero_info.voff_h & 0x3) << 32); + cmd += ((uint64_t)zero_info.vcntr_l << 40); + cmd += ((uint64_t)(zero_info.vcntr_h & 0x3) << 48); + cmd += ((uint64_t)zero_info.adc_off << 56); + break; + case SR_CONF_COMB_SET: + cmd += 0x48; + cmd += ((uint64_t)comb_info.comb0_low_off << 8); + cmd += ((uint64_t)comb_info.comb0_hig_off << 16); + cmd += ((uint64_t)comb_info.comb1_low_off << 24); + cmd += ((uint64_t)comb_info.comb1_hig_off << 32); + cmd += ((uint64_t)comb_info.comb_sign << 40); + break; + case SR_CONF_ZERO_OVER: + cmd += 0x50; + break; + case SR_CONF_DSO_SYNC: + cmd = 0xa5a5a500; + break; + default: + cmd = 0x00000000; + } + + return cmd; +} + static int dev_open(struct sr_dev_inst *sdi) { struct sr_usb_dev_inst *usb; - struct dev_context *devc; + struct DSL_context *devc; + GSList *l; int ret; int64_t timediff_us, timediff_ms; @@ -780,29 +951,29 @@ static int dev_open(struct sr_dev_inst *sdi) * milliseconds for the FX2 to renumerate. */ ret = SR_ERR; - if (devc->fw_updated > 0) { + if (devc->fw_updated > 0) { sr_info("Waiting for device to reset."); - /* Takes >= 300ms for the FX2 to be gone from the USB bus. */ + /* Takes >= 300ms for the FX2 to be gone from the USB bus. */ g_usleep(300 * 1000); - timediff_ms = 0; - while (timediff_ms < MAX_RENUM_DELAY_MS) { + timediff_ms = 0; + while (timediff_ms < MAX_RENUM_DELAY_MS) { if ((ret = DSLogic_dev_open(sdi)) == SR_OK) - break; - g_usleep(100 * 1000); + break; + g_usleep(100 * 1000); - timediff_us = g_get_monotonic_time() - devc->fw_updated; - timediff_ms = timediff_us / 1000; + timediff_us = g_get_monotonic_time() - devc->fw_updated; + timediff_ms = timediff_us / 1000; sr_spew("Waited %" PRIi64 "ms.", timediff_ms); - } + } if (ret != SR_OK) { sr_err("Device failed to renumerate."); return SR_ERR; - } + } sr_info("Device came back after %" PRIi64 "ms.", timediff_ms); - } else { + } else { sr_info("Firmware upload was not needed."); ret = DSLogic_dev_open(sdi); - } + } if (ret != SR_OK) { sr_err("Unable to open device."); @@ -828,27 +999,37 @@ static int dev_open(struct sr_dev_inst *sdi) return SR_ERR; } - if ((ret = command_fpga_config(usb->devhdl)) != SR_OK) { - sr_err("Send FPGA configure command failed!"); - } else { - /* Takes >= 10ms for the FX2 to be ready for FPGA configure. */ - g_usleep(10 * 1000); - char filename[256]; - switch(devc->th_level) { - case SR_TH_3V3: - sprintf(filename,"%s%s",config_path,devc->profile->fpga_bit33); - break; - case SR_TH_5V0: - sprintf(filename,"%s%s",config_path,devc->profile->fpga_bit50); - break; - default: - return SR_ERR; - } - const char *fpga_bit = filename; - ret = fpga_config(usb->devhdl, fpga_bit); - if (ret != SR_OK) { - sr_err("Configure FPGA failed!"); + if (devc->fw_updated > 0) { + if ((ret = command_fpga_config(usb->devhdl)) != SR_OK) { + sr_err("Send FPGA configure command failed!"); + } else { + /* Takes >= 10ms for the FX2 to be ready for FPGA configure. */ + g_usleep(10 * 1000); + char filename[256]; + switch(devc->th_level) { + case SR_TH_3V3: + sprintf(filename,"%s%s",config_path,devc->profile->fpga_bit33); + break; + case SR_TH_5V0: + sprintf(filename,"%s%s",config_path,devc->profile->fpga_bit50); + break; + default: + return SR_ERR; + } + const char *fpga_bit = filename; + ret = fpga_config(usb->devhdl, fpga_bit); + if (ret != SR_OK) { + sr_err("Configure FPGA failed!"); + } } + + ret = command_vth(usb->devhdl, devc->vth); + if (ret == SR_OK) + sr_dbg("%s: setting threshold voltage to %d", + __func__, devc->vth); + else + sr_dbg("%s: setting threshold voltage to %d failed", + __func__, devc->vth); } return SR_OK; @@ -892,7 +1073,7 @@ static int config_get(int id, GVariant **data, const struct sr_dev_inst *sdi, const struct sr_channel *ch, const struct sr_channel_group *cg) { - struct dev_context *devc; + struct DSL_context *devc; struct sr_usb_dev_inst *usb; char str[128]; @@ -934,12 +1115,24 @@ static int config_get(int id, GVariant **data, const struct sr_dev_inst *sdi, devc = sdi->priv; *data = g_variant_new_boolean(devc->clock_edge); break; + case SR_CONF_INSTANT: + if (!sdi) + return SR_ERR; + devc = sdi->priv; + *data = g_variant_new_boolean(devc->instant); + break; case SR_CONF_OPERATION_MODE: if (!sdi) return SR_ERR; devc = sdi->priv; *data = g_variant_new_string(opmodes[devc->op_mode]); break; + case SR_CONF_TEST: + if (!sdi) + return SR_ERR; + devc = sdi->priv; + *data = g_variant_new_boolean(devc->op_mode != SR_OP_NORMAL); + break; case SR_CONF_FILTER: if (!sdi) return SR_ERR; @@ -952,6 +1145,12 @@ static int config_get(int id, GVariant **data, const struct sr_dev_inst *sdi, devc = sdi->priv; *data = g_variant_new_string(thresholds[devc->th_level]); break; + case SR_CONF_VTH: + if (!sdi) + return SR_ERR; + devc = sdi->priv; + *data = g_variant_new_double(devc->vth); + break; case SR_CONF_VDIV: if (!ch) return SR_ERR; @@ -966,7 +1165,7 @@ static int config_get(int id, GVariant **data, const struct sr_dev_inst *sdi, case SR_CONF_COUPLING: if (!ch) return SR_ERR; - *data = g_variant_new_boolean(ch->coupling); + *data = g_variant_new_byte(ch->coupling); break; case SR_CONF_EN_CH: if (!ch) @@ -994,122 +1193,71 @@ static int config_get(int id, GVariant **data, const struct sr_dev_inst *sdi, if (!sdi) return SR_ERR; devc = sdi->priv; - *data = g_variant_new_uint16(devc->trigger_hpos); + if (sdi->mode == DSO) { + uint16_t channel_cnt = 0; + GSList *l; + for (l = sdi->channels; l; l = l->next) { + struct sr_channel *probe = (struct sr_channel *)l->data; + channel_cnt += probe->enabled; + } + uint16_t pos = devc->trigger_hpos * channel_cnt * 100 / devc->limit_samples; + *data = g_variant_new_uint16(pos); + } else { + *data = g_variant_new_uint16(devc->trigger_hpos); + } break; case SR_CONF_ZERO: if (!sdi) return SR_ERR; devc = sdi->priv; - *data = g_variant_new_boolean(devc->zero); + if (sdi->mode == DSO) + *data = g_variant_new_boolean(devc->zero); + else + *data = g_variant_new_boolean(FALSE); break; - default: + case SR_CONF_STREAM: + if (!sdi) + return SR_ERR; + devc = sdi->priv; + *data = g_variant_new_boolean(devc->stream); + break; + case SR_CONF_MAX_DSO_SAMPLERATE: + if (!sdi) + return SR_ERR; + *data = g_variant_new_uint64(DSLOGIC_MAX_DSO_SAMPLERATE); + break; + case SR_CONF_MAX_DSO_SAMPLELIMITS: + if (!sdi) + return SR_ERR; + *data = g_variant_new_uint64(DSLOGIC_MAX_DSO_DEPTH); + break; + case SR_CONF_MAX_LOGIC_SAMPLERATE: + if (!sdi) + return SR_ERR; + *data = g_variant_new_uint64(DSLOGIC_MAX_LOGIC_SAMPLERATE); + break; + case SR_CONF_MAX_LOGIC_SAMPLELIMITS: + if (!sdi) + return SR_ERR; + *data = g_variant_new_uint64(DSLOGIC_MAX_LOGIC_DEPTH); + break; + case SR_CONF_STATUS: + if (!sdi) + return SR_ERR; + *data = g_variant_new_boolean(devc->status != DSL_INIT); + break; + default: return SR_ERR_NA; } return SR_OK; } -static uint32_t dso_cmd_gen(struct sr_dev_inst *sdi, struct sr_channel* ch, int id) -{ - struct dev_context *devc; - uint32_t cmd = 0; - int channel_cnt = 0; - GSList *l; - - devc = sdi->priv; - - switch (id) { - case SR_CONF_VDIV: - case SR_CONF_EN_CH: - case SR_CONF_TIMEBASE: - case SR_CONF_COUPLING: - for (l = sdi->channels; l; l = l->next) { - struct sr_channel *probe = (struct sr_channel *)l->data; - if (probe->enabled) - channel_cnt += probe->index + 0x1; - } - if (channel_cnt == 0) - return 0x0; - - // --VDBS - switch(ch->vdiv){ - case 5: cmd += 0x247000; break; - case 10: cmd += 0x23D000; break; - case 20: cmd += 0x22F000; break; - case 50: cmd += 0x21C800; break; - case 100: cmd += 0x20E800; break; - case 200: cmd += 0x200800; break; - case 500: cmd += 0x2F000; break; - case 1000: cmd += 0x21100; break; - case 2000: cmd += 0x13000; break; - case 5000: cmd += 0x00800; break; - default: cmd += 0x21100; break; - } - // --DC/AC - if(ch->coupling) - cmd += 0x100000; - - // --Channel -// if(channel_cnt == 1) -// cmd += 0xC00000; -// else if(ch->index == 0) -// cmd += 0x400000; -// else if(ch->index == 1) -// cmd += 0x800000; -// else -// cmd += 0x000000; - if(ch->index == 0) - cmd += 0x400000; - else if(ch->index == 1) - cmd += 0x800000; - else - cmd += 0x000000; - - // --Header - cmd += 0x55000000; - break; - case SR_CONF_SAMPLERATE: - cmd += 0x4; - uint32_t divider = (uint32_t)ceil(SR_MHZ(100) * 1.0 / devc->cur_samplerate - 1); - cmd += divider << 8; - break; - case SR_CONF_HORIZ_TRIGGERPOS: - cmd += 0x8; - cmd += devc->trigger_hpos << 8; - break; - case SR_CONF_TRIGGER_SLOPE: - cmd += 0xc; - cmd += devc->trigger_slope << 8; - break; - case SR_CONF_TRIGGER_SOURCE: - cmd += 0x10; - cmd += devc->trigger_source << 8; - break; - case SR_CONF_TRIGGER_VALUE: - cmd += 0x14; - for (l = sdi->channels; l; l = l->next) { - struct sr_channel *probe = (struct sr_channel *)l->data; - cmd += probe->trig_value << (8 * (probe->index + 1)); - } - break; - case SR_CONF_ZERO: - cmd += 0x18; - break; - case SR_CONF_DSO_SYNC: - cmd = 0xa5a5a500; - break; - default: - cmd = 0x00000000; - } - - return cmd; -} - static int config_set(int id, GVariant *data, struct sr_dev_inst *sdi, struct sr_channel *ch, const struct sr_channel_group *cg ) { - struct dev_context *devc; + struct DSL_context *devc; const char *stropt; int ret, num_probes; struct sr_usb_dev_inst *usb; @@ -1125,11 +1273,25 @@ static int config_set(int id, GVariant *data, struct sr_dev_inst *sdi, if (id == SR_CONF_SAMPLERATE) { devc->cur_samplerate = g_variant_get_uint64(data); if (sdi->mode == LOGIC) { - if (devc->cur_samplerate >= SR_MHZ(200)) { - adjust_probes(sdi, SR_MHZ(1600)/devc->cur_samplerate); - } else { - adjust_probes(sdi, 16); + if (devc->limit_samples > DSLOGIC_MAX_LOGIC_DEPTH) { + if (devc->cur_samplerate > SR_MHZ(25)) { + devc->limit_samples = DSLOGIC_MAX_LOGIC_DEPTH; + } else if (devc->cur_samplerate >= SR_MHZ(20) || + devc->limit_samples >= SR_GB(1)) { + adjust_probes(sdi, 8); + } else { + adjust_probes(sdi, 16); + } } + + if (devc->limit_samples <= DSLOGIC_MAX_LOGIC_DEPTH) { + if (devc->cur_samplerate >= SR_MHZ(200)) { + adjust_probes(sdi, SR_MHZ(1600)/devc->cur_samplerate); + } else { + adjust_probes(sdi, 16); + } + } + ret = SR_OK; } else if(sdi->mode == DSO) { ret = command_dso_ctrl(usb->devhdl, dso_cmd_gen(sdi, 0, SR_CONF_SAMPLERATE)); @@ -1141,7 +1303,24 @@ static int config_set(int id, GVariant *data, struct sr_dev_inst *sdi, } else if (id == SR_CONF_CLOCK_EDGE) { devc->clock_edge = g_variant_get_boolean(data); ret = SR_OK; - } else if (id == SR_CONF_LIMIT_SAMPLES) { + } else if (id == SR_CONF_INSTANT) { + if (sdi->mode == DSO) { + devc->instant = g_variant_get_boolean(data); + int num_probes = 0; + GSList *l; + for (l = sdi->channels; l; l = l->next) { + struct sr_channel *probe = (struct sr_channel *)l->data; + num_probes += probe->enabled; + } + if (num_probes != 0) { + if (devc->instant) + devc->limit_samples = DSLOGIC_INSTANT_DEPTH / num_probes; + else + devc->limit_samples = DSLOGIC_MAX_DSO_DEPTH / num_probes; + } + } + ret = SR_OK; + } else if (id == SR_CONF_LIMIT_SAMPLES) { devc->limit_samples = g_variant_get_uint64(data); ret = SR_OK; } else if (id == SR_CONF_DEVICE_MODE) { @@ -1155,19 +1334,91 @@ static int config_set(int id, GVariant *data, struct sr_dev_inst *sdi, ret = command_dso_ctrl(usb->devhdl, dso_cmd_gen(sdi, NULL, SR_CONF_DSO_SYNC)); if (ret != SR_OK) sr_dbg("%s: DSO configuration sync failed", __func__); - ret = command_dso_ctrl(usb->devhdl, dso_cmd_gen(sdi, sdi->channels->data, SR_CONF_VDIV)); - if (ret == SR_OK) - sr_dbg("%s: Initial setting for DSO mode", __func__); - else - sr_dbg("%s: Initial setting for DSO mode failed", __func__); - devc->cur_samplerate = DS_MAX_DSO_SAMPLERATE / num_probes; - devc->limit_samples = DS_MAX_DSO_DEPTH / num_probes; + devc->cur_samplerate = DSLOGIC_MAX_DSO_SAMPLERATE / num_probes; + devc->limit_samples = DSLOGIC_MAX_DSO_DEPTH / num_probes; } else if (sdi->mode == ANALOG){ num_probes = devc->profile->dev_caps & DEV_CAPS_16BIT ? MAX_ANALOG_PROBES_NUM : 1; } sr_dev_probes_free(sdi); set_probes(sdi, num_probes); sr_dbg("%s: setting mode to %d", __func__, sdi->mode); + if (sdi->mode == DSO) { + GList *l; + for(l = sdi->channels; l; l = l->next) { + struct sr_channel *probe = (struct sr_channel *)l->data; + zero_info.zero_addr = (zero_base_addr + probe->index * sizeof(struct cmd_zero_info)); + if ((ret = command_rd_nvm(usb->devhdl, (unsigned char *)&zero_info, zero_info.zero_addr, sizeof(struct cmd_zero_info))) != SR_OK) { + sr_err("Send Get Zero command failed!"); + } else { + if (zero_info.zero_addr == (zero_base_addr + probe->index * sizeof(struct cmd_zero_info))) { + ret = command_dso_ctrl(usb->devhdl, dso_cmd_gen(sdi, probe, SR_CONF_ZERO_SET)); + if (ret != SR_OK) { + sr_err("Set Zero command failed!"); + return ret; + } + } else { + devc->zero = TRUE; + sr_info("Zero have not been setted!"); + } + } + } + + comb_info.comb_addr = comb_base_addr; + if ((ret = command_rd_nvm(usb->devhdl, (unsigned char *)&comb_info, comb_info.comb_addr, sizeof(struct cmd_comb_info))) != SR_OK) { + sr_err("Send Get Comb Command Failed!"); + } else { + if (comb_info.comb_addr == comb_base_addr) { + ret = command_dso_ctrl(usb->devhdl, dso_cmd_gen(sdi, NULL, SR_CONF_COMB_SET)); + if (ret != SR_OK) { + sr_err("Set Comb command failed!"); + return ret; + } + } else { + devc->zero = TRUE; + sr_info("Comb have not been setted!"); + } + } + + for(l = sdi->channels; l; l = l->next) { + struct sr_channel *probe = (struct sr_channel *)l->data; + ret = command_dso_ctrl(usb->devhdl, dso_cmd_gen(sdi, probe, SR_CONF_COUPLING)); + if (ret != SR_OK) { + sr_err("Set Coupling command failed!"); + return ret; + } + ret = command_dso_ctrl(usb->devhdl, dso_cmd_gen(sdi, probe, SR_CONF_VDIV)); + if (ret != SR_OK) { + sr_dbg("%s: Initial setting for DSO mode failed", __func__); + return ret; + } + } + + ret = command_dso_ctrl(usb->devhdl, dso_cmd_gen(sdi, 0, SR_CONF_SAMPLERATE)); + if (ret != SR_OK) { + sr_err("Set Sample Rate command failed!"); + return ret; + } + ret = command_dso_ctrl(usb->devhdl, dso_cmd_gen(sdi, NULL, SR_CONF_HORIZ_TRIGGERPOS)); + if (ret != SR_OK) { + sr_err("Set Horiz Trigger Position command failed!"); + return ret; + } + ret = command_dso_ctrl(usb->devhdl, dso_cmd_gen(sdi, NULL, SR_CONF_TRIGGER_SLOPE)); + if (ret != SR_OK) { + sr_err("Set Trigger Slope command failed!"); + return ret; + } + ret = command_dso_ctrl(usb->devhdl, dso_cmd_gen(sdi, NULL, SR_CONF_TRIGGER_SOURCE)); + if (ret != SR_OK) { + sr_err("Set Trigger Source command failed!"); + return ret; + } + ret = command_dso_ctrl(usb->devhdl, dso_cmd_gen(sdi, NULL, SR_CONF_TRIGGER_VALUE)); + if (ret != SR_OK) { + sr_err("Set Trigger Value command failed!"); + return ret; + } + } } else if (id == SR_CONF_OPERATION_MODE) { stropt = g_variant_get_string(data, NULL); ret = SR_OK; @@ -1175,10 +1426,16 @@ static int config_set(int id, GVariant *data, struct sr_dev_inst *sdi, devc->op_mode = SR_OP_NORMAL; } else if (!strcmp(stropt, opmodes[SR_OP_INTERNAL_TEST])) { devc->op_mode = SR_OP_INTERNAL_TEST; + devc->limit_samples = DSLOGIC_MAX_LOGIC_DEPTH; + devc->cur_samplerate = DSLOGIC_MAX_LOGIC_SAMPLERATE; } else if (!strcmp(stropt, opmodes[SR_OP_EXTERNAL_TEST])) { devc->op_mode = SR_OP_EXTERNAL_TEST; + devc->limit_samples = DSLOGIC_MAX_LOGIC_DEPTH; + devc->cur_samplerate = DSLOGIC_MAX_LOGIC_SAMPLERATE; } else if (!strcmp(stropt, opmodes[SR_OP_LOOPBACK_TEST])) { devc->op_mode = SR_OP_LOOPBACK_TEST; + devc->limit_samples = DSLOGIC_MAX_LOGIC_DEPTH; + devc->cur_samplerate = DSLOGIC_MAX_LOGIC_SAMPLERATE; } else { ret = SR_ERR; } @@ -1218,6 +1475,15 @@ static int config_set(int id, GVariant *data, struct sr_dev_inst *sdi, } sr_dbg("%s: setting threshold to %d", __func__, devc->th_level); + } else if (id == SR_CONF_VTH) { + devc->vth = g_variant_get_double(data); + ret = command_vth(usb->devhdl, devc->vth); + if (ret == SR_OK) + sr_dbg("%s: setting threshold voltage to %d", + __func__, devc->vth); + else + sr_dbg("%s: setting threshold voltage to %d failed", + __func__, devc->vth); } else if (id == SR_CONF_FILTER) { stropt = g_variant_get_string(data, NULL); ret = SR_OK; @@ -1255,7 +1521,9 @@ static int config_set(int id, GVariant *data, struct sr_dev_inst *sdi, } else if (id == SR_CONF_TIMEBASE) { devc->timebase = g_variant_get_uint64(data); } else if (id == SR_CONF_COUPLING) { - ch->coupling = g_variant_get_boolean(data); + ch->coupling = g_variant_get_byte(data); + if (ch->coupling == SR_GND_COUPLING) + ch->coupling = SR_DC_COUPLING; if (sdi->mode == DSO) { ret = command_dso_ctrl(usb->devhdl, dso_cmd_gen(sdi, ch, SR_CONF_COUPLING)); } @@ -1299,8 +1567,18 @@ static int config_set(int id, GVariant *data, struct sr_dev_inst *sdi, sr_dbg("%s: setting DSO Trigger Value to %d failed", __func__, ch->index, ch->trig_value); } else if (id == SR_CONF_HORIZ_TRIGGERPOS) { - devc->trigger_hpos = g_variant_get_uint16(data) * devc->limit_samples / 100.0f; - if (sdi->mode == DSO) { + if (sdi->mode == DSO) { + uint16_t channel_cnt = 0; + GSList *l; + for (l = sdi->channels; l; l = l->next) { + struct sr_channel *probe = (struct sr_channel *)l->data; + channel_cnt += probe->enabled; + } + devc->trigger_hpos = g_variant_get_uint16(data) * channel_cnt * devc->limit_samples / 200.0f; + } else { + devc->trigger_hpos = g_variant_get_uint16(data) * devc->limit_samples / 100.0f; + } + if (sdi->mode == DSO) { ret = command_dso_ctrl(usb->devhdl, dso_cmd_gen(sdi, 1, SR_CONF_HORIZ_TRIGGERPOS)); } if (ret == SR_OK) @@ -1311,15 +1589,29 @@ static int config_set(int id, GVariant *data, struct sr_dev_inst *sdi, __func__, devc->trigger_hpos); } else if (id == SR_CONF_ZERO) { devc->zero = g_variant_get_boolean(data); - if (sdi->mode == DSO && devc->zero) { - ret = command_dso_ctrl(usb->devhdl, dso_cmd_gen(sdi, 0, SR_CONF_ZERO)); + } else if (id == SR_CONF_ZERO_SET) { + GSList *l; + for(l = sdi->channels; l; l = l->next) { + struct sr_channel *probe = (struct sr_channel *)l->data; + zero_info.zero_addr = zero_base_addr + probe->index * sizeof(struct cmd_zero_info); + zero_info.adc_off = (probe->index == 0) ? mstatus.ch0_adc_off + (mstatus.ch0_adc_sign << 7) : mstatus.ch1_adc_off + (mstatus.ch1_adc_sign << 7); + ret = command_wr_nvm(usb->devhdl, (unsigned char *)&zero_info, sizeof(struct cmd_zero_info)); + if (ret != SR_OK) + sr_err("DSO channel %d Set Zero command failed!", probe->index); } - if (ret == SR_OK) - sr_dbg("%s: DSO zero adjustment", - __func__); + comb_info.comb_addr = comb_base_addr; + comb_info.comb0_low_off = mstatus.comb0_off; + comb_info.comb0_hig_off = mstatus.comb0_off >> 8; + comb_info.comb1_low_off = mstatus.comb1_off; + comb_info.comb1_hig_off = mstatus.comb1_off >> 8; + comb_info.comb_sign = mstatus.comb_sign; + ret = command_wr_nvm(usb->devhdl, (unsigned char *)&comb_info, sizeof(struct cmd_comb_info)); + if (ret != SR_OK) + sr_err("DSO Set Comb command failed!"); else - sr_dbg("%s: DSO zero adjustment failed", - __func__); + devc->zero = FALSE; + } else if (id == SR_CONF_STREAM) { + devc->stream = g_variant_get_boolean(data); } else { ret = SR_ERR_NA; } @@ -1333,7 +1625,7 @@ static int config_list(int key, GVariant **data, const struct sr_dev_inst *sdi, GVariant *gvar; GVariantBuilder gvb; - (void)sdi; + //(void)sdi; (void)cg; switch (key) { @@ -1352,8 +1644,12 @@ static int config_list(int key, GVariant **data, const struct sr_dev_inst *sdi, case SR_CONF_DEVICE_CONFIGS: // *data = g_variant_new_fixed_array(G_VARIANT_TYPE_INT32, // hwcaps, ARRAY_SIZE(hwcaps), sizeof(int32_t)); - *data = g_variant_new_from_data(G_VARIANT_TYPE("ai"), - hwoptions, ARRAY_SIZE(hwoptions)*sizeof(int32_t), TRUE, NULL, NULL); + if (strcmp(sdi->model, "DSLogic Pro") == 0) + *data = g_variant_new_from_data(G_VARIANT_TYPE("ai"), + hwoptions_pro, ARRAY_SIZE(hwoptions_pro)*sizeof(int32_t), TRUE, NULL, NULL); + else + *data = g_variant_new_from_data(G_VARIANT_TYPE("ai"), + hwoptions, ARRAY_SIZE(hwoptions)*sizeof(int32_t), TRUE, NULL, NULL); break; case SR_CONF_SAMPLERATE: g_variant_builder_init(&gvb, G_VARIANT_TYPE("a{sv}")); @@ -1390,14 +1686,15 @@ static int config_list(int key, GVariant **data, const struct sr_dev_inst *sdi, return SR_OK; } -static void abort_acquisition(struct dev_context *devc) +static void abort_acquisition(struct DSL_context *devc) { - int i, ret; - struct sr_usb_dev_inst *usb; + int i; + int ret; + struct sr_usb_dev_inst *usb; devc->num_samples = -1; - sr_info("%s: Stopping", __func__); + sr_info("%s: Stopping", __func__); /* Stop GPIF acquisition */ usb = ((struct sr_dev_inst *)devc->cb_data)->conn; @@ -1406,14 +1703,19 @@ static void abort_acquisition(struct dev_context *devc) else sr_info("Stop DSLogic acquisition!"); + ret = command_dso_ctrl(usb->devhdl, dso_cmd_gen((struct sr_dev_inst *)devc->cb_data, NULL, SR_CONF_ZERO_OVER)); + if (ret != SR_OK) + sr_err("DSO zero over command failed!"); + /* Cancel exist transfers */ - for (i = devc->num_transfers - 1; i >= 0; i--) { - if (devc->transfers[i]) - libusb_cancel_transfer(devc->transfers[i]); - } + if (devc->num_transfers) + for (i = devc->num_transfers - 1; i >= 0; i--) { + if (devc->transfers[i]) + libusb_cancel_transfer(devc->transfers[i]); + } } -static void finish_acquisition(struct dev_context *devc) +static void finish_acquisition(struct DSL_context *devc) { struct sr_datafeed_packet packet; int i, ret; @@ -1429,7 +1731,7 @@ static void finish_acquisition(struct dev_context *devc) for (i = 0; devc->usbfd[i] != -1; i++) sr_source_remove(devc->usbfd[i]); g_free(devc->usbfd); - + if (devc->num_transfers != 0) { devc->num_transfers = 0; g_free(devc->transfers); @@ -1438,7 +1740,7 @@ static void finish_acquisition(struct dev_context *devc) static void free_transfer(struct libusb_transfer *transfer) { - struct dev_context *devc; + struct DSL_context *devc; unsigned int i; devc = transfer->user_data; @@ -1455,44 +1757,19 @@ static void free_transfer(struct libusb_transfer *transfer) } devc->submitted_transfers--; - if (devc->submitted_transfers == 0 && devc->status != DSLOGIC_TRIGGERED) + if (devc->submitted_transfers == 0 && devc->status != DSL_TRIGGERED) finish_acquisition(devc); } -static int receive_data(int fd, int revents, const struct sr_dev_inst *sdi) -{ - static int i = 0; - struct timeval tv; - struct drv_context *drvc; - struct dev_context *devc; - - (void)fd; - (void)revents; - - drvc = di->priv; - devc = sdi->priv; - - if (devc->num_samples != -1 && - (devc->status == DSLOGIC_STOP || devc->status == DSLOGIC_ERROR)) { - sr_info("%s: Stopping", __func__); - abort_acquisition(devc); - } - - tv.tv_sec = tv.tv_usec = 0; - libusb_handle_events_timeout(drvc->sr_ctx->libusb_ctx, &tv); - - return TRUE; -} - static void resubmit_transfer(struct libusb_transfer *transfer) { - int ret; + int ret; - if ((ret = libusb_submit_transfer(transfer)) == LIBUSB_SUCCESS) - return; + if ((ret = libusb_submit_transfer(transfer)) == LIBUSB_SUCCESS) + return; - free_transfer(transfer); - /* TODO: Stop session? */ + free_transfer(transfer); + /* TODO: Stop session? */ sr_err("%s: %s", __func__, libusb_error_name(ret)); } @@ -1500,27 +1777,27 @@ static void resubmit_transfer(struct libusb_transfer *transfer) static void receive_transfer(struct libusb_transfer *transfer) { - gboolean packet_has_error = FALSE; + gboolean packet_has_error = FALSE; struct sr_datafeed_packet packet; struct sr_datafeed_logic logic; struct sr_datafeed_dso dso; struct sr_datafeed_analog analog; - struct dev_context *devc; - int trigger_offset, i, sample_width, cur_sample_count; - int trigger_offset_bytes; - uint8_t *cur_buf; + struct DSL_context *devc; + int trigger_offset, i, sample_width, cur_sample_count; + int trigger_offset_bytes; + uint8_t *cur_buf; //GTimeVal cur_time; //g_get_current_time(&cur_time); //sr_info("receive_transfer: current time %d sec %d usec", cur_time.tv_sec, cur_time.tv_usec); - devc = transfer->user_data; + devc = transfer->user_data; - /* - * If acquisition has already ended, just free any queued up - * transfer that come in. - */ + /* + * If acquisition has already ended, just free any queued up + * transfer that come in. + */ if (devc->num_samples == -1) { free_transfer(transfer); return; @@ -1531,15 +1808,20 @@ static void receive_transfer(struct libusb_transfer *transfer) /* Save incoming transfer before reusing the transfer struct. */ cur_buf = transfer->buffer; - sample_width = devc->cur_samplerate <= SR_MHZ(100) ? 2 : - devc->sample_wide ? 2 : 1; + + GSList *l; + int channel_cnt = 0; + for (l = ((struct sr_dev_inst *)(devc->cb_data))->channels; l; l = l->next) + channel_cnt++; + + sample_width = (channel_cnt > 8) ? 2 : 1; cur_sample_count = transfer->actual_length / sample_width; switch (transfer->status) { case LIBUSB_TRANSFER_NO_DEVICE: //abort_acquisition(devc); free_transfer(transfer); - devc->status = DSLOGIC_ERROR; + devc->status = DSL_ERROR; return; case LIBUSB_TRANSFER_COMPLETED: case LIBUSB_TRANSFER_TIMED_OUT: /* We may have received some data though. */ @@ -1558,7 +1840,7 @@ static void receive_transfer(struct libusb_transfer *transfer) */ //abort_acquisition(devc); free_transfer(transfer); - devc->status = DSLOGIC_ERROR; + devc->status = DSL_ERROR; } else { resubmit_transfer(transfer); } @@ -1636,14 +1918,61 @@ static void receive_transfer(struct libusb_transfer *transfer) logic.data_error = 0; logic.data = cur_buf + trigger_offset_bytes; } else if ((*(struct sr_dev_inst *)(devc->cb_data)).mode == DSO) { - packet.type = SR_DF_DSO; - packet.payload = &dso; - dso.probes = (*(struct sr_dev_inst *)(devc->cb_data)).channels; - dso.num_samples = transfer->actual_length / sample_width; - dso.mq = SR_MQ_VOLTAGE; - dso.unit = SR_UNIT_VOLT; - dso.mqflags = SR_MQFLAG_AC; - dso.data = cur_buf + trigger_offset_bytes; + uint16_t channel_cnt = 0; + uint16_t channel_en_cnt = 0; + GSList *l; + struct sr_dev_inst *sdi = devc->cb_data; + for (l = sdi->channels; l; l = l->next) { + struct sr_channel *probe = (struct sr_channel *)l->data; + channel_cnt ++; + channel_en_cnt += probe->enabled; + } + if (channel_en_cnt == 0) + channel_en_cnt = 1; + + if (!devc->instant) { + const uint32_t mstatus_offset = devc->limit_samples / (channel_cnt/channel_en_cnt); + mstatus.ch0_max = *((const uint8_t*)cur_buf + mstatus_offset*2 + 1*2); + mstatus.ch0_min = *((const uint8_t*)cur_buf + mstatus_offset*2 + 3); + mstatus.ch0_period = *((const uint32_t*)cur_buf + mstatus_offset/2 + 2/2); + mstatus.ch0_pcnt = *((const uint32_t*)cur_buf + mstatus_offset/2 + 4/2); + mstatus.ch1_max = *((const uint8_t*)cur_buf + mstatus_offset*2 + 7*2); + mstatus.ch1_min = *((const uint8_t*)cur_buf + mstatus_offset*2 + 15); + mstatus.ch1_period = *((const uint32_t*)cur_buf + mstatus_offset/2 + 8/2); + mstatus.ch1_pcnt = *((const uint32_t*)cur_buf + mstatus_offset/2 + 10/2); + mstatus.vlen = *((const uint32_t*)cur_buf + mstatus_offset/2 + 16/2) & 0x7fffffff; + mstatus.stream_mode = *((const uint32_t*)cur_buf + mstatus_offset/2 + 16/2) & 0x80000000; + mstatus.sample_divider = *((const uint32_t*)cur_buf + mstatus_offset/2 + 18/2); + mstatus.zeroing = (*((const uint16_t*)cur_buf + mstatus_offset + 128) & 0x8000) != 0; + mstatus.ch0_adc_off = *((const uint8_t*)cur_buf + mstatus_offset*2 + 131*2); + mstatus.ch0_adc_sign = *((const uint8_t*)cur_buf + mstatus_offset*2 + 131*2+1); + mstatus.ch1_adc_off = *((const uint8_t*)cur_buf + mstatus_offset*2 + 135*2); + mstatus.ch1_adc_sign = *((const uint8_t*)cur_buf + mstatus_offset*2 + 135*2+1); + mstatus.comb0_off = *((const uint16_t*)cur_buf + mstatus_offset + 136); + mstatus.comb1_off = *((const uint16_t*)cur_buf + mstatus_offset + 137); + mstatus.comb_sign = *((const uint8_t*)cur_buf + mstatus_offset*2 + 138*2); + } else { + mstatus.vlen = instant_buffer_size; + } + const uint32_t divider = devc->zero ? 0x1 : (uint32_t)ceil(SR_MHZ(100) * 1.0 / devc->cur_samplerate); + if ((mstatus.sample_divider == divider && + mstatus.vlen != 0 && + mstatus.vlen <= (transfer->actual_length - 512) / sample_width) || + devc->instant) { + devc->mstatus_valid = devc->instant ? FALSE : TRUE; + packet.type = SR_DF_DSO; + packet.payload = &dso; + dso.probes = (*(struct sr_dev_inst *)(devc->cb_data)).channels; + //dso.num_samples = (transfer->actual_length - 512) / sample_width; + cur_sample_count = 2 * mstatus.vlen / channel_en_cnt ; + dso.num_samples = cur_sample_count; + dso.mq = SR_MQ_VOLTAGE; + dso.unit = SR_UNIT_VOLT; + dso.mqflags = SR_MQFLAG_AC; + dso.data = cur_buf + trigger_offset_bytes; + } else { + devc->mstatus_valid = FALSE; + } } else { packet.type = SR_DF_ANALOG; packet.payload = &analog; @@ -1674,6 +2003,7 @@ static void receive_transfer(struct libusb_transfer *transfer) } if (cur_sample != test_sample_value) { logic.data_error = 1; + sr_err("exp: %d; act: %d", test_sample_value, cur_sample); break; } test_sample_value++; @@ -1701,12 +2031,12 @@ static void receive_transfer(struct libusb_transfer *transfer) } devc->num_samples += cur_sample_count; - if ((*(struct sr_dev_inst *)(devc->cb_data)).mode == LOGIC && + if (((*(struct sr_dev_inst *)(devc->cb_data)).mode == LOGIC || devc->instant) && devc->limit_samples && (unsigned int)devc->num_samples >= devc->limit_samples) { //abort_acquisition(devc); free_transfer(transfer); - devc->status = DSLOGIC_STOP; + devc->status = DSL_STOP; return; } } else { @@ -1719,7 +2049,7 @@ static void receive_transfer(struct libusb_transfer *transfer) resubmit_transfer(transfer); } -static unsigned int to_bytes_per_ms(struct dev_context *devc) +static unsigned int to_bytes_per_ms(struct DSL_context *devc) { if (devc->cur_samplerate > SR_MHZ(100)) return SR_MHZ(100) / 1000 * (devc->sample_wide ? 2 : 1); @@ -1727,34 +2057,35 @@ static unsigned int to_bytes_per_ms(struct dev_context *devc) return devc->cur_samplerate / 1000 * (devc->sample_wide ? 2 : 1); } -static size_t get_buffer_size(struct dev_context *devc) +static size_t get_buffer_size(struct DSL_context *devc) { size_t s; /* - * The buffer should be large enough to hold 20ms of data and + * The buffer should be large enough to hold 10ms of data and * a multiple of 512. */ - s = 20 * to_bytes_per_ms(devc); + s = single_buffer_time * to_bytes_per_ms(devc); + //s = to_bytes_per_ms(devc->cur_samplerate); return (s + 511) & ~511; } -static unsigned int get_number_of_transfers(struct dev_context *devc) +static unsigned int get_number_of_transfers(struct DSL_context *devc) { - unsigned int n; + unsigned int n; /* Total buffer size should be able to hold about 100ms of data. */ n = 100 * to_bytes_per_ms(devc) / get_buffer_size(devc); if (n > NUM_SIMUL_TRANSFERS) - return NUM_SIMUL_TRANSFERS; + return NUM_SIMUL_TRANSFERS; return n; } -static unsigned int get_timeout(struct dev_context *devc) +static unsigned int get_timeout(struct DSL_context *devc) { - size_t total_size; - unsigned int timeout; + size_t total_size; + unsigned int timeout; total_size = get_buffer_size(devc) * get_number_of_transfers(devc); timeout = total_size / to_bytes_per_ms(devc); @@ -1764,20 +2095,40 @@ static unsigned int get_timeout(struct dev_context *devc) static int dev_transfer_start(const struct sr_dev_inst *sdi) { - struct dev_context *devc; + struct DSL_context *devc; struct sr_usb_dev_inst *usb; struct libusb_transfer *transfer; unsigned int i, timeout, num_transfers; int ret; unsigned char *buf; size_t size; + int dso_buffer_size; devc = sdi->priv; usb = sdi->conn; - timeout = get_timeout(devc); - num_transfers = get_number_of_transfers(devc); + uint16_t channel_en_cnt = 0; + uint16_t channel_cnt = 0; + GSList *l; + for (l = sdi->channels; l; l = l->next) { + struct sr_channel *probe = (struct sr_channel *)l->data; + channel_en_cnt += probe->enabled; + channel_cnt++; + } + if (devc->instant) + dso_buffer_size = instant_buffer_size * channel_cnt; + else + dso_buffer_size = devc->limit_samples * channel_en_cnt + 512; + + if (sdi->mode == DSO) { + timeout = 500; + num_transfers = buffer_cnt; + } else { + timeout = get_timeout(devc); + num_transfers = get_number_of_transfers(devc); + } size = (sdi->mode == ANALOG) ? cons_buffer_size : ((sdi->mode == DSO) ? dso_buffer_size : get_buffer_size(devc)); + devc->submitted_transfers = 0; devc->transfers = g_try_malloc0(sizeof(*devc->transfers) * num_transfers); @@ -1808,14 +2159,39 @@ static int dev_transfer_start(const struct sr_dev_inst *sdi) devc->submitted_transfers++; } - devc->status = DSLOGIC_DATA; + devc->status = DSL_DATA; return SR_OK; } +static int receive_data(int fd, int revents, const struct sr_dev_inst *sdi) +{ + int completed = 0; + struct timeval tv; + struct drv_context *drvc; + struct DSL_context *devc; + + (void)fd; + (void)revents; + + drvc = di->priv; + devc = sdi->priv; + + if (devc->num_samples != -1 && + (devc->status == DSL_STOP || devc->status == DSL_ERROR)) { + sr_info("%s: Stopping", __func__); + abort_acquisition(devc); + } + + tv.tv_sec = tv.tv_usec = 0; + libusb_handle_events_timeout_completed(drvc->sr_ctx->libusb_ctx, &tv, &completed); + + return TRUE; +} + static void receive_trigger_pos(struct libusb_transfer *transfer) { - struct dev_context *devc; + struct DSL_context *devc; struct sr_datafeed_packet packet; struct sr_datafeed_logic logic; struct sr_datafeed_dso dso; @@ -1824,94 +2200,76 @@ static void receive_trigger_pos(struct libusb_transfer *transfer) int ret; devc = transfer->user_data; - sr_info("receive trigger pos handle..."); + sr_info("receive_trigger_pos(): status %d; timeout %d; received %d bytes.", + transfer->status, transfer->timeout, transfer->actual_length); if (devc->num_samples == -1) { free_transfer(transfer); return; } - sr_info("receive_trigger_pos(): status %d; timeout %d; received %d bytes.", - transfer->status, transfer->timeout, transfer->actual_length); - - if (devc->status != DSLOGIC_ERROR) { - trigger_pos = (struct ds_trigger_pos *)transfer->buffer; - switch (transfer->status) { - case LIBUSB_TRANSFER_COMPLETED: + trigger_pos = (struct ds_trigger_pos *)transfer->buffer; + switch (transfer->status) { + case LIBUSB_TRANSFER_COMPLETED: + if (transfer->actual_length == sizeof(struct ds_trigger_pos)) { packet.type = SR_DF_TRIGGER; packet.payload = trigger_pos; sr_session_send(devc->cb_data, &packet); - /*if ((*(struct sr_dev_inst *)(devc->cb_data)).mode == LOGIC) { - packet.type = SR_DF_LOGIC; - packet.payload = &logic; - logic.unitsize = devc->sample_wide ? 2 : 1; - logic.length = sizeof(trigger_pos->first_block); - logic.data_error = 0; - logic.data = trigger_pos->first_block; - devc->num_samples += logic.length / logic.unitsize; - } else if ((*(struct sr_dev_inst *)(devc->cb_data)).mode == DSO){ - packet.type = SR_DF_DSO; - packet.payload = &dso; - dso.probes = (*(struct sr_dev_inst *)(devc->cb_data)).probes; - dso.num_samples = sizeof(trigger_pos->first_block) / (devc->sample_wide ? 2 : 1); - dso.mq = SR_MQ_VOLTAGE; - dso.unit = SR_UNIT_VOLT; - dso.mqflags = SR_MQFLAG_AC; - dso.data = trigger_pos->first_block;; - } else { - packet.type = SR_DF_ANALOG; - packet.payload = &analog; - analog.probes = (*(struct sr_dev_inst *)(devc->cb_data)).probes; - analog.num_samples = sizeof(trigger_pos->first_block) / (devc->sample_wide ? 2 : 1); - analog.mq = SR_MQ_VOLTAGE; - analog.unit = SR_UNIT_VOLT; - analog.mqflags = SR_MQFLAG_AC; - analog.data = trigger_pos->first_block;; - } - - sr_session_send(devc->cb_data, &packet);*/ - - devc->status = DSLOGIC_TRIGGERED; + devc->status = DSL_TRIGGERED; free_transfer(transfer); devc->num_transfers = 0; - break; - default: + devc->empty_transfer_count = 0; + } else { + free_transfer(transfer); + devc->status = DSL_ERROR; + } + break; + case LIBUSB_TRANSFER_TIMED_OUT: + devc->empty_transfer_count++; + if (devc->empty_transfer_count > MAX_EMPTY_TRANSFERS) { + /* + * The FX2 gave up. End the acquisition, the frontend + * will work out that the samplecount is short. + */ //abort_acquisition(devc); free_transfer(transfer); - devc->status = DSLOGIC_ERROR; - break; + devc->status = DSL_ERROR; + } else { + resubmit_transfer(transfer); } + break; + case LIBUSB_TRANSFER_CANCELLED: + resubmit_transfer(transfer); + break; + default: + //abort_acquisition(devc); + free_transfer(transfer); + devc->status = DSL_ERROR; + break; + } -// if (devc->status != DSLOGIC_START) { -// g_free(transfer->buffer); -// transfer->buffer = NULL; -// libusb_free_transfer(transfer); -// } -// if (devc->status == DSLOGIC_STOP) { -// finish_acquisition(devc); -// } - - if (devc->status == DSLOGIC_TRIGGERED) { - if ((ret = dev_transfer_start(devc->cb_data)) != SR_OK) { - sr_err("%s: could not start data transfer" - "(%d)%d", __func__, ret, errno); - } + if (devc->status == DSL_TRIGGERED) { + if ((ret = dev_transfer_start(devc->cb_data)) != SR_OK) { + sr_err("%s: could not start data transfer" + "(%d)%d", __func__, ret, errno); } } } static int dev_acquisition_start(const struct sr_dev_inst *sdi, void *cb_data) { - struct dev_context *devc; + struct DSL_context *devc; struct drv_context *drvc; struct sr_usb_dev_inst *usb; struct libusb_transfer *transfer; struct ds_trigger_pos *trigger_pos; const struct libusb_pollfd **lupfd; + unsigned int i; int ret; + int transferred; + struct sr_datafeed_packet packet; int header_transferred; - unsigned int i; test_init = 1; @@ -1926,7 +2284,7 @@ static int dev_acquisition_start(const struct sr_dev_inst *sdi, void *cb_data) devc->cb_data = sdi; devc->num_samples = 0; devc->empty_transfer_count = 0; - devc->status = DSLOGIC_INIT; + devc->status = DSL_INIT; devc->num_transfers = 0; devc->submitted_transfers = 0; @@ -1946,7 +2304,7 @@ static int dev_acquisition_start(const struct sr_dev_inst *sdi, void *cb_data) } /* Setting FPGA before acquisition start*/ - if ((ret = command_fpga_setting(usb->devhdl, sizeof(struct DSLogic_setting) / sizeof(uint16_t))) != SR_OK) { + if ((ret = command_fpga_setting(usb->devhdl, sizeof(struct DSL_setting) / sizeof(uint16_t))) != SR_OK) { sr_err("Send FPGA setting command failed!"); } else { if ((ret = fpga_setting(sdi)) != SR_OK) { @@ -1955,35 +2313,21 @@ static int dev_acquisition_start(const struct sr_dev_inst *sdi, void *cb_data) return ret; } } + if (sdi->mode == DSO) { - GSList *l; + GList *l; for(l = sdi->channels; l; l = l->next) { struct sr_channel *probe = (struct sr_channel *)l->data; - ret = command_dso_ctrl(usb->devhdl, dso_cmd_gen(sdi, probe, SR_CONF_VDIV)); + ret = command_dso_ctrl(usb->devhdl, dso_cmd_gen(sdi, probe, SR_CONF_COUPLING)); if (ret != SR_OK) { - sr_err("Set VDIV of channel %d command failed!", probe->index); + sr_err("Set Coupling command failed!"); + return ret; + } + ret = command_dso_ctrl(usb->devhdl, dso_cmd_gen(sdi, probe, SR_CONF_VDIV)); + if (ret != SR_OK) { + sr_dbg("%s: Initial setting for DSO mode failed", __func__); return ret; } - } - ret = command_dso_ctrl(usb->devhdl, dso_cmd_gen(sdi, NULL, SR_CONF_HORIZ_TRIGGERPOS)); - if (ret != SR_OK) { - sr_err("Set Horiz Trigger Position command failed!"); - return ret; - } - ret = command_dso_ctrl(usb->devhdl, dso_cmd_gen(sdi, NULL, SR_CONF_TRIGGER_SLOPE)); - if (ret != SR_OK) { - sr_err("Set Trigger Slope command failed!"); - return ret; - } - ret = command_dso_ctrl(usb->devhdl, dso_cmd_gen(sdi, NULL, SR_CONF_TRIGGER_SOURCE)); - if (ret != SR_OK) { - sr_err("Set Trigger Source command failed!"); - return ret; - } - ret = command_dso_ctrl(usb->devhdl, dso_cmd_gen(sdi, NULL, SR_CONF_TRIGGER_VALUE)); - if (ret != SR_OK) { - sr_err("Set Trigger Value command failed!"); - return ret; } } @@ -2007,7 +2351,7 @@ static int dev_acquisition_start(const struct sr_dev_inst *sdi, void *cb_data) } devc->usbfd[i] = -1; free(lupfd); - + /* poll trigger status transfer*/ if (!(trigger_pos = g_try_malloc0(sizeof(struct ds_trigger_pos)))) { sr_err("USB trigger_pos buffer malloc failed."); @@ -2034,7 +2378,8 @@ static int dev_acquisition_start(const struct sr_dev_inst *sdi, void *cb_data) devc->transfers[0] = transfer; devc->submitted_transfers++; - devc->status = DSLOGIC_START; + devc->status = DSL_START; + devc->mstatus_valid = FALSE; /* Send header packet to the session bus. */ //std_session_send_df_header(cb_data, LOG_PREFIX); std_session_send_df_header(sdi, LOG_PREFIX); @@ -2046,10 +2391,10 @@ static int dev_acquisition_stop(struct sr_dev_inst *sdi, void *cb_data) { (void)cb_data; - struct dev_context *devc; + struct DSL_context *devc; devc = sdi->priv; - devc->status = DSLOGIC_STOP; + devc->status = DSL_STOP; sr_info("%s: Stopping", __func__); //abort_acquisition(sdi->priv); @@ -2062,35 +2407,45 @@ static int dev_test(struct sr_dev_inst *sdi) if (sdi) { struct sr_usb_dev_inst *usb; struct version_info vi; - int ret; + int ret = SR_ERR; usb = sdi->conn; ret = command_get_fw_version(usb->devhdl, &vi); - if (ret != SR_OK) { + if (ret != SR_OK) sr_err("Device don't exist!"); - return SR_ERR; - } else { - return SR_OK; - } + + return ret; } else { return SR_ERR; } } -static int dev_status_get(struct sr_dev_inst *sdi, struct sr_status *status) +static int dev_status_get(struct sr_dev_inst *sdi, struct sr_status *status, int begin, int end) { if (sdi) { struct sr_usb_dev_inst *usb; - int ret; + int ret = SR_ERR; + struct DSL_context *devc; + devc = sdi->priv; usb = sdi->conn; - ret = command_get_status(usb->devhdl, status); - if (ret != SR_OK) { - sr_err("Device don't exist!"); - return SR_ERR; + if (sdi->mode == DSO) { + if (devc->mstatus_valid) { + *status = mstatus; + if (devc->zero) + return SR_ERR; + else + return SR_OK; + } } else { - return SR_OK; + if (devc->status == DSL_START) + ret = command_get_status(usb->devhdl, (unsigned char*)status, begin, end); } + + if (ret != SR_OK) + sr_err("Device don't exist!"); + + return ret; } else { return SR_ERR; } diff --git a/libsigrok4DSL/hardware/Makefile.am b/libsigrok4DSL/hardware/Makefile.am index b4d6b38e..1c699ab7 100644 --- a/libsigrok4DSL/hardware/Makefile.am +++ b/libsigrok4DSL/hardware/Makefile.am @@ -21,17 +21,17 @@ SUBDIRS = \ demo \ common \ - DSLogic + DSL -noinst_LTLIBRARIES = libsigrok4DSLogichardware.la +noinst_LTLIBRARIES = libsigrok4DSLhardware.la -libsigrok4DSLogichardware_la_SOURCES = +libsigrok4DSLhardware_la_SOURCES = -libsigrok4DSLogichardware_la_LIBADD = +libsigrok4DSLhardware_la_LIBADD = if HW_DEMO -libsigrok4DSLogichardware_la_LIBADD += demo/libsigrok4DSLogic_hw_demo.la +libsigrok4DSLhardware_la_LIBADD += demo/libsigrok4DSL_hw_demo.la endif -libsigrok4DSLogichardware_la_LIBADD += common/libsigrok4DSLogic_hw_common.la -libsigrok4DSLogichardware_la_LIBADD += DSLogic/libsigrok4DSLogic_hw_dslogic.la +libsigrok4DSLhardware_la_LIBADD += common/libsigrok4DSL_hw_common.la +libsigrok4DSLhardware_la_LIBADD += DSL/libsigrok4DSL_hw_dsl.la diff --git a/libsigrok4DSL/hardware/common/Makefile.am b/libsigrok4DSL/hardware/common/Makefile.am index bac6af02..71e1a03e 100644 --- a/libsigrok4DSL/hardware/common/Makefile.am +++ b/libsigrok4DSL/hardware/common/Makefile.am @@ -20,13 +20,13 @@ # Local lib, this is NOT meant to be installed! -noinst_LTLIBRARIES = libsigrok4DSLogic_hw_common.la +noinst_LTLIBRARIES = libsigrok4DSL_hw_common.la -libsigrok4DSLogic_hw_common_la_SOURCES = \ +libsigrok4DSL_hw_common_la_SOURCES = \ ezusb.c \ usb.c -libsigrok4DSLogic_hw_common_la_CFLAGS = \ +libsigrok4DSL_hw_common_la_CFLAGS = \ -I$(top_srcdir) diff --git a/libsigrok4DSL/hardware/common/ezusb.c b/libsigrok4DSL/hardware/common/ezusb.c index f1889a6f..97d5d63a 100644 --- a/libsigrok4DSL/hardware/common/ezusb.c +++ b/libsigrok4DSL/hardware/common/ezusb.c @@ -21,7 +21,7 @@ * Helper functions for the Cypress EZ-USB / FX2 series chips. */ -#include +//#include #include #include #include @@ -48,7 +48,7 @@ SR_PRIV int ezusb_reset(struct libusb_device_handle *hdl, int set_clear) set_clear ? "on" : "off"); buf[0] = set_clear ? 1 : 0; ret = libusb_control_transfer(hdl, LIBUSB_REQUEST_TYPE_VENDOR, 0xa0, - 0xe600, 0x0000, buf, 1, 100); + 0xe600, 0x0000, buf, 1, 3000); if (ret < 0) sr_err("Unable to send control request: %s.", libusb_error_name(ret)); @@ -78,7 +78,7 @@ SR_PRIV int ezusb_install_firmware(libusb_device_handle *hdl, break; ret = libusb_control_transfer(hdl, LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_ENDPOINT_OUT, 0xa0, offset, - 0x0000, buf, chunksize, 100); + 0x0000, buf, chunksize, 3000); if (ret < 0) { sr_err("Unable to send firmware to device: %s.", libusb_error_name(ret)); diff --git a/libsigrok4DSL/hardware/common/usb.c b/libsigrok4DSL/hardware/common/usb.c index c2db0430..4e1d9afb 100644 --- a/libsigrok4DSL/hardware/common/usb.c +++ b/libsigrok4DSL/hardware/common/usb.c @@ -19,7 +19,7 @@ #include #include -#include +//#include #include "libsigrok.h" #include "libsigrok-internal.h" diff --git a/libsigrok4DSL/hardware/demo/Makefile.am b/libsigrok4DSL/hardware/demo/Makefile.am index 9bb85dd7..41f40eb5 100644 --- a/libsigrok4DSL/hardware/demo/Makefile.am +++ b/libsigrok4DSL/hardware/demo/Makefile.am @@ -20,12 +20,12 @@ if HW_DEMO # Local lib, this is NOT meant to be installed! -noinst_LTLIBRARIES = libsigrok4DSLogic_hw_demo.la +noinst_LTLIBRARIES = libsigrok4DSL_hw_demo.la -libsigrok4DSLogic_hw_demo_la_SOURCES = \ +libsigrok4DSL_hw_demo_la_SOURCES = \ demo.c -libsigrok4DSLogic_hw_demo_la_CFLAGS = \ +libsigrok4DSL_hw_demo_la_CFLAGS = \ -I$(top_srcdir) endif diff --git a/libsigrok4DSL/hardware/demo/demo.c b/libsigrok4DSL/hardware/demo/demo.c index faa786f8..7e19b0aa 100644 --- a/libsigrok4DSL/hardware/demo/demo.c +++ b/libsigrok4DSL/hardware/demo/demo.c @@ -56,6 +56,12 @@ #define CONST_LEN 50 +#define DEMO_MAX_LOGIC_DEPTH SR_MB(1) +#define DEMO_MAX_LOGIC_SAMPLERATE SR_MHZ(100) +#define DEMO_MAX_DSO_DEPTH SR_KB(32) +#define DEMO_MAX_DSO_SAMPLERATE SR_MHZ(200) +#define DEMO_MAX_DSO_PROBES_NUM 2 + /* Supported patterns which we can generate */ enum { PATTERN_SINE = 0, @@ -213,11 +219,11 @@ static GSList *hw_scan(GSList *options) } devc->sdi = sdi; - devc->cur_samplerate = SR_MHZ(100); - devc->limit_samples = SR_MB(1); + devc->cur_samplerate = DEMO_MAX_LOGIC_SAMPLERATE; + devc->limit_samples = DEMO_MAX_LOGIC_DEPTH; devc->limit_msec = 0; devc->sample_generator = PATTERN_SINE; - devc->timebase = 100000; + devc->timebase = 10000; sdi->priv = devc; @@ -329,6 +335,9 @@ static int config_get(int id, GVariant **data, const struct sr_dev_inst *sdi, case SR_CONF_DEVICE_MODE: *data = g_variant_new_int16(sdi->mode); break; + case SR_CONF_TEST: + *data = g_variant_new_boolean(FALSE); + break; case SR_CONF_PATTERN_MODE: *data = g_variant_new_string(pattern_strings[devc->sample_generator]); break; @@ -339,11 +348,23 @@ static int config_get(int id, GVariant **data, const struct sr_dev_inst *sdi, *data = g_variant_new_uint64(devc->timebase); break; case SR_CONF_COUPLING: - *data = g_variant_new_uint64(ch->coupling); + *data = g_variant_new_byte(ch->coupling); break; case SR_CONF_EN_CH: *data = g_variant_new_uint64(ch->enabled); break; + case SR_CONF_MAX_DSO_SAMPLERATE: + *data = g_variant_new_uint64(DEMO_MAX_DSO_SAMPLERATE); + break; + case SR_CONF_MAX_DSO_SAMPLELIMITS: + *data = g_variant_new_uint64(DEMO_MAX_DSO_DEPTH); + break; + case SR_CONF_MAX_LOGIC_SAMPLERATE: + *data = g_variant_new_uint64(DEMO_MAX_LOGIC_SAMPLERATE); + break; + case SR_CONF_MAX_LOGIC_SAMPLELIMITS: + *data = g_variant_new_uint64(DEMO_MAX_LOGIC_DEPTH); + break; default: return SR_ERR_NA; } @@ -397,18 +418,19 @@ static int config_set(int id, GVariant *data, struct sr_dev_inst *sdi, } } else if (sdi->mode == DSO) { sr_dev_probes_free(sdi); - for (i = 0; i < DS_MAX_DSO_PROBES_NUM; i++) { + for (i = 0; i < DEMO_MAX_DSO_PROBES_NUM; i++) { if (!(probe = sr_channel_new(i, SR_CHANNEL_DSO, TRUE, probe_names[i]))) ret = SR_ERR; else { probe->vdiv = 1000; - probe->coupling = FALSE; + probe->coupling = SR_DC_COUPLING; probe->trig_value = 0x80; sdi->channels = g_slist_append(sdi->channels, probe); } } - devc->limit_samples = SR_MB(1); + devc->cur_samplerate = DEMO_MAX_DSO_SAMPLERATE / DEMO_MAX_DSO_PROBES_NUM; + devc->limit_samples = DEMO_MAX_DSO_DEPTH / DEMO_MAX_DSO_PROBES_NUM; } else if (sdi->mode == ANALOG) { sr_dev_probes_free(sdi); for (i = 0; i < DS_MAX_ANALOG_PROBES_NUM; i++) { @@ -456,7 +478,7 @@ static int config_set(int id, GVariant *data, struct sr_dev_inst *sdi, devc->timebase); ret = SR_OK; } else if (id == SR_CONF_COUPLING) { - ch->coupling = g_variant_get_boolean(data); + ch->coupling = g_variant_get_byte(data); sr_dbg("%s: setting AC COUPLING of channel %d to %d", __func__, ch->index, ch->coupling); ret = SR_OK; @@ -535,14 +557,25 @@ static void samples_generator(uint16_t *buf, uint64_t size, struct sr_channel *probe; for (l = sdi->channels; l; l = l->next) { probe = (struct sr_channel *)l->data; - *(buf + i) += ((probe->coupling ? 0x60 : 0x80) + demo_data) << (probe->index * 8); + if (probe->coupling == SR_DC_COUPLING) + *(buf + i) += ((0x40 + demo_data) << (probe->index * 8)); + else if (probe->coupling == SR_AC_COUPLING) + *(buf + i) += ((0x60 + demo_data) << (probe->index * 8)); + else + if (probe->index == 0) { + *(buf + i) &= 0xff00; + *(buf + i) += 0x0080; + }else { + *(buf + i) &= 0x00ff; + *(buf + i) += 0x8000; + } } } break; case PATTERN_SQUARE: for (i = 0; i < size; i++) { if (i%CONST_LEN == 0) { - demo_data = p > 0x7fff ? 0xa0a0 : 0x6060; + demo_data = p > 0x7fff ? 0x4040 : 0x0000; p += CONST_LEN * 10; } *(buf + i) = demo_data; @@ -550,7 +583,18 @@ static void samples_generator(uint16_t *buf, uint64_t size, struct sr_channel *probe; for (l = sdi->channels; l; l = l->next) { probe = (struct sr_channel *)l->data; - *(buf + i) += (probe->coupling ? 0x00 : 0x20) << (probe->index * 8); + if (probe->coupling == SR_DC_COUPLING) + *(buf + i) += (0x40 << (probe->index * 8)); + else if (probe->coupling == SR_AC_COUPLING) + *(buf + i) += (0x60 << (probe->index * 8)); + else + if (probe->index == 0) { + *(buf + i) &= 0xff00; + *(buf + i) += 0x0080; + }else { + *(buf + i) &= 0x00ff; + *(buf + i) += 0x8000; + } } } break; @@ -566,7 +610,18 @@ static void samples_generator(uint16_t *buf, uint64_t size, struct sr_channel *probe; for (l = sdi->channels; l; l = l->next) { probe = (struct sr_channel *)l->data; - *(buf + i) += (probe->coupling ? 0x60 : 0x80) << (probe->index * 8); + if (probe->coupling == SR_DC_COUPLING) + *(buf + i) += (0x40 << (probe->index * 8)); + else if (probe->coupling == SR_AC_COUPLING) + *(buf + i) += (0x60 << (probe->index * 8)); + else + if (probe->index == 0) { + *(buf + i) &= 0xff00; + *(buf + i) += 0x0080; + }else { + *(buf + i) &= 0x00ff; + *(buf + i) += 0x8000; + } } } break; @@ -581,7 +636,18 @@ static void samples_generator(uint16_t *buf, uint64_t size, struct sr_channel *probe; for (l = sdi->channels; l; l = l->next) { probe = (struct sr_channel *)l->data; - *(buf + i) += (probe->coupling ? 0x60 : 0x80) << (probe->index * 8); + if (probe->coupling == SR_DC_COUPLING) + *(buf + i) += (0x40 << (probe->index * 8)); + else if (probe->coupling == SR_AC_COUPLING) + *(buf + i) += (0x60 << (probe->index * 8)); + else + if (probe->index == 0) { + *(buf + i) &= 0xff00; + *(buf + i) += 0x0080; + }else { + *(buf + i) &= 0x00ff; + *(buf + i) += 0x8000; + } } } break; @@ -594,7 +660,18 @@ static void samples_generator(uint16_t *buf, uint64_t size, struct sr_channel *probe; for (l = sdi->channels; l; l = l->next) { probe = (struct sr_channel *)l->data; - *(buf + i) += (probe->coupling ? 0x60 : 0x80) << (probe->index * 8); + if (probe->coupling == SR_DC_COUPLING) + *(buf + i) += (0x40 << (probe->index * 8)); + else if (probe->coupling == SR_AC_COUPLING) + *(buf + i) += (0x60 << (probe->index * 8)); + else + if (probe->index == 0) { + *(buf + i) &= 0xff00; + *(buf + i) += 0x0080; + }else { + *(buf + i) &= 0x00ff; + *(buf + i) += 0x8000; + } } } break; @@ -828,8 +905,10 @@ static int hw_dev_test(struct sr_dev_inst *sdi) return SR_ERR; } -static int hw_dev_status_get(struct sr_dev_inst *sdi, struct sr_status *status) +static int hw_dev_status_get(struct sr_dev_inst *sdi, struct sr_status *status, int begin, int end) { + (void)begin; + (void)end; if (sdi) { struct dev_context *const devc = sdi->priv; status->trig_hit = (devc->trigger_stage == 0); diff --git a/libsigrok4DSL/hwdriver.c b/libsigrok4DSL/hwdriver.c index d42063b7..239827eb 100644 --- a/libsigrok4DSL/hwdriver.c +++ b/libsigrok4DSL/hwdriver.c @@ -91,6 +91,8 @@ static struct sr_config_info sr_config_info_data[] = { "Operation Mode", NULL}, {SR_CONF_THRESHOLD, SR_T_CHAR, "threshold", "Threshold Level", NULL}, + {SR_CONF_VTH, SR_T_FLOAT, "threshold", + "Threshold Level", NULL}, {0, 0, NULL, NULL, NULL}, }; @@ -98,8 +100,9 @@ static struct sr_config_info sr_config_info_data[] = { #ifdef HAVE_LA_DEMO extern SR_PRIV struct sr_dev_driver demo_driver_info; #endif -#ifdef HAVE_LA_DSLOGIC +#ifdef HAVE_DSL_DEVICE extern SR_PRIV struct sr_dev_driver DSLogic_driver_info; +extern SR_PRIV struct sr_dev_driver DSCope_driver_info; #endif /** @endcond */ @@ -107,8 +110,9 @@ static struct sr_dev_driver *drivers_list[] = { #ifdef HAVE_LA_DEMO &demo_driver_info, #endif -#ifdef HAVE_LA_DSLOGIC +#ifdef HAVE_DSL_DEVICE &DSLogic_driver_info, + &DSCope_driver_info, #endif NULL, }; @@ -389,7 +393,8 @@ SR_API const struct sr_config_info *sr_config_info_get(int key) * as an indication that it's not applicable. */ SR_API int sr_status_get(const struct sr_dev_inst *sdi, - struct sr_status *status) + struct sr_status *status, + int begin, int end) { int ret; @@ -398,7 +403,7 @@ SR_API int sr_status_get(const struct sr_dev_inst *sdi, else if (!sdi->driver->dev_status_get) ret = SR_ERR_ARG; else - ret = sdi->driver->dev_status_get(sdi, status); + ret = sdi->driver->dev_status_get(sdi, status, begin, end); return ret; } diff --git a/libsigrok4DSL/input/Makefile.am b/libsigrok4DSL/input/Makefile.am index f878db35..2b539298 100644 --- a/libsigrok4DSL/input/Makefile.am +++ b/libsigrok4DSL/input/Makefile.am @@ -19,14 +19,14 @@ ## # Local lib, this is NOT meant to be installed! -noinst_LTLIBRARIES = libsigrok4DSLogicinput.la +noinst_LTLIBRARIES = libsigrok4DSLinput.la -libsigrok4DSLogicinput_la_SOURCES = \ +libsigrok4DSLinput_la_SOURCES = \ in_binary.c \ in_vcd.c \ in_wav.c \ input.c -libsigrok4DSLogicinput_la_CFLAGS = \ +libsigrok4DSLinput_la_CFLAGS = \ -I$(top_srcdir) diff --git a/libsigrok4DSL/libsigrok-internal.h b/libsigrok4DSL/libsigrok-internal.h index 14cc713f..9c65e4d0 100644 --- a/libsigrok4DSL/libsigrok-internal.h +++ b/libsigrok4DSL/libsigrok-internal.h @@ -20,7 +20,7 @@ #ifndef LIBSIGROK_SIGROK_INTERNAL_H #define LIBSIGROK_SIGROK_INTERNAL_H -#include +//#include #include #include "config.h" /* Needed for HAVE_LIBUSB_1_0 and others. */ #ifdef HAVE_LIBUSB_1_0 diff --git a/libsigrok4DSL/libsigrok.h b/libsigrok4DSL/libsigrok.h index 1b5fd8dd..9d719bfb 100644 --- a/libsigrok4DSL/libsigrok.h +++ b/libsigrok4DSL/libsigrok.h @@ -26,12 +26,13 @@ #include #include -#ifdef _WIN32 -#define WINVER 0x0500 +#ifndef _WIN32 +#include +#else +#define WINVER 0x0501 #define _WIN32_WINNT WINVER #include -#else -#include +#include #endif #ifdef __cplusplus @@ -107,9 +108,6 @@ enum { #define TriggerProbes 16 #define TriggerCountBits 16 -#define DS_MAX_DSO_SAMPLERATE SR_MHZ(200) -#define DS_MAX_DSO_DEPTH SR_KB(32) - #define DS_CONF_DSO_HDIVS 10 #define DS_CONF_DSO_VDIVS 10 @@ -593,8 +591,11 @@ struct sr_channel { char *name; char *trigger; uint64_t vdiv; - gboolean coupling; + double vpos; + uint8_t coupling; uint8_t trig_value; + uint16_t vpos_mid; + uint16_t voff_mid; }; /** Structure for groups of channels that have common properties. */ @@ -620,12 +621,52 @@ struct sr_config_info { char *description; }; +enum { + SR_STATUS_TRIG_BEGIN = 0, + SR_STATUS_TRIG_END = 4, + SR_STATUS_CH0_BEGIN = 5, + SR_STATUS_CH0_END = 14, + SR_STATUS_CH1_BEGIN = 15, + SR_STATUS_CH1_END = 24, + SR_STATUS_ZERO_BEGIN = 128, + SR_STATUS_ZERO_END = 135, +}; + struct sr_status { uint8_t trig_hit; uint8_t captured_cnt3; uint8_t captured_cnt2; uint8_t captured_cnt1; uint8_t captured_cnt0; + + uint8_t ch0_max; + uint8_t ch0_min; + uint32_t ch0_period; + uint32_t ch0_pcnt; + uint8_t ch1_max; + uint8_t ch1_min; + uint32_t ch1_period; + uint32_t ch1_pcnt; + + uint32_t vlen; + gboolean stream_mode; + uint32_t sample_divider; + + gboolean zeroing; + uint16_t ch0_vpos_mid; + uint16_t ch0_voff_mid; + uint16_t ch0_vcntr; + uint16_t ch1_vpos_mid; + uint16_t ch1_voff_mid; + uint16_t ch1_vcntr; + uint8_t ch0_adc_off; + uint8_t ch1_adc_off; + gboolean ch0_adc_sign; + gboolean ch1_adc_sign; + + uint16_t comb0_off; + uint16_t comb1_off; + uint8_t comb_sign; }; enum { @@ -697,6 +738,8 @@ enum { /** */ SR_CONF_DEVICE_MODE, + SR_CONF_INSTANT, + SR_CONF_STATUS, /** The device supports setting a pattern (pattern generator mode). */ SR_CONF_PATTERN_MODE, @@ -729,11 +772,26 @@ enum { SR_CONF_DSO_SYNC, /** Zero */ + SR_CONF_ZERO_SET, + SR_CONF_COMB_SET, SR_CONF_ZERO, + SR_CONF_ZERO_OVER, + + /** Stream */ + SR_CONF_STREAM, + + /** Test */ + SR_CONF_TEST, /** Volts/div for dso channel. */ SR_CONF_VDIV, + /** Vertical position */ + SR_CONF_VPOS, + + /** Vertical offset */ + SR_CONF_VOFF, + /** Coupling for dso channel. */ SR_CONF_COUPLING, @@ -763,6 +821,13 @@ enum { /** Device sample threshold */ SR_CONF_THRESHOLD, + SR_CONF_VTH, + + /** Device capacity **/ + SR_CONF_MAX_DSO_SAMPLERATE, + SR_CONF_MAX_DSO_SAMPLELIMITS, + SR_CONF_MAX_LOGIC_SAMPLERATE, + SR_CONF_MAX_LOGIC_SAMPLELIMITS, /*--- Special stuff -------------------------------------------------*/ @@ -894,6 +959,16 @@ enum { SR_FILTER_1T = 1, }; +/** Coupling. */ +enum { + /** DC */ + SR_DC_COUPLING = 0, + /** AC */ + SR_AC_COUPLING = 1, + /** Ground */ + SR_GND_COUPLING = 2, +}; + extern char config_path[256]; struct sr_dev_mode { @@ -930,7 +1005,8 @@ struct sr_dev_driver { int (*dev_close) (struct sr_dev_inst *sdi); int (*dev_test) (struct sr_dev_inst *sdi); int (*dev_status_get) (struct sr_dev_inst *sdi, - struct sr_status *status); + struct sr_status *status, + int begin, int end); int (*dev_acquisition_start) (const struct sr_dev_inst *sdi, void *cb_data); int (*dev_acquisition_stop) (struct sr_dev_inst *sdi, diff --git a/libsigrok4DSL/libsigrok4DSL.pc.in b/libsigrok4DSL/libsigrok4DSL.pc.in index 42d7a623..d3b653f6 100644 --- a/libsigrok4DSL/libsigrok4DSL.pc.in +++ b/libsigrok4DSL/libsigrok4DSL.pc.in @@ -3,13 +3,13 @@ exec_prefix=@exec_prefix@ libdir=@libdir@ includedir=@includedir@ -Name: libsigrok4DSLogic -Description: Backend library of DSLogic software based on libsigrok +Name: libsigrok4DSL +Description: Backend library of DSView software based on libsigrok URL: http://www.dreamsourcelab.com Requires: glib-2.0 Requires.private: @SR_PKGLIBS@ Version: @VERSION@ -Libs: -L${libdir} -lsigrok4DSLogic +Libs: -L${libdir} -lsigrok4DSL Libs.private: -lm Cflags: -I${includedir} diff --git a/libsigrok4DSL/output/Makefile.am b/libsigrok4DSL/output/Makefile.am index 2bbe59c8..fbc093c3 100644 --- a/libsigrok4DSL/output/Makefile.am +++ b/libsigrok4DSL/output/Makefile.am @@ -20,18 +20,18 @@ SUBDIRS = text # Local lib, this is NOT meant to be installed! -noinst_LTLIBRARIES = libsigrok4DSLogicoutput.la +noinst_LTLIBRARIES = libsigrok4DSLoutput.la -libsigrok4DSLogicoutput_la_SOURCES = \ +libsigrok4DSLoutput_la_SOURCES = \ out_binary.c \ out_vcd.c \ out_csv.c \ out_analog.c \ output.c -libsigrok4DSLogicoutput_la_CFLAGS = \ +libsigrok4DSLoutput_la_CFLAGS = \ -I$(top_srcdir) -libsigrok4DSLogicoutput_la_LIBADD = \ - text/libsigrok4DSLogicoutputtext.la +libsigrok4DSLoutput_la_LIBADD = \ + text/libsigrok4DSLoutputtext.la diff --git a/libsigrok4DSL/output/text/Makefile.am b/libsigrok4DSL/output/text/Makefile.am index a6edae8d..3b5d7c2e 100644 --- a/libsigrok4DSL/output/text/Makefile.am +++ b/libsigrok4DSL/output/text/Makefile.am @@ -19,15 +19,15 @@ ## # Local lib, this is NOT meant to be installed! -noinst_LTLIBRARIES = libsigrok4DSLogicoutputtext.la +noinst_LTLIBRARIES = libsigrok4DSLoutputtext.la -libsigrok4DSLogicoutputtext_la_SOURCES = \ +libsigrok4DSLoutputtext_la_SOURCES = \ text.c \ text.h \ bits.c \ hex.c \ ascii.c -libsigrok4DSLogicoutputtext_la_CFLAGS = \ +libsigrok4DSLoutputtext_la_CFLAGS = \ -I$(top_srcdir) diff --git a/libsigrok4DSL/proto.h b/libsigrok4DSL/proto.h index 6e87d0ef..576c8c7b 100644 --- a/libsigrok4DSL/proto.h +++ b/libsigrok4DSL/proto.h @@ -86,7 +86,7 @@ SR_API int sr_config_list(const struct sr_dev_driver *driver, int key, GVariant **data); SR_API const struct sr_config_info *sr_config_info_get(int key); SR_API const struct sr_config_info *sr_config_info_name_get(const char *optname); -SR_API int sr_status_get(const struct sr_dev_inst *sdi, struct sr_status *status); +SR_API int sr_status_get(const struct sr_dev_inst *sdi, struct sr_status *status, int begin, int end); /*--- session.c -------------------------------------------------------------*/ @@ -177,6 +177,7 @@ SR_API int ds_trigger_stage_set_count(uint16_t stage, uint16_t probes, uint16_t SR_API int ds_trigger_probe_set(uint16_t probe, unsigned char trigger0, unsigned char trigger1); SR_API int ds_trigger_set_stage(uint16_t stages); SR_API int ds_trigger_set_pos(uint16_t position); +SR_API uint16_t ds_trigger_get_pos(); SR_API int ds_trigger_set_en(uint16_t enable); SR_API int ds_trigger_set_mode(uint16_t mode); diff --git a/libsigrok4DSL/session.c b/libsigrok4DSL/session.c index 3a442382..7fb110d9 100644 --- a/libsigrok4DSL/session.c +++ b/libsigrok4DSL/session.c @@ -84,7 +84,7 @@ SR_API struct sr_session *sr_session_new(void) } session->source_timeout = -1; - session->running = FALSE; + session->running = FALSE; session->abort_session = FALSE; // g_mutex_init(&session->stop_mutex); @@ -398,7 +398,8 @@ SR_API int sr_session_run(void) "cannot be run without devices.", __func__); return SR_ERR_BUG; } - session->running = TRUE; + + session->running = TRUE; sr_info("Running..."); @@ -409,7 +410,7 @@ SR_API int sr_session_run(void) session->sources[0].cb(-1, 0, session->sources[0].cb_data); } else { /* Real sources, use g_poll() main loop. */ - while (session->num_sources) + while (session->num_sources) sr_session_iteration(TRUE); } diff --git a/libsigrok4DSL/tests/Makefile.am b/libsigrok4DSL/tests/Makefile.am index 25f9438e..f925a553 100644 --- a/libsigrok4DSL/tests/Makefile.am +++ b/libsigrok4DSL/tests/Makefile.am @@ -35,6 +35,6 @@ check_main_SOURCES = \ check_main_CFLAGS = @check_CFLAGS@ -check_main_LDADD = $(top_builddir)/libsigrok4DSLogic.la @check_LIBS@ +check_main_LDADD = $(top_builddir)/libsigrok4DSL.la @check_LIBS@ endif diff --git a/libsigrok4DSL/trigger.c b/libsigrok4DSL/trigger.c index d8a2aae5..618de2eb 100644 --- a/libsigrok4DSL/trigger.c +++ b/libsigrok4DSL/trigger.c @@ -172,6 +172,16 @@ SR_API int ds_trigger_set_pos(uint16_t position) return SR_OK; } +/** + * get trigger position + * + * @return uint16_t trigger_pos. + */ +SR_API uint16_t ds_trigger_get_pos() +{ + return trigger->trigger_pos; +} + /** * set trigger en *