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

|
Здравствуйте,
программно необходимо читать нажата ли кнопка и если да, то как долго удерживается нажатие (есоли 3сек., то выполнить одно, если 5 сек. то другое).
Есть библиотека gpio от производителя чипа с функциями чтения/записи пина и пр. (вообще это нужно сделать под линуксом, на данном этапе это будет демон, в дальнейшем хотелось бы перенести в ядро), но я решил запостить здесь, потому как меня интересует алгоритм.
Т.е. языком псевдокода как это будет выглядеть? Очевидно, нужно проверять состояние пина, и если кнопка нажата, то запускать таймер - но возникает проблема, как отслеживать два разных тайминга - 3сек и 5 ?
Буду очень признателен за идеи и советы !
|
|
|
|
|
 |
Ответов
|
Aug 25 2010, 20:42
|
    
Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731

|
Цитата(rezident @ Aug 25 2010, 22:43)  ... В одном их моих устройств было 14 кнопок, работающих независимо друг от друга с генерацией автоповтора для каждой из них с индивидуальными паузой и темпом повтора. Кстати, именно для этого случая единственный таймер лучше, чем куча перезапускаемых. Лучше чем? Требует меньше ОЗУ? Вряд ли, т.к. под каждую "засечку времени" потребуется переменная разрядностью = разрядности таймера. По коду меньше? Тоже вряд ли, т.к. вместо инкремента/декремента программных счётчиков (которые могут иметь разрядность меньше разрядности таймера) будет выполняться сравнение (через вычитание) двух чисел разрядностью = разрядности таймера. Чем-то ещё? Но судя по упоминанию топикстартером линукса, разрядности таймеров и счётчиков его не будут сильно беспокоить. Тем более, что свою обработку кнопок он собирается вставить в ядро.
|
|
|
|
|
Aug 26 2010, 08:51
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Цитата(xemul @ Aug 26 2010, 02:42)  Лучше чем? Лучше с точки зрения количества абстракций. Ведь, например, внутри одного прибора не ставят кучу RTC для отсчета времени на каждый узел индивидуально. Я этот этап уже проходил когда-то. Опыт - сын ошибок трудных В первых проектах я делал таймер, который просто инкрементировался на единичку в прерывании. Хватало. Потом где-то стало нужно ориентироваться не просто на абстрактные "тики", а с более определенными единицами времени. Пришлось считать в мс, "тики" подгонять именно под эту единицу времени и инкрементировать счетчик кратно минимальной единице квантования (1мс, 4мс, 10мс, 15мс и т.п.). Потом образовалась некая кучка проектов с примерно одинаковой функциональностью, но с разным количественным набором их. В одном проекте три локальных счетчика, в другом семь, в третьем один. Да забодало!  В каждом нужно отдельно переписывать таймерное прерывание, хотя функционально оно одинаковое. Так я и пришел к единому таймеру. Мне проще написать одну функцию запроса времени к единому таймеру один раз, чем переписывать ее в каждом проекте под требуемые особенности функциональности.
|
|
|
|
|
Aug 26 2010, 12:27
|
    
Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731

|
Цитата(rezident @ Aug 26 2010, 12:51)  Лучше с точки зрения количества абстракций. Ведь, например, внутри одного прибора не ставят кучу RTC для отсчета времени на каждый узел индивидуально. Я этот этап уже проходил когда-то. Опыт - сын ошибок трудных В первых проектах я делал таймер, который просто инкрементировался на единичку в прерывании. Хватало. Потом где-то стало нужно ориентироваться не просто на абстрактные "тики", а с более определенными единицами времени. Пришлось считать в мс, "тики" подгонять именно под эту единицу времени и инкрементировать счетчик кратно минимальной единице квантования (1мс, 4мс, 10мс, 15мс и т.п.). Потом образовалась некая кучка проектов с примерно одинаковой функциональностью, но с разным количественным набором их. В одном проекте три локальных счетчика, в другом семь, в третьем один. Да забодало!  В каждом нужно отдельно переписывать таймерное прерывание, хотя функционально оно одинаковое. Так я и пришел к единому таймеру. Мне проще написать одну функцию запроса времени к единому таймеру один раз, чем переписывать ее в каждом проекте под требуемые особенности функциональности. Т.е. лучше тем, что стало привычным. Мне привычнее определить для проекта минимальный требуемый тик, из которого компилятор сделает все производные кванты (достаточно в дефайнах задать Fosc и собственно тик; а квантов-то обычно требуется 2-3-4). Для таймеров событий мне никогда не требуется абсолютное время (в масштабе коробочки), и эти таймеры я делаю минимально необходимой разрядности. Таймеры запускаются по возникновению события и декрементируются по прошествии требуемого кванта. Таймер события живёт полем в структуре, другим полем является состояние события. Если событие приключается от дребезжащего (или, н-р, медленно ползущего зашумлённого, или кнопки радиобрелока) входа, то состояние события фильтруется одной и той же функцией, которая вызывается с указателем на поле состояния события и с квантом, требуемым для этого входа. (я когда-то использовал механизм вертикальных счётчиков by Scott Dattolo, помянутый 777777, но ушёл от него к индивидуальному горизонтальному счётчику, живущему в поле состояния события. Вертикальные счётчики тем не менее удобны для фильтрации многих входов с одинаковой динамикой - н-р, для клавиатуры 4х4). В моих погремушках с учётом обычно используемых 8-битных контроллеров такой подход получается более экономичным и по ОЗУ, и по ПЗУ.
|
|
|
|
Сообщений в этой теме
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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|