|
Удержание кнопки 6 секунд |
|
|
|
Apr 3 2009, 07:13
|
Группа: Участник
Сообщений: 4
Регистрация: 25-05-08
Пользователь №: 37 799

|
Подскажите с алгоримом удержания кнопки 6 секунд. Опрос кнопок реализован, оталось сделать что бы при нажатии выводилась уставка прибора, а при удержании 6 секунд войти в меню, прибора. Я пока сделал, что при нажатии сразу в меню попадаю, но требуют вывод уставки и 6 секунд.
|
|
|
|
|
 |
Ответов
|
Apr 3 2009, 10:10
|

Беспросветный оптимист
     
Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646

|
да... пора уже коллекцию ФАКов собирать... или ссылок на них... чтобы заново каждый раз не вбивать... Значит так. Проверенный самой Жизнью алгоритм. 1. По таймеру (T=1,2,5,10... ms) сканируем кнопки. 2. Если ничего не нажато, сбрасываем все флаги (эвенты) 3. Если что-то нажато, сравниваем с предыдущим состоянием. Если совпадает, инкрементируем счётчик тиков. Если нет, сбрасываем счётчик и все флаги (дребезг) 4. Если счётчик >= задержки антидребезга, выставляем флаг KeyPressed 5. Если счётчик >= задержки залипания (1,2,6 секунд), выставляем флаг "Locked" Итого по результатам работы имеем скан-код и набор флагов, которыми могут пользоваться любые заинтересованные процессы Цитата(Herz @ Apr 3 2009, 13:40)  По-моему, по нажатию кнопки просто следует запускать таймер для определения времени нажатого состояния (с учётом возможного дребезга, конечно). И только после отжатия принимать решение о переходе в нужное место программы. Ага, у меня телефон филибз так работает. Разработчика интерфейса придушил бы собственноручно. Вот, дарю на память... CODE //******************************************************************************** // Функция сканирования клавиатуры (запускается по таймеру) // © MrYuran //******************************************************************************** void KbrdScan() { if(kbrd_in & lock) // Проверяем ключ блокировки клавиатуры { Mode |= Locked; kbrd_out &= ~kbrd; } else { Mode &= ~Locked; kbrd_out |= kbrd; }
unsigned char temp = kbrd_in&0xf0;
if((temp != 0) || (Kbrd.scanned != 0)) // что-то нажато { if(temp != Kbrd.scanned) // дребезг { Kbrd.scanned = temp; Kbrd.PressedTime = 0; Kbrd.pressed = 0; } else // вроде уже не дребезг { Kbrd.scanned = temp; Kbrd.PressedTime ++; // считаем время нажатия if(Kbrd.PressedTime == press_delay) // кнопка считается нажатой { if(!(Kbrd.pressed & KeyLocked)) // если не залипла { //Beep(50); // пикаем Kbrd.pressed = Kbrd.scanned | KeyTick; // выставляем код кнопки и тик //Kbrd.PressedTime = 0; } } if(Kbrd.PressedTime == lock_delay) // кнопка считается залипнутой { Kbrd.pressed |= KeyLocked; // выставляем флаг залипания Kbrd.PressedTime = 0; Kbrd.pressed |= KeyTick; } if(Kbrd.PressedTime == lock_interval) // быстрые тики при залочке { if(Kbrd.pressed & KeyLocked) // если залипнута { Kbrd.PressedTime = 0; Kbrd.pressed |= KeyTick; } } } } }
--------------------
Программирование делится на системное и бессистемное. ©Моё :) — а для кого-то БГ — это Bill Gilbert =)
|
|
|
|
|
Apr 3 2009, 10:46
|

Гуру
     
Группа: Модераторы
Сообщений: 10 983
Регистрация: 23-11-05
Пользователь №: 11 287

|
Цитата(MrYuran @ Apr 3 2009, 12:10)  Ага, у меня телефон филибз так работает. Разработчика интерфейса придушил бы собственноручно. Не знаю про телефон "филибз", тут речь идёт вроде об одной кнопке. Вы всё правильно пишете: Цитата Итого по результатам работы имеем скан-код и набор флагов, которыми могут пользоваться любые заинтересованные процессы , но как предполагаете принимать решения о событии до того, как оно произошло? Не станете ведь отрицать, что о времени, которое была нажата кнопка, можно судить лишь по её отжатию? (Если это нужно, конечно). То бишь, залипнет ли кнопка - заранее неизвестно...
|
|
|
|
|
Apr 3 2009, 11:18
|

Местный
  
Группа: Свой
Сообщений: 409
Регистрация: 29-10-07
Пользователь №: 31 836

|
Цитата(Herz @ Apr 3 2009, 13:46)  Не знаю про телефон "филибз", тут речь идёт вроде об одной кнопке. Вы всё правильно пишете: , но как предполагаете принимать решения о событии до того, как оно произошло? Не станете ведь отрицать, что о времени, которое была нажата кнопка, можно судить лишь по её отжатию? (Если это нужно, конечно). То бишь, залипнет ли кнопка - заранее неизвестно... По отпусканию кнопки неудобно! Представте пользователя.. он нажал кнопку.. и ждет перехода в режим меню.. и думает -"прошло ли 6секунд или нет? можно ли отпускать клавишу?"... И что? А если после нажатия считать интервал времени. Если прошло 6 секунд, а кнопка нажата то переходить в меню. Если отпустили раньше другое действие. Защита от залипания так: прошло , к примеру, 12секунд а кнопа нажата.. то ахтунг и т.д.
Причина редактирования: Устранение дублирования в содержании сообщения.
--------------------
Умный программист пишет тупым кодом гениальные вещи, а не наоборот...
|
|
|
|
|
Apr 3 2009, 12:04
|

извечный пессимист
    
Группа: Свой
Сообщений: 1 113
Регистрация: 9-10-06
Из: Днепропетровск
Пользователь №: 21 125

|
Цитата(adc @ Apr 3 2009, 15:18)  По отпусканию кнопки неудобно! Представте пользователя.. он нажал кнопку.. и ждет перехода в режим меню.. и думает -"прошло ли 6секунд или нет? можно ли отпускать клавишу?"... И что? А если после нажатия считать интервал времени. Если прошло 6 секунд, а кнопка нажата то переходить в меню. Если отпустили раньше другое действие. Защита от залипания так: прошло , к примеру, 12секунд а кнопа нажата.. то ахтунг и т.д. Самое смешное, что вы как раз и будете производить действие по отжатию  Кроме того если у вас прошло 6 сек., то вы смотрите 6 сек прошло - да, кнопка нжата - да, и переходите в меню. Тут другой вопрос, если в меню используется таже кнопка, то тогда надо на какое то время надо отрубать действие кнопки иначе получится фигня.
--------------------
Slaves are those of this world Given freedom to lay chains upon The Master The wolf is no longer free Release the chains and come for me
|
|
|
|
|
Apr 4 2009, 21:07
|

извечный пессимист
    
Группа: Свой
Сообщений: 1 113
Регистрация: 9-10-06
Из: Днепропетровск
Пользователь №: 21 125

|
Цитата(_Pasha @ Apr 4 2009, 18:54)  Этот момент надо обустроить так: при нажатии на кнопку должно выводиться какое-либо сообщение, типа "НА! нажатая я!" а потом, после злополучных 6 секунд тихо переходить в меню и ждать отпускания (залипшей) кнопки. А если юзер отпустил кнопку раньше - сообщение убрали. Имхо, конечно. у него вместо сообщения должна выводится уставка, хотя... хотя.. вы правы, ведь эту уставку можно сделать мигающей например.. to rezident вы предложили как раз самое правильное решение, если кнопка не одна конечно...
--------------------
Slaves are those of this world Given freedom to lay chains upon The Master The wolf is no longer free Release the chains and come for me
|
|
|
|
Сообщений в этой теме
decsal Удержание кнопки 6 секунд Apr 3 2009, 07:13 Stanislav_S Цитата(decsal @ Apr 3 2009, 11:13) Подска... Apr 3 2009, 07:28 ukpyr можно завести счетчик нажатия и запоминать предыду... Apr 3 2009, 08:55 Herz По-моему, по нажатию кнопки просто следует запуска... Apr 3 2009, 09:40 ukpyr ЦитатаИ только после отжатия принимать решение о п... Apr 3 2009, 10:00 Herz Цитата(ukpyr @ Apr 3 2009, 12:00) и польз... Apr 3 2009, 10:05 ukpyr ЦитатаMrYuranне нужно никаких флагов, состояние кл... Apr 3 2009, 12:02 rezident Внесу свои 5 копеек. Поскольку как я понял у топик... Apr 4 2009, 21:02 C.S. Ребят, а подскажите, как лучше сделать обработку д... May 7 2009, 09:52 MrYuran Цитата(C.S. @ May 7 2009, 13:52) У меня п... May 7 2009, 10:36 C.S. Значит, я мыслю верно, но туплю насчёт моментов на... May 7 2009, 11:45 MrYuran Цитата(C.S. @ May 7 2009, 15:45) В общем ... May 7 2009, 12:19 C.S. Посмотрите пожалуйста алгоритм, если не сложно, на... May 7 2009, 12:55 Genadi Zawidowski в аттаче - файл keyboard.c все Ваши проблемы там р... May 7 2009, 17:49 C.S. Цитата(Genadi Zawidowski @ May 7 2009, 21... Jun 7 2009, 18:36 C.S. Спасибо! Сейчас посмотрю, поразбираюсь. May 7 2009, 17:56 C.S. 2Genadi Zawidowsk...
А можно один вопросик? У нас ... May 10 2009, 00:46 Genadi Zawidowski Цитата(C.S. @ May 10 2009, 04:46) 2Genadi... May 10 2009, 06:10 Genadi Zawidowski Цитата(C.S. @ May 10 2009, 04:46) 2Genadi... May 10 2009, 23:24 C.S. Да, конечно. Интересно это всё на асм переводить %... May 11 2009, 14:45 Genadi Zawidowski Цитата(C.S. @ May 11 2009, 18:45) Да, кон... May 11 2009, 17:49 C.S. *стало стыдно* Я делаю для себя. Знаю, что на проф... May 12 2009, 07:59 MrYuran Цитата(C.S. @ May 12 2009, 11:59) думаю, ... May 12 2009, 12:39 Genadi Zawidowski ЦитатаЯ делаю для себя
Если Вы заметили, этот прое... May 12 2009, 09:24 VladimirYU Цитата(Genadi Zawidowski @ May 12 2009, 13... May 12 2009, 09:58  Genadi Zawidowski Цитата(VladimirYU @ May 12 2009, 13:58) Е... May 12 2009, 15:06 C.S. Вас понял. В следующих девайсах попробую на СИ. Хо... May 12 2009, 09:36 rezident Сообщение модератора. Уважаемые, пользователи... May 12 2009, 16:41 ukpyr ЦитатаПока вожусь на Меге8 (то, что было) - думаю,... Jun 7 2009, 19:06
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|