66 branches :
77 - test/dual-navigator
88 paths :
9- - emVdK/config.h
10- - emVdK/keymap.json
11- - emVdK/rules.mk
129 - scripts/patch-voyager-dual-hid.py
1310 - .github/workflows/build-dual-navigator-test.yml
1411
1512permissions :
16- contents : read
13+ contents : write
14+
15+ env :
16+ LAYOUT_ID : emVdK
17+ LAYOUT_GEOMETRY : voyager
18+ QMK_OPENRGB_REF : module_revD
1719
1820jobs :
1921 build-dual-navigator :
@@ -24,13 +26,107 @@ jobs:
2426 uses : actions/checkout@v5
2527 with :
2628 ref : test/dual-navigator
27- fetch-depth : 1
29+ fetch-depth : 0
30+
31+ - name : Download latest Oryx layout source
32+ id : oryx
33+ run : |
34+ response=$(curl --fail --silent --show-error --location 'https://oryx.zsa.io/graphql' \
35+ --header 'Content-Type: application/json' \
36+ --data '{"query":"query getLayout($hashId: String!, $revisionId: String!, $geometry: String) {layout(hashId: $hashId, geometry: $geometry, revisionId: $revisionId) { revision { hashId, qmkVersion, title }}}","variables":{"hashId":"'"${LAYOUT_ID}"'","geometry":"'"${LAYOUT_GEOMETRY}"'","revisionId":"latest"}}')
37+
38+ hash_id=$(echo "$response" | jq -r '.data.layout.revision.hashId')
39+ firmware_version=$(printf '%.0f' "$(echo "$response" | jq -r '.data.layout.revision.qmkVersion')")
40+ title=$(echo "$response" | jq -r '.data.layout.revision.title')
41+
42+ test -n "$hash_id"
43+ test "$hash_id" != "null"
44+ test -n "$firmware_version"
45+
46+ echo "Oryx revision: $hash_id"
47+ echo "Oryx QMK firmware: firmware${firmware_version}"
48+ echo "Oryx title: $title"
49+
50+ curl --fail --silent --show-error --location \
51+ "https://oryx.zsa.io/source/${hash_id}" \
52+ -o source.zip
53+
54+ rm -rf "${LAYOUT_ID}"
55+ mkdir -p "${LAYOUT_ID}"
56+ unzip -oj source.zip '*_source/*' -d "${LAYOUT_ID}"
57+ rm source.zip
58+
59+ echo "hash_id=${hash_id}" >> "$GITHUB_OUTPUT"
60+ echo "firmware_version=${firmware_version}" >> "$GITHUB_OUTPUT"
2861
29- - name : Initialize ZSA QMK firmware25
62+ - name : Add dual Navigator and OpenRGB test configuration
63+ run : |
64+ python3 - <<'PY'
65+ import json
66+ import re
67+ from pathlib import Path
68+
69+ layout = Path("emVdK")
70+
71+ keymap_json = layout / "keymap.json"
72+ data = json.loads(keymap_json.read_text())
73+ modules = data.setdefault("modules", [])
74+ for module in (
75+ "zsa/oryx",
76+ "zsa/navigator_trackball",
77+ "zsa/navigator_trackpad",
78+ "zsa/automouse",
79+ "zsa/defaults",
80+ "openrgb",
81+ ):
82+ if module not in modules:
83+ modules.append(module)
84+ keymap_json.write_text(json.dumps(data, indent=4) + "\n")
85+
86+ config = layout / "config.h"
87+ text = config.read_text()
88+ for name, value in (
89+ ("NAVIGATOR_TRACKBALL_ROTATION", "325"),
90+ ("NAVIGATOR_TRACKPAD_ROTATION", "0"),
91+ ):
92+ pattern = rf"^#define\s+{name}\s+.*$"
93+ replacement = f"#define {name} {value}"
94+ if re.search(pattern, text, flags=re.MULTILINE):
95+ text = re.sub(pattern, replacement, text, flags=re.MULTILINE)
96+ else:
97+ text += f"\n{replacement}\n"
98+ config.write_text(text)
99+
100+ rules = layout / "rules.mk"
101+ text = rules.read_text()
102+ pattern = r"^MOUSE_SHARED_EP\s*=.*$"
103+ if re.search(pattern, text, flags=re.MULTILINE):
104+ text = re.sub(pattern, "MOUSE_SHARED_EP = yes", text, flags=re.MULTILINE)
105+ else:
106+ if text and not text.endswith("\n"):
107+ text += "\n"
108+ text += "MOUSE_SHARED_EP = yes\n"
109+ rules.write_text(text)
110+ PY
111+
112+ - name : Save refreshed test source on branch
113+ run : |
114+ git config --local user.name "github-actions"
115+ git config --local user.email "github-actions@github.com"
116+ git add "${LAYOUT_ID}"
117+ if ! git diff --cached --quiet; then
118+ git commit -m "Refresh dual Navigator test source from Oryx"
119+ git push origin HEAD:test/dual-navigator
120+ else
121+ echo "Oryx source unchanged"
122+ fi
123+
124+ - name : Initialize matching ZSA QMK firmware
30125 run : |
31126 git submodule update --init --remote --depth=1 --no-single-branch
32127 cd qmk_firmware
33- git checkout -B firmware25 origin/firmware25
128+ git checkout -B "firmware${{ steps.oryx.outputs.firmware_version }}" \
129+ "origin/firmware${{ steps.oryx.outputs.firmware_version }}"
34130 git submodule update --init --recursive
35131 cd ..
36132
39135 rm -rf qmk_firmware/modules/openrgb
40136 git clone \
41137 --depth 1 \
42- --branch module_revD \
138+ --branch "${QMK_OPENRGB_REF}" \
43139 https://gitlab.com/OpenRGBDevelopers/QMK-OpenRGB.git \
44140 qmk_firmware/modules/openrgb
45141 echo "QMK-OpenRGB commit: $(git -C qmk_firmware/modules/openrgb rev-parse HEAD)"
@@ -50,14 +146,13 @@ jobs:
50146
51147 - name : Validate test configuration
52148 run : |
53- grep -q '"zsa/navigator_trackball"' emVdK/keymap.json
54- grep -q '"zsa/navigator_trackpad"' emVdK/keymap.json
55- grep -q '"openrgb"' emVdK/keymap.json
56- grep -q 'NAVIGATOR_TRACKBALL_ROTATION 325' emVdK/config.h
57- grep -q 'NAVIGATOR_TRACKPAD_ROTATION 0' emVdK/config.h
58- grep -q '^MOUSE_SHARED_EP = yes$' emVdK/rules.mk
59-
60- # OpenRGB remains on stock QMK Raw HID; Oryx remains on the second HID.
149+ grep -q '"zsa/navigator_trackball"' "${LAYOUT_ID}/keymap.json"
150+ grep -q '"zsa/navigator_trackpad"' "${LAYOUT_ID}/keymap.json"
151+ grep -q '"openrgb"' "${LAYOUT_ID}/keymap.json"
152+ grep -q 'NAVIGATOR_TRACKBALL_ROTATION 325' "${LAYOUT_ID}/config.h"
153+ grep -q 'NAVIGATOR_TRACKPAD_ROTATION 0' "${LAYOUT_ID}/config.h"
154+ grep -q '^MOUSE_SHARED_EP = yes$' "${LAYOUT_ID}/rules.mk"
155+
61156 grep -q 'void raw_hid_receive(uint8_t \*data, uint8_t length)' \
62157 qmk_firmware/modules/openrgb/openrgb.c
63158 grep -q 'void oryx_hid_receive(uint8_t \*data, uint8_t length)' \
@@ -68,20 +163,20 @@ jobs:
68163
69164 - name : Install layout into QMK tree
70165 run : |
71- rm -rf qmk_firmware/keyboards/zsa/voyager/keymaps/emVdK
166+ rm -rf " qmk_firmware/keyboards/zsa/voyager/keymaps/${LAYOUT_ID}"
72167 mkdir -p qmk_firmware/keyboards/zsa/voyager/keymaps
73- cp -r emVdK qmk_firmware/keyboards/zsa/voyager/keymaps/
168+ cp -r "${LAYOUT_ID}" qmk_firmware/keyboards/zsa/voyager/keymaps/
74169
75170 - name : Build Voyager firmware
76171 run : |
77172 docker run \
78173 -v ./qmk_firmware:/root \
79174 --rm \
80175 qmk \
81- /bin/sh -c '
82- qmk setup zsa/qmk_firmware -b firmware25 -y
83- make zsa/voyager:emVdK
84- '
176+ /bin/sh -c "
177+ qmk setup zsa/qmk_firmware -b firmware${{ steps.oryx.outputs.firmware_version }} -y
178+ make zsa/voyager:${LAYOUT_ID}
179+ "
85180
86181 - name : Show built firmware
87182 run : |
0 commit comments