Здравствуйте! Да, я уже задавал по этой теме вопрос, но в данном случае, по этой теме у меня последние вопросы. Это мне на ирк-канале вжевывали О_о ...
процедура опроса формирует слово состояния кнопок, затем процедура разбора анализирует изменения этих состоянии и формирует события типа "произожло нажатие кнопки N", "произожло отпускание кнопки N", "кнопка N удерживается". Дальше диспетчер событий по нужному событию вызывает нужную процедуру
Таким образом, лучше сделать сканирование матрицы (или просто массива) кнопок отдельно, анализ отдельно.
сканирование в простейшем случае может быть просто чтением порта, если кнопки висят на пинах подряд .
Дальше процедура анализа
Обзовем ее "наблюдатель"
Она как и сканирование, вызывается в каждом цикле программы
Наблюдатель смотрит на слово состояния, сравнивая его с предыдущим запомненным состоянием.
В самом начале в качестве запомненного, конечно, "все выключены"
при обнаружении неравенства - проверяем, какие именно биты изменились
в цикле по битам
соответствено, получаем события нижнего уровня - "кнопка нажалась" "кнопка отпустилась"
Если "кнопка нажалась" - запускаем виртуальный таймер, соответствующий кнопке (позаботимся чтоб на каждую кнопку был свой таймер - см. Татарчевского часть 5 )
если "кнопка отпустилась", а таймер еще не отработал - таймер сбрасываем и выставляем событие "кратковременное нажатие"
(событие - на самом деле это просто флаг такой, сбрасываемый после использования)
если таймер успел отработать - выставляем событие "длительное нажатие"
Дальше эти события-флаги анализирует диспетчер, таке вызываемый в главном цикле
диспетчер берет значит эти события-флаги, (не забывая сбрасывать после анализа)
Впрочем, "кнопка нажалась" его не волнует
это событие можно не выставлять
важны именно "краткое нажатие" "удержание" и "отпускание"
ну и смотрит, для какой кнопки какое событие произошло
краткое нажатие плюса или минуса - вызываем процедуру/функцию инкремента или декремента, сбрасываем флаг
Если "удержание" - для плюса-минуса опять же вызываем нужную процедуру, но флаг не сбрасываем
для ввода соответственно вызываем функцию запоминания
и для ввода флаг сбрасываем,
Для плюса-минуса флаг "удержание" сбрасываем по поступлению события "отпускание"
Вот где-то так.
Резюмируя, на удержание на каждую кнопку ставится флаг. Вопросы следующие:
Этот флаг потом проверяется в обработчиках клавиш? Или, если этот флаг установлен, то формируется виртуальная клавиша (термин из цикла статей Татарчевского), и по виртуальной клавише вызывается соответствующая функция?
Вопрос следующий. Я видел такую реализацию: Нажимая и удерживая клавишу параматры начинают меняться с увеличивающейся скоростью. После прочтения материалов, догадываюсь, что это реализуется в процедуре, которая выставляет события нажатие, удержание, автоповтор.
Что скажете?