Skip to content

Repository files navigation

latestPIOFooFooFoo

Foo

GTimer

Лёгкий и универсальный программный таймер

  • Работает с millis, micros и любыми другими функциями аптайма типа unsigned long uptime()
  • 3 режима работы: интервальный таймер, тайм-аут, переполнение
  • 3 варианта памяти: 8, 16 и 32 бит периоды
  • Возможность приостановки и продолжения счёта
  • Два варианта фазы интервалов
  • Лёгкая реализация - две переменных под таймер + 1 байт настроек
  • Коллбэк и виртуальная функция срабатывания для наследования

Совместимость

Все платформы

Содержание

Использование

Note

Таймер корректно переходит через "переполнение" функции аптайма (millis, micros)

Режим работы

  • GTMode::Interval - таймер перезапускается после срабатывания
  • GTMode::Timeout - таймер останавливается после срабатывания
  • GTMode::Overflow - таймер срабатывает после срабатывания

mode

Режим фазы

В режиме keepPhase срабатывание интервала кратно периоду даже при задержках в программе:

mode

Инициализация

Библиотека содержит 6 вариантов таймера:

  • GTimer - 32 бит периоды (до 4 294 967 295)
  • GTimer16 - 16 бит периоды (до 65 535)
  • GTimer8 - 8 бит периоды (до 255)
  • GTimerCb, GTimerCb16, GTimerCb8 - то же самое, но с коллбэком
GTimerX<uptime>(uint32_t time, bool start = false, GTMode mode = GTMode::Interval, bool keepPhase = false);
  • uptime - функция аптайма (millis, micros, своя функция типа unsigned long uptime(void))
  • time - время в единицах таймера
  • start - запустить сразу
  • mode - режим работы
  • keepPhase - режим фазы интервалов

Описание классов

GTimerX

// держать фазу в режиме Interval (умолч. false)voidkeepPhase(bool keep);
// держать фазу в режиме IntervalboolgetPhase();
// установить время в единицах таймераvoidsetTime(uint32_t time);
// установить время (для мс)voidsetTime(uint32_t ms, uint32_t sec, uint16_t min = 0, uint16_t hour = 0, uint16_t day = 0);
// получить время в единицах таймера
T getTime();
// установить режим: GTMode::Interval, GTMode::Timeout, GTMode::OverflowvoidsetMode(GTMode mode);
// получить режим: GTMode::Interval, GTMode::Timeout, GTMode::Overflow
GTMode getMode();
// запустить с указанием времени (для мс)voidstart(uint32_t ms, uint32_t sec, uint16_t min = 0, uint16_t hour = 0, uint16_t day = 0);
// запустить с указанием времени и режимаvoidstart(uint32_t time, GTMode mode);
// запустить с указанием времениvoidstart(uint32_t time);
// запустить/перезапуститьvoidstart();
// приостановитьvoidpause();
// продолжитьvoidresume();
// остановитьvoidstop();
// вызвать срабатываниеvoidforce();
// таймер запущенboolrunning();
// прошло времени в единицах таймера
T getCurrent();
// осталось времени в единицах таймера
T getLeft();
// осталось времени в 8 бит (0.. 255)uint8_tgetLeft8();
// осталось времени в 16 бит (0.. 65 535)uint16_tgetLeft16();
// тикер, вызывать в loop. Вернёт true при срабатыванииbooltick();
// вызов tickoperatorbool();

GTimerCbX

// будет запущенGTimerCbX(uint32_t time, TimerCallback cb, GTMode mode = GTMode::Interval, bool keepPhase = false);
// подключить обработчик таймераvoidattach(TimerCallback cb);
// отключить обработчик таймераvoiddetach();
// запустить в режиме таймаутаvoidstartTimeout(uint32_t time, TimerCallback cb);
// запустить в режиме интервалаvoidstartInterval(uint32_t time, TimerCallback cb);
// запустить в режиме переполненияvoidstartOverflow(uint32_t time, TimerCallback cb);
// вызывается при срабатыванииvirtualvoidonReady();
  • TimerCallback - функция вида void f()
  • void* thisGTimer - указатель на текущий таймер внутри обработчика

uTimerX

Самый компактный класс таймера:

  • uTimer8 - 8 бит
  • uTimer16 - 16 бит
  • uTimer - 32 бит
uTimer(bool start = false);
// запустить/перезапуститьvoidstart();
// остановитьvoidstop();
// таймаутbooltimeout(T tout);
// интервалboolinterval(T prd);
// фазаboolphase(T prd);
// переполнениеbooloverflow(T prd);
// таймер запущенboolrunning();
// прошло времени со старта
T elapsed();

Макросы

// EVERYEVERY_T(prd, uptime, T);
EVERY_S(s);
EVERY_MS(ms);
EVERY16_MS(ms);
EVERY8_MS(ms);
EVERY_US(us);
EVERY16_US(us);
EVERY8_US(us);
// PHASEPHASE_T(prd, uptime, T);
PHASE_S(s);
PHASE_MS(ms);
PHASE16_MS(ms);
PHASE8_MS(ms);
PHASE_US(us);
PHASE16_US(us);
PHASE8_US(us);
  • Тип
    • EVERY - сброс timer = uptime
    • PHASE - timer += prd
  • Единицы
    • S - секунды
    • MS - миллисекунды
    • US - микросекунды
  • Разрядность
    • Без цифры - 32-битный счётчик (до 4 294 967 295 единиц)
    • 16 - 16-битный счётчик (до 65 535 единиц)
    • 8 - 8-битный счётчик (до 255 единиц)

Можно переопределить стандартные функции аптайма в макросах _MS и _US:

// перед подключением библиотеки
#defineGT_MACRO_MILLIS millis
#defineGT_MACRO_MICROS micros

Примеры

Обычный

#include<Arduino.h>
#include<GTimer.h>
GTimer<millis> tmr1;
voidsetup() {
Serial.begin(115200);
tmr1.setMode(GTMode::Timeout);
tmr1.setTime(2000);
tmr1.start();
}
voidloop() {
if (tmr1) Serial.println("timeout");
static GTimer<millis> tmr2(500, true);
if (tmr2) Serial.println("interval");
}

Обработчик

#include<Arduino.h>
#include<GTimer.h>
GTimerCb<millis> tmr1, tmr2;
voidonTimer() {
Serial.println("ready 2");
}
voidsetup() {
Serial.begin(115200);
// лямбда
tmr1.startInterval(500, []() {
Serial.println("ready 1");
// обращение к текущему таймеру// static_cast<GTimerCb<millis>*>(thisGTimer)->stop();
});
// внешний
tmr2.startInterval(1000, onTimer);
}
voidloop() {
tmr1.tick();
tmr2.tick();
static GTimerCb<millis> tmr3(500, []() {
Serial.println("ready 3");
});
tmr3.tick();
}

Виртуальный

#include<Arduino.h>
#include<GTimer.h>classTestTimer : publicGTimerCb<millis> {
public:using GTimerCb<millis>::GTimerCb;
voidonReady() {
Serial.println("ready");
}
};
TestTimer tmr(500, true);
voidsetup() {
Serial.begin(115200);
}
voidloop() {
tmr.tick();
}

Макрос

#include<Arduino.h>
#include<GTimer.h>voidsetup() {
Serial.begin(115200);
}
voidloop() {
// EVERY_T(500, millis) Serial.println("500 ms!");// EVERY_T(100000, micros) {// Serial.println("100000 us!");// }EVERY_MS(500) Serial.println("500 ms!");
EVERY_US(100000) {
Serial.println("100000 us!");
}
EVERY_S(5) {
Serial.println("5 s!");
}
}

uTimer

#include<GTimer.h>voidsetup() {
Serial.begin(115200);
Serial.println("start");
}
uTimer16<millis> tmr(true);
voidloop() {
if (tmr.timeout(500)) {
Serial.println("tout");
}
}

Версии

  • v1.0
  • v1.0.1 - добавлен макрос EVERY_T

Установка

  • Библиотеку можно найти по названию GTimer и установить через менеджер библиотек в:
    • Arduino IDE
    • Arduino IDE v2
    • PlatformIO
  • Скачать библиотеку .zip архивом для ручной установки:
    • Распаковать и положить в C:\Program Files (x86)\Arduino\libraries (Windows x64)
    • Распаковать и положить в C:\Program Files\Arduino\libraries (Windows x32)
    • Распаковать и положить в Документы/Arduino/libraries/
    • (Arduino IDE) автоматическая установка из .zip: Скетч/Подключить библиотеку/Добавить .ZIP библиотеку… и указать скачанный архив
  • Читай более подробную инструкцию по установке библиотек здесь

Обновление

  • Рекомендую всегда обновлять библиотеку: в новых версиях исправляются ошибки и баги, а также проводится оптимизация и добавляются новые фичи
  • Через менеджер библиотек IDE: найти библиотеку как при установке и нажать "Обновить"
  • Вручную: удалить папку со старой версией, а затем положить на её место новую. "Замену" делать нельзя: иногда в новых версиях удаляются файлы, которые останутся при замене и могут привести к ошибкам!

Баги и обратная связь

При нахождении багов создавайте Issue, а лучше сразу пишите на почту alex@alexgyver.ru
Библиотека открыта для доработки и ваших Pull Request'ов!

При сообщении о багах или некорректной работе библиотеки нужно обязательно указывать:

  • Версия библиотеки
  • Какой используется МК
  • Версия SDK (для ESP)
  • Версия Arduino IDE
  • Корректно ли работают ли встроенные примеры, в которых используются функции и конструкции, приводящие к багу в вашем коде
  • Какой код загружался, какая работа от него ожидалась и как он работает в реальности
  • В идеале приложить минимальный код, в котором наблюдается баг. Не полотно из тысячи строк, а минимальный код

About

Лёгкий и универсальный программный таймер

Resources

Stars

19 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages