2 кнопки - Нужно выжать 5 режимов обработки.

Обсуждаем контроллеры компании Atmel.
Ответить
Вымогатель припоя
Сообщения: 615
Зарегистрирован: Вс дек 28, 2014 21:54:05

Сообщение dgrett »

{Дабл клик, мне кажется тоже не лучшим вариантом, поскольку не исключает возможности случайного двойного нажатия}

В компьютерном хомяке используется, и что, случайно нажимаете?
На трёх кнопках только комбинаций одиночных нажатий 7. Ну хрен с ним, три сразу не нажимать, то 6.
Я всё-всё узнAю и стану профессором.
Реклама
Это не хвост, это антенна
Сообщения: 1492
Зарегистрирован: Ср июн 25, 2008 15:19:44

Сообщение Demiurg »

Всем привет. ТС, пишите сейчас на си, продолжайте дальше. Ассемблер стоит поизучать, но только лишь для ознакомления. Что делать с ним дальше, сами разберётесь, нужно вам это или нет.
Вот вам ссылка на цикл статей Татарчевского. В данный момент это последняя часть, в которой описана работа с клавиатурой. Советую проштудировать все части. В этом цикле описано главное. Подход в программировании. На основе которого вы сможете реализовать весь свой проект. Преимущество данного подхода в том, что он собирается как конструктор из кубиков, программных модулей. А конечные автоматы позволят вам реализовать проект с любым алгоритмом.
Чуть позже выложу некоторые примеры. Будут вопросы, пишите здесь или в личку.
Контактная информация:
Реклама
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="ARV",url="/forum/viewtopic.php?p=4178820#p4178820"]код в целом такой[/uquote]
Если при двух нажатых кнопках одну отпустить, то приходит код нажатия оставшейся.
Это не хвост, это антенна
Сообщения: 1492
Зарегистрирован: Ср июн 25, 2008 15:19:44

Сообщение Demiurg »

Если ввести состояние автомата "ожидание отпускания всех кнопок"...
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Поставщик валерьянки для Кота
Сообщения: 1956
Зарегистрирован: Сб май 05, 2012 20:24:52
Откуда: KN34PC, Болгария

Сообщение veso74 »

С кнопками клавиатуры: двойной щелчок или короткое/долгое удержание нетипичны для пользователя. Приходится долго ему объяснять как использовать :) (и даже через напр. 3 дня забываешь что есть что). Если необходим больший выбор команд с ограниченными органами ввода (кнопками), меню более практично. С кнопкой - чаще всего: щелчок, а иногда: для настройки/выбор - долгое удержание на одной кнопке. Нажатие двух кнопок - в исключительных случаях, для какой-то особой настройки.
Контактная информация:
Реклама
Это не хвост, это антенна
Сообщения: 1492
Зарегистрирован: Ср июн 25, 2008 15:19:44

Сообщение Demiurg »

Есть промышленные приборы, в которых реализуются длительные нажатия.
Два, три нажатия тоже есть. Все это от наличия, точнее, дефицита интерфейса. Простейший пример. Кнопка на гарнитуре. Два нажатия прибавить громкость. Три следующий трек.
Продолжим?
Контактная информация:
Реклама
Встал на лапы
Сообщения: 95
Зарегистрирован: Чт дек 16, 2021 18:20:02

Сообщение Vovik-78 »

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

Добавлено after 1 minute 34 seconds:
[uquote="Reflector",url="/forum/viewtopic.php?p=4178946#p4178946"][uquote="ARV",url="/forum/viewtopic.php?p=4178820#p4178820"]код в целом такой[/uquote]
Если при двух нажатых кнопках одну отпустить, то приходит код нажатия оставшейся.[/uquote]

Проверил. Срабатывает код отпущеной. Но мне нравится, что при передержке нужный код срабатывает один раз. Хотя вариант с бысттрым инкриментом на этой базе я тоже сделал и использовал там, где большие значения можно выставлять.

Добавлено after 4 minutes 20 seconds:
[uquote="Demiurg",url="/forum/viewtopic.php?p=4178920#p4178920"]Вот вам ссылка на цикл статей Татарчевского. В данный момент это последняя часть, в которой описана работа с клавиатурой.[/uquote]

Спасибо Вам за ссылку. Буду изучать.
И за предложение помощи тоже.
Обязательно воспользуюсь, если уткнусь во что то.

А вариант с упрощением/более корректной реадизацией данного кода может кто то подскажет.
Думаю, что если его правильно и коротко реализовать, то пригодиться может не только мне.
Последний раз редактировалось Vovik-78 Пт фев 11, 2022 19:46:03, всего редактировалось 1 раз.
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18786
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

[uquote="Reflector",url="/forum/viewtopic.php?p=4178946#p4178946"][uquote="ARV",url="/forum/viewtopic.php?p=4178820#p4178820"]код в целом такой[/uquote]
Если при двух нажатых кнопках одну отпустить, то приходит код нажатия оставшейся.[/uquote]а как должно быть? уж не делать ли стек нажатий предлагаете?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Встал на лапы
Сообщения: 95
Зарегистрирован: Чт дек 16, 2021 18:20:02

Сообщение Vovik-78 »

В идеале, наверно нет.
Но это пока лучший вариант который у меня получился.
И со стороны пользователя, мне кажется что отпустить кнопку случайно сложнее, чем нажать.
Но если кто то подскажет как этого избежать - будет вообще отлично.
Да и нажатий мне больше не нужно. По крайней мере пока. ))
Но понимание того, что отсюда можно выжать еще - радует.
Это не хвост, это антенна
Сообщения: 1492
Зарегистрирован: Ср июн 25, 2008 15:19:44

Сообщение Demiurg »

ТС, чтобы вы поняли, что я вам предложил (ссылка на цикл статей). Смотрите, есть главный автомат. Есть подчинённые автоматы. Программные таймеры. Служба сообщений.

Это может прозвучать для вас сложно, на самом деле все просто.

Модуль клавиатуры (кнопок в вашем случае).
Состояния автомата:
Init: инициализация модуля.
Wait_Keys_Pressed:
Если не нажато, выход.
Если нажато, запоминаем, что нажато. Установка таймера на подавление дребезга.
Keys_Pressed:
Время вышло? Нет, выход. Да, Снова считываем состояние кнопок. Если не равно или не нажато, установка состояния Wait_Keys_Pressed, выход. Если нажато и равно, установка состояния Wait_Keys_Unpressed. Либо, если требуется, установка длительного нажатия кнопки. Если требуется, проверка на одновременное нажатие кнопок. Как видите, за счёт ввода новых состояний автомата, можно реализовать любой алгоритм. И любое сочетание и режимы кнопок.
Главный автомат ожидает событие модуля клавиатуры и коды кнопок. В зависимости от состояния, принимает нужные.
Пример.
Ночник.
Lamp_Off:
Кнопка нажата? Нет, ждём. Да, включаем лампу. Установка состояния Lamp_On.
Lamp_On:
Кнопка нажата? Нет, ждём. Да, выключаем лампу. Установка состояния Lamp_Off.
Как видите, все просто, на самом деле. Нужно понять главное, программные модули это состояния автомата. Чем, по сути являются как программа, так и сам микроконтроллер.
Контактная информация:
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18786
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

:facepalm:
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Встал на лапы
Сообщения: 95
Зарегистрирован: Чт дек 16, 2021 18:20:02

Сообщение Vovik-78 »

[uquote="Demiurg",url="/forum/viewtopic.php?p=4179264#p4179264"]ТС, чтобы вы поняли, что я вам предложил (ссылка на цикл статей). Смотрите, есть главный автомат. Есть подчинённые автоматы. Программные таймеры. Служба сообщений.

Это может прозвучать для вас сложно, на самом деле все просто.[/uquote]

Хорошо. Я Вас, наверно, понял.
Отложим кнопки в сторонку, пока что.
Займемся изучением и пониманием автоматов.
Друг Кота
Аватара пользователя
Сообщения: 15754
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Массив указателей на функции.
:wink:
Это не хвост, это антенна
Сообщения: 1492
Зарегистрирован: Ср июн 25, 2008 15:19:44

Сообщение Demiurg »

Ну, это может быть switch-case, может быть массив, где переменная состояние автомата она же и индекс массива указателей.
Видел реализацию, где нет массива, а в указатель на функции, в зависимости от выполнения условий вставляется адрес нужной функции. Для меня это показалось неоптимально. И громоздко по выхлопу.
Контактная информация:
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="ARV",url="/forum/viewtopic.php?p=4179204#p4179204"]а как должно быть? уж не делать ли стек нажатий предлагаете?[/uquote]
Как будет реализовано - это вопрос вторичный, в первую очередь должно работать правильно. Там же проблема не только в отпусканиях одних кнопок трактуемых как нажатия других, сами отпускания тоже могут игнорироваться. Например, хочу я кнопку использовать как Shift, нажимаю ее, получаю код, отпускаю одновременно с нажатие другой кнопки и придет код нажатия другой кнопки, отпускание потеряется т.к. для этого нужно прочитать с порта 0. В итоге Shift не нажат, но программа думает иначе. В коде который я приводил нажатия и отпускания в отдельных переменных хранятся и подобных проблем не возникает, а switch с присваиванием кодов кнопок можно куда угодно прикрутить...
Встал на лапы
Сообщения: 95
Зарегистрирован: Чт дек 16, 2021 18:20:02

Сообщение Vovik-78 »

мне с ООП с самого нуля тогда прийдется разбираться.
Если бы это на простом Си было, тооо...
Собутыльник Кота
Аватара пользователя
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01

Сообщение Eddy_Em »

Зачем раздельно нажатия и отпускания хранить, если достаточно каждой кнопке выделить по две переменных: enum (текущее состояние) и uint32_t - условное время (в миллисекундах) наступления последнего события? Состояние из: relax, press, hold, release. Если нужно двойное нажатие отрабатывать, можно еще добавить dblcklick. И все! В суперлупе тупо раз в миллисекунду вызываем КА проверки состояния кнопок. Если состояние изменилось, обновляем время и состояние. А в когда нужно - проверяем, что там с кнопками. И если нужно что-то делать при одновременном нажатии нескольких, просто проверяем, чтобы у всех трех было hold или press.
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Контактная информация:
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="Vovik-78",url="/forum/viewtopic.php?p=4179834#p4179834"]мне с ООП с самого нуля тогда прийдется разбираться.
Если бы это на простом Си было, тооо...[/uquote]
Не нужно там ни в чем разбираться, внутри класса функции и переменные, удаляешь каркас в виде:

Код: Выделить всё

class Buttons
{
public:

private:
};
и все, остается сишный код в котором две непонятные строки:

Код: Выделить всё

Port::mode(PinMode::PullUp);
Пины - входы с подтяжками.

Код: Выделить всё

uint8_t current = ~Port::read();
Тут то же что и у ARV, читаем из порта так чтоб для нажатых кнопок были единички, остальные биты обнуляем(здесь целый порт, потому этого нет).
Delta еще - это разница во времени между вызовами update(), если вызывается каждую ms, то можно просто 1 подставить.
ShortThreshold и LongThreshold у меня были 30 и 700, а вообще в оригинале десяток параметров внутрь класса пробрасывается и они все будут константами.
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18786
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Reflector писал(а):Например, хочу я кнопку использовать как Shift, нажимаю ее, получаю код, отпускаю одновременно с нажатие другой кнопки и придет код нажатия другой кнопки, отпускание потеряется
это важно, если электронный рояль делать, там виртуозы десятью пальцами 15 клавиш жмут... а в самоделках с тремя-четырмя кнопками, на которые пальцем попасть не просто, это не критично. оно-то, конечно, правильно делать нужно... но только когда оно того стоит :)))
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Это не хвост, это антенна
Сообщения: 1492
Зарегистрирован: Ср июн 25, 2008 15:19:44

Сообщение Demiurg »

Я бы хотел указать на назначение, для чего используется клавиатура. Одно дело, если это электронный рояль, другое, когда прибор. Для которого можно спокойно вводить состояние клавиатурного модуля "сочетание кнопок", когда нажато две и более кнопок. В этом случае мы не плодим лишние сущности.
Алгоритм. Не забываем, что кнопки, клавиатуры это человекоинтерфейс, то есть медленный. И мне кажется тут всё просто. Есть кнопки, у которых статус "участвующие в сочетаниях". Статус, если честно, громко сказано. Но суть понятна. Если нажимаются сочетания, то это предполагает сознательное намерение.

Пусть у нас есть кнопки участвующие в сочетаниях. Тут, наверное, есть два варианта. Сначала нажимается одна кнопка. Типа, как "Shift", "Alt". Конечный автомат отловил, что это, возможно, сочетание. Перешёл в состояние ожидания нажатия следующей кнопки. Если эту кнопку отпустили, исходное состояние. Если нажатие, то в буфер клавиатуры записывается код сочетания.

Второй способ. Так как, теоретически, при одновременном нажатии, первой может начаться любая кнопка, то при нажатии любой из них установка состояния ожидания сочетания, и так же: если нажата ещё одна кнопка, запись в буфер кода сочетания.

Навскидку, как то так...
Контактная информация:
Ответить

Вернуться в «AVR»