Skip to content

Features ​

Black Magic Diag is an engineering workbench for UDS diagnostics over CAN and DoIP. It is not a generic OBD scanner: you define the ECUs, DIDs, routines and fault formats your project needs, then work with them directly. Projects live in a local [workspace](/features/workspace) you control.

ECU parameters ​

  • Read and write data identifiers (DIDs) using typed views: unsigned, signed, ASCII, hex, enum and combined fields.
  • Extract bits or byte ranges from packed payloads; keep the raw bytes visible.
  • Read a whole ECU, a group of parameters or a single value.
  • Discover unknown identifiers with the Incubator: load a DID list, scan a range and inspect the responses.
Parameter editor with typed views

Read more about DID parameters →

Diagnostics and DTC ​

  • Read active and stored trouble codes, clear them and read the supported list.
  • Inspect snapshot (freeze-frame) data attached to each code.
  • Work with J2012, ISO 14229-1 and J1939-73 formats.
  • Load global or project-specific DTC databases from JSON or TXT.
  • Colour-coded states: Active, Stored, Not Active.
DTC list with snapshot data

Read more about diagnostics →

Live measurements ​

  • Poll measurement values from 100 ms to 10 s.
  • Plot several signals at once as separate series or normalized combined graphs.
  • Keep a configurable history buffer and record to CSV.
  • Values are read over the same UDS session as the rest of the work.
Live measurement graphs

Read more about live measurements →

UDS toolset ​

  • Tester present 0x3E with a configurable period.
  • Session control 0x10, ECU reset 0x11, security access 0x27.
  • Routine control 0x31 and IO control 0x2F.
  • Direct memory read 0x23 and write 0x3D with address, block and size fields.
  • Security access through external Seed2Key DLLs defined per project.
UDS tools panel

Read more about the UDS toolset →

CAN and DoIP ​

  • CAN through J2534 pass-through adapters, 11-bit and 29-bit identifiers.
  • Bus scanner: broadcast request or sequential ID range, then add found ECUs to the project.
  • DoIP (ISO 13400) over Ethernet: local interface, destination address, tester address and discovery.
  • Transport type is chosen per ECU inside the project.
CAN scanner with identified ECUs

Read more about transports →

Scripting and automation ​

  • Lua API for parameters, routines, IO control, raw UDS requests, memory access and firmware helpers.
  • Action buttons defined in JSON: send a DID write or run a Lua script.
  • MCP server and chat agent with read, write and live-write scopes.
  • AI assistant can call the same tools as a script; every call is visible in the log.
Lua script console

Read more about scripting and automation →

Reports and export ​

  • Generate an HTML, Markdown or PDF report for the current project.
  • Export the ECU table to CSV, save data dumps and reload them later.
  • Session logs are written to the workspace with timestamps.

Read more about reports and export →

Firmware ​

  • Load Intel HEX, Motorola S-record or raw binary images.
  • Inspect size, CRC-32 and address blocks.
  • Flash through vehicle-specific windows or the Lua firmware API.

Read more about flashing →

Project model ​

  • A workspace is a directory with data/, logs/ and projects/.
  • A project (.bmprj) lists ECUs; each ECU is stored as a separate .bmecu file.
  • Data dumps (.bmdump) and DID lists (.bmdid) stay portable between machines.

Read more about the workspace and projects →

Under the hood ​

For engineers who want to know what happens below the UI:

LayerResponsibility
Win32 + DirectX 10 + Dear ImGuiWindow, rendering, dockable panels
BmAppWorkspace paths, global state, window registry
ProjectLoads and saves .bmprj and .bmecu files
Ecu + TaskOne task slot per ECU, executed on a worker thread
ViewInterprets DID bytes: uint, int, ascii, hex, enum, combined
UdsTransportUdsCan (J2534) or UdsDoip (TCP/TLS)
  • The UI runs on the main thread; pollEcuTasks() starts pending work each frame and results return through the UI queue.
  • Closing a project aborts and then waits for ECU tasks. One ECU never runs two tasks at once.
  • Measurement keeps a ring buffer per series; Combined normalizes each series separately, Separate keeps real units. A short link error retries, a long error series stops the measurement.
  • Write DID, routine start, IO control, memory write and raw UDS go through one confirmation point. AI and MCP use the same command bus with read / write / admin scopes.
  • Lua runs in a sandbox without arbitrary file, process or OS access.
  • Build: msbuild BlackMagic.slnx /p:Configuration=Release /p:Platform=x86. Tests: ctest --test-dir build_tests -C Debug --output-on-failure. UI tests: BlackMagic.exe --ui-test.

Free core. Local workspace. No cloud.