Add SimpleTimer library used for Retry-example
This commit is contained in:
@@ -0,0 +1,34 @@
|
|||||||
|
## SimpleTimer - A timer library for Arduino.
|
||||||
|
|
||||||
|
### Uploader
|
||||||
|
Derek Chafin
|
||||||
|
Jun 16, 2012
|
||||||
|
info<a href="http://www.google.com/recaptcha/mailhide/d?k=01OlINdKCVggEULcwNY4NTTg==&c=NuRwkCvdkiHnX97lENoQ4aUrQPIek0qZKoNXiOiv8uE=" onclick="window.open('http://www.google.com/recaptcha/mailhide/d?k\07501OlINdKCVggEULcwNY4NTTg\75\75\46c\75NuRwkCvdkiHnX97lENoQ4aUrQPIek0qZKoNXiOiv8uE\075', '', 'toolbar=0,scrollbars=0,location=0,statusbar=0,menubar=0,resizable=0,width=500,height=300'); return false;" title="Reveal this e-mail address">...</a>@gmail.com
|
||||||
|
|
||||||
|
###Disclaimer
|
||||||
|
I am pushing this library to github because I like git better than I like the Windows clipboard.
|
||||||
|
|
||||||
|
For reference this library can also be found at http://playground.arduino.cc/Code/SimpleTimer.
|
||||||
|
|
||||||
|
### Original Author
|
||||||
|
Marcello Romani
|
||||||
|
mrom<a href="http://www.google.com/recaptcha/mailhide/d?k=01OlINdKCVggEULcwNY4NTTg==&c=35t9v0kxxmeXywbgEkq2W9ogg7J-gbHsx2HD-cJD7Rc=" onclick="window.open('http://www.google.com/recaptcha/mailhide/d?k\07501OlINdKCVggEULcwNY4NTTg\75\75\46c\07535t9v0kxxmeXywbgEkq2W9ogg7J-gbHsx2HD-cJD7Rc\075', '', 'toolbar=0,scrollbars=0,location=0,statusbar=0,menubar=0,resizable=0,width=500,height=300'); return false;" title="Reveal this e-mail address">...</a>@ottotecnica.com
|
||||||
|
Copyright (c) 2010 OTTOTECNICA Italy
|
||||||
|
|
||||||
|
### License - GNU LGPL 2.1+
|
||||||
|
This library is free software; you can redistribute it
|
||||||
|
and/or modify it under the terms of the GNU Lesser
|
||||||
|
General Public License as published by the Free Software
|
||||||
|
Foundation; either version 2.1 of the License, or (at
|
||||||
|
your option) any later version.
|
||||||
|
|
||||||
|
This library is distributed in the hope that it will
|
||||||
|
be useful, but WITHOUT ANY WARRANTY; without even the
|
||||||
|
implied warranty of MERCHANTABILITY or FITNESS FOR A
|
||||||
|
PARTICULAR PURPOSE. See the GNU Lesser General Public
|
||||||
|
License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser
|
||||||
|
General Public License along with this library; if not,
|
||||||
|
write to the Free Software Foundation, Inc.,
|
||||||
|
51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
@@ -0,0 +1,224 @@
|
|||||||
|
/*
|
||||||
|
* SimpleTimer.cpp
|
||||||
|
*
|
||||||
|
* SimpleTimer - A timer library for Arduino.
|
||||||
|
* Author: mromani@ottotecnica.com
|
||||||
|
* Copyright (c) 2010 OTTOTECNICA Italy
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it
|
||||||
|
* and/or modify it under the terms of the GNU Lesser
|
||||||
|
* General Public License as published by the Free Software
|
||||||
|
* Foundation; either version 2.1 of the License, or (at
|
||||||
|
* your option) any later version.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will
|
||||||
|
* be useful, but WITHOUT ANY WARRANTY; without even the
|
||||||
|
* implied warranty of MERCHANTABILITY or FITNESS FOR A
|
||||||
|
* PARTICULAR PURPOSE. See the GNU Lesser General Public
|
||||||
|
* License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser
|
||||||
|
* General Public License along with this library; if not,
|
||||||
|
* write to the Free Software Foundation, Inc.,
|
||||||
|
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include "SimpleTimer.h"
|
||||||
|
|
||||||
|
|
||||||
|
SimpleTimer::SimpleTimer() {
|
||||||
|
unsigned long current_millis = millis();
|
||||||
|
|
||||||
|
for (int i = 0; i < MAX_TIMERS; i++) {
|
||||||
|
enabled[i] = false;
|
||||||
|
callbacks[i] = 0; // if the callback pointer is zero, the slot is free, i.e. doesn't "contain" any timer
|
||||||
|
prev_millis[i] = current_millis;
|
||||||
|
numRuns[i] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
numTimers = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void SimpleTimer::run() {
|
||||||
|
int i;
|
||||||
|
unsigned long current_millis;
|
||||||
|
|
||||||
|
// get current time
|
||||||
|
current_millis = millis();
|
||||||
|
|
||||||
|
for (i = 0; i < MAX_TIMERS; i++) {
|
||||||
|
|
||||||
|
toBeCalled[i] = DEFCALL_DONTRUN;
|
||||||
|
|
||||||
|
// no callback == no timer, i.e. jump over empty slots
|
||||||
|
if (callbacks[i]) {
|
||||||
|
|
||||||
|
// is it time to process this timer ?
|
||||||
|
if (current_millis - prev_millis[i] >= delays[i]) {
|
||||||
|
|
||||||
|
// update time
|
||||||
|
prev_millis[i] = current_millis;
|
||||||
|
|
||||||
|
// check if the timer callback has to be executed
|
||||||
|
if (enabled[i]) {
|
||||||
|
|
||||||
|
// "run forever" timers must always be executed
|
||||||
|
if (maxNumRuns[i] == RUN_FOREVER) {
|
||||||
|
toBeCalled[i] = DEFCALL_RUNONLY;
|
||||||
|
}
|
||||||
|
// other timers get executed the specified number of times
|
||||||
|
else if (numRuns[i] < maxNumRuns[i]) {
|
||||||
|
toBeCalled[i] = DEFCALL_RUNONLY;
|
||||||
|
numRuns[i]++;
|
||||||
|
|
||||||
|
// after the last run, delete the timer
|
||||||
|
if (numRuns[i] >= maxNumRuns[i]) {
|
||||||
|
toBeCalled[i] = DEFCALL_RUNANDDEL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < MAX_TIMERS; i++) {
|
||||||
|
switch(toBeCalled[i]) {
|
||||||
|
case DEFCALL_DONTRUN:
|
||||||
|
break;
|
||||||
|
|
||||||
|
case DEFCALL_RUNONLY:
|
||||||
|
(*callbacks[i])();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case DEFCALL_RUNANDDEL:
|
||||||
|
(*callbacks[i])();
|
||||||
|
deleteTimer(i);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// find the first available slot
|
||||||
|
// return -1 if none found
|
||||||
|
int SimpleTimer::findFirstFreeSlot() {
|
||||||
|
int i;
|
||||||
|
|
||||||
|
// all slots are used
|
||||||
|
if (numTimers >= MAX_TIMERS) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// return the first slot with no callback (i.e. free)
|
||||||
|
for (i = 0; i < MAX_TIMERS; i++) {
|
||||||
|
if (callbacks[i] == 0) {
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// we should never reach this point...
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int SimpleTimer::setTimer(long d, timer_callback f, int n) {
|
||||||
|
int freeTimer;
|
||||||
|
|
||||||
|
freeTimer = findFirstFreeSlot();
|
||||||
|
if (freeTimer < 0) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
delays[freeTimer] = d;
|
||||||
|
callbacks[freeTimer] = f;
|
||||||
|
maxNumRuns[freeTimer] = n;
|
||||||
|
enabled[freeTimer] = true;
|
||||||
|
prev_millis[freeTimer] = millis();
|
||||||
|
|
||||||
|
numTimers++;
|
||||||
|
|
||||||
|
return freeTimer;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int SimpleTimer::setInterval(long d, timer_callback f) {
|
||||||
|
return setTimer(d, f, RUN_FOREVER);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int SimpleTimer::setTimeout(long d, timer_callback f) {
|
||||||
|
return setTimer(d, f, RUN_ONCE);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void SimpleTimer::deleteTimer(int numTimer) {
|
||||||
|
if (numTimer >= MAX_TIMERS) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// nothing to delete if no timers are in use
|
||||||
|
if (numTimers == 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
callbacks[numTimer] = 0;
|
||||||
|
enabled[numTimer] = false;
|
||||||
|
delays[numTimer] = 0;
|
||||||
|
numRuns[numTimer] = 0;
|
||||||
|
|
||||||
|
// update number of timers
|
||||||
|
numTimers--;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// function contributed by code@rowansimms.com
|
||||||
|
void SimpleTimer::restartTimer(int numTimer) {
|
||||||
|
if (numTimer >= MAX_TIMERS) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
prev_millis[numTimer] = millis();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
boolean SimpleTimer::isEnabled(int numTimer) {
|
||||||
|
if (numTimer >= MAX_TIMERS) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return enabled[numTimer];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void SimpleTimer::enable(int numTimer) {
|
||||||
|
if (numTimer >= MAX_TIMERS) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
enabled[numTimer] = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void SimpleTimer::disable(int numTimer) {
|
||||||
|
if (numTimer >= MAX_TIMERS) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
enabled[numTimer] = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void SimpleTimer::toggle(int numTimer) {
|
||||||
|
if (numTimer >= MAX_TIMERS) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
enabled[numTimer] = !enabled[numTimer];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int SimpleTimer::getNumTimers() {
|
||||||
|
return numTimers;
|
||||||
|
}
|
||||||
@@ -0,0 +1,124 @@
|
|||||||
|
/*
|
||||||
|
* SimpleTimer.h
|
||||||
|
*
|
||||||
|
* SimpleTimer - A timer library for Arduino.
|
||||||
|
* Author: mromani@ottotecnica.com
|
||||||
|
* Copyright (c) 2010 OTTOTECNICA Italy
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it
|
||||||
|
* and/or modify it under the terms of the GNU Lesser
|
||||||
|
* General Public License as published by the Free Software
|
||||||
|
* Foundation; either version 2.1 of the License, or (at
|
||||||
|
* your option) any later version.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will
|
||||||
|
* be useful, but WITHOUT ANY WARRANTY; without even the
|
||||||
|
* implied warranty of MERCHANTABILITY or FITNESS FOR A
|
||||||
|
* PARTICULAR PURPOSE. See the GNU Lesser General Public
|
||||||
|
* License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser
|
||||||
|
* General Public License along with this library; if not,
|
||||||
|
* write to the Free Software Foundation, Inc.,
|
||||||
|
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef SIMPLETIMER_H
|
||||||
|
#define SIMPLETIMER_H
|
||||||
|
|
||||||
|
#if defined(ARDUINO) && ARDUINO >= 100
|
||||||
|
#include <Arduino.h>
|
||||||
|
#else
|
||||||
|
#include <WProgram.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
typedef void (*timer_callback)(void);
|
||||||
|
|
||||||
|
class SimpleTimer {
|
||||||
|
|
||||||
|
public:
|
||||||
|
// maximum number of timers
|
||||||
|
const static int MAX_TIMERS = 10;
|
||||||
|
|
||||||
|
// setTimer() constants
|
||||||
|
const static int RUN_FOREVER = 0;
|
||||||
|
const static int RUN_ONCE = 1;
|
||||||
|
|
||||||
|
// constructor
|
||||||
|
SimpleTimer();
|
||||||
|
|
||||||
|
// this function must be called inside loop()
|
||||||
|
void run();
|
||||||
|
|
||||||
|
// call function f every d milliseconds
|
||||||
|
int setInterval(long d, timer_callback f);
|
||||||
|
|
||||||
|
// call function f once after d milliseconds
|
||||||
|
int setTimeout(long d, timer_callback f);
|
||||||
|
|
||||||
|
// call function f every d milliseconds for n times
|
||||||
|
int setTimer(long d, timer_callback f, int n);
|
||||||
|
|
||||||
|
// destroy the specified timer
|
||||||
|
void deleteTimer(int numTimer);
|
||||||
|
|
||||||
|
// restart the specified timer
|
||||||
|
void restartTimer(int numTimer);
|
||||||
|
|
||||||
|
// returns true if the specified timer is enabled
|
||||||
|
boolean isEnabled(int numTimer);
|
||||||
|
|
||||||
|
// enables the specified timer
|
||||||
|
void enable(int numTimer);
|
||||||
|
|
||||||
|
// disables the specified timer
|
||||||
|
void disable(int numTimer);
|
||||||
|
|
||||||
|
// enables the specified timer if it's currently disabled,
|
||||||
|
// and vice-versa
|
||||||
|
void toggle(int numTimer);
|
||||||
|
|
||||||
|
// returns the number of used timers
|
||||||
|
int getNumTimers();
|
||||||
|
|
||||||
|
// returns the number of available timers
|
||||||
|
int getNumAvailableTimers() { return MAX_TIMERS - numTimers; };
|
||||||
|
|
||||||
|
private:
|
||||||
|
// deferred call constants
|
||||||
|
const static int DEFCALL_DONTRUN = 0; // don't call the callback function
|
||||||
|
const static int DEFCALL_RUNONLY = 1; // call the callback function but don't delete the timer
|
||||||
|
const static int DEFCALL_RUNANDDEL = 2; // call the callback function and delete the timer
|
||||||
|
|
||||||
|
// find the first available slot
|
||||||
|
int findFirstFreeSlot();
|
||||||
|
|
||||||
|
// value returned by the millis() function
|
||||||
|
// in the previous run() call
|
||||||
|
unsigned long prev_millis[MAX_TIMERS];
|
||||||
|
|
||||||
|
// pointers to the callback functions
|
||||||
|
timer_callback callbacks[MAX_TIMERS];
|
||||||
|
|
||||||
|
// delay values
|
||||||
|
long delays[MAX_TIMERS];
|
||||||
|
|
||||||
|
// number of runs to be executed for each timer
|
||||||
|
int maxNumRuns[MAX_TIMERS];
|
||||||
|
|
||||||
|
// number of executed runs for each timer
|
||||||
|
int numRuns[MAX_TIMERS];
|
||||||
|
|
||||||
|
// which timers are enabled
|
||||||
|
boolean enabled[MAX_TIMERS];
|
||||||
|
|
||||||
|
// deferred function call (sort of) - N.B.: this array is only used in run()
|
||||||
|
int toBeCalled[MAX_TIMERS];
|
||||||
|
|
||||||
|
// actual number of timers in use
|
||||||
|
int numTimers;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
#######################################
|
||||||
|
# Syntax Coloring Map
|
||||||
|
#######################################
|
||||||
|
|
||||||
|
#######################################
|
||||||
|
# Datatypes (KEYWORD1)
|
||||||
|
#######################################
|
||||||
|
|
||||||
|
SimpleTimer KEYWORD1
|
||||||
|
|
||||||
|
#######################################
|
||||||
|
# Methods and Functions (KEYWORD2)
|
||||||
|
#######################################
|
||||||
|
run KEYWORD2
|
||||||
|
setInterval KEYWORD2
|
||||||
|
setTimeout KEYWORD2
|
||||||
|
setTimer KEYWORD2
|
||||||
|
deleteTimer KEYWORD2
|
||||||
|
restartTimer KEYWORD2
|
||||||
|
isEnabled KEYWORD2
|
||||||
|
enable KEYWORD2
|
||||||
|
disable KEYWORD2
|
||||||
|
toggle KEYWORD2
|
||||||
|
getNumTimers KEYWORD2
|
||||||
|
getNumAvailableTimers KEYWORD2
|
||||||
|
|
||||||
|
#######################################
|
||||||
|
# Constants (LITERAL1)
|
||||||
|
#######################################
|
||||||
|
MAX_TIMERS LITERAL1
|
||||||
|
RUN_ONCE LITERAL1
|
||||||
|
RUN_FOREVER LITERAL1
|
||||||
Reference in New Issue
Block a user