Простой таймер без использования delay
- Войдите на сайт для отправки комментариев
Пт, 05/07/2019 - 09:32
Всем привет.
Для своего проекта нужно было таймер, не нагружающий процессор.
using callback = void(*)();
enum class TimerMode { SingleShot, Cyclic }; class Timer { public: Timer(unsigned long timeout, TimerMode mode, callback func); void Ping(bool pred = true); private: unsigned long m_timeout = 0; volatile unsigned long m_time = 0; callback m_callback = nullptr; TimerMode m_mode; bool m_started = false; }; Timer::Timer(unsigned long timeout, TimerMode mode, callback func) { m_timeout = timeout; m_callback = func; m_mode = mode; m_time = millis(); } void Timer::Ping(bool pred) { if (!pred) { if (m_mode == TimerMode::SingleShot && m_started) m_started = false; m_time = millis(); return; } if (m_mode == TimerMode::SingleShot && m_started) return; if (millis() - m_time > m_timeout) { m_started = true; m_time = millis(); return m_callback(); } }
Ну и использование:
Timer singleShotTimer(1000, TimerMode::SingleShot, []() { digitalWrite(pin, 1); });
Timer cyclicTimer(2000, TimerMode::Cyclic, []() { digitalWrite(pin, 1); });
А у мня таких целый TTimerList. :-)
https://github.com/DetSimen/Arduino_TimerList
Upd. А точно, мне можно же в туда лямбды прикрутить, по заветам великого Пуха.
Позвольте узнать, каким образом соотносятся между собой "
void
(*)();
" в строке №1 первого скетча, "void
Timer::Ping(
bool
pred)
" в 29-ой строке второго и "return
m_callback();
" в строке №47 второго?Upd. А точно, мне можно же в туда лямбды прикрутить, по заветам великого Пуха.
Синей изолентой - нехай Пух от зависти лопнет!
И как только люди без millis() раньше жили? Да и сейчас... Ардуину то не везде втулишь.)
Позвольте узнать, каким образом соотносятся между собой "
void
(*)();
" в строке №1 первого скетча, "void
Timer::Ping(
bool
pred)
" в 29-ой строке второго и "return
m_callback();
" в строке №47 второго?Собсвенно в моем случае не интересно, что там вернет функция. А если добавить звездочку, то можно получить вполне нужный результат
А у мня таких целый TTimerList. :-)
https://github.com/DetSimen/Arduino_TimerList
Upd. А точно, мне можно же в туда лямбды прикрутить, по заветам великого Пуха.
Да, хороший набор (пожалуй добавлю в закладки), но зачем? Будь я новичком, выбрал более читаемый и компактный вариант)
Собсвенно в моем случае не интересно, что там вернет функция.
эти слова наводят на мысль, что код не ваш - вы его где списали и даже не вполне поняли, как он работает. И возвращаемое значение у вас в коде есть, потому что в том, чужом коде - оно было...
но зачем? Будь я новичком, выбрал более читаемый и компактный вариант)
вот точно такой же вопрос возникает от вашей темы. Нафига отдельный класс с таймером, когда одна строчка
делает ровно тоже самое, как весь ваш класс - да еще и нагружает процессор куда меньше
"Будь я новичком" - выбрал бы эту строчку, как собственно я и делаю в своих проектах, никогда никаких софтовых таймеров не использую. Если нужен таймер, совсем независимый от основного кода - делаю на хардовом таймере и прерываниях, в других случаях достаточно миллис
Собсвенно в моем случае не интересно, что там вернет функция.
эти слова наводят на мысль, что код не ваш - вы его где списали и даже не вполне поняли, как он работает. И возвращаемое значение у вас в коде есть, потому что в том, чужом коде - оно было...
Как вы догадались?)
но зачем? Будь я новичком, выбрал более читаемый и компактный вариант)
вот точно такой же вопрос возникает от вашей темы. Нафига отдельный класс с таймером, когда одна строчка
делает ровно тоже самое, как весь ваш класс - да еще и нагружает процессор куда меньше
Сразу вспоминаю школьные олимпиады по робототехнике, где в функцию loop впихивают 100500 строчек кода. Им простительно, потому что они знают только функциональное программирование
У меня такое ощущение, что вы кроме arduino ничего не программировали, если структура может грузить процессор
Чотаржу.
ks_junio - а вас случаем не Архат зовут? - Или может он ваш учитель? есть тут такой персонаж, который ужом вывернется, но никогда не признает промаха...
Вы наехали на Дед-Симена. сказав что у него сложно. А когда я обратил внимание, что и вашу задачку можно решить куда проще -вы спорите. Двойные стандарты?
Звучит так, как будто функциональное программирование сродни антисемитизму.
ks_junio - а вас случаем не Архат зовут? - Или может он ваш учитель? есть тут такой персонаж, который ужом вывернется, но никогда не признает промаха...
Вы наехали на Дед-Симена. сказав что у него сложно. А когда я обратил внимание, что и вашу задачку можно решить куда проще -вы спорите. Двойные стандарты?
Хорошо, это тот же
только который выполняется в лямбде.
Такой ответ описывает этот код?
Нафига в 15-ой строке "volatile"?
Можно привести полный пример использования?
Звучит так, как будто функциональное программирование сродни антисемитизму.
Нет, они решают разные задачи
Звучит так, как будто функциональное программирование сродни антисемитизму.
Гриш, не знаю, кому это адресовано. В равной степени могу принять и на свой счет. Я вовсе не против классов, да и вообще считаю. что каждый пишет так, как ему удобнее - лишь бы работало. Подход ТС имеет право на жизнь, но его юношеская уверенность, что только он знает, "как надо" вызывает улыбку... снисходительную старческую улыбку :)))))
Нафига в 15-ой строке "volatile"?
Можно привести полный пример использования?
Вот это я не знаю, я недавно начал изучать программирование МК и выложил свой коод на критику
Хорошо, это тот же
только который выполняется в лямбде.
вот именно. Вопрос - нафига его запихивать в лямбду из 50 лишних строк кода, если оно и так неплохо работает?
Звучит так, как будто функциональное программирование сродни антисемитизму.
Нет, они решают разные задачи
функциональное программирование и антисемитизм ?
Звучит так, как будто функциональное программирование сродни антисемитизму.
Гриш, не знаю, кому это адресовано. В равной степени могу принять и на свой счет. Я вовсе не против классов, да и вообще считаю. что каждый пишет так, как ему удобнее - лишь бы работало. Подход ТС имеет право на жизнь, но его юношеская уверенность, что только он знает, "как надо" вызывает улыбку... снисходительную старческую улыбку :)))))
Почему "как надо"? Я предложил свой вариант на критику.
Но я вот не знаю, то ли это консервативные взгляды, толи в этой области программируют по другому
Когда у меня таймеров меньше 3 и они не зависят друг от друга, я свой таймерлист даже не достаю из пыльного мешка, теребонькаю миллис вручную. Бо, память так коротка...
Когда у меня таймеров меньше 3 и они не зависят друг от друга, я свой таймерлист даже не достаю из пыльного мешка, теребонькаю миллис вручную. Бо, память так коротка...
А у меня их больше 10, и loop выглядит красиво
Нафига в 15-ой строке "volatile"?
Можно привести полный пример использования?
Вот это я не знаю, я недавно начал изучать программирование МК и выложил свой коод на критику
Так полный пример использования будет?
Статистика: из 20 ответов по теме только 2, от Ворота и ЕвгенийП
А у меня их больше 10, и loop выглядит красиво
"только начинаю изучать МК" - и сразу 10 таймеров? Мне еще ни в одном проекте больше 3-4х не понадобилось :)
Хотя пишу активно и для себя и на заказ
Вот это я не знаю, я недавно начал изучать программирование МК и выложил свой коод на критику
Ток изначально, вы его еще и в готовые проекты запостили.
Я в начале приложил
Вот это я не знаю, я недавно начал изучать программирование МК и выложил свой коод на критику
Ток изначально, вы его еще и в готовые проекты запостили.
Ничего не понял
А у меня их больше 10, и loop выглядит красиво
"только начинаю изучать МК" - и сразу 10 таймеров? Мне еще ни в одном проекте больше 3-4х не понадобилось :)
Хотя пишу активно и для себя и на заказ
Да, у меня висит 7 устройств, которые нужно включать/выключать. И у каждого свое условие
Я в начале приложил
Слушай, ну зачем так? Всё вроде нормально начиналось. Зачем врать-то? В каком именно посте "в начале" у тебя есть loop? Правда, на архата смахиваешь - тот ни в жисть свою ошибку не признает, и ты туда же.
А теперь, прошу, приведи полный пример. Ты понимаешь смысл слова "полный"? Полный - это такой, который я мог бы запустить и исполнить, а не ловить сообщения, что в программе setup отсустсвует. Уж будь так любезен.
Петрович, не колись за ошибки, я раньше начал к этому подводить. Я же не зря примера требую.
..
ks_junio - код вставлять разучились? В сообщении 29 правильно было, вставьте так же
Это, что пример?
Во-первых, ты неправильно вставил код, а во-вторых, ты, похоже на знаешь что такое пример.
Ладно сам привду, ты лишь подтверди - правильно ли я использую или ошибся в чём?
Итак, пример:
Пойдёт так? Правильно использую?
В Ping поставьте 1
Куда, в какую строку?
Вы программист или кто? Ping(1)
Ну, а раз правильно, то объясни мне, почему результат неверный и ошибка, разумеется, накапливается.
Вот результат:
Вы программист или кто? Ping(1)
Не знаю, кто ты (программист или кто) - там умолчание есть ("void Ping(bool pred = true);") и эта 1 - мёртвому припарка.
Ну, а раз правильно, то объясни мне, почему результат неверный и ошибка, разумеется, накапливается.
Вот результат:
Вангую что 1мс уходит на вывод
Вы программист или кто? Ping(1)
Не знаю, кто ты (программист или кто) - там умолчание есть ("void Ping(bool pred = true);") и эта 1 - мёртвому припарка.
Вот как раз для таких как ТЫ она и стоит
Неправильно вангуешь. Вывод как таковой работает после вычисления параметра print.
Если не ванговать, а посмотреть на код и исправить ошибку в классе, то всё будет нормально.
Ворота, это не ошибка... ну не грубая
Вот как раз для таких как ТЫ она и стоит
Спасибо, потому я ею и воспользовался. Надеюсь, правильно воспользовался? Возражений нет?
Неправильно вангуешь. Вывод как таковой работает после вычисления параметра print.
Если не ванговать, а посмотреть на код и исправить ошибку в классе, то всё будет нормально.
Поставить >=? Да, хорошее замечание
Вот как раз для таких как ТЫ она и стоит
ого как мы заговорили? похоже, ТС надо только по шерстке гладить, критику оно не любит.
Деда, где там картинка с указателем? - положи поближе, похоже, скоро понадобится.
Ворота, это не ошибка... ну не грубая
Т.е. то, что специалированный класс таймера всегда врёт на 1мс - не ошибка? А что же тогда ошибка? Можете дать определение?
И, да, таже самая ошибка была у гивера, как я уже говорил.
Поставить >=? Да, хорошее замечание
вапщето тривиальное...