Technical reference

In-sim test plan

docs/TEST_PLAN.md

The aircraft is being rewritten (docs/REWRITE_PLAN.md); each milestone adds its own checks here. Run them in order and note pass / fail / observation. For every failure attach the Developer Mode Console (Errors and Warnings) and a screenshot.

Useful: Developer Mode → Tools → Behaviors (inspect L:LU737_*), and the SimVars watcher.

Milestone 1 — package loads, systems module runs (current)#

What to expect in this build: the model and flight deck as before, blank displays (the old texture panel is removed; the HTML display units come in milestone 4) and cockpit switches without effect (the systems are rewritten from milestone 3). The only logic is the module's heartbeat.

1. Build and load#

  1. Build msfs2024/LevelUp737NG.xml (BUILD_AND_INSTALL §A). Expected: no errors. Report every warning that mentions lu737_systems.wasm, panel.cfg or WasmInstrument.
  2. Aircraft appears as "LevelUp 737-800 (CFM56-7B26)".
  3. Load at a gate. Expected: the LevelUp exterior with its textures, sitting on its gear. Report anything floating/sunk/misplaced.
  4. If 1–3 fail: build --legacy (BUILD_AND_INSTALL §A) and report which layout works.

2. Systems module#

  1. Console after loading: LU737 systems: initialised. Report any line about the WASM module (load errors, unresolved imports, traps).

  2. Behaviors → LocalVariables (or any L:var watch):

    L:var Expected
    LU737_WASM_ALIVE 1
    LU737_WASM_BUILD 6
    LU737_WASM_FRAME increasing every frame
    LU737_WASM_TIME increasing with sim time; stops while paused (report whether it does)
  3. Pause the sim for a few seconds and resume; report LU737_WASM_TIME before/after (tells whether MSFS sends dt = 0 while paused).

  4. Frame rate with the aircraft loaded, in the cockpit and outside.

3. What to send back#

  • Console lines about the module, the four L:var values, pause behaviour.
  • Build warnings, screenshots of anything wrong with the model.

Milestone 3a — electrical panel (build 4)#

The electrical system runs in the module; clicks reach it through the IO instrument (VCockpit02, LU737/IO/io.html). Displays are still blank (M4); what you can see are the switches, guards and the overhead/forward panel lights. Engines are not modelled yet (M3c); the APU is milestone 3b below.

Setup: Behaviors → Variables, filter LU737_. L:LU737_IO_EVENTS counts the clicks the IO instrument forwarded; it must increase with every click. If it does not, open the Coherent GT debugger (lu737-io) and report its console.

  1. Cold and dark: all electrical lights off.
  2. BATTERY: the first click opens the guard, the next moves the switch to ON. Expected: battery-powered lights come on (e.g. STANDBY PWR OFF goes out, annunciators that need the battery bus); closing the guard keeps it ON.
  3. STBY PWR: open the guard, OFF → STANDBY PWR OFF lit; AUTO → out; close.
  4. Ground power: connect it with MSFS's ground services (toolbar → ground services / ATC → ground power, so EXTERNAL POWER AVAILABLE is 1; the LevelUp EFB is not rewritten yet): GRD POWER AVAILABLE lit. GRD PWR switch down (hold): transfer buses powered, TRANSFER BUS OFF / SOURCE OFF lights go out as on the real aircraft.
  5. DC and AC meter selectors: each click steps one position.
  6. BUS TRANSFER: guard, OFF/AUTO.
  7. Back to cold and dark: everything off again.

Report: which steps behave differently from the description (with the L:vars LU737_ELEC_* / LU737_IO_EVENTS values), Console errors, and whether any click does nothing.

Milestone 3b — APU (build 5)#

The APU runs in the module: Zibo's APU controller plus the X-Plane APU spool modelled in the module (door 9 s, N1 0 → 100 % in 53 s, running from 50 %). The MSFS APU stays off: do not start it with MSFS bindings/toolbar; its N1 is not used. Repeat the M3a setup (LU737_ filter, L:LU737_IO_EVENTS). Times below are for TAT 15 °C at sea level (colder / higher: a little longer).

  1. Battery ON (M3a step 2). APU EGT needle: no movement while the switch is OFF.
  2. APU switch ON (click / wheel down once). Expected: LU737_APU_SW_POS 1; about 1.5 s later the EGT needle sweeps up (~20) and back; LOW OIL PRESSURE lights 5.5 s after ON. Door (LU737_ELECTRICAL_APU_DOOR) stays 0.
  3. START: drag the switch down and let go, or wheel down once more. The switch shows START (at least 0.5 s, longer while held) and springs back to ON; the start begins on the release. If LOW OIL was already lit the start delay is 2.2 s, otherwise 17.5 s (and LOW OIL lights 5.5 s after START). Then: door opens (ELECTRICAL_APU_DOOR → 1 over 6 s), LU737_APU_N1 rises after ~9 s and reaches 100 about 62 s after the start; LOW OIL goes out once LU737_APU_RUNNING is 1 (N1 50 %); LU737_APU_EGT and the needle follow N1 up to 100, stay there ~8.5 s, then fall to ~48.
  4. Generator: ~15 s after the EGT falls below 52 (≈ 100 s after START) LU737_SRC_APU_GEN_RDY = 1 and APU GEN OFF BUS lights (blue). No FAULT / MAINT / OVERSPEED lights, LU737_ANN_SIXPACK_APU 0.
  5. APU GEN 1 and 2 switches down (hold briefly): transfer buses powered from the APU (LU737_ELEC_STATE 3), APU GEN OFF BUS goes out, TRANSFER BUS OFF / SOURCE OFF out.
  6. APU BLEED switch ON: LU737_APU_BLEED_VALVE → 1, LU737_APU_BLEED_PSI ~41 falling to 33 and then 21 psi (packs are not modelled yet: off).
  7. Switch OFF: generator drops at once (buses unpowered unless GPU), bleed valve closes, the APU keeps running for the 58 s cool-down (LU737_APU_RUNNING 1, N1 100), then spools down (7 s + ~9 s to APU_RUNNING 0) and the door closes. No FAULT.
  8. Optional: OFF during the cool-down, then ON again: generator back after ~2 s.
  9. Optional: battery OFF while the APU runs: the APU shuts down at once, lights out, EGT needle to 0.

Report: times that differ from the above by more than a few seconds, the LU737_APU_* / LU737_ANN_APU_* values when something looks wrong, any click that does nothing, and whether the MSFS APU (exterior sound/effects) starts by itself.

Milestone 3c — bleed air and engine start (build 6)#

Bleed air and Zibo's engine logic run in the module (wasm/README.md, Pneumatics, Engines, MSFS engines). The EICAS is still blank (M4): engine values are in L:vars (Behaviors → Variables, filter LU737_; ENG2_* for engine 2). Zibo's engine drives the MSFS engine: when Zibo's engine lights, the module starts the MSFS engine (sound, exterior, thrust from MSFS's own engine and the throttle; MSFS's own N1 is not Zibo's: known limitation of this build). Do not use MSFS auto-start (Ctrl+E): the module stops an MSFS engine that Zibo's logic does not run. Times below are for ISA sea level, 15 °C.

Controls (docs/COCKPIT_CONTROLS.md): the engine start switches are knobs: left click or wheel down = one step toward GRD, right click or wheel up = toward CONT/FLT. The start levers: click (or drag once) on the lever toggles CUTOFF ↔ IDLE (MIXTURE_ENGINE_n_2); dragging along the lever moves it in 10 % steps (IDLE logic from > 0.5). Packs and isolation: switches (click/drag up = toward OFF/CLOSE, down = toward AUTO/HIGH/OPEN, wheel).

  1. Cold & dark → battery (M3a) → APU started and APU GEN on both buses (M3b). Air panel as Zibo's cold & dark: LU737_TOGGLE_SWITCH_BLEED_AIR_1/2_POS 1, LU737_AIR_L/R_PACK_POS 0 (OFF), LU737_AIR_ISOLATION_VALVE_POS 2 (OPEN); LU737_PNEU_ISO_VALVE 1 once AC transfer bus 1 is powered.
  2. APU BLEED ON, packs OFF, isolation OPEN: LU737_APU_BLEED_VALVE → 1, the duct gauge (LU737_INDICATORS_DUCT_PRESS_L/R, both equal) ~41 → 33 → 21 psi within ~10 s. No DUAL BLEED light (LU737_ANNUNCIATOR_DUAL_BLEED 0). Wait until the APU has been running about 2 minutes (Zibo's APU bleed warm-up; with packs AUTO and a "cold" APU the start valve makes the APU bleed valve cycle and the duct stays at 3–9 psi: the engine does not turn — Zibo does exactly this).
  3. Engine 2 start switch to GRD (left click once on the ENG 2 knob): LU737_ENGINE_STARTER2_POS 0 and it stays there; LU737_ENG2_START_VALVE → 1 in 2.5 s (START VALVE OPEN); duct ~25 psi; LU737_ENG2_N2 rises ~1.2 %/s (10.7 % after 10 s), N1 starts to turn later (LU737_ENG2_N1); oil pressure appears (LU737_ENG2_EICAS_ON 1 after 1.6 s, LU737_ENG2_OIL_PRESS rising). The MSFS engine is still off.
  4. At 25 % N2 (about 22 s after GRD): start lever 2 to IDLE (click/drag the lever). LU737_ENGINE_MIXTURE_RATIO2 1; ignition (LU737_ENG2_IGNITION 2 = right igniter, IGN select R) and light-off at once (LU737_ENG2_RUNNING 1): the MSFS engine 2 starts (engine sound, exterior). LU737_ENG2_FF ~0.082–0.097 kg/s, LU737_ENG2_EGT rising (≈120 °C 8 s after light-off, ≈300 °C at 15 s, peak ≈460 °C), N2 +1.55 %/s. (A start lever at IDLE before 25 % N2 is Zibo's wet start: the EGT climbs fast, the EEC aborts the start at about 710 °C — ignition off, EGT falls, N2 hangs near 30 %; start lever CUTOFF and motor to clear.) Option (not Zibo): L:LU737_EEC_HOTSTART_OFF = 1 — no EEC abort, the wet start runs into the red (up to about 980 °C) until you cut the start lever or the engine reaches idle.
  5. Solenoid release at 55.3–58 % N2 (≈20 s after light-off): the start switch returns to OFF by itself (LU737_ENGINE_STARTER2_POS 1), LU737_ENG2_START_VALVE → 0, ignition off after 57 % (LU737_ENG2_IGNITION 3 briefly, then 0). Duct pressure: the right side now comes from engine 2's bleed (LU737_PNEU_ENG2_PSI ~24 psi).
  6. Stable idle ~10 s later: LU737_ENG2_N2 59.8 %, LU737_ENG2_N1 19.3 %, LU737_ENG2_FF 0.082 kg/s, LU737_ENG2_OIL_PRESS 26.2 psi, LU737_ENG2_EGT ≈ 430 °C settling to ≈ 425 (Zibo adds a random ±5 °C per engine and flight). LU737_SRC_IDG2_RDY 1 (generator 2 available, GEN OFF BUS 2 lit). Engine sound steady; the throttle (hardware or the cockpit lever) moves LU737_ENGINE_THRUST2_LEVELER and LU737_ENG2_N1_CMD, and MSFS gives thrust.
  7. Engine 1: the same with the ENG 1 knob and start lever 1 (left duct from the APU directly). Expected: the same timings and values; LU737_ENGINE_STARTER1_POS, LU737_ENG1_*.
  8. Shutdown: start lever 1 and 2 to CUTOFF: LU737_ENG1/2_RUNNING 0 after ≈2 s, the MSFS engines stop, N2/N1 spool down (N2 ≈ 30 % some 15 s after CUTOFF, ≈ 10 % after a minute), FF 0, EGT falling, oil pressure 0 below ≈ 20 % N2. A restart within 5 s of the engine running down below 40 % N2 is locked out (start lever at CUTOFF).

Report: times/values that differ (with the LU737_ENG*, LU737_PNEU_*, LU737_APU_* values), whether the MSFS engine sound starts at light-off and stops at CUTOFF, whether the MSFS battery master switched itself on, any click that does nothing, Console errors (LU737: unknown K: event / unknown A:var lines in particular).

Milestone 4a — display surfaces and upper EICAS#

The display surfaces of the interior model are split into one material each (tools/convert/convert_aircraft.py DISPLAYS); panel.cfg draws one VCockpit on each (tools/msfs/generate_configs.py DISPLAY_PANELS). Only the upper DU has an instrument so far (avionics/src/instruments/EICAS, built into html_ui/.../LU737/EICAS); the other displays get an empty black VCockpit. Since M4b the EICAS is Zibo's PANEL_3D EICAS (docs/EICAS.md). Expected look: docs/eicas_cold_powered.png, eicas_eng1_lightoff.png, eicas_eng1_idle_eng2_start.png, eicas_both_idle.png, eicas_high_thrust.png (headless renders of the built instrument with Zibo's values from the oracle).

Material Where Shows now
LU_DU_CPT_OUTBD captain outboard DU black (PFD later)
LU_DU_CPT_INBD captain inboard DU black (ND later)
LU_DU_UPPER centre upper DU upper EICAS
LU_DU_LOWER centre lower DU (forward pedestal) black (lower EICAS / MFD later)
LU_DU_FO_INBD, LU_DU_FO_OUTBD first officer inboard / outboard DU black (ND / PFD later)
LU_CDU_CPT, LU_CDU_FO CDU screens black
LU_ISFD standby (left of the upper DU) black
LU_PANEL clocks, MCP windows, radio windows, overhead readouts, HUD, EFB no instrument (as before)
  1. Rebuild the package (python tools/build_package.py, or load the committed msfs2024 project) and load cold and dark. All display surfaces dark (black, not white or glowing, no old panel image), with no power.
  2. Check L:LU737_WASM_BUILD = 9. Battery ON (M3a) — battery alone is enough, also ground power or the APU generator. L:LU737_DU_UPPER_PWR goes to 1 after Zibo's DU warm-up (about 32 s with the bus powered); only then the upper DU shows the EICAS (docs/eicas_cold_powered.png): TAT +15 C and TO at the top, the N1 limit 98.7 above each N1 dial with the green N1 bug, N1 readouts 0.0, EGT dials, the grey ENG 1 / ENG 2 boxes top right, FUEL QTY-KGS X1000 box bottom right with the MSFS tank quantities and TOTAL. Battery OFF: dark again.
  3. Engine start (M3c, engine 2 first, docs/eicas_eng1_idle_eng2_start.png): START VALVE OPEN in the ENG 2 box; as N2 starts to turn the red start-limit mark appears on the EGT dial; N1 needle and grey sector move; at light-off the EGT readout and needle rise; START VALVE OPEN goes out at solenoid release; the start-limit mark goes out at idle. Idle ≈ N1 19.3, EGT ≈ 425 (LU737_ENG2_*). Throttle up: the white pie between N1 and the commanded N1 leads the needle. Display options (Behaviors → Variables): L:LU737_EICAS_FUEL_FORMAT 1 = round fuel gauges, L:LU737_EICAS_FUEL_UNITS 1 = LBS.
  4. Brightness: L:LU737_DU_GAIN (Behaviors → Variables) still sets the emissive strength of every display surface (default 2).

Report: which surface shows the EICAS (it must be the centre upper DU), and for every display surface whether the image is misplaced, mirrored, rotated, stretched or cut off, or a surface glows white/grey instead of black; values that differ from the LU737_ENG* L:vars; text that is unreadable at the cockpit view distance; the Coherent GT debugger console of lu737-eicas if the DU stays black with L:LU737_DU_UPPER_PWR = 1; and, if possible, an X-Plane screenshot of Zibo's EICAS for the two assumptions in docs/EICAS.md.

Milestone 4c — lower DU and MFD ENG / SYS (build 10)#

docs/LOWER_DU.md. Expected look: docs/lowerdu_eng_page_idle.png, lowerdu_sys_page.png, lowerdu_eng1_idle_eng2_start.png, lowerdu_high_thrust.png.

  1. L:LU737_WASM_BUILD = 10. Battery only: lower DU dark (L:LU737_DU_LOWER_PWR 0, as in Zibo).
  2. Ground power or APU generator on: after the warm-up the lower DU shows the ENG page (N2 dials, FF, OIL PRESS / TEMP / QTY, VIB); L:LU737_LOWER_DU_PAGE 1.
  3. MFD SYS (pedestal, above the lower DU): SYS page — HYDRAULIC box, BRAKE TEMP, AIL / FLT SPLR / ELEV / RUDDER scales. SYS again: blank. ENG: ENG page. ENG again: lower DU blank and the upper DU switches to the compact format (N2, oil and VIB below the EGT dials). ENG again: both normal, lower blank. Each SYS / ENG change builds the page in stages for about 1.2 s (boxes first, then limit marks and OIL QTY, then the N2 dials) — Zibo's LevelUp effect. With L:LU737_DU_PAGE_BUILD_OFF = 1 (Behaviors → Variables) the full page appears at once.
  4. On the SYS page move the yoke and the rudder: report whether each pointer moves the right way (left yoke: left aileron pointer up?, yoke back: elevator pointers up?, right rudder: pointer right?) and whether the flight spoiler pointers move with the speed brake / roll.
  5. Engine start (M3c) with the ENG page: N2 dial and readout rise, FF appears at light-off, oil pressure and temperature pointers move.

Report: values that differ from LU737_ENG*, pointer directions, page changes that differ from the list.

Milestone 4d — IRS (build 15)#

docs/specs/irs.md. The PFD/ND are not drawn yet: check the IRS panel (overhead) and the L:vars.

  1. L:LU737_WASM_BUILD = 15. Cold and dark, battery on: both IRS selectors OFF, no lights.
  2. Ground power on. Both selectors to NAV (one click per detent; OFF→ALIGN pulls the knob): ON DC lights for about 4 s (self-test), then the ALIGN lights. L:LU737_IRS_L_REMAIN counts down from the alignment time (at Hong Kong 22.3° N: 333 s); L:LU737_IRS_L_MODE 1. At 0 → ALIGN lights off, L:LU737_IRS_L_MODE 2 (NAV) about 2 s later.
  3. L:LU737_IRS_ALIGN_TIME (Behaviors → Variables) 1 = 60 s, 2 = instant, 3 = 150 s, 0 = real: set it before turning the selectors (it is read when an alignment starts).
  4. Quick realign: NAV → ALIGN → NAV: ALIGN light, NAV again after 30 s. One selector OFF: its ALIGN light stays on about 30 s (shutdown), then goes out. ATT: ALIGN light, ATT (mode 3) after about 35 s.
  5. Ground power off with the IRS in NAV (battery only): ON DC lights on; the right IRS shuts down after 5 min.
  6. Start a flight with the engines running: both IRS in NAV, no lights.
  7. Lights test: all IRS lights on.

Report: times and lights that differ (Zibo screenshots welcome).

PFD (phase 1)#

docs/PFD.md; expected look docs/pfd_ground.png, pfd_approach.png.

  1. Ground power on: the captain PFD (left outboard DU) lights after the DU warm-up.

  2. IRS OFF: ATT / HDG flags; aligning: flags as Zibo; NAV: attitude and heading.

  3. Fly: IAS / altitude drums roll, VS pointer, heading scale. Check the directions: right bank → horizon rotates anticlockwise (left side down); nose up → horizon moves down; slip ball right in a right skid.

  4. ILS approach: localizer / glideslope pointers move the right way (aircraft left of the localizer → pointer right; below the glideslope → pointer up). Marker lights OM / MM / IM.

  5. Below 2500 ft RA: RA readout with a white box for 10 s; steps 2 / 10 / 20 ft.

  6. Speed bands (build 16): red/black minimum speed and barber pole follow flaps, gear, weight and bank; amber manoeuvre bands after lift-off.

  7. EFIS control panel (build 17): BARO knob (0.01 inHg / 1 hPa per click, MSFS altimeter follows), IN / HPA, STD (shows STD, preselect while turning), MINS RADIO / BARO, MINS knob (first click from off: 101 / 201), RST; below the minimums the MINIMUMS flash amber for 3 s, then amber; MTRS shows meters; FPV.

  8. NAV radios and ILS (build 18): the NAV panels show the classic radio (no MMR). Tune an ILS on NAV 1 standby (outer knob 1 MHz, inner 50 kHz), press the transfer: the PFD shows the frequency and /000°, after 6.5 s the identifier (e.g. IHKA/000°) and DME x.x; inside the coverage the localizer and glideslope pointers appear. The radio display windows are not drawn yet (old panel texture): read the frequency on the PFD.

  9. First officer PFD (right outboard DU): as the captain's, with its own EFIS panel (MINS, BARO, STD) and NAV 2.

Report: wrong directions, values that differ from the MSFS instruments. FMA, FD and V-speeds are not live yet.

Milestone 4e — ND (build 19)#

docs/ND.md; expected look docs/nd_cruise.png.

  1. L:LU737_WASM_BUILD = 19. Ground power: both NDs (inboard DUs) light: MAP mode, 10 NM, TRK xxx MAG.
  2. EFIS panel: mode knob APP / VOR / MAP / PLN, range knob, CTR (centred / VSD / expanded), VOR 1 / 2 switches (VOR / OFF / ADF), WXR / STA / WPT / ARPT / DATA / POS / TERR / TFC buttons light their ND labels.
  3. In flight: GS / TAS, wind from 6 kt (arrow direction), track line; tune a VOR: its pointer points to the station. Route, waypoints, TCAS and terrain are not live yet (FMS, M5).

Milestone 4f — ISFD (build 20)#

docs/ISFD.md; expected look docs/isfd_cruise.png.

  1. L:LU737_WASM_BUILD = 20. Battery on: the ISFD lights and counts down its initialisation (about 90 s).
  2. IAS and altitude readouts roll; attitude and heading move with the aircraft.
  3. BARO knob (0.01 inHg per click), HP / IN (hPa), STD, APP (ILS: both deviation scales, B/CRS: localizer only),
    • / − brightness.

Milestone 5a — MCP dials (build 21)#

docs/MCP.md. The MCP windows are not drawn yet: read the values on the PFD / ND.

  1. L:LU737_WASM_BUILD = 21. Speed knob: PFD speed bug (magenta, top-left readout) moves by 1 kt, 100 … 340.
  2. Heading knob: heading bug on PFD and ND; altitude knob: altitude bug / readout by 100 ft; course knobs: /xxx° on each PFD's nav line and the course on the ND (VOR / APP mode).
  3. IAS / MACH button: readout switches to Mach; bank angle knob turns (5 positions).

Build 22 — MSFS engine thrust#

MSFS's engines span without burning (fuel pressure 0): nothing turned on MSFS's electric tank pumps since the systems-module rewrite. While a Zibo engine runs, its MSFS main tank pumps and their circuits are now kept on; engines.cfg has no ignition / condition-lever gate. Load a new flight (engines.cfg is read at aircraft load).

  1. L:LU737_WASM_BUILD = 22. Start an engine the Zibo way.
  2. Debug → Aircraft Engines: Combustion 100 %, FuelPressure > 0, fuel flow > 0; MSFS's ENGINE gauge (N1) ~20 % at idle.
  3. Thrust levers forward: the aircraft moves (parking brake released in MSFS, no wheel chocks).

Report if not: L:LU737_MSFS_ENG1_ N1, N2, COMBUSTION, FF, FUELPRESS, PUMPS (0–2), CIRCUITS (0–3), VALVE, WANT, and L:LU737_MSFS_BUS_VOLTS.

Build 23 — MSFS engine thrust (SDK review)#

The MSFS SDK pages (engines.cfg, FUEL_SYSTEM, engine SimVars) show three gaps left by build 22: with DisableMixtureControls = 1 the condition lever is MSFS's fuel cutoff (down = cutoff) and nothing moved it off cutoff (MIXTURE_SET is ignored); the turbine ignition switch was never set; ignition_auto_type takes a list (Starter, Flaps, ...), not 1. Now a Zibo engine start also sets MSFS condition lever k to low idle and ignition k on; engines.cfg drops ignition_auto_type (auto ignition always on) and the fuel pressure gate (min_fuel_press_for_combustion_psf = -1). Load a new flight.

  1. L:LU737_WASM_BUILD = 23. Start an engine the Zibo way.
  2. Debug → Aircraft Engines: Combustion 100 %, fuel flow > 0; MSFS N1 ~20 % at idle.
  3. Thrust levers forward: the aircraft moves.

Report if not: L:LU737_MSFS_ENG1_ COMBUSTION, FF, COND (want 1), IGNITING, FS_KPA, FUELPRESS, PUMPS, CIRCUITS, VALVE, WANT, and L:LU737_MSFS_BUS_VOLTS.

Build 23 + engines.cfg from Zibo (thrust, N1, fuel flow)#

Owner's build 23 test: MSFS engines burn (N1 99.5 % at TO/GA, gross thrust 24 000 lbf) but net thrust only ~2 400 lbf: ram drag −21 500 lbf. Causes (SDK, docs/FDE_TUNING.md "Engine schedule from Zibo"): the airflow table must be per ft² of inlet (it held the whole-engine airflow, ×20), and MSFS multiplies the gross thrust by the total pressure ratio δ_total (×1.52 at M 0.8), which the old table ignored (cruise thrust would have been ~1.8× too high). engines.cfg's thrust, N1 schedule and fuel flow are now generated from Zibo's engine model, so MSFS's N1 follows Zibo's for a lever position and MSFS's net thrust is Zibo's at that N1. Also: the two commanded-N1 tables were equal near lever 0.9, which the SDK says can drop the engine to idle; they never are now. WASM unchanged (build 23). Load a new flight.

Compare Zibo's N1 L:LU737_ENG1_N1 with MSFS's L:LU737_MSFS_ENG1_N1 (Behaviors → Variables), and Debug → Aircraft Engines (gross thrust, ram drag, net thrust, per engine). Expected at sea level, ISA:

Check Zibo N1 MSFS N1 MSFS gross / ram drag / net (lbf)
1. Idle, parked 19.3 ~19.7 ~900 / 0 / ~900
2. Lever half-way (50 %), parked 74.4 ~74 ~12 100 / 0 / ~12 100
3. Full lever, parked (brakes) 104 ~103.5 ~26 750 / 0 / ~26 750
4. Full lever at ~130 kt 104 ~104 ~30 200 / ~5 900 / ~24 400
5. Cruise FL350 M 0.78–0.80, ~65 t ~85–87 to hold speed within ~0.5 of Zibo net ~4 000–4 300
  1. Take-off at normal weight accelerates normally; climb and cruise speeds can be held with N1 values like the real aircraft (cruise ~85 %, approach flaps 30 ~55–60 %).
  2. Report the MSFS / Zibo N1 pairs if they differ by more than ~2 % with the lever still, with the OAT (non-ISA days move MSFS's N1 by about 1.7 % per 10 °C), and how long MSFS's N1 takes from idle to 95 % and back (Zibo, sea level, parked: idle → 50 % 10 s, → 95 % 13 s; full → 50 % 10 s, → 20 % 16 s).

Build 24 — AFDS: MCP buttons, lights, FMA (M5b-1)#

zibomod's AFDS logic now runs in the systems module (docs/AFDS.md). The autopilot does not fly yet (our servo on MSFS's controls is M5b-3); this build checks the buttons, lights and FMA. The MCP windows (speed, heading, altitude, V/S) are not drawn yet (panel texture). Load a new flight, engines running, airborne.

  1. L:LU737_WASM_BUILD = 24.
  2. FD switch ON: FD MA light, FD bars on the PFD; FMA shows the default modes.
  3. HDG SEL, ALT HLD, V/S, LVL CHG, SPEED, N1, VOR/LOC: each button lights and the FMA changes (V/S: the V/S wheel changes the target; LVL CHG / SPEED with the A/T armed).
  4. CMD A: CMD A light, FMA "CMD"; disengage bar down: AP off, warning.
  5. A/T ARM switch, A/T disengage button on the thrust lever.

Report: which button / light / FMA differs from Zibo, with L:LU737_AUTOPILOT_<button>_STATUS.

Flight model: CG and weight & balance (cfg only, WASM unchanged)#

Owner: the EFB weight & balance page showed the CG far aft. All cfg positions are now measured from the model origin with the reference datum at 0, 0, 0; aero_center_lift −0.51 (was −60.73, read by MSFS from the model origin), wing_sweep 27.59° (leading edge), wing_cg_refchord 13.04 ft, passenger zones type 0, CG limits 6–32 %, flap table columns fixed (drag before lift), dihedral 6°, larger inertia, SDK stall defaults (docs/FDE_TUNING.md "Reference frame and CG"). Load a new flight.

  1. Cold and dark, no payload or fuel: EFB %MAC ≈ 21 %; with the two crew ≈ 19.5 %. (Before: far aft — note the old value if you still have it.) Also the CG PERCENT SimVar (0.21).
  2. Load ~15 t of passengers over the four zones (each zone takes more than 220 lb), then 3 t of cargo: ≈ 19–20 %; add 10 t to the main tanks: +2.8 %, 3 t to the centre: −0.9 %.
  3. The cockpit view, lights, doors and the aircraft on its wheels look as before (only the frame they are written in changed).
  4. Take-off at 65–70 t, flaps 5, trim 5–5.5 units: no rotation by itself before VR, 2–3 °/s to 8° at lift-off; flaps 30 approach at VREF30 + 5 (153 kt at 65 t) about 0 to +2.5° pitch.
  5. Cruise FL350 M.78 at ~65 t: how much elevator trim is needed (it sets htail_incidence, the next tuning step).

Report: the EFB %MAC in steps 1–2, rotation and approach behaviour, cruise trim.

Build 25 — the autopilot flies: servo and A/T (M5b-3)#

Our servo flies MSFS's controls to the flight director; the A/T moves the thrust levers. Tuning is done against MSFS's flight model in this test. Load a new flight, airborne, trimmed, ~250 kt, FL100.

  1. L:LU737_WASM_BUILD = 25. FD on, HDG SEL, ALT HLD, then CMD A: the aircraft holds altitude and heading. If it pitches or rolls the wrong way at once: set L:LU737_AP_ELEV_SIGN (pitch) / L:LU737_AP_AIL_SIGN (roll) to -1, re-engage; trim running the wrong way: L:LU737_AP_TRIM_SIGN = -1. Tell me which.
  2. Turn the heading bug 30 deg: bank to the bank-angle limit, roll out on the heading.
  3. V/S +1000 with the wheel, then LVL CHG to a higher MCP altitude, ALT ACQ capture.
  4. A/T ARM, SPEED: MCP speed 280 -> levers advance, speed captured; 220 -> levers retard. N1 in climb.
  5. Move the thrust levers by hand while in SPEED: zibomod's take-over (levers follow you, A/T stays armed).

Report: oscillation (period, size), slow capture, overshoot, L:LU737_AP_SERVO_* values when something is wrong.

Build 26 — panel windows (MCP, radios, clocks)#

The windows on the old panel texture are drawn: MCP (course, IAS / MACH, heading, altitude, V/S), NAV / COM / ADF / transponder, clocks, MMR, IRS display, electrical meter. Load a new flight.

  1. L:LU737_WASM_BUILD = 26. MCP windows show the knobs' values; turn each knob.
  2. V/S window blank until V/S mode, then the wheel's value; IAS / MACH change-over.
  3. NAV 1 / 2 frequencies follow the NAV panels; COM / ADF / transponder show MSFS's radios; clocks show the time.
  4. Brightness: Zibo's default (dimmed); the panel lighting knobs are not modelled yet.

Report: windows that stay blank, show the wrong place, or digits misplaced (screenshot).

Build 27 — autopilot roll direction, ISFD scale#

Fixes from the build 25 / 26 test: the AP rolled the wrong way on engagement (aileron axis sign; the aircraft rolled away and was lost) and the ISFD was drawn too large (cut off right and bottom). Load a new flight.

  1. L:LU737_WASM_BUILD = 27. Trimmed, wings level, HDG SEL on the heading, ALT HLD, CMD A: wings stay level.
  2. Heading bug 30 deg right / left: banks that way and rolls out. Pitch: holds altitude, trim runs to unload.
  3. If roll is now right but pitch or trim runs away: L:LU737_AP_ELEV_SIGN / L:LU737_AP_TRIM_SIGN = -1 and tell me.
  4. ISFD: speed tape, attitude, altitude tape and heading scale all inside the frame.

Build 28 — autopilot level-off and MCP speed#

docs/AFDS.md "Level-off and the MCP speed". L:LU737_WASM_BUILD = 28.

  1. Climb with CMD A in V/S (+1500) and in LVL CHG to an MCP altitude: FMA ALT ACQ, then ALT HOLD; the aircraft levels off at the MCP altitude (within ~50 ft) and stays there.
  2. The same descending (V/S −1500, LVL CHG with the A/T at idle): level-off at the MCP altitude.
  3. LVL CHG climb through FL250–FL290 with the MCP in IAS: the MCP switches to Mach (about .73–.78) by itself, not
    1. The IAS/MACH button switches both ways.
  4. Expected Zibo behaviour (not a bug): LVL CHG or V/S pressed on the ground with the MCP altitude set sets the MCP speed to 100 kt; set the speed again before take-off. In LVL CHG right after take-off the A/T stays armed for 150 s, then N1.

Report: the FMA modes and altitude at level-off, the overshoot, any MCP speed change you did not make (with the mode, altitude and whether on the ground).

Build 29 — cold and dark lighting, yoke / CWS, disconnect lights#

docs/AFDS_AUDIT.md (sections A and E, "Status"), docs/AFDS.md "Yoke, CWS and the disconnect lights". L:LU737_WASM_BUILD = 29.

  1. Cold and dark (battery off): the MCP windows and backlight, both clocks (digits and backlight), COM / NAV / ADF and MMR displays, LE DEVICES lights, cabin pressure panel and the IRS display are all dark. The DU screens show no glow.
  2. Battery only: MCP and captain clock lit, F/O clock dark (it needs DC bus 2), DRIVE / SOURCE OFF / TRANSFER BUS OFF / ELEC lights as before. With the APU (or ground power) on the buses: the F/O clock lights, the MCP is at its dimmer level (lighting knobs not wired yet: Zibo's defaults).
  3. MCP buttons: the lit button lights (CMD A, HDG SEL, ...) glow when powered.
  4. Bank angle selector at 25 deg after loading.
  5. Disconnect lights: hold the A/P disconnect test switch up / down: red A/P and amber A/T lights of that side, amber FMC after a moment; off at release. Disengage the A/P with the yoke button: the red lights flash.
  6. Yoke override (joystick): CMD A with HDG SEL / ALT HOLD, then pull or push the stick clearly (more than about 10 %): the FMA shows CWS P, the stick flies the pitch; let go: the pitch is held. The same in roll (CWS R; let go below 6 deg bank: wings level). Below 400 ft the same yoke input disconnects the A/P.
  7. CMD with the stick held off centre: refused (A/P disconnect warning). Centre the stick, press again: engages.
  8. Hardware throttle with the A/T: the levers follow the A/T as before; moving the hardware lever overrides as in Zibo. Report any lever jumps (MSFS applies the hardware lever's events itself).

Report: anything lit without power (which window, battery off or on), and for 6–8 the FMA and what the stick did.

Build 30 — ND track, PFD heading rose#

L:LU737_WASM_BUILD = 30.

  1. ND in MAP mode in flight (above ~90 kt ground speed the map turns with the track): turn left and right; the compass rose, heading bug and track line follow continuously, also across north (360 / 000).
  2. PFD heading rose (bottom of the PFD): fly through north and through 120 / 240 deg several times; it never disappears for a moment.
  3. HDG SEL / LNAV turns as before (the AFDS's track now also comes from the aircraft's velocity).

Report: if the ND still stops, the map mode, ground speed and whether the heading digits on the ND still change.

Build 31 — pressurization, yokes, surfaces, LODs#

L:LU737_WASM_BUILD = 31.

  1. Yokes shown in the cockpit and moving with your controls (also the rudder pedals and toe brakes). A click on the yoke hides / shows it. The HUD, RAAS and similar optional parts as in Zibo (see docs/OPTIONS.md).
  2. Exterior: pull: elevators trailing edge up; roll right: right aileron up, left down. (Report the rudder and the stabiliser trim direction too.)
  3. Distance: zoom the external camera far out / use a tower view: the aircraft stays visible (lower-detail models take over), no popping at normal chase distances.
  4. Pressurization (overhead aft panel, cabin gauges): on the ground the cabin altitude = field, differential 0. Set FLT ALT (e.g. 35000) and LAND ALT. Take-off thrust, climb: cabin climbs slowly (about 4,800 ft at FL350, 8.8 psi), AUTO FAIL / OFF SCHED DESCENT / ALTN / MANUAL dark. Mode selector ALTN: ALTN light; MAN: MANUAL light and the outflow switch opens / closes the valve (needle). Descent: cabin follows down to LAND ALT. Air start: cabin already pressurized, FLT ALT = the altitude.

Report: cabin altitude / differential at cruise, any light that comes on, and the outflow needle.

Build 32 — hydraulics and flaps#

L:LU737_WASM_BUILD = 32.

  1. Hydraulics (overhead): cold and dark: systems A / B 0 psi, LOW PRESSURE lights with power. ELEC 2 / ELEC 1 pumps ON: B / A pressurised (about 3,000 psi), ELEC OVHT dark. Engines running, ENG pumps ON: both pressurised. Quantity gauge / lower EICAS HYD page values. FLT CONTROL A / B and SPOILER switches (guarded) work.
  2. Flaps with the hardware lever and with the cockpit lever (both move each other). Zibo's timing: UP → 1 about 12 s, 1 → 2 5 s, 2 → 5 3 s, 5 → 10 4 s, 10 → 15 2 s, 15 → 25 2 s, 25 → 30 / 30 → 40 4.5 s. Flaps gauge needles follow. LE devices: flaps 1–5 LE FLAPS EXT (slats mid), from flaps 10 full; LE FLAPS TRANSIT while moving.
  3. Load relief (-800, as in Zibo): lever 40 above 163 kt → flaps 30; lever 30 above 176 kt → flaps 25 (the MSFS flap handle shows where the flaps go). No relief at 25 / 15 / 10 (that is Zibo's SFP option only).
  4. ALTERNATE FLAPS: arm switch (guarded) + up / down switch moves the flaps slowly (MSFS moves to the nearest detent at the normal rate).

Report: any wrong flap timing, levers that fight, hydraulic lights.

Build 33 — gear lever, Mach speed bug, IAS DISAGREE#

L:LU737_WASM_BUILD = 33.

  1. Gear lever (cockpit, 3 positions UP / OFF / DN, mouse wheel or drag): after take-off UP retracts the gear (red lights while moving, then dark), OFF leaves it up. DN extends (red, then three greens). The G key / hardware moves the cockpit lever too. On the ground the lever does not go to UP (LOCK OVERRIDE held allows it).
  2. With the gear up: LVL CHG climb accelerates to the MCP speed (no hold at 235 kt), the MCP's first digit does not flash, the A/T holds the MCP speed in ALT HOLD. (The flashing "8" = MCP speed above the speed limit: flaps placard, 235 kt gear DN, Mmo 0.82 — as Zibo.)
  3. PFD speed bug in Mach (C/O to Mach, e.g. .78): the magenta bug sits at the matching IAS on the tape.
  4. No IAS DISAGREE with both PFDs showing the same speed. (ALT DISAGREE is correct when the two baro settings differ by more than 200 ft, e.g. 1006 hPa vs STD.)

Build 34 — gear, speedbrake, brakes, autobrake, stab trim, yaw damper (zibomod Systems)#

L:LU737_WASM_BUILD = 34.

  1. Gear lever (now zibomod's own): UP / OFF / DN with the mouse; G key / hardware moves it too. On the ground it does not go to UP (LOCK OVERRIDE held allows it). Gear lights as build 33.
  2. Speedbrake lever (cockpit, mouse wheel / drag): DOWN → ARMED (SPEED BRAKE ARMED light in the air) → FLIGHT DETENT (spoilers out) → UP. MSFS spoiler key / axis moves the lever. Landing: lever ARMED, touchdown at idle: the lever goes UP by itself, spoilers out; thrust forward or lever down stows them. SPEEDBRAKES EXTENDED light.
  3. Autobrake knob RTO / OFF / 1 / 2 / 3 / MAX: set 2 before landing: braking after touchdown, AUTO BRAKE DISARM when you brake with the pedals / move the speedbrake lever down / add thrust. RTO: arm on the ground, take-off, abort above 90 kt → full braking.
  4. Parking brake lever: MSFS parking brake follows, PARKING BRAKE light; MSFS's own parking brake key moves the lever. Toe brakes (pedals, "." key) work as before.
  5. Stab trim: yoke trim switches (main electric trim, speed depends on flaps), STAB TRIM MAIN ELEC / AUTOPILOT cutout switches (CUTOUT: no electric trim / no A/P trim), trim wheel turns. STAB OUT OF TRIM light (A/P on, trim near the stops).
  6. Yaw damper switch: ON → YAW DAMPER light out after about 2 s (needs IRS aligned and hydraulics B), MSFS's yaw damper on.

Report: anything that moves on its own, braking strength with the autobrake (MSFS's brakes are not X-Plane's), and whether the spoilers / gear / parking brake keys still work.

Build 35 — reversers, fuel system#

L:LU737_WASM_BUILD = 35.

  1. Reverse levers (cockpit): with the thrust lever at idle, pull the reverse lever (click = reverse idle, mouse wheel / drag for more, down to stow). MSFS's reverse thrust follows (-1 % reverse idle .. -32 % max); F2 / a hardware reverse zone moves the cockpit lever. EICAS REV indication with the reversers out; N1 rises with the reverse lever. With the thrust lever forward the reverse lever does not come up (interlock).
  2. Fuel pumps (overhead): each switch moves its pump, LOW PRESSURE light when OFF (or no AC); centre pumps ON with an empty centre tank: LOW PRESSURE. MSFS's pumps follow (fuel is drawn from the tanks whose pumps run; the centre tank first when its pumps are on). All pumps OFF: the engines run on suction feed (as Zibo).
  3. Crossfeed selector: VALVE OPEN bright while the valve moves, dim when open; MSFS's crossfeed valve opens.
  4. Engine start: fuel comes once the spar and engine valves are open (about 1.7 s after the start lever), then light-off.

Report: fuel quantities while flying with centre pumps on / off, crossfeed balancing, engine flame-outs.

Later milestones (checks added as they land)#

  • M3 Electrics, APU, pneumatics, engine start — done in 3a–3c above; next: pressurization, values compared with the Zibo screenshots. The electrical/APU checks of the host build (previous TEST_PLAN §4b: guards, STBY PWR, GRD PWR, APU START acceptance, BUS TRANSFER) are the template; they describe Zibo's behaviour.
  • M4 Display units — surfaces and upper EICAS in 4a above; next: PFD, ND, lower EICAS, CDU, ISFD on their surfaces, brightness knobs.
  • M5 FMS and AFDS/AT — route entry with MSFS navigation data, LNAV/VNAV, MCP modes, A/T.
  • M6 Approach and landing — ILS with APP, autoland; the phase-1 acceptance flight: cold & dark → power → APU → engines → take-off → autopilot cruise → ILS landing.