GithubHelp home page GithubHelp logo

esp8266scheduler's Introduction

Logo

Build Status arduino-library-badge

Quick Start

Installing

You can install through the Arduino Library Manager. The package name is ESP8266Scheduler.

Usage

Include the library in your sketch

#include <Scheduler.h>
#include <Task.h>
#include <LeanTask.h>

In your setup function start the scheduler

Scheduler.start(&task);

Scheduler.begin();

The scheduler blocks once begun, so the loop function is called by the scheduler BEFORE the first task is runned each time. But it is recommended to avoid using a loop.

Creating a Task

Tasks are classes that should inherit the Task class. A task can define a loop() and setup() function much as the normal Arduino standard.

class BlinkTask : public Task {
 protected:
  void setup() {
    state = HIGH;

    pinMode(2, OUTPUT);
    digitalWrite(2, state);
  }

  void loop() {
    state = state == HIGH ? LOW : HIGH;
    digitalWrite(2, state);

    delay(1000);
  }

private:
  uint8_t state;
} blink_task;

IMPORTANT: Tasks must be declared globally on the stack (not a pointer). Failure to do so will crash your device.

Tasks can run yield() and delay() like they normally would. These functions yield control to the scheduler rather than the ESP8266.

Creating a LeanTask

Lean tasks are classes that should inherit the LeanTask class. A lean task can define a loop() and setup() function much as the normal Arduino standard.

LeanTask doesn't use cont.h (runs in the global context), so yield() works exactly as it would without using the library. This can be useful for saving ram (4k) if the task does not use yield() to interrupt the task. You can use delay() at the end of a task to set the interval.

Good example:

class MemTask : public LeanTask {
 public:
  void loop() {
    Serial.print("Free Heap: ");
    Serial.print(ESP.getFreeHeap());
    Serial.println(" bytes");

    delay(10000);
  }
} mem_task;

Bad example. The first delay() does nothing:

Source. DO NOT DO THIS!

class PrintTask : public LeanTask {
 protected:
  void loop() {
    Serial.println("Print Loop Start");

    delay(5000);

    Serial.println("Print Loop End");

    delay(5000);
  }
} print_task;

Tasks can run yield() and delay() like they normally would. The yield() function transfers control to the ESP8266, NOT the scheduler. The delay() function will tell the scheduler that a delay is needed before the next run. If you REALLY need a delay, use ::delay(), but this will block the task and the scheduler.

Tests using Task vs LeanTask

All examples have the same logic. To optimize RAM, use LeanTask (if possible), because each instance of Task requires 4 kb of RAM.

File Description Free heap (more is better)
simple.ino 3 Task 39896 bytes
lean_simple.ino 1 Task, 2 LeanTask 48168 bytes
subfile_simple.ino 1 Task, 2 LeanTask + main loop 48136 bytes

heap_test.ino:

TASK_TYPE Description Free heap (more is better)
Task 12 Task + main loop 2280 bytes
LeanTask 12 LeanTask + main loop 51912 bytes

Task methods

bool AbstractTask::isEnabled();

Method return the status of the task: enabled (true) or disabled (false).


AbstractTask(bool _enabled = true, unsigned long _interval = 0);

Constructor.


bool AbstractTask::isEnabled();

Method return the status of the task: enabled (true) or disabled (false).


void AbstractTask::enable();

The method enable the task.


void AbstractTask::disable();

The method disable the task.


void AbstractTask::setInterval(unsigned long val);

The method sets the task run interval.


unsigned long AbstractTask::getInterval();

The method returns the task run interval.

Scheduler methods

static void SchedulerClass::start(AbstractTask *task);

Adds a task to the multitasking queue.


static void SchedulerClass::begin();

Starts the scheduler. This function is "blocking". It should be the last call the setup function.


static void SchedulerClass::delay(unsigned long ms);

Calls AbstractTask::delay() on the runned task from outside

IMPORTANT: You should not call this method outside for LeanTask tasks. It does not make sense.


static void SchedulerClass::yield();

Calls AbstractTask::yield() on the runned task from outside

IMPORTANT: You should not call this method outside for LeanTask tasks. It does not make sense.

esp8266scheduler's People

Contributors

chris685 avatar dbuezas avatar laxilef avatar mikefair avatar nrwiersma avatar per1234 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.