README: draw the signal path as SVG diagrams
Replace the ASCII signal chain in both READMEs with a rendered diagram (resources/diagram_en.svg / resources/diagram_ru.svg): SIM card <-> reader with the passive tap on the contacts, the FX2 logic analyzer, sigrok-cli with the iso7816 decoder, GSMTAP UDP :4729, and the SIMtrace Analyser / Wireshark consumers. The SVGs are hand-authored, self-contained (no scripts, no external references), carry <title>/<desc>, and each README embeds its own language variant with the chain repeated in the alt text. Release packaging: both diagrams are added to the archive allowlist. The shared-image equality check ignores them (the READMEs embed different files by design), while every other resources/ photo must still match across the two READMEs. AGENTS.md documents the exception.
This commit is contained in:
1 parent
8214089b2d
commit
6e663dcdcb
6 files changed
+90
-19
No files matched your search
@@ -1033,11 +1033,13 @@ pathspec, and also compared exactly against both archive listings (missing
|
|||||||
*and* unexpected entries fail): the decoder (`__init__.py`, `pd.py`,
|
*and* unexpected entries fail): the decoder (`__init__.py`, `pd.py`,
|
||||||
`gsmtap_stream.py`), the scripts (`setup.sh`/`start.sh`,
|
`gsmtap_stream.py`), the scripts (`setup.sh`/`start.sh`,
|
||||||
`setup.bat`/`start.bat`), `tools/vs_reader.py`, `README.md`, `README_RUS.md`,
|
`setup.bat`/`start.bat`), `tools/vs_reader.py`, `README.md`, `README_RUS.md`,
|
||||||
`LICENSE`, and every `resources/` image referenced from `README.md`. Tests,
|
`LICENSE`, every `resources/` photo referenced from both READMEs, and the two
|
||||||
`AGENTS.md`, the CI config, the development tools and the unreferenced
|
language variants of the pipeline diagram (`resources/diagram_en.svg`,
|
||||||
`resources/` images never enter the release. No `export-ignore` rules are
|
`resources/diagram_ru.svg`, added explicitly because each README embeds its
|
||||||
used, so GitHub's own source archives still contain the full tree. `dist/`
|
own). Tests, `AGENTS.md`, the CI config, the development tools and the
|
||||||
is gitignored.
|
unreferenced `resources/` images never enter the release. No `export-ignore`
|
||||||
|
rules are used, so GitHub's own source archives still contain the full tree.
|
||||||
|
`dist/` is gitignored.
|
||||||
|
|
||||||
Both archives are unpacked and verified: `pd.py` VERSION, `py_compile` of the
|
Both archives are unpacked and verified: `pd.py` VERSION, `py_compile` of the
|
||||||
three modules, `bash -n` of the shell scripts, the tar exec bits, CRLF on the
|
three modules, `bash -n` of the shell scripts, the tar exec bits, CRLF on the
|
||||||
|
|||||||
@@ -8,12 +8,7 @@ Fork of [svenso/sigrok_iso7816](https://github.com/svenso/sigrok_iso7816) with
|
|||||||
**live GSMTAP UDP streaming**, making a cheap FX2 logic analyzer (Saleae clone)
|
**live GSMTAP UDP streaming**, making a cheap FX2 logic analyzer (Saleae clone)
|
||||||
behave like a SIMtrace2 sniffer:
|
behave like a SIMtrace2 sniffer:
|
||||||
|
|
||||||
```
|

|
||||||
SIM card ⇄ reader (passive tap on the contacts)
|
|
||||||
→ FX2 logic analyzer (fx2lafw, 8ch, 24MHz max)
|
|
||||||
→ sigrok-cli + iso7816 decoder
|
|
||||||
→ GSMTAP UDP :4729 → [SIMtrace Analyser](https://github.com/anttro/simtrace-analyser) / Wireshark
|
|
||||||
```
|
|
||||||
|
|
||||||
[SIMtrace Analyser](https://github.com/anttro/simtrace-analyser) is the
|
[SIMtrace Analyser](https://github.com/anttro/simtrace-analyser) is the
|
||||||
recommended tool for visualising live traces and viewing saved captures —
|
recommended tool for visualising live traces and viewing saved captures —
|
||||||
|
|||||||
+1
-6
@@ -8,12 +8,7 @@
|
|||||||
**живым GSMTAP-UDP-стримингом**: дешёвый логический анализатор FX2 (клон
|
**живым GSMTAP-UDP-стримингом**: дешёвый логический анализатор FX2 (клон
|
||||||
Saleae) ведёт себя как сниффер SIMtrace2:
|
Saleae) ведёт себя как сниффер SIMtrace2:
|
||||||
|
|
||||||
```
|

|
||||||
SIM-карта ⇄ ридер (пассивный съём с контактов)
|
|
||||||
→ логический анализатор FX2 (fx2lafw, 8 каналов, до 24 МГц)
|
|
||||||
→ sigrok-cli + декодер iso7816
|
|
||||||
→ GSMTAP UDP :4729 → [SIMtrace Analyser](https://github.com/anttro/simtrace-analyser) / Wireshark
|
|
||||||
```
|
|
||||||
|
|
||||||
[SIMtrace Analyser](https://github.com/anttro/simtrace-analyser) —
|
[SIMtrace Analyser](https://github.com/anttro/simtrace-analyser) —
|
||||||
рекомендуемый инструмент для визуализации живых трасс и просмотра
|
рекомендуемый инструмент для визуализации живых трасс и просмотра
|
||||||
|
|||||||
@@ -0,0 +1,34 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="960" height="690" viewBox="0 0 960 690" role="img" aria-labelledby="diagram-title diagram-desc" font-family="'Segoe UI', 'Helvetica Neue', Arial, 'DejaVu Sans', sans-serif">
|
||||||
|
<title id="diagram-title">sigrok_iso7816_stream: signal path</title>
|
||||||
|
<desc id="diagram-desc">SIM card and reader with a passive tap on the contacts, FX2 logic analyzer (fx2lafw, 8 channels, up to 24 MHz), sigrok-cli with the iso7816 decoder, GSMTAP UDP :4729, SIMtrace Analyser and Wireshark</desc>
|
||||||
|
<defs>
|
||||||
|
<marker id="arrow" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse">
|
||||||
|
<path d="M0 0 L10 5 L0 10 Z" fill="#64748b"/>
|
||||||
|
</marker>
|
||||||
|
</defs>
|
||||||
|
<rect x="1" y="1" width="958" height="688" rx="18" fill="#ffffff" stroke="#e2e8f0" stroke-width="1.5"/>
|
||||||
|
<text x="480" y="30" text-anchor="middle" font-size="14" fill="#475569">passive tap on the contacts</text>
|
||||||
|
<rect x="150" y="48" width="210" height="72" rx="12" fill="#eff6ff" stroke="#93c5fd" stroke-width="1.5"/>
|
||||||
|
<text x="255" y="90" text-anchor="middle" font-size="20" font-weight="600" fill="#0f172a">SIM card</text>
|
||||||
|
<rect x="600" y="48" width="210" height="72" rx="12" fill="#eff6ff" stroke="#93c5fd" stroke-width="1.5"/>
|
||||||
|
<text x="705" y="90" text-anchor="middle" font-size="20" font-weight="600" fill="#0f172a">Reader</text>
|
||||||
|
<line x1="372" y1="84" x2="588" y2="84" stroke="#64748b" stroke-width="2" marker-start="url(#arrow)" marker-end="url(#arrow)"/>
|
||||||
|
<circle cx="480" cy="84" r="5" fill="#2563eb"/>
|
||||||
|
<line x1="480" y1="89" x2="480" y2="196" stroke="#64748b" stroke-width="2" marker-end="url(#arrow)"/>
|
||||||
|
<rect x="270" y="200" width="420" height="92" rx="12" fill="#f5f3ff" stroke="#c4b5fd" stroke-width="1.5"/>
|
||||||
|
<text x="480" y="236" text-anchor="middle" font-size="20" font-weight="600" fill="#0f172a">FX2 logic analyzer</text>
|
||||||
|
<text x="480" y="265" text-anchor="middle" font-size="15" fill="#475569">fx2lafw · 8 channels · up to 24 MHz</text>
|
||||||
|
<line x1="480" y1="292" x2="480" y2="332" stroke="#64748b" stroke-width="2" marker-end="url(#arrow)"/>
|
||||||
|
<rect x="270" y="336" width="420" height="80" rx="12" fill="#ecfdf5" stroke="#6ee7b7" stroke-width="1.5"/>
|
||||||
|
<text x="480" y="382" text-anchor="middle" font-size="19" font-weight="600" fill="#0f172a" xml:space="preserve"><tspan font-family="'Cascadia Mono', Consolas, 'DejaVu Sans Mono', monospace">sigrok-cli</tspan><tspan> + </tspan><tspan font-family="'Cascadia Mono', Consolas, 'DejaVu Sans Mono', monospace">iso7816</tspan><tspan> decoder</tspan></text>
|
||||||
|
<line x1="480" y1="416" x2="480" y2="456" stroke="#64748b" stroke-width="2" marker-end="url(#arrow)"/>
|
||||||
|
<rect x="320" y="460" width="320" height="72" rx="12" fill="#fffbeb" stroke="#fcd34d" stroke-width="1.5"/>
|
||||||
|
<text x="480" y="502" text-anchor="middle" font-size="19" font-weight="600" fill="#0f172a" font-family="'Cascadia Mono', Consolas, 'DejaVu Sans Mono', monospace">GSMTAP UDP :4729</text>
|
||||||
|
<path d="M480 532 L480 548 Q480 558 470 558 L255 558 Q245 558 245 568 L245 584" fill="none" stroke="#64748b" stroke-width="2" stroke-linejoin="round" marker-end="url(#arrow)"/>
|
||||||
|
<path d="M480 532 L480 548 Q480 558 490 558 L705 558 Q715 558 715 568 L715 584" fill="none" stroke="#64748b" stroke-width="2" stroke-linejoin="round" marker-end="url(#arrow)"/>
|
||||||
|
<rect x="110" y="588" width="270" height="72" rx="12" fill="#f8fafc" stroke="#cbd5e1" stroke-width="1.5"/>
|
||||||
|
<text x="245" y="630" text-anchor="middle" font-size="18" font-weight="600" fill="#0f172a">SIMtrace Analyser</text>
|
||||||
|
<rect x="580" y="588" width="270" height="72" rx="12" fill="#f8fafc" stroke="#cbd5e1" stroke-width="1.5"/>
|
||||||
|
<text x="715" y="630" text-anchor="middle" font-size="18" font-weight="600" fill="#0f172a">Wireshark</text>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 3.7 KiB |
@@ -0,0 +1,34 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="960" height="690" viewBox="0 0 960 690" role="img" aria-labelledby="diagram-title diagram-desc" font-family="'Segoe UI', 'Helvetica Neue', Arial, 'DejaVu Sans', sans-serif">
|
||||||
|
<title id="diagram-title">sigrok_iso7816_stream: путь сигнала</title>
|
||||||
|
<desc id="diagram-desc">SIM-карта и ридер с пассивным съёмом с контактов, логический анализатор FX2 (fx2lafw, 8 каналов, до 24 МГц), sigrok-cli с декодером iso7816, GSMTAP UDP :4729, SIMtrace Analyser и Wireshark</desc>
|
||||||
|
<defs>
|
||||||
|
<marker id="arrow" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse">
|
||||||
|
<path d="M0 0 L10 5 L0 10 Z" fill="#64748b"/>
|
||||||
|
</marker>
|
||||||
|
</defs>
|
||||||
|
<rect x="1" y="1" width="958" height="688" rx="18" fill="#ffffff" stroke="#e2e8f0" stroke-width="1.5"/>
|
||||||
|
<text x="480" y="30" text-anchor="middle" font-size="14" fill="#475569">пассивный съём с контактов</text>
|
||||||
|
<rect x="150" y="48" width="210" height="72" rx="12" fill="#eff6ff" stroke="#93c5fd" stroke-width="1.5"/>
|
||||||
|
<text x="255" y="90" text-anchor="middle" font-size="20" font-weight="600" fill="#0f172a">SIM-карта</text>
|
||||||
|
<rect x="600" y="48" width="210" height="72" rx="12" fill="#eff6ff" stroke="#93c5fd" stroke-width="1.5"/>
|
||||||
|
<text x="705" y="90" text-anchor="middle" font-size="20" font-weight="600" fill="#0f172a">Ридер</text>
|
||||||
|
<line x1="372" y1="84" x2="588" y2="84" stroke="#64748b" stroke-width="2" marker-start="url(#arrow)" marker-end="url(#arrow)"/>
|
||||||
|
<circle cx="480" cy="84" r="5" fill="#2563eb"/>
|
||||||
|
<line x1="480" y1="89" x2="480" y2="196" stroke="#64748b" stroke-width="2" marker-end="url(#arrow)"/>
|
||||||
|
<rect x="270" y="200" width="420" height="92" rx="12" fill="#f5f3ff" stroke="#c4b5fd" stroke-width="1.5"/>
|
||||||
|
<text x="480" y="236" text-anchor="middle" font-size="20" font-weight="600" fill="#0f172a">Логический анализатор FX2</text>
|
||||||
|
<text x="480" y="265" text-anchor="middle" font-size="15" fill="#475569">fx2lafw · 8 каналов · до 24 МГц</text>
|
||||||
|
<line x1="480" y1="292" x2="480" y2="332" stroke="#64748b" stroke-width="2" marker-end="url(#arrow)"/>
|
||||||
|
<rect x="270" y="336" width="420" height="80" rx="12" fill="#ecfdf5" stroke="#6ee7b7" stroke-width="1.5"/>
|
||||||
|
<text x="480" y="382" text-anchor="middle" font-size="19" font-weight="600" fill="#0f172a" xml:space="preserve"><tspan font-family="'Cascadia Mono', Consolas, 'DejaVu Sans Mono', monospace">sigrok-cli</tspan><tspan> + декодер </tspan><tspan font-family="'Cascadia Mono', Consolas, 'DejaVu Sans Mono', monospace">iso7816</tspan></text>
|
||||||
|
<line x1="480" y1="416" x2="480" y2="456" stroke="#64748b" stroke-width="2" marker-end="url(#arrow)"/>
|
||||||
|
<rect x="320" y="460" width="320" height="72" rx="12" fill="#fffbeb" stroke="#fcd34d" stroke-width="1.5"/>
|
||||||
|
<text x="480" y="502" text-anchor="middle" font-size="19" font-weight="600" fill="#0f172a" font-family="'Cascadia Mono', Consolas, 'DejaVu Sans Mono', monospace">GSMTAP UDP :4729</text>
|
||||||
|
<path d="M480 532 L480 548 Q480 558 470 558 L255 558 Q245 558 245 568 L245 584" fill="none" stroke="#64748b" stroke-width="2" stroke-linejoin="round" marker-end="url(#arrow)"/>
|
||||||
|
<path d="M480 532 L480 548 Q480 558 490 558 L705 558 Q715 558 715 568 L715 584" fill="none" stroke="#64748b" stroke-width="2" stroke-linejoin="round" marker-end="url(#arrow)"/>
|
||||||
|
<rect x="110" y="588" width="270" height="72" rx="12" fill="#f8fafc" stroke="#cbd5e1" stroke-width="1.5"/>
|
||||||
|
<text x="245" y="630" text-anchor="middle" font-size="18" font-weight="600" fill="#0f172a">SIMtrace Analyser</text>
|
||||||
|
<rect x="580" y="588" width="270" height="72" rx="12" fill="#f8fafc" stroke="#cbd5e1" stroke-width="1.5"/>
|
||||||
|
<text x="715" y="630" text-anchor="middle" font-size="18" font-weight="600" fill="#0f172a">Wireshark</text>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 3.9 KiB |
+13
-2
@@ -38,13 +38,23 @@ trap 'rm -rf "$STAGE"' EXIT
|
|||||||
|
|
||||||
# --- expected release contents (allowlist) -------------------------------
|
# --- expected release contents (allowlist) -------------------------------
|
||||||
# The base runtime files plus every image referenced from the READMEs.
|
# The base runtime files plus every image referenced from the READMEs.
|
||||||
|
# Each README embeds its own language variant of the pipeline diagram, so the
|
||||||
|
# two diagrams are added explicitly instead of joining the shared-photo check.
|
||||||
|
LANG_RES="resources/diagram_en.svg resources/diagram_ru.svg"
|
||||||
README_RES="$(git show "$REF:README.md" \
|
README_RES="$(git show "$REF:README.md" \
|
||||||
| grep -oE '\]\(resources/[^)]+' | sed 's/](//' | LC_ALL=C sort -u || true)"
|
| grep -oE '\]\(resources/[^)]+' | sed 's/](//' \
|
||||||
|
| grep -v -e '^resources/diagram_en\.svg$' -e '^resources/diagram_ru\.svg$' \
|
||||||
|
| LC_ALL=C sort -u || true)"
|
||||||
[ -n "$README_RES" ] || die "no resources/ images referenced from $REF:README.md"
|
[ -n "$README_RES" ] || die "no resources/ images referenced from $REF:README.md"
|
||||||
README_RUS_RES="$(git show "$REF:README_RUS.md" \
|
README_RUS_RES="$(git show "$REF:README_RUS.md" \
|
||||||
| grep -oE '\]\(resources/[^)]+' | sed 's/](//' | LC_ALL=C sort -u || true)"
|
| grep -oE '\]\(resources/[^)]+' | sed 's/](//' \
|
||||||
|
| grep -v -e '^resources/diagram_en\.svg$' -e '^resources/diagram_ru\.svg$' \
|
||||||
|
| LC_ALL=C sort -u || true)"
|
||||||
[ "$README_RES" = "$README_RUS_RES" ] || \
|
[ "$README_RES" = "$README_RUS_RES" ] || \
|
||||||
die "README.md and README_RUS.md reference different resources/ images"
|
die "README.md and README_RUS.md reference different resources/ images"
|
||||||
|
for res in $LANG_RES; do
|
||||||
|
git cat-file -e "$REF:$res" 2>/dev/null || die "missing $res at $REF"
|
||||||
|
done
|
||||||
|
|
||||||
EXPECTED="$STAGE/expected.list"
|
EXPECTED="$STAGE/expected.list"
|
||||||
{
|
{
|
||||||
@@ -53,6 +63,7 @@ EXPECTED="$STAGE/expected.list"
|
|||||||
setup.sh start.sh setup.bat start.bat \
|
setup.sh start.sh setup.bat start.bat \
|
||||||
tools/vs_reader.py README.md README_RUS.md LICENSE
|
tools/vs_reader.py README.md README_RUS.md LICENSE
|
||||||
printf '%s\n' "$README_RES"
|
printf '%s\n' "$README_RES"
|
||||||
|
printf '%s\n' resources/diagram_en.svg resources/diagram_ru.svg
|
||||||
} | LC_ALL=C sort -u > "$EXPECTED"
|
} | LC_ALL=C sort -u > "$EXPECTED"
|
||||||
|
|
||||||
PATHS=()
|
PATHS=()
|
||||||
|
|||||||
Reference in new issue
Block a user