реклама на сайте
подробности

 
 
> нажатие кнопки, в течение определенного интервала
romez777
сообщение Aug 19 2010, 08:35
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 292
Регистрация: 9-11-04
Пользователь №: 1 077



Здравствуйте,

программно необходимо читать нажата ли кнопка и если да, то как долго удерживается нажатие (есоли 3сек., то выполнить одно, если 5 сек. то другое).

Есть библиотека gpio от производителя чипа с функциями чтения/записи пина и пр. (вообще это нужно сделать под линуксом, на данном этапе это будет демон, в дальнейшем хотелось бы перенести в ядро), но я решил запостить здесь, потому как меня интересует алгоритм.

Т.е. языком псевдокода как это будет выглядеть? Очевидно, нужно проверять состояние пина, и если кнопка нажата, то запускать таймер - но возникает проблема, как отслеживать два разных тайминга - 3сек и 5 ?


Буду очень признателен за идеи и советы !
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Ivan Kuznetzov
сообщение Aug 25 2010, 18:14
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 307
Регистрация: 6-02-08
Из: Россия, Екатеринбург
Пользователь №: 34 798



а если я хочу помимо всего вышеперечисленного отслеживать одновременное нажатие двух кнопок? (иногда необходимо, например, для запуска скрытой функции в устройстве - обновления прошивки например)


--------------------
Разработчик
Go to the top of the page
 
+Quote Post
rezident
сообщение Aug 25 2010, 18:43
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(Ivan Kuznetzov @ Aug 26 2010, 00:14) *
а если я хочу помимо всего вышеперечисленного отслеживать одновременное нажатие двух кнопок?

Помимо чего "этого"? К какому именно сообщению относится ваш вопрос? Если к моему, то отвечу так: хоть десять, если есть возможность распознавания кратковременного одновременного нажатия нескольких. Для каждой кнопки своя засечка времени делается и вуаля! Конечный автомат для каждой кнопки тот же самый. В одном их моих устройств было 14 кнопок, работающих независимо друг от друга с генерацией автоповтора для каждой из них с индивидуальными паузой и темпом повтора. Кстати, именно для этого случая единственный таймер лучше, чем куча перезапускаемых.
Go to the top of the page
 
+Quote Post
xemul
сообщение Aug 25 2010, 20:42
Сообщение #4



*****

Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731



Цитата(rezident @ Aug 25 2010, 22:43) *
... В одном их моих устройств было 14 кнопок, работающих независимо друг от друга с генерацией автоповтора для каждой из них с индивидуальными паузой и темпом повтора. Кстати, именно для этого случая единственный таймер лучше, чем куча перезапускаемых.

Лучше чем?
Требует меньше ОЗУ? Вряд ли, т.к. под каждую "засечку времени" потребуется переменная разрядностью = разрядности таймера.
По коду меньше? Тоже вряд ли, т.к. вместо инкремента/декремента программных счётчиков (которые могут иметь разрядность меньше разрядности таймера) будет выполняться сравнение (через вычитание) двух чисел разрядностью = разрядности таймера.
Чем-то ещё?

Но судя по упоминанию топикстартером линукса, разрядности таймеров и счётчиков его не будут сильно беспокоить. Тем более, что свою обработку кнопок он собирается вставить в ядро.
Go to the top of the page
 
+Quote Post
rezident
сообщение Aug 26 2010, 08:51
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(xemul @ Aug 26 2010, 02:42) *
Лучше чем?

Лучше с точки зрения количества абстракций. Ведь, например, внутри одного прибора не ставят кучу RTC для отсчета времени на каждый узел индивидуально. Я этот этап уже проходил когда-то. Опыт - сын ошибок трудных smile.gif
В первых проектах я делал таймер, который просто инкрементировался на единичку в прерывании. Хватало. Потом где-то стало нужно ориентироваться не просто на абстрактные "тики", а с более определенными единицами времени. Пришлось считать в мс, "тики" подгонять именно под эту единицу времени и инкрементировать счетчик кратно минимальной единице квантования (1мс, 4мс, 10мс, 15мс и т.п.). Потом образовалась некая кучка проектов с примерно одинаковой функциональностью, но с разным количественным набором их. В одном проекте три локальных счетчика, в другом семь, в третьем один. Да забодало! sad.gif В каждом нужно отдельно переписывать таймерное прерывание, хотя функционально оно одинаковое. Так я и пришел к единому таймеру. Мне проще написать одну функцию запроса времени к единому таймеру один раз, чем переписывать ее в каждом проекте под требуемые особенности функциональности.
Go to the top of the page
 
+Quote Post
xemul
сообщение Aug 26 2010, 12:27
Сообщение #6



*****

Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731



Цитата(rezident @ Aug 26 2010, 12:51) *
Лучше с точки зрения количества абстракций. Ведь, например, внутри одного прибора не ставят кучу RTC для отсчета времени на каждый узел индивидуально. Я этот этап уже проходил когда-то. Опыт - сын ошибок трудных smile.gif
В первых проектах я делал таймер, который просто инкрементировался на единичку в прерывании. Хватало. Потом где-то стало нужно ориентироваться не просто на абстрактные "тики", а с более определенными единицами времени. Пришлось считать в мс, "тики" подгонять именно под эту единицу времени и инкрементировать счетчик кратно минимальной единице квантования (1мс, 4мс, 10мс, 15мс и т.п.). Потом образовалась некая кучка проектов с примерно одинаковой функциональностью, но с разным количественным набором их. В одном проекте три локальных счетчика, в другом семь, в третьем один. Да забодало! sad.gif В каждом нужно отдельно переписывать таймерное прерывание, хотя функционально оно одинаковое. Так я и пришел к единому таймеру. Мне проще написать одну функцию запроса времени к единому таймеру один раз, чем переписывать ее в каждом проекте под требуемые особенности функциональности.

Т.е. лучше тем, что стало привычным.
Мне привычнее определить для проекта минимальный требуемый тик, из которого компилятор сделает все производные кванты (достаточно в дефайнах задать Fosc и собственно тик; а квантов-то обычно требуется 2-3-4).
Для таймеров событий мне никогда не требуется абсолютное время (в масштабе коробочки), и эти таймеры я делаю минимально необходимой разрядности. Таймеры запускаются по возникновению события и декрементируются по прошествии требуемого кванта.
Таймер события живёт полем в структуре, другим полем является состояние события. Если событие приключается от дребезжащего (или, н-р, медленно ползущего зашумлённого, или кнопки радиобрелока) входа, то состояние события фильтруется одной и той же функцией, которая вызывается с указателем на поле состояния события и с квантом, требуемым для этого входа.
(я когда-то использовал механизм вертикальных счётчиков by Scott Dattolo, помянутый 777777, но ушёл от него к индивидуальному горизонтальному счётчику, живущему в поле состояния события. Вертикальные счётчики тем не менее удобны для фильтрации многих входов с одинаковой динамикой - н-р, для клавиатуры 4х4).
В моих погремушках с учётом обычно используемых 8-битных контроллеров такой подход получается более экономичным и по ОЗУ, и по ПЗУ.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- romez777   нажатие кнопки   Aug 19 2010, 08:35
- - DpInRock   А они разве разные? Сначала - событие 3 сек. А уж ...   Aug 19 2010, 08:46
- - rezident   Не нужно запускать/останавливать таймер. Таймер до...   Aug 19 2010, 15:46
|- - Demeny   Цитата(rezident @ Aug 19 2010, 19:46) А с...   Sep 8 2010, 13:21
|- - rezident   Цитата(Demeny @ Sep 8 2010, 19:21) К сожа...   Sep 8 2010, 19:19
|- - Demeny   Цитата(rezident @ Sep 8 2010, 23:19) Ну и...   Sep 9 2010, 11:49
|- - rezident   Цитата(Demeny @ Sep 9 2010, 17:49) Тогда ...   Sep 9 2010, 12:20
|- - Demeny   Цитата(rezident @ Sep 9 2010, 16:20) Не н...   Sep 10 2010, 06:35
|- - rezident   Цитата(Demeny @ Sep 10 2010, 12:35) Ваш к...   Sep 10 2010, 12:51
- - Kuzmi4   2 rezident а как же переполнения таймера ? По моем...   Aug 19 2010, 15:49
|- - rezident   Цитата(Kuzmi4 @ Aug 19 2010, 21:49) а как...   Aug 19 2010, 16:15
|- - romez777   rezident, большое спасибо. Мне сейчас подумалось,...   Aug 20 2010, 04:13
- - 777777   Цитата(romez777 @ Aug 19 2010, 12:35) про...   Aug 20 2010, 09:06
- - sergeeff   Классная программа: Код/*************************...   Aug 20 2010, 09:29
|- - demiurg_spb   Цитата(sergeeff @ Aug 20 2010, 13:29) Кла...   Aug 20 2010, 10:53
|- - sergeeff   Цитата(demiurg_spb @ Aug 20 2010, 13:53) ...   Aug 20 2010, 10:58
||- - rezident   Цитата(sergeeff @ Aug 20 2010, 16:58) Авт...   Aug 20 2010, 11:52
|- - 777777   Цитата(demiurg_spb @ Aug 20 2010, 14:53) ...   Aug 20 2010, 11:04
|- - demiurg_spb   Можно и не ждать: получил 0 - буфер пуст... Цитат...   Aug 20 2010, 11:15
- - sergeeff   Код в студию!   Aug 20 2010, 11:21
|- - demiurg_spb   Код не отдам! А если есть конкретные вопросы -...   Aug 20 2010, 11:45
- - -JonnS-   Прилагаю вариант реализации кот. почти повторяет а...   Aug 22 2010, 17:53
|- - demiurg_spb   Достаточно одну кнопку удерживать в момент включен...   Aug 25 2010, 18:39
||- - Ivan Kuznetzov   Цитата(demiurg_spb @ Aug 25 2010, 23:39) ...   Aug 27 2010, 14:56
||- - demiurg_spb   Ну пусть сядет. При этом надо чтобы ещё в этот мом...   Aug 30 2010, 10:02
||- - rezident   Цитата(xemul @ Aug 26 2010, 18:27) Т.е. л...   Aug 26 2010, 12:52
||- - xemul   Цитата(rezident @ Aug 26 2010, 16:52) Дык...   Aug 26 2010, 14:21
||- - MrYuran   Цитата(xemul @ Aug 26 2010, 18:21) В прер...   Sep 8 2010, 13:28
|- - 777777   Цитата(Ivan Kuznetzov @ Aug 25 2010, 22:1...   Aug 26 2010, 05:18
- - XVR   ЦитатаЗачем нужно 5с событие, которое произошло по...   Sep 9 2010, 06:45
- - MrYuran   По "отжатию" не стоит работать ещё и пот...   Sep 9 2010, 12:40
- - ILYAUL   Цитата(MrYuran @ Sep 9 2010, 16:40) По ...   Sep 9 2010, 16:27
- - AHTOXA   Цитата(ILYAUL @ Sep 9 2010, 22:27) Странн...   Sep 9 2010, 17:56
|- - ILYAUL   Цитата(AHTOXA @ Sep 9 2010, 21:56) Так эт...   Sep 9 2010, 21:29
|- - MrYuran   Цитата(ILYAUL @ Sep 10 2010, 01:29) Вы по...   Sep 10 2010, 06:59
|- - AHTOXA   Цитата(MrYuran @ Sep 10 2010, 12:59) При ...   Sep 10 2010, 08:42
|- - MrYuran   Цитата(AHTOXA @ Sep 10 2010, 12:42) Видим...   Sep 10 2010, 09:00
|- - AHTOXA   Оно там не всегда обрабатывается, а только из режи...   Sep 10 2010, 09:22
- - rezident   Цитата(ILYAUL @ Sep 9 2010, 22:27) Странн...   Sep 9 2010, 22:27
- - ILYAUL   Цитата(rezident @ Sep 10 2010, 02:27) Еру...   Sep 10 2010, 08:33
- - kolisnichenko_r   Цитата(ILYAUL @ Sep 10 2010, 11:33) Я же ...   Sep 14 2010, 08:33
- - ILYAUL   Цитата(kolisnichenko_r @ Sep 14 2010, 12...   Sep 14 2010, 16:37
- - AHTOXA   Цитата(ILYAUL @ Sep 14 2010, 22:37) Юрий ...   Sep 14 2010, 16:52
- - ILYAUL   Цитата(AHTOXA @ Sep 14 2010, 20:52) Да уж...   Sep 14 2010, 20:44
- - AHTOXA   Так там про мышь, а это совсем другое дело. А про ...   Sep 15 2010, 03:51
- - ILYAUL   Цитата(AHTOXA @ Sep 15 2010, 07:51) ... А...   Sep 15 2010, 05:24


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 07:41
Рейтинг@Mail.ru


Страница сгенерированна за 0.02513 секунд с 7
ELECTRONIX ©2004-2016