# shellcheck shell=bash # Part of JoeyLib, Copyright (c) 2026 Scott Duensing, under the MIT License. # See LICENSE.md for license information. # SPDX-License-Identifier: MIT # # Shared by the input gates (scripts/verify-*-input.sh) that check the named # keys a second physical key gives: the keypad's 8, 2, 4, and 6 as the # arrows, its Enter as Return, and the right Ctrl and Alt as Ctrl and Alt, # each held alone, and Up and the keypad's 8 held together with either let # go first, which must leave Up down (src/core/inputInternal.h, # INPUT_KEY_SECOND). Each step holds its keys (letting go of every other), # waits KEYS_SETTLE_SECONDS, and reads KEYS's Return, Ctrl, Alt, Up, Down, # Left, and Right cells (examples/keys) as seven digits, keysCells's. # # The gate sets KEYS_LABEL (its name, for the lines it prints) and defines, # by the key names below: # keysPress KEY hold a key down # keysRelease KEY let it go # keysRead print the seven digits for what is on the screen now # then calls keysRunSteps with the second keys its machine has, and puts # KEYS_FAILS (empty when every step read right) and KEYS_STEPS (how many # ran) in its verdict. # # Key names: up, and the second keys kp8, kp2, kp4, kp6, kpenter, rctrl, # ralt. KEYS_SETTLE_SECONDS="${KEYS_SETTLE_SECONDS:-0.5}" KEYS_FAILS="" KEYS_STEPS=0 KEYS_HELD=() # keysHold NAME WANT KEY... -- hold exactly KEYs, then read the cells, which # must be WANT. keysHold() { local name="$1" local want="$2" local key local lit shift 2 for key in "${KEYS_HELD[@]}"; do [[ " $* " == *" $key "* ]] || keysRelease "$key" done for key in "$@"; do [[ " ${KEYS_HELD[*]} " == *" $key "* ]] || keysPress "$key" done KEYS_HELD=("$@") sleep "$KEYS_SETTLE_SECONDS" lit=$(keysRead) KEYS_STEPS=$((KEYS_STEPS + 1)) echo "$KEYS_LABEL: $name: Return/Ctrl/Alt/Up/Down/Left/Right $lit" [ "$lit" = "$want" ] || KEYS_FAILS="${KEYS_FAILS:+$KEYS_FAILS; }$name: lit $lit, want $want" } # keysRunSteps KEY... -- every step for these second keys (kp8 among them: # the both-held steps use it). keysRunSteps() { local key keysHold "rest" 0000000 for key in "$@"; do case "$key" in kp8) keysHold "keypad 8 as Up" 0001000 kp8 ;; kp2) keysHold "keypad 2 as Down" 0000100 kp2 ;; kp4) keysHold "keypad 4 as Left" 0000010 kp4 ;; kp6) keysHold "keypad 6 as Right" 0000001 kp6 ;; kpenter) keysHold "keypad Enter as Return" 1000000 kpenter ;; rctrl) keysHold "right Ctrl as Ctrl" 0100000 rctrl ;; ralt) keysHold "right Alt as Alt" 0010000 ralt ;; *) KEYS_FAILS="${KEYS_FAILS:+$KEYS_FAILS; }no step for $key" ;; esac done keysHold "Up" 0001000 up keysHold "Up and keypad 8" 0001000 up kp8 keysHold "Up, keypad 8 let go" 0001000 up keysHold "keypad 8, Up let go" 0001000 kp8 keysHold "rest again" 0000000 }