Состояния клавиш и переходы
Каждая клавиша клавиатуры может находиться в одном из пяти состояний, определённых константой 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).