diff --git a/doc/DeviceServerUsersGuide_en.doc b/doc/DeviceServerUsersGuide_en.doc new file mode 100644 index 0000000000000000000000000000000000000000..739e7ee92579db0bf1d47b623f66a43c617574ae Binary files /dev/null and b/doc/DeviceServerUsersGuide_en.doc differ diff --git a/doc/Doxyfile b/doc/Doxyfile new file mode 100644 index 0000000000000000000000000000000000000000..c4b1a995c0026cfc6cf203e7c383162cb29f3c2d --- /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 0000000000000000000000000000000000000000..383d44521208efc4f7445f52b4b9ba7174cdd7fe --- /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 0000000000000000000000000000000000000000..5d640e2cd0a22d4996df05e02fd6d01c37ae9142 --- /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 0000000000000000000000000000000000000000..82dbba2bfbf1f7232fda887b050b4a59ee3397f5 --- /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 0000000000000000000000000000000000000000..039ee3311d80a9af10034080ac4d9588e93ca491 --- /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 0000000000000000000000000000000000000000..07e6925485b50a021510ec79b631e4cf5065f29b --- /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 0000000000000000000000000000000000000000..01abe5c835196e1474a068d9e8bdc28ee18d2b95 --- /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 0000000000000000000000000000000000000000..a41dd83c6f85edef434100a5d452c918f989cdf5 --- /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 0000000000000000000000000000000000000000..02660af153f05e0684773027955462329310468a --- /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 0000000000000000000000000000000000000000..29c83c52b65661594e32dfa10999f840139fc3a8 --- /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 0000000000000000000000000000000000000000..0d21467e837afc528fccea6565a763b0e8a77ae8 --- /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 0000000000000000000000000000000000000000..24e18048aa09cd943b45a655a542ba6848e850b4 --- /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 0000000000000000000000000000000000000000..d9a634279e9b0a9d5f6c54ce01c7febbc16e7222 --- /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 0000000000000000000000000000000000000000..e273b5bb18d61d964ea5ada668d8020304b840f8 --- /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 0000000000000000000000000000000000000000..a6903d9c4df6b006cc66437e0a9efc7513b54437 --- /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 0000000000000000000000000000000000000000..ce5207330e8a4fc9149e80bfac01d6cffda4e780 --- /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 0000000000000000000000000000000000000000..4678e055950715de76a5159775a0ad00812a0f82 --- /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 0000000000000000000000000000000000000000..82fc9cc0a33572b7654a8407429074e6b2f7f287 --- /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 0000000000000000000000000000000000000000..428e48ab6bd9738a25f14f6b5f3da2e98729eb3d --- /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 0000000000000000000000000000000000000000..5ec99fabbc7d52e73600d743c2ccac88b217d4a4 --- /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 0000000000000000000000000000000000000000..af900dade41baf34a0cd2c3ed1ce46be1ff7f5f7 --- /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 0000000000000000000000000000000000000000..65dd20beb77521a13b88575896221d2e33194a30 --- /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 0000000000000000000000000000000000000000..343a30d3c2b8451b1bef9513613af866e8209c85 --- /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 0000000000000000000000000000000000000000..f917a03d0cc2ffa8005330e4017aeb967ef09271 --- /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); +}