dm32: Add DB48-specific keymap

Add a DM48 keymap that restores correct keybindings in the file
selector dialog.

Fixes: #1002

Signed-off-by: Christophe de Dinechin <christophe@dinechin.org>
This commit is contained in:
Christophe de Dinechin 2024-08-30 19:44:36 +02:00
parent 3385ea4b3b
commit 709436d095
8 changed files with 315 additions and 2 deletions

View file

@ -69,7 +69,7 @@ color-%:
# installation steps
COPY=cp
install: install-pgm install-qspi install-help install-demo install-config
install: install-pgm install-qspi install-keymap install-help install-demo install-config
$(EJECT)
@echo "# Installed $(VERSION)"
install-fast: install-pgm
@ -78,6 +78,8 @@ install-pgm: all
$(COPY) $(TARGET).$(PGM) $(MOUNTPOINT)
install-qspi: all
$(COPY) $(QSPI) $(MOUNTPOINT)
install-keymap: keymap.bin
$(COPY) $< $(MOUNTPOINT)
install-help: help/$(TARGET).md
mkdir -p $(MOUNTPOINT)help/ $(MOUNTPOINT)help/img
$(COPY) help/$(TARGET).md help/*.bmp $(MOUNTPOINT)help/
@ -156,6 +158,7 @@ dist: all
$(TAR_OPTS) \
$(TARGET).$(PGM) \
$(TARGET)_qspi.bin \
keymap.bin \
help/$(TARGET).md \
help/*.bmp help/*/*.bmp \
state/*.48[sSbB] \

BIN
keymap.bin Normal file

Binary file not shown.

197
keymap_utils/bin/keymap2layout Executable file
View file

@ -0,0 +1,197 @@
#!/usr/bin/python3
import os,sys,re
sysmap = [
33, 34, 35, 36, 37,
28, 29, 30, 31, 32,
23, 24, 25, 26, 27,
18, 19, 20, 21, 22,
13, 14, 15, 16, 17,
8, 9, 10, 11, 12,
2, 3, 4, 5, 6,
39, 40, 41, 42, 43,
44, 13, 7, 1, 38 ]
key_ix_map = [
44, 35, 36, 37, 38, 39, 43, 30, 31, 32, 33, 34, 42, 25, 26, 27, 28, 29, 20, 21, 22, 23, 24, 15, 16, 17, 18, 19, 10, 11, 12, 13, 14, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4
]
key_defs = ["None",
"KEY_SIGMA",
"KEY_INV",
"KEY_SQRT",
"KEY_LOG",
"KEY_LN",
"KEY_XEQ",
"KEY_STO",
"KEY_RCL",
"KEY_RDN",
"KEY_SIN",
"KEY_COS",
"KEY_TAN",
"KEY_ENTER",
"KEY_SWAP",
"KEY_CHS",
"KEY_E",
"KEY_BSP",
"KEY_UP",
"KEY_7",
"KEY_8",
"KEY_9",
"KEY_DIV",
"KEY_DOWN",
"KEY_4",
"KEY_5",
"KEY_6",
"KEY_MUL",
"KEY_SHIFT",
"KEY_1",
"KEY_2",
"KEY_3",
"KEY_SUB",
"KEY_EXIT",
"KEY_0",
"KEY_DOT",
"KEY_RUN",
"KEY_ADD"
]
key_lbls = ["None",
"Sum+",
"1/x",
"SQRT",
"LOG",
"LN",
"XEQ",
"STO",
"RCL",
"RDN",
"SIN",
"COS",
"TAN",
"ENTER",
"x<>y",
"CHS",
"E",
"<--",
"UP",
"7",
"8",
"9",
"DIV",
"DOWN",
"4",
"5",
"6",
"MUL",
"SHIFT",
"1",
"2",
"3",
"SUB",
"EXIT",
"0",
"DOT",
"RUN",
"ADD",
"F1",
"F2",
"F3",
"F4",
"F5",
"F6",
]
def key_but(lbl,width=5):
W = 5
w2 = width//2
l = len(lbl)
l2 = l//2
s = " "*W + lbl + " "*W
x=W-(w2-l2)
#print("[{}]".format(s[x:x+width]))
return s[x:x+width]
def gen_ix_map():
x = 38
for qq in range(43):
if x == 44: x = 1
y = sysmap.index(x)
#print("{}-{}, ".format(x,y))
print("{}, ".format(y),end='')
x += 1
rowends=[43,6,12,17,22,27,32,37]
def print_layout(m):
print("")
row=1
ln,lm = "",""
x = 37 # Scan code
for ix in key_ix_map:
x += 1
if x == 44: x = 1
kc = m[ix]
bb = 1 if 17 < x < 38 else 0
bw = bb + (5 if x!=13 else 11)
lbl = key_lbls[kc]
ln += "|{}".format(key_but(lbl,bw))
cod = "{:2}:{:2}".format(x,kc)
lm += "|{}".format(key_but(cod,bw))
if x in rowends:
# ln
el = " |" if bb else "|"
ln += el
lm += el
# lnr
lnr = " {}: ".format(row)
lnf = " "*len(lnr)
# ln2
ln2 = re.sub('[^|]','-',ln)
ln2 = re.sub('[|]','+',ln2)
if row==1:
print(lnf+ln2)
print(lnr+ln)
print(lnf+lm)
print(lnf+ln2)
ln,lm = "",""
row += 1
print("")
if len(sys.argv) < 2:
print("""
Usage: {} <keymap.txt>
""".format(sys.argv[0].split('/')[-1]))
sys.exit(1)
fname = sys.argv[1]
with open(fname) as f:
lns = f.readlines()
keymap = eval("[" + "".join(lns) + "]")
#print(keymap)
if len(keymap) != 45:
print("Unexpected len of keymap {} - exiting".format(len(keymap)))
sys.exit(1)
# Button label test
#for lbl in key_lbls: print("|{}|".format(key_but(lbl)))
#gen_ix_map()
#print_layout(sysmap)
print_layout(keymap)

102
keymap_utils/bin/mk_keymap Executable file
View file

@ -0,0 +1,102 @@
#!/bin/bash
kbdnam=$1
maptxt=$2
if [ -z "$2" ]; then
cat << OI
Usage: mk_keymap <name> <keymap.txt>
OI
exit 1
fi
if [ ! -f $maptxt ]; then
echo "ERROR: Cannot find keymap file '$maptxt'."
exit 1
fi
# =============================================
# Functions
# =============================================
# $1 number
# $2 fill char
makefill() {
local n z
n=$1; z="$2"
while [ ${#z} -lt $n ]; do
z="$z$2"
done
printf "${z:0:$n}"
}
toint() {
local x
x=`printf "$1" |
sed -e 's|\(..\)|\1@|g' | tr '@' '\012' | tac | tr -d '\012' |
sed -e 's|\(..\)|@\1|g' | sed -e 's|@|\\\x|g'`
printf "$x"
}
toint8() {
local x
x=`printf "$1" | sed -e 's|\(..\)|@\1|g' | sed -e 's|@|\\\x|g'`
printf "$x"
}
# $1 string
# $2 number of bytes including final \0
zstr() {
local x n
let n=$2-1
x="${1}`makefill $2 @`" # Add some filling
x=`sed -e 's|@|\\\0|g' <<< "${x:0:$n}@"`
printf "$x"
}
gethex() {
for a in "$@"; do
printf "%02x" $a
done
}
getkeymapcodes() {
cat $maptxt | tr ',\012' ' '
}
check_keymapcodes() {
scod=`echo "$codes" | tr ' ' '\012' | sort -n | tr '\012' ' '`
hh=`gethex $scod`
#echo "hh: $hh"
if [ "$hh" != "$allcodes" ]; then
echo "Bad code list in $maptxt"
exit 1
fi
}
# =============================================
# MAIN
# =============================================
magic=D377D1BD
kmap=keymap.bin
allcodes=0102030405060708090a0b0c0d0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c
codes=`getkeymapcodes`
check_keymapcodes
hex=`gethex $codes`
#echo "$hex"
toint "$magic" > $kmap
zstr "$kbdnam" 16 >> $kmap
toint8 "$hex" >> $kmap

View file

@ -0,0 +1,9 @@
33, 34, 35, 36, 37,
28, 29, 30, 31, 32,
23, 24, 25, 26, 27,
18, 19, 20, 21, 22,
13, 14, 15, 16, 17,
8, 9, 10, 11, 12,
2, 3, 4, 5, 6,
39, 40, 41, 42, 43,
44, 13, 7, 1, 38

Binary file not shown.

View file

@ -34,6 +34,6 @@
#define PROGRAM_NAME "DB50X"
#define PROGRAM_VERSION DB48X_VERSION
#define PROGRAM_KEYMAP_ID 0x32334d44
#define PROGRAM_KEYMAP_ID 0x38344244
#endif // MAIN_H

View file

@ -34,4 +34,6 @@
#define PROGRAM_NAME "DB48X"
#define PROGRAM_VERSION DB48X_VERSION
#define PROGRAM_KEYMAP_ID 0x38344244
#endif // MAIN_H