|
нажатие кнопки, в течение определенного интервала |
|
|
|
Aug 19 2010, 08:35
|
Местный
  
Группа: Свой
Сообщений: 292
Регистрация: 9-11-04
Пользователь №: 1 077

|
Здравствуйте,
программно необходимо читать нажата ли кнопка и если да, то как долго удерживается нажатие (есоли 3сек., то выполнить одно, если 5 сек. то другое).
Есть библиотека gpio от производителя чипа с функциями чтения/записи пина и пр. (вообще это нужно сделать под линуксом, на данном этапе это будет демон, в дальнейшем хотелось бы перенести в ядро), но я решил запостить здесь, потому как меня интересует алгоритм.
Т.е. языком псевдокода как это будет выглядеть? Очевидно, нужно проверять состояние пина, и если кнопка нажата, то запускать таймер - но возникает проблема, как отслеживать два разных тайминга - 3сек и 5 ?
Буду очень признателен за идеи и советы !
|
|
|
|
|
 |
Ответов
|
Aug 19 2010, 15:46
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Не нужно запускать/останавливать таймер. Таймер должен "тикать" всегда. Ведь интересуют-то относительные временные отсчеты, которые есть разность между временем свершения одного и другого события. А сама процедура, требуемая топикстартеру, представляет из себя конечный автомат с 4-мя состояниями. 1. Ожидаем нажатия кнопки. Если нажали кнопку - засечка времени, генерируем событие "нажали кнопку". Переход в состояние 2. 2. Следим - отпустили кнопку или нет, если нет, то сравниваем засечку времени с текущим временем, если прошло 3 секунды, генерируем событие "3 секунды" и переход в состояние 3. Если отпустили кнопку, то генерируем событие "кнопку отпустили" и переход в состояние 1. 3. Опять бдим за состоянием кнопки и временем, если кнопка о сих пор нажата и прошло 5 секунд с момента засечки, то генерируем событие "5 секунд" и переходим в состояние 4. Если отпустили кнопку, то генерируем событие "кнопку отпустили" и переход в состояние 1. 4. Далее уже просто слежение за тем когда кнопку отпустят, за временем следить не требуется. При отпускании кнопки генерируем событие "кнопку отпустили" и переход в состояние 1.
|
|
|
|
|
Sep 8 2010, 13:21
|

Знающий
   
Группа: Свой
Сообщений: 648
Регистрация: 11-02-06
Из: Санкт-Петербург
Пользователь №: 14 237

|
Цитата(rezident @ Aug 19 2010, 19:46)  А сама процедура, требуемая топикстартеру, представляет из себя конечный автомат с 4-мя состояниями. К сожалению, Ваша процедура не удовлетворяет условию, поставленному автором темы (по нажатию 3 с запускать одно действие, по нажатию 5 с - другое). У Вас трёхсекундное событие генерируется ненужным "бонусом" к пятисекундному. Тут всё проще - за временем надо следить, когда кнопка уже отпущена, ибо пока она нажата - ничего о времени её нажатия предсказать невозможно. Получается конечный автомат из 2 состояний, которым можно по ходу дела давить и дребезг контактов: 1. Кнопка отпущена. Если кнопка нажата - присваивание переменной Т текущего времени, переход в состояние 2. 2. Кнопка нажата. Если кнопка отжата - вычисление разницы D текущего времени и переменной Т. При D < 500 мс игнорирование нажатия, при 5 c > D > 3 c действие для трёхсекундного нажатия, при D > 5 c действие для пятисекундного нажатия. Переход в состояние 1.
--------------------
Сделано в Китае. Упаковано в России.
|
|
|
|
|
Sep 8 2010, 19:19
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Цитата(Demeny @ Sep 8 2010, 19:21)  К сожалению, Ваша процедура не удовлетворяет условию, поставленному автором темы (по нажатию 3 с запускать одно действие, по нажатию 5 с - другое). У Вас трёхсекундное событие генерируется ненужным "бонусом" к пятисекундному. Ну и что? Пауза 3с всегда короче 5с и возникает раньше второго события. Время штука непрерывная и необратимая. Цитата(Demeny @ Sep 8 2010, 19:21)  Тут всё проще - за временем надо следить, когда кнопка уже отпущена, ибо пока она нажата - ничего о времени её нажатия предсказать невозможно. Вот именно! Событие нужно получить не только за определенный промежуток времени, но и немедленно через этот же промежуток. Зачем нужно 5с событие, которое произошло полчаса назад, когда на кнопку, например, сели попой и заметили это только сейчас? В случае устройства с автономным питанием, которое должно отключаться после 5с удержания кнопки, за полчаса оно может просто "высосать" весь аккумулятор, ожидая когда кнопку отпустят  Впрочем топикстартер, думаю, сам разберется какой алгоритм ему больше подходит.
|
|
|
|
|
Sep 9 2010, 11:49
|

Знающий
   
Группа: Свой
Сообщений: 648
Регистрация: 11-02-06
Из: Санкт-Петербург
Пользователь №: 14 237

|
Цитата(rezident @ Sep 8 2010, 23:19)  Ну и что? Пауза 3с всегда короче 5с и возникает раньше второго события. Время штука непрерывная и необратимая. Тогда объясните, пожалуйста, как в Вашем алгоритме запустить действие (вызвать функцию), которое необходимо выполнять по трёхсекундному удержанию кнопки ? Я думаю, очевидно, что если кнопка удерживается 5 секунд - то трёхсекундное действие выполнять НЕ нужно. А у Вас событие "кнопка удержана 3 с" формируется даже тогда, когда кнопка удерживается уже 5 с -- вот собственно суть того, с чем я не согласен. Поэтому, на мой взгляд, и логично формировать событие "кнопка удержана 3 с", когда она уже отпущена.
--------------------
Сделано в Китае. Упаковано в России.
|
|
|
|
|
Sep 9 2010, 12:20
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Цитата(Demeny @ Sep 9 2010, 17:49)  Тогда объясните, пожалуйста, как в Вашем алгоритме запустить действие (вызвать функцию), которое необходимо выполнять по трёхсекундному удержанию кнопки ? Я думаю, очевидно, что если кнопка удерживается 5 секунд - то трёхсекундное действие выполнять НЕ нужно. Не нужно - не выполняйте.  События разные и (скан-)коды, соответствующие этим событиям, тоже разные. Вас ведь наверное не удивляет, что стандартная клавиатура состоящая из 102 кнопок генерирует больше двух сотен скан-кодов, не так ли?  По крайней мере каждая клавиша в ней генерирует два скан-конда, один соответствует ее нажатию, а второй ее отпусканию. А еще играет рояль сочетание клавиш.
|
|
|
|
|
Sep 10 2010, 06:35
|

Знающий
   
Группа: Свой
Сообщений: 648
Регистрация: 11-02-06
Из: Санкт-Петербург
Пользователь №: 14 237

|
Цитата(rezident @ Sep 9 2010, 16:20)  Не нужно - не выполняйте.  События разные и (скан-)коды, соответствующие этим событиям, тоже разные. Вас ведь наверное не удивляет, что стандартная клавиатура состоящая из 102 кнопок генерирует больше двух сотен скан-кодов, не так ли?  Рассмотрим пример. Кофейный автомат с одной кнопкой. По трёхсекундному нажатию он должен наливать кофе, а по пятисекундному - возвращать клиенту деньги. Проще говоря, короткое нажатие - наливаем кофе (если деньги внесены), длинное нажатие - возврат денег. Ваш конечный автомат, обслуживающий кнопку, сначала начнёт наливать кофе, а потом вернёт деньги. Как ни крутите - решение о выполняемом действии надо принимать при отпускании кнопки.
--------------------
Сделано в Китае. Упаковано в России.
|
|
|
|
Сообщений в этой теме
romez777 нажатие кнопки Aug 19 2010, 08:35 DpInRock А они разве разные?
Сначала - событие 3 сек. А уж ... Aug 19 2010, 08:46      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 Ivan Kuznetzov а если я хочу помимо всего вышеперечисленного отсл... Aug 25 2010, 18:14 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 Цитата(Ivan Kuznetzov @ Aug 26 2010, 00:1... Aug 25 2010, 18:43  xemul Цитата(rezident @ Aug 25 2010, 22:43) ...... Aug 25 2010, 20:42   rezident Цитата(xemul @ Aug 26 2010, 02:42) Лучше ... Aug 26 2010, 08:51    xemul Цитата(rezident @ Aug 26 2010, 12:51) Луч... Aug 26 2010, 12:27     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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|