# LIN Interface Call Flow This document explains how LIN operations flow through the abstraction for both Mock and BabyLin adapters. ## Contract (base) File: `ecu_framework/lin/base.py` - `connect()` / `disconnect()` - `send(frame: LinFrame)` - `receive(id: int | None = None, timeout: float = 1.0) -> LinFrame | None` - `request(id: int, length: int, timeout: float = 1.0) -> LinFrame | None` - `flush()` `LinFrame` validates: - ID is 0x00–0x3F (6-bit LIN ID) - Data length ≤ 8 bytes ## Mock adapter flow File: `ecu_framework/lin/mock.py` - `connect()`: initialize buffers and state - `send(frame)`: enqueues the frame and (for echo behavior) schedules it for RX - `receive(timeout)`: waits up to timeout for a frame in RX buffer - `request(id, length, timeout)`: synthesizes a deterministic response of the given length for predictability - `disconnect()`: clears state Use cases: - Fast local dev, deterministic responses, no hardware - Timeout and boundary behavior validation ## BabyLIN adapter flow (SDK wrapper) File: `ecu_framework/lin/babylin.py` - `connect()`: import SDK `BabyLIN_library.py`, discover ports, open first, optionally `BLC_loadSDF`, get channel handle, and `BLC_sendCommand("start schedule N;")` - `send(frame)`: calls `BLC_mon_set_xmit(channelHandle, frameId, data, slotTime=0)` - `receive(timeout)`: calls `BLC_getNextFrameTimeout(channelHandle, timeout_ms)` and converts returned `BLC_FRAME` to `LinFrame` - `request(id, length, timeout)`: prefers `BLC_sendRawMasterRequest(channel, id, length)`; falls back to `(channel, id, bytes)`; if unavailable, sends a header and waits on `receive()` - `disconnect()`: calls `BLC_closeAll()` - Error handling: uses `BLC_getDetailedErrorString` (if available) Configuration: - `interface.sdf_path` locates the SDF to load - `interface.schedule_nr` sets the schedule to start upon connect - `interface.channel` selects the channel index ## Edge considerations - Ensure the correct architecture (x86/x64) of the DLL matches Python - Channel/bitrate must match your network configuration - Some SDKs require initialization/scheduling steps before transmit/receive - Time synchronization and timestamp units vary per SDK — convert as needed Note on master requests: - Our mock wrapper returns a deterministic byte pattern when called with the `length` signature. - When only the bytes signature is available, zeros of the requested length are used in tests.