/*! @page q_events Events
* @tableofcontents
*
* @section eventdata Retrieving the event data
* In the QuarkTS++ OS, tasks can be triggered from multiple event sources including
* time-elapsed, notifications, queues and event-flags. This can lead to several
* situations that must be handled by the application writer from the task
* context, for example:
*
* - What is the event source that triggers the task execution?
* - How to get the event-associated data?
* - What is the task execution status?
*
* The OS provides a simple approach for this, a class with all the
* regarding information of the task execution. This class, that is already
* defined in the callback function as the @ref qOS::event_t argument, is filled by the
* kernel dispatcher, so the application writer only needs to read the fields
* inside.
*
* This class has the following attributes and methods:
*  @code{.c}
*  class event_t {
*      trigger getTrigger( void );
*      void *TaskData;
*      void *EventData;
*      bool firstCall( void );
*      bool firstIteration( void );
*      bool LastIteration( void );
*      clock_t startDelay( void );
*      task& self( void );
*  };
*  @endcode
*
* Please review the @ref qOS::event_t class reference for more details.
*
*
* @section q_event_timeelapsed The Time-Elapsed event
* Running tasks at pre-determined rates is desirable in many situations, like
* sensory data acquisition, low-level servoing, control loops, action planning
* and system monitoring.
* As previously explained in @ref q_addtasks, you can schedule tasks at any interval
* your design demands, at least, if the time specification is lower than the
* scheduler tick. When an application consists of several periodic tasks with
* individual timing constraints, a few points must  be taken:
*
* - When the time interval of a certain task has elapsed, the scheduler triggers
* the @c byTimeElapsed event that put the task in a @c READY state (see
* figure below).
* - If a task has a finite number of iterations, the scheduler will disable the
* task when the number of iterations reaches the programmed value.
* - Tasks always have an inherent time lag that can be noticed even more, when
* the programmed time interval is too low (see figure below). In a real-time
* context, it is important to reduce this time lag or jitter, to an acceptable
* level for the application.
*
* @remark QuarkTS++ uses the TTA approach to trigger time-elapsed events as
* explained here @ref q_timmingapproach
* @note QuarkTS++ can generally meet a time deadline if you use lightweight code
* in the callbacks and there is a reduced pool of pending tasks, so it can be
* considered a soft real-time scheduler, however, it cannot meet a deadline
* deterministically like a hard real-time OS.
*
* <center>
* @htmlonly
* <!DOCTYPE html>
* <html>
* <head>
* <title>timeelapsed</title>
* <meta charset="utf-8"/>
* </head>
* <body><div class="mxgraph" style="max-width:100%;border:1px solid transparent;" data-mxgraph="{&quot;highlight&quot;:&quot;#0000ff&quot;,&quot;nav&quot;:true,&quot;zoom&quot;:1.45,&quot;resize&quot;:true,&quot;toolbar&quot;:&quot;zoom layers tags lightbox&quot;,&quot;edit&quot;:&quot;_blank&quot;,&quot;xml&quot;:&quot;&lt;mxfile host=\&quot;app.diagrams.net\&quot; modified=\&quot;2022-10-18T13:35:18.615Z\&quot; agent=\&quot;5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36\&quot; etag=\&quot;EeRctC5N0PFVppZPymKI\&quot; version=\&quot;20.2.2\&quot; type=\&quot;google\&quot;&gt;&lt;diagram id=\&quot;oOqhLhwujFYqv80jWMrG\&quot; name=\&quot;Página-1\&quot;&gt; &lt;/diagram&gt;&lt;/mxfile&gt;&quot;}"></div>
* <script type="text/javascript" src="https://viewer.diagrams.net/js/viewer-static.min.js"></script>
* </body>
* </html>
* @endhtmlonly
* <em>Inherent time lag</em>
* </center>
*
* - The most significant delay times are produced inside the callbacks. As
* mentioned before, use short efficient callback methods written for cooperative
* scheduling.
* - If two tasks have the same time interval, the scheduler executes first, the
* task with the highest priority value (see figure below).
*
* <center>
* @htmlonly
* <!DOCTYPE html>
* <html>
* <head>
* <title>prioschedexample</title>
* <meta charset="utf-8"/>
* </head>
* <body><div class="mxgraph" style="max-width:100%;border:1px solid transparent;" data-mxgraph="{&quot;highlight&quot;:&quot;#0000ff&quot;,&quot;nav&quot;:true,&quot;zoom&quot;:1.45,&quot;resize&quot;:true,&quot;toolbar&quot;:&quot;zoom layers tags lightbox&quot;,&quot;edit&quot;:&quot;_blank&quot;,&quot;xml&quot;:&quot;&lt;mxfile host=\&quot;app.diagrams.net\&quot; modified=\&quot;2022-10-18T13:54:32.313Z\&quot; agent=\&quot;5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36\&quot; etag=\&quot;sqcTudeh-RC4iZqWvrwE\&quot; version=\&quot;20.2.2\&quot; type=\&quot;google\&quot;&gt;&lt;diagram id=\&quot;lSolJ4cWtxMTfHfqADTA\&quot; name=\&quot;Página-1\&quot;&gt; &lt;/diagram&gt;&lt;/mxfile&gt;&quot;}"></div>
* <script type="text/javascript" src="https://viewer.diagrams.net/js/viewer-static.min.js"></script>
* </body>
* </html>
* @endhtmlonly
* <em>Priority scheduling example with three (3) tasks attached, all triggered by time-elapsed events</em>
* </center>
*
* @section q_asyncevents Asynchronous events and inter-task communication
* Applications existing in heavy environments require tasks and ISR interacting
* with each other, forcing the application to implement some event model. Here,
* we understand events, as any identifiable occurrence that has significance for
* the embedded system. As such, events include changes in hardware,
* user-generated actions or messages coming from components of the application
* itself.
*
* <center>
* @htmlonly
* <!DOCTYPE html>
* <html>
* <head>
* <title>heavycoop</title>
* <meta charset="utf-8"/>
* </head>
* <body><div class="mxgraph" style="max-width:100%;border:1px solid transparent;" data-mxgraph="{&quot;highlight&quot;:&quot;#0000ff&quot;,&quot;nav&quot;:true,&quot;zoom&quot;:1.45,&quot;resize&quot;:true,&quot;toolbar&quot;:&quot;zoom layers tags lightbox&quot;,&quot;edit&quot;:&quot;_blank&quot;,&quot;xml&quot;:&quot;&lt;mxfile host=\&quot;app.diagrams.net\&quot; modified=\&quot;2022-10-18T13:56:52.698Z\&quot; agent=\&quot;5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36\&quot; etag=\&quot;f6hQf5cA3uO1kCzOuRZq\&quot; version=\&quot;20.2.2\&quot; type=\&quot;google\&quot;&gt;&lt;diagram id=\&quot;dQCMjJpXo0cRyXTNmdZn\&quot; name=\&quot;Página-1\&quot;&gt; &lt;/diagram&gt;&lt;/mxfile&gt;&quot;}"></div>
* <script type="text/javascript" src="https://viewer.diagrams.net/js/viewer-static.min.js"></script>
* </body>
* </html>
* @endhtmlonly
* <em>Heavy cooperative environment</em>
* </center>
*
* As shown in the figure above, two main scenarios are presented, ISR-to-task and
* task-to-task interaction.
*
* When using interrupts to catch external events, it is expected to be handled
* with fast and lightweight code to reduce the variable ISR overhead introduced
* by the code itself. If too much overhead is used inside an ISR, the system
* will tend to lose future events. In some specific situations, in the interest
* of stack usage predictability and to facilitate system behavioral analysis,
* the best approach is to synchronize the ISR with a task to leave the heavy job
* in the base level instead of the interrupt level, so the interrupt handler only
* collect event data and clear the interrupt source and therefore exit promptly
* by deferring the processing of the event data to a task, this is also called
* <em>Deferred Interrupt Handling</em>.
*
* The other scenario is when a task is performing a specific job and another
* task must be awakened to perform some activities when the other task finishes.
**
* Both scenarios require some ways in which tasks can communicate with each
* other. For this, the OS does not impose any specific event processing strategy
* to the application designer but does provide features that allow the chosen
* strategy to be implemented in a simple and maintainable way. From the OS
* perspective, these features are just sources of asynchronous events with
* specific triggers and related data.
*
* The OS provides the following features for inter-task communication:
*
* @subsection q_notifications Notifications
* The notifications allow tasks to interact with other tasks and to synchronize
* with ISRs without the need of intermediate variables or separate communication
* objects. By using notifications, a task or ISR can launch another task sending
* an event and related data to the receiving task. This is depicted in the
* figure below.
*
* <center>
* @htmlonly
* <!DOCTYPE html>
* <html>
* <head>
* <title>notification</title>
* <meta charset="utf-8"/>
* </head>
* <body><div class="mxgraph" style="max-width:100%;border:1px solid transparent;" data-mxgraph="{&quot;highlight&quot;:&quot;#0000ff&quot;,&quot;nav&quot;:true,&quot;zoom&quot;:1.5,&quot;resize&quot;:true,&quot;toolbar&quot;:&quot;zoom layers tags lightbox&quot;,&quot;edit&quot;:&quot;_blank&quot;,&quot;xml&quot;:&quot;&lt;mxfile host=\&quot;app.diagrams.net\&quot; modified=\&quot;2022-10-18T14:00:10.088Z\&quot; agent=\&quot;5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36\&quot; etag=\&quot;ysBPIzVtP6O5RqbeWd5f\&quot; version=\&quot;20.2.2\&quot; type=\&quot;google\&quot;&gt;&lt;diagram id=\&quot;bzXds8BJJDB5ZaY9h85V\&quot; name=\&quot;Página-1\&quot;&gt; &lt;/diagram&gt;&lt;/mxfile&gt;&quot;}"></div>
* <script type="text/javascript" src="https://viewer.diagrams.net/js/viewer-static.min.js"></script>
* </body>
* </html>
* @endhtmlonly
* <em>A notification used to send an event directly from one task to another</em>
* </center>
*
* @subsubsection q_simplenot Simple Notifications
* Each task node has a 32-bit notification value which is initialized to zero
* when a task is added to the scheme. The method qOS::core::notify() with mode =
* qOS::notifyMode::SIMPLE with is used to send an event directly updating the
* receiving task's notification value increasing it by one. As long as the
* scheduler sees a non-zero value, the task
* will be changed to a @c READY state and eventually, the dispatcher will
* launch the task according to the execution chain. After being served, the
* notification value is later decreased.
*
* @note Sending simple notifications using qOS::core::notify() is
* interrupt-safe, however, this only catches one event per task because the
* method overwrites the associated data.
*
* @subsubsection q_queuednot Queued Notifications
* If the application notifies multiple events to the same task, queued
* notifications are the right solution instead of using simple notifications.
*
* Here, the qOS::core::notify() with mode = qOS::notifyMode::QUEUED take advantage of the
* scheduler FIFO priority-queue. This kind of queue, is somewhat similar to a
* standard queue, with an important distinction: when a notification is sent,
* the task is added  to the queue with the corresponding priority level, and
* will be later removed from the queue with the highest priority task first.
* That is, the tasks are (conceptually) stored in the queue in priority order
* instead of the insertion order. If two tasks with the same priority are
* notified, they are served in the FIFO form according to their order inside
* the queue. The figure below illustrates this behavior.
*
* <center>
* @htmlonly
* <!DOCTYPE html>
* <html>
* <head>
* <title>prioqueuebehav</title>
* <meta charset="utf-8"/>
* </head>
* <body><div class="mxgraph" style="max-width:100%;border:1px solid transparent;" data-mxgraph="{&quot;highlight&quot;:&quot;#0000ff&quot;,&quot;nav&quot;:true,&quot;zoom&quot;:1.5,&quot;resize&quot;:true,&quot;toolbar&quot;:&quot;zoom layers tags lightbox&quot;,&quot;edit&quot;:&quot;_blank&quot;,&quot;xml&quot;:&quot;&lt;mxfile host=\&quot;app.diagrams.net\&quot; modified=\&quot;2022-10-19T06:02:45.638Z\&quot; agent=\&quot;5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36\&quot; etag=\&quot;W1UZFGIu4Q-80y2Y9Taj\&quot; version=\&quot;20.2.2\&quot; type=\&quot;google\&quot;&gt;&lt;diagram id=\&quot;HkzHWOtI2eNu7o9rykcJ\&quot; name=\&quot;Página-1\&quot;&gt; &lt;/diagram&gt;&lt;/mxfile&gt;&quot;}"></div>
* <script type="text/javascript" src="https://viewer.diagrams.net/js/viewer-static.min.js"></script>
* </body>
* </html>
* @endhtmlonly
* <em>Priority-queue behavior</em>
* </center>
*
* The scheduler always checks the queue state first, being this event the one
* with more precedence among the others. If the queue has elements, the
* scheduler algorithm will extract the data and the corresponding task will be
* launched with the trigger flag set in @c byNotificationQueued.
*
* The next figure, shows a cooperative environment with five tasks. Initially,
* the scheduler activates @c Task-E, then, this task enqueues data to @c Task-A and
* @c Task-B respectively using the qOS::core::notify() using the qOS::notifyMode::QUEUED mode.
* In the next  scheduler cycle, the scheduler realizes that the priority-queue is not empty,
* generating an activation over the task located at the beginning of the queue.
* In this case, @c Task-A will be launched and its respective data will be
* extracted from the queue. However, @c Task-A also enqueues data to @c Task-C and
* @c Task-D. Following the priority-queue behavior, the scheduler makes a new
* reordering, so the next queue extraction will be for @c Task-D, @c Task-C, and
* @c Task-B sequentially.
*
* <center>
* @htmlonly
* <!DOCTYPE html>
* <html>
* <head>
* <title>notifyqueue++</title>
* <meta charset="utf-8"/>
* </head>
* <body><div class="mxgraph" style="max-width:100%;border:1px solid transparent;" data-mxgraph="{&quot;highlight&quot;:&quot;#0000ff&quot;,&quot;nav&quot;:true,&quot;resize&quot;:true,&quot;zoom&quot;:1.5,&quot;toolbar&quot;:&quot;zoom layers tags lightbox&quot;,&quot;edit&quot;:&quot;_blank&quot;,&quot;xml&quot;:&quot;&lt;mxfile host=\&quot;app.diagrams.net\&quot; modified=\&quot;2023-04-21T05:11:31.721Z\&quot; agent=\&quot;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36\&quot; etag=\&quot;ZUGLWxEBhw-KQGnyQQs3\&quot; version=\&quot;21.2.1\&quot; type=\&quot;google\&quot;&gt;\n  &lt;diagram name=\&quot;Página-1\&quot; id=\&quot;PJo4EIjOwgEw2xYhLQxk\&quot;&gt;\n    &lt;mxGraphModel dx=\&quot;615\&quot; dy=\&quot;-344\&quot; grid=\&quot;1\&quot; gridSize=\&quot;10\&quot; guides=\&quot;1\&quot; tooltips=\&quot;1\&quot; connect=\&quot;1\&quot; arrows=\&quot;1\&quot; fold=\&quot;1\&quot; page=\&quot;1\&quot; pageScale=\&quot;1\&quot; pageWidth=\&quot;1169\&quot; pageHeight=\&quot;827\&quot; math=\&quot;0\&quot; shadow=\&quot;0\&quot;&gt;\n      &lt;root&gt;\n        &lt;mxCell id=\&quot;0\&quot; /&gt;\n        &lt;mxCell id=\&quot;1\&quot; parent=\&quot;0\&quot; /&gt;\n        &lt;mxCell id=\&quot;IcMORX9sJ9LIl6OeQDrf-1\&quot; value=\&quot;\&quot; style=\&quot;rounded=0;whiteSpace=wrap;html=1;strokeColor=#999999;fillColor=none;fontFamily=Helvetica;strokeWidth=2;dashed=1;\&quot; vertex=\&quot;1\&quot; parent=\&quot;1\&quot;&gt;\n          &lt;mxGeometry x=\&quot;79.56\&quot; y=\&quot;1068.28\&quot; width=\&quot;270\&quot; height=\&quot;60\&quot; as=\&quot;geometry\&quot; /&gt;\n        &lt;/mxCell&gt;\n        &lt;mxCell id=\&quot;IcMORX9sJ9LIl6OeQDrf-2\&quot; value=\&quot;&amp;lt;b&amp;gt;&amp;lt;font color=&amp;quot;#808080&amp;quot;&amp;gt;2&amp;lt;/font&amp;gt;&amp;lt;/b&amp;gt;\&quot; style=\&quot;rounded=0;whiteSpace=wrap;html=1;strokeColor=#007FFF;fillColor=none;fontFamily=Helvetica;strokeWidth=2;\&quot; vertex=\&quot;1\&quot; parent=\&quot;1\&quot;&gt;\n          &lt;mxGeometry x=\&quot;89.56\&quot; y=\&quot;1101.56\&quot; width=\&quot;30.5\&quot; height=\&quot;16.72\&quot; as=\&quot;geometry\&quot; /&gt;\n        &lt;/mxCell&gt;\n        &lt;mxCell id=\&quot;IcMORX9sJ9LIl6OeQDrf-3\&quot; value=\&quot;D\&quot; style=\&quot;rounded=0;whiteSpace=wrap;html=1;fillColor=#CCE5FF;fontColor=#808080;strokeColor=#007FFF;fillStyle=solid;fontFamily=Helvetica;strokeWidth=2;fontStyle=1\&quot; vertex=\&quot;1\&quot; parent=\&quot;1\&quot;&gt;\n          &lt;mxGeometry x=\&quot;89.56\&quot; y=\&quot;1088.28\&quot; width=\&quot;30.5\&quot; height=\&quot;13.28\&quot; as=\&quot;geometry\&quot; /&gt;\n        &lt;/mxCell&gt;\n        &lt;mxCell id=\&quot;IcMORX9sJ9LIl6OeQDrf-4\&quot; value=\&quot;\&quot; style=\&quot;endArrow=classic;html=1;rounded=0;strokeColor=#007FFF;shadow=0;curved=1;strokeWidth=2;\&quot; edge=\&quot;1\&quot; parent=\&quot;1\&quot;&gt;\n          &lt;mxGeometry width=\&quot;50\&quot; height=\&quot;50\&quot; relative=\&quot;1\&quot; as=\&quot;geometry\&quot;&gt;\n            &lt;mxPoint x=\&quot;120.06\&quot; y=\&quot;1100.8700000000001\&quot; as=\&quot;sourcePoint\&quot; /&gt;\n            &lt;mxPoint x=\&quot;140.06\&quot; y=\&quot;1101.2100000000003\&quot; as=\&quot;targetPoint\&quot; /&gt;\n          &lt;/mxGeometry&gt;\n        &lt;/mxCell&gt;\n        &lt;mxCell id=\&quot;IcMORX9sJ9LIl6OeQDrf-5\&quot; value=\&quot;&amp;lt;b&amp;gt;&amp;lt;font color=&amp;quot;#808080&amp;quot;&amp;gt;2&amp;lt;/font&amp;gt;&amp;lt;/b&amp;gt;\&quot; style=\&quot;rounded=0;whiteSpace=wrap;html=1;strokeColor=#007FFF;fillColor=none;fontFamily=Helvetica;strokeWidth=2;\&quot; vertex=\&quot;1\&quot; parent=\&quot;1\&quot;&gt;\n          &lt;mxGeometry x=\&quot;139.56\&quot; y=\&quot;1101.56\&quot; width=\&quot;30.5\&quot; height=\&quot;16.72\&quot; as=\&quot;geometry\&quot; /&gt;\n        &lt;/mxCell&gt;\n        &lt;mxCell id=\&quot;IcMORX9sJ9LIl6OeQDrf-6\&quot; value=\&quot;E\&quot; style=\&quot;rounded=0;whiteSpace=wrap;html=1;fillColor=#CCE5FF;fontColor=#808080;strokeColor=#007FFF;fillStyle=solid;fontFamily=Helvetica;strokeWidth=2;fontStyle=1\&quot; vertex=\&quot;1\&quot; parent=\&quot;1\&quot;&gt;\n          &lt;mxGeometry x=\&quot;139.56\&quot; y=\&quot;1088.28\&quot; width=\&quot;30.5\&quot; height=\&quot;13.28\&quot; as=\&quot;geometry\&quot; /&gt;\n        &lt;/mxCell&gt;\n        &lt;mxCell id=\&quot;IcMORX9sJ9LIl6OeQDrf-7\&quot; value=\&quot;\&quot; style=\&quot;endArrow=classic;html=1;rounded=0;strokeColor=#007FFF;shadow=0;curved=1;strokeWidth=2;\&quot; edge=\&quot;1\&quot; parent=\&quot;1\&quot;&gt;\n          &lt;mxGeometry width=\&quot;50\&quot; height=\&quot;50\&quot; relative=\&quot;1\&quot; as=\&quot;geometry\&quot;&gt;\n            &lt;mxPoint x=\&quot;170.06\&quot; y=\&quot;1100.8700000000001\&quot; as=\&quot;sourcePoint\&quot; /&gt;\n            &lt;mxPoint x=\&quot;190.06\&quot; y=\&quot;1101.2100000000003\&quot; as=\&quot;targetPoint\&quot; /&gt;\n          &lt;/mxGeometry&gt;\n        &lt;/mxCell&gt;\n        &lt;mxCell id=\&quot;IcMORX9sJ9LIl6OeQDrf-8\&quot; value=\&quot;&amp;lt;b&amp;gt;&amp;lt;font color=&amp;quot;#808080&amp;quot;&amp;gt;1&amp;lt;/font&amp;gt;&amp;lt;/b&amp;gt;\&quot; style=\&quot;rounded=0;whiteSpace=wrap;html=1;strokeColor=#007FFF;fillColor=none;fontFamily=Helvetica;strokeWidth=2;\&quot; vertex=\&quot;1\&quot; parent=\&quot;1\&quot;&gt;\n          &lt;mxGeometry x=\&quot;190.06\&quot; y=\&quot;1101.56\&quot; width=\&quot;30.5\&quot; height=\&quot;16.72\&quot; as=\&quot;geometry\&quot; /&gt;\n        &lt;/mxCell&gt;\n        &lt;mxCell id=\&quot;IcMORX9sJ9LIl6OeQDrf-9\&quot; value=\&quot;A\&quot; style=\&quot;rounded=0;whiteSpace=wrap;html=1;fillColor=#CCE5FF;fontColor=#808080;strokeColor=#007FFF;fillStyle=solid;fontFamily=Helvetica;strokeWidth=2;fontStyle=1\&quot; vertex=\&quot;1\&quot; parent=\&quot;1\&quot;&gt;\n          &lt;mxGeometry x=\&quot;190.06\&quot; y=\&quot;1088.28\&quot; width=\&quot;30.5\&quot; height=\&quot;13.28\&quot; as=\&quot;geometry\&quot; /&gt;\n        &lt;/mxCell&gt;\n        &lt;mxCell id=\&quot;IcMORX9sJ9LIl6OeQDrf-10\&quot; value=\&quot;\&quot; style=\&quot;endArrow=classic;html=1;rounded=0;strokeColor=#007FFF;shadow=0;curved=1;strokeWidth=2;\&quot; edge=\&quot;1\&quot; parent=\&quot;1\&quot;&gt;\n          &lt;mxGeometry width=\&quot;50\&quot; height=\&quot;50\&quot; relative=\&quot;1\&quot; as=\&quot;geometry\&quot;&gt;\n            &lt;mxPoint x=\&quot;220.56\&quot; y=\&quot;1100.8700000000001\&quot; as=\&quot;sourcePoint\&quot; /&gt;\n            &lt;mxPoint x=\&quot;240.56\&quot; y=\&quot;1101.2100000000003\&quot; as=\&quot;targetPoint\&quot; /&gt;\n          &lt;/mxGeometry&gt;\n        &lt;/mxCell&gt;\n        &lt;mxCell id=\&quot;IcMORX9sJ9LIl6OeQDrf-11\&quot; value=\&quot;&amp;lt;b&amp;gt;&amp;lt;font color=&amp;quot;#808080&amp;quot;&amp;gt;1&amp;lt;/font&amp;gt;&amp;lt;/b&amp;gt;\&quot; style=\&quot;rounded=0;whiteSpace=wrap;html=1;strokeColor=#007FFF;fillColor=none;fontFamily=Helvetica;strokeWidth=2;\&quot; vertex=\&quot;1\&quot; parent=\&quot;1\&quot;&gt;\n          &lt;mxGeometry x=\&quot;238.68\&quot; y=\&quot;1101.56\&quot; width=\&quot;30.5\&quot; height=\&quot;16.72\&quot; as=\&quot;geometry\&quot; /&gt;\n        &lt;/mxCell&gt;\n        &lt;mxCell id=\&quot;IcMORX9sJ9LIl6OeQDrf-12\&quot; value=\&quot;C\&quot; style=\&quot;rounded=0;whiteSpace=wrap;html=1;fillColor=#CCE5FF;fontColor=#808080;strokeColor=#007FFF;fillStyle=solid;fontFamily=Helvetica;strokeWidth=2;fontStyle=1\&quot; vertex=\&quot;1\&quot; parent=\&quot;1\&quot;&gt;\n          &lt;mxGeometry x=\&quot;238.68\&quot; y=\&quot;1088.28\&quot; width=\&quot;30.5\&quot; height=\&quot;13.28\&quot; as=\&quot;geometry\&quot; /&gt;\n        &lt;/mxCell&gt;\n        &lt;mxCell id=\&quot;IcMORX9sJ9LIl6OeQDrf-13\&quot; value=\&quot;\&quot; style=\&quot;endArrow=classic;html=1;rounded=0;strokeColor=#007FFF;shadow=0;curved=1;strokeWidth=2;\&quot; edge=\&quot;1\&quot; parent=\&quot;1\&quot;&gt;\n          &lt;mxGeometry width=\&quot;50\&quot; height=\&quot;50\&quot; relative=\&quot;1\&quot; as=\&quot;geometry\&quot;&gt;\n            &lt;mxPoint x=\&quot;269.18\&quot; y=\&quot;1100.8700000000001\&quot; as=\&quot;sourcePoint\&quot; /&gt;\n            &lt;mxPoint x=\&quot;289.18\&quot; y=\&quot;1101.2100000000003\&quot; as=\&quot;targetPoint\&quot; /&gt;\n          &lt;/mxGeometry&gt;\n        &lt;/mxCell&gt;\n        &lt;mxCell id=\&quot;IcMORX9sJ9LIl6OeQDrf-14\&quot; value=\&quot;&amp;lt;b&amp;gt;&amp;lt;font color=&amp;quot;#808080&amp;quot;&amp;gt;0&amp;lt;/font&amp;gt;&amp;lt;/b&amp;gt;\&quot; style=\&quot;rounded=0;whiteSpace=wrap;html=1;strokeColor=#007FFF;fillColor=none;fontFamily=Helvetica;strokeWidth=2;\&quot; vertex=\&quot;1\&quot; parent=\&quot;1\&quot;&gt;\n          &lt;mxGeometry x=\&quot;289.18\&quot; y=\&quot;1101.56\&quot; width=\&quot;30.5\&quot; height=\&quot;16.72\&quot; as=\&quot;geometry\&quot; /&gt;\n        &lt;/mxCell&gt;\n        &lt;mxCell id=\&quot;IcMORX9sJ9LIl6OeQDrf-15\&quot; value=\&quot;B\&quot; style=\&quot;rounded=0;whiteSpace=wrap;html=1;fillColor=#CCE5FF;fontColor=#808080;strokeColor=#007FFF;fillStyle=solid;fontFamily=Helvetica;strokeWidth=2;fontStyle=1\&quot; vertex=\&quot;1\&quot; parent=\&quot;1\&quot;&gt;\n          &lt;mxGeometry x=\&quot;289.18\&quot; y=\&quot;1088.28\&quot; width=\&quot;30.5\&quot; height=\&quot;13.28\&quot; as=\&quot;geometry\&quot; /&gt;\n        &lt;/mxCell&gt;\n        &lt;mxCell id=\&quot;IcMORX9sJ9LIl6OeQDrf-16\&quot; value=\&quot;\&quot; style=\&quot;endArrow=baseDash;html=1;rounded=0;strokeColor=#007FFF;shadow=0;curved=1;strokeWidth=2;endFill=0;\&quot; edge=\&quot;1\&quot; parent=\&quot;1\&quot;&gt;\n          &lt;mxGeometry width=\&quot;50\&quot; height=\&quot;50\&quot; relative=\&quot;1\&quot; as=\&quot;geometry\&quot;&gt;\n            &lt;mxPoint x=\&quot;319.68\&quot; y=\&quot;1100.8700000000001\&quot; as=\&quot;sourcePoint\&quot; /&gt;\n            &lt;mxPoint x=\&quot;339.68\&quot; y=\&quot;1101.2100000000003\&quot; as=\&quot;targetPoint\&quot; /&gt;\n          &lt;/mxGeometry&gt;\n        &lt;/mxCell&gt;\n        &lt;mxCell id=\&quot;IcMORX9sJ9LIl6OeQDrf-17\&quot; value=\&quot;current task scheme\&quot; style=\&quot;text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;shadow=1;fontColor=#808080;fontFamily=Helvetica;rounded=0;strokeWidth=2;fontStyle=0\&quot; vertex=\&quot;1\&quot; parent=\&quot;1\&quot;&gt;\n          &lt;mxGeometry x=\&quot;90.56\&quot; y=\&quot;1068.28\&quot; width=\&quot;130\&quot; height=\&quot;20\&quot; as=\&quot;geometry\&quot; /&gt;\n        &lt;/mxCell&gt;\n        &lt;mxCell id=\&quot;IcMORX9sJ9LIl6OeQDrf-18\&quot; value=\&quot;E\&quot; style=\&quot;rounded=0;whiteSpace=wrap;html=1;fillColor=#CCE5FF;fontColor=#808080;strokeColor=#007FFF;fillStyle=solid;fontFamily=Helvetica;strokeWidth=2;fontStyle=1\&quot; vertex=\&quot;1\&quot; parent=\&quot;1\&quot;&gt;\n          &lt;mxGeometry x=\&quot;20\&quot; y=\&quot;1152.28\&quot; width=\&quot;220\&quot; height=\&quot;13.28\&quot; as=\&quot;geometry\&quot; /&gt;\n        &lt;/mxCell&gt;\n        &lt;mxCell id=\&quot;IcMORX9sJ9LIl6OeQDrf-19\&quot; value=\&quot;A\&quot; style=\&quot;rounded=0;whiteSpace=wrap;html=1;strokeColor=#808080;fillColor=#E6E6E6;fontFamily=Helvetica;strokeWidth=2;fontColor=#808080;fontStyle=1;fontSize=10;\&quot; vertex=\&quot;1\&quot; parent=\&quot;1\&quot;&gt;\n          &lt;mxGeometry x=\&quot;282.06\&quot; y=\&quot;1152.28\&quot; width=\&quot;20\&quot; height=\&quot;20\&quot; as=\&quot;geometry\&quot; /&gt;\n        &lt;/mxCell&gt;\n        &lt;mxCell id=\&quot;IcMORX9sJ9LIl6OeQDrf-20\&quot; value=\&quot;B\&quot; style=\&quot;rounded=0;whiteSpace=wrap;html=1;strokeColor=#808080;fillColor=#E6E6E6;fontFamily=Helvetica;strokeWidth=2;fontColor=#808080;fontStyle=1;fontSize=10;\&quot; vertex=\&quot;1\&quot; parent=\&quot;1\&quot;&gt;\n          &lt;mxGeometry x=\&quot;302.06\&quot; y=\&quot;1152.28\&quot; width=\&quot;20\&quot; height=\&quot;20\&quot; as=\&quot;geometry\&quot; /&gt;\n        &lt;/mxCell&gt;\n        &lt;mxCell id=\&quot;IcMORX9sJ9LIl6OeQDrf-21\&quot; value=\&quot;\&quot; style=\&quot;rounded=0;whiteSpace=wrap;html=1;strokeColor=#808080;fillColor=none;fontFamily=Helvetica;strokeWidth=2;fontColor=#808080;fontStyle=1;fontSize=10;\&quot; vertex=\&quot;1\&quot; parent=\&quot;1\&quot;&gt;\n          &lt;mxGeometry x=\&quot;322.06\&quot; y=\&quot;1152.28\&quot; width=\&quot;20\&quot; height=\&quot;20\&quot; as=\&quot;geometry\&quot; /&gt;\n        &lt;/mxCell&gt;\n        &lt;mxCell id=\&quot;IcMORX9sJ9LIl6OeQDrf-22\&quot; value=\&quot;\&quot; style=\&quot;rounded=0;whiteSpace=wrap;html=1;strokeColor=#808080;fillColor=none;fontFamily=Helvetica;strokeWidth=2;fontColor=#808080;fontStyle=1;fontSize=10;\&quot; vertex=\&quot;1\&quot; parent=\&quot;1\&quot;&gt;\n          &lt;mxGeometry x=\&quot;342.06\&quot; y=\&quot;1152.28\&quot; width=\&quot;20\&quot; height=\&quot;20\&quot; as=\&quot;geometry\&quot; /&gt;\n        &lt;/mxCell&gt;\n        &lt;mxCell id=\&quot;IcMORX9sJ9LIl6OeQDrf-23\&quot; value=\&quot;\&quot; style=\&quot;rounded=0;whiteSpace=wrap;html=1;strokeColor=#808080;fillColor=none;fontFamily=Helvetica;strokeWidth=2;fontColor=#808080;fontStyle=1;fontSize=10;\&quot; vertex=\&quot;1\&quot; parent=\&quot;1\&quot;&gt;\n          &lt;mxGeometry x=\&quot;362.06\&quot; y=\&quot;1152.28\&quot; width=\&quot;20\&quot; height=\&quot;20\&quot; as=\&quot;geometry\&quot; /&gt;\n        &lt;/mxCell&gt;\n        &lt;mxCell id=\&quot;IcMORX9sJ9LIl6OeQDrf-24\&quot; value=\&quot;A\&quot; style=\&quot;rounded=0;whiteSpace=wrap;html=1;fillColor=#CCE5FF;fontColor=#808080;strokeColor=#007FFF;fillStyle=solid;fontFamily=Helvetica;strokeWidth=2;fontStyle=1\&quot; vertex=\&quot;1\&quot; parent=\&quot;1\&quot;&gt;\n          &lt;mxGeometry x=\&quot;20\&quot; y=\&quot;1222.28\&quot; width=\&quot;222.06\&quot; height=\&quot;13.28\&quot; as=\&quot;geometry\&quot; /&gt;\n        &lt;/mxCell&gt;\n        &lt;mxCell id=\&quot;IcMORX9sJ9LIl6OeQDrf-25\&quot; value=\&quot;D\&quot; style=\&quot;rounded=0;whiteSpace=wrap;html=1;strokeColor=#808080;fillColor=#E6E6E6;fontFamily=Helvetica;strokeWidth=2;fontColor=#808080;fontStyle=1;fontSize=10;\&quot; vertex=\&quot;1\&quot; parent=\&quot;1\&quot;&gt;\n          &lt;mxGeometry x=\&quot;282.06\&quot; y=\&quot;1222.28\&quot; width=\&quot;20\&quot; height=\&quot;20\&quot; as=\&quot;geometry\&quot; /&gt;\n        &lt;/mxCell&gt;\n        &lt;mxCell id=\&quot;IcMORX9sJ9LIl6OeQDrf-26\&quot; value=\&quot;C\&quot; style=\&quot;rounded=0;whiteSpace=wrap;html=1;strokeColor=#808080;fillColor=#E6E6E6;fontFamily=Helvetica;strokeWidth=2;fontColor=#808080;fontStyle=1;fontSize=10;\&quot; vertex=\&quot;1\&quot; parent=\&quot;1\&quot;&gt;\n          &lt;mxGeometry x=\&quot;302.06\&quot; y=\&quot;1222.28\&quot; width=\&quot;20\&quot; height=\&quot;20\&quot; as=\&quot;geometry\&quot; /&gt;\n        &lt;/mxCell&gt;\n        &lt;mxCell id=\&quot;IcMORX9sJ9LIl6OeQDrf-27\&quot; value=\&quot;\&quot; style=\&quot;rounded=0;whiteSpace=wrap;html=1;strokeColor=#808080;fillColor=none;fontFamily=Helvetica;strokeWidth=2;fontColor=#808080;fontStyle=1;fontSize=10;\&quot; vertex=\&quot;1\&quot; parent=\&quot;1\&quot;&gt;\n          &lt;mxGeometry x=\&quot;342.06\&quot; y=\&quot;1222.28\&quot; width=\&quot;20\&quot; height=\&quot;20\&quot; as=\&quot;geometry\&quot; /&gt;\n        &lt;/mxCell&gt;\n        &lt;mxCell id=\&quot;IcMORX9sJ9LIl6OeQDrf-28\&quot; value=\&quot;\&quot; style=\&quot;rounded=0;whiteSpace=wrap;html=1;strokeColor=#808080;fillColor=none;fontFamily=Helvetica;strokeWidth=2;fontColor=#808080;fontStyle=1;fontSize=10;\&quot; vertex=\&quot;1\&quot; parent=\&quot;1\&quot;&gt;\n          &lt;mxGeometry x=\&quot;362.06\&quot; y=\&quot;1222.28\&quot; width=\&quot;20\&quot; height=\&quot;20\&quot; as=\&quot;geometry\&quot; /&gt;\n        &lt;/mxCell&gt;\n        &lt;mxCell id=\&quot;IcMORX9sJ9LIl6OeQDrf-29\&quot; value=\&quot;B\&quot; style=\&quot;rounded=0;whiteSpace=wrap;html=1;strokeColor=#808080;fillColor=#E6E6E6;fontFamily=Helvetica;strokeWidth=2;fontColor=#808080;fontStyle=1;fontSize=10;\&quot; vertex=\&quot;1\&quot; parent=\&quot;1\&quot;&gt;\n          &lt;mxGeometry x=\&quot;322.06\&quot; y=\&quot;1222.28\&quot; width=\&quot;20\&quot; height=\&quot;20\&quot; as=\&quot;geometry\&quot; /&gt;\n        &lt;/mxCell&gt;\n        &lt;mxCell id=\&quot;IcMORX9sJ9LIl6OeQDrf-30\&quot; value=\&quot;\&quot; style=\&quot;rounded=0;whiteSpace=wrap;html=1;strokeColor=#007FFF;fillColor=none;fontFamily=Lucida Console;strokeWidth=2;fontStyle=0;fontSize=8;align=center;\&quot; vertex=\&quot;1\&quot; parent=\&quot;1\&quot;&gt;\n          &lt;mxGeometry x=\&quot;211.56\&quot; y=\&quot;1300.56\&quot; width=\&quot;30.5\&quot; height=\&quot;11.72\&quot; as=\&quot;geometry\&quot; /&gt;\n        &lt;/mxCell&gt;\n        &lt;mxCell id=\&quot;IcMORX9sJ9LIl6OeQDrf-31\&quot; value=\&quot;D\&quot; style=\&quot;rounded=0;whiteSpace=wrap;html=1;fillColor=#CCE5FF;fontColor=#808080;strokeColor=#007FFF;fillStyle=solid;fontFamily=Helvetica;strokeWidth=2;fontStyle=1\&quot; vertex=\&quot;1\&quot; parent=\&quot;1\&quot;&gt;\n          &lt;mxGeometry x=\&quot;211.56\&quot; y=\&quot;1287.28\&quot; width=\&quot;30.5\&quot; height=\&quot;13.28\&quot; as=\&quot;geometry\&quot; /&gt;\n        &lt;/mxCell&gt;\n        &lt;mxCell id=\&quot;IcMORX9sJ9LIl6OeQDrf-32\&quot; value=\&quot;C\&quot; style=\&quot;rounded=0;whiteSpace=wrap;html=1;strokeColor=#808080;fillColor=#E6E6E6;fontFamily=Helvetica;strokeWidth=2;fontColor=#808080;fontStyle=1;fontSize=10;\&quot; vertex=\&quot;1\&quot; parent=\&quot;1\&quot;&gt;\n          &lt;mxGeometry x=\&quot;282.06\&quot; y=\&quot;1283.92\&quot; width=\&quot;20\&quot; height=\&quot;20\&quot; as=\&quot;geometry\&quot; /&gt;\n        &lt;/mxCell&gt;\n        &lt;mxCell id=\&quot;IcMORX9sJ9LIl6OeQDrf-33\&quot; value=\&quot;B\&quot; style=\&quot;rounded=0;whiteSpace=wrap;html=1;strokeColor=#808080;fillColor=#E6E6E6;fontFamily=Helvetica;strokeWidth=2;fontColor=#808080;fontStyle=1;fontSize=10;\&quot; vertex=\&quot;1\&quot; parent=\&quot;1\&quot;&gt;\n          &lt;mxGeometry x=\&quot;302.06\&quot; y=\&quot;1283.92\&quot; width=\&quot;20\&quot; height=\&quot;20\&quot; as=\&quot;geometry\&quot; /&gt;\n        &lt;/mxCell&gt;\n        &lt;mxCell id=\&quot;IcMORX9sJ9LIl6OeQDrf-34\&quot; value=\&quot;\&quot; style=\&quot;rounded=0;whiteSpace=wrap;html=1;strokeColor=#808080;fillColor=none;fontFamily=Helvetica;strokeWidth=2;fontColor=#808080;fontStyle=1;fontSize=10;\&quot; vertex=\&quot;1\&quot; parent=\&quot;1\&quot;&gt;\n          &lt;mxGeometry x=\&quot;342.06\&quot; y=\&quot;1283.92\&quot; width=\&quot;20\&quot; height=\&quot;20\&quot; as=\&quot;geometry\&quot; /&gt;\n        &lt;/mxCell&gt;\n        &lt;mxCell id=\&quot;IcMORX9sJ9LIl6OeQDrf-35\&quot; value=\&quot;\&quot; style=\&quot;rounded=0;whiteSpace=wrap;html=1;strokeColor=#808080;fillColor=none;fontFamily=Helvetica;strokeWidth=2;fontColor=#808080;fontStyle=1;fontSize=10;\&quot; vertex=\&quot;1\&quot; parent=\&quot;1\&quot;&gt;\n          &lt;mxGeometry x=\&quot;362.06\&quot; y=\&quot;1283.92\&quot; width=\&quot;20\&quot; height=\&quot;20\&quot; as=\&quot;geometry\&quot; /&gt;\n        &lt;/mxCell&gt;\n        &lt;mxCell id=\&quot;IcMORX9sJ9LIl6OeQDrf-36\&quot; value=\&quot;\&quot; style=\&quot;rounded=0;whiteSpace=wrap;html=1;strokeColor=#007FFF;fillColor=none;fontFamily=Lucida Console;strokeWidth=2;fontStyle=0;fontSize=8;align=center;\&quot; vertex=\&quot;1\&quot; parent=\&quot;1\&quot;&gt;\n          &lt;mxGeometry x=\&quot;211.56\&quot; y=\&quot;1348.92\&quot; width=\&quot;30.5\&quot; height=\&quot;13.36\&quot; as=\&quot;geometry\&quot; /&gt;\n        &lt;/mxCell&gt;\n        &lt;mxCell id=\&quot;IcMORX9sJ9LIl6OeQDrf-37\&quot; value=\&quot;C\&quot; style=\&quot;rounded=0;whiteSpace=wrap;html=1;fillColor=#CCE5FF;fontColor=#808080;strokeColor=#007FFF;fillStyle=solid;fontFamily=Helvetica;strokeWidth=2;fontStyle=1\&quot; vertex=\&quot;1\&quot; parent=\&quot;1\&quot;&gt;\n          &lt;mxGeometry x=\&quot;211.56\&quot; y=\&quot;1335.6399999999999\&quot; width=\&quot;30.5\&quot; height=\&quot;13.28\&quot; as=\&quot;geometry\&quot; /&gt;\n        &lt;/mxCell&gt;\n        &lt;mxCell id=\&quot;IcMORX9sJ9LIl6OeQDrf-38\&quot; value=\&quot;B\&quot; style=\&quot;rounded=0;whiteSpace=wrap;html=1;strokeColor=#808080;fillColor=#E6E6E6;fontFamily=Helvetica;strokeWidth=2;fontColor=#808080;fontStyle=1;fontSize=10;\&quot; vertex=\&quot;1\&quot; parent=\&quot;1\&quot;&gt;\n          &lt;mxGeometry x=\&quot;282.06\&quot; y=\&quot;1332.28\&quot; width=\&quot;20\&quot; height=\&quot;20\&quot; as=\&quot;geometry\&quot; /&gt;\n        &lt;/mxCell&gt;\n        &lt;mxCell id=\&quot;IcMORX9sJ9LIl6OeQDrf-39\&quot; value=\&quot;\&quot; style=\&quot;rounded=0;whiteSpace=wrap;html=1;strokeColor=#808080;fillColor=none;fontFamily=Helvetica;strokeWidth=2;fontColor=#808080;fontStyle=1;fontSize=10;\&quot; vertex=\&quot;1\&quot; parent=\&quot;1\&quot;&gt;\n          &lt;mxGeometry x=\&quot;342.06\&quot; y=\&quot;1332.28\&quot; width=\&quot;20\&quot; height=\&quot;20\&quot; as=\&quot;geometry\&quot; /&gt;\n        &lt;/mxCell&gt;\n        &lt;mxCell id=\&quot;IcMORX9sJ9LIl6OeQDrf-40\&quot; value=\&quot;\&quot; style=\&quot;rounded=0;whiteSpace=wrap;html=1;strokeColor=#808080;fillColor=none;fontFamily=Helvetica;strokeWidth=2;fontColor=#808080;fontStyle=1;fontSize=10;\&quot; vertex=\&quot;1\&quot; parent=\&quot;1\&quot;&gt;\n          &lt;mxGeometry x=\&quot;362.06\&quot; y=\&quot;1332.28\&quot; width=\&quot;20\&quot; height=\&quot;20\&quot; as=\&quot;geometry\&quot; /&gt;\n        &lt;/mxCell&gt;\n        &lt;mxCell id=\&quot;IcMORX9sJ9LIl6OeQDrf-41\&quot; value=\&quot;\&quot; style=\&quot;rounded=0;whiteSpace=wrap;html=1;strokeColor=#808080;fillColor=none;fontFamily=Helvetica;strokeWidth=2;fontColor=#808080;fontStyle=1;fontSize=10;\&quot; vertex=\&quot;1\&quot; parent=\&quot;1\&quot;&gt;\n          &lt;mxGeometry x=\&quot;322.06\&quot; y=\&quot;1283.92\&quot; width=\&quot;20\&quot; height=\&quot;20\&quot; as=\&quot;geometry\&quot; /&gt;\n        &lt;/mxCell&gt;\n        &lt;mxCell id=\&quot;IcMORX9sJ9LIl6OeQDrf-42\&quot; value=\&quot;\&quot; style=\&quot;rounded=0;whiteSpace=wrap;html=1;strokeColor=#808080;fillColor=none;fontFamily=Helvetica;strokeWidth=2;fontColor=#808080;fontStyle=1;fontSize=10;\&quot; vertex=\&quot;1\&quot; parent=\&quot;1\&quot;&gt;\n          &lt;mxGeometry x=\&quot;301.56\&quot; y=\&quot;1332.28\&quot; width=\&quot;20\&quot; height=\&quot;20\&quot; as=\&quot;geometry\&quot; /&gt;\n        &lt;/mxCell&gt;\n        &lt;mxCell id=\&quot;IcMORX9sJ9LIl6OeQDrf-43\&quot; value=\&quot;\&quot; style=\&quot;rounded=0;whiteSpace=wrap;html=1;strokeColor=#808080;fillColor=none;fontFamily=Helvetica;strokeWidth=2;fontColor=#808080;fontStyle=1;fontSize=10;\&quot; vertex=\&quot;1\&quot; parent=\&quot;1\&quot;&gt;\n          &lt;mxGeometry x=\&quot;322.06\&quot; y=\&quot;1332.28\&quot; width=\&quot;20\&quot; height=\&quot;20\&quot; as=\&quot;geometry\&quot; /&gt;\n        &lt;/mxCell&gt;\n        &lt;mxCell id=\&quot;IcMORX9sJ9LIl6OeQDrf-44\&quot; value=\&quot;\&quot; style=\&quot;rounded=0;whiteSpace=wrap;html=1;strokeColor=#007FFF;fillColor=none;fontFamily=Lucida Console;strokeWidth=2;fontStyle=0;fontSize=8;align=center;\&quot; vertex=\&quot;1\&quot; parent=\&quot;1\&quot;&gt;\n          &lt;mxGeometry x=\&quot;211.18\&quot; y=\&quot;1398.92\&quot; width=\&quot;30.5\&quot; height=\&quot;13.36\&quot; as=\&quot;geometry\&quot; /&gt;\n        &lt;/mxCell&gt;\n        &lt;mxCell id=\&quot;IcMORX9sJ9LIl6OeQDrf-45\&quot; value=\&quot;B\&quot; style=\&quot;rounded=0;whiteSpace=wrap;html=1;fillColor=#CCE5FF;fontColor=#808080;strokeColor=#007FFF;fillStyle=solid;fontFamily=Helvetica;strokeWidth=2;fontStyle=1\&quot; vertex=\&quot;1\&quot; parent=\&quot;1\&quot;&gt;\n          &lt;mxGeometry x=\&quot;211.18\&quot; y=\&quot;1385.6399999999999\&quot; width=\&quot;30.5\&quot; height=\&quot;13.28\&quot; as=\&quot;geometry\&quot; /&gt;\n        &lt;/mxCell&gt;\n        &lt;mxCell id=\&quot;IcMORX9sJ9LIl6OeQDrf-46\&quot; value=\&quot;\&quot; style=\&quot;rounded=0;whiteSpace=wrap;html=1;strokeColor=#808080;fillColor=none;fontFamily=Helvetica;strokeWidth=2;fontColor=#808080;fontStyle=1;fontSize=10;\&quot; vertex=\&quot;1\&quot; parent=\&quot;1\&quot;&gt;\n          &lt;mxGeometry x=\&quot;341.68\&quot; y=\&quot;1382.28\&quot; width=\&quot;20\&quot; height=\&quot;20\&quot; as=\&quot;geometry\&quot; /&gt;\n        &lt;/mxCell&gt;\n        &lt;mxCell id=\&quot;IcMORX9sJ9LIl6OeQDrf-47\&quot; value=\&quot;\&quot; style=\&quot;rounded=0;whiteSpace=wrap;html=1;strokeColor=#808080;fillColor=none;fontFamily=Helvetica;strokeWidth=2;fontColor=#808080;fontStyle=1;fontSize=10;\&quot; vertex=\&quot;1\&quot; parent=\&quot;1\&quot;&gt;\n          &lt;mxGeometry x=\&quot;361.68\&quot; y=\&quot;1382.28\&quot; width=\&quot;20\&quot; height=\&quot;20\&quot; as=\&quot;geometry\&quot; /&gt;\n        &lt;/mxCell&gt;\n        &lt;mxCell id=\&quot;IcMORX9sJ9LIl6OeQDrf-48\&quot; value=\&quot;\&quot; style=\&quot;rounded=0;whiteSpace=wrap;html=1;strokeColor=#808080;fillColor=none;fontFamily=Helvetica;strokeWidth=2;fontColor=#808080;fontStyle=1;fontSize=10;\&quot; vertex=\&quot;1\&quot; parent=\&quot;1\&quot;&gt;\n          &lt;mxGeometry x=\&quot;301.18\&quot; y=\&quot;1382.28\&quot; width=\&quot;20\&quot; height=\&quot;20\&quot; as=\&quot;geometry\&quot; /&gt;\n        &lt;/mxCell&gt;\n        &lt;mxCell id=\&quot;IcMORX9sJ9LIl6OeQDrf-49\&quot; value=\&quot;\&quot; style=\&quot;rounded=0;whiteSpace=wrap;html=1;strokeColor=#808080;fillColor=none;fontFamily=Helvetica;strokeWidth=2;fontColor=#808080;fontStyle=1;fontSize=10;\&quot; vertex=\&quot;1\&quot; parent=\&quot;1\&quot;&gt;\n          &lt;mxGeometry x=\&quot;321.68\&quot; y=\&quot;1382.28\&quot; width=\&quot;20\&quot; height=\&quot;20\&quot; as=\&quot;geometry\&quot; /&gt;\n        &lt;/mxCell&gt;\n        &lt;mxCell id=\&quot;IcMORX9sJ9LIl6OeQDrf-50\&quot; value=\&quot;\&quot; style=\&quot;rounded=0;whiteSpace=wrap;html=1;strokeColor=#808080;fillColor=none;fontFamily=Helvetica;strokeWidth=2;fontColor=#808080;fontStyle=1;fontSize=10;\&quot; vertex=\&quot;1\&quot; parent=\&quot;1\&quot;&gt;\n          &lt;mxGeometry x=\&quot;281.18\&quot; y=\&quot;1382.28\&quot; width=\&quot;20\&quot; height=\&quot;20\&quot; as=\&quot;geometry\&quot; /&gt;\n        &lt;/mxCell&gt;\n        &lt;mxCell id=\&quot;IcMORX9sJ9LIl6OeQDrf-51\&quot; value=\&quot;triggered by a simple notification from an ISR\&quot; style=\&quot;text;strokeColor=none;fillColor=none;align=right;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;shadow=1;fontColor=#808080;fontFamily=Helvetica;rounded=0;strokeWidth=2;fontStyle=2;fontSize=10;\&quot; vertex=\&quot;1\&quot; parent=\&quot;1\&quot;&gt;\n          &lt;mxGeometry x=\&quot;32.56\&quot; y=\&quot;1132.28\&quot; width=\&quot;210\&quot; height=\&quot;20\&quot; as=\&quot;geometry\&quot; /&gt;\n        &lt;/mxCell&gt;\n        &lt;mxCell id=\&quot;IcMORX9sJ9LIl6OeQDrf-52\&quot; value=\&quot;triggered by a dequeued notification\&quot; style=\&quot;text;strokeColor=none;fillColor=none;align=right;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;shadow=1;fontColor=#808080;fontFamily=Helvetica;rounded=0;strokeWidth=2;fontStyle=2;fontSize=10;\&quot; vertex=\&quot;1\&quot; parent=\&quot;1\&quot;&gt;\n          &lt;mxGeometry x=\&quot;31.560000000000002\&quot; y=\&quot;1202.28\&quot; width=\&quot;210\&quot; height=\&quot;20\&quot; as=\&quot;geometry\&quot; /&gt;\n        &lt;/mxCell&gt;\n        &lt;mxCell id=\&quot;IcMORX9sJ9LIl6OeQDrf-53\&quot; value=\&quot;triggered by a dequeued notification\&quot; style=\&quot;text;strokeColor=none;fillColor=none;align=right;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;shadow=1;fontColor=#808080;fontFamily=Helvetica;rounded=0;strokeWidth=2;fontStyle=2;fontSize=10;\&quot; vertex=\&quot;1\&quot; parent=\&quot;1\&quot;&gt;\n          &lt;mxGeometry x=\&quot;71.56\&quot; y=\&quot;1267.28\&quot; width=\&quot;171\&quot; height=\&quot;20\&quot; as=\&quot;geometry\&quot; /&gt;\n        &lt;/mxCell&gt;\n        &lt;mxCell id=\&quot;IcMORX9sJ9LIl6OeQDrf-54\&quot; value=\&quot;triggered by a dequeued notification\&quot; style=\&quot;text;strokeColor=none;fillColor=none;align=right;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;shadow=1;fontColor=#808080;fontFamily=Helvetica;rounded=0;strokeWidth=2;fontStyle=2;fontSize=10;\&quot; vertex=\&quot;1\&quot; parent=\&quot;1\&quot;&gt;\n          &lt;mxGeometry x=\&quot;71.56\&quot; y=\&quot;1315.6399999999999\&quot; width=\&quot;171\&quot; height=\&quot;20\&quot; as=\&quot;geometry\&quot; /&gt;\n        &lt;/mxCell&gt;\n        &lt;mxCell id=\&quot;IcMORX9sJ9LIl6OeQDrf-55\&quot; value=\&quot;triggered by a dequeued notification\&quot; style=\&quot;text;strokeColor=none;fillColor=none;align=right;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;shadow=1;fontColor=#808080;fontFamily=Helvetica;rounded=0;strokeWidth=2;fontStyle=2;fontSize=10;\&quot; vertex=\&quot;1\&quot; parent=\&quot;1\&quot;&gt;\n          &lt;mxGeometry x=\&quot;71.56\&quot; y=\&quot;1365.6399999999999\&quot; width=\&quot;171\&quot; height=\&quot;20\&quot; as=\&quot;geometry\&quot; /&gt;\n        &lt;/mxCell&gt;\n        &lt;mxCell id=\&quot;IcMORX9sJ9LIl6OeQDrf-56\&quot; value=\&quot;\&quot; style=\&quot;endArrow=blockThin;html=1;rounded=0;shadow=0;fontFamily=Lucida Console;fontSize=10;fontColor=#B3B3B3;strokeColor=#808080;strokeWidth=2;startArrow=none;startFill=0;endFill=1;entryX=0.442;entryY=1.117;entryDx=0;entryDy=0;entryPerimeter=0;exitX=1;exitY=0.848;exitDx=0;exitDy=0;exitPerimeter=0;\&quot; edge=\&quot;1\&quot; parent=\&quot;1\&quot; source=\&quot;IcMORX9sJ9LIl6OeQDrf-60\&quot;&gt;\n          &lt;mxGeometry width=\&quot;50\&quot; height=\&quot;50\&quot; relative=\&quot;1\&quot; as=\&quot;geometry\&quot;&gt;\n            &lt;mxPoint x=\&quot;270\&quot; y=\&quot;1190\&quot; as=\&quot;sourcePoint\&quot; /&gt;\n            &lt;mxPoint x=\&quot;290.90000000000003\&quot; y=\&quot;1173.62\&quot; as=\&quot;targetPoint\&quot; /&gt;\n            &lt;Array as=\&quot;points\&quot;&gt;\n              &lt;mxPoint x=\&quot;290.56\&quot; y=\&quot;1191.28\&quot; /&gt;\n            &lt;/Array&gt;\n          &lt;/mxGeometry&gt;\n        &lt;/mxCell&gt;\n        &lt;mxCell id=\&quot;IcMORX9sJ9LIl6OeQDrf-57\&quot; value=\&quot;\&quot; style=\&quot;endArrow=none;html=1;rounded=0;shadow=0;fontFamily=Lucida Console;fontSize=10;fontColor=#B3B3B3;strokeColor=#808080;strokeWidth=2;startArrow=none;startFill=0;endFill=0;exitX=1;exitY=0.75;exitDx=0;exitDy=0;\&quot; edge=\&quot;1\&quot; parent=\&quot;1\&quot; source=\&quot;IcMORX9sJ9LIl6OeQDrf-60\&quot;&gt;\n          &lt;mxGeometry width=\&quot;50\&quot; height=\&quot;50\&quot; relative=\&quot;1\&quot; as=\&quot;geometry\&quot;&gt;\n            &lt;mxPoint x=\&quot;270\&quot; y=\&quot;1187\&quot; as=\&quot;sourcePoint\&quot; /&gt;\n            &lt;mxPoint x=\&quot;291.56\&quot; y=\&quot;1187.28\&quot; as=\&quot;targetPoint\&quot; /&gt;\n            &lt;Array as=\&quot;points\&quot; /&gt;\n          &lt;/mxGeometry&gt;\n        &lt;/mxCell&gt;\n        &lt;mxCell id=\&quot;IcMORX9sJ9LIl6OeQDrf-58\&quot; value=\&quot;\&quot; style=\&quot;endArrow=blockThin;html=1;rounded=0;shadow=0;fontFamily=Lucida Console;fontSize=10;fontColor=#B3B3B3;strokeColor=#808080;strokeWidth=2;startArrow=none;startFill=0;endFill=1;exitX=1;exitY=0.75;exitDx=0;exitDy=0;entryX=0.442;entryY=1.117;entryDx=0;entryDy=0;entryPerimeter=0;\&quot; edge=\&quot;1\&quot; parent=\&quot;1\&quot;&gt;\n          &lt;mxGeometry width=\&quot;50\&quot; height=\&quot;50\&quot; relative=\&quot;1\&quot; as=\&quot;geometry\&quot;&gt;\n            &lt;mxPoint x=\&quot;242.06000000000012\&quot; y=\&quot;1261.06\&quot; as=\&quot;sourcePoint\&quot; /&gt;\n            &lt;mxPoint x=\&quot;290.90000000000003\&quot; y=\&quot;1243.62\&quot; as=\&quot;targetPoint\&quot; /&gt;\n            &lt;Array as=\&quot;points\&quot;&gt;\n              &lt;mxPoint x=\&quot;290.56\&quot; y=\&quot;1261.28\&quot; /&gt;\n            &lt;/Array&gt;\n          &lt;/mxGeometry&gt;\n        &lt;/mxCell&gt;\n        &lt;mxCell id=\&quot;IcMORX9sJ9LIl6OeQDrf-59\&quot; value=\&quot;\&quot; style=\&quot;endArrow=none;html=1;rounded=0;shadow=0;fontFamily=Lucida Console;fontSize=10;fontColor=#B3B3B3;strokeColor=#808080;strokeWidth=2;startArrow=none;startFill=0;endFill=0;exitX=1;exitY=0.75;exitDx=0;exitDy=0;\&quot; edge=\&quot;1\&quot; parent=\&quot;1\&quot;&gt;\n          &lt;mxGeometry width=\&quot;50\&quot; height=\&quot;50\&quot; relative=\&quot;1\&quot; as=\&quot;geometry\&quot;&gt;\n            &lt;mxPoint x=\&quot;242.06000000000012\&quot; y=\&quot;1257.06\&quot; as=\&quot;sourcePoint\&quot; /&gt;\n            &lt;mxPoint x=\&quot;291.56\&quot; y=\&quot;1257.28\&quot; as=\&quot;targetPoint\&quot; /&gt;\n            &lt;Array as=\&quot;points\&quot; /&gt;\n          &lt;/mxGeometry&gt;\n        &lt;/mxCell&gt;\n        &lt;mxCell id=\&quot;IcMORX9sJ9LIl6OeQDrf-60\&quot; value=\&quot;&amp;lt;font color=&amp;quot;#808080&amp;quot; style=&amp;quot;font-size: 8px;&amp;quot;&amp;gt;os.notify( notifyMode::QUEUED, A, &amp;quot;data1&amp;quot;)&amp;lt;br&amp;gt;&amp;lt;/font&amp;gt;&amp;lt;span style=&amp;quot;color: rgb(128, 128, 128);&amp;quot;&amp;gt;os.notify( notifyMode::QUEUED, B, &amp;quot;data2&amp;quot;)&amp;lt;/span&amp;gt;\&quot; style=\&quot;rounded=0;whiteSpace=wrap;html=1;strokeColor=#007FFF;fillColor=none;fontFamily=Lucida Console;strokeWidth=2;fontStyle=0;fontSize=8;align=center;\&quot; vertex=\&quot;1\&quot; parent=\&quot;1\&quot;&gt;\n          &lt;mxGeometry x=\&quot;20\&quot; y=\&quot;1165.56\&quot; width=\&quot;220\&quot; height=\&quot;30\&quot; as=\&quot;geometry\&quot; /&gt;\n        &lt;/mxCell&gt;\n        &lt;mxCell id=\&quot;IcMORX9sJ9LIl6OeQDrf-61\&quot; value=\&quot;&amp;lt;font color=&amp;quot;#808080&amp;quot; style=&amp;quot;font-size: 8px;&amp;quot;&amp;gt;os.notify( notifyMode::QUEUED, C, &amp;quot;data3&amp;quot;)&amp;lt;br&amp;gt;&amp;lt;/font&amp;gt;&amp;lt;span style=&amp;quot;color: rgb(128, 128, 128);&amp;quot;&amp;gt;os.notify( notifyMode::QUEUED, D, &amp;quot;data4&amp;quot;)&amp;lt;/span&amp;gt;\&quot; style=\&quot;rounded=0;whiteSpace=wrap;html=1;strokeColor=#007FFF;fillColor=none;fontFamily=Lucida Console;strokeWidth=2;fontStyle=0;fontSize=8;align=center;\&quot; vertex=\&quot;1\&quot; parent=\&quot;1\&quot;&gt;\n          &lt;mxGeometry x=\&quot;20\&quot; y=\&quot;1235.56\&quot; width=\&quot;222.06\&quot; height=\&quot;30\&quot; as=\&quot;geometry\&quot; /&gt;\n        &lt;/mxCell&gt;\n        &lt;mxCell id=\&quot;IcMORX9sJ9LIl6OeQDrf-62\&quot; value=\&quot;\&quot; style=\&quot;endArrow=blockThin;html=1;rounded=0;shadow=0;fontFamily=Lucida Console;fontSize=10;fontColor=#B3B3B3;strokeColor=#808080;strokeWidth=2;startArrow=none;startFill=0;endFill=1;exitX=0;exitY=1;exitDx=0;exitDy=0;\&quot; edge=\&quot;1\&quot; parent=\&quot;1\&quot;&gt;\n          &lt;mxGeometry width=\&quot;50\&quot; height=\&quot;50\&quot; relative=\&quot;1\&quot; as=\&quot;geometry\&quot;&gt;\n            &lt;mxPoint x=\&quot;282.06\&quot; y=\&quot;1233.28\&quot; as=\&quot;sourcePoint\&quot; /&gt;\n            &lt;mxPoint x=\&quot;241.56\&quot; y=\&quot;1233.28\&quot; as=\&quot;targetPoint\&quot; /&gt;\n            &lt;Array as=\&quot;points\&quot;&gt;\n              &lt;mxPoint x=\&quot;281.56\&quot; y=\&quot;1233.28\&quot; /&gt;\n            &lt;/Array&gt;\n          &lt;/mxGeometry&gt;\n        &lt;/mxCell&gt;\n        &lt;mxCell id=\&quot;IcMORX9sJ9LIl6OeQDrf-63\&quot; value=\&quot;&amp;quot;data1&amp;quot;\&quot; style=\&quot;text;strokeColor=none;fillColor=none;align=right;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;shadow=1;fontColor=#808080;fontFamily=Lucida Console;rounded=0;strokeWidth=2;fontStyle=0;fontSize=8;\&quot; vertex=\&quot;1\&quot; parent=\&quot;1\&quot;&gt;\n          &lt;mxGeometry x=\&quot;235.56\&quot; y=\&quot;1223.28\&quot; width=\&quot;49.75\&quot; as=\&quot;geometry\&quot; /&gt;\n        &lt;/mxCell&gt;\n        &lt;mxCell id=\&quot;IcMORX9sJ9LIl6OeQDrf-64\&quot; value=\&quot;\&quot; style=\&quot;endArrow=blockThin;html=1;rounded=0;shadow=0;fontFamily=Lucida Console;fontSize=10;fontColor=#B3B3B3;strokeColor=#808080;strokeWidth=2;startArrow=none;startFill=0;endFill=1;exitX=0;exitY=1;exitDx=0;exitDy=0;\&quot; edge=\&quot;1\&quot; parent=\&quot;1\&quot;&gt;\n          &lt;mxGeometry width=\&quot;50\&quot; height=\&quot;50\&quot; relative=\&quot;1\&quot; as=\&quot;geometry\&quot;&gt;\n            &lt;mxPoint x=\&quot;283.06\&quot; y=\&quot;1293.28\&quot; as=\&quot;sourcePoint\&quot; /&gt;\n            &lt;mxPoint x=\&quot;242.56\&quot; y=\&quot;1293.28\&quot; as=\&quot;targetPoint\&quot; /&gt;\n            &lt;Array as=\&quot;points\&quot;&gt;\n              &lt;mxPoint x=\&quot;282.56\&quot; y=\&quot;1293.28\&quot; /&gt;\n            &lt;/Array&gt;\n          &lt;/mxGeometry&gt;\n        &lt;/mxCell&gt;\n        &lt;mxCell id=\&quot;IcMORX9sJ9LIl6OeQDrf-65\&quot; value=\&quot;&amp;quot;data4&amp;quot;\&quot; style=\&quot;text;strokeColor=none;fillColor=none;align=right;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;shadow=1;fontColor=#808080;fontFamily=Lucida Console;rounded=0;strokeWidth=2;fontStyle=0;fontSize=8;\&quot; vertex=\&quot;1\&quot; parent=\&quot;1\&quot;&gt;\n          &lt;mxGeometry x=\&quot;236.56\&quot; y=\&quot;1283.28\&quot; width=\&quot;49.75\&quot; as=\&quot;geometry\&quot; /&gt;\n        &lt;/mxCell&gt;\n        &lt;mxCell id=\&quot;IcMORX9sJ9LIl6OeQDrf-66\&quot; value=\&quot;\&quot; style=\&quot;endArrow=blockThin;html=1;rounded=0;shadow=0;fontFamily=Lucida Console;fontSize=10;fontColor=#B3B3B3;strokeColor=#808080;strokeWidth=2;startArrow=none;startFill=0;endFill=1;exitX=0;exitY=1;exitDx=0;exitDy=0;\&quot; edge=\&quot;1\&quot; parent=\&quot;1\&quot;&gt;\n          &lt;mxGeometry width=\&quot;50\&quot; height=\&quot;50\&quot; relative=\&quot;1\&quot; as=\&quot;geometry\&quot;&gt;\n            &lt;mxPoint x=\&quot;283.06\&quot; y=\&quot;1342.28\&quot; as=\&quot;sourcePoint\&quot; /&gt;\n            &lt;mxPoint x=\&quot;242.56\&quot; y=\&quot;1342.28\&quot; as=\&quot;targetPoint\&quot; /&gt;\n            &lt;Array as=\&quot;points\&quot;&gt;\n              &lt;mxPoint x=\&quot;282.56\&quot; y=\&quot;1342.28\&quot; /&gt;\n            &lt;/Array&gt;\n          &lt;/mxGeometry&gt;\n        &lt;/mxCell&gt;\n        &lt;mxCell id=\&quot;IcMORX9sJ9LIl6OeQDrf-67\&quot; value=\&quot;&amp;quot;data3&amp;quot;\&quot; style=\&quot;text;strokeColor=none;fillColor=none;align=right;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;shadow=1;fontColor=#808080;fontFamily=Lucida Console;rounded=0;strokeWidth=2;fontStyle=0;fontSize=8;\&quot; vertex=\&quot;1\&quot; parent=\&quot;1\&quot;&gt;\n          &lt;mxGeometry x=\&quot;236.56\&quot; y=\&quot;1332.28\&quot; width=\&quot;49.75\&quot; as=\&quot;geometry\&quot; /&gt;\n        &lt;/mxCell&gt;\n        &lt;mxCell id=\&quot;IcMORX9sJ9LIl6OeQDrf-68\&quot; value=\&quot;\&quot; style=\&quot;endArrow=blockThin;html=1;rounded=0;shadow=0;fontFamily=Lucida Console;fontSize=10;fontColor=#B3B3B3;strokeColor=#808080;strokeWidth=2;startArrow=none;startFill=0;endFill=1;exitX=0;exitY=1;exitDx=0;exitDy=0;\&quot; edge=\&quot;1\&quot; parent=\&quot;1\&quot;&gt;\n          &lt;mxGeometry width=\&quot;50\&quot; height=\&quot;50\&quot; relative=\&quot;1\&quot; as=\&quot;geometry\&quot;&gt;\n            &lt;mxPoint x=\&quot;282.06\&quot; y=\&quot;1392.28\&quot; as=\&quot;sourcePoint\&quot; /&gt;\n            &lt;mxPoint x=\&quot;241.56\&quot; y=\&quot;1392.28\&quot; as=\&quot;targetPoint\&quot; /&gt;\n            &lt;Array as=\&quot;points\&quot;&gt;\n              &lt;mxPoint x=\&quot;281.56\&quot; y=\&quot;1392.28\&quot; /&gt;\n            &lt;/Array&gt;\n          &lt;/mxGeometry&gt;\n        &lt;/mxCell&gt;\n        &lt;mxCell id=\&quot;IcMORX9sJ9LIl6OeQDrf-69\&quot; value=\&quot;&amp;quot;data2&amp;quot;\&quot; style=\&quot;text;strokeColor=none;fillColor=none;align=right;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;shadow=1;fontColor=#808080;fontFamily=Lucida Console;rounded=0;strokeWidth=2;fontStyle=0;fontSize=8;\&quot; vertex=\&quot;1\&quot; parent=\&quot;1\&quot;&gt;\n          &lt;mxGeometry x=\&quot;235.56\&quot; y=\&quot;1382.28\&quot; width=\&quot;49.75\&quot; as=\&quot;geometry\&quot; /&gt;\n        &lt;/mxCell&gt;\n        &lt;mxCell id=\&quot;IcMORX9sJ9LIl6OeQDrf-70\&quot; value=\&quot;priority queue\&quot; style=\&quot;text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;shadow=1;fontColor=#808080;fontFamily=Helvetica;rounded=0;strokeWidth=2;fontStyle=0\&quot; vertex=\&quot;1\&quot; parent=\&quot;1\&quot;&gt;\n          &lt;mxGeometry x=\&quot;307.06\&quot; y=\&quot;1132.28\&quot; width=\&quot;84.5\&quot; height=\&quot;20\&quot; as=\&quot;geometry\&quot; /&gt;\n        &lt;/mxCell&gt;\n        &lt;mxCell id=\&quot;IcMORX9sJ9LIl6OeQDrf-71\&quot; value=\&quot;head\&quot; style=\&quot;text;strokeColor=none;fillColor=none;align=right;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;shadow=1;fontColor=#808080;fontFamily=Helvetica;rounded=0;strokeWidth=2;fontStyle=2;fontSize=8;\&quot; vertex=\&quot;1\&quot; parent=\&quot;1\&quot;&gt;\n          &lt;mxGeometry x=\&quot;271.06\&quot; y=\&quot;1136.28\&quot; width=\&quot;35.5\&quot; height=\&quot;20\&quot; as=\&quot;geometry\&quot; /&gt;\n        &lt;/mxCell&gt;\n        &lt;mxCell id=\&quot;IcMORX9sJ9LIl6OeQDrf-72\&quot; value=\&quot;head\&quot; style=\&quot;text;strokeColor=none;fillColor=none;align=right;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;shadow=1;fontColor=#808080;fontFamily=Helvetica;rounded=0;strokeWidth=2;fontStyle=2;fontSize=8;\&quot; vertex=\&quot;1\&quot; parent=\&quot;1\&quot;&gt;\n          &lt;mxGeometry x=\&quot;271.06\&quot; y=\&quot;1206.28\&quot; width=\&quot;35.5\&quot; height=\&quot;20\&quot; as=\&quot;geometry\&quot; /&gt;\n        &lt;/mxCell&gt;\n        &lt;mxCell id=\&quot;IcMORX9sJ9LIl6OeQDrf-73\&quot; value=\&quot;head\&quot; style=\&quot;text;strokeColor=none;fillColor=none;align=right;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;shadow=1;fontColor=#808080;fontFamily=Helvetica;rounded=0;strokeWidth=2;fontStyle=2;fontSize=8;\&quot; vertex=\&quot;1\&quot; parent=\&quot;1\&quot;&gt;\n          &lt;mxGeometry x=\&quot;270.43\&quot; y=\&quot;1267.28\&quot; width=\&quot;35.5\&quot; height=\&quot;20\&quot; as=\&quot;geometry\&quot; /&gt;\n        &lt;/mxCell&gt;\n        &lt;mxCell id=\&quot;IcMORX9sJ9LIl6OeQDrf-74\&quot; value=\&quot;head\&quot; style=\&quot;text;strokeColor=none;fillColor=none;align=right;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;shadow=1;fontColor=#808080;fontFamily=Helvetica;rounded=0;strokeWidth=2;fontStyle=2;fontSize=8;\&quot; vertex=\&quot;1\&quot; parent=\&quot;1\&quot;&gt;\n          &lt;mxGeometry x=\&quot;270.43\&quot; y=\&quot;1316.28\&quot; width=\&quot;35.5\&quot; height=\&quot;20\&quot; as=\&quot;geometry\&quot; /&gt;\n        &lt;/mxCell&gt;\n        &lt;mxCell id=\&quot;IcMORX9sJ9LIl6OeQDrf-75\&quot; value=\&quot;head\&quot; style=\&quot;text;strokeColor=none;fillColor=none;align=right;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;shadow=1;fontColor=#808080;fontFamily=Helvetica;rounded=0;strokeWidth=2;fontStyle=2;fontSize=8;\&quot; vertex=\&quot;1\&quot; parent=\&quot;1\&quot;&gt;\n          &lt;mxGeometry x=\&quot;269.43\&quot; y=\&quot;1366.64\&quot; width=\&quot;35.5\&quot; height=\&quot;20\&quot; as=\&quot;geometry\&quot; /&gt;\n        &lt;/mxCell&gt;\n        &lt;mxCell id=\&quot;IcMORX9sJ9LIl6OeQDrf-76\&quot; value=\&quot;\&quot; style=\&quot;endArrow=blockThin;html=1;rounded=0;strokeColor=#808080;shadow=0;curved=1;strokeWidth=2;startArrow=none;startFill=0;endFill=1;\&quot; edge=\&quot;1\&quot; parent=\&quot;1\&quot;&gt;\n          &lt;mxGeometry width=\&quot;50\&quot; height=\&quot;50\&quot; relative=\&quot;1\&quot; as=\&quot;geometry\&quot;&gt;\n            &lt;mxPoint x=\&quot;90.55999999999986\&quot; y=\&quot;1112.4199999999998\&quot; as=\&quot;sourcePoint\&quot; /&gt;\n            &lt;mxPoint x=\&quot;55.890000000000015\&quot; y=\&quot;1107.4199999999998\&quot; as=\&quot;targetPoint\&quot; /&gt;\n          &lt;/mxGeometry&gt;\n        &lt;/mxCell&gt;\n        &lt;mxCell id=\&quot;IcMORX9sJ9LIl6OeQDrf-77\&quot; value=\&quot;priority&amp;#xa; value\&quot; style=\&quot;text;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;shadow=1;fontColor=#808080;fontFamily=Helvetica;rounded=0;strokeWidth=2;fontStyle=2;fontSize=8;\&quot; vertex=\&quot;1\&quot; parent=\&quot;1\&quot;&gt;\n          &lt;mxGeometry x=\&quot;21.560000000000002\&quot; y=\&quot;1098.28\&quot; width=\&quot;38\&quot; height=\&quot;20\&quot; as=\&quot;geometry\&quot; /&gt;\n        &lt;/mxCell&gt;\n      &lt;/root&gt;\n    &lt;/mxGraphModel&gt;\n  &lt;/diagram&gt;\n&lt;/mxfile&gt;\n&quot;}"></div>
* <script type="text/javascript" src="https://viewer.diagrams.net/js/viewer-static.min.js"></script>
* </body>
* </html>
* @endhtmlonly
* <em>Priority-queue example</em>
* </center>
*
*
* @note Any queue extraction involves an activation of the receiving task. The
* extracted data will be available inside the qOS::event_t class.
* @remark Among all the provided events, queued notifications have the highest
* precedence.
*
* @subsubsection q_notificationsend Sending notifications
* The kernel handles all the notifications by itself (simple or queued), so
* intermediate objects are not needed. Just calling qOS::core::notify() is enough to
* send notifications. After the task callback is invoked, the notification is
* cleared by the dispatcher. Here the application writer must read the respective
* fields of the event-data class to check the received notification.
*
* The next example shows an ISR to task communication. Two interrupts send
* notifications to a single task with specific event data. The receiver task
* @c taskA after further processing, send an event to @c taskB to handle the
* event generated by the transmitter @c taskA.
*
*  @code{.c}
*  #include "HAL.h" /*hardware dependent code*/
*  #include "QuarkTS.h"
*
*  using namespace qOS;
*
*  task_t taskA, taskB;
*  void taskA_Callback( event_t e );
*  void taskB_Callback( event_t e );
*
*  const char *app_events[] = {
*                              "Timer1seg",
*                              "ButtonRisingEdge",
*                              "ButtonFallingEdge",
*                              "3Count_ButtonPush"
*                             };
*
*  /*==================================================================*/
*  void interrupt Timer1Second_ISR( void) {
*      os.notify( notifyMode::SIMPLE, taskA );
*      HAL_ClearInterruptFlags( HAL_TMR_ISR ); /*hardware dependent code*/
*  }
*  /*==================================================================*/
*  void interrupt ExternalInput_ISR( void ) {
*      if ( RISING_EDGE == HAL_GetInputEdge() ) { /*hardware dependent code*/
*          os.notify( notifyMode::QUEUED, taskA, app_events[1] );
*      }
*      else {
*          os.notify( notifyMode::QUEUED, taskA, app_events[2] );
*      }
*      HAL_ClearInterruptFlags( HAL_EXT_ISR ); /*hardware dependent code*/
*  }
*  /*==================================================================*/
*  void taskA_Callback( event_t e ) {
*      static int press_counter = 0;
*
*      switch ( e.getTrigger() ) { /*check the source of the event*/
*          case trigger::byNotificationSimple:
*              /*
*              * Do something here to process the timer event
*              */
*              break;
*          case trigger::byNotificationQueued:
*              /*here, we only care about the Falling Edge events*/
*              if ( 0 == strcmp( e.EventData, "ButtonFallingEdge" ) ) {
*                  press_counter++; /*count the button press*/
*                  if ( 3 == press_counter ) { /*after 3 presses*/
*                      /*send the notification of 3 presses to taskB*/
*                      os.notify( notifyMode::SIMPLE, taskB, app_events[3] );
*                      press_counter = 0;
*                  }
*              }
*              break;
*          default:
*              break;
*      }
*  }
*  /*==================================================================*/
*  void taskB_Callback( event_t e ) {
*      if ( trigger::byNotificationSimple == e.getTrigger() ) {
*          /*
*           * we can do more here, but this is just an example,
*           * so, this task will only print out the received
*           * notification event.
*           */
*          trace::log << static_cast<char>( e->EventData ) << trace::endl;
*      }
*  }
*  /*==================================================================*/
*  int main( void ) {
*      HAL_Setup_MCU(); /*hardware dependent code*/
*      trace::setOutputFcn( HAL_OutPutChar );
*      /* setup the scheduler to handle up to 10 queued notifications*/
*      os.init( HAL_GetTick, nullptr );
*      os.add( taskA, taskA_Callback, core::LOWEST_PRIORITY );
*      os.add( taskB, taskB_Callback, core::LOWEST_PRIORITY );
*      os.run();
*      return 0;
*  }
*  @endcode
*
* @subsubsection qnotspread Spread a notification
* In some systems, we need the ability to broadcast an event to all tasks. This
* is often referred to as a barrier. This means that a group of tasks should
* stop activities at some point and cannot proceed until another task or ISR
* raise a specific event. For this kind of implementation, we can also use the
* qOS::core::notify() method but in this case, without specifying a target task.
*
* @note In this mode, qOS::core::notify() spreads a notification event among all the
* tasks in the scheduling scheme, so, for tasks that are not part of the barrier,
* just discard the notification. This operation will be performed in the next
* scheduling cycle.
*
* @subsection q_queues Queues
* A queue is a linear data structure with simple operations based on the FIFO
* (First In First Out) principle. It is capable to hold a finite number of
* fixed-size data items. The maximum number of items that a queue can hold is
* called its length. Both the length and the size of each data item are set
* when the queue is created.
*
* <center>
* @htmlonly
* <!DOCTYPE html>
* <html>
* <head>
* <title>queues</title>
* <meta charset="utf-8"/>
* </head>
* <body><div class="mxgraph" style="max-width:100%;border:1px solid transparent;" data-mxgraph="{&quot;highlight&quot;:&quot;#0000ff&quot;,&quot;nav&quot;:true,&quot;resize&quot;:true,&quot;toolbar&quot;:&quot;zoom layers tags lightbox&quot;,&quot;edit&quot;:&quot;_blank&quot;,&quot;xml&quot;:&quot;&lt;mxfile host=\&quot;app.diagrams.net\&quot; modified=\&quot;2022-10-18T14:39:29.978Z\&quot; agent=\&quot;5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36\&quot; etag=\&quot;poeP1qF8UpQnuG3sVoca\&quot; version=\&quot;20.2.2\&quot; type=\&quot;google\&quot;&gt;&lt;diagram id=\&quot;txs8vVA5wulF-spgP7-0\&quot; name=\&quot;Página-1\&quot;&gt; &lt;/diagram&gt;&lt;/mxfile&gt;&quot;}"></div>
* <script type="text/javascript" src="https://viewer.diagrams.net/js/viewer-static.min.js"></script>
* </body>
* </html>
* @endhtmlonly
* <em>Queues conceptual representation</em>
* </center>
*
* As shown above, the last position is connected back to the first
* position to make a circle. It is also called ring-buffer or circular-queue.
*
* In general, this kind of data structure is used to serialize data between
* tasks, allowing some elasticity in time. In many cases, the queue is used as
* a data buffer in interrupt service routines. This buffer will collect the data
* so, at some later time, another task can fetch the data for further
* processing. This use case is the single "task to task" buffering case. There
* are also other applications for queues as serializing many data streams
* into one receiving stream (multiple tasks to a single task) or vice-versa
* (single task to multiple tasks).
*
* @note The OS uses the queue by copy method. Queuing by copy is considered to
* be simultaneously more powerful and simpler to use than queuing by reference.
*
* Queuing by copy does not prevent the queue from also being used to queue by
* reference. For example, when the size of the data being queued makes it
* impractical to copy the data into the queue, then a pointer to the data can be
* copied into the queue instead.
*
* @subsubsection  q_queuesetup Setting up a queue
* A queue must be explicitly initialized before it can be used. These objects
* are referenced by the class qOS::queue. Both, the constructor or the qOS::queue::setup()
* method can be used to configure the queue and initialize the instance.
*
* The required RAM for the queue data should be provided by the application
* writer and could be statically allocated at compile time or in run-time using
* the @ref q_memmang extension.
*
* @subsubsection q_attachqueue Attach a queue to a task
*
* Additional features are provided by the kernel when the queues are attached
* to tasks; this allows the scheduler to pass specific queue events to it,
* usually, states of the object itself that needs to be handled, in this case
* by a task. For this, use the qOS::task::attachQueue() method.
*
* The following attaching modes are provided:
* - qOS::queueLinkMode::QUEUE_RECEIVER : The task will be triggered if there are elements
* in the queue.
* - qOS::queueLinkMode::QUEUE_FULL : The task will be triggered if the queue is full.
* - qOS::queueLinkMode::QUEUE_COUNT : The task will be triggered if the count of elements in
* the queue reaches the specified value.
* - qOS::queueLinkMode::QUEUE_EMPTY : The task will be triggered if the queue is empty.
*
* @note For the qOS::queueLinkMode::QUEUE_RECEIVER mode, data from the front of the queue
* will be received automatically in every trigger, this involves a data removal
* after the task is served. During the respective task execution, the qOS::event_t::EventData
* field of the qOS::event_t class will be pointing to the extracted data. For
* the other modes, the qOS::event_t::EventData field will point to the queue that
* triggered the event.
*
* @subsubsection q_queueexample A queue example
* This example shows the usage of QuarkTS++ queues. The application is the classic
* producer/consumer example. The producer task puts data into the queue. When
* the queue reaches a specific item count, the consumer task is triggered to
* start fetching data from the queue. Here, both tasks are attached to the queue.
*
*  @code{.c}
*  #include "QuarkTS.h"
*
*  using namespace qOS;
*
*  /*-----------------------------------------------------------------------*/
*  void interrupt Timer0_ISR( void ) {
*      clock::sysTick();
*  }
*  /*-----------------------------------------------------------------------*/
*  task tProducer, tConsumer; /*task nodes*/
*  queue userQueue; /*Queue Handle*/
*  /*-----------------------------------------------------------------------*/
*
*  /* The producer task puts data into the buffer if there is enough free
*   * space in it, otherwise the task blocks itself and wait until the queue
*   * is empty to resume. */
*  void tProducer_Callback( event_t e ) {
*      static uint16_t unData = 0;
*      unData++;
*      /*Queue is empty, enable the producer if it was disabled*/
*      if ( byQueueEmpty == e.getTrigger() ) {
*          e.thisTask().resume();
*      }
*
*      /*send data to the queue*/
*      if ( false == UserQueue.send( &unData ) ) {
*          /*
*          * if the data insertion fails, the queue is full
*          * and the task disables itself
*          */
*          e.thisTask().suspend();
*      }
*  }
*  /*-----------------------------------------------------------------------*/
*  /* The consumer task gets one element from the queue.*/
*  void tConsumer_Callback( event_t e ) {
*      uint16_t unData;
*      queue *ptrQueue; /*a pointer to the queue that triggers the event*/
*
*      if ( byQueueCount == e.getTrigger() ) {
*          ptrQueue = (queue_t *)e.EventData;
*          ptrQueue->receive( &unData );
*          return;
*      }
*  }
*  /*-----------------------------------------------------------------------*/
*  void IdleTask_Callback( event_t e ) {
*      /*nothing to do...*/
*  }
*  /*-----------------------------------------------------------------------*/
*  int main( void ) {
*      uint8_t BufferMem[ 16*sizeof(uint16_t) ] = { 0u };
*      HardwareSetup();  //hardware-specific code
*      /* next line is used to set up hardware with specific code to fire
*       * interrupts at 1ms - timer tick*/
*      Configure_Periodic_Timer0_Interrupt_1ms();
*
*      os.init( nullptr, IdleTask_Callback );
*      /*Setup the queue*/
*      userQueue.setup<uint16_t>( BufferMem, 16 );
*
*      /*  Append the producer task with 100mS rate. */
*      os.add( tProducer, tProducer_Callback, core::MEDIUM_PRIORITY,
*              100_ms, task::PERIODIC, taskState::ENABLED_STATE, "producer" );
*      /* Append the consumer as an event task. The consumer will
*       * wait until an event trigger their execution
*       */
*      os.add( tConsumer, tConsumer_Callback, core::MEDIUM_PRIORITY, "consumer" );
*      /* the queue will be attached to the consumer task
*       * in Count mode. This mode sends an event to the consumer
*       * task when the queue fills to a level of 4 elements
*       */
*      tConsumer.attachQueue( userQueue, queueLinkMode::QUEUE_COUNT, 4 );
*      /* the queue will be attached to the producer task in
*       * queueLinkMode = QUEUE_EMPTY mode. This mode sends an event to the producer
*       * task when the queue is empty
*       */
*
*      tProducer.attachQueue( userQueue, queueLinkMode::QUEUE_EMPTY );
*      os.run();
*      return 0;
*  }
*  @endcode
*
* @subsection qeventflags Event Flags
* Every task node has a set of built-in event bits called Event-Flags, which can
* be used to indicate if an event has occurred or not. They are somewhat similar
* to signals, but with greater flexibility, providing a low-cost, but flexible
* means of passing simple messages between tasks. One task can set or clear any
* combination of event flags. Another task may read the event flag group at any
* time or may wait for a specific pattern of flags.
*
* <center>
* @htmlonly
* <!DOCTYPE html>
* <html>
* <head>
* <title>eventflags</title>
* <meta charset="utf-8"/>
* </head>
* <body><div class="mxgraph" style="max-width:100%;border:1px solid transparent;" data-mxgraph="{&quot;highlight&quot;:&quot;#0000ff&quot;,&quot;nav&quot;:true,&quot;zoom&quot;:1.25,&quot;resize&quot;:true,&quot;toolbar&quot;:&quot;zoom layers tags lightbox&quot;,&quot;edit&quot;:&quot;_blank&quot;,&quot;xml&quot;:&quot;&lt;mxfile host=\&quot;app.diagrams.net\&quot; modified=\&quot;2022-10-19T13:56:56.208Z\&quot; agent=\&quot;5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36\&quot; etag=\&quot;ioWXi7ZzjvlYkIrrLvh0\&quot; version=\&quot;20.2.2\&quot; type=\&quot;google\&quot;&gt;&lt;diagram id=\&quot;_ToeAvv05QZHaTr5tAgO\&quot; name=\&quot;Página-1\&quot;&gt; &lt;/diagram&gt;&lt;/mxfile&gt;&quot;}"></div>
* <script type="text/javascript" src="https://viewer.diagrams.net/js/viewer-static.min.js"></script>
* </body>
* </html>
* @endhtmlonly
* <em>Task event flags</em>
* </center>
*
* Up to twenty(20) bit-flags are available per task and whenever the scheduler
* sees that one event-flag is set, the kernel will trigger the task execution.
*
* @note The scheduler will put the task into a @c READY state when any of
* the available event-flags is set. The flags should be cleared by the
* application writer explicitly
*
* @subsubsection q_eventflagsexample Using the task Event-flags
* This example demonstrates the usage of Event-flags. The idle task will
* transmit data generated from another task, only when the required conditions
* are met, including two events from an ISR (A timer expiration and the change
* of a digital input) and when a new set of data is generated. The task that
* generates the data should wait until the idle task transmission is done to
* generate a new data set.
*
*  @code{.c}
*  #include "QuarkTS.h"
*
*  using namespace qOS;
*
*  /*event flags application definitions */
*  #define SWITCH_CHANGED   EVENT_FLAG(1)
*  #define TIMER_EXPIRED    EVENT_FLAG(2)
*  #define DATA_READY       EVENT_FLAG(3)
*  #define DATA_TXMIT       EVENT_FLAG(4)
*
*  task TaskDataProducer;
*  uint8_t dataToTransmit[ 10 ] = { 0 };
*
*  /*-----------------------------------------------------------------------*/
*  void interrupt Timer0_ISR( void ) {
*      clock::sysTick();
*  }
*  /*-----------------------------------------------------------------------*/
*  void interrupt Timer1_ISR( void ) {
*      os.eventFlagsModify( TaskDataProducer, TIMER_EXPIRED, true );
*  }
*  /*-----------------------------------------------------------------------*/
*  void interrupt EXTI_ISR( void ) {
*      if ( EXTI_IsRisingEdge() ) {
*          os.eventFlagsModify( TaskDataProducer, SWITCH_CHANGED, true );
*      }
*  }
*  /*-----------------------------------------------------------------------*/
*  void TaskDataProducer_Callback( event_t e ) {
*      bool condition;
*
*      condition = os.eventFlagsCheck( TaskDataProducer, DATA_TXMIT, true, true );
*      if ( true == condition) {
*          GenerateData( dataToTransmit );
*          os.eventFlagsModify( TaskDataProducer, DATA_READY, true );
*      }
*      os.eventFlagsCheck( TaskDataProducer, DATA_READY | SWITCH_CHANGED | TIMER_EXPIRED, true, true );
*  }
*  /*-----------------------------------------------------------------------*/
*  void IdleTask_Callback( event_t e ) {
*
*      TransmitData( dataToTransmit );
*      os.eventFlagsModify( &TaskDataProducer, DATA_TXMIT, true );
*  }
*  /*-----------------------------------------------------------------------*/
*  int main( void ) {
*      HardwareSetup();  //hardware-specific code
*      /* next line is used to set up hardware with specific code to fire
*       * interrupts at 1ms - timer tick*/
*      Configure_Periodic_Timer0_Interrupt_1ms();
*      Configure_Periodic_Timer1_Interrupt_2s();
*      Configure_External_Interrupt();
*      /* Idle task will be responsible to transmit the generate the data after
*       * all conditions are met
*      */
*      os.init( nullptr, IdleTask_Callback );
*      /* The task will wait until data is transmitted to generate another set of
*       * data */
*      os.add( TaskDataProducer, TaskDataProducer_Callback, core::HIGHEST_PRIORITY, "DATAPRODUCER" );
*      /* Set the flag DATA_TXMIT as the initial condition to allow the data
*       * generation at startup
*      */
*      os.eventFlagsModify( TaskDataProducer, DATA_TXMIT, true );
*      os.run();
*      for ( ;; ) {}
*      return 0;
*  }
*  @endcode
*
*/