Browse Source

v3.1.4 - example #25 added

Anatoli Arkhipenko 6 năm trước cách đây
mục cha
commit
c1e4e272db

+ 127 - 0
examples/Scheduler_example25_SCHEDULER_CHAIN/Scheduler_example25_SCHEDULER_CHAIN.ino

@@ -0,0 +1,127 @@
+/*
+    TaskScheduler Example #25
+
+    Create 10 random Tasks. Prints the entire chain.
+    Then executes chain once printing the remaining chain from currently active task
+    Deletes all tasks afterwards
+*/
+
+// #define _TASK_TIMECRITICAL      // Enable monitoring scheduling overruns
+#define _TASK_SLEEP_ON_IDLE_RUN // Enable 1 ms SLEEP_IDLE powerdowns between tasks if no callback methods were invoked during the pass
+// #define _TASK_STATUS_REQUEST    // Compile with support for StatusRequest functionality - triggering tasks on status change events in addition to time only
+#define _TASK_WDT_IDS           // Compile with support for wdt control points and task ids
+// #define _TASK_LTS_POINTER       // Compile with support for local task storage pointer
+// #define _TASK_PRIORITY          // Support for layered scheduling priority
+// #define _TASK_MICRO_RES         // Support for microsecond resolution
+// #define _TASK_STD_FUNCTION      // Support for std::function (ESP8266 and ESP32 ONLY)
+// #define _TASK_DEBUG             // Make all methods and variables public for debug purposes
+// #define _TASK_INLINE            // Make all methods "inline" - needed to support some multi-tab, multi-file implementations
+// #define _TASK_TIMEOUT           // Support for overall task timeout
+// #define _TASK_OO_CALLBACKS      // Support for dynamic callback method binding
+// #define _TASK_DEFINE_MILLIS     // Force forward declaration of millis() and micros() "C" style
+#define _TASK_EXPOSE_CHAIN      // Methods to access tasks in the task chain
+
+#include <TaskScheduler.h>
+#include <QueueArray.h>
+
+// Debug and Test options
+#define _DEBUG_
+//#define _TEST_
+
+#ifdef _DEBUG_
+#define _PP(a) Serial.print(a);
+#define _PL(a) Serial.println(a);
+#else
+#define _PP(a)
+#define _PL(a)
+#endif
+
+
+// Scheduler
+Scheduler ts;
+
+void taskCallback();
+void cleanUp();
+
+Task tManager(6000, TASK_ONCE, &cleanUp, &ts, false);
+/*
+  Scheduling defines:
+  TASK_MILLISECOND
+  TASK_SECOND
+  TASK_MINUTE
+  TASK_HOUR
+  TASK_IMMEDIATE
+  TASK_FOREVER
+  TASK_ONCE
+  TASK_NOTIMEOUT
+*/
+
+int noOfTasks = 10;
+QueueArray <Task*> toDelete;
+
+void setup() {
+  // put your setup code here, to run once:
+#if defined(_DEBUG_) || defined(_TEST_)
+  Serial.begin(115200);
+  delay(2000);
+  _PL("Scheduler Example: Expose Scheduler Task Chain"); _PL();
+#endif
+
+  _PL("Generating a random chain of tasks");
+  for (int i = 0; i < noOfTasks; i++) {
+    long p = random(100, 5001); // from 100 ms to 5 seconds
+    long j = random(1, 11); // from 1 to 10 iterations)
+    Task *t = new Task(p, j, &taskCallback, &ts, false);
+    _PP(F("Generated a new task:\t")); _PP(t->getId()); _PP(F("\tInt, Iter = \t"));
+    _PP(p); Serial.print(", "); _PL(j);
+    if ( random(1, 100) > 50 ) {
+      t->enable();
+    }
+    else {
+      t->enableDelayed();
+    }
+    toDelete.push(t);
+  }
+  _PL();
+  _PL("Printing the entire chain");
+  Task* f = ts.getFirstTask();
+  Task* l = ts.getLastTask();
+  while (f) {
+    _PP("Task #"); _PL(f->getId());
+    f = f->getNextTask();
+  }
+  _PL();
+  tManager.enableDelayed();
+}
+
+
+void loop() {
+  ts.execute();
+}
+
+
+void taskCallback() {
+  _PP(millis());
+  _PP(": taskCallback() of task #");
+  Task* t = ts.getCurrentTask();
+  t->disable();
+  _PL(t->getId());
+  Task* l = ts.getLastTask();
+  while (t) {
+    _PP("#"); _PP(t->getId());
+    if (t->getNextTask() != NULL) _PP("->");
+    t = t->getNextTask();
+  }
+  _PL(); _PL();
+}
+
+void cleanUp() {
+    _PL("Deleting tasks:");
+  do {
+    Task* t = toDelete.pop();
+    _PP("Deleting task #"); _PL(t->getId());
+    delete t;
+  } while (!toDelete.isEmpty());
+
+  for (;;) ;
+}