cards: From card button + normalized duplicate ICCID refusal (v2.2.18)
- The card create/edit form gets a From card button next to the ICCID field: it fills the field with the equipped card's EF.ICCID. It uses the availability model through a new 'card-iccid' requirement - enabled only while /api/status reports a connected card with a readable iccid; with a card but no readable ICCID the tooltip says so, otherwise the usual 'insert and equip' hint applies. The last status ICCID is kept in _pysimCardIccid (cleared on disconnect) so the click needs no round-trip. - Duplicate ICCID refusal now compares normalized values via cardsNormIccid/cardsFindDuplicateIccid (digits, spaced digits and raw EF hex all identify the same card), skips the row being edited, ignores an empty field, and names the conflicting preset in the alert (translated). - i18n RU: From card -> 'С карты', duplicate/unreadable alerts. - Tests: cardsFindDuplicateIccid across formats and edit-skip, cardsIccidFromCard fill + alert path, form wiring guards, _pysimCardIccid tracking in the card-state harness, card-iccid availability gating in the indicator harness. 261 Python + 400 frontend tests green. - Docs: help EN+RU Cards field table, READMEs, AGENTS. SW otaman-v185.
This commit is contained in:
+2
-2
@@ -412,7 +412,7 @@ Delivery PoR (SPI2 `01`) проще — карта возвращает PoR на
|
||||
| Поле | Описание |
|
||||
|---|---|
|
||||
| Name | Понятная метка (обязательна) |
|
||||
| ICCID | Опциональный идентификатор карты |
|
||||
| ICCID | Опциональный идентификатор карты; кнопка **С карты** подставляет EF.ICCID подключённой карты (активна, только когда ICCID читается) |
|
||||
| SPI1 / SPI2 | Уровень безопасности и настройки PoR |
|
||||
| Индекс KIc / KID | Номер версии ключа (задаётся вместе с ключами) |
|
||||
| Ключ KIc / KID | Hex-ключи шифрования и MAC |
|
||||
@@ -423,7 +423,7 @@ Delivery PoR (SPI2 `01`) проще — карта возвращает PoR на
|
||||
|
||||
Столбец **SCP81** показывает, задана ли в пресете рабочая пара PSK: **✓** (идентификатор и ключ), **⚠** (только одно из двух — слушатель такой пресет игнорирует), **—** (PSK нет). Идентификатор и ключ задаются вместе.
|
||||
|
||||
**Добавить карту:** заполните имя, ICCID (опционально), SPI1/SPI2, ключи и индексы KIc/KID, TAR, при необходимости пару PSK и нажмите **Add**. Карта появится в списке и станет доступна в выпадающем списке **Card preset** на вкладке RAM.
|
||||
**Добавить карту:** заполните имя, ICCID (опционально — кнопка **С карты** подставляет EF.ICCID подключённой карты), SPI1/SPI2, ключи и индексы KIc/KID, TAR, при необходимости пару PSK и нажмите **Add**. Дубликат ICCID (сравнение без пробелов и с учётом сырой hex-формы) отклоняется с указанием конфликтующего пресета. Карта появится в списке и станет доступна в выпадающем списке **Card preset** на вкладке RAM.
|
||||
|
||||
**Изменить/удалить:** **Edit** загружает пресет в форму (кнопка Add становится **Save**; **Cancel** очищает форму); **Remove** удаляет строку из `localStorage`. Успешная отправка SCP80 увеличивает и сохраняет счётчик повторов, а изменения сразу передаются работающему слушателю SCP81.
|
||||
|
||||
|
||||
Reference in New Issue
Block a user