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): theEICASgroup of PANEL_3D inside the upper DU rectangle — 89 rotaries (film-strip bitmaps), 14 needles, 14 pies, 128 LEDs, 79 groups (2 rotating). Extracted bytools/msfs/build_du.py(usesbuild_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 bybackground-position), needles by CSSrotate, 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 byinstruments/EICAS/EICAS.tsx): the BaseInstrument shell of the first EICAS (752e471, which ran in MSFS): build inconnectedCallback, read and update inUpdate(). Hidden unlessL: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.jswith 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)#
- 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). - 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.