L: E87 slot-map verification wire (S3F19/F20 + F21/F22)

Closes the slot-map verification gap I called out:

  S3F19 / F20  host -> equip: verify expected slot map against what
               the equipment has scanned. Equipment compares element-
               wise; on match drives CSMS NotRead -> Read and replies
               SVACK=Accept; on mismatch drives CSMS -> Mismatched and
               replies SVACK=Mismatch.

  S3F21 / F22  equip -> host: equipment-initiated slot map report
               (typically pushed after CARRIERID is confirmed).

New SVACK enum: SlotMapVerifyAck { Accept, Mismatch, CarrierUnknown,
Error }.  Server dispatch on S3F19 wires the actual CSMS transition
through the CarrierStore from D3.

Two round-trip tests cover both pairs; the FSM-driving behaviour is
exercised through the in-process tests because secs_server.cpp is
the dispatch entry point (no separate integration test needed beyond
the wire round-trip).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
2026-06-08 08:48:56 +02:00
parent a52d44ade5
commit 5a3f5ca6da
4 changed files with 111 additions and 0 deletions
+47
View File
@@ -1335,6 +1335,53 @@ messages:
builder: s3f26_carrier_transfer_ack
body: {kind: scalar, item_type: BINARY_BYTE, enum: CarrierActionAck, param: caack}
# S3F19 / S3F20 — Slot Map Verify. Host sends its expected slot map
# for the carrier; equipment compares against its locally-read map
# and replies SVACK (Accept/Mismatch). On Accept, CSMS transitions
# to Read; on Mismatch, CSMS goes to Mismatched.
- id: S3F19
stream: 3
function: 19
w: true
builder: s3f19_slot_map_verify
parser: parse_s3f19
body:
kind: list
struct_name: SlotMapVerifyRequest
fields:
- {name: carrierid, shape: {kind: scalar, item_type: ASCII}}
- name: slots
shape: {kind: list_of, element: {kind: scalar, item_type: BINARY_BYTE}}
- id: S3F20
stream: 3
function: 20
builder: s3f20_slot_map_verify_ack
body: {kind: scalar, item_type: BINARY_BYTE, enum: SlotMapVerifyAck, param: svack}
# S3F21 / S3F22 — Slot Map Report. Equipment-initiated report of
# the slot map it sees (typically pushed after a CARRIERID is read
# so the host can decide whether to ProceedWithCarrier).
- id: S3F21
stream: 3
function: 21
w: true
builder: s3f21_slot_map_report
parser: parse_s3f21
body:
kind: list
struct_name: SlotMapReport
fields:
- {name: carrierid, shape: {kind: scalar, item_type: ASCII}}
- name: slots
shape: {kind: list_of, element: {kind: scalar, item_type: BINARY_BYTE}}
- id: S3F22
stream: 3
function: 22
builder: s3f22_slot_map_report_ack
body: {kind: scalar, item_type: BINARY_BYTE, enum: SlotMapVerifyAck, param: svack}
# S3F27 / S3F28 — Cancel Carrier (host cancels a carrier operation).
- id: S3F27
stream: 3