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

|
Здравствуйте,
программно необходимо читать нажата ли кнопка и если да, то как долго удерживается нажатие (есоли 3сек., то выполнить одно, если 5 сек. то другое).
Есть библиотека gpio от производителя чипа с функциями чтения/записи пина и пр. (вообще это нужно сделать под линуксом, на данном этапе это будет демон, в дальнейшем хотелось бы перенести в ядро), но я решил запостить здесь, потому как меня интересует алгоритм.
Т.е. языком псевдокода как это будет выглядеть? Очевидно, нужно проверять состояние пина, и если кнопка нажата, то запускать таймер - но возникает проблема, как отслеживать два разных тайминга - 3сек и 5 ?
Буду очень признателен за идеи и советы !
|
|
|
|
|
 |
Ответов
|
Aug 20 2010, 09:06
|

Профессионал
    
Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357

|
Цитата(romez777 @ Aug 19 2010, 12:35)  программно необходимо читать нажата ли кнопка и если да, то как долго удерживается нажатие (есоли 3сек., то выполнить одно, если 5 сек. то другое). Общий принцип такой: Код // проверка кнопок CButton* pb = &btn[shift_cntr]; if((PINA & BT1) != 0) { // отпущена pb->PressTime = SysTime; if(pb->Pressed != RELEASED) pb->Pressed = ((BTN_PROC)pgm_read_word_near(&BtnProc[shift_cntr]))(RELEASED); } else { // нажата if(pb->Pressed != PRESSED && SysTime - pb->PressTime > 50) pb->Pressed = ((BTN_PROC)pgm_read_word_near(&BtnProc[shift_cntr]))(PRESSED); } } Во-первых, имеется структура CButtun описывающаю состояние каждой кнопки: Код typedef struct tagCButton { uint8_t Pressed; uint16_t PressTime; uint8_t pad; enum { RELEASED = 0, PRESSED, WAITING }; } CButton; btn - массив таких структур, shift_cntr - номер текущей обрабатываемой кнопки. В структуре содержится состояние кнопки (нажата, отпущена или неопределенной состояние, которое как раз и используется для определения длительных нажатий) и системное время. Если кнопка отпущена, время непрерывно записывается в эту переменную. Когда она нажимается, мы попадаем во вторую половину if'а. Если ее состояние не PRESSED (т.е. отпущена или неопределенное) и разность с текущим системным временем больше некоторого значения, необходимого для подавления дребезга, то вызывается функция обработки данной кнопки. Дальше эта функция может сразу выполнить некоторое действие, вернуть значение PRESSED которое будет записано в ее структуру и благодаря этому она больше не будет вызвана пока ее не отпустят. Если же действие необходимо выполнить через некоторое время, то она может возвращать WAITING до тех пор, пока разность между временем, записанным в ее структуре и системным временем не достигнет требуемого значения. Тогда она возвращает PRESSED и больше не вызывается до отпускания.
|
|
|
|
Сообщений в этой теме
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 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
|
|
|