Skip to content
This repository was archived by the owner on Aug 25, 2025. It is now read-only.
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 13 additions & 3 deletions Metro.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ Metro::Metro(unsigned long interval_millis)

Metro::Metro(unsigned long interval_millis, uint8_t autoreset)
{
this->autoreset = autoreset;
this->autoreset = autoreset;
interval(interval_millis);
reset();
}
Expand All @@ -35,6 +35,14 @@ void Metro::interval(unsigned long interval_millis)
this->interval_millis = interval_millis;
}

void Metro::delay(unsigned long delay_millis) {
this->previous_millis += delay_millis;
}

void Metro::delayFromNow(unsigned long delay_millis) {
this->previous_millis = millis()+delay_millis;
}

// Benjamin.soelberg's check behavior:
// When a check is true, add the interval to the internal counter.
// This should guarantee a better overall stability.
Expand All @@ -45,15 +53,17 @@ void Metro::interval(unsigned long interval_millis)

char Metro::check()
{
if (millis() - this->previous_millis >= this->interval_millis) {
unsigned long now_millis = millis();
if (this->previous_millis<now_millis
&&(now_millis - this->previous_millis >= this->interval_millis)) {
// As suggested by benjamin.soelberg@gmail.com, the following line
// this->previous_millis = millis();
// was changed to
// this->previous_millis += this->interval_millis;

// If the interval is set to 0 we revert to the original behavior
if (this->interval_millis <= 0 || this->autoreset ) {
this->previous_millis = millis();
this->previous_millis = now_millis;
} else {
this->previous_millis += this->interval_millis;
}
Expand Down
6 changes: 4 additions & 2 deletions Metro.h
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
/*
For license and instructions, please read Readme.md.
*/
For license and instructions, please read Readme.md.
*/

#ifndef Metro_h
#define Metro_h
Expand All @@ -14,6 +14,8 @@ class Metro
Metro(unsigned long interval_millis);
Metro(unsigned long interval_millis, uint8_t autoreset);
void interval(unsigned long interval_millis);
void delay(unsigned long delay_millis);
void delayFromNow(unsigned long delay_millis);
char check();
void reset();

Expand Down
8 changes: 8 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -58,3 +58,11 @@ Changes the interval in milliseconds.

Restarts/resets the Metro.

# void delay(long millis)

delays the triggering of the next successful check() for the specified amount of milliseconds.

# void delayFromNow(long millis)

delays the triggering of the next successful check() for the specified amount of milliseconds after now.
After millis() + the specified milliseconds the Metro goes back to normal operation
2 changes: 2 additions & 0 deletions keywords.txt
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@ Metro KEYWORD1

check KEYWORD2
interval KEYWORD2
delay KEYWORD2
delayFromNow KEYWORD2

#######################################
# Instances (KEYWORD2)
Expand Down