diff --git a/clients/tde/src/part/Makefile.am b/clients/tde/src/part/Makefile.am index 17387e4..2e4b01a 100644 --- a/clients/tde/src/part/Makefile.am +++ b/clients/tde/src/part/Makefile.am @@ -1 +1 @@ -SUBDIRS = scope commanalyzer fpgaview fpgaprogram sensormonitor adminconsole adminusermgmt serialconsole prototerminal +SUBDIRS = scope logicanalyzer commanalyzer fpgaview fpgaprogram sensormonitor adminconsole adminusermgmt serialconsole prototerminal diff --git a/clients/tde/src/part/commanalyzer/part.cpp b/clients/tde/src/part/commanalyzer/part.cpp index ac95cd1..f73b08e 100644 --- a/clients/tde/src/part/commanalyzer/part.cpp +++ b/clients/tde/src/part/commanalyzer/part.cpp @@ -89,7 +89,7 @@ CommAnalyzerPart::CommAnalyzerPart( TQWidget *parentWidget, const char *widgetNa m_traceWidget->setZoomBoxEnabled(true); m_base->traceZoomWidget->setSizePolicy(TQSizePolicy(TQSizePolicy::MinimumExpanding, TQSizePolicy::MinimumExpanding)); - m_base->traceZoomWidget->setTraceEnabled(0, true, false); + m_base->traceZoomWidget->setTraceEnabled(0, true, TraceWidget::SummaryText); m_base->traceZoomWidget->setTraceName(0, "Trace 1"); m_base->traceZoomWidget->setTraceHorizontalUnits(0, "Hz"); m_base->traceZoomWidget->setTraceVerticalUnits(0, "dBm"); diff --git a/clients/tde/src/part/logicanalyzer/Makefile.am b/clients/tde/src/part/logicanalyzer/Makefile.am new file mode 100644 index 0000000..cc29361 --- /dev/null +++ b/clients/tde/src/part/logicanalyzer/Makefile.am @@ -0,0 +1,12 @@ +INCLUDES = $(all_includes) -I$(top_srcdir)/src -I$(top_srcdir)/src/widgets $(KDE_INCLUDES)/tde +KDE_CXXFLAGS = $(USE_EXCEPTIONS) +METASOURCES = AUTO + +KDE_ICON = libremotelab_logicanalyzer + +#Part +kde_module_LTLIBRARIES = libremotelab_logicanalyzer.la +libremotelab_logicanalyzer_la_LIBADD = ../../widgets/libtracewidget.la ../../widgets/libfloatspinbox.la $(LIB_KFILE) $(LIB_TDEPARTS) $(LIB_TDEUI) $(LIB_QT) +libremotelab_logicanalyzer_la_LDFLAGS = $(all_libraries) $(KDE_PLUGIN) -ltdecore -ltdeui -ltdeio -ltdefx -ltdekrbsocket -ltqtrla +libremotelab_logicanalyzer_la_SOURCES = \ + part.cpp layout.ui diff --git a/clients/tde/src/part/logicanalyzer/Makefile.in b/clients/tde/src/part/logicanalyzer/Makefile.in new file mode 100644 index 0000000..d07efc9 --- /dev/null +++ b/clients/tde/src/part/logicanalyzer/Makefile.in @@ -0,0 +1,908 @@ +# Makefile.in generated by automake 1.11.6 from Makefile.am. +# KDE tags expanded automatically by am_edit - $Revision$ +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +target_triplet = @target@ +subdir = src/part/logicanalyzer +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/admin/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(kde_moduledir)" +LTLIBRARIES = $(kde_module_LTLIBRARIES) +am__DEPENDENCIES_1 = +libremotelab_logicanalyzer_la_DEPENDENCIES = \ + ../../widgets/libtracewidget.la \ + ../../widgets/libfloatspinbox.la $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) +am_libremotelab_logicanalyzer_la_OBJECTS = part.lo +#>- libremotelab_logicanalyzer_la_OBJECTS = \ +#>- $(am_libremotelab_logicanalyzer_la_OBJECTS) +#>+ 4 +libremotelab_logicanalyzer_la_final_OBJECTS = libremotelab_logicanalyzer_la.all_cpp.lo +libremotelab_logicanalyzer_la_nofinal_OBJECTS = part.lo layout.lo +@KDE_USE_FINAL_FALSE@libremotelab_logicanalyzer_la_OBJECTS = $(libremotelab_logicanalyzer_la_nofinal_OBJECTS) +@KDE_USE_FINAL_TRUE@libremotelab_logicanalyzer_la_OBJECTS = $(libremotelab_logicanalyzer_la_final_OBJECTS) +#>- libremotelab_logicanalyzer_la_LINK = $(LIBTOOL) --tag=CXX \ +#>- $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \ +#>- $(AM_CXXFLAGS) $(CXXFLAGS) \ +#>- $(libremotelab_logicanalyzer_la_LDFLAGS) $(LDFLAGS) -o $@ +#>+ 4 +libremotelab_logicanalyzer_la_LINK = $(LIBTOOL) --tag=CXX \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \ + $(AM_CXXFLAGS) $(CXXFLAGS) $(KDE_CXXFLAGS) \ + $(libremotelab_logicanalyzer_la_LDFLAGS) $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/admin/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +#>- CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ +#>- $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +#>+ 2 +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) $(KDE_CXXFLAGS) +#>- LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ +#>- --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ +#>- $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +#>+ 3 +LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) $(KDE_CXXFLAGS) +CXXLD = $(CXX) +#>- CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ +#>- --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ +#>- $(LDFLAGS) -o $@ +#>+ 3 +CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(KDE_CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(libremotelab_logicanalyzer_la_SOURCES) +DIST_SOURCES = $(libremotelab_logicanalyzer_la_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +ETAGS = etags +CTAGS = ctags +#>- DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +#>+ 1 +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) $(KDE_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AR = @AR@ +ARTSCCONFIG = @ARTSCCONFIG@ +AUTOCONF = @AUTOCONF@ +AUTODIRS = @AUTODIRS@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CONF_FILES = @CONF_FILES@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DCOPIDL = @DCOPIDL@ +DCOPIDL2CPP = @DCOPIDL2CPP@ +DCOPIDLNG = @DCOPIDLNG@ +DCOP_DEPENDENCIES = @DCOP_DEPENDENCIES@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DOXYGEN = @DOXYGEN@ +DOXYGEN_PROJECT_NAME = @DOXYGEN_PROJECT_NAME@ +DOXYGEN_PROJECT_NUMBER = @DOXYGEN_PROJECT_NUMBER@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ENABLE_PERMISSIVE_FLAG = @ENABLE_PERMISSIVE_FLAG@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FRAMEWORK_COREAUDIO = @FRAMEWORK_COREAUDIO@ +GMSGFMT = @GMSGFMT@ +GREP = @GREP@ +HAVE_GCC_VISIBILITY = @HAVE_GCC_VISIBILITY@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KCFG_DEPENDENCIES = @KCFG_DEPENDENCIES@ +KCONFIG_COMPILER = @KCONFIG_COMPILER@ +KDECONFIG = @KDECONFIG@ +KDE_CHECK_PLUGIN = @KDE_CHECK_PLUGIN@ +KDE_EXTRA_RPATH = @KDE_EXTRA_RPATH@ +KDE_HAS_DOXYGEN = @KDE_HAS_DOXYGEN@ +KDE_HAVE_DOT = @KDE_HAVE_DOT@ +KDE_INCLUDES = @KDE_INCLUDES@ +KDE_LDFLAGS = @KDE_LDFLAGS@ +KDE_MT_LDFLAGS = @KDE_MT_LDFLAGS@ +KDE_MT_LIBS = @KDE_MT_LIBS@ +KDE_NO_UNDEFINED = @KDE_NO_UNDEFINED@ +KDE_PLUGIN = @KDE_PLUGIN@ +KDE_RPATH = @KDE_RPATH@ +KDE_USE_CLOSURE_FALSE = @KDE_USE_CLOSURE_FALSE@ +KDE_USE_CLOSURE_TRUE = @KDE_USE_CLOSURE_TRUE@ +KDE_USE_FINAL_FALSE = @KDE_USE_FINAL_FALSE@ +KDE_USE_FINAL_TRUE = @KDE_USE_FINAL_TRUE@ +KDE_USE_FPIE = @KDE_USE_FPIE@ +KDE_USE_NMCHECK_FALSE = @KDE_USE_NMCHECK_FALSE@ +KDE_USE_NMCHECK_TRUE = @KDE_USE_NMCHECK_TRUE@ +KDE_USE_PIE = @KDE_USE_PIE@ +KDE_XSL_STYLESHEET = @KDE_XSL_STYLESHEET@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LDFLAGS_AS_NEEDED = @LDFLAGS_AS_NEEDED@ +LDFLAGS_NEW_DTAGS = @LDFLAGS_NEW_DTAGS@ +LIBCOMPAT = @LIBCOMPAT@ +LIBCRYPT = @LIBCRYPT@ +LIBDL = @LIBDL@ +LIBJPEG = @LIBJPEG@ +LIBOBJS = @LIBOBJS@ +LIBPNG = @LIBPNG@ +LIBPTHREAD = @LIBPTHREAD@ +LIBRESOLV = @LIBRESOLV@ +LIBS = @LIBS@ +LIBSM = @LIBSM@ +LIBSOCKET = @LIBSOCKET@ +LIBTOOL = @LIBTOOL@ +LIBTQT_LDFLAGS = @LIBTQT_LDFLAGS@ +LIBUCB = @LIBUCB@ +LIBUTIL = @LIBUTIL@ +LIBZ = @LIBZ@ +LIB_ARTS = @LIB_ARTS@ +LIB_KAB = @LIB_KAB@ +LIB_KDED = @LIB_KDED@ +LIB_KFM = @LIB_KFM@ +LIB_KJS = @LIB_KJS@ +LIB_KNEWSTUFF = @LIB_KNEWSTUFF@ +LIB_POLL = @LIB_POLL@ +LIB_QPE = @LIB_QPE@ +LIB_QT = @LIB_QT@ +LIB_QUI = @LIB_QUI@ +LIB_SMB = @LIB_SMB@ +LIB_TDEABC = @LIB_TDEABC@ +LIB_TDECORE = @LIB_TDECORE@ +LIB_TDEDNSSD = @LIB_TDEDNSSD@ +LIB_TDEFILE = @LIB_TDEFILE@ +LIB_TDEHTML = @LIB_TDEHTML@ +LIB_TDEIMPROXY = @LIB_TDEIMPROXY@ +LIB_TDEIO = @LIB_TDEIO@ +LIB_TDEPARTS = @LIB_TDEPARTS@ +LIB_TDEPIM = @LIB_TDEPIM@ +LIB_TDEPRINT = @LIB_TDEPRINT@ +LIB_TDESPELL = @LIB_TDESPELL@ +LIB_TDESYCOCA = @LIB_TDESYCOCA@ +LIB_TDEUI = @LIB_TDEUI@ +LIB_TDEUNITTEST = @LIB_TDEUNITTEST@ +LIB_TDEUTILS = @LIB_TDEUTILS@ +LIB_X11 = @LIB_X11@ +LIB_XEXT = @LIB_XEXT@ +LIB_XRENDER = @LIB_XRENDER@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MAKETDEWIDGETS = @MAKETDEWIDGETS@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MCOPIDL = @MCOPIDL@ +MEINPROC = @MEINPROC@ +MKDIR_P = @MKDIR_P@ +MOC = @MOC@ +MSGFMT = @MSGFMT@ +NM = @NM@ +NMEDIT = @NMEDIT@ +NOOPT_CFLAGS = @NOOPT_CFLAGS@ +NOOPT_CXXFLAGS = @NOOPT_CXXFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PERL = @PERL@ +PKG_CONFIG = @PKG_CONFIG@ +QTDOCDIR = @QTDOCDIR@ +QTE_NORTTI = @QTE_NORTTI@ +QT_INCLUDES = @QT_INCLUDES@ +QT_LDFLAGS = @QT_LDFLAGS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +TOPSUBDIRS = @TOPSUBDIRS@ +TQTDCOPIDL = @TQTDCOPIDL@ +TQTDCOPIDL2CPP = @TQTDCOPIDL2CPP@ +TQTDCOPIDLNG = @TQTDCOPIDLNG@ +TQTMCOPIDL = @TQTMCOPIDL@ +TQTMOC = @TQTMOC@ +UIC = @UIC@ +UIC_TR = @UIC_TR@ +USER_INCLUDES = @USER_INCLUDES@ +USER_LDFLAGS = @USER_LDFLAGS@ +USE_EXCEPTIONS = @USE_EXCEPTIONS@ +USE_RTTI = @USE_RTTI@ +USE_THREADS = @USE_THREADS@ +VERSION = @VERSION@ +WOVERLOADED_VIRTUAL = @WOVERLOADED_VIRTUAL@ +XGETTEXT = @XGETTEXT@ +XMKMF = @XMKMF@ +XMLLINT = @XMLLINT@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_INCLUDES = @X_INCLUDES@ +X_LDFLAGS = @X_LDFLAGS@ +X_PRE_LIBS = @X_PRE_LIBS@ +X_RPATH = @X_RPATH@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +all_includes = @all_includes@ +all_libraries = @all_libraries@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +kde_appsdir = @kde_appsdir@ +kde_bindir = @kde_bindir@ +kde_confdir = @kde_confdir@ +kde_datadir = @kde_datadir@ +kde_htmldir = @kde_htmldir@ +kde_icondir = @kde_icondir@ +kde_includes = @kde_includes@ +kde_kcfgdir = @kde_kcfgdir@ +kde_libraries = @kde_libraries@ +kde_libs_htmldir = @kde_libs_htmldir@ +kde_libs_prefix = @kde_libs_prefix@ +kde_locale = @kde_locale@ +kde_mimedir = @kde_mimedir@ +kde_moduledir = @kde_moduledir@ +kde_qtver = @kde_qtver@ +kde_servicesdir = @kde_servicesdir@ +kde_servicetypesdir = @kde_servicetypesdir@ +kde_sounddir = @kde_sounddir@ +kde_styledir = @kde_styledir@ +kde_templatesdir = @kde_templatesdir@ +kde_wallpaperdir = @kde_wallpaperdir@ +kde_widgetdir = @kde_widgetdir@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +qt_includes = @qt_includes@ +qt_libraries = @qt_libraries@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +tdeinitdir = @tdeinitdir@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +x_includes = @x_includes@ +x_libraries = @x_libraries@ +xdg_appsdir = @xdg_appsdir@ +xdg_directorydir = @xdg_directorydir@ +xdg_menudir = @xdg_menudir@ +INCLUDES = $(all_includes) -I$(top_srcdir)/src -I$(top_srcdir)/src/widgets $(KDE_INCLUDES)/tde +KDE_CXXFLAGS = $(USE_EXCEPTIONS) +#>- METASOURCES = AUTO +KDE_ICON = libremotelab_logicanalyzer + +#Part +kde_module_LTLIBRARIES = libremotelab_logicanalyzer.la +libremotelab_logicanalyzer_la_LIBADD = ../../widgets/libtracewidget.la ../../widgets/libfloatspinbox.la $(LIB_KFILE) $(LIB_TDEPARTS) $(LIB_TDEUI) $(LIB_QT) +libremotelab_logicanalyzer_la_LDFLAGS = $(all_libraries) $(KDE_PLUGIN) -ltdecore -ltdeui -ltdeio -ltdefx -ltdekrbsocket -ltqtrla +#>- libremotelab_logicanalyzer_la_SOURCES = \ +#>- part.cpp layout.ui +#>+ 2 +libremotelab_logicanalyzer_la_SOURCES=\ + part.cpp layout.cpp + +#>- all: all-am +#>+ 1 +all: docs-am all-am + +.SUFFIXES: +.SUFFIXES: .cpp .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) +#>- @for dep in $?; do \ +#>- case '$(am__configure_deps)' in \ +#>- *$$dep*) \ +#>- ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ +#>- && { if test -f $@; then exit 0; else break; fi; }; \ +#>- exit 1;; \ +#>- esac; \ +#>- done; \ +#>- echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/part/logicanalyzer/Makefile'; \ +#>- $(am__cd) $(top_srcdir) && \ +#>- $(AUTOMAKE) --gnu src/part/logicanalyzer/Makefile +#>+ 12 + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/part/logicanalyzer/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/part/logicanalyzer/Makefile + cd $(top_srcdir) && perl admin/am_edit src/part/logicanalyzer/Makefile.in +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-kde_moduleLTLIBRARIES: $(kde_module_LTLIBRARIES) + @$(NORMAL_INSTALL) + @list='$(kde_module_LTLIBRARIES)'; test -n "$(kde_moduledir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(MKDIR_P) '$(DESTDIR)$(kde_moduledir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(kde_moduledir)" || exit 1; \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(kde_moduledir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(kde_moduledir)"; \ + } + +uninstall-kde_moduleLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(kde_module_LTLIBRARIES)'; test -n "$(kde_moduledir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(kde_moduledir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(kde_moduledir)/$$f"; \ + done + +clean-kde_moduleLTLIBRARIES: + -test -z "$(kde_module_LTLIBRARIES)" || rm -f $(kde_module_LTLIBRARIES) + @list='$(kde_module_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libremotelab_logicanalyzer.la: $(libremotelab_logicanalyzer_la_OBJECTS) $(libremotelab_logicanalyzer_la_DEPENDENCIES) $(EXTRA_libremotelab_logicanalyzer_la_DEPENDENCIES) + $(libremotelab_logicanalyzer_la_LINK) -rpath $(kde_moduledir) $(libremotelab_logicanalyzer_la_OBJECTS) $(libremotelab_logicanalyzer_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/part.Plo@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: + for dir in "$(DESTDIR)$(kde_moduledir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +#>- clean: clean-am +#>+ 1 +clean: kde-rpo-clean clean-am + +#>- clean-am: clean-generic clean-kde_moduleLTLIBRARIES clean-libtool \ +#>- mostlyclean-am +#>+ 2 +clean-am: clean-metasources clean-ui clean-bcheck clean-final clean-generic clean-kde_moduleLTLIBRARIES clean-libtool \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +#>- install-data-am: install-kde_moduleLTLIBRARIES +#>+ 1 +install-data-am: install-kde-icons + +install-dvi: install-dvi-am + +install-dvi-am: + +#>- install-exec-am: +#>+ 1 +install-exec-am: install-kde_moduleLTLIBRARIES + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +#>- uninstall-am: uninstall-kde_moduleLTLIBRARIES +#>+ 1 +uninstall-am: uninstall-kde-icons uninstall-kde_moduleLTLIBRARIES + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-kde_moduleLTLIBRARIES clean-libtool ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am \ + install-kde_moduleLTLIBRARIES install-man install-pdf \ + install-pdf-am install-ps install-ps-am install-strip \ + installcheck installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-kde_moduleLTLIBRARIES + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: + +#>+ 3 +part.moc: $(srcdir)/part.h + $(TQTMOC) $(srcdir)/part.h -o part.moc + +#>+ 2 +mocs: part.moc + +#>+ 3 +clean-metasources: + -rm -f part.moc + +#>+ 2 +KDE_DIST=hi16-action-libremotelab_logicanalyzer.png layout.ui Makefile.am Makefile.in hi64-action-libremotelab_logicanalyzer.png part.h + +#>+ 4 +clean-ui: + -rm -f \ + layout.cpp layout.h layout.moc + +#>+ 2 +docs-am: + +#>+ 10 +install-kde-icons: + $(mkinstalldirs) $(DESTDIR)$(kde_icondir)/hicolor/16x16/actions + $(INSTALL_DATA) $(srcdir)/hi16-action-libremotelab_logicanalyzer.png $(DESTDIR)$(kde_icondir)/hicolor/16x16/actions/libremotelab_logicanalyzer.png + $(mkinstalldirs) $(DESTDIR)$(kde_icondir)/hicolor/64x64/actions + $(INSTALL_DATA) $(srcdir)/hi64-action-libremotelab_logicanalyzer.png $(DESTDIR)$(kde_icondir)/hicolor/64x64/actions/libremotelab_logicanalyzer.png + +uninstall-kde-icons: + -rm -f $(DESTDIR)$(kde_icondir)/hicolor/16x16/actions/libremotelab_logicanalyzer.png + -rm -f $(DESTDIR)$(kde_icondir)/hicolor/64x64/actions/libremotelab_logicanalyzer.png + +#>+ 15 +force-reedit: + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/part/logicanalyzer/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/part/logicanalyzer/Makefile + cd $(top_srcdir) && perl admin/am_edit src/part/logicanalyzer/Makefile.in + + +#>+ 21 +clean-bcheck: + rm -f *.bchecktest.cc *.bchecktest.cc.class a.out + +bcheck: bcheck-am + +bcheck-am: + @for i in ; do \ + if test $(srcdir)/$$i -nt $$i.bchecktest.cc; then \ + echo "int main() {return 0;}" > $$i.bchecktest.cc ; \ + echo "#include \"$$i\"" >> $$i.bchecktest.cc ; \ + echo "$$i"; \ + if ! $(CXXCOMPILE) --dump-class-hierarchy -c $$i.bchecktest.cc; then \ + rm -f $$i.bchecktest.cc; exit 1; \ + fi ; \ + echo "" >> $$i.bchecktest.cc.class; \ + perl $(top_srcdir)/admin/bcheck.pl $$i.bchecktest.cc.class || { rm -f $$i.bchecktest.cc; exit 1; }; \ + rm -f a.out; \ + fi ; \ + done + + +#>+ 11 +libremotelab_logicanalyzer_la.all_cpp.cpp: $(srcdir)/Makefile.in $(srcdir)/part.cpp layout.cpp layout.moc part.moc + @echo 'creating libremotelab_logicanalyzer_la.all_cpp.cpp ...'; \ + rm -f libremotelab_logicanalyzer_la.all_cpp.files libremotelab_logicanalyzer_la.all_cpp.final; \ + echo "#define KDE_USE_FINAL 1" >> libremotelab_logicanalyzer_la.all_cpp.final; \ + for file in part.cpp layout.cpp ; do \ + echo "#include \"$$file\"" >> libremotelab_logicanalyzer_la.all_cpp.files; \ + test ! -f $(srcdir)/$$file || egrep '^#pragma +implementation' $(srcdir)/$$file >> libremotelab_logicanalyzer_la.all_cpp.final; \ + done; \ + cat libremotelab_logicanalyzer_la.all_cpp.final libremotelab_logicanalyzer_la.all_cpp.files > libremotelab_logicanalyzer_la.all_cpp.cpp; \ + rm -f libremotelab_logicanalyzer_la.all_cpp.final libremotelab_logicanalyzer_la.all_cpp.files + +#>+ 3 +clean-final: + -rm -f libremotelab_logicanalyzer_la.all_cpp.cpp + +#>+ 3 +final: + $(MAKE) libremotelab_logicanalyzer_la_OBJECTS="$(libremotelab_logicanalyzer_la_final_OBJECTS)" all-am + +#>+ 3 +final-install: + $(MAKE) libremotelab_logicanalyzer_la_OBJECTS="$(libremotelab_logicanalyzer_la_final_OBJECTS)" install-am + +#>+ 3 +no-final: + $(MAKE) libremotelab_logicanalyzer_la_OBJECTS="$(libremotelab_logicanalyzer_la_nofinal_OBJECTS)" all-am + +#>+ 3 +no-final-install: + $(MAKE) libremotelab_logicanalyzer_la_OBJECTS="$(libremotelab_logicanalyzer_la_nofinal_OBJECTS)" install-am + +#>+ 3 +kde-rpo-clean: + -rm -f *.rpo + +#>+ 6 +nmcheck: +nmcheck-am: nmcheck +$(srcdir)/part.cpp: layout.h +part.lo: part.moc +part.o: part.moc + +#>+ 15 +layout.cpp: $(srcdir)/layout.ui layout.h layout.moc + rm -f layout.cpp + echo '#include ' > layout.cpp + echo '#include ' >> layout.cpp + $(UIC) -tr ${UIC_TR} -i layout.h $(srcdir)/layout.ui > layout.cpp.temp ; ret=$$?; \ + $(PERL) -pe "s,${UIC_TR}( \"\" ),QString::null,g" layout.cpp.temp | $(PERL) -pe "s,${UIC_TR}( \"\"\, \"\" ),QString::null,g" | $(PERL) -pe "s,image([0-9][0-9]*)_data,img\$$1_layout,g" | $(PERL) -pe "s,: TQWizard\(,: KWizard(,g; s,: QWizard\(,: KWizard(,g;" >> layout.cpp ;\ + rm -f layout.cpp.temp ;\ + if test "$$ret" = 0; then echo '#include "layout.moc"' >> layout.cpp; else rm -f layout.cpp ; exit $$ret ; fi + +layout.h: $(srcdir)/layout.ui + rm -rf layout.h; + $(UIC) $(srcdir)/layout.ui | $(PERL) -pi -e "s,public TQWizard,public KWizard,g; s,#include ,#include ,g; s,public QWizard,public KWizard,g; s,#include ,#include ,g" >> layout.h ; +layout.moc: layout.h + $(TQTMOC) layout.h -o layout.moc diff --git a/clients/tde/src/part/logicanalyzer/hi16-action-libremotelab_logicanalyzer.png b/clients/tde/src/part/logicanalyzer/hi16-action-libremotelab_logicanalyzer.png new file mode 100644 index 0000000..61e5f5b Binary files /dev/null and b/clients/tde/src/part/logicanalyzer/hi16-action-libremotelab_logicanalyzer.png differ diff --git a/clients/tde/src/part/logicanalyzer/hi64-action-libremotelab_logicanalyzer.png b/clients/tde/src/part/logicanalyzer/hi64-action-libremotelab_logicanalyzer.png new file mode 100644 index 0000000..bc2774e Binary files /dev/null and b/clients/tde/src/part/logicanalyzer/hi64-action-libremotelab_logicanalyzer.png differ diff --git a/clients/tde/src/part/logicanalyzer/layout.ui b/clients/tde/src/part/logicanalyzer/layout.ui new file mode 100644 index 0000000..9175fa5 --- /dev/null +++ b/clients/tde/src/part/logicanalyzer/layout.ui @@ -0,0 +1,159 @@ + + LogicAnalyzerBase + + + LogicAnalyzerBase + + + + 0 + 0 + 519 + 356 + + + + + unnamed + + + + groupLogicAnalyzer + + + Logic Analyzer + + + + unnamed + + + + groupLogicAnalyzerView + + + Trace Viewer + + + + 7 + 7 + 1 + 1 + + + + + unnamed + + + + splitter1 + + + Vertical + + + + traceScrollWidget + + + + 0 + 0 + + + + AutoOneFit + + + + + + + + groupLogicAnalyzerCaptureControls + + + Capture Controls + + + + + runControlStartButton + + + Run + + + + + runControlStopButton + + + Stop + + + + + traceControlLayoutWidget + + + + + + + groupLogicAnalyzerAcquisitionControls + + + Acquisition Controls + + + + + acqStart + + + Start Acquisition + + + + + acqStop + + + Stop Acquisition + + + + + waveformSave + + + Save Waveforms + + + + + waveformRecall + + + Recall Waveforms + + + + + + + + + + LogicAnalyzerBase.ui.h + + + tracewidget.h + floatspinbox.h + + + + diff --git a/clients/tde/src/part/logicanalyzer/part.cpp b/clients/tde/src/part/logicanalyzer/part.cpp new file mode 100644 index 0000000..6644b34 --- /dev/null +++ b/clients/tde/src/part/logicanalyzer/part.cpp @@ -0,0 +1,1275 @@ +//Author: Timothy Pearson , (C) 2014 +//Copyright: See COPYING file that comes with this distribution + +#include "define.h" +#include "part.h" + +#include //::createAboutData() +#include +#include +#include //::start() +#include +#include +#include +#include +#include //encodeName() +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include //access() +#include +#include + +#include "tracewidget.h" +#include "floatspinbox.h" +#include "layout.h" + +#define NETWORK_COMM_TIMEOUT_MS 15000 + +/* exception handling */ +struct exit_exception { + int c; + exit_exception(int c):c(c) { } +}; + +enum connectionStates { + LogicAnalyzerState_InitialRequest = 0, + LogicAnalyzerState_ResetRequest = 2, + LogicAnalyzerState_HorizontalDivCountRequest = 4, + LogicAnalyzerState_ChannelCountRequest = 8, + LogicAnalyzerState_ChannelNameRequest = 10, + LogicAnalyzerState_ChannelActiveStateRequest = 12, + LogicAnalyzerState_TraceSampleCountRequest = 14, + LogicAnalyzerState_TraceSecondsDivRequest = 16, + LogicAnalyzerState_RunningRequest = 18, + LogicAnalyzerState_TraceRequest = 50, + LogicAnalyzerState_ChannelActiveStateUpdate = 100, + LogicAnalyzerState_TraceVoltsDivUpdate = 102, + LogicAnalyzerState_RunningUpdate = 106, + LogicAnalyzerState_ExternalCommandRequest = 255 +}; + +namespace RemoteLab { + +typedef KParts::GenericFactory Factory; +#define CLIENT_LIBRARY "libremotelab_logicanalyzer" +K_EXPORT_COMPONENT_FACTORY( libremotelab_logicanalyzer, RemoteLab::Factory ) + +LogicAnalyzerPart::LogicAnalyzerPart( TQWidget *parentWidget, const char *widgetName, TQObject *parent, const char *name, const TQStringList& ) + : RemoteInstrumentPart( parent, name ), m_traceWidget(0), m_commHandlerState(-1), m_commHandlerMode(0), m_commHandlerCommandState(0), m_connectionActiveAndValid(false), + m_base(0), stopTraceUpdate(false) +{ + // Initialize important base class variables + m_clientLibraryName = CLIENT_LIBRARY; + + // Initialize mutex + m_instrumentMutex = new TQMutex(false); + + // Initialize kpart + setInstance(Factory::instance()); + setWidget(new TQVBox(parentWidget, widgetName)); + + // Create timers + m_forcedUpdateTimer = new TQTimer(this); + connect(m_forcedUpdateTimer, SIGNAL(timeout()), this, SLOT(mainEventLoop())); + m_updateTimeoutTimer = new TQTimer(this); + connect(m_updateTimeoutTimer, SIGNAL(timeout()), this, SLOT(mainEventLoop())); + + // Initialize data + m_hdivs = 0; + m_vdivs = 0; + for (int traceno=0; traceno<=MAXTRACES; traceno++) { + m_samplesInTrace[traceno] = 0; + m_channelActive[traceno] = false; + m_channelName[traceno] = TQString("Channel %1").arg(traceno); + m_voltsDiv[traceno] = 0; + m_secsDiv[traceno] = 0; + + m_voltsDivSet[traceno] = false; + m_channelActiveSet[traceno] = false; + } + m_runningSet = false; + + // Create widgets + m_base = new LogicAnalyzerBase(widget()); + m_traceControlWidgetGrid = new TQGridLayout(m_base->traceControlLayoutWidget); + m_traceWidget = m_base->traceScrollWidget->traceWidget(); + m_base->traceScrollWidget->setSizePolicy(TQSizePolicy(TQSizePolicy::MinimumExpanding, TQSizePolicy::MinimumExpanding)); + m_base->traceScrollWidget->setHScrollBarMode(TQScrollView::Auto); + m_base->traceScrollWidget->setVScrollBarMode(TQScrollView::Auto); + m_traceWidget->showLeftTraceInfoArea(true); + m_traceWidget->fitLeftTraceInfoArea(true); + m_traceWidget->setLeftTraceInfoAreaFitSpacing(10); + m_traceWidget->setMinimumPixelsPerHorizDiv(30); + m_traceWidget->setNumberOfCursors(2); + m_traceWidget->setCursorColor(0, TQColor(0, 255, 0)); + m_traceWidget->setCursorColor(1, TQColor(0, 255, 0)); + m_traceWidget->setCursorHighlightColor(0, TQColor(192, 255, 192)); + m_traceWidget->setCursorHighlightColor(1, TQColor(192, 255, 192)); + m_traceWidget->setCursorOrientation(0, TQt::Vertical); + m_traceWidget->setCursorOrientation(1, TQt::Vertical); + m_traceWidget->setCursorEnabled(0, true); + m_traceWidget->setCursorEnabled(1, true); + m_traceWidget->setCursorName(0, "Cursor V1"); + m_traceWidget->setCursorName(1, "Cursor V2"); + m_traceWidget->setCursorPosition(0, 25); + m_traceWidget->setCursorPosition(1, 75); + TraceNumberList activeTraces; + for (uint trace=0; trace<1; trace++) { + activeTraces.append(trace); + } + m_traceWidget->setCursorActiveTraceList(0, activeTraces); + m_traceWidget->setCursorActiveTraceList(1, activeTraces); + m_traceWidget->setZoomBoxEnabled(false); + + connect(m_base->acqStart, SIGNAL(clicked()), this, SLOT(startDAQ())); + connect(m_base->acqStop, SIGNAL(clicked()), this, SLOT(stopDAQ())); + connect(m_base->runControlStartButton, SIGNAL(clicked()), this, SLOT(startLogicAnalyzer())); + connect(m_base->runControlStopButton, SIGNAL(clicked()), this, SLOT(stopLogicAnalyzer())); + + connect(m_base->waveformSave, SIGNAL(clicked()), this, SLOT(saveWaveforms())); + connect(m_base->waveformRecall, SIGNAL(clicked()), this, SLOT(recallWaveforms())); + + TQTimer::singleShot(0, this, TQT_SLOT(postInit())); +} + +LogicAnalyzerPart::~LogicAnalyzerPart() { + if (m_instrumentMutex->locked()) { + printf("[WARNING] Exiting when data transfer still in progress!\n\r"); fflush(stdout); + } + + disconnectFromServer(); + delete m_instrumentMutex; +} + +void LogicAnalyzerPart::postInit() { + setUsingFixedSize(false); +} + +bool LogicAnalyzerPart::openURL(const KURL &url) { + int ret; + m_connectionActiveAndValid = false; + ret = connectToServer(url.url()); + processLockouts(); + return (ret != 0); +} + +bool LogicAnalyzerPart::closeURL() { + disconnectFromServer(); + m_url = KURL(); + return true; +} + +void LogicAnalyzerPart::processLockouts() { + // Largest area + if (m_connectionActiveAndValid) { + if ((m_commHandlerMode < 2) && (m_commHandlerState < 2)) { + m_base->setEnabled(false); + } + else { + m_base->setEnabled(true); + } + } + else { + m_base->setEnabled(false); + } + + // Middle area + if (((m_commHandlerMode < 2) && (m_commHandlerState < 50)) || (stopTraceUpdate)) { + m_base->groupLogicAnalyzerCaptureControls->setEnabled(false); + } + else { + m_base->groupLogicAnalyzerCaptureControls->setEnabled(true); + } + + // Least area + if (stopTraceUpdate) { + m_base->acqStop->setEnabled(false); + m_base->acqStart->setEnabled(true); + m_base->waveformSave->setEnabled(true); + m_base->waveformRecall->setEnabled(true); + } + else { + m_base->acqStop->setEnabled(true); + m_base->acqStart->setEnabled(false); + m_base->waveformSave->setEnabled(false); + m_base->waveformRecall->setEnabled(false); + } + if (m_running) { + m_base->runControlStartButton->setEnabled(false); + m_base->runControlStopButton->setEnabled(true); + } + else { + m_base->runControlStartButton->setEnabled(true); + m_base->runControlStopButton->setEnabled(false); + } +} + +void LogicAnalyzerPart::disconnectFromServerCallback() { + m_forcedUpdateTimer->stop(); + m_updateTimeoutTimer->stop(); + m_connectionActiveAndValid = false; +} + +void LogicAnalyzerPart::connectionFinishedCallback() { + connect(m_socket, SIGNAL(readyRead()), m_socket, SLOT(processPendingData())); + m_socket->processPendingData(); + connect(m_socket, SIGNAL(newDataReceived()), this, SLOT(mainEventLoop())); + m_tickerState = 0; + m_commHandlerState = 0; + m_commHandlerMode = 0; + m_socket->setDataTimeout(NETWORK_COMM_TIMEOUT_MS); + m_updateTimeoutTimer->start(NETWORK_COMM_TIMEOUT_MS, TRUE); + processLockouts(); + mainEventLoop(); + return; +} + +void LogicAnalyzerPart::connectionStatusChangedCallback() { + processLockouts(); +} + +void LogicAnalyzerPart::setTickerMessage(TQString message) { + int i; + bool updatesPending = false; + for (i=0; i<=MAXTRACES;i++) { + if (m_channelActiveSet[i]) updatesPending = true; + if (m_voltsDivSet[i]) updatesPending = true; + if (m_runningSet) updatesPending = true; + } + + m_connectionActiveAndValid = true; + TQString tickerChar; + switch (m_tickerState) { + case 0: + tickerChar = "-"; + break; + case 1: + tickerChar = "\\"; + break; + case 2: + tickerChar = "|"; + break; + case 3: + tickerChar = "/"; + break; + } + if (updatesPending) { + setStatusMessage(i18n("Updates pending") + ", " + message + TQString("... %1").arg(tickerChar)); + } + else { + setStatusMessage(message + TQString("... %1").arg(tickerChar)); + } + m_tickerState++; + if (m_tickerState > 3) { + m_tickerState = 0; + } +} + +#define UPDATEDISPLAY_TIMEOUT m_connectionActiveAndValid = false; \ + m_tickerState = 0; \ + m_commHandlerState = LogicAnalyzerState_ResetRequest; \ + m_commHandlerMode = 0; \ + m_socket->clearIncomingData(); \ + setStatusMessage(i18n("Server ping timeout. Please verify the status of your network connection.")); \ + m_updateTimeoutTimer->start(NETWORK_COMM_TIMEOUT_MS, TRUE); \ + m_instrumentMutex->unlock(); \ + return; + +#define COMMUNICATIONS_FAILED m_connectionActiveAndValid = false; \ + m_tickerState = 0; \ + m_commHandlerState = LogicAnalyzerState_ResetRequest; \ + m_commHandlerMode = 0; \ + m_socket->clearIncomingData(); \ + setStatusMessage(i18n("Instrument communication failure. Please verify the status of your network connection.")); \ + m_updateTimeoutTimer->start(NETWORK_COMM_TIMEOUT_MS, TRUE); \ + m_instrumentMutex->unlock(); \ + return; + +#define SET_WATCHDOG_TIMER if (!m_updateTimeoutTimer->isActive()) m_updateTimeoutTimer->start(NETWORK_COMM_TIMEOUT_MS, TRUE); +#define PAT_WATCHDOG_TIMER m_updateTimeoutTimer->stop(); m_updateTimeoutTimer->start(NETWORK_COMM_TIMEOUT_MS, TRUE); + +#define SET_NEXT_STATE(x) if (m_commHandlerMode == 0) { \ + m_commHandlerState = x; \ + } \ + else { \ + m_commHandlerState = LogicAnalyzerState_ExternalCommandRequest; \ + EXEC_NEXT_STATE_IMMEDIATELY \ + } +#define SET_NEXT_STATE_DATA_WAITING(x) m_commHandlerState = x; + +#define EXEC_NEXT_STATE_IMMEDIATELY m_forcedUpdateTimer->start(0, TRUE); + +int getNextActiveChannel(int current, bool* activity, int maxtracenumber) { + int ret = -1; + for (int i=current+1; i<=maxtracenumber; i++) { + if (activity[i]) { + ret = i; + break; + } + } + return ret; +} + +void LogicAnalyzerPart::mainEventLoop() { + TQDataStream ds(m_socket); + ds.setPrintableData(true); + + if (!m_instrumentMutex->tryLock()) { + EXEC_NEXT_STATE_IMMEDIATELY + return; + } + + if (m_socket) { + if ((m_commHandlerMode == 0) || (m_commHandlerMode == 1)) { + if (m_commHandlerState == LogicAnalyzerState_InitialRequest) { + // Request logic analyzer access + ds << TQString("LOGICANALYZER"); + m_socket->writeEndOfFrame(); + + m_commHandlerState = LogicAnalyzerState_InitialRequest+1; + EXEC_NEXT_STATE_IMMEDIATELY + } + else if (m_commHandlerState == LogicAnalyzerState_InitialRequest+1) { + // Get response data + if (m_socket->canReadFrame()) { + PAT_WATCHDOG_TIMER + setTickerMessage(i18n("Connected")); + + // Get command status + TQString result; + ds >> result; + m_socket->clearFrameTail(); + + if (result == "ACK") { + SET_NEXT_STATE(LogicAnalyzerState_ResetRequest) + EXEC_NEXT_STATE_IMMEDIATELY + } + else { + if (stopTraceUpdate == false) { + COMMUNICATIONS_FAILED + } + else { + setTickerMessage(i18n("Data acquisition stopped")); + } + } + } + else { + if (!m_updateTimeoutTimer->isActive()) { + if (stopTraceUpdate == false) { + UPDATEDISPLAY_TIMEOUT + } + else { + setTickerMessage(i18n("Data acquisition stopped")); + } + } + } + } + else if (m_commHandlerState == LogicAnalyzerState_ResetRequest) { + // Reset logicanalyzer + ds << TQString("RESET"); + m_socket->writeEndOfFrame(); + + SET_NEXT_STATE_DATA_WAITING(LogicAnalyzerState_ResetRequest+1) + EXEC_NEXT_STATE_IMMEDIATELY + } + else if (m_commHandlerState == LogicAnalyzerState_ResetRequest+1) { + // Get response data + if (m_socket->canReadFrame()) { + PAT_WATCHDOG_TIMER + setTickerMessage(i18n("Loading [Reset complete]")); + + // Get command status + TQString result; + ds >> result; + m_socket->clearFrameTail(); + + if (result == "ACK") { + SET_NEXT_STATE(LogicAnalyzerState_HorizontalDivCountRequest) + EXEC_NEXT_STATE_IMMEDIATELY + } + else { + if (stopTraceUpdate == false) { + COMMUNICATIONS_FAILED + } + else { + setTickerMessage(i18n("Data acquisition stopped")); + } + } + } + else { + if (!m_updateTimeoutTimer->isActive()) { + if (stopTraceUpdate == false) { + UPDATEDISPLAY_TIMEOUT + } + else { + setTickerMessage(i18n("Data acquisition stopped")); + } + } + } + } + else if (m_commHandlerState == LogicAnalyzerState_HorizontalDivCountRequest) { + // Get number of horizontal divisions, step 1 + ds << TQString("GETHORIZONTALDIVCOUNT"); + m_socket->writeEndOfFrame(); + + SET_NEXT_STATE_DATA_WAITING(LogicAnalyzerState_HorizontalDivCountRequest+1) + EXEC_NEXT_STATE_IMMEDIATELY + } + else if (m_commHandlerState == LogicAnalyzerState_HorizontalDivCountRequest+1) { + // Get response data + if (m_socket->canReadFrame()) { + PAT_WATCHDOG_TIMER + setTickerMessage(i18n("Loading [Received horizontal division count]")); + + // Get number of horizontal divisions, step 2 + TQString result; + ds >> result; + if (result == "ACK") { + ds >> m_hdivs; + } + m_socket->clearFrameTail(); + + if (result == "ACK") { + SET_NEXT_STATE(LogicAnalyzerState_ChannelCountRequest) + EXEC_NEXT_STATE_IMMEDIATELY + } + else { + if (stopTraceUpdate == false) { + COMMUNICATIONS_FAILED + } + else { + setTickerMessage(i18n("Data acquisition stopped")); + } + } + } + else { + if (!m_updateTimeoutTimer->isActive()) { + if (stopTraceUpdate == false) { + UPDATEDISPLAY_TIMEOUT + } + else { + setTickerMessage(i18n("Data acquisition stopped")); + } + } + } + } + else if (m_commHandlerState == LogicAnalyzerState_ChannelCountRequest) { + // Get number of channels, step 1 + ds << TQString("GETNUMBEROFCHANNELS"); + m_socket->writeEndOfFrame(); + + SET_NEXT_STATE_DATA_WAITING(LogicAnalyzerState_ChannelCountRequest+1) + EXEC_NEXT_STATE_IMMEDIATELY + } + else if (m_commHandlerState == LogicAnalyzerState_ChannelCountRequest+1) { + // Get response data + if (m_socket->canReadFrame()) { + PAT_WATCHDOG_TIMER + setTickerMessage(i18n("Loading [Received number of channels]")); + + // Get number of channels, step 2 + TQString result; + ds >> result; + if (result == "ACK") { + ds >> m_maxNumberOfTraces; + if (m_maxNumberOfTraces > MAXTRACES) { + m_maxNumberOfTraces = MAXTRACES; + } + + // Lock the number of vertical divisions to the number of traces + // This provides a useful baseline effect whereby each trace has a dotted zero line + m_vdivs = m_maxNumberOfTraces; + + // Set true/false (0-1) to one division + double voltsDiv = 1.5; + int traceno; + for (traceno=0; tracenosetTraceOffset(i, offset, true); + m_traceWidget->setTraceTextOffset(i, 0.75, true); + offset = offset - step; + } + } + m_socket->clearFrameTail(); + + if (result == "ACK") { + m_currentOpChannel = 1; + SET_NEXT_STATE(LogicAnalyzerState_ChannelNameRequest) + EXEC_NEXT_STATE_IMMEDIATELY + } + else { + if (stopTraceUpdate == false) { + COMMUNICATIONS_FAILED + } + else { + setTickerMessage(i18n("Data acquisition stopped")); + } + } + } + else { + if (!m_updateTimeoutTimer->isActive()) { + if (stopTraceUpdate == false) { + UPDATEDISPLAY_TIMEOUT + } + else { + setTickerMessage(i18n("Data acquisition stopped")); + } + } + } + } + else if (m_commHandlerState == LogicAnalyzerState_ChannelNameRequest) { + // Get channel name, step 1 + ds << TQString("GETCHANNELNAME"); + m_socket->writeEndOfFrame(); + + SET_NEXT_STATE_DATA_WAITING(LogicAnalyzerState_ChannelNameRequest+1) + EXEC_NEXT_STATE_IMMEDIATELY + } + else if (m_commHandlerState == LogicAnalyzerState_ChannelNameRequest+1) { + // Get response data + if (m_socket->canReadFrame()) { + PAT_WATCHDOG_TIMER + setTickerMessage(i18n("Loading [Received channel names]")); + + // Get channel status, step 2 + TQString result; + ds >> result; + if (result == "ACK") { + int traceno; + for (traceno=0; traceno> m_channelName[traceno+1]; + } + } + m_socket->clearFrameTail(); + + if (result == "ACK") { + SET_NEXT_STATE(LogicAnalyzerState_ChannelActiveStateRequest) + EXEC_NEXT_STATE_IMMEDIATELY + } + else { + if (stopTraceUpdate == false) { + COMMUNICATIONS_FAILED + } + else { + setTickerMessage(i18n("Data acquisition stopped")); + } + } + } + else { + if (!m_updateTimeoutTimer->isActive()) { + if (stopTraceUpdate == false) { + UPDATEDISPLAY_TIMEOUT + } + else { + setTickerMessage(i18n("Data acquisition stopped")); + } + } + } + } + else if (m_commHandlerState == LogicAnalyzerState_ChannelActiveStateRequest) { + // Get channel status, step 1 + ds << TQString("GETCHANNELACTIVE"); + m_socket->writeEndOfFrame(); + + SET_NEXT_STATE_DATA_WAITING(LogicAnalyzerState_ChannelActiveStateRequest+1) + EXEC_NEXT_STATE_IMMEDIATELY + } + else if (m_commHandlerState == LogicAnalyzerState_ChannelActiveStateRequest+1) { + // Get response data + if (m_socket->canReadFrame()) { + PAT_WATCHDOG_TIMER + setTickerMessage(i18n("Loading [Received channel activity status]")); + + // Get channel status, step 2 + TQString result; + ds >> result; + if (result == "ACK") { + int traceno; + for (traceno=0; traceno> active; + m_channelActive[traceno+1] = (active != 0); + } + } + m_socket->clearFrameTail(); + + if (result == "ACK") { + SET_NEXT_STATE(LogicAnalyzerState_TraceSampleCountRequest) + EXEC_NEXT_STATE_IMMEDIATELY + } + else { + if (stopTraceUpdate == false) { + COMMUNICATIONS_FAILED + } + else { + setTickerMessage(i18n("Data acquisition stopped")); + } + } + } + else { + if (!m_updateTimeoutTimer->isActive()) { + if (stopTraceUpdate == false) { + UPDATEDISPLAY_TIMEOUT + } + else { + setTickerMessage(i18n("Data acquisition stopped")); + } + } + } + } + else if (m_commHandlerState == LogicAnalyzerState_TraceSampleCountRequest) { + // Get number of samples in trace, step 1 + ds << TQString("GETTRACESAMPLECOUNT"); + m_socket->writeEndOfFrame(); + + SET_NEXT_STATE_DATA_WAITING(LogicAnalyzerState_TraceSampleCountRequest+1) + EXEC_NEXT_STATE_IMMEDIATELY + } + else if (m_commHandlerState == LogicAnalyzerState_TraceSampleCountRequest+1) { + // Get response data + if (m_socket->canReadFrame()) { + PAT_WATCHDOG_TIMER + setTickerMessage(i18n("Loading [Received trace sample count]")); + + // Get number of samples in trace, step 2 + TQString result; + ds >> result; + if (result == "ACK") { + int traceno; + for (traceno=0; traceno> m_samplesInTrace[traceno+1]; + } + } + m_socket->clearFrameTail(); + + if (result == "ACK") { + SET_NEXT_STATE(LogicAnalyzerState_TraceSecondsDivRequest) + EXEC_NEXT_STATE_IMMEDIATELY + } + else { + if (stopTraceUpdate == false) { + COMMUNICATIONS_FAILED + } + else { + setTickerMessage(i18n("Data acquisition stopped")); + } + } + } + else { + if (!m_updateTimeoutTimer->isActive()) { + if (stopTraceUpdate == false) { + UPDATEDISPLAY_TIMEOUT + } + else { + setTickerMessage(i18n("Data acquisition stopped")); + } + } + } + } + else if (m_commHandlerState == LogicAnalyzerState_TraceSecondsDivRequest) { + // Get seconds per division, step 1 + ds << TQString("GETSECONDSSDIV"); + m_socket->writeEndOfFrame(); + + SET_NEXT_STATE_DATA_WAITING(LogicAnalyzerState_TraceSecondsDivRequest+1) + EXEC_NEXT_STATE_IMMEDIATELY + } + else if (m_commHandlerState == LogicAnalyzerState_TraceSecondsDivRequest+1) { + // Get response data + if (m_socket->canReadFrame()) { + PAT_WATCHDOG_TIMER + setTickerMessage(i18n("Loading [Received seconds/div]")); + + // Get seconds per division, step 2 + TQString result; + ds >> result; + if (result == "ACK") { + int traceno; + for (traceno=0; traceno> m_secsDiv[traceno+1]; + } + } + m_socket->clearFrameTail(); + + if (result == "ACK") { + SET_NEXT_STATE(LogicAnalyzerState_RunningRequest) + EXEC_NEXT_STATE_IMMEDIATELY + } + else { + if (stopTraceUpdate == false) { + COMMUNICATIONS_FAILED + } + else { + setTickerMessage(i18n("Data acquisition stopped")); + } + } + } + else { + if (!m_updateTimeoutTimer->isActive()) { + if (stopTraceUpdate == false) { + UPDATEDISPLAY_TIMEOUT + } + else { + setTickerMessage(i18n("Data acquisition stopped")); + } + } + } + } + else if (m_commHandlerState == LogicAnalyzerState_RunningRequest) { + // Get running, step 1 + ds << TQString("GETRUNNING"); + ds << m_currentOpChannel; + m_socket->writeEndOfFrame(); + + SET_NEXT_STATE_DATA_WAITING(LogicAnalyzerState_RunningRequest+1) + EXEC_NEXT_STATE_IMMEDIATELY + } + else if (m_commHandlerState == LogicAnalyzerState_RunningRequest+1) { + // Get response data + if (m_socket->canReadFrame()) { + PAT_WATCHDOG_TIMER + setTickerMessage(i18n("Loading [Received run status]")); + + // Get running, step 2 + TQString result; + ds >> result; + if (result == "ACK") { + TQ_INT16 status; + ds >> status; + m_running = (status != 0); + } + m_socket->clearFrameTail(); + + if (result == "ACK") { + // Update display widget(s) + updateGraticule(); + } + + if (result == "ACK") { + m_currentOpChannel = getNextActiveChannel(0, m_channelActive, m_maxNumberOfTraces); + SET_NEXT_STATE(LogicAnalyzerState_TraceRequest) + EXEC_NEXT_STATE_IMMEDIATELY + } + else { + if (stopTraceUpdate == false) { + COMMUNICATIONS_FAILED + } + else { + setTickerMessage(i18n("Data acquisition stopped")); + } + } + } + else { + if (!m_updateTimeoutTimer->isActive()) { + if (stopTraceUpdate == false) { + UPDATEDISPLAY_TIMEOUT + } + else { + setTickerMessage(i18n("Data acquisition stopped")); + } + } + } + } + else if (m_commHandlerState == LogicAnalyzerState_TraceRequest) { + // Get trace, step 1 + ds << TQString("GETLOGICTRACES"); + ds << m_currentOpChannel; + m_socket->writeEndOfFrame(); + + m_lastChangesRequireFullUpdate = false; + SET_NEXT_STATE_DATA_WAITING(LogicAnalyzerState_TraceRequest+1) + EXEC_NEXT_STATE_IMMEDIATELY + } + else if (m_commHandlerState == LogicAnalyzerState_TraceRequest+1) { + // Get response data + if (m_socket->canReadFrame()) { + PAT_WATCHDOG_TIMER + setTickerMessage(i18n("Running [Received traces]")); + + // Get trace, step 2 + TQString result; + ds >> result; + + if (result == "ACK") { + int traceno; + for (traceno=0; traceno> trace; + ds >> positions; + + // Set trace widgets + m_traceWidget->setSamples(traceno, trace, true); + m_traceWidget->setPositions(traceno, positions, (traceno<(m_maxNumberOfTraces-1))?true:false); + } + } + m_socket->clearFrameTail(); + + // Update display widget(s) + postProcessTrace(); + m_traceWidget->repaint(false); + + if (result == "ACK") { + if ((m_channelActiveSet[m_currentOpChannel] == false) + && (m_voltsDivSet[m_currentOpChannel] == false) + && (m_runningSet == false) + ) { + SET_NEXT_STATE(LogicAnalyzerState_TraceRequest) + } + else { + m_currentOpChannel = getNextActiveChannel(0, m_channelActive, m_maxNumberOfTraces); + SET_NEXT_STATE(LogicAnalyzerState_ChannelActiveStateUpdate) + } + EXEC_NEXT_STATE_IMMEDIATELY + } + else { + if (stopTraceUpdate == false) { + COMMUNICATIONS_FAILED + } + else { + setTickerMessage(i18n("Data acquisition stopped")); + } + } + } + else { + if (!m_updateTimeoutTimer->isActive()) { + if (stopTraceUpdate == false) { + UPDATEDISPLAY_TIMEOUT + } + else { + setTickerMessage(i18n("Data acquisition stopped")); + } + } + } + } + else if (m_commHandlerState == LogicAnalyzerState_ChannelActiveStateUpdate) { + if (m_channelActiveSet[m_currentOpChannel]) { + // Set channel active, step 1 + ds << TQString("SETCHANNELACTIVE"); + ds << m_currentOpChannel; + TQ_INT16 active = (m_channelActive[m_currentOpChannel])?1:0; + ds << active; + m_socket->writeEndOfFrame(); + + m_lastChangesRequireFullUpdate = true; + m_channelActiveSet[m_currentOpChannel] = false; + SET_NEXT_STATE_DATA_WAITING(LogicAnalyzerState_ChannelActiveStateUpdate+1) + } + else { + if (m_currentOpChannel < (m_maxNumberOfTraces-1)) { + m_currentOpChannel++; + SET_NEXT_STATE(LogicAnalyzerState_ChannelActiveStateUpdate) + } + else { + m_currentOpChannel = getNextActiveChannel(0, m_channelActive, m_maxNumberOfTraces); + if (m_lastChangesRequireFullUpdate) { + SET_NEXT_STATE(LogicAnalyzerState_TraceSecondsDivRequest) + } + else { + SET_NEXT_STATE(LogicAnalyzerState_TraceVoltsDivUpdate) + } + } + } + EXEC_NEXT_STATE_IMMEDIATELY + } + else if (m_commHandlerState == LogicAnalyzerState_ChannelActiveStateUpdate+1) { + // Get response data + if (m_socket->canReadFrame()) { + PAT_WATCHDOG_TIMER + setTickerMessage(i18n("Updating [Set channel %1 activity status]").arg(m_currentOpChannel)); + + // Set channel active, step 2 + TQString result; + ds >> result; + m_socket->clearFrameTail(); + + if (result == "ACK") { + m_currentOpChannel = getNextActiveChannel(m_currentOpChannel, m_channelActive, m_maxNumberOfTraces); + if (m_currentOpChannel > 0) { + SET_NEXT_STATE(LogicAnalyzerState_ChannelActiveStateUpdate) + } + else { + m_currentOpChannel = getNextActiveChannel(0, m_channelActive, m_maxNumberOfTraces); + if (m_lastChangesRequireFullUpdate) { + SET_NEXT_STATE(LogicAnalyzerState_TraceSecondsDivRequest) + } + else { + SET_NEXT_STATE(LogicAnalyzerState_TraceVoltsDivUpdate) + } + } + EXEC_NEXT_STATE_IMMEDIATELY + } + else { + if (stopTraceUpdate == false) { + COMMUNICATIONS_FAILED + } + else { + setTickerMessage(i18n("Data acquisition stopped")); + } + } + } + else { + if (!m_updateTimeoutTimer->isActive()) { + if (stopTraceUpdate == false) { + UPDATEDISPLAY_TIMEOUT + } + else { + setTickerMessage(i18n("Data acquisition stopped")); + } + } + } + } + else if (m_commHandlerState == LogicAnalyzerState_TraceVoltsDivUpdate) { + if (m_voltsDivSet[m_currentOpChannel]) { + // Set volts per division, step 1 + ds << TQString("SETVOLTSDIV"); + ds << m_currentOpChannel; + ds << m_voltsDiv[m_currentOpChannel]; + m_socket->writeEndOfFrame(); + + m_voltsDivSet[m_currentOpChannel] = false; + SET_NEXT_STATE_DATA_WAITING(LogicAnalyzerState_TraceVoltsDivUpdate+1) + } + else { + m_currentOpChannel = getNextActiveChannel(m_currentOpChannel, m_channelActive, m_maxNumberOfTraces); + if (m_currentOpChannel > 0) { + SET_NEXT_STATE(LogicAnalyzerState_TraceVoltsDivUpdate) + } + else { + SET_NEXT_STATE(LogicAnalyzerState_RunningUpdate) + } + } + EXEC_NEXT_STATE_IMMEDIATELY + } + else if (m_commHandlerState == LogicAnalyzerState_TraceVoltsDivUpdate+1) { + // Get response data + if (m_socket->canReadFrame()) { + PAT_WATCHDOG_TIMER + setTickerMessage(i18n("Updating [Set volts/div for channel %1]").arg(m_currentOpChannel)); + + // Set volts per division, step 2 + TQString result; + ds >> result; + m_socket->clearFrameTail(); + + if (result == "ACK") { + m_currentOpChannel = getNextActiveChannel(m_currentOpChannel, m_channelActive, m_maxNumberOfTraces); + if (m_currentOpChannel > 0) { + SET_NEXT_STATE(LogicAnalyzerState_TraceVoltsDivUpdate) + } + else { + SET_NEXT_STATE(LogicAnalyzerState_RunningUpdate) + } + EXEC_NEXT_STATE_IMMEDIATELY + } + else { + if (stopTraceUpdate == false) { + COMMUNICATIONS_FAILED + } + else { + setTickerMessage(i18n("Data acquisition stopped")); + } + } + } + else { + if (!m_updateTimeoutTimer->isActive()) { + if (stopTraceUpdate == false) { + UPDATEDISPLAY_TIMEOUT + } + else { + setTickerMessage(i18n("Data acquisition stopped")); + } + } + } + } + else if (m_commHandlerState == LogicAnalyzerState_RunningUpdate) { + if (m_runningSet) { + // Set running, step 1 + ds << TQString("SETRUNNING"); + TQ_INT16 running = (m_running)?1:0; + ds << running; + m_socket->writeEndOfFrame(); + + m_runningSet = false; + SET_NEXT_STATE_DATA_WAITING(LogicAnalyzerState_RunningUpdate+1) + } + else { + m_currentOpChannel = getNextActiveChannel(0, m_channelActive, m_maxNumberOfTraces); + SET_NEXT_STATE(LogicAnalyzerState_TraceRequest) + } + EXEC_NEXT_STATE_IMMEDIATELY + } + else if (m_commHandlerState == LogicAnalyzerState_RunningUpdate+1) { + // Get response data + if (m_socket->canReadFrame()) { + PAT_WATCHDOG_TIMER + setTickerMessage(i18n("Updating [Set run status]")); + + // Set running, step 2 + TQString result; + ds >> result; + m_socket->clearFrameTail(); + + if (result == "ACK") { + m_currentOpChannel = getNextActiveChannel(0, m_channelActive, m_maxNumberOfTraces); + SET_NEXT_STATE(LogicAnalyzerState_TraceRequest) + EXEC_NEXT_STATE_IMMEDIATELY + } + else { + if (stopTraceUpdate == false) { + COMMUNICATIONS_FAILED + } + else { + setTickerMessage(i18n("Data acquisition stopped")); + } + } + } + else { + if (!m_updateTimeoutTimer->isActive()) { + if (stopTraceUpdate == false) { + UPDATEDISPLAY_TIMEOUT + } + else { + setTickerMessage(i18n("Data acquisition stopped")); + } + } + } + } + else if (m_commHandlerState == LogicAnalyzerState_ExternalCommandRequest) { + // Execute pending command + m_commHandlerMode = 2; + m_socket->clearIncomingData(); + EXEC_NEXT_STATE_IMMEDIATELY + } + SET_WATCHDOG_TIMER + } + else if (m_commHandlerMode == 2) { + if (m_commHandlerCommandState == 0) { + m_commHandlerMode = 0; + m_commHandlerState = LogicAnalyzerState_ChannelActiveStateRequest; + EXEC_NEXT_STATE_IMMEDIATELY + } + else if (m_commHandlerCommandState == 1) { + // Set channel active + ds << TQString("SETCHANNELACTIVE"); + ds << m_nextOpChannel; + ds << m_nextOpParameter16; + m_socket->writeEndOfFrame(); + + m_commHandlerCommandState = 2; + EXEC_NEXT_STATE_IMMEDIATELY + } + else if (m_commHandlerCommandState == 2) { + // Get response data + if (m_socket->canReadFrame()) { + PAT_WATCHDOG_TIMER + setTickerMessage(i18n("Connected")); + + // Set channel active, step 2 + TQString result; + ds >> result; + m_socket->clearFrameTail(); + + if (result == "ACK") { + m_commHandlerCommandState = 0; + EXEC_NEXT_STATE_IMMEDIATELY + } + else { + if (stopTraceUpdate == false) { + COMMUNICATIONS_FAILED + } + else { + setTickerMessage(i18n("Data acquisition stopped")); + } + } + } + else { + if (!m_updateTimeoutTimer->isActive()) { + if (stopTraceUpdate == false) { + UPDATEDISPLAY_TIMEOUT + } + else { + setTickerMessage(i18n("Data acquisition stopped")); + } + } + } + } + else if (m_commHandlerCommandState == 3) { + if (stopTraceUpdate == false) { + m_commHandlerCommandState = 0; + EXEC_NEXT_STATE_IMMEDIATELY + } + else { + setTickerMessage(i18n("Data acquisition stopped")); + } + } + } + } + else { + m_commHandlerState = LogicAnalyzerState_ResetRequest; + m_commHandlerCommandState = 0; + } + + processLockouts(); + + m_instrumentMutex->unlock(); +} + +void LogicAnalyzerPart::postProcessTrace() { + return; +} + +void LogicAnalyzerPart::startDAQ() { + stopTraceUpdate = false; + if (m_socket) m_socket->clearIncomingData(); + EXEC_NEXT_STATE_IMMEDIATELY +} + +void LogicAnalyzerPart::stopDAQ() { + if (m_commHandlerMode < 2) { + stopTraceUpdate = true; + for (int i=0; i<=MAXTRACES;i++) { + m_channelActiveSet[i] = false; + m_voltsDivSet[i] = false; + } + m_runningSet = false; + m_commHandlerMode = 1; + m_commHandlerCommandState = 3; + mainEventLoop(); + } +} + +#define WAVEFORM_MAGIC_NUMBER 1 +#define WAVEFORM_FILE_VERSION 1 + +void LogicAnalyzerPart::saveWaveforms() { + TQString saveFileName = KFileDialog::getSaveFileName(TQString::null, "*.wfm|Waveform Files (*.wfm)", 0, i18n("Save waveforms...")); + if (saveFileName != "") { + TQFile file(saveFileName); + file.open(IO_WriteOnly); + TQDataStream ds(&file); + TQ_INT32 magicNumber = WAVEFORM_MAGIC_NUMBER; + TQ_INT32 version = WAVEFORM_FILE_VERSION; + ds << magicNumber; + ds << version; + ds << m_hdivs; + ds << m_vdivs; + ds << m_maxNumberOfTraces; + for (int traceno=1; traceno<=m_maxNumberOfTraces; traceno++) { + TQ_UINT8 boolValue; + boolValue = m_channelActive[traceno]; + ds << boolValue; + ds << m_samplesInTrace[traceno]; + ds << m_voltsDiv[traceno]; + ds << m_secsDiv[traceno]; + ds << m_traceWidget->samples(traceno-1); + ds << m_traceWidget->positions(traceno-1); + } + for (int cursorno=0; cursorno<5; cursorno++) { + ds << m_traceWidget->cursorPosition(cursorno); + } + } +} + +void LogicAnalyzerPart::recallWaveforms() { + TQString openFileName = KFileDialog::getOpenFileName(TQString::null, "*.wfm|Waveform Files (*.wfm)", 0, i18n("Open waveforms...")); + if (openFileName != "") { + TQFile file(openFileName); + file.open(IO_ReadOnly); + TQDataStream ds(&file); + TQ_INT32 magicNumber; + TQ_INT32 version; + ds >> magicNumber; + if (magicNumber == WAVEFORM_MAGIC_NUMBER) { + ds >> version; + if (version == WAVEFORM_FILE_VERSION) { + ds >> m_hdivs; + ds >> m_vdivs; + ds >> m_maxNumberOfTraces; + for (int traceno=1; traceno<=m_maxNumberOfTraces; traceno++) { + TQ_UINT8 boolValue; + ds >> boolValue; + m_channelActive[traceno] = (boolValue!=0)?true:false; + ds >> m_samplesInTrace[traceno]; + ds >> m_voltsDiv[traceno]; + ds >> m_secsDiv[traceno]; + double offset; + TQDoubleArray values; + TQDoubleArray positions; + ds >> offset; + ds >> values; + ds >> positions; + m_traceWidget->setSamples(traceno-1, values); + m_traceWidget->setPositions(traceno-1, positions); + m_traceWidget->setTraceOffset(traceno-1, offset); + } + for (int cursorno=0; cursorno<5; cursorno++) { + double cursorPos; + ds >> cursorPos; + m_traceWidget->setCursorPosition(cursorno, cursorPos); + } + updateGraticule(); + postProcessTrace(); + m_traceWidget->repaint(false); + } + else { + KMessageBox::error(0, i18n("The selected waveform file version does not match this client"), i18n("Invalid File")); + } + } + else { + KMessageBox::error(0, i18n("Invalid waveform file selected"), i18n("Invalid File")); + } + } +} + +void LogicAnalyzerPart::updateGraticule() { + m_traceWidget->setNumberOfHorizontalDivisions(m_hdivs); + m_traceWidget->setNumberOfVerticalDivisions(m_vdivs); + + for (int traceno=1; traceno<=m_maxNumberOfTraces; traceno++) { + m_traceWidget->setTraceEnabled(traceno-1, m_channelActive[traceno], TraceWidget::NoText, true); + m_traceWidget->setTraceName(traceno-1, m_channelName[traceno], true); + m_traceWidget->setTraceHorizontalUnits(traceno-1, "s", true); + m_traceWidget->setTraceVerticalUnits(traceno-1, "", true); + + m_traceWidget->setNumberOfSamples(traceno-1, m_samplesInTrace[traceno], true); + + m_traceWidget->setDisplayLimits(traceno-1, TQRectF(0.0, (m_voltsDiv[traceno]*m_vdivs)/2.0, (m_secsDiv[traceno]*m_hdivs), (m_voltsDiv[traceno]*m_vdivs)/-2.0), (traceno, (C) 2014 +//Copyright: See COPYING file that comes with this distribution + +#ifndef REMOTELAB_LOGICANALYZERPART_H +#define REMOTELAB_LOGICANALYZERPART_H + +#include +#include +#include +#include + +#include + +#define MAXTRACES 255 + +class TDEAboutData; +using KParts::StatusBarExtension; +class TraceWidget; +class TQSocket; +class TQTimer; +class TQMutex; +class TQRectF; +class TQGridLayout; +class TQCheckBox; +class TQGroupBox; +class LogicAnalyzerBase; + +namespace RemoteLab +{ + class LogicAnalyzerPart : public KParts::RemoteInstrumentPart + { + Q_OBJECT + + public: + LogicAnalyzerPart( QWidget *, const char *, TQObject *, const char *, const TQStringList&); + ~LogicAnalyzerPart(); + + virtual bool openFile() { return false; } // pure virtual in the base class + virtual bool closeURL(); + static TDEAboutData *createAboutData(); + + public slots: + virtual bool openURL(const KURL &url); + + private slots: + void postInit(); + void processLockouts(); + void updateGraticule(); + void connectionFinishedCallback(); + void disconnectFromServerCallback(); + void connectionStatusChangedCallback(); + void setTickerMessage(TQString message); + void mainEventLoop(); + void startDAQ(); + void stopDAQ(); + void startLogicAnalyzer(); + void stopLogicAnalyzer(); + void saveWaveforms(); + void recallWaveforms(); + virtual void postProcessTrace(); + + private: + TraceWidget* m_traceWidget; + TQGridLayout* m_traceControlWidgetGrid; + int m_commHandlerState; + int m_commHandlerMode; + int m_commHandlerCommandState; + TQTimer* m_forcedUpdateTimer; + TQTimer* m_updateTimeoutTimer; + bool m_connectionActiveAndValid; + unsigned char m_tickerState; + TQ_INT16 m_maxNumberOfTraces; + TQ_INT32 m_currentOpChannel; + TQ_INT32 m_nextOpChannel; + TQ_INT16 m_nextOpParameter16; + TQ_INT16 m_hdivs; + TQ_INT16 m_vdivs; + bool m_running; + TQ_INT32 m_samplesInTrace[MAXTRACES+1]; + bool m_channelActive[MAXTRACES+1]; + TQString m_channelName[MAXTRACES+1]; + double m_voltsDiv[MAXTRACES+1]; + double m_secsDiv[MAXTRACES+1]; + bool m_runningSet; + bool m_voltsDivSet[MAXTRACES+1]; + bool m_channelActiveSet[MAXTRACES+1]; + bool m_lastChangesRequireFullUpdate; + LogicAnalyzerBase* m_base; + TQMutex* m_instrumentMutex; + bool stopTraceUpdate; + }; +} + +#endif diff --git a/clients/tde/src/part/scope/part.cpp b/clients/tde/src/part/scope/part.cpp index 94990b4..48d7211 100644 --- a/clients/tde/src/part/scope/part.cpp +++ b/clients/tde/src/part/scope/part.cpp @@ -681,7 +681,7 @@ void ScopePart::mainEventLoop() { m_socket->clearFrameTail(); if (result == "ACK") { - if (m_currentOpChannel < m_maxNumberOfTraces) { + if (m_currentOpChannel < (m_maxNumberOfTraces-1)) { m_currentOpChannel++; SET_NEXT_STATE(ScopeState_ChannelActiveStateRequest) } @@ -799,7 +799,7 @@ void ScopePart::mainEventLoop() { m_socket->clearFrameTail(); if (result == "ACK") { - if (m_currentOpChannel < m_maxNumberOfTraces) { + if (m_currentOpChannel < (m_maxNumberOfTraces-1)) { m_currentOpChannel++; SET_NEXT_STATE(ScopeState_TracePermittedVoltsDivRequest) } @@ -1178,7 +1178,7 @@ void ScopePart::mainEventLoop() { SET_NEXT_STATE_DATA_WAITING(ScopeState_ChannelActiveStateUpdate+1) } else { - if (m_currentOpChannel < m_maxNumberOfTraces) { + if (m_currentOpChannel < (m_maxNumberOfTraces-1)) { m_currentOpChannel++; SET_NEXT_STATE(ScopeState_ChannelActiveStateUpdate) } @@ -1646,20 +1646,20 @@ void ScopePart::updateGraticule() { if (m_maxNumberOfTraces > 3) m_base->traceZoomWidget->setTraceColor(3, TQColor(128, 128, 255)); for (int traceno=1; traceno<=m_maxNumberOfTraces; traceno++) { - m_traceWidget->setTraceEnabled(traceno-1, m_channelActive[traceno]); - m_traceWidget->setTraceName(traceno-1, TQString("Channel %1").arg(traceno)); - m_traceWidget->setTraceHorizontalUnits(traceno-1, "s"); - m_traceWidget->setTraceVerticalUnits(traceno-1, "V"); + m_traceWidget->setTraceEnabled(traceno-1, m_channelActive[traceno], TraceWidget::FullText, true); + m_traceWidget->setTraceName(traceno-1, TQString("Channel %1").arg(traceno), true); + m_traceWidget->setTraceHorizontalUnits(traceno-1, "s", true); + m_traceWidget->setTraceVerticalUnits(traceno-1, "V", true); - m_base->traceZoomWidget->setTraceEnabled(traceno-1, m_channelActive[traceno], false); - m_base->traceZoomWidget->setTraceName(traceno-1, TQString("Channel %1").arg(traceno)); - m_base->traceZoomWidget->setTraceHorizontalUnits(traceno-1, "s"); - m_base->traceZoomWidget->setTraceVerticalUnits(traceno-1, "V"); + m_base->traceZoomWidget->setTraceEnabled(traceno-1, m_channelActive[traceno], TraceWidget::SummaryText, true); + m_base->traceZoomWidget->setTraceName(traceno-1, TQString("Channel %1").arg(traceno), true); + m_base->traceZoomWidget->setTraceHorizontalUnits(traceno-1, "s", true); + m_base->traceZoomWidget->setTraceVerticalUnits(traceno-1, "V", true); - m_traceWidget->setNumberOfSamples(traceno-1, m_samplesInTrace[traceno]); - m_base->traceZoomWidget->setNumberOfSamples(traceno-1, m_samplesInTrace[traceno]); + m_traceWidget->setNumberOfSamples(traceno-1, m_samplesInTrace[traceno], true); + m_base->traceZoomWidget->setNumberOfSamples(traceno-1, m_samplesInTrace[traceno], (tracenosetDisplayLimits(traceno-1, TQRectF(0.0, (m_voltsDiv[traceno]*m_vdivs)/2.0, (m_secsDiv[traceno]*m_hdivs), (m_voltsDiv[traceno]*m_vdivs)/-2.0)); + m_traceWidget->setDisplayLimits(traceno-1, TQRectF(0.0, (m_voltsDiv[traceno]*m_vdivs)/2.0, (m_secsDiv[traceno]*m_hdivs), (m_voltsDiv[traceno]*m_vdivs)/-2.0), (tracenosetSelectedVoltsPerDiv(m_voltsDiv[traceno]); m_traceControlWidgetList[traceno-1]->setTraceEnabled(m_channelActive[traceno]); diff --git a/clients/tde/src/part/sensormonitor/part.cpp b/clients/tde/src/part/sensormonitor/part.cpp index 61d7b94..abee954 100644 --- a/clients/tde/src/part/sensormonitor/part.cpp +++ b/clients/tde/src/part/sensormonitor/part.cpp @@ -696,7 +696,7 @@ void SensorMonitorPart::updateGraticule() { m_traceWidget->setTraceHorizontalUnits(traceno, "s"); m_traceWidget->setTraceVerticalUnits(traceno, m_sensorList[traceno].units); - m_base->traceZoomWidget->setTraceEnabled(traceno, m_channelActive[traceno], false); + m_base->traceZoomWidget->setTraceEnabled(traceno, m_channelActive[traceno], TraceWidget::SummaryText); m_base->traceZoomWidget->setTraceName(traceno, i18n("Sensor %1").arg(m_sensorList[traceno].name)); m_base->traceZoomWidget->setTraceHorizontalUnits(traceno, "s"); m_base->traceZoomWidget->setTraceVerticalUnits(traceno, m_sensorList[traceno].units); diff --git a/clients/tde/src/widgets/tracewidget.cpp b/clients/tde/src/widgets/tracewidget.cpp index 6f11ffc..04a2a00 100644 --- a/clients/tde/src/widgets/tracewidget.cpp +++ b/clients/tde/src/widgets/tracewidget.cpp @@ -205,7 +205,7 @@ void TraceLabelLayout::setGeometry(const TQRect &rect) { int font_vertical_offset = font_height/2; int graticule_height = m_traceWidget->m_graticuleWidget->height(); - int y = (((currentTrace->offset-currentTrace->topEdge)/(currentTrace->bottomEdge-currentTrace->topEdge))*(graticule_height))-font_vertical_offset; + int y = ((((currentTrace->offset+currentTrace->textOffset)-currentTrace->topEdge)/(currentTrace->bottomEdge-currentTrace->topEdge))*(graticule_height))-font_vertical_offset; if (m_traceWidget->m_showLeftTraceInfoArea) { if ((y < 0) || ((y+font_height) > graticule_height)) { currentTrace->leftLabel->hide(); @@ -228,6 +228,7 @@ void TraceLabelLayout::invalidate() { TQSize TraceLabelLayout::sizeHint() const { + TQSize size; if (!m_traceWidget->m_showLeftTraceInfoArea) { return TQSize(0, 0); } @@ -239,11 +240,19 @@ TQSize TraceLabelLayout::sizeHint() const ++it; s = s.expandedTo(item->sizeHint()); } - return s + TQSize(spacing(), spacing()); + size = s + TQSize(spacing(), spacing()); + + if (m_traceWidget->m_leftTraceInfoLabelsFit && list.getFirst()) { + return TQSize(size.width(), ((list.getFirst()->sizeHint().height() + m_traceWidget->m_leftTraceInfoAreaFitSpacing) * list.count())); + } + else { + return size; + } } TQSize TraceLabelLayout::minimumSize() const { + TQSize minSize; if (!m_traceWidget->m_showLeftTraceInfoArea) { return TQSize(0, 0); } @@ -255,7 +264,14 @@ TQSize TraceLabelLayout::minimumSize() const ++it; s = s.expandedTo(item->minimumSize()); } - return s + TQSize(spacing(), spacing()); + minSize = s + TQSize(spacing(), spacing()); + + if (m_traceWidget->m_leftTraceInfoLabelsFit && list.getFirst()) { + return TQSize(minSize.width(), ((list.getFirst()->minimumSize().height()+ m_traceWidget->m_leftTraceInfoAreaFitSpacing) * list.count())); + } + else { + return minSize; + } } TraceData::TraceData(TraceWidget* parent, TQWidget* labelParent) : TQObject(), parentWidget(parent) { @@ -264,6 +280,7 @@ TraceData::TraceData(TraceWidget* parent, TQWidget* labelParent) : TQObject(), p leftEdgeIndex = -1; rightEdgeIndex = -1; offset = 0.0; + textOffset = 0.0; leftEdge = 0; rightEdge = 0; topEdge = 0; @@ -286,7 +303,7 @@ TraceData::TraceData(TraceWidget* parent, TQWidget* labelParent) : TQObject(), p leftLabel = new TQLabel(labelParent); leftLabel->setPaletteBackgroundColor(labelParent->paletteBackgroundColor()); leftLabel->setPaletteForegroundColor(color); - leftLabel->setAlignment(TQt::AlignHCenter|TQt::AlignVCenter|TQt::SingleLine); + leftLabel->setAlignment(TQt::AlignLeft|TQt::AlignVCenter|TQt::SingleLine); font = leftLabel->font(); font.setPointSize(font.pointSize()-1); leftLabel->setFont(font); @@ -421,7 +438,7 @@ void TraceData::drawTrace(TQPainter* p, int graticule_width, int graticule_heigh int font_height = p->fontMetrics().boundingRect("→").height(); x = 0; - y = (((offset-topEdge)/(bottomEdge-topEdge))*(graticule_height))+(font_height/2)-(font_vertical_offset/2); + y = ((((offset+textOffset)-topEdge)/(bottomEdge-topEdge))*(graticule_height))+(font_height/2)-(font_vertical_offset/2); if (y > graticule_height) { font_height = p->fontMetrics().boundingRect("↓").height(); y = graticule_height-font_vertical_offset; @@ -1047,7 +1064,10 @@ TraceWidget::TraceWidget(TQWidget* parent, const char* name) : TQWidget(parent, m_zoomCursorStartIndex(0), m_zoomBoxEnabled(false), m_useAbsoluteHorizontalRange(true), - m_showLeftTraceInfoArea(false) { + m_showLeftTraceInfoArea(false), + m_leftTraceInfoLabelsFit(false), + m_leftTraceInfoAreaFitSpacing(0), + m_minimumPixelsPerHorizDiv(0) { setBackgroundMode(NoBackground); setSizePolicy(TQSizePolicy(TQSizePolicy::MinimumExpanding, TQSizePolicy::MinimumExpanding)); @@ -1115,17 +1135,28 @@ void TraceWidget::setBackgroundColor(const TQColor color) { } } -void TraceWidget::setNumberOfSamples(uint traceNumber, unsigned int samples) { +void TraceWidget::setNumberOfSamples(uint traceNumber, unsigned int samples, bool deferUpdate) { VERIFY_TRACE_ARRAY_SIZE + int i; + int prev_samples = m_traceArray[traceNumber]->sampleArray.count(); + m_traceArray[traceNumber]->numberOfSamples = samples; m_traceArray[traceNumber]->sampleArray.resize(samples); m_traceArray[traceNumber]->positionArray.resize(samples); m_traceArray[traceNumber]->leftEdgeIndex = -1; m_traceArray[traceNumber]->rightEdgeIndex = -1; - m_graticuleWidget->updateGraticule(); - updateTraceText(); + // Zero the uninitialized portion of the data arrays to avoid ugly drawing artifacts on resize + for (i=prev_samples; isampleArray[i] = 0; + m_traceArray[traceNumber]->positionArray[i] = 0; + } + + if (!deferUpdate) { + m_graticuleWidget->updateGraticule(); + updateTraceText(); + } } void TraceWidget::setNumberOfHorizontalDivisions(unsigned int divisions) { @@ -1142,7 +1173,7 @@ void TraceWidget::setNumberOfVerticalDivisions(unsigned int divisions) { updateCursorText(); } -void TraceWidget::setDisplayLimits(uint traceNumber, TQRectF limits) { +void TraceWidget::setDisplayLimits(uint traceNumber, TQRectF limits, bool deferUpdate) { VERIFY_TRACE_ARRAY_SIZE m_traceArray[traceNumber]->leftEdge = limits.x(); @@ -1152,10 +1183,12 @@ void TraceWidget::setDisplayLimits(uint traceNumber, TQRectF limits) { m_traceArray[traceNumber]->leftEdgeIndex = -1; m_traceArray[traceNumber]->rightEdgeIndex = -1; - m_graticuleWidget->updateGraticule(); - m_graticuleWidget->repaint(false); - updateTraceText(); - updateCursorText(); + if (!deferUpdate) { + m_graticuleWidget->updateGraticule(); + m_graticuleWidget->repaint(false); + updateTraceText(); + updateCursorText(); + } } TQRectF TraceWidget::displayLimits(uint traceNumber) { @@ -1266,13 +1299,15 @@ TQDoubleArray& TraceWidget::samples(uint traceNumber) { return m_traceArray[traceNumber]->sampleArray; } -void TraceWidget::setSamples(uint traceNumber, TQDoubleArray& tqda) { +void TraceWidget::setSamples(uint traceNumber, TQDoubleArray& tqda, bool deferUpdate) { VERIFY_TRACE_ARRAY_SIZE m_traceArray[traceNumber]->sampleArray = tqda; m_traceArray[traceNumber]->numberOfSamples = tqda.size(); - m_graticuleWidget->repaint(false); + if (!deferUpdate) { + m_graticuleWidget->repaint(false); + } } TQDoubleArray& TraceWidget::positions(uint traceNumber) { @@ -1281,7 +1316,7 @@ TQDoubleArray& TraceWidget::positions(uint traceNumber) { return m_traceArray[traceNumber]->positionArray; } -void TraceWidget::setPositions(uint traceNumber, TQDoubleArray& tqda) { +void TraceWidget::setPositions(uint traceNumber, TQDoubleArray& tqda, bool deferUpdate) { VERIFY_TRACE_ARRAY_SIZE m_traceArray[traceNumber]->positionArray = tqda; @@ -1289,7 +1324,9 @@ void TraceWidget::setPositions(uint traceNumber, TQDoubleArray& tqda) { m_traceArray[traceNumber]->leftEdgeIndex = -1; m_traceArray[traceNumber]->rightEdgeIndex = -1; - m_graticuleWidget->repaint(false); + if (!deferUpdate) { + m_graticuleWidget->repaint(false); + } } TQColor TraceWidget::traceColor(uint traceNumber) { @@ -1314,12 +1351,12 @@ bool TraceWidget::traceEnabled(uint traceNumber) { return m_traceArray[traceNumber]->enabled; } -void TraceWidget::setTraceEnabled(uint traceNumber, bool enabled, bool showText) { +void TraceWidget::setTraceEnabled(uint traceNumber, bool enabled, TextDisplayType showText, bool deferUpdate) { VERIFY_TRACE_ARRAY_SIZE m_traceArray[traceNumber]->enabled = enabled; if (enabled) { - if (showText) { + if (showText == FullText) { m_traceArray[traceNumber]->paramLabel->show(); m_traceArray[traceNumber]->leftLabel->show(); m_traceArray[traceNumber]->graphStatusLabel->show(); @@ -1333,7 +1370,12 @@ void TraceWidget::setTraceEnabled(uint traceNumber, bool enabled, bool showText) m_traceArray[traceNumber]->paramLabel->hide(); m_traceArray[traceNumber]->leftLabel->hide(); m_traceArray[traceNumber]->graphStatusLabel->hide(); - m_traceArray[traceNumber]->graphStatusLabelInner->show(); + if (showText == SummaryText) { + m_traceArray[traceNumber]->graphStatusLabelInner->show(); + } + else { + m_traceArray[traceNumber]->graphStatusLabelInner->hide(); + } m_traceArray[traceNumber]->singleIncrBtn->hide(); m_traceArray[traceNumber]->singleDecrBtn->hide(); m_traceArray[traceNumber]->posResetBtn->hide(); @@ -1351,9 +1393,11 @@ void TraceWidget::setTraceEnabled(uint traceNumber, bool enabled, bool showText) m_traceArray[traceNumber]->posSetBtn->hide(); } - m_graticuleWidget->updateGraticule(); - m_graticuleWidget->repaint(false); - updateTraceText(); + if (!deferUpdate) { + m_graticuleWidget->updateGraticule(); + m_graticuleWidget->repaint(false); + updateTraceText(); + } } TQString TraceWidget::traceName(uint traceNumber) { @@ -1362,11 +1406,13 @@ TQString TraceWidget::traceName(uint traceNumber) { return m_traceArray[traceNumber]->traceName; } -void TraceWidget::setTraceName(uint traceNumber, TQString name) { +void TraceWidget::setTraceName(uint traceNumber, TQString name, bool deferUpdate) { VERIFY_TRACE_ARRAY_SIZE m_traceArray[traceNumber]->traceName = name; - updateTraceText(); + if (!deferUpdate) { + updateTraceText(); + } } TQString TraceWidget::traceHorizontalUnits(uint traceNumber) { @@ -1375,11 +1421,13 @@ TQString TraceWidget::traceHorizontalUnits(uint traceNumber) { return m_traceArray[traceNumber]->horizontalUnits; } -void TraceWidget::setTraceHorizontalUnits(uint traceNumber, TQString units) { +void TraceWidget::setTraceHorizontalUnits(uint traceNumber, TQString units, bool deferUpdate) { VERIFY_TRACE_ARRAY_SIZE m_traceArray[traceNumber]->horizontalUnits = units; - updateTraceText(); + if (!deferUpdate) { + updateTraceText(); + } } TQString TraceWidget::traceVerticalUnits(uint traceNumber) { @@ -1388,11 +1436,13 @@ TQString TraceWidget::traceVerticalUnits(uint traceNumber) { return m_traceArray[traceNumber]->verticalUnits; } -void TraceWidget::setTraceVerticalUnits(uint traceNumber, TQString units) { +void TraceWidget::setTraceVerticalUnits(uint traceNumber, TQString units, bool deferUpdate) { VERIFY_TRACE_ARRAY_SIZE m_traceArray[traceNumber]->verticalUnits = units; - updateTraceText(); + if (!deferUpdate) { + updateTraceText(); + } } double TraceWidget::cursorPosition(uint cursorNumber) { @@ -1714,6 +1764,20 @@ void TraceWidget::showLeftTraceInfoArea(bool show) { } } +void TraceWidget::fitLeftTraceInfoArea(bool fit) { + m_leftTraceInfoLabelsFit = fit; + m_traceLeftLabelLayout->invalidate(); +} + +void TraceWidget::setLeftTraceInfoAreaFitSpacing(int spacing) { + m_leftTraceInfoAreaFitSpacing = spacing; + m_traceLeftLabelLayout->invalidate(); +} + +void TraceWidget::setMinimumPixelsPerHorizDiv(unsigned int pixels) { + m_minimumPixelsPerHorizDiv = pixels; +} + TQString TraceWidget::prettyFormat(double value, double rangeDetectValue, TQString baseUnits, unsigned int precision) { TQString result; TQString unitMultiplier; @@ -1789,12 +1853,39 @@ double TraceWidget::traceOffset(uint traceNumber) { } void TraceWidget::setTraceOffset(uint traceNumber, double offset) { + setTraceOffset(traceNumber, offset, false); +} + +void TraceWidget::setTraceOffset(uint traceNumber, double offset, bool deferUpdate) { VERIFY_TRACE_ARRAY_SIZE m_traceArray[traceNumber]->offset = offset; - m_graticuleWidget->repaint(false); - updateTraceText(); + if (!deferUpdate) { + m_graticuleWidget->repaint(false); + updateTraceText(); + } +} + +double TraceWidget::traceTextOffset(uint traceNumber) { + VERIFY_TRACE_ARRAY_SIZE + + return m_traceArray[traceNumber]->textOffset; +} + +void TraceWidget::setTraceTextOffset(uint traceNumber, double offset) { + setTraceOffset(traceNumber, offset, false); +} + +void TraceWidget::setTraceTextOffset(uint traceNumber, double offset, bool deferUpdate) { + VERIFY_TRACE_ARRAY_SIZE + + m_traceArray[traceNumber]->textOffset = offset; + + if (!deferUpdate) { + m_graticuleWidget->repaint(false); + updateTraceText(); + } } void TraceWidget::processChangedOffset(double offset) { @@ -1904,6 +1995,16 @@ void TraceWidget::resizeCursorArray(uint newsize) { } } +TQSize TraceWidget::sizeHint() const { + TQSize widgetSizeHint = TQWidget::sizeHint(); + unsigned int minimumHorizWidth = m_horizDivs * m_minimumPixelsPerHorizDiv; + return TQSize(TQMAX(minimumHorizWidth, widgetSizeHint.height()), widgetSizeHint.height()); +} + +TQSize TraceWidget::minimumSizeHint() const { + return TQWidget::minimumSizeHint(); +} + TraceScrollWidget::TraceScrollWidget(TQWidget* parent, const char* name) : TQScrollView(parent, name) { m_traceWidget = new TraceWidget(viewport()); addChild(m_traceWidget); @@ -1915,7 +2016,7 @@ TraceScrollWidget::~TraceScrollWidget() { } TQSize TraceScrollWidget::sizeHint() const { - return m_traceWidget->sizeHint(); + return TQScrollView::sizeHint(); } TQSize TraceScrollWidget::minimumSizeHint() const { diff --git a/clients/tde/src/widgets/tracewidget.h b/clients/tde/src/widgets/tracewidget.h index c034149..6461d35 100644 --- a/clients/tde/src/widgets/tracewidget.h +++ b/clients/tde/src/widgets/tracewidget.h @@ -71,6 +71,7 @@ class TraceData : public TQObject long leftEdgeIndex; long rightEdgeIndex; double offset; + double textOffset; TQColor color; bool enabled; double leftEdge; @@ -187,33 +188,40 @@ class GraticuleWidget : public TQWidget class TraceWidget : public TQWidget { Q_OBJECT + + public: + enum TextDisplayType { + FullText, + SummaryText, + NoText + }; public: TraceWidget(TQWidget* = 0, const char* = 0); ~TraceWidget(); - void setNumberOfSamples(uint traceNumber, unsigned int samples); + void setNumberOfSamples(uint traceNumber, unsigned int samples, bool deferUpdate=false); void setNumberOfHorizontalDivisions(unsigned int divisions); void setNumberOfVerticalDivisions(unsigned int divisions); - void setDisplayLimits(uint traceNumber, TQRectF limits); + void setDisplayLimits(uint traceNumber, TQRectF limits, bool deferUpdate=false); TQRectF displayLimits(uint traceNumber); void setNumberOfTraces(uint traceNumber); void setNumberOfCursors(uint traceNumber); TQDoubleArray& samples(uint traceNumber); - void setSamples(uint traceNumber, TQDoubleArray&); + void setSamples(uint traceNumber, TQDoubleArray&, bool deferUpdate=false); TQDoubleArray& positions(uint traceNumber); - void setPositions(uint traceNumber, TQDoubleArray&); + void setPositions(uint traceNumber, TQDoubleArray&, bool deferUpdate=false); TQColor traceColor(uint traceNumber); void setTraceColor(uint traceNumber, TQColor); bool traceEnabled(uint traceNumber); - void setTraceEnabled(uint traceNumber, bool enabled, bool showText=true); + void setTraceEnabled(uint traceNumber, bool enabled, TextDisplayType showText=FullText, bool deferUpdate=false); TQString traceName(uint traceNumber); - void setTraceName(uint traceNumber, TQString name); + void setTraceName(uint traceNumber, TQString name, bool deferUpdate=false); TQString traceHorizontalUnits(uint traceNumber); - void setTraceHorizontalUnits(uint traceNumber, TQString units); + void setTraceHorizontalUnits(uint traceNumber, TQString units, bool deferUpdate=false); TQString traceVerticalUnits(uint traceNumber); - void setTraceVerticalUnits(uint traceNumber, TQString units); + void setTraceVerticalUnits(uint traceNumber, TQString units, bool deferUpdate=false); double cursorPosition(uint cursorNumber); void setCursorPosition(uint cursorNumber, double position); @@ -240,13 +248,23 @@ class TraceWidget : public TQWidget void setZoomCursorStartIndex(unsigned int index); void showLeftTraceInfoArea(bool show); + void fitLeftTraceInfoArea(bool fit); + void setLeftTraceInfoAreaFitSpacing(int spacing); + void setMinimumPixelsPerHorizDiv(unsigned int pixels); double traceOffset(uint traceNumber); + void setTraceOffset(uint traceNumber, double offset, bool deferUpdate); + double traceTextOffset(uint traceNumber); + void setTraceTextOffset(uint traceNumber, double offset, bool deferUpdate); static TQString prettyFormat(double value, double rangeDetectValue, TQString baseUnits, unsigned int precision=3); + virtual TQSize sizeHint() const; + virtual TQSize minimumSizeHint() const; + public slots: void setTraceOffset(uint traceNumber, double offset); + void setTraceTextOffset(uint traceNumber, double offset); private slots: void updateTraceText(); @@ -287,6 +305,9 @@ class TraceWidget : public TQWidget GraticuleWidget* m_graticuleWidget; bool m_useAbsoluteHorizontalRange; bool m_showLeftTraceInfoArea; + bool m_leftTraceInfoLabelsFit; + int m_leftTraceInfoAreaFitSpacing; + unsigned int m_minimumPixelsPerHorizDiv; friend class GraticuleWidget; friend class TraceData; diff --git a/fpga/gpmc/xilinx/common/data_storage.v b/fpga/gpmc/xilinx/common/data_storage.v index b98fb25..f4393a6 100644 --- a/fpga/gpmc/xilinx/common/data_storage.v +++ b/fpga/gpmc/xilinx/common/data_storage.v @@ -8,19 +8,20 @@ module data_storage( input clka, - input [7:0] dina, + input [(RAM_WIDTH-1):0] dina, input [(RAM_ADDR_BITS-1):0] addra, input wea, - output reg [7:0] douta); + output reg [(RAM_WIDTH-1):0] douta); parameter RAM_ADDR_BITS = 14; parameter RAM_WIDTH = 8; - + // Xilinx specific directive (* RAM_STYLE="BLOCK" *) - + reg [RAM_WIDTH-1:0] data_storage_ram [(2**RAM_ADDR_BITS)-1:0]; - + + // Registered always @(posedge clka) begin if (wea) begin data_storage_ram[addra] <= dina; @@ -30,4 +31,12 @@ module data_storage( end end +// // Unregistered +// always @(posedge clka) begin +// if (wea) begin +// data_storage_ram[addra] <= dina; +// end +// end +// assign douta = data_storage_ram[addra]; + endmodule diff --git a/fpga/gpmc/xilinx/common/lcd_data_storage.v b/fpga/gpmc/xilinx/common/lcd_data_storage.v index c1f3559..8f7adac 100644 --- a/fpga/gpmc/xilinx/common/lcd_data_storage.v +++ b/fpga/gpmc/xilinx/common/lcd_data_storage.v @@ -23,22 +23,38 @@ module lcd_data_storage( // Xilinx specific directive (* RAM_STYLE="BLOCK" *) - reg [RAM_WIDTH-1:0] data_storage_ram [(2**5)-1:0]; - + reg [RAM_WIDTH-1:0] lcd_data_storage_ram [(2**5)-1:0]; + + // Registered always @(posedge clka) begin - douta <= data_storage_ram[addra]; + douta <= lcd_data_storage_ram[addra]; if (wea) begin - data_storage_ram[addra] <= dina; + lcd_data_storage_ram[addra] <= dina; douta <= dina; end end always @(posedge clkb) begin - doutb <= data_storage_ram[addrb]; + doutb <= lcd_data_storage_ram[addrb]; if (web) begin - data_storage_ram[addrb] <= dinb; + lcd_data_storage_ram[addrb] <= dinb; doutb <= dinb; end end +// // Unregistered +// always @(posedge clka) begin +// if (wea) begin +// lcd_data_storage_ram[addra] <= dina; +// end +// end +// assign douta = lcd_data_storage_ram[addra]; +// +// always @(posedge clkb) begin +// if (web) begin +// lcd_data_storage_ram[addrb] <= dinb; +// end +// end +// assign doutb = lcd_data_storage_ram[addrb]; + endmodule diff --git a/fpga/gpmc/xilinx/common/logic_analyzer_data_storage.v b/fpga/gpmc/xilinx/common/logic_analyzer_data_storage.v index 1dd957e..a68d800 100644 --- a/fpga/gpmc/xilinx/common/logic_analyzer_data_storage.v +++ b/fpga/gpmc/xilinx/common/logic_analyzer_data_storage.v @@ -7,38 +7,63 @@ ////////////////////////////////////////////////////////////////////////////////// module logic_analyzer_data_storage( - input clka, - input clkb, - input [63:0] dina, - input [63:0] dinb, - input [10:0] addra, - input [10:0] addrb, + input clk, + input [(RAM_WIDTH-1):0] dina, + input [(RAM_WIDTH-1):0] dinb, + input [(RAM_ADDR_BITS-1):0] addra, + input [(RAM_ADDR_BITS-1):0] addrb, input wea, input web, - output reg [63:0] douta, - output reg [63:0] doutb); + output reg [(RAM_WIDTH-1):0] douta, + output reg [(RAM_WIDTH-1):0] doutb); + parameter RAM_ADDR_BITS = 11; parameter RAM_WIDTH = 64; // Xilinx specific directive (* RAM_STYLE="BLOCK" *) - reg [RAM_WIDTH-1:0] data_storage_ram [(2**11)-1:0]; - + reg [RAM_WIDTH-1:0] logic_analyzer_data_storage_ram [(2**RAM_ADDR_BITS)-1:0]; + + // Initial RAM values for debugging + integer index; + initial begin + for (index = 0; index < ((2**RAM_ADDR_BITS)-1); index = index + 2) begin + logic_analyzer_data_storage_ram[index+0] = {(RAM_WIDTH/4){4'ha}}; + logic_analyzer_data_storage_ram[index+1] = {(RAM_WIDTH/4){4'h5}}; + end + end + + // Registered always @(posedge clka) begin - douta <= data_storage_ram[addra]; + douta <= logic_analyzer_data_storage_ram[addra]; if (wea) begin - data_storage_ram[addra] <= dina; + logic_analyzer_data_storage_ram[addra] <= dina; douta <= dina; end end always @(posedge clkb) begin - doutb <= data_storage_ram[addrb]; + doutb <= logic_analyzer_data_storage_ram[addrb]; if (web) begin - data_storage_ram[addrb] <= dinb; + logic_analyzer_data_storage_ram[addrb] <= dinb; doutb <= dinb; end end +// // Unregistered +// always @(posedge clka) begin +// if (wea) begin +// logic_analyzer_data_storage_ram[addra] <= dina; +// end +// end +// assign douta = logic_analyzer_data_storage_ram[addra]; +// +// always @(posedge clkb) begin +// if (web) begin +// logic_analyzer_data_storage_ram[addrb] <= dinb; +// end +// end +// assign doutb = logic_analyzer_data_storage_ram[addrb]; + endmodule diff --git a/fpga/gpmc/xilinx/common/main.v b/fpga/gpmc/xilinx/common/main.v index bf6e023..ef0df6b 100644 --- a/fpga/gpmc/xilinx/common/main.v +++ b/fpga/gpmc/xilinx/common/main.v @@ -63,6 +63,10 @@ module main( output userdevice_reset); parameter RAM_ADDR_BITS = 15; + parameter CLKIN_PERIOD_NS = 10; + parameter LOGIC_ANALYZER_CLOCK_DIV = 2; + parameter LOGIC_ANALYZER_CLOCK_MULT = 2; + parameter LOGIC_ANALYZER_STEP = (CLKIN_PERIOD_NS*(LOGIC_ANALYZER_CLOCK_MULT/LOGIC_ANALYZER_CLOCK_DIV)); reg userdevice_reset_reg; assign userdevice_reset = ~userdevice_reset_reg; @@ -70,6 +74,10 @@ module main( assign host_serial_txd = userlogic_serial_rxd; assign userlogic_serial_txd = host_serial_rxd; + wire main_clk; + wire main_clk_online; + main_clock_generator main_clock_generator(.clkin(clk), .clkout(main_clk), .online(main_clk_online)); + reg [15:0] sixteen_bit_io_in; reg [15:0] sixteen_bit_io_out; reg [15:0] sixteen_bit_io_reg; @@ -77,7 +85,7 @@ module main( assign sixteen_bit_io = (sixteen_bit_io_wen) ? sixteen_bit_io_out : 16'bz; - always @(posedge clk) begin + always @(posedge main_clk) begin sixteen_bit_io_reg = sixteen_bit_io; sixteen_bit_io_wen_reg = sixteen_bit_io_wen; if (sixteen_bit_io_wen_reg == 1'b0) begin @@ -100,10 +108,10 @@ module main( wire data_storage_clka; reg [7:0] data_storage_dina; reg [(RAM_ADDR_BITS-1):0] data_storage_addra; - reg data_storage_write_enable; + reg data_storage_write_enable = 1'b0; wire [7:0] data_storage_data_out; - assign data_storage_clka = clk; + assign data_storage_clka = main_clk; data_storage #(RAM_ADDR_BITS) data_storage(.clka(data_storage_clka), .dina(data_storage_dina), .addra(data_storage_addra), .wea(data_storage_write_enable), .douta(data_storage_data_out)); @@ -114,13 +122,13 @@ module main( reg [7:0] lcd_data_storage_dinb; reg [4:0] lcd_data_storage_addra; reg [4:0] lcd_data_storage_addrb; - reg lcd_data_storage_wea; - reg lcd_data_storage_web; + reg lcd_data_storage_wea = 1'b0; + reg lcd_data_storage_web = 1'b0; wire [7:0] lcd_data_storage_douta; wire [7:0] lcd_data_storage_doutb; - assign lcd_data_storage_clka = clk; - assign lcd_data_storage_clkb = clk; + assign lcd_data_storage_clka = main_clk; + assign lcd_data_storage_clkb = main_clk; lcd_data_storage lcd_data_storage(.clka(lcd_data_storage_clka), .clkb(lcd_data_storage_clkb), .dina(lcd_data_storage_dina), .dinb(lcd_data_storage_dinb), @@ -129,7 +137,12 @@ module main( .douta(lcd_data_storage_douta), .doutb(lcd_data_storage_doutb)); wire logic_analyzer_clk; - logic_analyzer_clock_generator logic_analyzer_clock_generator(.clkin(clk), .clkout(logic_analyzer_clk)); + wire logic_analyzer_online; + //logic_analyzer_clock_generator #(LOGIC_ANALYZER_CLOCK_MULT, LOGIC_ANALYZER_CLOCK_DIV) logic_analyzer_clock_generator(.clkin(clk), .clkout(logic_analyzer_clk), .online(logic_analyzer_online)); + // FIXME + // Work around block RAM problems + assign logic_analyzer_clk = main_clk; + assign logic_analyzer_online = 1'b1; wire logic_analyzer_data_storage_clka; wire logic_analyzer_data_storage_clkb; @@ -137,13 +150,13 @@ module main( reg [63:0] logic_analyzer_data_storage_dinb; reg [10:0] logic_analyzer_data_storage_addra; reg [10:0] logic_analyzer_data_storage_addrb; - reg logic_analyzer_data_storage_wea; - reg logic_analyzer_data_storage_web; + reg logic_analyzer_data_storage_wea = 1'b0; + reg logic_analyzer_data_storage_web = 1'b0; wire [63:0] logic_analyzer_data_storage_douta; wire [63:0] logic_analyzer_data_storage_doutb; - assign logic_analyzer_data_storage_clka = clk; - assign logic_analyzer_data_storage_clkb = logic_analyzer_clk; + assign logic_analyzer_data_storage_clka = logic_analyzer_clk; + assign logic_analyzer_data_storage_clkb = main_clk; logic_analyzer_data_storage logic_analyzer_data_storage(.clka(logic_analyzer_data_storage_clka), .clkb(logic_analyzer_data_storage_clkb), .dina(logic_analyzer_data_storage_dina), .dinb(logic_analyzer_data_storage_dinb), @@ -163,7 +176,7 @@ module main( reg clk_div_by_eight; reg clk_div_by_sixteen; - always @(posedge clk) begin + always @(posedge main_clk) begin clk_div_by_two = !clk_div_by_two; end @@ -206,32 +219,32 @@ module main( if (sseg_mux_latch[0] == 0) begin led_display_bytes[0] = sseg_data_latch; digit_blanker_1 = 0; - digit_blanker_2 = digit_blanker_2 + 1; - digit_blanker_3 = digit_blanker_3 + 1; - digit_blanker_4 = digit_blanker_4 + 1; + digit_blanker_2 = digit_blanker_2 + 1'b1; + digit_blanker_3 = digit_blanker_3 + 1'b1; + digit_blanker_4 = digit_blanker_4 + 1'b1; end if (sseg_mux_latch[1] == 0) begin led_display_bytes[1] = sseg_data_latch; - digit_blanker_1 = digit_blanker_1 + 1; + digit_blanker_1 = digit_blanker_1 + 1'b1; digit_blanker_2 = 0; - digit_blanker_3 = digit_blanker_3 + 1; - digit_blanker_4 = digit_blanker_4 + 1; + digit_blanker_3 = digit_blanker_3 + 1'b1; + digit_blanker_4 = digit_blanker_4 + 1'b1; end if (sseg_mux_latch[2] == 0) begin led_display_bytes[2] = sseg_data_latch; - digit_blanker_1 = digit_blanker_1 + 1; - digit_blanker_2 = digit_blanker_2 + 1; + digit_blanker_1 = digit_blanker_1 + 1'b1; + digit_blanker_2 = digit_blanker_2 + 1'b1; digit_blanker_3 = 0; - digit_blanker_4 = digit_blanker_4 + 1; + digit_blanker_4 = digit_blanker_4 + 1'b1; end if (sseg_mux_latch[3] == 0) begin led_display_bytes[3] = sseg_data_latch; - digit_blanker_1 = digit_blanker_1 + 1; - digit_blanker_2 = digit_blanker_2 + 1; - digit_blanker_3 = digit_blanker_3 + 1; + digit_blanker_1 = digit_blanker_1 + 1'b1; + digit_blanker_2 = digit_blanker_2 + 1'b1; + digit_blanker_3 = digit_blanker_3 + 1'b1; digit_blanker_4 = 0; end @@ -258,39 +271,113 @@ module main( // //----------------------------------------------------------------------------------- - reg logic_analyzer_trigger; - reg logic_analyzer_trigger_prev; - reg [11:0] logic_analyzer_address_counter; + reg [32*8:0] logic_analyzer_signal_names [63:0]; + + initial begin + logic_analyzer_signal_names[0] <= "Four bit LEDs <0>\0"; + logic_analyzer_signal_names[1] <= "Four bit LEDs <1>\0"; + logic_analyzer_signal_names[2] <= "Four bit LEDs <2>\0"; + logic_analyzer_signal_names[3] <= "Four bit LEDs <3>\0"; + logic_analyzer_signal_names[4] <= "Four bit switches <0>\0"; + logic_analyzer_signal_names[5] <= "Four bit switches <1>\0"; + logic_analyzer_signal_names[6] <= "Four bit switches <2>\0"; + logic_analyzer_signal_names[7] <= "Four bit switches <3>\0"; + logic_analyzer_signal_names[8] <= "Eight bit LEDs <0>\0"; + logic_analyzer_signal_names[9] <= "Eight bit LEDs <1>\0"; + logic_analyzer_signal_names[10] <= "Eight bit LEDs <2>\0"; + logic_analyzer_signal_names[11] <= "Eight bit LEDs <3>\0"; + logic_analyzer_signal_names[12] <= "Eight bit LEDs <4>\0"; + logic_analyzer_signal_names[13] <= "Eight bit LEDs <5>\0"; + logic_analyzer_signal_names[14] <= "Eight bit LEDs <6>\0"; + logic_analyzer_signal_names[15] <= "Eight bit LEDs <7>\0"; + logic_analyzer_signal_names[16] <= "Eight bit switches <0>\0"; + logic_analyzer_signal_names[17] <= "Eight bit switches <1>\0"; + logic_analyzer_signal_names[18] <= "Eight bit switches <2>\0"; + logic_analyzer_signal_names[19] <= "Eight bit switches <3>\0"; + logic_analyzer_signal_names[20] <= "Eight bit switches <4>\0"; + logic_analyzer_signal_names[21] <= "Eight bit switches <5>\0"; + logic_analyzer_signal_names[22] <= "Eight bit switches <6>\0"; + logic_analyzer_signal_names[23] <= "Eight bit switches <7>\0"; + logic_analyzer_signal_names[24] <= "Seven-segment MUX <0>\0"; + logic_analyzer_signal_names[25] <= "Seven-segment MUX <1>\0"; + logic_analyzer_signal_names[26] <= "Seven-segment MUX <2>\0"; + logic_analyzer_signal_names[27] <= "Seven-segment MUX <3>\0"; + logic_analyzer_signal_names[28] <= "Seven-segment DATA <0>\0"; + logic_analyzer_signal_names[29] <= "Seven-segment DATA <1>\0"; + logic_analyzer_signal_names[30] <= "Seven-segment DATA <2>\0"; + logic_analyzer_signal_names[31] <= "Seven-segment DATA <3>\0"; + logic_analyzer_signal_names[32] <= "Seven-segment DATA <4>\0"; + logic_analyzer_signal_names[33] <= "Seven-segment DATA <5>\0"; + logic_analyzer_signal_names[34] <= "Seven-segment DATA <6>\0"; + logic_analyzer_signal_names[35] <= "Seven-segment DATA <7>\0"; + logic_analyzer_signal_names[36] <= "User memory DATA <0>\0"; + logic_analyzer_signal_names[37] <= "User memory DATA <1>\0"; + logic_analyzer_signal_names[38] <= "User memory DATA <2>\0"; + logic_analyzer_signal_names[39] <= "User memory DATA <3>\0"; + logic_analyzer_signal_names[40] <= "User memory DATA <4>\0"; + logic_analyzer_signal_names[41] <= "User memory DATA <5>\0"; + logic_analyzer_signal_names[42] <= "User memory DATA <6>\0"; + logic_analyzer_signal_names[43] <= "User memory DATA <7>\0"; + logic_analyzer_signal_names[44] <= "User memory ADDR <0>\0"; + logic_analyzer_signal_names[45] <= "User memory ADDR <1>\0"; + logic_analyzer_signal_names[46] <= "User memory ADDR <2>\0"; + logic_analyzer_signal_names[47] <= "User memory ADDR <3>\0"; + logic_analyzer_signal_names[48] <= "User memory ADDR <4>\0"; + logic_analyzer_signal_names[49] <= "User memory ADDR <5>\0"; + logic_analyzer_signal_names[50] <= "User memory ADDR <6>\0"; + logic_analyzer_signal_names[51] <= "User memory ADDR <7>\0"; + logic_analyzer_signal_names[52] <= "User memory ADDR <8>\0"; + logic_analyzer_signal_names[53] <= "User memory ADDR <9>\0"; + logic_analyzer_signal_names[54] <= "User memory ADDR <10>\0"; + logic_analyzer_signal_names[55] <= "User memory ADDR <11>\0"; + logic_analyzer_signal_names[56] <= "User memory ADDR <12>\0"; + logic_analyzer_signal_names[57] <= "User memory ADDR <13>\0"; + logic_analyzer_signal_names[58] <= "User memory ADDR <14>\0"; + logic_analyzer_signal_names[59] <= "User memory ADDR <15>\0"; + logic_analyzer_signal_names[60] <= "User memory WEN\0"; + logic_analyzer_signal_names[61] <= "User memory WAIT\0"; + logic_analyzer_signal_names[62] <= "GND REF\0"; + logic_analyzer_signal_names[63] <= "User logic clock\0"; + end + + reg logic_analyzer_running = 1; + reg [15:0] logic_analyzer_timestep = LOGIC_ANALYZER_STEP; + reg [1:0] logic_analyzer_trigger = 2'b11; + reg [11:0] logic_analyzer_address_counter = 12'b100000000000; always @(posedge logic_analyzer_clk) begin // Trigger - logic_analyzer_trigger = ~userlogic_reset; // Trigger on userlogic_reset falling edge - if ((logic_analyzer_trigger == 1) && (logic_analyzer_trigger_prev == 0)) begin + logic_analyzer_trigger[1] = logic_analyzer_trigger[0]; + logic_analyzer_trigger[0] = ~userlogic_reset; // Trigger on userlogic_reset falling edge + if ((logic_analyzer_running == 1) && (logic_analyzer_trigger[0] == 1) && (logic_analyzer_trigger[1] == 0)) begin logic_analyzer_address_counter = 0; end // Data load if (logic_analyzer_address_counter[11] == 1'b0) begin - logic_analyzer_data_storage_addrb = logic_analyzer_address_counter; + // Set up write address + logic_analyzer_data_storage_addra <= logic_analyzer_address_counter[10:0]; // Connect signals to logic analyzer - logic_analyzer_data_storage_dinb[3:0] = four_bit_leds; - logic_analyzer_data_storage_dinb[7:4] = four_bit_switches; - logic_analyzer_data_storage_dinb[15:8] = eight_bit_leds; - logic_analyzer_data_storage_dinb[23:16] = eight_bit_switches; - logic_analyzer_data_storage_dinb[27:24] = sseg_mux; - logic_analyzer_data_storage_dinb[35:28] = sseg_data; - logic_analyzer_data_storage_dinb[43:36] = usermem_data; - logic_analyzer_data_storage_dinb[59:44] = usermem_address; - logic_analyzer_data_storage_dinb[60] = usermem_wen; - logic_analyzer_data_storage_dinb[61] = usermem_wait; - logic_analyzer_data_storage_dinb[62] = 1'b0; // UNUSED - logic_analyzer_data_storage_dinb[63] = userlogic_clock; - - logic_analyzer_data_storage_web = 1'b1; - logic_analyzer_address_counter = logic_analyzer_address_counter + 1; + logic_analyzer_data_storage_dina[3:0] <= four_bit_leds; + logic_analyzer_data_storage_dina[7:4] <= four_bit_switches; + logic_analyzer_data_storage_dina[15:8] <= eight_bit_leds; + logic_analyzer_data_storage_dina[23:16] <= eight_bit_switches; + logic_analyzer_data_storage_dina[27:24] <= sseg_mux; + logic_analyzer_data_storage_dina[35:28] <= sseg_data; + logic_analyzer_data_storage_dina[43:36] <= usermem_data; + logic_analyzer_data_storage_dina[59:44] <= usermem_address; + logic_analyzer_data_storage_dina[60] <= usermem_wen; + logic_analyzer_data_storage_dina[61] <= usermem_wait; + logic_analyzer_data_storage_dina[62] <= 1'b0; // UNUSED + logic_analyzer_data_storage_dina[63] <= userlogic_clock; + + logic_analyzer_data_storage_wea <= 1'b1; + logic_analyzer_address_counter = logic_analyzer_address_counter + 1'b1; + end else begin + logic_analyzer_data_storage_addra <= 0; + logic_analyzer_data_storage_dina <= 0; + logic_analyzer_data_storage_wea <= 1'b0; end - - logic_analyzer_trigger_prev = logic_analyzer_trigger; end @@ -310,40 +397,39 @@ module main( reg [7:0] usermem_data_reg; reg [RAM_ADDR_BITS:0] usermem_address_reg; - always @(posedge clk) begin - usermem_wen_reg = usermem_wen; - usermem_data_reg = usermem_data; - usermem_address_reg = usermem_address; - - gpmc_advn_reg = gpmc_advn; - gpmc_oen_reg = gpmc_oen; - gpmc_wen_reg = gpmc_wen; - if (gpmc_wen_reg == 1'b0) begin - gpmc_data_reg = gpmc_data; + always @(posedge main_clk) begin + usermem_wen_reg <= usermem_wen; + usermem_data_reg <= usermem_data; + usermem_address_reg <= usermem_address; + + gpmc_advn_reg <= gpmc_advn; + gpmc_oen_reg <= gpmc_oen; + gpmc_wen_reg <= gpmc_wen; + // wen and advn are both verified before executing any write operations to avoid momentary wen glitches corrupting memory contents + if ((gpmc_wen_reg == 1'b0) && (gpmc_advn_reg == 1'b0)) begin + gpmc_data_reg <= gpmc_data; end if (gpmc_advn_reg == 1'b0) begin - gpmc_address_reg = gpmc_address; - data_storage_write_enable = 1'b0; - lcd_data_storage_wea = 1'b0; - logic_analyzer_data_storage_wea = 1'b0; + gpmc_address_reg <= gpmc_address; end if (gpmc_wen_reg == 1'b1) begin - data_storage_write_enable = 1'b0; - lcd_data_storage_wea = 1'b0; - logic_analyzer_data_storage_wea = 1'b0; + data_storage_write_enable <= 1'b0; + lcd_data_storage_wea <= 1'b0; + logic_analyzer_data_storage_web <= 1'b0; end + gpmc_data_driven <= ((~gpmc_oen_reg) && gpmc_wen_reg); if (gpmc_address_reg[RAM_ADDR_BITS] == 1'b1) begin // System memory access usermem_wait = 1'b1; - if (gpmc_wen_reg == 1'b0) begin - data_storage_addra = gpmc_address_reg[(RAM_ADDR_BITS-1):0]; - data_storage_dina = gpmc_data_reg; - data_storage_write_enable = 1'b1; + if ((gpmc_wen_reg == 1'b0) && (gpmc_advn_reg == 1'b0)) begin + data_storage_addra <= gpmc_address_reg[(RAM_ADDR_BITS-1):0]; + data_storage_dina <= gpmc_data_reg; + data_storage_write_enable <= 1'b1; end else begin - data_storage_addra = gpmc_address_reg[(RAM_ADDR_BITS-1):0]; - data_storage_write_enable = 1'b0; - gpmc_data_out = data_storage_data_out; + data_storage_addra <= gpmc_address_reg[(RAM_ADDR_BITS-1):0]; + data_storage_write_enable <= 1'b0; + gpmc_data_out <= data_storage_data_out; end end else begin // User memory access @@ -354,30 +440,30 @@ module main( // 0x20 - 0x3f: LCD data area if (usermem_wen_reg == 1'b0) begin if (usermem_address_reg[(RAM_ADDR_BITS-1):5] == 1) begin // Address range 0x20 - 0x3f - lcd_data_storage_addrb = usermem_address_reg[4:0]; - lcd_data_storage_dinb = usermem_data_reg; - lcd_data_storage_web = 1'b1; + lcd_data_storage_addrb <= usermem_address_reg[4:0]; + lcd_data_storage_dinb <= usermem_data_reg; + lcd_data_storage_web <= 1'b1; end end else begin if (usermem_address_reg[(RAM_ADDR_BITS-1):5] == 1) begin // Address range 0x20 - 0x3f - lcd_data_storage_addrb = usermem_address_reg[4:0]; - lcd_data_storage_web = 1'b0; - usermem_data_out = lcd_data_storage_doutb; + lcd_data_storage_addrb <= usermem_address_reg[4:0]; + lcd_data_storage_web <= 1'b0; + usermem_data_out <= lcd_data_storage_doutb; end else begin // Default - usermem_data_out = 8'b00000000; + usermem_data_out <= 8'b00000000; end end end else begin // Client scratchpad memory area if (usermem_wen_reg == 1'b0) begin - data_storage_addra = usermem_address_reg[(RAM_ADDR_BITS-1):0]; - data_storage_dina = usermem_data_reg; - data_storage_write_enable = 1'b1; + data_storage_addra <= usermem_address_reg[(RAM_ADDR_BITS-1):0]; + data_storage_dina <= usermem_data_reg; + data_storage_write_enable <= 1'b1; end else begin - data_storage_addra = usermem_address_reg[(RAM_ADDR_BITS-1):0]; - data_storage_write_enable = 1'b0; - usermem_data_out = data_storage_data_out; + data_storage_addra <= usermem_address_reg[(RAM_ADDR_BITS-1):0]; + data_storage_write_enable <= 1'b0; + usermem_data_out <= data_storage_data_out; end end @@ -400,33 +486,55 @@ module main( // 0x0c: User device control // Bit 0: User logic reset // Bit 1: User device reset + // 0x0d: Logic analyzer control + // Bit 0: Logic analyzer capture active + // Bit 7: Logic analyzer online (DCM locked) (read only) + // 0x0e: Logic analyzer timestep (ns) (upper 8 bits) (read only) + // 0x0f: Logic analyzer timestep (ns) (lower 8 bits) (read only) // 0x20 - 0x3f: LCD data area + // 0x800 - 0xfff: Logic analyzer signal names area (read only) // 0x4000 - 0x7fff: Logic analyzer data area (read only) - if (gpmc_wen_reg == 1'b0) begin + if ((gpmc_wen_reg == 1'b0) && (gpmc_advn_reg == 1'b0)) begin if (gpmc_address_reg[(RAM_ADDR_BITS-1):5] == 1) begin // Address range 0x20 - 0x3f - lcd_data_storage_addra = gpmc_address_reg[4:0]; - lcd_data_storage_dina = gpmc_data_reg; - lcd_data_storage_wea = 1'b1; + lcd_data_storage_addra <= gpmc_address_reg[4:0]; + lcd_data_storage_dina <= gpmc_data_reg; + lcd_data_storage_wea <= 1'b1; + end else if (gpmc_address_reg[(RAM_ADDR_BITS-1):14] == 1) begin // Address range 0x4000 - 0x7fff + // FIXME + // Prevent incorrect operation of the block RAM by allowing the Port B write signal to be set under certain conditions + logic_analyzer_data_storage_addrb <= gpmc_address_reg[13:3]; + logic_analyzer_data_storage_dinb[7:0] <= gpmc_data_reg; + logic_analyzer_data_storage_dinb[15:8] <= gpmc_data_reg; + logic_analyzer_data_storage_dinb[23:16] <= gpmc_data_reg; + logic_analyzer_data_storage_dinb[31:24] <= gpmc_data_reg; + logic_analyzer_data_storage_dinb[39:32] <= gpmc_data_reg; + logic_analyzer_data_storage_dinb[47:40] <= gpmc_data_reg; + logic_analyzer_data_storage_dinb[55:48] <= gpmc_data_reg; + logic_analyzer_data_storage_dinb[63:56] <= gpmc_data_reg; + logic_analyzer_data_storage_web <= 1'b1; end else begin case (gpmc_address_reg[(RAM_ADDR_BITS-1):0]) 2: begin - four_bit_switches = gpmc_data_reg[3:0]; + four_bit_switches <= gpmc_data_reg[3:0]; end 3: begin - eight_bit_switches = gpmc_data_reg; + eight_bit_switches <= gpmc_data_reg; end 4: begin - sixteen_bit_io_out[15:8] = gpmc_data_reg; + sixteen_bit_io_out[15:8] <= gpmc_data_reg; end 5: begin - sixteen_bit_io_out[7:0] = gpmc_data_reg; + sixteen_bit_io_out[7:0] <= gpmc_data_reg; end 10: begin - userproc_start = gpmc_data_reg[0]; + userproc_start <= gpmc_data_reg[0]; end 12: begin - userlogic_reset = gpmc_data_reg[0]; - userdevice_reset_reg = gpmc_data_reg[1]; + userlogic_reset <= gpmc_data_reg[0]; + userdevice_reset_reg <= gpmc_data_reg[1]; + end + 13: begin + logic_analyzer_running <= gpmc_data_reg[0]; end default: begin // Do nothing @@ -435,92 +543,103 @@ module main( end end else begin if (gpmc_address_reg[(RAM_ADDR_BITS-1):5] == 1) begin // Address range 0x20 - 0x3f - lcd_data_storage_addra = gpmc_address_reg[4:0]; - lcd_data_storage_wea = 1'b0; - gpmc_data_out = lcd_data_storage_douta; + lcd_data_storage_addra <= gpmc_address_reg[4:0]; + lcd_data_storage_wea <= 1'b0; + gpmc_data_out <= lcd_data_storage_douta; + end else if (gpmc_address_reg[(RAM_ADDR_BITS-1):11] == 1) begin // Address range 0x800 - 0xfff + gpmc_data_out <= logic_analyzer_signal_names[gpmc_address_reg[10:5]][(((32*8)-(gpmc_address_reg[4:0]*8))-1)-:8]; end else if (gpmc_address_reg[(RAM_ADDR_BITS-1):14] == 1) begin // Address range 0x4000 - 0x7fff - logic_analyzer_data_storage_addra = gpmc_address_reg[13:3]; - logic_analyzer_data_storage_wea = 1'b0; + logic_analyzer_data_storage_addrb <= gpmc_address_reg[13:3]; + logic_analyzer_data_storage_web <= 1'b0; case (gpmc_address_reg[2:0]) 0: begin - gpmc_data_out = logic_analyzer_data_storage_douta[7:0]; + gpmc_data_out <= logic_analyzer_data_storage_doutb[63:56]; end 1: begin - gpmc_data_out = logic_analyzer_data_storage_douta[15:8]; + gpmc_data_out <= logic_analyzer_data_storage_doutb[55:48]; end 2: begin - gpmc_data_out = logic_analyzer_data_storage_douta[23:16]; + gpmc_data_out <= logic_analyzer_data_storage_doutb[47:40]; end 3: begin - gpmc_data_out = logic_analyzer_data_storage_douta[31:24]; + gpmc_data_out <= logic_analyzer_data_storage_doutb[39:32]; end 4: begin - gpmc_data_out = logic_analyzer_data_storage_douta[39:32]; + gpmc_data_out <= logic_analyzer_data_storage_doutb[31:24]; end 5: begin - gpmc_data_out = logic_analyzer_data_storage_douta[47:40]; + gpmc_data_out <= logic_analyzer_data_storage_doutb[23:16]; end 6: begin - gpmc_data_out = logic_analyzer_data_storage_douta[55:48]; + gpmc_data_out <= logic_analyzer_data_storage_doutb[15:8]; end 7: begin - gpmc_data_out = logic_analyzer_data_storage_douta[63:56]; + gpmc_data_out <= logic_analyzer_data_storage_doutb[7:0]; end endcase end else begin case (gpmc_address_reg[(RAM_ADDR_BITS-1):0]) 0: begin - gpmc_data_out = 8'b01000010; + gpmc_data_out <= 8'b01000010; end 1: begin - gpmc_data_out = 8'b00000001; + gpmc_data_out <= 8'b00000001; end 2: begin - gpmc_data_out[7:4] = 0; - gpmc_data_out[3:0] = four_bit_leds; + gpmc_data_out[7:4] <= 0; + gpmc_data_out[3:0] <= four_bit_leds; end 3: begin - gpmc_data_out = eight_bit_leds; + gpmc_data_out <= eight_bit_leds; end 4: begin - gpmc_data_out = sixteen_bit_io_in[15:8]; + gpmc_data_out <= sixteen_bit_io_in[15:8]; end 5: begin - gpmc_data_out = sixteen_bit_io_in[7:0]; + gpmc_data_out <= sixteen_bit_io_in[7:0]; end 6: begin - gpmc_data_out = led_display_bytes[0]; + gpmc_data_out <= led_display_bytes[0]; end 7: begin - gpmc_data_out = led_display_bytes[1]; + gpmc_data_out <= led_display_bytes[1]; end 8: begin - gpmc_data_out = led_display_bytes[2]; + gpmc_data_out <= led_display_bytes[2]; end 9: begin - gpmc_data_out = led_display_bytes[3]; + gpmc_data_out <= led_display_bytes[3]; end 10: begin - gpmc_data_out[0] = userproc_start; - gpmc_data_out[1] = userproc_done; - gpmc_data_out[7:2] = 0; + gpmc_data_out[0] <= userproc_start; + gpmc_data_out[1] <= userproc_done; + gpmc_data_out[7:2] <= 0; end 11: begin - gpmc_data_out = RAM_ADDR_BITS; + gpmc_data_out <= RAM_ADDR_BITS; end 12: begin - gpmc_data_out[0] = userlogic_reset; - gpmc_data_out[1] = userdevice_reset_reg; - gpmc_data_out[7:1] = 0; + gpmc_data_out[0] <= userlogic_reset; + gpmc_data_out[1] <= userdevice_reset_reg; + gpmc_data_out[7:2] <= 0; + end + 13: begin + gpmc_data_out[0] <= logic_analyzer_running; + gpmc_data_out[6:1] <= 0; + gpmc_data_out[7] <= logic_analyzer_online; + end + 14: begin + gpmc_data_out <= logic_analyzer_timestep[15:8]; + end + 15: begin + gpmc_data_out <= logic_analyzer_timestep[7:0]; end default: begin - gpmc_data_out = 0; + gpmc_data_out <= 0; end endcase end end end - - gpmc_data_driven = ((~gpmc_oen) && gpmc_wen); end endmodule diff --git a/fpga/gpmc/xilinx/common/verification.v b/fpga/gpmc/xilinx/common/verification.v new file mode 100644 index 0000000..c871b26 --- /dev/null +++ b/fpga/gpmc/xilinx/common/verification.v @@ -0,0 +1,151 @@ +`timescale 1ns / 1ps +////////////////////////////////////////////////////////////////////////////////// +// +// uLab GPMC interface verification test bench +// +// 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, write to the Free Software Foundation, Inc., +// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +// +// (c) 2014 Timothy Pearson +// Raptor Engineering +// http://www.raptorengineeringinc.com +// +////////////////////////////////////////////////////////////////////////////////// + +module verification; + + // Inputs + reg clk; + reg gpmc_advn; + reg gpmc_oen; + reg gpmc_wen; + reg [15:0] gpmc_address; + reg usermem_wen; + reg userproc_done; + reg userlogic_clock; + reg userlogic_serial_rxd; + reg host_serial_rxd; + reg [3:0] four_bit_leds; + reg [7:0] eight_bit_leds; + reg sixteen_bit_io_wen; + reg [3:0] sseg_mux; + reg [7:0] sseg_data; + + // Outputs + wire usermem_wait; + wire userproc_start; + wire userlogic_reset; + wire userlogic_serial_txd; + wire host_serial_txd; + wire [3:0] four_bit_switches; + wire [7:0] eight_bit_switches; + wire sixteen_bit_io_mode; + wire userdevice_reset; + + // Bidirs + wire [7:0] gpmc_data; + wire [7:0] usermem_data; + wire [15:0] usermem_address; + wire [15:0] sixteen_bit_io; + + // Instantiate the Unit Under Test (UUT) + main uut ( + .clk(clk), + .gpmc_advn(gpmc_advn), + .gpmc_oen(gpmc_oen), + .gpmc_wen(gpmc_wen), + .gpmc_data(gpmc_data), + .gpmc_address(gpmc_address), + .usermem_wen(usermem_wen), + .usermem_wait(usermem_wait), + .usermem_data(usermem_data), + .usermem_address(usermem_address), + .userproc_start(userproc_start), + .userproc_done(userproc_done), + .userlogic_reset(userlogic_reset), + .userlogic_clock(userlogic_clock), + .userlogic_serial_txd(userlogic_serial_txd), + .userlogic_serial_rxd(userlogic_serial_rxd), + .host_serial_txd(host_serial_txd), + .host_serial_rxd(host_serial_rxd), + .four_bit_leds(four_bit_leds), + .eight_bit_leds(eight_bit_leds), + .four_bit_switches(four_bit_switches), + .eight_bit_switches(eight_bit_switches), + .sixteen_bit_io(sixteen_bit_io), + .sixteen_bit_io_wen(sixteen_bit_io_wen), + .sixteen_bit_io_mode(sixteen_bit_io_mode), + .sseg_mux(sseg_mux), + .sseg_data(sseg_data), + .userdevice_reset(userdevice_reset) + ); + + reg gpmc_data_driven = 0; + reg [7:0] gpmc_data_out; + assign gpmc_data = (gpmc_data_driven) ? gpmc_data_out : 8'bz; + + // Generate 100MHz clock + always begin + #5; + clk = !clk; + end + + // Terminate test bench after specified time has elapsed + initial begin + #10000; + $finish; + end + + // Test logic analyzer triggering and data acquisition + initial begin + // Initialize Inputs + clk = 0; + gpmc_advn = 0; + gpmc_oen = 0; + gpmc_wen = 0; + gpmc_address = 0; + usermem_wen = 0; + userproc_done = 0; + userlogic_clock = 0; + userlogic_serial_rxd = 0; + host_serial_rxd = 0; + four_bit_leds = 0; + eight_bit_leds = 0; + sixteen_bit_io_wen = 0; + sseg_mux = 0; + sseg_data = 0; + + // Wait 100 ns for global reset to finish + #100; + + // Send user logic reset signal to GPMC interface + gpmc_address = 16'h000c; + gpmc_data_out = 8'h01; + gpmc_data_driven = 1'b1; + gpmc_advn = 1'b0; + gpmc_wen = 1'b0; + #1000 + gpmc_address = 16'h000c; + gpmc_data_out = 8'h00; + gpmc_data_driven = 1'b1; + gpmc_advn = 1'b0; + gpmc_wen = 1'b0; + #100 + gpmc_data_driven = 1'b0; + gpmc_advn = 1'b1; + gpmc_wen = 1'b1; + end + +endmodule + diff --git a/fpga/gpmc/xilinx/numato/spartan6/xc6slx9/ipcore_dir/lcd_data_storage.xco b/fpga/gpmc/xilinx/numato/spartan6/xc6slx9/ipcore_dir/lcd_data_storage.xco new file mode 100644 index 0000000..4f77059 --- /dev/null +++ b/fpga/gpmc/xilinx/numato/spartan6/xc6slx9/ipcore_dir/lcd_data_storage.xco @@ -0,0 +1,108 @@ +############################################################## +# +# Xilinx Core Generator version 14.7 +# Date: Wed Feb 26 21:06:18 2014 +# +############################################################## +# +# This file contains the customisation parameters for a +# Xilinx CORE Generator IP GUI. It is strongly recommended +# that you do not manually alter this file as it may cause +# unexpected and unsupported behavior. +# +############################################################## +# +# Generated from component: xilinx.com:ip:blk_mem_gen:7.3 +# +############################################################## +# +# BEGIN Project Options +SET addpads = false +SET asysymbol = true +SET busformat = BusFormatAngleBracketNotRipped +SET createndf = false +SET designentry = Verilog +SET device = xc6slx9 +SET devicefamily = spartan6 +SET flowvendor = Other +SET formalverification = false +SET foundationsym = false +SET implementationfiletype = Ngc +SET package = csg324 +SET removerpms = false +SET simulationfiles = Behavioral +SET speedgrade = -3 +SET verilogsim = true +SET vhdlsim = false +# END Project Options +# BEGIN Select +SELECT Block_Memory_Generator xilinx.com:ip:blk_mem_gen:7.3 +# END Select +# BEGIN Parameters +CSET additional_inputs_for_power_estimation=false +CSET algorithm=Minimum_Area +CSET assume_synchronous_clk=false +CSET axi_id_width=4 +CSET axi_slave_type=Memory_Slave +CSET axi_type=AXI4_Full +CSET byte_size=9 +CSET coe_file=no_coe_file_loaded +CSET collision_warnings=ALL +CSET component_name=lcd_data_storage +CSET disable_collision_warnings=false +CSET disable_out_of_range_warnings=false +CSET ecc=false +CSET ecctype=No_ECC +CSET enable_32bit_address=false +CSET enable_a=Always_Enabled +CSET enable_b=Always_Enabled +CSET error_injection_type=Single_Bit_Error_Injection +CSET fill_remaining_memory_locations=false +CSET interface_type=Native +CSET load_init_file=false +CSET mem_file=no_Mem_file_loaded +CSET memory_type=True_Dual_Port_RAM +CSET operating_mode_a=WRITE_FIRST +CSET operating_mode_b=WRITE_FIRST +CSET output_reset_value_a=0 +CSET output_reset_value_b=0 +CSET pipeline_stages=0 +CSET port_a_clock=100 +CSET port_a_enable_rate=100 +CSET port_a_write_rate=50 +CSET port_b_clock=100 +CSET port_b_enable_rate=100 +CSET port_b_write_rate=50 +CSET primitive=8kx2 +CSET read_width_a=8 +CSET read_width_b=8 +CSET register_porta_input_of_softecc=false +CSET register_porta_output_of_memory_core=false +CSET register_porta_output_of_memory_primitives=false +CSET register_portb_output_of_memory_core=false +CSET register_portb_output_of_memory_primitives=false +CSET register_portb_output_of_softecc=false +CSET remaining_memory_locations=0 +CSET reset_memory_latch_a=false +CSET reset_memory_latch_b=false +CSET reset_priority_a=CE +CSET reset_priority_b=CE +CSET reset_type=SYNC +CSET softecc=false +CSET use_axi_id=false +CSET use_bram_block=Stand_Alone +CSET use_byte_write_enable=false +CSET use_error_injection_pins=false +CSET use_regcea_pin=false +CSET use_regceb_pin=false +CSET use_rsta_pin=false +CSET use_rstb_pin=false +CSET write_depth_a=32 +CSET write_width_a=8 +CSET write_width_b=8 +# END Parameters +# BEGIN Extra information +MISC pkg_timestamp=2012-11-19T16:22:25Z +# END Extra information +GENERATE +# CRC: 6d3195aa diff --git a/fpga/gpmc/xilinx/numato/spartan6/xc6slx9/ipcore_dir/logic_analyzer_data_storage.xco b/fpga/gpmc/xilinx/numato/spartan6/xc6slx9/ipcore_dir/logic_analyzer_data_storage.xco new file mode 100644 index 0000000..c47a6a7 --- /dev/null +++ b/fpga/gpmc/xilinx/numato/spartan6/xc6slx9/ipcore_dir/logic_analyzer_data_storage.xco @@ -0,0 +1,108 @@ +############################################################## +# +# Xilinx Core Generator version 14.7 +# Date: Wed Feb 26 10:22:39 2014 +# +############################################################## +# +# This file contains the customisation parameters for a +# Xilinx CORE Generator IP GUI. It is strongly recommended +# that you do not manually alter this file as it may cause +# unexpected and unsupported behavior. +# +############################################################## +# +# Generated from component: xilinx.com:ip:blk_mem_gen:7.3 +# +############################################################## +# +# BEGIN Project Options +SET addpads = false +SET asysymbol = true +SET busformat = BusFormatAngleBracketNotRipped +SET createndf = false +SET designentry = Verilog +SET device = xc6slx9 +SET devicefamily = spartan6 +SET flowvendor = Other +SET formalverification = false +SET foundationsym = false +SET implementationfiletype = Ngc +SET package = csg324 +SET removerpms = false +SET simulationfiles = Behavioral +SET speedgrade = -3 +SET verilogsim = true +SET vhdlsim = false +# END Project Options +# BEGIN Select +SELECT Block_Memory_Generator xilinx.com:ip:blk_mem_gen:7.3 +# END Select +# BEGIN Parameters +CSET additional_inputs_for_power_estimation=false +CSET algorithm=Minimum_Area +CSET assume_synchronous_clk=false +CSET axi_id_width=4 +CSET axi_slave_type=Memory_Slave +CSET axi_type=AXI4_Full +CSET byte_size=9 +CSET coe_file=no_coe_file_loaded +CSET collision_warnings=ALL +CSET component_name=logic_analyzer_data_storage +CSET disable_collision_warnings=false +CSET disable_out_of_range_warnings=false +CSET ecc=false +CSET ecctype=No_ECC +CSET enable_32bit_address=false +CSET enable_a=Always_Enabled +CSET enable_b=Always_Enabled +CSET error_injection_type=Single_Bit_Error_Injection +CSET fill_remaining_memory_locations=true +CSET interface_type=Native +CSET load_init_file=false +CSET mem_file=no_Mem_file_loaded +CSET memory_type=True_Dual_Port_RAM +CSET operating_mode_a=WRITE_FIRST +CSET operating_mode_b=WRITE_FIRST +CSET output_reset_value_a=0 +CSET output_reset_value_b=0 +CSET pipeline_stages=0 +CSET port_a_clock=100 +CSET port_a_enable_rate=100 +CSET port_a_write_rate=50 +CSET port_b_clock=100 +CSET port_b_enable_rate=100 +CSET port_b_write_rate=50 +CSET primitive=8kx2 +CSET read_width_a=64 +CSET read_width_b=64 +CSET register_porta_input_of_softecc=false +CSET register_porta_output_of_memory_core=false +CSET register_porta_output_of_memory_primitives=false +CSET register_portb_output_of_memory_core=false +CSET register_portb_output_of_memory_primitives=false +CSET register_portb_output_of_softecc=false +CSET remaining_memory_locations=AAAAAAAAAAAAAAAA +CSET reset_memory_latch_a=false +CSET reset_memory_latch_b=false +CSET reset_priority_a=CE +CSET reset_priority_b=CE +CSET reset_type=SYNC +CSET softecc=false +CSET use_axi_id=false +CSET use_bram_block=Stand_Alone +CSET use_byte_write_enable=false +CSET use_error_injection_pins=false +CSET use_regcea_pin=false +CSET use_regceb_pin=false +CSET use_rsta_pin=false +CSET use_rstb_pin=false +CSET write_depth_a=2048 +CSET write_width_a=64 +CSET write_width_b=64 +# END Parameters +# BEGIN Extra information +MISC pkg_timestamp=2012-11-19T16:22:25Z +# END Extra information +GENERATE +# CRC: 7f171f5 diff --git a/fpga/gpmc/xilinx/numato/spartan6/xc6slx9/lcd_data_storage.v b/fpga/gpmc/xilinx/numato/spartan6/xc6slx9/lcd_data_storage.v deleted file mode 120000 index 1c1aa6b..0000000 --- a/fpga/gpmc/xilinx/numato/spartan6/xc6slx9/lcd_data_storage.v +++ /dev/null @@ -1 +0,0 @@ -../../../common/lcd_data_storage.v \ No newline at end of file diff --git a/fpga/gpmc/xilinx/numato/spartan6/xc6slx9/logic_analyzer_clock_generator.v b/fpga/gpmc/xilinx/numato/spartan6/xc6slx9/logic_analyzer_clock_generator.v index f13b1e3..05e78dc 100644 --- a/fpga/gpmc/xilinx/numato/spartan6/xc6slx9/logic_analyzer_clock_generator.v +++ b/fpga/gpmc/xilinx/numato/spartan6/xc6slx9/logic_analyzer_clock_generator.v @@ -8,14 +8,23 @@ module logic_analyzer_clock_generator( input clkin, - output clkout); + output clkout, + output online); + + parameter LOGIC_ANALYZER_CLOCK_MULT = 2; + parameter LOGIC_ANALYZER_CLOCK_DIV = 2; wire clk0; wire clk2x; - reg reset; + wire clkfx; + reg reset = 1'b0; + wire locked; + wire [7:0] status; + + assign clkout = clkfx; - assign clkout = clk0; -// assign clkout = clk2x; + // Only signal online if the DCM is locked and clkfx is toggling + assign online = locked & (~status[2]); // DCM_SP: Digital Clock Manager // Spartan-6 @@ -24,8 +33,8 @@ module logic_analyzer_clock_generator( DCM_SP #( .CLKDV_DIVIDE(2.0), // CLKDV divide value // (1.5,2,2.5,3,3.5,4,4.5,5,5.5,6,6.5,7,7.5,8,9,10,11,12,13,14,15,16). - .CLKFX_DIVIDE(1), // Divide value on CLKFX outputs - D - (1-32) - .CLKFX_MULTIPLY(4), // Multiply value on CLKFX outputs - M - (2-32) + .CLKFX_DIVIDE(LOGIC_ANALYZER_CLOCK_DIV), // Divide value on CLKFX outputs - D - (1-32) + .CLKFX_MULTIPLY(LOGIC_ANALYZER_CLOCK_MULT), // Multiply value on CLKFX outputs - M - (2-32) .CLKIN_DIVIDE_BY_2("FALSE"), // CLKIN divide by two (TRUE/FALSE) .CLKIN_PERIOD(10.0), // Input clock period specified in nS .CLKOUT_PHASE_SHIFT("NONE"), // Output phase shift (NONE, FIXED, VARIABLE) @@ -47,11 +56,11 @@ module logic_analyzer_clock_generator( .CLK2X180(), // 1-bit output: 2X clock frequency, 180 degree clock output .CLK90(), // 1-bit output: 90 degree clock output .CLKDV(), // 1-bit output: Divided clock output - .CLKFX(), // 1-bit output: Digital Frequency Synthesizer output (DFS) + .CLKFX(clkfx), // 1-bit output: Digital Frequency Synthesizer output (DFS) .CLKFX180(), // 1-bit output: 180 degree CLKFX output - .LOCKED(), // 1-bit output: DCM_SP Lock Output + .LOCKED(locked), // 1-bit output: DCM_SP Lock Output .PSDONE(), // 1-bit output: Phase shift done output - .STATUS(), // 8-bit output: DCM_SP status output + .STATUS(status), // 8-bit output: DCM_SP status output .CLKFB(clk0), // 1-bit input: Clock feedback input .CLKIN(clkin), // 1-bit input: Clock input .DSSEN(1'b0), // 1-bit input: Unsupported, specify to GND. @@ -65,12 +74,11 @@ module logic_analyzer_clock_generator( reg [7:0] reset_counter = 8'b00000001; always @(posedge clkin) begin - if (reset_counter[7] != 1'b1) begin + if (reset_counter[7] == 1'b0) begin reset_counter = reset_counter << 1; reset = 1'b1; end else begin reset = 1'b0; end end - endmodule diff --git a/fpga/gpmc/xilinx/numato/spartan6/xc6slx9/logic_analyzer_data_storage.v b/fpga/gpmc/xilinx/numato/spartan6/xc6slx9/logic_analyzer_data_storage.v deleted file mode 120000 index 1e8f72d..0000000 --- a/fpga/gpmc/xilinx/numato/spartan6/xc6slx9/logic_analyzer_data_storage.v +++ /dev/null @@ -1 +0,0 @@ -../../../common/logic_analyzer_data_storage.v \ No newline at end of file diff --git a/fpga/gpmc/xilinx/numato/spartan6/xc6slx9/main.ucf b/fpga/gpmc/xilinx/numato/spartan6/xc6slx9/main.ucf index 8d5384f..1bfce49 100644 --- a/fpga/gpmc/xilinx/numato/spartan6/xc6slx9/main.ucf +++ b/fpga/gpmc/xilinx/numato/spartan6/xc6slx9/main.ucf @@ -1,42 +1,84 @@ -# (c) 2013 Timothy Pearson, Raptor Engineering +# (c) 2013-2014 Timothy Pearson, Raptor Engineering # Released into the Public Domain NET "clk" LOC = "V10" | IOSTANDARD = "LVCMOS33"; NET "clk" TNM_NET = clk; TIMESPEC TS_clk = PERIOD "clk" 100000 KHz HIGH 50%; +NET "main_clk" TNM_NET = main_clk; +TIMESPEC TS_main_clk = PERIOD "main_clk" 100000 KHz HIGH 50%; + +NET "gpmc_data<0>" OFFSET = OUT 8 ns AFTER "clk"; +NET "gpmc_data<1>" OFFSET = OUT 8 ns AFTER "clk"; +NET "gpmc_data<2>" OFFSET = OUT 8 ns AFTER "clk"; +NET "gpmc_data<3>" OFFSET = OUT 8 ns AFTER "clk"; +NET "gpmc_data<4>" OFFSET = OUT 8 ns AFTER "clk"; +NET "gpmc_data<5>" OFFSET = OUT 8 ns AFTER "clk"; +NET "gpmc_data<6>" OFFSET = OUT 8 ns AFTER "clk"; +NET "gpmc_data<7>" OFFSET = OUT 8 ns AFTER "clk"; + +NET "gpmc_data<0>" OFFSET = IN 8 ns VALID 10 ns BEFORE "clk"; +NET "gpmc_data<1>" OFFSET = IN 8 ns VALID 10 ns BEFORE "clk"; +NET "gpmc_data<2>" OFFSET = IN 8 ns VALID 10 ns BEFORE "clk"; +NET "gpmc_data<3>" OFFSET = IN 8 ns VALID 10 ns BEFORE "clk"; +NET "gpmc_data<4>" OFFSET = IN 8 ns VALID 10 ns BEFORE "clk"; +NET "gpmc_data<5>" OFFSET = IN 8 ns VALID 10 ns BEFORE "clk"; +NET "gpmc_data<6>" OFFSET = IN 8 ns VALID 10 ns BEFORE "clk"; +NET "gpmc_data<7>" OFFSET = IN 8 ns VALID 10 ns BEFORE "clk"; + +NET "gpmc_address<0>" OFFSET = IN 8 ns VALID 10 ns BEFORE "clk"; +NET "gpmc_address<1>" OFFSET = IN 8 ns VALID 10 ns BEFORE "clk"; +NET "gpmc_address<2>" OFFSET = IN 8 ns VALID 10 ns BEFORE "clk"; +NET "gpmc_address<3>" OFFSET = IN 8 ns VALID 10 ns BEFORE "clk"; +NET "gpmc_address<4>" OFFSET = IN 8 ns VALID 10 ns BEFORE "clk"; +NET "gpmc_address<5>" OFFSET = IN 8 ns VALID 10 ns BEFORE "clk"; +NET "gpmc_address<6>" OFFSET = IN 8 ns VALID 10 ns BEFORE "clk"; +NET "gpmc_address<7>" OFFSET = IN 8 ns VALID 10 ns BEFORE "clk"; +NET "gpmc_address<8>" OFFSET = IN 8 ns VALID 10 ns BEFORE "clk"; +NET "gpmc_address<9>" OFFSET = IN 8 ns VALID 10 ns BEFORE "clk"; +NET "gpmc_address<10>" OFFSET = IN 8 ns VALID 10 ns BEFORE "clk"; +NET "gpmc_address<11>" OFFSET = IN 8 ns VALID 10 ns BEFORE "clk"; +NET "gpmc_address<12>" OFFSET = IN 8 ns VALID 10 ns BEFORE "clk"; +NET "gpmc_address<13>" OFFSET = IN 8 ns VALID 10 ns BEFORE "clk"; +NET "gpmc_address<14>" OFFSET = IN 8 ns VALID 10 ns BEFORE "clk"; +NET "gpmc_address<15>" OFFSET = IN 8 ns VALID 10 ns BEFORE "clk"; + +NET "gpmc_advn" OFFSET = IN 8 ns VALID 10 ns BEFORE "clk"; +NET "gpmc_oen" OFFSET = IN 8 ns VALID 10 ns BEFORE "clk"; +NET "gpmc_wen" OFFSET = IN 8 ns VALID 10 ns BEFORE "clk"; + #NET "serial_input" LOC = "T12" | IOSTANDARD = "LVCMOS33"; #NET "serial_output" LOC = "M10" | SLEW = FAST | IOSTANDARD = "LVCMOS33"; -NET "gpmc_advn" LOC = "C5" | IOSTANDARD = "LVCMOS33"; -NET "gpmc_oen" LOC = "A3" | IOSTANDARD = "LVCMOS33"; -NET "gpmc_wen" LOC = "A5" | IOSTANDARD = "LVCMOS33"; - -NET "gpmc_data<0>" LOC = "A6" | SLEW = FAST | IOSTANDARD = "LVCMOS33"; -NET "gpmc_data<1>" LOC = "C8" | SLEW = FAST | IOSTANDARD = "LVCMOS33"; -NET "gpmc_data<2>" LOC = "C9" | SLEW = FAST | IOSTANDARD = "LVCMOS33"; -NET "gpmc_data<3>" LOC = "A10" | SLEW = FAST | IOSTANDARD = "LVCMOS33"; -NET "gpmc_data<4>" LOC = "C10" | SLEW = FAST | IOSTANDARD = "LVCMOS33"; -NET "gpmc_data<5>" LOC = "D9" | SLEW = FAST | IOSTANDARD = "LVCMOS33"; -NET "gpmc_data<6>" LOC = "D8" | SLEW = FAST | IOSTANDARD = "LVCMOS33"; -NET "gpmc_data<7>" LOC = "B6" | SLEW = FAST | IOSTANDARD = "LVCMOS33"; - -NET "gpmc_address<0>" LOC = "A11" | IOSTANDARD = "LVCMOS33"; -NET "gpmc_address<1>" LOC = "F9" | IOSTANDARD = "LVCMOS33"; -NET "gpmc_address<2>" LOC = "A9" | IOSTANDARD = "LVCMOS33"; -NET "gpmc_address<3>" LOC = "A8" | IOSTANDARD = "LVCMOS33"; -NET "gpmc_address<4>" LOC = "A7" | IOSTANDARD = "LVCMOS33"; -NET "gpmc_address<5>" LOC = "C6" | IOSTANDARD = "LVCMOS33"; -NET "gpmc_address<6>" LOC = "A4" | IOSTANDARD = "LVCMOS33"; -NET "gpmc_address<7>" LOC = "A2" | IOSTANDARD = "LVCMOS33"; -NET "gpmc_address<8>" LOC = "B11" | IOSTANDARD = "LVCMOS33"; -NET "gpmc_address<9>" LOC = "G9" | IOSTANDARD = "LVCMOS33"; -NET "gpmc_address<10>" LOC = "B9" | IOSTANDARD = "LVCMOS33"; -NET "gpmc_address<11>" LOC = "B8" | IOSTANDARD = "LVCMOS33"; -NET "gpmc_address<12>" LOC = "C7" | IOSTANDARD = "LVCMOS33"; -NET "gpmc_address<13>" LOC = "D6" | IOSTANDARD = "LVCMOS33"; -NET "gpmc_address<14>" LOC = "B4" | IOSTANDARD = "LVCMOS33"; -NET "gpmc_address<15>" LOC = "B2" | IOSTANDARD = "LVCMOS33"; - -NET "usermem_wen" LOC = "V16" | IOSTANDARD = "LVCMOS33"; +NET "gpmc_advn" LOC = "C5" | FLOAT | IOSTANDARD = "LVCMOS33"; +NET "gpmc_oen" LOC = "A3" | FLOAT | IOSTANDARD = "LVCMOS33"; +NET "gpmc_wen" LOC = "A5" | FLOAT | IOSTANDARD = "LVCMOS33"; + +NET "gpmc_data<0>" LOC = "A6" | SLEW = FAST | FLOAT | IOSTANDARD = "LVCMOS33"; +NET "gpmc_data<1>" LOC = "C8" | SLEW = FAST | FLOAT | IOSTANDARD = "LVCMOS33"; +NET "gpmc_data<2>" LOC = "C9" | SLEW = FAST | FLOAT | IOSTANDARD = "LVCMOS33"; +NET "gpmc_data<3>" LOC = "A10" | SLEW = FAST | FLOAT | IOSTANDARD = "LVCMOS33"; +NET "gpmc_data<4>" LOC = "C10" | SLEW = FAST | FLOAT | IOSTANDARD = "LVCMOS33"; +NET "gpmc_data<5>" LOC = "D9" | SLEW = FAST | FLOAT | IOSTANDARD = "LVCMOS33"; +NET "gpmc_data<6>" LOC = "D8" | SLEW = FAST | FLOAT | IOSTANDARD = "LVCMOS33"; +NET "gpmc_data<7>" LOC = "B6" | SLEW = FAST | FLOAT | IOSTANDARD = "LVCMOS33"; + +NET "gpmc_address<0>" LOC = "A11" | FLOAT | IOSTANDARD = "LVCMOS33"; +NET "gpmc_address<1>" LOC = "F9" | FLOAT | IOSTANDARD = "LVCMOS33"; +NET "gpmc_address<2>" LOC = "A9" | FLOAT | IOSTANDARD = "LVCMOS33"; +NET "gpmc_address<3>" LOC = "A8" | FLOAT | IOSTANDARD = "LVCMOS33"; +NET "gpmc_address<4>" LOC = "A7" | FLOAT | IOSTANDARD = "LVCMOS33"; +NET "gpmc_address<5>" LOC = "C6" | FLOAT | IOSTANDARD = "LVCMOS33"; +NET "gpmc_address<6>" LOC = "A4" | FLOAT | IOSTANDARD = "LVCMOS33"; +NET "gpmc_address<7>" LOC = "A2" | FLOAT | IOSTANDARD = "LVCMOS33"; +NET "gpmc_address<8>" LOC = "B11" | FLOAT | IOSTANDARD = "LVCMOS33"; +NET "gpmc_address<9>" LOC = "G9" | FLOAT | IOSTANDARD = "LVCMOS33"; +NET "gpmc_address<10>" LOC = "B9" | FLOAT | IOSTANDARD = "LVCMOS33"; +NET "gpmc_address<11>" LOC = "B8" | FLOAT | IOSTANDARD = "LVCMOS33"; +NET "gpmc_address<12>" LOC = "C7" | FLOAT | IOSTANDARD = "LVCMOS33"; +NET "gpmc_address<13>" LOC = "D6" | FLOAT | IOSTANDARD = "LVCMOS33"; +NET "gpmc_address<14>" LOC = "B4" | FLOAT | IOSTANDARD = "LVCMOS33"; +NET "gpmc_address<15>" LOC = "B2" | FLOAT | IOSTANDARD = "LVCMOS33"; + +NET "usermem_wen" LOC = "V16" | PULLUP | IOSTANDARD = "LVCMOS33"; NET "usermem_wait" LOC = "T18" | SLEW = FAST | IOSTANDARD = "LVCMOS33"; NET "userproc_start" LOC = "K16" | SLEW = FAST | IOSTANDARD = "LVCMOS33"; NET "userproc_done" LOC = "L13" | IOSTANDARD = "LVCMOS33"; diff --git a/fpga/gpmc/xilinx/numato/spartan6/xc6slx9/main_clock_generator.v b/fpga/gpmc/xilinx/numato/spartan6/xc6slx9/main_clock_generator.v new file mode 100644 index 0000000..b867c02 --- /dev/null +++ b/fpga/gpmc/xilinx/numato/spartan6/xc6slx9/main_clock_generator.v @@ -0,0 +1,20 @@ +`timescale 1ns / 1ps +////////////////////////////////////////////////////////////////////////////////// +// +// (c) 2014 Timothy Pearson, Raptor Engineering +// Released into the Public Domain +// +////////////////////////////////////////////////////////////////////////////////// + +module main_clock_generator( + input clkin, + output clkout, + output online); + + assign online = 1'b1; + + BUFG BUFG_inst ( + .O(clkout), // 1-bit output: Clock buffer output + .I(clkin) // 1-bit input: Clock buffer input + ); +endmodule \ No newline at end of file diff --git a/fpga/gpmc/xilinx/numato/spartan6/xc6slx9/ulab_debug_interface.xise b/fpga/gpmc/xilinx/numato/spartan6/xc6slx9/ulab_debug_interface.xise index 774cabd..dfb47cf 100644 --- a/fpga/gpmc/xilinx/numato/spartan6/xc6slx9/ulab_debug_interface.xise +++ b/fpga/gpmc/xilinx/numato/spartan6/xc6slx9/ulab_debug_interface.xise @@ -16,28 +16,44 @@ - + - - - - - + - - + + + + + + - - + + + + + + + + + + + + + + + + + + @@ -151,7 +167,7 @@ - + @@ -227,7 +243,7 @@ - + @@ -269,7 +285,7 @@ - + @@ -281,27 +297,28 @@ - - - + + + + - + - + - - - + + + @@ -349,12 +366,12 @@ - + - - + + diff --git a/fpga/gpmc/xilinx/numato/spartan6/xc6slx9/verification.v b/fpga/gpmc/xilinx/numato/spartan6/xc6slx9/verification.v new file mode 120000 index 0000000..2a3bfa8 --- /dev/null +++ b/fpga/gpmc/xilinx/numato/spartan6/xc6slx9/verification.v @@ -0,0 +1 @@ +../../../common/verification.v \ No newline at end of file diff --git a/lib/libtqtrla/src/tqtrla.cpp b/lib/libtqtrla/src/tqtrla.cpp index 4bbae6f..cf6493d 100644 --- a/lib/libtqtrla/src/tqtrla.cpp +++ b/lib/libtqtrla/src/tqtrla.cpp @@ -20,16 +20,18 @@ #include "tqtrla.h" +#include + #include #include +#include #include #include -// RAJA UNCOMMENT ME -//#define SERVER_TIMEOUT_MS 10000 -// RAJA DEBUG ONLY -#define SERVER_TIMEOUT_MS 100000 +#include + +#define SERVER_TIMEOUT_MS 10000 #define FPGA_DATA_PROCESSING_TIMEOUT_MS 2500 namespace KParts @@ -106,6 +108,42 @@ namespace KParts } } + int RemoteInstrumentPart::getNewTicket() { + int ret = -1; + + TQWidget* parentWidget = dynamic_cast(parent()); + if (!parentWidget) { + return ret; + } + + LDAPCredentials credentials; + KerberosTicketInfoList ticketList = LDAPManager::getKerberosTicketList(); + if (ticketList.count() > 0) { + TQStringList princParts = TQStringList::split("@", ticketList[0].cachePrincipal); + credentials.username = princParts[0]; + credentials.realm = princParts[1]; + } + else { + struct passwd* pwd = getpwuid(geteuid()); + if (pwd) { + credentials.username = TQString(pwd->pw_name); + } + } + int result = LDAPManager::getKerberosPassword(credentials, i18n("Please provide Kerberos credentials"), false, parentWidget); + if (result == KDialog::Accepted) { + TQString errorstring; + TQString service; + if (LDAPManager::obtainKerberosTicket(credentials, service, &errorstring) != 0) { + KMessageBox::error(parentWidget, i18n("Failed to obtain ticket

%1").arg(errorstring), i18n("Failed to obtain Kerberos ticket")); + } + else { + ret = 0; + } + } + + return ret; + } + void RemoteInstrumentPart::setStatusMessage(const TQString& message) { emit(statusMessageSet(message)); } @@ -147,9 +185,10 @@ namespace KParts m_socket = new TDEKerberosClientSocket(this); connect(m_socket, TQT_SIGNAL(statusMessageUpdated(const TQString&)), this, TQT_SLOT(setStatusMessage(const TQString&) )); } + m_hostName = server; m_socket->setServiceName("ulab"); - m_socket->setServerFQDN(server); - m_socket->connectToHost(server, 4004); + m_socket->setServerFQDN(m_hostName); + m_socket->connectToHost(m_hostName, 4004); // Finish connecting when appropriate connToServerState = 0; @@ -221,12 +260,27 @@ namespace KParts } else { if (m_socket->kerberosStatus() != TDEKerberosClientSocket::KerberosInUse) { - connToServerState = -1; - connToServerConnecting = false; - disconnectFromServer(); - KMessageBox::error(0, i18n("Unable to establish Kerberos protocol with remote server

Please verify that you currently hold a valid Kerberos ticket"), i18n("Connection Failed")); - close(); - return; + // Try to get a valid ticket + if (getNewTicket() == 0) { + // Retry connection if no obvious errors were detected + m_connectionTimer->stop(); + if (m_socket) { + m_socket->clearPendingData(); + m_socket->close(); + delete m_socket; + m_socket = NULL; + } + connectToServer(m_hostName); + return; + } + else { + connToServerState = -1; + connToServerConnecting = false; + disconnectFromServer(); + KMessageBox::error(0, i18n("Unable to establish Kerberos protocol with remote server

Please verify that you currently hold a valid Kerberos ticket"), i18n("Connection Failed")); + close(); + return; + } } else { connToServerState = 2; diff --git a/lib/libtqtrla/src/tqtrla.h b/lib/libtqtrla/src/tqtrla.h index 16501db..8351196 100644 --- a/lib/libtqtrla/src/tqtrla.h +++ b/lib/libtqtrla/src/tqtrla.h @@ -74,6 +74,9 @@ namespace KParts void setMDIMainForm(KMdiMainFrm* form); KMdiMainFrm* mdiMainForm(); + private: + int getNewTicket(); + private slots: void finishConnectingToServer(); virtual void connectionFinishedCallback(); @@ -102,6 +105,7 @@ namespace KParts TQTimer *connToServerTimeoutTimer; bool m_fixedSize; KMdiMainFrm* m_mdiMainForm; + TQString m_hostName; private: RemoteInstrumentPartPrivate *d;