Technical reference

Upper EICAS (milestone 4b)

docs/EICAS.md

Status date: 2026-11-03. Systems module build 10. Lower DU: docs/LOWER_DU.md.

The upper DU shows Zibo's upper EICAS exactly as the 737-800's PANEL_3D defines it: Zibo's own bitmaps at the PANEL_3D positions, needles, sectors and digits moved by the same key frames and SHOW conditions, from Zibo's dataref values.

How it is built#

737_80NG.acf PANEL_3D ─ tools/msfs/build_du.py ─► avionics/src/instruments/EICAS/panel.json
                                                   └► html_ui/.../LU737/EICAS/img/ (82 Zibo bitmaps)

lu737_systems.wasm ─ L:LU737_ENG*_*, pages, L:LU737_DU_UPPER_PWR ─┐
MSFS SimVars (TAT, tanks, oil quantity) ───────────────────┼─► DuSource.ts (103 datarefs) ─► PanelView ─► LU_DU_UPPER
display options L:LU737_EICAS_FUEL_FORMAT / _UNITS ────────┘   (avionics/src/du/DuSource.ts)
  • Program (panel.json): the EICAS group of PANEL_3D inside the upper DU rectangle — 89 rotaries (film-strip bitmaps), 14 needles, 14 pies, 128 LEDs, 79 groups (2 rotating). Extracted by tools/msfs/build_du.py (uses build_display.py's PANEL_3D compiler); re-run after changing the extractor.
  • Drawing (avionics/src/panel3d/PanelView.ts): one absolutely positioned HTML element per instrument, built once in panel order; bitmaps as CSS backgrounds (film-strip frame / LED glyph by background-position), needles by CSS rotate, pies as SVG paths. Each frame only changes what moved. No canvas, no MSFS SDK. Semantics of X-Plane's generic instruments: SHOW LESS/GREATER/EQUAL, key frames with exponent and linear extrapolation, SIZE, LED fonts (16 glyph columns, one row per digit position), the brightness rheostat as opacity.
  • Instrument (avionics/src/du/DisplayUnit.ts, registered by instruments/EICAS/EICAS.tsx): the BaseInstrument shell of the first EICAS (752e471, which ran in MSFS): build in connectedCallback, read and update in Update(). Hidden unless L:LU737_DU_UPPER_PWR = 1.

Where every value comes from (avionics/src/du/DuSource.ts)#

Kind Datarefs Source
exact N1, N2, EGT, FF, oil press/temp, VIB, START VALVE, EICAS FF / oil press / oil temp energised, EGT start redline, hot start, commanded N1 systems module L:LU737_ENGn_* (Zibo's engine code, differential-tested against the oracle)
exact eng*_req_pie zibomod: req_n1 × 100 − previous frame's N1 (oracle, max error 1e-4)
exact eicas_full_n1_show B738.a_fms.lua "SET N1 THRUST" (EICAS FF dark or 1 s after engine stop → off)
exact tank and total quantities kg / lb MSFS tanks; zibomod rounds each tank up to 10 kg / 10 lb from the raw kg, totals = sums of the rounded tanks (oracle probe)
exact TAT MSFS TOTAL AIR TEMPERATURE (Zibo shows TAT unless the aspirated probe is heated on the ground)
exact compact format, warning box, ENG FAIL, "was red" N1 boxes, page transition systems module (build 10, docs/LOWER_DU.md): L:LU737_LOWER_DU_PAGE, _EICAS_WARN, _ENGn_OUT, _ENGn_WAS_N1_RED, _DU_LU_INIT, _FF_EICAS_SHOW
option effects/fuelgauge, FMS/fmc_units L:LU737_EICAS_FUEL_FORMAT 0 = FUEL QTY box (default), 1 = round gauges; L:LU737_EICAS_FUEL_UNITS 0 = KG (default), 1 = LBS
pending N1 limit / bug (98.7), thrust mode (TO), derate, assumed temp FMS (M5): Zibo's cold-start values
pending fuel LOW / IMBAL / CONFIG, tank fill %, FUEL FLOW USED/RESET fuel system: 0 (normal), fill % at 15 C fuel
pending reverser, engine anti-ice, X-BLD start, oil filter bypass, A/T lever position 0 (Zibo's value with these systems inactive)
pending oil quantity MSFS ENG OIL QUANTITY (the systems module runs Zibo's engines with full oil)

Every exact source is checked against Zibo's own values in nine snapshots of the oracle trace (avionics/test/du_data.test.ts, data avionics/test/data/eicas_oracle.json, script xphost/test/sci/eicas_trace.json, fixture tools/msfs/du_oracle_fixture.py).

Verification#

  • Drawing: the oracle snapshots and variants (KG / LBS, round gauges, compact page, ASSUM TEMP, N1/EGT exceedance, negative TAT) were rendered headless both with a reference PANEL_3D interpreter (canvas, kept out of the repository) and with PanelView; after a 2 px blur the difference is at anti-aliasing level everywhere (needle edges, glyph seams of the canvas reference).
  • End to end: the built EICAS.js with a BaseInstrument/SimVar stub fed the systems module's L:vars for each snapshot (avionics/scripts/render-du.mjs EICAS → docs/eicas_*.png) matches the reference except where the mapping deliberately differs (below) and the fuel display option.
  • Systems module: native test eicas_flags_follow_the_engine_start (energise / start redline timing as in the oracle).

Two X-Plane behaviours assumed (owner: please confirm with an X-Plane screenshot)#

  1. Indexed scalar datarefs read the scalar. The panel reads e.g. eng2_N1_bug[1], center_tank_kgs[1], eng2_req_n1[1] although these are plain numbers; the oracle returns 0 for them, which would put engine 2's N1 bug at 0 and the centre tank at 0 in X-Plane. Assumed: X-Plane ignores the index (Zibo shows the bug on both engines).
  2. LEDs show the low digits of a larger value, with leading zeros blanked only left of the value's own first digit. Zibo builds the fuel readouts this way (large thousands digit + 3-digit LED: 6 620, 3 000); clamping (6 999) would be wrong.

Screenshot wanted: Zibo in X-Plane, upper EICAS, engines at idle, centre tank and both wings with fuel (e.g. 3 000 / 5 000 / 3 000 kg), once in KG with the round gauges and once with the FUEL QTY box.

Open (with their systems)#

FMS thrust limits and modes (N1 bug, TO/CLB/CRZ, derate, ASSUM TEMP) — M5; fuel system (statuses, fuel temperature, FUEL FLOW switch); reversers, anti-ice, X-BLD start, A/T lever position, engine failures (ENG FAIL logic is in place); DU brightness knobs.