Состояния клавиш и переходы

Каждая клавиша клавиатуры может находиться в одном из пяти состояний, определённых константой pl_kp_event_codes:

0 - PL_KP_EVENT_LONGRELEASED:Клавиша отпущена «давно».
1 - PL_KP_EVENT_RELEASED:Клавиша отпущена «только что».
2 - PL_KP_EVENT_PRESSED:Клавиша нажата «только что».
3 - PL_KP_EVENT_LONGPRESSED:Клавиша нажата «давно».
4 - PL_KP_EVENT_REPEATPRESSED:Автоповтор для клавиши.

На следующей диаграмме показаны все состояния клавиши и возможные переходы между ними:

Диаграмма всех состояний клавиши и возможных переходов между ними.

Красные стрелки показывают переходы, когда клавиша нажата (или остаётся нажатой), синие - когда клавиша отпущена (или остаётся отпущенной). Каждый раз, когда клавиша переходит в следующее состояние, это изменение записывается в FIFO событий клавиатуры глубиной восемь состояний.

Включение объекта kp. (установка kp.enabled = 1 - YES) очищает FIFO событий клавиатуры и переводит каждую клавишу в состояние «longreleased». Если удерживать клавишу достаточно долго, она перейдёт в состояние «pressed». Оттуда клавиша может перейти в «released», а затем в «longreleased», если вы её отпустите, либо в «longpressed» и затем в «repeatpressed», если продолжать удерживать.

На матричных клавиатурах объект kp. отслеживает состояние всех клавиш одновременно, и можно нажимать сразу несколько клавиш - переходы между состояниями записываются независимо для каждой клавиши. Двоичные клавиатуры позволяют отслеживать только одну клавишу за раз, так как двоичная клавиатура способна передавать в любой момент только один код клавиши.

Время перехода клавиши из одного состояния в другое измеряется интервалами по 10 мс. Именно с таким периодом объект kp. «опрашивает» клавиатуру. Задержка каждого перехода, выраженная в интервалах по 10 мс, задаётся отдельным свойством, так что вы сами решаете, что значит «только что» и «давно». Вот эти свойства: kp.longpressdelay, kp.longreleasedelay, kp.pressdelay, kp.releasedelay и kp.repeatdelay. Пять доступных состояний клавиш и настраиваемое время переходов позволяют организовать сложный ввод с клавиатуры и обойтись меньшим числом клавиш.

Кроме того, свойство kp.autodisablecodes позволяет задать список клавиш и их переходов между состояниями, при которых клавиатура будет отключаться (kp.enabled = 0 - NO). Автоматическое отключение клавиатуры бывает очень полезно. Например, если на клавиатуре есть клавиши <0> ~ <9>, <ENTER> и <CANCEL>, можно задать в kp.autodisablecodes код клавиши <ENTER> и выбрать _PRESSED в качестве состояния автоотключения. Тогда, как только будет нажата клавиша <ENTER>, клавиатура перестанет принимать ввод, пока вы не включите её снова, установив kp.enabled = 1 - YES.

Если kp.genkpevent = 1 - YES, приложение получает одно событие on_kp на каждый переход между состояниями (на каждое событие клавиатуры в FIFO). Если kp.genkpevent = 0 - NO, переходы между состояниями нужно опрашивать методом kp.getkey. Подробнее об этом в разделах Получение событий клавиатуры через события on_kp и Получение событий клавиатуры методом kp.getkey.

Обратите внимание, что на диаграмме есть ещё одно состояние. Оно называется «lockup» (зависание) и возникает, когда клавиша остаётся нажатой в течение kp.lockupdelay интервалов по 10 мс. Зависания (залипшие клавиши) возможны на клавиатуре любого типа. Ёмкостные сенсорные клавиатуры особенно подвержены зависаниям из-за электростатического разряда (ESD) и влаги (капля воды часто неотличима от пальца, касающегося клавиши). Заметьте, что «lockup» - это не состояние клавиши, а состояние клавиатуры в целом. Как только обнаружено зависание, клавиатура отключается (kp.enabled = 0 - NO).

Исходный материал Tibbo обновлён 2 августа 2022Оригинал на docs.tibbo.com · Сообщить об ошибке