Quantum Leaps před 12 roky
rodič
revize
0e95d49224
100 změnil soubory, kde provedl 2103 přidání a 8413 odebrání
  1. 1 0
      .gitignore
  2. 1097 243
      doxygen/Doxyfile
  3. binární
      doxygen/images/Fig1.01.jpg
  4. binární
      doxygen/images/Fig1.03.jpg
  5. binární
      doxygen/images/dev_mgr.png
  6. binární
      doxygen/images/game_iar.jpg
  7. binární
      doxygen/images/game_iar.png
  8. binární
      doxygen/images/game_make.png
  9. binární
      doxygen/images/game_mingw.png
  10. binární
      doxygen/images/game_mingw_code.png
  11. binární
      doxygen/images/game_vc2012.jpg
  12. binární
      doxygen/images/game_win.png
  13. binární
      doxygen/images/inst_qm.png
  14. binární
      doxygen/images/inst_qpc.png
  15. binární
      doxygen/images/inst_qtools.png
  16. binární
      doxygen/images/logo_qp_60x55.jpg
  17. binární
      doxygen/images/ql_logo.jpg
  18. binární
      doxygen/images/ql_masthead.jpg
  19. binární
      doxygen/images/qm_game.jpg
  20. binární
      doxygen/images/qm_panels.jpg
  21. binární
      doxygen/images/qp_components.jpg
  22. binární
      doxygen/images/qp_datasheet.gif
  23. binární
      doxygen/images/qpc_iar.png
  24. binární
      doxygen/images/qpc_mingw.png
  25. binární
      doxygen/images/qpc_vc2012.jpg
  26. binární
      doxygen/images/qs_out.png
  27. binární
      doxygen/images/qspy_vc.jpg
  28. binární
      doxygen/images/qspy_vc.png
  29. binární
      doxygen/images/win_env.png
  30. binární
      doxygen/images/win_set.png
  31. 30 0
      doxygen/qp_macros.h
  32. 33 219
      doxygen/qpc.txt
  33. 11 55
      doxygen/qpc_files.txt
  34. 328 726
      doxygen/qpc_rev.txt
  35. 435 2185
      doxygen/qpc_tut.txt
  36. 1 1
      doxygen/snippets/qa_run.c
  37. 0 4
      doxygen/snippets/qep_qevent.c
  38. 5 0
      doxygen/snippets/qep_qevt.c
  39. 5 4
      doxygen/snippets/qep_qfsm.c
  40. 5 1
      doxygen/snippets/qep_qfsm_ctor.c
  41. 8 12
      doxygen/snippets/qep_qfsm_use.c
  42. 2 1
      doxygen/snippets/qep_qhsm.c
  43. 6 1
      doxygen/snippets/qep_qhsm_ctor.c
  44. 8 8
      doxygen/snippets/qep_qhsm_use.c
  45. 4 4
      doxygen/snippets/qep_qinit.c
  46. 9 0
      doxygen/snippets/qep_qmsm.c
  47. 8 0
      doxygen/snippets/qep_qmsm_ctor.c
  48. 19 0
      doxygen/snippets/qep_qmsm_use.c
  49. 2 2
      doxygen/snippets/qep_qtran.c
  50. 3 3
      doxygen/snippets/qf_ctor.c
  51. 14 19
      doxygen/snippets/qf_main.c
  52. 3 4
      doxygen/snippets/qf_post.c
  53. 11 0
      doxygen/snippets/qf_postx.c
  54. 6 5
      doxygen/snippets/qf_qactive.c
  55. 11 11
      doxygen/snippets/qf_start.c
  56. 7 6
      doxygen/snippets/qf_state.c
  57. 1 1
      doxygen/snippets/qf_subscribe.c
  58. 2 2
      doxygen/snippets/qs_objDic.c
  59. 1 1
      doxygen/snippets/qs_sigDic.c
  60. 0 240
      examples/80251/vanilla/keil/dpp-mcb251/START251.A51
  61. 0 272
      examples/80251/vanilla/keil/dpp-mcb251/bsp.c
  62. 0 55
      examples/80251/vanilla/keil/dpp-mcb251/bsp.h
  63. 0 106
      examples/80251/vanilla/keil/dpp-mcb251/dpp-mcb251.Opt
  64. 0 520
      examples/80251/vanilla/keil/dpp-mcb251/dpp-mcb251.Uv2
  65. 0 61
      examples/80251/vanilla/keil/dpp-mcb251/dpp.h
  66. 0 57
      examples/80251/vanilla/keil/dpp-mcb251/isr.c
  67. 0 85
      examples/80251/vanilla/keil/dpp-mcb251/main.c
  68. 0 183
      examples/80251/vanilla/keil/dpp-mcb251/philo.c
  69. 0 158
      examples/80251/vanilla/keil/dpp-mcb251/table.c
  70. 4 6
      examples/80x86/dos/watcom/l/defer/defer.c
  71. 5 14
      examples/80x86/dos/watcom/l/dpp/main.c
  72. 3 8
      examples/80x86/dos/watcom/l/game/main.c
  73. 1 1
      examples/80x86/dos/watcom/l/game/ship.c
  74. 0 23
      examples/80x86/dos/watcom/l/qhsmtst/LOG.TXT
  75. 1 1
      examples/80x86/dos/watcom/l/qhsmtst/log_pass.txt
  76. 7 16
      examples/80x86/qk/watcom/l/dpp/main.c
  77. 5 22
      examples/80x86/qk/watcom/l/game/main.c
  78. 1 1
      examples/80x86/qk/watcom/l/game/ship.c
  79. 0 3
      examples/android-ndk/gnu/dpp/.gitignore
  80. 0 30
      examples/android-ndk/gnu/dpp/AndroidManifest.xml
  81. 0 92
      examples/android-ndk/gnu/dpp/build.xml
  82. 0 26
      examples/android-ndk/gnu/dpp/dpp.sublime-project
  83. 0 844
      examples/android-ndk/gnu/dpp/dpp.sublime-workspace
  84. 0 30
      examples/android-ndk/gnu/dpp/jni/Android.mk
  85. 0 2
      examples/android-ndk/gnu/dpp/jni/Application.mk
  86. 0 521
      examples/android-ndk/gnu/dpp/jni/bsp.c
  87. 0 53
      examples/android-ndk/gnu/dpp/jni/bsp.h
  88. 0 259
      examples/android-ndk/gnu/dpp/jni/display.c
  89. 0 76
      examples/android-ndk/gnu/dpp/jni/display.h
  90. 0 49
      examples/android-ndk/gnu/dpp/jni/dpp.h
  91. 0 441
      examples/android-ndk/gnu/dpp/jni/dpp.qm
  92. 0 92
      examples/android-ndk/gnu/dpp/jni/main.c
  93. 0 224
      examples/android-ndk/gnu/dpp/jni/philo.c
  94. 0 280
      examples/android-ndk/gnu/dpp/jni/table.c
  95. 0 10
      examples/android-ndk/gnu/dpp/local.properties
  96. 0 20
      examples/android-ndk/gnu/dpp/proguard-project.txt
  97. 0 14
      examples/android-ndk/gnu/dpp/project.properties
  98. binární
      examples/android-ndk/gnu/dpp/res/drawable-hdpi/application_icon.png
  99. binární
      examples/android-ndk/gnu/dpp/res/drawable-ldpi/application_icon.png
  100. binární
      examples/android-ndk/gnu/dpp/res/drawable-mdpi/application_icon.png

+ 1 - 0
.gitignore

@@ -31,6 +31,7 @@
 *.Release
 lint*.out
 
+test/
 dbg/
 rel/
 spy/

+ 1097 - 243
doxygen/Doxyfile

@@ -1,255 +1,1109 @@
-# Doxyfile 1.5.4
-
-#---------------------------------------------------------------------------
-# Project related configuration options
-#---------------------------------------------------------------------------
-PROJECT_NAME           = QP/C
-PROJECT_NUMBER         = 
-OUTPUT_DIRECTORY       = .
-CREATE_SUBDIRS         = NO
-OUTPUT_LANGUAGE        = English
-BRIEF_MEMBER_DESC      = YES
-REPEAT_BRIEF           = YES
-ABBREVIATE_BRIEF       = "The $name class" \
-                         "The $name widget" \
-                         "The $name file" \
-                         is \
-                         provides \
-                         specifies \
-                         contains \
-                         represents \
-                         a \
-                         an \
-                         the
-ALWAYS_DETAILED_SEC    = NO
-INLINE_INHERITED_MEMB  = NO
-FULL_PATH_NAMES        = NO
-STRIP_FROM_PATH        = C:/software/
-STRIP_FROM_INC_PATH    = 
-SHORT_NAMES            = NO
-JAVADOC_AUTOBRIEF      = NO
-MULTILINE_CPP_IS_BRIEF = NO
-DETAILS_AT_TOP         = NO
-INHERIT_DOCS           = YES
-SEPARATE_MEMBER_PAGES  = NO
-TAB_SIZE               = 4
-ALIASES                = 
-OPTIMIZE_OUTPUT_FOR_C  = YES
-OPTIMIZE_OUTPUT_JAVA   = NO
-BUILTIN_STL_SUPPORT    = NO
-CPP_CLI_SUPPORT        = NO
-SIP_SUPPORT            = NO
-DISTRIBUTE_GROUP_DOC   = NO
-SUBGROUPING            = YES
-TYPEDEF_HIDES_STRUCT   = YES
-#---------------------------------------------------------------------------
-# Build related configuration options
-#---------------------------------------------------------------------------
-EXTRACT_ALL            = NO
-EXTRACT_PRIVATE        = NO
-EXTRACT_STATIC         = NO
-EXTRACT_LOCAL_CLASSES  = YES
-EXTRACT_LOCAL_METHODS  = NO
-EXTRACT_ANON_NSPACES   = NO
-HIDE_UNDOC_MEMBERS     = YES
-HIDE_UNDOC_CLASSES     = YES
-HIDE_FRIEND_COMPOUNDS  = NO
-HIDE_IN_BODY_DOCS      = NO
-INTERNAL_DOCS          = NO
-CASE_SENSE_NAMES       = NO
-HIDE_SCOPE_NAMES       = NO
-SHOW_INCLUDE_FILES     = YES
-INLINE_INFO            = YES
-SORT_MEMBER_DOCS       = YES
-SORT_BRIEF_DOCS        = NO
-SORT_BY_SCOPE_NAME     = NO
-GENERATE_TODOLIST      = YES
-GENERATE_TESTLIST      = YES
-GENERATE_BUGLIST       = YES
-GENERATE_DEPRECATEDLIST= YES
-ENABLED_SECTIONS       = 
-MAX_INITIALIZER_LINES  = 30
-SHOW_USED_FILES        = YES
-SHOW_DIRECTORIES       = NO
-FILE_VERSION_FILTER    = 
-#---------------------------------------------------------------------------
-# configuration options related to warning and progress messages
-#---------------------------------------------------------------------------
-QUIET                  = NO
-WARNINGS               = YES
-WARN_IF_UNDOCUMENTED   = YES
-WARN_IF_DOC_ERROR      = YES
-WARN_NO_PARAMDOC       = NO
-WARN_FORMAT            = "$file:$line: $text"
-WARN_LOGFILE           = 
-#---------------------------------------------------------------------------
-# configuration options related to the input files
-#---------------------------------------------------------------------------
+# Doxyfile 1.8.4
+
+# 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 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.
+
+DOXYFILE_ENCODING      = UTF-8
+
+# The PROJECT_NAME tag is a single word (or sequence of words) that should  identify the project. Note that if you do not use Doxywizard you need  to put quotes around the project name if it contains spaces.
+
+PROJECT_NAME           = "QP/C"
+
+# 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 an logo or 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           = ./images/logo_qp_60x55.jpg
+#PROJECT_LOGO           = ./images/ql_logo.jpg
+#PROJECT_LOGO           = ./images/ql_masthead.jpg
+
+# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)  base path where the generated documentation will be put.  If a relative path is entered, it will be relative to the location  where doxygen was started. If left blank the current directory will be used.
+
+OUTPUT_DIRECTORY       =
+
+# 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 cause performance problems for the file system.
+
+CREATE_SUBDIRS         = 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.  The default language is English, other supported languages are:  Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional,  Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German,  Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English  messages), Korean, Korean-en, Latvian, Lithuanian, Norwegian, Macedonian,  Persian, Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrillic,  Slovak, Slovene, Spanish, Swedish, Ukrainian, and Vietnamese.
+
+OUTPUT_LANGUAGE        = English
+
+# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will  include brief member descriptions after the members that are listed in  the file and class documentation (similar to JavaDoc).  Set to NO to disable this.
+
+BRIEF_MEMBER_DESC      = YES
+
+# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend  the brief description of a member or function before the detailed description.  Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the  brief descriptions will be completely suppressed.
+
+REPEAT_BRIEF           = YES
+
+# 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" "the"
+
+ABBREVIATE_BRIEF       =
+
+# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then  Doxygen will generate a detailed section even if there is only a brief  description.
+
+ALWAYS_DETAILED_SEC    = NO
+
+# If the 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.
+
+INLINE_INHERITED_MEMB  = NO
+
+# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full  path before files name in the file list and in the header files. If set  to NO the shortest path that makes the file name unique will be used.
+
+FULL_PATH_NAMES        = YES
+
+# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag  can be used to strip a user-defined part of the path. Stripping is  only done if one of the specified strings matches the left-hand part of  the path. 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 specify absolute paths here, but also  relative paths, which will be relative from the directory where doxygen is  started.
+
+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 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 if your file system  doesn't support long names like on DOS, Mac, or CD-ROM.
+
+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  comments will behave just like regular Qt-style comments  (thus requiring an explicit @brief command for a brief description.)
+
+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 comments  will behave just like regular Qt-style comments (thus requiring  an explicit \brief command for a brief description.)
+
+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 behaviour.  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 behaviour instead.
+
+MULTILINE_CPP_IS_BRIEF = NO
+
+# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented  member inherits the documentation from any documented member that it  re-implements.
+
+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.
+
+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.
+
+TAB_SIZE               = 4
+
+# This tag can be used to specify a number of aliases that acts  as commands in the documentation. An alias has the form "name=value".  For example adding "sideeffect=\par Side Effects:\n" will allow you to  put the command \sideeffect (or @sideeffect) in the documentation, which  will result in a user-defined paragraph with heading "Side Effects:".  You can put \n's in the value part of an alias to insert newlines.
+
+ALIASES                =
+
+# 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.
+
+OPTIMIZE_OUTPUT_FOR_C  = YES
+
+# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java  sources only. Doxygen will then generate output that is more tailored for  Java. For instance, namespaces will be presented as packages, qualified  scopes will look different, etc.
+
+OPTIMIZE_OUTPUT_JAVA   = NO
+
+# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran  sources only. Doxygen will then generate output that is more tailored for  Fortran.
+
+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.
+
+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, CSharp, C, C++, D, PHP, Objective-C, Python, Fortran, VHDL, C,  C++. 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  that for custom extensions you also need to set FILE_PATTERNS otherwise the  files are not read by doxygen.
+
+EXTENSION_MAPPING      =
+
+# If MARKDOWN_SUPPORT is enabled (the default) 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.
+
+MARKDOWN_SUPPORT       = YES
+
+# 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 by putting a % sign in front of the word  or globally by setting AUTOLINK_SUPPORT to NO.
+
+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); v.s.  func(std::string) {}). This also makes the inheritance and collaboration  diagrams that involve STL classes more complete and accurate.
+
+BUILTIN_STL_SUPPORT    = NO
+
+# If you use Microsoft's C++/CLI language, you should set this option to YES to  enable parsing support.
+
+CPP_CLI_SUPPORT        = NO
+
+# Set the SIP_SUPPORT tag to YES if your project consists of sip 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.
+
+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 (the  default) will make doxygen 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.
+
+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.
+
+DISTRIBUTE_GROUP_DOC   = NO
+
+# Set the SUBGROUPING tag to YES (the default) 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.
+
+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).
+
+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 (the default), structs, classes, and unions are shown on a separate  page (for HTML and Man pages) or section (for LaTeX and RTF).
+
+INLINE_SIMPLE_STRUCTS  = NO
+
+# When TYPEDEF_HIDES_STRUCT 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.
+
+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 appear 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.
+
+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
+
+EXTRACT_ALL            = NO
+
+# If the EXTRACT_PRIVATE tag is set to YES all private members of a class  will be included in the documentation.
+
+EXTRACT_PRIVATE        = NO
+
+# If the EXTRACT_PACKAGE tag is set to YES all members with package or internal  scope will be included in the documentation.
+
+EXTRACT_PACKAGE        = NO
+
+# If the EXTRACT_STATIC tag is set to YES all static members of a file  will be included in the documentation.
+
+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.
+
+EXTRACT_LOCAL_CLASSES  = YES
+
+# This flag is only useful for Objective-C code. When 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 (the default) only methods in the interface are included.
+
+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 namespaces are hidden.
+
+EXTRACT_ANON_NSPACES   = NO
+
+# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all  undocumented members of documented classes, files or namespaces.  If set to NO (the default) these members will be included in the  various overviews, but no documentation section is generated.  This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_MEMBERS     = NO
+
+# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all  undocumented classes that are normally visible in the class hierarchy.  If set to NO (the default) these classes will be included in the various  overviews. This option has no effect if EXTRACT_ALL is enabled.
+
+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 (the default) these declarations will be included in the  documentation.
+
+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 (the default) these blocks will be appended to the  function's detailed documentation block.
+
+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 (the default) then the documentation will be excluded.  Set it to YES to include the internal documentation.
+
+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.
+
+CASE_SENSE_NAMES       = NO
+
+# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen  will show members with their full class and namespace scopes in the  documentation. If set to YES the scope will be hidden.
+
+HIDE_SCOPE_NAMES       = NO
+
+# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen  will put a list of the files that are included by a file in the documentation  of that file.
+
+SHOW_INCLUDE_FILES     = YES
+
+# 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.
+
+FORCE_LOCAL_INCLUDES   = NO
+
+# If the INLINE_INFO tag is set to YES (the default) then a tag [inline]  is inserted in the documentation for inline members.
+
+INLINE_INFO            = YES
+
+# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen  will sort the (detailed) documentation of file and class members  alphabetically by member name. If set to NO the members will appear in  declaration order.
+
+SORT_MEMBER_DOCS       = YES
+
+# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the  brief documentation of file, namespace and class members alphabetically  by member name. If set to NO (the default) the members will appear in  declaration order.
+
+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 default)  the constructors will appear in the respective orders defined by  SORT_MEMBER_DOCS and SORT_BRIEF_DOCS.  This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO  and ignored for detailed docs if SORT_MEMBER_DOCS is set to 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 default)  the group names will appear in their defined order.
+
+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 default), 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.
+
+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.
+
+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.
+
+GENERATE_TODOLIST      = YES
+
+# The GENERATE_TESTLIST tag can be used to enable (YES) or  disable (NO) the test list. This list is created by putting \test  commands in the documentation.
+
+GENERATE_TESTLIST      = YES
+
+# The GENERATE_BUGLIST tag can be used to enable (YES) or  disable (NO) the bug list. This list is created by putting \bug  commands in the documentation.
+
+GENERATE_BUGLIST       = YES
+
+# 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.
+
+GENERATE_DEPRECATEDLIST= YES
+
+# The ENABLED_SECTIONS tag can be used to enable conditional  documentation sections, marked by \if section-label ... \endif  and \cond section-label ... \endcond blocks.
+
+ENABLED_SECTIONS       =
+
+# The MAX_INITIALIZER_LINES tag determines the maximum number of lines  the initial value of a variable or macro consists of for it to appear in  the documentation. If the initializer consists of more lines than specified  here it will be hidden. Use a value of 0 to hide initializers completely.  The appearance of the initializer of individual variables and macros in the  documentation can be controlled using \showinitializer or \hideinitializer  command in the documentation regardless of this setting.
+
+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.
+
+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 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 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. See the manual for examples.
+
+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.
+
+LAYOUT_FILE            =
+
+# The CITE_BIB_FILES tag can be used to specify one or more bib files  containing the references data. This must be a list of .bib files. The  .bib extension is automatically appended if omitted. Using this command  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. Do not use  file names with spaces, bibtex cannot handle them.
+
+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  by doxygen. Possible values are YES and NO. If left blank NO is used.
+
+QUIET                  = NO
+
+# The WARNINGS tag can be used to turn on/off the warning messages that are  generated by doxygen. Possible values are YES and NO. If left blank  NO is used.
+
+WARNINGS               = YES
+
+# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings  for undocumented members. If EXTRACT_ALL is set to YES then this flag will  automatically be disabled.
+
+WARN_IF_UNDOCUMENTED   = YES
+
+# If WARN_IF_DOC_ERROR 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.
+
+WARN_IF_DOC_ERROR      = YES
+
+# The 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 (the default) doxygen will only warn about  wrong or incomplete parameter documentation, but not about the absence of  documentation.
+
+WARN_NO_PARAMDOC       = 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)
+
+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 stderr.
+
+WARN_LOGFILE           =
+
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+
+# The INPUT tag can be used to specify the files and/or directories that contain  documented source files. You may enter file names like "myfile.cpp" or  directories like "/usr/src/myproject". Separate the files or directories  with spaces.
+
 INPUT                  = ./qpc.txt \
                          ./qpc_rev.txt \
                          ./qpc_files.txt \
-                         ./qpc_tut.txt \
-                         ./gpl2.txt \
+                         ./qpc_tut.txt \
+                         ./qp_macros.h \
+                         ../gpl2.txt \
                          ../ports/lint \
                          ../include \
                          ../qep/source \
                          ../qf/source \
                          ../qk/source \
                          ../qs/source
-FILE_PATTERNS          = *.c \
-                         *.cpp \
-                         *.java \
-                         *.h
-RECURSIVE              = YES
-EXCLUDE                = 
-EXCLUDE_SYMLINKS       = NO
-EXCLUDE_PATTERNS       = 
-EXCLUDE_SYMBOLS        = 
-EXAMPLE_PATH           = ./snippets
-EXAMPLE_PATTERNS       = *
-EXAMPLE_RECURSIVE      = NO
+
+# This tag can be used to specify the character encoding of the source files  that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is  also the default input encoding. 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.
+
+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 pattern (like *.cpp  and *.h) to filter out the source-files in the directories. If left  blank the following patterns are tested:  *.c *.cc *.cxx *.cpp *.c++ *.d *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh  *.hxx *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.dox *.py  *.f90 *.f *.for *.vhd *.vhdl
+
+FILE_PATTERNS          = *.txt \
+                         *.c \
+                         *.cpp \
+                         *.h
+
+# The RECURSIVE tag can be used to turn specify whether or not subdirectories  should be searched for input files as well. Possible values are YES and NO.  If left blank NO is used.
+
+RECURSIVE              = YES
+
+# 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                = ../include/qs_dummy.h \
+                         ../ports/lint/stdint.h \
+                         ../ports/lint/MISRA_Exemplar_Suite_test 
+
+# 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.
+
+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
+
+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           = ./snippets
+
+# 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.  Possible values are YES and NO. If left blank NO is used.
+
+EXAMPLE_RECURSIVE      = NO
+
+# The IMAGE_PATH tag can be used to specify one or more files or  directories that contain image that are included in the documentation (see  the \image command).
+
 IMAGE_PATH             = ./images
-INPUT_FILTER           = 
-FILTER_PATTERNS        = 
-FILTER_SOURCE_FILES    = NO
-#---------------------------------------------------------------------------
-# configuration options related to source browsing
-#---------------------------------------------------------------------------
-SOURCE_BROWSER         = YES
-INLINE_SOURCES         = NO
-STRIP_CODE_COMMENTS    = YES
-REFERENCED_BY_RELATION = YES
-REFERENCES_RELATION    = YES
-REFERENCES_LINK_SOURCE = YES
-USE_HTAGS              = NO
-VERBATIM_HEADERS       = YES
-#---------------------------------------------------------------------------
-# configuration options related to the alphabetical class index
-#---------------------------------------------------------------------------
-ALPHABETICAL_INDEX     = YES
-COLS_IN_ALPHA_INDEX    = 5
-IGNORE_PREFIX          = 
-#---------------------------------------------------------------------------
-# configuration options related to the HTML output
-#---------------------------------------------------------------------------
-GENERATE_HTML          = YES
-HTML_OUTPUT            = html
-HTML_FILE_EXTENSION    = .html
-HTML_HEADER            = 
-HTML_FOOTER            = 
-HTML_STYLESHEET        = 
-HTML_ALIGN_MEMBERS     = YES
-GENERATE_HTMLHELP      = YES
-HTML_DYNAMIC_SECTIONS  = NO
-CHM_FILE               = ../../qpc.chm
-HHC_LOCATION           = 
-GENERATE_CHI           = NO
-BINARY_TOC             = NO
-TOC_EXPAND             = YES
-DISABLE_INDEX          = NO
-ENUM_VALUES_PER_LINE   = 4
-GENERATE_TREEVIEW      = NO
-TREEVIEW_WIDTH         = 250
-#---------------------------------------------------------------------------
-# configuration options related to the LaTeX output
-#---------------------------------------------------------------------------
-GENERATE_LATEX         = NO
-LATEX_OUTPUT           = latex
-LATEX_CMD_NAME         = latex
-MAKEINDEX_CMD_NAME     = makeindex
-COMPACT_LATEX          = NO
-PAPER_TYPE             = a4wide
-EXTRA_PACKAGES         = 
-LATEX_HEADER           = 
-PDF_HYPERLINKS         = NO
-USE_PDFLATEX           = NO
-LATEX_BATCHMODE        = NO
-LATEX_HIDE_INDICES     = NO
-#---------------------------------------------------------------------------
-# configuration options related to the RTF output
-#---------------------------------------------------------------------------
-GENERATE_RTF           = NO
-RTF_OUTPUT             = rtf
-COMPACT_RTF            = NO
-RTF_HYPERLINKS         = YES
-RTF_STYLESHEET_FILE    = 
-RTF_EXTENSIONS_FILE    = 
-#---------------------------------------------------------------------------
-# configuration options related to the man page output
-#---------------------------------------------------------------------------
-GENERATE_MAN           = NO
-MAN_OUTPUT             = man
-MAN_EXTENSION          = .3
-MAN_LINKS              = NO
-#---------------------------------------------------------------------------
-# configuration options related to the XML output
-#---------------------------------------------------------------------------
-GENERATE_XML           = NO
-XML_OUTPUT             = xml
-XML_SCHEMA             = 
-XML_DTD                = 
-XML_PROGRAMLISTING     = YES
-#---------------------------------------------------------------------------
-# configuration options for the AutoGen Definitions output
-#---------------------------------------------------------------------------
-GENERATE_AUTOGEN_DEF   = NO
-#---------------------------------------------------------------------------
-# configuration options related to the Perl module output
-#---------------------------------------------------------------------------
-GENERATE_PERLMOD       = NO
-PERLMOD_LATEX          = NO
-PERLMOD_PRETTY         = YES
-PERLMOD_MAKEVAR_PREFIX = 
-#---------------------------------------------------------------------------
-# Configuration options related to the preprocessor   
-#---------------------------------------------------------------------------
-ENABLE_PREPROCESSING   = YES
-MACRO_EXPANSION        = YES
-EXPAND_ONLY_PREDEF     = YES
-SEARCH_INCLUDES        = YES
+
+# The INPUT_FILTER tag can be used to specify a program that doxygen should  invoke to filter for each input file. Doxygen will invoke the filter program  by executing (via popen()) the command <filter> <input-file>, where <filter>  is the value of the INPUT_FILTER tag, and <input-file> is the name of an  input file. Doxygen will then use the output that the filter program writes  to standard output.  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.
+
+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  info on how filters are used. If FILTER_PATTERNS is empty or if  non of the patterns match the file name, INPUT_FILTER is applied.
+
+FILTER_PATTERNS        =
+
+# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using  INPUT_FILTER) will be used to filter the input files when producing source  files to browse (i.e. when SOURCE_BROWSER is set to YES).
+
+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 option only has effect when  FILTER_SOURCE_FILES is enabled.
+
+FILTER_SOURCE_PATTERNS =
+
+# If the USE_MD_FILE_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 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 also  VERBATIM_HEADERS is set to NO.
+
+SOURCE_BROWSER         = NO
+
+# Setting the INLINE_SOURCES tag to YES will include the body  of functions and classes directly in the documentation.
+
+INLINE_SOURCES         = NO
+
+# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct  doxygen to hide any special comment blocks from generated source code  fragments. Normal C, C++ and Fortran comments will always remain visible.
+
+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.
+
+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.
+
+REFERENCES_RELATION    = NO
+
+# If the REFERENCES_LINK_SOURCE tag is set to YES (the default)  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.
+
+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.
+
+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.
+
+USE_HTAGS              = NO
+
+# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen  will generate a verbatim copy of the header file for each class for  which an include is specified. Set to NO to disable this.
+
+VERBATIM_HEADERS       = YES
+
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+
+# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index  of all compounds will be generated. Enable this if the project  contains a lot of classes, structs, unions or interfaces.
+
+ALPHABETICAL_INDEX     = YES
+
+# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then  the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns  in which this list will be split (can be a number in the range [1..20])
+
+COLS_IN_ALPHA_INDEX    = 5
+
+# In case all classes in a project start with a common prefix, all  classes will be put under the same header in the alphabetical index.  The IGNORE_PREFIX tag can be used to specify one or more prefixes that  should be ignored while generating the index headers.
+
+IGNORE_PREFIX          =
+
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_HTML tag is set to YES (the default) Doxygen will  generate HTML output.
+
+GENERATE_HTML          = YES
+
+# The HTML_OUTPUT tag is used to specify where the HTML docs will be put.  If a relative path is entered the value of OUTPUT_DIRECTORY will be  put in front of it. If left blank `html' will be used as the default path.
+
+HTML_OUTPUT            = html
+
+# The HTML_FILE_EXTENSION tag can be used to specify the file extension for  each generated HTML page (for example: .htm,.php,.asp). If it is left blank  doxygen will generate files with .html extension.
+
+HTML_FILE_EXTENSION    = .html
+
+# The HTML_HEADER tag can be used to specify a personal HTML header for  each generated HTML page. If it is left blank doxygen will generate a  standard header. Note that when using a custom header you are responsible   for the proper inclusion of any scripts and style sheets that doxygen  needs, which is dependent on the configuration options used.  It is advised to generate a default header using "doxygen -w html  header.html footer.html stylesheet.css YourConfigFile" and then modify  that header. Note that the header is subject to change so you typically  have to redo this when upgrading to a newer version of doxygen or when  changing the value of configuration settings such as GENERATE_TREEVIEW!
+
+HTML_HEADER            =
+
+# The HTML_FOOTER tag can be used to specify a personal HTML footer for  each generated HTML page. If it is left blank doxygen will generate a  standard footer.
+
+HTML_FOOTER            =
+
+# 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. Note that it is recommended to use  HTML_EXTRA_STYLESHEET instead of this one, as it is more robust and this  tag will in the future become obsolete.
+
+HTML_STYLESHEET        =
+
+# The HTML_EXTRA_STYLESHEET tag can be used to specify an additional  user-defined cascading style sheet that is 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 therefor more  robust against future updates. Doxygen will copy the style sheet file to  the output directory.
+
+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.
+
+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.  The allowed range is 0 to 359.
+
+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.
+
+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.
+
+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 NO can help when comparing the output of multiple runs.
+
+HTML_TIMESTAMP         = YES
+
+# 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.
+
+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.
+
+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, 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.
+
+GENERATE_DOCSET        = NO
+
+# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the  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.
+
+DOCSET_FEEDNAME        = "Doxygen generated docs"
+
+# When GENERATE_DOCSET tag is set to YES, 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.
+
+DOCSET_BUNDLE_ID       = org.doxygen.Project
+
+# When GENERATE_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.
+
+DOCSET_PUBLISHER_ID    = org.doxygen.Publisher
+
+# The GENERATE_PUBLISHER_NAME tag identifies the documentation publisher.
+
+DOCSET_PUBLISHER_NAME  = Publisher
+
+# If the GENERATE_HTMLHELP tag is set to YES, additional index files  will be generated that can be used as input for tools like the  Microsoft HTML help workshop to generate a compiled HTML help file (.chm)  of the generated HTML documentation.
+
+GENERATE_HTMLHELP      = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, 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.
+
+CHM_FILE               = ../../qpc.chm
+
+# If the GENERATE_HTMLHELP tag is set to YES, 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.
+
+HHC_LOCATION           =
+
+# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag  controls if a separate .chi index file is generated (YES) or that  it should be included in the master .chm file (NO).
+
+GENERATE_CHI           = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING  is used to encode HtmlHelp index (hhk), content (hhc) and project file  content.
+
+CHM_INDEX_ENCODING     =
+
+# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag  controls whether a binary table of contents is generated (YES) or a  normal table of contents (NO) in the .chm file.
+
+BINARY_TOC             = NO
+
+# The TOC_EXPAND flag can be set to YES to add extra items for group members  to the contents of the HTML help documentation and to the tree view.
+
+TOC_EXPAND             = NO
+
+# 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.
+
+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.
+
+QCH_FILE               =
+
+# The QHP_NAMESPACE tag specifies the namespace to use when generating  Qt Help Project output. For more information please see  http://doc.trolltech.com/qthelpproject.html#namespace
+
+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  http://doc.trolltech.com/qthelpproject.html#virtual-folders
+
+QHP_VIRTUAL_FOLDER     = doc
+
+# If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to  add. For more information please see  http://doc.trolltech.com/qthelpproject.html#custom-filters
+
+QHP_CUST_FILTER_NAME   =
+
+# The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the  custom filter to add. For more information please see  <a href="http://doc.trolltech.com/qthelpproject.html#custom-filters">  Qt Help Project / Custom Filters</a>.
+
+QHP_CUST_FILTER_ATTRS  =
+
+# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this  project's  filter section matches.  <a href="http://doc.trolltech.com/qthelpproject.html#filter-attributes">  Qt Help Project / Filter Attributes</a>.
+
+QHP_SECT_FILTER_ATTRS  =
+
+# If the GENERATE_QHP tag is set to YES, 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.
+
+QHG_LOCATION           =
+
+# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files   will be generated, which together with the HTML files, 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.
+
+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.
+
+ECLIPSE_DOC_ID         = org.doxygen.Project
+
+# The DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs)  at top of each HTML page. The value NO (the default) enables the index and  the value YES disables it. Since the tabs have the same information as the  navigation tree you can set this option to NO if you already set  GENERATE_TREEVIEW 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.  Since the tree basically has the same information as the tab index you  could consider to set DISABLE_INDEX to NO when enabling this option.
+
+GENERATE_TREEVIEW      = NO
+
+# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values  (range [0,1..20]) 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.
+
+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.
+
+TREEVIEW_WIDTH         = 250
+
+# When 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.
+
+EXT_LINKS_IN_WINDOW    = NO
+
+# Use this tag to change the font size of Latex formulas included  as images in the HTML documentation. The default is 10. Note that  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.
+
+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 before the changes have effect.
+
+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 prerendered 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.
+
+USE_MATHJAX            = NO
+
+# When MathJax is enabled you can set the default output format to be used for  the MathJax output. Supported types are HTML-CSS, NativeMML (i.e. MathML) and  SVG. The default value is HTML-CSS, which is slower, but has the best  compatibility.
+
+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.
+
+MATHJAX_RELPATH        = http://cdn.mathjax.org/mathjax/latest
+
+# The MATHJAX_EXTENSIONS tag can be used to specify one or MathJax extension  names that should be enabled during MathJax rendering.
+
+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.
+
+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.
+
+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 flavours of web server based search 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 manual for details.
+
+SERVER_BASED_SEARCH    = NO
+
+# When EXTERNAL_SEARCH 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 the manual for configuration details.
+
+EXTERNAL_SEARCH        = NO
+
+# The SEARCHENGINE_URL should point to a search engine hosted by a web server  which will returned the search results when EXTERNAL_SEARCH is enabled.  Doxygen ships with an example search engine (doxysearch) which is based on  the open source search engine library Xapian. See the manual for configuration  details.
+
+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.
+
+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.
+
+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 = id1=loc1 id2=loc2 ...
+
+EXTRA_SEARCH_MAPPINGS  =
+
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will  generate Latex output.
+
+GENERATE_LATEX         = NO
+
+# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put.  If a relative path is entered the value of OUTPUT_DIRECTORY will be  put in front of it. If left blank `latex' will be used as the default path.
+
+LATEX_OUTPUT           = latex
+
+# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be  invoked. If left blank `latex' will be used as the default command name.  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.
+
+LATEX_CMD_NAME         = latex
+
+# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to  generate index for LaTeX. If left blank `makeindex' will be used as the  default command name.
+
+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.
+
+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, letter, legal and  executive. If left blank a4 will be used.
+
+PAPER_TYPE             = a4
+
+# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX  packages that should be included in the LaTeX output.
+
+EXTRA_PACKAGES         =
+
+# The LATEX_HEADER tag can be used to specify a personal LaTeX header for  the generated latex document. The header should contain everything until  the first chapter. If it is left blank doxygen will generate a  standard header. Notice: only use this tag if you know what you are doing!
+
+LATEX_HEADER           =
+
+# 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. Notice: only use this tag if you know what you are doing!
+
+LATEX_FOOTER           =
+
+# 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 directory.  Note that the files will be copied as-is; there are no commands or markers  available.
+
+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). The pdf file will  contain links (just like the HTML output) instead of page references  This makes the output suitable for online browsing using a pdf viewer.
+
+PDF_HYPERLINKS         = YES
+
+# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of  plain latex in the generated Makefile. Set this option to YES to get a  higher quality PDF documentation.
+
+USE_PDFLATEX           = 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.
+
+LATEX_BATCHMODE        = NO
+
+# If LATEX_HIDE_INDICES is set to YES then doxygen will not  include the index chapters (such as File Index, Compound Index, etc.)  in the output.
+
+LATEX_HIDE_INDICES     = NO
+
+# If LATEX_SOURCE_CODE 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.
+
+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. The default style is "plain". See  http://en.wikipedia.org/wiki/BibTeX for more info.
+
+LATEX_BIB_STYLE        = plain
+
+#---------------------------------------------------------------------------
+# 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 very pretty with  other RTF readers or editors.
+
+GENERATE_RTF           = NO
+
+# The RTF_OUTPUT tag is used to specify where the RTF docs will be put.  If a relative path is entered the value of OUTPUT_DIRECTORY will be  put in front of it. If left blank `rtf' will be used as the default path.
+
+RTF_OUTPUT             = 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.
+
+COMPACT_RTF            = NO
+
+# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated  will contain hyperlink fields. The RTF file will  contain links (just like the HTML output) instead of page references.  This makes the output suitable for online browsing using WORD or other  programs which support those fields.  Note: wordpad (write) and others do not support links.
+
+RTF_HYPERLINKS         = NO
+
+# Load style sheet 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.
+
+RTF_STYLESHEET_FILE    =
+
+# Set optional variables used in the generation of an rtf document.  Syntax is similar to doxygen's config file.
+
+RTF_EXTENSIONS_FILE    =
+
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_MAN tag is set to YES (the default) Doxygen will  generate man pages
+
+GENERATE_MAN           = NO
+
+# The MAN_OUTPUT tag is used to specify where the man pages will be put.  If a relative path is entered the value of OUTPUT_DIRECTORY will be  put in front of it. If left blank `man' will be used as the default path.
+
+MAN_OUTPUT             = man
+
+# The MAN_EXTENSION tag determines the extension that is added to  the generated man pages (default is the subroutine's section .3)
+
+MAN_EXTENSION          = .3
+
+# If the MAN_LINKS tag is set to YES and Doxygen generates man output,  then it will generate one additional man file for each entity  documented in the real man page(s). These additional files  only source the real man page, but without them the man command  would be unable to find the correct page. The default is NO.
+
+MAN_LINKS              = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_XML tag is set to YES Doxygen will  generate an XML file that captures the structure of  the code including all documentation.
+
+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. If left blank `xml' will be used as the default path.
+
+XML_OUTPUT             = xml
+
+# The XML_SCHEMA tag can be used to specify an XML schema,  which can be used by a validating XML parser to check the  syntax of the XML files.
+
+XML_SCHEMA             =
+
+# The XML_DTD tag can be used to specify an XML DTD,  which can be used by a validating XML parser to check the  syntax of the XML files.
+
+XML_DTD                =
+
+# 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.
+
+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.
+
+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. If left blank docbook will be used as the default path.
+
+DOCBOOK_OUTPUT         = docbook
+
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will  generate an AutoGen Definitions (see 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.
+
+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.
+
+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.
+
+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.
+
+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.
+
+PERLMOD_MAKEVAR_PREFIX =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor
+#---------------------------------------------------------------------------
+
+# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will  evaluate all C-preprocessor directives found in the sources and include  files.
+
+ENABLE_PREPROCESSING   = YES
+
+# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro  names in the source code. If set to NO (the default) only conditional  compilation will be performed. Macro expansion can be done in a controlled  way by setting EXPAND_ONLY_PREDEF to YES.
+
+MACRO_EXPANSION        = YES
+
+# 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.
+
+EXPAND_ONLY_PREDEF     = YES
+
+# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files  pointed to by INCLUDE_PATH will be searched when a #include is found.
+
+SEARCH_INCLUDES        = YES
+
+# The INCLUDE_PATH tag can be used to specify one or more directories that  contain include files that are not input files but should be processed by  the preprocessor.
+
 INCLUDE_PATH           = ../include \
-                         ../ports/lint
-INCLUDE_FILE_PATTERNS  = 
-PREDEFINED             = Q_SPY= \
+                         ../ports/lint
+
+# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard  patterns (like *.h and *.hpp) to filter out the header-files in the  directories. If left blank, the patterns specified with FILE_PATTERNS will  be used.
+
+INCLUDE_FILE_PATTERNS  =
+
+# The PREDEFINED tag can be used to specify one or more macro names that  are defined before the preprocessor is started (similar to the -D option of  gcc). The argument of the tag is a list of macros of the form: name  or name=definition (no spaces). If the definition and the = are  omitted =1 is assumed. To prevent a macro definition from being  undefined via #undef or recursively expanded use the := operator  instead of the = operator.
+
+PREDEFINED             = Q_SPY=1 \
                          "QF_MAX_ACTIVE= 63"
-EXPAND_AS_DEFINED      = 
-SKIP_FUNCTION_MACROS   = YES
-#---------------------------------------------------------------------------
-# Configuration::additions related to external references   
-#---------------------------------------------------------------------------
-TAGFILES               = 
-GENERATE_TAGFILE       = 
-ALLEXTERNALS           = NO
-EXTERNAL_GROUPS        = YES
-PERL_PATH              = /usr/bin/perl
-#---------------------------------------------------------------------------
-# Configuration options related to the dot tool   
-#---------------------------------------------------------------------------
-CLASS_DIAGRAMS         = YES
-MSCGEN_PATH            = 
-HIDE_UNDOC_RELATIONS   = YES
-HAVE_DOT               = NO
-CLASS_GRAPH            = YES
-COLLABORATION_GRAPH    = YES
-GROUP_GRAPHS           = YES
-UML_LOOK               = NO
-TEMPLATE_RELATIONS     = NO
-INCLUDE_GRAPH          = YES
-INCLUDED_BY_GRAPH      = YES
-CALL_GRAPH             = NO
-CALLER_GRAPH           = NO
-GRAPHICAL_HIERARCHY    = YES
-DIRECTORY_GRAPH        = YES
-DOT_IMAGE_FORMAT       = png
-DOT_PATH               = 
-DOTFILE_DIRS           = 
-DOT_GRAPH_MAX_NODES    = 50
-MAX_DOT_GRAPH_DEPTH    = 1000
-DOT_TRANSPARENT        = NO
-DOT_MULTI_TARGETS      = NO
-GENERATE_LEGEND        = YES
-DOT_CLEANUP            = YES
-#---------------------------------------------------------------------------
-# Configuration::additions related to the search engine   
-#---------------------------------------------------------------------------
-SEARCHENGINE           = NO
+
+# 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.
+
+EXPAND_AS_DEFINED      =
+
+# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) 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, because these will confuse the parser if not removed.
+
+SKIP_FUNCTION_MACROS   = YES
+
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references
+#---------------------------------------------------------------------------
+
+# The TAGFILES option can be used to specify one or more tagfiles. 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. Note that 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.
+
+GENERATE_TAGFILE       =
+
+# If the ALLEXTERNALS tag is set to YES all external classes will be listed  in the class index. If set to NO only the inherited external classes  will be listed.
+
+ALLEXTERNALS           = NO
+
+# 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.
+
+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.
+
+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').
+
+PERL_PATH              = /usr/bin/perl
+
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+
+# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will  generate a inheritance diagram (in HTML, RTF 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.
+
+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            =
+
+# 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.
+
+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, a graph visualization  toolkit from AT&T and Lucent Bell Labs. The other options in this section  have no effect if this option is set to NO (the default)
+
+HAVE_DOT               = NO
+
+# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is  allowed to run in parallel. When set to 0 (the default) 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.
+
+DOT_NUM_THREADS        = 0
+
+# By default doxygen will use the Helvetica font for all dot files that  doxygen generates. When you want a differently looking font 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.
+
+DOT_FONTNAME           = Helvetica
+
+# The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs.  The default size is 10pt.
+
+DOT_FONTSIZE           = 10
+
+# By default doxygen will tell dot to use the Helvetica font.  If you specify a different font using DOT_FONTNAME you can use DOT_FONTPATH to  set the path where dot can find it.
+
+DOT_FONTPATH           =
+
+# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen  will generate a graph for each documented class showing the direct and  indirect inheritance relations. Setting this tag to YES will force the  CLASS_DIAGRAMS tag to NO.
+
+CLASS_GRAPH            = YES
+
+# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen  will generate a graph for each documented class showing the direct and  indirect implementation dependencies (inheritance, containment, and  class references variables) of the class with other documented classes.
+
+COLLABORATION_GRAPH    = YES
+
+# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen  will generate a graph for groups, showing the direct groups dependencies
+
+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.
+
+UML_LOOK               = YES
+
+# 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.
+
+UML_LIMIT_NUM_FIELDS   = 10
+
+# If set to YES, the inheritance and collaboration graphs will show the  relations between templates and their instances.
+
+TEMPLATE_RELATIONS     = NO
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT  tags are set to YES then doxygen will generate a graph for each documented  file showing the direct and indirect include dependencies of the file with  other documented files.
+
+INCLUDE_GRAPH          = YES
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and  HAVE_DOT tags are set to YES then doxygen will generate a graph for each  documented header file showing the documented files that directly or  indirectly include this file.
+
+INCLUDED_BY_GRAPH      = YES
+
+# If the CALL_GRAPH and HAVE_DOT options are 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.
+
+CALL_GRAPH             = NO
+
+# If the CALLER_GRAPH and HAVE_DOT tags are 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.
+
+CALLER_GRAPH           = NO
+
+# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen  will generate a graphical hierarchy of all classes instead of a textual one.
+
+GRAPHICAL_HIERARCHY    = YES
+
+# If the DIRECTORY_GRAPH and HAVE_DOT tags are 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.
+
+DIRECTORY_GRAPH        = YES
+
+# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images  generated by dot. Possible values are svg, png, jpg, or gif.  If left blank png will be used. 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).
+
+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. 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.
+
+INTERACTIVE_SVG        = NO
+
+# The tag DOT_PATH can be used to specify the path where the dot tool can be  found. If left blank, it is assumed the dot tool can be found in the path.
+
+DOT_PATH               =
+
+# The DOTFILE_DIRS tag can be used to specify one or more directories that  contain dot files that are included in the documentation (see the  \dotfile command).
+
+DOTFILE_DIRS           =
+
+# The 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 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.
+
+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.
+
+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).
+
+DOT_TRANSPARENT        = NO
+
+# Set the DOT_MULTI_TARGETS tag to YES 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.
+
+DOT_MULTI_TARGETS      = NO
+
+# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will  generate a legend page explaining the meaning of the various boxes and  arrows in the dot generated graphs.
+
+GENERATE_LEGEND        = YES
+
+# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will  remove the intermediate dot files that are used to generate  the various graphs.
+
+DOT_CLEANUP            = YES

binární
doxygen/images/Fig1.01.jpg


binární
doxygen/images/Fig1.03.jpg


binární
doxygen/images/dev_mgr.png


binární
doxygen/images/game_iar.jpg


binární
doxygen/images/game_iar.png


binární
doxygen/images/game_make.png


binární
doxygen/images/game_mingw.png


binární
doxygen/images/game_mingw_code.png


binární
doxygen/images/game_vc2012.jpg


binární
doxygen/images/game_win.png


binární
doxygen/images/inst_qm.png


binární
doxygen/images/inst_qpc.png


binární
doxygen/images/inst_qtools.png


binární
doxygen/images/logo_qp_60x55.jpg


binární
doxygen/images/ql_logo.jpg


binární
doxygen/images/ql_masthead.jpg


binární
doxygen/images/qm_game.jpg


binární
doxygen/images/qm_panels.jpg


binární
doxygen/images/qp_components.jpg


binární
doxygen/images/qp_datasheet.gif


binární
doxygen/images/qpc_iar.png


binární
doxygen/images/qpc_mingw.png


binární
doxygen/images/qpc_vc2012.jpg


binární
doxygen/images/qs_out.png


binární
doxygen/images/qspy_vc.jpg


binární
doxygen/images/qspy_vc.png


binární
doxygen/images/win_env.png


binární
doxygen/images/win_set.png


+ 30 - 0
doxygen/qp_macros.h

@@ -0,0 +1,30 @@
+/**
+* \file
+* \ingroup qep qf qk qs
+* command-line macros
+*/
+
+
+/** \brief The preprocessor switch to disable checking assertions
+*
+* When defined, Q_NASSERT disables the following macros #Q_ASSERT,
+* #Q_REQUIRE, #Q_ENSURE, #Q_INVARIANT, #Q_ERROR as well as
+* #Q_ASSERT_ID, #Q_REQUIRE_ID, #Q_ENSURE_ID, #Q_INVARIANT_ID, and
+* #Q_ERROR_ID do NOT evaluate the test condition passed as the
+* argument to these macros.
+*
+* \note One notable exception is the macro #Q_ALLEGE, that still
+* evaluates the test condition, but does not report assertion
+* failures when the switch Q_NASSERT is defined.
+*/
+#define Q_NASSERT
+
+
+/** \brief The preprocessor switch to activate the QS software tracing
+* instrumentation in the code
+*
+* When defined, Q_SPY activates the QS software tracing instrumentation.
+* When Q_SPY is not defined, the QS instrumentation in the code does
+* not generate any code.
+*/
+#define Q_SPY

+ 33 - 219
doxygen/qpc.txt

@@ -5,7 +5,7 @@
 \image html qp_banner.jpg
 
 - \ref overview
-- \ref starting
+- \ref tutorial
 - \ref PSiCC2
 - \ref licensing
 - \ref contact
@@ -13,88 +13,34 @@
 - \ref files_page
 - \ref rev_page
 
-\section overview QP Overview
-
-Quantum Platform (<strong>%QP</strong>) is a family of very lightweight, open
-source, state machine-based frameworks for embedded systems. QP enables
-developing well-structured embedded applications as a set of concurrently
-executing hierarchical state machines (UML statecharts). With QP, coding of
-modern state machines directly in C or C++ is a non-issue. <STRONG>No big
-tools</STRONG> are needed.
+\section overview QP&trade; Overview
 
+
+<a href="http://www.state-machine.com/qm/"><strong>QP&trade; (Quantum Platform)</strong></a> is a family of lightweight, open source software frameworks for building responsive and modular real-time embedded applications as systems of cooperating, event-driven <a href="http://www.state-machine.com/qp/index.php#Active">active objects</a> (<a href="http://en.wikipedia.org/wiki/Actor_model">actors</a>). The QP&trade; family consists of QP/C, QP/C++, and QP-nano frameworks, which are all strictly quality controlled, superbly documented, and commercially licensable.
+
 \image html qp_components.jpg
 
-- \subpage qep_page
-- \subpage qf_page
-- \subpage qk_page
-- \subpage qs_page
-- http://www.state-machine.com/doxygen/qspy/index.html 
-
-Current versions of %QP include: QP/C and QP/C++, which require 3-4KB of code
-and a few hundred bytes of RAM, and the ultra-lightweight <A
-HREF="http://www.state-machine.com/products/">QP-nano</A>, which
-requires only 1-2KB of code and just several bytes of RAM.
-
-QP can work with or without a traditional OS/RTOS. In the simplest
-configuration, QP can completely <strong>replace</strong> a traditional RTOS.
-QP includes a simple non-preemptive scheduler and a fully preemptive kernel
-(<strong>%QK</strong>), which have been ported to several popular CPUs and
-compilers including: ARM7/ARM9, ARM Cortex-M3, 80x86, Nios-II, MSP430, M16C,
-AVR, 80251, and others (see
-http://www.state-machine.com/downloads/).
-
-QP/C and QP/C++ can also work with a traditional OS/RTOS to take advantage of
-existing device drivers, communication stacks, and other middleware. QP has
-been ported to Linux/BSD, Windows, VxWorks, uC/OS-II, and other popular
-OS/RTOS (see http://www.state-machine.com/downloads/).
-
-\image html qp_datasheet.gif
-
-The <strong>QP Datasheet</strong>
-(see http://www.state-machine.com/products/QP_datasheet.pdf)
-provides a concise summary of QP features and benefits.
-
-Since its publication in 2002, hundreds of projects around the world have been
-using QP in all kinds of applications, such as consumer, medical, industrial,
-wireless, networking, research, defense, robotics, automotive, space
-exploration, and many others.
-
-QP is available for download from the following websites:
-- Quantum Leaps website: http://www.state-machine.com/downloads
-- SourceForge.net webiste: https://sourceforge.net/projects/qpc
-
-<HR>
+All QP&trade; frameworks can run on "bare-metal" single-chip microcontrollers, completely replacing a traditional Real-Time Operating System (RTOS). Ports and ready-to-use examples are provided for most major <a href="http://www.state-machine.com/downloads/index.php#QDK">CPU families</a>. QP/C and QP/C++ can also work with a traditional OS/RTOS, such as: <a href="http://www.state-machine.com/linux/">POSIX (Linux, QNX)</a>, <a href="http://www.state-machine.com/win32/">Windows</a>, <a href="http://www.state-machine.com/android/">Android-NDK</a>, <a href="http://www.state-machine.com/threadx/">ThreadX</a>, <a href="http://www.state-machine.com/ucos2/">MicroC/OS</a>, <a href="http://www.state-machine.com/freertos/">FreeRTOS</a>, etc.
+
+The behavior of active objects is specified in QP by means of <a href="http://en.wikipedia.org/wiki/UML_state_machine">hierarchical state machines (UML statecharts)</a>. The frameworks support manual coding of UML state machines in C or C++ as well as fully automatic code generation by means of the free graphical <a href="http://www.state-machine.com/qm/">QM&trade; modeling tool</a>.
+
+The QP frameworks are used in millions of products worldwide in aerospace, robotics, consumer electronics, wired and wireless telecommunications, industrial automation, transportation, and many more. The QP frameworks and the QM modeling tool receive over <a href="http://sourceforge.net/projects/qpc/files/stats/timeline?dates=2012-08-28+to+2013-08-28">30,000 downloads a year</a> (not even counting downloads of QP ports).
+
+QP is available for download from <a href="http://sourceforge.net/projects/qpc">SourceForge.net</a>--the world's biggest open source repository. The summary of available downloads is also available from <a href="http://www.state-machine.com/downloads">Quantum Leaps download page</a>. 
 
-\section starting Getting Started with QP/C
+For more information about QP, please visit:
+<a href="http://www.state-machine.com/qp"><strong>state-machine.com/qp</strong></a>
 
-QP/C is distributed in a simple platform-independent ZIP file or in a
-self-extracting Windows executable. Either way, installing QP/C requires
-simply decompressing the provided archive into a directory of your choice
-(e.g., \c qpc for QP/C). The Section \ref files_page describes the content
-of the standard QP/C distribution.
+<HR>
+\section tutor QP/C Tutorial
 
-The <STRONG>QP/C Tutorial</STRONG> explains all steps necessary to develop a
+The \ref tutorial explains all steps necessary to develop a
 non-trivial QP/C application. The Tutorial is based on Chapter 1 of
 <I>Practical UML Statecharts in C/C++, Second Edition</I>.
 
 \image html qp_tutorial.jpg
 
-- \subpage tutorial_page
-    - \ref installing
-    - \ref lets_play
-    - \ref main_function
-    - \ref design
-    - \ref active_objects
-    - \ref events
-    - \ref coding_hsm
-    - \ref execution
-    - \ref tracing
-    - \ref comparison
-    - \ref summary
-
 <HR>
-
-
 \section PSiCC2 Practical UML Statecharts in C/C++, Second Edition
 
 All versions of QP are described in detail in the book <I>Practical UML
@@ -126,14 +72,11 @@ next. This background is designed to help software developers in making the
 transition from the traditional sequential to the modern event-driven
 programming, which can be one of the trickiest paradigm shifts.
 
-- Visit the accompanying website to the book at
-http://www.state-machine.com/psicc2/
-- Order the book from Amazon.com at
-http://www.amazon.com/exec/obidos/ASIN/0750687061/quantumleap06-20
-
-<HR>
+- Visit the <a href="http://www.state-machine.com/psicc2/">accompanying website to the book</a>
+- Order the book from <a href="http://www.amazon.com/exec/obidos/ASIN/0750687061/quantumleap06-20">Amazon.com</a>.
 
 
+<HR>
 \section licensing Licensing Policy for QP
 
 All versions of the QP software are available under <A
@@ -143,28 +86,26 @@ closed source software licensing models are combined.
 
 \subsection open Open Source Licensing
 
-All versions of the QP software are available under the  \ref gpl2_page
-(GPL2), as published by the Free Software Foundation and included in every
-distribution of the QP software. The GPL2 license is probably the best known
+All versions of the QP software are available under the GNU General Public
+License (GPL), as published by the Free Software Foundation and included in every
+distribution of the QP software. The GPL license is probably the best known
 and most established open source license. It is fully compatible with the Open
 Source Definition, is endorsed by the Free Software Foundation, and has been
 approved by the Open Source Initiative.
 
-Please note that GPL2 applies to software based not upon how it is used but
+Please note that GPL applies to software based not upon how it is used but
 upon how it is distributed. In this respect GPL2 can be restrictive, because
-GPL2 Section 2(b) requires that if you distribute the original software or any
-derivative works based on the software under copyright law, you must release
-all such derivative works also under the terms of the GPL2 open source
-license. GPL2 clearly specifies that distributing the original software or any
+GPL version2 Section 2(b) requires that if you distribute the original software
+or any derivative works based on the software under copyright law, you must release
+all such derivative works also under the terms of the GPL open source
+license. GPL clearly specifies that distributing the original software or any
 derivative works based upon it in binary form (e.g., embedded inside devices)
 also represents distribution of the software.
 
-To read more about open source licensing for QP or QP-nano, or to
-contribute work to the open source community, please visit the following
-website:
+To read more about open source licensing for QP/C, QP/C++, or QP-nano,
+please visit the following website:
 
 - http://www.state-machine.com/licensing/open.php
-- \ref gpl2_page
 
 or please contact Quantum Leaps, LLC via the following e-mail address:
 
@@ -196,143 +137,16 @@ or please contact Quantum Leaps, LLC via the following e-mail address:
 - info@quantum-leaps.com
 
 <HR>
-
 \section contact Contact Information
 
-- Quantum Leaps Web site:  http://www.state-machine.com
-- Quantum Leaps licensing: http://www.state-machine.com/licensing
-- Quantum Leaps downloads: http://www.state-machine.com/downloads
+- Quantum Leaps Web site:   http://www.state-machine.com
+- Quantum Leaps licensing:  http://www.state-machine.com/licensing
+- QP/QM on SourceForge.net: http://sourceforge.net/projects/qpc
 - e-mail: info@quantum-leaps.com
-- Skype: quantum-leaps (US Eastern Standard Time)
 - Toll-free: 1-866-450-LEAP (US Eastern Standard Time)
 
-\image html logo_ql_TM.jpg
-Copyright &copy; 2002-2011 Quantum Leaps, LLC. All Rights Reserved.\n
-http://www.state-machine.com
-*/
-
-/**
-\page qep_page QEP Hierarchical Event Processor
-
-\image html logo_qep_TM.jpg
-
-Quantum Event Processor&tm; (%QEP) is a generic, portable, and reusable
-hierarchical event processor that processes events according to the general
-semantics of UML state machines [<A
-HREF="http://www.omg.org/docs/ptc/03-08-02.pdf">UML document
-ptc/03-08-02</A>]. %QEP&tm; allows you to map UML state diagrams directly and
-clearly to code without the assistance of complex tools. It allows you to
-create better designs because you can think in terms of events, states, and
-transitions directly at the level of the C or C++ programming language. The
-resulting code is smaller, cleaner, more robust, and simpler to understand and
-maintain. The testing is faster, more rigorous, and more complete because
-state machine approach cleanly defines a limited state space for the system
-and constraints the possible transitions among the states.
-
-%QEP&tm; provides facilities for executing <STRONG>Hierarchical State
-Machines</STRONG> (HSMs) as well as the simpler traditional <STRONG>Finite
-State Machines</STRONG> (FSMs). %QEP can operate with almost any event queuing
-and dispatching mechanisms, which are also necessary components of a
-hypothetical state machine [<A
-HREF="http://www.omg.org/docs/ptc/03-08-02.pdf">ptc/03-08-02</A>]. For
-example, %QEP can be used with virtually any event-driven environment, such as
-any Graphical User Interface system. When used in the domain of real-time
-embedded (RTE) systems, %QEP can be combined with other <STRONG>QP</STRONG>
-components designed specifically for RTE systems. %QEP has been used in
-hundreds of event-driven applications worldwide and is described in Part 1 of
-the book \ref PSiCC2, Newnes 2008.
-
-Please refer to Section \ref coding_hsm in the \ref tutorial_page for
-information on coding UML-compliant hierarchical state machines with QEP.
-
-\image html logo_ql_TM.jpg
-Copyright &copy; 2002-2011 Quantum Leaps, LLC. All Rights Reserved.\n
-http://www.state-machine.com
-*/
-
-/**
-\page qf_page QF Real-Time Framework
-
-\image html logo_qf_TM.jpg
-
-Quantum Frameowrk&tm; (%QF) is a reusable event-driven application framework
-for executing concurrent state machines specifically designed for real-time
-embedded (RTE) systems. The use of QF generally simplifies the design of
-event-driven software by allowing the application to be divided into multiple
-active objects  that the framework manages. Active objects in %QF are
-encapsulated tasks (each embedding a state machine and an event queue) that
-communicate with one another asynchronously by sending and receiving events.
-Within an active object, events are processed sequentially in a
-run-to-completion (RTC) fashion, while %QF encapsulates all the details of
-thread-safe event exchange and queuing.
-
-Most of %QF&tm; is written in portable ANSI-C, with microprocessor-specific,
-compiler-specific, or operating system-specific code kept to a minimum for
-ease of portability. %QF is designed to work with Quantum Event Processor
-(%QEP) and a Real Time Operating System (RTOS) of your choice, or even with
-just "main+ISRs" configuration. The framework is very compact, typically
-taking up about 4KB of code and data (including the \ref
-qep_page). %QF has been used in hundreds of event-driven applications
-worldwide and is described in Part 2 of the book \ref PSiCC2, Newnes 2008.
-
-Please refer to the \ref tutorial_page for information on implementing
-event-driven applications with the QF real-time framework and other components
-of the QP event-driven platform.
-
-
-\image html logo_ql_TM.jpg
-Copyright &copy; 2002-2011 Quantum Leaps, LLC. All Rights Reserved.\n
-http://www.state-machine.com
-*/
-
-/**
-\page qk_page QK Preemptive Run-To-Completion Kernel
-
-\image html logo_qk_TM.jpg
-
-Quantum Kernel&tm; (%QK) is a tiny preemptive real-time kernel specifically
-designed for executing independent tasks in a run-to-completion (RTC) fashion.
-As it turns out, the RTC-style processing universally applied in the \ref
-qf_page, and no need for blocking of active objects, allow %QK to be extremely
-simple and utilize only a single stack for all tasks and interrupts.
-
-%QK is not a standalone product but rather it requires a compatible
-version of %QF. %QK doesn't provide event queues, active objects, or even
-lookup tables used by the scheduler, because these elements are already part
-of the %QF. %QK is described in Chapter 10 of the book \ref PSiCC2, Newnes
-2008.
-
-The \ref execution part of the QP Tutorial describes how to use the QK kernel
-in an example.
-
 \image html logo_ql_TM.jpg
 Copyright &copy; 2002-2013 Quantum Leaps, LLC. All Rights Reserved.\n
 http://www.state-machine.com
 */
 
-/**
-\page qs_page QS Software Tracing Instrumentation (Target Component)
-
-\image html logo_qs_TM.jpg
-
-Quantum Spy&tm; (%QS) is a real-time tracing instrumentation built into the
-\ref qep_page, the \ref qf_page, and the \ref qk_page components and also
-available to the Application code. %QS allows you to gain unprecedented
-visibility into your application by selectively logging almost all interesting
-events occurring within state machines, the framework, the kernel, and your
-application code. %QS event logging is minimally intrusive, offers precise
-time-stamping, sophisticated runtime filtering of events, and good data
-compression. %QS can be configured to send the real-time data out of the
-serial or Ethernet port of the target device, or even write the data to a
-file. %QS is described in Chapter 11 of the book \ref PSiCC2, Newnes 2008.
-
-Every software tracing system consists of a target component and a host
-component. Section \ref execution of the \ref tutorial_page describes how to
-enable the QS target component in an example. The host component for the %QS
-software tracing system is the <STRONG>QSPY host application</STRONG>.
-Section \ref qspy_page describes how to use the QSPY host application.
-
-\image html logo_ql_TM.jpg
-Copyright &copy; 2002-2011 Quantum Leaps, LLC. All Rights Reserved.\n
-http://www.state-machine.com
-*/

+ 11 - 55
doxygen/qpc_files.txt

@@ -60,42 +60,25 @@ qpc\                 - QP/C root directory
   | | | | +-dpp-gui\    - Dining Philosopher Problem (DPP) example (GUI)
   | | | | +-game-gui\   - "Fly 'n' Shoot" game example (GUI)
   | |
-  | +-80x86\         - Examples for the 80x86 processor
-  | | +-dos\         - Examples for DOS with the "vanilla" cooperative kernel
-  | | | +-watcom\    - Examples with the Open Watcom compiler
-  | | | | +-l\       - Examples using the Large memory model
-  | | | | | +-dpp\   - Dining Philosopher Problem (DPP) example for DOS
-  | | | | | +-game\       - "Fly 'n' Shoot" game example
-  | | | | | +-calc\    - Calculator example
-  | | | | | +-qhsmtst\ - QHsmTst example (PSiCC2  in Chapter 2)
-  | | | | | +-comp\    - "Orthogonal Component" pattern (PSiCC2 Chapter 5)
-  | | | | | +-defer\   - "Deferred Event" pattern (PSiCC2 Chapter 5)
-  | | | | | +-history\ - "Transition to History" pattern (PSiCC2 Chapter 5)
-  | | | | | +-hook\    - "Ultimate Hook" pattern (Chapter 5)
-  | | | | | +-reminder\ - "Reminder" pattern (PSiCC2 Chapter 5)
-  | | |
-  | | +-qk\          - Examples for the QK preemptive kernel
-  | | +-ucos2\       - Examples for the µC/OS-II RTOS
-  | |
-  | +-arm-cortex\    - Examples for ARM Cortex processor
+  | +-arm-cm\        - Examples for ARM Cortex-M processor
   | | +-vanilla\     - Examples for the cooperative "vanilla" kernel
   | | | +-iar\       - Examples with the IAR compiler
-  | | | | +-dpp-ev-lm3s811\  - DPP example for for EV-LM3S811 board
-  | | | | +-game-ev-lm3s811\ - "Fly 'n' Shoot" example for EV-LM3S811 board
+  | | | | +-dpp_qk-lm3s811\  - DPP example for for EK-LM3S811 board
+  | | | | +-game_qk-lm3s811\ - "Fly 'n' Shoot" example for EK-LM3S811 board
   | | | | +-. . .    - Other examples for ARM Cortex
   | | | +-gnu\       - Examples with the GNU compiler (Code Sourcery G++)
-  | | | | +-dpp-ev-lm3s811\  - DPP example for for EV-LM3S811 board
-  | | | | +-game-ev-lm3s811\ - "Fly 'n' Shoot" example for EV-LM3S811 board
+  | | | | +-dpp_qk-lm3s811\  - DPP example for for EK-LM3S811 board
+  | | | | +-game_qk-lm3s811\ - "Fly 'n' Shoot" example for EK-LM3S811 board
   | | | | +-. . .    - Other examples for ARM Cortex
   | | |
   | | +-qk\          - Examples for the preemptive QK kernel
   | | | +-iar\       - Examples with the IAR compiler
-  | | | | +-dpp-qk-ev-lm3s811\  - DPP example for for EV-LM3S811 board
-  | | | | +-game-qk-ev-lm3s811\ - "Fly 'n' Shoot" example for EV-LM3S811 board
+  | | | | +-dpp-qk_qk-lm3s811\  - DPP example for for EK-LM3S811 board
+  | | | | +-game-qk_qk-lm3s811\ - "Fly 'n' Shoot" example for EK-LM3S811 board
   | | | | +-. . .    - Other examples for ARM Cortex
   | | | +-gnu\       - Examples with the GNU compiler (Code Sourcery G++)
-  | | | | +-dpp-qk-ev-lm3s811\  - DPP example for for EV-LM3S811 board
-  | | | | +-game-qk-ev-lm3s811\ - "Fly 'n' Shoot" example for EV-LM3S811 board
+  | | | | +-dpp-qk_qk-lm3s811\  - DPP example for for EK-LM3S811 board
+  | | | | +-game-qk_qk-lm3s811\ - "Fly 'n' Shoot" example for EK-LM3S811 board
   | | | | +-. . .    - Other examples for ARM Cortex
   | |
   | +-. . .          - Examples for other CPUs and compiler
@@ -113,34 +96,7 @@ qpc\                 - QP/C root directory
   | | |
   | | +-vc\          - Port with the Visual C++ compiler
   | |
-  | +-80x86\         - Ports to the 80x86 processor
-  | | +-dos\         - Ports to DOS with the "vanilla" cooperative kernel
-  | | | +-watcom\    - Ports with the Open Watcom compiler
-  | | | | +-l\       - Ports for the Large memory model
-  | | | | | +-dbg\   - Debug build
-  | | | | | | +-qp.lib - QP  library
-  | | | | | +-rel\   - Release build
-  | | | | | +-spy\   - Spy build (with software instrumentation)
-  | | | | | | +-qp.lib - QP library
-  | | | | | |
-  | | | | | +-make.bat   - batch script for building the QP libraries
-  | | | | | +-qep_port.h - QEP platform-dependent include file
-  | | | | | +-qf_port.h  - QF  platform-dependent include file
-  | | | | | +-qs_port.h  - QS  platform-dependent include file
-  | | |
-  | | +-qk\          - Ports to the QK preemptive kernel
-  | | | +-. . .
-  | | |
-  | | +-ucos2\       - Ports to the MicroC/OS-II RTOS
-  | | | +-watcom\    - Ports with the Open Watcom compiler
-  | | | | +-l\       - Ports using the Large memory model
-  | | | | | +-ucos2.86\  - MicroC/OS-II v2.86 object code and header files
-  | | | | | +-src\       - Port-specific source files
-  | | | | | | +-qf_port.c - QF port to µC/OS-II source file
-  | | | | | +-. . .
-  | | |
-  | |
-  | +-arm-cortex\    - Ports to the ARM Cortex processor
+  | +-arm-cm\        - Ports for ARM Cortex-M processor
   | | +-vanilla\     - Ports to the cooperative "vanilla" kernel
   | | | +-iar\       - Ports with the IAR compiler
   | | | | | +-dbg\   - Debug build
@@ -199,5 +155,5 @@ qpc\                 - QP/C root directory
 \endcode
 
 \image html logo_ql_TM.jpg
-Copyright &copy; 2002-2012 Quantum Leaps, LLC. All Rights Reserved.
+Copyright &copy; 2002-2013 Quantum Leaps, LLC. All Rights Reserved.
 */

+ 328 - 726
doxygen/qpc_rev.txt

@@ -1,10 +1,272 @@
 /**
 \page rev_page QP/C Revision History
+
+\section qpc_5_1_0 Version 5.1.0, Release date: Sep 23, 2013
+
+This release brings significant improvements to the QS software tracing
+implementation and also brings important changes the ARM Cortex-M port.
+
+\note <b>QP/C 5.1.0 requires changing the interrupt priority setting in the
+existing ARM Cortex-M applications</b>. Specifically, you need to set the
+interrupt priorities equal or lower than <b>QF_AWARE_ISR_CMSIS_PRI</b> constant
+provided in the qf_port.h header file.
+
+Changes to the QS software tracing component in detail:
+
+1. Optimized the internal QS implementation of all functions that insert
+trace data into the trace buffer. The general idea of the optimization
+is to extensively use automatic variables instead of global variables
+(such as buffer head and tail indexes, the running checksum, etc.). For
+the modern CPUs (such as ARM) this resulting machine code performs most
+operations in registers, instead of constantly updating the memory
+through the expensive load/store instructions. The time savings through
+avoiding load/store instructions are significant, even after taking the
+performance hit from loading the registers from the globals in the
+beginning of each function and storing the final register values into
+the globals at the end.
+
+2. Reduced the QS code size by using loops instead of unrolled-loops as
+before. This reduced the QS component size from over 4KB to 1.7KB (for
+ARM Cortex-M3/M4, IAR compiler).
+
+3. Modified the make scripts for building QP libraries to use
+higher-level optimization for the QS software tracing functions in the
+SPY build configuration. This brings additional 20-50% speed
+improvement, depending on the compiler and optimization options used.
+Please note that only the QS component is built with high-optimization.
+The QEP, QF, and QK components in the SPY configuration are still built
+with low-optimization level, so that the application can be conveniently
+debugged.
+
+4. Reduced the number of QS global filters from 256 to 124 (0x7C). This
+enables the code to avoid escaping the trace record numbers (because
+they cannot overlap the special flag byte 0x7E or the escape byte 0x7D)
+and also speeds up the QS_filterOff(QS_ALL_RECORDS) function, which is
+useful for stopping the trace quickly to avoid overwriting some
+interesting data with the new data.
+
+5. An empty QS record and the QS_RESET record are now inserted
+automatically into the trace buffer in the function QS_initBuf(). The
+empty QS record/QS_RESET pair provides a clean start of a session and
+allows the QSPY host application to re-synch with the data stream, even
+if the last QS record of a previous session is incomplete. This ability
+is very helpful for re-setting the target while collecting a trace.
+
+Overall, lab tests for ARM Cortex-M4 with the IAR compiler show that the
+processing time of the QS_u32_() function (the one frequently used to
+store pointers and timestamps) dropped from 233 CPU cycles for QP 5.0
+with low-level optimization to just 76 cycles for QP 5.1 with high-level
+of optimization. At the same time, the code size of this function dropped
+from 876 bytes to 274 bytes.
+
+
+Changes to the QP ports to ARM Cortex-M in detail:
+
+QP 5.1.0 never completely disables interrupts in the ARM Cortex-M3/M4
+cores, even inside the critical sections. On Cortex-M3/M4 (ARMv7-M
+architectures), the QP port disables interrupts selectively using the
+BASEPRI register. (NOTE: The BASEPRI register is not implemented in the
+ARMv6-M architecture (Cortex-M0/M0+), so Cortex-M0/M0+ need to use the
+PRIMASK register to disable interrupts globally).
+
+This new policy of disabling interrupts divides interrupts into
+"kernel-unaware" interrupts, which are never disabled, and
+"kernel-aware" interrupts, which are disabled in the QP critical
+sections. Only "kernel-aware" interrupts are allowed to call QP
+services. "Kernel-unaware" interrupts are *NOT* allowed to call any QP
+services and they can communicate with QP only by triggering a
+"kernel-aware" interrupt (which can post or publish events).
+
+As mentioned above, all QP ports to ARM Cortex-M included in the QP
+5.1.0 Baseline Code provide the constant QF_AWARE_ISR_CMSIS_PRI, which
+must be used to offset the "kernel-aware" interrupt priorities.
+
+All example projects for ARM Cortex-M included in the QP 5.1.0 Baseline
+Code demonstrate the recommended way of assigning interrupt priorities
+in your applications. The initialization consist of two steps:
+
+1. you enumerate the "kernel-unaware" and "kernel-aware" interrupt
+priorities (whereas you offset the "kernel-aware" priorities by the
+constant QF_AWARE_ISR_CMSIS_PRI) and
+
+2. you assign the priorities to *ALL* interrupts by calling the
+NVIC_SetPriority() CMSIS function.
+
+\note Leaving the interrupt priority at the default value of zero
+(the highest priority) is most likely <b>incorrect</b>, because the
+"kernel-unaware" interrupts <b>cannot</b> call any QP services.
+
+For more information, please read the short Application Note "Setting
+ARM Cortex-M Interrupt Priorities in QP 5.1" available at:
+http://www.state-machine.com/arm/AN_ARM-Cortex-M_Interrupt-Priorities.pdf
+
 
-QP/C Revision History
-=====================
+\section qpc_5_0_0 Version 5.0.0, Release date: Sep 10, 2013
+
+\note QP/C 5.0.0 remains backwards-compatible with the existing QP/C 4.x
+applications.
+
+The main purpose of this <b>milestone QP/C release</b> is to enable the QM
+modeling tool to generate a new type of state machine code (requires QM
+version 3.0.0, which is still in development as of this writing).
+
+This new type of state machine implementation in QP/C 5 is based on the
+new ::QMsm class, which takes advantage of the QM tool as an advanced
+"state machine compiler". QM can perform optimizations that were not
+possible with the C pre-processor alone. Specifically, the QM can easily
+determine the LCA (Least-Common-Ancestor) state for every transition and
+it can generate the complete transition-sequences (sequences of
+exit/entry/initial actions) at code-generation time. The resulting code
+can be still highly human-readable, but it will no longer be
+human-maintainable. The lab tests indicate that the new "housekeeping"
+code for executing hierarchical state machines can be about twice as
+fast as the previous code based on the ::QHsm class. Additionally, the new
+code requires less run-time support (smaller event processor) and uses
+70% less of stack space in the call to the QMsm_dispatch() operation
+than QHsm_dispatch().
+
+The next big feature introduced in QP/C 5 is polymorphism ("virtual"
+functions) for basic operations, such as state machine init() and
+dispatch() and active object start(), post(), and postLIFO() perations.
+Making theses functions "virtual" means that all these operations can be
+re-defined in sub-classes of state machines and active objects. This, in
+turn, allows a single application to use a mix of state machine classes
+derived from the new QMsm base class with state machines derived from
+the QHsm base class, each one using a different state machine
+implementation strategy. Additionally, the virtual post() operation
+could be very useful for implementing various Proxy active objects
+(e.g., for active object event posting across networks).
+
+Another big feature introduced in QP/C 5 are the multiple, independent
+system clock tick rates for time events. The number of system tick rates
+can be now configured in the QP/C ports. For example, a digital watch
+can use a "fast" clock tick rate of 100Hz and a "slow" clock tick rate
+of only 1Hz. These clock tick rates can be managed independently, so for
+example, the fast clock tick rate can be shut down in the absence of
+time events assigned to this rate. This feature allows the applications
+to implement sophisticated power-saving policies.
+
+As yet another important feature, QP/C adds a new "extended" API for
+non-asserting event allocation and posting. This feature is intended for
+situations, where an application is hammered with external events that
+at times arrive too fast for processing, but that can be ignored under
+the overload conditions. In those cases firing an assertion inside the
+framework is undesirable. The non-asserting API allows a designer to
+request a safety-margin when allocating or posting an event. The event
+is not allocated/posted if the safety margin cannot be satisfied at the
+time of the call. On the other hand, the safety margin allows the
+application to still use the regular (asserting) event allocation and
+posting, because the event pools and event queues are guaranteed to
+maintain a minimal margin for safe operation.
+
+Finally, QP/C adds a number of smaller features and improvements,
+summarized in the following detailed list of changes:
+
+1. Added the new QMsm "class" to qep.h. Changed the inheritance tree by
+deriving QHsm and QFsm from the QMsm base class. Added virtual table
+structures for QMsm, QHsm, and QFsm (polymorphism).
+    - added macro QMSM_INIT() to polymorphically call the state
+      machine initialization implementation in the QMsm base class and
+      all subclasses.
+    - added macro QMSM_DISPATCH() to polymorphically call the state
+      machine event dispatching implementation  in the QMsm base class
+      and all subclasses.
+
+2. Added new source files qmsm_ini.c and qmsm_dis.c to the QEP. These
+files implement the QMsm_init() and QMsm_dispatch() functions, respectively.
+
+3. Added the new QMActive "class" to qf.h. Extended the inheritance
+tree to derive QMActive from QActive. Added virtual table structures for
+QMActive and QActvie (polymorphism).
+    - modified macro QACTIVE_POST() to polymorphically call the direct
+      event posting to an active object.
+    - modified macro QACTIVE_POST_LIFO() to polymorphically call the
+      post-LIFO (self-posting) to an active object.
+    - modified macro QACTIVE_START() to polymorphically call the
+      starting of an active object.
+
+4. Added the new non-asserting API to qf.h:
+    - renamed internal function QF_new_() to QF_newX_(), the latter one
+      taking the argument 'margin' for allocating events. The function
+      returns NULL if the event pool has less free events than the
+      specified margin. The function asserts if the margin is zero and
+      the event can't be allocated.
+    - added function QActive_post() to post an event to the given
+      active object. The function does not post the event if the target
+      event queue has less free slots than the specified margin. The
+      function asserts if the margin is zero and the event can't be
+      posted.
+    - added "extended" macro QF_NEW_X() for allocating events with a
+      margin.
+    - added "extended" macro QACTIVE_POST_X() for posting events with a
+      margin.
+
+5. Added the multiple system clock tick rates feature in qf.h:
+    - added new configuration macro #QF_MAX_TICK_RATE, which specifies
+      the number of clock tick rates. This macro is to be defined in
+      the QF ports (in the qf_port.h header file). If the macro is
+      undefined, the default value is 1 (one clock tick rate).
+    - renamed and re-implemented the QF_tick() function as the
+      "extended" QF_tickX() function with the argument 'tickRate' for
+      processing time events allocated to different clock rates. The
+      application must call QF_tickX(0), QF_tickX(1), ... at the
+      specified tick rates from ISRs or *tasks*.
+    - added an "extended" time event constructor QTimeEvt_ctorX(), which
+      assigns a time event to a specific tick rate as well as specific
+      active object.
+    - renamed and re-implemented the internal function QTimeEvt_arm_()
+      to a public function QTimeEvt_armX() for arming time events
+      initialized with the "extended" constructor. The QTimeEvt_armX()
+      function is the new recommended API for arming time events, both
+      one-shot and periodic.
+    - re-implemented QTimeEvt_disarm() and QTimeEvt_rarm().
+    - renamed QF_noTimeEvtsActive() to the "extended" version
+      QF_noTimeEvtsActiveX(), which checks time events assigned to the
+      given tick rate.
+
+6. Modified QS (Quantum Spy) software tracing implementation:
+    - added additional tick rate byte to the trace records QS_QF_TICK
+      and QS_QFF_TIMEEVT_*.
+    - added new trace records QS_QF_ACTIVE_POST_ATTEMPT,
+      QS_QF_EQUEUE_POST_ATTEMPT, and QS_QF_MPOOL_GET_ATTEMPT for the
+      "extened" non-asserting event allocation and posting.
+    - added new trace records QS_TEST_RUN and QS_TEST_FAIL for future
+      support for unit testing.
+    - added new QS source file qs_dict.c with functions QS_*_dict() to
+      generate various dictionary entries. Changed the macros
+      QS_*_DICTIONARY() to call these functions. This was done to
+      significantly reduce the amount of tracing code needed to send the
+      dictionaries from applications.
+    - grouped together the various QS variables (such as filters, trace
+      buffer indexes, etc.) in a single struct, which results in a more
+      efficient code for various QS operations.
+
+7. Changed the structure of the ARM Cortex-M ports
+    - renamed the sub-directory for ARM Cortex-M ports and examples
+      from "arm-cortex" to "arm-cm". This is done to avoid confusion
+      with other ARM Cortex variants, such as Cortex-A/R, which very
+      different from Cortex-M.
+    - removed the CMSIS (Cortex Microcontroller Software Interface
+      Standard) directories from the Cortex-M examples and moved it to
+      the common location in the %QPC%\ports\arm-cm\cmsis\ directory.
+      Upgraded the CMSIS to the latest version 3.20.
+    - added the ARM Cortex-M ports and examples with Keil/ARM MDK to
+      the QP Baseline Code.
+    - upgraded ARM Cortex-M ports with IAR to the latest IAR EWARM 6.60
+    - upgraded ARM Cortex-M ports with Sourcery CodeBench to the latest
+      version 2013.05-53.
+
+8. Added the requested simple "Blinky" example for Windows and ARM
+Cortex-M (with the GNU, IAR, and Keil toolsets).
+    - Added "Getting Started with QP/C" guide based on the Blinky
+      example.
+
+9. Updated the Doxygen documentation (QP/C Reference Manual)
+    - updated the QP/C tutorial
+    - added documentation and code samples
 
-\section qpc_4_5_04 Version 4.5.04 (Product) Release date: Feb 08, 2013
+<HR>
+\section qpc_4_5_04 Version 4.5.04, Release date: Feb 08, 2013
 
 The main purpose of this release is adding support for the ARM Cortex-M4F
 processors with the hardware Floating-Point Unit (FPU). The QP/C ports
@@ -12,6 +274,9 @@ to Cortex-M4F take full advantage of the "lazy stacking" feature of the
 FPU registers, and by doing so offer the most efficient preemptive
 multitasking on this processor.
 
+\note QP/C Version 4.5.04 preserves full compatibility with QM 2.2.03
+and all existing QDKs for QP/C 4.5.xx.
+
 Changes in detail:
 
 1. Added ports and examples for ARM Cortex-M4F with the EK-LM4F120XL
@@ -39,11 +304,8 @@ several typos.
 8. Removed the Qt ports and examples from the QP/C Baseline Code and
 moved them to the separate QDK/C-Qt.
 
-\note QP/C Version 4.5.04 preserves full compatibility with QM 2.2.03
-and all existing QDKs for QP/C 4.5.xx.
-
-
-\section qpc_4_5_03 Version 4.5.03 (Product) Release date: Nov 27, 2012
+<HR>
+\section qpc_4_5_03 Version 4.5.03, Release date: Nov 27, 2012
 
 This release changes the directory structure of QP ports to various
 operating systems, such as POSIX (Linux, BSD, etc.), Win32 (Windows),
@@ -51,8 +313,8 @@ Qt, etc. The OS ports are moved from the ports\80x86\ directory one
 level up to ports\. Also, the OS examples are moved from the
 examples\80x86\ directory one level up to examples\.
 
-
-\section qpc_4_5_02 Version 4.5.02 (Product) Release date: Aug 04, 2012
+<HR>
+\section qpc_4_5_02 Version 4.5.02, Release date: Aug 04, 2012
 
 The main purpose of this release is better, more comprehensive
 support for (rapid) prototyping of embedded QP applications on
@@ -73,7 +335,8 @@ takes the arguments for the event constructor. This generally
 allows creating dynamic events "on-the-fly" without a temporary
 pointer to the event. This QP configuration is demonstrated only
 in the QP port to Qt, but can be used in any other port.
-NOTE: The event constructor feature is NOT backward-compatible
+
+\note The event constructor feature is NOT backward-compatible
 with the existing applications.
 
 This release also adds a new macro QF_MPOOL_EL, which is
@@ -140,8 +403,8 @@ names for user-defined trace records
 15. Added new macro QS_RESET() to QS for telling the QSPY application
 when the target resets. This allows QSPY to reset its internal state.
 
-
-\section qpc_4_5_01 Version 4.5.01 (Product) Release date: Jun 14, 2012
+<HR>
+\section qpc_4_5_01 Version 4.5.01, Release date: Jun 14, 2012
 
 The main purpose of this minor release is providing improved
 MISRA-compliant state machine implementation. Specifically, a new
@@ -152,7 +415,7 @@ handler can return Q_UNHANDLED(), which will cause the QEP event
 processor to propagate the event to the superstate, which is what
 UML semantics prescribes.
 
-NOTE: These change to the QEP event processor is completely
+\note These change to the QEP event processor is completely
 backwards-compatible. All state handler functions coded the old
 way will continue to handle the guard conditions correctly and
 in accordance with the UML specification. The new Q_UNHANDLED()
@@ -177,7 +440,7 @@ Q_RET_UNHANDLED.
 5. Modified qs.h and qs_dummy.h to add the User record dictionary
 trace record and macro QS_USR_DICTIONARY().
 
-NOTE: This new trace record requires the updated QSPY 4.5.01.
+\note This new trace record requires the updated QSPY 4.5.01.
 
 6. Corrected qfsm_dis.c, which did not generate QS trace records
 for entry and exit from non-hierarchical states.
@@ -189,8 +452,8 @@ to the latest version IAR EWARM 6.40.
 slot function, but instead to allow defining this slot function in
 the BSP of the application.
 
-
-\section qpc_4_5_00 Version 4.5.00 (Product) Release date: May 29, 2012
+<HR>
+\section qpc_4_5_00 Version 4.5.00, Release date: May 29, 2012
 
 The main pupose of this relase is to improve host-based development of QP
 applications, which is critical for Test-Driven Development (TDD). Among
@@ -207,7 +470,7 @@ Changes in detail:
 with the Qt framework. Also, for consistency, renamed the file qevent.h
 to qevt.h and the macro Q_EVENT_CAST() to Q_EVT_CAST().
 
-NOTE: To minimize impact of this change on the existing QP ports and
+\note To minimize impact of this change on the existing QP ports and
 applications, the name QEvent is provided as well, but this can be
 suppressed by defining the configuration macro Q_NQEVENT in qep_port.h.
 
@@ -225,7 +488,7 @@ impact the files: qte_*.c.
 4. Added return value to QF_run() to allow transfer of the exit
 status to the destop operating systems.
 
-NOTE: This modification haves impact on most QP/C ports, because
+\note This modification haves impact on most QP/C ports, because
 the QF_run() function must now return a int16_t value.
 
 5. Eliminated the 'running' member of the QActive class, which
@@ -254,7 +517,7 @@ that it can be convenienty included as part of the QP library.
 This allows direct QS tracing output to the screen for QP applications
 running on the desktop.
 
-NOTE: This change is part of the Qtools release 4.5.00.
+\note This change is part of the Qtools release 4.5.00.
 
 10. Modified the QP ports to Win32_1t (both the MinGW and VC2008) to
 output QS trace data directly to the stdout via the QSPY host-application
@@ -267,8 +530,8 @@ applications (DPP and PELICAN crossing).
 12. Added GNU compiler option -pthread to QP ports for POSIX with
 P-threads, including QP ports and examples for Linux and Mac OS X.
 
-
-\section qpc_4_4_01 Version 4.4.01 (Product) Release date: Mar 23, 2012
+<HR>
+\section qpc_4_4_01 Version 4.4.01, Release date: Mar 23, 2012
 
 The relase fixes a bug in Q-SPY software tracing, which caused the
 linking error: "QS_SIG_() not defined". This release also includes
@@ -279,8 +542,8 @@ a few cosmetic changes, which the Microchip C18 compiler didn't like.
 2. Changed (QEvent *)0 to (QEvent const *)0 in source files
    qeq_get.c, qeq_init.c, and qa_get_.c.
 
-
-\section qpc_4_4_00 Version 4.4.00 (Product) Release date: Jan 30, 2012
+<HR>
+\section qpc_4_4_00 Version 4.4.00, Release date: Jan 30, 2012
 
 The main pupose of this relase is MISRA-C:2004 compliance, strong-type
 checking compliance, update of PC-Lint option files and tests, and
@@ -294,7 +557,7 @@ to reduce the number of preprocessor #if nesting levels below 8,
 which is the ANSI-C limit. This was done to comply with the MISRA-C
 rule 1.1 (all code shall conform to ANSI/ISO C).
 
-NOTE: This modifications have impact on most QP/C ports, because
+\note This modifications have impact on most QP/C ports, because
 the qp_port.h header file must be removed from the port.
 
 2. Added the PC-Lint option files std.lnt and lib-qpc.lnt to the
@@ -307,7 +570,7 @@ have been moved to PC-Lint option files.
 the # operator (MISRA rule 19.13). This macro now requires the argument
 enclosed in doble quotes "".
 
-NOTE: This modification has impact on some QP/C ports.
+\note This modification has impact on some QP/C ports.
 
 4. Added typedefs for char_t, int_t, float32_t, and float64_t to
 event.h header file for compliance with MISRA-C:2004 rules 6.1 and 6.3.
@@ -339,8 +602,8 @@ qpc/doc/, with the following Application notes:
 "MISRA-C:2004 Compliance Matrix", "Quantum Leaps Coding Standard",
 "QP and ARM Cortex-M, and QP and Windows",
 
-
-\section qpc_4_3_00 Version 4.3.00 (Product) Release date: Nov 01, 2011
+<HR>
+\section qpc_4_3_00 Version 4.3.00, Release date: Nov 01, 2011
 
 1. This release changes the names of critical section macros and
 introduces macros for unconditional interrupt disabling/enabling.
@@ -348,7 +611,7 @@ This is done to simplify and speed up the built-in Vanilla and QK
 kernels, which no longer are dependent on the interrupt locking
 policy.
 
-NOTE: The change in handling the critical section in the Vanilla and
+\note The change in handling the critical section in the Vanilla and
 QK kernels can break QP ports, which use the "save and restore
 interrupt lock" policy, because all such ports must also define
 unconditional interrupt disabling and enabling.
@@ -371,8 +634,8 @@ latest IAR EWARM version 6.30.
 6. Upgraded the examples for ARM Cortex with GNU (CodeSourcery) to the
 latest Sourcery CodeBench 2011.07-60.
 
-
-\section qpc_4_2_04 Version 4.2.04 (Product) Release date: Sep 24, 2011
+<HR>
+\section qpc_4_2_04 Version 4.2.04, Release date: Sep 24, 2011
 
 The main pupose of this relase is to provide a bug fix for the QK port
 to ARM Cortex processors. The bug fix addresses a very rare and
@@ -387,8 +650,8 @@ before the SVCall exception cleans up the stack. The bug fix is
 implemented in the qk_port.s file and consists of clearing the
 PENDSVSET bit programmatically inside PendSV_Handler.
 
-
-\section qpc_4_2_02 Version 4.2.02 (Product) Release date: Sep 08, 2011
+<HR>
+\section qpc_4_2_02 Version 4.2.02, Release date: Sep 08, 2011
 
 1. The main pupose of this relase is to repackage the default QP/C
 distribution to contain the single root directory qpc/ in the
@@ -401,8 +664,8 @@ Code Sourcery toolset (now Mentor Sourcery CodeBench). This is to
 distinguish libraries generated by different GNU-toolchains (such
 as CodeRed, Attolic, DevKit ARM, etc.)
 
-
-\section qpc_4_2_01 Version 4.2.01 (Product) Release date: Aug 13, 2011
+<HR>
+\section qpc_4_2_01 Version 4.2.01, Release date: Aug 13, 2011
 
 1. Modified file qassert.h to add assertion macros #Q_ASSERT_ID,
 #Q_REQUIRE_ID, #Q_ENSURE_ID, #Q_INVARIANT_ID, and #Q_ERROR_ID,
@@ -411,8 +674,8 @@ volatility of line numbers for indentifying assertions.
 
 2. Added QP port and examples for Mac OS X on 80x86.
 
-
-\section qpc_4_2_00 Version 4.2.00 (Product) Release date: Jul 14, 2011
+<HR>
+\section qpc_4_2_00 Version 4.2.00, Release date: Jul 14, 2011
 
 The goal of this milestone release is to extend the number of event
 pools (theoretically up to 255 pools) instead of just three event
@@ -482,8 +745,8 @@ framework.
 15. Upgraded the examples for ARM Cortex with IAR EWARM to the
 latest IAR EWARM 6.20.
 
-
-\section qpc_4_1_07 Version 4.1.07 (Product) Release date: Feb 28, 2011
+<HR>
+\section qpc_4_1_07 Version 4.1.07, Release date: Feb 28, 2011
 
 The goal of this release is to improve the ease of experimenting with
 QP/C on the desktop. This release adds support for Windows (Win32) to
@@ -502,7 +765,8 @@ building all QP/C libraries from the IDE. Three build configurations
 2. Added Win32 port with the MinGW comiler (ports/80x86/win32/mingw).
 This directory contains the Makefile for building all QP/C libraries.
 Three build configurations (dbg, rel, and spy) are supported.
-NOTE: the Makefile assumes that the MinGW/bin directory is added
+
+\note the Makefile assumes that the MinGW/bin directory is added
 to the PATH.
 
 3. Added Win32 examples for Visual C++ 2008 (examples/80x86/win32/
@@ -521,8 +785,8 @@ on 64-bit targets (such as 64-bit Linux).
 6. Upgraded the examples for ARM Cortex with CodeSourcery to the
 latest Sourcery G++ 2011.02-2.
 
-
-\section qpc_4_1_06 Version 4.1.06 (Product) Release date: Jan 07, 2011
+<HR>
+\section qpc_4_1_06 Version 4.1.06, Release date: Jan 07, 2011
 
 1. Made cosmetic improvements to the example QM models of the
 "Fly 'n' Shoot" game.
@@ -536,8 +800,8 @@ IAR EWARM version 6.10.
 4. Upgraded the examples for ARM Cortex with CodeSourcery to the
 latest Sourcery G++ 2010.09-66.
 
-
-\section qpc_4_1_05 Version 4.1.05 (Product) Release date: Nov 01, 2010
+<HR>
+\section qpc_4_1_05 Version 4.1.05, Release date: Nov 01, 2010
 
 This release is adds examples for the QM (QP Modeler) graphical modeling
 and code generation tool. The examples are based on the "Fly 'n' Shoot"
@@ -559,8 +823,8 @@ be compiled with the IAR compiler and executed on the EV-LM3S811 board.
 Additionally, the QP/C baseline code has been slighlty modified for
 better conformance to the MISRA C 2004 rules and the latest PC-Lint 9.x.
 
-
-\section qpc_4_1_04 Version 4.1.04 (Product) Release date: Mar 16, 2010
+<HR>
+\section qpc_4_1_04 Version 4.1.04, Release date: Mar 16, 2010
 
 This release is adds compatibility of all examples for DOS with the DOSBox
 emulator (http://www.dosbox.com/) that recreates a MS-DOS compatible
@@ -577,8 +841,8 @@ Standard (CMSIS) for the whole family of the Stellaris LM3Sxxx MCUs. The
 improvement extends the CMSIS from Sandstorm to Fury, DustDevil, and Tempest
 Stellaris families.
 
-
-\section qpc_4_1_03 Version 4.1.03 (Product) Release date: Jan 21, 2010
+<HR>
+\section qpc_4_1_03 Version 4.1.03, Release date: Jan 21, 2010
 
 This release is concerned with the ARM Cortex ports and examples.
 Specifically, this release contains the following improvements:
@@ -605,8 +869,8 @@ version. Otherwise, this maintenance release does not change the QP/C API in
 any way, so the release has NO IMPACT on the QP/C applications except for the
 ARM Cortex ports and applications.
 
-
-\section qpc_4_1_02 Version 4.1.02 (Product) Release date: Jan 14, 2010
+<HR>
+\section qpc_4_1_02 Version 4.1.02, Release date: Jan 14, 2010
 
 The purpose of this minor maintenance release is the change in the directory
 structure for the ARM Cortex ports and examples. As new ARM Cortex cores are
@@ -619,8 +883,8 @@ This maintenance release does not change the QP/C API in any way, so the
 release has NO IMPACT on the QP/C applications except for the ARM Cortex
 ports and applications.
 
-
-\section qpc_4_1_01 Version 4.1.01 (Product) Release date: Nov 05, 2009
+<HR>
+\section qpc_4_1_01 Version 4.1.01, Release date: Nov 05, 2009
 
 The main purpose of this release is to replace the Turbo C++ 1.01 toolset
 with the Open Watcom C/C++ toolset, because Turbo C++ 1.01 is no longer
@@ -639,8 +903,8 @@ state machine classes with QP 4.x. The SLS example located in
 &lt;qpc&gt;/examples/80x86/dos/watcom/l/sls shows the implemenation of the
 new State-Local Storage state design pattern.
 
-
-\section qpc_4_1_00 Version 4.1.00 (Product) Release date: Oct 09, 2009
+<HR>
+\section qpc_4_1_00 Version 4.1.00, Release date: Oct 09, 2009
 
 The release brings a number of improvements to QP/C and updates the QP/C ARM
 Cortex-M3 examples for the EK-LM3S811 board to the latest IAR EWARM 5.40.
@@ -685,8 +949,8 @@ QK_readySet_ set for empty condition. This test allows avoiding calling the QK
 scheduler and two contex-switches if the ready-set is empty.
 - in the game example moved setting up the QS filters from main.c to bsp.c.
 
-
-\section qpc_4_0_04 Version 4.0.04 (Product) Release date: Apr 09, 2009
+<HR>
+\section qpc_4_0_04 Version 4.0.04, Release date: Apr 09, 2009
 
 The maintenance release provides a fix for the compile-time assertions,
 which did not work correctly for the GNU compiler family. Also, the ARM
@@ -700,8 +964,8 @@ The main changes in QP v4.0.04 with respect to earlier version are as follows:
 - in qassert.h file the #Q_ASSERT_COMPILE macro has been modified to render
 a negative array dimension when the asserted condition is not TRUE.
 
-
-\section qpc_4_0_03 Version 4.0.03 (Product) Release date: Dec 27, 2008
+<HR>
+\section qpc_4_0_03 Version 4.0.03, Release date: Dec 27, 2008
 
 The main purpose of this release is to fix a bug in the QK preemptive kernel,
 which occurs only when the advanced QK features are used. Specifically, the QK
@@ -735,8 +999,8 @@ when the macro QK_NO_MUTEX is not defined.
 - in qk_ext.c file added testing priority against the QK_ceilingPrio_,
 when the macro QK_NO_MUTEX is not defined.
 
-
-\section qpc_4_0_02 Version 4.0.02 (Product) Release date: Nov 15, 2008
+<HR>
+\section qpc_4_0_02 Version 4.0.02, Release date: Nov 15, 2008
 
 This maintenance release does not change the QP/C API in any way, so the
 release has NO IMPACT on the QP/C applications.
@@ -749,8 +1013,8 @@ the PC-lint warining about using the comma-operator (MISRA rule 42).
 - fixed a bug in tunnel.c file ("Fly 'n' Shoot" game). The constant event
 HIT_WALL was not declared static.
 
-
-\section qpc_4_0_01 Version 4.0.01 (Product) Release date: June 09, 2008
+<HR>
+\section qpc_4_0_01 Version 4.0.01, Release date: June 09, 2008
 
 This maintenace release is made to allow using QS software tracing with
 the GNU compiler for AVR (WinAVR). Specifically, the output of the strings
@@ -767,8 +1031,8 @@ The main changes in QP v4.0.01 with respect to earlier version are as follows:
 as static to save stack space, because QF_run() never returns and is not
 reentrant.
 
-
-\section qpc_4_0_00 Version 4.0.00 (Product) Release date: Apr 07, 2008
+<HR>
+\section qpc_4_0_00 Version 4.0.00, Release date: Apr 07, 2008
 
 This milestone release is made for the book /ref PSiCC2. The book describes in
 great detail this new release. The older "QP Programmer's Manual" is now
@@ -874,666 +1138,4 @@ P-Thread mutex.
 updated to the latest QP API changes.
 - all examples that use QF now contain the QS software tracing support.
 
-
-\section qpc_3_4_01 Version 3.4.01 (Product)
-Release date: Sep 25, 2007
-
-This product release adds the backward-compatibility layer so that previous
-QP/C ports continue to work with the new version.
-
-This product release also comes with the updated "QP Programmer's Manual",
-which now includes the QS target component and the QSpy host application.
-
-
-\section qpc_3_4_00 Version 3.4.00 (Beta)
-Release date: Sep 03, 2007
-
-This release brings several changes with the overall goal of simplifying and
-improving consistency across the whole QP family of frameworks (QP/C, QP/C++,
-and QP-nano).
-
-This release includes simplifying of the C naming conventions (see the
-updated Application Note <a
-href="http://www.state-machine.com/doc/AN_QL_Coding_Standard.pdf">"QL C/C++
-Coding Standard"</a>). The double-underscore suffix for private data members
-of structures is no longer used. Single underscore is used still only for
-internal QP/C facilities that typically should not be used by the application
-programmer.
-
-The main changes are made to the QEP component. The "static transition
-optimization" has been removed altogether. This simplifies significantly the
-state machine structure (which now contains just the currently active state).
-Also, the efficiency is improved for processing the dynamic transitions and
-the stack usage is lower. This change brings the QEP/C implementation much
-closer to QEP-nano.
-
-The other big change in this release is including the Quantum Spy (QS)
-component in the distribution. Previously, the QS component was available only
-under the commercial licensing. It is now open source, just as the rest of QP.
-
-In, the QF/C component, the QTimerEvt_publishIn() and QTimeEvt_publishEvery()
-have been removed, because they introduced a coupling between time events and
-publish-subscribe. This is undesirable for projects that do not want to
-include the publish-subscribe facilty.
-
-Finally, the revision history for individual QP/C components has been moved
-from the header files and is now consolidated in the header file
-doxygen/qpc_rev.h.
-
-
-\section qpc_3_3_01 Version 3.3.01 (Product)
-Release date: Mar 17, 2007
-
-The main change in this release is removing the 'const' declaration
-of two temporary variables inside QHsm_dispatch() and QHsm_tran() functions.
-This was necessary to compile the code with the MPLAB C18 compiler for PIC18
-devices.
-
-Other minor changes include adding the 'U' suffix (unsigned) to several
-numerical literals to avoid MPLAB C18 compiler warnings.
-
-The changes in release 3.3.01 have NO impact on the existing QP/C ports.
-
--# in file qhsm_dis.c:80 removed 'const' from the declaration of '*c'.
--# in file qhsm_tra.c:69 removed 'const' from the declaration of 'src'.
--# in file qep.c changed the version number to "3.3.01".
--# added the 'U' suffix to several numerical literals in files:
-qa_defer.c, qa_usuba.c, qf_gc.c, qf_pool.c, qf_run.c
--# in file qf_act.c changed the version number to "3.3.01".
--# added the cast to (uint8_t) to several numerical literals in the file qk.c.
--# in file qk.c changed the version number to "3.3.01".
--# added the 'U' suffix to several numerical literals in file qs.h.
--# in files qs_.c and qs_str.c added explicit casting to (char const).
--# in file qs.c changed the version number to "3.3.01".
-
-
-\section qpc_3_3_00 Version 3.3.00 (Product)
-Release date: Jan 22, 2007
-
-The main change in this release is removing #include <stdint.h> from the
-qep.h header file. This has been done becasue vast majority of embedded
-compilers for small MCUs actually do not provide the C-99 Standard header
-file <stdint.h>. Worse, compilers such as Freescale HC(S)08 C/C++ compiler
-will not include <stdint.h> unless it's in the compilers's include directory,
-even though the "stdint.h" file might be in the compiler include path.
-
-Removing the "#include <stdint.h>" from qep.h header file allows more
-flexibility in the way the standard exact-width integer types are defined.
-For compilers that do not provide the <stdint.h> file, you provide the
-typedef's in the qpc_port.h file before including qep.h. For compilers
-that do provide the <stdint.h> header file, you simply include this file
-in the qpc_port.h header file before including qep.h.
-
-The changes in release 3.3.00 have impact on all QP ports, because you need
-to modify the qpc_port.h file in all these ports.
-
-The other significant change in this release is adding the macro #Q_ROM_VAR
-for all constant objects allocated in ROM. The #Q_ROM_VAR macro has been
-added for the compilers like Freescale HC(S)08, which require far pointers
-to access the objects in ROM. Please note that specifying the pointer size
-for accessing a ROM objects is syntactically different than specifying
-that the object is allocated in ROM (see macro #Q_ROM).
-
-Finally, in release 3.3.00 the build strategy for QP ports has been
-simplified as well. Instead of separate Makefile for every QP component,
-such as QEP, QF, QK, and QS, not the "ports" directory contains a batch
-file "make.bat" that builds all the libraries at once.
-
-
--# in file qep.h removed "#include <stdint.h>".
--# in file qassert.h added macro #Q_ROM_VAR for objects allocated in ROM
-and to signatures of functions accessing these objects.
--# in file qep.h added macro #Q_ROM_VAR for objects allocated in ROM
-and to signatures of functions accessing these objects.
--# in file qep.h added default empty definitions and Doxygen comments for
-macros #Q_ROM and #Q_ROM_VAR.
--# in file qep.c added macro #Q_ROM_VAR for objects allocated in ROM
-and to signatures of functions accessing these objects.
--# in file qf.c added macro #Q_ROM_VAR for objects allocated in ROM
-and to signatures of functions accessing these objects.
--# in file qk.c added macro #Q_ROM_VAR for objects allocated in ROM
-and to signatures of functions accessing these objects.
--# in file qep.c added Q_ROM_VAR to the signature of QEP_getVersion().
--# in file qep.c changed the version number to "3.3.00".
--# in file qf.h added macro #Q_ROM_VAR for objects allocated in ROM
-and to signatures of functions accessing these objects.
--# in file qf.h removed method QF_getTime() and deleted external variable
-QF_tickCtr_.
--# deleted obsolete file qa_fifo_.c
--# deleted obsolete file qa_lifo_.c
--# deleted obsolete file qf_time.c
--# in file qf_act.c added Q_ROM_VAR to the signature of QEP_getVersion().
--# in file qf_log2.c added Q_ROM_VAR to the definition of the lookup table.
--# in file qf_pwr2.c added Q_ROM_VAR to the definition of the lookup tables.
--# in file qf_tick.c removed incrementing QF_tickCtr_.
--# In file qf_act.c updated version number to 3.3.00
--# in file qk.h added macro #Q_ROM_VAR for objects allocated in ROM
-and to signatures of functions accessing these objects.
--# In file qk.c added #Q_ROM_VAR to the signature of QK_getVersion().
--# In file qk.c updated version number to 3.3.00
--# in file qs.h added macro #QS_ROM_VAR for objects allocated in ROM
-and to signatures of functions accessing these objects.
--# In file qs.h added default definitions of the QS macros #Q_ROM,
-#Q_ROM_VAR, and Q_ROM_BYTE.
--# In file qs.h added declaration of QS_tickCtr_.
--# In file qs.c added #Q_ROM_VAR to the signature of QS_getVersion().
--# In file qs_.c added #Q_ROM_VAR to the signature of QS_str_ROM_().
--# In file qs_.c added definition of QS_tickCtr_.
--# In file qs_str.c added #Q_ROM_VAR to the signature of QS_str_ROM().
--# In file qs.c updated version number to 3.3.00
--# Updated the "QP Programmer's Manaul" to Revision E
-
-
-\section qpc_3_2_05 Version 3.2.05 (Product)
-Release date: Dec 08, 2006
-
-This QF release rolls back the changes made to the reference-counting
-policy. The reference count of a dynamic event is incremented
-when the event is posted, but is NOT decremented when the event is
-retreived from the queue. The reference count is decremented only later,
-in the garbage collector (QF_gc()).
-
-This release adds direct support for event deferral (the "Deferred Event"
-state pattern) through methods QActive_defer_() and QActive_recall_().
-
-Also this release adapts the QS code to the specifics of
-the Keil C51 compiler for 8051/251. In particular, the C51 compiler treats
-the identifier "data" as an extended keyword. To make the QS code compile
-with C51, all "data" used as a formal function parameter have been renamed.
-Additionally, this release fixes a minor bug in the #QS_FUN_DICTIONARY macro.
-
--# In file qf.h added methods QActive_defer_() and QActive_recall_().
--# In file qa_get_.c removed decrementing the reference count of a
-dynamic event.
--# In file qeq_get.c removed decrementing the reference count of a
-dynamic event.
--# In file qf_gc.cpp restored decrementing of the reference count of a
-dynamic event.
--# Added new file qa_defer.c that implements QActive_defer_() and
-QActive_recall_().
--# In file qf_act.c updated version number to 3.2.05
--# In file qs.h removed all instances of indentifier "data"
--# In file qs.h fixed a bug in the definition of macro #QS_FUN_DICTIONARY.
--# In file qs_.c renamed all instances of identifier "data".
--# In file qs_f32.c renamed all instances of identifier "data".
--# In file qs_f64.c renamed all instances of identifier "data".
--# In file qs.c, in functions QS_filterOn() and QS_filterOff() moved the
-declaration of the temporary variable 'i' from the inner scope to the
-function scope. The C51 compiler was crushing with variables at inner scope.
--# In file qs.c updated version number to 3.2.05
--# Updated the "QP Programmer's Manaul" to Revision D
-
-
-\section qpc_3_2_04 Version 3.2.04 (Beta)
-Release date: Dec 01, 2006
-
-This QF release changes the internal policy of reference-counting for
-dynamic events. The reference count of a dynamic event is now incremented
-when the event is posted to a queue and decremented when the event is
-later retreived from the queue. This policy pertains to both active
-object queues and native QF thread-safe queues (QEQueue).
-
-Previously, the reference count of a dynamic event was not decremented
-upon retreival of the event from the event queue, but rather in the
-garbage collector (QF_gc()).
-
-This QK release adds two new features in QK.
-
-The first feature added is the extended context switch for CPUs with
-co-processors, such as the x87 FPU accompanying the x86 CPU. As a fully-
-preemptive kernel, QK needs to save and restore the context of the co-
-processor accrosss the asynchronous preemption. This QK release adds
-a generic mechanism for saving and restoring extened context in the
-extended scheduler (QK_scheduleExt_()), which is used only at the
-exit from the interrupts (asynchronous preemptions).
-
-The second feature added is the Thread-Local Storage (TLS) for reentrant
-libraries, such as the NewLib. This feature allows assigning per-thread
-memory and providing a hook (callback) activated at every context switch.
-
--# In file qf.h eliminated methods QActive_postFIFO_() and
-QActive_postLIFO_().
--# In file qf.h changed method QActive_get__() to QActive_get_() (protected
-scope) to make it available to various thread-run routines.
--# In file qa_fifo.c changed the implementation of QActive_postFIFO()
-to represent the native QF event queue of an active object.
--# In file qa_fifo_.c removed the implementation of QActive_postFIFO__()
-and declared the file obsolete (will be removed in future releases).
--# In file qa_lifo.c changed the implementation of QActive_postLIFO()
-to represent the native QF event queue of an active object.
--# In file qa_lifo_.c removed the implementation of QActive_postLIFO__()
-and declared the file obsolete (will be removed in future releases).
--# In file qa_get_.cpp added decrementing the reference count of a
-dynamic event.
--# In file qf_gc.c removed decrementing of the reference count of a
-dynamic event. Also changed the test for recycling an event (reference
-count of zero).
--# In file qf_pspub.c removed incrementing the reference count of a
-dynamic event.
--# Removed all uses of the macros #QACTIVE_POST_FIFO_, #QACTIVE_POST_LIFO_,
-and QACTIVE_GET_. These macros are made now obsolete.
--# In file qsched.h removed definitions of the obsolete macros
-#QACTIVE_POST_FIFO_, #QACTIVE_POST_LIFO_, and QACTIVE_GET_.
--# In file qf_pspub.c replaced the macro QACTIVE_POST_FIFO_() with the direct
-call to the function QActive_postFIFO(QF_active_[p], e).
--# In file qf_tick.c replaced the macro QACTIVE_POST_FIFO_() with the direct
-call to the function QActive_postFIFO(QF_active_[p], e).
--# Changed the uC/OS-II port to reflect new policy of handling reference
-counters inside the dynamic events. Also removed files qa_fifo.c and
-qa_lifo.c from the uC/OS-II build.
--# In file qf_act.c updated version number to 3.2.04
--# In file qk.h updated revision history and added the prototype for the
-extended scheduler QK_scheduleExt_(). This scheduler implements the
-generic extended context via macros #QK_EXT_TYPE, #QK_EXT_SAVE, and
-#QK_EXT_RESTORE.
--# In file qk.h removed definitions of the obsolete macros
-#QACTIVE_POST_FIFO_, #QACTIVE_POST_LIFO_, and QACTIVE_GET_.
--# In file qk_sched.c added logic for handling the TLS via the macro
-#QK_TLS.
--# Added new file qk_ext.c with the definition of the extended scheduler
-QK_scheduleExt_().
--# Added the file qk_ext.c to the Makefile for QK port to 80x86 with
-Turbo C++ 1.01.
--# Extended the QK port to 80x86 with Turbo C++ 1.01 to handle the
-x87 FPU context.
--# Extended the QDPP example for QK with Turbo C++ 1.01 to demonstrate
-threads that use the FPU and require the extended context switch.
--# In file qk.c updated version number to 3.2.04
--# Updated the "QP Programmer's Manaul" to Revision C
-
-
-\section qpc_3_2_03 Version 3.2.03 (Product)
-Release date: Nov 15, 2006
-
-The main purpose of this release is to adapt the code to the shortcomings of
-the gcc compiler for handling data in program ROM for Harvard architecture
-CPUs, such as the Atmel's AVR or the 8051. In such machines, the data space
-(RAM) and program space (ROM) are accessed with different instructions.
-The gcc compiler does not automatically synthesize the correct code for
-accessing data placed in the program ROM, even though
-__attribute__((__progmem__)) is used. The workaround for the gcc is to add
-special assembly instructions to transfer the data from the program space to
-the data space. This version of QP/C adds macros for each data element
-allocated to the program space (delcared with the Q_ROM attribute). Please
-note that commercial compilers, such as IAR, handle data allocated in the
-program space (ROM) correctly and do not need any workarounds.
-
-This release also fixes a few minor inconsistencies in the code (see the list
-below):/
-
--# In file qf.h added default definition of macro #Q_ROM_BYTE
--# In file qf_set.h added macro #Q_ROM_BYTE to access the lookup tables
-allocated in ROM (several places).
--# In file qf_sched.h changed types QF_OS_OBJECT_TYPE and QF_THREAD_TYPE to
-uint8_t from int8_t
--# In file qs_dummy.h added dummy definitions of some missing QS macros
--# In file qa_sub.c added macro #Q_ROM_BYTE to access the lookup tables
-allocated in ROM (several places).
--# In file qa_usub.c added macro #Q_ROM_BYTE to access the lookup tables
-allocated in ROM (several places).
--# In file qf_usuba.c added macro #Q_ROM_BYTE to access the lookup tables
-allocated in ROM (several places).
--# In file qf_pspub.c added macro #Q_ROM_BYTE to access the lookup tables
-allocated in ROM (several places).
--# In file qf_act.c updated version number to 3.2.03
--# In file qs_pkg.h added default definition of macro #Q_ROM_BYTE
--# In file qa_sub.c added macro #Q_ROM_BYTE to access the lookup tables
-allocated in ROM (several places).
--# In file qs_.c added macro #Q_ROM_BYTE to access the string allocated in ROM
--# In file qs_str.c added macro #Q_ROM_BYTE to access the string allocated
-in ROM.
--# In file qs.h changed the include file name from "qs_dummy" to "qs_dummy.h".
--# In file qs.c updated version number to 3.2.03
-
-
-\section qpc_3_2_02 Version 3.2.02 (Product)
-Release date: Oct 30, 2006
-
--# In file qs.h replaced macro Q_ROM with QS_ROM
--# In file qs.h added methods QS_str_ROM_() and QS_str_ROM()
--# In file qs.h added macros QS_STR_ROM_() and QS_STR_ROM()
--# In file qs.h modified macros QS_???_DICTIONARY() to use ROM strings
--# In file qs.h included qs_dummy.h instead of the dummy definitions
-   of the QS macros
--# In file qs_pkg.h added #ifndef Q_SPY before definition of macro Q_SPY
--# In file qs_.c added definition of the function QS_str_ROM_()
--# In file qs_str.cpp added definition of the function QS_str_ROM()
--# In file qs.c updated version number to 3.2.02
-
-
-\section qpc_3_2_01 Version 3.2.01 (Product)
-Release date: Sep 01, 2006
-
--# In file qep.c updated version number to 3.2.01
--# Added makefiles for building ports of all QP/C libraries at once.
--# Created the consolidated manual "QP/C Programmer's Manual".
--# In file qf_act.c updated version number to 3.2.01
--# Added makefiles for building ports of all QP/C libraries at once.
--# Created the consolidated manual "QP/C Programmer's Manual".
--# In file qk.c updated version number to 3.2.01
--# Added makefiles for building ports of all QP/C libraries at once.
--# In file qs.c updated version number to 3.2.01
--# In file qs.c removed superfluous semicolons after QS_INSERT...() macros
--# In file qs_.c removed superfluous semicolons after QS_INSERT...() macros
--# In file qs_str.c removed superfluous semicolons after QS_INSERT...() macros
--# In file qs_mem.c removed superfluous semicolons after QS_INSERT...() macros
--# In file qs_f32.c removed superfluous semicolons after QS_INSERT...() macros
--# In file qs_f64.c removed superfluous semicolons after QS_INSERT...() macros
--# Added makefiles for building ports of all QP/C libraries at once.
--# Created the consolidated manual "QP/C Programmer's Manual".
-
-
-\section qpc_3_2_00 Version 3.2.00 (Product)
-Release date: Aug 07, 2006
-
--# In file qep.h added the default definition of Q_ROM in case it's not
-defined by the user.
--# In file qassert.h added the macro Q_ROM to allocate constant strings
-to ROM.
--# In file qep.c updated version number to 3.2.00
--# Updated the "QEP/C Programmer's Manual".
--# In file qf.h changed the semantics of the QF_onIdle() callback.
-This callback is now invoked with interrupts LOCKED from the non-preemptive
-scheduler used in the "vanilla" QF ports to "bare metal" target boards.<br>
-<br>
-The modification changes the responsibilities of QF_onIdle(), which now MUST
-at least unlock interrupts. A failure to unlock interrupts in QF_onIdle()
-will leave the interrupts locked all the time and would prevent the
-application from running.<br>
-<br>
-Also, the signature of QF_onIdle() now depends on the interrupt locking
-policy. In case of the "save and restore interrupt status" policy, the
-QF_onIdle() callback takes the interrupt lock key as parameter (to be able
-to unlock the interrups correctly).
--# In file qf.h used the macro Q_ROM to allocate constant objects
-to ROM (/sa qep.h). Objects allocated to ROM are: the version strings, and
-the lookup tables (QF_log2Lkup[], QF_pwr2Lkup[], QF_invPwr2Lkup, and
-QF_div8Lkup[].
--# Added new platform-independent header file qsched.h to provide the
-interface to the simple non-preemptive scheduler used in the "vanilla" ports
-of QF to "bare metal" targets. This header file is only applicable to the
-"vanilla" ports.
--# Added new platform-independent implementation file qf_run.c to
-implement the simple non-preemptive scheduler used in the "vanilla" ports
-of QF to "bare metal" targets. This implementation file eliminates the need
-for qf_port.c file in the "vanilla" ports of QF. Also, the qf_run.c module
-should only be placed in the QF library in the vanilla QF ports.
--# Simplified all "vanilla" ports of QF to use the common platform-
-independent implementation provided in qf_run.c.
--# Updated QF_onIdle() callback in all examples of "vanilla" ports of QF to
-unlock interrupts.
--# Modified file qf_pspub.c to allow allocating a temporary stack variable
-inside the macro QF_SCHED_LOCK(). This change is related to modification in
-QK v 3.2.00.
--# Updated the "QF/C Programmer's Manual".
--# in file qk.h added new idle callback QK_onIdle(), which in contrast
-to QF_onIdle() is invoked with interrupts unlocked.
--# in file qk.h removed QK_schedLock()/QK_schedUnlock() and replaced them
-with QK_mutexLock()/QK_mutexUnlock(), with the semantics of returning the
-mutex.
--# in file qk.h changed the definitions of macros #QF_SCHED_LOCK/
-#QF_SCHED_UNLOCK to use the new QK mutex API.
--# In file qk.h used the macro Q_ROM to allocate constant objects
-to ROM (/sa qep.h).
--# in file qk.h added the typedef for QMutex.
--# in file qk.c replaced the callback QF_onIdle() with the new one
-QK_onIdle().
--# removed source file qk_lock.c
--# added source file qk_mutex.c
--# in file qk.c changed the version number to 3.2.00
--# Updated "QK/C Programmer's Manual"
--# In file qs.h replaced QS_QK_SCHED_LOCK/UNLOCK with QS_QK_MUTEX_LOCK/UNLOCK.
-Also, changed data accompanying the trace records QS_QK_MUTEX_LOCK/UNLOCK.
--# In file qs.h used the macro Q_ROM to allocate constant objects
-to ROM (/sa qep.h).
--# in file qs.c changed the version number to 3.2.00
--# Updated "QS/C Programmer's Manual" in PDF.
-
-
-\section qpc_3_1_06 Version 3.1.06 (Product)
-Release date: Jul 14, 2006
-
--# In file qf.h added function QF_stop() to be called from the application
-code to stop the framework.
--# In file qf.h added callback function QF_cleanup() to be called from the
-QF port to cleanup before exiting to the OS.
--# In file qf.h deprecated the function QF_exit().
--# In file qk_sched.c removed unlocking of interrupts upon exit from
-QK_schedule_(). Now QK_schedule_() enters and exits with interrupts LOCKED.
--# In file qk.h modified macro QACTIVE_OSOBJECT_SIGNAL_() to always unlock
-the interrupts, regardless if QK_schedule_() has been called or not.
--# In file qk.c added unlocking interrupts after the call to QK_SCHEDULE_()
-in the function QF_run().
--# In file qk_lock.c modified the function QK_schedUnlock() to always unlock
-the interrupts upon exit.
--# Updated licensing information.
--# Updated "QS Programmer's Manual" in PDF.
-
-
-\section qpc_3_1_05 Version 3.1.05 (Product)
-Release date: Feb 08, 2006
-
--# In file qf_act.c added the Revision History Doxygen comment, which was
-previously in doxygen/qp.h
--# In file qf.h augmented comment for QF_run() to cover the case when QF is
-used with QK.
--# In file qf.h added the extern declarations of ::QF_tickCtr_,
-::QF_intLockNest, and ::QF_isrNest_, which were previously declared
-in qf_pkg.h.
--# In file qf.h added macros #QF_QS_INT_LOCK, #QF_QS_INT_UNLOCK(),
-#QF_QS_ISR_ENTRY, and #QF_QS_ISR_EXIT, which were previously declared
-in qs_port.h.
--# In file ports/linux/gcc/qf_port.h added extern uint8_t QF_running_.
--# In file qf/80x86/dos/tcpp101/l/qf_port.c replaced deprecated
-QPSet_hasElements() to QPSet_isEmpty().
--# In file qf/80x86/linux/gcc/qf_port.c added QF_run()
--# In file qeq_init.c:186 changed QS_OBJ(me) to QS_OBJ(qSto) to consistently
-refer to a queue by the ring buffer object
--# In file qf_pkg.h removed extern ::QF_tickCtr_.
--# In file qk.h removed extern QK_intLockNest_ and QK_isrNest_. These
-counters have been moved to QF and renamed in the process to QF_intLockNest_
-and QF_isrNest_, respectively.
--# In file qk.h added QS instrumentatin to #QF_INT_LOCK and #QF_INT_UNLOCK
-macros for tracing interrupt locking/unlocking. The QS interrupt locking/
-unlocking instrumentation has been previously added at the QK port level.
--# In file qk.h removed macros QK_QS_INT_LOCK()/ QK_QS_INT_UNLOCK(),
-QK_QS_ISR_ENTRY()/ QK_QS_ISR_EXIT(). These macros have been moved to QF and
-renamed in the process to QF_QS_INT_LOCK()/ QF_QS_INT_UNLOCK(),
-QF_QS_ISR_ENTRY()/ QF_QS_ISR_EXIT(), respectively.
--# In file ports/80x86/qk/tcpp101/l/qk_port.h simplified the definition
-of the macros #QK_INT_LOCK/ #QK_INT_UNLOCK to NOT contain the QS
-instrumenation.
--# In file ports/80x86/qk/tcpp101/l/qk_port.h changed the definitions of
-#QK_ISR_ENTRY and #QK_ISR_EXIT to use #QF_QS_ISR_ENTRY/ #QF_QS_ISR_EXIT.
--# In file qk.c added the Revision History Doxygen comment
--# In file qk_pkg.h changed the definition of internal QK macros
-#QK_INT_LOCK_/ #QK_INT_UNLOCK_ to use the QS-instrumented #QF_INT_LOCK/
-#QF_INT_UNLOCK.
--# In file qk_lock.c corrected a comment
--# In file qk_sched.c corrected a comment
--# Provided "QS/C Programmer's Manual" in PDF.
--# In file qs.h changed around the pre-defined records. Added records:
-QS_QF_INT_LOCK, QS_QF_INT_UNLOCK, QS_QF_ISR_ENTRY, QS_QF_ISR_EXIT. Removed
-records QS_QK_INT_LOCK, QS_QK_INT_UNLOCK, QS_QK_ISR_ENTRY, QS_QK_ISR_EXIT.
--# In file qs.h renamed functions QS_filterIn()/ QS_filerOut() to
-QS_filterOn()/ QS_filerOff(). Correspondingly, changed macros QS_FILTER_IN(),
-QS_FILTER_OUT(), to QS_FILTER_ON(), QS_FILTER_OFF().
--# In file qs.h changed the signature and semantics of QS_getByte() to return
-QS_EOD (End-Of-Data).
--# In file qs.h changed the signature of QS_getBlock() to take a pointer
-to uint16_t rather than uint32_t.
--# In file qs.h eliminated the callback QS_newRecord()
--# In file qs.h added new callback QS_flush()
--# In file qs.h added application-level local filter object QS_apObj_.
-Consistently, added macro QS_FILTER_AP_OBJ() to set the new local filter.
-Consistently, added object argument to macros QS_BEGIN() and
-QS_BEGIN_NOLOCK().
--# In files qs.c, qs_.c, qs_blk.c, qs_byte.c, qs_pkg.h renamed some variables
-and adjusted comments.
--# Ported the QSpy host applicatoin to Linux. Added TCP/IP input to QSpy.
-Added new options.
--# Added redesigned QS port to Linux with TCP/IP data link.
-
-
-\section qpc_3_1_04 Version 3.1.04 (Beta)
-Release date: Dec 08, 2005
-
--# In file qmpool.h changed the definition of the #QF_MPOOL_SIZ_SIZE macro
-to remove the dependency on the #QF_EVENT_SIZ_SIZE. Macro #QF_EVENT_SIZ_SIZE
-might not be defined by the time qmpool.h is included.
--# Added explicit definition of the configuration macro QF_EVENT_SIZ_SIZE to
-all qf_port.h files.
--# Fixed a bug in function QMPool_init() (file qmp_init.c) by changing
-the type of variable n from uint8_t to QMPoolCtr. The uint8_t data type
-was failing for bigger block sizes.
--# Added the QF_onIdle() callback to qf.h
--# Improved comments in qpset.h
--# Corrected dependencies in the Makefile for QDPP example
-(directory 80x86/dos/tcpp101/l and 80x86/dos/tcpp101/s)
--# Added Linux QF port to the standard QF/C distribution.
--# Released the "QF/C Programmer's Manual"
--# Released "QK/C Programmer's Manual" in PDF.
--# In file qk.h removed callbacks QK_init(), QK_start(), QK_idle(),
-QK_exit(), because they duplicate the QF callbacks.
--# Modified qk.c to define the following QF "callbacks": QF_getPortVersion(),
-QF_run(), QActive_start(), and QActive_stop_().
--# Added an argument to the signature of QK_schedLock() to allow selective
-QK scheduler locking up to the specified priority level.
--# Changed the implementation of QK_schedLock() in file qk_lock.c.
--# Eliminated the need for qf_port.c in the QF/C ports for QK.
--# Simplified elements that go into qk_port.c in the QK/C ports.
--# Added the ARM-Simulator port to the standard QK/C distribution.
--# Cleaned-up the 80x86 QK port.
-
-
-\section qpc_3_1_03 Version 3.1.03 (Beta)
-Release date: Nov 18, 2005
-
--# Added Doxygen documentation to the source code
--# Added running__ member to the QActive structure
--# Added QF_EVENT_SIZ_SIZE configuration macro and related data type
-QEventSize. Made the following changes to the signatures:
-void QF_poolInit(void *poolSto, uint32_t poolSize, QEventSize evtSize);
-QEvent *QF_new_(QEventSize evtSize, QSignal sig);
--# Changed the name of protected function from QF_new() to QF_new_().
--# Added the QK component (Beta)
--# Added Doxygen documentation to the source code
-
-
-\section qpc_3_1_02 Version 3.1.02 (Beta)
-Release date: Feb 08, 2006
-
--# In file qep.c added the Revision History Doxygen comment, which was
-previously in doxygen/qp.h
--# updated the QBomb example to use the key events described in the
-"QEP/C Programmer's Manual"
--# changed C++ comments to C-comments in main.c of the QHsmTst example
-
-
-\section qpc_3_1_01 Version 3.1.01 (Beta)
-Release date: Oct 18, 2005
-
--# Removed <A HREF="http://www.state-machine.com/products/">Quantum
-Spy</A> (QS) dependency from the examples
-
-
-\section qpc_3_1_00 Version 3.1.00 (Beta)
-Release date: Oct 03, 2005
-
--# Applied new directory structure desribed in
-<A HREF="http://www.state-machine.com/doc/AN_QP_Directory_Structure.pdf">
-Application Note: QP Directory Structure</A> -# Added <A
-HREF="http://www.state-machine.com/products/">Quantum Spy</A>
-instrumentation. -# Removed file qfsm_tra.c. -# Introduced file qfsm_dis.c. -#
-Applied new directory structure desribed in <A
-HREF="http://www.state-machine.com/doc/AN_QP_Directory_Structure.pdf">
-Application Note: QP Directory Structure</A> -# Added <A
-HREF="http://www.state-machine.com/products/">Quantum Spy</A>
-instrumentation.
-
-
-\section qpc_3_0_11 Version 3.0.11 (Beta)
-Release date: Aug 14, 2005
-
--# Fixed potential race condition for static transitions
--# Changed names of helper function QFsm_tran_()/QHsm_tran_() to
-QFsm_execTran()/QHsm_execTran() to match the QEP/C++ version.
--# Added assertion in QHsm_execTran() to catch potential path[] array
-overrun that previously could go undetected.
-
-
-\section qpc_3_0_10 Version 3.0.10 (Beta)
-Release date: Aug 06, 2005
-
-This release contains completely redesigned Quantum Event Processor (QEP). The
-main focus is on compliance with standards (MISRA, Lint, Coding Standard),
-better portability, stack-use efficiency.
-
--# This release includes a comprehensive "QEP/C v3.0 Programmer's Manual"
-in PDF.
--# This release contains in-source comments for automatic generation of
-this Reference Manual with <A HREF="http://www.doxygen.org">doxygen</A>.
--# This release includes re-packaging the code into much larger number of
-modules (.c files) with typically one function per module. This
-fine-granularity packaging allows for better automatic elimination of unused
-code at link time and fine-tuning by applying different compiler options to
-different files.
--# This release is 98% compliant with the Motor Industry Software Reliability
-Association (MISRA) "Guidelines for the Use of the C Language in Vehicle Based
-Software", April 1998, ISBN 0-9524156-9-0 (see also See also
-http://www.misra.org.uk). A separate Application Note "QEP/C MISRA Compliance
-Matrix" contains detailed account how QEP/C compiles with the 127 MISRA rules
-(See http://www.state-machine.com/doc/AN_QP_C_MISRA.pdf).
--# This release is now "lint-free". The source code has been thoroughly checked with the latest version of PC-lint(TM) (version 8.00q) from Gimpel Software (www.gimpel.com). The PC-lint configuration files and output files are included in the distribution. A separate Application Note "QEP/C PC-Lint Compliance" contains detailed account how QEP/C compiles with PC-Lint. (See
-http://www.state-machine.com/doc/AN_QP_C_PC-Lint.pdf).
--# This release is compliant with the "Quantum Leaps Coding C/C++ Standard"
-(http://www.state-machine.com/resources/QL_coding_standard.pdf). Among others,
-all public names are prefixed by "Q_", or "QEP_" to minimize compile-time and
-link-time name conflicts. In addition, QEP/C uses the C99 standard include
-file <stdint.h> (C99 Standard, Section 7.18). Pre-standard compilers are still
-supported by placing <stdint.h> in the compiler's header file directory.
--# The QEvent structure has been redesigned to use memory more efficiently.
-QEvent takes up only 2 bytes now.
--# The QHsm structure now derives from the
-QFsm structure, which promotes better code re-use. In particular, macros
-Q_INIT() and Q_TRAN() are now common for both traditional non-hierarchical
-FSMs and for HSMs.
--# The QFsm class has been redesigned to allow using entry
-and exit actions. Now the QFsm class strictly avoids recursion, just as QHsm
-does (MISRA rule 70).
--# The QPseudoState type has been eliminated and
-replaced by QState.
--# The central QHsm class in QEP has been completely
-redesigned. The basic transition algorithm is essentially the same as
-described in "PSiCC", however the implementation is very different. The
-redesign was necessary to comply with the MISRA rules and to eliminate Lint
-warnings.
--# The event processor is now strictly non-recursive (MISRA rule
-70), that is, event handlers never call themselves, even indirectly. (Previous
-algorithm required one-level of indirect recursion.)
--# Dynamic state
-transition is now default. Static transition optimization is still supported,
-but considered optional for performance tuning.
--# The artificial limitation
-of initial transitions targeting only immediate substate of a composite state
-has been removed (see "PSiCC" Figure 5.4[a]). Initial transitions can now
-target any substate, arbitrarily nested within the composite state.
--# This
-distribution uses the legacy Borland Turbo C++ 1.01 as the default compiler.
-Port to DOS with Turbo C++ 1.01 is provided along with GNU-compatible
-makefiles for the QEP library and sample applications. This compiler is not
-C99-compliant and does not provide the <stdint.h> header file. However, the
-port of QEP includes a minimal <stdint.h>, which should be placed into the
-INCLUDE directory of the Borland Turbo C++ 1.01 installation.
--# This
-distribution contains three sample applications: A simple time bomb (QBomb) to
-demonstrate use of QFsm, a calculator (QCalc), and an exhaustive test of the
-QHsm class (QHsmTst). All examples are implemented as text-only application
-compiled with Turbo C++ 1.01. The QHsmTst sample application supports
-interactive and batch mode for exhaustive testing of the event processor. The
-source code for QHsmTst demonstrates also how QEP/C application code can be
-MISRA-compliant.
--# This distribution contains make files for the Turbo C++
-1.01 make utility, as well as GNU-compatible Makefiles.
-
 */

Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 435 - 2185
doxygen/qpc_tut.txt


+ 1 - 1
doxygen/snippets/qa_run.c

@@ -1,7 +1,7 @@
 /* thread routine for Win32 _beginthread() */
 static void __cdecl run(void *me) { /* the exact signature for _beginthread */
     do {
-        QEvent const *e;
+        QEvt const *e;
 
         QACTIVE_GET_((QActive *)me, e);               /* wait for the event */
         QF_ACTIVE_DISPATCH_(me, e);   /* dispatch to the active object's SM */

+ 0 - 4
doxygen/snippets/qep_qevent.c

@@ -1,4 +0,0 @@
-typedef struct QCalcEvtTag {
-    QEvent super;                                    /* derives from QEvent */
-    uint8_t keyId;                               /* ID of the key depressed */
-} QCalcEvt;

+ 5 - 0
doxygen/snippets/qep_qevt.c

@@ -0,0 +1,5 @@
+typedef struct QCalcEvtTag {
+    QEvt super;       /* inherits QEvt */
+
+    uint8_t keyId;    /* ID of the key depressed */
+} QCalcEvt;

+ 5 - 4
doxygen/snippets/qep_qfsm.c

@@ -1,6 +1,7 @@
 typedef struct QBombTag {
-    QFsm super;                                        /* derives from QFsm */
-    uint8_t timeout;                    /* number of seconds till explosion */
-    uint8_t defuse;                               /* the secret defuse code */
-    uint8_t code;                          /* the current defuse code entry */
+    QFsm super;         /* inherits QFsm */
+
+    uint8_t timeout;    /* number of seconds till explosion */
+    uint8_t defuse;     /* the secret defuse code */
+    uint8_t code;       /* the current defuse code entry */
 } QBomb;

+ 5 - 1
doxygen/snippets/qep_qfsm_ctor.c

@@ -1,3 +1,7 @@
 void QBomb_ctor(QBomb *me) {
-    QFsm_ctor(&me->super, (QStateHandler)&QBomb_initial);/* superclass ctor */
+    QFsm_ctor(&me->super, Q_STATE_CAST(&QBomb_initial)); /* superclass ctor */
+
+    me->timeout = 0U;
+    me->defuse  = 0U;
+    me->code    = 0U;
 }

+ 8 - 12
doxygen/snippets/qep_qfsm_use.c

@@ -1,23 +1,19 @@
-#include "qep.h"                                  /* QEP/C public interface */
-#include "qbomb.h"                           /* QBomb FSM derived from QFsm */
+#include "qep.h"       /* QEP/C public interface */
+#include "qbomb.h"     /* QBomb derived from QFsm */
 
-static QBomb l_qbomb;                           /* an instance of QBomb FSM */
+static QBomb l_qbomb;  /* an instance of QBomb FSM */
 
 int main() {
-    QBombInitEvt ie;                  /* initialization event for QBomb FSM */
+    QBomb_ctor(&l_bomb);   /* QBomb "constructor" invokes QFsm_ctor() */
 
-    QBomb_ctor(&l_qbomb);   /* QBomb FSM "constructor" invokes QFsm_ctor_() */
+    QMSM_INIT(&l_qbomb.super, (QEvt *)0); /* trigger initial transition */
 
-    /* set the initialization event ie */
-
-    QFsm_init((QFsm *)&l_qbomb, &ie);         /* trigger initial transition */
-
-    for (;;) {                                                /* event loop */
-        QEvent e;
+    for (;;) {              /* event loop */
+        QEvt e;
         . . .
         /* wait for the next event and assign it to the event object e */
         . . .
-        QFsm_dispatch((QFsm *)&l_qbomb, &e);       /* dispatch e to l_qbomb */
+        QMSM_DISPATCH(&l_qbomb.super, &e);  /* dispatch e */
     }
     return 0;
 }

+ 2 - 1
doxygen/snippets/qep_qhsm.c

@@ -1,5 +1,6 @@
 typedef struct QCalcTag {
-    QHsm super;                                        /* derives from QHsm */
+    QHsm super;       /* inhertits QHsm */
+
     double operand1;
     double operand2;
     char display[DISP_WIDTH + 1];

+ 6 - 1
doxygen/snippets/qep_qhsm_ctor.c

@@ -1,3 +1,8 @@
 void QCalc_ctor(QCalc *me) {
-    QHsm_ctor(&me->super, (QStateHandler)&QCalc_initial);
+    QHsm_ctor(&me->super, Q_STATE_CAST(&QCalc_initial)); /* superclass' ctor */
+
+    me->operand1 = 0.0;
+    me->operand2 = 0.0;
+    me->len      = 0U;
+    me->opKey    = 0U;
 }

+ 8 - 8
doxygen/snippets/qep_qhsm_use.c

@@ -1,19 +1,19 @@
-#include "qep.h"                                  /* QEP/C public interface */
-#include "qcalc.h"                           /* QCalc HSM derived from QHsm */
+#include "qep.h"            /* QEP/C public interface */
+#include "qcalc.h"          /* QCalc derived from QHsm */
 
-static QCalc l_qcalc;                           /* an instance of QCalc HSM */
+static QCalc l_qcalc;       /* an instance of QCalc SM */
 
 int main() {
-    QCalc_ctor(&l_qcalc);   /* QCalc HSM "constructor" invokes QHsm_ctor_() */
+    QCalc_ctor(&l_qcalc);   /* QCalc "constructor" invokes QHsm_ctor_() */
 
-    QHsm_init((QHsm *)&l_qcalc, (QEvent *)0); /* trigger initial transition */
+    QMSM_INIT(&l_qcalc.super, (QEvt *)0); /* trigger initial transition */
 
-    for (;;) {                                                /* event loop */
-        QEvent e;
+    for (;;) {              /* event loop */
+        QEvt e;
         . . .
         /* wait for the next event and assign it to the event object e */
         . . .
-        QHsm_dispatch((QHsm *)&l_qcalc, (QEvent *)&e);        /* dispatch e */
+        QMSM_DISPATCH(&l_qcalc.super, &e);  /* dispatch e */
     }
     return 0;
 }

+ 4 - 4
doxygen/snippets/qep_qinit.c

@@ -1,15 +1,15 @@
 /* initial pseudostate of the QBomb FSM ....................................*/
-QState QBomb_initial(QBomb *me, QEvent const *e) {
-    Q_REQUIRE(e != (QEvent *)0);           /* initialization event expected */
+QState QBomb_initial(QBomb * const me, QEvt const * const e) {
+    Q_REQUIRE(e != (QEvt *)0);             /* initialization event expected */
     QBomb_updateState(me, "top-INIT");
     me->timeout = INIT_TIMEOUT;
-    me->defuse  = ((QBombInitEvt const *)e)->defuse;
+    me->defuse  = Q_EVT_CAST(QBombInitEvt)->defuse;
 
     return Q_TRAN(&QBomb_setting);                    /* initial transition */
 }
 
 /* state handler function for the QCalc HSM ................................*/
-QState QCalc_on(QCalc *me, QEvent const *e) {
+QState QCalc_on(QCalc * const me, QEvt const * const e) {
     switch (e->sig) {
         . . .
         case Q_INIT_SIG: {

+ 9 - 0
doxygen/snippets/qep_qmsm.c

@@ -0,0 +1,9 @@
+typedef struct QCalcTag {
+    QMsm super;       /* inherits QMsm */
+
+    double operand1;
+    double operand2;
+    char display[DISP_WIDTH + 1];
+    uint8_t len;
+    uint8_t opKey;
+} QCalc;

+ 8 - 0
doxygen/snippets/qep_qmsm_ctor.c

@@ -0,0 +1,8 @@
+void QCalc_ctor(QCalc *me) {
+    QMsm_ctor(&me->super, Q_STATE_CAST(&QCalc_initial)); /* superclass' ctor */
+
+    me->operand1 = 0.0;
+    me->operand2 = 0.0;
+    me->len      = 0U;
+    me->opKey    = 0U;
+}

+ 19 - 0
doxygen/snippets/qep_qmsm_use.c

@@ -0,0 +1,19 @@
+#include "qep.h"            /* QEP/C public interface */
+#include "qcalc.h"          /* QCalc derived from QMsm */
+
+static QCalc l_qcalc;       /* an instance of QCalc SM */
+
+int main() {
+    QCalc_ctor(&l_qcalc);   /* QCalc "constructor" invokes QMsm_ctor_() */
+
+    QMSM_INIT(&l_qcalc.super, (QEvt *)0); /* trigger initial transition */
+
+    for (;;) {              /* event loop */
+        QEvt e;
+        . . .
+        /* wait for the next event and assign it to the event object e */
+        . . .
+        QMSM_DISPATCH(&l_qcalc.super, &e);  /* dispatch e */
+    }
+    return 0;
+}

+ 2 - 2
doxygen/snippets/qep_qtran.c

@@ -1,5 +1,5 @@
 /* state handler function for the QBomb FSM ................................*/
-QState QBomb_setting(QBomb *me, QEvent const *e) {
+QState QBomb_setting(QBomb * const me, QEvt const * const e) {
     switch (e->sig) {
         . . .
         case ARM_SIG: {
@@ -10,7 +10,7 @@ QState QBomb_setting(QBomb *me, QEvent const *e) {
 }
 
 /* state handler function for the QCalc HSM ................................*/
-QState QCalc_begin(QCalc *me, QEvent const *e) {
+QState QCalc_begin(QCalc *me, QEvt const * const e) {
     switch (e->sig) {
         . . .
         case OPER_SIG: {

+ 3 - 3
doxygen/snippets/qf_ctor.c

@@ -1,4 +1,4 @@
-void Philosopher_ctor(Philosopher *me) {
-    QActive_ctor(&me->super, (QStateHandler)&Philosopher_initial);
-    QTimeEvt_ctor(&me->timeEvt, TIMEOUT_SIG);
+void Philo_ctor(Philo * const me) {
+    QActive_ctor(&me->super, Q_STATE_CAST(&Philo_initial));
+    QTimeEvt_ctorX(&me->timeEvt, me, TIMEOUT_SIG, 0U);
 }

+ 14 - 19
doxygen/snippets/qf_main.c

@@ -1,26 +1,22 @@
-/* allocate storage for active objects, event queues, event pools,
-* subscriber lists, and stacks.
-*/
-static QEvent const *l_tableQueueSto[N_PHILO];
-static QEvent const *l_philoQueueSto[N_PHILO][N_PHILO];
-static QSubscrList   l_subscrSto[MAX_PUB_SIG];
-
-static union SmallEvent {
-    void *min_size;
-    TableEvt te;
-    /* other event types to go into this pool */
-} l_smlPoolSto[2*N_PHILO];              /* storage for the small event pool */
+static QEvt const *l_tableQueueSto[N_PHILO];
+static QEvt const *l_philoQueueSto[N_PHILO][N_PHILO];
+static QSubscrList l_subscrSto[MAX_PUB_SIG];
+
+/* storage for event pools... */
+static QF_MPOOL_EL(TableEvt) l_smlPoolSto[2*N_PHILO];         /* small pool */
 
 /*..........................................................................*/
-int main(int argc, char *argv[]) {
+int main(void) {
     uint8_t n;
 
     Philo_ctor();             /* instantiate all Philosopher active objects */
     Table_ctor();                    /* instantiate the Table active object */
 
-    BSP_init(argc, argv);           /* initialize the Board Support Package */
-
     QF_init();     /* initialize the framework and the underlying RT kernel */
+    BSP_init();                                       /* initialize the BSP */
+
+                             /* send object dictionaries for event pools... */
+    QS_OBJ_DICTIONARY(l_smlPoolSto);
 
     QF_psInit(l_subscrSto, Q_DIM(l_subscrSto));   /* init publish-subscribe */
 
@@ -30,12 +26,11 @@ int main(int argc, char *argv[]) {
     for (n = 0; n < N_PHILO; ++n) {          /* start the active objects... */
         QActive_start(AO_Philo[n], (uint8_t)(n + 1),
                       l_philoQueueSto[n], Q_DIM(l_philoQueueSto[n]),
-                      (void *)0, 0, (QEvent *)0);
+                      (void *)0, 0U, (QEvt *)0);
     }
     QActive_start(AO_Table, (uint8_t)(N_PHILO + 1),
                   l_tableQueueSto, Q_DIM(l_tableQueueSto),
-                  (void *)0, 0, (QEvent *)0);
-    QF_run();                                     /* run the QF application */
+                  (void *)0, 0U, (QEvt *)0);
 
-    return 0;
+    return QF_run();                              /* run the QF application */
 }

+ 3 - 4
doxygen/snippets/qf_post.c

@@ -1,12 +1,11 @@
 extern QActive *AO_Table;
 
-QState Philosopher_hungry(Philosopher *me, QEvent const *e) {
-    TableEvt *pe;
+QState Philoso_hungry(Philo * const me, QEvt const * const e) {
     switch (e->sig) {
         case Q_ENTRY_SIG: {
-            pe = Q_NEW(TableEvt, HUNGRY_SIG); /* dynamically allocate event */
+            TableEvt *pe = Q_NEW(TableEvt, HUNGRY_SIG); /* dynamic alloc */
             pe->philNum = me->num;
-            QActive_postFIFO(AO_Table, (QEvent *)pe);     /* direct posting */
+            QACTIVE_POST(AO_Table, &pe->super, me); /* direct posting */
             return Q_HANDLED();
         }
         . . .

+ 11 - 0
doxygen/snippets/qf_postx.c

@@ -0,0 +1,11 @@
+extern QActive *AO_Table;
+
+    . . .
+    /* typically inside a state machine action */
+    TableEvt *pe;
+    Q_NEW_X(pe, TableEvt, 5U, HUNGRY_SIG); /* dynamic alloc, margin==5 */
+    if (pe != (TableEvt *)0) {
+        pe->philNum = me->num;
+        QACTIVE_POST_X(AO_Table, &pe->super, 3U, me); /* margin==3 */
+    }
+    . . .

+ 6 - 5
doxygen/snippets/qf_qactive.c

@@ -1,5 +1,6 @@
-typedef struct PhilosopherTag {
-    QActive super;                                  /* derives from QActive */
-    uint8_t num;                              /* number of this philosopher */
-    QTimeEvt timeEvt;                       /* to timeout thining or eating */
-} Philosopher;
+typedef struct PhiloTag {
+    QActive super;       /* inherits QActive */
+
+    QTimeEvt timeEvt;    /* to timeout thining or eating */
+    uint8_t num;         /* this philosopher's number */
+} Philo;

+ 11 - 11
doxygen/snippets/qf_start.c

@@ -1,18 +1,18 @@
-static Philosopher l_philo[N];              /* N Philosopher active objects */
-static QEvent const *l_philQueueSto[N][N];/* storage for Philo event queues */
-static int l_philoStk[N][256]; /* stacks for the Philosopher active objects */
+static Philo l_philo[N];                  /* N Philo active objects */
+static QEvt const *l_philQueueSto[N][N];  /* storage for Philo event queues */
+static int l_philoStk[N][256];       /* stacks for the Philo active objects */
 
-main() {
+int main() {
     . . .
     for (n = 0; n < N; ++n) {
-        TableEvt ie;        /* initialization event for the Philosopher HSM */
+        TableEvt ie;               /* initialization event for the Philo SM */
         ie.philNum = n;
-        Philosopher_ctor(&l_philo[n]);
-        QActive_start((QActive *)&l_philo[n],       /* Philosopher number n */
-                      (uint8_t)(n*10 + 1),                      /* priority */
-                      l_philoQueueSto[n], Q_DIM(l_philoQueueSto[n]),/*queue */
-                      l_philoStk[n], sizeof(l_philoStk[n]),/*uC/OS-II stack */
-                      (QEvent const *)&ie);         /* initialization event */
+        Philo_ctor(&l_philo[n]);
+        QActive_start((QActive *)&l_philo[n],              /* Philo pointer */
+            (uint8_t)(n*10 + 1),                           /* priority */
+            l_philoQueueSto[n], Q_DIM(l_philoQueueSto[n]), /* queue */
+            l_philoStk[n], sizeof(l_philoStk[n]),          /* uC/OS-II stack */
+            &ie.super);                              /* initialization event */
     }
     . . .
 } 

+ 7 - 6
doxygen/snippets/qf_state.c

@@ -1,19 +1,20 @@
-QState Philosopher_eating(Philosopher *me, QEvent const *e) {
+QState Philo_eating(Philo * const me, QEvt const * const e) {
     TableEvt *pe;
     switch (e->sig) {
         case Q_ENTRY_SIG: {
-            QTimeEvt_postIn(&me->timeEvt, (QActive *)me, EAT_TIME);
+            QTimeEvt_armX(&me->timeEvt, EAT_TIME, 0U); /* one shot */
             return Q_HANDLED();
         }
-        case TIMEOUT_SIG: {
-            return Q_TRAN(&Philosopher_thinking);
-        }
         case Q_EXIT_SIG: {
+            QTimeEvt_disarm(&me->timeEvt);
             pe = Q_NEW(TableEvt, DONE_SIG);
             pe->philNum = me->num;
-            QF_publish((QEvent *)pe);
+            QF_PUBLISH((QEvt *)pe, me);
             return Q_HANDLED();
         }
+        case TIMEOUT_SIG: {
+            return Q_TRAN(&Philosopher_thinking);
+        }
     }
     return Q_SUPER(&QHsm_top);
 }

+ 1 - 1
doxygen/snippets/qf_subscribe.c

@@ -1,4 +1,4 @@
-QState Table_initial(Table *me, QEvent const *e) {
+QState Table_initial(Table * const me, QEvt const * const e) {
     uint8_t n;
     (void)e;                               /* suppress the compiler warning */
 

+ 2 - 2
doxygen/snippets/qs_objDic.c

@@ -1,5 +1,5 @@
 void tableStart(uint8_t prio,
-                QEvent const *qSto[], uint32_t qLen,
+                QEvt const *qSto[], uint32_t qLen,
                 void *stkSto, uint32_t stkSize)
 {
     static Table table;
@@ -9,5 +9,5 @@ void tableStart(uint8_t prio,
     Table_ctor(&table);
     QActive_start((QActive *)&table, prio,
                   qSto, qLen, stkSto, stkSize,
-                  (QEvent *)0);
+                  (QEvt *)0);
 }

+ 1 - 1
doxygen/snippets/qs_sigDic.c

@@ -1,4 +1,4 @@
-QState Table_initial(Table *me, QEvent const *e) {
+QState Table_initial(Table * const me, QEvt const * const e) {
     uint8_t n;
     (void)e;                               /* suppress the compiler warning */
 

+ 0 - 240
examples/80251/vanilla/keil/dpp-mcb251/START251.A51

@@ -1,240 +0,0 @@
-;------------------------------------------------------------------------------
-;  This file is part of the C251 Compiler package
-;  Copyright KEIL ELEKTRONIK GmbH 1995 - 2000
-;------------------------------------------------------------------------------
-;  START251.A51:  This code is executed after processor reset.
-;
-;  To translate this file use A251 with the following invocation:
-;
-;     A251 START251.A51  [ MODSRC ] [ SET (ROMHUGE) ]
-;  whereby:
-;     MODSRC         defines the 251 Source Mode  (default is Binary Mode)
-;     SET (ROMHUGE)  defines the ROM (HUGE) Mode  (default is ROM(LARGE) )
-;
-;  To link the modified STARTUP.OBJ file to your application use the following
-;  L251 invocation:
-;
-;     L251 START251.OBJ, <your object file list> <controls>
-;
-;------------------------------------------------------------------------------
-;
-;  251 Configuration Bytes Definition for off-chip (external) config bytes
-;
-$SET (CONFIGB = 0)   ; Set this variable if you want to set external config
-;                    ; bytes at address FF:FFF8 and FF:FFF9.
-;
-; Wait State for PSEN#/RD#/WR# signal except region 01:xxxx (WSA1 & WSA0 Bits)
-; WSA        Val  Description
-; ---        ---  -----------
-WSA  EQU 3  ; 3 = 0 wait state for all regions except region 01:xxxx
-;           ; 2 = extended to 1 wait state  for all regions except 01:xxxx
-;           ; 1 = extended to 2 wait states for all regions except 01:xxxx
-;           ; 0 = extended to 3 wait states for all regions except 01:xxxx
-;
-; Extend ALE pulse
-; XALE       Val  Description
-; ----       ---  -----------
-XALE EQU 1  ; 1 = ALE pulse is one TOSC
-;           ; 0 = ALE pulse is three TOSC, this adds one external wait state
-;
-; RD# and PSEN# Function Select  (RD1 and RD0 Bits)
-; RD         Val  RD Range   PSEN Range  P1.7 Func  Features
-; --         ---  --------   ----------  ---------  --------
-RDRG EQU 3  ; 3 = <=7F:FFFF  >=80:FFFF   P1.7/CEX4  Compatible with 8051
-;           ; 2 = P3.7 only  All address P1.7/CEX4  One additional port pin
-;           ; 1 = RD#=A16    All address P1.7/CEX4  128K External Address space
-;           ; 0 = RD#=A16    All address P1.7=A17   256K External Address space
-;
-; Page Mode Select
-; PAGE       Val  Description
-; ----       ---  -----------
-PAGM EQU 1  ; 1 = Non-page Mode (A15:8 on P2, A7:0/D7:0 on P0, 8051 compatible)
-;           ; 0 = Page Mode (A15:8/D7:0 on P2, A7:0 on P0)
-;
-; Interrupt Mode Select
-; INTR       Val  Description
-; ----       ---  -----------
-INTR EQU 1  ; 1 = Interrupt pushes 4 bytes onto the stack (PC & PSW1)
-;           ; 0 = Interrupt pushes 2 bytes onto the stack (PCL & PCH only)
-;
-; Extended Data Float (EDF) Timing Feature
-; EDF        Val  Description
-; ----       ---  -----------
-EDF  EQU 1  ; 1 = Standard (Compatibility) Mode
-;           ; 0 = extend data float timing for slow memory devices
-;
-; Wait State for PSEN#/RD#/WR# signal for region 01:xxxx (WSB1 & WSB0 Bits)
-; WSB        Val  Description
-; ---        ---  -----------
-WSB  EQU 3  ; 3 = 0 wait state for region 01:xxxx
-;           ; 2 = extended to 1 wait state  for regions 01:xxxx
-;           ; 1 = extended to 2 wait states for regions 01:xxxx
-;           ; 0 = extended to 3 wait states for regions 01:xxxx
-;
-; EPROM/ROM Mapping
-; WSA        Val  Description
-; ---        ---  -----------
-EMAP EQU 1 ;  1 = Map internal ROM only to region FF:xxxx
-;          ;  0 = Map higher 8KB of internal ROM to region 00:E000 - 00:FFFF
-;
-;  Note:  the bit SRC is defined with the A251 directive MODSRC/MODBIN 
-; 
-;------------------------------------------------------------------------------
-;
-;  User-defined Power-On Zero Initialization of Memory
-;
-;  With the following EQU statements the zero initialization of memory
-;  at processor reset can be defined:
-;
-;		; the absolute start-address of EDATA memory is always 0
-EDATALEN	EQU	420H	; the length of EDATA memory in bytes.
-;
-XDATASTART	EQU	10000H	; the absolute start-address of XDATA memory
-XDATALEN	EQU	0	; the length of XDATA memory in bytes.
-;
-HDATASTART	EQU	10000H	; the absolute start-address of HDATA memory
-HDATALEN	EQU	0	; the length of HDATA memory in bytes.
-;
-;  Note:  The EDATA space overlaps physically the DATA, IDATA, BIT and EBIT
-;         areas of the 251 CPU.
-;
-;------------------------------------------------------------------------------
-;
-;  CPU Stack Size Definition 
-;
-;  The following EQU statement defines the stack space available for the
-;  251 application program.  It should be noted that the stack space must
-;  be adjusted according the actual requirements of the application.
-;
-STACKSIZE	EQU	300	; adjust to your application
-;
-;------------------------------------------------------------------------------
-;
-;  Reentrant Stack Initilization 
-;
-;  Note:  the defintions below are only required when you application contains
-;         reentrant code which is written with C251 Version 1 or C51.  You
-;         should not enable IBPSTACK or XBPSTACK for reentrant code written
-;         with C251 Version 2 since this compiler is using the hardware stack
-;         of the 251 rather than a simulated stack area.
-;
-;  The following EQU statements define the stack pointer for reentrant
-;  functions and initialized it:
-;
-;  Stack Space for reentrant functions in the SMALL model.
-IBPSTACK	EQU	0	; set to 1 if small reentrant is used.
-IBPSTACKTOP	EQU	0FFH+1	; set top of stack to highest location+1.
-;
-;  Stack Space for reentrant functions in the LARGE model.	
-XBPSTACK	EQU	0	; set to 1 if large reentrant is used.
-XBPSTACKTOP	EQU	0FFFFH+1; set top of stack to highest location+1.
-;
-;------------------------------------------------------------------------------
-
-$IF ROMHUGE
-Prefix	LIT '?'
-Model   LIT 'FAR'
-PRSeg	LIT 'ECODE'
-$ELSE
-Prefix  LIT ''
-Model   LIT 'NEAR'
-PRSeg	LIT 'CODE'
-$ENDIF
-
-$include (reg251s.inc)
-
-EXTRN NUMBER (?C?XDATASEG)		; Start of XDATA Segment
-
-		NAME	?C_START{Prefix}
-
-
-; Setting of the Chip Configuration Bytes
-$IF __MODSRC__
-SRCM		EQU	1  ; Select Source Mode
-$ELSE
-SRCM		EQU	0  ; Select Binary Mode
-$ENDIF
-
-$IF (CONFIGB)
-CONFIG0		EQU     (WSA*20H)+(XALE*10H)+(RDRG*4)+(PAGM*2)+SRCM+080H
-CONFIG1		EQU	(INTR*10H)+(EDF*8)+(WSB*2)+EMAP+0E0H
-	
-		CSEG	AT	0FFF8H
-		DB	CONFIG0		; Config Byte 0
-		DB	CONFIG1		; Config Byte 1
-$ENDIF
-
-
-?C_C51STARTUP	SEGMENT   CODE
-?C_C51STARTUP?3 SEGMENT   CODE
-
-?STACK		SEGMENT   EDATA
-
-		RSEG	?STACK
-		DS	STACKSIZE	; Stack Space 100H Bytes
-
-		EXTRN PRSeg (MAIN{Prefix})
-		PUBLIC	?C_STARTUP{Prefix}
-		PUBLIC	?C?STARTUP{Prefix}
-
-		CSEG	AT	0
-?C?STARTUP{Prefix}:
-?C_STARTUP{Prefix}:
-		LJMP	STARTUP1
-
-		RSEG	?C_C51STARTUP
-
-STARTUP1:
-		MOV	DPXL,#?C?XDATASEG
-
-IF EDATALEN <> 0
-		MOV	WR8,#EDATALEN - 1
-		CLR	A
-EDATALOOP:	MOV	@WR8,R11
-		DEC	WR8,#1
-		JNE	EDATALOOP
-ENDIF
-
-IF XDATALEN <> 0
-		MOV	DPTR,#WORD0 XDATASTART
-		MOV	WR6,#XDATALEN
-		CLR	A
-XDATALOOP:	MOVX	@DPTR,A
-		INC	DPTR
-		DEC	WR6,#1
-		JNE	XDATALOOP
-ENDIF
-
-IF HDATALEN <> 0
-		MOV	DR16,#WORD0 HDATALEN
-IF (WORD2 HDATALEN) <> 0
-		MOV	WR16,#WORD2 HDATALEN
-ENDIF
-		MOV	WR12,#WORD2 HDATASTART
-		MOV	WR14,#WORD0 HDATASTART
-		CLR	A
-HDATALOOP:	MOV	@DR12,R11
-		INC	DR12,#1
-		DEC	DR16,#1
-		JNE	HDATALOOP
-ENDIF
-
-IF IBPSTACK <> 0
-EXTRN DATA (?C_IBP)
-
-		MOV	?C_IBP,#LOW IBPSTACKTOP
-ENDIF
-
-IF XBPSTACK <> 0
-EXTRN DATA (?C_XBP)
-
-		MOV	?C_XBP,#HIGH XBPSTACKTOP
-		MOV	?C_XBP+1,#LOW XBPSTACKTOP
-ENDIF
-
-		MOV	DR60,#WORD0 (?STACK-1)
-
-		RSEG	?C_C51STARTUP?3
-		JMP	Model MAIN{Prefix}
-
-		END

+ 0 - 272
examples/80251/vanilla/keil/dpp-mcb251/bsp.c

@@ -1,272 +0,0 @@
-/*****************************************************************************
-* Product: Board Support Package for MCB251, QDPP example, Vanilla port
-* Last Updated for Version: 4.0.01
-* Date of the Last Update:  Aug 11, 2008
-*
-*                    Q u a n t u m     L e a P s
-*                    ---------------------------
-*                    innovating embedded systems
-*
-* Copyright (C) 2002-2008 Quantum Leaps, LLC. All rights reserved.
-*
-* This software may be distributed and modified under the terms of the GNU
-* General Public License version 2 (GPL) as published by the Free Software
-* Foundation and appearing in the file GPL.TXT included in the packaging of
-* this file. Please note that GPL Section 2[b] requires that all works based
-* on this software must also be made publicly available under the terms of
-* the GPL ("Copyleft").
-*
-* Alternatively, this software may be distributed and modified under the
-* terms of Quantum Leaps commercial licenses, which expressly supersede
-* the GPL and are specifically designed for licensees interested in
-* retaining the proprietary status of their code.
-*
-* Contact information:
-* Quantum Leaps Web site:  http://www.quantum-leaps.com
-* e-mail:                  info@quantum-leaps.com
-*****************************************************************************/
-#include "qp_port.h"
-#include "dpp.h"
-#include "bsp.h"
-
-Q_DEFINE_THIS_FILE
-
-sfr16 TMR2RL = 0xCA;          /* Timer2 reload value (16-bit register pair) */
-sfr16 TMR2   = 0xCC;               /* Timer2 counter (16-bit register pair) */
-
-/* global objects ----------------------------------------------------------*/
-volatile uint8_t bdata QF_pcon;  /* shadow of the PCON register, see NOTE03 */
-
-/*..........................................................................*/
-void BSP_init(void) {
-    P1 = 0x80;                                       /* extinguish all LEDs */
-
-    /* setup the Timer2 to generate the system clock-tick interrupt */
-    TR2 = 0;                                                 /* stop Timer2 */
-    T2MOD  = 0;                    /* set Timer2 to auto-reload, up-counter */
-    /* setup the reload registers for the desired tick rate... */
-    TMR2RL = (uint16_t)(0x10000 - BSP_PERIPHERAL_HZ/BSP_TICKS_PER_SEC + 0.5);
-    TMR2 = TMR2RL;
-
-    if (QS_INIT((void *)0) == 0) {    /* initialize the QS software tracing */
-        Q_ERROR();
-    }
-}
-/*..........................................................................*/
-void BSP_displyPhilStat(uint8_t n, char const *stat) {
-    switch (n) {
-        case 0: LED0 = (stat[0] == 'e'); break;
-        case 1: LED1 = (stat[0] == 'e'); break;
-        case 2: LED2 = (stat[0] == 'e'); break;
-        case 3: LED3 = (stat[0] == 'e'); break;
-        case 4: LED4 = (stat[0] == 'e'); break;
-        default: Q_ERROR(); break;          /* unexpected Philospher number */
-    }
-}
-/*..........................................................................*/
-void BSP_busyDelay(void) {
-}
-/*..........................................................................*/
-void QF_onIdle(void) {        /* entered with interrupts LOCKED, see NOTE01 */
-
-    LED6 = 1;                         /* toggle LED6 on and off, see NOTE01 */
-    LED6 = 0;
-
-#ifdef Q_SPY
-    if (TI != 0) {                                    /* ready to transmit? */
-        uint16_t b = QS_getByte();          /* get the next QS byte to send */
-        QF_INT_UNLOCK(dummy);
-
-        if (b != QS_EOD) {                  /* End-Of-Data not reached yet? */
-            TI = 0;      /* clear the transmit-interrupt flag for next time */
-            SBUF = (uint8_t)b;  /* insert the byte to the transmit register */
-        }
-    }
-    else {                                            /* still transmitting */
-        QF_INT_UNLOCK(dummy);               /* either way unlock interrupts */
-    }
-#elif (defined NDEBUG)
-    /* stop as many peripheral clocks as possible for you application... */
-    QF_pcon = PCON | 0x01;    /* set the IDL bit in the PCON shadow, NOTE03 */
-
-    QF_INT_UNLOCK(dummy);                          /* unlock the interrupts */
-    PCON = QF_pcon;                          /* go to low-power, see NOTE03 */
-#else
-    QF_INT_UNLOCK(dummy);                          /* unlock the interrupts */
-#endif
-}
-/*..........................................................................*/
-void QF_onCleanup(void) {
-}
-/*..........................................................................*/
-void Q_onAssert(char const Q_ROM * const Q_ROM_VAR file, int line) {
-    (void)file;                                   /* avoid compiler warning */
-    (void)line;                                   /* avoid compiler warning */
-
-    /* stop interrupts to preserve the system's state as much as possible.. */
-    /* NOTE: global interrupt lock blocks the ROM-monitor, so don't do this */
-    /* QF_INT_LOCK(dummy); */
-
-    TR2 = 0;                             /* stop Timer2 (system clock tick) */
-    /* ... stop other interrupts in your system individually */
-
-    LED0 = 1;
-    LED1 = 1;
-    LED2 = 1;
-    LED3 = 1;
-    LED4 = 1;
-    for (;;) {       /* NOTE: replace the loop with reset for final version */
-    }
-}
-
-/*--------------------------------------------------------------------------*/
-#ifdef Q_SPY
-
-#if (BSP_CPU_HZ == 12000000)
-                    /* best match for the standard PC serial port baud rate */
-    #define QS_BAUD_RATE        4800
-#elif (BSP_CPU_HZ == 11059000)
-                    /* best match for the standard PC serial port baud rate */
-    #define QS_BAUD_RATE        57600
-#else
-    #error "Please choose the best QSpy baud rate for your custom clock"
-#endif
-
-#define QS_BUF_SIZE        (350)
-
-QSTimeCtr QS_tickTime;                           /* keeps timetsamp at tick */
-
-/*..........................................................................*/
-uint8_t QS_onStartup(void const *arg) {
-    static uint8_t qsBuf[QS_BUF_SIZE];            /* buffer for Quantum Spy */
-
-    (void)arg;                                /* avoid the compiler warning */
-    QS_initBuf(qsBuf, sizeof(qsBuf));
-
-    /* setup Timer1-based baud rate generator */
-    TR1 = 0;                                                 /* stop Timer1 */
-    ET1 = 0;                                    /* disable Timer1 interrupt */
-    PCON |= 0x80;              /* 0x80 = SMOD: set serial baud rate doubler */
-    TMOD &= ~0xF0;                                /* clear Timer1 mode bits */
-    TMOD |= 0x20;                                 /* put Timer1 into MODE 2 */
-           /* set the Timer1 reload value to generate the desired baud rate */
-    TH1 = (uint8_t)(0x100 - 2.0*BSP_PERIPHERAL_HZ/32.0/QS_BAUD_RATE + 0.5);
-    TL1 = TH1;
-
-    /* setup serial port registers */
-    P3 |= (1 << 1); /* configure P3.1 as controlled by alternative function */
-    SCON = 0x40;                                      /* serial port MODE 1 */
-    REN = 0;                                     /* disable serial receiver */
-    TR1 = 1;                                                /* start Timer1 */
-    TI  = 1;                                         /* enable transmitting */
-
-                                                 /* setup the QS filters... */
-    QS_FILTER_ON(QS_ALL_RECORDS);
-
-//    QS_FILTER_OFF(QS_QEP_STATE_EMPTY);
-//    QS_FILTER_OFF(QS_QEP_STATE_ENTRY);
-//    QS_FILTER_OFF(QS_QEP_STATE_EXIT);
-//    QS_FILTER_OFF(QS_QEP_STATE_INIT);
-//    QS_FILTER_OFF(QS_QEP_INIT_TRAN);
-//    QS_FILTER_OFF(QS_QEP_INTERN_TRAN);
-//    QS_FILTER_OFF(QS_QEP_TRAN);
-//    QS_FILTER_OFF(QS_QEP_dummyD);
-
-    QS_FILTER_OFF(QS_QF_ACTIVE_ADD);
-    QS_FILTER_OFF(QS_QF_ACTIVE_REMOVE);
-    QS_FILTER_OFF(QS_QF_ACTIVE_SUBSCRIBE);
-    QS_FILTER_OFF(QS_QF_ACTIVE_UNSUBSCRIBE);
-    QS_FILTER_OFF(QS_QF_ACTIVE_POST_FIFO);
-    QS_FILTER_OFF(QS_QF_ACTIVE_POST_LIFO);
-    QS_FILTER_OFF(QS_QF_ACTIVE_GET);
-    QS_FILTER_OFF(QS_QF_ACTIVE_GET_LAST);
-    QS_FILTER_OFF(QS_QF_EQUEUE_INIT);
-    QS_FILTER_OFF(QS_QF_EQUEUE_POST_FIFO);
-    QS_FILTER_OFF(QS_QF_EQUEUE_POST_LIFO);
-    QS_FILTER_OFF(QS_QF_EQUEUE_GET);
-    QS_FILTER_OFF(QS_QF_EQUEUE_GET_LAST);
-    QS_FILTER_OFF(QS_QF_MPOOL_INIT);
-    QS_FILTER_OFF(QS_QF_MPOOL_GET);
-    QS_FILTER_OFF(QS_QF_MPOOL_PUT);
-    QS_FILTER_OFF(QS_QF_PUBLISH);
-    QS_FILTER_OFF(QS_QF_NEW);
-    QS_FILTER_OFF(QS_QF_GC_ATTEMPT);
-    QS_FILTER_OFF(QS_QF_GC);
-//    QS_FILTER_OFF(QS_QF_TICK);
-    QS_FILTER_OFF(QS_QF_TIMEEVT_ARM);
-    QS_FILTER_OFF(QS_QF_TIMEEVT_AUTO_DISARM);
-    QS_FILTER_OFF(QS_QF_TIMEEVT_DISARM_ATTEMPT);
-    QS_FILTER_OFF(QS_QF_TIMEEVT_DISARM);
-    QS_FILTER_OFF(QS_QF_TIMEEVT_REARM);
-    QS_FILTER_OFF(QS_QF_TIMEEVT_POST);
-    QS_FILTER_OFF(QS_QF_INT_LOCK);
-    QS_FILTER_OFF(QS_QF_INT_UNLOCK);
-    QS_FILTER_OFF(QS_QF_ISR_ENTRY);
-    QS_FILTER_OFF(QS_QF_ISR_EXIT);
-
-    return (uint8_t)1;                                    /* return success */
-}
-/*..........................................................................*/
-void QS_onCleanup(void) {
-}
-/*..........................................................................*/
-void QS_onFlush(void) {
-    uint16_t b;
-    while ((b = QS_getByte()) != QS_EOD) { /* next QS trace byte available? */
-        while (TI == 0) {   /* hang in a loop as long as transmit not ready */
-        }
-        TI = 0;          /* clear the transmit-interrupt flag for next time */
-        SBUF = (uint8_t)b;
-    }
-}
-/*..........................................................................*/
-QSTimeCtr QS_onGetTime(void) {            /* invoked with interrupts locked */
-    uint8_t volatile t2h1 = TH2;                                  /* step 1 */
-    uint8_t volatile t2l  = TL2;                                  /* step 2 */
-    uint8_t volatile t2h2 = TH2;                                  /* step 3 */
-    QSTimeCtr tickTime = QS_tickTime;
-
-    if (TF2 != 0) {    /* Timer2 auto-reloaded but tick ISR didn't run yet? */
-        tickTime += (QSTimeCtr)(BSP_PERIPHERAL_HZ/BSP_TICKS_PER_SEC + 0.5);
-    }
-
-    if (t2h1 == t2h2) {   /* the high-register unchanged from step 1 and 3? */
-        return tickTime
-               + (QSTimeCtr)((uint16_t)t2l + ((uint16_t)t2h1 << 8));
-    }
-    else {                /* the high-register changed between step 1 and 3 */
-        return tickTime + ((uint16_t)t2h2 << 8);
-    }
-}
-#endif                                                             /* Q_SPY */
-/*--------------------------------------------------------------------------*/
-
-/*****************************************************************************
-* NOTE01:
-* The LED6 of the MCB251 board is used to visualize the idle loop activity.
-* The brightness of the LED is proportional to the frequency of invocations
-* of the idle loop. Please note that the LED is toggled with interrupts
-* locked, so no interrupt execution time contributes to the brightness of
-* the LED.
-*
-* NOTE02:
-* The callback function QF_onIdle() is called with interrupts locked, because
-* the idle condition can be invalidated by any enabled interrupt that would
-* post events. The QF_onIdle() function *must* unlock interrupts internally
-*
-* NOTE03:
-* The low-power mode must be entered with interrupts locked to avoid
-* an interrupt to preempt the transition to the low-power mode. However,
-* the 80x51 architecture does not provide an *atomic* transition to the Idle
-* mode with simultaneous unlocking interrupts. Instead, here the PCON
-* register is shadowed in the QF_pcon bdata variable. The idle mode
-* is set first in the shadow register QF_pcon. At the end of every interrupt,
-* the ISR copies the PCON value into the QF_pcon shadow (the 80x51 clears the
-* IDL and PD bits in the PCON register upon interrupt entry). Later in
-* QF_onIdle(), the PCON register is restored from the shadow QF_pcon, which
-* the 80x51 performs *atomically* as a single machine instruction (such as
-* MOV 87H,20H). If the interrupt gets serviced between unlocking interrupts
-* and restoring PCON from the shadow, the IDL/PD bits will be cleared in the
-* shadow, so the machine will *not* go to the Idle?PD mode. Only if the
-* IDL/PD bits survive in the shadow, the Idle/PD mode is entered.
-*/

+ 0 - 55
examples/80251/vanilla/keil/dpp-mcb251/bsp.h

@@ -1,55 +0,0 @@
-/*****************************************************************************
-* Product: DPP example, Board Support Package for MCB251
-* Last Updated for Version: 4.0.01
-* Date of the Last Update:  Aug 11, 2008
-*
-*                    Q u a n t u m     L e a P s
-*                    ---------------------------
-*                    innovating embedded systems
-*
-* Copyright (C) 2002-2008 Quantum Leaps, LLC. All rights reserved.
-*
-* This software may be distributed and modified under the terms of the GNU
-* General Public License version 2 (GPL) as published by the Free Software
-* Foundation and appearing in the file GPL.TXT included in the packaging of
-* this file. Please note that GPL Section 2[b] requires that all works based
-* on this software must also be made publicly available under the terms of
-* the GPL ("Copyleft").
-*
-* Alternatively, this software may be distributed and modified under the
-* terms of Quantum Leaps commercial licenses, which expressly supersede
-* the GPL and are specifically designed for licensees interested in
-* retaining the proprietary status of their code.
-*
-* Contact information:
-* Quantum Leaps Web site:  http://www.quantum-leaps.com
-* e-mail:                  info@quantum-leaps.com
-*****************************************************************************/
-#ifndef bsp_h
-#define bsp_h
-
-#include <reg251s.h>                         /* SFR declarations for 80251S */
-
-#define BSP_CPU_HZ           11059000
-#define BSP_TICKS_PER_SEC    20
-#define BSP_PERIPHERAL_HZ    (11059000/12)
-
-/* LEDs of the MCB251 board */
-sbit LED0 = P1 ^ 0;
-sbit LED1 = P1 ^ 1;
-sbit LED2 = P1 ^ 2;
-sbit LED3 = P1 ^ 3;
-sbit LED4 = P1 ^ 4;
-sbit LED5 = P1 ^ 5;
-sbit LED6 = P1 ^ 6;
-
-void BSP_init(void);
-void BSP_displyPhilStat(uint8_t n, char const *stat);
-void BSP_busyDelay(void);
-
-#ifdef Q_SPY
-    extern QSTimeCtr QS_tickTime;                /* keeps timetsamp at tick */
-#endif
-
-#endif                                                             /* bsp_h */
-

+ 0 - 106
examples/80251/vanilla/keil/dpp-mcb251/dpp-mcb251.Opt

@@ -1,106 +0,0 @@
-### uVision2 Project, (C) Keil Software
-### Do not modify !
-
- cExt (*.c)
- aExt (*.a*; *.src)
- oExt (*.obj)
- lExt (*.lib)
- tExt (*.txt)
- pExt (*.plm)
- CppX (*.cpp)
- DaveTm { 0,0,0,0,0,0,0,0 }
-
-Target (Debug), 0x0001 // Tools: 'MCS-251'
-Target (Release), 0x0001 // Tools: 'MCS-251'
-Target (Spy), 0x0001 // Tools: 'MCS-251'
-GRPOPT 1,(Source Code),1,0,0
-GRPOPT 2,(Startup Code),1,0,0
-GRPOPT 3,(Header Files),1,0,0
-GRPOPT 4,(QP-dbg),1,0,0
-GRPOPT 5,(QP-rel),1,0,0
-GRPOPT 6,(QP-spy),1,0,0
-
-OPTFFF 1,1,1,419430400,0,0,0,0,<.\bsp.c><bsp.c> 
-OPTFFF 1,2,1,603979776,0,0,0,0,<.\main.c><main.c> 
-OPTFFF 1,3,1,0,0,0,0,0,<.\table.c><table.c> 
-OPTFFF 1,4,1,0,0,0,0,0,<.\philo.c><philo.c> 
-OPTFFF 1,5,1,1006632960,0,0,0,0,<.\isr.c><isr.c> 
-OPTFFF 2,6,2,150994944,0,0,0,0,<.\START251.A51><START251.A51> 
-OPTFFF 3,7,5,0,0,0,0,0,<.\bsp.h><bsp.h> 
-OPTFFF 3,8,5,0,0,0,0,0,<.\dpp.h><dpp.h> 
-OPTFFF 4,9,4,0,0,0,0,0,<..\..\..\..\..\ports\80251\vanilla\keil\dbg\QF.LIB><QF.LIB> 
-OPTFFF 4,10,4,0,0,0,0,0,<..\..\..\..\..\ports\80251\vanilla\keil\dbg\QEP.LIB><QEP.LIB> 
-OPTFFF 5,11,4,0,0,0,0,0,<..\..\..\..\..\ports\80251\vanilla\keil\rel\QF.LIB><QF.LIB> 
-OPTFFF 5,12,4,0,0,0,0,0,<..\..\..\..\..\ports\80251\vanilla\keil\rel\QEP.LIB><QEP.LIB> 
-OPTFFF 6,13,4,0,0,0,0,0,<..\..\..\..\..\ports\80251\vanilla\keil\spy\QS.LIB><QS.LIB> 
-OPTFFF 6,14,4,0,0,0,0,0,<..\..\..\..\..\ports\80251\vanilla\keil\spy\QEP.LIB><QEP.LIB> 
-OPTFFF 6,15,4,0,0,0,0,0,<..\..\..\..\..\ports\80251\vanilla\keil\spy\QF.LIB><QF.LIB> 
-
-
-TARGOPT 1, (Debug)
- CLK251=12000000
-  OPTTT 1,1,1,0
-  OPTHX 0,65535,0,0,0
-  OPTLX 120,65,8,<.\dbg\>
-  OPTOX 16
-  OPTLT 0,0,1,0,1,1,1,1,1,0,1,0
-  OPTXL 1,1,1,1,1,1,1,0,1
-  OPTFL 1,0,1
-  OPTBL 0,(Add on databooks)<DATASHTS\ADDBOOKS.PDF>
-  OPTBL 1,(Data Sheet)<DATASHTS\INTEL\8xC251Sx_DS.PDF>
-  OPTBL 2,(User's Manual)<DATASHTS\INTEL\8xC251Sx_UM.PDF>
-  OPTDL (S251.DLL)()(DP51.DLL)(-p251S)(S251.DLL)()(TP51.DLL)(-p251S)
-  OPTDBG 48126,-1,()()()()()()()()()() (BIN\MON251.DLL)()()()
-  OPTKEY 0,(MON251)(-S1 -B57600 -O4096)
-  OPTMM 1,0,(c:0x11b1)
-  OPTMM 2,0,(\measure\save_record)
-  OPTDF 0x84
-  OPTLE <>
-  OPTLC <>
-EndOpt
-
-TARGOPT 2, (Release)
- CLK251=16000000
-  OPTTT 1,1,1,0
-  OPTHX 0,65535,0,0,0
-  OPTLX 120,65,8,<.\rel\>
-  OPTOX 16
-  OPTLT 0,0,1,0,1,1,1,1,1,0,1,0
-  OPTXL 1,1,1,1,1,1,1,0,1
-  OPTFL 1,0,0
-  OPTBL 0,(Add on databooks)<DATASHTS\ADDBOOKS.PDF>
-  OPTBL 1,(Data Sheet)<DATASHTS\INTEL\8xC251Sx_DS.PDF>
-  OPTBL 2,(User's Manual)<DATASHTS\INTEL\8xC251Sx_UM.PDF>
-  OPTDL (S251.DLL)()(DP51.DLL)(-p251S)(S251.DLL)()(TP51.DLL)(-p251S)
-  OPTDBG 48126,-1,()()()()()()()()()() (BIN\MON251.DLL)()()()
-  OPTKEY 0,(MON251)(-S1 -B57600 -O4096)
-  OPTMM 1,0,(c:0x11b1)
-  OPTMM 2,0,(\measure\save_record)
-  OPTDF 0x84
-  OPTLE <>
-  OPTLC <>
-EndOpt
-
-TARGOPT 3, (Spy)
- CLK251=16000000
-  OPTTT 1,1,1,0
-  OPTHX 0,65535,0,0,0
-  OPTLX 120,65,8,<.\spy\>
-  OPTOX 16
-  OPTLT 0,0,1,0,1,1,1,1,1,0,1,0
-  OPTXL 1,1,1,1,1,1,1,0,1
-  OPTFL 1,0,0
-  OPTBL 0,(Add on databooks)<DATASHTS\ADDBOOKS.PDF>
-  OPTBL 1,(Data Sheet)<DATASHTS\INTEL\8xC251Sx_DS.PDF>
-  OPTBL 2,(User's Manual)<DATASHTS\INTEL\8xC251Sx_UM.PDF>
-  OPTDL (S251.DLL)()(DP51.DLL)(-p251S)(S251.DLL)()(TP51.DLL)(-p251S)
-  OPTDBG 48126,-1,()()()()()()()()()() (BIN\MON251.DLL)()()()
-  OPTKEY 0,(MON251)(-S1 -B57600 -O4096)
-  OPTMM 1,0,(d:0x00)
-  OPTMM 2,0,(\measure\save_record)
-  OPTSY 10,1,(*)
-  OPTDF 0x84
-  OPTLE <>
-  OPTLC <>
-EndOpt
-

+ 0 - 520
examples/80251/vanilla/keil/dpp-mcb251/dpp-mcb251.Uv2

@@ -1,520 +0,0 @@
-### uVision2 Project, (C) Keil Software
-### Do not modify !
-
-Target (Debug), 0x0001 // Tools: 'MCS-251'
-Target (Release), 0x0001 // Tools: 'MCS-251'
-Target (Spy), 0x0001 // Tools: 'MCS-251'
-
-Group (Source Code)
-Group (Startup Code)
-Group (Header Files)
-Group (QP-dbg)
-Group (QP-rel)
-Group (QP-spy)
-
-File 1,1,<.\bsp.c><bsp.c> 0x0 
-File 1,1,<.\main.c><main.c> 0x0 
-File 1,1,<.\table.c><table.c> 0x0 
-File 1,1,<.\philo.c><philo.c> 0x0 
-File 1,1,<.\isr.c><isr.c> 0x0 
-File 2,2,<.\START251.A51><START251.A51> 0x0 
-File 3,5,<.\bsp.h><bsp.h> 0x0 
-File 3,5,<.\dpp.h><dpp.h> 0x0 
-File 4,4,<..\..\..\..\..\ports\80251\vanilla\keil\dbg\QF.LIB><QF.LIB> 0x0 
-File 4,4,<..\..\..\..\..\ports\80251\vanilla\keil\dbg\QEP.LIB><QEP.LIB> 0x0 
-File 5,4,<..\..\..\..\..\ports\80251\vanilla\keil\rel\QF.LIB><QF.LIB> 0x0 
-File 5,4,<..\..\..\..\..\ports\80251\vanilla\keil\rel\QEP.LIB><QEP.LIB> 0x0 
-File 6,4,<..\..\..\..\..\ports\80251\vanilla\keil\spy\QS.LIB><QS.LIB> 0x0 
-File 6,4,<..\..\..\..\..\ports\80251\vanilla\keil\spy\QEP.LIB><QEP.LIB> 0x0 
-File 6,4,<..\..\..\..\..\ports\80251\vanilla\keil\spy\QF.LIB><QF.LIB> 0x0 
-
-
-Options 1,0,0  // Target 'Debug'
- Device (8xC251SB)
- Vendor (Intel)
- Cpu (IRAM(0 - 0x41F) CLOCK(16000000) IROM(0xFF0000-0xFF3FFF))
- FlashUt ()
- StupF ()
- FlashDR ()
- DevID ()
- Rgf (REG251S.H)
- Mem ()
- C ()
- A ()
- RL ()
- OH ()
- DBC_IFX ()
- DBC_CMS ()
- DBC_AMS ()
- DBC_LMS ()
- UseEnv=0
- EnvBin ()
- EnvInc ()
- EnvLib ()
- EnvReg (ÿIntel\)
- OrgReg (ÿIntel\)
- TgStat=16
- OutDir (.\dbg\)
- OutName (dpp-mcb251)
- GenApp=1
- GenLib=0
- GenHex=1
- Debug=1
- Browse=0
- LstDir (.\dbg\)
- HexSel=0
- MG32K=0
- TGMORE=0
- RunUsr 0 0 <>
- RunUsr 1 0 <>
- BrunUsr 0 0 <>
- BrunUsr 1 0 <>
- SVCSID <>
- MODEL25=1
- RTOS25=0
- ROMSZ25=3
- DHOLD25=0
- XHOLD25=0
- FHOLD25=0
- T251FL=92
- CBANKS2=0
- RCB25 { 0,0,0,0,0,0,0,1,0 }
- IRO25 { 1,0,0,255,0,0,64,0,0 }
- ERA25 { 0,0,0,0,0,32,4,0,0 }
- XRA25 { 0,0,0,0,0,0,0,0,0 }
- OCM251 { 1,0,0,255,0,0,128,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }
- C251F1=19279952
- C251F2=0
- C251MSC (FIXDRK WARNING(disable=138))
- C251DEF ()
- C251UDF ()
- INCC2 (.,..\..\..\..\..\include,..\..\..\..\..\ports\80251\vanilla\keil)
- AX51FL=4
- AX51MSC (FIXDRK REGISTERBANK(0))
- AX51SET ()
- AX51RST ()
- INCA5 ()
- PropFld { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }
- IncBld=1
- AlwaysBuild=0
- GenAsm=0
- AsmAsm=0
- PublicsOnly=0
- StopCode=3
- CustArgs ()
- LibMods ()
- BankNo=65535
- LX51FL=300
- LX51OVL ()
- LX51MSC (NOOVERLAY)
- LX51DWN (25)
- LX51LFI ()
- LX51ASN ()
- LX51RES (0xFF0003-0XFF0005,0XFF003B-0XFF003D,0XFF007B-0XFF007D)
- LX51CCL ()
- LX51UCL ()
- LX51CSC ()
- LX51UCS ()
- LX51COB ()
- LX51XDB ()
- LX51PDB ()
- LX51BIB ()
- LX51DAB ()
- LX51IDB ()
- LX51PRC ()
- LX51STK ()
- LX51COS ()
- LX51XDS ()
- LX51BIS ()
- LX51DAS ()
- LX51IDS ()
-  OPTDL (S251.DLL)()(DP51.DLL)(-p251S)(S251.DLL)()(TP51.DLL)(-p251S)
-  OPTDBG 48126,-1,()()()()()()()()()() (BIN\MON251.DLL)()()()
- FLASH1 { 1,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0 }
- FLASH2 ()
- FLASH3 ()
- FLASH4 ()
-EndOpt
-
-Options 2,0,0  // Target 'Release'
- Device (8xC251SB)
- Vendor (Intel)
- Cpu (IRAM(0 - 0x41F) CLOCK(16000000) IROM(0xFF0000-0xFF3FFF))
- FlashUt ()
- StupF ()
- FlashDR ()
- DevID ()
- Rgf (REG251S.H)
- Mem ()
- C ()
- A ()
- RL ()
- OH ()
- DBC_IFX ()
- DBC_CMS ()
- DBC_AMS ()
- DBC_LMS ()
- UseEnv=0
- EnvBin ()
- EnvInc ()
- EnvLib ()
- EnvReg (ÿIntel\)
- OrgReg (ÿIntel\)
- TgStat=16
- OutDir (.\rel\)
- OutName (dpp-mcb251)
- GenApp=1
- GenLib=0
- GenHex=1
- Debug=0
- Browse=0
- LstDir (.\rel\)
- HexSel=0
- MG32K=0
- TGMORE=0
- RunUsr 0 0 <>
- RunUsr 1 0 <>
- BrunUsr 0 0 <>
- BrunUsr 1 0 <>
- SVCSID <>
- MODEL25=1
- RTOS25=0
- ROMSZ25=3
- DHOLD25=0
- XHOLD25=0
- FHOLD25=0
- T251FL=92
- CBANKS2=0
- RCB25 { 0,0,0,0,0,0,0,1,0 }
- IRO25 { 1,0,0,255,0,0,64,0,0 }
- ERA25 { 0,0,0,0,0,32,4,0,0 }
- XRA25 { 0,0,0,0,0,0,0,0,0 }
- OCM251 { 1,0,0,255,0,0,128,0,0,0,0,0,0,0,0,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }
- C251F1=19345489
- C251F2=0
- C251MSC (FIXDRK WARNING(disable=138))
- C251DEF (NDEBUG)
- C251UDF ()
- INCC2 (.,..\..\..\..\..\include,..\..\..\..\..\ports\80251\vanilla\keil)
- AX51FL=4
- AX51MSC (FIXDRK REGISTERBANK(0))
- AX51SET ()
- AX51RST ()
- INCA5 ()
- PropFld { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }
- IncBld=1
- AlwaysBuild=0
- GenAsm=0
- AsmAsm=0
- PublicsOnly=0
- StopCode=3
- CustArgs ()
- LibMods ()
- BankNo=65535
- LX51FL=300
- LX51OVL ()
- LX51MSC (NOOVERLAY)
- LX51DWN (25)
- LX51LFI ()
- LX51ASN ()
- LX51RES (0xFF0003-0XFF0005,0XFF003B-0XFF003D,0XFF007B-0XFF007D)
- LX51CCL ()
- LX51UCL ()
- LX51CSC ()
- LX51UCS ()
- LX51COB ()
- LX51XDB ()
- LX51PDB ()
- LX51BIB ()
- LX51DAB ()
- LX51IDB ()
- LX51PRC ()
- LX51STK ()
- LX51COS ()
- LX51XDS ()
- LX51BIS ()
- LX51DAS ()
- LX51IDS ()
-  OPTDL (S251.DLL)()(DP51.DLL)(-p251S)(S251.DLL)()(TP51.DLL)(-p251S)
-  OPTDBG 48126,-1,()()()()()()()()()() (BIN\MON251.DLL)()()()
- FLASH1 { 1,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0 }
- FLASH2 ()
- FLASH3 ()
- FLASH4 ()
-EndOpt
-
-Options 3,0,0  // Target 'Spy'
- Device (8xC251SB)
- Vendor (Intel)
- Cpu (IRAM(0 - 0x41F) CLOCK(16000000) IROM(0xFF0000-0xFF3FFF))
- FlashUt ()
- StupF ()
- FlashDR ()
- DevID ()
- Rgf (REG251S.H)
- Mem ()
- C ()
- A ()
- RL ()
- OH ()
- DBC_IFX ()
- DBC_CMS ()
- DBC_AMS ()
- DBC_LMS ()
- UseEnv=0
- EnvBin ()
- EnvInc ()
- EnvLib ()
- EnvReg (ÿIntel\)
- OrgReg (ÿIntel\)
- TgStat=16
- OutDir (.\spy\)
- OutName (dpp-mcb251)
- GenApp=1
- GenLib=0
- GenHex=1
- Debug=1
- Browse=0
- LstDir (.\spy\)
- HexSel=0
- MG32K=0
- TGMORE=0
- RunUsr 0 0 <>
- RunUsr 1 0 <>
- BrunUsr 0 0 <>
- BrunUsr 1 0 <>
- SVCSID <>
- MODEL25=1
- RTOS25=0
- ROMSZ25=3
- DHOLD25=0
- XHOLD25=0
- FHOLD25=0
- T251FL=92
- CBANKS2=0
- RCB25 { 0,0,0,0,0,0,0,1,0 }
- IRO25 { 1,0,0,255,0,0,64,0,0 }
- ERA25 { 0,0,0,0,0,32,4,0,0 }
- XRA25 { 0,0,0,0,0,0,0,0,0 }
- OCM251 { 1,0,0,255,0,0,128,0,0,0,0,0,0,0,0,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }
- C251F1=19279952
- C251F2=0
- C251MSC (FIXDRK WARNING(disable=138))
- C251DEF (Q_SPY)
- C251UDF ()
- INCC2 (.,..\..\..\..\..\include,..\..\..\..\..\ports\80251\vanilla\keil)
- AX51FL=4
- AX51MSC (FIXDRK REGISTERBANK(0))
- AX51SET ()
- AX51RST ()
- INCA5 ()
- PropFld { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }
- IncBld=1
- AlwaysBuild=0
- GenAsm=0
- AsmAsm=0
- PublicsOnly=0
- StopCode=3
- CustArgs ()
- LibMods ()
- BankNo=65535
- LX51FL=300
- LX51OVL ()
- LX51MSC (NOOVERLAY)
- LX51DWN (25)
- LX51LFI ()
- LX51ASN ()
- LX51RES (0xFF0003-0XFF0005,0XFF003B-0XFF003D,0XFF007B-0XFF007D)
- LX51CCL ()
- LX51UCL ()
- LX51CSC ()
- LX51UCS ()
- LX51COB ()
- LX51XDB ()
- LX51PDB ()
- LX51BIB ()
- LX51DAB ()
- LX51IDB ()
- LX51PRC ()
- LX51STK ()
- LX51COS ()
- LX51XDS ()
- LX51BIS ()
- LX51DAS ()
- LX51IDS ()
-  OPTDL (S251.DLL)()(DP51.DLL)(-p251S)(S251.DLL)()(TP51.DLL)(-p251S)
-  OPTDBG 48126,-1,()()()()()()()()()() (BIN\MON251.DLL)()()()
- FLASH1 { 1,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0 }
- FLASH2 ()
- FLASH3 ()
- FLASH4 ()
-EndOpt
-
-Options 1,5,0  // Group 'QP-rel'
- PropFld { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }
- IncBld=0
- AlwaysBuild=2
- GenAsm=2
- AsmAsm=2
- PublicsOnly=2
- StopCode=11
- CustArgs ()
- LibMods ()
- BankNo=65535
- C251F1=38308522
- C251F2=0
- C251MSC ()
- C251DEF ()
- C251UDF ()
- INCC2 ()
- AX51FL=170
- AX51MSC ()
- AX51SET ()
- AX51RST ()
- INCA5 ()
-EndOpt
-
-Options 1,6,0  // Group 'QP-spy'
- PropFld { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }
- IncBld=0
- AlwaysBuild=2
- GenAsm=2
- AsmAsm=2
- PublicsOnly=2
- StopCode=11
- CustArgs ()
- LibMods ()
- BankNo=65535
- C251F1=38308522
- C251F2=0
- C251MSC ()
- C251DEF ()
- C251UDF ()
- INCC2 ()
- AX51FL=170
- AX51MSC ()
- AX51SET ()
- AX51RST ()
- INCA5 ()
-EndOpt
-
-Options 2,4,0  // Group 'QP-dbg'
- PropFld { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }
- IncBld=0
- AlwaysBuild=2
- GenAsm=2
- AsmAsm=2
- PublicsOnly=2
- StopCode=11
- CustArgs ()
- LibMods ()
- BankNo=65535
- C251F1=38308522
- C251F2=0
- C251MSC ()
- C251DEF ()
- C251UDF ()
- INCC2 ()
- AX51FL=170
- AX51MSC ()
- AX51SET ()
- AX51RST ()
- INCA5 ()
-EndOpt
-
-Options 2,6,0  // Group 'QP-spy'
- PropFld { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }
- IncBld=0
- AlwaysBuild=2
- GenAsm=2
- AsmAsm=2
- PublicsOnly=2
- StopCode=11
- CustArgs ()
- LibMods ()
- BankNo=65535
- C251F1=38308522
- C251F2=0
- C251MSC ()
- C251DEF ()
- C251UDF ()
- INCC2 ()
- AX51FL=170
- AX51MSC ()
- AX51SET ()
- AX51RST ()
- INCA5 ()
-EndOpt
-
-Options 3,4,0  // Group 'QP-dbg'
- PropFld { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }
- IncBld=0
- AlwaysBuild=2
- GenAsm=2
- AsmAsm=2
- PublicsOnly=2
- StopCode=11
- CustArgs ()
- LibMods ()
- BankNo=65535
- C251F1=38308522
- C251F2=0
- C251MSC ()
- C251DEF ()
- C251UDF ()
- INCC2 ()
- AX51FL=170
- AX51MSC ()
- AX51SET ()
- AX51RST ()
- INCA5 ()
-EndOpt
-
-Options 3,5,0  // Group 'QP-rel'
- PropFld { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }
- IncBld=0
- AlwaysBuild=2
- GenAsm=2
- AsmAsm=2
- PublicsOnly=2
- StopCode=11
- CustArgs ()
- LibMods ()
- BankNo=65535
- C251F1=38308522
- C251F2=0
- C251MSC ()
- C251DEF ()
- C251UDF ()
- INCC2 ()
- AX51FL=170
- AX51MSC ()
- AX51SET ()
- AX51RST ()
- INCA5 ()
-EndOpt
-
-Options 3,6,0  // Group 'QP-spy'
- PropFld { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }
- IncBld=1
- AlwaysBuild=2
- GenAsm=2
- AsmAsm=2
- PublicsOnly=2
- StopCode=11
- CustArgs ()
- LibMods ()
- BankNo=65535
- C251F1=38308522
- C251F2=0
- C251MSC ()
- C251DEF ()
- C251UDF ()
- INCC2 ()
- AX51FL=170
- AX51MSC ()
- AX51SET ()
- AX51RST ()
- INCA5 ()
-EndOpt
-

+ 0 - 61
examples/80251/vanilla/keil/dpp-mcb251/dpp.h

@@ -1,61 +0,0 @@
-/*****************************************************************************
-* Product: DPP example
-* Last Updated for Version: 4.5.00
-* Date of the Last Update:  May 18, 2012
-*
-*                    Q u a n t u m     L e a P s
-*                    ---------------------------
-*                    innovating embedded systems
-*
-* Copyright (C) 2002-2012 Quantum Leaps, LLC. All rights reserved.
-*
-* This program is open source software: you can redistribute it and/or
-* modify it under the terms of the GNU General Public License as published
-* by the Free Software Foundation, either version 2 of the License, or
-* (at your option) any later version.
-*
-* Alternatively, this program may be distributed and modified under the
-* terms of Quantum Leaps commercial licenses, which expressly supersede
-* the GNU General Public License and are specifically designed for
-* licensees interested in retaining the proprietary status of their code.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-* GNU General Public License for more details.
-*
-* You should have received a copy of the GNU General Public License
-* along with this program. If not, see <http://www.gnu.org/licenses/>.
-*
-* Contact information:
-* Quantum Leaps Web sites: http://www.quantum-leaps.com
-*                          http://www.state-machine.com
-* e-mail:                  info@quantum-leaps.com
-*****************************************************************************/
-#ifndef dpp_h
-#define dpp_h
-
-enum DPPSignals {
-   EAT_SIG = Q_USER_SIG,     /* published by Table to let a philosopher eat */
-   DONE_SIG,                   /* published by Philosopher when done eating */
-   TERMINATE_SIG,          /* published by BSP to terminate the application */
-   MAX_PUB_SIG,                                /* the last published signal */
-
-   HUNGRY_SIG,          /* posted direclty to Table from hungry Philosopher */
-   MAX_SIG                                               /* the last signal */
-};
-
-typedef struct TableEvtTag {
-    QEvt super;                                    /* derives from QEvt */
-    uint8_t philoNum;                                 /* philosopher number */
-} TableEvt;
-
-enum { N_PHILO = 5 };                             /* number of philosophers */
-
-void Philo_ctor(void);
-void Table_ctor(void);
-
-extern QActive * const AO_Philo[N_PHILO]; /* "opaque" pointers to Philo AO */
-extern QActive * const AO_Table;          /* "opaque" pointer  to Table AO */
-
-#endif                                                             /* dpp_h */

+ 0 - 57
examples/80251/vanilla/keil/dpp-mcb251/isr.c

@@ -1,57 +0,0 @@
-/*****************************************************************************
-* Interrupt Service Routines, QDPP example, Vanilla port
-* Last Updated for Version: 4.0.01
-* Date of the Last Update:  Aug 11, 2008
-*
-*                    Q u a n t u m     L e a P s
-*                    ---------------------------
-*                    innovating embedded systems
-*
-* Copyright (C) 2002-2008 Quantum Leaps, LLC. All rights reserved.
-*
-* This software may be distributed and modified under the terms of the GNU
-* General Public License version 2 (GPL) as published by the Free Software
-* Foundation and appearing in the file GPL.TXT included in the packaging of
-* this file. Please note that GPL Section 2[b] requires that all works based
-* on this software must also be made publicly available under the terms of
-* the GPL ("Copyleft").
-*
-* Alternatively, this software may be distributed and modified under the
-* terms of Quantum Leaps commercial licenses, which expressly supersede
-* the GPL and are specifically designed for licensees interested in
-* retaining the proprietary status of their code.
-*
-* Contact information:
-* Quantum Leaps Web site:  http://www.quantum-leaps.com
-* e-mail:                  info@quantum-leaps.com
-*****************************************************************************/
-#include "qp_port.h"
-#include "dpp.h"
-#include "bsp.h"
-
-Q_DEFINE_THIS_FILE
-
-/*..........................................................................*/
-void QF_onStartup(void) {
-    TR2 = 1;                                                /* start Timer2 */
-    ET2 = 1;                                     /* enable Timer2 interrupt */
-    EA  = 1;                                /* enable global interrupt flag */
-}
-/*..........................................................................*/
-void timer2_ISR(void) interrupt 5 {         /* interrupt vector at FF:002BH */
-
-    TF2 = 0;    /* clear Timer2 overflow flag (must be cleared by software) */
-
-#ifdef Q_SPY
-    QS_tickTime += (QSTimeCtr)(BSP_PERIPHERAL_HZ/BSP_TICKS_PER_SEC + 0.5);
-#endif
-
-    QF_tick();                    /* QF processing of the system clock-tick */
-
-#ifdef NDEBUG
-    QF_pcon = PCON;   /* prevent low-power mode upon ISR return, see NOTE01 */
-#endif
-}
-/*..........................................................................*/
-/* place other ISRs here... */
-

+ 0 - 85
examples/80251/vanilla/keil/dpp-mcb251/main.c

@@ -1,85 +0,0 @@
-/*****************************************************************************
-* Product: DPP example
-* Last Updated for Version: 4.5.00
-* Date of the Last Update:  May 18, 2012
-*
-*                    Q u a n t u m     L e a P s
-*                    ---------------------------
-*                    innovating embedded systems
-*
-* Copyright (C) 2002-2012 Quantum Leaps, LLC. All rights reserved.
-*
-* This program is open source software: you can redistribute it and/or
-* modify it under the terms of the GNU General Public License as published
-* by the Free Software Foundation, either version 2 of the License, or
-* (at your option) any later version.
-*
-* Alternatively, this program may be distributed and modified under the
-* terms of Quantum Leaps commercial licenses, which expressly supersede
-* the GNU General Public License and are specifically designed for
-* licensees interested in retaining the proprietary status of their code.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-* GNU General Public License for more details.
-*
-* You should have received a copy of the GNU General Public License
-* along with this program. If not, see <http://www.gnu.org/licenses/>.
-*
-* Contact information:
-* Quantum Leaps Web sites: http://www.quantum-leaps.com
-*                          http://www.state-machine.com
-* e-mail:                  info@quantum-leaps.com
-*****************************************************************************/
-#include "qp_port.h"
-#include "dpp.h"
-#include "bsp.h"
-
-/* Local-scope objects -----------------------------------------------------*/
-static QEvt const *l_tableQueueSto[N_PHILO];
-static QEvt const *l_philoQueueSto[N_PHILO][N_PHILO];
-static QSubscrList   l_subscrSto[MAX_PUB_SIG];
-
-static union SmallEvent {
-    void *min_size;
-    TableEvt te;
-    /* other event types to go into this pool */
-} l_smlPoolSto[2*N_PHILO];              /* storage for the small event pool */
-
-/*..........................................................................*/
-int main(void) {
-    uint8_t n;
-
-    Philo_ctor();             /* instantiate all Philosopher active objects */
-    Table_ctor();                    /* instantiate the Table active object */
-
-    BSP_init();           /* initialize the Board Support Package */
-
-    QF_init();     /* initialize the framework and the underlying RT kernel */
-
-                                                  /* object dictionaries... */
-    QS_OBJ_DICTIONARY(l_smlPoolSto);
-    QS_OBJ_DICTIONARY(l_tableQueueSto);
-    QS_OBJ_DICTIONARY(l_philoQueueSto[0]);
-    QS_OBJ_DICTIONARY(l_philoQueueSto[1]);
-    QS_OBJ_DICTIONARY(l_philoQueueSto[2]);
-    QS_OBJ_DICTIONARY(l_philoQueueSto[3]);
-    QS_OBJ_DICTIONARY(l_philoQueueSto[4]);
-
-    QF_psInit(l_subscrSto, Q_DIM(l_subscrSto));   /* init publish-subscribe */
-
-                                               /* initialize event pools... */
-    QF_poolInit(l_smlPoolSto, sizeof(l_smlPoolSto), sizeof(l_smlPoolSto[0]));
-
-    for (n = 0; n < N_PHILO; ++n) {          /* start the active objects... */
-        QActive_start(AO_Philo[n], (uint8_t)(n + 1),
-                      l_philoQueueSto[n], Q_DIM(l_philoQueueSto[n]),
-                      (void *)0, 0, (QEvt *)0);
-    }
-    QActive_start(AO_Table, (uint8_t)(N_PHILO + 1),
-                  l_tableQueueSto, Q_DIM(l_tableQueueSto),
-                  (void *)0, 0, (QEvt *)0);
-
-    return QF_run();                              /* run the QF application */
-}

+ 0 - 183
examples/80251/vanilla/keil/dpp-mcb251/philo.c

@@ -1,183 +0,0 @@
-/*****************************************************************************
-* Product: DPP example
-* Last Updated for Version: 4.5.00
-* Date of the Last Update:  May 18, 2012
-*
-*                    Q u a n t u m     L e a P s
-*                    ---------------------------
-*                    innovating embedded systems
-*
-* Copyright (C) 2002-2012 Quantum Leaps, LLC. All rights reserved.
-*
-* This program is open source software: you can redistribute it and/or
-* modify it under the terms of the GNU General Public License as published
-* by the Free Software Foundation, either version 2 of the License, or
-* (at your option) any later version.
-*
-* Alternatively, this program may be distributed and modified under the
-* terms of Quantum Leaps commercial licenses, which expressly supersede
-* the GNU General Public License and are specifically designed for
-* licensees interested in retaining the proprietary status of their code.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-* GNU General Public License for more details.
-*
-* You should have received a copy of the GNU General Public License
-* along with this program. If not, see <http://www.gnu.org/licenses/>.
-*
-* Contact information:
-* Quantum Leaps Web sites: http://www.quantum-leaps.com
-*                          http://www.state-machine.com
-* e-mail:                  info@quantum-leaps.com
-*****************************************************************************/
-#include "qp_port.h"
-#include "dpp.h"
-#include "bsp.h"
-
-Q_DEFINE_THIS_FILE
-
-/* Active object class -----------------------------------------------------*/
-typedef struct PhiloTag {
-    QActive super;
-    QTimeEvt timeEvt;                   /* for timing out thining or eating */
-} Philo;
-
-static QState Philo_initial (Philo *me, QEvt const *e);
-static QState Philo_thinking(Philo *me, QEvt const *e);
-static QState Philo_hungry  (Philo *me, QEvt const *e);
-static QState Philo_eating  (Philo *me, QEvt const *e);
-
-/* Local objects -----------------------------------------------------------*/
-static Philo l_philo[N_PHILO];                    /* storage for all Philos */
-
-#define THINK_TIME  7
-#define EAT_TIME    5
-                           /* helper macro to provide the ID of Philo "me_" */
-#define PHILO_ID(me_)    ((uint8_t)((me_) - l_philo))
-
-enum InternalSignals {                                  /* internal signals */
-    TIMEOUT_SIG = MAX_SIG
-};
-
-/* Global objects ----------------------------------------------------------*/
-QActive * const AO_Philo[N_PHILO] = {     /* "opaque" pointers to Philo AO */
-    (QActive *)&l_philo[0],
-    (QActive *)&l_philo[1],
-    (QActive *)&l_philo[2],
-    (QActive *)&l_philo[3],
-    (QActive *)&l_philo[4]
-};
-
-/*..........................................................................*/
-void Philo_ctor(void) {                    /* instantiate all Philo objects */
-    uint8_t n;
-    Philo *me;
-    for (n = 0; n < N_PHILO; ++n) {
-        me = &l_philo[n];
-        QActive_ctor(&me->super, (QStateHandler)&Philo_initial);
-        QTimeEvt_ctor(&me->timeEvt, TIMEOUT_SIG);
-    }
-}
-/*..........................................................................*/
-QState Philo_initial(Philo *me, QEvt const *e) {
-    static uint8_t registered;         /* starts off with 0, per C-standard */
-    (void)e;        /* suppress the compiler warning about unused parameter */
-    if (!registered) {
-        QS_OBJ_DICTIONARY(&l_philo[0]);
-        QS_OBJ_DICTIONARY(&l_philo[0].timeEvt);
-        QS_OBJ_DICTIONARY(&l_philo[1]);
-        QS_OBJ_DICTIONARY(&l_philo[1].timeEvt);
-        QS_OBJ_DICTIONARY(&l_philo[2]);
-        QS_OBJ_DICTIONARY(&l_philo[2].timeEvt);
-        QS_OBJ_DICTIONARY(&l_philo[3]);
-        QS_OBJ_DICTIONARY(&l_philo[3].timeEvt);
-        QS_OBJ_DICTIONARY(&l_philo[4]);
-        QS_OBJ_DICTIONARY(&l_philo[4].timeEvt);
-
-        QS_FUN_DICTIONARY(&Philo_initial);
-        QS_FUN_DICTIONARY(&Philo_thinking);
-        QS_FUN_DICTIONARY(&Philo_hungry);
-        QS_FUN_DICTIONARY(&Philo_eating);
-
-        registered = (uint8_t)1;
-    }
-    QS_SIG_DICTIONARY(HUNGRY_SIG, me);            /* signal for each Philos */
-    QS_SIG_DICTIONARY(TIMEOUT_SIG, me);           /* signal for each Philos */
-
-    QActive_subscribe((QActive *)me, EAT_SIG);
-
-    return Q_TRAN(&Philo_thinking);          /* top-most initial transition */
-}
-/*..........................................................................*/
-QState Philo_thinking(Philo *me, QEvt const *e) {
-    switch (e->sig) {
-        case Q_ENTRY_SIG: {
-            QTimeEvt_postIn(&me->timeEvt, (QActive *)me, THINK_TIME);
-            return Q_HANDLED();
-        }
-        case TIMEOUT_SIG: {
-            BSP_busyDelay();
-            return Q_TRAN(&Philo_hungry);
-        }
-        case EAT_SIG:                         /* intentionally fall-through */
-        case DONE_SIG: {
-                      /* EAT or DONE must be for other Philos than this one */
-            Q_ASSERT(((TableEvt const *)e)->philoNum != PHILO_ID(me));
-            return Q_HANDLED();
-        }
-    }
-    return Q_SUPER(&QHsm_top);
-}
-/*..........................................................................*/
-QState Philo_hungry(Philo *me, QEvt const *e) {
-    switch (e->sig) {
-        case Q_ENTRY_SIG: {
-            TableEvt *pe = Q_NEW(TableEvt, HUNGRY_SIG);
-            pe->philoNum = PHILO_ID(me);
-            QActive_postFIFO(AO_Table, (QEvt *)pe);
-            return Q_HANDLED();
-        }
-        case EAT_SIG: {
-            if (((TableEvt const *)e)->philoNum == PHILO_ID(me)) {
-                BSP_busyDelay();
-                return Q_TRAN(&Philo_eating);
-            }
-            break;
-        }
-        case DONE_SIG: {
-                             /* DONE must be for other Philos than this one */
-            Q_ASSERT(((TableEvt const *)e)->philoNum != PHILO_ID(me));
-            return Q_HANDLED();
-        }
-    }
-    return Q_SUPER(&QHsm_top);
-}
-/*..........................................................................*/
-QState Philo_eating(Philo *me, QEvt const *e) {
-    switch (e->sig) {
-        case Q_ENTRY_SIG: {
-            QTimeEvt_postIn(&me->timeEvt, (QActive *)me, EAT_TIME);
-            return Q_HANDLED();
-        }
-        case Q_EXIT_SIG: {
-            TableEvt *pe = Q_NEW(TableEvt, DONE_SIG);
-            pe->philoNum = PHILO_ID(me);
-            QF_publish((QEvt *)pe);
-            return Q_HANDLED();
-        }
-        case TIMEOUT_SIG: {
-            BSP_busyDelay();
-            return Q_TRAN(&Philo_thinking);
-        }
-        case EAT_SIG:                         /* intentionally fall-through */
-        case DONE_SIG: {
-                      /* EAT or DONE must be for other Philos than this one */
-            Q_ASSERT(((TableEvt const *)e)->philoNum != PHILO_ID(me));
-            return Q_HANDLED();
-        }
-    }
-    return Q_SUPER(&QHsm_top);
-}
-

+ 0 - 158
examples/80251/vanilla/keil/dpp-mcb251/table.c

@@ -1,158 +0,0 @@
-/*****************************************************************************
-* Product: DPP example
-* Last Updated for Version: 4.5.00
-* Date of the Last Update:  May 18, 2012
-*
-*                    Q u a n t u m     L e a P s
-*                    ---------------------------
-*                    innovating embedded systems
-*
-* Copyright (C) 2002-2012 Quantum Leaps, LLC. All rights reserved.
-*
-* This program is open source software: you can redistribute it and/or
-* modify it under the terms of the GNU General Public License as published
-* by the Free Software Foundation, either version 2 of the License, or
-* (at your option) any later version.
-*
-* Alternatively, this program may be distributed and modified under the
-* terms of Quantum Leaps commercial licenses, which expressly supersede
-* the GNU General Public License and are specifically designed for
-* licensees interested in retaining the proprietary status of their code.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-* GNU General Public License for more details.
-*
-* You should have received a copy of the GNU General Public License
-* along with this program. If not, see <http://www.gnu.org/licenses/>.
-*
-* Contact information:
-* Quantum Leaps Web sites: http://www.quantum-leaps.com
-*                          http://www.state-machine.com
-* e-mail:                  info@quantum-leaps.com
-*****************************************************************************/
-#include "qp_port.h"
-#include "dpp.h"
-#include "bsp.h"
-
-Q_DEFINE_THIS_FILE
-
-/* Active object class -----------------------------------------------------*/
-typedef struct TableTag {
-    QActive super;
-    uint8_t fork[N_PHILO];
-    uint8_t isHungry[N_PHILO];
-} Table;
-
-static QState Table_initial(Table *me, QEvt const *e);
-static QState Table_serving(Table *me, QEvt const *e);
-
-#define RIGHT(n_) ((uint8_t)(((n_) + (N_PHILO - 1)) % N_PHILO))
-#define LEFT(n_)  ((uint8_t)(((n_) + 1) % N_PHILO))
-enum ForkState { FREE, USED };
-
-/* Local objects -----------------------------------------------------------*/
-static Table l_table;     /* the single instance of the Table active object */
-
-/* Global-scope objects ----------------------------------------------------*/
-QActive * const AO_Table = (QActive *)&l_table;      /* "opaque" AO pointer */
-
-/*..........................................................................*/
-void Table_ctor(void) {
-    uint8_t n;
-    Table *me = &l_table;
-
-    QActive_ctor(&me->super, (QStateHandler)&Table_initial);
-
-    for (n = 0; n < N_PHILO; ++n) {
-        me->fork[n] = FREE;
-        me->isHungry[n] = 0;
-    }
-}
-/*..........................................................................*/
-QState Table_initial(Table *me, QEvt const *e) {
-    (void)e;        /* suppress the compiler warning about unused parameter */
-
-    QS_OBJ_DICTIONARY(&l_table);
-    QS_FUN_DICTIONARY(&QHsm_top);
-    QS_FUN_DICTIONARY(&Table_initial);
-    QS_FUN_DICTIONARY(&Table_serving);
-
-    QS_SIG_DICTIONARY(DONE_SIG,      0);                  /* global signals */
-    QS_SIG_DICTIONARY(EAT_SIG,       0);
-    QS_SIG_DICTIONARY(TERMINATE_SIG, 0);
-
-    QS_SIG_DICTIONARY(HUNGRY_SIG,    me);          /* signal just for Table */
-
-    QActive_subscribe((QActive *)me, DONE_SIG);
-    QActive_subscribe((QActive *)me, TERMINATE_SIG);
-
-    return Q_TRAN(&Table_serving);
-}
-/*..........................................................................*/
-QState Table_serving(Table *me, QEvt const *e) {
-    uint8_t n, m;
-    TableEvt *pe;
-
-    switch (e->sig) {
-        case HUNGRY_SIG: {
-            BSP_busyDelay();
-            n = ((TableEvt const *)e)->philoNum;
-                      /* phil ID must be in range and he must be not hungry */
-            Q_ASSERT((n < N_PHILO) && (!me->isHungry[n]));
-
-            BSP_displyPhilStat(n, "hungry  ");
-            m = LEFT(n);
-            if ((me->fork[m] == FREE) && (me->fork[n] == FREE)) {
-                me->fork[m] = me->fork[n] = USED;
-                pe = Q_NEW(TableEvt, EAT_SIG);
-                pe->philoNum = n;
-                QF_publish((QEvt *)pe);
-                BSP_displyPhilStat(n, "eating  ");
-            }
-            else {
-                me->isHungry[n] = 1;
-            }
-            return Q_HANDLED();
-        }
-        case DONE_SIG: {
-            BSP_busyDelay();
-            n = ((TableEvt const *)e)->philoNum;
-                      /* phil ID must be in range and he must be not hungry */
-            Q_ASSERT((n < N_PHILO) && (!me->isHungry[n]));
-
-            BSP_displyPhilStat(n, "thinking");
-            m = LEFT(n);
-                                      /* both forks of Phil[n] must be used */
-            Q_ASSERT((me->fork[n] == USED) && (me->fork[m] == USED));
-
-            me->fork[m] = me->fork[n] = FREE;
-            m = RIGHT(n);                       /* check the right neighbor */
-            if (me->isHungry[m] && (me->fork[m] == FREE)) {
-                me->fork[n] = me->fork[m] = USED;
-                me->isHungry[m] = 0;
-                pe = Q_NEW(TableEvt, EAT_SIG);
-                pe->philoNum = m;
-                QF_publish((QEvt *)pe);
-                BSP_displyPhilStat(m, "eating  ");
-            }
-            m = LEFT(n);                         /* check the left neighbor */
-            n = LEFT(m);                  /* left fork of the left neighbor */
-            if (me->isHungry[m] && (me->fork[n] == FREE)) {
-                me->fork[m] = me->fork[n] = USED;
-                me->isHungry[m] = 0;
-                pe = Q_NEW(TableEvt, EAT_SIG);
-                pe->philoNum = m;
-                QF_publish((QEvt *)pe);
-                BSP_displyPhilStat(m, "eating  ");
-            }
-            return Q_HANDLED();
-        }
-        case TERMINATE_SIG: {
-            QF_stop();
-            return Q_HANDLED();
-        }
-    }
-    return Q_SUPER(&QHsm_top);
-}

+ 4 - 6
examples/80x86/dos/watcom/l/defer/defer.c

@@ -1,13 +1,13 @@
 /*****************************************************************************
 * Product: Deferred Event state pattern example
-* Last Updated for Version: 4.5.00
-* Date of the Last Update:  May 18, 2012
+* Last Updated for Version: 5.0.0
+* Date of the Last Update:  Sep 03, 2013
 *
 *                    Q u a n t u m     L e a P s
 *                    ---------------------------
 *                    innovating embedded systems
 *
-* Copyright (C) 2002-2012 Quantum Leaps, LLC. All rights reserved.
+* Copyright (C) 2002-2013 Quantum Leaps, LLC. All rights reserved.
 *
 * This program is open source software: you can redistribute it and/or
 * modify it under the terms of the GNU General Public License as published
@@ -127,9 +127,7 @@ QState TServer_idle(TServer *me, QEvt const *e) {
 QState TServer_busy(TServer *me, QEvt const *e) {
     switch (e->sig) {
         case NEW_REQUEST_SIG: {
-            if (QEQueue_getNFree(&me->requestQueue) > 0) {    /* can defer? */
-                                                       /* defer the request */
-                QActive_defer((QActive *)me, &me->requestQueue, e);
+            if (QActive_defer((QActive *)me, &me->requestQueue, e)) {
                 printf("Request #%d deferred;\n",
                        (int)((RequestEvt const *)e)->ref_num);
             }

+ 5 - 14
examples/80x86/dos/watcom/l/dpp/main.c

@@ -1,13 +1,13 @@
 /*****************************************************************************
 * Product: QDPP example
-* Last Updated for Version: 4.5.00
-* Date of the Last Update:  May 18, 2012
+* Last Updated for Version: 4.5.05
+* Date of the Last Update:  Mar 22, 2013
 *
 *                    Q u a n t u m     L e a P s
 *                    ---------------------------
 *                    innovating embedded systems
 *
-* Copyright (C) 2002-2012 Quantum Leaps, LLC. All rights reserved.
+* Copyright (C) 2002-2013 Quantum Leaps, LLC. All rights reserved.
 *
 * This program is open source software: you can redistribute it and/or
 * modify it under the terms of the GNU General Public License as published
@@ -41,11 +41,8 @@ static QEvt const *l_tableQueueSto[N_PHILO];
 static QEvt const *l_philoQueueSto[N_PHILO][N_PHILO];
 static QSubscrList   l_subscrSto[MAX_PUB_SIG];
 
-static union SmallEvents {
-    void   *e0;                                       /* minimum event size */
-    uint8_t e1[sizeof(TableEvt)];
-    /* ... other event types to go into this pool */
-} l_smlPoolSto[2*N_PHILO];              /* storage for the small event pool */
+/* storage for event pools... */
+static QF_MPOOL_EL(TableEvt) l_smlPoolSto[2*N_PHILO];         /* small pool */
 
 /*..........................................................................*/
 int main(int argc, char *argv[]) {
@@ -60,12 +57,6 @@ int main(int argc, char *argv[]) {
 
                                                   /* object dictionaries... */
     QS_OBJ_DICTIONARY(l_smlPoolSto);
-    QS_OBJ_DICTIONARY(l_tableQueueSto);
-    QS_OBJ_DICTIONARY(l_philoQueueSto[0]);
-    QS_OBJ_DICTIONARY(l_philoQueueSto[1]);
-    QS_OBJ_DICTIONARY(l_philoQueueSto[2]);
-    QS_OBJ_DICTIONARY(l_philoQueueSto[3]);
-    QS_OBJ_DICTIONARY(l_philoQueueSto[4]);
 
     QF_psInit(l_subscrSto, Q_DIM(l_subscrSto));   /* init publish-subscribe */
 

+ 3 - 8
examples/80x86/dos/watcom/l/game/main.c

@@ -1,13 +1,13 @@
 /*****************************************************************************
 * Product: "Fly'n'Shoot" game example
-* Last Updated for Version: 4.5.00
-* Date of the Last Update:  May 18, 2012
+* Last Updated for Version: 4.5.05
+* Date of the Last Update:  Mar 22, 2013
 *
 *                    Q u a n t u m     L e a P s
 *                    ---------------------------
 *                    innovating embedded systems
 *
-* Copyright (C) 2002-2012 Quantum Leaps, LLC. All rights reserved.
+* Copyright (C) 2002-2013 Quantum Leaps, LLC. All rights reserved.
 *
 * This program is open source software: you can redistribute it and/or
 * modify it under the terms of the GNU General Public License as published
@@ -75,11 +75,6 @@ int main(int argc, char *argv[]) {
 
     QF_psInit(l_subscrSto, Q_DIM(l_subscrSto));   /* init publish-subscribe */
 
-                            /* send object dictionaries for event queues... */
-    QS_OBJ_DICTIONARY(l_missileQueueSto);
-    QS_OBJ_DICTIONARY(l_shipQueueSto);
-    QS_OBJ_DICTIONARY(l_tunnelQueueSto);
-
                              /* send object dictionaries for event pools... */
     QS_OBJ_DICTIONARY(l_smlPoolSto);
     QS_OBJ_DICTIONARY(l_medPoolSto);

+ 1 - 1
examples/80x86/dos/watcom/l/game/ship.c

@@ -111,7 +111,7 @@ QState Ship_active(Ship *me, QEvt const *e) {
 /*..........................................................................*/
 QState Ship_parked(Ship *me, QEvt const *e) {
     switch (e->sig) {
-        case TAKE_OFF_SIG: {               /* permition to take off granted */
+        case TAKE_OFF_SIG: {              /* permission to take off granted */
             return Q_TRAN(&Ship_flying);
         }
     }

+ 0 - 23
examples/80x86/dos/watcom/l/qhsmtst/LOG.TXT

@@ -1,23 +0,0 @@
-QHsmTst example, QEP 4.5.01
-top-INIT;s-ENTRY;s2-ENTRY;s2-INIT;s21-ENTRY;s211-ENTRY;
-A:s21-A;s211-EXIT;s21-EXIT;s21-ENTRY;s21-INIT;s211-ENTRY;
-B:s21-B;s211-EXIT;s211-ENTRY;
-D:s211-D;s211-EXIT;s21-INIT;s211-ENTRY;
-E:s-E;s211-EXIT;s21-EXIT;s2-EXIT;s1-ENTRY;s11-ENTRY;
-I:s1-I;
-F:s1-F;s11-EXIT;s1-EXIT;s2-ENTRY;s21-ENTRY;s211-ENTRY;
-I:s2-I;
-I:s-I;
-F:s2-F;s211-EXIT;s21-EXIT;s2-EXIT;s1-ENTRY;s11-ENTRY;
-A:s1-A;s11-EXIT;s1-EXIT;s1-ENTRY;s1-INIT;s11-ENTRY;
-B:s1-B;s11-EXIT;s11-ENTRY;
-D:s1-D;s11-EXIT;s1-EXIT;s-INIT;s1-ENTRY;s11-ENTRY;
-D:s11-D;s11-EXIT;s1-INIT;s11-ENTRY;
-E:s-E;s11-EXIT;s1-EXIT;s1-ENTRY;s11-ENTRY;
-G:s11-G;s11-EXIT;s1-EXIT;s2-ENTRY;s21-ENTRY;s211-ENTRY;
-H:s211-H;s211-EXIT;s21-EXIT;s2-EXIT;s-INIT;s1-ENTRY;s11-ENTRY;
-H:s11-H;s11-EXIT;s1-EXIT;s-INIT;s1-ENTRY;s11-ENTRY;
-C:s1-C;s11-EXIT;s1-EXIT;s2-ENTRY;s2-INIT;s21-ENTRY;s211-ENTRY;
-G:s21-G;s211-EXIT;s21-EXIT;s2-EXIT;s1-ENTRY;s1-INIT;s11-ENTRY;
-C:s1-C;s11-EXIT;s1-EXIT;s2-ENTRY;s2-INIT;s21-ENTRY;s211-ENTRY;
-C:s2-C;s211-EXIT;s21-EXIT;s2-EXIT;s1-ENTRY;s1-INIT;s11-ENTRY;

+ 1 - 1
examples/80x86/dos/watcom/l/qhsmtst/log_pass.txt

@@ -1,4 +1,4 @@
-QHsmTst example, QEP 4.5.04
+QHsmTst example, QEP 5.1.0
 top-INIT;s-ENTRY;s2-ENTRY;s2-INIT;s21-ENTRY;s211-ENTRY;
 A:s21-A;s211-EXIT;s21-EXIT;s21-ENTRY;s21-INIT;s211-ENTRY;
 B:s21-B;s211-EXIT;s211-ENTRY;

+ 7 - 16
examples/80x86/qk/watcom/l/dpp/main.c

@@ -1,13 +1,13 @@
 /*****************************************************************************
-* Product: DPP example, QK version
-* Last Updated for Version: 4.5.00
-* Date of the Last Update:  May 18, 2012
+* Product: DPP example
+* Last Updated for Version: 4.5.05
+* Date of the Last Update:  Mar 22, 2013
 *
 *                    Q u a n t u m     L e a P s
 *                    ---------------------------
 *                    innovating embedded systems
 *
-* Copyright (C) 2002-2012 Quantum Leaps, LLC. All rights reserved.
+* Copyright (C) 2002-2013 Quantum Leaps, LLC. All rights reserved.
 *
 * This program is open source software: you can redistribute it and/or
 * modify it under the terms of the GNU General Public License as published
@@ -41,11 +41,8 @@ static QEvt const *l_tableQueueSto[N_PHILO];
 static QEvt const *l_philoQueueSto[N_PHILO][N_PHILO];
 static QSubscrList   l_subscrSto[MAX_PUB_SIG];
 
-static union SmallEvents {
-    void   *e0;                                       /* minimum event size */
-    uint8_t e1[sizeof(TableEvt)];
-    /* ... other event types to go into this pool */
-} l_smlPoolSto[2*N_PHILO];              /* storage for the small event pool */
+/* storage for event pools... */
+static QF_MPOOL_EL(TableEvt) l_smlPoolSto[2*N_PHILO];         /* small pool */
 
 /*..........................................................................*/
 int main(int argc, char *argv[]) {
@@ -55,14 +52,8 @@ int main(int argc, char *argv[]) {
 
     QF_init();     /* initialize the framework and the underlying RT kernel */
 
-                                                  /* object dictionaries... */
+                             /* send object dictionaries for event pools... */
     QS_OBJ_DICTIONARY(l_smlPoolSto);
-    QS_OBJ_DICTIONARY(l_tableQueueSto);
-    QS_OBJ_DICTIONARY(l_philoQueueSto[0]);
-    QS_OBJ_DICTIONARY(l_philoQueueSto[1]);
-    QS_OBJ_DICTIONARY(l_philoQueueSto[2]);
-    QS_OBJ_DICTIONARY(l_philoQueueSto[3]);
-    QS_OBJ_DICTIONARY(l_philoQueueSto[4]);
 
     QF_psInit(l_subscrSto, Q_DIM(l_subscrSto));   /* init publish-subscribe */
 

+ 5 - 22
examples/80x86/qk/watcom/l/game/main.c

@@ -1,13 +1,13 @@
 /*****************************************************************************
 * Product: "Fly'n'Shoot" game example
-* Last Updated for Version: 4.5.00
-* Date of the Last Update:  May 18, 2012
+* Last Updated for Version: 4.5.05
+* Date of the Last Update:  Mar 22, 2013
 *
 *                    Q u a n t u m     L e a P s
 *                    ---------------------------
 *                    innovating embedded systems
 *
-* Copyright (C) 2002-2012 Quantum Leaps, LLC. All rights reserved.
+* Copyright (C) 2002-2013 Quantum Leaps, LLC. All rights reserved.
 *
 * This program is open source software: you can redistribute it and/or
 * modify it under the terms of the GNU General Public License as published
@@ -41,20 +41,8 @@ static QEvt const * l_missileQueueSto[2];
 static QEvt const * l_shipQueueSto[3];
 static QEvt const * l_tunnelQueueSto[GAME_MINES_MAX + 5];
 
-static union SmallEvents {
-    void   *e0;                                       /* minimum event size */
-    uint8_t e1[sizeof(QEvt)];
-    /* ... other event types to go into this pool */
-} l_smlPoolSto[10];                     /* storage for the small event pool */
-
-static union MediumEvents {
-    void   *e0;                                       /* minimum event size */
-    uint8_t e1[sizeof(ObjectPosEvt)];
-    uint8_t e2[sizeof(ObjectImageEvt)];
-    uint8_t e3[sizeof(MineEvt)];
-    uint8_t e4[sizeof(ScoreEvt)];
-    /* ... other event types to go into this pool */
-} l_medPoolSto[2*GAME_MINES_MAX + 8];  /* storage for the medium event pool */
+static QF_MPOOL_EL(QEvt)           l_smlPoolSto[10];
+static QF_MPOOL_EL(ObjectImageEvt) l_medPoolSto[2*GAME_MINES_MAX + 10];
 
 static QSubscrList    l_subscrSto[MAX_PUB_SIG];
 
@@ -75,11 +63,6 @@ int main(int argc, char *argv[]) {
 
     QF_psInit(l_subscrSto, Q_DIM(l_subscrSto));   /* init publish-subscribe */
 
-                            /* send object dictionaries for event queues... */
-    QS_OBJ_DICTIONARY(l_missileQueueSto);
-    QS_OBJ_DICTIONARY(l_shipQueueSto);
-    QS_OBJ_DICTIONARY(l_tunnelQueueSto);
-
                              /* send object dictionaries for event pools... */
     QS_OBJ_DICTIONARY(l_smlPoolSto);
     QS_OBJ_DICTIONARY(l_medPoolSto);

+ 1 - 1
examples/80x86/qk/watcom/l/game/ship.c

@@ -111,7 +111,7 @@ QState Ship_active(Ship *me, QEvt const *e) {
 /*..........................................................................*/
 QState Ship_parked(Ship *me, QEvt const *e) {
     switch (e->sig) {
-        case TAKE_OFF_SIG: {               /* permition to take off granted */
+        case TAKE_OFF_SIG: {              /* permission to take off granted */
             return Q_TRAN(&Ship_flying);
         }
     }

+ 0 - 3
examples/android-ndk/gnu/dpp/.gitignore

@@ -1,3 +0,0 @@
-obj/
-libs/
-bin/

+ 0 - 30
examples/android-ndk/gnu/dpp/AndroidManifest.xml

@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- BEGIN_INCLUDE(manifest) -->
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-        package="com.statemachine.qpc.dpp"
-        android:versionCode="1"
-        android:versionName="1.0">
-
-    <!-- This is the platform API where NativeActivity was introduced. -->
-    <uses-sdk android:minSdkVersion="10" />
-
-    <!-- This .apk has no Java code itself, so set hasCode to false. -->
-    <application android:label="@string/app_name" android:icon="@drawable/application_icon" android:hasCode="false">
-
-        <!-- Our activity is the built-in NativeActivity framework class.
-             This will take care of integrating with our NDK code. -->
-        <activity android:name="android.app.NativeActivity"
-                android:label="@string/app_name"
-                android:configChanges="orientation|keyboardHidden">
-            <!-- Tell NativeActivity the name of .so -->
-            <meta-data android:name="android.app.lib_name"
-                    android:value="dpp" />
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN" />
-                <category android:name="android.intent.category.LAUNCHER" />
-            </intent-filter>
-        </activity>
-    </application>
-
-</manifest> 
-<!-- END_INCLUDE(manifest) -->

+ 0 - 92
examples/android-ndk/gnu/dpp/build.xml

@@ -1,92 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project name="DiningPhilosophersProblem" default="help">
-
-    <!-- The local.properties file is created and updated by the 'android' tool.
-         It contains the path to the SDK. It should *NOT* be checked into
-         Version Control Systems. -->
-    <property file="local.properties" />
-
-    <!-- The ant.properties file can be created by you. It is only edited by the
-         'android' tool to add properties to it.
-         This is the place to change some Ant specific build properties.
-         Here are some properties you may want to change/update:
-
-         source.dir
-             The name of the source directory. Default is 'src'.
-         out.dir
-             The name of the output directory. Default is 'bin'.
-
-         For other overridable properties, look at the beginning of the rules
-         files in the SDK, at tools/ant/build.xml
-
-         Properties related to the SDK location or the project target should
-         be updated using the 'android' tool with the 'update' action.
-
-         This file is an integral part of the build system for your
-         application and should be checked into Version Control Systems.
-
-         -->
-    <property file="ant.properties" />
-
-    <!-- if sdk.dir was not set from one of the property file, then
-         get it from the ANDROID_HOME env var.
-         This must be done before we load project.properties since
-         the proguard config can use sdk.dir -->
-    <property environment="env" />
-    <condition property="sdk.dir" value="${env.ANDROID_HOME}">
-        <isset property="env.ANDROID_HOME" />
-    </condition>
-
-    <!-- The project.properties file is created and updated by the 'android'
-         tool, as well as ADT.
-
-         This contains project specific properties such as project target, and library
-         dependencies. Lower level build properties are stored in ant.properties
-         (or in .classpath for Eclipse projects).
-
-         This file is an integral part of the build system for your
-         application and should be checked into Version Control Systems. -->
-    <loadproperties srcFile="project.properties" />
-
-    <!-- quick check on sdk.dir -->
-    <fail
-            message="sdk.dir is missing. Make sure to generate local.properties using 'android update project' or to inject it through the ANDROID_HOME environment variable."
-            unless="sdk.dir"
-    />
-
-    <!--
-        Import per project custom build rules if present at the root of the project.
-        This is the place to put custom intermediary targets such as:
-            -pre-build
-            -pre-compile
-            -post-compile (This is typically used for code obfuscation.
-                           Compiled code location: ${out.classes.absolute.dir}
-                           If this is not done in place, override ${out.dex.input.absolute.dir})
-            -post-package
-            -post-build
-            -pre-clean
-    -->
-    <import file="custom_rules.xml" optional="true" />
-
-    <!-- Import the actual build file.
-
-         To customize existing targets, there are two options:
-         - Customize only one target:
-             - copy/paste the target into this file, *before* the
-               <import> task.
-             - customize it to your needs.
-         - Customize the whole content of build.xml
-             - copy/paste the content of the rules files (minus the top node)
-               into this file, replacing the <import> task.
-             - customize to your needs.
-
-         ***********************
-         ****** IMPORTANT ******
-         ***********************
-         In all cases you must update the value of version-tag below to read 'custom' instead of an integer,
-         in order to avoid having your file be overridden by tools such as "android update project"
-    -->
-    <!-- version-tag: 1 -->
-    <import file="${sdk.dir}/tools/ant/build.xml" />
-
-</project>

+ 0 - 26
examples/android-ndk/gnu/dpp/dpp.sublime-project

@@ -1,26 +0,0 @@
-{
-	"folders":
-	[
-		{
-			"path": "/D/projects/qp_android_dpp"
-		},
-		{
-			"path": "/D/projects/qpc/include"
-		},
-		{
-			"path": "/D/projects/qpc/ports/arm/android/gnu"
-		},
-		{
-			"path": "/D/projects/android-ndk-r8b/platforms/android-9/arch-arm"
-		},
-		{
-			"path": "/D/projects/android-ndk-r8b/sources/android"
-		},
-		{
-			"path": "/D/projects/qpc"
-		},
-		{
-			"path": "/D/projects/qtools/qspy"
-		}
-	]
-}

+ 0 - 844
examples/android-ndk/gnu/dpp/dpp.sublime-workspace

@@ -1,844 +0,0 @@
-{
-	"auto_complete":
-	{
-		"selected_items":
-		[
-			[
-				"QSPY_",
-				"QSPY_SRCDIR"
-			],
-			[
-				"tick_",
-				"tick_routine_cond"
-			],
-			[
-				"tick_rou",
-				"tick_routine_mutex"
-			],
-			[
-				"engine_",
-				"engine_handle_input"
-			],
-			[
-				"l_t",
-				"l_table_paused"
-			],
-			[
-				"l_p",
-				"l_philo_status"
-			],
-			[
-				"dr",
-				"draw_circle"
-			]
-		]
-	},
-	"buffers":
-	[
-	],
-	"build_system": "",
-	"command_palette":
-	{
-		"height": 392.0,
-		"selected_items":
-		[
-			[
-				"set syntax mak",
-				"Set Syntax: Makefile"
-			],
-			[
-				"set syntax c",
-				"Set Syntax: C"
-			],
-			[
-				"insta",
-				"Package Control: Install Package"
-			],
-			[
-				"Snippet: ",
-				"Snippet: If Condition"
-			],
-			[
-				"clan",
-				"Preferences: SublimeClang Settings – Default"
-			],
-			[
-				"clans",
-				"Preferences: SublimeClang Settings – Default"
-			],
-			[
-				"cla",
-				"Preferences: SublimeClang Settings – Default"
-			],
-			[
-				"clang",
-				"Preferences: SublimeClang Settings – User"
-			],
-			[
-				"subli",
-				"Preferences: SublimeClang Settings – Default"
-			],
-			[
-				"install",
-				"Package Control: Install Package"
-			],
-			[
-				"run",
-				"Build: Run"
-			]
-		],
-		"width": 400.0
-	},
-	"console":
-	{
-		"height": 125.0
-	},
-	"distraction_free":
-	{
-		"menu_visible": true,
-		"show_minimap": false,
-		"show_open_files": false,
-		"show_tabs": false,
-		"side_bar_visible": false,
-		"status_bar_visible": false
-	},
-	"file_history":
-	[
-		"/D/projects/qpc/include/qep.h",
-		"/D/projects/qp_android_dpp/jni/main.c",
-		"/D/projects/qp_android_dpp/jni/Application.mk",
-		"/D/projects/qp_android_dpp/build.xml",
-		"/D/projects/qp_android_dpp/jni/Android.mk",
-		"/D/projects/qpc/ports/arm/android/gnu/Android.mk",
-		"/D/projects/qp_android_dpp/AndroidManifest.xml",
-		"/D/projects/qp_android_dpp/android_port.txt",
-		"/D/projects/qpc/ports/arm/android/gnu/AndroidManifest.xml",
-		"/D/projects/qpc/qep/source/qhsm_dis.c",
-		"/D/projects/qpc/ports/arm/android/gnu/src/qs_port.c",
-		"/D/projects/qp_android_dpp/jni/dpp.h",
-		"/D/projects/android-ndk-r8b/sources/android/native_app_glue/android_native_app_glue.c",
-		"/D/projects/android-ndk-r8b/platforms/android-9/arch-arm/usr/include/android/input.h",
-		"/D/projects/qtools/qspy/source/qspy.c",
-		"/D/projects/qpc/qf/source/qf_pool.c",
-		"/D/projects/qpc/qf/source/qa_get_.c",
-		"/D/projects/qp_android_dpp/jni/table.c",
-		"/D/projects/qpc/doxygen/snippets/qa_run.c",
-		"/D/projects/qpc/include/qf.h",
-		"/D/projects/qpc/ports/80x86/ecos/gnu/src/qf_port.c",
-		"/D/projects/qpc/ports/80x86/posix/gnu/qf_port.c",
-		"/D/projects/qpc/ports/80x86/threadx/visual_studio/src/qf_port.c",
-		"/D/projects/qpc/ports/80x86/ucos2/watcom/l/src/qf_port.c",
-		"/D/projects/qpc/ports/80x86/vxworks/gnu/src/qf_port.c",
-		"/D/projects/qpc/ports/80x86/win32/mingw/qf_port.c",
-		"/D/projects/qpc/ports/80x86/win32/vc/qf_port.c",
-		"/D/projects/qpc/ports/arm/freertos/iar/src/qf_port.c",
-		"/D/projects/qpc/qf/source/qvanilla.c",
-		"/D/projects/qpc/qf/source/qf_act.c",
-		"/D/projects/qpc/ports/arm/android/gnu/src/qf_port.c",
-		"/D/projects/qp_android_dpp/jni/bsp.h",
-		"/D/projects/qp_android_dpp/jni/philo.c",
-		"/D/projects/qp_android_dpp/jni/bsp.c",
-		"/D/projects/qpc/ports/arm/android/gnu/qf_port.h",
-		"/D/projects/qpc/include/qk.h",
-		"/D/projects/qpc/include/qvanilla.h",
-		"/D/projects/qpc/ports/80x86/posix/gnu/qf_port.h",
-		"/D/projects/qpc/ports/80x86/win32/mingw/qf_port.h",
-		"/D/projects/qpc/ports/80x86/win32/vc/qf_port.h",
-		"/D/projects/qpc/qf/source/qa_fifo.c",
-		"/D/projects/qpc/qs/source/qs_.c",
-		"/D/projects/qpc/qs/source/qs.c",
-		"/D/projects/qpc/include/qequeue.h",
-		"/D/projects/qpc/ports/arm/android/gnu/qep_port.h",
-		"/D/projects/android-ndk-r8b/platforms/android-9/arch-arm/usr/include/netdb.h",
-		"/D/projects/android-ndk-r8b/platforms/android-9/arch-arm/usr/include/paths.h",
-		"/D/projects/android-ndk-r8b/platforms/android-9/arch-arm/usr/include/stdio.h",
-		"/D/projects/android-ndk-r8b/platforms/android-9/arch-arm/usr/include/unistd.h",
-		"/D/projects/android-ndk-r8b/platforms/android-9/arch-arm/usr/include/zconf.h",
-		"/D/projects/android-ndk-r8b/platforms/android-9/arch-arm/usr/include/zlib.h",
-		"/D/projects/android-ndk-r8b/platforms/android-9/arch-arm/usr/include/machine/_types.h",
-		"/D/projects/android-ndk-r8b/platforms/android-9/arch-arm/usr/include/SLES/OpenSLES.h",
-		"/D/projects/android-ndk-r8b/platforms/android-9/arch-arm/usr/include/sys/cdefs.h",
-		"/D/projects/android-ndk-r8b/platforms/android-9/arch-arm/usr/include/sys/exec_elf.h",
-		"/D/projects/android-ndk-r8b/platforms/android-9/arch-arm/usr/include/sys/limits.h",
-		"/D/projects/android-ndk-r8b/platforms/android-9/arch-arm/usr/include/sys/resource.h",
-		"/D/projects/android-ndk-r8b/sources/android/native_app_glue/android_native_app_glue.h",
-		"/D/projects/qpc/examples/80251/vanilla/keil/dpp-mcb251/bsp.c",
-		"/D/projects/qpc/examples/80251/vanilla/keil/dpp-mcb251/philo.c",
-		"/D/projects/qpc/examples/80x86/dos/watcom/l/bomb/bsp.h",
-		"/D/projects/qpc/examples/80x86/dos/watcom/l/bomb/statetbl.c",
-		"/D/projects/qpc/examples/80x86/dos/watcom/l/dpp/philo.c",
-		"/D/projects/qpc/examples/80x86/dos/watcom/l/sls/ui.h",
-		"/D/projects/qpc/examples/80x86/dos/watcom/l/sls/ui_nu_lr.c",
-		"/D/projects/qpc/examples/80x86/dos/watcom/l/sls/ui_num.c",
-		"/D/projects/qpc/examples/80x86/posix/gnu/dpp/philo.c",
-		"/D/projects/qpc/ports/arm/android/gnu/qs_port.h",
-		"/D/projects/qpc/qf/source/qf_tick.c",
-		"/D/projects/qpc/qf/source/qa_defer.c",
-		"/D/projects/qpc/qf/source/qf_gc.c",
-		"/D/projects/qpc/qf/source/qf_pkg.h",
-		"/D/projects/qpc/qf/source/qte_arm.c",
-		"/D/projects/qpc/examples/80x86/posix/gnu/dpp/main.c",
-		"/D/projects/qpc/examples/80x86/win32/mingw/dpp/main.c",
-		"/D/projects/qpc/qf/source/qa_lifo.c",
-		"/D/projects/qpc/qf/source/qa_sub.c",
-		"/D/projects/qpc/qf/source/qa_usub.c",
-		"/D/projects/qpc/qf/source/qa_usuba.c",
-		"/D/projects/qpc/qf/source/qeq_fifo.c",
-		"/D/projects/qpc/qf/source/qeq_get.c",
-		"/D/projects/qpc/qf/source/qeq_init.c",
-		"/D/projects/qpc/qf/source/qeq_lifo.c",
-		"/D/projects/qpc/qf/source/qf_new.c",
-		"/D/projects/qpc/qf/source/qf_psini.c",
-		"/D/projects/qpc/qf/source/qf_pspub.c",
-		"/D/projects/qpc/qf/source/qf_pwr2.c",
-		"/D/projects/qpc/qf/source/qmp_get.c",
-		"/D/projects/qpc/qf/source/qmp_init.c",
-		"/D/projects/qpc/qf/source/qmp_put.c",
-		"/D/projects/qpc/qf/source/qte_darm.c",
-		"/D/projects/qpc/qf/source/qte_rarm.c",
-		"/D/projects/qpc/qep/source/qep.c",
-		"/D/projects/qpc/qep/source/qfsm_ini.c",
-		"/D/projects/qpc/qep/source/qhsm_in.c",
-		"/D/projects/qpc/qep/source/qhsm_ini.c",
-		"/D/projects/qpc/qep/source/qfsm_dis.c",
-		"/D/projects/qpc/qep/source/qhsm_top.c",
-		"/D/projects/qpc/qs/source/qs_mem.c",
-		"/D/projects/qpc/qs/source/qs_str.c",
-		"/D/projects/qpc/qs/source/qs_u64.c",
-		"/D/projects/qpc/qs/source/qs_f32.c",
-		"/D/projects/qpc/qs/source/qs_byte.c",
-		"/D/projects/qpc/qs/source/qs_blk.c",
-		"/D/projects/qtools/qspy/include/qspy.h",
-		"/D/projects/qpc/examples/80x86/win32/vc/game-gui/bsp.c",
-		"/D/projects/qpc/examples/80x86/win32/vc/dpp-gui/bsp.c",
-		"/D/projects/qpc/examples/80x86/win32/vc/dpp/bsp.c",
-		"/D/projects/qpc/examples/80x86/win32/mingw/game-gui/bsp.c",
-		"/D/projects/qpc/examples/80x86/win32/mingw/dpp/bsp.c",
-		"/D/projects/qpc/examples/80x86/posix/gnu/dpp/bsp.c",
-		"/D/projects/qpc/include/qs.h",
-		"/D/projects/qpc/ports/tms320c28x/qk/c2000/src/qs_port.c",
-		"/D/projects/qpc/ports/tms320c28x/vanilla/c2000/src/qs_port.c",
-		"/D/projects/qpc/ports/tms320c55x/qk/c5500/src/qs_port.c",
-		"/D/projects/qpc/ports/tms320c55x/vanilla/c5500/src/qs_port.c",
-		"/D/projects/qtools/qspy/include/qs_copy.h",
-		"/D/projects/qpc/ports/tms320c28x/qk/c2000/src/qf_port.c",
-		"/D/projects/qpc/ports/tms320c28x/vanilla/c2000/src/qf_port.c",
-		"/D/projects/qpc/ports/tms320c55x/qk/c5500/src/qf_port.c",
-		"/D/projects/qpc/ports/tms320c55x/vanilla/c5500/src/qf_port.c",
-		"/D/projects/qpc/qk/source/qk_ext.c",
-		"/D/projects/qpc/qk/source/qk_sched.c",
-		"/D/projects/qpc/examples/80251/vanilla/keil/dpp-mcb251/main.c",
-		"/D/projects/qpc/examples/tms320c55x/c55xx_csl/nor_writer/main.c",
-		"/D/projects/qpc/include/qs_dummy.h",
-		"/D/projects/qpc/examples/80x86/qk/watcom/l/dpp/philo.c",
-		"/D/projects/qpc/examples/80251/vanilla/keil/dpp-mcb251/bsp.h"
-	],
-	"find":
-	{
-		"height": 34.0
-	},
-	"find_in_files":
-	{
-		"height": 0.0,
-		"where_history":
-		[
-			"*.c,*.h",
-			"*.c",
-			"*.c;*.h",
-			"*.c",
-			"*.h",
-			"*.c",
-			"*.h",
-			"*.c,*.h",
-			""
-		]
-	},
-	"find_state":
-	{
-		"case_sensitive": false,
-		"find_history":
-		[
-			"QF_remove_",
-			"QActive_stop",
-			"QF_Remove",
-			"QF_pThreadMutex_",
-			");\n",
-			"AInputQueue_preDispatchEvent",
-			"qsBuf",
-			"QF_pool",
-			"standard",
-			"static",
-			"{0}",
-			"QF_pThreadMutex_",
-			"QACTIVE_EQUEUE_SIGNAL_",
-			"QACTIVE_EQUEUE_WAIT_",
-			"onAssert",
-			"QF_TICK",
-			"QF_EVT_REF_CTR_DEC_",
-			"BSP_random",
-			"QF_timeEvtListHead_",
-			"QF_psInit",
-			"QS_EXIT",
-			"QSPY_line",
-			"QS_RESET",
-			"QS_INIT",
-			"QS_onStartup",
-			"QF_active_",
-			"QF_subscrList_",
-			"QS_tickCtr_",
-			"QF_timeEvtListHead_",
-			"NOTE02",
-			"QF_CRIT",
-			"QS_zero",
-			"QS_smObj_",
-			"BSP_TICKS_PER_SEC",
-			"THINK_TIME",
-			"tick_routine_mutex",
-			"QF_zero",
-			"QF_active_",
-			"QActive_start",
-			"QF_pool_",
-			"QF_pThreadMutex_",
-			"QF_CRIT_ENTRY",
-			"QS_CRIT_ENTRY",
-			"QS_RESET",
-			"reset",
-			"QS_glbFilter_",
-			"tick_routine_mutex",
-			"QActive_stop",
-			"TERMIN",
-			"QS_onCleanup",
-			"l_idle_running",
-			"LOGE",
-			"l_run",
-			"QF_pThreadMutex_",
-			"QF_CRIT_ENTRY",
-			"QS_INIT",
-			"QS_onStartup",
-			"AINPUT_EVENT_TYPE_MOTION",
-			"LOOPER_ID_USER",
-			"paused",
-			"BSP_displayPaused",
-			"30",
-			"running",
-			"runnin",
-			"BSP_TICKS_PER_SEC",
-			"attr",
-			"thread",
-			"QF_onStartup",
-			"onAssert",
-			"QF_run",
-			"file",
-			"\n                            ",
-			"get_mukkelis",
-			"get_tag_insert",
-			"be",
-			"data",
-			"select",
-			"expand",
-			"ctrl+d",
-			"tcp_output",
-			"pbuf_free",
-			"eth_driver_read",
-			"Q_EVT_CAST",
-			"*****************************************************************************/",
-			"Q_EVT_CAST",
-			"SIZE_INIT_CMDS",
-			"ObjectImage",
-			"ObjectImageEvt",
-			"ObjectImageEvtTag",
-			"ObjectPosEvtTag",
-			"Ship_ctor",
-			"GPIOPORTA_PRIO",
-			"prio",
-			"PRIO",
-			"prio",
-			"PRIO",
-			"prio",
-			"PRIO",
-			"prio",
-			"PRIO",
-			"prio",
-			"Prio",
-			"BSP_SCREEN_HEIGHT",
-			"ADC_CTL_IE",
-			"Mine1_initial",
-			"l_mine",
-			"ADC_"
-		],
-		"highlight": true,
-		"in_selection": false,
-		"preserve_case": false,
-		"regex": false,
-		"replace_history":
-		[
-		],
-		"reverse": false,
-		"show_context": false,
-		"use_buffer2": false,
-		"whole_word": true,
-		"wrap": true
-	},
-	"groups":
-	[
-		{
-			"sheets":
-			[
-			]
-		}
-	],
-	"incremental_find":
-	{
-		"height": 34.0
-	},
-	"input":
-	{
-		"height": 0.0
-	},
-	"layout":
-	{
-		"cells":
-		[
-			[
-				0,
-				0,
-				1,
-				1
-			]
-		],
-		"cols":
-		[
-			0.0,
-			1.0
-		],
-		"rows":
-		[
-			0.0,
-			1.0
-		]
-	},
-	"menu_visible": true,
-	"output.clang":
-	{
-		"height": 211.0
-	},
-	"output.clang_static_analyzer":
-	{
-		"height": 0.0
-	},
-	"output.exec":
-	{
-		"height": 25.0
-	},
-	"output.find_results":
-	{
-		"height": 112.0
-	},
-	"replace":
-	{
-		"height": 0.0
-	},
-	"save_all_on_build": true,
-	"select_file":
-	{
-		"height": 0.0,
-		"selected_items":
-		[
-			[
-				"",
-				"qp_android_dpp/android_port.txt"
-			],
-			[
-				"androidmm",
-				"qp_android_dpp/AndroidManifest.xml"
-			],
-			[
-				"and",
-				"qp_android_dpp/jni/Android.mk"
-			],
-			[
-				"androidman",
-				"gnu/AndroidManifest.xml"
-			],
-			[
-				"andro",
-				"qp_android_dpp/AndroidManifest.xml"
-			],
-			[
-				"build.xml",
-				"qp_android_dpp/build.xml"
-			],
-			[
-				"androi",
-				"qp_android_dpp/AndroidManifest.xml"
-			],
-			[
-				"appli",
-				"qp_android_dpp/jni/Application.mk"
-			],
-			[
-				"main.c",
-				"qp_android_dpp/jni/main.c"
-			],
-			[
-				"bsp.c",
-				"qp_android_dpp/jni/bsp.c"
-			],
-			[
-				"philo.c",
-				"qp_android_dpp/jni/philo.c"
-			],
-			[
-				"bsp.h",
-				"qp_android_dpp/jni/bsp.h"
-			],
-			[
-				"qf_port.c",
-				"qpc/ports/arm/android/gnu/src/qf_port.c"
-			],
-			[
-				"an",
-				"qp_android_dpp/AndroidManifest.xml"
-			],
-			[
-				"build",
-				"qp_android_dpp/build.xml"
-			],
-			[
-				"manif",
-				"qp_android_dpp/AndroidManifest.xml"
-			],
-			[
-				"qf_port.h",
-				"qpc/ports/arm/android/gnu/qf_port.h"
-			],
-			[
-				"qep.h",
-				"include/qep.h"
-			],
-			[
-				"qhsm_dis",
-				"qpc/qep/source/qhsm_dis.c"
-			],
-			[
-				"qs_port.c",
-				"qpc/ports/arm/android/gnu/src/qs_port.c"
-			],
-			[
-				"android",
-				"qp_android_dpp/AndroidManifest.xml"
-			],
-			[
-				"table.c",
-				"qp_android_dpp/jni/table.c"
-			],
-			[
-				"dpp.h",
-				"qp_android_dpp/jni/dpp.h"
-			],
-			[
-				"qspy.c",
-				"qspy/source/qspy.c"
-			],
-			[
-				"qs.",
-				"qpc/qs/source/qs.c"
-			],
-			[
-				"qs.c",
-				"qpc/qs/source/qs_.c"
-			],
-			[
-				"bsp",
-				"qp_android_dpp/jni/bsp.c"
-			],
-			[
-				"philo",
-				"qp_android_dpp/jni/philo.c"
-			],
-			[
-				"android/qf",
-				"qpc/ports/arm/android/gnu/qf_port.h"
-			],
-			[
-				"qf.h",
-				"include/qf.h"
-			],
-			[
-				"qa_get",
-				"qpc/qf/source/qa_get_.c"
-			],
-			[
-				"qf_po",
-				"qpc/ports/arm/android/gnu/qf_port.h"
-			],
-			[
-				"andr",
-				"qp_android_dpp/jni/Android.mk"
-			],
-			[
-				"androidm",
-				"qp_android_dpp/AndroidManifest.xml"
-			],
-			[
-				"qf_tick.",
-				"qpc/qf/source/qf_tick.c"
-			],
-			[
-				"qf_ar",
-				"qpc/qf/source/qte_arm.c"
-			],
-			[
-				"qf_ti",
-				"qpc/qf/source/qf_tick.c"
-			],
-			[
-				"philoc",
-				"qp_android_dpp/jni/philo.c"
-			],
-			[
-				"main",
-				"qp_android_dpp/jni/main.c"
-			],
-			[
-				"hilo",
-				"qp_android_dpp/jni/philo.c"
-			],
-			[
-				"android.mk",
-				"qp_android_dpp/jni/Android.mk"
-			],
-			[
-				"qs_port",
-				"gnu/src/qs_port.c"
-			],
-			[
-				"bsp.",
-				"qp_android_dpp/jni/bsp.c"
-			],
-			[
-				"qspy.h",
-				"qspy/include/qspy.h"
-			],
-			[
-				"qf_pu",
-				"qpc/qf/source/qf_pspub.c"
-			],
-			[
-				"qf_",
-				"qpc/qf/source/qf_new.c"
-			],
-			[
-				"qf_tic",
-				"qpc/qf/source/qf_tick.c"
-			],
-			[
-				"qs_port.h",
-				"gnu/qs_port.h"
-			],
-			[
-				"table",
-				"qp_android_dpp/jni/table.c"
-			],
-			[
-				"qf_new",
-				"qpc/qf/source/qf_new.c"
-			],
-			[
-				"qf_port",
-				"qpc/ports/80x86/posix/gnu/qf_port.c"
-			],
-			[
-				"qf_new.c",
-				"qpc/qf/source/qf_new.c"
-			],
-			[
-				"qf_pspub",
-				"qpc/qf/source/qf_pspub.c"
-			],
-			[
-				"bs",
-				"qp_android_dpp/jni/bsp.c"
-			],
-			[
-				"b",
-				"qp_android_dpp/jni/bsp.c"
-			],
-			[
-				"ma",
-				"qp_android_dpp/jni/main.c"
-			],
-			[
-				"dpp.ma",
-				"qp_android_dpp/dpp.map"
-			],
-			[
-				"qf_.c",
-				"qpc/qf/source/qf_psini.c"
-			],
-			[
-				"qf_act.c",
-				"qpc/qf/source/qf_act.c"
-			],
-			[
-				"qf_pool",
-				"qpc/qf/source/qf_pool.c"
-			],
-			[
-				"qs.h",
-				"include/qs.h"
-			],
-			[
-				"qs_po",
-				"gnu/qs_port.h"
-			],
-			[
-				"qf_ac",
-				"qpc/qf/source/qf_act.c"
-			],
-			[
-				"tabl",
-				"qp_android_dpp/jni/table.c"
-			],
-			[
-				"local",
-				"qp_android_dpp/local.properties"
-			],
-			[
-				"bui",
-				"qp_android_dpp/build.xml"
-			],
-			[
-				"proje",
-				"qp_android_dpp/project.properties"
-			],
-			[
-				"build.x",
-				"qp_android_dpp/build.xml"
-			],
-			[
-				"androidma",
-				"qp_android_dpp/AndroidManifest.xml"
-			],
-			[
-				"tab",
-				"qp_android_dpp/jni/table.c"
-			],
-			[
-				"native_app",
-				"android/native_app_glue/android_native_app_glue.h"
-			],
-			[
-				"qf",
-				"gnu/src/qf_port.c"
-			],
-			[
-				"rea",
-				"qp_android_dpp/readme.txt"
-			],
-			[
-				"qf.",
-				"include/qf.h"
-			],
-			[
-				"mk",
-				"qp_android_dpp/jni/Android.mk"
-			],
-			[
-				"port.c",
-				"gnu/src/qf_port.c"
-			],
-			[
-				"qp_po",
-				"include/qp_port.h"
-			],
-			[
-				".mk",
-				"jni/Android.mk"
-			],
-			[
-				"res",
-				"res/values/strings.xml"
-			],
-			[
-				"m",
-				"main.c"
-			],
-			[
-				"mai",
-				"main.c"
-			],
-			[
-				"htt",
-				"webserver/httpd.c"
-			],
-			[
-				"web/fs.c",
-				"webserver/fs.c"
-			],
-			[
-				"fs.c",
-				"webserver/fs.c"
-			],
-			[
-				"dpp",
-				"dpp.h"
-			],
-			[
-				"lw",
-				"lwip_port/netif/eth_driver.c"
-			],
-			[
-				"mis",
-				"game-qk-ev-lm3s811/missile.c"
-			],
-			[
-				"tunn",
-				"game-qk-ev-lm3s811/tunnel.c"
-			],
-			[
-				".c",
-				"game-qk-ev-lm3s811/mine2.c"
-			],
-			[
-				"disp",
-				"display96x16x1.c"
-			],
-			[
-				"system",
-				"cmsis/system_lm3s.c"
-			],
-			[
-				"game",
-				"game.h"
-			],
-			[
-				"mine2",
-				"mine2.c"
-			],
-			[
-				"displ",
-				"display96x16x1.c"
-			]
-		],
-		"width": 0.0
-	},
-	"select_project":
-	{
-		"height": 500.0,
-		"selected_items":
-		[
-			[
-				"",
-				"/D/projects/qp_android_dpp/dpp.sublime-project"
-			]
-		],
-		"width": 380.0
-	},
-	"show_minimap": true,
-	"show_open_files": false,
-	"show_tabs": true,
-	"side_bar_visible": false,
-	"side_bar_width": 120.0,
-	"status_bar_visible": true
-}

+ 0 - 30
examples/android-ndk/gnu/dpp/jni/Android.mk

@@ -1,30 +0,0 @@
-#
-# Build script for DPP example for QP/C for Android NDK
-# Please NDK_MODULE_PATH enviroment variable to point to one diretory 
-# above qpc root dir.
-QP_INCDIR      := $(QPC)/include
-QP_PORT_INCDIR := $(QPC)/ports/android-ndk/gnu
-QSPY_INCDIR    := $(QTOOLS)/qspy/include
-
-LOCAL_PATH := $(call my-dir)
-
-include $(CLEAR_VARS)
-LOCAL_MODULE    := dpp
-LOCAL_SRC_FILES := main.c bsp.c display.c table.c philo.c
-LOCAL_C_INCLUDES += $(QP_INCDIR) $(QP_PORT_INCDIR)  
-LOCAL_CFLAGS += -Wall
-LOCAL_LDLIBS := -llog -landroid -lEGL -lGLESv1_CM
-LOCAL_STATIC_LIBRARIES := android_native_app_glue qpc
-include $(BUILD_SHARED_LIBRARY)
-
-include $(CLEAR_VARS)
-LOCAL_MODULE    := dpp-qspy
-LOCAL_SRC_FILES := main.c bsp.c display.c table.c philo.c
-LOCAL_C_INCLUDES += $(QP_INCDIR) $(QP_PORT_INCDIR) $(QSPY_INCDIR)
-LOCAL_CFLAGS += -Wall
-LOCAL_LDLIBS := -llog -landroid -lEGL -lGLESv1_CM
-LOCAL_STATIC_LIBRARIES := android_native_app_glue qpc-qspy
-include $(BUILD_SHARED_LIBRARY)
-
-$(call import-module,android/native_app_glue)
-$(call import-module,qpc/ports/android-ndk/gnu)

+ 0 - 2
examples/android-ndk/gnu/dpp/jni/Application.mk

@@ -1,2 +0,0 @@
-APP_PLATFORM := android-9
-APP_ABI := all

+ 0 - 521
examples/android-ndk/gnu/dpp/jni/bsp.c

@@ -1,521 +0,0 @@
-/*****************************************************************************
-* Product: DPP example
-* Last Updated for Version: 4.5.02
-* Date of the Last Update:  May 18, 2012
-*
-*                    Q u a n t u m     L e a P s
-*                    ---------------------------
-*                    innovating embedded systems
-*
-* Copyright (C) 2002-2012 Quantum Leaps, LLC. All rights reserved.
-*
-* This program is open source software: you can redistribute it and/or
-* modify it under the terms of the GNU General Public License as published
-* by the Free Software Foundation, either version 2 of the License, or
-* (at your option) any later version.
-*
-* Alternatively, this program may be distributed and modified under the
-* terms of Quantum Leaps commercial licenses, which expressly supersede
-* the GNU General Public License and are specifically designed for
-* licensees interested in retaining the proprietary status of their code.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-* GNU General Public License for more details.
-*
-* You should have received a copy of the GNU General Public License
-* along with this program. If not, see <http://www.gnu.org/licenses/>.
-*
-* Contact information:
-* Quantum Leaps Web sites: http://www.quantum-leaps.com
-*                          http://www.state-machine.com
-* e-mail:                  info@quantum-leaps.com
-*****************************************************************************/
-#include "qp_port.h"
-#include "bsp.h"
-#include "dpp.h"
-#include "display.h"
-
-#include <stdlib.h>
-#include <android/log.h>
-
-Q_DEFINE_THIS_MODULE("bsp")
-
-/* Local-objects -----------------------------------------------------------*/
-
-#ifdef Q_SPY
-    enum {
-        PHILO_STAT = QS_USER
-    };
-
-    static uint8_t const l_clock_tick = 0U;
-    static void *idleThread(void *par);
-#endif
-
-static uint8_t const l_ticker = 0U;
-
-static struct engine l_engine;         /* display engine status and config  */
-static volatile uint8_t l_running;                      /* main loop status */
-static volatile uint8_t l_tick_paused;                    /* Ticker paused? */
-static uint32_t l_rnd;                  /* random seed                      */
-
-static pthread_mutex_t tick_routine_mutex;    /* tick routine control mutex */
-static pthread_cond_t  tick_routine_cond; /* tick routine control condition */
-static pthread_t tick_thread;             /* tick routine pthread id        */
-
-static int32_t handle_input(struct android_app* app, AInputEvent* event);
-static void handle_cmd(struct android_app* app, int32_t cmd);
-static void *tick_routine(void *arg);
-static void pause_tick_routine(void);
-static void resume_tick_routine(void);
-
-extern char __bss_start;                                      /* See NOTE01 */
-extern char __bss_end__;
-
-/*..........................................................................*/
-void Q_onAssert(char const * const file, int line) {
-                               /* log assert terminates process with Sig 11 */
-    __android_log_assert("Q_onAssert", "dpp", "Q_onAssert file: %s, line: %d",
-                         file, line);
-    QF_stop();
-}
-
-/*..........................................................................*/
-uint32_t BSP_random(void) {
-    /* a very cheap pseudo-random-number generator */
-    /* "Super-Duper" Linear Congruential Generator (LCG)
-    * LCG(2^32, 3*7*11*13*23, 0, seed) */
-    l_rnd = l_rnd * (3*7*11*13*23);
-    return l_rnd >> 8;
-}
-
-/*..........................................................................*/
-void BSP_randomSeed(uint32_t seed) {
-    l_rnd = seed;
-}
-
-/*..........................................................................*/
-void BSP_terminate(int16_t result) {
-    (void)result;
-    QF_stop();
-}
-
-/*..........................................................................*/
-void BSP_displayPhilStat(uint8_t n, char const *stat) {
-
-    l_engine.state.philo_status[n] = stat[0];
-
-    QS_BEGIN(PHILO_STAT, AO_Philo[n])  /* application-specific record begin */
-        QS_U8(1, n);                                  /* Philosopher number */
-        QS_STR(stat);                                 /* Philosopher status */
-    QS_END()
-}
-
-/*..........................................................................*/
-void BSP_displayPaused(uint8_t paused) {
-    l_engine.state.table_paused = paused;
-}
-
-/*..........................................................................*/
-void BSP_init(void) {
-#if defined(Q_SPY)
-    if (!QS_INIT((void*) 0)) {
-        __android_log_assert("bsp_init", "dpp", "QS_INIT failed");
-    }
-#endif
-}
-
-/**
- * Process the next input event.
- */
-static int32_t handle_input(struct android_app* app,
-                                   AInputEvent* event) {
-    struct engine* engine = (struct engine*)app->userData;
-    int32_t status = 0;
-
-    if (AInputEvent_getType(event) == AINPUT_EVENT_TYPE_MOTION) {
-
-        switch (AMOTION_EVENT_ACTION_MASK & AMotionEvent_getAction( event )) {
-
-            case AMOTION_EVENT_ACTION_DOWN:
-            case AMOTION_EVENT_ACTION_POINTER_DOWN: {
-                             /* "tap" on the screen causes pause operation */
-                QF_PUBLISH(Q_NEW(QEvt, PAUSE_SIG), &handle_input);
-                break;
-            }
-            default:
-                break;
-        }
-        engine->animating = 1U;       /* any motion event resumes animation */
-        status = 1;                                  /* event was processed */
-    }
-    return status;
-}
-
-/*..........................................................................*/
-static void pause_tick_routine(void) {
-    Q_ALLEGE(pthread_mutex_lock(&tick_routine_mutex) == 0);
-    l_tick_paused = 1U;
-    Q_ALLEGE(pthread_cond_signal(&tick_routine_cond) == 0);
-    Q_ALLEGE(pthread_mutex_unlock(&tick_routine_mutex) == 0);
-}
-
-/*..........................................................................*/
-static void resume_tick_routine(void) {
-    Q_ALLEGE(pthread_mutex_lock(&tick_routine_mutex) == 0);
-    l_tick_paused = 0U;
-    Q_ALLEGE(pthread_cond_signal(&tick_routine_cond) == 0);
-    Q_ALLEGE(pthread_mutex_unlock(&tick_routine_mutex) == 0);
-}
-
-/**
- * Process the next main command.
- */
-static void handle_cmd(struct android_app* app, int32_t cmd)
-{
-    struct engine* engine = (struct engine*)app->userData;
-
-    switch (cmd) {
-        case APP_CMD_SAVE_STATE: {      /* The system hints saving of state */
-            engine->app->savedState = malloc(sizeof(struct saved_state));
-            *((struct saved_state*)engine->app->savedState) = engine->state;
-            engine->app->savedStateSize = sizeof(struct saved_state);
-            break;
-        }
-        case APP_CMD_INIT_WINDOW: {            /* The window is being shown */
-            if (engine->app->window != NULL) {
-                init_display(engine);
-                draw_frame(engine);
-            }
-            break;
-        }
-        case APP_CMD_TERM_WINDOW: { /* The window is being hidden or closed */
-            term_display(engine);
-            break;
-        }
-        case APP_CMD_GAINED_FOCUS: {
-            engine->animating = 1U;
-            resume_tick_routine();
-            break;
-        }
-        case APP_CMD_LOST_FOCUS: {
-            engine->animating = 0U;
-            draw_frame(engine);
-            pause_tick_routine();
-            break;
-        }
-    }
-}
-
-
-/*..........................................................................*/
-static void *tick_routine(void *arg) {
-
-    struct timespec tim, tim2;
-    tim.tv_sec = 0;
-    tim.tv_nsec = (1000000000LL) / (BSP_TICKS_PER_SEC);
-
-    while (l_running != 0U) {
-        QF_TICK(&l_ticker);                          /* process a time tick */
-        nanosleep(&tim , &tim2);
-
-        /* If we are paused: wait for condition to avoid CPU burn */
-        Q_ALLEGE(pthread_mutex_lock(&tick_routine_mutex) == 0);
-        while ((l_running != 0U) && (l_tick_paused != 0U)) {
-            Q_ALLEGE(pthread_cond_wait(&tick_routine_cond,
-                                       &tick_routine_mutex) == 0);
-        }
-        Q_ALLEGE(pthread_mutex_unlock(&tick_routine_mutex) == 0);
-    };
-
-    return (void *)0;                                     /* return success */
-}
-
-/*..........................................................................*/
-void QF_init(void) {
-    Q_ALLEGE(pthread_mutex_init(&QF_pThreadMutex_, NULL) == 0);
-    Q_ALLEGE(pthread_mutex_init(&tick_routine_mutex, NULL) == 0);
-    Q_ALLEGE(pthread_cond_init(&tick_routine_cond, NULL) == 0);
-}
-
-/*..........................................................................*/
-void QF_stop(void) {
-    l_running = 0U;
-}
-
-/*..........................................................................*/
-void QF_onStartup(void) {
-    l_running = 1U;
-    l_tick_paused = 0U;
-    Q_ALLEGE(pthread_create(&tick_thread, NULL, tick_routine, (void*) 0)== 0);
-
-}
-
-/*..........................................................................*/
-void QF_onCleanup(void) {
-    int status, n;
-
-    term_display(&l_engine);
-
-    /* Ensure tick thread is not sitting at paused state. */
-    Q_ALLEGE(pthread_mutex_lock(&tick_routine_mutex) == 0);
-    l_tick_paused = 0U;
-    Q_ALLEGE(pthread_cond_signal(&tick_routine_cond) == 0);
-    Q_ALLEGE(pthread_mutex_unlock(&tick_routine_mutex) == 0);
-
-    /* Wait until tick thread finishes */
-    Q_ALLEGE(pthread_join(tick_thread, (void*) &status) == 0);
-
-    Q_ALLEGE(pthread_cond_destroy(&tick_routine_cond) == 0);
-    Q_ALLEGE(pthread_mutex_destroy(&tick_routine_mutex) == 0);
-
-    /* Wait until AO threads finish */
-    Q_ALLEGE(pthread_join(AO_Table->thread.thread, (void*) &status) == 0);
-
-    for (n = 0; n < N_PHILO; n++) {
-        Q_ALLEGE(pthread_join(AO_Philo[n]->thread.thread,
-                 (void*) &status) == 0);
-    }
-
-    Q_ALLEGE(pthread_mutex_destroy(&QF_pThreadMutex_) == 0);
-
-    QS_EXIT();
-}
-
-
-/*..........................................................................*/
-int16_t QF_run(void) {
-
-    QF_onStartup();                              /* invoke startup callback */
-
-    QS_OBJ_DICTIONARY(&l_ticker);       /* the QS dictionary for the ticker */
-
-    while (l_running != 0U) {
-
-        int ident;
-        int events;
-        struct android_poll_source* source;
-
-        /* If not animating, we will block forever waiting for events.
-          If animating, we loop until all events are read, then continue
-          to draw the next frame of animation. */
-        while ((ident=ALooper_pollAll(l_engine.animating ? 0 : -1,
-                                      NULL,
-                                      &events,
-                                      (void**)&source)) >= 0) {
-
-            if (source != NULL) {
-                source->process(l_engine.app, source);
-            }
-
-            // Check for exit
-            if (l_engine.app->destroyRequested != 0) {
-                QF_PUBLISH(Q_NEW(QEvt, TERMINATE_SIG), &QF_run);
-                QF_stop();
-                break;
-            }
-        }
-
-
-        if (l_engine.animating) {
-            /* draw next animation frame */
-            draw_frame(&l_engine);
-        }
-    }
-
-    QF_onCleanup();
-    return 0;
-}
-
-/**
- * This is the main entry point of a native application that is using
- * android_native_app_glue.  It runs in its own thread, with its own
- * event loop for receiving input events and doing other things.
- */
-void android_main(struct android_app* state) {
-
-    app_dummy();           /* make sure android native glue is not stripped */
-
-    {
-        char *ptr;
-
-        for (ptr = &__bss_start; ptr != &__bss_end__; ptr++ ) {/* See NOTE01*/
-            *ptr = 0;
-        }
-    }
-
-    memset(&l_engine, 0, sizeof(l_engine));
-    state->userData = &l_engine;
-    state->onAppCmd = handle_cmd;
-    state->onInputEvent = handle_input;
-
-    l_engine.app = state;
-    l_running = 0U;
-    l_tick_paused = 0U;
-
-    if (state->savedState != NULL) {
-           /* We are starting with a previous saved state; restore from it. */
-        l_engine.state = *(struct saved_state*)state->savedState;
-    }
-
-    {
-        char **param = {NULL};
-        main(0, param);               /* call main with expected parameters */
-    }
-}
-
-
-/*--------------------------------------------------------------------------*/
-#ifdef Q_SPY                                         /* define QS callbacks */
-
-#include "qspy.h"
-#include <android/log.h>
-
-#define LOGI(...) \
-    ((void)__android_log_print(ANDROID_LOG_INFO, "dpp", __VA_ARGS__))
-
-static volatile uint8_t l_idle_running;
-static pthread_t idle_thread;
-
-/*..........................................................................*/
-static void *idleThread(void *par) {     /* the expected P-Thread signature */
-    (void)par;
-    static struct timespec tim, tim2;
-    tim.tv_sec = 0;
-    tim.tv_nsec = 10000000UL;
-
-    l_idle_running = (uint8_t)1;
-
-    while (l_idle_running) {
-        uint16_t nBytes = 256;
-        uint8_t const *block;
-
-        QF_CRIT_ENTRY(dummy);
-        block = QS_getBlock(&nBytes);
-        QF_CRIT_EXIT(dummy);
-
-        if (block != (uint8_t *)0) {
-            QSPY_parse(block, nBytes);
-        }
-        else {
-            nanosleep(&tim, &tim2);
-        }
-
-    }
-
-    return 0;                                             /* return success */
-}
-/*..........................................................................*/
-uint8_t QS_onStartup(void const *arg) {
-    static uint8_t qsBuf[10*1024];             /* 4K buffer for Quantum Spy */
-
-    QS_initBuf(qsBuf, sizeof(qsBuf));
-
-    QSPY_config((QP_VERSION >> 8),            /* version                    */
-                QS_OBJ_PTR_SIZE,              /* objPtrSize                 */
-                QS_FUN_PTR_SIZE,              /* funPtrSize                 */
-                QS_TIME_SIZE,                 /* tstampSize                 */
-                Q_SIGNAL_SIZE,                /* sigSize,                   */
-                QF_EVENT_SIZ_SIZE,            /* evtSize                    */
-                QF_EQUEUE_CTR_SIZE,           /* queueCtrSize               */
-                QF_MPOOL_CTR_SIZE,            /* poolCtrSize                */
-                QF_MPOOL_SIZ_SIZE,            /* poolBlkSize                */
-                QF_TIMEEVT_CTR_SIZE,          /* tevtCtrSize                */
-                (void *)0,                    /* matFile,                   */
-                (void *)0,
-                (QSPY_CustParseFun)0);        /* customized parser function */
-
-    QS_FILTER_ON(QS_ALL_RECORDS);
-
-//    QS_FILTER_OFF(QS_QEP_STATE_EMPTY);
-//    QS_FILTER_OFF(QS_QEP_STATE_ENTRY);
-//    QS_FILTER_OFF(QS_QEP_STATE_EXIT);
-//    QS_FILTER_OFF(QS_QEP_STATE_INIT);
-//    QS_FILTER_OFF(QS_QEP_INIT_TRAN);
-//    QS_FILTER_OFF(QS_QEP_INTERN_TRAN);
-//    QS_FILTER_OFF(QS_QEP_TRAN);
-//    QS_FILTER_OFF(QS_QEP_IGNORED);
-//    QS_FILTER_OFF(QS_QEP_DISPATCH);
-//    QS_FILTER_OFF(QS_QEP_UNHANDLED);
-
-    QS_FILTER_OFF(QS_QF_ACTIVE_ADD);
-    QS_FILTER_OFF(QS_QF_ACTIVE_REMOVE);
-    QS_FILTER_OFF(QS_QF_ACTIVE_SUBSCRIBE);
-//    QS_FILTER_OFF(QS_QF_ACTIVE_UNSUBSCRIBE);
-    QS_FILTER_OFF(QS_QF_ACTIVE_POST_FIFO);
-//    QS_FILTER_OFF(QS_QF_ACTIVE_POST_LIFO);
-    QS_FILTER_OFF(QS_QF_ACTIVE_GET);
-    QS_FILTER_OFF(QS_QF_ACTIVE_GET_LAST);
-    QS_FILTER_OFF(QS_QF_EQUEUE_INIT);
-    QS_FILTER_OFF(QS_QF_EQUEUE_POST_FIFO);
-    QS_FILTER_OFF(QS_QF_EQUEUE_POST_LIFO);
-    QS_FILTER_OFF(QS_QF_EQUEUE_GET);
-    QS_FILTER_OFF(QS_QF_EQUEUE_GET_LAST);
-    QS_FILTER_OFF(QS_QF_MPOOL_INIT);
-    QS_FILTER_OFF(QS_QF_MPOOL_GET);
-    QS_FILTER_OFF(QS_QF_MPOOL_PUT);
-    QS_FILTER_OFF(QS_QF_PUBLISH);
-    QS_FILTER_OFF(QS_QF_NEW);
-    QS_FILTER_OFF(QS_QF_GC_ATTEMPT);
-    QS_FILTER_OFF(QS_QF_GC);
-//    QS_FILTER_OFF(QS_QF_TICK);
-//    QS_FILTER_OFF(QS_QF_TIMEEVT_ARM);
-//    QS_FILTER_OFF(QS_QF_TIMEEVT_AUTO_DISARM);
-//    QS_FILTER_OFF(QS_QF_TIMEEVT_DISARM_ATTEMPT);
-//    QS_FILTER_OFF(QS_QF_TIMEEVT_DISARM);
-//    QS_FILTER_OFF(QS_QF_TIMEEVT_REARM);
-//    QS_FILTER_OFF(QS_QF_TIMEEVT_POST);
-//    QS_FILTER_OFF(QS_QF_CRIT_ENTRY);
-//    QS_FILTER_OFF(QS_QF_CRIT_EXIT);
-    QS_FILTER_OFF(QS_QF_ISR_ENTRY);
-    QS_FILTER_OFF(QS_QF_ISR_EXIT);
-
-    QS_RESET();
-
-    {
-        pthread_attr_t attr;
-        struct sched_param param;
-
-        Q_ALLEGE(pthread_attr_init(&attr) == 0);
-        Q_ALLEGE(pthread_attr_setschedpolicy(&attr, SCHED_FIFO) == 0);
-        param.sched_priority = sched_get_priority_min(SCHED_FIFO);
-
-        Q_ALLEGE(pthread_attr_setschedparam(&attr, &param) == 0);
-        Q_ALLEGE(pthread_attr_setdetachstate(&attr,
-                                             PTHREAD_CREATE_JOINABLE) == 0);
-
-        Q_ALLEGE(pthread_create(&idle_thread, &attr, &idleThread, 0) == 0);
-        Q_ALLEGE(pthread_attr_destroy(&attr) == 0);
-    }
-
-    return (uint8_t)1;
-}
-
-/*..........................................................................*/
-void QS_onCleanup(void) {
-    int status;
-    l_idle_running = (uint8_t)0;
-
-    /* wait until idle thread finishes */
-    Q_ALLEGE(pthread_join(idle_thread, (void*) &status) == 0);
-    QSPY_stop();
-}
-
-/*..........................................................................*/
-void QSPY_onPrintLn(void) {
-    LOGI("%s\n", QSPY_line);
-}
-
-#endif                                                             /* Q_SPY */
-/*--------------------------------------------------------------------------*/
-
-/*****************************************************************************
-* NOTE01:
-* The android lifecycle model of android_main does NOT zero the uninitialized
-* .bss variables after first start. Since QP relies on the clearing
-* of the static uninitialized variables, the critical QP objects are cleared
-* explicitly in this BSP.
-*/
-
-

+ 0 - 53
examples/android-ndk/gnu/dpp/jni/bsp.h

@@ -1,53 +0,0 @@
-/*****************************************************************************
-* Product: DPP example
-* Last Updated for Version: 4.5.02
-* Date of the Last Update:  Jul 04, 2012
-*
-*                    Q u a n t u m     L e a P s
-*                    ---------------------------
-*                    innovating embedded systems
-*
-* Copyright (C) 2002-2012 Quantum Leaps, LLC. All rights reserved.
-*
-* This program is open source software: you can redistribute it and/or
-* modify it under the terms of the GNU General Public License as published
-* by the Free Software Foundation, either version 2 of the License, or
-* (at your option) any later version.
-*
-* Alternatively, this program may be distributed and modified under the
-* terms of Quantum Leaps commercial licenses, which expressly supersede
-* the GNU General Public License and are specifically designed for
-* licensees interested in retaining the proprietary status of their code.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-* GNU General Public License for more details.
-*
-* You should have received a copy of the GNU General Public License
-* along with this program. If not, see <http://www.gnu.org/licenses/>.
-*
-* Contact information:
-* Quantum Leaps Web sites: http://www.quantum-leaps.com
-*                          http://www.state-machine.com
-* e-mail:                  info@quantum-leaps.com
-*****************************************************************************/
-#ifndef bsp_h
-#define bsp_h
-
-#include <stdint.h>
-#include <android_native_app_glue.h>
-
-#define BSP_TICKS_PER_SEC   30U
-
-
-void BSP_init(void);
-void BSP_displayPhilStat(uint8_t n, char const *stat);
-void BSP_displayPaused(uint8_t paused);
-void BSP_terminate(int16_t result);
-
-void BSP_randomSeed(uint32_t seed);                          /* random seed */
-uint32_t BSP_random(void);                       /* pseudo-random generator */
-
-
-#endif                                                             /* bsp_h */

+ 0 - 259
examples/android-ndk/gnu/dpp/jni/display.c

@@ -1,259 +0,0 @@
-/*****************************************************************************
-* Product: DPP example
-* Last Updated for Version: 4.5.02
-* Date of the Last Update:  May 18, 2012
-*
-*                    Q u a n t u m     L e a P s
-*                    ---------------------------
-*                    innovating embedded systems
-*
-* Copyright (C) 2002-2012 Quantum Leaps, LLC. All rights reserved.
-*
-* This program is open source software: you can redistribute it and/or
-* modify it under the terms of the GNU General Public License as published
-* by the Free Software Foundation, either version 2 of the License, or
-* (at your option) any later version.
-*
-* Alternatively, this program may be distributed and modified under the
-* terms of Quantum Leaps commercial licenses, which expressly supersede
-* the GNU General Public License and are specifically designed for
-* licensees interested in retaining the proprietary status of their code.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-* GNU General Public License for more details.
-*
-* You should have received a copy of the GNU General Public License
-* along with this program. If not, see <http://www.gnu.org/licenses/>.
-*
-* Contact information:
-* Quantum Leaps Web sites: http://www.quantum-leaps.com
-*                          http://www.state-machine.com
-* e-mail:                  info@quantum-leaps.com
-*****************************************************************************/
-#include "display.h"
-
-#include <math.h>
-#include <android_native_app_glue.h>
-
-Q_DEFINE_THIS_MODULE("display")
-
-/* Local-objects -----------------------------------------------------------*/
-#define M_PI2           (2.0f*M_PI)
-#define CIRCLE_FACES    30
-#define CIRCLE_VERTEXES (CIRCLE_FACES + 2)       /* +2 = origo + end vertex */
-
-static void draw_circle(float x, float y, float radius, float red,
-                        float green, float blue, float alpha);
-
-/*
-* Helper function for drawing a circle in OpenGL
-*/
-static void draw_circle(float x, float y, float radius, float red,
-                        float green, float blue, float alpha) {
-    GLfloat coordinate_data[CIRCLE_VERTEXES * 2] = {0.0f};
-    int n;
-
-    /* First coordinate of triangle fan is the center coordinate */
-    coordinate_data[0] = x;
-    coordinate_data[1] = y;
-
-    /* Place other coordinates in even circle */
-    for (n = 0; n < CIRCLE_VERTEXES - 1; n++) {
-        float ratio;
-        int index;
-
-        ratio = (float)n / CIRCLE_FACES;
-        index = (n*2) + 2;
-
-        coordinate_data[index]     = x + cos(ratio * M_PI2) * radius;
-        coordinate_data[index + 1] = y + sin(ratio * M_PI2) * radius;
-    }
-
-    glMatrixMode(GL_PROJECTION);
-    glLoadIdentity();
-
-    glEnableClientState(GL_VERTEX_ARRAY);
-
-    glColor4f(red, green, blue, alpha);
-    glVertexPointer(2, GL_FLOAT, 0, coordinate_data);
-    glDrawArrays(GL_TRIANGLE_FAN, 0, CIRCLE_VERTEXES);
-
-    glDisableClientState(GL_VERTEX_ARRAY);
-
-}
-
-/*..........................................................................*/
-int init_display(struct engine* engine) {
-
-    /*
-     * Here specify the attributes of the desired configuration.
-     * Below, we select an EGLConfig with at least 8 bits per color
-     * component compatible with on-screen windows
-     */
-    const EGLint attribs[] = {
-            EGL_SURFACE_TYPE,
-            EGL_WINDOW_BIT,
-            EGL_BLUE_SIZE, 8,
-            EGL_GREEN_SIZE, 8,
-            EGL_RED_SIZE, 8,
-            EGL_NONE
-    };
-
-    EGLint w, h, format;
-    EGLint numConfigs;
-    EGLConfig config;
-    EGLSurface surface;
-    EGLContext context;
-
-    EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
-
-    eglInitialize(display, 0, 0);
-
-    /* Here, the application chooses the configuration it desires. In this
-     * sample, we have a very simplified selection process, where we pick
-     * the first EGLConfig that matches our criteria */
-    eglChooseConfig(display, attribs, &config, 1, &numConfigs);
-
-    /* EGL_NATIVE_VISUAL_ID is an attribute of the EGLConfig that is
-     * guaranteed to be accepted by ANativeWindow_setBuffersGeometry().
-     * As soon as we picked a EGLConfig, we can safely reconfigure the
-     * ANativeWindow buffers to match, using EGL_NATIVE_VISUAL_ID. */
-    eglGetConfigAttrib(display, config, EGL_NATIVE_VISUAL_ID, &format);
-
-    ANativeWindow_setBuffersGeometry(engine->app->window, 0, 0, format);
-
-    surface = eglCreateWindowSurface(display, config,
-                                     engine->app->window, NULL);
-    context = eglCreateContext(display, config, NULL, NULL);
-
-    Q_ALLEGE(eglMakeCurrent(display, surface, surface, context) != EGL_FALSE);
-
-    eglQuerySurface(display, surface, EGL_WIDTH, &w);
-    eglQuerySurface(display, surface, EGL_HEIGHT, &h);
-
-    engine->display = display;
-    engine->context = context;
-    engine->surface = surface;
-    engine->width = w;
-    engine->height = h;
-
-    /* Initialize GL state. */
-    glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST);
-    glDisable(GL_TEXTURE_2D);
-
-    /* configure simple drawing model */
-    glShadeModel(GL_FLAT);
-    glDisable(GL_DEPTH_TEST);
-    glDisable(GL_LIGHTING);
-
-    /* setup simple viewport, where coordinates are based on screen size */
-    glViewport(0,0, w, h);
-    glOrthof(0, (float)w, (float)h, 0, 0, 1);
-
-    return 0;
-}
-
-/*..........................................................................*/
-void draw_frame(struct engine* engine) {
-
-    if (engine->display == NULL) {
-        return;
-    }
-
-    /* Calculate circle radiuses based on screen size */
-    float philo_radius = engine->width / (2.0 * N_PHILO);
-    float table_radius = engine->width / 6.0;
-    int n;
-
-    /* Clear screen with black */
-    glClearColor(0.0f, 0.0f, 0.0f, 1);
-    glClear(GL_COLOR_BUFFER_BIT);
-
-    if (engine->state.table_paused) {
-        draw_circle(engine->width / 2.0,        /* Draw table in the middle */
-                    engine->height / 2.0,
-                    table_radius,
-                    0.5,
-                    0.5,
-                    0.5,
-                    1.0);
-    }
-    else {
-        draw_circle(engine->width / 2.0,
-                    engine->height / 2.0,
-                    table_radius,
-                    1.0,
-                    1.0,
-                    1.0,
-                    1.0);
-    }
-
-    for (n = 0; n < N_PHILO; n++) {       /* Draw philosophers around table */
-        float r, g, b;
-        float x, y;
-        float radius = table_radius * 1.3f;
-        float ratio;
-
-        x = engine->width / 2.0f;
-        y = engine->height / 2.0f;
-        ratio = (float)n / (float) N_PHILO;
-
-        /* distribute philosophers evenly */
-        x += cos(ratio * M_PI2) * radius;
-        y += sin(ratio * M_PI2) * radius;
-
-        switch (engine->state.philo_status[n]) {
-            default:
-            case 'h': {
-                /* hungry */
-                r = 1.0f;
-                g = 0.0f;
-                b = 0.0f;
-                break;
-            }
-
-            case 'e': {
-                /* eating */
-                r = 0.0f;
-                g = 1.0f;
-                b = 0.0f;
-                break;
-            }
-
-            case 't': {
-                /* thinking */
-                r = 0.0f;
-                g = 0.0f;
-                b = 1.0f;
-                break;
-            }
-        }
-        draw_circle(x, y, philo_radius, r, g, b, 1.0f);
-    }
-    eglSwapBuffers(engine->display, engine->surface);
-}
-
-/*..........................................................................*/
-void term_display(struct engine* engine)  {
-
-    if (engine->display != EGL_NO_DISPLAY) {
-        eglMakeCurrent(engine->display, EGL_NO_SURFACE,
-                       EGL_NO_SURFACE, EGL_NO_CONTEXT);
-
-        if (engine->context != EGL_NO_CONTEXT) {
-            eglDestroyContext(engine->display, engine->context);
-        }
-
-        if (engine->surface != EGL_NO_SURFACE) {
-            eglDestroySurface(engine->display, engine->surface);
-        }
-        eglTerminate(engine->display);
-    }
-
-    engine->animating = 0U;
-    engine->display = EGL_NO_DISPLAY;
-    engine->context = EGL_NO_CONTEXT;
-    engine->surface = EGL_NO_SURFACE;
-}

+ 0 - 76
examples/android-ndk/gnu/dpp/jni/display.h

@@ -1,76 +0,0 @@
-/*****************************************************************************
-* Product: DPP example
-* Last Updated for Version: 4.5.02
-* Date of the Last Update:  Jul 04, 2012
-*
-*                    Q u a n t u m     L e a P s
-*                    ---------------------------
-*                    innovating embedded systems
-*
-* Copyright (C) 2002-2012 Quantum Leaps, LLC. All rights reserved.
-*
-* This program is open source software: you can redistribute it and/or
-* modify it under the terms of the GNU General Public License as published
-* by the Free Software Foundation, either version 2 of the License, or
-* (at your option) any later version.
-*
-* Alternatively, this program may be distributed and modified under the
-* terms of Quantum Leaps commercial licenses, which expressly supersede
-* the GNU General Public License and are specifically designed for
-* licensees interested in retaining the proprietary status of their code.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-* GNU General Public License for more details.
-*
-* You should have received a copy of the GNU General Public License
-* along with this program. If not, see <http://www.gnu.org/licenses/>.
-*
-* Contact information:
-* Quantum Leaps Web sites: http://www.quantum-leaps.com
-*                          http://www.state-machine.com
-* e-mail:                  info@quantum-leaps.com
-*****************************************************************************/
-#ifndef display_h
-#define display_h
-
-#include "qp_port.h"
-#include "dpp.h"
-#include <stdint.h>
-#include <EGL/egl.h>
-#include <GLES/gl.h>
-
-
-/**
- * Saved state, persisted by Android system
- */
-struct saved_state {
-    char philo_status[N_PHILO];    /* hint for drawing  philosophers status */
-    uint8_t table_paused;          /* hint for drawing  table status        */
-};
-
-
-/**
- * Shared state for our app.
- */
-struct engine {
-    struct android_app *app;                 /* application instance        */
-
-    EGLDisplay display;                      /* OpenGL display              */
-    EGLSurface surface;                      /* OpenGL surface              */
-    EGLContext context;                      /* OpenGL context              */
-
-    uint8_t animating;                       /* are we currently animating? */
-    int32_t width;                           /* width of screen, pixels     */
-    int32_t height;                          /* height of screen, pixels    */
-
-    struct saved_state state;                /* state data                  */
-};
-
-
-int init_display(struct engine *engine);
-void draw_frame(struct engine *engine);
-void term_display(struct engine *engine);
-
-#endif                                                         /* display_h */

+ 0 - 49
examples/android-ndk/gnu/dpp/jni/dpp.h

@@ -1,49 +0,0 @@
-/*****************************************************************************
-* Model: dpp.qm
-* File:  ./dpp.h
-*
-* This file has been generated automatically by QP Modeler (QM).
-* DO NOT EDIT THIS FILE MANUALLY.
-*
-* Please visit www.state-machine.com/qm for more information.
-*****************************************************************************/
-#ifndef dpp_h
-#define dpp_h
-
-enum DPPSignals {
-    EAT_SIG = Q_USER_SIG, /* published by Table to let a philosopher eat */
-    DONE_SIG,             /* published by Philosopher when done eating */
-    PAUSE_SIG,            /* published by BSP to pause the application */
-    TERMINATE_SIG,        /* published by BSP to terminate the application */
-    MAX_PUB_SIG,          /* the last published signal */
-
-    HUNGRY_SIG,           /* posted direclty to Table from hungry Philo */
-    MAX_SIG               /* the last signal */
-};
-
-/* @(/1/0) .................................................................*/
-typedef struct TableEvtTag {
-/* protected: */
-    QEvt super;
-
-/* public: */
-    uint8_t philoNum;
-} TableEvt;
-
-
-/* number of philosophers */
-#define N_PHILO ((uint8_t)5)
-
-
-/* @(/2/4) .................................................................*/
-void Philo_ctor(void);
-
-/* @(/2/5) .................................................................*/
-void Table_ctor(void);
-
-int main(int argc, char *argv[]);
-
-extern QActive * const AO_Philo[N_PHILO];
-extern QActive * const AO_Table;
-
-#endif                    /* dpp_h */

+ 0 - 441
examples/android-ndk/gnu/dpp/jni/dpp.qm

@@ -1,441 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<model version="2.2.03">
- <documentation>Dining Philosopher Problem example</documentation>
- <framework name="qpc"/>
- <package name="Events" stereotype="0x01">
-  <class name="TableEvt" superclass="qpc::QEvt">
-   <attribute name="philoNum" type="uint8_t" visibility="0x00" properties="0x00"/>
-  </class>
- </package>
- <package name="AOs" stereotype="0x02">
-  <class name="Philo" superclass="qpc::QActive">
-   <attribute name="timeEvt" type="QTimeEvt" visibility="0x02" properties="0x00"/>
-   <statechart>
-    <initial target="../1/1">
-     <action>static uint8_t registered = (uint8_t)0; /* starts off with 0, per C-standard */
-(void)e; /* suppress the compiler warning about unused parameter */
-if (registered == (uint8_t)0) {
-    registered = (uint8_t)1;
-
-    QS_OBJ_DICTIONARY(&amp;l_philo[0]);
-    QS_OBJ_DICTIONARY(&amp;l_philo[0].timeEvt);
-    QS_OBJ_DICTIONARY(&amp;l_philo[1]);
-    QS_OBJ_DICTIONARY(&amp;l_philo[1].timeEvt);
-    QS_OBJ_DICTIONARY(&amp;l_philo[2]);
-    QS_OBJ_DICTIONARY(&amp;l_philo[2].timeEvt);
-    QS_OBJ_DICTIONARY(&amp;l_philo[3]);
-    QS_OBJ_DICTIONARY(&amp;l_philo[3].timeEvt);
-    QS_OBJ_DICTIONARY(&amp;l_philo[4]);
-    QS_OBJ_DICTIONARY(&amp;l_philo[4].timeEvt);
-
-    QS_FUN_DICTIONARY(&amp;Philo_initial);
-    QS_FUN_DICTIONARY(&amp;Philo_thinking);
-    QS_FUN_DICTIONARY(&amp;Philo_hungry);
-    QS_FUN_DICTIONARY(&amp;Philo_eating);
-}
-QS_SIG_DICTIONARY(HUNGRY_SIG, me);  /* signal for each Philos */
-QS_SIG_DICTIONARY(TIMEOUT_SIG, me); /* signal for each Philos */
-
-QActive_subscribe(&amp;me-&gt;super, EAT_SIG);
-QActive_subscribe(&amp;me-&gt;super, TERMINATE_SIG);
-</action>
-     <initial_glyph conn="2,2,5,1,33,12,-14">
-      <action box="0,-2,6,2"/>
-     </initial_glyph>
-    </initial>
-    <state name="active">
-     <tran trig="TERMINATE">
-      <action>QActive_stop(&amp;me-&gt;super);</action>
-      <tran_glyph conn="2,9,3,-1,19">
-       <action box="0,-2,10,2"/>
-      </tran_glyph>
-     </tran>
-     <state name="thinking">
-      <entry>QTimeEvt_postIn(&amp;me-&gt;timeEvt, &amp;me-&gt;super, THINK_TIME);</entry>
-      <tran trig="TIMEOUT" target="../../2">
-       <tran_glyph conn="4,19,3,1,20,13,-3">
-        <action box="0,-2,6,2"/>
-       </tran_glyph>
-      </tran>
-      <tran trig="EAT, DONE">
-       <action>/* EAT or DONE must be for other Philos than this one */
-Q_ASSERT(Q_EVT_CAST(TableEvt)-&gt;philoNum != PHILO_ID(me));</action>
-       <tran_glyph conn="4,24,3,-1,13">
-        <action box="0,-2,14,2"/>
-       </tran_glyph>
-      </tran>
-      <state_glyph node="4,12,17,16">
-       <entry box="1,2,5,2"/>
-      </state_glyph>
-     </state>
-     <state name="hungry">
-      <entry>TableEvt *pe = Q_NEW(TableEvt, HUNGRY_SIG);
-pe-&gt;philoNum = PHILO_ID(me);
-QACTIVE_POST(AO_Table, &amp;pe-&gt;super, me);</entry>
-      <tran trig="EAT">
-       <choice target="../../../3">
-        <guard>Q_EVT_CAST(TableEvt)-&gt;philoNum == PHILO_ID(me)</guard>
-        <choice_glyph conn="13,37,5,1,11,13,-3">
-         <action box="1,0,19,4"/>
-        </choice_glyph>
-       </choice>
-       <tran_glyph conn="4,37,3,-1,9">
-        <action box="0,-2,14,2"/>
-       </tran_glyph>
-      </tran>
-      <tran trig="DONE">
-       <action>/* DONE must be for other Philos than this one */
-Q_ASSERT(Q_EVT_CAST(TableEvt)-&gt;philoNum != PHILO_ID(me));</action>
-       <tran_glyph conn="4,43,3,-1,13">
-        <action box="0,-2,8,2"/>
-       </tran_glyph>
-      </tran>
-      <state_glyph node="4,30,17,16">
-       <entry box="1,2,5,2"/>
-      </state_glyph>
-     </state>
-     <state name="eating">
-      <entry>QTimeEvt_postIn(&amp;me-&gt;timeEvt, &amp;me-&gt;super, EAT_TIME);</entry>
-      <exit>TableEvt *pe = Q_NEW(TableEvt, DONE_SIG);
-pe-&gt;philoNum = PHILO_ID(me);
-QF_PUBLISH(&amp;pe-&gt;super, me);</exit>
-      <tran trig="TIMEOUT" target="../../1">
-       <tran_glyph conn="4,58,3,1,22,-41,-5">
-        <action box="0,-2,6,2"/>
-       </tran_glyph>
-      </tran>
-      <tran trig="EAT, DONE">
-       <action>/* EAT or DONE must be for other Philos than this one */
-Q_ASSERT(Q_EVT_CAST(TableEvt)-&gt;philoNum != PHILO_ID(me));</action>
-       <tran_glyph conn="4,62,3,-1,13">
-        <action box="0,-2,14,2"/>
-       </tran_glyph>
-      </tran>
-      <state_glyph node="4,48,17,18">
-       <entry box="1,2,5,2"/>
-       <exit box="1,4,5,2"/>
-      </state_glyph>
-     </state>
-     <state_glyph node="2,4,30,66"/>
-    </state>
-    <state_diagram size="38,72"/>
-   </statechart>
-  </class>
-  <class name="Table" superclass="qpc::QActive">
-   <attribute name="fork[N_PHILO]" type="uint8_t" visibility="0x02" properties="0x00"/>
-   <attribute name="isHungry[N_PHILO]" type="uint8_t" visibility="0x02" properties="0x00"/>
-   <statechart>
-    <initial target="../1/2">
-     <action>uint8_t n;
-(void)e; /* suppress the compiler warning about unused parameter */
-
-QS_OBJ_DICTIONARY(&amp;l_table);
-QS_FUN_DICTIONARY(&amp;QHsm_top);
-QS_FUN_DICTIONARY(&amp;Table_initial);
-QS_FUN_DICTIONARY(&amp;Table_serving);
-
-QS_SIG_DICTIONARY(DONE_SIG,      (void *)0); /* global signals */
-QS_SIG_DICTIONARY(EAT_SIG,       (void *)0);
-QS_SIG_DICTIONARY(PAUSE_SIG,     (void *)0);
-QS_SIG_DICTIONARY(TERMINATE_SIG, (void *)0);
-
-QS_SIG_DICTIONARY(HUNGRY_SIG,    me); /* signal just for Table */
-
-QActive_subscribe(&amp;me-&gt;super, DONE_SIG);
-QActive_subscribe(&amp;me-&gt;super, PAUSE_SIG);
-QActive_subscribe(&amp;me-&gt;super, TERMINATE_SIG);
-
-for (n = 0U; n &lt; N_PHILO; ++n) {
-    me-&gt;fork[n] = FREE;
-    me-&gt;isHungry[n] = 0U;
-    BSP_displayPhilStat(n, &quot;thinking&quot;);
-}</action>
-     <initial_glyph conn="3,3,5,1,44,18,-9">
-      <action box="0,-2,6,2"/>
-     </initial_glyph>
-    </initial>
-    <state name="active">
-     <tran trig="TERMINATE">
-      <action>QActive_stop(&amp;me-&gt;super);</action>
-      <tran_glyph conn="2,11,3,-1,14">
-       <action box="0,-2,20,4"/>
-      </tran_glyph>
-     </tran>
-     <tran trig="EAT">
-      <action>Q_ERROR();</action>
-      <tran_glyph conn="2,15,3,-1,14">
-       <action box="0,-2,10,4"/>
-      </tran_glyph>
-     </tran>
-     <state name="serving">
-      <entry brief="give pending permitions to eat">uint8_t n;
-for (n = 0U; n &lt; N_PHILO; ++n) { /* give permissions to eat... */
-    if ((me-&gt;isHungry[n] != 0U)
-        &amp;&amp; (me-&gt;fork[LEFT(n)] == FREE)
-        &amp;&amp; (me-&gt;fork[n] == FREE))
-    {
-        TableEvt *te;
-
-        me-&gt;fork[LEFT(n)] = USED;
-        me-&gt;fork[n] = USED;
-        te = Q_NEW(TableEvt, EAT_SIG);
-        te-&gt;philoNum = n;
-        QF_PUBLISH(&amp;te-&gt;super, me);
-        me-&gt;isHungry[n] = 0U;
-        BSP_displayPhilStat(n, &quot;eating  &quot;);
-    }
-}</entry>
-      <tran trig="HUNGRY">
-       <action>uint8_t n, m;
-
-n = Q_EVT_CAST(TableEvt)-&gt;philoNum;
-/* phil ID must be in range and he must be not hungry */
-Q_ASSERT((n &lt; N_PHILO) &amp;&amp; (me-&gt;isHungry[n] == 0U));
-
-BSP_displayPhilStat(n, &quot;hungry  &quot;);
-m = LEFT(n);</action>
-       <choice>
-        <guard brief="both free">(me-&gt;fork[m] == FREE) &amp;&amp; (me-&gt;fork[n] == FREE)</guard>
-        <action>TableEvt *pe;
-me-&gt;fork[m] = USED;
-me-&gt;fork[n] = USED;
-pe = Q_NEW(TableEvt, EAT_SIG);
-pe-&gt;philoNum = n;
-QF_PUBLISH(&amp;pe-&gt;super, me);
-BSP_displayPhilStat(n, &quot;eating  &quot;);</action>
-        <choice_glyph conn="19,26,5,-1,10">
-         <action box="1,0,10,2"/>
-        </choice_glyph>
-       </choice>
-       <choice>
-        <guard>else</guard>
-        <action>me-&gt;isHungry[n] = 1U;</action>
-        <choice_glyph conn="19,26,4,-1,5,10">
-         <action box="1,5,6,2"/>
-        </choice_glyph>
-       </choice>
-       <tran_glyph conn="4,26,3,-1,15">
-        <action box="0,-2,8,2"/>
-       </tran_glyph>
-      </tran>
-      <tran trig="DONE">
-       <action>uint8_t n, m;
-TableEvt *pe;
-
-n = Q_EVT_CAST(TableEvt)-&gt;philoNum;
-/* phil ID must be in range and he must be not hungry */
-Q_ASSERT((n &lt; N_PHILO) &amp;&amp; (me-&gt;isHungry[n] == 0U));
-
-BSP_displayPhilStat(n, &quot;thinking&quot;);
-m = LEFT(n);
-/* both forks of Phil[n] must be used */
-Q_ASSERT((me-&gt;fork[n] == USED) &amp;&amp; (me-&gt;fork[m] == USED));
-
-me-&gt;fork[m] = FREE;
-me-&gt;fork[n] = FREE;
-m = RIGHT(n); /* check the right neighbor */
-
-if ((me-&gt;isHungry[m] != 0U) &amp;&amp; (me-&gt;fork[m] == FREE)) {
-    me-&gt;fork[n] = USED;
-    me-&gt;fork[m] = USED;
-    me-&gt;isHungry[m] = 0U;
-    pe = Q_NEW(TableEvt, EAT_SIG);
-    pe-&gt;philoNum = m;
-    QF_PUBLISH(&amp;pe-&gt;super, me);
-    BSP_displayPhilStat(m, &quot;eating  &quot;);
-}
-m = LEFT(n); /* check the left neighbor */
-n = LEFT(m); /* left fork of the left neighbor */
-if ((me-&gt;isHungry[m] != 0U) &amp;&amp; (me-&gt;fork[n] == FREE)) {
-    me-&gt;fork[m] = USED;
-    me-&gt;fork[n] = USED;
-    me-&gt;isHungry[m] = 0U;
-    pe = Q_NEW(TableEvt, EAT_SIG);
-    pe-&gt;philoNum = m;
-    QF_PUBLISH(&amp;pe-&gt;super, me);
-    BSP_displayPhilStat(m, &quot;eating  &quot;);
-}</action>
-       <tran_glyph conn="4,34,3,-1,15">
-        <action box="0,-2,6,2"/>
-       </tran_glyph>
-      </tran>
-      <tran trig="EAT">
-       <action>Q_ERROR();</action>
-       <tran_glyph conn="4,37,3,-1,15">
-        <action box="0,-2,12,4"/>
-       </tran_glyph>
-      </tran>
-      <tran trig="PAUSE" target="../../3">
-       <tran_glyph conn="4,41,3,1,37,6,-3">
-        <action box="0,-2,7,2"/>
-       </tran_glyph>
-      </tran>
-      <state_glyph node="4,19,34,24">
-       <entry box="1,2,27,2"/>
-      </state_glyph>
-     </state>
-     <state name="paused">
-      <entry>BSP_displayPaused(1U);</entry>
-      <exit>BSP_displayPaused(0U);</exit>
-      <tran trig="PAUSE" target="../../2">
-       <tran_glyph conn="4,57,3,1,39,-20,-5">
-        <action box="0,-2,7,2"/>
-       </tran_glyph>
-      </tran>
-      <tran trig="HUNGRY">
-       <action>uint8_t n = Q_EVT_CAST(TableEvt)-&gt;philoNum;
-/* philo ID must be in range and he must be not hungry */
-Q_ASSERT((n &lt; N_PHILO) &amp;&amp; (me-&gt;isHungry[n] == 0U));
-me-&gt;isHungry[n] = 1U;
-BSP_displayPhilStat(n, &quot;hungry  &quot;);</action>
-       <tran_glyph conn="4,60,3,-1,15">
-        <action box="0,-2,6,2"/>
-       </tran_glyph>
-      </tran>
-      <tran trig="DONE">
-       <action>uint8_t n, m;
-
-n = Q_EVT_CAST(TableEvt)-&gt;philoNum;
-/* phil ID must be in range and he must be not hungry */
-Q_ASSERT((n &lt; N_PHILO) &amp;&amp; (me-&gt;isHungry[n] == 0U));
-
-BSP_displayPhilStat(n, &quot;thinking&quot;);
-m = LEFT(n);
-/* both forks of Phil[n] must be used */
-Q_ASSERT((me-&gt;fork[n] == USED) &amp;&amp; (me-&gt;fork[m] == USED));
-
-me-&gt;fork[m] = FREE;
-me-&gt;fork[n] = FREE;</action>
-       <tran_glyph conn="4,63,3,-1,15">
-        <action box="0,-2,6,2"/>
-       </tran_glyph>
-      </tran>
-      <state_glyph node="4,45,34,20">
-       <entry box="1,2,18,4"/>
-       <exit box="1,6,18,4"/>
-      </state_glyph>
-     </state>
-     <state_glyph node="2,5,43,62"/>
-    </state>
-    <state_diagram size="49,69"/>
-   </statechart>
-  </class>
-  <attribute name="AO_Philo[N_PHILO]" type="QActive * const" visibility="0x00" properties="0x00"/>
-  <attribute name="AO_Table" type="QActive * const" visibility="0x00" properties="0x00"/>
-  <operation name="Philo_ctor" type="void" visibility="0x00" properties="0x00">
-   <code>uint8_t n;
-Philo *me;
-for (n = 0U; n &lt; N_PHILO; ++n) {
-    me = &amp;l_philo[n];
-    QActive_ctor(&amp;me-&gt;super, Q_STATE_CAST(&amp;Philo_initial));
-    QTimeEvt_ctor(&amp;me-&gt;timeEvt, TIMEOUT_SIG);
-}</code>
-  </operation>
-  <operation name="Table_ctor" type="void" visibility="0x00" properties="0x00">
-   <code>uint8_t n;
-Table *me = &amp;l_table;
-
-QActive_ctor(&amp;me-&gt;super, Q_STATE_CAST(&amp;Table_initial));
-
-for (n = 0U; n &lt; N_PHILO; ++n) {
-    me-&gt;fork[n] = FREE;
-    me-&gt;isHungry[n] = 0U;
-}</code>
-  </operation>
- </package>
- <directory name=".">
-  <file name="dpp.h">
-   <text>#ifndef dpp_h
-#define dpp_h
-
-enum DPPSignals {
-    EAT_SIG = Q_USER_SIG, /* published by Table to let a philosopher eat */
-    DONE_SIG,             /* published by Philosopher when done eating */
-    PAUSE_SIG,            /* published by BSP to pause the application */
-    TERMINATE_SIG,        /* published by BSP to terminate the application */
-    MAX_PUB_SIG,          /* the last published signal */
-
-    HUNGRY_SIG,           /* posted direclty to Table from hungry Philo */
-    MAX_SIG               /* the last signal */
-};
-
-$declare(Events::TableEvt)
-
-/* number of philosophers */
-#define N_PHILO ((uint8_t)5)
-
-
-$declare(AOs::Philo_ctor)
-$declare(AOs::Table_ctor)
-int main(int argc, char *argv[]);
-
-$declare(AOs::AO_Philo[N_PHILO])
-$declare(AOs::AO_Table)
-
-#endif                    /* dpp_h */</text>
-  </file>
-  <file name="philo.c">
-   <text>#include &quot;qp_port.h&quot;
-#include &quot;dpp.h&quot;
-#include &quot;bsp.h&quot;
-
-Q_DEFINE_THIS_FILE
-
-/* Active object class -----------------------------------------------------*/
-$declare(AOs::Philo)
-
-/* Local objects -----------------------------------------------------------*/
-static Philo l_philo[N_PHILO];   /* storage for all Philos */
-
-#define THINK_TIME  \
-    (QTimeEvtCtr)((BSP_random() % BSP_TICKS_PER_SEC) + (BSP_TICKS_PER_SEC/2U))
-#define EAT_TIME    \
-    (QTimeEvtCtr)((BSP_random() % BSP_TICKS_PER_SEC) + BSP_TICKS_PER_SEC)
-
-/* helper macro to provide the ID of Philo &quot;me_&quot; */
-#define PHILO_ID(me_)    ((uint8_t)((me_) - l_philo))
-
-enum InternalSignals {           /* internal signals */
-    TIMEOUT_SIG = MAX_SIG
-};
-
-/* Global objects ----------------------------------------------------------*/
-QActive * const AO_Philo[N_PHILO] = { /* &quot;opaque&quot; pointers to Philo AO */
-    &amp;l_philo[0].super,
-    &amp;l_philo[1].super,
-    &amp;l_philo[2].super,
-    &amp;l_philo[3].super,
-    &amp;l_philo[4].super
-};
-
-/* Philo definition --------------------------------------------------------*/
-$define(AOs::Philo_ctor)
-$define(AOs::Philo)</text>
-  </file>
-  <file name="table.c">
-   <text>#include &quot;qp_port.h&quot;
-#include &quot;dpp.h&quot;
-#include &quot;bsp.h&quot;
-
-Q_DEFINE_THIS_FILE
-
-/* Active object class -----------------------------------------------------*/
-$declare(AOs::Table)
-
-#define RIGHT(n_) ((uint8_t)(((n_) + (N_PHILO - 1U)) % N_PHILO))
-#define LEFT(n_)  ((uint8_t)(((n_) + 1U) % N_PHILO))
-#define FREE      ((uint8_t)0)
-#define USED      ((uint8_t)1)
-
-/* Local objects -----------------------------------------------------------*/
-static Table l_table; /* the single instance of the Table active object */
-
-/* Global-scope objects ----------------------------------------------------*/
-QActive * const AO_Table = &amp;l_table.super; /* &quot;opaque&quot; AO pointer */
-
-/*..........................................................................*/
-$define(AOs::Table_ctor)
-$define(AOs::Table)</text>
-  </file>
- </directory>
-</model>

+ 0 - 92
examples/android-ndk/gnu/dpp/jni/main.c

@@ -1,92 +0,0 @@
-/*****************************************************************************
-* Product: DPP example for Android
-* Last Updated for Version: 4.5.02
-* Date of the Last Update:  May 18, 2012
-*
-*                    Q u a n t u m     L e a P s
-*                    ---------------------------
-*                    innovating embedded systems
-*
-* Copyright (C) 2002-2012 Quantum Leaps, LLC. All rights reserved.
-*
-* This program is open source software: you can redistribute it and/or
-* modify it under the terms of the GNU General Public License as published
-* by the Free Software Foundation, either version 2 of the License, or
-* (at your option) any later version.
-*
-* Alternatively, this program may be distributed and modified under the
-* terms of Quantum Leaps commercial licenses, which expressly supersede
-* the GNU General Public License and are specifically designed for
-* licensees interested in retaining the proprietary status of their code.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-* GNU General Public License for more details.
-*
-* You should have received a copy of the GNU General Public License
-* along with this program. If not, see <http://www.gnu.org/licenses/>.
-*
-* Contact information:
-* Quantum Leaps Web sites: http://www.quantum-leaps.com
-*                          http://www.state-machine.com
-* e-mail:                  info@quantum-leaps.com
-*****************************************************************************/
-
-#include "qp_port.h"
-#include "dpp.h"
-#include "bsp.h"
-
-Q_DEFINE_THIS_MODULE("main")
-
-/* Local-scope objects -----------------------------------------------------*/
-static QEvt const *l_tableQueueSto[N_PHILO];
-static QEvt const *l_philoQueueSto[N_PHILO][N_PHILO];
-static QSubscrList l_subscrSto[MAX_PUB_SIG];
-
-/* storage for event pools... */
-static QF_MPOOL_EL(TableEvt) l_smlPoolSto[2U*N_PHILO];        /* small pool */
-
-
-/* application program entry point */
-int main(int argc, char *argv[]) {
-
-
-    Philo_ctor();             /* instantiate all Philosopher active objects */
-    Table_ctor();                    /* instantiate the Table active object */
-
-    QF_init();     /* initialize the framework and the underlying RT kernel */
-    BSP_init();                                       /* initialize the BSP */
-
-                                                  /* object dictionaries... */
-    QS_OBJ_DICTIONARY(l_smlPoolSto);
-    QS_OBJ_DICTIONARY(l_tableQueueSto);
-    QS_OBJ_DICTIONARY(l_philoQueueSto[0]);
-    QS_OBJ_DICTIONARY(l_philoQueueSto[1]);
-    QS_OBJ_DICTIONARY(l_philoQueueSto[2]);
-    QS_OBJ_DICTIONARY(l_philoQueueSto[3]);
-    QS_OBJ_DICTIONARY(l_philoQueueSto[4]);
-    QS_OBJ_DICTIONARY(l_philoQueueSto[5]);
-
-    QF_psInit(l_subscrSto, Q_DIM(l_subscrSto));   /* init publish-subscribe */
-
-                                               /* initialize event pools... */
-    QF_poolInit(l_smlPoolSto, sizeof(l_smlPoolSto), sizeof(l_smlPoolSto[0]));
-
-    {
-        uint8_t n;
-
-        for (n = 0U; n < N_PHILO; ++n) {     /* start the active objects... */
-            QActive_start(AO_Philo[n], (uint8_t)(n + 1U),
-                          l_philoQueueSto[n], Q_DIM(l_philoQueueSto[n]),
-                          (void *)0, 0U, (QEvt *)0);
-        }
-    }
-
-    QActive_start(AO_Table, (uint8_t)(N_PHILO + 1U),
-                  l_tableQueueSto, Q_DIM(l_tableQueueSto),
-                  (void *)0, 0U, (QEvt *)0);
-
-    QF_run();                        /* run the QF application */
-    return 0;
-}

+ 0 - 224
examples/android-ndk/gnu/dpp/jni/philo.c

@@ -1,224 +0,0 @@
-/*****************************************************************************
-* Model: dpp.qm
-* File:  ./philo.c
-*
-* This file has been generated automatically by QP Modeler (QM).
-* DO NOT EDIT THIS FILE MANUALLY.
-*
-* Please visit www.state-machine.com/qm for more information.
-*****************************************************************************/
-#include "qp_port.h"
-#include "dpp.h"
-#include "bsp.h"
-
-Q_DEFINE_THIS_FILE
-
-/* Active object class -----------------------------------------------------*/
-/* @(/2/0) .................................................................*/
-typedef struct PhiloTag {
-/* protected: */
-    QActive super;
-
-/* private: */
-    QTimeEvt timeEvt;
-} Philo;
-
-/* protected: */
-static QState Philo_initial(Philo * const me, QEvt const * const e);
-static QState Philo_active(Philo * const me, QEvt const * const e);
-static QState Philo_thinking(Philo * const me, QEvt const * const e);
-static QState Philo_hungry(Philo * const me, QEvt const * const e);
-static QState Philo_eating(Philo * const me, QEvt const * const e);
-
-
-/* Local objects -----------------------------------------------------------*/
-static Philo l_philo[N_PHILO];   /* storage for all Philos */
-
-#define THINK_TIME  \
-    (QTimeEvtCtr)((BSP_random() % BSP_TICKS_PER_SEC) + (BSP_TICKS_PER_SEC/2U))
-#define EAT_TIME    \
-    (QTimeEvtCtr)((BSP_random() % BSP_TICKS_PER_SEC) + BSP_TICKS_PER_SEC)
-
-/* helper macro to provide the ID of Philo "me_" */
-#define PHILO_ID(me_)    ((uint8_t)((me_) - l_philo))
-
-enum InternalSignals {           /* internal signals */
-    TIMEOUT_SIG = MAX_SIG
-};
-
-/* Global objects ----------------------------------------------------------*/
-QActive * const AO_Philo[N_PHILO] = { /* "opaque" pointers to Philo AO */
-    &l_philo[0].super,
-    &l_philo[1].super,
-    &l_philo[2].super,
-    &l_philo[3].super,
-    &l_philo[4].super
-};
-
-/* Philo definition --------------------------------------------------------*/
-/* @(/2/4) .................................................................*/
-void Philo_ctor(void) {
-    uint8_t n;
-    Philo *me;
-    for (n = 0U; n < N_PHILO; ++n) {
-        me = &l_philo[n];
-        QActive_ctor(&me->super, Q_STATE_CAST(&Philo_initial));
-        QTimeEvt_ctor(&me->timeEvt, TIMEOUT_SIG);
-    }
-}
-/* @(/2/0) .................................................................*/
-/* @(/2/0/1) ...............................................................*/
-/* @(/2/0/1/0) */
-static QState Philo_initial(Philo * const me, QEvt const * const e) {
-    static uint8_t registered = (uint8_t)0; /* starts off with 0, per C-standard */
-    (void)e; /* suppress the compiler warning about unused parameter */
-    if (registered == (uint8_t)0) {
-        registered = (uint8_t)1;
-
-        QS_OBJ_DICTIONARY(&l_philo[0]);
-        QS_OBJ_DICTIONARY(&l_philo[0].timeEvt);
-        QS_OBJ_DICTIONARY(&l_philo[1]);
-        QS_OBJ_DICTIONARY(&l_philo[1].timeEvt);
-        QS_OBJ_DICTIONARY(&l_philo[2]);
-        QS_OBJ_DICTIONARY(&l_philo[2].timeEvt);
-        QS_OBJ_DICTIONARY(&l_philo[3]);
-        QS_OBJ_DICTIONARY(&l_philo[3].timeEvt);
-        QS_OBJ_DICTIONARY(&l_philo[4]);
-        QS_OBJ_DICTIONARY(&l_philo[4].timeEvt);
-
-        QS_FUN_DICTIONARY(&Philo_initial);
-        QS_FUN_DICTIONARY(&Philo_thinking);
-        QS_FUN_DICTIONARY(&Philo_hungry);
-        QS_FUN_DICTIONARY(&Philo_eating);
-    }
-    QS_SIG_DICTIONARY(HUNGRY_SIG, me);  /* signal for each Philos */
-    QS_SIG_DICTIONARY(TIMEOUT_SIG, me); /* signal for each Philos */
-
-    QActive_subscribe(&me->super, EAT_SIG);
-    QActive_subscribe(&me->super, TERMINATE_SIG);
-
-    return Q_TRAN(&Philo_thinking);
-}
-/* @(/2/0/1/1) .............................................................*/
-static QState Philo_active(Philo * const me, QEvt const * const e) {
-    QState status;
-    switch (e->sig) {
-        /* @(/2/0/1/1/0) */
-        case TERMINATE_SIG: {
-            QActive_stop(&me->super);
-            status = Q_HANDLED();
-            break;
-        }
-        default: {
-            status = Q_SUPER(&QHsm_top);
-            break;
-        }
-    }
-    return status;
-}
-/* @(/2/0/1/1/1) ...........................................................*/
-static QState Philo_thinking(Philo * const me, QEvt const * const e) {
-    QState status;
-    switch (e->sig) {
-        /* @(/2/0/1/1/1) */
-        case Q_ENTRY_SIG: {
-            QTimeEvt_postIn(&me->timeEvt, &me->super, THINK_TIME);
-            status = Q_HANDLED();
-            break;
-        }
-        /* @(/2/0/1/1/1/0) */
-        case TIMEOUT_SIG: {
-            status = Q_TRAN(&Philo_hungry);
-            break;
-        }
-        /* @(/2/0/1/1/1/1) */
-        case EAT_SIG: /* intentionally fall through */
-        case DONE_SIG: {
-            /* EAT or DONE must be for other Philos than this one */
-            Q_ASSERT(Q_EVT_CAST(TableEvt)->philoNum != PHILO_ID(me));
-            status = Q_HANDLED();
-            break;
-        }
-        default: {
-            status = Q_SUPER(&Philo_active);
-            break;
-        }
-    }
-    return status;
-}
-/* @(/2/0/1/1/2) ...........................................................*/
-static QState Philo_hungry(Philo * const me, QEvt const * const e) {
-    QState status;
-    switch (e->sig) {
-        /* @(/2/0/1/1/2) */
-        case Q_ENTRY_SIG: {
-            TableEvt *pe = Q_NEW(TableEvt, HUNGRY_SIG);
-            pe->philoNum = PHILO_ID(me);
-            QACTIVE_POST(AO_Table, &pe->super, me);
-            status = Q_HANDLED();
-            break;
-        }
-        /* @(/2/0/1/1/2/0) */
-        case EAT_SIG: {
-            /* @(/2/0/1/1/2/0/0) */
-            if (Q_EVT_CAST(TableEvt)->philoNum == PHILO_ID(me)) {
-                status = Q_TRAN(&Philo_eating);
-            }
-            else {
-                status = Q_UNHANDLED();
-            }
-            break;
-        }
-        /* @(/2/0/1/1/2/1) */
-        case DONE_SIG: {
-            /* DONE must be for other Philos than this one */
-            Q_ASSERT(Q_EVT_CAST(TableEvt)->philoNum != PHILO_ID(me));
-            status = Q_HANDLED();
-            break;
-        }
-        default: {
-            status = Q_SUPER(&Philo_active);
-            break;
-        }
-    }
-    return status;
-}
-/* @(/2/0/1/1/3) ...........................................................*/
-static QState Philo_eating(Philo * const me, QEvt const * const e) {
-    QState status;
-    switch (e->sig) {
-        /* @(/2/0/1/1/3) */
-        case Q_ENTRY_SIG: {
-            QTimeEvt_postIn(&me->timeEvt, &me->super, EAT_TIME);
-            status = Q_HANDLED();
-            break;
-        }
-        /* @(/2/0/1/1/3) */
-        case Q_EXIT_SIG: {
-            TableEvt *pe = Q_NEW(TableEvt, DONE_SIG);
-            pe->philoNum = PHILO_ID(me);
-            QF_PUBLISH(&pe->super, me);
-            status = Q_HANDLED();
-            break;
-        }
-        /* @(/2/0/1/1/3/0) */
-        case TIMEOUT_SIG: {
-            status = Q_TRAN(&Philo_thinking);
-            break;
-        }
-        /* @(/2/0/1/1/3/1) */
-        case EAT_SIG: /* intentionally fall through */
-        case DONE_SIG: {
-            /* EAT or DONE must be for other Philos than this one */
-            Q_ASSERT(Q_EVT_CAST(TableEvt)->philoNum != PHILO_ID(me));
-            status = Q_HANDLED();
-            break;
-        }
-        default: {
-            status = Q_SUPER(&Philo_active);
-            break;
-        }
-    }
-    return status;
-}
-

+ 0 - 280
examples/android-ndk/gnu/dpp/jni/table.c

@@ -1,280 +0,0 @@
-/*****************************************************************************
-* Model: dpp.qm
-* File:  ./table.c
-*
-* This file has been generated automatically by QP Modeler (QM).
-* DO NOT EDIT THIS FILE MANUALLY.
-*
-* Please visit www.state-machine.com/qm for more information.
-*****************************************************************************/
-#include "qp_port.h"
-#include "dpp.h"
-#include "bsp.h"
-
-Q_DEFINE_THIS_FILE
-
-/* Active object class -----------------------------------------------------*/
-/* @(/2/1) .................................................................*/
-typedef struct TableTag {
-/* protected: */
-    QActive super;
-
-/* private: */
-    uint8_t fork[N_PHILO];
-    uint8_t isHungry[N_PHILO];
-} Table;
-
-/* protected: */
-static QState Table_initial(Table * const me, QEvt const * const e);
-static QState Table_active(Table * const me, QEvt const * const e);
-static QState Table_serving(Table * const me, QEvt const * const e);
-static QState Table_paused(Table * const me, QEvt const * const e);
-
-
-#define RIGHT(n_) ((uint8_t)(((n_) + (N_PHILO - 1U)) % N_PHILO))
-#define LEFT(n_)  ((uint8_t)(((n_) + 1U) % N_PHILO))
-#define FREE      ((uint8_t)0)
-#define USED      ((uint8_t)1)
-
-/* Local objects -----------------------------------------------------------*/
-static Table l_table; /* the single instance of the Table active object */
-
-/* Global-scope objects ----------------------------------------------------*/
-QActive * const AO_Table = &l_table.super; /* "opaque" AO pointer */
-
-/*..........................................................................*/
-/* @(/2/5) .................................................................*/
-void Table_ctor(void) {
-    uint8_t n;
-    Table *me = &l_table;
-
-    QActive_ctor(&me->super, Q_STATE_CAST(&Table_initial));
-
-    for (n = 0U; n < N_PHILO; ++n) {
-        me->fork[n] = FREE;
-        me->isHungry[n] = 0U;
-    }
-}
-/* @(/2/1) .................................................................*/
-/* @(/2/1/2) ...............................................................*/
-/* @(/2/1/2/0) */
-static QState Table_initial(Table * const me, QEvt const * const e) {
-    uint8_t n;
-    (void)e; /* suppress the compiler warning about unused parameter */
-
-    QS_OBJ_DICTIONARY(&l_table);
-    QS_FUN_DICTIONARY(&QHsm_top);
-    QS_FUN_DICTIONARY(&Table_initial);
-    QS_FUN_DICTIONARY(&Table_serving);
-
-    QS_SIG_DICTIONARY(DONE_SIG,      (void *)0); /* global signals */
-    QS_SIG_DICTIONARY(EAT_SIG,       (void *)0);
-    QS_SIG_DICTIONARY(PAUSE_SIG,     (void *)0);
-    QS_SIG_DICTIONARY(TERMINATE_SIG, (void *)0);
-
-    QS_SIG_DICTIONARY(HUNGRY_SIG,    me); /* signal just for Table */
-
-    QActive_subscribe(&me->super, DONE_SIG);
-    QActive_subscribe(&me->super, PAUSE_SIG);
-    QActive_subscribe(&me->super, TERMINATE_SIG);
-
-    for (n = 0U; n < N_PHILO; ++n) {
-        me->fork[n] = FREE;
-        me->isHungry[n] = 0U;
-        BSP_displayPhilStat(n, "thinking");
-    }
-    return Q_TRAN(&Table_serving);
-}
-/* @(/2/1/2/1) .............................................................*/
-static QState Table_active(Table * const me, QEvt const * const e) {
-    QState status;
-    switch (e->sig) {
-        /* @(/2/1/2/1/0) */
-        case TERMINATE_SIG: {
-            QActive_stop(&me->super);
-            status = Q_HANDLED();
-            break;
-        }
-        /* @(/2/1/2/1/1) */
-        case EAT_SIG: {
-            Q_ERROR();
-            status = Q_HANDLED();
-            break;
-        }
-        default: {
-            status = Q_SUPER(&QHsm_top);
-            break;
-        }
-    }
-    return status;
-}
-/* @(/2/1/2/1/2) ...........................................................*/
-static QState Table_serving(Table * const me, QEvt const * const e) {
-    QState status;
-    switch (e->sig) {
-        /* @(/2/1/2/1/2) */
-        case Q_ENTRY_SIG: {
-            uint8_t n;
-            for (n = 0U; n < N_PHILO; ++n) { /* give permissions to eat... */
-                if ((me->isHungry[n] != 0U)
-                    && (me->fork[LEFT(n)] == FREE)
-                    && (me->fork[n] == FREE))
-                {
-                    TableEvt *te;
-
-                    me->fork[LEFT(n)] = USED;
-                    me->fork[n] = USED;
-                    te = Q_NEW(TableEvt, EAT_SIG);
-                    te->philoNum = n;
-                    QF_PUBLISH(&te->super, me);
-                    me->isHungry[n] = 0U;
-                    BSP_displayPhilStat(n, "eating  ");
-                }
-            }
-            status = Q_HANDLED();
-            break;
-        }
-        /* @(/2/1/2/1/2/0) */
-        case HUNGRY_SIG: {
-            uint8_t n, m;
-
-            n = Q_EVT_CAST(TableEvt)->philoNum;
-            /* phil ID must be in range and he must be not hungry */
-            Q_ASSERT((n < N_PHILO) && (me->isHungry[n] == 0U));
-
-            BSP_displayPhilStat(n, "hungry  ");
-            m = LEFT(n);
-            /* @(/2/1/2/1/2/0/0) */
-            if ((me->fork[m] == FREE) && (me->fork[n] == FREE)) {
-                TableEvt *pe;
-                me->fork[m] = USED;
-                me->fork[n] = USED;
-                pe = Q_NEW(TableEvt, EAT_SIG);
-                pe->philoNum = n;
-                QF_PUBLISH(&pe->super, me);
-                BSP_displayPhilStat(n, "eating  ");
-                status = Q_HANDLED();
-            }
-            /* @(/2/1/2/1/2/0/1) */
-            else {
-                me->isHungry[n] = 1U;
-                status = Q_HANDLED();
-            }
-            break;
-        }
-        /* @(/2/1/2/1/2/1) */
-        case DONE_SIG: {
-            uint8_t n, m;
-            TableEvt *pe;
-
-            n = Q_EVT_CAST(TableEvt)->philoNum;
-            /* phil ID must be in range and he must be not hungry */
-            Q_ASSERT((n < N_PHILO) && (me->isHungry[n] == 0U));
-
-            BSP_displayPhilStat(n, "thinking");
-            m = LEFT(n);
-            /* both forks of Phil[n] must be used */
-            Q_ASSERT((me->fork[n] == USED) && (me->fork[m] == USED));
-
-            me->fork[m] = FREE;
-            me->fork[n] = FREE;
-            m = RIGHT(n); /* check the right neighbor */
-
-            if ((me->isHungry[m] != 0U) && (me->fork[m] == FREE)) {
-                me->fork[n] = USED;
-                me->fork[m] = USED;
-                me->isHungry[m] = 0U;
-                pe = Q_NEW(TableEvt, EAT_SIG);
-                pe->philoNum = m;
-                QF_PUBLISH(&pe->super, me);
-                BSP_displayPhilStat(m, "eating  ");
-            }
-            m = LEFT(n); /* check the left neighbor */
-            n = LEFT(m); /* left fork of the left neighbor */
-            if ((me->isHungry[m] != 0U) && (me->fork[n] == FREE)) {
-                me->fork[m] = USED;
-                me->fork[n] = USED;
-                me->isHungry[m] = 0U;
-                pe = Q_NEW(TableEvt, EAT_SIG);
-                pe->philoNum = m;
-                QF_PUBLISH(&pe->super, me);
-                BSP_displayPhilStat(m, "eating  ");
-            }
-            status = Q_HANDLED();
-            break;
-        }
-        /* @(/2/1/2/1/2/2) */
-        case EAT_SIG: {
-            Q_ERROR();
-            status = Q_HANDLED();
-            break;
-        }
-        /* @(/2/1/2/1/2/3) */
-        case PAUSE_SIG: {
-            status = Q_TRAN(&Table_paused);
-            break;
-        }
-        default: {
-            status = Q_SUPER(&Table_active);
-            break;
-        }
-    }
-    return status;
-}
-/* @(/2/1/2/1/3) ...........................................................*/
-static QState Table_paused(Table * const me, QEvt const * const e) {
-    QState status;
-    switch (e->sig) {
-        /* @(/2/1/2/1/3) */
-        case Q_ENTRY_SIG: {
-            BSP_displayPaused(1U);
-            status = Q_HANDLED();
-            break;
-        }
-        /* @(/2/1/2/1/3) */
-        case Q_EXIT_SIG: {
-            BSP_displayPaused(0U);
-            status = Q_HANDLED();
-            break;
-        }
-        /* @(/2/1/2/1/3/0) */
-        case PAUSE_SIG: {
-            status = Q_TRAN(&Table_serving);
-            break;
-        }
-        /* @(/2/1/2/1/3/1) */
-        case HUNGRY_SIG: {
-            uint8_t n = Q_EVT_CAST(TableEvt)->philoNum;
-            /* philo ID must be in range and he must be not hungry */
-            Q_ASSERT((n < N_PHILO) && (me->isHungry[n] == 0U));
-            me->isHungry[n] = 1U;
-            BSP_displayPhilStat(n, "hungry  ");
-            status = Q_HANDLED();
-            break;
-        }
-        /* @(/2/1/2/1/3/2) */
-        case DONE_SIG: {
-            uint8_t n, m;
-
-            n = Q_EVT_CAST(TableEvt)->philoNum;
-            /* phil ID must be in range and he must be not hungry */
-            Q_ASSERT((n < N_PHILO) && (me->isHungry[n] == 0U));
-
-            BSP_displayPhilStat(n, "thinking");
-            m = LEFT(n);
-            /* both forks of Phil[n] must be used */
-            Q_ASSERT((me->fork[n] == USED) && (me->fork[m] == USED));
-
-            me->fork[m] = FREE;
-            me->fork[n] = FREE;
-            status = Q_HANDLED();
-            break;
-        }
-        default: {
-            status = Q_SUPER(&Table_active);
-            break;
-        }
-    }
-    return status;
-}
-

+ 0 - 10
examples/android-ndk/gnu/dpp/local.properties

@@ -1,10 +0,0 @@
-# This file is automatically generated by Android Tools.
-# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
-#
-# This file must *NOT* be checked into Version Control Systems,
-# as it contains information specific to your local configuration.
-
-# location of the SDK. This is only used by Ant
-# For customization when using a Version Control System, please read the
-# header note.
-sdk.dir=C:\\tools\\android\\android-sdk

+ 0 - 20
examples/android-ndk/gnu/dpp/proguard-project.txt

@@ -1,20 +0,0 @@
-# To enable ProGuard in your project, edit project.properties
-# to define the proguard.config property as described in that file.
-#
-# Add project specific ProGuard rules here.
-# By default, the flags in this file are appended to flags specified
-# in ${sdk.dir}/tools/proguard/proguard-android.txt
-# You can edit the include path and order by changing the ProGuard
-# include property in project.properties.
-#
-# For more details, see
-#   http://developer.android.com/guide/developing/tools/proguard.html
-
-# Add any project specific keep options here:
-
-# If your project uses WebView with JS, uncomment the following
-# and specify the fully qualified class name to the JavaScript interface
-# class:
-#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
-#   public *;
-#}

+ 0 - 14
examples/android-ndk/gnu/dpp/project.properties

@@ -1,14 +0,0 @@
-# This file is automatically generated by Android Tools.
-# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
-#
-# This file must be checked in Version Control Systems.
-#
-# To customize properties used by the Ant build system edit
-# "ant.properties", and override values to adapt the script to your
-# project structure.
-#
-# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
-#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
-
-# Project target.
-target=android-10

binární
examples/android-ndk/gnu/dpp/res/drawable-hdpi/application_icon.png


binární
examples/android-ndk/gnu/dpp/res/drawable-ldpi/application_icon.png


binární
examples/android-ndk/gnu/dpp/res/drawable-mdpi/application_icon.png


Některé soubory nejsou zobrazeny, neboť je v těchto rozdílových datech změněno mnoho souborů