diff --git a/doxygen/Doxyfile b/doxygen/Doxyfile index 00a595de..36733c57 100644 --- a/doxygen/Doxyfile +++ b/doxygen/Doxyfile @@ -1,11 +1,11 @@ -# Doxyfile 1.8.18 +# Doxyfile 1.9.0 #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- DOXYFILE_ENCODING = UTF-8 PROJECT_NAME = "QP/C++" -PROJECT_NUMBER = "6.9.1" +PROJECT_NUMBER = "6.9.2" PROJECT_BRIEF = PROJECT_LOGO = images/header_logo_ql.png OUTPUT_DIRECTORY = @@ -26,13 +26,15 @@ JAVADOC_AUTOBRIEF = NO JAVADOC_BANNER = NO QT_AUTOBRIEF = YES MULTILINE_CPP_IS_BRIEF = YES +PYTHON_DOCSTRING = YES INHERIT_DOCS = YES SEPARATE_MEMBER_PAGES = NO TAB_SIZE = 4 ALIASES = "next{1}=
Next: @ref \1

" \ - "description=@par Description" \ - "hint=@par Hint" \ - "usage=@par Usage" \ + "description=@par Description" \ + "hint=@par Hint" \ + "usage=@par Usage" \ + "caption{1}=
\1
" \ "reqdef{2}=
@anchor \1
\1\2
" \ "reqref{1}=@ref \1 \"\1\"" \ "termdef{2}=@anchor term_\1 @par \2" \ @@ -57,6 +59,7 @@ INLINE_GROUPED_CLASSES = YES INLINE_SIMPLE_STRUCTS = YES TYPEDEF_HIDES_STRUCT = YES LOOKUP_CACHE_SIZE = 0 +NUM_PROC_THREADS = 1 #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- @@ -68,6 +71,7 @@ EXTRACT_STATIC = YES EXTRACT_LOCAL_CLASSES = YES EXTRACT_LOCAL_METHODS = NO EXTRACT_ANON_NSPACES = NO +RESOLVE_UNNAMED_PARAMS = YES HIDE_UNDOC_MEMBERS = NO HIDE_UNDOC_CLASSES = NO HIDE_FRIEND_COMPOUNDS = NO @@ -185,7 +189,6 @@ CLANG_DATABASE_PATH = # 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 @@ -326,7 +329,17 @@ PREDEFINED = Q_SPY \ QP_IMPL \ Q_UTEST \ QK_ON_CONTEXT_SW \ - QXK_ON_CONTEXT_SW + QXK_ON_CONTEXT_SW \ + QF_MAX_ACTIVE \ + QF_MAX_TICK_RATE \ + QF_MAX_EPOOL \ + QF_EVENT_SIZ_SIZE \ + QF_EQUEUE_CTR_SIZE \ + QF_MPOOL_SIZ_SIZE \ + QF_MPOOL_CTR_SIZE \ + QF_TIMEEVT_CTR_SIZE \ + QF_ACTIVE_STOP \ + QS_TIME_SIZE EXPAND_AS_DEFINED = SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- @@ -353,6 +366,8 @@ COLLABORATION_GRAPH = YES GROUP_GRAPHS = YES UML_LOOK = YES UML_LIMIT_NUM_FIELDS = 10 +DOT_UML_DETAILS = NO +DOT_WRAP_THRESHOLD = 17 TEMPLATE_RELATIONS = NO INCLUDE_GRAPH = YES INCLUDED_BY_GRAPH = YES diff --git a/doxygen/Doxyfile-CHM b/doxygen/Doxyfile-CHM index 6e59f71c..e23beba9 100644 --- a/doxygen/Doxyfile-CHM +++ b/doxygen/Doxyfile-CHM @@ -1,11 +1,11 @@ -# Doxyfile 1.8.18 +# Doxyfile 1.9.0 #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- DOXYFILE_ENCODING = UTF-8 PROJECT_NAME = "QP/C++" -PROJECT_NUMBER = "6.9.1" +PROJECT_NUMBER = "6.9.2" PROJECT_BRIEF = PROJECT_LOGO = images/header_logo_ql.png OUTPUT_DIRECTORY = @@ -26,13 +26,15 @@ JAVADOC_AUTOBRIEF = NO JAVADOC_BANNER = NO QT_AUTOBRIEF = YES MULTILINE_CPP_IS_BRIEF = YES +PYTHON_DOCSTRING = YES INHERIT_DOCS = YES SEPARATE_MEMBER_PAGES = NO TAB_SIZE = 4 ALIASES = "next{1}=
Next: @ref \1

" \ - "description=@par Description" \ - "hint=@par Hint" \ - "usage=@par Usage" \ + "description=@par Description" \ + "hint=@par Hint" \ + "usage=@par Usage" \ + "caption{1}=
\1
" \ "reqdef{2}=
@anchor \1
\1\2
" \ "reqref{1}=@ref \1 \"\1\"" \ "termdef{2}=@anchor term_\1 @par \2" \ @@ -57,6 +59,7 @@ INLINE_GROUPED_CLASSES = YES INLINE_SIMPLE_STRUCTS = YES TYPEDEF_HIDES_STRUCT = YES LOOKUP_CACHE_SIZE = 0 +NUM_PROC_THREADS = 1 #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- @@ -68,6 +71,7 @@ EXTRACT_STATIC = YES EXTRACT_LOCAL_CLASSES = YES EXTRACT_LOCAL_METHODS = NO EXTRACT_ANON_NSPACES = NO +RESOLVE_UNNAMED_PARAMS = YES HIDE_UNDOC_MEMBERS = NO HIDE_UNDOC_CLASSES = NO HIDE_FRIEND_COMPOUNDS = NO @@ -185,7 +189,6 @@ CLANG_DATABASE_PATH = # 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 @@ -326,7 +329,17 @@ PREDEFINED = Q_SPY \ QP_IMPL \ Q_UTEST \ QK_ON_CONTEXT_SW \ - QXK_ON_CONTEXT_SW + QXK_ON_CONTEXT_SW \ + QF_MAX_ACTIVE \ + QF_MAX_TICK_RATE \ + QF_MAX_EPOOL \ + QF_EVENT_SIZ_SIZE \ + QF_EQUEUE_CTR_SIZE \ + QF_MPOOL_SIZ_SIZE \ + QF_MPOOL_CTR_SIZE \ + QF_TIMEEVT_CTR_SIZE \ + QF_ACTIVE_STOP \ + QS_TIME_SIZE EXPAND_AS_DEFINED = SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- @@ -353,6 +366,8 @@ COLLABORATION_GRAPH = YES GROUP_GRAPHS = YES UML_LOOK = YES UML_LIMIT_NUM_FIELDS = 10 +DOT_UML_DETAILS = NO +DOT_WRAP_THRESHOLD = 17 TEMPLATE_RELATIONS = NO INCLUDE_GRAPH = YES INCLUDED_BY_GRAPH = YES diff --git a/doxygen/metrics.dox b/doxygen/metrics.dox index c0ff77ff..2b65ce19 100644 --- a/doxygen/metrics.dox +++ b/doxygen/metrics.dox @@ -20,13 +20,13 @@ 7 1 40 2 7 QP::QHsm::qm_tran_xp@411-417@..\include\qep.hpp 4 1 20 1 4 QP::QHsm::qm_entry@421-424@..\include\qep.hpp 4 1 20 1 4 QP::QHsm::qm_exit@427-430@..\include\qep.hpp - 4 1 19 1 4 QP::QHsm::qm_entry@433-436@..\include\qep.hpp - 4 1 19 1 4 QP::QHsm::qm_exit@439-442@..\include\qep.hpp - 4 1 20 1 4 QP::QHsm::qm_sm_exit@446-449@..\include\qep.hpp - 4 1 20 1 4 QP::QHsm::qm_super_sub@453-456@..\include\qep.hpp - 3 1 19 1 3 QP::QMsm::init@504-506@..\include\qep.hpp - 3 1 13 1 3 QP::QMsm::stateObj@516-518@..\include\qep.hpp - 3 1 10 1 3 QP::QEP::getVersion@596-598@..\include\qep.hpp + 4 1 19 1 4 QP::QHsm::qm_entry@436-439@..\include\qep.hpp + 4 1 19 1 4 QP::QHsm::qm_exit@442-445@..\include\qep.hpp + 4 1 20 1 4 QP::QHsm::qm_sm_exit@449-452@..\include\qep.hpp + 4 1 20 1 4 QP::QHsm::qm_super_sub@456-459@..\include\qep.hpp + 3 1 19 1 3 QP::QMsm::init@507-509@..\include\qep.hpp + 3 1 13 1 3 QP::QMsm::stateObj@519-521@..\include\qep.hpp + 3 1 10 1 3 QP::QEP::getVersion@604-606@..\include\qep.hpp 3 1 11 1 3 QP::QEQueue::getNFree@225-227@..\include\qequeue.hpp 3 1 11 1 3 QP::QEQueue::getNMin@240-242@..\include\qequeue.hpp 3 1 13 1 3 QP::QEQueue::isEmpty@254-256@..\include\qequeue.hpp @@ -35,11 +35,11 @@ 3 1 22 1 3 QP::QActive::setPrio@256-258@..\include\qf.hpp 1 1 10 1 1 QP::QActive::getOsObject@266-266@..\include\qf.hpp 1 1 10 1 1 QP::QActive::getThread@272-272@..\include\qf.hpp - 3 1 13 1 3 QP::QMActive::stateObj@343-345@..\include\qf.hpp - 3 1 17 1 3 QP::QTimeEvt::toActive@459-461@..\include\qf.hpp - 3 1 17 1 3 QP::QTimeEvt::toTimeEvt@464-466@..\include\qf.hpp - 3 1 10 1 3 QP::QF::getVersion@495-497@..\include\qf.hpp - 3 1 18 1 3 QP::QTicker::init@640-642@..\include\qf.hpp + 3 1 13 1 3 QP::QMActive::stateObj@348-350@..\include\qf.hpp + 3 1 17 1 3 QP::QTimeEvt::toActive@464-466@..\include\qf.hpp + 3 1 17 1 3 QP::QTimeEvt::toTimeEvt@469-471@..\include\qf.hpp + 3 1 10 1 3 QP::QF::getVersion@500-502@..\include\qf.hpp + 3 1 18 1 3 QP::QTicker::init@645-647@..\include\qf.hpp 3 1 10 1 3 QP::QK::getVersion@155-157@..\include\qk.hpp 3 1 11 1 3 QP::QMPool::getBlockSize@150-152@..\include\qmpool.hpp 3 1 11 1 3 QP::QPSet::setEmpty@81-83@..\include\qpset.hpp @@ -56,10 +56,10 @@ 8 2 70 1 8 QP::QPSet::insert@162-169@..\include\qpset.hpp 8 2 74 1 8 QP::QPSet::rmove@175-182@..\include\qpset.hpp 5 2 40 1 5 QP::QPSet::findMax@185-189@..\include\qpset.hpp - 7 1 28 1 7 QP::QS::force_cast@518-524@..\include\qs.hpp - 14 4 87 1 14 QP::QS::rxPut@583-596@..\include\qs.hpp - 6 1 51 5 6 QP::QActiveDummy::start@617-622@..\include\qs.hpp - 3 1 18 1 3 QP::QActiveDummy::init@626-628@..\include\qs.hpp + 7 1 28 1 7 QP::QS::force_cast@524-530@..\include\qs.hpp + 14 4 87 1 14 QP::QS::rxPut@589-602@..\include\qs.hpp + 6 1 51 5 6 QP::QActiveDummy::start@623-628@..\include\qs.hpp + 3 1 18 1 3 QP::QActiveDummy::init@632-634@..\include\qs.hpp 3 1 20 1 3 QP::QXThread::init@87-89@..\include\qxthread.hpp 6 1 51 5 6 QP::QXThread::start@103-108@..\include\qxthread.hpp 2 1 15 2 3 QP::QEvt@99-101@..\src\qf\qep_hsm.cpp @@ -69,16 +69,18 @@ 5 1 37 2 5 QP::QHsm::top@224-228@..\src\qf\qep_hsm.cpp 102 15 608 2 149 QP::QHsm::dispatch@242-390@..\src\qf\qep_hsm.cpp 97 15 464 2 132 QP::QHsm::hsm_tran@404-535@..\src\qf\qep_hsm.cpp - 16 3 85 1 23 QP::QHsm::isIn@550-572@..\src\qf\qep_hsm.cpp - 20 4 108 1 29 QP::QHsm::childState@593-621@..\src\qf\qep_hsm.cpp + 3 1 13 0 3 QP::QHsm::getStateHandler@539-541@..\src\qf\qep_hsm.cpp + 16 3 85 1 23 QP::QHsm::isIn@557-579@..\src\qf\qep_hsm.cpp + 20 4 108 1 29 QP::QHsm::childState@600-628@..\src\qf\qep_hsm.cpp 6 1 29 1 6 QP::QMsm::QMsm@83-88@..\src\qf\qep_msm.cpp 22 3 168 2 36 QP::QMsm::init@101-136@..\src\qf\qep_msm.cpp 113 21 661 2 166 QP::QMsm::dispatch@149-314@..\src\qf\qep_msm.cpp - 51 9 301 2 64 QP::QMsm::execTatbl_@330-393@..\src\qf\qep_msm.cpp - 21 4 116 3 28 QP::QMsm::exitToTranSource_@405-432@..\src\qf\qep_msm.cpp - 44 6 247 2 54 QP::QMsm::enterHistory_@446-499@..\src\qf\qep_msm.cpp - 13 3 59 1 14 QP::QMsm::isInState@514-527@..\src\qf\qep_msm.cpp - 21 4 90 1 28 QP::QMsm::childStateObj@544-571@..\src\qf\qep_msm.cpp + 3 1 15 0 3 QP::QMsm::getStateHandler@321-323@..\src\qf\qep_msm.cpp + 51 9 301 2 64 QP::QMsm::execTatbl_@340-403@..\src\qf\qep_msm.cpp + 21 4 116 3 28 QP::QMsm::exitToTranSource_@415-442@..\src\qf\qep_msm.cpp + 44 6 247 2 54 QP::QMsm::enterHistory_@456-509@..\src\qf\qep_msm.cpp + 13 3 59 1 14 QP::QMsm::isInState@524-537@..\src\qf\qep_msm.cpp + 21 4 90 1 28 QP::QMsm::childStateObj@554-581@..\src\qf\qep_msm.cpp 9 3 69 1 10 QP::QF::add_@79-88@..\src\qf\qf_act.cpp 10 3 80 1 12 QP::QF::remove_@103-114@..\src\qf\qf_act.cpp 7 2 63 2 7 QP::QF::bzero@129-135@..\src\qf\qf_act.cpp @@ -118,8 +120,9 @@ 4 1 41 2 4 QP::QMActive::init@68-71@..\src\qf\qf_qmact.cpp 3 1 24 1 3 QP::QMActive::init@73-75@..\src\qf\qf_qmact.cpp 3 1 32 2 3 QP::QMActive::dispatch@77-79@..\src\qf\qf_qmact.cpp - 3 1 27 1 3 QP::QMActive::isInState@81-83@..\src\qf\qf_qmact.cpp - 5 1 27 1 5 QP::QMActive::childStateObj@85-89@..\src\qf\qf_qmact.cpp + 3 1 27 1 3 QP::QMActive::isInState@82-84@..\src\qf\qf_qmact.cpp + 5 1 27 1 5 QP::QMActive::childStateObj@86-90@..\src\qf\qf_qmact.cpp + 3 1 20 0 3 QP::QMActive::getStateHandler@94-96@..\src\qf\qf_qmact.cpp 67 7 352 1 99 QP::QF::tickX_@81-179@..\src\qf\qf_time.cpp 13 3 61 1 13 QP::QF::noTimeEvtsActiveX@206-218@..\src\qf\qf_time.cpp 16 2 104 3 32 QP::QTimeEvt::QTimeEvt@231-262@..\src\qf\qf_time.cpp @@ -184,23 +187,23 @@ NLOC Avg.NLOC AvgCCN Avg.token function_cnt file -------------------------------------------------------------- 5 0.0 0.0 0.0 0 ..\include\qassert.h - 226 3.9 1.0 21.1 22 ..\include\qep.hpp + 228 3.9 1.0 21.1 22 ..\include\qep.hpp 40 3.0 1.0 11.7 3 ..\include\qequeue.hpp - 194 2.9 1.0 18.7 10 ..\include\qf.hpp + 195 2.9 1.0 18.7 10 ..\include\qf.hpp 32 3.0 1.0 10.0 1 ..\include\qk.hpp 37 3.0 1.0 11.0 1 ..\include\qmpool.hpp 1 0.0 0.0 0.0 0 ..\include\qpcpp.h 4 0.0 0.0 0.0 0 ..\include\qpcpp.hpp 72 4.3 1.4 34.8 14 ..\include\qpset.hpp - 338 7.5 1.8 46.0 4 ..\include\qs.hpp + 340 7.5 1.8 46.0 4 ..\include\qs.hpp 5 0.0 0.0 0.0 0 ..\include\qstamp.cpp 4 0.0 0.0 0.0 0 ..\include\qstamp.hpp 0 0.0 0.0 0.0 0 ..\include\qs_dummy.hpp 12 0.0 0.0 0.0 0 ..\include\qv.hpp 32 0.0 0.0 0.0 0 ..\include\qxk.hpp 66 4.5 1.0 35.5 2 ..\include\qxthread.hpp - 315 32.9 5.3 186.7 9 ..\src\qf\qep_hsm.cpp - 306 36.4 6.4 208.9 8 ..\src\qf\qep_msm.cpp + 318 29.9 4.9 169.3 10 ..\src\qf\qep_hsm.cpp + 309 32.7 5.8 187.3 9 ..\src\qf\qep_msm.cpp 62 12.5 3.5 91.8 4 ..\src\qf\qf_act.cpp 242 25.3 3.7 145.0 9 ..\src\qf\qf_actq.cpp 64 18.3 2.0 98.3 3 ..\src\qf\qf_defer.cpp @@ -209,7 +212,7 @@ NLOC Avg.NLOC AvgCCN Avg.token function_cnt file 104 47.0 9.0 315.0 2 ..\src\qf\qf_ps.cpp 11 8.0 3.0 59.0 1 ..\src\qf\qf_qact.cpp 159 30.0 4.0 151.4 5 ..\src\qf\qf_qeq.cpp - 27 3.8 1.0 28.8 6 ..\src\qf\qf_qmact.cpp + 30 3.7 1.0 27.6 7 ..\src\qf\qf_qmact.cpp 230 24.2 3.8 132.4 9 ..\src\qf\qf_time.cpp 184 18.8 4.1 120.7 9 ..\src\qk\qk.cpp 77 16.2 3.8 98.2 4 ..\src\qv\qv.cpp @@ -230,6 +233,6 @@ NLOC Avg.NLOC AvgCCN Avg.token function_cnt file ========================================================================================== Total nloc Avg.NLOC AvgCCN Avg.token Fun Cnt Warning cnt Fun Rt nloc Rt ------------------------------------------------------------------------------------------ - 4021 16.9 3.1 102.9 174 1 0.01 0.04 + 4035 16.7 3.1 101.5 177 1 0.01 0.04 @endcode */ diff --git a/doxygen/struct.dox b/doxygen/struct.dox index c56c8115..de3e4401 100644 --- a/doxygen/struct.dox +++ b/doxygen/struct.dox @@ -133,6 +133,15 @@ The Quantum Leaps Application Note Design by Contract (DbC) is a philosophy that views a software system as a set of components whose collaboration is based on precisely defined specifications of mutual obligations — the contracts. The central idea of this method is to inherently embed the contracts in the code and validate them automatically at runtime. +In C and C++, the most important aspects of DbC (the contracts) can be implemented with assertions. Assertions are increasingly popular among the developers of mission-critical software. For example, NASA requires certain density of assertions in such software. + +In the context of the QP/C++ framework, DbC provides an excellent methodology for implementing a very robust error-handling policy. Due to inversion of control so typical in all event-driven systems, the QP/C++ framework controls many more aspects of the application than a traditional RTOS. A framework is in a much better position to make sure that the application is performing correctly, rather than the application to check error codes or catch exceptions originating from the framework. + + + @section coding Coding Standard The QP/C++ framework has been developed in strict adherence to the documented Quantum Leaps Coding Standard. diff --git a/examples/qutest/blinky/test/test_blinky.py b/examples/qutest/blinky/test/test_blinky.py index 87ff26fd..f33e92a3 100644 --- a/examples/qutest/blinky/test/test_blinky.py +++ b/examples/qutest/blinky/test/test_blinky.py @@ -1,5 +1,5 @@ # test-script for QUTest unit testing harness -# see https://www.state-machine.com/qtools/html +# see https://www.state-machine.com/qtools/qutest.html def on_reset(): expect_pause() diff --git a/examples/qutest/dpp/test_philo/test_init.py b/examples/qutest/dpp/test_philo/test_init.py index 76e668a3..dc38c7a2 100644 --- a/examples/qutest/dpp/test_philo/test_init.py +++ b/examples/qutest/dpp/test_philo/test_init.py @@ -1,5 +1,5 @@ # test script for QUTest unit testing harness -# see https://www.state-machine.com/qtools/html +# see https://www.state-machine.com/qtools/qutest.html # preamble... def on_reset(): diff --git a/examples/qutest/dpp/test_table/test_init.py b/examples/qutest/dpp/test_table/test_init.py index d71c0d70..c4564c9c 100644 --- a/examples/qutest/dpp/test_table/test_init.py +++ b/examples/qutest/dpp/test_table/test_init.py @@ -1,5 +1,5 @@ # test-script for QUTest unit testing harness -# see https://www.state-machine.com/qtools/html +# see https://www.state-machine.com/qtools/qutest.html # preamble... def on_reset(): diff --git a/examples/qutest/evt_par/test/test_evt_par.py b/examples/qutest/evt_par/test/test_evt_par.py index 42b17a8d..863a9c46 100644 --- a/examples/qutest/evt_par/test/test_evt_par.py +++ b/examples/qutest/evt_par/test/test_evt_par.py @@ -1,5 +1,5 @@ # test-script for QUTest unit testing harness -# see https://www.state-machine.com/qtools/html +# see https://www.state-machine.com/qtools/qutest.html # preamble... def on_reset(): diff --git a/examples/qutest/qhsmtst/test/test_qhsm-funct.py b/examples/qutest/qhsmtst/test/test_qhsm-funct.py index f4991e9c..fc5a96f1 100644 --- a/examples/qutest/qhsmtst/test/test_qhsm-funct.py +++ b/examples/qutest/qhsmtst/test/test_qhsm-funct.py @@ -1,5 +1,5 @@ # test-script for QUTest unit testing harness -# see https://www.state-machine.com/qtools/html +# see https://www.state-machine.com/qtools/qutest.html # preamble... def on_reset(): diff --git a/examples/qutest/qhsmtst/test/test_qhsm-struct.py b/examples/qutest/qhsmtst/test/test_qhsm-struct.py index 1e73d321..f61fc1bd 100644 --- a/examples/qutest/qhsmtst/test/test_qhsm-struct.py +++ b/examples/qutest/qhsmtst/test/test_qhsm-struct.py @@ -1,5 +1,5 @@ # test-script for QUTest unit testing harness -# see https://www.state-machine.com/qtools/html +# see https://www.state-machine.com/qtools/qutest.html # preamble... def on_reset(): diff --git a/examples/qutest/qmsmtst/test/test_qmsm-funct.py b/examples/qutest/qmsmtst/test/test_qmsm-funct.py index 7ceae2d4..08ae7a8c 100644 --- a/examples/qutest/qmsmtst/test/test_qmsm-funct.py +++ b/examples/qutest/qmsmtst/test/test_qmsm-funct.py @@ -1,5 +1,5 @@ # test-script for QUTest unit testing harness -# see https://www.state-machine.com/qtools/html +# see https://www.state-machine.com/qtools/qutest.html # preamble... def on_reset(): diff --git a/examples/qutest/qmsmtst/test/test_qmsm-struct.py b/examples/qutest/qmsmtst/test/test_qmsm-struct.py index ee268ee1..317fda91 100644 --- a/examples/qutest/qmsmtst/test/test_qmsm-struct.py +++ b/examples/qutest/qmsmtst/test/test_qmsm-struct.py @@ -1,5 +1,5 @@ # test-script for QUTest unit testing harness -# see https://www.state-machine.com/qtools/html +# see https://www.state-machine.com/qtools/qutest.html # preamble... def on_reset(): diff --git a/examples/qutest/self_test/test/test_command.py b/examples/qutest/self_test/test/test_command.py index 33e225ac..1435b163 100644 --- a/examples/qutest/self_test/test/test_command.py +++ b/examples/qutest/self_test/test/test_command.py @@ -1,5 +1,5 @@ # test-script for QUTest unit testing harness -# see https://www.state-machine.com/qtools/html +# see https://www.state-machine.com/qtools/qutest.html # preamble... def on_setup(): diff --git a/examples/qutest/self_test/test/test_fp.py b/examples/qutest/self_test/test/test_fp.py index d6c14bdd..98a94fce 100644 --- a/examples/qutest/self_test/test/test_fp.py +++ b/examples/qutest/self_test/test/test_fp.py @@ -1,5 +1,5 @@ # test-script for QUTest unit testing harness -# see https://www.state-machine.com/qtools/html +# see https://www.state-machine.com/qtools/qutest.html # preamble... def on_setup(): diff --git a/examples/qutest/self_test/test/test_mem-str.py b/examples/qutest/self_test/test/test_mem-str.py index aa96c65e..defb5c57 100644 --- a/examples/qutest/self_test/test/test_mem-str.py +++ b/examples/qutest/self_test/test/test_mem-str.py @@ -1,5 +1,5 @@ # test-script for QUTest unit testing harness -# see https://www.state-machine.com/qtools/html +# see https://www.state-machine.com/qtools/qutest.html # preamble... def on_setup(): diff --git a/examples/qutest/self_test/test/test_peek-poke.py b/examples/qutest/self_test/test/test_peek-poke.py index c6c57303..826462fb 100644 --- a/examples/qutest/self_test/test/test_peek-poke.py +++ b/examples/qutest/self_test/test/test_peek-poke.py @@ -1,5 +1,5 @@ # test-script for QUTest unit testing harness -# see https://www.state-machine.com/qtools/html +# see https://www.state-machine.com/qtools/qutest.html # preamble... def on_setup(): diff --git a/examples/qutest/self_test/test/test_probe.py b/examples/qutest/self_test/test/test_probe.py index 3e7d523b..5945379f 100644 --- a/examples/qutest/self_test/test/test_probe.py +++ b/examples/qutest/self_test/test/test_probe.py @@ -1,5 +1,5 @@ # test-script for QUTest unit testing harness -# see https://www.state-machine.com/qtools/html +# see https://www.state-machine.com/qtools/qutest.html # preamble... def on_setup(): diff --git a/examples/workstation/dpp/dpp.qm b/examples/workstation/dpp/dpp.qm index fa1cf858..ffd4e177 100644 --- a/examples/workstation/dpp/dpp.qm +++ b/examples/workstation/dpp/dpp.qm @@ -50,6 +50,8 @@ if (!registered) { QS_FUN_DICTIONARY(&Philo::thinking); QS_FUN_DICTIONARY(&Philo::hungry); QS_FUN_DICTIONARY(&Philo::eating); + + QS_SIG_DICTIONARY(TIMEOUT_SIG, nullptr); // global signals } subscribe(EAT_SIG); diff --git a/examples/workstation/dpp/philo.cpp b/examples/workstation/dpp/philo.cpp index 9466a505..26eca673 100644 --- a/examples/workstation/dpp/philo.cpp +++ b/examples/workstation/dpp/philo.cpp @@ -123,6 +123,8 @@ Q_STATE_DEF(Philo, initial) { QS_FUN_DICTIONARY(&Philo::thinking); QS_FUN_DICTIONARY(&Philo::hungry); QS_FUN_DICTIONARY(&Philo::eating); + + QS_SIG_DICTIONARY(TIMEOUT_SIG, nullptr); // global signals } subscribe(EAT_SIG); diff --git a/include/qs.hpp b/include/qs.hpp index e4ac8172..270a36cb 100644 --- a/include/qs.hpp +++ b/include/qs.hpp @@ -4,13 +4,13 @@ /// @cond ///*************************************************************************** /// Last updated for version 6.9.2 -/// Last updated on 2020-12-14 +/// Last updated on 2021-01-12 /// /// Q u a n t u m L e a P s /// ------------------------ /// Modern Embedded Software /// -/// Copyright (C) 2005-2020 Quantum Leaps. All rights reserved. +/// Copyright (C) 2005-2021 Quantum Leaps. 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 @@ -391,7 +391,7 @@ public: static std::uint16_t rxGetNfree(void) noexcept; //! Put one byte into the QS RX lock-free buffer - static void rxPut(std::uint8_t const b) noexcept; + static bool rxPut(std::uint8_t const b) noexcept; //! Set the "current object" in the Target static void setCurrObj(std::uint8_t obj_kind, void *obj_ptr) noexcept; @@ -586,18 +586,21 @@ enum QSpyRxRecords : std::uint8_t { }; //! put one byte into the QS RX lock-free buffer -inline void QS::rxPut(std::uint8_t const b) noexcept { - if (rxPriv_.head != 0U) { - if ((rxPriv_.head - rxPriv_.tail) != 1U) { - rxPriv_.buf[rxPriv_.head] = b; - --rxPriv_.head; - } +inline bool QS::rxPut(std::uint8_t const b) noexcept { + QSCtr head = rxPriv_.head; + if (head != 0U) { + --head; } else { - if (rxPriv_.tail != rxPriv_.end) { - rxPriv_.buf[0] = b; - rxPriv_.head = rxPriv_.end; - } + head = rxPriv_.end; + } + if (head != rxPriv_.tail) { // buffer NOT full? + rxPriv_.buf[rxPriv_.head] = b; + rxPriv_.head = head; + return true; // byte placed in the buffer + } + else { + return false; // byte NOT placed in the buffer } } diff --git a/ports/lint-plus/lin.bat b/ports/lint-plus/lin.bat index c33e5542..9672584a 100644 --- a/ports/lint-plus/lin.bat +++ b/ports/lint-plus/lin.bat @@ -1,8 +1,8 @@ @echo off :: =========================================================================== :: Product: QP/C++ build script for PC-Lint-Plus -:: Last Updated for Version: 6.8.0 -:: Date of the Last Update: 2020-01-26 +:: Last Updated for Version: 6.9.2 +:: Date of the Last Update: 2020-12-19 :: :: Q u a n t u m L e a P s :: ------------------------ @@ -42,7 +42,7 @@ @echo. :: NOTE: adjust to for your installation directory of PC-Lint-Plus -@set PCLP=C:\tools\lint-plus\pclp32.exe +@set PCLP=C:\tools\lint-plus\windows\pclp32.exe if NOT exist "%PCLP%" ( @echo The PC-Lint-Plus toolset not found. Please adjust lin.bat diff --git a/ports/win32-qutest/vc/qp.lib.recipe b/ports/win32-qutest/vc/qp.lib.recipe deleted file mode 100644 index 02596f95..00000000 --- a/ports/win32-qutest/vc/qp.lib.recipe +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/src/qs/qs_rx.cpp b/src/qs/qs_rx.cpp index ceb98d37..3075eb19 100644 --- a/src/qs/qs_rx.cpp +++ b/src/qs/qs_rx.cpp @@ -4,13 +4,13 @@ /// @cond ///*************************************************************************** /// Last updated for version 6.9.2 -/// Last updated on 2020-12-17 +/// Last updated on 2021-01-12 /// /// Q u a n t u m L e a P s /// ------------------------ /// Modern Embedded Software /// -/// Copyright (C) 2005-2020 Quantum Leaps. All rights reserved. +/// Copyright (C) 2005-2021 Quantum Leaps. 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 @@ -245,8 +245,9 @@ void QS::rxInitBuf(std::uint8_t * const sto, { rxPriv_.buf = &sto[0]; rxPriv_.end = static_cast(static_cast(stoSize) - 1U); - rxPriv_.head = 0U; - rxPriv_.tail = 0U; + // establish empty condition + rxPriv_.head = rxPriv_.end; + rxPriv_.tail = rxPriv_.end; rxPriv_.currObj[QS::SM_OBJ] = nullptr; rxPriv_.currObj[QS::AO_OBJ] = nullptr; @@ -281,18 +282,16 @@ void QS::rxInitBuf(std::uint8_t * const sto, /// be moving, meaning that bytes can be concurrently removed from the buffer. /// std::uint16_t QS::rxGetNfree(void) noexcept { - std::uint16_t nFree; - if (rxPriv_.head == rxPriv_.tail) { - nFree = static_cast(rxPriv_.end); + QSCtr head = rxPriv_.head; + if (head == rxPriv_.tail) { // buffer empty? + return static_cast(rxPriv_.end); } - else if (rxPriv_.head < rxPriv_.tail) { - nFree = static_cast(rxPriv_.tail - rxPriv_.head); + else if (head < rxPriv_.tail) { + return static_cast(rxPriv_.end + head - rxPriv_.tail); } else { - nFree = static_cast((rxPriv_.tail + rxPriv_.end) - - rxPriv_.head); + return static_cast(head - rxPriv_.tail - 1U); } - return nFree; } //**************************************************************************** @@ -369,14 +368,16 @@ void QS::queryCurrObj(std::uint8_t obj_kind) noexcept { //**************************************************************************** void QS::rxParse(void) { - while (rxPriv_.head != rxPriv_.tail) { // QS-RX buffer not empty? - std::uint8_t b = rxPriv_.buf[rxPriv_.tail]; + QSCtr head = rxPriv_.head; + QSCtr tail = rxPriv_.tail; + while (head != tail) { // QS-RX buffer NOT empty? + std::uint8_t b = rxPriv_.buf[tail]; - if (rxPriv_.tail != 0U) { - --rxPriv_.tail; + if (tail != 0U) { + --tail; } else { - rxPriv_.tail = rxPriv_.end; + tail = rxPriv_.end; } if (l_rx.esc != 0U) { // escaped byte arrived? @@ -410,6 +411,7 @@ void QS::rxParse(void) { rxParseData_(b); } } + rxPriv_.tail = tail; } //****************************************************************************