v3.25.6: the PLI dictionary save feedback + the timer wording

The v3.25.5 report's follow-ups: a field the server could not use was
silently dropped, and the PWA also filtered non-hex fields client-side
(never sending them).  The POST now collects them and names them in the
response - `invalid` (a malformed key/value: not hex, an odd number of
digits, a non-string value) and `unknown` (a well-formed code outside the
qualifier list), both omitted when everything was applied - and the PWA's
Save sends every field, composes "Not saved: 0A (invalid value), 18
(unknown qualifier)" (`pysimPliRejectMsg`) into a new #pli-save-msg line
under the button and shows "Not saved" briefly.

The guide's timer exception now says "card-initiated automatic action"
(the timer retries every 5 s; polling/menu are suspended, not retrying).

Docs: api.md's POST contract, help EN/RU - which also said "22 PLI
qualifiers" while the list has 25.  Tests: the rejection lists per case
(odd length, non-hex value/key, non-string, unknown code) and the
valid-save absence, the PWA message helper and the wiring pins.
887 frontend + 875 Python; sw cache simple-v430.
This commit is contained in:
2026-10-11 16:51:30 +03:00
parent f2046d7f0a
commit 9fd8238051
10 changed files with 152 additions and 36 deletions
+10 -4
View File
@@ -1520,11 +1520,17 @@ override is set.
### `POST /api/pli-dict`
Updates dictionary entries. Body is a map of qualifier code to hex value;
keys must be known qualifiers and values valid hex, otherwise they are
ignored. A non-empty value becomes an override; an **empty value clears the
Updates dictionary entries. Body is a map of qualifier code to hex value.
A non-empty value becomes an override; an **empty value clears the
override**, so the built-in default (if any) applies again. Returns the
updated effective dictionary.
updated effective dictionary plus, when any field was not saved, the lists
that name them: `invalid` (a malformed key or value — not hex, an odd number
of digits, a non-string value) and `unknown` (a well-formed code outside the
qualifier list); both keys are omitted when everything was applied (v3.25.6).
```json
{"00": "130500F1100000", "0A": "630102", "invalid": ["0G"], "unknown": ["18"]}
```
### `POST /api/scp81/bip`
+1 -1
View File
@@ -534,7 +534,7 @@ the data really flows to/from the configured BIP target, and the BIP events
(Data available, Channel status) flow for the channels the card itself opened -
so an applet's own HTTP/BIP conversation completes inside a scripted run. The
BIP **control** API stays blocked while a run is active (409), like the
terminal's other automatic actions (polling, menu). The one remaining
terminal's other automatic actions (polling, menu). The one card-initiated
automatic action that still waits is the **timer expiration** event: a
TIMER MANAGEMENT timer the card armed is not fired during a run (it retries
every 5 s and fires when the run ends) - a deliberate exception to the