|
@@ -6,7 +6,7 @@
|
|
|
<META NAME="GENERATOR" CONTENT="LibreOffice 3.5 (Linux)">
|
|
<META NAME="GENERATOR" CONTENT="LibreOffice 3.5 (Linux)">
|
|
|
<META NAME="CREATED" CONTENT="20150206;16300000">
|
|
<META NAME="CREATED" CONTENT="20150206;16300000">
|
|
|
<META NAME="CHANGEDBY" CONTENT="Anatoli Arkhipenko">
|
|
<META NAME="CHANGEDBY" CONTENT="Anatoli Arkhipenko">
|
|
|
- <META NAME="CHANGED" CONTENT="20151012;23280000">
|
|
|
|
|
|
|
+ <META NAME="CHANGED" CONTENT="20151015;23250000">
|
|
|
<META NAME="Info 1" CONTENT="">
|
|
<META NAME="Info 1" CONTENT="">
|
|
|
<META NAME="Info 2" CONTENT="">
|
|
<META NAME="Info 2" CONTENT="">
|
|
|
<META NAME="Info 3" CONTENT="">
|
|
<META NAME="Info 3" CONTENT="">
|
|
@@ -24,8 +24,8 @@
|
|
|
<BODY LANG="en-US" TEXT="#000000" BGCOLOR="#ffffff" DIR="LTR">
|
|
<BODY LANG="en-US" TEXT="#000000" BGCOLOR="#ffffff" DIR="LTR">
|
|
|
<P CLASS="western" STYLE="margin-bottom: 0in"><B>Task Scheduler –
|
|
<P CLASS="western" STYLE="margin-bottom: 0in"><B>Task Scheduler –
|
|
|
cooperative multitasking for Arduino microcontrollers</B></P>
|
|
cooperative multitasking for Arduino microcontrollers</B></P>
|
|
|
-<P CLASS="western" STYLE="margin-bottom: 0in"><B>Version 1.7.0:
|
|
|
|
|
-2015-10-12</B></P>
|
|
|
|
|
|
|
+<P CLASS="western" STYLE="margin-bottom: 0in"><B>Version 1.8.0:
|
|
|
|
|
+2015-10-15</B></P>
|
|
|
<P CLASS="western" STYLE="margin-bottom: 0in"><BR>
|
|
<P CLASS="western" STYLE="margin-bottom: 0in"><BR>
|
|
|
</P>
|
|
</P>
|
|
|
<P CLASS="western" STYLE="margin-bottom: 0in"><B>OVERVIEW</B>:</P>
|
|
<P CLASS="western" STYLE="margin-bottom: 0in"><B>OVERVIEW</B>:</P>
|
|
@@ -44,6 +44,8 @@ supporting:</P>
|
|
|
function)</P>
|
|
function)</P>
|
|
|
<LI><P CLASS="western" STYLE="margin-bottom: 0in">Power saving via
|
|
<LI><P CLASS="western" STYLE="margin-bottom: 0in">Power saving via
|
|
|
entering IDLE sleep mode between tasks are scheduled to run</P>
|
|
entering IDLE sleep mode between tasks are scheduled to run</P>
|
|
|
|
|
+ <LI><P CLASS="western" STYLE="margin-bottom: 0in">Support for task
|
|
|
|
|
+ invocation via Status Request object</P>
|
|
|
</OL>
|
|
</OL>
|
|
|
<P CLASS="western" STYLE="margin-bottom: 0in"><BR>
|
|
<P CLASS="western" STYLE="margin-bottom: 0in"><BR>
|
|
|
</P>
|
|
</P>
|
|
@@ -52,6 +54,8 @@ supporting:</P>
|
|
|
container concept that links together:</P>
|
|
container concept that links together:</P>
|
|
|
<OL>
|
|
<OL>
|
|
|
<LI><P CLASS="western" STYLE="margin-bottom: 0in">Execution interval</P>
|
|
<LI><P CLASS="western" STYLE="margin-bottom: 0in">Execution interval</P>
|
|
|
|
|
+ <LI><P CLASS="western" STYLE="margin-bottom: 0in">Execution event
|
|
|
|
|
+ (Status Request)</P>
|
|
|
<LI><P CLASS="western" STYLE="margin-bottom: 0in">Number of
|
|
<LI><P CLASS="western" STYLE="margin-bottom: 0in">Number of
|
|
|
execution iterations</P>
|
|
execution iterations</P>
|
|
|
<LI><P CLASS="western" STYLE="margin-bottom: 0in">Piece of code
|
|
<LI><P CLASS="western" STYLE="margin-bottom: 0in">Piece of code
|
|
@@ -104,7 +108,7 @@ tasks in the chain always requires immediate execution (aInterval =
|
|
|
</P>
|
|
</P>
|
|
|
<P CLASS="western" STYLE="margin-bottom: 0in; page-break-after: avoid">
|
|
<P CLASS="western" STYLE="margin-bottom: 0in; page-break-after: avoid">
|
|
|
<B>Below is the flowchart of a Task lifecycle:</B></P>
|
|
<B>Below is the flowchart of a Task lifecycle:</B></P>
|
|
|
-<P CLASS="western" STYLE="margin-bottom: 0in"><IMG SRC="TaskScheduler_html.png" NAME="graphics1" ALIGN=BOTTOM WIDTH=664 HEIGHT=769 BORDER=0></P>
|
|
|
|
|
|
|
+<P CLASS="western" STYLE="margin-bottom: 0in"><IMG SRC="TaskScheduler_html.png" NAME="graphics1" ALIGN=BOTTOM WIDTH=664 HEIGHT=747 BORDER=0></P>
|
|
|
<P CLASS="western" STYLE="margin-bottom: 0in"><BR>
|
|
<P CLASS="western" STYLE="margin-bottom: 0in"><BR>
|
|
|
</P>
|
|
</P>
|
|
|
<P CLASS="western" STYLE="margin-bottom: 0in"><B>Note: </B>Task
|
|
<P CLASS="western" STYLE="margin-bottom: 0in"><B>Note: </B>Task
|
|
@@ -124,6 +128,28 @@ to run in a truly periodical manner (in absolute time terms).
|
|
|
</P>
|
|
</P>
|
|
|
<P CLASS="western" STYLE="margin-bottom: 0in"><BR>
|
|
<P CLASS="western" STYLE="margin-bottom: 0in"><BR>
|
|
|
</P>
|
|
</P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-bottom: 0in">In addition to
|
|
|
|
|
+time-only invocation, tasks can be scheduled to wait on an event
|
|
|
|
|
+employing StatusRequest objects (more about Status Requests later).</P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-bottom: 0in">Consider a scenario
|
|
|
|
|
+when one task (t1) is performing a function which affects execution
|
|
|
|
|
+of many tasks (t2, t3). In this case the task t1 will “signal”
|
|
|
|
|
+completion of its function via Status Request object. Tasks t2 and t3
|
|
|
|
|
+are “waiting” on the same Status Request object. As soon as
|
|
|
|
|
+status request completes, t2 and t3 are activated.</P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-bottom: 0in"><BR>
|
|
|
|
|
+</P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-bottom: 0in">Alternative scenario is
|
|
|
|
|
+the ne task (t1) and waiting for the completion of a number of tasks
|
|
|
|
|
+(t2, t3). When done, t2 and t3 signal completion of their functions,
|
|
|
|
|
+t1 is invoked.
|
|
|
|
|
+</P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-bottom: 0in"><BR>
|
|
|
|
|
+</P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-bottom: 0in">Please see the examples
|
|
|
|
|
+at the end of this document.</P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-bottom: 0in"><BR>
|
|
|
|
|
+</P>
|
|
|
<P CLASS="western" STYLE="margin-bottom: 0in"><B>COMPILE PARAMETERS:</B></P>
|
|
<P CLASS="western" STYLE="margin-bottom: 0in"><B>COMPILE PARAMETERS:</B></P>
|
|
|
<P CLASS="western" STYLE="margin-bottom: 0in">This library could be
|
|
<P CLASS="western" STYLE="margin-bottom: 0in">This library could be
|
|
|
compiled with several options.
|
|
compiled with several options.
|
|
@@ -163,6 +189,15 @@ conserve power. Device in SLEEP_MODE_IDLE wakes up to all hardware
|
|
|
and timer interrupts, so scheduling is kept current.</P>
|
|
and timer interrupts, so scheduling is kept current.</P>
|
|
|
<P CLASS="western" STYLE="margin-bottom: 0in"><BR>
|
|
<P CLASS="western" STYLE="margin-bottom: 0in"><BR>
|
|
|
</P>
|
|
</P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-bottom: 0in">#define
|
|
|
|
|
+<B>_TASK_STATUS_REQUEST</B></P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-bottom: 0in">…will compile
|
|
|
|
|
+TaskScheduler with support for StatusRequest object. Status Requests
|
|
|
|
|
+are objects allowing tasks to wait on an event, and signal event
|
|
|
|
|
+completion to each other.
|
|
|
|
|
+</P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-bottom: 0in">
|
|
|
|
|
+</P>
|
|
|
<P CLASS="western" STYLE="margin-bottom: 0in"><B>NOTE: above
|
|
<P CLASS="western" STYLE="margin-bottom: 0in"><B>NOTE: above
|
|
|
parameters are DISABLED by default, and need to be explicitly
|
|
parameters are DISABLED by default, and need to be explicitly
|
|
|
enabled.</B></P>
|
|
enabled.</B></P>
|
|
@@ -175,7 +210,8 @@ enabled.</B></P>
|
|
|
<P CLASS="western" STYLE="margin-bottom: 0in"><B>API DOCUMENTATION:</B></P>
|
|
<P CLASS="western" STYLE="margin-bottom: 0in"><B>API DOCUMENTATION:</B></P>
|
|
|
<P CLASS="western" STYLE="margin-bottom: 0in"><BR>
|
|
<P CLASS="western" STYLE="margin-bottom: 0in"><BR>
|
|
|
</P>
|
|
</P>
|
|
|
-<P CLASS="western" STYLE="margin-bottom: 0in"><B>TASKS:</B></P>
|
|
|
|
|
|
|
+<P CLASS="western" STYLE="margin-bottom: 0in; page-break-after: avoid">
|
|
|
|
|
+<B>TASKS:</B></P>
|
|
|
<P CLASS="western" STYLE="margin-bottom: 0in"><BR>
|
|
<P CLASS="western" STYLE="margin-bottom: 0in"><BR>
|
|
|
</P>
|
|
</P>
|
|
|
<P CLASS="western" STYLE="margin-bottom: 0in">CREATION:</P>
|
|
<P CLASS="western" STYLE="margin-bottom: 0in">CREATION:</P>
|
|
@@ -197,7 +233,7 @@ tasks are created <B>disabled</B> by default.</P>
|
|
|
<P CLASS="western" STYLE="margin-bottom: 0in; page-break-after: avoid">
|
|
<P CLASS="western" STYLE="margin-bottom: 0in; page-break-after: avoid">
|
|
|
<B>Task(unsigned long aInterval, long aIterations, void
|
|
<B>Task(unsigned long aInterval, long aIterations, void
|
|
|
(*aCallback)(), Scheduler* aScheduler, bool aEnable, bool
|
|
(*aCallback)(), Scheduler* aScheduler, bool aEnable, bool
|
|
|
-(*aOnEnable)(), void (*aOnDisable)(),);</B></P>
|
|
|
|
|
|
|
+(*aOnEnable)(), void (*aOnDisable)())</B></P>
|
|
|
<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><BR>
|
|
<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><BR>
|
|
|
</P>
|
|
</P>
|
|
|
<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in">Constructor
|
|
<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in">Constructor
|
|
@@ -249,6 +285,18 @@ task is scheduled for execution immediately. Enable tasks with delay
|
|
|
to defer first run of the task.</P>
|
|
to defer first run of the task.</P>
|
|
|
<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><BR>
|
|
<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><BR>
|
|
|
</P>
|
|
</P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-bottom: 0in; page-break-after: avoid">
|
|
|
|
|
+<B>Task(void (*aCallback)(), Scheduler* aScheduler, bool
|
|
|
|
|
+(*aOnEnable)(), void (*aOnDisable)())</B></P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><BR>
|
|
|
|
|
+</P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in">If
|
|
|
|
|
+compiled with support for Status Request objects, this constructor
|
|
|
|
|
+creates a Task for activation on event (since such tasks must run
|
|
|
|
|
+<B>waitFor() </B>method, their <I>interval</I>, <I>iteration</I> and
|
|
|
|
|
+<I>enabled</I> status will be set by that method.</P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><BR>
|
|
|
|
|
+</P>
|
|
|
<P CLASS="western" STYLE="margin-bottom: 0in"><B>INFORMATION</B></P>
|
|
<P CLASS="western" STYLE="margin-bottom: 0in"><B>INFORMATION</B></P>
|
|
|
<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in">The
|
|
<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in">The
|
|
|
following 3 “getter” functions return task status
|
|
following 3 “getter” functions return task status
|
|
@@ -329,7 +377,8 @@ current pass is the last iteration.
|
|
|
</P>
|
|
</P>
|
|
|
<P CLASS="western" STYLE="margin-bottom: 0in; page-break-after: avoid">
|
|
<P CLASS="western" STYLE="margin-bottom: 0in; page-break-after: avoid">
|
|
|
<B>CONTROL:</B></P>
|
|
<B>CONTROL:</B></P>
|
|
|
-<P CLASS="western" STYLE="margin-bottom: 0in"><BR>
|
|
|
|
|
|
|
+<P CLASS="western" STYLE="margin-bottom: 0in; page-break-after: avoid">
|
|
|
|
|
+<BR>
|
|
|
</P>
|
|
</P>
|
|
|
<P CLASS="western" STYLE="margin-bottom: 0in"><B>void enable();</B></P>
|
|
<P CLASS="western" STYLE="margin-bottom: 0in"><B>void enable();</B></P>
|
|
|
<P CLASS="western" STYLE="margin-bottom: 0in"><BR>
|
|
<P CLASS="western" STYLE="margin-bottom: 0in"><BR>
|
|
@@ -496,16 +545,49 @@ ran through all their allocated iterations are disabled.
|
|
|
</P>
|
|
</P>
|
|
|
<P CLASS="western" STYLE="margin-bottom: 0in"><BR>
|
|
<P CLASS="western" STYLE="margin-bottom: 0in"><BR>
|
|
|
</P>
|
|
</P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-bottom: 0in; page-break-after: avoid">
|
|
|
|
|
+<B>void waitFor(StatusRequest* aStatusRequest);</B></P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-bottom: 0in; page-break-after: avoid">
|
|
|
|
|
+<BR>
|
|
|
|
|
+</P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in">If
|
|
|
|
|
+compiled with support for Status Requests, this method makes task
|
|
|
|
|
+wait for the completion of <B>aStatusRequest</B> event.
|
|
|
|
|
+</P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><B>waitFor()
|
|
|
|
|
+</B>sets tasks interval to <B>0 (zero)</B> for immediate execution
|
|
|
|
|
+when event happens, and also sets the number of <B>iterations to 1</B>.</P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><B>Note:
|
|
|
|
|
+aStatusRequest</B> should be “activated” by calling <B>setWaiting()
|
|
|
|
|
+</B>method before making a task wait on it. Otherwise, the task will
|
|
|
|
|
+execute immediately.
|
|
|
|
|
+</P>
|
|
|
<P CLASS="western" STYLE="margin-bottom: 0in"><BR>
|
|
<P CLASS="western" STYLE="margin-bottom: 0in"><BR>
|
|
|
</P>
|
|
</P>
|
|
|
<P CLASS="western" STYLE="margin-bottom: 0in"><BR>
|
|
<P CLASS="western" STYLE="margin-bottom: 0in"><BR>
|
|
|
</P>
|
|
</P>
|
|
|
-<P CLASS="western" STYLE="margin-bottom: 0in"><B>TASK SCHEDULER:</B></P>
|
|
|
|
|
|
|
+<P CLASS="western" STYLE="margin-bottom: 0in"><B>StatusRequest*
|
|
|
|
|
+getStatusRequest()</B></P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in">Returns
|
|
|
|
|
+a StatusReqeust object this Task was waiting on.
|
|
|
|
|
+</P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><BR>
|
|
|
|
|
+</P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><BR>
|
|
|
|
|
+</P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><BR>
|
|
|
|
|
+</P>
|
|
|
<P CLASS="western" STYLE="margin-bottom: 0in"><BR>
|
|
<P CLASS="western" STYLE="margin-bottom: 0in"><BR>
|
|
|
</P>
|
|
</P>
|
|
|
-<P CLASS="western" STYLE="margin-bottom: 0in"><B>CREATION:</B></P>
|
|
|
|
|
|
|
+<P CLASS="western" STYLE="margin-bottom: 0in; page-break-after: avoid">
|
|
|
|
|
+<B>TASK SCHEDULER:</B></P>
|
|
|
<P CLASS="western" STYLE="margin-bottom: 0in"><BR>
|
|
<P CLASS="western" STYLE="margin-bottom: 0in"><BR>
|
|
|
</P>
|
|
</P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-bottom: 0in; page-break-after: avoid">
|
|
|
|
|
+<B>CREATION:</B></P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-bottom: 0in; page-break-after: avoid">
|
|
|
|
|
+<BR>
|
|
|
|
|
+</P>
|
|
|
<P CLASS="western" STYLE="margin-bottom: 0in"><B>Scheduler()</B><BR><BR>
|
|
<P CLASS="western" STYLE="margin-bottom: 0in"><B>Scheduler()</B><BR><BR>
|
|
|
</P>
|
|
</P>
|
|
|
<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in">Default
|
|
<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in">Default
|
|
@@ -614,6 +696,97 @@ statements after <B>execute</B> inside the <B>loop()</B>
|
|
|
</P>
|
|
</P>
|
|
|
<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><BR>
|
|
<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><BR>
|
|
|
</P>
|
|
</P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><BR>
|
|
|
|
|
+</P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-bottom: 0in; page-break-after: avoid">
|
|
|
|
|
+<B>STATUS REQUEST:</B></P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-bottom: 0in; page-break-after: avoid">
|
|
|
|
|
+<BR>
|
|
|
|
|
+</P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-bottom: 0in; page-break-after: avoid">
|
|
|
|
|
+<B>CREATION:</B></P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-bottom: 0in; page-break-after: avoid">
|
|
|
|
|
+<BR>
|
|
|
|
|
+</P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-bottom: 0in"><B>StatusRequest()</B><BR><BR>
|
|
|
|
|
+</P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in">Default
|
|
|
|
|
+constructor.
|
|
|
|
|
+</P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in">Takes
|
|
|
|
|
+no parameters. Creates Status Request object, which is assigned a
|
|
|
|
|
+status of “completed” on creation.
|
|
|
|
|
+</P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><BR>
|
|
|
|
|
+</P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-bottom: 0in"><B>void
|
|
|
|
|
+setWaiting(unsigned int aCount)</B></P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in">Activates
|
|
|
|
|
+Status Request object. By default each object is set to wait on one
|
|
|
|
|
+event only, however, if <B>aCount</B> is supplied, Status Request can
|
|
|
|
|
+wait on multiple events. For instance, <B>setWaiting(3)</B> will wait
|
|
|
|
|
+on three signals. An example could be waiting for completion of
|
|
|
|
|
+measurements from 3 sensors.
|
|
|
|
|
+</P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><BR>
|
|
|
|
|
+</P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-bottom: 0in"><B>bool signal(int
|
|
|
|
|
+aStatus)</B></P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in">Signals
|
|
|
|
|
+completion of the event to the Status Request object, and passes a
|
|
|
|
|
+completion code, which could be interrogated later.
|
|
|
|
|
+</P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><B>Note:
|
|
|
|
|
+</B> passing a <B>negative</B> status code to the status request
|
|
|
|
|
+object is considered reporting an error condition, and will complete
|
|
|
|
|
+the status request regardless of how many outstanding signals it is
|
|
|
|
|
+still waiting for.
|
|
|
|
|
+</P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><B>Note</B>:
|
|
|
|
|
+only the latest status code is kept.</P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><BR>
|
|
|
|
|
+</P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-bottom: 0in"><B>bool signalComplete
|
|
|
|
|
+(int aStatus)</B></P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in">Signals
|
|
|
|
|
+completion of <B>ALL</B> events to the Status Request object, and
|
|
|
|
|
+passes a completion code, which could be interrogated later. The
|
|
|
|
|
+status request completes regardless of how many events it is still
|
|
|
|
|
+waiting on.
|
|
|
|
|
+</P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><BR>
|
|
|
|
|
+</P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-bottom: 0in"><B>bool pending() </B>
|
|
|
|
|
+</P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in">Returns
|
|
|
|
|
+<B>true</B> if status request is still waiting for event or events to
|
|
|
|
|
+happen.</P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><BR>
|
|
|
|
|
+</P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-bottom: 0in"><B>bool completed () </B>
|
|
|
|
|
+</P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in">Returns
|
|
|
|
|
+<B>true</B> if status has completed.</P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><BR>
|
|
|
|
|
+</P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-bottom: 0in"><B>int getStatus()</B></P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in">Returns
|
|
|
|
|
+the status code passed to the status request object by the <B>signal()
|
|
|
|
|
+</B>and <B>signalComplete() </B>methods.
|
|
|
|
|
+</P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in">Any
|
|
|
|
|
+<B>positive</B> number is considered a successful completion status.</P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in">A
|
|
|
|
|
+0 (zero) is considered a default successful completion status.</P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in">Any
|
|
|
|
|
+<B>negative</B> number is considered an error code and unsuccessful
|
|
|
|
|
+completion of a request.</P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><BR>
|
|
|
|
|
+</P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><BR>
|
|
|
|
|
+</P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><BR>
|
|
|
|
|
+</P>
|
|
|
<P CLASS="western" STYLE="margin-bottom: 0in; page-break-after: avoid">
|
|
<P CLASS="western" STYLE="margin-bottom: 0in; page-break-after: avoid">
|
|
|
<B>IMPLEMENTATION SCENARIOS AND IDEAS:</B></P>
|
|
<B>IMPLEMENTATION SCENARIOS AND IDEAS:</B></P>
|
|
|
<P CLASS="western" STYLE="margin-bottom: 0in"><BR>
|
|
<P CLASS="western" STYLE="margin-bottom: 0in"><BR>
|
|
@@ -971,12 +1144,26 @@ is the implementation using TaskScheduler </FONT>
|
|
|
</P>
|
|
</P>
|
|
|
<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><BR>
|
|
<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><BR>
|
|
|
</P>
|
|
</P>
|
|
|
-<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><FONT FACE="Courier New, monospace"><FONT SIZE=2><BR>#include
|
|
|
|
|
-<TaskScheduler.h><BR><BR>#define LEDPIN 13<BR><BR><BR>Scheduler
|
|
|
|
|
-ts;<BR></FONT></FONT><BR>
|
|
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><FONT FACE="Courier New, monospace"><FONT SIZE=2><BR></FONT></FONT><BR>
|
|
|
|
|
+</P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><FONT FACE="Courier New, monospace"><FONT SIZE=2>#define
|
|
|
|
|
+_TASK_SLEEP_ON_IDLE_RUN</FONT></FONT></P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><FONT FACE="Courier New, monospace"><FONT SIZE=2>#include
|
|
|
|
|
+<TaskScheduler.h></FONT></FONT></P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><BR>
|
|
|
|
|
+</P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><FONT FACE="Courier New, monospace"><FONT SIZE=2>#define
|
|
|
|
|
+ LEDPIN 13</FONT></FONT></P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><BR>
|
|
|
|
|
+</P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><BR>
|
|
|
|
|
+</P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><FONT FACE="Courier New, monospace"><FONT SIZE=2>Scheduler
|
|
|
|
|
+ts;</FONT></FONT></P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><BR>
|
|
|
</P>
|
|
</P>
|
|
|
<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><FONT FACE="Courier New, monospace"><FONT SIZE=2>Task
|
|
<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><FONT FACE="Courier New, monospace"><FONT SIZE=2>Task
|
|
|
-tWrapper(30000L, -1, &WrapperCallback, &ts, true);</FONT></FONT></P>
|
|
|
|
|
|
|
+tWrapper(30000, -1, &WrapperCallback, &ts, true);</FONT></FONT></P>
|
|
|
<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><FONT FACE="Courier New, monospace"><FONT SIZE=2>Task
|
|
<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><FONT FACE="Courier New, monospace"><FONT SIZE=2>Task
|
|
|
tBlink(5000, 1, NULL, &ts, false, &BlinkOnEnable,
|
|
tBlink(5000, 1, NULL, &ts, false, &BlinkOnEnable,
|
|
|
&BlinkOnDisable);</FONT></FONT></P>
|
|
&BlinkOnDisable);</FONT></FONT></P>
|
|
@@ -986,12 +1173,16 @@ tLED(0, -1, NULL, &ts, false, NULL, &LEDOff);</FONT></FONT></P>
|
|
|
</P>
|
|
</P>
|
|
|
<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><FONT FACE="Courier New, monospace"><FONT SIZE=2>void
|
|
<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><FONT FACE="Courier New, monospace"><FONT SIZE=2>void
|
|
|
WrapperCallback() {</FONT></FONT></P>
|
|
WrapperCallback() {</FONT></FONT></P>
|
|
|
-<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><FONT FACE="Courier New, monospace"><FONT SIZE=2> tBlink.restartDelayed();
|
|
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in">
|
|
|
|
|
+<FONT FACE="Courier New, monospace"><FONT SIZE=2>Serial.println("In
|
|
|
|
|
+WrapperCallback");</FONT></FONT></P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in">
|
|
|
|
|
+<FONT FACE="Courier New, monospace"><FONT SIZE=2>tBlink.restartDelayed();
|
|
|
// LED blinking is initiated </FONT></FONT>
|
|
// LED blinking is initiated </FONT></FONT>
|
|
|
</P>
|
|
</P>
|
|
|
<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in">
|
|
<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in">
|
|
|
-<FONT FACE="Courier New, monospace"><FONT SIZE=2> //every 30
|
|
|
|
|
-seconds for 5 seconds</FONT></FONT></P>
|
|
|
|
|
|
|
+ <FONT FACE="Courier New, monospace"><FONT SIZE=2>//every
|
|
|
|
|
+30 seconds for 5 seconds</FONT></FONT></P>
|
|
|
<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><FONT FACE="Courier New, monospace"><FONT SIZE=2>}</FONT></FONT></P>
|
|
<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><FONT FACE="Courier New, monospace"><FONT SIZE=2>}</FONT></FONT></P>
|
|
|
<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><BR>
|
|
<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><BR>
|
|
|
</P>
|
|
</P>
|
|
@@ -1005,15 +1196,22 @@ and enable LED blinking task, which actually controls</FONT></FONT></P>
|
|
|
the hardware (LED in this example)</FONT></FONT></P>
|
|
the hardware (LED in this example)</FONT></FONT></P>
|
|
|
<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><FONT FACE="Courier New, monospace"><FONT SIZE=2>bool
|
|
<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><FONT FACE="Courier New, monospace"><FONT SIZE=2>bool
|
|
|
BlinkOnEnable() {</FONT></FONT></P>
|
|
BlinkOnEnable() {</FONT></FONT></P>
|
|
|
-<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><FONT FACE="Courier New, monospace"><FONT SIZE=2> tLED.setInterval(
|
|
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in">
|
|
|
|
|
+<FONT FACE="Courier New, monospace"><FONT SIZE=2>Serial.println("In
|
|
|
|
|
+BlinkOnEnable");</FONT></FONT></P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in">
|
|
|
|
|
+<FONT FACE="Courier New, monospace"><FONT SIZE=2>tLED.setInterval(
|
|
|
500 + random(501) );</FONT></FONT></P>
|
|
500 + random(501) );</FONT></FONT></P>
|
|
|
-<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><FONT FACE="Courier New, monospace"><FONT SIZE=2> tLED.setCallback(
|
|
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in">
|
|
|
|
|
+<FONT FACE="Courier New, monospace"><FONT SIZE=2>tLED.setCallback(
|
|
|
&LEDOn);</FONT></FONT></P>
|
|
&LEDOn);</FONT></FONT></P>
|
|
|
-<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><FONT FACE="Courier New, monospace"><FONT SIZE=2> tLED.enable();</FONT></FONT></P>
|
|
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in">
|
|
|
|
|
+<FONT FACE="Courier New, monospace"><FONT SIZE=2>tLED.enable();</FONT></FONT></P>
|
|
|
<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><BR>
|
|
<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><BR>
|
|
|
</P>
|
|
</P>
|
|
|
-<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><FONT FACE="Courier New, monospace"><FONT SIZE=2> return
|
|
|
|
|
-true; // Task should be enabled</FONT></FONT></P>
|
|
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in">
|
|
|
|
|
+<FONT FACE="Courier New, monospace"><FONT SIZE=2>return true; //
|
|
|
|
|
+Task should be enabled</FONT></FONT></P>
|
|
|
<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><FONT FACE="Courier New, monospace"><FONT SIZE=2>}</FONT></FONT></P>
|
|
<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><FONT FACE="Courier New, monospace"><FONT SIZE=2>}</FONT></FONT></P>
|
|
|
<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><BR>
|
|
<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><BR>
|
|
|
</P>
|
|
</P>
|
|
@@ -1033,24 +1231,38 @@ thus executing its OnDisable method below.</FONT></FONT></P>
|
|
|
</P>
|
|
</P>
|
|
|
<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><FONT FACE="Courier New, monospace"><FONT SIZE=2>void
|
|
<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><FONT FACE="Courier New, monospace"><FONT SIZE=2>void
|
|
|
BlinkOnDisable() {</FONT></FONT></P>
|
|
BlinkOnDisable() {</FONT></FONT></P>
|
|
|
-<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><FONT FACE="Courier New, monospace"><FONT SIZE=2> tLED.disable();</FONT></FONT></P>
|
|
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in">
|
|
|
|
|
+<FONT FACE="Courier New, monospace"><FONT SIZE=2>Serial.println("In
|
|
|
|
|
+BlinkOnDisable");</FONT></FONT></P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in">
|
|
|
|
|
+<FONT FACE="Courier New, monospace"><FONT SIZE=2>tLED.disable();</FONT></FONT></P>
|
|
|
<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><FONT FACE="Courier New, monospace"><FONT SIZE=2>}</FONT></FONT></P>
|
|
<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><FONT FACE="Courier New, monospace"><FONT SIZE=2>}</FONT></FONT></P>
|
|
|
<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><BR>
|
|
<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><BR>
|
|
|
</P>
|
|
</P>
|
|
|
<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><FONT FACE="Courier New, monospace"><FONT SIZE=2>void
|
|
<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><FONT FACE="Courier New, monospace"><FONT SIZE=2>void
|
|
|
LEDOn () {</FONT></FONT></P>
|
|
LEDOn () {</FONT></FONT></P>
|
|
|
-<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><FONT FACE="Courier New, monospace"><FONT SIZE=2> digitalWrite(LEDPIN,
|
|
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in">
|
|
|
|
|
+<FONT FACE="Courier New, monospace"><FONT SIZE=2>Serial.println("In
|
|
|
|
|
+LEDOn");</FONT></FONT></P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in">
|
|
|
|
|
+<FONT FACE="Courier New, monospace"><FONT SIZE=2>digitalWrite(LEDPIN,
|
|
|
HIGH);</FONT></FONT></P>
|
|
HIGH);</FONT></FONT></P>
|
|
|
-<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><FONT FACE="Courier New, monospace"><FONT SIZE=2> tLED.setCallback(
|
|
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in">
|
|
|
|
|
+<FONT FACE="Courier New, monospace"><FONT SIZE=2>tLED.setCallback(
|
|
|
&LEDOff);</FONT></FONT></P>
|
|
&LEDOff);</FONT></FONT></P>
|
|
|
<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><FONT FACE="Courier New, monospace"><FONT SIZE=2>}</FONT></FONT></P>
|
|
<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><FONT FACE="Courier New, monospace"><FONT SIZE=2>}</FONT></FONT></P>
|
|
|
<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><BR>
|
|
<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><BR>
|
|
|
</P>
|
|
</P>
|
|
|
<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><FONT FACE="Courier New, monospace"><FONT SIZE=2>void
|
|
<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><FONT FACE="Courier New, monospace"><FONT SIZE=2>void
|
|
|
LEDOff () {</FONT></FONT></P>
|
|
LEDOff () {</FONT></FONT></P>
|
|
|
-<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><FONT FACE="Courier New, monospace"><FONT SIZE=2> digitalWrite(LEDPIN,
|
|
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in">
|
|
|
|
|
+<FONT FACE="Courier New, monospace"><FONT SIZE=2>Serial.println("In
|
|
|
|
|
+LEDOff");</FONT></FONT></P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in">
|
|
|
|
|
+<FONT FACE="Courier New, monospace"><FONT SIZE=2>digitalWrite(LEDPIN,
|
|
|
LOW);</FONT></FONT></P>
|
|
LOW);</FONT></FONT></P>
|
|
|
-<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><FONT FACE="Courier New, monospace"><FONT SIZE=2> tLED.setCallback(
|
|
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in">
|
|
|
|
|
+<FONT FACE="Courier New, monospace"><FONT SIZE=2>tLED.setCallback(
|
|
|
&LEDOn);</FONT></FONT></P>
|
|
&LEDOn);</FONT></FONT></P>
|
|
|
<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><FONT FACE="Courier New, monospace"><FONT SIZE=2>}</FONT></FONT></P>
|
|
<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><FONT FACE="Courier New, monospace"><FONT SIZE=2>}</FONT></FONT></P>
|
|
|
<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><BR>
|
|
<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><BR>
|
|
@@ -1064,12 +1276,412 @@ task finishes (or disabled ahead of time)</FONT></FONT></P>
|
|
|
<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><BR>
|
|
<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><BR>
|
|
|
</P>
|
|
</P>
|
|
|
<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><FONT FACE="Courier New, monospace"><FONT SIZE=2>void
|
|
<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><FONT FACE="Courier New, monospace"><FONT SIZE=2>void
|
|
|
-setup() {<BR> // put your setup code here, to run once:<BR>}<BR><BR>void
|
|
|
|
|
-loop() {<BR> // put your main code here, to run repeatedly:<BR>
|
|
|
|
|
-ts.execute();<BR>}</FONT></FONT></P>
|
|
|
|
|
|
|
+setup() {</FONT></FONT></P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><BR>
|
|
|
|
|
+</P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in">
|
|
|
|
|
+<FONT FACE="Courier New, monospace"><FONT SIZE=2>Serial.begin(115200);
|
|
|
|
|
+</FONT></FONT>
|
|
|
|
|
+</P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in">
|
|
|
|
|
+<FONT FACE="Courier New, monospace"><FONT SIZE=2>pinMode(LEDPIN,
|
|
|
|
|
+OUTPUT); </FONT></FONT>
|
|
|
|
|
+</P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><FONT FACE="Courier New, monospace"><FONT SIZE=2>}</FONT></FONT></P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><BR>
|
|
|
|
|
+</P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><FONT FACE="Courier New, monospace"><FONT SIZE=2>void
|
|
|
|
|
+loop() {</FONT></FONT></P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in">
|
|
|
|
|
+<FONT FACE="Courier New, monospace"><FONT SIZE=2>// put your main
|
|
|
|
|
+code here, to run repeatedly:</FONT></FONT></P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><BR>
|
|
|
|
|
+</P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in">
|
|
|
|
|
+<FONT FACE="Courier New, monospace"><FONT SIZE=2>ts.execute();</FONT></FONT></P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><FONT FACE="Courier New, monospace"><FONT SIZE=2>}</FONT></FONT></P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><BR>
|
|
|
|
|
+</P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><BR>
|
|
|
|
|
+</P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><BR>
|
|
|
|
|
+</P>
|
|
|
|
|
+<OL START=3>
|
|
|
|
|
+ <LI><P CLASS="western" STYLE="margin-bottom: 0in"><FONT FACE="Times New Roman, serif"><B>USING
|
|
|
|
|
+ STATUS REQUEST OBJECTS </B></FONT>
|
|
|
|
|
+ </P>
|
|
|
|
|
+</OL>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><BR>
|
|
|
|
|
+</P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><FONT FACE="Times New Roman, serif"><FONT SIZE=2 STYLE="font-size: 11pt">This
|
|
|
|
|
+test emulates querying 3 sensors once every 10 seconds, each could
|
|
|
|
|
+respond with a different delay (ultrasonic sensors for instance) and
|
|
|
|
|
+printing a min value of the three when all three have reported their
|
|
|
|
|
+values.</FONT></FONT></P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><BR>
|
|
|
|
|
+</P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><FONT FACE="Times New Roman, serif"><FONT SIZE=2 STYLE="font-size: 11pt">The
|
|
|
|
|
+overall timeout of 1 second is setup as well.</FONT></FONT></P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><FONT FACE="Times New Roman, serif"><FONT SIZE=2 STYLE="font-size: 11pt">An
|
|
|
|
|
+error message needs to be printed if a timeout occurred instead of a
|
|
|
|
|
+value.</FONT></FONT></P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in">
|
|
|
|
|
+</P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><BR>
|
|
|
|
|
+</P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><BR>
|
|
|
|
|
+</P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><FONT FACE="Courier New, monospace"><FONT SIZE=2>#define
|
|
|
|
|
+_TASK_SLEEP_ON_IDLE_RUN</FONT></FONT></P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><FONT FACE="Courier New, monospace"><FONT SIZE=2>#define
|
|
|
|
|
+_TASK_STATUS_REQUEST</FONT></FONT></P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><BR>
|
|
|
|
|
+</P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><FONT FACE="Courier New, monospace"><FONT SIZE=2>#include
|
|
|
|
|
+<TaskScheduler.h></FONT></FONT></P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><BR>
|
|
|
|
|
+</P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><FONT FACE="Courier New, monospace"><FONT SIZE=2>StatusRequest
|
|
|
|
|
+measure;</FONT></FONT></P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><BR>
|
|
|
|
|
+</P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><FONT FACE="Courier New, monospace"><FONT SIZE=2>Scheduler
|
|
|
|
|
+ts; </FONT></FONT>
|
|
|
|
|
+</P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><BR>
|
|
|
|
|
+</P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><FONT FACE="Courier New, monospace"><FONT SIZE=2>Task
|
|
|
|
|
+tCycle(10000, -1, &CycleCallback, &ts, true);</FONT></FONT></P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><FONT FACE="Courier New, monospace"><FONT SIZE=2>Task
|
|
|
|
|
+tMeasure(1000, 1, &MeasureCallback, &ts, false,
|
|
|
|
|
+&MeasureEnable, &MeasureDisable);</FONT></FONT></P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><FONT FACE="Courier New, monospace"><FONT SIZE=2>Task
|
|
|
|
|
+tCalculate(&CalcCallback, &ts);</FONT></FONT></P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><FONT FACE="Courier New, monospace"><FONT SIZE=2>Task
|
|
|
|
|
+tSensor1(0, 1, &S1Callback, &ts, false, &S1Enable);</FONT></FONT></P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><FONT FACE="Courier New, monospace"><FONT SIZE=2>Task
|
|
|
|
|
+tSensor2(0, 1, &S2Callback, &ts, false, &S2Enable);</FONT></FONT></P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><FONT FACE="Courier New, monospace"><FONT SIZE=2>Task
|
|
|
|
|
+tSensor3(0, 1, &S3Callback, &ts, false, &S3Enable);</FONT></FONT></P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><BR>
|
|
|
|
|
+</P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><BR>
|
|
|
|
|
+</P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><FONT FACE="Courier New, monospace"><FONT SIZE=2>long
|
|
|
|
|
+distance, d1, d2, d3;</FONT></FONT></P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><BR>
|
|
|
|
|
+</P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><FONT FACE="Courier New, monospace"><FONT SIZE=2>void
|
|
|
|
|
+CycleCallback() {</FONT></FONT></P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in">
|
|
|
|
|
+<FONT FACE="Courier New, monospace"><FONT SIZE=2>Serial.println("CycleCallback:
|
|
|
|
|
+Initiating measurement cycle every 10 seconds");</FONT></FONT></P>
|
|
|
<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><BR>
|
|
<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><BR>
|
|
|
</P>
|
|
</P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in">
|
|
|
|
|
+<FONT FACE="Courier New, monospace"><FONT SIZE=2>tMeasure.restartDelayed();</FONT></FONT></P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><FONT FACE="Courier New, monospace"><FONT SIZE=2>}</FONT></FONT></P>
|
|
|
<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><BR>
|
|
<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><BR>
|
|
|
</P>
|
|
</P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><BR>
|
|
|
|
|
+</P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><BR>
|
|
|
|
|
+</P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><FONT FACE="Courier New, monospace"><FONT SIZE=2>bool
|
|
|
|
|
+MeasureEnable() {</FONT></FONT></P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in">
|
|
|
|
|
+<FONT FACE="Courier New, monospace"><FONT SIZE=2>Serial.println("MeasureEnable:
|
|
|
|
|
+Activating sensors"); </FONT></FONT>
|
|
|
|
|
+</P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><BR>
|
|
|
|
|
+</P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in">
|
|
|
|
|
+<FONT FACE="Courier New, monospace"><FONT SIZE=2>distance = 0;</FONT></FONT></P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in">
|
|
|
|
|
+<FONT FACE="Courier New, monospace"><FONT SIZE=2>measure.setWaiting(3);
|
|
|
|
|
+// Set the StatusRequest to wait for 3 signals. </FONT></FONT>
|
|
|
|
|
+</P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in">
|
|
|
|
|
+<FONT FACE="Courier New, monospace"><FONT SIZE=2>tCalculate.waitFor(&measure);</FONT></FONT></P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><BR>
|
|
|
|
|
+</P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in">
|
|
|
|
|
+<FONT FACE="Courier New, monospace"><FONT SIZE=2>tSensor1.restart();</FONT></FONT></P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in">
|
|
|
|
|
+<FONT FACE="Courier New, monospace"><FONT SIZE=2>tSensor2.restart();</FONT></FONT></P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in">
|
|
|
|
|
+<FONT FACE="Courier New, monospace"><FONT SIZE=2>tSensor3.restart();</FONT></FONT></P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><BR>
|
|
|
|
|
+</P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in">
|
|
|
|
|
+<FONT FACE="Courier New, monospace"><FONT SIZE=2>return true;</FONT></FONT></P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><FONT FACE="Courier New, monospace"><FONT SIZE=2>}</FONT></FONT></P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><BR>
|
|
|
|
|
+</P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><FONT FACE="Courier New, monospace"><FONT SIZE=2>void
|
|
|
|
|
+MeasureCallback() {</FONT></FONT></P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in">
|
|
|
|
|
+<FONT FACE="Courier New, monospace"><FONT SIZE=2>Serial.println("MeasureCallback:
|
|
|
|
|
+Invoked by calculate task or one second later"); </FONT></FONT>
|
|
|
|
|
+</P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><BR>
|
|
|
|
|
+</P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in">
|
|
|
|
|
+<FONT FACE="Courier New, monospace"><FONT SIZE=2>if
|
|
|
|
|
+(measure.pending()) {</FONT></FONT></P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in">
|
|
|
|
|
+ <FONT FACE="Courier New, monospace"><FONT SIZE=2>tCalculate.disable();</FONT></FONT></P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in">
|
|
|
|
|
+ <FONT FACE="Courier New, monospace"><FONT SIZE=2>measure.signalComplete(-1);
|
|
|
|
|
+ // signal error</FONT></FONT></P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in">
|
|
|
|
|
+ <FONT FACE="Courier New, monospace"><FONT SIZE=2>Serial.println("MeasureCallback:
|
|
|
|
|
+Timeout!");</FONT></FONT></P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in">
|
|
|
|
|
+<FONT FACE="Courier New, monospace"><FONT SIZE=2>}</FONT></FONT></P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in">
|
|
|
|
|
+<FONT FACE="Courier New, monospace"><FONT SIZE=2>else {</FONT></FONT></P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in">
|
|
|
|
|
+ <FONT FACE="Courier New, monospace"><FONT SIZE=2>Serial.print("MeasureCallback:
|
|
|
|
|
+Min distance=");Serial.println(distance);</FONT></FONT></P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in">
|
|
|
|
|
+<FONT FACE="Courier New, monospace"><FONT SIZE=2>}</FONT></FONT></P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><FONT FACE="Courier New, monospace"><FONT SIZE=2>}</FONT></FONT></P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><BR>
|
|
|
|
|
+</P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><FONT FACE="Courier New, monospace"><FONT SIZE=2>void
|
|
|
|
|
+MeasureDisable() {</FONT></FONT></P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in">
|
|
|
|
|
+<FONT FACE="Courier New, monospace"><FONT SIZE=2>Serial.println("MeasureDisable:
|
|
|
|
|
+Cleaning up"); </FONT></FONT>
|
|
|
|
|
+</P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in">
|
|
|
|
|
+</P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in">
|
|
|
|
|
+<FONT FACE="Courier New, monospace"><FONT SIZE=2>tSensor1.disable();</FONT></FONT></P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in">
|
|
|
|
|
+<FONT FACE="Courier New, monospace"><FONT SIZE=2>tSensor2.disable();</FONT></FONT></P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in">
|
|
|
|
|
+<FONT FACE="Courier New, monospace"><FONT SIZE=2>tSensor3.disable();</FONT></FONT></P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><FONT FACE="Courier New, monospace"><FONT SIZE=2>}</FONT></FONT></P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><BR>
|
|
|
|
|
+</P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><BR>
|
|
|
|
|
+</P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><FONT FACE="Courier New, monospace"><FONT SIZE=2>void
|
|
|
|
|
+CalcCallback() {</FONT></FONT></P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in">
|
|
|
|
|
+<FONT FACE="Courier New, monospace"><FONT SIZE=2>Serial.println("CalcCallback:
|
|
|
|
|
+calculating"); </FONT></FONT>
|
|
|
|
|
+</P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in">
|
|
|
|
|
+<FONT FACE="Courier New, monospace"><FONT SIZE=2>distance = -1;</FONT></FONT></P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in">
|
|
|
|
|
+<FONT FACE="Courier New, monospace"><FONT SIZE=2>if (
|
|
|
|
|
+measure.getStatus() >= 0) { // only calculate if statusrequest
|
|
|
|
|
+ended successfully</FONT></FONT></P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in">
|
|
|
|
|
+ <FONT FACE="Courier New, monospace"><FONT SIZE=2>distance = d1 <
|
|
|
|
|
+d2 ? d1 : d2;</FONT></FONT></P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in">
|
|
|
|
|
+ <FONT FACE="Courier New, monospace"><FONT SIZE=2>distance = d3 <
|
|
|
|
|
+distance ? d3 : distance;</FONT></FONT></P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in">
|
|
|
|
|
+ <FONT FACE="Courier New, monospace"><FONT SIZE=2>tMeasure.forceNextIteration();</FONT></FONT></P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in">
|
|
|
|
|
+<FONT FACE="Courier New, monospace"><FONT SIZE=2>}</FONT></FONT></P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><FONT FACE="Courier New, monospace"><FONT SIZE=2>}</FONT></FONT></P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><BR>
|
|
|
|
|
+</P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><BR>
|
|
|
|
|
+</P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><FONT FACE="Courier New, monospace"><FONT SIZE=2>/**
|
|
|
|
|
+Simulation code for sensor 1</FONT></FONT></P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"> <FONT FACE="Courier New, monospace"><FONT SIZE=2>*
|
|
|
|
|
+ ----------------------------</FONT></FONT></P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in">
|
|
|
|
|
+<FONT FACE="Courier New, monospace"><FONT SIZE=2>*/</FONT></FONT></P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><FONT FACE="Courier New, monospace"><FONT SIZE=2>bool
|
|
|
|
|
+S1Enable() {</FONT></FONT></P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in">
|
|
|
|
|
+<FONT FACE="Courier New, monospace"><FONT SIZE=2>Serial.print("S1Enable:
|
|
|
|
|
+Triggering sensor1. Delay="); </FONT></FONT>
|
|
|
|
|
+</P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><BR>
|
|
|
|
|
+</P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in">
|
|
|
|
|
+<FONT FACE="Courier New, monospace"><FONT SIZE=2>tSensor1.setInterval(
|
|
|
|
|
+random(1200) ); // Simulating sensor delay, which could go over 1
|
|
|
|
|
+second and cause timeout</FONT></FONT></P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in">
|
|
|
|
|
+<FONT FACE="Courier New, monospace"><FONT SIZE=2>d1 = 0;</FONT></FONT></P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in">
|
|
|
|
|
+</P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in">
|
|
|
|
|
+<FONT FACE="Courier New, monospace"><FONT SIZE=2>Serial.println(
|
|
|
|
|
+tSensor1.getInterval() );</FONT></FONT></P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in">
|
|
|
|
|
+<FONT FACE="Courier New, monospace"><FONT SIZE=2>return true;</FONT></FONT></P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><FONT FACE="Courier New, monospace"><FONT SIZE=2>}</FONT></FONT></P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><BR>
|
|
|
|
|
+</P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><FONT FACE="Courier New, monospace"><FONT SIZE=2>void
|
|
|
|
|
+S1Callback() {</FONT></FONT></P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in">
|
|
|
|
|
+<FONT FACE="Courier New, monospace"><FONT SIZE=2>Serial.print("S1Callback:
|
|
|
|
|
+Emulating measurement. d1="); </FONT></FONT>
|
|
|
|
|
+</P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in">
|
|
|
|
|
+<FONT FACE="Courier New, monospace"><FONT SIZE=2>d1 = random(501); //
|
|
|
|
|
+pick a value from 0 to 500 "centimeters" simulating a
|
|
|
|
|
+measurement </FONT></FONT>
|
|
|
|
|
+</P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in">
|
|
|
|
|
+<FONT FACE="Courier New, monospace"><FONT SIZE=2>measure.signal();</FONT></FONT></P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in">
|
|
|
|
|
+</P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in">
|
|
|
|
|
+<FONT FACE="Courier New, monospace"><FONT SIZE=2>Serial.println(d1); </FONT></FONT>
|
|
|
|
|
+</P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><FONT FACE="Courier New, monospace"><FONT SIZE=2>}</FONT></FONT></P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><BR>
|
|
|
|
|
+</P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><BR>
|
|
|
|
|
+</P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><FONT FACE="Courier New, monospace"><FONT SIZE=2>/**
|
|
|
|
|
+Simulation code for sensor 2</FONT></FONT></P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"> <FONT FACE="Courier New, monospace"><FONT SIZE=2>*
|
|
|
|
|
+ ----------------------------</FONT></FONT></P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in">
|
|
|
|
|
+<FONT FACE="Courier New, monospace"><FONT SIZE=2>*/</FONT></FONT></P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><FONT FACE="Courier New, monospace"><FONT SIZE=2>bool
|
|
|
|
|
+S2Enable() {</FONT></FONT></P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in">
|
|
|
|
|
+<FONT FACE="Courier New, monospace"><FONT SIZE=2>Serial.print("S2Enable:
|
|
|
|
|
+Triggering sensor2. Delay="); </FONT></FONT>
|
|
|
|
|
+</P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><BR>
|
|
|
|
|
+</P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in">
|
|
|
|
|
+<FONT FACE="Courier New, monospace"><FONT SIZE=2>tSensor2.setInterval(
|
|
|
|
|
+random(1200) ); // Simulating sensor delay, which could go over 1
|
|
|
|
|
+second and cause timeout</FONT></FONT></P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in">
|
|
|
|
|
+<FONT FACE="Courier New, monospace"><FONT SIZE=2>d2 = 0;</FONT></FONT></P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><BR>
|
|
|
|
|
+</P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in">
|
|
|
|
|
+<FONT FACE="Courier New, monospace"><FONT SIZE=2>Serial.println(
|
|
|
|
|
+tSensor2.getInterval() );</FONT></FONT></P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in">
|
|
|
|
|
+<FONT FACE="Courier New, monospace"><FONT SIZE=2>return true;</FONT></FONT></P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><FONT FACE="Courier New, monospace"><FONT SIZE=2>}</FONT></FONT></P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><BR>
|
|
|
|
|
+</P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><FONT FACE="Courier New, monospace"><FONT SIZE=2>void
|
|
|
|
|
+S2Callback() {</FONT></FONT></P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in">
|
|
|
|
|
+<FONT FACE="Courier New, monospace"><FONT SIZE=2>Serial.print("S2Callback:
|
|
|
|
|
+Emulating measurement. d2="); </FONT></FONT>
|
|
|
|
|
+</P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in">
|
|
|
|
|
+<FONT FACE="Courier New, monospace"><FONT SIZE=2>d2 = random(501); //
|
|
|
|
|
+pick a value from 0 to 500 "centimeters" simulating a
|
|
|
|
|
+measurement</FONT></FONT></P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in">
|
|
|
|
|
+<FONT FACE="Courier New, monospace"><FONT SIZE=2>measure.signal();</FONT></FONT></P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><BR>
|
|
|
|
|
+</P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in">
|
|
|
|
|
+<FONT FACE="Courier New, monospace"><FONT SIZE=2>Serial.println(d2);
|
|
|
|
|
+</FONT></FONT>
|
|
|
|
|
+</P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><FONT FACE="Courier New, monospace"><FONT SIZE=2>}</FONT></FONT></P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><BR>
|
|
|
|
|
+</P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><BR>
|
|
|
|
|
+</P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><FONT FACE="Courier New, monospace"><FONT SIZE=2>/**
|
|
|
|
|
+Simulation code for sensor 3</FONT></FONT></P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"> <FONT FACE="Courier New, monospace"><FONT SIZE=2>*
|
|
|
|
|
+ ----------------------------</FONT></FONT></P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in">
|
|
|
|
|
+<FONT FACE="Courier New, monospace"><FONT SIZE=2>*/</FONT></FONT></P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><FONT FACE="Courier New, monospace"><FONT SIZE=2>bool
|
|
|
|
|
+S3Enable() {</FONT></FONT></P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in">
|
|
|
|
|
+<FONT FACE="Courier New, monospace"><FONT SIZE=2>Serial.print("S3Enable:
|
|
|
|
|
+Triggering sensor3. Delay="); </FONT></FONT>
|
|
|
|
|
+</P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><BR>
|
|
|
|
|
+</P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in">
|
|
|
|
|
+<FONT FACE="Courier New, monospace"><FONT SIZE=2>tSensor3.setInterval(
|
|
|
|
|
+random(1200) ); // Simulating sensor delay, which could go over 1
|
|
|
|
|
+second and cause timeout</FONT></FONT></P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in">
|
|
|
|
|
+<FONT FACE="Courier New, monospace"><FONT SIZE=2>d3 = 0;</FONT></FONT></P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><BR>
|
|
|
|
|
+</P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in">
|
|
|
|
|
+<FONT FACE="Courier New, monospace"><FONT SIZE=2>Serial.println(
|
|
|
|
|
+tSensor3.getInterval() );</FONT></FONT></P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in">
|
|
|
|
|
+<FONT FACE="Courier New, monospace"><FONT SIZE=2>return true;</FONT></FONT></P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><FONT FACE="Courier New, monospace"><FONT SIZE=2>}</FONT></FONT></P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><BR>
|
|
|
|
|
+</P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><FONT FACE="Courier New, monospace"><FONT SIZE=2>void
|
|
|
|
|
+S3Callback() {</FONT></FONT></P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in">
|
|
|
|
|
+<FONT FACE="Courier New, monospace"><FONT SIZE=2>Serial.print("S3Callback:
|
|
|
|
|
+Emulating measurement. d3="); </FONT></FONT>
|
|
|
|
|
+</P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in">
|
|
|
|
|
+<FONT FACE="Courier New, monospace"><FONT SIZE=2>d3 = random(501); //
|
|
|
|
|
+pick a value from 0 to 500 "centimeters" simulating a
|
|
|
|
|
+measurement</FONT></FONT></P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in">
|
|
|
|
|
+<FONT FACE="Courier New, monospace"><FONT SIZE=2>measure.signal();</FONT></FONT></P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in">
|
|
|
|
|
+</P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in">
|
|
|
|
|
+<FONT FACE="Courier New, monospace"><FONT SIZE=2>Serial.println(d3); </FONT></FONT>
|
|
|
|
|
+</P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><FONT FACE="Courier New, monospace"><FONT SIZE=2>}</FONT></FONT></P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><BR>
|
|
|
|
|
+</P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><BR>
|
|
|
|
|
+</P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><FONT FACE="Courier New, monospace"><FONT SIZE=2>/**
|
|
|
|
|
+Main Arduino code</FONT></FONT></P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"> <FONT FACE="Courier New, monospace"><FONT SIZE=2>*
|
|
|
|
|
+ Not much is left here - everything is taken care of by the framework</FONT></FONT></P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in">
|
|
|
|
|
+<FONT FACE="Courier New, monospace"><FONT SIZE=2>*/</FONT></FONT></P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><FONT FACE="Courier New, monospace"><FONT SIZE=2>void
|
|
|
|
|
+setup() {</FONT></FONT></P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><BR>
|
|
|
|
|
+</P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in">
|
|
|
|
|
+<FONT FACE="Courier New, monospace"><FONT SIZE=2>Serial.begin(115200);</FONT></FONT></P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in">
|
|
|
|
|
+<FONT FACE="Courier New, monospace"><FONT SIZE=2>Serial.println("TaskScheduler
|
|
|
|
|
+StatusRequest Sensor Emulation Test. Complex Test."); </FONT></FONT>
|
|
|
|
|
+</P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in">
|
|
|
|
|
+<FONT FACE="Courier New, monospace"><FONT SIZE=2>randomSeed(analogRead(A1)+millis());</FONT></FONT></P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><FONT FACE="Courier New, monospace"><FONT SIZE=2>}</FONT></FONT></P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><BR>
|
|
|
|
|
+</P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><FONT FACE="Courier New, monospace"><FONT SIZE=2>void
|
|
|
|
|
+loop() {</FONT></FONT></P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in">
|
|
|
|
|
+</P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in">
|
|
|
|
|
+<FONT FACE="Courier New, monospace"><FONT SIZE=2>ts.execute();</FONT></FONT></P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><BR>
|
|
|
|
|
+</P>
|
|
|
|
|
+<P CLASS="western" STYLE="margin-left: 0.49in; margin-bottom: 0in"><FONT FACE="Courier New, monospace"><FONT SIZE=2>}</FONT></FONT></P>
|
|
|
</BODY>
|
|
</BODY>
|
|
|
</HTML>
|
|
</HTML>
|