Альберт116 Опубликовано 10 ноября, 2021 Поделиться Опубликовано 10 ноября, 2021 Есть устройство, управляемое одной кнопкой, в связи с этим у кнопки есть 3 вида нажатий: одиночное нажатие, двойное нажатие и долгое нажатие. При написании кода для МК столкнулся с проблемой обработки одиночного и двойного нажатия, как их отличить? Полазив по форумам узнал, что многие советуют таймером замерять время нажатия и время между нажатиями. Да, это работает, но есть серьезное "НО". У них таймер после первого нажатия еще какое-то время ждет второе нажатие, и если он его не получает в заданный промежуток времени обрабатывает как одинарное нажатие. При таком подходе на одинарный клик программа будет реагировать с запозданием т.к. будет тупо сидеть и ждать второго клика которого в принципе не будет. Но ведь в компьютерной мыши нет такого, она четко без задержек реагирует на двойной клик и на одинарный. После одинарного клика окна и пр. открываются мгновенно. Задав этот вопрос знакомому программисту получил ответ что одинарный и двойной клик отличаются по времени, это и следует брать за основу обработки нажатия. Хорошо, написал. Теперь у меня если приходит клик длительность меньше 100мс ожидается второй клик чтобы засчитать его как двойной (второй тоже должен быть меньше 100мс). А все что больше 100мс считается как одинарный. И вроде даже работает, НО! Людям теперь приходится объяснять что двойной клик должен быть коротким, а одинарным чуть подольше, и это не удобно. Старикам, например, которые не могут так быстро кликать. Как же быть? Обращал внимание как написан алгоритм в других устройствах, и там все нормально. Брелок автосигнализации, например. Там хоть медленно 2 раза нажми, он засчитает как двойной. Подскажите какой алгоритм реализовать чтобы избавиться от проблемы. Спасибо! P.S. кнопка обрабатывается в прерывании. Считаем кнопку вообще без дребезга, я это поборол. Нажал-лог. 1, отпустил-лог.0. С этим проблем нет. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Eddy_Em Опубликовано 10 ноября, 2021 Поделиться Опубликовано 10 ноября, 2021 Зачем кнопку обрабатывать в прерывании? Ну чушь же! Просто заводим конечный автомат с состояниями каждой кнопки. Проверяем: если вдруг состояние изменилось, фиксируем текущее время в миллисекундах и новое состояние. Чтобы не было дребезга, в течение 30-100мс после этого не реагируем на изменения состояний. Далее, если кнопку отпустили, переводим в состояние "RELEASED". Если через Nмс нахождения в состоянии RELEASED оно опять сменяется на PRESSED, заменяем на DBL_PRESSED… Если в течение Mмс нахождения в состоянии PRESSED или DBL_PRESSED кнопку не отпустили, даем ей состояние HOLD. Вот так просто я делал свою реализацию, но мне не нужно было состояние DBL_PRESSED. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
20% скидка на весь каталог электронных компонентов в ТМ Электроникс!Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!Перейти на страницу акции Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849
Lexter Опубликовано 10 ноября, 2021 Поделиться Опубликовано 10 ноября, 2021 1 час назад, Альберт116 сказал: Но ведь в компьютерной мыши нет такого Это вам показалось. Там точно так же "старикам неудобно", есть время ожидания второго клика, а в драйверах мыши времена двойного клика даже настраиваются: Чтобы хорошо работало, писать надо под конкретные применяемые в этом устройстве кнопки. Нарисуйте одну под другой временные диаграммы одиночного и двойного щелчка, и сразу поймёте, какие времена надо анализировать, и что чудес не бывает. 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>> Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161
Альберт116 Опубликовано 10 ноября, 2021 Автор Поделиться Опубликовано 10 ноября, 2021 (изменено) @Eddy_Em у вас та же проблема что я описывал, какое-то время программа ничего не делает и ждет второго клика, а если его не будет? получаем задержку в обработке. В прерывании обрабатываю чтобы лишний раз не занимать МК, кнопка обрабатывается только тогда, когда с ней взаимодействуют. И да, дребезга у меня нет, совсем @Lexter диаграммы рисовал, смотрел в анализаторе уровней. двойные нажатия получались 100-120 мс, одинарное нажатие больше 120, но это только у меня, мне так надо было и организм видимо подстроился. позвал другого человека и все...тайминги начали плыть Изменено 10 ноября, 2021 пользователем Альберт116 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Lexter Опубликовано 10 ноября, 2021 Поделиться Опубликовано 10 ноября, 2021 2 часа назад, Альберт116 сказал: Подскажите какой алгоритм реализовать чтобы избавиться от проблемы. Если нажатие длиннее 0,1с (время подбирается), то однозначно одиночное нажатие, отпускания не ждём, отрабатываем. Если кнопка отпущена ранее этих 0,1с, ждём повторного нажатия (возможно с другим временем). Пришло нажатие - двойной клик, отрабатываем, отпускания не ждём. Кончилось время ожидания - одинарное нажатие. Вот как-то так. Только что, Альберт116 сказал: позвал другого человека и все... Так на диаграмме и надо показать эти времена, в пределах которых могут "болтаться" длительности нажатия и промежутков между нажатиями. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Альберт116 Опубликовано 10 ноября, 2021 Автор Поделиться Опубликовано 10 ноября, 2021 а потом приходит старик и ломает эту систему, тайминги у него другие, говорит что у вас ничего не работает и устройство путает нажатия. Знаем, проходили. Нужен универсальный вариант 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Lexter Опубликовано 10 ноября, 2021 Поделиться Опубликовано 10 ноября, 2021 (изменено) 4 минуты назад, Альберт116 сказал: Нужен универсальный вариант Вместо двойного клика ставьте отдельную кнопку. Ещё раз: чудес не бывает. Включите мозг и подумайте сами: Человек нажал два раза с интервалом в одну секунду. Это двойное нажатие или два одиночных? Изменено 10 ноября, 2021 пользователем Lexter 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
IMXO Опубликовано 10 ноября, 2021 Поделиться Опубликовано 10 ноября, 2021 2 часа назад, Альберт116 сказал: Но ведь в компьютерной мыши нет такого, она четко без задержек реагирует на двойной клик и на одинарный. После одинарного клика окна и пр. открываются мгновенно. а фам в голову не приходило. что у тех же окон и иконок разная реакция на кнопки мыши. попробуйте это изучить самостоятельно. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Eddy_Em Опубликовано 10 ноября, 2021 Поделиться Опубликовано 10 ноября, 2021 27 minutes ago, Альберт116 said: а если его не будет? Будет другое состояние. Логично же. В компьютерах мыши именно так и обслуживаются: сначала ты получаешь сигнал CLICK, а лишь после него - DBLCLICK. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
dasZebra Опубликовано 10 ноября, 2021 Поделиться Опубликовано 10 ноября, 2021 1 час назад, Альберт116 сказал: потом приходит старик и ломает эту систему, тайминги у него другие 3 часа назад, Альберт116 сказал: Но ведь в компьютерной мыши нет такого, Есть. Но там в обработку вовлечена визуализация. То есть человеку легко приспособиться, имея четкую и недвусмвсленную ответную реакцию на нажатие. Для эксперимента, для того, что бы можно было удостовериться в этом, сделайте простой тренажер из "вашей кнопки", например одиночное нажатие сопровождается одиночным бипом, двойное - двойным. Или можно, кстати, напостоянную добавить это к функцилоналу, что бы замкнуть сигнальную систему. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Альберт116 Опубликовано 10 ноября, 2021 Автор Поделиться Опубликовано 10 ноября, 2021 предлагаете оставить как есть и переучивать пользователей? сейчас алгоритм работает как в 5 посте. увеличивать количество кнопок не вариант, это и задумывалось чтобы уйти от трех кнопок которые были до этого. Остаётся пользователям подстраиваться под алгоритм? 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
IMXO Опубликовано 10 ноября, 2021 Поделиться Опубликовано 10 ноября, 2021 ну сделайте динамическое окно на ожидание второго клика. 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Yuriy.pv Опубликовано 10 ноября, 2021 Поделиться Опубликовано 10 ноября, 2021 3 часа назад, Альберт116 сказал: // Чем короче первый клик, тем меньше ожидание второго, и наоборот 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Eddy_Em Опубликовано 10 ноября, 2021 Поделиться Опубликовано 10 ноября, 2021 Вообще, даблклик - очень фиговая штука! В "компьютерных" вещах обычно делают так, чтобы одиночный щелчок, скажем, никак не обрабатывался, если есть реакция на двойной, либо же чтобы одиночный тупо втыкал курсор, а двойной - выделял все слово (т.е. чтобы события были более-менее "наследуемыми"). В веб-мордах стараются вообще двойной щелчок не использовать. Вот и в данном случае подозреваю, что можно отлично без двойного щелчка обойтись, просто введя реакцию на события "нажал", "отпустил" и "удерживаешь". Я как-то шутки ради сделал ввод текста одной кнопкой - морзянкой. Правда, т.к. морзянки не знаю, даже коммит в гитхаб с этой порнухой не делал. Так и канула в /dev/null. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Shahabbas Опубликовано 10 ноября, 2021 Поделиться Опубликовано 10 ноября, 2021 (изменено) Не понимаю, а нафига нужен двойной клик в самоделке? Гораздо проще программно сделать по принципу, например: короткое нажатие (< 0,5 секунд) - 1 команда среднее нажатие (0,6-2 секунды) - 2 команда длительное нажатие (2,1-5 секунд) - 3 команда очень длительное нажатие (> 5,1 секунд) - 4 команда Время отработки команд можно подобрать по собственному желанию. Программно можно и "антидребезг" кнопки заложить. Изменено 10 ноября, 2021 пользователем Shahabbas 0 Технические вопросы решаю в теме , в личке не обсуждаю !!! Ссылка на комментарий Поделиться на другие сайты Поделиться
dasZebra Опубликовано 10 ноября, 2021 Поделиться Опубликовано 10 ноября, 2021 10 часов назад, Альберт116 сказал: P.S. кнопка обрабатывается в прерывании. Считаем кнопку вообще без дребезга, я это поборол. Нажал-лог. 1, отпустил-лог.0. С этим проблем нет. В этом и есть проблемма. Система должна игнорировать "короткие нажатия". Итого: кнопка нажалась, начинается счет времени: -а) если кнопка отпущена раньше 40 мсек, начинается отсчет времени отпущенного состояния. Если кнопку не нажали вновь - все забыли, счет обнулен. Если же кнопку нажали вновь через, к примеру 20 мсек, считается длительность второго нажатия и если это не дребезг (опять насчитали 40 мсек) - то выставляется признак двойного нажатия. -б) если кнопка не была отпущена и её "долержали" без отпускания до 80- 100 мсек и после отпустили, ввставляется признак однократного нажатия -в) если кнопка ниразу не была отпущена в течении более 100-120 мсек - ввставляется признак длинного нажатия. Можно продвинуть интуитивность, приняв что человеку несложно ритмически делать паузу между кликами равной клику. Ну типа как в вальсе: клик1- пауза-клик2. Если все три длительности примерно равны (или даже достаточно если клик1 равен паузе), то двойное нажатие - ок. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Lexter Опубликовано 11 ноября, 2021 Поделиться Опубликовано 11 ноября, 2021 10 часов назад, Альберт116 сказал: предлагаете оставить как есть и переучивать пользователей? Да как вы не поймёте... Если в алгоритме заложен анализ временных интервалов, то кто-то к чему-то должен подстраиваться. Или интервалы алгоритма к пользователю, или пользователь к интервалам алгоритма. Вы не ответили про 12 часов назад, Lexter сказал: Человек нажал два раза с интервалом в одну секунду. Это двойное нажатие или два одиночных? Как вы тут будете реализовывать "универсальный" алгоритм? Да даже проще, взять к примеру ваше "длинное нажатие". Заложили вы, положим, четыре секунды. А пользователь упорно нажимает 3,9... Ну считает он даже до пяти быстрее, чем за 4 секунды... Какая тут может быть "универсальность"?! А вообще, если Human Interface плохо или неудобно работает, то это значит, что что-то в нём не продумано. Может огласите исходные требования, чем надо управлять, какие команды вводить? 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Альберт116 Опубликовано 11 ноября, 2021 Автор Поделиться Опубликовано 11 ноября, 2021 да, вы правы, при таких нажатиях различить одиночное и двойное нажатие невозможно, МК пока еще не научились мысли читать) устройство это бортовой компьютер для автомобиля (иномарка). представляет из себя экран 128*128 пикселей, экран разделен на 2 части и в каждой половинке выводится по параметру. кнопками надо было листать эти параметры в каждой половинке и необходимо было реализовать вход в меню настроек. сейчас алгоритм реализован так: одинарное нажатие-листает параметры в верхней половине экрана, двойное нажатие-в нижней половине экрана, а долгое нажатие вход в меню. изначально все управление было по трем кнопкам, но люди возмущались что приходится сверлить пластик торпеды и вообще выглядит колхозно, поэтому перешел на сенсорную кнопку, у неё и дребезга нет и сверлить ничего не надо. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Eddy_Em Опубликовано 11 ноября, 2021 Поделиться Опубликовано 11 ноября, 2021 В таком случае просто сама напрашивается сенсорная панель поверх экранчика! И не нужно сверлить пластик под кнопки. Экран, кстати, можно и побольше сделать, хотя бы дюймов 6 в диагонали: что можно на 128×128 пикселей разглядеть? И тыкать можно будет по менюшкам пальцем, а не стило. 2 Ссылка на комментарий Поделиться на другие сайты Поделиться
Альберт116 Опубликовано 11 ноября, 2021 Автор Поделиться Опубликовано 11 ноября, 2021 проблема в том, что приборка закрыта еще прозрачным пластиком, и расстояние от экранчика до пластика к тому же приличное. А так согласен, сенсорный экранчик был бы чудом!) 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Lexter Опубликовано 11 ноября, 2021 Поделиться Опубликовано 11 ноября, 2021 45 минут назад, Альберт116 сказал: бортовой компьютер для автомобиля (иномарка). представляет из себя экран 128*128 пикселей Экран бортового компьютера иномарки 128х128 пикселей... Даже не знаю, смеяться, или плакать. Если экран ещё и 0,96 дюйма, то наверное одновременно и то, и другое. По-моему, таким решением с размером экрана и расположением глубоко в панели, кака заложена изначально. Загнали вы сами себя в угол. Что бы вы ни делали с управлением, оценка будет 52 минуты назад, Альберт116 сказал: вообще выглядит колхозно Согласен с @Eddy_Em . Лучшее, что на сегодня можно поставить в таком применении - сенсорный экран. Причём адекватного разрешения и размера. Особенно если это не сервисное устройство, а используется при движении. Должно быть прежде всего максимально удобно водителю. Насколько удобно будет разработчику - в расчёт не берётся. Да и необходимость листать, искать и что-то высматривать (кстати, индицируются пиктограммы или текст с легко забывающимися сокращениями? Точек-то мало.) в окошке торпеды во время движения, а тем более лезть в какие-то настройки меню и менять параметры - заложенная повышенная опасность аварии. Должно индицироваться только действительно необходимое и максимально наглядно и просто. Зелёное - норма, красное и мигает - обрати внимание, непорядок. Ну а если это сервисное устройство, которое используется только при обслуживании, то ему вообще на торпеде не место. Или вы хотите совместить и то, и другое? Тогда можно сделать так: В движении только необходимая индикация, а при настройке в сервисе - внешний пульт с кнопками, подключающийся по радиоканалу или ИК. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Альберт116 Опубликовано 11 ноября, 2021 Автор Поделиться Опубликовано 11 ноября, 2021 нет это не сервисное устройство, экран мал, но надписи на него выводятся крупными буквами/цифрами, заранее выставляется те параметры которые чаще всего нужны (прим. расход и заряд акб) и редко когда меняется. сокращения используются все понятные и на русском, не надо, да и не про это речь. Людям все нравится кроме кнопок, вот и перехожу сейчас на сенсорную кнопку за пластиком торпеды ну и куда я вам тут влеплю огромный сенсорный экран? что-то не видно или не понятно на дисплее? сначала уточните, потом хайте @ Lexter 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Lexter Опубликовано 11 ноября, 2021 Поделиться Опубликовано 11 ноября, 2021 Дисплейчик бы сюда круглый... 5 часов назад, Альберт116 сказал: перехожу сейчас на сенсорную кнопку за пластиком торпеды Так может их две поставить - сверху и снизу? Тогда нажатием перебирается отображение верхней или нижней половины, а длинным нажатием - переход в меню. И никаких двойных с их геморроем... 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
demiurg1978 Опубликовано 10 мая, 2022 Поделиться Опубликовано 10 мая, 2022 В 10.11.2021 в 17:55, Альберт116 сказал: Ваша задача решается с помощью конечных автоматов. При этом и обработчик кнопки конечный автомат и обработчик меню. Двойное нажатие (неважно сколько нажатий) решается легко. Есть короткое нажатие, есть удержание кнопки. Время удержания можно выставить любое. Есть даже такое: держим три секунды, это первый уровень меню. Держим ещё три секунды, это второй уровень меню. По двойному нажатию. Пусть мы определили, что есть короткое нажатие, то есть. Нажали, событие нажатие. Ессно после подавления дребезга. Отпустили кнопку, событие отжатия, также, после подавление дребезга. Пусть нам нужно двойное нажатие. После отжатия кнопки установка программного таймера. Скажем на 250 мс. Нажали еще раз, опять установка таймера. Время вышло, мы видим, что нажато 2 раза и нет длительного нажатия. Вот тебе и двойное нажатие. Вопрос. Где мы будем за этим следить. В модуле обработки кнопки или в модуле обработки меню. По идее, модуль обработки кнопки должен выдавать события нажатия кнопки, отпускания, удержание и автоповтор. А двойные нажатия и так далее, уже там где надо. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
GPIOA Опубликовано 28 мая, 2023 Поделиться Опубликовано 28 мая, 2023 Тут дело не в том, как организовать программно двойное нажатие, тут дело в том, что одинарное нажатие будет перебиваться двойным нажатием. Следовательно, действие по двойному нажатию не должно противоречить действию по одиночному нажатию, оно должно лишь дополнять его. Примерно так, как это сделано вот тут, в редакторе при наборе текста: одиночное нажатие ЛКМ устанавливает тектовый курсор в указанную мышкой позицию, двойное нажатие ЛКМ выделяет все слово, в котором установлен текстовый курсор, а тройное нажатие выделяет весь абзац, в котором расположено это слово. Таким образом, последующие действия не противоречат, а дополняют предыдущие. Тогда не будет никаких запозданий реакции на одиночное нажатие. Как это реализовать программно? С помощью флагов и таймеров. После срабатывания одиночного нажатия устанавливается флаг и запускается таймер отсчета интервала окна регистрации повторного нажатия, а так же выполняется действие по одиночному нажатию. Если в этот интервал не было повторного нажатия, флаг сбрасывается. Если же повторное нажатие было зарегистрировано в интервале, значит выполняется действие по двойному нажатию и алгоритм переводится в исходное состояние. Для того, чтобы отличать короткое нажатие от длительного, факт короткого нажатия желательно регистрировать по отпусканию кнопки в течение интервала времени для короткого нажатия. То есть, при нажатии кнопки запускается таймер отсчета интервала для длительного нажатия, и если кнопка отпускается до истечения этого интервала, значит определяется короткое нажатие, если после истечения, значит сразу выполняется действие по длительному нажатию. Опять же, все эти дополнительные функции одной кнопки не должны противоречить друг другу, не должны диаметрально изменять их. То есть, одиночное короткое нажатие - изменение счетчика на 1, длительное нажатие - изменение на 10 или непрерывное изменение при удержании. Ну, вы знаете, встречали такое в часах например. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.