diff --git a/.gitignore b/.gitignore
index 27608dc86..ceaf08419 100644
--- a/.gitignore
+++ b/.gitignore
@@ -7,3 +7,4 @@ build/**
venv
*.class
*__pycache__
+.vscode
diff --git a/Makefile b/Makefile
index e9b33cb05..d29ec82e7 100644
--- a/Makefile
+++ b/Makefile
@@ -191,6 +191,21 @@ workspace-sitl::
@echo 'Generating Simlink XTCE'
@core/tools/auto-yamcs/src/generate_xtce.sh ${PWD}/build/obc/simlink/target/wh_defs.yaml ${PWD}/build/obc/simlink/target/wh_defs.db ${PWD}/build/obc/sitl_commander_workspace/mdb/simlink.xml
+
+
+workspace-training::
+ @echo 'Generating ground tools data.'
+ @make -C build/training/target ground-tools
+ @echo 'Adding XTCE configuration to registries.'
+ @yaml-merge core/base/tools/commander/xtce_config.yaml build/training/target/wh_defs.yaml --overwrite build/training/target/wh_defs.yaml
+ @echo 'Generating registry.'
+ @rm -Rf build/training/commander_workspace >/dev/null
+ @mkdir -p build/training/commander_workspace/etc
+ @python3 core/base/tools/config/yaml_path_merger.py --yaml_output build/training/commander_workspace/etc/registry.yaml --yaml_input build/training/target/wh_defs.yaml --yaml_path /modules/training
+ @echo 'Generating Commander workspace.'
+ @python3 core/base/tools/commander/generate_workspace.py build/training/commander_workspace/etc/registry.yaml build/training/commander_workspace/
+ @echo 'Generating XTCE'
+ @core/tools/auto-yamcs/src/generate_xtce.sh ${PWD}/build/training/target/wh_defs.yaml ${PWD}/build/training/target/wh_defs.db ${PWD}/build/training/commander_workspace/mdb/training.xml
obc-sitl:: obc/ppd/sitl obc/cpd/sitl obc/simlink
diff --git a/apps/mfa/cdr/Main.bob b/apps/mfa/cdr/Main.bob
new file mode 100644
index 000000000..12c426191
--- /dev/null
+++ b/apps/mfa/cdr/Main.bob
@@ -0,0 +1,358 @@
+
+
+ ($(CPUID)) MFA
+
+ mfa
+ true
+ /modules/$(CPUID)/modules/apps/modules/$(APP)
+ {{ cpu_id }}
+@BUILDLINER_CDR_MACRO_BLOCK@
+@BUILDLINER_CDR_MACRO_BLOCK_CUSTOM@
+
+ 700
+ 550
+
+
+
+
+
+
+ 6
+ 6
+
+ Label_49
+ ($(CPUID)) My First App
+ 19
+ 10
+ 166
+
+
+
+
+ 1
+ 1
+ false
+
+
+
+
+
+
+
+
+ Commanding
+ 19
+ 36
+ 318
+ 240
+
+
+
+
+
+ NoOp_2
+
+
+
+
+
+ NoOp
+ 5
+ 57
+ 140
+ 20
+
+
+
+
+
+
+
+
+ $(actions)
+ false
+
+
+ NoOp_5
+
+
+
+
+
+ Reset
+ 5
+ 77
+ 140
+ 20
+
+
+
+
+
+
+
+
+ $(actions)
+ false
+
+
+ Text Update_5
+ /cfs/$(CPUID)/apps/mfa/MFA_HK_TLM_MID.Commands
+ 107
+ 7
+ 98
+ 18
+
+
+
+
+ 0
+ 1
+ false
+
+
+ 1
+
+
+ Label_2
+ Cmd Count
+ 10
+ 6
+ 79
+ 2
+ 1
+ false
+
+
+
+
+
+
+
+
+ Label_3
+ Err Count
+ 26
+ 25
+ 63
+ 2
+ 1
+ false
+
+
+
+
+
+
+
+
+ Text Update_6
+ /cfs/$(CPUID)/apps/mfa/MFA_HK_TLM_MID.CmdErrors
+ 107
+ 26
+ 98
+ 18
+
+
+
+
+ 0
+ 1
+ false
+
+
+ 1
+
+
+ Embedded Display_2
+ $(CMD_MANAGEMENT_CONTAINER)
+ 5
+ 97
+ 140
+ 100
+
+
+
+ Telemetry
+ 19
+ 276
+ 318
+ 126
+
+
+
+
+
+ Embedded Display_3
+ TO_TlmManagement.bob
+ 5
+ 26
+ 140
+ 60
+
+
+
+ Miscellaneous
+ 337
+ 216
+ 186
+
+
+
+
+
+ AppControl_1
+
+
+ $(APP_CONTROL_TEMPLATE)
+ tab
+ Open Display
+
+
+ App Control
+ 6
+ 6
+ 175
+ 20
+ $(actions)
+ false
+
+
+ Action Button_5
+
+
+ SendDiag.bob
+ tab
+
+
+ Diagnostic
+ 6
+ 26
+ 175
+ 20
+ $(actions)
+ false
+
+
+ Events_1
+
+
+ EventControl.bob
+ tab
+ Open Display
+
+
+ Event Filtering
+ 6
+ 46
+ 175
+ 20
+ $(actions)
+ false
+
+
+ Action Button_3
+
+
+ QueryPriorityQueue.opi
+ tab
+
+
+ Query Priority Queue
+ 6
+ 66
+ 175
+ 20
+ $(actions)
+ false
+
+
+ Action Button_2
+
+
+ QueryOutputChannel.opi
+ tab
+
+
+ Query Output Channel
+ 6
+ 86
+ 175
+ 20
+ $(actions)
+ false
+
+
+ AppControl_2
+
+
+
+
+
+ Sch Table
+ 6
+ 106
+ 174
+ 20
+ $(actions)
+ false
+
+
+
+ Action
+ 337
+ 36
+ 168
+
+
+
+
+
+ SetMessage
+
+
+ SetMessage.opi
+ tab
+ Open Display
+
+
+ Set Config Message
+ 11
+ 6
+ 170
+ $(actions)
+
+
+ SaveConfig
+
+
+ SaveConfigFile.opi
+ tab
+ Open Display
+
+
+ Save Config File
+ 11
+ 48
+ 170
+ $(actions)
+
+
+
diff --git a/apps/mfa/cdr/SaveConfigFile.bob b/apps/mfa/cdr/SaveConfigFile.bob
new file mode 100644
index 000000000..1dfcfab4b
--- /dev/null
+++ b/apps/mfa/cdr/SaveConfigFile.bob
@@ -0,0 +1,95 @@
+
+
+ ($(CPUID)) MFA - Save Config File
+ 100
+ 100
+ 400
+ 128
+
+ FileNameLabel
+ Config File:
+ 30
+ 50
+
+
+ Title
+ ($(CPUID)) MFA - Save Config File
+ 10
+ 10
+ 241
+
+
+
+
+ 1
+ 1
+ false
+
+
+
+
+
+
+
+
+ FileName
+ loc://$(APP)_$(CPUID)_$(DID)_FileName<VString>("")
+ 110
+ 50
+ 230
+ 18
+
+
+
+
+
+
+ 1
+
+
+ SetMessage
+
+
+
+
+
+ Set Config Message
+ 30
+ 90
+ 310
+ 20
+
+
+
+
+
+
+
+
+ $(actions)
+ false
+
+
diff --git a/apps/mfa/cdr/SetMessage.bob b/apps/mfa/cdr/SetMessage.bob
new file mode 100644
index 000000000..42263754d
--- /dev/null
+++ b/apps/mfa/cdr/SetMessage.bob
@@ -0,0 +1,80 @@
+
+
+ ($(CPUID)) MFA - Set Message
+ 100
+ 100
+ 400
+ 128
+
+ MsgLabel
+ Message:
+ 30
+ 50
+
+
+ Title
+ ($(CPUID)) MFA - Set Config Message
+ 10
+ 10
+ 241
+
+
+
+
+ 1
+ 1
+ false
+
+
+
+
+
+
+
+
+ MessageString
+ loc://MFA_SetMessage_Message<VString>
+ 110
+ 50
+ 230
+ 18
+
+
+
+
+
+
+ 1
+
+
+ SetMessage
+
+
+
+
+
+ Set Config Message
+ 30
+ 90
+ 310
+ 20
+
+
+
+
+
+
+
+
+ $(actions)
+ false
+
+
diff --git a/apps/mfa/fsw/for_build/CMakeLists.txt b/apps/mfa/fsw/for_build/CMakeLists.txt
new file mode 100644
index 000000000..0c1bd1666
--- /dev/null
+++ b/apps/mfa/fsw/for_build/CMakeLists.txt
@@ -0,0 +1,10 @@
+buildliner_add_app_def(mfa
+ FILE MFA
+
+ SOURCES
+ ${CMAKE_CURRENT_SOURCE_DIR}/../src/mfa_app.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/../src/mfa_symbols.c
+
+ INCLUDES
+ ${CMAKE_CURRENT_SOURCE_DIR}/../src/
+)
diff --git a/apps/mfa/fsw/for_build/mfa_doxygen.conf b/apps/mfa/fsw/for_build/mfa_doxygen.conf
new file mode 100644
index 000000000..b8d9bc6e1
--- /dev/null
+++ b/apps/mfa/fsw/for_build/mfa_doxygen.conf
@@ -0,0 +1,2494 @@
+# Doxyfile 1.8.13
+
+# This file describes the settings to be used by the documentation system
+# doxygen (www.doxygen.org) for a project.
+#
+# All text after a double hash (##) is considered a comment and is placed in
+# front of the TAG it is preceding.
+#
+# All text after a single 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 (\" \").
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+
+# This tag specifies the encoding used for all characters in the config file
+# that follow. The default is UTF-8 which is also the encoding used for all text
+# before the first occurrence of this tag. Doxygen uses libiconv (or the iconv
+# built into libc) for the transcoding. See http://www.gnu.org/software/libiconv
+# for the list of possible encodings.
+# The default value is: UTF-8.
+
+DOXYFILE_ENCODING = UTF-8
+
+# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by
+# double-quotes, unless you are using Doxywizard) that should identify the
+# project for which the documentation is generated. This name is used in the
+# title of most generated pages and in a few other places.
+# The default value is: My Project.
+
+PROJECT_NAME = "My First Application"
+
+# 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 =
+
+# Using the PROJECT_BRIEF tag one can provide an optional one line description
+# for a project that appears at the top of each page and should give viewer a
+# quick idea about the purpose of the project. Keep the description short.
+
+PROJECT_BRIEF =
+
+# With the PROJECT_LOGO tag one can specify a logo or an icon that is included
+# in the documentation. The maximum height of the logo should not exceed 55
+# pixels and the maximum width should not exceed 200 pixels. Doxygen will copy
+# the logo to the output directory.
+
+PROJECT_LOGO =
+
+# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path
+# into which the generated documentation will be written. 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 = "../docs"
+
+# If the CREATE_SUBDIRS tag is set to YES then doxygen will create 4096 sub-
+# directories (in 2 levels) under the output directory of each output format and
+# will distribute the generated files over these directories. Enabling this
+# option can be useful when feeding doxygen a huge amount of source files, where
+# putting all generated files in the same directory would otherwise causes
+# performance problems for the file system.
+# The default value is: NO.
+
+CREATE_SUBDIRS = NO
+
+# If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII
+# characters to appear in the names of generated files. If set to NO, non-ASCII
+# characters will be escaped, for example _xE3_x81_x84 will be used for Unicode
+# U+3044.
+# The default value is: NO.
+
+ALLOW_UNICODE_NAMES = NO
+
+# 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.
+# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese,
+# Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States),
+# Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian,
+# Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages),
+# Korean, Korean-en (Korean with English messages), Latvian, Lithuanian,
+# Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian,
+# Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish,
+# Ukrainian and Vietnamese.
+# The default value is: English.
+
+OUTPUT_LANGUAGE = English
+
+# If the BRIEF_MEMBER_DESC tag is set to YES, 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.
+# The default value is: YES.
+
+BRIEF_MEMBER_DESC = YES
+
+# If the REPEAT_BRIEF tag is set to YES, 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.
+# The default value is: YES.
+
+REPEAT_BRIEF = YES
+
+# This tag implements a quasi-intelligent brief description abbreviator that is
+# used to form the text in various listings. Each string in this list, if found
+# as the leading text of the brief description, will be stripped from the text
+# and the result, after processing the whole list, is used as the annotated
+# text. Otherwise, the brief description is used as-is. If left blank, the
+# following values are used ($name is automatically replaced with the name of
+# the entity):The $name class, The $name widget, The $name file, is, provides,
+# specifies, contains, represents, a, an and the.
+
+ABBREVIATE_BRIEF = "The $name class" \
+ "The $name widget" \
+ "The $name file" \
+ is \
+ provides \
+ specifies \
+ contains \
+ represents \
+ a \
+ an \
+ the
+
+# 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.
+# The default value is: NO.
+
+ALWAYS_DETAILED_SEC = NO
+
+# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all
+# inherited members of a class in the documentation of that class as if those
+# members were ordinary class members. Constructors, destructors and assignment
+# operators of the base classes will not be shown.
+# The default value is: NO.
+
+INLINE_INHERITED_MEMB = NO
+
+# If the FULL_PATH_NAMES tag is set to YES, 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
+# The default value is: YES.
+
+FULL_PATH_NAMES = YES
+
+# 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. The tag can be used to show relative paths in the file list.
+# If left blank the directory from which doxygen is run is used as the path to
+# strip.
+#
+# Note that you can specify absolute paths here, but also relative paths, which
+# will be relative from the directory where doxygen is started.
+# This tag requires that the tag FULL_PATH_NAMES is set to YES.
+
+STRIP_FROM_PATH =
+
+# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the
+# path mentioned in the documentation of a class, which tells the reader which
+# header file to include in order to use a class. If left blank only the name of
+# the header file containing the class definition is used. Otherwise one should
+# specify the list of include paths that are normally passed to the compiler
+# using the -I flag.
+
+STRIP_FROM_INC_PATH =
+
+# 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.
+# The default value is: NO.
+
+SHORT_NAMES = NO
+
+# 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-style will behave just like regular Qt-
+# style comments (thus requiring an explicit @brief command for a brief
+# description.)
+# The default value is: NO.
+
+JAVADOC_AUTOBRIEF = NO
+
+# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first
+# line (until the first dot) of a Qt-style comment as the brief description. If
+# set to NO, the Qt-style will behave just like regular Qt-style comments (thus
+# requiring an explicit \brief command for a brief description.)
+# The default value is: NO.
+
+QT_AUTOBRIEF = NO
+
+# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a
+# multi-line C++ special comment block (i.e. a block of //! or /// comments) as
+# a brief description. This used to be the default behavior. The new default is
+# to treat a multi-line C++ comment block as a detailed description. Set this
+# tag to YES if you prefer the old behavior instead.
+#
+# Note that setting this tag to YES also means that rational rose comments are
+# not recognized any more.
+# The default value is: NO.
+
+MULTILINE_CPP_IS_BRIEF = NO
+
+# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the
+# documentation from any documented member that it re-implements.
+# The default value is: YES.
+
+INHERIT_DOCS = YES
+
+# If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new
+# page for each member. If set to NO, the documentation of a member will be part
+# of the file/class/namespace that contains it.
+# The default value is: NO.
+
+SEPARATE_MEMBER_PAGES = 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.
+# Minimum value: 1, maximum value: 16, default value: 4.
+
+TAB_SIZE = 4
+
+# This tag can be used to specify a number of aliases that act 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 =
+
+# This tag can be used to specify a number of word-keyword mappings (TCL only).
+# A mapping has the form "name=value". For example adding "class=itcl::class"
+# will allow you to use the command class in the itcl::class meaning.
+
+TCL_SUBST =
+
+# 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.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_FOR_C = YES
+
+# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or
+# Python sources only. Doxygen will then generate output that is more tailored
+# for that language. For instance, namespaces will be presented as packages,
+# qualified scopes will look different, etc.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_JAVA = NO
+
+# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran
+# sources. Doxygen will then generate output that is tailored for Fortran.
+# The default value is: NO.
+
+OPTIMIZE_FOR_FORTRAN = NO
+
+# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL
+# sources. Doxygen will then generate output that is tailored for VHDL.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_VHDL = NO
+
+# Doxygen selects the parser to use depending on the extension of the files it
+# parses. With this tag you can assign which parser to use for a given
+# extension. Doxygen has a built-in mapping, but you can override or extend it
+# using this tag. The format is ext=language, where ext is a file extension, and
+# language is one of the parsers supported by doxygen: IDL, Java, Javascript,
+# C#, C, C++, D, PHP, Objective-C, Python, Fortran (fixed format Fortran:
+# FortranFixed, free formatted Fortran: FortranFree, unknown formatted Fortran:
+# Fortran. In the later case the parser tries to guess whether the code is fixed
+# or free formatted code, this is the default for Fortran type files), VHDL. For
+# instance to make doxygen treat .inc files as Fortran files (default is PHP),
+# and .f files as C (default is Fortran), use: inc=Fortran f=C.
+#
+# Note: For files without extension you can use no_extension as a placeholder.
+#
+# Note that for custom extensions you also need to set FILE_PATTERNS otherwise
+# the files are not read by doxygen.
+
+EXTENSION_MAPPING =
+
+# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments
+# according to the Markdown format, which allows for more readable
+# documentation. See http://daringfireball.net/projects/markdown/ for details.
+# The output of markdown processing is further processed by doxygen, so you can
+# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in
+# case of backward compatibilities issues.
+# The default value is: YES.
+
+MARKDOWN_SUPPORT = YES
+
+# When the TOC_INCLUDE_HEADINGS tag is set to a non-zero value, all headings up
+# to that level are automatically included in the table of contents, even if
+# they do not have an id attribute.
+# Note: This feature currently applies only to Markdown headings.
+# Minimum value: 0, maximum value: 99, default value: 0.
+# This tag requires that the tag MARKDOWN_SUPPORT is set to YES.
+
+TOC_INCLUDE_HEADINGS = 0
+
+# When enabled doxygen tries to link words that correspond to documented
+# classes, or namespaces to their corresponding documentation. Such a link can
+# be prevented in individual cases by putting a % sign in front of the word or
+# globally by setting AUTOLINK_SUPPORT to NO.
+# The default value is: YES.
+
+AUTOLINK_SUPPORT = YES
+
+# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want
+# to include (a tag file for) the STL sources as input, then you should set this
+# tag to YES in order to let doxygen match functions declarations and
+# definitions whose arguments contain STL classes (e.g. func(std::string);
+# versus func(std::string) {}). This also make the inheritance and collaboration
+# diagrams that involve STL classes more complete and accurate.
+# The default value is: NO.
+
+BUILTIN_STL_SUPPORT = NO
+
+# If you use Microsoft's C++/CLI language, you should set this option to YES to
+# enable parsing support.
+# The default value is: NO.
+
+CPP_CLI_SUPPORT = NO
+
+# Set the SIP_SUPPORT tag to YES if your project consists of sip (see:
+# http://www.riverbankcomputing.co.uk/software/sip/intro) sources only. Doxygen
+# will parse them like normal C++ but will assume all classes use public instead
+# of private inheritance when no explicit protection keyword is present.
+# The default value is: NO.
+
+SIP_SUPPORT = NO
+
+# For Microsoft's IDL there are propget and propput attributes to indicate
+# getter and setter methods for a property. Setting this option to YES will make
+# doxygen to replace the get and set methods by a property in the documentation.
+# This will only work if the methods are indeed getting or setting a simple
+# type. If this is not the case, or you want to show the methods anyway, you
+# should set this option to NO.
+# The default value is: YES.
+
+IDL_PROPERTY_SUPPORT = 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.
+# The default value is: NO.
+
+DISTRIBUTE_GROUP_DOC = NO
+
+# If one adds a struct or class to a group and this option is enabled, then also
+# any nested class or struct is added to the same group. By default this option
+# is disabled and one has to add nested compounds explicitly via \ingroup.
+# The default value is: NO.
+
+GROUP_NESTED_COMPOUNDS = NO
+
+# Set the SUBGROUPING tag to YES to allow class member groups of the same type
+# (for instance a group of public functions) to be put as a subgroup of that
+# type (e.g. under the Public Functions section). Set it to NO to prevent
+# subgrouping. Alternatively, this can be done per class using the
+# \nosubgrouping command.
+# The default value is: YES.
+
+SUBGROUPING = YES
+
+# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions
+# are shown inside the group in which they are included (e.g. using \ingroup)
+# instead of on a separate page (for HTML and Man pages) or section (for LaTeX
+# and RTF).
+#
+# Note that this feature does not work in combination with
+# SEPARATE_MEMBER_PAGES.
+# The default value is: NO.
+
+INLINE_GROUPED_CLASSES = NO
+
+# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions
+# with only public data fields or simple typedef fields will be shown inline in
+# the documentation of the scope in which they are defined (i.e. file,
+# namespace, or group documentation), provided this scope is documented. If set
+# to NO, structs, classes, and unions are shown on a separate page (for HTML and
+# Man pages) or section (for LaTeX and RTF).
+# The default value is: NO.
+
+INLINE_SIMPLE_STRUCTS = NO
+
+# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or
+# enum is documented as struct, union, or enum with the name of the typedef. So
+# typedef struct TypeS {} TypeT, will appear in the documentation as a struct
+# with name TypeT. When disabled the typedef will appear as a member of a file,
+# namespace, or class. And the struct will be named TypeS. This can typically be
+# useful for C code in case the coding convention dictates that all compound
+# types are typedef'ed and only the typedef is referenced, never the tag name.
+# The default value is: NO.
+
+TYPEDEF_HIDES_STRUCT = NO
+
+# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This
+# cache is used to resolve symbols given their name and scope. Since this can be
+# an expensive process and often the same symbol appears multiple times in the
+# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small
+# doxygen will become slower. If the cache is too large, memory is wasted. The
+# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range
+# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536
+# symbols. At the end of a run doxygen will report the cache usage and suggest
+# the optimal cache size from a speed point of view.
+# Minimum value: 0, maximum value: 9, default value: 0.
+
+LOOKUP_CACHE_SIZE = 0
+
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+
+# 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 respectively EXTRACT_STATIC tags are set to YES.
+# Note: This will also disable the warnings about undocumented members that are
+# normally produced when WARNINGS is set to YES.
+# The default value is: NO.
+
+EXTRACT_ALL = NO
+
+# If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will
+# be included in the documentation.
+# The default value is: NO.
+
+EXTRACT_PRIVATE = NO
+
+# If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal
+# scope will be included in the documentation.
+# The default value is: NO.
+
+EXTRACT_PACKAGE = NO
+
+# If the EXTRACT_STATIC tag is set to YES, all static members of a file will be
+# included in the documentation.
+# The default value is: NO.
+
+EXTRACT_STATIC = NO
+
+# If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined
+# locally in source files will be included in the documentation. If set to NO,
+# only classes defined in header files are included. Does not have any effect
+# for Java sources.
+# The default value is: YES.
+
+EXTRACT_LOCAL_CLASSES = YES
+
+# This flag is only useful for Objective-C code. If set to YES, local methods,
+# which are defined in the implementation section but not in the interface are
+# included in the documentation. If set to NO, only methods in the interface are
+# included.
+# The default value is: NO.
+
+EXTRACT_LOCAL_METHODS = NO
+
+# If this flag is set to YES, the members of anonymous namespaces will be
+# extracted and appear in the documentation as a namespace called
+# 'anonymous_namespace{file}', where file will be replaced with the base name of
+# the file that contains the anonymous namespace. By default anonymous namespace
+# are hidden.
+# The default value is: NO.
+
+EXTRACT_ANON_NSPACES = NO
+
+# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all
+# undocumented members inside documented classes or files. If set to NO 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.
+# The default value is: NO.
+
+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, these classes will be included in the various overviews. This option
+# has no effect if EXTRACT_ALL is enabled.
+# The default value is: NO.
+
+HIDE_UNDOC_CLASSES = NO
+
+# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend
+# (class|struct|union) declarations. If set to NO, these declarations will be
+# included in the documentation.
+# The default value is: NO.
+
+HIDE_FRIEND_COMPOUNDS = NO
+
+# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any
+# documentation blocks found inside the body of a function. If set to NO, these
+# blocks will be appended to the function's detailed documentation block.
+# The default value is: NO.
+
+HIDE_IN_BODY_DOCS = NO
+
+# The INTERNAL_DOCS tag determines if documentation that is typed after a
+# \internal command is included. If the tag is set to NO then the documentation
+# will be excluded. Set it to YES to include the internal documentation.
+# The default value is: NO.
+
+INTERNAL_DOCS = NO
+
+# 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
+# and Mac users are advised to set this option to NO.
+# The default value is: system dependent.
+
+CASE_SENSE_NAMES = YES
+
+# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with
+# their full class and namespace scopes in the documentation. If set to YES, the
+# scope will be hidden.
+# The default value is: NO.
+
+HIDE_SCOPE_NAMES = NO
+
+# If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will
+# append additional text to a page's title, such as Class Reference. If set to
+# YES the compound reference will be hidden.
+# The default value is: NO.
+
+HIDE_COMPOUND_REFERENCE= NO
+
+# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of
+# the files that are included by a file in the documentation of that file.
+# The default value is: YES.
+
+SHOW_INCLUDE_FILES = YES
+
+# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each
+# grouped member an include statement to the documentation, telling the reader
+# which file to include in order to use the member.
+# The default value is: NO.
+
+SHOW_GROUPED_MEMB_INC = NO
+
+# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include
+# files with double quotes in the documentation rather than with sharp brackets.
+# The default value is: NO.
+
+FORCE_LOCAL_INCLUDES = NO
+
+# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the
+# documentation for inline members.
+# The default value is: YES.
+
+INLINE_INFO = YES
+
+# If the SORT_MEMBER_DOCS tag is set to YES 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.
+# The default value is: YES.
+
+SORT_MEMBER_DOCS = YES
+
+# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief
+# descriptions of file, namespace and class members alphabetically by member
+# name. If set to NO, the members will appear in declaration order. Note that
+# this will also influence the order of the classes in the class list.
+# The default value is: NO.
+
+SORT_BRIEF_DOCS = NO
+
+# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the
+# (brief and detailed) documentation of class members so that constructors and
+# destructors are listed first. If set to NO the constructors will appear in the
+# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS.
+# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief
+# member documentation.
+# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting
+# detailed member documentation.
+# The default value is: NO.
+
+SORT_MEMBERS_CTORS_1ST = NO
+
+# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy
+# of group names into alphabetical order. If set to NO the group names will
+# appear in their defined order.
+# The default value is: NO.
+
+SORT_GROUP_NAMES = NO
+
+# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by
+# fully-qualified names, including namespaces. If set to NO, the class list will
+# be sorted only by class name, not including the namespace part.
+# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
+# Note: This option applies only to the class list, not to the alphabetical
+# list.
+# The default value is: NO.
+
+SORT_BY_SCOPE_NAME = NO
+
+# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper
+# type resolution of all parameters of a function it will reject a match between
+# the prototype and the implementation of a member function even if there is
+# only one candidate or it is obvious which candidate to choose by doing a
+# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still
+# accept a match between prototype and implementation in such cases.
+# The default value is: NO.
+
+STRICT_PROTO_MATCHING = NO
+
+# 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.
+# The default value is: YES.
+
+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.
+# The default value is: YES.
+
+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.
+# The default value is: YES.
+
+GENERATE_BUGLIST = YES
+
+# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or disable (NO)
+# the deprecated list. This list is created by putting \deprecated commands in
+# the documentation.
+# The default value is: YES.
+
+GENERATE_DEPRECATEDLIST= YES
+
+# The ENABLED_SECTIONS tag can be used to enable conditional documentation
+# sections, marked by \if ... \endif and \cond
+# ... \endcond blocks.
+
+ENABLED_SECTIONS =
+
+# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the
+# initial value of a variable or macro / define can have 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 value of individual variables and macros / defines can be
+# controlled using \showinitializer or \hideinitializer command in the
+# documentation regardless of this setting.
+# Minimum value: 0, maximum value: 10000, default value: 30.
+
+MAX_INITIALIZER_LINES = 30
+
+# 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.
+# The default value is: YES.
+
+SHOW_USED_FILES = YES
+
+# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This
+# will remove the Files entry from the Quick Index and from the Folder Tree View
+# (if specified).
+# The default value is: YES.
+
+SHOW_FILES = YES
+
+# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces
+# page. This will remove the Namespaces entry from the Quick Index and from the
+# Folder Tree View (if specified).
+# The default value is: YES.
+
+SHOW_NAMESPACES = YES
+
+# The FILE_VERSION_FILTER tag can be used to specify a program or script that
+# doxygen should invoke to get the current version for each file (typically from
+# the version control system). Doxygen will invoke the program by executing (via
+# popen()) the command command input-file, where command is the value of the
+# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided
+# by doxygen. Whatever the program writes to standard output is used as the file
+# version. For an example see the documentation.
+
+FILE_VERSION_FILTER =
+
+# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed
+# by doxygen. The layout file controls the global structure of the generated
+# output files in an output format independent way. To create the layout file
+# that represents doxygen's defaults, run doxygen with the -l option. You can
+# optionally specify a file name after the option, if omitted DoxygenLayout.xml
+# will be used as the name of the layout file.
+#
+# Note that if you run doxygen from a directory containing a file called
+# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE
+# tag is left empty.
+
+LAYOUT_FILE =
+
+# The CITE_BIB_FILES tag can be used to specify one or more bib files containing
+# the reference definitions. This must be a list of .bib files. The .bib
+# extension is automatically appended if omitted. This requires the bibtex tool
+# to be installed. See also http://en.wikipedia.org/wiki/BibTeX for more info.
+# For LaTeX the style of the bibliography can be controlled using
+# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the
+# search path. See also \cite for info how to create references.
+
+CITE_BIB_FILES =
+
+#---------------------------------------------------------------------------
+# Configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+
+# The QUIET tag can be used to turn on/off the messages that are generated to
+# standard output by doxygen. If QUIET is set to YES this implies that the
+# messages are off.
+# The default value is: NO.
+
+QUIET = NO
+
+# The WARNINGS tag can be used to turn on/off the warning messages that are
+# generated to standard error (stderr) by doxygen. If WARNINGS is set to YES
+# this implies that the warnings are on.
+#
+# Tip: Turn warnings on while writing the documentation.
+# The default value is: YES.
+
+WARNINGS = YES
+
+# If the WARN_IF_UNDOCUMENTED tag 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.
+# The default value is: YES.
+
+WARN_IF_UNDOCUMENTED = YES
+
+# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for
+# potential errors in the documentation, such as not documenting some parameters
+# in a documented function, or documenting parameters that don't exist or using
+# markup commands wrongly.
+# The default value is: YES.
+
+WARN_IF_DOC_ERROR = YES
+
+# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that
+# are documented, but have no documentation for their parameters or return
+# value. If set to NO, doxygen will only warn about wrong or incomplete
+# parameter documentation, but not about the absence of documentation.
+# The default value is: NO.
+
+WARN_NO_PARAMDOC = NO
+
+# If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when
+# a warning is encountered.
+# The default value is: NO.
+
+WARN_AS_ERROR = NO
+
+# 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. Optionally the format may contain $version, which will
+# be replaced by the version of the file (if it could be obtained via
+# FILE_VERSION_FILTER)
+# The default value is: $file:$line: $text.
+
+WARN_FORMAT = "$file:$line: $text"
+
+# 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 standard
+# error (stderr).
+
+WARN_LOGFILE =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the input files
+#---------------------------------------------------------------------------
+
+# The INPUT tag is 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. See also FILE_PATTERNS and EXTENSION_MAPPING
+# Note: If this tag is empty the current directory is searched.
+
+INPUT = "../src"
+
+# This tag can be used to specify the character encoding of the source files
+# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses
+# libiconv (or the iconv built into libc) for the transcoding. See the libiconv
+# documentation (see: http://www.gnu.org/software/libiconv) for the list of
+# possible encodings.
+# The default value is: UTF-8.
+
+INPUT_ENCODING = UTF-8
+
+# If the value of the INPUT tag contains directories, you can use the
+# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and
+# *.h) to filter out the source-files in the directories.
+#
+# Note that for custom extensions or not directly supported extensions you also
+# need to set EXTENSION_MAPPING for the extension otherwise the files are not
+# read by doxygen.
+#
+# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp,
+# *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h,
+# *.hh, *.hxx, *.hpp, *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc,
+# *.m, *.markdown, *.md, *.mm, *.dox, *.py, *.pyw, *.f90, *.f95, *.f03, *.f08,
+# *.f, *.for, *.tcl, *.vhd, *.vhdl, *.ucf and *.qsf.
+
+FILE_PATTERNS = *.c \
+ *.cc \
+ *.cxx \
+ *.cpp \
+ *.c++ \
+ *.java \
+ *.ii \
+ *.ixx \
+ *.ipp \
+ *.i++ \
+ *.inl \
+ *.idl \
+ *.ddl \
+ *.odl \
+ *.h \
+ *.hh \
+ *.hxx \
+ *.hpp \
+ *.h++ \
+ *.cs \
+ *.d \
+ *.php \
+ *.php4 \
+ *.php5 \
+ *.phtml \
+ *.inc \
+ *.m \
+ *.markdown \
+ *.md \
+ *.mm \
+ *.dox \
+ *.py \
+ *.pyw \
+ *.f90 \
+ *.f95 \
+ *.f03 \
+ *.f08 \
+ *.f \
+ *.for \
+ *.tcl \
+ *.vhd \
+ *.vhdl \
+ *.ucf \
+ *.qsf
+
+# The RECURSIVE tag can be used to specify whether or not subdirectories should
+# be searched for input files as well.
+# The default value is: NO.
+
+RECURSIVE = NO
+
+# The EXCLUDE tag can be used to specify files and/or directories that should be
+# 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.
+#
+# Note that relative paths are relative to the directory from which doxygen is
+# run.
+
+EXCLUDE =
+
+# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or
+# directories that are symbolic links (a Unix file system feature) are excluded
+# from the input.
+# The default value is: NO.
+
+EXCLUDE_SYMLINKS = NO
+
+# 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.
+#
+# Note that the wildcards are matched against the file with absolute path, so to
+# exclude all test directories for example use the pattern */test/*
+
+EXCLUDE_PATTERNS =
+
+# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
+# (namespaces, classes, functions, etc.) that should be excluded from the
+# output. The symbol name can be a fully qualified name, a word, or if the
+# wildcard * is used, a substring. Examples: ANamespace, AClass,
+# AClass::ANamespace, ANamespace::*Test
+#
+# Note that the wildcards are matched against the file with absolute path, so to
+# exclude all test directories use the pattern */test/*
+
+EXCLUDE_SYMBOLS =
+
+# 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 = *
+
+# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
+# searched for input files to be used with the \include or \dontinclude commands
+# irrespective of the value of the RECURSIVE tag.
+# The default value is: NO.
+
+EXAMPLE_RECURSIVE = NO
+
+# The IMAGE_PATH tag can be used to specify one or more files or directories
+# that contain images that are to be 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:
+#
+#
+#
+# where is the value of the INPUT_FILTER tag, and is the
+# name of an input file. Doxygen will then use the output that the filter
+# program writes to standard output. If FILTER_PATTERNS is specified, this tag
+# will be ignored.
+#
+# Note that the filter must not add or remove lines; it is applied before the
+# code is scanned, but not when the output code is generated. If lines are added
+# or removed, the anchors will not be placed correctly.
+#
+# Note that for custom extensions or not directly supported extensions you also
+# need to set EXTENSION_MAPPING for the extension otherwise the files are not
+# properly processed by doxygen.
+
+INPUT_FILTER =
+
+# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
+# basis. Doxygen will compare the file name with each pattern and apply the
+# filter if there is a match. The filters are a list of the form: pattern=filter
+# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how
+# filters are used. If the FILTER_PATTERNS tag is empty or if none of the
+# patterns match the file name, INPUT_FILTER is applied.
+#
+# Note that for custom extensions or not directly supported extensions you also
+# need to set EXTENSION_MAPPING for the extension otherwise the files are not
+# properly processed by doxygen.
+
+FILTER_PATTERNS =
+
+# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
+# INPUT_FILTER) will also be used to filter the input files that are used for
+# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES).
+# The default value is: NO.
+
+FILTER_SOURCE_FILES = NO
+
+# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file
+# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and
+# it is also possible to disable source filtering for a specific pattern using
+# *.ext= (so without naming a filter).
+# This tag requires that the tag FILTER_SOURCE_FILES is set to YES.
+
+FILTER_SOURCE_PATTERNS =
+
+# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that
+# is part of the input, its contents will be placed on the main page
+# (index.html). This can be useful if you have a project on for instance GitHub
+# and want to reuse the introduction page also for the doxygen output.
+
+USE_MDFILE_AS_MAINPAGE =
+
+#---------------------------------------------------------------------------
+# Configuration options related to source browsing
+#---------------------------------------------------------------------------
+
+# 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.
+#
+# Note: To get rid of all source code in the generated output, make sure that
+# also VERBATIM_HEADERS is set to NO.
+# The default value is: NO.
+
+SOURCE_BROWSER = NO
+
+# Setting the INLINE_SOURCES tag to YES will include the body of functions,
+# classes and enums directly into the documentation.
+# The default value is: NO.
+
+INLINE_SOURCES = NO
+
+# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any
+# special comment blocks from generated source code fragments. Normal C, C++ and
+# Fortran comments will always remain visible.
+# The default value is: YES.
+
+STRIP_CODE_COMMENTS = YES
+
+# If the REFERENCED_BY_RELATION tag is set to YES then for each documented
+# function all documented functions referencing it will be listed.
+# The default value is: NO.
+
+REFERENCED_BY_RELATION = NO
+
+# If the REFERENCES_RELATION tag is set to YES then for each documented function
+# all documented entities called/used by that function will be listed.
+# The default value is: NO.
+
+REFERENCES_RELATION = NO
+
+# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set
+# to YES then the hyperlinks from functions in REFERENCES_RELATION and
+# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will
+# link to the documentation.
+# The default value is: YES.
+
+REFERENCES_LINK_SOURCE = YES
+
+# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the
+# source code will show a tooltip with additional information such as prototype,
+# brief description and links to the definition and documentation. Since this
+# will make the HTML file larger and loading of large files a bit slower, you
+# can opt to disable this feature.
+# The default value is: YES.
+# This tag requires that the tag SOURCE_BROWSER is set to YES.
+
+SOURCE_TOOLTIPS = YES
+
+# If the USE_HTAGS tag is set to YES then the references to source code will
+# point to the HTML generated by the htags(1) tool instead of doxygen built-in
+# source browser. The htags tool is part of GNU's global source tagging system
+# (see http://www.gnu.org/software/global/global.html). You will need version
+# 4.8.6 or higher.
+#
+# To use it do the following:
+# - Install the latest version of global
+# - Enable SOURCE_BROWSER and USE_HTAGS in the config file
+# - Make sure the INPUT points to the root of the source tree
+# - Run doxygen as normal
+#
+# Doxygen will invoke htags (and that will in turn invoke gtags), so these
+# tools must be available from the command line (i.e. in the search path).
+#
+# The result: instead of the source browser generated by doxygen, the links to
+# source code will now point to the output of htags.
+# The default value is: NO.
+# This tag requires that the tag SOURCE_BROWSER is set to YES.
+
+USE_HTAGS = NO
+
+# If the VERBATIM_HEADERS tag is set the YES 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.
+# See also: Section \class.
+# The default value is: YES.
+
+VERBATIM_HEADERS = YES
+
+# If the CLANG_ASSISTED_PARSING tag is set to YES then doxygen will use the
+# clang parser (see: http://clang.llvm.org/) for more accurate parsing at the
+# cost of reduced performance. This can be particularly helpful with template
+# rich C++ code for which doxygen's built-in parser lacks the necessary type
+# information.
+# Note: The availability of this option depends on whether or not doxygen was
+# generated with the -Duse-libclang=ON option for CMake.
+# The default value is: NO.
+
+CLANG_ASSISTED_PARSING = NO
+
+# If clang assisted parsing is enabled you can provide the compiler with command
+# line options that you would normally use when invoking the compiler. Note that
+# the include paths will already be set by doxygen for the files and directories
+# specified with INPUT and INCLUDE_PATH.
+# This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES.
+
+CLANG_OPTIONS =
+
+#---------------------------------------------------------------------------
+# 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.
+# The default value is: YES.
+
+ALPHABETICAL_INDEX = YES
+
+# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in
+# which the alphabetical index list will be split.
+# Minimum value: 1, maximum value: 20, default value: 5.
+# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
+
+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 a prefix (or a list of prefixes) that should be ignored
+# while generating the index headers.
+# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
+
+IGNORE_PREFIX =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the HTML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output
+# The default value is: YES.
+
+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.
+# The default directory is: html.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_OUTPUT = html
+
+# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each
+# generated HTML page (for example: .htm, .php, .asp).
+# The default value is: .html.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_FILE_EXTENSION = .html
+
+# The HTML_HEADER tag can be used to specify a user-defined HTML header file for
+# each generated HTML page. If the tag is left blank doxygen will generate a
+# standard header.
+#
+# To get valid HTML the header file that includes any scripts and style sheets
+# that doxygen needs, which is dependent on the configuration options used (e.g.
+# the setting GENERATE_TREEVIEW). It is highly recommended to start with a
+# default header using
+# doxygen -w html new_header.html new_footer.html new_stylesheet.css
+# YourConfigFile
+# and then modify the file new_header.html. See also section "Doxygen usage"
+# for information on how to generate the default header that doxygen normally
+# uses.
+# Note: The header is subject to change so you typically have to regenerate the
+# default header when upgrading to a newer version of doxygen. For a description
+# of the possible markers and block names see the documentation.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_HEADER =
+
+# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each
+# generated HTML page. If the tag is left blank doxygen will generate a standard
+# footer. See HTML_HEADER for more information on how to generate a default
+# footer and what special commands can be used inside the footer. See also
+# section "Doxygen usage" for information on how to generate the default footer
+# that doxygen normally uses.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_FOOTER =
+
+# 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 left blank doxygen will generate a default style sheet.
+# See also section "Doxygen usage" for information on how to generate the style
+# sheet that doxygen normally uses.
+# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as
+# it is more robust and this tag (HTML_STYLESHEET) will in the future become
+# obsolete.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_STYLESHEET =
+
+# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined
+# cascading style sheets that are included after the standard style sheets
+# created by doxygen. Using this option one can overrule certain style aspects.
+# This is preferred over using HTML_STYLESHEET since it does not replace the
+# standard style sheet and is therefore more robust against future updates.
+# Doxygen will copy the style sheet files to the output directory.
+# Note: The order of the extra style sheet files is of importance (e.g. the last
+# style sheet in the list overrules the setting of the previous ones in the
+# list). For an example see the documentation.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_EXTRA_STYLESHEET =
+
+# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or
+# other source files which should be copied to the HTML output directory. Note
+# that these files will be copied to the base HTML output directory. Use the
+# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these
+# files. In the HTML_STYLESHEET file, use the file name only. Also note that the
+# files will be copied as-is; there are no commands or markers available.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_EXTRA_FILES =
+
+# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen
+# will adjust the colors in the style sheet and background images according to
+# this color. Hue is specified as an angle on a colorwheel, see
+# http://en.wikipedia.org/wiki/Hue for more information. For instance the value
+# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300
+# purple, and 360 is red again.
+# Minimum value: 0, maximum value: 359, default value: 220.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE_HUE = 220
+
+# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors
+# in the HTML output. For a value of 0 the output will use grayscales only. A
+# value of 255 will produce the most vivid colors.
+# Minimum value: 0, maximum value: 255, default value: 100.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE_SAT = 100
+
+# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the
+# luminance component of the colors in the HTML output. Values below 100
+# gradually make the output lighter, whereas values above 100 make the output
+# darker. The value divided by 100 is the actual gamma applied, so 80 represents
+# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not
+# change the gamma.
+# Minimum value: 40, maximum value: 240, default value: 80.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE_GAMMA = 80
+
+# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML
+# page will contain the date and time when the page was generated. Setting this
+# to YES can help to show when doxygen was last run and thus if the
+# documentation is up to date.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_TIMESTAMP = NO
+
+# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML
+# documentation will contain sections that can be hidden and shown after the
+# page has loaded.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_DYNAMIC_SECTIONS = NO
+
+# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries
+# shown in the various tree structured indices initially; the user can expand
+# and collapse entries dynamically later on. Doxygen will expand the tree to
+# such a level that at most the specified number of entries are visible (unless
+# a fully collapsed tree already exceeds this amount). So setting the number of
+# entries 1 will produce a full collapsed tree by default. 0 is a special value
+# representing an infinite number of entries and will result in a full expanded
+# tree by default.
+# Minimum value: 0, maximum value: 9999, default value: 100.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_INDEX_NUM_ENTRIES = 100
+
+# If the GENERATE_DOCSET tag is set to YES, additional index files will be
+# generated that can be used as input for Apple's Xcode 3 integrated development
+# environment (see: http://developer.apple.com/tools/xcode/), introduced with
+# OSX 10.5 (Leopard). To create a documentation set, doxygen will generate a
+# Makefile in the HTML output directory. Running make will produce the docset in
+# that directory and running make install will install the docset in
+# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at
+# startup. See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html
+# for more information.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_DOCSET = NO
+
+# This tag determines the name of the docset feed. A documentation feed provides
+# an umbrella under which multiple documentation sets from a single provider
+# (such as a company or product suite) can be grouped.
+# The default value is: Doxygen generated docs.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_FEEDNAME = "Doxygen generated docs"
+
+# This tag specifies a string that should uniquely identify the documentation
+# set bundle. This should be a reverse domain-name style string, e.g.
+# com.mycompany.MyDocSet. Doxygen will append .docset to the name.
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_BUNDLE_ID = org.doxygen.Project
+
+# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify
+# the documentation publisher. This should be a reverse domain-name style
+# string, e.g. com.mycompany.MyDocSet.documentation.
+# The default value is: org.doxygen.Publisher.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_PUBLISHER_ID = org.doxygen.Publisher
+
+# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher.
+# The default value is: Publisher.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_PUBLISHER_NAME = Publisher
+
+# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three
+# additional HTML index files: index.hhp, index.hhc, and index.hhk. The
+# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop
+# (see: http://www.microsoft.com/en-us/download/details.aspx?id=21138) on
+# Windows.
+#
+# The HTML Help Workshop contains a compiler that can convert all HTML output
+# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML
+# files are now used as the Windows 98 help format, and will replace the old
+# Windows help format (.hlp) on all Windows platforms in the future. Compressed
+# HTML files also contain an index, a table of contents, and you can search for
+# words in the documentation. The HTML workshop also contains a viewer for
+# compressed HTML files.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_HTMLHELP = NO
+
+# The CHM_FILE tag can be used to specify the file name of the resulting .chm
+# file. You can add a path in front of the file if the result should not be
+# written to the html output directory.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+CHM_FILE =
+
+# The HHC_LOCATION tag can be used to specify the location (absolute path
+# including file name) of the HTML help compiler (hhc.exe). If non-empty,
+# doxygen will try to run the HTML help compiler on the generated index.hhp.
+# The file has to be specified with full path.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+HHC_LOCATION =
+
+# 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).
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+GENERATE_CHI = NO
+
+# The CHM_INDEX_ENCODING is used to encode HtmlHelp index (hhk), content (hhc)
+# and project file content.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+CHM_INDEX_ENCODING =
+
+# 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. Furthermore it
+# enables the Previous and Next buttons.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+BINARY_TOC = NO
+
+# The TOC_EXPAND flag can be set to YES to add extra items for group members to
+# the table of contents of the HTML help documentation and to the tree view.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+TOC_EXPAND = NO
+
+# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and
+# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that
+# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help
+# (.qch) of the generated HTML documentation.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_QHP = NO
+
+# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify
+# the file name of the resulting .qch file. The path specified is relative to
+# the HTML output folder.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QCH_FILE =
+
+# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help
+# Project output. For more information please see Qt Help Project / Namespace
+# (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#namespace).
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_NAMESPACE = org.doxygen.Project
+
+# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt
+# Help Project output. For more information please see Qt Help Project / Virtual
+# Folders (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#virtual-
+# folders).
+# The default value is: doc.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_VIRTUAL_FOLDER = doc
+
+# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom
+# filter to add. For more information please see Qt Help Project / Custom
+# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom-
+# filters).
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_CUST_FILTER_NAME =
+
+# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the
+# custom filter to add. For more information please see Qt Help Project / Custom
+# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom-
+# filters).
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_CUST_FILTER_ATTRS =
+
+# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this
+# project's filter section matches. Qt Help Project / Filter Attributes (see:
+# http://qt-project.org/doc/qt-4.8/qthelpproject.html#filter-attributes).
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_SECT_FILTER_ATTRS =
+
+# The QHG_LOCATION tag can be used to specify the location of Qt's
+# qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the
+# generated .qhp file.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHG_LOCATION =
+
+# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be
+# generated, together with the HTML files, they form an Eclipse help plugin. To
+# install this plugin and make it available under the help contents menu in
+# Eclipse, the contents of the directory containing the HTML and XML files needs
+# to be copied into the plugins directory of eclipse. The name of the directory
+# within the plugins directory should be the same as the ECLIPSE_DOC_ID value.
+# After copying Eclipse needs to be restarted before the help appears.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_ECLIPSEHELP = NO
+
+# A unique identifier for the Eclipse help plugin. When installing the plugin
+# the directory name containing the HTML and XML files should also have this
+# name. Each documentation set should have its own identifier.
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES.
+
+ECLIPSE_DOC_ID = org.doxygen.Project
+
+# If you want full control over the layout of the generated HTML pages it might
+# be necessary to disable the index and replace it with your own. The
+# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top
+# of each HTML page. A value of NO enables the index and the value YES disables
+# it. Since the tabs in the index contain the same information as the navigation
+# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+DISABLE_INDEX = NO
+
+# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index
+# structure should be generated to display hierarchical information. If the tag
+# value 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, DHTML, CSS and frames is required
+# (i.e. any modern browser). Windows users are probably better off using the
+# HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can
+# further fine-tune the look of the index. As an example, the default style
+# sheet generated by doxygen has an example that shows how to put an image at
+# the root of the tree instead of the PROJECT_NAME. Since the tree basically has
+# the same information as the tab index, you could consider setting
+# DISABLE_INDEX to YES when enabling this option.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_TREEVIEW = NO
+
+# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that
+# doxygen will group on one line in the generated HTML documentation.
+#
+# Note that a value of 0 will completely suppress the enum values from appearing
+# in the overview section.
+# Minimum value: 0, maximum value: 20, default value: 4.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+ENUM_VALUES_PER_LINE = 4
+
+# 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.
+# Minimum value: 0, maximum value: 1500, default value: 250.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+TREEVIEW_WIDTH = 250
+
+# If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to
+# external symbols imported via tag files in a separate window.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+EXT_LINKS_IN_WINDOW = NO
+
+# Use this tag to change the font size of LaTeX formulas included as images in
+# the HTML documentation. When you change the font size after a successful
+# doxygen run you need to manually remove any form_*.png images from the HTML
+# output directory to force them to be regenerated.
+# Minimum value: 8, maximum value: 50, default value: 10.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+FORMULA_FONTSIZE = 10
+
+# Use the FORMULA_TRANPARENT tag to determine whether or not the images
+# generated for formulas are transparent PNGs. Transparent PNGs are not
+# supported properly for IE 6.0, but are supported on all modern browsers.
+#
+# Note that when changing this option you need to delete any form_*.png files in
+# the HTML output directory before the changes have effect.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+FORMULA_TRANSPARENT = YES
+
+# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see
+# http://www.mathjax.org) which uses client side Javascript for the rendering
+# instead of using pre-rendered bitmaps. Use this if you do not have LaTeX
+# installed or if you want to formulas look prettier in the HTML output. When
+# enabled you may also need to install MathJax separately and configure the path
+# to it using the MATHJAX_RELPATH option.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+USE_MATHJAX = NO
+
+# When MathJax is enabled you can set the default output format to be used for
+# the MathJax output. See the MathJax site (see:
+# http://docs.mathjax.org/en/latest/output.html) for more details.
+# Possible values are: HTML-CSS (which is slower, but has the best
+# compatibility), NativeMML (i.e. MathML) and SVG.
+# The default value is: HTML-CSS.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_FORMAT = HTML-CSS
+
+# When MathJax is enabled you need to specify the location relative to the HTML
+# output directory using the MATHJAX_RELPATH option. The destination directory
+# should contain the MathJax.js script. For instance, if the mathjax directory
+# is located at the same level as the HTML output directory, then
+# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax
+# Content Delivery Network so you can quickly see the result without installing
+# MathJax. However, it is strongly recommended to install a local copy of
+# MathJax from http://www.mathjax.org before deployment.
+# The default value is: http://cdn.mathjax.org/mathjax/latest.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest
+
+# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax
+# extension names that should be enabled during MathJax rendering. For example
+# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_EXTENSIONS =
+
+# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces
+# of code that will be used on startup of the MathJax code. See the MathJax site
+# (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an
+# example see the documentation.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_CODEFILE =
+
+# When the SEARCHENGINE tag is enabled doxygen will generate a search box for
+# the HTML output. The underlying search engine uses javascript and DHTML and
+# should work on any modern browser. Note that when using HTML help
+# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET)
+# there is already a search function so this one should typically be disabled.
+# For large projects the javascript based search engine can be slow, then
+# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to
+# search using the keyboard; to jump to the search box use + S
+# (what the is depends on the OS and browser, but it is typically
+# , /, or both). Inside the search box use the to jump into the search results window, the results can be navigated
+# using the . Press to select an item or to cancel
+# the search. The filter options can be selected when the cursor is inside the
+# search box by pressing +. Also here use the
+# to select a filter and or to activate or cancel the filter
+# option.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+SEARCHENGINE = YES
+
+# When the SERVER_BASED_SEARCH tag is enabled the search engine will be
+# implemented using a web server instead of a web client using Javascript. There
+# are two flavors of web server based searching depending on the EXTERNAL_SEARCH
+# setting. When disabled, doxygen will generate a PHP script for searching and
+# an index file used by the script. When EXTERNAL_SEARCH is enabled the indexing
+# and searching needs to be provided by external tools. See the section
+# "External Indexing and Searching" for details.
+# The default value is: NO.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SERVER_BASED_SEARCH = NO
+
+# When EXTERNAL_SEARCH tag is enabled doxygen will no longer generate the PHP
+# script for searching. Instead the search results are written to an XML file
+# which needs to be processed by an external indexer. Doxygen will invoke an
+# external search engine pointed to by the SEARCHENGINE_URL option to obtain the
+# search results.
+#
+# Doxygen ships with an example indexer (doxyindexer) and search engine
+# (doxysearch.cgi) which are based on the open source search engine library
+# Xapian (see: http://xapian.org/).
+#
+# See the section "External Indexing and Searching" for details.
+# The default value is: NO.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTERNAL_SEARCH = NO
+
+# The SEARCHENGINE_URL should point to a search engine hosted by a web server
+# which will return the search results when EXTERNAL_SEARCH is enabled.
+#
+# Doxygen ships with an example indexer (doxyindexer) and search engine
+# (doxysearch.cgi) which are based on the open source search engine library
+# Xapian (see: http://xapian.org/). See the section "External Indexing and
+# Searching" for details.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SEARCHENGINE_URL =
+
+# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the unindexed
+# search data is written to a file for indexing by an external tool. With the
+# SEARCHDATA_FILE tag the name of this file can be specified.
+# The default file is: searchdata.xml.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SEARCHDATA_FILE = searchdata.xml
+
+# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the
+# EXTERNAL_SEARCH_ID tag can be used as an identifier for the project. This is
+# useful in combination with EXTRA_SEARCH_MAPPINGS to search through multiple
+# projects and redirect the results back to the right project.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTERNAL_SEARCH_ID =
+
+# The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through doxygen
+# projects other than the one defined by this configuration file, but that are
+# all added to the same external search index. Each project needs to have a
+# unique id set via EXTERNAL_SEARCH_ID. The search mapping then maps the id of
+# to a relative location where the documentation can be found. The format is:
+# EXTRA_SEARCH_MAPPINGS = tagname1=loc1 tagname2=loc2 ...
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTRA_SEARCH_MAPPINGS =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_LATEX tag is set to YES, doxygen will generate LaTeX output.
+# The default value is: YES.
+
+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.
+# The default directory is: latex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_OUTPUT = latex
+
+# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
+# invoked.
+#
+# Note that when enabling USE_PDFLATEX this option is only used for generating
+# bitmaps for formulas in the HTML output, but not in the Makefile that is
+# written to the output directory.
+# The default file is: latex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_CMD_NAME = latex
+
+# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to generate
+# index for LaTeX.
+# The default file is: makeindex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+MAKEINDEX_CMD_NAME = makeindex
+
+# 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.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+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 (210 x 297 mm), letter (8.5 x 11 inches), legal (8.5 x
+# 14 inches) and executive (7.25 x 10.5 inches).
+# The default value is: a4.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+PAPER_TYPE = a4
+
+# The EXTRA_PACKAGES tag can be used to specify one or more LaTeX package names
+# that should be included in the LaTeX output. The package can be specified just
+# by its name or with the correct syntax as to be used with the LaTeX
+# \usepackage command. To get the times font for instance you can specify :
+# EXTRA_PACKAGES=times or EXTRA_PACKAGES={times}
+# To use the option intlimits with the amsmath package you can specify:
+# EXTRA_PACKAGES=[intlimits]{amsmath}
+# If left blank no extra packages will be included.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+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. See
+# section "Doxygen usage" for information on how to let doxygen write the
+# default header to a separate file.
+#
+# Note: Only use a user-defined header if you know what you are doing! The
+# following commands have a special meaning inside the header: $title,
+# $datetime, $date, $doxygenversion, $projectname, $projectnumber,
+# $projectbrief, $projectlogo. Doxygen will replace $title with the empty
+# string, for the replacement values of the other commands the user is referred
+# to HTML_HEADER.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_HEADER =
+
+# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for the
+# generated LaTeX document. The footer should contain everything after the last
+# chapter. If it is left blank doxygen will generate a standard footer. See
+# LATEX_HEADER for more information on how to generate a default footer and what
+# special commands can be used inside the footer.
+#
+# Note: Only use a user-defined footer if you know what you are doing!
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_FOOTER =
+
+# The LATEX_EXTRA_STYLESHEET tag can be used to specify additional user-defined
+# LaTeX style sheets that are included after the standard style sheets created
+# by doxygen. Using this option one can overrule certain style aspects. Doxygen
+# will copy the style sheet files to the output directory.
+# Note: The order of the extra style sheet files is of importance (e.g. the last
+# style sheet in the list overrules the setting of the previous ones in the
+# list).
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_EXTRA_STYLESHEET =
+
+# The LATEX_EXTRA_FILES tag can be used to specify one or more extra images or
+# other source files which should be copied to the LATEX_OUTPUT output
+# directory. Note that the files will be copied as-is; there are no commands or
+# markers available.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_EXTRA_FILES =
+
+# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated is
+# prepared for conversion to PDF (using ps2pdf or pdflatex). 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.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+PDF_HYPERLINKS = YES
+
+# If the USE_PDFLATEX tag is set to YES, doxygen will use pdflatex to generate
+# the PDF file directly from the LaTeX files. Set this option to YES, to get a
+# higher quality PDF documentation.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+USE_PDFLATEX = YES
+
+# 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.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_BATCHMODE = NO
+
+# If the LATEX_HIDE_INDICES tag is set to YES then doxygen will not include the
+# index chapters (such as File Index, Compound Index, etc.) in the output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_HIDE_INDICES = NO
+
+# If the LATEX_SOURCE_CODE tag is set to YES then doxygen will include source
+# code with syntax highlighting in the LaTeX output.
+#
+# Note that which sources are shown also depends on other settings such as
+# SOURCE_BROWSER.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_SOURCE_CODE = NO
+
+# The LATEX_BIB_STYLE tag can be used to specify the style to use for the
+# bibliography, e.g. plainnat, or ieeetr. See
+# http://en.wikipedia.org/wiki/BibTeX and \cite for more info.
+# The default value is: plain.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_BIB_STYLE = plain
+
+# If the LATEX_TIMESTAMP tag is set to YES then the footer of each generated
+# page will contain the date and time when the page was generated. Setting this
+# to NO can help when comparing the output of multiple runs.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_TIMESTAMP = 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 optimized for Word 97 and may not look too pretty with other RTF
+# readers/editors.
+# The default value is: NO.
+
+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.
+# The default directory is: rtf.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_OUTPUT = rtf
+
+# 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.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+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 some other Word compatible readers that support those
+# fields.
+#
+# Note: WordPad (write) and others do not support links.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_HYPERLINKS = NO
+
+# Load stylesheet definitions from file. Syntax is similar to doxygen's config
+# file, i.e. a series of assignments. You only have to provide replacements,
+# missing definitions are set to their default value.
+#
+# See also section "Doxygen usage" for information on how to generate the
+# default style sheet that doxygen normally uses.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_STYLESHEET_FILE =
+
+# Set optional variables used in the generation of an RTF document. Syntax is
+# similar to doxygen's config file. A template extensions file can be generated
+# using doxygen -e rtf extensionFile.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_EXTENSIONS_FILE =
+
+# If the RTF_SOURCE_CODE tag is set to YES then doxygen will include source code
+# with syntax highlighting in the RTF output.
+#
+# Note that which sources are shown also depends on other settings such as
+# SOURCE_BROWSER.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_SOURCE_CODE = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the man page output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_MAN tag is set to YES, doxygen will generate man pages for
+# classes and files.
+# The default value is: NO.
+
+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. A directory man3 will be created inside the directory specified by
+# MAN_OUTPUT.
+# The default directory is: man.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_OUTPUT = man
+
+# The MAN_EXTENSION tag determines the extension that is added to the generated
+# man pages. In case the manual section does not start with a number, the number
+# 3 is prepended. The dot (.) at the beginning of the MAN_EXTENSION tag is
+# optional.
+# The default value is: .3.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_EXTENSION = .3
+
+# The MAN_SUBDIR tag determines the name of the directory created within
+# MAN_OUTPUT in which the man pages are placed. If defaults to man followed by
+# MAN_EXTENSION with the initial . removed.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_SUBDIR =
+
+# 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 value is: NO.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+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.
+# The default value is: NO.
+
+GENERATE_XML = NO
+
+# The XML_OUTPUT tag is used to specify where the XML pages will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: xml.
+# This tag requires that the tag GENERATE_XML is set to YES.
+
+XML_OUTPUT = xml
+
+# If the XML_PROGRAMLISTING tag is set to YES, doxygen will dump the program
+# listings (including syntax highlighting and cross-referencing information) to
+# the XML output. Note that enabling this will significantly increase the size
+# of the XML output.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_XML is set to YES.
+
+XML_PROGRAMLISTING = YES
+
+#---------------------------------------------------------------------------
+# Configuration options related to the DOCBOOK output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_DOCBOOK tag is set to YES, doxygen will generate Docbook files
+# that can be used to generate PDF.
+# The default value is: NO.
+
+GENERATE_DOCBOOK = NO
+
+# The DOCBOOK_OUTPUT tag is used to specify where the Docbook pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be put in
+# front of it.
+# The default directory is: docbook.
+# This tag requires that the tag GENERATE_DOCBOOK is set to YES.
+
+DOCBOOK_OUTPUT = docbook
+
+# If the DOCBOOK_PROGRAMLISTING tag is set to YES, doxygen will include the
+# program listings (including syntax highlighting and cross-referencing
+# information) to the DOCBOOK output. Note that enabling this will significantly
+# increase the size of the DOCBOOK output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_DOCBOOK is set to YES.
+
+DOCBOOK_PROGRAMLISTING = NO
+
+#---------------------------------------------------------------------------
+# Configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_AUTOGEN_DEF tag is set to YES, doxygen will generate an
+# AutoGen Definitions (see http://autogen.sf.net) file that captures the
+# structure of the code including all documentation. Note that this feature is
+# still experimental and incomplete at the moment.
+# The default value is: NO.
+
+GENERATE_AUTOGEN_DEF = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_PERLMOD tag is set to YES, doxygen will generate a Perl module
+# file that captures the structure of the code including all documentation.
+#
+# Note that this feature is still experimental and incomplete at the moment.
+# The default value is: NO.
+
+GENERATE_PERLMOD = NO
+
+# If the PERLMOD_LATEX tag is set to YES, doxygen will generate the necessary
+# Makefile rules, Perl scripts and LaTeX code to be able to generate PDF and DVI
+# output from the Perl module output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
+
+PERLMOD_LATEX = NO
+
+# If the PERLMOD_PRETTY tag is set to YES, the Perl module output will be nicely
+# formatted so it can be parsed by a human reader. This is useful if you want to
+# understand what is going on. On the other hand, if this tag is set to NO, the
+# size of the Perl module output will be much smaller and Perl will parse it
+# just the same.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
+
+PERLMOD_PRETTY = YES
+
+# The names of the make variables in the generated doxyrules.make file are
+# prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. This is useful
+# so different doxyrules.make files included by the same Makefile don't
+# overwrite each other's variables.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
+
+PERLMOD_MAKEVAR_PREFIX =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor
+#---------------------------------------------------------------------------
+
+# If the ENABLE_PREPROCESSING tag is set to YES, doxygen will evaluate all
+# C-preprocessor directives found in the sources and include files.
+# The default value is: YES.
+
+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, only conditional compilation will be
+# performed. Macro expansion can be done in a controlled way by setting
+# EXPAND_ONLY_PREDEF to YES.
+# The default value is: NO.
+# This tag requires that the tag ENABLE_PREPROCESSING is set 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_DEFINED tags.
+# The default value is: NO.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+EXPAND_ONLY_PREDEF = NO
+
+# If the SEARCH_INCLUDES tag is set to YES, the include files in the
+# INCLUDE_PATH will be searched if a #include is found.
+# The default value is: YES.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+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.
+# This tag requires that the tag SEARCH_INCLUDES is set to YES.
+
+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.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+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 e.g.
+# 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. To prevent a macro definition from being undefined via #undef or
+# recursively expanded use the := operator instead of the = operator.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+PREDEFINED =
+
+# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF 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 that overrules the
+# definition found in the source code.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+EXPAND_AS_DEFINED =
+
+# If the SKIP_FUNCTION_MACROS tag is set to YES then doxygen's preprocessor will
+# remove all references to function-like macros that are alone on a line, have
+# an all uppercase name, and do not end with a semicolon. Such function macros
+# are typically used for boiler-plate code, and will confuse the parser if not
+# removed.
+# The default value is: YES.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+SKIP_FUNCTION_MACROS = YES
+
+#---------------------------------------------------------------------------
+# Configuration options related to external references
+#---------------------------------------------------------------------------
+
+# The TAGFILES tag can be used to specify one or more tag files. For each tag
+# file the location of the external documentation should be added. The format of
+# a tag file without this location is as follows:
+# TAGFILES = file1 file2 ...
+# Adding location for the tag files is done as follows:
+# TAGFILES = file1=loc1 "file2 = loc2" ...
+# where loc1 and loc2 can be relative or absolute paths or URLs. See the
+# section "Linking to external documentation" for more information about the use
+# of tag files.
+# Note: Each tag file must have a unique name (where the name does NOT include
+# the path). If a tag file is not located in the directory in which doxygen is
+# run, you must also specify the path to the tagfile here.
+
+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. See section "Linking to
+# external documentation" for more information about the usage of tag files.
+
+GENERATE_TAGFILE =
+
+# If the ALLEXTERNALS tag is set to YES, all external class will be listed in
+# the class index. If set to NO, only the inherited external classes will be
+# listed.
+# The default value is: NO.
+
+ALLEXTERNALS = NO
+
+# If the EXTERNAL_GROUPS tag is set to YES, all external groups will be listed
+# in the modules index. If set to NO, only the current project's groups will be
+# listed.
+# The default value is: YES.
+
+EXTERNAL_GROUPS = YES
+
+# If the EXTERNAL_PAGES tag is set to YES, all external pages will be listed in
+# the related pages index. If set to NO, only the current project's pages will
+# be listed.
+# The default value is: YES.
+
+EXTERNAL_PAGES = YES
+
+# The PERL_PATH should be the absolute path and name of the perl script
+# interpreter (i.e. the result of 'which perl').
+# The default file (with absolute path) is: /usr/bin/perl.
+
+PERL_PATH = /usr/bin/perl
+
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+
+# If the CLASS_DIAGRAMS tag is set to YES, 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. Note that this option also works with HAVE_DOT
+# disabled, but it is recommended to install and use dot, since it yields more
+# powerful graphs.
+# The default value is: YES.
+
+CLASS_DIAGRAMS = YES
+
+# You can define message sequence charts within doxygen comments using the \msc
+# command. Doxygen will then run the mscgen tool (see:
+# http://www.mcternan.me.uk/mscgen/)) to produce the chart and insert it in the
+# documentation. The MSCGEN_PATH tag allows you to specify the directory where
+# the mscgen tool resides. If left empty the tool is assumed to be found in the
+# default search path.
+
+MSCGEN_PATH =
+
+# You can include diagrams made with dia in doxygen documentation. Doxygen will
+# then run dia to produce the diagram and insert it in the documentation. The
+# DIA_PATH tag allows you to specify the directory where the dia binary resides.
+# If left empty dia is assumed to be found in the default search path.
+
+DIA_PATH =
+
+# If set to YES the inheritance and collaboration graphs will hide inheritance
+# and usage relations if the target is undocumented or is not a class.
+# The default value is: YES.
+
+HIDE_UNDOC_RELATIONS = YES
+
+# 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 (see:
+# http://www.graphviz.org/), 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 value is: YES.
+
+HAVE_DOT = YES
+
+# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is allowed
+# to run in parallel. When set to 0 doxygen will base this on the number of
+# processors available in the system. You can set it explicitly to a value
+# larger than 0 to get control over the balance between CPU load and processing
+# speed.
+# Minimum value: 0, maximum value: 32, default value: 0.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_NUM_THREADS = 0
+
+# When you want a differently looking font in the dot files that doxygen
+# generates you can specify the font name using DOT_FONTNAME. You need to make
+# sure dot is able to find the font, which can be done by putting it in a
+# standard location or by setting the DOTFONTPATH environment variable or by
+# setting DOT_FONTPATH to the directory containing the font.
+# The default value is: Helvetica.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_FONTNAME = Helvetica
+
+# The DOT_FONTSIZE tag can be used to set the size (in points) of the font of
+# dot graphs.
+# Minimum value: 4, maximum value: 24, default value: 10.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_FONTSIZE = 10
+
+# By default doxygen will tell dot to use the default font as specified with
+# DOT_FONTNAME. If you specify a different font using DOT_FONTNAME you can set
+# the path where dot can find it using this tag.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_FONTPATH =
+
+# If the CLASS_GRAPH tag is 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 CLASS_DIAGRAMS tag to NO.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+CLASS_GRAPH = YES
+
+# If the COLLABORATION_GRAPH tag is 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.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+COLLABORATION_GRAPH = YES
+
+# If the GROUP_GRAPHS tag is set to YES then doxygen will generate a graph for
+# groups, showing the direct groups dependencies.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+GROUP_GRAPHS = YES
+
+# If the UML_LOOK tag is set to YES, doxygen will generate inheritance and
+# collaboration diagrams in a style similar to the OMG's Unified Modeling
+# Language.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+UML_LOOK = NO
+
+# If the UML_LOOK tag is enabled, the fields and methods are shown inside the
+# class node. If there are many fields or methods and many nodes the graph may
+# become too big to be useful. The UML_LIMIT_NUM_FIELDS threshold limits the
+# number of items for each type to make the size more manageable. Set this to 0
+# for no limit. Note that the threshold may be exceeded by 50% before the limit
+# is enforced. So when you set the threshold to 10, up to 15 fields may appear,
+# but if the number exceeds 15, the total amount of fields shown is limited to
+# 10.
+# Minimum value: 0, maximum value: 100, default value: 10.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+UML_LIMIT_NUM_FIELDS = 10
+
+# If the TEMPLATE_RELATIONS tag is set to YES then the inheritance and
+# collaboration graphs will show the relations between templates and their
+# instances.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+TEMPLATE_RELATIONS = NO
+
+# If the INCLUDE_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES 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.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+INCLUDE_GRAPH = YES
+
+# If the INCLUDED_BY_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES 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.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+INCLUDED_BY_GRAPH = YES
+
+# If the CALL_GRAPH tag is set to YES then doxygen will generate a call
+# dependency graph for every global function or class method.
+#
+# Note that enabling this option will significantly increase the time of a run.
+# So in most cases it will be better to enable call graphs for selected
+# functions only using the \callgraph command. Disabling a call graph can be
+# accomplished by means of the command \hidecallgraph.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+CALL_GRAPH = NO
+
+# If the CALLER_GRAPH tag is set to YES then doxygen will generate a caller
+# dependency graph for every global function or class method.
+#
+# Note that enabling this option will significantly increase the time of a run.
+# So in most cases it will be better to enable caller graphs for selected
+# functions only using the \callergraph command. Disabling a caller graph can be
+# accomplished by means of the command \hidecallergraph.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+CALLER_GRAPH = NO
+
+# If the GRAPHICAL_HIERARCHY tag is set to YES then doxygen will graphical
+# hierarchy of all classes instead of a textual one.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+GRAPHICAL_HIERARCHY = YES
+
+# If the DIRECTORY_GRAPH tag is set to YES then doxygen will show the
+# dependencies a directory has on other directories in a graphical way. The
+# dependency relations are determined by the #include relations between the
+# files in the directories.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DIRECTORY_GRAPH = YES
+
+# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
+# generated by dot. For an explanation of the image formats see the section
+# output formats in the documentation of the dot tool (Graphviz (see:
+# http://www.graphviz.org/)).
+# Note: If you choose svg you need to set HTML_FILE_EXTENSION to xhtml in order
+# to make the SVG files visible in IE 9+ (other browsers do not have this
+# requirement).
+# Possible values are: png, png:cairo, png:cairo:cairo, png:cairo:gd, png:gd,
+# png:gd:gd, jpg, jpg:cairo, jpg:cairo:gd, jpg:gd, jpg:gd:gd, gif, gif:cairo,
+# gif:cairo:gd, gif:gd, gif:gd:gd, svg, png:gd, png:gd:gd, png:cairo,
+# png:cairo:gd, png:cairo:cairo, png:cairo:gdiplus, png:gdiplus and
+# png:gdiplus:gdiplus.
+# The default value is: png.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_IMAGE_FORMAT = png
+
+# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to
+# enable generation of interactive SVG images that allow zooming and panning.
+#
+# Note that this requires a modern browser other than Internet Explorer. Tested
+# and working are Firefox, Chrome, Safari, and Opera.
+# Note: For IE 9+ you need to set HTML_FILE_EXTENSION to xhtml in order to make
+# the SVG files visible. Older versions of IE do not have SVG support.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+INTERACTIVE_SVG = NO
+
+# The DOT_PATH tag 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 in the path.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+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).
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOTFILE_DIRS =
+
+# The MSCFILE_DIRS tag can be used to specify one or more directories that
+# contain msc files that are included in the documentation (see the \mscfile
+# command).
+
+MSCFILE_DIRS =
+
+# The DIAFILE_DIRS tag can be used to specify one or more directories that
+# contain dia files that are included in the documentation (see the \diafile
+# command).
+
+DIAFILE_DIRS =
+
+# When using plantuml, the PLANTUML_JAR_PATH tag should be used to specify the
+# path where java can find the plantuml.jar file. If left blank, it is assumed
+# PlantUML is not used or called during a preprocessing step. Doxygen will
+# generate a warning when it encounters a \startuml command in this case and
+# will not generate output for the diagram.
+
+PLANTUML_JAR_PATH =
+
+# When using plantuml, the PLANTUML_CFG_FILE tag can be used to specify a
+# configuration file for plantuml.
+
+PLANTUML_CFG_FILE =
+
+# When using plantuml, the specified paths are searched for files specified by
+# the !include statement in a plantuml block.
+
+PLANTUML_INCLUDE_PATH =
+
+# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of nodes
+# that will be shown in the graph. If the number of nodes in a graph becomes
+# larger than this value, doxygen will truncate the graph, which is visualized
+# by representing a node as a red box. Note that doxygen if the number of direct
+# children of the root node in a graph is already larger than
+# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note that
+# the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.
+# Minimum value: 0, maximum value: 10000, default value: 50.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_GRAPH_MAX_NODES = 50
+
+# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the graphs
+# generated by dot. A depth value of 3 means that only nodes reachable from the
+# root by following a path via at most 3 edges will be shown. Nodes that lay
+# further from the root node will be omitted. Note that setting this option to 1
+# or 2 may greatly reduce the computation time needed for large code bases. Also
+# note that the size of a graph can be further restricted by
+# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.
+# Minimum value: 0, maximum value: 1000, default value: 0.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+MAX_DOT_GRAPH_DEPTH = 0
+
+# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent
+# background. This is disabled by default, because dot on Windows does not seem
+# to support this out of the box.
+#
+# Warning: Depending on the platform used, enabling this option may lead to
+# badly anti-aliased labels on the edges of a graph (i.e. they become hard to
+# read).
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_TRANSPARENT = NO
+
+# Set the DOT_MULTI_TARGETS tag to YES to allow dot to generate multiple output
+# files in one run (i.e. multiple -o and -T options on the command line). This
+# makes dot run faster, but since only newer versions of dot (>1.8.10) support
+# this, this feature is disabled by default.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_MULTI_TARGETS = NO
+
+# If the GENERATE_LEGEND tag is set to YES doxygen will generate a legend page
+# explaining the meaning of the various boxes and arrows in the dot generated
+# graphs.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+GENERATE_LEGEND = YES
+
+# If the DOT_CLEANUP tag is set to YES, doxygen will remove the intermediate dot
+# files that are used to generate the various graphs.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_CLEANUP = YES
diff --git a/apps/mfa/fsw/src/mfa_app.c b/apps/mfa/fsw/src/mfa_app.c
new file mode 100644
index 000000000..9bae81cfa
--- /dev/null
+++ b/apps/mfa/fsw/src/mfa_app.c
@@ -0,0 +1,395 @@
+/**
+ * @file mfa_app.c
+ * @author Shahed Rahim (srahim@windhoverlabs.com)
+ * @brief This is the Main File for MFA App
+ * @version 1.0.0
+ * @date 2022-05-13
+ *
+ * @copyright Copyright (c) 2022
+ *
+ */
+#include "cfe.h"
+#include "mfa_app.h"
+#include "mfa_events.h"
+
+#include "mfa_platform_cfg.h"
+#include "mfa_mission_cfg.h"
+#include "mfa_msgids.h"
+
+#include "mfa_msgs.h"
+#include
+
+MFA_AppData_t MFA_AppData;
+
+uint32 MFA_Register_App_CFE_ES(void) {
+ int32 status = 0;
+ uint32 exitStatus = CFE_ES_APP_RUN;
+
+ /*Register the app*/
+ status = CFE_ES_RegisterApp();
+ if (status != CFE_SUCCESS) {
+ (void) CFE_ES_WriteToSysLog("MFA - Failed to register the app (0x%08X)\n", (unsigned int) status);
+ exitStatus = CFE_ES_APP_ERROR;
+ }
+
+ return exitStatus;
+}
+
+uint32 MFA_InitEvents(void) {
+ int32 status = 0;
+ uint32 exitStatus = CFE_ES_APP_RUN;
+
+ /*Register the app with EVS */
+ status = CFE_EVS_Register(0, 0, CFE_EVS_BINARY_FILTER);
+ if (status != CFE_SUCCESS) {
+ (void) CFE_ES_WriteToSysLog("MFA - Failed to register with EVS (0x%08X)\n", (unsigned int) status);
+ exitStatus = CFE_ES_APP_ERROR;
+ }
+
+ return exitStatus;
+}
+uint32 MFA_InitData(void) {
+ int32 status;
+ uint32 exitStatus = CFE_ES_APP_RUN;
+ CFE_SB_InitMsg(
+ &MFA_AppData.HkTlm,
+ MFA_HK_TLM_MID,
+ sizeof(MFA_AppData.HkTlm),
+ TRUE);
+ return exitStatus;
+}
+
+uint32 MFA_InitPipes(void) {
+ int32 status;
+ uint32 exitStatus = CFE_ES_APP_RUN;
+
+ status = CFE_SB_CreatePipe(
+ &MFA_AppData.SchPipeId,
+ MFA_SCH_PIPE_DEPTH,
+ MFA_SCH_PIPE_NAME);
+
+ if (CFE_SUCCESS != status) {
+ (void) CFE_EVS_SendEvent(
+ MFA_INIT_ERR_EID,
+ CFE_EVS_ERROR,
+ "Failed to create sch pipe (0x%08X)", (unsigned int)status
+ );
+ exitStatus = CFE_ES_APP_ERROR;
+
+ } else {
+ status = CFE_SB_SubscribeEx(
+ MFA_CMD_MID,
+ MFA_AppData.SchPipeId,
+ CFE_SB_Default_Qos,
+ MFA_SCH_PIPE_WAKEUP_RESERVED);
+
+ if (status != CFE_SUCCESS) {
+ (void) CFE_EVS_SendEvent(MFA_INIT_ERR_EID, CFE_EVS_ERROR,
+ "Sch Pipe failed to subscribe to MFA_CMD_MID, (0x%08X)",
+ (unsigned int) status);
+ }
+
+ status = CFE_SB_SubscribeEx(
+ MFA_WAKEUP_MID,
+ MFA_AppData.SchPipeId,
+ CFE_SB_Default_Qos,
+ MFA_SCH_PIPE_WAKEUP_RESERVED);
+
+ if (status != CFE_SUCCESS) {
+ (void) CFE_EVS_SendEvent(MFA_INIT_ERR_EID, CFE_EVS_ERROR,
+ "Sch Pipe failed to subscribe to MFA_WAKEUP_MID, (0x%08X)",
+ (unsigned int) status);
+ }
+
+ status = CFE_SB_SubscribeEx(
+ MFA_SEND_HK_MID,
+ MFA_AppData.SchPipeId,
+ CFE_SB_Default_Qos,
+ MFA_SCH_PIPE_WAKEUP_RESERVED);
+
+ if (status != CFE_SUCCESS) {
+ (void) CFE_EVS_SendEvent(MFA_INIT_ERR_EID, CFE_EVS_ERROR,
+ "Sch Pipe failed to subscribe to MFA_SEND_HK_MID, (0x%08X)",
+ (unsigned int) status);
+ }
+
+ }
+ return exitStatus;
+}
+
+
+uint32 MFA_InitTables(void) {
+ int32 status;
+ uint32 exitStatus = CFE_ES_APP_RUN;
+ /* Register Config table */
+ status = CFE_TBL_Register(&MFA_AppData.ConfigTblHdl,
+ MFA_CONFIG_TABLENAME,
+ sizeof(MFA_ConfigTbl_t),
+ CFE_TBL_OPT_DEFAULT,
+ 0);
+ if(status != CFE_SUCCESS)
+ {
+ (void) CFE_EVS_SendEvent(MFA_INIT_ERR_EID, CFE_EVS_ERROR,
+ "Failed to register Config table (0x%08X)",
+ (unsigned int)status);
+ exitStatus = CFE_ES_APP_ERROR;
+ }
+ return exitStatus;
+}
+
+uint32 MFA_LoadConfigTable(void) {
+ int32 status;
+ uint32 exitStatus = CFE_ES_APP_RUN;
+ /* Load Config table file */
+ status = CFE_TBL_Load(MFA_AppData.ConfigTblHdl,
+ CFE_TBL_SRC_FILE,
+ MFA_CONFIG_TABLE_FILENAME);
+ if(status != CFE_SUCCESS)
+ {
+ (void) CFE_EVS_SendEvent(MFA_INIT_ERR_EID, CFE_EVS_ERROR,
+ "Failed to load Config Table (0x%08X)",
+ (unsigned int)status);
+
+ exitStatus = CFE_ES_APP_ERROR;
+ }
+ return exitStatus;
+}
+
+uint32 MFA_GetConfigTableAddress(void) {
+ int32 status;
+ uint32 exitStatus = CFE_ES_APP_RUN;
+ /*
+ ** Get a pointer to the tables
+ */
+ status = CFE_TBL_GetAddress((void*)&MFA_AppData.ConfigTblPtr,
+ MFA_AppData.ConfigTblHdl);
+ if(status != CFE_TBL_INFO_UPDATED)
+ {
+ MFA_AppData.ConfigTblPtr = 0;
+ (void) CFE_EVS_SendEvent(MFA_INIT_ERR_EID, CFE_EVS_ERROR,
+ "Failed to get Config table's address (0x%08X)",
+ (unsigned int)status);
+ exitStatus = CFE_ES_APP_ERROR;
+ }
+ return exitStatus;
+}
+
+void MFA_SendInitializedEvent(void) {
+ /*Send an event notifying ground that we initialized.*/
+ (void) CFE_EVS_SendEvent(MFA_INITIALIZED_EID, CFE_EVS_INFORMATION, "Initialized v%u.%u.%u",
+ MFA_MAJOR_VERSION, MFA_MINOR_VERSION, MFA_PATCH_VERSION);
+}
+
+uint32 MFA_AppInit(void) {
+ uint32 exitStatus = MFA_Register_App_CFE_ES();
+
+ if (CFE_ES_APP_RUN == exitStatus) {
+ exitStatus = MFA_InitEvents();
+ }
+
+ if (CFE_ES_APP_RUN == exitStatus) {
+ exitStatus = MFA_InitData();
+ }
+
+ if (CFE_ES_APP_RUN == exitStatus) {
+ exitStatus = MFA_InitPipes();
+ }
+
+ if (CFE_ES_APP_RUN == exitStatus) {
+ exitStatus = MFA_InitTables();
+ }
+
+ if (CFE_ES_APP_RUN == exitStatus) {
+ exitStatus = MFA_LoadConfigTable();
+ }
+
+ if (CFE_ES_APP_RUN == exitStatus) {
+ exitStatus = MFA_GetConfigTableAddress();
+ }
+
+ if (CFE_ES_APP_RUN == exitStatus) {
+ MFA_SendInitializedEvent();
+ }
+
+ return exitStatus;
+}
+
+void MFA_AppDeinit(uint32 exitStatus) {
+ /*Unregister with EVS*/
+ (void) CFE_EVS_Unregister();
+
+ /*Exit from ES*/
+ CFE_ES_ExitApp(exitStatus);
+}
+
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+/* */
+/* Verify Command Length */
+/* */
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+osalbool MFA_VerifyCmdLength(CFE_SB_Msg_t* msgPtr, uint16 expectedLen)
+{
+ uint16 msgLen = 0;
+ CFE_SB_MsgId_t MsgId = 0;
+ uint16 cmdCode = 0;
+
+ if (msgPtr != NULL)
+ {
+ msgLen = CFE_SB_GetTotalMsgLength(msgPtr);
+
+ if (expectedLen != msgLen)
+ {
+ MsgId = CFE_SB_GetMsgId(msgPtr);
+ cmdCode = CFE_SB_GetCmdCode(msgPtr);
+
+ (void) CFE_EVS_SendEvent(
+ MFA_MSG_LEN_ERR_EID,
+ CFE_EVS_ERROR,
+ "Rcvd invalid msgLen: msgId=0x%04X, cmdCode=%d, ""msgLen=%d, expectedLen=%d", MsgId, cmdCode, msgLen, expectedLen
+ );
+
+ //(void) OS_MutSemTake(TO_AppData.MutexID);
+ MFA_AppData.HkTlm.CmdErrors++;
+ //(void) OS_MutSemGive(TO_AppData.MutexID);
+ return FALSE;
+ }
+ }
+ else
+ {
+ /* msgPtr is NULL */
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+
+void MFA_ProcessNewAppCmds(CFE_SB_Msg_t *msgPtr) {
+ uint32 cmdCode = 0;
+ osalbool sizeOk = FALSE;
+ osalbool isCmdOk = FALSE;
+
+ if (msgPtr != NULL)
+ {
+ cmdCode = CFE_SB_GetCmdCode(msgPtr);
+ switch (cmdCode)
+ {
+ case MFA_NOOP_CC:
+ {
+
+ sizeOk = MFA_VerifyCmdLength(msgPtr, sizeof(MFA_NoArgCmd_t));
+
+ if (TRUE == sizeOk)
+ {
+ MFA_AppData.HkTlm.Commands++;
+ (void) CFE_EVS_SendEvent(
+ MFA_CMD_NOOP_INF_EID,
+ CFE_EVS_INFORMATION,
+ "Executed NOOP cmd (%u), Version %d.%d.%d", (unsigned int)cmdCode, MFA_MAJOR_VERSION, MFA_MINOR_VERSION, MFA_PATCH_VERSION
+ );
+ //MFA_PrintCustomVersion();
+ }
+ break;
+ }
+
+ case MFA_RESET_CC:
+ {
+ sizeOk = MFA_VerifyCmdLength(msgPtr, sizeof(MFA_NoArgCmd_t));
+
+ if (TRUE == sizeOk)
+ {
+ //(void) OS_MutSemTake(MFA_AppData.MutexID);
+ MFA_AppData.HkTlm.Commands = 0;
+ MFA_AppData.HkTlm.CmdErrors = 0;
+ MFA_AppData.HkTlm.HelloCount = 0;
+
+ //(void) OS_MutSemGive(MFA_AppData.MutexID);
+
+ //TO_Channel_ResetCountsAll();
+
+ (void) CFE_EVS_SendEvent(
+ MFA_CMD_RESET_INF_EID,
+ CFE_EVS_INFORMATION,
+ "Executed RESET cmd (%u)", (unsigned int)cmdCode
+ );
+ }
+
+ break;
+ }
+
+ case MFA_SET_MSG_CC:
+ {
+ sizeOk = MFA_VerifyCmdLength(msgPtr, sizeof(MFA_StringArgCmd_t));
+
+ if (TRUE == sizeOk)
+ {
+ int32 status =0;
+ MFA_StringArgCmd_t* msgStringArgCmdPtr = (MFA_StringArgCmd_t*) msgPtr;
+ strncpy(
+ MFA_AppData.ConfigTblPtr->Message,
+ msgStringArgCmdPtr->Message,
+ sizeof(msgStringArgCmdPtr->Message)
+ );
+ msgStringArgCmdPtr->Message[sizeof(msgStringArgCmdPtr->Message)-1] = 0;
+ status = CFE_TBL_Modified(MFA_AppData.ConfigTblHdl);
+ if (CFE_SUCCESS!=status) {
+ MFA_AppData.HkTlm.CmdErrors++;
+ (void) CFE_EVS_SendEvent(
+ MFA_TABLEMOD_ERR_EID,
+ CFE_EVS_ERROR,
+ "Table Mod Error (0x%08X)", (unsigned int) status
+ );
+ } else {
+ MFA_AppData.HkTlm.Commands++;
+ }
+ }
+ break;
+ }
+ }
+ }
+}
+
+void MFA_AppMain()
+{
+ uint32 exitStatus = MFA_AppInit();
+
+ /*Enter our main loop*/
+ while(CFE_ES_RunLoop(&exitStatus) == TRUE) {
+ int32 status = CFE_SUCCESS;
+ CFE_SB_Msg_t* msgPtr = NULL;
+ CFE_SB_MsgId_t msgId =0 ;
+
+ /*Wait for Wakeup messages*/
+ status = CFE_SB_RcvMsg(&msgPtr, MFA_AppData.SchPipeId, MFA_SCH_PEND_TIME);
+ if (CFE_SUCCESS==status) {
+ msgId = CFE_SB_GetMsgId(msgPtr);
+
+ switch(msgId) {
+ case MFA_CMD_MID:
+ {
+ MFA_ProcessNewAppCmds(msgPtr);
+ break;
+ }
+ case MFA_WAKEUP_MID:
+ {
+ status = CFE_EVS_SendEvent(MFA_LOOPING_EID, CFE_EVS_INFORMATION, "%s", MFA_AppData.ConfigTblPtr->Message);
+ MFA_AppData.HkTlm.HelloCount++;
+ break;
+ }
+ case MFA_SEND_HK_MID:
+ {
+ //(void) CFE_EVS_SendEvent(MFA_HELLO_WORLD_EID, CFE_EVS_INFORMATION, "%s", MFA_AppData.ConfigTblPtr->Message);
+
+ CFE_SB_TimeStampMsg((CFE_SB_Msg_t*)&MFA_AppData.HkTlm);
+ CFE_SB_SendMsg((CFE_SB_Msg_t *) &MFA_AppData.HkTlm);
+ break;
+ }
+ default:
+ status = CFE_EVS_SendEvent(MFA_INVALID_MSG_EID, CFE_EVS_ERROR, "Unexpected message 0x%04x", msgId);
+ break;
+ }
+ }
+ }
+
+ MFA_AppDeinit(exitStatus);
+}
diff --git a/apps/mfa/fsw/src/mfa_app.h b/apps/mfa/fsw/src/mfa_app.h
new file mode 100644
index 000000000..83997abdb
--- /dev/null
+++ b/apps/mfa/fsw/src/mfa_app.h
@@ -0,0 +1,118 @@
+/**
+ * @file mfa_app.h
+ * @author Shahed Rahim (srahim@windhoverlabs.com)
+ * @brief This is the Header File for the MFA App
+ * @version 1.0.0
+ * @date 2022-05-13
+ *
+ * @copyright Copyright (c) 2022
+ *
+ */
+#ifndef MFA_APP_H
+#define MFA_APP_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif /*__cplusplus*/
+
+#include "cfe.h"
+#include "mfa_tbldefs.h"
+#include "mfa_msgs.h"
+
+/**
+ * @brief This is the major version number for this app
+ *
+ */
+#define MFA_MAJOR_VERSION (1)
+
+/**
+ * @brief This is the minor version number for this app
+ *
+ */
+#define MFA_MINOR_VERSION (0)
+
+/**
+ * @brief This is the patch version number for this app
+ *
+ */
+#define MFA_PATCH_VERSION (0)
+
+
+typedef struct {
+ CFE_TBL_Handle_t ConfigTblHdl;
+ MFA_ConfigTbl_t *ConfigTblPtr;
+ MFA_HkTlm_t HkTlm;
+ CFE_SB_PipeId_t SchPipeId;
+} MFA_AppData_t;
+
+
+/**
+ * @brief This is the App Main Function
+ *
+ */
+void MFA_AppMain(void);
+
+/**
+ * @brief This function gets called to initialize the App within Flight Software.
+ * It registers the app with ES.
+ * It registers events with EVS by calling the MFA_InitEvents function.
+ * It sends the event MFA_INITIALIZED_EID when done.
+ *
+ * @return uint32 returns CFE_ES_APP_RUN if everything is fine. returns CFE_ES_APP_ERROR if there is an error
+ */
+uint32 MFA_AppInit(void);
+
+/**
+ * @brief This function Unregisters the App from ES.
+ * This function should not be called in normal operating conditions. If this function is called, something has gone wrong.
+ *
+ * @param exitStatus This is the exit error status ID that the system is reporting.
+ */
+void MFA_AppDeinit(uint32 exitStatus);
+
+/**
+ * @brief This function registers the App with EVS with a event filter mask.
+ *
+ * @return uint32 returns CFE_ES_APP_RUN if everything is fine. returns CFE_ES_APP_ERROR if there is an error
+ */
+uint32 MFA_InitEvents(void);
+
+/**
+ * @brief This function initializes telemetry messaging
+ *
+ * @return uint32 returns CFE_ES_APP_RUN if everything is fine. returns CFE_ES_APP_ERROR if there is an error
+ */
+uint32 MFA_InitData(void);
+
+/**
+ * @brief This function initializes the Config Tables
+ *
+ * @return uint32 returns CFE_ES_APP_RUN if everything is fine. returns CFE_ES_APP_ERROR if there is an error
+ */
+uint32 MFA_InitTables(void);
+
+/**
+ * @brief This function loads data into the Config Tables
+ *
+ * @return uint32 returns CFE_ES_APP_RUN if everything is fine. returns CFE_ES_APP_ERROR if there is an error
+ */
+uint32 MFA_LoadConfigTable(void);
+
+/**
+ * @brief This function gets the address to the config table
+ *
+ * @return uint32 returns CFE_ES_APP_RUN if everything is fine. returns CFE_ES_APP_ERROR if there is an error
+ */
+uint32 MFA_GetConfigTableAddress(void);
+
+/**
+ * @brief This function sends an event saying the initialization of the MFA was completed successfully.
+ *
+ */
+void MFA_SendInitializedEvent(void);
+
+#ifdef __cplusplus
+}
+#endif /*__cplusplus*/
+
+#endif /*MFA_APP_H*/
diff --git a/apps/mfa/fsw/src/mfa_events.h b/apps/mfa/fsw/src/mfa_events.h
new file mode 100644
index 000000000..447394ce1
--- /dev/null
+++ b/apps/mfa/fsw/src/mfa_events.h
@@ -0,0 +1,70 @@
+/**
+ * @file mfa_events.h
+ * @author Shahed Rahim (srahim@windhoverlabs.com)
+ * @brief This header file defines the different events ids the app sends
+ * @version 1.0.0
+ * @date 2022-05-13
+ *
+ * @copyright Copyright (c) 2022
+ *
+ */
+#ifndef MFA_EVENTS_H
+#define MFA_EVENTS_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif /*__cplusplus*/
+/**
+ * @brief It is an the event id that the app sends after app is initialized
+ *
+ */
+#define MFA_INITIALIZED_EID (1)
+
+/**
+ * @brief It is an the event id that the app sends during its loop
+ *
+ */
+#define MFA_LOOPING_EID (2)
+
+/**
+ * @brief It is an the event id that the app sends if there is a problem during initialization
+ *
+ */
+#define MFA_INIT_ERR_EID (3)
+
+/**
+ * @brief It is an event id that the app sends when a Noop is being operated on
+ *
+ */
+#define MFA_CMD_NOOP_INF_EID (4)
+
+/**
+ * @brief It is an event id that the app sends when a Reset is being operated on
+ *
+ */
+#define MFA_CMD_RESET_INF_EID (5)
+
+/**
+ * @brief It is an event id that the app sends when the msg length received is wrong
+ *
+ */
+#define MFA_MSG_LEN_ERR_EID (6)
+
+/**
+ * @brief It is an event id that the app sends when the app receieved an unexpected message id
+ *
+ */
+#define MFA_INVALID_MSG_EID (7)
+
+/**
+ * @brief It is an event id that the app sends when the app is unable to run CFE_TBL_Modified
+ * function successfully
+ *
+ */
+#define MFA_TABLEMOD_ERR_EID (8)
+
+#ifdef __cplusplus
+}
+#endif /*__cplusplus*/
+
+#endif /*MFA_EVENTS_H*/
\ No newline at end of file
diff --git a/apps/mfa/fsw/src/mfa_msgs.h b/apps/mfa/fsw/src/mfa_msgs.h
new file mode 100644
index 000000000..59681295e
--- /dev/null
+++ b/apps/mfa/fsw/src/mfa_msgs.h
@@ -0,0 +1,64 @@
+#ifndef MFA_MSGS_H
+#define MFA_MSGS_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+#include "cfe.h"
+#include "mfa_tbldefs.h"
+
+/**
+ * @brief This is a Noop Command Code in the MFA_CMD_MID Message ID
+ *
+ */
+#define MFA_NOOP_CC (0)
+
+/**
+ * @brief This is a Reset Command Code in the MFA_CMD_MID Message ID
+ *
+ */
+#define MFA_RESET_CC (1)
+
+/**
+ * @brief This is a set config message command code in the MFA_CMD_MID Message ID
+ *
+ */
+#define MFA_SET_MSG_CC (2)
+
+
+/**
+ * @brief This is the typedef struct for the House Keeping Telemetry sent to ground
+ *
+ */
+typedef struct {
+ uint8 TlmHeader[CFE_SB_TLM_HDR_SIZE];
+ uint32 Commands;
+ uint32 CmdErrors;
+ uint32 HelloCount;
+} MFA_HkTlm_t;
+
+
+/**
+ * @brief This is the typedef struct for No Argument Commands sent to the App
+ *
+ */
+typedef struct {
+ uint8 CmdHeader[CFE_SB_CMD_HDR_SIZE];
+} MFA_NoArgCmd_t;
+
+/**
+ * @brief This is the typedef struct for single string argument commands sent to the app
+ *
+ */
+typedef struct {
+ uint8 CmdHeader[CFE_SB_CMD_HDR_SIZE];
+ char Message[MFA_MESSAGE_MAX_SIZE];
+} MFA_StringArgCmd_t;
+
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /*MFA_MSGS_H*/
diff --git a/apps/mfa/fsw/src/mfa_symbols.c b/apps/mfa/fsw/src/mfa_symbols.c
new file mode 100644
index 000000000..09f8f9d29
--- /dev/null
+++ b/apps/mfa/fsw/src/mfa_symbols.c
@@ -0,0 +1,3 @@
+#include "mfa_msgs.h"
+
+MFA_NoArgCmd_t MFA_NoArgCmd_s;
\ No newline at end of file
diff --git a/apps/mfa/fsw/src/mfa_tbldefs.h b/apps/mfa/fsw/src/mfa_tbldefs.h
new file mode 100644
index 000000000..b6a34659d
--- /dev/null
+++ b/apps/mfa/fsw/src/mfa_tbldefs.h
@@ -0,0 +1,37 @@
+/**
+ * @file mfa_tbldefs.h
+ * @author Shahed Rahim (srahim@windhoverlabs.com)
+ * @brief This header file contains the contents of the config table
+ * @version 1.0.0
+ * @date 2022-05-19
+ *
+ * @copyright Copyright (c) 2022
+ *
+ */
+#ifndef MFA_TBLDEFS_H
+#define MFA_TBLDEFS_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif /*__cplusplus*/
+
+/**
+ * @brief This is the maximum size of the string that the config Message can hold
+ *
+ */
+#define MFA_MESSAGE_MAX_SIZE (100)
+
+/**
+ * @brief This is the struct definition for the Config Table
+ *
+ */
+typedef struct {
+ char Message[MFA_MESSAGE_MAX_SIZE];
+} MFA_ConfigTbl_t;
+
+
+#ifdef __cplusplus
+}
+#endif /*__cplusplus*/
+
+#endif /*MFA_TBLDEFS_H*/
\ No newline at end of file
diff --git a/apps/mfa/wh_design.yaml b/apps/mfa/wh_design.yaml
new file mode 100644
index 000000000..72bb074a5
--- /dev/null
+++ b/apps/mfa/wh_design.yaml
@@ -0,0 +1,63 @@
+ short_name: mfa
+ long_name: My First Application
+ app_name: MFA
+ module_type: CFE_APP
+ commander:
+ displays: cdr
+ events:
+ MFA_INITIALIZED_EID:
+ id: 1
+ MFA_HELLO_WORLD_EID:
+ id: 2
+ MFA_INIT_ERR_EID:
+ id: 3
+ MFA_CMD_NOOP_INF_EID:
+ id: 4
+ MFA_CMD_RESET_INF_EID:
+ id: 5
+ MFA_MSG_LEN_ERR_EID:
+ id: 6
+ MFA_INVALID_MSG_EID:
+ id: 7
+ MFA_TABLEMOD_ERR_EID:
+ id: 8
+ telemetry:
+ MFA_HK_TLM_MID:
+ msgID:
+ struct: MFA_HkTlm_t
+ commands:
+ MFA_WAKEUP_MID:
+ msdID:
+ commands:
+ WakeUp:
+ cc: 0
+ struct: MFA_NoArgCmd_t
+ MFA_SEND_HK_MID:
+ msdID:
+ commands:
+ SendHk:
+ cc: 0
+ struct: MFA_NoArgCmd_t
+ MFA_CMD_MID:
+ msgID:
+ commands:
+ Noop:
+ cc: 0
+ struct: MFA_NoArgCmd_t
+ Reset:
+ cc: 1
+ struct: MFA_NoArgCmd_t
+ SetMessage:
+ cc: 2
+ struct: MFA_StringArgCmd_t
+ msg_def_overrides:
+ - parent: MFA_StringArgCmd_t
+ member: Message
+ type: string
+ config:
+ MFA_CONFIG_TABLE_FILENAME:
+ name: MFA_CONFIG_TABLE_FILENAME
+ value: "/cf/apps/mfa_config.tbl"
+ MFA_CONFIG_TABLENAME:
+ name: MFA_CONFIG_TABLENAME
+ value: "CONFIG_TBL"
\ No newline at end of file
diff --git a/config/training/host/CMakeLists.txt b/config/training/host/CMakeLists.txt
new file mode 100644
index 000000000..bb46373da
--- /dev/null
+++ b/config/training/host/CMakeLists.txt
@@ -0,0 +1,13 @@
+# Put host specific functions here. This allows us to build things like elf2cfetbl which are built using the host
+# toolchain, not the cross toolchain.
+buildliner_build_cfe_host_tools(
+ PSP ${PROJECT_SOURCE_DIR}/core/psp/pc-linux-wh
+
+ OSAL ${PROJECT_SOURCE_DIR}/core/osal/posix-fast
+
+ CONFIG
+ ${PROJECT_SOURCE_DIR}/config/training/inc
+ ${PROJECT_SOURCE_DIR}/config/shared/inc
+)
+
+file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/../term.cfg DESTINATION ${CMAKE_BINARY_DIR}/..)
\ No newline at end of file
diff --git a/config/training/inc/cfe_mission_cfg.h b/config/training/inc/cfe_mission_cfg.h
new file mode 100644
index 000000000..67188dfad
--- /dev/null
+++ b/config/training/inc/cfe_mission_cfg.h
@@ -0,0 +1,422 @@
+#ifndef CFE_MISSION_CFG
+#define CFE_MISSION_CFG
+
+
+#define CFE_CMD_MID_BASE (0x1800)
+#define CFE_TLM_MID_BASE (0x0800)
+#define CPD_CPU_BASE (0x0200)
+#define PPD_CPU_BASE (0x0000)
+#define SIMLINK_CPU_BASE (0x0400)
+
+/**
+** \cfemissioncfg Spacecraft ID
+**
+** \par Description:
+** This defines the value that is returned by the call to
+** CFE_PSP_GetSpacecraftId.
+**
+** \par Limits
+** The cFE does not place a limit on this configuration paramter.
+** CCSDS allocates 8 bits for this field in the standard VCDU.
+*/
+#define CFE_SPACECRAFT_ID 1
+
+
+/**
+** \cfemissioncfg Spacecraft ID
+**
+** \par Description:
+** Dictates the message format used by the cFE.
+**
+** \par Limits
+** All versions of the cFE currently support only CCSDS as the message format
+*/
+#define MESSAGE_FORMAT_IS_CCSDS
+
+
+/** \name Packet timestamp format identifiers */
+/** \{ */
+#define CFE_SB_TIME_32_16_SUBS 1 /**< \brief 32 bits seconds + 16 bits subseconds (units = 2^^-16) */
+#define CFE_SB_TIME_32_32_SUBS 2 /**< \brief 32 bits seconds + 32 bits subseconds (units = 2^^-32) */
+#define CFE_SB_TIME_32_32_M_20 3 /**< \brief 32 bits seconds + 20 bits microsecs + 12 bits reserved */
+/** \} */
+
+/**
+** \cfemissioncfg Packet Timestamp Format Selection
+**
+** \par Description:
+** Defines the size, format and contents of the telemetry packet timestamp.
+**
+** \par Limits
+** Must be defined as one of the supported formats listed above
+*/
+#define CFE_SB_PACKET_TIME_FORMAT CFE_SB_TIME_32_16_SUBS
+
+
+/**
+** \cfesbcfg Maximum SB Message Size
+**
+** \par Description:
+** The following definition dictates the maximum message size allowed on
+** the software bus. SB checks the pkt length field in the header of all
+** messages sent. If the pkt length field indicates the message is larger
+** than this define, SB sends an event and rejects the send.
+**
+**
+** \par Limits
+** This parameter has a lower limit of 6 (CCSDS primary header size),
+** and an upper limit (including headers) of 32768 bytes.
+*/
+#define CFE_SB_MAX_SB_MSG_SIZE 32768
+
+
+/**
+** \cfetimecfg Default Time Format
+**
+** \par Description:
+** The following definitions select either UTC or TAI as the default
+** (mission specific) time format. Although it is possible for an
+** application to request time in a specific format, most callers
+** should use CFE_TIME_GetTime(), which returns time in the default
+** format. This avoids having to modify each individual caller
+** when the default choice is changed.
+**
+**
+** \par Limits
+** if CFE_TIME_CFG_DEFAULT_TAI is defined as TRUE then CFE_TIME_CFG_DEFAULT_UTC must be
+** defined as FALSE.
+** if CFE_TIME_CFG_DEFAULT_TAI is defined as FALSE then CFE_TIME_CFG_DEFAULT_UTC must be
+** defined as TRUE.
+*/
+#define CFE_TIME_CFG_DEFAULT_TAI TRUE
+#define CFE_TIME_CFG_DEFAULT_UTC FALSE
+
+/**
+** \cfetimecfg Default Time Format
+**
+** \par Description:
+** The following definition enables the use of a simulated time at
+** the tone signal using a software bus message.
+**
+**
+** \par Limits
+** Not Applicable
+*/
+#define CFE_TIME_CFG_FAKE_TONE TRUE
+
+
+/**
+** \cfetimecfg Default Time and Tone Order
+**
+** \par Description:
+** Time Services may be configured to expect the time at the tone
+** data packet to either precede or follow the tone signal. If the
+** time at the tone data packet follows the tone signal, then the
+** data within the packet describes what the time "was" at the tone.
+** If the time at the tone data packet precedes the tone signal, then
+** the data within the packet describes what the time "will be" at
+** the tone. One, and only one, of the following symbols must be set to TRUE:
+** - CFE_TIME_AT_TONE_WAS
+** - CFE_TIME_AT_TONE_WILL_BE
+** Note: If Time Services is defined as using a simulated tone signal
+** (see #CFE_TIME_CFG_FAKE_TONE above), then the tone data packet
+** must follow the tone signal.
+**
+** \par Limits
+** Either CFE_TIME_AT_TONE_WAS or CFE_TIME_AT_TONE_WILL_BE must be set to TRUE.
+** They may not both be TRUE and they may not both be FALSE.
+*/
+#define CFE_TIME_AT_TONE_WAS TRUE
+#define CFE_TIME_AT_TONE_WILL_BE FALSE
+
+/**
+** \cfetimecfg Min and Max Time Elapsed
+**
+** \par Description:
+** Based on the definition of Time and Tone Order
+** (CFE_TIME_AT_TONE_WAS/WILL_BE) either the "time at the tone" signal or
+** data packet will follow the other. This definition sets the valid window
+** of time for the second of the pair to lag behind the first. Time
+** Services will invalidate both the tone and packet if the second does not
+** arrive within this window following the first.
+**
+** For example, if the data packet follows the tone, it might be valid for
+** the data packet to arrive between zero and 100,000 micro-seconds after
+** the tone. But, if the tone follows the the packet, it might be valid
+** only if the packet arrived between 200,000 and 700,000 micro-seconds
+** before the tone.
+**
+** Note: units are in micro-seconds
+**
+**
+** \par Limits
+** 0 to 999,999 decimal
+*/
+#define CFE_TIME_MIN_ELAPSED 0
+#define CFE_TIME_MAX_ELAPSED 200000
+
+
+/**
+** \cfetimecfg Default Time Values
+**
+** \par Description:
+** Default time values are provided to avoid problems due to time
+** calculations performed after startup but before commands can be
+** processed. For example, if the default time format is UTC then
+** it is important that the sum of MET and STCF always exceed the
+** value of Leap Seconds to prevent the UTC time calculation
+** (time = MET + STCF - Leap Seconds) from resulting in a negative
+** (very large) number.
+** Some past missions have also created known (albeit wrong) default
+** timestamps. For example, assume the epoch is defined as Jan 1, 1970
+** and further assume the default time values are set to create a timestamp
+** of Jan 1, 2000. Even though the year 2000 timestamps are wrong, it
+** may be of value to keep the time within some sort of bounds acceptable
+** to the software.
+** Note: Sub-second units are in micro-seconds (0 to 999,999) and
+** all values must be defined
+**
+** \par Limits
+** Not Applicable
+*/
+#define CFE_TIME_DEF_MET_SECS 1000
+#define CFE_TIME_DEF_MET_SUBS 0
+
+#define CFE_TIME_DEF_STCF_SECS 1000000
+#define CFE_TIME_DEF_STCF_SUBS 0
+
+#define CFE_TIME_DEF_LEAPS 32
+
+#define CFE_TIME_DEF_DELAY_SECS 0
+#define CFE_TIME_DEF_DELAY_SUBS 1000
+
+
+/**
+** \cfetimecfg Default EPOCH Values
+**
+** \par Description:
+** Default ground time epoch values
+** Note: these values are used only by the CFE_TIME_Print() API function
+**
+** \par Limits
+** Year - must be within 136 years
+** Day - Jan 1 = 1, Feb 1 = 32, etc.
+** Hour - 0 to 23
+** Minute - 0 to 59
+** Second - 0 to 59
+*/
+#define CFE_TIME_EPOCH_YEAR 1970
+#define CFE_TIME_EPOCH_DAY 1
+#define CFE_TIME_EPOCH_HOUR 0
+#define CFE_TIME_EPOCH_MINUTE 0
+#define CFE_TIME_EPOCH_SECOND 0
+
+
+/**
+** \cfetimecfg Time File System Factor
+**
+** \par Description:
+** Define the s/c vs file system time conversion constant...
+**
+** Note: this value is intended for use only by CFE TIME API functions to
+** convert time values based on the ground system epoch (s/c time) to
+** and from time values based on the file system epoch (fs time).
+**
+** FS time = S/C time + factor
+** S/C time = FS time - factor
+**
+** Worksheet:
+**
+** S/C epoch = Jan 1, 2005 (LRO ground system epoch)
+** FS epoch = Jan 1, 1980 (vxWorks DOS file system epoch)
+**
+** Delta = 25 years, 0 days, 0 hours, 0 minutes, 0 seconds
+**
+** Leap years = 1980, 1984, 1988, 1992, 1996, 2000, 2004
+** (divisible by 4 -- except if by 100 -- unless also by 400)
+**
+** 1 year = 31,536,000 seconds
+** 1 day = 86,400 seconds
+** 1 hour = 3,600 seconds
+** 1 minute = 60 seconds
+**
+** 25 years = 788,400,000 seconds
+** 7 extra leap days = 604,800 seconds
+**
+** total delta = 789,004,800 seconds
+**
+** \par Limits
+** Not Applicable
+*/
+#define CFE_TIME_FS_FACTOR 789004800
+
+
+/**
+** \cfeescfg Maximum Length of CDS Name
+**
+** \par Description:
+** Indicates the maximum length (in characers) of the CDS name ('CDSName')
+** portion of a Full CDS Name of the following form:
+** "ApplicationName.CDSName"
+**
+**
+** \par Limits
+** Not Applicable
+*/
+#define CFE_ES_CDS_MAX_NAME_LENGTH 16
+
+
+
+/**
+** \cfeevscfg Maximum Event Message Length
+**
+** \par Description:
+** Indicates the maximum length (in characers) of the formatted text
+** string portion of an event message
+**
+** \par Limits
+** Not Applicable
+*/
+#define CFE_EVS_MAX_MESSAGE_LENGTH 122
+
+
+/** \name Checksum/CRC algorithm identifiers */
+/** \{ */
+#define CFE_ES_CRC_8 1 /**< \brief CRC ( 8 bit additive - returns 32 bit total) (Currently not implemented) */
+#define CFE_ES_CRC_16 2 /**< \brief CRC (16 bit additive - returns 32 bit total) */
+#define CFE_ES_CRC_32 3 /**< \brief CRC (32 bit additive - returns 32 bit total) (Currently not implemented) */
+/** \} */
+
+/**
+** \cfeescfg Mission Default CRC algorithm
+**
+** \par Description:
+** Indicates the which CRC algorithm should be used as the default
+** for verifying the contents of Critical Data Stores and when calculating
+** Table Image data integrity values.
+**
+** \par Limits
+** Currently only CFE_ES_CRC_16 is supported (see #CFE_ES_CRC_16)
+*/
+#define CFE_ES_DEFAULT_CRC CFE_ES_CRC_16
+
+
+/**
+** \cfetblcfg Maximum Table Name Length
+**
+** \par Description:
+** Indicates the maximum length (in characers) of the table name
+** ('TblName') portion of a Full Table Name of the following
+** form: "ApplicationName.TblName"
+**
+** \par Limits
+** Not Applicable
+*/
+#define CFE_TBL_MAX_NAME_LENGTH 16
+
+
+/**
+** \cfemissioncfg cFE Message ID Base Numbers
+**
+** \par Description:
+** Message Id base numbers for the cFE messages
+** NOTE: cFE MsgIds are the sum of the base numbers and the portable msg
+** numbers.
+**
+** \par Limits
+** Must be less than CFE_SB_HIGHEST_VALID_MSGID
+*/
+#define CFE_CMD_MID_BASE_CPU1 0x1800
+#define CFE_TLM_MID_BASE_CPU1 0x0800
+#define CFE_CMD_APPID_BASE_CPU1 1
+#define CFE_TLM_APPID_BASE_CPU1 0
+
+#define CFE_CMD_MID_BASE_CPU2 0x1820
+#define CFE_TLM_MID_BASE_CPU2 0x0820
+#define CFE_CMD_APPID_BASE_CPU2 33
+#define CFE_TLM_APPID_BASE_CPU2 32
+
+#define CFE_CMD_MID_BASE_CPU3 0x1840
+#define CFE_TLM_MID_BASE_CPU3 0x0840
+#define CFE_CMD_APPID_BASE_CPU3 65
+#define CFE_TLM_APPID_BASE_CPU3 64
+
+#define CFE_CMD_MID_BASE_GLOB 0x1860
+#define CFE_TLM_MID_BASE_GLOB 0x0860
+
+
+
+/**
+** \cfemissioncfg cFE Portable Message Numbers for Commands
+**
+** \par Description:
+** Portable message numbers for the cFE command messages
+** NOTE: cFE MsgIds are the sum of the base numbers and the portable msg
+** numbers.
+**
+** \par Limits
+** Not Applicable
+*/
+#define CFE_EVS_CMD_MSG 1
+ /* Offset 2 is available */
+#define CFE_SB_CMD_MSG 3
+#define CFE_TBL_CMD_MSG 4
+#define CFE_TIME_CMD_MSG 5
+#define CFE_ES_CMD_MSG 6
+
+#define CFE_ES_SEND_HK_MSG 8
+#define CFE_EVS_SEND_HK_MSG 9
+ /* Offset 10 is available */
+#define CFE_SB_SEND_HK_MSG 11
+#define CFE_TBL_SEND_HK_MSG 12
+#define CFE_TIME_SEND_HK_MSG 13
+
+#define CFE_TIME_TONE_CMD_MSG 16
+#define CFE_TIME_1HZ_CMD_MSG 17
+
+
+/**
+** \cfemissioncfg cFE Portable Message Numbers for Global Messages
+**
+** \par Description:
+** Portable message numbers for the cFE global messages
+** NOTE: cFE MsgIds are the sum of the base numbers and the portable msg
+** numbers.
+**
+** \par Limits
+** Not Applicable
+*/
+#define CFE_TIME_DATA_CMD_MSG 0
+#define CFE_TIME_FAKE_CMD_MSG 1
+#define CFE_TIME_SEND_CMD_MSG 2
+
+
+/**
+** \cfemissioncfg cFE Portable Message Numbers for Telemetry
+**
+** \par Description:
+** Portable message numbers for the cFE telemetry messages
+** NOTE: cFE MsgIds are the sum of the base numbers and the portable msg
+** numbers.
+**
+** \par Limits
+** Not Applicable
+*/
+#define CFE_ES_HK_TLM_MSG 0
+#define CFE_EVS_HK_TLM_MSG 1
+ /* Offset 2 is available */
+#define CFE_SB_HK_TLM_MSG 3
+#define CFE_TBL_HK_TLM_MSG 4
+#define CFE_TIME_HK_TLM_MSG 5
+#define CFE_TIME_DIAG_TLM_MSG 6
+
+#define CFE_EVS_EVENT_MSG_MSG 8
+#define CFE_SB_STATS_TLM_MSG 10
+#define CFE_ES_APP_TLM_MSG 11
+#define CFE_TBL_REG_TLM_MSG 12
+#define CFE_SB_ALLSUBS_TLM_MSG 13
+#define CFE_SB_ONESUB_TLM_MSG 14
+#define CFE_ES_SHELL_TLM_MSG 15
+#define CFE_ES_MEMSTATS_TLM_MSG 16
+
+#endif
diff --git a/config/training/inc/cfe_msgids.h b/config/training/inc/cfe_msgids.h
new file mode 100644
index 000000000..bcb6d5bda
--- /dev/null
+++ b/config/training/inc/cfe_msgids.h
@@ -0,0 +1,6 @@
+#ifndef _cfe_msgids_
+#define _cfe_msgids_
+
+#include "msg_ids.h"
+
+#endif
diff --git a/config/training/inc/cfe_platform_cfg.h b/config/training/inc/cfe_platform_cfg.h
new file mode 100644
index 000000000..05260ef12
--- /dev/null
+++ b/config/training/inc/cfe_platform_cfg.h
@@ -0,0 +1,1867 @@
+/******************************************************************************
+** File: cfe_platform_cfg.h
+**
+** Purpose:
+** This header file contains the platform configuration parameters.
+**
+** Author: R.McGraw/SSI
+**
+** $Log: cfe_platform_cfg.h $
+** Revision 1.35 2014/09/09 13:59:50GMT-05:00 lwalling
+** Describe effects of removing Table Services from CFE on definition of CFE_ES_MAX_BLOCK_SIZE
+** Revision 1.34 2014/08/21 15:29:47EDT rmcgraw
+** DCR22696:1 Added #define CFE_ES_EXCEPTION_FUNCTION
+** Revision 1.33 2014/08/19 15:01:27EDT sstrege
+** Updated reference to OS_BSPGetUserReservedArea to CFE_PSP_GetUserReservedArea
+** Revision 1.32 2014/04/14 11:51:41EDT lwalling
+** Created platform config definitions for Time 1HZ and Time TONE task priorities and stack sizes
+** Revision 1.31 2012/01/18 16:36:58EST jmdagost
+** Changed filename reference in cFE Mission Revision comment.
+** Revision 1.30 2012/01/06 17:15:22EST lwalling
+** Changed default shell output filename from CmdString.out to ShellCmd.out
+** Revision 1.29 2011/12/27 16:39:03EST lwalling
+** Include mission config file from platform config file
+** Revision 1.28 2011/12/21 15:07:51EST lwalling
+** Add table file verification definitions for spacecraft ID and processor ID
+** Revision 1.27 2011/11/30 15:13:23EST jmdagost
+** Changed definitions to be TRUE/FALSE instead of commenting/uncommenting them.
+** Revision 1.26 2011/01/18 16:06:04EST lwalling
+** Make sending 1hz command packet a configuration option
+** Revision 1.25 2010/11/23 15:26:32EST jmdagost
+** Added mission-specific revision number definition (4th digit in cFE version number)
+** Revision 1.24 2010/11/23 12:10:40EST jmdagost
+** Increased SB Max block size to accommodate change in SB.
+** Revision 1.23 2010/11/08 16:18:29EST acudmore
+** Updated RAM disk path comments
+** Revision 1.22 2010/11/08 14:55:13EST aschoeni
+** Moved CFE_SB_DEFAULT_MSG_LIMIT from cfe_sb_priv to cfe_platform_cfg
+** Revision 1.21 2010/11/08 12:30:11EST acudmore
+** Updated CFE_ES_MAX_PROCESSOR_RESETS to 2 ( rather than 5 )
+** Revision 1.20 2010/11/05 15:54:31EDT aschoeni
+** Added Generic Counter API to ES
+** Revision 1.19 2010/11/04 16:41:46EDT aschoeni
+** Added optional sender information storage
+** Revision 1.18 2010/11/04 12:48:46EDT acudmore
+** Added RAM disk mount path configuration item.
+** Revision 1.17 2010/10/27 16:34:42EDT jmdagost
+** Changed EVS default log mode from 0 (overwrite) to 1 (discard)
+** Revision 1.16 2010/10/26 16:29:28EDT jmdagost
+** Deleted unnecessary CFE_ES_MAX_SHELL_CMD_SIZE
+** Revision 1.15 2010/10/20 12:43:12EDT jmdagost
+** Added reference to CFE_ES_PoolCreateNoSem in documentation.
+** Revision 1.14 2009/07/31 14:07:08EDT aschoeni
+** Added note to parameters which may affect USER_RESERVED_MEM
+** Revision 1.13 2009/07/30 19:22:49EDT jmdagost
+** Updated doxygen comments for CFE_TBL_MAX_CRITICAL_TABLES
+** Revision 1.12 2009/07/28 18:04:45EDT jmdagost
+** Increased default number of registered CDS blocks
+** Revision 1.11 2009/07/28 17:16:23EDT jmdagost
+** Added initial filter mask and trigger mask definitions.
+** Revision 1.10 2009/02/26 17:42:26EST rmcgraw
+** Member moved from cfe_platform_cfg.h in project c:/MKSDATA/MKS-REPOSITORY/MKS-CFE-PROJECT/fsw/platform_inc/project.pj to cfe_platform_cfg.h in project c:/MKSDATA/MKS-REPOSITORY/MKS-CFE-PROJECT/fsw/platform_inc/cpu1/project.pj.
+** Revision 1.9 2009/02/26 17:42:26ACT rmcgraw
+** Member moved from cfe_platform_cfg.h in project c:/MKSDATA/MKS-REPOSITORY/MKS-CFE-PROJECT/fsw/build/cpu1/inc/project.pj to cfe_platform_cfg.h in project c:/MKSDATA/MKS-REPOSITORY/MKS-CFE-PROJECT/fsw/platform_inc/project.pj.
+** Revision 1.8 2009/02/26 17:42:26ACT rmcgraw
+** DCR6805:1 Added comments to reflect SB cfg paramater limits
+** Revision 1.7 2009/02/11 15:02:33EST rmcgraw
+** DCR6269:1 Added SB mem pool block sizes
+** Revision 1.6 2008/12/08 12:07:15EST dkobe
+** Updates to correct doxygen errors
+** Revision 1.5 2008/09/02 10:28:41EDT apcudmore
+** Changed Ram Disk NUM_SECTORS back to 4096
+** Revision 1.4 2008/08/06 22:42:32EDT dkobe
+** Added CFE_TIME_RegisterSynchCallback, CFE_TIME_UnregisterSynchCallback and CFE_TIME_CleanUpApp
+** Revision 1.2 2008/07/25 12:49:08EDT dkobe
+** Updated CFE_TBL_MAX_DBL_TABLE_SIZE and CFE_TBL_SNGL_TABLE_SIZE to 16K
+** Revision 1.1 2008/07/22 16:51:57EDT apcudmore
+** Member moved to .../fsw/build/cpu1/inc
+** Revision 1.1 2008/04/17 08:01:30EDT ruperera
+** Member moved from cfe project on tlserver to cfe project on tlserver3
+** Revision 1.6 2008/02/13 15:46:52EST rjmcgraw
+** DCR6754:1 Removed CFE_SB_EVENT_LOG_ENTRIES
+** Revision 1.5 2007/09/25 10:04:36EDT apcudmore
+** Created new config parameter for default filename for Query All Tasks cmd.
+** Revision 1.4 2007/09/20 11:19:09EDT apcudmore
+** Removed vxWorks boot line and IP address from config file. They are no longer being used.
+**
+******************************************************************************/
+
+#ifndef _cfe_platform_cfg_
+#define _cfe_platform_cfg_
+
+/*
+** Allow reference to CFE_SPACECRAFT_ID (see CFE_TBL_VALID_ definitions below)
+*/
+#include "cfe_mission_cfg.h"
+#include "priorities.h"
+
+#define CFE_MSG_CPU_BASE (0x0000)
+
+
+#define CFE_ES_START_TASK_FLAGS OS_ENABLE_CORE_0
+#define CFE_EVS_START_TASK_FLAGS OS_ENABLE_CORE_0
+#define CFE_SB_START_TASK_FLAGS OS_ENABLE_CORE_0
+#define CFE_TBL_START_TASK_FLAGS OS_ENABLE_CORE_0
+#define CFE_TIME_START_TASK_FLAGS OS_ENABLE_CORE_0
+
+/*
+** CPU Id for target Processor
+*/
+#define CFE_CPU_ID 1
+
+/*
+** CPU Name for target Processor
+*/
+#define CFE_CPU_NAME "CPU1"
+
+/**
+** \cfesbcfg Maximum Number of Unique Message IDs SB Routing Table can hold
+**
+** \par Description:
+** Dictates the maximum number of unique MsgIds the SB routing table will hold.
+** This constant has a direct affect on the size of SB's tables and arrays.
+** Keeping this count as low as possible will save memory.
+** To see the run-time, high-water mark and the current utilization figures
+** regarding this parameter, send an SB command to 'Send Statistics Pkt'.
+**
+** \par Limits
+** This parameter has a lower limit of 1 and an upper limit of 1024.
+**
+*/
+#define CFE_SB_MAX_MSG_IDS 256
+
+
+/**
+** \cfesbcfg Maximum Number of Unique Pipes SB Routing Table can hold
+**
+** \par Description:
+** Dictates the maximum number of unique Pipes the SB routing table will hold.
+** This constant has a direct affect on the size of SB's tables and arrays.
+** Keeping this count as low as possible will save memory.
+** To see the run-time, high-water mark and the current utilization figures
+** regarding this parameter, send an SB command to 'Send Statistics Pkt'.
+**
+** \par Limits
+** This parameter has a lower limit of 1 and an upper limit of 255.
+** This parameter must also be less than or equal to OS_MAX_QUEUES
+**
+*/
+#define CFE_SB_MAX_PIPES 64
+
+
+/**
+** \cfesbcfg Maximum Number of unique local destinations a single MsgId can have
+**
+** \par Description:
+** Dictates the maximum number of unique local destinations a single MsgId can
+** have.
+**
+** \par Limits
+** This parameter has a lower limit of 1 and an upper limit of 64.
+**
+*/
+#define CFE_SB_MAX_DEST_PER_PKT 16
+
+
+/**
+** \cfesbcfg Default Subscription Message Limit
+**
+** \par Description:
+** Dictates the default Message Limit when using the #CFE_SB_Subscribe API. This will
+** limit the number of messages with a specific message ID that can be received through
+** a subscription. This only changes the default; other message limits can be set on a per
+** subscription basis using #CFE_SB_SubscribeEx .
+**
+** \par Limits
+** This parameter has a lower limit of 4 and an upper limit of 65535.
+**
+*/
+#define CFE_SB_DEFAULT_MSG_LIMIT 4
+
+
+/**
+** \cfesbcfg Size of the SB buffer memory pool
+**
+** \par Description:
+** Dictates the size of the SB memory pool. For each message the SB
+** sends, the SB dynamically allocates from this memory pool, the memory needed
+** to process the message. The memory needed to process each message is msg
+** size + msg descriptor(#CFE_SB_BufferD_t). This memory pool is also used
+** to allocate destination descriptors (#CFE_SB_DestinationD_t) during the
+** subscription process.
+** To see the run-time, high-water mark and the current utilization figures
+** regarding this parameter, send an SB command to 'Send Statistics Pkt'.
+** Some memory statistics have been added to the SB housekeeping packet.
+** NOTE: It is important to monitor these statistics to ensure the desired
+** memory margin is met.
+**
+** \par Limits
+** This parameter has a lower limit of 512 and an upper limit 4.29G bytes.
+**
+*/
+#define CFE_SB_BUF_MEMORY_BYTES 524288
+
+
+/**
+** \cfesbcfg Maximum depth allowed when creating an SB pipe
+**
+** \par Description:
+** The value of this constant dictates the maximum pipe depth that an
+** application may request. The pipe depth is given as a paramter in the
+** #CFE_SB_CreatePipe API.
+**
+** \par Limits
+** This parameter has a lower limit of 1 and an upper limit of 65535.
+*/
+#define CFE_SB_MAX_PIPE_DEPTH 256
+
+
+/**
+** \cfesbcfg Highest Valid Message Id
+**
+** \par Description:
+** The value of this constant dictates the size of the SB message map. The SB
+** messsage map is a lookup table that provides the routing table index for
+** fast access into the routing table.The default setting of 0x1FFF was chosen
+** to save memory for CCSDS implementations where the CCSDS Version number
+** (3 MSB's of MsgId) would remain constant throughout the mission. This
+** reduces the message map from 128Kbytes to 16Kbytes.See CFE_FSW_DCR 504 for
+** more details.
+**
+** \par Limits
+** This parameter has a lower limit of 1 and an upper limit of 0xFFFF.
+*/
+#define CFE_SB_HIGHEST_VALID_MSGID 0x1FFF
+
+
+/**
+** \cfesbcfg Default Routing Information Filename
+**
+** \par Description:
+** The value of this constant defines the filename used to store the software
+** bus routing information. This filename is used only when no filename is
+** specified in the command.
+**
+** \par Limits
+** The length of each string, including the NULL terminator cannot exceed the
+** #OS_MAX_PATH_LEN value.
+*/
+#define CFE_SB_DEFAULT_ROUTING_FILENAME "/ram/cfe_sb_route.dat"
+
+
+/**
+** \cfesbcfg Default Pipe Information Filename
+**
+** \par Description:
+** The value of this constant defines the filename used to store the software
+** bus pipe information. This filename is used only when no filename is
+** specified in the command.
+**
+** \par Limits
+** The length of each string, including the NULL terminator cannot exceed the
+** #OS_MAX_PATH_LEN value.
+*/
+#define CFE_SB_DEFAULT_PIPE_FILENAME "/ram/cfe_sb_pipe.dat"
+
+
+/**
+** \cfesbcfg Default Message Map Filename
+**
+** \par Description:
+** The value of this constant defines the filename used to store the software
+** bus message map information. This filename is used only when no filename is
+** specified in the command. The message map is a lookup table (array of 16bit
+** words) that has an element for each possible MsgId value and holds the
+** routing table index for that MsgId. The Msg Map provides fast access to the
+** destinations of a message.
+**
+** \par Limits
+** The length of each string, including the NULL terminator cannot exceed the
+** #OS_MAX_PATH_LEN value.
+*/
+#define CFE_SB_DEFAULT_MAP_FILENAME "/ram/cfe_sb_msgmap.dat"
+
+
+/**
+** \cfesbcfg SB Event Filtering
+**
+** \par Description:
+** This group of configuration paramters dictates what SB events will be
+** filtered through EVS. The filtering will begin after the SB task initializes
+** and stay in effect until a cmd to EVS changes it.
+** This allows the operator to set limits on the number of event messages that
+** are sent during system initialization.
+** NOTE: Set all unused event values and mask values to zero
+**
+** \par Limits
+** This filtering applies only to SB events.
+** These parameters have a lower limit of 0 and an upper limit of 65535.
+*/
+#define CFE_SB_FILTERED_EVENT1 CFE_SB_SEND_NO_SUBS_EID
+#define CFE_SB_FILTER_MASK1 CFE_EVS_FIRST_4_STOP
+
+#define CFE_SB_FILTERED_EVENT2 CFE_SB_DUP_SUBSCRIP_EID
+#define CFE_SB_FILTER_MASK2 CFE_EVS_FIRST_4_STOP
+
+#define CFE_SB_FILTERED_EVENT3 CFE_SB_MSGID_LIM_ERR_EID
+#define CFE_SB_FILTER_MASK3 CFE_EVS_FIRST_16_STOP
+
+#define CFE_SB_FILTERED_EVENT4 CFE_SB_Q_FULL_ERR_EID
+#define CFE_SB_FILTER_MASK4 CFE_EVS_FIRST_16_STOP
+
+#define CFE_SB_FILTERED_EVENT5 0
+#define CFE_SB_FILTER_MASK5 CFE_EVS_NO_FILTER
+
+#define CFE_SB_FILTERED_EVENT6 0
+#define CFE_SB_FILTER_MASK6 CFE_EVS_NO_FILTER
+
+#define CFE_SB_FILTERED_EVENT7 0
+#define CFE_SB_FILTER_MASK7 CFE_EVS_NO_FILTER
+
+#define CFE_SB_FILTERED_EVENT8 0
+#define CFE_SB_FILTER_MASK8 CFE_EVS_NO_FILTER
+
+
+/**
+** \cfeescfg Define SB Memory Pool Block Sizes
+**
+** \par Description:
+** Software Bus Memory Pool Block Sizes
+**
+** \par Limits
+** These sizes MUST be increasing and MUST be an integral multiple of 4.
+** The number of block sizes defined cannot exceed
+** #CFE_ES_MAX_MEMPOOL_BLOCK_SIZES
+*/
+#define CFE_SB_MEM_BLOCK_SIZE_01 8
+#define CFE_SB_MEM_BLOCK_SIZE_02 16
+#define CFE_SB_MEM_BLOCK_SIZE_03 20
+#define CFE_SB_MEM_BLOCK_SIZE_04 36
+#define CFE_SB_MEM_BLOCK_SIZE_05 64
+#define CFE_SB_MEM_BLOCK_SIZE_06 96
+#define CFE_SB_MEM_BLOCK_SIZE_07 128
+#define CFE_SB_MEM_BLOCK_SIZE_08 160
+#define CFE_SB_MEM_BLOCK_SIZE_09 256
+#define CFE_SB_MEM_BLOCK_SIZE_10 512
+#define CFE_SB_MEM_BLOCK_SIZE_11 1024
+#define CFE_SB_MEM_BLOCK_SIZE_12 2048
+#define CFE_SB_MEM_BLOCK_SIZE_13 4096
+#define CFE_SB_MEM_BLOCK_SIZE_14 8192
+#define CFE_SB_MEM_BLOCK_SIZE_15 16384
+#define CFE_SB_MEM_BLOCK_SIZE_16 32768
+#define CFE_SB_MAX_BLOCK_SIZE (CFE_SB_MAX_SB_MSG_SIZE + 40)
+
+/**
+** \cfesbcfg Define Default Sender Information Storage Mode
+**
+** \par Description:
+** Defines the default mode for the storing of sender information when sending
+** a software bus message. If set to 1, the sender information will be stored.
+** If set to 0, the sender information will not be stored.
+**
+** \par Limits
+** There is a lower limit of 0 and an upper limit of 1 on this configuration
+** paramater.
+*/
+#define CFE_SB_DEFAULT_REPORT_SENDER 1
+
+
+/**
+** \cfetimecfg Time Server or Time Client Selection
+**
+** \par Description:
+** This configuration parameter selects whether the Time task functions as a
+** time "server" or "client". A time server generates the "time at the tone"
+** packet which is received by time clients.
+**
+** \par Limits
+** Enable one, and only one by defining either CFE_TIME_CFG_SERVER or
+** CFE_TIME_CFG_CLIENT AS TRUE. The other must be defined as FALSE.
+*/
+#define CFE_TIME_CFG_SERVER TRUE
+#define CFE_TIME_CFG_CLIENT FALSE
+
+/**
+** \cfetimecfg Local MET or Virtual MET Selection for Time Servers
+**
+** \par Description:
+** Depending on the specific hardware system configuration, it may be possible
+** for Time Servers to read the "local" MET from a h/w register rather than
+** having to track the MET as the count of tone signal interrupts (virtual MET)
+**
+** Time Clients must be defined as using a virtual MET. Also, a Time Server
+** cannot be defined as having both a h/w MET and an external time source (they
+** both cannot synchronize to the same tone).
+**
+** Note: "disable" this define (set to FALSE) only for Time Servers with local hardware
+** that supports a h/w MET that is synchronized to the tone signal !!!
+**
+** \par Limits
+** Only applies if #CFE_TIME_CFG_SERVER is set to TRUE.
+*/
+#define CFE_TIME_CFG_VIRTUAL TRUE
+
+
+/**
+** \cfetimecfg Include or Exclude the Primary/Redundant Tone Selection Cmd
+**
+** \par Description:
+** Depending on the specific hardware system configuration, it may be possible
+** to switch between a primary and redundant tone signal. If supported by
+** hardware, this definitions will enable command interfaces to select the
+** active tone signal. Both Time Clients and Time Servers support this feature.
+** Note: Set the CFE_TIME_CFG_SIGNAL define to TRUE to enable tone signal commands.
+**
+** \par Limits
+** Not Applicable
+*/
+#define CFE_TIME_CFG_SIGNAL FALSE
+
+
+/**
+** \cfetimecfg Include or Exclude the Internal/External Time Source Selection Cmd
+**
+** \par Description:
+** By default, Time Servers maintain time using an internal MET which may be a
+** h/w register or software counter, depending on available hardware. The
+** following definition enables command interfaces to switch between an
+** internal MET, or external time data received from one of several supported
+** external time sources. Only a Time Server may be configured to use external
+** time data.
+** Note: Set the CFE_TIME_CFG_SOURCE define to TRUE to include the Time Source
+** Selection Command (command allows selection between the internal
+** or external time source). Then choose the external source with the
+** CFE_TIME_CFG_SRC_??? define.
+**
+** \par Limits
+** Only applies if #CFE_TIME_CFG_SERVER is set to TRUE.
+*/
+#define CFE_TIME_CFG_SOURCE FALSE
+
+
+/**
+** \cfetimecfg Choose the External Time Source for Server only
+**
+** \par Description:
+** If #CFE_TIME_CFG_SOURCE is set to TRUE, then one of the following external time
+** source types must also be set to TRUE. Do not set any of the external time
+** source types to TRUE unless #CFE_TIME_CFG_SOURCE is set to TRUE.
+**
+** \par Limits
+** -# If #CFE_TIME_CFG_SOURCE is set to TRUE then one and only one of the following
+** three external time sources can and must be set TRUE:
+** #CFE_TIME_CFG_SRC_MET, #CFE_TIME_CFG_SRC_GPS, #CFE_TIME_CFG_SRC_TIME
+** -# Only applies if #CFE_TIME_CFG_SERVER is set to TRUE.
+*/
+#define CFE_TIME_CFG_SRC_MET FALSE
+#define CFE_TIME_CFG_SRC_GPS FALSE
+#define CFE_TIME_CFG_SRC_TIME FALSE
+
+
+/**
+** \cfetimecfg Define the Max Delta Limits for Time Servers using an Ext Time Source
+**
+** \par Description:
+** If #CFE_TIME_CFG_SOURCE is set to TRUE and one of the external time sources is
+** also set to TRUE, then the delta time limits for range checking is used.
+**
+** When a new time value is received from an external source, the value is
+** compared against the "expected" time value. If the delta exceeds the
+** following defined amount, then the new time data will be ignored. This range
+** checking is only performed after the clock state has been commanded to
+** "valid". Until then, external time data is accepted unconditionally.
+**
+** \par Limits
+** Applies only if both #CFE_TIME_CFG_SERVER and #CFE_TIME_CFG_SOURCE are set
+** to TRUE.
+*/
+#define CFE_TIME_MAX_DELTA_SECS 0
+#define CFE_TIME_MAX_DELTA_SUBS 500000
+
+
+/**
+** \cfetimecfg Define the Local Clock Rollover Value in seconds and subseconds
+**
+** \par Description:
+** Specifies the capability of the local clock. Indicates the time at which
+** the local clock rolls over.
+**
+** \par Limits
+** Not Applicable
+*/
+#define CFE_TIME_MAX_LOCAL_SECS 27
+#define CFE_TIME_MAX_LOCAL_SUBS 0
+
+
+/**
+** \cfetimecfg Define Timing Limits From One Tone To The Next
+**
+** \par Description:
+** Defines limits to the timing of the 1Hz tone signal. A tone signal is valid
+** only if it arrives within one second (plus or minus the tone limit) from
+** the previous tone signal.Units are microseconds as measured with the local
+** clock.
+**
+** \par Limits
+** Not Applicable
+*/
+#define CFE_TIME_CFG_TONE_LIMIT 20000
+
+
+
+/**
+** \cfetimecfg Define Time to Start Flywheel Since Last Tone
+**
+** \par Description:
+** Define time to enter flywheel mode (in seconds since last tone data update)
+** Units are microseconds as measured with the local clock.
+**
+** \par Limits
+** Not Applicable
+*/
+#define CFE_TIME_CFG_START_FLY 2
+
+
+/**
+** \cfetimecfg Define Periodic Time to Update Local Clock Tone Latch
+**
+** \par Description:
+** Define Periodic Time to Update Local Clock Tone Latch. Applies only when
+** in flywheel mode. This define dicates the period at which the simulated
+** 'last tone' time is updated. Units are seconds.
+**
+** \par Limits
+** Not Applicable
+*/
+#define CFE_TIME_CFG_LATCH_FLY 8
+
+
+/**
+** \cfetimecfg Define Maximum number of Time Synchronization Callbacks allowed
+**
+** \par Description:
+** Define maximum number of Time Synchronization callback functions allowed.
+** Each callback is called whenever cFE TIME receives a valid time synchronization
+** signal (typically 1 Hz).
+**
+** \par Limits
+** Not Applicable
+*/
+#define CFE_TIME_MAX_NUM_SYNCH_FUNCS 4
+
+
+/**
+** \cfetimecfg Enable (or disable) the 1HZ time command packet
+**
+** \par Description:
+** Controls the generation of a packet that may be used as a 1HZ wakeup
+** signal for applications that subscribe to CFE_TIME_1HZ_CMD_MID.
+** Disable the packet to avoid 'no subscriber' errors that result from
+** sending a packet when there are no subscribers to the packet.
+**
+** \par Limits
+** Enable the 1HZ packet by setting #CFE_TIME_ENA_1HZ_CMD_PKT to TRUE.
+** Disable the 1HZ packet by setting #CFE_TIME_ENA_1HZ_CMD_PKT to FALSE.
+*/
+#define CFE_TIME_ENA_1HZ_CMD_PKT TRUE
+
+
+/**
+** \cfeescfg Define Max Number of Applications
+**
+** \par Description:
+** Defines the maximum number of applications that can be loaded into the
+** system. This number does not include child tasks.
+**
+** \par Limits
+** There is a lower limit of 6 and an upper limit of 64 on this configuration
+** paramater. The lower limit corresponds to the cFE internal applications.
+*/
+#define CFE_ES_MAX_APPLICATIONS 32
+
+
+/**
+** \cfeescfg Define Max Number of Shared libraries
+**
+** \par Description:
+** Defines the maximum number of cFE Shared libraries that can be loaded into
+** the system.
+**
+** \par Limits
+** There is a lower limit of 1 and an upper limit of 64 on this configuration
+** paramater.
+*/
+#define CFE_ES_MAX_LIBRARIES 10
+
+/**
+** \cfeescfg Define Max Number of ER (Exception and Reset) log entries
+**
+** \par Description:
+** Defines the maximum number of ER (Exception and Reset) log entries
+**
+** \par Limits
+** There is a lower limit of 10 and an upper limit of 128 on this configuration
+** paramater.
+*/
+#define CFE_ES_ER_LOG_ENTRIES 20
+
+/** \cfeescfg Maximum size of CPU Context in ES Error Log
+**
+** \par Description:
+** This should be large enough to accommodate the CPU context
+** information supplied by the PSP on the given platform.
+**
+** \par Limits:
+** Must be greater than zero and a multiple of sizeof(uint32).
+** Limited only by the available memory and the number of entries
+** in the error log. Any context information beyond this size will
+** be truncated.
+*/
+#define CFE_ES_ER_LOG_MAX_CONTEXT_SIZE 128
+
+
+/**
+** \cfeescfg Define Size of the cFE System Log.
+**
+** \par Description:
+** Defines the size in bytes of the cFE system log. The system log holds
+** variable length strings that are terminated by a linefeed and null
+** character.
+**
+** \par Limits
+** There is a lower limit of 512 and an upper limit of 16384 on this
+** configuration paramater.
+*/
+#define CFE_ES_SYSTEM_LOG_SIZE 3072
+
+
+/**
+** \cfeescfg Define Number of entries in the ES Object table
+**
+** \par Description:
+** Defines the number of entries in the ES Object table. This table controls
+** the core cFE startup.
+**
+** \par Limits
+** There is a lower limit of 15 and an upper limit of 50 on this configuration
+** paramater.
+*/
+#define CFE_ES_OBJECT_TABLE_SIZE 30
+
+
+/**
+** \cfeescfg Define Max Number of Generic Counters
+**
+** \par Description:
+** Defines the maximum number of Generic Counters that can be registered.
+**
+** \par Limits
+** This parameter has a lower limit of 1 and an upper limit of 65535.
+*/
+#define CFE_ES_MAX_GEN_COUNTERS 8
+
+
+/**
+** \cfeescfg Define ES Application Control Scan Rate
+**
+** \par Description:
+** ES Application Control Scan Rate. This parameter controls the speed that ES
+** scans the Application Table looking for App Delete/Restart/Reload requests.
+** All Applications are deleted, restarted, or reloaded by the ES Application.
+** ES will periodically scan for control requests to process. The scan rate is
+** controlled by this parameter, which is given in milliseconds. A value of
+** 1000 means that ES will scan the Application Table once per second. Be
+** careful not to set the value of this too low, because ES will use more CPU
+** cycles scanning the table.
+**
+** \par Limits
+** There is a lower limit of 100 and an upper limit of 20000 on this
+** configuration paramater. millisecond units.
+*/
+#define CFE_ES_APP_SCAN_RATE 1000
+
+
+/**
+** \cfeescfg Define ES Application Kill Timeout
+**
+** \par Description:
+** ES Application Kill Timeout. This parameter controls the number of
+** "scan periods" that ES will wait for an application to Exit after getting
+** the signal Delete, Reload or Restart. The sequence works as follows:
+** -# ES will set the control request for an App to Delete/Restart/Reload and
+** set this kill timer to the value in this parameter.
+** -# If the App is reponding and Calls it's RunLoop function, it will drop out
+** of it's main loop and call CFE_ES_ExitApp. Once it calls Exit App, then
+** ES can delete, restart, or reload the app the next time it scans the app
+** table.
+** -# If the App is not responding, the ES App will decrement this Kill Timeout
+** value each time it runs. If the timeout value reaches zero, ES will kill
+** the app.
+**
+** The Kill timeout value depends on the #CFE_ES_APP_SCAN_RATE. If the Scan Rate
+** is 1000, or 1 second, and this #CFE_ES_APP_KILL_TIMEOUT is set to 5, then it
+** will take 5 seconds to kill a non-responding App.
+** If the Scan Rate is 250, or 1/4 second, and the #CFE_ES_APP_KILL_TIMEOUT is
+** set to 2, then it will take 1/2 second to time out.
+**
+** \par Limits
+** There is a lower limit of 1 and an upper limit of 100 on this configuration
+** paramater. Units are number of #CFE_ES_APP_SCAN_RATE cycles.
+*/
+#define CFE_ES_APP_KILL_TIMEOUT 5
+
+
+/**
+** \cfeescfg ES Ram Disk Sector Size
+**
+** \par Description:
+** Defines the ram disk sector size. The ram disk is 1 of 4 memory areas that
+** are preserved on a processor reset.
+** NOTE: Changing this value changes memory allocation, and may
+** require changes to platform specific values (in CFE_PSP) such as
+** USER_RESERVED_MEM in VxWorks depending on the memory areas
+** being used for preserved data and on OS specific behavior.
+**
+** \par Limits
+** There is a lower limit of 128 and an upper limit of 4096 on this
+** configuration paramater.
+*/
+#define CFE_ES_RAM_DISK_SECTOR_SIZE 512
+
+
+/**
+** \cfeescfg ES Ram Disk Number of Sectors
+**
+** \par Description:
+** Defines the ram disk number of sectors. The ram disk is one of four memory
+** areas that are preserved on a processor reset.
+** NOTE: Changing this value changes memory allocation, and may
+** require changes to platform specific values (in CFE_PSP) such as
+** USER_RESERVED_MEM in VxWorks depending on the memory areas
+** being used for preserved data and on OS specific behavior.
+**
+** \par Limits
+** There is a lower limit of 128 and an upper limit of 8192 on this
+** configuration paramater.
+*/
+#define CFE_ES_RAM_DISK_NUM_SECTORS 4096
+
+/**
+** \cfeescfg Percentage of Ram Disk Reserved for Decompressing Apps
+**
+** \par Description:
+** The #CFE_ES_RAM_DISK_PERCENT_RESERVED parameter is used to make sure that the
+** Volatile ( RAM ) Disk has a defined amount of free space during a processor
+** reset. The cFE uses the Volatile disk to decompress cFE applications during
+** system startup. If this Volatile disk happens to get filled with logs and
+** misc files, then a processor reset may not work, because there will be no
+** room to decompress cFE apps. To solve that problem, this parameter sets the
+** "Low Water Mark" for disk space on a Processor reset. It should be set to
+** allow the largest cFE Application to be decompressed.
+** During a Processor reset, if there is not sufficient space left on the disk,
+** it will be re-formatted in order to clear up some space.
+**
+** This feature can be turned OFF by setting the parameter to 0.
+**
+** \par Limits
+** There is a lower limit of 0 and an upper limit of 75 on this configuration
+** paramater.Units are percentage. A setting of zero will turn this feature
+** off.
+*/
+#define CFE_ES_RAM_DISK_PERCENT_RESERVED 30
+
+
+/**
+** \cfeescfg RAM Disk Mount string
+**
+** \par Description:
+** The #CFE_ES_RAM_DISK_MOUNT_STRING parameter is used to set the cFE mount path
+** for the CFE RAM disk. This is a parameter for missions that do not want to
+** use the default value of "/ram", or for missions that need to have a different
+** value for different CPUs or Spacecraft.
+** Note that the vxWorks OSAL cannot currently handle names that have more than one
+** path separator in it. The names "/ram", "/ramdisk", "/disk123" will all work, but
+** "/disks/ram" will not.
+** Multiple separators can be used with the posix or RTEMS ports.
+**
+*/
+#define CFE_ES_RAM_DISK_MOUNT_STRING "/ram"
+
+
+/**
+** \cfeescfg Define Critical Data Store Size
+**
+** \par Description:
+** Defines the Critical Data Store (CDS) area size in bytes size. The CDS is
+** one of four memory areas that are preserved during a processor reset.
+** NOTE: Changing this value changes memory allocation, and may
+** require changes to platform specific values (in CFE_PSP) such as
+** USER_RESERVED_MEM in VxWorks depending on the memory areas
+** being used for preserved data and on OS specific behavior.
+**
+** \par Limits
+** There is a lower limit of 8192 and an upper limit of 2097152 (2MBytes) on
+** this configuration paramater.
+*/
+#define CFE_ES_CDS_SIZE ( 128 * 1024 )
+
+
+/**
+** \cfeescfg Define User Reserved Memory Size
+**
+** \par Description:
+** User Reserved Memory Size. This is the size in bytes of the cFE User
+** reserved Memory area. This is a block of memory that is available for cFE
+** application use. The address is obtained by calling
+** #CFE_PSP_GetUserReservedArea. The User Reserved Memory is one of four memory
+** areas that are preserved during a processor reset.
+** NOTE: Changing this value changes memory allocation, and may
+** require changes to platform specific values (in CFE_PSP) such as
+** USER_RESERVED_MEM in VxWorks depending on the memory areas
+** being used for preserved data and on OS specific behavior.
+**
+** \par Limits
+** There is a lower limit of 1024 and an upper limit of 33554432 (32Mbytes) on
+** this configuration paramater.
+*/
+#define CFE_ES_USER_RESERVED_SIZE ( 1024 * 1024 )
+
+
+/**
+** \cfeescfg Define ES Reset Area Size
+**
+** \par Description:
+** The ES Reset Area Size. This is the size in bytes of the cFE Reset variable
+** and log area. This is a block of memory used by the cFE to store the system
+** log ER Log and critical reset variables. This is 4 of 4 of the memory areas
+** that are preserved during a processor reset.
+** Note: This area must be sized large enough to hold all of the data
+** structures. It should be automatically sized based on the #CFE_ES_ResetData_t
+** type, but circular dependancies in the headers prevent it from being defined
+** this way.
+** NOTE: Changing this value changes memory allocation, and may
+** require changes to platform specific values (in CFE_PSP) such as
+** USER_RESERVED_MEM in VxWorks depending on the memory areas
+** being used for preserved data and on OS specific behavior.
+**
+** \par Limits
+** There is a lower limit of 153600 (150KBytes) and an upper limit of 2097152
+** (2MBytes) on this configuration paramater.
+*/
+#define CFE_ES_RESET_AREA_SIZE ( 170 * 1024 )
+
+/**
+** \cfeescfg Define Default Memory Pool Alignment Mode
+**
+** \par Description:
+** Defines the default mode for the requirement to align ES Mempool buffer.
+** If this define is set, the memory pool must be aligned or the call to
+** create a new memory pool will be rejected with a CFE_ES_BAD_ARGUMENT
+** return code.
+**
+** \par Limits
+** If CFE_ES_MEMPOOL_ALIGNED is defined, the alignment check is enabled.
+** If CFE_ES_MEMPOOL_ALIGNED is not defined, the alignment check is not
+** compiled in.
+*/
+#define CFE_ES_MEMPOOL_ALIGNED 1
+
+/**
+** \cfeescfg ES Nonvolatile Startup Filename
+**
+** \par Description:
+** The value of this constant defines the path and name of the file that
+** contains a list of modules that will be loaded and started by the cFE after
+** the cFE finishes its startup sequence.
+**
+** \par Limits
+** The length of each string, including the NULL terminator cannot exceed the
+** #OS_MAX_PATH_LEN value.
+*/
+#define CFE_ES_NONVOL_STARTUP_FILE "/cf/apps/cfe_es_startup.scr"
+
+
+/**
+** \cfeescfg ES Volatile Startup Filename
+**
+** \par Description:
+** The value of this constant defines the path and name of the file that
+** contains a list of modules that will be loaded and started by the cFE after
+** the cFE finishes its startup sequence.
+**
+** \par Limits
+** The length of each string, including the NULL terminator cannot exceed the
+** #OS_MAX_PATH_LEN value.
+*/
+#define CFE_ES_VOLATILE_STARTUP_FILE "/ram/apps/cfe_es_startup.scr"
+
+/**
+** \cfeescfg Default Shell Filename
+**
+** \par Description:
+** The value of this constant defines the filename used to store the shell
+** output after a shell command is received by ES. This file contains the
+** entire shell output. The fsw also sends the shell output in series of fixed
+** size telemetry packets. This filename is used only when no filename
+** is specified in the shell command.
+**
+** \par Limits
+** The length of each string, including the NULL terminator cannot exceed the
+** #OS_MAX_PATH_LEN value.
+*/
+#define CFE_ES_DEFAULT_SHELL_FILENAME "/ram/ShellCmd.out"
+
+
+/**
+** \cfeescfg Define Max Shell Command Size
+**
+** \par Description:
+** Defines the maximum size in characters of the shell command.
+**
+** \par Limits
+** There is a lower limit of 64 and an upper limit of 128 on this configuration
+** paramater. Units are characters.
+*/
+#define CFE_ES_MAX_SHELL_CMD 64
+
+
+/**
+** \cfeescfg Define Shell Command Telemetry Pkt Segment Size
+**
+** \par Description:
+** Defines the size of the shell command tlm packet segments.The shell command
+** output size is dependant on the shell command itself. If the shell output
+** size is greater than the size of the packet defined here, the fsw will
+** generate a series of tlm packets (of the size defined here) that can be
+** reconstructed by the ground system.
+**
+** \par Limits
+** There is a lower limit of 32 and an upper limit of 128 on this configuration
+** paramater.
+*/
+#define CFE_ES_MAX_SHELL_PKT 64
+
+
+/**
+** \cfeescfg Default Application Information Filename
+**
+** \par Description:
+** The value of this constant defines the filename used to store information
+** pertaining to all of the Applications that are registered with Executive
+** Services. This filename is used only when no filename is specified in the
+** the command to query all system apps.
+**
+** \par Limits
+** The length of each string, including the NULL terminator cannot exceed the
+** #OS_MAX_PATH_LEN value.
+*/
+#define CFE_ES_DEFAULT_APP_LOG_FILE "/ram/cfe_es_app_info.log"
+
+/**
+** \cfeescfg Default Application Information Filename
+**
+** \par Description:
+** The value of this constant defines the filename used to store information
+** pertaining to all of the Applications that are registered with Executive
+** Services. This filename is used only when no filename is specified in the
+** the command to query all system tasks.
+**
+** \par Limits
+** The length of each string, including the NULL terminator cannot exceed the
+** #OS_MAX_PATH_LEN value.
+*/
+#define CFE_ES_DEFAULT_TASK_LOG_FILE "/ram/cfe_es_task_info.log"
+
+/**
+** \cfeescfg Default System Log Filename
+**
+** \par Description:
+** The value of this constant defines the filename used to store important
+** information (as ASCII text strings) that might not be able to be sent in an
+** Event Message. This filename is used only when no filename is specified in
+** the command to dump the system log. No file specified in the cmd means the
+** first character in the cmd filename is a NULL terminator (zero).
+**
+** \par Limits
+** The length of each string, including the NULL terminator cannot exceed the
+** #OS_MAX_PATH_LEN value.
+*/
+#define CFE_ES_DEFAULT_SYSLOG_FILE "/ram/cfe_es_syslog.log"
+
+/**
+** \cfeescfg Default Exception and Reset (ER) Log Filename
+**
+** \par Description:
+** The value of this constant defines the filename used to store the
+** Exception and Reset (ER) Log. This filename is used only when no filename is
+** specified in the command to dump the ER log. No file specified in the cmd
+** means the first character in the cmd filename is a NULL terminator (zero).
+**
+** \par Limits
+** The length of each string, including the NULL terminator cannot exceed the
+** #OS_MAX_PATH_LEN value.
+*/
+#define CFE_ES_DEFAULT_ER_LOG_FILE "/ram/cfe_erlog.log"
+
+/**
+** \cfeescfg Default Performance Data Filename
+**
+** \par Description:
+** The value of this constant defines the filename used to store the
+** Performance Data. This filename is used only when no filename is specified
+** in the command to stop performance data collecting.
+**
+** \par Limits
+** The length of each string, including the NULL terminator cannot exceed the
+** #OS_MAX_PATH_LEN value.
+*/
+#define CFE_ES_DEFAULT_PERF_DUMP_FILENAME "/ram/cfe_es_perf.dat"
+
+
+/**
+** \cfeescfg Default Critical Data Store Registry Filename
+**
+** \par Description:
+** The value of this constant defines the filename used to store the
+** Critical Data Store Registry. This filename is used only when no filename is
+** specified in the command to stop performance data collecting.
+**
+** \par Limits
+** The length of each string, including the NULL terminator cannot exceed the
+** #OS_MAX_PATH_LEN value.
+*/
+#define CFE_ES_DEFAULT_CDS_REG_DUMP_FILE "/ram/cfe_cds_reg.log"
+
+/**
+** \cfeescfg Define Default System Log Mode
+**
+** \par Description:
+** Defines the default mode for the operation of the ES System log. The log may
+** operate in either Overwrite mode = 0, where once the log becomes full the
+** oldest message in the log will be overwritten, or Discard mode = 1, where
+** once the log becomes full the contents of the log are preserved and the new
+** event is discarded. This constant may hold a value of either 0 or 1
+** depending on the desired default log mode. Overwrite Mode = 0, Discard
+** Mode = 1.
+**
+** \par Limits
+** There is a lower limit of 0 and an upper limit of 1 on this configuration
+** paramater.
+*/
+#define CFE_ES_DEFAULT_SYSLOG_MODE 1
+
+/**
+** \cfeescfg Define Max Number of Performance IDs
+**
+** \par Description:
+** Defines the maximum number of perf ids allowed.
+**
+**
+** \par Limits
+** This number must always be divisible by 32. There is a lower limit of 32 and
+** an upper limit of 512 on this configuration paramater.
+*/
+#define CFE_ES_PERF_MAX_IDS 128
+
+/**
+** \cfeescfg Define Max Size of Performance Data Buffer
+**
+** \par Description:
+** Defines the maximum size of the performance data buffer. Units are number of
+** performance data entries. An entry is defined by a 32 bit data word followed
+** by a 64 bit time stamp.
+**
+** \par Limits
+** There is a lower limit of 1025 and an upper limit of 1048576 (1 Meg) on this
+** configuration paramater. The units are number of entries. An entry is
+** defined by a 32 bit data word followed by a 64 bit time stamp.
+*/
+#define CFE_ES_PERF_DATA_BUFFER_SIZE 10000
+
+
+/**
+** \cfeescfg Define Filter Mask Setting for Disabling All Performance Entries
+**
+** \par Description:
+** Defines the filter mask for disabling all performance entries. The value is a
+** bit mask. For each bit, 0 means the corresponding entry is disabled and
+** 1 means it is enabled.
+*/
+#define CFE_ES_PERF_FILTMASK_NONE 0
+
+/**
+** \cfeescfg Define Filter Mask Setting for Enabling All Performance Entries
+**
+** \par Description:
+** Defines the filter mask for enabling all performance entries. The value is a
+** bit mask. For each bit, 0 means the corresponding entry is disabled and
+** 1 means it is enabled.
+*/
+#define CFE_ES_PERF_FILTMASK_ALL ~CFE_ES_PERF_FILTMASK_NONE
+
+/**
+** \cfeescfg Define Default Filter Mask Setting for Performance Data Buffer
+**
+** \par Description:
+** Defines the default filter mask for the performance data buffer. The value is a
+** bit mask. For each bit, 0 means the corresponding entry is disabled and 1
+** means it is enabled.
+**
+*/
+#define CFE_ES_PERF_FILTMASK_INIT CFE_ES_PERF_FILTMASK_ALL
+
+
+/**
+** \cfeescfg Define Default Filter Trigger Setting for Disabling All Performance Entries
+**
+** \par Description:
+** Defines the default trigger mask for disabling all performance data entries. The value
+** is a bit mask. For each bit, 0 means the trigger for the corresponding entry is
+** disabled and 1 means it is enabled.
+**
+*/
+#define CFE_ES_PERF_TRIGMASK_NONE 0
+
+/**
+** \cfeescfg Define Filter Trigger Setting for Enabling All Performance Entries
+**
+** \par Description:
+** Defines the trigger mask for enabling all performance data entries. The value is
+** a bit mask. For each bit, 0 means the trigger for the corresponding entry is
+** disabled and 1 means it is enabled.
+**
+*/
+#define CFE_ES_PERF_TRIGMASK_ALL ~CFE_ES_PERF_TRIGMASK_NONE
+
+/**
+** \cfeescfg Define Default Filter Trigger Setting for Performance Data Buffer
+**
+** \par Description:
+** Defines the default trigger mask for the performance data buffer. The value is a
+** 32-bit mask. For each bit, 0 means the trigger for the corresponding entry is
+** disabled and 1 means it is enabled.
+**
+*/
+#define CFE_ES_PERF_TRIGMASK_INIT CFE_ES_PERF_TRIGMASK_NONE
+
+/**
+** \cfeescfg Define Performance Analyzer Child Task Priority
+**
+** \par Description:
+** This parameter defines the priority of the child task spawed by the
+** Executive Services to write performance data to a file. Lower numbers
+** are higher priority, with 1 being the highest priority in the case of a
+** child task.
+**
+** \par Limits
+** Valid range for a child task is 1 to 255 however, the priority cannot
+** be higher (lower number) than the ES parent application priority.
+*/
+//#define CFE_ES_PERF_CHILD_PRIORITY 205
+
+/**
+** \cfeescfg Define Performance Analyzer Child Task Stack Size
+**
+** \par Description:
+** This parameter defines the stack size of the child task spawed by the
+** Executive Services to write performance data to a file.
+**
+** \par Limits
+** It is recommended this parameter be greater than or equal to 4KB. This parameter
+** is limited by the maximum value allowed by the data type. In this case, the data
+** type is an unsigned 32-bit integer, so the valid range is 0 to 0xFFFFFFFF.
+*/
+#define CFE_ES_PERF_CHILD_STACK_SIZE 4096
+
+/**
+** \cfeescfg Define Performance Analyzer Child Task Delay
+**
+** \par Description:
+** This parameter defines the delay time (in milliseconds) between performance
+** data file writes performed by the Executive Services Performace Analyzer
+** Child Task.
+**
+** \par Limits
+** It is recommended this parameter be greater than or equal to 20ms. This parameter
+** is limited by the maximum value allowed by the data type. In this case, the data
+** type is an unsigned 32-bit integer, so the valid range is 0 to 0xFFFFFFFF.
+*/
+#define CFE_ES_PERF_CHILD_MS_DELAY 20
+
+/**
+** \cfeescfg Define Performance Analyzer Child Task Number of Entries Between Delay
+**
+** \par Description:
+** This parameter defines the number of performace analyzer entries the Performace
+** Analyzer Child Task will write to the file between delays.
+**
+*/
+#define CFE_ES_PERF_ENTRIES_BTWN_DLYS 50
+
+/**
+** \cfeescfg Define Default Stack Size for an Application
+**
+** \par Description:
+** This parameter defines a default stack size. This parameter is used by the
+** cFE Core Applications.
+**
+** \par Limits
+** There is a lower limit of 2048 and an upper limit of 16384 on this
+** configuration paramater.
+*/
+#define CFE_ES_DEFAULT_STACK_SIZE 8192
+
+/**
+** \cfeescfg Define cFE Core Exception Function
+**
+** \par Description:
+** This parameter defines the function-to-call when an exception occurs in
+** the cFE core.
+**
+** \par Limits
+** Must be a valid function name.
+*/
+#define CFE_ES_EXCEPTION_FUNCTION CFE_ES_ProcessCoreException
+
+/**
+** \cfeescfg Define EVS Task Priority
+**
+** \par Description:
+** Defines the cFE_EVS Task priority.
+**
+** \par Limits
+** Not Applicable
+*/
+//#define CFE_EVS_START_TASK_PRIORITY 61
+
+/**
+** \cfeescfg Define EVS Task Stack Size
+**
+** \par Description:
+** Defines the cFE_EVS Task Stack Size
+**
+** \par Limits
+** There is a lower limit of 2048 and an upper limit of 16384 on this
+** configuration paramater.
+*/
+#define CFE_EVS_START_TASK_STACK_SIZE CFE_ES_DEFAULT_STACK_SIZE
+
+/**
+** \cfeescfg Define SB Task Priority
+**
+** \par Description:
+** Defines the cFE_SB Task priority.
+**
+** \par Limits
+** Not Applicable
+*/
+//#define CFE_SB_START_TASK_PRIORITY 64
+
+/**
+** \cfeescfg Define SB Task Stack Size
+**
+** \par Description:
+** Defines the cFE_SB Task Stack Size
+**
+** \par Limits
+** There is a lower limit of 2048 and an upper limit of 16384 on this
+** configuration paramater.
+*/
+#define CFE_SB_START_TASK_STACK_SIZE CFE_ES_DEFAULT_STACK_SIZE
+
+/**
+** \cfeescfg Define ES Task Priority
+**
+** \par Description:
+** Defines the cFE_ES Task priority.
+**
+** \par Limits
+** Not Applicable
+*/
+//#define CFE_ES_START_TASK_PRIORITY 68
+
+/**
+** \cfeescfg Define ES Task Stack Size
+**
+** \par Description:
+** Defines the cFE_ES Task Stack Size
+**
+** \par Limits
+** There is a lower limit of 2048 and an upper limit of 16384 on this
+** configuration paramater.
+*/
+#define CFE_ES_START_TASK_STACK_SIZE 16384
+
+/**
+** \cfetimecfg Define TIME Task Priorities
+**
+** \par Description:
+** Defines the cFE_TIME Task priority.
+** Defines the cFE_TIME Tone Task priority.
+** Defines the cFE_TIME 1HZ Task priority.
+**
+** \par Limits
+** There is a lower limit of zero and an upper limit of 255 on these
+** configuration paramaters. Remember that the meaning of each task
+** priority is inverted -- a "lower" number has a "higher" priority.
+*/
+//#define CFE_TIME_START_TASK_PRIORITY 60
+//#define CFE_TIME_TONE_TASK_PRIORITY 25
+//#define CFE_TIME_1HZ_TASK_PRIORITY 28
+
+/**
+** \cfetimecfg Define TIME Task Stack Sizes
+**
+** \par Description:
+** Defines the cFE_TIME Main Task Stack Size
+** Defines the cFE_TIME Tone Task Stack Size
+** Defines the cFE_TIME 1HZ Task Stack Size
+**
+** \par Limits
+** There is a lower limit of 2048 and an upper limit of 16384 on these
+** configuration paramaters.
+*/
+#define CFE_TIME_START_TASK_STACK_SIZE CFE_ES_DEFAULT_STACK_SIZE
+#define CFE_TIME_TONE_TASK_STACK_SIZE 4096
+#define CFE_TIME_1HZ_TASK_STACK_SIZE 8192
+
+/**
+** \cfeescfg Define TBL Task Priority
+**
+** \par Description:
+** Defines the cFE_TBL Task priority.
+**
+** \par Limits
+** Not Applicable
+*/
+//#define CFE_TBL_START_TASK_PRIORITY 70
+
+/**
+** \cfeescfg Define TBL Task Stack Size
+**
+** \par Description:
+** Defines the cFE_TBL Task Stack Size
+**
+** \par Limits
+** There is a lower limit of 2048 and an upper limit of 16384 on this
+** configuration paramater.
+*/
+#define CFE_TBL_START_TASK_STACK_SIZE CFE_ES_DEFAULT_STACK_SIZE
+
+/**
+** \cfeescfg Define Maximum Number of Registered CDS Blocks
+**
+** \par Description:
+** Maximum number of registered CDS Blocks
+**
+** \par Limits
+** There is a lower limit of 8 and an upper limit of 32767 on this configuration
+** paramater.
+*/
+#define CFE_ES_CDS_MAX_NUM_ENTRIES 512
+
+
+/**
+** \cfeescfg Define Number of Processor Resets Before a Power On Reset
+**
+** \par Description:
+** Number of Processor Resets before a Power On Reset is called. If set to 2,
+** then 2 processor resets will occur, and the 3rd processor reset will be a
+** power on reset instead.
+**
+** \par Limits
+** There is a lower limit of 0 and an upper limit of 1024 on this configuration
+** paramater.
+*/
+#define CFE_ES_MAX_PROCESSOR_RESETS 2
+
+
+/**
+** \cfeescfg Define Default ES Memory Pool Block Sizes
+**
+** \par Description:
+** Default Intermediate ES Memory Pool Block Sizes. If an application
+** is using the CFE_ES Memory Pool APIs (#CFE_ES_PoolCreate, #CFE_ES_PoolCreateNoSem,
+** #CFE_ES_GetPoolBuf and #CFE_ES_PutPoolBuf) but finds these sizes
+** inappropriate for their use, they may wish to use the #CFE_ES_PoolCreateEx
+** API to specify their own intermediate block sizes
+**
+** \par Limits
+** These sizes MUST be increasing and MUST be an integral multiple of 4. Also,
+** CFE_ES_MAX_BLOCK_SIZE must be larger than CFE_SB_MAX_SB_MSG_SIZE and both
+** CFE_TBL_MAX_SNGL_TABLE_SIZE and CFE_TBL_MAX_DBL_TABLE_SIZE. Note that if Table
+** Services have been removed from the CFE, the table size limits are still
+** enforced although the table size definitions may be reduced. Refer to the CFS
+** Deployment Guide for information about removing CFE Table Services from the CFE.
+*/
+#define CFE_ES_MEM_BLOCK_SIZE_01 8
+#define CFE_ES_MEM_BLOCK_SIZE_02 16
+#define CFE_ES_MEM_BLOCK_SIZE_03 32
+#define CFE_ES_MEM_BLOCK_SIZE_04 48
+#define CFE_ES_MEM_BLOCK_SIZE_05 64
+#define CFE_ES_MEM_BLOCK_SIZE_06 96
+#define CFE_ES_MEM_BLOCK_SIZE_07 128
+#define CFE_ES_MEM_BLOCK_SIZE_08 160
+#define CFE_ES_MEM_BLOCK_SIZE_09 256
+#define CFE_ES_MEM_BLOCK_SIZE_10 512
+#define CFE_ES_MEM_BLOCK_SIZE_11 1024
+#define CFE_ES_MEM_BLOCK_SIZE_12 2048
+#define CFE_ES_MEM_BLOCK_SIZE_13 4096
+#define CFE_ES_MEM_BLOCK_SIZE_14 8192
+#define CFE_ES_MEM_BLOCK_SIZE_15 16384
+#define CFE_ES_MEM_BLOCK_SIZE_16 32768
+#define CFE_ES_MAX_BLOCK_SIZE 80000
+
+
+/**
+** \cfeescfg Define ES Critical Data Store Memory Pool Block Sizes
+**
+** \par Description:
+** Intermediate ES Critical Data Store Memory Pool Block Sizes
+**
+** \par Limits
+** These sizes MUST be increasing and MUST be an integral multiple of 4.
+*/
+#define CFE_ES_CDS_MEM_BLOCK_SIZE_01 8
+#define CFE_ES_CDS_MEM_BLOCK_SIZE_02 16
+#define CFE_ES_CDS_MEM_BLOCK_SIZE_03 32
+#define CFE_ES_CDS_MEM_BLOCK_SIZE_04 48
+#define CFE_ES_CDS_MEM_BLOCK_SIZE_05 64
+#define CFE_ES_CDS_MEM_BLOCK_SIZE_06 96
+#define CFE_ES_CDS_MEM_BLOCK_SIZE_07 128
+#define CFE_ES_CDS_MEM_BLOCK_SIZE_08 160
+#define CFE_ES_CDS_MEM_BLOCK_SIZE_09 256
+#define CFE_ES_CDS_MEM_BLOCK_SIZE_10 512
+#define CFE_ES_CDS_MEM_BLOCK_SIZE_11 1024
+#define CFE_ES_CDS_MEM_BLOCK_SIZE_12 2048
+#define CFE_ES_CDS_MEM_BLOCK_SIZE_13 4096
+#define CFE_ES_CDS_MEM_BLOCK_SIZE_14 8192
+#define CFE_ES_CDS_MEM_BLOCK_SIZE_15 16384
+#define CFE_ES_CDS_MEM_BLOCK_SIZE_16 32768
+#define CFE_ES_CDS_MAX_BLOCK_SIZE 80000
+
+
+
+/**
+** \cfeevscfg Define Maximum Number of Event Filters per Application
+**
+** \par Description:
+** Maximum number of events that may be filtered per application.
+**
+** \par Limits
+** There is an upper limit of 32767 on this configuration paramater.
+*/
+#define CFE_EVS_MAX_EVENT_FILTERS 8
+
+
+/**
+** \cfeevscfg Enable or Disable EVS Local Event Log
+**
+** \par Description:
+** The CFE_EVS_LOG_ON configuration parameter must be defined to enable EVS
+** event logging. In order to disable the local event log this definition needs
+** to be commented out.
+**
+** \par Limits
+** Not Applicable
+*/
+#define CFE_EVS_LOG_ON
+
+
+/**
+** \cfeevscfg Default Event Log Filename
+**
+** \par Description:
+** The value of this constant defines the filename used to store the Event
+** Services local event log. This filename is used only when no filename is
+** specified in the command to dump the event log.
+**
+** \par Limits
+** The length of each string, including the NULL terminator cannot exceed the
+** #OS_MAX_PATH_LEN value.
+*/
+#define CFE_EVS_DEFAULT_LOG_FILE "/ram/cfe_evs.log"
+
+
+/**
+** \cfeevscfg Maximum Number of Events in EVS Local Event Log
+**
+** \par Description:
+** Dictates the EVS local event log capacity. Units are the number of events.
+**
+** \par Limits
+** There is an upper limit of 65535 on this configuration paramater.
+*/
+#define CFE_EVS_LOG_MAX 20
+
+
+/**
+** \cfeevscfg Default EVS Application Data Filename
+**
+** \par Description:
+** The value of this constant defines the filename used to store the EVS
+** Application Data(event counts/filtering information). This filename is
+** used only when no filename is specified in the command to dump the event
+** log.
+**
+** \par Limits
+** The length of each string, including the NULL terminator cannot exceed the
+** #OS_MAX_PATH_LEN value.
+*/
+#define CFE_EVS_DEFAULT_APP_DATA_FILE "/ram/cfe_evs_app.dat"
+
+
+/**
+** \cfeevscfg Default EVS Output Port State
+**
+** \par Description:
+** Defines the default port state (enabled or deisabled) for the four output
+** ports defined within the Event Service. Port 1 is usually the uart output
+** terminal. To enable a port, set the proper bit to a 1. Bit 0 is port 1,
+** bit 1 is port2 etc.
+**
+** \par Limits
+** The valid settings are 0x0 to 0xF.
+*/
+#define CFE_EVS_PORT_DEFAULT 0x0001
+
+
+/**
+** \cfeevscfg Default EVS Event Type Filter Mask
+**
+** \par Description:
+** Defines a state of on or off for all four event types. The term event
+** 'type' refers to the criticality level and may be Debug, Informational,
+** Error or Critical. Each event type has a bit position. (bit 0 = Debug,
+** bit 1 = Info, bit 2 = Error, bit 3 = Critical). This is a global setting,
+** meaning it applies to all applications. To filter an event type, set its
+** bit to zero. For example,
+** 0xE means Debug = OFF, Info = ON, Error = ON, Critical = ON
+**
+** \par Limits
+** The valid settings are 0x0 to 0xF.
+*/
+#define CFE_EVS_DEFAULT_TYPE_FLAG 0xE
+
+
+
+/**
+** \cfeevscfg Default EVS Local Event Log Mode
+**
+** \par Description:
+** Defines a state of overwrite(0) or discard(1) for the operation of the
+** EVS local event log. The log may operate in either Overwrite mode = 0,
+** where once the log becomes full the oldest event in the log will be
+** overwritten, or Discard mode = 1, where once the log becomes full the
+** contents of the log are preserved and the new event is discarded.
+** Overwrite Mode = 0, Discard Mode = 1.
+**
+** \par Limits
+** The valid settings are 0 or 1
+*/
+#define CFE_EVS_DEFAULT_LOG_MODE 1
+
+
+/**
+** \cfeevscfg Default EVS Message Format Mode
+**
+** \par Description:
+** Defines the default message format (long or short) for event messages being
+** sent to the ground. Choose between #CFE_EVS_LONG_FORMAT or
+** #CFE_EVS_SHORT_FORMAT.
+**
+** \par Limits
+** The valid settings are #CFE_EVS_LONG_FORMAT or #CFE_EVS_SHORT_FORMAT
+*/
+#define CFE_EVS_DEFAULT_MSG_FORMAT_MODE CFE_EVS_LONG_FORMAT
+
+
+
+/* Platform Configuration Parameters for Table Service (TBL) */
+
+/**
+** \cfetblcfg Size of Table Services Table Memory Pool
+**
+** \par Description:
+** Defines the TOTAL size of the memory pool that cFE Table Services allocates
+** from the system. The size must be large enough to provide memory for each
+** registered table, the inactive buffers for double buffered tables and for
+** the shared inactive buffers for single buffered tables.
+**
+** \par Limits
+** The cFE does not place a limit on the size of this parameter.
+*/
+#define CFE_TBL_BUF_MEMORY_BYTES 524288
+
+/**
+** \cfetblcfg Maximum Size Allowed for a Double Buffered Table
+**
+** \par Description:
+** Defines the maximum allowed size (in bytes) of a double buffered table.
+**
+** \par Limits
+** The cFE does not place a limit on the size of this parameter but it must be
+** less than half of #CFE_TBL_BUF_MEMORY_BYTES.
+*/
+#define CFE_TBL_MAX_DBL_TABLE_SIZE 16384
+
+/**
+** \cfetblcfg Maximum Size Allowed for a Single Buffered Table
+**
+** \par Description:
+** Defines the maximum allowed size (in bytes) of a single buffered table.
+** \b NOTE: This size determines the size of all shared table buffers.
+** Therefore, this size will be multiplied by #CFE_TBL_MAX_SIMULTANEOUS_LOADS
+** below when allocating memory for shared tables.
+**
+** \par Limits
+** The cFE does not place a limit on the size of this parameter but it must be
+** small enough to allow for #CFE_TBL_MAX_SIMULTANEOUS_LOADS number of tables
+** to fit into #CFE_TBL_BUF_MEMORY_BYTES.
+*/
+#define CFE_TBL_MAX_SNGL_TABLE_SIZE 16384
+
+/**
+** \cfetblcfg Maximum Number of Tables Allowed to be Registered
+**
+** \par Description:
+** Defines the maximum number of tables supported by this processor's Table Services.
+**
+** \par Limits
+** This number must be less than 32767. It should be recognized that this parameter
+** determines the size of the Table Registry. An excessively high number will waste
+** memory.
+*/
+#define CFE_TBL_MAX_NUM_TABLES 128
+
+/**
+** \cfetblcfg Maximum Number of Critical Tables that can be Registered
+**
+** \par Description:
+** Defines the maximum number of critical tables supported by this processor's Table Services.
+**
+** \par Limits
+** This number must be less than 32767. It should be recognized that this parameter
+** determines the size of the Critical Table Registry which is maintained in the Critical
+** Data Store. An excessively high number will waste Critical Data Store memory. Therefore,
+** this number must not exceed the value defined in CFE_ES_CDS_MAX_CRITICAL_TABLES.
+*/
+#define CFE_TBL_MAX_CRITICAL_TABLES 32
+
+/**
+** \cfetblcfg Maximum Number of Table Handles
+**
+** \par Description:
+** Defines the maximum number of Table Handles.
+**
+** \par Limits
+** This number must be less than 32767. This number must be at least as big as
+** the number of tables (#CFE_TBL_MAX_NUM_TABLES) and should be set higher if tables
+** are shared between applications.
+*/
+#define CFE_TBL_MAX_NUM_HANDLES 256
+
+/**
+** \cfetblcfg Maximum Number of Simultaneous Loads to Support
+**
+** \par Description:
+** Defines the maximum number of single buffered tables that can be
+** loaded simultaneously. This number is used to determine the number
+** of shared buffers to allocate.
+**
+** \par Limits
+** This number must be less than 32767. An excessively high number will
+** degrade system performance and waste memory. A number less than 5 is
+** suggested but not required.
+*/
+#define CFE_TBL_MAX_SIMULTANEOUS_LOADS 4
+
+/**
+** \cfetblcfg Maximum Number of Simultaneous Table Validations
+**
+** \par Description:
+** Defines the maximum number of pending validations that
+** the Table Services can handle at any one time. When a
+** table has a validation function, a validation request is
+** made of the application to perform that validation. This
+** number determines how many of those requests can be
+** outstanding at any one time.
+**
+** \par Limits
+** This number must be less than 32767. An excessively high number will
+** degrade system performance and waste memory. A number less than 20 is
+** suggested but not required.
+*/
+#define CFE_TBL_MAX_NUM_VALIDATIONS 10
+
+/**
+** \cfetblcfg Default Filename for a Table Registry Dump
+**
+** \par Description:
+** Defines the file name used to store the table registry when
+** no filename is specified in the dump registry command.
+**
+** \par Limits
+** The length of each string, including the NULL terminator cannot exceed the
+** #OS_MAX_PATH_LEN value.
+*/
+#define CFE_TBL_DEFAULT_REG_DUMP_FILE "/ram/cfe_tbl_reg.log"
+
+/**
+** \cfetblcfg Number of Spacecraft ID's specified for validation
+**
+** \par Description:
+** Defines the number of specified spacecraft ID values that
+** are verified during table loads. If the number is zero
+** then no validation of the spacecraft ID field in the table
+** file header is performed when tables are loaded. Non-zero
+** values indicate how many values from the list of spacecraft
+** ID's defined below are compared to the spacecraft ID field
+** in the table file header. The ELF2CFETBL tool may be used
+** to create table files with specified spacecraft ID values.
+**
+** \par Limits
+** This number must be greater than or equal to zero and
+** less than or equal to 2.
+*/
+#define CFE_TBL_VALID_SCID_COUNT 0
+
+/* macro to construct 32 bit value from 4 chars */
+#define CFE_TBL_U32FROM4CHARS( _C1, _C2, _C3, _C4 ) \
+ ( (uint32)(_C1) << 24 | \
+ (uint32)(_C2) << 16 | \
+ (uint32)(_C3) << 8 | \
+ (uint32)(_C4) )
+
+/**
+** \cfetblcfg Spacecraft ID values used for table load validation
+**
+** \par Description:
+** Defines the spacecraft ID values used for validating the
+** spacecraft ID field in the table file header. To be valid,
+** the spacecraft ID specified in the table file header must
+** match one of the values defined here.
+**
+** \par Limits
+** This value can be any 32 bit unsigned integer.
+*/
+#define CFE_TBL_VALID_SCID_1 (CFE_SPACECRAFT_ID)
+#define CFE_TBL_VALID_SCID_2 (CFE_TBL_U32FROM4CHARS('a', 'b', 'c', 'd'))
+
+/**
+** \cfetblcfg Number of Processor ID's specified for validation
+**
+** \par Description:
+** Defines the number of specified processor ID values that
+** are verified during table loads. If the number is zero
+** then no validation of the processor ID field in the table
+** file header is performed when tables are loaded. Non-zero
+** values indicate how many values from the list of processor
+** ID's defined below are compared to the processor ID field
+** in the table file header. The ELF2CFETBL tool may be used
+** to create table files with specified processor ID values.
+**
+** \par Limits
+** This number must be greater than or equal to zero and
+** less than or equal to 4.
+*/
+#define CFE_TBL_VALID_PRID_COUNT 0
+
+/**
+** \cfetblcfg Processor ID values used for table load validation
+**
+** \par Description:
+** Defines the processor ID values used for validating the
+** processor ID field in the table file header. To be valid,
+** the spacecraft ID specified in the table file header must
+** match one of the values defined here.
+**
+** \par Limits
+** This value can be any 32 bit unsigned integer.
+*/
+#define CFE_TBL_VALID_PRID_1 (CFE_CPU_ID)
+#define CFE_TBL_VALID_PRID_2 (CFE_TBL_U32FROM4CHARS('a', 'b', 'c', 'd'))
+#define CFE_TBL_VALID_PRID_3 0
+#define CFE_TBL_VALID_PRID_4 0
+
+/** \cfeescfg Mission specific version number for cFE
+**
+** \par Description:
+** The cFE version number consists of four parts:
+** major version number, minor version number, revision
+** number and mission specific revision number. The mission
+** specific revision number is defined here and the other
+** parts are defined in "cfe_version.h".
+**
+** \par Limits:
+** Must be defined as a numeric value that is greater than
+** or equal to zero.
+*/
+#define CFE_MISSION_REV 0
+
+/** \cfeescfg Poll timer for startup sync delay
+**
+** \par Description:
+** During startup, some tasks may need to synchronize their own initialization
+** with the initialization of other applications in the system.
+**
+** CFE ES implements an API to accomplish this, that performs a task delay (sleep)
+** while polling the overall system state until other tasks are ready.
+**
+** This value controls the amount of time that the CFE_ES_ApplicationSyncDelay
+** will sleep between each check of the system state. This should be large enough
+** to allow other tasks to run, but not so large as to noticeably delay the startup
+** completion.
+**
+** Units are in milliseconds
+**
+** \par Limits:
+** Must be defined as an integer value that is greater than
+** or equal to zero.
+*/
+#define CFE_ES_STARTUP_SYNC_POLL_MSEC 50
+
+/** \cfeescfg CFE core application startup timeout
+**
+** \par Description:
+** The upper limit for the amount of time that the cFE core applications
+** (ES, SB, EVS, TIME, TBL) are each alloted to reach their respective
+** "ready" states.
+**
+** The CFE "main" thread starts individual tasks for each of the core applications
+** (except FS). Each of these must perform some initialization work before the
+** next core application can be started, so the main thread waits to ensure that the
+** application has reached the "ready" state before starting the next application.
+**
+** If any core application fails to start, then it indicates a major problem with
+** the system and startup is aborted.
+**
+** Units are in milliseconds
+**
+** \par Limits:
+** Must be defined as an integer value that is greater than
+** or equal to zero.
+**
+*/
+#define CFE_CORE_MAX_STARTUP_MSEC 30000
+
+/** \cfeescfg Startup script timeout
+**
+** \par Description:
+** The upper limit for the total amount of time that all apps listed in the CFE ES startup
+** script may take to all become ready.
+**
+** Unlike the "core" app timeout, this is a soft limit; if the alloted time is exceeded,
+** it probably indicates an issue with one of the apps, but does not cause CFE ES to take
+** any additional action other than logging the event to the syslog.
+**
+** Units are in milliseconds
+**
+** \par Limits:
+** Must be defined as an integer value that is greater than
+** or equal to zero.
+ */
+#define CFE_ES_STARTUP_SCRIPT_TIMEOUT_MSEC 30000
+
+
+#endif
diff --git a/config/training/inc/mfa_mission_cfg.h b/config/training/inc/mfa_mission_cfg.h
new file mode 100644
index 000000000..8302f9016
--- /dev/null
+++ b/config/training/inc/mfa_mission_cfg.h
@@ -0,0 +1,14 @@
+#ifndef MFA_MISSION_CFG_H
+#define MFA_MISSION_CFG_H
+
+#ifdef __cpluplus
+extern "C" {
+#endif
+
+#define MFA_CONFIG_TABLENAME "CONFIG_TBL"
+
+#ifdef __cpluplus
+}
+#endif
+
+#endif /*MFA_MISSION_CFG_H*/
\ No newline at end of file
diff --git a/config/training/inc/mfa_msgids.h b/config/training/inc/mfa_msgids.h
new file mode 100644
index 000000000..f918b8f19
--- /dev/null
+++ b/config/training/inc/mfa_msgids.h
@@ -0,0 +1,14 @@
+#ifndef MFA_MSGIDS_H
+#define MFA_MSGIDS_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+#include "msg_ids.h"
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /*MFA_MSGIDS_H*/
diff --git a/config/training/inc/mfa_platform_cfg.h b/config/training/inc/mfa_platform_cfg.h
new file mode 100644
index 000000000..dcee34b0e
--- /dev/null
+++ b/config/training/inc/mfa_platform_cfg.h
@@ -0,0 +1,21 @@
+#ifndef MFA_PLATFORM_CFG_H
+#define MFA_PLATFORM_CFG_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+#include "cfe.h"
+
+#define MFA_CONFIG_TABLE_FILENAME "/cf/apps/mfa_config.tbl"
+
+#define MFA_SCH_PIPE_DEPTH (2)
+#define MFA_SCH_PIPE_NAME "MFA_SCH_PIPE"
+#define MFA_SCH_PIPE_WAKEUP_RESERVED (1)
+#define MFA_SCH_PEND_TIME (CFE_SB_PEND_FOREVER)
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /*MFA_PLATFORM_CFG_H*/
diff --git a/config/training/inc/msg_ids.h b/config/training/inc/msg_ids.h
new file mode 100644
index 000000000..1dc0c307b
--- /dev/null
+++ b/config/training/inc/msg_ids.h
@@ -0,0 +1,11 @@
+#ifndef MSG_IDS_H
+#define MSG_IDS_H
+
+#include "msg_ids_common.h"
+
+#define MFA_HK_TLM_MID (0x0850)
+#define MFA_WAKEUP_MID (0x1851)
+#define MFA_SEND_HK_MID (0x1852)
+#define MFA_CMD_MID (0x1853)
+
+#endif
diff --git a/config/training/inc/osconfig.h b/config/training/inc/osconfig.h
new file mode 100644
index 000000000..bf45037f3
--- /dev/null
+++ b/config/training/inc/osconfig.h
@@ -0,0 +1,132 @@
+#ifndef OSCONFIG_H
+#define OSCONFIG_H
+
+
+#define OS_DL_EXPORT_MAX_COUNT (200000)
+#define OS_DATAFILE_ADDRESS_ALIGNMENT (16)
+#define OS_MODULE_SPACE_MAX_SIZE (0x1000)
+#define OS_SYMTABFILE_LINE_LENGTH_MAX (300)
+#define OS_SYMTABFILE_LINE_COUNT_MAX (1000000)
+#define OS_SYMTABFILE_CHAR_COUNT_MAX (OS_SYMTABFILE_LINE_LENGTH_MAX * OS_SYMTABFILE_LINE_COUNT_MAX)
+
+/*#define OS_USE_EMBEDDED_PRINTF*/
+
+#define OS_MAX_QUEUE_WIDTH 8
+#define OS_MAX_QUEUE_DEPTH 256
+
+/*
+** Platform Configuration Parameters for the OS API
+*/
+
+#define OS_MAX_TASKS 100
+#define OS_MAX_QUEUES 255
+#define OS_MAX_COUNT_SEMAPHORES 100
+#define OS_MAX_BIN_SEMAPHORES 100
+#define OS_MAX_MUTEXES 100
+#define OS_MAX_TIMEOUTS (OS_MAX_QUEUES + OS_MAX_COUNT_SEMAPHORES + OS_MAX_BIN_SEMAPHORES)
+
+/*
+** Maximum length for an absolute path name
+*/
+#define OS_MAX_PATH_LEN 64
+
+/*
+** Maximum length for a local or host path/filename.
+** This parameter can consist of the OSAL filename/path +
+** the host OS physical volume name or path.
+*/
+#define OS_MAX_LOCAL_PATH_LEN (OS_MAX_PATH_LEN + OS_FS_PHYS_NAME_LEN)
+
+/*
+** The maxium length allowed for a object (task,queue....) name
+*/
+#define OS_MAX_API_NAME 40
+
+/*
+** The maximum length for a file name
+*/
+#define OS_MAX_FILE_NAME 20
+
+/*
+** These defines are for OS_printf
+*/
+#define OS_BUFFER_SIZE 512
+#define OS_BUFFER_MSG_DEPTH 100
+
+/* This #define turns on a utility task that
+ * will read the statements to print from
+ * the OS_printf function. If you want OS_printf
+ * to print the text out itself, comment this out
+ *
+ * NOTE: The Utility Task #defines only have meaning
+ * on the VxWorks operating systems
+ */
+
+#define OS_UTILITY_TASK_ON
+
+
+//#ifdef OS_UTILITY_TASK_ON
+// #define OS_UTILITYTASK_STACK_SIZE 2048
+// /* some room is left for other lower priority tasks */
+// #define OS_UTILITYTASK_PRIORITY 245
+//#endif
+
+
+/*
+** the size of a command that can be passed to the underlying OS
+*/
+#define OS_MAX_CMD_LEN 1000
+
+/*
+** This define will include the OS network API.
+** It should be turned off for targtets that do not have a network stack or
+** device ( like the basic RAD750 vxWorks BSP )
+*/
+#define OS_INCLUDE_NETWORK
+
+/*
+** This is the maximum number of open file descriptors allowed at a time
+*/
+#define OS_MAX_NUM_OPEN_FILES 50
+
+/*
+** This defines the filethe input command of OS_ShellOutputToFile
+** is written to in the VxWorks6 port
+*/
+#define OS_SHELL_CMD_INPUT_FILE_NAME "/ram/OS_ShellCmd.in"
+
+/*
+** Module loader/symbol table is optional
+*/
+#define OS_INCLUDE_MODULE_LOADER
+
+#ifdef OS_INCLUDE_MODULE_LOADER
+ /*
+ ** This define sets the size of the OS Module Table, which keeps track of the loaded modules in
+ ** the running system. This define must be set high enough to support the maximum number of
+ ** loadable modules in the system. If the the table is filled up at runtime, a new module load
+ ** would fail.
+ */
+ #define OS_MAX_MODULES 64
+
+ /*
+ ** The Static Loader define is used for switching between the Dynamic and Static loader implementations.
+ */
+ /* #define OS_STATIC_LOADER */
+
+#endif
+
+
+/*
+** This define sets the maximum symbol name string length. It is used in implementations that
+** support the symbols and symbol lookup.
+*/
+#define OS_MAX_SYM_LEN 64
+
+
+/*
+** This define sets the maximum number of timers available
+*/
+#define OS_MAX_TIMERS 5
+
+#endif
diff --git a/config/training/inc/priorities.h b/config/training/inc/priorities.h
new file mode 100644
index 000000000..12edb16b2
--- /dev/null
+++ b/config/training/inc/priorities.h
@@ -0,0 +1,12 @@
+
+
+#define SCH_AD_CHILD_TASK_PRIORITY ( 11 ) /* 250Hz */
+#define CFE_ES_PERF_CHILD_PRIORITY ( 200 ) /* 1Hz */
+#define CFE_EVS_START_TASK_PRIORITY ( 155 ) /* 1Hz */
+#define CFE_SB_START_TASK_PRIORITY ( 150 ) /* 1Hz */
+#define CFE_ES_START_TASK_PRIORITY ( 140 ) /* 1Hz */
+#define CFE_TIME_START_TASK_PRIORITY ( 145 ) /* 1Hz */
+#define CFE_TIME_TONE_TASK_PRIORITY ( 5 ) /* 1Hz */
+#define CFE_TIME_1HZ_TASK_PRIORITY ( 100 ) /* 1Hz */
+#define CFE_TBL_START_TASK_PRIORITY ( 150 ) /* 1Hz */
+#define TO_CHANNEL_TASK_PRIORITY ( 75 ) /* ASYNC */
diff --git a/config/training/inc/sch_platform_cfg.h b/config/training/inc/sch_platform_cfg.h
new file mode 100644
index 000000000..4dbfb4ee6
--- /dev/null
+++ b/config/training/inc/sch_platform_cfg.h
@@ -0,0 +1,297 @@
+#ifndef SCH_PLATFORM_CFG_H
+#define SCH_PLATFORM_CFG_H
+
+#include "osapi.h"
+#include "priorities.h"
+
+
+
+/*************************************************************************
+** Macro definitions
+**************************************************************************/
+
+/**
+** \schcfg Software Bus Command Pipe Depth
+**
+** \par Description:
+** Dictates the number of messages to SCH that can be queued while awaiting
+** processing by the SCH Application.
+**
+** \par Limits
+** Must be greater than zero
+*/
+#define SCH_PIPE_DEPTH 12 /**< \brief SCH Command Pipe Depth */
+
+
+#define SCH_AD_PIPE_DEPTH (3)
+//#define SCH_AD_CHILD_TASK_PRIORITY 37
+#define SCH_AD_CHILD_TASK_FLAGS (OS_ENABLE_CORE_0)
+
+/*#define SCH_RTM_SUPPORTED*/
+
+/*
+** Schedule table definitions...
+*/
+/**
+** \schcfg Minor Frame Frequency (in Hz)
+**
+** \par Description:
+** Dictates the number of minor frame slots within each Major Frame.
+**
+** \par Limits
+** Must be 2 or more and less than 65536
+*/
+#define SCH_TOTAL_SLOTS 10 /* SCH wake-up rate (Hz) */
+
+
+/**
+** \schcfg Maximum number of Activities per Minor Frame
+**
+** \par Description:
+** Dictates the number of activities that can be defined for each Minor Frame.
+**
+** \par Limits
+** Must be at least one
+*/
+#define SCH_ENTRIES_PER_SLOT 5
+
+
+/**
+** \schcfg Maximum Number of Message Definitions in Message Definition Table
+**
+** \par Description:
+** Dictates the number of messages that can be defined in Message Definition Table.
+**
+** \par Limits
+** Must be at least one
+*/
+#define SCH_MAX_MESSAGES 128
+
+/**
+** \schcfg Maximum Message ID allowed in Message Definition Table
+**
+** \par Description:
+** Dictates the maximum message ID that can be used in the Message Definition Table.
+**
+** \par Limits
+** Must be less than or equal to SCH_MDT_MAX_MSG_ID and greater than or equal to 0
+*/
+#define SCH_MDT_MIN_MSG_ID 0
+
+/**
+** \schcfg Minimum Message ID allowed in Message Definition Table
+**
+** \par Description:
+** Dictates the minimum message ID that can be used in the Message Definition Table.
+**
+** \par Limits
+** Must be less than or equal to #CFE_SB_HIGHEST_VALID_MSGID and greater than SCH_MDT_MIN_MSG_ID
+*/
+#define SCH_MDT_MAX_MSG_ID CFE_SB_HIGHEST_VALID_MSGID
+
+
+/**
+** \schcfg Maximum Length, in Words, of a Message
+**
+** \par Description:
+** Dictates the maximum number of words that can be assigned to a particular message
+** in the Message Definition Table.
+**
+** \par Limits
+** Must be at least large enough to hold the smallest possible message header
+* ** (see #CFE_SB_TLM_HDR_SIZE and #CFE_SB_CMD_HDR_SIZE)
+*/
+#define SCH_MAX_MSG_WORDS 64 /* max message length (in words) */
+
+
+/*
+** Limits for how far we can get behind and how much we can do at once...
+*/
+/**
+** \schcfg Maximum Number of slots allowed for catch-up before skipping
+**
+** \par Description:
+** Dictates the number of Minor Frames that will be processed in "Catch Up"
+** mode before giving up and skipping ahead.
+**
+** \par Limits
+**
+*/
+#define SCH_MAX_LAG_COUNT (SCH_TOTAL_SLOTS / 2)
+
+
+/**
+** \schcfg Maximum Number of Slots to be processed when in "Catch Up" mode
+**
+** \par Description:
+** Dictates the maximum number of slots SCH will process when trying to
+** "Catch Up" to the correct slot for the current time.
+**
+** \par Limits
+** Must be at least one
+*/
+#define SCH_MAX_SLOTS_PER_WAKEUP 5
+
+/*
+** Conversion factor for how many microseconds in a wake-up period...
+*/
+/**
+** \schcfg Major Frame Period (in microseconds)
+**
+** \par Description:
+** Dictates the number microseconds in a Major Frame.
+**
+** \par Limits
+** Must be greater than zero
+*/
+#define SCH_MICROS_PER_MAJOR_FRAME 1000000
+
+
+/**
+** \schcfg Additional time allowed in Sync Slot to wait for Major Frame Sync (in microseconds)
+**
+** \par Description:
+** Dictates the additional time allowed in the Syncronization Slot
+** to allow the Major Frame Sync signal to be received and re-synchronize
+** processing.
+**
+** \par Limits
+** Must be less than the normal slot period
+*/
+#define SCH_SYNC_SLOT_DRIFT_WINDOW 500
+
+
+/**
+** \schcfg Time, in milliseconds, to wait for all applications to be started and ready to run
+**
+** \par Description:
+** Dictates the timeout for the #CFE_ES_WaitForStartupSync call that SCH uses to wait
+** for all of the Applications specified in the startup script to finish initialization.
+** SCH will wait this amount of time before assuming all startup script applications have
+** been started and will then begin nominal schedule processing.
+**
+** \par Limits
+** None
+*/
+#define SCH_STARTUP_SYNC_TIMEOUT 50000
+
+
+/**
+** \schcfg Time, in microseconds, to wait for first Major Frame Sync to arrive
+**
+** \par Description:
+** Dictates the time allowed for the first Major Frame sync signal to arrive
+** before assuming it is not going to occur and switching to a freewheeling
+** mode.
+**
+** \par Limits
+** Must be greater than or equal to the Major Frame Period
+*/
+#define SCH_STARTUP_PERIOD (5*SCH_MICROS_PER_MAJOR_FRAME)
+
+
+/*
+** Specifies the limit on the number of consecutive noisy Major Frame signals
+** before we begin to ignore them.
+*/
+/**
+** \schcfg Maximum Number of consecutive Noisy Major Frame signals before they are ignored
+**
+** \par Description:
+** Dictates the number of consecutive "Noisy" Major Frame Signals (i.e. - signals that
+** occur outside the expected window of their occurence) until the Major Frame signal
+** is automatically ignored and the Minor Frame Timer is used instead.
+**
+** \par Limits
+** This value should never be set to less than two because a single "noisy" Major
+** Frame signal is likely when turning on or switching the 1 Hz signal on the spacecraft.
+*/
+#define SCH_MAX_NOISY_MAJORF 2
+
+
+/**
+** \schcfg Scheduler API Library Usage Status
+**
+** \par Description:
+** Determines whether or not the Scheduler application is using the API library allowing
+** for external tasks to disable and enable schedule processing. Note that if the library
+** is to be used it must be generated as a separate object, and loaded prior to the
+** appplication.
+**
+** \par Limits
+** This value must either be 0 when not using or including the library, or 1 if the library
+** is going to be used.
+*/
+#define SCH_LIB_PRESENCE 1
+
+
+/**
+** \schcfg Scheduler API Library Initial Inhibition Count
+**
+** \par Description:
+** Sets the number of times the scheduler must be enabled following library initialization.
+** This allows the scheduler to come up either enabled (set to 0) or disabled (set to
+** a value greater than or equal to 1)
+**
+** \par Limits
+** This value must be an unsigned 32 bit integer.
+*/
+#define SCH_LIB_DIS_CTR 0
+
+
+/**
+** \schcfg Default SCH Schedule Definition Table Filename
+**
+** \par Description:
+** The value of this constant defines the default filename of
+** the SCH Schedule Definition Table
+**
+** \par Limits
+** The length of each string, including the NULL terminator cannot exceed
+** the #OS_MAX_PATH_LEN value.
+*/
+
+//#define SCH_SCHEDULE_FILENAME "/cf/apps/sch_def_schtbl.tbl"
+#define SCH_SCHEDULE_FILENAME "/cf/apps/sch_def_schtbl.tbl"
+
+
+/**
+** \schcfg Default SCH Message Definition Table Filename
+**
+** \par Description:
+** The value of this constant defines the default filename of the
+** SCH Message Definition Table
+**
+** \par Limits
+** The length of each string, including the NULL terminator cannot exceed
+** the #OS_MAX_PATH_LEN value.
+*/
+
+#define SCH_MESSAGE_FILENAME "/cf/apps/sch_def_msgtbl.tbl"
+
+
+/** \schcfg Mission specific version number for SCH application
+**
+** \par Description:
+** An application version number consists of four parts:
+** major version number, minor version number, revision
+** number and mission specific revision number. The mission
+** specific revision number is defined here and the other
+** parts are defined in "sch_version.h".
+**
+** \par Limits:
+** Must be defined as a numeric value that is greater than
+** or equal to zero.
+*/
+
+#define SCH_MISSION_REV 0
+
+#define SCH_DEADLINES_PER_SLOT 5
+
+
+
+#endif /* SCH_PLATFORM_CFG_H */
+
+/************************/
+/* End of File Comment */
+/************************/
diff --git a/config/training/server_overlay/.gitignore b/config/training/server_overlay/.gitignore
new file mode 100644
index 000000000..a1c13091d
--- /dev/null
+++ b/config/training/server_overlay/.gitignore
@@ -0,0 +1,2 @@
+yamcs-data
+cache
diff --git a/config/training/server_overlay/Displays/Main.bob b/config/training/server_overlay/Displays/Main.bob
new file mode 100644
index 000000000..b8d0a0cf7
--- /dev/null
+++ b/config/training/server_overlay/Displays/Main.bob
@@ -0,0 +1,443 @@
+
+
+ Main
+ 820
+ 850
+
+
+ 6
+ 6
+
+ Core Services
+ 18
+ 18
+ 270
+ 186
+
+
+
+
+
+
+
+
+ true
+
+
+
+ NoOp_2
+
+
+ training/core/cfe/cfe_es/Main.opi
+ tab
+
+
+ Display
+ 150
+ 5
+ 73
+ 23
+ $(actions)
+ false
+
+
+ Label_1
+ Essential Services
+ 7
+ 137
+
+
+
+
+ 1
+ false
+
+
+
+
+
+
+
+
+ Label_51
+ Event Services
+ 35
+ 137
+
+
+
+
+ 1
+ false
+
+
+
+
+
+
+
+
+ NoOp_5
+
+
+ training/core/cfe/cfe_evs/Main.opi
+ tab
+
+
+ Display
+ 150
+ 35
+ 73
+ 23
+ $(actions)
+ false
+
+
+ Label_52
+ Software Bus
+ 65
+ 137
+
+
+
+
+ 1
+ false
+
+
+
+
+
+
+
+
+ NoOp_8
+
+
+ training/core/cfe/cfe_sb/Main.opi
+ tab
+
+
+ Display
+ 150
+ 65
+ 73
+ 23
+ $(actions)
+ false
+
+
+ Label_53
+ Table Services
+ 95
+ 137
+
+
+
+
+ 1
+ false
+
+
+
+
+
+
+
+
+ NoOp_11
+
+
+ training/core/cfe/cfe_tbl/Main.opi
+ tab
+
+
+ Display
+ 150
+ 95
+ 73
+ 23
+ $(actions)
+ false
+
+
+ Label_54
+ Time Services
+ 125
+ 137
+
+
+
+
+ 1
+ false
+
+
+
+
+
+
+
+
+ NoOp_14
+
+
+ training/core/cfe/cfe_time/Main.opi
+ tab
+
+
+ Display
+ 150
+ 125
+ 73
+ 23
+ $(actions)
+ false
+
+
+
+ System Services
+ 18
+ 204
+ 270
+ 132
+
+
+
+
+
+
+
+
+ true
+
+
+
+ Label_61
+ Command Ingest
+ 6
+ 12
+ 136
+ 19
+
+
+
+
+ 1
+ false
+
+
+
+
+
+
+
+
+ NoOp_20
+
+
+ training/apps/ci/Main.opi
+ tab
+
+
+ Display
+ 149
+ 10
+ 72
+ 22
+ $(actions)
+ false
+
+
+ Label_67
+ Scheduler
+ 6
+ 39
+ 136
+
+
+
+
+ 1
+ false
+
+
+
+
+
+
+
+
+ NoOp_38
+
+
+ training/apps/sch/Main.opi
+ tab
+
+
+ Display
+ 149
+ 37
+ 72
+ 23
+ $(actions)
+ false
+
+
+ Label_68
+ Telemetry Output
+ 6
+ 67
+ 136
+
+
+
+
+ 1
+ false
+
+
+
+
+
+
+
+
+ NoOp_41
+
+
+ training/apps/to/Main.opi
+ tab
+
+
+ Display
+ 149
+ 65
+ 72
+ 23
+ $(actions)
+ false
+
+
+
+ Button Legend
+ 342
+ 24
+ 276
+ 192
+
+
+
+
+
+ NoOp_43
+
+
+ Open Display
+ 12
+ 17
+ 223
+ 25
+ Opens a secondary display
+ false
+
+
+ NoOp
+
+
+ Command
+ 12
+ 67
+ 223
+ 25
+
+
+
+
+
+
+
+
+ $(actions)
+ false
+
+
+ NoOp_44
+
+
+ Hazardous Command
+ 12
+ 117
+ 223
+ 25
+
+
+
+
+ This is a potentially hazard command that, if improperly used, can result in damage or loss of mission.
+ false
+
+
+ Action Button_2
+
+
+
+
+
+ Local Action
+ 12
+ 42
+ 223
+ 25
+
+
+
+
+ $(actions)
+ false
+
+
+ ResetFilter_5
+
+
+
+
+
+ Sensitive Command
+ 12
+ 92
+ 223
+ 25
+
+
+
+
+ Use this command with care. This may have an inadvertent side effect if not well understood.
+ false
+ true
+ Are you sure you want to disable ALL critical $(APP) events? You may miss important events.
+
+
+
diff --git a/config/training/server_overlay/README.md b/config/training/server_overlay/README.md
new file mode 100644
index 000000000..9b4693c1a
--- /dev/null
+++ b/config/training/server_overlay/README.md
@@ -0,0 +1,2 @@
+# YAMCS Configuration
+This current configuration is not done yet. We still need to update the config files and our code base to use the [Plugin](https://yamcs.org/docs/yamcs-server-manual/yamcs-plugin-format/) Plugin interface in order for us to hook into the YAMCS workflow.
diff --git a/config/training/server_overlay/etc/extra_streams.sql b/config/training/server_overlay/etc/extra_streams.sql
new file mode 100644
index 000000000..d3596778f
--- /dev/null
+++ b/config/training/server_overlay/etc/extra_streams.sql
@@ -0,0 +1,5 @@
+--Configuration tested on YAMCS 5.4.0
+--TODO: This should be auto-generated and driven by configuration. That way we can even abstract the protocol(CCSDS, MAVLink, etc) if need be.
+create stream cfdp_in as select substring(packet, 12) as pdu from tm_realtime where extract_short(packet, 0) = 2591
+create stream cfdp_out (gentime TIMESTAMP, entityId long, seqNum int, pdu binary)
+insert into tc_realtime select gentime, 'cfdp-service' as origin, seqNum, '/yamcs/cfdp/upload' as cmdName, unhex('1A24C00000000000') + pdu as binary from cfdp_out
diff --git a/config/training/server_overlay/etc/yamcs.yamcs-cfs.yaml b/config/training/server_overlay/etc/yamcs.yamcs-cfs.yaml
new file mode 100644
index 000000000..66f2e3cea
--- /dev/null
+++ b/config/training/server_overlay/etc/yamcs.yamcs-cfs.yaml
@@ -0,0 +1,97 @@
+#Configuration tested on YAMCS 5.4.0
+services:
+ - class: org.yamcs.archive.XtceTmRecorder
+ - class: org.yamcs.archive.ParameterRecorder
+ - class: org.yamcs.archive.AlarmRecorder
+ - class: org.yamcs.archive.EventRecorder
+ - class: org.yamcs.archive.ReplayServer
+ - class: org.yamcs.parameter.SystemParametersCollector
+ args:
+ provideJvmVariables: true
+ provideFsVariables: true
+ - class: org.yamcs.ProcessorCreatorService
+ args:
+ name: realtime
+ type: realtime
+ - class: org.yamcs.archive.CommandHistoryRecorder
+ - class: org.yamcs.parameterarchive.ParameterArchive
+ args:
+ realtimeFiller:
+ enabled: false
+ backFiller:
+ enabled: true
+ warmupTime: 60
+ - class: org.yamcs.tctm.cfs.CfsEventDecoder
+ args:
+ msgIds: [0x0815] #Always confirm this ID with CFE_EVS configuration
+ byteOrder: LITTLE_ENDIAN
+ appNameMax: 40
+ eventMsgMax: 122
+ - class: org.yamcs.cfdp.CfdpService
+ name: cfdp0
+ args:
+ inStream: cfdp_in
+ outStream: cfdp_out
+ localEntities:
+ - name: "0.23"
+ id: 23
+ bucket: cfdpUp
+ remoteEntities:
+ - name: "0.24"
+ id: 24
+ bucket: cfdpDown
+ receiverFaultHandlers:
+ AckLimitReached: suspend
+ - class: com.windhoverlabs.yamcs.RegistryService
+ name: fsw
+ args:
+ file: "etc/registry.yaml"
+
+dataLinks:
+ - name: tc
+ class: org.yamcs.tctm.UdpTcDataLink
+ stream: tc_realtime
+ host: 127.0.0.1
+ port: 5010
+ commandPostprocessorClassName: org.yamcs.tctm.cfs.CfsCommandPostprocessor
+ commandPostprocessorArgs:
+ swapChecksumFc: true
+
+ - name: tm
+ class: org.yamcs.tctm.UdpTmDataLink
+ stream: tm_realtime
+ port: 5011
+ maxLength: 32768 #32KB is the default for CCSDS
+ packetPreprocessorClassName: org.yamcs.tctm.cfs.CfsPacketPreprocessor
+ packetPreprocessorArgs:
+ checkSequence: false
+ byteOrder: LITTLE_ENDIAN
+ useLocalGenerationTime: true
+ #errorDetection:
+ #tcoService:
+ timestampFormat: CFE_SB_TIME_32_16_SUBS
+ timeEncoding:
+ epoch: CUSTOM
+ epochUTC: "1970-01-01T00:00:00Z"
+ timeIncludesLeapSeconds: false
+
+mdb:
+ # Configuration of the active loaders
+ # Valid loaders are: sheet, xtce or fully qualified name of the class
+ - type: "xtce"
+ spec: "mdb/cfs-ccsds.xml"
+ subLoaders:
+ - type: "xtce"
+ spec: "mdb/training.xml"
+
+# Configuration for streams created at server startup
+streamConfig:
+ tm:
+ - name: "tm_realtime"
+ - name: "tm_dump"
+ cmdHist: ["cmdhist_realtime", "cmdhist_dump"]
+ event: ["events_realtime", "events_dump"]
+ param: ["pp_realtime", "sys_param", "proc_param"]
+ parameterAlarm: ["alarms_realtime"]
+ tc: ["tc_realtime"]
+ sqlFile: "etc/extra_streams.sql"
diff --git a/config/training/server_overlay/etc/yamcs.yaml b/config/training/server_overlay/etc/yamcs.yaml
new file mode 100644
index 000000000..5649dde51
--- /dev/null
+++ b/config/training/server_overlay/etc/yamcs.yaml
@@ -0,0 +1,28 @@
+#Configuration tested on YAMCS 5.4.0
+services:
+ - class: org.yamcs.http.HttpServer
+ args:
+ port: 8090
+ webSocket:
+ maxFrameLength: 262144 # We need this much for rendering SCH tables in Studio.
+
+# This is where Yamcs will persist its data. Paths are resolved relative to where Yamcs is running
+# from (by default: target/yamcs). This means that `mvn clean` will remove also persisted data.
+# Change this property to an absolute path in case you want to persist your data.
+dataDir: yamcs-data
+
+instances:
+ - yamcs-cfs
+
+# Secret key unique to a particular Yamcs installation.
+# This is used to provide cryptographic signing.
+secretKey: changeme
+
+
+#The bucket with name of "displays" must ALWAYS be called "displays". The YAMCS Webapp looks for a bucket with ths exact name when loading displays from the filesystem.
+#See yamcs/yamcs-web/src/main/java/org/yamcs/web/WebPlugin.java for details.
+buckets:
+ - name: cfdpUp
+ path: cfdp_upload
+ - name: displays
+ path: Displays
diff --git a/config/training/server_overlay/mdb/SpaceSystem.xsd b/config/training/server_overlay/mdb/SpaceSystem.xsd
new file mode 100644
index 000000000..c9d99d902
--- /dev/null
+++ b/config/training/server_overlay/mdb/SpaceSystem.xsd
@@ -0,0 +1,5918 @@
+
+
+
+
+
+ This XML Schema Definition (XSD) defines syntax with concrete semantics for describing space or remote device telemetry and commanding in a platform and program independent manner.
+
+
+
+
+ The top-level SpaceSystem is the root element for the set of metadata necessary to monitor and command a space device, such as a satellite. A SpaceSystem defines a namespace. Metadata areas include: packets/minor frames layout, telemetry, calibration, alarm, algorithms, streams and commands. A SpaceSystem may have child SpaceSystems, forming a SpaceSystem tree. See SpaceSystemType.
+
+
+
+ This key ensures a unique parameter name at the system level.
+
+
+
+
+
+
+ This key ensures a unique parameter type name at the system level.
+
+
+
+
+
+
+ This key ensures a unique metaCommand name at the system level.
+
+
+
+
+
+
+ This key ensures a unique algorithm name at the system level.
+
+
+
+
+
+
+ This key ensures a unique stream name at the system level.
+
+
+
+
+
+
+ This key ensures a unique service name at the system level.
+
+
+
+
+
+
+ This key ensures a container stream name at the system level.
+
+
+
+
+
+
+
+
+
+
+ This key ensures a unique argument type name at the system level.
+
+
+
+
+
+
+ This key ensures a unique BlockMetaCommand name at the system level.
+
+
+
+
+
+
+
+ SpaceSystem is a collection of SpaceSystem(s) including space assets, ground assets, multi-satellite systems and sub-systems. A SpaceSystem is the root element for the set of data necessary to monitor and command an arbitrary space device - this includes the binary decomposition the data streams going into and out of a device.
+
+
+
+
+
+
+ The Header element contains optional descriptive information about this SpaceSystem or the document as a whole when specified at the root SpaceSystem.
+
+
+
+
+ This element contains descriptions of the telemetry created on the space asset/device and sent to other data consumers.
+
+
+
+
+ This element contains descriptions of the commands and their associated constraints and verifications that can be sent to the space asset/device.
+
+
+
+
+
+ Additional SpaceSystem elements may be used like namespaces to segregate portions of the space asset/device into convenient groupings or may be used to specialize a product line generic SpaceSystem to a specific asset instance.
+
+
+
+
+
+ Optional descriptive attribute for document owner convenience.
+
+
+
+
+
+
+
+
+ Describe command related metadata. Items defined in this area may refer to items defined in TelemetryMetaData. See TelemetryMetaDataType.
+
+
+
+
+ A list of parameter types.
+
+
+
+
+ Parameters referenced by MetaCommands. This Parameter Set is located here so that MetaCommand data can be built independently of TelemetryMetaData.
+
+
+
+
+ A list of argument types. MetaCommand definitions can contain arguments and parameters. Arguments are user provided to the specific command definition. Parameters are provided/calculated/determined by the software creating the command instance. As a result, arguments contain separate type information. In some cases, arguments have different descriptive characteristics.
+
+
+
+
+ A list of command definitions with their arguments, parameters, and container encoding descriptions.
+
+
+
+
+ Similar to the ContainerSet for telemetry, the CommandContainerSet contains containers that can be referenced/shared by MetaCommand definitions.
+
+
+
+
+ Contains an unordered set of Streams.
+
+
+
+
+ Contains an unordered set of Algorithms.
+
+
+
+
+
+
+ All the data about telemetry is contained in TelemetryMetaData
+
+
+
+
+ A list of parameter types
+
+
+
+
+ A list of Parameters for this Space System.
+
+
+
+
+ Holds the list of all potential container definitions for telemetry. Containers may parts of packets or TDM, and then groups of the containers, and then an entire entity -- such as a packet. In order to maximize re-used for duplication, the pieces may defined once here, and then assembled as needed into larger structures, also here.
+
+
+
+
+ Messages are an alternative method of uniquely identifying containers within a Service. A message provides a test in the form of MatchCriteria to match to a container. A simple example might be: [When minorframeID=21, the message is the 21st minorframe container. The collection of messages to search thru will be bound by a Service.
+
+
+
+
+
+
+
+
+
+
+ This schema defines the dictionary for containers, which in turn describe the physical composition of data in a communication system
+
+
+
+ Identical to ArgumentRefEntryType but supports argument instance references.
+
+
+
+
+
+
+
+
+
+ Identical to ArrayParameterRefEntryType but supports argument instance references.
+
+
+
+
+
+ Only used for subsetting an array. The array's true dimension sizes are set in the Type.
+
+
+
+ The dimension here if used for subsetting must be less than the ones in the type. It's not a subset if its the same size.
+
+
+
+
+
+
+
+
+
+
+ Identical to ArrayParameterRefEntryType but supports argument instance references.
+
+
+
+
+
+ Only used for subsetting an array. The array's true dimension sizes are set in the Type.
+
+
+
+ The dimension here if used for subsetting must be less than the ones in the type. It's not a subset if its the same size.
+
+
+
+
+
+
+
+
+
+
+ Identical to ContainerRefEntryType but supports argument instance references.
+
+
+
+
+
+
+
+
+
+ Identical to ContainerSegmentRefEntryType but supports argument instance references.
+
+
+
+
+
+
+
+
+
+
+
+ Identical to FixedValueEntryType but supports argument instance references.
+
+
+
+
+
+ An optional name for the fixed/constant field in the sequence.
+
+
+
+
+ The fixed/constant value that should be encoded into the sequence. This value provided should have sufficient bit length to accomodate the size in bits. If the value is larger, the most significant unnecessary bits are dropped. The value provided should be in network byte order for encoding.
+
+
+
+
+ The number of bits that this fixed/constant value should occupy in the sequence.
+
+
+
+
+
+
+
+ Identical to IndirectParameterRefEntryType but supports argument instance references.
+
+
+
+
+
+
+
+
+
+
+
+
+ Identical to ParameterRefEntryType but supports argument instance references.
+
+
+
+
+
+
+
+
+
+ Identical to ParameterSegmentRefEntryType but supports argument instance references.
+
+
+
+
+
+
+
+
+
+
+
+ Identical to StreamRefEntryType but supports argument instance references.
+
+
+
+
+
+
+
+
+
+
+
+ Describe an entry that is an array parameter. Specify the dimension sizes if you subsetting the array (the number of dimensions shall match the number defined in the parameter’s type definition), otherwise the ones in the ParameterType are assumed. See SequenceEntryType.
+
+
+
+
+
+ Only used for subsetting an array. The array's maximum dimension sizes are set in the type. When a DimensionList is not used, the array is the full size provided in the type.
+
+
+
+ The dimension here if used for subsetting must be less than the ones in the type. It's not a subset if its the same size.
+
+
+
+
+
+
+
+
+
+ Supplies an optional non-reference-able name and short description for alarms. Also includes an optional ancillary data for any special local flags, note that these may not necessarily transfer to another recipient of an instance document.
+
+
+
+
+
+
+ The alarm definition may be named.
+
+
+
+
+ An optional brief description of this alarm definition.
+
+
+
+
+
+ Describe a child/parent container inheritance relationship. Describe constraints with RestrictionCriteria, conditions that must be true for this container to be an extension of the parent container. A constraint can be used to convey the identifying features of the telemetry format such as the CCSDS application id or minor-frame id. See RestrictionCriteriaType and SequenceContainerType.
+
+
+
+
+ Contains the conditions that must evaluate to true in order for this container to be an extension of the parent container.
+
+
+
+
+
+ Reference to the container that this container extends.
+
+
+
+
+
+ An abstract block of data; used as the base type for more specific container types
+
+
+
+
+
+ RateInStream is used to: a) generate alarms when the Container is updated too frequently or too infrequently, b) provide some 'guidelines' for generating forward link containers, c) provide some guidelines for spacecraft simulators to generate telemetry containers. If necessary, these rates may be defined on a per stream basis.
+ The software should check that any Stream names referenced in the RateInStreamSet actually exist.
+
+
+
+
+
+ May be used to indicate error detection and correction, change byte order, provide the size (when it can't be derived), or perform some custom processing.
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Holds a reference to a container
+
+
+
+ name of container
+
+
+
+
+
+ An entry that is simply a reference to another container.
+
+
+
+
+
+
+
+
+
+ An entry that is only a portion of a container indicating that the entire container must be assembled from other container segments. It is assumed that container segments happen sequentially in time, that is the first part of a container is first, however (and there's always a however), if this is not the case the order of this container segment may be supplied with the order attribute where the first segment order="0". Each instance of a container cannot overlap in the overall sequence with another instance
+
+
+
+
+
+
+
+
+
+
+
+ Unordered Set of Containers
+
+
+
+
+ SequenceContainers define sequences of parameters or other containers.
+
+
+
+
+
+
+ Contains an ordered list of Entries. Used in Sequence Container
+
+
+
+
+ Specify a Parameter to be a part of this container layout definition.
+
+
+
+
+ Specify a portion of a Parameter to be a part of this container layout definition. This is used when the Parameter is reported in fractional parts in the container before being fully updated.
+
+
+
+
+ Specify the content of another Container to be a part of this container layout definition.
+
+
+
+
+ Specify a portion of another Container to be a part of this container layout definition.
+
+
+
+
+ Specify a portion of a Stream to be a part of this container layout definition.
+
+
+
+
+ Specify a previous (not last reported) value of a Parmeter to be a part of this container layout definition.
+
+
+
+
+ Specify an Array Type Parameter to be a part of this container layout definition when the Container does not populate the entire space of the Array contents. If the entire space of the Array is populated, a tolerant implementation will accept ParameterRefEntry also.
+
+
+
+
+
+
+ An entry whose name is given by the value of a ParamameterInstance. This entry may be used to implement dwell telemetry streams. The value of the parameter in ParameterInstance must use either the name of the Parameter or its alias. If it's an alias name, the alias namespace is supplied as an attribute.
+
+
+
+
+
+
+
+
+
+
+
+
+ Describe the absolute or relative bit location of an entry in a container. The "referenceLocation" attribute specifies the starting bit anchor. If no referenceLocation value is given, the entry is assumed to begin at the first bit position after the previous entry. Each container starts at bit 0, thus "containerStart" is an offset from 0. Negative container start bits are before the container and are implementation dependent – these should be flagged as likely errors. "containerEnd" is given as a positive offset from the end of the container, thus a container end of 0 is exactly at the end of the container. Negative container end addresses are after the container and are implementation dependent – these should be flagged as likely errors. Positive "previouEntry" values are offsets from the previous entry – zero (0) is the default which means it follows contiguously from the last occupied bit of the previous entry. A value of one means it is offset 1-bit from the previous entry, and a value of negative 1 (-1) means it overlaps the previous entry by one bit, and so forth. The "nextEntry" attribute value is proposed for deprecation and should be avoided. See SequenceEntryType.
+
+
+
+
+
+ Defines the relative reference used to interpret the start bit position. The default is 0 bits from the end of the previousEntry, which makes the entry contiguous.
+
+
+
+
+
+
+
+ Identical to LocationInContainerInBitsType but supports argument instance references.
+
+
+
+
+
+
+
+
+
+ Holds a reference to a message
+
+
+
+ name of message
+
+
+
+
+
+ An entry that is a single Parameter
+
+
+
+
+
+
+
+
+
+ An entry that is only a portion of a parameter value indicating that the entire parameter value must be assembled from other parameter segments. It is assumed that parameter segments happen sequentially in time, that is the first part if a telemetry parameter first, however (and there's always a however), if this is not the case the order of this parameter segment may be supplied with the order attribute where the first segment order="0".
+
+
+
+
+
+
+
+
+
+
+
+ Describes the binary layout/packing of data and also related properties, including an entry list of parameters, parameter segments, array parameters, stream segments, containers, and container segments. Sequence containers may extend other sequence containers (see BaseContainerType). The parent container’s entries are placed before the entries in the child container forming one entry list. An inheritance chain may be formed using this mechanism, but only one entry list is being created. Sequence containers may be marked as "abstract", when this occurs an instance of it cannot itself be created. The idle pattern is part of any unallocated space in the container. See EntryListType.
+
+
+
+
+
+
+ List of item entries to pack/encode into this container definition.
+
+
+
+
+ Optional inheritance for this container from another named container.
+
+
+
+
+
+ Abstract container definitions that are not instantiated, rather only used as bases to inherit from to create specialized container definitions.
+
+
+
+
+ The idle pattern is part of any unallocated space in the container. This is uncommon.
+
+
+
+
+
+
+
+ Defines an abstract schema type used to create other entry types. Describe an entry’s location in the container (See LocationInContainerInBitsType). The location may be fixed or dynamic, absolute or relative. Entries may be included depending on the value of a condition (See IncludeConditionType), and entries may also repeat (see RepeatEntryType). The entry’s IncludeCondition resolves to true, it is fully-resolved when its size is computable after RepeatEntry has been accounted for and then offset by LocationInContainer. See EntryListType, IncludeConditionType, RepeatEntryType and LocationInContainerInBitsType.
+
+
+
+
+ The start bit 0 position for each container is local to the container, but does include space occupied by inherited containers. When a container is "included", as opposed to inherited, then the interpreting implementation takes into account the start bit position of the referring container when finally assembling the start bits for the post-processed entry content. The default start bit for any entry is 0 bits from the previous entry, making the content contiguous when this element is not used.
+
+
+
+
+ May be used when this entry repeats itself in the sequence container. When an entry repeats, it effectively specifies that the same entry is reported more than once in the container and has the same physical meaning. This should not be construed to be equivalent to arrays.
+
+
+
+
+ This entry will only be included in the sequence when this condition is true, otherwise it is always included. When the include condition evaluates to false, it is as if the entry does not exist such that any start bit interpretations cannot take into account the space that would have been occupied if this included condition were true.
+
+
+
+
+ Optional timing information associated with this entry.
+
+
+
+
+ Optional ancillary data associated with this element.
+
+
+
+
+
+ Optional short description for this entry element.
+
+
+
+
+
+ Identical to a SequenceEntryType but supports argument instance references.
+
+
+
+
+ The start bit 0 position for each container is local to the container, but does include space occupied by inherited containers. When a container is "included", as opposed to inherited, then the interpreting implementation takes into account the start bit position of the referring container when finally assembling the start bits for the post-processed entry content. The default start bit for any entry is 0 bits from the previous entry, making the content contiguous when this element is not used.
+
+
+
+
+ May be used when this entry repeats itself in the sequence container. When an entry repeats, it effectively specifies that the same entry is reported more than once in the container and has the same physical meaning. This should not be construed to be equivalent to arrays.
+
+
+
+
+ This entry will only be included in the sequence when this condition is true, otherwise it is always included. When the include condition evaluates to false, it is as if the entry does not exist such that any start bit interpretations cannot take into account the space that would have been occupied if this included condition were true.
+
+
+
+
+ Ancillary data associated with this entry.
+
+
+
+
+
+ Optional short description for this entry element.
+
+
+
+
+
+ Holds a set of services, logical groups of containers OR messages (not both).
+
+
+
+
+
+
+
+
+
+
+
+
+ An entry that is a portion of a stream (streams are by definition, assumed continuous) It is assumed that stream segments happen sequentially in time, that is the first part if a steam first, however, if this is not the case the order of the stream segments may be supplied with the order attribute where the first segment order="0".
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ The ContainerRef should point to ROOT container that will describe an entire packet/minor frame or chunk of telemetry.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Define the expected appearance (rate) of a container in a stream where the rate is defined on either a perSecond or perContainer update basis. Many programs and platforms have variable reporting rates for containers and these can be commanded. As a result, this element is only useful to some users and generally does not affect the processing of the received containers themselves. See ContainerType.
+
+
+
+ The measurement unit basis for the minimum and maximum appearance count values.
+
+
+
+
+ The minimum rate for the specified basis for which this container should appear in the stream.
+
+
+
+
+ The maximum rate for the specified basis for which this container should appear in the stream.
+
+
+
+
+
+ Define the expected appearance (rate) of a container in a named stream where the rate is defined on either a perSecond or perContainer update basis. Many programs and platforms have variable reporting rates for containers and these can be commanded. As a result, this element is only useful to some users and generally does not affect the processing of the received containers themselves. See ContainerType and RateInStreamType.
+
+
+
+
+
+ Reference to a named stream for which this rate specification applies.
+
+
+
+
+
+
+
+ The location may be relative to the start of the container (containerStart), relative to the end of the previous entry (previousEntry), relative to the end of the container (containerEnd), or relative to the entry that follows this one (nextEntry). If going forward (containerStart and previousEntry) then the location refers to the start of the Entry. If going backwards (containerEnd and nextEntry) then, the location refers to the end of the entry.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Define one or more conditions (constraints) for container inheritance. A container is instantiable if its constraints are true. Constraint conditions may be a comparison, a list of comparisons, a boolean expression, or a graph of containers that are instantiable (if all containers are instantiable the condition is true). See BaseContainerType, ComparisonType, ComparisonListType, BooleanExpressionType and NextContainerType.
+
+
+
+
+
+
+ Reference to the named container that must follow this container in the stream sequence.
+
+
+
+
+
+
+
+
+
+
+ This schema defines the dictionary for telemetry
+
+
+
+ Describe an absolute time parameter type relative to a known epoch (such as TAI). The string representation of this time should use the [ISO 8601] extended format CCYY-MM-DDThh:mm:ss where "CC" represents the century, "YY" the year, "MM" the month and "DD" the day, preceded by an optional leading "-" sign to indicate a negative number. If the sign is omitted, "+" is assumed. The letter "T" is the date/time separator and "hh", "mm", "ss" represent hour, minute and second respectively. Additional digits can be used to increase the precision of fractional seconds if desired i.e. the format ss.ss... with any number of digits after the decimal point is supported. See TAIType, IntegerDataEncoding and AbsoluteTimeDataType.
+
+
+
+
+
+
+
+ Describe a complex data type analogous to a C-struct. Each field of the data type is called a Member. Each Member is part of the MemberList which forms the list of items to be placed under this data type’s name. The MemberList defines a data block and block’s size is defined by the DataEncodings of each Member’s type reference. The data members are ordered and contiguous in the MemberList element (packed). Each member may be addressed by the dot syntax similar to C such as P.voltage if P is the referring parameter and voltage is of a member of P’s aggregate type. See MemberType, MemberListType, DataEncodingType, NameReferenceType, and AggregateDataType.
+
+
+
+
+
+
+
+ Describe an array parameter type. The size and number of dimensions are described here. See ArrayParameterRefEntryType, NameReferenceType and ArrayDataType.
+
+
+
+
+
+
+ Describe the dimensions of this array.
+
+
+
+
+
+
+
+
+ Describe a binary engineering/calibrated parameter type (sometimes called a “blob type”). It may be of fixed or variable length, and has an optional encoding and decoding algorithm that may be defined to transform the data between space and ground. See BinaryDataEncodingType, IntegerValueType, InputAlgorithmType and BinaryDataType.
+
+
+
+
+
+
+ Optionally describe an alarm monitoring specification that is effective whenever a contextual alarm definition does not take precedence.
+
+
+
+
+ Optionally describe one or more alarm monitoring specifications that are effective whenever a contextual match definition evaluates to true. The first match that evaluates to true takes precedence.
+
+
+
+
+
+
+
+
+ Describe a boolean parameter type which has two values only: ‘True’ (1) or ‘False’ (0). The values one and zero may be mapped to a specific string using the attributes oneStringValue and zeroStringValue. This type is a simplified form of the EnumeratedDataType. See IntegerDataEncoding and BooleanDataType.
+
+
+
+
+
+
+ Optionally describe an alarm monitoring specification that is effective whenever a contextual alarm definition does not take precedence.
+
+
+
+
+ Optionally describe one or more alarm monitoring specifications that are effective whenever a contextual match definition evaluates to true. The first match that evaluates to true takes precedence.
+
+
+
+
+
+
+
+
+ Describe an enumerated parameter type. The enumeration list consists of label/value pairs. See EnumerationListType, IntegerDataEncodingType and EnumeratedDataType.
+
+
+
+
+
+
+ Describe labels for this parameter that should be in an alarm state. The default definition applies when there are no context alarm definitions or all the context alarm definitions evaluate to false in their matching criteria.
+
+
+
+
+ Describe labels for this parameter that should be in an alarm state when another parameter and value combination evaluates to true using the described matching criteria.
+
+
+
+
+
+
+
+
+ Describe an ordered collection of context enumeration alarms, duplicates are valid. Process the contexts in list order. See EnumerationContextAlarmType.
+
+
+
+
+ Describe the alarm matching context criteria and the alarm definition itself.
+
+
+
+
+
+
+ Describe a floating point parameter type. Several encodings are supported. Calibrated integer to float relationships should be described with this data type. Use the data encoding to define calibrators. Joins integer as one of the numerics. See FloatDataEncodingType, IntegerDataEncodingType and FloatDataType.
+
+
+
+
+
+
+ Default alarm definitions are those which do not adjust definition logic based on the value of other parameters. Other parameters may participate in the determination of an alarm condition for this parameter, but the definition logic of the alarm on this parameter is constant. If the alarming logic on this parameter changes based on the value of other parameters, then it is a ContextAlarm and belongs in the ContextAlarmList element.
+
+
+
+
+ Context alarm definitions are those which adjust the definition logic for this parameter based on the value of other parameters. A context which evaluates to being in effect, based on the testing of another parameter, takes precedence over the default alarms in the DefaultAlarm element. If the no context alarm evaluates to being in effect, based on the testing of another parameter, then the default alarm definitions from the DefaultAlarm element will remain in effect. If multiple contexts evaluate to being in effect, then the first one that appears will take precedence.
+
+
+
+
+
+
+
+
+ Describe an integer parameter type. Several are supported. Calibrated integer to integer relationships should be described with this data type. Use the integer data encoding to define calibrators. Joins float as one of the numerics. See IntegerDataEncoding and IntegerDataType.
+
+
+
+
+
+
+ Default alarm definitions are those which do not adjust definition logic based on the value of other parameters. Other parameters may participate in the determination of an alarm condition for this parameter, but the definition logic of the alarm on this parameter is constant. If the alarming logic on this parameter changes based on the value of other parameters, then it is a ContextAlarm and belongs in the ContextAlarmList element.
+
+
+
+
+ Context alarm definitions are those which adjust the definition logic for this parameter based on the value of other parameters. A context which evaluates to being in effect, based on the testing of another parameter, takes precedence over the default alarms in the DefaultAlarm element. If the no context alarm evaluates to being in effect, based on the testing of another parameter, then the default alarm definitions from the DefaultAlarm element will remain in effect. If multiple contexts evaluate to being in effect, then the first one that appears will take precedence.
+
+
+
+
+
+
+
+
+
+
+
+
+
+ An ordered collection of numeric alarms associated with a context. A context is an alarm definition on a parameter which is valid only in the case of a test on the value of other parameters. Process the contexts in list order. Used by both FloatParameterType and IntegerParameterType. See NumericContextAlarmType.
+
+
+
+
+ A contextual alarm definition for the parameter that uses this type that is valid when a test against the value of one or more other parameters evaluates to true.
+
+
+
+
+
+
+ A reference to an instance of a Parameter. Used when the value of a parameter is required for a calculation or as an index value. A positive value for instance is forward in time, a negative value for count is backward in time, a 0 value for count means use the current value of the parameter or the first value in a container.
+
+
+
+
+
+
+
+
+
+
+ Describes extended properties/attributes of Parameter definitions.
+
+
+
+
+ Optional. Normally used when the database is built in a flat, non-hierarchical format.
+
+
+
+
+ Optional condition that must be true for this Parameter to be valid.
+
+
+
+
+ When present, this set of elements describes physical address location(s) of the parameter where it is stored. Typically this is on the data source, although that is not constrained by this schema.
+
+
+
+
+ This time will override any Default value for TimeAssociation.
+
+
+
+
+
+ This attribute describes the nature of the source entity for which this parameter receives a value. Implementations assign different attributes/properties internally to a parameter based on the anticipated data source.
+
+
+
+
+ A Parameter marked as 'readOnly' true is non-settable by users and applications/services that do not represent the data source itself. Note that a slight conceptual overlap exists here between the 'dataSource' attribute and this attribute when the data source is 'constant'. For a constant data source, then 'readOnly' should be 'true'. Application implementations may choose to implicitly enforce this. Some implementations have both concepts of a Parameter that is settable or non-settable and a Constant in different parts of their internal data model.
+
+
+
+
+ A Parameter marked to persist should retain the latest value through resets/restarts to the extent that is possible or defined in the implementation. The net effect is that the initial/default value on a Parameter is only seen once or when the system has a reset to revert to initial/default values.
+
+
+
+
+
+ Describe the properties of a telemetry parameter, including its data type (parameter type). The bulk of properties associated with a telemetry parameter are in its parameter type. The initial value specified here, overrides the initial value in the parameter type. A parameter may be local, in which case its parameter type would have no data encodings. Ideally such a definition would also set data source in parameter properties to ‘local’ but the syntax does not enforce this. See BaseDataType, BaseTimeDataType, and NameReferenceType.
+
+
+
+
+
+
+ Specify additional properties for this Parameter used by the implementation of tailor the behavior and attributes of the Parameter. When not specified, the defaults on the ParameterProperties element attributes are assumed.
+
+
+
+
+
+ Specify the reference to the parameter type from the ParameterTypeSet area using the path reference rules, either local to this SpaceSystem, relative, or absolute.
+
+
+
+
+ Specify as: integer data type using xs:integer, float data type using xs:double, string data type using xs:string, boolean data type using xs:boolean, binary data type using xs:hexBinary, enum data type using label name, relative time data type using xs:duration, absolute time data type using xs:dateTime. Values must not exceed the characteristics for the data type or this is a validation error. Takes precedence over an initial value given in the data type. Values are calibrated unless there is an option to override it.
+ The value type must match the Parameter type
+
+
+
+
+
+
+
+ Describe an unordered collection of parameter type definitions. These types named for the engineering/calibrated type of the parameter. See BaseDataType and BaseTimeDataType.
+
+
+
+
+ Describe a parameter type that has an engineering/calibrated value in the form of a character string.
+
+
+
+
+ Describe a parameter type that has an engineering/calibrated value in the form of an enumeration.
+
+
+
+
+ Describe a parameter type that has an engineering/calibrated value in the form of an integer.
+
+
+
+
+ Describe a parameter type that has an engineering/calibrated value in the form of a binary (usually hex represented).
+
+
+
+
+ Describe a parameter type that has an engineering/calibrated value in the form of a decimal.
+
+
+
+
+ Describe a parameter type that has an engineering/calibrated value in the form of a boolean enumeration.
+
+
+
+
+ Describe a parameter type that has an engineering/calibrated value in the form of a duration in time.
+
+
+
+
+ Describe a parameter type that has an engineering/calibrated value in the form of an instant in time.
+
+
+
+
+ Describe a parameter type that has an engineering/calibrated value in the form of an array of a primitive type.
+
+
+
+
+ Describe a parameter type that has an engineering/calibrated value in the form of a structure of parameters of other types.
+
+
+
+
+
+
+ A reference to a Parameter. Uses Unix ‘like’ naming across the SpaceSystem Tree (e.g., SimpleSat/Bus/EPDS/BatteryOne/Voltage). To reference an individual member of an array use the zero based bracket notation commonly used in languages like C, C++, and Java.
+
+
+
+
+
+ One or more physical addresses may be associated with each Parameter. Examples of physical addresses include a location on the spacecraft or a location on a data collection bus.
+
+
+
+
+ Contains the address (e.g., channel information) required to process the spacecraft telemetry streams. May be an onboard id, a mux address, or a physical location.
+ Contains the address (channel information) required to process the spacecraft telemetry streams
+
+
+
+
+
+
+ Describe the physical address(s) that this parameter is collected from. Examples of physical addresses include a memory location on the spacecraft or a location on a data collection bus, with the source identified with a descriptive name for the region of memory, such as RAM, Flash, EEPROM, and other possibilities that can be adapted for program specific usage.
+
+
+
+
+ A sub-address may be used to further specify the location if it fractionally occupies the address. Additional possibilities exist for separating partitions of memory or other address based storage mechanisms. This specification does not specify spacecraft specific hardware properties, so usage of addressing information is largely program and platform specific.
+
+
+
+
+
+ A descriptive name for the location, such as a memory type, where this address is located.
+
+
+
+
+ The address within the memory location. This specification does not specify program and hardware specific attributes, such as address size and address region starting location. These are part of the spacecraft hardware properties.
+
+
+
+
+
+ A service is a logical grouping of container and/or messages.
+
+
+
+
+
+
+
+ Describes a string parameter type. Three forms are supported: fixed length, variable length and variable length using a prefix. See StringDataEncodingType and StringDataType.
+
+
+
+
+
+
+ Default alarm definitions are those which do not adjust definition logic based on the value of other parameters. Other parameters may participate in the determination of an alarm condition for this parameter, but the definition logic of the alarm on this parameter is constant. If the alarming logic on this parameter changes based on the value of other parameters, then it is a ContextAlarm and belongs in the ContextAlarmList element.
+
+
+
+
+ Context alarm definitions are those which adjust the definition logic for this parameter based on the value of other parameters. A context which evaluates to being in effect, based on the testing of another parameter, takes precedence over the default alarms in the DefaultAlarm element. If the no context alarm evaluates to being in effect, based on the testing of another parameter, then the default alarm definitions from the DefaultAlarm element will remain in effect. If multiple contexts evaluate to being in effect, then the first one that appears will take precedence.
+
+
+
+
+
+
+
+
+ Describes a relative time parameter type. Relative time parameters are time offsets (e.g. 10 second, 1.24 milliseconds, etc.) See IntegerDataEncodingType, FloatDataEncoding and RelativeTimeDataType.
+
+
+
+
+
+
+ Default alarm definitions are those which do not adjust definition logic based on the value of other parameters. Other parameters may participate in the determination of an alarm condition for this parameter, but the definition logic of the alarm on this parameter is constant. If the alarming logic on this parameter changes based on the value of other parameters, then it is a ContextAlarm and belongs in the ContextAlarmList element.
+
+
+
+
+ Context alarm definitions are those which adjust the definition logic for this parameter based on the value of other parameters. A context which evaluates to being in effect, based on the testing of another parameter, takes precedence over the default alarms in the DefaultAlarm element. If the no context alarm evaluates to being in effect, based on the testing of another parameter, then the default alarm definitions from the DefaultAlarm element will remain in effect. If multiple contexts evaluate to being in effect, then the first one that appears will take precedence.
+
+
+
+
+
+
+
+
+ A telemetered Parameter is one that will have values in telemetry. A derived Parameter is one that is calculated, usually by an Algorithm. A constant Parameter is one that is used as a constant in the system (e.g. a vehicle id). A local Parameter is one that is used purely by the software locally (e.g. a ground command counter). A ground Parameter is one that is generated by an asset which is not the spacecraft.
+
+
+
+
+
+
+
+
+
+
+
+ Describes a time association consisting of an instance of an absolute time parameter (parameterRef) and this entry. Because telemetry parameter instances are oftentimes "time-tagged" with a timing signal either provided on the ground or on the space system. This data element allows one to specify which of possibly many AbsoluteTimeParameters to use to "time-tag" parameter instances with. See AbsoluteTimeParameterType.
+
+
+
+
+
+ If true, then the current value of the AbsoluteTime will be projected to current time. In other words, if the value of the AbsoluteTime parameter was set 10 seconds ago, then 10 seconds will be added to its value before associating this time with the parameter.
+
+
+
+
+ The offset is used to supply a relative time offset from the time association and to this parameter
+
+
+
+
+ Specify the units the offset is in, the default is si_second.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ This schema defines the dictionary for commanding
+
+
+
+ Describe an absolute time argument type relative to a known epoch (such as TAI). The string representation of this time should use the [ISO 8601] extended format CCYY-MM-DDThh:mm:ss where "CC" represents the century, "YY" the year, "MM" the month and "DD" the day, preceded by an optional leading "-" sign to indicate a negative number. If the sign is omitted, "+" is assumed. The letter "T" is the date/time separator and "hh", "mm", "ss" represent hour, minute and second respectively. Additional digits can be used to increase the precision of fractional seconds if desired i.e. the format ss.ss... with any number of digits after the decimal point is supported. See TAIType, IntegerDataEncoding and AbsoluteTimeDataType.
+
+
+
+
+
+
+
+ Describe an array argument type. The size and number of dimension are described here. See ArrayParameterRefEntryType, NameReferenceType and ArrayDataType.
+
+
+
+
+
+
+ Describe the dimensions of this array.
+
+
+
+
+
+
+
+
+ Describe a complex data type analogous to a C-struct. Each field of the data type is called a Member. Each Member is part of the MemberList which forms the list of items to be placed under this data type’s name. The MemberList defines a data block and block’s size is defined by the DataEncodings of each Member’s type reference. The data members are ordered and contiguous in the MemberList element (packed). Each member may be addressed by the dot syntax similar to C such as P.voltage if P is the referring parameter and voltage is of a member of P’s aggregate type. See MemberType, MemberListType, DataEncodingType, NameReferenceType, and AggregateDataType.
+
+
+
+
+
+
+
+ Argument Assignments specialize a MetaCommand or BlockMetaCommand when inheriting from another MetaCommand. General argument values can be restricted to specific values to further specialize the MetaCommand. Use it to ‘narrow’ a MetaCommand from its base MetaCommand by specifying values of arguments for example, a power command may be narrowed to a power on’ command by assigning the value of an argument to ‘on’. See ArgumentAssignmentType and MetaCommandType.
+
+
+
+
+ Specialize this command definition when inheriting from a more general MetaCommand by restricting the specific values of otherwise general arguments.
+
+
+
+
+
+
+ Describe an assignment of an argument with a calibrated/engineering value. See ArgumentAssignmentListType.
+
+
+
+ The named argument from the base MetaCommand to assign/restrict with a value.
+
+
+
+
+ Specify value as a string compliant with the XML schema (xs) type specified for each XTCE type: integer=xs:integer; float=xs:double; string=xs:string; boolean=xs:boolean; binary=xs:hexBinary; enum=xs:string from EnumerationList; relative time=xs:duration; absolute time=xs:dateTime. Supplied value must be within the ValidRange specified for the type.
+
+
+
+
+
+ Identical to ComparisonType but supports argument instance references.
+
+
+
+
+ This parameter instance is being compared to the value in the parent element using the comparison defined there also.
+
+
+
+
+ This argument instance is being compared to the value in the parent element using the comparison defined there also.
+
+
+
+
+
+ Comparison operator to use with equality being the common default.
+
+
+
+
+ Specify as: integer data type using xs:integer, float data type using xs:double, string data type using xs:string, boolean data type using xs:boolean, binary data type using xs:hexBinary, enum data type using label name, relative time data type using xs:duration, absolute time data type using xs:dateTime. Values must not exceed the characteristics for the data type or this is a validation error. Takes precedence over an initial value given in the data type. Values are calibrated unless there is an option to override it.
+
+
+
+
+
+ Identical to ComparisonCheckType but supports argument instance references.
+
+
+
+
+
+
+
+ Left hand side parameter instance.
+
+
+
+
+ Left hand side argument instance.
+
+
+
+
+
+ Comparison operator.
+
+
+
+
+
+
+ Right hand side parameter instance. Parameter is assumed to be of the same type as the comparison Argument or Parameter.
+
+
+
+
+ Right hand side argument instance. Argument is assumed to be of the same type as the comparison Argument or Parameter.
+
+
+
+
+
+ Specify as: integer data type using xs:integer, float data type using xs:double, string data type using xs:string, boolean data type using xs:boolean, binary data type using xs:hexBinary, enum data type using label name, relative time data type using xs:duration, absolute time data type using xs:dateTime. Values must not exceed the characteristics for the data type or this is a validation error. Takes precedence over an initial value given in the data type. Values are calibrated unless there is an option to override it.
+
+
+
+
+
+
+
+
+
+ Identical to ComparisonListType but supports argument instance references.
+
+
+
+
+ List of Comparison elements must all be true for the comparison to evaluate to true.
+
+
+
+
+
+
+ Identical to ArgumentDiscreteLookupType but supports argument instance references.
+
+
+
+
+
+ Value to use when the lookup conditions are true.
+
+
+
+
+
+
+
+ Identical to DiscreteLookupListType but supports argument instance references.
+
+
+
+
+ Describe a lookup condition set using discrete values from arguments and/or parameters.
+
+
+
+
+
+
+ Identical to DynamicValueType but supports argument instance references.
+
+
+
+
+
+ Retrieve the value by referencing the value of an Argument.
+
+
+
+
+ Retrieve the value by referencing the value of a Parameter.
+
+
+
+
+
+ A slope and intercept may be applied to scale or shift the value selected from the argument or parameter.
+
+
+
+
+
+
+ Identical to InputAlgorithmType but supports argument instance references.
+
+
+
+
+
+
+ The InputSet describes the list of arguments and/or parameters that should be made available as input arguments to the algorithm.
+
+
+
+
+
+
+
+
+ Identical to InputSetType but supports argument instance references.
+
+
+
+
+ Reference a parameter to serve as an input to the algorithm.
+
+
+
+
+ Reference an argument to serve as an input to the algorithm.
+
+
+
+
+
+
+ An argument instance is the name of an argument as the reference is always resolved locally to the metacommand.
+
+
+
+ Give the name of the argument. There is no path, this is a local reference.
+
+
+
+
+ Typically the calibrated/engineering value is used and that is the default.
+
+
+
+
+
+ Defines a list of Arguments for a command definition.
+
+
+
+
+ Defines an Argument for a command definition. Arguments are local to the MetaCommand, BlockMetaCommand, and those that inherit from the definition.
+ Need to ensure that the named types actually exist
+
+
+
+
+
+
+ Identical to BooleanExpressionType but supports argument instance references.
+
+
+
+
+ Condition elements describe a test similar to the Comparison element except that the arguments/parameters used have additional flexibility.
+
+
+
+
+ This element describes tests similar to the ComparisonList element except that the arguments/parameters used are more flexible.
+
+
+
+
+ This element describes tests similar to the ComparisonList element except that the arguments/parameters used are more flexible.
+
+
+
+
+
+
+ Identical to ANDedConditionsType but supports argument instance references.
+
+
+
+
+
+
+ Condition elements describe a test similar to the Comparison element except that the arguments/parameters used have additional flexibility for the compare.
+
+
+
+
+ This element describes tests similar to the ComparisonList element except that the arguments/parameters used are more flexible and the and/or for multiple checks can be specified.
+
+
+
+
+
+
+
+
+ Identical to ORedConditionsType but supports argument instance references.
+
+
+
+
+
+
+ Condition elements describe a test similar to the Comparison element except that the arguments/parameters used have additional flexibility for the compare.
+
+
+
+
+ This element describes tests similar to the ComparisonList element except that the arguments/parameters used are more flexible and the and/or for multiple checks can be specified.
+
+
+
+
+
+
+
+
+ Identical to MatchCriteriaType but supports argument instance references.
+
+
+
+
+ A simple comparison check involving a single test of an argument or parameter value.
+
+
+
+
+ A series of simple comparison checks with an implicit 'and' in that they all must be true for the overall condition to be true.
+
+
+
+
+ An arbitrarily complex boolean expression that has additional flexibility on the terms beyond the Comparison and ComparisonList elements.
+
+
+
+
+ An escape to an externally defined algorithm.
+
+
+
+
+
+
+ An Argument has a name and can take on values with the underlying value type described by the ArgumentTypeRef. Describe the properties of a command argument referring to a data type (argument type). The bulk of properties associated with a command argument are in its argument type. The initial value specified here, overrides the initial value in the argument type. See BaseDataType, BaseTimeDataType and NameReferenceType.
+
+
+
+
+
+ Specify the reference to the argument type from the ArgumentTypeSet area using the path reference rules, either local to this SpaceSystem, relative, or absolute.
+
+
+
+
+ Specify as: integer data type using xs:integer, float data type using xs:double, string data type using xs:string, boolean data type using xs:boolean, binary data type using xs:hexBinary, enum data type using label name, relative time data type using xs:duration, absolute time data type using xs:dateTime. Values must not exceed the characteristics for the data type or this is a validation error. Takes precedence over an initial value given in the data type. Values are calibrated unless there is an option to override it.
+ The value type must match the Argument type
+
+
+
+
+
+
+
+ Describe an unordered collection of argument type definitions. These types named for the engineering/calibrated type of the argument. See BaseDataType and BaseTimeDataType.
+
+
+
+
+ Describe an argument type that has an engineering/calibrated value in the form of a character string.
+
+
+
+
+ Describe an argument type that has an engineering/calibrated value in the form of an enumeration.
+
+
+
+
+ Describe an argument type that has an engineering/calibrated value in the form of an integer.
+
+
+
+
+ Describe an argument type that has an engineering/calibrated value in the form of a binary (usually hex represented).
+
+
+
+
+ Describe an argument type that has an engineering/calibrated value in the form of a decimal.
+
+
+
+
+ Describe an argument type that has an engineering/calibrated value in the form of a boolean enumeration.
+
+
+
+
+ Describe an argument type that has an engineering/calibrated value in the form of a duration in time.
+
+
+
+
+ Describe an argument type that has an engineering/calibrated value in the form of an instant in time.
+
+
+
+
+ Describe an argument type that has an engineering/calibrated value in the form of an array of a primitive type.
+
+
+
+
+ Describe an argument type that has an engineering/calibrated value in the form of a structure of arguments of other types.
+
+
+
+
+
+
+ When specified, a BaseMetaCommand element identifies that this MetaCommand inherits (extends) another MetaCommand. It’s required ArgumentAssignmentList narrows or this command from the parent. This is typically used when specializing a generic MetaCommand to a specific MetaCommand. See MetaCommandType.
+
+
+
+
+ Argument Assignments specialize a MetaCommand or BlockMetaCommand when inheriting from another MetaCommand. General argument values can be restricted to specific values to further specialize the MetaCommand.
+
+
+
+
+
+ Reference to the MetaCommand definition that this MetaCommand extends.
+
+
+
+
+
+ Defines a binary engineering/calibrated argument type (often called “blob type”). The binary data may be of fixed or variable length, and has an optional encoding and decoding algorithm that may be defined to transform the data between space and ground. See BinaryDataEncodingType, IntegerValueType, InputAlgorithmType, and BinaryDataType.
+
+
+
+
+
+
+
+ Describe an ordered grouping of MetaCommands into a list, duplicates are valid. The block contains argument values fully specified. See MetaCommandStepListType.
+
+
+
+
+
+
+ List of the MetaCommands to include in this BlockMetaCommand.
+
+
+
+
+
+
+
+
+ Defines a boolean argument type which has two values only: ‘True’ (1) or ‘False’ (0). The values one and zero may be mapped to a specific string using the attributes oneStringValue and zeroStringValue. This type is a simplified form of the EnumeratedDataType. See IntegerDataEncoding and BooleanDataType.
+
+
+
+
+
+
+
+ Describe an entry list for a CommandContainer which is associated with a MetaCommand. The entry list for a MetaCommand CommandContainer element operates in a similar fashion as the entry list element for a SequenceContainer element. It adds fixed value and argument entries to the entry list not present in sequence containers. See MetaCommandType, CommandContainerType and EntryListType.
+
+
+
+
+ Specify a Parameter to be a part of this container layout definition.
+
+
+
+
+ Specify a portion of a Parameter to be a part of this container layout definition. This is used when the Parameter is reported in fractional parts in the container before being fully updated.
+
+
+
+
+ Specify the content of another Container to be a part of this container layout definition.
+
+
+
+
+ Specify a portion of another Container to be a part of this container layout definition.
+
+
+
+
+ Specify a portion of a Stream to be a part of this container layout definition.
+
+
+
+
+ Specify a previous (not last reported) value of a Parmeter to be a part of this container layout definition.
+
+
+
+
+ Specify an Array Type Parameter to be a part of this container layout definition when the Container does not populate the entire space of the Array contents. If the entire space of the Array is populated, a tolerant implementation will accept ParameterRefEntry also.
+
+
+
+
+ Specify an Argument to be a part of this container layout definition.
+
+
+
+
+ Specify an Array Type Argument to be a part of this container layout definition when the Container does not populate the entire space of the Array contents. If the entire space of the Array is populated, a tolerant implementation will accept ArgumentRefEntry also.
+
+
+
+
+ Specify an immutable value to be a part of this container layout definition.
+
+
+
+
+
+
+ Contains an unordered Set of Command Containers
+
+
+
+
+
+
+
+ Describe a MetaCommand command container. The command container may contain arguments, parameters, other basic containers, and fixed values. Arguments are supplied by the user of a commanding application; parameters are supplied by the controlling system. Parameters and arguments map source data types to encodings. See MetaCommandType.
+
+
+
+
+
+
+ List of item entries to pack/encode into this container definition.
+
+
+
+
+ When a MetaCommand inherits/extends another MetaCommand, this references the CommandContainer from the BaseMetaCommand.
+
+
+
+
+
+
+
+
+ A command verifier is used to check that the command has been successfully executed. Command Verifiers may be either a Custom Algorithm or a Boolean Check or the presence of a Container for a relative change in the value of a Parameter. The CheckWindow is a time period where the verification must test true to pass.
+
+
+
+
+
+
+
+ Verification is a list of comparisons.
+
+
+
+
+ Verification is a new instance of the referenced container. For example, sending a command to download memory then receiving a packet with the memory download would be verified upon receipt of the packet.
+
+
+
+
+ Verification is a telemetry parameter value change on the ground. For example, a command counter.
+
+
+
+
+ Verification is outside the scope of regular command and telemetry processing.
+
+
+
+
+ Verification is a boolean expression of conditions.
+
+
+
+
+ Verification is a single comparison.
+
+
+
+
+
+
+ Define a time window for checking for verification.
+
+
+
+
+ Define a time window algorithmically for verification.
+
+
+
+
+
+
+
+
+
+ Describes an enumerated argument type. The enumeration list consists of label/value pairs. See EnumerationListType, IntegerDataEncodingType and EnumeratedDataType.
+
+
+
+
+
+
+
+ Describe a floating point argument type. Several encodings are supported. Calibrated integer to float relationships should be described with this data type. Use the data encoding to define calibrators. Joins integer as one of the numerics. See FloatDataEncodingType, IntegerDataEncodingType and FloatDataType.
+
+
+
+
+
+
+ Provides additional platform/program specific ranging information.
+
+
+
+
+
+
+
+
+ Describes an integer argument type. Several encodings supported. Calibrated integer to integer relationships should be described with this data type. Use the integer data encoding to define calibrators. Joins float as one of the numerics. See IntegerDataEncoding and IntegerDataType.
+
+
+
+
+
+
+ Provides additional platform/program specific ranging information.
+
+
+
+
+
+
+
+
+ Describes an unordered collection of command definitions. Duplicates are invalid based on the name attribute of MetaCommand and BlockMetaCommand. See MetaCommandType and BlockMetaCommandType.
+
+
+
+
+ All atomic commands to be sent on this mission are listed here. In addition this area has verification and validation information.
+
+
+
+
+
+
+
+
+ Used to include a MetaCommand defined in another sub-system in this sub-system.
+
+
+
+
+ Used to define a command that includes more than one atomic MetaCommand definition.
+
+
+
+
+
+
+ Describe the list of MetaCommand definitions that form the block command. Contains an ordered list of MetaCommandSteps where each step is a MetaCommand with associated arguments, duplicates are valid. See BlockMetaCommandType.
+
+
+
+
+ A MetaCommand with specific specified argument values to include in the BlockMetaCommand.
+
+
+
+
+
+
+ Describe a MetaCommand step, consisting MetaCommand reference and argument list. See MetaCommandStepListType and NameReferenceType.
+
+
+
+
+
+
+
+
+ Describe a command which consists of an abstract portion (MetaCommand) and an optional packaging portion (MetaCommand CommandContainer). An argument list is provided. MetaCommand may extend other MetaCommands and their CommandContainer may extend other CommandContainer or SequenceContainers. A MetaCommand’s CommandContainer is private except as referred to in BaseMetaCommand (they are not visible to other containers and cannot be used in an entry list). MetaCommands may also define various other behavioral aspects of a command such as command verifiers. See CommandContainerType, ArgumentListType, BaseMetaCommandType and BaseContainerType.
+
+
+
+
+
+
+ Optional inheritance for this MetaCommand from another named MetaCommand.
+
+
+
+
+ Optional. Normally used when the database is built in a flat, non-hierarchical format. May be used by implementations to group MetaCommands together.
+
+
+
+
+ Many commands have one or more options. These are called command arguments. Command arguments may be of any of the standard data types. MetaCommand arguments are local to the MetaCommand, but may be referenced in inherited MetaCommand definitions, generally to apply Argument Assignments to the values.
+
+
+
+
+ Tells how to package/encode this command definition in binary form.
+
+
+
+
+ List of constraints to check when sending this command.
+
+
+
+
+ Some Command and Control Systems may require special user access or confirmations before transmitting commands with certain levels. The level is inherited from the Base MetaCommand.
+
+
+
+
+ Some Command and Control Systems may require special user access or confirmations before transmitting commands with certain levels. In addition to the default, Significance can be defined in contexts where it changes based on the values of parameters.
+
+
+
+
+ An Interlock is a type of Constraint, but not on Command instances of this MetaCommand; Interlocks apply instead to the next command. An Interlock will block successive commands until this command has reached a certain stage (through verifications). Interlocks are scoped to a SpaceSystem basis.
+
+
+
+
+ Functional list of conditions/changes to check after sending this command to determine success or failure.
+
+
+
+
+ List of parameters to set new values upon completion of sending this command.
+
+
+
+
+ List of parameters to suspend alarm processing/detection upon completion of sending this command.
+
+
+
+
+
+ Abstract MetaCommand definitions that are not instantiated, rather only used as bases to inherit from to create specialized command definitions.
+
+
+
+
+
+
+
+ Describes a relative time argument type. Relative time parameters are time offsets (e.g. 10 second, 1.24 milliseconds, etc.) See IntegerDataEncodingType, FloatDataEncoding and RelativeTimeDataType.
+
+
+
+
+
+
+
+ Significance provides some cautionary information about the potential consequence of each MetaCommand.
+
+
+
+ If none is supplied, then the current SpaceSystem is assumed to be the one at risk by the issuance of this command
+
+
+
+
+
+
+
+ Describes a string parameter type. Three forms are supported: fixed length, variable length and variable length using a prefix. See StringDataEncodingType and StringDataType.
+
+
+
+
+
+
+
+
+
+ A verifier that means the SpaceSystem has accepted the command
+
+
+
+
+
+
+
+ Used by CommandVerifiers to limit the time allocated to check for the verification. See CheckWindowAlgorithmsType.
+
+
+
+
+
+
+
+ Used by CommandVerifiers to limit the time allocated to check for the verification. See CommandVerifierType.
+
+
+
+
+
+
+
+
+ A possible set of verifiers that all must be true for the command be considered completed.
+
+
+
+
+
+
+
+
+
+
+
+ Describe a significance level for a MetaCommand definition where the significance level depends on matching a context value. See ContextMatchType and SignificanceType.
+
+
+
+
+ Describe the context matching value and source that will enable the Significance listed in the Significance element.
+
+
+
+
+ Describe the signficance of this MetaCommand definition. See SignificanceType.
+
+
+
+
+
+
+ Describe an ordered list of ContextSignificance elements where the significance on the first context match to test true is used as the significance of the MetaCommand. If there is a DefaultSignificance, it is overrideen by the matching context. See ContextSignificantType and MetaCommandType.
+
+
+
+
+ Describe a significance level for a MetaCommand definition where the significance level depends on matching a context value. See ContextMatchType and SignificanceType.
+
+
+
+
+
+
+ A verifier that indicates that the command is being executed. An optional Element indicates how far along the command has progressed either as a fixed value or an (possibly scaled) ParameterInstance value.
+
+
+
+
+
+
+
+
+
+
+
+ When true, indicates that the command failed. timeToWait is how long to wait for the FailedVerifier to test true.
+
+
+
+
+
+
+
+
+
+
+
+ Describe a type of constraint on the next command, rather than this command. Interlocks apply only to the next command. An interlock will block successive commands until this command has reached a certain stage of verifier. Interlocks are scoped to a SpaceSystem basis: they by default apply to the SpaceSystem the MetaCommand is defined in but this may be overridden. See MetaCommandType and VerifierSetType.
+
+
+
+ The name of a SpaceSystem this Interlock applies to. By default, it only applies to the SpaceSystem that contains this MetaCommand.
+
+
+
+
+ The verification stage of the command that releases the interlock, with the default being complete.
+
+
+
+
+ Only applies when the verificationToWaitFor attribute is 'queued' or 'executing'.
+
+
+
+
+ A flag that indicates that under special circumstances, this Interlock can be suspended.
+
+
+
+
+
+ Sets a Parameter to a new value (either from a derivation or explicitly) after the command has been verified (all verifications have passed).
+ Value type must match Parameter type.
+
+
+
+
+
+
+ Specify a MathOperation to use to set the Parameter value. See MathOperationType.
+
+
+
+
+ Specify value as a string compliant with the XML schema (xs) type specified for each XTCE type: integer=xs:integer; float=xs:double; string=xs:string; boolean=xs:boolean; binary=xs:hexBinary; enum=xs:string from EnumerationList; relative time= xs:duration; absolute time=xs:dateTime. Supplied value must be within the ValidRange specified for the Parameter and appropriate for the type.
+
+
+
+
+
+ This attribute provides more specific control over when the Parameter value is set. By default, it is when the command have all verifications complete. See VerifierEnumerationType.
+
+
+
+
+
+
+
+ Parameters that are set with a new value after the command has been sent. Appended to the Base Command list
+
+
+
+
+
+
+
+ Will suspend all Alarms associated with this Parameter for the given suspense time after the given verifier
+
+
+
+
+
+
+
+
+
+
+ Sometimes it is necessary to suspend alarms - particularly 'change' alarms for commands that will change the value of a Parameter
+
+
+
+
+
+
+
+ A parameter change in value or specified delta change in value.
+
+
+
+
+
+
+
+
+ A verifer that means the command is scheduled for execution by the SpaceSystem.
+
+
+
+
+
+
+
+ A verifier that simply means the SpaceSystem has received the command.
+
+
+
+
+
+
+
+ Sent from range means the command has been transmitted to the spacecraft by the network that connects the ground system to the spacecraft. Obviously, this verifier must come from something other than the spacecraft.
+
+
+
+
+
+
+
+ Time units the time association decimal value is in.
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Transferred to range means the command has been received to the network that connects the ground system to the spacecraft. Obviously, this verifier must come from something other than the spacecraft.
+
+
+
+
+
+
+
+ A CommandTransmission constraint is used to check that the command can be run in the current operating mode and may block the transmission of the command if the constraint condition is true.
+
+
+
+
+
+ Pause during timeOut, fail when the timeout passes
+
+
+
+
+
+ Indicates whether the constraints for a Command may be suspended.
+
+
+
+
+
+
+
+ Appended to the TramsmissionConstraint List of the base command. Constraints are checked in order.
+
+
+
+
+
+
+
+ An enumerated list of verifier types
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Describe a collection of unordered verifiers. A command verifier is a conditional check on the telemetry from a SpaceSystem that that provides positive indication on the processing state of a command. There are eight different verifiers each associated with difference states in command processing: TransferredToRange, TransferredFromRange, Received, Accepted, Queued, Execution, Complete, and Failed. There may be multiple ‘complete’ and 'execution' verifiers. If the MetaCommand is part of an inheritance relation (BaseMetaCommand), the 'complete' and 'execution' verifier sets are appended to any defined in the parent MetaCommand. All others will override a verifier defined in a BaseMetaCommand. Duplicate verifiers in the list of CompleteVerifiers and ExecutionVerifiers before and after appending to the verifiers in BaseMetaCommand should be avoided. See MetaCommandType and BaseMetaCommandType for additional information.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ This schema defines the structure for an Algorithm. An Algorithm may be one of a growing set of pre-defined algorithms or a named escape into a user defined algorithm where (depending on the system) the name of the algorithm may be a java class, a function in a shared library, an external program or some other reference to an outside algorithm. At some later date, this schema may also allow the logic of the user defined algorithm to be defined within the instance document itself (perhaps using MathML?).
+
+
+
+ This optional element may be used to enter Pseudo or actual code for the algorithm. The language for the algorithm is specified with the language attribute
+
+
+
+
+
+
+
+
+
+ A base type for the various triggers, purely to improve the mappings created by data binding compilers.
+
+
+
+
+ Describe checksum information.
+
+
+
+
+ Assumed to return the computed checksum.
+
+
+
+
+
+
+
+ Qualified list of name checksum algorithms. If custom is chosen, InputAlgorithm must be set.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Document a custom checksum algorithm
+
+
+
+
+
+
+
+
+
+ Names and provides a value for a constant input to the algorithm. There are two attributes to Constant, constantName and value. constantName is a variable name in the algorithm to be executed. value is the value of the constant to be used.
+
+
+
+
+
+
+ Describe an ordered list of calibrators with a context match. Useful when different calibrations must be used depending on a matching value. The first context that matches determines which calibrator to use. See IntegerDataEncodingType and FloatDataEncodingType.
+
+
+
+
+ Describe a calibrator that depends on a matching value using a ContextMatch. When the context matches for the calibrator, the default calibrator is overridden, if it exists.
+
+
+
+
+
+
+ This is the external algorithm. Multiple entries are provided so that the same database may be used for multiple implementation s
+
+
+
+
+
+
+
+
+
+
+
+ A set of labeled inputs is added to the SimpleAlgorithmType
+
+
+
+
+
+
+ The InputSet describes the list of parameters that should be made available as input arguments to the algorithm.
+
+
+
+
+
+
+
+
+ A set of labeled outputs are added to the SimpleInputAlgorithmType
+
+
+
+
+
+
+
+
+
+
+
+
+ Input output algorithm is extended with a set of labeled triggers. See InputOutputAlgorithmType.
+
+
+
+
+
+
+
+
+ First telemetry container from which the output parameter should be calculated.
+
+
+
+
+ Algorithm processing priority. If more than one algorithm is triggered by the same container, the lowest priority algorithm should be calculated first.
+
+
+
+
+
+
+
+ Names an input parameter to the algorithm. There are two attributes to InputParm, inputName and parameterName. parameterName is a parameter reference name for a parameter that will be used in this algorithm. inputName is an optional "friendly" name for the input parameter.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Describe a postfix (Reverse Polish Notation (RPN)) notation based mathmatical equations. See MathOperationType.
+
+
+
+
+
+
+ The contents of the Math Operation as an algorithm definition in RPN. See TriggeredMathOperationType.
+
+
+
+
+
+
+
+
+ Describe a reference to container that triggers an event when the telemetry container referred to is updated (processed). See TriggerSetType.
+
+
+
+
+
+ Reference to the Container whose update/receipt triggers this algorithm to evaluate.
+
+
+
+
+
+
+
+ Describe a periodic time basis to trigger an event. See TriggerSetType.
+
+
+
+
+
+ The periodic rate in time in which this algorithm is triggered to evaluate.
+
+
+
+
+
+
+
+ Describe a reference to parameter that triggers an event when the telemetry parameter referred to is updated (processed) with a new value. See TriggerSetType.
+
+
+
+
+
+ Reference to the Parameter whose update triggers this algorithm to evaluate.
+
+
+
+
+
+
+
+ Names an output parameter to the algorithm. There are two attributes to OutputParm, outputName and parameterName. parameterName is a parameter reference name for a parameter that will be updated by this algorithm. outputName is an optional "friendly" name for the output parameter.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ The simplest form of algorithm, a SimpleAlgorithmType contains an area for a free-form pseudo code description of the algorithm plus a Set of references to external algorithms. External algorithms are usually unique to a ground system type. Multiple external algorithms are possible because XTCE documents may be used across multiple ground systems.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ A trigger is used to initiate the processing of some algorithm. A trigger may be based on an update of a Parameter, receipt of a Container, or on a time basis. Triggers may also have a maximum rate that limits how often the trigger can be invoked.
+
+
+
+
+ This element instructs the trigger to invoke the algorithm evaluation when a Parameter update is received.
+
+
+
+
+ This element instructs the trigger to invoke the algorithm evaluation when a Container is received.
+
+
+
+
+ This element instructs the trigger to invoke the algorithm evaluation using a timer.
+
+
+
+
+
+ Triggers may optionally be named.
+
+
+
+
+ This attribute is a maximum rate that constrains how quickly this trigger may evaluate the algorithm to avoid flooding the implementation. The default is once per second. Setting to 0 results in no maximum.
+
+
+
+
+
+
+
+ Supplies an optional non-reference-able name and short description for calibrators. Also includes an optional ancillary data for any special local flags, note that these may not necessarily transfer to another recipient of an instance document.
+
+
+
+
+ Optional additional ancillary information for this calibrator/algorithm
+
+
+
+
+
+ Optional name for this calibrator/algorithm
+
+
+
+
+ Optional description for this calibrator/algorithm
+
+
+
+
+
+ Describe a calibrator to transform a source data type raw/uncalibrated value (e.g. an integer count from a spacecraft) to an engineering unit/calibrated value for users (e.g. a float).
+
+
+
+
+
+
+ Describes a calibrator in the form of a piecewise defined function
+
+
+
+
+ Describes a calibrator in the form of a polynomial function
+
+
+
+
+ Describes a calibrator in the form of a user/program/implementation defined function
+
+
+
+
+
+
+
+
+ Describe a change value used to test verification status. See CommandVerifierType.
+
+
+
+ Value as a floating point number.
+
+
+
+
+
+ Describe a mathematical function for calibration where the mathematical function is defined using the MathOperationType.
+
+
+
+
+
+ Describe a postfix (aka Reverse Polish Notation (RPN)) expression for mathematical equations. It uses a stack where operands (either fixed values or ParameterInstances) are pushed onto the stack from first to last in the XML. As the operators are specified, each pops off operands as it evaluates them, and pushes the result back onto the stack. For example, the stack, 4 8 /, would result as 0.5. In this case postfix is used to avoid having to specify parenthesis. To convert from infix to postfix, use Dijkstra's "shunting yard" algorithm.
+
+
+
+ Use a constant in the calculation.
+
+
+
+
+ Use the value of this parameter in the calculation. It is the calibrator's value only. If the raw value is needed, specify it explicitly using ParameterInstanceRefOperand. Note this element has no content.
+
+
+
+
+ All operators utilize operands on the top values in the stack and leaving the result on the top of the stack. Ternary operators utilize the top three operands on the stack, binary operators utilize the top two operands on the stack, and unary operators use the top operand on the stack.
+
+
+
+
+ This element is used to reference the last received/assigned value of any Parameter in this math operation.
+
+
+
+
+
+
+
+
+ Describe a polynomial equation for calibration. This is a calibration type where a curve in a raw vs calibrated plane is described using a set of polynomial coefficients. Raw values are converted to calibrated values by finding a position on the curve corresponding to the raw value. The first coefficient belongs with the X^0 term, the next coefficient belongs to the X^1 term and so on. See CalibratorType.
+
+
+
+
+
+
+ A single term in the polynomial function.
+ Generally only up to second order powers are reflexive. Implementations may limit the maximum number of terms supported.
+
+
+
+
+
+
+
+
+ Describe a spline function for calibration using a set of at least 2 points. Raw values are converted to calibrated values by finding a position on the line corresponding to the raw value. The line may be interpolated and/or extrapolated as needed. The interpolation order may be specified for all the points and overridden on individual points. The algorithm triggers on the input parameter. See CalibratorType.
+
+
+
+
+
+
+ Describes a single point of the spline or piecewise function.
+
+
+
+
+
+ The interpolation order to apply to the overall spline function. Order 0 is no slope between the points (flat). Order 1 is linear interpolation. Order 2 would be quadratic and in this special case, 3 points would be required, etc.
+
+
+
+
+ Extrapolation allows the closest outside point and the associated interpolation to extend outside of the range of the points in the spline function.
+
+
+
+
+
+
+
+
+
+ This schema provides a language for defining binary stream data.
+
+
+
+ After searching for the frame sync marker for some number of bits, it may be desirable to invert the incoming data, and then look for frame sync. In some cases this will require an external algorithm
+
+
+
+
+
+
+
+
+ A stream type where some level of custom processing (e.g. convolutional, encryption, compression) is performed. Has a reference to external algorithms for encoding and decoding algorithms.
+ Must check to ensure that the attributes encodedStreamRef and decodedStreamRef point to valid Streams
+
+
+
+
+
+
+
+ Algorithm outputs may be used to set decoding quality parameters.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ The pattern of bits used to look for frame synchronization.
+
+
+
+
+
+
+ The top level type definition for all data streams that are frame based.
+
+
+
+
+
+
+
+ This Container (usually abstract) is the container that is in the fixed frame stream. Normally, this is a general container type from which many specific containers are inherited.
+
+
+
+
+
+
+ This is a reference to a connecting stream - say a custom stream.
+
+
+
+
+
+
+
+
+ For streams that contain a series of frames with a fixed frame length where the frames are found by looking for a marker in the data. This marker is sometimes called the frame sync pattern and sometimes the Asynchronous Sync Marker (ASM). This marker need not be contiguous although it usually is.
+
+
+
+
+
+
+
+
+ Allowed slip (in bits) in either direction for the sync pattern
+
+
+
+
+
+
+
+
+ Describe a sync pattern and an optional reference to an algorithm used to invert the stream if the frame sync pattern is not found. See FixedFrameStreamType.
+
+
+
+
+
+
+ The pattern of bits used to look for frame synchronization. See SyncPatternType.
+
+
+
+
+
+
+
+
+ A PCM Stream Type is the high level definition for all Pulse Code Modulated (PCM) (i.e., binary) streams.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Holds a reference to a stream
+
+
+
+ name of reference stream
+
+
+
+
+
+ Contains an unordered set of Streams.
+
+
+
+
+
+
+
+
+
+ A Sync Strategy specifies the strategy on how to find frames within a stream of PCM data. The sync strategy is based upon a state machine that begins in the 'Search' state until the first sync marker is found. Then it goes into the 'Verify' state until a specified number of successive good sync markers are found. Then, the state machine goes into the 'Lock' state, in the 'Lock' state frames are considered good. Should a sync marker be missed in the 'Lock' state, the state machine will transition into the 'Check' state, if the next sync marker is where it's expected within a specified number of frames, then the state machine will transition back to the 'Lock' state, it not it will transition back to 'Search'.
+
+
+
+
+
+
+
+
+ Maximum number of bit errors in the sync pattern (marker).
+
+
+
+
+
+ The pattern of bits used to look for frame synchronization.
+
+
+
+ CCSDS ASM for non-turbocoded frames = 1acffc1d
+
+
+
+
+
+
+ truncate the mask from the left
+
+
+
+
+ truncate the pattern from the left
+
+
+
+
+
+ For streams that contain a series of frames with a variable frame length where the frames are found by looking for a series of one's or zero's (usually one's). The series is called the flag. in the PCM stream that are usually made to be illegal in the PCM stream by zero or one bit insertion.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ A base schema type for describing an absolute time data type. Contains an absolute (to a known epoch) time. Use the [ISO 8601] extended format CCYY-MM-DDThh:mm:ss where "CC" represents the century, "YY" the year, "MM" the month and "DD" the day, preceded by an optional leading "-" sign to indicate a negative number. If the sign is omitted, "+" is assumed. The letter "T" is the date/time separator and "hh", "mm", "ss" represent hour, minute and second respectively. Additional digits can be used to increase the precision of fractional seconds if desired i.e. the format ss.ss... with any number of digits after the decimal point is supported. See AbsoluteTimeParameterType and AbsoluteTimeArgumentType. See AbsouteTimeParameterType, AbsoluteTimeArgumentType and BaseTimeDataType.
+
+
+
+
+
+ Default/Initial value is always given in calibrated form.
+
+
+
+
+
+
+
+ A base schema type for describing an absolute time data type. Contains an absolute (to a known epoch) time. Use the [ISO 8601] extended format CCYY-MM-DDThh:mm:ss where "CC" represents the century, "YY" the year, "MM" the month and "DD" the day, preceded by an optional leading "-" sign to indicate a negative number. If the sign is omitted, "+" is assumed. The letter "T" is the date/time separator and "hh", "mm", "ss" represent hour, minute and second respectively. Additional digits can be used to increase the precision of fractional seconds if desired i.e. the format ss.ss... with any number of digits after the decimal point is supported. See AbsoluteTimeParameterType and AbsoluteTimeArgumentType. See AbsouteTimeParameterType, AbsoluteTimeArgumentType and BaseTimeDataType.
+
+
+
+
+
+ Default/Initial value is always given in calibrated form.
+
+
+
+
+
+
+
+ A base schema type for describing a complex data type analogous to a C-struct. Each field of the data type is called a Member. Each Member is part of the MemberList which forms the list of items to be placed under this data type’s name. The MemberList defines a data block and block’s size is defined by the DataEncodings of each Member’s type reference. The data members are ordered and contiguous in the MemberList element (packed). Each member may be addressed by the dot syntax similar to C such as P.voltage if P is the referring parameter and voltage is of a member of P’s aggregate type. See MemberType, MemberListType, DataEncodingType, NameReferenceType, AggregateParameterType and AggregateArgumentType.
+
+
+
+
+
+
+ Ordered list of the members of the aggregate/structure. Members are contiguous.
+
+
+
+
+
+
+
+
+ A base schema type for describing an array data type. The number of and size of each dimension is defined in its two child types. See NameReferenceType, ArrayArgumentType and ArrayParameterType.
+
+
+
+
+
+ Reference to the data type that represents the type of the elements for this array.
+
+
+
+
+
+
+
+ An abstract schema type used by within the schema to derive the other simple/primitive engineering form data types: BooleanDataType, BinaryDataType, StringDataType, EnumeratedDataType, FloatDataType and IntegerDataType. The encoding elements are optional because they describe the raw wire encoded form of the data type. Encoding is only necessary when the type is telemetered in some form. Local variables and derived typically do not require encoding.
+
+
+
+
+
+
+ When appropriate, describe the units of measure that are represented by this parameter value.
+
+
+
+
+
+ Binary encoding is typically a "pass through" raw encoding form where one of the more common encodings is not required for the parameter. A custom transformation capability is available if needed.
+
+
+
+
+ Float encoding is a common encoding where the raw binary is in a form that gets interpreted as a decimal numeric value.
+
+
+
+
+ Integer encoding is a common encoding where the raw binary is in a form that gets interpreted as an integral value, either signed or unsigned.
+
+
+
+
+ String encoding is a common encoding where the raw binary is in a form that gets interpreted as a character sequence.
+
+
+
+
+
+
+ Must be derived from a like type (e.g,, String from String). No circular derivations.
+ Used to derive one Data Type from another - will inherit all the attributes from the baseType any of which may be redefined in this type definition.
+
+
+
+
+
+
+
+ Identical to BaseDataType but supports argument instance references.
+
+
+
+
+
+
+ When appropriate, describe the units of measure that are represented by this argument value.
+
+
+
+
+
+ Binary encoding is typically a "pass through" raw encoding form where one of the more common encodings is not required for the argument. A custom transformation capability is available if needed.
+
+
+
+
+ Float encoding is a common encoding where the raw binary is in a form that gets interpreted as a decimal numeric value.
+
+
+
+
+ Integer encoding is a common encoding where the raw binary is in a form that gets interpreted as an integral value, either signed or unsigned.
+
+
+
+
+ String encoding is a common encoding where the raw binary is in a form that gets interpreted as a character sequence.
+
+
+
+
+
+
+ Must be derived from a like type (e.g,, String from String). No circular derivations.
+ Used to derive one Data Type from another - will inherit all the attributes from the baseType any of which may be redefined in this type definition.
+
+
+
+
+
+
+
+ Identical to BaseTimeDataType but supports argument instance references.
+
+
+
+
+
+
+ Describes how the raw base counts of the time type are encoded/decoded.
+
+
+
+
+ Describes origin (epoch or reference) of this time type.
+
+
+
+
+
+ Extend another absolute or relative time type.
+
+
+
+
+
+
+
+ An abstract schema type used within the schema to derive other time based data types: RelativeTimeDataType and AbsoluteTimeDataType. An absolute time data type is a telemetered source/destination data type. A data encoding must be set. An optional epoch may be set. Time types are an exception to other primitives because, if the time data type is not telemetered, it still must have a data encoding set. See DataEncodingType, AbsoluteTimeDataType and RelativeTimeDataType.
+
+
+
+
+
+
+ Describes how the raw base counts of the time type are encoded/decoded.
+
+
+
+
+ Describes origin (epoch or reference) of this time type.
+
+
+
+
+
+ Extend another absolute or relative time type.
+
+
+
+
+
+
+
+ Identical to BinaryDataType but supports argument instance references.
+
+
+
+
+
+ Default/Initial value is always given in calibrated form. Extra bits are truncated from the MSB (leftmost).
+
+
+
+
+
+
+
+ A base schema type for describing a binary data engineering/calibrated type (often called “blob type”). The binary data may be of fixed or variable length, and has an optional encoding and decoding algorithm that may be defined to transform the data between space and ground. See BaseDataType, BinaryParameterType and BinaryArgumentType.
+
+
+
+
+
+ Default/Initial value is always given in calibrated form. Extra bits are truncated from the MSB (leftmost).
+
+
+
+
+
+
+
+ Identical to BooleanDataType but supports argument instance references.
+
+
+
+
+
+ Initial value must match either the oneStringValue or the zeroStringValue
+ Default/Initial value is always given in calibrated form.
+
+
+
+
+ Enumeration string representing the 1 value, with the default being 'True'.
+
+
+
+
+ Enumeration string representing the 0 value, with the default being 'False'.
+
+
+
+
+
+
+
+ A base schema type for describing a boolean data type which has two values only: ‘True’ (1) or ‘False’ (0). The values one and zero may be mapped to a specific string using the attributes oneStringValue and zeroStringValue. This type is a simplified form of the EnumeratedDataType. See BaseDataType, BooleanParameterType and BooleanArgumentType.
+
+
+
+
+
+ Initial value must match either the oneStringValue or the zeroStringValue
+ Default/Initial value is always given in calibrated form.
+
+
+
+
+ Enumeration string representing the 1 value, with the default being 'True'.
+
+
+
+
+ Enumeration string representing the 0 value, with the default being 'False'.
+
+
+
+
+
+
+
+ For partial entries of an array, the starting and ending index for each dimension, OR the Size must be specified. Indexes are zero based.
+
+
+
+
+ zero based index
+
+
+
+
+
+
+
+ Identical to DimensionType but supports argument instance references.
+
+
+
+
+ zero based index
+
+
+
+
+
+
+
+ Where the Dimension list is in this form: Array[1stDim][2ndDim][lastDim]. The last dimension is assumed to be the least significant - that is this dimension will cycle through its combination before the next to last dimension changes. The order MUST ascend or the array will need to be broken out entry by entry.
+
+
+
+
+ For an ArrayParameterType of size N, their should be N Dimensions
+ An array made up by multiple Entries should not have indexes that overlap, but should be continuous.
+
+
+
+
+
+
+ Identical to DimensionListType but supports argument instance references.
+
+
+
+
+ For an ArrayParameterType of size N, their should be N Dimensions
+ An array made up by multiple Entries should not have indexes that overlap, but should be continuous.
+
+
+
+
+
+
+ Identical to EnumeratedDataType but supports argument instance references.
+
+
+
+
+
+
+ Unordered list of label/value pairs where values cannot be duplicated.
+ Check that values do not overlap in the mappings.
+
+
+
+
+
+ Default/Initial value is always given in calibrated form. Use the label, it must be in the enumeration list to be valid.
+ Label must be in the enumeration list to be valid.
+
+
+
+
+
+
+
+ Describes an enumerated parameter type. The enumeration list consists of label/value pairs. See EnumerationListType, EnumeratedParameterType and EnumeratedArgumentType.
+
+
+
+
+
+
+ Unordered list of label/value pairs where values cannot be duplicated.
+ Check that values do not overlap in the mappings.
+
+
+
+
+
+ Default/Initial value is always given in calibrated form. Use the label, it must be in the enumeration list to be valid.
+ Label must be in the enumeration list to be valid.
+
+
+
+
+
+
+
+
+
+
+
+
+ Identical to FloatDataType but supports argument instance references.
+
+
+
+
+
+
+ This element provides the implementation with assistance rendering the value as a string for users.
+
+
+
+
+
+ Default/Initial value is always given in calibrated form.
+
+
+
+
+ Optional hint to the implementation about the size of the engineering/calibrated data type to use internally. Generally this can be determined by examination of the space required to capture the full range of the encoding, but it is not always clear when calibrators are in use. A tolerant implementation will endeavor to always make sufficient size engineering data types to capture the entire range of possible values.
+
+
+
+
+
+
+
+ A base schema type for describing a floating point engineering/calibrated data type. Several encodings are supported. Calibrated integer to float relationships should be described with this data type. Use the data encoding to define calibrators. Joins integer as one of the numerics. See BaseDataType, FloatParameterType and FloatArgumentType.
+
+
+
+
+
+
+ This element provides the implementation with assistance rendering the value as a string for users.
+
+
+
+
+ The Valid Range provides additional boundary/constraint information beyond that of the data encoding in the range of possible values that are meaningful to this parameter. Not to be construed as an alarm definition, violations of the valid range make a parameter value "unreasonable", as opposed to reasonable to be reported, but in a state which should be of concern.
+
+
+
+
+
+
+ By default and general recommendation, the valid range is specified in engineering/calibrated values, although this can be adjusted.
+
+
+
+
+
+
+
+
+
+ Initial value is always given in calibrated form
+
+
+
+
+ Optional hint to the implementation about the size of the engineering/calibrated data type to use internally. Generally this can be determined by examination of the space required to capture the full range of the encoding, but it is not always clear when calibrators are in use. A tolerant implementation will endeavor to always make sufficient size engineering data types to capture the entire range of possible values.
+
+
+
+
+
+
+
+ Identical to IntegerDataType but supports argument instance references.
+
+
+
+
+
+
+ This element provides the implementation with assistance rendering the value as a string for users.
+
+
+
+
+
+ Default/Initial value is always given in calibrated form. Default is base 10 form; binary, octal, or hexadecimal values may be given by preceding value with 0[b|B], 0[o|O|, 0[x|X] respectively.
+
+
+
+
+ Optional hint to the implementation about the size of the engineering/calibrated data type to use internally. Generally this can be determined by examination of the space required to capture the full range of the encoding, but it is not always clear when calibrators are in use. A tolerant implementation will endeavor to always make sufficient size engineering data types to capture the entire range of possible values.
+
+
+
+
+ Flag indicating if the engineering/calibrated data type used should support signed representation. This should not be confused with the encoding type for the raw value. The default is true.
+
+
+
+
+
+
+
+ Describe an integer engineering/calibrated data type. Several encodings are supported. See BaseDataType, IntegerParameterType and IntegerArgumentType.
+
+
+
+
+
+
+ This element provides the implementation with assistance rendering the value as a string for users.
+
+
+
+
+ The Valid Range provides additional boundary/constraint information beyond that of the data encoding in the range of possible values that are meaningful to this parameter. Not to be construed as an alarm definition, violations of the valid range make a parameter value "unreasonable", as opposed to reasonable to be reported, but in a state which should be of concern.
+
+
+
+
+
+
+ By default and general recommendation, the valid range is specified in engineering/calibrated values, although this can be adjusted.
+
+
+
+
+
+
+
+
+
+ Default/Initial value is always given in calibrated form. Default is base 10 form; binary, octal, or hexadecimal values may be given by preceding value with 0[b|B], 0[o|O|, 0[x|X] respectively.
+
+
+
+
+ Optional hint to the implementation about the size of the engineering/calibrated data type to use internally. Generally this can be determined by examination of the space required to capture the full range of the encoding, but it is not always clear when calibrators are in use. A tolerant implementation will endeavor to always make sufficient size engineering data types to capture the entire range of possible values.
+
+
+
+
+ Flag indicating if the engineering/calibrated data type used should support signed representation. This should not be confused with the encoding type for the raw value. The default is true.
+
+
+
+
+
+
+
+ Describe a member field in an AggregateDataType. Each member has a name and a type reference to a data type for the aggregate member name. If this aggregate is a Parameter aggregate, then the typeRef is a parameter type reference. If this aggregate is an Argument aggregate, then the typeRef is an argument type reference. References to an array data type is currently not supported. Circular references are not allowed. See MemberListType. AggregateParameterType and AggregateArgumentType.
+ ensure no circular references
+
+
+
+
+
+
+ Used to set the initial calibrated values of Parameters. Will overwrite an initial value defined for the ParameterType. For integer types base 10 (decimal) form is assumed unless: if proceeded by a 0b or 0B, value is in base two (binary form, if proceeded by a 0o or 0O, values is in base 8 (octal) form, or if proceeded by a 0x or 0X, value is in base 16 (hex) form. Floating point types may be specified in normal (100.0) or scientific (1.0e2) form. Time types are specified using the ISO 8601 formats described for XTCE time data types. Initial values for string types, may include C language style (\n, \t, \", \\, etc.) escape sequences.
+ The value type must match the Parameter type
+
+
+
+
+
+
+
+ Order is important only if the name of the AggregateParameter or Aggregate Argument is directly referenced in SequenceContainers. In this case the members are assued to be added sequentially (in the order listed here) into the Container.
+
+
+
+
+
+
+
+ Used to contain a relative time value. Used to describe a relative time. Normally used for time offsets. A Relative time is expressed as PnYn MnDTnH nMnS, where nY represents the number of years, nM the number of months, nD the number of days, 'T' is the date/time separator, nH the number of hours, nM the number of minutes and nS the number of seconds. The number of seconds can include decimal digits to arbitrary precision. For example, to indicate a duration of 1 year, 2 months, 3 days, 10 hours, and 30 minutes, one would write: P1Y2M3DT10H30M. One could also indicate a duration of minus 120 days as: -P120D. An extension of Schema duration type.
+
+
+
+
+
+
+
+
+
+ Used to contain a relative time value. Used to describe a relative time. Normally used for time offsets. A Relative time is expressed as PnYn MnDTnH nMnS, where nY represents the number of years, nM the number of months, nD the number of days, 'T' is the date/time separator, nH the number of hours, nM the number of minutes and nS the number of seconds. The number of seconds can include decimal digits to arbitrary precision. For example, to indicate a duration of 1 year, 2 months, 3 days, 10 hours, and 30 minutes, one would write: P1Y2M3DT10H30M. One could also indicate a duration of minus 120 days as: -P120D. An extension of Schema duration type.
+
+
+
+
+
+
+
+
+
+ Identical to StringDataType but supports argument instance references.
+
+
+
+
+
+
+
+
+ Initial values for string types, may include C language style (\n, \t, \", \\, etc.) escape sequences.
+
+
+
+
+ restriction pattern is a regular expression
+
+
+
+
+
+
+
+
+ Defines a base schema type for StringParameterType and StringArgumentType, adding initial value, restriction pattern, character width, and size range in characters. The initial value if set is the initial value of all instances of the child types. The restriction pattern is a regular expression enforcing the string value to this pattern. The character width is on the local data type side. And the size range in character restricts the character set. For telemetered values, if the restriction pattern of size range in character is not met, the item is invalid. See BaseDataType, StringParameterType, StringArgumentType, CharacterWidthType and IntegerRangeType.
+
+
+
+
+
+
+ The size in bits may be greater than or equal to minInclusive. It may be less than or equal to maxInclusive. They both may be set indicating a closed range.
+
+
+
+
+
+ Initial values for string types, may include C language style (\n, \t, \", \\, etc.) escape sequences.
+
+
+
+
+ restriction pattern is a regular expression
+
+
+
+
+
+
+
+
+ Describe an ordered collection of units that form a unit-expression. Units may be described for both calibrated/engineering values and also potentially uncalibrated/raw values. See UnitType.
+
+
+
+
+ Describe the exponent, factor, form, and description for a unit. The attributes are optional because different programs use this element in different ways, depending on vendor support.
+
+
+
+
+
+
+ Numerical ranges that define the universe of valid values for this argument. A single range is the most common, although it is possible to define multiple ranges when the valid values are not contiguous.
+
+
+
+
+ A valid range constrains the whole set of possible values that could be encoded by the data type to a more "valid" or "reasonable" set of values. This should be treated as a boundary check in an implementation to validate the input or output value. Typically, only 1 range is used. In cases where multiple ranges are used, then the value is valid when it is valid in any of the provided ranges. Implementations may also use these ranges to enhance user interface displays and other visualization widgets as appropriate for the type.
+
+
+
+
+
+ By default and general recommendation, the valid range is specified in engineering/calibrated values, although this can be adjusted.
+
+
+
+
+
+ Numerical ranges that define the universe of valid values for this argument. A single range is the most common, although it is possible to define multiple ranges when the valid values are not contiguous.
+
+
+
+
+ A valid range constrains the whole set of possible values that could be encoded by the data type to a more "valid" or "reasonable" set of values. This should be treated as a boundary check in an implementation to validate the input or output value. Typically, only 1 range is used. In cases where multiple ranges are used, then the value is valid when it is valid in any of the provided ranges. Implementations may also use these ranges to enhance user interface displays and other visualization widgets as appropriate for the type.
+
+
+
+
+
+ By default and general recommendation, the valid range is specified in engineering/calibrated values, although this can be adjusted.
+
+
+
+
+
+
+
+ Defines two bit-order types: most significant bit first and least significant bit first. See DataEncodingType.
+
+
+
+
+
+
+
+
+ Identical to BinaryDataEncodingType but supports argument instance references.
+
+
+
+
+
+
+ Number of bits this value occupies on the stream being encoded/decoded.
+
+
+
+
+ Used to convert binary data to an application data type
+
+
+
+
+ Used to convert binary data from an application data type to binary data
+
+
+
+
+
+
+
+
+ Describe binary data that is unmolested in the decoding/encoding or cannot be represented in any of the other data encoding formats. Optionally use the FromBinaryTransformAlgorithm and ToBinaryTransformAlgorithm element to describe the transformation process. See InputAlgorithmType for the transformation structure.
+
+
+
+
+
+
+ Number of bits this value occupies on the stream being encoded/decoded.
+
+
+
+
+ Used to convert binary data to an application data type
+
+
+
+
+ Used to convert binary data from an application data type to binary data
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Cyclic Redundancy Check (CRC) definition. The polynomial coefficients for the CRC
+are defined as a truncated hex value. The coefficient for the nth bit of an n-bit CRC will always be 1 and is not
+represented in the truncated hex value. For example, the truncated hex value of CRC-32 (width=32 bits) used in the
+Ethernet specification is 0x04C11DB7, where each non-zero bit of the truncated hex represents a coefficient of 1 in
+the polynomial and the bit position represents the exponent. There may also be an initial remainder "InitRemainder"
+and a final XOR "FinalXOR" to fully specify the CRC. reflectData and reflectRemainder may also be specified to
+reverse the bit order in the incoming data and/or the result.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Describes how a particular piece of data is sent or received from some non-native, off-platform device. (e.g. a spacecraft)
+
+
+
+
+
+
+
+
+
+ Describe the data encoding for a time data type. It includes the units and other attributes scale and offset. Use scale and offset to describe a y=mx+b relationship (where m is the slope/scale and b is the intercept/offset) to make adjustments to the encoded time value so that it matches the time units. For binary encoded time use transform algorithms to convert time data formats that are too difficult to describe in XTCE. See AbsoluteTimeDataType and RelativeTimeDataType.
+
+
+
+
+ Binary encoding is typically a "pass through" raw encoding form where one of the more common encodings is not required for the parameter. A custom transformation capability is available if needed.
+
+
+
+
+ Float encoding is a common encoding where the raw binary is in a form that gets interpreted as a decimal numeric value.
+
+
+
+
+ Integer encoding is a common encoding where the raw binary is in a form that gets interpreted as an integral value, either signed or unsigned.
+
+
+
+
+ String encoding is a common encoding where the raw binary is in a form that gets interpreted as a character sequence.
+
+
+
+
+
+ Time units, with the default being in seconds.
+
+
+
+
+ Linear slope used as a shorter form of specifying a calibrator to convert between the raw value and the engineering units.
+
+
+
+
+ Linear intercept used as a shorter form of specifying a calibrator to convert between the raw value and the engineering units.
+
+
+
+
+
+ Epochs may be specified as an xs date where time is implied to be 00:00:00, xs dateTime, or string enumeration of common epochs. The enumerations are TAI (used by CCSDS and others), J2000, UNIX (also known as POSIX), and GPS.
+
+
+
+
+
+ For common encodings of floating point data
+
+
+
+
+
+
+ Calibrator to be applied to the raw uncalibrated value to arrive at the engineering/calibrated value when no Context Calibrators are provided or evaluate to true, based on their MatchCriteria.
+
+
+
+
+ Calibrator to be applied to the raw uncalibrated value to arrive at the engineering/calibrated value when a MatchCriteria evaluates to true.
+
+
+
+
+
+ Specifies real/decimal numeric value to raw encoding method, with the default being "IEEE754_1985".
+
+
+
+
+ Number of bits to use for the float raw encoding method, with 32 being the default. Not every number of bits is valid for each encoding method.
+ Verify the number of bits for encoding is valid for the encoding method.
+
+
+
+
+ A changeThreshold may optionally be specified to inform systems of the minimum change in value that is significant. This is used by some systems to limit the telemetry processing and/or recording requirements. If the value is unspecified or zero, any change is significant.
+
+
+
+
+
+
+
+
+
+ At the time of this writing, 16 bit encoding size is only valid in cases of IEEE754 and vendor specific MILSTD_1750A variation that is not a part of the standard. This is not meant to preclude use in the event that future floating point formats may also define this value.
+
+
+
+
+ At the time of this writing, 32 bit encoding size is only valid in cases of IEEE754_1985, IEEE754, MILSTD_1750A, DEC, IBM, and TI. This is not meant to preclude use in the event that future floating point formats may also define this value. The IEEE754 enumeration and the IEEE754_1985 enumeration are allowed in this case and the interpretation is the same.
+
+
+
+
+ At the time of this writing, 40 bit encoding size is only valid in the case of TI. This is not meant to preclude use in the event that future floating point formats may also define this value.
+
+
+
+
+ At the time of this writing, 48 bit encoding size is only valid in the case of MILSTD_1750A. This is not meant to preclude use in the event that future floating point formats may also define this value.
+
+
+
+
+ At the time of this writing, 64 bit encoding size is only valid in cases of IEEE754_1985, IEEE754, DEC, and IBM. This is not meant to preclude use in the event that future floating point formats may also define this value. The IEEE754 enumeration and the IEEE754_1985 enumeration are allowed in this case and the interpretation is the same.
+
+
+
+
+ At the time of this writing, 80 bit encoding size is only valid in the case of IEEE754_1985. This is not meant to preclude use in the event that future floating point formats may also define this value.
+
+
+
+
+ At the time of this writing, 128 bit encoding size is only valid in the case of IEEE754_1985 and IEEE754. This is not meant to preclude use in the event that future floating point formats may also define this value. The IEEE754 enumeration and the IEEE754_1985 enumeration are allowed in this case and the interpretation is the same.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ For all major encodings of integer data
+
+
+
+
+
+
+ Calibrator to be applied to the raw uncalibrated value to arrive at the engineering/calibrated value when no Context Calibrators are provided or evaluate to true, based on their MatchCriteria.
+
+
+
+
+ Calibrator to be applied to the raw uncalibrated value to arrive at the engineering/calibrated value when a MatchCriteria evaluates to true.
+
+
+
+
+
+ Specifies integer numeric value to raw encoding method, with the default being "unsigned".
+
+
+
+
+ Number of bits to use for the raw encoding, with 8 being the default.
+
+
+
+
+ A changeThreshold may optionally be specified to inform systems of the minimum change in value that is significant. This is used by some systems to limit the telemetry processing and/or recording requirements, such as for an analog-to-digital converter that dithers in the least significant bit. If the value is unspecified or zero, any change is significant.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Like PASCAL strings, the size of the string is given as an integer at the start of the string. SizeTag must be an unsigned Integer
+
+
+
+
+
+
+
+
+
+
+
+ Bit position starts with 'zero'.
+
+
+
+
+
+
+
+
+
+ This is the simplest case of a string data type where the encoding size of the string does not change.
+
+
+
+
+
+ Size in bits of this string data type for both the memory allocation in the implementing software and also the size in bits for this parameter when it appears in a container.
+
+
+
+
+
+
+
+ The termination character that represents the end of the string contents. For C and most strings, this is null (00), which is the default.
+
+
+
+
+ In some string implementations, the size of the string contents (not the memory allocation size) is determined by a leading numeric value. This is sometimes referred to as Pascal strings. If a LeadingSize is specified, then the TerminationChar element does not have a functional meaning.
+
+
+
+
+
+
+ Identical to VariableStringType but supports argument instance references.
+
+
+
+
+
+ Determine the container size in bits by interrogating an instance of a parameter or argument.
+
+
+
+
+ Determine the container size in bits by interrogating an instance of a parameter or argument and selecting a specified value based on tests of the value of that parameter or argument.
+
+
+
+
+
+ In some string implementations, the size of the string contents (not the memory allocation size) is determined by a leading numeric value. This is sometimes referred to as Pascal strings. If a LeadingSize is specified, then the TerminationChar element does not have a functional meaning.
+
+
+
+
+ The termination character that represents the end of the string contents. For C and most strings, this is null (00), which is the default.
+
+
+
+
+
+ The upper bound of the size of this string data type so that the implementation can reserve/allocate enough memory to capture all reported instances of the string.
+
+
+
+
+
+ Describe a variable string whose length may change between samples.
+
+
+
+
+
+ Determine the container size in bits by interrogating an instance of a parameter.
+
+
+
+
+ Determine the container size in bits by interrogating an instance of a parameter and selecting a specified value based on tests of the value of that parameter.
+
+
+
+
+
+ In some string implementations, the size of the string contents (not the memory allocation size) is determined by a leading numeric value. This is sometimes referred to as Pascal strings. If a LeadingSize is specified, then the TerminationChar element does not have a functional meaning.
+
+
+
+
+ The termination character that represents the end of the string contents. For C and most strings, this is null (00), which is the default.
+
+
+
+
+
+ The upper bound of the size of this string data type so that the implementation can reserve/allocate enough memory to capture all reported instances of the string.
+
+
+
+
+
+ Identical to StringDataEncodingType but supports argument instance references.
+
+
+
+
+
+
+ Static length strings do not change in overall length between samples. They may terminate before the end of their buffer using a terminating character, or by various lookups, or calculations. But they have a maximum fixed size, and the data itself is always within that maximum size.
+
+
+
+
+ Variable length strings are those where the space occupied in a container can vary. If the string has variable content but occupies the same amount of space when encoded should use the SizeInBits element. Specification of a variable length string needs to consider that the implementation needs to allocate space to store the string. Specify the maximum possible length of the string data type for memory purposes and also specify the bit size of the string to use in containers with the dynamic elements.
+
+
+
+
+
+ The character set encoding of this string data type.
+
+
+
+
+
+
+
+ Describe common encodings of string data: UTF-8 and UTF-16. See StringDataType.
+
+
+
+
+
+
+ Static length strings do not change in overall length between samples. They may terminate before the end of their buffer using a terminating character, or by various lookups, or calculations. But they have a maximum fixed size, and the data itself is always within that maximum size.
+
+
+
+
+ Variable length strings are those where the space occupied in a container can vary. If the string has variable content but occupies the same amount of space when encoded should use the SizeInBits element. Specification of a variable length string needs to consider that the implementation needs to allocate space to store the string. Specify the maximum possible length of the string data type for memory purposes and also specify the bit size of the string to use in containers with the dynamic elements.
+
+
+
+
+
+ The character set encoding of this string data type.
+
+
+
+
+
+
+
+ Defines string encodings. US-ASCII (7-bit), ISO-8859-1 (8-bit Extended ASCII), Windows-1252 (8-bit Extended ASCII), UTF-8 (Unicode), UTF-16 (Unicode with Byte Order Mark), UTF-16LE (Unicode Little Endian), UTF-16BE (Unicode Big Endian). See StringDataEncodingType.
+
+
+
+
+
+
+
+
+ With UTF-16, encoded bits must be prepended with a Byte Order Mark. This mark indicates whether the data is encoded in big or little endian.
+
+
+
+
+ With UTF-16LE, encoded bits will always be represented as little endian. Bits are not prepended with a Byte Order Mark.
+
+
+
+
+ With UTF-16BE, encoded bits will always be represented as big endian. Bits are not prepended with a Byte Order Mark.
+
+
+
+
+ With UTF-32, encoded bits must be prepended with a Byte Order Mark. This mark indicates whether the data is encoded in big or little endian.
+
+
+
+
+ With UTF-32LE, encoded bits will always be represented as little endian. Bits are not prepended with a Byte Order Mark.
+
+
+
+
+ With UTF-32BE, encoded bits will always be represented as big endian. Bits are not prepended with a Byte Order Mark.
+
+
+
+
+
+
+
+
+ This element describes how a numeric value should be represented in engineering/calibrated form. The defaults reflect the most common form.
+
+
+
+
+
+
+ Union values of common epoch definitions for document convenience.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ An unordered collection of algorithms
+
+
+
+
+
+
+
+
+ Contains an unordered collection of Alias elements to describe alternate names or IDs for this named item.
+ Applications should enforce uniqueness of individual nameSpace attribute values. Aliases are usually unique within the same nameSpace attribute value, depending on the physical meaning of that nameSpace. There are some cases where Alias values can be duplicated in a single nameSpace value.
+
+
+
+
+ An alternate name, ID number, and sometimes flight software variable name in the code for this item.
+
+
+
+
+
+
+ Used to contain an alias (alternate) name or ID for the object. For example, a parameter may have a mnemonic, an on-board id, and special IDs used by various ground software applications; all of these are alias's. Some ground system processing equipment has some severe naming restrictions on parameters (e.g., names must less then 12 characters, single case or integral id's only); their alias's provide a means of capturing each name in a "nameSpace". Note: the name is not reference-able (it cannot be used in a name reference substituting for the name of the item of interest). See NameDescriptionType.
+
+
+
+ Aliases should be grouped together in a "namespace" so that they can be switched in and out of data extractions. The namespace generally identifies the purpose of the alternate name, whether for software variable names, additional operator names, or whatever the purpose.
+
+
+
+
+ The alternate name or ID to use. The alias does not have the restrictions that apply to name attributes. This is useful for capturing legacy identifiers for systems with unusual naming conventions. It is also useful for capturing variable names in software, amongst other things.
+
+
+
+
+
+ Use for any other data associated with a named item. May be used to include administrative data (e.g., version, CM or tags) or potentially any MIME type. Data may be included or given as an href.
+
+
+
+
+
+ Identifier for this Ancillary Data characteristic, feature, or data.
+
+
+
+
+ Optional text encoding method for the element text content of this element. The default is "text/plain".
+
+
+
+
+ Optional Uniform Resource Identifier for this characteristic, feature, or data.
+
+
+
+
+
+
+
+ Describe an unordered collection of ancillary data. AncillaryData elements capture platform/program/implementation specific data about the parent element object that is non-standard and would not fit into the schema. See AncillaryDataType.
+
+
+
+
+ Optional list of AncillaryData elements associated with this item.
+
+
+
+
+
+
+ Describe two or more conditions that are logically anded together. Conditions may be a mix of Condition and ORedCondition. See ORedConditionType and BooleanExpressionType.
+
+
+
+
+
+
+ Condition elements describe a test similar to the Comparison element except that the parameters used have additional flexibility for the compare.
+
+
+
+
+ This element describes tests similar to the ComparisonList element except that the parameters used are more flexible and the and/or for multiple checks can be specified.
+
+
+
+
+
+
+
+
+ Describe an unordered collection of authors. See AuthorType.
+
+
+
+
+ Contains information about an author, maintainer, or data source regarding this document.
+
+
+
+
+
+
+ Type definition that describes the format of the contents of the Author element.
+
+
+
+
+
+ A base type for boolean expression related elements that improves the mapping produced by data binding tools.
+
+
+
+
+ A simple restriction on string for hexadecimal numbers. Must be in 0b or 0B form.
+
+
+
+
+
+
+
+ Holds an arbitrarily complex boolean expression
+
+
+
+
+ Condition elements describe a test similar to the Comparison element except that the parameters used have additional flexibility.
+
+
+
+
+ This element describes tests similar to the ComparisonList element except that the parameters used are more flexible.
+
+
+
+
+ This element describes tests similar to the ComparisonList element except that the parameters used are more flexible.
+
+
+
+
+
+
+ Describe a byte order: big/little or byte list.
+
+
+
+
+
+ Common byte orderings: most significant byte first (also known as big endian) and least significant byte first (also known as little endian).
+
+
+
+
+
+
+
+
+ Describe a byte order using a byte list. The list is viewed as representing memory, the first item in the list is address 0. For mostSignificantByteFirst/big endian, the high order byte is the first byte in the list and has the highest significance followed by the less significant bytes ending with the least significant byte. For leastSignificantByteFirst/little endian, the first byte starts with the least significant byte which is first in the least and ends at the highest significant byte. For example given the value 0x0A0B0C0D the following example orderings can be formed. For mostSignificantByteFirst/big endian the significances would be listed as 3 (0x0A), 2 (0x0B), 1 (0x0C), 0 (0x0D) with ‘3’ being first in the list, and for leastSignificantByteFirst/little endian as 0 (0x0D), 1 (0x0C), 2 (0x0B), 3 (0x0A) with ‘0’ being first in the list. See DataEncodingType.
+
+
+
+
+
+
+
+ Describe the comparison between the instance (value) of a parameter against either a specified value or another parameter instance.
+
+
+
+
+
+
+ Left hand side parameter instance.
+
+
+
+
+ Comparison operator.
+
+
+
+
+
+ Right hand side parameter instance. Parameter is assumed to be of the same type as the comparison Parameter.
+
+
+
+
+ Right hand side value. Specify as: integer data type using xs:integer, float data type using xs:double, string data type using xs:string, boolean data type using xs:boolean, binary data type using xs:hexBinary, enum data type using label name, relative time data type using xs:duration, absolute time data type using xs:dateTime. Values must not exceed the characteristics for the data type or this is a validation error. Takes precedence over an initial value given in the data type. Values are calibrated unless there is an option to override it.
+
+
+
+
+
+
+
+
+
+ All comparisons must be true
+
+
+
+
+ List of Comparison elements must all be true for the comparison to evaluate to true.
+
+
+
+
+
+
+ Operators to use when testing a boolean condition for a validity check
+
+
+
+
+
+
+
+
+
+
+
+
+ A simple ParameterInstanceRef to value comparison. The string supplied in the value attribute needs to be converted to a type matching the Parameter being compared to. Numerical values are assumed to be base 10 unless proceeded by 0x (hexadecimal), 0o (octal), or 0b (binary). The value is truncated to use the least significant bits that match the bit size of the Parameter being compared to.
+
+
+
+
+
+ Operator to use for the comparison with the common equality operator as the default.
+
+
+
+
+ Specify value as a string compliant with the XML schema (xs) type specified for each XTCE type: integer=xs:integer; float=xs:double; string=xs:string; boolean=xs:boolean; binary=xs:hexBinary; enum=xs:string from EnumerationList; relative time= xs:duration; absolute time=xs:dateTime. Supplied value must be within the ValidRange specified for the type.
+
+
+
+
+
+
+
+ Context calibrations are applied when the ContextMatch is true. Context calibrators overide Default calibrators
+
+
+
+
+
+
+
+
+ A MatchCriteriaType used for Context selection.
+
+
+
+
+
+
+
+ Describe a custom, algorithmic alarm condition. The algorithm is assumed to return a boolean value: true or false. See AlarmType.
+
+
+
+
+
+
+ Algorithm returns a boolean.
+
+
+
+
+
+
+
+
+ Describe a percentage complete that is fixed from 0 to 100, or as value from a parameter. See ExecutionVerifierType.
+
+
+
+
+ 0 to 100 percent
+
+
+
+
+
+
+
+
+
+
+ Uses a parameter instance to obtain the value. The parameter value may be optionally adjusted by a Linear function or use a series of boolean expressions to lookup the value. Anything more complex and a DynamicValue with a CustomAlgorithm may be used.
+
+
+
+
+
+
+ Defines an abstract schema type used as basis for NameDescriptionType and OptionalNameDescriptionType, includes an attribute for a short description and an element for a longer unbounded description. This type also provides alias set and ancillary data set See AliasSetType and AncillaryDataSetType.
+
+
+
+
+ Optional long form description to be used for explanatory descriptions of this item and may include HTML markup using CDATA. Long Descriptions are of unbounded length.
+
+
+
+
+ Used to contain an alias (alternate) name or ID for this item. See AliasSetType for additional explanation.
+
+
+
+
+ Use for any non-standard data associated with this named item. See AncillaryDataSetType for additional explanation.
+
+
+
+
+
+ Optional short description to be used for explanation of this item. It is recommended that the short description be kept under 80 characters in length.
+
+
+
+
+
+ Describe an ordered table of integer values and associated conditions, forming a lookup table. The list may have duplicates. The table is evaluated from first to last, the first condition to be true returns the value associated with it. See DiscreteLookupType.
+
+
+
+
+ Describe a lookup condition set using discrete values from parameters.
+
+
+
+
+
+
+ Uses a parameter instance to obtain the value. The parameter value may be optionally adjusted by a Linear function or use a series of boolean expressions to lookup the value. Anything more complex and a DynamicValue with a CustomAlgorithm may be used
+
+
+
+
+ Retrieve the value by referencing the value of a Parameter.
+
+
+
+
+ A slope and intercept may be applied to scale or shift the value selected from the argument or parameter.
+
+
+
+
+
+
+ Describe error detection/correction algorithm.
+
+
+
+
+
+
+
+
+
+ A simple union type combining integer, octal, binary, and hexadecimal types
+
+
+
+
+
+ Schema for a Header record. A header contains general information about the system or subsystem.
+
+
+
+
+ The AuthorSet contains optional contact information for this document.
+
+
+
+
+ The NoteSet contains optional technical information related to the content of this document.
+
+
+
+
+ The HistorySet contains optional evolutionary information for data contained in this document.
+
+
+
+
+
+ This attribute contains an optional version descriptor for this document.
+
+
+
+
+ This attribute contains an optional date to be associated with this document.
+
+
+
+
+ This attribute contains optional classification status for use by programs for which that is applicable.
+
+
+
+
+ This attribute contains an optional additional instructions attribute to be interpreted by programs that use this attribute.
+
+
+
+
+ This attribute contains a flag describing the state of this document in the evolution of the project using it.
+
+
+
+
+
+ A simple restriction on string for hexadecimal numbers. Must be in 0x or 0X form.
+
+
+
+
+
+
+
+ Describe an unordered collection of History elements. Usage is user defined. See HistoryType.
+
+
+
+
+ Contains a history record related to the evolution of this document.
+
+
+
+
+
+
+
+
+
+ Contains an Integer value; value may be provided directly or via the value in a parameter.
+
+
+
+
+ Use a fixed integer value.
+
+
+
+
+ Determine the value by interrogating an instance of a parameter.
+
+
+
+
+ Determine the value by interrogating an instance of a parameter and selecting a specified value based on tests of the value of that parameter.
+
+
+
+
+
+
+ Identical to IntegerValueType but supports argument instance references.
+
+
+
+
+ Use a fixed integer value.
+
+
+
+
+ Determine the value by interrogating an instance of an argument or parameter.
+
+
+
+
+ Determine the value by interrogating an instance of an argument or parameter and selecting a specified value based on tests of the value of that argument or parameter.
+
+
+
+
+
+
+ The Long Description is intended to be used for explanatory descriptions of the object and may include HTML markup. Long Descriptions are of unbounded length
+
+
+
+
+
+ Mathematical operators used in the math operation. Behavior of each operator on the stack is described using notation (before -- after), where "before" represents the stack before execution of the operator and "after" represent the stack after execution.
+
+
+
+
+ addition (x1 x2 -- x1+x2)
+
+
+
+
+ subtraction (x1 x2 -- x1-x2)
+
+
+
+
+ multiplication (x1 x2 -- x1*x2)
+
+
+
+
+ division (x1 x2 -- x1/x2)
+ An undefined condition exists if x2 is 0
+
+
+
+
+ modulo (x1 x2 -- x3) Divide x1 by x2, giving the modulo x3
+ An undefined condition exists if x2 is 0. Implementations should verify modulo versus remainder behavior.
+
+
+
+
+ power function (x1 x2 -- x1**x2)
+ An undefined condition exists if an imaginary number is the result. Imaginary numbers are not supported
+
+
+
+
+ reverse power function (x1 x2 -- x2**x1)
+
+
+
+
+ natural (base e) logarithm (x -- ln(x))
+ An undefined condition exists if x is less than or equal to 0
+
+
+
+
+ base-10 logarithm (x-- log(x))
+ An undefined condition exists if x is less than or equal to 0
+
+
+
+
+ exponentiation (x -- exp(x))
+
+
+
+
+ inversion (x -- 1/x)
+ An undefined condition exists if x is less than 0
+
+
+
+
+ factorial (x -- x!)
+ An undefined condition exists if x is less than 0
+
+
+
+
+ tangent (x -- tan(x)) radians
+
+
+
+
+ cosine (x -- cos(x)) radians
+
+
+
+
+ sine (x -- sin(x)) radians
+
+
+
+
+ arctangent (x -- atan(x)) radians
+
+
+
+
+ arctangent (x1 x2 -- atan2(x2, x1)) radians
+ An undefined condition exists if x1 and x2 are 0
+
+
+
+
+ arccosine (x -- acos(x)) radians
+
+
+
+
+ arcsine (x -- asin(x)) radians
+
+
+
+
+ hyperbolic tangent (x -- tanh(x))
+
+
+
+
+ hyperbolic cosine (x -- cosh(x))
+
+
+
+
+ hyperbolic sine (x -- sinh(x))
+
+
+
+
+ hyperbolic arctangent (x -- atanh(x))
+ An undefined condition exists if x is outside the range [-1.0,+1.0]
+
+
+
+
+ hyperbolic arccosine (x -- acosh(x))
+ An undefined condition exists if n is less than 1
+
+
+
+
+ hyperbolic arcsine (x -- asinh(x))
+
+
+
+
+ swap the top two stack items (x1 x2 -- x2 x1)
+
+
+
+
+ Remove top item from the stack (x -- )
+
+
+
+
+ Duplicate top item on the stack (x -- x x)
+
+
+
+
+ Duplicate top item on the stack (x1 x2 -- x1 x2 x1)
+
+
+
+
+ signed bitwise left shift (x1 x2 -- x1 << x2)
+ Limitation from SEI INT13-C. Use bitwise operators only on unsigned operands
+
+
+
+
+ signed bitwise right shift (x1 x2 -- x1 >> x2)
+ Limitation from SEI INT13-C. Use bitwise operators only on unsigned operands
+
+
+
+
+ bitwise and (x1 x2 -- x1 & x2)
+ Limitation from SEI INT13-C. Use bitwise operators only on unsigned operands
+
+
+
+
+ bitwise or (x1 x2 -- x1 | x2)
+ Limitation from SEI INT13-C. Use bitwise operators only on unsigned operands
+
+
+
+
+ logical and (x1 x2 -- x1 && x2)
+ The result of this can only be 0 or 1
+
+
+
+
+ logical or (x1 x2 -- x1 || x2)
+ The result of this can only be 0 or 1
+
+
+
+
+ logical not (x1 x2 -- x1 ! x2)
+ The result of this can only be 0 or 1
+
+
+
+
+ absolute value (x1 -- abs(x1))
+
+
+
+
+ Euclidean division quotient (x1 -- div(x1))
+
+
+
+
+ integer part (x1 -- int(x1))
+
+
+
+
+ greater than x,y (x1 x2 -- x1 > x2)
+ The result of this can only be 0 or 1
+
+
+
+
+ greater than or equal x,y (x1 x2 -- x1 >= x2)
+ The result of this can only be 0 or 1
+
+
+
+
+ less than x,y (x1 x2 -- x1 < x2)
+ The result of this can only be 0 or 1
+
+
+
+
+ less than or equal x,y (x1 x2 -- x1 <= x2)
+ The result of this can only be 0 or 1
+
+
+
+
+ equal x,y (x1 x2 -- x1 == x2)
+ The result of this can only be 0 or 1
+
+
+
+
+ not equal x,y (x1 x2 -- x1 != x2)
+ The result of this can only be 0 or 1
+
+
+
+
+ minimum of x,y (x1 x2 -- min(x1, x2))
+
+
+
+
+ maximum of x,y (x1 x2 -- max(x1, x2))
+
+
+
+
+ Bitwise exclusive or (XOR) (x1 x2 -- x1 xor x2)
+ Limitation from SEI INT13-C. Use bitwise operators only on unsigned operands
+
+
+
+
+ Bitwise not operation (x1 x2 -- x1 ~ x2) The result of this can only be 0 or 1
+ Limitation from SEI INT13-C. Use bitwise operators only on unsigned operands
+
+
+
+
+
+
+ Contains either a simple Comparison, a ComparisonList, an arbitrarily complex BooleanExpression or an escape to an externally defined algorithm
+
+
+
+
+ A simple comparison check involving a single test of a parameter value.
+
+
+
+
+ A series of simple comparison checks with an implicit 'and' in that they all must be true for the overall condition to be true.
+
+
+
+
+ An arbitrarily complex boolean expression that has additional flexibility on the terms beyond the Comparison and ComparisonList elements.
+
+
+
+
+ An escape to an externally defined algorithm.
+
+
+
+
+
+
+ Postfix (aka Reverse Polish Notation (RPN)) notation is used to describe mathmatical equations. It uses a stack where operands (either fixed values or ParameterInstances) are pushed onto the stack from first to last in the XML. As the operators are specified, each pops off operands as it evaluates them, and pushes the result back onto the stack. In this case postfix is used to avoid having to specify parenthesis. To convert from infix to postfix, use Dijkstra's "shunting yard" algorithm.
+
+
+
+
+
+
+
+ Defines a name where all characters are allowed except '.', '[', ']', ':', ' ', and '/'. See NameDescriptionType.
+
+
+
+
+
+
+
+ Defines a base schema type definition used by many other schema types throughout schema. Use it to describe a name with optional descriptions, aliases, and ancillary data. See NameType, LongDescriptionType, ShortDescriptionType, AliasSetType and AncillaryDataSetType.
+
+
+
+
+
+ The name of this defined item. See NameType for restriction information.
+
+
+
+
+
+
+
+ Describe a reference to a named item in an XTCE instance document. The named must be of schema type NameType. All name references use a Unix style file system name format where the SpaceSystem names form a path in the SpaceSystem tree. The following characters are reserved for the path: '/', ‘..’ and ‘.’ (multiple consecutive ‘/’s are treated as one). The path portion is similar to the directory path used in file system names and the path characters have similar meaning (e.g., SimpleSat/Bus/EPDS/BatteryOne/Voltage). There are three overall forms for name references: absolute path, relative path and just the name. The first two forms are called qualified name references; the last form is called an unqualified name reference. The unqualified form refers to an item in the SpaceSystem the reference is used in. The unqualified form refers to an item in the SpaceSystem the reference is used in. It is illegal for a name reference to point to no item (“a dangling name reference”).
+
+
+
+
+
+
+
+ Contains an unordered collection of Notes. Usage is user defined. See NoteType.
+
+
+
+
+ Contains a program defined technical note regarding this document.
+
+
+
+
+
+
+
+
+
+ This type describes how a numeric value should be represented in engineering/calibrated form. The defaults reflect the most common form.
+
+
+
+ Describes how the engineering/calibrated value of this number should be displayed with respect to the radix. Default is base 10.
+
+
+
+
+ Describes how the engineering/calibrated value of this number should be displayed with respect to the minimum number of fractional digits. The default is 0.
+
+
+
+
+ Describes how the engineering/calibrated value of this number should be displayed with respect to the maximum or upper bound of the number of digits. There is no default. No value specified should be interpreted as no upper bound such that all requires digits are used to fully characterize the value.
+
+
+
+
+ Describes how the engineering/calibrated value of this number should be displayed with respect to the minimum number of integer digits. The default is 1.
+
+
+
+
+ Describes how the engineering/calibrated value of this number should be displayed with respect to the maximum or upper bound of the integer digits. There is no default. No value specified should be interpreted as no upper bound such that all requires digits are used to fully characterize the value.
+
+
+
+
+ Describes how the engineering/calibrated value of this number should be displayed with respect to negative values. This attribute specifies the character or characters that should be appended to the numeric value to indicate negative values. The default is none.
+
+
+
+
+ Describes how the engineering/calibrated value of this number should be displayed with respect to positive values. This attribute specifies the character or characters that should be appended to the numeric value to indicate positive values. The default is none. Zero is considered to be specific to the implementation/platform and is not implied here.
+
+
+
+
+ Describes how the engineering/calibrated value of this number should be displayed with respect to negative values. This attribute specifies the character or characters that should be prepended to the numeric value to indicate negative values. The default is a minus character "-".
+
+
+
+
+ Describes how the engineering/calibrated value of this number should be displayed with respect to positive values. This attribute specifies the character or characters that should be prepended to the numeric value to indicate positive values. The default is none. Zero is considered to be specific to the implementation/platform and is not implied here.
+
+
+
+
+ Describes how the engineering/calibrated value of this number should be displayed with respect to larger values. Groupings by thousand are specific to locale, so the schema only specifies whether they will be present and not which character separators are used. The default is false.
+
+
+
+
+ Describes how the engineering/calibrated value of this number should be displayed with respect to notation. Engineering, scientific, or traditional decimal notation may be specified. The precise characters used is locale specific for the implementation/platform. The default is "normal" for the traditional notation.
+
+
+
+
+
+ A simple restriction on string for hexadecimal numbers. Must be in 0o or 0O form.
+
+
+
+
+
+
+
+ The type definition used by most elements that have an optional name with optional descriptions.
+
+
+
+
+
+ Optional name of this defined item. See NameType for restriction information.
+
+
+
+
+
+
+
+ Describe two or more conditions that are logically ored together. Conditions may be a mix of Condition and ANDedCondition. See ORedConditionType and BooleanExpressionType.
+
+
+
+
+
+
+ Condition elements describe a test similar to the Comparison element except that the parameters used have additional flexibility for the compare.
+
+
+
+
+ This element describes tests similar to the ComparisonList element except that the parameters used are more flexible and the and/or for multiple checks can be specified.
+
+
+
+
+
+
+
+
+ Describe an unordered collection of parameters where duplicates defined by the Parameter name attribute are invalid. The ParameterSet exists in both the TelemetryMetaData and the CommandMetaData element so that each may be built independently but from a single namespace. See TelemetryMetaDataType and CommandMetaDataType.
+
+
+
+
+ Defines a named and typed Parameter.
+ Need to ensure that the named types actually exist
+
+
+
+
+ Used to include a Parameter defined in another sub-system in this sub-system.
+
+
+
+
+
+
+ Specifies the number base
+
+
+
+
+
+
+
+
+
+
+ Defines whether the defined range between the minimum and maximum is the outside or inside the range being defined. The default, outside matches values less than the minimum and greater than the maximum. Inside matches values between the minimum and maximum.
+
+
+
+
+
+
+
+
+ Most time values are relative to another time e.g. seconds are relative to minutes, minutes are relative to hours. This type is used to describe this relationship starting with the least significant time Parameter to and progressing to the most significant time parameter.
+
+
+
+
+
+ Epochs may be specified as an xs date where time is implied to be 00:00:00, xs dateTime, or string enumeration of common epochs. The enumerations are TAI (used by CCSDS and others), J2000, UNIX (also known as POSIX), and GPS.
+
+
+
+
+
+
+ Used to describe a relative time. Normally used for time offsets. A Relative time is expressed as PnYn MnDTnH nMnS, where nY represents the number of years, nM the number of months, nD the number of days, 'T' is the date/time separator, nH the number of hours, nM the number of minutes and nS the number of seconds. The number of seconds can include decimal digits to arbitrary precision. For example, to indicate a duration of 1 year, 2 months, 3 days, 10 hours, and 30 minutes, one would write: P1Y2M3DT10H30M. One could also indicate a duration of minus 120 days as: -P120D. An extension of Schema duration type.
+
+
+
+
+
+ Hold a structure that can be repeated X times, where X is the Count
+
+
+
+
+ Value (either fixed or dynamic) that contains the count of repeated structures.
+
+
+
+
+
+
+
+ Identical to RepeatType but supports argument instance references.
+
+
+
+
+ Value (either fixed or dynamic) that contains the count of repeated structures.
+
+
+
+
+
+
+
+ A reference to a Service
+
+
+
+
+
+
+
+
+
+ It is strongly recommended that the short description be kept under 80 characters in length
+
+
+
+
+
+ A spline, or piecewise defined function, is a set on points from which a curve may be drawn to interpolate raw to calibrated values
+
+
+
+ The order of a SplineCalibrator refers to the interpolation function. Order 0 is a flat line from the defined point (inclusive) to the next point (exclusive). Order 1 is linear interpolation between two points. Order 2 is quadratic fit and requires at least 3 points (unusual case). This order is generally not needed, but may be used to override the interpolation order for this point.
+
+
+
+
+ The raw encoded value.
+
+
+
+
+ The engineering/calibrated value associated with the raw value for this point.
+
+
+
+
+
+ A term in a polynomial expression.
+
+
+
+ The coefficient in a single term of a polynomial expression.
+
+
+
+
+ The exponent in a single term of a polynomial expression. Should negative exponents be required, use a Math Calibrator style of definition for this type.
+
+
+
+
+
+ base time units. days, months, years have obvoius ambiguity and should be avoided
+
+
+
+
+
+
+
+
+
+
+
+ Describe the exponent, factor, form, and description for a unit. The unit itself is in element Unit in UnitSet. See UnitSetType. The attributes are optional because different programs use this element in different ways, depending on vendor support.
+
+
+
+ Optional attribute used in conjunction with the "factor" attribute where some programs choose to specify the unit definition with these machine processable algebraic features. For example, a unit text of "meters" may have a "power" attribute of 2, resulting "meters squared" as the actual unit. This is not commonly used. The most common method for "meters squared" is to use the text content of the Unit element in a form like "m^2".
+
+
+
+
+ Optional attribute used in conjunction with the "power" attribute where some programs choose to specify the unit definition with these machine processable algebraic features. For example, a unit text of "meters" may have a "factor" attribute of 2, resulting "2 times meters" as the actual unit. This is not commonly used. The most common method for "2 times meters" is to use the text content of the Unit element in a form like "2*m".
+
+
+
+
+ A description of the unit, which may be for expanded human readability or for specification of the nature/property of the unit. For example, meters per second squared is of a nature/property of acceleration.
+
+
+
+
+ The default value "calibrated" is most common practice to specify units at the engineering/calibrated value, it is possible to specify an additional Unit element for the raw/uncalibrated value.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Describe a value and an associated string label, see EnumerationListType.
+
+
+
+ Numeric raw/uncalibrated value to associate with a string enumeration label.
+
+
+
+
+ If max value is given, the label maps to a range where value is less than or equal to maxValue. The range is inclusive.
+
+
+
+
+ String enumeration label to apply to this value definition in the enumeration.
+
+
+
+
+ An optional additional string description can be specified for this enumeration label to provide extended information if desired.
+
+
+
+
+
+
+
+ Describe up to six levels: Normal, Watch, Warning, Distress, Critical, and Severe of conditions the alarm will trigger when true. The types are conditions available are a single comparison, a comparison list, a discrete lookup list, and custom algorithm. See MatchCriteriaType.
+
+
+
+
+ An alarm state of least concern. Considered to be below the most commonly used Warning level.
+
+
+
+
+ An alarm state of concern that represents the most commonly used minimum concern level for many software applications.
+
+
+
+
+ An alarm state of concern in between the most commonly used Warning and Critical levels.
+
+
+
+
+ An alarm state of concern that represents the most commonly used maximum concern level for many software applications.
+
+
+
+
+ An alarm state of highest concern. Considered to be above the most commonly used Critical level.
+
+
+
+
+
+
+ Describe up to six ranges where either less severe ranges are a subset of more severe ranges (outside), or more severe ranges are a subset of less severe ranges (inside). In both forms, the undefined least severe range is normal. Range values are in calibrated engineering units. See FloatRangeType.
+
+
+
+
+
+
+ A range of least concern. Considered to be below the most commonly used Warning level.
+
+
+
+
+ A range of concern that represents the most commonly used minimum concern level for many software applications.
+
+
+
+
+ A range of concern in between the most commonly used Warning and Critical levels.
+
+
+
+
+ A range of concern that represents the most commonly used maximum concern level for many software applications.
+
+
+
+
+ A range of highest concern. Considered to be above the most commonly used Critical level.
+
+
+
+
+
+ A value of outside specifies that the most severe range is outside all the other ranges: -severe -critical -distress -warning -watch normal +watch +warning +distress +critical +severe. A value of inside "inverts" these bands: -green -watch -warning -distress -critical severe +critical +distress +warning +watch. The most common form used is "outside" and is the default.
+
+
+
+
+
+
+
+ Defines a base schema type used to build up the other data type specific alarm types. The definition includes a count to go into alarm (minViolations – the counts to go out of alarm is the same), a condition style alarm and a custom alarm. See AlarmConditionType, CustomAlgorithmType, BinaryAlarmConditionType, BooleanAlarmType, BinaryContextAlarmType, EnumerationAlarmType, NumericAlarmType, StringAlarmType, TimeAlarmType, TimeAlarmConditionType.
+
+
+
+
+
+
+
+ A MatchCriteria may be specified for each of the 5 alarm levels. Each level is optional and the alarm should be the highest level to test true.
+
+
+
+
+ An escape for ridiculously complex alarm conditions. Will trigger on changes to the containing Parameter.
+
+
+
+
+
+
+ The number of successive instances that meet the alarm conditions for the alarm to trigger. The default is 1.
+
+
+
+
+ Optionally specify the number of successive instances that do not meet the alarm conditions to leave the alarm state. If this attribute is not specified, it is treated as being equal to minViolations (symmetric).
+
+
+
+
+
+
+
+ Describe any number of alarm ranges, each with its own level (normal, warning, watch, distress, critical, severe) and range form (inside or outside). Ranges may overlap, be disjoint and so forth. Ranges within the value sprectrum non-specified are non-normal. The most severe range level of value within the ranges is the level of the alarm. Range values are in calibrated engineering units. See FloatRangeType.
+
+
+
+
+
+
+ Describe any number of alarm ranges, each with its own level (normal, warning, watch, distress, critical, severe) and range form (inside or outside). Ranges may overlap, be disjoint and so forth. Ranges within the value sprectrum non-specified are non-normal. The most severe range level of value within the ranges is the level of the alarm. Range values are in calibrated engineering units. See FloatRangeType.
+
+
+
+
+
+
+
+
+ Defines to type of update rates: perSecond and perContainerUpdate. See RateInStreamType.
+
+
+
+
+
+
+
+
+ Describe alarm conditions specific to the binary data type, extends the basic AlarmType.
+
+
+
+
+
+
+
+ Alarm conditions for Boolean types
+
+
+
+
+
+
+
+ Describe an ordered collection of context binary alarms, duplicates are valid. Process the contexts in list order. See BinaryContextAlarmType.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Describe an alarm when the parameter value's rate-of-change is either too fast or too slow. The change may be with respect to time (the default) or with respect to samples (delta alarms). Use the changeType attribute to select the type: changePerSecond (time) or changePerSample (delta). The change may also be ether relative (as a percentage change) or absolute as set by the changeBasis attribute. (Delta alarms are typically absolute but percentage is conceivable). The alarm also requires the spanOfInterest in both samples and seconds to have passed before it is to trigger. For time based rate of change alarms, the time specified in spanOfInterestInSeconds is used to calculate the change. For sample based rate of change alarms, the change is calculated over the number of samples specified in spanOfInterestInSamples. A typical delta alarm would set: changeType=changePerSample, changeBasis=absoluteChange, spanOfInterestInSamples=1. A typical time based version would set: changeType=changePerSecond, changeBasis=percentageChange, and spaceOfInterestInSeconds=1. To set the ranges use maxInclusive, the following definition applies: | Normal.maxInclusive | <= | Watch.maxInclusive | <= | Warning.maxInclusive | <= | Distress.maxInclusive | <= | Critical.maxInclusive | <= | Severe.maxInclusive |. And it is further assumed the absolute value of each range and sampled value it taken to evaluate the alarm. See NumericAlarmType.
+
+
+
+
+
+
+
+
+
+
+
+
+ Defines absoluteChange and percentageChange for use in rate of change alarms. Used by ChangeAlarmRangesType.
+
+
+
+
+
+
+
+
+ Defines six levels: Normal, Watch, Warning, Distress, Critical and Severe. Typical implementations color the "normal" level as green, "warning" level as yellow, and "critical" level as red. These level definitions are used throughout the alarm definitions. Some systems provide a greater fidelity with the additional levels provided here. The "normal" level is not typically needed because "normal" should be construed as none of the concern levels evaluating to true. For cases where definiing "normal" is needed, refer to the specific alarm definition types.
+
+
+
+
+
+
+
+
+
+
+
+
+ Defines the criticality level of a command. Criticality levels follow ISO 14950.
+
+
+
+
+ Normal command. Corresponds to ISO 14950 Level D telecommand criticality.
+
+
+
+
+ Command that is not a critical command but is essential to the success of the mission and, if sent at the wrong time, could cause momentary loss of the mission. Corresponds to ISO 14950 Level C telecommand criticality.
+
+
+
+
+ Command that, if executed at the wrong time or in the wrong configuration, could cause irreversible loss or damage for the mission. Corresponds to ISO 14950 Level B telecommand criticality. Some space programs have called this "restricted" and may be implemented with a secondary confirmation before transmission.
+
+
+
+
+ Command that is not expected to be used for nominal or foreseeable contingency operations, that is included for unforeseen contingency operations, and that could cause irreversible damage if executed at the wrong time or in the wrong configuration. Corresponds to ISO 14950 Level A telecommand criticality. Some space programs have called this "prohibited".
+
+
+
+
+ In the event that a program uses this value, that program will need to define the meaning of this value to their system.
+
+
+
+
+ In the event that a program uses this value, that program will need to define the meaning of this value to their system.
+
+
+
+
+
+
+ Defines a changePerSecond and changePerSample for use in rate of change alarms. Used by ChangeAlarmRangesType.
+
+
+
+
+
+
+
+
+ Describe a discrete value lookup and the value associated when the lookup evaluates to true.
+
+
+
+
+
+ Value to use when the lookup conditions are true.
+
+
+
+
+
+
+
+ Describe an alarm level and its enumeration label to trigger from. See EnumeratedAlarmType and EnumeratedParameterType.
+
+
+
+ Defines six levels: Normal, Watch, Warning, Distress, Critical and Severe. Typical implementations color the "normal" level as green, "warning" level as yellow, and "critical" level as red. In the case of enumeration alarms, the "normal" is assumed by implementations to be any label not otherwise in an alarm state.
+
+
+
+
+ The enumeration label is the engineering/calibrated value for enumerated types.
+
+
+
+
+
+
+
+ Describe an alarm state for an enumeration label where the label is engineer/calibrated value. Note that labels may represent multiple raw/uncalbrated values.
+
+
+
+
+
+
+ Describe a context that when true the alarm condition may be evaluated. See ContextMatchType and EnumerationAlarmType.
+
+
+
+
+
+
+ Describe a context in terms of a parameter and value that when true enables the context alarm definition.
+
+
+
+
+
+
+
+
+ Describe alarm conditions specific to the enumeration data type, extends the basic AlarmType with an EnumerationAlarmList. The alarms are described using the label (engineering/calibrated value) of the enumerated parameter. Enumeration labels may represent several raw/uncalibrated values, so as a result, a single alarm definition here may represent multiple raw values in the enumerated parameter. It is not necessary to define an alarm for raw/uncalibrated values that do not map to an enumeration. Implementations should implicitly define this as an alarm case, of which the manifestation of that is program/implementation specific. See EnumeratedParameterType.
+ An additional check needs to be performed to ensure that the enumeration values in the alarms are valid enumeration values for the Parameter
+
+
+
+
+
+
+ List of alarm state definitions for this enumerated type.
+
+
+
+
+
+ Alarm state name for when no enumeration alarms evaluate to true. This defaults to "normal", which is almost always the case. Setting it to another alarm state permits a form of "inverted logic" where the alarm list can specify the normal states instead of the alarm states.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Describe a floating point based range, several types of ranges are supported -- one sided and two sided, inclusive or exclusive. It would not make sense to set two mins or maxes. Used in a number of locations related to ranges: ValidFloatRangeSetType or AlarmRangeType for example.
+ Verify that the combination provided is usable.
+
+
+
+ Minimum decimal/real number value including itself.
+
+
+
+
+ Minimum decimal/real number value excluding itself.
+
+
+
+
+ Maximum decimal/real number value including itself.
+
+
+
+
+ Maximum decimal/real number value excluding itself.
+
+
+
+
+
+ Describe an integral based range: minInclusive and maxInclusive. Used in a number of locations related to ranges: ValidIntegerRangeSetType for example.
+
+
+
+ Minimum integer value including itself.
+
+
+
+
+ Maximum integer value including itself.
+
+
+
+
+
+ A slope and intercept may be applied to scale or shift the value of the parameter in the dynamic value
+
+
+
+
+
+
+ The alarm multi-range element type permits users to define multiple alarm ranges in a sequence that goes beyond the more typical "inside" and "outside" range definitions. It can be thought of as a "barber pole" definition.
+
+
+
+
+
+ A value of outside specifies that the most severe range is outside all the other ranges: -severe -critical -distress -warning -watch normal +watch +warning +distress +critical +severe. A value of inside "inverts" these bands: -green -watch -warning -distress -critical severe +critical +distress +warning +watch. The most common form used is "outside" and is the default.
+
+
+
+
+ The level of concern for this alarm definition.
+
+
+
+
+
+
+
+ Describe alarm conditions specific to the numeric data types, extends the basic AlarmType with StaticAlarmRanges and ChangeAlarmRanges. See FloatParameterType and IntegerParameterType.
+
+
+
+
+
+
+ StaticAlarmRanges are used to trigger alarms when the parameter value passes some threshold value.
+
+
+
+
+ ChangeAlarmRanges are used to trigger alarms when the parameter value changes by a rate or quantity from a reference.
+
+
+
+
+ Similar to but more lenient form of StaticAlarmRanges.
+
+
+
+
+
+
+
+
+ Describe a parameter dependent context, that when evaluates to true, enables the use of this alarm definition. See ContextMatchType and NumericAlarmType.
+
+
+
+
+
+
+ Contains the evaluation criteria for a parameter dependent test, that when evaluates to true, enables this alarm definition.
+
+
+
+
+
+
+
+
+ Describe a string alarm condition based on matching a regular expression. The level and regular expression are described. The specific implementation of the regular expression syntax is not specified in the schema at this time. See StringAlarmListType.
+
+
+
+
+
+
+ Describe an ordered collection of string alarms, where duplicates are valid. Evaluate the alarms in list order. The first to evaluate to true takes precedence. See StringAlarmLevelType.
+
+
+
+
+
+
+
+ Describe alarms specific to the string data type, extends the basic AlarmType, while adding a StringAlarmList and defaultAlarmLevel attribute. The string alarm list is evaluated in list order. See ConcernsLevelsType and StringAlarmListType.
+
+
+
+
+
+
+
+
+
+
+
+
+ Describe a context that when true the alarm may be evaluated. See ContextMatchType and StringAlarmType.
+
+
+
+
+
+
+
+
+
+
+
+ An ordered collection of numeric alarms associated with a context. Process the contexts in list order. See StringContextAlarmType.
+
+
+
+
+
+
+
+ Alarms associated with time data types
+
+
+
+
+
+
+ StaticAlarmRanges are used to trigger alarms when the parameter value passes some threshold value
+
+
+
+
+ ChangePerSecondAlarmRanges are used to trigger alarms when the parameter value's rate-of-change passes some threshold value. An alarm condition that triggers when the value changes too fast (or too slow)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Context alarms are applied when the ContextMatch is true. Context alarms override Default alarms
+
+
+
+
+
+
+
+
+
+
+
+ XTCE-specific replacement for xtce:NonNegativeLongType which more cleanly maps to native data types.
+
+
+
+
+
+
+
+ XTCE-specific replacement for xtce:PositiveLongType which more cleanly maps to native data types.
+
+
+
+
+
+
+
+ Optionally specify if this information pertains to something other than the calibrated/engineering value.
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/config/training/server_overlay/mdb/cfs-ccsds.xml b/config/training/server_overlay/mdb/cfs-ccsds.xml
new file mode 100644
index 000000000..48e9c7f30
--- /dev/null
+++ b/config/training/server_overlay/mdb/cfs-ccsds.xml
@@ -0,0 +1,178 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 160
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/config/training/target/CMakeLists.txt b/config/training/target/CMakeLists.txt
new file mode 100644
index 000000000..2a902bcf6
--- /dev/null
+++ b/config/training/target/CMakeLists.txt
@@ -0,0 +1,74 @@
+buildliner_initialize(
+ PSP ${PROJECT_SOURCE_DIR}/core/psp/pc-linux-wh
+
+ OSAL ${PROJECT_SOURCE_DIR}/core/osal/posix-fast
+
+ CONFIG
+ ${PROJECT_SOURCE_DIR}/config/training/inc
+ ${PROJECT_SOURCE_DIR}/config/shared/inc
+
+ STARTUP_SCRIPT
+ ${CMAKE_CURRENT_SOURCE_DIR}/cfe_es_startup.scr
+
+ FILESYS
+ /cf/log
+ /ram
+)
+
+buildliner_add_app(
+ sch
+ DEFINITION ${PROJECT_SOURCE_DIR}/apps/sch/fsw/for_build
+ CONFIG_SOURCES
+ ${PROJECT_SOURCE_DIR}/apps/sch/fsw/src/sch_custom.c
+)
+
+buildliner_add_table(
+ sch
+ NAME sch_def_msgtbl
+ SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/apps/sch/tables/sch_def_msgtbl.c
+)
+
+buildliner_add_table(
+ sch
+ NAME sch_def_schtbl
+ SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/apps/sch/tables/sch_def_schtbl.c
+)
+
+buildliner_add_app(
+ to
+ DEFINITION ${PROJECT_SOURCE_DIR}/apps/to/fsw/for_build
+ CONFIG_SOURCES
+ ${CMAKE_CURRENT_SOURCE_DIR}/apps/to/to_custom.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/apps/to/to_custom_udp.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/apps/to/tables/to_backup_cfg.c
+)
+
+buildliner_add_table(
+ to
+ NAME to_udp_cfg
+ SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/apps/to/tables/to_udp_cfg.c
+)
+
+buildliner_add_app(
+ ci
+ DEFINITION ${PROJECT_SOURCE_DIR}/apps/ci/fsw/for_build
+ CONFIG_SOURCES
+ ${CMAKE_CURRENT_SOURCE_DIR}/apps/ci/ci_custom.c
+)
+
+buildliner_add_table(
+ ci
+ NAME ci_config
+ SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/apps/ci/tables/ci_config.c
+)
+
+buildliner_add_app(
+ mfa
+ DEFINITION ${PROJECT_SOURCE_DIR}/apps/mfa/fsw/for_build
+)
+
+buildliner_add_table(
+ mfa
+ NAME mfa_config
+ SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/apps/mfa/mfa_config.c
+)
diff --git a/config/training/target/apps/ci/ci_custom.c b/config/training/target/apps/ci/ci_custom.c
new file mode 100644
index 000000000..cdce5bedb
--- /dev/null
+++ b/config/training/target/apps/ci/ci_custom.c
@@ -0,0 +1,132 @@
+/****************************************************************************
+*
+* Copyright (c) 2017 Windhover Labs, L.L.C. All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following conditions
+* are met:
+*
+* 1. Redistributions of source code must retain the above copyright
+* notice, this list of conditions and the following disclaimer.
+* 2. Redistributions in binary form must reproduce the above copyright
+* notice, this list of conditions and the following disclaimer in
+* the documentation and/or other materials provided with the
+* distribution.
+* 3. Neither the name Windhover Labs nor the names of its
+* contributors may be used to endorse or promote products derived
+* from this software without specific prior written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+* POSSIBILITY OF SUCH DAMAGE.
+*
+*****************************************************************************/
+
+#include "ci_custom.h"
+#include "ci_platform_cfg.h"
+#include
+#include
+#include
+#include "ci_events.h"
+#include
+#include
+
+#define CI_CUSTOM_RETURN_CODE_NULL_POINTER (-1)
+
+
+typedef struct
+{
+ int Socket;
+ uint16 Port;
+} CI_AppCustomData_t;
+
+CI_AppCustomData_t CI_AppCustomData = {0, 5010};
+
+
+osalbool CI_AddCustomEventFilters(uint32 *count)
+{
+ return TRUE;
+}
+
+
+int32 CI_InitCustom(void)
+{
+ int32 status = CFE_SUCCESS;
+ int reuseaddr = 1;
+ struct sockaddr_in address;
+
+ if((CI_AppCustomData.Socket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0)
+ {
+ CFE_EVS_SendEvent(CI_INIT_ERR_EID, CFE_EVS_ERROR,
+ "Socket errno: %i", errno);
+ status = -1;
+ goto end_of_function;
+ }
+
+ setsockopt(CI_AppCustomData.Socket, SOL_SOCKET, SO_REUSEADDR, &reuseaddr, sizeof(reuseaddr));
+
+ /* Put the socket in non-blocking mode: */
+ status = fcntl(CI_AppCustomData.Socket, F_SETFL, fcntl(CI_AppCustomData.Socket, F_GETFL) | O_NONBLOCK);
+ if(status)
+ {
+ CFE_EVS_SendEvent(CI_INIT_ERR_EID, CFE_EVS_ERROR,
+ "fcntl errno %i", errno);
+ status = -1;
+ goto end_of_function;
+ }
+
+ bzero((char *) &address, sizeof(address));
+ address.sin_family = AF_INET;
+ address.sin_addr.s_addr = htonl (INADDR_ANY);
+ address.sin_port = htons(CI_AppCustomData.Port);
+
+ if ( (bind(CI_AppCustomData.Socket, (struct sockaddr *) &address, sizeof(address)) < 0) )
+ {
+ CFE_EVS_SendEvent(CI_INIT_ERR_EID, CFE_EVS_ERROR,"Bind socket failed = %d", errno);
+ status = -1;
+ goto end_of_function;
+ }
+
+ CFE_EVS_SendEvent(CI_ENA_INF_EID, CFE_EVS_INFORMATION,
+ "UDP command input enabled on port %u.",
+ CI_AppCustomData.Port);
+
+end_of_function:
+ return status;
+
+}
+
+
+void CI_ReadMessage(uint8 *inOutBuffer, uint32 *inOutSize)
+{
+ int size = (int)*inOutSize;
+
+ size = recv(CI_AppCustomData.Socket,
+ (char *)inOutBuffer,
+ (size_t)&size, 0);
+
+ if(size <= 0)
+ {
+ *inOutSize = 0;
+ }
+ else
+ {
+ *inOutSize = size;
+ }
+}
+
+
+void CI_CleanupCustom(void)
+{
+ close(CI_AppCustomData.Socket);
+}
+
diff --git a/config/training/target/apps/ci/tables/ci_config.c b/config/training/target/apps/ci/tables/ci_config.c
new file mode 100644
index 000000000..dcd0efdce
--- /dev/null
+++ b/config/training/target/apps/ci/tables/ci_config.c
@@ -0,0 +1,68 @@
+/*
+** Pragmas
+*/
+
+/*
+** Include Files
+*/
+#include "cfe_tbl_filedef.h"
+#include "ci_tbldefs.h"
+
+/*
+** Local Defines
+*/
+
+/*
+** Local Structure Declarations
+*/
+static OS_USED CFE_TBL_FileDef_t CFE_TBL_FileDef =
+{
+ /* Content format: ObjName[64], TblName[38], Desc[32], TgtFileName[20], ObjSize
+ ** ObjName - variable name of config table, e.g., CI_ConfigDefTbl[]
+ ** TblName - app's table name, e.g., CI.CONFIG_TBL, where CI is the same app name
+ ** used in cfe_es_startup.scr, and CI_defConfigTbl is the same table
+ ** name passed in to CFE_TBL_Register()
+ ** Desc - description of table in string format
+ ** TgtFileName[20] - table file name, compiled as .tbl file extension
+ ** ObjSize - size of the entire table
+ */
+
+ "CI_ConfigTbl", "CI.CONFIG_TBL", "CI default config table",
+ "ci_config.tbl", sizeof(CI_ConfigTblEntry_t)
+};
+
+/*
+** External Global Variables
+*/
+
+/*
+** Global Variables
+*/
+
+/* Default CI config table data */
+CI_ConfigTblEntry_t CI_ConfigTbl =
+{
+ /* Table ID */
+ 1,
+ {
+ /* Registered Commands */
+ {0x1806, 2, STEP_2, UNAUTHORIZED, 0, LOG} // CFE ES Proc/Power Reset
+ }
+};
+
+/*
+** Local Variables
+*/
+
+/*
+** Function Prototypes
+*/
+
+/*
+** Function Definitions
+*/
+
+/*=======================================================================================
+** End of file ci_config.c
+**=====================================================================================*/
+
diff --git a/config/training/target/apps/mfa/mfa_config.c b/config/training/target/apps/mfa/mfa_config.c
new file mode 100644
index 000000000..1215e80ff
--- /dev/null
+++ b/config/training/target/apps/mfa/mfa_config.c
@@ -0,0 +1,63 @@
+/*
+** Pragmas
+*/
+
+/*
+** Include Files
+*/
+#include "cfe_tbl_filedef.h"
+#include "mfa_tbldefs.h"
+
+/*
+** Local Defines
+*/
+
+/*
+** Local Structure Declarations
+*/
+static OS_USED CFE_TBL_FileDef_t CFE_TBL_FileDef =
+{
+ /* Content format: ObjName[64], TblName[38], Desc[32], TgtFileName[20], ObjSize
+ ** ObjName - variable name of config table, e.g., CI_ConfigDefTbl[]
+ ** TblName - app's table name, e.g., CI.CONFIG_TBL, where CI is the same app name
+ ** used in cfe_es_startup.scr, and CI_defConfigTbl is the same table
+ ** name passed in to CFE_TBL_Register()
+ ** Desc - description of table in string format
+ ** TgtFileName[20] - table file name, compiled as .tbl file extension
+ ** ObjSize - size of the entire table
+ */
+
+ "MFA_ConfigTbl", "MFA.CONFIG_TBL", "MFA default config table",
+ "mfa_config.tbl", sizeof(MFA_ConfigTbl_t)
+};
+
+/*
+** External Global Variables
+*/
+
+/*
+** Global Variables
+*/
+
+/* Default CI config table data */
+MFA_ConfigTbl_t MFA_ConfigTbl =
+{
+ "Looping, from a config table!"
+};
+
+/*
+** Local Variables
+*/
+
+/*
+** Function Prototypes
+*/
+
+/*
+** Function Definitions
+*/
+
+/*=======================================================================================
+** End of file ci_config.c
+**=====================================================================================*/
+
diff --git a/config/training/target/apps/sch/tables/sch_def_msgtbl.c b/config/training/target/apps/sch/tables/sch_def_msgtbl.c
new file mode 100644
index 000000000..3cf4b367e
--- /dev/null
+++ b/config/training/target/apps/sch/tables/sch_def_msgtbl.c
@@ -0,0 +1,314 @@
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+** Pragmas
+*/
+
+/*
+** Include Files
+*/
+#include "cfe.h"
+#include "cfe_tbl_filedef.h"
+#include "sch_platform_cfg.h"
+#include "sch_tbldefs.h"
+#include "msg_ids.h"
+
+
+/*
+** Local Defines
+*/
+
+/*
+** Local Structure Declarations
+*/
+
+/*
+** External Global Variables
+*/
+
+/*
+** Global Variables
+*/
+
+#define SCH_FIX_HEADER(a, b, c) CFE_MAKE_BIG16(a), CFE_MAKE_BIG16(b), CFE_MAKE_BIG16(c)
+
+/* Message table entry map */
+SCH_MessageEntry_t SCH_DefaultMessageTable[SCH_MAX_MESSAGES] =
+{
+ /* ** DO NOT USE -- entry #0 reserved for "unused" command ID - DO NOT USE */
+ /* Command ID #0 */
+ { { SCH_UNUSED_MID, 0, 0, 0 } },
+ /* Command ID #1 - Executive Services HK Request */
+ { { SCH_FIX_HEADER(CFE_ES_SEND_HK_MID, 0xC000, 0x0001), 0x0000 } },
+ /* Command ID #2 - Event Services HK Request */
+ { { SCH_FIX_HEADER(CFE_EVS_SEND_HK_MID, 0xC000, 0x0001), 0x0000 } },
+ /* Command ID #3 - Software Bus HK Request */
+ { { SCH_FIX_HEADER(CFE_SB_SEND_HK_MID, 0xC000, 0x0001), 0x0000 } },
+ /* Command ID #4 - Time Services HK Request */
+ { { SCH_FIX_HEADER(CFE_TIME_SEND_HK_MID, 0xC000, 0x0001), 0x0000 } },
+ /* Command ID #5 - Table Services HK Request */
+ { { SCH_FIX_HEADER(CFE_TBL_SEND_HK_MID, 0xC000, 0x0001), 0x0000 } },
+ /* Command ID #6 */
+ { { SCH_FIX_HEADER(CFE_TIME_FAKE_CMD_MID, 0xC000, 0x0001), 0x0000 } },
+ /* Command ID #7 - Data storage HK request*/
+ { { SCH_FIX_HEADER(SCH_UNUSED_MID, 0,0), 0 } },
+ /* Command ID #8 */
+ { { SCH_FIX_HEADER(SCH_UNUSED_MID, 0,0), 0 } },
+ /* Command ID #9 */
+ { { SCH_FIX_HEADER(SCH_UNUSED_MID, 0,0), 0 } },
+ /* Command ID #10 - Health and safety HK request*/
+ { { SCH_FIX_HEADER(SCH_UNUSED_MID, 0,0), 0 } },
+ /* Command ID #11 - Limit checker HK request*/
+ { { SCH_FIX_HEADER(SCH_UNUSED_MID, 0,0), 0 } },
+ /* Command ID #12 */
+ { { SCH_FIX_HEADER(SCH_UNUSED_MID, 0,0), 0 } },
+ /* Command ID #13 */
+ { { SCH_FIX_HEADER(SCH_UNUSED_MID, 0,0), 0 } },
+ /* Command ID #14 - Wakeup store command app*/
+ { { SCH_FIX_HEADER(SCH_UNUSED_MID, 0,0), 0 } },
+ /* Command ID #15 - Scheduler HK request*/
+ { { SCH_FIX_HEADER(SCH_SEND_HK_MID, 0xC000, 0x0001), 0x0000 } },
+ /* Command ID #16 */
+ { { SCH_FIX_HEADER(SCH_UNUSED_MID, 0,0), 0 } },
+ /* Command ID #17 */
+ { { SCH_FIX_HEADER(SCH_UNUSED_MID, 0,0), 0 } },
+ /* Command ID #18 */
+ { { SCH_FIX_HEADER(SCH_UNUSED_MID, 0, 0), 0 } },
+ /* Command ID #19 */
+ { { SCH_FIX_HEADER(SCH_UNUSED_MID, 0,0), 0 } },
+ /* Command ID #20 */
+ { { SCH_FIX_HEADER(TO_SEND_HK_MID, 0xC000, 0x0001), 0x0000 } },
+ /* Command ID #21 */
+ { { SCH_FIX_HEADER(TO_SEND_TLM_MID, 0xC000, 0x0001), 0x0000 } },
+ /* Command ID #22 */
+ { { SCH_FIX_HEADER(SCH_UNUSED_MID, 0, 0), 0 } },
+ /* Command ID #23 */
+ { { SCH_FIX_HEADER(SCH_UNUSED_MID, 0, 0), 0 } },
+ /* Command ID #24 */
+ { { SCH_FIX_HEADER(SCH_UNUSED_MID, 0, 0), 0 } },
+ /* Command ID #25 */
+ { { SCH_FIX_HEADER(SCH_UNUSED_MID, 0, 0), 0 } },
+ /* Command ID #26 */
+ { { SCH_FIX_HEADER(CI_INGEST_COMMANDS_MID, 0xC000, 0x0001), 0x0000 } },
+ /* Command ID #27 */
+ { { SCH_FIX_HEADER(CI_PROCESS_TIMEOUTS_MID, 0xC000, 0x0001), 0x0000 } },
+ /* Command ID #28 */
+ { { SCH_FIX_HEADER(CI_SEND_HK_MID, 0xC000, 0x0001), 0x0000 } },
+ /* Command ID #29 */
+ { { SCH_FIX_HEADER(CI_WAKEUP_MID, 0xC000, 0x0001), 0x0000 } },
+ /* Command ID #30 */
+ { { SCH_FIX_HEADER(SCH_UNUSED_MID, 0,0), 0 } },
+ /* Command ID #31 */
+ { { SCH_FIX_HEADER(SCH_UNUSED_MID, 0,0), 0 } },
+ /* Command ID #32 */
+ { { SCH_FIX_HEADER(SCH_UNUSED_MID, 0,0), 0 } },
+ /* Command ID #33 */
+ { { SCH_FIX_HEADER(SCH_UNUSED_MID, 0,0), 0 } },
+ /* Command ID #34 */
+ { { SCH_FIX_HEADER(SCH_UNUSED_MID, 0,0), 0 } },
+ /* Command ID #35 */
+ { { SCH_FIX_HEADER(MFA_WAKEUP_MID, 0xC000, 0x0001), 0x0000 } },
+ /* Command ID #36 */
+ { { SCH_FIX_HEADER(MFA_SEND_HK_MID, 0xC000, 0x0001), 0x0000 } },
+ /* Command ID #37 */
+ { { SCH_FIX_HEADER(SCH_UNUSED_MID, 0,0), 0 } },
+ /* Command ID #38 */
+ { { SCH_FIX_HEADER(SCH_UNUSED_MID, 0,0), 0 } },
+ /* Command ID #39 */
+ { { SCH_FIX_HEADER(SCH_UNUSED_MID, 0,0), 0 } },
+ /* Command ID #40 */
+ { { SCH_FIX_HEADER(SCH_UNUSED_MID, 0,0), 0 } },
+ /* Command ID #41 */
+ { { SCH_FIX_HEADER(SCH_UNUSED_MID, 0,0), 0 } },
+ /* Command ID #42 */
+ { { SCH_FIX_HEADER(SCH_UNUSED_MID, 0, 0), 0 } },
+ /* Command ID #43 */
+ { { SCH_FIX_HEADER(SCH_UNUSED_MID, 0, 0), 0 } },
+ /* Command ID #44 */
+ { { SCH_FIX_HEADER(SCH_UNUSED_MID, 0, 0), 0 } },
+ /* Command ID #45 */
+ { { SCH_FIX_HEADER(SCH_UNUSED_MID, 0, 0), 0 } },
+ /* Command ID #46 */
+ { { SCH_FIX_HEADER(SCH_UNUSED_MID, 0, 0), 0 } },
+ /* Command ID #47 */
+ { { SCH_FIX_HEADER(SCH_UNUSED_MID, 0, 0), 0 } },
+ /* Command ID #48 */
+ { { SCH_FIX_HEADER(SCH_UNUSED_MID, 0, 0), 0 } },
+ /* Command ID #49 */
+ { { SCH_FIX_HEADER(SCH_UNUSED_MID, 0, 0), 0 } },
+ /* Command ID #50 */
+ { { SCH_FIX_HEADER(SCH_UNUSED_MID, 0, 0), 0 } },
+ /* Command ID #51 */
+ { { SCH_FIX_HEADER(SCH_UNUSED_MID, 0,0), 0 } },
+ /* Command ID #52 */
+ { { SCH_FIX_HEADER(SCH_UNUSED_MID, 0,0), 0 } },
+ /* Command ID #53 */
+ { { SCH_FIX_HEADER(SCH_UNUSED_MID, 0,0), 0 } },
+ /* Command ID #54 */
+ { { SCH_FIX_HEADER(SCH_UNUSED_MID, 0, 0), 0 } },
+ /* Command ID #55 */
+ { { SCH_FIX_HEADER(SCH_UNUSED_MID, 0, 0), 0 } },
+ /* Command ID #56 */
+ { { SCH_FIX_HEADER(SCH_UNUSED_MID, 0, 0), 0 } },
+ /* Command ID #57 */
+ { { SCH_FIX_HEADER(SCH_UNUSED_MID, 0,0), 0 } },
+ /* Command ID #58 */
+ { { SCH_FIX_HEADER(SCH_UNUSED_MID, 0,0), 0 } },
+ /* Command ID #59 */
+ { { SCH_FIX_HEADER(SCH_UNUSED_MID, 0,0), 0 } },
+ /* Command ID #60 */
+ { { SCH_FIX_HEADER(SCH_UNUSED_MID, 0,0), 0 } },
+ /* Command ID #61 */
+ { { SCH_FIX_HEADER(SCH_UNUSED_MID, 0,0), 0 } },
+ /* Command ID #62 */
+ { { SCH_FIX_HEADER(SCH_UNUSED_MID, 0,0), 0 } },
+ /* Command ID #63 */
+ { { SCH_FIX_HEADER(SCH_UNUSED_MID, 0,0), 0 } },
+ /* Command ID #64 */
+ { { SCH_FIX_HEADER(SCH_UNUSED_MID, 0,0), 0 } },
+ /* Command ID #65 */
+ { { SCH_FIX_HEADER(SCH_UNUSED_MID, 0,0), 0 } },
+ /* Command ID #66 */
+ { { SCH_FIX_HEADER(SCH_UNUSED_MID, 0,0), 0 } },
+ /* Command ID #67 */
+ { { SCH_FIX_HEADER(SCH_UNUSED_MID, 0,0), 0 } },
+ /* Command ID #68 */
+ { { SCH_FIX_HEADER(SCH_UNUSED_MID, 0,0), 0 } },
+ /* Command ID #69 */
+ { { SCH_FIX_HEADER(SCH_UNUSED_MID, 0,0), 0 } },
+ /* Command ID #70 */
+ { { SCH_FIX_HEADER(SCH_UNUSED_MID, 0,0), 0 } },
+ /* Command ID #71 */
+ { { SCH_FIX_HEADER(SCH_UNUSED_MID, 0, 0), 0 } },
+ /* Command ID #72 */
+ { { SCH_FIX_HEADER(SCH_UNUSED_MID, 0, 0), 0 } },
+ /* Command ID #73 */
+ { { SCH_FIX_HEADER(SCH_UNUSED_MID, 0, 0), 0 } },
+ /* Command ID #74 */
+ { { SCH_FIX_HEADER(SCH_UNUSED_MID, 0,0), 0 } },
+ /* Command ID #75 */
+ { { SCH_FIX_HEADER(SCH_UNUSED_MID, 0,0), 0 } },
+ /* Command ID #76 */
+ { { SCH_FIX_HEADER(SCH_UNUSED_MID, 0, 0), 0 } },
+ /* Command ID #77 */
+ { { SCH_FIX_HEADER(SCH_UNUSED_MID, 0, 0), 0 } },
+ /* Command ID #78 */
+ { { SCH_FIX_HEADER(SCH_UNUSED_MID, 0,0), 0 } },
+ /* Command ID #79 */
+ { { SCH_FIX_HEADER(SCH_UNUSED_MID, 0,0), 0 } },
+ /* Command ID #80 */
+ { { SCH_FIX_HEADER(SCH_UNUSED_MID, 0,0), 0 } },
+ /* Command ID #81 */
+ { { SCH_FIX_HEADER(SCH_UNUSED_MID, 0,0), 0 } },
+ /* Command ID #82 */
+ { { SCH_FIX_HEADER(SCH_UNUSED_MID, 0,0), 0 } },
+ /* Command ID #83 */
+ { { SCH_FIX_HEADER(SCH_UNUSED_MID, 0, 0), 0 } },
+ /* Command ID #84 */
+ { { SCH_FIX_HEADER(SCH_UNUSED_MID, 0, 0), 0 } },
+ /* Command ID #85 */
+ { { SCH_FIX_HEADER(SCH_UNUSED_MID, 0,0), 0 } },
+ /* Command ID #86 */
+ { { SCH_FIX_HEADER(SCH_UNUSED_MID, 0,0), 0 } },
+ /* Command ID #87 */
+ { { SCH_FIX_HEADER(SCH_UNUSED_MID, 0, 0), 0 } },
+ /* Command ID #88 */
+ { { SCH_FIX_HEADER(SCH_UNUSED_MID, 0,0), 0 } },
+ /* Command ID #89 */
+ { { SCH_FIX_HEADER(SCH_UNUSED_MID, 0, 0), 0 } },
+ /* Command ID #90 */
+ { { SCH_FIX_HEADER(SCH_UNUSED_MID, 0,0), 0 } },
+ /* Command ID #91 */
+ { { SCH_FIX_HEADER(SCH_UNUSED_MID, 0,0), 0 } },
+ /* Command ID #92 */
+ { { SCH_FIX_HEADER(SCH_UNUSED_MID, 0, 0), 0 } },
+ /* Command ID #93 */
+ { { SCH_FIX_HEADER(SCH_UNUSED_MID, 0,0), 0 } },
+ /* Command ID #94 */
+ { { SCH_FIX_HEADER(SCH_UNUSED_MID, 0,0), 0 } },
+ /* Command ID #95*/
+ { { SCH_FIX_HEADER(SCH_UNUSED_MID, 0, 0), 0 } },
+ /* Command ID #96 */
+ { { SCH_FIX_HEADER(SCH_UNUSED_MID, 0, 0), 0 } },
+ /* Command ID #97 */
+ { { SCH_FIX_HEADER(SCH_UNUSED_MID, 0, 0), 0 } },
+ /* Command ID #98 */
+ /* SBN Wakeup command code. */
+ { { SCH_FIX_HEADER(SCH_UNUSED_MID, 0,0), 0 } },
+ /* Command ID #99 */
+ /* SBN Send HK command code. */
+ { { SCH_FIX_HEADER(SCH_UNUSED_MID, 0,0), 0 } },
+ /* Command ID #100 */
+ { { SCH_FIX_HEADER(SCH_UNUSED_MID, 0,0), 0 } },
+ /* Command ID #101 */
+ { { SCH_FIX_HEADER(SCH_UNUSED_MID, 0,0), 0 } },
+ /* Command ID #102 */
+ { { SCH_FIX_HEADER(SCH_UNUSED_MID, 0,0), 0 } },
+ /* Command ID #103 */
+ { { SCH_FIX_HEADER(SCH_UNUSED_MID, 0,0), 0 } },
+ /* Command ID #104 */
+ { { SCH_FIX_HEADER(SCH_UNUSED_MID, 0,0), 0 } },
+ /* Command ID #105 */
+ { { SCH_FIX_HEADER(SCH_UNUSED_MID, 0,0), 0 } },
+ /* Command ID #106 */
+ { { SCH_FIX_HEADER(SCH_UNUSED_MID, 0,0), 0 } },
+ /* Command ID #107 */
+ { { SCH_FIX_HEADER(SCH_UNUSED_MID, 0,0), 0 } },
+ /* Command ID #108 */
+ { { SCH_FIX_HEADER(SCH_UNUSED_MID, 0,0), 0 } },
+ /* Command ID #109 */
+ { { SCH_FIX_HEADER(SCH_UNUSED_MID, 0,0), 0 } },
+ /* Command ID #110 */
+ { { SCH_FIX_HEADER(SCH_UNUSED_MID, 0,0), 0 } },
+ /* Command ID #111 */
+ { { SCH_FIX_HEADER(SCH_UNUSED_MID, 0,0), 0 } },
+ /* Command ID #112 */
+ { { SCH_FIX_HEADER(SCH_UNUSED_MID, 0,0), 0 } },
+ /* Command ID #113 */
+ { { SCH_FIX_HEADER(SCH_UNUSED_MID, 0,0), 0 } },
+ /* Command ID #114 */
+ { { SCH_FIX_HEADER(SCH_UNUSED_MID, 0,0), 0 } },
+ /* Command ID #115 */
+ { { SCH_FIX_HEADER(SCH_UNUSED_MID, 0,0), 0 } },
+ /* Command ID #116 */
+ { { SCH_FIX_HEADER(SCH_UNUSED_MID, 0, 0), 0 } },
+ /* Command ID #117 */
+ { { SCH_FIX_HEADER(SCH_UNUSED_MID, 0,0), 0 } },
+ /* Command ID #118 */
+ { { SCH_FIX_HEADER(SCH_UNUSED_MID, 0,0), 0 } },
+ /* Command ID #119 */
+ { { SCH_FIX_HEADER(SCH_UNUSED_MID, 0,0), 0 } },
+ /* Command ID #120 */
+ { { SCH_FIX_HEADER(SCH_UNUSED_MID, 0,0), 0 } },
+ /* Command ID #121 */
+ { { SCH_FIX_HEADER(SCH_UNUSED_MID, 0,0), 0 } },
+ /* Command ID #122 */
+ { { SCH_FIX_HEADER(SCH_UNUSED_MID, 0, 0), 0 } },
+ /* Command ID #123 */
+ { { SCH_FIX_HEADER(SCH_UNUSED_MID, 0, 0), 0 } },
+ /* Command ID #124 */
+ { { SCH_FIX_HEADER(SCH_UNUSED_MID, 0, 0), 0 } },
+ /* Command ID #125 */
+ { { SCH_FIX_HEADER(SCH_UNUSED_MID, 0, 0), 0 } },
+ /* Command ID #126 */
+ { { SCH_FIX_HEADER(SCH_UNUSED_MID, 0, 0), 0 } },
+ /* Command ID #127 */
+ { { SCH_FIX_HEADER(SCH_UNUSED_MID, 0, 0), 0 } },
+};
+
+
+/* Table file header */
+CFE_TBL_FILEDEF(SCH_DefaultMessageTable, SCH.MSG_DEFS, SCH message definitions table, sch_def_msgtbl.tbl )
+
+
+
+#ifdef __cplusplus
+}
+#endif
+
+/*=======================================================================================
+** End of file sch_def_msgtbl.c
+**=====================================================================================*/
+
diff --git a/config/training/target/apps/sch/tables/sch_def_schtbl.c b/config/training/target/apps/sch/tables/sch_def_schtbl.c
new file mode 100644
index 000000000..712205da7
--- /dev/null
+++ b/config/training/target/apps/sch/tables/sch_def_schtbl.c
@@ -0,0 +1,146 @@
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+** Pragmas
+*/
+
+/*
+** Include Files
+*/
+#include "cfe.h"
+#include "cfe_tbl_filedef.h"
+#include "sch_platform_cfg.h"
+#include "sch_msgdefs.h"
+#include "sch_tbldefs.h"
+
+#include "sch_grpids.h"
+
+
+/*
+** Local Defines
+*/
+
+#define CFE_ES_SEND_HK_MIDX 1
+#define CFE_EVS_SEND_HK_MIDX 2
+#define CFE_SB_SEND_HK_MIDX 3
+#define CFE_TIME_SEND_HK_MIDX 4
+#define CFE_TBL_SEND_HK_MIDX 5
+#define CFE_TIME_FAKE_CMD_MIDX 6
+
+#define SCH_SEND_HK_MIDX 15
+
+#define TO_SEND_HK_MIDX 20
+#define TO_SEND_TLM_MIDX 21
+
+#define CI_INGEST_COMMANDS_MIDX 26
+#define CI_PROCESS_TIMEOUTS_MIDX 27
+#define CI_SEND_HK_MIDX 28
+#define CI_WAKEUP_MIDX 29
+
+#define MFA_WAKEUP_MIDX 35
+#define MFA_SEND_HK_MIDX 36
+
+
+/* Default schedule table */
+SCH_ScheduleEntry_t SCH_DefaultScheduleTable[SCH_TABLE_ENTRIES] =
+{
+ /* Minor Frame 0 */
+ { SCH_ENABLED, SCH_ACTIVITY_SEND_MSG, 1, 0, CFE_ES_SEND_HK_MIDX, SCH_GROUP_NONE },
+ { SCH_ENABLED, SCH_ACTIVITY_SEND_MSG, 1, 0, TO_SEND_TLM_MIDX, SCH_GROUP_NONE },
+ { SCH_ENABLED, SCH_ACTIVITY_SEND_MSG, 1, 0, MFA_WAKEUP_MIDX, SCH_GROUP_NONE },
+ { SCH_UNUSED, 0, 0, 0, 0, SCH_GROUP_NONE },
+ { SCH_UNUSED, 0, 0, 0, 0, SCH_GROUP_NONE },
+
+ /* Minor Frame 1 */
+ { SCH_ENABLED, SCH_ACTIVITY_SEND_MSG, 1, 0, CFE_EVS_SEND_HK_MIDX, SCH_GROUP_NONE },
+ { SCH_ENABLED, SCH_ACTIVITY_SEND_MSG, 1, 0, CI_SEND_HK_MIDX, SCH_GROUP_NONE },
+ { SCH_UNUSED, 0, 0, 0, 0, SCH_GROUP_NONE },
+ { SCH_UNUSED, 0, 0, 0, 0, SCH_GROUP_NONE },
+ { SCH_UNUSED, 0, 0, 0, 0, SCH_GROUP_NONE },
+
+ /* Minor Frame 2 */
+ { SCH_ENABLED, SCH_ACTIVITY_SEND_MSG, 1, 0, CFE_SB_SEND_HK_MIDX, SCH_GROUP_NONE },
+ { SCH_ENABLED, SCH_ACTIVITY_SEND_MSG, 1, 0, CI_WAKEUP_MIDX, SCH_GROUP_NONE },
+ { SCH_UNUSED, 0, 0, 0, 0, SCH_GROUP_NONE },
+ { SCH_UNUSED, 0, 0, 0, 0, SCH_GROUP_NONE },
+ { SCH_UNUSED, 0, 0, 0, 0, SCH_GROUP_NONE },
+
+ /* Minor Frame 3 */
+ { SCH_ENABLED, SCH_ACTIVITY_SEND_MSG, 1, 0, CFE_TIME_SEND_HK_MIDX, SCH_GROUP_NONE },
+ { SCH_ENABLED, SCH_ACTIVITY_SEND_MSG, 1, 0, CI_INGEST_COMMANDS_MIDX, SCH_GROUP_NONE },
+ { SCH_UNUSED, 0, 0, 0, 0, SCH_GROUP_NONE },
+ { SCH_UNUSED, 0, 0, 0, 0, SCH_GROUP_NONE },
+ { SCH_UNUSED, 0, 0, 0, 0, SCH_GROUP_NONE },
+
+ /* Minor Frame 4 */
+ { SCH_ENABLED, SCH_ACTIVITY_SEND_MSG, 1, 0, CFE_TBL_SEND_HK_MIDX, SCH_GROUP_NONE },
+ { SCH_ENABLED, SCH_ACTIVITY_SEND_MSG, 1, 0, CI_PROCESS_TIMEOUTS_MIDX, SCH_GROUP_NONE },
+ { SCH_UNUSED, 0, 0, 0, 0, SCH_GROUP_NONE },
+ { SCH_UNUSED, 0, 0, 0, 0, SCH_GROUP_NONE },
+ { SCH_UNUSED, 0, 0, 0, 0, SCH_GROUP_NONE },
+
+ /* Minor Frame 5 */
+ { SCH_ENABLED, SCH_ACTIVITY_SEND_MSG, 1, 0, MFA_SEND_HK_MIDX, SCH_GROUP_NONE },
+ { SCH_UNUSED, 0, 0, 0, 0, SCH_GROUP_NONE },
+ { SCH_UNUSED, 0, 0, 0, 0, SCH_GROUP_NONE },
+ { SCH_UNUSED, 0, 0, 0, 0, SCH_GROUP_NONE },
+ { SCH_UNUSED, 0, 0, 0, 0, SCH_GROUP_NONE },
+
+ /* Minor Frame 6 */
+ { SCH_ENABLED, SCH_ACTIVITY_SEND_MSG, 1, 0, SCH_SEND_HK_MIDX, SCH_GROUP_NONE },
+ { SCH_UNUSED, 0, 0, 0, 0, SCH_GROUP_NONE },
+ { SCH_UNUSED, 0, 0, 0, 0, SCH_GROUP_NONE },
+ { SCH_UNUSED, 0, 0, 0, 0, SCH_GROUP_NONE },
+ { SCH_UNUSED, 0, 0, 0, 0, SCH_GROUP_NONE },
+
+ /* Minor Frame 7 */
+ { SCH_ENABLED, SCH_ACTIVITY_SEND_MSG, 1, 0, TO_SEND_HK_MIDX, SCH_GROUP_NONE },
+ { SCH_UNUSED, 0, 0, 0, 0, SCH_GROUP_NONE },
+ { SCH_UNUSED, 0, 0, 0, 0, SCH_GROUP_NONE },
+ { SCH_UNUSED, 0, 0, 0, 0, SCH_GROUP_NONE },
+ { SCH_UNUSED, 0, 0, 0, 0, SCH_GROUP_NONE },
+
+ /* Minor Frame 8 */
+ { SCH_UNUSED, 0, 0, 0, 0, SCH_GROUP_NONE },
+ { SCH_UNUSED, 0, 0, 0, 0, SCH_GROUP_NONE },
+ { SCH_UNUSED, 0, 0, 0, 0, SCH_GROUP_NONE },
+ { SCH_UNUSED, 0, 0, 0, 0, SCH_GROUP_NONE },
+ { SCH_UNUSED, 0, 0, 0, 0, SCH_GROUP_NONE },
+
+ /* Minor Frame 9 */
+ { SCH_UNUSED, 0, 0, 0, 0, SCH_GROUP_NONE },
+ { SCH_UNUSED, 0, 0, 0, 0, SCH_GROUP_NONE },
+ { SCH_UNUSED, 0, 0, 0, 0, SCH_GROUP_NONE },
+ { SCH_UNUSED, 0, 0, 0, 0, SCH_GROUP_NONE },
+ { SCH_UNUSED, 0, 0, 0, 0, SCH_GROUP_NONE }
+};
+
+/*
+** Local Variables
+*/
+
+/*
+** Function Prototypes
+*/
+
+/*
+** Function Definitions
+*/
+
+
+
+/* Table file header */
+CFE_TBL_FILEDEF(SCH_DefaultScheduleTable, SCH.SCHED_DEF, SCH schedule table, sch_def_schtbl.tbl )
+
+
+
+#ifdef __cplusplus
+}
+#endif
+
+/*=======================================================================================
+** End of file sch_def_schtbl.c
+**=====================================================================================*/
+
diff --git a/config/training/target/apps/to/tables/to_backup_cfg.c b/config/training/target/apps/to/tables/to_backup_cfg.c
new file mode 100644
index 000000000..a9f9c74d1
--- /dev/null
+++ b/config/training/target/apps/to/tables/to_backup_cfg.c
@@ -0,0 +1,71 @@
+/************************************************************************
+ ** Includes
+ *************************************************************************/
+#include "cfe_tbl_filedef.h"
+#include "to_tbldefs.h"
+#include "msg_ids.h"
+
+/************************************************************************
+ ** Defines
+ *************************************************************************/
+
+#define TO_PQUEUE_SINGLE_PASS_IDX 0
+#define TO_PQUEUE_HIGH_OPS_RSRVD_IDX 1
+#define TO_PQUEUE_HIGH_IDX 2
+#define TO_PQUEUE_EVENTS_IDX 3
+#define TO_PQUEUE_CFDP_IDX 4
+#define TO_PQUEUE_MEDIUM_IDX 5
+#define TO_PQUEUE_SHELL_IDX 6
+#define TO_PQUEUE_LOW_IDX 7
+
+/**
+ ** \brief Default TO config table data
+ */
+TO_ChannelTbl_t TO_BackupConfigTbl =
+{
+ /* Table ID */
+ 1,
+ {
+ /* Message Flows */
+ {TO_HK_TLM_MID, 1, TO_PQUEUE_MEDIUM_IDX},
+ {TO_DIAG_TLM_MID, 1, TO_PQUEUE_MEDIUM_IDX},
+ {TO_DIAG_MSG_FLOW_MID, 1, TO_PQUEUE_MEDIUM_IDX},
+ {CI_HK_TLM_MID, 1, TO_PQUEUE_MEDIUM_IDX},
+ {CFE_ES_HK_TLM_MID, 1, TO_PQUEUE_MEDIUM_IDX},
+ {CFE_EVS_HK_TLM_MID, 1, TO_PQUEUE_MEDIUM_IDX},
+ {CFE_SB_HK_TLM_MID, 1, TO_PQUEUE_MEDIUM_IDX},
+ {CFE_TBL_HK_TLM_MID, 1, TO_PQUEUE_MEDIUM_IDX},
+ {CFE_TIME_HK_TLM_MID, 1, TO_PQUEUE_MEDIUM_IDX},
+ {CFE_TIME_DIAG_TLM_MID, 1, TO_PQUEUE_MEDIUM_IDX},
+ {CFE_EVS_EVENT_MSG_MID, 32, TO_PQUEUE_EVENTS_IDX},
+ {CFE_SB_STATS_TLM_MID, 1, TO_PQUEUE_MEDIUM_IDX},
+ {CFE_ES_APP_TLM_MID, 1, TO_PQUEUE_MEDIUM_IDX},
+ {CFE_TBL_REG_TLM_MID, 1, TO_PQUEUE_MEDIUM_IDX},
+ {CFE_SB_ONESUB_TLM_MID, 1, TO_PQUEUE_MEDIUM_IDX},
+ {CFE_ES_SHELL_TLM_MID, 32, TO_PQUEUE_SHELL_IDX},
+ {CFE_ES_MEMSTATS_TLM_MID, 1, TO_PQUEUE_MEDIUM_IDX},
+ },{
+ /* Priority Queues */
+ /* TO_PQUEUE_SINGLE_PASS_IDX */
+ {TO_PQUEUE_ENA, 20, TO_PRIORITY_QUEUE_TYPE_SINGLE},
+ /* TO_PQUEUE_HIGH_OPS_RSRVD_IDX */
+ {TO_PQUEUE_ENA, 20, TO_PRIORITY_QUEUE_TYPE_FIFO},
+ /* TO_PQUEUE_HIGH_IDX */
+ {TO_PQUEUE_ENA, 4, TO_PRIORITY_QUEUE_TYPE_FIFO},
+ /* TO_PQUEUE_EVENTS_IDX */
+ {TO_PQUEUE_ENA, 32, TO_PRIORITY_QUEUE_TYPE_FIFO},
+ /* TO_PQUEUE_CFDP_IDX */
+ {TO_PQUEUE_ENA, 32, TO_PRIORITY_QUEUE_TYPE_FIFO},
+ /* TO_PQUEUE_MEDIUM_IDX */
+ {TO_PQUEUE_ENA, 16, TO_PRIORITY_QUEUE_TYPE_FIFO},
+ /* TO_PQUEUE_SHELL_IDX */
+ {TO_PQUEUE_ENA, 32, TO_PRIORITY_QUEUE_TYPE_FIFO},
+ /* TO_PQUEUE_LOW_IDX */
+ {TO_PQUEUE_ENA, 20, TO_PRIORITY_QUEUE_TYPE_FIFO}
+ }
+};
+
+
+/************************/
+/* End of File Comment */
+/************************/
diff --git a/config/training/target/apps/to/tables/to_udp_cfg.c b/config/training/target/apps/to/tables/to_udp_cfg.c
new file mode 100644
index 000000000..f56b297eb
--- /dev/null
+++ b/config/training/target/apps/to/tables/to_udp_cfg.c
@@ -0,0 +1,87 @@
+/************************************************************************
+ ** Includes
+ *************************************************************************/
+#include "cfe_tbl_filedef.h"
+#include "to_tbldefs.h"
+#include "msg_ids.h"
+
+/**
+ ** \brief The cFE TO config table definition.
+ **
+ ** Content format: ObjName[64], TblName[38], Desc[32], TgtFileName[20], ObjSize
+ ** ObjName - variable name of config table, e.g., TO_ConfigDefTbl[]
+ ** TblName - app's table name, e.g., TO.CONFIG_TBL, where TO is the same app name
+ ** used in cfe_es_startup.scr, and TO_defConfigTbl is the same table
+ ** name passed in to CFE_TBL_Register()
+ ** Desc - description of table in string format
+ ** TgtFileName[20] - table file name, compiled as .tbl file extension
+ ** ObjSize - size of the entire table
+ **
+ */
+static CFE_TBL_FileDef_t CFE_TBL_FileDef OS_USED =
+{
+ "TO_ConfigTbl", "TO.UDP_CFG", "TO ground dev udp table",
+ "to_udp_cfg.tbl", (sizeof(TO_ChannelTbl_t))
+};
+
+
+/************************************************************************
+ ** Defines
+ *************************************************************************/
+
+#define TO_PQUEUE_SINGLE_PASS_IDX 0
+#define TO_PQUEUE_HIGH_OPS_RSRVD_IDX 1
+#define TO_PQUEUE_SHELL_IDX 2
+#define TO_PQUEUE_EVENTS_IDX 3
+#define TO_PQUEUE_HIGH_IDX 4
+#define TO_PQUEUE_HK_IDX 5
+
+/**
+ ** \brief Default TO config table data
+ */
+TO_ChannelTbl_t TO_ConfigTbl =
+{
+ /* Table ID */
+ 1,
+ {
+ /* Message Flows */
+ {CFE_ES_APP_TLM_MID, 1, TO_PQUEUE_HK_IDX},
+ {CFE_ES_HK_TLM_MID, 1, TO_PQUEUE_HK_IDX},
+ {CFE_ES_MEMSTATS_TLM_MID, 1, TO_PQUEUE_HK_IDX},
+ {CFE_ES_SHELL_TLM_MID, 32, TO_PQUEUE_SHELL_IDX},
+ {CFE_EVS_EVENT_MSG_MID, 32, TO_PQUEUE_EVENTS_IDX},
+ {CFE_EVS_HK_TLM_MID, 1, TO_PQUEUE_HK_IDX},
+ {CFE_SB_HK_TLM_MID, 1, TO_PQUEUE_HK_IDX},
+ {CFE_SB_STATS_TLM_MID, 1, TO_PQUEUE_HK_IDX},
+ {CFE_TBL_HK_TLM_MID, 1, TO_PQUEUE_HK_IDX},
+ {CFE_TBL_REG_TLM_MID, 1, TO_PQUEUE_HK_IDX},
+ {CFE_TIME_HK_TLM_MID, 1, TO_PQUEUE_HK_IDX},
+ {CFE_TIME_DIAG_TLM_MID, 1, TO_PQUEUE_HK_IDX},
+ {CI_HK_TLM_MID, 1, TO_PQUEUE_HK_IDX},
+ {SCH_DIAG_TLM_MID, 1, TO_PQUEUE_HK_IDX},
+ {SCH_HK_TLM_MID, 1, TO_PQUEUE_HK_IDX},
+ {TO_DIAG_MSG_FLOW_MID, 1, TO_PQUEUE_HK_IDX},
+ {TO_DIAG_TLM_MID, 1, TO_PQUEUE_HK_IDX},
+ {TO_HK_TLM_MID, 1, TO_PQUEUE_HK_IDX},
+ {MFA_HK_TLM_MID, 5, TO_PQUEUE_HK_IDX}
+ },{
+ /* Priority Queues */
+ /* TO_PQUEUE_SINGLE_PASS_IDX */
+ {TO_PQUEUE_ENA, 20, TO_PRIORITY_QUEUE_TYPE_SINGLE},
+ /* TO_PQUEUE_HIGH_OPS_RSRVD_IDX */
+ {TO_PQUEUE_ENA, 20, TO_PRIORITY_QUEUE_TYPE_FIFO},
+ /* TO_PQUEUE_SHELL_IDX */
+ {TO_PQUEUE_ENA, 64, TO_PRIORITY_QUEUE_TYPE_FIFO},
+ /* TO_PQUEUE_EVENTS_IDX */
+ {TO_PQUEUE_ENA, 32, TO_PRIORITY_QUEUE_TYPE_FIFO},
+ /* TO_PQUEUE_HIGH_IDX */
+ {TO_PQUEUE_ENA, 32, TO_PRIORITY_QUEUE_TYPE_FIFO},
+ /* TO_PQUEUE_HK_IDX */
+ {TO_PQUEUE_ENA, 50, TO_PRIORITY_QUEUE_TYPE_FIFO}
+ }
+};
+
+
+/************************/
+/* End of File Comment */
+/************************/
diff --git a/config/training/target/apps/to/to_custom.c b/config/training/target/apps/to/to_custom.c
new file mode 100644
index 000000000..a12c2d169
--- /dev/null
+++ b/config/training/target/apps/to/to_custom.c
@@ -0,0 +1,471 @@
+/****************************************************************************
+*
+* Copyright (c) 2017 Windhover Labs, L.L.C. All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following conditions
+* are met:
+*
+* 1. Redistributions of source code must retain the above copyright
+* notice, this list of conditions and the following disclaimer.
+* 2. Redistributions in binary form must reproduce the above copyright
+* notice, this list of conditions and the following disclaimer in
+* the documentation and/or other materials provided with the
+* distribution.
+* 3. Neither the name Windhover Labs nor the names of its
+* contributors may be used to endorse or promote products derived
+* from this software without specific prior written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+* POSSIBILITY OF SUCH DAMAGE.
+*
+*****************************************************************************/
+
+/************************************************************************
+** Pragmas
+*************************************************************************/
+
+/************************************************************************
+** Includes
+*************************************************************************/
+
+#include "to_custom_udp.h"
+#include "to_platform_cfg.h"
+#include
+#include
+#include "to_events.h"
+#include
+#include
+#include
+
+/************************************************************************
+** Local Defines
+*************************************************************************/
+#define TO_CUSTOM_CHANNEL_GET_TIMEOUT (500) /* msec */
+
+
+/************************************************************************
+** Local Function Definitions
+*************************************************************************/
+
+
+
+TO_AppCustomData_t TO_AppCustomData;
+
+TO_EnableChannelCmd_t TO_EnableChannelCmd_S;
+TO_DisableChannelCmd_t TO_DisableChannelCmd_S;
+
+extern TO_ChannelTbl_t TO_BackupConfigTbl;
+
+
+
+uint8 TO_OutputChannel_Status(uint32 index)
+{
+ return TO_AppCustomData.Channel[index].Mode;
+}
+
+
+
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+/* */
+/* Custom Initialize All. Nothing to do here. */
+/* */
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+int32 TO_Custom_Init(void)
+{
+ int32 iStatus = 0;
+ uint32 i = 0;
+
+ /*
+ * UDP development interface
+ */
+ TO_AppCustomData.Channel[0].Mode = TO_CHANNEL_ENABLED;
+ strncpy(TO_AppCustomData.Channel[0].IP, TO_UDP_CHANNEL_ADDRESS, INET_ADDRSTRLEN);
+ TO_AppCustomData.Channel[0].DstPort = TO_UDP_CHANNEL_PORT;
+ TO_AppCustomData.Channel[0].Priority = TO_CHANNEL_TASK_PRIORITY;
+ TO_AppCustomData.Channel[0].Socket = 0;
+ TO_AppCustomData.Channel[0].ChildTaskID = 0;
+
+ /* Ground dev interface is optional */
+ iStatus = TO_Channel_OpenChannel(
+ 0,
+ TO_UDP_CHANNEL_NAME,
+ TO_UDP_CONFIG_TABLENAME,
+ TO_UDP_CONFIG_TABLE_FILENAME,
+ &TO_BackupConfigTbl,
+ TO_UDP_DUMP_TABLENAME,
+ 1,
+ TO_UDP_CF_THROTTLE_SEM_NAME);
+
+ for (i=0; i < TO_MAX_CHANNELS; i++)
+ {
+ if(TO_OutputChannel_Status(i) == TO_CHANNEL_ENABLED)
+ {
+ if(TO_OutputChannel_Enable(i, TO_AppCustomData.Channel[i].IP, TO_AppCustomData.Channel[i].DstPort))
+ {
+ TO_AppCustomData.Channel[i].Mode = TO_CHANNEL_DISABLED;
+ }
+ else
+ {
+ CFE_EVS_SendEvent(TO_TLMOUTENA_INF_EID, CFE_EVS_INFORMATION,
+ "UDP telemetry output enabled channel %u to %s:%u",
+ (unsigned int)i, TO_AppCustomData.Channel[i].IP,
+ (unsigned int)TO_AppCustomData.Channel[i].DstPort);
+ }
+ }
+ }
+
+end_of_function:
+ return iStatus;
+}
+
+
+
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+/* */
+/* Custom Send. Send the message out the socket. */
+/* */
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+int32 TO_OutputChannel_Send(uint32 ChannelID, const char* Buffer, uint32 Size)
+{
+ struct sockaddr_in s_addr;
+ int status = 0;
+ int32 returnCode = 0;
+
+ bzero((char *) &s_addr, sizeof(s_addr));
+ s_addr.sin_family = AF_INET;
+
+ if((Size > 0) && (ChannelID < TO_MAX_CHANNELS))
+ {
+ TO_TlmChannel_t *channel = &TO_AppCustomData.Channel[ChannelID];
+
+ if(channel->Mode == TO_CHANNEL_ENABLED)
+ {
+ CFE_ES_PerfLogEntry(TO_SOCKET_SEND_PERF_ID);
+ /* Send message via UDP socket */
+ s_addr.sin_addr.s_addr = inet_addr(channel->IP);
+ s_addr.sin_port = htons(channel->DstPort);
+ status = sendto(channel->Socket, (char *)Buffer, Size, 0,
+ (struct sockaddr *) &s_addr,
+ sizeof(s_addr));
+ if (status < 0)
+ {
+ CFE_EVS_SendEvent(TO_TLMOUTSTOP_ERR_EID,CFE_EVS_ERROR,
+ "L%d TO sendto errno %d.", __LINE__, errno);
+ channel->Mode = TO_CHANNEL_DISABLED;
+ returnCode = -1;
+ }
+
+ CFE_ES_PerfLogExit(TO_SOCKET_SEND_PERF_ID);
+ }
+ }
+
+ return returnCode;
+}
+
+
+
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+/* */
+/* Custom Cleanup All. Disable all the enable channels so we */
+/* don't try sending messages when the sealed framework is torn */
+/* down. */
+/* */
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+void TO_OutputChannel_CustomCleanupAll(void)
+{
+ uint32 i = 0;
+
+ for (i=0; i < TO_MAX_CHANNELS; i++)
+ {
+ if(TO_OutputChannel_Status(i) == TO_CHANNEL_ENABLED)
+ {
+ TO_OutputChannel_Disable(i);
+ }
+ }
+}
+
+
+
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+/* */
+/* Custom Buildup All. Enable all the 'enabled' channels. If it */
+/* fails, disable it. */
+/* */
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+int32 TO_OutputChannel_CustomBuildupAll(uint32 index)
+{
+ return 0;
+}
+
+
+
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+/* */
+/* Custom Teardown All. Nothing to do here. */
+/* */
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+int32 TO_OutputChannel_CustomTeardown(uint32 index)
+{
+ return 0;
+}
+
+
+
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+/* */
+/* Process New Custom Commands. Raise an error event if the */
+/* command is unknown. */
+/* */
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+void TO_OutputChannel_ProcessNewCustomCmds(CFE_SB_Msg_t* MsgPtr)
+{
+ uint32 uiCmdCode=0;
+
+ if (MsgPtr != NULL)
+ {
+ uint16 inSize = CFE_SB_GetTotalMsgLength(MsgPtr);
+ uiCmdCode = CFE_SB_GetCmdCode(MsgPtr);
+
+ OS_MutSemTake(TO_AppData.MutexID);
+ switch (uiCmdCode)
+ {
+ case TO_ENABLE_CHANNEL_CC:
+ {
+ TO_EnableChannelCmd_t *cmd = (TO_EnableChannelCmd_t*) MsgPtr;
+ /* Validate arguments. */
+ if(inSize != sizeof(TO_EnableChannelCmd_t))
+ {
+ TO_AppData.HkTlm.CmdErrCnt++;
+ (void) CFE_EVS_SendEvent(TO_MSG_LEN_ERR_EID, CFE_EVS_ERROR,
+ "Invalid message length. Received %u. Expected %u.",
+ (unsigned int)inSize, sizeof(TO_EnableChannelCmd_t));
+ break;
+ }
+
+ if(TO_OutputChannel_Enable(cmd->ChannelID, cmd->DestinationAddress, cmd->DestinationPort))
+ {
+ TO_AppData.HkTlm.CmdErrCnt++;
+ break;
+ }
+
+ TO_AppData.HkTlm.CmdCnt++;
+ (void) CFE_EVS_SendEvent(TO_TLMOUTENA_INF_EID, CFE_EVS_INFORMATION,
+ "Enabled channel %u to %s:%u.",
+ cmd->ChannelID,
+ cmd->DestinationAddress,
+ cmd->DestinationPort);
+ break;
+ }
+
+ case TO_DISABLE_CHANNEL_CC:
+ {
+ TO_DisableChannelCmd_t *cmd = (TO_DisableChannelCmd_t*) MsgPtr;
+ /* Validate arguments. */
+ if(inSize != sizeof(TO_DisableChannelCmd_t))
+ {
+ TO_AppData.HkTlm.CmdErrCnt++;
+ (void) CFE_EVS_SendEvent(TO_MSG_LEN_ERR_EID, CFE_EVS_ERROR,
+ "Invalid message length. Received %u. Expected %u.",
+ (unsigned int)inSize, sizeof(TO_DisableChannelCmd_t));
+ break;
+ }
+
+ if(TO_OutputChannel_Disable(cmd->ChannelID))
+ {
+ TO_AppData.HkTlm.CmdErrCnt++;
+ break;
+ }
+
+ TO_AppData.HkTlm.CmdCnt++;
+ break;
+ }
+
+ default:
+ TO_AppData.HkTlm.CmdErrCnt++;
+ (void) CFE_EVS_SendEvent(TO_CC_ERR_EID, CFE_EVS_ERROR,
+ "Recvd invalid cmdId (%u)", (unsigned int)uiCmdCode);
+ break;
+ }
+ OS_MutSemGive(TO_AppData.MutexID);
+ }
+}
+
+
+
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+/* */
+/* Enable Channel. This will bind the socket for transmission. */
+/* */
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+int32 TO_OutputChannel_Enable(uint32 ChannelID, const char *DestinationAddress, uint16 DestinationPort)
+{
+ int32 returnCode = 0;
+ uint32 i = 0;
+ struct sockaddr_in servaddr;
+ int status;
+ int reuseaddr=1;
+
+ if(DestinationAddress == 0)
+ {
+ CFE_EVS_SendEvent(TO_TLMOUTENA_ERR_EID, CFE_EVS_ERROR,
+ "Destination address for channel %u is null.", (unsigned int)i);
+ returnCode = -1;
+ goto end_of_function;
+ }
+
+ if(ChannelID >= TO_MAX_CHANNELS)
+ {
+ CFE_EVS_SendEvent(TO_TLMOUTENA_ERR_EID, CFE_EVS_ERROR,
+ "ChannelID (%u) invalid.", (unsigned int)ChannelID);
+ returnCode = -1;
+ goto end_of_function;
+ }
+
+ if((TO_AppCustomData.Channel[ChannelID].Socket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0)
+ {
+ TO_AppCustomData.Channel[ChannelID].Mode = TO_CHANNEL_DISABLED;
+ CFE_EVS_SendEvent(TO_TLMOUTSOCKET_ERR_EID, CFE_EVS_ERROR,
+ "TLM socket errno: %i on channel %u", errno, (unsigned int)ChannelID);
+ returnCode = -1;
+ goto end_of_function;
+ }
+
+ /* Set the Reuse Address flag. If we don't set this flag, the socket will
+ * lock the port on termination and the kernel won't unlock it until it
+ * times out after a minute or so.
+ */
+ setsockopt(TO_AppCustomData.Channel[i].Socket, SOL_SOCKET, SO_REUSEADDR, &reuseaddr, sizeof(reuseaddr));
+ strncpy(TO_AppCustomData.Channel[ChannelID].IP, DestinationAddress, sizeof(TO_AppCustomData.Channel[ChannelID].IP));
+ TO_AppCustomData.Channel[ChannelID].DstPort = DestinationPort;
+
+ /* Set the input arguments to the socket bind.
+ */
+ bzero((void*)&servaddr,sizeof(servaddr));
+ servaddr.sin_family = AF_INET;
+ servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
+ servaddr.sin_port=0;
+ status = bind(TO_AppCustomData.Channel[ChannelID].Socket,
+ (struct sockaddr *)&servaddr,sizeof(servaddr));
+ if(status < 0)
+ {
+ CFE_EVS_SendEvent(TO_TLMOUTSOCKET_ERR_EID, CFE_EVS_ERROR,
+ "TLM bind errno: %i on channel %u", errno, (unsigned int)i);
+ TO_AppCustomData.Channel[ChannelID].Mode = TO_CHANNEL_DISABLED;
+ returnCode = -1;
+ goto end_of_function;
+ }
+
+ /* Enable the channel for transmission. */
+ TO_AppCustomData.Channel[ChannelID].Mode = TO_CHANNEL_ENABLED;
+
+end_of_function:
+ return returnCode;
+}
+
+
+
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+/* */
+/* Disable channel. Close the socket. */
+/* */
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+int32 TO_OutputChannel_Disable(uint32 ChannelID)
+{
+ int32 returnCode = 0;
+ uint32 i = 0;
+
+ if(TO_AppCustomData.Channel[ChannelID].Mode != TO_CHANNEL_ENABLED)
+ {
+ CFE_EVS_SendEvent(TO_TLMOUTDIS_ERR_EID, CFE_EVS_ERROR,
+ "UDP telemetry for channel %u is not enabled.", (unsigned int)i);
+ returnCode = -1;
+ goto end_of_function;
+ }
+
+ /* Disable the channel before we close the socket so if the handler
+ * task is in the loop it will know the reason why the send
+ * function failed is because the channel is disabled.
+ */
+ TO_AppCustomData.Channel[ChannelID].Mode = TO_CHANNEL_DISABLED;
+ close(TO_AppCustomData.Channel[ChannelID].Socket);
+ TO_AppCustomData.Channel[ChannelID].Socket = 0;
+
+ CFE_EVS_SendEvent(TO_TLMOUTDIS_INF_EID, CFE_EVS_INFORMATION,
+ "Disabled channel %u.",
+ (unsigned int)ChannelID);
+
+end_of_function:
+ return returnCode;
+}
+
+
+
+int32 TO_Custom_InitEvent(int32 *ind)
+{
+ return 0;
+}
+
+
+void TO_PrintCustomVersion(void)
+{
+
+}
+
+
+void TO_OutputChannel_SendTelemetry(uint32 index)
+{
+ int32 iStatus = CFE_SUCCESS;
+ CFE_SB_MsgPtr_t msg;
+ osalbool cont = TRUE;
+
+ while(cont)
+ {
+ if(TO_Channel_State(index) == TO_CHANNEL_OPENED)
+ {
+ iStatus = TO_OutputQueue_GetMsg(&TO_AppData.ChannelData[index], &msg, OS_CHECK );
+ if(iStatus == OS_SUCCESS)
+ {
+ uint32 size = CFE_SB_GetTotalMsgLength(msg);
+ int32 sendResult = TO_OutputChannel_Send(index, (const char*)msg, size);
+ if (sendResult != 0)
+ {
+ TO_OutputChannel_Disable(index);
+ cont = FALSE;
+ }
+ else
+ {
+ TO_Channel_LockByIndex(index);
+ TO_AppData.ChannelData[index].OutputQueue.SentCount++;
+ TO_AppData.ChannelData[index].OutputQueue.SentBytes += size;
+ TO_Channel_UnlockByIndex(index);
+ }
+ }
+ else if(iStatus == OS_QUEUE_EMPTY)
+ {
+ cont = FALSE;
+ }
+ else
+ {
+ CFE_EVS_SendEvent(TO_OSQUEUE_GET_ERROR_EID, CFE_EVS_ERROR,
+ "Listener failed to pop message from queue. (%i).", (int)iStatus);
+ TO_Channel_LockByIndex(index);
+ TO_AppData.ChannelData[index].State = TO_CHANNEL_CLOSED;
+ TO_Channel_UnlockByIndex(index);
+ cont = FALSE;
+ }
+ }
+ }
+ cont = FALSE;
+}
+
diff --git a/config/training/target/apps/to/to_custom_udp.h b/config/training/target/apps/to/to_custom_udp.h
new file mode 100644
index 000000000..5eb7c0da3
--- /dev/null
+++ b/config/training/target/apps/to/to_custom_udp.h
@@ -0,0 +1,150 @@
+/****************************************************************************
+*
+* Copyright (c) 2017 Windhover Labs, L.L.C. All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following conditions
+* are met:
+*
+* 1. Redistributions of source code must retain the above copyright
+* notice, this list of conditions and the following disclaimer.
+* 2. Redistributions in binary form must reproduce the above copyright
+* notice, this list of conditions and the following disclaimer in
+* the documentation and/or other materials provided with the
+* distribution.
+* 3. Neither the name Windhover Labs nor the names of its
+* contributors may be used to endorse or promote products derived
+* from this software without specific prior written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+* POSSIBILITY OF SUCH DAMAGE.
+*
+*****************************************************************************/
+
+#ifndef TO_CUSTOM_UDP_H
+#define TO_CUSTOM_UDP_H
+
+/************************************************************************
+** Includes
+*************************************************************************/
+#include "to_app.h"
+#include "to_custom.h"
+#include
+
+/************************************************************************
+** Local Defines
+*************************************************************************/
+#define TO_CUSTOM_RETURN_CODE_NULL_POINTER (-1)
+#define TO_CUSTOM_RETURN_CODE_MESSAGE_TOO_BIG (-2)
+
+
+
+/* TODO: Add Doxygen markup. */
+#define TO_ENABLE_CHANNEL_CC (10)
+#define TO_DISABLE_CHANNEL_CC (11)
+
+/************************************************************************
+** Local Structure Declarations
+*************************************************************************/
+typedef struct
+{
+ uint8 ucCmdHeader[CFE_SB_CMD_HDR_SIZE];
+ uint8 ChannelID;
+ char DestinationAddress[INET_ADDRSTRLEN];
+ uint16 DestinationPort;
+} TO_EnableChannelCmd_t;
+
+typedef struct
+{
+ uint8 ucCmdHeader[CFE_SB_CMD_HDR_SIZE];
+ uint8 ChannelID;
+} TO_DisableChannelCmd_t;
+
+typedef enum {
+ /* TODO: Add Doxygen markup. */
+ TO_TLMOUTSOCKET_ERR_EID = TO_EVT_CNT,
+ TO_TLMOUTENA_INF_EID,
+ TO_TLMOUTENA_ERR_EID,
+ TO_TLMOUTDIS_INF_EID,
+ TO_TLMOUTDIS_ERR_EID,
+ TO_TLMOUTSEND_ERR_EID,
+ TO_TLMOUTSTOP_ERR_EID,
+ TO_CUSTOM_EVT_CNT
+} TO_CustomEventIds_t;
+
+typedef enum
+{
+ TO_CHANNEL_UNUSED = 0,
+ TO_CHANNEL_DISABLED = 1,
+ TO_CHANNEL_ENABLED = 2
+} TO_TLM_ChannelMode_t;
+
+typedef struct
+{
+ TO_TLM_ChannelMode_t Mode;
+ char IP[INET_ADDRSTRLEN];
+ uint16 DstPort;
+ uint8 Priority;
+ int Socket;
+ uint32 ChildTaskID;
+ uint32 TaskFlags;
+} TO_TlmChannel_t;
+
+typedef struct
+{
+ TO_TlmChannel_t Channel[TO_MAX_CHANNELS];
+// uint8 idleBuff[TO_CUSTOM_TF_IDLE_SIZE];
+// TM_SDLP_FrameInfo_t frameInfo;
+// TM_SDLP_ChannelConfig_t vcConfig;
+// uint8 buffer[TO_CUSTOM_TF_SIZE + TM_SYNC_ASM_SIZE];
+// uint8 ocfBuff[4];
+// uint8 ofBuff[TO_CUSTOM_TF_OVERFLOW_SIZE];
+// TM_SDLP_GlobalConfig_t mcConfig;
+// uint8 mcFrameCnt;
+} TO_AppCustomData_t;
+
+/************************************************************************
+** External Global Variables
+*************************************************************************/
+
+extern TO_AppData_t TO_AppData;
+
+/************************************************************************
+** Local Function Definitions
+*************************************************************************/
+
+/**
+ * The routine to send a buffer out the channel. This routine
+ * abstracts the formatting and output of different channels.
+ */
+int32 TO_OutputChannel_Send(uint32 ChannelID, const char* Buffer, uint32 Size);
+
+int32 TO_OutputChannel_Enable(uint32 ChannelID, const char *DestinationAddress, uint16 DestinationPort);
+int32 TO_OutputChannel_Disable(uint32 ChannelID);
+
+/**
+ * The UDP Development Channel Task Entry Point
+ */
+void TO_OutputChannel_UDPChannelTask(void);
+
+/**
+ * The child task routine for a pulling from the output queue and sending
+ * out the channel.
+ */
+void TO_OutputChannel_ChannelHandler(uint32 ChannelIndex);
+
+int32 TO_OutputChannel_CustomBuildupAll(uint32 index);
+int32 TO_OutputChannel_CustomTeardownAll(uint32 index);
+
+
+#endif
diff --git a/config/training/target/cfe_es_startup.scr b/config/training/target/cfe_es_startup.scr
new file mode 100644
index 000000000..be2601b34
--- /dev/null
+++ b/config/training/target/cfe_es_startup.scr
@@ -0,0 +1,28 @@
+CFE_APP, /cf/apps/SCH.so, SCH_AppMain, SCH, 10, 40960, 0x0, 0, 0;
+CFE_APP, /cf/apps/TO.so, TO_AppMain, TO, 13, 40960, 0x0, 0, 0;
+CFE_APP, /cf/apps/CI.so, CI_AppMain, CI, 16, 40960, 0x0, 0, 0;
+CFE_APP, /cf/apps/MFA.so, MFA_AppMain, MFA, 100, 32000, 0x0, 0, 0;
+!
+! Startup script fields:
+! 1. Object Type -- CFE_APP for an Application, or CFE_LIB for a library.
+! 2. Path/Filename -- This is a cFE Virtual filename, not a vxWorks device/pathname
+! 3. Entry Point -- This is the "main" function for Apps.
+! 4. CFE Name -- The cFE name for the the APP or Library
+! 5. Priority -- This is the Priority of the App, not used for Library
+! 6. Stack Size -- This is the Stack size for the App, not used for the Library
+! 7. Load Address -- This is the Optional Load Address for the App or Library. Currently not implemented
+! so keep it at 0x0.
+! 8. Exception Action -- This is the Action the cFE should take if the App has an exception.
+! 0 = Just restart the Application
+! Non-Zero = Do a cFE Processor Reset
+!
+! Other Notes:
+! 1. The software will not try to parse anything after the first '!' character it sees. That
+! is the End of File marker.
+! 2. Common Application file extensions:
+! Linux = .so ( ci.so )
+! OS X = .bundle ( ci.bundle )
+! Cygwin = .dll ( ci.dll )
+! vxWorks = .o ( ci.o )
+! RTEMS with S-record Loader = .s3r ( ci.s3r )
+! RTEMS with CEXP Loader = .o ( ci.o )
diff --git a/config/training/target/gdbinit b/config/training/target/gdbinit
new file mode 100644
index 000000000..61b6b41a0
--- /dev/null
+++ b/config/training/target/gdbinit
@@ -0,0 +1 @@
+handle SIG63 noprint nostop
\ No newline at end of file
diff --git a/config/training/term.cfg b/config/training/term.cfg
new file mode 100644
index 000000000..2e03f54bb
--- /dev/null
+++ b/config/training/term.cfg
@@ -0,0 +1,58 @@
+[global_config]
+[keybindings]
+[layouts]
+ [[default]]
+ [[[child0]]]
+ fullscreen = False
+ last_active_term = 352c398a-f380-4606-9105-8748e73b038b
+ last_active_window = True
+ maximised = True
+ order = 0
+ parent = ""
+ position = 67:27
+ size = 1213, 745
+ title = mbenson@mbenson-Predator-PH717-71: ~/git/squeaky-weasel/software/airliner/public/build/training
+ type = Window
+ [[[child1]]]
+ order = 0
+ parent = child0
+ position = 370
+ ratio = 0.5
+ type = VPaned
+ [[[child3]]]
+ order = 1
+ parent = child1
+ position = 604
+ ratio = 0.5
+ type = HPaned
+ [[[terminal2]]]
+ command = sudo ./airliner
+ directory = target/target/exe
+ order = 0
+ parent = child1
+ profile = default
+ title = FSW
+ type = Terminal
+ uuid = 352c398a-f380-4606-9105-8748e73b038b
+ [[[terminal4]]]
+ command = bin/yamcs-start /opt/yamcs .
+ directory = commander_workspace
+ order = 0
+ parent = child3
+ profile = default
+ title = YAMCS
+ type = Terminal
+ uuid = 758db546-cb57-4042-a8ea-8ad3b28c2d24
+ [[[terminal5]]]
+ command = bin/phoebus-start
+ directory = commander_workspace
+ order = 1
+ parent = child3
+ profile = default
+ title = Phoebus
+ type = Terminal
+ uuid = e7117eb9-166e-487c-a7be-3193826f23b9
+[plugins]
+[profiles]
+ [[default]]
+ cursor_color = "#aaaaaa"
diff --git a/config/training/wh_config.yaml b/config/training/wh_config.yaml
new file mode 100644
index 000000000..f1a05130c
--- /dev/null
+++ b/config/training/wh_config.yaml
@@ -0,0 +1,264 @@
+---
+config_base: ${PROJECT_SOURCE_DIR}
+cpu_id: training
+commander:
+ server_overlay: ${PROJECT_SOURCE_DIR}/config/training/server_overlay
+modules:
+ core:
+ modules:
+ cfe:
+ modules:
+ cfe_es:
+ telemetry:
+ CFE_ES_HK_TLM_MID:
+ msgID: 0x080f # TLM_MSG( 15 )
+ CFE_ES_APP_TLM_MID:
+ msgID: 0x0817 # TLM_MSG( 23 )
+ CFE_ES_MEMSTATS_TLM_MID:
+ msgID: 0x081c # TLM_MSG( 28 )
+ CFE_ES_SHELL_TLM_MID:
+ msgID: 0x081b # TLM_MSG( 27 )
+ commands:
+ CFE_ES_CMD_MID:
+ msgID: 0x1804 # CMD_MSG( 4 )
+ CFE_ES_SEND_HK_MID:
+ msgID: 0x1805 # CMD_MSG( 5 )
+ cfe_evs:
+ telemetry:
+ CFE_EVS_HK_TLM_MID:
+ msgID: 0x0810 # TLM_MSG( 16 )
+ CFE_EVS_EVENT_MSG_MID:
+ msgID: 0x0815 # TLM_MSG( 21 )
+ commands:
+ CFE_EVS_CMD_MID:
+ msgID: 0x1800 # CMD_MSG( 0 )
+ CFE_EVS_SEND_HK_MID:
+ msgID: 0x1806 # CMD_MSG( 6 )
+ cfe_sb:
+ telemetry:
+ CFE_SB_HK_TLM_MID:
+ msgID: 0x0811 # TLM_MSG( 17 )
+ CFE_SB_STATS_TLM_MID:
+ msgID: 0x0816 # TLM_MSG( 22 )
+ CFE_SB_ALLSUBS_TLM_MID:
+ msgID: 0x0819 # TLM_MSG( 25 )
+ CFE_SB_ONESUB_TLM_MID:
+ msgID: 0x081a # TLM_MSG( 26 )
+ commands:
+ CFE_SB_CMD_MID:
+ msgID: 0x1801 # CMD_MSG( 1 )
+ CFE_SB_SEND_HK_MID:
+ msgID: 0x1807 # CMD_MSG( 6 )
+ cfe_tbl:
+ telemetry:
+ CFE_TBL_HK_TLM_MID:
+ msgID: 0x0812 # TLM_MSG( 18 )
+ CFE_TBL_REG_TLM_MID:
+ msgID: 0x0818 # TLM_MSG( 24 )
+ commands:
+ CFE_TBL_CMD_MID:
+ msgID: 0x1802 # CMD_MSG( 2 )
+ CFE_TBL_SEND_HK_MID:
+ msgID: 0x1808 # CMD_MSG( 8 )
+ cfe_time:
+ telemetry:
+ CFE_TIME_DIAG_TLM_MID:
+ msgID: 0x0814 # TLM_MSG( 20 )
+ CFE_TIME_HK_TLM_MID:
+ msgID: 0x0813 # TLM_MSG( 19 )
+ commands:
+ CFE_TIME_CMD_MID:
+ msgID: 0x1803 # CMD_MSG( 3 )
+ CFE_TIME_SEND_HK_MID:
+ msgID: 0x1809 # CMD_MSG( 9 )
+ CFE_TIME_DATA_CMD_MID:
+ msgID: 0x180c # CMD_MSG( 12 )
+ CFE_TIME_TONE_CMD_MID:
+ msgID: 0x180a # CMD_MSG( 10 )
+ CFE_TIME_FAKE_CMD_MID:
+ msgID: 0x180d # CMD_MSG( 13 )
+ CFE_TIME_1HZ_CMD_MID:
+ msgID: 0x180b # CMD_MSG( 11 )
+ CFE_TIME_SEND_CMD_MID:
+ msgID: 0x180e # CMD_MSG( 14 )
+
+ apps:
+ modules:
+ sch:
+ definition: ${PROJECT_SOURCE_DIR}/apps/sch/wh_design.yaml
+ telemetry:
+ SCH_ACTIVITY_DONE_MID:
+ msgID: 0x0863 # TLM_MSG( 99 )
+ SCH_DIAG_TLM_MID:
+ msgID: 0x0864 # TLM_MSG( 100 )
+ SCH_HK_TLM_MID:
+ msgID: 0x0865 # TLM_MSG( 101 )
+ commands:
+ SCH_CMD_MID:
+ msgID: 0x1866 # CMD_MSG( 102 )
+ SCH_SEND_HK_MID:
+ msgID: 0x1867 # CMD_MSG( 103 )
+ perfids:
+ SCH_APPMAIN_PERF_ID:
+ id: 60
+
+ to:
+ definition: ${PROJECT_SOURCE_DIR}/apps/to/wh_design.yaml
+ commander:
+ displays: cdr
+ templates:
+ _ADD_MESSAGE_FLOW:
+ template: "../../config/obc/cdr/TO_AddMessageFlow.j2"
+ output: "TO_AddMessageFlow.bob"
+ scope: GLOBAL
+ _QUERY_MESSAGE_FLOW:
+ template: "cdr/resources/templates/TO_QueryMessageFlow.j2"
+ output: "TO_QueryMessageFlow.bob"
+ scope: GLOBAL
+ _REMOVE_MESSAGE_FLOW:
+ template: "../../config/obc/cdr/TO_RemoveMessageFlow.j2"
+ output: "TO_RemoveMessageFlow.bob"
+ scope: GLOBAL
+ _TLM_MANAGEMENT_FLOW:
+ template: "cdr/resources/templates/TO_TlmManagement.j2"
+ output: "TO_TlmManagement.bob"
+ scope: GLOBAL
+ telemetry:
+ TO_DIAG_MSG_FLOW_MID:
+ msgID: 0x0869 # TLM_MSG( 105 )
+ TO_DIAG_TLM_MID:
+ msgID: 0x086a # TLM_MSG( 106 )
+ TO_HK_TLM_MID:
+ msgID: 0x086b # TLM_MSG( 107 )
+ commands:
+ TO_CMD_MID:
+ msgID: 0x186c # CMD_MSG( 108 )
+ #commands:
+ # EnableChannel:
+ # cc: 10
+ # struct: TO_EnableChannelCmd_t
+ # DisableChannel:
+ # cc: 11
+ # struct: TO_DisableChannelCmd_t
+ TO_SEND_HK_MID:
+ msgID: 0x186d # CMD_MSG( 109 )
+ TO_SEND_TLM_MID:
+ msgID: 0x186e # CMD_MSG( 110 )
+ tables:
+ _TO_CONFIG:
+ channel:
+ - name: "ground"
+ instance:
+ - name: "default"
+ output: "to_config.c"
+ id: 1
+ is_backup: false
+ priority_queue:
+ - name: "CPD_SINGLE_PASS"
+ type: "SINGLE"
+ depth: 20
+ - name: "PPD_SINGLE_PASS"
+ type: "SINGLE"
+ depth: 20
+ - name: "CPD_HIGH_OPS_RSRVD"
+ type: "FIFO"
+ depth: 32
+ - name: "PPD_HIGH_OPS_RSRVD"
+ type: "FIFO"
+ depth: 32
+ - name: "CPD_HIGH"
+ type: "FIFO"
+ depth: 64
+ - name: "CPD_EVENTS"
+ type: "FIFO"
+ depth: 50
+ - name: "CPD_CFDP"
+ type: "FIFO"
+ depth: 64
+ - name: "CPD_SHELL"
+ type: "FIFO"
+ depth: 40
+ - name: "CPD_HK"
+ type: "FIFO"
+ depth: 20
+ - name: "PPD_HIGH"
+ type: "FIFO"
+ depth: 20
+ - name: "PPD_EVENTS"
+ type: "FIFO"
+ depth: 32
+ - name: "PPD_CFDP"
+ type: "FIFO"
+ depth: 32
+ - name: "PPD_SHELL"
+ type: "FIFO"
+ depth: 64
+ - name: "PPD_HK"
+ type: "FIFO"
+ depth: 50
+ - name: "CPD_PX4LOW"
+ type: "FIFO"
+ depth: 64
+ - name: "PPD_PX4LOW"
+ type: "FIFO"
+ depth: 40
+ message_flow:
+ - msg: "AMC_HK_TLM_MID"
+ depth: 1
+ pqueue: "CPD_HK"
+ - msg: "BAT_HK_TLM_MID"
+ depth: 1
+ pqueue: "CPD_HK"
+ - msg: "CF_CONFIG_TLM_MID"
+ depth: 1
+ pqueue: "CPD_HK"
+ - msg: "CF_HK_TLM_MID"
+ depth: 1
+ pqueue: "CPD_HK"
+ - msg: "CF_SPACE_TO_GND_PDU_MID"
+ depth: 32
+ pqueue: "CPD_CFDP"
+ - msg: "CF_TRANS_TLM_MID"
+ depth: 1
+ pqueue: "CPD_HK"
+ - msg: "CFE_ES_APP_TLM_MID"
+ depth: 1
+ pqueue: "CPD_HK"
+
+ ci:
+ definition: ${PROJECT_SOURCE_DIR}/apps/ci/wh_design.yaml
+ telemetry:
+ CI_HK_TLM_MID:
+ msgID: 0x0827 # TLM_MSG( 39 )
+ commands:
+ CI_CMD_MID:
+ msgID: 0x1828 # CMD_MSG( 40 )
+ CI_INGEST_COMMANDS_MID:
+ msgID: 0x1829 # CMD_MSG( 41 )
+ CI_PROCESS_TIMEOUTS_MID:
+ msgID: 0x182a # CMD_MSG( 42 )
+ CI_SEND_HK_MID:
+ msgID: 0x182b # CMD_MSG( 43 )
+ CI_WAKEUP_MID:
+ msgID: 0x182c # CMD_MSG( 44 )
+ perfids:
+ CF_APPMAIN_PERF_ID:
+ id: 33
+ CI_MAIN_TASK_PERF_ID:
+ id: 34
+ CI_SOCKET_RCV_PERF_ID:
+ id: 35
+ mfa:
+ definition: ${PROJECT_SOURCE_DIR}/apps/mfa/wh_design.yaml
+ telemetry:
+ MFA_HK_TLM_MID:
+ msgID: 0x0850
+ commands:
+ MFA_WAKEUP_MID:
+ msgID: 0x1851
+ MFA_SEND_HK_MID:
+ msgID: 0x1852
+ MFA_CMD_MID:
+ msgID: 0x1853
+
+
diff --git a/core/base/cfe/cdr/cfe_es/Main.bob b/core/base/cfe/cdr/cfe_es/Main.bob
index af7deab8b..95db625d0 100644
--- a/core/base/cfe/cdr/cfe_es/Main.bob
+++ b/core/base/cfe/cdr/cfe_es/Main.bob
@@ -1548,10 +1548,6 @@ Yamcs.issueCommand(widget, '/cfs/$(CPUID)/core/cfe/cfe_es/Restart', {'Payload.Re
-
-
-
-
@@ -1579,10 +1575,6 @@ Yamcs.issueCommand(widget, '/cfs/$(CPUID)/core/cfe/cfe_es/Restart', {'Payload.Re
-
-
-
-
diff --git a/core/base/cfe/cdr/cfe_es/StartApp.bob b/core/base/cfe/cdr/cfe_es/StartApp.bob
index 14ad2782f..c8e422ea9 100644
--- a/core/base/cfe/cdr/cfe_es/StartApp.bob
+++ b/core/base/cfe/cdr/cfe_es/StartApp.bob
@@ -20,7 +20,25 @@
Action Button
-
@@ -273,4 +291,4 @@
-
\ No newline at end of file
+