ecu-tests/docs/04_lin_interface_call_flow.md

2.4 KiB
Raw Permalink Blame History

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 0x000x3F (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.