From 9492de4ee54c4ed93a19d14d9b484d6d74c9c299 Mon Sep 17 00:00:00 2001 From: MMS Date: Wed, 16 Jun 2021 11:43:04 -0400 Subject: [PATCH] 6.9.3 QP-Arduino 6.9.3 Release date: 2021-07-16 QP/C++ 6.9.3 QP-nano 6.8.2 QM 5.1.2 --- README.md | 15 +++- .../qpcpp_sam/examples/blinky/blinky.ino | 6 +- libraries/qpcpp_sam/examples/blinky/blinky.qm | 2 +- .../qpcpp_sam/examples/blinky_bsp/blinky.hpp | 2 +- .../examples/blinky_bsp/blinky_bsp.ino | 6 +- .../examples/blinky_bsp/blinky_bsp.qm | 2 +- .../qpcpp_sam/examples/blinky_bsp/bsp.cpp | 2 +- .../qpcpp_sam/examples/blinky_bsp/bsp.hpp | 2 +- libraries/qpcpp_sam/examples/dpp_bsp/bsp.cpp | 2 +- libraries/qpcpp_sam/examples/dpp_bsp/bsp.hpp | 2 +- libraries/qpcpp_sam/examples/dpp_bsp/dpp.hpp | 2 +- .../qpcpp_sam/examples/dpp_bsp/dpp_bsp.ino | 2 +- .../qpcpp_sam/examples/dpp_bsp/dpp_bsp.qm | 2 +- .../qpcpp_sam/examples/dpp_bsp/philo.cpp | 6 +- .../qpcpp_sam/examples/dpp_bsp/table.cpp | 6 +- libraries/qpcpp_sam/library.properties | 2 +- libraries/qpcpp_sam/src/qep.hpp | 14 ++-- libraries/qpcpp_sam/src/qf.hpp | 12 ++-- libraries/qpcpp_sam/src/qf_dyn.cpp | 12 ++-- libraries/qpcpp_sam/src/qf_ps.cpp | 13 ++-- libraries/qpcpp_sam/src/qs.hpp | 11 ++- libraries/qpn_avr/examples/blinky/blinky.ino | 6 +- libraries/qpn_avr/examples/blinky/blinky.qm | 2 +- .../qpn_avr/examples/blinky_bsp/.blinky_bsp | 64 ------------------ .../qpn_avr/examples/blinky_bsp/blinky.hpp | 2 +- .../examples/blinky_bsp/blinky_bsp.ino | 6 +- .../qpn_avr/examples/blinky_bsp/blinky_bsp.qm | 2 +- libraries/qpn_avr/examples/blinky_bsp/bsp.hpp | 2 +- .../qpn_avr/examples/blinky_bsp/bsp_uno.cpp | 2 +- libraries/qpn_avr/examples/dpp/dpp.ino | 6 +- libraries/qpn_avr/examples/dpp/dpp.qm | 2 +- .../qpn_avr/examples/pelican/pelican.ino | 6 +- libraries/qpn_avr/examples/pelican/pelican.qm | 2 +- libraries/qpn_avr/library.properties | 2 +- libraries/qpn_avr/src/qepn.h | 14 ++-- libraries/qpn_avr/src/qfn_port.h | 4 +- logo_qp-arduino.png | Bin 0 -> 19772 bytes 37 files changed, 104 insertions(+), 141 deletions(-) delete mode 100644 libraries/qpn_avr/examples/blinky_bsp/.blinky_bsp create mode 100644 logo_qp-arduino.png diff --git a/README.md b/README.md index e131f53..9784835 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,5 @@ +![QP-Arduino](https://www.state-machine.com/img/logo_qp-arduino.png) + This README provides a quick overview of QP for Arduino. Please refer to the companion webiste to this project at: @@ -19,7 +21,7 @@ dialog box. Once you identify the `` folder, you simply unzip the whole `qp-_arduino-1.8.x.zip` archive to this folder. ---- -# Provided Libraries and Tools +# Provided Libraries and Examples The archive `qp-_arduino-1.8.x.zip` contains two external libraries for SAM-based Arduinos: @@ -29,11 +31,16 @@ for SAM-based Arduinos: NOTE: qpn_avr is now obsolete. It is provided for backgwards compatibility only! +---- +# Provided Tools The archive also contains the QM modeling tool for Windows - `qm` -- QM modeling tool for Windows 32/64-bit +---- +# Directories and Files + After the installation, your Arduino `` folder should look as follows: @@ -45,6 +52,12 @@ as follows: | | | +-blinky/ - Blinky example | | | | +-blinky.ino - Blinky code (generated) | | | | +-blinky.qm - Blinky model (for QM tool) + | | | +-blinky_bsp/ - Blinky example with Board Support Package + | | | | +-blinky_bsp.ino - Blinky code (generated) + | | | | +-blinky_bsp.qm - Blinky model (for QM tool) + | | | +-dpp_bsp/ - Dining Philosopher example with BSP + | | | | +-dpp_bsp.ino - DPP code (generated) + | | | | +-dpp_bsp.qm - DPP model (for QM tool) | | +-src/ - QP/C++ library source code | | | +-qpcpp.h - QP/C++ library header file | | | +-... - QP/C++ library sources diff --git a/libraries/qpcpp_sam/examples/blinky/blinky.ino b/libraries/qpcpp_sam/examples/blinky/blinky.ino index 09eb980..f51d35e 100644 --- a/libraries/qpcpp_sam/examples/blinky/blinky.ino +++ b/libraries/qpcpp_sam/examples/blinky/blinky.ino @@ -3,7 +3,7 @@ // Model: blinky.qm // File: ${.::blinky.ino} // -// This code has been generated by QM 5.1.0 . +// This code has been generated by QM 5.1.2 . // DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. // // This program is open source software: you can redistribute it and/or @@ -144,8 +144,8 @@ protected: //.$enddecl${AOs::Blinky} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ //.$skip${QP_VERSION} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv //. Check for the minimum required QP version -#if (QP_VERSION < 680U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U)) -#error qpcpp version 6.8.0 or higher required +#if (QP_VERSION < 690U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U)) +#error qpcpp version 6.9.0 or higher required #endif //.$endskip${QP_VERSION} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ //.$define${AOs::Blinky} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv diff --git a/libraries/qpcpp_sam/examples/blinky/blinky.qm b/libraries/qpcpp_sam/examples/blinky/blinky.qm index 634dfd0..31c43ce 100644 --- a/libraries/qpcpp_sam/examples/blinky/blinky.qm +++ b/libraries/qpcpp_sam/examples/blinky/blinky.qm @@ -1,5 +1,5 @@ - + This is the simple Blinky example for the Arduino DUE board. The example demonstrates: 1. One active object class "Blinky" (inside the package "AOs") diff --git a/libraries/qpcpp_sam/examples/blinky_bsp/blinky.hpp b/libraries/qpcpp_sam/examples/blinky_bsp/blinky.hpp index 210c866..e4aaf7e 100644 --- a/libraries/qpcpp_sam/examples/blinky_bsp/blinky.hpp +++ b/libraries/qpcpp_sam/examples/blinky_bsp/blinky.hpp @@ -3,7 +3,7 @@ // Model: blinky_bsp.qm // File: ${.::blinky.hpp} // -// This code has been generated by QM 5.1.0 . +// This code has been generated by QM 5.1.2 . // DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. // // This program is open source software: you can redistribute it and/or diff --git a/libraries/qpcpp_sam/examples/blinky_bsp/blinky_bsp.ino b/libraries/qpcpp_sam/examples/blinky_bsp/blinky_bsp.ino index 511836d..42e2d5c 100644 --- a/libraries/qpcpp_sam/examples/blinky_bsp/blinky_bsp.ino +++ b/libraries/qpcpp_sam/examples/blinky_bsp/blinky_bsp.ino @@ -3,7 +3,7 @@ // Model: blinky_bsp.qm // File: ${.::blinky_bsp.ino} // -// This code has been generated by QM 5.1.0 . +// This code has been generated by QM 5.1.2 . // DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. // // This program is open source software: you can redistribute it and/or @@ -62,8 +62,8 @@ protected: //.$enddecl${AOs::Blinky} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ //.$skip${QP_VERSION} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv //. Check for the minimum required QP version -#if (QP_VERSION < 680U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U)) -#error qpcpp version 6.8.0 or higher required +#if (QP_VERSION < 690U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U)) +#error qpcpp version 6.9.0 or higher required #endif //.$endskip${QP_VERSION} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ //.$define${AOs::Blinky} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv diff --git a/libraries/qpcpp_sam/examples/blinky_bsp/blinky_bsp.qm b/libraries/qpcpp_sam/examples/blinky_bsp/blinky_bsp.qm index 934ee0f..09f3694 100644 --- a/libraries/qpcpp_sam/examples/blinky_bsp/blinky_bsp.qm +++ b/libraries/qpcpp_sam/examples/blinky_bsp/blinky_bsp.qm @@ -1,5 +1,5 @@ - + This is a little more advanced Blinky example for the Arduino DUE board. The example demonstrates: 1. One active object class "Blinky" (inside the package "AOs") diff --git a/libraries/qpcpp_sam/examples/blinky_bsp/bsp.cpp b/libraries/qpcpp_sam/examples/blinky_bsp/bsp.cpp index a54df68..f0ebcae 100644 --- a/libraries/qpcpp_sam/examples/blinky_bsp/bsp.cpp +++ b/libraries/qpcpp_sam/examples/blinky_bsp/bsp.cpp @@ -3,7 +3,7 @@ // Model: blinky_bsp.qm // File: ${.::bsp.cpp} // -// This code has been generated by QM 5.1.0 . +// This code has been generated by QM 5.1.2 . // DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. // // This program is open source software: you can redistribute it and/or diff --git a/libraries/qpcpp_sam/examples/blinky_bsp/bsp.hpp b/libraries/qpcpp_sam/examples/blinky_bsp/bsp.hpp index 2151386..fb74735 100644 --- a/libraries/qpcpp_sam/examples/blinky_bsp/bsp.hpp +++ b/libraries/qpcpp_sam/examples/blinky_bsp/bsp.hpp @@ -3,7 +3,7 @@ // Model: blinky_bsp.qm // File: ${.::bsp.hpp} // -// This code has been generated by QM 5.1.0 . +// This code has been generated by QM 5.1.2 . // DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. // // This program is open source software: you can redistribute it and/or diff --git a/libraries/qpcpp_sam/examples/dpp_bsp/bsp.cpp b/libraries/qpcpp_sam/examples/dpp_bsp/bsp.cpp index 9af6cb4..e486708 100644 --- a/libraries/qpcpp_sam/examples/dpp_bsp/bsp.cpp +++ b/libraries/qpcpp_sam/examples/dpp_bsp/bsp.cpp @@ -3,7 +3,7 @@ // Model: dpp_bsp.qm // File: ${.::bsp.cpp} // -// This code has been generated by QM 5.1.0 . +// This code has been generated by QM 5.1.2 . // DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. // // This program is open source software: you can redistribute it and/or diff --git a/libraries/qpcpp_sam/examples/dpp_bsp/bsp.hpp b/libraries/qpcpp_sam/examples/dpp_bsp/bsp.hpp index 6b349ca..79bb1fa 100644 --- a/libraries/qpcpp_sam/examples/dpp_bsp/bsp.hpp +++ b/libraries/qpcpp_sam/examples/dpp_bsp/bsp.hpp @@ -3,7 +3,7 @@ // Model: dpp_bsp.qm // File: ${.::bsp.hpp} // -// This code has been generated by QM 5.1.0 . +// This code has been generated by QM 5.1.2 . // DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. // // This program is open source software: you can redistribute it and/or diff --git a/libraries/qpcpp_sam/examples/dpp_bsp/dpp.hpp b/libraries/qpcpp_sam/examples/dpp_bsp/dpp.hpp index d973382..5224a67 100644 --- a/libraries/qpcpp_sam/examples/dpp_bsp/dpp.hpp +++ b/libraries/qpcpp_sam/examples/dpp_bsp/dpp.hpp @@ -3,7 +3,7 @@ // Model: dpp_bsp.qm // File: ${.::dpp.hpp} // -// This code has been generated by QM 5.1.0 . +// This code has been generated by QM 5.1.2 . // DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. // // This program is open source software: you can redistribute it and/or diff --git a/libraries/qpcpp_sam/examples/dpp_bsp/dpp_bsp.ino b/libraries/qpcpp_sam/examples/dpp_bsp/dpp_bsp.ino index 78f54df..4d32fd8 100644 --- a/libraries/qpcpp_sam/examples/dpp_bsp/dpp_bsp.ino +++ b/libraries/qpcpp_sam/examples/dpp_bsp/dpp_bsp.ino @@ -3,7 +3,7 @@ // Model: dpp_bsp.qm // File: ${.::dpp_bsp.ino} // -// This code has been generated by QM 5.1.0 . +// This code has been generated by QM 5.1.2 . // DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. // // This program is open source software: you can redistribute it and/or diff --git a/libraries/qpcpp_sam/examples/dpp_bsp/dpp_bsp.qm b/libraries/qpcpp_sam/examples/dpp_bsp/dpp_bsp.qm index 50f015d..0f7c498 100644 --- a/libraries/qpcpp_sam/examples/dpp_bsp/dpp_bsp.qm +++ b/libraries/qpcpp_sam/examples/dpp_bsp/dpp_bsp.qm @@ -1,5 +1,5 @@ - + This is the Dining Philosopher Problem (DPP) example for the Arduino-DUE board. The example demonstrates: 1. Multiple active objects (5 Philosophers and 1 Table AO) diff --git a/libraries/qpcpp_sam/examples/dpp_bsp/philo.cpp b/libraries/qpcpp_sam/examples/dpp_bsp/philo.cpp index bc3f407..fa34fed 100644 --- a/libraries/qpcpp_sam/examples/dpp_bsp/philo.cpp +++ b/libraries/qpcpp_sam/examples/dpp_bsp/philo.cpp @@ -3,7 +3,7 @@ // Model: dpp_bsp.qm // File: ${.::philo.cpp} // -// This code has been generated by QM 5.1.0 . +// This code has been generated by QM 5.1.2 . // DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. // // This program is open source software: you can redistribute it and/or @@ -46,8 +46,8 @@ class Philo : public QP::QActive { // generate definition of the opaque pointer to the AO ----------------------- //.$skip${QP_VERSION} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv //. Check for the minimum required QP version -#if (QP_VERSION < 680U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U)) -#error qpcpp version 6.8.0 or higher required +#if (QP_VERSION < 690U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U)) +#error qpcpp version 6.9.0 or higher required #endif //.$endskip${QP_VERSION} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ //.$define${AOs::AO_Philo[N_PHILO]} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv diff --git a/libraries/qpcpp_sam/examples/dpp_bsp/table.cpp b/libraries/qpcpp_sam/examples/dpp_bsp/table.cpp index 72cce11..2000a51 100644 --- a/libraries/qpcpp_sam/examples/dpp_bsp/table.cpp +++ b/libraries/qpcpp_sam/examples/dpp_bsp/table.cpp @@ -3,7 +3,7 @@ // Model: dpp_bsp.qm // File: ${.::table.cpp} // -// This code has been generated by QM 5.1.0 . +// This code has been generated by QM 5.1.2 . // DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. // // This program is open source software: you can redistribute it and/or @@ -47,8 +47,8 @@ class Table : public QP::QActive { // generate definition of the opaque pointer to the AO ----------------------- //.$skip${QP_VERSION} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv //. Check for the minimum required QP version -#if (QP_VERSION < 680U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U)) -#error qpcpp version 6.8.0 or higher required +#if (QP_VERSION < 690U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U)) +#error qpcpp version 6.9.0 or higher required #endif //.$endskip${QP_VERSION} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ //.$define${AOs::AO_Table} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv diff --git a/libraries/qpcpp_sam/library.properties b/libraries/qpcpp_sam/library.properties index df50b29..2d967bc 100644 --- a/libraries/qpcpp_sam/library.properties +++ b/libraries/qpcpp_sam/library.properties @@ -1,5 +1,5 @@ name=QP-C++ -version=6.9.2 +version=6.9.3 author=Quantum Leaps maintainer=Quantum Leaps sentence=QP/C++ Real-Time Embedded Framework for Arduino. diff --git a/libraries/qpcpp_sam/src/qep.hpp b/libraries/qpcpp_sam/src/qep.hpp index 6e7c2da..761a29d 100644 --- a/libraries/qpcpp_sam/src/qep.hpp +++ b/libraries/qpcpp_sam/src/qep.hpp @@ -3,14 +3,14 @@ /// @ingroup qep /// @cond ///*************************************************************************** -/// Last updated for version 6.9.2 -/// Last updated on 2020-12-17 +/// Last updated for version 6.9.3 +/// Last updated on 2021-02-26 /// /// 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 @@ -43,15 +43,15 @@ //! The current QP version as a decimal constant XXYZ, where XX is a 2-digit // major version number, Y is a 1-digit minor version number, and Z is // a 1-digit release number. -#define QP_VERSION 692U +#define QP_VERSION 693U //! The current QP version number string of the form XX.Y.Z, where XX is // a 2-digit major version number, Y is a 1-digit minor version number, // and Z is a 1-digit release number. -#define QP_VERSION_STR "6.9.2" +#define QP_VERSION_STR "6.9.3" -//! Encrypted current QP release (6.9.2) and date (2021-01-18) -#define QP_RELEASE 0x82C286EBU +//! Encrypted current QP release (6.9.3) and date (2021-04-12) +#define QP_RELEASE 0x8295AA8AU //**************************************************************************** diff --git a/libraries/qpcpp_sam/src/qf.hpp b/libraries/qpcpp_sam/src/qf.hpp index b9c85a3..3665941 100644 --- a/libraries/qpcpp_sam/src/qf.hpp +++ b/libraries/qpcpp_sam/src/qf.hpp @@ -3,14 +3,14 @@ /// @ingroup qf /// @cond ///*************************************************************************** -/// Last updated for version 6.9.2 -/// Last updated on 2020-12-17 +/// Last updated for version 6.9.3 +/// Last updated on 2021-02-26 /// /// 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 @@ -536,7 +536,8 @@ class QF { #else //! Publish event to the framework. static void publish_(QEvt const * const e, - void const * const sender) noexcept; + void const * const sender, + std::uint_fast8_t const qs_id) noexcept; //! Processes all armed time events at every clock tick. static void tickX_(std::uint_fast8_t const tickRate, @@ -835,7 +836,8 @@ class QTicker : public QActive { /// unambiguously identify the publisher of the event. /// /// @sa QP::QF::publish_() - #define PUBLISH(e_, sender_) publish_((e_), (sender_)) + #define PUBLISH(e_, sender_) \ + publish_((e_), (sender_), (sender_)->getPrio()) //! Invoke the direct event posting facility QP::QActive::post_(). /// @description diff --git a/libraries/qpcpp_sam/src/qf_dyn.cpp b/libraries/qpcpp_sam/src/qf_dyn.cpp index d238f9e..66bb5e4 100644 --- a/libraries/qpcpp_sam/src/qf_dyn.cpp +++ b/libraries/qpcpp_sam/src/qf_dyn.cpp @@ -2,14 +2,14 @@ /// @brief QF/C++ dynamic event management /// @cond ///*************************************************************************** -/// Last updated for version 6.9.1 -/// Last updated on 2020-09-17 +/// Last updated for version 6.9.3 +/// Last updated on 2021-04-09 /// /// 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 @@ -90,7 +90,7 @@ void QF::poolInit(void * const poolSto, < static_cast(Q_DIM(QF_pool_))); // last initialized event size - std::uint_fast16_t const lastEvtSize = ((QF_maxPool_ ==0U) + std::uint_fast16_t const lastEvtSize = ((QF_maxPool_ == 0U) ? 0U : QF_EPOOL_EVENT_SIZE_(QF_pool_[QF_maxPool_ - 1U])); @@ -178,7 +178,9 @@ QEvt *QF::newX_(std::uint_fast16_t const evtSize, QS_END_PRE_() } else { - // must tolerate bad alloc. + // This assertion means that the event allocation failed, + // and this failure cannot be tolerated. The most frequent + // reason is an event leak in the application. Q_ASSERT_ID(320, margin != QF_NO_MARGIN); QS_BEGIN_PRE_(QS_QF_NEW_ATTEMPT, diff --git a/libraries/qpcpp_sam/src/qf_ps.cpp b/libraries/qpcpp_sam/src/qf_ps.cpp index ab7898f..b1ad29f 100644 --- a/libraries/qpcpp_sam/src/qf_ps.cpp +++ b/libraries/qpcpp_sam/src/qf_ps.cpp @@ -4,14 +4,14 @@ /// @ingroup qf /// @cond ///*************************************************************************** -/// Last updated for version 6.9.1 -/// Last updated on 2020-09-17 +/// Last updated for version 6.9.3 +/// Last updated on 2021-02-26 /// /// 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 @@ -118,7 +118,10 @@ void QF::psInit(QSubscrList * const subscrSto, #ifndef Q_SPY void QF::publish_(QEvt const * const e) noexcept { #else -void QF::publish_(QEvt const * const e, void const * const sender) noexcept { +void QF::publish_(QEvt const * const e, + void const * const sender, + std::uint_fast8_t const qs_id) noexcept +{ #endif /// @pre the published signal must be within the configured range Q_REQUIRE_ID(100, static_cast(e->sig) < QF_maxPubSignal_); @@ -126,7 +129,7 @@ void QF::publish_(QEvt const * const e, void const * const sender) noexcept { QF_CRIT_STAT_ QF_CRIT_E_(); - QS_BEGIN_NOCRIT_PRE_(QS_QF_PUBLISH, 0U) + QS_BEGIN_NOCRIT_PRE_(QS_QF_PUBLISH, qs_id) QS_TIME_PRE_(); // the timestamp QS_OBJ_PRE_(sender); // the sender object QS_SIG_PRE_(e->sig); // the signal of the event diff --git a/libraries/qpcpp_sam/src/qs.hpp b/libraries/qpcpp_sam/src/qs.hpp index e998dfd..bd066e2 100644 --- a/libraries/qpcpp_sam/src/qs.hpp +++ b/libraries/qpcpp_sam/src/qs.hpp @@ -3,8 +3,8 @@ /// @ingroup qs /// @cond ///*************************************************************************** -/// Last updated for version 6.9.2 -/// Last updated on 2021-01-14 +/// Last updated for version 6.9.3 +/// Last updated on 2021-02-26 /// /// Q u a n t u m L e a P s /// ------------------------ @@ -240,6 +240,13 @@ enum QSpyIdGroups : std::int16_t { QS_AP_IDS = 0x80 + QS_AP_ID, //!< Application-specific IDs }; +//! QS ID type for applying local filtering +struct QSpyId { + std::uint8_t m_prio; + std::uint_fast8_t getPrio(void) const noexcept { + return static_cast(m_prio); + } +}; } // namespace QP ************************************************************ diff --git a/libraries/qpn_avr/examples/blinky/blinky.ino b/libraries/qpn_avr/examples/blinky/blinky.ino index 6ea90db..8e931f3 100644 --- a/libraries/qpn_avr/examples/blinky/blinky.ino +++ b/libraries/qpn_avr/examples/blinky/blinky.ino @@ -3,7 +3,7 @@ * Model: blinky.qm * File: ${.::blinky.ino} * -* This code has been generated by QM 5.1.0 . +* This code has been generated by QM 5.1.2 . * DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. * * This program is open source software: you can redistribute it and/or @@ -114,8 +114,8 @@ Q_NORETURN Q_onAssert(char const Q_ROM * const module, int location) { // define all AO classes (state machine)... /*.$skip${QP_VERSION} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv*/ /*. Check for the minimum required QP version */ -#if (QP_VERSION < 680U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U)) -#error qpn version 6.8.0 or higher required +#if (QP_VERSION < 690U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U)) +#error qpn version 6.9.0 or higher required #endif /*.$endskip${QP_VERSION} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*/ /*.$define${AOs::Blinky} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv*/ diff --git a/libraries/qpn_avr/examples/blinky/blinky.qm b/libraries/qpn_avr/examples/blinky/blinky.qm index f2a42e8..3fab2c3 100644 --- a/libraries/qpn_avr/examples/blinky/blinky.qm +++ b/libraries/qpn_avr/examples/blinky/blinky.qm @@ -1,5 +1,5 @@ - + This is the Blinky example for the Arduino-UNO board, which blinks the on-board LED (L) once per second. The example demonstrates: 1. One active object class "Blinky" (inside the package "AOs") diff --git a/libraries/qpn_avr/examples/blinky_bsp/.blinky_bsp b/libraries/qpn_avr/examples/blinky_bsp/.blinky_bsp deleted file mode 100644 index 35faa47..0000000 --- a/libraries/qpn_avr/examples/blinky_bsp/.blinky_bsp +++ /dev/null @@ -1,64 +0,0 @@ - - - GPL - - - 1 - 0 - 3 - 0 - - - 0,0,674,300 - 0,300,674,300 - 0,600,674,300 - 0,0,1067,1299,* - - - 2032128 - 0 - - - - - 0 - - - - - 0 - - - 0 - - - - - 0 - - - 0 - - - - - 0 - - - 0 - - - - - 0 - - - 0 - - - - - 0 - - - diff --git a/libraries/qpn_avr/examples/blinky_bsp/blinky.hpp b/libraries/qpn_avr/examples/blinky_bsp/blinky.hpp index 12d07f6..065adab 100644 --- a/libraries/qpn_avr/examples/blinky_bsp/blinky.hpp +++ b/libraries/qpn_avr/examples/blinky_bsp/blinky.hpp @@ -3,7 +3,7 @@ * Model: blinky_bsp.qm * File: ${.::blinky.hpp} * -* This code has been generated by QM 5.1.0 . +* This code has been generated by QM 5.1.2 . * DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. * * This program is open source software: you can redistribute it and/or diff --git a/libraries/qpn_avr/examples/blinky_bsp/blinky_bsp.ino b/libraries/qpn_avr/examples/blinky_bsp/blinky_bsp.ino index 06f7958..2d87f14 100644 --- a/libraries/qpn_avr/examples/blinky_bsp/blinky_bsp.ino +++ b/libraries/qpn_avr/examples/blinky_bsp/blinky_bsp.ino @@ -3,7 +3,7 @@ * Model: blinky_bsp.qm * File: ${.::blinky_bsp.ino} * -* This code has been generated by QM 5.1.0 . +* This code has been generated by QM 5.1.2 . * DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. * * This program is open source software: you can redistribute it and/or @@ -49,8 +49,8 @@ void Blinky_ctor(void) { // define all AO classes (state machine)... /*.$skip${QP_VERSION} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv*/ /*. Check for the minimum required QP version */ -#if (QP_VERSION < 680U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U)) -#error qpn version 6.8.0 or higher required +#if (QP_VERSION < 690U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U)) +#error qpn version 6.9.0 or higher required #endif /*.$endskip${QP_VERSION} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*/ /*.$define${AOs::Blinky} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv*/ diff --git a/libraries/qpn_avr/examples/blinky_bsp/blinky_bsp.qm b/libraries/qpn_avr/examples/blinky_bsp/blinky_bsp.qm index 3d58b51..b1a0305 100644 --- a/libraries/qpn_avr/examples/blinky_bsp/blinky_bsp.qm +++ b/libraries/qpn_avr/examples/blinky_bsp/blinky_bsp.qm @@ -1,5 +1,5 @@ - + This is a redesign of the original Blinky example for the Arduino-UNO board, which blinks the on-board LED (L) once per second. This example demonstrates: diff --git a/libraries/qpn_avr/examples/blinky_bsp/bsp.hpp b/libraries/qpn_avr/examples/blinky_bsp/bsp.hpp index e4319aa..4d97cf2 100644 --- a/libraries/qpn_avr/examples/blinky_bsp/bsp.hpp +++ b/libraries/qpn_avr/examples/blinky_bsp/bsp.hpp @@ -3,7 +3,7 @@ * Model: blinky_bsp.qm * File: ${.::bsp.hpp} * -* This code has been generated by QM 5.1.0 . +* This code has been generated by QM 5.1.2 . * DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. * * This program is open source software: you can redistribute it and/or diff --git a/libraries/qpn_avr/examples/blinky_bsp/bsp_uno.cpp b/libraries/qpn_avr/examples/blinky_bsp/bsp_uno.cpp index 7e367dc..e4adc9f 100644 --- a/libraries/qpn_avr/examples/blinky_bsp/bsp_uno.cpp +++ b/libraries/qpn_avr/examples/blinky_bsp/bsp_uno.cpp @@ -3,7 +3,7 @@ * Model: blinky_bsp.qm * File: ${.::bsp_uno.cpp} * -* This code has been generated by QM 5.1.0 . +* This code has been generated by QM 5.1.2 . * DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. * * This program is open source software: you can redistribute it and/or diff --git a/libraries/qpn_avr/examples/dpp/dpp.ino b/libraries/qpn_avr/examples/dpp/dpp.ino index 196e706..7397263 100644 --- a/libraries/qpn_avr/examples/dpp/dpp.ino +++ b/libraries/qpn_avr/examples/dpp/dpp.ino @@ -3,7 +3,7 @@ * Model: dpp.qm * File: ${.::dpp.ino} * -* This code has been generated by QM 5.1.0 . +* This code has been generated by QM 5.1.2 . * DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. * * This program is open source software: you can redistribute it and/or @@ -210,8 +210,8 @@ Q_NORETURN Q_onAssert(char const Q_ROM * const module, int location) { // define all AO classes... /*.$skip${QP_VERSION} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv*/ /*. Check for the minimum required QP version */ -#if (QP_VERSION < 680U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U)) -#error qpn version 6.8.0 or higher required +#if (QP_VERSION < 690U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U)) +#error qpn version 6.9.0 or higher required #endif /*.$endskip${QP_VERSION} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*/ /*.$define${AOs::Philo} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv*/ diff --git a/libraries/qpn_avr/examples/dpp/dpp.qm b/libraries/qpn_avr/examples/dpp/dpp.qm index 8af3157..b64914b 100644 --- a/libraries/qpn_avr/examples/dpp/dpp.qm +++ b/libraries/qpn_avr/examples/dpp/dpp.qm @@ -1,5 +1,5 @@ - + This is the Dining Philosopher Problem (DPP) example for the Arduino-UNO board. The example demonstrates: 1. Multiple active objects (5 Philosophers and 1 Table AO) diff --git a/libraries/qpn_avr/examples/pelican/pelican.ino b/libraries/qpn_avr/examples/pelican/pelican.ino index 6965519..aa0308c 100644 --- a/libraries/qpn_avr/examples/pelican/pelican.ino +++ b/libraries/qpn_avr/examples/pelican/pelican.ino @@ -3,7 +3,7 @@ * Model: pelican.qm * File: ${.::pelican.ino} * -* This code has been generated by QM 5.1.0 . +* This code has been generated by QM 5.1.2 . * DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. * * This program is open source software: you can redistribute it and/or @@ -206,8 +206,8 @@ Q_NORETURN Q_onAssert(char const Q_ROM * const module, int location) { // define all AO classes (state machines)... /*.$skip${QP_VERSION} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv*/ /*. Check for the minimum required QP version */ -#if (QP_VERSION < 680U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U)) -#error qpn version 6.8.0 or higher required +#if (QP_VERSION < 690U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U)) +#error qpn version 6.9.0 or higher required #endif /*.$endskip${QP_VERSION} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*/ /*.$define${AOs::Pelican} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv*/ diff --git a/libraries/qpn_avr/examples/pelican/pelican.qm b/libraries/qpn_avr/examples/pelican/pelican.qm index 7ae35cb..b51c76f 100644 --- a/libraries/qpn_avr/examples/pelican/pelican.qm +++ b/libraries/qpn_avr/examples/pelican/pelican.qm @@ -1,5 +1,5 @@ - + This is the PEdestrian LIght CONtrolled (PELICAN) crossing example for the Arduino-UNO board. The example demonstrates: 1. One active object class "Pelican" (inside the package "AOs") diff --git a/libraries/qpn_avr/library.properties b/libraries/qpn_avr/library.properties index ac99cb9..7df6996 100644 --- a/libraries/qpn_avr/library.properties +++ b/libraries/qpn_avr/library.properties @@ -1,5 +1,5 @@ name=QP-nano -version=6.8.1 +version=6.9.0 author=Quantum Leaps maintainer=Quantum Leaps sentence=QP-nano Real-Time Embedded Framework for Arduino. diff --git a/libraries/qpn_avr/src/qepn.h b/libraries/qpn_avr/src/qepn.h index 9c1ec5b..99cdd0f 100644 --- a/libraries/qpn_avr/src/qepn.h +++ b/libraries/qpn_avr/src/qepn.h @@ -4,8 +4,8 @@ * @ingroup qepn * @cond ****************************************************************************** -* Last updated for version 6.8.1 -* Last updated on 2020-04-02 +* Last updated for version 6.9.0 +* Last updated on 2020-08-21 * * Q u a n t u m L e a P s * ------------------------ @@ -45,16 +45,16 @@ * major version number, Y is a 1-digit minor version number, and Z is * a 1-digit release number. */ -#define QP_VERSION 681U +#define QP_VERSION 690U /*! The current QP version number string of the form XX.Y.Z, where XX is * a 2-digit major version number, Y is a 1-digit minor version number, * and Z is a 1-digit release number. */ -#define QP_VERSION_STR "6.8.1" +#define QP_VERSION_STR "6.9.0" -/*! Encrypted current QP release (6.8.1) and date (2020-04-04) */ -#define QP_RELEASE 0x888CC416U +/*! Encrypted current QP release (6.9.0) and date (2020-08-21) */ +#define QP_RELEASE 0x884D22FDU /****************************************************************************/ @@ -93,7 +93,7 @@ typedef double float64_t; typedef uint8_t QSignal; #ifndef Q_PARAM_SIZE - /*! The size of event parameter Valid values 0, 1, 2, or 4; default 0 */ + /*! The size of event parameter Valid values 0, 1, 2, 4 or 8; default 0 */ #define Q_PARAM_SIZE 0U #endif #if (Q_PARAM_SIZE == 0U) diff --git a/libraries/qpn_avr/src/qfn_port.h b/libraries/qpn_avr/src/qfn_port.h index 4531228..bd5a9ed 100644 --- a/libraries/qpn_avr/src/qfn_port.h +++ b/libraries/qpn_avr/src/qfn_port.h @@ -3,8 +3,8 @@ * @brief QF-nano port AVR ATmega, QV-nano kernel, GNU-AVR toolset, Arduino * @cond ****************************************************************************** -* Last Updated for Version: 6.8.1a -* Date of the Last Update: 2021-01-29 +* Last Updated for Version: 6.8.2 +* Date of the Last Update: 2021-07-07 * * Q u a n t u m L e a P s * ------------------------ diff --git a/logo_qp-arduino.png b/logo_qp-arduino.png new file mode 100644 index 0000000000000000000000000000000000000000..807133d728db49cf79a1f683fcc324b898c40fb3 GIT binary patch literal 19772 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

mPc1OqZ}mJ`;|DgEUs5+$zOZ?-uK7* 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