Что бы еще такого сделать?... Предлагайте! Обсудим все!!!
Ответить

Кнопки: короткое и долгое нажатие. Наиболее удобный алгоритм

Ср май 05, 2021 07:59:40

Никогда не подумал бы, что задам этот вопрос, но после долгих размышлений решил задать.

В устройствах на МК с малым количеством кнопок управления очень часто есть вынужденная необходимость разделять короткое и долгое нажатие кнопок. И в связи с этим вопрос: какой алгоритм наиболее удобен с точки зрения пользователя - реакция на НАЖАТИЕ или на ОТПУСКАНИЕ кнопок?

Очевидно же, что в момент нажатия предсказать, будет кнопка долго нажата или недолго, невозможно. Поэтому при алгоритме ПО НАЖАТИЮ всегда будет сначала выполнена функция по короткому нажатию, а затем функция по долгому нажатию. При алгоритме ПО ОТПУСКАНИЮ, естественно, будет выполнена нужная функция, но не сразу, а... потом, когда кнопку отпустят.
В итоге в обоих алгоритмах пользователь может попасть в ситуацию, когда происходит не то, что он ожидает.
Вот и вопрос: что же удобнее?

Re: Кнопки: короткое и долгое нажатие. Наиболее удобный алго

Ср май 05, 2021 08:32:54

Проще всего провести натурные испытания.
Сделай 4 кнопки (2 кор + 2 длин по разному срабатывающих) и включение светодиода скажем и дай эту конструкцию разным людям.
Пусть скажут какие кнопки им оказались очевидней, логичней, предсказуемей...

Скорее всего будет так: короткое нажатие по отпусканию, длинное по заложенному времени.

Re: Кнопки: короткое и долгое нажатие. Наиболее удобный алго

Ср май 05, 2021 08:37:36

Я потому вопрос на форуме и задал, чтобы избежать долгих "статистических" экспериментов - каждый наверняка имеет опыт в использовании малокнопочных устройств, как самодельных, так и "настоящих" (например, наручные электронные часы). Просто поделиться опытом - вот и будет статистика.

Re: Кнопки: короткое и долгое нажатие. Наиболее удобный алго

Ср май 05, 2021 09:21:48

В некотрых моделях цифровых ТВ приставок, как пример DEXP HD2991 две кнопки последовательного переключения программ при длительном удержании работают как кнопки регулиррвки громкости, если кратковременно нажимать эти кнопки, переключаются каналы, если нажать и удерживать какую либо кнопку, через пару секунд начинает изменятся уровень громкости, при отпускании уровень громкость перестаёт «ползти».

Re: Кнопки: короткое и долгое нажатие. Наиболее удобный алго

Ср май 05, 2021 09:41:47

Zyklon-B писал(а):если кратковременно нажимать эти кнопки, переключаются каналы, если нажать и удерживать какую либо кнопку, через пару секунд начинает изменятся уровень громкости,
каналы переключаются в момент нажатия кнопки или при отпускании? т.е. когда хочется изменить громкость - сначала канал переключится, или нет?

Re: Кнопки: короткое и долгое нажатие. Наиболее удобный алго

Ср май 05, 2021 10:18:20

ARV

каналы переключаются в момент нажатия кнопки или при отпускании?

При отпускании.
т.е. когда хочется изменить громкость - сначала канал переключится, или нет?

Нет. При нажатии кнопки сначала ничего не происходит, если нажать и сразу отпустить кнопку, переключится канал, если удерживать кнопку, через пару секунд на экране появится шкала громкости и уровень громкости изменится в ту или иную сторону, в зависимости от того, какую кнопку удерживать.

Re: Кнопки: короткое и долгое нажатие. Наиболее удобный алго

Ср май 05, 2021 10:19:46

при длительном удержании работают как кнопки регулиррвки громкости, если кратковременно нажимать эти кнопки, переключаются каналы,

дрочево по китайски

Re: Кнопки: короткое и долгое нажатие. Наиболее удобный алго

Ср май 05, 2021 10:30:35

ARV писал(а):какой алгоритм наиболее удобен с точки зрения пользователя - реакция на НАЖАТИЕ или на ОТПУСКАНИЕ кнопок?


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

Re: Кнопки: короткое и долгое нажатие. Наиболее удобный алго

Ср май 05, 2021 10:32:31

По нажатии ожидается антидребезг, после подтверждения запуск процедуры по заданному вектору и выход на ожидание отпускания.
Само первое прохождение сразу за подтверждением меняет указатель исполняемой функции на "исполнение при ожидании отпускания". А там - или счетчик сканов или собственный таймер длительности выставляем...
:roll:

Re: Кнопки: короткое и долгое нажатие. Наиболее удобный алго

Ср май 05, 2021 10:39:02

RoboC писал(а):О чем вы там так долго думали?
дело в том, что, например, в Windows при двойном клике кнопкой мышки сначала генерируется событие "нажата кнопка мышки", а следом впридачу генерируется событие "двойное нажатие кнопки мышки". и программист сам должен разобраться, когда как реагировать.

в описанной проблеме ситуация схожая

Re: Кнопки: короткое и долгое нажатие. Наиболее удобный алго

Ср май 05, 2021 11:37:58

какой алгоритм наиболее удобен с точки зрения пользователя - реакция на НАЖАТИЕ или на ОТПУСКАНИЕ кнопок?

Думаю, при обработке длительности нажатия -- однозначно, только по отпусканию.
Функция обработки нажатия кнопки должна отследить факт её нажатия (устранить дребезг), включить счётчик длительности, определить факт отпускания (опять же дребезг) и установить значение в течении которого кнопка была нажата (просто признак длительного нажатия).
В основной программе вызываем эту функцию и спрашиваем: кнопка была нажата и длительно -- выполняем "длительное" нажатие, если была нажата и не долго -- выполняем "короткое" нажатие, ну а если не была нажата -- само дальше идёт.
У меня как-то так "нарисовалось" :wink:

Re: Кнопки: короткое и долгое нажатие. Наиболее удобный алго

Ср май 05, 2021 12:20:43

многое зависит от алгоритма сканирования....
:roll:

Re: Кнопки: короткое и долгое нажатие. Наиболее удобный алго

Ср май 05, 2021 12:52:42

Ннну да :)
Но в общих-то чертах он пойдёт в любом случае. Алгоритм сканирования (или матрица кнопок, или каждая на свой вход контроллера) пусть и обрабатывается в функции, отвечающей за опрос нажатия. Пусть это будет хоть "линейно", хоть по прерыванию, но в общих чертах я бы так и реализовал, как подумалось.
В основную программу должно возвращаться "факт нажатия" и "признак длительности" :))

Re: Кнопки: короткое и долгое нажатие. Наиболее удобный алго

Ср май 05, 2021 15:20:37

Привет КотаФеям.

Длинное ,короткое нажатие кнопок определяю используя такие флаги.

(KeyS_Data) переменная
7 bit - факт нажатия кнопки.
6 bit - LONG1 удержание нажатой кнопки.
5 bit - LONG2 удержание нажатой кнопки.
4 бит - Кнопка нажата/отжата.
3 бит -\
2 бит -|
1 бит -| code KEY
0 бит -/

Вот мой пример на ASM.
Вложения
Key_in.asm
(4.33 KiB) Скачиваний: 236

Re: Кнопки: короткое и долгое нажатие. Наиболее удобный алго

Ср май 05, 2021 19:54:05

Я обычно делаю так. Кнопка генерит три события: нажата, отпущена, долго нажата. Причем, после "долго нажата" не бывает "отпущена".
Реальные действия выполняются по "отпущена" и "долго нажата". Если кнопка типа тактовой, со щелчком, то "нажата" можно игнорить. Если кнопка "мягкая", типа метал. антивандальной, то по "нажата" делаем какой-то beep, ну при наличии пищалки естественно. По событию "долго нажата" ИМХО очень желательно издавать какой-нибудь звук.

Re: Кнопки: короткое и долгое нажатие. Наиболее удобный алго

Ср май 05, 2021 20:10:17

В прерывании проверяем нажата ли кнопка, если да - то инкрементируем счётчик нажатия, если нет - то проверяем счётчик времени удержания , если он не равен нулю то произошёл отпуск кнопки, устананавливаем флаг отпуска . В основном цикле проверяем не установлен ли флаг отпуска , если да, то в зависимости от значения счётчика удержания ... выполняем нужные процедуры.

Добавлено after 4 minutes 15 seconds:
Re: Кнопки: короткое и долгое нажатие. Наиболее удобный алгоритм
В прерывании по таймеру имелось ввиду.

Re: Кнопки: короткое и долгое нажатие. Наиболее удобный алго

Ср май 05, 2021 21:46:55

Также придерживаюсь мысли, что в большинстве случаев корректный вариант - это короткое нажатие по отпусканию, длинное по заложенному времени.
Вариант реакции "короткое нажатие" по нажатию кнопки имеет место быть только в случае, когда длинное нажатие или даблклик развивают событие по короткому нажатию.
Как в той же винде. Клик по иконке перемещает на неё фокус - это типовое действие. А потом второй клик "добивает" иконку, запуская её.
И да, по нажатию кнопки действительно, можно издать какой то бип, что бы пользователь понял, что его услышали. Тогда по отпусканию выполнить действие, уже без бипа. Или по таймауту уже бипнуть второй раз и выполнить действие по длинному нажатию.

Re: Кнопки: короткое и долгое нажатие. Наиболее удобный алго

Чт май 06, 2021 11:02:14

Тайминги антидребезга, определения удержания, паузы двойного нажатия ещё зависят от типа применённых кнопок. Ну и конечно присутствует известная доля субъективизма. За долгое время использование стандартных тактовых кнопок прижились такие тайминги:
- антидребезг 5-15 мс.
- время определения двойного нажатия: 200-340мс
- удержание: 350-900мс.

Еще нужно учитывать неодновременность нажатия и отпускания, при действиях с несколькими кнопками.

Пример кода для одной кнопки:

Re: Кнопки: короткое и долгое нажатие. Наиболее удобный алго

Чт май 06, 2021 11:32:19

Всем спасибо за мнения, соглашусь с большинством: реакция по отпусканию предпочтительнее.
С реализацией алгоритма проблем нет.

(KeyS_Data) переменная
7 bit - факт нажатия кнопки.
6 bit - LONG1 удержание нажатой кнопки.
5 bit - LONG2 удержание нажатой кнопки.
4 бит - Кнопка нажата/отжата.
3 бит -\
2 бит -|
1 бит -| code KEY
0 бит -/

Не совсем понятно, зачем нужен 7-й бит? Есть же 4-й и более младшие, по-моему, однозначно сообщающие о том, что нажато или отжато.

Re: Кнопки: короткое и долгое нажатие. Наиболее удобный алго

Пт май 07, 2021 15:04:33

Привет КотаФеям.

4 бит устанавливается и сбрасывается подпрограммой скана кнопок.
7 бит а также 6 и 5 биты сбрасывают при необходимости подпрограммы использующие ввод кнопок.
У меня некоторые подпрограммы следят за битами 6,5,4 и не учитывают факт отжатия кнопок.
7 бит можно считать как достоверное короткое нажатие.
Ответить