From 84442aa32e6fbd13955d319e18773ca9d46760be Mon Sep 17 00:00:00 2001 From: Sylvain Dupuy <sylvain.dupuy@synchrotron-soleil.fr> Date: Mon, 6 Dec 2004 10:23:38 +0000 Subject: [PATCH] initial import --- doc/DeviceServerUsersGuide_en.doc | Bin 0 -> 103936 bytes doc/Doxyfile | 831 +++++++++++++++++ doc/doc_html/Attributes.html | 105 +++ doc/doc_html/Description | 62 ++ doc/doc_html/DevCommands.html | 143 +++ doc/doc_html/DevCommandsFrame.html | 20 + doc/doc_html/DevCommandsList.html | 20 + doc/doc_html/DevCommandsTable.html | 85 ++ doc/doc_html/Properties.html | 190 ++++ doc/doc_html/TangoDevStates.html | 74 ++ doc/doc_html/index.html | 86 ++ scripts/load_sine_chan4.py | 44 + scripts/load_square_chan0.py | 46 + src/ADLinkContinuousAO.cpp | 35 + src/ADLinkContinuousAO.h | 39 + src/ClassFactory.cpp | 47 + src/ContinuousAO.cpp | 1343 ++++++++++++++++++++++++++++ src/ContinuousAO.h | 335 +++++++ src/ContinuousAOClass.cpp | 588 ++++++++++++ src/ContinuousAOClass.h | 110 +++ src/Doxyfile | 831 +++++++++++++++++ src/Makefile | 91 ++ src/Makefile.VC | 38 + src/README | 40 + src/main.cpp | 72 ++ 25 files changed, 5275 insertions(+) create mode 100644 doc/DeviceServerUsersGuide_en.doc create mode 100644 doc/Doxyfile create mode 100644 doc/doc_html/Attributes.html create mode 100644 doc/doc_html/Description create mode 100644 doc/doc_html/DevCommands.html create mode 100644 doc/doc_html/DevCommandsFrame.html create mode 100644 doc/doc_html/DevCommandsList.html create mode 100644 doc/doc_html/DevCommandsTable.html create mode 100644 doc/doc_html/Properties.html create mode 100644 doc/doc_html/TangoDevStates.html create mode 100644 doc/doc_html/index.html create mode 100644 scripts/load_sine_chan4.py create mode 100644 scripts/load_square_chan0.py create mode 100644 src/ADLinkContinuousAO.cpp create mode 100644 src/ADLinkContinuousAO.h create mode 100644 src/ClassFactory.cpp create mode 100644 src/ContinuousAO.cpp create mode 100644 src/ContinuousAO.h create mode 100644 src/ContinuousAOClass.cpp create mode 100644 src/ContinuousAOClass.h create mode 100644 src/Doxyfile create mode 100644 src/Makefile create mode 100644 src/Makefile.VC create mode 100644 src/README create mode 100644 src/main.cpp diff --git a/doc/DeviceServerUsersGuide_en.doc b/doc/DeviceServerUsersGuide_en.doc new file mode 100644 index 0000000000000000000000000000000000000000..739e7ee92579db0bf1d47b623f66a43c617574ae GIT binary patch literal 103936 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�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 F007^myVn2! literal 0 HcmV?d00001 diff --git a/doc/Doxyfile b/doc/Doxyfile new file mode 100644 index 0000000..c4b1a99 --- /dev/null +++ b/doc/Doxyfile @@ -0,0 +1,831 @@ +# Doxyfile 1.2.10 + +# This file describes the settings to be used by the documentation system +# doxygen (www.doxygen.org) for a project +# +# All text after a hash (#) is considered a comment and will be ignored +# The format is: +# TAG = value [value, ...] +# For lists items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (" ") + +#--------------------------------------------------------------------------- +# General configuration options +#--------------------------------------------------------------------------- + +# The PROJECT_NAME tag is a single word (or a sequence of words surrounded +# by quotes) that should identify the project. + +PROJECT_NAME = "Continuous Anolog Output" + +# The PROJECT_NUMBER tag can be used to enter a project or revision number. +# This could be handy for archiving the generated documentation or +# if some version control system is used. + +PROJECT_NUMBER = + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) +# base path where the generated documentation will be put. +# If a relative path is entered, it will be relative to the location +# where doxygen was started. If left blank the current directory will be used. + +OUTPUT_DIRECTORY = F:\test_AO\ContinuousAO/doc_html + +# The OUTPUT_LANGUAGE tag is used to specify the language in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all constant output in the proper language. +# The default language is English, other supported languages are: +# Brazilian, Chinese, Croatian, Czech, Danish, Dutch, Finnish, French, +# German, Hungarian, Italian, Japanese, Korean, Norwegian, Polish, +# Portuguese, Romanian, Russian, Slovak, Slovene, Spanish and Swedish. + +OUTPUT_LANGUAGE = English + +# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in +# documentation are documented, even if no documentation was available. +# Private class members and static file members will be hidden unless +# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES + +EXTRACT_ALL = YES + +# If the EXTRACT_PRIVATE tag is set to YES all private members of a class +# will be included in the documentation. + +EXTRACT_PRIVATE = NO + +# If the EXTRACT_STATIC tag is set to YES all static members of a file +# will be included in the documentation. + +EXTRACT_STATIC = YES + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all +# undocumented members of documented classes, files or namespaces. +# If set to NO (the default) these members will be included in the +# various overviews, but no documentation section is generated. +# This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_MEMBERS = NO + +# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. +# If set to NO (the default) these class will be included in the various +# overviews. This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_CLASSES = NO + +# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will +# include brief member descriptions after the members that are listed in +# the file and class documentation (similar to JavaDoc). +# Set to NO to disable this. + +BRIEF_MEMBER_DESC = YES + +# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend +# the brief description of a member or function before the detailed description. +# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# brief descriptions will be completely suppressed. + +REPEAT_BRIEF = YES + +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then +# Doxygen will generate a detailed section even if there is only a brief +# description. + +ALWAYS_DETAILED_SEC = NO + +# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full +# path before files name in the file list and in the header files. If set +# to NO the shortest path that makes the file name unique will be used. + +FULL_PATH_NAMES = NO + +# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag +# can be used to strip a user defined part of the path. Stripping is +# only done if one of the specified strings matches the left-hand part of +# the path. It is allowed to use relative paths in the argument list. + +STRIP_FROM_PATH = + +# The INTERNAL_DOCS tag determines if documentation +# that is typed after a \internal command is included. If the tag is set +# to NO (the default) then the documentation will be excluded. +# Set it to YES to include the internal documentation. + +INTERNAL_DOCS = NO + +# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will +# generate a class diagram (in Html and LaTeX) for classes with base or +# super classes. Setting the tag to NO turns the diagrams off. + +CLASS_DIAGRAMS = YES + +# If the SOURCE_BROWSER tag is set to YES then a list of source files will +# be generated. Documented entities will be cross-referenced with these sources. + +SOURCE_BROWSER = NO + +# Setting the INLINE_SOURCES tag to YES will include the body +# of functions and classes directly in the documentation. + +INLINE_SOURCES = NO + +# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct +# doxygen to hide any special comment blocks from generated source code +# fragments. Normal C and C++ comments will always remain visible. + +STRIP_CODE_COMMENTS = YES + +# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate +# file names in lower case letters. If set to YES upper case letters are also +# allowed. This is useful if you have classes or files whose names only differ +# in case and if your file system supports case sensitive file names. Windows +# users are adviced to set this option to NO. + +CASE_SENSE_NAMES = YES + +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter +# (but less readable) file names. This can be useful is your file systems +# doesn't support long names like on DOS, Mac, or CD-ROM. + +SHORT_NAMES = NO + +# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen +# will show members with their full class and namespace scopes in the +# documentation. If set to YES the scope will be hidden. + +HIDE_SCOPE_NAMES = NO + +# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen +# will generate a verbatim copy of the header file for each class for +# which an include is specified. Set to NO to disable this. + +VERBATIM_HEADERS = YES + +# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen +# will put list of the files that are included by a file in the documentation +# of that file. + +SHOW_INCLUDE_FILES = YES + +# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen +# will interpret the first line (until the first dot) of a JavaDoc-style +# comment as the brief description. If set to NO, the JavaDoc +# comments will behave just like the Qt-style comments (thus requiring an +# explict @brief command for a brief description. + +JAVADOC_AUTOBRIEF = YES + +# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented +# member inherits the documentation from any documented member that it +# reimplements. + +INHERIT_DOCS = YES + +# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] +# is inserted in the documentation for inline members. + +INLINE_INFO = YES + +# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen +# will sort the (detailed) documentation of file and class members +# alphabetically by member name. If set to NO the members will appear in +# declaration order. + +SORT_MEMBER_DOCS = YES + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES, then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. + +DISTRIBUTE_GROUP_DOC = NO + +# The TAB_SIZE tag can be used to set the number of spaces in a tab. +# Doxygen uses this value to replace tabs by spaces in code fragments. + +TAB_SIZE = 8 + +# The GENERATE_TODOLIST tag can be used to enable (YES) or +# disable (NO) the todo list. This list is created by putting \todo +# commands in the documentation. + +GENERATE_TODOLIST = YES + +# The GENERATE_TESTLIST tag can be used to enable (YES) or +# disable (NO) the test list. This list is created by putting \test +# commands in the documentation. + +GENERATE_TESTLIST = YES + +# The GENERATE_BUGLIST tag can be used to enable (YES) or +# disable (NO) the bug list. This list is created by putting \bug +# commands in the documentation. + +GENERATE_BUGLIST = YES + +# This tag can be used to specify a number of aliases that acts +# as commands in the documentation. An alias has the form "name=value". +# For example adding "sideeffect=\par Side Effects:\n" will allow you to +# put the command \sideeffect (or @sideeffect) in the documentation, which +# will result in a user defined paragraph with heading "Side Effects:". +# You can put \n's in the value part of an alias to insert newlines. + +ALIASES = + +# The ENABLED_SECTIONS tag can be used to enable conditional +# documentation sections, marked by \if sectionname ... \endif. + +ENABLED_SECTIONS = + +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines +# the initial value of a variable or define consist of for it to appear in +# the documentation. If the initializer consists of more lines than specified +# here it will be hidden. Use a value of 0 to hide initializers completely. +# The appearance of the initializer of individual variables and defines in the +# documentation can be controlled using \showinitializer or \hideinitializer +# command in the documentation regardless of this setting. + +MAX_INITIALIZER_LINES = 30 + +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources +# only. Doxygen will then generate output that is more tailored for C. +# For instance some of the names that are used will be different. The list +# of all members will be omitted, etc. + +OPTIMIZE_OUTPUT_FOR_C = NO + +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated +# at the bottom of the documentation of classes and structs. If set to YES the +# list will mention the files that were used to generate the documentation. + +SHOW_USED_FILES = YES + +#--------------------------------------------------------------------------- +# configuration options related to warning and progress messages +#--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated +# by doxygen. Possible values are YES and NO. If left blank NO is used. + +QUIET = NO + +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated by doxygen. Possible values are YES and NO. If left blank +# NO is used. + +WARNINGS = YES + +# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings +# for undocumented members. If EXTRACT_ALL is set to YES then this flag will +# automatically be disabled. + +WARN_IF_UNDOCUMENTED = YES + +# The WARN_FORMAT tag determines the format of the warning messages that +# doxygen can produce. The string should contain the $file, $line, and $text +# tags, which will be replaced by the file and line number from which the +# warning originated and the warning text. + +WARN_FORMAT = + +# The WARN_LOGFILE tag can be used to specify a file to which warning +# and error messages should be written. If left blank the output is written +# to stderr. + +WARN_LOGFILE = + +#--------------------------------------------------------------------------- +# configuration options related to the input files +#--------------------------------------------------------------------------- + +# The INPUT tag can be used to specify the files and/or directories that contain +# documented source files. You may enter file names like "myfile.cpp" or +# directories like "/usr/src/myproject". Separate the files or directories +# with spaces. + +INPUT = F:\test_AO\ContinuousAO + +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank all files are included. + +FILE_PATTERNS = *.h *.cpp + +# The RECURSIVE tag can be used to turn specify whether or not subdirectories +# should be searched for input files as well. Possible values are YES and NO. +# If left blank NO is used. + +RECURSIVE = NO + +# The EXCLUDE tag can be used to specify files and/or directories that should +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. + +EXCLUDE = + +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. + +EXCLUDE_PATTERNS = + +# The EXAMPLE_PATH tag can be used to specify one or more files or +# directories that contain example code fragments that are included (see +# the \include command). + +EXAMPLE_PATH = + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank all files are included. + +EXAMPLE_PATTERNS = + +# The IMAGE_PATH tag can be used to specify one or more files or +# directories that contain image that are included in the documentation (see +# the \image command). + +IMAGE_PATH = + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command <filter> <input-file>, where <filter> +# is the value of the INPUT_FILTER tag, and <input-file> is the name of an +# input file. Doxygen will then use the output that the filter program writes +# to standard output. + +INPUT_FILTER = + +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# INPUT_FILTER) will be used to filter the input files when producing source +# files to browse. + +FILTER_SOURCE_FILES = NO + +#--------------------------------------------------------------------------- +# configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- + +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index +# of all compounds will be generated. Enable this if the project +# contains a lot of classes, structs, unions or interfaces. + +ALPHABETICAL_INDEX = YES + +# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then +# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns +# in which this list will be split (can be a number in the range [1..20]) + +COLS_IN_ALPHA_INDEX = 5 + +# In case all classes in a project start with a common prefix, all +# classes will be put under the same header in the alphabetical index. +# The IGNORE_PREFIX tag can be used to specify one or more prefixes that +# should be ignored while generating the index headers. + +IGNORE_PREFIX = + +#--------------------------------------------------------------------------- +# configuration options related to the HTML output +#--------------------------------------------------------------------------- + +# If the GENERATE_HTML tag is set to YES (the default) Doxygen will +# generate HTML output. + +GENERATE_HTML = YES + +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `html' will be used as the default path. + +HTML_OUTPUT = + +# The HTML_HEADER tag can be used to specify a personal HTML header for +# each generated HTML page. If it is left blank doxygen will generate a +# standard header. + +HTML_HEADER = /segfs/tango/templates/pogo/html/header.html + +# The HTML_FOOTER tag can be used to specify a personal HTML footer for +# each generated HTML page. If it is left blank doxygen will generate a +# standard footer. + +HTML_FOOTER = /segfs/tango/templates/pogo/html/footer.html + +# The HTML_STYLESHEET tag can be used to specify a user defined cascading +# style sheet that is used by each HTML page. It can be used to +# fine-tune the look of the HTML output. If the tag is left blank doxygen +# will generate a default style sheet + +HTML_STYLESHEET = + +# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, +# files or namespaces will be aligned in HTML using tables. If set to +# NO a bullet list will be used. + +HTML_ALIGN_MEMBERS = YES + +# If the GENERATE_HTMLHELP tag is set to YES, additional index files +# will be generated that can be used as input for tools like the +# Microsoft HTML help workshop to generate a compressed HTML help file (.chm) +# of the generated HTML documentation. + +GENERATE_HTMLHELP = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag +# controls if a separate .chi index file is generated (YES) or that +# it should be included in the master .chm file (NO). + +GENERATE_CHI = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag +# controls whether a binary table of contents is generated (YES) or a +# normal table of contents (NO) in the .chm file. + +BINARY_TOC = NO + +# The TOC_EXPAND flag can be set to YES to add extra items for group members +# to the contents of the Html help documentation and to the tree view. + +TOC_EXPAND = NO + +# The DISABLE_INDEX tag can be used to turn on/off the condensed index at +# top of each HTML page. The value NO (the default) enables the index and +# the value YES disables it. + +DISABLE_INDEX = NO + +# This tag can be used to set the number of enum values (range [1..20]) +# that doxygen will group on one line in the generated HTML documentation. + +ENUM_VALUES_PER_LINE = 4 + +# If the GENERATE_TREEVIEW tag is set to YES, a side panel will be +# generated containing a tree-like index structure (just like the one that +# is generated for HTML Help). For this to work a browser that supports +# JavaScript and frames is required (for instance Netscape 4.0+ +# or Internet explorer 4.0+). + +GENERATE_TREEVIEW = YES + +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be +# used to set the initial width (in pixels) of the frame in which the tree +# is shown. + +TREEVIEW_WIDTH = 250 + +#--------------------------------------------------------------------------- +# configuration options related to the LaTeX output +#--------------------------------------------------------------------------- + +# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will +# generate Latex output. + +GENERATE_LATEX = YES + +# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `latex' will be used as the default path. + +LATEX_OUTPUT = + +# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact +# LaTeX documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_LATEX = NO + +# The PAPER_TYPE tag can be used to set the paper type that is used +# by the printer. Possible values are: a4, a4wide, letter, legal and +# executive. If left blank a4wide will be used. + +PAPER_TYPE = a4wide + +# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX +# packages that should be included in the LaTeX output. + +EXTRA_PACKAGES = + +# The LATEX_HEADER tag can be used to specify a personal LaTeX header for +# the generated latex document. The header should contain everything until +# the first chapter. If it is left blank doxygen will generate a +# standard header. Notice: only use this tag if you know what you are doing! + +LATEX_HEADER = + +# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated +# is prepared for conversion to pdf (using ps2pdf). The pdf file will +# contain links (just like the HTML output) instead of page references +# This makes the output suitable for online browsing using a pdf viewer. + +PDF_HYPERLINKS = NO + +# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of +# plain latex in the generated Makefile. Set this option to YES to get a +# higher quality PDF documentation. + +USE_PDFLATEX = NO + +# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. +# command to the generated LaTeX files. This will instruct LaTeX to keep +# running if errors occur, instead of asking the user for help. +# This option is also used when generating formulas in HTML. + +LATEX_BATCHMODE = NO + +#--------------------------------------------------------------------------- +# configuration options related to the RTF output +#--------------------------------------------------------------------------- + +# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output +# The RTF output is optimised for Word 97 and may not look very pretty with +# other RTF readers or editors. + +GENERATE_RTF = NO + +# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `rtf' will be used as the default path. + +RTF_OUTPUT = + +# If the COMPACT_RTF tag is set to YES Doxygen generates more compact +# RTF documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_RTF = NO + +# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated +# will contain hyperlink fields. The RTF file will +# contain links (just like the HTML output) instead of page references. +# This makes the output suitable for online browsing using WORD or other +# programs which support those fields. +# Note: wordpad (write) and others do not support links. + +RTF_HYPERLINKS = YES + +# Load stylesheet definitions from file. Syntax is similar to doxygen's +# config file, i.e. a series of assigments. You only have to provide +# replacements, missing definitions are set to their default value. + +RTF_STYLESHEET_FILE = + +# Set optional variables used in the generation of an rtf document. +# Syntax is similar to doxygen's config file. + +RTF_EXTENSIONS_FILE = + +#--------------------------------------------------------------------------- +# configuration options related to the man page output +#--------------------------------------------------------------------------- + +# If the GENERATE_MAN tag is set to YES (the default) Doxygen will +# generate man pages + +GENERATE_MAN = NO + +# The MAN_OUTPUT tag is used to specify where the man pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `man' will be used as the default path. + +MAN_OUTPUT = + +# The MAN_EXTENSION tag determines the extension that is added to +# the generated man pages (default is the subroutine's section .3) + +MAN_EXTENSION = + +# If the MAN_LINKS tag is set to YES and Doxygen generates man output, +# then it will generate one additional man file for each entity +# documented in the real man page(s). These additional files +# only source the real man page, but without them the man command +# would be unable to find the correct page. The default is NO. + +MAN_LINKS = NO + +#--------------------------------------------------------------------------- +# configuration options related to the XML output +#--------------------------------------------------------------------------- + +# If the GENERATE_XML tag is set to YES Doxygen will +# generate an XML file that captures the structure of +# the code including all documentation. Note that this +# feature is still experimental and incomplete at the +# moment. + +GENERATE_XML = NO + +#--------------------------------------------------------------------------- +# Configuration options related to the preprocessor +#--------------------------------------------------------------------------- + +# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will +# evaluate all C-preprocessor directives found in the sources and include +# files. + +ENABLE_PREPROCESSING = YES + +# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro +# names in the source code. If set to NO (the default) only conditional +# compilation will be performed. Macro expansion can be done in a controlled +# way by setting EXPAND_ONLY_PREDEF to YES. + +MACRO_EXPANSION = NO + +# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES +# then the macro expansion is limited to the macros specified with the +# PREDEFINED and EXPAND_AS_PREDEFINED tags. + +EXPAND_ONLY_PREDEF = NO + +# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files +# in the INCLUDE_PATH (see below) will be search if a #include is found. + +SEARCH_INCLUDES = YES + +# The INCLUDE_PATH tag can be used to specify one or more directories that +# contain include files that are not input files but should be processed by +# the preprocessor. + +INCLUDE_PATH = + +# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard +# patterns (like *.h and *.hpp) to filter out the header-files in the +# directories. If left blank, the patterns specified with FILE_PATTERNS will +# be used. + +INCLUDE_FILE_PATTERNS = + +# The PREDEFINED tag can be used to specify one or more macro names that +# are defined before the preprocessor is started (similar to the -D option of +# gcc). The argument of the tag is a list of macros of the form: name +# or name=definition (no spaces). If the definition and the = are +# omitted =1 is assumed. + +PREDEFINED = + +# If the MACRO_EXPANSION and EXPAND_PREDEF_ONLY tags are set to YES then +# this tag can be used to specify a list of macro names that should be expanded. +# The macro definition that is found in the sources will be used. +# Use the PREDEFINED tag if you want to use a different macro definition. + +EXPAND_AS_DEFINED = + +#--------------------------------------------------------------------------- +# Configuration::addtions related to external references +#--------------------------------------------------------------------------- + +# The TAGFILES tag can be used to specify one or more tagfiles. + +TAGFILES = + +# When a file name is specified after GENERATE_TAGFILE, doxygen will create +# a tag file that is based on the input files it reads. + +GENERATE_TAGFILE = + +# If the ALLEXTERNALS tag is set to YES all external classes will be listed +# in the class index. If set to NO only the inherited external classes +# will be listed. + +ALLEXTERNALS = NO + +# The PERL_PATH should be the absolute path and name of the perl script +# interpreter (i.e. the result of `which perl'). + +PERL_PATH = + +#--------------------------------------------------------------------------- +# Configuration options related to the dot tool +#--------------------------------------------------------------------------- + +# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is +# available from the path. This tool is part of Graphviz, a graph visualization +# toolkit from AT&T and Lucent Bell Labs. The other options in this section +# have no effect if this option is set to NO (the default) + +HAVE_DOT = NO + +# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect inheritance relations. Setting this tag to YES will force the +# the CLASS_DIAGRAMS tag to NO. + +CLASS_GRAPH = YES + +# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect implementation dependencies (inheritance, containment, and +# class references variables) of the class with other documented classes. + +COLLABORATION_GRAPH = YES + +# If set to YES, the inheritance and collaboration graphs will show the +# relations between templates and their instances. + +TEMPLATE_RELATIONS = YES + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT +# tags are set to YES then doxygen will generate a graph for each documented +# file showing the direct and indirect include dependencies of the file with +# other documented files. + +INCLUDE_GRAPH = YES + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and +# HAVE_DOT tags are set to YES then doxygen will generate a graph for each +# documented header file showing the documented files that directly or +# indirectly include this file. + +INCLUDED_BY_GRAPH = YES + +# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen +# will graphical hierarchy of all classes instead of a textual one. + +GRAPHICAL_HIERARCHY = YES + +# The tag DOT_PATH can be used to specify the path where the dot tool can be +# found. If left blank, it is assumed the dot tool can be found on the path. + +DOT_PATH = + +# The DOTFILE_DIRS tag can be used to specify one or more directories that +# contain dot files that are included in the documentation (see the +# \dotfile command). + +DOTFILE_DIRS = + +# The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width +# (in pixels) of the graphs generated by dot. If a graph becomes larger than +# this value, doxygen will try to truncate the graph, so that it fits within +# the specified constraint. Beware that most browsers cannot cope with very +# large images. + +MAX_DOT_GRAPH_WIDTH = 1024 + +# The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height +# (in pixels) of the graphs generated by dot. If a graph becomes larger than +# this value, doxygen will try to truncate the graph, so that it fits within +# the specified constraint. Beware that most browsers cannot cope with very +# large images. + +MAX_DOT_GRAPH_HEIGHT = 1024 + +# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will +# generate a legend page explaining the meaning of the various boxes and +# arrows in the dot generated graphs. + +GENERATE_LEGEND = YES + +# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will +# remove the intermedate dot files that are used to generate +# the various graphs. + +DOT_CLEANUP = YES + +#--------------------------------------------------------------------------- +# Configuration::addtions related to the search engine +#--------------------------------------------------------------------------- + +# The SEARCHENGINE tag specifies whether or not a search engine should be +# used. If set to NO the values of all tags below this one will be ignored. + +SEARCHENGINE = NO + +# The CGI_NAME tag should be the name of the CGI script that +# starts the search engine (doxysearch) with the correct parameters. +# A script with this name will be generated by doxygen. + +CGI_NAME = + +# The CGI_URL tag should be the absolute URL to the directory where the +# cgi binaries are located. See the documentation of your http daemon for +# details. + +CGI_URL = + +# The DOC_URL tag should be the absolute URL to the directory where the +# documentation is located. If left blank the absolute path to the +# documentation, with file:// prepended to it, will be used. + +DOC_URL = + +# The DOC_ABSPATH tag should be the absolute path to the directory where the +# documentation is located. If left blank the directory on the local machine +# will be used. + +DOC_ABSPATH = + +# The BIN_ABSPATH tag must point to the directory where the doxysearch binary +# is installed. + +BIN_ABSPATH = + +# The EXT_DOC_PATHS tag can be used to specify one or more paths to +# documentation generated for other projects. This allows doxysearch to search +# the documentation for these projects as well. + +EXT_DOC_PATHS = diff --git a/doc/doc_html/Attributes.html b/doc/doc_html/Attributes.html new file mode 100644 index 0000000..383d445 --- /dev/null +++ b/doc/doc_html/Attributes.html @@ -0,0 +1,105 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN"> +<HTML> +<HEAD> +<Title> Tango Device Server User's Guide </Title> + <META NAME="GENERATOR" CONTENT="Mozilla/3.01Gold (X11; I; HP-UX B.10.20 9000/735) [Netscape]"> +</HEAD> +<BODY TEXT="#000000" BGCOLOR="#FFFFFF" LINK="#0000FF" VLINK="#FF0000" ALINK="#FF0000"> + +<P><!-------TITLE------></P> +<table width="100%" height="20%"><tr> +<td align=LEFT> +<FONT COLOR="#0000FF"><FONT SIZE=+4>Synchrotron </FONT></FONT> +<FONT COLOR="#0000FF"><FONT SIZE=+4>Soleil</FONT></FONT> +<H5>Saint-Aubin - BP 48 91192 GIF-sur-YVETTE CEDEX<BR> +</td><td> +<A href="http://www.synchrotron-soleil.fr/"> +<IMG SRC="http://controle/images/logo-150.gif" + ALT="SOLEIL Logo" ALIGN=RIGHT border="0"></A> +</td></tr></table> + +<HR WIDTH="100%"></H5> + +<Br> +<center> +<h1> +Continuous Anolog Output<Br> +Device Attributes Description +</h1> +<Br> +<b> +Revision: - Author: +</b> +</center> + + +<Br> +<Table Border=2 Cellpadding=3 CELLSPACING=0 WIDTH="100%"> +<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor"> +<Td COLSPAN=4> <Font Size=+2><Center><b>Scalar Attributes</b></td></Font></Center> +<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor"> +<Td><Center><b>Attribute name</b></td></Center> +<Td><Center><b>Data Type</b></td></Center> +<Td><Center><b>R/W Type</b></td></Center> +<Td><Center><b>Expert</b></td></Center> +<Tr><Td><b><Center>errorCounter</b><Br>( Errors occuring during the waveform generation. )</Center></Td> +<Td><Center>DEV_DOUBLE</Center></Td><Td><Center>READ</Center></Td><Td><Center>No</Center></Td></Tr> + +<Tr><Td><b><Center>useBoardFifo</b><Br>( Set to 1 if data have been loaded in FIFO. Set to 0 if data is continuously tranfered through DMA (possible underrun) )</Center></Td> +<Td><Center>DEV_SHORT</Center></Td><Td><Center>READ</Center></Td><Td><Center>No</Center></Td></Tr> + +</Table> +</Center> +<Br><Br><Br><Br><Br> +<Table Border=2 Cellpadding=3 CELLSPACING=0 WIDTH="100%"> +<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor"> +<Td COLSPAN=4> <Font Size=+2><Center><b>Spectrum Attributes</b></td></Font></Center> +<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor"> +<Td><Center><b>Attribute name</b></td></Center> +<Td><Center><b>Data Type</b></td></Center> +<Td><Center><b>X Data Length</b></td></Center> +<Td><Center><b>Expert</b></td></Center> +<Tr><Td><b><Center>channel0</b></Center></Td> +<Td><Center>DEV_DOUBLE</Center></Td><Td><Center>1000000</Center></Td><Td><Center>No</Center></Td></Tr> + +<Tr><Td><b><Center>channel1</b></Center></Td> +<Td><Center>DEV_DOUBLE</Center></Td><Td><Center>100000</Center></Td><Td><Center>No</Center></Td></Tr> + +<Tr><Td><b><Center>channel2</b></Center></Td> +<Td><Center>DEV_DOUBLE</Center></Td><Td><Center>100000</Center></Td><Td><Center>No</Center></Td></Tr> + +<Tr><Td><b><Center>channel3</b></Center></Td> +<Td><Center>DEV_DOUBLE</Center></Td><Td><Center>100000</Center></Td><Td><Center>No</Center></Td></Tr> + +<Tr><Td><b><Center>channel4</b></Center></Td> +<Td><Center>DEV_DOUBLE</Center></Td><Td><Center>100000</Center></Td><Td><Center>No</Center></Td></Tr> + +<Tr><Td><b><Center>channel5</b></Center></Td> +<Td><Center>DEV_DOUBLE</Center></Td><Td><Center>100000</Center></Td><Td><Center>No</Center></Td></Tr> + +<Tr><Td><b><Center>channel6</b></Center></Td> +<Td><Center>DEV_DOUBLE</Center></Td><Td><Center>100000</Center></Td><Td><Center>No</Center></Td></Tr> + +<Tr><Td><b><Center>channel7</b></Center></Td> +<Td><Center>DEV_DOUBLE</Center></Td><Td><Center>100000</Center></Td><Td><Center>No</Center></Td></Tr> + +</Table> +</Center> +<Br><Br><Br><Br><Br> +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN"> +<HTML> +<HEAD> +<Title> Tango Device Server User's Guide </Title> + <META NAME="GENERATOR" CONTENT="Mozilla/3.01Gold (X11; I; HP-UX B.10.20 9000/735) [Netscape]"> +</HEAD> +<BODY TEXT="#000000" BGCOLOR="#FFFFFF" LINK="#0000FF" VLINK="#FF0000" ALINK="#FF0000"> + +<P><!-------TITLE------></P> + +<Center> +<Br> +<HR WIDTH="100%"></H5> +<H3>(c) SOLEIL : Groupe ICA Contr�le et Acquisitions </H33> +</Center> +</body> +</html> diff --git a/doc/doc_html/Description b/doc/doc_html/Description new file mode 100644 index 0000000..5d640e2 --- /dev/null +++ b/doc/doc_html/Description @@ -0,0 +1,62 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN"> +<HTML> +<HEAD> +<Title> Tango Device Server User's Guide </Title> + <META NAME="GENERATOR" CONTENT="Mozilla/3.01Gold (X11; I; HP-UX B.10.20 9000/735) [Netscape]"> +</HEAD> +<BODY TEXT="#000000" BGCOLOR="#FFFFFF" LINK="#0000FF" VLINK="#FF0000" ALINK="#FF0000"> + +<P><!-------TITLE------></P> +<table width="100%" height="20%"><tr> +<td align=LEFT> +<FONT COLOR="#0000FF"><FONT SIZE=+4>Synchrotron </FONT></FONT> +<FONT COLOR="#0000FF"><FONT SIZE=+4>Soleil</FONT></FONT> +<H5>Saint-Aubin - BP 48 91192 GIF-sur-YVETTE CEDEX<BR> +</td><td> +<A href="http://www.synchrotron-soleil.fr/"> +<IMG SRC="http://controle/images/logo-150.gif" + ALT="SOLEIL Logo" ALIGN=RIGHT border="0"></A> +</td></tr></table> + +<HR WIDTH="100%"></H5> + +<Br> +<center> +<h1> +Continuous Anolog Output<Br> +Device Description +</h1> +<Br> +<b> +Revision: - Author: +</b> +</center> + + +<Center> +<Br> +<Br> +<Br> +<Br> +<Br> +<Br> +This Page Must Be Filled by <Br> +The Programmer +</Center> +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN"> +<HTML> +<HEAD> +<Title> Tango Device Server User's Guide </Title> + <META NAME="GENERATOR" CONTENT="Mozilla/3.01Gold (X11; I; HP-UX B.10.20 9000/735) [Netscape]"> +</HEAD> +<BODY TEXT="#000000" BGCOLOR="#FFFFFF" LINK="#0000FF" VLINK="#FF0000" ALINK="#FF0000"> + +<P><!-------TITLE------></P> + +<Center> +<Br> +<HR WIDTH="100%"></H5> +<H3>(c) SOLEIL : Groupe ICA Contr�le et Acquisitions </H33> +</Center> +</body> +</html> diff --git a/doc/doc_html/DevCommands.html b/doc/doc_html/DevCommands.html new file mode 100644 index 0000000..82dbba2 --- /dev/null +++ b/doc/doc_html/DevCommands.html @@ -0,0 +1,143 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN"> +<HTML> +<HEAD> +<Title> Tango Device Server User's Guide </Title> + <META NAME="GENERATOR" CONTENT="Mozilla/3.01Gold (X11; I; HP-UX B.10.20 9000/735) [Netscape]"> +</HEAD> +<BODY TEXT="#000000" BGCOLOR="#FFFFFF" LINK="#0000FF" VLINK="#FF0000" ALINK="#FF0000"> + +<P><!-------TITLE------></P> +<table width="100%" height="20%"><tr> +<td align=LEFT> +<FONT COLOR="#0000FF"><FONT SIZE=+4>Synchrotron </FONT></FONT> +<FONT COLOR="#0000FF"><FONT SIZE=+4>Soleil</FONT></FONT> +<H5>Saint-Aubin - BP 48 91192 GIF-sur-YVETTE CEDEX<BR> +</td><td> +<A href="http://www.synchrotron-soleil.fr/"> +<IMG SRC="http://controle/images/logo-150.gif" + ALT="SOLEIL Logo" ALIGN=RIGHT border="0"></A> +</td></tr></table> + +<HR WIDTH="100%"></H5> + +<Br> +<center> +<h1> +Continuous Anolog Output<Br> +Device Commands Description +</h1> +<Br> +<b> +Revision: - Author: +</b> +</center> + + +<Br> +<Br> +<Br> +<A NAME="Init"><!-- --></A> +<A NAME="Init"><!-- --></A> +<h2>1 - Init</h2> +<ul> +<Li><Strong>Description: </Strong> This commands re-initialise a device keeping the same network connection.<Br> +After an Init command executed on a device, it is not necessary for client to re-connect to the device.<Br> +This command first calls the device <i> delete_device() </i>method and then execute its <i> init_device()</i> method.<Br> +For C++ device server, all the memory allocated in the <i> nit_device() </i> method must be freed in the <i> delete_device() </i> method.<Br> +The language device desctructor automatically calls the <i> delete_device() </i> method.<Br>  +<Li><Strong>Argin:<Br>DEV_VOID</Strong> + : none.<Br>  +<Li><Strong>Argout:<Br>DEV_VOID</Strong> + : none.<Br>  +<Li><Strong>Command allowed for: </Strong><Ul> +<Li>Tango::UNKNOWN<Li>Tango::STANDBY<Li>Tango::RUNNING</Ul> +<Br>  +</ul><Br> +<Br> +<A NAME="State"><!-- --></A> +<A NAME="State"><!-- --></A> +<h2>2 - State</h2> +<ul> +<Li><Strong>Description: </Strong> This command gets the device state (stored in its <i>device_state</i> data member) and returns it to the caller.<Br>  +<Li><Strong>Argin:<Br>DEV_VOID</Strong> + : none.<Br>  +<Li><Strong>Argout:<Br>DEV_STATE</Strong> + : State Code<Br>  +<Li><Strong>Command allowed for: </Strong><Ul> +<Li>Tango::UNKNOWN<Li>Tango::STANDBY<Li>Tango::RUNNING</Ul> +<Br>  +</ul><Br> +<Br> +<A NAME="Status"><!-- --></A> +<A NAME="Status"><!-- --></A> +<h2>3 - Status</h2> +<ul> +<Li><Strong>Description: </Strong> This command gets the device status (stored in its <i>device_status</i> data member) and returns it to the caller.<Br>  +<Li><Strong>Argin:<Br>DEV_VOID</Strong> + : none.<Br>  +<Li><Strong>Argout:<Br>CONST_DEV_STRING</Strong> + : Status descrition<Br>  +<Li><Strong>Command allowed for: </Strong><Ul> +<Li>Tango::UNKNOWN<Li>Tango::STANDBY<Li>Tango::RUNNING</Ul> +<Br>  +</ul><Br> +<Br> +<A NAME="Start"><!-- --></A> +<A NAME="Start"><!-- --></A> +<h2>4 - Start</h2> +<ul> +<Li><Strong>Description: </Strong> start the generation.<Br>  +<Li><Strong>Argin:<Br>DEV_VOID</Strong> + : <Br>  +<Li><Strong>Argout:<Br>DEV_VOID</Strong> + : <Br>  +<Li><Strong>Command allowed for: </Strong><Ul> +<Li>Tango::UNKNOWN<Li>Tango::STANDBY<Li>Tango::RUNNING</Ul> +<Br>  +</ul><Br> +<Br> +<A NAME="Stop"><!-- --></A> +<A NAME="Stop"><!-- --></A> +<h2>5 - Stop</h2> +<ul> +<Li><Strong>Description: </Strong> stop the generation.<Br>  +<Li><Strong>Argin:<Br>DEV_VOID</Strong> + : <Br>  +<Li><Strong>Argout:<Br>DEV_VOID</Strong> + : <Br>  +<Li><Strong>Command allowed for: </Strong><Ul> +<Li>Tango::UNKNOWN<Li>Tango::STANDBY<Li>Tango::RUNNING</Ul> +<Br>  +</ul><Br> +<Br> +<A NAME="SetAOScaledData"><!-- --></A> +<A NAME="SetAOScaledData"><!-- --></A> +<h2>6 - SetAOScaledData</h2> +<ul> +<Li><Strong>Description: </Strong> Give one period of the signal to generated of a specified channel in volts.<Br>  +<Li><Strong>Argin:<Br>DEVVAR_DOUBLESTRINGARRAY</Strong> + : The channel number (string). The output data in volts (double)<Br>  +<Li><Strong>Argout:<Br>DEV_VOID</Strong> + : <Br>  +<Li><Strong>Command allowed for: </Strong><Ul> +<Li>Tango::UNKNOWN<Li>Tango::STANDBY<Li>Tango::RUNNING</Ul> +<Br>  +</ul><Br> +<Br> +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN"> +<HTML> +<HEAD> +<Title> Tango Device Server User's Guide </Title> + <META NAME="GENERATOR" CONTENT="Mozilla/3.01Gold (X11; I; HP-UX B.10.20 9000/735) [Netscape]"> +</HEAD> +<BODY TEXT="#000000" BGCOLOR="#FFFFFF" LINK="#0000FF" VLINK="#FF0000" ALINK="#FF0000"> + +<P><!-------TITLE------></P> + +<Center> +<Br> +<HR WIDTH="100%"></H5> +<H3>(c) SOLEIL : Groupe ICA Contr�le et Acquisitions </H33> +</Center> +</body> +</html> diff --git a/doc/doc_html/DevCommandsFrame.html b/doc/doc_html/DevCommandsFrame.html new file mode 100644 index 0000000..039ee33 --- /dev/null +++ b/doc/doc_html/DevCommandsFrame.html @@ -0,0 +1,20 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN"> +<HTML> +<HEAD> +<Title> Tango Device Server User's Guide </Title> + <META NAME="GENERATOR" CONTENT="Mozilla/3.01Gold (X11; I; HP-UX B.10.20 9000/735) [Netscape]"> +</HEAD> + +<FRAMESET cols="20%,80%"> +<FRAME src="DevCommandsList.html" name="DevCommandsList"> +<FRAME src="DevCommands.html" name="DevCommands"> +</FRAMESET> +<NOFRAMES> +<H2> +Frame Alert</H2> + +<P> +This document is designed to be viewed using the frames feature. If you see this message, you are using a non-frame-capable web client. +<BR> +Link to <A HREF="DevCommands.html">Non-frame version.</A></NOFRAMES> +</HTML> diff --git a/doc/doc_html/DevCommandsList.html b/doc/doc_html/DevCommandsList.html new file mode 100644 index 0000000..07e6925 --- /dev/null +++ b/doc/doc_html/DevCommandsList.html @@ -0,0 +1,20 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN"> +<HTML><HEAD> +<TITLE>Commands +</TITLE></HEAD> +<BODY BGCOLOR="white"> +<FONT size="+1" ID="FrameHeadingFont"> +<B>Commands:</B></FONT> +<Br> +<Br> +<Br> +<A Href="DevCommands.html#Init" TARGET="DevCommands"> Init</a><Br> +<A Href="DevCommands.html#State" TARGET="DevCommands"> State</a><Br> +<A Href="DevCommands.html#Status" TARGET="DevCommands"> Status</a><Br> +<A Href="DevCommands.html#Start" TARGET="DevCommands"> Start</a><Br> +<A Href="DevCommands.html#Stop" TARGET="DevCommands"> Stop</a><Br> +<A Href="DevCommands.html#SetAOScaledData" TARGET="DevCommands"> SetAOScaledData</a><Br> + + +</BODY> +</HTML> diff --git a/doc/doc_html/DevCommandsTable.html b/doc/doc_html/DevCommandsTable.html new file mode 100644 index 0000000..01abe5c --- /dev/null +++ b/doc/doc_html/DevCommandsTable.html @@ -0,0 +1,85 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN"> +<HTML> +<HEAD> +<Title> Tango Device Server User's Guide </Title> + <META NAME="GENERATOR" CONTENT="Mozilla/3.01Gold (X11; I; HP-UX B.10.20 9000/735) [Netscape]"> +</HEAD> +<BODY TEXT="#000000" BGCOLOR="#FFFFFF" LINK="#0000FF" VLINK="#FF0000" ALINK="#FF0000"> + +<P><!-------TITLE------></P> +<table width="100%" height="20%"><tr> +<td align=LEFT> +<FONT COLOR="#0000FF"><FONT SIZE=+4>Synchrotron </FONT></FONT> +<FONT COLOR="#0000FF"><FONT SIZE=+4>Soleil</FONT></FONT> +<H5>Saint-Aubin - BP 48 91192 GIF-sur-YVETTE CEDEX<BR> +</td><td> +<A href="http://www.synchrotron-soleil.fr/"> +<IMG SRC="http://controle/images/logo-150.gif" + ALT="SOLEIL Logo" ALIGN=RIGHT border="0"></A> +</td></tr></table> + +<HR WIDTH="100%"></H5> + +<Br> +<center> +<h1> +Continuous Anolog Output<Br> +Device Commands Description +</h1> +<Br> +<b> +Revision: - Author: +</b> +</center> + + +<Center> +<Br><Br> +<A Href="DevCommandsFrame.html"> More Details on commands.... </a><Br> +<Br> <Br> +<Table Border=2 Cellpadding=3 CELLSPACING=0 WIDTH="100%"> +<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor"> +<Td COLSPAN=3> <Font Size=+2><Center><b>Device Commands for Operator Level</b></td></Font></Center> +<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor"> +<Td><Center><b>Command name</b></td></Center> +<Td><Center><b>Argument In</b></td></Center> +<Td><Center><b>Argument Out</b></td></Center> +<Tr><Td>Init</Td> +<Td>DEV_VOID</Td> +<Td>DEV_VOID</Td> +<Tr><Td>State</Td> +<Td>DEV_VOID</Td> +<Td>DEV_STATE</Td> +<Tr><Td>Status</Td> +<Td>DEV_VOID</Td> +<Td>CONST_DEV_STRING</Td> +<Tr><Td>Start</Td> +<Td>DEV_VOID</Td> +<Td>DEV_VOID</Td> +<Tr><Td>Stop</Td> +<Td>DEV_VOID</Td> +<Td>DEV_VOID</Td> +<Tr><Td>SetAOScaledData</Td> +<Td>DEVVAR_DOUBLESTRINGARRAY</Td> +<Td>DEV_VOID</Td> + + + +</Table></Center> +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN"> +<HTML> +<HEAD> +<Title> Tango Device Server User's Guide </Title> + <META NAME="GENERATOR" CONTENT="Mozilla/3.01Gold (X11; I; HP-UX B.10.20 9000/735) [Netscape]"> +</HEAD> +<BODY TEXT="#000000" BGCOLOR="#FFFFFF" LINK="#0000FF" VLINK="#FF0000" ALINK="#FF0000"> + +<P><!-------TITLE------></P> + +<Center> +<Br> +<HR WIDTH="100%"></H5> +<H3>(c) SOLEIL : Groupe ICA Contr�le et Acquisitions </H33> +</Center> +</body> +</html> diff --git a/doc/doc_html/Properties.html b/doc/doc_html/Properties.html new file mode 100644 index 0000000..a41dd83 --- /dev/null +++ b/doc/doc_html/Properties.html @@ -0,0 +1,190 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN"> +<HTML> +<HEAD> +<Title> Tango Device Server User's Guide </Title> + <META NAME="GENERATOR" CONTENT="Mozilla/3.01Gold (X11; I; HP-UX B.10.20 9000/735) [Netscape]"> +</HEAD> +<BODY TEXT="#000000" BGCOLOR="#FFFFFF" LINK="#0000FF" VLINK="#FF0000" ALINK="#FF0000"> + +<P><!-------TITLE------></P> +<table width="100%" height="20%"><tr> +<td align=LEFT> +<FONT COLOR="#0000FF"><FONT SIZE=+4>Synchrotron </FONT></FONT> +<FONT COLOR="#0000FF"><FONT SIZE=+4>Soleil</FONT></FONT> +<H5>Saint-Aubin - BP 48 91192 GIF-sur-YVETTE CEDEX<BR> +</td><td> +<A href="http://www.synchrotron-soleil.fr/"> +<IMG SRC="http://controle/images/logo-150.gif" + ALT="SOLEIL Logo" ALIGN=RIGHT border="0"></A> +</td></tr></table> + +<HR WIDTH="100%"></H5> + +<Br> +<center> +<h1> +Continuous Anolog Output<Br> +Properties Description +</h1> +<Br> +<b> +Revision: - Author: +</b> +</center> + + +<Br> <Br> <Br> +<Center> +<Br> <Br> <Br> +<Table Border=2 Cellpadding=3 CELLSPACING=0 WIDTH="100%"> +<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor"> +<Td COLSPAN=3> <Font Size=+2><Center><b>Device Properties</b></td></Font></Center> +<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor"> +<Td><Center><b>Property name</b></td></Center> +<Td><Center><b>Property type</b></td></Center> +<Td><Center><b>Description</b></td></Center> +<Tr><Td>BoardNum</Td> +<Td>Tango::DEV_USHORT</Td> +<Td>The number of the board in the chassis cPCI.</Td></Tr> + +<Tr><Td>Frequency</Td> +<Td>Tango::DEV_DOUBLE</Td> +<Td>The output frequency (the rate the samples are outputed).</Td></Tr> + +<Tr><Td>StartTrigger</Td> +<Td>Tango::DEV_SHORT</Td> +<Td>1 if using a start trigger, 0 otherwise.</Td></Tr> + +<Tr><Td>StopTrigger</Td> +<Td>Tango::DEV_SHORT</Td> +<Td>1 if using a stop trigger, 0 otherwise.</Td></Tr> + +<Tr><Td>StartTriggerSource</Td> +<Td>Tango::DEV_USHORT</Td> +<Td>The start trigger source. Analog trigger DTRIG or ATRIG.</Td></Tr> + +<Tr><Td>StopTriggerSource</Td> +<Td>Tango::DEV_USHORT</Td> +<Td>The stop trigger source. anolog trigger ATRIG or pin AFI0 of AFI1.</Td></Tr> + +<Tr><Td>ATRIGSelection</Td> +<Td>Tango::DEV_USHORT</Td> +<Td>select the type of analog trigger. Can be BELOW (trigger occurs below ATRIGLevel) +or can be ABOVE (trigger occurs above ATRIGLevel).</Td></Tr> + +<Tr><Td>ATRIGLevel</Td> +<Td>Tango::DEV_DOUBLE</Td> +<Td>The analog trigger level in volts.</Td></Tr> + +<Tr><Td>DTRIGPolarity</Td> +<Td>Tango::DEV_USHORT</Td> +<Td>The edges on which the trigger are detected. Can be RISING or FALLING.</Td></Tr> + +<Tr><Td>AORefA</Td> +<Td>Tango::DEV_DOUBLE</Td> +<Td>The value of the reference voltage gave on pin AORefA.</Td></Tr> + +<Tr><Td>AORefB</Td> +<Td>Tango::DEV_DOUBLE</Td> +<Td>The value of the reference voltage gave on pin AORefB.</Td></Tr> + +<Tr><Td>Polarity</Td> +<Td>Tango::DEV_USHORT</Td> +<Td>BP for unipolar outputs or UP for bipolar outputs.</Td></Tr> + +<Tr><Td>AORefSource</Td> +<Td>Tango::DEV_USHORT</Td> +<Td>Select the internal reference (10.0 volts) with INTERN or the external references +AORefA and AORefB with EXTERN.</Td></Tr> + +<Tr><Td>Channel0Enable</Td> +<Td>Tango::DEV_SHORT</Td> +<Td>1 if enable channel 0, 0 otherwise.</Td></Tr> + +<Tr><Td>Channel1Enable</Td> +<Td>Tango::DEV_SHORT</Td> +<Td>1 if enable channel 1, 0 otherwise.</Td></Tr> + +<Tr><Td>Channel2Enable</Td> +<Td>Tango::DEV_SHORT</Td> +<Td>1 if enable channel 2, 0 otherwise.</Td></Tr> + +<Tr><Td>Channel3Enable</Td> +<Td>Tango::DEV_SHORT</Td> +<Td>1 if enable channel 3, 0 otherwise.</Td></Tr> + +<Tr><Td>Channel4Enable</Td> +<Td>Tango::DEV_SHORT</Td> +<Td>1 if enable channel 4, 0 otherwise.</Td></Tr> + +<Tr><Td>Channel5Enable</Td> +<Td>Tango::DEV_SHORT</Td> +<Td>1 if enable channel 5, 0 otherwise.</Td></Tr> + +<Tr><Td>Channel6Enable</Td> +<Td>Tango::DEV_SHORT</Td> +<Td>1 if enable channel 6, 0 otherwise.</Td></Tr> + +<Tr><Td>Channel7Enable</Td> +<Td>Tango::DEV_SHORT</Td> +<Td>1 if enable channel 7, 0 otherwise.</Td></Tr> + +<Tr><Td>BufferDepth</Td> +<Td>Tango::DEV_USHORT</Td> +<Td>The buffer depth for <b>one channel</b>.</Td></Tr> + +<Tr><Td>Channel0Waveform</Td> +<Td>Array of double</Td> +<Td>The waveform for channel 0 (attribute persistency).</Td></Tr> + +<Tr><Td>Channel1Waveform</Td> +<Td>Array of double</Td> +<Td>The waveform for channel 1 (attribute persistency).</Td></Tr> + +<Tr><Td>Channel2Waveform</Td> +<Td>Array of double</Td> +<Td>The waveform for channel 2 (attribute persistency).</Td></Tr> + +<Tr><Td>Channel3Waveform</Td> +<Td>Array of double</Td> +<Td>The waveform for channel 3 (attribute persistency).</Td></Tr> + +<Tr><Td>Channel4Waveform</Td> +<Td>Array of double</Td> +<Td>The waveform for channel 4 (attribute persistency).</Td></Tr> + +<Tr><Td>Channel5Waveform</Td> +<Td>Array of double</Td> +<Td>The waveform for channel 5 (attribute persistency).</Td></Tr> + +<Tr><Td>Channel6Waveform</Td> +<Td>Array of double</Td> +<Td>The waveform for channel 6 (attribute persistency).</Td></Tr> + +<Tr><Td>Channel7Waveform</Td> +<Td>Array of double</Td> +<Td>The waveform for channel 7 (attribute persistency).</Td></Tr> + +</Table> + +<Br><Br><Br> +<Center><b> +There is no Class properties.<Br><Br> +</Center></b> +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN"> +<HTML> +<HEAD> +<Title> Tango Device Server User's Guide </Title> + <META NAME="GENERATOR" CONTENT="Mozilla/3.01Gold (X11; I; HP-UX B.10.20 9000/735) [Netscape]"> +</HEAD> +<BODY TEXT="#000000" BGCOLOR="#FFFFFF" LINK="#0000FF" VLINK="#FF0000" ALINK="#FF0000"> + +<P><!-------TITLE------></P> + +<Center> +<Br> +<HR WIDTH="100%"></H5> +<H3>(c) SOLEIL : Groupe ICA Contr�le et Acquisitions </H33> +</Center> +</body> +</html> diff --git a/doc/doc_html/TangoDevStates.html b/doc/doc_html/TangoDevStates.html new file mode 100644 index 0000000..02660af --- /dev/null +++ b/doc/doc_html/TangoDevStates.html @@ -0,0 +1,74 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN"> +<HTML> +<HEAD> +<Title> Tango Device Server User's Guide </Title> + <META NAME="GENERATOR" CONTENT="Mozilla/3.01Gold (X11; I; HP-UX B.10.20 9000/735) [Netscape]"> +</HEAD> +<BODY TEXT="#000000" BGCOLOR="#FFFFFF" LINK="#0000FF" VLINK="#FF0000" ALINK="#FF0000"> + +<P><!-------TITLE------></P> +<table width="100%" height="20%"><tr> +<td align=LEFT> +<FONT COLOR="#0000FF"><FONT SIZE=+4>Synchrotron </FONT></FONT> +<FONT COLOR="#0000FF"><FONT SIZE=+4>Soleil</FONT></FONT> +<H5>Saint-Aubin - BP 48 91192 GIF-sur-YVETTE CEDEX<BR> +</td><td> +<A href="http://www.synchrotron-soleil.fr/"> +<IMG SRC="http://controle/images/logo-150.gif" + ALT="SOLEIL Logo" ALIGN=RIGHT border="0"></A> +</td></tr></table> + +<HR WIDTH="100%"></H5> + +<Br> +<center> +<h1> +Continuous Anolog Output<Br> +Device States Description +</h1> +<Br> +<b> +Revision: - Author: +</b> +</center> + + +<Center> +<Br> <Br> <Br> +<Table Border=2 Cellpadding=3 CELLSPACING=0 WIDTH="100%"> +<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor"> +<Td COLSPAN=2> <Font Size=+2><Center><b>States</b></td></Font></Center> +<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor"> +<Td><Center><b>Names</b></td></Center> +<Td><Center><b>Descriptions</b></td></Center> +<Tr><Td>UNKNOWN</Td> +<Td></Td></Tr> + +<Tr><Td>STANDBY</Td> +<Td></Td></Tr> + +<Tr><Td>RUNNING</Td> +<Td></Td></Tr> + + + + +</Table> +</Center> +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN"> +<HTML> +<HEAD> +<Title> Tango Device Server User's Guide </Title> + <META NAME="GENERATOR" CONTENT="Mozilla/3.01Gold (X11; I; HP-UX B.10.20 9000/735) [Netscape]"> +</HEAD> +<BODY TEXT="#000000" BGCOLOR="#FFFFFF" LINK="#0000FF" VLINK="#FF0000" ALINK="#FF0000"> + +<P><!-------TITLE------></P> + +<Center> +<Br> +<HR WIDTH="100%"></H5> +<H3>(c) SOLEIL : Groupe ICA Contr�le et Acquisitions </H33> +</Center> +</body> +</html> diff --git a/doc/doc_html/index.html b/doc/doc_html/index.html new file mode 100644 index 0000000..29c83c5 --- /dev/null +++ b/doc/doc_html/index.html @@ -0,0 +1,86 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN"> +<HTML> +<HEAD> +<Title> Tango Device Server User's Guide </Title> + <META NAME="GENERATOR" CONTENT="Mozilla/3.01Gold (X11; I; HP-UX B.10.20 9000/735) [Netscape]"> +</HEAD> +<BODY TEXT="#000000" BGCOLOR="#FFFFFF" LINK="#0000FF" VLINK="#FF0000" ALINK="#FF0000"> + +<P><!-------TITLE------></P> +<table width="100%" height="20%"><tr> +<td align=LEFT> +<FONT COLOR="#0000FF"><FONT SIZE=+4>Synchrotron </FONT></FONT> +<FONT COLOR="#0000FF"><FONT SIZE=+4>Soleil</FONT></FONT> +<H5>Saint-Aubin - BP 48 91192 GIF-sur-YVETTE CEDEX<BR> +</td><td> +<A href="http://www.synchrotron-soleil.fr/"> +<IMG SRC="http://controle/images/logo-150.gif" + ALT="SOLEIL Logo" ALIGN=RIGHT border="0"></A> +</td></tr></table> + +<HR WIDTH="100%"></H5> + +<Br> +<center> +<h1> +Continuous Anolog Output<Br> +Device Server User's Guide +</h1> +<Br> +<b> +Revision: - Author: +</b> +</center> +<Br> +<Br> +<Br> +<Br> +<Br> +<Br> +<h2>Introduction:</h2> +Perform continuous anolog ouput (waveform generation) on the selected outputs.<Br> +<Br> +<Br> +<h2>Description:</h2> +<ul> + <li> <a href=Description.html> Device description.</a> + <li> <a href=Properties.html> Properties description</a> + <li> <a href=TangoDevStates.html> States description</a> + <li> <a href=DevCommandsFrame.html> Commands description</a> + <li> <a href=Attributes.html> Attributes description</a> +</ul> +<Br> +<Br> +<Br> +<h2>Extented User's guide (available only for complex DeviceServers):</h2> +<ul> + <li> <a href="../DeviceServerUsersGuide.doc"> In French word format.</a> + <li> <a href="../DeviceServerUsersGuide.pdf"> In French PDF format.</a> + <li> <a href="../DeviceServerUsersGuide_en.doc"> In English word format.</a> + <li> <a href="../DeviceServerUsersGuide_en.pdf"> In English PDF format.</a> +</ul> +<Br> +<Br> +<Br> +<h2>Conclusion:</h2> +The device server is ready for distribution application programmers.<Br> +The author will be interested inany feedback which arise from their usage of this device server. +<Br> + +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN"> +<HTML> +<HEAD> +<Title> Tango Device Server User's Guide </Title> + <META NAME="GENERATOR" CONTENT="Mozilla/3.01Gold (X11; I; HP-UX B.10.20 9000/735) [Netscape]"> +</HEAD> +<BODY TEXT="#000000" BGCOLOR="#FFFFFF" LINK="#0000FF" VLINK="#FF0000" ALINK="#FF0000"> + +<P><!-------TITLE------></P> + +<Center> +<Br> +<HR WIDTH="100%"></H5> +<H3>(c) SOLEIL : Groupe ICA Contr�le et Acquisitions </H33> +</Center> +</body> +</html> diff --git a/scripts/load_sine_chan4.py b/scripts/load_sine_chan4.py new file mode 100644 index 0000000..0d21467 --- /dev/null +++ b/scripts/load_sine_chan4.py @@ -0,0 +1,44 @@ +from PyTango import* +import sys +import time +import math + + +try: + #TODO: put the desired device proxy + contAO = DeviceProxy("generic/acq/ContinuousAO") + + ###############load a sine signal on channel 4#################### + + #TODO: put the correct BufferDepth (same as in the property of the device) + BufferDepth = 1000 + + #TODO: put the desired voltage in volts (verify the the input range is coherent with this value) + # The input range is gave by properties Polarity, AORefA, AORefB, AORefSource + max_voltage = 5.0 + + i = 1 + ao_data = [math.sin(0 * 2. * 3.14159 / BufferDepth) * max_voltage] + + + while i<BufferDepth: + ao_data[i:i] = [math.sin(i * 2. * 3.14159 / BufferDepth) * max_voltage] + i = i + 1 + + print ao_data + + #put ao_data in the argin of the command contAO with the channel number + argin =(ao_data,["4"]) + + #load the waveform on the device + contAO.SetAOScaledData(argin) + +except: + exctype , value = sys.exc_info()[:2] + print "Failed with exception ", exctype + for err in value : + print "---ERROR ELEMENT-------" + print "reason:" , err["reason"] + print "description:" , err["desc"] + print "origin:" , err["origin"] + print "severity:" , err["severity"] diff --git a/scripts/load_square_chan0.py b/scripts/load_square_chan0.py new file mode 100644 index 0000000..24e1804 --- /dev/null +++ b/scripts/load_square_chan0.py @@ -0,0 +1,46 @@ +from PyTango import* +import sys +import time + + +try: + #TODO: put the desired device proxy + contAO = DeviceProxy("generic/acq/ContinuousAO") + + ###############load a square signal on channel 0#################### + + #TODO: put the correct BufferDepth (same as in the property of the device) + BufferDepth = 1000 + + #TODO: put the desired voltage in volts (verify the the input range is coherent with this value) + # The input range is gave by properties Polarity, AORefA, AORefB, AORefSource + max_voltage = 5.0 + + i = 1 + ao_data = [-max_voltage] + + + while i<BufferDepth/2: + ao_data[i:i] = [-max_voltage] + i = i + 1 + while i<BufferDepth: + ao_data[i:i] = [max_voltage] + i = i + 1 + + #print ao_data + + #put ao_data in the argin of the command contAO with the channel number + argin =(ao_data,["0"]) + + #load the waveform on the device + contAO.SetAOScaledData(argin) + +except: + exctype , value = sys.exc_info()[:2] + print "Failed with exception ", exctype + for err in value : + print "---ERROR ELEMENT-------" + print "reason:" , err["reason"] + print "description:" , err["desc"] + print "origin:" , err["origin"] + print "severity:" , err["severity"] diff --git a/src/ADLinkContinuousAO.cpp b/src/ADLinkContinuousAO.cpp new file mode 100644 index 0000000..d9a6342 --- /dev/null +++ b/src/ADLinkContinuousAO.cpp @@ -0,0 +1,35 @@ +//============================================================ +//DEPENDENCIES +//============================================================ +#include <asl/ASLExceptionsHandler.h> +#include "ADLinkContinuousAO.h" + +//============================================================ +//ADLinkContinuousAO::ADLinkContinuousAO +//============================================================ +ADLinkContinuousAO::ADLinkContinuousAO (Tango::DeviceImpl* dev) + : Tango::LogAdapter(dev), + asl::ContinuousAO (), + err_ctr(0) +{ + +} +//============================================================ +//ADLinkContinuousAO::~ADLinkContinuousAO +//============================================================ +ADLinkContinuousAO::~ADLinkContinuousAO (void) +{ +} +//============================================================ +//ADLinkContinuousAO::handle_error +//============================================================ +void ADLinkContinuousAO::handle_error (const asl::DAQException& de) +{ + cout<<"error occured during acquisition"<<endl; + this->lock_data(); + err_ctr++; + this->unlock_data(); + _ASL_TO_TANGO_EXCEPTION(de, df); + ERROR_STREAM<<"error occured during acquisition"<<endl; + ERROR_STREAM<<df<<endl; +} diff --git a/src/ADLinkContinuousAO.h b/src/ADLinkContinuousAO.h new file mode 100644 index 0000000..e273b5b --- /dev/null +++ b/src/ADLinkContinuousAO.h @@ -0,0 +1,39 @@ +#ifndef _ADLinkContinuousAO_H +#define _ADLinkContinuousAO_H +//============================================================ +//DEPENDENCIES +//============================================================ +#include <asl/ContinuousAO.h> +#include <Tango.h> + +class ADLinkContinuousAO: public asl::ContinuousAO, public Tango::LogAdapter +{ + +public: + + ADLinkContinuousAO (Tango::DeviceImpl* dev); + virtual ~ADLinkContinuousAO (void) ; + /** + * Receive errors ocurring during the waveform generation. + * @param de The error + */ + virtual void handle_error (const asl::DAQException& de); + /** + * Get the mutex + */ + inline void lock_data(void) + { + this->data_lock_.acquire(); + }; + /** + * Release the mutex + */ + inline void unlock_data(void) + { + this->data_lock_.release(); + }; + unsigned long err_ctr; +private: + ACE_Thread_Mutex data_lock_; +}; +#endif // _ADLinkContinuousAO_H \ No newline at end of file diff --git a/src/ClassFactory.cpp b/src/ClassFactory.cpp new file mode 100644 index 0000000..a6903d9 --- /dev/null +++ b/src/ClassFactory.cpp @@ -0,0 +1,47 @@ +static const char *RcsId = "$Header: /users/chaize/newsvn/cvsroot/InputOutput/ADLINK/ContinuousAO/src/ClassFactory.cpp,v 1.1.1.1 2004-12-06 10:20:44 syldup Exp $"; +//+============================================================================= +// +// file : ClassFactory.cpp +// +// description : C++ source for the class_factory method of the DServer +// device class. This method is responsible to create +// all class singletin for a device server. It is called +// at device server startup +// +// project : TANGO Device Server +// +// $Author: syldup $ +// +// $Revision: 1.1.1.1 $ +// +// $Log: not supported by cvs2svn $ +// +// copyleft : Synchrotron SOLEIL +// L'Orme des Merisiers +// Saint-Aubin - BP 48 +// +//-============================================================================= +// +// This file is generated by POGO +// (Program Obviously used to Generate tango Object) +// +// (c) - Software Engineering Group - ESRF +//============================================================================= + + +#include <tango.h> +#include <ContinuousAOClass.h> + +/** + * Create ContinuousAOClass singleton and store it in DServer object. + * + * @author $Author: syldup $ + * @version $Revision: 1.1.1.1 $ $ + */ + +void Tango::DServer::class_factory() +{ + + add_class(ContinuousAO::ContinuousAOClass::init("ContinuousAO")); + +} diff --git a/src/ContinuousAO.cpp b/src/ContinuousAO.cpp new file mode 100644 index 0000000..ce52073 --- /dev/null +++ b/src/ContinuousAO.cpp @@ -0,0 +1,1343 @@ +static const char *RcsId = "$Header: /users/chaize/newsvn/cvsroot/InputOutput/ADLINK/ContinuousAO/src/ContinuousAO.cpp,v 1.1.1.1 2004-12-06 10:20:44 syldup Exp $"; +//+============================================================================= +// +// file : ContinuousAO.cpp +// +// description : C++ source for the ContinuousAO and its commands. +// The class is derived from Device. It represents the +// CORBA servant object which will be accessed from the +// network. All commands which can be executed on the +// ContinuousAO are implemented in this file. +// +// project : TANGO Device Server +// +// $Author: syldup $ +// +// $Revision: 1.1.1.1 $ +// +// $Log: not supported by cvs2svn $ +// +// copyleft : Synchrotron SOLEIL +// L'Orme des Merisiers +// Saint-Aubin - BP 48 + +// +//-============================================================================= +// +// This file is generated by POGO +// (Program Obviously used to Generate tango Object) +// +// (c) - Software Engineering Group - ESRF +//============================================================================= + + +//=================================================================== +// +// The folowing table gives the correspondance +// between commands and method's name. +// +// Command's name | Method's name +// ---------------------------------------- +// State | dev_state() +// Status | dev_status() +// Start | start() +// Stop | stop() +// SetAOScaledData | set_aoscaled_data() +// +//=================================================================== +#include <ContinuousAO.h> +#include <TangoExceptionsHelper.h> +#include <asl/ASLExceptionsHandler.h> +#include <asl/AOData.h> +#include <math.h> +namespace ContinuousAO +{ + +//+---------------------------------------------------------------------------- +// +// method : ContinuousAO::ContinuousAO(string &s) +// +// description : constructor for simulated ContinuousAO +// +// in : - cl : Pointer to the DeviceClass object +// - s : Device name +// +//----------------------------------------------------------------------------- +ContinuousAO::ContinuousAO(Tango::DeviceClass *cl,string &s):Tango::Device_2Impl(cl,s.c_str()) +{ + init_device(); +} + +ContinuousAO::ContinuousAO(Tango::DeviceClass *cl,const char *s):Tango::Device_2Impl(cl,s) +{ + init_device(); +} + +ContinuousAO::ContinuousAO(Tango::DeviceClass *cl,const char *s,const char *d) +:Tango::Device_2Impl(cl,s,d) +{ + init_device(); +} +//+---------------------------------------------------------------------------- +// +// method : ContinuousAO::delete_device() +// +// description : will be called at device destruction or at init command. +// +//----------------------------------------------------------------------------- +void ContinuousAO::delete_device() +{ + // Delete device's allocated object + if(ao) + { + delete ao; + ao = 0; + } + if(ch0) + { + delete ch0; + ch0 = 0; + } + if(ch1) + { + delete ch1; + ch1 = 0; + } + if(ch2) + { + delete ch2; + ch2 = 0; + } + if(ch3) + { + delete ch3; + ch3 = 0; + } + if(ch4) + { + delete ch4; + ch4 = 0; + } + if(ch5) + { + delete ch5; + ch5 = 0; + } + if(ch6) + { + delete ch6; + ch6 = 0; + } + if(ch7) + { + delete ch7; + ch7 = 0; + } +} + +//+---------------------------------------------------------------------------- +// +// method : ContinuousAO::init_device() +// +// description : will be called at device initialization. +// +//----------------------------------------------------------------------------- +void ContinuousAO::init_device() +{ + INFO_STREAM << "ContinuousAO::ContinuousAO() create device " << device_name << endl; + + ao = 0; + ch0 = 0; + ch1 = 0; + ch2 = 0; + ch3 = 0; + ch4 = 0; + ch5 = 0; + ch6 = 0; + ch7 = 0; + + // Initialise variables to default values + //-------------------------------------------- + get_device_property(); + + //- create a continuous analog output daq + ao = new ADLinkContinuousAO(this); + + //- check memory allocation + if (ao == 0) + { + this->set_internal_state(); + Tango::Except::throw_exception( + (const char*)("OUT_OF_MEMORY"), + (const char*)("out of memory error"), + (const char*)("ContinuousAO::init_device") + ); + } + + asl::ContinuousAOConfig config; + ch0 = new double[bufferDepth]; + ch1 = new double[bufferDepth]; + ch2 = new double[bufferDepth]; + ch3 = new double[bufferDepth]; + ch4 = new double[bufferDepth]; + ch5 = new double[bufferDepth]; + ch6 = new double[bufferDepth]; + ch7 = new double[bufferDepth]; + if(ch0 == 0 || ch1 == 0 || ch2 == 0 || ch3 == 0 || ch4 == 0 || ch5 == 0 ||ch6 == 0 || ch7 == 0) + { + this->set_internal_state(); + this->delete_device(); + Tango::Except::throw_exception( + (const char*)("OUT_OF_MEMORY"), + (const char*)("out of memory error"), + (const char*)("ContinuousAO::init_device") + ); + } + + + // default waveform for group A (channel 0 to 3) + asl::AOScaledData default_waveformA(bufferDepth); + double max_valA; + if(aORefSource == adl::external_reference) + max_valA = aORefA ; + else + max_valA = 10.0; + + // fill buffer with a sin signal + for (unsigned long i = 0; i < bufferDepth; i++) + { + (default_waveformA)[i] = ::sin((double)i * 2. * 3.14159 / (double) bufferDepth) * max_valA; + } + + ACE_OS::memcpy(this->ch0, default_waveformA.base(), default_waveformA.size()); + ACE_OS::memcpy(this->ch1, default_waveformA.base(), default_waveformA.size()); + ACE_OS::memcpy(this->ch2, default_waveformA.base(), default_waveformA.size()); + ACE_OS::memcpy(this->ch3, default_waveformA.base(), default_waveformA.size()); + + // default waveform for group A (channel 4 to 7) + asl::AOScaledData default_waveformB(bufferDepth); + double max_valB; + if(aORefSource == adl::external_reference) + max_valB = aORefB; + else + max_valB = 10.0; + + // fill buffer with a square signal + for (i = 0; i < bufferDepth/2; i++) + { + default_waveformB[i] = max_valB - 0.01; + } + for (i = bufferDepth/2; i < bufferDepth; i++) + { + default_waveformB[i] = -max_valB + 0.01; + } + ACE_OS::memcpy(this->ch4, default_waveformB.base(), default_waveformB.size()); + ACE_OS::memcpy(this->ch5, default_waveformB.base(), default_waveformB.size()); + ACE_OS::memcpy(this->ch6, default_waveformB.base(), default_waveformB.size()); + ACE_OS::memcpy(this->ch7, default_waveformB.base(), default_waveformB.size()); + + //--------------------------channels config------------------------------------ + asl::ActiveAOChannel ac; + + // configure all channels + ac.polarity = (adl::OutputPolarity)polarity; + ac.volt_ref_src = (adl::VoltageReferenceSource)aORefSource; + ac.volt_ref = 10.0; + + //- active/config. channel 0 + if(channel0Enable) + { + ac.id = 0; + if(aORefSource == adl::external_reference) + ac.volt_ref = aORefA; + config.add_active_channel(ac); + + if(channel0Waveform.empty()) + { + WARN_STREAM<<"No waveform is saved in database for channel 0, using a default one"<<endl; + config.set_channel_periodic_data(0, default_waveformA); + } + else if(channel0Waveform.size() != bufferDepth) + { + WARN_STREAM<<"The waveform saved in database for channel 0 has a different size from property BufferDepth, "<< + "using default waveform"<<endl; + config.set_channel_periodic_data(0, default_waveformA); + } + else //put waveform of the Tango database in ch0 + { + // copy the input data in a buffer of type asl::AOScaledData + asl::AOScaledData data(bufferDepth); + for(int i=0; i<bufferDepth; i++) + data[i] = channel0Waveform[i]; + // put the waveform in the configuration + config.set_channel_periodic_data(0, data); + //cpy data in the attribute of the device + ::memcpy(ch0, data.base(), data.size()); + } + } + //- active/config. channel 1 + if(channel1Enable) + { + ac.id = 1; + if(aORefSource == adl::external_reference) + ac.volt_ref = aORefA; + config.add_active_channel(ac); + + if(channel1Waveform.empty()) + { + WARN_STREAM<<"No waveform is saved in database for channel 1, using a default one"<<endl; + config.set_channel_periodic_data(1, default_waveformA); + } + else if(channel1Waveform.size() != bufferDepth) + { + WARN_STREAM<<"The waveform saved in database for channel 1 has a different size from property BufferDepth, "<< + "using default waveform"<<endl; + config.set_channel_periodic_data(1, default_waveformA); + } + else //put waveform of the Tango database in ch1 + { + // copy the input data in a buffer of type asl::AOScaledData + asl::AOScaledData data(bufferDepth); + for(int i=0; i<bufferDepth; i++) + data[i] = channel1Waveform[i]; + // put the waveform in the configuration + config.set_channel_periodic_data(1, data); + //cpy data in the attribute of the device + ::memcpy(ch1, data.base(), data.size()); + } + } + //- active/config. channel 2 + if(channel2Enable) + { + ac.id = 2; + if(aORefSource == adl::external_reference) + ac.volt_ref = aORefA; + config.add_active_channel(ac); + config.set_channel_periodic_data(2, default_waveformA); + + if(channel2Waveform.empty()) + { + WARN_STREAM<<"No waveform is saved in database for channel 2, using a default one"<<endl; + config.set_channel_periodic_data(2, default_waveformA); + } + else if(channel2Waveform.size() != bufferDepth) + { + WARN_STREAM<<"The waveform saved in database for channel 2 has a different size from property BufferDepth, "<< + "using default waveform"<<endl; + config.set_channel_periodic_data(2, default_waveformA); + } + else //put waveform of the Tango database in ch2 + { + // copy the input data in a buffer of type asl::AOScaledData + asl::AOScaledData data(bufferDepth); + for(int i=0; i<bufferDepth; i++) + data[i] = channel2Waveform[i]; + // put the waveform in the configuration + config.set_channel_periodic_data(2, data); + //cpy data in the attribute of the device + ::memcpy(ch2, data.base(), data.size()); + } + } + //- active/config. channel 3 + if(channel3Enable) + { + ac.id = 3; + if(aORefSource == adl::external_reference) + ac.volt_ref = aORefA; + config.add_active_channel(ac); + + if(channel3Waveform.empty()) + { + WARN_STREAM<<"No waveform is saved in database for channel 3, using a default one"<<endl; + config.set_channel_periodic_data(3, default_waveformA); + } + else if(channel3Waveform.size() != bufferDepth) + { + WARN_STREAM<<"The waveform saved in database for channel 3 has a different size from property BufferDepth, "<< + "using default waveform"<<endl; + config.set_channel_periodic_data(3, default_waveformA); + } + else //put waveform of the Tango database in ch3 + { + // copy the input data in a buffer of type asl::AOScaledData + asl::AOScaledData data(bufferDepth); + for(int i=0; i<bufferDepth; i++) + data[i] = channel3Waveform[i]; + // put the waveform in the configuration + config.set_channel_periodic_data(3, data); + //cpy data in the attribute of the device + ::memcpy(ch3, data.base(), data.size()); + } + } + //- active/config. channel 4 + if(channel4Enable) + { + ac.id = 4; + if(aORefSource == adl::external_reference) + ac.volt_ref = aORefB; + config.add_active_channel(ac); + + if(channel4Waveform.empty()) + { + WARN_STREAM<<"No waveform is saved in database for channel 4, using a default one"<<endl; + config.set_channel_periodic_data(4, default_waveformA); + } + else if(channel4Waveform.size() != bufferDepth) + { + WARN_STREAM<<"The waveform saved in database for channel 4 has a different size from property BufferDepth, "<< + "using default waveform"<<endl; + config.set_channel_periodic_data(4, default_waveformA); + } + else //put waveform of the Tango database in ch4 + { + // copy the input data in a buffer of type asl::AOScaledData + asl::AOScaledData data(bufferDepth); + for(int i=0; i<bufferDepth; i++) + data[i] = channel4Waveform[i]; + // put the waveform in the configuration + config.set_channel_periodic_data(4, data); + //cpy data in the attribute of the device + ::memcpy(ch4, data.base(), data.size()); + } + } + //- active/config. channel 5 + if(channel5Enable) + { + ac.id = 5; + if(aORefSource == adl::external_reference) + ac.volt_ref = aORefB; + config.add_active_channel(ac); + config.set_channel_periodic_data(5, default_waveformB); + } + //- active/config. channel 6 + if(channel6Enable) + { + ac.id = 6; + if(aORefSource == adl::external_reference) + ac.volt_ref = aORefB; + config.add_active_channel(ac); + + if(channel6Waveform.empty()) + { + WARN_STREAM<<"No waveform is saved in database for channel 6, using a default one"<<endl; + config.set_channel_periodic_data(6, default_waveformA); + } + else if(channel6Waveform.size() != bufferDepth) + { + WARN_STREAM<<"The waveform saved in database for channel 6 has a different size from property BufferDepth, "<< + "using default waveform"<<endl; + config.set_channel_periodic_data(6, default_waveformA); + } + else //put waveform of the Tango database in ch6 + { + // copy the input data in a buffer of type asl::AOScaledData + asl::AOScaledData data(bufferDepth); + for(int i=0; i<bufferDepth; i++) + data[i] = channel6Waveform[i]; + // put the waveform in the configuration + config.set_channel_periodic_data(6, data); + //cpy data in the attribute of the device + ::memcpy(ch6, data.base(), data.size()); + } + } + //- active/config. channel 7 + if(channel7Enable) + { + ac.id = 7; + if(aORefSource == adl::external_reference) + ac.volt_ref = aORefB; + config.add_active_channel(ac); + + if(channel7Waveform.empty()) + { + WARN_STREAM<<"No waveform is saved in database for channel 7, using a default one"<<endl; + config.set_channel_periodic_data(7, default_waveformA); + } + else if(channel7Waveform.size() != bufferDepth) + { + WARN_STREAM<<"The waveform saved in database for channel 7 has a different size from property BufferDepth, "<< + "using default waveform"<<endl; + config.set_channel_periodic_data(7, default_waveformA); + } + else //put waveform of the Tango database in ch7 + { + // copy the input data in a buffer of type asl::AOScaledData + asl::AOScaledData data(bufferDepth); + for(int i=0; i<bufferDepth; i++) + data[i] = channel7Waveform[i]; + // put the waveform in the configuration + config.set_channel_periodic_data(7, data); + //cpy data in the attribute of the device + ::memcpy(ch7, data.base(), data.size()); + } + } + //--------------------------------start trigger config--------------------------------- + if(startTrigger) + { + config.set_trigger_source((adl::AIOTriggerSource)startTriggerSource); + config.set_trigger_mode(adl::ao_post); + if(startTriggerSource == adl::external_digital) + { + config.set_trigger_polarity((adl::AOTriggerPolarity)dTRIGPolarity); + } + else if(startTriggerSource == adl::external_analog) + { + config.set_analog_trigger_source(adl::analog_trigger_ext); + config.set_analog_trigger_condition((adl::AnalogTriggerCondition)aTRIGSelection); + unsigned short level; + if(aTRIGLevel>=0) + level = (aTRIGLevel / 0.078125) + 127; + else // v < 0 + level = (-aTRIGLevel / 0.078125); + //the voltage is converted in digital value (8 bits of resolution on EXTATRIG with +/-10 V (256/20 = 0.078125)) + config.set_analog_low_level_condition(level); + config.set_analog_high_level_condition(level); + } + } + //--------------------------------stop trigger config--------------------------------- + if(stopTrigger) + { + config.set_stop_mode(adl::wait_end_waveform); + config.set_stop_source ((adl::StopSource)stopTriggerSource); + } + + config.set_output_rate(frequency); + + DEBUG_STREAM<<"ContinuousAO::init_device : init acq"<<std::endl; + _ASL_TRY_ACTION + ( + ao->init(adl::DAQ2502, 0), + "init", + "ContinuousAO::init_device", + this->set_internal_state() + ); + + DEBUG_STREAM<<"ContinuousAO::init_device : config acq"<<std::endl; + _ASL_TRY_ACTION + ( + ao->configure(config), + "configure", + "ContinuousAO::init_device", + this->set_internal_state() + ); + + +} + + +//+---------------------------------------------------------------------------- +// +// method : ContinuousAO::readDeviceProperies() +// +// description : Read the device properties from database. +// +//----------------------------------------------------------------------------- +void ContinuousAO::get_device_property() +{ + // Initialize your default values here. + //------------------------------------------ + boardNum = 0; + frequency = 50000.0; //50 kHz + + startTrigger = 0; //no start trigger + stopTrigger = 0; //no stop trigger + + string default_start_source = "DTRIG"; + startTriggerSource = adl::external_digital; + + string default_stop_source = "AFI1"; + stopTriggerSource = adl::afi1_termination; + + string default_atrig_select = "BELOW"; + aTRIGSelection = adl::below_low_level; + + aTRIGLevel = 5.0; + + string default_dtrig_pol = "RISING"; + dTRIGPolarity = adl::ao_rising_edge ; + + aORefA = 10.0; + aORefB = 10.0; + + string default_pol = "BP"; + polarity = adl::bipolar; + + string default_aoref = "INTERN"; + aORefSource = adl::internal_reference; + + channel0Enable = 1; + channel1Enable = 0; + channel2Enable = 0; + channel3Enable = 0; + channel4Enable = 0; + channel5Enable = 0; + channel6Enable = 0; + channel7Enable = 0; + + bufferDepth = 4096; + + // Read device properties from database.(Automatic code generation) + //------------------------------------------------------------- + Tango::DbData data; + data.push_back(Tango::DbDatum("BoardNum")); + data.push_back(Tango::DbDatum("Frequency")); + data.push_back(Tango::DbDatum("StartTrigger")); + data.push_back(Tango::DbDatum("StopTrigger")); + data.push_back(Tango::DbDatum("StartTriggerSource")); + data.push_back(Tango::DbDatum("StopTriggerSource")); + data.push_back(Tango::DbDatum("ATRIGSelection")); + data.push_back(Tango::DbDatum("ATRIGLevel")); + data.push_back(Tango::DbDatum("DTRIGPolarity")); + data.push_back(Tango::DbDatum("AORefA")); + data.push_back(Tango::DbDatum("AORefB")); + data.push_back(Tango::DbDatum("Polarity")); + data.push_back(Tango::DbDatum("AORefSource")); + data.push_back(Tango::DbDatum("Channel0Enable")); + data.push_back(Tango::DbDatum("Channel1Enable")); + data.push_back(Tango::DbDatum("Channel2Enable")); + data.push_back(Tango::DbDatum("Channel3Enable")); + data.push_back(Tango::DbDatum("Channel4Enable")); + data.push_back(Tango::DbDatum("Channel5Enable")); + data.push_back(Tango::DbDatum("Channel6Enable")); + data.push_back(Tango::DbDatum("Channel7Enable")); + data.push_back(Tango::DbDatum("BufferDepth")); + data.push_back(Tango::DbDatum("Channel0Waveform")); + data.push_back(Tango::DbDatum("Channel1Waveform")); + data.push_back(Tango::DbDatum("Channel2Waveform")); + data.push_back(Tango::DbDatum("Channel3Waveform")); + data.push_back(Tango::DbDatum("Channel4Waveform")); + data.push_back(Tango::DbDatum("Channel5Waveform")); + data.push_back(Tango::DbDatum("Channel6Waveform")); + data.push_back(Tango::DbDatum("Channel7Waveform")); + + // Call database and extract values + //-------------------------------------------- + get_db_device()->get_property(data); + + + // End of Automatic code generation + //------------------------------------------------------------- + Tango::DbData data_put; + //------------------------------------------------------------- + if (data[0].is_empty()==false) + { + unsigned short bnum; + data[1] >> bnum; + //check value + if(bnum<0 || bnum>= 7)//num max of boards in chassis + { + WARN_STREAM<<"ContinuousAO::get_device_property: the value of BoardNum is invalid" + <<"using default value "<<boardNum<<endl; + } + else + { + boardNum = bnum; + } + } + else + { + Tango::DbDatum property("BoardNum"); + property << boardNum; + data_put.push_back(property); + WARN_STREAM<<"BoardNum property is not set in database, loading default value in database:" + <<boardNum<<endl; + } + //------------------------------------------------------------- + if (data[1].is_empty()==false) + { + data[1] >> frequency; + } + else + { + Tango::DbDatum property("Frequency"); + property << frequency; + data_put.push_back(property); + WARN_STREAM<<"Frequency property is not set in database, loading default value in database:" + <<frequency<<endl; + } + //------------------------------------------------------------- + if (data[2].is_empty()==false) + { + data[2] >> startTrigger; + } + else + { + Tango::DbDatum property("StartTrigger"); + property << startTrigger; + data_put.push_back(property); + WARN_STREAM<<"StartTrigger property is not set in database, loading default value in database:" + <<startTrigger<<endl; + } + //------------------------------------------------------------- + if (data[3].is_empty()==false) + { + data[3] >> stopTrigger; + } + else + { + Tango::DbDatum property("StopTrigger"); + property << stopTrigger; + data_put.push_back(property); + WARN_STREAM<<"StopTrigger property is not set in database, loading default value in database:" + <<stopTrigger<<endl; + } + //------------------------------------------------------------- + if (data[4].is_empty()==false) + { + data[4] >> startTriggerSource; + string start_source; + data[4] >> start_source; + if(start_source == "DTRIG") + startTriggerSource = adl::external_digital; + else if(start_source == "ATRIG") + startTriggerSource = adl::external_analog; + else + WARN_STREAM<<"ContinuousAO::get_device_property: the value of StartTriggerSource is not valid" + <<"using default value "<<default_start_source<<endl; + } + else + { + Tango::DbDatum property("StartTriggerSource"); + property << default_start_source; + data_put.push_back(property); + WARN_STREAM<<"StartTriggerSource property is not set in database, loading default value in database:" + <<default_start_source<<endl; + } + //------------------------------------------------------------- + if (data[5].is_empty()==false) + { + string stop_source; + data[5] >> stop_source; + if(stop_source == "ATRIG") + stopTriggerSource = adl::analog_trigger_termination; + else if(stop_source == "AFI0") + stopTriggerSource = adl::afi0_termination; + else if(stop_source == "AFI1") + stopTriggerSource = adl::afi1_termination; + else + WARN_STREAM<<"ContinuousAO::get_device_property: the value of StopTriggerSource is not valid" + <<"using default value "<<default_stop_source<<endl; + } + else + { + Tango::DbDatum property("StopTriggerSource"); + property << default_stop_source; + data_put.push_back(property); + WARN_STREAM<<"StopTriggerSource property is not set in database, loading default value in database:" + <<default_stop_source<<endl; + } + //------------------------------------------------------------- + if (data[6].is_empty()==false) + { + string atrig_select; + data[6] >> atrig_select; + if(atrig_select == "BELOW") + aTRIGSelection = adl::below_low_level; + else if(atrig_select == "ABOVE") + aTRIGSelection = adl::above_high_level; + else + WARN_STREAM<<"ContinuousAO::get_device_property: the value of ATRIGSelection is not valid" + <<"using default value "<<default_atrig_select<<endl; + } + else + { + Tango::DbDatum property("ATRIGSelection"); + property << default_atrig_select; + data_put.push_back(property); + WARN_STREAM<<"ATRIGSelection property is not set in database, loading default value in database:" + <<default_atrig_select<<endl; + } + //------------------------------------------------------------- + if (data[7].is_empty()==false) + { + data[7] >> aTRIGLevel; + } + else + { + Tango::DbDatum property("ATRIGLevel"); + property << aTRIGLevel; + data_put.push_back(property); + WARN_STREAM<<"ATRIGLevel property is not set in database, loading default value in database:" + <<aTRIGLevel<<endl; + } + //------------------------------------------------------------- + if (data[8].is_empty()==false) + { + string dtrig_pol; + data[8] >> dtrig_pol; + if(dtrig_pol == "RISING") + dTRIGPolarity = adl::ao_rising_edge; + else if(dtrig_pol == "FALLING") + dTRIGPolarity = adl::ao_falling_edge; + else + WARN_STREAM<<"ContinuousAO::get_device_property: the value of DTRIGPolarity is not valid" + <<"using default value "<<default_dtrig_pol<<endl; + } + else + { + Tango::DbDatum property("DTRIGPolarity"); + property << default_dtrig_pol; + data_put.push_back(property); + WARN_STREAM<<"DTRIGPolarity property is not set in database, loading default value in database:" + <<default_dtrig_pol<<endl; + } + //------------------------------------------------------------- + if (data[9].is_empty()==false) + { + double ref; + data[9] >> ref; + if(ref >= -10.0 || ref <= 10.0) + aORefA = ref; + else + WARN_STREAM<<"ContinuousAO::get_device_property: the value of AORefA is not valid" + <<"using default value "<<aORefA<<endl; + } + else + { + Tango::DbDatum property("AORefA"); + property << aORefA; + data_put.push_back(property); + WARN_STREAM<<"AORefA property is not set in database, loading default value in database:" + <<aORefA<<endl; + } + //------------------------------------------------------------- + if (data[10].is_empty()==false) + { + double ref; + data[9] >> ref; + if(ref >= -10.0 || ref <= 10.0) + aORefB = ref; + else + WARN_STREAM<<"ContinuousAO::get_device_property: the value of AORefB is not valid" + <<"using default value "<<aORefB<<endl; + } + else + { + Tango::DbDatum property("AORefB"); + property << aORefB; + data_put.push_back(property); + WARN_STREAM<<"AORefB property is not set in database, loading default value in database:" + <<aORefB<<endl; + } + //------------------------------------------------------------- + if (data[11].is_empty()==false) + { + string pol; + data[11] >> pol; + if(pol == "BP") + polarity = adl::bipolar; + else if(pol == "UP") + polarity = adl::unipolar; + else + WARN_STREAM<<"ContinuousAO::get_device_property: the value of Polarity is not valid" + <<"using default value "<<default_pol<<endl; + } + else + { + Tango::DbDatum property("Polarity"); + property << default_pol; + data_put.push_back(property); + WARN_STREAM<<"Polarity property is not set in database, loading default value in database:" + <<default_pol<<endl; + } + //------------------------------------------------------------- + if (data[12].is_empty()==false) + { + string aoref; + data[12] >> aoref; + if(aoref == "INTERN") + aORefSource = adl::internal_reference; + else if(aoref == "EXTERN") + aORefSource = adl::external_reference; + else + WARN_STREAM<<"ContinuousAO::get_device_property: the value of AORefSource is not valid" + <<"using default value "<<default_aoref<<endl; + } + else + { + Tango::DbDatum property("AORefSource"); + property << default_aoref; + data_put.push_back(property); + WARN_STREAM<<"AORefSource property is not set in database, loading default value in database:" + <<default_aoref<<endl; + } + //------------------------------------------------------------- + if (data[13].is_empty()==false) + { + data[13] >> channel0Enable; + } + else + { + Tango::DbDatum property("Channel0Enable"); + property << channel0Enable; + data_put.push_back(property); + WARN_STREAM<<"Channel0Enable property is not set in database, loading default value in database:" + <<channel0Enable<<endl; + } + //------------------------------------------------------------- + if (data[14].is_empty()==false) + { + data[14] >> channel1Enable; + } + else + { + Tango::DbDatum property("Channel1Enable"); + property << channel1Enable; + data_put.push_back(property); + WARN_STREAM<<"Channel1Enable property is not set in database, loading default value in database:" + <<channel1Enable<<endl; + } + //------------------------------------------------------------- + if (data[15].is_empty()==false) + { + data[15] >> channel2Enable; + } + else + { + Tango::DbDatum property("Channel2Enable"); + property << channel2Enable; + data_put.push_back(property); + WARN_STREAM<<"Channel2Enable property is not set in database, loading default value in database:" + <<channel2Enable<<endl; + } + //------------------------------------------------------------- + if (data[16].is_empty()==false) + { + data[16] >> channel3Enable; + } + else + { + Tango::DbDatum property("Channel3Enable"); + property << channel3Enable; + data_put.push_back(property); + WARN_STREAM<<"Channel3Enable property is not set in database, loading default value in database:" + <<channel3Enable<<endl; + } + //------------------------------------------------------------- + if (data[17].is_empty()==false) + { + data[17] >> channel4Enable; + } + else + { + Tango::DbDatum property("Channel4Enable"); + property << channel4Enable; + data_put.push_back(property); + WARN_STREAM<<"Channel4Enable property is not set in database, loading default value in database:" + <<channel4Enable<<endl; + } + //------------------------------------------------------------- + if (data[18].is_empty()==false) + { + data[18] >> channel5Enable; + } + else + { + Tango::DbDatum property("Channel5Enable"); + property << channel5Enable; + data_put.push_back(property); + WARN_STREAM<<"Channel5Enable property is not set in database, loading default value in database:" + <<channel5Enable<<endl; + } + //------------------------------------------------------------- + if (data[19].is_empty()==false) + { + data[19] >> channel6Enable; + } + else + { + Tango::DbDatum property("Channel6Enable"); + property << channel6Enable; + data_put.push_back(property); + WARN_STREAM<<"Channel6Enable property is not set in database, loading default value in database:" + <<channel6Enable<<endl; + } + //------------------------------------------------------------- + if (data[20].is_empty()==false) + { + data[20] >> channel7Enable; + } + else + { + Tango::DbDatum property("Channel7Enable"); + property << channel7Enable; + data_put.push_back(property); + WARN_STREAM<<"Channel7Enable property is not set in database, loading default value in database:" + <<channel7Enable<<endl; + } + //------------------------------------------------------------- + if (data[21].is_empty()==false) + { + data[21] >> bufferDepth; + } + else + { + Tango::DbDatum property("BufferDepth"); + property << bufferDepth; + data_put.push_back(property); + WARN_STREAM<<"BufferDepth property is not set in database, loading default value in database:" + <<bufferDepth<<endl; + } + //update database for not initiliazed properties + get_db_device()->put_property(data_put); +} +//+---------------------------------------------------------------------------- +// +// method : ContinuousAO::always_executed_hook() +// +// description : method always executed before any command is executed +// +//----------------------------------------------------------------------------- +void ContinuousAO::always_executed_hook() +{ + +} + +//+---------------------------------------------------------------------------- +// +// method : ContinuousAO::read_attr_hardware() +// +// description : Hardware acquisition for attributes. +// +//----------------------------------------------------------------------------- +void ContinuousAO::read_attr_hardware(vector<long> &attr_list) +{ + DEBUG_STREAM << "In read_attr_hardware for " << attr_list.size(); + DEBUG_STREAM << " attribute(s)" << endl; + + // Add your own code here + //--------------------------------- + ao->lock_data(); + + this->err_ctr = ao->err_ctr; + + ao->unlock_data(); + +} + +//+---------------------------------------------------------------------------- +// +// method : ContinuousAO::read_attr() +// +// description : Extract real attribute values from +// hardware acquisition result. +// +//----------------------------------------------------------------------------- +void ContinuousAO::read_attr(Tango::Attribute &attr) +{ + string &attr_name = attr.get_name(); + + DEBUG_STREAM << "In read_attr for attribute " << attr_name << endl; + + // Switch on attribute name + //--------------------------------- + if (attr_name == "channel0") + { + if(channel0Enable) + attr.set_value(ch0, bufferDepth); + else + attr.set_quality(Tango::ATTR_INVALID); + } + else if (attr_name == "channel1") + { + if(channel1Enable) + attr.set_value(ch1, bufferDepth); + else + attr.set_quality(Tango::ATTR_INVALID); + } + else if (attr_name == "channel2") + { + if(channel2Enable) + attr.set_value(ch2, bufferDepth); + else + attr.set_quality(Tango::ATTR_INVALID); + } + else if (attr_name == "channel3") + { + if(channel3Enable) + attr.set_value(ch3, bufferDepth); + else + attr.set_quality(Tango::ATTR_INVALID); + } + else if (attr_name == "channel4") + { + if(channel4Enable) + attr.set_value(ch4, bufferDepth); + else + attr.set_quality(Tango::ATTR_INVALID); + } + else if (attr_name == "channel5") + { + if(channel5Enable) + attr.set_value(ch5, bufferDepth); + else + attr.set_quality(Tango::ATTR_INVALID); + } + else if (attr_name == "channel6") + { + if(channel6Enable) + attr.set_value(ch6, bufferDepth); + else + attr.set_quality(Tango::ATTR_INVALID); + } + else if (attr_name == "channel7") + { + if(channel7Enable) + attr.set_value(ch7, bufferDepth); + else + attr.set_quality(Tango::ATTR_INVALID); + } + else if (attr_name == "errorCounter") + { + attr.set_value(&err_ctr); + } + else if (attr_name == "useBoardFifo") + { + // the information about data loading on fifo in available only after Start command. + if(this->get_state() == Tango::RUNNING) + attr.set_value(&use_fifo); + else + attr.set_quality(Tango::ATTR_INVALID); + } +} + +//+------------------------------------------------------------------ +/** + * method: ContinuousAO::start + * + * description: method to execute "Start" + * start the generation. + * + * + */ +//+------------------------------------------------------------------ +void ContinuousAO::start() +{ + DEBUG_STREAM << "ContinuousAO::start(): entering... !" << endl; + + _ASL_TRY_ACTION + ( + ao->start(), + "start", + "ContinuousAO::start", + this->set_internal_state() + ); + + // get if the output data have been loaded in the onboard FIFO. + // depends on the size of the buffer. + this->use_fifo = ao->use_board_fifo(); + +} + +//+------------------------------------------------------------------ +/** + * method: ContinuousAO::stop + * + * description: method to execute "Stop" + * stop the generation. + * + * + */ +//+------------------------------------------------------------------ +void ContinuousAO::stop() +{ + DEBUG_STREAM << "ContinuousAO::stop(): entering... !" << endl; + + _ASL_TRY_ACTION + ( + ao->stop(), + "stop", + "ContinuousAO::stop", + this->set_internal_state() + ); + +} + +//+------------------------------------------------------------------ +/** + * method: ContinuousAO::set_aoscaled_data + * + * description: method to execute "SetAOScaledData" + * Give one period of the signal to generated of a specified channel in volts. + * + * @param argin The channel number (string). The output data in volts (double) + * + */ +//+------------------------------------------------------------------ +void ContinuousAO::set_aoscaled_data(const Tango::DevVarDoubleStringArray *argin) +{ + DEBUG_STREAM << "ContinuousAO::set_aoscaled_data(): entering... !" << endl; + + if((*argin).svalue.length() != 1) + { + Tango::Except::throw_exception( + (const char*)("OPERATION_NOT_ALLOWED"), + (const char*)("The size of the string argument must be 1"), + (const char*)("ContinuousAO::set_aoscaled_data") + ); + } + Tango::DevVarStringArray chan_dvsa = (*argin).svalue; + string chan_s = chan_dvsa[0]; + char chan = chan_s[0]; + if(chan < '0' || chan > '7') + { + Tango::Except::throw_exception( + (const char*)("OPERATION_NOT_ALLOWED"), + (const char*)("The string argument must be between 0 and 7"), + (const char*)("ContinuousAO::set_aoscaled_data") + ); + } + if((*argin).dvalue.length() != bufferDepth) + { + Tango::Except::throw_exception( + (const char*)("OPERATION_NOT_ALLOWED"), + (const char*)("The depth of the given buffer must be the same as specified in Device Properties"), + (const char*)("ContinuousAO::set_aoscaled_data") + ); + } + + // stop the current generation + _ASL_TRY_ACTION + ( + ao->stop(), + "stop", + "ContinuousAO::set_aoscaled_data", + this->set_internal_state() + ); + + // get the configuration + asl::ContinuousAOConfig config = ao->configuration(); + + // copy the input data in a buffer of type asl::AOScaledData + asl::AOScaledData data(bufferDepth); + ::memcpy(data.base(), (*argin).dvalue.get_buffer(), ((*argin).dvalue.length())*sizeof(double)); + + //NB: if a chan hasn't been enable with properties, 'ao' will do nothing + config.set_channel_periodic_data(chan - '0', data); + + // copy the new data in the attributes of the device. + switch(chan) + { + case '0': + ::memcpy(ch0, data.base(), data.size()); + //save the waveform in the database + this->save_waveform(ch0, "Channel0Waveform"); + break; + case '1': + ::memcpy(ch1, data.base(), data.size()); + //save the waveform in the database + this->save_waveform(ch1, "Channel1Waveform"); + break; + case '2': + ::memcpy(ch2, data.base(), data.size()); + //save the waveform in the database + this->save_waveform(ch2, "Channel2Waveform"); + break; + case '3': + ::memcpy(ch3, data.base(), data.size()); + //save the waveform in the database + this->save_waveform(ch3, "Channel3Waveform"); + break; + case '4': + ::memcpy(ch4, data.base(), data.size()); + //save the waveform in the database + this->save_waveform(ch4, "Channel4Waveform"); + break; + case '5': + ::memcpy(ch5, data.base(), data.size()); + //save the waveform in the database + this->save_waveform(ch5, "Channel5Waveform"); + break; + case '6': + ::memcpy(ch6, data.base(), data.size()); + //save the waveform in the database + this->save_waveform(ch6, "Channel6Waveform"); + break; + case '7': + ::memcpy(ch7, data.base(), data.size()); + //save the waveform in the database + this->save_waveform(ch7, "Channel7Waveform"); + break; + default: + Tango::Except::throw_exception( + (const char*)("OPERATION_NOT_ALLOWED"), + (const char*)("The string argument must be between 0 and 7"), + (const char*)("ContinuousAO::set_aoscaled_data") + ); + break; + } + + // give the configuration with a new channel + _ASL_TRY_ACTION + ( + ao->configure(config), + "configure", + "ContinuousAO::set_aoscaled_data", + this->set_internal_state() + ); + +} +//+------------------------------------------------------------------ +/** +* method: ContinuousAO::set_internal_state +*/ +//+------------------------------------------------------------------ +void ContinuousAO::set_internal_state(void) +{ + if(ao == 0) + { + this->set_state(Tango::UNKNOWN); + this->set_status("The acquisition was not initialized properly"); + } + else + { + switch(ao->state()) + { + case asl::ContinuousAO::STANDBY: + this->set_state(Tango::STANDBY); + this->set_status("The acquisition is stopped"); + break; + case asl::ContinuousAO::RUNNING: + case asl::ContinuousAO::RESTARTING: + case asl::ContinuousAO::ABORTING: + this->set_state(Tango::RUNNING); + this->set_status("The acquisition is running"); + break; + case asl::ContinuousAO::UNKNOWN: + default: + this->set_state(Tango::UNKNOWN); + this->set_status("The acquisition is in an unknown state"); + break; + } + } +} +//+------------------------------------------------------------------ +/** +* method: ContinuousAO::save_waveform +* Save a waveform in tango database +*/ +//+------------------------------------------------------------------ +void ContinuousAO::save_waveform(double* waveform, string wfm_channel) +{ + // cpy the waveform in a double vector + vector<double> vec; + for(int i=0; i<bufferDepth; i++) + vec.push_back(waveform[i]); + + //put the vector in a DBDatum + Tango::DbDatum dbdatum(wfm_channel); + dbdatum << vec; + + // put it in a DbData + Tango::DbData db_data; + db_data.push_back(dbdatum); + + // put the waveform in the database + _DEV_TRY + ( + get_db_device()->put_property(db_data), + "put_property", + "ContinuousAO::save_waveform", + ); +} +} // namespace diff --git a/src/ContinuousAO.h b/src/ContinuousAO.h new file mode 100644 index 0000000..4678e05 --- /dev/null +++ b/src/ContinuousAO.h @@ -0,0 +1,335 @@ +//============================================================================= +// +// file : ContinuousAO.h +// +// description : Include for the ContinuousAO class. +// +// project : Continuous Anolog Output +// +// $Author: syldup $ +// +// $Revision: 1.1.1.1 $ +// +// $Log: not supported by cvs2svn $ +// +// copyleft : Synchrotron SOLEIL +// L'Orme des Merisiers +// Saint-Aubin - BP 48 + +// +//============================================================================= +// +// This file is generated by POGO +// (Program Obviously used to Generate tango Object) +// +// (c) - Software Engineering Group - ESRF +//============================================================================= +#ifndef _CONTINUOUSAO_H +#define _CONTINUOUSAO_H + +#include <ADLinkContinuousAO.h> +#include <tango.h> + + +//using namespace Tango; + +/** + * @author $Author: syldup $ + * @version $Revision: 1.1.1.1 $ $ + */ + + // Add your own constants definitions here. + //----------------------------------------------- + + +namespace ContinuousAO +{ + +/** + * Class Description: + * Perform continuous anolog ouput (waveform generation) on the selected outputs. + */ + +/* + * Device States Description: + * Tango::UNKNOWN : + * Tango::STANDBY : + * Tango::RUNNING : + */ + + +class ContinuousAO: public Tango::Device_2Impl +{ +public : + // Add your own data members here + //----------------------------------------- + + + // Here is the Start of the automatic code generation part + //------------------------------------------------------------- +/** + * @name attributes + * Attributs member data. + */ +//@{ + Tango::DevDouble *attr_channel0_read; + Tango::DevDouble *attr_channel1_read; + Tango::DevDouble *attr_channel2_read; + Tango::DevDouble *attr_channel3_read; + Tango::DevDouble *attr_channel4_read; + Tango::DevDouble *attr_channel5_read; + Tango::DevDouble *attr_channel6_read; + Tango::DevDouble *attr_channel7_read; + Tango::DevDouble *attr_errorCounter_read; + Tango::DevShort *attr_useBoardFifo_read; +//@} + +/** + * @name Device properties + * Device properties member data. + */ +//@{ +/** + * The number of the board in the chassis cPCI. + */ + Tango::DevUShort boardNum; +/** + * The output frequency (the rate the samples are outputed). + */ + Tango::DevDouble frequency; +/** + * 1 if using a start trigger, 0 otherwise. + */ + Tango::DevShort startTrigger; +/** + * 1 if using a stop trigger, 0 otherwise. + */ + Tango::DevShort stopTrigger; +/** + * The start trigger source. Analog trigger DTRIG or ATRIG. + */ + Tango::DevUShort startTriggerSource; +/** + * The stop trigger source. anolog trigger ATRIG or pin AFI0 of AFI1. + */ + Tango::DevUShort stopTriggerSource; +/** + * select the type of analog trigger. Can be BELOW (trigger occurs below ATRIGLevel) + * or can be ABOVE (trigger occurs above ATRIGLevel). + */ + Tango::DevUShort aTRIGSelection; +/** + * The analog trigger level in volts. + */ + Tango::DevDouble aTRIGLevel; +/** + * The edges on which the trigger are detected. Can be RISING or FALLING. + */ + Tango::DevUShort dTRIGPolarity; +/** + * The value of the reference voltage gave on pin AORefA. + */ + Tango::DevDouble aORefA; +/** + * The value of the reference voltage gave on pin AORefB. + */ + Tango::DevDouble aORefB; +/** + * BP for unipolar outputs or UP for bipolar outputs. + */ + Tango::DevUShort polarity; +/** + * Select the internal reference (10.0 volts) with INTERN or the external references + * AORefA and AORefB with EXTERN. + */ + Tango::DevUShort aORefSource; +/** + * 1 if enable channel 0, 0 otherwise. + */ + Tango::DevShort channel0Enable; +/** + * 1 if enable channel 1, 0 otherwise. + */ + Tango::DevShort channel1Enable; +/** + * 1 if enable channel 2, 0 otherwise. + */ + Tango::DevShort channel2Enable; +/** + * 1 if enable channel 3, 0 otherwise. + */ + Tango::DevShort channel3Enable; +/** + * 1 if enable channel 4, 0 otherwise. + */ + Tango::DevShort channel4Enable; +/** + * 1 if enable channel 5, 0 otherwise. + */ + Tango::DevShort channel5Enable; +/** + * 1 if enable channel 6, 0 otherwise. + */ + Tango::DevShort channel6Enable; +/** + * 1 if enable channel 7, 0 otherwise. + */ + Tango::DevShort channel7Enable; +/** + * The buffer depth for <b>one channel</b>. + */ + Tango::DevUShort bufferDepth; +/** + * The waveform for channel 0 (attribute persistency). + */ + vector<double> channel0Waveform; +/** + * The waveform for channel 1 (attribute persistency). + */ + vector<double> channel1Waveform; +/** + * The waveform for channel 2 (attribute persistency). + */ + vector<double> channel2Waveform; +/** + * The waveform for channel 3 (attribute persistency). + */ + vector<double> channel3Waveform; +/** + * The waveform for channel 4 (attribute persistency). + */ + vector<double> channel4Waveform; +/** + * The waveform for channel 5 (attribute persistency). + */ + vector<double> channel5Waveform; +/** + * The waveform for channel 6 (attribute persistency). + */ + vector<double> channel6Waveform; +/** + * The waveform for channel 7 (attribute persistency). + */ + vector<double> channel7Waveform; +//@} + +/**@name Constructors + * Miscellaneous constructors */ +//@{ +/** + * Constructs a newly allocated Command object. + * + * @param cl Class. + * @param s Device Name + */ + ContinuousAO(Tango::DeviceClass *,string &); +/** + * Constructs a newly allocated Command object. + * + * @param cl Class. + * @param s Device Name + */ + ContinuousAO(Tango::DeviceClass *,const char *); +/** + * Constructs a newly allocated Command object. + * + * @param cl Class. + * @param s Device name + * @param d Device description. + */ + ContinuousAO(Tango::DeviceClass *,const char *,const char *); +//@} + +/**@name Destructor + * Only one desctructor is defined for this class */ +//@{ +/** + * The object desctructor. + */ + ~ContinuousAO() { delete_device(); }; +/** + * will be called at device destruction or at init command. + */ + void delete_device(); +//@} + + +/**@name Miscellaneous methods */ +//@{ +/** + * Initialize the device + */ + virtual void init_device(); +/** + * Always executed method befor execution command method. + */ + virtual void always_executed_hook(); + +//@} + +/** + * @name ContinuousAO methods prototypes + */ + +//@{ +/** + * Hardware acquisition for attributes. + */ + virtual void read_attr_hardware(vector<long> &attr_list); +/** + * Extract real attribute values from hardware acquisition result. + */ + virtual void read_attr(Tango::Attribute &attr); +/** + * start the generation. + * @exception DevFailed + */ + void start(); +/** + * stop the generation. + * @exception DevFailed + */ + void stop(); +/** + * Give one period of the signal to generated of a specified channel in volts. + * @param argin The channel number (string). The output data in volts (double) + * @exception DevFailed + */ + void set_aoscaled_data(const Tango::DevVarDoubleStringArray *); + +/** + * Read the device properties from database + */ + void get_device_property(); +//@} + + // Here is the end of the automatic code generation part + //------------------------------------------------------------- + ADLinkContinuousAO* ao; + // asl::ContinuousAOConfig* config; + void set_internal_state(void); + // save a channel waveform in the database + void ContinuousAO::save_waveform(double* waveform, string wfm_channel); + double* ch0; + double* ch1; + double* ch2; + double* ch3; + double* ch4; + double* ch5; + double* ch6; + double* ch7; + double err_ctr; + short use_fifo; + + + + + +protected : + // Add your own data members here + //----------------------------------------- +}; + +} // namespace + +#endif // _CONTINUOUSAO_H diff --git a/src/ContinuousAOClass.cpp b/src/ContinuousAOClass.cpp new file mode 100644 index 0000000..82fc9cc --- /dev/null +++ b/src/ContinuousAOClass.cpp @@ -0,0 +1,588 @@ +static const char *RcsId = "$Header: /users/chaize/newsvn/cvsroot/InputOutput/ADLINK/ContinuousAO/src/ContinuousAOClass.cpp,v 1.1.1.1 2004-12-06 10:20:44 syldup Exp $"; + +static const char *TagName = "$Name: not supported by cvs2svn $"; + +static const char *FileName= "$Source: /users/chaize/newsvn/cvsroot/InputOutput/ADLINK/ContinuousAO/src/ContinuousAOClass.cpp,v $"; + +static const char *HttpServer= "http://controle/DeviceServer/doc/"; + +static const char *RCSfile = "$RCSfile: ContinuousAOClass.cpp,v $"; +//+============================================================================= +// +// file : ContinuousAOClass.cpp +// +// description : C++ source for the ContinuousAOClass. A singleton +// class derived from DeviceClass. It implements the +// command list and all properties and methods required +// by the ContinuousAO once per process. +// +// project : TANGO Device Server +// +// $Author: syldup $ +// +// $Revision: 1.1.1.1 $ +// +// $Log: not supported by cvs2svn $ +// +// copyleft : Synchrotron SOLEIL +// L'Orme des Merisiers +// Saint-Aubin - BP 48/ +//-============================================================================= +// +// This file is generated by POGO +// (Program Obviously used to Generate tango Object) +// +// (c) - Software Engineering Group - ESRF +//============================================================================= + + +//#include <tango.h> + +#include <ContinuousAO.h> +#include <ContinuousAOClass.h> + + +namespace ContinuousAO +{ + + +//+---------------------------------------------------------------------------- +// +// method : StartCmd::StartCmd() +// +// description : constructor for the command of the ContinuousAO. +// +// In : - name : The command name +// - in : The input parameter type +// - out : The output parameter type +// - in_desc : The input parameter description +// - out_desc : The output parameter description +// +//----------------------------------------------------------------------------- +StartCmd::StartCmd( const char *name, + Tango::CmdArgType in, + Tango::CmdArgType out, + const char *in_desc, + const char *out_desc, + Tango::DispLevel level) +:Command(name,in,out,in_desc,out_desc, level) +{ +} +// +// Constructor without in/out parameters description +// +StartCmd::StartCmd( const char *name, + Tango::CmdArgType in, + Tango::CmdArgType out) +:Command(name,in,out) +{ +} +//+---------------------------------------------------------------------------- +// +// method : StartCmd::is_allowed() +// +// description : method to test whether command is allowed or not in this +// state. In this case, the command is allowed only if +// the device is in ON state +// +// in : - device : The device on which the command must be excuted +// - in_any : The command input data +// +// returns : boolean - true == is allowed , false == not allowed +// +//----------------------------------------------------------------------------- +bool StartCmd::is_allowed(Tango::DeviceImpl *device, const CORBA::Any &in_any) +{ + // End of Generated Code + + // Re-Start of Generated Code + return true; +} +//+---------------------------------------------------------------------------- +// +// method : StartCmd::execute() +// +// description : method to trigger the execution of the command. +// PLEASE DO NOT MODIFY this method core without pogo +// +// in : - device : The device on which the command must be excuted +// - in_any : The command input data +// +// returns : The command output data (packed in the Any object) +// +//----------------------------------------------------------------------------- +CORBA::Any *StartCmd::execute(Tango::DeviceImpl *device,const CORBA::Any &in_any) +{ + + cout2 << "DevTemplateCmd::execute(): arrived" << endl; + + ((static_cast<ContinuousAO *>(device))->start()); + return new CORBA::Any(); +} + + + +//+---------------------------------------------------------------------------- +// +// method : StopCmd::StopCmd() +// +// description : constructor for the command of the ContinuousAO. +// +// In : - name : The command name +// - in : The input parameter type +// - out : The output parameter type +// - in_desc : The input parameter description +// - out_desc : The output parameter description +// +//----------------------------------------------------------------------------- +StopCmd::StopCmd( const char *name, + Tango::CmdArgType in, + Tango::CmdArgType out, + const char *in_desc, + const char *out_desc, + Tango::DispLevel level) +:Command(name,in,out,in_desc,out_desc, level) +{ +} +// +// Constructor without in/out parameters description +// +StopCmd::StopCmd( const char *name, + Tango::CmdArgType in, + Tango::CmdArgType out) +:Command(name,in,out) +{ +} +//+---------------------------------------------------------------------------- +// +// method : StopCmd::is_allowed() +// +// description : method to test whether command is allowed or not in this +// state. In this case, the command is allowed only if +// the device is in ON state +// +// in : - device : The device on which the command must be excuted +// - in_any : The command input data +// +// returns : boolean - true == is allowed , false == not allowed +// +//----------------------------------------------------------------------------- +bool StopCmd::is_allowed(Tango::DeviceImpl *device, const CORBA::Any &in_any) +{ + // End of Generated Code + + // Re-Start of Generated Code + return true; +} +//+---------------------------------------------------------------------------- +// +// method : StopCmd::execute() +// +// description : method to trigger the execution of the command. +// PLEASE DO NOT MODIFY this method core without pogo +// +// in : - device : The device on which the command must be excuted +// - in_any : The command input data +// +// returns : The command output data (packed in the Any object) +// +//----------------------------------------------------------------------------- +CORBA::Any *StopCmd::execute(Tango::DeviceImpl *device,const CORBA::Any &in_any) +{ + + cout2 << "DevTemplateCmd::execute(): arrived" << endl; + + ((static_cast<ContinuousAO *>(device))->stop()); + return new CORBA::Any(); +} + + +//+---------------------------------------------------------------------------- +// +// method : SetAOScaledDataCmd::SetAOScaledDataCmd() +// +// description : constructor for the command of the ContinuousAO. +// +// In : - name : The command name +// - in : The input parameter type +// - out : The output parameter type +// - in_desc : The input parameter description +// - out_desc : The output parameter description +// +//----------------------------------------------------------------------------- +SetAOScaledDataCmd::SetAOScaledDataCmd( const char *name, + Tango::CmdArgType in, + Tango::CmdArgType out, + const char *in_desc, + const char *out_desc, + Tango::DispLevel level) +:Command(name,in,out,in_desc,out_desc, level) +{ +} +// +// Constructor without in/out parameters description +// +SetAOScaledDataCmd::SetAOScaledDataCmd( const char *name, + Tango::CmdArgType in, + Tango::CmdArgType out) +:Command(name,in,out) +{ +} +//+---------------------------------------------------------------------------- +// +// method : SetAOScaledDataCmd::is_allowed() +// +// description : method to test whether command is allowed or not in this +// state. In this case, the command is allowed only if +// the device is in ON state +// +// in : - device : The device on which the command must be excuted +// - in_any : The command input data +// +// returns : boolean - true == is allowed , false == not allowed +// +//----------------------------------------------------------------------------- +bool SetAOScaledDataCmd::is_allowed(Tango::DeviceImpl *device, const CORBA::Any &in_any) +{ + // End of Generated Code + + // Re-Start of Generated Code + return true; +} + +//+---------------------------------------------------------------------------- +// +// method : SetAOScaledDataCmd::execute() +// +// description : method to trigger the execution of the command. +// PLEASE DO NOT MODIFY this method core without pogo +// +// in : - device : The device on which the command must be excuted +// - in_any : The command input data +// +// returns : The command output data (packed in the Any object) +// +//----------------------------------------------------------------------------- +CORBA::Any *SetAOScaledDataCmd::execute(Tango::DeviceImpl *device,const CORBA::Any &in_any) +{ + + cout2 << "DevTemplateCmd::execute(): arrived" << endl; + + const Tango::DevVarDoubleStringArray *argin; + extract(in_any, argin); + + ((static_cast<ContinuousAO *>(device))->set_aoscaled_data(argin)); + return new CORBA::Any(); +} + +// +//---------------------------------------------------------------- +// Initialize pointer for singleton pattern +//---------------------------------------------------------------- +// +ContinuousAOClass *ContinuousAOClass::_instance = NULL; + +//+---------------------------------------------------------------------------- +// +// method : ContinuousAOClass::ContinuousAOClass(string &s) +// +// description : constructor for the ContinuousAOClass +// +// in : - s : The class name +// +//----------------------------------------------------------------------------- +ContinuousAOClass::ContinuousAOClass(string &s):DeviceClass(s) +{ + + cout2 << "Entering ContinuousAOClass constructor" << endl; + write_class_property(); + + cout2 << "Leaving ContinuousAOClass constructor" << endl; + +} +//+---------------------------------------------------------------------------- +// +// method : ContinuousAOClass::~ContinuousAOClass() +// +// description : destructor for the ContinuousAOClass +// +//----------------------------------------------------------------------------- +ContinuousAOClass::~ContinuousAOClass() +{ + _instance = NULL; +} + +//+---------------------------------------------------------------------------- +// +// method : ContinuousAOClass::instance +// +// description : Create the object if not already done. Otherwise, just +// return a pointer to the object +// +// in : - name : The class name +// +//----------------------------------------------------------------------------- +ContinuousAOClass *ContinuousAOClass::init(const char *name) +{ + if (_instance == NULL) + { + try + { + string s(name); + _instance = new ContinuousAOClass(s); + } + catch (bad_alloc) + { + throw; + } + } + return _instance; +} + +ContinuousAOClass *ContinuousAOClass::instance() +{ + if (_instance == NULL) + { + cerr << "Class is not initialised !!" << endl; + exit(-1); + } + return _instance; +} + +//+---------------------------------------------------------------------------- +// +// method : ContinuousAOClass::command_factory +// +// description : Create the command object(s) and store them in the +// command list +// +//----------------------------------------------------------------------------- +void ContinuousAOClass::command_factory() +{ + command_list.push_back(new StartCmd("Start", + Tango::DEV_VOID, Tango::DEV_VOID, + "", + "", + Tango::OPERATOR)); + command_list.push_back(new StopCmd("Stop", + Tango::DEV_VOID, Tango::DEV_VOID, + "", + "", + Tango::OPERATOR)); + command_list.push_back(new SetAOScaledDataCmd("SetAOScaledData", + Tango::DEVVAR_DOUBLESTRINGARRAY, Tango::DEV_VOID, + "The channel number ,in string). The output data in volts ,in double)", + "", + Tango::OPERATOR)); + + // add polling if any + for (unsigned int i=0 ; i<command_list.size(); i++) + { + } +} + +//+---------------------------------------------------------------------------- +// +// method : ContinuousAOClass::device_factory +// +// description : Create the device object(s) and store them in the +// device list +// +// in : Tango::DevVarStringArray *devlist_ptr : The device name list +// +//----------------------------------------------------------------------------- +void ContinuousAOClass::device_factory(const Tango::DevVarStringArray *devlist_ptr) +{ + + for (long i=0 ; i < devlist_ptr->length() ; i++) + { + cout4 << "Device name : " << (*devlist_ptr)[i].in() << endl; + + // Create device and add it into the device list + //---------------------------------------------------- + device_list.push_back(new ContinuousAO(this, (*devlist_ptr)[i])); + + // Export device to the outside world + // Check before id database used. + //--------------------------------------------- + if (Tango::Util::_UseDb == true) + export_device(device_list.back()); + else + export_device(device_list.back(), (*devlist_ptr)[i]); + } +} +//+---------------------------------------------------------------------------- +// Method: ContinuousAOClass::attribute_factory(vector<Tango::Attr *> &att_list) +//----------------------------------------------------------------------------- +void ContinuousAOClass::attribute_factory(vector<Tango::Attr *> &att_list) +{ + // Attribute : channel0 + Tango::SpectrumAttr *channel0 = + new Tango::SpectrumAttr("channel0", Tango::DEV_DOUBLE, 1000000); + Tango::UserDefaultAttrProp channel0_prop; + channel0_prop.set_label("channel0"); + channel0_prop.set_unit("volts"); + channel0->set_default_properties(channel0_prop); + att_list.push_back(channel0); + + // Attribute : channel1 + Tango::SpectrumAttr *channel1 = + new Tango::SpectrumAttr("channel1", Tango::DEV_DOUBLE, 100000); + Tango::UserDefaultAttrProp channel1_prop; + channel1_prop.set_label("channel1"); + channel1_prop.set_unit("volts"); + channel1->set_default_properties(channel1_prop); + att_list.push_back(channel1); + + // Attribute : channel2 + Tango::SpectrumAttr *channel2 = + new Tango::SpectrumAttr("channel2", Tango::DEV_DOUBLE, 100000); + Tango::UserDefaultAttrProp channel2_prop; + channel2_prop.set_label("channel2"); + channel2_prop.set_unit("volts"); + channel2->set_default_properties(channel2_prop); + att_list.push_back(channel2); + + // Attribute : channel3 + Tango::SpectrumAttr *channel3 = + new Tango::SpectrumAttr("channel3", Tango::DEV_DOUBLE, 100000); + Tango::UserDefaultAttrProp channel3_prop; + channel3_prop.set_label("channel3"); + channel3->set_default_properties(channel3_prop); + att_list.push_back(channel3); + + // Attribute : channel4 + Tango::SpectrumAttr *channel4 = + new Tango::SpectrumAttr("channel4", Tango::DEV_DOUBLE, 100000); + Tango::UserDefaultAttrProp channel4_prop; + channel4_prop.set_label("channel4"); + channel4_prop.set_unit("volts"); + channel4->set_default_properties(channel4_prop); + att_list.push_back(channel4); + + // Attribute : channel5 + Tango::SpectrumAttr *channel5 = + new Tango::SpectrumAttr("channel5", Tango::DEV_DOUBLE, 100000); + Tango::UserDefaultAttrProp channel5_prop; + channel5_prop.set_label("channel"); + channel5_prop.set_unit("volts"); + channel5->set_default_properties(channel5_prop); + att_list.push_back(channel5); + + // Attribute : channel6 + Tango::SpectrumAttr *channel6 = + new Tango::SpectrumAttr("channel6", Tango::DEV_DOUBLE, 100000); + Tango::UserDefaultAttrProp channel6_prop; + channel6_prop.set_label("channel6"); + channel6_prop.set_unit("volts"); + channel6->set_default_properties(channel6_prop); + att_list.push_back(channel6); + + // Attribute : channel7 + Tango::SpectrumAttr *channel7 = + new Tango::SpectrumAttr("channel7", Tango::DEV_DOUBLE, 100000); + Tango::UserDefaultAttrProp channel7_prop; + channel7_prop.set_label("channel7"); + channel7_prop.set_unit("volts"); + channel7->set_default_properties(channel7_prop); + att_list.push_back(channel7); + + // Attribute : errorCounter + Tango::Attr *error_counter = + new Tango::Attr("errorCounter", Tango::DEV_DOUBLE, Tango::READ); + Tango::UserDefaultAttrProp error_counter_prop; + error_counter_prop.set_label("error counter"); + error_counter_prop.set_format("%i"); + error_counter_prop.set_description("Errors occuring during the waveform generation."); + error_counter->set_default_properties(error_counter_prop); + att_list.push_back(error_counter); + + // Attribute : useBoardFifo + Tango::Attr *use_board_fifo = + new Tango::Attr("useBoardFifo", Tango::DEV_SHORT, Tango::READ); + Tango::UserDefaultAttrProp use_board_fifo_prop; + use_board_fifo_prop.set_label("use board FIFO"); + use_board_fifo_prop.set_description("Set to 1 if data have been loaded in FIFO.\nSet to 0 if data is continuously tranfered through DMA (possible underrun)"); + use_board_fifo->set_default_properties(use_board_fifo_prop); + att_list.push_back(use_board_fifo); + +} +//+---------------------------------------------------------------------------- +// +// method : ContinuousAOClass::write_class_property +// +// description : Set class description as property in database +// +//----------------------------------------------------------------------------- +void ContinuousAOClass::write_class_property() +{ + // First time, check if database used + //-------------------------------------------- + if (Tango::Util::_UseDb == false) + return; + + // Prepeare DbDatum + //-------------------------------------------- + Tango::DbDatum title("ProjectTitle"); + string str_title("Continuous Anolog Output"); + title << str_title; + + Tango::DbDatum description("Description"); + string str_desc("Perform continuous anolog ouput (waveform generation) on the selected outputs."); + description << str_desc; + + // Use the doc_url field to store all information + // on the server version and CVS + string::size_type pos, len; + + // 1) Manage module name + // get rid of the $RCSfile: prefix and of Class.cpp suffix + string classname = RCSfile; + + pos = classname.find("$RCSfile: "); + len = classname.length(); + + if (pos != string::npos) + classname= classname.substr(pos+10, len- pos-10); + + pos = classname.find ("Class.cpp",0); + if (pos != string::npos) + classname=classname.substr(0,pos); + + // 2) Manage version number with SOLEIL CVS rules + // tag name is in the form : release_1_0 ==> transform it to 1.0 + // + string version ; + string str_TagName=string(TagName); + + pos = str_TagName.find_first_of("_",0); + if (pos != string::npos) + version= str_TagName.substr(pos+1, 3); + + pos = version.find_first_of("_",0); + if (pos != string::npos) + version[pos] = '.'; + + + // Store all info in the str_url property + + string str_url= "Documentation URL = " + string(HttpServer) + classname +"-" + version + "/index.html" + "\n"; + str_url= str_url + " Version CVS Tag = " + string(TagName)+ "\n"; + str_url= str_url + " CVS location = " + string(FileName)+ "\n"; + + Tango::DbDatum doc_url("doc_url"); + + doc_url << str_url; + + // Push everything in DataBase + + Tango::DbData data; + data.push_back(title); + data.push_back(description); + data.push_back(doc_url); + // Call database and and values + //-------------------------------------------- + get_db_class()->put_property(data); +} + +} // namespace diff --git a/src/ContinuousAOClass.h b/src/ContinuousAOClass.h new file mode 100644 index 0000000..428e48a --- /dev/null +++ b/src/ContinuousAOClass.h @@ -0,0 +1,110 @@ +//============================================================================= +// +// file : ContinuousAOClass.h +// +// description : Include for the ContinuousAOClass root class. +// This class is represents the singleton class for +// the ContinuousAO device class. +// It contains all properties and methods which the +// ContinuousAO requires only once e.g. the commands. +// +// project : TANGO Device Server +// +// $Author: syldup $ +// +// $Revision: 1.1.1.1 $ +// +// $Log: not supported by cvs2svn $ +// +// copyleft : Synchrotron SOLEIL +// L'Orme des Merisiers +// Saint-Aubin - BP 48 +//============================================================================= +// +// This file is generated by POGO +// (Program Obviously used to Generate tango Object) +// +// (c) - Software Engineering Group - ESRF +//============================================================================= + +#ifndef _CONTINUOUSAOCLASS_H +#define _CONTINUOUSAOCLASS_H + +#include <tango.h> + + +namespace ContinuousAO +{ +// +// Define classes for commands +// +class SetAOScaledDataCmd : public Tango::Command +{ +public: + SetAOScaledDataCmd(const char *,Tango::CmdArgType, Tango::CmdArgType,const char *,const char *, Tango::DispLevel); + SetAOScaledDataCmd(const char *,Tango::CmdArgType, Tango::CmdArgType); + ~SetAOScaledDataCmd() {}; + + virtual bool is_allowed (Tango::DeviceImpl *, const CORBA::Any &); + virtual CORBA::Any *execute (Tango::DeviceImpl *, const CORBA::Any &); +}; + + +class StopCmd : public Tango::Command +{ +public: + StopCmd(const char *,Tango::CmdArgType, Tango::CmdArgType,const char *,const char *, Tango::DispLevel); + StopCmd(const char *,Tango::CmdArgType, Tango::CmdArgType); + ~StopCmd() {}; + + virtual bool is_allowed (Tango::DeviceImpl *, const CORBA::Any &); + virtual CORBA::Any *execute (Tango::DeviceImpl *, const CORBA::Any &); +}; + + +class StartCmd : public Tango::Command +{ +public: + StartCmd(const char *,Tango::CmdArgType, Tango::CmdArgType,const char *,const char *, Tango::DispLevel); + StartCmd(const char *,Tango::CmdArgType, Tango::CmdArgType); + ~StartCmd() {}; + + virtual bool is_allowed (Tango::DeviceImpl *, const CORBA::Any &); + virtual CORBA::Any *execute (Tango::DeviceImpl *, const CORBA::Any &); +}; + + + +// +// The ContinuousAOClass singleton definition +// + +class ContinuousAOClass : public Tango::DeviceClass +{ +public: + +// add your own data members here +//------------------------------------ + +public: + +// Method prototypes + static ContinuousAOClass *init(const char *); + static ContinuousAOClass *instance(); + ~ContinuousAOClass(); + +protected: + ContinuousAOClass(string &); + static ContinuousAOClass *_instance; + void command_factory(); + void attribute_factory(vector<Tango::Attr *> &); + void write_class_property(); + +private: + void device_factory(const Tango::DevVarStringArray *); +}; + + +} // namespace ContinuousAO + +#endif // _CONTINUOUSAOCLASS_H diff --git a/src/Doxyfile b/src/Doxyfile new file mode 100644 index 0000000..5ec99fa --- /dev/null +++ b/src/Doxyfile @@ -0,0 +1,831 @@ +# Doxyfile 1.2.10 + +# This file describes the settings to be used by the documentation system +# doxygen (www.doxygen.org) for a project +# +# All text after a hash (#) is considered a comment and will be ignored +# The format is: +# TAG = value [value, ...] +# For lists items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (" ") + +#--------------------------------------------------------------------------- +# General configuration options +#--------------------------------------------------------------------------- + +# The PROJECT_NAME tag is a single word (or a sequence of words surrounded +# by quotes) that should identify the project. + +PROJECT_NAME = "Continuous Anolog Output" + +# The PROJECT_NUMBER tag can be used to enter a project or revision number. +# This could be handy for archiving the generated documentation or +# if some version control system is used. + +PROJECT_NUMBER = + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) +# base path where the generated documentation will be put. +# If a relative path is entered, it will be relative to the location +# where doxygen was started. If left blank the current directory will be used. + +OUTPUT_DIRECTORY = D:\devices\devices_adlink\ContinuousAO\src/doc_html + +# The OUTPUT_LANGUAGE tag is used to specify the language in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all constant output in the proper language. +# The default language is English, other supported languages are: +# Brazilian, Chinese, Croatian, Czech, Danish, Dutch, Finnish, French, +# German, Hungarian, Italian, Japanese, Korean, Norwegian, Polish, +# Portuguese, Romanian, Russian, Slovak, Slovene, Spanish and Swedish. + +OUTPUT_LANGUAGE = English + +# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in +# documentation are documented, even if no documentation was available. +# Private class members and static file members will be hidden unless +# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES + +EXTRACT_ALL = YES + +# If the EXTRACT_PRIVATE tag is set to YES all private members of a class +# will be included in the documentation. + +EXTRACT_PRIVATE = NO + +# If the EXTRACT_STATIC tag is set to YES all static members of a file +# will be included in the documentation. + +EXTRACT_STATIC = YES + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all +# undocumented members of documented classes, files or namespaces. +# If set to NO (the default) these members will be included in the +# various overviews, but no documentation section is generated. +# This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_MEMBERS = NO + +# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. +# If set to NO (the default) these class will be included in the various +# overviews. This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_CLASSES = NO + +# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will +# include brief member descriptions after the members that are listed in +# the file and class documentation (similar to JavaDoc). +# Set to NO to disable this. + +BRIEF_MEMBER_DESC = YES + +# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend +# the brief description of a member or function before the detailed description. +# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# brief descriptions will be completely suppressed. + +REPEAT_BRIEF = YES + +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then +# Doxygen will generate a detailed section even if there is only a brief +# description. + +ALWAYS_DETAILED_SEC = NO + +# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full +# path before files name in the file list and in the header files. If set +# to NO the shortest path that makes the file name unique will be used. + +FULL_PATH_NAMES = NO + +# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag +# can be used to strip a user defined part of the path. Stripping is +# only done if one of the specified strings matches the left-hand part of +# the path. It is allowed to use relative paths in the argument list. + +STRIP_FROM_PATH = + +# The INTERNAL_DOCS tag determines if documentation +# that is typed after a \internal command is included. If the tag is set +# to NO (the default) then the documentation will be excluded. +# Set it to YES to include the internal documentation. + +INTERNAL_DOCS = NO + +# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will +# generate a class diagram (in Html and LaTeX) for classes with base or +# super classes. Setting the tag to NO turns the diagrams off. + +CLASS_DIAGRAMS = YES + +# If the SOURCE_BROWSER tag is set to YES then a list of source files will +# be generated. Documented entities will be cross-referenced with these sources. + +SOURCE_BROWSER = NO + +# Setting the INLINE_SOURCES tag to YES will include the body +# of functions and classes directly in the documentation. + +INLINE_SOURCES = NO + +# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct +# doxygen to hide any special comment blocks from generated source code +# fragments. Normal C and C++ comments will always remain visible. + +STRIP_CODE_COMMENTS = YES + +# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate +# file names in lower case letters. If set to YES upper case letters are also +# allowed. This is useful if you have classes or files whose names only differ +# in case and if your file system supports case sensitive file names. Windows +# users are adviced to set this option to NO. + +CASE_SENSE_NAMES = YES + +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter +# (but less readable) file names. This can be useful is your file systems +# doesn't support long names like on DOS, Mac, or CD-ROM. + +SHORT_NAMES = NO + +# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen +# will show members with their full class and namespace scopes in the +# documentation. If set to YES the scope will be hidden. + +HIDE_SCOPE_NAMES = NO + +# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen +# will generate a verbatim copy of the header file for each class for +# which an include is specified. Set to NO to disable this. + +VERBATIM_HEADERS = YES + +# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen +# will put list of the files that are included by a file in the documentation +# of that file. + +SHOW_INCLUDE_FILES = YES + +# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen +# will interpret the first line (until the first dot) of a JavaDoc-style +# comment as the brief description. If set to NO, the JavaDoc +# comments will behave just like the Qt-style comments (thus requiring an +# explict @brief command for a brief description. + +JAVADOC_AUTOBRIEF = YES + +# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented +# member inherits the documentation from any documented member that it +# reimplements. + +INHERIT_DOCS = YES + +# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] +# is inserted in the documentation for inline members. + +INLINE_INFO = YES + +# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen +# will sort the (detailed) documentation of file and class members +# alphabetically by member name. If set to NO the members will appear in +# declaration order. + +SORT_MEMBER_DOCS = YES + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES, then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. + +DISTRIBUTE_GROUP_DOC = NO + +# The TAB_SIZE tag can be used to set the number of spaces in a tab. +# Doxygen uses this value to replace tabs by spaces in code fragments. + +TAB_SIZE = 8 + +# The GENERATE_TODOLIST tag can be used to enable (YES) or +# disable (NO) the todo list. This list is created by putting \todo +# commands in the documentation. + +GENERATE_TODOLIST = YES + +# The GENERATE_TESTLIST tag can be used to enable (YES) or +# disable (NO) the test list. This list is created by putting \test +# commands in the documentation. + +GENERATE_TESTLIST = YES + +# The GENERATE_BUGLIST tag can be used to enable (YES) or +# disable (NO) the bug list. This list is created by putting \bug +# commands in the documentation. + +GENERATE_BUGLIST = YES + +# This tag can be used to specify a number of aliases that acts +# as commands in the documentation. An alias has the form "name=value". +# For example adding "sideeffect=\par Side Effects:\n" will allow you to +# put the command \sideeffect (or @sideeffect) in the documentation, which +# will result in a user defined paragraph with heading "Side Effects:". +# You can put \n's in the value part of an alias to insert newlines. + +ALIASES = + +# The ENABLED_SECTIONS tag can be used to enable conditional +# documentation sections, marked by \if sectionname ... \endif. + +ENABLED_SECTIONS = + +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines +# the initial value of a variable or define consist of for it to appear in +# the documentation. If the initializer consists of more lines than specified +# here it will be hidden. Use a value of 0 to hide initializers completely. +# The appearance of the initializer of individual variables and defines in the +# documentation can be controlled using \showinitializer or \hideinitializer +# command in the documentation regardless of this setting. + +MAX_INITIALIZER_LINES = 30 + +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources +# only. Doxygen will then generate output that is more tailored for C. +# For instance some of the names that are used will be different. The list +# of all members will be omitted, etc. + +OPTIMIZE_OUTPUT_FOR_C = NO + +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated +# at the bottom of the documentation of classes and structs. If set to YES the +# list will mention the files that were used to generate the documentation. + +SHOW_USED_FILES = YES + +#--------------------------------------------------------------------------- +# configuration options related to warning and progress messages +#--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated +# by doxygen. Possible values are YES and NO. If left blank NO is used. + +QUIET = NO + +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated by doxygen. Possible values are YES and NO. If left blank +# NO is used. + +WARNINGS = YES + +# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings +# for undocumented members. If EXTRACT_ALL is set to YES then this flag will +# automatically be disabled. + +WARN_IF_UNDOCUMENTED = YES + +# The WARN_FORMAT tag determines the format of the warning messages that +# doxygen can produce. The string should contain the $file, $line, and $text +# tags, which will be replaced by the file and line number from which the +# warning originated and the warning text. + +WARN_FORMAT = + +# The WARN_LOGFILE tag can be used to specify a file to which warning +# and error messages should be written. If left blank the output is written +# to stderr. + +WARN_LOGFILE = + +#--------------------------------------------------------------------------- +# configuration options related to the input files +#--------------------------------------------------------------------------- + +# The INPUT tag can be used to specify the files and/or directories that contain +# documented source files. You may enter file names like "myfile.cpp" or +# directories like "/usr/src/myproject". Separate the files or directories +# with spaces. + +INPUT = D:\devices\devices_adlink\ContinuousAO\src + +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank all files are included. + +FILE_PATTERNS = *.h *.cpp + +# The RECURSIVE tag can be used to turn specify whether or not subdirectories +# should be searched for input files as well. Possible values are YES and NO. +# If left blank NO is used. + +RECURSIVE = NO + +# The EXCLUDE tag can be used to specify files and/or directories that should +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. + +EXCLUDE = + +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. + +EXCLUDE_PATTERNS = + +# The EXAMPLE_PATH tag can be used to specify one or more files or +# directories that contain example code fragments that are included (see +# the \include command). + +EXAMPLE_PATH = + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank all files are included. + +EXAMPLE_PATTERNS = + +# The IMAGE_PATH tag can be used to specify one or more files or +# directories that contain image that are included in the documentation (see +# the \image command). + +IMAGE_PATH = + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command <filter> <input-file>, where <filter> +# is the value of the INPUT_FILTER tag, and <input-file> is the name of an +# input file. Doxygen will then use the output that the filter program writes +# to standard output. + +INPUT_FILTER = + +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# INPUT_FILTER) will be used to filter the input files when producing source +# files to browse. + +FILTER_SOURCE_FILES = NO + +#--------------------------------------------------------------------------- +# configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- + +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index +# of all compounds will be generated. Enable this if the project +# contains a lot of classes, structs, unions or interfaces. + +ALPHABETICAL_INDEX = YES + +# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then +# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns +# in which this list will be split (can be a number in the range [1..20]) + +COLS_IN_ALPHA_INDEX = 5 + +# In case all classes in a project start with a common prefix, all +# classes will be put under the same header in the alphabetical index. +# The IGNORE_PREFIX tag can be used to specify one or more prefixes that +# should be ignored while generating the index headers. + +IGNORE_PREFIX = + +#--------------------------------------------------------------------------- +# configuration options related to the HTML output +#--------------------------------------------------------------------------- + +# If the GENERATE_HTML tag is set to YES (the default) Doxygen will +# generate HTML output. + +GENERATE_HTML = YES + +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `html' will be used as the default path. + +HTML_OUTPUT = + +# The HTML_HEADER tag can be used to specify a personal HTML header for +# each generated HTML page. If it is left blank doxygen will generate a +# standard header. + +HTML_HEADER = /segfs/tango/templates/pogo/html/header.html + +# The HTML_FOOTER tag can be used to specify a personal HTML footer for +# each generated HTML page. If it is left blank doxygen will generate a +# standard footer. + +HTML_FOOTER = /segfs/tango/templates/pogo/html/footer.html + +# The HTML_STYLESHEET tag can be used to specify a user defined cascading +# style sheet that is used by each HTML page. It can be used to +# fine-tune the look of the HTML output. If the tag is left blank doxygen +# will generate a default style sheet + +HTML_STYLESHEET = + +# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, +# files or namespaces will be aligned in HTML using tables. If set to +# NO a bullet list will be used. + +HTML_ALIGN_MEMBERS = YES + +# If the GENERATE_HTMLHELP tag is set to YES, additional index files +# will be generated that can be used as input for tools like the +# Microsoft HTML help workshop to generate a compressed HTML help file (.chm) +# of the generated HTML documentation. + +GENERATE_HTMLHELP = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag +# controls if a separate .chi index file is generated (YES) or that +# it should be included in the master .chm file (NO). + +GENERATE_CHI = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag +# controls whether a binary table of contents is generated (YES) or a +# normal table of contents (NO) in the .chm file. + +BINARY_TOC = NO + +# The TOC_EXPAND flag can be set to YES to add extra items for group members +# to the contents of the Html help documentation and to the tree view. + +TOC_EXPAND = NO + +# The DISABLE_INDEX tag can be used to turn on/off the condensed index at +# top of each HTML page. The value NO (the default) enables the index and +# the value YES disables it. + +DISABLE_INDEX = NO + +# This tag can be used to set the number of enum values (range [1..20]) +# that doxygen will group on one line in the generated HTML documentation. + +ENUM_VALUES_PER_LINE = 4 + +# If the GENERATE_TREEVIEW tag is set to YES, a side panel will be +# generated containing a tree-like index structure (just like the one that +# is generated for HTML Help). For this to work a browser that supports +# JavaScript and frames is required (for instance Netscape 4.0+ +# or Internet explorer 4.0+). + +GENERATE_TREEVIEW = YES + +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be +# used to set the initial width (in pixels) of the frame in which the tree +# is shown. + +TREEVIEW_WIDTH = 250 + +#--------------------------------------------------------------------------- +# configuration options related to the LaTeX output +#--------------------------------------------------------------------------- + +# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will +# generate Latex output. + +GENERATE_LATEX = YES + +# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `latex' will be used as the default path. + +LATEX_OUTPUT = + +# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact +# LaTeX documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_LATEX = NO + +# The PAPER_TYPE tag can be used to set the paper type that is used +# by the printer. Possible values are: a4, a4wide, letter, legal and +# executive. If left blank a4wide will be used. + +PAPER_TYPE = a4wide + +# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX +# packages that should be included in the LaTeX output. + +EXTRA_PACKAGES = + +# The LATEX_HEADER tag can be used to specify a personal LaTeX header for +# the generated latex document. The header should contain everything until +# the first chapter. If it is left blank doxygen will generate a +# standard header. Notice: only use this tag if you know what you are doing! + +LATEX_HEADER = + +# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated +# is prepared for conversion to pdf (using ps2pdf). The pdf file will +# contain links (just like the HTML output) instead of page references +# This makes the output suitable for online browsing using a pdf viewer. + +PDF_HYPERLINKS = NO + +# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of +# plain latex in the generated Makefile. Set this option to YES to get a +# higher quality PDF documentation. + +USE_PDFLATEX = NO + +# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. +# command to the generated LaTeX files. This will instruct LaTeX to keep +# running if errors occur, instead of asking the user for help. +# This option is also used when generating formulas in HTML. + +LATEX_BATCHMODE = NO + +#--------------------------------------------------------------------------- +# configuration options related to the RTF output +#--------------------------------------------------------------------------- + +# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output +# The RTF output is optimised for Word 97 and may not look very pretty with +# other RTF readers or editors. + +GENERATE_RTF = NO + +# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `rtf' will be used as the default path. + +RTF_OUTPUT = + +# If the COMPACT_RTF tag is set to YES Doxygen generates more compact +# RTF documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_RTF = NO + +# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated +# will contain hyperlink fields. The RTF file will +# contain links (just like the HTML output) instead of page references. +# This makes the output suitable for online browsing using WORD or other +# programs which support those fields. +# Note: wordpad (write) and others do not support links. + +RTF_HYPERLINKS = YES + +# Load stylesheet definitions from file. Syntax is similar to doxygen's +# config file, i.e. a series of assigments. You only have to provide +# replacements, missing definitions are set to their default value. + +RTF_STYLESHEET_FILE = + +# Set optional variables used in the generation of an rtf document. +# Syntax is similar to doxygen's config file. + +RTF_EXTENSIONS_FILE = + +#--------------------------------------------------------------------------- +# configuration options related to the man page output +#--------------------------------------------------------------------------- + +# If the GENERATE_MAN tag is set to YES (the default) Doxygen will +# generate man pages + +GENERATE_MAN = NO + +# The MAN_OUTPUT tag is used to specify where the man pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `man' will be used as the default path. + +MAN_OUTPUT = + +# The MAN_EXTENSION tag determines the extension that is added to +# the generated man pages (default is the subroutine's section .3) + +MAN_EXTENSION = + +# If the MAN_LINKS tag is set to YES and Doxygen generates man output, +# then it will generate one additional man file for each entity +# documented in the real man page(s). These additional files +# only source the real man page, but without them the man command +# would be unable to find the correct page. The default is NO. + +MAN_LINKS = NO + +#--------------------------------------------------------------------------- +# configuration options related to the XML output +#--------------------------------------------------------------------------- + +# If the GENERATE_XML tag is set to YES Doxygen will +# generate an XML file that captures the structure of +# the code including all documentation. Note that this +# feature is still experimental and incomplete at the +# moment. + +GENERATE_XML = NO + +#--------------------------------------------------------------------------- +# Configuration options related to the preprocessor +#--------------------------------------------------------------------------- + +# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will +# evaluate all C-preprocessor directives found in the sources and include +# files. + +ENABLE_PREPROCESSING = YES + +# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro +# names in the source code. If set to NO (the default) only conditional +# compilation will be performed. Macro expansion can be done in a controlled +# way by setting EXPAND_ONLY_PREDEF to YES. + +MACRO_EXPANSION = NO + +# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES +# then the macro expansion is limited to the macros specified with the +# PREDEFINED and EXPAND_AS_PREDEFINED tags. + +EXPAND_ONLY_PREDEF = NO + +# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files +# in the INCLUDE_PATH (see below) will be search if a #include is found. + +SEARCH_INCLUDES = YES + +# The INCLUDE_PATH tag can be used to specify one or more directories that +# contain include files that are not input files but should be processed by +# the preprocessor. + +INCLUDE_PATH = + +# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard +# patterns (like *.h and *.hpp) to filter out the header-files in the +# directories. If left blank, the patterns specified with FILE_PATTERNS will +# be used. + +INCLUDE_FILE_PATTERNS = + +# The PREDEFINED tag can be used to specify one or more macro names that +# are defined before the preprocessor is started (similar to the -D option of +# gcc). The argument of the tag is a list of macros of the form: name +# or name=definition (no spaces). If the definition and the = are +# omitted =1 is assumed. + +PREDEFINED = + +# If the MACRO_EXPANSION and EXPAND_PREDEF_ONLY tags are set to YES then +# this tag can be used to specify a list of macro names that should be expanded. +# The macro definition that is found in the sources will be used. +# Use the PREDEFINED tag if you want to use a different macro definition. + +EXPAND_AS_DEFINED = + +#--------------------------------------------------------------------------- +# Configuration::addtions related to external references +#--------------------------------------------------------------------------- + +# The TAGFILES tag can be used to specify one or more tagfiles. + +TAGFILES = + +# When a file name is specified after GENERATE_TAGFILE, doxygen will create +# a tag file that is based on the input files it reads. + +GENERATE_TAGFILE = + +# If the ALLEXTERNALS tag is set to YES all external classes will be listed +# in the class index. If set to NO only the inherited external classes +# will be listed. + +ALLEXTERNALS = NO + +# The PERL_PATH should be the absolute path and name of the perl script +# interpreter (i.e. the result of `which perl'). + +PERL_PATH = + +#--------------------------------------------------------------------------- +# Configuration options related to the dot tool +#--------------------------------------------------------------------------- + +# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is +# available from the path. This tool is part of Graphviz, a graph visualization +# toolkit from AT&T and Lucent Bell Labs. The other options in this section +# have no effect if this option is set to NO (the default) + +HAVE_DOT = NO + +# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect inheritance relations. Setting this tag to YES will force the +# the CLASS_DIAGRAMS tag to NO. + +CLASS_GRAPH = YES + +# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect implementation dependencies (inheritance, containment, and +# class references variables) of the class with other documented classes. + +COLLABORATION_GRAPH = YES + +# If set to YES, the inheritance and collaboration graphs will show the +# relations between templates and their instances. + +TEMPLATE_RELATIONS = YES + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT +# tags are set to YES then doxygen will generate a graph for each documented +# file showing the direct and indirect include dependencies of the file with +# other documented files. + +INCLUDE_GRAPH = YES + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and +# HAVE_DOT tags are set to YES then doxygen will generate a graph for each +# documented header file showing the documented files that directly or +# indirectly include this file. + +INCLUDED_BY_GRAPH = YES + +# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen +# will graphical hierarchy of all classes instead of a textual one. + +GRAPHICAL_HIERARCHY = YES + +# The tag DOT_PATH can be used to specify the path where the dot tool can be +# found. If left blank, it is assumed the dot tool can be found on the path. + +DOT_PATH = + +# The DOTFILE_DIRS tag can be used to specify one or more directories that +# contain dot files that are included in the documentation (see the +# \dotfile command). + +DOTFILE_DIRS = + +# The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width +# (in pixels) of the graphs generated by dot. If a graph becomes larger than +# this value, doxygen will try to truncate the graph, so that it fits within +# the specified constraint. Beware that most browsers cannot cope with very +# large images. + +MAX_DOT_GRAPH_WIDTH = 1024 + +# The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height +# (in pixels) of the graphs generated by dot. If a graph becomes larger than +# this value, doxygen will try to truncate the graph, so that it fits within +# the specified constraint. Beware that most browsers cannot cope with very +# large images. + +MAX_DOT_GRAPH_HEIGHT = 1024 + +# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will +# generate a legend page explaining the meaning of the various boxes and +# arrows in the dot generated graphs. + +GENERATE_LEGEND = YES + +# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will +# remove the intermedate dot files that are used to generate +# the various graphs. + +DOT_CLEANUP = YES + +#--------------------------------------------------------------------------- +# Configuration::addtions related to the search engine +#--------------------------------------------------------------------------- + +# The SEARCHENGINE tag specifies whether or not a search engine should be +# used. If set to NO the values of all tags below this one will be ignored. + +SEARCHENGINE = NO + +# The CGI_NAME tag should be the name of the CGI script that +# starts the search engine (doxysearch) with the correct parameters. +# A script with this name will be generated by doxygen. + +CGI_NAME = + +# The CGI_URL tag should be the absolute URL to the directory where the +# cgi binaries are located. See the documentation of your http daemon for +# details. + +CGI_URL = + +# The DOC_URL tag should be the absolute URL to the directory where the +# documentation is located. If left blank the absolute path to the +# documentation, with file:// prepended to it, will be used. + +DOC_URL = + +# The DOC_ABSPATH tag should be the absolute path to the directory where the +# documentation is located. If left blank the directory on the local machine +# will be used. + +DOC_ABSPATH = + +# The BIN_ABSPATH tag must point to the directory where the doxysearch binary +# is installed. + +BIN_ABSPATH = + +# The EXT_DOC_PATHS tag can be used to specify one or more paths to +# documentation generated for other projects. This allows doxysearch to search +# the documentation for these projects as well. + +EXT_DOC_PATHS = diff --git a/src/Makefile b/src/Makefile new file mode 100644 index 0000000..af900da --- /dev/null +++ b/src/Makefile @@ -0,0 +1,91 @@ +#============================================================================= +# +# file : Makefile.h +# +# description : Include for the ContinuousAO class. +# +# project : Makefile to generate a Tango server +# +# $Author: syldup $ +# +# $Revision: 1.1.1.1 $ +# +# $Log: not supported by cvs2svn $ +# +# copyleft : European Synchrotron Radiation Facility +# BP 220, Grenoble 38043 +# FRANCE +# +#============================================================================= +# This file is generated by POGO +# (Program Obviously used to Generate tango Object) +# +# (c) - Software Engineering Group - ESRF +#============================================================================= +# + +ifdef _solaris +CC = CC +BIN_DIR = solaris7_CC +endif + +ifdef linux +CC = c++ +AR = ar +BIN_DIR = suse72 +endif + +TANGO_HOME = /segfs/tango +INCLUDE_DIRS = -I$(TANGO_HOME)/include/$(BIN_DIR) -I. +LIB_DIRS = -L $(TANGO_HOME)/lib/$(BIN_DIR) + +ifdef _solaris +CXXFLAGS = -mt -D_PTHREADS $(INCLUDE_DIRS) +LFLAGS = -g $(LIB_DIRS) \ + -ltango \ + -llog4tango \ + -lomniORB4 \ + -lomniDynamic4 \ + -lomnithread \ + -lpthread \ + -lposix4 -lsocket -lnsl +endif + +ifdef linux +CXXFLAGS = -g -D_REENTRANT $(INCLUDE_DIRS) +LFLAGS = -g $(LIB_DIRS) \ + -ltango \ + -llog4tango \ + -lomniORB4 \ + -lomniDynamic4 \ + -lomnithread \ + -ldl -lpthread +endif + + + + +CLASS = ContinuousAO + +SVC_OBJS = main.o \ + ClassFactory.o \ + $(CLASS)Class.o \ + $(CLASS).o + +SVC_INC = $(CLASS)Class.h \ + $(CLASS).h + + +%.o: %.cpp $(SVC_INC) + $(CC) $(CXXFLAGS) -c $< + +all: $(CLASS) + +$(CLASS): $(SVC_OBJS) + $(CC) $(SVC_OBJS) -o $(CLASS) $(LFLAGS) + +clean: + rm -f *.o $(CLASS) core + +install: + cp $(CLASS) $(TANGO_HOME)/bin/$(BIN_DIR) diff --git a/src/Makefile.VC b/src/Makefile.VC new file mode 100644 index 0000000..65dd20b --- /dev/null +++ b/src/Makefile.VC @@ -0,0 +1,38 @@ +# +device_server= ContinuousAO +# +INCUSER= /I$(D2KDASK_INC) /I$(PCISDASK_INC) +# +LIBUSER= $(ASL_LIB)/asl.lib $(ACE_LIB)/ace.lib + +# +# ------------------Fin des modifications pour le end user ------------------------------------- +# +make_dir=$(SOLEIL_ROOT)\env + +# Les d�finitions communes � tous les DeviceServeurs +!include $(make_dir)\tango.opt + +exe_device_server= $(EXEDIR)\ds_$(device_server).exe +pdb_name= $(TEMPLIBDIR)\$(device_server).pdb + +# -------------------------------------- +# Partie sp�cifique Device Server +# -------------------------------------- + +LISTEOBJ = \ + $(OBJDIR)\ADLinkContinuousAO.OBJ\ + $(OBJDIR)\$(device_server).OBJ\ + $(OBJDIR)\ClassFactory.OBJ\ + $(OBJDIR)\main.OBJ\ + $(OBJDIR)\$(device_server)Class.OBJ + +SRCS = \ + ADLinkContinuousAO.CPP\ + $(device_server).CPP\ + ClassFactory.CPP\ + main.CPP \ + $(device_server)Class.CPP +# -------------------------------------- +!include $(make_dir)\common_target.opt + diff --git a/src/README b/src/README new file mode 100644 index 0000000..343a30d --- /dev/null +++ b/src/README @@ -0,0 +1,40 @@ +//-============================================================ +// +// This class has been generated by POGO +// (Program Obviously used to Generate tango Object) +// +// (c) - Software Engineering Group - ESRF +//============================================================= + + +Files generated: +=============== +ContinuousAO.cpp: Source code for the ContinuousAO class and its commands. + This class is derived from DeviceImpl_2 class. + It represents the CORBA servant obbject which + will be accessed from the network. + All commands which can be executed on the + ContinuousAO are implemented in this file. + +ContinuousAO.h: Include for the ContinuousAO class. + Server class prototypes and descriptions. + +ContinuousAOClass.cpp: A singleton class derived fromContinuousAO. + It implements the command list and all properties + and methods required by the ContinuousAO once per process + +ContinuousAOClass.h: Include for the ContinuousAOClass root class. + This class is represents the singleton class for + the ContinuousAO device class. + It contains all properties and methods which the + ContinuousAO requires only once e.g. the commands. + +main.cpp: C++ source for a TANGO device server main. + The main rule is to initialise (and create) the Tango + system and to create the DServerClass singleton. + The main should be the same for every Tango device server. + +ClassFactory.cpp: C++ source for the class_factory method of the DServer + device class. This method is responsible to create + all class singletin for a device server. It is called + at device server startup diff --git a/src/main.cpp b/src/main.cpp new file mode 100644 index 0000000..f917a03 --- /dev/null +++ b/src/main.cpp @@ -0,0 +1,72 @@ +static const char *RcsId = "$Header: /users/chaize/newsvn/cvsroot/InputOutput/ADLINK/ContinuousAO/src/main.cpp,v 1.1.1.1 2004-12-06 10:20:44 syldup Exp $"; +//+============================================================================= +// +// file : main.cpp +// +// description : C++ source for a TANGO device server main. +// The main rule is to initialise (and create) the Tango +// system and to create the DServerClass singleton. +// The main should be the same for every Tango device server. +// +// project : TANGO Device Server +// +// $Author: syldup $ +// +// $Revision: 1.1.1.1 $ $ +// +// $Log: not supported by cvs2svn $ +// +// copyleft : Synchrotron SOLEIL +// L'Orme des Merisiers +// Saint-Aubin - BP 48 +// +//-============================================================================= +// +// This file is generated by POGO +// (Program Obviously used to Generate tango Object) +// +// (c) - Software Engineering Group - ESRF +//============================================================================= +#include <ace\ACE.h> +#include <tango.h> + + +int main(int argc,char *argv[]) +{ + + Tango::Util *tg; + try + { + // Initialise the device server + //---------------------------------------- + tg = Tango::Util::init(argc,argv); + + // Create the device server singleton + // which will create everything + //---------------------------------------- + tg->server_init(false); + + // Run the endless loop + //---------------------------------------- + cout << "Ready to accept request" << endl; + tg->server_run(); + } + catch (bad_alloc) + { + cout << "Can't allocate memory to store device object !!!" << endl; + cout << "Exiting" << endl; + } + catch (CORBA::Exception &e) + { + Tango::Except::print_exception(e); + + cout << "Received a CORBA_Exception" << endl; + cout << "Exiting" << endl; + } + + // clean ORB, threads..... + //-------------------------- + tg->server_cleanup(); + + return(0); +} -- GitLab