59 lines
2.4 KiB
Markdown
59 lines
2.4 KiB
Markdown
# 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.
|